ZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThiNzNmLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0XzEuMC4wLioKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMjExYWYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzcxZTI2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIFJ1bnRpbWUKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM3NGFlYi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMy4xLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+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+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YTJiZjUuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM4MWZiMi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLXNyYy5pbmNsdWRlcyA9IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpwdC5wYXRjaC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanB0LnBhdGNoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMTE1ZjQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanB0LnBhdGNoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci0KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJCdWlsZCIgY29udGVudD0iQnVpbGQiPgotICAgPHRpdGxlPkphdmEgUGVyc2lzdGVuY2UgVG9vbHMgKEpUUCkgMS4wLjIgUGF0Y2hlczwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDE+SlRQIDIuMC4yIFBhdGNoZXM8L2gxPgotCi08aDI+RmVhdHVyZSBQYXRjaGVkOiBvcmcuZWNsaXBzZS5qcHQucGF0Y2g8L2gyPgotPGgzPlBsdWdpbihzKSByZXBsYWNlZDo8L2gzPgotPHVsPjxsaT5vcmcuZWNsaXBzZS5qcHQuZ2VuPC9saT48L3VsPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yMjAyOTcnPjIyMDI5NzwvYT4uIEVudGl0eSBnZW5lcmF0aW9uIGNyZWF0ZXMgRW1iZWRkYWJsZXMgd2l0aCBjb21waWxlIGVycm9ycyBpbiBzb21lIGNhc2VzLjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZXBsLXYxMC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQ1N2VhLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUphdmEgUGVyc2lzdGVuY2UgVG9vbHMgKEpUUCkgUGF0Y2hlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVwKLVBhdGNoKHMpIGZvciBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBUb29scy4gXG5cCi1TZWUgYnVnIDIyMDI5NyAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3MvMjIwMjk3KSBFbnRpdHkgZ2VuZXJhdGlvbiBjcmVhdGVzIEVtYmVkZGFibGVzIHdpdGggY29tcGlsZSBlcnJvcnMgaW4gc29tZSBjYXNlcyBcblwKLQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYtMDggT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2ZlYXR1cmUueG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmFlOTJiLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5wYXRjaCIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMi5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3BhdGNoZXMvIj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUGF0Y2hlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvcGF0Y2hlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMi52MjAwODAyMTQwMTAwLTc3LTdfQ1lRQ0QyQ2FMWUNIQ0QiIHBhdGNoPSJ0cnVlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2xpY2Vuc2UuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyYWJmNy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSouYmluLmRpc3QuemlwCi1idWlsZC54bWwKLWZlYXR1cmVzCi1wbHVnaW5zCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxZDQ1My4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnNkazwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwMDkzOS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9lcGwtdjEwLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGIxZmFiLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBTREsKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS54bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGRjNzRmLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuc2RrIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMy4xLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9saWNlbnNlLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTQ0NjkzLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSouYmluLmRpc3QuemlwCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpwdC50ZXN0c18xLjAuMC4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0ODk5Yy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2FjYjY1Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTE6MDUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OGZlZjIuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBUZXN0cwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxZTQ1OC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMy4xLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTQ0NjkzLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0qLmJpbi5kaXN0LnppcAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qcHQudGVzdHNfMS4wLjAuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8ucHJvamVjdCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxZGRlNi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhY2I2NS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMTowNSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2VwbC12MTAuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk0YzU4Yi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHByb2plY3QgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHByb2plY3QgVGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwZmE0NC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudGVzdHMiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4xLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2xpY2Vuc2UuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOGI3M2YuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0XzEuMC4wLioKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhYWVjMi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzBiNGJjLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9lcGwtdjEwLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzY2Q2MWEuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSBQcm9qZWN0Ci0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSBQcm9qZWN0IFRvb2xzIC0gUnVudGltZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYtMjAwOSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZmVhdHVyZS54bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OWY1MWQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0IgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMy4xLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9saWNlbnNlLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0Y2EzLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLTx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDE0LCAyMDEwPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KLQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi0KLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQotICAgICAgIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuPC9wPgotCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZyBQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLQotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzJhYmY3Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0qLmJpbi5kaXN0LnppcAotYnVpbGQueG1sCi1mZWF0dXJlcwotcGx1Z2lucwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTAxMzcyLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNGRkNjkuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBwcm9qZWN0IFNESwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjUzMjBjLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjMuMS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YWJmYjQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0MDFhMi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpwdF8xLjAuMC4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxYjA0Yy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlYzI5ZC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjEwOjA5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L01FVEEtSU5GL01BTklGRVNULk1GIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZmJlZGQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQ7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMy4xLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5odG1sIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDZiMS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaW5pIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODhhMzI1Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAidGlwc0FuZFRyaWNrc0hyZWYiIGNvbnRhaW5zIHRoZSBIZWxwIHRvcGljIGhyZWYgdG8gYSB0aXBzIGFuZCB0cmlja3MgcGFnZSAKLSMgb3B0aW9uYWwKLXRpcHNBbmRUcmlja3NIcmVmPS9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQotCi0KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lm1hcHBpbmdzIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQucHJvcGVydGllcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NGExODYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDYuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjY2ZiMGUuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9jb21wb25lbnQueG1sIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFmMTMzZi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdCI+Ci08ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+Ci08Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0IiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmdlbiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LnV0aWxpdHkiIGZyYWdtZW50PSJmYWxzZSIvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLmdpZiBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5wbmcgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhmYWMxLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9wbHVnaW4ucHJvcGVydGllcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MwNTVhLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0IGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2YxZDliLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjYzNGY4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzRmZDhkLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgRWNsaXBzZUxpbmsgU3VwcG9ydCAoT3B0aW9uYWwpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU0ODg4OS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZSIgdmVyc2lvbj0iMS4wLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMWYxOTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgRWNsaXBzZUxpbmsgU3VwcG9ydCBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2ZjZDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8qKixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkMDBiYS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLQotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZGFlYmYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBFY2xpcHNlTGluayBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2FiZTY2Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzFlN2M0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgRWNsaXBzZUxpbmsgU3VwcG9ydCAoT3B0aW9uYWwpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgRWNsaXBzZUxpbmsgU3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjFmMTk0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIEVjbGlwc2VMaW5rIFN1cHBvcnQgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNmY2Q2Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvKiosXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci0KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2RhZWJmLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgRWNsaXBzZUxpbmsgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwZTExNC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZlYXR1cmUudGVtcC5mb2xkZXIKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWQ0MTguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFlZWRlLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODQ2M2YuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIEVjbGlwc2VMaW5rIFN1cHBvcnQgU0RLIChPcHRpb25hbCkKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIGFyY2hpdmVzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgLSBFY2xpcHNlTGluayBTdXBwb3J0Ci0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJkZTNmNi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0Y2EzLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlLy5wcm9qZWN0IGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjdlMTQ1Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTI4ZDI0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiY2Y0NTIuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBTdXBwb3J0IChPcHRpb25hbCkKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDVmMmMyLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZSIgdmVyc2lvbj0iMi4zLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotICAgICAgICAgCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzRiNjcuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBTb3VyY2UgLSBKQVhCIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTUyOWIuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGVjbGlwc2UzMi5naWYsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjNDkxNi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwZGFkMy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjZDgwNS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIFN1cHBvcnQgKE9wdGlvbmFsKQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0Y2EzLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMzIwNzMuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBTb3VyY2UgLSBKQVhCIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwOCwgMjAxMC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTUyOWIuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGVjbGlwc2UzMi5naWYsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjNDkxNi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4ZGVlNy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJjYzhjZC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMGE4MjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIENvcmUgSlVuaXQgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLSMgVE9SRVZJRVcgLSB1cGRhdGVTaXRlTmFtZQotdXBkYXRlU2l0ZU5hbWU9V2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBKQVhCIEpVbml0IFRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTllYzUuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0Y2EzLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLTx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDE0LCAyMDEwPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KLQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi0KLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQotICAgICAgIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuPC9wPgotCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZyBQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLQotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMGUxMTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mZWF0dXJlLnRlbXAuZm9sZGVyCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmY2MGJlLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyY2UwMy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDM0ZjEyLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFNESyAtIEpBWEIgU3VwcG9ydCBTREsgKE9wdGlvbmFsKQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgYXJjaGl2ZXMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NjE1ZWYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy8uY3ZzaWdub3JlIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy8ucHJvamVjdCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1NjA5Mi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhZTEyNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2Fib3V0Lmh0bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDZiMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9hYm91dC5pbmkgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDg4YjlkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgInRpcHNBbmRUcmlja3NIcmVmIiBjb250YWlucyB0aGUgSGVscCB0b3BpYyBocmVmIHRvIGEgdGlwcyBhbmQgdHJpY2tzIHBhZ2UgCi0jIG9wdGlvbmFsCi10aXBzQW5kVHJpY2tzSHJlZj0vb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KLQotCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDlkZjcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydFxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgT3JhY2xlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMTAuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhNGU0NC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvY29tcG9uZW50LnhtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjUwZTc1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmciPgotPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwOWMyYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlNDc3Zi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLmNsYXNzcGF0aCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGM1ZTMxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8uY3ZzaWdub3JlIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLnByb2plY3QgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNWNiM2IuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMjRjOWYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBNYXIgMjIgMTI6MTY6MDMgRURUIDIwMTAKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZGJmMjYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnhtbC5iaW5kCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9hYm91dC5odG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MWY1ODYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMj5BYm91dCBUaGlzIENvbnRlbnQ8L0gyPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IAotICBvdXQgYmVsb3cuIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgCi0gIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayAKLSAgdG8gdGhlIFJlZGlzdHJpYnV0b3ImIzgyMTc7cyBsaWNlbnNlIGZvciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotCi08aDQ+PGEgbmFtZT0iSlBBIiBpZD0iSlBBIj48L2E+SmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgdjEuMDwvaDQ+Ci0KLTxibG9ja3F1b3RlPgotICA8cD5UaGUgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgd2hpY2ggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgPGEgaHJlZj0iaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sIj5DRERMIAotICAgIHYxLjA8L2E+IGlzIHJlcXVpcmVkIGJ5IHRoZSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgUHJvamVjdCBpbiBvcmRlciAKLSAgICB0byBzdXBwb3J0IHRoaXMgc3RhbmRhcmQuPC9wPgotPC9ibG9ja3F1b3RlPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFjNGE0OS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlPTEuNQotamF2YWNUYXJnZXQ9MS41Ci1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTdkZmNhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydCAtIFNjaGVtYSBHZW5lcmF0aW9uCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9NYWluLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL01haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2OWU0Ny4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL01haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5TY2hlbWFPdXRwdXRSZXNvbHZlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi5pbnRlcm5hbC5KcHRKYXhiQ29yZU1lc3NhZ2VzOwotCi0vKioKLSAqICBHZW5lcmF0ZSBhIEpBWEIgU2NoZW1hCi0gKiAgCi0gKiBDdXJyZW50IGNvbW1hbmQtbGluZSBhcmd1bWVudHM6Ci0gKiAgICAgWy1zIHNjaGVtYS54c2RdIC0gc3BlY2lmaWVzIHRoZSB0YXJnZXQgc2NoZW1hCi0gKiAgICAgWy1jIGNsYXNzTmFtZV0gLSBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gKiAgICAgCi0gKiAgICAgWy1wIHBhY2thZ2VOYW1lXSAtIHNwZWNpZmllcyB0aGUgc291cmNlIHBhY2thZ2UgLy8gQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1haW4KLXsKLQlwcml2YXRlIFN0cmluZ1tdIHNvdXJjZUNsYXNzTmFtZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0U2NoZW1hTmFtZTsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIGJvb2xlYW4gaXNEZWJ1Z01vZGU7Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBOT19GQUNUT1JZX0NMQVNTID0gImRvZXNudCBjb250YWluIE9iamVjdEZhY3RvcnkuY2xhc3MiOyAgIC8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJbmV3IE1haW4oKS5leGVjdXRlKGFyZ3MpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwcml2YXRlIE1haW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShTdHJpbmdbXSBhcmdzKSB7Ci0JCQotCQl0aGlzLmluaXRpYWxpemVXaXRoKGFyZ3MpOwotCQkKLQkJdGhpcy5nZW5lcmF0ZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0gICAgCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVXaXRoKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAJdGhpcy5zb3VyY2VDbGFzc05hbWVzID0gdGhpcy5nZXRTb3VyY2VDbGFzc05hbWVzKGFyZ3MpOwotICAgIAl0aGlzLnRhcmdldFNjaGVtYU5hbWUgPSB0aGlzLmdldFRhcmdldFNjaGVtYU5hbWUoYXJncyk7Ci0KLQkJdGhpcy5pc0RlYnVnTW9kZSA9IHRoaXMuZ2V0RGVidWdNb2RlKGFyZ3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZSgpIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVhCQ29udGV4dAotCQlKQVhCQ29udGV4dCBqYXhiQ29udGV4dCA9IHRoaXMuYnVpbGRKYXhiQ29udGV4dCgpOwotCQkKLSAgICAgICAgLy8gR2VuZXJhdGUgYW4gWE1MIFNjaGVtYQotCQlpZihqYXhiQ29udGV4dCAhPSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRlU2NoZW1hKGpheGJDb250ZXh0KTsKLQkJfQotCQlTdHJpbmcgcmVzdWx0ID0gKGpheGJDb250ZXh0ICE9IG51bGwpID8gCi0JCQkJdGhpcy5iaW5kKEpwdEpheGJDb3JlTWVzc2FnZXMuU0NIRU1BX0dFTkVSQVRFRCwgdGhpcy50YXJnZXRTY2hlbWFOYW1lKSA6IAotCQkJCXRoaXMuYmluZChKcHRKYXhiQ29yZU1lc3NhZ2VzLlNDSEVNQV9OT1RfQ1JFQVRFRCwgdGhpcy50YXJnZXRTY2hlbWFOYW1lKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCk7Ci0gICAgfQotCQotCXByaXZhdGUgSkFYQkNvbnRleHQgYnVpbGRKYXhiQ29udGV4dCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMuZ2V0U3RyaW5nKEpwdEpheGJDb3JlTWVzc2FnZXMuTE9BRElOR19DTEFTU0VTKSk7Ci0JCUpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJQ2xhc3NMb2FkZXIgbG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQkJCQkKLQkJCQlDbGFzc1tdIHNvdXJjZUNsYXNzZXMgPSB0aGlzLmJ1aWxkU291cmNlQ2xhc3Nlcyh0aGlzLnNvdXJjZUNsYXNzTmFtZXMsIGxvYWRlcik7Ci0JCQkJCi0JCQkJamF4YkNvbnRleHQgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShzb3VyY2VDbGFzc2VzKTsKLQkJCX0KLQkJCWNhdGNoKEpBWEJFeGNlcHRpb24gZXgpIHsKLQkJCQl0aGlzLmhhbmRsZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gamF4YkNvbnRleHQ7Ci0JIH0KLQkKLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVTY2hlbWEoSkFYQkNvbnRleHQgamF4YkNvbnRleHQpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMuZ2V0U3RyaW5nKEpwdEpheGJDb3JlTWVzc2FnZXMuR0VORVJBVElOR19TQ0hFTUEpKTsKLQkJU3lzdGVtLm91dC5mbHVzaCgpOwotCQkKLQkJU2NoZW1hT3V0cHV0UmVzb2x2ZXIgc2NoZW1hT3V0cHV0UmVzb2x2ZXIgPSAKLQkJCW5ldyBKcHRTY2hlbWFPdXRwdXRSZXNvbHZlcih0aGlzLnRhcmdldFNjaGVtYU5hbWUpOwotCi0JCXRyeSB7Ci0JCQlqYXhiQ29udGV4dC5nZW5lcmF0ZVNjaGVtYShzY2hlbWFPdXRwdXRSZXNvbHZlcik7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSBDbGFzc1tdIGJ1aWxkU291cmNlQ2xhc3NlcyhTdHJpbmdbXSBjbGFzc05hbWVzLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKLQotCQlBcnJheUxpc3Q8Q2xhc3M+IHNvdXJjZUNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPihjbGFzc05hbWVzLmxlbmd0aCk7Ci0JCWZvcihTdHJpbmcgY2xhc3NOYW1lOiBjbGFzc05hbWVzKSB7Ci0JCQl0cnkgewotCQkJCXNvdXJjZUNsYXNzZXMuYWRkKGxvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihjbGFzc05hbWUpOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbih0aGlzLmJpbmQoSnB0SmF4YkNvcmVNZXNzYWdlcy5OT1RfRk9VTkQsIGNsYXNzTmFtZSkpOwotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQuZmx1c2goKTsKLQkJcmV0dXJuIHNvdXJjZUNsYXNzZXMudG9BcnJheShuZXcgQ2xhc3NbMF0pOwotICAgIH0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uKEpBWEJFeGNlcHRpb24gZXgpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBleC5nZXRNZXNzYWdlKCk7Ci0JCVRocm93YWJsZSBsaW5rZWRFeCA9IGV4LmdldExpbmtlZEV4Y2VwdGlvbigpOwotCQlpZihtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5pbmRleE9mKE5PX0ZBQ1RPUllfQ0xBU1MpID4gLTEpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLQkJfQotCQllbHNlIGlmKGxpbmtlZEV4ICE9IG51bGwgJiYgbGlua2VkRXggaW5zdGFuY2VvZiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gdGhpcy5iaW5kKEpwdEpheGJDb3JlTWVzc2FnZXMuQ09OVEVYVF9GQUNUT1JZX05PVF9GT1VORCwgbGlua2VkRXguZ2V0TWVzc2FnZSgpKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlcnJvck1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIEpwdEpheGJDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdCh0aGlzLmdldFN0cmluZyhrZXkpLCBhcmd1bWVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhcmd1bWVudCBxdWVyaWVzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIFN0cmluZ1tdIGdldFNvdXJjZUNsYXNzTmFtZXMoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFsbEFyZ3VtZW50VmFsdWUoIi1jIiwgYXJncyk7ICAgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRUYXJnZXRTY2hlbWFOYW1lKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5nZXRBcmd1bWVudFZhbHVlKCItcyIsIGFyZ3MpOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0RGVidWdNb2RlKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5hcmd1bWVudEV4aXN0cygiLWRlYnVnIiwgYXJncyk7ICAgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRBcmd1bWVudFZhbHVlKFN0cmluZyBhcmdOYW1lLCBTdHJpbmdbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGFyZ05hbWUpKSB7Ci0JCQkJaW50IGogPSBpICsgMTsKLQkJCQlpZiAoaiA8IGFyZ3MubGVuZ3RoKSB7Ci0JCQkJCXJldHVybiBhcmdzW2pdOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRBbGxBcmd1bWVudFZhbHVlKFN0cmluZyBhcmdOYW1lLCBTdHJpbmdbXSBhcmdzKSB7Ci0JCUxpc3Q8U3RyaW5nPiBhcmdWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1tpXTsKLQkJCWlmIChhcmcudG9Mb3dlckNhc2UoKS5lcXVhbHMoYXJnTmFtZSkpIHsKLQkJCQlpbnQgaiA9IGkgKyAxOwotCQkJCWlmIChqIDwgYXJncy5sZW5ndGgpIHsKLQkJCQkJYXJnVmFsdWVzLmFkZChhcmdzW2pdKTsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJnVmFsdWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBhcmd1bWVudEV4aXN0cyhTdHJpbmcgYXJnTmFtZSwgU3RyaW5nW10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmdOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KLQotLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLWNsYXNzIEpwdFNjaGVtYU91dHB1dFJlc29sdmVyIGV4dGVuZHMgU2NoZW1hT3V0cHV0UmVzb2x2ZXIgewotCQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHRhcmdldFNjaGVtYU5hbWU7Ci0JCi0JcHJvdGVjdGVkIEpwdFNjaGVtYU91dHB1dFJlc29sdmVyKFN0cmluZyB0YXJnZXRTY2hlbWFOYW1lKSB7Ci0JCXRoaXMudGFyZ2V0U2NoZW1hTmFtZSA9IHRhcmdldFNjaGVtYU5hbWU7Ci0JfQotCQotCSBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzdWx0IGNyZWF0ZU91dHB1dChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgc3VnZ2VzdGVkRmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjYW5vbmljYWxOYW1lID0gdGhpcy5jYW5vbmljYWxGaWxlTmFtZSh0aGlzLnRhcmdldFNjaGVtYU5hbWUpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShjYW5vbmljYWxOYW1lKTsKLQkJU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoZmlsZSk7Ci0JCXJlc3VsdC5zZXRTeXN0ZW1JZChmaWxlLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0JcHVibGljIFN0cmluZyBjYW5vbmljYWxGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJcmV0dXJuIGNhbm9uaWNhbEZpbGUobmV3IEZpbGUoZmlsZU5hbWUpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0JCi0JcHVibGljIEZpbGUgY2Fub25pY2FsRmlsZShGaWxlIGZpbGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJfSAKLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm4gZmlsZS5nZXRBYnNvbHV0ZUZpbGUoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9KcHRKYXhiQ29yZU1lc3NhZ2VzLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL0pwdEpheGJDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxNzA1My4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL0pwdEpheGJDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgSkFYQiBjb3JlLgotICovCi1wdWJsaWMgY2xhc3MgSnB0SmF4YkNvcmVNZXNzYWdlcwotewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRElOR19DTEFTU0VTID0gIkxPQURJTkdfQ0xBU1NFUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVElOR19TQ0hFTUEgPSAiR0VORVJBVElOR19TQ0hFTUEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9HRU5FUkFURUQgPSAiU0NIRU1BX0dFTkVSQVRFRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX05PVF9DUkVBVEVEID0gIlNDSEVNQV9OT1RfQ1JFQVRFRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0ZPVU5EID0gIk5PVF9GT1VORCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9GQUNUT1JZX05PVF9GT1VORCA9ICJDT05URVhUX0ZBQ1RPUllfTk9UX0ZPVU5EIjsKLQkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi5pbnRlcm5hbC5qcHRfamF4Yl9jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIEpwdEpheGJDb3JlTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvanB0X2pheGJfY29yZS5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9qcHRfamF4Yl9jb3JlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MTEyY2QuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9qcHRfamF4Yl9jb3JlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotTE9BRElOR19DTEFTU0VTID0gbG9hZGluZy4uLgotR0VORVJBVElOR19TQ0hFTUEgPSBcbmdlbmVyYXRpbmcgc2NoZW1hLi4uCi1TQ0hFTUFfR0VORVJBVEVEID0gIFxuU2NoZW1hIHswfSBnZW5lcmF0ZWQKLVNDSEVNQV9OT1RfQ1JFQVRFRCA9ICBcblNjaGVtYSB7MH0gbm90IGNyZWF0ZWQKLU5PVF9GT1VORCA9ICBcblx0Tm90IGZvdW5kOiB7MH0KLUNPTlRFWFRfRkFDVE9SWV9OT1RfRk9VTkQgPSAgXG5UaGUgSkFYQkNvbnRleHRGYWN0b3J5IHswfSBcblwKLXNwZWNpZmllZCBpbiB0aGUgamF4Yi5wcm9wZXJ0aWVzIGZpbGUgY291bGQgbm90IGJlIGxvY2F0ZWQgb24gdGhlIHByb2plY3QgY2xhc3NwYXRoLiBcblwKLVRoZSBKQVhCIHByb3ZpZGVyIHRoYXQgZGVmaW5lcyB0aGlzIGZhY3Rvcnkgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBwcm9qZWN0IGNsYXNzcGF0aCwgXG5cCi1vciB0aGUgamF4Yi5wcm9wZXJ0aWVzIGZpbGUgc2hvdWxkIGJlIHJlbW92ZWQgdG8gdXNlIHRoZSBkZWZhdWx0IHByb3ZpZGVyLgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0IGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTIzZmI4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWI2ZWJkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaHRtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTYwNmIxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODhiOWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAidGlwc0FuZFRyaWNrc0hyZWYiIGNvbnRhaW5zIHRoZSBIZWxwIHRvcGljIGhyZWYgdG8gYSB0aXBzIGFuZCB0cmlja3MgcGFnZSAKLSMgb3B0aW9uYWwKLXRpcHNBbmRUcmlja3NIcmVmPS9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQotCi0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5tYXBwaW5ncyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllMzA3ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBFY2xpcHNlTGluayBTdXBwb3J0XG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBPcmFjbGUgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAxMC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmJkMDNhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjY4ZTkwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgRWNsaXBzZUxpbmsgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8uY2xhc3NwYXRoIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZjljZWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0ibGliL2VjbGlwc2VsaW5rLmphciIgc291cmNlcGF0aD0ibGliL2VjbGlwc2VsaW5rLXNyYy56aXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLy5jdnNpZ25vcmUgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4MmMzNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiNGZmNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVHVlIEFwciAxMyAxMjoxMjoyNyBFRFQgMjAxMAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5NjQ3Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW47c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBsaWIvZWNsaXBzZWxpbmsuamFyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnhtbC5iaW5kCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4sCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4uaW50ZXJuYWwKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9hYm91dC5odG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MWY1ODYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMj5BYm91dCBUaGlzIENvbnRlbnQ8L0gyPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IAotICBvdXQgYmVsb3cuIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgCi0gIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayAKLSAgdG8gdGhlIFJlZGlzdHJpYnV0b3ImIzgyMTc7cyBsaWNlbnNlIGZvciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotCi08aDQ+PGEgbmFtZT0iSlBBIiBpZD0iSlBBIj48L2E+SmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgdjEuMDwvaDQ+Ci0KLTxibG9ja3F1b3RlPgotICA8cD5UaGUgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgd2hpY2ggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgPGEgaHJlZj0iaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sIj5DRERMIAotICAgIHYxLjA8L2E+IGlzIHJlcXVpcmVkIGJ5IHRoZSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgUHJvamVjdCBpbiBvcmRlciAKLSAgICB0byBzdXBwb3J0IHRoaXMgc3RhbmRhcmQuPC9wPgotPC9ibG9ja3F1b3RlPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNmZmU3MS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlPTEuNQotamF2YWNUYXJnZXQ9MS41Ci1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgbGliL2VjbGlwc2VsaW5rLmphcixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vbGliL2VjbGlwc2VsaW5rLXNyYy56aXAgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vbGliL2VjbGlwc2VsaW5rLXNyYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YTUzOTMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL2xpYi9lY2xpcHNlbGluay1zcmMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL2xpYi9lY2xpcHNlbGluay5qYXIgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vbGliL2VjbGlwc2VsaW5rLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1ZTY0NC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vbGliL2VjbGlwc2VsaW5rLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1NzQxMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBKQVhCIFN1cHBvcnQgLSBTY2hlbWEgR2VuZXJhdGlvbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9zY2hlbWFnZW4vTWFpbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiY2Y0ZWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlNjaGVtYU91dHB1dFJlc29sdmVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLmludGVybmFsLkpwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkpBWEJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRGYWN0b3J5OwotCi0vKioKLSAqICBHZW5lcmF0ZSBhIEVjbGlwc2VMaW5rIEpBWEIgU2NoZW1hCi0gKiAgCi0gKiBDdXJyZW50IGNvbW1hbmQtbGluZSBhcmd1bWVudHM6Ci0gKiAgICAgWy1zIHNjaGVtYS54c2RdIC0gc3BlY2lmaWVzIHRoZSB0YXJnZXQgc2NoZW1hCi0gKiAgICAgWy1jIGNsYXNzTmFtZV0gLSBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluCi17Ci0JcHJpdmF0ZSBTdHJpbmdbXSBzb3VyY2VDbGFzc05hbWVzOwotCXByaXZhdGUgU3RyaW5nIHRhcmdldFNjaGVtYU5hbWU7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWdNb2RlOwotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgTk9fRkFDVE9SWV9DTEFTUyA9ICJkb2VzbnQgY29udGFpbiBPYmplY3RGYWN0b3J5LmNsYXNzIjsgICAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgQ0FOTk9UX0JFX0NBU1RfVE9fSkFYQkNPTlRFWFQgPSAiY2Fubm90IGJlIGNhc3QgdG8gb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5KQVhCQ29udGV4dCI7ICAgLy8kTk9OLU5MUy0xJAotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQluZXcgTWFpbigpLmV4ZWN1dGUoYXJncyk7Ci0JfQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByaXZhdGUgTWFpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKFN0cmluZ1tdIGFyZ3MpIHsKLQkJCi0JCXRoaXMuaW5pdGlhbGl6ZVdpdGgoYXJncyk7Ci0JCQotCQl0aGlzLmdlbmVyYXRlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVdpdGgoU3RyaW5nW10gYXJncykgewotICAgIAl0aGlzLnNvdXJjZUNsYXNzTmFtZXMgPSB0aGlzLmdldFNvdXJjZUNsYXNzTmFtZXMoYXJncyk7Ci0gICAgCXRoaXMudGFyZ2V0U2NoZW1hTmFtZSA9IHRoaXMuZ2V0VGFyZ2V0U2NoZW1hTmFtZShhcmdzKTsKLQotCQl0aGlzLmlzRGVidWdNb2RlID0gdGhpcy5nZXREZWJ1Z01vZGUoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlKCkgewotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJDb250ZXh0Ci0gICAgICAgIEpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gdGhpcy5idWlsZEpheGJDb250ZXh0KCk7Ci0KLSAgICAgICAgLy8gR2VuZXJhdGUgYW4gWE1MIFNjaGVtYQotICAgICAgICBpZihqYXhiQ29udGV4dCAhPSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRlU2NoZW1hKGpheGJDb250ZXh0KTsKLQkJfQotCQlTdHJpbmcgcmVzdWx0ID0gKGpheGJDb250ZXh0ICE9IG51bGwpID8gCi0JCQl0aGlzLmJpbmQoSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLlNDSEVNQV9HRU5FUkFURUQsIHRoaXMudGFyZ2V0U2NoZW1hTmFtZSkgOiAKLQkJCXRoaXMuYmluZChKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMuU0NIRU1BX05PVF9DUkVBVEVELCB0aGlzLnRhcmdldFNjaGVtYU5hbWUpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBKQVhCQ29udGV4dCBidWlsZEpheGJDb250ZXh0KCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRTdHJpbmcoSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLkxPQURJTkdfQ0xBU1NFUykpOwotICAgICAgICBKQVhCQ29udGV4dCBqYXhiQ29udGV4dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlDbGFzc0xvYWRlciBsb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQkJCi0JCQlDbGFzc1tdIHNvdXJjZUNsYXNzZXMgPSB0aGlzLmJ1aWxkU291cmNlQ2xhc3Nlcyh0aGlzLnNvdXJjZUNsYXNzTmFtZXMsIGxvYWRlcik7Ci0JCQkKLQkJCS8vY2FsbCBNT1h5IEpBWEJDb250ZXh0RmFjdG9yeSBkaXJlY3RseS4gIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZCB0byBoYXZlIHRoZSBKQVhCIHByb3BlcnRpZXMgZmlsZSBpbiBwbGFjZQotCQkJLy9pbiB0aW1lIGZvciB0aGUgZ2VuZXJhdGlvbi4KLQkJCWpheGJDb250ZXh0ID0gKEpBWEJDb250ZXh0KUpBWEJDb250ZXh0RmFjdG9yeS5jcmVhdGVDb250ZXh0KHNvdXJjZUNsYXNzZXMsIENvbGxlY3Rpb25zLjxTdHJpbmcsT2JqZWN0PmVtcHR5TWFwKCkpOwotCQl9Ci0JCWNhdGNoIChKQVhCRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aGlzLmhhbmRsZUpheGJFeGNlcHRpb24oZXgpOwotCQl9Ci0JCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLQkJCXRoaXMuaGFuZGxlQ2xhc3NDYXN0RXhjZXB0aW9uKGV4KTsKLQkJfQotCQlyZXR1cm4gamF4YkNvbnRleHQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVNjaGVtYShKQVhCQ29udGV4dCBqYXhiQ29udGV4dCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRTdHJpbmcoSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLkdFTkVSQVRJTkdfU0NIRU1BKSk7Ci0JCVN5c3RlbS5vdXQuZmx1c2goKTsKLQotICAgIAlTY2hlbWFPdXRwdXRSZXNvbHZlciBzY2hlbWFPdXRwdXRSZXNvbHZlciA9IAotICAgIAkJbmV3IEpwdFNjaGVtYU91dHB1dFJlc29sdmVyKHRoaXMudGFyZ2V0U2NoZW1hTmFtZSk7Ci0KLQkJdHJ5IHsKLQkJCWpheGJDb250ZXh0LmdlbmVyYXRlU2NoZW1hKHNjaGVtYU91dHB1dFJlc29sdmVyKTsKLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLSAgICAKLSAgICBwcml2YXRlIENsYXNzW10gYnVpbGRTb3VyY2VDbGFzc2VzKFN0cmluZ1tdIGNsYXNzTmFtZXMsIENsYXNzTG9hZGVyIGxvYWRlcikgewotCi0JCUFycmF5TGlzdDxDbGFzcz4gc291cmNlQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KGNsYXNzTmFtZXMubGVuZ3RoKTsKLQkJZm9yKFN0cmluZyBjbGFzc05hbWU6IGNsYXNzTmFtZXMpIHsKLQkJCXRyeSB7Ci0JCQkJc291cmNlQ2xhc3Nlcy5hZGQobG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGNsYXNzTmFtZSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKHRoaXMuYmluZChKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMuTk9UX0ZPVU5ELCBjbGFzc05hbWUpKTsKLQkJCX0KLQkJfQotCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCXJldHVybiBzb3VyY2VDbGFzc2VzLnRvQXJyYXkobmV3IENsYXNzWzBdKTsKLSAgICB9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUpheGJFeGNlcHRpb24oSkFYQkV4Y2VwdGlvbiBleCkgewotCQlTdHJpbmcgbWVzc2FnZSA9IGV4LmdldE1lc3NhZ2UoKTsKLQkJVGhyb3dhYmxlIGxpbmtlZEV4ID0gZXguZ2V0TGlua2VkRXhjZXB0aW9uKCk7Ci0JCWlmKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmluZGV4T2YoTk9fRkFDVE9SWV9DTEFTUykgPiAtMSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgaWYobGlua2VkRXggIT0gbnVsbCAmJiBsaW5rZWRFeCBpbnN0YW5jZW9mIENsYXNzTm90Rm91bmRFeGNlcHRpb24pIHsKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSB0aGlzLmJpbmQoCi0JCQkJSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLkNPTlRFWFRfRkFDVE9SWV9OT1RfRk9VTkQsIGxpbmtlZEV4LmdldE1lc3NhZ2UoKSk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZXJyb3JNZXNzYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVDbGFzc0Nhc3RFeGNlcHRpb24oQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gZXguZ2V0TWVzc2FnZSgpOwotCQlpZihtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5pbmRleE9mKENBTk5PVF9CRV9DQVNUX1RPX0pBWEJDT05URVhUKSA+IC0xKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4odGhpcy5nZXRTdHJpbmcoSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLlBST1BFUlRJRVNfRklMRV9OT1RfRk9VTkQpKTsKLQkJfQotCQllbHNlIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdCh0aGlzLmdldFN0cmluZyhrZXkpLCBhcmd1bWVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhcmd1bWVudCBxdWVyaWVzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIFN0cmluZ1tdIGdldFNvdXJjZUNsYXNzTmFtZXMoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFsbEFyZ3VtZW50VmFsdWVzKCItYyIsIGFyZ3MpOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0U2NoZW1hTmFtZShTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0QXJndW1lbnRWYWx1ZSgiLXMiLCBhcmdzKTsgICAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdldERlYnVnTW9kZShTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYXJndW1lbnRFeGlzdHMoIi1kZWJ1ZyIsIGFyZ3MpOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXJndW1lbnRWYWx1ZShTdHJpbmcgYXJnTmFtZSwgU3RyaW5nW10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmdOYW1lKSkgewotCQkJCWludCBqID0gaSArIDE7Ci0JCQkJaWYgKGogPCBhcmdzLmxlbmd0aCkgewotCQkJCQlyZXR1cm4gYXJnc1tqXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gZ2V0QWxsQXJndW1lbnRWYWx1ZXMoU3RyaW5nIGFyZ05hbWUsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJTGlzdDxTdHJpbmc+IGFyZ1ZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmdOYW1lKSkgewotCQkJCWludCBqID0gaSArIDE7Ci0JCQkJaWYgKGogPCBhcmdzLmxlbmd0aCkgewotCQkJCQlhcmdWYWx1ZXMuYWRkKGFyZ3Nbal0pOwotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhcmdWYWx1ZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFyZ3VtZW50RXhpc3RzKFN0cmluZyBhcmdOYW1lLCBTdHJpbmdbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGFyZ05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQotCi0vLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotY2xhc3MgSnB0U2NoZW1hT3V0cHV0UmVzb2x2ZXIgZXh0ZW5kcyBTY2hlbWFPdXRwdXRSZXNvbHZlciB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFyZ2V0U2NoZW1hTmFtZTsKLQkKLQlwcm90ZWN0ZWQgSnB0U2NoZW1hT3V0cHV0UmVzb2x2ZXIoU3RyaW5nIHRhcmdldFNjaGVtYU5hbWUpIHsKLQkJdGhpcy50YXJnZXRTY2hlbWFOYW1lID0gdGFyZ2V0U2NoZW1hTmFtZTsKLQl9Ci0JCi0JIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXN1bHQgY3JlYXRlT3V0cHV0KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBzdWdnZXN0ZWRGaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh0aGlzLnRhcmdldFNjaGVtYU5hbWUgKTsKLSAgICAgICAgU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoZmlsZSk7Ci0gICAgICAgIHJlc3VsdC5zZXRTeXN0ZW1JZChmaWxlLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL0pwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9KcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhOWUyZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL0pwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBFY2xpcHNlTGluayBKQVhCIGNvcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FESU5HX0NMQVNTRVMgPSAiTE9BRElOR19DTEFTU0VTIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUSU5HX1NDSEVNQSA9ICJHRU5FUkFUSU5HX1NDSEVNQSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0dFTkVSQVRFRCA9ICJTQ0hFTUFfR0VORVJBVEVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTk9UX0NSRUFURUQgPSAiU0NIRU1BX05PVF9DUkVBVEVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRk9VTkQgPSAiTk9UX0ZPVU5EIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX0ZBQ1RPUllfTk9UX0ZPVU5EID0gIkNPTlRFWFRfRkFDVE9SWV9OT1RfRk9VTkQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfRklMRV9OT1RfRk9VTkQgPSAiUFJPUEVSVElFU19GSUxFX05PVF9GT1VORCI7Ci0JCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4uaW50ZXJuYWwuanB0X2VjbGlwc2VsaW5rX2pheGJfY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvanB0X2VjbGlwc2VsaW5rX2pheGJfY29yZS5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9qcHRfZWNsaXBzZWxpbmtfamF4Yl9jb3JlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5Zjc2NjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9qcHRfZWNsaXBzZWxpbmtfamF4Yl9jb3JlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotTE9BRElOR19DTEFTU0VTID0gbG9hZGluZy4uLgotR0VORVJBVElOR19TQ0hFTUEgPSBcbk1PWHkgZ2VuZXJhdGluZyBzY2hlbWEuLi4KLVNDSEVNQV9HRU5FUkFURUQgPSAgXG5TY2hlbWEgezB9IGdlbmVyYXRlZAotU0NIRU1BX05PVF9DUkVBVEVEID0gIFxuU2NoZW1hIHswfSBub3QgY3JlYXRlZAotTk9UX0ZPVU5EID0gIFxuXHROb3QgZm91bmQ6IHswfQotUFJPUEVSVElFU19GSUxFX05PVF9GT1VORCA9ICBcbkVjbGlwc2VMaW5rIEpBWEJDb250ZXh0RmFjdG9yeSBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgamF4Yi5wcm9wZXJ0aWVzIGZpbGUgdG8gdXNlIEVjbGlwc2VMaW5rIE1PWHkgZm9yIHNjaGVtYSBnZW5lcmF0aW9uLlxuXAotamF2YXgueG1sLmJpbmQuY29udGV4dC5mYWN0b3J5PW9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRGYWN0b3J5Ci1DT05URVhUX0ZBQ1RPUllfTk9UX0ZPVU5EID0gIFxuVGhlIEpBWEJDb250ZXh0RmFjdG9yeSB7MH0gXG5cCi1zcGVjaWZpZWQgaW4gdGhlIGpheGIucHJvcGVydGllcyBmaWxlIGNvdWxkIG5vdCBiZSBsb2NhdGVkIG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aC4gXG5cCi1UaGUgSkFYQiBwcm92aWRlciB0aGF0IGRlZmluZXMgdGhpcyBmYWN0b3J5IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgcHJvamVjdCBjbGFzc3BhdGgsIFxuXAotb3IgdGhlIGpheGIucHJvcGVydGllcyBmaWxlIHNob3VsZCBiZSByZW1vdmVkIHRvIHVzZSB0aGUgZGVmYXVsdCBwcm92aWRlci4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS8uY2xhc3NwYXRoIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNDM3MTcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qc3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS8uY3ZzaWdub3JlIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTZkZDcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbgotQGRvdAotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwotamF2YUNvbXBpbGVyLi4uYXJncy4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLy5wcm9qZWN0IGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzM3MTI4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTM0ZjRiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNNb24gRmViIDA4IDE4OjQ4OjM3IEVTVCAyMDEwCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwNGUxYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpheGIudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5KcHRKYXhiVWlQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4zLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQudWk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuNC4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjQuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMi4xMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjQuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS41MDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjQwMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53ZWIudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuNDAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjUwMCwyLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5maWx0ZXJzLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLndpemFyZHMsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5jbGFzc2VzZ2VuLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLndpemFyZHMuZmFjZXQsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5mYWNldC5tb2RlbCwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLnByb2osCi0gb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5wcm9qLm1vZGVsLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLndpemFyZHMuc2NoZW1hZ2VuCi1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudGV4dDt2ZXJzaW9uPSI0LjAuMSIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9hYm91dC5odG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJlZWE2ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2UgPSAxLjUKLWphdmFjVGFyZ2V0ID0gMS41Ci1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9jb21wb25lbnQueG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OTU3ZmUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9OZXdYU0QuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9OZXdYU0QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmVmZGQzLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL2V0b29sMTYvTmV3WFNELmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL2V0b29sMTYvamF4Yl9mYWNldC5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2pheGJfZmFjZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVhMTdjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL2V0b29sMTYvamF4Yl9mYWNldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19qYXhiX3Byb2plY3Rfd2l6LmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X2pheGJfcHJvamVjdF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTQ3NzE3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X2pheGJfcHJvamVjdF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdjbGFzc193aXouZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdjbGFzc193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWM2NTQ1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3Y2xhc3Nfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L1hTREZpbGUuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvWFNERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMGVlYjcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvWFNERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi9kdGRmaWxlLmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L2R0ZGZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzBhY2FkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L2R0ZGZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGV4dC5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhN2EzOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTlkY2NjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC93aXpiYW4vTmV3WFNELmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdYU0QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTBmNDgyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdYU0QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld19qYXhiX3Byal93aXouZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld19qYXhiX3Byal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTg3M2ExLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfamF4Yl9wcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdjbGFzc193aXouZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2NsYXNzX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYzBlZTguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2NsYXNzX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTllMmMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1wbHVnaW5OYW1lPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotamF4YldpemFyZENhdGVnb3J5TmFtZSA9IEpBWEIKLQotZ2VuZXJhdGVKYXhiQ2xhc3NlcyA9IEpBWEIgQ2xhc3Nlcy4uLgotCi1nZW5lcmF0ZVNjaGVtYUZyb21DbGFzc2VzTmFtZSA9IFNjaGVtYSBmcm9tIEpBWEIgQ2xhc3NlcwotZ2VuZXJhdGVTY2hlbWFGcm9tQ2xhc3Nlc0Rlc2MgPSBHZW5lcmF0ZSBhIFNjaGVtYSBmcm9tIEpBWEIgY2xhc3NlcwotCi1nZW5lcmF0ZUNsYXNzZXNGcm9tU2NoZW1hTmFtZSA9IEpBWEIgQ2xhc3NlcyBmcm9tIFNjaGVtYQotZ2VuZXJhdGVDbGFzc2VzRnJvbVNjaGVtYURlc2MgPSBHZW5lcmF0ZSBKQVhCIENsYXNzZXMgZnJvbSBhIFNjaGVtYQotCi1uZXdKYXhiUHJvamVjdFdpemFyZE5hbWUgPSBKQVhCIFByb2plY3QKLW5ld0pheGJQcm9qZWN0V2l6YXJkRGVzYyA9IENyZWF0ZSBhIEpBWEIgcHJvamVjdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9wbHVnaW4ueG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNjk4ZjAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvcHJvcGVydHlfZmlsZXMvanB0X2pheGJfY29yZS5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF9qYXhiX2NvcmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0NDRjNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvcHJvcGVydHlfZmlsZXMvanB0X2pheGJfY29yZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVNjaGVtYUdlbmVyYXRvcl9jcmVhdGluZ0pBWEJQcm9wZXJ0aWVzRmlsZVRhc2sgPSBDcmVhdGluZyBqYXhiLnByb3BlcnRpZXMgZmlsZQotCi1DbGFzc2VzR2VuZXJhdG9yX2dlbmVyYXRpbmdDbGFzc2VzID0gR2VuZXJhdGluZyBKQVhCIENsYXNzZXMgZnJvbSBTY2hlbWEKLUNsYXNzZXNHZW5lcmF0b3JfZ2VuZXJhdGluZ0NsYXNzZXNUYXNrID0gR2VuZXJhdGluZyBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF9qYXhiX3VpLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvcHJvcGVydHlfZmlsZXMvanB0X2pheGJfdWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkMDMxMi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvcHJvcGVydHlfZmlsZXMvanB0X2pheGJfdWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotSmF2YVByb2plY3RXaXphcmRQYWdlX3Byb2plY3QgPSBQcm9qZWN0OgotSmF2YVByb2plY3RXaXphcmRQYWdlX2Rlc3RpbmF0aW9uUHJvamVjdCA9IFNlbGVjdCBkZXN0aW5hdGlvbiBwcm9qZWN0OgotCi0jIENsYXNzZXNHZW5lcmF0b3IKLUNsYXNzZXNHZW5lcmF0b3JQcm9qZWN0V2l6YXJkUGFnZV90aXRsZSA9IEphdmEgUHJvamVjdAotQ2xhc3Nlc0dlbmVyYXRvclByb2plY3RXaXphcmRQYWdlX2Rlc2MgPSBTcGVjaWZ5IHByb2plY3QgZm9yIHRoZSBuZXcgY2xhc3Nlcy4KLQotQ2xhc3Nlc0dlbmVyYXRvcldpemFyZF90aXRsZSA9IE5ldyBKQVhCIENsYXNzZXMgZnJvbSBzY2hlbWEKLQotQ2xhc3Nlc0dlbmVyYXRvcldpemFyZF9lcnJvckRpYWxvZ1RpdGxlID0gR2VuZXJhdGUgQ2xhc3NlcyBGYWlsZWQKLUNsYXNzZXNHZW5lcmF0b3JXaXphcmRfY291bGROb3RDcmVhdGUgPSBDb3VsZCBub3QgY3JlYXRlIHswfQotCi1TY2hlbWFXaXphcmRQYWdlX3RpdGxlID0gU2VsZWN0IFNjaGVtYQotU2NoZW1hV2l6YXJkUGFnZV9kZXNjID0gU3BlY2lmeSBzY2hlbWEgdG8gZ2VuZXJhdGUgdGhlIGNsYXNzZXMgZnJvbQotCi1TY2hlbWFXaXphcmRQYWdlX3htbENhdGFsb2dUYWJsZVRpdGxlID0gWE1MIENhdGFsb2cKLVNjaGVtYVdpemFyZFBhZ2VfeG1sQ2F0YWxvZ0tleUNvbHVtbiA9IEtleQotU2NoZW1hV2l6YXJkUGFnZV94bWxDYXRhbG9nVXJpQ29sdW1uID0gVVJJCi0KLVNjaGVtYVdpemFyZFBhZ2VfZXJyb3JVcmlDYW5ub3RCZUxvY2F0ZWQgPSBUaGUgc2VsZWN0ZWQgY2F0YWxvZyBlbnRyeSBzcGVjaWZpZXMgYSBVUkkgdGhhdCBjYW4gbm90IGJlIGxvY2F0ZWQuCi0KLUNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX3RpdGxlID0gR2VuZXJhdGUgQ2xhc3NlcyBmcm9tIFNjaGVtYTogezB9Ci1DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9kZXNjID0gQ29uZmlndXJlIEpBWEIgY2xhc3MgZ2VuZXJhdGlvbi4KLQotQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfdXNlc01veHlJbXBsZW1lbnRhdGlvbiA9IFVzZSBFY2xpcHNlTGluayBNT1h5IGFzIHRoZSBKQVhCIGltcGxlbWVudGF0aW9uCi0KLUNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2NhdGFsb2cgPSBDYXRhbG9nOgotQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfYmluZGluZ3NGaWxlcyA9IEJpbmRpbmdzIGZpbGVzOgotQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfYnJvd3NlQnV0dG9uID0gQnJvd3NlLi4uCi1DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9hZGRCdXR0b24gPSBBZGQuLi4KLUNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX3JlbW92ZUJ1dHRvbiA9IFJlbW92ZQotQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfY2hvb3NlQUJpbmRpbmdzRmlsZSA9IEV4dGVybmFsIEJpbmRpbmdzIEZpbGUgU2VsZWN0aW9uCi1DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9jaG9vc2VBQ2F0YWxvZyA9IENhdGFsb2cgRmlsZSBTZWxlY3Rpb24KLQotQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2Vfc291cmNlRm9sZGVyU2VsZWN0aW9uRGlhbG9nX3RpdGxlID0gU291cmNlIEZvbGRlciBTZWxlY3Rpb24KLUNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2Nob29zZVNvdXJjZUZvbGRlckRpYWxvZ19kZXNjID0gJkNob29zZSBhIHNvdXJjZSBmb2xkZXI6Ci0KLUNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2pheGJMaWJyYXJpZXNOb3RBdmFpbGFibGUgPSBcCi0JCVRoZSBjbGFzc3BhdGggZm9yIHRoaXMgcHJvamVjdCBkb2VzIG5vdCBhcHBlYXIgdG8gY29udGFpbiB0aGUgbmVjZXNzYXJ5IGxpYnJhcmllcyB0byBwcm9jZWVkIHdpdGggY2xhc3MgZ2VuZXJhdGlvbi5cCi0JCVxuUGxlYXNlIGluc3VyZSB0aGF0IGEgSkFYQiBpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgb24gdGhlIGNsYXNzcGF0aC4KLQotQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfbW94eUxpYnJhcmllc05vdEF2YWlsYWJsZSA9IFwKLQkJVGhlIGNsYXNzcGF0aCBmb3IgdGhpcyBwcm9qZWN0IGRvZXMgbm90IGFwcGVhciB0byBjb250YWluIHRoZSBuZWNlc3NhcnkgbGlicmFyaWVzIHRvIHByb2NlZWQgd2l0aCBjbGFzcyBnZW5lcmF0aW9uLlwKLQkJXG5QbGVhc2UgaW5zdXJlIHRoYXQgRWNsaXBzZUxpbmsgTU9YeSBpcyBhdmFpbGFibGUgb24gdGhlIGNsYXNzcGF0aC4KLQotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3RpdGxlID0gQ2xhc3NlcyBHZW5lcmF0b3IgT3B0aW9ucwotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX2Rlc2MgPSBDb25maWd1cmUgSkFYQiBjb21waWxlciBvcHRpb25zLgotCi1DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfcHJveHlHcm91cCA9IFByb3h5Ci1DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2Vfbm9Qcm94eSA9IE5vIHByb3h5Ci1DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfcHJveHkgPSBQcm94eToKLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9wcm94eUZpbGUgPSBQcm94eSBmaWxlOgotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX2Nob29zZUFQcm94eUZpbGUgPSBQcm94eSBGaWxlIFNlbGVjdGlvbgotCi1DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdXNlU3RyaWN0VmFsaWRhdGlvbiA9IFVzZSBzdHJpY3QgdmFsaWRhdGlvbgotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX21ha2VSZWFkT25seSA9IEdlbmVyYXRlIHJlYWQtb25seSBmaWxlcwotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3N1cHByZXNzUGFja2FnZUluZm9HZW4gPSBTdXBwcmVzcyBwYWNrYWdlLWluZm8gZ2VuZXJhdGlvbgotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3N1cHByZXNzZXNIZWFkZXJHZW4gPSBTdXBwcmVzcyBnZW5lcmF0aW9uIG9mIGZpbGUgaGVhZGVyCi1DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdGFyZ2V0ID0gVGFyZ2V0IFhKQyAyLjAKLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV92ZXJib3NlID0gVmVyYm9zZQotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3F1aWV0ID0gU3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0Ci0KLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV90cmVhdHNBc1htbFNjaGVtYSA9IFRyZWF0IGlucHV0IGFzIFhNTCBzY2hlbWEKLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV90cmVhdHNBc1JlbGF4TmcgPSBUcmVhdCBpbnB1dCBhcyBSRUxBWCBORwotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3RyZWF0c0FzUmVsYXhOZ0NvbXBhY3QgPSBUcmVhdCBpbnB1dCBhcyBSRUxBWCBORyBjb21wYWN0IHN5bnRheAotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3RyZWF0c0FzRHRkID0gVHJlYXQgaW5wdXQgYXMgWE1MIERURAotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3RyZWF0c0FzV3NkbCA9IFRyZWF0IGlucHV0IGFzIFdTREwgYW5kIGNvbXBpbGUgc2NoZW1hIGluc2lkZSBpdAotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3Nob3dzVmVyc2lvbiA9IFNob3cgdmVyc2lvbgotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3Nob3dzSGVscCA9IFNob3cgaGVscAotCi1DbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGUgPSBDbGFzc2VzIEdlbmVyYXRvciBFeHRlbnNpb24gQ29uZmlndXJhdGlvbgotQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlX2Rlc2MgPSBDb25maWd1cmUgSkFYQiBjb21waWxlciB2ZW5kb3IgZXh0ZW5zaW9ucy4KLQotQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlX2FsbG93RXh0ZW5zaW9ucyA9IEFsbG93IHZlbmRvciBleHRlbnNpb25zCi1DbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uc1dpemFyZFBhZ2VfY2xhc3NwYXRoID0gQ2xhc3NwYXRoOgotQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlX2FkZGl0aW9uYWxBcmd1bWVudHMgPSBBZGRpdGlvbmFsIGFyZ3VtZW50czoKLQotQ2xhc3Nlc0dlbmVyYXRvclVpX2dlbmVyYXRpbmdFbnRpdGllcyA9IEdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gU2NoZW1hCi1DbGFzc2VzR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0VudGl0aWVzVGFzayA9IEdlbmVyYXRpbmcgY2xhc3NlcwotCi1DbGFzc2VzR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0NsYXNzZXNXYXJuaW5nVGl0bGUgPSBHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcwotQ2xhc3Nlc0dlbmVyYXRvclVpX2dlbmVyYXRpbmdDbGFzc2VzV2FybmluZ01lc3NhZ2UgPSBcCi0JCVdhcm5pbmc6IEdlbmVyYXRpbmcgY2xhc3NlcyB3aWxsIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBpbiB5b3VyIHByb2plY3QuXAotCQlcblxuQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotCi0jIFNjaGVtYUdlbmVyYXRvcgotU2NoZW1hR2VuZXJhdG9yV2l6YXJkX3RpdGxlID0gTmV3IEpBWEIgU2NoZW1hIEZpbGUKLQotU2NoZW1hR2VuZXJhdG9yV2l6YXJkX2dlbmVyYXRpbmdTY2hlbWEgPSBHZW5lcmF0aW5nIEpBWEIgU2NoZW1hCi0KLVNjaGVtYUdlbmVyYXRvclByb2plY3RXaXphcmRQYWdlX3RpdGxlID0gSkFYQiBzY2hlbWEgZmlsZQotU2NoZW1hR2VuZXJhdG9yUHJvamVjdFdpemFyZFBhZ2VfZGVzYyA9IFNwZWNpZnkgc2NoZW1hIGZpbGUgbmFtZSBhbmQgbG9jYXRpb24KLQotU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV90aXRsZSA9IEdlbmVyYXRlIFNjaGVtYSBmcm9tIENsYXNzZXMKLVNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2VfZGVzYyA9IFNlbGVjdCBjbGFzc2VzIHRvIGluY2x1ZGUuCi0KLVNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2Vfc2hlbWFMb2NhdGlvbiA9IFNjaGVtYSBmaWxlOgotU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9zaGVtYSA9IFNjaGVtYSBuYW1lOgotU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9wYWNrYWdlcyA9IFNlbGVjdCBjbGFzc2VzIHRvIGluY2x1ZGUgaW4gc2NoZW1hOgotU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9icm93c2UgPSBCcm93c2UuLi4KLQotU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9jaG9vc2VTY2hlbWFEaWFsb2dUaXRsZSA9IFNlbGVjdCBTY2hlbWEgRmlsZQotCi1TY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX2Vycm9yTm9TY2hlbWEgPSBTY2hlbWEgbmFtZSBjYW5ub3QgYmUgZW1wdHkKLVNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2VfZXJyb3JOb1BhY2thZ2UgPSBObyBjbGFzc2VzIGluY2x1ZGVkCi0KLVNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2VfamF4YkxpYnJhcmllc05vdEF2YWlsYWJsZSA9IFwKLQkJVGhlIGNsYXNzcGF0aCBmb3IgdGhpcyBwcm9qZWN0IGRvZXMgbm90IGFwcGVhciB0byBjb250YWluIHRoZSBuZWNlc3NhcnkgbGlicmFyaWVzIHRvIHByb2NlZWQgd2l0aCBzY2hlbWEgZ2VuZXJhdGlvbi5cCi0JCVxuUGxlYXNlIGluc3VyZSB0aGF0IGEgSkFYQiBpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgb24gdGhlIGNsYXNzcGF0aC4KLQotU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9tb3h5TGlicmFyaWVzTm90QXZhaWxhYmxlID0gXAotCQlUaGUgY2xhc3NwYXRoIGZvciB0aGlzIHByb2plY3QgZG9lcyBub3QgYXBwZWFyIHRvIGNvbnRhaW4gdGhlIG5lY2Vzc2FyeSBsaWJyYXJpZXMgdG8gcHJvY2VlZCB3aXRoIHNjaGVtYSBnZW5lcmF0aW9uLlwKLQkJXG5QbGVhc2UgaW5zdXJlIHRoYXQgRWNsaXBzZUxpbmsgTU9YeSBpcyBhdmFpbGFibGUgb24gdGhlIGNsYXNzcGF0aC4KLQotU2NoZW1hR2VuZXJhdG9yV2l6YXJkX2dlbmVyYXRlU2NoZW1hVGFzayA9IEdlbmVyYXRpbmcgc2NoZW1hIHswfQotCi0jTmV3U2NoZW1hRmlsZVdpemFyZFBhZ2UKLQotTmV3U2NoZW1hRmlsZVdpemFyZFBhZ2VfZXJyb3JOb3RKYXZhUHJvamVjdCA9IE5vdCBhIEphdmEgcHJvamVjdAotCi0KLUpheGJQcm9qZWN0V2l6YXJkX3RpdGxlID0gTmV3IEpBWEIgUHJvamVjdAotCi1KYXhiUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfdGl0bGUgPSBKQVhCIFByb2plY3QKLUpheGJQcm9qZWN0V2l6YXJkX2ZpcnN0UGFnZV9kZXNjID0gQ29uZmlndXJlIEpBWEIgcHJvamVjdCBzZXR0aW5ncy4KLQotSmF4YkZhY2V0V2l6YXJkUGFnZV90aXRsZSA9IEpBWEIgRmFjZXQKLUpheGJGYWNldFdpemFyZFBhZ2VfZGVzYyA9IENvbmZpZ3VyZSBKQVhCIHNldHRpbmdzLgotSmF4YkZhY2V0V2l6YXJkUGFnZV9wbGF0Zm9ybUxhYmVsID0gJlBsYXRmb3JtCi1KYXhiRmFjZXRXaXphcmRQYWdlX2pheGJJbXBsZW1lbnRhdGlvbkxhYmVsID0gSkFYQiBpbXBsZW1lbnRhdGlvbgotCi1KYXhiRmFjZXREYXRhTW9kZWxfdmFsaWRhdGVQbGF0Zm9ybU5vdFNwZWNpZmllZCA9IFBsYXRmb3JtIG11c3QgYmUgc3BlY2lmaWVkCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL0pwdEpheGJVaVBsdWdpbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9KcHRKYXhiVWlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgwZDUyOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL0pwdEpheGJVaVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcHRKYXhiVWlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmpheGIudWkiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9DQVRBTE9HX0lEID0gWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQ7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NBVEFMT0dfSUQgPSBYTUxDb3JlUGx1Z2luLkRFRkFVTFRfQ0FUQUxPR19JRDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9DQVRBTE9HX0lEID0gWE1MQ29yZVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRDsgLy8kTk9OLU5MUy0xJAotCQotCS8vICoqKioqKioqKiogc2luZ2xldG9uICoqKioqKioqKioKLQlwcml2YXRlIHN0YXRpYyBKcHRKYXhiVWlQbHVnaW4gSU5TVEFOQ0U7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHRKYXhiVWlQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIElOU1RBTkNFLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCkpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSkpOwotCX0KLQotCS8vICoqKioqKioqKiogSW1hZ2UgQVBJICoqKioqKioqKioKLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQlpZiAoISBrZXkuc3RhcnRzV2l0aCgiaWNvbnMvIikpIHsKLQkJCWtleSA9ICJpY29ucy8iICsga2V5OwotCQl9Ci0JCWlmICghIGtleS5lbmRzV2l0aCgiLmdpZiIpKSB7Ci0JCQlrZXkgPSBrZXkgKyAiLmdpZiI7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBrZXkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBhbiBpbWFnZSBmb3IgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlcgotCSAqLwotCS8vVE9ETyB3ZSBhcmUgdXNpbmcgdGhlIEltYWdlUmVnaXN0cnkgaGVyZSBhbmQgc3RvcmluZyBhbGwgb3VyIGljb25zIGZvciB0aGUgbGlmZSBvZiB0aGUgcGx1Z2luLCAKLQkvL3doaWNoIG1lYW5zIHVudGlsIHRoZSB3b3Jrc3BhY2UgaXMgY2xvc2VkLiAgVGhpcyBpcyBiZXR0ZXIgdGhhbiBiZWZvcmUgd2hlcmUgd2UgY29uc3RhbnRseSAKLQkvL2NyZWF0ZWQgbmV3IGltYWdlcy4gQnVnIDMwNjQzNyBpcyBhYm91dCBjbGVhbmluZyB0aGlzIHVwIGFuZCB1c2luZyBMb2NhbCBSZXNvdXJjZSBNYW5hZ2VycyAKLQkvL29uIG91ciB2aWV3cyBzbyB0aGF0IGNsb3NpbmcgdGhlIEpQQSBwZXJzcGVjdGl2ZSB3b3VsZCBtZWFuIG91ciBpY29ucyBhcmUgZGlzcG9zZWQuCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQlJbWFnZSBpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KGtleSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5LnB1dChrZXksIGdldEltYWdlRGVzY3JpcHRvcihrZXkpKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLy8gKioqKioqKioqKiBYTUxDb3JlUGx1Z2luIEFQSSAqKioqKioqKioqCi0JCi0JcHVibGljIElDYXRhbG9nIGdldERlZmF1bHRYTUxDYXRhbG9nKCkgewotCQlyZXR1cm4gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBKcHRKYXhiVWlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChJTlNUQU5DRSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvQ2xhc3Nlc0dlbmVyYXRvclVpLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL0NsYXNzZXNHZW5lcmF0b3JVaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzgzN2QwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvQ2xhc3Nlc0dlbmVyYXRvclVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmdlbi5DbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmdlbi5DbGFzc2VzR2VuZXJhdG9yT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmdlbi5HZW5lcmF0ZUpheGJDbGFzc2VzSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLkpwdEpheGJVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLmNsYXNzZXNnZW4uQ2xhc3Nlc0dlbmVyYXRvcldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqICBDbGFzc2VzR2VuZXJhdG9yVWkKLSAqLwotcHVibGljIGNsYXNzIENsYXNzZXNHZW5lcmF0b3JVaSB7Ci0JcHJpdmF0ZSBmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NoZW1hUGF0aE9yVXJpOwotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKElGaWxlIHhzZEZpbGUpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHhzZEZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKGphdmFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCUlQYXRoIHhtbFNjaGVtYSA9IHhzZEZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkKLQkJbmV3IENsYXNzZXNHZW5lcmF0b3JVaShqYXZhUHJvamVjdCwgeG1sU2NoZW1hLnRvT1NTdHJpbmcoKSkuZ2VuZXJhdGUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHJpdmF0ZSBDbGFzc2VzR2VuZXJhdG9yVWkoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgc2NoZW1hUGF0aE9yVXJpKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmKGphdmFQcm9qZWN0ID09IG51bGwgfHwgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShzY2hlbWFQYXRoT3JVcmkpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7Ci0JCXRoaXMuc2NoZW1hUGF0aE9yVXJpID0gc2NoZW1hUGF0aE9yVXJpOwotCX0KLQotCS8vICoqKioqKioqKiogZ2VuZXJhdGUgKioqKioqKioqKgotCS8qKgotCSAqIHByb21wdCB0aGUgdXNlciB3aXRoIGEgd2l6YXJkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGUoKSB7Ci0JCUNsYXNzZXNHZW5lcmF0b3JXaXphcmQgd2l6YXJkID0gbmV3IENsYXNzZXNHZW5lcmF0b3JXaXphcmQodGhpcy5qYXZhUHJvamVjdCwgdGhpcy5zY2hlbWFQYXRoT3JVcmkpOwotCQl3aXphcmQuc2V0V2luZG93VGl0bGUoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZF90aXRsZSk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHRoaXMuZ2V0Q3VycmVudFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJaW50IHJldHVybkNvZGUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAocmV0dXJuQ29kZSAhPSBXaW5kb3cuT0spIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb3V0cHV0RGlyID0gd2l6YXJkLmdldERlc3RpbmF0aW9uRm9sZGVyKCk7Ci0JCVN0cmluZyB0YXJnZXRQYWNrYWdlID0gd2l6YXJkLmdldFRhcmdldFBhY2thZ2UoKTsKLQkJU3RyaW5nIGNhdGFsb2cgPSB3aXphcmQuZ2V0Q2F0YWxvZygpOwotCQlib29sZWFuIHVzZXNNb3h5ID0gd2l6YXJkLnVzZXNNb3h5KCk7Ci0JCVN0cmluZ1tdIGJpbmRpbmdzRmlsZU5hbWVzID0gd2l6YXJkLmdldEJpbmRpbmdzRmlsZU5hbWVzKCk7Ci0JCUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zIGdlbmVyYXRvck9wdGlvbnMgPSB3aXphcmQuZ2V0R2VuZXJhdG9yT3B0aW9ucygpOwotCQlDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyBnZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zID0gd2l6YXJkLmdldEdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMoKTsKLQotCQlpZih0aGlzLmRpc3BsYXlPdmVycmlkaW5nQ2xhc3Nlc1dhcm5pbmcoZ2VuZXJhdG9yT3B0aW9ucykpIHsKLQkJCXRoaXMuZ2VuZXJhdGVKYXhiQ2xhc3NlcyhvdXRwdXREaXIsIHRhcmdldFBhY2thZ2UsIGNhdGFsb2csIHVzZXNNb3h5LCBiaW5kaW5nc0ZpbGVOYW1lcywgZ2VuZXJhdG9yT3B0aW9ucywgZ2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSmF4YkNsYXNzZXMoCi0JCVN0cmluZyBvdXRwdXREaXIsCi0JCVN0cmluZyB0YXJnZXRQYWNrYWdlLCAKLQkJU3RyaW5nIGNhdGFsb2csIAotCQlib29sZWFuIHVzZXNNb3h5R2VuZXJhdG9yLAotCQlTdHJpbmdbXSBiaW5kaW5nc0ZpbGVOYW1lcywKLQkJQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnMgZ2VuZXJhdG9yT3B0aW9ucywKLQkJQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMgZ2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucykgewotCQkKLQkJdHJ5IHsKLQkJCVdvcmtzcGFjZUpvYiBqb2IgPSBuZXcgR2VuZXJhdGVKYXhiQ2xhc3Nlc0pvYigKLQkJCQl0aGlzLmphdmFQcm9qZWN0LCAKLQkJCQl0aGlzLnNjaGVtYVBhdGhPclVyaSwgCi0JCQkJb3V0cHV0RGlyLCAKLQkJCQl0YXJnZXRQYWNrYWdlLCAKLQkJCQljYXRhbG9nLCAKLQkJCQl1c2VzTW94eUdlbmVyYXRvciwKLQkJCQliaW5kaW5nc0ZpbGVOYW1lcywKLQkJCQlnZW5lcmF0b3JPcHRpb25zLAotCQkJCWdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMpOwotCQkJam9iLnNjaGVkdWxlKCk7Ci0JCX0KLQkJY2F0Y2goUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJSnB0SmF4YlVpUGx1Z2luLmxvZyhyZSk7Ci0KLQkJCVN0cmluZyBtc2cgPSByZS5nZXRNZXNzYWdlKCk7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IChtc2cgPT0gbnVsbCkgPyByZS50b1N0cmluZygpIDogbXNnOwotCQkJdGhpcy5sb2dFcnJvcihtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJdGhpcy5kaXNwbGF5RXJyb3IobWVzc2FnZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcigKLQkJCQl0aGlzLmdldFNoZWxsKCksCi0JCQkJSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZF9lcnJvckRpYWxvZ1RpdGxlLAotCQkJCW1lc3NhZ2UKLQkJCSk7Ci0JfQotCQotCXByaXZhdGUgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlTaGVsbCBzaGVsbCA9IChkaXNwbGF5ID09IG51bGwpID8gbnVsbCA6IGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJaWYoc2hlbGwgPT0gbnVsbCAmJiBkaXNwbGF5ICE9IG51bGwpIHsKLQkJCVNoZWxsW10gc2hlbGxzID0gZGlzcGxheS5nZXRTaGVsbHMoKTsKLQkJCWlmKHNoZWxscy5sZW5ndGggPiAwKQotCQkJCXNoZWxsID0gc2hlbGxzWzBdOwotCQl9Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzT3ZlcnJpZGluZ0NsYXNzZXMoQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnMgZ2VuZXJhdG9yT3B0aW9ucykgewotCQlpZihnZW5lcmF0b3JPcHRpb25zID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmKGdlbmVyYXRvck9wdGlvbnMuc2hvd3NWZXJzaW9uKCkgfHwgZ2VuZXJhdG9yT3B0aW9ucy5zaG93c0hlbHAoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwbGF5T3ZlcnJpZGluZ0NsYXNzZXNXYXJuaW5nKENsYXNzZXNHZW5lcmF0b3JPcHRpb25zIGdlbmVyYXRvck9wdGlvbnMpIHsKLQkJCi0JCWlmKCAhIHRoaXMuaXNPdmVycmlkaW5nQ2xhc3NlcyhnZW5lcmF0b3JPcHRpb25zKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKAotCQkJdGhpcy5nZXRDdXJyZW50U2hlbGwoKSwgCi0JCQlKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0NsYXNzZXNXYXJuaW5nVGl0bGUsCi0JCQlKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0NsYXNzZXNXYXJuaW5nTWVzc2FnZSk7Ci0JfQotCQotCXByaXZhdGUgU2hlbGwgZ2V0Q3VycmVudFNoZWxsKCkgewotCSAgICByZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL0pwdEpheGJVaUljb25zLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL0pwdEpheGJVaUljb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNWYwOWIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9KcHRKYXhiVWlJY29ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcHRKYXhiVWlJY29ucwotewotCS8vICoqKioqKioqKioqKioqKiogR2VuZXJhbCBpY29ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0dFTiA9ICJmdWxsL3dpemJhbi9OZXdYU0QiOwotCi0JLy8gKioqKioqKioqKioqKioqKiBXaXphcmQgaWNvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0dFTl9XSVpfQkFOTkVSID0gImZ1bGwvd2l6YmFuL05ld1hTRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NFU19HRU5fV0laX0JBTk5FUiA9ICJmdWxsL3dpemJhbi9uZXdjbGFzc193aXoiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWEJfV0laX0JBTk5FUiA9ICJmdWxsL3dpemJhbi9uZXdfamF4Yl9wcmpfd2l6IjsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvSnB0SmF4YlVpTWVzc2FnZXMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvSnB0SmF4YlVpTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyZjc1Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL0pwdEpheGJVaU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIEpBWEIgVUkuCi0gKgotICogQHZlcnNpb24gMi4zCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRKYXhiVWlNZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXZhUHJvamVjdFdpemFyZFBhZ2VfcHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXZhUHJvamVjdFdpemFyZFBhZ2VfZGVzdGluYXRpb25Qcm9qZWN0OwotCQotCS8vIENsYXNzZXNHZW5lcmF0b3IKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yUHJvamVjdFdpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvclByb2plY3RXaXphcmRQYWdlX2Rlc2M7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkX2Vycm9yRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZF9jb3VsZE5vdENyZWF0ZTsKLQkKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYVdpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hV2l6YXJkUGFnZV9kZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYVdpemFyZFBhZ2VfeG1sQ2F0YWxvZ1RhYmxlVGl0bGU7IAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYVdpemFyZFBhZ2VfeG1sQ2F0YWxvZ0tleUNvbHVtbjsgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hV2l6YXJkUGFnZV94bWxDYXRhbG9nVXJpQ29sdW1uOyAKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFXaXphcmRQYWdlX2Vycm9yVXJpQ2Fubm90QmVMb2NhdGVkOwotCQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2Rlc2M7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfdXNlc01veHlJbXBsZW1lbnRhdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9jYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2JpbmRpbmdzRmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfYnJvd3NlQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2FkZEJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9yZW1vdmVCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfY2hvb3NlQUJpbmRpbmdzRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9jaG9vc2VBQ2F0YWxvZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX3NvdXJjZUZvbGRlclNlbGVjdGlvbkRpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9jaG9vc2VTb3VyY2VGb2xkZXJEaWFsb2dfZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2pheGJMaWJyYXJpZXNOb3RBdmFpbGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfbW94eUxpYnJhcmllc05vdEF2YWlsYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9wcm94eUdyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9ub1Byb3h5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9wcm94eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfcHJveHlGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9jaG9vc2VBUHJveHlGaWxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV91c2VTdHJpY3RWYWxpZGF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9tYWtlUmVhZE9ubHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3N1cHByZXNzUGFja2FnZUluZm9HZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3N1cHByZXNzZXNIZWFkZXJHZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3RhcmdldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdmVyYm9zZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfcXVpZXQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdHJlYXRzQXNYbWxTY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3RyZWF0c0FzUmVsYXhOZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdHJlYXRzQXNSZWxheE5nQ29tcGFjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdHJlYXRzQXNEdGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3RyZWF0c0FzV3NkbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2Vfc2hvd3NWZXJzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9zaG93c0hlbHA7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zV2l6YXJkUGFnZV9kZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zV2l6YXJkUGFnZV9hbGxvd0V4dGVuc2lvbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlX2NsYXNzcGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uc1dpemFyZFBhZ2VfYWRkaXRpb25hbEFyZ3VtZW50czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JVaV9nZW5lcmF0aW5nRW50aXRpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvclVpX2dlbmVyYXRpbmdFbnRpdGllc1Rhc2s7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0NsYXNzZXNXYXJuaW5nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvclVpX2dlbmVyYXRpbmdDbGFzc2VzV2FybmluZ01lc3NhZ2U7Ci0KLQkvLyBTY2hlbWFHZW5lcmF0b3IKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hR2VuZXJhdG9yV2l6YXJkX2dlbmVyYXRpbmdTY2hlbWE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JQcm9qZWN0V2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JQcm9qZWN0V2l6YXJkUGFnZV9kZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9kZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2Vfc2hlbWFMb2NhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX3NoZW1hOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2VfcGFja2FnZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9icm93c2U7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9jaG9vc2VTY2hlbWFEaWFsb2dUaXRsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX2Vycm9yTm9TY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9lcnJvck5vUGFja2FnZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX2pheGJMaWJyYXJpZXNOb3RBdmFpbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX21veHlMaWJyYXJpZXNOb3RBdmFpbGFibGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hR2VuZXJhdG9yV2l6YXJkX2dlbmVyYXRlU2NoZW1hVGFzazsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdTY2hlbWFGaWxlV2l6YXJkUGFnZV9lcnJvck5vdEphdmFQcm9qZWN0OwotCQotCQotCS8vIG5ldyBwcm9qZWN0IHdpemFyZAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpheGJQcm9qZWN0V2l6YXJkX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpheGJQcm9qZWN0V2l6YXJkX2ZpcnN0UGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXhiUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfZGVzYzsKLQkKLQkKLQkvLyBmYWNldCBwYWdlCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmF4YkZhY2V0V2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXhiRmFjZXRXaXphcmRQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmF4YkZhY2V0V2l6YXJkUGFnZV9wbGF0Zm9ybUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpheGJGYWNldFdpemFyZFBhZ2VfamF4YkltcGxlbWVudGF0aW9uTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmF4YkZhY2V0RGF0YU1vZGVsX3ZhbGlkYXRlUGxhdGZvcm1Ob3RTcGVjaWZpZWQ7Ci0JCi0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF9qYXhiX3VpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdEpheGJVaU1lc3NhZ2VzLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBKcHRKYXhiVWlNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVDbGFzc2VzQWN0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVDbGFzc2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNmZkNjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlQ2xhc3Nlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5DbGFzc2VzR2VuZXJhdG9yVWk7Ci0KLS8qKgotICogIEdlbmVyYXRlQ2xhc3Nlc0FjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVDbGFzc2VzQWN0aW9uIGV4dGVuZHMgT2JqZWN0QWN0aW9uCi17Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElGaWxlIHhzZEZpbGUpIHsKLQotCQlDbGFzc2VzR2VuZXJhdG9yVWkuZ2VuZXJhdGUoeHNkRmlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2FjdGlvbnMvT2JqZWN0QWN0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2FjdGlvbnMvT2JqZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MmQ3NWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9hY3Rpb25zL09iamVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiAgR2VuZXJhdGVFbnRpdGllc0FjdGlvbgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT2JqZWN0QWN0aW9uIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgCi17Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0KLQlwdWJsaWMgT2JqZWN0QWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKHRoaXMuY3VycmVudFNlbGVjdGlvbiBpbnN0YW5jZW9mIElUcmVlU2VsZWN0aW9uKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPD8+IHN0cmVhbSA9ICgoSVRyZWVTZWxlY3Rpb24pIHRoaXMuY3VycmVudFNlbGVjdGlvbikuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5leGVjdXRlKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCQotCQlpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJdGhpcy5leGVjdXRlKChJRmlsZSlzZWxlY3Rpb24pOwotCQl9Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJRmlsZSBmaWxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9maWx0ZXJzL0NvbnRhaW5lckZpbHRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9maWx0ZXJzL0NvbnRhaW5lckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTcyZTBiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvZmlsdGVycy9Db250YWluZXJGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci0KLS8qKgotICogRmlsdGVycyBvdXQgYWxsIGNvbnRhaW5lcnMgaS5lLiBhbGwgcGFja2FnZXMgYW5kIGZvbGRlcnMKLSAqLwotcHVibGljIGNsYXNzIENvbnRhaW5lckZpbHRlciAgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWJvb2xlYW4gaXNDb250YWluZXIgPSBlbGVtZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcjsKLQkJCi0JCWlmKCAhIGlzQ29udGFpbmVyICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpIHsKLQkJCWludCB0eXBlPSAoKElKYXZhRWxlbWVudCllbGVtZW50KS5nZXRFbGVtZW50VHlwZSgpOwotCQkJaXNDb250YWluZXIgPSAodHlwZSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTAotCQkJCQkJfHwgdHlwZSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUCi0JCQkJCQl8fCB0eXBlID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UCi0JCQkJCQl8fCB0eXBlID09SUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCk7Ci0JCX0KLQkJcmV0dXJuICEgaXNDb250YWluZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJGaWx0ZXIgb3V0IENvbnRhaW5lcnMiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9maWx0ZXJzL0VtcHR5SW5uZXJQYWNrYWdlRmlsdGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2ZpbHRlcnMvRW1wdHlJbm5lclBhY2thZ2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5NjA5ZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2ZpbHRlcnMvRW1wdHlJbm5lclBhY2thZ2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIENvZGUgb3JpZ2luYXRlIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmZpbHRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5maWx0ZXJzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotCi0KLS8qKgotICogRmlsdGVycyBlbXB0eSBub24tbGVhZiBwYWNrYWdlIGZyYWdtZW50cwotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlJbm5lclBhY2thZ2VGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCi0JLyoKLQkgKiBAc2VlIFZpZXdlckZpbHRlcgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKLQkJCUlQYWNrYWdlRnJhZ21lbnQgcGtnPSAoSVBhY2thZ2VGcmFnbWVudCllbGVtZW50OwotCQkJdHJ5IHsKLQkJCQlpZiAocGtnLmlzRGVmYXVsdFBhY2thZ2UoKSkKLQkJCQkJcmV0dXJuIHBrZy5oYXNDaGlsZHJlbigpOwotCQkJCXJldHVybiAhcGtnLmhhc1N1YnBhY2thZ2VzKCkgfHwgcGtnLmhhc0NoaWxkcmVuKCkgfHwgKHBrZy5nZXROb25KYXZhUmVzb3VyY2VzKCkubGVuZ3RoID4gMCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvZmlsdGVycy9Ob25BcmNoaXZlT3JFeHRlcm5hbEVsZW1lbnRGaWx0ZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvZmlsdGVycy9Ob25BcmNoaXZlT3JFeHRlcm5hbEVsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlOTVmOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2ZpbHRlcnMvTm9uQXJjaGl2ZU9yRXh0ZXJuYWxFbGVtZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKiAgICAgCi0qICAgICBDb2RlIG9yaWdpbmF0ZSBmcm9tIFhYWFgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLQotLyoqCi0gKiAgTm9uQXJjaGl2ZU9yRXh0ZXJuYWxFbGVtZW50RmlsdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBOb25BcmNoaXZlT3JFeHRlcm5hbEVsZW1lbnRGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdD0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50OwotCQkJcmV0dXJuICFyb290LmlzQXJjaGl2ZSgpICYmICFyb290LmlzRXh0ZXJuYWwoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkZpbHRlciBvdXQ6IE5vbi1BcmNoaXZlIGFuZCBOb24tRXh0ZXJuYWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2ZpbHRlcnMvTm9uQ29udGFpbmVyRmlsdGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2ZpbHRlcnMvTm9uQ29udGFpbmVyRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDZlNmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9maWx0ZXJzL05vbkNvbnRhaW5lckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci0KLS8qKgotICogRmlsdGVycyBvdXQgYWxsIG5vbiBDb250YWluZXIgYW5kIGFsbCBKYXZhUHJvamVjdCAKLSAqIHdpdGggbmFtZSBub3QgZXF1YWxzIHRvIHRoZSBnaXZlbiBwcm9qZWN0TmFtZS4KLSAqLwotcHVibGljIGNsYXNzIE5vbkNvbnRhaW5lckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlcgotewotCWZpbmFsIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOwotCi0JcHVibGljIE5vbkNvbnRhaW5lckZpbHRlcihTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgewotCQlib29sZWFuIGlzQ29udGFpbmVyID0gZWxlbWVudCBpbnN0YW5jZW9mIElDb250YWluZXI7Ci0JCWludCB0eXBlOwotCQlpZiggISBpc0NvbnRhaW5lciAmJiBlbGVtZW50IGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0JCQl0eXBlID0gKChJSmF2YUVsZW1lbnQpZWxlbWVudCkuZ2V0RWxlbWVudFR5cGUoKTsKLQkJCWlzQ29udGFpbmVyID0gKHR5cGUgPT0gSUphdmFFbGVtZW50LkpBVkFfTU9ERUwKLQkJCQkJCXx8IHR5cGUgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVAotCQkJCQkJfHwgdHlwZSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVAotCQkJCQkJfHwgdHlwZSA9PUlKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpOwotCQl9Ci0JCWlmKGlzQ29udGFpbmVyICYmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSkgewotCQkJdHlwZSA9ICgoSUphdmFFbGVtZW50KWVsZW1lbnQpLmdldEVsZW1lbnRUeXBlKCk7Ci0JCQlpZih0eXBlID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QpIHsKLQkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoKElKYXZhUHJvamVjdCllbGVtZW50KS5nZXRFbGVtZW50TmFtZSgpOwotCQkJCXJldHVybiBwcm9qZWN0TmFtZS5lcXVhbHModGhpcy5wcm9qZWN0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzQ29udGFpbmVyOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRmlsdGVyIG91dCBOb24tQ29udGFpbmVycyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2ZpbHRlcnMvTm9uSmF2YUVsZW1lbnRGaWx0ZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvZmlsdGVycy9Ob25KYXZhRWxlbWVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzFhNjk0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvZmlsdGVycy9Ob25KYXZhRWxlbWVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogQ29kZSBvcmlnaW5hdGUgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuZmlsdGVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLQotCi0vKioKLSAqIEZpbHRlcnMgb3V0IGFsbCBub24tSmF2YSBlbGVtZW50cywgYW5kIGVsZW1lbnRzIG5hbWVkIHBhY2thZ2UtaW5mbwotICovCi1wdWJsaWMgY2xhc3MgTm9uSmF2YUVsZW1lbnRGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgRklMRV9UT19FWENMVURFID0gInBhY2thZ2UtaW5mby5qYXZhIjsgICAvLyROT04tTkxTLTEkCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXIjc2VsZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgewotCQkJcmV0dXJuKEZJTEVfVE9fRVhDTFVERS5lcXVhbHMoKChJSmF2YUVsZW1lbnQpZWxlbWVudCkuZ2V0RWxlbWVudE5hbWUoKSkpID8KLQkJCQkJZmFsc2UgOiB0cnVlOwotCQl9Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCUlQcm9qZWN0IHByb2plY3Q9ICgoSVJlc291cmNlKWVsZW1lbnQpLmdldFByb2plY3QoKTsKLQkJCXJldHVybiBwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNPcGVuKCk7Ci0JCX0KLQotCQkvLyBFeGNsdWRlIGFsbCBJU3RvcmFnZSBlbGVtZW50cyB3aGljaCBhcmUgbmVpdGhlciBKYXZhIGVsZW1lbnRzIG5vciByZXNvdXJjZXMKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU3RvcmFnZSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvSmF2YVByb2plY3RXaXphcmRQYWdlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvSmF2YVByb2plY3RXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZjI1OTYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL0phdmFQcm9qZWN0V2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogIEphdmFQcm9qZWN0V2l6YXJkUGFnZQotICovCi1wdWJsaWMgY2xhc3MgSmF2YVByb2plY3RXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQlwcml2YXRlIFRhYmxlIHByb2plY3RUYWJsZTsKLQlwcml2YXRlIFRhYmxlVmlld2VyIHByb2plY3RUYWJsZVZpZXdlcjsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgU0VMRUNUX1BST0pFQ1RfUEFHRV9OQU1FID0gIlNlbGVjdEphdmFQcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGludCBQUk9KRUNUX05BTUVfQ09MVU1OX0lOREVYID0gMDsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCQotCXB1YmxpYyBKYXZhUHJvamVjdFdpemFyZFBhZ2UoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXN1cGVyKFNFTEVDVF9QUk9KRUNUX1BBR0VfTkFNRSk7Ci0KLQkJdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCX0KLQkKLQkvLyAqKioqKioqKioqIElEaWFsb2dQYWdlIGltcGxlbWVudGF0aW9uICAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJdGhpcy5idWlsZExhYmVsKGNvbXBvc2l0ZSwgSnB0SmF4YlVpTWVzc2FnZXMuSmF2YVByb2plY3RXaXphcmRQYWdlX2Rlc3RpbmF0aW9uUHJvamVjdCk7Ci0JCQotCQl0aGlzLnByb2plY3RUYWJsZSA9IHRoaXMuYnVpbGRQcm9qZWN0VGFibGUoY29tcG9zaXRlLCB0aGlzLmJ1aWxkUHJvamVjdFRhYmxlU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQotCQl0aGlzLnByb2plY3RUYWJsZVZpZXdlciA9IHRoaXMuYnVpbGRQcm9qZWN0VGFibGVWaWV3ZXIoCi0JCQkJCQkJCQkJCQl0aGlzLnByb2plY3RUYWJsZSwgCi0JCQkJCQkJCQkJCQl0aGlzLmJ1aWxkUHJvamVjdFRhYmxlTGFiZWxQcm92aWRlcigpLCAKLQkJCQkJCQkJCQkJCXRoaXMuYnVpbGRQcm9qZWN0VGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRoaXMuZmlsbFByb2plY3RMaXN0KCk7Ci0JCXRoaXMuc2V0Q29udHJvbChjb21wb3NpdGUpOwotCQl0aGlzLnNldFRhYmxlU2VsZWN0aW9uKHRoaXMuamF2YVByb2plY3QpOwotCQl0aGlzLnZhbGlkYXRlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFByb2plY3RUYWJsZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RlZFByb2plY3RDaGFuZ2VkKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiUHJvbXB0UHJvamVjdFdpemFyZFBhZ2UgcHJvamVjdCB0YWJsZSBzZWxlY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lciBjYWxsYmFja3MgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0ZWRQcm9qZWN0Q2hhbmdlZCgpIHsKLQkJaWYodGhpcy5wcm9qZWN0VGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSAhPSAtMSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAgdGhpcy5wcm9qZWN0VGFibGUuZ2V0SXRlbSh0aGlzLnByb2plY3RUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGl0ZW0uZ2V0VGV4dCgwKTsKLQkJCWlmKCAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocHJvamVjdE5hbWUpKSB7Ci0KLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCQl0aGlzLnNldEphdmFQcm9qZWN0KEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7Ci0JCQkJdGhpcy52YWxpZGF0ZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3Q7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcm90ZWN0ZWQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJsZVNlbGVjdGlvbihJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJaWYoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCWZvcihUYWJsZUl0ZW0gaXRlbTogdGhpcy5wcm9qZWN0VGFibGUuZ2V0SXRlbXMoKSkgewotCQkJCWlmKGl0ZW0uZ2V0VGV4dCgwKS5lcXVhbHMocHJvamVjdE5hbWUpKSB7Ci0JCQkJCXRoaXMucHJvamVjdFRhYmxlLnNldFNlbGVjdGlvbihpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZmlsbFByb2plY3RMaXN0KCkgewotCQl0aGlzLnByb2plY3RUYWJsZVZpZXdlci5zZXRJbnB1dCh0aGlzLmdldFNvcnRlZEphdmFQcm9qZWN0c05hbWVzKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKHRoaXMucHJvamVjdFRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgIT0gLTEpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0SmF2YVByb2plY3QoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRTb3J0ZWRKYXZhUHJvamVjdHNOYW1lcygpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydCh0aGlzLmdldEphdmFQcm9qZWN0c05hbWVzKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0SmF2YVByb2plY3RzTmFtZXMoKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmFycmF5KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SVByb2plY3QsIFN0cmluZz4odGhpcy5nZXRKYXZhUHJvamVjdHMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKElQcm9qZWN0IHByb2plY3QpIHsKLQkJCQkJcmV0dXJuIHByb2plY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0sCi0JCQluZXcgU3RyaW5nWzBdKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJdGVyYWJsZTxJUHJvamVjdD4gZ2V0SmF2YVByb2plY3RzKCkgewotCSAgIHJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SVByb2plY3Q+KENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuZ2V0UHJvamVjdHMoKSkpIHsKLQkgICAgICBAT3ZlcnJpZGUKLQkgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSVByb2plY3QgbmV4dCkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBuZXh0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JICAgICAgfQotCSAgIH07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJUHJvamVjdD4gZ2V0UHJvamVjdHMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxJUHJvamVjdD4oUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm9qZWN0VGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlpZihjb2x1bW5JbmRleCA9PSBQUk9KRUNUX05BTUVfQ09MVU1OX0lOREVYKQotCQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKG9yZy5lY2xpcHNlLnVpLmlkZS5JREUuU2hhcmVkSW1hZ2VzLklNR19PQkpfUFJPSkVDVCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlhc3NlcnQgZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZzsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IChTdHJpbmcpZWxlbWVudDsKLQkJCWlmKGNvbHVtbkluZGV4ID09IFBST0pFQ1RfTkFNRV9DT0xVTU5fSU5ERVgpCi0JCQkJcmV0dXJuIHByb2plY3ROYW1lOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQotCX0KLQotCXByaXZhdGUgZmluYWwgY2xhc3MgUHJvamVjdFRhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChTdHJpbmdbXSlpbnB1dEVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7fQotCX0KLQotCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0KLQlwcml2YXRlIElUYWJsZUxhYmVsUHJvdmlkZXIgYnVpbGRQcm9qZWN0VGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb2plY3RUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGJ1aWxkUHJvamVjdFRhYmxlQ29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb2plY3RUYWJsZUNvbnRlbnRQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgTGFiZWwgYnVpbGRMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCggcGFyZW50LCBTV1QuTk9ORSApOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZSBidWlsZFByb2plY3RUYWJsZShDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlUYWJsZVZpZXdlciB0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIAotCQkJCQkJCQkJCQkJU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuVklSVFVBTCk7CQkKLQotCQlUYWJsZSB0YWJsZSA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGJ1aWxkUHJvamVjdFRhYmxlVmlld2VyKFRhYmxlIHBhcmVudCwgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQotCQlUYWJsZVZpZXdlciB0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQpOwotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJcmV0dXJuIHRhYmxlVmlld2VyOwotCX0KLX0JCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvUHJvamVjdFdpemFyZFBhZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9Qcm9qZWN0V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjYwNWIwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9Qcm9qZWN0V2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiAgUHJvamVjdFdpemFyZFBhZ2UKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZQotewotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCXByaXZhdGUgUHJvamVjdEdyb3VwIHByb2plY3RHcm91cDsKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0gICAgcHVibGljIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3RGcm9tU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgIAlpZihzZWxlY3Rpb24gPT0gbnVsbCkgewotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gKElKYXZhUHJvamVjdClmaXJzdEVsZW1lbnQ7Ci0JCX0KLQkJZWxzZSBpZihmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoKElSZXNvdXJjZSkgZmlyc3RFbGVtZW50KS5nZXRQcm9qZWN0KCk7Ci0JCQlyZXR1cm4gZ2V0SmF2YVByb2plY3RGcm9tKHByb2plY3QpOwotCQl9Ci0JCWVsc2UgaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChJSmF2YUVsZW1lbnQpZmlyc3RFbGVtZW50KS5nZXRKYXZhUHJvamVjdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdEZyb20oSVByb2plY3QgcHJvamVjdCkgewotICAgIAlyZXR1cm4gKElKYXZhUHJvamVjdCkoKElKYXZhRWxlbWVudCkoKElBZGFwdGFibGUpcHJvamVjdCkuZ2V0QWRhcHRlcihJSmF2YUVsZW1lbnQuY2xhc3MpKTsKLSAgICB9Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLSAgICAKLQlwdWJsaWMgUHJvamVjdFdpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJKYXZhIFByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRoaXMuc2V0RGVzY3JpcHRpb24oSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvclByb2plY3RXaXphcmRQYWdlX2Rlc2MpOwotCX0KLQkKLQlwdWJsaWMgUHJvamVjdFdpemFyZFBhZ2UoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXRoaXMoKTsKLQotCQl0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7Ci0JfQotCQotCS8vICoqKioqKioqKiogSURpYWxvZ1BhZ2UgaW1wbGVtZW50YXRpb24gICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCXRoaXMuc2V0Q29udHJvbCh0aGlzLmJ1aWxkVG9wTGV2ZWxDb250cm9sKHBhcmVudCkpOwotCX0KLQotCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3Q7Ci0JfQotCQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRUb3BMZXZlbENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5wcm9qZWN0R3JvdXAgPSBuZXcgUHJvamVjdEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLS8vCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSEVMUF9DT05URVhUX0lEKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEphdmFQcm9qZWN0KElKYXZhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMuamF2YVByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9qZWN0Q2hhbmdlZCgpIHsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSB0aGlzLnByb2plY3RHcm91cC5nZXRQcm9qZWN0TmFtZSgpOwotCQlpZiggISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHByb2plY3ROYW1lKSkgewotCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCXRoaXMuc2V0SmF2YVByb2plY3QoSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsKLQkJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcm9qZWN0IGdyb3VwICoqKioqKioqKioKLQotCWNsYXNzIFByb2plY3RHcm91cCB7Ci0KLQkJcHJpdmF0ZSBDb21ibyBwcm9qZWN0Q29tYm87Ci0KLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCQlwcml2YXRlIFByb2plY3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJCS8vIFByb2plY3QKLQkJCXRoaXMuYnVpbGRMYWJlbChjb21wb3NpdGUsIEpwdEpheGJVaU1lc3NhZ2VzLkphdmFQcm9qZWN0V2l6YXJkUGFnZV9wcm9qZWN0KTsKLQkJCXRoaXMucHJvamVjdENvbWJvID0gdGhpcy5idWlsZFByb2plY3RDb21ibyhjb21wb3NpdGUsIHRoaXMuYnVpbGRQcm9qZWN0Q29tYm9TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCXRoaXMudXBkYXRlUHJvamVjdENvbWJvKCk7Ci0KLQkJCXNldFBhZ2VDb21wbGV0ZSggISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2V0UHJvamVjdE5hbWUoKSkpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRQcm9qZWN0Q29tYm9TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vIG5vdGhpbmcgc3BlY2lhbCBmb3IgImRlZmF1bHQiIChkb3VibGUtY2xpY2s/KQotCQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJUHJvamVjdEdyb3VwLnRoaXMuc2VsZWN0ZWRQcm9qZWN0Q2hhbmdlZCgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gIkphdmFQcm9qZWN0V2l6YXJkUGFnZSBwcm9qZWN0IGNvbWJvLWJveCBzZWxlY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJLy8gKioqKioqKioqKiBsaXN0ZW5lciBjYWxsYmFja3MgKioqKioqKioqKgotCi0JCXZvaWQgc2VsZWN0ZWRQcm9qZWN0Q2hhbmdlZCgpIHsKLQkJCXByb2plY3RDaGFuZ2VkKCk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMucHJvamVjdENvbWJvLmdldFRleHQoKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0JCQotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9qZWN0Q29tYm8oKSB7Ci0JCQkKLQkJCXRoaXMucHJvamVjdENvbWJvLnJlbW92ZUFsbCgpOwotCQkJCi0JCQlmb3IgKFN0cmluZyBuYW1lIDogdGhpcy5nZXRTb3J0ZWRKYXZhUHJvamVjdHNOYW1lcygpKSB7Ci0JCQkJdGhpcy5wcm9qZWN0Q29tYm8uYWRkKG5hbWUpOwotCQkJfQotCQkJaWYoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJCXRoaXMucHJvamVjdENvbWJvLnNlbGVjdCh0aGlzLnByb2plY3RDb21iby5pbmRleE9mKGphdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nW10gZ2V0U29ydGVkSmF2YVByb2plY3RzTmFtZXMoKSB7Ci0JCQlyZXR1cm4gQXJyYXlUb29scy5zb3J0KHRoaXMuZ2V0SmF2YVByb2plY3RzTmFtZXMoKSk7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZ1tdIGdldEphdmFQcm9qZWN0c05hbWVzKCkgewotCQkJcmV0dXJuIEFycmF5VG9vbHMuYXJyYXkoCi0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SVByb2plY3QsIFN0cmluZz4odGhpcy5nZXRKYXZhUHJvamVjdHMoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSVByb2plY3QgcHJvamVjdCkgewotCQkJCQkJcmV0dXJuIHByb2plY3QuZ2V0TmFtZSgpOwotCQkJCQl9Ci0JCQkJfSwKLQkJCQluZXcgU3RyaW5nWzBdKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBJdGVyYWJsZTxJUHJvamVjdD4gZ2V0SmF2YVByb2plY3RzKCkgewotCQkgICByZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPElQcm9qZWN0PihDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmdldFByb2plY3RzKCkpKSB7Ci0JCSAgICAgIEBPdmVycmlkZQotCQkgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSVByb2plY3QgbmV4dCkgewotCQkJCQl0cnkgewotCQkJCQkJcmV0dXJuIG5leHQuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCSAgICAgIH0KLQkJICAgfTsKLQkJfQotCi0JCXByaXZhdGUgSXRlcmF0b3I8SVByb2plY3Q+IGdldFByb2plY3RzKCkgewotCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPElQcm9qZWN0PihSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCkpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBVSSBjb21wb25lbnRzICoqKioqKioqKioKLQotCQlwcml2YXRlIExhYmVsIGJ1aWxkTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0KLQkJcHJpdmF0ZSBDb21ibyBidWlsZFByb2plY3RDb21ibyhDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQ29tYm8gcHJvamVjdENvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCQlwcm9qZWN0Q29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlwcm9qZWN0Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJcmV0dXJuIHByb2plY3RDb21ibzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL0NsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zV2l6YXJkUGFnZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2NsYXNzZXNnZW4vQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMzAwYzUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2NsYXNzZXNnZW4vQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLndpemFyZHMuY2xhc3Nlc2dlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLkpwdEpheGJVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqICBDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uc1dpemFyZFBhZ2UKLSAqLwotcHVibGljIGNsYXNzIENsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UKLXsKLQkKLQlwcml2YXRlIEV4dGVuc2lvbk9wdGlvbnNDb21wb3NpdGUgYWRkaXRpb25hbEFyZ3NDb21wb3NpdGU7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uc1dpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJDbGFzc2VzIEdlbmVyYXRvciBFeHRlbnNpb24gT3B0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLnNldFRpdGxlKEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXRoaXMuc2V0RGVzY3JpcHRpb24oSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlX2Rlc2MpOwotCX0KLQotCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCXRoaXMuc2V0Q29udHJvbCh0aGlzLmJ1aWxkVG9wTGV2ZWxDb250cm9sKHBhcmVudCkpOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRvcExldmVsQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXRoaXMuYWRkaXRpb25hbEFyZ3NDb21wb3NpdGUgPSBuZXcgRXh0ZW5zaW9uT3B0aW9uc0NvbXBvc2l0ZShjb21wb3NpdGUpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBib29sZWFuIGFsbG93c0V4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmFkZGl0aW9uYWxBcmdzQ29tcG9zaXRlLmFsbG93c0V4dGVuc2lvbnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiB0aGlzLmFkZGl0aW9uYWxBcmdzQ29tcG9zaXRlLmdldENsYXNzcGF0aCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFkZGl0aW9uYWxBcmdzKCkgewotCQlyZXR1cm4gdGhpcy5hZGRpdGlvbmFsQXJnc0NvbXBvc2l0ZS5nZXRBZGRpdGlvbmFsQXJncygpOwotCX0KLQotCS8vICoqKioqKioqKiogQWRkaXRpb25hbEFyZ3NDb21wb3NpdGUgKioqKioqKioqKgotCi0JY2xhc3MgRXh0ZW5zaW9uT3B0aW9uc0NvbXBvc2l0ZSB7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGFsbG93c0V4dGVuc2lvbnM7Ci0JCXByaXZhdGUgZmluYWwgVGV4dCBjbGFzc3BhdGhUZXh0OwotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBhbGxvd3NFeHRlbnNpb25zQ2hlY2tCb3g7Ci0JCQotCQlwcml2YXRlIGZpbmFsIFRleHQgYWRkaXRpb25hbEFyZ3NUZXh0OwotCQkKLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0JCi0JCXByaXZhdGUgRXh0ZW5zaW9uT3B0aW9uc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5hbGxvd3NFeHRlbnNpb25zID0gZmFsc2U7Ci0JCQkKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkvLyBUT0RPIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5ncm91cCwgSEVMUF9DT05URVhUX0lEKTsKLQkJCQotCQkJdGhpcy5hbGxvd3NFeHRlbnNpb25zQ2hlY2tCb3ggPSB0aGlzLmJ1aWxkQWxsb3dzRXh0ZW5zaW9uc0NoZWNrQm94KGNvbXBvc2l0ZSwgdGhpcy5idWlsZEFsbG93c0V4dGVuc2lvbnNTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotCQkJLy8gQ2xhc3NwYXRoCi0JCQlMYWJlbCBjbGFzc3BhdGhMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWNsYXNzcGF0aExhYmVsLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlX2NsYXNzcGF0aCk7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSA1OwotCQkJY2xhc3NwYXRoTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQl0aGlzLmNsYXNzcGF0aFRleHQgPSB0aGlzLmJ1aWxkQ2xhc3NwYXRoVGV4dChjb21wb3NpdGUpOwotCQkJCi0JCQlMYWJlbCBhZGRpdGlvbmFsQXJnc0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJYWRkaXRpb25hbEFyZ3NMYWJlbC5zZXRUZXh0KEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zV2l6YXJkUGFnZV9hZGRpdGlvbmFsQXJndW1lbnRzKTsKLQkJCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDU7Ci0JCQlhZGRpdGlvbmFsQXJnc0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJdGhpcy5hZGRpdGlvbmFsQXJnc1RleHQgPSB0aGlzLmJ1aWxkQWRkaXRpb25hbEFyZ3NUZXh0KGNvbXBvc2l0ZSk7Ci0JCX0KLQkJCi0JCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0JCQotCQlwcml2YXRlIEJ1dHRvbiBidWlsZEFsbG93c0V4dGVuc2lvbnNDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSA1OwotCQkJY2hlY2tCb3guc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQljaGVja0JveC5zZXRUZXh0KEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zV2l6YXJkUGFnZV9hbGxvd0V4dGVuc2lvbnMpOwotCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMuYWxsb3dzRXh0ZW5zaW9ucygpKTsKLQkJCWNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXJldHVybiBjaGVja0JveDsKLQkJfQotCi0JCXByaXZhdGUgVGV4dCBidWlsZENsYXNzcGF0aFRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDE7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiAzOwotCQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCQl0ZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQotCQlwcml2YXRlIFRleHQgYnVpbGRBZGRpdGlvbmFsQXJnc1RleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDE7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiAxMDsKLQkJCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRBbGxvd3NFeHRlbnNpb25zU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJRXh0ZW5zaW9uT3B0aW9uc0NvbXBvc2l0ZS50aGlzLnNldEFsbG93c0V4dGVuc2lvbnMoCi0JCQkJCQlFeHRlbnNpb25PcHRpb25zQ29tcG9zaXRlLnRoaXMuYWxsb3dzRXh0ZW5zaW9uc0NoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd3NFeHRlbnNpb25zKCkgewotCQkJcmV0dXJuIHRoaXMuYWxsb3dzRXh0ZW5zaW9uczsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0QWxsb3dzRXh0ZW5zaW9ucyhib29sZWFuIGFsbG93c0V4dGVuc2lvbnMpewotCQkJdGhpcy5hbGxvd3NFeHRlbnNpb25zID0gYWxsb3dzRXh0ZW5zaW9uczsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NwYXRoKCkgewotCQkJcmV0dXJuIHRoaXMuY2xhc3NwYXRoVGV4dC5nZXRUZXh0KCk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkaXRpb25hbEFyZ3MoKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRpdGlvbmFsQXJnc1RleHQuZ2V0VGV4dCgpOwotCQl9Ci0JCQotCX0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL0NsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDQwZTBlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL0NsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLmNsYXNzZXNnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiAgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi17Ci0JcHJpdmF0ZSBQcm94eU9wdGlvbnNDb21wb3NpdGUgcHJveHlPcHRpb25zQ29tcG9zaXRlOwotCXByaXZhdGUgT3B0aW9uczFDb21wb3NpdGUgb3B0aW9uczFDb21wb3NpdGU7Ci0JcHJpdmF0ZSBPcHRpb25zMkNvbXBvc2l0ZSBvcHRpb25zMkNvbXBvc2l0ZTsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJDbGFzc2VzIEdlbmVyYXRvciBPcHRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLnNldFRpdGxlKEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXRoaXMuc2V0RGVzY3JpcHRpb24oSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX2Rlc2MpOwotCX0KLQkJCi0JLy8gKioqKioqKioqKiBVSSBjb21wb25lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJdGhpcy5zZXRDb250cm9sKHRoaXMuYnVpbGRUb3BMZXZlbENvbnRyb2wocGFyZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVG9wTGV2ZWxDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJdGhpcy5wcm94eU9wdGlvbnNDb21wb3NpdGUgPSBuZXcgUHJveHlPcHRpb25zQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0KLQkJdGhpcy5idWlsZE9wdGlvbnNDb21wb3NpdGVzKGNvbXBvc2l0ZSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRPcHRpb25zQ29tcG9zaXRlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQkKLQkJdGhpcy5vcHRpb25zMUNvbXBvc2l0ZSA9IG5ldyBPcHRpb25zMUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCi0JCXRoaXMub3B0aW9uczJDb21wb3NpdGUgPSBuZXcgT3B0aW9uczJDb21wb3NpdGUoY29tcG9zaXRlKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJveHkoKSB7Ci0JCXJldHVybiB0aGlzLnByb3h5T3B0aW9uc0NvbXBvc2l0ZS5nZXRQcm94eSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJveHlGaWxlKCkgewotCQlyZXR1cm4gdGhpcy5wcm94eU9wdGlvbnNDb21wb3NpdGUuZ2V0UHJveHlGaWxlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHVzZXNTdHJpY3RWYWxpZGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zMUNvbXBvc2l0ZS51c2VzU3RyaWN0VmFsaWRhdGlvbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYWtlc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zMUNvbXBvc2l0ZS5tYWtlc1JlYWRPbmx5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zMUNvbXBvc2l0ZS5zdXBwcmVzc2VzUGFja2FnZUluZm9HZW4oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcHJlc3Nlc0hlYWRlckdlbigpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uczFDb21wb3NpdGUuc3VwcHJlc3Nlc0hlYWRlckdlbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnMxQ29tcG9zaXRlLnRhcmdldElzMjAoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWZXJib3NlKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zMUNvbXBvc2l0ZS5pc1ZlcmJvc2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNRdWlldCgpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uczFDb21wb3NpdGUuaXNRdWlldCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHRyZWF0c0FzWG1sU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zMkNvbXBvc2l0ZS50cmVhdHNBc1htbFNjaGVtYSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmVhdHNBc1JlbGF4TmcoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnMyQ29tcG9zaXRlLnRyZWF0c0FzUmVsYXhOZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmVhdHNBc1JlbGF4TmdDb21wYWN0KCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zMkNvbXBvc2l0ZS50cmVhdHNBc1JlbGF4TmdDb21wYWN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHRyZWF0c0FzRHRkKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zMkNvbXBvc2l0ZS50cmVhdHNBc0R0ZCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmVhdHNBc1dzZGwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnMyQ29tcG9zaXRlLnRyZWF0c0FzV3NkbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93c1ZlcnNpb24oKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnMyQ29tcG9zaXRlLnNob3dzVmVyc2lvbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93c0hlbHAoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnMyQ29tcG9zaXRlLnNob3dzSGVscCgpOwotCX0KLQotCS8vICoqKioqKioqKiogVUkgY29udHJvbHMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBCdXR0b24gYnVpbGRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIsIGludCB2ZXJ0aWNhbEluZGVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQ9IHZlcnRpY2FsSW5kZW50OwotCQljaGVja0JveC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJY2hlY2tCb3guc2V0VGV4dCh0ZXh0KTsKLQkJY2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBidWlsZFJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUJ1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQlyYWRpb0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmFkaW9CdXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJcmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlyZXR1cm4gcmFkaW9CdXR0b247Ci0JfQotCi0JcHJvdGVjdGVkIFRleHQgYnVpbGRUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzYWJsZVRleHQoVGV4dCB0ZXh0KSB7Ci0JCXRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgU3RyaW5nIG1ha2VSZWxhdGl2ZVRvUHJvamVjdFBhdGgoU3RyaW5nIGZpbGVQYXRoKSB7Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGZpbGVQYXRoKTsKLQkJSVBhdGggcmVsYXRpdmVQYXRoID0gcGF0aC5tYWtlUmVsYXRpdmVUbyh0aGlzLmdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpKTsKLQkJcmV0dXJuIHJlbGF0aXZlUGF0aC50b09TU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gKChDbGFzc2VzR2VuZXJhdG9yV2l6YXJkKXRoaXMuZ2V0V2l6YXJkKCkpLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCX0KLQotCS8vICoqKioqKioqKiogUHJveHlPcHRpb25zQ29tcG9zaXRlICoqKioqKioqKioKLQotCWNsYXNzIFByb3h5T3B0aW9uc0NvbXBvc2l0ZSB7Ci0JCQotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBub1Byb3h5UmFkaW9CdXR0b247Ci0JCQotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBwcm94eVJhZGlvQnV0dG9uOwotCQlwcml2YXRlIGZpbmFsIFRleHQgcHJveHlUZXh0OwotCi0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHByb3h5RmlsZVJhZGlvQnV0dG9uOwotCQlwcml2YXRlIGZpbmFsIFRleHQgcHJveHlGaWxlVGV4dDsKLQkJcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotCQkKLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkJcHJpdmF0ZSBQcm94eU9wdGlvbnNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIoKTsKLQkJCUdyb3VwIHByb3h5R3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJCXByb3h5R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlwcm94eUdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJcHJveHlHcm91cC5zZXRUZXh0KEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9wcm94eUdyb3VwKTsKLQotCQkJU2VsZWN0aW9uTGlzdGVuZXIgcHJveHlCdXR0b25MaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm94eVJhZGlvQnV0dG9uTGlzdGVuZXIoKTsKLQotCQkJdGhpcy5ub1Byb3h5UmFkaW9CdXR0b24gPSBidWlsZFJhZGlvQnV0dG9uKHByb3h5R3JvdXAsIAotCQkJCQkJCQkJSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX25vUHJveHksIHByb3h5QnV0dG9uTGlzdGVuZXIsIDMpOwotCQkJCi0JCQl0aGlzLnByb3h5UmFkaW9CdXR0b24gPSBidWlsZFJhZGlvQnV0dG9uKHByb3h5R3JvdXAsIAotCQkJCQkJCQkJSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3Byb3h5LCBwcm94eUJ1dHRvbkxpc3RlbmVyLCAxKTsKLQkJCXRoaXMucHJveHlUZXh0ID0gYnVpbGRUZXh0KHByb3h5R3JvdXAsIDEpOwotCQkJbmV3IExhYmVsKHByb3h5R3JvdXAsIFNXVC5XUkFQKTsgLy9lbXB0eSBsYWJlbCBmb3Igc3BhY2luZwotCi0JCQl0aGlzLnByb3h5RmlsZVJhZGlvQnV0dG9uID0gYnVpbGRSYWRpb0J1dHRvbihwcm94eUdyb3VwLCAKLQkJCQkJCQkJCUpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9wcm94eUZpbGUsIHByb3h5QnV0dG9uTGlzdGVuZXIsIDEpOwotCQkJdGhpcy5wcm94eUZpbGVUZXh0ID0gYnVpbGRUZXh0KHByb3h5R3JvdXAsIDEpOwotCQkJdGhpcy5icm93c2VCdXR0b24gPSB0aGlzLmJ1aWxkQnJvd3NlQnV0dG9uKHByb3h5R3JvdXApOwotCQkJCi0JCQl0aGlzLm5vUHJveHlSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl0aGlzLnByb3h5QnV0dG9uQ2hhbmdlZCgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBCdXR0b24gYnVpbGRCcm93c2VCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlHcmlkTGF5b3V0IGJ1dHRvbkxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uTGF5b3V0KTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkJLy8gQnJvd3NlIGJ1dHRvbnMKLQkJCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJYnJvd3NlQnV0dG9uLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfYnJvd3NlQnV0dG9uKTsKLQkJCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotCQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLQkJCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQotCQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQotCQkJCQlTdHJpbmcgZmlsZVBhdGggPSBwcm9tcHRQcm94eUZpbGUoKTsKLQkJCQkJaWYgKCAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZmlsZVBhdGgpKSB7Ci0JCQkJCQlQcm94eU9wdGlvbnNDb21wb3NpdGUudGhpcy5wcm94eUZpbGVUZXh0LnNldFRleHQobWFrZVJlbGF0aXZlVG9Qcm9qZWN0UGF0aChmaWxlUGF0aCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQlyZXR1cm4gYnJvd3NlQnV0dG9uOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCQkKLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFByb3h5UmFkaW9CdXR0b25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlwcm94eUJ1dHRvbkNoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb3h5QnV0dG9uQ2hhbmdlZCgpIHsKLQkJCWJvb2xlYW4gdXNlc1Byb3h5ID0gISB0aGlzLm5vUHJveHlSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmICh1c2VzUHJveHkpIHsKLQkJCQlpZiAodGhpcy5wcm94eVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCXRoaXMucHJveHlUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWRpc2FibGVUZXh0KHRoaXMucHJveHlGaWxlVGV4dCk7Ci0JCQkJCXRoaXMuYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0aGlzLnByb3h5RmlsZVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCXRoaXMucHJveHlGaWxlVGV4dC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl0aGlzLmJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQlkaXNhYmxlVGV4dCh0aGlzLnByb3h5VGV4dCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZGlzYWJsZVRleHQodGhpcy5wcm94eVRleHQpOwotCQkJCWRpc2FibGVUZXh0KHRoaXMucHJveHlGaWxlVGV4dCk7Ci0JCQkJdGhpcy5icm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCQkvKioKLQkJICogVGhlIEFkZCBidXR0b24gd2FzIGNsaWNrZWQsIGl0cyBhY3Rpb24gaW52b2tlcyB0aGlzIGFjdGlvbiB3aGljaCBzaG91bGQKLQkJICogcHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhIGZpbGUgYW5kIHJldHVybiBpdC4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIHByb21wdFByb3h5RmlsZSgpIHsKLQkJCUlXaXphcmQgd2l6YXJkID0gQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlLnRoaXMuZ2V0V2l6YXJkKCk7Ci0JCQlTdHJpbmcgcHJvamVjdFBhdGggPSAoKENsYXNzZXNHZW5lcmF0b3JXaXphcmQpd2l6YXJkKS5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0KLQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQlkaWFsb2cuc2V0VGV4dChKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfY2hvb3NlQVByb3h5RmlsZSk7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChwcm9qZWN0UGF0aCk7Ci0KLQkJCXJldHVybiBkaWFsb2cub3BlbigpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBpbnRyYS13aXphcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRQcm94eSgpIHsKLQkJCXJldHVybiB0aGlzLnByb3h5VGV4dC5nZXRUZXh0KCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3h5RmlsZSgpIHsKLQkJCXJldHVybiB0aGlzLnByb3h5RmlsZVRleHQuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBPcHRpb25zMUNvbXBvc2l0ZSAqKioqKioqKioqCi0KLQljbGFzcyBPcHRpb25zMUNvbXBvc2l0ZSB7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHVzZXNTdHJpY3RWYWxpZGF0aW9uOwotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiB1c2VzU3RyaWN0VmFsaWRhdGlvbkNoZWNrQm94OwotCi0JCXByaXZhdGUgYm9vbGVhbiBtYWtlc1JlYWRPbmx5OwotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBtYWtlc1JlYWRPbmx5Q2hlY2tCb3g7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuOwotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBzdXBwcmVzc2VzUGFja2FnZUluZm9HZW5DaGVja0JveDsKLQotCQlwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3Nlc0hlYWRlckdlbjsKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gc3VwcHJlc3Nlc0hlYWRlckdlbkNoZWNrQm94OwotCi0JCXByaXZhdGUgYm9vbGVhbiB0YXJnZXQ7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHRhcmdldENoZWNrQm94OwotCi0JCXByaXZhdGUgYm9vbGVhbiBpc1ZlcmJvc2U7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGlzVmVyYm9zZUNoZWNrQm94OwotCi0JCXByaXZhdGUgYm9vbGVhbiBpc1F1aWV0OwotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBpc1F1aWV0Q2hlY2tCb3g7Ci0JCQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCQlPcHRpb25zMUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy51c2VzU3RyaWN0VmFsaWRhdGlvbiA9IHRydWU7Ci0JCQl0aGlzLm1ha2VzUmVhZE9ubHkgPSBmYWxzZTsKLQkJCXRoaXMuc3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuID0gZmFsc2U7Ci0JCQl0aGlzLnN1cHByZXNzZXNIZWFkZXJHZW4gPSBmYWxzZTsKLQkJCXRoaXMudGFyZ2V0ID0gZmFsc2U7Ci0JCQl0aGlzLmlzVmVyYm9zZSA9IGZhbHNlOwotCQkJdGhpcy5pc1F1aWV0ID0gZmFsc2U7Ci0KLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCQotCQkJdGhpcy51c2VzU3RyaWN0VmFsaWRhdGlvbkNoZWNrQm94ID0gdGhpcy5idWlsZFVzZXNTdHJpY3RWYWxpZGF0aW9uQ2hlY2tCb3goY29tcG9zaXRlLCB0aGlzLmJ1aWxkVXNlc1N0cmljdFZhbGlkYXRpb25TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCXRoaXMubWFrZXNSZWFkT25seUNoZWNrQm94ID0gdGhpcy5idWlsZE1ha2VzUmVhZE9ubHlDaGVja0JveChjb21wb3NpdGUsIHRoaXMuYnVpbGRNYWtlc1JlYWRPbmx5U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQl0aGlzLnN1cHByZXNzZXNQYWNrYWdlSW5mb0dlbkNoZWNrQm94ID0gdGhpcy5idWlsZFN1cHByZXNzZXNQYWNrYWdlSW5mb0dlbkNoZWNrQm94KGNvbXBvc2l0ZSwgdGhpcy5idWlsZFN1cHByZXNzZXNQYWNrYWdlSW5mb0dlblNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJdGhpcy5zdXBwcmVzc2VzSGVhZGVyR2VuQ2hlY2tCb3ggPSB0aGlzLmJ1aWxkU3VwcHJlc3Nlc0hlYWRlckdlbkNoZWNrQm94KGNvbXBvc2l0ZSwgdGhpcy5idWlsZFN1cHByZXNzZXNIZWFkZXJHZW5TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCXRoaXMudGFyZ2V0Q2hlY2tCb3ggPSB0aGlzLmJ1aWxkVGFyZ2V0Q2hlY2tCb3goY29tcG9zaXRlLCB0aGlzLmJ1aWxkVGFyZ2V0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQl0aGlzLmlzVmVyYm9zZUNoZWNrQm94ID0gdGhpcy5idWlsZElzVmVyYm9zZUNoZWNrQm94KGNvbXBvc2l0ZSwgdGhpcy5idWlsZElzVmVyYm9zZVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJdGhpcy5pc1F1aWV0Q2hlY2tCb3ggPSB0aGlzLmJ1aWxkSXNRdWlldENoZWNrQm94KGNvbXBvc2l0ZSwgdGhpcy5idWlsZElzUXVpZXRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0KLQkJcHJpdmF0ZSBCdXR0b24gYnVpbGRVc2VzU3RyaWN0VmFsaWRhdGlvbkNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlCdXR0b24gY2hlY2tCb3ggPSBidWlsZENoZWNrQm94KHBhcmVudCwgSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3VzZVN0cmljdFZhbGlkYXRpb24sIGxpc3RlbmVyLCA1KTsKLQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLnVzZXNTdHJpY3RWYWxpZGF0aW9uKCkpOwotCQkJcmV0dXJuIGNoZWNrQm94OwotCQl9Ci0KLQkJcHJpdmF0ZSBCdXR0b24gYnVpbGRNYWtlc1JlYWRPbmx5Q2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCUJ1dHRvbiBjaGVja0JveCA9IGJ1aWxkQ2hlY2tCb3gocGFyZW50LCBKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfbWFrZVJlYWRPbmx5LCBsaXN0ZW5lciwgNSk7Ci0JCQljaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy5tYWtlc1JlYWRPbmx5KCkpOwotCQkJcmV0dXJuIGNoZWNrQm94OwotCQl9Ci0KLQkJcHJpdmF0ZSBCdXR0b24gYnVpbGRTdXBwcmVzc2VzUGFja2FnZUluZm9HZW5DaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQnV0dG9uIGNoZWNrQm94ID0gYnVpbGRDaGVja0JveChwYXJlbnQsIEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9zdXBwcmVzc1BhY2thZ2VJbmZvR2VuLCBsaXN0ZW5lciwgNSk7Ci0JCQljaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy5zdXBwcmVzc2VzUGFja2FnZUluZm9HZW4oKSk7Ci0JCQlyZXR1cm4gY2hlY2tCb3g7Ci0JCX0KLQkJCi0JCXByaXZhdGUgQnV0dG9uIGJ1aWxkU3VwcHJlc3Nlc0hlYWRlckdlbkNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlCdXR0b24gY2hlY2tCb3ggPSBidWlsZENoZWNrQm94KHBhcmVudCwgSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3N1cHByZXNzZXNIZWFkZXJHZW4sIGxpc3RlbmVyLCA1KTsKLQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLnN1cHByZXNzZXNIZWFkZXJHZW4oKSk7Ci0JCQlyZXR1cm4gY2hlY2tCb3g7Ci0JCX0KLQkJCi0JCXByaXZhdGUgQnV0dG9uIGJ1aWxkVGFyZ2V0Q2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCUJ1dHRvbiBjaGVja0JveCA9IGJ1aWxkQ2hlY2tCb3gocGFyZW50LCBKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdGFyZ2V0LCBsaXN0ZW5lciwgNSk7Ci0JCQljaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy50YXJnZXRJczIwKCkpOwotCQkJcmV0dXJuIGNoZWNrQm94OwotCQl9Ci0JCi0JCXByaXZhdGUgQnV0dG9uIGJ1aWxkSXNWZXJib3NlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCUJ1dHRvbiBjaGVja0JveCA9IGJ1aWxkQ2hlY2tCb3gocGFyZW50LCBKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdmVyYm9zZSwgbGlzdGVuZXIsIDUpOwotCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMuaXNWZXJib3NlKCkpOwotCQkJcmV0dXJuIGNoZWNrQm94OwotCQl9Ci0JCQotCQlwcml2YXRlIEJ1dHRvbiBidWlsZElzUXVpZXRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQnV0dG9uIGNoZWNrQm94ID0gYnVpbGRDaGVja0JveChwYXJlbnQsIEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9xdWlldCwgbGlzdGVuZXIsIDUpOwotCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMuaXNRdWlldCgpKTsKLQkJCXJldHVybiBjaGVja0JveDsKLQkJfQotCi0JCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQkJCi0JCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRVc2VzU3RyaWN0VmFsaWRhdGlvblNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9wdGlvbnMxQ29tcG9zaXRlLnRoaXMuc2V0VXNlc1N0cmljdFZhbGlkYXRpb24oCi0JCQkJCQlPcHRpb25zMUNvbXBvc2l0ZS50aGlzLnVzZXNTdHJpY3RWYWxpZGF0aW9uQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkTWFrZXNSZWFkT25seVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9wdGlvbnMxQ29tcG9zaXRlLnRoaXMuc2V0TWFrZXNSZWFkT25seSgKLQkJCQkJCU9wdGlvbnMxQ29tcG9zaXRlLnRoaXMubWFrZXNSZWFkT25seUNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJT3B0aW9uczFDb21wb3NpdGUudGhpcy5zZXRTdXBwcmVzc2VzUGFja2FnZUluZm9HZW4oCi0JCQkJCQlPcHRpb25zMUNvbXBvc2l0ZS50aGlzLnN1cHByZXNzZXNQYWNrYWdlSW5mb0dlbkNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU3VwcHJlc3Nlc0hlYWRlckdlblNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9wdGlvbnMxQ29tcG9zaXRlLnRoaXMuc2V0U3VwcHJlc3Nlc0hlYWRlckdlbigKLQkJCQkJCU9wdGlvbnMxQ29tcG9zaXRlLnRoaXMuc3VwcHJlc3Nlc0hlYWRlckdlbkNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVGFyZ2V0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJT3B0aW9uczFDb21wb3NpdGUudGhpcy5zZXRUYXJnZXRJczIwKAotCQkJCQkJT3B0aW9uczFDb21wb3NpdGUudGhpcy50YXJnZXRDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZElzVmVyYm9zZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9wdGlvbnMxQ29tcG9zaXRlLnRoaXMuc2V0SXNWZXJib3NlKAotCQkJCQkJT3B0aW9uczFDb21wb3NpdGUudGhpcy5pc1ZlcmJvc2VDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZElzUXVpZXRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlPcHRpb25zMUNvbXBvc2l0ZS50aGlzLnNldElzUXVpZXQoCi0JCQkJCQlPcHRpb25zMUNvbXBvc2l0ZS50aGlzLmlzUXVpZXRDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogZ2V0dGVycy9zZXR0ZXJzICoqKioqKioqKgotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlc1N0cmljdFZhbGlkYXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy51c2VzU3RyaWN0VmFsaWRhdGlvbjsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlc1N0cmljdFZhbGlkYXRpb24oYm9vbGVhbiB1c2VzU3RyaWN0VmFsaWRhdGlvbil7Ci0JCQl0aGlzLnVzZXNTdHJpY3RWYWxpZGF0aW9uID0gdXNlc1N0cmljdFZhbGlkYXRpb247Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBib29sZWFuIG1ha2VzUmVhZE9ubHkoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYWtlc1JlYWRPbmx5OwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRNYWtlc1JlYWRPbmx5KGJvb2xlYW4gbWFrZXNSZWFkT25seSl7Ci0JCQl0aGlzLm1ha2VzUmVhZE9ubHkgPSBtYWtlc1JlYWRPbmx5OwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwcmVzc2VzUGFja2FnZUluZm9HZW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdXBwcmVzc2VzUGFja2FnZUluZm9HZW47Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFN1cHByZXNzZXNQYWNrYWdlSW5mb0dlbihib29sZWFuIHN1cHByZXNzZXNQYWNrYWdlSW5mb0dlbil7Ci0JCQl0aGlzLnN1cHByZXNzZXNQYWNrYWdlSW5mb0dlbiA9IHN1cHByZXNzZXNQYWNrYWdlSW5mb0dlbjsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gc3VwcHJlc3Nlc0hlYWRlckdlbigpIHsKLQkJCXJldHVybiB0aGlzLnN1cHByZXNzZXNIZWFkZXJHZW47Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFN1cHByZXNzZXNIZWFkZXJHZW4oYm9vbGVhbiBzdXBwcmVzc2VzSGVhZGVyR2VuKXsKLQkJCXRoaXMuc3VwcHJlc3Nlc0hlYWRlckdlbiA9IHN1cHByZXNzZXNIZWFkZXJHZW47Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBib29sZWFuIHRhcmdldElzMjAoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXJnZXQ7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldElzMjAoYm9vbGVhbiB0YXJnZXRJczIwKXsKLQkJCXRoaXMudGFyZ2V0ID0gdGFyZ2V0SXMyMDsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNWZXJib3NlKCkgewotCQkJcmV0dXJuIHRoaXMuaXNWZXJib3NlOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRJc1ZlcmJvc2UoYm9vbGVhbiBpc1ZlcmJvc2UpewotCQkJdGhpcy5pc1ZlcmJvc2UgPSBpc1ZlcmJvc2U7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBib29sZWFuIGlzUXVpZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pc1F1aWV0OwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRJc1F1aWV0KGJvb2xlYW4gaXNRdWlldCl7Ci0JCQl0aGlzLmlzUXVpZXQgPSBpc1F1aWV0OwotCQl9Ci0KLQl9Ci0KLQkvLyAqKioqKioqKioqIE9wdGlvbnMyQ29tcG9zaXRlICoqKioqKioqKioKLQotCWNsYXNzIE9wdGlvbnMyQ29tcG9zaXRlIHsKLQotCQlwcml2YXRlIGJvb2xlYW4gdHJlYXRzQXNYbWxTY2hlbWE7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHRyZWF0c0FzWG1sU2NoZW1hQ2hlY2tCb3g7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHRyZWF0c0FzUmVsYXhOZzsKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gdHJlYXRzQXNSZWxheE5nQ2hlY2tCb3g7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHRyZWF0c0FzUmVsYXhOZ0NvbXBhY3Q7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHRyZWF0c0FzUmVsYXhOZ0NvbXBhY3RDaGVja0JveDsKLQotCQlwcml2YXRlIGJvb2xlYW4gdHJlYXRzQXNEdGQ7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHRyZWF0c0FzRHRkQ2hlY2tCb3g7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHRyZWF0c0FzV3NkbDsKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gdHJlYXRzQXNXc2RsQ2hlY2tCb3g7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHNob3dzVmVyc2lvbjsKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gc2hvd3NWZXJzaW9uQ2hlY2tCb3g7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHNob3dzSGVscDsKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gc2hvd3NIZWxwQ2hlY2tCb3g7Ci0JCQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCQlPcHRpb25zMkNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50cmVhdHNBc1htbFNjaGVtYSA9IGZhbHNlOwotCQkJdGhpcy50cmVhdHNBc1JlbGF4TmcgPSBmYWxzZTsKLQkJCXRoaXMudHJlYXRzQXNSZWxheE5nQ29tcGFjdCA9IGZhbHNlOwotCQkJdGhpcy50cmVhdHNBc0R0ZCA9IGZhbHNlOwotCQkJdGhpcy50cmVhdHNBc1dzZGwgPSBmYWxzZTsKLQkJCXRoaXMuc2hvd3NWZXJzaW9uID0gZmFsc2U7Ci0JCQl0aGlzLnNob3dzSGVscCA9IGZhbHNlOwotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJCXRoaXMudHJlYXRzQXNYbWxTY2hlbWFDaGVja0JveCA9IHRoaXMuYnVpbGRUcmVhdHNBc1htbFNjaGVtYUNoZWNrQm94KGNvbXBvc2l0ZSwgdGhpcy5idWlsZFRyZWF0c0FzWG1sU2NoZW1hU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQl0aGlzLnRyZWF0c0FzUmVsYXhOZ0NoZWNrQm94ID0gdGhpcy5idWlsZFRyZWF0c0FzUmVsYXhOZ0NoZWNrQm94KGNvbXBvc2l0ZSwgdGhpcy5idWlsZFRyZWF0c0FzUmVsYXhOZ1NlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJdGhpcy50cmVhdHNBc1JlbGF4TmdDb21wYWN0Q2hlY2tCb3ggPSB0aGlzLmJ1aWxkVHJlYXRzQXNSZWxheE5nQ29tcGFjdENoZWNrQm94KGNvbXBvc2l0ZSwgdGhpcy5idWlsZFRyZWF0c0FzUmVsYXhOZ0NvbXBhY3RTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCXRoaXMudHJlYXRzQXNEdGRDaGVja0JveCA9IHRoaXMuYnVpbGRUcmVhdHNBc0R0ZENoZWNrQm94KGNvbXBvc2l0ZSwgdGhpcy5idWlsZFRyZWF0c0FzRHRkU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQl0aGlzLnRyZWF0c0FzV3NkbENoZWNrQm94ID0gdGhpcy5idWlsZFRyZWF0c0FzV3NkbENoZWNrQm94KGNvbXBvc2l0ZSwgdGhpcy5idWlsZFRyZWF0c0FzV3NkbFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJdGhpcy5zaG93c1ZlcnNpb25DaGVja0JveCA9IHRoaXMuYnVpbGRWZXJzaW9uQ2hlY2tCb3goY29tcG9zaXRlLCB0aGlzLmJ1aWxkVmVyc2lvblNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJdGhpcy5zaG93c0hlbHBDaGVja0JveCA9IHRoaXMuYnVpbGRIZWxwQ2hlY2tCb3goY29tcG9zaXRlLCB0aGlzLmJ1aWxkSGVscFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBVSSBjb21wb25lbnRzICoqKioqKioqKioKLQkJCi0JCXByaXZhdGUgQnV0dG9uIGJ1aWxkVHJlYXRzQXNYbWxTY2hlbWFDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQnV0dG9uIGNoZWNrQm94ID0gYnVpbGRDaGVja0JveChwYXJlbnQsIEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV90cmVhdHNBc1htbFNjaGVtYSwgbGlzdGVuZXIsIDUpOwotCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMudHJlYXRzQXNYbWxTY2hlbWEoKSk7Ci0JCQlyZXR1cm4gY2hlY2tCb3g7Ci0JCX0KLQotCQlwcml2YXRlIEJ1dHRvbiBidWlsZFRyZWF0c0FzUmVsYXhOZ0NoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlCdXR0b24gY2hlY2tCb3ggPSBidWlsZENoZWNrQm94KHBhcmVudCwgSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3RyZWF0c0FzUmVsYXhOZywgbGlzdGVuZXIsIDUpOwotCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMudHJlYXRzQXNSZWxheE5nKCkpOwotCQkJcmV0dXJuIGNoZWNrQm94OwotCQl9Ci0JCXByaXZhdGUgQnV0dG9uIGJ1aWxkVHJlYXRzQXNSZWxheE5nQ29tcGFjdENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlCdXR0b24gY2hlY2tCb3ggPSBidWlsZENoZWNrQm94KHBhcmVudCwgSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3RyZWF0c0FzUmVsYXhOZ0NvbXBhY3QsIGxpc3RlbmVyLCA1KTsKLQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLnRyZWF0c0FzUmVsYXhOZ0NvbXBhY3QoKSk7Ci0JCQlyZXR1cm4gY2hlY2tCb3g7Ci0JCX0KLQotCQlwcml2YXRlIEJ1dHRvbiBidWlsZFRyZWF0c0FzRHRkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCUJ1dHRvbiBjaGVja0JveCA9IGJ1aWxkQ2hlY2tCb3gocGFyZW50LCBKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdHJlYXRzQXNEdGQsIGxpc3RlbmVyLCA1KTsKLQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLnRyZWF0c0FzRHRkKCkpOwotCQkJcmV0dXJuIGNoZWNrQm94OwotCQl9Ci0KLQkJcHJpdmF0ZSBCdXR0b24gYnVpbGRUcmVhdHNBc1dzZGxDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQnV0dG9uIGNoZWNrQm94ID0gYnVpbGRDaGVja0JveChwYXJlbnQsIEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV90cmVhdHNBc1dzZGwsIGxpc3RlbmVyLCA1KTsKLQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLnRyZWF0c0FzV3NkbCgpKTsKLQkJCXJldHVybiBjaGVja0JveDsKLQkJfQotCQotCQlwcml2YXRlIEJ1dHRvbiBidWlsZFZlcnNpb25DaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQnV0dG9uIGNoZWNrQm94ID0gYnVpbGRDaGVja0JveChwYXJlbnQsIEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9zaG93c1ZlcnNpb24sIGxpc3RlbmVyLCA1KTsKLQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLnNob3dzVmVyc2lvbigpKTsKLQkJCXJldHVybiBjaGVja0JveDsKLQkJfQotCQotCQlwcml2YXRlIEJ1dHRvbiBidWlsZEhlbHBDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQnV0dG9uIGNoZWNrQm94ID0gYnVpbGRDaGVja0JveChwYXJlbnQsIEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9zaG93c0hlbHAsIGxpc3RlbmVyLCA1KTsKLQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLnNob3dzSGVscCgpKTsKLQkJCXJldHVybiBjaGVja0JveDsKLQkJfQotCQkKLQkJLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRUcmVhdHNBc1htbFNjaGVtYVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9wdGlvbnMyQ29tcG9zaXRlLnRoaXMuc2V0VHJlYXRzQXNYbWxTY2hlbWEoCi0JCQkJCQlPcHRpb25zMkNvbXBvc2l0ZS50aGlzLnRyZWF0c0FzWG1sU2NoZW1hQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVHJlYXRzQXNSZWxheE5nU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJT3B0aW9uczJDb21wb3NpdGUudGhpcy5zZXRUcmVhdHNBc1JlbGF4TmcoCi0JCQkJCQlPcHRpb25zMkNvbXBvc2l0ZS50aGlzLnRyZWF0c0FzUmVsYXhOZ0NoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVHJlYXRzQXNSZWxheE5nQ29tcGFjdFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9wdGlvbnMyQ29tcG9zaXRlLnRoaXMuc2V0VHJlYXRzQXNSZWxheE5nQ29tcGFjdCgKLQkJCQkJCU9wdGlvbnMyQ29tcG9zaXRlLnRoaXMudHJlYXRzQXNSZWxheE5nQ29tcGFjdENoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVHJlYXRzQXNEdGRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlPcHRpb25zMkNvbXBvc2l0ZS50aGlzLnNldFRyZWF0c0FzRHRkKAotCQkJCQkJT3B0aW9uczJDb21wb3NpdGUudGhpcy50cmVhdHNBc0R0ZENoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVHJlYXRzQXNXc2RsU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJT3B0aW9uczJDb21wb3NpdGUudGhpcy5zZXRUcmVhdHNBc1dzZGwoCi0JCQkJCQlPcHRpb25zMkNvbXBvc2l0ZS50aGlzLnRyZWF0c0FzV3NkbENoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVmVyc2lvblNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9wdGlvbnMyQ29tcG9zaXRlLnRoaXMuc2V0U2hvd3NWZXJzaW9uKAotCQkJCQkJT3B0aW9uczJDb21wb3NpdGUudGhpcy5zaG93c1ZlcnNpb25DaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZEhlbHBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlPcHRpb25zMkNvbXBvc2l0ZS50aGlzLnNldFNob3dzSGVscCgKLQkJCQkJCU9wdGlvbnMyQ29tcG9zaXRlLnRoaXMuc2hvd3NIZWxwQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGdldHRlci9zZXR0ZXIgKioqKioqKioqCi0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdHJlYXRzQXNYbWxTY2hlbWEoKSB7Ci0JCQlyZXR1cm4gdGhpcy50cmVhdHNBc1htbFNjaGVtYTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VHJlYXRzQXNYbWxTY2hlbWEoYm9vbGVhbiB0cmVhdHNBc1htbFNjaGVtYSl7Ci0JCQl0aGlzLnRyZWF0c0FzWG1sU2NoZW1hID0gdHJlYXRzQXNYbWxTY2hlbWE7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBib29sZWFuIHRyZWF0c0FzUmVsYXhOZygpIHsKLQkJCXJldHVybiB0aGlzLnRyZWF0c0FzUmVsYXhOZzsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VHJlYXRzQXNSZWxheE5nKGJvb2xlYW4gdHJlYXRzQXNSZWxheE5nKXsKLQkJCXRoaXMudHJlYXRzQXNSZWxheE5nID0gdHJlYXRzQXNSZWxheE5nOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmVhdHNBc1JlbGF4TmdDb21wYWN0KCkgewotCQkJcmV0dXJuIHRoaXMudHJlYXRzQXNSZWxheE5nQ29tcGFjdDsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VHJlYXRzQXNSZWxheE5nQ29tcGFjdChib29sZWFuIHRyZWF0c0FzUmVsYXhOZ0NvbXBhY3QpewotCQkJdGhpcy50cmVhdHNBc1JlbGF4TmdDb21wYWN0ID0gdHJlYXRzQXNSZWxheE5nQ29tcGFjdDsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gdHJlYXRzQXNEdGQoKSB7Ci0JCQlyZXR1cm4gdGhpcy50cmVhdHNBc0R0ZDsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VHJlYXRzQXNEdGQoYm9vbGVhbiB0cmVhdHNBc0R0ZCl7Ci0JCQl0aGlzLnRyZWF0c0FzRHRkID0gdHJlYXRzQXNEdGQ7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBib29sZWFuIHRyZWF0c0FzV3NkbCgpIHsKLQkJCXJldHVybiB0aGlzLnRyZWF0c0FzV3NkbDsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VHJlYXRzQXNXc2RsKGJvb2xlYW4gdHJlYXRzQXNXc2RsKXsKLQkJCXRoaXMudHJlYXRzQXNXc2RsID0gdHJlYXRzQXNXc2RsOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93c1ZlcnNpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zaG93c1ZlcnNpb247Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFNob3dzVmVyc2lvbihib29sZWFuIHNob3dzVmVyc2lvbil7Ci0JCQl0aGlzLnNob3dzVmVyc2lvbiA9IHNob3dzVmVyc2lvbjsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd3NIZWxwKCkgewotCQkJcmV0dXJuIHRoaXMuc2hvd3NIZWxwOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRTaG93c0hlbHAoYm9vbGVhbiBzaG93c0hlbHApewotCQkJdGhpcy5zaG93c0hlbHAgPSBzaG93c0hlbHA7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9DbGFzc2VzR2VuZXJhdG9yV2l6YXJkLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9DbGFzc2VzR2VuZXJhdG9yV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ODI1NjYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2NsYXNzZXNnZW4vQ2xhc3Nlc0dlbmVyYXRvcldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLmNsYXNzZXNnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmdlbi5DbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmdlbi5DbGFzc2VzR2VuZXJhdG9yT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmdlbi5HZW5lcmF0ZUpheGJDbGFzc2VzSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLkpwdEpheGJVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLkphdmFQcm9qZWN0V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZDsKLQotLyoqCi0gKiAgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZAotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaXphcmQgewotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgc2NoZW1hUGF0aE9yVXJpOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZGVzdGluYXRpb25Gb2xkZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0UGFja2FnZTsKLQlwcml2YXRlIFN0cmluZyBjYXRhbG9nOwotCXByaXZhdGUgYm9vbGVhbiB1c2VzTW94eTsKLQlwcml2YXRlIFN0cmluZ1tdIGJpbmRpbmdzRmlsZU5hbWVzOwotCXByaXZhdGUgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnMgZ2VuZXJhdG9yT3B0aW9uczsKLQlwcml2YXRlIENsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zIGdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnM7Ci0KLQlwcml2YXRlIEphdmFQcm9qZWN0V2l6YXJkUGFnZSBwcm9qZWN0V2l6YXJkUGFnZTsKLQlwcml2YXRlIFNjaGVtYVdpemFyZFBhZ2Ugc2NoZW1hV2l6YXJkUGFnZTsKLQkKLQlwcml2YXRlIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlIHNldHRpbmdzUGFnZTsKLQlwcml2YXRlIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZSBvcHRpb25zUGFnZTsKLQlwcml2YXRlIENsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zV2l6YXJkUGFnZSBleHRlbnNpb25PcHRpb25zUGFnZTsKLQlwcml2YXRlIGJvb2xlYW4gcGVyZm9ybXNHZW5lcmF0aW9uOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0JCi0JcHVibGljIENsYXNzZXNHZW5lcmF0b3JXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGVyZm9ybXNHZW5lcmF0aW9uID0gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIENsYXNzZXNHZW5lcmF0b3JXaXphcmQoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgeHNkU2NoZW1hUGF0aCkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7Ci0JCXRoaXMuc2NoZW1hUGF0aE9yVXJpID0geHNkU2NoZW1hUGF0aDsKLQotCQl0aGlzLnBlcmZvcm1zR2VuZXJhdGlvbiA9IGZhbHNlOwotCX0KLQotCS8vICoqKioqKioqKiogSVdvcmtiZW5jaFdpemFyZCBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZShKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkX3RpdGxlKTsKLQkJdGhpcy5zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKcHRKYXhiVWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdEpheGJVaUljb25zLkNMQVNTRVNfR0VOX1dJWl9CQU5ORVIpKTsKLQkJdGhpcy5zZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIElXaXphcmQgaW1wbGVtZW50YXRpb24gICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc3VwZXIuYWRkUGFnZXMoKTsKLQotCQlpZih0aGlzLnNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLmphdmFQcm9qZWN0ID0gdGhpcy5nZXRKYXZhUHJvamVjdEZyb21TZWxlY3Rpb24odGhpcy5zZWxlY3Rpb24pOwotCQkJCi0JCQl0aGlzLnByb2plY3RXaXphcmRQYWdlID0gbmV3IEphdmFQcm9qZWN0V2l6YXJkUGFnZSh0aGlzLmphdmFQcm9qZWN0KTsKLQkJCXRoaXMucHJvamVjdFdpemFyZFBhZ2Uuc2V0VGl0bGUoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvclByb2plY3RXaXphcmRQYWdlX3RpdGxlKTsKLQkJCXRoaXMucHJvamVjdFdpemFyZFBhZ2Uuc2V0RGVzY3JpcHRpb24oSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvclByb2plY3RXaXphcmRQYWdlX2Rlc2MpOwotCQkJdGhpcy5hZGRQYWdlKHRoaXMucHJvamVjdFdpemFyZFBhZ2UpOwotCi0JCQkvLyBTY2hlbWFXaXphcmRQYWdlCi0JCQlJRmlsZSBzY2hlbWFTZWxlY3RlZCA9IFNjaGVtYVdpemFyZFBhZ2UuZ2V0U291cmNlU2NoZW1hRnJvbVNlbGVjdGlvbih0aGlzLnNlbGVjdGlvbik7Ci0JCQlpZihzY2hlbWFTZWxlY3RlZCA9PSBudWxsKSB7Ci0JCQkJdGhpcy5zY2hlbWFXaXphcmRQYWdlID0gbmV3IFNjaGVtYVdpemFyZFBhZ2UodGhpcy5zZWxlY3Rpb24pOwotCQkJCXRoaXMuYWRkUGFnZSh0aGlzLnNjaGVtYVdpemFyZFBhZ2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5zY2hlbWFQYXRoT3JVcmkgPSB0aGlzLm1ha2VSZWxhdGl2ZVRvUHJvamVjdFBhdGgoc2NoZW1hU2VsZWN0ZWQuZ2V0RnVsbFBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5zZXR0aW5nc1BhZ2UgPSB0aGlzLmJ1aWxkQ2xhc3Nlc0dlbmVyYXRvclBhZ2UoKTsKLQkJdGhpcy5vcHRpb25zUGFnZSA9IHRoaXMuYnVpbGRDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1BhZ2UoKTsKLQkJdGhpcy5leHRlbnNpb25PcHRpb25zUGFnZSA9IHRoaXMuYnVpbGRFeHRlbnNpb25PcHRpb25zUGFnZSgpOwotCQkKLQkJdGhpcy5hZGRQYWdlKHRoaXMuc2V0dGluZ3NQYWdlKTsKLQkJdGhpcy5hZGRQYWdlKHRoaXMub3B0aW9uc1BhZ2UpOwotCQl0aGlzLmFkZFBhZ2UodGhpcy5leHRlbnNpb25PcHRpb25zUGFnZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCQotCQlXaXphcmRQYWdlIGN1cnJlbnRQYWdlID0gKFdpemFyZFBhZ2UpZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKTsKLQkJaWYoY3VycmVudFBhZ2UgIT0gbnVsbCkgewotCQkJaWYoICEgY3VycmVudFBhZ2UuaXNQYWdlQ29tcGxldGUoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXRoaXMucmV0cmlldmVHZW5lcmF0b3JTZXR0aW5ncygpOwotCQkJdGhpcy5yZXRyaWV2ZUdlbmVyYXRvck9wdGlvbnMoKTsKLQkJCXRoaXMucmV0cmlldmVHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zKCk7Ci0JCQkKLQkJCUlGb2xkZXIgZm9sZGVyID0gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIodGhpcy5kZXN0aW5hdGlvbkZvbGRlcik7Ci0JCQl0aGlzLmNyZWF0ZUZvbGRlcklmTm90RXhpc3QoZm9sZGVyKTsKLQkJfQotCi0JCWlmKHRoaXMucGVyZm9ybXNHZW5lcmF0aW9uKSB7Ci0JCQlpZih0aGlzLmRpc3BsYXlPdmVycmlkaW5nQ2xhc3Nlc1dhcm5pbmcodGhpcy5nZW5lcmF0b3JPcHRpb25zKSkgewotCQkJCXRoaXMuZ2VuZXJhdGVKYXhiQ2xhc3NlcygpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotICAgIAlyZXR1cm4gKHRoaXMuc2V0dGluZ3NQYWdlLmlzUGFnZUNvbXBsZXRlKCkgJiYKLSAgICAJCQkJdGhpcy5vcHRpb25zUGFnZS5pc1BhZ2VDb21wbGV0ZSgpICYmCi0gICAgCQkJCQl0aGlzLmV4dGVuc2lvbk9wdGlvbnNQYWdlLmlzUGFnZUNvbXBsZXRlKCkpOwotICAgIH0KLSAgICAKLQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLSAgICAKLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlpZih0aGlzLnByb2plY3RXaXphcmRQYWdlICE9IG51bGwpIHsKLQkJCXRoaXMuamF2YVByb2plY3QgPSB0aGlzLnByb2plY3RXaXphcmRQYWdlLmdldEphdmFQcm9qZWN0KCk7Ci0JCX0KLSAgICAJcmV0dXJuIHRoaXMuamF2YVByb2plY3Q7Ci0gICAgfQotCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWFQYXRoT3JVcmkoKSB7Ci0JCWlmKHRoaXMuc2NoZW1hV2l6YXJkUGFnZSAhPSBudWxsKSB7Ci0JCQlJRmlsZSBzY2hlbWFGaWxlID0gdGhpcy5zY2hlbWFXaXphcmRQYWdlLmdldFNvdXJjZVNjaGVtYSgpOwotCQkJaWYoc2NoZW1hRmlsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoaXMubWFrZVJlbGF0aXZlVG9Qcm9qZWN0UGF0aChzY2hlbWFGaWxlLmdldEZ1bGxQYXRoKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHRoaXMuc2NoZW1hV2l6YXJkUGFnZS5nZXRTb3VyY2VVUkkoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5zY2hlbWFQYXRoT3JVcmk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbWFrZVJlbGF0aXZlVG9Qcm9qZWN0UGF0aChJUGF0aCBwYXRoKSB7Ci0JCUlQYXRoIHJlbGF0aXZlUGF0aCA9IHBhdGgubWFrZVJlbGF0aXZlVG8odGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpKTsKLQkJcmV0dXJuIHJlbGF0aXZlUGF0aC50b09TU3RyaW5nKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCi0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXREZXN0aW5hdGlvbkZvbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMuZGVzdGluYXRpb25Gb2xkZXI7Ci0JfQotCQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0UGFja2FnZTsKLQl9Ci0JCi0gICAgcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nOwotCX0KLQkKLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VzTW94eSgpIHsKLQkJcmV0dXJuIHRoaXMudXNlc01veHk7Ci0JfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEJpbmRpbmdzRmlsZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5iaW5kaW5nc0ZpbGVOYW1lczsKLQl9Ci0JCi0gICAgcHVibGljIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zIGdldEdlbmVyYXRvck9wdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvck9wdGlvbnM7Ci0JfQotCQotICAgIHB1YmxpYyBDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyBnZXRHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0gICAgcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdEZyb21TZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgCWlmKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotCQlPYmplY3QgZmlyc3RFbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZihmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKLQkJCXJldHVybiAoSUphdmFQcm9qZWN0KWZpcnN0RWxlbWVudDsKLQkJfQotCQllbHNlIGlmKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSVJlc291cmNlKSBmaXJzdEVsZW1lbnQpLmdldFByb2plY3QoKTsKLQkJCXJldHVybiBnZXRKYXZhUHJvamVjdEZyb20ocHJvamVjdCk7Ci0JCX0KLQkJZWxzZSBpZihmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpIHsKLQkJCXJldHVybiAoKElKYXZhRWxlbWVudClmaXJzdEVsZW1lbnQpLmdldEphdmFQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3RGcm9tKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAJcmV0dXJuIChJSmF2YVByb2plY3QpKChJSmF2YUVsZW1lbnQpKChJQWRhcHRhYmxlKXByb2plY3QpLmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKSk7Ci0gICAgfQotICAgIAotCXByaXZhdGUgYm9vbGVhbiBkaXNwbGF5T3ZlcnJpZGluZ0NsYXNzZXNXYXJuaW5nKENsYXNzZXNHZW5lcmF0b3JPcHRpb25zIGdlbmVyYXRvck9wdGlvbnMpIHsKLQkJCi0JCWlmKCAhIHRoaXMuaXNPdmVycmlkaW5nQ2xhc3NlcyhnZW5lcmF0b3JPcHRpb25zKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKAotCQkJdGhpcy5nZXRTaGVsbCgpLCAKLQkJCUpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JVaV9nZW5lcmF0aW5nQ2xhc3Nlc1dhcm5pbmdUaXRsZSwKLQkJCUpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JVaV9nZW5lcmF0aW5nQ2xhc3Nlc1dhcm5pbmdNZXNzYWdlKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNPdmVycmlkaW5nQ2xhc3NlcyhDbGFzc2VzR2VuZXJhdG9yT3B0aW9ucyBnZW5lcmF0b3JPcHRpb25zKSB7Ci0JCWlmKGdlbmVyYXRvck9wdGlvbnMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYoZ2VuZXJhdG9yT3B0aW9ucy5zaG93c1ZlcnNpb24oKSB8fCBnZW5lcmF0b3JPcHRpb25zLnNob3dzSGVscCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUpheGJDbGFzc2VzKCkgewotCQl0cnkgewotCQkJV29ya3NwYWNlSm9iIGpvYiA9IG5ldyBHZW5lcmF0ZUpheGJDbGFzc2VzSm9iKAotCQkJCXRoaXMuZ2V0SmF2YVByb2plY3QoKSwgCi0JCQkJdGhpcy5nZXRTY2hlbWFQYXRoT3JVcmkoKSwgCi0JCQkJdGhpcy5kZXN0aW5hdGlvbkZvbGRlciwgCi0JCQkJdGhpcy50YXJnZXRQYWNrYWdlLCAKLQkJCQl0aGlzLmNhdGFsb2csIAotCQkJCXRoaXMudXNlc01veHksCi0JCQkJdGhpcy5iaW5kaW5nc0ZpbGVOYW1lcywKLQkJCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMsCi0JCQkJdGhpcy5nZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zKTsKLQkJCWpvYi5zY2hlZHVsZSgpOwotCQl9Ci0JCWNhdGNoKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLQkJCUpwdEpheGJVaVBsdWdpbi5sb2cocmUpOwotCQkJCi0JCQlTdHJpbmcgbXNnID0gcmUuZ2V0TWVzc2FnZSgpOwotCQkJU3RyaW5nIG1lc3NhZ2UgPSAobXNnID09IG51bGwpID8gcmUudG9TdHJpbmcoKSA6IG1zZzsKLQkJCXRoaXMubG9nRXJyb3IobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmV0cmlldmVHZW5lcmF0b3JTZXR0aW5ncygpIHsKLQkJdGhpcy5kZXN0aW5hdGlvbkZvbGRlciA9IHRoaXMuc2V0dGluZ3NQYWdlLmdldFRhcmdldEZvbGRlcigpOwotCQl0aGlzLnRhcmdldFBhY2thZ2UgPSB0aGlzLnNldHRpbmdzUGFnZS5nZXRUYXJnZXRQYWNrYWdlKCk7Ci0JCXRoaXMuY2F0YWxvZyA9IHRoaXMuc2V0dGluZ3NQYWdlLmdldENhdGFsb2coKTsKLQkJdGhpcy51c2VzTW94eSA9IHRoaXMuc2V0dGluZ3NQYWdlLnVzZXNNb3h5KCk7Ci0JCXRoaXMuYmluZGluZ3NGaWxlTmFtZXMgPSB0aGlzLnNldHRpbmdzUGFnZS5nZXRCaW5kaW5nc0ZpbGVOYW1lcygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmV0cmlldmVHZW5lcmF0b3JPcHRpb25zKCkgewotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMgPSBuZXcgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnMoKTsKLQotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2V0UHJveHkodGhpcy5vcHRpb25zUGFnZS5nZXRQcm94eSgpKTsKLQkJdGhpcy5nZW5lcmF0b3JPcHRpb25zLnNldFByb3h5RmlsZSh0aGlzLm9wdGlvbnNQYWdlLmdldFByb3h5RmlsZSgpKTsKLQkJCi0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5zZXRVc2VzU3RyaWN0VmFsaWRhdGlvbih0aGlzLm9wdGlvbnNQYWdlLnVzZXNTdHJpY3RWYWxpZGF0aW9uKCkpOwotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2V0TWFrZXNSZWFkT25seSh0aGlzLm9wdGlvbnNQYWdlLm1ha2VzUmVhZE9ubHkoKSk7Ci0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5zZXRTdXBwcmVzc2VzUGFja2FnZUluZm9HZW4odGhpcy5vcHRpb25zUGFnZS5zdXBwcmVzc2VzUGFja2FnZUluZm9HZW4oKSk7Ci0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5zZXRTdXBwcmVzc2VzSGVhZGVyR2VuKHRoaXMub3B0aW9uc1BhZ2Uuc3VwcHJlc3Nlc0hlYWRlckdlbigpKTsKLQkJdGhpcy5nZW5lcmF0b3JPcHRpb25zLnNldFRhcmdldElzMjAodGhpcy5vcHRpb25zUGFnZS5nZXRUYXJnZXQoKSk7Ci0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5zZXRJc1ZlcmJvc2UodGhpcy5vcHRpb25zUGFnZS5pc1ZlcmJvc2UoKSk7Ci0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5zZXRJc1F1aWV0KHRoaXMub3B0aW9uc1BhZ2UuaXNRdWlldCgpKTsKLQkJCi0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5zZXRUcmVhdHNBc1htbFNjaGVtYSh0aGlzLm9wdGlvbnNQYWdlLnRyZWF0c0FzWG1sU2NoZW1hKCkpOwotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2V0VHJlYXRzQXNSZWxheE5nKHRoaXMub3B0aW9uc1BhZ2UudHJlYXRzQXNSZWxheE5nKCkpOwotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2V0VHJlYXRzQXNSZWxheE5nQ29tcGFjdCh0aGlzLm9wdGlvbnNQYWdlLnRyZWF0c0FzUmVsYXhOZ0NvbXBhY3QoKSk7Ci0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5zZXRUcmVhdHNBc0R0ZCh0aGlzLm9wdGlvbnNQYWdlLnRyZWF0c0FzRHRkKCkpOwotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2V0VHJlYXRzQXNXc2RsKHRoaXMub3B0aW9uc1BhZ2UudHJlYXRzQXNXc2RsKCkpOwotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2V0U2hvd3NWZXJzaW9uKHRoaXMub3B0aW9uc1BhZ2Uuc2hvd3NWZXJzaW9uKCkpOwotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2V0U2hvd3NIZWxwKHRoaXMub3B0aW9uc1BhZ2Uuc2hvd3NIZWxwKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmV0cmlldmVHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zKCkgewotCi0JCXRoaXMuZ2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyA9IG5ldyBDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucygpOwotCi0JCXRoaXMuZ2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucy5zZXRBbGxvd3NFeHRlbnNpb25zKHRoaXMuZXh0ZW5zaW9uT3B0aW9uc1BhZ2UuYWxsb3dzRXh0ZW5zaW9ucygpKTsKLQkJdGhpcy5nZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zLnNldENsYXNzcGF0aCh0aGlzLmV4dGVuc2lvbk9wdGlvbnNQYWdlLmdldENsYXNzcGF0aCgpKTsKLQkJdGhpcy5nZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zLnNldEFkZGl0aW9uYWxBcmdzKHRoaXMuZXh0ZW5zaW9uT3B0aW9uc1BhZ2UuZ2V0QWRkaXRpb25hbEFyZ3MoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZSBidWlsZENsYXNzZXNHZW5lcmF0b3JQYWdlKCkgewotCi0JCXJldHVybiBuZXcgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2UgYnVpbGRDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1BhZ2UoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlKCk7Ci0JfQotCQotCXByaXZhdGUgQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlIGJ1aWxkRXh0ZW5zaW9uT3B0aW9uc1BhZ2UoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVGb2xkZXJJZk5vdEV4aXN0KElGb2xkZXIgZm9sZGVyKSB7Ci0JCWlmKCBmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRKYXhiVWlQbHVnaW4ubG9nKGUpOwotCQkJCi0JCQl0aGlzLmxvZ0Vycm9yKE5MUy5iaW5kKAotCQkJCUpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JXaXphcmRfY291bGROb3RDcmVhdGUsIAotCQkJCWZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9PU1N0cmluZygpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCXRoaXMuZGlzcGxheUVycm9yKG1lc3NhZ2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzcGxheUVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKAotCQkJCXRoaXMuZ2V0U2hlbGwoKSwKLQkJCQlKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkX2Vycm9yRGlhbG9nVGl0bGUsCi0JCQkJbWVzc2FnZQotCQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2NsYXNzZXNnZW4vQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRjNDk0MC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLmNsYXNzZXNnZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5UeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuVHlwZWRWaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50Q29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld1R5cGVXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmdlbi5DbGFzc2VzR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLkpwdEpheGJVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5UYWJsZUxheW91dENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZSBleHRlbmRzIE5ld1R5cGVXaXphcmRQYWdlIHsKLQlzdGF0aWMgcHVibGljIFN0cmluZyBKUFRfRUNMSVBTRUxJTktfVUlfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aSI7ICAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIFhNTF9GSUxURVIgPSAiKi54bWwiOyAgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBCSU5ESU5HU19GSUxFX0ZJTFRFUiA9ICIqLnhqYjsqLnhtbDsqLnhiZCI7ICAgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVMUF9DT05URVhUX0lEID0gSnB0VWlQbHVnaW4uUExVR0lOX0lEICsgIi5jb25maWd1cmVfamF4Yl9jbGFzc19nZW5lcmF0aW9uX2RpYWxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU2V0dGluZ3NHcm91cCBzZXR0aW5nc0dyb3VwOwotCQotCXByaXZhdGUgU3RyaW5nIHRhcmdldEZvbGRlcjsKLQlwcml2YXRlIFN0cmluZyB0YXJnZXRQYWNrYWdlOwotCQotCXByaXZhdGUgQnV0dG9uIHVzZXNNb3h5Q2hlY2tCb3g7Ci0JcHJpdmF0ZSBib29sZWFuIHVzZXNNb3h5OwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0JCi0JcHVibGljIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlKCkgewotCQlzdXBlcih0cnVlLCAiQ2xhc3NlcyBHZW5lcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRoaXMuc2V0RGVzY3JpcHRpb24oSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfZGVzYyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBVSSBjb21wb25lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCXRoaXMuc2V0Q29udHJvbCh0aGlzLmJ1aWxkVG9wTGV2ZWxDb250cm9sKHBhcmVudCkpOwotCX0KLQotCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0Rm9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXRGb2xkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXRQYWNrYWdlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuc2V0dGluZ3NHcm91cC5nZXRDYXRhbG9nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEJpbmRpbmdzRmlsZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5zZXR0aW5nc0dyb3VwLmdldEJpbmRpbmdzRmlsZU5hbWVzKCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHVzZXNNb3h5KCkgewotCQlyZXR1cm4gdGhpcy51c2VzTW94eTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXNlc01veHkoYm9vbGVhbiB1c2VzTW94eSl7Ci0JCXRoaXMudXNlc01veHkgPSB1c2VzTW94eTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVG9wTGV2ZWxDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEhFTFBfQ09OVEVYVF9JRCk7Ci0JCQotCQl0aGlzLnNldHRpbmdzR3JvdXAgPSBuZXcgU2V0dGluZ3NHcm91cChjb21wb3NpdGUpOwotCi0JCXRoaXMudXNlc01veHlDaGVja0JveCA9IHRoaXMuYnVpbGRVc2VzTW94eUNoZWNrQm94KGNvbXBvc2l0ZSk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkVXNlc01veHlDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0JCWNoZWNrQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljaGVja0JveC5zZXRUZXh0KEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX3VzZXNNb3h5SW1wbGVtZW50YXRpb24pOwotCQljaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy51c2VzTW94eSgpKTsKLQkJY2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZFVzZXNNb3h5U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRVc2VzTW94eVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0VXNlc01veHkodXNlc01veHlDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJdmFsaWRhdGVQcm9qZWN0Q2xhc3NwYXRoKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBqcHRFY2xpcHNlTGlua0J1bmRsZUV4aXN0cygpIHsKLQkJcmV0dXJuICh0aGlzLmdldEpwdEVjbGlwc2VMaW5rQnVuZGxlKCkgIT0gbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgQnVuZGxlIGdldEpwdEVjbGlwc2VMaW5rQnVuZGxlKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QnVuZGxlKEpQVF9FQ0xJUFNFTElOS19VSV9QTFVHSU5fSUQpOwkvLyBDYW5ub3QgcmVmZXJlbmNlIGRpcmVjdGx5IEVMIHBsdWdpbi4KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUHJvamVjdENsYXNzcGF0aCgpIHsKLQkJLy90aGlzIGxpbmUgd2lsbCBzdXBwcmVzcyB0aGUgImRlZmF1bHQgcGFja2FnZSIgd2FybmluZyAod2hpY2ggZG9lc24ndCByZWFsbHkgYXBwbHkgaGVyZQotCQkvL2FzIHRoZSBKQVhCIGdlbiB1c2VzIGFuIG9yZy5leGFtcGxlLnNjaGVtYU5hbWUgcGFja2FnZSBieSBkZWZhdWx0KSBhbmQgd2lsbCBjbGVhciB0aGUgY2xhc3NwYXRoIHdhcm5pbmdzIHdoZW4gbmVjZXNzYXJ5Ci0JCXNldE1lc3NhZ2UobnVsbCk7Ci0JCQotCQlpZiAoICEgdGhpcy5nZW5lcmljSmF4YklzT25DbGFzc3BhdGgoKSkgewotCQkJdGhpcy5kaXNwbGF5V2FybmluZyhKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9qYXhiTGlicmFyaWVzTm90QXZhaWxhYmxlKTsKLQkJfQotCQllbHNlIGlmICh0aGlzLnVzZXNNb3h5KCkgJiYgISB0aGlzLm1veHlJc09uQ2xhc3NwYXRoKCkpIHsKLQkJCS8vdGhpcyBtZXNzYWdlIGlzIGJlaW5nIHRydW5jYXRlZCBieSB0aGUgd2l6YXJkIHdpZHRoIGluIHNvbWUgY2FzZXMKLQkJCXRoaXMuZGlzcGxheVdhcm5pbmcoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfbW94eUxpYnJhcmllc05vdEF2YWlsYWJsZSk7Ci0JCX0KLQotCQkvL3RoaXMgY29kZSB3aWxsIGludGVsbGlnZW50bHkgcmVtb3ZlIG91ciBjbGFzc3BhdGggd2FybmluZ3Mgd2hlbiB0aGV5IGFyZSBwcmVzZW50IGJ1dCBubyBsb25nZXIgYXBwbHkgKGFzIGFuIGFsdGVybmF0aXZlIAotCQkvL3RvIHNldHRpbmcgdGhlIG1lc3NhZ2UgdG8gbnVsbCBjb250aW51b3VzbHkgYXMgaXMgY3VycmVudGx5IGRvbmUpCi0vLwkJZWxzZSBpZiggdGhpcy5nZXRNZXNzYWdlKCkgIT0gbnVsbCl7Ci0vLwkJCWlmICh0aGlzLmdldE1lc3NhZ2UoKS5lcXVhbHMoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfamF4YkxpYnJhcmllc05vdEF2YWlsYWJsZSkgfHwKLS8vCQkJCQl0aGlzLmdldE1lc3NhZ2UoKS5lcXVhbHMoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfbW94eUxpYnJhcmllc05vdEF2YWlsYWJsZSkpIHsgCi0vLwkJCQlzZXRNZXNzYWdlKG51bGwpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzcGxheVdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJdGhpcy5zZXRNZXNzYWdlKG1lc3NhZ2UsIFdBUk5JTkcpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgaWYgdGhlIEpheGIgY29tcGlsZXIgaXMgb24gdGhlIGNsYXNzcGF0aC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJpY0pheGJJc09uQ2xhc3NwYXRoKCkgewotCQl0cnkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IENsYXNzZXNHZW5lcmF0b3IuSkFYQl9HRU5FUklDX0dFTl9DTEFTUzsKLQkJCUlUeXBlIGdlbkNsYXNzID0gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKGNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gKGdlbkNsYXNzICE9IG51bGwpOwotCQl9IAotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgaWYgdGhlIEVjbGlwc2VMaW5rIEpheGIgY29tcGlsZXIgaXMgb24gdGhlIGNsYXNzcGF0aC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbW94eUlzT25DbGFzc3BhdGgoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gQ2xhc3Nlc0dlbmVyYXRvci5KQVhCX0VDTElQU0VMSU5LX0dFTl9DTEFTUzsKLQkJCUlUeXBlIGdlbkNsYXNzID0gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKGNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gKGdlbkNsYXNzICE9IG51bGwpOwotCQl9IAotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJU3RhdHVzIHBhY2thZ2VDaGFuZ2VkKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnBhY2thZ2VDaGFuZ2VkKCk7IAotCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IGdldFBhY2thZ2VGcmFnbWVudCgpOwotCQlpZiAoIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7Ci0JCQl0aGlzLnRhcmdldFBhY2thZ2UgPSBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0JCQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVN0YXR1cyBjb250YWluZXJDaGFuZ2VkKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLmNvbnRhaW5lckNoYW5nZWQoKTsKLQkJU3RyaW5nIHNyY0ZvbGRlciA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3RUZXh0KCk7Ci0JCWlmKCAhc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikgKXsKLQkJCQl0aGlzLnRhcmdldEZvbGRlciA9IHNyY0ZvbGRlci5zdWJzdHJpbmcoc3JjRm9sZGVyLmluZGV4T2YoIi8iKSArIDEpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUZpZWxkQ2hhbmdlZChTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXN1cGVyLmhhbmRsZUZpZWxkQ2hhbmdlZChmaWVsZE5hbWUpOwotCQlpZiAodGhpcy5mQ29udGFpbmVyU3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsKLQkJCXVwZGF0ZVN0YXR1cyhmQ29udGFpbmVyU3RhdHVzKTsKLQkJfWVsc2UgaWYoICEgdGhpcy5mUGFja2FnZVN0YXR1cy5tYXRjaGVzKElTdGF0dXMuT0spICkgewotCQkJdXBkYXRlU3RhdHVzKGZQYWNrYWdlU3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCXVwZGF0ZVN0YXR1cyhTdGF0dXMuT0tfU1RBVFVTKTsKLQkJfQotCQl2YWxpZGF0ZVByb2plY3RDbGFzc3BhdGgoKTsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgc2V0VmlzaWJsZSB0byBpbnN1cmUgdGhhdCBvdXIgbW9yZSBpbXBvcnRhbnQgd2FybmluZwotCSAqIG1lc3NhZ2UgYWJvdXQgY2xhc3NwYXRoIHByb2JsZW1zIGlzIGRpc3BsYXllZCB0byB0aGUgdXNlciBmaXJzdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZih2aXNpYmxlKSB7Ci0JCQl0aGlzLmluaXRDb250YWluZXJQYWdlKCgoQ2xhc3Nlc0dlbmVyYXRvcldpemFyZCl0aGlzLmdldFdpemFyZCgpKS5nZXRKYXZhUHJvamVjdCgpKTsKLQotCQkJLy8gZGVmYXVsdCB1c2VzTW94eSB0byB0cnVlIG9ubHkgd2hlbiBKUFQgRWNsaXBzZUxpbmsgYnVuZGxlIGV4aXN0cyBhbmQgTU9YeSBpcyBvbiB0aGUgY2xhc3NwYXRoCi0JCQl0aGlzLnVzZXNNb3h5ID0gKHRoaXMuanB0RWNsaXBzZUxpbmtCdW5kbGVFeGlzdHMoKSAmJiB0aGlzLm1veHlJc09uQ2xhc3NwYXRoKCkpOyAKLQkKLQkJCS8vIGNoZWNrYm94IGlzIHZpc2libGUgb25seSBpZiBqcHQuZWNsaXBzZWxpbmsudWkgcGx1Z2luIGlzIGF2YWlsYWJsZQotCQkJLy8gYW5kIEVjbGlwc2VMaW5rIE1PWHkgaXMgbm90IG9uIHRoZSBjbGFzc3BhdGgKLQkJCXRoaXMudXNlc01veHlDaGVja0JveC5zZXRWaXNpYmxlKHRoaXMuanB0RWNsaXBzZUxpbmtCdW5kbGVFeGlzdHMoKSAmJiAhIHRoaXMubW94eUlzT25DbGFzc3BhdGgoKSk7Ci0JCQl0aGlzLnZhbGlkYXRlUHJvamVjdENsYXNzcGF0aCgpOwotCi0JCQlTdHJpbmcgc2NoZW1hUGF0aE9yVXJpID0gKChDbGFzc2VzR2VuZXJhdG9yV2l6YXJkKXRoaXMuZ2V0V2l6YXJkKCkpLmdldFNjaGVtYVBhdGhPclVyaSgpOwotCQkJdGhpcy5zZXRUaXRsZShOTFMuYmluZChKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV90aXRsZSwgc2NoZW1hUGF0aE9yVXJpKSk7Ci0JCX0KLQl9Ci0gICAgCi0JLyoqIAotCSAqIE92ZXJyaWRlIHRvIGFsbG93IHNlbGVjdGlvbiBvZiBzb3VyY2UgZm9sZGVyIGluIGN1cnJlbnQgcHJvamVjdCBvbmx5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdDb250YWluZXJXaXphcmRQYWdlI2Nob29zZUNvbnRhaW5lcigpCi0JICogT25seSAxIGxpbmUgaW4gdGhpcyBjb2RlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBwYXJlbnQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QgY2hvb3NlQ29udGFpbmVyKCkgewotCQlDbGFzczw/PltdIGFjY2VwdGVkQ2xhc3NlcyA9IG5ldyBDbGFzc1tdIHsgSVBhY2thZ2VGcmFnbWVudFJvb3QuY2xhc3MsIElKYXZhUHJvamVjdC5jbGFzcyB9OwotCQlUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IgdmFsaWRhdG9yPSBuZXcgVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yKGFjY2VwdGVkQ2xhc3NlcywgZmFsc2UpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZFZhbGlkKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKLQkJCQkJCUlKYXZhUHJvamVjdCBqcHJvamVjdD0gKElKYXZhUHJvamVjdCllbGVtZW50OwotCQkJCQkJSVBhdGggcGF0aD0ganByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCk7Ci0JCQkJCQlyZXR1cm4gKGpwcm9qZWN0LmZpbmRQYWNrYWdlRnJhZ21lbnRSb290KHBhdGgpICE9IG51bGwpOwotCQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJCQkJcmV0dXJuICgoKElQYWNrYWdlRnJhZ21lbnRSb290KWVsZW1lbnQpLmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJSnB0SmF4YlVpUGx1Z2luLmxvZyhlKTsgLy8ganVzdCBsb2csIG5vIFVJIGluIHZhbGlkYXRpb24KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCi0JCWFjY2VwdGVkQ2xhc3Nlcz0gbmV3IENsYXNzW10geyBJSmF2YU1vZGVsLmNsYXNzLCBJUGFja2FnZUZyYWdtZW50Um9vdC5jbGFzcywgSUphdmFQcm9qZWN0LmNsYXNzIH07Ci0JCVZpZXdlckZpbHRlciBmaWx0ZXI9IG5ldyBUeXBlZFZpZXdlckZpbHRlcihhY2NlcHRlZENsYXNzZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJCQl0cnkgewotCQkJCQkJcmV0dXJuICgoKElQYWNrYWdlRnJhZ21lbnRSb290KWVsZW1lbnQpLmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSk7Ci0JCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlKcHRKYXhiVWlQbHVnaW4ubG9nKGUuZ2V0U3RhdHVzKCkpOyAvLyBqdXN0IGxvZywgbm8gVUkgaW4gdmFsaWRhdGlvbgotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5zZWxlY3Qodmlld2VyLCBwYXJlbnQsIGVsZW1lbnQpOwotCQkJfQotCQl9OwotCi0JCVN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIgcHJvdmlkZXI9IG5ldyBTdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyKCk7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI9IG5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfREVGQVVMVCk7Ci0JCUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZz0gbmV3IEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIGxhYmVsUHJvdmlkZXIsIHByb3ZpZGVyKTsKLQkJZGlhbG9nLnNldFZhbGlkYXRvcih2YWxpZGF0b3IpOwotCQlkaWFsb2cuc2V0Q29tcGFyYXRvcihuZXcgSmF2YUVsZW1lbnRDb21wYXJhdG9yKCkpOwotCQlkaWFsb2cuc2V0VGl0bGUoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2Vfc291cmNlRm9sZGVyU2VsZWN0aW9uRGlhbG9nX3RpdGxlKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfY2hvb3NlU291cmNlRm9sZGVyRGlhbG9nX2Rlc2MpOwotCQlkaWFsb2cuYWRkRmlsdGVyKGZpbHRlcik7Ci0JCS8vc2V0IHRoZSBqYXZhIHByb2plY3QgYXMgdGhlIGlucHV0IGluc3RlYWQgb2YgdGhlIHdvcmtzcGFjZSBsaWtlIHRoZSBOZXdDb250YWluZXJXaXphcmRQYWdlIHdhcyBkb2luZwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vCi0JCWRpYWxvZy5zZXRJbnB1dCh0aGlzLmdldEphdmFQcm9qZWN0KCkpOyAgICAgCQkJLy8KLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLwotCQlkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbihnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkpOwotCQlkaWFsb2cuc2V0SGVscEF2YWlsYWJsZShmYWxzZSk7Ci0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlPYmplY3QgZWxlbWVudD0gZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJCUlKYXZhUHJvamVjdCBqcHJvamVjdD0gKElKYXZhUHJvamVjdCllbGVtZW50OwotCQkJCXJldHVybiBqcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGpwcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudFJvb3QpZWxlbWVudDsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFNldHRpbmdzR3JvdXAgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBTZXR0aW5nc0dyb3VwIHsKLQotCQlwcml2YXRlIGZpbmFsIFRleHQgY2F0YWxvZ1RleHQ7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBiaW5kaW5nc0ZpbGVOYW1lczsKLQkJCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JCXByaXZhdGUgU2V0dGluZ3NHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKTsgLy9tdXN0IGJlIDQgZm9yIHRoZSBwYWNrYWdlIGNvbnRyb2xzCi0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkvLyBUT0RPIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5ncm91cCwgSEVMUF9DT05URVhUX0lEKTsKLQotCQkJLy8gU291cmNlIGZvbGRlcgotCQkJY3JlYXRlQ29udGFpbmVyQ29udHJvbHMoY29tcG9zaXRlLCA0KTsKLQkJCQotCQkJLy8gUGFja2FnZQotCQkJY3JlYXRlUGFja2FnZUNvbnRyb2xzKGNvbXBvc2l0ZSwgNCk7Ci0JCQkKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSwgNCwgMSk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDU7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQotCQkJLy8gQ2F0YWxvZwotCQkJTGFiZWwgY2F0YWxvZ0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJY2F0YWxvZ0xhYmVsLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfY2F0YWxvZyk7Ci0JCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSA1OwotCQkJY2F0YWxvZ0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJdGhpcy5jYXRhbG9nVGV4dCA9IHRoaXMuYnVpbGRDYXRhbG9nVGV4dChjb21wb3NpdGUpOwotCQkJdGhpcy5idWlsZEJyb3dzZUJ1dHRvbihjb21wb3NpdGUpOwotCQkJCi0JCQkvLyBCaW5kaW5ncyBmaWxlcwotCQkJdGhpcy5iaW5kaW5nc0ZpbGVOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJTGFiZWwgYmluZGluZ3NGaWxlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQliaW5kaW5nc0ZpbGVMYWJlbC5zZXRUZXh0KEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2JpbmRpbmdzRmlsZXMpOwotCQkJYmluZGluZ3NGaWxlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQl0aGlzLmJ1aWxkQmluZGluZ3NGaWxlVGFibGUoY29tcG9zaXRlKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKLQkJCXJldHVybiB0aGlzLmNhdGFsb2dUZXh0LmdldFRleHQoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRCaW5kaW5nc0ZpbGVOYW1lcygpIHsKLQkJCXJldHVybiBBcnJheVRvb2xzLmFycmF5KHRoaXMuYmluZGluZ3NGaWxlTmFtZXMuaXRlcmF0b3IoKSwgbmV3IFN0cmluZ1swXSk7Ci0JCX0KLQkJCi0JCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0KLQkJcHJpdmF0ZSBUZXh0IGJ1aWxkQ2F0YWxvZ1RleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDU7Ci0JCQl0ZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYnVpbGRCcm93c2VCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCi0JCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUdyaWRMYXlvdXQgYnV0dG9uTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChidXR0b25MYXlvdXQpOwotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCQkvLyBCcm93c2UgYnV0dG9ucwotCQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCQlicm93c2VCdXR0b24uc2V0VGV4dChKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9icm93c2VCdXR0b24pOwotCQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDU7Ci0JCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotCQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJCi0JCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkJCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JCQkJCVN0cmluZyBmaWxlUGF0aCA9IHByb21wdFhtbEZpbGUoKTsKLQkJCQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShmaWxlUGF0aCkpIHsKLQkJCQkJCQotCQkJCQkJY2F0YWxvZ1RleHQuc2V0VGV4dChtYWtlUmVsYXRpdmVUb1Byb2plY3RQYXRoKGZpbGVQYXRoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXByaXZhdGUgVGFibGVWaWV3ZXIgYnVpbGRCaW5kaW5nc0ZpbGVUYWJsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkKLQkJCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gdGhpcy5idWlsZFRhYmxlVmlld2VyKHBhcmVudCwgdGhpcy5iaW5kaW5nc0ZpbGVOYW1lcyk7Ci0JCQkKLQkJCXRoaXMuYnVpbGRBZGRSZW1vdmVCdXR0b25zKHBhcmVudCwgdGFibGVWaWV3ZXIsIHRoaXMuYmluZGluZ3NGaWxlTmFtZXMpOwotCQkJcmV0dXJuIHRhYmxlVmlld2VyOwotCQl9Ci0JCQotCQlwcml2YXRlIFRhYmxlVmlld2VyIGJ1aWxkVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgQXJyYXlMaXN0PFN0cmluZz4gdGFibGVEYXRhTW9kZWwpIHsJCi0JCQotCQkJVGFibGVMYXlvdXRDb21wb3NpdGUgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXRDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQl0aGlzLmFkZENvbHVtbnNEYXRhKHRhYmxlTGF5b3V0KTsKLQkJCi0JCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSh0YWJsZUxheW91dCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOwotCQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQkJCQotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMCk7Ci0JCQljb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCQkKLQkJCUdyaWREYXRhIGdyaWREYXRhPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQ9IFNXVFV0aWwuZ2V0VGFibGVIZWlnaHRIaW50KHRhYmxlLCAzKTsKLQkJCXRhYmxlTGF5b3V0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJCXRhYmxlVmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHRoaXMuYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHRoaXMuYnVpbGRDb250ZW50UHJvdmlkZXIoKSk7Ci0JCQkKLQkJCXRhYmxlVmlld2VyLnNldElucHV0KHRhYmxlRGF0YU1vZGVsKTsKLQkJCXJldHVybiB0YWJsZVZpZXdlcjsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGJ1aWxkQWRkUmVtb3ZlQnV0dG9ucyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBUYWJsZVZpZXdlciB0YWJsZVZpZXdlciwgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gdGFibGVEYXRhTW9kZWwpIHsKLQkJCi0JCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUdyaWRMYXlvdXQgYnV0dG9uTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChidXR0b25MYXlvdXQpOwotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJLy8gQWRkIGJ1dHRvbnMKLQkJCUJ1dHRvbiBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJYWRkQnV0dG9uLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfYWRkQnV0dG9uKTsKLQkJCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotCQkJYWRkQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQotCQkJCQlBcnJheUxpc3Q8U3RyaW5nPiBmaWxlUGF0aHMgPSBwcm9tcHRCaW5kaW5nc0ZpbGVzKCk7Ci0JCQkJCWZvcihTdHJpbmcgZmlsZVBhdGggOiBmaWxlUGF0aHMpIHsKLQkJCQkJCWFkZEJpbmRpbmdzRmlsZShmaWxlUGF0aCwgdGFibGVEYXRhTW9kZWwpOwotCQkJCQl9Ci0JCQkJCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCS8vIFJlbW92ZSBidXR0b25zCi0JCQlCdXR0b24gcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX3JlbW92ZUJ1dHRvbik7Ci0JCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgYmluZGluZ3NGaWxlTmFtZSA9IChTdHJpbmcpc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlyZW1vdmVCaW5kaW5nc0ZpbGUoYmluZGluZ3NGaWxlTmFtZSk7Ci0JCQotCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlhZGRCdXR0b24uc2V0Rm9jdXMoKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkJcHJpdmF0ZSBTdHJpbmcgbWFrZVJlbGF0aXZlVG9Qcm9qZWN0UGF0aChTdHJpbmcgZmlsZVBhdGgpIHsKLQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGZpbGVQYXRoKTsKLQkJCUlQYXRoIHJlbGF0aXZlUGF0aCA9IHBhdGgubWFrZVJlbGF0aXZlVG8oZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0TG9jYXRpb24oKSk7Ci0JCQlyZXR1cm4gcmVsYXRpdmVQYXRoLnRvT1NTdHJpbmcoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRCaW5kaW5nc0ZpbGUoU3RyaW5nIGZpbGVQYXRoLCBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiB0YWJsZURhdGFNb2RlbCkgewotCQkJU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHRoaXMubWFrZVJlbGF0aXZlVG9Qcm9qZWN0UGF0aChmaWxlUGF0aCk7Ci0JCQlpZiggISB0YWJsZURhdGFNb2RlbC5jb250YWlucyhyZWxhdGl2ZVBhdGgpKSB7Ci0JCQkJdGFibGVEYXRhTW9kZWwuYWRkKHJlbGF0aXZlUGF0aCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCByZW1vdmVCaW5kaW5nc0ZpbGUoU3RyaW5nIGJpbmRpbmdzTmFtZSkgewotCQkJdGhpcy5iaW5kaW5nc0ZpbGVOYW1lcy5yZW1vdmUoYmluZGluZ3NOYW1lKTsKLQkJfQotCi0JCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJCXJldHVybiBuZXcgVGFibGVMYWJlbFByb3ZpZGVyKCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBidWlsZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXJldHVybiBuZXcgVGFibGVDb250ZW50UHJvdmlkZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgQWRkIGJ1dHRvbiB3YXMgY2xpY2tlZCwgaXRzIGFjdGlvbiBpbnZva2VzIHRoaXMgYWN0aW9uIHdoaWNoIHNob3VsZAotCQkgKiBwcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZmlsZSBhbmQgcmV0dXJuIGl0LgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgcHJvbXB0WG1sRmlsZSgpIHsKLQkJCVN0cmluZyBwcm9qZWN0UGF0aD0gZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCi0JCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGdldFNoZWxsKCkpOwotCQkJZGlhbG9nLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfY2hvb3NlQUNhdGFsb2cpOwotCQkJZGlhbG9nLnNldEZpbHRlclBhdGgocHJvamVjdFBhdGgpOwotCQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHtYTUxfRklMVEVSfSk7Ci0KLQkJCXJldHVybiBkaWFsb2cub3BlbigpOwotCQl9Ci0KLQkJcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBwcm9tcHRCaW5kaW5nc0ZpbGVzKCkgewotCQkJU3RyaW5nIHByb2plY3RQYXRoPSBnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0KLQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgU1dULk1VTFRJKTsKLQkJCWRpYWxvZy5zZXRUZXh0KEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2Nob29zZUFCaW5kaW5nc0ZpbGUpOwotCQkJZGlhbG9nLnNldEZpbHRlclBhdGgocHJvamVjdFBhdGgpOwotCQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHtCSU5ESU5HU19GSUxFX0ZJTFRFUn0pOwotCi0JCQlkaWFsb2cub3BlbigpOwotCQkJU3RyaW5nIHBhdGggPSBkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpOwotCQkJU3RyaW5nW10gZmlsZU5hbWVzID0gZGlhbG9nLmdldEZpbGVOYW1lcygpOwotCQkJQXJyYXlMaXN0PFN0cmluZz4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihmaWxlTmFtZXMubGVuZ3RoKTsKLQkJCWZvcihTdHJpbmcgZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKLQkJCQlyZXN1bHRzLmFkZChwYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0czsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRDb2x1bW5zRGF0YShUYWJsZUxheW91dENvbXBvc2l0ZSBsYXlvdXQpIHsKLQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCB0cnVlKSk7Ci0JCX0KLQkJCi0JfQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIChTdHJpbmcpZWxlbWVudDsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFRhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0JCVRhYmxlQ29udGVudFByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30KLQkJCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCQkKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKENvbGxlY3Rpb248Pz4pIGlucHV0RWxlbWVudCkudG9BcnJheSgpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL1NjaGVtYVdpemFyZFBhZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL1NjaGVtYVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5MzcxYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9TY2hlbWFXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLndpemFyZHMuY2xhc3Nlc2dlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLkpwdEpheGJVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLndpemFyZHMuSmF2YVByb2plY3RXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci0KLS8qKgotICogIFNjaGVtYVdpemFyZFBhZ2UKLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYVdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQkKLQlwcml2YXRlIGZpbmFsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb247Ci0JcHJpdmF0ZSBJUHJvamVjdCB0YXJnZXRQcm9qZWN0OwotCQotCXByb3RlY3RlZCBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbCBzZWxlY3RTb3VyY2VQYW5lbDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gYnJvd3NlWFNERmlsdGVyRXh0ZW5zaW9ucyA9IHsiLnhzZCJ9OyAvLyROT04tTkxTLTEkCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2QgKioqKioqKioqKgotCQotICAgIHB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0U291cmNlU2NoZW1hRnJvbVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCVN0cmluZyBlbGVtZW50RXh0ZW5zaW9uID0gKChJRmlsZSlmaXJzdEVsZW1lbnQpLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCWlmKGVsZW1lbnRFeHRlbnNpb24gIT0gbnVsbCkgewotCQkJCWlmKGJyb3dzZVhTREZpbHRlckV4dGVuc2lvbnNbMF0uZW5kc1dpdGgoZWxlbWVudEV4dGVuc2lvbikpIHsKLQkJCQkJcmV0dXJuICgoSUZpbGUpZmlyc3RFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0gICAgCi0JU2NoZW1hV2l6YXJkUGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIoIlNjaGVtYVdpemFyZFBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJdGhpcy5pbml0aWFsU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQkKLQkvLyAqKioqKioqKioqIElEaWFsb2dQYWdlIGltcGxlbWVudGF0aW9uICAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotLy8JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBIRUxQX0NPTlRFWFRfSUQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXRoaXMuc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCXRoaXMuc2VsZWN0U291cmNlUGFuZWwgPSBuZXcgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwoY29tcG9zaXRlLCB0aGlzLmluaXRpYWxTZWxlY3Rpb24pOwotCQl0aGlzLnNlbGVjdFNvdXJjZVBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkKLQkJU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuUGFuZWxMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5QYW5lbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29tcGxldGlvblN0YXRlQ2hhbmdlZCgpIHsKLQkJCQlzZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbENoYW5nZWQoKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZih2aXNpYmxlKSB7Ci0KLQkgICAgCWlmKHRoaXMuZ2V0U291cmNlU2NoZW1hKCkgIT0gbnVsbCkgewotCSAgICAJCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0U2luZ2xlRmlsZVZpZXdEZWZhdWx0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoaXMuZ2V0U291cmNlU2NoZW1hKCkpKTsKLQkgICAgCX0KLQkgICAgCWVsc2UgewotCSAgICAJCXRoaXMudXBkYXRlVGFyZ2V0UHJvamVjdCgpOwotCQkgICAgCUlGaWxlIHNjaGVtYSA9IGdldFNvdXJjZVNjaGVtYUZyb21TZWxlY3Rpb24odGhpcy5pbml0aWFsU2VsZWN0aW9uKTsKLQkJICAgIAlpZihzY2hlbWEgIT0gbnVsbCkgewotCQkgICAgCQl0aGlzLnNlbGVjdFNvdXJjZVBhbmVsLnNldFNpbmdsZUZpbGVWaWV3RGVmYXVsdFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzY2hlbWEpKTsKLQkJICAgIAl9Ci0JCSAgICAJZWxzZSB7Ci0JCSAgICAJCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0U2luZ2xlRmlsZVZpZXdEZWZhdWx0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoaXMudGFyZ2V0UHJvamVjdCkpOwotCQkgICAgCX0KLQkgICAgCX0KLQkgICAgCXRoaXMuc2VsZWN0U291cmNlUGFuZWwudXBkYXRlKCk7Ci0JCQkKLQkJCXRoaXMuc2V0VGl0bGUoSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hV2l6YXJkUGFnZV90aXRsZSk7Ci0JCQl0aGlzLnNldERlc2NyaXB0aW9uKEpwdEpheGJVaU1lc3NhZ2VzLlNjaGVtYVdpemFyZFBhZ2VfZGVzYyk7Ci0JCQl0aGlzLnNlbGVjdFNvdXJjZVBhbmVsLnNldEZpbHRlckV4dGVuc2lvbnMoYnJvd3NlWFNERmlsdGVyRXh0ZW5zaW9ucyk7Ci0JCX0KLQkJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5zZXRWaXNpYmxlSGVscGVyKHZpc2libGUpOwotCX0KLSAgICAKLQkvLyAqKioqKioqKioqIElXaXphcmRQYWdlIGltcGxlbWVudGF0aW9uICAqKioqKioqKioqCi0gICAgCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0KLQkJcmV0dXJuIHRoaXMuc2NoZW1hT3JVcmlTZWxlY3RlZCgpICYmICh0aGlzLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpOwotCX0KLQotCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCQotCXB1YmxpYyBJRmlsZSBnZXRTb3VyY2VTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdFNvdXJjZVBhbmVsLmdldEZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZVVSSSgpIHsKLQkJU3RyaW5nIHVyaSA9IHRoaXMuc2VsZWN0U291cmNlUGFuZWwuZ2V0WE1MQ2F0YWxvZ1VSSSgpOwotCQlpZih1cmkgPT0gbnVsbCkgewotCQkJSUZpbGUgZmlsZSA9IHRoaXMuc2VsZWN0U291cmNlUGFuZWwuZ2V0RmlsZSgpOwotCQkJaWYoZmlsZSAhPSBudWxsKSB7Ci0JCQkJdXJpID0gVVJJSGVscGVyLmdldFBsYXRmb3JtVVJJKGZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRYTUxDYXRhbG9nSWQoKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdFNvdXJjZVBhbmVsLmdldFhNTENhdGFsb2dJZCgpOwotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgdXBkYXRlVGFyZ2V0UHJvamVjdCgpIHsKLSAgICAJSVdpemFyZFBhZ2UgcHJldmlvdXNQYWdlID0gdGhpcy5nZXRQcmV2aW91c1BhZ2UoKTsKLSAgICAJCi0JCWlmKHByZXZpb3VzUGFnZSBpbnN0YW5jZW9mIEphdmFQcm9qZWN0V2l6YXJkUGFnZSkgewotCQkJLy8gZ2V0IHByb2plY3QgZnJvbSBwcmV2aW91c1BhZ2UKLQkJCXRoaXMudGFyZ2V0UHJvamVjdCA9ICgoKEphdmFQcm9qZWN0V2l6YXJkUGFnZSlwcmV2aW91c1BhZ2UpLmdldEphdmFQcm9qZWN0KCkpLmdldFByb2plY3QoKTsKLQkJfQotCQllbHNlIGlmKGluaXRpYWxTZWxlY3Rpb24gIT0gbnVsbCAmJiAhIHRoaXMuaW5pdGlhbFNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCS8vIG5vIHByZXZpb3VzUGFnZSAtIGdldCBwcm9qZWN0IGZyb20gaW5pdGlhbFNlbGVjdGlvbgotCQkJdGhpcy50YXJnZXRQcm9qZWN0ID0gdGhpcy5nZXRQcm9qZWN0RnJvbUluaXRpYWxTZWxlY3Rpb24oKTsKLQkJfQkJCi0JfQotCQotICAgIHByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKCkgewotCQlPYmplY3QgZmlyc3RFbGVtZW50ID0gaW5pdGlhbFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCXJldHVybiAoSVByb2plY3QpZmlyc3RFbGVtZW50OwotCQl9Ci0JCWVsc2UgaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlyZXR1cm4gKChJUmVzb3VyY2UpIGZpcnN0RWxlbWVudCkuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCWVsc2UgaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChJSmF2YUVsZW1lbnQpZmlyc3RFbGVtZW50KS5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2NoZW1hT3JVcmlTZWxlY3RlZCgpIHsKLQkJcmV0dXJuICgodGhpcy5nZXRTb3VyY2VTY2hlbWEoKSAhPSBudWxsKSB8fCAodGhpcy5nZXRTb3VyY2VVUkkoKSAhPSBudWxsKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCVN0cmluZyB1cmkgPSB0aGlzLmdldFNvdXJjZVVSSSgpOwotCQlpZih1cmkgIT0gbnVsbCkgewotCQkJaWYoICEgVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLCBmYWxzZSkpIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFXaXphcmRQYWdlX2Vycm9yVXJpQ2Fubm90QmVMb2NhdGVkOwotCQkJfQotCQl9Ci0JCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsQ2hhbmdlZCgpIHsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IHRoaXMuY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQl0aGlzLnNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSh0aGlzLmlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL1NlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2E2ZGIxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL1NlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogQ29kZSBvcmlnaW5hdGUgZnJvbSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLmNsYXNzZXNnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuSnB0SmF4YlVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCi0JcHVibGljIGludGVyZmFjZSBQYW5lbExpc3RlbmVyIHsKLQkJdm9pZCBjb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFBhbmVsTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJvdGVjdGVkIFBhZ2VCb29rIHBhZ2VCb29rOwotCi0JcHJvdGVjdGVkIEJ1dHRvbltdIHJhZGlvQnV0dG9uOwotCXByb3RlY3RlZCBTZWxlY3RGaWxlUGFuZWwgc2VsZWN0RmlsZVBhbmVsOwotCXByb3RlY3RlZCBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCBzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbDsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQotCQkvLyBjb250YWluZXIgZ3JvdXAKLQkJc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5oZWlnaHRIaW50ID0gNDAwOwotCQlnZC53aWR0aEhpbnQgPSA0MDA7Ci0JCXNldExheW91dERhdGEoZ2QpOwotCi0JCXJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvblsyXTsKLQkJcmFkaW9CdXR0b25bMF0gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5SQURJTyk7Ci0JCXJhZGlvQnV0dG9uWzBdLnNldFRleHQoIlNlbGVjdCBmaWxlIGZyb20gV29ya3NwYWNlIik7Ci0JCXJhZGlvQnV0dG9uWzBdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyYWRpb0J1dHRvblswXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXJhZGlvQnV0dG9uWzBdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCXJhZGlvQnV0dG9uWzFdID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuUkFESU8pOwotCQlyYWRpb0J1dHRvblsxXS5zZXRUZXh0KCJTZWxlY3QgWE1MIENhdGFsb2cgZW50cnkiKTsKLQkJcmFkaW9CdXR0b25bMV0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJhZGlvQnV0dG9uWzFdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCXBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHRoaXMsIFNXVC5OT05FKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJc2VsZWN0RmlsZVBhbmVsID0gbmV3IFNlbGVjdEZpbGVQYW5lbChwYWdlQm9vaywgc2VsZWN0aW9uKTsKLQkJdGhpcy5zZXRTaW5nbGVGaWxlVmlld0RlZmF1bHRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCi0JCS8vIENhdGFsb2cKLQkJSUNhdGFsb2cgeG1sQ2F0YWxvZyA9IEpwdEpheGJVaVBsdWdpbi5pbnN0YW5jZSgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCXNlbGVjdFhNTENhdGFsb2dJZFBhbmVsID0gbmV3IFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsKHBhZ2VCb29rLCB4bWxDYXRhbG9nKTsKLQkJc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuZ2V0VGFibGVWaWV3ZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZUNvbXBsZXRpb25TdGF0ZUNoYW5nZSgpOwotCQkJfQotCQl9KTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlwYWdlQm9vay5zaG93UGFnZShzZWxlY3RGaWxlUGFuZWwuZ2V0Q29udHJvbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2luZ2xlRmlsZVZpZXdEZWZhdWx0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0RmlsZVBhbmVsLnNldERlZmF1bHRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJSUZpbGUgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJhZGlvQnV0dG9uWzBdLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlyZXN1bHQgPSBzZWxlY3RGaWxlUGFuZWwuZ2V0RmlsZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElDYXRhbG9nRW50cnkgZ2V0WE1MQ2F0YWxvZ0VudHJ5KCkgewotCQlJQ2F0YWxvZ0VudHJ5IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyYWRpb0J1dHRvblsxXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmVzdWx0ID0gc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuZ2V0WE1MQ2F0YWxvZ0VudHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFhNTENhdGFsb2dJZCgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyYWRpb0J1dHRvblsxXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmVzdWx0ID0gc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WE1MQ2F0YWxvZ1VSSSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyYWRpb0J1dHRvblsxXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmVzdWx0ID0gc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuZ2V0VVJJKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nRW50cnlUeXBlKGludCBjYXRhbG9nRW50cnlUeXBlKSB7Ci0JCXNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLnNldENhdGFsb2dFbnRyeVR5cGUoY2F0YWxvZ0VudHJ5VHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zKSB7Ci0JCXNlbGVjdEZpbGVQYW5lbC5yZXNldEZpbHRlcnMoKTsKLQkJc2VsZWN0RmlsZVBhbmVsLmFkZEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0KLQkJc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuZ2V0VGFibGVWaWV3ZXIoKS5zZXRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlckV4dGVuc2lvbnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyKFBhbmVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGVIZWxwZXIoYm9vbGVhbiBpc1Zpc2libGUpIHsKLQkJc2VsZWN0RmlsZVBhbmVsLnNldFZpc2libGVIZWxwZXIoaXNWaXNpYmxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb21wbGV0aW9uU3RhdGVDaGFuZ2UoKSB7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlsaXN0ZW5lci5jb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHJhZGlvQnV0dG9uWzBdKSB7Ci0JCQlwYWdlQm9vay5zaG93UGFnZShzZWxlY3RGaWxlUGFuZWwuZ2V0Q29udHJvbCgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXBhZ2VCb29rLnNob3dQYWdlKHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsKTsKLQkJfQotCQl1cGRhdGVDb21wbGV0aW9uU3RhdGVDaGFuZ2UoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgU2VsZWN0RmlsZVBhbmVsIGV4dGVuZHMgU2VsZWN0U2luZ2xlRmlsZVZpZXdGYWNhZGUgaW1wbGVtZW50cyBTZWxlY3RTaW5nbGVGaWxlVmlld0ZhY2FkZS5MaXN0ZW5lciB7Ci0JCXByb3RlY3RlZCBDb250cm9sIGNvbnRyb2w7Ci0KLQkJcHVibGljIFNlbGVjdEZpbGVQYW5lbChDb21wb3NpdGUgcGFyZW50LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCXN1cGVyKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQkvLyBTdHJpbmdbXSBleHQgPSB7Ii5kdGQifTsKLQkJCS8vIGFkZEZpbHRlckV4dGVuc2lvbnMoZXh0KTsKLQkJCWNvbnRyb2wgPSBjcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCQljb250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJU2VsZWN0RmlsZVBhbmVsLnRoaXMuc2V0TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQkJcmV0dXJuIGNvbnRyb2w7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDb250cm9sQ29tcGxldGUoYm9vbGVhbiBpc0NvbXBsZXRlKSB7Ci0JCQl1cGRhdGVDb21wbGV0aW9uU3RhdGVDaGFuZ2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL1NlbGVjdFNpbmdsZUZpbGVWaWV3RmFjYWRlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9TZWxlY3RTaW5nbGVGaWxlVmlld0ZhY2FkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODgwOTVlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL1NlbGVjdFNpbmdsZUZpbGVWaWV3RmFjYWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5jbGFzc2VzZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBTZWxlY3RTaW5nbGVGaWxlVmlldwotICogIAotICogIEZh52FkZSBjbGFzcyB0byBjaGFuZ2UgYWNjZXNzaWJpbGl0eSBvZiBTZWxlY3RTaW5nbGVGaWxlVmlldy4KLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFNpbmdsZUZpbGVWaWV3RmFjYWRlIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLlNlbGVjdFNpbmdsZUZpbGVWaWV3IHsKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIExpc3RlbmVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLlNlbGVjdFNpbmdsZUZpbGVWaWV3Lkxpc3RlbmVyCi0Je30KLQotCXB1YmxpYyBTZWxlY3RTaW5nbGVGaWxlVmlld0ZhY2FkZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gaXNGaWxlTWFuZGF0b3J5KSB7Ci0JCXN1cGVyKHNlbGVjdGlvbiwgaXNGaWxlTWFuZGF0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMpIHsKLQkJc3VwZXIuYWRkRmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0RmlsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0RmlsdGVycygpIHsKLQkJc3VwZXIucmVzZXRGaWx0ZXJzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZpc2libGVIZWxwZXIoYm9vbGVhbiBpc1Zpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZUhlbHBlcihpc1Zpc2libGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyLnNldERlZmF1bHRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2NsYXNzZXNnZW4vU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL1NlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NDVkMGEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2NsYXNzZXNnZW4vU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBDb2RlIG9yaWdpbmF0ZSBmcm9tIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLndpemFyZHMuY2xhc3Nlc2dlbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5KcHRKYXhiVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgaW50IGNhdGFsb2dFbnRyeVR5cGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZG9UYWJsZVNpemVIYWNrID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBJQ2F0YWxvZyBmWG1sQ2F0YWxvZzsKLQotCXB1YmxpYyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbChDb21wb3NpdGUgcGFyZW50LCBJQ2F0YWxvZyB4bWxDYXRhbG9nKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLmZYbWxDYXRhbG9nID0geG1sQ2F0YWxvZzsKLQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQl0aGlzLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJZ2Qud2lkdGhIaW50ID0gNzAwOwotCQl0aGlzLnNldExheW91dERhdGEoZ2QpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFXaXphcmRQYWdlX3htbENhdGFsb2dUYWJsZVRpdGxlKTsKLQotCQl0YWJsZVZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKHRoaXMpOwotCQl0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KCJkdW1teSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFhNTENhdGFsb2dUYWJsZVZpZXdlciBjcmVhdGVUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVN0cmluZyBoZWFkaW5nc1tdID0gbmV3IFN0cmluZ1syXTsKLQkJaGVhZGluZ3NbMF0gPSBKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFXaXphcmRQYWdlX3htbENhdGFsb2dLZXlDb2x1bW47Ci0JCWhlYWRpbmdzWzFdID0gSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hV2l6YXJkUGFnZV94bWxDYXRhbG9nVXJpQ29sdW1uOwotCi0JCVhNTENhdGFsb2dUYWJsZVZpZXdlciB0aGVUYWJsZVZpZXdlciA9IG5ldyBYTUxDYXRhbG9nVGFibGVWaWV3ZXIocGFyZW50LCBoZWFkaW5ncykgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRYTUxDYXRhbG9nRW50cmllcyhMaXN0IGxpc3QsIElDYXRhbG9nRW50cnlbXSBlbnRyaWVzKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlDYXRhbG9nRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJCQlpZiAoY2F0YWxvZ0VudHJ5VHlwZSA9PSAwKSB7Ci0JCQkJCQlsaXN0LmFkZChlbnRyeSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY2F0YWxvZ0VudHJ5VHlwZSA9PSBlbnRyeS5nZXRFbnRyeVR5cGUoKSkgewotCQkJCQkJbGlzdC5hZGQoZW50cnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRYTUxDYXRhbG9nRW50cmllcygpIHsKLQkJCQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0KLQkJCQlpZiAoKGZYbWxDYXRhbG9nID09IG51bGwpIHx8IGRvVGFibGVTaXplSGFjaykgewotCQkJCQkvLyB0aGlzIGxldHMgdXMgY3JlYXRlIGEgdGFibGUgd2l0aCBhbiBpbml0aWFsIGhlaWdodCBvZgotCQkJCQkvLyAxMCByb3dzCi0JCQkJCS8vIG90aGVyd2lzZSB3ZSBnZXQgc3R1Y2sgd2l0aCAwIHJvdyBoZWlnaCB0YWJsZS4uLiB0aGF0J3MKLQkJCQkJLy8gdG9vIHNtYWxsCi0JCQkJCWRvVGFibGVTaXplSGFjayA9IGZhbHNlOwotCQkJCQlyZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JCQkJCQlyZXN1bHQuYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJCUlOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGZYbWxDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykgewotCQkJCQkJSU5leHRDYXRhbG9nIGNhdGFsb2cgPSBuZXh0Q2F0YWxvZ3NbaV07Ci0JCQkJCQlJQ2F0YWxvZyByZWZlcmVuY2VkQ2F0YWxvZyA9IGNhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCQkJCWlmIChyZWZlcmVuY2VkQ2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKEpwdEpheGJVaVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpIHsKLQkJCQkJCQkJSUNhdGFsb2cgc3lzdGVtQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotCQkJCQkJCQlhZGRYTUxDYXRhbG9nRW50cmllcyhyZXN1bHQsIHN5c3RlbUNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKSk7Ci0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAoSnB0SmF4YlVpUGx1Z2luLlVTRVJfQ0FUQUxPR19JRC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpIHsKLQkJCQkJCQkJSUNhdGFsb2cgdXNlckNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLQkJCQkJCQkJYWRkWE1MQ2F0YWxvZ0VudHJpZXMocmVzdWx0LCB1c2VyQ2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpKTsKLQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9OwotCQlyZXR1cm4gdGhlVGFibGVWaWV3ZXI7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gZ2V0WE1MQ2F0YWxvZ0VudHJ5KCk7Ci0JCXJldHVybiBlbnRyeSAhPSBudWxsID8gZW50cnkuZ2V0S2V5KCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBYTUxDYXRhbG9nVGFibGVWaWV3ZXIgZ2V0VGFibGVWaWV3ZXIoKSB7Ci0JCXJldHVybiB0YWJsZVZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGdldFhNTENhdGFsb2dFbnRyeSgpOwotCQlyZXR1cm4gZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldFVSSSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2dFbnRyeSBnZXRYTUxDYXRhbG9nRW50cnkoKSB7Ci0JCUlDYXRhbG9nRW50cnkgcmVzdWx0ID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQlyZXN1bHQgPSAoSUNhdGFsb2dFbnRyeSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nRW50cnlUeXBlKGludCBjYXRhbG9nRW50cnlUeXBlKSB7Ci0JCXRoaXMuY2F0YWxvZ0VudHJ5VHlwZSA9IGNhdGFsb2dFbnRyeVR5cGU7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9YTUxDYXRhbG9nVGFibGVWaWV3ZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTI0ZjFjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIENvZGUgb3JpZ2luYXRlIGZyb20gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5jbGFzc2VzZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5KcHRKYXhiVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nVGFibGVWaWV3ZXIgZXh0ZW5kcyBUYWJsZVZpZXdlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBFUlJPUl9TVEFURV9LRVkgPSAiZXJyb3JzdGF0ZWtleSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZHRkRmlsZUltYWdlID0gSnB0SmF4YlVpUGx1Z2luLmdldEltYWdlKCJpY29ucy9mdWxsL29iajE2L2R0ZGZpbGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIHVua25vd25GaWxlSW1hZ2UgPSBKcHRKYXhiVWlQbHVnaW4uZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvdGV4dC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgeHNkRmlsZUltYWdlID0gSnB0SmF4YlVpUGx1Z2luLmdldEltYWdlKCJpY29ucy9mdWxsL29iajE2L1hTREZpbGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGVycm9ySW1hZ2UgPSBKcHRKYXhiVWlQbHVnaW4uZ2V0SW1hZ2UoImljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBYTUxDYXRhbG9nVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gY29sdW1uUHJvcGVydGllcykgewotCQlzdXBlcihwYXJlbnQsIFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJVGFibGUgdGFibGUgPSBnZXRUYWJsZSgpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Qcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIGkpOwotCQkJY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc1tpXSk7Ci0JCQljb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCB0cnVlKSk7Ci0JCX0KLQkJdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0KLQkJc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLQotCQlzZXRDb250ZW50UHJvdmlkZXIobmV3IENhdGFsb2dFbnRyeUNvbnRlbnRQcm92aWRlcigpKTsKLQkJc2V0TGFiZWxQcm92aWRlcihuZXcgQ2F0YWxvZ0VudHJ5TGFiZWxQcm92aWRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRYTUxDYXRhbG9nRW50cmllcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiaGVsbG8iKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJ1biEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCQltZW51TWFuYWdlci5hZGQoYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGV4dGVuc2lvbnMpIHsKLQkJcmVzZXRGaWx0ZXJzKCk7Ci0JCWFkZEZpbHRlcihuZXcgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyKGV4dGVuc2lvbnMpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCXB1YmxpYyBjbGFzcyBDYXRhbG9nRW50cnlDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQkJT2JqZWN0W10gYXJyYXkgPSBnZXRYTUxDYXRhbG9nRW50cmllcygpLnRvQXJyYXkoKTsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQlpbnQgcmVzdWx0ID0gMDsKLQkJCQkJaWYgKChvMSBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpICYmIChvMiBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpKSB7Ci0JCQkJCQlJQ2F0YWxvZ0VudHJ5IG1hcHBpbmdJbmZvMSA9IChJQ2F0YWxvZ0VudHJ5KSBvMTsKLQkJCQkJCUlDYXRhbG9nRW50cnkgbWFwcGluZ0luZm8yID0gKElDYXRhbG9nRW50cnkpIG8yOwotCQkJCQkJcmVzdWx0ID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKG1hcHBpbmdJbmZvMS5nZXRLZXkoKSwgbWFwcGluZ0luZm8yLmdldEtleSgpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX07Ci0JCQlBcnJheXMuc29ydChhcnJheSwgY29tcGFyYXRvcik7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZCwgT2JqZWN0IG5ld29iaikgewotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBDYXRhbG9nRW50cnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUltYWdlIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCUltYWdlIGJhc2UgPSBudWxsOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIG9iamVjdDsKLQkJCQkJU3RyaW5nIHVyaSA9IGNhdGFsb2dFbnRyeS5nZXRVUkkoKTsKLQkJCQkJaWYgKHVyaS5lbmRzV2l0aCgiZHRkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYmFzZSA9IGR0ZEZpbGVJbWFnZTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICh1cmkuZW5kc1dpdGgoInhzZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJhc2UgPSB4c2RGaWxlSW1hZ2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQliYXNlID0gdW5rbm93bkZpbGVJbWFnZTsKLQkJCQkJfQotCi0JCQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkJCWlmIChVUklIZWxwZXIuaXNSZWFkYWJsZVVSSSh1cmksIGZhbHNlKSkgewotCQkJCQkJCXJlc3VsdCA9IGJhc2U7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBUT0RPLi4uIFNTRSBwb3J0Ci0JCQkJCQkJcmVzdWx0ID0gYmFzZTsvLyBpbWFnZUZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlSW1hZ2UoYmFzZSwKLQkJCQkJCQkvLyBlcnJvckltYWdlLAotCQkJCQkJCS8vIEltYWdlRmFjdG9yeS5CT1RUT01fTEVGVCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIG9iamVjdDsKLQkJCQlyZXN1bHQgPSBjb2x1bW5JbmRleCA9PSAwID8gY2F0YWxvZ0VudHJ5LmdldEtleSgpIDogY2F0YWxvZ0VudHJ5LmdldFVSSSgpOwotCQkJCXJlc3VsdCA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wocmVzdWx0KTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQljbGFzcyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCQlwcm90ZWN0ZWQgU3RyaW5nW10gZXh0ZW5zaW9uczsKLQotCQlwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMpIHsKLQkJCXRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBPYmplY3QgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIGVsZW1lbnQ7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChjYXRhbG9nRW50cnkuZ2V0VVJJKCkuZW5kc1dpdGgoZXh0ZW5zaW9uc1tpXSkpIHsKLQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvZmFjZXQvSmF4YkZhY2V0SW5zdGFsbFBhZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9mYWNldC9KYXhiRmFjZXRJbnN0YWxsUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGZiODk2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9mYWNldC9KYXhiRmFjZXRJbnN0YWxsUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5KcHRKYXhiVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5mYWNldC5tb2RlbC5KYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxpYnJhcnlJbnN0YWxsRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmxpYnByb3YuTGlicmFyeVByb3ZpZGVyRnJhbWV3b3JrVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLkRhdGFNb2RlbEZhY2V0SW5zdGFsbFBhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEpheGJGYWNldEluc3RhbGxQYWdlCi0JCWV4dGVuZHMgRGF0YU1vZGVsRmFjZXRJbnN0YWxsUGFnZQotCQlpbXBsZW1lbnRzIEpheGJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkKLQlwdWJsaWMgSmF4YkZhY2V0SW5zdGFsbFBhZ2UoKSB7Ci0JCXN1cGVyKCJqcHQuamF4Yi5mYWNldC5pbnN0YWxsLnBhZ2UiKTsKLQkJc2V0VGl0bGUoSnB0SmF4YlVpTWVzc2FnZXMuSmF4YkZhY2V0V2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEpwdEpheGJVaU1lc3NhZ2VzLkpheGJGYWNldFdpemFyZFBhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKcHRKYXhiVWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdEpheGJVaUljb25zLkpBWEJfV0laX0JBTk5FUikpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRDb25maWcoT2JqZWN0IGNvbmZpZykgewotCQlpZiAoISAoY29uZmlnIGluc3RhbmNlb2YgSURhdGFNb2RlbCkpIHsKLQkJCWNvbmZpZyA9IFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkubG9hZEFkYXB0ZXIoY29uZmlnLCBJRGF0YU1vZGVsLmNsYXNzLmdldE5hbWUoKSk7Ci0JCX0KLQkJc3VwZXIuc2V0Q29uZmlnKGNvbmZpZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlhZGRTdWJDb21wb3NpdGVzKGNvbXBvc2l0ZSk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0vLwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIEpwYUhlbHBDb250ZXh0SWRzLkRJQUxPR19KUEFfRkFDRVQpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgIGFkZFN1YkNvbXBvc2l0ZXMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQluZXcgUGxhdGZvcm1Hcm91cChjb21wb3NpdGUpOwotCQluZXcgQ2xhc3NwYXRoQ29uZmlnR3JvdXAoY29tcG9zaXRlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuTk9ORSB8IHN0eWxlKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIGJvb2xlYW4gZmlsbEhvcml6b250YWwpIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oY29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBnZDsKLQkJaWYgKGZpbGxIb3Jpem9udGFsKSB7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQl9Ci0JCWVsc2UgewotCQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJfQotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0JCQkJUExBVEZPUk0sCi0JCQkJTElCUkFSWV9JTlNUQUxMX0RFTEVHQVRFCi0JCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKCEgc3VwZXIuaXNQYWdlQ29tcGxldGUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJSVN0YXR1cyBzdGF0dXMgPSB0aGlzLm1vZGVsLnZhbGlkYXRlKCk7IAotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfTsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmICh2aXNpYmxlKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gZ2V0SGVscFN5c3RlbSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgZmluYWwgY2xhc3MgUGxhdGZvcm1Hcm91cAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBwbGF0Zm9ybUNvbWJvOwotCQkKLQkJCi0JCXB1YmxpYyBQbGF0Zm9ybUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChKcHRKYXhiVWlNZXNzYWdlcy5KYXhiRmFjZXRXaXphcmRQYWdlX3BsYXRmb3JtTGFiZWwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0vLwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLkRJQUxPR19KUEFfUExBVEZPUk0pOwotCi0JCQl0aGlzLnBsYXRmb3JtQ29tYm8gPSBjcmVhdGVDb21ibyhncm91cCwgMSwgdHJ1ZSk7Ci0JCQlKYXhiRmFjZXRJbnN0YWxsUGFnZS50aGlzLnN5bmNoSGVscGVyLnN5bmNoQ29tYm8ocGxhdGZvcm1Db21ibywgUExBVEZPUk0sIG51bGwpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBmaW5hbCBjbGFzcyBDbGFzc3BhdGhDb25maWdHcm91cCB7Ci0JCQotCQlwdWJsaWMgQ2xhc3NwYXRoQ29uZmlnR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJCi0JCQlMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGxpYnJhcmllc0luc3RhbGxEZWxlZ2F0ZQotCQkJCQk9IChMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKSBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUpOwotCQkJCi0JCQlDb21wb3NpdGUgbGlicmFyaWVzQ29tcG9zaXRlIAotCQkJCQk9IChDb21wb3NpdGUpIExpYnJhcnlQcm92aWRlckZyYW1ld29ya1VpLmNyZWF0ZUluc3RhbGxMaWJyYXJ5UGFuZWwoCi0JCQkJCQkJY29tcG9zaXRlLCBsaWJyYXJpZXNJbnN0YWxsRGVsZWdhdGUsIAotCQkJCQkJCUpwdEpheGJVaU1lc3NhZ2VzLkpheGJGYWNldFdpemFyZFBhZ2VfamF4YkltcGxlbWVudGF0aW9uTGFiZWwpOwotCQkJbGlicmFyaWVzQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotLy8JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGxpYnJhcmllc0NvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9DTEFTU1BBVEgpOwkJCQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2ZhY2V0L21vZGVsL0pheGJGYWNldEluc3RhbGxDb25maWdUb0RhdGFNb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvZmFjZXQvbW9kZWwvSmF4YkZhY2V0SW5zdGFsbENvbmZpZ1RvRGF0YU1vZGVsQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwZGY2Mi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvZmFjZXQvbW9kZWwvSmF4YkZhY2V0SW5zdGFsbENvbmZpZ1RvRGF0YU1vZGVsQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5mYWNldC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldC5KYXhiRmFjZXRJbnN0YWxsQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBKYXhiRmFjZXRJbnN0YWxsQ29uZmlnVG9EYXRhTW9kZWxBZGFwdGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBBREFQVEVSX0xJU1QgPSBuZXcgQ2xhc3NbXSB7IElEYXRhTW9kZWwuY2xhc3MgfTsKLQotCXB1YmxpYyBDbGFzczw/PltdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gQURBUFRFUl9MSVNUOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iaiwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IElEYXRhTW9kZWwuY2xhc3MpIHsKLQkJCUpheGJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBwcm92aWRlciAKLQkJCQkJPSBuZXcgSmF4YkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKChKYXhiRmFjZXRJbnN0YWxsQ29uZmlnKSBhZGFwdGFibGVPYmopOwotCQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKCBwcm92aWRlciApOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvZmFjZXQvbW9kZWwvSmF4YkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9mYWNldC9tb2RlbC9KYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTI4ODllLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9mYWNldC9tb2RlbC9KYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLmZhY2V0Lm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBKYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyAKLQkJZXh0ZW5kcyBJRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYQl9GQUNFVF9JTlNUQUxMX0NPTkZJRyAKLQkJCT0gIkpheGJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfRkFDRVRfSU5TVEFMTF9DT05GSUciOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk0KLQkJCT0gIkpheGJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfSU5TVEFMTF9ERUxFR0FURQotCQkJPSAiSmF4YkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuTElCUkFSWV9JTlNUQUxMX0RFTEVHQVRFIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2ZhY2V0L21vZGVsL0pheGJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2ZhY2V0L21vZGVsL0pheGJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQxZmE4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9mYWNldC9tb2RlbC9KYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLndpemFyZHMuZmFjZXQubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZmFjZXQuSmF4YkZhY2V0SW5zdGFsbENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLkpwdEpheGJVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeUluc3RhbGxEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgSmF4YkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyCi0JCWV4dGVuZHMgRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgCi0JCWltcGxlbWVudHMgSmF4YkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gRU1QVFlfRE1QRF9BUlJBWSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbMF07Ci0JCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4gRE1QRF9DT01QQVJBVE9SID0KLQkJCW5ldyBDb21wYXJhdG9yPERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4oKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkbXBkMSwgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGRtcGQyKSB7Ci0JCQkJCXJldHVybiBkbXBkMS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkuY29tcGFyZVRvKGRtcGQyLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIElTdGF0dXMgYnVpbGRFcnJvclN0YXR1cyhTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gYnVpbGRTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgSVN0YXR1cyBidWlsZFN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBKcHRKYXhiVWlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBKYXhiRmFjZXRJbnN0YWxsQ29uZmlnIGNvbmZpZzsKLQkKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY29uZmlnTGlzdGVuZXI7Ci0JCi0JCi0JcHVibGljIEpheGJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJdGhpcyhuZXcgSmF4YkZhY2V0SW5zdGFsbENvbmZpZygpKTsKLQl9Ci0JCi0JcHVibGljIEpheGJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcihKYXhiRmFjZXRJbnN0YWxsQ29uZmlnIGNvbmZpZykgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5jb25maWdMaXN0ZW5lciA9IGJ1aWxkQ29uZmlnTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25maWcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzLmNvbmZpZ0xpc3RlbmVyKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDb25maWdMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKLQkJCQlpZiAoZXZ0LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhKYXhiRmFjZXRJbnN0YWxsQ29uZmlnLkZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFlfUFJPUEVSVFkpKSB7Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCW5hbWVzLmFkZChKQVhCX0ZBQ0VUX0lOU1RBTExfQ09ORklHKTsKLQkJbmFtZXMuYWRkKFBMQVRGT1JNKTsKLQkJbmFtZXMuYWRkKExJQlJBUllfSU5TVEFMTF9ERUxFR0FURSk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQlnZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShKQVhCX0ZBQ0VUX0lOU1RBTExfQ09ORklHLCB0aGlzLmNvbmZpZyk7Ci0JCWlmICh0aGlzLmNvbmZpZy5nZXRQbGF0Zm9ybSgpICE9IG51bGwpIHsKLQkJCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KFBMQVRGT1JNLCB0aGlzLmNvbmZpZy5nZXRQbGF0Zm9ybSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29uZmlnLnNldFBsYXRmb3JtKGdldERlZmF1bHRQbGF0Zm9ybSgpKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZBQ0VUX0lEKSkgewotCQkJcmV0dXJuIEpheGJGYWNldC5JRDsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBMQVRGT1JNKSkgewotCQkJcmV0dXJuIGdldERlZmF1bHRQbGF0Zm9ybSgpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTElCUkFSWV9JTlNUQUxMX0RFTEVHQVRFKSkgewotCQkJLy8gbWVhbnMgdGhhdCBsaWJyYXJ5IGluc3RhbGwgZGVsZWdhdGUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkCi0JCQlMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGxpZCA9IGJ1aWxkTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpOwotCQkJc2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZShsaWQpOwotCQkJcmV0dXJuIGxpZDsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVmYXVsdFBsYXRmb3JtKCkgewotCQlyZXR1cm4gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0RGVmYXVsdFBsYXRmb3JtKGdldFByb2plY3RGYWNldFZlcnNpb24oKSk7Ci0JfQotCQotCXByb3RlY3RlZCAgTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBidWlsZExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoKSB7Ci0JCUlGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjID0gdGhpcy5nZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCk7Ci0JCWlmIChmcGp3YyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBwZnYgPSB0aGlzLmdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLQkJaWYgKHBmdiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGxpZCA9IG5ldyBMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKGZwandjLCBwZnYpOwotCQlsaWQuYWRkTGlzdGVuZXIoYnVpbGRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlTGlzdGVuZXIoKSk7Ci0JCXJldHVybiBsaWQ7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZExpYnJhcnlJbnN0YWxsRGVsZWdhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSApIHsKLQkJCQkJaWYgKExpYnJhcnlJbnN0YWxsRGVsZWdhdGUuUFJPUF9BVkFJTEFCTEVfUFJPVklERVJTLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCQkJCWFkanVzdExpYnJhcnlQcm92aWRlcnMoKTsKLQkJCQkJfQotCQkJCQlKYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIudGhpcy5nZXREYXRhTW9kZWwoKS5ub3RpZnlQcm9wZXJ0eUNoYW5nZSgKLQkJCQkJCQlMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUsIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJCQl9Ci0JCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlib29sZWFuIG9rID0gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZBQ0VUX1ZFUlNJT04pKSB7Ci0JCQlhZGp1c3RMaWJyYXJ5UHJvdmlkZXJzKCk7Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFBMQVRGT1JNLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCWlmIChnZXRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKCkuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpLmVxdWFscyhnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkpKSB7Ci0JCQkJZ2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpLmRpc3Bvc2UoKTsKLQkJCQlzZXRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKGJ1aWxkTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkpKSB7Ci0JCQlnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCkuYWRkTGlzdGVuZXIoCi0JCQkJbmV3IElGYWNldGVkUHJvamVjdExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCkgewotCQkJCQkJTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBsaWQgPSBnZXRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKCk7Ci0JCQkJCQlpZiAobGlkICE9IG51bGwpIHsKLQkJCQkJCQkvLyBtYXkgYmUgbnVsbCB3aGlsZSBtb2RlbCBpcyBiZWluZyBidWlsdCB1cAotCQkJCQkJCS8vIC4uLiBvciBpbiB0ZXN0cwotCQkJCQkJCWxpZC5yZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9LAotCQkJCUlGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJJTUFSWV9SVU5USU1FX0NIQU5HRUQpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSkFYQl9GQUNFVF9JTlNUQUxMX0NPTkZJRykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBMQVRGT1JNKSkgewotCQkJdGhpcy5jb25maWcuc2V0UGxhdGZvcm0oKEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uKSBwcm9wZXJ0eVZhbHVlKTsKLQkJCWFkanVzdExpYnJhcnlQcm92aWRlcnMoKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExJQlJBUllfSU5TVEFMTF9ERUxFR0FURSkpIHsKLQkJCXRoaXMuY29uZmlnLnNldExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoKExpYnJhcnlJbnN0YWxsRGVsZWdhdGUpIHByb3BlcnR5VmFsdWUpOwotCQl9Ci0JCQotCQlyZXR1cm4gb2s7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQTEFURk9STSkpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkVmFsaWRQbGF0Zm9ybURlc2NyaXB0b3JzKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGJ1aWxkVmFsaWRQbGF0Zm9ybURlc2NyaXB0b3JzKCkgewotCQlJdGVyYWJsZTxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbj4gdmFsaWRQbGF0Zm9ybURlc2NyaXB0aW9ucyA9IGJ1aWxkVmFsaWRQbGF0Zm9ybURlc2NyaXB0aW9ucygpOwotCQlJdGVyYWJsZTxEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I+IHZhbGlkUGxhdGZvcm1EZXNjcmlwdG9ycyA9Ci0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24sIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4odmFsaWRQbGF0Zm9ybURlc2NyaXB0aW9ucykgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciB0cmFuc2Zvcm0oSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJCQkJCXJldHVybiBidWlsZFBsYXRmb3JtRGVzY3JpcHRvcihkZXNjcmlwdGlvbik7Ci0JCQkJCX0KLQkJCQl9OwotCQlyZXR1cm4gQXJyYXlUb29scy5zb3J0KEFycmF5VG9vbHMuYXJyYXkodmFsaWRQbGF0Zm9ybURlc2NyaXB0b3JzLCBFTVBUWV9ETVBEX0FSUkFZKSwgRE1QRF9DT01QQVJBVE9SKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uPiBidWlsZFZhbGlkUGxhdGZvcm1EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24+KAotCQkJCUpwdEpheGJDb3JlUGx1Z2luLmdldEpheGJQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKYXhiUGxhdGZvcm1zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIG8pIHsKLQkJCQlyZXR1cm4gby5zdXBwb3J0c0pheGJGYWNldFZlcnNpb24oZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQTEFURk9STSkpIHsKLQkJCXJldHVybiBidWlsZFBsYXRmb3JtRGVzY3JpcHRvcihnZXRQbGF0Zm9ybSgpKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGJ1aWxkUGxhdGZvcm1EZXNjcmlwdG9yKEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGRlc2MpIHsKLQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IoZGVzYywgZGVzYy5nZXRMYWJlbCgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQTEFURk9STSkpIHsKLQkJCXJldHVybiB2YWxpZGF0ZVBsYXRmb3JtKCk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTElCUkFSWV9JTlNUQUxMX0RFTEVHQVRFKSkgewotCQkgICAgcmV0dXJuIGdldExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoKS52YWxpZGF0ZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIChnZXRQbGF0Zm9ybSgpID09IG51bGwpID8gCi0JCQkJYnVpbGRFcnJvclN0YXR1cyhKcHRKYXhiVWlNZXNzYWdlcy5KYXhiRmFjZXREYXRhTW9kZWxfdmFsaWRhdGVQbGF0Zm9ybU5vdFNwZWNpZmllZCkgCi0JCQkJOiBPS19TVEFUVVM7Ci0JfQotCQotCXByb3RlY3RlZCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSB0aGlzLmNvbmZpZy5nZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCk7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSB0aGlzLmNvbmZpZy5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIChKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbikgZ2V0UHJvcGVydHkoUExBVEZPUk0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBnZXRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKCkgewotCQlyZXR1cm4gKExpYnJhcnlJbnN0YWxsRGVsZWdhdGUpIGdldFByb3BlcnR5KExJQlJBUllfSU5TVEFMTF9ERUxFR0FURSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBsaWQpIHsKLQkJZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoTElCUkFSWV9JTlNUQUxMX0RFTEVHQVRFLCBsaWQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGp1c3RMaWJyYXJ5UHJvdmlkZXJzKCkgewotCQlMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGxpZCA9IGdldExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoKTsKLQkJaWYgKGxpZCAhPSBudWxsKSB7Ci0vLwkJCUxpc3Q8SnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZz4ganBhQ29uZmlncyAKLS8vCQkJCQk9IG5ldyBBcnJheUxpc3Q8SnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZz4oKTsKLS8vCQkJLy8gYWRkIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb25lIGZpcnN0Ci0vLwkJCUpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY3VycmVudEpwYUNvbmZpZyA9IG51bGw7Ci0vLwkJCUxpYnJhcnlQcm92aWRlck9wZXJhdGlvbkNvbmZpZyBjb25maWcgPSBsaWQuZ2V0TGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uQ29uZmlnKCk7Ci0vLwkJCWlmIChjb25maWcgaW5zdGFuY2VvZiBKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSB7Ci0vLwkJCQljdXJyZW50SnBhQ29uZmlnID0gKEpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIGNvbmZpZzsKLS8vCQkJCWpwYUNvbmZpZ3MuYWRkKGN1cnJlbnRKcGFDb25maWcpOwotLy8JCQl9Ci0vLwkJCWZvciAoSUxpYnJhcnlQcm92aWRlciBscCA6IGxpZC5nZXRMaWJyYXJ5UHJvdmlkZXJzKCkpIHsKLS8vCQkJCWNvbmZpZyA9IGxpZC5nZXRMaWJyYXJ5UHJvdmlkZXJPcGVyYXRpb25Db25maWcobHApOwotLy8JCQkJaWYgKGNvbmZpZyBpbnN0YW5jZW9mIEpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcKLS8vCQkJCQkJJiYgISBjb25maWcuZXF1YWxzKGN1cnJlbnRKcGFDb25maWcpKSB7Ci0vLwkJCQkJanBhQ29uZmlncy5hZGQoKEpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIGNvbmZpZyk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJZm9yIChKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGpwYUNvbmZpZyA6IGpwYUNvbmZpZ3MpIHsKLS8vCQkJCWpwYUNvbmZpZy5zZXRKcGFQbGF0Zm9ybUlkKGdldFBsYXRmb3JtSWQoKSk7Ci0vLwkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCXRoaXMuY29uZmlnLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcy5jb25maWdMaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovSmF4YlByb2plY3RXaXphcmQuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9wcm9qL0pheGJQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZmY2YTguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovSmF4YlByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5wcm9qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLnByb2oubW9kZWwuSmF4YlByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdQcm9qZWN0RGF0YU1vZGVsRmFjZXRXaXphcmQ7Ci0KLQotcHVibGljIGNsYXNzIEpheGJQcm9qZWN0V2l6YXJkCi0JCWV4dGVuZHMgTmV3UHJvamVjdERhdGFNb2RlbEZhY2V0V2l6YXJkIHsKLQkKLQlwdWJsaWMgSmF4YlByb2plY3RXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEpwdEpheGJVaU1lc3NhZ2VzLkpheGJQcm9qZWN0V2l6YXJkX3RpdGxlKTsKLQl9Ci0JCi0JcHVibGljIEpheGJQcm9qZWN0V2l6YXJkKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0JCXNldFdpbmRvd1RpdGxlKEpwdEpheGJVaU1lc3NhZ2VzLkpheGJQcm9qZWN0V2l6YXJkX3RpdGxlKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIEpwdFVpUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihKcHRKYXhiVWlJY29ucy5KQVhCX1dJWl9CQU5ORVIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVdpemFyZFBhZ2UgY3JlYXRlRmlyc3RQYWdlKCkgewotCQlyZXR1cm4gbmV3IEpheGJQcm9qZWN0V2l6YXJkRmlyc3RQYWdlKG1vZGVsLCAiZmlyc3QucGFnZSIpOyAvLyROT04tTkxTLTEkIAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSmF4YlByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgZ2V0VGVtcGxhdGUoKSB7Ci0JCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSgianB0LmpheGIudGVtcGxhdGUiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvcHJvai9KYXhiUHJvamVjdFdpemFyZEZpcnN0UGFnZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovSmF4YlByb2plY3RXaXphcmRGaXJzdFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExZWMwNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvcHJvai9KYXhiUHJvamVjdFdpemFyZEZpcnN0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLnByb2o7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5EYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZTsKLQotCi1wdWJsaWMgY2xhc3MgSmF4YlByb2plY3RXaXphcmRGaXJzdFBhZ2UKLQkJZXh0ZW5kcyBEYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZSB7Ci0JCi0JcHVibGljIEpheGJQcm9qZWN0V2l6YXJkRmlyc3RQYWdlKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIoZGF0YU1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEpwdEpheGJVaU1lc3NhZ2VzLkpheGJQcm9qZWN0V2l6YXJkX2ZpcnN0UGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEpwdEpheGJVaU1lc3NhZ2VzLkpheGJQcm9qZWN0V2l6YXJkX2ZpcnN0UGFnZV9kZXNjKTsKLQkJLy9zZXRJbmZvcG9wSUQoSnBhSmF4YkhlbHBDb250ZXh0SWRzLk5FV19KQVhCX1BST0pFQ1QpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQ29tcG9zaXRlIHRvcCA9IHN1cGVyLmNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWNyZWF0ZVdvcmtpbmdTZXRHcm91cFBhbmVsKHRvcCwgbmV3IFN0cmluZ1tdIHsgUkVTT1VSQ0VfV09SS0lOR19TRVQsIEpBVkFfV09SS0lOR19TRVQgfSk7Ci0JCXJldHVybiB0b3A7Ci0JfQotCQotLy8JQE92ZXJyaWRlCi0vLwlwdWJsaWMgYm9vbGVhbiBpbnRlcm5hbExhdW5jaE5ld1J1bnRpbWVXaXphcmQoU2hlbGwgc2hlbGwsIElEYXRhTW9kZWwgbW9kZWwpIHsKLS8vCQlJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcHdjID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSBtb2RlbC5nZXRQcm9wZXJ0eShGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZKTsKLS8vCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBtb2R1bGVGYWNldCA9IEZhY2V0VG9vbHMuZ2V0TW9kdWxlRmFjZXQoZnB3Yyk7Ci0vLwkJaWYgKG1vZHVsZUZhY2V0ICE9IG51bGwpIHsKLS8vCQkJcmV0dXJuIGxhdW5jaE5ld1J1bnRpbWVXaXphcmQoc2hlbGwsIG1vZGVsLCBtb2R1bGVGYWNldC5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpKTsKLS8vCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCXJldHVybiBsYXVuY2hOZXdSdW50aW1lV2l6YXJkKHNoZWxsLCBtb2RlbCk7Ci0vLwkJfQotLy8JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlVHlwZUlEKCkgewotCQlyZXR1cm4gSmF4YkZhY2V0LklEOwotCX0KLQkKLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLSAgICAJc3VwZXIuc3RvcmVEZWZhdWx0U2V0dGluZ3MoKTsKLSAgICAJLy8gVE9ETwotLy8gICAgCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0vLyAgICAJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLS8vICAgIAkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKW1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLS8vICAgIAkJU3RyaW5nIGZhY2V0SUQgPSBnZXRNb2R1bGVGYWNldElEKCk7Ci0vLyAgICAJCUlEYXRhTW9kZWwgajJlZU1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKGZhY2V0SUQpOwotLy8gICAgCQlpZihqMmVlTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSKSl7Ci0vLyAgICAJCQlTdHJpbmcgbGFzdEVBUk5hbWUgPSBqMmVlTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUpOwotLy8gICAgCQkJc2V0dGluZ3MucHV0KFNUT1JFX0xBQkVMLCBsYXN0RUFSTmFtZSk7Ci0vLyAgICAJCX0KLS8vICAgIAl9Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0gICAgCXN1cGVyLnJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKTsKLSAgICAgICAgLy8gVE9ETwotLy8gICAgCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0vLyAgICAJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLS8vICAgIAkJU3RyaW5nIGxhc3RFQVJOYW1lID0gc2V0dGluZ3MuZ2V0KFNUT1JFX0xBQkVMKTsKLS8vICAgIAkJaWYgKGxhc3RFQVJOYW1lICE9IG51bGwpewotLy8gICAgCQkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKW1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLS8vICAgIAkJCVN0cmluZyBmYWNldElEID0gZ2V0TW9kdWxlRmFjZXRJRCgpOwotLy8gICAgCQkJSURhdGFNb2RlbCBqMmVlTW9kZWwgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoZmFjZXRJRCk7Ci0vLyAgICAJCQlqMmVlTW9kZWwuc2V0UHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkxBU1RfRUFSX05BTUUsIGxhc3RFQVJOYW1lKTsKLS8vICAgIAkJfQotLy8gICAgCX0KLSAgICB9Ci0gICAgCi0vLyAgICBAT3ZlcnJpZGUKLS8vICAgIHByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7Ci0vLyAgICAJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLS8vICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9wcm9qL21vZGVsL0pheGJQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovbW9kZWwvSmF4YlByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NzQ3YjAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovbW9kZWwvSmF4YlByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLndpemFyZHMucHJvai5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLQkJZXh0ZW5kcyBGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JCi0JcHVibGljIEpheGJQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkKLQkJQ29sbGVjdGlvbjxJUHJvamVjdEZhY2V0PiByZXF1aXJlZEZhY2V0cyA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3RGYWNldD4oKTsKLQkJcmVxdWlyZWRGYWNldHMuYWRkKEphdmFGYWNldC5GQUNFVCk7Ci0JCXJlcXVpcmVkRmFjZXRzLmFkZChKYXhiRmFjZXQuRkFDRVQpOwotCQlzZXRQcm9wZXJ0eShSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTiwgcmVxdWlyZWRGYWNldHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9zY2hlbWFnZW4vQWJzdHJhY3RKYXJEZXN0aW5hdGlvbldpemFyZFBhZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9zY2hlbWFnZW4vQWJzdHJhY3RKYXJEZXN0aW5hdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcwM2UxYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvc2NoZW1hZ2VuL0Fic3RyYWN0SmFyRGVzdGluYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5zY2hlbWFnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuamFycGFja2FnZXIuSmFyUGFja2FnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotLyoqCi0gKiAgRmHnYWRlIGNsYXNzIHRvIGNoYW5nZSBhY2Nlc3NpYmlsaXR5IG9mIEFic3RyYWN0SmFyRGVzdGluYXRpb25XaXphcmRQYWdlLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmFyRGVzdGluYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphcnBhY2thZ2VyLkFic3RyYWN0SmFyRGVzdGluYXRpb25XaXphcmRQYWdlCi17Ci0KLQlwdWJsaWMgQWJzdHJhY3RKYXJEZXN0aW5hdGlvbldpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIEphclBhY2thZ2VEYXRhIGphclBhY2thZ2UpIHsKLQkJc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbiwgamFyUGFja2FnZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvc2NoZW1hZ2VuL0NoZWNrYm94VHJlZUFuZExpc3RHcm91cC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3NjaGVtYWdlbi9DaGVja2JveFRyZWVBbmRMaXN0R3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1MWE1ZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvc2NoZW1hZ2VuL0NoZWNrYm94VHJlZUFuZExpc3RHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIENvZGUgb3JpZ2luYXRlIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphcnBhY2thZ2VyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5zY2hlbWFnZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZVZpZXdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVFeHBhbnNpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci0KLS8qKgotICoJQ29tYmluZXMgYSBDaGVja2JveFRyZWVWaWV3ZXIgYW5kIENoZWNrYm94TGlzdFZpZXdlci4KLSAqCUFsbCB2aWV3ZXIgc2VsZWN0aW9uLWRyaXZlbiBpbnRlcmFjdGlvbnMgYXJlIGhhbmRsZWQgd2l0aGluIHRoaXMgdmlld2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja2JveFRyZWVBbmRMaXN0R3JvdXAgaW1wbGVtZW50cyBJQ2hlY2tTdGF0ZUxpc3RlbmVyLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJVHJlZVZpZXdlckxpc3RlbmVyIHsKLQotCXByaXZhdGUgT2JqZWN0IGZSb290OwotCXByaXZhdGUgT2JqZWN0IGZDdXJyZW50VHJlZVNlbGVjdGlvbjsKLQlwcml2YXRlIExpc3QgZkV4cGFuZGVkVHJlZU5vZGVzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBNYXAgZkNoZWNrZWRTdGF0ZVN0b3JlPSB0aGlzLmJ1aWxkQ2hlY2tlZFN0YXRlU3RvcmUoKTsKLQlwcml2YXRlIExpc3QgZldoaXRlQ2hlY2tlZFRyZWVJdGVtcz0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTGlzdCBmTGlzdGVuZXJzPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIElUcmVlQ29udGVudFByb3ZpZGVyIGZUcmVlQ29udGVudFByb3ZpZGVyOwotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgZkxpc3RDb250ZW50UHJvdmlkZXI7Ci0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBmVHJlZUxhYmVsUHJvdmlkZXI7Ci0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBmTGlzdExhYmVsUHJvdmlkZXI7Ci0KLQkvLyB3aWRnZXRzCi0JcHJpdmF0ZSBDaGVja2JveFRyZWVWaWV3ZXIgZlRyZWVWaWV3ZXI7Ci0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGZMaXN0Vmlld2VyOwotCi0JLyoqCi0JICoJQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLiAgVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdpc2ggdG8gc3BlY2lmeQotCSAqCXRoZSB3aWR0aCBhbmQvb3IgaGVpZ2h0IG9mIHRoZSBjb21iaW5lZCB3aWRnZXQgKHRvIG9ubHkgaGFyZGNvZGUgb25lIG9mIHRoZQotCSAqCXNpemluZyBkaW1lbnNpb25zLCBzcGVjaWZ5IHRoZSBvdGhlciBkaW1lbnNpb24ncyB2YWx1ZSBhcyAtMSkKLQkgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gcm9vdE9iamVjdAotCSAqIEBwYXJhbSB0cmVlQ29udGVudFByb3ZpZGVyCi0JICogQHBhcmFtIHRyZWVMYWJlbFByb3ZpZGVyCi0JICogQHBhcmFtIGxpc3RDb250ZW50UHJvdmlkZXIKLQkgKiBAcGFyYW0gbGlzdExhYmVsUHJvdmlkZXIKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0Ci0JICovCi0JcHVibGljIENoZWNrYm94VHJlZUFuZExpc3RHcm91cCgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlPYmplY3Qgcm9vdE9iamVjdCwKLQkJCUlUcmVlQ29udGVudFByb3ZpZGVyIHRyZWVDb250ZW50UHJvdmlkZXIsCi0JCQlJTGFiZWxQcm92aWRlciB0cmVlTGFiZWxQcm92aWRlciwKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGxpc3RDb250ZW50UHJvdmlkZXIsCi0JCQlJTGFiZWxQcm92aWRlciBsaXN0TGFiZWxQcm92aWRlciwKLQkJCWludCBzdHlsZSwKLQkJCWludCB3aWR0aCwKLQkJCWludCBoZWlnaHQpIHsKLQkJZlJvb3Q9IHJvb3RPYmplY3Q7Ci0JCWZUcmVlQ29udGVudFByb3ZpZGVyPSB0cmVlQ29udGVudFByb3ZpZGVyOwotCQlmTGlzdENvbnRlbnRQcm92aWRlcj0gbGlzdENvbnRlbnRQcm92aWRlcjsKLQkJZlRyZWVMYWJlbFByb3ZpZGVyPSB0cmVlTGFiZWxQcm92aWRlcjsKLQkJZkxpc3RMYWJlbFByb3ZpZGVyPSBsaXN0TGFiZWxQcm92aWRlcjsKLQkJY3JlYXRlQ29udGVudHMocGFyZW50LCB3aWR0aCwgaGVpZ2h0LCBzdHlsZSk7Ci0JfQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGp1c3QgYmVmb3JlIHRoaXMgd2luZG93IGJlY29tZXMgdmlzaWJsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhYm91dFRvT3BlbigpIHsKLQkJZGV0ZXJtaW5lV2hpdGVDaGVja2VkRGVzY2VuZGVudHMoZlJvb3QpOwotCQljaGVja05ld1RyZWVFbGVtZW50cyhnZXRUcmVlQ2hpbGRyZW4oZlJvb3QpKTsKLQkJZkN1cnJlbnRUcmVlU2VsZWN0aW9uPSBudWxsOwotCi0JCS8vc2VsZWN0IHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBsaXN0Ci0JCU9iamVjdFtdIGVsZW1lbnRzPSBnZXRUcmVlQ2hpbGRyZW4oZlJvb3QpOwotCQlPYmplY3QgcHJpbWFyeT0gZWxlbWVudHMubGVuZ3RoID4gMCA/IGVsZW1lbnRzWzBdIDogbnVsbDsKLQkJaWYgKHByaW1hcnkgIT0gbnVsbCkgewotCQkJZlRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHByaW1hcnkpKTsKLQkJfQotCQlmVHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQl9Ci0JLyoqCi0JICoJQWRkcyB0aGUgcGFzc2VkIGxpc3RlbmVyIHRvIHNlbGYncyBjb2xsZWN0aW9uIG9mIGNsaWVudHMKLQkgKgl0aGF0IGxpc3RlbiBmb3IgY2hhbmdlcyB0byBlbGVtZW50IGNoZWNrZWQgc3RhdGVzCi0JICoKLQkgKglAcGFyYW0gbGlzdGVuZXIgSUNoZWNrU3RhdGVMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoZWNrU3RhdGVMaXN0ZW5lcihJQ2hlY2tTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JLyoqCi0JICogQWRkcyB0aGUgcmVjZWl2ZXIgYW5kIGFsbCBvZiBpdCdzIGFuY2VzdG9ycyB0byB0aGUgY2hlY2tlZFN0YXRlU3RvcmUgaWYgdGhleQotCSAqIGFyZSBub3QgYWxyZWFkeSB0aGVyZS4KLQkgKiBAcGFyYW0gdHJlZUVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVG9IaWVyYXJjaHlUb0NoZWNrZWRTdG9yZShPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQotCQkvLyBpZiB0aGlzIHRyZWUgZWxlbWVudCBpcyBhbHJlYWR5IGdyYXkgdGhlbiBpdHMgYW5jZXN0b3JzIGFsbCBhcmUgYXMgd2VsbAotCQlpZiAoIWZDaGVja2VkU3RhdGVTdG9yZS5jb250YWluc0tleSh0cmVlRWxlbWVudCkpCi0JCQlmQ2hlY2tlZFN0YXRlU3RvcmUucHV0KHRyZWVFbGVtZW50LCBuZXcgQXJyYXlMaXN0KCkpOwotCi0JCU9iamVjdCBwYXJlbnQ9IGZUcmVlQ29udGVudFByb3ZpZGVyLmdldFBhcmVudCh0cmVlRWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCWFkZFRvSGllcmFyY2h5VG9DaGVja2VkU3RvcmUocGFyZW50KTsKLQl9Ci0JLyoqCi0JICoJUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFsbCBjaGlsZHJlbiBvZiB0aGUgcGFzc2VkIHRyZWUgZWxlbWVudAotCSAqCWFyZSBjdXJyZW50bHkgd2hpdGUtY2hlY2tlZAotCSAqCi0JICoJQHJldHVybiBib29sZWFuCi0JICoJQHBhcmFtIHRyZWVFbGVtZW50IGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhcmVBbGxDaGlsZHJlbldoaXRlQ2hlY2tlZChPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQkJT2JqZWN0W10gY2hpbGRyZW49IGdldFRyZWVDaGlsZHJlbih0cmVlRWxlbWVudCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCQkJaWYgKCFmV2hpdGVDaGVja2VkVHJlZUl0ZW1zLmNvbnRhaW5zKGNoaWxkcmVuW2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICoJUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFsbCBsaXN0IGVsZW1lbnRzIGFzc29jaWF0ZWQgd2l0aAotCSAqCXRoZSBwYXNzZWQgdHJlZSBlbGVtZW50IGFyZSBjdXJyZW50bHkgY2hlY2tlZAotCSAqCi0JICoJQHJldHVybiBib29sZWFuCi0JICoJQHBhcmFtIHRyZWVFbGVtZW50IGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhcmVBbGxFbGVtZW50c0NoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0JCUxpc3QgY2hlY2tlZEVsZW1lbnRzPSAoTGlzdClmQ2hlY2tlZFN0YXRlU3RvcmUuZ2V0KHRyZWVFbGVtZW50KTsKLQkJaWYgKGNoZWNrZWRFbGVtZW50cyA9PSBudWxsKSAvLyBpZS4tIHRyZWUgaXRlbSBub3QgZXZlbiBncmF5LWNoZWNrZWQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZ2V0TGlzdEl0ZW1zU2l6ZSh0cmVlRWxlbWVudCkgPT0gY2hlY2tlZEVsZW1lbnRzLnNpemUoKTsKLQl9Ci0JLyoqCi0JICoJSXRlcmF0ZXMgdGhyb3VnaCB0aGUgcGFzc2VkIGVsZW1lbnRzIHdoaWNoIGFyZSBiZWluZyByZWFsaXplZCBmb3IgdGhlIGZpcnN0Ci0JICoJdGltZSBhbmQgY2hlY2sgZWFjaCBvbmUgaW4gdGhlIHRyZWUgdmlld2VyIGFzIGFwcHJvcHJpYXRlCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tOZXdUcmVlRWxlbWVudHMoT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7Ci0JCQlPYmplY3QgY3VycmVudEVsZW1lbnQ9IGVsZW1lbnRzW2ldOwotCQkJYm9vbGVhbiBjaGVja2VkPSBmQ2hlY2tlZFN0YXRlU3RvcmUuY29udGFpbnNLZXkoY3VycmVudEVsZW1lbnQpOwotCQkJZlRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChjdXJyZW50RWxlbWVudCwgY2hlY2tlZCk7Ci0JCQlmVHJlZVZpZXdlci5zZXRHcmF5ZWQoCi0JCQkJY3VycmVudEVsZW1lbnQsCi0JCQkJY2hlY2tlZCAmJiAhZldoaXRlQ2hlY2tlZFRyZWVJdGVtcy5jb250YWlucyhjdXJyZW50RWxlbWVudCkpOwotCQl9Ci0JfQotCS8qKgotCSoJQW4gaXRlbSB3YXMgY2hlY2tlZCBpbiBvbmUgb2Ygc2VsZidzIHR3byB2aWV3cy4gIERldGVybWluZSB3aGljaAotCSoJdmlldyB0aGlzIG9jY3VycmVkIGluIGFuZCBkZWxlZ2F0ZSBhcHByb3ByaWF0ZWx5Ci0JKgotCSoJQHBhcmFtIGV2ZW50IENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQKLQkqLwotCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKGZpbmFsIENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQotCQkvL1BvdGVudGlhbGx5IGxvbmcgb3BlcmF0aW9uIC0gc2hvdyBhIGJ1c3kgY3Vyc29yCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZUcmVlVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0Q2hlY2thYmxlKCkuZXF1YWxzKGZUcmVlVmlld2VyKSkKLQkJCQkJdHJlZUl0ZW1DaGVja2VkKGV2ZW50LmdldEVsZW1lbnQoKSwgZXZlbnQuZ2V0Q2hlY2tlZCgpKTsKLQkJCQllbHNlCi0JCQkJCWxpc3RJdGVtQ2hlY2tlZChldmVudC5nZXRFbGVtZW50KCksIGV2ZW50LmdldENoZWNrZWQoKSwgdHJ1ZSk7Ci0KLQkJCQlub3RpZnlDaGVja1N0YXRlQ2hhbmdlTGlzdGVuZXJzKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JfQotCS8qKgotCSAqCUxheSBvdXQgYW5kIGluaXRpYWxpemUgc2VsZidzIHZpc3VhbCBjb21wb25lbnRzLgotCSAqCi0JICoJQHBhcmFtIHBhcmVudCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKglAcGFyYW0gd2lkdGggaW50Ci0JICoJQHBhcmFtIGhlaWdodCBpbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cygKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJaW50IHdpZHRoLAotCQlpbnQgaGVpZ2h0LAotCQlpbnQgc3R5bGUpIHsKLQkJLy8gZ3JvdXAgcGFuZQotCQlDb21wb3NpdGUgY29tcG9zaXRlPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgc3R5bGUpOwotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnM9IDI7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGg9IHRydWU7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQ9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aD0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJY3JlYXRlVHJlZVZpZXdlcihjb21wb3NpdGUsIHdpZHRoIC8gMiwgaGVpZ2h0KTsKLQkJY3JlYXRlTGlzdFZpZXdlcihjb21wb3NpdGUsIHdpZHRoIC8gMiwgaGVpZ2h0KTsKLQotCQlpbml0aWFsaXplKCk7Ci0JfQotCS8qKgotCSAqCUNyZWF0ZXMgdGhpcyBncm91cCdzIGxpc3Qgdmlld2VyLgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGlzdFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJZkxpc3RWaWV3ZXI9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCWZMaXN0Vmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCUdyaWREYXRhIGRhdGE9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludD0gd2lkdGg7Ci0JCWRhdGEuaGVpZ2h0SGludD0gaGVpZ2h0OwotCQlmTGlzdFZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZMaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihmTGlzdENvbnRlbnRQcm92aWRlcik7Ci0JCWZMaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIoZkxpc3RMYWJlbFByb3ZpZGVyKTsKLQkJZkxpc3RWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQkvKioKLQkgKglDcmVhdGVzIHRoaXMgZ3JvdXAncyB0cmVlIHZpZXdlci4KLQkgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJVHJlZSB0cmVlPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5DSEVDSyB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQ9IHdpZHRoOwotCQlkYXRhLmhlaWdodEhpbnQ9IGhlaWdodDsKLQkJdHJlZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZUcmVlVmlld2VyPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKHRyZWUpOwotCQlmVHJlZVZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCQlmVHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoZlRyZWVDb250ZW50UHJvdmlkZXIpOwotCQlmVHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGZUcmVlTGFiZWxQcm92aWRlcik7Ci0JCWZUcmVlVmlld2VyLmFkZFRyZWVMaXN0ZW5lcih0aGlzKTsKLQkJZlRyZWVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQlmVHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGFzc2VkIHRyZWUgZWxlbWVudCBzaG91bGQgYmUKLQkgKiBhdCBMRUFTVCBncmF5LWNoZWNrZWQuICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3QgY29uc2lkZXIgd2hldGhlcgotCSAqIGl0IHNob3VsZCBiZSB3aGl0ZS1jaGVja2VkLCBzbyBhIHNwZWNpZmllZCB0cmVlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlCi0JICogd2hpdGUtY2hlY2tlZCB3aWxsIHJlc3VsdCBpbiBhIDxjb2RlPnRydWU8L2NvZGU+IGFuc3dlciBmcm9tIHRoaXMgbWV0aG9kLgotCSAqIFRvIGRldGVybWluZSB3aGV0aGVyIGEgdHJlZSBpdGVtIHNob3VsZCBiZSB3aGl0ZS1jaGVja2VkIHVzZSBtZXRob2QKLQkgKiAjZGV0ZXJtaW5lU2hvdWxkQmVXaGl0ZUNoZWNrZWQoT2JqZWN0KS4KLQkgKgotCSAqIEBwYXJhbSB0cmVlRWxlbWVudCBqYXZhLmxhbmcuT2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuCi0JICogQHNlZSAjZGV0ZXJtaW5lU2hvdWxkQmVXaGl0ZUNoZWNrZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXRlcm1pbmVTaG91bGRCZUF0TGVhc3RHcmF5Q2hlY2tlZChPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQkJLy8gaWYgYW55IGxpc3QgaXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRyZWVFbGVtZW50IGFyZSBjaGVja2VkIHRoZW4gaXQKLQkJLy8gcmV0YWlucyBpdHMgZ3JheS1jaGVja2VkIHN0YXR1cyByZWdhcmRsZXNzIG9mIGl0cyBjaGlsZHJlbgotCQlMaXN0IGNoZWNrZWQ9IChMaXN0KSBmQ2hlY2tlZFN0YXRlU3RvcmUuZ2V0KHRyZWVFbGVtZW50KTsKLQkJaWYgKGNoZWNrZWQgIT0gbnVsbCAmJiAoIWNoZWNrZWQuaXNFbXB0eSgpKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIGlmIGFueSBjaGlsZHJlbiBvZiB0cmVlRWxlbWVudCBhcmUgc3RpbGwgZ3JheS1jaGVja2VkIHRoZW4gdHJlZUVsZW1lbnQKLQkJLy8gbXVzdCByZW1haW4gZ3JheS1jaGVja2VkIGFzIHdlbGwKLQkJT2JqZWN0W10gY2hpbGRyZW49IGdldFRyZWVDaGlsZHJlbih0cmVlRWxlbWVudCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCQkJaWYgKGZDaGVja2VkU3RhdGVTdG9yZS5jb250YWluc0tleShjaGlsZHJlbltpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGFzc2VkIHRyZWUgaXRlbSBzaG91bGQgYmUKLQkgKiB3aGl0ZS1jaGVja2VkLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIHRyZWVFbGVtZW50IGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXRlcm1pbmVTaG91bGRCZVdoaXRlQ2hlY2tlZChPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQkJcmV0dXJuIGFyZUFsbENoaWxkcmVuV2hpdGVDaGVja2VkKHRyZWVFbGVtZW50KQotCQkJJiYgYXJlQWxsRWxlbWVudHNDaGVja2VkKHRyZWVFbGVtZW50KTsKLQl9Ci0JLyoqCi0JICoJUmVjdXJzaXZlbHkgYWRkcyBhcHByb3ByaWF0ZSB0cmVlIGVsZW1lbnRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mCi0JICoJa25vd24gd2hpdGUtY2hlY2tlZCB0cmVlIGVsZW1lbnRzLgotCSAqCi0JICoJQHBhcmFtIHRyZWVFbGVtZW50IGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZXRlcm1pbmVXaGl0ZUNoZWNrZWREZXNjZW5kZW50cyhPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQkJLy8gYWx3YXlzIGdvIHRocm91Z2ggYWxsIGNoaWxkcmVuIGZpcnN0IHNpbmNlIHRoZWlyIHdoaXRlLWNoZWNrZWQKLQkJLy8gc3RhdHVzZXMgd2lsbCBiZSBuZWVkZWQgdG8gZGV0ZXJtaW5lIHRoZSB3aGl0ZS1jaGVja2VkIHN0YXR1cyBmb3IKLQkJLy8gdGhpcyB0cmVlIGVsZW1lbnQKLQkJT2JqZWN0W10gY2hpbGRyZW49IGdldFRyZWVDaGlsZHJlbih0cmVlRWxlbWVudCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkKLQkJCWRldGVybWluZVdoaXRlQ2hlY2tlZERlc2NlbmRlbnRzKGNoaWxkcmVuW2ldKTsKLQotCQkvLyBub3cgZGV0ZXJtaW5lIHRoZSB3aGl0ZS1jaGVja2VkIHN0YXR1cyBmb3IgdGhpcyB0cmVlIGVsZW1lbnQKLQkJaWYgKGRldGVybWluZVNob3VsZEJlV2hpdGVDaGVja2VkKHRyZWVFbGVtZW50KSkKLQkJCXNldFdoaXRlQ2hlY2tlZCh0cmVlRWxlbWVudCwgdHJ1ZSk7Ci0JfQotCS8qKgotCSAqIENhdXNlcyB0aGUgdHJlZSB2aWV3ZXIgdG8gZXhwYW5kIGFsbCBpdHMgaXRlbXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHBhbmRBbGwoKSB7Ci0JCWZUcmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCX0KLQkvKioKLQkgKglBbnN3ZXJzIGEgZmxhdCBjb2xsZWN0aW9uIG9mIGFsbCBvZiB0aGUgY2hlY2tlZCBlbGVtZW50cyBpbiB0aGUKLQkgKglsaXN0IHBvcnRpb24gb2Ygc2VsZgotCSAqCi0JICoJQHJldHVybiBqYXZhLnV0aWwuVmVjdG9yCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldEFsbENoZWNrZWRMaXN0SXRlbXMoKSB7Ci0JCVNldCByZXN1bHQ9IG5ldyBIYXNoU2V0KCk7Ci0JCUl0ZXJhdG9yIGxpc3RDb2xsZWN0aW9uc0VudW09IHRoaXMuZkNoZWNrZWRTdGF0ZVN0b3JlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChsaXN0Q29sbGVjdGlvbnNFbnVtLmhhc05leHQoKSkKLQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpbGlzdENvbGxlY3Rpb25zRW51bS5uZXh0KCkpOwotCQlyZXR1cm4gcmVzdWx0Lml0ZXJhdG9yKCk7Ci0JfQotCS8qKgotCSAqCUFuc3dlciBhIGNvbGxlY3Rpb24gb2YgYWxsIG9mIHRoZSBjaGVja2VkIGVsZW1lbnRzIGluIHRoZSB0cmVlIHBvcnRpb24KLQkgKglvZiBzZWxmCi0JICoKLQkgKglAcmV0dXJuIGphdmEudXRpbC5WZWN0b3IKLQkgKi8KLQlwdWJsaWMgU2V0IGdldEFsbENoZWNrZWRUcmVlSXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgSGFzaFNldChmQ2hlY2tlZFN0YXRlU3RvcmUua2V5U2V0KCkpOwotCX0KLQkvKioKLQkgKglBbnN3ZXJzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gY2hlY2tlZCBieSB0aGUKLQkgKgl1c2VyLgotCSAqCi0JICoJQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoZWNrZWRFbGVtZW50Q291bnQoKSB7Ci0JCXJldHVybiBmQ2hlY2tlZFN0YXRlU3RvcmUuc2l6ZSgpOwotCX0KLQkvKioKLQkgKglSZXR1cm5zIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBsaXN0IGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhCi0JICoJZ2l2ZW4gdHJlZSBpdGVtLgotCSAqCi0JICoJQHJldHVybiBpbnQKLQkgKglAcGFyYW0gdHJlZUVsZW1lbnQgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TGlzdEl0ZW1zU2l6ZShPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQkJT2JqZWN0W10gZWxlbWVudHM9IGdldExpc3RFbGVtZW50cyh0cmVlRWxlbWVudCk7Ci0JCXJldHVybiBlbGVtZW50cy5sZW5ndGg7Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIHRhYmxlIHRoYXQgZGlzcGxheXMgdGhlIGZvbGRlciBjb250ZW50Ci0JICoKLQkgKiBAcmV0dXJuIHRoZSB0YWJsZSB1c2VkIHRvIHNob3cgdGhlIGxpc3QKLQkgKi8KLQlwdWJsaWMgVGFibGUgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiBmTGlzdFZpZXdlci5nZXRUYWJsZSgpOwotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSB0cmVlIHRoYXQgZGlzcGxheXMgdGhlIGxpc3QgZm9yIGEgZm9sZGVyCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB0cmVlIHVzZWQgdG8gc2hvdyB0aGUgZm9sZGVycwotCSAqLwotCXB1YmxpYyBUcmVlIGdldFRyZWUoKSB7Ci0JCXJldHVybiBmVHJlZVZpZXdlci5nZXRUcmVlKCk7Ci0JfQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGZpbHRlciB0byB0aGUgdHJlZSB2aWV3ZXIgYW5kCi0JICogdHJpZ2dlcnMgcmVmaWx0ZXJpbmcgYW5kIHJlc29ydGluZyBvZiB0aGUgZWxlbWVudHMuCi0JICoKLQkgKiBAcGFyYW0gZmlsdGVyIGEgdmlld2VyIGZpbHRlcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRyZWVGaWx0ZXIoVmlld2VyRmlsdGVyIGZpbHRlcikgewotCQlmVHJlZVZpZXdlci5hZGRGaWx0ZXIoZmlsdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlVHJlZUZpbHRlcihWaWV3ZXJGaWx0ZXIgZmlsdGVyKSB7Ci0JCWZUcmVlVmlld2VyLnJlbW92ZUZpbHRlcihmaWx0ZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGZpbHRlciB0byB0aGUgbGlzdCB2aWV3ZXIgYW5kCi0JICogdHJpZ2dlcnMgcmVmaWx0ZXJpbmcgYW5kIHJlc29ydGluZyBvZiB0aGUgZWxlbWVudHMuCi0JICoKLQkgKiBAcGFyYW0gZmlsdGVyIGEgdmlld2VyIGZpbHRlcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RGaWx0ZXIoVmlld2VyRmlsdGVyIGZpbHRlcikgewotCQlmTGlzdFZpZXdlci5hZGRGaWx0ZXIoZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKglMb2dpY2FsbHkgZ3JheS1jaGVjayBhbGwgYW5jZXN0b3JzIG9mIHRyZWVJdGVtIGJ5IGVuc3VyaW5nIHRoYXQgdGhleQotCSAqCWFwcGVhciBpbiB0aGUgY2hlY2tlZCB0YWJsZQotCSAqIEBwYXJhbSB0cmVlRWxlbWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdyYXlDaGVja0hpZXJhcmNoeShPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQotCQkvLyBpZiB0aGlzIHRyZWUgZWxlbWVudCBpcyBhbHJlYWR5IGdyYXkgdGhlbiBpdHMgYW5jZXN0b3JzIGFsbCBhcmUgYXMgd2VsbAotCQlpZiAoZkNoZWNrZWRTdGF0ZVN0b3JlLmNvbnRhaW5zS2V5KHRyZWVFbGVtZW50KSkKLQkJCXJldHVybjsgLy8gbm8gbmVlZCB0byBwcm9jZWVkIHVwd2FyZHMgZnJvbSBoZXJlCi0KLQkJZkNoZWNrZWRTdGF0ZVN0b3JlLnB1dCh0cmVlRWxlbWVudCwgbmV3IEFycmF5TGlzdCgpKTsKLQkJaWYgKGRldGVybWluZVNob3VsZEJlV2hpdGVDaGVja2VkKHRyZWVFbGVtZW50KSkgewotCQkJc2V0V2hpdGVDaGVja2VkKHRyZWVFbGVtZW50LCB0cnVlKTsKLQkJfQotCQlPYmplY3QgcGFyZW50PSBmVHJlZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQodHJlZUVsZW1lbnQpOwotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlncmF5Q2hlY2tIaWVyYXJjaHkocGFyZW50KTsKLQl9Ci0JLyoqCi0JICoJU2V0cyB0aGUgaW5pdGlhbCBjaGVja2VkIHN0YXRlIG9mIHRoZSBwYXNzZWQgbGlzdCBlbGVtZW50IHRvIHRydWUuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsQ2hlY2tMaXN0SXRlbShPYmplY3QgZWxlbWVudCkgewotCQlPYmplY3QgcGFyZW50PSBmVHJlZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCWZDdXJyZW50VHJlZVNlbGVjdGlvbj0gcGFyZW50OwotCQkvL0FzIHRoaXMgaXMgbm90IGRvbmUgZnJvbSB0aGUgVUkgdGhlbiBzZXQgdGhlIGJveCBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgc2VsZWN0aW9uIHRvIGZhbHNlCi0JCWxpc3RJdGVtQ2hlY2tlZChlbGVtZW50LCB0cnVlLCBmYWxzZSk7Ci0JCXVwZGF0ZUhpZXJhcmNoeShwYXJlbnQpOwotCX0KLQkvKioKLQkgKglTZXRzIHRoZSBpbml0aWFsIGNoZWNrZWQgc3RhdGUgb2YgdGhlIHBhc3NlZCBlbGVtZW50IHRvIHRydWUsCi0JICoJYXMgd2VsbCBhcyB0byBhbGwgb2YgaXRzIGNoaWxkcmVuIGFuZCBhc3NvY2lhdGVkIGxpc3QgZWxlbWVudHMKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxDaGVja1RyZWVJdGVtKE9iamVjdCBlbGVtZW50KSB7Ci0JCXRyZWVJdGVtQ2hlY2tlZChlbGVtZW50LCB0cnVlKTsKLQl9Ci0JLyoqCi0JICoJSW5pdGlhbGl6ZXMgdGhpcyBncm91cCdzIHZpZXdlcnMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gbGFpZCBvdXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZlRyZWVWaWV3ZXIuc2V0SW5wdXQoZlJvb3QpOwotCX0KLQkvKioKLQkgKglDYWxsYmFjayB0aGF0J3MgaW52b2tlZCB3aGVuIHRoZSBjaGVja2VkIHN0YXR1cyBvZiBhbiBpdGVtIGluIHRoZSBsaXN0Ci0JICoJaXMgY2hhbmdlZCBieSB0aGUgdXNlci4gRG8gbm90IHRyeSBhbmQgdXBkYXRlIHRoZSBoaWVyYXJjaHkgaWYgd2UgYXJlIGJ1aWxkaW5nIHRoZQotCSAqICBpbml0aWFsIGxpc3QuCi0JICogQHBhcmFtIGxpc3RFbGVtZW50Ci0JICogQHBhcmFtIHN0YXRlCi0JICogQHBhcmFtIHVwZGF0aW5nRnJvbVNlbGVjdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtQ2hlY2tlZCgKLQkJT2JqZWN0IGxpc3RFbGVtZW50LAotCQlib29sZWFuIHN0YXRlLAotCQlib29sZWFuIHVwZGF0aW5nRnJvbVNlbGVjdGlvbikgewotCQlMaXN0IGNoZWNrZWRMaXN0SXRlbXM9IChMaXN0KSBmQ2hlY2tlZFN0YXRlU3RvcmUuZ2V0KGZDdXJyZW50VHJlZVNlbGVjdGlvbik7Ci0KLQkJaWYgKHN0YXRlKSB7Ci0JCQlpZiAoY2hlY2tlZExpc3RJdGVtcyA9PSBudWxsKSB7Ci0JCQkJLy8gc2luY2UgdGhlIGFzc29jaWF0ZWQgdHJlZSBpdGVtIGhhcyBnb25lIGZyb20gMCAtPiAxIGNoZWNrZWQKLQkJCQkvLyBsaXN0IGl0ZW1zLCB0cmVlIGNoZWNraW5nIG1heSBuZWVkIHRvIGJlIHVwZGF0ZWQKLQkJCQlncmF5Q2hlY2tIaWVyYXJjaHkoZkN1cnJlbnRUcmVlU2VsZWN0aW9uKTsKLQkJCQljaGVja2VkTGlzdEl0ZW1zPSAoTGlzdCkgZkNoZWNrZWRTdGF0ZVN0b3JlLmdldChmQ3VycmVudFRyZWVTZWxlY3Rpb24pOwotCQkJfQotCQkJY2hlY2tlZExpc3RJdGVtcy5hZGQobGlzdEVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJY2hlY2tlZExpc3RJdGVtcy5yZW1vdmUobGlzdEVsZW1lbnQpOwotCQkJaWYgKGNoZWNrZWRMaXN0SXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gc2luY2UgdGhlIGFzc29jaWF0ZWQgdHJlZSBpdGVtIGhhcyBnb25lIGZyb20gMSAtPiAwIGNoZWNrZWQKLQkJCQkvLyBsaXN0IGl0ZW1zLCB0cmVlIGNoZWNraW5nIG1heSBuZWVkIHRvIGJlIHVwZGF0ZWQKLQkJCQl1bmdyYXlDaGVja0hpZXJhcmNoeShmQ3VycmVudFRyZWVTZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0KLQkJaWYgKHVwZGF0aW5nRnJvbVNlbGVjdGlvbikKLQkJCXVwZGF0ZUhpZXJhcmNoeShmQ3VycmVudFRyZWVTZWxlY3Rpb24pOwotCX0KLQkvKioKLQkgKglOb3RpZmllcyBhbGwgY2hlY2tlZCBzdGF0ZSBsaXN0ZW5lcnMgdGhhdCB0aGUgcGFzc2VkIGVsZW1lbnQgaGFzIGhhZAotCSAqCWl0cyBjaGVja2VkIHN0YXRlIGNoYW5nZWQgdG8gdGhlIHBhc3NlZCBzdGF0ZQotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUNoZWNrU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQlJdGVyYXRvciBsaXN0ZW5lcnNFbnVtPSBmTGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChsaXN0ZW5lcnNFbnVtLmhhc05leHQoKSkKLQkJCSAoKElDaGVja1N0YXRlTGlzdGVuZXIpIGxpc3RlbmVyc0VudW0ubmV4dCgpKS5jaGVja1N0YXRlQ2hhbmdlZChldmVudCk7Ci0JfQotCS8qKgotCSAqU2V0cyB0aGUgY29udGVudHMgb2YgdGhlIGxpc3Qgdmlld2VyIGJhc2VkIHVwb24gdGhlIHNwZWNpZmllZCBzZWxlY3RlZAotCSAqdHJlZSBlbGVtZW50LiAgVGhpcyBhbHNvIGluY2x1ZGVzIGNoZWNraW5nIHRoZSBhcHByb3ByaWF0ZSBsaXN0IGl0ZW1zLgotCSAqCi0JICpAcGFyYW0gdHJlZUVsZW1lbnQgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHBvcHVsYXRlTGlzdFZpZXdlcihmaW5hbCBPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQkJaWYgKHRyZWVFbGVtZW50ID09IGZDdXJyZW50VHJlZVNlbGVjdGlvbikKLQkJCXJldHVybjsKLQkJZkN1cnJlbnRUcmVlU2VsZWN0aW9uPSB0cmVlRWxlbWVudDsKLQkJZkxpc3RWaWV3ZXIuc2V0SW5wdXQodHJlZUVsZW1lbnQpOwotCQlMaXN0IGxpc3RJdGVtc1RvQ2hlY2s9IChMaXN0KSBmQ2hlY2tlZFN0YXRlU3RvcmUuZ2V0KHRyZWVFbGVtZW50KTsKLQotCQlpZiAobGlzdEl0ZW1zVG9DaGVjayAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBsaXN0SXRlbXNFbnVtPSBsaXN0SXRlbXNUb0NoZWNrLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobGlzdEl0ZW1zRW51bS5oYXNOZXh0KCkpCi0JCQkJZkxpc3RWaWV3ZXIuc2V0Q2hlY2tlZChsaXN0SXRlbXNFbnVtLm5leHQoKSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICoJUmVtb3ZlcyB0aGUgcGFzc2VkIGxpc3RlbmVyIGZyb20gc2VsZidzIGNvbGxlY3Rpb24gb2YgY2xpZW50cwotCSAqCXRoYXQgbGlzdGVuIGZvciBjaGFuZ2VzIHRvIGVsZW1lbnQgY2hlY2tlZCBzdGF0ZXMKLQkgKgotCSAqCUBwYXJhbSBsaXN0ZW5lciBJQ2hlY2tTdGF0ZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hlY2tTdGF0ZUxpc3RlbmVyKElDaGVja1N0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkvKioKLQkgKglIYW5kbGVzIHRoZSBzZWxlY3Rpb24gb2YgYW4gaXRlbSBpbiB0aGUgdHJlZSB2aWV3ZXIKLQkgKgotCSAqCUBwYXJhbSBldmVudCBJU2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0VGFibGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbj0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50PSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKHNlbGVjdGVkRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCWZDdXJyZW50VHJlZVNlbGVjdGlvbj0gbnVsbDsKLQkJCQkJZkxpc3RWaWV3ZXIuc2V0SW5wdXQoZkN1cnJlbnRUcmVlU2VsZWN0aW9uKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlwb3B1bGF0ZUxpc3RWaWV3ZXIoc2VsZWN0ZWRFbGVtZW50KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyBvciBkZXNlbGVjdCBhbGwgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSB0cmVlIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdGlvbgotCSAqIGJvb2xlYW4uIEJlIHN1cmUgdG8gdXBkYXRlIHRoZSBkaXNwbGF5ZWQgZmlsZXMgYXMgd2VsbC4KLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsU2VsZWN0aW9ucyhmaW5hbCBib29sZWFuIHNlbGVjdGlvbikgewotCi0JCS8vUG90ZW50aWFsbHkgbG9uZyBvcGVyYXRpb24gLSBzaG93IGEgYnVzeSBjdXJzb3IKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZlRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNldFRyZWVDaGVja2VkKGZSb290LCBzZWxlY3Rpb24pOwotCQkJCWZMaXN0Vmlld2VyLnNldEFsbENoZWNrZWQoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICoJU2V0cyB0aGUgbGlzdCB2aWV3ZXIncyBwcm92aWRlcnMgdG8gdGhvc2UgcGFzc2VkCi0JICoKLQkgKglAcGFyYW0gY29udGVudFByb3ZpZGVyIElUcmVlQ29udGVudFByb3ZpZGVyCi0JICoJQHBhcmFtIGxhYmVsUHJvdmlkZXIgSUxhYmVsUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0UHJvdmlkZXJzKAotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJZkxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCWZMaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JfQotCS8qKgotCSAqCVNldHMgdGhlIHNvcnRlciB0aGF0IGlzIHRvIGJlIGFwcGxpZWQgdG8gc2VsZidzIGxpc3Qgdmlld2VyCi0JICogQHBhcmFtIGNvbXBhcmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0Q29tcGFyYXRvcihWaWV3ZXJDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKLQkJZkxpc3RWaWV3ZXIuc2V0Q29tcGFyYXRvcihjb21wYXJhdG9yKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgcm9vdCBvZiB0aGUgd2lkZ2V0IHRvIGJlIG5ldyBSb290LiBSZWdlbmVyYXRlIGFsbCBvZiB0aGUgdGFibGVzIGFuZCBsaXN0cyBmcm9tIHRoaXMKLQkgKiB2YWx1ZS4KLQkgKgotCSAqIEBwYXJhbSBuZXdSb290Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Um9vdChPYmplY3QgbmV3Um9vdCkgewotCQl0aGlzLmZSb290PSBuZXdSb290OwotCQlpbml0aWFsaXplKCk7Ci0JfQotCS8qKgotCSAqCVNldHMgdGhlIGNoZWNrZWQgc3RhdGUgb2YgdGhlIHBhc3NlZCB0cmVlIGVsZW1lbnQgYXBwcm9wcmlhdGVseSwgYW5kCi0JICoJZG8gc28gcmVjdXJzaXZlbHkgdG8gYWxsIG9mIGl0cyBjaGlsZCB0cmVlIGVsZW1lbnRzIGFzIHdlbGwKLQkgKiBAcGFyYW0gdHJlZUVsZW1lbnQKLQkgKiBAcGFyYW0gc3RhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUcmVlQ2hlY2tlZChPYmplY3QgdHJlZUVsZW1lbnQsIGJvb2xlYW4gc3RhdGUpIHsKLQotCQlpZiAodHJlZUVsZW1lbnQuZXF1YWxzKGZDdXJyZW50VHJlZVNlbGVjdGlvbikpIHsKLQkJCWZMaXN0Vmlld2VyLnNldEFsbENoZWNrZWQoc3RhdGUpOwotCQl9Ci0KLQkJaWYgKHN0YXRlKSB7Ci0JCQlPYmplY3RbXSBsaXN0SXRlbXM9IGdldExpc3RFbGVtZW50cyh0cmVlRWxlbWVudCk7Ci0JCQlMaXN0IGxpc3RJdGVtc0NoZWNrZWQ9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBsaXN0SXRlbXMubGVuZ3RoOyArK2kpCi0JCQkJbGlzdEl0ZW1zQ2hlY2tlZC5hZGQobGlzdEl0ZW1zW2ldKTsKLQotCQkJZkNoZWNrZWRTdGF0ZVN0b3JlLnB1dCh0cmVlRWxlbWVudCwgbGlzdEl0ZW1zQ2hlY2tlZCk7Ci0JCX0gZWxzZQotCQkJZkNoZWNrZWRTdGF0ZVN0b3JlLnJlbW92ZSh0cmVlRWxlbWVudCk7Ci0KLQkJc2V0V2hpdGVDaGVja2VkKHRyZWVFbGVtZW50LCBzdGF0ZSk7Ci0JCWZUcmVlVmlld2VyLnNldENoZWNrZWQodHJlZUVsZW1lbnQsIHN0YXRlKTsKLQkJZlRyZWVWaWV3ZXIuc2V0R3JheWVkKHRyZWVFbGVtZW50LCBmYWxzZSk7Ci0KLQkJLy8gbm93IGxvZ2ljYWxseSBjaGVjay91bmNoZWNrIGFsbCBjaGlsZHJlbiBhcyB3ZWxsCi0JCU9iamVjdFtdIGNoaWxkcmVuPSBnZXRUcmVlQ2hpbGRyZW4odHJlZUVsZW1lbnQpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLQkJCXNldFRyZWVDaGVja2VkKGNoaWxkcmVuW2ldLCBzdGF0ZSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICoJU2V0cyB0aGUgdHJlZSB2aWV3ZXIncyBwcm92aWRlcnMgdG8gdGhvc2UgcGFzc2VkCi0JICoKLQkgKglAcGFyYW0gY29udGVudFByb3ZpZGVyIElUcmVlQ29udGVudFByb3ZpZGVyCi0JICoJQHBhcmFtIGxhYmVsUHJvdmlkZXIgSUxhYmVsUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmVlUHJvdmlkZXJzKAotCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJZlRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCWZUcmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JfQotCS8qKgotCSAqCVNldHMgdGhlIHNvcnRlciB0aGF0IGlzIHRvIGJlIGFwcGxpZWQgdG8gc2VsZidzIHRyZWUgdmlld2VyCi0JICogQHBhcmFtIHNvcnRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyZWVDb21wYXJhdG9yKFZpZXdlckNvbXBhcmF0b3Igc29ydGVyKSB7Ci0JCWZUcmVlVmlld2VyLnNldENvbXBhcmF0b3Ioc29ydGVyKTsKLQl9Ci0JLyoqCi0JICoJQWRqdXN0cyB0aGUgY29sbGVjdGlvbiBvZiByZWZlcmVuY2VzIHRvIHdoaXRlLWNoZWNrZWQgdHJlZSBlbGVtZW50cyBhcHByb3ByaWF0ZWx5LgotCSAqCi0JICoJQHBhcmFtIHRyZWVFbGVtZW50IGphdmEubGFuZy5PYmplY3QKLQkgKglAcGFyYW0gaXNXaGl0ZUNoZWNrZWQgYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFdoaXRlQ2hlY2tlZChPYmplY3QgdHJlZUVsZW1lbnQsIGJvb2xlYW4gaXNXaGl0ZUNoZWNrZWQpIHsKLQkJaWYgKGlzV2hpdGVDaGVja2VkKSB7Ci0JCQlpZiAoIWZXaGl0ZUNoZWNrZWRUcmVlSXRlbXMuY29udGFpbnModHJlZUVsZW1lbnQpKQotCQkJCWZXaGl0ZUNoZWNrZWRUcmVlSXRlbXMuYWRkKHRyZWVFbGVtZW50KTsKLQkJfSBlbHNlCi0JCQlmV2hpdGVDaGVja2VkVHJlZUl0ZW1zLnJlbW92ZSh0cmVlRWxlbWVudCk7Ci0JfQotCS8qKgotCSAqCUhhbmRsZSB0aGUgY29sbGFwc2luZyBvZiBhbiBlbGVtZW50IGluIGEgdHJlZSB2aWV3ZXIKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotCQkvLyBXZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHdpdGggdGhpcwotCX0KLQotCS8qKgotCSAqCUhhbmRsZXMgdGhlIGV4cGFuc2lvbnNpb24gb2YgYW4gZWxlbWVudCBpbiBhIHRyZWUgdmlld2VyCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotCi0JCU9iamVjdCBpdGVtPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJLy8gRmlyc3Qgc2VlIGlmIHRoZSBjaGlsZHJlbiBuZWVkIHRvIGJlIGdpdmVuIHRoZWlyIGNoZWNrZWQgc3RhdGUgYXQgYWxsLiAgSWYgdGhleSd2ZQotCQkvLyBhbHJlYWR5IGJlZW4gcmVhbGl6ZWQgdGhlbiB0aGlzIHdvbid0IGJlIG5lY2Vzc2FyeQotCQlpZiAoIWZFeHBhbmRlZFRyZWVOb2Rlcy5jb250YWlucyhpdGVtKSkgewotCQkJZkV4cGFuZGVkVHJlZU5vZGVzLmFkZChpdGVtKTsKLQkJCWNoZWNrTmV3VHJlZUVsZW1lbnRzKGdldFRyZWVDaGlsZHJlbihpdGVtKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgQ2FsbGJhY2sgdGhhdCdzIGludm9rZWQgd2hlbiB0aGUgY2hlY2tlZCBzdGF0dXMgb2YgYW4gaXRlbSBpbiB0aGUgdHJlZQotCSAqICBpcyBjaGFuZ2VkIGJ5IHRoZSB1c2VyLgotCSAqIEBwYXJhbSB0cmVlRWxlbWVudAotCSAqIEBwYXJhbSBzdGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyZWVJdGVtQ2hlY2tlZChPYmplY3QgdHJlZUVsZW1lbnQsIGJvb2xlYW4gc3RhdGUpIHsKLQotCQkvLyByZWN1cnNpdmVseSBhZGp1c3QgYWxsIGNoaWxkIHRyZWUgZWxlbWVudHMgYXBwcm9wcmlhdGVseQotCQlzZXRUcmVlQ2hlY2tlZCh0cmVlRWxlbWVudCwgc3RhdGUpOwotCi0JCU9iamVjdCBwYXJlbnQ9IGZUcmVlQ29udGVudFByb3ZpZGVyLmdldFBhcmVudCh0cmVlRWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBub3cgdXBkYXRlIHVwd2FyZHMgaW4gdGhlIHRyZWUgaGllcmFyY2h5Ci0JCWlmIChzdGF0ZSkKLQkJCWdyYXlDaGVja0hpZXJhcmNoeShwYXJlbnQpOwotCQllbHNlCi0JCQl1bmdyYXlDaGVja0hpZXJhcmNoeShwYXJlbnQpOwotCi0JCXVwZGF0ZUhpZXJhcmNoeSh0cmVlRWxlbWVudCk7Ci0JfQotCS8qKgotCSAqCUxvZ2ljYWxseSB1bi1ncmF5LWNoZWNrIGFsbCBhbmNlc3RvcnMgb2YgdHJlZUl0ZW0gaWZmIGFwcHJvcHJpYXRlLgotCSAqIEBwYXJhbSB0cmVlRWxlbWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVuZ3JheUNoZWNrSGllcmFyY2h5KE9iamVjdCB0cmVlRWxlbWVudCkgewotCQlpZiAoIWRldGVybWluZVNob3VsZEJlQXRMZWFzdEdyYXlDaGVja2VkKHRyZWVFbGVtZW50KSkKLQkJCWZDaGVja2VkU3RhdGVTdG9yZS5yZW1vdmUodHJlZUVsZW1lbnQpOwotCi0JCU9iamVjdCBwYXJlbnQ9IGZUcmVlQ29udGVudFByb3ZpZGVyLmdldFBhcmVudCh0cmVlRWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXVuZ3JheUNoZWNrSGllcmFyY2h5KHBhcmVudCk7Ci0JfQotCS8qKgotCSAqCVNldHMgdGhlIGNoZWNrZWQgc3RhdGUgb2Ygc2VsZiBhbmQgYWxsIGFuY2VzdG9ycyBhcHByb3ByaWF0ZWx5Ci0JICogQHBhcmFtIHRyZWVFbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSGllcmFyY2h5KE9iamVjdCB0cmVlRWxlbWVudCkgewotCi0JCWJvb2xlYW4gd2hpdGVDaGVja2VkPSBkZXRlcm1pbmVTaG91bGRCZVdoaXRlQ2hlY2tlZCh0cmVlRWxlbWVudCk7Ci0JCWJvb2xlYW4gc2hvdWxkQmVBdExlYXN0R3JheT0gZGV0ZXJtaW5lU2hvdWxkQmVBdExlYXN0R3JheUNoZWNrZWQodHJlZUVsZW1lbnQpOwotCi0JCWZUcmVlVmlld2VyLnNldENoZWNrZWQodHJlZUVsZW1lbnQsIHdoaXRlQ2hlY2tlZCB8fCBzaG91bGRCZUF0TGVhc3RHcmF5KTsKLQkJc2V0V2hpdGVDaGVja2VkKHRyZWVFbGVtZW50LCB3aGl0ZUNoZWNrZWQpOwotCQlpZiAod2hpdGVDaGVja2VkKQotCQkJZlRyZWVWaWV3ZXIuc2V0R3JheWVkKHRyZWVFbGVtZW50LCBmYWxzZSk7Ci0JCWVsc2UKLQkJCWZUcmVlVmlld2VyLnNldEdyYXllZCh0cmVlRWxlbWVudCwgc2hvdWxkQmVBdExlYXN0R3JheSk7Ci0KLQkJLy8gcHJvY2VlZCB1cCB0aGUgdHJlZSBlbGVtZW50IGhpZXJhcmNoeQotCQlPYmplY3QgcGFyZW50PSBmVHJlZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQodHJlZUVsZW1lbnQpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXVwZGF0ZUhpZXJhcmNoeShwYXJlbnQpOwotCQl9Ci0JfQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgc2VsZWN0aW9ucyBvZiB0aGUgdHJlZSBlbGVtZW50cyBpbiBpdGVtcyB0byByZWZsZWN0IHRoZSBuZXcKLQkgKiBzZWxlY3Rpb25zIHByb3ZpZGVkLgotCSAqCi0JICogQHBhcmFtIGl0ZW1zIHdpdGgga2V5cyBvZiBPYmplY3QgKHRoZSB0cmVlIGVsZW1lbnQpIGFuZCB2YWx1ZXMgb2YgTGlzdCAodGhlIHNlbGVjdGVkCi0JICogbGlzdCBlbGVtZW50cykuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlU2VsZWN0aW9ucyhmaW5hbCBNYXAgaXRlbXMpIHsKLQotCQkvL1BvdGVudGlhbGx5IGxvbmcgb3BlcmF0aW9uIC0gc2hvdyBhIGJ1c3kgY3Vyc29yCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZUcmVlVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQloYW5kbGVVcGRhdGVTZWxlY3Rpb24oaXRlbXMpOwotCQkJfQotCQl9KTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIGdpdmVuIGVsZW1lbnRzIHRocm91Z2ggdGhlIGZpbHRlcnMuCi0JICogQHBhcmFtIGZpbHRlcnMKLQkgKgotCSAqIEBwYXJhbSBlbGVtZW50cyB0aGUgZWxlbWVudHMgdG8gZmlsdGVyCi0JICogQHJldHVybiBvbmx5IHRoZSBlbGVtZW50cyB3aGljaCBhbGwgZmlsdGVycyBhY2NlcHQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZmlsdGVyKFZpZXdlckZpbHRlcltdIGZpbHRlcnMsIE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCWlmIChmaWx0ZXJzICE9IG51bGwpIHsKLQkJCUFycmF5TGlzdCBmaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoZWxlbWVudHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlib29sZWFuIGFkZCA9IHRydWU7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmaWx0ZXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWFkZCA9IGZpbHRlcnNbal0uc2VsZWN0KG51bGwsIG51bGwsIGVsZW1lbnRzW2ldKTsKLQkJCQkJaWYgKCFhZGQpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGFkZCkKLQkJCQkJZmlsdGVyZWQuYWRkKGVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJCXJldHVybiBmaWx0ZXJlZC50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZ2V0VHJlZUNoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmaWx0ZXIoZlRyZWVWaWV3ZXIuZ2V0RmlsdGVycygpLCBmVHJlZUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihlbGVtZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRMaXN0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZpbHRlcihmTGlzdFZpZXdlci5nZXRGaWx0ZXJzKCksIGZMaXN0Q29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKGVsZW1lbnQpKTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFdoaXRlQ2hlY2tlZFRyZWVJdGVtcygpIHsKLQkJcmV0dXJuIG5ldyBIYXNoU2V0KGZXaGl0ZUNoZWNrZWRUcmVlSXRlbXMpOwotCX0KLQotCXByaXZhdGUgSGFzaE1hcCBidWlsZENoZWNrZWRTdGF0ZVN0b3JlKCkgewotCQlyZXR1cm4gbmV3IEhhc2hNYXAoOSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVVcGRhdGVTZWxlY3Rpb24oTWFwIGl0ZW1zKSB7Ci0JCUl0ZXJhdG9yIGtleUl0ZXJhdG9yPSBpdGVtcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0JCS8vVXBkYXRlIHRoZSBzdG9yZSBiZWZvcmUgdGhlIGhpZXJhcmNoeSB0byBwcmV2ZW50IHVwZGF0aW5nIHBhcmVudHMgYmVmb3JlIGFsbCBvZiB0aGUgY2hpbGRyZW4gYXJlIGRvbmUKLQkJd2hpbGUgKGtleUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGtleT0ga2V5SXRlcmF0b3IubmV4dCgpOwotCQkJLy9SZXBsYWNlIHRoZSBpdGVtcyBpbiB0aGUgY2hlY2tlZCBzdGF0ZSBzdG9yZSB3aXRoIHRob3NlIGZyb20gdGhlIHN1cHBsaWVkIGl0ZW1zCi0JCQlMaXN0IHNlbGVjdGlvbnM9IChMaXN0KSBpdGVtcy5nZXQoa2V5KTsKLQkJCWlmIChzZWxlY3Rpb25zLnNpemUoKSA9PSAwKQotCQkJCS8vSWYgaXQgaXMgZW1wdHkgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3QKLQkJCQlmQ2hlY2tlZFN0YXRlU3RvcmUucmVtb3ZlKGtleSk7Ci0JCQllbHNlIHsKLQkJCQlmQ2hlY2tlZFN0YXRlU3RvcmUucHV0KGtleSwgc2VsZWN0aW9ucyk7Ci0JCQkJLy8gcHJvY2VlZCB1cCB0aGUgdHJlZSBlbGVtZW50IGhpZXJhcmNoeQotCQkJCU9iamVjdCBwYXJlbnQ9IGZUcmVlQ29udGVudFByb3ZpZGVyLmdldFBhcmVudChrZXkpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlhZGRUb0hpZXJhcmNoeVRvQ2hlY2tlZFN0b3JlKHBhcmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy9Ob3cgdXBkYXRlIGhpZXJhcmNoaWVzCi0JCWtleUl0ZXJhdG9yPSBpdGVtcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChrZXlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBrZXk9IGtleUl0ZXJhdG9yLm5leHQoKTsKLQkJCXVwZGF0ZUhpZXJhcmNoeShrZXkpOwotCQkJaWYgKGZDdXJyZW50VHJlZVNlbGVjdGlvbiAhPSBudWxsICYmIGZDdXJyZW50VHJlZVNlbGVjdGlvbi5lcXVhbHMoa2V5KSkgewotCQkJCWZMaXN0Vmlld2VyLnNldEFsbENoZWNrZWQoZmFsc2UpOwotCQkJCWZMaXN0Vmlld2VyLnNldENoZWNrZWRFbGVtZW50cygoKExpc3QpIGl0ZW1zLmdldChrZXkpKS50b0FycmF5KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGFuIGVsZW1lbnQgaXMgZ3JleSBjaGVja2VkLgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIGlmIGFuIGVsZW1lbnQgaXMgZ3JleSBjaGVja2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVHJlZUl0ZW1HcmV5Q2hlY2tlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmVHJlZVZpZXdlci5nZXRHcmF5ZWQob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgYSBnaXZlbiBlbGVtZW50LCBleHBhbmQgaXRzIGNoaWRyZW4gdG8gYSBsZXZlbC4KLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGxldmVsCi0JICovCi0JcHVibGljIHZvaWQgZXhwYW5kVHJlZVRvTGV2ZWwoT2JqZWN0IG9iamVjdCwgaW50IGxldmVsKSB7Ci0JCWZUcmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwob2JqZWN0LCBsZXZlbCk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmVlU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZUcmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvc2NoZW1hZ2VuL05ld1NjaGVtYUZpbGVXaXphcmRQYWdlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvc2NoZW1hZ2VuL05ld1NjaGVtYUZpbGVXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNTM4MTEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3NjaGVtYWdlbi9OZXdTY2hlbWFGaWxlV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLnNjaGVtYWdlbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiAgTmV3U2NoZW1hRmlsZVdpemFyZFBhZ2UKLSAqLwotcHVibGljIGNsYXNzIE5ld1NjaGVtYUZpbGVXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7Ci0JCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZGF0YU1vZGVsOyAKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbjsKLQkKLQlzdGF0aWMgcHVibGljIFN0cmluZyBERUZBVUxUX1NDSEVNQV9OQU1FID0gIk5ld1hNTFNjaGVtYSIgKyBTY2hlbWFHZW5lcmF0b3JXaXphcmQuWFNEX0VYVEVOU0lPTjsgICAvLyROT04tTkxTLTEkCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0JCi0JcHVibGljIE5ld1NjaGVtYUZpbGVXaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBJRGF0YU1vZGVsIGRhdGFNb2RlbCwKLQkJCVN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQotCQlzdXBlcihwYWdlTmFtZSwgc2VsZWN0aW9uKTsKLQkJdGhpcy5pbml0aWFsU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCi0JCXRoaXMuaW5pdChkYXRhTW9kZWwpOwotCQl0aGlzLnNldFRpdGxlKHRpdGxlKTsKLQkJdGhpcy5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXQoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJdGhpcy5kYXRhTW9kZWwgPSBkYXRhTW9kZWw7Ci0JCQotCQlJUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5nZXRQcm9qZWN0RnJvbUluaXRpYWxTZWxlY3Rpb24oKTsKLQkJdGhpcy5kYXRhTW9kZWwuc2V0UHJvcGVydHkoUFJPSkVDVCwgcHJvamVjdCk7Ci0JCQotCQlJUGF0aCBjb250YWluZXJQYXRoID0gKElQYXRoKSB0aGlzLmRhdGFNb2RlbC5nZXRQcm9wZXJ0eShDT05UQUlORVJfUEFUSCk7Ci0JCWlmIChjb250YWluZXJQYXRoICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0Q29udGFpbmVyRnVsbFBhdGgoY29udGFpbmVyUGF0aCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIElEaWFsb2dQYWdlIGltcGxlbWVudGF0aW9uICAqKioqKioqKioqCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICAJCi0JCXRoaXMuc2V0RmlsZU5hbWUoREVGQVVMVF9TQ0hFTUFfTkFNRSk7Ci0gICAgfQotCQotCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiAoSVByb2plY3QpIHRoaXMuZGF0YU1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1QpOwotCX0KLQotCXB1YmxpYyBJUGF0aCBnZXRGaWxlUGF0aCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJdGhpcy5kYXRhTW9kZWwuc2V0UHJvcGVydHkoUFJPSkVDVCwgdGhpcy5nZXRQcm9qZWN0TmFtZWQodGhpcy5nZXRDb250YWluZXJOYW1lKCkpKTsKLQkJdGhpcy5kYXRhTW9kZWwuc2V0UHJvcGVydHkoQ09OVEFJTkVSX1BBVEgsIHRoaXMuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSk7Ci0JCXRoaXMuZGF0YU1vZGVsLnNldFByb3BlcnR5KEZJTEVfTkFNRSwgdGhpcy5nZXRGaWxlTmFtZSgpKTsKLQotCQlib29sZWFuIHZhbGlkID0gc3VwZXIudmFsaWRhdGVQYWdlKCk7Ci0JCWlmKCAhIHZhbGlkKSB7Ci0JCQlyZXR1cm4gdmFsaWQ7Ci0JCX0KLQotCQl2YWxpZCA9IHRoaXMucHJvamVjdElzSmF2YVByb2plY3QodGhpcy5nZXRQcm9qZWN0KCkpOwotCQlpZiggISB2YWxpZCkgewotCQkJdGhpcy5zZXRFcnJvck1lc3NhZ2UoSnB0SmF4YlVpTWVzc2FnZXMuTmV3U2NoZW1hRmlsZVdpemFyZFBhZ2VfZXJyb3JOb3RKYXZhUHJvamVjdCk7Ci0JCQkJcmV0dXJuIHZhbGlkOwotCQl9Ci0JCXRoaXMuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCXJldHVybiB2YWxpZDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBib29sZWFuIHByb2plY3RJc0phdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAocHJvamVjdCAhPSBudWxsKSAmJiAocHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbUluaXRpYWxTZWxlY3Rpb24oKSB7Ci0JCU9iamVjdCBmaXJzdEVsZW1lbnQgPSBpbml0aWFsU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZihmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJcmV0dXJuIChJUHJvamVjdClmaXJzdEVsZW1lbnQ7Ci0JCX0KLQkJZWxzZSBpZihmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCXJldHVybiAoKElSZXNvdXJjZSkgZmlyc3RFbGVtZW50KS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJZWxzZSBpZihmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpIHsKLQkJCXJldHVybiAoKElKYXZhRWxlbWVudClmaXJzdEVsZW1lbnQpLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotICAgIH0KLQotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdE5hbWVkKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlpZihTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHByb2plY3ROYW1lKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldENvbnRhaW5lck5hbWUoKSB7Ci0JCUlQYXRoIGNvbnRhaW5lclBhdGggPSB0aGlzLmdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCWlmKGNvbnRhaW5lclBhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGNvbnRhaW5lck5hbWUgPSBjb250YWluZXJQYXRoLnNlZ21lbnQoMCk7Ci0JCXJldHVybiBjb250YWluZXJOYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3NjaGVtYWdlbi9TY2hlbWFHZW5lcmF0b3JXaXphcmQuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9zY2hlbWFnZW4vU2NoZW1hR2VuZXJhdG9yV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxY2VkYzkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3NjaGVtYWdlbi9TY2hlbWFHZW5lcmF0b3JXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5zY2hlbWFnZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZ2VuLlNjaGVtYUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuU2NoZW1hRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuSnB0SmF4YlVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLkpwdEpheGJVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLkpwdEpheGJVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuRmlsZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogIFNjaGVtYUdlbmVyYXRvcldpemFyZAotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hR2VuZXJhdG9yV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCAKLXsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbjsKLQlwcml2YXRlIElKYXZhUHJvamVjdCB0YXJnZXRQcm9qZWN0OwotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGRhdGFNb2RlbDsJCi0JCi0JcHJpdmF0ZSBOZXdTY2hlbWFGaWxlV2l6YXJkUGFnZSBuZXdTY2hlbWFGaWxlV2l6YXJkUGFnZTsKLQotCXByaXZhdGUgU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZSBzY2hlbWFHZW5XaXphcmRQYWdlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEX0VYVEVOU0lPTiA9ICIueHNkIjsgICAvLyROT04tTkxTLTEkCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQkKLQlwdWJsaWMgU2NoZW1hR2VuZXJhdG9yV2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFHZW5lcmF0b3JXaXphcmRfdGl0bGUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKcHRKYXhiVWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdEpheGJVaUljb25zLlNDSEVNQV9HRU5fV0laX0JBTk5FUikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5pbml0aWFsU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsJCi0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy50YXJnZXRQcm9qZWN0ID0gdGhpcy5nZXRQcm9qZWN0RnJvbUluaXRpYWxTZWxlY3Rpb24oKTsKLQkJdGhpcy5kYXRhTW9kZWwgPSBudWxsOwotCX0KLQotCS8vICoqKioqKioqKiogSVdpemFyZCBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXN1cGVyLmFkZFBhZ2VzKCk7Ci0JCQotCQl0aGlzLm5ld1NjaGVtYUZpbGVXaXphcmRQYWdlID0gdGhpcy5idWlsZE5ld1NjaGVtYUZpbGVXaXphcmRQYWdlKHRoaXMuaW5pdGlhbFNlbGVjdGlvbik7Ci0JCXRoaXMuYWRkUGFnZSh0aGlzLm5ld1NjaGVtYUZpbGVXaXphcmRQYWdlKTsKLQotCQl0aGlzLnNjaGVtYUdlbldpemFyZFBhZ2UgPSB0aGlzLmJ1aWxkU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZSh0aGlzLmJ1aWxkU2VsZWN0aW9uKHRoaXMuZ2V0UHJvamVjdCgpKSk7Ci0JCXRoaXMuYWRkUGFnZSh0aGlzLnNjaGVtYUdlbldpemFyZFBhZ2UpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCi0JCXRoaXMudGFyZ2V0UHJvamVjdCA9IHRoaXMuZ2V0SmF2YVByb2plY3QoKTsKLQkJCi0JCVN0cmluZ1tdIHNvdXJjZUNsYXNzTmFtZXMgPSB0aGlzLmJ1aWxkU291cmNlQ2xhc3NOYW1lcyh0aGlzLmdldEFsbENoZWNrZWRJdGVtcygpKTsKLQkJCi0JCVdvcmtzcGFjZUpvYiBnZW5TY2hlbWFKb2IgPSBuZXcgR2VuZXJhdGVTY2hlbWFKb2IoIAotCQkJCQkJdGhpcy50YXJnZXRQcm9qZWN0LCAKLQkJCQkJCXNvdXJjZUNsYXNzTmFtZXMsIAotCQkJCQkJdGhpcy5nZXRUYXJnZXRTY2hlbWEoKSwgCi0JCQkJCQl0aGlzLnVzZXNNb3h5KCkpOwotCQlnZW5TY2hlbWFKb2Iuc2NoZWR1bGUoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUHJvamVjdEZyb20odGhpcy5nZXRQcm9qZWN0KCkpOwotCX0KLSAgICAKLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5uZXdTY2hlbWFGaWxlV2l6YXJkUGFnZS5nZXRQcm9qZWN0KCk7Ci0JfQotCi0gICAgcHJpdmF0ZSBJSmF2YVByb2plY3QgZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKCkgewotICAgIAlJSmF2YVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0KLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IHRoaXMuaW5pdGlhbFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0JCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSAoSUphdmFFbGVtZW50KWZpcnN0RWxlbWVudDsKLQkJCWludCB0eXBlID0gamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKTsKLQkJCWlmKHR5cGUgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkgewotCQkJCXByb2plY3QgPSAoSUphdmFQcm9qZWN0KWphdmFFbGVtZW50OwotCQkJfQotCQkJZWxzZSBpZih0eXBlID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKSB7Ci0JCQkJcHJvamVjdCA9ICgoSVBhY2thZ2VGcmFnbWVudClqYXZhRWxlbWVudCkuZ2V0SmF2YVByb2plY3QoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdEZyb20oSVByb2plY3QgcHJvamVjdCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSgoSUphdmFFbGVtZW50KSgoSUFkYXB0YWJsZSlwcm9qZWN0KS5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcykpOwotCQlpZihqYXZhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGEgSmF2YSBQcm9qZWN0Iik7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGphdmFQcm9qZWN0OwotICAgIH0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRUYXJnZXRTY2hlbWEoKSB7Ci0JCQotCQlJUGF0aCBmaWxlUGF0aCA9IHRoaXMubmV3U2NoZW1hRmlsZVdpemFyZFBhZ2UuZ2V0RmlsZVBhdGgoKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gdGhpcy5uZXdTY2hlbWFGaWxlV2l6YXJkUGFnZS5nZXRGaWxlTmFtZSgpOwotCQlTdHJpbmcgdGFyZ2V0U2NoZW1hID0gZmlsZVBhdGgudG9PU1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZTsKLQkJaWYgKCAhIEZpbGVUb29scy5leHRlbnNpb24odGFyZ2V0U2NoZW1hKS5lcXVhbHNJZ25vcmVDYXNlKFhTRF9FWFRFTlNJT04pKSB7Ci0JCQl0YXJnZXRTY2hlbWEgKz0gWFNEX0VYVEVOU0lPTjsKLQkJfQotCQkKLQkJcmV0dXJuIHRoaXMubWFrZVJlbGF0aXZlVG9Qcm9qZWN0UGF0aCh0YXJnZXRTY2hlbWEpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBtYWtlUmVsYXRpdmVUb1Byb2plY3RQYXRoKFN0cmluZyBmaWxlUGF0aCkgewotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlUGF0aCk7Ci0JCUlQYXRoIHJlbGF0aXZlUGF0aCA9IHBhdGgubWFrZVJlbGF0aXZlVG8odGhpcy50YXJnZXRQcm9qZWN0LmdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpKTsKLQkJcmV0dXJuIHJlbGF0aXZlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLnRvT1NTdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGdldEFsbENoZWNrZWRJdGVtcygpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hR2VuV2l6YXJkUGFnZS5nZXRBbGxDaGVja2VkSXRlbXMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmdbXSBidWlsZFNvdXJjZUNsYXNzTmFtZXMoT2JqZWN0W10gY2hlY2tlZEVsZW1lbnRzKSB7Ci0KLQkJQXJyYXlMaXN0PFN0cmluZz4gY2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkKLQkJZm9yKE9iamVjdCBlbGVtZW50OiBjaGVja2VkRWxlbWVudHMpIHsKLQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IChJSmF2YUVsZW1lbnQpZWxlbWVudDsKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IGphdmFFbGVtZW50LmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBqYXZhRWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IEZpbGVUb29scy5zdHJpcEV4dGVuc2lvbihlbGVtZW50TmFtZSk7Ci0JCQljbGFzc05hbWVzLmFkZChwYWNrYWdlTmFtZSArICcuJyArIGNsYXNzTmFtZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBBcnJheVRvb2xzLmFycmF5KGNsYXNzTmFtZXMsIG5ldyBTdHJpbmdbMF0pOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gdXNlc01veHkoKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYUdlbldpemFyZFBhZ2UudXNlc01veHkoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE5ld1NjaGVtYUZpbGVXaXphcmRQYWdlIGJ1aWxkTmV3U2NoZW1hRmlsZVdpemFyZFBhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgTmV3U2NoZW1hRmlsZVdpemFyZFBhZ2UoCi0JCQkJIlBhZ2VfMSIsIHNlbGVjdGlvbiwgdGhpcy5nZXREYXRhTW9kZWwoKSwJICAgLy8kTk9OLU5MUy0xJAotCQkJCUpwdEpheGJVaU1lc3NhZ2VzLlNjaGVtYUdlbmVyYXRvclByb2plY3RXaXphcmRQYWdlX3RpdGxlLCAKLQkJCQlKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFHZW5lcmF0b3JQcm9qZWN0V2l6YXJkUGFnZV9kZXNjKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2UgYnVpbGRTY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IFNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2Uoc2VsZWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGJ1aWxkU2VsZWN0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQotCQlMaXN0PElBZGFwdGFibGU+IHNlbGVjdGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PElBZGFwdGFibGU+KDEpOwotCQl0aGlzLmFkZFByb2plY3RUbyhzZWxlY3RlZEVsZW1lbnRzLCBwcm9qZWN0KTsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGVkRWxlbWVudHMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkUHJvamVjdFRvKExpc3Q8SUFkYXB0YWJsZT4gc2VsZWN0ZWRFbGVtZW50cywgSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJaWYocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpCi0JCQkJc2VsZWN0ZWRFbGVtZW50cy5hZGQoSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsKLQkJfSAKLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJLy8gaWdub3JlIHNlbGVjdGVkIGVsZW1lbnQKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpIHsKLQkJaWYgKHRoaXMuZGF0YU1vZGVsID09IG51bGwpIHsKLQkJCXRoaXMuZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoZ2V0RGVmYXVsdFByb3ZpZGVyKCkpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRhdGFNb2RlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBTY2hlbWFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGdlbmVyYXRlIHNjaGVtYSBqb2IgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIEdlbmVyYXRlU2NoZW1hSm9iIGV4dGVuZHMgV29ya3NwYWNlSm9iIHsKLQkJcHJpdmF0ZSBmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10gc291cmNlQ2xhc3NOYW1lczsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFyZ2V0U2NoZW1hOwotCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gdXNlTW94eTsKLQkJCi0JCUdlbmVyYXRlU2NoZW1hSm9iKElKYXZhUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSBzb3VyY2VDbGFzc05hbWVzLCBTdHJpbmcgdGFyZ2V0U2NoZW1hLCBib29sZWFuIHVzZU1veHkpIHsKLQkJCXN1cGVyKEpwdEpheGJVaU1lc3NhZ2VzLlNjaGVtYUdlbmVyYXRvcldpemFyZF9nZW5lcmF0aW5nU2NoZW1hKTsKLQkJCQotCQkJdGhpcy5qYXZhUHJvamVjdCA9IHByb2plY3QgOwotCQkJdGhpcy5zb3VyY2VDbGFzc05hbWVzID0gc291cmNlQ2xhc3NOYW1lczsKLQkJCXRoaXMudGFyZ2V0U2NoZW1hID0gdGFyZ2V0U2NoZW1hOwotCQkJdGhpcy51c2VNb3h5ID0gdXNlTW94eTsKLQotCQkJdGhpcy5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLm1vZGlmeVJ1bGUodGhpcy5qYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgTkxTLmJpbmQoSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hR2VuZXJhdG9yV2l6YXJkX2dlbmVyYXRlU2NoZW1hVGFzaywgdGhpcy50YXJnZXRTY2hlbWEpLCAxKTsKLQkJCXRyeSB7Ci0JCQkJU2NoZW1hR2VuZXJhdG9yLmdlbmVyYXRlKHRoaXMuamF2YVByb2plY3QsIHRoaXMudGFyZ2V0U2NoZW1hLCB0aGlzLnNvdXJjZUNsYXNzTmFtZXMsIHRoaXMudXNlTW94eSwgc20ubmV3Q2hpbGQoMSkpOwotCQkJfQotCQkJY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvc2NoZW1hZ2VuL1NjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9zY2hlbWFnZW4vU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODE0OTBjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9zY2hlbWFnZW4vU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLnNjaGVtYWdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudENvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJvYmxlbXNMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmdlbi5TY2hlbWFHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuZmlsdGVycy5Db250YWluZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuZmlsdGVycy5FbXB0eUlubmVyUGFja2FnZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5maWx0ZXJzLk5vbkFyY2hpdmVPckV4dGVybmFsRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5maWx0ZXJzLk5vbkNvbnRhaW5lckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5maWx0ZXJzLk5vbkphdmFFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogIFNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2UKLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2UgZXh0ZW5kcyBBYnN0cmFjdEphckRlc3RpbmF0aW9uV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdCB0YXJnZXRQcm9qZWN0OwotCi0JLy8gd2lkZ2V0cwotCXByaXZhdGUgU2V0dGluZ3NHcm91cCBzZXR0aW5nc0dyb3VwOwotCXByaXZhdGUgTm9uQ29udGFpbmVyRmlsdGVyIHByb2plY3RGaWx0ZXI7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gdXNlc01veHlDaGVja0JveDsKLQlwcml2YXRlIGJvb2xlYW4gdXNlc01veHk7Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBKUFRfRUNMSVBTRUxJTktfVUlfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aSI7ICAgLy8kTk9OLU5MUy0xJAotCi0JLy8gb3RoZXIgY29uc3RhbnRzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19TRUxFQ1RJT05fV0lER0VUX1dJRFRIID0gNDgwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfU0VMRUNUSU9OX1dJREdFVF9IRUlHSFQgPSAxNTA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUxQX0NPTlRFWFRfSUQgPSBKcHRVaVBsdWdpbi5QTFVHSU5fSUQgKyAiLndpemFyZF9qYXhic2NoZW1hX2NsYXNzZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIoIkpBWEIgU2NoZW1hIEdlbmVyYXRvciIsIHNlbGVjdGlvbiwgbnVsbCk7CS8vJE5PTi1OTFMtMSQKLQotCQl0aGlzLnNldFVzZXNNb3h5KGZhbHNlKTsKLQkJdGhpcy5zZXRUaXRsZShKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX3RpdGxlKTsKLQkJdGhpcy5zZXREZXNjcmlwdGlvbihKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX2Rlc2MpOwotCX0KLQotCS8vICoqKioqKioqKiogSURpYWxvZ1BhZ2UgaW1wbGVtZW50YXRpb24gICoqKioqKioqKioKLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQl0aGlzLnNldENvbnRyb2wodGhpcy5idWlsZFRvcExldmVsQ29udHJvbChwYXJlbnQpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgIAlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCi0gICAgCWlmKHZpc2libGUpIHsKLQkgICAgCXRoaXMudXBkYXRlVGFyZ2V0UHJvamVjdCgpOwotCSAgICAJdGhpcy51cGRhdGVJbnB1dEdyb3VwVHJlZUZpbHRlcigpOwotCQotCQkJLy8gZGVmYXVsdCB1c2VzTW94eSB0byB0cnVlIG9ubHkgd2hlbiBKUFQgRWNsaXBzZUxpbmsgYnVuZGxlIGV4aXN0cyBhbmQgTU9YeSBpcyBvbiB0aGUgY2xhc3NwYXRoCi0JCQl0aGlzLnVwZGF0ZVVzZXNNb3h5KHRoaXMuanB0RWNsaXBzZUxpbmtCdW5kbGVFeGlzdHMoKSAmJiB0aGlzLm1veHlJc09uQ2xhc3NwYXRoKCkpOwotCQotCQkJLy8gY2hlY2tib3ggdmlzaWJsZSBvbmx5IGlmIGpwdC5lY2xpcHNlbGluay51aSBwbHVnaW4gaXMgYXZhaWxhYmxlCi0JCQkvLyBhbmQgRWNsaXBzZUxpbmsgTU9YeSBpcyBub3Qgb24gdGhlIGNsYXNzcGF0aAotCQkJdGhpcy51c2VzTW94eUNoZWNrQm94LnNldFZpc2libGUodGhpcy5qcHRFY2xpcHNlTGlua0J1bmRsZUV4aXN0cygpICYmICEgdGhpcy5tb3h5SXNPbkNsYXNzcGF0aCgpKTsKLQkJCQotCQkJdGhpcy52YWxpZGF0ZVByb2plY3RDbGFzc3BhdGgoKTsKLSAgICAJfQotICAgIH0KLQotCS8vICoqKioqKioqKiogSVdpemFyZFBhZ2UgaW1wbGVtZW50YXRpb24gICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlib29sZWFuIGNvbXBsZXRlID0gdGhpcy52YWxpZGF0ZVNvdXJjZUdyb3VwKCk7Ci0JCQlpZihjb21wbGV0ZSkgewotCQkJCXRoaXMudmFsaWRhdGVQcm9qZWN0Q2xhc3NwYXRoKCk7Ci0JCQl9Ci0JCXJldHVybiBjb21wbGV0ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRQcmV2aW91c1BhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlzdXBlci5zZXRQcmV2aW91c1BhZ2UocGFnZSk7Ci0JCWlmKHRoaXMuZ2V0Q29udHJvbCgpICE9IG51bGwpCi0JCQl0aGlzLnVwZGF0ZVBhZ2VDb21wbGV0aW9uKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldEFsbENoZWNrZWRJdGVtcygpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuYXJyYXkodGhpcy5nZXRJbnB1dEdyb3VwKCkuZ2V0QWxsQ2hlY2tlZExpc3RJdGVtcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlc01veHkoKSB7Ci0JCXJldHVybiB0aGlzLnVzZXNNb3h5OwotCX0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBhZ2VDb21wbGV0aW9uKCkgewotCQlzdXBlci51cGRhdGVQYWdlQ29tcGxldGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRGVzdGluYXRpb25Hcm91cCgpIHsKLQkJLy8gZG8gbm90aGluZwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVNvdXJjZUdyb3VwKCkgewotCQlpZih0aGlzLmdldEFsbENoZWNrZWRJdGVtcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlpZih0aGlzLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpIHsKLQkJCQl0aGlzLnNldEVycm9yTWVzc2FnZShKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX2Vycm9yTm9QYWNrYWdlKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0aGlzLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVByb2plY3RDbGFzc3BhdGgoKSB7Ci0JCWlmKHRoaXMudGFyZ2V0UHJvamVjdCA9PSBudWxsKSB7CQkvLyBwcm9qZWN0IHNlbGVjdGVkIGF2YWlsYWJsZSB5ZXQKLQkJCXJldHVybjsKLQkJfQotCQkvL3RoaXMgbGluZSB3aWxsIHN1cHByZXNzIHRoZSAiZGVmYXVsdCBwYWNrYWdlIiB3YXJuaW5nICh3aGljaCBkb2Vzbid0IHJlYWxseSBhcHBseSBoZXJlCi0JCS8vYXMgdGhlIEpBWEIgZ2VuIHVzZXMgYW4gb3JnLmV4YW1wbGUuc2NoZW1hTmFtZSBwYWNrYWdlIGJ5IGRlZmF1bHQpIGFuZCB3aWxsIGNsZWFyIHRoZSBjbGFzc3BhdGggd2FybmluZ3Mgd2hlbiBuZWNlc3NhcnkKLQkJc2V0TWVzc2FnZShudWxsKTsKLQkJCi0JCWlmKCAhIHRoaXMuZ2VuZXJpY0pheGJJc09uQ2xhc3NwYXRoKCkpIHsKLQkJCXRoaXMuZGlzcGxheVdhcm5pbmcoSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9qYXhiTGlicmFyaWVzTm90QXZhaWxhYmxlKTsKLQkJfQotCQllbHNlIGlmKHRoaXMudXNlc01veHkoKSAmJiAhIHRoaXMubW94eUlzT25DbGFzc3BhdGgoKSkgewotCQkJLy90aGlzIG1lc3NhZ2UgaXMgYmVpbmcgdHJ1bmNhdGVkIGJ5IHRoZSB3aXphcmQgd2lkdGggaW4gc29tZSBjYXNlcwotCQkJdGhpcy5kaXNwbGF5V2FybmluZyhKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX21veHlMaWJyYXJpZXNOb3RBdmFpbGFibGUpOwotCQl9Ci0KLQkJLy90aGlzIGNvZGUgd2lsbCBpbnRlbGxpZ2VudGx5IHJlbW92ZSBvdXIgY2xhc3NwYXRoIHdhcm5pbmdzIHdoZW4gdGhleSBhcmUgcHJlc2VudCBidXQgbm8gbG9uZ2VyIGFwcGx5IChhcyBhbiBhbHRlcm5hdGl2ZSAKLQkJLy90byBzZXR0aW5nIHRoZSBtZXNzYWdlIHRvIG51bGwgY29udGludW91c2x5IGFzIGlzIGN1cnJlbnRseSBkb25lKQotLy8JCWVsc2UgaWYoIHRoaXMuZ2V0TWVzc2FnZSgpICE9IG51bGwpewotLy8JCQlpZiAodGhpcy5nZXRNZXNzYWdlKCkuZXF1YWxzKEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2pheGJMaWJyYXJpZXNOb3RBdmFpbGFibGUpIHx8Ci0vLwkJCQkJdGhpcy5nZXRNZXNzYWdlKCkuZXF1YWxzKEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX21veHlMaWJyYXJpZXNOb3RBdmFpbGFibGUpKSB7IAotLy8JCQkJc2V0TWVzc2FnZShudWxsKTsKLS8vCQkJfQotLy8JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGlmIHRoZSBKYXhiIGNvbXBpbGVyIGlzIG9uIHRoZSBjbGFzc3BhdGguCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGdlbmVyaWNKYXhiSXNPbkNsYXNzcGF0aCgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBTY2hlbWFHZW5lcmF0b3IuSkFYQl9HRU5FUklDX1NDSEVNQV9HRU5fQ0xBU1M7Ci0JCQlJVHlwZSBnZW5DbGFzcyA9IHRoaXMudGFyZ2V0UHJvamVjdC5maW5kVHlwZShjbGFzc05hbWUpOwotCQkJcmV0dXJuIChnZW5DbGFzcyAhPSBudWxsKTsKLQkJfSAKLQkJY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRvcExldmVsQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEhFTFBfQ09OVEVYVF9JRCk7Ci0JCQotCQl0aGlzLnNldHRpbmdzR3JvdXAgPSBuZXcgU2V0dGluZ3NHcm91cChjb21wb3NpdGUpOwotCi0JCXRoaXMudXNlc01veHlDaGVja0JveCA9IHRoaXMuYnVpbGRVc2VzTW94eUNoZWNrQm94KGNvbXBvc2l0ZSk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVUYXJnZXRQcm9qZWN0KCkgewotICAgIAkKLQkJdGhpcy50YXJnZXRQcm9qZWN0ID0gKChTY2hlbWFHZW5lcmF0b3JXaXphcmQpdGhpcy5nZXRXaXphcmQoKSkuZ2V0SmF2YVByb2plY3QoKTsKLQl9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlSW5wdXRHcm91cFRyZWVGaWx0ZXIoKSB7Ci0gICAgCXRoaXMuZ2V0SW5wdXRHcm91cCgpLnNldEFsbFNlbGVjdGlvbnMoZmFsc2UpOwotICAgIAkKLSAgICAJaWYodGhpcy5wcm9qZWN0RmlsdGVyICE9IG51bGwpIHsKLSAgICAJCXRoaXMuZ2V0SW5wdXRHcm91cCgpLnJlbW92ZVRyZWVGaWx0ZXIodGhpcy5wcm9qZWN0RmlsdGVyKTsKLSAgICAJfQotICAgIAl0aGlzLnByb2plY3RGaWx0ZXIgPSBuZXcgTm9uQ29udGFpbmVyRmlsdGVyKHRoaXMudGFyZ2V0UHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJdGhpcy5nZXRJbnB1dEdyb3VwKCkuYWRkVHJlZUZpbHRlcih0aGlzLnByb2plY3RGaWx0ZXIpOwotICAgIH0KLQotCXByaXZhdGUgYm9vbGVhbiBqcHRFY2xpcHNlTGlua0J1bmRsZUV4aXN0cygpIHsKLQkJcmV0dXJuICh0aGlzLmdldEpwdEVjbGlwc2VMaW5rQnVuZGxlKCkgIT0gbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgQnVuZGxlIGdldEpwdEVjbGlwc2VMaW5rQnVuZGxlKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QnVuZGxlKEpQVF9FQ0xJUFNFTElOS19VSV9QTFVHSU5fSUQpOwkvLyBDYW5ub3QgcmVmZXJlbmNlIGRpcmVjdGx5IEVMIHBsdWdpbi4KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VXNlc01veHkoYm9vbGVhbiB1c2VzTW94eSl7Ci0JCXRoaXMudXNlc01veHkgPSB1c2VzTW94eTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVVzZXNNb3h5KGJvb2xlYW4gdXNlc01veHkpewotCQl0aGlzLnNldFVzZXNNb3h5KHVzZXNNb3h5KTsKLQkJdGhpcy51c2VzTW94eUNoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLnVzZXNNb3h5KCkpOwotCQl0aGlzLnZhbGlkYXRlUHJvamVjdENsYXNzcGF0aCgpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgaWYgdGhlIEVjbGlwc2VMaW5rIEpheGIgY29tcGlsZXIgaXMgb24gdGhlIGNsYXNzcGF0aC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbW94eUlzT25DbGFzc3BhdGgoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gU2NoZW1hR2VuZXJhdG9yLkpBWEJfRUNMSVBTRUxJTktfU0NIRU1BX0dFTl9DTEFTUzsKLQkJCUlUeXBlIGdlbkNsYXNzID0gdGhpcy50YXJnZXRQcm9qZWN0LmZpbmRUeXBlKGNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gKGdlbkNsYXNzICE9IG51bGwpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlXYXJuaW5nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMuc2V0TWVzc2FnZShtZXNzYWdlLCBXQVJOSU5HKTsKLQl9Ci0KLQlwcml2YXRlIENoZWNrYm94VHJlZUFuZExpc3RHcm91cCBnZXRJbnB1dEdyb3VwKCkgewotCQlyZXR1cm4gdGhpcy5zZXR0aW5nc0dyb3VwLmlucHV0R3JvdXA7Ci0JfQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciB0aGlzIHBhZ2UncyBjb2xsZWN0aW9uIG9mIGN1cnJlbnRseS1zcGVjaWZpZWQKLQkgKiBlbGVtZW50cyB0byBiZSBleHBvcnRlZC4gVGhpcyBpcyB0aGUgcHJpbWFyeSBlbGVtZW50IHNlbGVjdGlvbiBmYWNpbGl0eQotCSAqIGFjY2Vzc29yIGZvciBzdWJjbGFzc2VzLgotCSAqCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIGN1cnJlbnRseSBzZWxlY3RlZCBmb3IgZXhwb3J0Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8+IGdldFNlbGVjdGVkUmVzb3VyY2VzSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmdldElucHV0R3JvdXAoKS5nZXRBbGxDaGVja2VkTGlzdEl0ZW1zKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQl0aGlzLnVwZGF0ZVBhZ2VDb21wbGV0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHZvaWQgc2F2ZVdpZGdldFZhbHVlcygpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGludGVybmFsU2F2ZVdpZGdldFZhbHVlcygpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVXaWRnZXRWYWx1ZXMoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKYXJQYWNrYWdlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGdpdmVGb2N1c1RvRGVzdGluYXRpb24oKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvLyAqKioqKioqKioqIFVJIGNvbXBvbmVudHMgKioqKioqKioqKgotCQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkVXNlc01veHlDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0JCWNoZWNrQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljaGVja0JveC5zZXRUZXh0KEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX3VzZXNNb3h5SW1wbGVtZW50YXRpb24pOwotCQljaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy51c2VzTW94eSgpKTsKLQkJY2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZFVzZXNNb3h5U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRVc2VzTW94eVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlVXNlc01veHkodXNlc01veHlDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJdmFsaWRhdGVQcm9qZWN0Q2xhc3NwYXRoKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8vICoqKioqKioqKiogU2V0dGluZ3NHcm91cCBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIFNldHRpbmdzR3JvdXAgewotCi0JCXByaXZhdGUgQ2hlY2tib3hUcmVlQW5kTGlzdEdyb3VwIGlucHV0R3JvdXA7Ci0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkJcHJpdmF0ZSBTZXR0aW5nc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCWJ1aWxkU2NoZW1hQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0KLQkJCS8vIElucHV0IFRyZWUKLQkJCWNyZWF0ZVBsYWluTGFiZWwoY29tcG9zaXRlLCBKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX3BhY2thZ2VzKTsKLQkJCXRoaXMuaW5wdXRHcm91cCA9IHRoaXMuY3JlYXRlSW5wdXRHcm91cChjb21wb3NpdGUpOwotCQotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBidWlsZFNjaGVtYUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOyAgLy8gZmFsc2UgPSBkbyBub3QgbWFrZSBjb2x1bW5zIGVxdWFsIHdpZHRoCi0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMTA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJfQotCi0JCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0JCQotCQkvKioKLQkJICogQ3JlYXRlcyB0aGUgY2hlY2tib3ggdHJlZSBhbmQgbGlzdCBmb3Igc2VsZWN0aW5nIHJlc291cmNlcy4KLQkJICoKLQkJICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLQkJICovCi0JCXByb3RlY3RlZCBDaGVja2JveFRyZWVBbmRMaXN0R3JvdXAgY3JlYXRlSW5wdXRHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDaGVja2JveFRyZWVBbmRMaXN0R3JvdXAgY2hlY2tib3hUcmVlR3JvdXA7Ci0JCQkKLQkJCWludCBsYWJlbEZsYWdzID0gSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfQkFTSUNTCi0JCQkJCQkJfCBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuU0hPV19PVkVSTEFZX0lDT05TCi0JCQkJCQkJfCBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuU0hPV19TTUFMTF9JQ09OUzsKLQkJCUlUcmVlQ29udGVudFByb3ZpZGVyIHRyZWVDb250ZW50UHJvdmlkZXI9Ci0JCQkJbmV3IFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCQkJLy8gcHJldmVudCB0aGUgKyBmcm9tIGJlaW5nIHNob3duIGluIGZyb250IG9mIHBhY2thZ2VzCi0JCQkJCQlyZXR1cm4gIShlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgJiYgc3VwZXIuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJZmluYWwgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIobmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcihsYWJlbEZsYWdzKSwgbmV3IFByb2JsZW1zTGFiZWxEZWNvcmF0b3IobnVsbCkpOwotCQkJY2hlY2tib3hUcmVlR3JvdXAgPSBuZXcgQ2hlY2tib3hUcmVlQW5kTGlzdEdyb3VwKAotCQkJCQkJcGFyZW50LAotCQkJCQkJSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpLAotCQkJCQkJdHJlZUNvbnRlbnRQcm92aWRlciwKLQkJCQkJCXByb3ZpZGVyLAotCQkJCQkJbmV3IFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIoKSwKLQkJCQkJCXByb3ZpZGVyLAotCQkJCQkJU1dULk5PTkUsCi0JCQkJCQlTSVpJTkdfU0VMRUNUSU9OX1dJREdFVF9XSURUSCwKLQkJCQkJCVNJWklOR19TRUxFQ1RJT05fV0lER0VUX0hFSUdIVCk7Ci0JCQljaGVja2JveFRyZWVHcm91cC5hZGRUcmVlRmlsdGVyKG5ldyBFbXB0eUlubmVyUGFja2FnZUZpbHRlcigpKTsKLQkJCWNoZWNrYm94VHJlZUdyb3VwLnNldFRyZWVDb21wYXJhdG9yKG5ldyBKYXZhRWxlbWVudENvbXBhcmF0b3IoKSk7Ci0JCQljaGVja2JveFRyZWVHcm91cC5zZXRMaXN0Q29tcGFyYXRvcihuZXcgSmF2YUVsZW1lbnRDb21wYXJhdG9yKCkpOwotCQkJCi0JCQljaGVja2JveFRyZWVHcm91cC5hZGRUcmVlRmlsdGVyKG5ldyBOb25KYXZhRWxlbWVudEZpbHRlcigpKTsKLQkJCWNoZWNrYm94VHJlZUdyb3VwLmFkZFRyZWVGaWx0ZXIobmV3IE5vbkFyY2hpdmVPckV4dGVybmFsRWxlbWVudEZpbHRlcigpKTsKLQkJCQotCQkJY2hlY2tib3hUcmVlR3JvdXAuYWRkTGlzdEZpbHRlcihuZXcgQ29udGFpbmVyRmlsdGVyKCkpOwotCQkJY2hlY2tib3hUcmVlR3JvdXAuYWRkTGlzdEZpbHRlcihuZXcgTm9uSmF2YUVsZW1lbnRGaWx0ZXIoKSk7Ci0JCQkKLQkJCWNoZWNrYm94VHJlZUdyb3VwLmdldFRyZWUoKS5hZGRMaXN0ZW5lcihTV1QuTW91c2VVcCwgU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZS50aGlzKTsKLQkJCWNoZWNrYm94VHJlZUdyb3VwLmdldFRhYmxlKCkuYWRkTGlzdGVuZXIoU1dULk1vdXNlVXAsIFNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2UudGhpcyk7Ci0KLQkJCUlDaGVja1N0YXRlTGlzdGVuZXIgbGlzdGVuZXIgID0gbmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9OwotCi0JICAgICAgICBjaGVja2JveFRyZWVHcm91cC5hZGRDaGVja1N0YXRlTGlzdGVuZXIobGlzdGVuZXIpOwotCSAgICAgICAgcmV0dXJuIGNoZWNrYm94VHJlZUdyb3VwOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2YxOWIxLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjU4MzcuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTA6NDcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwMDkzOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjRmZGMxLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgKE9wdGlvbmFsKQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ3YWQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuNC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlIiB2ZXJzaW9uPSIyLjMuMCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTllNWYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNmY2Q2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvKiosXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZiBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci0KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjIwODJmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYWJlNjYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNmI3YWQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydCAoT3B0aW9uYWwpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgRWNsaXBzZUxpbmsgU3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjU5ZTVmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjZmNkNi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyoqLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyMDgyZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzY1ZDNkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotZmVhdHVyZS50ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmVfMS4wLjEuKgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZjkxNTcuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzdkNGIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjA5OjU5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3OWNjYi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlODM2MTcuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IFNESyAoT3B0aW9uYWwpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSBhcmNoaXZlcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIC0gRWNsaXBzZUxpbmsgU3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOGNlZTUuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjQuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8uY3ZzaWdub3JlIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlYjJmMC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI1ODM3Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjEwOjQ3IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMDA5MzkuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM5NjdiYi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWY0NWEwLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjQuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5mZWF0dXJlIiB2ZXJzaW9uPSIxLjguMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsZGV2dG9vbHMuZmVhdHVyZSIgdmVyc2lvbj0iMS44LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjguMCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRiIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRiLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sYW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMS4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUub3JvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC44LnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5qZG9tIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUudmVsb2NpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMjg4YWUuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTUyOWIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGVjbGlwc2UzMi5naWYsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3NTk0ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwZGFkMy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjY2NlMS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjE2MzRkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDgsIDIwMTAuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTk1MjliLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBlY2xpcHNlMzIuZ2lmLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkMDBiYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLQotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNzU5NGQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLnByb2plY3QgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNzYwZjIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1Yjg0YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMToxNyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmE0ZGNlLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjA5MzUyLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIEpVbml0IFRlc3RzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi0jIFRPUkVWSUVXIC0gdXBkYXRlU2l0ZU5hbWUKLXVwZGF0ZVNpdGVOYW1lPVdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgVGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJmYjkyYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjQuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2NWQzZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWZlYXR1cmUudGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlXzEuMC4xLioKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2RhNzUwLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2M3ZDRiLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNTowOTo1OSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkN2FiOGQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmZlOGNhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgYXJjaGl2ZXMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZTZhYTkuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjQuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kb2MuaXN2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0Y2EzLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0MDFhMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qcHRfMS4wLjAuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhOWJlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlYzI5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDowOSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MDdhOGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuNC4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTYwNmIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2Fib3V0LmluaSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODhiOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAidGlwc0FuZFRyaWNrc0hyZWYiIGNvbnRhaW5zIHRoZSBIZWxwIHRvcGljIGhyZWYgdG8gYSB0aXBzIGFuZCB0cmlja3MgcGFnZSAKLSMgb3B0aW9uYWwKLXRpcHNBbmRUcmlja3NIcmVmPS9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQotCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9hYm91dC5tYXBwaW5ncyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI4MjFlMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBPcmFjbGUgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNiwgMjAwOS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTA4OWJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9jb21wb25lbnQueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMmMyNmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nIj4KLTxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj4KLTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmciIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmRiIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZ2VuIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2FkZDIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5NmRkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1qYXZhQ29tcGlsZXIuLi5hcmdzLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZWE1ZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRiLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmE3ZGIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgSmFuIDE1IDExOjExOjIyIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDJjMjg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gTWF5IDI3IDE0OjU5OjQyIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkZDhmNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmRiLnVpCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5kYjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbHRvb2xzLmVkaXRvci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmdlbmVyaWMudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMSwyLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmRiLnVpLmludGVybmFsOyB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkiCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxODM3ZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjVjOGMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSAgQ29udHJpYnV0b3JzOgotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotCi08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuZGIudWkiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWMzOTZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gREIgVUkKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3VpL2ludGVybmFsL0RUUFVpVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3VpL2ludGVybmFsL0RUUFVpVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUwZmQ2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi91aS9pbnRlcm5hbC9EVFBVaVRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSVByb2ZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LlByb2ZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZ2VuZXJpYy51aS53aXphcmQuTmV3SkRCQ0ZpbHRlcmVkQ1BXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogRFRQIFVJIHRvb2xzCi0gKi8KLXB1YmxpYyBjbGFzcyBEVFBVaVRvb2xzIHsKLQotCS8qKgotCSAqIExhdW5jaCB0aGUgRFRQIE5ldyBDb25uZWN0aW9uIFByb2ZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICogCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYWRkZWQgcHJvZmlsZSwgb3IgbnVsbCBpZiB0aGUgd2l6YXJkIHdhcyBjYW5jZWxsZWQuCi0JICogVGhlIG5hbWUgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBEYWxpIGNvbm5lY3Rpb24gcHJvZmlsZSBmcm9tCi0JICogSnB0RGJQbHVnaW4uZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZU5ld0Nvbm5lY3Rpb25Qcm9maWxlKCkgewotCQkvLyBGaWx0ZXIgZGF0YXNvdXJjZSBjYXRlZ29yeQotCQlOZXdKREJDRmlsdGVyZWRDUFdpemFyZCAgd2l6YXJkID0gbmV3IE5ld0pEQkNGaWx0ZXJlZENQV2l6YXJkKCk7Ci0JCVdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCXdpemFyZERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQotCQlMb2NhbFByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbFByb2ZpbGVMaXN0ZW5lcigpOwotCQlQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFByb2ZpbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJU3RyaW5nIG5ld0NQTmFtZSA9IG51bGw7Ci0JCWlmICh3aXphcmREaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJLy8gYXNzdW1lIHRoZSBsYXN0IGFkZGVkIHByb2ZpbGUgaXMgdGhlIG9uZSB3ZSB3YW50Ci0JCQluZXdDUE5hbWUgPSBsaXN0ZW5lci5hZGRlZFByb2ZpbGUuZ2V0TmFtZSgpOwotCQl9Ci0JCVByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlyZXR1cm4gbmV3Q1BOYW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFAgcHJvZmlsZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGxpc3RlbmVyIHNpbXBseSBob2xkcyBvbiB0byB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjb25uZWN0aW9uCi0JICogcHJvZmlsZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgTG9jYWxQcm9maWxlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvZmlsZUxpc3RlbmVyIHsKLQkJSUNvbm5lY3Rpb25Qcm9maWxlIGFkZGVkUHJvZmlsZTsKLQkJCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVBZGRlZChJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5hZGRlZFByb2ZpbGUgPSBwcm9maWxlOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVDaGFuZ2VkKElDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkKLQkJcHVibGljIHZvaWQgcHJvZmlsZURlbGV0ZWQoSUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCi0vLwkvLyAqKioqKioqKioqIHZpZXdlciBmaWx0ZXIgKioqKioqKioqKgotLy8KLS8vCXN0YXRpYyBjbGFzcyBMb2NhbFZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0vLwotLy8JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRV9DQVRFR09SWV9JRCA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQlMb2NhbFZpZXdlckZpbHRlcigpIHsKLS8vCQkJc3VwZXIoKTsKLS8vCQl9Ci0vLwotLy8JCUBPdmVycmlkZQotLy8JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLS8vCQkJQ1BXaXphcmROb2RlIHdpemFyZE5vZGUgPSAoQ1BXaXphcmROb2RlKSBlbGVtZW50OwotLy8JCQlJUHJvZmlsZVdpemFyZFByb3ZpZGVyIHdpemFyZFByb3ZpZGVyID0gd2l6YXJkTm9kZS5nZXRQcm92aWRlcigpOwotLy8JCQlpZiAod2l6YXJkUHJvdmlkZXIgaW5zdGFuY2VvZiBJV2l6YXJkQ2F0ZWdvcnlQcm92aWRlcikgewotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0vLwkJCUlDYXRlZ29yeSBjYXRlZ29yeSA9IENvbm5lY3Rpb25Qcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb3ZpZGVyKAotLy8JCQkJCQkJKChQcm9maWxlV2l6YXJkUHJvdmlkZXIpIHdpemFyZFByb3ZpZGVyKS5nZXRQcm9maWxlKCkpLmdldENhdGVnb3J5KCk7Ci0vLwkJCQotLy8JCQkvLyBPbmx5IGRpc3BsYXkgd2l6YXJkcyBiZWxvbmcgdG8gZGF0YWJhc2UgY2F0ZWdvcnkKLS8vCQkJd2hpbGUgKGNhdGVnb3J5ICE9IG51bGwpIHsKLS8vCQkJCWlmIChjYXRlZ29yeS5nZXRJZCgpLmVxdWFscyhEQVRBQkFTRV9DQVRFR09SWV9JRCkpIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLS8vCQkJCWNhdGVnb3J5ID0gY2F0ZWdvcnkuZ2V0UGFyZW50KCk7Ci0vLwkJCX0KLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5jbGFzc3BhdGggYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk2ZGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLUBkb3QKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLWphdmFDb21waWxlci4uLmFyZ3MuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3NWE0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZWJiNWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBKYW4gMTUgMTE6MTE6MDIgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOWQ1NDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTk6MTggRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzNhOTM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZGIKLUJ1bmRsZS1WZXJzaW9uOiAxLjMuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5kYi5KcHREYlBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5qZHQuY2xhc3NwYXRoO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuZWRpdG9yLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuZGIsCi0gb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjt4LWludGVybmFsOj10cnVlCi1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudGV4dDt2ZXJzaW9uPSI0LjAuMSIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2MjkwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2U9MS41Ci1qYXZhY1RhcmdldD0xLjUKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzkxNzQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSAgQ29udHJpYnV0b3JzOgotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotCi08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuZGIiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYiIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjkxOTkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gREIKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0NhdGFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0NhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljZmQwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9DYXRhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYjsKLQotLyoqCi0gKiBEYXRhYmFzZSBjYXRhbG9nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhdGFsb2cgZXh0ZW5kcyBTY2hlbWFDb250YWluZXIgewotCS8vIG5vdGhpbmcgeWV0Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0NvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWVlM2ZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0NvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuSmF2YVR5cGU7Ci0KLS8qKgotICogRGF0YWJhc2UgY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbHVtbiBleHRlbmRzIERhdGFiYXNlT2JqZWN0IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29sdW1uJ3MgdGFibGUuCi0JICovCi0JVGFibGUgZ2V0VGFibGUoKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJhaW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sdW1uIGlzIHBhcnQgb2YgaXRzIHRhYmxlJ3MgcHJpbWFyeSBrZXkuCi0JICovCi0JYm9vbGVhbiBpc1BhcnRPZlByaW1hcnlLZXkoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgcGFydCBvZiBvbmUgb2YgaXRzIHRhYmxlJ3MgZm9yZWlnbiBrZXlzLgotCSAqLwotCWJvb2xlYW4gaXNQYXJ0T2ZGb3JlaWduS2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sdW1uIGlzIHBhcnQgb2YgYSB1bmlxdWUgY29uc3RyYWludCBkZWZpbmVkIGZvciBpdHMKLQkgKiB0YWJsZS4KLQkgKi8KLQlib29sZWFuIGlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBudWxsYWJsZS4KLQkgKi8KLQlib29sZWFuIGlzTnVsbGFibGUoKTsKLQotCi0JLy8gKioqKioqKioqKiBkYXRhIHR5cGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4ncyBkYXRhdHlwZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sdW1uJ3MgdHlwZSBpcyBudW1lcmljLgotCSAqLwotCWJvb2xlYW4gaXNOdW1lcmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbHVtbidzIHByZWNpc2lvbiBpZiBpdCBpcyBhIE51bWVyaWNhbERhdGFUeXBlOwotCSAqIG90aGVyd2lzZSwgcmV0dXJuIC0xLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UHJlY2lzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbHVtbidzIHNjYWxlIGlmIGl0IGlzIGFuIEV4YWN0TnVtZXJpY0RhdGFUeXBlOwotCSAqIG90aGVyd2lzZSwgcmV0dXJuIC0xLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2NhbGUoKTsKLQotCS8qKgotCSAqIElmIHRoZSBjb2x1bW4gaXMgYSBDaGFyYWN0ZXJTdHJpbmdEYXRhVHlwZSwgcmV0dXJuIGl0cyBsZW5ndGg7Ci0JICogb3RoZXJ3aXNlLCByZXR1cm4gLTEuCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2x1bW4ncyBkYXRhdHlwZSBpcyBhIExPQiB0eXBlCi0JICogKGkuZS4gQkxPQiwgQ0xPQiwgb3IgTkNMT0IpLgotCSAqLwotCWJvb2xlYW4gaXNMT0IoKTsKLQotCi0JLy8gKioqKioqKioqKiBKYXZhIHR5cGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgSmF2YSB0eXBlIGRlY2xhcmF0aW9uIHRoYXQgaXMgcmVhc29uYWJseQotCSAqIHNpbWlsYXIgdG8gdGhlIGNvbHVtbidzIGRhdGEgdHlwZS4KLQkgKi8KLQlTdHJpbmcgZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgSmF2YSB0eXBlIHRoYXQgaXMgcmVhc29uYWJseQotCSAqIHNpbWlsYXIgdG8gdGhlIGNvbHVtbidzIGRhdGEgdHlwZS4KLQkgKi8KLQlKYXZhVHlwZSBnZXRKYXZhVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgSmF2YSB0eXBlIGRlY2xhcmF0aW9uIHRoYXQgaXMgcmVhc29uYWJseQotCSAqIHNpbWlsYXIgdG8gdGhlIGNvbHVtbidzIGRhdGEgdHlwZSBhbmQgc3VpdGFibGUgZm9yIHVzZSBhcyBhCi0JICogcHJpbWFyeSBrZXkgZmllbGQuCi0JICovCi0JU3RyaW5nIGdldFByaW1hcnlLZXlKYXZhVHlwZURlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBKYXZhIHR5cGUgdGhhdCBpcyByZWFzb25hYmx5Ci0JICogc2ltaWxhciB0byB0aGUgY29sdW1uJ3MgZGF0YSB0eXBlIGFuZCBzdWl0YWJsZSBmb3IgdXNlIGFzIGEKLQkgKiBwcmltYXJ5IGtleSBmaWVsZC4KLQkgKi8KLQlKYXZhVHlwZSBnZXRQcmltYXJ5S2V5SmF2YVR5cGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvbkFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOGYzZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi0vKioKLSAqIEFuIGVtcHR5IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb25uZWN0aW9uTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBDb25uZWN0aW9uTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgYWJvdXRUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmaWVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjYXRhbG9nQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDYXRhbG9nIGNhdGFsb2cpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2NoZW1hIHNjaGVtYSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgc2VxdWVuY2VDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNlcXVlbmNlIHNlcXVlbmNlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgVGFibGUgdGFibGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbHVtbkNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ29sdW1uIGNvbHVtbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgZm9yZWlnbktleUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25MaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMTViOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYjsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi0vKioKLSAqIEEgPGNvZGU+Q29ubmVjdGlvbkxpc3RlbmVyPC9jb2RlPiBpcyBub3RpZmllZCBvZiBhbnkgY2hhbmdlcyB0byBhIGNvbm5lY3Rpb24uCi0gKiA8cD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JTWFuYWdlZENvbm5lY3Rpb25MaXN0ZW5lcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKTsKLQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKTsKLQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSk7Ci0JcHVibGljIHZvaWQgYWJvdXRUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpOwotCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKTsKLQotCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBEYXRhYmFzZSBkYXRhYmFzZSk7Ci0JcHVibGljIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ2F0YWxvZyBjYXRhbG9nKTsKLQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNjaGVtYSBzY2hlbWEpOwotCXB1YmxpYyB2b2lkIHNlcXVlbmNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTZXF1ZW5jZSBzZXF1ZW5jZSk7Ci0JcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFRhYmxlIHRhYmxlKTsKLQlwdWJsaWMgdm9pZCBjb2x1bW5DaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENvbHVtbiBjb2x1bW4pOwotCXB1YmxpYyB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25Qcm9maWxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTZhN2U4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25Qcm9maWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuamRiYy5JSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHM7Ci0KLS8qKgotICogRGF0YWJhc2UgY29ubmVjdGlvbiBwcm9maWxlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb25Qcm9maWxlIGV4dGVuZHMgRGF0YWJhc2VPYmplY3QgewotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0aWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29ubmVjdGlvbiBwcm9maWxlJ3MgZGF0YWJhc2UuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyBpbmFjdGl2ZS4KLQkgKi8KLQlEYXRhYmFzZSBnZXREYXRhYmFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIElEIG9mIHRoZSBwcm92aWRlciBtYW5hZ2luZyB0aGUgRFRQIHByb2ZpbGUuCi0JICovCi0JU3RyaW5nIGdldFByb3ZpZGVySUQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29ubmVjdGlvbiBwcm9maWxlJ3Mgc3RhdGljIElELgotCSAqLwotCVN0cmluZyBnZXRJbnN0YW5jZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgZGF0YWJhc2UgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGF0YWJhc2VOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIHByb2R1Y3QgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGF0YWJhc2VQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIHZlbmRvci4KLQkgKi8KLQlTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UgdmVyc2lvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRyaXZlciBjbGFzcyBuYW1lLgotCSAqLwotCVN0cmluZyBnZXREcml2ZXJDbGFzc05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBjb25uZWN0aW9uIFVSTC4KLQkgKi8KLQlTdHJpbmcgZ2V0VVJMKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgdXNlciBuYW1lLgotCSAqLwotCVN0cmluZyBnZXRVc2VyTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHVzZXIgcGFzc3dvcmQuCi0JICovCi0JU3RyaW5nIGdldFVzZXJQYXNzd29yZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBEcml2ZXIgZGVmaW5pdGlvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGphciBsaXN0IGZvciB0aGUgYXNzb2NpYXRlZCBEcml2ZXIgYXMgYSAKLQkgKiBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nLgotCSAqLwotCVN0cmluZyBnZXREcml2ZXJKYXJMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgRHJpdmVyIGRlZmluaXRpb24uCi0JICovCi0JU3RyaW5nIGdldERyaXZlck5hbWUoKTsKLQotCS8vICoqKioqKioqKiogY29ubmVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvZmlsZSBpcyBlaXRoZXIgY29ubmVjdGVkIHRvIGEgbGl2ZSBkYXRhYmFzZQotCSAqIHNlc3Npb24gb3Igd29ya2luZyBvZmYtbGluZSAoaS5lLiBpdCBoYXMgYWNjZXNzIHRvIG1ldGEtZGF0YSkuCi0JICogQHNlZSBpc0Nvbm5lY3RlZCgpCi0JICogQHNlZSBpc1dvcmtpbmdPZmZsaW5lKCkKLQkgKi8KLQlib29sZWFuIGlzQWN0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvZmlsZSBpcyBuZWl0aGVyIGNvbm5lY3RlZCB0byBhIGxpdmUgZGF0YWJhc2UKLQkgKiBzZXNzaW9uIG5vciB3b3JraW5nIG9mZi1saW5lIChpLmUuIGl0IGhhcyBhY2Nlc3MgdG8gbWV0YS1kYXRhKS4KLQkgKiBAc2VlIGlzQWN0aXZlKCkKLQkgKi8KLQlib29sZWFuIGlzSW5hY3RpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwcm9maWxlIGlzIGNvbm5lY3RlZCB0byBhIGxpdmUgZGF0YWJhc2Ugc2Vzc2lvbgotCSAqIChpLmUuIHRoZSBtZXRhLWRhdGEgY29tZXMgZnJvbSB0aGUgZGF0YWJhc2UpLCBhcyBvcHBvc2VkIHRvIHdvcmtpbmcKLQkgKiBvZmYtbGluZS4KLQkgKiBAc2VlICNpc0FjdGl2ZSgpCi0JICovCi0JYm9vbGVhbiBpc0Nvbm5lY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb2ZpbGUgaXMgbm90IGNvbm5lY3RlZCB0byBhIGxpdmUgZGF0YWJhc2Ugc2Vzc2lvbgotCSAqIChpLmUuIHRoZSBtZXRhLWRhdGEgY29tZXMgZnJvbSB0aGUgZGF0YWJhc2UpLCBhcyBvcHBvc2VkIHRvIHdvcmtpbmcKLQkgKiBvZmYtbGluZS4KLQkgKiBAc2VlICNpc0Nvbm5lY3RlZCgpCi0JICovCi0JYm9vbGVhbiBpc0Rpc2Nvbm5lY3RlZCgpOwotCi0JLyoqCi0JICogQ29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0JICogQHNlZSAjZGlzY29ubmVjdCgpCi0JICovCi0Jdm9pZCBjb25uZWN0KCk7Ci0KLQkvKioKLQkgKiBEaXNjb25uZWN0IGZyb20gdGhlIGRhdGFiYXNlLgotCSAqIEBzZWUgI2Nvbm5lY3QoKQotCSAqLwotCXZvaWQgZGlzY29ubmVjdCgpOwotCi0KLQkvLyAqKioqKioqKioqIG9mZi1saW5lIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb2ZpbGUgaXMgd29ya2luZyBvZmYtbGluZSAoaS5lLiB0aGUgbWV0YS1kYXRhCi0JICogY29tZXMgZnJvbSBhIGxvY2FsIGNhY2hlKSwgYXMgb3Bwb3NlZCB0byBjb25uZWN0ZWQgdG8gYSBsaXZlCi0JICogZGF0YWJhc2Ugc2Vzc2lvbi4KLQkgKiBAc2VlICNpc0FjdGl2ZSgpCi0JICovCi0JYm9vbGVhbiBpc1dvcmtpbmdPZmZsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29ubmVjdGlvbiBmYWN0b3JpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqIGNvbm5lY3Rpb24gcHJvZmlsZSdzIHByb3ZpZGVyIHN1cHBvcnQgd29ya2luZyBvZmZsaW5lLgotCSAqLwotCWJvb2xlYW4gc3VwcG9ydHNXb3JrT2ZmbGluZU1vZGUoKTsKLQotCS8qKgotCSAqIFNhdmUgdGhlIHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgZm9yIHdvcmtpbmcgaW4gYW4gb2ZmbGluZSBtb2RlLgotCSAqIElmIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgZG9lcyBub3Qgc3VwcG9ydCB3b3JraW5nIGluIGFuIG9mZmxpbmUgbW9kZSwgbm8KLQkgKiBleGNlcHRpb24gaXMgdGhyb3duIGFuZCB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCUlTdGF0dXMgc2F2ZVdvcmtPZmZsaW5lRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBzdXBwb3J0cyB3b3JraW5nIG9mZmxpbmUgYW5kIGRhdGEKLQkgKiBoYXMgYmVlbiBzYXZlZCBmb3Igd29ya2luZyBvZmZsaW5lLgotCSAqLwotCWJvb2xlYW4gY2FuV29ya09mZmxpbmUoKTsKLQotCS8qKgotCSAqIEJlZ2luIHdvcmtpbmcgb2ZmLWxpbmUuCi0JICovCi0JSVN0YXR1cyB3b3JrT2ZmbGluZSgpOwotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGxpc3RlbmVyIHRvIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICovCi0Jdm9pZCBhZGRDb25uZWN0aW9uTGlzdGVuZXIoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gbGlzdGVuZXIgZnJvbSB0aGUgY29ubmVjdGlvbiBwcm9maWxlLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RhbnRzICoqKioqKioqKioKLQotCVN0cmluZyBDT05ORUNUSU9OX1BST0ZJTEVfVFlQRSA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmdlbmVyaWMuY29ubmVjdGlvblByb2ZpbGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBEUklWRVJfREVGSU5JVElPTl9QUk9QX0lEID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVyRGVmaW5pdGlvbklEIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRFJJVkVSX0RFRklOSVRJT05fVFlQRV9QUk9QX0lEID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5kZWZuVHlwZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERSSVZFUl9KQVJfTElTVF9QUk9QX0lEID0gImphckxpc3QiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBEQVRBQkFTRV9TQVZFX1BXRF9QUk9QX0lEID0gSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlBST1BfUFJFRklYICsgInNhdmVQV0QiOyAgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uUHJvZmlsZUFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25Qcm9maWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzJiNTZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25Qcm9maWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLS8qKgotICogQW4gZW1wdHkgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvblByb2ZpbGVBZGFwdGVyIGltcGxlbWVudHMgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZUFkZGVkKFN0cmluZyBuYW1lKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZVJlbW92ZWQoU3RyaW5nIG5hbWUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVuYW1lZChTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uUHJvZmlsZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwMWM1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uUHJvZmlsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi0vKioKLSAqIERhdGFiYXNlIGNvbm5lY3Rpb24gcHJvZmlsZSBmYWN0b3J5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBEVFAgY29ubmVjdGlvbiBwcm9maWxlcyB0aGUgZmFjdG9yeSBjYW4gd3JhcCB3aXRoCi0JICogbmV3IGNvbm5lY3Rpb24gcHJvZmlsZXMuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgY29ubmVjdGlvbiBwcm9maWxlIHRoYXQgd3JhcHMgdGhlIERUUCBjb25uZWN0aW9uCi0JICogcHJvZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBEVFAgY29ubmVjdGlvbiBwcm9maWxlIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UgaWRlbnRpZmllciBhZGFwdGVyIHRvIGFsbG93IGNsaWVudHMgdG8gY29udHJvbCBob3cKLQkgKiBkYXRhYmFzZSBpZGVudGlmaWVycyBhcmUgY29udmVydGVkIHRvIG5hbWVzIGFuZCB2aWNlIHZlcnNhLgotCSAqLwotCUNvbm5lY3Rpb25Qcm9maWxlIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoU3RyaW5nIG5hbWUsIERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIgYWRhcHRlcik7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgY29ubmVjdGlvbiBwcm9maWxlIHRoYXQgd3JhcHMgdGhlIERUUCBjb25uZWN0aW9uCi0JICogcHJvZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBEVFAgY29ubmVjdGlvbiBwcm9maWxlIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUuCi0JICogPHA+Ci0JICogQ2xpZW50cyBzaG91bGQgdXNlIHRoaXMgbWV0aG9kIHdoZW4gYSBKUEEgcGxhdGZvcm0gaXMgdW5hdmFpbGFibGUKLQkgKiAoZS5nLiBkdXJpbmcgcHJvamVjdCBjcmVhdGlvbikuIFRoZSByZXR1cm5lZCBjb25uZWN0aW9uIHByb2ZpbGUgd2lsbAotCSAqIHVzZSB0aGUgZGVmYXVsdCBjb252ZXJzaW9ucyBmb3IgaWRlbnRpZmllcnMgYW5kIG5hbWVzLgotCSAqLwotCUNvbm5lY3Rpb25Qcm9maWxlIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIG9mIGNoYW5nZXMgdG8gdGhlIERUUAotCSAqIGNvbm5lY3Rpb24gcHJvZmlsZXMuCi0JICovCi0Jdm9pZCBhZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIuCi0JICovCi0Jdm9pZCByZW1vdmVDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzFlMzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotLyoqCi0gKiBBIDxjb2RlPlByb2ZpbGVMaXN0ZW5lcjwvY29kZT4gaXMgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMgdG8gdGhlIERUUCBjb25uZWN0aW9uIHByb2ZpbGVzLgotICogPHA+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSVByb2ZpbGVMaXN0ZW5lcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIHByb2ZpbGUgaGFzIGJlZW4gYWRkZWQuCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVBZGRlZChTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIHByb2ZpbGUgaGFzIGJlZW4gcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZVJlbW92ZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBwcm9maWxlIGhhcyBiZWVuIHJlbmFtZWQuCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW5hbWVkKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0RhdGFiYXNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9EYXRhYmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTVmZWExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0RhdGFiYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLQotLyoqCi0gKiBEYXRhYmFzZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEYXRhYmFzZSBleHRlbmRzIFNjaGVtYUNvbnRhaW5lciB7Ci0KLQkvLyAqKioqKioqKioqIHByb3BlcnRpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSdzIHZlbmRvci4KLQkgKi8KLQlTdHJpbmcgZ2V0VmVuZG9yTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSdzIHZlcnNpb24uCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCi0JLy8gKioqKioqKioqKiBjYXRhbG9ncyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgY2F0YWxvZ3MuIElmIGl0IGRvZXMsIGFsbCBkYXRhYmFzZQotCSAqIG9iamVjdHMgYXJlIGNvbnRhaW5lZCBieSB0aGUgZGF0YWJhc2UncyBjYXRhbG9nczsgb3RoZXJ3aXNlIGFsbCBkYXRhYmFzZQotCSAqIG9iamVjdHMgYXJlIGNvbnRhaW5lZCBieSB0aGUgZGF0YWJhc2UncyBzY2hlbWF0YS4KLQkgKiA8YnI+Ci0JICogUHJhY3RpY2FsbHkgc3BlYWtpbmc6PHVsPgotCSAqICAgICA8bGk+SWYge0BsaW5rICNzdXBwb3J0c0NhdGFsb2dzKCl9IHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT48dWw+Ci0JICogICAgICAgICA8bGk+e0BsaW5rICNnZXRDYXRhbG9ncygpfSByZXR1cm5zIGNhdGFsb2dzIHRoYXQgY29udGFpbiB0aGUgZGF0YWJhc2UncyBzY2hlbWF0YQotCSAqICAgICAgICAgPGxpPntAbGluayAjZ2V0U2NoZW1hdGEoKX0gcmV0dXJucyBhbiBlbXB0eSBpdGVyYWJsZQotCSAqICAgICA8L3VsPgotCSAqICAgICA8bGk+ZWxzZTx1bD4KLQkgKiAgICAgICAgIDxsaT57QGxpbmsgI2dldENhdGFsb2dzKCl9IHJldHVybnMgYW4gZW1wdHkgaXRlcmFibGUKLQkgKiAgICAgICAgIDxsaT57QGxpbmsgI2dldFNjaGVtYXRhKCl9IHJldHVybnMgdGhlIGRhdGFiYXNlJ3Mgc2NoZW1hdGEKLQkgKiAgICAgPC91bD4KLQkgKiA8L3VsPgotCSAqIFRoaXMgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIHByZXNlbmNlIG9mIGEgImRlZmF1bHQiIGNhdGFsb2cgdGhhdCBjbGllbnRzIGNhbgotCSAqIHVzZSB0byBhbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIGNhdGFsb2cgdG8gYmUgb3B0aW9uYWw7IGJ1dCBjbGllbnRzCi0JICogbXVzdCBtYW5hZ2UgdGhpcyBleHBsaWNpdGx5LgotCSAqIAotCSAqIEBzZWUgI2dldENhdGFsb2dzKCkKLQkgKiBAc2VlICNnZXRTY2hlbWF0YSgpCi0JICovCi0JYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlJ3MgY2F0YWxvZ3MuCi0JICogUmV0dXJuIGFuIGVtcHR5IGl0ZXJhYmxlIGlmIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgotCSAqIEBzZWUgI3N1cHBvcnRzQ2F0YWxvZ3MoKQotCSAqLwotCUl0ZXJhYmxlPENhdGFsb2c+IGdldENhdGFsb2dzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjYXRhbG9ncyB0aGUgZGF0YWJhc2UgY29udGFpbnMuCi0JICogUmV0dXJuIHplcm8gaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICogQHNlZSAjc3VwcG9ydHNDYXRhbG9ncygpCi0JICovCi0JaW50IGdldENhdGFsb2dzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSdzIGNhdGFsb2cgbmFtZXMsIHNvcnRlZC4KLQkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmFibGUgaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICogVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgdXNlciBpcyBzZWxlY3RpbmcgYSBjYXRhbG9nIGZyb20gYSByZWFkLW9ubHkKLQkgKiBjb21iby1ib3ggKGUuZy4gaW4gYSB3aXphcmQpLgotCSAqIEBzZWUgI2dldFNvcnRlZENhdGFsb2dJZGVudGlmaWVycygpCi0JICogQHNlZSAjZ2V0Q2F0YWxvZ05hbWVkKFN0cmluZykKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZENhdGFsb2dOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjYXRhbG9nIHdpdGggc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIG11c3QgYmUgYW4gZXhhY3QgbWF0Y2gKLQkgKiBvZiB0aGUgY2F0YWxvZydzIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICogQHNlZSAjc3VwcG9ydHNDYXRhbG9ncygpCi0JICogQHNlZSAjZ2V0U29ydGVkQ2F0YWxvZ05hbWVzKCkKLQkgKiBAc2VlICNnZXRDYXRhbG9nRm9ySWRlbnRpZmllcihTdHJpbmcpCi0JICovCi0JQ2F0YWxvZyBnZXRDYXRhbG9nTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSdzIGNhdGFsb2cgaWRlbnRpZmllcnMsIHNvcnRlZCBieSBuYW1lLgotCSAqIFJldHVybiBhbiBlbXB0eSBpdGVyYWJsZSBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSB1c2VyIGlzIHNlbGVjdGluZyBhbiBpZGVudGlmaWVyIHRoYXQgd2lsbCBiZQotCSAqIHBsYWNlZCBpbiBhIHRleHQgZmlsZSAoZS5nLiBpbiBhIEphdmEgYW5ub3RhdGlvbikuCi0JICogQHNlZSAjZ2V0U29ydGVkQ2F0YWxvZ05hbWVzKCkKLQkgKiBAc2VlICNnZXRDYXRhbG9nRm9ySWRlbnRpZmllcihTdHJpbmcpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDYXRhbG9nSWRlbnRpZmllcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2F0YWxvZyBmb3IgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLiBUaGUgaWRlbnRpZmllciBzaG91bGQKLQkgKiBiZSBhbiBTUUwgaWRlbnRpZmllciAoaS5lLiBxdW90ZWQgd2hlbiBjYXNlLXNlbnNpdGl2ZSBvciBjb250YWluaW5nCi0JICogc3BlY2lhbCBjaGFyYWN0ZXJzLCB1bnF1b3RlZCBvdGhlcndpc2UpLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgotCSAqIEBzZWUgI3N1cHBvcnRzQ2F0YWxvZ3MoKQotCSAqIEBzZWUgI2dldFNvcnRlZENhdGFsb2dJZGVudGlmaWVycygpCi0JICogQHNlZSAjZ2V0Q2F0YWxvZ05hbWVkKFN0cmluZykKLQkgKi8KLQlDYXRhbG9nIGdldENhdGFsb2dGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UncyAiZGVmYXVsdCIgY2F0YWxvZywgYXMgZGVmaW5lZCBieSB0aGUgZGF0YWJhc2UgdmVuZG9yLgotCSAqIEluIG1vc3QgY2FzZXMgdGhlIGRlZmF1bHQgY2F0YWxvZydzIG5hbWUgd2lsbCBtYXRjaCB0aGUgdXNlciBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzIG9yIGlmIHRoZSBkZWZhdWx0Ci0JICogY2F0YWxvZyBkb2VzIG5vdCBleGlzdCAoZS5nLiB0aGUgZGF0YWJhc2UgaGFzIG5vIGNhdGFsb2cgd2hvc2UgbmFtZQotCSAqIG1hdGNoZXMgdGhlIHVzZXIgbmFtZSkuCi0JICogQHNlZSAjc3VwcG9ydHNDYXRhbG9ncygpCi0JICogQHNlZSAjZ2V0RGVmYXVsdENhdGFsb2dJZGVudGlmaWVyKCkKLQkgKi8KLQlDYXRhbG9nIGdldERlZmF1bHRDYXRhbG9nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlJ3MgImRlZmF1bHQiIGNhdGFsb2cgaWRlbnRpZmllci4KLQkgKiBUaGUgZGF0YWJhc2UgbWF5IG9yIG1heSBub3QgaGF2ZSBhIGNhdGFsb2cgd2l0aCBhIG1hdGNoaW5nIG5hbWUuCi0JICogQHNlZSAjc3VwcG9ydHNDYXRhbG9ncygpCi0JICogQHNlZSAjZ2V0RGVmYXVsdENhdGFsb2coKQotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZ0lkZW50aWZpZXIoKTsKLQotCi0JLy8gKioqKioqKioqKiB1dGlsaXR5IG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU2VsZWN0IGFuZCByZXR1cm4gZnJvbSB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgZGF0YWJhc2Ugb2JqZWN0cyB0aGUKLQkgKiBkYXRhYmFzZSBvYmplY3QgaWRlbnRpZmllZCBieSB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIuCi0JICogVGhlIGlkZW50aWZpZXIgc2hvdWxkIGJlIGFuIFNRTCBpZGVudGlmaWVyIChpLmUuIGRlbGltaXRlZCB3aGVuCi0JICogbm9uLSJub3JtYWwiKS4KLQkgKi8KLQk8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIHNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcihJdGVyYWJsZTxUPiBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBpZGVudGlmaWVyKTsKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBuYW1lIHRvIGEgZGF0YWJhc2UtYXBwcm9wcmlhdGUgU1FMIGlkZW50aWZpZXIuCi0JICovCi0JU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWYzN2MwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0RhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBjbGllbnRzIG9mIHRoZSBEYWxpIGRiIHBhY2thZ2UgdG8gcGx1ZyBpbiBhIGN1c3RvbQotICogc3RyYXRlZ3kgZm9yIGNvbnZlcnRpbmcgYSBkYXRhYmFzZSBpZGVudGlmaWVyIHRvIGEgZGF0YWJhc2UgbmFtZSBhbmQgdmljZQotICogdmVyc2EuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIgewotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJpZGVudGlmaWVyIiB0byBhICJuYW1lIi4KLQkgKi8KLQlTdHJpbmcgY29udmVydElkZW50aWZpZXJUb05hbWUoU3RyaW5nIGlkZW50aWZpZXIsIERlZmF1bHRDYWxsYmFjayBkZWZhdWx0Q2FsbGJhY2spOwotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJuYW1lIiB0byBhbiAiaWRlbnRpZmllciIuCi0JICovCi0JU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lLCBEZWZhdWx0Q2FsbGJhY2sgZGVmYXVsdENhbGxiYWNrKTsKLQotCS8qKgotCSAqIFRoZSBjbGllbnQtcHJvdmlkZWQgZmluZGVyIGlzIHBhc3NlZCBhICJkZWZhdWx0IiBjYWxsYmFjayB0aGF0IGNhbiBiZQotCSAqIHVzZWQgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JaW50ZXJmYWNlIERlZmF1bHRDYWxsYmFjayB7Ci0KLQkJLyoqCi0JCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiaWRlbnRpZmllciIgdG8gYSAibmFtZSIuCi0JCSAqLwotCQlTdHJpbmcgY29udmVydElkZW50aWZpZXJUb05hbWUoU3RyaW5nIGlkZW50aWZpZXIpOwotCi0JCS8qKgotCQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgIm5hbWUiIHRvIGFuICJpZGVudGlmaWVyIi4KLQkJICovCi0JCVN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkYXB0ZXIgc2ltcGx5IHVzZXMgdGhlIHBhc3NlZCBpbiBkZWZhdWx0IGNhbGxiYWNrLgotCSAqLwotCWZpbmFsIGNsYXNzIERlZmF1bHQgaW1wbGVtZW50cyBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJcHVibGljIHN0YXRpYyBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgdXNlIHRoZSBkZWZhdWx0IGNhbGxiYWNrCi0JCXB1YmxpYyBTdHJpbmcgY29udmVydElkZW50aWZpZXJUb05hbWUoU3RyaW5nIGlkZW50aWZpZXIsIERlZmF1bHRDYWxsYmFjayBkZWZhdWx0Q2FsbGJhY2spIHsKLQkJCXJldHVybiBkZWZhdWx0Q2FsbGJhY2suY29udmVydElkZW50aWZpZXJUb05hbWUoaWRlbnRpZmllcik7Ci0JCX0KLQkJLy8gc2ltcGx5IHVzZSB0aGUgZGVmYXVsdCBjYWxsYmFjawotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lLCBEZWZhdWx0Q2FsbGJhY2sgZGVmYXVsdENhbGxiYWNrKSB7Ci0JCQlyZXR1cm4gZGVmYXVsdENhbGxiYWNrLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyLkRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0RhdGFiYXNlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9EYXRhYmFzZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTU0MzUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0RhdGFiYXNlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBDb21tb24gYmVoYXZpb3IgdG8gYWxsIGRhdGFiYXNlIG9iamVjdHMKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGF0YWJhc2VPYmplY3QgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSBvYmplY3QncyBuYW1lLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIG9iamVjdCdzICJpZGVudGlmaWVyIiwgd2hpY2ggaXMgdGhlIG9iamVjdCdzIG5hbWUKLQkgKiBtb2RpZmllZCBzbyBpdCBjYW4gYmUgdXNlZCBpbiBhbiBTUUwgc3RhdGVtZW50IChlLmcuIGlmIHRoZSBuYW1lIGNvbnRhaW5zCi0JICogc3BlY2lhbCBjaGFyYWN0ZXJzIG9yIGlzIG1peGVkIGNhc2UsIGl0IHdpbGwgYmUgZGVsaW1pdGVkLCB0eXBpY2FsbHkgYnkKLQkgKiBkb3VibGUtcXVvdGVzKS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZGF0YWJhc2Ugb2JqZWN0J3MgaWRlbnRpZmllciBtYXRjaGVzIHRoZSBzcGVjaWZpZWQKLQkgKiAiZGVmYXVsdCBuYW1lIi4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIG9sZCBlbnRpdHkgZ2VuZXJhdGlvbiBjb2RlIHRvIGRldGVybWluZSB3aGV0aGVyCi0JICogYSBnZW5lcmF0ZWQgYW5ub3RhdGlvbiBtdXN0IGV4cGxpY2l0bHkgaWRlbnRpZnkgYSBkYXRhYmFzZSBvYmplY3QKLQkgKiAoZS5nLiBhIHRhYmxlKSBvciB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgYWRlcXVhdGVseSBpZGVudGlmaWVzIHRoZSBkYXRhYmFzZSBvYmplY3QKLQkgKiAodGFraW5nIGludG8gY29uc2lkZXJhdGlvbiBjYXNlLXNlbnNpdGl2aXR5IGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMpLgotCSAqLwotCVN0cmluZyBnZXRJZGVudGlmaWVyKFN0cmluZyBkZWZhdWx0TmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIG9iamVjdCdzICJpZGVudGlmaWVyIiwgd2hpY2ggaXMgdGhlIG9iamVjdCdzIG5hbWUKLQkgKiBtb2RpZmllZCBzbyBpdCBjYW4gYmUgdXNlZCBpbiBhbiBTUUwgc3RhdGVtZW50IChlLmcuIGlmIHRoZSBuYW1lIGNvbnRhaW5zCi0JICogc3BlY2lhbCBjaGFyYWN0ZXJzIG9yIGlzIG1peGVkIGNhc2UsIGl0IHdpbGwgYmUgZGVsaW1pdGVkLCB0eXBpY2FsbHkgYnkKLQkgKiBkb3VibGUtcXVvdGVzKS4KLQkgKi8KLQlTdHJpbmcgZ2V0SWRlbnRpZmllcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSBvYmplY3QncyBkYXRhYmFzZS4KLQkgKi8KLQlEYXRhYmFzZSBnZXREYXRhYmFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSBvYmplY3QncyBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICovCi0JQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQotCi0JQ29tcGFyYXRvcjxEYXRhYmFzZU9iamVjdD4gREVGQVVMVF9DT01QQVJBVE9SID0KLQkJCW5ldyBDb21wYXJhdG9yPERhdGFiYXNlT2JqZWN0PigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoRGF0YWJhc2VPYmplY3QgZGJPYmplY3QxLCBEYXRhYmFzZU9iamVjdCBkYk9iamVjdDIpIHsKLQkJCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShkYk9iamVjdDEuZ2V0TmFtZSgpLCBkYk9iamVjdDIuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQkJcmV0dXJuICJEYXRhYmFzZU9iamVjdC5ERUZBVUxUX0NPTVBBUkFUT1IiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLQotCVRyYW5zZm9ybWVyPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+IE5BTUVfVFJBTlNGT1JNRVIgPQotCQkJbmV3IFRyYW5zZm9ybWVyPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KCkgewotCQkJCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKERhdGFiYXNlT2JqZWN0IGRiT2JqZWN0KSB7Ci0JCQkJCXJldHVybiBkYk9iamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGF0YWJhc2VPYmplY3QuTkFNRV9UUkFOU0ZPUk1FUiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9OwotCi0JVHJhbnNmb3JtZXI8RGF0YWJhc2VPYmplY3QsIFN0cmluZz4gSURFTlRJRklFUl9UUkFOU0ZPUk1FUiA9Ci0JCQluZXcgVHJhbnNmb3JtZXI8RGF0YWJhc2VPYmplY3QsIFN0cmluZz4oKSB7Ci0JCQkJcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oRGF0YWJhc2VPYmplY3QgZGJPYmplY3QpIHsKLQkJCQkJcmV0dXJuIGRiT2JqZWN0LmdldElkZW50aWZpZXIoKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQkJcmV0dXJuICJEYXRhYmFzZU9iamVjdC5JREVOVElGSUVSX1RSQU5TRk9STUVSIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX07Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0ZvcmVpZ25LZXkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0ZvcmVpZ25LZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5ZGFlMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Gb3JlaWduS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogRGF0YWJhc2UgZm9yZWlnbiBrZXkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRm9yZWlnbktleSBleHRlbmRzIERhdGFiYXNlT2JqZWN0IHsKLQotCS8vICoqKioqKioqKiogdGFibGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyAiYmFzZSIgdGFibGUuCi0JICovCi0JVGFibGUgZ2V0QmFzZVRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3MgInJlZmVyZW5jZWQiIHRhYmxlLgotCSAqLwotCVRhYmxlIGdldFJlZmVyZW5jZWRUYWJsZSgpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBwYWlycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3MgY29sdW1uIHBhaXJzLgotCSAqLwotCUl0ZXJhYmxlPENvbHVtblBhaXI+IGdldENvbHVtblBhaXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGZvcmVpZ24ga2V5J3MgY29sdW1uIHBhaXJzLgotCSAqLwotCWludCBnZXRDb2x1bW5QYWlyc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyBzaW5nbGUgY29sdW1uIHBhaXIuIFRocm93IGFuCi0JICoge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaWYgdGhlIGZvcmVpZ24ga2V5IGhhcyBtb3JlIHRoYW4gb25lIGNvbHVtbiBwYWlyLgotCSAqLwotCUNvbHVtblBhaXIgZ2V0Q29sdW1uUGFpcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb3JlaWduIGtleSdzICJiYXNlIiBjb2x1bW5zLgotCSAqLwotCUl0ZXJhYmxlPENvbHVtbj4gZ2V0QmFzZUNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyAiYmFzZSIgY29sdW1ucyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgYmFzZQotCSAqIHRhYmxlJ3MgcHJpbWFyeSBrZXkuIChUaGUgbm9uLXByaW1hcnkga2V5IGJhc2UgY29sdW1ucyBhcmUgbm90IHVzZWQgdG8KLQkgKiBnZW5lcmF0ZSBiYXNpYyBhdHRyaWJ1dGVzIGR1cmluZyBlbnRpdHkgZ2VuZXJhdGlvbi4pCi0JICovCi0JSXRlcmFibGU8Q29sdW1uPiBnZXROb25QcmltYXJ5S2V5QmFzZUNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyAicmVmZXJlbmNlZCIgY29sdW1ucy4KLQkgKi8KLQlJdGVyYWJsZTxDb2x1bW4+IGdldFJlZmVyZW5jZWRDb2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZm9yZWlnbiBrZXkgcmVmZXJlbmNlcyB0aGUgcHJpbWFyeSBrZXkgb2YgdGhlCi0JICogInJlZmVyZW5jZWQiIHRhYmxlIGFuZCB0aGF0IHByaW1hcnkga2V5IGhhcyBvbmx5IGEgc2luZ2xlIGNvbHVtbi4KLQkgKiBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gZGV0ZXJtaW5pbmcgSlBBIGRlZmF1bHRzLgotCSAqLwotCWJvb2xlYW4gcmVmZXJlbmNlc1NpbmdsZUNvbHVtblByaW1hcnlLZXkoKTsKLQotCi0JLy8gKioqKioqKioqKiBKUEEgc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXBwcm9wcmlhdGUgbmFtZSBmb3IgYW4gYXR0cmlidXRlIHRoYXQgaG9sZHMgdGhlIGVudGl0eQotCSAqIG1hcHBlZCB0byB0aGUgZm9yZWlnbiBrZXkncyAicmVmZXJlbmNlZCIgdGFibGUuCi0JICovCi0JU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKTsKLQotCS8qKgotCSAqIElmIHRoZSBuYW1lIG9mIHRoZSAiYmFzZSIgY29sdW1uIGFkaGVyZXMgdG8gdGhlIEpQQSBzcGVjIGZvciBhCi0JICogZGVmYXVsdCBtYXBwaW5nIChpLmUuIGl0IGVuZHMgd2l0aCBhbiB1bmRlcnNjb3JlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lCi0JICogb2YgdGhlICJyZWZlcmVuY2VkIiBjb2x1bW4sIGFuZCB0aGUgInJlZmVyZW5jZWQiIGNvbHVtbiBpcyB0aGUgc2luZ2xlCi0JICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSAicmVmZXJlbmNlZCIgdGFibGUpLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiBkZWZhdWx0IGF0dHJpYnV0ZSBuYW1lOjxwcmU+Ci0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVfSUQgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEUiCi0JICogPC9wcmU+Ci0JICogUmV0dXJuIGEgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgZG9lcyBub3QgYWRoZXJlIHRvIHRoZSBKUEEgc3BlYzo8cHJlPgotCSAqICAgICBGb3JlaWduS2V5KEVNUC5DVUJJQ0xFX0lEID0+IENVQklDTEUuQ1VCSUNMRV9JRCkgPT4gbnVsbAotCSAqICAgICBGb3JlaWduS2V5KEVNUC5DVUJJQ0xFID0+IENVQklDTEUuSUQpID0+IG51bGwKLQkgKiA8L3ByZT4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdEF0dHJpYnV0ZU5hbWUoKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSAoZmllbGQgb3IgcHJvcGVydHkpIHRoYXQgaXMgbWFwcGVkIHRvIHRoZQotCSAqIGZvcmVpZ24ga2V5LAotCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUncwotCSAqIDxjb2RlPkBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uPC9jb2RlPiBhbm5vdGF0aW9uJ3MgPGNvZGU+bmFtZTwvY29kZT4gZWxlbWVudC4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGF0dHJpYnV0ZQotCSAqIG1hcHMgdG8gdGhlIGpvaW4gY29sdW1uIGJ5IGRlZmF1bHQuCi0JICogPHA+Ci0JICogUHJlY29uZGl0aW9uOiBUaGUgZm9yZWlnbiBrZXkgY29uc2lzdHMgb2YgYSBzaW5nbGUgY29sdW1uIHBhaXIgd2hvc2UKLQkgKiByZWZlcmVuY2VkIGNvbHVtbiBpcyB0aGUgc2luZ2xlLWNvbHVtbiBwcmltYXJ5IGtleSBvZiB0aGUgZm9yZWlnbgotCSAqIGtleSdzIHJlZmVyZW5jZWQgdGFibGUuCi0JICogPHA+Ci0JICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBvbGQgZW50aXR5IGdlbmVyYXRpb24gY29kZSB0byBkZXRlcm1pbmUgd2hldGhlcgotCSAqIGEgZ2VuZXJhdGVkIGFubm90YXRpb24gbXVzdCBleHBsaWNpdGx5IGlkZW50aWZ5IHRoZSBqb2luIGNvbHVtbgotCSAqIG9yIHRoZSBjYWxjdWxhdGVkIGRlZmF1bHQgYWRlcXVhdGVseSBpZGVudGlmaWVzIHRoZSBqb2luIGNvbHVtbgotCSAqICh0YWtpbmcgaW50byBjb25zaWRlcmF0aW9uIGNhc2Utc2Vuc2l0aXZpdHkgYW5kIHNwZWNpYWwgY2hhcmFjdGVycykuCi0JICovCi0JU3RyaW5nIGdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcihTdHJpbmcgYXR0cmlidXRlTmFtZSk7Ci0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBwYWlyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBQYWlyIHVwIHRoZSBmb3JlaWduIGtleSdzIGNvbHVtbiBwYWlycywgbWF0Y2hpbmcgZWFjaCAiYmFzZSIgY29sdW1uIHdpdGgKLQkgKiB0aGUgYXBwcm9wcmlhdGUgInJlZmVyZW5jZWQiIGNvbHVtbi4KLQkgKiBAc2VlICNjb2x1bW5QYWlycygpCi0JICovCi0JaW50ZXJmYWNlIENvbHVtblBhaXIgewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGNvbHVtbiBwYWlyJ3MgImJhc2UiIGNvbHVtbi4KLQkJICovCi0JCUNvbHVtbiBnZXRCYXNlQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgY29sdW1uIHBhaXIncyAicmVmZXJlbmNlZCIgY29sdW1uLgotCQkgKi8KLQkJQ29sdW1uIGdldFJlZmVyZW5jZWRDb2x1bW4oKTsKLQotCQlDb21wYXJhdG9yPENvbHVtblBhaXI+IEJBU0VfQ09MVU1OX0NPTVBBUkFUT1IgPQotCQkJCW5ldyBDb21wYXJhdG9yPENvbHVtblBhaXI+KCkgewotCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoQ29sdW1uUGFpciBjcDEsIENvbHVtblBhaXIgY3AyKSB7Ci0JCQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGNwMS5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpLCBjcDIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCQlyZXR1cm4gIkZvcmVpZ25LZXkuQ29sdW1uUGFpci5CQVNFX0NPTFVNTl9DT01QQVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvSnB0RGJQbHVnaW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0pwdERiUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhODY2ZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvSnB0RGJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuamR0LmNsYXNzcGF0aC5Ecml2ZXJDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBKUFQgREIgcGx1Zy1pbiBsaWZlY3ljbGUgaW1wbGVtZW50YXRpb24uCi0gKiBHbG9iYWxseSBhdmFpbGFibGUgY29ubmVjdGlvbiBwcm9maWxlIGZhY3RvcnkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHREYlBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JcHJpdmF0ZSBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgY29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotCi0JcHJpdmF0ZSBzdGF0aWMgSnB0RGJQbHVnaW4gSU5TVEFOQ0U7ICAvLyBzb3J0YS1maW5hbAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24gSlBUIERCIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHREYlBsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8vICoqKioqKioqKiogcHVibGljIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IGdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeV8oKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHBsdWctaW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEpwdERiUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoSU5TVEFOQ0UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRoaXMgY29udmVudGlvbiBpcyAqd2FjayouLi4gIH5ianYKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5zdG9wKCk7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQkJSU5TVEFOQ0UgPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBnZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnlfKCkgewotCQlpZiAodGhpcy5jb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgPT0gbnVsbCkgewotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgPSBidWlsZENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpOwotCSAgICAgICAgdGhpcy5jb25uZWN0aW9uUHJvZmlsZUZhY3Rvcnkuc3RhcnQoKTsJCQkKLQkJfQotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7Ci0JfQotCi0JcHJpdmF0ZSBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgYnVpbGRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgamFyIGxpc3QgY29udGFpbmVyIGZvciB0aGUgZ2l2ZW4gRFRQIGRyaXZlci4KLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aENvbnRhaW5lciBidWlsZERyaXZlckNsYXNzcGF0aENvbnRhaW5lckZvcihTdHJpbmcgZHJpdmVyTmFtZSkgewotCQlyZXR1cm4gbmV3IERyaXZlckNsYXNzcGF0aENvbnRhaW5lcihkcml2ZXJOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL1NjaGVtYS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvU2NoZW1hLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGZkMmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvU2NoZW1hLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYjsKLQotLyoqCi0gKiBEYXRhYmFzZSBzY2hlbWEKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hIGV4dGVuZHMgRGF0YWJhc2VPYmplY3QgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEncyBjb250YWluZXI7IGVpdGhlciBhIGNhdGFsb2cgb3IgYSBkYXRhYmFzZS4KLQkgKi8KLQlTY2hlbWFDb250YWluZXIgZ2V0Q29udGFpbmVyKCk7Ci0KLQotCS8vICoqKioqKioqKiogdGFibGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2NoZW1hJ3MgdGFibGVzLgotCSAqLwotCUl0ZXJhYmxlPFRhYmxlPiBnZXRUYWJsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRhYmxlcyB0aGUgc2NoZW1hIGNvbnRhaW5zLgotCSAqLwotCWludCBnZXRUYWJsZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhYmxlIHdpdGggc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIG11c3QgYmUgYW4gZXhhY3QgbWF0Y2gKLQkgKiBvZiB0aGUgdGFibGUncyBuYW1lLgotCSAqIEBzZWUgI2dldFRhYmxlRm9ySWRlbnRpZmllcihTdHJpbmcpCi0JICovCi0JIFRhYmxlIGdldFRhYmxlTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEncyB0YWJsZSBpZGVudGlmaWVycywgc29ydGVkIGJ5IG5hbWUuCi0JICogQHNlZSAjZ2V0VGFibGVGb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFRhYmxlSWRlbnRpZmllcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4gVGhlIGlkZW50aWZpZXIgc2hvdWxkCi0JICogYmUgYW4gU1FMIGlkZW50aWZpZXIgKGkuZS4gcXVvdGVkIHdoZW4gY2FzZS1zZW5zaXRpdmUgb3IgY29udGFpbmluZwotCSAqIHNwZWNpYWwgY2hhcmFjdGVycywgdW5xdW90ZWQgb3RoZXJ3aXNlKS4KLQkgKiBAc2VlICNnZXRUYWJsZU5hbWVkKFN0cmluZykKLQkgKiBAc2VlICNnZXRTb3J0ZWRUYWJsZUlkZW50aWZpZXJzKCkKLQkgKi8KLQlUYWJsZSBnZXRUYWJsZUZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpOwotCi0KLQkvLyAqKioqKioqKioqIHNlcXVlbmNlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNjaGVtYSdzIHNlcXVlbmNlcy4KLQkgKi8KLQlJdGVyYWJsZTxTZXF1ZW5jZT4gZ2V0U2VxdWVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgdGhlIHNjaGVtYSBjb250YWlucy4KLQkgKi8KLQlpbnQgZ2V0U2VxdWVuY2VzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXF1ZW5jZSB3aXRoIHNwZWNpZmllZCBuYW1lLiBUaGUgbmFtZSBtdXN0IGJlIGFuIGV4YWN0IG1hdGNoCi0JICogb2YgdGhlIHNlcXVlbmNlJ3MgbmFtZS4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZUZvcklkZW50aWZpZXIoU3RyaW5nKQotCSAqLwotCVNlcXVlbmNlIGdldFNlcXVlbmNlTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEncyBzZXF1ZW5jZSBpZGVudGlmZXJzLCBzb3J0ZWQgYnkgbmFtZS4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZUZvcklkZW50aWZpZXIoU3RyaW5nKQotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkU2VxdWVuY2VJZGVudGlmaWVycygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXF1ZW5jZSBmb3IgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLiBUaGUgaWRlbnRpZmllciBzaG91bGQKLQkgKiBiZSBhbiBTUUwgaWRlbnRpZmllciAoaS5lLiBxdW90ZWQgd2hlbiBjYXNlLXNlbnNpdGl2ZSBvciBjb250YWluaW5nCi0JICogc3BlY2lhbCBjaGFyYWN0ZXJzLCB1bnF1b3RlZCBvdGhlcndpc2UpLgotCSAqIEBzZWUgI2dldFNlcXVlbmNlTmFtZWQoU3RyaW5nKQotCSAqIEBzZWUgI2dldFNvcnRlZFNlcXVlbmNlSWRlbnRpZmllcnMoKQotCSAqLwotCVNlcXVlbmNlIGdldFNlcXVlbmNlRm9ySWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL1NjaGVtYUNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvU2NoZW1hQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MmM4ZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvU2NoZW1hQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYjsKLQotLyoqCi0gKiBTY2hlbWEgImNvbnRhaW5lciIgKGkuZS4gRGF0YWJhc2Ugb3IgQ2F0YWxvZykKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hQ29udGFpbmVyIGV4dGVuZHMgRGF0YWJhc2VPYmplY3QgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluZXIncyBzY2hlbWF0YS4KLQkgKi8KLQlJdGVyYWJsZTxTY2hlbWE+IGdldFNjaGVtYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzY2hlbWF0YSBpbiB0aGUgY29udGFpbmVyLgotCSAqLwotCWludCBnZXRTY2hlbWF0YVNpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGFpbmVyJ3Mgc2NoZW1hIG5hbWVzLCBzb3J0ZWQuCi0JICogVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgdXNlciBpcyBzZWxlY3RpbmcgYSBzY2hlbWEgZnJvbSBhIHJlYWQtb25seQotCSAqIGNvbWJvLWJveCAoZS5nLiBpbiBhIHdpemFyZCkuCi0JICogQHNlZSAjZ2V0U2NoZW1hTmFtZWQoU3RyaW5nKQotCSAqIEBzZWUgI2dldFNvcnRlZFNjaGVtYUlkZW50aWZpZXJzKCkKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFNjaGVtYU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNjaGVtYSB3aXRoIHNwZWNpZmllZCBuYW1lLiBUaGUgbmFtZSBtdXN0IGJlIGFuIGV4YWN0IG1hdGNoCi0JICogb2YgdGhlIHNjaGVtYSdzIG5hbWUuCi0JICogQHNlZSAjZ2V0U29ydGVkU2NoZW1hTmFtZXMoKQotCSAqIEBzZWUgI2dldFNjaGVtYUZvcklkZW50aWZpZXIoU3RyaW5nKQotCSAqLwotCVNjaGVtYSBnZXRTY2hlbWFOYW1lZChTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5lcidzIHNjaGVtYSBpZGVudGlmaWVycywgc29ydGVkIGJ5IG5hbWUuCi0JICogVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgdXNlciBpcyBzZWxlY3RpbmcgYW4gaWRlbnRpZmllciB0aGF0IHdpbGwgYmUKLQkgKiBwbGFjZWQgaW4gYSB0ZXh0IGZpbGUgKGUuZy4gaW4gYSBKYXZhIGFubm90YXRpb24pLgotCSAqIEBzZWUgI2dldFNjaGVtYUZvcklkZW50aWZpZXIoU3RyaW5nKQotCSAqIEBzZWUgI2dldFNvcnRlZFNjaGVtYU5hbWVzKCkKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFNjaGVtYUlkZW50aWZpZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNjaGVtYSBmb3IgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLiBUaGUgaWRlbnRpZmllciBzaG91bGQKLQkgKiBiZSBhbiBTUUwgaWRlbnRpZmllciAoaS5lLiBxdW90ZWQgd2hlbiBjYXNlLXNlbnNpdGl2ZSBvciBjb250YWluaW5nCi0JICogc3BlY2lhbCBjaGFyYWN0ZXJzLCB1bnF1b3RlZCBvdGhlcndpc2UpLgotCSAqIEBzZWUgI2dldFNvcnRlZFNjaGVtYUlkZW50aWZpZXJzKCkKLQkgKiBAc2VlICNnZXRTY2hlbWFOYW1lZChTdHJpbmcpCi0JICovCi0JU2NoZW1hIGdldFNjaGVtYUZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluZXIncyAiZGVmYXVsdCIgc2NoZW1hLCBhcyBkZWZpbmVkIGJ5IHRoZSBkYXRhYmFzZSB2ZW5kb3IuCi0JICogSW4gbW9zdCBjYXNlcyB0aGUgZGVmYXVsdCBzY2hlbWEncyBuYW1lIHdpbGwgbWF0Y2ggdGhlIHVzZXIgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZGVmYXVsdCBzY2hlbWEgZG9lcyBub3QgZXhpc3QgKGUuZy4gdGhlIGNvbnRhaW5lciBoYXMKLQkgKiBubyBzY2hlbWEgd2hvc2UgbmFtZSBtYXRjaGVzIHRoZSB1c2VyIG5hbWUpLgotCSAqIEBzZWUgI2dldERlZmF1bHRTY2hlbWFJZGVudGlmaWVyKCkKLQkgKi8KLQlTY2hlbWEgZ2V0RGVmYXVsdFNjaGVtYSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluZXIncyAiZGVmYXVsdCIgc2NoZW1hIGlkZW50aWZpZXIuCi0JICogVGhlIGNvbnRhaW5lciBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgc2NoZW1hIHdpdGggYSBtYXRjaGluZyBuYW1lLgotCSAqIEBzZWUgI2dldERlZmF1bHRTY2hlbWEoKQotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0U2NoZW1hSWRlbnRpZmllcigpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9TZXF1ZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvU2VxdWVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1MWZmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9TZXF1ZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLS8qKgotICogRGF0YWJhc2Ugc2VxdWVuY2UKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VxdWVuY2UgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdCB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNlcXVlbmNlJ3Mgc2NoZW1hLgotCSAqLwotCVNjaGVtYSBnZXRTY2hlbWEoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNjI5MjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYjsKLQotLyoqCi0gKiBEYXRhYmFzZSB0YWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUYWJsZSBleHRlbmRzIERhdGFiYXNlT2JqZWN0IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUncyBzY2hlbWEuCi0JICovCi0JU2NoZW1hIGdldFNjaGVtYSgpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIGNvbHVtbnMuCi0JICovCi0JSXRlcmFibGU8Q29sdW1uPiBnZXRDb2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjb2x1bW5zIHRoZSB0YWJsZSBjb250YWlucy4KLQkgKi8KLQlpbnQgZ2V0Q29sdW1uc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29sdW1uIHdpdGggc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIG11c3QgYmUgYW4gZXhhY3QgbWF0Y2gKLQkgKiBvZiB0aGUgY29sdW1uJ3MgbmFtZS4KLQkgKiBAc2VlICNnZXRDb2x1bW5Gb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlDb2x1bW4gZ2V0Q29sdW1uTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIGNvbHVtbiBpZGVudGlmZXJzLCBzb3J0ZWQgYnkgbmFtZS4KLQkgKiBAc2VlICNnZXRDb2x1bW5Gb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZENvbHVtbklkZW50aWZpZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbHVtbiBmb3IgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLiBUaGUgaWRlbnRpZmllciBzaG91bGQKLQkgKiBiZSBhbiBTUUwgaWRlbnRpZmllciAoaS5lLiBxdW90ZWQgd2hlbiBjYXNlLXNlbnNpdGl2ZSBvciBjb250YWluaW5nCi0JICogc3BlY2lhbCBjaGFyYWN0ZXJzLCB1bnF1b3RlZCBvdGhlcndpc2UpLgotCSAqIEBzZWUgI2dldENvbHVtbk5hbWVkKFN0cmluZykKLQkgKiBAc2VlICNnZXRTb3J0ZWRDb2x1bW5JZGVudGlmaWVycygpCi0JICovCi0JQ29sdW1uIGdldENvbHVtbkZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpOwotCi0KLQkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGNvbHVtbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIHByaW1hcnkga2V5IGNvbHVtbnMuCi0JICovCi0JSXRlcmFibGU8Q29sdW1uPiBnZXRQcmltYXJ5S2V5Q29sdW1ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcHJpbWFyeSBrZXkgY29sdW1ucyB0aGUgdGFibGUgY29udGFpbnMuCi0JICovCi0JaW50IGdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIHNpbmdsZSBwcmltYXJ5IGtleSBjb2x1bW4uIFRocm93IGFuCi0JICoge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaWYgdGhlIHRhYmxlIGhhcyBtb3JlIHRoYW4gb25lIHByaW1hcnkga2V5IGNvbHVtbi4KLQkgKi8KLQlDb2x1bW4gZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCi0KLQkvLyAqKioqKioqKioqIGZvcmVpZ24ga2V5cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhYmxlJ3MgZm9yZWlnbiBrZXlzLgotCSAqLwotCUl0ZXJhYmxlPEZvcmVpZ25LZXk+IGdldEZvcmVpZ25LZXlzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBmb3JlaWduIGtleXMgdGhlIHRhYmxlIGNvbnRhaW5zLgotCSAqLwotCWludCBnZXRGb3JlaWduS2V5c1NpemUoKTsKLQotCi0JLy8gKioqKioqKioqKiBqb2luIHRhYmxlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHRhYmxlIGlzIHBvc3NpYmx5IGEgImpvaW4iIHRhYmxlCi0JICogKGkuZS4gaXQgY29udGFpbnMgb25seSAyIGZvcmVpZ24ga2V5cykuIFdoZXRoZXIgdGhlIHRhYmxlIDxlbT5hY3R1YWxseTwvZW0+IGlzCi0JICogYSAiam9pbiIgdGFibGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2VtYW50aWNzIG9mIHRoZSBkYXRhYmFzZSBkZXNpZ24uCi0JICovCi0JYm9vbGVhbiBpc1Bvc3NpYmxlSm9pblRhYmxlKCk7Ci0KLQkvKioKLQkgKiBBc3N1bWluZyB0aGUgdGFibGUgaXMgYSAiam9pbiIgdGFibGUsIHJldHVybiB0aGUgZm9yZWlnbiBrZXkgdG8gdGhlCi0JICogIm93bmluZyIgdGFibGUuCi0JICogQHNlZSAjaXNQb3NzaWJsZUpvaW5UYWJsZSgpCi0JICovCi0JRm9yZWlnbktleSBnZXRKb2luVGFibGVPd25pbmdGb3JlaWduS2V5KCk7Ci0KLQkvKioKLQkgKiBBc3N1bWluZyB0aGUgdGFibGUgaXMgYSAiam9pbiIgdGFibGUsIHJldHVybiB0aGUgZm9yZWlnbiBrZXkgdG8gdGhlCi0JICogIm5vbi1vd25pbmciIHRhYmxlLgotCSAqIEBzZWUgI2lzUG9zc2libGVKb2luVGFibGUoKQotCSAqLwotCUZvcmVpZ25LZXkgZ2V0Sm9pblRhYmxlTm9uT3duaW5nRm9yZWlnbktleSgpOwotCi0JLyoqCi0JICogQXNzdW1pbmcgdGhlIHRhYmxlIGlzIGEgImpvaW4iIHRhYmxlLCByZXR1cm4gd2hldGhlciBpdHMgbmFtZSBtYXRjaGVzCi0JICogdGhlIEpQQSBkZWZhdWx0IChpLmUuIDxjb2RlPiJPV05JTkdUQUJMRV9OT05PV05JTkdUQUJMRSI8L2NvZGU+KS4KLQkgKiBAc2VlICNpc1Bvc3NpYmxlSm9pblRhYmxlKCkKLQkgKi8KLQlib29sZWFuIGpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ2F0YWxvZ1dyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENhdGFsb2dXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZDkyNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ2F0YWxvZ1dyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ2F0YWxvZzsKLQotLyoqCi0gKiBXcmFwIGEgRFRQIENhdGFsb2cKLSAqLwotZmluYWwgY2xhc3MgRFRQQ2F0YWxvZ1dyYXBwZXIKLQlleHRlbmRzIERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIENhdGFsb2cKLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIGNhdGFsb2cgKi8KLQlwcml2YXRlIGZpbmFsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGR0cENhdGFsb2c7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQQ2F0YWxvZ1dyYXBwZXIoRFRQRGF0YWJhc2VXcmFwcGVyIGRhdGFiYXNlLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBkdHBDYXRhbG9nKSB7Ci0JCXN1cGVyKGRhdGFiYXNlLCBkdHBDYXRhbG9nKTsKLQkJdGhpcy5kdHBDYXRhbG9nID0gZHRwQ2F0YWxvZzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmNhdGFsb2dDaGFuZ2VkKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBTY2hlbWFDb250YWluZXJXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYT4gZ2V0RFRQU2NoZW1hdGEoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENhdGFsb2cuZ2V0U2NoZW1hcygpOwotCX0KLQotCUBPdmVycmlkZQotCURUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKSB7Ci0JCS8vIHRyeSB0byBzaG9ydC1jaXJjdWl0IHRoZSBzZWFyY2gKLQkJcmV0dXJuIHRoaXMud3JhcHMoZHRwU2NoZW1hLmdldENhdGFsb2coKSkgPwotCQkJCQkJdGhpcy5nZXRTY2hlbWFfKGR0cFNjaGVtYSkgOgotCQkJCQkJdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZyb21DYXRhbG9ncyhkdHBTY2hlbWEpOwotCX0KLQotCUBPdmVycmlkZQotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyhkdHBUYWJsZS5nZXRTY2hlbWEoKS5nZXRDYXRhbG9nKCkpID8KLQkJCQkJCXRoaXMuZ2V0VGFibGVfKGR0cFRhYmxlKSA6Ci0JCQkJCQl0aGlzLmdldERhdGFiYXNlKCkuZ2V0VGFibGVGcm9tQ2F0YWxvZ3MoZHRwVGFibGUpOwotCX0KLQotCUBPdmVycmlkZQotCURUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCS8vIHRyeSB0byBzaG9ydC1jaXJjdWl0IHRoZSBzZWFyY2gKLQkJcmV0dXJuIHRoaXMud3JhcHMoZHRwQ29sdW1uLmdldFRhYmxlKCkuZ2V0U2NoZW1hKCkuZ2V0Q2F0YWxvZygpKSA/Ci0JCQkJCQl0aGlzLmdldENvbHVtbl8oZHRwQ29sdW1uKSA6Ci0JCQkJCQl0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q29sdW1uRnJvbUNhdGFsb2dzKGR0cENvbHVtbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERhdGFiYXNlT2JqZWN0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ2F0YWxvZy5nZXROYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JYm9vbGVhbiB3cmFwcyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCXJldHVybiB0aGlzLmR0cENhdGFsb2cgPT0gY2F0YWxvZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENvbHVtbldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENvbHVtbldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjNDJiNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBDb2x1bW5XcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLmRiZGVmaW5pdGlvbi5QcmVkZWZpbmVkRGF0YVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5DaGFyYWN0ZXJTdHJpbmdEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5kYXRhdHlwZXMuRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuZGF0YXR5cGVzLkV4YWN0TnVtZXJpY0RhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5OdW1lcmljYWxEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5kYXRhdHlwZXMuUHJlZGVmaW5lZERhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5QcmltaXRpdmVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZUphdmFUeXBlOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIENvbHVtbgotICovCi1maW5hbCBjbGFzcyBEVFBDb2x1bW5XcmFwcGVyCi0JZXh0ZW5kcyBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIKLQlpbXBsZW1lbnRzIENvbHVtbgotewotCS8qKiB0aGUgd3JhcHBlZCBEVFAgY29sdW1uICovCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBDb2x1bW5XcmFwcGVyKERUUFRhYmxlV3JhcHBlciB0YWJsZSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJc3VwZXIodGFibGUsIGR0cENvbHVtbik7Ci0JCXRoaXMuZHRwQ29sdW1uID0gZHRwQ29sdW1uOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQlzdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuY29sdW1uQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29sdW1uLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKCkgewotCQlyZXR1cm4gKERUUFRhYmxlV3JhcHBlcikgdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnRPZlByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnNDb250YWlucyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnRPZkZvcmVpZ25LZXkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlKCkuZm9yZWlnbktleUJhc2VDb2x1bW5zQ29udGFpbnModGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0T2ZVbmlxdWVDb25zdHJhaW50KCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb2x1bW4uaXNQYXJ0T2ZVbmlxdWVDb25zdHJhaW50KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOdWxsYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29sdW1uLmlzTnVsbGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlID09IG51bGwpID8gbnVsbCA6IGRhdGFUeXBlLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc051bWVyaWMoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpIGluc3RhbmNlb2YgTnVtZXJpY2FsRGF0YVR5cGU7Ci0JfQkKLQotCXB1YmxpYyBpbnQgZ2V0UHJlY2lzaW9uKCkgewotCQlEYXRhVHlwZSBkYXRhVHlwZSA9IHRoaXMuZHRwQ29sdW1uLmdldERhdGFUeXBlKCk7Ci0JCXJldHVybiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBOdW1lcmljYWxEYXRhVHlwZSkgPwotCQkJCQkJKChOdW1lcmljYWxEYXRhVHlwZSkgZGF0YVR5cGUpLmdldFByZWNpc2lvbigpIDoKLQkJCQkJCS0xOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2NhbGUoKXsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlIGluc3RhbmNlb2YgRXhhY3ROdW1lcmljRGF0YVR5cGUpID8KLQkJCQkJCSgoRXhhY3ROdW1lcmljRGF0YVR5cGUpIGRhdGFUeXBlKS5nZXRTY2FsZSgpIDoKLQkJCQkJCS0xOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlEYXRhVHlwZSBkYXRhVHlwZSA9IHRoaXMuZHRwQ29sdW1uLmdldERhdGFUeXBlKCk7Ci0JCXJldHVybiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJTdHJpbmdEYXRhVHlwZSkgPwotCQkJCQkJKChDaGFyYWN0ZXJTdHJpbmdEYXRhVHlwZSkgZGF0YVR5cGUpLmdldExlbmd0aCgpIDoKLQkJCQkJCS0xOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTE9CKCkgewotCQlEYXRhVHlwZSBkYXRhVHlwZSA9IHRoaXMuZHRwQ29sdW1uLmdldERhdGFUeXBlKCk7Ci0JCXJldHVybiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBQcmVkZWZpbmVkRGF0YVR5cGUpID8KLQkJCQkJCXByaW1pdGl2ZVR5cGVJc0xvYigoKFByZWRlZmluZWREYXRhVHlwZSkgZGF0YVR5cGUpLmdldFByaW1pdGl2ZVR5cGUoKSkgOgotCQkJCQkJZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhVHlwZSgpLmRlY2xhcmF0aW9uKCk7Ci0JfQotCi0JcHVibGljIEphdmFUeXBlIGdldEphdmFUeXBlKCkgewotCQlEYXRhVHlwZSBkYXRhVHlwZSA9IHRoaXMuZHRwQ29sdW1uLmdldERhdGFUeXBlKCk7Ci0JCXJldHVybiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBQcmVkZWZpbmVkRGF0YVR5cGUpID8KLQkJCWNvbnZlcnRUb0pQQUphdmFUeXBlKHRoaXMuZ2V0SmF2YVR5cGUoKFByZWRlZmluZWREYXRhVHlwZSkgZGF0YVR5cGUpKSA6Ci0JCQlERUZBVUxUX0pBVkFfVFlQRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlKYXZhVHlwZURlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcmltYXJ5S2V5SmF2YVR5cGUoKS5kZWNsYXJhdGlvbigpOwotCX0KLQotCXB1YmxpYyBKYXZhVHlwZSBnZXRQcmltYXJ5S2V5SmF2YVR5cGUoKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9KUEFQcmltYXJ5S2V5SmF2YVR5cGUodGhpcy5nZXRKYXZhVHlwZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFUeXBlIGdldEphdmFUeXBlKFByZWRlZmluZWREYXRhVHlwZSBkYXRhVHlwZSkgewotCQkvLyB0aGlzIGlzIGp1c3QgYSBiaXQgaGFja3k6IG1vdmluZyBmcm9tIGEgdHlwZSBkZWNsYXJhdGlvbiB0byBhIGNsYXNzIG5hbWUgdG8gYSB0eXBlIGRlY2xhcmF0aW9uLi4uCi0JCVN0cmluZyBkdHBKYXZhQ2xhc3NOYW1lID0gdGhpcy5yZXNvbHZlRGVmaW5pdGlvbihkYXRhVHlwZSkuZ2V0SmF2YUNsYXNzTmFtZSgpOwotCQlyZXR1cm4gbmV3IFNpbXBsZUphdmFUeXBlKFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oZHRwSmF2YUNsYXNzTmFtZSkpOwotCX0KLQotCXByaXZhdGUgUHJlZGVmaW5lZERhdGFUeXBlRGVmaW5pdGlvbiByZXNvbHZlRGVmaW5pdGlvbihQcmVkZWZpbmVkRGF0YVR5cGUgZGF0YVR5cGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREVFBEZWZpbml0aW9uKCkuZ2V0UHJlZGVmaW5lZERhdGFUeXBlRGVmaW5pdGlvbihkYXRhVHlwZS5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29sdW1uID09IGNvbHVtbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIGNsZWFyKCkgewotCQkvLyBubyBzdGF0ZSB0byBjbGVhcgotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgSkRCQyBzcGVjIHNheXMgSkRCQyBkcml2ZXJzIHNob3VsZCBiZSBhYmxlIHRvIG1hcCBCTE9CcyBhbmQgQ0xPQnMKLQkgKiBkaXJlY3RseSwgYnV0IHRoZSBKUEEgc3BlYyBkb2VzIG5vdCBhbGxvdyB0aGVtLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEphdmFUeXBlIGNvbnZlcnRUb0pQQUphdmFUeXBlKEphdmFUeXBlIGphdmFUeXBlKSB7Ci0JCWlmIChqYXZhVHlwZS5lcXVhbHMoQkxPQl9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gQllURV9BUlJBWV9KQVZBX1RZUEU7Ci0JCX0KLQkJaWYgKGphdmFUeXBlLmVxdWFscyhDTE9CX0pBVkFfVFlQRSkpIHsKLQkJCXJldHVybiBTVFJJTkdfSkFWQV9UWVBFOwotCQl9Ci0JCXJldHVybiBqYXZhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgSlBBIHNwZWMgWzIuMS40XSBzYXlzIG9ubHkgdGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgYWxsb3dlZCBpbgotCSAqIHByaW1hcnkga2V5IGZpZWxkczo8dWw+Ci0JICogICAgIDxsaT5bdmFyaWFibGVdIHByaW1pdGl2ZXMKLQkgKiAgICAgPGxpPlt2YXJpYWJsZV0gcHJpbWl0aXZlIHdyYXBwZXJzCi0JICogICAgIDxsaT57QGxpbmsgamF2YS5sYW5nLlN0cmluZ30KLQkgKiAgICAgPGxpPntAbGluayBqYXZhLnV0aWwuRGF0ZX0KLQkgKiAgICAgPGxpPntAbGluayBqYXZhLnNxbC5EYXRlfQotCSAqIDwvdWw+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YVR5cGUgY29udmVydFRvSlBBUHJpbWFyeUtleUphdmFUeXBlKEphdmFUeXBlIGphdmFUeXBlKSB7Ci0JCWlmIChqYXZhVHlwZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKCkKLQkJCQl8fCBqYXZhVHlwZS5pc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcigpCi0JCQkJfHwgamF2YVR5cGUuZXF1YWxzKFNUUklOR19KQVZBX1RZUEUpCi0JCQkJfHwgamF2YVR5cGUuZXF1YWxzKFVUSUxfREFURV9KQVZBX1RZUEUpCi0JCQkJfHwgamF2YVR5cGUuZXF1YWxzKFNRTF9EQVRFX0pBVkFfVFlQRSkpIHsKLQkJCXJldHVybiBqYXZhVHlwZTsKLQkJfQotCQlpZiAoamF2YVR5cGUuZXF1YWxzKEJJR19ERUNJTUFMX0pBVkFfVFlQRSkpIHsKLQkJCXJldHVybiBMT05HX0pBVkFfVFlQRTsgIC8vID8/Ci0JCX0KLQkJaWYgKGphdmFUeXBlLmVxdWFscyhTUUxfVElNRV9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gVVRJTF9EQVRFX0pBVkFfVFlQRTsgIC8vID8/PwotCQl9Ci0JCWlmIChqYXZhVHlwZS5lcXVhbHMoU1FMX1RJTUVTVEFNUF9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gVVRJTF9EQVRFX0pBVkFfVFlQRTsgIC8vID8/PwotCQl9Ci0JCS8vIGFsbCB0aGUgb3RoZXIgdHlwaWNhbCB0eXBlcyBhcmUgcHJldHR5IG11Y2ggdW4tbWFwcGFibGUgLSByZXR1cm4gU3RyaW5nKD8pCi0JCXJldHVybiBTVFJJTkdfSkFWQV9UWVBFOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcHJpbWl0aXZlVHlwZUlzTG9iKFByaW1pdGl2ZVR5cGUgcHJpbWl0aXZlVHlwZSkgewotCQlyZXR1cm4gKHByaW1pdGl2ZVR5cGUgPT0gUHJpbWl0aXZlVHlwZS5CSU5BUllfTEFSR0VfT0JKRUNUX0xJVEVSQUwpCi0JCQkJfHwgKHByaW1pdGl2ZVR5cGUgPT0gUHJpbWl0aXZlVHlwZS5DSEFSQUNURVJfTEFSR0VfT0JKRUNUX0xJVEVSQUwpCi0JCQkJfHwgKHByaW1pdGl2ZVR5cGUgPT0gUHJpbWl0aXZlVHlwZS5OQVRJT05BTF9DSEFSQUNURVJfTEFSR0VfT0JKRUNUX0xJVEVSQUwpOwotCX0KLQotCi0JLy8gKioqKiogc29tZSBjb25zdGFudHMgdXNlZCB3aGVuIGNvbnZlcnRpbmcgdGhlIGNvbHVtbiB0byBhIEphdmEgYXR0cmlidXRlCi0JLy8gVE9ETyBPYmplY3QgaXMgdGhlIGRlZmF1bHQ/Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgREVGQVVMVF9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBCTE9CX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnNxbC5CbG9iLmNsYXNzKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBCWVRFX0FSUkFZX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShieXRlW10uY2xhc3MpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgQ0xPQl9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5zcWwuQ2xvYi5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgU1RSSU5HX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIFVUSUxfREFURV9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLkRhdGUuY2xhc3MpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIFNRTF9EQVRFX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnNxbC5EYXRlLmNsYXNzKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBTUUxfVElNRV9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5zcWwuVGltZS5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgU1FMX1RJTUVTVEFNUF9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIEJJR19ERUNJTUFMX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgTE9OR19KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUobG9uZy5jbGFzcyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDNiZDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklDb25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklQcm9maWxlTGlzdGVuZXIxOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuUHJvZmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotCi0vKioKLSAqIFdyYXAgdGhlIERUUCBQcm9maWxlTWFuYWdlciBpbiB5ZXQgYW5vdGhlciBzaW5nbGV0b24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkKLQlpbXBsZW1lbnRzIENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeQotewotCXByaXZhdGUgUHJvZmlsZU1hbmFnZXIgZHRwUHJvZmlsZU1hbmFnZXI7Ci0KLQlwcml2YXRlIExvY2FsUHJvZmlsZUxpc3RlbmVyIHByb2ZpbGVMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IElOU1RBTkNFID0gbmV3IERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpOwotCi0JcHVibGljIHN0YXRpYyBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiAncHJpdmF0ZScgdG8gZW5zdXJlIHNpbmdsZXRvbgotCSAqLwotCXByaXZhdGUgRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaWZlY3ljbGUgKioqKioqKioqKgotCi0JLyoqCi0JICogY2FsbGVkIGJ5IHBsdWctaW4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB7Ci0JCXRoaXMuZHRwUHJvZmlsZU1hbmFnZXIgPSBQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCQl0aGlzLnByb2ZpbGVMaXN0ZW5lciA9IG5ldyBMb2NhbFByb2ZpbGVMaXN0ZW5lcigpOwotCQl0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyLmFkZFByb2ZpbGVMaXN0ZW5lcih0aGlzLnByb2ZpbGVMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogY2FsbGVkIGJ5IHBsdWctaW4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKLQkJdGhpcy5kdHBQcm9maWxlTWFuYWdlci5yZW1vdmVQcm9maWxlTGlzdGVuZXIodGhpcy5wcm9maWxlTGlzdGVuZXIpOwotCQl0aGlzLnByb2ZpbGVMaXN0ZW5lciA9IG51bGw7Ci0JCXRoaXMuZHRwUHJvZmlsZU1hbmFnZXIgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25uZWN0aW9uIHByb2ZpbGVzICoqKioqKioqKioKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSwgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciBhZGFwdGVyKSB7Ci0JCWZvciAoSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUgOiB0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyLmdldFByb2ZpbGVzKCkpIHsKLQkJCWlmIChkdHBQcm9maWxlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gbmV3IERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlcihkdHBQcm9maWxlLCBhZGFwdGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbm5lY3Rpb25Qcm9maWxlKG5hbWUsIERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIuRGVmYXVsdC5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SUNvbm5lY3Rpb25Qcm9maWxlLCBTdHJpbmc+KHRoaXMuZ2V0RFRQQ29ubmVjdGlvblByb2ZpbGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJCQkgcmV0dXJuIGR0cFByb2ZpbGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIEl0ZXJhYmxlPElDb25uZWN0aW9uUHJvZmlsZT4gZ2V0RFRQQ29ubmVjdGlvblByb2ZpbGVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8SUNvbm5lY3Rpb25Qcm9maWxlPih0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyLmdldFByb2ZpbGVzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucHJvZmlsZUxpc3RlbmVyLmFkZENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnByb2ZpbGVMaXN0ZW5lci5yZW1vdmVDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogRm9yd2FyZCBldmVudHMgdG8gdGhlIGZhY3RvcnkncyBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxQcm9maWxlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvZmlsZUxpc3RlbmVyMSB7Ci0JCXByaXZhdGUgTGlzdGVuZXJMaXN0PENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8Q29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcj4oQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lci5jbGFzcyk7Ci0KLQkJTG9jYWxQcm9maWxlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJdm9pZCBhZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5saXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogSVByb2ZpbGVMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJcHVibGljIHZvaWQgcHJvZmlsZUFkZGVkKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGR0cFByb2ZpbGUuZ2V0TmFtZSgpOwotCQkJZm9yIChDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5jb25uZWN0aW9uUHJvZmlsZUFkZGVkKG5hbWUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvZmlsZUNoYW5nZWQoSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUsIFN0cmluZyBvbGROYW1lLCBTdHJpbmcgb2xkRGVzY3JpcHRpb24sIEJvb2xlYW4gb2xkQXV0b0Nvbm5lY3QpIHsKLQkJCVN0cmluZyBuZXdOYW1lID0gZHRwUHJvZmlsZS5nZXROYW1lKCk7Ci0JCQlpZiAoICEgbmV3TmFtZS5lcXVhbHMob2xkTmFtZSkpIHsKLQkJCQlmb3IgKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCQlsaXN0ZW5lci5jb25uZWN0aW9uUHJvZmlsZVJlbmFtZWQob2xkTmFtZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvZmlsZUNoYW5nZWQoSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJCS8vIHRoaXMgbWV0aG9kIHNob3VsZG4ndCBiZSBjYWxsZWQgb24gSVByb2ZpbGVMaXN0ZW5lcjEKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvZmlsZURlbGV0ZWQoSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJCVN0cmluZyBuYW1lID0gZHRwUHJvZmlsZS5nZXROYW1lKCk7Ci0JCQlmb3IgKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLmNvbm5lY3Rpb25Qcm9maWxlUmVtb3ZlZChuYW1lKTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWM2MTUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5Db25uZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JTWFuYWdlZENvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JTWFuYWdlZENvbm5lY3Rpb25PZmZsaW5lTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLkRyaXZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLmpkYmMuSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUuY29ubmVjdGlvbi5Db25uZWN0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuY29yZS5EYXRhYmFzZUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbHRvb2xzLmNvcmUucHJvZmlsZS5Qcm9maWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogIFdyYXAgYSBEVFAgQ29ubmVjdGlvblByb2ZpbGUKLSAqLwotZmluYWwgY2xhc3MgRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyCi0JaW1wbGVtZW50cyBEVFBEYXRhYmFzZU9iamVjdCwgQ29ubmVjdGlvblByb2ZpbGUKLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIGNvbm5lY3Rpb24gcHJvZmlsZSAqLwotCXByaXZhdGUgZmluYWwgSUNvbm5lY3Rpb25Qcm9maWxlIGR0cENvbm5lY3Rpb25Qcm9maWxlOwotCi0JLyoqIGFkYXB0ZXIgc3VwcGxpZWQgYnkgdGhlIGNsaWVudCAoZGV0ZXJtaW5lcyBpZGVudGlmaWVyIGRlbGltaXRlcnMsIGV0Yy4pICovCi0JcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIGlkZW50aWZpZXJBZGFwdGVyOwotCi0JLyoqIGNhbGxiYWNrIHBhc3NlZCB0byB0aGUgaWRlbnRpZmllciBhZGFwdGVyICovCi0JcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyLkRlZmF1bHRDYWxsYmFjayBpZGVudGlmaWVyQWRhcHRlckNhbGxiYWNrOwotCi0JLyoqIHRoZSBEVFAgbWFuYWdlZCBjb25uZWN0aW9uIHdlIGxpc3RlbiB0byAqLwotCXByaXZhdGUgZmluYWwgSU1hbmFnZWRDb25uZWN0aW9uIGR0cE1hbmFnZWRDb25uZWN0aW9uOwotCi0JLyoqCi0JICogZm9yd2FyZCBldmVudHMgZnJvbSB0aGUgRFRQIG1hbmFnZWQgY29ubmVjdGlvbiBhYm92ZTsKLQkgKiB3ZSBsaXN0ZW4gYW5kIHByb3BhZ2F0ZSBldmVudHMgaWZmIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcwotCSAqLwotCXByaXZhdGUgZmluYWwgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQsIGFuZCBkZWxldGVkIGF0IGRpc2Nvbm5lY3QgKi8KLQlwcml2YXRlIERUUERhdGFiYXNlV3JhcHBlciBkYXRhYmFzZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdGFudHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJVkVfRFRQX0NPTk5FQ1RJT05fVFlQRSA9ICJqYXZhLnNxbC5Db25uZWN0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPRkZMSU5FX0RUUF9DT05ORUNUSU9OX1RZUEUgPSBDb25uZWN0aW9uSW5mby5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQUJBU0VfUFJPRFVDVF9QUk9QX0lEID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc2VydmVyLnZlcnNpb24iOyAgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlcihJQ29ubmVjdGlvblByb2ZpbGUgZHRwQ29ubmVjdGlvblByb2ZpbGUsIERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIgYWRhcHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlID0gZHRwQ29ubmVjdGlvblByb2ZpbGU7Ci0JCXRoaXMuaWRlbnRpZmllckFkYXB0ZXIgPSBhZGFwdGVyOwotCQl0aGlzLmlkZW50aWZpZXJBZGFwdGVyQ2FsbGJhY2sgPSBuZXcgSWRlbnRpZmllckFkYXB0ZXJDYWxsYmFjaygpOwotCQl0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uID0gdGhpcy5idWlsZERUUE1hbmFnZWRDb25uZWN0aW9uKCk7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gbmV3IExvY2FsQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCS8vIGRvbid0IGxpc3RlbiB0byB0aGUgbWFuYWdlZCBjb25uZWN0aW9uIHlldAotCX0KLQotCXByaXZhdGUgSU1hbmFnZWRDb25uZWN0aW9uIGJ1aWxkRFRQTWFuYWdlZENvbm5lY3Rpb24oKSB7Ci0JCVN0cmluZyBjb25uZWN0aW9uVHlwZSA9IHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuc3VwcG9ydHNXb3JrT2ZmbGluZU1vZGUoKSA/Ci0JCQkJT0ZGTElORV9EVFBfQ09OTkVDVElPTl9UWVBFIDogTElWRV9EVFBfQ09OTkVDVElPTl9UWVBFOwotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXRNYW5hZ2VkQ29ubmVjdGlvbihjb25uZWN0aW9uVHlwZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERhdGFiYXNlT2JqZWN0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcihTdHJpbmcgamF2YUlkZW50aWZpZXIpIHsKLQkJLy8gY29ubmVjdGlvbiBwcm9maWxlcyBkbyBub3QgaGF2ZSAiaWRlbnRpZmllcnMiCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJLy8gY29ubmVjdGlvbiBwcm9maWxlcyBkbyBub3QgaGF2ZSAiaWRlbnRpZmllcnMiCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBEYXRhYmFzZU9iamVjdCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIERUUERhdGFiYXNlV3JhcHBlciBnZXREYXRhYmFzZSgpIHsKLQkJaWYgKHRoaXMuZGF0YWJhc2UgPT0gbnVsbCkgewotCQkJdGhpcy5kYXRhYmFzZSA9IHRoaXMuYnVpbGREYXRhYmFzZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRhdGFiYXNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb25uZWN0aW9uUHJvZmlsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBwcm9wZXJ0aWVzCi0JcHVibGljIFN0cmluZyBnZXRQcm92aWRlcklEKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXRQcm92aWRlcklkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbnN0YW5jZUlEKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXRJbnN0YW5jZUlEKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9OQU1FX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VQcm9kdWN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShEQVRBQkFTRV9QUk9EVUNUX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRU5ET1JfUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRVJTSU9OX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuRFJJVkVSX0NMQVNTX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVJMX1BST1BfSUQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVzZXIgbmFtZS4KLQkgKiBBbGxvd3MgdXNlciBuYW1lIGNvbXBvc2VkIGJ5IG1vcmUgdGhhbiBvbmUgd29yZC4KLQkgKiBJZiB0aGUgdXNlciBuYW1lIGNvbnRhaW5zIGEga2V5d29yZCwgaXQgcmV0dXJucyB0aGUgZmlyc3Qgd29yZCBvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlck5hbWUoKSB7Ci0JCVN0cmluZyB1c2VyTmFtZSA9IHRoaXMuZ2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVTRVJOQU1FX1BST1BfSUQpOwotCQl1c2VyTmFtZSA9IHVzZXJOYW1lLnRyaW0oKTsgCi0JCVN0cmluZ1tdIG5hbWVzID0gIHVzZXJOYW1lLnNwbGl0KCJcXHMrIik7CS8vJE5PTi1OTFMtMSQKLQkJaWYobmFtZXMubGVuZ3RoID09IDMpIHsgLy8gMjA4OTQ2IGhhbmRsZSB1c2VybmFtZSBsaWtlICJzeXMgYXMgc3lzZGJhIiBvbiBPcmFjbGUKLQkJICAgIGlmKHRoaXMubmFtZUlzS2V5d29yZChuYW1lc1sxXSkpIHsKLQkJICAgIAlyZXR1cm4gbmFtZXNbMF07Ci0JCSAgICB9Ci0JCX0KLQkJcmV0dXJuIHVzZXJOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlclBhc3N3b3JkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuUEFTU1dPUkRfUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KERSSVZFUl9ERUZJTklUSU9OX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVySmFyTGlzdCgpIHsKLQkJcmV0dXJuIERyaXZlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXREcml2ZXJJbnN0YW5jZUJ5SUQodGhpcy5nZXREcml2ZXJEZWZpbml0aW9uSUQoKSkuZ2V0SmFyTGlzdCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuIERyaXZlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXREcml2ZXJJbnN0YW5jZUJ5SUQodGhpcy5nZXREcml2ZXJEZWZpbml0aW9uSUQoKSkuZ2V0TmFtZSgpOwotCX0KLQotCS8vICoqKioqIGNvbm5lY3Rpb24KLQlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKSB8fCB0aGlzLmlzV29ya2luZ09mZmxpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0luYWN0aXZlKCkgewotCQlyZXR1cm4gISB0aGlzLmlzQWN0aXZlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkKLQkJCQkmJiAhIHRoaXMuZHRwTWFuYWdlZENvbm5lY3Rpb24uaXNXb3JraW5nT2ZmbGluZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlzY29ubmVjdGVkKCkgewotCQlyZXR1cm4gISB0aGlzLmlzQ29ubmVjdGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29ubmVjdCgpIHsKLQkJaWYgKHRoaXMuaXNEaXNjb25uZWN0ZWQoKSkgewotCQkJdGhpcy5jaGVja1N0YXR1cyh0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKLQkJdGhpcy5jaGVja1N0YXR1cyh0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKSk7Ci0JfQotCi0JLy8gKioqKiogb2ZmLWxpbmUgc3VwcG9ydAotCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ09mZmxpbmUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uLmlzV29ya2luZ09mZmxpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1dvcmtPZmZsaW5lTW9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuc3VwcG9ydHNXb3JrT2ZmbGluZU1vZGUoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBzYXZlV29ya09mZmxpbmVEYXRhKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5zYXZlV29ya09mZmxpbmVEYXRhKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbldvcmtPZmZsaW5lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5jYW5Xb3JrT2ZmbGluZSgpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHdvcmtPZmZsaW5lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS53b3JrT2ZmbGluZSgpOwotCX0KLQkKLQkvLyAqKioqKiBsaXN0ZW5lcnMKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7ICAvLyBmaXJzdCBsaXN0ZW5lciBhZGRlZAotCQkJdGhpcy5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewotCQl0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmRhdGFiYXNlICE9IG51bGwpIHsgIC8vIGRvbid0IHRyaWdnZXIgZGF0YWJhc2UgY3JlYXRpb24KLQkJCWlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHsgIC8vIERUUCBkb2VzIG5vdCBjaGFuZ2Ugd2hlbiBvZmYtbGluZQotCQkJCXRoaXMuZGF0YWJhc2Uuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsgIC8vIGxhc3QgbGlzdGVuZXIgcmVtb3ZlZAotCQkJdGhpcy5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuZGF0YWJhc2UgIT0gbnVsbCkgeyAgLy8gZG9uJ3QgdHJpZ2dlciBkYXRhYmFzZSBjcmVhdGlvbgotCQkJaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgeyAgLy8gRFRQIGRvZXMgbm90IGNoYW5nZSB3aGVuIG9mZi1saW5lCi0JCQkJdGhpcy5kYXRhYmFzZS5zdG9wTGlzdGVuaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5kdHBNYW5hZ2VkQ29ubmVjdGlvbi5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCWJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5oYXNOb0xpc3RlbmVycygpOwotCX0KLQotCWJvb2xlYW4gaGFzQW55TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuaGFzQW55TGlzdGVuZXJzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCWZvciAoSVN0YXR1cyBjaGlsZCA6IHN0YXR1cy5nZXRDaGlsZHJlbigpKSB7Ci0JCQkJdGhpcy5jaGVja1N0YXR1cyhjaGlsZCk7ICAvLyByZWN1cnNlLCBsb29raW5nIGZvciB0aGUgZmlyc3QgZXJyb3IKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzdGF0dXMuZ2V0TWVzc2FnZSgpLCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgRFRQRGF0YWJhc2VXcmFwcGVyIGJ1aWxkRGF0YWJhc2UoKSB7Ci0JCWlmICh0aGlzLmlzSW5hY3RpdmUoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAodGhpcy5pc1dvcmtpbmdPZmZsaW5lKCkpIHsKLQkJCUNvbm5lY3Rpb25JbmZvIGNvbm5lY3Rpb25JbmZvID0gKENvbm5lY3Rpb25JbmZvKSB0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uLmdldENvbm5lY3Rpb24oKS5nZXRSYXdDb25uZWN0aW9uKCk7Ci0JCQlyZXR1cm4gbmV3IERUUERhdGFiYXNlV3JhcHBlcih0aGlzLCBjb25uZWN0aW9uSW5mby5nZXRTaGFyZWREYXRhYmFzZSgpKTsKLQkJfQotCi0JCS8vIFRPRE8gc2VlIERUUCBidWcgMjAyMzA2Ci0JCS8vIHBhc3MgY29ubmVjdD10cnVlIGluIHRvIFByb2ZpbGVVdGlsLmdldERhdGFiYXNlKCkKLQkJLy8gdGhlcmUgaXMgYSBidWcgbWVudGlvbmVkIGluIGEgY29tbWVudDogCi0JCS8vICAgICAiZHVyaW5nIHRoZSBwcm9maWxlIGNvbm5lY3RlZCBldmVudCBub3RpZmljYXRpb24sIAotCQkvLyAgICAgSU1hbmFnZWRDb25uZWN0aW9uIGlzIGNvbm5lY3RlZCB3aGlsZSBJQ29ubmVjdGlvblByb2ZpbGUgaXMgbm90IgotCQkvLyBzbywgc29tZSBoYWNrZXJ5IGhlcmUgdG8gaGFuZGxlIGhhY2tlcnkgdGhlcmUKLQkJcmV0dXJuIG5ldyBEVFBEYXRhYmFzZVdyYXBwZXIodGhpcywgUHJvZmlsZVV0aWwuZ2V0RGF0YWJhc2UobmV3IERhdGFiYXNlSWRlbnRpZmllcih0aGlzLmdldE5hbWUoKSwgdGhpcy5nZXREYXRhYmFzZU5hbWUoKSksIHRydWUpKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCBjbGVhckRhdGFiYXNlKCkgewotCQlpZiAodGhpcy5kYXRhYmFzZSAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7ICAvLyBEVFAgZG9lcyBub3QgY2hhbmdlIHdoZW4gb2ZmLWxpbmUKLQkJCQl0aGlzLmRhdGFiYXNlLnN0b3BMaXN0ZW5pbmcoKTsKLQkJCX0KLQkJCXRoaXMuZGF0YWJhc2UgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgd2UgbmVlZCB0byBjb252ZXJ0IGFuIGlkZW50aWZpZXIgdG8gYSBuYW1lCi0JICogKGUuZy4ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSNnZXRDb2x1bW5Gb3JJZGVudGlmaWVyKFN0cmluZyl9KS4KLQkgKiBXZSBjaGFubmVsIGFsbCB0aGUgY2FsbHMgdG8gaGVyZSBhbmQgdGhlbiB3ZSBkZWxlZ2F0ZSB0byB0aGUKLQkgKiBjbGllbnQtc3VwcGxpZWQgImRhdGFiYXNlIGlkZW50aWZpZXIgYWRhcHRlciIuCi0JICovCi0JU3RyaW5nIGNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLmlkZW50aWZpZXJBZGFwdGVyLmNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKGlkZW50aWZpZXIsIHRoaXMuaWRlbnRpZmllckFkYXB0ZXJDYWxsYmFjayk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgImRhdGFiYXNlIGlkZW50aWZpZXIgYWRhcHRlciIgY2FsbHMgYmFjayB0byBoZXJlIHNvIHdlIGNhbiBkZWxlZ2F0ZSB0bwotCSAqIHRoZSBkYXRhYmFzZSwgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gcHJvcGVybHkKLQkgKiBjb252ZXJ0IGlkZW50aWZpZXJzLgotCSAqLwotCVN0cmluZyBjb252ZXJ0SWRlbnRpZmllclRvTmFtZV8oU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJLy8gdGhlIGRhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCBoZXJlIC0gY2FsbCBpdHMgaW50ZXJuYWwgbWV0aG9kCi0JCXJldHVybiB0aGlzLmRhdGFiYXNlLmNvbnZlcnRJZGVudGlmaWVyVG9OYW1lXyhpZGVudGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciB3ZSBuZWVkIHRvIGNvbnZlcnQgYSBuYW1lIHRvIGFuIGlkZW50aWZpZXIKLQkgKiAoZS5nLiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlI2dldENvbHVtbkZvcklkZW50aWZpZXIoU3RyaW5nKX0pLgotCSAqIFdlIGNoYW5uZWwgYWxsIHRoZSBjYWxscyB0byBoZXJlIGFuZCB0aGVuIHdlIGRlbGVnYXRlIHRvIHRoZQotCSAqIGNsaWVudC1zdXBwbGllZCAiZGF0YWJhc2UgaWRlbnRpZmllciBhZGFwdGVyIi4KLQkgKi8KLQlTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaWRlbnRpZmllckFkYXB0ZXIuY29udmVydE5hbWVUb0lkZW50aWZpZXIobmFtZSwgdGhpcy5pZGVudGlmaWVyQWRhcHRlckNhbGxiYWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCAiZGF0YWJhc2UgaWRlbnRpZmllciBhZGFwdGVyIiBjYWxscyBiYWNrIHRvIGhlcmUgc28gd2UgY2FuIGRlbGVnYXRlIHRvCi0JICogdGhlIGRhdGFiYXNlLCB3aGljaCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBwcm9wZXJseQotCSAqIGNvbnZlcnQgbmFtZXMuCi0JICovCi0JU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyXyhTdHJpbmcgbmFtZSkgewotCQkvLyB0aGUgZGF0YWJhc2Ugc2hvdWxkIG5vdCBiZSBudWxsIGhlcmUgLSBjYWxsIGl0cyBpbnRlcm5hbCBtZXRob2QKLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2UuY29udmVydE5hbWVUb0lkZW50aWZpZXJfKG5hbWUpOwotCX0KLQotCXZvaWQgZGF0YWJhc2VDaGFuZ2VkKERUUERhdGFiYXNlV3JhcHBlciBkYikgewotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5kYXRhYmFzZUNoYW5nZWQoZGIpOwotCX0KLQotCXZvaWQgY2F0YWxvZ0NoYW5nZWQoRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZykgewotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5jYXRhbG9nQ2hhbmdlZChjYXRhbG9nKTsKLQl9Ci0KLQl2b2lkIHNjaGVtYUNoYW5nZWQoRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEpIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuc2NoZW1hQ2hhbmdlZChzY2hlbWEpOwotCX0KLQotCXZvaWQgc2VxdWVuY2VDaGFuZ2VkKERUUFNlcXVlbmNlV3JhcHBlciBzZXF1ZW5jZSkgewotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5zZXF1ZW5jZUNoYW5nZWQoc2VxdWVuY2UpOwotCX0KLQotCXZvaWQgdGFibGVDaGFuZ2VkKERUUFRhYmxlV3JhcHBlciB0YWJsZSkgewotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci50YWJsZUNoYW5nZWQodGFibGUpOwotCX0KLQotCXZvaWQgY29sdW1uQ2hhbmdlZChEVFBDb2x1bW5XcmFwcGVyIGNvbHVtbikgewotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5jb2x1bW5DaGFuZ2VkKGNvbHVtbik7Ci0JfQotCi0Jdm9pZCBmb3JlaWduS2V5Q2hhbmdlZChEVFBGb3JlaWduS2V5V3JhcHBlciBmb3JlaWduS2V5KSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmZvcmVpZ25LZXlDaGFuZ2VkKGZvcmVpZ25LZXkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuZ2V0QmFzZVByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBuYW1lSXNLZXl3b3JkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImFzIik7ICAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUCBjb25uZWN0aW9uIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgbGlzdGVuZXIgdHJhbnNsYXRlcyBhbmQgZm9yd2FyZHMge0BsaW5rIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSU1hbmFnZWRDb25uZWN0aW9uTGlzdGVuZXJ9IGFuZAotCSAqIHtAbGluayBJTWFuYWdlZENvbm5lY3Rpb25PZmZsaW5lTGlzdGVuZXJ9IGV2ZW50cyB0byB7QGxpbmsgQ29ubmVjdGlvbkxpc3RlbmVyfXMuCi0JICovCi0JY2xhc3MgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJTWFuYWdlZENvbm5lY3Rpb25PZmZsaW5lTGlzdGVuZXIgewotCQlwcml2YXRlIExpc3RlbmVyTGlzdDxDb25uZWN0aW9uTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8Q29ubmVjdGlvbkxpc3RlbmVyPihDb25uZWN0aW9uTGlzdGVuZXIuY2xhc3MpOwotCi0JCUxvY2FsQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5saXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCi0JCWJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuaXNFbXB0eSgpOwotCQl9Ci0KLQkJYm9vbGVhbiBoYXNBbnlMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gISB0aGlzLmxpc3RlbmVyTGlzdC5pc0VtcHR5KCk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogSU1hbmFnZWRDb25uZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCS8vIG9mZi1saW5lIG9yIGluYWN0aXZlID0+IGxpdmUKLQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gZG8gbm90IGJ1aWxkIHRoZSBkYXRhYmFzZSBoZXJlIC0gaXQgaXMgYnVpbHQgb24tZGVtYW5kCi0JCQkvLyBmb3J3YXJkIGV2ZW50IHRvIGxpc3RlbmVycwotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLm9wZW5lZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogVGhpcyBtZXRob2QgaXMgbmV2ZXIgY2FsbGVkIGZyb20gdGhlIGJhc2UgRFRQIGNvZGUuCi0JCSAqIFBlcmhhcHMgRFRQIGV4dGVuZGVycyBjYWxsIGl0Li4uLgotCQkgKiBAc2VlIE1hbmFnZWRDb25uZWN0aW9uI2ZpcmVNb2RpZmllZEV2ZW50KE9iamVjdCkKLQkJICogICAgIHdoaWNoIGlzIG5ldmVyIGNhbGxlZC4uLgotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBmb3J3YXJkIGV2ZW50IHRvIGxpc3RlbmVycwotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLm1vZGlmaWVkKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZShDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCS8vIGZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJaWYgKCAhIGxpc3RlbmVyLm9rVG9DbG9zZShEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcykpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWJvdXRUb0Nsb3NlKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gZm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5hYm91dFRvQ2xvc2UoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMpOwotCQkJfQotCQl9Ci0KLQkJLy8gbGl2ZSBvciBvZmYtbGluZSA9PiBpbmFjdGl2ZQotCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBjbGVhciB0aGUgZGF0YWJhc2UKLQkJCURUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzLmNsZWFyRGF0YWJhc2UoKTsKLQkJCS8vIGZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuY2xvc2VkKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzKTsKLQkJCX0KLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBJTWFuYWdlZENvbm5lY3Rpb25PZmZsaW5lTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCS8vIGxpdmUgPT4gb2ZmLWxpbmUKLQkJcHVibGljIGJvb2xlYW4gb2tUb0RldGFjaChDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCS8vIGNvbnZlcnQgdGhlIGV2ZW50IHRvIGFuICJvayB0byBjbG9zZSIgZXZlbnQ7Ci0JCQkvLyB3ZSBhcmUgImNsb3NpbmciIHRoZSBsaXZlIGNvbm5lY3Rpb24KLQkJCXJldHVybiB0aGlzLm9rVG9DbG9zZShldmVudCk7Ci0JCX0KLQkJCi0JCS8vIGxpdmUgPT4gb2ZmLWxpbmUKLQkJcHVibGljIHZvaWQgYWJvdXRUb0RldGFjaChDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCS8vIGNvbnZlcnQgdGhlIGV2ZW50IHRvIGEgImNsb3NlIiBldmVudDsKLQkJCS8vIHdlIGFyZSAiY2xvc2luZyIgdGhlIGxpdmUgY29ubmVjdGlvbgotCQkJdGhpcy5jbG9zZWQoZXZlbnQpOwotCQl9Ci0KLQkJLy8gaW5hY3RpdmUgb3IgbGl2ZSA9PiBvZmYtbGluZQotCQlwdWJsaWMgdm9pZCB3b3JraW5nT2ZmbGluZShDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCS8vIGNvbnZlcnQgdGhlIGV2ZW50IHRvIGFuICJvcGVuIiBldmVudDsKLQkJCS8vIHdlIGFyZSAib3BlbmluZyIgdGhlIG9mZi1saW5lIGNvbm5lY3Rpb24KLQkJCXRoaXMub3BlbmVkKGV2ZW50KTsKLQkJfQotCi0JCS8vIG9mZi1saW5lID0+IGxpdmUKLQkJcHVibGljIHZvaWQgYWJvdXRUb0F0dGFjaChDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCS8vIGNvbnZlcnQgdGhlIGV2ZW50IHRvIGFuICJjbG9zZSIgZXZlbnQ7Ci0JCQkvLyB3ZSBhcmUgImNsb3NpbmciIHRoZSBvZmYtbGluZSBjb25uZWN0aW9uCi0JCQl0aGlzLmNsb3NlZChldmVudCk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkJdm9pZCBkYXRhYmFzZUNoYW5nZWQoRFRQRGF0YWJhc2VXcmFwcGVyIGRiKSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuZGF0YWJhc2VDaGFuZ2VkKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzLCBkYik7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIGNhdGFsb2dDaGFuZ2VkKERUUENhdGFsb2dXcmFwcGVyIGNhdGFsb2cpIHsKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5jYXRhbG9nQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgY2F0YWxvZyk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIHNjaGVtYUNoYW5nZWQoRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEpIHsKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5zY2hlbWFDaGFuZ2VkKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzLCBzY2hlbWEpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBzZXF1ZW5jZUNoYW5nZWQoRFRQU2VxdWVuY2VXcmFwcGVyIHNlcXVlbmNlKSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuc2VxdWVuY2VDaGFuZ2VkKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzLCBzZXF1ZW5jZSk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIHRhYmxlQ2hhbmdlZChEVFBUYWJsZVdyYXBwZXIgdGFibGUpIHsKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci50YWJsZUNoYW5nZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMsIHRhYmxlKTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgY29sdW1uQ2hhbmdlZChEVFBDb2x1bW5XcmFwcGVyIGNvbHVtbikgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLmNvbHVtbkNoYW5nZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMsIGNvbHVtbik7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKERUUEZvcmVpZ25LZXlXcmFwcGVyIGZvcmVpZ25LZXkpIHsKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5mb3JlaWduS2V5Q2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgZm9yZWlnbktleSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IERhdGFiYXNlRmluZGVyICoqKioqKioqKioKLQotCWNsYXNzIElkZW50aWZpZXJBZGFwdGVyQ2FsbGJhY2sgaW1wbGVtZW50cyBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyLkRlZmF1bHRDYWxsYmFjayB7Ci0JCXB1YmxpYyBTdHJpbmcgY29udmVydElkZW50aWZpZXJUb05hbWUoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJCS8vIGNhbGwgYmFjayB0byB0aGUgaW50ZXJuYWwgbWV0aG9kCi0JCQlyZXR1cm4gRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMuY29udmVydElkZW50aWZpZXJUb05hbWVfKGlkZW50aWZpZXIpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUpIHsKLQkJCS8vIGNhbGwgYmFjayB0byB0aGUgaW50ZXJuYWwgbWV0aG9kCi0JCQlyZXR1cm4gRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMuY29udmVydE5hbWVUb0lkZW50aWZpZXJfKG5hbWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3NmZlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VPYmplY3Q7Ci0KLS8qKgotICogRFRQIGRhdGFiYXNlIG9iamVjdAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUUERhdGFiYXNlT2JqZWN0IGV4dGVuZHMgRGF0YWJhc2VPYmplY3QgewotCi0JLyoqCi0JICogY292YXJpYW50IG92ZXJyaWRlCi0JICovCi0JRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyIGdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0V3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YzNjYjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLlJlZnJlc2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiAgRFRQIENhdGFsb2cgT2JqZWN0IFdyYXBwZXIgYmFzZSBjbGFzcwotICovCi1hYnN0cmFjdCBjbGFzcyBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIKLQlpbXBsZW1lbnRzIERUUERhdGFiYXNlT2JqZWN0Ci17Ci0JLyoqIHdlIG5lZWQgYSB3YXkgdG8gZ2V0IHRvIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgKi8KLQlwcml2YXRlIGZpbmFsIERUUERhdGFiYXNlT2JqZWN0IHBhcmVudDsKLQotCS8qKiBsaXN0ZW4gZm9yIHRoZSAiY2F0YWxvZyBvYmplY3QiIGJlaW5nIHJlZnJlc2hlZCAqLwotCXByaXZhdGUgZmluYWwgSUNhdGFsb2dPYmplY3RMaXN0ZW5lciBjYXRhbG9nT2JqZWN0TGlzdGVuZXI7Ci0KLQkvKiogbGlzdGVuIGZvciB0aGlzIERUUCBjYXRhbG9nIG9iamVjdCB0byByZWZyZXNoICovCi0JZmluYWwgSUNhdGFsb2dPYmplY3QgY2F0YWxvZ09iamVjdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyKERUUERhdGFiYXNlT2JqZWN0IHBhcmVudCwgT2JqZWN0IGR0cE9iamVjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQkvLyB3ZSBvbmx5IGxpc3RlbiB0byAibGl2ZSIgY29ubmVjdGlvbnMgKGFzIG9wcG9zZWQgdG8gIm9mZi1saW5lIiBjb25uZWN0aW9ucyk7Ci0JCQkvLyBhbmQgdGhlIG1vZGVsIGlzIHJlYnVpbHQgd2hlbiB0aGUgY29ubmVjdGlvbiBjb25uZWN0cyBvciBkaXNjb25uZWN0cwotCQkJdGhpcy5jYXRhbG9nT2JqZWN0ID0gKElDYXRhbG9nT2JqZWN0KSBkdHBPYmplY3Q7Ci0JCQl0aGlzLmNhdGFsb2dPYmplY3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKTsKLQkJCWlmICh0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuaGFzQW55TGlzdGVuZXJzKCkpIHsKLQkJCQl0aGlzLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmNhdGFsb2dPYmplY3QgPSBudWxsOwotCQkJdGhpcy5jYXRhbG9nT2JqZWN0TGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIGJ1aWxkQ2F0YWxvZ09iamVjdExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElDYXRhbG9nT2JqZWN0IGRtRWxlbWVudCwgaW50IGV2ZW50VHlwZSkgewotCQkJCWlmIChkbUVsZW1lbnQgPT0gRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyLnRoaXMuY2F0YWxvZ09iamVjdCkgewotCQkJCQkvLyAnZXZlbnRUeXBlJyBkb2Vzbid0IHNlZW0gdG8gYmUgdmVyeSB1c2VmdWwsIHNvIGRyb3AgaXQKLQkJCQkJRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyLnRoaXMuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gdHlwaWNhbGx5LCBub3RpZnkgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBzb21ldGhpbmcgaGFzIGNoYW5nZWQKLQl2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQl0aGlzLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIERUUCBvYmplY3QgaGFzIGNoYW5nZWQsIGNsZWFyIHRoZSB3cmFwcGVyJ3Mgc3RhdGUgc28gaXQgd2lsbCBiZQotCSAqIHN5bmNocm9uaXplZCBvbi1kZW1hbmQuCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBjbGVhcigpOwotCi0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlEVFBEYXRhYmFzZU9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgRFRQRGF0YWJhc2VXcmFwcGVyIGdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldERhdGFiYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSBvYmplY3QgaWRlbnRpZmllZCBieSB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIuIElmCi0JICogdGhlIGlkZW50aWZpZXIgaXMgImRlbGltaXRlZCIgKHR5cGljYWxseSB3aXRoIGRvdWJsZS1xdW90ZXMpLCBpdCB3aWxsIGJlCi0JICogdXNlZCB3aXRob3V0IGFueSBmb2xkaW5nLiBJZiB0aGUgbmFtZSBpcyAicmVndWxhciIgKGkuZS4gbm90IGRlbGltaXRlZCksCi0JICogaXQgd2lsbCBiZSBmb2xkZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGNhc2UgKHR5cGljYWxseSB1cHBlcmNhc2UpLgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHdoZW5ldmVyIHdlIG5lZWQgdG8gZmluZCBhIGNvbXBvbmVudCBieSBpZGVudGlmaWVyCi0JICogKGUuZy4ge3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUjZ2V0Q29sdW1uRm9ySWRlbnRpZmllcihTdHJpbmcpfSkuCi0JICovCi0JPFQgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdD4gVCBzZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIoSXRlcmFibGU8VD4gZGF0YWJhc2VPYmplY3RzLCBTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5zZWxlY3REYXRhYmFzZU9iamVjdE5hbWVkKGRhdGFiYXNlT2JqZWN0cywgdGhpcy5jb252ZXJ0SWRlbnRpZmllclRvTmFtZShpZGVudGlmaWVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydElkZW50aWZpZXJUb05hbWUoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5jb252ZXJ0SWRlbnRpZmllclRvTmFtZShpZGVudGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICovCi0JPFQgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdD4gVCBzZWxlY3REYXRhYmFzZU9iamVjdE5hbWVkKEl0ZXJhYmxlPFQ+IGRhdGFiYXNlT2JqZWN0cywgU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChUIGRiT2JqZWN0IDogZGF0YWJhc2VPYmplY3RzKSB7Ci0JCQlpZiAoZGJPYmplY3QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBkYk9iamVjdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBFeGFtcGxlczo8dWw+Ci0JICogPGxpPk9yYWNsZSBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoRk9PKSB2cy4gIkZvbyIgPT4gbnVsbAotCSAqICAgICA8bGk+VGFibGUoQkFSKSB2cy4gIkZvbyIgPT4gIkJBUiIKLQkgKiAgICAgPGxpPlRhYmxlKEZvbykgdnMuICJGb28iID0+ICJcIkZvb1wiIgotCSAqICAgICA8bGk+VGFibGUoQmFyKSB2cy4gIkZvbyIgPT4gIlwiQmFyXCIiCi0JICogPC9jb2RlPjwvdWw+Ci0JICogPGxpPlBvc3RncmVTUUwgZXRjLjx1bD48Y29kZT4KLQkgKiAgICAgPGxpPlRhYmxlKGZvbykgdnMuICJGb28iID0+IG51bGwKLQkgKiAgICAgPGxpPlRhYmxlKGJhcikgdnMuICJGb28iID0+ICJiYXIiCi0JICogICAgIDxsaT5UYWJsZShGb28pIHZzLiAiRm9vIiA9PiAiXCJGb29cIiIKLQkgKiAgICAgPGxpPlRhYmxlKEJhcikgdnMuICJGb28iID0+ICJcIkJhclwiIgotCSAqIDwvY29kZT48L3VsPgotCSAqIDxsaT5TUUwgU2VydmVyIGV0Yy48dWw+PGNvZGU+Ci0JICogICAgIDxsaT5UYWJsZShGb28pIHZzLiAiRm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5UYWJsZShmb28pIHZzLiAiRm9vIiA9PiAiZm9vIgotCSAqICAgICA8bGk+VGFibGUoYmFyKSB2cy4gIkZvbyIgPT4gImJhciIKLQkgKiAgICAgPGxpPlRhYmxlKEJhcikgdnMuICJGb28iID0+ICJCYXIiCi0JICogPC9jb2RlPjwvdWw+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoU3RyaW5nIGRlZmF1bHROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuY29udmVydE5hbWVUb0lkZW50aWZpZXIodGhpcy5nZXROYW1lKCksIGRlZmF1bHROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGFtcGxlczo8dWw+Ci0JICogPGxpPk9yYWNsZSBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoRk9PKSA9PiAiRk9PIgotCSAqICAgICA8bGk+VGFibGUoRm9vKSA9PiAiXCJGb29cIiIKLQkgKiAgICAgPGxpPlRhYmxlKGZvbykgPT4gIlwiZm9vXCIiCi0JICogICAgIDxsaT5UYWJsZShmb28rKykgPT4gIlwiZm9vKytcIiIKLQkgKiAgICAgPGxpPlRhYmxlKGYibykgPT4gIlwiZlwiXCJvXCIiIChpLmUuICJmIiJvIikKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+UG9zdGdyZVNRTCBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoRk9PKSA9PiAiXCJGT09cIiIKLQkgKiAgICAgPGxpPlRhYmxlKEZvbykgPT4gIlwiRm9vXCIiCi0JICogICAgIDxsaT5UYWJsZShmb28pID0+ICJmb28iCi0JICogICAgIDxsaT5UYWJsZShmb28rKykgPT4gIlwiZm9vKytcIiIKLQkgKiAgICAgPGxpPlRhYmxlKGYibykgPT4gIlwiZlwiXCJvXCIiIChpLmUuICJmIiJvIikKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+U1FMIFNlcnZlciBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoRk9PKSA9PiAiRk9PIgotCSAqICAgICA8bGk+VGFibGUoRm9vKSA9PiAiRm9vIgotCSAqICAgICA8bGk+VGFibGUoZm9vKSA9PiAiZm9vIgotCSAqICAgICA8bGk+VGFibGUoZm9vKyspID0+ICJcImZvbysrXCIiCi0JICogICAgIDxsaT5UYWJsZShmIm8pID0+ICJcImZcIlwib1wiIiAoaS5lLiAiZiIibyIpCi0JICogPC9jb2RlPjwvdWw+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5jb252ZXJ0TmFtZVRvSWRlbnRpZmllcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmluZyB0byBEVFAgZGF0YWJhc2Ugb2JqZWN0ICoqKioqKioqKioKLQotCS8vIHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyAibGl2ZSIgYW5kIGhhcyBsaXN0ZW5lcnMKLQl2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewotCQl0aGlzLmNoZWNrTGlzdGVuZXIoKTsKLQkJUmVmcmVzaE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5BZGRMaXN0ZW5lcih0aGlzLmNhdGFsb2dPYmplY3QsIHRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyKTsKLQl9Ci0KLQkvLyB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgaXMgImxpdmUiIGFuZCBoYXMgbm8gbGlzdGVuZXJzCi0Jdm9pZCBzdG9wTGlzdGVuaW5nKCkgewotCQl0aGlzLmNoZWNrTGlzdGVuZXIoKTsKLSAgICAgICAgUmVmcmVzaE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcih0aGlzLmNhdGFsb2dPYmplY3QsIHRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tMaXN0ZW5lcigpIHsKLQkJaWYgKHRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRoZSBjYXRhbG9nIGxpc3RlbmVyIGlzIG51bGwiKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyMTg1NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUuZGVmaW5pdGlvbi5EYXRhYmFzZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uaW50ZXJuYWwuY29yZS5SREJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvci5WZW5kb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvci5WZW5kb3JSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotCi0vKioKLSAqIFdyYXAgYSBEVFAgRGF0YWJhc2UuCi0gKiA8cD4KLSAqIENhdGFsb2dzIHZzLiBTY2hlbWF0YTo8YnI+Ci0gKiBUeXBpY2FsbHksIGlmIGEgRFRQIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgImNhdGFsb2dzIiwKLSAqIG8uZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UjZ2V0Q2F0YWxvZ3MoKSB3aWxsIHJldHVybiBhCi0gKiBzaW5nbGUgY2F0YWxvZyB3aXRob3V0IGEgbmFtZSAoYWN0dWFsbHksIGl0J3MgYW4gZW1wdHkgc3RyaW5nKS4gVGhpcyBjYXRhbG9nCi0gKiB3aWxsIGNvbnRhaW4gYWxsIHRoZSBkYXRhYmFzZSdzIHNjaGVtYXRhLiBXZSB0cnkgdG8gaWdub3JlIHRoaXMgY2F0YWxvZyBhbmQKLSAqIHJldHVybiB0aGUgc2NoZW1hdGEgZnJvbSB0aGUgZGF0YWJhc2UgZGlyZWN0bHkuCi0gKiA8cD4KLSAqIENhdGFsb2cgTm90ZSAxOjxicj4KLSAqIEFzIG9mIEphbiAyMDA5LCB0aGUgRFRQIE15U1FMIGRyaXZlciBpcyBub3QgY29uc2lzdGVudCB3aXRoIHRoaXMgcGF0dGVybi4KLSAqIEEgRFRQIE15U1FMIGRhdGFiYXNlIGhhcyAqbm8qIGNhdGFsb2dzOyBpdCBob2xkcyBhIHNpbmdsZSBzY2hlbWEKLSAqIGRpcmVjdGx5LCBhbmQgdGhhdCBzY2hlbWEgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGRhdGFiYXNlLiBTZWUgYnVnIDI0OTAxMy4KLSAqIDxwPgotICogQ2F0YWxvZyBOb3RlIDI6PGJyPgotICogQXMgb2YgSmFuIDIwMDksIHRoZSBQb3N0Z3JlU1FMIEpEQkMgZHJpdmVyIGNvbXBsaWNhdGVzIHRoaXMgcGF0dGVybiBhIGJpdC4KLSAqIEV2ZW4gdGhvdWdoIFBvc3RncmVTUUwgZG9lcyBub3Qgc3VwcG9ydCAiY2F0YWxvZ3MiLCBpdHMgSkRCQyBkcml2ZXIKLSAqIHJldHVybnMgYSBzaW5nbGUgY2F0YWxvZyB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBkYXRhYmFzZSBzcGVjaWZpZWQKLSAqIGluIHRoZSBKREJDIGNvbm5lY3Rpb24gVVJMLiBUaGUgRFRQIFBvc3RncmVTUUwgZHJpdmVyIHNpbXBseSByZXBsaWNhdGVzIHRoaXMKLSAqIGJlaGF2aW9yLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGNhdGFsb2cgY2FuIGJlIHVubmFtZWQ7IGkuZS4gaXRzIG5hbWUgaXMgYW4KLSAqIGVtcHR5IHN0cmluZy4uLi4KLSAqIDxwPgotICogKFlldCBBbm90aGVyKSBOb3RlOjxicj4KLSAqIFdlIHVzZSAibmFtZSIgd2hlbiBkZWFsaW5nIHdpdGggdGhlIHVubW9kaWZpZWQgbmFtZSBvZiBhIGRhdGFiYXNlIG9iamVjdAotICogYXMgc3VwcGxpZWQgYnkgdGhlIGRhdGFiYXNlIGl0c2VsZiAoaS5lLiBpdCBpcyBub3QgZGVsaW1pdGVkIGFuZCBpdCBpcyBhbHdheXMKLSAqIGNhc2Utc2Vuc2l0aXZlKS4KLSAqIFdlIHVzZSAiaWRlbnRpZmllciIgd2hlbiBkZWFsaW5nIHdpdGggYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBkYXRhYmFzZQotICogb2JqZWN0IG5hbWUgKGkuZS4gaXQgbWF5IGJlIGRlbGltaXRlZCBhbmQsIGRlcGVuZGluZyBvbiB0aGUgdmVuZG9yLCBpdCBtYXkKLSAqIGJlIGNhc2UtaW5zZW5zaXRpdmUpLgotICovCi1maW5hbCBjbGFzcyBEVFBEYXRhYmFzZVdyYXBwZXIKLQlleHRlbmRzIERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIERhdGFiYXNlCi17Ci0JLyoqIHRoZSB3cmFwcGVkIERUUCBkYXRhYmFzZSAqLwotCXByaXZhdGUgZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGR0cERhdGFiYXNlOwotCi0JLyoqIHZlbmRvci1zcGVjaWZpYyBiZWhhdmlvciAqLwotCXByaXZhdGUgZmluYWwgVmVuZG9yIHZlbmRvcjsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkLCBzb3J0ZWQgKi8KLQlwcml2YXRlIERUUENhdGFsb2dXcmFwcGVyW10gY2F0YWxvZ3M7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQRGF0YWJhc2VXcmFwcGVyKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlciBjb25uZWN0aW9uUHJvZmlsZSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGR0cERhdGFiYXNlKSB7Ci0JCXN1cGVyKGNvbm5lY3Rpb25Qcm9maWxlLCBkdHBEYXRhYmFzZSk7Ci0JCXRoaXMuZHRwRGF0YWJhc2UgPSBkdHBEYXRhYmFzZTsKLQkJdGhpcy52ZW5kb3IgPSBWZW5kb3JSZXBvc2l0b3J5Lmluc3RhbmNlKCkuZ2V0VmVuZG9yKHRoaXMuZ2V0VmVuZG9yTmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKiBUT0RPCi0JICogV2UgbWlnaHQgd2FudCB0byBsaXN0ZW4gdG8gdGhlICJ2aXJ0dWFsIiBjYXRhbG9nOyBidXQgdGhhdCdzIHByb2JhYmx5Ci0JICogbm90IG5lY2Vzc2FyeSBzaW5jZSB0aGVyZSBpcyBubyBlYXN5IHdheSBmb3IgdGhlIHVzZXIgdG8gcmVmcmVzaCBpdAotCSAqIChpLmUuIGl0IGlzIG5vdCBkaXNwbGF5ZWQgaW4gdGhlIERUUCBVSSkuCi0JICovCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5kYXRhYmFzZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIERUUERhdGFiYXNlV3JhcHBlciBnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hPiBnZXREVFBTY2hlbWF0YSgpIHsKLQkJcmV0dXJuIHRoaXMudmVuZG9yLmdldFNjaGVtYXModGhpcy5kdHBEYXRhYmFzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWEob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWEpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2NoZW1hXyhkdHBTY2hlbWEpOwotCX0KLQotCURUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hRnJvbUNhdGFsb2dzKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKSB7Ci0JCXJldHVybiB0aGlzLmdldENhdGFsb2coZHRwU2NoZW1hLmdldENhdGFsb2coKSkuZ2V0U2NoZW1hXyhkdHBTY2hlbWEpOwotCX0KLQotCS8qKgotCSAqIHRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBhIHNjaGVtYSB3aGVuIHRoZSBkYXRhYmFzZSBpcyB0aGUgc2NoZW1hCi0JICogY29udGFpbmVyLCBzbyB3ZSBrbm93IHdlIGRvbid0IGhhdmUgYW55IGNhdGFsb2dzCi0JICovCi0JQE92ZXJyaWRlCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZV8oZHRwVGFibGUpOwotCX0KLQotCS8qKgotCSAqIHRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBhIGNhdGFsb2csIHNvIHdlIGtub3cgd2UgaGF2ZSBjYXRhbG9nczsKLQkgKiBpLmUuIHRoZSBzZWFyY2ggaGFzIHRvIGRlc2NlbmQgdGhyb3VnaCBjYXRhbG9ncywgdGhlbiB0byBzY2hlbWF0YQotCSAqLwotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZUZyb21DYXRhbG9ncyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZyhkdHBUYWJsZS5nZXRTY2hlbWEoKS5nZXRDYXRhbG9nKCkpLmdldFRhYmxlXyhkdHBUYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogdGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIGEgc2NoZW1hIHdoZW4gdGhlIGRhdGFiYXNlIGlzIHRoZSBzY2hlbWEKLQkgKiBjb250YWluZXIsIHNvIHdlIGtub3cgd2UgZG9uJ3QgaGF2ZSBhbnkgY2F0YWxvZ3MKLQkgKi8KLQlAT3ZlcnJpZGUKLQlEVFBDb2x1bW5XcmFwcGVyIGdldENvbHVtbihvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5fKGR0cENvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogdGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIGEgY2F0YWxvZywgc28gd2Uga25vdyB3ZSBoYXZlIGNhdGFsb2dzOwotCSAqIGkuZS4gdGhlIHNlYXJjaCBoYXMgdG8gZGVzY2VuZCB0aHJvdWdoIGNhdGFsb2dzLCB0aGVuIHRvIHNjaGVtYXRhCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW5Gcm9tQ2F0YWxvZ3Mob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZyhkdHBDb2x1bW4uZ2V0VGFibGUoKS5nZXRTY2hlbWEoKS5nZXRDYXRhbG9nKCkpLmdldENvbHVtbl8oZHRwQ29sdW1uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGF0YWJhc2VPYmplY3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBEYXRhYmFzZS5nZXROYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERhdGFiYXNlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0VmVuZG9yKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5kdHBEYXRhYmFzZS5nZXRWZXJzaW9uKCk7Ci0JfQotCi0JLy8gb3ZlcnJpZGUgdG8gbWFrZSBtZXRob2QgcHVibGljIHNpbmNlIGl0J3MgaW4gdGhlIERhdGFiYXNlIGludGVyZmFjZQotCUBPdmVycmlkZQotCXB1YmxpYyA8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIHNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcihJdGVyYWJsZTxUPiBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBzdXBlci5zZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIoZGF0YWJhc2VPYmplY3RzLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQkvLyAqKioqKiBjYXRhbG9ncwotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRoaXMudmVuZG9yLnN1cHBvcnRzQ2F0YWxvZ3ModGhpcy5kdHBEYXRhYmFzZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPENhdGFsb2c+IGdldENhdGFsb2dzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8Q2F0YWxvZz4odGhpcy5nZXRDYXRhbG9nQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxEVFBDYXRhbG9nV3JhcHBlcj4gZ2V0Q2F0YWxvZ1dyYXBwZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RFRQQ2F0YWxvZ1dyYXBwZXI+KHRoaXMuZ2V0Q2F0YWxvZ0FycmF5KCkpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIERUUENhdGFsb2dXcmFwcGVyW10gZ2V0Q2F0YWxvZ0FycmF5KCkgewotCQlpZiAodGhpcy5jYXRhbG9ncyA9PSBudWxsKSB7Ci0JCQl0aGlzLmNhdGFsb2dzID0gdGhpcy5idWlsZENhdGFsb2dBcnJheSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNhdGFsb2dzOwotCX0KLQotCXByaXZhdGUgRFRQQ2F0YWxvZ1dyYXBwZXJbXSBidWlsZENhdGFsb2dBcnJheSgpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZz4gZHRwQ2F0YWxvZ3MgPSB0aGlzLmdldERUUENhdGFsb2dzKCk7Ci0JCURUUENhdGFsb2dXcmFwcGVyW10gcmVzdWx0ID0gbmV3IERUUENhdGFsb2dXcmFwcGVyW2R0cENhdGFsb2dzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJcmVzdWx0W2ldID0gbmV3IERUUENhdGFsb2dXcmFwcGVyKHRoaXMsIGR0cENhdGFsb2dzLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nPiBnZXREVFBDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRoaXMudmVuZG9yLmdldENhdGFsb2dzKHRoaXMuZHRwRGF0YWJhc2UpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q2F0YWxvZ3NTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDYXRhbG9nQXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBjYXRhbG9nIGZvciB0aGUgc3BlY2lmaWVkIERUUCBjYXRhbG9nCi0JICovCi0JRFRQQ2F0YWxvZ1dyYXBwZXIgZ2V0Q2F0YWxvZyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBkdHBDYXRhbG9nKSB7Ci0JCWZvciAoRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZyA6IHRoaXMuZ2V0Q2F0YWxvZ0FycmF5KCkpIHsKLQkJCWlmIChjYXRhbG9nLndyYXBzKGR0cENhdGFsb2cpKSB7Ci0JCQkJcmV0dXJuIGNhdGFsb2c7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBEVFAgY2F0YWxvZzogIiArIGR0cENhdGFsb2cpOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZENhdGFsb2dOYW1lcygpIHsKLQkJLy8gdGhlIGNhdGFsb2dzIGFyZSBhbHJlYWR5IHNvcnRlZAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8RGF0YWJhc2VPYmplY3QsIFN0cmluZz4odGhpcy5nZXRDYXRhbG9nV3JhcHBlcnMoKSwgTkFNRV9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIERUUENhdGFsb2dXcmFwcGVyIGdldENhdGFsb2dOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3REYXRhYmFzZU9iamVjdE5hbWVkKHRoaXMuZ2V0Q2F0YWxvZ1dyYXBwZXJzKCksIG5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZENhdGFsb2dJZGVudGlmaWVycygpIHsKLQkJLy8gdGhlIGNhdGFsb2dzIGFyZSBhbHJlYWR5IHNvcnRlZAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8RGF0YWJhc2VPYmplY3QsIFN0cmluZz4odGhpcy5nZXRDYXRhbG9nV3JhcHBlcnMoKSwgSURFTlRJRklFUl9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIERUUENhdGFsb2dXcmFwcGVyIGdldENhdGFsb2dGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcih0aGlzLmdldENhdGFsb2dXcmFwcGVycygpLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIERUUENhdGFsb2dXcmFwcGVyIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDYXRhbG9nRm9yTmFtZXModGhpcy5nZXREZWZhdWx0Q2F0YWxvZ05hbWVzKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBnZXREZWZhdWx0Q2F0YWxvZ05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy52ZW5kb3IuZ2V0RGVmYXVsdENhdGFsb2dOYW1lcyh0aGlzLmR0cERhdGFiYXNlLCB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0VXNlck5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBjYXRhbG9nIGZvdW5kLgotCSAqLwotCXByaXZhdGUgRFRQQ2F0YWxvZ1dyYXBwZXIgZ2V0Q2F0YWxvZ0Zvck5hbWVzKEl0ZXJhYmxlPFN0cmluZz4gbmFtZXMpIHsKLQkJZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKSB7Ci0JCQlEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nTmFtZWQobmFtZSk7Ci0JCQlpZiAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGNhdGFsb2c7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgZmluZCBhIGRlZmF1bHQgY2F0YWxvZywgcmV0dXJuIGl0cyBpZGVudGlmaWVyOwotCSAqIG90aGVyd2lzZSwgcmV0dXJuIHRoZSBsYXN0IG5hbWUgb24gdGhlIGxpc3Qgb2YgZGVmYXVsdCBuYW1lcy4KLQkgKiAoU29tZSBkYXRhYmFzZXMgaGF2ZSBtdWx0aXBsZSBwb3NzaWJsZSBkZWZhdWx0IG5hbWVzLikKLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZ0lkZW50aWZpZXIoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gbmFtZXMgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nTmFtZXMoKTsKLQkJRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZ0Zvck5hbWVzKG5hbWVzKTsKLQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNhdGFsb2cuZ2V0SWRlbnRpZmllcigpOwotCQl9Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gbmFtZXMuaXRlcmF0b3IoKTsKLQkJcmV0dXJuIHN0cmVhbS5oYXNOZXh0KCkgPyB0aGlzLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKENvbGxlY3Rpb25Ub29scy5sYXN0KHN0cmVhbSkpIDogbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiBzY2hlbWF0YQotCi0JSXRlcmFibGU8U3RyaW5nPiBnZXREZWZhdWx0U2NoZW1hTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLnZlbmRvci5nZXREZWZhdWx0U2NoZW1hTmFtZXModGhpcy5kdHBEYXRhYmFzZSwgdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldFVzZXJOYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lcyB2cy4gaWRlbnRpZmllcnMgKioqKioqKioqKgotCi0JLy8gb3ZlcnJpZGUgdG8gbWFrZSBtZXRob2QgcHVibGljIHNpbmNlIGl0J3MgaW4gdGhlIERhdGFiYXNlIGludGVyZmFjZQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIERlbGVnYXRlIHRvIHRoZSB2ZW5kb3IuCi0JICovCi0JU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyXyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy52ZW5kb3IuY29udmVydE5hbWVUb0lkZW50aWZpZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogRGVsZWdhdGUgdG8gdGhlIHZlbmRvci4KLQkgKi8KLQlTdHJpbmcgY29udmVydElkZW50aWZpZXJUb05hbWVfKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLnZlbmRvci5jb252ZXJ0SWRlbnRpZmllclRvTmFtZShpZGVudGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgbmFtZSB0byBhbiBpZGVudGlmaWVyLiBSZXR1cm4gbnVsbCBpZiB0aGUgcmVzdWx0aW5nCi0JICogaWRlbnRpZmllciBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCBuYW1lLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgb2xkIGVudGl0eSBnZW5lcmF0aW9uIGNvZGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKLQkgKiBhIGdlbmVyYXRlZCBhbm5vdGF0aW9uIG11c3QgZXhwbGljaXRseSBpZGVudGlmeSBhIGRhdGFiYXNlIG9iamVjdAotCSAqIChlLmcuIGEgdGFibGUpIG9yIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCBhZGVxdWF0ZWx5IGlkZW50aWZpZXMgdGhlCi0JICogc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCAodGFraW5nIGludG8gY29uc2lkZXJhdGlvbiBjYXNlLXNlbnNpdGl2aXR5Ci0JICogYW5kIHNwZWNpYWwgY2hhcmFjdGVycykuCi0JICovCi0JLy8gVE9ETyBhZGQgdG8gZGF0YWJhc2UgaWRlbnRpZmllciBhZGFwdGVyPyBjdXJyZW50bHkgbm90IHVzZWQuLi4KLQlTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0TmFtZSkgewotCQlyZXR1cm4gdGhpcy52ZW5kb3IuY29udmVydE5hbWVUb0lkZW50aWZpZXIobmFtZSwgZGVmYXVsdE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCURhdGFiYXNlRGVmaW5pdGlvbiBnZXREVFBEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gUkRCQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGF0YWJhc2VEZWZpbml0aW9uUmVnaXN0cnkoKS5nZXREZWZpbml0aW9uKHRoaXMuZHRwRGF0YWJhc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5pbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RhcnRMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLmNhdGFsb2dzICE9IG51bGwpIHsKLQkJCXRoaXMuc3RhcnRDYXRhbG9ncygpOwotCQl9Ci0JCXN1cGVyLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0Q2F0YWxvZ3MoKSB7Ci0JCWZvciAoRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZyA6IHRoaXMuY2F0YWxvZ3MpIHsKLQkJCWNhdGFsb2cuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLmNhdGFsb2dzICE9IG51bGwpIHsKLQkJCXRoaXMuc3RvcENhdGFsb2dzKCk7Ci0JCX0KLQkJc3VwZXIuc3RvcExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wQ2F0YWxvZ3MoKSB7Ci0JCWZvciAoRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZyA6IHRoaXMuY2F0YWxvZ3MpIHsKLQkJCWNhdGFsb2cuc3RvcExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsZWFyICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewotCQlpZiAodGhpcy5jYXRhbG9ncyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNsZWFyQ2F0YWxvZ3MoKTsKLQkJfQotCQlzdXBlci5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckNhdGFsb2dzKCkgewotCQl0aGlzLnN0b3BDYXRhbG9ncygpOwotCQlmb3IgKERUUENhdGFsb2dXcmFwcGVyIGNhdGFsb2cgOiB0aGlzLmNhdGFsb2dzKSB7Ci0JCQljYXRhbG9nLmNsZWFyKCk7Ci0JCX0KLQkJdGhpcy5jYXRhbG9ncyA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBGb3JlaWduS2V5V3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRm9yZWlnbktleVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzYTBmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBGb3JlaWduS2V5V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIEZvcmVpZ25LZXkKLSAqLwotZmluYWwgY2xhc3MgRFRQRm9yZWlnbktleVdyYXBwZXIKLQlleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlcgotCWltcGxlbWVudHMgRm9yZWlnbktleQotewotCS8qKiB0aGUgd3JhcHBlZCBEVFAgZm9yZWlnbiBrZXkgKi8KLQlwcml2YXRlIGZpbmFsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmNvbnN0cmFpbnRzLkZvcmVpZ25LZXkgZHRwRm9yZWlnbktleTsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkICovCi0JcHJpdmF0ZSBEVFBUYWJsZVdyYXBwZXIgcmVmZXJlbmNlZFRhYmxlOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQgKi8KLQlwcml2YXRlIExvY2FsQ29sdW1uUGFpcltdIGNvbHVtblBhaXJzOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQgLSBidXQgaXQgY2FuIGJlICdudWxsJyBzbyB3ZSB1c2UgYSBmbGFnICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdEF0dHJpYnV0ZU5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRBdHRyaWJ1dGVOYW1lQ2FsY3VsYXRlZCA9IGZhbHNlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUEZvcmVpZ25LZXlXcmFwcGVyKERUUFRhYmxlV3JhcHBlciBiYXNlVGFibGUsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmNvbnN0cmFpbnRzLkZvcmVpZ25LZXkgZHRwRm9yZWlnbktleSkgewotCQlzdXBlcihiYXNlVGFibGUsIGR0cEZvcmVpZ25LZXkpOwotCQl0aGlzLmR0cEZvcmVpZ25LZXkgPSBkdHBGb3JlaWduS2V5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQlzdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuZm9yZWlnbktleUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5nZXROYW1lKCkgKyAiOiAiICsgQXJyYXlzLmFzTGlzdCh0aGlzLmdldENvbHVtblBhaXJBcnJheSgpKSk7ICAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvLyAqKioqKioqKioqIEZvcmVpZ25LZXkgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBGb3JlaWduS2V5LmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgRFRQVGFibGVXcmFwcGVyIGdldEJhc2VUYWJsZSgpIHsKLQkJcmV0dXJuIChEVFBUYWJsZVdyYXBwZXIpIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBEVFBUYWJsZVdyYXBwZXIgZ2V0UmVmZXJlbmNlZFRhYmxlKCkgewotCQlpZiAodGhpcy5yZWZlcmVuY2VkVGFibGUgPT0gbnVsbCkgewotCQkJdGhpcy5yZWZlcmVuY2VkVGFibGUgPSB0aGlzLmdldEJhc2VUYWJsZSgpLmdldFRhYmxlKHRoaXMuZHRwRm9yZWlnbktleS5nZXRVbmlxdWVDb25zdHJhaW50KCkuZ2V0QmFzZVRhYmxlKCkpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRUYWJsZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VzU2luZ2xlQ29sdW1uUHJpbWFyeUtleSgpIHsKLQkJaWYgKHRoaXMuZ2V0Q29sdW1uUGFpcnNTaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICh0aGlzLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5QYWlyKCkuZ2V0UmVmZXJlbmNlZENvbHVtbigpID09IHRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCX0KLQotCS8vICoqKioqIGNvbHVtbiBwYWlycwotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtblBhaXI+IGdldENvbHVtblBhaXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8Q29sdW1uUGFpcj4odGhpcy5nZXRDb2x1bW5QYWlyQXJyYXkoKSk7Ci0JfQotCi0JcHVibGljIExvY2FsQ29sdW1uUGFpciBnZXRDb2x1bW5QYWlyKCkgewotCQlMb2NhbENvbHVtblBhaXJbXSBwYWlycyA9IHRoaXMuZ2V0Q29sdW1uUGFpckFycmF5KCk7Ci0JCWlmIChwYWlycy5sZW5ndGggIT0gMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibXVsdGlwbGUgY29sdW1uIHBhaXJzOiAiICsgcGFpcnMubGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcGFpcnNbMF07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxMb2NhbENvbHVtblBhaXI+IGdldExvY2FsQ29sdW1uUGFpcnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxMb2NhbENvbHVtblBhaXI+KHRoaXMuZ2V0Q29sdW1uUGFpckFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIExvY2FsQ29sdW1uUGFpcltdIGdldENvbHVtblBhaXJBcnJheSgpIHsKLQkJaWYgKHRoaXMuY29sdW1uUGFpcnMgPT0gbnVsbCkgewotCQkJdGhpcy5jb2x1bW5QYWlycyA9IHRoaXMuYnVpbGRDb2x1bW5QYWlyQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb2x1bW5QYWlyczsKLQl9Ci0KLQlwcml2YXRlIExvY2FsQ29sdW1uUGFpcltdIGJ1aWxkQ29sdW1uUGFpckFycmF5KCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IGJhc2VDb2x1bW5zID0gdGhpcy5nZXREVFBCYXNlQ29sdW1ucygpOwotCQlpbnQgc2l6ZSA9IGJhc2VDb2x1bW5zLnNpemUoKTsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiByZWZDb2x1bW5zID0gdGhpcy5nZXREVFBSZWZlcmVuY2VDb2x1bW5zKCk7Ci0JCWlmIChyZWZDb2x1bW5zLnNpemUoKSAhPSBzaXplKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHRoaXMuZ2V0QmFzZVRhYmxlKCkuZ2V0TmFtZSgpICsgJy4nICsgdGhpcy5nZXROYW1lKCkgKwotCQkJCQkJCQkiIC0gbWlzbWF0Y2hlZCBzaXplczogIiArIHNpemUgKyAiIHZzLiAiICsgcmVmQ29sdW1ucy5zaXplKCkpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCUxvY2FsQ29sdW1uUGFpcltdIHJlc3VsdCA9IG5ldyBMb2NhbENvbHVtblBhaXJbYmFzZUNvbHVtbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IGJhc2VDb2x1bW5zLnNpemUoKTsgaS0tID4gMDsgKSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgTG9jYWxDb2x1bW5QYWlyKAotCQkJCQkJCQl0aGlzLmdldEJhc2VUYWJsZSgpLmdldENvbHVtbihiYXNlQ29sdW1ucy5nZXQoaSkpLAotCQkJCQkJCQl0aGlzLmdldEJhc2VUYWJsZSgpLmdldENvbHVtbihyZWZDb2x1bW5zLmdldChpKSkKLQkJCQkJCSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIENvbHVtblBhaXIuQkFTRV9DT0xVTU5fQ09NUEFSQVRPUik7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBnZXREVFBCYXNlQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRm9yZWlnbktleS5nZXRNZW1iZXJzKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBnZXREVFBSZWZlcmVuY2VDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5kdHBGb3JlaWduS2V5LmdldFVuaXF1ZUNvbnN0cmFpbnQoKS5nZXRNZW1iZXJzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb2x1bW5QYWlyc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtblBhaXJBcnJheSgpLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8Q29sdW1uPiBnZXRCYXNlQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPExvY2FsQ29sdW1uUGFpciwgQ29sdW1uPih0aGlzLmdldExvY2FsQ29sdW1uUGFpcnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sdW1uIHRyYW5zZm9ybShMb2NhbENvbHVtblBhaXIgcGFpcikgewotCQkJCXJldHVybiBwYWlyLmdldEJhc2VDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlib29sZWFuIGJhc2VDb2x1bW5zQ29udGFpbnMoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0QmFzZUNvbHVtbnMoKSwgY29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8Q29sdW1uPiBnZXROb25QcmltYXJ5S2V5QmFzZUNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8Q29sdW1uPih0aGlzLmdldEJhc2VDb2x1bW5zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KENvbHVtbiBjb2x1bW4pIHsKLQkJCQlyZXR1cm4gISBjb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtbj4gZ2V0UmVmZXJlbmNlZENvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxMb2NhbENvbHVtblBhaXIsIENvbHVtbj4odGhpcy5nZXRMb2NhbENvbHVtblBhaXJzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbHVtbiB0cmFuc2Zvcm0oTG9jYWxDb2x1bW5QYWlyIGNvbHVtblBhaXIpIHsKLQkJCQlyZXR1cm4gY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKiogYXR0cmlidXRlIG5hbWUKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJU3RyaW5nIGRlZmF1bHROYW1lID0gdGhpcy5nZXREZWZhdWx0QXR0cmlidXRlTmFtZSgpOwotCQlyZXR1cm4gKGRlZmF1bHROYW1lICE9IG51bGwpID8gZGVmYXVsdE5hbWUgOiB0aGlzLmdldE5vbkRlZmF1bHRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RGVmYXVsdEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCWlmICggISB0aGlzLmRlZmF1bHRBdHRyaWJ1dGVOYW1lQ2FsY3VsYXRlZCkgewotCQkJdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwotCQkJdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZSA9IHRoaXMuYnVpbGREZWZhdWx0QXR0cmlidXRlTmFtZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRBdHRyaWJ1dGVOYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCWlmICggISB0aGlzLnJlZmVyZW5jZXNTaW5nbGVDb2x1bW5QcmltYXJ5S2V5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxvY2FsQ29sdW1uUGFpciBjb2x1bW5QYWlyID0gdGhpcy5nZXRDb2x1bW5QYWlyKCk7Ci0JCVN0cmluZyBiYXNlQ29sTmFtZSA9IGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHJlZkNvbE5hbWUgPSBjb2x1bW5QYWlyLmdldFJlZmVyZW5jZWRDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCWlmIChiYXNlQ29sTmFtZS5sZW5ndGgoKSA8PSAocmVmQ29sTmFtZS5sZW5ndGgoKSArIDEpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoICEgYmFzZUNvbE5hbWUuZW5kc1dpdGgocmVmQ29sTmFtZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWludCBfaW5kZXggPSBiYXNlQ29sTmFtZS5sZW5ndGgoKSAtIHJlZkNvbE5hbWUubGVuZ3RoKCkgLSAxOwotCQlpZiAoYmFzZUNvbE5hbWUuY2hhckF0KF9pbmRleCkgIT0gJ18nKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gYmFzZUNvbE5hbWUuc3Vic3RyaW5nKDAsIF9pbmRleCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBpcyBhIHNpbXBsZSAoc2luZ2xlLWNvbHVtbikgZm9yZWlnbiBrZXksIHVzZSB0aGUgbmFtZSBvZiB0aGUKLQkgKiBzaW5nbGUgYmFzZSBjb2x1bW4gdG8gYnVpbGQgYSBuYW1lLiBJZiB0aGlzIGlzIGEgY29tcG91bmQgZm9yZWlnbiBrZXksCi0JICogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIHRhYmxlLgotCSAqLwotCS8vIFRPRE8gaWYgdGhlcmUgaXMgb25seSBvbmUgRksgdG8gYSBnaXZlbiB0YWJsZSwgdXNlIHRoZSB0YWJsZSdzIG5hbWUgaW5zdGVhZCBvZiB0aGUgY29sdW1uJ3MgbmFtZT8KLQlwcml2YXRlIFN0cmluZyBnZXROb25EZWZhdWx0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldENvbHVtblBhaXJzU2l6ZSgpID09IDEpID8KLQkJCQkJCXRoaXMuZ2V0Tm9uRGVmYXVsdEF0dHJpYnV0ZU5hbWVGcm9tQmFzZUNvbHVtbigpIDoKLQkJCQkJCXRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB1bmRlcnNjb3JlIGNoZWNrIGlzIGhlbHBmdWwgd2hlbiB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gaXMgPGVtPm5vdDwvZW0+IHRoZQotCSAqIHByaW1hcnkga2V5IG9mIHRoZSByZWZlcmVuY2VkIHRhYmxlIChpLmUuIGl0IGhhcyBvbmx5IGEgPGVtPnVuaXF1ZTwvZW0+IGNvbnN0cmFpbnQpLgotCSAqIDxwcmU+Ci0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVfSUQgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEUiCi0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVJRCAgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEUiCi0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVfUEsgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEVfUEsiCi0JICogPC9wcmU+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Tm9uRGVmYXVsdEF0dHJpYnV0ZU5hbWVGcm9tQmFzZUNvbHVtbigpIHsKLQkJTG9jYWxDb2x1bW5QYWlyIGNvbHVtblBhaXIgPSB0aGlzLmdldENvbHVtblBhaXIoKTsKLQkJU3RyaW5nIGJhc2VDb2xOYW1lID0gY29sdW1uUGFpci5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgcmVmQ29sTmFtZSA9IGNvbHVtblBhaXIuZ2V0UmVmZXJlbmNlZENvbHVtbigpLmdldE5hbWUoKTsKLQkJaW50IGxlbiA9IGJhc2VDb2xOYW1lLmxlbmd0aCgpOwotCQlpbnQgcmVmTGVuID0gcmVmQ29sTmFtZS5sZW5ndGgoKTsKLQkJaWYgKChsZW4gPiByZWZMZW4pICYmIGJhc2VDb2xOYW1lLmVuZHNXaXRoKHJlZkNvbE5hbWUpKSB7Ci0JCQlsZW4gPSBsZW4gLSByZWZMZW47Ci0JCQlpZiAoKGxlbiA+IDEpICYmIGJhc2VDb2xOYW1lLmNoYXJBdChsZW4gLSAxKSA9PSAnXycpIHsKLQkJCQlsZW4gPSBsZW4gLSAxOwotCQkJfQotCQl9Ci0JCXJldHVybiBiYXNlQ29sTmFtZS5zdWJzdHJpbmcoMCwgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGFtcGxlczo8dWw+Ci0JICogPGxpPk9yYWNsZSBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGT09fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5Gb3JlaWduS2V5KEZPT19JRCA9PiBGT09fSUQpIHZzLiAiZm9vIiA9PiAiRk9PX0lEIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGT08gPT4gSUQpIHZzLiAiZm9vIiA9PiAiRk9PIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiAiXCJGb29fSURcIiIKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+UG9zdGdyZVNRTCBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+Rm9yZWlnbktleShmb29faWQgPT4gaWQpIHZzLiAiZm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5Gb3JlaWduS2V5KGZvb19pZCA9PiBmb29faWQpIHZzLiAiZm9vIiA9PiAiZm9vX2lkIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShmb28gPT4gaWQpIHZzLiAiZm9vIiA9PiAiZm9vIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiAiXCJGb29fSURcIiIKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+U1FMIFNlcnZlciBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+Rm9yZWlnbktleShmb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5Gb3JlaWduS2V5KEZPT19JRCA9PiBGT09fSUQpIHZzLiAiZm9vIiA9PiAiRk9PX0lEIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGT08gPT4gSUQpIHZzLiAiZm9vIiA9PiAiRk9PIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiAiRm9vX0lEIgotCSAqIDwvY29kZT48L3VsPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJU3RyaW5nIGJhc2VDb2x1bW5OYW1lID0gdGhpcy5nZXRDb2x1bW5QYWlyKCkuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJU3RyaW5nIGRlZmF1bHRCYXNlQ29sdW1uTmFtZSA9IGF0dHJpYnV0ZU5hbWUgKyAnXycgKyB0aGlzLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuY29udmVydE5hbWVUb0lkZW50aWZpZXIoYmFzZUNvbHVtbk5hbWUsIGRlZmF1bHRCYXNlQ29sdW1uTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JYm9vbGVhbiB3cmFwcyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRm9yZWlnbktleSA9PSBmb3JlaWduS2V5OwotCX0KLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewotCQkvLyB0aGUgZm9yZWlnbiBrZXkgZG9lcyBub3QgImNvbnRhaW4iIGFueSBvdGhlciBvYmplY3RzLAotCQkvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIGZvcndhcmQgdGhlICNjbGVhcigpCi0JCXRoaXMuZGVmYXVsdEF0dHJpYnV0ZU5hbWVDYWxjdWxhdGVkID0gZmFsc2U7Ci0JCXRoaXMuZGVmYXVsdEF0dHJpYnV0ZU5hbWUgPSBudWxsOwotCQl0aGlzLmNvbHVtblBhaXJzID0gIG51bGw7Ci0JCXRoaXMucmVmZXJlbmNlZFRhYmxlID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uIHBhaXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIExvY2FsQ29sdW1uUGFpciBpbXBsZW1lbnRzIENvbHVtblBhaXIgewotCQlwcml2YXRlIGZpbmFsIERUUENvbHVtbldyYXBwZXIgYmFzZUNvbHVtbjsKLQkJcHJpdmF0ZSBmaW5hbCBEVFBDb2x1bW5XcmFwcGVyIHJlZmVyZW5jZWRDb2x1bW47Ci0KLQkJTG9jYWxDb2x1bW5QYWlyKERUUENvbHVtbldyYXBwZXIgYmFzZUNvbHVtbiwgRFRQQ29sdW1uV3JhcHBlciByZWZlcmVuY2VkQ29sdW1uKSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKChiYXNlQ29sdW1uID09IG51bGwpIHx8IChyZWZlcmVuY2VkQ29sdW1uID09IG51bGwpKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmJhc2VDb2x1bW4gPSBiYXNlQ29sdW1uOwotCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uID0gcmVmZXJlbmNlZENvbHVtbjsKLQkJfQotCi0JCXB1YmxpYyBEVFBDb2x1bW5XcmFwcGVyIGdldEJhc2VDb2x1bW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5iYXNlQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIERUUENvbHVtbldyYXBwZXIgZ2V0UmVmZXJlbmNlZENvbHVtbigpIHsKLQkJCXJldHVybiB0aGlzLnJlZmVyZW5jZWRDb2x1bW47Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYmFzZUNvbHVtbi5nZXROYW1lKCkgKyAiPT4iICsgdGhpcy5yZWZlcmVuY2VkQ29sdW1uLmdldE5hbWUoKSk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGY1ZDY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotLyoqCi0gKiBDb2FsZXNjZSBiZWhhdmlvciBmb3IgYSBzY2hlbWEgY29udGFpbmVyIChpLmUuIGRhdGFiYXNlIG9yIGNhdGFsb2cpLgotICovCi1hYnN0cmFjdCBjbGFzcyBEVFBTY2hlbWFDb250YWluZXJXcmFwcGVyCi0JZXh0ZW5kcyBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIKLQlpbXBsZW1lbnRzIFNjaGVtYUNvbnRhaW5lcgotewotCS8qKiBsYXp5LWluaXRpYWxpemVkICovCi0JcHJpdmF0ZSBEVFBTY2hlbWFXcmFwcGVyW10gc2NoZW1hdGE7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcihEVFBEYXRhYmFzZU9iamVjdCBwYXJlbnQsIE9iamVjdCBkdHBTY2hlbWFDb250YWluZXIpIHsKLQkJc3VwZXIocGFyZW50LCBkdHBTY2hlbWFDb250YWluZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQlzdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhYnN0cmFjdCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIHJldHVybiB0aGUgc2NoZW1hIGNvbnRhaW5lcidzIERUUCBzY2hlbWF0YQotCSAqLwotCWFic3RyYWN0IExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYT4gZ2V0RFRQU2NoZW1hdGEoKTsKLQotCS8qKgotCSAqIHJldHVybiB0aGUgc2NoZW1hIGZvciB0aGUgc3BlY2lmaWVkIERUUCBzY2hlbWEKLQkgKi8KLQlhYnN0cmFjdCBEVFBTY2hlbWFXcmFwcGVyIGdldFNjaGVtYShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGR0cFNjaGVtYSk7Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIHNjaGVtYSBjb250YWluZXIgKGRhdGFiYXNlIG9yIGNhdGFsb2cpIGNvbnRhaW5zCi0JICogdGhlIHNwZWNpZmllZCBzY2hlbWEKLQkgKi8KLQlEVFBTY2hlbWFXcmFwcGVyIGdldFNjaGVtYV8ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWEpIHsKLQkJZm9yIChEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSA6IHRoaXMuZ2V0U2NoZW1hQXJyYXkoKSkgewotCQkJaWYgKHNjaGVtYS53cmFwcyhkdHBTY2hlbWEpKSB7Ci0JCQkJcmV0dXJuIHNjaGVtYTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIERUUCBzY2hlbWE6ICIgKyBkdHBTY2hlbWEpOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgRFRQIHRhYmxlOwotCSAqIHRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBhIHNjaGVtYSAodG8gaXRzIGNvbnRhaW5lcikKLQkgKi8KLQlhYnN0cmFjdCBEVFBUYWJsZVdyYXBwZXIgZ2V0VGFibGUob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKTsKLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgc2NoZW1hIGNvbnRhaW5lciBjb250YWlucyB0aGUgc3BlY2lmaWVkIHRhYmxlCi0JICovCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlXyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2NoZW1hXyhkdHBUYWJsZS5nZXRTY2hlbWEoKSkuZ2V0VGFibGVfKGR0cFRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGNvbHVtbiBmb3IgdGhlIHNwZWNpZmllZCBEVFAgY29sdW1uOwotCSAqIHRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBhIHNjaGVtYSAodG8gaXRzIGNvbnRhaW5lcikKLQkgKi8KLQlhYnN0cmFjdCBEVFBDb2x1bW5XcmFwcGVyIGdldENvbHVtbihvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbik7Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIHNjaGVtYSBjb250YWluZXIgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjb2x1bW4KLQkgKi8KLQlEVFBDb2x1bW5XcmFwcGVyIGdldENvbHVtbl8ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGVfKGR0cENvbHVtbi5nZXRUYWJsZSgpKS5nZXRDb2x1bW5fKGR0cENvbHVtbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNjaGVtYXRhICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxTY2hlbWE+IGdldFNjaGVtYXRhKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8U2NoZW1hPih0aGlzLmdldFNjaGVtYUFycmF5KCkpOwotCX0KLQotCUl0ZXJhYmxlPERUUFNjaGVtYVdyYXBwZXI+IGdldFNjaGVtYVdyYXBwZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RFRQU2NoZW1hV3JhcHBlcj4odGhpcy5nZXRTY2hlbWFBcnJheSgpKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgRFRQU2NoZW1hV3JhcHBlcltdIGdldFNjaGVtYUFycmF5KCkgewotCQlpZiAodGhpcy5zY2hlbWF0YSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNjaGVtYXRhID0gdGhpcy5idWlsZFNjaGVtYUFycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc2NoZW1hdGE7Ci0JfQotCi0JcHJpdmF0ZSBEVFBTY2hlbWFXcmFwcGVyW10gYnVpbGRTY2hlbWFBcnJheSgpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hPiBkdHBTY2hlbWF0YSA9IHRoaXMuZ2V0RFRQU2NoZW1hdGEoKTsKLQkJRFRQU2NoZW1hV3JhcHBlcltdIHJlc3VsdCA9IG5ldyBEVFBTY2hlbWFXcmFwcGVyW2R0cFNjaGVtYXRhLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCXJlc3VsdFtpXSA9IG5ldyBEVFBTY2hlbWFXcmFwcGVyKHRoaXMsIGR0cFNjaGVtYXRhLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JcHVibGljIGludCBnZXRTY2hlbWF0YVNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNjaGVtYUFycmF5KCkubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFNjaGVtYU5hbWVzKCkgewotCQkvLyB0aGUgc2NoZW1hdGEgYXJlIGFscmVhZHkgc29ydGVkCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPih0aGlzLmdldFNjaGVtYVdyYXBwZXJzKCksIE5BTUVfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBEVFBTY2hlbWFXcmFwcGVyIGdldFNjaGVtYU5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWQodGhpcy5nZXRTY2hlbWFXcmFwcGVycygpLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpIHsKLQkJLy8gdGhlIHNjaGVtYXRhIGFyZSBhbHJlYWR5IHNvcnRlZAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8RGF0YWJhc2VPYmplY3QsIFN0cmluZz4odGhpcy5nZXRTY2hlbWFXcmFwcGVycygpLCBJREVOVElGSUVSX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwdWJsaWMgRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWFGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcih0aGlzLmdldFNjaGVtYVdyYXBwZXJzKCksIGlkZW50aWZpZXIpOwotCX0KLQotCXB1YmxpYyBEVFBTY2hlbWFXcmFwcGVyIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNjaGVtYUZvck5hbWVzKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0U2NoZW1hTmFtZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBzY2hlbWEgZm91bmQuCi0JICovCi0JRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWFGb3JOYW1lcyhJdGVyYWJsZTxTdHJpbmc+IG5hbWVzKSB7Ci0JCWZvciAoU3RyaW5nIG5hbWUgOiBuYW1lcykgewotCQkJRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEgPSB0aGlzLmdldFNjaGVtYU5hbWVkKG5hbWUpOwotCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHNjaGVtYTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBmaW5kIGEgZGVmYXVsdCBzY2hlbWEsIHJldHVybiBpdHMgaWRlbnRpZmllcjsKLQkgKiBvdGhlcndpc2UsIHJldHVybiB0aGUgbGFzdCBuYW1lIG9uIHRoZSBsaXN0IG9mIGRlZmF1bHQgbmFtZXMuCi0JICogKFNvbWUgY29udGFpbmVycyBoYXZlIG11bHRpcGxlIHBvc3NpYmxlIGRlZmF1bHQgbmFtZXMuKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldERlZmF1bHRTY2hlbWFJZGVudGlmaWVyKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IG5hbWVzID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldERlZmF1bHRTY2hlbWFOYW1lcygpOwotCQlEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hRm9yTmFtZXMobmFtZXMpOwotCQkvLyBhc3N1bWUgJ25hbWVzJyBpcyBub24tZW1wdHkgKCEpCi0JCXJldHVybiAoc2NoZW1hICE9IG51bGwpID8KLQkJCQlzY2hlbWEuZ2V0SWRlbnRpZmllcigpIDoKLQkJCQl0aGlzLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKENvbGxlY3Rpb25Ub29scy5sYXN0KG5hbWVzKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdGFydExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuc2NoZW1hdGEgIT0gbnVsbCkgewotCQkJdGhpcy5zdGFydFNjaGVtYXRhKCk7Ci0JCX0KLQkJc3VwZXIuc3RhcnRMaXN0ZW5pbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRTY2hlbWF0YSgpIHsKLQkJZm9yIChEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSA6IHRoaXMuc2NoZW1hdGEpIHsKLQkJCXNjaGVtYS5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuc2NoZW1hdGEgIT0gbnVsbCkgewotCQkJdGhpcy5zdG9wU2NoZW1hdGEoKTsKLQkJfQotCQlzdXBlci5zdG9wTGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BTY2hlbWF0YSgpIHsKLQkJZm9yIChEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSA6IHRoaXMuc2NoZW1hdGEpIHsKLQkJCXNjaGVtYS5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xlYXIgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7Ci0JCWlmICh0aGlzLnNjaGVtYXRhICE9IG51bGwpIHsKLQkJCXRoaXMuY2xlYXJTY2hlbWF0YSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyU2NoZW1hdGEoKSB7Ci0JCXRoaXMuc3RvcFNjaGVtYXRhKCk7Ci0JCWZvciAoRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEgOiB0aGlzLnNjaGVtYXRhKSB7Ci0JCQlzY2hlbWEuY2xlYXIoKTsKLQkJfQotCQl0aGlzLnNjaGVtYXRhID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFNjaGVtYVdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFNjaGVtYVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxYTYxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBTY2hlbWFXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuU1FMVGFibGVzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci0KLS8qKgotICogIFdyYXAgYSBEVFAgU2NoZW1hCi0gKi8KLWZpbmFsIGNsYXNzIERUUFNjaGVtYVdyYXBwZXIKLQlleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlcgotCWltcGxlbWVudHMgU2NoZW1hCi17Ci0JLyoqIHRoZSB3cmFwcGVkIERUUCBzY2hlbWEgKi8KLQlwcml2YXRlIGZpbmFsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQgKi8KLQlwcml2YXRlIERUUFRhYmxlV3JhcHBlcltdIHRhYmxlczsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkICovCi0JcHJpdmF0ZSBEVFBTZXF1ZW5jZVdyYXBwZXJbXSBzZXF1ZW5jZXM7Ci0KLQkKLQkvLyAqKioqKioqKioqIGNvbnN0YW50cyAqKioqKioqKioqCi0JCi0JLyoqIHVzZWQgZm9yIGFkb3B0ZXIgcHJvZHVjdCBjdXN0b21pemF0aW9uICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfQU5EX1ZJRVdfVEFCTEVTX09OTFkgPSAic3VwcG9ydFBlcnNpc3RlbnRBbmRWaWV3VGFibGVzT25seSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBTY2hlbWFXcmFwcGVyKERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIgY29udGFpbmVyLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGR0cFNjaGVtYSkgewotCQlzdXBlcihjb250YWluZXIsIGR0cFNjaGVtYSk7Ci0JCXRoaXMuZHRwU2NoZW1hID0gZHRwU2NoZW1hOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQlzdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuc2NoZW1hQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU2NoZW1hIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2NoZW1hLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlciBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiAoRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcikgdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQkvLyAqKioqKiB0YWJsZXMKLQotCXB1YmxpYyBJdGVyYWJsZTxUYWJsZT4gZ2V0VGFibGVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8VGFibGU+KHRoaXMuZ2V0VGFibGVBcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPERUUFRhYmxlV3JhcHBlcj4gZ2V0VGFibGVXcmFwcGVycygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPERUUFRhYmxlV3JhcHBlcj4odGhpcy5nZXRUYWJsZUFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIERUUFRhYmxlV3JhcHBlcltdIGdldFRhYmxlQXJyYXkoKSB7Ci0JCWlmICh0aGlzLnRhYmxlcyA9PSBudWxsKSB7Ci0JCQl0aGlzLnRhYmxlcyA9IHRoaXMuYnVpbGRUYWJsZUFycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMudGFibGVzOwotCX0KLQotCXByaXZhdGUgRFRQVGFibGVXcmFwcGVyW10gYnVpbGRUYWJsZUFycmF5KCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gZHRwVGFibGVzID0gdGhpcy5nZXREVFBUYWJsZXMoKTsKLQkJRFRQVGFibGVXcmFwcGVyW10gcmVzdWx0ID0gbmV3IERUUFRhYmxlV3JhcHBlcltkdHBUYWJsZXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgRFRQVGFibGVXcmFwcGVyKHRoaXMsIGR0cFRhYmxlcy5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiBBcnJheVRvb2xzLnNvcnQocmVzdWx0LCBERUZBVUxUX0NPTVBBUkFUT1IpOwotCX0KLQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGU+IGdldERUUFRhYmxlcygpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGU+IGR0cFRhYmxlcyA9IHRoaXMuZ2V0RFRQVGFibGVzXygpOwotCQlyZXR1cm4gdGhpcy5oYWNrKCkgPyB0aGlzLmhhY2soZHRwVGFibGVzKSA6IGR0cFRhYmxlczsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gZ2V0RFRQVGFibGVzXygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2NoZW1hLmdldFRhYmxlcygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYWNrKCkgewotCQkvLyB0aGUgcHJvZHVjdCBpcyBudWxsIGR1cmluZyBqdW5pdCB0ZXN0aW5nCi0JCUlQcm9kdWN0IHByb2R1Y3QgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCk7Ci0JCVN0cmluZyBoYWNrID0gKHByb2R1Y3QgPT0gbnVsbCkgPyBudWxsIDogcHJvZHVjdC5nZXRQcm9wZXJ0eShQRVJTSVNURU5UX0FORF9WSUVXX1RBQkxFU19PTkxZKTsKLQkJcmV0dXJuIChoYWNrICE9IG51bGwpICYmIGhhY2suZXF1YWxzKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgRFRQIGV4dGVuZGVycyB0aGF0IHN1cHBvcnQgc3lub255bXMgYnV0IGRvbid0IHdhbnQgdG8gaGF2ZSB0aGVtIGFwcGVhcgotCS8vIGluIERhbGkgdG8gZmlsdGVyIG91dCB0aGVzZSB0YWJsZSB0eXBlcyBmcm9tIERhbGkgCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gaGFjayhMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gZHRwVGFibGVzKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4oKTsKLQkJZm9yIChvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUgOiBkdHBUYWJsZXMpIHsKLQkJCWlmICh0aGlzLmhhY2soZHRwVGFibGUpKSB7Ci0JCQkJcmVzdWx0LmFkZChkdHBUYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFjayhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJcmV0dXJuIFNRTFRhYmxlc1BhY2thZ2UuZUlOU1RBTkNFLmdldFBlcnNpc3RlbnRUYWJsZSgpLmlzU3VwZXJUeXBlT2YoZHRwVGFibGUuZUNsYXNzKCkpIHx8Ci0JCQkJCVNRTFRhYmxlc1BhY2thZ2UuZUlOU1RBTkNFLmdldFZpZXdUYWJsZSgpLmlzU3VwZXJUeXBlT2YoZHRwVGFibGUuZUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGVBcnJheSgpLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIERUUCB0YWJsZQotCSAqLwotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyhkdHBUYWJsZS5nZXRTY2hlbWEoKSkgPwotCQkJCQkJdGhpcy5nZXRUYWJsZV8oZHRwVGFibGUpIDoKLQkJCQkJCXRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0VGFibGUoZHRwVGFibGUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgc2NoZW1hIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgdGFibGUKLQkgKi8KLQlEVFBUYWJsZVdyYXBwZXIgZ2V0VGFibGVfKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQlmb3IgKERUUFRhYmxlV3JhcHBlciB0YWJsZSA6IHRoaXMuZ2V0VGFibGVBcnJheSgpKSB7Ci0JCQlpZiAodGFibGUud3JhcHMoZHRwVGFibGUpKSB7Ci0JCQkJcmV0dXJuIHRhYmxlOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgRFRQIHRhYmxlOiAiICsgZHRwVGFibGUpOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBEVFBUYWJsZVdyYXBwZXIgZ2V0VGFibGVOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3REYXRhYmFzZU9iamVjdE5hbWVkKHRoaXMuZ2V0VGFibGVXcmFwcGVycygpLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRUYWJsZUlkZW50aWZpZXJzKCkgewotCQkvLyB0aGUgdGFibGVzIGFyZSBhbHJlYWR5IHNvcnRlZAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8RGF0YWJhc2VPYmplY3QsIFN0cmluZz4odGhpcy5nZXRUYWJsZVdyYXBwZXJzKCksIElERU5USUZJRVJfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBEVFBUYWJsZVdyYXBwZXIgZ2V0VGFibGVGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcih0aGlzLmdldFRhYmxlV3JhcHBlcnMoKSwgaWRlbnRpZmllcik7Ci0JfQotCi0JLy8gKioqKiogc2VxdWVuY2VzCi0KLQlwdWJsaWMgSXRlcmFibGU8U2VxdWVuY2U+IGdldFNlcXVlbmNlcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPFNlcXVlbmNlPih0aGlzLmdldFNlcXVlbmNlQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxEVFBTZXF1ZW5jZVdyYXBwZXI+IGdldFNlcXVlbmNlV3JhcHBlcnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxEVFBTZXF1ZW5jZVdyYXBwZXI+KHRoaXMuZ2V0U2VxdWVuY2VBcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBEVFBTZXF1ZW5jZVdyYXBwZXJbXSBnZXRTZXF1ZW5jZUFycmF5KCkgewotCQlpZiAodGhpcy5zZXF1ZW5jZXMgPT0gbnVsbCkgewotCQkJdGhpcy5zZXF1ZW5jZXMgPSB0aGlzLmJ1aWxkU2VxdWVuY2VBcnJheSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnNlcXVlbmNlczsKLQl9Ci0KLQlwcml2YXRlIERUUFNlcXVlbmNlV3JhcHBlcltdIGJ1aWxkU2VxdWVuY2VBcnJheSgpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2VxdWVuY2U+IGR0cFNlcXVlbmNlcyA9IHRoaXMuZ2V0RFRQU2VxdWVuY2VzKCk7Ci0JCURUUFNlcXVlbmNlV3JhcHBlcltdIHJlc3VsdCA9IG5ldyBEVFBTZXF1ZW5jZVdyYXBwZXJbZHRwU2VxdWVuY2VzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJcmVzdWx0W2ldID0gbmV3IERUUFNlcXVlbmNlV3JhcHBlcih0aGlzLCBkdHBTZXF1ZW5jZXMuZ2V0KGkpKTsKLQkJfQotCQlyZXR1cm4gQXJyYXlUb29scy5zb3J0KHJlc3VsdCwgREVGQVVMVF9DT01QQVJBVE9SKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TZXF1ZW5jZT4gZ2V0RFRQU2VxdWVuY2VzKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTY2hlbWEuZ2V0U2VxdWVuY2VzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZXF1ZW5jZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTZXF1ZW5jZUFycmF5KCkubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBEVFBTZXF1ZW5jZVdyYXBwZXIgZ2V0U2VxdWVuY2VOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3REYXRhYmFzZU9iamVjdE5hbWVkKHRoaXMuZ2V0U2VxdWVuY2VXcmFwcGVycygpLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRTZXF1ZW5jZUlkZW50aWZpZXJzKCkgewotCQkvLyB0aGUgc2VxdWVuY2VzIGFyZSBhbHJlYWR5IHNvcnRlZAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8RGF0YWJhc2VPYmplY3QsIFN0cmluZz4odGhpcy5nZXRTZXF1ZW5jZVdyYXBwZXJzKCksIElERU5USUZJRVJfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBEVFBTZXF1ZW5jZVdyYXBwZXIgZ2V0U2VxdWVuY2VGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcih0aGlzLmdldFNlcXVlbmNlV3JhcHBlcnMoKSwgaWRlbnRpZmllcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JYm9vbGVhbiB3cmFwcyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIHNjaGVtYSkgewotCQlyZXR1cm4gdGhpcy5kdHBTY2hlbWEgPT0gc2NoZW1hOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgY29sdW1uIGZvciB0aGUgc3BlY2lmaWVkIERUUCBjb2x1bW4KLQkgKi8KLQlEVFBDb2x1bW5XcmFwcGVyIGdldENvbHVtbihvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQkvLyB0cnkgdG8gc2hvcnQtY2lyY3VpdCB0aGUgc2VhcmNoCi0JCXJldHVybiB0aGlzLndyYXBzKGR0cENvbHVtbi5nZXRUYWJsZSgpLmdldFNjaGVtYSgpKSA/Ci0JCQkJCQl0aGlzLmdldENvbHVtbl8oZHRwQ29sdW1uKSA6Ci0JCQkJCQl0aGlzLmdldENvbnRhaW5lcigpLmdldENvbHVtbihkdHBDb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgc2NoZW1hIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY29sdW1uCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW5fKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlXyhkdHBDb2x1bW4uZ2V0VGFibGUoKSkuZ2V0Q29sdW1uXyhkdHBDb2x1bW4pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5pbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RhcnRMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLnNlcXVlbmNlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0U2VxdWVuY2VzKCk7Ci0JCX0KLQkJaWYgKHRoaXMudGFibGVzICE9IG51bGwpIHsKLQkJCXRoaXMuc3RhcnRUYWJsZXMoKTsKLQkJfQotCQlzdXBlci5zdGFydExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFNlcXVlbmNlcygpIHsKLQkJZm9yIChEVFBTZXF1ZW5jZVdyYXBwZXIgc2VxdWVuY2UgOiB0aGlzLnNlcXVlbmNlcykgewotCQkJc2VxdWVuY2Uuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFRhYmxlcygpIHsKLQkJZm9yIChEVFBUYWJsZVdyYXBwZXIgdGFibGUgOiB0aGlzLnRhYmxlcykgewotCQkJdGFibGUuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLnNlcXVlbmNlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0b3BTZXF1ZW5jZXMoKTsKLQkJfQotCQlpZiAodGhpcy50YWJsZXMgIT0gbnVsbCkgewotCQkJdGhpcy5zdG9wVGFibGVzKCk7Ci0JCX0KLQkJc3VwZXIuc3RvcExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wU2VxdWVuY2VzKCkgewotCQlmb3IgKERUUFNlcXVlbmNlV3JhcHBlciBzZXF1ZW5jZSA6IHRoaXMuc2VxdWVuY2VzKSB7Ci0JCQlzZXF1ZW5jZS5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcFRhYmxlcygpIHsKLQkJZm9yIChEVFBUYWJsZVdyYXBwZXIgdGFibGUgOiB0aGlzLnRhYmxlcykgewotCQkJdGFibGUuc3RvcExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsZWFyICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewotCQlpZiAodGhpcy5zZXF1ZW5jZXMgIT0gbnVsbCkgewotCQkJdGhpcy5jbGVhclNlcXVlbmNlcygpOwotCQl9Ci0JCWlmICh0aGlzLnRhYmxlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNsZWFyVGFibGVzKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJTZXF1ZW5jZXMoKSB7Ci0JCXRoaXMuc3RvcFNlcXVlbmNlcygpOwotCQlmb3IgKERUUFNlcXVlbmNlV3JhcHBlciBzZXF1ZW5jZSA6IHRoaXMuc2VxdWVuY2VzKSB7Ci0JCQlzZXF1ZW5jZS5jbGVhcigpOwotCQl9Ci0JCXRoaXMuc2VxdWVuY2VzID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJUYWJsZXMoKSB7Ci0JCXRoaXMuc3RvcFRhYmxlcygpOwotCQlmb3IgKERUUFRhYmxlV3JhcHBlciB0YWJsZSA6IHRoaXMudGFibGVzKSB7Ci0JCQl0YWJsZS5jbGVhcigpOwotCQl9Ci0JCXRoaXMudGFibGVzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBTZXF1ZW5jZVdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFNlcXVlbmNlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGUzZWRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFNlcXVlbmNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2VxdWVuY2U7Ci0KLS8qKgotICogIFdyYXAgYSBEVFAgU2VxdWVuY2UKLSAqLwotZmluYWwgY2xhc3MgRFRQU2VxdWVuY2VXcmFwcGVyCi0JZXh0ZW5kcyBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIKLQlpbXBsZW1lbnRzIFNlcXVlbmNlCi17Ci0JLyoqIHRoZSB3cmFwcGVkIERUUCBzZXF1ZW5jZSAqLwotCXByaXZhdGUgZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNlcXVlbmNlIGR0cFNlcXVlbmNlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUFNlcXVlbmNlV3JhcHBlcihEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNlcXVlbmNlIGR0cFNlcXVlbmNlKSB7Ci0JCXN1cGVyKHNjaGVtYSwgZHRwU2VxdWVuY2UpOwotCQl0aGlzLmR0cFNlcXVlbmNlID0gZHRwU2VxdWVuY2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5zZXF1ZW5jZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNlcXVlbmNlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2VxdWVuY2UuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBEVFBTY2hlbWFXcmFwcGVyIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuIChEVFBTY2hlbWFXcmFwcGVyKSB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNlcXVlbmNlIHNlcXVlbmNlKSB7Ci0JCXJldHVybiB0aGlzLmR0cFNlcXVlbmNlID09IHNlcXVlbmNlOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgY2xlYXIoKSB7Ci0JCS8vIG5vIHN0YXRlIHRvIGNsZWFyCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBUYWJsZVdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFRhYmxlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTA5Njc1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFRhYmxlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5QcmltYXJ5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5CYXNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci0KLS8qKgotICogIFdyYXAgYSBEVFAgVGFibGUKLSAqLwotZmluYWwgY2xhc3MgRFRQVGFibGVXcmFwcGVyCi0JZXh0ZW5kcyBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIKLQlpbXBsZW1lbnRzIFRhYmxlCi17Ci0JLyoqIHRoZSB3cmFwcGVkIERUUCB0YWJsZSAqLwotCXByaXZhdGUgZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQgKi8KLQlwcml2YXRlIERUUENvbHVtbldyYXBwZXJbXSBjb2x1bW5zOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQgKi8KLQlwcml2YXRlIERUUENvbHVtbldyYXBwZXJbXSBwcmltYXJ5S2V5Q29sdW1uczsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkICovCi0JcHJpdmF0ZSBEVFBGb3JlaWduS2V5V3JhcHBlcltdIGZvcmVpZ25LZXlzOwotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVFBDb2x1bW5XcmFwcGVyW10gRU1QVFlfQ09MVU1OUyA9IG5ldyBEVFBDb2x1bW5XcmFwcGVyWzBdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERUUEZvcmVpZ25LZXlXcmFwcGVyW10gRU1QVFlfRk9SRUlHTl9LRVlTID0gbmV3IERUUEZvcmVpZ25LZXlXcmFwcGVyWzBdOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUFRhYmxlV3JhcHBlcihEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKSB7Ci0JCXN1cGVyKHNjaGVtYSwgZHRwVGFibGUpOwotCQl0aGlzLmR0cFRhYmxlID0gZHRwVGFibGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS50YWJsZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwVGFibGUuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBEVFBTY2hlbWFXcmFwcGVyIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuIChEVFBTY2hlbWFXcmFwcGVyKSB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCS8vICoqKioqIGNvbHVtbnMKLQotCXB1YmxpYyBJdGVyYWJsZTxDb2x1bW4+IGdldENvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxDb2x1bW4+KHRoaXMuZ2V0Q29sdW1uQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxEVFBDb2x1bW5XcmFwcGVyPiBnZXRDb2x1bW5XcmFwcGVycygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPERUUENvbHVtbldyYXBwZXI+KHRoaXMuZ2V0Q29sdW1uQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRFRQQ29sdW1uV3JhcHBlcltdIGdldENvbHVtbkFycmF5KCkgewotCQlpZiAodGhpcy5jb2x1bW5zID09IG51bGwpIHsKLQkJCXRoaXMuY29sdW1ucyA9IHRoaXMuYnVpbGRDb2x1bW5BcnJheSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNvbHVtbnM7Ci0JfQotCi0JcHJpdmF0ZSBEVFBDb2x1bW5XcmFwcGVyW10gYnVpbGRDb2x1bW5BcnJheSgpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBkdHBDb2x1bW5zID0gdGhpcy5nZXREVFBDb2x1bW5zKCk7Ci0JCURUUENvbHVtbldyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQQ29sdW1uV3JhcHBlcltkdHBDb2x1bW5zLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJcmVzdWx0W2ldID0gbmV3IERUUENvbHVtbldyYXBwZXIodGhpcywgZHRwQ29sdW1ucy5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiBBcnJheVRvb2xzLnNvcnQocmVzdWx0LCBERUZBVUxUX0NPTVBBUkFUT1IpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gZ2V0RFRQQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwVGFibGUuZ2V0Q29sdW1ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbkFycmF5KCkubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBEVFBDb2x1bW5XcmFwcGVyIGdldENvbHVtbk5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWQodGhpcy5nZXRDb2x1bW5XcmFwcGVycygpLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGNvbHVtbiBmb3IgdGhlIHNwZWNpZmllZCBEVFAgY29sdW1uCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW4ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyhkdHBDb2x1bW4uZ2V0VGFibGUoKSkgPwotCQkJCQkJdGhpcy5nZXRDb2x1bW5fKGR0cENvbHVtbikgOgotCQkJCQkJdGhpcy5nZXRTY2hlbWEoKS5nZXRDb2x1bW4oZHRwQ29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIHRhYmxlIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY29sdW1uCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW5fKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCWZvciAoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4gOiB0aGlzLmdldENvbHVtbkFycmF5KCkpIHsKLQkJCWlmIChjb2x1bW4ud3JhcHMoZHRwQ29sdW1uKSkgewotCQkJCXJldHVybiBjb2x1bW47Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBEVFAgY29sdW1uOiAiICsgZHRwQ29sdW1uKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDb2x1bW5JZGVudGlmaWVycygpIHsKLQkJLy8gdGhlIGNvbHVtbnMgYXJlIGFscmVhZHkgc29ydGVkCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPih0aGlzLmdldENvbHVtbldyYXBwZXJzKCksIElERU5USUZJRVJfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBEVFBDb2x1bW5XcmFwcGVyIGdldENvbHVtbkZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3RGb3JJZGVudGlmaWVyKHRoaXMuZ2V0Q29sdW1uV3JhcHBlcnMoKSwgaWRlbnRpZmllcik7Ci0JfQotCi0JLy8gKioqKiogcHJpbWFyeUtleUNvbHVtbnMKLQotCXB1YmxpYyBJdGVyYWJsZTxDb2x1bW4+IGdldFByaW1hcnlLZXlDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8Q29sdW1uPih0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5BcnJheSgpKTsKLQl9Ci0KLQlwdWJsaWMgRFRQQ29sdW1uV3JhcHBlciBnZXRQcmltYXJ5S2V5Q29sdW1uKCkgewotCQlEVFBDb2x1bW5XcmFwcGVyW10gcGtDb2x1bW5zID0gdGhpcy5nZXRQcmltYXJ5S2V5Q29sdW1uQXJyYXkoKTsKLQkJaWYgKHBrQ29sdW1ucy5sZW5ndGggIT0gMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibXVsdGlwbGUgcHJpbWFyeSBrZXkgY29sdW1uczogIiArIHBrQ29sdW1ucy5sZW5ndGgpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBwa0NvbHVtbnNbMF07Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRFRQQ29sdW1uV3JhcHBlcltdIGdldFByaW1hcnlLZXlDb2x1bW5BcnJheSgpIHsKLQkJaWYgKHRoaXMucHJpbWFyeUtleUNvbHVtbnMgPT0gbnVsbCkgewotCQkJdGhpcy5wcmltYXJ5S2V5Q29sdW1ucyA9IHRoaXMuYnVpbGRQcmltYXJ5S2V5Q29sdW1uQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5wcmltYXJ5S2V5Q29sdW1uczsKLQl9Ci0KLQlwcml2YXRlIERUUENvbHVtbldyYXBwZXJbXSBidWlsZFByaW1hcnlLZXlDb2x1bW5BcnJheSgpIHsKLQkJaWYgKCAhICh0aGlzLmR0cFRhYmxlIGluc3RhbmNlb2YgQmFzZVRhYmxlKSkgewotCQkJcmV0dXJuIEVNUFRZX0NPTFVNTlM7Ci0JCX0KLQkJUHJpbWFyeUtleSBwayA9ICgoQmFzZVRhYmxlKSB0aGlzLmR0cFRhYmxlKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCWlmIChwayA9PSBudWxsKSB7Ci0JCQkvLyBubyBQSyB3YXMgZGVmaW5lZAotCQkJcmV0dXJuIEVNUFRZX0NPTFVNTlM7Ci0JCX0KLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBwa0NvbHVtbnMgPSB0aGlzLmdldENvbHVtbnMocGspOwotCQlEVFBDb2x1bW5XcmFwcGVyW10gcmVzdWx0ID0gbmV3IERUUENvbHVtbldyYXBwZXJbcGtDb2x1bW5zLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJcmVzdWx0W2ldID0gdGhpcy5nZXRDb2x1bW4ocGtDb2x1bW5zLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IGdldENvbHVtbnMoUHJpbWFyeUtleSBwaykgewotCQlyZXR1cm4gcGsuZ2V0TWVtYmVycygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcmltYXJ5S2V5Q29sdW1uQXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JYm9vbGVhbiBwcmltYXJ5S2V5Q29sdW1uc0NvbnRhaW5zKENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuY29udGFpbnModGhpcy5nZXRQcmltYXJ5S2V5Q29sdW1uQXJyYXkoKSwgY29sdW1uKTsKLQl9Ci0KLQkvLyAqKioqKiBmb3JlaWduS2V5cwotCi0JcHVibGljIEl0ZXJhYmxlPEZvcmVpZ25LZXk+IGdldEZvcmVpZ25LZXlzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8Rm9yZWlnbktleT4odGhpcy5nZXRGb3JlaWduS2V5QXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRFRQRm9yZWlnbktleVdyYXBwZXJbXSBnZXRGb3JlaWduS2V5QXJyYXkoKSB7Ci0JCWlmICh0aGlzLmZvcmVpZ25LZXlzID09IG51bGwpIHsKLQkJCXRoaXMuZm9yZWlnbktleXMgPSB0aGlzLmJ1aWxkRm9yZWlnbktleUFycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZm9yZWlnbktleXM7Ci0JfQotCi0JcHJpdmF0ZSBEVFBGb3JlaWduS2V5V3JhcHBlcltdIGJ1aWxkRm9yZWlnbktleUFycmF5KCkgewotCQlpZiAoICEgKHRoaXMuZHRwVGFibGUgaW5zdGFuY2VvZiBCYXNlVGFibGUpKSB7Ci0JCQlyZXR1cm4gRU1QVFlfRk9SRUlHTl9LRVlTOwotCQl9Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuRm9yZWlnbktleT4gZHRwRm9yZWlnbktleXMgPSB0aGlzLmdldERUUEZvcmVpZ25LZXlzKCk7Ci0JCURUUEZvcmVpZ25LZXlXcmFwcGVyW10gcmVzdWx0ID0gbmV3IERUUEZvcmVpZ25LZXlXcmFwcGVyW2R0cEZvcmVpZ25LZXlzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJcmVzdWx0W2ldID0gbmV3IERUUEZvcmVpZ25LZXlXcmFwcGVyKHRoaXMsIGR0cEZvcmVpZ25LZXlzLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuRm9yZWlnbktleT4gZ2V0RFRQRm9yZWlnbktleXMoKSB7Ci0JCXJldHVybiAoKEJhc2VUYWJsZSkgdGhpcy5kdHBUYWJsZSkuZ2V0Rm9yZWlnbktleXMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZvcmVpZ25LZXlzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Rm9yZWlnbktleUFycmF5KCkubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sdW1uIGlzIGEgYmFzZSBjb2x1bW4gZm9yIGF0IGxlYXN0IG9uZQotCSAqIG9mIHRoZSB0aGUgdGFibGUncyBmb3JlaWduIGtleXMKLQkgKi8KLQlib29sZWFuIGZvcmVpZ25LZXlCYXNlQ29sdW1uc0NvbnRhaW5zKENvbHVtbiBjb2x1bW4pIHsKLQkJZm9yIChEVFBGb3JlaWduS2V5V3JhcHBlciBma1dyYXBwZXIgOiB0aGlzLmdldEZvcmVpZ25LZXlBcnJheSgpKSB7Ci0JCQlpZiAoZmtXcmFwcGVyLmJhc2VDb2x1bW5zQ29udGFpbnMoY29sdW1uKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAqKioqKiBqb2luIHRhYmxlCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1Bvc3NpYmxlSm9pblRhYmxlKCkgewotCQlpZiAodGhpcy5nZXRGb3JlaWduS2V5QXJyYXkoKS5sZW5ndGggIT0gMikgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIHRhYmxlIG11c3QgaGF2ZSBleGFjdGx5IDIgZm9yZWlnbiBrZXlzCi0JCX0KLQkJZm9yIChDb2x1bW4gY29sdW1uIDogdGhpcy5nZXRDb2x1bW5zKCkpIHsKLQkJCWlmICggISB0aGlzLmZvcmVpZ25LZXlCYXNlQ29sdW1uc0NvbnRhaW5zKGNvbHVtbikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBhbGwgdGhlIHRhYmxlJ3MgY29sdW1ucyBtdXN0IGJlbG9uZyB0byBvbmUgKG9yIGJvdGgpIG9mIHRoZSAyIGZvcmVpZ24ga2V5cwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSB0YWJsZSBuYW1lIGlzIDxjb2RlPkZPT19CQVI8L2NvZGU+Ci0JICogYW5kIGl0IGpvaW5zIHRhYmxlcyA8Y29kZT5GT088L2NvZGU+IGFuZCA8Y29kZT5CQVI8L2NvZGU+LAotCSAqIHJldHVybiB0aGUgZm9yZWlnbiBrZXkgdG8gPGNvZGU+Rk9PPC9jb2RlPjsKLQkgKiBpZiB0aGUgdGFibGUgbmFtZSBpcyA8Y29kZT5CQVJfRk9PPC9jb2RlPgotCSAqIGFuZCBpdCBqb2lucyB0YWJsZXMgPGNvZGU+Rk9PPC9jb2RlPiBhbmQgPGNvZGU+QkFSPC9jb2RlPiwKLQkgKiByZXR1cm4gdGhlIGZvcmVpZ24ga2V5IHRvIDxjb2RlPkJBUjwvY29kZT47Ci0JICogb3RoZXJ3aXNlIHNpbXBseSByZXR1cm4gdGhlIGZpcnN0IGZvcmVpZ24ga2V5IGluIHRoZSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgRm9yZWlnbktleSBnZXRKb2luVGFibGVPd25pbmdGb3JlaWduS2V5KCkgewotCQlGb3JlaWduS2V5IGZrMCA9IHRoaXMuZ2V0Rm9yZWlnbktleUFycmF5KClbMF07Ci0JCVN0cmluZyBuYW1lMCA9IGZrMC5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXROYW1lKCk7Ci0KLQkJRm9yZWlnbktleSBmazEgPSB0aGlzLmdldEZvcmVpZ25LZXlBcnJheSgpWzFdOwotCQlTdHJpbmcgbmFtZTEgPSBmazEuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpOwotCi0JCXJldHVybiB0aGlzLmdldE5hbWUoKS5lcXVhbHMobmFtZTEgKyAnXycgKyBuYW1lMCkgPyBmazEgOiBmazA7Ci0JfQotCi0JcHVibGljIEZvcmVpZ25LZXkgZ2V0Sm9pblRhYmxlTm9uT3duaW5nRm9yZWlnbktleSgpIHsKLQkJRm9yZWlnbktleSBmazAgPSB0aGlzLmdldEZvcmVpZ25LZXlBcnJheSgpWzBdOwotCQlGb3JlaWduS2V5IGZrMSA9IHRoaXMuZ2V0Rm9yZWlnbktleUFycmF5KClbMV07Ci0JCUZvcmVpZ25LZXkgb2ZrID0gdGhpcy5nZXRKb2luVGFibGVPd25pbmdGb3JlaWduS2V5KCk7Ci0JCXJldHVybiAob2ZrID09IGZrMCkgPyBmazEgOiBmazA7Ci0JfQotCi0JLyoqCi0JICogSG1tbS4uLi4KLQkgKiBXZSBtaWdodCB3YW50IHRvIGdvIHRvIHRoZSBwbGF0Zm9ybSB0byBhbGxvdyBhIHZlbmRvci1zcGVjaWZpYwotCSAqIGNvbXBhcmlzb24gaGVyZTsKLQkgKiBidXQsIHNpbmNlIGFsbCB0aGUgbmFtZXMgYXJlIGNvbWluZyBkaXJlY3RseSBmcm9tIHRoZSBkYXRhYmFzZQotCSAqIChpLmUuIHRoZXJlIGFyZSBubyBjb252ZXJzaW9ucyB0byBKYXZhIGlkZW50aWZpZXJzIGV0Yy4pLCBpdCBzZWVtcwotCSAqIGxpa2Ugd2UgY2FuIGp1c3QgY29tcGFyZSB0aGVtIGRpcmVjdGx5IGFuZCBpZ25vcmUgY2FzZS1zZW5zaXRpdml0eQotCSAqIGlzc3Vlcy4uLi4gIH5ianYKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBqb2luVGFibGVOYW1lSXNEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5nZXROYW1lKCkuZXF1YWxzKHRoaXMuYnVpbGREZWZhdWx0Sm9pblRhYmxlTmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERlZmF1bHRKb2luVGFibGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKb2luVGFibGVPd25pbmdUYWJsZSgpLmdldE5hbWUoKQotCQkJCQkrICdfJwotCQkJCQkrIHRoaXMuZ2V0Sm9pblRhYmxlTm9uT3duaW5nVGFibGUoKS5nZXROYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZSBnZXRKb2luVGFibGVPd25pbmdUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Sm9pblRhYmxlT3duaW5nRm9yZWlnbktleSgpLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCX0KLQotCXByaXZhdGUgVGFibGUgZ2V0Sm9pblRhYmxlTm9uT3duaW5nVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpvaW5UYWJsZU5vbk93bmluZ0ZvcmVpZ25LZXkoKS5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlib29sZWFuIHdyYXBzKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSB0YWJsZSkgewotCQlyZXR1cm4gdGhpcy5kdHBUYWJsZSA9PSB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIERUUCB0YWJsZQotCSAqLwotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgdGFibGUpIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyh0YWJsZSkgPyB0aGlzIDogdGhpcy5nZXRTY2hlbWEoKS5nZXRUYWJsZSh0YWJsZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdGFydExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleXMgIT0gbnVsbCkgewotCQkJdGhpcy5zdGFydEZvcmVpZ25LZXlzKCk7Ci0JCX0KLQkJaWYgKHRoaXMuY29sdW1ucyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0Q29sdW1ucygpOwotCQl9Ci0JCXN1cGVyLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0Rm9yZWlnbktleXMoKSB7Ci0JCWZvciAoRFRQRm9yZWlnbktleVdyYXBwZXIgZm9yZWlnbktleSA6IHRoaXMuZm9yZWlnbktleXMpIHsKLQkJCWZvcmVpZ25LZXkuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydENvbHVtbnMoKSB7Ci0JCWZvciAoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4gOiB0aGlzLmNvbHVtbnMpIHsKLQkJCWNvbHVtbi5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleXMgIT0gbnVsbCkgewotCQkJdGhpcy5zdG9wRm9yZWlnbktleXMoKTsKLQkJfQotCQlpZiAodGhpcy5jb2x1bW5zICE9IG51bGwpIHsKLQkJCXRoaXMuc3RvcENvbHVtbnMoKTsKLQkJfQotCQlzdXBlci5zdG9wTGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BGb3JlaWduS2V5cygpIHsKLQkJZm9yIChEVFBGb3JlaWduS2V5V3JhcHBlciBmb3JlaWduS2V5IDogdGhpcy5mb3JlaWduS2V5cykgewotCQkJZm9yZWlnbktleS5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcENvbHVtbnMoKSB7Ci0JCWZvciAoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4gOiB0aGlzLmNvbHVtbnMpIHsKLQkJCWNvbHVtbi5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xlYXIgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7Ci0JCWlmICh0aGlzLmZvcmVpZ25LZXlzICE9IG51bGwpIHsKLQkJCXRoaXMuY2xlYXJGb3JlaWduS2V5cygpOwotCQl9Ci0KLQkJLy8gdGhlIHRhYmxlIGRvZXMgbm90ICJjb250YWluIiB0aGUgcGsgY29sdW1ucywgc28gbm8gbmVlZCB0byBmb3J3YXJkICNjbGVhcigpCi0JCXRoaXMucHJpbWFyeUtleUNvbHVtbnMgPSBudWxsOwotCi0JCWlmICh0aGlzLmNvbHVtbnMgIT0gbnVsbCkgewotCQkJdGhpcy5jbGVhckNvbHVtbnMoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckZvcmVpZ25LZXlzKCkgewotCQl0aGlzLnN0b3BGb3JlaWduS2V5cygpOwotCQlmb3IgKERUUEZvcmVpZ25LZXlXcmFwcGVyIGZvcmVpZ25LZXkgOiB0aGlzLmZvcmVpZ25LZXlzKSB7Ci0JCQlmb3JlaWduS2V5LmNsZWFyKCk7Ci0JCX0KLSAgICAJdGhpcy5mb3JlaWduS2V5cyA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyQ29sdW1ucygpIHsKLQkJdGhpcy5zdG9wQ29sdW1ucygpOwotCQlmb3IgKERUUENvbHVtbldyYXBwZXIgY29sdW1uIDogdGhpcy5jb2x1bW5zKSB7Ci0JCQljb2x1bW4uY2xlYXIoKTsKLQkJfQotICAgIAl0aGlzLmNvbHVtbnMgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0Fic3RyYWN0VmVuZG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvQWJzdHJhY3RWZW5kb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJhMDhjMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvQWJzdHJhY3RWZW5kb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQ29uc29saWRhdGUgdGhlIGJlaGF2aW9yIGNvbW1vbiB0byB0aGUgdHlwaWNhbCB2ZW5kb3JzLgotICogCi0gKiBAc2VlIFVucmVjb2duaXplZFZlbmRvcgotICovCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZlbmRvcgotCWltcGxlbWVudHMgVmVuZG9yCi17Ci0JQWJzdHJhY3RWZW5kb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREVFBWZW5kb3JOYW1lKCk7Ci0KLQotCS8vICoqKioqKioqKiogY2F0YWxvZyBhbmQgc2NoZW1hIHN1cHBvcnQgKioqKioqKioqKgotCi0JYWJzdHJhY3QgQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpOwotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDYXRhbG9nU3RyYXRlZ3koKS5zdXBwb3J0c0NhdGFsb2dzKGRhdGFiYXNlKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxDYXRhbG9nPiBnZXRDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDYXRhbG9nU3RyYXRlZ3koKS5nZXRDYXRhbG9ncyhkYXRhYmFzZSk7Ci0JfQotCi0JcHVibGljIExpc3Q8U2NoZW1hPiBnZXRTY2hlbWFzKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRDYXRhbG9nU3RyYXRlZ3koKS5nZXRTY2hlbWFzKGRhdGFiYXNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidmVuZG9yOiAiICsgdGhpcywgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUeXBpY2FsbHksIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGNhdGFsb2cgaXMgdGhlIHVzZXIgbmFtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBnZXREZWZhdWx0Q2F0YWxvZ05hbWVzKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUpIHsKLQkJaWYgKCAhIHRoaXMuc3VwcG9ydHNDYXRhbG9ncyhkYXRhYmFzZSkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQlBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLmFkZERlZmF1bHRDYXRhbG9nTmFtZXNUbyhkYXRhYmFzZSwgdXNlck5hbWUsIG5hbWVzKTsKLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCS8qKgotCSAqIFNlZSBjb21tZW50IGF0Ci0JICoge0BsaW5rICNhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhEYXRhYmFzZSwgU3RyaW5nLCBBcnJheUxpc3QpfS4KLQkgKi8KLQl2b2lkIGFkZERlZmF1bHRDYXRhbG9nTmFtZXNUbyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSwgQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMpIHsKLQkJbmFtZXMuYWRkKHRoaXMuY29udmVydElkZW50aWZpZXJUb05hbWUodXNlck5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBUeXBpY2FsbHksIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHNjaGVtYSBpcyB0aGUgdXNlciBuYW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IGdldERlZmF1bHRTY2hlbWFOYW1lcyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkRGVmYXVsdFNjaGVtYU5hbWVzVG8oZGF0YWJhc2UsIHVzZXJOYW1lLCBuYW1lcyk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdXNlciBuYW1lIHBhc3NlZCBpbiBoZXJlIHdhcyByZXRyaWV2ZWQgZnJvbSBEVFAuCi0JICogRFRQIHN0b3JlcyB0aGUgdXNlciBuYW1lIHRoYXQgd2FzIHBhc3NlZCB0byBpdCBkdXJpbmcgdGhlIGNvbm5lY3Rpb24KLQkgKiB0byB0aGUgZGF0YWJhc2UuIEFzIGEgcmVzdWx0LCB0aGlzIHVzZXIgbmFtZSBpcyBhbiA8ZW0+aWRlbnRpZmllcjwvZW0+Ci0JICogbm90IGEgPGVtPm5hbWU8L2VtPi4KLQkgKiBJZiB0aGUgdXNlciBuYW1lIHdlcmUgcmV0cmlldmVkIGZyb20gdGhlIEpEQkMgY29ubmVjdGlvbiBpdCB3b3VsZCBwcm9iYWJseQotCSAqIGJlIGEgPGVtPm5hbWU8L2VtPi4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY29ubmVjdCB0byBhbiBPcmFjbGUgZGF0YWJhc2Ugd2l0aCB0aGUKLQkgKiB1c2VyIG5hbWUgInNjb3R0IiwgYnV0IHRoYXQgaWRlbnRpZmVyIGlzIGZvbGRlZCB0byB0aGUgYWN0dWFsIHVzZXIgbmFtZQotCSAqICJTQ09UVCIuIERUUCBzdG9yZXMgdGhlIG9yaWdpbmFsIHN0cmluZyAic2NvdHQiLCB3aGlsZSB0aGUgT3JhY2xlIEpEQkMKLQkgKiBkcml2ZXIgc3RvcmVzIHRoZSBmb2xkZWQgc3RyaW5nICJTQ09UVCIuCi0JICovCi0Jdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSwgQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMpIHsKLQkJbmFtZXMuYWRkKHRoaXMuY29udmVydElkZW50aWZpZXJUb05hbWUodXNlck5hbWUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZm9sZGluZyBzdHJhdGVneSB1c2VkIHRvIGNvbnZlcnQgbmFtZXMgYW5kIGlkZW50aWZpZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBTUUwgc3BlYyBzYXlzIGEgPGVtPnJlZ3VsYXI8L2VtPiAobm9uLWRlbGltaXRlZCkgaWRlbnRpZmllciBzaG91bGQgYmUKLQkgKiBmb2xkZWQgdG8gdXBwZXJjYXNlOyBidXQgc29tZSBkYXRhYmFzZXMgZG8gb3RoZXJ3aXNlIChlLmcuIFN5YmFzZSkuCi0JICovCi0JYWJzdHJhY3QgRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpOwotCi0KLQkvLyAqKioqKioqKioqIG5hbWUgLT4gaWRlbnRpZmllciAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMubmFtZVJlcXVpcmVzRGVsaW1pdGVycyhuYW1lKSA/Ci0JCQkJCQl0aGlzLmRlbGltaXROYW1lKG5hbWUpIDoKLQkJCQkJCXRoaXMucmVndWxhck5hbWVzTWF0Y2gobmFtZSwgZGVmYXVsdE5hbWUpID8gbnVsbCA6IG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5uYW1lUmVxdWlyZXNEZWxpbWl0ZXJzKG5hbWUpID8gdGhpcy5kZWxpbWl0TmFtZShuYW1lKSA6IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBkYXRhYmFzZSBvYmplY3QgbmFtZSBtdXN0IGJlIGRlbGltaXRlZAotCSAqIHdoZW4gdXNlZCBpbiBhbiBTUUwgc3RhdGVtZW50LgotCSAqIElmIHRoZSBuYW1lIGhhcyBhbnkgInNwZWNpYWwiIGNoYXJhY3RlcnMgKGFzIG9wcG9zZWQgdG8gbGV0dGVycywKLQkgKiBkaWdpdHMsIGFuZCBvdGhlciBhbGxvd2VkIGNoYXJhY3RlcnMgW2UuZy4gdW5kZXJzY29yZXNdKSwgaXQgcmVxdWlyZXMKLQkgKiBkZWxpbWl0ZXJzLgotCSAqIElmIHRoZSBuYW1lIGlzIG1peGVkIGNhc2UgYW5kIHRoZSBkYXRhYmFzZSBmb2xkcyB1bmRlbGltaXRlZCBuYW1lcwotCSAqICh0byBlaXRoZXIgdXBwZXJjYXNlIG9yIGxvd2VyY2FzZSksIGl0IHJlcXVpcmVzIGRlbGltaXRlcnMuCi0JICovCi0JYm9vbGVhbiBuYW1lUmVxdWlyZXNEZWxpbWl0ZXJzKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAobmFtZS5sZW5ndGgoKSA9PSAwKSAgLy8gIGFuIGVtcHR5IHN0cmluZyBtdXN0IGJlIGRlbGltaXRlZCg/KQotCQkJCQl8fCB0aGlzLm5hbWVDb250YWluc0FueVNwZWNpYWxDaGFyYWN0ZXJzKG5hbWUpCi0JCQkJCXx8IHRoaXMubmFtZUlzTm90Rm9sZGVkKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbmFtZSBjb250YWlucyBhbnkgInNwZWNpYWwiIGNoYXJhY3RlcnMKLQkgKiB0aGF0IHJlcXVpcmUgdGhlIG5hbWUgdG8gYmUgZGVsaW1pdGVkLgotCSAqIFByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBub3QgZW1wdHkKLQkgKi8KLQlib29sZWFuIG5hbWVDb250YWluc0FueVNwZWNpYWxDaGFyYWN0ZXJzKFN0cmluZyBuYW1lKSB7Ci0JCWNoYXJbXSBzdHJpbmcgPSBuYW1lLnRvQ2hhckFycmF5KCk7Ci0JCWlmICh0aGlzLmNoYXJhY3RlcklzTm9uUmVndWxhck5hbWVTdGFydChzdHJpbmdbMF0pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKGludCBpID0gc3RyaW5nLmxlbmd0aDsgaS0tID4gMTsgKSB7ICAvLyBub3RlOiBzdG9wIGF0IDEKLQkJCWlmICh0aGlzLmNoYXJhY3RlcklzTm9uUmVndWxhck5hbWVQYXJ0KHN0cmluZ1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgIm5vbi1yZWd1bGFyIiBmb3IgdGhlIGZpcnN0Ci0JICogY2hhcmFjdGVyIG9mIGEgbmFtZS4KLQkgKiBUeXBpY2FsbHksIGRhdGFiYXNlcyBhcmUgbW9yZSByZXN0cmljdGl2ZSBhYm91dCB3aGF0IGNoYXJhY3RlcnMgY2FuCi0JICogYmUgdXNlZCB0byA8ZW0+c3RhcnQ8L2VtPiBhbiBpZGVudGlmaWVyIChhcyBvcHBvc2VkIHRvIHRoZSBjaGFyYWN0ZXJzCi0JICogYWxsb3dlZCBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgaWRlbnRpZmllcikuCi0JICovCi0JYm9vbGVhbiBjaGFyYWN0ZXJJc05vblJlZ3VsYXJOYW1lU3RhcnQoY2hhciBjKSB7Ci0JCXJldHVybiAhIHRoaXMuY2hhcmFjdGVySXNSZWd1bGFyTmFtZVN0YXJ0KGMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIDxlbT5yZWd1bGFyPC9lbT4gZm9yIHRoZSBmaXJzdAotCSAqIGNoYXJhY3RlciBvZiBhIG5hbWUuCi0JICogVGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhbiBpZGVudGlmaWVyIGNhbiBiZTo8dWw+Ci0JICogPGxpPmEgbGV0dGVyCi0JICogPGxpPmFueSBvZiB0aGUgZXh0ZW5kZWQsIHZlbmRvci1zcGVjaWZpYywgPGVtPnJlZ3VsYXI8L2VtPiBzdGFydCBjaGFyYWN0ZXJzCi0JICogPC91bD4KLQkgKi8KLQlib29sZWFuIGNoYXJhY3RlcklzUmVndWxhck5hbWVTdGFydChjaGFyIGMpIHsKLQkJLy8gYWxsIHZlbmRvcnMgYWxsb3cgYSBsZXR0ZXIKLQkJcmV0dXJuIENoYXJhY3Rlci5pc0xldHRlcihjKQotCQkJCXx8IHRoaXMuY2hhcmFjdGVySXNFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnQoYyk7Ci0JfQotCi0JYm9vbGVhbiBjaGFyYWN0ZXJJc0V4dGVuZGVkUmVndWxhck5hbWVTdGFydChjaGFyIGMpIHsKLQkJcmV0dXJuIGFycmF5Q29udGFpbnModGhpcy5nZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCksIGMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgPGVtPnJlZ3VsYXI8L2VtPiBjaGFyYWN0ZXJzLCBiZXlvbmQgbGV0dGVycywgZm9yIHRoZQotCSAqIGZpcnN0IGNoYXJhY3RlciBvZiBhIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlcmUgYXJlIG5vICJleHRlbmRlZCIgY2hhcmFjdGVycy4KLQkgKi8KLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgIm5vbi1yZWd1bGFyIiBmb3IgdGhlIHNlY29uZAotCSAqIGFuZCBzdWJzZXF1ZW50IGNoYXJhY3RlcnMgb2YgYSBuYW1lLgotCSAqLwotCWJvb2xlYW4gY2hhcmFjdGVySXNOb25SZWd1bGFyTmFtZVBhcnQoY2hhciBjKSB7Ci0JCXJldHVybiAhIHRoaXMuY2hhcmFjdGVySXNSZWd1bGFyTmFtZVBhcnQoYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgPGVtPnJlZ3VsYXI8L2VtPiBmb3IgdGhlIHNlY29uZCBhbmQKLQkgKiBzdWJzZXF1ZW50IGNoYXJhY3RlcnMgb2YgYSBuYW1lLgotCSAqIFRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgY2hhcmFjdGVycyBvZiBhIDxlbT5yZWd1bGFyPC9lbT4gbmFtZSBjYW4gYmU6PHVsPgotCSAqIDxsaT5hIGxldHRlcgotCSAqIDxsaT5hIGRpZ2l0Ci0JICogPGxpPmFuIHVuZGVyc2NvcmUKLQkgKiA8bGk+YW55IG9mIHRoZSBleHRlbmRlZCwgdmVuZG9yLXNwZWNpZmljLCA8ZW0+cmVndWxhcjwvZW0+IHN0YXJ0IGNoYXJhY3RlcnMKLQkgKiA8bGk+YW55IG9mIHRoZSBleHRlbmRlZCwgdmVuZG9yLXNwZWNpZmljLCA8ZW0+cmVndWxhcjwvZW0+IHBhcnQgY2hhcmFjdGVycwotCSAqIDwvdWw+Ci0JICovCi0JYm9vbGVhbiBjaGFyYWN0ZXJJc1JlZ3VsYXJOYW1lUGFydChjaGFyIGMpIHsKLQkJLy8gYWxsIHZlbmRvcnMgYWxsb3cgYSBsZXR0ZXIgb3IgZGlnaXQKLQkJcmV0dXJuIENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoYykgfHwKLQkJCQkoYyA9PSAnXycpIHx8Ci0JCQkJdGhpcy5jaGFyYWN0ZXJJc0V4dGVuZGVkUmVndWxhck5hbWVTdGFydChjKSB8fAotCQkJCXRoaXMuY2hhcmFjdGVySXNFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydChjKTsKLQl9Ci0KLQlib29sZWFuIGNoYXJhY3RlcklzRXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnQoY2hhciBjKSB7Ci0JCXJldHVybiBhcnJheUNvbnRhaW5zKHRoaXMuZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCksIGMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgPGVtPnJlZ3VsYXI8L2VtPiBjaGFyYWN0ZXJzLCBiZXlvbmQgbGV0dGVycyBhbmQgZGlnaXRzIGFuZCB0aGUKLQkgKiA8ZW0+cmVndWxhcjwvZW0+IGZpcnN0IGNoYXJhY3RlcnMsIGZvciB0aGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGNoYXJhY3RlcnMKLQkgKiBvZiBhbiBpZGVudGlmaWVyLiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGFkZGl0aW9uYWwgY2hhcmFjdGVycy4KLQkgKi8KLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90IGZvbGRlZCB0byB0aGUgZGF0YWJhc2UncwotCSAqIGNhc2UsIHJlcXVpcmluZyBpdCB0byBiZSBkZWxpbWl0ZWQuCi0JICovCi0JYm9vbGVhbiBuYW1lSXNOb3RGb2xkZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuICEgdGhpcy5nZXRGb2xkaW5nU3RyYXRlZ3koKS5uYW1lSXNGb2xkZWQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCA8ZW0+cmVndWxhcjwvZW0+IG5hbWVzIG1hdGNoLgotCSAqLwotCWJvb2xlYW4gcmVndWxhck5hbWVzTWF0Y2goU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIpIHsKLQkJcmV0dXJuIHRoaXMucmVndWxhcklkZW50aWZpZXJzQXJlQ2FzZVNlbnNpdGl2ZSgpID8KLQkJCQkJCW5hbWUxLmVxdWFscyhuYW1lMikgOgotCQkJCQkJbmFtZTEuZXF1YWxzSWdub3JlQ2FzZShuYW1lMik7Ci0JfQotCi0JLyoqCi0JICogVHlwaWNhbGx5LCA8ZW0+cmVndWxhcjwvZW0+IGlkZW50aWZpZXJzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLgotCSAqLwotCWJvb2xlYW4gcmVndWxhcklkZW50aWZpZXJzQXJlQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkucmVndWxhcklkZW50aWZpZXJzQXJlQ2FzZVNlbnNpdGl2ZSgpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBuYW1lIGluIGRlbGltaXRlcnMgKHR5cGljYWxseSBkb3VibGUtcXVvdGVzKSwKLQkgKiBjb252ZXJ0aW5nIGl0IHRvIGFuIGlkZW50aWZpZXIuCi0JICovCi0JU3RyaW5nIGRlbGltaXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5xdW90ZShuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaWRlbnRpZmllciAtPiBuYW1lICoqKioqKioqKioKLQotCS8vIG5vdCBzdXJlIGhvdyB0byBoYW5kbGUgYW4gZW1wdHkgc3RyaW5nOgotCS8vIGJvdGggIiIgYW5kICJcIlwiIiBhcmUgY29udmVydGVkIHRvICIiIC4uLgotCS8vIGNvbnZlcnQgIiIgdG8gJ251bGwnIHNpbmNlIGVtcHR5IHN0cmluZ3MgbXVzdCBiZSBkZWxpbWl0ZWQ/Ci0JcHVibGljIFN0cmluZyBjb252ZXJ0SWRlbnRpZmllclRvTmFtZShTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gKGlkZW50aWZpZXIgPT0gbnVsbCkgPwotCQkJCQludWxsIDoKLQkJCQkJdGhpcy5pZGVudGlmaWVySXNEZWxpbWl0ZWQoaWRlbnRpZmllcikgPwotCQkJCQkJCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdChpZGVudGlmaWVyKSA6Ci0JCQkJCQkJdGhpcy5nZXRGb2xkaW5nU3RyYXRlZ3koKS5mb2xkKGlkZW50aWZpZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllciBpcyA8ZW0+ZGVsaW1pdGVkPC9lbT4uCi0JICogVGhlIFNRTC05MiBzcGVjIHNheXMgaWRlbnRpZmllcnMgc2hvdWxkIGJlIGRlbGltaXRlZCBieQotCSAqIGRvdWJsZS1xdW90ZXM7IGJ1dCBzb21lIGRhdGFiYXNlcyBhbGxvdyBvdGhlcndpc2UgKGUuZy4gU3liYXNlKS4KLQkgKi8KLQlib29sZWFuIGlkZW50aWZpZXJJc0RlbGltaXRlZChTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNRdW90ZWQoaWRlbnRpZmllcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RFRQVmVuZG9yTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIHN0YXRpYyBjb252ZW5pZW5jZSBtZXRob2QgLSBhcnJheSBudWxsIGNoZWNrCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gYXJyYXlDb250YWlucyhjaGFyW10gYXJyYXksIGNoYXIgYykgewotCQlyZXR1cm4gKGFycmF5ICE9IG51bGwpICYmIEFycmF5VG9vbHMuY29udGFpbnMoYXJyYXksIGMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0NhdGFsb2dTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0NhdGFsb2dTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzdhNGI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9DYXRhbG9nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE7Ci0KLS8qKgotICogSGFuZGxlIHRoZSB2YXJpZXR5IG9mIGNhdGFsb2cgKGFuZCBzY2hlbWEpIGNvbmZpZ3VyYXRpb25zIGdlbmVyYXRlZCBieSBEVFAuCi0gKi8KLWludGVyZmFjZSBDYXRhbG9nU3RyYXRlZ3kgewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIERUUCBkYXRhYmFzZSBoYXMgcmVhbCBjYXRhbG9ncy4KLQkgKi8KLQlib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UncyBjYXRhbG9ncy4KLQkgKi8KLQlMaXN0PENhdGFsb2c+IGdldENhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlJ3Mgc2NoZW1hcy4KLQkgKi8KLQlMaXN0PFNjaGVtYT4gZ2V0U2NoZW1hcyhEYXRhYmFzZSBkYXRhYmFzZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9EQjIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9EQjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjOGE0YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvREIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWNsYXNzIERCMgotCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKLXsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBkdHBWZW5kb3JOYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVuZG9yIFVEQiA9IG5ldyBEQjIoIkRCMiBVREIiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBVREJfSV9TRVJJRVMgPSBuZXcgREIyKCJEQjIgVURCIGlTZXJpZXMiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBVREJfWl9TRVJJRVMgPSBuZXcgREIyKCJEQjIgVURCIHpTZXJpZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIFZlbmRvciB1ZGIoKSB7Ci0JCXJldHVybiBVREI7Ci0JfQotCi0Jc3RhdGljIFZlbmRvciB1ZGJJU2VyaWVzKCkgewotCQlyZXR1cm4gVURCX0lfU0VSSUVTOwotCX0KLQotCXN0YXRpYyBWZW5kb3IgdWRiWlNlcmllcygpIHsKLQkJcmV0dXJuIFVEQl9aX1NFUklFUzsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgb25seSBzdGF0aWMgaW5zdGFuY2VzLgotCSAqLwotCXByaXZhdGUgREIyKFN0cmluZyBkdHBWZW5kb3JOYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZHRwVmVuZG9yTmFtZSA9IGR0cFZlbmRvck5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREVFBWZW5kb3JOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBWZW5kb3JOYW1lOwotCX0KLQotCUBPdmVycmlkZQotCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7ICAvLyBub3QgdmVyaWZpZWQgeWV0Li4uCi0JfQotCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0RlcmJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvRGVyYnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkNDQ4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvRGVyYnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci0KLWNsYXNzIERlcmJ5Ci0JZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBJTlNUQU5DRSA9IG5ldyBEZXJieSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIFZlbmRvciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBEZXJieSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKSB7Ci0JCXJldHVybiAiRGVyYnkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIEZhdXhDYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQodGhpcy5idWlsZERlZmF1bHRTY2hlbWFOYW1lKHVzZXJOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdXNlciBuYW1lIG9uIERlcmJ5IGlzICJBUFAiIHdoZW4gdGhlIHVzZXIgY29ubmVjdHMgd2l0aG91dAotCSAqIGEgdXNlciBuYW1lLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdFNjaGVtYU5hbWUoU3RyaW5nIHVzZXJOYW1lKSB7Ci0JCXJldHVybiAoKHVzZXJOYW1lICE9IG51bGwpICYmICh1c2VyTmFtZS5sZW5ndGgoKSAhPSAwKSkgPwotCQkJCXRoaXMuY29udmVydElkZW50aWZpZXJUb05hbWUodXNlck5hbWUpIDoKLQkJCQlERUZBVUxUX1VTRVJfTkFNRTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVVNFUl9OQU1FID0gIkFQUCI7ICAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9GYXV4Q2F0YWxvZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvRmF1eENhdGFsb2dTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjY5Y2Y1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9GYXV4Q2F0YWxvZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYTsKLQotLyoqCi0gKiBDYXRhbG9nIHN0cmF0ZWd5IGZvciBEVFAgZGF0YWJhc2VzIHRoYXQgYnVpbGQgYSAidmlydHVhbCIgY2F0YWxvZyAodGhhdCBoYXMKLSAqIG5vIG5hbWUpIGJlY2F1c2UgdGhlIHVuZGVybHlpbmcgSkRCQyBkcml2ZXIgZG9lcyBub3QgcmV0dXJuIGFueSBjYXRhbG9ncwotICogKGUuZy4gT3JhY2xlKS4KLSAqIEBzZWUgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRDYXRhbG9ncygpCi0gKi8KLWNsYXNzIEZhdXhDYXRhbG9nU3RyYXRlZ3kKLQlpbXBsZW1lbnRzIENhdGFsb2dTdHJhdGVneQotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIENhdGFsb2dTdHJhdGVneSBJTlNUQU5DRSA9IG5ldyBGYXV4Q2F0YWxvZ1N0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgQ2F0YWxvZ1N0cmF0ZWd5IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEZhdXhDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIExpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0PFNjaGVtYT4gZ2V0U2NoZW1hcyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkvLyAzMDg5NDcgLSBoYWNrIHRvIHN1cHBvcnQgb2xkIElCTSBEVFAvUkRCIGV4dGVuc2lvbiBmb3IgT3JhY2xlCi0JCUxpc3Q8Q2F0YWxvZz4gY2F0YWxvZ3MgPSBkYXRhYmFzZS5nZXRDYXRhbG9ncygpOwotCQkvLyBpZiB0aGVyZSBhcmUgbm8gY2F0YWxvZ3MsIHRoZSBkYXRhYmFzZSBtdXN0IGhvbGQgdGhlIHNjaGVtYXRhIGRpcmVjdGx5Ci0JCWlmICgoY2F0YWxvZ3MgPT0gbnVsbCkgfHwgY2F0YWxvZ3MuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZGF0YWJhc2UuZ2V0U2NoZW1hcygpOwotCQl9Ci0KLQkJLy8gbm9ybWFsIGxvZ2ljOgotCQlyZXR1cm4gdGhpcy5nZXRGYXV4Q2F0YWxvZyhkYXRhYmFzZS5nZXRDYXRhbG9ncygpKS5nZXRTY2hlbWFzKCk7Ci0JfQotCi0JcHJpdmF0ZSBDYXRhbG9nIGdldEZhdXhDYXRhbG9nKExpc3Q8Q2F0YWxvZz4gY2F0YWxvZ3MpIHsKLQkJaWYgKGNhdGFsb2dzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoY2F0YWxvZ3Muc2l6ZSgpICE9IDEpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBhIHNpbmdsZSBjYXRhbG9nOiAiICsgY2F0YWxvZ3Muc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJQ2F0YWxvZyBjYXRhbG9nID0gY2F0YWxvZ3MuZ2V0KDApOwotCQlpZiAoY2F0YWxvZy5nZXROYW1lKCkubGVuZ3RoKCkgIT0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaWxsZWdhbCBuYW1lOiAiICsgY2F0YWxvZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGNhdGFsb2c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvRm9sZGluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvRm9sZGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhODAyODkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0ZvbGRpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOwotCi0vKioKLSAqIEhhbmRsZSBkYXRhYmFzZS1zcGVjaWZpYyBpZGVudGlmaWVyLWZvbGRpbmcgaXNzdWVzLgotICovCi1pbnRlcmZhY2UgRm9sZGluZ1N0cmF0ZWd5IHsKLQotCS8qKgotCSAqIEZvbGQgdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqLwotCVN0cmluZyBmb2xkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2Ugb2JqZWN0IG5hbWUgaXMgYWxyZWFkeSBmb2xkZWQsCi0JICogbWVhbmluZywgaWYgaXQgaGFzIG5vIHNwZWNpYWwgY2hhcmFjdGVycywgaXQgcmVxdWlyZXMgbm8gZGVsaW1pdGVycy4KLQkgKi8KLQlib29sZWFuIG5hbWVJc0ZvbGRlZChTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZGF0YWJhc2UgaXMgY2FzZS1zZW5zaXRpdmUgd2hlbiB1c2luZyAicmVndWxhciIKLQkgKiAoaS5lLiBub24tZGVsaW1pdGVkKSBpZGVudGlmaWVycy4KLQkgKi8KLQlib29sZWFuIHJlZ3VsYXJJZGVudGlmaWVyc0FyZUNhc2VTZW5zaXRpdmUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0hTUUxEQi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0hTUUxEQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmUwMzkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9IU1FMREIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci0KLWNsYXNzIEhTUUxEQgotCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgSU5TVEFOQ0UgPSBuZXcgSFNRTERCKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgVmVuZG9yIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEhTUUxEQigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKSB7Ci0JCXJldHVybiAiSFNRTERCIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7ICAvLyBub3QgdmVyaWZpZWQgeWV0Li4uCi0JfQotCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgYWRkRGVmYXVsdFNjaGVtYU5hbWVzVG8oRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSwgQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMpIHsKLQkJbmFtZXMuYWRkKFBVQkxJQ19TQ0hFTUFfTkFNRSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNfU0NIRU1BX05BTUUgPSAiUFVCTElDIjsgIC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0luZm9ybWl4LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvSW5mb3JtaXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRkZTJhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvSW5mb3JtaXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotY2xhc3MgSW5mb3JtaXgKLQlleHRlbmRzIEFic3RyYWN0VmVuZG9yCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVuZG9yIElOU1RBTkNFID0gbmV3IEluZm9ybWl4KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgVmVuZG9yIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEluZm9ybWl4KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuICJJbmZvcm1peCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVW5rbm93bkNhdGFsb2dTdHJhdGVneS5pbnN0YW5jZSgpOyAgLy8gbm90IHZlcmlmaWVkIHlldC4uLgotCX0KLQotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBnZXRGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBMb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9TVEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJ18nIH07Ci0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJyQnIH07Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Mb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Mb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNlMTk3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvTG93ZXJDYXNlRm9sZGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBGb2xkICJub3JtYWwiIGlkZW50aWZpZXJzIHRvIGxvd2VyIGNhc2UuCi0gKiBJZ25vcmUgdGhlIGNhc2Ugb2YgIm5vcm1hbCIgaWRlbnRpZmllcnMuCi0gKi8KLWNsYXNzIExvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneQotCWltcGxlbWVudHMgRm9sZGluZ1N0cmF0ZWd5Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBGb2xkaW5nU3RyYXRlZ3kgSU5TVEFOQ0UgPSBuZXcgTG93ZXJDYXNlRm9sZGluZ1N0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgRm9sZGluZ1N0cmF0ZWd5IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIExvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGZvbGQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBuYW1lSXNGb2xkZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ0lzTG93ZXJjYXNlKG5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZ3VsYXJJZGVudGlmaWVyc0FyZUNhc2VTZW5zaXRpdmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9NYXhEQi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL01heERCLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMjg3ODIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL01heERCLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWNsYXNzIE1heERCCi0JZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBJTlNUQU5DRSA9IG5ldyBNYXhEQigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIFZlbmRvciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBNYXhEQigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKSB7Ci0JCXJldHVybiAiTWF4REIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFVua25vd25DYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsgIC8vIG5vdCB2ZXJpZmllZCB5ZXQuLi4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JY2hhcltdIGdldEV4dGVuZGVkUmVndWxhck5hbWVTdGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9TVEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICcjJywgJ0AnLCAnJCcgfTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL015U1FMLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvTXlTUUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwZmVhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvTXlTUUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi1jbGFzcyBNeVNRTAotCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgSU5TVEFOQ0UgPSBuZXcgTXlTUUwoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBWZW5kb3IgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTXlTUUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREVFBWZW5kb3JOYW1lKCkgewotCQlyZXR1cm4gIk15U3FsIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSBEVFAgbW9kZWwgZm9yIE15U1FMIGhhcyBhIGRhdGFiYXNlIHRoYXQgY29udGFpbnMgbm8gY2F0YWxvZ3M7Ci0JICogYnV0LCBpbnN0ZWFkLCBkaXJlY3RseSBob2xkcyBhIHNpbmdsZSBzY2hlbWEgd2l0aCB0aGUgc2FtZSBuYW1lIGFzCi0JICogdGhlIGRhdGFiYXNlLiAoVGhpcyBpcyBoYXJkLWNvZGVkIGluIE15U3FsQ2F0YWxvZ0RhdGFiYXNlLmdldFNjaGVtYXMoKS4pCi0JICogQWx0aG91Z2ggeW91IGNhbiBxdWFsaWZ5IGlkZW50aWZpZXJzIHdpdGggYSBkYXRhYmFzZSBuYW1lCi0JICogaW4gTXlTUUwsIG9ubHkgdGhlIGRhdGFiYXNlIHNwZWNpZmllZCBhdCBsb2dpbiBzZWVtcyB0byBiZSBhdmFpbGFibGUKLQkgKiBpbiB0aGUgRFRQIG1vZGVsLi4uLgotCSAqIAotCSAqIE5COiBJbiBNeVNRTCBEREwsIFNDSEVNQSBpcyBhIHN5bm9ueW0gZm9yIERBVEFCQVNFOyBidXQgdGhlIEpEQkMKLQkgKiBtZXRob2QgRGF0YWJhc2VNZXRhRGF0YS5nZXRTY2hlbWFzKCkgcmV0dXJucyBhbiBlbXB0eSBsaXN0LAotCSAqIHdoaWxlIGdldENhdGFsb2dzKCkgcmV0dXJucyBhIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBkYXRhYmFzZXMuCi0JICogWW91IGNhbiBhbHNvIHVzZSB0aGUgSkRCQyBtZXRob2QgQ29ubmVjdGlvbi5zZXRDYXRhbG9nKFN0cmluZykgdG8KLQkgKiBzZXQgdGhlIGRlZmF1bHQgZGF0YWJhc2UuCi0JICovCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIE5vQ2F0YWxvZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogTXlTUUwgaXMgYSBiaXQgdW51c3VhbCwgc28gd2UgZm9yY2UgZXhhY3QgbWF0Y2hlcy4KLQkgKiAoZS5nLiBNeVNRTCBmb2xkcyBkYXRhYmFzZSBhbmQgdGFibGUgbmFtZXMgdG8gbG93ZXJjYXNlIG9uIFdpbmRvd3MKLQkgKiBieSBkZWZhdWx0OyBidXQgdGhhdCBkZWZhdWx0IGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZQotCSAqICdsb3dlcl9jYXNlX3RhYmxlX25hbWVzJyBzeXN0ZW0gdmFyaWFibGUuIFRoaXMgaXMgYmVjYXVzZSBkYXRhYmFzZXMgYXJlCi0JICogc3RvcmVkIGFzIGRpcmVjdG9yaWVzIGFuZCB0YWJsZXMgYXJlIHN0b3JlZCBhcyBmaWxlcyBpbiB0aGUgdW5kZXJseWluZwotCSAqIE8vUzsgYW5kIHRoZSBjYXNlLXNlbnNpdGl2aXR5IG9mIHRoZSBuYW1lcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBiZWhhdmlvcgotCSAqIG9mIGZpbGVuYW1lcyBvbiB0aGUgTy9TLiBUaGVuLCB0byBjb21wbGljYXRlIHRoaW5ncywKLQkgKiBub25lIG9mIHRoZSBvdGhlciBpZGVudGlmaWVycywgbGlrZSBpbmRleCBhbmQgY29sdW1uIG5hbWVzLCBhcmUgZm9sZGVkOwotCSAqIGJ1dCB0aGV5IGFyZSBjYXNlLWluc2Vuc2l0aXZlLCB1bmxlc3MgZGVsaW1pdGVkLiBTZWUKLQkgKiBodHRwOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzUuMC9lbi9pZGVudGlmaWVyLWNhc2Utc2Vuc2l0aXZpdHkuaHRtbC4pCi0JICovCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIE5vbkZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgYWRkRGVmYXVsdFNjaGVtYU5hbWVzVG8oRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSwgQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMpIHsKLQkJbmFtZXMuYWRkKGRhdGFiYXNlLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogTXlTUUwgaXMgdGhlIG9ubHkgdmVuZG9yIHRoYXQgYWxsb3dzIGEgZGlnaXQuCi0JICogQWx0aG91Z2gsIHRoZSBuYW1lIGNhbm5ub3QgYmUgKmFsbCogZGlnaXRzLgotCSAqLwotCUBPdmVycmlkZQotCWJvb2xlYW4gY2hhcmFjdGVySXNSZWd1bGFyTmFtZVN0YXJ0KGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzRGlnaXQoYykgfHwgc3VwZXIuY2hhcmFjdGVySXNSZWd1bGFyTmFtZVN0YXJ0KGMpOwotCX0KLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycsICckJyB9OwotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgTXlTUUwgZGVsaW1pdHMgaWRlbnRpZmllcnMgd2l0aCBiYWNrdGlja3MgKGApOyBidXQgaXQKLQkgKiBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHRvIHVzZSBkb3VibGUtcXVvdGVzLgotCSAqLwotCUBPdmVycmlkZQotCWJvb2xlYW4gaWRlbnRpZmllcklzRGVsaW1pdGVkKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChpZGVudGlmaWVyLCBCQUNLVElDSykKLQkJCQkJfHwgc3VwZXIuaWRlbnRpZmllcklzRGVsaW1pdGVkKGlkZW50aWZpZXIpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEJBQ0tUSUNLID0gJ2AnOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvTm9DYXRhbG9nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Ob0NhdGFsb2dTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2ZiNzlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Ob0NhdGFsb2dTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE7Ci0KLS8qKgotICogQ2F0YWxvZyBzdHJhdGVneSBmb3IgRFRQIGRhdGFiYXNlcyB0aGF0IGRvIG5vdCBoYXZlIGNhdGFsb2dzCi0gKiAoZS5nLiBNeVNRTCBzZWUgYnVnIDI0OTAxMykuCi0gKi8KLWNsYXNzIE5vQ2F0YWxvZ1N0cmF0ZWd5Ci0JaW1wbGVtZW50cyBDYXRhbG9nU3RyYXRlZ3kKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDYXRhbG9nU3RyYXRlZ3kgSU5TVEFOQ0UgPSBuZXcgTm9DYXRhbG9nU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBDYXRhbG9nU3RyYXRlZ3kgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTm9DYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIExpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0PFNjaGVtYT4gZ2V0U2NoZW1hcyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gZGF0YWJhc2UuZ2V0U2NoZW1hcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL05vbkZvbGRpbmdTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL05vbkZvbGRpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTQzZDE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Ob25Gb2xkaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotCi0vKioKLSAqIERvIG5vdCBmb2xkICJub3JtYWwiIGlkZW50aWZpZXJzLgotICogUmVzcGVjdCB0aGUgY2FzZSBvZiAibm9ybWFsIiBpZGVudGlmaWVycy4KLSAqLwotY2xhc3MgTm9uRm9sZGluZ1N0cmF0ZWd5Ci0JaW1wbGVtZW50cyBGb2xkaW5nU3RyYXRlZ3kKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZvbGRpbmdTdHJhdGVneSBJTlNUQU5DRSA9IG5ldyBOb25Gb2xkaW5nU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBGb2xkaW5nU3RyYXRlZ3kgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTm9uRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFNpbmNlIGlkZW50aWZpZXJzIGFyZSBub3QgZm9sZGVkIHRvIHVwcGVyLSBvciBsb3dlci1jYXNlLCB0aGUgbmFtZSBpcwotCSAqIGFscmVhZHkgImZvbGRlZCIuCi0JICovCi0JcHVibGljIFN0cmluZyBmb2xkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNpbmNlIGlkZW50aWZpZXJzIGFyZSBub3QgZm9sZGVkIHRvIHVwcGVyLSBvciBsb3dlci1jYXNlLCB0aGUgbmFtZSBpcwotCSAqIGFscmVhZHkgImZvbGRlZCIuCi0JICogKE5vbi1mb2xkaW5nIGRhdGFiYXNlcyBkbyBub3QgcmVxdWlyZSBkZWxpbWl0ZXJzIGFyb3VuZCBtaXhlZC1jYXNlCi0JICogIm5vcm1hbCIgaWRlbnRpZmllcnMuKQotCSAqLwotCXB1YmxpYyBib29sZWFuIG5hbWVJc0ZvbGRlZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWd1bGFySWRlbnRpZmllcnNBcmVDYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9PcmFjbGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9PcmFjbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZlNjc3Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvT3JhY2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWNsYXNzIE9yYWNsZQotCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgSU5TVEFOQ0UgPSBuZXcgT3JhY2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgVmVuZG9yIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE9yYWNsZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBGYXV4Q2F0YWxvZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfUEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnJCcsICcjJyB9OwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvUG9zdGdyZVNRTC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1Bvc3RncmVTUUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1ZjVjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvUG9zdGdyZVNRTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLQotY2xhc3MgUG9zdGdyZVNRTAotCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgSU5TVEFOQ0UgPSBuZXcgUG9zdGdyZVNRTCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIFZlbmRvciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBQb3N0Z3JlU1FMKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuICJwb3N0Z3JlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGUgUG9zdGdyZVNRTCBKREJDIGRyaXZlciByZXR1cm5zIGEgc2luZ2xlIGNhdGFsb2cgZnJvbSB0aGUgY2FsbCB0bwotCSAqIERhdGFiYXNlTWV0YURhdGEuZ2V0Q2F0YWxvZ3MoKSB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZQotCSAqIGRhdGFiYXNlIGluaXRpYWxseSBzcGVjaWZpZWQgYnkgdGhlIGNvbm5lY3Rpb24gKGluIHRoZSBKREJDIFVSTCkuCi0JICogRFRQIHVzZXMgdGhpcyBjb25maWd1cmF0aW9uIHVubW9kaWZpZWQuIFVuZm9ydHVuYXRlbHksIHRoZSBEVFAKLQkgKiBkYXRhYmFzZSdzIG5hbWUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBQb3N0Z3JlU1FMIGRhdGFiYXNlJ3MKLQkgKiBuYW1lLgotCSAqLwotCUBPdmVycmlkZQotCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBTaW1wbGVDYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gTG93ZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIFBvc3RncmVTUUwgZGF0YWJhc2UgaG9sZHMgYSBzaW5nbGUgY2F0YWxvZyB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzCi0JICogdGhlIGRhdGFiYXNlLgotCSAqLwotCUBPdmVycmlkZQotCXZvaWQgYWRkRGVmYXVsdENhdGFsb2dOYW1lc1RvKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUsIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZCh0aGlzLmJ1aWxkRGVmYXVsdENhdGFsb2dOYW1lKGRhdGFiYXNlKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWZhdWx0Q2F0YWxvZ05hbWUoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJcmV0dXJuICgoQ2F0YWxvZykgZGF0YWJhc2UuZ2V0Q2F0YWxvZ3MoKS5nZXQoMCkpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQb3N0Z3JlU1FMIGhhcyBhICJzY2hlbWEgc2VhcmNoIHBhdGgiLiBUaGUgZGVmYXVsdCBpczoKLQkgKiAgICAgIiR1c2VyIixwdWJsaWMKLQkgKiBJZiB0aGUgIiR1c2VyIiBzY2hlbWEgaXMgbm90IGZvdW5kLCB1c2UgdGhlICJwdWJsaWMiIHNjaGVtYS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQl2b2lkIGFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUsIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCXN1cGVyLmFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKGRhdGFiYXNlLCB1c2VyTmFtZSwgbmFtZXMpOwotCQluYW1lcy5hZGQoUFVCTElDX1NDSEVNQV9OQU1FKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19TQ0hFTUFfTkFNRSA9ICJwdWJsaWMiOyAgLy8kTk9OLU5MUy0xJAotCi0JQE92ZXJyaWRlCi0JY2hhcltdIGdldEV4dGVuZGVkUmVndWxhck5hbWVTdGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9TVEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICdfJyB9OwotCi0JQE92ZXJyaWRlCi0JY2hhcltdIGdldEV4dGVuZGVkUmVndWxhck5hbWVQYXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfUEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICckJyB9OwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvU1FMU2VydmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvU1FMU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjY2VmNTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1NRTFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotY2xhc3MgU1FMU2VydmVyCi0JZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBJTlNUQU5DRSA9IG5ldyBTUUxTZXJ2ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBWZW5kb3IgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgU1FMU2VydmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuICJTUUwgU2VydmVyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBTaW1wbGVDYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCBTUUwgU2VydmVyIGlkZW50aWZpZXJzIGFyZSBjYXNlLXNlbnNpdGl2ZSwgZXZlbiB3aXRob3V0Ci0JICogZGVsaW1pdGVycy4gVGhpcyBjYW4gZGVwZW5kIG9uIHRoZSBjb2xsYXRpb24gc2V0dGluZy4uLi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gTm9uRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogU1FMIFNlcnZlciB3aWxsIHVzZSB0aGUgdXNlci1yZXF1ZXN0ZWQgZGF0YWJhc2U7IGlmIHRoYXQgZGF0YWJhc2UgaXMgbm90Ci0JICogZm91bmQsIGl0IHdpbGwgZGVmYXVsdCB0byAnbWFzdGVyJy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQl2b2lkIGFkZERlZmF1bHRDYXRhbG9nTmFtZXNUbyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQoZGF0YWJhc2UuZ2V0TmFtZSgpKTsKLQkJbmFtZXMuYWRkKE1BU1RFUl9DQVRBTE9HX0lERU5USUZJRVIpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFTVEVSX0NBVEFMT0dfSURFTlRJRklFUiA9ICJtYXN0ZXIiOyAgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc2NoZW1hIG9uIFNRTCBTZXJ2ZXIgZm9yIGFueSBkYXRhYmFzZSAoY2F0YWxvZykgaXMgJ2RibycuCi0JICovCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQoREVGQVVMVF9TQ0hFTUFfTkFNRSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDSEVNQV9OQU1FID0gImRibyI7ICAvLyROT04tTkxTLTEkCi0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9TVEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJ18nLCAnQCcsICcjJyB9OwotCi0JQE92ZXJyaWRlCi0JY2hhcltdIGdldEV4dGVuZGVkUmVndWxhck5hbWVQYXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfUEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICckJyB9OwotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgU1FMIFNlcnZlciBkZWxpbWl0cyBpZGVudGlmaWVycyB3aXRoIGJyYWNrZXRzIChbXSk7IGJ1dCBpdAotCSAqIGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGRvdWJsZS1xdW90ZXMuCi0JICovCi0JQE92ZXJyaWRlCi0JYm9vbGVhbiBpZGVudGlmaWVySXNEZWxpbWl0ZWQoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2tldGVkKGlkZW50aWZpZXIpCi0JCQkJCXx8IHN1cGVyLmlkZW50aWZpZXJJc0RlbGltaXRlZChpZGVudGlmaWVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9TaW1wbGVDYXRhbG9nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9TaW1wbGVDYXRhbG9nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlNmI3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYTsKLQotLyoqCi0gKiBDYXRhbG9nIHN0cmF0ZWd5IGZvciBEVFAgZGF0YWJhc2VzIHRoYXQgc2ltcGx5IG1vZGVsIHRoZSBjYXRhbG9ncyByZXR1cm5lZAotICogYnkgdGhlIHVuZGVybHlpbmcgSkRCQyBkcml2ZXIgKGUuZy4gU3liYXNlKS4KLSAqIEBzZWUgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRDYXRhbG9ncygpCi0gKi8KLWNsYXNzIFNpbXBsZUNhdGFsb2dTdHJhdGVneQotCWltcGxlbWVudHMgQ2F0YWxvZ1N0cmF0ZWd5Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2F0YWxvZ1N0cmF0ZWd5IElOU1RBTkNFID0gbmV3IFNpbXBsZUNhdGFsb2dTdHJhdGVneSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIENhdGFsb2dTdHJhdGVneSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBTaW1wbGVDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkvLyBCdWcgMzI3NTcyIC0gVW5mb3J0dW5hdGVseSBEVFAgYWxsb3dzIGZvciBvcHRpb25hbCBzdXBwb3J0IG9mIGNhdGFsb2dzIGluIGV4dGVuc2lvbnMKLQkJTGlzdDxDYXRhbG9nPiBjYXRhbG9ncyA9IGRhdGFiYXNlLmdldENhdGFsb2dzKCk7Ci0JCWlmICgoY2F0YWxvZ3MgPT0gbnVsbCkgfHwgY2F0YWxvZ3MuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIG5vcm1hbCBsb2dpYzoKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJTGlzdDxDYXRhbG9nPiBjYXRhbG9ncyA9IGRhdGFiYXNlLmdldENhdGFsb2dzKCk7Ci0JCS8vIEJ1ZyAzMjc1NzIgLSBVbmZvcnR1bmF0ZWx5IERUUCBhbGxvd3MgZm9yIG9wdGlvbmFsIHN1cHBvcnQgb2YgY2F0YWxvZ3MgaW4gZXh0ZW5zaW9ucwotCQlpZiAoKGNhdGFsb2dzID09IG51bGwpIHx8IGNhdGFsb2dzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCQotCQkvLyBub3JtYWwgbG9naWM6Ci0JCXJldHVybiBjYXRhbG9nczsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdDxTY2hlbWE+IGdldFNjaGVtYXMoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJTGlzdDxDYXRhbG9nPiBjYXRhbG9ncyA9IGRhdGFiYXNlLmdldENhdGFsb2dzKCk7Ci0JCS8vIEJ1ZyAzMjc1NzIgLSBVbmZvcnR1bmF0ZWx5IERUUCBhbGxvd3MgZm9yIG9wdGlvbmFsIHN1cHBvcnQgb2YgY2F0YWxvZ3MgaW4gZXh0ZW5zaW9ucwotCQkvLyBpZiB0aGVyZSBhcmUgbm8gY2F0YWxvZ3MsIHRoZSBkYXRhYmFzZSBtdXN0IGhvbGQgdGhlIHNjaGVtYXRhIGRpcmVjdGx5Ci0JCWlmICgoY2F0YWxvZ3MgPT0gbnVsbCkgfHwgY2F0YWxvZ3MuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZGF0YWJhc2UuZ2V0U2NoZW1hcygpOwotCQl9Ci0JCQotCQkvLyBub3JtYWwgbG9naWM6Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9TeWJhc2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9TeWJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwYjliOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvU3liYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotY2xhc3MgU3liYXNlCi0JZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgotewotCXByaXZhdGUgZmluYWwgU3RyaW5nIGR0cFZlbmRvck5hbWU7Ci0KLQlzdGF0aWMgZmluYWwgVmVuZG9yIEFTQSA9IG5ldyBTeWJhc2UoIlN5YmFzZV9BU0EiKTsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBWZW5kb3IgQVNFID0gbmV3IFN5YmFzZSgiU3liYXNlX0FTRSIpOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgVmVuZG9yIGFzYSgpIHsKLQkJcmV0dXJuIEFTQTsKLQl9Ci0KLQlzdGF0aWMgVmVuZG9yIGFzZSgpIHsKLQkJcmV0dXJuIEFTRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgb25seSBzdGF0aWMgaW5zdGFuY2VzLgotCSAqLwotCXByaXZhdGUgU3liYXNlKFN0cmluZyBkdHBWZW5kb3JOYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZHRwVmVuZG9yTmFtZSA9IGR0cFZlbmRvck5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREVFBWZW5kb3JOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBWZW5kb3JOYW1lOwotCX0KLQotCUBPdmVycmlkZQotCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBTaW1wbGVDYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCBTeWJhc2UgaWRlbnRpZmllcnMgYXJlIGNhc2Utc2Vuc2l0aXZlLCBldmVuIHdpdGhvdXQKLQkgKiBkZWxpbWl0ZXJzLiBUaGlzIGNhbiBkZXBlbmQgb24gdGhlIGNvbGxhdGlvbiBzZXR0aW5nLi4uLgotCSAqLwotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBnZXRGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBOb25Gb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTeWJhc2Ugd2lsbCB1c2UgdGhlIHVzZXItcmVxdWVzdGVkIGRhdGFiYXNlOyBpZiB0aGF0IGRhdGFiYXNlIGlzIG5vdAotCSAqIGZvdW5kLCBpdCB3aWxsIGRlZmF1bHQgdG8gJ21hc3RlcicuCi0JICovCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0Q2F0YWxvZ05hbWVzVG8oRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSwgQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMpIHsKLQkJbmFtZXMuYWRkKGRhdGFiYXNlLmdldE5hbWUoKSk7Ci0JCW5hbWVzLmFkZChNQVNURVJfQ0FUQUxPR19OQU1FKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BU1RFUl9DQVRBTE9HX05BTUUgPSAibWFzdGVyIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSB0eXBpY2FsIGRlZmF1bHQgc2NoZW1hIG9uIFN5YmFzZSBmb3IgYW55IGRhdGFiYXNlIChjYXRhbG9nKSBpcwotCSAqICdkYm8nLgotCSAqIAotCSAqIEFjdHVhbGx5LCB0aGUgZGVmYXVsdCBzY2hlbWEgaXMgbW9yZSBsaWtlIGEgc2VhcmNoIHBhdGg6Ci0JICogVGhlIHNlcnZlciBsb29rcyBmb3IgYSBzY2hlbWEgb2JqZWN0IChlLmcuIGEgdGFibGUpIGZpcnN0IGluIHRoZSB1c2VyJ3MKLQkgKiBzY2hlbWEsIHRoZW4gaXQgbG9va3MgZm9yIHRoZSBzY2hlbWEgb2JqZWN0IGluIHRoZSBkYXRhYmFzZSBvd25lcidzCi0JICogc2NoZW1hIChkYm8pLiBBcyBhIHJlc3VsdCwgaXQncyByZWFsbHkgbm90IHBvc3NpYmxlIHRvIHNwZWNpZnkKLQkgKiB0aGUgImRlZmF1bHQiIHNjaGVtYSB3aXRob3V0IGtub3dpbmcgdGhlIHNjaGVtYSBvYmplY3Qgd2UgYXJlCi0JICogbG9va2luZyBmb3IuCi0JICogCi0JICogKE5vdGU6IHRoZSBjdXJyZW50ICd1c2VyJyBpcyBub3QgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIGN1cnJlbnQKLQkgKiAnbG9naW4nIC0gc2VlIHNwX2FkZHVzZXIgYW5kIHNwX2FkZGxvZ2luOyBzbyB3ZSBwcm9iYWJseSBjYW4ndAotCSAqIHVzZSBDb25uZWN0aW9uUHJvZmlsZSNnZXRVc2VyTmFtZSgpLikKLQkgKi8KLQlAT3ZlcnJpZGUKLQl2b2lkIGFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUsIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZChERUZBVUxUX1NDSEVNQV9OQU1FKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0NIRU1BX05BTUUgPSAiZGJvIjsgIC8vJE5PTi1OTFMtMSQKLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycsICdAJyB9OwotCi0JQE92ZXJyaWRlCi0JY2hhcltdIGdldEV4dGVuZGVkUmVndWxhck5hbWVQYXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfUEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICckJywgJ6UnLCAnoycsICcjJyB9OwotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgU3liYXNlIGRlbGltaXRzIGlkZW50aWZpZXJzIHdpdGggYnJhY2tldHMgKFtdKTsgYnV0IGl0Ci0JICogY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byB1c2UgZG91YmxlLXF1b3Rlcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlib29sZWFuIGlkZW50aWZpZXJJc0RlbGltaXRlZChTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFja2V0ZWQoaWRlbnRpZmllcikKLQkJCQkJfHwgc3VwZXIuaWRlbnRpZmllcklzRGVsaW1pdGVkKGlkZW50aWZpZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1Vua25vd25DYXRhbG9nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Vbmtub3duQ2F0YWxvZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOWE3MjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1Vua25vd25DYXRhbG9nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hOwotCi0vKioKLSAqIENhdGFsb2cgc3RyYXRlZ3kgZm9yIHVua25vd24gRFRQIGRhdGFiYXNlcy4KLSAqIEBzZWUgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRDYXRhbG9ncygpCi0gKi8KLWNsYXNzIFVua25vd25DYXRhbG9nU3RyYXRlZ3kKLQlpbXBsZW1lbnRzIENhdGFsb2dTdHJhdGVneQotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIENhdGFsb2dTdHJhdGVneSBJTlNUQU5DRSA9IG5ldyBVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgQ2F0YWxvZ1N0cmF0ZWd5IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFVua25vd25DYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlMaXN0PENhdGFsb2c+IGNhdGFsb2dzID0gZGF0YWJhc2UuZ2V0Q2F0YWxvZ3MoKTsKLQkJaWYgKChjYXRhbG9ncyA9PSBudWxsKSB8fCBjYXRhbG9ncy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0aGlzLmdldEZhdXhDYXRhbG9nKGNhdGFsb2dzKSA9PSBudWxsOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0PENhdGFsb2c+IGdldENhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCUxpc3Q8Q2F0YWxvZz4gY2F0YWxvZ3MgPSBkYXRhYmFzZS5nZXRDYXRhbG9ncygpOwotCQkvLyBpZiB0aGVyZSBhcmUgbm8gY2F0YWxvZ3MsIHRoZSBkYXRhYmFzZSBtdXN0IGhvbGQgdGhlIHNjaGVtYXRhIGRpcmVjdGx5Ci0JCWlmICgoY2F0YWxvZ3MgPT0gbnVsbCkgfHwgY2F0YWxvZ3MuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQotCQlDYXRhbG9nIGZhdXhDYXRhbG9nID0gdGhpcy5nZXRGYXV4Q2F0YWxvZyhjYXRhbG9ncyk7Ci0JCXJldHVybiAoZmF1eENhdGFsb2cgPT0gbnVsbCkgPyBjYXRhbG9ncyA6IENvbGxlY3Rpb25zLjxDYXRhbG9nPmVtcHR5TGlzdCgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0PFNjaGVtYT4gZ2V0U2NoZW1hcyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlMaXN0PENhdGFsb2c+IGNhdGFsb2dzID0gZGF0YWJhc2UuZ2V0Q2F0YWxvZ3MoKTsKLQkJLy8gaWYgdGhlcmUgYXJlIG5vIGNhdGFsb2dzLCB0aGUgZGF0YWJhc2UgbXVzdCBob2xkIHRoZSBzY2hlbWF0YSBkaXJlY3RseQotCQlpZiAoKGNhdGFsb2dzID09IG51bGwpIHx8IGNhdGFsb2dzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGRhdGFiYXNlLmdldFNjaGVtYXMoKTsKLQkJfQotCi0JCUNhdGFsb2cgZmF1eENhdGFsb2cgPSB0aGlzLmdldEZhdXhDYXRhbG9nKGNhdGFsb2dzKTsKLQkJcmV0dXJuIChmYXV4Q2F0YWxvZyAhPSBudWxsKSA/IGZhdXhDYXRhbG9nLmdldFNjaGVtYXMoKSA6IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCXByaXZhdGUgQ2F0YWxvZyBnZXRGYXV4Q2F0YWxvZyhMaXN0PENhdGFsb2c+IGNhdGFsb2dzKSB7Ci0JCWlmIChjYXRhbG9ncy5zaXplKCkgPT0gMSkgewotCQkJQ2F0YWxvZyBjYXRhbG9nID0gY2F0YWxvZ3MuZ2V0KDApOwotCQkJaWYgKGNhdGFsb2cuZ2V0TmFtZSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBjYXRhbG9nOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1VucmVjb2duaXplZFZlbmRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1VucmVjb2duaXplZFZlbmRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTc1MTIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9VbnJlY29nbml6ZWRWZW5kb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgVW5yZWNvZ25pemVkVmVuZG9yCi0JZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBJTlNUQU5DRSA9IG5ldyBVbnJlY29nbml6ZWRWZW5kb3IoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBWZW5kb3IgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgVW5yZWNvZ25pemVkVmVuZG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuICJVbnJlY29nbml6ZWQgVmVuZG9yIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5vdCBzdXJlIHdoYXQgdG8gZG8gaGVyZS4uLi4KLQkgKiBBc3N1bWUgdGhlIERUUCBkYXRhYmFzZSBpcyBvcmdhbml6ZWQgaW50byBvbmUgb3IgbW9yZSBjYXRhbG9ncyBhbmQKLQkgKiB0aGUgc2NoZW1hdGEgYXJlIGNvbnRhaW5lZCBieSB0aG9zZSBjYXRhbG9ncy4gVGhpcyBhcHBlYXJzIHRvIGJlIHRoZQotCSAqIGRlZmF1bHQgd2F5IERUUCBidWlsZHMgbW9kZWxzIHRoZXNlIGRheXMgKGkuZS4gYSBkYXRhYmFzZSB3aXRoIGF0Ci0JICogbGVhc3Qgb25lIGNhdGFsb2csIGluc3RlYWQgb2YgdGhlIGRhdGFiYXNlIGhvbGRpbmcgc2NoZW1hdGEKLQkgKiBkaXJlY3RseSkuCi0JICovCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFVua25vd25DYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZTg4OTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1VwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogRm9sZCAibm9ybWFsIiBpZGVudGlmaWVycyB0byB1cHBlciBjYXNlLgotICogSWdub3JlIHRoZSBjYXNlIG9mICJub3JtYWwiIGlkZW50aWZpZXJzLgotICovCi1jbGFzcyBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kKLQlpbXBsZW1lbnRzIEZvbGRpbmdTdHJhdGVneQotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9sZGluZ1N0cmF0ZWd5IElOU1RBTkNFID0gbmV3IFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIEZvbGRpbmdTdHJhdGVneSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBmb2xkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZUlzRm9sZGVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc1VwcGVyY2FzZShuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWd1bGFySWRlbnRpZmllcnNBcmVDYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvVmVuZG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvVmVuZG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTJkMGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1ZlbmRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYTsKLQotLyoqCi0gKiBEZWxlZ2F0ZSB2ZW5kb3Itc3BlY2lmaWMgYmVoYXZpb3IgdG8gaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlOjx1bD4KLSAqICAgPGxpPmNhdGFsb2cgc3VwcG9ydAotICogICA8bGk+ZGVmYXVsdCBjYXRhbG9nIGFuZCBzY2hlbWEKLSAqICAgPGxpPmNvbnZlcnRpbmcgbmFtZXMgdG8gaWRlbnRpZmllcnMgYW5kIHZpY2UtdmVyc2EKLSAqIDwvdWw+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPjxicj4KLSAqIFdlIHVzZSA8ZW0+bmFtZTwvZW0+IHdoZW4gZGVhbGluZyB3aXRoIHRoZSB1bm1vZGlmaWVkIG5hbWUgb2YgYSBkYXRhYmFzZSBvYmplY3QKLSAqIGFzIHN1cHBsaWVkIGJ5IHRoZSBkYXRhYmFzZSBpdHNlbGYgKGkuZS4gaXQgaXMgbm90IGRlbGltaXRlZCBhbmQgaXQgaXMgYWx3YXlzCi0gKiBjYXNlLXNlbnNpdGl2ZSkuCi0gKiA8YnI+Ci0gKiBXZSB1c2UgPGVtPmlkZW50aWZpZXI8L2VtPiB3aGVuIGRlYWxpbmcgd2l0aCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGRhdGFiYXNlCi0gKiBvYmplY3QgbmFtZSAoaS5lLiBpdCBtYXkgYmUgZGVsaW1pdGVkIGFuZCwgZGVwZW5kaW5nIG9uIHRoZSB2ZW5kb3IsIGl0IG1heQotICogYmUgY2FzZS1pbnNlbnNpdGl2ZSkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmVuZG9yIHsKLQotCS8qKgotCSAqIFRoaXMgbXVzdCBtYXRjaCB0aGUgRFRQIHZlbmRvciBuYW1lLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlI2dldFZlbmRvcigpCi0JICovCi0JU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB2ZW5kb3Igc3VwcG9ydHMgInJlYWwiIGNhdGFsb2dzIChlLmcuIFN5YmFzZSkuCi0JICovCi0JYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlJ3MgY2F0YWxvZ3MuCi0JICovCi0JTGlzdDxDYXRhbG9nPiBnZXRDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBkYXRhYmFzZSdzIGRlZmF1bHQgY2F0YWxvZyBuYW1lcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIHVzZXIuIFRoZSBmaXJzdCBuYW1lIGluIHRoZSBsaXN0IHRoYXQgaWRlbnRpZmllcyBhIGNhdGFsb2cKLQkgKiB0aGF0IGV4aXN0cyBpcyAidGhlIiBkZWZhdWx0LgotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0RGVmYXVsdENhdGFsb2dOYW1lcyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlJ3Mgc2NoZW1hcy4KLQkgKi8KLQlMaXN0PFNjaGVtYT4gZ2V0U2NoZW1hcyhEYXRhYmFzZSBkYXRhYmFzZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBkYXRhYmFzZSdzIGRlZmF1bHQgc2NoZW1hIG5hbWVzIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgdXNlci4gVGhlIGZpcnN0IG5hbWUgaW4gdGhlIGxpc3QgdGhhdCBpZGVudGlmaWVzIGEgc2NoZW1hCi0JICogdGhhdCBleGlzdHMgaXMgInRoZSIgZGVmYXVsdC4KLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldERlZmF1bHRTY2hlbWFOYW1lcyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lKTsKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBkYXRhYmFzZSBvYmplY3QgbmFtZSB0byBhIHZlbmRvciBpZGVudGlmaWVyLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaWRlbnRpZmllciBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCBuYW1lLgotCSAqLwotCVN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlZmF1bHROYW1lKTsKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBkYXRhYmFzZSBvYmplY3QgbmFtZSB0byBhIHZlbmRvciBpZGVudGlmaWVyLgotCSAqLwotCVN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZGF0YWJhc2Ugb2JqZWN0IGlkZW50aWZpZXIgdG8gYSB2ZW5kb3IgbmFtZS4KLQkgKi8KLQlTdHJpbmcgY29udmVydElkZW50aWZpZXJUb05hbWUoU3RyaW5nIGlkZW50aWZpZXIpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvVmVuZG9yUmVwb3NpdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1ZlbmRvclJlcG9zaXRvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY4ZjA5ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvVmVuZG9yUmVwb3NpdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBWZW5kb3JSZXBvc2l0b3J5IHsKLQlwcml2YXRlIGZpbmFsIFZlbmRvcltdIHZlbmRvcnM7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3JSZXBvc2l0b3J5IElOU1RBTkNFID0gbmV3IFZlbmRvclJlcG9zaXRvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVuZG9yUmVwb3NpdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBWZW5kb3JSZXBvc2l0b3J5KCkgewotCQlzdXBlcigpOwotCQl0aGlzLnZlbmRvcnMgPSB0aGlzLmJ1aWxkVmVuZG9ycygpOwotCX0KLQotCXByaXZhdGUgVmVuZG9yW10gYnVpbGRWZW5kb3JzKCkgewotCQlBcnJheUxpc3Q8VmVuZG9yPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxWZW5kb3I+KCk7Ci0JCXRoaXMuYWRkVmVuZG9yc1RvKGxpc3QpOwotCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBWZW5kb3JbbGlzdC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVmVuZG9yc1RvKEFycmF5TGlzdDxWZW5kb3I+IGxpc3QpIHsKLQkJdGhpcy5hZGRWZW5kb3JUbyhEQjIudWRiKCksIGxpc3QpOwotCQl0aGlzLmFkZFZlbmRvclRvKERCMi51ZGJJU2VyaWVzKCksIGxpc3QpOwotCQl0aGlzLmFkZFZlbmRvclRvKERCMi51ZGJaU2VyaWVzKCksIGxpc3QpOwotCQl0aGlzLmFkZFZlbmRvclRvKERlcmJ5Lmluc3RhbmNlKCksIGxpc3QpOwotCQl0aGlzLmFkZFZlbmRvclRvKEhTUUxEQi5pbnN0YW5jZSgpLCBsaXN0KTsKLQkJdGhpcy5hZGRWZW5kb3JUbyhJbmZvcm1peC5pbnN0YW5jZSgpLCBsaXN0KTsKLQkJdGhpcy5hZGRWZW5kb3JUbyhNYXhEQi5pbnN0YW5jZSgpLCBsaXN0KTsKLQkJdGhpcy5hZGRWZW5kb3JUbyhNeVNRTC5pbnN0YW5jZSgpLCBsaXN0KTsKLQkJdGhpcy5hZGRWZW5kb3JUbyhPcmFjbGUuaW5zdGFuY2UoKSwgbGlzdCk7Ci0JCXRoaXMuYWRkVmVuZG9yVG8oUG9zdGdyZVNRTC5pbnN0YW5jZSgpLCBsaXN0KTsKLQkJdGhpcy5hZGRWZW5kb3JUbyhTUUxTZXJ2ZXIuaW5zdGFuY2UoKSwgbGlzdCk7Ci0JCXRoaXMuYWRkVmVuZG9yVG8oU3liYXNlLmFzYSgpLCBsaXN0KTsKLQkJdGhpcy5hZGRWZW5kb3JUbyhTeWJhc2UuYXNlKCksIGxpc3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRWZW5kb3JUbyhWZW5kb3IgdmVuZG9yLCBBcnJheUxpc3Q8VmVuZG9yPiBsaXN0KSB7Ci0JCVN0cmluZyBuYW1lID0gdmVuZG9yLmdldERUUFZlbmRvck5hbWUoKTsKLQkJZm9yIChJdGVyYXRvcjxWZW5kb3I+IHN0cmVhbSA9IGxpc3QuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5nZXREVFBWZW5kb3JOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRHVwbGljYXRlIHZlbmRvcjogIiArIG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJbGlzdC5hZGQodmVuZG9yKTsKLQl9Ci0KLQlwdWJsaWMgVmVuZG9yIGdldFZlbmRvcihTdHJpbmcgZHRwVmVuZG9yTmFtZSkgewotCQlmb3IgKGludCBpID0gdGhpcy52ZW5kb3JzLmxlbmd0aDsgaS0tID4gMDspIHsKLQkJCVZlbmRvciB2ZW5kb3IgPSB0aGlzLnZlbmRvcnNbaV07Ci0JCQlpZiAodmVuZG9yLmdldERUUFZlbmRvck5hbWUoKS5lcXVhbHMoZHRwVmVuZG9yTmFtZSkpIHsKLQkJCQlyZXR1cm4gdmVuZG9yOwotCQkJfQotCQl9Ci0JCXJldHVybiBVbnJlY29nbml6ZWRWZW5kb3IuaW5zdGFuY2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2NzBmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOTIzYTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNC4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuaGVscDtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cztidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Fib3V0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTkxMzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Fib3V0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QWJvdXQgdGhpcyBjb250ZW50PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkFib3V0IHRoaXMgY29udGVudCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMjk1IiBuYW1lPSJzdGhyZWYyOTUiPjwvYT4KLTxoMT5BYm91dCB0aGlzIGNvbnRlbnQ8L2gxPgotPHA+Tm92ZW1iZXIsIDIwMDk8L3A+Ci08YSBpZD0ic3RocmVmMjk2IiBuYW1lPSJzdGhyZWYyOTYiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+TGljZW5zZTwvcD4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT48L2NvZGU+LiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPjwvY29kZT4uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhODRlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QWJvdXQgdGhpcyBjb250ZW50PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMTEtMTZUOTo1NjoyM1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJBYm91dCB0aGlzIGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMy4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjI5MCIgbmFtZT0ic3RocmVmMjkwIj48L2E+Ci08aDE+QWJvdXQgdGhpcyBjb250ZW50PC9oMT4KLTxwPk5vdmVtYmVyLCAyMDA5PC9wPgotPGEgaWQ9InN0aHJlZjI5MSIgbmFtZT0ic3RocmVmMjkxIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkxpY2Vuc2U8L3A+Ci08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+PC9jb2RlPi4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT48L2NvZGU+LjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNDIxMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gY2hlYXRzaGVldHMvLFwKLSAgICAgICAgICAgICAgIGRjb21tb24vLFwKLSAgICAgICAgICAgICAgIGltZy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb25jZXB0X21hcHBpbmcuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRzLmh0bSxcCi0gICAgICAgICAgICAgICBjb25jZXB0czAwMS5odG0sXAotICAgICAgICAgICAgICAgY29uY2VwdHMwMDIuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRzMDAzLmh0bSxcCi0gICAgICAgICAgICAgICBjb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkLmh0bSxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIGdldHRpbmdfc3RhcnRlZDAwMi5odG0sXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkMDAzLmh0bSxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIGluZGV4LnhtbCxcCi0gICAgICAgICAgICAgICBsZWdhbC5odG0sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICByZWZfZGV0YWlsc19vcm0uaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9qcGFfZmFjZXQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9uZXdfanBhX3Byb2plY3QuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wcmltYXJ5X2tleS5odG0sXAotICAgICAgICAgICAgICAgcmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwMi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDAzLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwNS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA2Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwOC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTAuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxMS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDEyLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTMuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxNC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE1Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTYuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxNy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE4Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0sXAotICAgICAgICAgICAgICAgdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0sXAotICAgICAgICAgICAgICAgdGFza19pbmhlcml0YW5jZS5odG0sXAotICAgICAgICAgICAgICAgdGFza19tYW5hZ2Vfb3JtLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0sXAotICAgICAgICAgICAgICAgdGFza19tYXBwaW5nLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrcy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDAyLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwMy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA1Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwNi5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDcuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA4Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwOS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTAuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDExLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxMi5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTMuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE0Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxNS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTYuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE3Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxOC5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTkuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDIwLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAyMS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjIuaHRtLFwKLSAgICAgICAgICAgICAgIHRpcHNfYW5kX3RyaWNrcy5odG0sXAotICAgICAgICAgICAgICAgdG9jLnhtbCxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwMS5odG0sXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3MDAyLmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDMuaHRtLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTkuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyMC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDIxLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjIuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyMy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyNi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI3Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjguaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAzMC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMzEuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAzMi5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjMuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDI0Lmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwNS5odG0sXAotICAgICAgICAgICAgICAgcmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfRW50aXR5Q2xhc3NQYWdlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9hZGRfY29udmVydGVyLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfYXNzb2NpYXRpb25fY2FyZGluYWxpdHkuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9hc3NvY2lhdGlvbl90YWJsZS5odG0sXAotICAgICAgICAgICAgICAgcmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0sXAotICAgICAgICAgICAgICAgcmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfamF2YV9wYWdlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfam9pbl9jb2x1bW5zLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0sXAotICAgICAgICAgICAgICAgcmVmX3NlbGVjdFRhYmxlcy5odG0sXAotICAgICAgICAgICAgICAgcmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0sXAotICAgICAgICAgICAgICAgcmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfY29uZmlndXJlX2pheGJfY2xhc3NfZ2VuZXJhdGlvbl9kaWFsb2cuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9zY2hlbWFfZnJvbV9jbGFzc2VzX3BhZ2UuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAzMy5odG0sXAotICAgICAgICAgICAgICAgdGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2dlbmVyYXRpbmdfc2NoZW1hX2Zyb21fY2xhc3Nlcy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjUuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDI2Lmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDYuaHRtCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL2FkZF9wZXJzaXN0ZW5jZS54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvYWRkX3BlcnNpc3RlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZWVkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvYWRkX3BlcnNpc3RlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hlYXRzaGVldCB0aXRsZT0iQ3JlYXRlIGEgSlBBIFByb2plY3QiPgotICAgPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgYXV0b21hdGljYWxseSBsYXVuY2ggd2l6YXJkcywgcGVyZm9ybSBhY3Rpb25zLCBhbmQgZ3VpZGUgeW91IHRocm91Z2ggdGhlIHN0ZXBzIHRvIGNyZWF0ZSBhIEpQQSBwcm9qZWN0LiAKLQotVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyBjaGVhdCBzaGVldHMsIG9yIHRvIHNlZSBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNoZWF0IHNoZWV0cywgY2xpY2sgSGVscCAoPykuIAotVG8gc3RhcnQgd29yayB3b3JraW5nIG9uIHRoaXMgY2hlYXQgc2hlZXQgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIEJlZ2luJnF1b3Q7IGJ1dHRvbiBiZWxvdy4gCi0KLUxldCZhcG9zO3MgZ2V0IHN0YXJ0ZWQhCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pbnRybz4KLSAgIDxpdGVtIHRpdGxlPSJTZXR1cCB0aGUgRW52aXJvbm1lbnQiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuZG9jLnVzZXIvY19kYXRhYmFzZV9kZXZlbG9wbWVudF9zZXR1cC5odG1sIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFlvdXIgZW52aXJvbm1lbnQgbXVzdCBiZSBzZXQgdXAgYmVmb3JlIHlvdSBjYW4gcGVyZm9ybSB0aGUgc3RlcHMgaW4gdGhpcyBjaGVhdCBzaGVldC4gCi0KLUNyZWF0ZSBhIGRhdGFiYXNlIHByb2ZpbGUgYW5kIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotCi1UaGUgRGF0YWJhc2UgQ29ubmVjdGlvbiBkaWFsb2cgYXV0b21hdGljYWxseSBhcHBlYXJzIHdoZW4geW91IGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBQZXJmb3JtJnF1b3Q7IGJ1dHRvbi4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8Y29tbWFuZCBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuc3FsZWRpdG9yLmF0dGFjaFByb2ZpbGVBY3Rpb24iIGNvbmZpcm09ImZhbHNlIj4KLSAgICAgIDwvY29tbWFuZD4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJDcmVhdGUgYSBKUEEgUHJvamVjdCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFVzZSB0aGUgTmV3IFByb2plY3QgV2l6YXJkIHRvIGNyZWF0ZSBhIEpQQSBwcm9qZWN0LiAKLVNlbGVjdCA8Yj5GaWxlLSZndDtOZXctJmd0O1Byb2plY3QuLi48L2I+IGFuZCBjaG9vc2UgPGI+SlBBLSZndDtKUEEgUHJvamVjdDwvYj4gaW4gdGhlIGxpc3QuIAotCi1PbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgd2l6YXJkLCBlbnRlciBhIHByb2plY3QgbmFtZSBhbmQgbG9jYXRpb24sIHNlbGVjdCB5b3VyIHRhcmdldCBydW50aW1lLCBhbmQgc2VsZWN0IGEgcHJlZGVmaW5lZCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24uCi0KLUNsaWNrIDxiPk5leHQ8L2I+IHRvIGRpc3BsYXkgdGhlIG5leHQgcGFnZSBvZiB0aGUgd2l6YXJkLgotCi1UaGUgJnF1b3Q7TmV3IEpQQSBQcm9qZWN0JnF1b3Q7IHdpemFyZCBpcyBhdXRvbWF0aWNhbGx5IGRpc3BsYXllZCB3aGVuIHlvdSBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gUGVyZm9ybSZxdW90OyBidXR0b24uCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuT3BlblByb2plY3RXaXphcmRBY3Rpb24iIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5qZHQudWkiIGNvbmZpcm09ImZhbHNlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IlNlbGVjdCBQcm9qZWN0IEZhY2V0IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1wcm9qZWN0cy5odG1sIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFVzZSB0aGUgUHJvamVjdCBGYWNldCBwYWdlIHRvIHNlbGVjdCBhIHByZWRlZmluZWQgcHJvamVjdCBjb25maWd1cmF0aW9uIG9yIHNwZWNpZmljIHNwZWNpZmljIGZhY2V0cyB0byBpbmNsdWRlIGluIHRoZSBwcm9qZWN0LiAKLQotQ2xpY2sgJnF1b3Q7TmV4dCZxdW90OyB0byBkaXNwbGF5IHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIHdpemFyZC4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iU3BlY2lmeSB0aGUgSlBBIEZhY2V0IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpkdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBVc2UgdGhlIEpQQSBGYWNldCBwYWdlIHRvIHNwZWNpZnkgdGhlIHRoZSB2ZW5kb3Itc3BlY2lmaWMgSlBBIHBsYXRmb3JtLCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2UsIGFuZCB0aGUgc3BlY2lmaWMgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkuIAotCi1Zb3UgY2FuIGFsc28gc3BlY2lmeSBpZiBEYWxpIHNob3VsZCBjcmVhdGUgYW4gb3JtLnhtbCBmaWxlLgotCi1JZiB5b3UgZG8gbm90IGhhdmUgYW4gYWN0aXZlIGRhdGFiYXNlIGNvbm5lY3Rpb24sIGNsaWNrIDxiPkFkZCBDb25uZWN0aW9uczwvYj4gdG8gY3JlYXRlIG9uZS4gCi0KLUlmIHlvdSBkbyBub3QgaGF2ZSBhIGRlZmluZWQgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnksIGNsaWNrIDxiPkNvbmZpZ3VyZSBkZWZhdWx0IEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5PC9iPiBvciA8Yj5Db25maWd1cmUgdXNlciBsaWJyYXJpZXM8L2I+IHRvIGRlZmluZSBvbmUuIAotCi1DbGljayA8Yj5GaW5pc2g8L2I+IHRvIGNvbXBsZXRlIHRoZSB3aXphcmQgYW5kIG9wZW4gdGhlIG9wZW4gdGhlIHByb2plY3QuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkZpbmlzaCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISBZb3UgaGF2ZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhIEpQQSBwcm9qZWN0LiBDb21wbGV0ZSB0aGUgYWRkaXRpb25hbCBjaGVhdCBzaGVldHMgdG8gYWRkIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcyBhbmQgbWFwIHRob3NlIGVudGl0aWVzIHRvIGRhdGFiYXNlIHRhYmxlcy4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlX2VudGl0eS54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlX2VudGl0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NGU4YWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZV9lbnRpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgYSBQZXJzaXN0ZW50IEVudGl0eSI+Ci0JPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0JCTxkZXNjcmlwdGlvbj4KLVRoaXMgY2hlYXQgc2hlZXQgd2lsbCBhdXRvbWF0aWNhbGx5IGxhdW5jaCB3aXphcmRzLCBwZXJmb3JtIGFjdGlvbnMsIGFuZCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgdG8gYWRkIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB0byB5b3VyIEphdmEgcHJvamVjdC4gCi1UbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIGNoZWF0IHNoZWV0cyBvciB0byBzZWUgYSBsaXN0IG9mIGF2YWlsYWJsZSBjaGVhdCBzaGVldHMsIGNsaWNrIEhlbHAgKD8pLiAKLVRvIHN0YXJ0IHdvcmsgd29ya2luZyBvbiB0aGlzIGNoZWF0IHNoZWV0LCBjbGljayB0aGUgPGI+Q2xpY2sgdG8gQmVnaW48L2I+IGJ1dHRvbiBiZWxvdy4gCi1MZXQncyBnZXQgc3RhcnRlZCEKLSAgPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCTxpdGVtIHRpdGxlPSJDcmVhdGUgYSBKUEEgUHJvamVjdCIgc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj4KLVRvIGNyZWF0ZSBhIFBlcnNpc3RlbnQgZW50aXR5LCB5b3UgbXVzdCBjcmVhdGUgYSBKUEEgcHJvamVjdC4gSWYgeW91IGFscmVhZHkgaGF2ZSBhIEpQQSBwcm9qZWN0LCB5b3UgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAiQ2xpY2sgdG8gU2tpcCIgYnV0dG9uLgotSWYgbm90LCBzZWxlY3QgPGI+RmlsZS0+TmV3LT5Qcm9qZWN0Li4uPC9iPiBhbmQgY2hvb3NlIDxiPkpQQS0+SlBBIFByb2plY3Q8L2I+IGluIHRoZSBsaXN0LiBDb21wbGV0ZSBlYWNoIHBhZ2Ugb2YgdGhlIENyZWF0ZSBKUEEgUHJvamVjdCB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IEpQQSBwcm9qZWN0LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9Ik9wZW4gdGhlIEpQQSBEZXZlbG9wbWVudCBQZXJzcGVjdGl2ZSIgc2tpcD0idHJ1ZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtIj4KLQkJPGFjdGlvbiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jaGVhdHNoZWV0cy5hY3Rpb25zLk9wZW5QZXJzcGVjdGl2ZSIgcGFyYW0xPSJvcmcuZWNsaXBzZS5qcHQudWkuUGVyc2lzdGVuY2VQZXJzcGVjdGl2ZSIvPgotCQk8ZGVzY3JpcHRpb24+Ci1XaGVuIHdvcmtpbmcgd2l0aCBKUEEgIHBlcnNpc3RlbmNlLCB5b3Ugc2hvdWxkIHVzZSB0aGUgUGVyc2lzdGVuY2UgcGVyc3BlY3RpdmUuIElmIHlvdSBhbHJlYWR5IGhhdmUgdGhlIFBlcnNpc3RlbmNlIHBlcnNwZWN0aXZlIGFjdGl2ZSwgeW91IG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgIkNsaWNrIHRvIFNraXAiIGJ1dHRvbi4gCi1JZiBub3QsIHNlbGVjdCA8Yj5XaW5kb3ctPk9wZW4gUGVyc3BlY3RpdmUtPk90aGVyPC9iPiBpbiB0aGUgbWVudWJhciBhdCB0aGUgdG9wIG9mIHRoZSB3b3JrYmVuY2guIEluIHRoZSBTZWxlY3QgUGVyc3BlY3RpdmVzIGRpYWxvZywgc2VsZWN0IDxiPkpQQSBEZXZlbG9wbWVudDwvYj4gYW5kIGNsaWNrIE9LLiBUaGlzIHN0ZXAgY2hhbmdlcyB0aGUgcGVyc3BlY3RpdmUgdG8gc2V0IHVwIHRoZSBFY2xpcHNlIHdvcmtiZW5jaCBmb3IgSlBBIGRldmVsb3BtZW50LgotWW91IGNhbiBjbGljayB0aGUgIkNsaWNrIHRvIFBlcmZvcm0iIGJ1dHRvbiB0byBoYXZlIHRoZSAiUGVyc2lzdGVuY2UiIHBlcnNwZWN0aXZlIG9wZW5lZCBhdXRvbWF0aWNhbGx5LgotICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIEphdmEgQ2xhc3MiPgotCQk8ZGVzY3JpcHRpb24+Ci1UaGUgbmV4dCBzdGVwIGlzIHRvIGNyZWF0ZSBhIG5ldyBKYXZhIGNsYXNzLiBJbiB0aGUgbWFpbiB0b29sYmFyIGFnYWluLCBjbGljayBvbiA8Yj5OZXcgSmF2YSBDbGFzczwvYj4gYnV0dG9uIChvciB0aGUgbGluayBiZWxvdykuCi1UaGUgSmF2YSBlZGl0b3Igd2lsbCBhdXRvbWF0aWNhbGx5IG9wZW4gc2hvd2luZyB5b3VyIG5ldyBjbGFzcy4gICAgICAKLSAgICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIFBlcnNpc3RlbnQgRW50aXR5Ij4KLQkJPGRlc2NyaXB0aW9uPgotRmluYWxseSB3ZSB3aWxsIG1ha2UgdGhlIEphdmEgY2xhc3MgYSBwZXJzaXN0ZW50IGVudGl0eS4KLUluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcgc2VsZWN0IHRoZSBKYXZhIGNsYXNzLiAKLUluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCB1c2UgdGhlICJNYXAgQXMiIGZpZWxkIHRvIHNlbGVjdCA8Yj5FbnRpdHk8L2I+LiBEYWxpIGF1dG9tYXRpY2FsbHkgYWRkcyB0aGUgQEVudGl0eSBhbm5vdGF0aW9uIHRvIHRoZSBjbGFzcyBpbiB0aGUgSmF2YSBlZGl0b3IuIAotVXNlIHRoZSBUYWJsZSwgQ2F0YWxvZywgYW5kIFNjaGVtYSBmaWVsZHMgdG8gYXNzb2NpYXRlIHRoZSBlbnRpdHkgd2l0aCBhIHNwZWNpZmljIHRhYmxlIGluIHRoZSBkYXRhYmFzZS4KLSAgICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkZpbmlzaCI+Ci0JCTxkZXNjcmlwdGlvbj4KLUNvbmdyYXR1bGF0aW9ucyEgWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGFkZGVkIGEgSlBBIGVudGl0eSB0byB5b3VyIEpQQSBwcm9qZWN0LiBDb21wbGV0ZSB0aGUgYWRkaXRpb25hbCBjaGVhdCBzaGVldHMgdG8gbWFwIHRoZSBlbnRpdHkncyBmaWVsZHMgdG8gZGF0YWJhc2UgdGFibGVzLgotICA8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9tYXBfZW50aXR5LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9tYXBfZW50aXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzMDdmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvbWFwX2VudGl0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNoZWF0c2hlZXQgdGl0bGU9Ik1hcCBhIEphdmEgUGVyc2lzdGVudCBFbnRpdHkiPgotICAgPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgYXV0b21hdGljYWxseSBsYXVuY2ggd2l6YXJkcywgcGVyZm9ybSBhY3Rpb25zLCBhbmQgZ3VpZGUgeW91IHRocm91Z2ggdGhlIHN0ZXBzIHRvIG1hcCB0aGUgZmllbGRzIG9mIGEgSlBBIGVudGl0eSBlbnRpdHkgdG8geW91ciBkYXRhYmFzZS4KLQotVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyBjaGVhdCBzaGVldHMgb3IgdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgY2hlYXQgc2hlZXRzLCBjbGljayBIZWxwICg/KS4gCi1UbyBzdGFydCB3b3JrIHdvcmtpbmcgb24gdGhpcyBjaGVhdCBzaGVldCwgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIEJlZ2luJnF1b3Q7IGJ1dHRvbiBiZWxvdy4gCi0KLUxldCZhcG9zO3MgZ2V0IHN0YXJ0ZWQhCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pbnRybz4KLSAgIDxpdGVtIHRpdGxlPSJTZXR1cCB0aGUgRW52aXJvbm1lbnQiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuZG9jLnVzZXIvY19kYXRhYmFzZV9kZXZlbG9wbWVudF9zZXR1cC5odG1sIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFlvdXIgZW52aXJvbm1lbnQgbXVzdCBiZSBzZXQgdXAgYmVmb3JlIHlvdSBjYW4gcGVyZm9ybSB0aGUgc3RlcHMgaW4gdGhpcyBjaGVhdCBzaGVldC4gCi0KLUNyZWF0ZSBhIGRhdGFiYXNlIHByb2ZpbGUgYW5kIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotCi1JZiB5b3UgYWxyZWFkeSBoYXZlIChhbmQgYXJlIGNvbm5lY3RlZCB0bykgYSBkYXRhYmFzZSBjb25uZWN0aW9uLCB5b3UgIG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgJnF1b3Q7Q2xpY2sgdG8gU2tpcCZxdW90OyBidXR0b24uCi0KLVRoZSBEYXRhYmFzZSBDb25uZWN0aW9uIGRpYWxvZyBhdXRvbWF0aWNhbGx5IGFwcGVhcnMgd2hlbiB5b3UgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIFBlcmZvcm0mcXVvdDsgYnV0dG9uLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxjb21tYW5kIHNlcmlhbGl6YXRpb249Im9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5zcWxlZGl0b3IuYXR0YWNoUHJvZmlsZUFjdGlvbiIgY29uZmlybT0iZmFsc2UiPgotICAgICAgPC9jb21tYW5kPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIEpQQSBQcm9qZWN0IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJ0cnVlIiBocmVmPSIvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBVc2UgdGhlIE5ldyBQcm9qZWN0IFdpemFyZCB0byBjcmVhdGUgYSBKUEEgcHJvamVjdC4gCi1TZWxlY3QgPGI+RmlsZS0mZ3Q7TmV3LSZndDtQcm9qZWN0Li4uPC9iPiBhbmQgY2hvb3NlIDxiPkpQQS0mZ3Q7SlBBIFByb2plY3Q8L2I+IGluIHRoZSBsaXN0LiAKLQotQ29tcGxldGUgZWFjaCBwYWdlIG9mIHRoZSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IEpQQSBwcm9qZWN0LgotCi1UaGUgJnF1b3Q7TmV3IEpQQSBQcm9qZWN0JnF1b3Q7IHdpemFyZCBpcyBhdXRvbWF0aWNhbGx5IGRpc3BsYXllZCB3aGVuIHlvdSBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gUGVyZm9ybSZxdW90OyBidXR0b24uCi0KLUlmIHlvdSBhbHJlYWR5IGhhdmUgYSBKUEEgcHJvamVjdCwgeW91ICBtYXkgc2tpcCB0aGlzIHN0ZXAgYnkgY2xpY2tpbmcgdGhlICZxdW90O0NsaWNrIHRvIFNraXAmcXVvdDsgYnV0dG9uLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxhY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLk9wZW5Qcm9qZWN0V2l6YXJkQWN0aW9uIiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UuamR0LnVpIiBjb25maXJtPSJmYWxzZSI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJPcGVuIHRoZSBKUEEgRGV2ZWxvcG1lbnQgUGVyc3BlY3RpdmUiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBXaGVuIHdvcmtpbmcgd2l0aCBKUEEgIHBlcnNpc3RlbmNlLCB5b3Ugc2hvdWxkIHVzZSB0aGUgUGVyc2lzdGVuY2UgcGVyc3BlY3RpdmUuIElmIHlvdSBhbHJlYWR5IGhhdmUgdGhlIFBlcnNpc3RlbmNlIHBlcnNwZWN0aXZlIGFjdGl2ZSwgeW91IG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgJnF1b3Q7Q2xpY2sgdG8gU2tpcCZxdW90OyBidXR0b24uIAotSWYgbm90LCBzZWxlY3QgPGI+V2luZG93LSZndDtPcGVuIFBlcnNwZWN0aXZlLSZndDtPdGhlcjwvYj4gaW4gdGhlIG1lbnViYXIgYXQgdGhlIHRvcCBvZiB0aGUgd29ya2JlbmNoLiBJbiB0aGUgU2VsZWN0IFBlcnNwZWN0aXZlcyBkaWFsb2csIHNlbGVjdCA8Yj5KUEEgRGV2ZWxvcG1lbnQ8L2I+IGFuZCBjbGljayBPSy4gVGhpcyBzdGVwIGNoYW5nZXMgdGhlIHBlcnNwZWN0aXZlIHRvIHNldCB1cCB0aGUgRWNsaXBzZSB3b3JrYmVuY2ggZm9yIEpQQSBkZXZlbG9wbWVudC4KLVlvdSBjYW4gY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIFBlcmZvcm0mcXVvdDsgYnV0dG9uIHRvIGhhdmUgdGhlICZxdW90O1BlcnNpc3RlbmNlJnF1b3Q7IHBlcnNwZWN0aXZlIG9wZW5lZCBhdXRvbWF0aWNhbGx5LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxhY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLmFjdGlvbnMuT3BlblBlcnNwZWN0aXZlIiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiIGNvbmZpcm09ImZhbHNlIiBwYXJhbTE9Im9yZy5lY2xpcHNlLmpwdC51aS5QZXJzaXN0ZW5jZVBlcnNwZWN0aXZlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIEphdmEgQ2xhc3MiIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRoZSBuZXh0IHN0ZXAgaXMgdG8gY3JlYXRlIGEgbmV3IEphdmEgY2xhc3MuIEluIHRoZSBtYWluIHRvb2xiYXIgYWdhaW4sIGNsaWNrIG9uIDxiPk5ldyBKYXZhIENsYXNzPC9iPiBidXR0b24gKG9yIHRoZSBsaW5rIGJlbG93KS4KLVRoZSBKYXZhIGVkaXRvciB3aWxsIGF1dG9tYXRpY2FsbHkgb3BlbiBzaG93aW5nIHlvdXIgbmV3IGNsYXNzLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJDcmVhdGUgYSBQZXJzaXN0ZW50IEVudGl0eSIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgRmluYWxseSB3ZSB3aWxsIG1ha2UgdGhlIEphdmEgY2xhc3MgYSBwZXJzaXN0ZW50IGVudGl0eS4KLUluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcgc2VsZWN0IHRoZSBKYXZhIGNsYXNzLiAKLUluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCB1c2UgdGhlICZxdW90O01hcCBBcyZxdW90OyBmaWVsZCB0byBzZWxlY3QgPGI+RW50aXR5PC9iPi4gRGFsaSBhdXRvbWF0aWNhbGx5IGFkZHMgdGhlIEBFbnRpdHkgYW5ub3RhdGlvbiB0byB0aGUgY2xhc3MgaW4gdGhlIEphdmEgZWRpdG9yLiAKLVVzZSB0aGUgVGFibGUsIENhdGFsb2csIGFuZCBTY2hlbWEgZmllbGRzIHRvIGFzc29jaWF0ZSB0aGUgZW50aXR5IHdpdGggYSBzcGVjaWZpYyB0YWJsZSBpbiB0aGUgZGF0YWJhc2UuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkFkZCBGaWVsZHMgdG8gdGhlIENsYXNzIiBkaWFsb2c9ImZhbHNlIiBza2lwPSJ0cnVlIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIE5vdyB5b3Ugd2lsbCBhZGQgc29tZSBmaWVsZHMgdG8gdGhlIGVudGl0eSB0byBtYXAgdG8gcm93cyBpbiB0aGUgZGF0YWJhc2UgdGFibGUuICAgCi0KLUlmIHlvdXIgcGVyc2lzdGVudCBlbnRpdHkgYWxyZWFkeSBoYXMgZmllbGRzIHRvIG1hcCwgeW91IG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgJnF1b3Q7Q2xpY2sgdG8gU2tpcCZxdW90OyBidXR0b24uIElmIG5vdCwgdXNlIHRoZSBKYXZhIGVkaXRvciB0byBhZGQgZmllbGRzIHRvIHRoZSBlbnRpdHkuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY2hlYXRzaGVldHMuYWN0aW9ucy5PcGVuUGVyc3BlY3RpdmUiIHBsdWdpbklkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIgY29uZmlybT0iZmFsc2UiIHBhcmFtMT0ib3JnLmVjbGlwc2UuZGFsaS51aS5QZXJzaXN0ZW5jZVBlcnNwZWN0aXZlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkNyZWF0ZSB0aGUgTWFwcGluZyIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiIGhyZWY9Ii9vcmcuZWNsaXBzZS5kYWxpLmRvYy51c2VyL3JlZl9lbnRpdHlfcGFnZS5odG0iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgTm93IHlvdSBhcmUgcmVhZHkgdG8gbWFwIHRoZSBlbnRpdHkgZmllbGRzIHRvIGNvbHVtbnMgaW4gdGhlIGRhdGFiYXNlIHRhYmxlLiBJbiB0aGUgUGFja2FnZSBFeHBsb3Jlciwgc2VsZWN0IHRoZSBKYXZhIGNsYXNzLiAKLQotSW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldywgZXhwYW5kIHRoZSBwZXJzaXN0ZW50IGVudGl0eSB0byBkaXNwbGF5IHRoZSBmaWVsZHMuIFNlbGVjdCBhIGZpZWxkLiAKLQotVGhlIEpQQSBEZXRhaWxzIHZpZXcgZGlzcGxheXMgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgZmllbGQuIFVzZSB0aGUgTWFwIEFzIGZpZWxkIHRvIHNlbGVjdCB0aGUgQmFzaWMgbWFwcGluZy4gVXNlIHRoZSBDb2x1bW4gZmllbGQgdG8gc2VsZWN0IGEgY29sdW1uIGZyb20gdGhlIGRhdGFiYXNlIHRhYmxlLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxhY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLmFjdGlvbnMuT3BlblBlcnNwZWN0aXZlIiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiIGNvbmZpcm09ImZhbHNlIiBwYXJhbTE9Im9yZy5lY2xpcHNlLmRhbGkudWkuUGVyc2lzdGVuY2VQZXJzcGVjdGl2ZSI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJGaW5pc2giIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IG1hcHBlZCB0aGUgZmllbGRzIGZyb20gYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHRvIGEgY29sdW1uIGluIGEgZGF0YWJhc2UgdGFibGUuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfbWFwcGluZy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9tYXBwaW5nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmN2Q5Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9tYXBwaW5nLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQkRKRkkiIG5hbWU9IkJBQkJESkZJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIxIiBuYW1lPSJzdGhyZWYyMSI+PC9hPjxhIGlkPSJzdGhyZWYyMiIgbmFtZT0ic3RocmVmMjIiPjwvYT5UaGUgRGFsaSBPUiAob2JqZWN0LXJlbGF0aW9uYWwpIE1hcHBpbmcgVG9vbCBhbGxvd3MgeW91IHRvIGRlc2NyaWJlIGhvdyB5b3VyIGVudGl0eSBvYmplY3RzIDxzcGFuIGNsYXNzPSJpdGFsaWMiPm1hcDwvc3Bhbj4gdG8gdGhlIGRhdGEgc291cmNlIChvciBvdGhlciBvYmplY3RzKS4gVGhpcyBhcHByb2FjaCBpc29sYXRlcyBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvYmplY3QgbW9kZWwmbmRhc2g7ZGV2ZWxvcGVycyBhcmUgZnJlZSB0byBkZXNpZ24gdGhlaXIgaWRlYWwgb2JqZWN0IG1vZGVsLCBhbmQgREJBcyBhcmUgZnJlZSB0byBkZXNpZ24gdGhlaXIgaWRlYWwgc2NoZW1hLjwvcD4KLTxwPlRoZXNlIG1hcHBpbmdzIHRyYW5zZm9ybSBhbiBvYmplY3QgZGF0YSBtZW1iZXIgdHlwZSB0byBhIGNvcnJlc3BvbmRpbmcgcmVsYXRpb25hbCBkYXRhYmFzZSBkYXRhIHNvdXJjZSByZXByZXNlbnRhdGlvbi4gVGhlc2UgT1IgbWFwcGluZ3MgY2FuIGFsc28gdHJhbnNmb3JtIG9iamVjdCBkYXRhIG1lbWJlcnMgdGhhdCByZWZlcmVuY2Ugb3RoZXIgZG9tYWluIG9iamVjdHMgc3RvcmVkIGluIG90aGVyIHRhYmxlcyBpbiB0aGUgZGF0YWJhc2UgYW5kIGFyZSByZWxhdGVkIHRocm91Z2ggZm9yZWlnbiBrZXlzLjwvcD4KLTxwPllvdSBjYW4gdXNlIHRoZXNlIG1hcHBpbmdzIHRvIG1hcCBzaW1wbGUgZGF0YSB0eXBlcyBpbmNsdWRpbmcgcHJpbWl0aXZlcyAoc3VjaCBhcyA8Y29kZT5pbnQ8L2NvZGU+KSwgSkRLIGNsYXNzZXMgKHN1Y2ggYXMgPGNvZGU+U3RyaW5nPC9jb2RlPiksIGFuZCBsYXJnZSBvYmplY3QgKExPQikgdmFsdWVzLiBZb3UgY2FuIGFsc28gdXNlIHRoZW0gdG8gdHJhbnNmb3JtIG9iamVjdCBkYXRhIG1lbWJlcnMgdGhhdCByZWZlcmVuY2Ugb3RoZXIgZG9tYWluIG9iamVjdHMgYnkgd2F5IG9mIGFzc29jaWF0aW9uIHdoZXJlIGRhdGEgc291cmNlIHJlcHJlc2VudGF0aW9ucyByZXF1aXJlIG9iamVjdCBpZGVudGl0eSBtYWludGVuYW5jZSAoc3VjaCBhcyBzZXF1ZW5jaW5nIGFuZCBiYWNrIHJlZmVyZW5jZXMpIGFuZCBwb3NzZXNzIHZhcmlvdXMgdHlwZXMgb2YgbXVsdGlwbGljaXR5IGFuZCBuYXZpZ2FiaWxpdHkuIFRoZSBhcHByb3ByaWF0ZSBtYXBwaW5nIGNsYXNzIGlzIGNob3NlbiBwcmltYXJpbHkgYnkgdGhlIGNhcmRpbmFsaXR5IG9mIHRoZSByZWxhdGlvbnNoaXAuPC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjN2Y4MGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfcGVyc2lzdGVuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQ0FISUMiIG5hbWU9IkJBQkNBSElDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTkiIG5hbWU9InN0aHJlZjE5Ij48L2E+PHNwYW4gY2xhc3M9Iml0YWxpYyI+UGVyc2lzdGVuY2U8L3NwYW4+IHJlZmVycyB0byB0aGUgYWJpbGl0eSB0byBzdG9yZSBvYmplY3RzIGluIGEgZGF0YWJhc2UgYW5kIHVzZSB0aG9zZSBvYmplY3RzIHdpdGggdHJhbnNhY3Rpb25hbCBpbnRlZ3JpdHkuIEluIGEgSjJFRSBhcHBsaWNhdGlvbiwgZGF0YSBpcyB0eXBpY2FsbHkgc3RvcmVkIGFuZCBwZXJzaXN0ZWQgaW4gdGhlIGRhdGEgdGllciwgaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlLjwvcD4KLTxwPjxhIGlkPSJzdGhyZWYyMCIgbmFtZT0ic3RocmVmMjAiPjwvYT48c3BhbiBjbGFzcz0iaXRhbGljIj5FbnRpdHkgYmVhbnM8L3NwYW4+IGFyZSBlbnRlcnByaXNlIGJlYW5zIHRoYXQgY29udGFpbiBwZXJzaXN0ZW50IGRhdGEgYW5kIHRoYXQgY2FuIGJlIHNhdmVkIGluIHZhcmlvdXMgcGVyc2lzdGVudCBkYXRhIHN0b3Jlcy4gVGhlIGVudGl0eSBiZWFucyByZXByZXNlbnQgZGF0YSBmcm9tIGEgZGF0YWJhc2U7IGVhY2ggZW50aXR5IGJlYW4gY2FycmllcyBpdHMgb3duIGlkZW50aXR5LiBFbnRpdHkgYmVhbnMgY2FuIGJlIGRlcGxveWVkIHVzaW5nIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmFwcGxpY2F0aW9uLW1hbmFnZWQgcGVyc2lzdGVuY2U8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlPC9zcGFuPi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExNDBiNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Db25jZXB0czwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSIgQ29uY2VwdHMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYxOCIgbmFtZT0ic3RocmVmMTgiPjwvYT48L3A+Ci08aDE+Q29uY2VwdHM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGFuIG92ZXJ2aWV3IG9mIGNvbmNlcHRzIHlvdSBzaG91bGQgYmUgZmFtaWxpYXIgd2l0aCB3aGVuIHVzaW5nIERhbGkgdG8gY3JlYXRlIG1hcHBpbmdzIGZvciBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5JbiBhZGRpdGlvbiB0byB0aGVzZSBzZWN0aW9ucywgeW91IHNob3VsZCByZXZpZXcgdGhlIGZvbGxvd2luZyByZXNvdXJjZXMgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246PC9wPgotPHVsPgotPGxpPgotPHA+RWNsaXBzZSBEYWxpIHByb2plY3Q6IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaSI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpPC9hPjwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gcHJvamVjdDogPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29sczwvYT48L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPkpTUiAyMjAgRUpCIDMuMCBzcGVjaWZpY2F0aW9uOiA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmpjcC5vcmcvZW4vanNyL2RldGFpbD9pZD0yMjAiPmh0dHA6Ly93d3cuamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTIyMDwvYT48L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPkVjbGlwc2VMaW5rIHByb2plY3Q6IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbms8L2E+PC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTA0ZGExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEkiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJCR0ZKRyIgbmFtZT0iQkFCQkdGSkciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9oMT4KLTxwPlRoZSBKYXZhIDIgRW50ZXJwcmlzZSBFZGl0aW9uKEoyRUUpIEVudGVycHJpc2UgSmF2YUJlYW5zIChFSkIpIGFyZSBhIGNvbXBvbmVudCBhcmNoaXRlY3R1cmUgdGhhdCB5b3UgdXNlIHRvIGRldmVsb3AgYW5kIGRlcGxveSBvYmplY3Qtb3JpZW50ZWQsIGRpc3RyaWJ1dGVkLCBlbnRlcnByaXNlLXNjYWxlIGFwcGxpY2F0aW9ucy4gQW4gYXBwbGljYXRpb24gd3JpdHRlbiBhY2NvcmRpbmcgdG8gdGhlIEVudGVycHJpc2UgSmF2YUJlYW5zIGFyY2hpdGVjdHVyZSBpcyBzY2FsYWJsZSwgdHJhbnNhY3Rpb25hbCwgYW5kIHNlY3VyZS48L3A+Ci08cD5UaGUgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBpbXByb3ZlcyB0aGUgRUpCIGFyY2hpdGVjdHVyZSBieSByZWR1Y2luZyBpdHMgY29tcGxleGl0eSB0aHJvdWdoIHRoZSB1c2Ugb2YgbWV0YWRhdGEgKGFubm90YXRpb25zKSBhbmQgc3BlY2lmeWluZyBwcm9ncmFtbWF0aWMgZGVmYXVsdHMgb2YgdGhhdCBtZXRhZGF0YS48L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmMWU0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0hESEFHSUgiIG5hbWU9IkNIREhBR0lIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT48YSBpZD0ic3RocmVmMjMiIG5hbWU9InN0aHJlZjIzIj48L2E+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9oMT4KLTxwPlRoZSBKUEEgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0aGUgdXNlIG9mIGEgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGZvciBkZXBsb3ltZW50LiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZGF0YWJhc2UgYW5kIGVudGl0eSBtYW5hZ2VyIG9wdGlvbnMsIGFuZCBtYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIHBlcnNpc3RlbmNlIHVuaXQuIFRvIGVuYWJsZSB5b3UgdG8gZWFzaWx5IGVkaXQgdGhpcyBpbmZvcm1hdGlvbiwgRGFsaSBwcm92aWRlcyB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSNDSUFDQ0hJRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT4uIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBFY2xpcHNlIFhNTCBFZGl0b3IgdG8gY3JlYXRlIGFuZCBtYWludGFpbiB0aGlzIGluZm9ybWF0aW9uLiBTZWUgPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj4iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotVG8gd29yayB3aXRoIG11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzLCBjb21tZW50IG91dCBhbGwgYnV0IG9uZSBwZXJzaXN0ZW5jZSB1bml0IGluIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljODg3YTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VGhlIG9ybS54bWwgZmlsZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJUaGUgb3JtLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0hEQklKQUMiIG5hbWU9IkNIREJJSkFDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT48YSBpZD0ic3RocmVmMjQiIG5hbWU9InN0aHJlZjI0Ij48L2E+VGhlIG9ybS54bWwgZmlsZTwvaDE+Ci08cD5BbHRob3VnaCB0aGUgSlBBIHNwZWNpZmljYXRpb24gZW1waGFzaXplcyB0aGUgdXNlIG9mIGFubm90YXRpb25zIHRvIHNwZWNpZnkgcGVyc2lzdGVuY2UsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgdG8gc3RvcmUgdGhpcyBtZXRhZGF0YS4gRGFsaSBlbmFibGVzIHlvdSB0byBjcmVhdGUgYSBzdHViIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgZm9yIGEgSlBBIHByb2plY3QgdXNpbmcgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+LiBTZWUgPGEgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNDSUhER0RDRCI+Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoZSBtZXRhZGF0YSBtdXN0IG1hdGNoIHRoZSBYU0Qgc3BlY2lmaWNhdGlvbiBvZiB5b3VyIHNlbGVjdGVkIEpQQSBpbXBsZW1lbnRhdGlvbi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxwPkRhbGkgcHJvdmlkZXMgY29tcHJlaGVuc2l2ZSBzdXBwb3J0IGZvciBjb25maWd1cmluZyBYTUwgbWFwcGluZyBmaWxlcyB0aHJvdWdoIHRoZSA8YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+IHRoYXQgaXMgbmVhcmx5IGlkZW50aWNhbCB0byB0aGUgYW5ub3RhdGlvbi1iYXNlZCBjb25maWd1cmF0aW9uIGluIHRoZSBKYXZhIHNvdXJjZS4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBhbHNvIHVzZSB0aGUgRWNsaXBzZSBYTUwgRWRpdG9yIHRvIGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhlIG1ldGFkYXRhIGluZm9ybWF0aW9uIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LjwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPjxiciAvPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbnRleHRzLnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YTY2MWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPGNvbnRleHRzPgotCTxjb250ZXh0IGlkPSJlbnRpdHlfYWNjZXNzVHlwZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyB0aGUgdmFyaWFibGUgaXMgYWNjZXNzZWQ6IFByb3BlcnR5IChkZWZhdWx0KSBvciBGaWVsZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X25hbWUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhpcyBlbnRpdHkuIEJ5IGRlZmF1bHQsIHRoZSBjbGFzcyBuYW1lIGlzIHVzZWQgYXMgdGhlIGVudGl0eSBuYW1lLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfdGFibGUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIHRhYmxlIGFzc2lnbmVkIHRvIHRoaXMgZW50aXR5LiBCeSBkZWZhdWx0LCB0aGUgY2xhc3MgbmFtZSBpcyB1c2VkIGFzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlcyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGEgcHJvcGVydHkgb3IgZmllbGQgdG8gYmUgb3ZlcnJpZGRlbiAoZnJvbSB0aGUgZGVmYXVsdCBtYXBwaW5ncykuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hdHRyaWJ1dGVPdmVycmlkZXNOYW1lIj4KLQkJPGRlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc0NvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgb3ZlcnJpZGVzIGEgcHJvcGVydHkgb3IgZmllbGQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hdHRyaWJ1dGVPdmVycmlkZXNJbnNlcnRhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiBTUUwgSU5TRVJUIHN0YXRlbWVudHMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hdHRyaWJ1dGVPdmVycmlkZXNVcGRhdGFibGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIFNRTCBVUERBVEUgc3RhdGVtZW50cy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19tYXBBcyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyB0aGlzIGF0dHJpYnV0ZSBtYXBzIHRvIHRoZSBkYXRhYmFzZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2NvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY29sdW1uVGFibGUiPgotCQk8ZGVzY3JpcHRpb24+TmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgY29sdW1uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY29sdW1uSW5zZXJ0YWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBpcyBhbHdheXMgaW5jbHVkZWQgaW4gU1FMIElOU0VSVCBzdGF0ZW1lbnRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY29sdW1uVXBkYXRhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiBTUUwgVVBEQVRFIHN0YXRlbWVudHMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19mZXRjaFR5cGUiPgotCQk8ZGVzY3JpcHRpb24+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2U6IEVhZ2VyIChkZWZhdWx0KSBvciBMYXp5PC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19vcHRpb25hbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2dlbmVyYXRlZFZhbHVlU3RyYXRlZ3kiPgotCQk8ZGVzY3JpcHRpb24+RGV0ZXJtaW5lcyBob3cgdGhlIHByaW1hcnkga2V5IGlzIGdlbmVyYXRlZDogQXV0byAoZGVmYXVsdCksIFNlcXVlbmNlLCBJZGVudGl0eSwgb3IgVGFibGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19nZW5lcmF0ZWRWYWx1ZUdlbmVyYXRvck5hbWUiPgotCQk8ZGVzY3JpcHRpb24+VW5pcXVlIG5hbWUgb2YgdGhlIGdlbmVyYXRvci48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhcmdldEVudGl0eSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC4gPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19jYXNjYWRlVHlwZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHdoaWNoIG9wZXJhdGlvbnMgYXJlIHByb3BhZ2F0ZWQgdGhyb3VnaG91dCB0aGUgZW50aXR5OiBBbGwsIFBlcnNpc3QsIE1lcmdlLCBvciBNb3ZlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfbWFwcGVkQnkiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGZpZWxkIGluIHRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0IG93bnMgdGhlIHJlbGF0aW9uc2hpcC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2pvaW5Db2x1bW5OYW1lIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgZm9yZWlnbiBrZXkgcmVmZXJlbmNlIGZvciB0aGUgZW50aXR5IGFzc29jaWF0aW9uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfam9pblJlZmVyZW5jZWRDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+TmFtZSBvZiB0aGUgam9pbiB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSBjb2x1bW4uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19lbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlcyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0ICBtYXBwaW5nIG9mIGFuIGVudGl0eeKAmXMgYXR0cmlidXRlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfZW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNvbHVtbiB0aGF0IGlzIGJlaW5nIG1hcHBlZCB0byB0aGUgZW50aXR54oCZcyBhdHRyaWJ1dGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X21hcEFzIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIHR5cGUgb2YgcGVyc2lzdGVudCBkb21haW4gb2JqZWN0IGZvciB0aGUgSmF2YSBjbGFzczogUGVyc2lzdGVudCwgRW1iZWRkZWQsIG9yIE1hcHBlZCBTdXBlcmNsYXNzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfaW5oZXJpdGFuY2VTdHJhdGVneSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyBhbiBlbnRpdHkgbWF5IGluaGVyaXQgcHJvcGVydGllcyBmcm9tIG90aGVyIGVudGl0aWVzOiBTaW5nbGUgdGFibGUsIE9uZSB0YWJsZSBwZXIgY2xhc3MsIG9yIEpvaW5lZCB0YWJsZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIGluaGVyaXRhbmNlIiBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2luaGVyaXRhbmNlRGlzY3JpbWluYXRvckNvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2hlbiB1c2luZyBhIFNpbmdsZSBvciBKb2luZWQgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIGluaGVyaXRhbmNlIiBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2luaGVyaXRhbmNlRGlzY3JpbWluYXRvclR5cGUiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZmllbGQgdG8gc2V0IHRoZSBkaXNjcmltaW5hdG9yIHR5cGUgdG8gQ0hBUiBvciBJTlRFR0VSIChpbnN0ZWFkIG9mIGl0cyBkZWZhdWx0OiBTdHJpbmcpLiBUaGUgZGlzY3JpbWluYXRvciB2YWx1ZSBtdXN0IGNvbmZvcm0gdG8gdGhpcyB0eXBlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU3BlY2lmeWluZyBpbmhlcml0YW5jZSIgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9pbmhlcml0YW5jZURpc2NyaW1pbmF0b3JWYWx1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBkaXNjcmltaW5hdG9yIHZhbHVlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBhbiBlbnRpdHkgaW4gdGhpcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFRoZSB2YWx1ZSBtdXN0IGNvbmZvcm0gdG8gdGhlIHNwZWNpZmllZCBkaXNjcmltaW5hdG9yIHR5cGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIGluaGVyaXRhbmNlIiBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19vcmRlckJ5Ij4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIGRlZmF1bHQgb3JkZXIgZm9yIG9iamVjdHMgcmV0dXJuZWQgZnJvbSBhIHF1ZXJ5LiAgCQotb3JkZXJieV9saXN0Ojo9IG9yZGVyYnlfaXRlbSBbLG9yZGVyYnlfaXRlbV0gICAgIAotb3JkZXJieV9pdGVtOjo9IFtwcm9wZXJ0eV9vcl9maWVsZF9uYW1lXSBbQVNDIHwgREVTQ10gICAgIAotRm9yIGV4YW1wbGU6ICJsYXN0TmFtZSBBU0MgLHNhbGFyeSBERVNDIgk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gRW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2pvaW5UYWJsZU5hbWUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgIG5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgZm9yZWlnbiBrZXkgZm9yIGEgbWFueS10by1tYW55IG9yIGEgdW5pZGlyZWN0aW9uYWwgb25lLXRvLW1hbnkgYXNzb2NpYXRpb24uIFlvdSBjYW4gY29uZmlndXJlIHRoZSBqb2luIHRhYmxlIHdpdGggYSBzcGVjaWZpYyBjYXRhbG9nIG9yIHNjaGVtYSwgY29uZmlndXJlIG9uZSBvciBtb3JlIGpvaW4gdGFibGUgY29sdW1ucyB3aXRoIGEgdW5pcXVlIGNvbnN0cmFpbnQsIGFuZCB1c2UgbXVsdGlwbGUgam9pbiBjb2x1bW5zIHBlciBlbnRpdHkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19qb2luVGFibGVKb2luQ29sdW1ucyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5ICB0d28gb3IgbW9yZSBqb2luIGNvbHVtbnMgKHRoYXQgaXMsIGEgY29tcG9zaXRlIHByaW1hcnkga2V5KS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2pvaW5UYWJsZUludmVyc2VKb2luQ29sdW1ucyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBqb2luIGNvbHVtbiBvbiB0aGUgb3duZWQgKG9yIGludmVyc2Ugc2lkZSkgb2YgdGhlIGFzc29jaWF0aW9uOiB0aGUgb3duZWQgZW50aXR5J3MgcHJpbWFyeSBrZXkgY29sdW1uLiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwcm9wZXJ0aWVzX2phdmFQZXJzaXN0ZW5jZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlIEphdmEgUGVyc2lzdGVuY2Ugb3B0aW9ucyBvbiB0aGUgUHJvcGVydGllcyBwYWdlIHRvIHNlbGVjdCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2Ugd2l0aCB0aGUgcHJvamVjdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icHJvcGVydGllc19qYXZhUGVyc2lzdGVuY2VDb25uZWN0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gbWFwIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InByb3BlcnRpZXNfamF2YVBlcnNpc3RlbmNlU2NoZW1hIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBzY2hlbWEgdXNlZCB0byBtYXAgdGhlIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcm9qZWN0IHByb3BlcnRpZXMiIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMiLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZFBlcnNpc3RlbmNlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGUgQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyB0byBkZWZpbmUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdXNlIHRvIHN0b3JlIHRoZSBwZXJzaXN0ZW5jZSBlbnRpdGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VPdXRsaW5lIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBKUEEgU3RydWN0dXJlIHZpZXcgZGlzcGxheXMgYW4gb3V0bGluZSBvZiB0aGUgc3RydWN0dXJlIChpdHMgYXR0cmlidXRlcyBhbmQgbWFwcGluZ3MpIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgb3Igb3BlbmVkIGluIHRoZSBlZGl0b3IuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgU3RydWN0dXJlIHZpZXciIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllcyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlIEdlbmVyYXRlIEVudGl0aWVzIGRpYWxvZyB0byBjcmVhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzIGJhc2VkIG9uIHlvdXIgZGF0YWJhc2UgdGFibGVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgaHJlZj0idGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0uaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2dlbmVyYXRlRW50aXRpZXNfc291cmNlIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBwcm9qZWN0IGZvbGRlciBuYW1lIGluIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMuIENsaWNrIEJyb3dzZSB0byBzZWxlY3QgYW4gZXhpc3RpbmcgZm9sZGVyLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgaHJlZj0idGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzX3BhY2thZ2UiPgotCQk8ZGVzY3JpcHRpb24+VGhlIHBhY2thZ2UgaW4gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcywgb3IgY2xpY2sgQnJvd3NlIHRvIHNlbGVjdCBhbiBleGlzdGluZyBwYWNrYWdlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgaHJlZj0idGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzX3RhYmxlcyI+Ci0JCTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIHRhYmxlcyBmcm9tIHdoaWNoIHRvIGNyZWF0ZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gZGVmaW5lIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gc3RvcmUgdGhlIHBlcnNpc3RlbmNlIGVudGl0aWVzIGFuZCB0byBjcmVhdGUgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfbmV3SlBBUHJvamVjdCI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gZGVmaW5lIHRoZSBuZXcgSlBBIHByb2plY3QgbmFtZSwgaXRzIGxvY2F0aW9uLCB0YXJnZXQgcnVudGltZSwgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJOZXcgSlBBIFByb2plY3QgcGFnZSIgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBQcm9qZWN0IHdpemFyZCIgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2VfZGF0YWJhc2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoZXNlIGZpZWxkcyB0byBkZWZpbmUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdXNlZCB0byBzdG9yZSB0aGUgcGVyc2lzdGVudCBlbnRpdGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZCBQZXJzaXN0ZW5jZSBkaWFsb2ciIGhyZWY9InJlZl9hZGRfcGVyc2lzdGVuY2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIHByb2plY3QiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZV9jbGFzc3BhdGgiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgb3B0aW9uIHRvIGFkZCBsaWJyYXJpZXMgb3IgSkFScyB0aGF0IGNvbnRhaW4gdGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIGFuZCBlbnRpdGllcyB0byB0aGUgcHJvamVjdOKAmXMgSmF2YSBCdWlsZCBQYXRoLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlX3BhY2thZ2luZyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlc2UgZmllbGRzIHRvIGNyZWF0ZSB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUuIFNlbGVjdCB0aGUgcGVyc2lzdGVuY2UgdmVyc2lvbiwgdGhlIG5hbWUgb2YgdGhlIEpQQSBwcm92aWRlciwgYW5kIGEgdW5pcXVlIG5hbWUgdG8gaWRlbnRpZnkgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGQgUGVyc2lzdGVuY2UgZGlhbG9nIiBocmVmPSJyZWZfYWRkX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndpemFyZF9nZW5lcmF0ZURETF9vcHRpb25zICI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB3aGljaCBzY3JpcHQgb3B0aW9ucyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgc2NyaXB0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgKERETCkgZnJvbSBlbnRpdGllcyAiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZGRsLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJPcHRpb25zIHBhZ2UgIiBocmVmPSJyZWZfb3B0aW9ucy5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3aXphcmRfZ2VuZXJhdGVERExfb2JqZWN0cyAiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBzZWxlY3Qgd2hpY2ggZWxlbWVudHMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHNjcmlwdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgdGFibGVzIChEREwpIGZyb20gZW50aXRpZXMgIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2RkbC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iT2JqZWN0cyBwYWdlICIgaHJlZj0icmVmX29iamVjdHMuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2l6YXJkX2dlbmVyYXRlRERMX3NhdmUgIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHRoZSBmaWxlbmFtZSBhbmQgbG9jYXRpb24gb2YgdGhlIGdlbmVyYXRlZCBzY3JpcHQuIFlvdSBjYW4gYWxzbyBwcmV2aWV3IHRoZSBzY3JpcHQgYW5kIHNwZWNpZnkgdG8gcnVuIG9yIGNvbnRpbnVlIGVkaXRpbmcgdGhlIHNjcmlwdCBhZnRlciBnZW5lcmF0aW9uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgKERETCkgZnJvbSBlbnRpdGllcyAiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZGRsLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJTYXZlIGFuZCBSdW4gRERMIHBhZ2UgIiBocmVmPSJyZWZfc2F2ZV9hbmRfcnVuLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndpemFyZF9nZW5lcmF0ZURETF9zdW1tYXJ5ICI+Ci0JCTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2Ugc2hvd3MgdGhlIHNldHRpbmdzIHRoYXQgeW91IHNlbGVjdGVkIGZvciB0aGUgZ2VuZXJhdGVkIERETC4gVG8gY2hhbmdlIGFueSBvcHRpb24gY2xpY2sgIkJhY2siIG9yIGNsaWNrICJGaW5pc2giIHRvIGNvbnRpbnVlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgKERETCkgZnJvbSBlbnRpdGllcyAiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZGRsLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3JOYW1lIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSB0YWJsZSBzZXF1ZW5jZSBnZW5lcmF0b3IuIFRoaXMgbmFtZSBpcyBnbG9iYWwgdG8gdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgKGFjcm9zcyBhbGwgZ2VuZXJhdG9yIHR5cGVzKS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3JUYWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIGdlbmVyYXRlZCBJRCB2YWx1ZXMuIDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvclByaW1hcnlLZXlDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNvbHVtbiBvZiB0aGUgZ2VuZXJhdG9yIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBnZW5lcmF0ZWQgSUQgdmFsdWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvclZhbHVlQ29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBuYW1lIGZvciB0aGUgY29sdW1uIHRoYXQgc3RvcmVzIHRoZSBnZW5lcmF0ZWQgSUQgdmFsdWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvclByaW1hcnlLZXlDb2x1bW5WYWx1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIG9mIHRoZSBnZW5lcmF0b3IgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSBwcmltYXJ5IGtleSB2YWx1ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19kYXRhYmFzZUF1dGhvcml6YXRpb24iPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRvIGNvbm5lY3QgKGxvZyBpbikgdG8gYSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHVzZSB3aXRoIHlvdXIgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLiAKLQkJWW91IG11c3QgaGF2ZSBhIGRlZmluZWQgZGF0YWJhc2UgY29ubmVjdGlvbiAoYW5kIGJlIGNvbm5lY3RlZCkgdG8gYWRkIHBlcnNpc3RlbmNlLiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZCBwZXJzaXN0ZW5jZSB0byBhIEphdmEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2VfcHJvamVjdC5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGVtcG9yYWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBpZiB0aGUgbWFwcGVkIGZpZWxkIGNvbnRhaW5zIGEgRGF0ZSAoamF2YS5zcWwuRGF0ZSksIFRpbWUgKGphdmEuc3FsLlRpbWUpLCBvciBUaW1lc3RhbXAgKGphdmEuc3FsLlRpbWVzdGFtcCkgdmFsdWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3ByaW1hcnlLZXlHZW5lcmF0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPkRlZmluZSBob3cgdGhlIHByaW1hcnkga2V5IGlzIGdlbmVyYXRlZDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3IiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0byB1c2UgYSBzcGVjaWZpYyBkYXRhYmFzZSB0YWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUgcHJpbWFyeSBrZXkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19zZXF1ZW5jZUdlbmVyYXRvciI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRvIHVzZSBhIHNwZWNpZmljIHNlcXVlbmNlIGZvciBnZW5lcmF0aW5nIHRoZSBwcmltYXJ5IGtleS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yTmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5OYW1lIG9mIHRoZSBzZXF1ZW5jZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yU2VxdWVuY2UiPgotCQk8ZGVzY3JpcHRpb24+IDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfbG9iIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaWYgdGhlIGZpZWxkIGlzIG1hcHBlZCB0byBqYXZhLnNxbC5DbG9iIG9yIGphdmEuc3FsLkJsb2IuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmFsIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfZW51bWVyYXRlZCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyB0byBwZXJzaXN0IGVudW1lcmF0ZWQgY29uc3RyYWludHMgaWYgdGhlIFN0cmluZyB2YWx1ZSBzdWl0cyB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cyBvciB0byBtYXRjaCBhbiBleGlzdGluZyBkYXRhYmFzZSBzY2hlbWEuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmFsIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19lZGl0SW52ZXJzZUpvaW5Db2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9jYXRhbG9nIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjYXRhbG9nIHRoYXQgY29udGFpbnMgdGhlIFRhYmxlLiBUaGlzIGZpZWxkIG92ZXJyaWRlcyB0aGUgZGVmYXVsdHMgaW4gdGhlIG9ybS54bWwgZmlsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X3NjaGVtYSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2Ugc2NoZW1hIHRoYXQgY29udGFpbnMgdGhlIFRhYmxlLiBUaGlzIGZpZWxkIG92ZXJyaWRlcyB0aGUgZGVmYXVsdHMgaW4gdGhlIG9ybS54bWwgZmlsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX3BhY2thZ2UiPgotCQk8ZGVzY3JpcHRpb24+VGhlIEphdmEgcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzIHRvIHdoaWNoIHRoZSBvcm0ueG1sIGZpbGUgYXBwbGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX3NjaGVtYSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2Ugc2NoZW1hIHRvIHVzZSBhcyB0aGUgZGVmYXVsdCBmb3IgYWxsIGVudGl0aWVzIG1hbmFnZWQgYnkgdGhpcyBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcm1fY2F0YWxvZyI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY2F0YWxvZyB0byB1c2UgYXMgdGhlIGRlZmF1bHQgZm9yIGFsbCBlbnRpdGllcyBtYW5hZ2VkIGJ5IHRoaXMgcGVyc2lzdGVuY2UgdW5pdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX2FjY2VzcyI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGVmYXVsdCBhY2Nlc3MgbWV0aG9kIGZvciB2YXJpYWJsZXMgaW4gdGhpcyBwcm9qZWN0OiBQcm9wZXJ0eSBvciBGaWVsZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX2Nhc2NhZGUiPgotCQk8ZGVzY3JpcHRpb24+QWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMgaW4gZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9ybV94bWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIHRoYXQgdGhlIEphdmEgY2xhc3NlcyBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQgYXJlIGZ1bGx5IHNwZWNpZmllZCBieSB0aGVpciBtZXRhZGF0YS4gQW55IGFubm90YXRpb25zIHdpbGwgYmUgaWdub3JlZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX0pQQVBsYXRmb3JtIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIHZlbmRvci1zcGVjaWZpYyBKUEEgaW1wbGVtZW50YXRpb24uRGVmYXVsdCBpcyBHZW5lcmljLi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBGYWNldCBwYWdlIiBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2NyZWF0ZU9STSI+Ci0JCTxkZXNjcmlwdGlvbj5DcmVhdGUgYW4gaW5pdGlhbCBvcm0ueG1sIGZpbGUuIFVzZSB0aGlzIGZpbGUgdG8gc3BlY2lmeSBwcm9qZWN0IGFuZCBwZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBGYWNldCBwYWdlIiBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSIvPgotCTwvY29udGV4dD4KLQotCTxjb250ZXh0IGlkPSJjYWNoaW5nX2RlZmF1bHRUeXBlIj4KLQkJPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgZGVmYXVsdCBjYWNoaW5nIHN0cmF0ZWd5IGZvciB0aGUgcHJvamVjdC4gVGhlIGRlZmF1bHQgaXMgV2VhayB3aXRoIFNvZnQgU3ViY2FjaGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iY2FjaGluZ19kZWZhdWx0U2l6ZSI+Ci0JCTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgY2FjaGUuIFRoZSBkZWZhdWx0IGlzIDEwMCBpdGVtcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJjYWNoaW5nX2RlZmF1bHRTaGFyZWQiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBpZiBjYWNoZWQgaW5zdGFuY2VzIHNob3VsZCBiZSBpbiB0aGUgc2hhcmVkIGNhY2hlIG9yIGluIGEgY2xpZW50IGlzb2xhdGVkIGNhY2hlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImxvZ2dpbmdfbGV2ZWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIHRoZSBhbW91bnQgYW5kIGRldGFpbCBvZiBsb2cgb3V0cHV0IGJ5IHNlbGVjdGluZyB0aGUgbG9nIGxldmVsLiBEZWZhdWx0IGlzIEluZm8gbGV2ZWwuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ190aW1lU3RhbXAiPgotCQk8ZGVzY3JpcHRpb24+Q29udHJvbCB3aGV0aGVyIHRoZSB0aW1lc3RhbXAgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LiBEZWZhdWx0IGlzIFRydWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ190aHJlYWQiPgotCQk8ZGVzY3JpcHRpb24+Q29udHJvbCB3aGV0aGVyIGEgdGhyZWFkIGlkZW50aWZpZXIgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LiBEZWZhdWx0IGlzIFRydWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ19zZXNzaW9uIj4KLQkJPGRlc2NyaXB0aW9uPkNvbnRyb2wgd2hldGhlciBhbiBFY2xpcHNlTGluayBzZXNzaW9uIGlkZW50aWZpZXIgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LiBEZWZhdWx0IGlzIFRydWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ19leGNlcHRpb25zIj4KLQkJPGRlc2NyaXB0aW9uPkNvbnRyb2wgd2hldGhlciB0aGUgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSB3aXRoaW4gdGhlIGNvZGUgYXJlIGxvZ2dlZCBwcmlvciB0byByZXR1cm5pbmcgdGhlIGV4Y2VwdGlvbiB0byB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gRW5zdXJlcyB0aGF0IGFsbCBleGNlcHRpb25zIGFyZSBsb2dnZWQgYW5kIG5vdCBtYXNrZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNvZGUuLiBEZWZhdWx0IGlzIEZhbHNlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9wdGlvbnNfc2Vzc2lvbk5hbWUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgbmFtZSBieSB3aGljaCB0aGUgRWNsaXBzZUxpbmsgc2Vzc2lvbiBpcyBzdG9yZWQgaW4gdGhlIHN0YXRpYyBzZXNzaW9uIG1hbmFnZXIuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3B0aW9uc19zZXNzaW9uc1htbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGxvYWRlZCBmcm9tIHRoZSBFY2xpcHNlTGluayBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4gWW91IGNhbiB1c2UgdGhpcyBvcHRpb24gYXMgYW4gYWx0ZXJuYXRpdmUgdG8gYW5ub3RhdGlvbnMgYW5kIGRlcGxveW1lbnQgWE1MLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9wdGlvbnNfdGFyZ2V0RGF0YWJhc2UiPgotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3B0aW9uc190YXJnZXRTZXJ2ZXIiPgotCQk8ZGVzY3JpcHRpb24+IDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19uZXdKUEFQcm9qZWN0SmF2YSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gaW5jbHVkZSBleGlzdGluZyBKYXZhIHNvdXJjZSBmaWxlcyBpbiB0aGlzIHByb2plY3QuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKYXZhIHBhZ2UiIGhyZWY9InJlZl9qYXZhX3BhZ2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9Ik5ldyBKUEEgUHJvamVjdCB3aXphcmQiIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfbmV3SlBBUHJvamVjdEZhY2V0Ij4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHlvdXIgdmVuZGVyLXNwZWNpZmljIHBsYXRmb3JtLCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSwgYW5kIGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRmFjZXQgcGFnZSIgaHJlZj0icmVmX2pwYV9mYWNldC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBQcm9qZWN0IHdpemFyZCIgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19lbnRpdHlDbGFzc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgcGFja2FnZSwgY2xhc3MgbmFtZSwgYW5kIGluaGVyaXRhbmNlIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSB0byBjcmVhdGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJFbnRpdHkgQ2xhc3MgcGFnZSIgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBFbnRpdHkgd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIG5ldyBKUEEgZW50aXR5IiBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19lbnRpdHlQcm9wZXJ0aWVzUGFnZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgZW50aXR5IG5hbWUsIGFzc29jaWF0ZWQgdGFibGUsIGFuZCBtYXBwZWQgZmllbGRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iRW50aXR5IFByb3BlcnRpZXMgcGFnZSIgaHJlZj0icmVmX0VudGl0eVByb3BlcnRpZXNQYWdlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJOZXcgSlBBIEVudGl0eSB3aXphcmQiIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBlbnRpdHkiIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX3NlbGVjdFRhYmxlc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGRhdGFiYXNlIHRhYmxlcyBmcm9tIHdoaWNoIHRvIGdlbmVyYXRlIGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU2VsZWN0IFRhYmxlcyBwYWdlIiBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0ZSBDdXN0b20gRW50aXRpZXMgd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ190YWJsZUFzc29jaWF0aW9uc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGNyZWF0ZSBvciBlZGl0IHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBkYXRhYmFzZSB0YWJsZSBhbmQgZW50aXR5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iVGFibGUgQXNzb2NpYXRpb25zIHBhZ2UiIGhyZWY9InJlZl90YWJsZUFzc29jaWF0aW9ucy5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGUgQ3VzdG9tIEVudGl0aWVzIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCTxjb250ZXh0IGlkPSJkaWFsb2dfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24iPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIHRhYmxlIG1hcHBpbmcgYW5kIGRvbWFpbiBjbGFzcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBlbnRpdHkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJDdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbiBwYWdlIiBocmVmPSJyZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRlIEN1c3RvbSBFbnRpdGllcyB3aXphcmQiIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0iIC8+Ci0JPC9jb250ZXh0PgkKLQk8Y29udGV4dCBpZD0iZGlhbG9nX2N1c3RvbWl6ZUluZGl2aWR1YWxFbnRpdGllcyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgdGFibGUgbWFwcGluZyBhbmQgZG9tYWluIGNsYXNzIGluZm9ybWF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkIGVudGl0eS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzIHBhZ2UiIGhyZWY9InJlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGUgQ3VzdG9tIEVudGl0aWVzIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hc3NvY2lhdGlvblRhYmxlc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGFzc29jaWF0aW9uIHRhYmxlcyBmb3IgYW4gZW50aXR5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQXNzb2NpYXRpb24gVGFibGVzIHBhZ2UiIGhyZWY9InJlZl9hc3NvY2lhdGlvbl90YWJsZXMuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24gd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19qb2luQ29sdW1uc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGpvaW4gY29sdW1ucyBvZiBhbiBhc3NvY2lhdGlvbiB0YWJsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpvaW4gQ29sdW1ucyBwYWdlIiBocmVmPSJyZWZfam9pbl9jb2x1bW5zLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJDcmVhdGUgTmV3IEFzc29jaWF0aW9uIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCTxjb250ZXh0IGlkPSJkaWFsb2dfYXNzb2NpYXRpb25DYXJkaW5hbGl0eVBhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgY2FyZGluYWxpdHkgb2YgYW4gYXNzb2NpYXRpb24gdGFibGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBc3NvY2lhdGlvbiBDYXJkaW5hbGl0eSBwYWdlIiBocmVmPSJyZWZfYXNzb2NpYXRpb25fY2FyZGluYWxpdHkuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24gd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19zZWxlY3RDYXNjYWRlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgd2hpY2ggb3BlcmF0aW9ucyBhcmUgcHJvcGFnYXRlZCB0aHJvdWdob3V0IHRoZSBhc3NvY2lhdGlvbjogQWxsLCBQZXJzaXN0LCBNZXJnZSwgUmVtb3ZlLCBvciBSZWZyZXNoLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU2VsZWN0IENhc2NhZGUgcGFnZSIgaHJlZj0icmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VfZ2VuZXJhbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBnZW5lcmFsIHBlcnNpc3RlbmNlIG9wdGlvbnMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmFsIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZV9jb25uZWN0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIGRhdGEgc291cmNlIG9yIEpEQkMgY29ubmVjdGlvbiBwcm9wZXJ0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQ29ubmVjdGlvbiBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfY29ubmVjdGlvbiIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VfY3VzdG9taXphdGlvbiI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yIGVudGl0eSBzcGVjaWZpYyBFY2xpcHNlTGluayBjdXN0b21pemF0aW9uIGFuZCB2YWxpZGF0aW9uIHByb3BlcnRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJDdXN0b21pemF0aW9uIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9jb25uZWN0aW9uIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZV9jYWNoaW5nIj4KLQkJPGRlc2NyaXB0aW9uPkNvbmZpZ3VyZSB0aGUgc2Vzc2lvbiBvciBlbnRpdHkgc3BlY2lmaWMgRWNsaXBzZUxpbmsgY2FjaGluZyBwcm9wZXJ0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQ2FjaGluZyBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfY2FjaGluZyIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VfbG9nZ2luZyI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIEVjbGlwc2VMaW5rIGxvZ2dpbmcgcHJvcGVydGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkxvZ2dpbmcgcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2xvZ2dpbmciIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX29wdGlvbnMiPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBFY2xpcHNlTGluayBzZXNzaW9uIGFuZCBtaXNjZWxsYW5vdXMgb3B0aW9ucy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik9wdGlvbnMgcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX29wdGlvbnMiIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX3NjaGVtYUdlbmVyYXRpb24iPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBzY2hlbWEgZ2VuZXJhdGlvbiBwcm9wZXJ0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU2NoZW1hIEdlbmVyYXRpb24gcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3NjaGVtYUdlbmVyYXRpb24iIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX3Byb3BlcnRpZXMiPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvcGVydGllcyBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcGVydGllcyIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQkJPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX3NvdXJjZSI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcm9wZXJ0aWVzIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wZXJ0aWVzIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgkKLQk8Y29udGV4dCBpZD0iZGlhbG9nX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZSI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJOZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIHBhZ2UiIGhyZWY9InJlZl9lY2xpcHNlbGlua19tYXBwaW5nX2ZpbGUiIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2NyZWF0ZV9uZXdfY29udmVydGVycyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gY3JlYXRlIGEgbmV3IEVjbGlwc2VMaW5rIGNvbnZldGVyLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIENvbnZlcnRlciBkaWFsb2ciIGhyZWY9InJlZl9hZGRfY29udmVydGVyIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybSIgLz4KLQk8L2NvbnRleHQ+Ci0KLTwhLS0gQWRkZWQgZm9yIDIuMyAtLT4KLQk8Y29udGV4dCBpZD0icHJvcGVydGllc19jYW5vbmljYWxNZXRhbW9kZWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIGlmIHRoZSBwcm9qZWN0IG1vZGVsIHVzZXMgdGhlIENhbm9uaWNhbCBNZXRhbW9kZWwuIDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9jYWNoZWFibGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBpZiB0aGUgZW50aXR5IHVzZXMgdGhlIEBDYWNoYWJsZSBhbm5vdGF0aW9uLiBEZWZhdWx0IGlzIEBDYWNoYWJsZShmYWxzZSkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X3ByaW1hcnlLZXlDbGFzcyI+Ci0JCTxkZXNjcmlwdGlvbj5DbGljayBCcm93c2UgYW5kIHNlbGVjdCB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBlbnRpdHkuIENsaWNraW5nIHRoZSBmaWVsZCBuYW1lLCB3aGljaCBpcyByZXByZXNlbnRlZCBhcyBhIGh5cGVybGluaywgYWxsb3dzIHlvdSB0byBjcmVhdGUgYSBuZXcgY2xhc3MuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3aXphcmRfamF4YnNjaGVtYV9jbGFzc2VzIj4KLQkJPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgcHJvamVjdCwgcGFja2FnZSwgb3IgY2xhc3NlcyBmcm9tIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBYTUwgc2NoZW1hLiBDbGljayBGaW5pc2ggdG8gZ2VuZXJhdGUgdGhlIHNjaGVtYTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIHdpemFyZCIgaHJlZj0icmVmX2pheGJfc2NoZW1hX3dpemFyZC5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIHNjaGVtYSBmcm9tIGNsYXNzZXMiIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iY29uZmlndXJlX2pheGJfY2xhc3NfZ2VuZXJhdGlvbl9kaWFsb2ciPgotCQk8ZGVzY3JpcHRpb24+RW50ZXIgdGhlIEpBWEIgY2xhc3MgZ2VuZXJhdGlvbiBzZXR0aW5ncyBhbmQgY2xpY2sgRmluaXNoIHRvIGdlbmVyYXRlIGNsYXNzZXMuICBBbGwgZmllbGRzIGFyZSBvcHRpb25hbCBleGNlcHQgZm9yIHRoZSBzb3VyY2UgZm9sZGVyLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQ29uZmlndXJlIEpBWEIgQ2xhc3MgR2VuZXJhdGlvbiBkaWFsb2ciIGhyZWY9InJlZl9jb25maWd1cmVfamF4Yl9jbGFzc19nZW5lcmF0aW9uX2RpYWxvZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtIi8+Ci0JPC9jb250ZXh0PgotCQotCQotCQotCQotCQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2Nzcy9ibGFmZG9jLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmNjEyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1AaW1wb3J0ICIuLi8uLi8uLi9QUk9EVUNUX1BMVUdJTi9ib29rLmNzcyI7Ci0KLXNwYW4uY29udHJvbCwgc3Bhbi5ndWktb2JqZWN0LWFjdGlvbiwgcC5zdWJoZWFkMiwgc3Bhbi5ib2xkLCBwLm5vdGVwMSB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLm5hbWUsIHAudGl0bGVpbmZpZ3VyZSwgc3Bhbi5pdGFsaWMgewotICBmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXAudGl0bGVpbmZpZ3VyZSwgcC5zdWJoZWFkMiB7Ci0gIHBhZGRpbmctdG9wOiAxMHB4OwotfQotCi1zcGFuLmNvZGUgewotICBmb250LWZhbWlseTogbW9ub3NwYWNlOwotfQotCi1zcGFuLmNvcHlyaWdodGxvZ28ge2ZvbnQtc2l6ZTogMC44ZW19Ci0KLS5mb290ZXIge21hcmdpbi10b3A6IDJlbTtib3JkZXItdG9wOjFweCBzb2xpZCAjY2NjY2NjO3BhZGRpbmctdG9wOjFlbTt9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vaHRtbC9jcHlyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2h0bWwvY3B5ci5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MmVjNjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vaHRtbC9jcHlyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci0KLTxoZWFkPgotPCEtLSAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDt1cmw9Li4vLi4vbGVnYWwuaHRtIj4gLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGhyZWY9Ii4uLy4uL2xlZ2FsLmh0bSI+TGljZW5zZSBJbmZvcm1hdGlvbjwvYT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTkzYWQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZXR0aW5nIHN0YXJ0ZWQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIEdldHRpbmcgc3RhcnRlZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjIiIG5hbWU9InN0aHJlZjIiPjwvYT48L3A+Ci08aDE+R2V0dGluZyBzdGFydGVkPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBnZXR0aW5nIHN0YXJ0ZWQgd2l0aCB0aGUgSmF2YSBQZXJzaXN0ZW5jZSBUb29scy48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtI0JBQkVGSENEIj5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAyLmh0bSNCQUJJR0NKQSI+RGFsaSBxdWljayBzdGFydDwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPkZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBwbGVhc2UgdmlzaXQgdGhlIERhbGkgaG9tZSBwYWdlIGF0OjwvcD4KLTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaSI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpPC9hPjwvY29kZT4uPC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxY2Y5NjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRUZIQ0QiIG5hbWU9IkJBQkVGSENEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjxhIGlkPSJzdGhyZWYzIiBuYW1lPSJzdGhyZWYzIj48L2E+PGEgaWQ9InN0aHJlZjQiIG5hbWU9InN0aHJlZjQiPjwvYT48L2gxPgotPHA+QmVmb3JlIGluc3RhbGxpbmcgRGFsaSwgZW5zdXJlIHRoYXQgeW91ciBlbnZpcm9ubWVudCBtZWV0cyB0aGUgZm9sbG93aW5nIDxzcGFuIGNsYXNzPSJpdGFsaWMiPm1pbmltdW08L3NwYW4+IHJlcXVpcmVtZW50czo8L3A+Ci08dWw+Ci08bGk+Ci08cD5FY2xpcHNlIDMuNiAoPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzPC9hPjwvY29kZT4pPC9wPgotPC9saT4KLTxsaT4KLTxwPkphdmEgUnVudGltZSBFbnZpcm9ubWVudCAoSlJFKSAxLjUgKDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLmNvbSI+aHR0cDovL2phdmEuY29tPC9hPjwvY29kZT4pPC9wPgotPC9saT4KLTxsaT4KLTxwPkVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIDMuMiAoPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29sczwvYT48L2NvZGU+KTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5KYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBmb3IgSmF2YSBFRSA1LiBGb3IgZXhhbXBsZSwgdGhlIEVjbGlwc2VMaW5rIGltcGxlbWVudGF0aW9uIGZvciBKUEEgY2FuIGJlIG9idGFpbmVkIGZyb206IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rLzwvYT48L2NvZGU+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5SZWZlciB0byA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGkvZ2V0dGluZ3N0YXJ0ZWRfbWFpbi5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGkvZ2V0dGluZ3N0YXJ0ZWRfbWFpbi5odG1sPC9hPjwvY29kZT4gZm9yIGFkZGl0aW9uYWwgaW5zdGFsbGF0aW9uIGluZm9ybWF0aW9uLjwvcD4KLTxwPjxhIGlkPSJzdGhyZWY1IiBuYW1lPSJzdGhyZWY1Ij48L2E+RGFsaSBpcyBpbmNsdWRlZCBhcyBwYXJ0IG9mIFdUUCAzLjIuIE5vIGFkZGl0aW9uYWwgaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQuPC9wPgotPGEgaWQ9InN0aHJlZjYiIG5hbWU9InN0aHJlZjYiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+QWNjZXNzaWJpbGl0eSBGZWF0dXJlczwvcD4KLTxwPkRhbGkgc3VwcG9ydHMgdGhlIHN0YW5kYXJkIGFjY2Vzc2liaWxpdHkgZmVhdHVyZXMgaW4gRWNsaXBzZSwgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6PC9wPgotPHVsPgotPGxpPgotPHA+TmF2aWdhdGluZyB0aGUgdXNlciBpbnRlcmZhY2UgdXNpbmcgdGhlIGtleWJvYXJkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TcGVjaWZ5aW5nIGdlbmVyYWwgYWNjZXNzaWJpbGl0eSBwcmVmZXJlbmNlcyBmb3IgdGhlIGVkaXRvci48L3A+Ci08L2xpPgotPC91bD4KLTxwPlNlZSA8YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9hY2Nlc3NpYmlsaXR5L2FjY2Vzc21haW4uaHRtIj5BY2Nlc3NpYmlsaXR5IEZlYXR1cmVzIGluIEVjbGlwc2U8L2E+IGluIHRoZSA8c3BhbiBjbGFzcz0iaXRhbGljIj5Xb3JrYmVuY2ggVXNlciBHdWlkZTwvc3Bhbj4gZm9yIGRldGFpbHMuPC9wPgotPGEgaWQ9InN0aHJlZjciIG5hbWU9InN0aHJlZjciPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+SGVscCBBY2Nlc3NpYmlsaXR5PC9wPgotPHA+VGhlIGRvY3VtZW50YXRpb24gYW5kIGhlbHAgY29udGFpbnMgbWFya3VwIHRvIGZhY2lsaXRhdGUgYWNjZXNzIGJ5IHRoZSBkaXNhYmxlZCBjb21tdW5pdHkuIFNlZSA8YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci90YXNrcy9oZWxwX2FjY2Vzc2liaWxpdHkuaHRtIj5IZWxwIEFjY2Vzc2liaWxpdHk8L2E+IGluIHRoZSA8c3BhbiBjbGFzcz0iaXRhbGljIj5Xb3JrYmVuY2ggVXNlciBHdWlkZTwvc3Bhbj4gZm9yIGRldGFpbHMuPC9wPgotPHA+V2hlbiB1c2luZyB0aGUgaGVscCwgYmUgYXdhcmUgb2YgdGhlIGZvbGxvd2luZzo8L3A+Ci08dWw+Ci08bGk+Ci08cD5TY3JlZW4gcmVhZGVycyBtYXkgbm90IGFsd2F5cyBjb3JyZWN0bHkgcmVhZCB0aGUgY29kZSBleGFtcGxlcyBpbiB0aGlzIGRvY3VtZW50LiBUaGUgY29udmVudGlvbnMgZm9yIHdyaXRpbmcgY29kZSByZXF1aXJlIHRoYXQgY2xvc2luZyBicmFjZXMgc2hvdWxkIGFwcGVhciBvbiBhbiBvdGhlcndpc2UgZW1wdHkgbGluZTsgaG93ZXZlciwgc29tZSBzY3JlZW4gcmVhZGVycyBtYXkgbm90IGFsd2F5cyByZWFkIGEgbGluZSBvZiB0ZXh0IHRoYXQgY29uc2lzdHMgc29sZWx5IG9mIGEgYnJhY2tldCBvciBicmFjZS48L3A+Ci08L2xpPgotPGxpPgotPHA+VGhpcyBkb2N1bWVudGF0aW9uIG1heSBjb250YWluIGxpbmtzIHRvIFdlYiBzaXRlcyBvZiBvdGhlciBjb21wYW5pZXMgb3Igb3JnYW5pemF0aW9ucyB0aGF0IHdlIGRvIG5vdCBjb250cm9sLiBXZSBuZWl0aGVyIGV2YWx1YXRlIG5vciBtYWtlIGFueSByZXByZXNlbnRhdGlvbnMgcmVnYXJkaW5nIHRoZSBhY2Nlc3NpYmlsaXR5IG9mIHRoZXNlIFdlYiBzaXRlcy48L3A+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyODUzMTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkRhbGkgcXVpY2sgc3RhcnQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRGFsaSBxdWljayBzdGFydCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQklHQ0pBIiBuYW1lPSJCQUJJR0NKQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RGFsaSBxdWljayBzdGFydDwvaDE+Ci08cD48YSBpZD0ic3RocmVmOCIgbmFtZT0ic3RocmVmOCI+PC9hPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiB0byBoZWxwIHlvdSBxdWlja2x5IHN0YXJ0IHVzaW5nIERhbGkgdG8gY3JlYXRlIHJlbGF0aW9uYWwgbWFwcGluZ3MgYmV0d2VlbiBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgYW5kIGRhdGFiYXNlIHRhYmxlcy48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtI0JBQkRGSERBIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNCQUJGR0RERyI+Q3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHM8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGlwc19hbmRfdHJpY2tzLmh0bSNDSERIR0hCRiI+VGlwcyBhbmQgdHJpY2tzPC9hPjxiciAvPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYmFjNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkRGSERBIiBuYW1lPSJCQUJERkhEQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjkiIG5hbWU9InN0aHJlZjkiPjwvYT5UaGlzIHF1aWNrIHN0YXJ0IHNob3dzIGhvdyB0byBjcmVhdGUgYSBuZXcgSlBBIHByb2plY3QuPC9wPgotPG9sPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlNlbGVjdCBGaWxlICZndDsgTmV3ICZndDsgUHJvamVjdDwvc3Bhbj4uIFRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgSlBBIHBlcnNwZWN0aXZlIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IEpQQSBQcm9qZWN0PC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgUHJvamVjdDwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9hPiBhcHBlYXJzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciBhIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+UHJvamVjdCBuYW1lPC9zcGFuPiAoc3VjaCBhcyA8Y29kZT5RdWlja1N0YXJ0PC9jb2RlPikuPC9wPgotPC9saT4KLTxsaT4KLTxwPklmIG5lZWRlZCwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFyZ2V0IFJ1bnRpbWU8L3NwYW4+IChzdWNoIGFzIDxjb2RlPkFwYWNoZSBUb21jYXQ8L2NvZGU+KSBhbmQgY29uZmlndXJhdGlvbiwgc3VjaCBhcyA8c3BhbiBjbGFzcz0iYm9sZCI+VXRpbGl0eSBKUEEgUHJvamVjdCB3aXRoIEphdmEgNS4wPC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSBKYXZhIHNvdXJjZSBwYWdlIGFwcGVhcnMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGUgVGFyZ2V0IFJ1bnRpbWUgaXMgbm90IHJlcXVpcmVkIGZvciBKYXZhIFNFIGRldmVsb3BtZW50LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPklmIHlvdSBoYXZlIGV4aXN0aW5nIEphdmEgc291cmNlIGZpbGVzLCBhZGQgdGhlbSB0byB5b3VyIGNsYXNzcGF0aCBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPk9uIHRoZSBKUEEgRmFjZXQgZGlhbG9nLCBzZWxlY3QgeW91ciB2ZW5kb3Itc3BlY2lmaWMgSlBBIHBsYXRmb3JtIChvciBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+KSwgZGF0YWJhc2UgY29ubmVjdGlvbiAob3IgY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24pLCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSAoc3VjaCBhcyBFY2xpcHNlTGluayksIGRlZmluZSBob3cgRGFsaSBzaG91bGQgbWFuYWdlIHBlcnNpc3RlbnQgY2xhc3NlcywgYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSB0aGUgRGVmYXVsdCBTY2hlbWEgZm9yIENvbm5lY3Rpb248L3NwYW4+IGlmIHlvdSByZXF1aXJlIGEgc2NoZW1hIG90aGVyIHRoYW4gdGhlIG9uZSB0aGF0IERhbGkgZGVyaXZlcyBmcm9tIHRoZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uLCB3aGljaCBtYXkgYmUgaW5jb3JyZWN0IGluIHNvbWUgY2FzZXMuIFVzaW5nIHRoaXMgb3B0aW9uLCB5b3UgY2FuIHNlbGVjdCBhIGRldmVsb3BtZW50IHRpbWUgc2NoZW1hIGZvciBkZWZhdWx0cyBhbmQgdmFsaWRhdGlvbi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgcHJvamVjdCB0byB0aGUgd29ya2JlbmNoIGFuZCBvcGVucyB0aGUgSlBBIHBlcnNwZWN0aXZlLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjEwIiBuYW1lPSJzdGhyZWYxMCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkpQQSBQcm9qZWN0IGluIFByb2plY3QgRXhwbG9yZXI8L3A+Ci08aW1nIHNyYz0iaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmciIGFsdD0iUGFja2FnZSBFeHBsb3JlciBzaG93aW5nIHRoZSBKUEEgcHJvamVjdC4iIHRpdGxlPSJQYWNrYWdlIEV4cGxvcmVyIHNob3dpbmcgdGhlIEpQQSBwcm9qZWN0LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5Ob3cgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGEgcHJvamVjdCB3aXRoIHBlcnNpc3RlbmNlLCB5b3UgY2FuIGNvbnRpbnVlIHdpdGggPGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNCQUJGR0RERyI+Q3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHM8L2E+LjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OWVhNzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZHRERHIiBuYW1lPSJCQUJGR0RERyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjExIiBuYW1lPSJzdGhyZWYxMSI+PC9hPlRoaXMgcXVpY2sgc3RhcnQgc2hvd3MgaG93IHRvIGNyZWF0ZSBhIG5ldyBwZXJzaXN0ZW50IEphdmEgZW50aXR5LiBXZSB3aWxsIGNyZWF0ZSBhbiBlbnRpdHkgdG8gYXNzb2NpYXRlIHdpdGggYSBkYXRhYmFzZSB0YWJsZS4gWW91IHdpbGwgYWxzbyBuZWVkIHRvIGFkZCB0aGUgQUREUkVTUyB0YWJsZSB0byB5b3VyIGRhdGFiYXNlLjwvcD4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgSlBBIHByb2plY3QgaW4gdGhlIE5hdmlnYXRvciBvciBQcm9qZWN0IEV4cGxvcmVyIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXcgJmd0OyBPdGhlcjwvc3Bhbj4uIFRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBICZndDsgRW50aXR5PC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfRW50aXR5Q2xhc3NQYWdlLmh0bSNDSUFGRUlHRiI+RW50aXR5IENsYXNzIHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBwYWNrYWdlIG5hbWUgKHN1Y2ggYXMgPGNvZGU+cXVpY2tzdGFydC5kZW1vLm1vZGVsPC9jb2RlPiksIHRoZSBjbGFzcyBuYW1lIChzdWNoIGFzIDxjb2RlPkFkZHJlc3M8L2NvZGU+KSBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtI0NJQURFQ0lBIj5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC9hPiBhcHBlYXJzLCB3aGljaCBlbmFibGVzIHlvdSB0byBkZWZpbmUgdGhlIHBlcnNpc3RlbmNlIGZpZWxkcywgd2hpY2ggeW91IHdpbGwgbWFwIHRvIHRoZSBjb2x1bW5zIG9mIGEgZGF0YWJhc2UgdGFibGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGlkPSJzdGhyZWYxMiIgbmFtZT0ic3RocmVmMTIiPjwvYT48YSBpZD0ic3RocmVmMTMiIG5hbWU9InN0aHJlZjEzIj48L2E+VXNlIHRoZSBFbnRpdHkgRmllbGRzIGRpYWxvZyAoaW52b2tlZCBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPikgdG8gYWRkIHBlcnNpc3RlbmNlIGZpZWxkcyB0byB0aGUgQWRkcmVzcyBjbGFzczo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1wcml2YXRlIExvbmcgaWQ7Ci1wcml2YXRlIFN0cmluZyBjaXR5OwotcHJpdmF0ZSBTdHJpbmcgY291bnRyeTsKLXByaXZhdGUgU3RyaW5nIHN0YXRlT3JQcm92aW5jZTsKLXByaXZhdGUgU3RyaW5nIHBvc3RhbENvZGU7Ci1wcml2YXRlIFN0cmluZyBzdHJlZXQ7Ci08L3ByZT4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotWW91IHdpbGwgYWxzbyBuZWVkIHRvIGFkZCB0aGUgZm9sbG93aW5nIGNvbHVtbnMgdG8gdGhlIEFERFJFU1MgZGF0YWJhc2UgdGFibGU6Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1OVU1CRVIoMTAsMCkgQUREUkVTU19JRCAocHJpbWFyeSBrZXkpCi1WQVJDSEFSMig4MCkgUFJPVklOQ0UKLVZBUkNIQVIyKDgwKSBDT1VOVFJZCi1WQVJDSEFSMigyMCkgUF9DT0RFCi1WQVJDSEFSMig4MCkgU1RSRUVUCi1WQVJDSEFSMig4MCkgQ0lUWQotPC9wcmU+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci08L3ByZT48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi4gV2l0aCB0aGUgQ3JlYXRlIEpQQSBFbnRpdHkgY29tcGxldGVkLCBFY2xpcHNlIGRpc3BsYXlzIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkcmVzczwvc3Bhbj4gZW50aXR5IGluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcuPC9wPgotPHA+QWRkcmVzcy5qYXZhIGluY2x1ZGVzIHRoZSA8Y29kZT5ARW50aXR5PC9jb2RlPiBhbm5vdGF0aW9uLCB0aGUgcGVyc2lzdGVuY2UgZmllbGRzLCBhcyB3ZWxsIGFzIDxjb2RlPmdldHRlcjwvY29kZT4gYW5kIDxjb2RlPnNldHRlcjwvY29kZT4gbWV0aG9kcyBmb3IgZWFjaCBvZiB0aGUgZmllbGRzLjwvcD4KLTwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTQiIG5hbWU9InN0aHJlZjE0Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+QWRkcmVzcyBFbnRpdHkgaW4gQWRkcmVzcy5qYXZhPC9wPgotPGltZyBzcmM9ImltZy9qYXZhX2VkaXRvcl9hZGRyZXNzLnBuZyIgYWx0PSJKYXZhIGVkaXRvciB3aXRoIHRoZSBBZGRyZXNzIGVudGl0eS4iIHRpdGxlPSJKYXZhIGVkaXRvciB3aXRoIHRoZSBBZGRyZXNzIGVudGl0eS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+RWNsaXBzZSBhbHNvIGRpc3BsYXlzIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkcmVzczwvc3Bhbj4gZW50aXR5IGluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXc6PC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTUiIG5hbWU9InN0aHJlZjE1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+QWRkcmVzcyBFbnRpdHkgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgVmlldzwvcD4KLTxpbWcgc3JjPSJpbWcvYWRkcmVzc19qYXZhX0pQQV9zdHJ1Y3R1cmVfcXVpY2tzdGFydC5wbmciIGFsdD0iQWRkcmVzcy5qYXZhIGluIHRoZSBKUEEgU3RydWN0dXJlIFZpZXcuIiB0aXRsZT0iQWRkcmVzcy5qYXZhIGluIHRoZSBKUEEgU3RydWN0dXJlIFZpZXcuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5BZGRyZXNzPC9zcGFuPiBjbGFzcyBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LCBub3RpY2UgdGhhdCBEYWxpIGhhcyBhdXRvbWF0aWNhbGx5IGFzc29jaWF0ZWQgdGhlIEFERFJFU1MgZGF0YWJhc2UgdGFibGUgd2l0aCB0aGUgZW50aXR5IGJlY2F1c2UgdGhleSBhcmUgbmFtZWQgaWRlbnRpY2FsbHkuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1EZXBlbmRpbmcgb24geW91ciBkYXRhYmFzZSBjb25uZWN0aW9uIHR5cGUsIHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+U2NoZW1hPC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2IiBuYW1lPSJzdGhyZWYxNiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkpQQSBEZXRhaWxzIFZpZXcgZm9yIEFkZHJlc3MgRW50aXR5PC9wPgotPGltZyBzcmM9ImltZy9hZGRyZXNzLmphdmFfanBhX2RldGFpbHMucG5nIiBhbHQ9IkFkZHJlc3MuamF2YSBpbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIHRpdGxlPSJBZGRyZXNzLmphdmEgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPC9vbD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLUFmdGVyIGFzc29jaWF0aW5nIHRoZSBlbnRpdHkgd2l0aCB0aGUgZGF0YWJhc2UgdGFibGUsIHlvdSBzaG91bGQgdXBkYXRlIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgdG8gaW5jbHVkZSB0aGlzIEpQQSBlbnRpdHkuCi08cD5SaWdodC1jbGljayB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpQQSBUb29scyAmZ3Q7IFN5bmNocm9uaXplIENsYXNzIExpc3Q8L3NwYW4+LiBEYWxpIGFkZHMgdGhlIGZvbGxvd2luZyB0byB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlOjwvcD4KLTxwPjxjb2RlPiZsdDtjbGFzcyZndDtxdWlja3N0YXJ0LmRlbW8ubW9kZWwuQWRkcmVzcyZsdDsvY2xhc3MmZ3Q7PC9jb2RlPjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGVhbHNvIiAtLT48L2Rpdj4KLTxwPk5vdyB3ZSBhcmUgcmVhZHkgdG8gbWFwIGVhY2ggZmllbGRzIGluIHRoZSBBZGRyZXNzIGNsYXNzIHRvIGEgY29sdW1uIGluIHRoZSBkYXRhYmFzZSB0YWJsZS48L3A+Ci08b2w+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+aWQ8L3NwYW4+IGZpZWxkIGluIHRoZSBKUEEgRGV0YWlscyB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodCBjbGljayBpZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IGlkPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+QUREUkVTU19JRDwvc3Bhbj4gaW4gdGhlIE5hbWUgZmllbGQ6PC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTciIG5hbWU9InN0aHJlZjE3Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+SlBBIERldGFpbHMgVmlldyBmb3IgdGhlIGFkZHJlc3NJZCBGaWVsZDwvcD4KLTxpbWcgc3JjPSJpbWcvYWRkcmVzc19pZF9kZXRhaWxzX3F1aWNrc3RhcnQucG5nIiBhbHQ9IlRoZSBKUEEgRGV0YWlscyB2aWV3IGZvciB0aGUgQWRkcmVzcyBlbnRpdHkmcnNxdW87cyBpZCBhdHRyaWJ1dGUuIiB0aXRsZT0iVGhlIEpQQSBEZXRhaWxzIHZpZXcgZm9yIHRoZSBBZGRyZXNzIGVudGl0eSZyc3F1bztzIGlkIGF0dHJpYnV0ZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIEFkZHJlc3MgZW50aXR5OjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBJZAotQENvbHVtbihuYW1lPSJBRERSRVNTX0lEIikKLTwvcHJlPjwvbGk+Ci08bGk+Ci08cD5NYXAgZWFjaCBvZiB0aGUgZm9sbG93aW5nIGZpZWxkcyAoYXMgPHNwYW4gY2xhc3M9ImJvbGQiPkJhc2ljPC9zcGFuPiBtYXBwaW5ncykgdG8gdGhlIGFwcHJvcHJpYXRlIGRhdGFiYXNlIGNvbHVtbjo8L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSFJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBtYXBwaW5ncyBmb3IgZWFjaCBvZiB0aGUgZmllbGRzIGluIHRoZSBBZGRyZXNzIGVudGl0eS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBtYXBwaW5ncyBmb3IgZWFjaCBvZiB0aGUgZmllbGRzIGluIHRoZSBBZGRyZXNzIGVudGl0eS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjMzJSIgLz4KLTxjb2wgd2lkdGg9IjMzJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDgiPkZpZWxkPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ4Ij5NYXAgQXM8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDgiPkRhdGFiYXNlIENvbHVtbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10OCIgaGVhZGVycz0icjFjMS10OCI+Y2l0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzMtdDgiPkNJVFk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10OCIgaGVhZGVycz0icjFjMS10OCI+Y291bnRyeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ4IHIxYzMtdDgiPkNPVU5UUlk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10OCIgaGVhZGVycz0icjFjMS10OCI+cG9zdGFsQ29kZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzMtdDgiPlBfQ09ERTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5wcm92aW5jZU9yU3RhdGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ4IHIxYzItdDgiPkJhc2ljPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10OCByMWMzLXQ4Ij5QUk9WSU5DRTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5zdHJlZXQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ4IHIxYzItdDgiPkJhc2ljPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10OCByMWMzLXQ4Ij5TVFJFRVQ8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkRhbGkgYXV0b21hdGljYWxseSBtYXBzIHNvbWUgZmllbGRzIHRvIHRoZSBjb3JyZWN0IGRhdGFiYXNlIGNvbHVtbiAoc3VjaCBhcyB0aGUgY2l0eSBmaWVsZCB0byB0aGUgQ2l0eSBjb2x1bW4pIGlmIHRoZSBuYW1lcyBhcmUgaWRlbnRpY2FsLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzcy5qYXZhX2pwYV9kZXRhaWxzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzcy5qYXZhX2pwYV9kZXRhaWxzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjZjAwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3MuamF2YV9qcGFfZGV0YWlscy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3NfaWRfZGV0YWlsc19xdWlja3N0YXJ0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19pZF9kZXRhaWxzX3F1aWNrc3RhcnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWY0MGNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19pZF9kZXRhaWxzX3F1aWNrc3RhcnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2phdmFfSlBBX3N0cnVjdHVyZV9xdWlja3N0YXJ0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19qYXZhX0pQQV9zdHJ1Y3R1cmVfcXVpY2tzdGFydC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjUxYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2phdmFfSlBBX3N0cnVjdHVyZV9xdWlja3N0YXJ0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2MGUwYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NyZWF0ZV9qcGFfZmllbGRzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9maWVsZHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTc5N2E4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9maWVsZHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jdXN0b21pemVfZGVmYXVsdF9lbnRpdHlfZ2VuZXJhdGlvbi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2N1c3RvbWl6ZV9kZWZhdWx0X2VudGl0eV9nZW5lcmF0aW9uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2NzYxNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2N1c3RvbWl6ZV9kZWZhdWx0X2VudGl0eV9nZW5lcmF0aW9uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3VzdG9taXplX2luZGl2aWR1YWxfZW50aXRpZXMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jdXN0b21pemVfaW5kaXZpZHVhbF9lbnRpdGllcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzN2JkZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jdXN0b21pemVfaW5kaXZpZHVhbF9lbnRpdGllcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2RldGFpbHNfZW50aXR5bWFwcGluZ3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9kZXRhaWxzX2VudGl0eW1hcHBpbmdzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2MzAwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2RldGFpbHNfZW50aXR5bWFwcGluZ3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9lcnJvcl9zYW1wbGUucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9lcnJvcl9zYW1wbGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQ5NjQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZXJyb3Jfc2FtcGxlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTExZDAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2dlbmVyYXRlX2VudGl0aWVzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfZW50aXRpZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGFhMjVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfZW50aXRpZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwbWFwcGluZ3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwbWFwcGluZ3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmVlZjNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaWNvbl9iYXNpY21hcG1hcHBpbmdzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaWNvbl9iYXNpY21hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOTM3NTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX2pvaW4ucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9qb2luLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiNjg3NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX2pvaW4ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9zaW5nbGUucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9zaW5nbGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQ2NDgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2Vfc2luZ2xlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2VfdGFiLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2VfdGFiLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2ZGQ5Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX3RhYi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2phdmFfZWRpdG9yX2FkZHJlc3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qYXZhX2VkaXRvcl9hZGRyZXNzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0Mjg5MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2phdmFfZWRpdG9yX2FkZHJlc3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qYXhiX3NjaG1lYV9nZW5lcmF0aW9uX2RpYWxvZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2pheGJfc2NobWVhX2dlbmVyYXRpb25fZGlhbG9nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliMjIyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2pheGJfc2NobWVhX2dlbmVyYXRpb25fZGlhbG9nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvanBhX3dpemFyZF9jcmVhdGVfZmllbGRzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvanBhX3dpemFyZF9jcmVhdGVfZmllbGRzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1NTBlYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2pwYV93aXphcmRfY3JlYXRlX2ZpZWxkcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBlZF9lbnRpdHlfdHlwZV9saW5rLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjYxNjAzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX2ZpbGVfbmV3LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ19maWxlX25ldy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNTU3NDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX2ZpbGVfbmV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW1iZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODZlYTZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW50aXR5LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjA0ZmQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhlOGZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9zdXBlcmNsYXNzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbW9kaWZ5X2ZhY2V0ZWRfcHJvamVjdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21vZGlmeV9mYWNldGVkX3Byb2plY3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGM3OTY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbW9kaWZ5X2ZhY2V0ZWRfcHJvamVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9iYXNpY21hcHBpbmdzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwYjdmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRhYmxlZW50aXR5bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGFibGVlbnRpdHltYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyOTRlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGFibGVlbnRpdHltYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkZWRpZG1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZGlkbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTlkYzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZGlkbWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZDUyYjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZG1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9pZG1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9pZG1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGVmYjVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25faWRtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFueXRvbWFueW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9tYW55bWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODAyMmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9tYW55bWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b29uZW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9vbmVtYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhY2MxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b29uZW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOThlYTJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkZW50aXR5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkc3VwZXJjbGFzcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hcHBlZHN1cGVyY2xhc3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzk3Y2ViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkc3VwZXJjbGFzcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvbWFueW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b21hbnltYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRkYzk4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvbWFueW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b29uZW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b29uZW1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGQ5YmJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fb25ldG9vbmVtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX3RyYW5zaWVudG1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTA0ODhmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX3ZlcnNpb25tYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODczNzEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX2ZhY2V0X3Rhc2sucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX2ZhY2V0X3Rhc2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjA3ODA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9mYWNldF90YXNrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wZXJzcGVjdGl2ZV9idXR0b24ucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3BlcnNwZWN0aXZlX2J1dHRvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDI1YWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3BlcnNwZWN0aXZlX2J1dHRvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfcHJvamVjdF90YXNrLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wcm9qZWN0X3Rhc2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjA3OWMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wcm9qZWN0X3Rhc2sucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbGMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbGMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODM4MWE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxjLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiYzc0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYWYyMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV9vdXRsaW5lX3ZpZXcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV9vdXRsaW5lX3ZpZXcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjlhYTgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcGVyc2lzdGVuY2Vfb3V0bGluZV92aWV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1NTdlZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3Byb2plY3RfcHJvcGVydGllc190YXNrcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Y2EwNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9xdWlja3N0YXJ0X3Byb2plY3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWNvbmRhcnlfdGFibGVzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2Vjb25kYXJ5X3RhYmxlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MWY5ZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWNvbmRhcnlfdGFibGVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2VudGl0eS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9lbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ViZTkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2VudGl0eS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjM1MDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfanBhX3Byb2plY3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5YzlkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2pheGJfc2NoZW1hX3dpemFyZC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9qYXhiX3NjaGVtYV93aXphcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODdlNjFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2pheGJfc2NoZW1hX3dpemFyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF90YWJsZXMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfdGFibGVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3YzkzMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF90YWJsZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zeW5jaG9ybml6ZV9jbGFzc2VzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc3luY2hvcm5pemVfY2xhc3Nlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTlmNjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zeW5jaG9ybml6ZV9jbGFzc2VzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFibGVfYXNzb2NpYXRpb25zLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFibGVfYXNzb2NpYXRpb25zLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViNDBiZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2Fzc29jaWF0aW9ucy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2VudGl0eS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2VudGl0eS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTFkYmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YWJsZV9lbnRpdHkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YXNrX2VudGVyaW5nX3F1ZXJ5LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFza19lbnRlcmluZ19xdWVyeS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YmVhY2ViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFza19lbnRlcmluZ19xdWVyeS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3VwZ3JhZGVfcGVyc2lzdGVuY2VfanBhX3ZlcnNpb24ucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy91cGdyYWRlX3BlcnNpc3RlbmNlX2pwYV92ZXJzaW9uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmYTRkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3VwZ3JhZGVfcGVyc2lzdGVuY2VfanBhX3ZlcnNpb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2luZGV4LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjliZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+Ci08aW5kZXggdmVyc2lvbj0iMS4wIj4KLSAgPGVudHJ5IGtleXdvcmQ9IkBCYXNpYyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jc3RocmVmMTE2IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAQ29sdW1uIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI0NSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQERpc2NyaW1pbmF0b3JDb2x1bW4iPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk2IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNzdGhyZWYyMzkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBEaXNjcmltaW5hdG9yVmFsdWUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk4IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNzdGhyZWYyMzciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBFbWJlZGRhYmxlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY4MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEVtYmVkZGVkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDExLmh0bSNzdGhyZWYxMjAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBFbWJlZGRlZElkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEyLmh0bSNzdGhyZWYxMjQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBFbnRpdHkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNzQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBFbnVtZXJhdGVkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1NSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEdlbmVyYXRlZFZhbHVlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0jc3RocmVmMjY1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJASWQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTMuaHRtI3N0aHJlZjEyOCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEluaGVyaXRhbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY5NCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEpvaW5Db2x1bW4iPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjEzOSIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNy5odG0jc3RocmVmMTQ5IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gVGFibGUgSW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI3N0aHJlZjI2MSIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJKb2luIENvbHVtbnMgSW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI3N0aHJlZjI2NCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQExvYiI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNTAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBNYW55VG9NYW55Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTMyIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJATWFueVRvT25lIj4KLSAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNzdGhyZWYxMzciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBNYXBwZWRTdXBlcmNsYXNzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmODgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBOYW1lZFF1ZXJ5Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI+PHRvcGljIGhyZWY9InRhc2tzMDA5Lmh0bSNzdGhyZWYxMDgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBPbmVUb01hbnkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTYuaHRtI3N0aHJlZjE0MiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE9uZVRvT25lIj4KLSAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjE0NiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE9yZGVyQnkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjU5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAU2VxdWVuY2VHZW5lcmF0b3IiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNzdGhyZWYyNjciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBUZW1wb3JhbCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNTIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBUcmFuc2llbnQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJUcmFuc2llbnQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE4Lmh0bSNzdGhyZWYxNTIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBWZXJzaW9uIj4KLSAgICA8ZW50cnkga2V5d29yZD0iVmVyc2lvbiBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI3N0aHJlZjE1NiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYXJjaGl0ZWN0dXJlIG9mIERhbGkgZmVhdHVyZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzMuaHRtI3N0aHJlZjMwMyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYXNzb2NpYXRpb24gdGFibGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRlIE5ldyBBc3NvY2lhdGlvbiI+PHRvcGljIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jc3RocmVmMjIxIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJhdHRyaWJ1dGUgb3ZlcnJpZGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQXR0cmlidXRlIG92ZXJyaWRlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwNy5odG0jc3RocmVmMjI4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJBdHRyaWJ1dGUgT3ZlcnJpZGVzIC0gaW4gSmF2YSBEZXRhaWxzIHZpZXciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJBdHRyaWJ1dGUgb3ZlcnJpZGVzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA3Lmh0bSNzdGhyZWYyMzAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImF0dHJpYnV0ZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI3N0aHJlZjI0NCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcHBpbmciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiPjx0b3BpYyBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI3N0aHJlZjIxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImJhc2ljIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJAQmFzaWMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jc3RocmVmMTE3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jc3RocmVmMTE1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iKFNlZSBhbHNvIG1hcHBpbmdzKSI+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNhY2hpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDYWNoaW5nIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDIwLmh0bSNzdGhyZWYyNzgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNhbm9uaWNhbCBtZXRhbW9kZWwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5OCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY2FyZGluYWxpdHkgLSBhc3NvY2lhdGlvbiB0YWJsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJBc3NvY2lhdGlvbiBDYXJkaW5hbGl0eSI+PHRvcGljIGhyZWY9InJlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0jc3RocmVmMjI0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjbGFzc2VzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIHBlcnNpc3RlbmNlIHRvIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWY2OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGFibGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGFibGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNy5odG0jc3RocmVmODAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbnRpdHkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY3MiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgc2NoZW1hIGZyb20iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgU2NoZW1hIGZyb20gQ2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNzdGhyZWYxOTAiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSNzdGhyZWYxOTgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW5hZ2VkIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNTAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW5hZ2luZyBwZXJzaXN0ZW50IGNsYXNzZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBGYWNldCBwYWdlIj48dG9waWMgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jc3RocmVmMjA3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFwcGVkIHN1cGVyY2xhc3MiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hcHBlZCBzdXBlcmNsYXNzIj48dG9waWMgaHJlZj0idGFza3MwMDguaHRtI3N0aHJlZjg2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic3luY2hyb25pemluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3luY2hyb25pemluZyBjbGFzc2VzIj48dG9waWMgaHJlZj0idGFza3MwMDIuaHRtI3N0aHJlZjUyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNvbHVtbnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJkaXNjcmltaW5hdG9yIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk3IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjI0MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImpvaW4iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jc3RocmVmMTM4IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjE0OCIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gVGFibGUgSW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI3N0aHJlZjI2MCIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jc3RocmVmMjYzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyB0byI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI0NiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InZhbHVlIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk5IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjIzOCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjb25uZWN0aW9uIHBvb2wiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNTEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNvbnZlcnRpbmcgSmF2YSBwcm9qZWN0IHRvIEpQQSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkNvbnZlcnRpbmcgYSBKYXZhIFByb2plY3QgdG8gYSBKUEEgUHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tzMDAxLmh0bSNzdGhyZWYzNyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQ3JlYXRlIGEgSlBBIFByb2plY3QgV2l6YXJkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jc3RocmVmMjkiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBTY2hlbWEgZnJvbSBDbGFzc2VzIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtI3N0aHJlZjE5NCIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSNzdGhyZWYyMDIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQiPjx0b3BpYyBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jc3RocmVmMjA0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJkYXRhYmFzZSB0YWJsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIGVudGl0aWVzIGZyb20iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMS5odG0jc3RocmVmMTYxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImRhdGFiYXNlIC0gcGVyc2lzdGVuY2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb25uZWN0aW9uIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNjaGVtYSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDI3Lmh0bSNzdGhyZWYyOTUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZGVyaXZlZCBJRCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNTciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImRldmVsb3BlciBkb2N1bWVudGF0aW9uIC0gRGFsaSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzMuaHRtI3N0aHJlZjMwMiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZWFnZXIgZmV0Y2giPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjQ4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRhYmxlIGNsYXNzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQEVtYmVkZGFibGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGFibGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNy5odG0jc3RocmVmODIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY3OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRlZCBJRCBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQEVtYmVkZGVkSWQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMi5odG0jc3RocmVmMTI1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMi5odG0jc3RocmVmMTIzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGVkIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJARW1iZWRkZWQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jc3RocmVmMTIxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jc3RocmVmMTE5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVudGl0aWVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQEVudGl0eSBhbm5vdGF0aW9uIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNzUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlIj48dG9waWMgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmMjAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBKUEEgRW50aXR5Ij48dG9waWMgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jc3RocmVmNDAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjdXN0b21pemluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3VzdG9taXplIEluZGl2aWR1YWwgRW50aXRpZXMiPjx0b3BpYyBocmVmPSJyZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtI3N0aHJlZjIyMCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGFibGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGFibGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNy5odG0jc3RocmVmODMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJmcm9tIHRhYmxlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyI+PHRvcGljIGhyZWY9InRhc2tzMDIxLmh0bSNzdGhyZWYxNTgiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTZWxlY3QgVGFibGVzIj48dG9waWMgaHJlZj0icmVmX3NlbGVjdFRhYmxlcy5odG0jc3RocmVmMjE2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ2VuZXJhdGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtI3N0aHJlZjIxOSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNzdGhyZWYyMjciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYXBwZWQgc3VwZXJjbGFzcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmODkiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkcyI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwNC5odG0jc3RocmVmMTMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW5jZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHMiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI3N0aHJlZjExIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icGVyc2lzdGVudCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI3N0aHJlZjcwIiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI3N0aHJlZjc2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2Vjb25kYXJ5IHRhYmxlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA4Lmh0bSNzdGhyZWYyMzMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iRW50aXR5IENsYXNzIHBhZ2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTZWxlY3RpbmcgdGhlIENyZWF0ZSBhIEpQQSBFbnRpdHkgV2l6YXJkIj48dG9waWMgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jc3RocmVmNDMiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSImbHQ7YSBpZD0mcXVvdDtzdGhyZWY0MyZxdW90OyBuYW1lPSZxdW90O3N0aHJlZjQzJnF1b3Q7Jmd0OyZsdDsvYSZndDtUaGUgRW50aXR5IENsYXNzIFBhZ2UiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNzdGhyZWY0NSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZW51bWVyYXRlZCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNTQiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1NiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZXJyb3IgbWVzc2FnZXMgLSBEYWxpIj4KLSAgICA8ZW50cnkga2V5d29yZD0iVmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zIj48dG9waWMgaHJlZj0idGFza3MwMjMuaHRtI3N0aHJlZjE2NyIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJFcnJvciBtZXNzYWdlcyI+PHRvcGljIGhyZWY9InRhc2tzMDI0Lmh0bSNzdGhyZWYxNzIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImV4dGVuc2lvbiBwb2ludHMgLSBEYWxpIGZlYXR1cmUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJEYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDMzLmh0bSNzdGhyZWYzMDQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImZldGNoIHR5cGUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjQ3IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBkaWFsb2ciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIj48dG9waWMgaHJlZj0idGFza3MwMjEuaHRtI3N0aHJlZjE2MCIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJTZWxlY3QgVGFibGVzIj48dG9waWMgaHJlZj0icmVmX3NlbGVjdFRhYmxlcy5odG0jc3RocmVmMjE1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzIHdpemFyZCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgU2NoZW1hIGZyb20gQ2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNzdGhyZWYxOTIiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBKQVhCIENsYXNzZXMgZnJvbSBhIFNjaGVtYSI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5odG0jc3RocmVmMjAwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0ZWQgdmFsdWVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSUQgbWFwcGluZ3MiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI3N0aHJlZjI2NiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNlcXVlbmNlIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNzdGhyZWYyNjgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iaGludHMgLSBxdWVyeSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwOS5odG0jc3RocmVmMTEwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQElkIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTMuaHRtI3N0aHJlZjEyOSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTMuaHRtI3N0aHJlZjEyNyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJpbmhlcml0YW5jZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0eSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY5MyIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSBDbGFzcyBwYWdlIj48dG9waWMgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0jc3RocmVmMjA5IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjIzNiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImpvaW5lZCB0YWJsZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNpbmdsZSBUYWJsZSBJbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjEwNSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNpbmdsZSB0YWJsZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWYxMDAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgLSBpbiBKYXZhIERldGFpbHMgdmlldyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNzdGhyZWYyMzUiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Imluc3RhbGxhdGlvbiAtIERhbGkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jc3RocmVmMyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSmF2YSBwcm9qZWN0IC0gY29udmVydGluZyB0byBKUEEiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiPjx0b3BpYyBocmVmPSJ0YXNrczAwMS5odG0jc3RocmVmMzUiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpBWEIiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIFNjaGVtYSBmcm9tIENsYXNzZXMiPjx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRpbmdfc2NoZW1hX2Zyb21fY2xhc3Nlcy5odG0jc3RocmVmMTkxIiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWEiPjx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtI3N0aHJlZjE5OSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iam9pbiBjb2x1bW5zIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSm9pbiBDb2x1bW5zIj48dG9waWMgaHJlZj0icmVmX2pvaW5fY29sdW1ucy5odG0jc3RocmVmMjIzIiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jc3RocmVmMjYyIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJqb2luZWQgdGFibGVzIC0gaW5oZXJpdGFuY2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTaW5nbGUgVGFibGUgSW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWYxMDYiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI3N0aHJlZjI0MiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0aWVzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpIj48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jc3RocmVmMjI1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jc3RocmVmMzAwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKUEEgRmFjZXQgcGFnZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlRoZSBKYXZhIFNvdXJjZSBQYWdlIj48dG9waWMgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI3N0aHJlZjM0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKUEEgcHJvamVjdCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbnZlcnRpbmcgZnJvbSBKYXZhIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiPjx0b3BpYyBocmVmPSJ0YXNrczAwMS5odG0jc3RocmVmMzYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyBuZXciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0Ij48dG9waWMgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI3N0aHJlZjI3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW1wbGVtZW50YXRpb24iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBGYWNldCBwYWdlIj48dG9waWMgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jc3RocmVmMjA1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icGFnZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iJmx0O2EgaWQ9JnF1b3Q7c3RocmVmMjkmcXVvdDsgbmFtZT0mcXVvdDtzdGhyZWYyOSZxdW90OyZndDsmbHQ7L2EmZ3Q7U2VsZWN0aW5nIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jc3RocmVmMzEiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSImbHQ7YSBpZD0mcXVvdDtzdGhyZWYxOTQmcXVvdDsgbmFtZT0mcXVvdDtzdGhyZWYxOTQmcXVvdDsmZ3Q7Jmx0Oy9hJmd0O1NlbGVjdGluZyB0aGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIHdpemFyZCI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNzdGhyZWYxOTYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwbGF0Zm9ybSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDI3Lmh0bSNzdGhyZWYyOTIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlBBIFN0cnVjdHVyZSB2aWV3Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIFN0cnVjdHVyZSB2aWV3Ij48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI3N0aHJlZjI3MCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibGF6eSBmZXRjaCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNDkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImxpYnJhcnkgLSBKUEEiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRmFjZXQgcGFnZSI+PHRvcGljIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI3N0aHJlZjIwNiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFueS10by1tYW55IG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJATWFueVRvTWFueSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTMzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTQuaHRtI3N0aHJlZjEzMSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYW55LXRvLW9uZSBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQE1hbnlUb09uZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNzdGhyZWYxMzYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNzdGhyZWYxMzUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFwcGVkIHN1cGVyY2xhc3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJATWFwcGVkU3VwZXJjbGFzcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmODciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmODUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyBlbnRpdGllcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIHBlcnNpc3RlbnQgZmllbGRzIj48dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNzdGhyZWYxMiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyBmaWxlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iJmx0O2EgaWQ9JnF1b3Q7c3RocmVmNTgmcXVvdDsgbmFtZT0mcXVvdDtzdGhyZWY1OCZxdW90OyZndDsmbHQ7L2EmZ3Q7TWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA0Lmh0bSNzdGhyZWY2MSIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkgQ2xhc3MgcGFnZSI+PHRvcGljIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI3N0aHJlZjIxMCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFwcGluZ3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyI+PHRvcGljIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jc3RocmVmMjIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJiYXNpYyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQmFzaWMgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEwLmh0bSNzdGhyZWYxMTQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRlZCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDExLmh0bSNzdGhyZWYxMTgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRlZCBJRCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEyLmh0bSNzdGhyZWYxMjIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJJRCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEzLmh0bSNzdGhyZWYxMjYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW55LXRvLW1hbnkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTQuaHRtI3N0aHJlZjEzMCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hbnktdG8tb25lIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjEzNCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im9uZS10by1tYW55Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTYuaHRtI3N0aHJlZjE0MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im9uZS10by1vbmUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE3Lmh0bSNzdGhyZWYxNDQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcm9ibGVtcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zIj48dG9waWMgaHJlZj0idGFza3MwMjMuaHRtI3N0aHJlZjE3MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InRyYW5zaWVudCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVHJhbnNpZW50IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOC5odG0jc3RocmVmMTUwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idmVyc2lvbiI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVmVyc2lvbiBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI3N0aHJlZjE1NCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtZXRhbW9kZWwgLSBjYW5vbmljYWwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5OSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibmFtZWQgcXVlcmllcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0eSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI+PHRvcGljIGhyZWY9InRhc2tzMDA5Lmh0bSNzdGhyZWYxMDciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJoaW50cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI+PHRvcGljIGhyZWY9InRhc2tzMDA5Lmh0bSNzdGhyZWYxMTEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibmF0aXZlIHF1ZXJpZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIj48dG9waWMgaHJlZj0idGFza3MwMDkuaHRtI3N0aHJlZjExMiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibm9ucGVyc2lzdGVudCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNsYXNzZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIj48dG9waWMgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjY4IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZmllbGRzLiBTZWUgdHJhbnNpZW50Ij48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib25lLXRvLW1hbnkgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBPbmVUb01hbnkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTQzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTQxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im9uZS10by1vbmUgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBPbmVUb09uZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjE0NyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNy5odG0jc3RocmVmMTQ1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im9yZGVyaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1OCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib3JtLnhtbCBmaWxlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlRoZSBvcm0ueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJjb25jZXB0czAwMy5odG0jc3RocmVmMjQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSlBBIEZhY2V0IHBhZ2UiPjx0b3BpYyBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNzdGhyZWYyMDgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW5hZ2luZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jc3RocmVmNTgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzYW1wbGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI3N0aHJlZjU5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im92ZXJyaWRlcyAtIEpQQSBhdHRyaWJ1dGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQXR0cmlidXRlIG92ZXJyaWRlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwNy5odG0jc3RocmVmMjI5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW5jZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJVbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2UiPjx0b3BpYyBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNzdGhyZWYxOSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImRhdGFiYXNlIGNvbm5lY3Rpb24iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jc3RocmVmMjk0IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZGF0YWJhc2Ugc2NoZW1hIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5NyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0eSBjbGFzcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNjciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJvcHRpb25zIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEphdmEgUGVyc2lzdGVuY2UgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjI4NyIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jc3RocmVmMjg5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icHJvdmlkZXIiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWY0OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW5jZS54bWwgZmlsZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJUaGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJjb25jZXB0czAwMi5odG0jc3RocmVmMjMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW5hZ2luZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjQ3IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iV29ya2luZyB3aXRoIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA1Lmh0bSNzdGhyZWY2NSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNhbXBsZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjQ4IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic3luY2hyb25pemluZyB3aXRoIGNsYXNzZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlN5bmNocm9uaXppbmcgY2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tzMDAyLmh0bSNzdGhyZWY1MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW50IGVudGl0eSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY3MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icGVyc3BlY3RpdmUgLSBKUEEgRGV2ZWxvcG1lbnQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmUiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtI3N0aHJlZjMwMSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icGxhdGZvcm0gLSBKUEEiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icHJvYmxlbXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMy5odG0jc3RocmVmMTY5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwcm9qZWN0cyAtIEpQQSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIG5ldyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtI3N0aHJlZjkiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNzdGhyZWYyNiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im9wdGlvbnMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jc3RocmVmMjkwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idmFsaWRhdGlvbiBwcmVmZXJlbmNlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNzdGhyZWYyODgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icXVlcnkgaGludHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIj48dG9waWMgaHJlZj0idGFza3MwMDkuaHRtI3N0aHJlZjEwOSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icXVpY2sgc3RhcnQgLSBEYWxpIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRGFsaSBxdWljayBzdGFydCI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMi5odG0jc3RocmVmOCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icmVxdWlyZW1lbnRzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jc3RocmVmNCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbnQgZW50aXRpZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY3MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzY2hlbWEiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJmcm9tIGNsYXNzZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgU2NoZW1hIGZyb20gQ2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNzdGhyZWYxODkiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSNzdGhyZWYxOTciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2NoZW1hIC0gZGF0YWJhc2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5NiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2Vjb25kYXJ5IHRhYmxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOC5odG0jc3RocmVmMjMxIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJTZWNvbmRhcnkgVGFibGVzIC0gaW4gSmF2YSBEZXRhaWxzIHZpZXciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDguaHRtI3N0aHJlZjIzNCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2luZ2xlIHRhYmxlIGluaGVyaXRhbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWYxMDEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InN1cGVyY2xhc3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY5MCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic3luY2hyb25pemluZyBjbGFzc2VzIHdpdGggcGVyc2lzdGVuY2UueG1sIGZpbGUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTeW5jaHJvbml6aW5nIGNsYXNzZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwMi5odG0jc3RocmVmNTQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRhYmxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFzc29jaWF0aW9ucyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVGFibGUgQXNzb2NpYXRpb25zIj48dG9waWMgaHJlZj0icmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bSNzdGhyZWYyMTgiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGUgTmV3IEFzc29jaWF0aW9uIj48dG9waWMgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNzdGhyZWYyMjIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyBlbnRpdGllcyBmcm9tIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIj48dG9waWMgaHJlZj0idGFza3MwMjEuaHRtI3N0aHJlZjE1OSIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNlbGVjdCBUYWJsZXMiPjx0b3BpYyBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSNzdGhyZWYyMTciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbmhlcml0YW5jZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWYxMDIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzZWNvbmRhcnkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOC5odG0jc3RocmVmMjMyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRlbXBvcmFsIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1MSIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjUzIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ0cmFuc2llbnQgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBUcmFuc2llbnQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlRyYW5zaWVudCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTguaHRtI3N0aHJlZjE1MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJUcmFuc2llbnQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE4Lmh0bSNzdGhyZWYxNTEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idmVyc2lvbiBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQFZlcnNpb24iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlZlcnNpb24gbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE5Lmh0bSNzdGhyZWYxNTciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVmVyc2lvbiBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI3N0aHJlZjE1NSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ2aWV3cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNzdGhyZWYyMjYiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI3N0aHJlZjI0MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBTdHJ1Y3R1cmUgdmlldyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSlBBIFN0cnVjdHVyZSB2aWV3Ij48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI3N0aHJlZjI2OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ3YXJuaW5nIG1lc3NhZ2VzIC0gRGFsaSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtcyI+PHRvcGljIGhyZWY9InRhc2tzMDIzLmh0bSNzdGhyZWYxNjgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uIj48dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAxLmh0bSNzdGhyZWY1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgZWRpdG9yIj4KLSAgICA8ZW50cnkga2V5d29yZD0iV29ya2luZyB3aXRoIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA1Lmh0bSNzdGhyZWY2NCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotPC9pbmRleD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9sZWdhbC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvbGVnYWwuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmEwMDA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9sZWdhbC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkxlZ2FsPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBMZWdhbCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjI5NCIgbmFtZT0ic3RocmVmMjk0Ij48L2E+PC9wPgotPGgxPkxlZ2FsPC9oMT4KLTxwPkNvcHlyaWdodCAmY29weTsgMjAwNiwgMjAxMCwgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvcD4KLTxwPlRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0OjwvcD4KLTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT48L2NvZGU+PC9wPgotPHA+PGEgaHJlZj0iYWJvdXQuaHRtIj5UZXJtcyBhbmQgY29uZGl0aW9ucyByZWdhcmRpbmcgdGhlIHVzZSBvZiB0aGlzIGd1aWRlLjwvYT48L3A+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWVhMGM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIERvY3VtZW50YXRpb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLWpwYURldmVsb3BtZW50PUpQQSBEZXZlbG9wbWVudAotY3JlYXRlQUpwYVByb2plY3Q9Q3JlYXRlIGEgSlBBIHByb2plY3QKLWNyZWF0ZUFKcGFQcm9qZWN0RGVzY3JpcHRpb249VGhpcyBjaGVhdCBzaGVldCBoZWxwcyB5b3UgY3JlYXRlIGEgSlBBIHByb2plY3QuCi1jcmVhdGVBUGVyc2lzdGVudEVudGl0eT1DcmVhdGUgYSBwZXJzaXN0ZW50IGVudGl0eQotY3JlYXRlQVBlcnNpc3RlbnRFbnRpdHlEZXNjcmlwdGlvbj1UaGlzIGNoZWF0IHNoZWV0IGhlbHBzIHlvdSBjcmVhdGUgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5LgotTWFwQVBlcnNpc3RlbnRFbnRpdHk9TWFwIGEgcGVyc2lzdGVudCBlbnRpdHkKLU1hcEFQZXJzaXN0ZW50RW50aXR5RGVzY3JpcHRpb249VGhpcyBjaGVhdCBzaGVldCBoZWxwcyB5b3UgbWFwIHRoZSBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgdG8gYSBkYXRhYmFzZSB0YWJsZS4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9wbHVnaW4ueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MmM1MTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTwhLS0gRGVmaW5lIFRPQyAgLS0+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0JCTx0b2MgZmlsZT0idG9jLnhtbCIgcHJpbWFyeT0idHJ1ZSIvPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZpbmUgRjEgICAtLT4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotCQk8Y29udGV4dHMgZmlsZT0iY29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC51aSIvPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZpbmUgS2V5d29yZCBJbmRleCAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotCQk8aW5kZXggZmlsZT0iaW5kZXgueG1sIi8+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLQk8IS0tIENoZWF0c2hlZXRzIC0tPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuY2hlYXRTaGVldENvbnRlbnQiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iJWpwYURldmVsb3BtZW50IiBpZD0iY29tLmpwYS5jYXRlZ29yeSIvPgotCQk8Y2hlYXRzaGVldCBuYW1lPSIlY3JlYXRlQUpwYVByb2plY3QiIGNhdGVnb3J5PSJjb20uanBhLmNhdGVnb3J5IiBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9hZGRfcGVyc2lzdGVuY2UueG1sIiBpZD0ib3JnLmVjbGlwc2UuanBhLmNoZWF0c2hlZXQuY3JlYXRlcHJvamVjdDEiPgotCQkJPGRlc2NyaXB0aW9uPiVjcmVhdGVBSnBhUHJvamVjdERlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkJPC9jaGVhdHNoZWV0PgotCQk8Y2hlYXRzaGVldCBuYW1lPSIlY3JlYXRlQVBlcnNpc3RlbnRFbnRpdHkiIGNhdGVnb3J5PSJjb20uanBhLmNhdGVnb3J5IiBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9jcmVhdGVfZW50aXR5LnhtbCIgaWQ9Im9yZy5lY2xpcHNlLmpwYS5jaGVhdHNoZWV0LmFkZGVudGl0eSI+Ci0JCQk8ZGVzY3JpcHRpb24+JWNyZWF0ZUFQZXJzaXN0ZW50RW50aXR5RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCQk8L2NoZWF0c2hlZXQ+Ci0JCTxjaGVhdHNoZWV0IG5hbWU9IiVNYXBBUGVyc2lzdGVudEVudGl0eSIgY2F0ZWdvcnk9ImNvbS5qcGEuY2F0ZWdvcnkiIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL21hcF9lbnRpdHkueG1sIiBpZD0ib3JnLmVjbGlwc2UuanBhLmNoZWF0c2hlZXQubWFwZW50aXR5Ij4KLQkJCTxkZXNjcmlwdGlvbj4lTWFwQVBlcnNpc3RlbnRFbnRpdHlEZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0JCTwvY2hlYXRzaGVldD4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDU3OGYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfRW50aXR5Q2xhc3NQYWdlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVudGl0eSBDbGFzcyBwYWdlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVudGl0eSBDbGFzcyBwYWdlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRkVJR0YiIG5hbWU9IkNJQUZFSUdGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbnRpdHkgQ2xhc3MgcGFnZTwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBFbnRpdHkgQ2xhc3MgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBFbnRpdHkgQ2xhc3MgcGFnZSBvZiB0aGUgQ3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMTclIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij5Qcm9qZWN0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NSByMWMyLXQ1Ij5UaGUgbmFtZSBvZiB0aGUgSlBBIHByb2plY3QuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NSIgaGVhZGVycz0icjFjMS10NSI+U291cmNlIEZvbGRlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDUgcjFjMi10NSI+VGhlIGxvY2F0aW9uIG9mIHRoZSBKUEEgcHJvamVjdCdzIHNyYyBmb2xkZXIuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10NSIgaGVhZGVycz0icjFjMS10NSI+SmF2YSBQYWNrYWdlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NSByMWMyLXQ1Ij5UaGUgbmFtZSBvZiB0aGUgY2xhc3MgcGFja2FnZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ1IHIxYzMtdDUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij5DbGFzcyBuYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NSByMWMyLXQ1Ij5UaGUgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ1IHIxYzMtdDUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij5TdXBlcmNsYXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NSByMWMyLXQ1Ij5TZWxlY3QgdGhlIHN1cGVyY2xhc3MuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10NSIgaGVhZGVycz0icjFjMS10NSI+PGEgaWQ9InN0aHJlZjE5NSIgbmFtZT0ic3RocmVmMTk1Ij48L2E+SW5oZXJpdGFuY2U8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ1IHIxYzItdDUiPkJlY2F1c2UgdGhlIHdpemFyZCBjcmVhdGVzIGEgSmF2YSBjbGFzcyB3aXRoIGFuIDxjb2RlPkBFbnRpdHk8L2NvZGU+IG5vdGF0aW9uLCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkVudGl0eTwvc3Bhbj4gb3B0aW9uIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcHBlZCBTdXBlcmNsYXNzPC9zcGFuPiBpZiB5b3UgZGVmaW5lZCBhIHN1cGVyY2xhc3MuPC9wPgotPHA+VG8gYWRkIGFuIDxjb2RlPkBJbmhlcml0YW5jZTwvY29kZT4gbm90YXRpb24gdG8gdGhlIGVudGl0eSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5Jbmhlcml0YW5jZTwvc3Bhbj4gYW5kIHRoZW4gc2VsZWN0IG9uZSBvZiB0aGUgaW5oZXJpdGFuY2UgbWFwcGluZyBzdHJhdGVnaWVzIChkZXNjcmliZWQgaW4gSlNSIDIyMCk6PC9wPgotPHVsPgotPGxpPgotPHA+U0lOR0xFX1RBQkxFIC0tIEFsbCBjbGFzc2VzIGluIGEgaGllcmFyY2h5IGFzIG1hcHBlZCB0byBhIHNpbmdsZSB0YWJsZS4gVGhpcyBhbm5vdGF0aW9uIGlzIHdpdGhvdXQgYW4gYXR0cmlidXRlIGZvciB0aGUgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuPC9wPgotPC9saT4KLTxsaT4KLTxwPlRBQkxFX1BFUl9DTEFTUyAtLSBFYWNoIGNsYXNzIGlzIG1hcHBlZCB0byBhIHNlcGFyYXRlIHRhYmxlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5KT0lORUQgLS0gVGhlIHJvb3Qgb2YgdGhlIGNsYXNzIGhpZXJhcmNoeSBpcyByZXByZXNlbnRlZCBieSBhIHNpbmdsZSB0YWJsZS4gRWFjaCBzdWJjbGFzcyBpcyByZXByZXNlbnRlZCBieSBhIHNlcGFyYXRlIHRhYmxlIHRoYXQgY29udGFpbnMgdGhvc2UgZmllbGRzIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZSBzdWJjbGFzcyAobm90IGluaGVyaXRlZCBmcm9tIGl0cyBzdXBlcmNsYXNzKSwgYXMgd2VsbCBhcyB0aGUgY29sdW1uKHMpIHRoYXQgcmVwcmVzZW50IGl0cyBwcmltYXJ5IGtleS4gVGhlIHByaW1hcnkga2V5IGNvbHVtbihzKSBvZiB0aGUgc3ViY2xhc3MgdGFibGUgc2VydmVzIGFzIGEgZm9yZWlnbiBrZXkgdG8gdGhlIHByaW1hcnkga2V5IG9mIHRoZSBzdXBlcmNsYXNzIHRhYmxlLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10NSByMWMzLXQ1Ij5FbnRpdHk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10NSIgaGVhZGVycz0icjFjMS10NSI+PGEgaWQ9InN0aHJlZjE5NiIgbmFtZT0ic3RocmVmMTk2Ij48L2E+WE1MIEVudGl0eSBNYXBwaW5nczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDUgcjFjMi10NSI+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgdG8gZW50aXR5IG1hcHBpbmdzIGluIFhNTDwvc3Bhbj4gdG8gY3JlYXRlIFhNTCBtYXBwaW5ncyBpbiA8Y29kZT5vcm0ueG1sPC9jb2RlPiwgcmF0aGVyIHRoYW4gYW5ub3RhdGlvbnMuCi08cD5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwaW5nIGZpbGU8L3NwYW4+IGZpZWxkIHRvIHNwZWNpZnkgdGhlIGZpbGUgdG8gdXNlLiBCeSBkZWZhdWx0LCBtYXBwaW5ncyBhcmUgc3RvcmVkIGluIHRoZSA8Y29kZT5NRVRBLUlORi9vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDUgcjFjMy10NSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSNDSUFHR0dERiI+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MTRmODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFERUNJQSIgbmFtZT0iQ0lBREVDSUEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgRW50aXR5IFByb3BlcnRpZXMgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMTk3IiBuYW1lPSJzdGhyZWYxOTciPjwvYT48YSBpZD0ic3RocmVmMTk4IiBuYW1lPSJzdGhyZWYxOTgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPiZuYnNwOzwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIHRvIGJlIGNvbnZlcnRlZCB0byBpbmZvcm1hbC4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDYiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10NiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5FbnRpdHkgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDYgcjFjMi10NiI+Ci08cD5UaGUgbmFtZSBvZiB0aGUgZW50aXR5LiBCeSBkZWZhdWx0LCB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgZW50ZXJlZCBhcyB0aGUgY2xhc3MgbmFtZS4gSWYgdGhlIGVudGl0eSBuYW1lIGRpZmZlcnMgZnJvbSB0aGUgY2xhc3MgbmFtZSwgdGhlbiB0aGUgZW50aXR5IG5hbWUgaXMgYWRkZWQgYXMgYW4gYXR0cmlidXRlLiBGb3IgZXhhbXBsZTogPGNvZGU+QEVudGl0eShuYW1lPSJFbnRpdHlOYW1lIik8L2NvZGU+LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDYgcjFjMy10NiI+Ci08cD5EZXRlcm1pbmVkIGJ5IHNlcnZlci48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5UYWJsZSBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NiByMWMyLXQ2Ij4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+VXNlIGRlZmF1bHQ8L3NwYW4+IHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBtYXBwZWQgdGFibGUgbmFtZSB0byB0aGUgZW50aXR5IG5hbWUuIE90aGVyd2lzZSwgY2xlYXIgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Vc2UgZGVmYXVsdDwvc3Bhbj4gb3B0aW9uIGFuZCBlbnRlciB0aGUgbmFtZSBpbiB0aGUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+VGFibGUgTmFtZTwvc3Bhbj4gZmllbGQuIFRoZXNlIG9wdGlvbnMgcmVzdWx0IGluIHRoZSBhZGRpdGlvbiBvZiB0aGUgPGNvZGU+QFRhYmxlPC9jb2RlPiBvcHRpb24gdG8gdGhlIEphdmEgY2xhc3MgZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ2IHIxYzMtdDYiPgotPHA+VXNlIGRlZmF1bHQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDYiIGhlYWRlcnM9InIxYzEtdDYiPgotPHA+RW50aXR5IEZpZWxkczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDYgcjFjMi10NiI+Ci08cD5DbGljayB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gYnV0dG9uIHRvIGFkZCBwZXJzaXN0ZW5jZSBmaWVsZHMgdXNpbmcgdGhlIEVudGl0eSBGaWVsZHMgZGlhbG9nLiBUaGlzIGRpYWxvZyBlbmFibGUgeW91IHRvIGJ1aWxkIGEgZmllbGQgYnkgZW50ZXJpbmcgYSBmaWVsZCBuYW1lIGFuZCBzZWxlY3RpbmcgYW1vbmcgcGVyc2lzdGVuY2UgdHlwZXMuIFRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+S2V5PC9zcGFuPiBvcHRpb24gZW5hYmxlcyB5b3UgdG8gbWFyayBhIGZpZWxkIGFzIGEgcHJpbWFyeSBrZXkuIFRoZSBkaWFsb2cncyA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiBmdW5jdGlvbiBlbmFibGVzIHlvdSB0byBhZGQgb3RoZXIgcGVyc2lzdGVuY2UgdHlwZXMgZGVzY3JpYmVkIGluIHRoZSBKUEEgc3BlY2lmaWNhdGlvbi4gVGhlIDxzcGFuIGNsYXNzPSJib2xkIj5FZGl0PC9zcGFuPiBidXR0b24gZW5hYmxlcyB5b3UgdG8gY2hhbmdlIHRoZSBuYW1lIG9yIHR5cGUgc2V0IGZvciBhIHBlcnNpc3RlbnQgZmllbGQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NiByMWMzLXQ2Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5BY2Nlc3MgVHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDYgcjFjMi10NiI+Ci08cD5TZWxlY3Qgd2hldGhlciB0aGUgZW50aXR5J3MgYWNjZXNzIHRvIGluc3RhbmNlIHZhcmlhYmxlcyBpcyBmaWVsZC1iYXNlZCBvciBwcm9wZXJ0eS1iYXNlZCwgYXMgZGVmaW5lZCBpbiB0aGUgSlBBIHNwZWNpZmljYXRpb24uPC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZpZWxkPC9zcGFuPiAmbmRhc2g7IEluc3RhbmNlIHZhcmlhYmxlcyBhcmUgYWNjZXNzZWQgZGlyZWN0bHkuIEFsbCBub24tdHJhbnNpZW50IGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgcGVyc2lzdGVudC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5PC9zcGFuPiAmbmRhc2g7IFBlcnNpc3RlbnQgc3RhdGUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcy4gVGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMgbXVzdCBiZSA8c3BhbiBjbGFzcz0iYm9sZCI+cHVibGljPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+cHJpdmF0ZTwvc3Bhbj4uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ2IHIxYzMtdDYiPgotPHA+RmllbGQ8L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jQkFCRkJKQkciPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hZGRfY29udmVydGVyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfYWRkX2NvbnZlcnRlci5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTIyNTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hZGRfY29udmVydGVyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QWRkIENvbnZlcnRlciBkaWFsb2c8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQWRkIENvbnZlcnRlciBkaWFsb2ciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHQ0dJSiIgbmFtZT0iQ0lBR0NHSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkFkZCBDb252ZXJ0ZXIgZGlhbG9nPC9oMT4KLTxwPlVzZSB0aGlzIGRpYWxvZyB0byBjcmVhdGUgYSBuZXcgRWNsaXBzZUxpbmsgY29udmVydGVyLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGhydWxlaW5mb3JtYWxtYXgiPgotPHRhYmxlIGNsYXNzPSJIUnVsZUluZm9ybWFsTWF4IiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBvcHRpb25zIG9uIHRoZSBOZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0icm93cyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ0MCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDQwIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10NDAiIGhlYWRlcnM9InIxYzEtdDQwIj5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NDAgcjFjMi10NDAiPkVudGVyIHRoZSBuYW1lIGZvciB0aGlzIGNvbnZlcnRlcjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ0MCIgaGVhZGVycz0icjFjMS10NDAiPlR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ0MCByMWMyLXQ0MCI+U2VsZWN0IHRoZSBjb252ZXJ0ZXIgdHlwZToKLTx1bD4KLTxsaT4KLTxwPkN1c3RvbTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PYmplY3QgdHlwZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TdHJ1Y3Q8L3A+Ci08L2xpPgotPGxpPgotPHA+VHlwZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbG1heCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX2NhcmRpbmFsaXR5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdiOGU1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX2NhcmRpbmFsaXR5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QXNzb2NpYXRpb24gQ2FyZGluYWxpdHk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQXNzb2NpYXRpb24gQ2FyZGluYWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGSUlGSCIgbmFtZT0iQ0lBRklJRkgiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkFzc29jaWF0aW9uIENhcmRpbmFsaXR5PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMTAiIG5hbWU9InN0aHJlZjIxMCI+PC9hPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IGNhcmRpbmFsaXR5IG9mIGFuIGFzc29jaWF0aW9uIHRhYmxlLiBEZXBlbmRpbmcgb24gdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Bc3NvY2lhdGlvbiBLaW5kPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPkpvaW4gQ29sdW1uczwvc3Bhbj4gdGhhdCB5b3Ugc2VsZWN0ZWQgcHJldmlvdXNseSwgc29tZSBhc3NvY2lhdGlvbnMgbWF5IG5vdCBiZSBhdmFpbGFibGUuPC9wPgotPHVsPgotPGxpPgotPHA+TWFueSB0byBvbmU8L3A+Ci08L2xpPgotPGxpPgotPHA+T25lIHRvIG1hbnk8L3A+Ci08L2xpPgotPGxpPgotPHA+T25lIHRvIG9uZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5NYW55IHRvIG1hbnk8L3A+Ci08L2xpPgotPC91bD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hc3NvY2lhdGlvbl90YWJsZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX3RhYmxlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgxOTdmNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX3RhYmxlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QXNzb2NpYXRpb24gVGFibGVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkFzc29jaWF0aW9uIFRhYmxlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdKSERDIiBuYW1lPSJDSUFHSkhEQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QXNzb2NpYXRpb24gVGFibGVzPC9oMT4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gc3BlY2lmeSB0aGUgYXNzb2NpYXRpb24gdGFibGVzIGZvciBhbiBlbnRpdHkuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBBc3NvY2lhdGlvbiBUYWJsZXMgZGlhbG9nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEFzc29jaWF0aW9uIFRhYmxlcyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxMiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDEyIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTIiIGhlYWRlcnM9InIxYzEtdDEyIj5Bc3NvY2lhdGlvbiBraW5kPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTIgcjFjMi10MTIiPlNwZWNpZnkgaWYgdGhlIGFzc29jaWF0aW9uIGlzIDxzcGFuIGNsYXNzPSJib2xkIj5TaW1wbGU8L3NwYW4+ICgxOk0pIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55IHRvIE1hbnk8L3NwYW4+IChNOk0pLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxMiIgaGVhZGVycz0icjFjMS10MTIiPkFzc29jaWF0aW9uIHRhYmxlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEyIHIxYzItdDEyIj5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGUgU2VsZWN0aW9uPC9zcGFuPiwgdGhlbiBzZWxlY3QgdGhlIHR3byB0YWJsZXMgdG8gYXNzb2NpYXRlLgotPHA+V2hlbiBjcmVhdGluZyBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55IHRvIE1hbnk8L3NwYW4+IGFzc29jaWF0aW9uLCB5b3UgY2FuIHNlbGVjdCBhIDxzcGFuIGNsYXNzPSJib2xkIj5Kb2luIFRhYmxlPC9zcGFuPiBmb3IgdGhlIGFzc29jaWF0aW9uLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jb25maWd1cmVfamF4Yl9jbGFzc19nZW5lcmF0aW9uX2RpYWxvZy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NvbmZpZ3VyZV9qYXhiX2NsYXNzX2dlbmVyYXRpb25fZGlhbG9nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmYzdhNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NvbmZpZ3VyZV9qYXhiX2NsYXNzX2dlbmVyYXRpb25fZGlhbG9nLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q29uZmlndXJlIEpBWEIgQ2xhc3MgR2VuZXJhdGlvbiBkaWFsb2c8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA2LTA0VDE5OjMzOjdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ29uZmlndXJlIEpBWEIgQ2xhc3MgR2VuZXJhdGlvbiBkaWFsb2ciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNISEhKQSIgbmFtZT0iQ0FDSEhISkEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNvbmZpZ3VyZSBKQVhCIENsYXNzIEdlbmVyYXRpb24gZGlhbG9nPC9oMT4KLTxwPlVzZSB0aGlzIGRpYWxvZyB0byBnZW5lcmF0ZSBKQVhCIGNsYXNzZXMgZnJvbSBhIHNjaGVtYS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsbWF4Ij4KLTx0YWJsZSBjbGFzcz0iSFJ1bGVJbmZvcm1hbE1heCIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgb3B0aW9ucyBvbiB0aGUgTmV3IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZSBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9InJvd3MiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NDEiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ0MSI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+U291cmNlIGZvbGRlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDQxIHIxYzItdDQxIj5Mb2NhdGlvbiBpbiB3aGljaCB0byBnZW5lcmF0ZSB0aGUgY2xhc3Nlcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gdG8gc2VsZWN0IGEgbG9jYXRpb24uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+UGFja2FnZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDQxIHIxYzItdDQxIj5OYW1lIG9mIHRoZSBwYWNrYWdlLiBDbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiB0byBzZWxlY3QgYW4gZXhpc3RpbmcgcGFja2FnZS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj5DYXRhbG9nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NDEgcjFjMi10NDEiPk5hbWUgb2YgdGhlIGNhdGFsb2cgZmlsZSB0byB1c2UgdG8gcmVzb2x2ZSBleHRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlcy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj5CaW5kaW5ncyBmaWxlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDQxIHIxYzItdDQxIj5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBzZWxlY3QgdGhlIGV4dGVybmFsIGJpbmRpbmdzIGZpbGVzPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbG1heCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtI0NJSENCSEpEIj5HZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hPC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1Njk0YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdCRkpFIiBuYW1lPSJDSUFHQkZKRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9oMT4KLTxwPlVzZSB0aGUgR2VuZXJhdGUgQ3VzdG9tIEVudGl0aWVzIFdpemFyZCB0byBjcmVhdGUgZW50aXRpZXMgZnJvbSB5b3VyIGRhdGFiYXNlIHRhYmxlcy48L3A+Ci08cD5UaGUgd2l6YXJkIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3NlbGVjdFRhYmxlcy5odG0jQ0lBSENHRUUiPlNlbGVjdCBUYWJsZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl90YWJsZUFzc29jaWF0aW9ucy5odG0jQ0lBQ0RJQ0IiPlRhYmxlIEFzc29jaWF0aW9uczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bSNDSUFFSkRCRSI+Q3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0jQ0lBQ0lHRUUiPkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkYTc0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGUgSlBBIEVudGl0eSB3aXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHR0dERiIgbmFtZT0iQ0lBR0dHREYiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvaDE+Ci08cD5UaGUgQ3JlYXRlIEpQQSB3aXphcmQgZW5hYmxlcyB5b3UgdG8gcXVpY2tseSBhZGQgYW4gZW50aXR5IGFuZCBhbHNvIGFkZCBwZXJzaXN0ZW5jZSBmaWVsZHMgdG8gdGhhdCBlbnRpdHkuIEluIGFkZGl0aW9uLCB0aGlzIHdpemFyZCBhZGRzIHRoZSBhY2Nlc3NvciBtZXRob2RzICg8Y29kZT5nZXR0ZXI8L2NvZGU+IGFuZCA8Y29kZT5zZXR0ZXI8L2NvZGU+KSBpbiB0aGUgY2xhc3MgZmlsZS4gVGhlIHdpemFyZCBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI0NJQUZFSUdGIj5FbnRpdHkgQ2xhc3MgcGFnZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX0VudGl0eVByb3BlcnRpZXNQYWdlLmh0bSNDSUFERUNJQSI+RW50aXR5IFByb3BlcnRpZXMgcGFnZTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzRhYTVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGR0hJRiIgbmFtZT0iQ0lBRkdISUYiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwNyIgbmFtZT0ic3RocmVmMjA3Ij48L2E+PGEgaWQ9InN0aHJlZjIwOCIgbmFtZT0ic3RocmVmMjA4Ij48L2E+VXNlIHRoZSBDcmVhdGUgTmV3IEFzc29jaWF0aW9uIHdpemFyZCB0byBzcGVjaWZ5IGFzc29jaWF0aW9uIHRhYmxlcyB3aGVuIGdlbmVyYXRpbmcgYW4gZW50aXR5LjwvcD4KLTxwPlRoZSB3aXphcmQgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfYXNzb2NpYXRpb25fdGFibGUuaHRtI0NJQUdKSERDIj5Bc3NvY2lhdGlvbiBUYWJsZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9qb2luX2NvbHVtbnMuaHRtI0NJQUVHRUVHIj5Kb2luIENvbHVtbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0jQ0lBRklJRkgiPkFzc29jaWF0aW9uIENhcmRpbmFsaXR5PC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDdkYTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQ0lHRUUiIG5hbWU9IkNJQUNJR0VFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjA2IiBuYW1lPSJzdGhyZWYyMDYiPjwvYT5Vc2UgdGhpcyBwYWdlIHRvIGN1c3RvbWl6ZSBlYWNoIGdlbmVyYXRlZCBlbnRpdHkuIFNlbGVjdCBhbiBpdGVtIGluIHRoZSBUYWJsZSBhbmQgY29sdW1ucyBhcmVhLCB0aGVuIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgZmllbGRzIGZvciBlYWNoIGl0ZW0uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBJbmRpdmlkdWFsIEVudGl0aWVzIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBJbmRpdmlkdWFsIEVudGl0aWVzIGRpYWxvZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMzIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDExIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTEiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPlRhYmxlIE1hcHBpbmc8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMSByMWMyLXQxMSI+VXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVmaW5lIHRoZSB0YWJsZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZW50aXR5LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPiZuYnNwOyZuYnNwO0tleSZuYnNwO2dlbmVyYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDExIHIxYzItdDExIj5TZWxlY3QgdGhlIGdlbmVyYXRvciB1c2VkIGZvciB0aGlzIG1hcHBpbmcuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDExIiBoZWFkZXJzPSJyMWMxLXQxMSI+Jm5ic3A7Jm5ic3A7U2VxdWVuY2UmbmJzcDtuYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTEgcjFjMi10MTEiPkVudGVyIGEgbmFtZSBmb3IgdGhlIHNlcXVlbmNlLgotPHA+WW91IGNhbiB1c2UgPHNwYW4gY2xhc3M9ImJvbGQiPiR0YWJsZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJib2xkIj4kcGs8L3NwYW4+IGFzIHZhcmlhYmxlcyBpbiB0aGUgbmFtZS4gVGhlc2Ugd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdGFibGUgbmFtZSBhbmQgcHJpbWFyeSBrZXkgY29sdW1uIG5hbWUgKHJlc3BlY3RpdmVseSkgd2hlbiBEYWxpIGdlbmVyYXRlcyBhIHRhYmxlIG1hcHBpbmcuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDExIiBoZWFkZXJzPSJyMWMxLXQxMSI+Jm5ic3A7Jm5ic3A7RW50aXR5Jm5ic3A7YWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTEgcjFjMi10MTEiPlNwZWNpZnkgdGhlIGRlZmF1bHQgZW50aXR5IGFjY2VzcyBtZXRob2Q6IDxzcGFuIGNsYXNzPSJib2xkIj5GaWVsZDwvc3Bhbj4gKGRlZmF1bHQpIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5Qcm9wZXJ0eTwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDExIiBoZWFkZXJzPSJyMWMxLXQxMSI+RG9tYWluIEphdmEgQ2xhc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMSByMWMyLXQxMSI+VXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVmaW5lIHRoZSBjbGFzcyBpbmZvcm1hdGlvbiAoPHNwYW4gY2xhc3M9ImJvbGQiPlN1cGVyY2xhc3M8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+SW50ZXJmYWNlczwvc3Bhbj4pIGZvciB0aGUgZW50aXR5LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzg4MDFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUVKREJFIiBuYW1lPSJDSUFFSkRCRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwNSIgbmFtZT0ic3RocmVmMjA1Ij48L2E+VXNlIHRoaXMgcGFnZSB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IGluZm9ybWF0aW9uIERhbGkgd2lsbCB1c2Ugd2hlbiBnZW5lcmF0aW5nIHRoZSBlbnRpdGllcyBmcm9tIHRoZSBkYXRhYmFzZSB0YWJsZXMuIFlvdSB3aWxsIGJlIGFibGUgdG8gb3ZlcnJpZGUgdGhpcyBpbmZvcm1hdGlvbiBmb3Igc3BlY2lmaWMgZW50aXRpZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBFbnRpdGllcyBkaWFsb2cuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgQ3VzdG9tIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb24gZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTAiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxMCI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+VGFibGUgTWFwcGluZzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEwIHIxYzItdDEwIj5Vc2UgdGhlc2Ugb3B0aW9ucyB0byBkZWZpbmUgdGhlIHRhYmxlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnRpdHkuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+Jm5ic3A7Jm5ic3A7S2V5Jm5ic3A7Z2VuZXJhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTAgcjFjMi10MTAiPlNlbGVjdCB0aGUgZ2VuZXJhdG9yIHVzZWQgZm9yIHRoaXMgbWFwcGluZy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtTZXF1ZW5jZSZuYnNwO25hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMCByMWMyLXQxMCI+RW50ZXIgYSBuYW1lIGZvciB0aGUgc2VxdWVuY2UuCi08cD5Zb3UgY2FuIHVzZSA8c3BhbiBjbGFzcz0iYm9sZCI+JHRhYmxlPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPiRwazwvc3Bhbj4gYXMgdmFyaWFibGVzIGluIHRoZSBuYW1lLiBUaGVzZSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB0YWJsZSBuYW1lIGFuZCBwcmltYXJ5IGtleSBjb2x1bW4gbmFtZSAocmVzcGVjdGl2ZWx5KSB3aGVuIERhbGkgZ2VuZXJhdGVzIGEgdGFibGUgbWFwcGluZy48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtFbnRpdHkmbmJzcDthY2Nlc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMCByMWMyLXQxMCI+U3BlY2lmeSB0aGUgZGVmYXVsdCBlbnRpdHkgYWNjZXNzIG1ldGhvZDogPHNwYW4gY2xhc3M9ImJvbGQiPkZpZWxkPC9zcGFuPiAoZGVmYXVsdCkgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5PC9zcGFuPi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtBc3NvY2lhdGlvbnMmbmJzcDtmZXRjaDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDEwIHIxYzItdDEwIj5TcGVjaWZ5IHRoZSBkZWZhdWx0IGZldGNoIG1vZGUgZm9yIGFzc29jaWF0aW9uczogPHNwYW4gY2xhc3M9ImJvbGQiPkRlZmF1bHQ8L3NwYW4+LCBhcyBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAoZGVmYXVsdCksIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5MYXp5PC9zcGFuPi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtDb2xsZWN0aW9uJm5ic3A7dHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDEwIHIxYzItdDEwIj5TcGVjaWZ5IGlmIHRoZSBjb2xsZWN0aW9uIHByb3BlcnRpZXMgYXJlIGEgPHNwYW4gY2xhc3M9ImJvbGQiPlNldDwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPkxpc3Q8L3NwYW4+LgotPHA+RW5hYmxlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+QWx3YXlzIGdlbmVyYXRlIG9wdGlvbmFsIEpQQSBhbm5vdGF0aW9ucyBhbmQgRERMIHBhcmFtZXRlcnM8L3NwYW4+IG9wdGlvbiB0byBoYXZlIERhbGkgaW5jbHVkZSB0aGlzIGluZm9ybWF0aW9uIGluIHRoZSBlbnRpdHkuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+RG9tYWluIEphdmEgQ2xhc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxMCByMWMyLXQxMCI+VXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVmaW5lIHRoZSBjbGFzcyBpbmZvcm1hdGlvbiAoPHNwYW4gY2xhc3M9ImJvbGQiPlBhY2thZ2U8L3NwYW4+LCA8c3BhbiBjbGFzcz0iYm9sZCI+U3VwZXJjbGFzczwvc3Bhbj4sIGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+SW50ZXJmYWNlczwvc3Bhbj4pIGZvciB0aGUgZW50aXR5LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9kZXRhaWxzX29ybS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2RldGFpbHNfb3JtLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE4NTk0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2RldGFpbHNfb3JtLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0dER0hDIiBuYW1lPSJDQUNHREdIQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9oMT4KLTxwPlRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZGlzcGxheXMgdGhlIGRlZmF1bHQgbWFwcGluZyBhbmQgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm9qZWN0IGFuZCBjb250YWlucyB0aGUgZm9sbG93aW5nIGFyZWFzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxMy5odG0jQ0FDQ0FDR0giPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNC5odG0jQ0FDRUFHQkciPlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNS5odG0jQ0lBRkdBSUoiPkdlbmVyYXRvcnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNi5odG0jQ0lBSUJBQUoiPlF1ZXJpZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNy5odG0jQ0lBREdDSUQiPkNvbnZlcnRlcnM8L2E+ICh3aGVuIHVzaW5nIEVjbGlwc2VMaW5rKTwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhlc2UgZGVmYXVsdHMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIHNldHRpbmdzIG9uIGEgc3BlY2lmaWMgZW50aXR5IG9yIG1hcHBpbmcuPC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhNjMwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRURFSkYiIG5hbWU9IkNJQUVERUpGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5OZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZzwvaDE+Ci08cD5TcGVjaWZ5IHRoZSBsb2NhdGlvbiBhbmQgcHJvcGVydGllcyBvZiB0aGUgRWNsaXBzZUxpbmsgbWFwcGluZyBmaWxlICg8Y29kZT5lY2xpc3BlbGluay1vcm0ueG1sPC9jb2RlPikuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbG1heCI+Ci08dGFibGUgY2xhc3M9IkhSdWxlSW5mb3JtYWxNYXgiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIG9wdGlvbnMgb24gdGhlIE5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJyb3dzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDM5Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzkiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzOSIgaGVhZGVycz0icjFjMS10MzkiPlByb2plY3Q8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzOSByMWMyLXQzOSI+U2VsZWN0IHRoZSBwcm9qZWN0IGluIHdoaWNoIHRvIGFkZCB0aGUgbWFwcGluZyBmaWxlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzOSIgaGVhZGVycz0icjFjMS10MzkiPlNvdXJjZSBmb2xkZXI8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzOSByMWMyLXQzOSI+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gYW5kIHNlbGVjdCB0aGUgc291cmNlIGZpbGUgaW4gd2hpY2ggdG8gYWRkIHRoZSBtYXBwaW5nIGZpbGUuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPi4uLzwvY29kZT48Y29kZT48c3BhbiBjbGFzcz0iY29kZWlubGluZWl0YWxpYyI+Jmx0O1BST0pFQ1QmZ3Q7PC9zcGFuPjwvY29kZT48Y29kZT4vc3JjPC9jb2RlPi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzkiIGhlYWRlcnM9InIxYzEtdDM5Ij5GaWxlIHBhdGg8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzOSByMWMyLXQzOSI+RW50ZXIgdGhlIGZpbGVuYW1lIGFuZCBwYXRoIG9mIHRoZSBtYXBwaW5nIGZpbGUuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPk1FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWw8L2NvZGU+LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQzOSIgaGVhZGVycz0icjFjMS10MzkiPkRlZmF1bHQgYWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzkgcjFjMi10MzkiPlNlbGVjdCB3aGV0aGVyIHRoZSBlbnRpdHkncyBhY2Nlc3MgdG8gaW5zdGFuY2UgdmFyaWFibGVzIGlzIDxzcGFuIGNsYXNzPSJib2xkIj5maWVsZDwvc3Bhbj4tYmFzZWQgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPnByb3BlcnR5PC9zcGFuPi1iYXNlZCwgYXMgZGVmaW5lZCBpbiB0aGUgSlBBIHNwZWNpZmljYXRpb24uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDM5IiBoZWFkZXJzPSJyMWMxLXQzOSI+QWRkIHRvIHBlcnNpc3RlbmNlIHVuaXQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQzOSByMWMyLXQzOSI+U3BlY2lmeSBpZiB0aGlzIG1hcHBpbmcgZmlsZSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgKDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4pLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQzOSIgaGVhZGVycz0icjFjMS10MzkiPiZuYnNwOyZuYnNwO1BlcnNpc3RlbmNlJm5ic3A7VW5pdDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDM5IHIxYzItdDM5Ij5TZWxlY3QgdGhlIHBlcnNpc3RlbmNlIHVuaXQgaW4gd2hpY2ggdG8gYWRkIHRoZSBtYXBwaW5nIGZpbGUuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbG1heCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDAzLmh0bSNDSUFKRUlESiI+TWFwcGluZyBGaWxlPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfamF2YV9wYWdlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfamF2YV9wYWdlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiZjNmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2phdmFfcGFnZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkphdmEgUGFnZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKYXZhIFBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHRUJBQSIgbmFtZT0iQ0lBR0VCQUEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkphdmEgUGFnZTwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBvbiB0aGUgSmF2YSBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDMiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDMiIGhlYWRlcnM9InIxYzEtdDMiPlNvdXJjZSBmb2xkZXJzIG9uIGJ1aWxkIHBhdGg8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzIHIxYzItdDMiPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgRm9sZGVyPC9zcGFuPiB0byBzZWxlY3QgYW4gZXhpc3RpbmcgSmF2YSBzb3VyY2UgZm9sZGVyIHRvIGFkZCB0byB0aGlzIHByb2plY3QuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MyByMWMzLXQzIj5FY2xpcHNlTGluazwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzIiBoZWFkZXJzPSJyMWMxLXQzIj5EZWZhdWx0IG91dHB1dCBmb2xkZXI8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzIHIxYzItdDMiPlNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSZuYnNwOzxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MyByMWMzLXQzIj5idWlsZFxjbGFzc2VzPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmViNWJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfamF4Yl9zY2hlbWFfd2l6YXJkLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDYtMDRUMTY6MTg6MTNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0dBREZIIiBuYW1lPSJDQUNHQURGSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZDwvaDE+Ci08cD5Vc2UgdGhlIEdlbmVyYXRlIFNjaGVtYSBmcm9tIEpBWEIgQ2xhc3NlcyB3aXphcmQgY3JlYXRlIGFuIFhNTCBzY2hlbWEgKCZuYnNwOy54c2QpIGZvciBhIHNldCBvZiBKQVhCIG1hcHBlZCBjbGFzc2VzLjwvcD4KLTxwPlRoZSB3aXphcmQgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfc2NoZW1hX2Zyb21fY2xhc3Nlc19wYWdlLmh0bSNDQUNIQkVHSiI+R2VuZXJhdGUgU2NoZW1hIGZyb20gQ2xhc3NlczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNDSUhIQkpDSiI+R2VuZXJhdGluZyBTY2hlbWEgZnJvbSBDbGFzc2VzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9IiNDQUNHQURGSCI+R2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZDwvYT4gPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfam9pbl9jb2x1bW5zLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfam9pbl9jb2x1bW5zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzMmNiZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pvaW5fY29sdW1ucy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpvaW4gQ29sdW1uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKb2luIENvbHVtbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFFR0VFRyIgbmFtZT0iQ0lBRUdFRUciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpvaW4gQ29sdW1uczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjA5IiBuYW1lPSJzdGhyZWYyMDkiPjwvYT5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgam9pbiBjb2x1bW5zIG9mIGFuIGFzc29jaWF0aW9uIHRhYmxlLjwvcD4KLTxwPkNsaWNrIEFkZCB0byBzcGVjaWZ5IHRoZSBqb2luIGNvbHVtbnMgYmV0d2VlbiB0aGUgdHdvIHRhYmxlcy48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI0NJQUZHSElGIj5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMjEuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllNGZmOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pwYV9mYWNldC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KUEEgRmFjZXQgcGFnZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgRmFjZXQgcGFnZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0lGRElGIiBuYW1lPSJDQUNJRkRJRiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIEZhY2V0IHBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBhdmFpbGFibGUgb24gdGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10NCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDQiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPlBsYXRmb3JtPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NCByMWMyLXQ0Ij5WZW5kb3Itc3BlY2lmaWMgSlBBIGltcGxlbWVudGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDQgcjFjMy10NCI+RWNsaXBzZUxpbms8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NCIgaGVhZGVycz0icjFjMS10NCI+PGEgaWQ9InN0aHJlZjE5MSIgbmFtZT0ic3RocmVmMTkxIj48L2E+PGEgaWQ9InN0aHJlZjE5MiIgbmFtZT0ic3RocmVmMTkyIj48L2E+SlBBIEltcGxlbWVudGF0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NCByMWMyLXQ0Ij5TZWxlY3QgYSBzcGVjaWZpYyBKUEEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbmFnZSBsaWJyYXJpZXM8L3NwYW4+IHRvIGNyZWF0ZSBvciB1cGRhdGUgYSB1c2VyIGxpYnJhcnkuPC9wPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gZG93bmxvYWQgYSBzcGVjaWZpYyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NCByMWMzLXQ0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Jm5ic3A7Jm5ic3A7VHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDQgcjFjMi10NCI+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5Vc2VyIExpYnJhcnk8L3NwYW4+IHRvIHNlbGVjdCBmcm9tIHRoZSBhdmFpbGFibGUgdXNlci1kZWZpbmVkIG9yIGRvd25sb2FkZWQgbGlicmFyaWVzLgotPHA+SWYgeW91IHNlbGVjdCBEaXNhYmxlLCB5b3UgbXVzdCBtYW51YWxseSBpbmNsdWRlIHRoZSBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSBvbiB0aGUgcHJvamVjdCBjbGFzc3BhdGguPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NCByMWMzLXQ0Ij5Vc2VyIExpYnJhcnk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Jm5ic3A7Jm5ic3A7SW5jbHVkZSBsaWJyYXJpZXMgd2l0aCB0aGlzIGFwcGxpY2F0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NCByMWMyLXQ0Ij5TcGVjaWZ5IGlmIHRoZSBzZWxlY3RlZCBsaWJyYXJpZXMgYXJlIGluY2x1ZGVkIHdoZW4gZGVwbG95aW5nIHRoZSBhcHBsaWNhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ0IHIxYzMtdDQiPlNlbGVjdGVkPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPkNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ0IHIxYzItdDQiPlNlbGVjdCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2Ugd2l0aCB0aGUgcHJvamVjdC4gRGFsaSByZXF1aXJlcyBhbiBhY3RpdmUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2UgYW5kIHZhbGlkYXRlIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzIGFuZCBtYXBwaW5ncy4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgY29ubmVjdGlvbjwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NCByMWMzLXQ0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Jm5ic3A7Jm5ic3A7T3ZlcnJpZGUmbmJzcDtkZWZhdWx0IHNjaGVtYSBmcm9tIGNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ0IHIxYzItdDQiPlNlbGVjdCBhIHNjaGVtYSBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IG9uZSB0aGF0IGlzIGRlcml2ZWQgZnJvbSB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbi4gVXNlIHRoaXMgb3B0aW9uIGlmIHRoZSBkZWZhdWx0IHNjaGVtYSBjYW5ub3QgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHVzZSB0aGlzIG9wdGlvbiB3aGVuIHRoZSBkZXBsb3ltZW50IGxvZ2luIGRpZmZlcnMgZnJvbSB0aGUgZGVzaWduLXRpbWUgbG9naW4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10NCByMWMzLXQ0Ij5UaGUgdmFsdWUgY2FsY3VsYXRlZCBieSBEYWxpLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij5KUEEgSW1wbGVtZW50YXRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQ0IHIxYzItdDQiPlNlbGVjdCB0byB1c2UgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhlIHNlcnZlciBhdCBydW50aW1lPC9zcGFuPiwgb3Igc2VsZWN0IGEgc3BlY2lmaWMgPHNwYW4gY2xhc3M9ImJvbGQiPmltcGxlbWVudGF0aW9uIGxpYnJhcnk8L3NwYW4+IHRoYXQgY29udGFpbiB0aGUgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgYW5kIGVudGl0aWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBwcm9qZWN0J3MgSmF2YSBCdWlsZCBQYXRoLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkNvbmZpZ3VyZSBkZWZhdWx0IEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5PC9zcGFuPiB0byBjcmVhdGUgYSBkZWZhdWx0IGxpYnJhcnkgZm9yIHRoZSBwcm9qZWN0IG9yIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Db25maWd1cmUgdXNlciBsaWJyYXJpZXM8L3NwYW4+IHRvIGRlZmluZSBhZGRpdGlvbmFsIGxpYnJhcmllcy48L3A+Ci08cD5EZXBlbmRpbmcgb24geW91ciBKUEEgaW1wbGVtZW50YXRpb24gKGZvciBleGFtcGxlLCBHZW5lcmljIG9yIEVjbGlwc2VMaW5rKSwgZGlmZmVyZW50IG9wdGlvbnMgbWF5IGJlIGF2YWlsYWJsZSB3aGVuIHdvcmtpbmcgd2l0aCBKUEEgcHJvamVjdHMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10NCByMWMzLXQ0Ij5EZXRlcm1pbmVkIGJ5IHNlcnZlci48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10NCIgaGVhZGVycz0icjFjMS10NCI+PGEgaWQ9InN0aHJlZjE5MyIgbmFtZT0ic3RocmVmMTkzIj48L2E+UGVyc2lzdGVudCBjbGFzcyBtYW5hZ2VtZW50PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10NCByMWMyLXQ0Ij5TcGVjaWZ5IGlmIERhbGkgd2lsbCA8c3BhbiBjbGFzcz0iYm9sZCI+ZGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgYXV0b21hdGljYWxseTwvc3Bhbj4sIG9yIGlmIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+YW5ub3RhdGVkIGNsYXNzZXMgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbDwvc3Bhbj4gZmlsZS4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ob3RlPC9zcGFuPjogVG8gaW5zdXJlIGFwcGxpY2F0aW9uIHBvcnRhYmlsaXR5LCB5b3Ugc2hvdWxkIGV4cGxpY2l0bHkgbGlzdCB0aGUgbWFuYWdlZCBwZXJzaXN0ZW5jZSBjbGFzc2VzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDQgcjFjMy10NCI+RGV0ZXJtaW5lZCBieSBzZXJ2ZXIuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij48YSBpZD0ic3RocmVmMTk0IiBuYW1lPSJzdGhyZWYxOTQiPjwvYT5DcmVhdGUgPGNvZGU+b3JtLnhtbDwvY29kZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10NCByMWMyLXQ0Ij5TcGVjaWZ5IGlmIERhbGkgc2hvdWxkIGNyZWF0ZSBhIGRlZmF1bHQgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBmb3IgeW91ciBlbnRpdHkgbWFwcGluZ3MgYW5kIHBlcnNpc3RlbmNlIHVuaXQgZGVmYXVsdHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDQgcjFjMy10NCI+U2VsZWN0ZWQ8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX21hcHBpbmdfZ2VuZXJhbC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX21hcHBpbmdfZ2VuZXJhbC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMDJiYjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9tYXBwaW5nX2dlbmVyYWwuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhbCBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmFsIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQkhGSUoiIG5hbWU9IkNBQ0JIRklKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmFsIGluZm9ybWF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIEdlbmVyYWwgcHJvcGVydGllcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KYXZhIERldGFpbHMgdmlldzwvc3Bhbj4gZm9yIGVhY2ggbWFwcGluZyB0eXBlLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjclIiAvPgotPGNvbCB3aWR0aD0iMjElIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTYiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE2Ij5EZWZhdWx0PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWM0LXQxNiI+QXZhaWxhYmxlIGZvciBNYXBwaW5nIFR5cGU8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+TWFwcGluZyBUeXBlIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE2IHIxYzItdDE2Ij5DbGlja2luZyB0aGUgbmFtZSBvZiB0aGUgbWFwcGluZyB0eXBlLCB3aGljaCBpcyByZXByZXNlbnRlZCBhcyBhIGh5cGVybGluaywgaW52b2tlcyB0aGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cuIFVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIGF0dHJpYnV0ZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNiByMWMzLXQxNiI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNiByMWM0LXQxNiI+QWxsIG1hcHBpbmcgdHlwZXM8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij48YSBpZD0iQ0FDR0NCSEIiIG5hbWU9IkNBQ0dDQkhCIj48L2E+Q29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTYgcjFjMi10MTYiPjxhIGlkPSJzdGhyZWYyMzEiIG5hbWU9InN0aHJlZjIzMSI+PC9hPjxhIGlkPSJzdGhyZWYyMzIiIG5hbWU9InN0aHJlZjIzMiI+PC9hPlRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUuIFRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBDb2x1bW48L2NvZGU+IGFubm90YXRpb24uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTYgcjFjMy10MTYiPkJ5IGRlZmF1bHQsIHRoZSBDb2x1bW4gaXMgYXNzdW1lZCB0byBiZSBuYW1lZCBpZGVudGljYWxseSB0byB0aGUgYXR0cmlidXRlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxOS5odG0jQkFCSElCSUkiPlZlcnNpb24gbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtOYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTYgcjFjMi10MTYiPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBDb2x1bW48L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7VGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNiByMWMyLXQxNiI+TmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgY29sdW1uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO0luc2VydGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNiByMWMyLXQxNiI+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIDxjb2RlPlNRTCBJTlNFUlQ8L2NvZGU+IHN0YXRlbWVudHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTYgcjFjMy10MTYiPlRydWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO1VwZGF0YWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZpZXMgaWYgdGhpcyBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIDxjb2RlPlNRTCBVUERBVEU8L2NvZGU+IHN0YXRlbWVudHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTYgcjFjMy10MTYiPlRydWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO1VuaXF1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE2IHIxYzItdDE2Ij5TZXRzIHRoZSA8Y29kZT5VTklRVUU8L2NvZGU+IGNvbnN0cmFpbnQgZm9yIHRoZSBjb2x1bW4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTYgcjFjMy10MTYiPkZhbHNlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtOdWxsYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBhbGxvd3MgbnVsbCB2YWx1ZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTYgcjFjMy10MTYiPlRydWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtMZW5ndGg8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTYgcjFjMi10MTYiPlNldHMgdGhlIGNvbHVtbiBsZW5ndGguPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDE2IHIxYzMtdDE2Ij4yNTU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjExYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7UHJlY2lzaW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDE2IHIxYzItdDE2Ij5TZXRzIHRoZSBwcmVjaXNpb24gZm9yIHRoZSBjb2x1bW4gdmFsdWVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxNiByMWMzLXQxNiI+MDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTJjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtTY2FsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxNiByMWMyLXQxNiI+U2V0cyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB0aGF0IGFwcGVhciB0byB0aGUgcmlnaHQgb2YgdGhlIGRlY2ltYWwgcG9pbnQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDE2IHIxYzMtdDE2Ij4wPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxM2MxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO0NvbHVtbiBEZWZpbml0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDE2IHIxYzItdDE2Ij5EZWZpbmUgdGhlIERETCBmb3IgYSBjb2x1bW4uIFRoaXMgaXMgdXNlZCB3aGVuIGEgdGFibGUgaXMgYmVpbmcgZ2VuZXJhdGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJDQUNHR0dIQiIgbmFtZT0iQ0FDR0dHSEIiPjwvYT48YSBpZD0ic3RocmVmMjMzIiBuYW1lPSJzdGhyZWYyMzMiPjwvYT48YSBpZD0ic3RocmVmMjM0IiBuYW1lPSJzdGhyZWYyMzQiPjwvYT48YSBpZD0ic3RocmVmMjM1IiBuYW1lPSJzdGhyZWYyMzUiPjwvYT5GZXRjaCBUeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDE2IHIxYzItdDE2Ij5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZToKLTx1bD4KLTxsaT4KLTxwPkVhZ2VyICZuZGFzaDsgRGF0YSBpcyBsb2FkZWQgaW4gYmVmb3JlIGl0IGlzIGFjdHVhbGx5IG5lZWRlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eSAmbmRhc2g7IERhdGEgaXMgbG9hZGVkIG9ubHkgd2hlbiByZXF1aXJlZCBieSB0aGUgdHJhbnNhY3Rpb24uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTRjMS10MTYgcjFjMy10MTYiPkVhZ2VyPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNWMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPk9wdGlvbmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE1YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTVjMS10MTYgcjFjMy10MTYiPlllczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNWMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNmMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJDQUNCQklCSSIgbmFtZT0iQ0FDQkJJQkkiPjwvYT48YSBpZD0ic3RocmVmMjM2IiBuYW1lPSJzdGhyZWYyMzYiPjwvYT5Mb2I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTZjMS10MTYgcjFjMi10MTYiPlNwZWNpZnkgaWYgdGhlIGZpZWxkIGlzIG1hcHBlZCB0byA8Y29kZT5qYXZhLnNxbC5DbG9iPC9jb2RlPiBvciA8Y29kZT5qYXZhLnNxbC5CbG9iPC9jb2RlPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBMb2I8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE2YzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTZjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjE3YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0VBSkdEIiBuYW1lPSJDQUNFQUpHRCI+PC9hPjxhIGlkPSJzdGhyZWYyMzciIG5hbWU9InN0aHJlZjIzNyI+PC9hPjxhIGlkPSJzdGhyZWYyMzgiIG5hbWU9InN0aHJlZjIzOCI+PC9hPjxhIGlkPSJzdGhyZWYyMzkiIG5hbWU9InN0aHJlZjIzOSI+PC9hPlRlbXBvcmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE3YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLTx1bD4KLTxsaT4KLTxwPkRhdGUgJm5kYXNoOyA8Y29kZT5qYXZhLnNxbC5EYXRlPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lICZuZGFzaDsgPGNvZGU+amF2YS5zcWwuVGltZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZXN0YW1wICZuZGFzaDsgPGNvZGU+amF2YS5zcWwuVGltZXN0YW1wPC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QFRlbXBvcmFsPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxN2MxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE3YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxOGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJzdGhyZWYyNDAiIG5hbWU9InN0aHJlZjI0MCI+PC9hPjxhIGlkPSJzdGhyZWYyNDEiIG5hbWU9InN0aHJlZjI0MSI+PC9hPjxhIGlkPSJzdGhyZWYyNDIiIG5hbWU9InN0aHJlZjI0MiI+PC9hPkVudW1lcmF0ZWQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMThjMS10MTYgcjFjMi10MTYiPlNwZWNpZnkgaG93IHRvIHBlcnNpc3QgZW51bWVyYXRlZCBjb25zdHJhaW50cyBpZiB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZSBzdWl0cyB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cyBvciB0byBtYXRjaCBhbiBleGlzdGluZyBkYXRhYmFzZSBzY2hlbWEuCi08dWw+Ci08bGk+Ci08cD5vcmRpbmFsPC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPlN0cmluZzwvY29kZT48L3A+Ci08L2xpPgotPC91bD4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBFbnVtZXJhdGVkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxOGMxLXQxNiByMWMzLXQxNiI+T3JkaW5hbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxOGMxLXQxNiByMWM0LXQxNiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxOWMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPlRhcmdldCBFbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTljMS10MTYgcjFjMi10MTYiPlRoZSBwZXJzaXN0ZW50IGVudGl0eSB0byB3aGljaCB0aGUgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTljMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxOWMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+IDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyMGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJzdGhyZWYyNDMiIG5hbWU9InN0aHJlZjI0MyI+PC9hPklEPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIwYzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZ5IGlmIHRoZSBlbnRpdHkncyBJRCBpcyBkZXJpdmVkIGZyb20gdGhlIGlkZW50aXR5IG9mIGFub3RoZXIgZW50aXR5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMGMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIwYzEtdDE2IHIxYzQtdDE2Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjIxYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0pBSUhCIiBuYW1lPSJDQUNKQUlIQiI+PC9hPkNhc2NhZGUgVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMWMxLXQxNiByMWMyLXQxNiI+U3BlY2lmeSB3aGljaCBvcGVyYXRpb25zIGFyZSBwcm9wYWdhdGVkIHRocm91Z2hvdXQgdGhlIGVudGl0eS4KLTx1bD4KLTxsaT4KLTxwPkFsbCAmbmRhc2g7IEFsbCBvcGVyYXRpb25zPC9wPgotPC9saT4KLTxsaT4KLTxwPlBlcnNpc3Q8L3A+Ci08L2xpPgotPGxpPgotPHA+TWVyZ2U8L3A+Ci08L2xpPgotPGxpPgotPHA+TW92ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SZW1vdmU8L3A+Ci08L2xpPgotPGxpPgotPHA+UmVmcmVzaDwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIxYzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjFjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjIyYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0pESkpBIiBuYW1lPSJDQUNKREpKQSI+PC9hPk1hcHBlZCBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMmMxLXQxNiByMWMyLXQxNiI+VGhlIGZpZWxkIGluIHRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0ICJvd25zIiB0aGUgcmVsYXRpb25zaGlwLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIG9ubHkgb24gdGhlIG5vbi1vd25pbmcgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMmMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIyYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjIzYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0RBRElIIiBuYW1lPSJDQUNEQURJSCI+PC9hPjxhIGlkPSJzdGhyZWYyNDQiIG5hbWU9InN0aHJlZjI0NCI+PC9hPjxhIGlkPSJzdGhyZWYyNDUiIG5hbWU9InN0aHJlZjI0NSI+PC9hPk9yZGVyIEJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIzYzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yZGVyIGZvciBvYmplY3RzIHJldHVybmVkIGZyb20gYSBxdWVyeToKLTx1bD4KLTxsaT4KLTxwPk5vIG9yZGVyaW5nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5PC9wPgotPC9saT4KLTxsaT4KLTxwPkN1c3RvbSBvcmRlcmluZzwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QE9yZGVyQnk8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIzYzEtdDE2IHIxYzMtdDE2Ij5QcmltYXJ5IGtleTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyM2MxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPi4gPGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjI0YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+QXR0cmlidXRlIE92ZXJyaWRlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyNGMxLXQxNiByMWMyLXQxNiI+T3ZlcnJpZGVzIDxzcGFuIGNsYXNzPSJib2xkIj5CYXNpYzwvc3Bhbj4gbWFwcGluZ3Mgb2YgYSBtYXBwZWQgc3VwZXJjbGFzcyAoZm9yIGV4YW1wbGUsIGlmIHRoZSBpbmhlcml0ZWQgY29sdW1uIG5hbWUgaXMgaW5jb21wYXRpYmxlIHdpdGggYSBwcmUtZXhpc3RpbmcgZGF0YSBtb2RlbCwgb3IgaW52YWxpZCBhcyBhIGNvbHVtbiBuYW1lIGluIHlvdXIgZGF0YWJhc2UpLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyNGMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjI0YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+Ci08cD48YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+PC9wPgotPGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1NzZlNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5OZXcgSlBBIFByb2plY3QgcGFnZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJOZXcgSlBBIFByb2plY3QgcGFnZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JKQUdDIiBuYW1lPSJDQUNCSkFHQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TmV3IEpQQSBQcm9qZWN0IHBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBhdmFpbGFibGUgb24gdGhlIE5ldyBKUEEgUHJvamVjdCBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPlByb2plY3QgbmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIgcjFjMi10MiI+TmFtZSBvZiB0aGUgRWNsaXBzZSBKUEEgcHJvamVjdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyIHIxYzMtdDIiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj5Qcm9qZWN0IGNvbnRlbnRzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MiByMWMyLXQyIj5Mb2NhdGlvbiBvZiB0aGUgd29ya3NwYWNlIGluIHdoaWNoIHRvIHNhdmUgdGhlIHByb2plY3QuCi08cD5VbnNlbGVjdCBUaGUgPHNwYW4gY2xhc3M9ImJvbGQiPlVzZSBEZWZhdWx0PC9zcGFuPiBvcHRpb24gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IHRvIHNlbGVjdCBhIG5ldyBsb2NhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyIHIxYzMtdDIiPkN1cnJlbnQgd29ya3NwYWNlPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPlRhcmdldCBydW50aW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MiByMWMyLXQyIj5TZWxlY3QgYSBwcmUtZGVmaW5lZCB0YXJnZXQgZm9yIHRoZSBwcm9qZWN0LgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5ldzwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGVudmlyb25tZW50IHdpdGggdGhlIE5ldyBTZXJ2ZXIgUnVudGltZSB3aXphcmQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MiByMWMzLXQyIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MiIgaGVhZGVycz0icjFjMS10MiI+Q29uZmlndXJhdGlvbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyIHIxYzItdDIiPlNlbGVjdCBhIHByb2plY3QgY29uZmlndXJhdGlvbiB3aXRoIHByZS1kZWZpbmVkIGZhY2V0cy4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+Jmx0O2N1c3RvbSZndDs8L3NwYW4+IHRvIG1hbnVhbGx5IHNlbGVjdCB0aGUgZmFjZXRzIGZvciB0aGlzIHByb2plY3QuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MiByMWMzLXQyIj5VdGlsaXR5IEpQQSBwcm9qZWN0IHdpdGggSmF2YSA1LjA8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MiIgaGVhZGVycz0icjFjMS10MiI+RUFSIG1lbWJlcnNoaXA8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyIHIxYzItdDIiPlNwZWNpZnkgaWYgdGhpcyBwcm9qZWN0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhbiBFQVIgZmlsZSBmb3IgZGVwbG95bWVudC4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkVBUiBQcm9qZWN0IE5hbWU8L3NwYW4+LCBvciBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV3PC9zcGFuPiB0byBjcmVhdGUgYSBuZXcgRUFSIHByb2plY3QuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MiByMWMzLXQyIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MiIgaGVhZGVycz0icjFjMS10MiI+V29ya2luZyBzZXRzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MiByMWMyLXQyIj5TcGVjaWZ5IGlmIHRoaXMgcHJvamVjdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYW4gZXhpc3Rpbmcgd29ya2luZyBzZXQuIFRoZSBkcm9wIGRvd24gZmllbGQgc2hvd3MgYSBsaXN0IG9mIHByZXZpb3VzIHNlbGVjdGVkIHdvcmtpbmcgc2V0cy4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIHByb2plY3QgdG8gd29ya2luZyBzZXRzPC9zcGFuPiwgdGhlbiBzZWxlY3QgYSB3b3JraW5nIHNldCBpbiB3aGljaCB0byBhZGQgdGhpcyBwcm9qZWN0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDIgcjFjMy10MiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OTMyMGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNCSkdCRyIgbmFtZT0iQ0FDQkpHQkciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxOTAiIG5hbWU9InN0aHJlZjE5MCI+PC9hPlRoZSBDcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBhIG5ldyBKYXZhIHByb2plY3QgdXNpbmcgSlBBLiBUaGUgd2l6YXJkIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfamF2YV9wYWdlLmh0bSNDSUFHRUJBQSI+SmF2YSBQYWdlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNmYwOTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYWw8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhbCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUNJRkdKIiBuYW1lPSJDSUFDSUZHSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhbDwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSBHZW5lcmFsIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjI1OCIgbmFtZT0ic3RocmVmMjU4Ij48L2E+PGEgaWQ9InN0aHJlZjI1OSIgbmFtZT0ic3RocmVmMjU5Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBHZW5lcmFsIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIEdlbmVyYWwgUGFnZSIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCZyc3F1bztzIEdlbmVyYWwgcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjQiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyNCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij4KLTxwPk5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNCByMWMyLXQyNCI+Ci08cD5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNCByMWMzLXQyNCI+Ci08cD5UaGUgcHJvamVjdCBuYW1lLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+UGVyc2lzdGVuY2UgUHJvdmlkZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNCByMWMyLXQyNCI+Ci08cD5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjQgcjFjMy10MjQiPgotPHA+RGV0ZXJtaW5lZCBieSB0aGUgc2VydmVyLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+RGVzY3JpcHRpb248L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNCByMWMyLXQyNCI+Ci08cD5FbnRlciBhIGRlc2NyaXB0aW9uIGZvciB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuIFRoaXMgaXMgYW4gb3B0aW9uYWwgcHJvcGVydHkuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+TWFuYWdlZCBDbGFzc2VzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjQgcjFjMi10MjQiPgotPHA+QWRkIG9yIHJlbW92ZSB0aGUgY2xhc3NlcyBtYW5hZ2VkIHRocm91Z2ggdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjQgcjFjMi10MjQiPgotPHA+U2VsZWN0IHRvIGluY2x1ZGUgYWxsIGFubm90YXRlZCBlbnRpdHkgY2xhc3NlcyBpbiB0aGUgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNCByMWMzLXQyNCI+Ci08cD5GYWxzZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+WE1MIE1hcHBpbmcgRmlsZXM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyNCByMWMyLXQyNCI+Ci08cD5BZGQgb3IgcmVtb3ZlIHRoZSBvYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIFhNTCBmaWxlcyB0aGF0IGRlZmluZSB0aGUgY2xhc3NlcyB0byBiZSBtYW5hZ2VkIGJ5IHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI0IHIxYzMtdDI0Ij4KLTxwPk1ldGEtSU5GXG9ybS54bWw8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij4KLTxwPkpBUiBGaWxlczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDI0IHIxYzItdDI0Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyNCByMWMzLXQyNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGQyNjczLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSUZCQUYiIG5hbWU9IkJBQklGQkFGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIyOCIgbmFtZT0ic3RocmVmMjI4Ij48L2E+PGEgaWQ9InN0aHJlZjIyOSIgbmFtZT0ic3RocmVmMjI5Ij48L2E+PGEgaWQ9InN0aHJlZjIzMCIgbmFtZT0ic3RocmVmMjMwIj48L2E+VGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBkaXNwbGF5cyB0aGUgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWFwcGVkIGF0dHJpYnV0ZSBhbmQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBhcmVhczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNDQUNGQ0VKQyI+Sm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI0NBQ0ZDQ0FCIj5QcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmRhZmNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpQQSBTdHJ1Y3R1cmUgdmlldzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgU3RydWN0dXJlIHZpZXciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJFR0dGRSIgbmFtZT0iQkFCRUdHRkUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpQQSBTdHJ1Y3R1cmUgdmlldzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjU1IiBuYW1lPSJzdGhyZWYyNTUiPjwvYT48YSBpZD0ic3RocmVmMjU2IiBuYW1lPSJzdGhyZWYyNTYiPjwvYT5UaGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBTdHJ1Y3R1cmU8L3NwYW4+IHZpZXcgZGlzcGxheXMgYW4gb3V0bGluZSBvZiB0aGUgc3RydWN0dXJlIChpdHMgYXR0cmlidXRlcyBhbmQgbWFwcGluZ3MpIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgb3Igb3BlbmVkIGluIHRoZSBlZGl0b3IuIFRoZSBzdHJ1Y3R1cmFsIGVsZW1lbnRzIHNob3duIGluIHRoZSBvdXRsaW5lIGFyZSB0aGUgZW50aXR5IGFuZCBpdHMgZmllbGRzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjI1NyIgbmFtZT0ic3RocmVmMjU3Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U2FtcGxlIEpQQSBTdHJ1Y3R1cmUgVmlldzwvcD4KLTxpbWcgc3JjPSJpbWcvcGVyc2lzdGVuY2Vfb3V0bGluZV92aWV3LnBuZyIgYWx0PSJTYW1wbGUgSlBBIFN0cnVjdHVyZSB2aWV3IGZvciBhbiBlbnRpdHkuIiB0aXRsZT0iU2FtcGxlIEpQQSBTdHJ1Y3R1cmUgdmlldyBmb3IgYW4gZW50aXR5LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlOGNhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQklGQkRCIiBuYW1lPSJCQUJJRkJEQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyODYiIG5hbWU9InN0aHJlZjI4NiI+PC9hPjxhIGlkPSJzdGhyZWYyODciIG5hbWU9InN0aHJlZjI4NyI+PC9hPlRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9zcGFuPiBkZWZpbmVzIHRoZSBpbml0aWFsIHNldCBhbmQgbGF5b3V0IG9mIHZpZXdzIGluIHRoZSBXb3JrYmVuY2ggd2luZG93IHdoZW4gdXNpbmcgRGFsaS4gQnkgZGVmYXVsdCwgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L3NwYW4+IGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgdmlld3M6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jb25jZXB0cy00Lmh0bSI+UGVyc3BlY3RpdmVzPC9hPjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4ZTAxNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZBRUJCIiBuYW1lPSJCQUJGQUVCQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjExIiBuYW1lPSJzdGhyZWYyMTEiPjwvYT48YSBpZD0ic3RocmVmMjEyIiBuYW1lPSJzdGhyZWYyMTIiPjwvYT48YSBpZD0ic3RocmVmMjEzIiBuYW1lPSJzdGhyZWYyMTMiPjwvYT5UaGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGRpc3BsYXlzIHRoZSBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbnRpdHkgYW5kIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgdGFiczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDYuaHRtI0NBQ0NBR0dDIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDcuaHRtI0NBQ0lKQkdIIj5BdHRyaWJ1dGUgb3ZlcnJpZGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDguaHRtI0NBQ0JISURBIj5TZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAwOS5odG0jQ0FDRkhHSEUiPkluaGVyaXRhbmNlIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNzkwMDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0icGVyc2lzdGVuY2UueG1sIEVkaXRvciIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUNDSElEIiBuYW1lPSJDSUFDQ0hJRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvaDE+Ci08cD5UaGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdGhhdCBlbmFibGVzIHlvdSB0byB1cGRhdGUgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlLiBGb3IgcHJvamVjdHMgdXNpbmcgdGhlIEVjbGlwc2VMaW5rIHBsYXRmb3JtLCB0aGUgcGVyaXNpc3RlbmNlLnhtbCBFZGl0b3IgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0jQ0lBQ0lGR0oiPkdlbmVyYWw8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiPkNvbm5lY3Rpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOS5odG0jQ0lBSkFGRUciPkN1c3RvbWl6YXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMC5odG0jQ0lBQkVEQ0giPkNhY2hpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMS5odG0jQ0lBQkdISEkiPkxvZ2dpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMi5odG0jQ0lBRkpDSEUiPk9wdGlvbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMy5odG0jQ0lBQ0NGQ0IiPlNjaGVtYSBHZW5lcmF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjQuaHRtI0NJQUhKREZGIj5Qcm9wZXJ0aWVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjUuaHRtI0NJQUhDSkFIIj5Tb3VyY2U8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5Gb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0sIHRoZSBmb2xsb3dpbmcgc3Vic2V0IG9mIHRoZXNlIHBhZ2VzIGlzIGF2YWlsYWJsZTo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0jQ0lBQ0lGR0oiPkdlbmVyYWw8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiPkNvbm5lY3Rpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNC5odG0jQ0lBSEpERkYiPlByb3BlcnRpZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNS5odG0jQ0lBSENKQUgiPlNvdXJjZTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3ByaW1hcnlfa2V5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJpbWFyeV9rZXkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFlMDE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJpbWFyeV9rZXkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRkNDQUIiIG5hbWU9IkNBQ0ZDQ0FCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5QcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5QcmltYXJ5IEtleSBHZW5lcmF0aW9uPC9zcGFuPiBhcmVhIGluIEpQQSBEZXRhaWxzIHZpZXcgZm9yIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT4gdHlwZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBDb2x1bW5zIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjM0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE5Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTkiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxOSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQ0FDQkFKQkMiIG5hbWU9IkNBQ0JBSkJDIj48L2E+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzItdDE5Ij48YSBpZD0ic3RocmVmMjUxIiBuYW1lPSJzdGhyZWYyNTEiPjwvYT48YSBpZD0ic3RocmVmMjUyIiBuYW1lPSJzdGhyZWYyNTIiPjwvYT5UaGVzZSBmaWVsZHMgZGVmaW5lIGhvdyB0aGUgcHJpbWFyeSBrZXkgaXMgZ2VuZXJhdGVkLiBUaGVzZSBmaWVsZHMgY29ycmVzcG9uZCB0byB0aGUgPGNvZGU+QEdlbmVyYXRlZFZhbHVlPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzMtdDE5Ij5HZW5lcmF0ZWQgVmFsdWU8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQ0FDSkVFRUMiIG5hbWU9IkNBQ0pFRUVDIj48L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7U3RyYXRlZ3k8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxOSByMWMyLXQxOSI+Ci08dWw+Ci08bGk+QXV0bzwvbGk+Ci08bGk+Ci08cD5JZGVudGl0eSAmbmRhc2g7IFZhbHVlcyBhcmUgYXNzaWduZWQgYnkgdGhlIGRhdGFiYXNlJ3MgPHNwYW4gY2xhc3M9ImJvbGQiPklkZW50aXR5PC9zcGFuPiBjb2x1bW4uPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlcXVlbmNlICZuZGFzaDsgVmFsdWVzIGFyZSBhc3NpZ25lZCBieSBhIHNlcXVlbmNlIHRhYmxlIChzZWUgPGEgaHJlZj0iI0NBQ0ZGSEVIIj5TZXF1ZW5jZSZuYnNwO0dlbmVyYXRvcjwvYT4pLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UYWJsZSAmbmRhc2g7IFZhbHVlcyBhcmUgYXNzaWduZWQgYnkgYSBkYXRhYmFzZSB0YWJsZSAoc2VlIDxhIGhyZWY9IiNDQUNHRkVBSCI+VGFibGUgR2VuZXJhdG9yPC9hPikuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxOSByMWMzLXQxOSI+QXV0bzwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPjxhIGlkPSJCQUJFRUFISiIgbmFtZT0iQkFCRUVBSEoiPjwvYT4mbmJzcDsmbmJzcDtHZW5lcmF0b3IgTmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE5IHIxYzItdDE5Ij5VbmlxdWUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHZhbHVlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQ0FDR0ZFQUgiIG5hbWU9IkNBQ0dGRUFIIj48L2E+VGFibGUgR2VuZXJhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTkgcjFjMi10MTkiPlRoZXNlIGZpZWxkcyBkZWZpbmUgdGhlIGRhdGFiYXNlIHRhYmxlIHVzZWQgZm9yIGdlbmVyYXRpbmcgdGhlIHByaW1hcnkga2V5IGFuZCBjb3JyZXNwb25kIHRvIHRoZSA8Y29kZT5AVGFibGVHZW5lcmF0b3I8L2NvZGU+IGFubm90YXRpb24uCi08cD5UaGVzZSBmaWVsZHMgYXBwbHkgb25seSB3aGVuIDxzcGFuIGNsYXNzPSJib2xkIj5TdHJhdGVneTwvc3Bhbj4mbmJzcDs9Jm5ic3A7PHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE5IHIxYzItdDE5Ij5VbmlxdWUgbmFtZSBvZiB0aGUgZ2VuZXJhdG9yLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij4mbmJzcDsmbmJzcDtUYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE5IHIxYzItdDE5Ij5EYXRhYmFzZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgZ2VuZXJhdGVkIElEIHZhbHVlcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7UHJpbWFyeSBLZXkgQ29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTkgcjFjMi10MTkiPlRoZSBjb2x1bW4gaW4gdGhlIHRhYmxlIGdlbmVyYXRvcidzIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4gdGhhdCBjb250YWlucyB0aGUgcHJpbWFyeSBrZXkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPiZuYnNwOyZuYnNwO1ZhbHVlIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDE5IHIxYzItdDE5Ij5UaGUgY29sdW1uIHRoYXQgc3RvcmVzIHRoZSBnZW5lcmF0ZWQgSUQgdmFsdWVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEwYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7UHJpbWFyeSBLZXkgQ29sdW1uIFZhbHVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDE5IHIxYzItdDE5Ij5UaGUgdmFsdWUgZm9yIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+UHJpbWFyeSBLZXkgQ29sdW1uPC9zcGFuPiBpbiB0aGUgZ2VuZXJhdG9yIHRhYmxlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMWMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPjxhIGlkPSJDQUNGRkhFSCIgbmFtZT0iQ0FDRkZIRUgiPjwvYT5TZXF1ZW5jZSZuYnNwO0dlbmVyYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxOSByMWMyLXQxOSI+PGEgaWQ9InN0aHJlZjI1MyIgbmFtZT0ic3RocmVmMjUzIj48L2E+PGEgaWQ9InN0aHJlZjI1NCIgbmFtZT0ic3RocmVmMjU0Ij48L2E+VGhlc2UgZmllbGRzIGRlZmluZSB0aGUgc3BlY2lmaWMgc2VxdWVuY2UgdXNlZCBmb3IgZ2VuZXJhdGluZyB0aGUgcHJpbWFyeSBrZXkgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIDxjb2RlPkBTZXF1ZW5jZUdlbmVyYXRvcjwvY29kZT4gYW5ub3RhdGlvbi4KLTxwPlRoZXNlIGZpZWxkcyBhcHBseSBvbmx5IHdoZW4gPHNwYW4gY2xhc3M9ImJvbGQiPlN0cmF0ZWd5PC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJib2xkIj5TZXF1ZW5jZTwvc3Bhbj4uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEyYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxOSByMWMyLXQxOSI+TmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUgdG8gdXNlIGZvciBkZWZpbmluZyBwcmltYXJ5IGtleSB2YWx1ZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEzYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7U2VxdWVuY2U8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MTkgcjFjMi10MTkiPlVuaXF1ZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTZhYTg1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJKSEJDSSIgbmFtZT0iQkFCSkhCQ0kiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyNzMiIG5hbWU9InN0aHJlZjI3MyI+PC9hPjxhIGlkPSJzdGhyZWYyNzQiIG5hbWU9InN0aHJlZjI3NCI+PC9hPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkVycm9ycy9XYXJuaW5nczwvc3Bhbj4gb3B0aW9ucyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb3BlcnRpZXM8L3NwYW4+IHBhZ2UgdG8gc3BlY2lmeSB0aGUgdmFsaWRhdGlvbiBvcHRpb25zIHRvIHVzZSB3aXRoIHRoZSBwcm9qZWN0LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyBwYWdlLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMzIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDM2Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzYiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPkVuYWJsZSBwcm9qZWN0IHNwZWNpZmljIHNldHRpbmdzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgdG8gb3ZlcnJpZGUgdGhlIGdlbmVyYWwgc2V0dGluZ3MgZm9yIHRoaXMgcHJvamVjdC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij4mbmJzcDsmbmJzcDtQcm9qZWN0IGxldmVsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgd2FybmluZyBsZXZlbCB0byByZXBvcnQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7UGVyc2lzdGVudCB1bml0IGxldmVsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgd2FybmluZyBsZXZlbCB0byByZXBvcnQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7VHlwZSBsZXZlbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgdGhlIHdhcm5pbmcgbGV2ZWwgdG8gcmVwb3J0LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPiZuYnNwOyZuYnNwO0F0dHJpYnV0ZSBsZXZlbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgdGhlIHdhcm5pbmcgbGV2ZWwgdG8gcmVwb3J0LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPiZuYnNwOyZuYnNwO1NjaGVtYSBtYXBwaW5nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgd2FybmluZyBsZXZlbCB0byByZXBvcnQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7SW1wbGllZCZuYnNwO2F0dHJpYnV0ZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzNiByMWMyLXQzNiI+U2VsZWN0IHRoZSB3YXJuaW5nIGxldmVsIHRvIHJlcG9ydC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij4mbmJzcDsmbmJzcDtJbXBsaWVkJm5ic3A7YXNzb2NpYXRpb25zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgd2FybmluZyBsZXZlbCB0byByZXBvcnQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPiZuYnNwOyZuYnNwO0luaGVyaXRhbmNlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgdGhlIHdhcm5pbmcgbGV2ZWwgdG8gcmVwb3J0LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTFjMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij4mbmJzcDsmbmJzcDtRdWVyaWVzJm5ic3A7YW5kJm5ic3A7Z2VuZXJhdG9yczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQzNiByMWMyLXQzNiI+U2VsZWN0IHRoZSB3YXJuaW5nIGxldmVsIHRvIHJlcG9ydC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyNi5odG0jQkFCREJDQkkiPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NjaGVtYV9mcm9tX2NsYXNzZXNfcGFnZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NjaGVtYV9mcm9tX2NsYXNzZXNfcGFnZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZmY4MWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9zY2hlbWFfZnJvbV9jbGFzc2VzX3BhZ2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNi0wNFQxNjoxODoxM1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDSEJFR0oiIG5hbWU9IkNBQ0hCRUdKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzPC9oMT4KLTxwPlVzZSB0aGlzIGRpYWxvZyB0byBzZWxlY3QgdGhlIGNsYXNzZXMgZnJvbSB3aGljaCB0byBnZW5lcmF0ZSBhIHNjaGVtYS4gWW91IGNhbiBzZWxlY3QgYW4gZW50aXJlIHByb2plY3QsIGEgcGFja2FnZSwgb3Igc3BlY2lmaWMgY2xhc3Nlcy48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NlbGVjdFRhYmxlcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NlbGVjdFRhYmxlcy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhN2QzYzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9zZWxlY3RUYWJsZXMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5TZWxlY3QgVGFibGVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNlbGVjdCBUYWJsZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFIQ0dFRSIgbmFtZT0iQ0lBSENHRUUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNlbGVjdCBUYWJsZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwMSIgbmFtZT0ic3RocmVmMjAxIj48L2E+PGEgaWQ9InN0aHJlZjIwMiIgbmFtZT0ic3RocmVmMjAyIj48L2E+PGEgaWQ9InN0aHJlZjIwMyIgbmFtZT0ic3RocmVmMjAzIj48L2E+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+U2VsZWN0IFRhYmxlczwvc3Bhbj4gZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHRhYmxlcyBmcm9tIHdoaWNoIHRvIGNyZWF0ZSBlbnRpdGllcy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIEVudGl0aWVzIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBFbnRpdGllcyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ4Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10OCI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPkNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzItdDgiPlNlbGVjdCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gb3IgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBDb25uZWN0aW9uPC9zcGFuPiB0byBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10OCIgaGVhZGVycz0icjFjMS10OCI+U2NoZW1hPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OCByMWMyLXQ4Ij5TZWxlY3QgdGhlIGRhdGFiYXNlIHNjaGVtYSBmcm9tIHdoaWNoIHRvIHNlbGVjdCB0YWJsZXMuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPlRhYmxlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDggcjFjMi10OCI+U2VsZWN0IHRoZSB0YWJsZXMgZnJvbSB3aGljaCB0byBjcmVhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLiBUaGUgdGFibGVzIHNob3duIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzY2hlbWEgc2VsZWN0aW9ucy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10OCIgaGVhZGVycz0icjFjMS10OCI+U3luY2hyb25pemUgQ2xhc3NlcyBsaXN0ZWQgaW4gcGVyc2lzdGVuY2UueG1sPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10OCByMWMyLXQ4Ij5TcGVjaWZ5IGlmIERhbGkgc2hvdWxkIHVwZGF0ZSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIHRvIGluY2x1ZGUgdGhlIGdlbmVyYXRlZCBjbGFzc2VzLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2VsZWN0X2Nhc2NhZGVfZGlhbG9nLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2VsZWN0X2Nhc2NhZGVfZGlhbG9nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3YmYxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlNlbGVjdCBDYXNjYWRlIGRpYWxvZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTZWxlY3QgQ2FzY2FkZSBkaWFsb2ciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGREdJSiIgbmFtZT0iQ0lBRkRHSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNlbGVjdCBDYXNjYWRlIGRpYWxvZzwvaDE+Ci08cD5TcGVjaWZ5IHdoaWNoIG9wZXJhdGlvbnMgYXJlIHByb3BhZ2F0ZWQgdGhyb3VnaG91dCB0aGUgYXNzb2NpYXRpb246IEFsbCwgUGVyc2lzdCwgTWVyZ2UsIFJlbW92ZSwgb3IgUmVmcmVzaC48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDdlZjNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UYWJsZSBBc3NvY2lhdGlvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVGFibGUgQXNzb2NpYXRpb25zIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQ0RJQ0IiIG5hbWU9IkNJQUNESUNCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5UYWJsZSBBc3NvY2lhdGlvbnM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwNCIgbmFtZT0ic3RocmVmMjA0Ij48L2E+VXNlIHRoaXMgcGFnZSB0byBjcmVhdGUgb3IgZWRpdCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgZGF0YWJhc2UgdGFibGUgYW5kIGVudGl0eS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIEVudGl0aWVzIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBUYWJsZSBBc3NvY2lhdGlvbnMgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10OSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDkiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ5IiBoZWFkZXJzPSJyMWMxLXQ5Ij5UYWJsZSBhc3NvY2lhdGlvbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ5IHIxYzItdDkiPlNlbGVjdCBhbiBhc3NvY2lhdGlvbiB0byBtb2RpZnkgb3IgY2xpY2sgdG8gY3JlYXRlIGEgbmV3IHRhYmxlIGFzc29jaWF0aW9uIHdpdGggdGhlIDxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+IHdpemFyZC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10OSIgaGVhZGVycz0icjFjMS10OSI+R2VuZXJhdGUgdGhpcyBhc3NvY2lhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDkgcjFjMi10OSI+U3BlY2lmeSBpZiBEYWxpIHNob3VsZCBjcmVhdGUgdGhlIHNlbGVjdGVkIGFzc29jaWF0aW9uLiBJZiBlbmFibGVkLCB5b3UgY2FuIHNwZWNpZnkgdGhlIENhcmRpbmFsaXR5IGFuZCBKb2luIHRhYmxlIGZvciB0aGUgdGFibGUgYXNzb2NpYXRpb24uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDkiIGhlYWRlcnM9InIxYzEtdDkiPkdlbmVyYXRlIGEgcmVmZXJlbmNlIHRvIDxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtST1cmZ3Q7PC9zcGFuPiBpbiA8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEUmZ3Q7PC9zcGFuPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDkgcjFjMi10OSI+U3BlY2lmeSBpZiB0aGUgZW50aXR5IHNob3VsZCBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBzcGVjaWZpZWQgdGFibGUuCi08cD5JZiBlbmFibGVkLCB5b3UgY2FuIGFsc28gZW50ZXIgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Qcm9wZXJ0eTwvc3Bhbj4gbmFtZSBhbmQgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+Q2FzY2FkZTwvc3Bhbj4gbWV0aG9kIChhbGwsIHBlcnNpc3QsIG1lcmdlLCByZW1vdmUsIG9yIHJlZnJlc2gpIGZvciB0aGUgcmVmZXJlbmNlLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI0NJQUZHSElGIj5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0jQ0lBR0JGSkUiPkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZDwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGIwMjdkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5SZWZlcmVuY2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIFJlZmVyZW5jZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjE4OSIgbmFtZT0ic3RocmVmMTg5Ij48L2E+PC9wPgotPGgxPlJlZmVyZW5jZTwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgZGV0YWlsZWQgaGVscCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzIGluIHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbDo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDEuaHRtI0NBQ0pKSkpIIj5XaXphcmRzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDUuaHRtI0NBQ0RKSUlHIj5Qcm9wZXJ0eSBwYWdlczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI2Lmh0bSNDQUNERUlFRSI+UHJlZmVyZW5jZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyOC5odG0jQ0FDR0VKREEiPkRpYWxvZ3M8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDMwLmh0bSNDQUNESENJQSI+SWNvbnMgYW5kIGJ1dHRvbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAzMy5odG0jQ0FDQkJESUIiPkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb248L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0MDIyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+V2l6YXJkczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDYtMDRUMTk6MzM6M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJXaXphcmRzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDSkpKSkgiIG5hbWU9IkNBQ0pKSkpIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5XaXphcmRzPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nIHdpemFyZHM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDA0Lmh0bSNDSUFHSENHQSI+R2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXMgV2l6YXJkPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtI0NBQ0dBREZIIj5HZW5lcmF0ZSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMgV2l6YXJkPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MzY0MDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hcHBpbmcgRmlsZSBXaXphcmQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFwcGluZyBGaWxlIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUlKQ0NFIiBuYW1lPSJDSUFJSkNDRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TWFwcGluZyBGaWxlIFdpemFyZDwvaDE+Ci08cD5UaGUgTWFwcGluZyBGaWxlIHdpemFyZCBlbmFibGVzIHlvdSB0byBhZGQgYW4gPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB0byBhIEpQQSBwcm9qZWN0IGlmIG5vIG9iamVjdCBtYXAgZXhpc3RzIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQuIEZvciBleGFtcGxlLCBpZiB5b3UgY2xlYXJlZCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBvcm0ueG1sPC9zcGFuPiBvcHRpb24gb24gdGhlIDxhIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIj5KUEEgRmFjZXQgcGFnZTwvYT4sIHlvdSBjYW4gbGF0ZXIgYWRkIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIHRvIHRoZSBzcmMgZmlsZSBvZiB0aGUgcHJvamVjdCB1c2luZyB0aGlzIHdpemFyZC48L3A+Ci08cD5UaGUgPGEgaHJlZj0iI0NJQUlKQ0NFIj5NYXBwaW5nIEZpbGUgV2l6YXJkPC9hPiBjb25zaXN0cyBvZiB0aGUgTWFwcGluZyBGaWxlIHBhZ2UuPC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNzczY2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5NYXBwaW5nIEZpbGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFwcGluZyBGaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBSkVJREoiIG5hbWU9IkNJQUpFSURKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NYXBwaW5nIEZpbGU8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMTk5IiBuYW1lPSJzdGhyZWYxOTkiPjwvYT48YSBpZD0ic3RocmVmMjAwIiBuYW1lPSJzdGhyZWYyMDAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPk1hcHBpbmcgRmlsZSBXaXphcmQgUHJvcGVydGllczwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iTWFwcGluZyBGaWxlIFdpemFyZCBQcm9wZXJ0aWVzIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBNYXBwaW5nIEZpbGUgV2l6YXJkLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDciPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ3Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ3IiBoZWFkZXJzPSJyMWMxLXQ3Ij4KLTxwPlByb2plY3Q8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ3IHIxYzItdDciPgotPHA+VGhlIG5hbWUgb2YgdGhlIEpQQSBwcm9qZWN0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDcgcjFjMy10NyI+Ci08cD5TZWxlY3RlZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NyIgaGVhZGVycz0icjFjMS10NyI+Ci08cD5Tb3VyY2UgZm9sZGVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NyByMWMyLXQ3Ij4KLTxwPlRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvamVjdCdzIHNyYyBmb2xkZXIuIElmIG5lZWRlZCwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gdG8gcG9pbnQgdGhlIHdpemFyZCB0byB0aGUgc3JjIGZpbGUncyBsb2NhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ3IHIxYzMtdDciPgotPHA+U2VsZWN0ZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDciIGhlYWRlcnM9InIxYzEtdDciPgotPHA+RmlsZSBQYXRoPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NyByMWMyLXQ3Ij4KLTxwPlRoZSBsb2NhdGlvbiBmb3IgdGhlIG5ldyA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDcgcjFjMy10NyI+Ci08cD5TZWxlY3RlZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NyIgaGVhZGVycz0icjFjMS10NyI+Ci08cD5EZWZhdWx0IEFjY2VzczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDcgcjFjMi10NyI+Ci08cD5TZWxlY3Qgd2hldGhlciB0aGUgYWNjZXNzIHRvIHRoZSBlbnRpdHkgaXMgZmllbGQtYmFzZWQgb3IgcHJvcGVydHktYmFzZWQsIGFzIGRlZmluZWQgaW4gSlBBIHNwZWNpZmljYXRpb24uPC9wPgotPHVsPgotPGxpPgotPHA+Tm9uZSAmbmRhc2g7IE5vIGFjY2VzcyB0eXBlIHNwZWNpZmllZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5LWJhc2VkPC9zcGFuPiAmbmRhc2g7IFBlcnNpc3RlbnQgc3RhdGUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcy4gVGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMgbXVzdCBiZSA8c3BhbiBjbGFzcz0iYm9sZCI+cHVibGljPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+cHJpdmF0ZTwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GaWVsZC1iYXNlZDwvc3Bhbj4gJm5kYXNoOyBJbnN0YW5jZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2VkIGRpcmVjdGx5LiBBbGwgbm9uLXRyYW5zaWVudCBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIHBlcnNpc3RlbnQuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ3IHIxYzMtdDciPgotPHA+Tm9uZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ3IiBoZWFkZXJzPSJyMWMxLXQ3Ij4KLTxwPkFkZCB0byBwZXJzaXN0ZW5jZSB1bml0PC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NyByMWMyLXQ3Ij4KLTxwPkRlc2lnbmF0ZXMgdGhlIHBlcnNpc3RlbmNlIHVuaXQgZm9yIHRoaXMgb2JqZWN0IG1hcCBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDcgcjFjMy10NyI+Ci08cD5TZWxlY3RlZC48L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwMGNkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXMgV2l6YXJkPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdIQ0dBIiBuYW1lPSJDSUFHSENHQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXMgV2l6YXJkPC9oMT4KLTxwPlVzZSB0aGUgR2VuZXJhdGUgRERMIGZyb20gRW50aXRpZXMgV2l6YXJkIHRvIHF1aWNrbHkgY3JlYXRlIERETCBzY3JpcHRzIGZyb20geW91ciBwZXJzaXN0ZW50IGVudGl0aWVzLiBEYWxpIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5IHByaW1hcnkgYW5kIGZvcmVpZ24ga2V5cywgYmFzZWQgb24gdGhlIGVudGl0eSBtYXBwaW5ncy48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSNDSUFHR0dERiI+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTQwMGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlByb3BlcnR5IHBhZ2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlByb3BlcnR5IHBhZ2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDREpJSUciIG5hbWU9IkNBQ0RKSUlHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Qcm9wZXJ0eSBwYWdlczwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYmMyNGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmFsIGluZm9ybWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNDQUdHQyIgbmFtZT0iQ0FDQ0FHR0MiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYWwgaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgR2VuZXJhbCBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIxNyUiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxMyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDEzIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTMiPkRlZmF1bHQ8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzQtdDEzIj5BdmFpbGFibGUgZm9yIEVudGl0eSZuYnNwO1R5cGU8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+TWFwcGluZyBUeXBlIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEzIHIxYzItdDEzIj5DbGlja2luZyB0aGUgbmFtZSBvZiB0aGUgbWFwcGluZyB0eXBlLCB3aGljaCBpcyByZXByZXNlbnRlZCBhcyBhIGh5cGVybGluaywgaW52b2tlcyB0aGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cuIFVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIGVudGl0eTogTWFwcGVkIFN1cGVyY2xhc3MsIEVtYmVkZGFibGUgb3IgdGhlIGRlZmF1bHQgbWFwcGluZyB0eXBlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEzIHIxYzMtdDEzIj5FbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+LCA8YSBocmVmPSJ0YXNrczAwNy5odG0jQkFCRkVJQ0UiPkVtYmVkZGFibGU8L2E+LCBhbmQgPGEgaHJlZj0idGFza3MwMDguaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5UYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEzIHIxYzItdDEzIj5UaGUgZGVmYXVsdCBkYXRhYmFzZSB0YWJsZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBlbnRpdHkuIFRoZXNlIGZpZWxkcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwNy5odG0jQ0FDSUpCR0giPkF0dHJpYnV0ZSBvdmVycmlkZXM8L2E+IGFyZWEuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj4mbmJzcDsmbmJzcDtOYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTMgcjFjMi10MTMiPlRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGRhdGFiYXNlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXR5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+Jm5ic3A7Jm5ic3A7Q2F0YWxvZzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEzIHIxYzItdDEzIj5UaGUgZGF0YWJhc2UgY2F0YWxvZyB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEzIHIxYzMtdDEzIj5BcyBkZWZpbmVkIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj4mbmJzcDsmbmJzcDtTY2hlbWE8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMyByMWMyLXQxMyI+VGhlIGRhdGFiYXNlIHNjaGVtYSB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDEzIHIxYzMtdDEzIj5BcyBkZWZpbmVkIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTMgcjFjMi10MTMiPlRoZSBuYW1lIG9mIHRoaXMgZW50aXR5LiBCeSBkZWZhdWx0LCB0aGUgY2xhc3MgbmFtZSBpcyB1c2VkIGFzIHRoZSBlbnRpdHkgbmFtZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTMgcjFjNC10MTMiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPkFjY2VzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDEzIHIxYzItdDEzIj5UaGUgYWNjZXNzIG1ldGhvZCBmb3IgdGhpcyBlbnRpdHkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTMgcjFjMy10MTMiPkZpZWxkPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTMgcjFjNC10MTMiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPlByaW1hcnkmbmJzcDtrZXkmbmJzcDtjbGFzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDEzIHIxYzItdDEzIj5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiBhbmQgc2VsZWN0IHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIGVudGl0eS4gQ2xpY2tpbmcgdGhlIGZpZWxkIG5hbWUsIHdoaWNoIGlzIHJlcHJlc2VudGVkIGFzIGEgaHlwZXJsaW5rLCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBhIG5ldyBjbGFzcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTMgcjFjNC10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5DYWNoYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxMyByMWMyLXQxMyI+U3BlY2lmaWVzIGlmIHRoZSBlbnRpdHkgaXMgY2FjaGFibGUuCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AQ2FjaGFibGU8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDEzIHIxYzMtdDEzIj5AQ2FjaGFibGUoZmFsc2UpPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDBhY2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkF0dHJpYnV0ZSBvdmVycmlkZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQXR0cmlidXRlIG92ZXJyaWRlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0lKQkdIIiBuYW1lPSJDQUNJSkJHSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QXR0cmlidXRlIG92ZXJyaWRlczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjE0IiBuYW1lPSJzdGhyZWYyMTQiPjwvYT48YSBpZD0ic3RocmVmMjE1IiBuYW1lPSJzdGhyZWYyMTUiPjwvYT48YSBpZD0ic3RocmVmMjE2IiBuYW1lPSJzdGhyZWYyMTYiPjwvYT5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9zcGFuPiBhcmVhIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3Mgc3BlY2lmaWVkIGluIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDYuaHRtI0NBQ0NBR0dDIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBhcmVhIG9mIGFuIGF0dHJpYnV0ZS4gQXR0cmlidXRlIG92ZXJyaWRlcyBnZW5lcmFsbHkgb3ZlcnJpZGUvY29uZmlndXJlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgaW5oZXJpdGVkIG9yIGVtYmVkZGVkLjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIEF0dHJpYnV0ZSBvdmVycmlkZSBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIxNyUiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE0Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTQiPkRlZmF1bHQ8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzQtdDE0Ij5BdmFpbGFibGUgZm9yIEVudGl0eSZuYnNwO1R5cGU8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+QXR0cmlidXRlIE92ZXJyaWRlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzItdDE0Ij5TcGVjaWZ5IGEgcHJvcGVydHkgb3IgZmllbGQgdG8gYmUgb3ZlcnJpZGRlbiAoZnJvbSB0aGUgZGVmYXVsdCBtYXBwaW5ncykuIFNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTQgcjFjMy10MTQiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzQtdDE0Ij48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5Kb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMyLXQxNCI+U3BlY2lmeSB0aGUgam9pbmluZyBzdHJhdGVneS4gU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiB0byBhZGQgYSBkaWZmZXJlbnQgam9pbmluZyBzdHJhdGVneS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMzLXQxNCI+Sm9pbiBjb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTQgcjFjNC10MTQiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwNi5odG0jQ0FDQ0FHR0MiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDBmOWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNCSElEQSIgbmFtZT0iQ0FDQkhJREEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjE3IiBuYW1lPSJzdGhyZWYyMTciPjwvYT48YSBpZD0ic3RocmVmMjE4IiBuYW1lPSJzdGhyZWYyMTgiPjwvYT48YSBpZD0ic3RocmVmMjE5IiBuYW1lPSJzdGhyZWYyMTkiPjwvYT48YSBpZD0ic3RocmVmMjIwIiBuYW1lPSJzdGhyZWYyMjAiPjwvYT5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5TZWNvbmRhcnkgVGFibGVzPC9zcGFuPiBhcmVhIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgdG8gYXNzb2NpYXRlIGFkZGl0aW9uYWwgdGFibGVzIHdpdGggYW4gZW50aXR5LiBVc2UgdGhpcyBhcmVhIGlmIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbiBlbnRpdHkgaXMgc3ByZWFkIGFjcm9zcyBtdWx0aXBsZSB0YWJsZXMuPC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkwNTM4NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkluaGVyaXRhbmNlIGluZm9ybWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRkhHSEUiIG5hbWU9IkNBQ0ZIR0hFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Jbmhlcml0YW5jZSBpbmZvcm1hdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjIxIiBuYW1lPSJzdGhyZWYyMjEiPjwvYT48YSBpZD0ic3RocmVmMjIyIiBuYW1lPSJzdGhyZWYyMjIiPjwvYT5UaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgYXZhaWxhYmxlIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SW5oZXJpdGFuY2U8L3NwYW4+IGFyZWEgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgZWFjaCBlbnRpdHkgdHlwZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBJbmhlcml0YW5jZSB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBJbmhlcml0YW5jZSB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyMyUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+U3RyYXRlZ3k8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNSByMWMyLXQxNSI+U3BlY2lmeSB0aGUgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gbWFwcGluZyBhIGNsYXNzIG9yIGNsYXNzIGhpZXJhcmNoeToKLTx1bD4KLTxsaT4KLTxwPlNpbmdsZSB0YWJsZSAmbmRhc2g7IEFsbCBjbGFzc2VzIGluIHRoZSBoaWVyYXJjaHkgYXJlIG1hcHBlZCB0byBhIHNpbmdsZSB0YWJsZS48L3A+Ci08L2xpPgotPGxpPgotPHA+Sm9pbmVkICZuZGFzaDsgVGhlIHJvb3Qgb2YgdGhlIGhpZXJhcmNoeSBpcyBtYXBwZWQgdG8gYSBzaW5nbGUgdGFibGU7IGVhY2ggY2hpbGQgbWFwcyB0byBpdHMgb3duIHRhYmxlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UYWJsZSBwZXIgY2xhc3MgJm5kYXNoOyBFYWNoIGNsYXNzIGlzIG1hcHBlZCB0byBhIHNlcGFyYXRlIHRhYmxlLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QEluaGVyaXRhbmNlPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE1IHIxYzMtdDE1Ij5TaW5nbGUgdGFibGU8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij48YSBpZD0ic3RocmVmMjIzIiBuYW1lPSJzdGhyZWYyMjMiPjwvYT48YSBpZD0ic3RocmVmMjI0IiBuYW1lPSJzdGhyZWYyMjQiPjwvYT5EaXNjcmltaW5hdG9yIFZhbHVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTUgcjFjMi10MTUiPlNwZWNpZnkgdGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGFuIGVudGl0eSBpbiB0aGlzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gVGhlIHZhbHVlIG11c3QgY29uZm9ybSB0byB0aGUgc3BlY2lmaWVkIDxzcGFuIGNsYXNzPSJib2xkIj5EaXNjcmltaW5hdG9yIFR5cGU8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij48YSBpZD0ic3RocmVmMjI1IiBuYW1lPSJzdGhyZWYyMjUiPjwvYT48YSBpZD0ic3RocmVmMjI2IiBuYW1lPSJzdGhyZWYyMjYiPjwvYT5EaXNjcmltaW5hdG9yIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE1IHIxYzItdDE1Ij5UaGVzZSBmaWVsZHMgYXJlIGF2YWlsYWJsZSB3aGVuIHVzaW5nIGEgPHNwYW4gY2xhc3M9ImJvbGQiPlNpbmdsZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPkpvaW5lZDwvc3Bhbj4gaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARGlzY3JpbWluYXRvckNvbHVtbjwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08cD5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5EZXRhaWxzPC9zcGFuPiBhcmVhIHRvIGRlZmluZSB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkxlbmd0aDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJib2xkIj5Db2x1bW4gZGVmaW5pdGlvbjwvc3Bhbj4gb2YgdGhpcyBEaXNjcmltaW5hdG9yIENvbHVtbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNSByMWMzLXQxNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE1IHIxYzItdDE1Ij5OYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij4mbmJzcDsmbmJzcDtUeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTUgcjFjMi10MTUiPlNldCB0aGlzIGZpZWxkIHRvIHNldCB0aGUgZGlzY3JpbWluYXRvciB0eXBlIHRvIDxjb2RlPkNoYXI8L2NvZGU+IG9yIDxjb2RlPkludGVnZXI8L2NvZGU+IChpbnN0ZWFkIG9mIGl0cyBkZWZhdWx0OiA8Y29kZT5TdHJpbmc8L2NvZGU+KS4gVGhlIDxzcGFuIGNsYXNzPSJib2xkIj5EaXNjcmltaW5hdG9yIFZhbHVlPC9zcGFuPiBtdXN0IGNvbmZvcm0gdG8gdGhpcyB0eXBlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE1IHIxYzMtdDE1Ij5TdHJpbmc8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNSByMWMyLXQxNSI+VXNlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHByaW1hcnkga2V5IGpvaW4gY29sdW1ucy4gU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBzZWxlY3QgbmV3IEpvaW4gQ29sdW1uLgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB3aXRoIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEwLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGIzZTlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5RdWVyaWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlF1ZXJpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjIyNyIgbmFtZT0ic3RocmVmMjI3Ij48L2E+Ci08aDE+UXVlcmllczwvaDE+Ci08cD5Vc2UgdGhlIHF1ZXJpZXMgYXJlYSBvZiB0aGUgSlBBIERldGFpbHMgdmlldyB0byBjcmVhdGUgbmFtZWQgcXVlcmllcyBhbmQgbmFtZWQgbmF0aXZlIHF1ZXJpZXMuIFJlZmVyIHRvIDxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJJR0JHRyI+IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPC9hPiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCSUdCR0ciPkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXM8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDExLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjZGNlOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDExLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKb2luIFRhYmxlIEluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQkFFQkMiIG5hbWU9IkNBQ0JBRUJDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Kb2luIFRhYmxlIEluZm9ybWF0aW9uPC9oMT4KLTxwPlVzZSBhcmVhIHRvIHNwZWNpZnkgYSBtYXBwZWQgY29sdW1uIGZvciBqb2luaW5nIGFuIGVudGl0eSBhc3NvY2lhdGlvbi4gQnkgZGVmYXVsdCwgdGhlIG1hcHBpbmcgaXMgYXNzdW1lZCB0byBoYXZlIGEgc2luZ2xlIGpvaW4uPC9wPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGF2YWlsYWJsZSBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpvaW4gVGFibGU8L3NwYW4+IGFyZWEgaW4gPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPnRoZSBKUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgPGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPiBhbmQgPGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT4gbWFwcGluZyB0eXBlcy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBUYWJsZSB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBUYWJsZSB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE3Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTciPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE3IHIxYzItdDE3Ij5OYW1lIG9mIHRoZSBqb2luIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNyByMWMzLXQxNyI+QnkgZGVmYXVsdCwgdGhlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgcHJpbWFyeSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdGllcyBjb25jYXRlbmF0ZWQgd2l0aCBhbiB1bmRlcnNjb3JlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPjxhIGlkPSJDQUNCQkRGRyIgbmFtZT0iQ0FDQkJERkciPjwvYT5Kb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNyByMWMyLXQxNyI+PGEgaWQ9InN0aHJlZjI0NiIgbmFtZT0ic3RocmVmMjQ2Ij48L2E+PGEgaWQ9InN0aHJlZjI0NyIgbmFtZT0ic3RocmVmMjQ3Ij48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTcgcjFjMy10MTciPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPkludmVyc2UgSm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTcgcjFjMi10MTciPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNyByMWMzLXQxNyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDI5Lmh0bSNDQUNDR0VIQyI+RWRpdCBKb2luIENvbHVtbnMgRGlhbG9nPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOTkwNzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKb2luIENvbHVtbnMgSW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNGQ0VKQyIgbmFtZT0iQ0FDRkNFSkMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjQ4IiBuYW1lPSJzdGhyZWYyNDgiPjwvYT5UaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+Sm9pbiBUYWJsZTwvc3Bhbj4gYXJlYSBpbiA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIDxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT4gYW5kIDxhIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiBtYXBwaW5nIHR5cGVzLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTgiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+Sm9pbiBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxOCByMWMyLXQxOCI+PGEgaWQ9InN0aHJlZjI0OSIgbmFtZT0ic3RocmVmMjQ5Ij48L2E+PGEgaWQ9InN0aHJlZjI1MCIgbmFtZT0ic3RocmVmMjUwIj48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTggcjFjMy10MTgiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAyOS5odG0jQ0FDQ0dFSEMiPkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZzwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjA4OTIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmFsIGluZm9ybWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNDQUNHSCIgbmFtZT0iQ0FDQ0FDR0giPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYWwgaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgR2VuZXJhbCBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjElIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjIyJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIwIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjAiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj5QYWNrYWdlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjAgcjFjMi10MjAiPlRoZSBKYXZhIHBhY2thZ2UgdGhhdCBjb250YWlucyB0aGUgcGVyc2lzdGVudCBlbnRpdGllcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gYW5kIHNlbGVjdCB0aGUgcGFja2FnZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIwIHIxYzMtdDIwIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj5TY2hlbWE8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMCByMWMyLXQyMCI+VGhlIGRhdGFiYXNlIHNjaGVtYSB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O3NjaGVtYSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjAgcjFjMy10MjAiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPkNhdGFsb2c8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMCByMWMyLXQyMCI+VGhlIGRhdGFiYXNlIGNhdGFsb2cgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtjYXRhbG9nJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+QWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjAgcjFjMi10MjAiPlNwZWNpZnkgdGhlIGRlZmF1bHQgYWNjZXNzIG1ldGhvZCBmb3IgdGhlIHZhcmlhYmxlcyBpbiB0aGUgcHJvamVjdDoKLTx1bD4KLTxsaT4KLTxwPlByb3BlcnR5PC9wPgotPC9saT4KLTxsaT4KLTxwPkZpZWxkPC9wPgotPC9saT4KLTwvdWw+Ci08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT4mbHQ7YWNjZXNzJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyNGQzZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUGVyc2lzdGVuY2UgVW5pdCBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0VBR0JHIiBuYW1lPSJDQUNFQUdCRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UGVyc2lzdGVuY2UgVW5pdCBpbmZvcm1hdGlvbjwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBQZXJzaXN0ZW5jZSBVbml0IGluZm9ybWF0aW9uIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgZWFjaCBlbnRpdHkgdHlwZS4gVGhlc2UgZmllbGRzIGFyZSBjb250YWluZWQgaW4gdGhlIDxjb2RlPiZsdDtwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjIlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjEiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIxIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPlhNTCBNYXBwaW5nIERhdGEgQ29tcGxldGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMSByMWMyLXQyMSI+U3BlY2lmaWVzIHRoYXQgdGhlIEphdmEgY2xhc3NlcyBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQgYXJlIGZ1bGx5IHNwZWNpZmllZCBieSB0aGVpciBtZXRhZGF0YS4gQW55IGFubm90YXRpb25zIHdpbGwgYmUgaWdub3JlZC4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDt4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjEgcjFjMy10MjEiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPkNhc2NhZGUgUGVyc2lzdDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIxIHIxYzItdDIxIj5BZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucyBpbiBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtjYXNjYWRlLXBlcnNpc3QmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIxIHIxYzMtdDIxIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5TY2hlbWE8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMSByMWMyLXQyMSI+VGhlIGRhdGFiYXNlIHNjaGVtYSB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O3NjaGVtYSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjEgcjFjMy10MjEiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPkNhdGFsb2c8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMSByMWMyLXQyMSI+VGhlIGRhdGFiYXNlIGNhdGFsb2cgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtjYXRhbG9nJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMSByMWMzLXQyMSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+QWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjEgcjFjMi10MjEiPlNwZWNpZnkgaG93IHRoZSBlbnRpdHkgaXRzIGFjY2VzcyBpbnN0YW5jZSB2YXJpYWJsZXMuCi08dWw+Ci08bGk+Ci08cD5Qcm9wZXJ0eSAmbmRhc2g7IFBlcnNpc3RlbnQgc3RhdGUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcy4gVGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMgbXVzdCBiZSA8c3BhbiBjbGFzcz0iYm9sZCI+cHVibGljPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+cHJpdmF0ZTwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkZpZWxkICZuZGFzaDsgSW5zdGFuY2UgdmFyaWFibGVzIGFyZSBhY2Nlc3NlZCBkaXJlY3RseS4gQWxsIG5vbi10cmFuc2llbnQgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSBwZXJzaXN0ZW50LjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjEgcjFjMy10MjEiPlByb3BlcnR5PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwYzg4YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYXRvcnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdG9ycyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZHQUlKIiBuYW1lPSJDSUFGR0FJSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdG9yczwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBHZW5lcmF0b3IgaW5mb3JtYXRpb24gZmllbGRzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjIiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMiI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIyIiBoZWFkZXJzPSJyMWMxLXQyMiI+R2VuZXJhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjIgcjFjMi10MjIiPkRpc3BsYXlzIHRoZSBleGlzdGluZyBTZXF1ZW5jZSBhbmQgVGFibGUgZ2VuZXJhdG9ycy4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgU2VxdWVuY2U8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgVGFibGU8L3NwYW4+IHRvIGFkZCBhIG5ldyBnZW5lcmF0b3IuPC9wPgotPHA+Rm9yIHNlcXVlbmNlIGdlbmVyYXRvcnMsIHlvdSBtdXN0IGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgZmllbGRzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPk5hbWU8L3A+Ci08L2xpPgotPGxpPgotPHA+U2VxdWVuY2U8L3A+Ci08L2xpPgotPGxpPgotPHA+U2NoZW1hPC9wPgotPC9saT4KLTxsaT4KLTxwPkNhdGFsb2c8L3A+Ci08L2xpPgotPGxpPgotPHA+QWxsb2NhdGlvbiBzaXplPC9wPgotPC9saT4KLTxsaT4KLTxwPkluaXRpYWwgdmFsdWU8L3A+Ci08L2xpPgotPC91bD4KLTxwPkZvciB0YWJsZSBnZW5lcmF0b3JzLCB5b3UgbXVzdCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIGZpZWxkczo8L3A+Ci08dWw+Ci08bGk+Ci08cD5OYW1lPC9wPgotPC9saT4KLTxsaT4KLTxwPlRhYmxlPC9wPgotPC9saT4KLTxsaT4KLTxwPlNjaGVtYTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DYXRhbG9nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5IGNvbHVtbjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5WYWx1ZSBjb2x1bW48L3A+Ci08L2xpPgotPGxpPgotPHA+UHJpbWFyeSBrZXkgY29sdW1uIHZhbHVlPC9wPgotPC9saT4KLTxsaT4KLTxwPkFsbG9jYXRpb24gc2l6ZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyN2EyYjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlF1ZXJpZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUXVlcmllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUlCQUFKIiBuYW1lPSJDSUFJQkFBSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UXVlcmllczwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBRdWVyeSBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjIxJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIzIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj5RdWVyaWVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjMgcjFjMi10MjMiPkRpc3BsYXlzIHRoZSBleGlzdGluZyBOYW1lZCBhbmQgTmF0aXZlIHF1ZXJpZXMuCi08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBhZGQgYSBuYW1lZCBxdWVyeSwgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBOYXRpdmU8L3NwYW4+IGZvciBhIG5hdGl2ZSBxdWVyeS48L3A+Ci08cD5Gb3IgbmFtZWQgcXVlcmllcywgZW50ZXIgdGhlIHF1ZXJ5IGluIHRoZSBRdWVyeSBmaWVsZC48L3A+Ci08cD5Gb3IgbmF0aXZlIHF1ZXJpZXMsIHNlbGVjdCBhIHJlc3VsdCBjbGFzcywgdGhlbiBlbnRlciB0aGUgcXVlcnkgaW4gdGhlIFF1ZXJ5IGZpZWxkLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPlF1ZXJ5IEhpbnRzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjMgcjFjMi10MjMiPkRpc3BsYXlzIHRoZSBleGlzdGluZyBxdWVyeSBoaW50cyAoTmFtZSBhbmQgVmFsdWUpLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gdG8gYWRkIGEgbmV3IHF1ZXJ5IGhpbnQuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJJR0JHRyI+Q3JlYXRpbmcgTmFtZWQgUXVlcmllczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlhMjFhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q29udmVydGVyczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDb252ZXJ0ZXJzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBREdDSUQiIG5hbWU9IkNJQURHQ0lEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Db252ZXJ0ZXJzPC9oMT4KLTxwPlRoZSBDb252ZXJ0ZXJzIGluZm9ybWF0aW9uIGluIHRoZSBKUEEgRGV0YWlscyB2aWV3IGFwcGxpZXMgb25seSB3aGVuIHVzaW5nIEVjbGlwc2VMaW5rPC9wPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGNvbnZlcnRlciwgdXNpbmcgdGhlIDxhIGhyZWY9InJlZl9hZGRfY29udmVydGVyLmh0bSNDSUFHQ0dJSiI+QWRkIENvbnZlcnRlciBkaWFsb2c8L2E+LjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE4Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzNWI3My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNvbm5lY3Rpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ29ubmVjdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZGSklFIiBuYW1lPSJDSUFGRkpJRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q29ubmVjdGlvbjwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgQ29ubmVjdGlvbiBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNjAiIG5hbWU9InN0aHJlZjI2MCI+PC9hPjxhIGlkPSJzdGhyZWYyNjEiIG5hbWU9InN0aHJlZjI2MSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgQ29ubmVjdGlvbiBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBDb25uZWN0aW9uIFBhZ2UiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZS54bWwgZWRpdG9yJnJzcXVvO3MgY29ubmVjdGlvbiBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjUiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+VHJhbnNhY3Rpb24gVHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzItdDI1Ij4KLTxwPlNwZWNpZnkgaWYgdGhlIGNvbm5lY3Rpb24gZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdCB1c2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRyYW5zYWN0aW9uIHR5cGVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0PC9zcGFuPiAtLSBTZWxlY3QgdG8gdXNlIHRoZSBjb250YWluZXIgdXNlZCBieSB0aGUgY29udGFpbmVyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+SlRBPC9zcGFuPiAoSmF2YSBUcmFuc2FjdGlvbiBBUEkpIC0tIFRyYW5zYWN0aW9ucyBvZiB0aGUgSmF2YSBFRSBzZXJ2ZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5SZXNvdXJjZSBMb2NhbDwvc3Bhbj4gLS0gTmF0aXZlIGFjdGlvbnMgb2YgYSBKREJDIGRyaXZlciB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IGEgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij4KLTxwPkJhdGNoIFdyaXRpbmc8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNSByMWMyLXQyNSI+Ci08cD5TcGVjaWZ5IHRoZSB1c2Ugb2YgYmF0Y2ggd3JpdGluZyB0byBvcHRpbWl6ZSB0cmFuc2FjdGlvbnMgd2l0aCBtdWx0aXBsZSB3cml0ZSBvcGVyYXRpb25zLjwvcD4KLTxwPlNldCB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpbnRvIHRoZSBzZXNzaW9uIGF0IGRlcGxveW1lbnQgdGltZS48L3A+Ci08cD5Ob3RlOiBUaGlzIHByb3BlcnR5IGFwcGxpZXMgd2hlbiB1c2VkIGJvdGggaW4gYSBKYXZhIFNFIGFuZCBKYXZhIEVFIGVudmlyb25tZW50LjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCB2YWx1ZXMgZm9yIG9yYWNsZS50b3BsaW5rLmNvbmZpZy5CYXRjaFdyaXRpbmc6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkpEQkM8L3NwYW4+Jm5kYXNoO1VzZSBKREJDIGJhdGNoIHdyaXRpbmcuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5CdWZmZXJlZDwvc3Bhbj4mbmRhc2g7RG8gbm90IHVzZSBlaXRoZXIgSkRCQyBiYXRjaCB3cml0aW5nIG5vciBuYXRpdmUgcGxhdGZvcm0gYmF0Y2ggd3JpdGluZy48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk9yYWNsZUpEQkM8L3NwYW4+Jm5kYXNoO1VzZSBib3RoIEpEQkMgYmF0Y2ggd3JpdGluZyBhbmQgT3JhY2xlIG5hdGl2ZSBwbGF0Zm9ybSBiYXRjaCB3cml0aW5nLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Tm9uZTwvc3Bhbj4mbmRhc2g7RG8gbm90IHVzZSBiYXRjaCB3cml0aW5nICh0dXJuIGl0IG9mZikuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNSByMWMzLXQyNSI+Ci08cD5Ob25lPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5TdGF0ZW1lbnQgY2FjaGluZzwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI1IHIxYzItdDI1Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5OYXRpdmUgU1FMPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjUgcjFjMi10MjUiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI1IHIxYzMtdDI1Ij4KLTxwPkZhbHNlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5KVEEgRGF0YSBTb3VyY2UgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI1IHIxYzItdDI1Ij4KLTxwPklmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0iYm9sZCI+SlRBPC9zcGFuPiBhcyB0aGUgdHJhbnNhY3Rpb24gdHlwZSwgdGhlbiBlbnRlciB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBKVEEgZGF0YSBzb3VyY2UgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij4KLTxwPk5vbi1KVEEgRGF0YSBTb3VyY2UgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI1IHIxYzItdDI1Ij4KLTxwPklmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0iYm9sZCI+UmVzb3VyY2UgTG9jYWw8L3NwYW4+IGFzIHRoZSB0cmFuc2FjdGlvbiB0eXBlLCB0aGVuIGVudGVyIHRoZSBuYW1lIG9mIHRoZSBub24tSlRBIGRhdGEgc291cmNlLjwvcD4KLTxwPlRoaXMgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjUgcjFjMy10MjUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+Jm5ic3A7Jm5ic3A7QmluZCZuYnNwO1BhcmFtZXRlcnM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyNSByMWMyLXQyNSI+Ci08cD5Db250cm9sIHdoZXRoZXIgb3Igbm90IHRoZSBxdWVyeSB1c2VzIHBhcmFtZXRlciBiaW5kaW5nLjwvcD4KLTxwPk5vdGU6IFRoaXMgcHJvcGVydHkgYXBwbGllcyB3aGVuIHVzZWQgaW4gYSBKYXZhIFNFIGVudmlyb25tZW50LjwvcD4KLTxwPlRoaXMgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MjUgcjFjMy10MjUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+RWNsaXBzZUxpbmsgQ29ubmVjdGlvbiBQb29sPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MjUgcjFjMi10MjUiPgotPHA+RGVmaW5lIHRoZSBjb25uZWN0aW9uIHBvb2wgZHJpdmVyLCBVUkwsIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQuPC9wPgotPHA+VGhlc2UgcHJvcGVydGllcyBhcmUgbm90ZSBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSBHZW5lcmljIHBsYXRmb3JtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEwYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD4mbmJzcDsmbmJzcDtSZWFkJm5ic3A7Q29ubmVjdGlvbjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQyNSByMWMyLXQyNSI+Ci08cD5UaGUgbWF4aW11bSBhbmQgbWluaW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgYWxsb3dlZCBpbiB0aGUgSkRCQyByZWFkIGNvbm5lY3Rpb24gcG9vbC48L3A+Ci08cD5Ob3RlOiBUaGVzZSBwcm9wZXJ0eSBhcHBseSB3aGVuIHVzZWQgaW4gYSBKYXZhIFNFIGVudmlyb25tZW50LjwvcD4KLTxwPlRoZXNlIHByb3BlcnRpZXMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSBHZW5lcmljIHBsYXRmb3JtPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjExYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD4mbmJzcDsmbmJzcDtXcml0ZSZuYnNwO0Nvbm5lY3Rpb248L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MjUgcjFjMi10MjUiPgotPHA+VGhlIG1heGltdW0gYW5kIG1pbmltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGFsbG93ZWQgaW4gdGhlIEpEQkMgcmVhZCBjb25uZWN0aW9uIHBvb2wuPC9wPgotPHA+Tm90ZTogVGhlc2UgcHJvcGVydHkgYXBwbHkgd2hlbiB1c2VkIGluIGEgSmF2YSBTRSBlbnZpcm9ubWVudC48L3A+Ci08cD5UaGVzZSBwcm9wZXJ0aWVzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2VuZXJpYyBwbGF0Zm9ybTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTEzZGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3VzdG9taXphdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDdXN0b21pemF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBSkFGRUciIG5hbWU9IkNJQUpBRkVHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DdXN0b21pemF0aW9uPC9oMT4KLTxwPlRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSBDdXN0b21pemF0aW9uIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjI2MiIgbmFtZT0ic3RocmVmMjYyIj48L2E+PGEgaWQ9InN0aHJlZjI2MyIgbmFtZT0ic3RocmVmMjYzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBDdXN0b21pemF0aW9uIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIEN1c3RvbWl6YXRpb24gUGFnZSIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvciZyc3F1bztzIEN1c3RvbWl6YXRpb24gcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjIzJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI2Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjYiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyNiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPldlYXZpbmc8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNiByMWMyLXQyNiI+Ci08cD5TcGVjaWZpZXMgaWYgd2VhdmluZyBvZiB0aGUgZW50aXR5IGNsYXNzZXMgaXMgcGVyZm9ybWVkLiBUaGUgRWNsaXBzZUxpbmsgSlBBIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHVzZXMgd2VhdmluZyB0byBlbmhhbmNlIEpQQSBlbnRpdGllcyBmb3Igc3VjaCBwcm9wZXJ0aWVzIGFzIGxhenkgbG9hZGluZywgY2hhbmdlIHRyYWNraW5nLCBmZXRjaCBncm91cHMsIGFuZCBpbnRlcm5hbCBvcHRpbWl6YXRpb25zLiBTZWxlY3QgZnJvbSB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vIFdlYXZpbmc8L3NwYW4+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XZWF2ZSBEeW5hbWljYWxseTwvc3Bhbj48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPldlYXZlIFN0YXRpY2FsbHk8L3NwYW4+IC0tIFVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgcGxhbiB0byBleGVjdXRlIHlvdXIgYXBwbGljYXRpb24gb3V0c2lkZSBvZiBhIEphdmEgRUUgNSBjb250YWluZXIgaW4gYW4gZW52aXJvbm1lbnQgdGhhdCBkb2VzIG5vdCBwZXJtaXQgdGhlIHVzZSBvZiA8Y29kZT4tamF2YWFnZW50OmVjbGlwc2VsaW5rLmphcjwvY29kZT4gb24gdGhlIEpWTSBjb21tYW5kIGxpbmUuIFRoaXMgYXNzdW1lcyB0aGF0IGNsYXNzZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3RhdGljYWxseSB3b3Zlbi4gUnVuIHRoZSBzdGF0aWMgd2VhdmVyIG9uIHRoZSBjbGFzc2VzIGJlZm9yZSBkZXBsb3lpbmcgdGhlbS48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI2IHIxYzMtdDI2Ij4KLTxwPldlYXZlIER5bmFtaWNhbGx5PC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD4mbmJzcDsmbmJzcDtXZWF2aW5nJm5ic3A7TGF6eTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgbGF6eSB3ZWF2aW5nLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI2IHIxYzMtdDI2Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPiZuYnNwOyZuYnNwO1dlYXZpbmcmbmJzcDtGZXRjaCZuYnNwO0dyb3VwczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgZmV0Y2ggZ3JvdXBzIHRocm91Z2ggd2VhdmluZy4gU2V0IHRoaXMgb3B0aW9uIHRvIGZhbHNlIGlmOjwvcD4KLTx1bD4KLTxsaT4KLTxwPlRoZXJlIGlzIG5vIHdlYXZpbmcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkNsYXNzZXMgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGR1cmluZyB3ZWF2aW5nIChmb3IgZXhhbXBsZSwgd2hlbiBkZWJ1Z2dpbmcpLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+U2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgZm9yIHBsYXRmb3JtcyB3aGVyZSBpdCBpcyBub3Qgc3VwcG9ydGVkLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI2IHIxYzMtdDI2Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPldlYXZpbmcmbmJzcDtpbnRlcm5hbDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI2IHIxYzItdDI2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNiByMWMzLXQyNiI+Ci08cD5UcnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5XZWF2aW5nJm5ic3A7ZWFnZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNiByMWMyLXQyNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjYgcjFjMy10MjYiPgotPHA+RmFsc2U8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPiZuYnNwOyZuYnNwO1dlYXZpbmcmbmJzcDtDaGFuZ2UmbmJzcDtUcmFja2luZzwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCB0aGlzIG9wdGlvbiB0byB1c2Ugd2VhdmluZyB0byBkZXRlY3Qgd2hpY2ggZmllbGRzIG9yIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCBjaGFuZ2UuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjYgcjFjMy10MjYiPgotPHA+VHJ1ZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPgotPHA+Jm5ic3A7Jm5ic3A7VGhyb3cmbmJzcDtFeGNlcHRpb25zPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MjYgcjFjMi10MjYiPgotPHA+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIHNldCBFY2xpcHNlTGluayB0byB0aHJvdyBhbiBleGNlcHRpb24gb3IgbG9nIGEgd2FybmluZyB3aGVuIGl0IGVuY291bnRlcnMgYSBwcm9ibGVtIHdpdGggYW55IG9mIHRoZSBmaWxlcyBsaXN0ZWQgaW4gYSA8c3BhbiBjbGFzcz0iYm9sZCI+cGVyc2lzdGVuY2UueG1sPC9zcGFuPiBmaWxlIDxjb2RlPiZsdDttYXBwaW5nLWZpbGUmZ3Q7PC9jb2RlPiBlbGVtZW50LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDI2IHIxYzMtdDI2Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPkV4Y2VwdGlvbiBoYW5kbGVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MjYgcjFjMi10MjYiPgotPHA+U2VsZWN0IChvciBjcmVhdGUpIGEgSmF2YSBjbGFzcyB0byBoYW5kbGUgZXhjZXB0aW9ucy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQyNiByMWMzLXQyNiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPgotPHA+U2Vzc2lvbiBDdXN0b21pemVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCBhIHNlc3Npb24gY3VzdG9taXplciBjbGFzczogYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+ZWNsaXBzZWxpbmsudG9vbHMuc2Vzc2lvbmNvbmZpZ3VyYXRpb24uU2Vzc2lvbkN1c3RvbWl6ZXI8L2NvZGU+IGludGVyZmFjZSBhbmQgcHJvdmlkZXMgYSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4gVXNlIHRoaXMgY2xhc3MnIDxjb2RlPmN1c3RvbWl6ZTwvY29kZT4gbWV0aG9kLCB3aGljaCB0YWtlcyBhbiA8Y29kZT5lY2xpcHNlbGluay5zZXNzaW9ucy5TZXNzaW9uPC9jb2RlPiwgdG8gcHJvZ3JhbW1hdGljYWxseSBhY2Nlc3MgYWR2YW5jZWQgRWNsaXBzZUxpbmsgc2Vzc2lvbiBBUEkuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDI2IHIxYzMtdDI2Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjExYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5EZXNjcmlwdG9yIEN1c3RvbWl6ZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MjYgcjFjMi10MjYiPgotPHA+U2VsZWN0IGFuIEVjbGlwc2VMaW5rIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyZuZGFzaDthIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT5lY2xpcHNlbGluay50b29scy5zZXNzaW9uY29uZmlndXJhdGlvbi5EZXNjcmlwdG9yQ3VzdG9taXplcjwvY29kZT4gaW50ZXJmYWNlIGFuZCBwcm92aWRlcyBhIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLiBVc2UgdGhpcyBjbGFzcydzIDxjb2RlPmN1c3RvbWl6ZTwvY29kZT4gbWV0aG9kLCB3aGljaCB0YWtlcyBhbiA8Y29kZT5lY2xpcHNlbGluay5kZXNjcmlwdG9ycy5DbGFzc0Rlc2NyaXB0b3I8L2NvZGU+LCB0byBwcm9ncmFtbWF0aWNhbGx5IGFjY2VzcyBhZHZhbmNlZCBFY2xpcHNlTGluayBkZXNjcmlwdG9yIGFuZCBtYXBwaW5nIEFQSSBmb3IgdGhlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBKUEEgZW50aXR5IG5hbWVkIDxjb2RlPiZsdDtFTlRJVFkmZ3Q7PC9jb2RlPi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MjYgcjFjMy10MjYiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTJjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPlZhbGlkYXRpb24gb25seTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQyNiByMWMyLXQyNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDI2IHIxYzMtdDI2Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEzYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5Qcm9maWxlcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQyNiByMWMyLXQyNiI+Ci08dWw+Ci08bGk+Ci08cD5ObyBQcm9maWxlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QZXJmb3JtYW5jZSBQcm9maWxlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5RdWVyeSBNb25pdG9yPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MjYgcjFjMy10MjYiPgotPHA+Tm9Qcm9maWxlcjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5ZTZkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIwLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNhY2hpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ2FjaGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUJFRENIIiBuYW1lPSJDSUFCRURDSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjI2NCIgbmFtZT0ic3RocmVmMjY0Ij48L2E+Q2FjaGluZzwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBDYWNoaW5nIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjI2NSIgbmFtZT0ic3RocmVmMjY1Ij48L2E+PGEgaWQ9InN0aHJlZjI2NiIgbmFtZT0ic3RocmVmMjY2Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBDYWNoaW5nIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIENhY2hpbmcgUGFnZSIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UueG1sJnJzcXVvO3MgQ2FjaGluZyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjgiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyOCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI4Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+RGVmYXVsdCBDYWNoZSBUeXBlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjggcjFjMi10MjgiPgotPHA+U2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGFzIHRoZSBEZWZhdWx0IENhY2hlIFR5cGU6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlNvZnQgd2l0aCBXZWFrIFN1YmNhY2hlPC9zcGFuPiZuZGFzaDtUaGlzIG9wdGlvbiBpcyBzaW1pbGFyIHRvIDxzcGFuIGNsYXNzPSJib2xkIj5XZWFrIHdpdGggSGFyZCBTdWJjYWNoZTwvc3Bhbj4gZXhjZXB0IHRoYXQgaXQgbWFpbnRhaW5zIGEgbW9zdCBmcmVxdWVudGx5IHVzZWQgc3ViY2FjaGUgdGhhdCB1c2VzIHNvZnQgcmVmZXJlbmNlcy4gVGhlIHNpemUgb2YgdGhlIHN1YmNhY2hlIGlzIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgaWRlbnRpdHkgbWFwLiBUaGUgc3ViY2FjaGUgdXNlcyBzb2Z0IHJlZmVyZW5jZXMgdG8gZW5zdXJlIHRoYXQgdGhlc2Ugb2JqZWN0cyBhcmUgZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuPC9wPgotPHA+VXNlIHRoaXMgaWRlbnRpdHkgbWFwIGluIG1vc3QgY2lyY3Vtc3RhbmNlcyBhcyBhIG1lYW5zIHRvIGNvbnRyb2wgbWVtb3J5IHVzZWQgYnkgdGhlIGNhY2hlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+V2VlayB3aXRoIEhhcmQgU3ViY2FjaGU8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIGlzIHNpbWlsYXIgdG8gPHNwYW4gY2xhc3M9ImJvbGQiPlNvZnQgd2l0aCBXZWFrPC9zcGFuPiBzdWJjYWNoZSBleGNlcHQgdGhhdCBpdCBtYWludGFpbnMgYSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBzdWJjYWNoZSB0aGF0IHVzZXMgaGFyZCByZWZlcmVuY2VzLiBVc2UgdGhpcyBpZGVudGl0eSBtYXAgaWYgc29mdCByZWZlcmVuY2VzIGFyZSBub3Qgc3VpdGFibGUgZm9yIHlvdXIgcGxhdGZvcm0uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XZWFrPC9zcGFuPiZuZGFzaDtUaGlzIG9wdGlvbiBpcyBzaW1pbGFyIHRvIDxzcGFuIGNsYXNzPSJib2xkIj5GdWxsPC9zcGFuPiwgZXhjZXB0IHRoYXQgb2JqZWN0cyBhcmUgcmVmZXJlbmNlZCB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgb3B0aW9uIHVzZXMgbGVzcyBtZW1vcnkgdGhhbiA8c3BhbiBjbGFzcz0iYm9sZCI+RnVsbDwvc3Bhbj4sIGFsbG93cyBjb21wbGV0ZSBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS48L3A+Ci08cD5Vc2UgdGhpcyBpZGVudGl0eSBtYXAgZm9yIHRyYW5zYWN0aW9ucyB0aGF0LCBvbmNlIHN0YXJ0ZWQsIHN0YXkgb24gdGhlIHNlcnZlciBzaWRlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U29mdDwvc3Bhbj4mbmRhc2g7VGhpcyBvcHRpb24gaXMgc2ltaWxhciB0byA8c3BhbiBjbGFzcz0iYm9sZCI+V2Vhazwvc3Bhbj4gZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUgb2JqZWN0cyB1c2luZyBzb2Z0IHJlZmVyZW5jZXMuIFRoaXMgaWRlbnRpdHkgbWFwIGVuYWJsZXMgZnVsbCBnYXJiYWdlIGNvbGxlY3Rpb24gd2hlbiBtZW1vcnkgaXMgbG93LiBJdCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GdWxsPC9zcGFuPiZuZGFzaDtUaGlzIG9wdGlvbiBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHk6IGFsbCBvYmplY3RzIGFyZSBjYWNoZWQgYW5kIG5vdCByZW1vdmVkLjwvcD4KLTxwPk5vdGU6IFRoaXMgcHJvY2VzcyBtYXkgYmUgbWVtb3J5LWludGVuc2l2ZSB3aGVuIG1hbnkgb2JqZWN0cyBhcmUgcmVhZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vbmU8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIGRvZXMgbm90IHByZXNlcnZlIG9iamVjdCBpZGVudGl0eSBhbmQgZG9lcyBub3QgY2FjaGUgb2JqZWN0cy5UaGlzIG9wdGlvbiBpcyBub3QgcmVjb21tZW5kZWQuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyOCByMWMzLXQyOCI+Ci08cD5XZWFrIHdpdGggc29mdCBzdWJjYWNoZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+RGVmYXVsdCBDYWNoZSBTaXplPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjggcjFjMi10MjgiPgotPHA+U2V0IHRoZSBzaXplIChtYXhpbXVtIG51bWJlciBvZiBvYmplY3RzKSBvZiB0aGUgY2FjaGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjggcjFjMy10MjgiPgotPHA+MTAwPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI4IiBoZWFkZXJzPSJyMWMxLXQyOCI+Ci08cD5EZWZhdWx0IFNoYXJlZCBDYWNoZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI4IHIxYzItdDI4Ij4KLTxwPlNwZWNpZmllcyBpZiBjYWNoZWQgaW5zdGFuY2VzIHNob3VsZCBiZSBpbiB0aGUgc2hhcmVkIGNhY2hlIG9yIGluIGEgY2xpZW50IGlzb2xhdGVkIGNhY2hlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI4IHIxYzMtdDI4Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij4KLTxwPkVudGl0eSBDYWNoaW5nPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjggcjFjMi10MjgiPgotPHA+U3BlY2lmeSB0aGUgZW50aXR5LXNwZWNpZmljIGNhY2hpbmcgaW5mb3JtYXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjggcjFjMy10MjgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+Jm5ic3A7Jm5ic3A7Q2FjaGUmbmJzcDtUeXBlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjggcjFjMi10MjgiPgotPHA+U2VlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPkRlZmF1bHQgQ2FjaGUgVHlwZS48L3NwYW4+PC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjggcjFjMy10MjgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+Jm5ic3A7Jm5ic3A7Q2FjaGUmbmJzcDtTaXplPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjggcjFjMi10MjgiPgotPHA+U2VlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPkRlZmF1bHQgQ2FjaGUgU2l6ZS48L3NwYW4+PC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjggcjFjMy10MjgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+Jm5ic3A7Jm5ic3A7U2hhcmVkJm5ic3A7Q2FjaGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyOCByMWMyLXQyOCI+Ci08cD5TZWUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+RGVmYXVsdCBTaGFyZWQgQ2FjaGU8L3NwYW4+LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDI4IHIxYzMtdDI4Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij4KLTxwPkZsdXNoIGNsZWFyIGNhY2hlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MjggcjFjMi10MjgiPgotPHA+U2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGFzIHRoZSBEZWZhdWx0IENhY2hlIFR5cGU6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkRyb3A8L3NwYW4+ICZuZGFzaDsgVGhpcyBtb2RlIGlzIHRoZSBmYXN0ZXN0IGFuZCB1c2VzIHRoZSBsZWFzdCBtZW1vcnkuIEhvd2V2ZXIsIGFmdGVyIGNvbW1pdCB0aGUgc2hhcmVkIGNhY2hlIG1pZ2h0IHBvdGVudGlhbGx5IGNvbnRhaW4gc3RhbGUgZGF0YS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkRyb3AgSW52YWxpZGF0ZTwvc3Bhbj4gJm5kYXNoOyBDbGFzc2VzIHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgb2JqZWN0IHVwZGF0ZWQgb3IgZGVsZXRlZCBhcmUgaW52YWxpZGF0ZWQgaW4gdGhlIHNoYXJlZCBjYWNoZSBhdCBjb21taXQgdGltZS4gVGhpcyBtb2RlIGlzIHNsb3dlciB0aGFuIDxzcGFuIGNsYXNzPSJib2xkIj5Ecm9wPC9zcGFuPiwgYnV0IGFzIGVmZmljaWVudCBtZW1vcnkgdXNhZ2Utd2lzZSwgYW5kIHByZXZlbnRzIHN0YWxlIGRhdGEuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5NZXJnZTwvc3Bhbj4gJm5kYXNoOyBEcm9wIGNsYXNzZXMgZnJvbSB0aGUgRW50aXR5TWFuYWdlcidzIGNhY2hlIG9mIG9iamVjdHMgdGhhdCBoYXZlIG5vdCBiZWVuIGZsdXNoZWQuIFRoaXMgbW9kZSBsZWF2ZXMgdGhlIHNoYXJlZCBjYWNoZSBpbiBhIHBlcmZlY3Qgc3RhdGUgYWZ0ZXIgY29tbWl0LiBIb3dldmVyLCBpdCBpcyB0aGUgbGVhc3QgbWVtb3J5LWVmZmljaWVudCBtb2RlOyB0aGUgbWVtb3J5IG1pZ2h0IGV2ZW4gcnVuIG91dCBpbiBhIHZlcnkgbGFyZ2UgdHJhbnNhY3Rpb24uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQyOCByMWMzLXQyOCI+Ci08cD5Ecm9wIEludmFsaWRhdGU8L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGlzIHBhZ2UgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5HZW5lcmljPC9zcGFuPiBwbGF0Zm9ybS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MmMzNjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Mb2dnaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkxvZ2dpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFCR0hISSIgbmFtZT0iQ0lBQkdISEkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkxvZ2dpbmc8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgTG9nZ2luZyBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjY3IiBuYW1lPSJzdGhyZWYyNjciPjwvYT48YSBpZD0ic3RocmVmMjY4IiBuYW1lPSJzdGhyZWYyNjgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPlByb3BlcnRpZXMgb2YgdGhlIExvZ2dpbmcgUGFnZTwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iUHJvcGVydGllcyBvZiB0aGUgTG9nZ2luZyBQYWdlIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBMb2dnaW5nIHBhZ2Ugb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3IuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzMSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDMxIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MzEiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD5Mb2dnaW5nIExldmVsPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzEgcjFjMi10MzEiPgotPHA+U3BlY2lmaWVzIHRoZSBhbW91bnQgYW5kIGRldGFpbCBvZiBsb2cgb3V0cHV0IGJ5IHNlbGVjdGluZyB0aGUgbG9nIGxldmVsIChpbiBhc2NlbmRpbmcgb3JkZXIgb2YgaW5mb3JtYXRpb24pOjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCB2YWx1ZXMgZm9yIHRoZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZy5MZXZlbDwvY29kZT46PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk9GRjwvc3Bhbj4mbmRhc2g7ZGlzYWJsZXMgbG9nZ2luZzwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U0VWRVJFPC9zcGFuPiZuZGFzaDtsb2dzIGV4Y2VwdGlvbnMgaW5kaWNhdGluZyBUb3BMaW5rIGNhbm5vdCBjb250aW51ZSwgYXMgd2VsbCBhcyBhbnkgZXhjZXB0aW9ucyBnZW5lcmF0ZWQgZHVyaW5nIGxvZ2luLiBUaGlzIGluY2x1ZGVzIGEgc3RhY2sgdHJhY2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XQVJOSU5HPC9zcGFuPiZuZGFzaDtsb2dzIGV4Y2VwdGlvbnMgdGhhdCBkbyBub3QgZm9yY2UgVG9wTGluayB0byBzdG9wLCBpbmNsdWRpbmcgYWxsIGV4Y2VwdGlvbnMgbm90IGxvZ2dlZCB3aXRoIHNldmVyZSBsZXZlbC4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGEgc3RhY2sgdHJhY2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5JTkZPPC9zcGFuPiZuZGFzaDtsb2dzIHRoZSBsb2dpbi9sb2dvdXQgcGVyIHNldmVyIHNlc3Npb24sIGluY2x1ZGluZyB0aGUgdXNlciBuYW1lLiBBZnRlciBhY3F1aXJpbmcgdGhlIHNlc3Npb24sIGRldGFpbGVkIGluZm9ybWF0aW9uIGlzIGxvZ2dlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkNPTkZJRzwvc3Bhbj4mbmRhc2g7bG9ncyBvbmx5IGxvZ2luLCBKREJDIGNvbm5lY3Rpb24sIGFuZCBkYXRhYmFzZSBpbmZvcm1hdGlvbi48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZJTkU8L3NwYW4+Jm5kYXNoO2xvZ3MgU1FMLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RklORVI8L3NwYW4+Jm5kYXNoO3NpbWlsYXIgdG8gd2FybmluZy4gSW5jbHVkZXMgc3RhY2sgdHJhY2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GSU5FU1Q8L3NwYW4+Jm5kYXNoO2luY2x1ZGVzIGFkZGl0aW9uYWwgbG93IGxldmVsIGluZm9ybWF0aW9uLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsubG9nZ2luZy5sZXZlbCIgdmFsdWU9IklORk8iLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDMxIHIxYzMtdDMxIj4KLTxwPkluZm88L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj4KLTxwPiZuYnNwOyZuYnNwO1RpbWVzdGFtcDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDMxIHIxYzItdDMxIj4KLTxwPkNvbnRyb2wgd2hldGhlciB0aGUgdGltZXN0YW1wIGlzIGxvZ2dlZCBpbiBlYWNoIGxvZyBlbnRyeS48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj50cnVlPC9zcGFuPiZuZGFzaDtsb2cgYSB0aW1lc3RhbXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5mYWxzZTwvc3Bhbj4mbmRhc2g7ZG8gbm90IGxvZyBhIHRpbWVzdGFtcC48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcudGltZXN0YW1wIiB2YWx1ZT0iZmFsc2UiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDMxIHIxYzMtdDMxIj4KLTxwPnRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj4KLTxwPiZuYnNwOyZuYnNwO1RocmVhZDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDMxIHIxYzItdDMxIj4KLTxwPkNvbnRyb2wgd2hldGhlciBhIHRocmVhZCBpZGVudGlmaWVyIGlzIGxvZ2dlZCBpbiBlYWNoIGxvZyBlbnRyeS48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj50cnVlPC9zcGFuPiZuZGFzaDtsb2cgYSB0aHJlYWQgaWRlbnRpZmllci48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPmZhbHNlPC9zcGFuPiZuZGFzaDtkbyBub3QgbG9nIGEgdGhyZWFkIGlkZW50aWZpZXIuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzMSByMWMzLXQzMSI+Ci08cD50cnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD4mbmJzcDsmbmJzcDtTZXNzaW9uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzEgcjFjMi10MzEiPgotPHA+Q29udHJvbCB3aGV0aGVyIGFuIEVjbGlwc2VMaW5rIHNlc3Npb24gaWRlbnRpZmllciBpcyBsb2dnZWQgaW4gZWFjaCBsb2cgZW50cnkuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+dHJ1ZTwvc3Bhbj4mbmRhc2g7bG9nIGEgRWNsaXBzZUxpbmsgc2Vzc2lvbiBpZGVudGlmaWVyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+ZmFsc2U8L3NwYW4+Jm5kYXNoO2RvIG5vdCBsb2cgYSBFY2xpcHNlTGluayBzZXNzaW9uIGlkZW50aWZpZXIuPC9wPgotPC9saT4KLTwvdWw+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLnNlc3Npb24iIHZhbHVlPSJmYWxzZSIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzEgcjFjMy10MzEiPgotPHA+dHJ1ZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQzMSIgaGVhZGVycz0icjFjMS10MzEiPgotPHA+Jm5ic3A7Jm5ic3A7RXhjZXB0aW9uczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDMxIHIxYzItdDMxIj4KLTxwPkNvbnRyb2wgd2hldGhlciB0aGUgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSB3aXRoaW4gdGhlIEVjbGlwc2VMaW5rIGNvZGUgYXJlIGxvZ2dlZCBwcmlvciB0byByZXR1cm5pbmcgdGhlIGV4Y2VwdGlvbiB0byB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gRW5zdXJlcyB0aGF0IGFsbCBleGNlcHRpb25zIGFyZSBsb2dnZWQgYW5kIG5vdCBtYXNrZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNvZGUuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+dHJ1ZTwvc3Bhbj4mbmRhc2g7bG9nIGFsbCBleGNlcHRpb25zLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+ZmFsc2U8L3NwYW4+Jm5kYXNoO2RvIG5vdCBsb2cgZXhjZXB0aW9ucy48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcuZXhjZXB0aW9ucyIgdmFsdWU9InRydWUiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDMxIHIxYzMtdDMxIj4KLTxwPmZhbHNlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD5Mb2cgZmlsZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDMxIHIxYzItdDMxIj4KLTxwPlNwZWNpZnkgYSBmaWxlIGxvY2F0aW9uIGZvciB0aGUgbG9nIG91dHB1dCAoaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgb3V0KS48L3A+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLmZpbGUiIHZhbHVlPSJDOlxteW91dFwiIC8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzMSByMWMzLXQzMSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD5Mb2dnZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzMSByMWMyLXQzMSI+Ci08cD5TZWxlY3QgdGhlIHR5cGUgb2YgbG9nZ2VyIHRvIHVzZTo8L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0TG9nZ2VyPC9zcGFuPiZuZGFzaDt0aGUgRWNsaXBzZUxpbmsgbmF0aXZlIGxvZ2dlciA8Y29kZT5lY2xpcHNlbGluay5sb2dnaW5nLkRlZmF1bHRTZXNzaW9uTG9nPC9jb2RlPi48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkphdmFMb2dnZXI8L3NwYW4+Jm5kYXNoO3RoZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZzwvY29kZT4gbG9nZ2VyIDxjb2RlPmVjbGlwc2VsaW5rLmxvZ2dpbmcuSmF2YUxvZzwvY29kZT4uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5TZXJ2ZXJMb2dnZXI8L3NwYW4+Jm5kYXNoO3RoZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZzwvY29kZT4gbG9nZ2VyIDxjb2RlPmVjbGlwc2VsaW5rLnBsYXRmb3JtLnNlcnZlci5TZXJ2ZXJMb2c8L2NvZGU+LiBJbnRlZ3JhdGVzIHdpdGggdGhlIGFwcGxpY2F0aW9uIHNlcnZlcidzIGxvZ2dpbmcgYXMgZGVmaW5lIGluIHRoZSA8Y29kZT5lY2xpcHNlbGluay5wbGF0Zm9ybS5zZXJ2ZXIuU2VydmVyUGxhdGZvcm0uPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5GdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGN1c3RvbSBsb2dnZXIuIFRoZSBjdXN0b20gbG9nZ2VyIG11c3QgaW1wbGVtZW50IHRoZSA8Y29kZT5lY2xpcHNlbGluay5sb2dnaW5nLlNlc3Npb25Mb2c8L2NvZGU+IGludGVyZmFjZS48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcubG9nZ2VyIiB2YWx1ZT0iYWNtZS5sb2dnZXJzLk15Q3VzdG9tTG9nZ2VyIiAvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MzEgcjFjMy10MzEiPgotPHA+RGVmYXVsdExvZ2dlcjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExYjdjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk9wdGlvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iT3B0aW9ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZKQ0hFIiBuYW1lPSJDSUFGSkNIRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+T3B0aW9uczwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBPcHRpb25zIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhpcyBwYWdlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJpYzwvc3Bhbj4gcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNjkiIG5hbWU9InN0aHJlZjI2OSI+PC9hPjxhIGlkPSJzdGhyZWYyNzAiIG5hbWU9InN0aHJlZjI3MCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgT3B0aW9ucyBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBPcHRpb25zIFBhZ2UiIHN1bW1hcnk9IlByb3BlcnRpZXMgb2YgdGhlIE9wdGlvbnMgUGFnZSIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzMiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzMyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDMzIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzMyIgaGVhZGVycz0icjFjMS10MzMiPgotPHA+U2Vzc2lvbiBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzMgcjFjMi10MzMiPgotPHA+U3BlY2lmeSB0aGUgbmFtZSBieSB3aGljaCB0aGUgRWNsaXBzZUxpbmsgc2Vzc2lvbiBpcyBzdG9yZWQgaW4gdGhlIHN0YXRpYyBzZXNzaW9uIG1hbmFnZXIuIFVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIEVjbGlwc2VMaW5rIHNoYXJlZCBzZXNzaW9uIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgdGhlIEpQQSBvciB0byB1c2UgYSBwcmUtZXhpc3RpbmcgRWNsaXBzZUxpbmsgc2Vzc2lvbiBjb25maWd1cmVkIHRocm91Z2ggYSBFY2xpcHNlTGluayA8Y29kZT5zZXNzaW9ucy54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cD5WYWxpZCB2YWx1ZXM6IGEgdmFsaWQgRWNsaXBzZUxpbmsgc2Vzc2lvbiBuYW1lIHRoYXQgaXMgdW5pcXVlIGluIGEgc2VydmVyIGRlcGxveW1lbnQuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsuc2Vzc2lvbi1uYW1lIiB2YWx1ZT0iTXlTZXNzaW9uIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5TZXNzaW9ucyBYTUw8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzMyByMWMyLXQzMyI+Ci08cD5TcGVjaWZ5IHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGxvYWRlZCBmcm9tIHRoZSBFY2xpcHNlTGluayBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gZmlsZSAoPGNvZGU+c2Vzc2lvbnMueG1sPC9jb2RlPikuPC9wPgotPHA+WW91IGNhbiB1c2UgdGhpcyBvcHRpb24gYXMgYW4gYWx0ZXJuYXRpdmUgdG8gYW5ub3RhdGlvbnMgYW5kIGRlcGxveW1lbnQgWE1MLiBJZiB5b3Ugc3BlY2lmeSB0aGlzIHByb3BlcnR5LCBFY2xpcHNlTGluayB3aWxsIG92ZXJyaWRlIGFsbCBjbGFzcyBhbm5vdGF0aW9uIGFuZCB0aGUgb2JqZWN0IHJlbGF0aW9uYWwgbWFwcGluZyBmcm9tIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+LCBhcyB3ZWxsIGFzIDxjb2RlPk9STS54bWw8L2NvZGU+IGFuZCBvdGhlciBtYXBwaW5nIGZpbGVzLCBpZiBwcmVzZW50LjwvcD4KLTxwPkluZGljYXRlIHRoZSBzZXNzaW9uIGJ5IHNldHRpbmcgdGhlIDxjb2RlPmVjbGlwc2VsaW5rLnNlc3Npb24tbmFtZTwvY29kZT4gcHJvcGVydHkuPC9wPgotPHA+Tm90ZTogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHRoZSB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eSwgPGNvZGU+c2Vzc2lvbnMueG1sPC9jb2RlPiBmaWxlIHdpbGwgbm90IGJlIHVzZWQuPC9wPgotPHA+VmFsaWQgdmFsdWVzOiB0aGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgc2Vzc2lvbnMgWE1MIGZpbGUuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0idG9wbGluay5zZXNzaW9uLXhtbCIgdmFsdWU9Im15c2Vzc2lvbi54bWwiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDMzIHIxYzMtdDMzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzMiIGhlYWRlcnM9InIxYzEtdDMzIj4KLTxwPlRhcmdldCBEYXRhYmFzZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDMzIHIxYzItdDMzIj4KLTxwPlNlbGVjdCB0aGUgdGFyZ2V0IGRhdGFiYXNlLiBZb3UgY2FuIGFsc28gc2V0IHRoZSB2YWx1ZSB0byB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBzdWJjbGFzcyBvZiB0aGUgPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uRGF0YWJhc2VQbGF0Zm9ybSBjbGFzczwvY29kZT4uPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsudGFyZ2V0LWRhdGFiYXNlIiB2YWx1ZT0iT3JhY2xlIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzMyByMWMzLXQzMyI+Ci08cD5BdXRvPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5UYXJnZXQgU2VydmVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzMgcjFjMi10MzMiPgotPHA+U2VsZWN0IHRoZSB0YXJnZXQgc2VydmVyIGZvciB5b3VyIEpQQSBhcHBsaWNhdGlvbi48L3A+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay50YXJnZXQtc2VydmVyIiB2YWx1ZT0iT0M0Sl8xMF8xXzMiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDMzIHIxYzMtdDMzIj4KLTxwPk5vbmU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MzMiIGhlYWRlcnM9InIxYzEtdDMzIj4KLTxwPkV2ZW50IExpc3RlbmVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzMgcjFjMi10MzMiPgotPHA+U3BlY2lmeSBhIGRlc2NyaXB0b3IgZXZlbnQgbGlzdGVuZXIgdG8gYmUgYWRkZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcuPC9wPgotPHA+VmFsaWQgdmFsdWVzOiBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPmVjbGlwc2VsaW5rLnNlc3Npb25zLlNlc3Npb25FdmVudExpc3RlbmVyPC9jb2RlPiBpbnRlcmZhY2UuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsuc2Vzc2lvbi1ldmVudC1saXN0ZW5lciIgdmFsdWU9Im15cGFja2FnZS5NeUNsYXNzLmNsYXNzIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5JbmNsdWRlIERlc2NyaXB0b3IgUXVlcmllczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDMzIHIxYzItdDMzIj4KLTxwPkVuYWJsZSBvciBkaXNhYmxlIHRoZSBkZWZhdWx0IGNvcHlpbmcgb2YgYWxsIG5hbWVkIHF1ZXJpZXMgZnJvbSB0aGUgZGVzY3JpcHRvcnMgdG8gdGhlIHNlc3Npb24uIFRoZXNlIHF1ZXJpZXMgaW5jbHVkZSB0aGUgb25lcyBkZWZpbmVkIHVzaW5nIEVjbGlwc2VMaW5rIEFQSSwgZGVzY3JpcHRvciBhbWVuZG1lbnQgbWV0aG9kcywgYW5kIHNvIG9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDMzIHIxYzMtdDMzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MzMiIGhlYWRlcnM9InIxYzEtdDMzIj4KLTxwPk1pc2NlbGxhbmVvdXMgT3B0aW9uczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDMzIHIxYzItdDMzIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD4mbmJzcDsmbmJzcDtUZW1wb3JhbCBtdXRhYmxlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MzMgcjFjMi10MzMiPgotPHA+U3BlY2lmeSBpZiBhbGwgPGNvZGU+RGF0ZTwvY29kZT4gYW5kIDxjb2RlPkNhbGVuZGFyPC9jb2RlPiBwZXJzaXN0ZW50IGZpZWxkcyBzaG91bGQgYmUgaGFuZGxlZCBhcyBtdXRhYmxlIG9iamVjdHMuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsudGVtcG9yYWwubXV0YWJsZSIgdmFsdWU9InRydWUiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDMzIHIxYzMtdDMzIj4KLTxwPkZhbHNlPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmVjNDA0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U2NoZW1hIEdlbmVyYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU2NoZW1hIEdlbmVyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFDQ0ZDQiIgbmFtZT0iQ0lBQ0NGQ0IiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNjaGVtYSBHZW5lcmF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIFNjaGVtYSBHZW5lcmF0aW9uIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhpcyBwYWdlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJpYzwvc3Bhbj4gcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNzEiIG5hbWU9InN0aHJlZjI3MSI+PC9hPjxhIGlkPSJzdGhyZWYyNzIiIG5hbWU9InN0aHJlZjI3MiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+Jm5ic3A7PC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSIiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3ImcnNxdW87cyBTY2hlbWEgR2VuZXJhdGlvbiBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzUiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzNSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDM1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzNSIgaGVhZGVycz0icjFjMS10MzUiPgotPHA+RERMIEdlbmVyYXRpb24gVHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDM1IHIxYzItdDM1Ij4KLTxwPlNlbGVjdCB0aGUgdHlwZSBvZiBEREwgZ2VuZXJhdGlvbjo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Tm9uZTwvc3Bhbj4gLS0gRG8gbm90IGdlbmVyYXRlIERETDsgbm8gc2NoZW1hIGlzIGdlbmVyYXRlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBUYWJsZXM8L3NwYW4+IC0tIENyZWF0ZSBEREwgZm9yIG5vbi1leGlzdGVudCB0YWJsZXM7IGxlYXZlIGV4aXN0aW5nIHRhYmxlcyB1bmNoYW5nZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ecm9wIGFuZCBDcmVhdGUgVGFibGVzPC9zcGFuPiAtLSBDcmVhdGUgRERMIGZvciBhbGwgdGFibGVzOyBkcm9wIGFsbCBleGlzdGluZyB0YWJsZXMuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzNSByMWMzLXQzNSI+Ci08cD5Ob25lPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM1IiBoZWFkZXJzPSJyMWMxLXQzNSI+Ci08cD5PdXRwdXQgTW9kZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM1IHIxYzItdDM1Ij4KLTxwPlNlbGVjdCB0aGUgRERMIGdlbmVyYXRpb24gdGFyZ2V0OjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Cb3RoPC9zcGFuPiAtLSBHZW5lcmF0ZSBTUUwgZmlsZXMgYW5kIGV4ZWN1dGUgdGhlbSBvbiB0aGUgZGF0YWJhc2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5EYXRhYmFzZTwvc3Bhbj4gLS0gRXhlY3V0ZSBTUUwgb24gdGhlIGRhdGFiYXNlIG9ubHkgKGRvIG5vdCBnZW5lcmF0ZSBTUUwgZmlsZXMpLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U1FMIFNjcmlwdDwvc3Bhbj4gLS0gR2VuZXJhdGUgU1FMIGZpbGVzIG9ubHkgKGRvIG5vdCBleGVjdXRlIHRoZW0gb24gdGhlIGRhdGFiYXNlKS48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM1IHIxYzMtdDM1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzUiIGhlYWRlcnM9InIxYzEtdDM1Ij4KLTxwPkRETCBHZW5lcmF0aW9uIExvY2F0aW9uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MzUgcjFjMi10MzUiPgotPHA+U3BlY2lmeSB3aGVyZSBFY2xpcHNlTGluayB3cml0ZXMgRERMIG91dHB1dC4gU3BlY2lmeSBhIGZpbGUgc3BlY2lmaWNhdGlvbiB0byBhIGRpcmVjdG9yeSBpbiB3aGljaCB5b3UgaGF2ZSB3cml0ZSBhY2Nlc3MuIFRoZSBmaWxlIHNwZWNpZmljYXRpb24gbWF5IGJlIHJlbGF0aXZlIHRvIHlvdXIgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBvciBhYnNvbHV0ZS4gSWYgaXQgZG9lcyBub3QgZW5kIGluIGEgZmlsZSBzZXBhcmF0b3IsIHRoZW4gRWNsaXBzZUxpbmsgYXBwZW5kcyBvbmUgdGhhdCBpcyB2YWxpZCBmb3IgeW91ciBvcGVyYXRpbmcgc3lzdGVtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDM1IHIxYzMtdDM1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MzUiIGhlYWRlcnM9InIxYzEtdDM1Ij4KLTxwPkNyZWF0ZSBEREwgRmlsZSBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzUgcjFjMi10MzUiPgotPHA+U3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSBEREwgZmlsZSB0aGF0IEVjbGlwc2VMaW5rIGdlbmVyYXRlcyB0aGF0IGNvbnRhaW5zIFNRTCBzdGF0ZW1lbnRzIGZvciBjcmVhdGluZyB0YWJsZXMgZm9yIEpQQSBlbnRpdGllcy4gU3BlY2lmeSBhIGZpbGUgbmFtZSB2YWxpZCBmb3IgeW91ciBvcGVyYXRpbmcgc3lzdGVtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDM1IHIxYzMtdDM1Ij4KLTxwPmNyZWF0ZURETC5qZGJjPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDM1IiBoZWFkZXJzPSJyMWMxLXQzNSI+Ci08cD5Ecm9wIERETCBGaWxlIE5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQzNSByMWMyLXQzNSI+Ci08cD5TcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIERETCBmaWxlIHRoYXQgRWNsaXBzZUxpbmsgZ2VuZXJhdGVzIHRoYXQgY29udGFpbnMgU1FMIHN0YXRlbWVudHMgZm9yIGRyb3BwaW5nIHRhYmxlcyBmb3IgSlBBIGVudGl0aWVzLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDM1IHIxYzMtdDM1Ij4KLTxwPmRyb3BEREwuamRiYzwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzMGYwMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UHJvcGVydGllczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcm9wZXJ0aWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBSEpERkYiIG5hbWU9IkNJQUhKREZGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Qcm9wZXJ0aWVzPC9oMT4KLTxwPlRoaXMgcGFnZSBlbmFibGVzIHlvdSB0byBhZGQgb3IgcmVtb3ZlIHRoZSB2ZW5kb3Itc3BlY2lmaWMgPGNvZGU+Jmx0O3Byb3BlcnRpZXMmZ3Q7PC9jb2RlPiBlbGVtZW50cyBvZiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+LjwvcD4KLTxwPlRvIGFkZCBhIHByb3BlcnR5LCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0aGVuIGVudGVyIHRoZSBwcm9wZXJ0eSA8c3BhbiBjbGFzcz0iYm9sZCI+TmFtZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJib2xkIj5WYWx1ZTwvc3Bhbj4uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiOTg0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U291cmNlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNvdXJjZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUhDSkFIIiBuYW1lPSJDSUFIQ0pBSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U291cmNlPC9oMT4KLTxwPlVzaW5nIHRoaXMgcGFnZSwgeW91IGNhbiBtYW51YWxseSBlZGl0IHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI8L2E+IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNWJhODAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlByZWZlcmVuY2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlByZWZlcmVuY2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDREVJRUUiIG5hbWU9IkNBQ0RFSUVFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5QcmVmZXJlbmNlczwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZyBwcmVmZXJlbmNlIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEphdmEgUGVyc2lzdGVuY2UgT3B0aW9uczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI3Lmh0bSNDQUNGQkFFSCI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBWYWxpZGF0aW9uIFByZWZlcmVuY2VzPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGQ0NWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IFZhbGlkYXRpb24gUHJlZmVyZW5jZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRkJBRUgiIG5hbWU9IkNBQ0ZCQUVIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IFZhbGlkYXRpb24gUHJlZmVyZW5jZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjI3NSIgbmFtZT0ic3RocmVmMjc1Ij48L2E+PGEgaWQ9InN0aHJlZjI3NiIgbmFtZT0ic3RocmVmMjc2Ij48L2E+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SmF2YSBQZXJzaXN0ZW5jZTwvc3Bhbj4gb3B0aW9ucyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb3BlcnRpZXM8L3NwYW4+IHBhZ2UgdG8gc2VsZWN0IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHVzZSB3aXRoIHRoZSBwcm9qZWN0LjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHMgcGFnZTwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHBhZ2UuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzciPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzNyI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+PGEgaWQ9InN0aHJlZjI3NyIgbmFtZT0ic3RocmVmMjc3Ij48L2E+PGEgaWQ9InN0aHJlZjI3OCIgbmFtZT0ic3RocmVmMjc4Ij48L2E+PGEgaWQ9InN0aHJlZjI3OSIgbmFtZT0ic3RocmVmMjc5Ij48L2E+PGEgaWQ9InN0aHJlZjI4MCIgbmFtZT0ic3RocmVmMjgwIj48L2E+UGxhdGZvcm08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzNyByMWMyLXQzNyI+U2VsZWN0IHRoZSB2ZW5kb3Itc3BlY2lmaWMgcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+TGlicmFyeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM3IHIxYzItdDM3Ij5TZWxlY3QgYSBzcGVjaWZpYyBKUEEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbmFnZSBsaWJyYXJpZXM8L3NwYW4+IHRvIGNyZWF0ZSBvciB1cGRhdGUgYSB1c2VyIGxpYnJhcnkuPC9wPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gZG93bmxvYWQgYSBzcGVjaWZpYyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+Jm5ic3A7Jm5ic3A7VHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDM3IHIxYzItdDM3Ij5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPlVzZXIgTGlicmFyeTwvc3Bhbj4gdG8gc2VsZWN0IGZyb20gdGhlIGF2YWlsYWJsZSB1c2VyLWRlZmluZWQgb3IgZG93bmxvYWRlZCBsaWJyYXJpZXMuCi08cD5JZiB5b3Ugc2VsZWN0IERpc2FibGUsIHlvdSBtdXN0IG1hbnVhbGx5IGluY2x1ZGUgdGhlIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5IG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij4mbmJzcDsmbmJzcDtJbmNsdWRlJm5ic3A7bGlicmFyaWVzJm5ic3A7d2l0aCZuYnNwO3RoaXMmbmJzcDthcHBsaWNhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDM3IHIxYzItdDM3Ij5TcGVjaWZ5IGlmIHRoZSBzZWxlY3RlZCBsaWJyYXJpZXMgYXJlIGluY2x1ZGVkIHdoZW4gZGVwbG95aW5nIHRoZSBhcHBsaWNhdGlvbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij48YSBpZD0ic3RocmVmMjgxIiBuYW1lPSJzdGhyZWYyODEiPjwvYT48YSBpZD0ic3RocmVmMjgyIiBuYW1lPSJzdGhyZWYyODIiPjwvYT48YSBpZD0ic3RocmVmMjgzIiBuYW1lPSJzdGhyZWYyODMiPjwvYT5Db25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzcgcjFjMi10MzciPlRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gbWFwIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLgotPHVsPgotPGxpPgotPHA+VG8gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgQ29ubmVjdGlvbnM8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UbyByZWNvbm5lY3QgdG8gYW4gZXhpc3RpbmcgY29ubmVjdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPlJlY29ubmVjdDwvc3Bhbj4uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij4mbmJzcDsmbmJzcDtPdmVycmlkZSZuYnNwO2RlZmF1bHQmbmJzcDtjYXRhbG9nJm5ic3A7ZnJvbSZuYnNwO2Nvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzNyByMWMyLXQzNyI+U2VsZWN0IGEgY2F0YWxvZyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IG9uZSBkZXJpdmVkIGZyb20gdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24uIFVzZSB0aGlzIG9wdGlvbiBpZiB0aGUgZGVmYXVsdCBjYXRhbG9nIGlzIGluY29ycmVjdCBvciBjYW5ub3QgYmUgdXNlZC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij4mbmJzcDsmbmJzcDtPdmVycmlkZSZuYnNwO2RlZmF1bHQmbmJzcDtzY2hlbWEmbmJzcDtmcm9tJm5ic3A7Y29ubmVjdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDM3IHIxYzItdDM3Ij5TZWxlY3QgYSBzY2hlbWEgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmUgZGVyaXZlZCBmcm9tIHRoZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uLiBVc2UgdGhpcyBvcHRpb24gaWYgdGhlIGRlZmF1bHQgc2NoZW1hIGlzIGluY29ycmVjdCBvciBjYW5ub3QgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHVzZSB0aGlzIG9wdGlvbiB3aGVuIHRoZSBkZXBsb3ltZW50IGxvZ2luIGRpZmZlcnMgZnJvbSB0aGUgZGVzaWduLXRpbWUgbG9naW4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+UGVyc2lzdGVudCBDbGFzcyBNYW5hZ2VtZW50PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MzcgcjFjMi10MzciPlNwZWNpZnkgaWYgRGFsaSB3aWxsIDxzcGFuIGNsYXNzPSJib2xkIj5kaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyBhdXRvbWF0aWNhbGx5PC9zcGFuPiwgb3IgaWYgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5hbm5vdGF0ZWQgY2xhc3NlcyBtdXN0IGJlIGxpc3RlZCBpbiB0aGUgcGVyc2lzdGVuY2UueG1sPC9zcGFuPiBmaWxlLgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vdGU8L3NwYW4+OiBUbyBpbnN1cmUgYXBwbGljYXRpb24gcG9ydGFiaWxpdHksIHlvdSBzaG91bGQgZXhwbGljaXRseSBsaXN0IHRoZSBtYW5hZ2VkIHBlcnNpc3RlbmNlIGNsYXNzZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQzNyIgaGVhZGVycz0icjFjMS10MzciPjxhIGlkPSJzdGhyZWYyODQiIG5hbWU9InN0aHJlZjI4NCI+PC9hPjxhIGlkPSJzdGhyZWYyODUiIG5hbWU9InN0aHJlZjI4NSI+PC9hPkNhbm9uaWNhbCBNZXRhbW9kZWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MzcgcjFjMi10MzciPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI4Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzcxYjI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjguaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5EaWFsb2dzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkRpYWxvZ3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNHRUpEQSIgbmFtZT0iQ0FDR0VKREEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkRpYWxvZ3M8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmcgcHJlZmVyZW5jZSBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjkuaHRtI0NBQ0NHRUhDIj5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9zZWxlY3RfY2FzY2FkZV9kaWFsb2cuaHRtI0NJQUZER0lKIj5TZWxlY3QgQ2FzY2FkZSBkaWFsb2c8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9lY2xpcHNlbGlua19tYXBwaW5nX2ZpbGUuaHRtI0NJQUVERUpGIj5OZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZzwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjY2Njc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRWRpdCBKb2luIENvbHVtbnMgRGlhbG9nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQ0dFSEMiIG5hbWU9IkNBQ0NHRUhDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L2gxPgotPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+Sm9pbiBDb2x1bW5zPC9zcGFuPiBkaWFsb2cgdG8gY3JlYXRlIG9yIG1vZGlmeSB0aGUgam9pbiB0YWJsZXMgYW5kIGNvbHVtbnMgaW4gcmVsYXRpb25zaGlwIG1hcHBpbmdzLjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+Sm9pbiBDb2x1bW5zPC9zcGFuPiBkaWFsb2cuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgZGlhbG9nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDM4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MzgiIGhlYWRlcnM9InIxYzEtdDM4Ij5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzggcjFjMi10MzgiPk5hbWUgb2YgdGhlIGpvaW50IHRhYmxlIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSBjb2x1bW4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM4IiBoZWFkZXJzPSJyMWMxLXQzOCI+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM4IHIxYzItdDM4Ij5OYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgZm9yZWlnbiBrZXkgcmVmZXJlbmNlIGZvciB0aGUgZW50aXR5IHJlbGF0aW9uc2hpcC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT48YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jQ0FDRkNFSkMiPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMwLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDI3OTc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5JY29ucyBhbmQgYnV0dG9uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJJY29ucyBhbmQgYnV0dG9ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0RIQ0lBIiBuYW1lPSJDQUNESENJQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SWNvbnMgYW5kIGJ1dHRvbnM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIGVhY2ggb2YgdGhlIGljb25zIGFuZCBidXR0b25zIHVzZWQgaW4gdGhlIERhbGkgT1IgTWFwcGluZyBUb29sLjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAzMS5odG0jQ0FDR0VBQ0ciPkljb25zPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMzIuaHRtI0NBQ0RKQ0VJIj5CdXR0b25zPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NzYwZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5JY29uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJJY29ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0dFQUNHIiBuYW1lPSJDQUNHRUFDRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SWNvbnM8L2gxPgotPHA+VGhlIGZvbGxvd2luZyBpY29ucyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbC48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgaWNvbnMgdXNlZCBpbiB0aGUgRGFsaSBwbHVnLWluLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGljb25zIHVzZWQgaW4gdGhlIERhbGkgcGx1Zy1pbi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjMlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDQxIj5JY29uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ0MSI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nIiBhbHQ9IiIgdGl0bGU9IiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9lbWJlZGRhYmxlZW50aXR5bWFwcGluZy5wbmciIGFsdD0iRW1iZWRkYWJsZSBlbnRpdHkgaWNvbiIgdGl0bGU9IkVtYmVkZGFibGUgZW50aXR5IGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDA3Lmh0bSNCQUJGRUlDRSI+RW1iZWRkYWJsZTwvYT4gZW50aXR5PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9tYXBwZWRzdXBlcmNsYXNzLnBuZyIgYWx0PSJNYXBwZWQgc3VwZXJjbGFzcyBpY29uIiB0aXRsZT0iTWFwcGVkIHN1cGVyY2xhc3MgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMDguaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nIiBhbHQ9IkJhc2ljIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkJhc2ljIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvaWNvbl9iYXNpY21hcG1hcHBpbmdzLnBuZyIgYWx0PSJCYXNpYyBtYXBwaW5nIGljb24iIHRpdGxlPSJCYXNpYyBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NDEgcjFjMi10NDEiPkJhc2ljIGNvbGxlY3Rpb24gbWFwcGluZzwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvaWNvbl9iYXNpY21hcHBpbmcucG5nIiBhbHQ9IkJhc2ljIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkJhc2ljIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ0MSByMWMyLXQ0MSI+QmFzaWMgbWFwIG1hcHBpbmc8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2VtYmVkZGVkaWRtYXBwaW5nLnBuZyIgYWx0PSJFbWJlZGRlZCBtYXBwaW5nIGljb24iIHRpdGxlPSJFbWJlZGRlZCBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmciIGFsdD0iRW1iZWRkZWQgSUQgbWFwcGluZyBpY29uIiB0aXRsZT0iRW1iZWRkZWQgSUQgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxMi5odG0jQ0lIRElBRUUiPkVtYmVkZGVkIElEIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25faWRtYXBwaW5nLnBuZyIgYWx0PSJJRCBtYXBwaW5nIGljb24iIHRpdGxlPSJJRCBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMWMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fbWFueXRvbWFueW1hcHBpbmcucG5nIiBhbHQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIGljb24iIHRpdGxlPSJNYW55LXRvLW1hbnkgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEyYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9tYW55dG9vbmVtYXBwaW5nLnBuZyIgYWx0PSJNYW55LXRvLW9uZSBtYXBwaW5nIGljb24uIiB0aXRsZT0iTWFueS10by1vbmUgbWFwcGluZyBpY29uLiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEzYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9vbmV0b21hbnltYXBwaW5nLnBuZyIgYWx0PSJPbmUtdG8tbWFueSBtYXBwaW5nIGljb24iIHRpdGxlPSJPbmUtdG8tbWFueSBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNGMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fb25ldG9vbmVtYXBwaW5nLnBuZyIgYWx0PSJPbmUtdG8tb25lIG1hcHBpbmcgaWNvbi4iIHRpdGxlPSJPbmUtdG8tb25lIG1hcHBpbmcgaWNvbi4iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjE1YzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9pY29uX2Jhc2ljbWFwbWFwcGluZ3MucG5nIiBhbHQ9IkJhc2ljIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkJhc2ljIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTVjMS10NDEgcjFjMi10NDEiPlRyYW5zZm9ybWF0aW9uIG1hcHBpbmdzPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNmMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmciIGFsdD0iVHJhbnNpZW50IG1hcHBpbmcgaWNvbi4iIHRpdGxlPSJUcmFuc2llbnQgbWFwcGluZyBpY29uLiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTZjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDE4Lmh0bSNCQUJIRkhFSSI+VHJhbnNpZW50IG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxN2MxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvaWNvbl9iYXNpY21hcG1hcHBpbmdzLnBuZyIgYWx0PSJCYXNpYyBtYXBwaW5nIGljb24iIHRpdGxlPSJCYXNpYyBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE3YzEtdDQxIHIxYzItdDQxIj5WYXJpYWJsZSBvbmUtdG8tb25lIG1hcHBpbmdzPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxOGMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nIiBhbHQ9IlZlcnNpb24gbWFwcGluZyBpY29uLiIgdGl0bGU9IlZlcnNpb24gbWFwcGluZyBpY29uLiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMThjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDE5Lmh0bSNCQUJISUJJSSI+VmVyc2lvbiBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDMwLmh0bSNDQUNESENJQSI+SWNvbnMgYW5kIGJ1dHRvbnM8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkYjU0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QnV0dG9uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJCdXR0b25zIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDREpDRUkiIG5hbWU9IkNBQ0RKQ0VJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5CdXR0b25zPC9oMT4KLTxwPlRoZSBmb2xsb3dpbmcgYnV0dG9ucyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbC48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgYnV0dG9ucyB1c2VkIGluIHRoZSBEYWxpIHBsdWctaW4uIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgYnV0dG9ucyB1c2VkIGluIHRoZSBEYWxpIHBsdWctaW4uIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI3JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ0MiI+SWNvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10NDIiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ0MiIgaGVhZGVycz0icjFjMS10NDIiPjxpbWcgc3JjPSJpbWcvbmV3X2pwYV9wZXJzcGVjdGl2ZV9idXR0b24ucG5nIiBhbHQ9IlRoZSBKUEEgUGVyc3BlY3RpdmUgaWNvbiIgdGl0bGU9IlRoZSBKUEEgUGVyc3BlY3RpdmUgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ0MiByMWMyLXQ0MiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMzAuaHRtI0NBQ0RIQ0lBIj5JY29ucyBhbmQgYnV0dG9uczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTcwNmI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5EYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNCQkRJQiIgbmFtZT0iQ0FDQkJESUIiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjI4OCIgbmFtZT0ic3RocmVmMjg4Ij48L2E+PGEgaWQ9InN0aHJlZjI4OSIgbmFtZT0ic3RocmVmMjg5Ij48L2E+PGEgaWQ9InN0aHJlZjI5MCIgbmFtZT0ic3RocmVmMjkwIj48L2E+QWRkaXRpb25hbCBEYWxpIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIG9ubGluZSBhdDo8L3A+Ci08cD48Y29kZT48YSBocmVmPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9pbmRleC5waHAvRGFsaV9EZXZlbG9wZXJfRG9jdW1lbnRhdGlvbiI+aHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvaW5kZXgucGhwL0RhbGlfRGV2ZWxvcGVyX0RvY3VtZW50YXRpb248L2E+PC9jb2RlPjwvcD4KLTxwPlRoaXMgZGV2ZWxvcGVyIGRvY3VtZW50YXRpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQ6PC9wPgotPHVsPgotPGxpPgotPHA+RGFsaSBhcmNoaXRlY3R1cmU8L3A+Ci08L2xpPgotPGxpPgotPHA+UGx1Z2lucyB0aGF0IGNvbXByaXNlIHRoZSBEYWxpIEpQQSBFY2xpcHNlIGZlYXR1cmU8L3A+Ci08L2xpPgotPGxpPgotPHA+RXh0ZW5zaW9uIHBvaW50czwvcD4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTg0MmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJISUNBSSIgbmFtZT0iQkFCSElDQUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjY3IiBuYW1lPSJzdGhyZWY2NyI+PC9hPjxhIGlkPSJzdGhyZWY2OCIgbmFtZT0ic3RocmVmNjgiPjwvYT48YSBpZD0ic3RocmVmNjkiIG5hbWU9InN0aHJlZjY5Ij48L2E+WW91IGNhbiBtYWtlIGEgSmF2YSBjbGFzcyBpbnRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBlcnNpc3RlbnQgdHlwZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDA3Lmh0bSNCQUJGRUlDRSI+RW1iZWRkYWJsZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDguaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNDSERCSUpBQyI+VGhlIG9ybS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPiA8IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkNTg0Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIR0JJRUkiIG5hbWU9IkNJSEdCSUVJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9oMT4KLTxwPkFkZCBhIHNlY29uZGFyeSB0YWJsZSBhbm5vdGF0aW9uIHRvIGFuIGVudGl0eSBpZiBpdHMgZGF0YSBpcyBzcGxpdCBhY3Jvc3MgbW9yZSB0aGFuIG9uZSB0YWJsZS48L3A+Ci08cD5UbyBhZGQgYSBzZWNvbmRhcnkgdGFibGUgdG8gdGhlIGVudGl0eSw8L3A+Ci08b2w+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGVudGl0eSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+U2Vjb25kYXJ5IFRhYmxlczwvc3Bhbj4gaW5mb3JtYXRpb24uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmOTIiIG5hbWU9InN0aHJlZjkyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U3BlY2lmeWluZyBTZWNvbmRhcnkgVGFibGVzPC9wPgotPGltZyBzcmM9ImltZy9zZWNvbmRhcnlfdGFibGVzLnBuZyIgYWx0PSJTZWNvbmRhcnkgVGFibGVzIGFyZWEgb24gdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiB0aXRsZT0iU2Vjb25kYXJ5IFRhYmxlcyBhcmVhIG9uIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IHRvIGFzc29jaWF0ZSBhbiBhZGRpdGlvbmFsIHRhYmxlIHdpdGggdGhlIGVudGl0eS4gVGhlIEVkaXQgU2Vjb25kYXJ5IFRhYmxlIGRpYWxvZyBhcHBlYXJzPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPk5hbWU8L3NwYW4+LCA8c3BhbiBjbGFzcz0iYm9sZCI+Q2F0YWxvZzwvc3Bhbj4sIGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+U2NoZW1hPC9zcGFuPiBvZiB0aGUgYWRkaXRpb25hbCB0YWJsZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgZW50aXR5LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdGhlIGVudGl0eTo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1AU2Vjb25kYXJ5VGFibGUobmFtZT0iTkFNRSIsIGNhdGFsb2cgPSAiQ0FUQUxPRyIsIHNjaGVtYSA9ICJTQ0hFTUEiKQotCi08L3ByZT4KLTxwPlRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHByaW1hcnkga2V5OjwvcD4KLTxvbD4KLTxsaT4KLTxwPkVuYWJsZSB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJ3cml0ZSBkZWZhdWx0PC9zcGFuPiBvcHRpb24sIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gdG8gc3BlY2lmeSBhIG5ldyBwcmltYXJ5IGtleSBqb2luIGNvbHVtbi4gVGhlIENyZWF0ZSBOZXcgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4gYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+TmFtZTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJib2xkIj5SZWZlcmVuY2VkIGNvbHVtbiBuYW1lPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPiwgYW5kIDxzcGFuIGNsYXNzPSJib2xkIj5Db2x1bW4gZGVmaW5pdGlvbjwvc3Bhbj4gb2YgdGhlIHByaW1hcnkga2V5IGZvciB0aGUgZW50aXR5LjwvcD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRoZSBlbnRpdHk6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQFNlY29uZGFyeVRhYmxlKG5hbWU9Ik5BTUUiLCBjYXRhbG9nID0gIkNBVEFMT0ciLCBzY2hlbWEgPSAiU0NIRU1BIiwgcGtKb2luQ29sdW1ucyA9IHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT0iaWQiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9ICJpZCIpLEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPSJOQU1FIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSAiUkVGRVJFTkNFRCBDT0xVTU4gTkFNRSIsIGNvbHVtbkRlZmluaXRpb24gPSAiQ09MVU1OIERFRklOSVRJT04iKX0pCi0KLTwvcHJlPjwvbGk+Ci08L29sPgotPGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfanBhX2VudGl0eS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfanBhX2VudGl0eS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4M2Y3ODcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGEgSlBBIEVudGl0eSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZCSkJHIiBuYW1lPSJCQUJGQkpCRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjQwIiBuYW1lPSJzdGhyZWY0MCI+PC9hPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvaDE+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gY3JlYXRlIGEgSlBBIGVudGl0eTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUHJvamVjdCBFeHBsb3Jlciwgc2VsZWN0IHRoZSBKUEEgcHJvamVjdCBhbmQgdGhlbiA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zcGFuPi4gVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY0MSIgbmFtZT0ic3RocmVmNDEiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TZWxlY3RpbmcgdGhlIENyZWF0ZSBhIEpQQSBFbnRpdHkgV2l6YXJkPC9wPgotPGltZyBzcmM9ImltZy9zZWxlY3RfYV93aXphcmRfZW50aXR5LnBuZyIgYWx0PSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIEVudGl0eSBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIEVudGl0eSBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpQQSAmZ3Q7IEVudGl0eTwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0jQ0lBRkVJR0YiPkVudGl0eSBDbGFzcyBwYWdlPC9hPiBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjQyIiBuYW1lPSJzdGhyZWY0MiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPjxhIGlkPSJzdGhyZWY0MyIgbmFtZT0ic3RocmVmNDMiPjwvYT5UaGUgRW50aXR5IENsYXNzIFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5wbmciIGFsdD0iVGhlIEVudGl0eSBDbGFzcyBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgRW50aXR5IHdpemFyZC4iIHRpdGxlPSJUaGUgRW50aXR5IENsYXNzIHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBFbnRpdHkgd2l6YXJkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5Db21wbGV0ZSB0aGlzIHBhZ2UgYXMgZm9sbG93czo8L3A+Ci08dWw+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIEpQQSBwcm9qZWN0IGluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+UHJvamVjdDwvc3Bhbj4gZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+U291cmNlIEZvbGRlcjwvc3Bhbj4gZmllbGQsIHNlbGVjdCwgb3IgZW50ZXIsIHRoZSBsb2NhdGlvbiBvZiB0aGUgSlBBIHByb2plY3QncyA8Y29kZT5zcmM8L2NvZGU+IGZvbGRlci48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0LCBvciBlbnRlciwgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHBhY2thZ2UgZm9yIHRoaXMgZW50aXR5IGluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+SmF2YSBQYWNrYWdlPC9zcGFuPiBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgaW4gdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5DbGFzcyBuYW1lPC9zcGFuPiBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+SWYgbmVlZGVkLCBlbnRlciwgb3Igc2VsZWN0IGEgc3VwZXJjbGFzcy48L3A+Ci08L2xpPgotPGxpPgotPHA+SWYgbmVlZGVkLCBjb21wbGV0ZSB0aGUgSW5oZXJpdGFuY2Ugc2VjdGlvbiBhcyBmb2xsb3dzICh0aGVzZSBwcm9wZXJ0aWVzIGFyZSBvcHRpb25hbCk6PC9wPgotPHVsPgotPGxpPgotPHA+QWNjZXB0IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RW50aXR5PC9zcGFuPiBvcHRpb24gKHRoZSBkZWZhdWx0KSB0byBjcmVhdGUgYSBKYXZhIGNsYXNzIHdpdGggdGhlIDxjb2RlPkBFbnRpdHk8L2NvZGU+IG9wdGlvbi48L3A+Ci08L2xpPgotPGxpPgotPHA+QWx0ZXJuYXRpdmVseSwgc2VsZWN0IDxhIGhyZWY9InRhc2tzMDA4Lmh0bSNCQUJEQUdDSSI+TWFwcGVkIHN1cGVyY2xhc3M8L2E+IChpZiB5b3UgZGVmaW5lZCBhIHN1cGVyIGNsYXNzKS48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5Jbmhlcml0YW5jZTwvc3Bhbj4gYW5kIHRoZW4gc2VsZWN0IG9uZSBvZiB0aGUgSlNSIDIyMCBpbmhlcml0YW5jZSBtYXBwaW5nIHN0cmF0ZWdpZXMgKFNJTkdMRV9UQUJMRSwgVEFCTEVfUEVSX0NMQVNTLCBKT0lORUQpLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCB0byBlbnRpdHkgbWFwcGluZ3MgaW4gWE1MPC9zcGFuPiB0byBjcmVhdGUgWE1MIG1hcHBpbmdzIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LCByYXRoZXIgdGhhbiBhbm5vdGF0aW9ucy48L3A+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPiB0byBwcm9jZWVkIHRvIHRoZSA8YSBocmVmPSJyZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtI0NJQURFQ0lBIj5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC9hPiB3aGVyZSB5b3UgZGVmaW5lIHRoZSBwZXJzaXN0ZW50IGZpZWxkcyBmb3IgdGhlIGVudGl0eS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY0NCIgbmFtZT0ic3RocmVmNDQiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmNDUiIG5hbWU9InN0aHJlZjQ1Ij48L2E+VGhlIEVudGl0eSBQcm9wZXJ0aWVzIFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL2NyZWF0ZV9qcGFfZmllbGRzLnBuZyIgYWx0PSJUaGUgRW50aXR5IFByb3BlcnRpZXMgcGFnZSBvZiB0aGUgQ3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkLiIgdGl0bGU9IlRoZSBFbnRpdHkgUHJvcGVydGllcyBwYWdlIG9mIHRoZSBDcmVhdGUgSlBBIEVudGl0eSB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPkFsdGVybmF0aXZlbHksIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+IHRvIGNvbXBsZXRlIHRoZSBlbnRpdHkuPC9wPgotPC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSBwYWdlIGFzIGZvbGxvd3M6PC9wPgotPG9sPgotPGxpPgotPHA+SWYgbmVlZGVkLCBlbnRlciBhIG5ldyBuYW1lIGZvciB0aGUgZW50aXR5LiBEb2luZyBzbyByZXN1bHRzIGluIGFkZGluZyBhIDxjb2RlPm5hbWU8L2NvZGU+IGF0dHJpYnV0ZSB0byB0aGUgPGNvZGU+QEVudGl0eTwvY29kZT4gbm90YXRpb24gKDxjb2RlPkBFbnRpdHkobmFtZT0iRW50aXR5TmFtZSIpPC9jb2RlPikuPC9wPgotPC9saT4KLTxsaT4KLTxwPkFjY2VwdCA8c3BhbiBjbGFzcz0iYm9sZCI+VXNlIGRlZmF1bHQ8L3NwYW4+ICh0aGUgZGVmYXVsdCBzZXR0aW5nKSB0byB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBuYW1lIG9mIHRoZSBtYXBwZWQgdGFibGUuIEVudGVyaW5nIGEgZGlmZmVyZW50IG5hbWUgcmVzdWx0cyBpbiBhZGRpbmcgdGhlIDxjb2RlPkBUYWJsZTwvY29kZT4gbm90YXRpb24gd2l0aCBpdHMgPGNvZGU+bmFtZTwvY29kZT4gYXR0cmlidXRlIGRlZmluZWQgYXMgdGhlIG5ldyB0YWJsZSAoPGNvZGU+QFRhYmxlKG5hbWU9IlRhYmxlTmFtZSIpPC9jb2RlPikuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGUgRW50aXR5IE5hbWUtcmVsYXRlZCBvcHRpb25zIGFyZSBub3QgYXZhaWxhYmxlIGlmIHlvdSBzZWxlY3RlZCA8YSBocmVmPSJ0YXNrczAwOC5odG0jQkFCREFHQ0kiPk1hcHBlZCBzdXBlcmNsYXNzPC9hPiBvbiB0aGUgPGEgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0jQ0lBRkVJR0YiPkVudGl0eSBDbGFzcyBwYWdlPC9hPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPkFkZCBwZXJzaXN0ZW5jZSBmaWVsZHMgdG8gdGhlIGVudGl0eSBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPi4gVGhlIEVudGl0eSBGaWVsZHMgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNDYiIG5hbWU9InN0aHJlZjQ2Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIEVudGl0eSBGaWVsZHMgRGlhbG9nPC9wPgotPGltZyBzcmM9ImltZy9qcGFfd2l6YXJkX2NyZWF0ZV9maWVsZHMucG5nIiBhbHQ9IlRoZSBFbnRpdHkgRmllbGRzIGRpYWxvZy4iIHRpdGxlPSJUaGUgRW50aXR5IEZpZWxkcyBkaWFsb2cuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+U2VsZWN0IGEgcGVyc2lzdGVuY2UgdHlwZSBmcm9tIHRoZSBUeXBlIGxpc3QuIFlvdSBjYW4gcmV0cmlldmUgYWRkaXRpb25hbCB0eXBlcyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gZnVuY3Rpb24uPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBmaWVsZCBuYW1lIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5PSzwvc3Bhbj4uIFJlcGVhdCB0aGlzIHByb2NlZHVyZSBmb3IgZWFjaCBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+SWYgbmVlZGVkLCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPktleTwvc3Bhbj4gdG8gZGVzaWduYXRlIHRoZSBmaWVsZCBhcyBhIHByaW1hcnkga2V5LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgZWl0aGVyIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RmllbGQtYmFzZWQ8L3NwYW4+IGFjY2VzcyB0eXBlICh0aGUgZGVmYXVsdCkgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5LWJhc2VkPC9zcGFuPiBhY2Nlc3MgdHlwZS48L3A+Ci08L2xpPgotPC9vbD4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi4gRWNsaXBzZSBhZGRzIHRoZSBlbnRpdHkgdG8geW91ciBwcm9qZWN0LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtI0NJQUdHR0RGIj5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIj5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU3ZTFlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhIRUpDSiIgbmFtZT0iQ0lISEVKQ0oiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyNiIgbmFtZT0ic3RocmVmMjYiPjwvYT48YSBpZD0ic3RocmVmMjciIG5hbWU9InN0aHJlZjI3Ij48L2E+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGNyZWF0ZSBhIG5ldyBKUEEgcHJvamVjdC48L3A+Ci08b2w+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUHJvamVjdCBFeHBsb3Jlciwgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5GaWxlICZndDsgTmV3ICZndDsgUHJvamVjdDwvc3Bhbj4uIFRoZSBTZWxlY3QgYSB3aXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgSlBBIHBlcnNwZWN0aXZlIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IEpQQSBQcm9qZWN0PC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYyOCIgbmFtZT0ic3RocmVmMjgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMjkiIG5hbWU9InN0aHJlZjI5Ij48L2E+U2VsZWN0aW5nIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQ8L3A+Ci08aW1nIHNyYz0iaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmciIGFsdD0iVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgd2l0aCBKUEEgcHJvamVjdCBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIEpQQSBwcm9qZWN0IHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIFByb2plY3Q8L3NwYW4+IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIj5OZXcgSlBBIFByb2plY3QgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzMCIgbmFtZT0ic3RocmVmMzAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMzEiIG5hbWU9InN0aHJlZjMxIj48L2E+VGhlIEpQQSBQcm9qZWN0IFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL25ld19qcGFfcHJvamVjdF90YXNrLnBuZyIgYWx0PSJUaGUgSlBBIFByb2plY3QgcGFnZSBvZiB0aGUgQ3JlYXRlIGEgSlBBIFByb2plY3Qgd2l6YXJkLiIgdGl0bGU9IlRoZSBKUEEgUHJvamVjdCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIGZpZWxkcyBvbiB0aGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9hPiB0byBzcGVjaWZ5IHRoZSBwcm9qZWN0IG5hbWUgYW5kIGxvY2F0aW9uLCB0YXJnZXQgcnVudGltZSwgYW5kIHByZS1kZWZpbmVkIGNvbmZpZ3VyYXRpb24uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGUgVGFyZ2V0IFJ1bnRpbWUgaXMgbm90IHJlcXVpcmVkIGZvciBKYXZhIFNFIGRldmVsb3BtZW50LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIEphdmEgc291cmNlIHBhZ2UgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzMiIgbmFtZT0ic3RocmVmMzIiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgSmF2YSBTb3VyY2UgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvamF2YV9lZGl0b3JfYWRkcmVzcy5wbmciIGFsdD0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiB0aXRsZT0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBGb2xkZXI8L3NwYW4+IHRvIGFkZCBleGlzdGluZyBKYXZhIHNvdXJjZSBmaWxlcyB0byB0aGUgcHJvamVjdC48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMzMiIG5hbWU9InN0aHJlZjMzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+PGEgaWQ9InN0aHJlZjM0IiBuYW1lPSJzdGhyZWYzNCI+PC9hPlRoZSBKUEEgRmFjZXQgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvbmV3X2pwYV9mYWNldF90YXNrLnBuZyIgYWx0PSJUaGUgSlBBIEZhY2V0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZC4iIHRpdGxlPSJUaGUgSlBBIEZhY2V0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSB0aGUgZmllbGRzIG9uIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IHRvIHNwZWNpZnkgeW91ciB2ZW5kZXItc3BlY2lmaWMgcGxhdGZvcm0sIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5LCBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbi48L3A+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TWFuYWdlIGxpYnJhcmllczwvc3Bhbj4gdG8gY3JlYXRlIG9yIHVwZGF0ZSB5b3VyIEpQQSB1c2VyIGxpYnJhcmllcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gb2J0YWluIGFkZGl0aW9uYWwgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcmllcy48L3A+Ci08cD5JZiBEYWxpIGRlcml2ZXMgdGhlIGluY29ycmVjdCBzY2hlbWEsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgdGhlIERlZmF1bHQgU2NoZW1hIGZvciBDb25uZWN0aW9uPC9zcGFuPi4gVXNpbmcgdGhpcyBvcHRpb24sIHlvdSBjYW4gc2VsZWN0IGEgZGV2ZWxvcG1lbnQgdGltZSBzY2hlbWEgZm9yIGRlZmF1bHRzIGFuZCB2YWxpZGF0aW9uLjwvcD4KLTxwPklmIHlvdSBjbGVhciB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBvcm0ueG1sPC9zcGFuPiBvcHRpb24gKHdoaWNoIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQpLCB5b3UgY2FuIGxhdGVyIGFkZCBhIG1hcHBpbmcgZmlsZSB0byB0aGUgcHJvamVjdCB1c2luZyB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1JZiB0aGUgc2VydmVyIHJ1bnRpbWUgZG9lcyBub3QgcHJvdmlkZSBhIEpQQSBpbXBsZW1lbnRhdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSBzZWxlY3QgYSBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeS4KLTxwPlRvIGluc3VyZSB0aGUgcG9ydGFiaWxpdHkgb2YgeW91ciBhcHBsaWNhdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSBsaXN0IHRoZSBtYW5hZ2VkIHBlcnNpc3RlbmNlIGNsYXNzZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIElmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgRUpCIDMuMCwgdGhlIHBlcnNpc3RlbnQgY2xhc3NlcyB3aWxsIGJlIGRpc2NvdmVyZWQgYXV0b21hdGljYWxseS48L3A+Ci08cD5EZXBlbmRpbmcgb24geW91ciBKUEEgaW1wbGVtZW50YXRpb24gKGZvciBleGFtcGxlLCBHZW5lcmljIG9yIEVjbGlwc2VMaW5rKSwgZGlmZmVyZW50IG9wdGlvbnMgbWF5IGJlIGF2YWlsYWJsZSB3aGVuIGNyZWF0aW5nIEpQQSBwcm9qZWN0cy48L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi4gWW91IHNob3VsZCBub3cgb3BlbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPjxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMDEuaHRtI0JFSUJBREhIIj5Db252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3Q8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIj5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjllZTgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNi0wNFQxOTozMzozWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWEiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhDQkhKRCIgbmFtZT0iQ0lIQ0JISkQiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWE8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE5NyIgbmFtZT0ic3RocmVmMTk3Ij48L2E+PGEgaWQ9InN0aHJlZjE5OCIgbmFtZT0ic3RocmVmMTk4Ij48L2E+PGEgaWQ9InN0aHJlZjE5OSIgbmFtZT0ic3RocmVmMTk5Ij48L2E+VXNlIHRoZSBHZW5lcmF0ZSBDbGFzc2VzIGZyb20gWFNEIGRpYWxvZyB0byBnZW5lcmF0ZSBKQVhCIGNsYXNzZXMgZnJvbSBhbiBYTUwgc2NoZW1hICgmbmJzcDsueHNkKS48YSBpZD0ic3RocmVmMjAwIiBuYW1lPSJzdGhyZWYyMDAiPjwvYT48L3A+Ci08b2w+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUHJvamVjdCBFeHBsb3JlciwgcmlnaHQtY2xpY2sgYSBzY2hlbWEgKCZuYnNwOy54c2QgZmlsZSkgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJhdGUgJmd0OyBKQVhCIENsYXNzZXM8L3NwYW4+LiBUaGUgR2VuZXJhdGUgQ2xhc3NlcyBmcm9tIFNjaGVtYSBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYyMDEiIG5hbWU9InN0aHJlZjIwMSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPjxhIGlkPSJzdGhyZWYyMDIiIG5hbWU9InN0aHJlZjIwMiI+PC9hPkNvbmZpZ3VyZSBKQVhCIENsYXNzIEdlbmVyYXRpb24gZGlhbG9nPC9wPgotPGltZyBzcmM9ImltZy9nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLnBuZyIgYWx0PSJHZW5lcmF0ZSBjbGFzc2VzIGZyb20gc2NoZW1hIGRpYWxvZy4iIHRpdGxlPSJHZW5lcmF0ZSBjbGFzc2VzIGZyb20gc2NoZW1hIGRpYWxvZy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgSkFYQiBzZXR0aW5ncyBpbmZvcm1hdGlvbiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uPC9wPgotPC9saT4KLTwvb2w+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NvbmZpZ3VyZV9qYXhiX2NsYXNzX2dlbmVyYXRpb25fZGlhbG9nLmh0bSNDQUNISEhKQSI+Q29uZmlndXJlIEpBWEIgQ2xhc3MgR2VuZXJhdGlvbiBkaWFsb2c8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3Y2YxYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0aW5nIFNjaGVtYSBmcm9tIENsYXNzZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA2LTA0VDE2OjE4OjEyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRpbmcgU2NoZW1hIGZyb20gQ2xhc3NlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEhCSkNKIiBuYW1lPSJDSUhIQkpDSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGluZyBTY2hlbWEgZnJvbSBDbGFzc2VzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxODkiIG5hbWU9InN0aHJlZjE4OSI+PC9hPjxhIGlkPSJzdGhyZWYxOTAiIG5hbWU9InN0aHJlZjE5MCI+PC9hPjxhIGlkPSJzdGhyZWYxOTEiIG5hbWU9InN0aHJlZjE5MSI+PC9hPlVzZSB0aGUgR2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIHdpemFyZCBjcmVhdGUgYW4gWE1MIHNjaGVtYSAoJm5ic3A7LnhzZCkgZm9yIGEgc2V0IG9mIEpBWEIgbWFwcGVkIGNsYXNzZXMuPGEgaWQ9InN0aHJlZjE5MiIgbmFtZT0ic3RocmVmMTkyIj48L2E+PC9wPgotPG9sPgotPGxpPgotPHA+RnJvbSB0aGUgTmF2aWdhdG9yIG9yIFByb2plY3QgRXhwbG9yZXIsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zcGFuPi4gVGhlIFNlbGVjdCBhIHdpemFyZCBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1Zb3UgY2FuIGFsc28gYWNjZXNzIHRoZSBHZW5lcmF0ZSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMgd2l6YXJkIGZyb20gYSBzcGVjaWZpYyBwcm9qZWN0IG9yIHBhY2thZ2UuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTkzIiBuYW1lPSJzdGhyZWYxOTMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMTk0IiBuYW1lPSJzdGhyZWYxOTQiPjwvYT5TZWxlY3RpbmcgdGhlIFNjaGVtYSBGcm9tIEpBWEIgQ2xhc3NlcyB3aXphcmQ8L3A+Ci08aW1nIHNyYz0iaW1nL3NlbGVjdF9qYXhiX3NjaGVtYV93aXphcmQucG5nIiBhbHQ9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggU2NoZW1hIEZyb20gSkFYQiBDbGFzc2VzIHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggU2NoZW1hIEZyb20gSkFYQiBDbGFzc2VzIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SkFYQiAmZ3Q7IFNjaGVtYSBmcm9tIEpBWEIgQ2xhc3Nlczwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3NjaGVtYV9mcm9tX2NsYXNzZXNfcGFnZS5odG0jQ0FDSEJFR0oiPkdlbmVyYXRlIFNjaGVtYSBmcm9tIENsYXNzZXM8L2E+IHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtI0NBQ0dBREZIIj5HZW5lcmF0ZSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMgV2l6YXJkPC9hPiBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE5NSIgbmFtZT0ic3RocmVmMTk1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE5NiIgbmFtZT0ic3RocmVmMTk2Ij48L2E+VGhlIEdlbmVyYXRlIFNjaGVtYSBmcm9tIENsYXNzZXMgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvamF4Yl9zY2htZWFfZ2VuZXJhdGlvbl9kaWFsb2cucG5nIiBhbHQ9IlRoZSBKUEEgUHJvamVjdCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiB0aXRsZT0iVGhlIEpQQSBQcm9qZWN0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIHByb2plY3QsIHBhY2thZ2UsIG9yIGNsYXNzZXMgZnJvbSB3aGljaCB0byBnZW5lcmF0ZSB0aGUgc2NoZW1hIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi48L3A+Ci08L2xpPgotPC9vbD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfamF4Yl9zY2hlbWFfd2l6YXJkLmh0bSNDQUNHQURGSCI+R2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZDwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2luaGVyaXRhbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2luaGVyaXRhbmNlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhNGQwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19pbmhlcml0YW5jZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSENDQ0pEIiBuYW1lPSJDSUhDQ0NKRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjkzIiBuYW1lPSJzdGhyZWY5MyI+PC9hPjxhIGlkPSJzdGhyZWY5NCIgbmFtZT0ic3RocmVmOTQiPjwvYT5BbiBlbnRpdHkgbWF5IGluaGVyaXQgcHJvcGVydGllcyBmcm9tIG90aGVyIGVudGl0aWVzLiBZb3UgY2FuIHNwZWNpZnkgYSBzcGVjaWZpYyBzdHJhdGVneSB0byB1c2UgZm9yIGluaGVyaXRhbmNlLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBzcGVjaWZ5IGluaGVyaXRhbmNlICg8Y29kZT5ASW5oZXJpdGFuY2UpPC9jb2RlPiBmb3IgYW4gZXhpc3RpbmcgZW50aXR5ICg8Y29kZT5ARW50aXR5PC9jb2RlPik6PC9wPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IHRoZSBlbnRpdHkgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldywgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkluaGVyaXRhbmNlPC9zcGFuPiBpbmZvcm1hdGlvbi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY5NSIgbmFtZT0ic3RocmVmOTUiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TcGVjaWZ5aW5nIEluaGVyaXRhbmNlPC9wPgotPGltZyBzcmM9ImltZy9pbmhlcml0YW5jZV90YWIucG5nIiBhbHQ9IlNlbGVjdGluZyB0aGUgSW5oZXJpdGFuY2UgYXJlYSBvbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIHRpdGxlPSJTZWxlY3RpbmcgdGhlIEluaGVyaXRhbmNlIGFyZWEgb24gdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+SW4gdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5TdHJhdGVneTwvc3Bhbj4gbGlzdCwgc2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHRoZSBpbmhlcml0YW5jZSBzdHJhdGVnaWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPkEgc2luZ2xlIHRhYmxlIChkZWZhdWx0KTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Kb2luZWQgdGFibGU8L3A+Ci08L2xpPgotPGxpPgotPHA+T25lIHRhYmxlIHBlciBjbGFzczwvcD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgZm9sbG93aW5nIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSB0YWIuIFNlZSA8YSBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI0NBQ0ZIR0hFIj4iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPC9hPiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEluaGVyaXRhbmNlIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEluaGVyaXRhbmNlIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjIzJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDEzIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxMyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj48YSBpZD0ic3RocmVmOTYiIG5hbWU9InN0aHJlZjk2Ij48L2E+PGEgaWQ9InN0aHJlZjk3IiBuYW1lPSJzdGhyZWY5NyI+PC9hPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTMgcjFjMi10MTMiPk5hbWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIHdoZW4gdXNpbmcgYSA8c3BhbiBjbGFzcz0iYm9sZCI+U2luZ2xlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+Sm9pbmVkPC9zcGFuPiBpbmhlcml0YW5jZSBzdHJhdGVneS4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBEaXNjcmltaW5hdG9yQ29sdW1uPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5EaXNjcmltaW5hdG9yIFR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMyByMWMyLXQxMyI+U2V0IHRoZSBkaXNjcmltaW5hdG9yIHR5cGUgdG8gPGNvZGU+Q2hhcjwvY29kZT4gb3IgPGNvZGU+SW50ZWdlcjwvY29kZT4gKGluc3RlYWQgb2YgaXRzIGRlZmF1bHQ6IDxjb2RlPlN0cmluZzwvY29kZT4pLiBUaGUgPHNwYW4gY2xhc3M9ImJvbGQiPkRpc2NyaW1pbmF0b3IgVmFsdWU8L3NwYW4+IG11c3QgY29uZm9ybSB0byB0aGlzIHR5cGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTMgcjFjMy10MTMiPlN0cmluZzwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPjxhIGlkPSJzdGhyZWY5OCIgbmFtZT0ic3RocmVmOTgiPjwvYT48YSBpZD0ic3RocmVmOTkiIG5hbWU9InN0aHJlZjk5Ij48L2E+RGlzY3JpbWluYXRvciBWYWx1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDEzIHIxYzItdDEzIj5TcGVjaWZ5IHRoZSBkaXNjcmltaW5hdG9yIHZhbHVlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBhbiBlbnRpdHkgaW4gdGhpcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFRoZSB2YWx1ZSBtdXN0IGNvbmZvcm0gdG8gdGhlIHNwZWNpZmllZCA8c3BhbiBjbGFzcz0iYm9sZCI+RGlzY3JpbWluYXRvciBUeXBlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBEaXNjcmltaW5hdG9yVmFsdWU8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPk92ZXJyaWRlIERlZmF1bHQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMyByMWMyLXQxMyI+VXNlIHRoaXMgZmllbGQgdG8gc3BlY2lmeSBjdXN0b20gcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zLgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QFByaW1hcnlLZXlKb2luQ2x1bW48L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0aGUgZW50aXR5IGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOSEVSSVRBTkNFX1NUUkFURUdZJmd0Ozwvc3Bhbj4pCi1ARGlzY3JpbWluYXRvckNvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RElTQ1JJTUlOQVRPUl9DT0xVTU4mZ3Q7PC9zcGFuPiIsCi0gICAgZGlzY3JpbWluYXRvclR5cGU9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0RJU0NSSU1JTkFUT1JfVFlQRSZndDs8L3NwYW4+KQotQERpc2NyaW1pbmF0b3JWYWx1ZSh2YWx1ZS0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0RJU0NSSU1JTkFUT1JfVkFMVUUmZ3Q7PC9zcGFuPiIpCi1AUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIsIAotICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iKQotCi08L3ByZT4KLTxwPjxhIGlkPSJzdGhyZWYxMDAiIG5hbWU9InN0aHJlZjEwMCI+PC9hPjxhIGlkPSJzdGhyZWYxMDEiIG5hbWU9InN0aHJlZjEwMSI+PC9hPjxhIGlkPSJzdGhyZWYxMDIiIG5hbWU9InN0aHJlZjEwMiI+PC9hPlRoZSBmb2xsb3dpbmcgZmlndXJlcyBpbGx1c3RyYXRlcyB0aGUgZGlmZmVyZW50IGluaGVyaXRhbmNlIHN0cmF0ZWdpZXMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTAzIiBuYW1lPSJzdGhyZWYxMDMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TaW5nbGUgVGFibGUgSW5oZXJpdGFuY2U8L3A+Ci08aW1nIHNyYz0iaW1nL2luaGVyaXRhbmNlX3NpbmdsZS5wbmciIGFsdD0iVGhpcyBmaWd1cmUgaWxsdXN0cmF0ZXMgZW50aXR5IGluaGVyaXRhbmNlIGluIGEgc2luZ2xlIHRhYmxlLiIgdGl0bGU9IlRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGVudGl0eSBpbmhlcml0YW5jZSBpbiBhIHNpbmdsZSB0YWJsZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTA0IiBuYW1lPSJzdGhyZWYxMDQiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMTA1IiBuYW1lPSJzdGhyZWYxMDUiPjwvYT48YSBpZD0ic3RocmVmMTA2IiBuYW1lPSJzdGhyZWYxMDYiPjwvYT5Kb2luZWQgVGFibGUgSW5oZXJpdGFuY2U8L3A+Ci08aW1nIHNyYz0iaW1nL2luaGVyaXRhbmNlX2pvaW4ucG5nIiBhbHQ9IlRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGEgam9pbmVkIHN1YmNsYXNzIGluaGVyaXRhbmNlIHN0cmF0ZWd5LiIgdGl0bGU9IlRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGEgam9pbmVkIHN1YmNsYXNzIGluaGVyaXRhbmNlIHN0cmF0ZWd5LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9vcm0uaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX29ybS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5Njg3MzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX29ybS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSERHRENEIiBuYW1lPSJDSUhER0RDRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjU4IiBuYW1lPSJzdGhyZWY1OCI+PC9hPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L2gxPgotPHA+V2hlbiBjcmVhdGluZyBhIEpQQSBwcm9qZWN0LCAoc2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4pIHlvdSBjYW4gYWxzbyBjcmVhdGUgdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBtYXBwaW5nIG1ldGFkYXRhIGFuZCBkZWZhdWx0cy48L3A+Ci08cD48YSBpZD0ic3RocmVmNTkiIG5hbWU9InN0aHJlZjU5Ij48L2E+RWNsaXBzZSBjcmVhdGVzIHRoZSA8Y29kZT5NRVRBLUlORlxvcm0ueG1sPC9jb2RlPiBmaWxlIGluIHlvdXIgcHJvamVjdCdzIGRpcmVjdG9yeTo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Jmd0OwotJmx0O3BlcnNpc3RlbmNlIHZlcnNpb249IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9WRVJTSU9OJmd0Ozwvc3Bhbj4iCi0gICAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiCi0gICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZQotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfMV8wLnhzZCImZ3Q7Ci0gICZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9VTklUX05BTUUmZ3Q7PC9zcGFuPiImZ3Q7Ci0gICAgJmx0O3Byb3ZpZGVyPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7UEVSU0lTVEVOQ0VfUFJPVklERVImZ3Q7PC9zcGFuPiIgLyZndDsKLSAgJmx0Oy9wZXJzaXN0ZW5jZS11bml0Jmd0OwotJmx0Oy9wZXJzaXN0ZW5jZSZndDsKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bSNDSUFFREVKRiI+TmV3IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZSBkaWFsb2c8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwNS5odG0jQ0lIQkNEQ0UiPldvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMy5odG0jQ0hEQklKQUMiPlRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZjYxOGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhEQUpJRCIgbmFtZT0iQ0lIREFKSUQiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPjxhIGlkPSJzdGhyZWY0NyIgbmFtZT0ic3RocmVmNDciPjwvYT5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjQ4IiBuYW1lPSJzdGhyZWY0OCI+PC9hPldoZW4geW91IGNyZWF0ZSBhIHByb2plY3QsIEVjbGlwc2UgY3JlYXRlcyB0aGUgPGNvZGU+TUVUQS1JTkZccGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGluIHRoZSBwcm9qZWN0J3MgZGlyZWN0b3J5LjwvcD4KLTxwPllvdSBjYW4gY3JlYXRlIGEgc3R1YiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIE1FVEEtSU5GIGRpcmVjdG9yeSB3aGVuIHlvdSBjcmVhdGUgYSBKUEEgcHJvamVjdCAoc2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4pLiBZb3UgY2FuIG1hbmFnZSB0aGlzIGZpbGUgZWl0aGVyIHRocm91Z2ggdGhlIFhNTCBlZGl0b3IgKHNlZSApIG9yIHRocm91Z2ggdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotRGVwZW5kaW5nIG9uIHlvdXIgSlBBIGltcGxlbWVudGF0aW9uIChmb3IgZXhhbXBsZSwgRWNsaXBzZUxpbmspLCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcGFnZXMgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvcjoKLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOS5odG0jQ0lBSkFGRUciPkN1c3RvbWl6YXRpb248L2E+PC9wPgotPHA+VXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgY2hhbmdlLXRyYWNraW5nIGFuZCBzZXNzaW9uIGN1c3RvbWl6ZXItcmVsYXRlZCBwcm9wZXJ0aWVzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjAuaHRtI0NJQUJFRENIIj5DYWNoaW5nPC9hPjwvcD4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gZGVmaW5lIGNhY2hpbmcgcHJvcGVydGllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIxLmh0bSNDSUFCR0hISSI+TG9nZ2luZzwvYT48L3A+Ci08cD5Vc2UgdGhpcyBwYWdlIHRvIGRlZmluZSBsb2dnaW5nIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMi5odG0jQ0lBRkpDSEUiPk9wdGlvbnM8L2E+PC9wPgotPHA+VXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgc2Vzc2lvbiBhbmQgdGFyZ2V0IGRhdGFiYXNlIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMy5odG0jQ0lBQ0NGQ0IiPlNjaGVtYSBHZW5lcmF0aW9uPC9hPjwvcD4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gZGVmaW5lIERETC1yZWxhdGVkIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTwvdWw+Ci08cD5Gb3IgcHJvamVjdHMgdXNpbmcgdGhlIEVjbGlwc2VMaW5rIEpQQSBpbXBsZW1lbnRhdGlvbiwgdGhlIENvbm5lY3Rpb25zIHBhZ2UgYWxzbyBpbmNsdWRlcyBKREJDIGNvbm5lY3Rpb24gcG9vbCBwcm9wZXJ0aWVzLjwvcD4KLTxwPklmIHRoZSBwcm9qZWN0IHVzZXMgdGhlIEdlbmVyaWMgcGxhdGZvcm0sIHRoZW4gb25seSB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwuaHRtI0NJQUNJRkdKIj5HZW5lcmFsPC9hPiwgPGEgaHJlZj0icmVmZXJlbmNlMDE4Lmh0bSNDSUFGRkpJRSI+Q29ubmVjdGlvbjwvYT4sIDxhIGhyZWY9InJlZmVyZW5jZTAyNC5odG0jQ0lBSEpERkYiPlByb3BlcnRpZXM8L2E+IGFuZCA8YSBocmVmPSJyZWZlcmVuY2UwMjUuaHRtI0NJQUhDSkFIIj5Tb3VyY2U8L2E+IHBhZ2VzIGFyZSBhdmFpbGFibGUuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08cD5UbyB1c2UgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gRWRpdG9yOjwvcD4KLTxvbD4KLTxsaT4KLTxwPk9wZW4gdGhlIDxjb2RlPnBlcmlzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwuaHRtI0NJQUNJRkdKIj5HZW5lcmFsPC9hPiBwYWdlIG9mIHRoZSBlZGl0b3IgYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJhbDwvc3Bhbj4gcGFnZSB0byBkZWZpbmUgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZXMgPGNvZGU+Jmx0O3BlcnNpc3RlbnQtdW5pdCZndDs8L2NvZGU+LXJlbGF0ZWQgYXR0cmlidXRlcyBhcyB3ZWxsIGFzIHRoZSA8Y29kZT4mbHQ7cHJvdmlkZXImZ3Q7PC9jb2RlPiwgYW5kIDxjb2RlPiZsdDtjbGFzcyZndDs8L2NvZGU+IGVsZW1lbnRzIChkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSkuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotVGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3IncyBTb3VyY2UgcGFnZSBlbmFibGVzIHlvdSB0byB2aWV3IGFuZCBlZGl0IHRoZSByYXcgWE1MIGZpbGUuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIGVkaXRvci4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjklIiAvPgotPGNvbCB3aWR0aD0iMjklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDgiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10OCI+RWxlbWVudCBEZWZpbmVkPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OCByMWMyLXQ4Ij5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWUgPSAiJmx0O05hbWUmZ3Q7IiZndDs8L2NvZGU+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPjxhIGlkPSJzdGhyZWY0OSIgbmFtZT0ic3RocmVmNDkiPjwvYT5QZXJzaXN0ZW5jZSBQcm92aWRlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMi10OCI+RW50ZXIgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMy10OCI+PGNvZGU+Jmx0O3Byb3ZpZGVyJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10OCIgaGVhZGVycz0icjFjMS10OCI+RGVzY3JpcHRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzItdDgiPkVudGVyIGEgZGVzY3JpcHRpb24gZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4gVGhpcyBpcyBhbiBvcHRpb25hbCBwcm9wZXJ0eS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDs8L2NvZGU+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPjxhIGlkPSJzdGhyZWY1MCIgbmFtZT0ic3RocmVmNTAiPjwvYT5NYW5hZ2VkIENsYXNzZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ4IHIxYzItdDgiPkFkZCBvciByZW1vdmUgdGhlIGNsYXNzZXMgbWFuYWdlZCB0aHJvdWdoIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDggcjFjMy10OCI+PGNvZGU+Jmx0O2NsYXNzJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10OCIgaGVhZGVycz0icjFjMS10OCI+Jm5ic3A7Jm5ic3A7RXhjbHVkZSZuYnNwO1VubGlzdGVkJm5ic3A7Q2xhc3NlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDggcjFjMi10OCI+U2VsZWN0IHRvIGluY2x1ZGUgYWxsIGFubm90YXRlZCBlbnRpdHkgY2xhc3NlcyBpbiB0aGUgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtleGNsdWRlLXVubGlzdGVkLWNsYXNzZXMmZ3Q7PC9jb2RlPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5YTUwmbmJzcDtNYXBwaW5nJm5ic3A7RmlsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ4IHIxYzItdDgiPkFkZCBvciByZW1vdmUgdGhlIG9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgWE1MIGZpbGVzIGRlZmluZSB0aGUgY2xhc3NlcyBtYW5hZ2VkIHRocm91Z2ggdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10OCByMWMzLXQ4Ij48Y29kZT4mbHQ7bWFwcGluZy1maWxlJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10OCIgaGVhZGVycz0icjFjMS10OCI+SkFSJm5ic3A7RmlsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQ4IHIxYzItdDgiPkFkZCBvciByZW1vdmUgYWRkaXRpb25hbCBKQVIgZmlsZXMgYW5kIGxpYnJhcmllczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDggcjFjMy10OCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPjwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiPkNvbm5lY3Rpb248L2E+IHBhZ2UgdG8gZGVmaW5lIHRoZSA8Y29kZT4mbHQ7anRhLWRhdGEtc291cmNlJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtub24tanRhLWRhdGEtc291cmNlJmd0OzwvY29kZT4gZWxlbWVudHMgYXMgZm9sbG93czo8L3A+Ci08cD5UbyBjb25maWd1cmUgdGhlIEpUQSAoSmF2YSBUcmFuc2FjdGlvbiBBUEkpIHNvdXJjZSB1c2VkIGJ5IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlcjo8L3A+Ci08b2w+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpUQTwvc3Bhbj4gZnJvbSB0aGUgVHJhbnNhY3Rpb24gVHlwZSBsaXN0LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgZ2xvYmFsIEpOREkgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UuPC9wPgotPC9saT4KLTwvb2w+Ci08cD5UbyBjb25maWd1cmUgYSBub24tSlRBIGRhdGEgc291cmNlOjwvcD4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+UmVzb3VyY2UgTG9jYWw8L3NwYW4+IGZyb20gdGhlIFRyYW5zYWN0aW9uIFR5cGUgbGlzdC48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIGdsb2JhbCBKTkRJIG5hbWUgb2YgdGhlIGRhdGEgc291cmNlLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0KCk8L3NwYW4+IHRvIHVzZSB0aGUgZGF0YSBzb3VyY2UgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lci48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08L29sPgotPHA+PGEgaWQ9InN0aHJlZjUxIiBuYW1lPSJzdGhyZWY1MSI+PC9hPkZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2VuZXJpYyBwbGF0Zm9ybSwgeW91IGNhbiBhbHNvIGRlZmluZSB0aGUgRWNsaXBzZUxpbmsgY29ubmVjdGlvbiBwb29sIGRyaXZlciwgY29ubmVjdGlvbiBwb29sIGRyaXZlciwgVVJMLCB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIHRhYmxlIGluIHRoZSBQcm9wZXJ0aWVzIHBhZ2UgdG8gc2V0IHRoZSB2ZW5kb3Itc3BlY2lmaWMgPGNvZGU+Jmx0O3Byb3BlcnRpZXMmZ3Q7PC9jb2RlPiBlbGVtZW50LjwvcD4KLTxwPlRvIGFkZCA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50czo8L3A+Ci08b2w+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIDxjb2RlPiZsdDtuYW1lJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDt2YWx1ZSZndDs8L2NvZGU+IGF0dHJpYnV0ZXMgZm9yIHRoZSA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50IHVzaW5nIHRoZSB0YWJsZSdzIE5hbWUgYW5kIFZhbHVlIGZpZWxkcy48L3A+Ci08L2xpPgotPC9vbD4KLTxwPlRvIHJlbW92ZSBhIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnQsIHNlbGVjdCBhIGRlZmluZWQgcHJvcGVydHkgaW4gdGhlIHRhYmxlIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5SZW1vdmU8L3NwYW4+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotSWYgdGhlIHByb2plY3QgdXNlcyB0aGUgRWNsaXBzZUxpbmsgcGxhdGZvcm0sIHRoZSBjb25uZWN0aW9uIHBhZ2UgYWxzbyBpbmNsdWRlcyBwYXJhbWV0ZXJzIGZvciBKREJDIGNvbm5lY3Rpb24gcG9vbGluZy48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08L29sPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwMi5odG0jQ0lIRkVCQUkiPlN5bmNocm9uaXppbmcgY2xhc3NlczwvYT48YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hcHBpbmcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFwcGluZy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOGQ4ZjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFwcGluZy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hcHBpbmcgYW4gZW50aXR5PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hcHBpbmcgYW4gZW50aXR5IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCREdCSUoiIG5hbWU9IkJBQkRHQklKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPk1hcHBpbmcgYW4gZW50aXR5PC9oMT4KLTxwPkRhbGkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBtYXBwaW5nIHR5cGVzIGZvciBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDEyLmh0bSNDSUhESUFFRSI+RW1iZWRkZWQgSUQgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxNC5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE4Lmh0bSNCQUJIRkhFSSI+VHJhbnNpZW50IG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE5Lmh0bSNCQUJISUJJSSI+VmVyc2lvbiBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyMC5odG0jQ0lIQkRFQUoiPkVsZW1lbnQgQ29sbGVjdGlvbiBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QWRkaXRpb25hbCBtYXBwaW5nIHR5cGVzIChzdWNoIGFzIEJhc2ljIENvbGxlY3Rpb24gbWFwcGluZ3MpIG1heSBiZSBhdmFpbGFibGUgd2hlbiB1c2luZyBEYWxpIHdpdGggRWNsaXBzZUxpbmsuPC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT4gPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGUyMTg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrcy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRhc2tzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNi0wNFQxOTozMjo1OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSIgVGFza3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYyNSIgbmFtZT0ic3RocmVmMjUiPjwvYT48L3A+Ci08aDE+VGFza3M8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGRldGFpbGVkIHN0ZXAtYnktc3RlcCBwcm9jZWR1cmVzIGZvciBhY2Nlc3NpbmcgdGhlIERhbGkgT1IgbWFwcGluZyB0b29sIGZ1bmN0aW9uYWxpdHkuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDEuaHRtI0JFSUJBREhIIj5Db252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3Q8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCI+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDIzLmh0bSNCQUJGQUlCQSI+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyNi5odG0jQkFCREJDQkkiPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtI0NJSEhCSkNKIj5HZW5lcmF0aW5nIFNjaGVtYSBmcm9tIENsYXNzZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5odG0jQ0lIQ0JISkQiPkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWE8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjA0MzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNvbnZlcnRpbmcgYSBKYXZhIFByb2plY3QgdG8gYSBKUEEgUHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJFSUJBREhIIiBuYW1lPSJCRUlCQURISCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYzNSIgbmFtZT0ic3RocmVmMzUiPjwvYT48YSBpZD0ic3RocmVmMzYiIG5hbWU9InN0aHJlZjM2Ij48L2E+PGEgaWQ9InN0aHJlZjM3IiBuYW1lPSJzdGhyZWYzNyI+PC9hPlVzZSB0aGlzIHByb2NlZHVyZSB0byBjb252ZXJ0IGFuIGV4aXN0aW5nIEphdmEgcHJvamVjdCB0byBhIEpQQSBwcm9qZWN0LjwvcD4KLTxvbD4KLTxsaT4KLTxwPkZyb20gdGhlIE5hdmlnYXRvciBvciBQcm9qZWN0IGV4cGxvcmVyLCByaWdodC1jbGljayB0aGUgSmF2YSBwcm9qZWN0IGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+Q29uZmlndXJlICZndDsgQ29udmVydCB0byBKUEEgUHJvamVjdC48L3NwYW4+IFRoZSBQcm9qZWN0IEZhY2V0cyBwYWdlIG9mIHRoZSBNb2RpZnkgRmFjZXRlZCBQcm9qZWN0IHdpemFyZCBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjM4IiBuYW1lPSJzdGhyZWYzOCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPk1vZGlmeSBGYWNldGVkIFByb2plY3QgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvbW9kaWZ5X2ZhY2V0ZWRfcHJvamVjdC5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q2hhbmdlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+Q29uZmlndXJhdGlvbjwvc3Bhbj4gdG8gPHNwYW4gY2xhc3M9ImJvbGQiPkRlZmF1bHQgSlBBIENvbmZpZ3VyYXRpb248L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIDxhIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIj5KUEEgRmFjZXQgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzOSIgbmFtZT0ic3RocmVmMzkiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5KUEEgRmFjZXQgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvbmV3X2pwYV9mYWNldF90YXNrLnBuZyIgYWx0PSIiIHRpdGxlPSIiIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSB0aGUgZmllbGRzIG9uIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IHRvIHNwZWNpZnkgeW91ciB2ZW5kZXItc3BlY2lmaWMgcGxhdGZvcm0sIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5LCBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbi48L3A+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TWFuYWdlIGxpYnJhcmllczwvc3Bhbj4gdG8gY3JlYXRlIG9yIHVwZGF0ZSB5b3VyIEpQQSB1c2VyIGxpYnJhcmllcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gb2J0YWluIGFkZGl0aW9uYWwgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcmllcy48L3A+Ci08cD5JZiBEYWxpIGRlcml2ZXMgdGhlIGluY29ycmVjdCBzY2hlbWEsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgdGhlIERlZmF1bHQgU2NoZW1hIGZvciBDb25uZWN0aW9uPC9zcGFuPi4gVXNpbmcgdGhpcyBvcHRpb24sIHlvdSBjYW4gc2VsZWN0IGEgZGV2ZWxvcG1lbnQgdGltZSBzY2hlbWEgZm9yIGRlZmF1bHRzIGFuZCB2YWxpZGF0aW9uLjwvcD4KLTxwPklmIHlvdSBjbGVhciB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBvcm0ueG1sPC9zcGFuPiBvcHRpb24gKHdoaWNoIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQpLCB5b3UgY2FuIGxhdGVyIGFkZCBhIG1hcHBpbmcgZmlsZSB0byB0aGUgcHJvamVjdCB1c2luZyB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+VGhlIERhbGkgT1IgTWFwcGluZyBUb29sIGFkZHMgdGhlIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJpZXMgdG8geW91ciBwcm9qZWN0IGFuZCBjcmVhdGVzIHRoZSBuZWNlc3NhcnkgPGNvZGU+b3JtLnhtbDwvY29kZT4gYW5kIDxjb2RlPnBlcmlzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGVzLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPjxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmY5YmIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlN5bmNocm9uaXppbmcgY2xhc3NlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTeW5jaHJvbml6aW5nIGNsYXNzZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhGRUJBSSIgbmFtZT0iQ0lIRkVCQUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlN5bmNocm9uaXppbmcgY2xhc3NlczwvaDE+Ci08cD5BcyB5b3Ugd29yayB3aXRoIHRoZSBjbGFzc2VzIGluIHlvdXIgSmF2YSBwcm9qZWN0LCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIHRvIHJlZmxlY3QgdGhlIGNoYW5nZXMuIDxhIGlkPSJzdGhyZWY1MiIgbmFtZT0ic3RocmVmNTIiPjwvYT48YSBpZD0ic3RocmVmNTMiIG5hbWU9InN0aHJlZjUzIj48L2E+PGEgaWQ9InN0aHJlZjU0IiBuYW1lPSJzdGhyZWY1NCI+PC9hPjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBzeW5jaHJvbml6ZSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlOjwvcD4KLTxvbD4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SlBBIFRvb2xzICZndDsgU3luY2hyb25pemUgQ2xhc3MgTGlzdDwvc3Bhbj4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1Vc2UgdGhpcyBmdW5jdGlvbiBpZiB5b3Ugc2VsZWN0ZWQgPHNwYW4gY2xhc3M9ImJvbGQiPkFubm90YXRlZCBjbGFzc2VzIG11c3QgYmUgbGlzdGVkIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwgb3B0aW9uPC9zcGFuPiBpbiB0aGUgPGEgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jQ0FDSUZESUYiPkpQQSBGYWNldCBwYWdlPC9hPi4gSW4gZ2VuZXJhbCwgeW91IGRvIG5vdCBoYXZlIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIHdpdGhpbiB0aGUgY29udGFpbmVyLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNTUiIG5hbWU9InN0aHJlZjU1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U3luY2hyb25pemluZyB0aGUgcGVyc2lzdGVuY2UueG1sIEZpbGU8L3A+Ci08aW1nIHNyYz0iaW1nL3N5bmNob3JuaXplX2NsYXNzZXMucG5nIiBhbHQ9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBKUEEgVG9vbHMgJmd0OyBTeW5jaHJvbml6ZSBDbGFzc2VzIG9wdGlvbi4iIHRpdGxlPSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgSlBBIFRvb2xzICZndDsgU3luY2hyb25pemUgQ2xhc3NlcyBvcHRpb24uIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPkRhbGkgYWRkcyB0aGUgbmVjZXNzYXJ5IDxjb2RlPiZsdDtjbGFzcyZndDs8L2NvZGU+IGVsZW1lbnRzIHRvIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlBlcnNpc3RlbmNlIFhNTCBFZGl0b3I8L3NwYW4+IHRvIGNvbnRpbnVlIGVkaXRpbmcgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L2xpPgotPC9vbD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIj5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE4ZjE0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5VcGdyYWRpbmcgZG9jdW1lbnQgdmVyc2lvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVcGdyYWRpbmcgZG9jdW1lbnQgdmVyc2lvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmNTYiIG5hbWU9InN0aHJlZjU2Ij48L2E+Ci08aDE+VXBncmFkaW5nIGRvY3VtZW50IHZlcnNpb248L2gxPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIG1pZ3JhdGUgeW91ciBwcm9qZWN0IGZyb20gSlBBIDEuMCB0byBKUEEgMi4wLiBZb3UgbXVzdCBjb21wbGV0ZSB0aGlzIHVwZ3JhZGUgdG8gdXNlIHRoZSBjdXJyZW50IEpQQSAyLjAgZmVhdHVyZXMgaW4gRGFsaS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY1NyIgbmFtZT0ic3RocmVmNTciPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5VcGdyYWRpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBGaWxlPC9wPgotPGltZyBzcmM9ImltZy91cGdyYWRlX3BlcnNpc3RlbmNlX2pwYV92ZXJzaW9uLnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgSlBBIFRvb2xzICZndDsgU3luY2hyb25pemUgQ2xhc3NlcyBvcHRpb24uIiB0aXRsZT0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIEpQQSBUb29scyAmZ3Q7IFN5bmNocm9uaXplIENsYXNzZXMgb3B0aW9uLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDQxYWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYW4gb3JtLnhtbCBmaWxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGFuIG9ybS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmNjAiIG5hbWU9InN0aHJlZjYwIj48L2E+Ci08aDE+Q3JlYXRpbmcgYW4gb3JtLnhtbCBmaWxlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY2MSIgbmFtZT0ic3RocmVmNjEiPjwvYT5JZiB5b3Ugb3B0IG5vdCB0byBjcmVhdGUgYW4gPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB3aGVuIHlvdSBjcmVhdGUgYSBKUEEgcHJvamVjdCwgeW91IGNhbiBjcmVhdGUgb25lIHVzaW5nIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDIuaHRtI0NJQUlKQ0NFIj5NYXBwaW5nIEZpbGUgV2l6YXJkPC9hPi48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gY3JlYXRlIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGU6PC9wPgotPG9sPgotPGxpPgotPHA+RnJvbSB0aGUgTmF2aWdhdG9yIG9yIFByb2plY3QgRXhwbG9yZXIsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zcGFuPi4gVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY2MiIgbmFtZT0ic3RocmVmNjIiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgU2VsZWN0IGEgV2l6YXJkIERpYWxvZzwvcD4KLTxpbWcgc3JjPSJpbWcvc2VsZWN0X2Ffd2l6YXJkX21hcHBpbmcucG5nIiBhbHQ9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggTWFwcGluZyBmaWxlIHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggTWFwcGluZyBmaWxlIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwcGluZyBGaWxlPC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSBNYXBwaW5nIEZpbGUgcGFnZSBhcHBlYXJzLjwvcD4KLTxwPklmIHlvdSBhcmUgdXNpbmcgRWNsaXBzZUxpbmssIHlvdSBjYW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5FY2xpcHNlTGluayAmZ3Q7IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZTwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNjMiIG5hbWU9InN0aHJlZjYzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIE1hcHBpbmcgRmlsZSBQYWdlPC9wPgotPGltZyBzcmM9ImltZy9tYXBwaW5nX2ZpbGVfbmV3LnBuZyIgYWx0PSJUaGUgTWFwcGluZyBGaWxlIHBhZ2UuIiB0aXRsZT0iVGhlIE1hcHBpbmcgRmlsZSBwYWdlLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkRlZmluZSB0aGUgcHJvcGVydGllcyBpbiB0aGUgcGFnZSBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uIFRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIGFwcGVhcnMgaW4gdGhlIHNyYyBkaXJlY3Rvcnkgb2YgdGhlIHNlbGVjdGVkIEpQQSBwcm9qZWN0LiBZb3UgY2FuIG1hbmFnZSB0aGUgb3JtLnhtbCBmaWxlIHVzaW5nIHRoZSBKUEEgRGV0YWlscyB2aWV3IG9yIHRocm91Z2ggdGhlIFhNTCBFZGl0b3IuIFNlZSBhbHNvIDxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY5NjA4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Xb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ildvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhCQ0RDRSIgbmFtZT0iQ0lIQkNEQ0UiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPldvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGU8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjY0IiBuYW1lPSJzdGhyZWY2NCI+PC9hPjxhIGlkPSJzdGhyZWY2NSIgbmFtZT0ic3RocmVmNjUiPjwvYT5Zb3UgY2FuIHdvcmsgd2l0aCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gYnkgdXNpbmcgdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIHdvcmsgd2l0aCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5PcGVuPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldywgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHlNYXBwaW5nczwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgSlBBIERldGFpbHMgdmlldyB0byBjb25maWd1cmUgdGhlIGVudGl0eSBtYXBwaW5nIGFuZCBwZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjY2IiBuYW1lPSJzdGhyZWY2NiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkpQQSBEZXRhaWxzIHZpZXcgZm9yIEVudGl0eU1hcHBpbmdzIChvcm0ueG1sKTwvcD4KLTxpbWcgc3JjPSJpbWcvZGV0YWlsc19lbnRpdHltYXBwaW5ncy5wbmciIGFsdD0iSlBBIERldGFpbHMgdmlldyBmb3Igb3JtLnhtbCBmaWxlLiIgdGl0bGU9IkpQQSBEZXRhaWxzIHZpZXcgZm9yIG9ybS54bWwgZmlsZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08L29sPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjxiciAvPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iI0NJSEJDRENFIj5Xb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYTUwuaHRtbCI+V29ya2luZyB3aXRoIFhNTCBGaWxlczwvYT48YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNDSERCSUpBQyI+VGhlIG9ybS54bWwgZmlsZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA2Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhMGQ3MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FbnRpdHk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW50aXR5IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCR0JJRUUiIG5hbWU9IkJBQkdCSUVFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbnRpdHk8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjcwIiBuYW1lPSJzdGhyZWY3MCI+PC9hPjxhIGlkPSJzdGhyZWY3MSIgbmFtZT0ic3RocmVmNzEiPjwvYT48YSBpZD0ic3RocmVmNzIiIG5hbWU9InN0aHJlZjcyIj48L2E+PGEgaWQ9InN0aHJlZjczIiBuYW1lPSJzdGhyZWY3MyI+PC9hPkFuIDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHk8L3NwYW4+IGlzIGEgcGVyc2lzdGVudCBkb21haW4gb2JqZWN0LjwvcD4KLTxwPkFuIGVudGl0eSA8c3BhbiBjbGFzcz0iaXRhbGljIj5jYW4gYmU8L3NwYW4+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPkFic3RyYWN0IG9yIGNvbmNyZXRlIGNsYXNzZXMuIEVudGl0aWVzIG1heSBhbHNvIGV4dGVuZCBub24tZW50aXR5IGNsYXNzZXMgYXMgd2VsbCBhcyBlbnRpdHkgY2xhc3NlcywgYW5kIG5vbi1lbnRpdHkgY2xhc3NlcyBtYXkgZXh0ZW5kIGVudGl0eSBjbGFzc2VzLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QW4gZW50aXR5IDxzcGFuIGNsYXNzPSJpdGFsaWMiPm11c3QgaGF2ZTwvc3Bhbj46PC9wPgotPHVsPgotPGxpPgotPHA+QSBuby1hcmcgY29uc3RydWN0b3IgKHB1YmxpYyBvciBwcm90ZWN0ZWQpOyB0aGUgZW50aXR5IGNsYXNzIG1heSBoYXZlIG90aGVyIGNvbnN0cnVjdG9ycyBhcyB3ZWxsLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+PGEgaWQ9InN0aHJlZjc0IiBuYW1lPSJzdGhyZWY3NCI+PC9hPjxhIGlkPSJzdGhyZWY3NSIgbmFtZT0ic3RocmVmNzUiPjwvYT48YSBpZD0ic3RocmVmNzYiIG5hbWU9InN0aHJlZjc2Ij48L2E+RWFjaCBwZXJzaXN0ZW50IGVudGl0eSBtdXN0IGJlIG1hcHBlZCB0byBhIGRhdGFiYXNlIHRhYmxlIGFuZCBjb250YWluIGEgcHJpbWFyeSBrZXkuIFBlcnNpc3RlbnQgZW50aXRpZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIDxjb2RlPkBFbnRpdHk8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGFkZCBwZXJzaXN0ZW5jZSB0byBhbiBleGlzdGluZyBlbnRpdHk6PC9wPgotPG9sPgotPGxpPgotPHA+T3BlbiB0aGUgSmF2YSBjbGFzcyBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXIuPC9zcGFuPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGNsYXNzIGluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBjbGljayB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluayB0byBhY2Nlc3MgdGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nLiBJbiB0aGUgZm9sbG93aW5nIGZpZ3VyZSwgY2xpY2tpbmcgPHNwYW4gY2xhc3M9Iml0YWxpYyI+ZW50aXR5PC9zcGFuPiBpbnZva2VzIHRoZSBkaWFsb2cgZnJvbSB0aGUgSlBBIERldGFpbHMgVmlldy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY3NyIgbmFtZT0ic3RocmVmNzciPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgTWFwcGluZyBUeXBlIEh5cGVybGluazwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nIiBhbHQ9IlRoZSBKUEEgRGV0YWlscyB2aWV3IGZvciBhbiBlbnRpdHkgc2hvd2luZyB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluay4iIHRpdGxlPSJUaGUgSlBBIERldGFpbHMgdmlldyBmb3IgYW4gZW50aXR5IHNob3dpbmcgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLVlvdSBjYW4gYWxzbyBjaGFuZ2UgKG9yIGFkZCkgcGVyc2lzdGVuY2UgZm9yIGFuIGVudGl0eSBieSByaWdodC1jbGlja2luZyB0aGUgY2xhc3MgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgVmlldyBhbmQgdGhlbiBjbGlja2luZyA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgRW50aXR5PC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHk8L3NwYW4+IGZyb20gdGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5PSzwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNzgiIG5hbWU9InN0aHJlZjc4Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gRGlhbG9nPC9wPgotPGltZyBzcmM9ImltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX2VudGl0eS5wbmciIGFsdD0iVGhlIE1hcHBpbmcgVHlwZSBzZWxlY3Rpb24gZGlhbG9nIHdpdGggRW5pdHkgc2VsZWN0ZWQuIiB0aXRsZT0iVGhlIE1hcHBpbmcgVHlwZSBzZWxlY3Rpb24gZGlhbG9nIHdpdGggRW5pdHkgc2VsZWN0ZWQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIHJlbWFpbmluZyA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDRhMTY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVtYmVkZGFibGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW1iZWRkYWJsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZFSUNFIiBuYW1lPSJCQUJGRUlDRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW1iZWRkYWJsZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmNzkiIG5hbWU9InN0aHJlZjc5Ij48L2E+PGEgaWQ9InN0aHJlZjgwIiBuYW1lPSJzdGhyZWY4MCI+PC9hPkFuIDxzcGFuIGNsYXNzPSJib2xkIj5FbWJlZGRlZDwvc3Bhbj4gY2xhc3MgaXMgYSBjbGFzcyB3aG9zZSBpbnN0YW5jZXMgYXJlIHN0b3JlZCBhcyBwYXJ0IG9mIGFuIG93bmluZyBlbnRpdHk7IGl0IHNoYXJlcyB0aGUgaWRlbnRpdHkgb2YgdGhlIG93bmluZyBlbnRpdHkuIEVhY2ggZmllbGQgb2YgdGhlIGVtYmVkZGVkIGNsYXNzIGlzIG1hcHBlZCB0byB0aGUgZGF0YWJhc2UgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvd25pbmcgZW50aXR5LjwvcD4KLTxwPlRvIG92ZXJyaWRlIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHN1YmNsYXNzLCB1c2UgdGhlIDxjb2RlPkBBdHRyaWJ1dGVPdmVycmlkZTwvY29kZT4gYW5ub3RhdGlvbiBmb3IgdGhhdCBzcGVjaWZpYyBjbGFzcy48L3A+Ci08cD48YSBpZD0ic3RocmVmODEiIG5hbWU9InN0aHJlZjgxIj48L2E+PGEgaWQ9InN0aHJlZjgyIiBuYW1lPSJzdGhyZWY4MiI+PC9hPjxhIGlkPSJzdGhyZWY4MyIgbmFtZT0ic3RocmVmODMiPjwvYT5BbiBlbWJlZGRhYmxlIGVudGl0eSBpcyBpZGVudGlmaWVkIGJ5IHRoZSA8Y29kZT5ARW1iZWRkYWJsZTwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gYWRkIGVtYmVkZGFibGUgcGVyc2lzdGVuY2UgdG8gYW4gZXhpc3RpbmcgZW50aXR5OjwvcD4KLTxvbD4KLTxsaT4KLTxwPk9wZW4gdGhlIEphdmEgY2xhc3MgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IHRoZSBjbGFzcyBpbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluayB0byBvcGVuIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5FbWJlZGRhYmxlPC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+T0s8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjg0IiBuYW1lPSJzdGhyZWY4NCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPk1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gRGlhbG9nIChFbWJlZGRhYmxlKTwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmciIGFsdD0iVGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nIHdpdGggRW1iZWRkYWJsZSBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cgd2l0aCBFbWJlZGRhYmxlIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSByZW1haW5pbmcgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGRsPgotPGRkPjxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+PC9kZD4KLTxkZD48YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjwvZGQ+Ci08ZGQ+PGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjwvZGQ+Ci08L2RsPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA4Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNTA1NGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFwcGVkIHN1cGVyY2xhc3M8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFwcGVkIHN1cGVyY2xhc3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJEQUdDSSIgbmFtZT0iQkFCREFHQ0kiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1hcHBlZCBzdXBlcmNsYXNzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY4NSIgbmFtZT0ic3RocmVmODUiPjwvYT48YSBpZD0ic3RocmVmODYiIG5hbWU9InN0aHJlZjg2Ij48L2E+QW4gZW50aXR5IHRoYXQgZXh0ZW5kcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwZWQgU3VwZXJjbGFzczwvc3Bhbj4gY2xhc3MgaW5oZXJpdHMgdGhlIHBlcnNpc3RlbnQgc3RhdGUgYW5kIG1hcHBpbmcgaW5mb3JtYXRpb24gZnJvbSBhIHN1cGVyY2xhc3MuIFlvdSBzaG91bGQgdXNlIGEgbWFwcGVkIHN1cGVyY2xhc3MgdG8gZGVmaW5lIG1hcHBpbmcgaW5mb3JtYXRpb24gdGhhdCBpcyBjb21tb24gdG8gbXVsdGlwbGUgZW50aXR5IGNsYXNzZXMuPC9wPgotPHA+QSBtYXBwZWQgc3VwZXJjbGFzcyA8c3BhbiBjbGFzcz0iaXRhbGljIj5jYW4gYmU8L3NwYW4+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPkFic3RyYWN0IG9yIGNvbmNyZXRlIGNsYXNzZXM8L3A+Ci08L2xpPgotPC91bD4KLTxwPkEgbWFwcGVkIHN1cGVyY2xhc3MgPHNwYW4gY2xhc3M9Iml0YWxpYyI+Y2Fubm90IGJlPC9zcGFuPjo8L3A+Ci08dWw+Ci08bGk+Ci08cD5CZSBxdWVyaWVkIG9yIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBFbnRpdHktTWFuYWdlciBvciBRdWVyeSBvcGVyYXRpb25zPC9wPgotPC9saT4KLTxsaT4KLTxwPkJlIHRoZSB0YXJnZXQgb2YgYSBwZXJzaXN0ZW50IHJlbGF0aW9uc2hpcDwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QSBtYXBwZWQgc3VwZXJjbGFzcyBkb2VzIG5vdCBoYXZlIGEgZGVmaW5lZCBkYXRhYmFzZSB0YWJsZS4gSW5zdGVhZCwgaXRzIG1hcHBpbmcgaW5mb3JtYXRpb24gaXMgZGVyaXZlZCBmcm9tIGl0cyBzdXBlcmNsYXNzLiBUbyBvdmVycmlkZSB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBzdWJjbGFzcywgdXNlIHRoZSA8Y29kZT5AQXR0cmlidXRlT3ZlcnJpZGU8L2NvZGU+IGFubm90YXRpb24gZm9yIHRoYXQgc3BlY2lmaWMgY2xhc3MuPC9wPgotPHA+PGEgaWQ9InN0aHJlZjg3IiBuYW1lPSJzdGhyZWY4NyI+PC9hPjxhIGlkPSJzdGhyZWY4OCIgbmFtZT0ic3RocmVmODgiPjwvYT48YSBpZD0ic3RocmVmODkiIG5hbWU9InN0aHJlZjg5Ij48L2E+PGEgaWQ9InN0aHJlZjkwIiBuYW1lPSJzdGhyZWY5MCI+PC9hPkEgbWFwcGVkIHN1cGVyY2xhc3MgaXMgaWRlbnRpZmllZCBieSB0aGUgPGNvZGU+QE1hcHBlZFN1cGVyY2xhc3M8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGFkZCBNYXBwZWQgU3VwZXJjbGFzcyBwZXJzaXN0ZW5jZSB0byBhbiBleGlzdGluZyBlbnRpdHk6PC9wPgotPG9sPgotPGxpPgotPHA+T3BlbiB0aGUgSmF2YSBjbGFzcyBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGNsYXNzIGluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBjbGljayB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluayB0byBvcGVuIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwZWQgU3VwZXJjbGFzczwvc3Bhbj4gYW5kIHRoZW4gPHNwYW4gY2xhc3M9ImJvbGQiPk9LPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY5MSIgbmFtZT0ic3RocmVmOTEiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5NYXBwaW5nIFR5cGUgU2VsZWN0aW9uIERpYWxvZyAoTWFwcGVkIFN1cGVyY2xhc3MpPC9wPgotPGltZyBzcmM9ImltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nIiBhbHQ9IlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyB3aXRoIE1hcHBlZCBTdXBlcmNsYXNzIHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyB3aXRoIE1hcHBlZCBTdXBlcmNsYXNzIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSByZW1haW5pbmcgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlODY5Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGluZyBOYW1lZCBRdWVyaWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJJR0JHRyIgbmFtZT0iQkFCSUdCR0ciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjEwNyIgbmFtZT0ic3RocmVmMTA3Ij48L2E+PGEgaWQ9InN0aHJlZjEwOCIgbmFtZT0ic3RocmVmMTA4Ij48L2E+TmFtZWQgcXVlcmllcyBpbXByb3ZlIGFwcGxpY2F0aW9uIHBlcmZvcm1hbmNlIGJlY2F1c2UgdGhleSBhcmUgcHJlcGFyZWQgb25jZSBhbmQgdGhleSAoYW5kIGFsbCBvZiB0aGVpciBhc3NvY2lhdGVkIHN1cHBvcnRpbmcgb2JqZWN0cykgY2FuIGJlIGVmZmljaWVudGx5IHJldXNlZCB0aGVyZWFmdGVyLCBtYWtpbmcgdGhlbSB3ZWxsIHN1aXRlZCBmb3IgY29tcGxleCBhbmQgZnJlcXVlbnRseSBleGVjdXRlZCBvcGVyYXRpb25zLiBOYW1lZCBxdWVyaWVzIHVzZSB0aGUgSlBBIHF1ZXJ5IGxhbmd1YWdlIGZvciBwb3J0YWJsZSBleGVjdXRpb24gb24gYW55IHVuZGVybHlpbmcgZGF0YWJhc2U7IG5hbWVkIG5hdGl2ZSBxdWVyaWVzIHVzZSB0aGUgU1FMIGxhbmd1YWdlIG5hdGl2ZSB0byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZS48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gYWRkIDxjb2RlPkBOYW1lZFF1ZXJ5PC9jb2RlPiBhbmQgPGNvZGU+QE5hbWVkTmF0aXZlUXVlcnk8L2NvZGU+IGFubm90YXRpb25zIHRvIHRoZSBlbnRpdHkuPC9wPgotPHA+VG8gY3JlYXRlIGEgbmFtZWQgcXVlcnk6PC9wPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IHRoZSBlbnRpdHkgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBleHBhbmQgUXVlcmllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gZm9yIGEgbmFtZWQgcXVlcnksIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgTmF0aXZlPC9zcGFuPiBmb3IgYSBuYXRpdmUgcXVlcnkuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBkaWFsb2cgdGhhdCBhcHBlYXJzLCBlbnRlciB0aGUgbmFtZSBvZiB0aGUgcXVlcnkgaW4gdGhlIE5hbWUgZmllbGQgYW5kIHRoZW4gY2xpY2sgT0suPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBxdWVyeSBpbiB0aGUgUXVlcnkgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGlkPSJzdGhyZWYxMDkiIG5hbWU9InN0aHJlZjEwOSI+PC9hPjxhIGlkPSJzdGhyZWYxMTAiIG5hbWU9InN0aHJlZjExMCI+PC9hPjxhIGlkPSJzdGhyZWYxMTEiIG5hbWU9InN0aHJlZjExMSI+PC9hPjxhIGlkPSJzdGhyZWYxMTIiIG5hbWU9InN0aHJlZjExMiI+PC9hPlRvIGFkZCBhIFF1ZXJ5IGhpbnQsIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjExMyIgbmFtZT0ic3RocmVmMTEzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+RW50ZXJpbmcgYSBOYW1lZCBRdWVyeTwvcD4KLTxpbWcgc3JjPSJpbWcvdGFza19lbnRlcmluZ19xdWVyeS5wbmciIGFsdD0iVGhlIFF1ZXJpZXMgc2VjdGlvbiBvZiB0aGUgSlBBIERldGFpbHMgdmlldy4iIHRpdGxlPSJUaGUgUXVlcmllcyBzZWN0aW9uIG9mIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwMjJkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QmFzaWMgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJCYXNpYyBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQkFCQ0UiIG5hbWU9IkJBQkJBQkNFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5CYXNpYyBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMTQiIG5hbWU9InN0aHJlZjExNCI+PC9hPjxhIGlkPSJzdGhyZWYxMTUiIG5hbWU9InN0aHJlZjExNSI+PC9hPjxhIGlkPSJzdGhyZWYxMTYiIG5hbWU9InN0aHJlZjExNiI+PC9hPjxhIGlkPSJzdGhyZWYxMTciIG5hbWU9InN0aHJlZjExNyI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5CYXNpYyBNYXBwaW5nPC9zcGFuPiB0byBtYXAgYW4gYXR0cmlidXRlIGRpcmVjdGx5IHRvIGEgZGF0YWJhc2UgY29sdW1uLiBCYXNpYyBtYXBwaW5ncyBtYXkgYmUgdXNlZCBvbmx5IHdpdGggdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGUgdHlwZXM6PC9wPgotPHVsPgotPGxpPgotPHA+SmF2YSBwcmltaXRpdmUgdHlwZXMgYW5kIHdyYXBwZXJzIG9mIHRoZSBwcmltaXRpdmUgdHlwZXM8L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS5sYW5nLlN0cmluZywgamF2YS5tYXRoLkJpZ0ludGVnZXI8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmphdmEubWF0aC5CaWdEZWNpbWFsPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLnV0aWwuRGF0ZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS51dGlsLkNhbGVuZGFyLCBqYXZhLnNxbC5EYXRlPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLnNxbC5UaW1lPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLnNxbC5UaW1lc3RhbXA8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmJ5dGVbXTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+Qnl0ZVtdPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5jaGFyW108L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPkNoYXJhY3RlcltdPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5lbnVtczwvcD4KLTwvbGk+Ci08bGk+Ci08cD5hbnkgb3RoZXIgdHlwZSB0aGF0IGltcGxlbWVudHMgPGNvZGU+U2VyaWFsaXphYmxlPC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VG8gY3JlYXRlIGEgYmFzaWMgbWFwcGluZzo8L3A+Ci08b2w+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCByaWdodC1jbGljayB0aGUgZmllbGQgdG8gbWFwLiBTZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IEJhc2ljPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZCBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIHJlbWFpbmluZyBmaWVsZHMgb24gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMTklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjQxJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTQiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5FbnRpdHkgTWFwIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzItdDE0Ij5EZWZpbmVzIHRoaXMgbWFwcGluZyBhcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5CYXNpYyBNYXBwaW5nPC9zcGFuPi4KLTxwPlRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBCYXNpYzwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNCByMWMzLXQxNCI+QmFzaWM8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5Db2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMyLXQxNCI+VGhlIGRhdGFiYXNlIGNvbHVtbiBtYXBwZWQgdG8gdGhlIGVudGl0eSBhdHRyaWJ1dGUuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHQ0JIQiI+IkNvbHVtbiI8L2E+IGZvciBkZXRhaWxzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE0IHIxYzMtdDE0Ij5CeSBkZWZhdWx0LCB0aGUgQ29sdW1uIGlzIGFzc3VtZWQgdG8gYmUgbmFtZWQgaWRlbnRpY2FsbHkgdG8gdGhlIGF0dHJpYnV0ZSBhbmQgYWx3YXlzIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5JTlNFUlQ8L2NvZGU+IGFuZCA8Y29kZT5VUERBVEU8L2NvZGU+IHN0YXRlbWVudHMuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+VGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNCByMWMyLXQxNCI+TmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTQgcjFjMy10MTQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPkZldGNoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTQgcjFjMi10MTQiPkRlZmluZXMgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0dHSEIiPiJGZXRjaCBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5FYWdlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5MYXp5PC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNCByMWMzLXQxNCI+RWFnZXI8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5PcHRpb25hbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE0IHIxYzItdDE0Ij5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNCByMWMzLXQxNCI+WWVzPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+VHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE0IHIxYzItdDE0Ij5TcGVjaWZpZXMgdGhlIHR5cGUgb2YgZGF0YToKLTx1bD4KLTxsaT4KLTxwPkRlZmF1bHQ8L3A+Ci08L2xpPgotPGxpPgotPHA+TE9CICZuZGFzaDsgU3BlY2lmaWVzIGlmIHRoaXMgaXMgYSBsYXJnZSBvYmplY3RzIChCTE9CIG9yIENMT0IpLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkJJQkkiPiJMb2IiPC9hPiBmb3IgZGV0YWlscy48L3A+Ci08L2xpPgotPGxpPgotPHA+VGVtcG9yYWwgJm5kYXNoOyBTcGVjaWZ5IGlmIHRoaXMgaXMgYSBEYXRlLCBUaW1lLCBvciBUaW1lc3RhbXAgb2JqZWN0LiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDRUFKR0QiPiJUZW1wb3JhbCI8L2E+IGZvciBkZXRhaWxzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnVtZXJhdGVkICZuZGFzaDsgU3BlY2lmeSBob3cgdG8gcGVyc2lzdCBlbnVtZXJhdGVkIGNvbnN0cmFpbnRzIGFzIG9yZGluYWwgb3Igc3RyaW5nLCBpbiBvcmRlciB0byBtYXRjaCBhbiBleGlzdGluZyBkYXRhYmFzZSBzY2hlbWEuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNCByMWMzLXQxNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1AQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiwgdGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fVEFCTEUmZ3Q7PC9zcGFuPiIsIAotICAgIGluc2VydGFibGU9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOU0VSVEFCTEUmZ3Q7PC9zcGFuPiwgdXBkYXRhYmxlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtVUERBVEFCTEUmZ3Q7PC9zcGFuPikKLUBCYXNpYyhmZXRjaD1GZXRjaFR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0ZFVENIX1RZUEUmZ3Q7PC9zcGFuPiwgb3B0aW9uYWwgPSA8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7T1BUSU9OQUwmZ3Q7PC9zcGFuPikKLUBUZW1wb3JhbChUZW1wb3JhbFR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RFTVBPUkFMJmd0Ozwvc3Bhbj4pCi0KLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDExLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzRkNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDExLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RW1iZWRkZWQgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbWJlZGRlZCBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQ0JIREYiIG5hbWU9IkJBQkNCSERGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbWJlZGRlZCBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMTgiIG5hbWU9InN0aHJlZjExOCI+PC9hPjxhIGlkPSJzdGhyZWYxMTkiIG5hbWU9InN0aHJlZjExOSI+PC9hPjxhIGlkPSJzdGhyZWYxMjAiIG5hbWU9InN0aHJlZjEyMCI+PC9hPjxhIGlkPSJzdGhyZWYxMjEiIG5hbWU9InN0aHJlZjEyMSI+PC9hPlVzZSBhbiA8c3BhbiBjbGFzcz0iYm9sZCI+RW1iZWRkZWQgTWFwcGluZzwvc3Bhbj4gdG8gc3BlY2lmeSBhIHBlcnNpc3RlbnQgZmllbGQgb3IgcHJvcGVydHkgb2YgYW4gZW50aXR5IHdob3NlIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mIGFuIGVtYmVkZGFibGUgY2xhc3MuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgcmlnaHQtY2xpY2sgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgYXMgJmd0OyBFbWJlZGRlZDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+RW50aXR5IE1hcHBpbmcgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTUgcjFjMi10MTUiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkPC9zcGFuPi4KLTxwPlRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBFbWJlZGRlZDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNSByMWMzLXQxNSI+RW1iZWRkZWQ8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTUgcjFjMi10MTUiPlNwZWNpZnkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbWFwcGluZyBvZiBhbiBlbnRpdHkncyBhdHRyaWJ1dGUuIFNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTUgcjFjMy10MTUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEVtYmVkZGVkCi1AQXR0cmlidXRlT3ZlcnJpZGUoY29sdW1uPUBDb2x1bW4odGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fVEFCTEUmZ3Q7PC9zcGFuPiIsIG5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iKSkKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNWZiNjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RW1iZWRkZWQgSUQgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbWJlZGRlZCBJRCBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIRElBRUUiIG5hbWU9IkNJSERJQUVFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbWJlZGRlZCBJRCBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMjIiIG5hbWU9InN0aHJlZjEyMiI+PC9hPjxhIGlkPSJzdGhyZWYxMjMiIG5hbWU9InN0aHJlZjEyMyI+PC9hPjxhIGlkPSJzdGhyZWYxMjQiIG5hbWU9InN0aHJlZjEyNCI+PC9hPjxhIGlkPSJzdGhyZWYxMjUiIG5hbWU9InN0aHJlZjEyNSI+PC9hPlVzZSBhbiA8c3BhbiBjbGFzcz0iYm9sZCI+RW1iZWRkZWQgSUQgTWFwcGluZzwvc3Bhbj4gdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgb2YgYW4gZW1iZWRkZWQgSUQuIFRoZXNlIG1hcHBpbmdzIG1heSBiZSB1c2VkIHdpdGggYSA8YSBocmVmPSJ0YXNrczAwNy5odG0jQkFCRkVJQ0UiPkVtYmVkZGFibGU8L2E+IGVudGl0aWVzLjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBFbWJlZGRlZCBJZDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTYiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+RW50aXR5IE1hcHBpbmcgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTYgcjFjMi10MTYiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkIElkPC9zcGFuPi4KLTxwPlRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBFbWJlZGRlZElkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE2IHIxYzMtdDE2Ij5FbWJlZGRlZCBJZDwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEVtYmVkZGVkSWQKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYWRmODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPklEIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSUQgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkdDQkhHIiBuYW1lPSJCQUJHQ0JIRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SUQgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTI2IiBuYW1lPSJzdGhyZWYxMjYiPjwvYT48YSBpZD0ic3RocmVmMTI3IiBuYW1lPSJzdGhyZWYxMjciPjwvYT48YSBpZD0ic3RocmVmMTI4IiBuYW1lPSJzdGhyZWYxMjgiPjwvYT48YSBpZD0ic3RocmVmMTI5IiBuYW1lPSJzdGhyZWYxMjkiPjwvYT5Vc2UgYW4gPHNwYW4gY2xhc3M9ImJvbGQiPklEIE1hcHBpbmc8L3NwYW4+IHRvIHNwZWNpZnkgdGhlIHByaW1hcnkga2V5IG9mIGFuIGVudGl0eS4gSUQgbWFwcGluZ3MgbWF5IGJlIHVzZWQgd2l0aCBhIDxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPiBvciA8YSBocmVmPSJ0YXNrczAwOC5odG0jQkFCREFHQ0kiPk1hcHBlZCBzdXBlcmNsYXNzPC9hPi4gRWFjaCA8YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT4gbXVzdCBoYXZlIGFuIElEIG1hcHBpbmcuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0IGNsaWNrIHRoZSBmaWxlZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBhcyAmZ3Q7IElEPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBmaWVsZHMgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjM1JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE3Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTciPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij5FbnRpdHkgTWFwcGluZyBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNyByMWMyLXQxNyI+RGVmaW5lcyB0aGlzIG1hcHBpbmcgYXMgYW4gPHNwYW4gY2xhc3M9ImJvbGQiPklEIE1hcHBpbmc8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QElkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE3IHIxYzMtdDE3Ij5JRDwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPkNvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE3IHIxYzItdDE3Ij5UaGUgZGF0YWJhc2UgY29sdW1uIG1hcHBlZCB0byB0aGUgZW50aXR5IGF0dHJpYnV0ZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dDQkhCIj4iQ29sdW1uIjwvYT4gZm9yIGRldGFpbHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTcgcjFjMy10MTciPkJ5IGRlZmF1bHQsIHRoZSBDb2x1bW4gaXMgYXNzdW1lZCB0byBiZSBuYW1lZCBpZGVudGljYWxseSB0byB0aGUgYXR0cmlidXRlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPlRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTcgcjFjMi10MTciPlRoZSBkYXRhYmFzZSB0YWJsZSBtYXBwZWQgdG8gdGhlIGVudGl0eSBhdHRyaWJ1dGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTcgcjFjMy10MTciPkJ5IGRlZmF1bHQsIHRoZSBUYWJsZSBpcyBhc3N1bWVkIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+VGVtcG9yYWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNyByMWMyLXQxNyI+U3BlY2lmaWVzIHRoZSB0eXBlIG9mIGRhdGEuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNFQUpHRCI+IlRlbXBvcmFsIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5EYXRlPC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWU8L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZXN0YW1wPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNyByMWMzLXQxNyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIGZpZWxkcyBpbiA8YSBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI0NBQ0ZDQ0FCIj5QcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uPC9hPiBhcmVhIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQSyBHZW5lcmF0aW9uIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUEsgR2VuZXJhdGlvbiB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjIyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTgiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE4IHIxYzItdDE4Ij5UaGVzZSBmaWVsZHMgZGVmaW5lIGhvdyB0aGUgcHJpbWFyeSBrZXkgaXMgZ2VuZXJhdGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE4IHIxYzMtdDE4Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij4mbmJzcDsmbmJzcDtTdHJhdGVneTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE4IHIxYzItdDE4Ij5TZWUgPGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNCQUpCQyI+IlByaW1hcnkgS2V5IEdlbmVyYXRpb24iPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkF1dG88L3A+Ci08L2xpPgotPGxpPgotPHA+U2VxdWVuY2U8L3A+Ci08L2xpPgotPGxpPgotPHA+SWRlbnRpdHk8L3A+Ci08L2xpPgotPGxpPgotPHA+VGFibGU8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE4IHIxYzMtdDE4Ij5BdXRvPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+Jm5ic3A7Jm5ic3A7R2VuZXJhdG9yJm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE4IHIxYzItdDE4Ij5OYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBnZW5lcmF0b3Igc3BlY2lmaWVkIGluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+U3RyYXRlZ3k8L3NwYW4+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTggcjFjMy10MTgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5BZGRpdGlvbmFsIGZpZWxkcyB3aWxsIGFwcGVhciBpbiB0aGUgPGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNGQ0NBQiI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvYT4gYXJlYSwgZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBTdHJhdGVneS4gU2VlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPiJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPC9hPiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQElkCi1AQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiwgdGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iLCBpbnNlcnRhYmxlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtJTlNFUlRBQkxFJmd0Ozwvc3Bhbj4sCi0gICAgdXBkYXRhYmxlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtVUERBVEFCTEUmZ3Q7PC9zcGFuPikKLUBUZW1wb3JhbCg8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEVNUE9SQUwmZ3Q7PC9zcGFuPikKLUBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneT1HZW5lcmF0b3JUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtTVFJBVEVHWSZndDs8L3NwYW4+LCBnZW5lcmF0b3I9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtHRU5FUkFUT1JfTkFNRSZndDs8L3NwYW4+IilAVGFibGVHZW5lcmF0b3IobmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFX0dFTkVSQVRPUl9OQU1FJmd0Ozwvc3Bhbj4iLCB0YWJsZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEVfR0VORVJBVE9SX1RBQkxFJmd0Ozwvc3Bhbj4iLCAKLSAgICBwa0NvbHVtbk5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFX0dFTkVSQVRPUl9QSyZndDs8L3NwYW4+IiwgCi0gICAgdmFsdWVDb2x1bW5OYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9HRU5FUkFUT1JfVkFMVUVfQ09MVU1OJmd0Ozwvc3Bhbj4iLCAKLSAgICBwa0NvbHVtblZhbHVlID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9HRU5FUkFUT1JfUEtfQ09MVU1OX1ZBTFVFJmd0Ozwvc3Bhbj4iKUBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7U0VRVUVOQ0VfR0VORVJBVE9SX05BTUUmZ3Q7PC9zcGFuPiIsIAotICAgIHNlcXVlbmNlTmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1NFUVVFTkNFX0dFTkVSQVRPUl9TRVFVRU5DRSZndDs8L3NwYW4+IikKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTgxOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hbnktdG8tbWFueSBtYXBwaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRUlFR0QiIG5hbWU9IkJBQkVJRUdEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NYW55LXRvLW1hbnkgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTMwIiBuYW1lPSJzdGhyZWYxMzAiPjwvYT48YSBpZD0ic3RocmVmMTMxIiBuYW1lPSJzdGhyZWYxMzEiPjwvYT48YSBpZD0ic3RocmVmMTMyIiBuYW1lPSJzdGhyZWYxMzIiPjwvYT48YSBpZD0ic3RocmVmMTMzIiBuYW1lPSJzdGhyZWYxMzMiPjwvYT5Vc2UgYSA8c3BhbiBjbGFzcz0iYm9sZCI+TWFueS10by1NYW55IE1hcHBpbmc8L3NwYW4+IHRvIGRlZmluZSBhIG1hbnktdmFsdWVkIGFzc29jaWF0aW9uIHdpdGggbWFueS10by1tYW55IG11bHRpcGxpY2l0eS4gQSBtYW55LXRvLW1hbnkgbWFwcGluZyBoYXMgdHdvIHNpZGVzOiB0aGUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+b3duaW5nIHNpZGU8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iaXRhbGljIj5ub24tb3duaW5nIHNpZGU8L3NwYW4+LiBZb3UgbXVzdCBzcGVjaWZ5IHRoZSBqb2luIHRhYmxlIG9uIHRoZSBvd25pbmcgc2lkZS4gRm9yIGJpZGlyZWN0aW9uYWwgbWFwcGluZ3MsIGVpdGhlciBzaWRlIG1heSBiZSB0aGUgb3duaW5nIHNpZGUuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IE1hbnktdG8tTWFueTwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT4gZmllbGRzIG9mIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE5Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTkiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+TWFwcGluZyBFbnRpdHkgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTkgcjFjMi10MTkiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbnkgdG8gTWFueSBNYXBwaW5nPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBNYW55VG9NYW55PC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzMtdDE5Ij5NYW55IHRvIE1hbnk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5UYXJnZXQgRW50aXR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTkgcjFjMi10MTkiPlRoZSBlbnRpdHkgdG8gd2hpY2ggdGhpcyBhdHRyaWJ1dGUgaXMgbWFwcGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE5IHIxYzMtdDE5Ij5udWxsCi08cD5Zb3UgZG8gbm90IG5lZWQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB0YXJnZXQgZW50aXR5LCBzaW5jZSBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiBvYmplY3QgYmVpbmcgcmVmZXJlbmNlZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5GZXRjaDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE5IHIxYzItdDE5Ij5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dHR0hCIj4iRmV0Y2ggVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RWFnZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTkgcjFjMy10MTkiPkxhenk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5NYXBwZWQgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxOSByMWMyLXQxOSI+VGhlIGRhdGFiYXNlIGZpZWxkIHRoYXQgb3ducyB0aGUgcmVsYXRpb25zaGlwLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5PcmRlciBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE5IHIxYzItdDE5Ij5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yZGVyIGZvciBvYmplY3RzIHJldHVybmVkIGZyb20gYSBxdWVyeS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0RBRElIIj4iT3JkZXIgQnkiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPk5vIG9yZGVyaW5nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5PC9wPgotPC9saT4KLTxsaT4KLTxwPkN1c3RvbTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTkgcjFjMy10MTkiPk5vIG9yZGVyaW5nPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIGZpZWxkcyBpbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT4gYXJlYSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgSm9pbiBUYWJsZSB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBKb2luIFRhYmxlIHRhYiBvZiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIwIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjAiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIwIHIxYzItdDIwIj5OYW1lIG9mIHRoZSBqb2luIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMCByMWMzLXQyMCI+WW91IG11c3Qgc3BlY2lmeSB0aGUgam9pbiB0YWJsZSBvbiB0aGUgb3duaW5nIHNpZGUuCi08cD5CeSBkZWZhdWx0LCB0aGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBwcmltYXJ5IHRhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0aWVzIGNvbmNhdGVuYXRlZCB3aXRoIGFuIHVuZGVyc2NvcmUuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+Sm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjAgcjFjMi10MjAiPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMCByMWMzLXQyMCI+QnkgZGVmYXVsdCwgdGhlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgcHJpbWFyeSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdGllcyBjb25jYXRlbmF0ZWQgd2l0aCBhbiB1bmRlcnNjb3JlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPkludmVyc2UgSm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjAgcjFjMi10MjAiPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMCByMWMzLXQyMCI+QnkgZGVmYXVsdCwgdGhlIG1hcHBpbmcgaXMgYXNzdW1lZCB0byBoYXZlIGEgc2luZ2xlIGpvaW4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VG8gYWRkIGEgbmV3IEpvaW4gb3IgSW52ZXJzZSBKb2luIENvbHVtbiwgY2xpY2sgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5BZGQ8L3NwYW4+LjwvcD4KLTxwPlRvIGVkaXQgYW4gZXhpc3RpbmcgSm9pbiBvciBJbnZlcnNlIEpvaW4gQ29sdW1uLCBzZWxlY3QgdGhlIGZpZWxkIHRvIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkVkaXQ8L3NwYW4+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBKb2luVGFibGUoam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OJmd0Ozwvc3Bhbj4iKSwgCi0gICAgbmFtZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9UQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iKQotQE1hbnlUb01hbnkoY2FzY2FkZT1DYXNjYWRlVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q0FTQ0FERV9UWVBFJmd0Ozwvc3Bhbj4sIGZldGNoPUZldGNoVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LAotICAgIHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LCBtYXBwZWRCeSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7TUFQUEVEX0JZJmd0Ozwvc3Bhbj4iKQotQE9yZGVyQnkoIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtPUkRFUl9CWSZndDs8L3NwYW4+IikKLQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlYmE2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFueS10by1vbmUgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYW55LXRvLW9uZSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSEZBRkoiIG5hbWU9IkJBQkhGQUZKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NYW55LXRvLW9uZSBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMzQiIG5hbWU9InN0aHJlZjEzNCI+PC9hPjxhIGlkPSJzdGhyZWYxMzUiIG5hbWU9InN0aHJlZjEzNSI+PC9hPjxhIGlkPSJzdGhyZWYxMzYiIG5hbWU9InN0aHJlZjEzNiI+PC9hPjxhIGlkPSJzdGhyZWYxMzciIG5hbWU9InN0aHJlZjEzNyI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55LXRvLU9uZTwvc3Bhbj4gbWFwcGluZyB0byBkZWZpbmVzIGEgc2luZ2xlLXZhbHVlZCBhc3NvY2lhdGlvbiB0byBhbm90aGVyIGVudGl0eSBjbGFzcyB0aGF0IGhhcyBtYW55LXRvLW9uZSBtdWx0aXBsaWNpdHkuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0IGNsaWNrIHRoZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IE1hbnktdG8tT25lPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBmaWVsZHMgSlBBIERldGFpbHMgdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW9uIHRoZSBHZW5lcmFsIHRhYiBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGlvbiB0aGUgR2VuZXJhbCB0YWIgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMTklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjQxJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIxIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjEiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5NYXBwaW5nIEVudGl0eSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMSByMWMyLXQyMSI+RGVmaW5lcyBtYXBwaW5nIGFzIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55LXRvLU9uZTwvc3Bhbj4uIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBNYW55VG9PbmU8L2NvZGU+IGFubm90YXRpb24uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjEgcjFjMy10MjEiPk1hbnktdG8tT25lPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+VGFyZ2V0IEVudGl0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIxIHIxYzItdDIxIj5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMSByMWMzLXQyMSI+bnVsbAotPHA+WW91IGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdGFyZ2V0IGVudGl0eSwgc2luY2UgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+RmV0Y2g8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMSByMWMyLXQyMSI+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHR0dIQiI+IkZldGNoIFR5cGUiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkVhZ2VyPC9wPgotPC9saT4KLTxsaT4KLTxwPkxhenk8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIxIHIxYzMtdDIxIj5FYWdlcjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPkNhc2NhZGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMSByMWMyLXQyMSI+U2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0pBSUhCIj4iQ2FzY2FkZSBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5EZWZhdWx0PC9wPgotPC9saT4KLTxsaT4KLTxwPkFsbDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QZXJzaXN0PC9wPgotPC9saT4KLTxsaT4KLTxwPk1lcmdlPC9wPgotPC9saT4KLTxsaT4KLTxwPlJlbW92ZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjEgcjFjMy10MjEiPkRlZmF1bHQ8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5PcHRpb25hbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIxIHIxYzItdDIxIj5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyMSByMWMzLXQyMSI+WWVzPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIGZpZWxkcyBvbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNDQUNGQ0VKQyI+Sm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uPC9hPiB0YWIgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMTklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjQxJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIyIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjIiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjIiIGhlYWRlcnM9InIxYzEtdDIyIj5Kb2luIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIyIHIxYzItdDIyIj48YSBpZD0ic3RocmVmMTM4IiBuYW1lPSJzdGhyZWYxMzgiPjwvYT48YSBpZD0ic3RocmVmMTM5IiBuYW1lPSJzdGhyZWYxMzkiPjwvYT5TcGVjaWZ5IGEgbWFwcGVkIGNvbHVtbiBmb3Igam9pbmluZyBhbiBlbnRpdHkgYXNzb2NpYXRpb24uIFRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBKb2luQ29sdW08L2NvZGU+IGF0dHJpYnV0ZS4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMiByMWMzLXQyMiI+QnkgZGVmYXVsdCwgdGhlIG1hcHBpbmcgaXMgYXNzdW1lZCB0byBoYXZlIGEgc2luZ2xlIGpvaW4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1ASm9pblRhYmxlKGpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTiZndDs8L3NwYW4+IiksIAotICAgIG5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fVEFCTEVfTkFNRSZndDs8L3NwYW4+IikKLUBNYW55VG9PbmUodGFyZ2V0RW50aXR5PTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQVJHRVRfRU5USVRZJmd0Ozwvc3Bhbj4sIGZldGNoPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtGRVRDSF9UWVBFJmd0Ozwvc3Bhbj4sIAotICAgIGNhc2NhZGU9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NBU0NBREVfVFlQRSZndDs8L3NwYW4+KQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE2Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3Yzc0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+T25lLXRvLW1hbnkgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJPbmUtdG8tbWFueSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSEdFQkQiIG5hbWU9IkJBQkhHRUJEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5PbmUtdG8tbWFueSBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxNDAiIG5hbWU9InN0aHJlZjE0MCI+PC9hPjxhIGlkPSJzdGhyZWYxNDEiIG5hbWU9InN0aHJlZjE0MSI+PC9hPjxhIGlkPSJzdGhyZWYxNDIiIG5hbWU9InN0aHJlZjE0MiI+PC9hPjxhIGlkPSJzdGhyZWYxNDMiIG5hbWU9InN0aHJlZjE0MyI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5PbmUtdG8tTWFueSBNYXBwaW5nPC9zcGFuPiB0byBkZWZpbmUgYSByZWxhdGlvbnNoaXAgd2l0aCBvbmUtdG8tbWFueSBtdWx0aXBsaWNpdHkuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IE9uZS10by1tYW55PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBmaWVsZHMgSlBBIERldGFpbHMgdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIEdlbmVyYWwgdGFiIG9mIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgR2VuZXJhbCB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzglIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjMiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIzIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPk1hcHBpbmcgRW50aXR5IFR5cGUgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjMgcjFjMi10MjMiPkRlZmluZXMgbWFwcGluZyBhcyA8c3BhbiBjbGFzcz0iYm9sZCI+T25lLXRvLU1hbnk8L3NwYW4+LiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AT25lVG9NYW55PC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIzIHIxYzMtdDIzIj5PbmUtdG8tTWFueTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPlRhcmdldCBFbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMyByMWMyLXQyMyI+VGhlIGVudGl0eSB0byB3aGljaCB0aGlzIGF0dHJpYnV0ZSBpcyBtYXBwZWQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjMgcjFjMy10MjMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPkNhc2NhZGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMyByMWMyLXQyMyI+U2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0pBSUhCIj4iQ2FzY2FkZSBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5EZWZhdWx0PC9wPgotPC9saT4KLTxsaT4KLTxwPkFsbDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QZXJzaXN0PC9wPgotPC9saT4KLTxsaT4KLTxwPk1lcmdlPC9wPgotPC9saT4KLTxsaT4KLTxwPlJlbW92ZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjMgcjFjMy10MjMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPkZldGNoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjMgcjFjMi10MjMiPkRlZmluZXMgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0dHSEIiPiJGZXRjaCBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5FYWdlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5MYXp5PC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMyByMWMzLXQyMyI+RWFnZXI8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj5NYXBwZWQgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyMyByMWMyLXQyMyI+VGhlIGRhdGFiYXNlIGZpZWxkIHRoYXQgb3ducyB0aGUgcmVsYXRpb25zaGlwLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIzIHIxYzMtdDIzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj5PcmRlciBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDIzIHIxYzItdDIzIj5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yZGVyIGZvciBvYmplY3RzIHJldHVybmVkIGZyb20gYSBxdWVyeS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0RBRElIIj4iT3JkZXIgQnkiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPk5vIG9yZGVyaW5nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5PC9wPgotPC9saT4KLTxsaT4KLTxwPkN1c3RvbTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjMgcjFjMy10MjMiPk5vIG9yZGVyaW5nPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jQ0FDQkFFQkMiPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L2E+IGZpZWxkcyBpbiB0aGUgSlBBIERldGFpbHMgdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIEpvaW4gVGFibGUgdGFiIG9mIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgSm9pbiBUYWJsZSB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzglIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjQiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI0Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPk5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNCByMWMyLXQyNCI+TmFtZSBvZiB0aGUgam9pbiB0YWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI0IHIxYzMtdDI0Ij5CeSBkZWZhdWx0LCB0aGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBwcmltYXJ5IHRhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0aWVzIGNvbmNhdGVuYXRlZCB3aXRoIGFuIHVuZGVyc2NvcmUuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI0IiBoZWFkZXJzPSJyMWMxLXQyNCI+Sm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjQgcjFjMi10MjQiPlNwZWNpZnkgdHdvIG9yIG1vcmUgam9pbiBjb2x1bW5zICh0aGF0IGlzLCBhIHByaW1hcnkga2V5KS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNCByMWMzLXQyNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI0IiBoZWFkZXJzPSJyMWMxLXQyNCI+SW52ZXJzZSBKb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNCByMWMyLXQyNCI+VGhlIGpvaW4gY29sdW1uIG9uIHRoZSBvd25lZCAob3IgaW52ZXJzZSkgc2lkZSBvZiB0aGUgYXNzb2NpYXRpb246IHRoZSBvd25lZCBlbnRpdHkncyBwcmltYXJ5IGtleSBjb2x1bW4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQE9uZVRvTWFueSh0YXJnZXRFbnRpdHk9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBUkdFVF9FTlRJVFkmZ3Q7PC9zcGFuPikKLUBDb2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTiZndDs8L3NwYW4+IikKLQotCi1AT25lVG9NYW55KHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LmNsYXNzLCBjYXNjYWRlPUNhc2NhZGVUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDQVNDQURFX1RZUEUmZ3Q7PC9zcGFuPiwgCi0gICAgZmV0Y2ggPSBGZXRjaFR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0ZFVENIX1RZUEUmZ3Q7PC9zcGFuPiwgbWFwcGVkQnkgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O01BUFBFRF9CWSZndDs8L3NwYW4+IilAT3JkZXJCeSgiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O09SREVSX0JZJmd0Ozwvc3Bhbj4iKQotQEpvaW5UYWJsZShuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9UQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iLCBqb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPQotICAgICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9DT0xVTU5fTkFNRSZndDs8L3NwYW4+IiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTiZndDs8L3NwYW4+IiksIAotICAgIGludmVyc2VKb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7SU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCAKLSAgICByZWZlcmVuY2VkQ29sdW1uTmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU4mZ3Q7PC9zcGFuPiIpKQotCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzU4ZjhhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5PbmUtdG8tb25lIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iT25lLXRvLW9uZSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkhCQ0oiIG5hbWU9IkJBQkZIQkNKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5PbmUtdG8tb25lIG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE0NCIgbmFtZT0ic3RocmVmMTQ0Ij48L2E+PGEgaWQ9InN0aHJlZjE0NSIgbmFtZT0ic3RocmVmMTQ1Ij48L2E+PGEgaWQ9InN0aHJlZjE0NiIgbmFtZT0ic3RocmVmMTQ2Ij48L2E+PGEgaWQ9InN0aHJlZjE0NyIgbmFtZT0ic3RocmVmMTQ3Ij48L2E+VXNlIGEgPHNwYW4gY2xhc3M9ImJvbGQiPk9uZS10by1PbmUgTWFwcGluZzwvc3Bhbj4gdG8gZGVmaW5lIGEgcmVsYXRpb25zaGlwIHdpdGggb25lLXRvLW1hbnkgbXVsdGlwbGljaXR5LjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBPbmUtdG8tT25lPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBmaWVsZHMgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+TWFwcGVkIEVudGl0eSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNSByMWMyLXQyNSI+RGVmaW5lcyBtYXBwaW5nIGFzIDxzcGFuIGNsYXNzPSJib2xkIj5PbmUtdG8tT25lPC9zcGFuPi4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QE9uZVRvT25lPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzMtdDI1Ij5PbmUtdG8tT25lPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+VGFyZ2V0IEVudGl0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI1IHIxYzItdDI1Ij5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNSByMWMzLXQyNSI+bnVsbAotPHA+WW91IGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdGFyZ2V0IGVudGl0eSwgc2luY2UgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+RmV0Y2ggVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI1IHIxYzItdDI1Ij5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dHR0hCIj4iRmV0Y2ggVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RWFnZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjUgcjFjMy10MjUiPkVhZ2VyPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+TWFwcGVkIEJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjUgcjFjMi10MjUiPlRoZSBkYXRhYmFzZSBmaWVsZCB0aGF0IG93bnMgdGhlIHJlbGF0aW9uc2hpcC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jQ0FDRkNFSkMiPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvYT4gZmllbGRzIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjYiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Sm9pbiBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNiByMWMyLXQyNiI+PGEgaWQ9InN0aHJlZjE0OCIgbmFtZT0ic3RocmVmMTQ4Ij48L2E+PGEgaWQ9InN0aHJlZjE0OSIgbmFtZT0ic3RocmVmMTQ5Ij48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjYgcjFjMy10MjYiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQE9uZVRvT25lKHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LCBjYXNjYWRlPUNhc2NhZGVUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDQVNDQURFX1RZUEUmZ3Q7PC9zcGFuPiwgCi0gICAgZmV0Y2ggPSBGZXRjaFR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0ZFVENIX1RZUEUmZ3Q7PC9zcGFuPiwgbWFwcGVkQnkgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O01BUFBFRF9CWSZndDs8L3NwYW4+IikKLUBKb2luQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCByZWZlcmVuY2VkQ29sdW1uTmFtZT0KLSAgICAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OJmd0Ozwvc3Bhbj4iLCBpbnNlcnRhYmxlID0gPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOU0VSVEFCTEUmZ3Q7PC9zcGFuPiwgCi0gICAgdXBkYXRhYmxlID0gPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1VQREFUQUJMRSZndDs8L3NwYW4+KQotCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDRiZGIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRyYW5zaWVudCBtYXBwaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlRyYW5zaWVudCBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSEZIRUkiIG5hbWU9IkJBQkhGSEVJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5UcmFuc2llbnQgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTUwIiBuYW1lPSJzdGhyZWYxNTAiPjwvYT48YSBpZD0ic3RocmVmMTUxIiBuYW1lPSJzdGhyZWYxNTEiPjwvYT48YSBpZD0ic3RocmVmMTUyIiBuYW1lPSJzdGhyZWYxNTIiPjwvYT48YSBpZD0ic3RocmVmMTUzIiBuYW1lPSJzdGhyZWYxNTMiPjwvYT5Vc2UgdGhlIFRyYW5zaWVudCBNYXBwaW5nIHRvIHNwZWNpZnkgYSBmaWVsZCBvZiB0aGUgZW50aXR5IGNsYXNzIHRoYXQgPHNwYW4gY2xhc3M9Iml0YWxpYyI+aXMgbm90PC9zcGFuPiBwZXJzaXN0ZW50LjwvcD4KLTxwPlRvIGNyZWF0ZSBhIHRyYW5zaWVudCBtYXBwaW5nOjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgVHJhbnNpZW50PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb24gdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBUcmFuc2llbnQKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZjMyMDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlZlcnNpb24gbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJWZXJzaW9uIG1hcHBpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJISUJJSSIgbmFtZT0iQkFCSElCSUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlZlcnNpb24gbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTU0IiBuYW1lPSJzdGhyZWYxNTQiPjwvYT48YSBpZD0ic3RocmVmMTU1IiBuYW1lPSJzdGhyZWYxNTUiPjwvYT48YSBpZD0ic3RocmVmMTU2IiBuYW1lPSJzdGhyZWYxNTYiPjwvYT48YSBpZD0ic3RocmVmMTU3IiBuYW1lPSJzdGhyZWYxNTciPjwvYT5Vc2UgYSA8c3BhbiBjbGFzcz0iYm9sZCI+VmVyc2lvbiBNYXBwaW5nPC9zcGFuPiB0byBzcGVjaWZ5IHRoZSBmaWVsZCB1c2VkIGZvciBvcHRpbWlzdGljIGxvY2tpbmcuIElmIHRoZSBlbnRpdHkgaXMgYXNzb2NpYXRlZCB3aXRoIG11bHRpcGxlIHRhYmxlcywgeW91IHNob3VsZCB1c2UgYSB2ZXJzaW9uIG1hcHBpbmcgb25seSB3aXRoIHRoZSBwcmltYXJ5IHRhYmxlLiBZb3Ugc2hvdWxkIGhhdmUgb25seSBhIHNpbmdsZSB2ZXJzaW9uIG1hcHBpbmcgcGVyIHBlcnNpc3RlbnQgZW50aXR5LiBWZXJzaW9uIG1hcHBpbmdzIG1heSBiZSB1c2VkIG9ubHkgd2l0aCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZSB0eXBlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48Y29kZT5pbnQ8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPkludGVnZXI8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPnNob3J0LCBTaG9ydDwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+bG9uZywgTG9uZzwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+VGltZXN0YW1wPC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VG8gY3JlYXRlIGEgdmVyc2lvbiBtYXBwaW5nOjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBWZXJzaW9uPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIHJlbWFpbmluZyBmaWVsZHMgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI3Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjciPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI3IiBoZWFkZXJzPSJyMWMxLXQyNyI+TWFwcGVkIEVudGl0eSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNyByMWMyLXQyNyI+RGVmaW5lcyB0aGUgbWFwcGluZyBhcyBWZXJzaW9uLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AVmVyc2lvbjwvY29kZT4gYW5ub3RhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNyByMWMzLXQyNyI+VmVyc2lvbjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyNyIgaGVhZGVycz0icjFjMS10MjciPkNvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI3IHIxYzItdDI3Ij5UaGUgZGF0YWJhc2UgY29sdW1uIG1hcHBlZCB0byB0aGUgZW50aXR5IGF0dHJpYnV0ZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dDQkhCIj4iQ29sdW1uIjwvYT4gZm9yIGRldGFpbHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjcgcjFjMy10MjciPkJ5IGRlZmF1bHQsIHRoZSBDb2x1bW4gaXMgYXNzdW1lZCB0byBiZSBuYW1lZCBpZGVudGljYWxseSB0byB0aGUgYXR0cmlidXRlIGFuZCBhbHdheXMgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPklOU0VSVDwvY29kZT4gYW5kIDxjb2RlPlVQREFURTwvY29kZT4gc3RhdGVtZW50cy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjciIGhlYWRlcnM9InIxYzEtdDI3Ij5UYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI3IHIxYzItdDI3Ij5OYW1lIG9mIHRoZSBkYXRhYmFzZSB0YWJsZS4gVGhpcyBtdXN0IGJlIHRoZSBwcmltYXJ5IHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlJ3MgZW50aXR5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI3IHIxYzMtdDI3Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjciIGhlYWRlcnM9InIxYzEtdDI3Ij5UZW1wb3JhbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI3IHIxYzItdDI3Ij5TcGVjaWZpZXMgdGhlIHR5cGUgb2YgZGF0YS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0VBSkdEIj4iVGVtcG9yYWwiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkRhdGU8L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lc3RhbXA8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI3IHIxYzMtdDI3Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBWZXJzaW9uCi1AQ29sdW1uKHRhYmxlPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX1RBQkxFJmd0Ozwvc3Bhbj4iLCBuYW1lPSImbHQ7PHNwYW4gY2xhc3M9Iml0YWxpYyI+Q09MVU1OX05BTUU8L3NwYW4+Jmd0OyIpCi0KLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIwLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ODVjZDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIwLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RWxlbWVudCBDb2xsZWN0aW9uIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRWxlbWVudCBDb2xsZWN0aW9uIG1hcHBpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhCREVBSiIgbmFtZT0iQ0lIQkRFQUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVsZW1lbnQgQ29sbGVjdGlvbiBtYXBwaW5nPC9oMT4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNThlYmI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkJBR0ZJIiBuYW1lPSJCQUJCQUdGSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj4KLTxoMT5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxNTgiIG5hbWU9InN0aHJlZjE1OCI+PC9hPjxhIGlkPSJzdGhyZWYxNTkiIG5hbWU9InN0aHJlZjE1OSI+PC9hPlVzZSB0aGlzIHByb2NlZHVyZSB0byBnZW5lcmF0ZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgZnJvbSBkYXRhYmFzZSB0YWJsZXMuIFlvdSBtdXN0IGNyZWF0ZSBhIEpQQSBwcm9qZWN0IGFuZCBlc3RhYmxpc2ggYSBkYXRhYmFzZSBjb25uZWN0aW9uIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmJlZm9yZTwvc3Bhbj4gZ2VuZXJhdGluZyBwZXJzaXN0ZW50IGVudGl0aWVzLiBTZWUgPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj4iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48YSBpZD0ic3RocmVmMTYwIiBuYW1lPSJzdGhyZWYxNjAiPjwvYT48YSBpZD0ic3RocmVmMTYxIiBuYW1lPSJzdGhyZWYxNjEiPjwvYT48L3A+Ci08b2w+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgSlBBIHByb2plY3QgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SlBBIFRvb2xzICZndDsgR2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXM8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2MiIgbmFtZT0ic3RocmVmMTYyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+R2VuZXJhdGluZyBFbnRpdGllczwvcD4KLTxpbWcgc3JjPSJpbWcvZ2VuZXJhdGVfZW50aXRpZXMucG5nIiBhbHQ9IlVzaW5nIHRoZSBKUEEgVG9vbHMgJmd0OyBHZW5lcmF0ZSBFbnRpdGllcyBtZW51IG9wdGlvbi4iIHRpdGxlPSJVc2luZyB0aGUgSlBBIFRvb2xzICZndDsgR2VuZXJhdGUgRW50aXRpZXMgbWVudSBvcHRpb24uIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+T24gdGhlIDxhIGhyZWY9InJlZl9zZWxlY3RUYWJsZXMuaHRtI0NJQUhDR0VFIj5TZWxlY3QgVGFibGVzPC9hPiBwYWdlLCBzZWxlY3QgeW91ciBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzY2hlbWEuPC9wPgotPHA+VG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgY29ubmVjdGlvbjwvc3Bhbj4uPC9wPgotPHA+SWYgeW91IGFyZSBub3QgY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGUgZGF0YWJhc2UsIHRoZSBEYXRhYmFzZSBDb25uZWN0aW9uIHBhZ2UgYXBwZWFycy4gU2VsZWN0IHlvdXIgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgc2NoZW1hLCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPlJlY29ubmVjdDwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTYzIiBuYW1lPSJzdGhyZWYxNjMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TZWxlY3QgVGFibGVzPC9wPgotPGltZyBzcmM9ImltZy9zZWxlY3RfdGFibGVzLnBuZyIgYWx0PSIiIHRpdGxlPSIiIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5BZnRlciBzZWxlY3RpbmcgYSBzY2hlbWEsIHNlbGVjdCB0aGUgdGFibGVzIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPk9uIHRoZSA8YSBocmVmPSJyZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtI0NJQUNESUNCIj5UYWJsZSBBc3NvY2lhdGlvbnM8L2E+IHBhZ2UsIHNlbGVjdCB0aGUgYXNzb2NpYXRpb25zIHRvIGdlbmVyYXRlLiBZb3UgY2FuIHNwZWNpZnkgdG8gZ2VuZXJhdGUgc3BlY2lmaWMgcmVmZXJlbmNlcyBmb3IgZWFjaCBhc3NvY2lhdGlvbi48L3A+Ci08cD5UbyBjcmVhdGUgYSBuZXcgYXNzb2NpYXRpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgQXNzb2NpYXRpb248L3NwYW4+LiBVc2UgdGhlIDxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+IHdpemFyZCB0byBkZWZpbmUgdGhlIGFzc29jaWF0aW9uLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2NCIgbmFtZT0ic3RocmVmMTY0Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGFibGUgQXNzb2NpYXRpb25zPC9wPgotPGltZyBzcmM9ImltZy90YWJsZV9hc3NvY2lhdGlvbnMucG5nIiBhbHQ9IiIgdGl0bGU9IiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkFmdGVyIGVkaXRpbmcgdGhlIHRhYmxlIGFzc29jaWF0aW9ucywgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PbiB0aGUgPGEgaHJlZj0icmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bSNDSUFFSkRCRSI+Q3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb248L2E+IHBhZ2UsIGN1c3RvbWl6ZSB0aGUgbWFwcGluZyBhbmQgY2xhc3MgaW5mb3JtYXRpb24gZm9yIGVhY2ggZ2VuZXJhdGVkIGVudGl0eS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNjUiIG5hbWU9InN0aHJlZjE2NSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkN1c3RvbWl6ZSBEZWZhdWx0IEVudGl0eSBHZW5lcmF0aW9uPC9wPgotPGltZyBzcmM9ImltZy9jdXN0b21pemVfZGVmYXVsdF9lbnRpdHlfZ2VuZXJhdGlvbi5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+QWZ0ZXIgY3VzdG9taXppbmcgdGhlIG1hcHBpbmdzLCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPk9uIHRoZSA8YSBocmVmPSJyZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtI0NJQUNJR0VFIj5DdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllczwvYT4gcGFnZSwgcmV2aWV3IHRoZSBtYXBwaW5nIGFuZCBjbGFzcyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNjYiIG5hbWU9InN0aHJlZjE2NiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzPC9wPgotPGltZyBzcmM9ImltZy9jdXN0b21pemVfaW5kaXZpZHVhbF9lbnRpdGllcy5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgY3JlYXRlcyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgZm9yIGVhY2ggZGF0YWJhc2UgdGFibGUuIEVhY2ggZW50aXR5IGNvbnRhaW5zIGZpZWxkcyBiYXNlZCBvbiB0aGUgdGFibGUncyBjb2x1bW5zLiBFY2xpcHNlIHdpbGwgYWxzbyBnZW5lcmF0ZSBlbnRpdHkgcmVsYXRpb25zaGlwcyAoc3VjaCBhcyBvbmUtdG8tb25lKSBiYXNlZCBvbiB0aGUgdGFibGUgY29uc3RyYWludHMuIDxhIGhyZWY9IiNDSUhKSUpKQyI+RmlndXJlOiBHZW5lcmF0aW5nIEVudGl0aWVzIGZyb20gVGFibGVzPC9hPiBpbGx1c3RyYXRlcyBob3cgRWNsaXBzZSBnZW5lcmF0ZXMgZW50aXRpZXMgZnJvbSB0YWJsZXMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0iQ0lISklKSkMiIG5hbWU9IkNJSEpJSkpDIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+R2VuZXJhdGluZyBFbnRpdGllcyBmcm9tIFRhYmxlczwvcD4KLTxpbWcgc3JjPSJpbWcvdGFibGVfZW50aXR5LnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgRU1QTE9ZRUUgYW5kIEFERFJFU1MgZW50aXRpZXMgZ2VuZXJhdGVkIGZyb20gZGF0YWJhc2UgdGFibGVzLiIgdGl0bGU9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBFTVBMT1lFRSBhbmQgQUREUkVTUyBlbnRpdGllcyBnZW5lcmF0ZWQgZnJvbSBkYXRhYmFzZSB0YWJsZXMuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08cD48YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNDFlODkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGluZyB0YWJsZXMgZnJvbSBlbnRpdGllczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIHRhYmxlcyBmcm9tIGVudGl0aWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lISklHQkUiIG5hbWU9IkNJSEpJR0JFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmF0aW5nIHRhYmxlcyBmcm9tIGVudGl0aWVzPC9oMT4KLTxwPldoZW4gdXNpbmcgYSB2ZW5kb3Itc3BlY2lmaWMgcGxhdGZvcm0sIHlvdSBjYW4gY3JlYXRlIGEgRERMIHNjcmlwdCBmcm9tIHlvdXIgcGVyc2lzdGVudCBlbnRpdGllcy48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoZSBEREwgc2NyaXB0IHdpdGggRFJPUCBleGlzdGluZyB0YWJsZXMgb24gdGhlIGRhdGFiYXNlIGFuZCBDUkVBVEUgbmV3IHRhYmxlcywgYmFzZWQgb24gdGhlIGVudGl0aWVzIGluIHlvdXIgcHJvamVjdC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxwPlRvIGdlbmVyYXRlIGEgRERMIHNjcmlwdDo8L3A+Ci08cD5SaWdodC1jbGljayB0aGUgSlBBIHByb2plY3QgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SlBBIFRvb2xzICZndDsgR2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXM8L3NwYW4+LjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08cD48YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExODcwZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZBSUJBIiBuYW1lPSJCQUJGQUlCQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj4KLTxoMT5WYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE2NyIgbmFtZT0ic3RocmVmMTY3Ij48L2E+PGEgaWQ9InN0aHJlZjE2OCIgbmFtZT0ic3RocmVmMTY4Ij48L2E+PGEgaWQ9InN0aHJlZjE2OSIgbmFtZT0ic3RocmVmMTY5Ij48L2E+PGEgaWQ9InN0aHJlZjE3MCIgbmFtZT0ic3RocmVmMTcwIj48L2E+RXJyb3JzIGFuZCB3YXJuaW5ncyBvbiBwZXJzaXN0ZW50IGVudGl0aWVzIGFuZCBtYXBwaW5ncyBhcmUgaW5kaWNhdGVkIHdpdGggYSByZWQgZXJyb3Igb3IgeWVsbG93IHdhcm5pbmcgbmV4dCB0byB0aGUgcmVzb3VyY2Ugd2l0aCB0aGUgZXJyb3IsIGFzIHdlbGwgYXMgdGhlIHBhcmVudCBjb250YWluZXJzIHVwIHRvIHRoZSBwcm9qZWN0LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE3MSIgbmFtZT0ic3RocmVmMTcxIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U2FtcGxlIEVycm9ycyBhbmQgV2FybmluZ3M8L3A+Ci08aW1nIHNyYz0iaW1nL2Vycm9yX3NhbXBsZS5wbmciIGFsdD0iVGhpcyBmaWd1cmUgc2hvd3Mgc2FtcGxlIGVycm9yIGFuZCB3YXJuaW5nIGljb25zIGluIHRoZSBFeHBsb3JlciB2aWV3LiIgdGl0bGU9IlRoaXMgZmlndXJlIHNob3dzIHNhbXBsZSBlcnJvciBhbmQgd2FybmluZyBpY29ucyBpbiB0aGUgRXhwbG9yZXIgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMjQuaHRtI0NJSEZFREVJIj5FcnJvciBtZXNzYWdlczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMjUuaHRtI0NJSEdFQUlKIj5XYXJuaW5nIG1lc3NhZ2VzPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxwPjxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2NwcmJ2aWV3Lmh0bSI+UHJvYmxlbXMgdmlldzwvYT48L3A+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZmVlMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RXJyb3IgbWVzc2FnZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRXJyb3IgbWVzc2FnZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhGRURFSSIgbmFtZT0iQ0lIRkVERUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVycm9yIG1lc3NhZ2VzPGEgaWQ9InN0aHJlZjE3MiIgbmFtZT0ic3RocmVmMTcyIj48L2E+PC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBlcnJvciBtZXNzYWdlcyAoaW5jbHVkaW5nIGhvdyB0byByZXNvbHZlIHRoZSBpc3N1ZSkgeW91IG1heSBlbmNvdW50ZXIgd2hpbGUgd29ya2luZyB3aXRoIERhbGkuPC9wPgotPGEgaWQ9InN0aHJlZjE3MyIgbmFtZT0ic3RocmVmMTczIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkF0dHJpYnV0ZSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0FUVFJJQlVURV9fTkFNRSZndDs8L3NwYW4+IiBoYXMgaW52YWxpZCBtYXBwaW5nIHR5cGUgaW4gdGhpcyBjb250ZXh0PC9wPgotPHA+VGhlIG1hcHBlZCBhdHRyaWJ1dGUgaXMgaW52YWxpZC4gRWl0aGVyIGNoYW5nZSB0aGUgbWFwcGluZyB0eXBlIG9yIGNoYW5nZSB0aGUgZW50aXR5IHR5cGUuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPiJNYXBwaW5nIGFuIGVudGl0eSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNzQiIG5hbWU9InN0aHJlZjE3NCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5BdHRyaWJ1dGUgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtBVFRSSUJVVEVfTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+RGFsaSBjYW5ub3QgbWFwIHRoZSBhdHRyaWJ1dGUgdG8gYSBkYXRhYmFzZSB0YWJsZSBhbmQgY29sdW1uLiBWZXJpZnkgdGhhdCB5b3UgZGF0YWJhc2UgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBpcyBjb3JyZWN0LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPiJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNzUiIG5hbWU9InN0aHJlZjE3NSI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5DbGFzcyAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NMQVNTX05BTUUmZ3Q7PC9zcGFuPiIgaXMgbm90IGFubm90YXRlZCBhcyBhIHBlcnNpc3RlbnQgY2xhc3MuPC9wPgotPHA+VGhlIGNsYXNzIGhhcyBub3QgYmVlbiBpZGVudGlmaWVkIGFzIGEgcGVyc2lzdGVudCBjbGFzcy4gQ29uZmlndXJlIHRoZSBjbGFzcyBhcyBhbiBFbnRpdHksIE1hcHBlZCBTdXBlcmNsYXNzLCBvciBFbWJlZGRhYmxlIHBlcnNpc3RlbnQgZW50aXR5LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPiJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI8L2E+LjwvcD4KLTxhIGlkPSJzdGhyZWYxNzYiIG5hbWU9InN0aHJlZjE3NiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5Db2x1bW4gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+WW91IG1hcHBlZCBhbiBlbnRpdHkncyBmaWVsZCB0byBhbiBpbmNvcnJlY3Qgb3IgaW52YWxpZCBjb2x1bW4gaW4gdGhlIGRhdGFiYXNlIHRhYmxlLiBCeSBkZWZhdWx0LCBEYWxpIHdpbGwgYXR0ZW1wdCB0byBtYXAgZWFjaCBmaWVsZCBpbiB0aGUgZW50aXR5IHdpdGggYW4gaWRlbnRpY2FsbHkgbmFtZWQgcm93IGluIHRoZSBkYXRhYmFzZSB0YWJsZS4gSWYgdGhlIGZpZWxkJ3MgbmFtZSBkaWZmZXJzIGZyb20gdGhlIHJvdydzIG5hbWUsIHlvdSBtdXN0IGV4cGxpY2l0bHkgY3JlYXRlIHRoZSBtYXBwaW5nLjwvcD4KLTxwPk1hcCB0aGUgZmllbGQgdG8gYSB2YWxpZCByb3cgaW4gdGhlIGRhdGFiYXNlIHRhYmxlIGFzIHNob3duIGluIDxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPiJNYXBwaW5nIGFuIGVudGl0eSI8L2E+LjwvcD4KLTxhIGlkPSJzdGhyZWYxNzciIG5hbWU9InN0aHJlZjE3NyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5EdXBsaWNhdGUgY2xhc3MgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDTEFTU19OQU1FJmd0Ozwvc3Bhbj4iLjwvcD4KLTxwPllvdSBjcmVhdGVkIHRvIHBlcnNpc3RlbmNlIGNsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lLiBFYWNoIEphdmEgY2xhc3MgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUuIFNlZSA8YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPiJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNzgiIG5hbWU9InN0aHJlZjE3OCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5FbnRpdHkgZG9lcyBub3QgaGF2ZSBhbiBJZCBvciBFbWJlZGRlZCBJZC48L3A+Ci08cD5Zb3UgY3JlYXRlZCBhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGhvdXQgaWRlbnRpZnlpbmcgaXRzIHByaW1hcnkga2V5LiBBIHBlcnNpc3RlbnQgZW50aXR5IG11c3QgaGF2ZSBhIHByaW1hcnkga2V5IGZpZWxkIGRlc2lnbmF0ZWQgd2l0aCBhbiA8Y29kZT5ASWQ8L2NvZGU+IG9yIDxjb2RlPkBFbWJlZGRlZElkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTxwPkFkZCBhbiBJRCBtYXBwaW5nIHRvIHRoZSBlbnRpdHkgYXMgc2hvd24gaW4gPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj4iSUQgbWFwcGluZyI8L2E+IG9yIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNDSUhESUFFRSI+IkVtYmVkZGVkIElEIG1hcHBpbmciPC9hPi48L3A+Ci08YSBpZD0ic3RocmVmMTc5IiBuYW1lPSJzdGhyZWYxNzkiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+TXVsdGlwbGUgcGVyc2lzdGVuY2UueG1sIGZpbGVzIGluIHByb2plY3QuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBKUEEgcHJvamVjdCB3aXRoIG1vcmUgdGhhbiBvbmUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBFYWNoIEpQQSBwcm9qZWN0IG11c3QgY29udGFpbiBhIDxzcGFuIGNsYXNzPSJpdGFsaWMiPnNpbmdsZTwvc3Bhbj4gPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPiJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTgwIiBuYW1lPSJzdGhyZWYxODAiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+Tm8gcGVyc2lzdGVuY2UgdW5pdCBkZWZpbmVkLjwvcD4KLTxwPlRoZXJlIGlzIG5vIHBlcnNpc3RlbmNlIHVuaXQgZGVmaW5lZCBpbiB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBVc2UgdGhlICZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9VTklUX05BTUUmZ3Q7PC9zcGFuPiIgdGFnIHRvIGRlZmluZSB0aGUgcGVyc2lzdGVudCB1bml0LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj4iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxODEiIG5hbWU9InN0aHJlZjE4MSI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5ObyBwZXJzaXN0ZW5jZS54bWwgZmlsZSBpbiBwcm9qZWN0LjwvcD4KLTxwPllvdSBjcmVhdGVkIGEgSlBBIHByb2plY3Qgd2l0aG91dCBhIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS4gRWFjaCBKUEEgcHJvamVjdCBtdXN0IGNvbnRhaW4gYSA8c3BhbiBjbGFzcz0iaXRhbGljIj5zaW5nbGU8L3NwYW4+IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj4iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE4MiIgbmFtZT0ic3RocmVmMTgyIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPlJlZmVyZW5jZWQgY29sdW1uICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIgaW4gam9pbiBjb2x1bW4gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+VGhlIGNvbHVtbiB0aGF0IHlvdSBzZWxlY3RlZCB0byBqb2luIGEgcmVsYXRpb25zaGlwIG1hcHBpbmcgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGRhdGFiYXNlIHRhYmxlLiBFaXRoZXIgc2VsZWN0IGEgZGlmZmVyZW50IGNvbHVtbiBvbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT4gb3IgY3JlYXRlIHRoZSBuZWNlc3NhcnkgY29sdW1uIG9uIHRoZSBkYXRhYmFzZSB0YWJsZS48L3A+Ci08cD5TZWUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxODMiIG5hbWU9InN0aHJlZjE4MyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5TY2hlbWEgIiZsdDs8c3BhbiBjbGFzcz0iaXRhbGljIj5TQ0hFTUFfTkFNRTwvc3Bhbj4mZ3Q7IiBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIHRhYmxlL2pvaW4gdGFibGUgIiZsdDs8c3BhbiBjbGFzcz0iaXRhbGljIj5UQUJMRV9OQU1FPC9zcGFuPiZndDsiLjwvcD4KLTxwPkRlZmluZSB0aGUgZGVmYXVsdCBkYXRhYmFzZSBzY2hlbWEgaW5mb3JtYXRpb24gaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiPiJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE4NCIgbmFtZT0ic3RocmVmMTg0Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPlRhYmxlICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEVfTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+WW91IGFzc29jaWF0ZWQgYSBwZXJzaXN0ZW50IGVudGl0eSB0byBhbiBpbmNvcnJlY3Qgb3IgaW52YWxpZCBkYXRhYmFzZSB0YWJsZS4gQnkgZGVmYXVsdCwgRGFsaSB3aWxsIGF0dGVtcHQgdG8gYXNzb2NpYXRlIGVhY2ggcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBhbiBpZGVudGljYWxseSBuYW1lZCBkYXRhYmFzZSB0YWJsZS4gSWYgdGhlIGVudGl0eSdzIG5hbWUgZGlmZmVycyBmcm9tIHRoZSB0YWJsZSdzIG5hbWUsIHlvdSBtdXN0IGV4cGxpY2l0bHkgY3JlYXRlIHRoZSBhc3NvY2lhdGlvbi48L3A+Ci08cD5Bc3NvY2lhdGUgdGhlIGVudGl0eSB3aXRoIGEgdmFsaWQgZGF0YWJhc2UgdGFibGUgYXMgc2hvd24gaW4gPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj4iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPC9hPi48L3A+Ci08YSBpZD0ic3RocmVmMTg1IiBuYW1lPSJzdGhyZWYxODUiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+VW5yZXNvbHZlZCBnZW5lcmF0b3IgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtHRU5FUkFUT1JfTkFNRSZndDs8L3NwYW4+IiBpcyBkZWZpbmVkIGluIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBwZXJzaXN0ZW5jZSBlbnRpdHkgdGhhdCB1c2VzIHNlcXVlbmNpbmcgb3IgYSB0YWJsZSBnZW5lcmF0b3IsIGJ1dCBkaWQgbm90IGRlZmluZSB0aGUgZ2VuZXJhdG9yIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBFaXRoZXIgZGVmaW5lIHRoZSBnZW5lcmF0b3IgYnkgdXNpbmcgYW4gYW5ub3RhdGlvbiBvciBpbmNsdWRpbmcgaXQgaW4gdGhlIFhNTCBtYXBwaW5nIGZpbGUuPC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxwPjxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2NwcmJ2aWV3Lmh0bSI+UHJvYmxlbXMgdmlldzwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiYmFjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5XYXJuaW5nIG1lc3NhZ2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ildhcm5pbmcgbWVzc2FnZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhHRUFJSiIgbmFtZT0iQ0lIR0VBSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPldhcm5pbmcgbWVzc2FnZXM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHdhcm5pbmcgbWVzc2FnZXMgKGluY2x1ZGluZyBob3cgdG8gcmVzb2x2ZSB0aGUgaXNzdWUpIHlvdSBtYXkgZW5jb3VudGVyIHdoaWxlIHdvcmtpbmcgd2l0aCBEYWxpLjwvcD4KLTxhIGlkPSJzdGhyZWYxODYiIG5hbWU9InN0aHJlZjE4NiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5Db25uZWN0aW9uICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09OTkVDVElPTl9OQU1FJmd0Ozwvc3Bhbj4iIGlzIG5vdCBhY3RpdmUuIE5vIHZhbGlkYXRpb24gd2lsbCBiZSBkb25lIGFnYWluc3QgdGhlIGRhdGEgc291cmNlLjwvcD4KLTxwPlRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHlvdSBzcGVjaWZpZWQgdG8gdXNlIHdpdGggdGhlIEpQQSBwcm9qZWN0IGlzIG5vdCBhY3RpdmUuIFRoZSBKUEEgcHJvamVjdCByZXF1aXJlcyBhbiBhY3RpdmUgY29ubmVjdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTg3IiBuYW1lPSJzdGhyZWYxODciPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+Tm8gY29ubmVjdGlvbiBzcGVjaWZpZWQgZm9yIHRoZSBwcm9qZWN0LiBObyBkYXRhLXNwZWNpZmljIHZhbGlkYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBKUEEgcHJvamVjdCB3aXRob3V0IHNwZWNpZnlpbmcgYSBkYXRhYmFzZSBjb25uZWN0aW9uLiBUaGUgSlBBIHByb2plY3QgcmVxdWlyZXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24uPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4gb3IgPGEgaHJlZj0idGFza3MwMjYuaHRtI0JBQkRCQ0JJIj4iTW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzIjwvYT4gZm9yIGluZm9ybWF0aW9uIG9uIHNwZWNpZnlpbmcgYSBkYXRhYmFzZSBjb25uZWN0aW9uLjwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jcHJidmlldy5odG0iPlByb2JsZW1zIHZpZXc8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NWEwM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI2Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkRCQ0JJIiBuYW1lPSJCQUJEQkNCSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzPC9oMT4KLTxwPkVhY2ggcGVyc2lzdGVudCBwcm9qZWN0IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgZGF0YWJhc2UgY29ubmVjdGlvbi4gVG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+RGF0YWJhc2UgQ29ubmVjdGlvbjwvc3Bhbj4gdXNlIHRoZSBOZXcgQ29ubmVjdGlvbiB3aXphcmQuPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIG1vZGlmeSB0aGUgdmVuZGVyLXNwZWNpZmljIHBsYXRmb3JtIGFuZCBkYXRhYmFzZSBjb25uZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB5b3VyIEpQQSBwcm9qZWN0LjwvcD4KLTxvbD4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBwcm9qZWN0IGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+RXhwbG9yZXI8L3NwYW4+IHZpZXcgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPlByb3BlcnRpZXM8L3NwYW4+LiBUaGUgUHJvcGVydGllcyBwYWdlIGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTg4IiBuYW1lPSJzdGhyZWYxODgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgUHJvcGVydGllcyBQYWdlPC9wPgotPGltZyBzcmM9ImltZy9wcm9qZWN0X3Byb3BlcnRpZXNfdGFza3MucG5nIiBhbHQ9IlRoZSBQZXJzaXN0ZW5jZSBwYWdlLiIgdGl0bGU9IlRoZSBQZXJzaXN0ZW5jZSBwYWdlLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIGVhY2ggZmllbGQgb24gdGhlIDxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEphdmEgUGVyc2lzdGVuY2UgT3B0aW9uczwvYT4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk9LPC9zcGFuPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jQkFCSkhCQ0kiPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDc5MTdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UaXBzIGFuZCB0cmlja3M8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIFRpcHMgYW5kIHRyaWNrcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNIREhHSEJGIiBuYW1lPSJDSERIR0hCRiI+PC9hPjwvcD4KLTxoMT5UaXBzIGFuZCB0cmlja3M8L2gxPgotPHA+VGhlIGZvbGxvd2luZyB0aXBzIGFuZCB0cmlja3MgZ2l2ZSBzb21lIGhlbHBmdWwgaWRlYXMgZm9yIGluY3JlYXNpbmcgeW91ciBwcm9kdWN0aXZpdHkuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0iI0JBQkZJSUhBIj48c3BhbiBjbGFzcz0iYm9sZCI+RGF0YWJhc2UgQ29ubmVjdGlvbnM8L3NwYW4+PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSIjQkFCQ0hBSEYiPjxzcGFuIGNsYXNzPSJib2xkIj5TY2hlbWEtYmFzZWQgcGVyc2lzdGVuY2UueG1sPC9zcGFuPjwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHRpcHMgYW5kIHRyaWNrcyBpbiB0aGlzIGNhdGVnb3J5LiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgdGlwcyBhbmQgdHJpY2tzIGluIHRoaXMgY2F0ZWdvcnkuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI3JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyIj5UaXA8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj48YSBpZD0iQkFCRklJSEEiIG5hbWU9IkJBQkZJSUhBIj48L2E+PHNwYW4gY2xhc3M9ImJvbGQiPkRhdGFiYXNlIENvbm5lY3Rpb25zPC9zcGFuPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIgcjFjMi10MiI+V2hlbiBzdGFydGluZyBhIG5ldyB3b3JrYmVuY2ggc2Vzc2lvbiwgYmUgc3VyZSB0byA8YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRvYy51c2VyL2RvYy9odG1sL2FzYzEyMjk3MDAzNDMzNTIuaHRtbCI+cmVjb25uZWN0IHRvIHlvdXIgZGF0YWJhc2U8L2E+IChpZiB5b3UgYXJlIHdvcmtpbmcgb25saW5lKS4gVGhpcyBhbGxvd3MgRGFsaSB0byBwcm92aWRlIGRhdGFiYXNlLXJlbGF0ZWQgbWFwcGluZyBhc3Npc3RhbmNlIGFuZCB2YWxpZGF0aW9uLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj48YSBpZD0iQkFCQ0hBSEYiIG5hbWU9IkJBQkNIQUhGIj48L2E+PHNwYW4gY2xhc3M9ImJvbGQiPlNjaGVtYS1iYXNlZCBwZXJzaXN0ZW5jZS54bWw8L3NwYW4+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MiByMWMyLXQyIj5JZiB5b3UgYXJlIGJlaGluZCBhIGZpcmV3YWxsLCB5b3UgbWF5IG5lZWQgdG8gY29uZmlndXJlIHlvdXIgRWNsaXBzZSB3b3Jrc3BhY2UgcHJveHkgaW4gdGhlIDxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtNzIuaHRtIj5QcmVmZXJlbmNlcyBkaWFsb2c8L2E+ICg8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPlByZWZlcmVuY2VzICZndDsgSW50ZXJuZXQgJmd0OyBQcm94eSBTZXR0aW5nczwvc3Bhbj4pIHRvIHByb3Blcmx5IHZhbGlkYXRlIGEgc2NoZW1hLWJhc2VkIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90b2MueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NmRlYmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/PgotPCEtLSBVc2VyIEd1aWRlIC0tPgotICA8dG9jIGxhYmVsPSJEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgVXNlciBHdWlkZSI+Ci0gICAgPHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZC5odG0iIGxhYmVsPSJHZXR0aW5nIHN0YXJ0ZWQiPgotICAgICAgPHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jQkFCRUZIQ0QiIGxhYmVsPSJSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDIuaHRtI0JBQklHQ0pBIiBsYWJlbD0iRGFsaSBxdWljayBzdGFydCI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtI0JBQkRGSERBIiBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI0JBQkZHRERHIiBsYWJlbD0iQ3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHMiIC8+Ci0gICAgICA8L3RvcGljPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGhyZWY9ImNvbmNlcHRzLmh0bSIgbGFiZWw9IiBDb25jZXB0cyI+Ci0gICAgICA8dG9waWMgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiIGxhYmVsPSJVbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2UiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSIgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIiBsYWJlbD0iVW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJIj4KLSAgICAgICAgPHRvcGljIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCIgbGFiZWw9IlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNDSERCSUpBQyIgbGFiZWw9IlRoZSBvcm0ueG1sIGZpbGUiIC8+Ci0gICAgICA8L3RvcGljPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGhyZWY9InRhc2tzLmh0bSIgbGFiZWw9IiBUYXNrcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIiBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza3MwMDEuaHRtI0JFSUJBREhIIiBsYWJlbD0iQ29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0IiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIiBsYWJlbD0iQ3JlYXRpbmcgYSBKUEEgRW50aXR5IiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCIgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAwMi5odG0jQ0lIRkVCQUkiIGxhYmVsPSJTeW5jaHJvbml6aW5nIGNsYXNzZXMiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAwMy5odG0jc3RocmVmNTYiIGxhYmVsPSJVcGdyYWRpbmcgZG9jdW1lbnQgdmVyc2lvbiIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNDSUhER0RDRCIgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDQuaHRtI3N0aHJlZjYwIiBsYWJlbD0iQ3JlYXRpbmcgYW4gb3JtLnhtbCBmaWxlIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDUuaHRtI0NJSEJDRENFIiBsYWJlbD0iV29ya2luZyB3aXRoIG9ybS54bWwgZmlsZSIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIiBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIiBsYWJlbD0iRW50aXR5IiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDcuaHRtI0JBQkZFSUNFIiBsYWJlbD0iRW1iZWRkYWJsZSIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNCQUJEQUdDSSIgbGFiZWw9Ik1hcHBlZCBzdXBlcmNsYXNzIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIiBsYWJlbD0iU3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlcyIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCIgbGFiZWw9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJJR0JHRyIgbGFiZWw9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiIgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSIgbGFiZWw9IkJhc2ljIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiIGxhYmVsPSJFbWJlZGRlZCBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTIuaHRtI0NJSERJQUVFIiBsYWJlbD0iRW1iZWRkZWQgSUQgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyIgbGFiZWw9IklEIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jQkFCRUlFR0QiIGxhYmVsPSJNYW55LXRvLW1hbnkgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiIgbGFiZWw9Ik1hbnktdG8tb25lIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiIGxhYmVsPSJPbmUtdG8tbWFueSBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIiBsYWJlbD0iT25lLXRvLW9uZSBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTguaHRtI0JBQkhGSEVJIiBsYWJlbD0iVHJhbnNpZW50IG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxOS5odG0jQkFCSElCSUkiIGxhYmVsPSJWZXJzaW9uIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyMC5odG0jQ0lIQkRFQUoiIGxhYmVsPSJFbGVtZW50IENvbGxlY3Rpb24gbWFwcGluZyIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza3MwMjEuaHRtI0JBQkJBR0ZJIiBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyMi5odG0jQ0lISklHQkUiIGxhYmVsPSJHZW5lcmF0aW5nIHRhYmxlcyBmcm9tIGVudGl0aWVzIiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDIzLmh0bSNCQUJGQUlCQSIgbGFiZWw9IlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyNC5odG0jQ0lIRkVERUkiIGxhYmVsPSJFcnJvciBtZXNzYWdlcyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDI1Lmh0bSNDSUhHRUFJSiIgbGFiZWw9Ildhcm5pbmcgbWVzc2FnZXMiIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDI2Lmh0bSNCQUJEQkNCSSIgbGFiZWw9Ik1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllcyIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRpbmdfc2NoZW1hX2Zyb21fY2xhc3Nlcy5odG0jQ0lISEJKQ0oiIGxhYmVsPSJHZW5lcmF0aW5nIFNjaGVtYSBmcm9tIENsYXNzZXMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSNDSUhDQkhKRCIgbGFiZWw9IkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWEiIC8+Ci0gICAgPC90b3BpYz4KLSAgICA8dG9waWMgbGFiZWw9IiBSZWZlcmVuY2UiPgotICAgICAgPHRvcGljIGxhYmVsPSJXaXphcmRzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyIgbGFiZWw9IkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiIGxhYmVsPSJOZXcgSlBBIFByb2plY3QgcGFnZSIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX2phdmFfcGFnZS5odG0jQ0lBR0VCQUEiIGxhYmVsPSJKYXZhIFBhZ2UiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIiBsYWJlbD0iSlBBIEZhY2V0IHBhZ2UiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSNDSUFHR0dERiIgbGFiZWw9IkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZCI+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI0NJQUZFSUdGIiBsYWJlbD0iRW50aXR5IENsYXNzIHBhZ2UiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0jQ0lBREVDSUEiIGxhYmVsPSJFbnRpdHkgUHJvcGVydGllcyBwYWdlIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSIgbGFiZWw9Ik1hcHBpbmcgRmlsZSBXaXphcmQiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDMuaHRtI0NJQUpFSURKIiBsYWJlbD0iTWFwcGluZyBGaWxlIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDA0Lmh0bSNDSUFHSENHQSIgbGFiZWw9IkdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzIFdpemFyZCIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0jQ0lBR0JGSkUiIGxhYmVsPSJHZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSNDSUFIQ0dFRSIgbGFiZWw9IlNlbGVjdCBUYWJsZXMiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl90YWJsZUFzc29jaWF0aW9ucy5odG0jQ0lBQ0RJQ0IiIGxhYmVsPSJUYWJsZSBBc3NvY2lhdGlvbnMiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbi5odG0jQ0lBRUpEQkUiIGxhYmVsPSJDdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX2N1c3RvbWl6SW5kaXZpZHVhbEVudGl0aWVzLmh0bSNDSUFDSUdFRSIgbGFiZWw9IkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNDSUFGR0hJRiIgbGFiZWw9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24iPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfYXNzb2NpYXRpb25fdGFibGUuaHRtI0NJQUdKSERDIiBsYWJlbD0iQXNzb2NpYXRpb24gVGFibGVzIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfam9pbl9jb2x1bW5zLmh0bSNDSUFFR0VFRyIgbGFiZWw9IkpvaW4gQ29sdW1ucyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX2Fzc29jaWF0aW9uX2NhcmRpbmFsaXR5Lmh0bSNDSUFGSUlGSCIgbGFiZWw9IkFzc29jaWF0aW9uIENhcmRpbmFsaXR5IiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX2pheGJfc2NoZW1hX3dpemFyZC5odG0jQ0FDR0FERkgiIGxhYmVsPSJHZW5lcmF0ZSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMgV2l6YXJkIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX3NjaGVtYV9mcm9tX2NsYXNzZXNfcGFnZS5odG0jQ0FDSEJFR0oiIGxhYmVsPSJHZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iUHJvcGVydHkgcGFnZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiIGxhYmVsPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDA2Lmh0bSNDQUNDQUdHQyIgbGFiZWw9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAwNy5odG0jQ0FDSUpCR0giIGxhYmVsPSJBdHRyaWJ1dGUgb3ZlcnJpZGVzIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDguaHRtI0NBQ0JISURBIiBsYWJlbD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI0NBQ0ZIR0hFIiBsYWJlbD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMC5odG0jc3RocmVmMjQxIiBsYWJlbD0iUXVlcmllcyIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiIGxhYmVsPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiIgbGFiZWw9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jQ0FDQkFFQkMiIGxhYmVsPSJKb2luIFRhYmxlIEluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI0NBQ0ZDRUpDIiBsYWJlbD0iSm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI0NBQ0ZDQ0FCIiBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiIGxhYmVsPSJKUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCkiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTMuaHRtI0NBQ0NBQ0dIIiBsYWJlbD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE0Lmh0bSNDQUNFQUdCRyIgbGFiZWw9IlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxNS5odG0jQ0lBRkdBSUoiIGxhYmVsPSJHZW5lcmF0b3JzIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTYuaHRtI0NJQUlCQUFKIiBsYWJlbD0iUXVlcmllcyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE3Lmh0bSNDSUFER0NJRCIgbGFiZWw9IkNvbnZlcnRlcnMiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiIGxhYmVsPSJKUEEgU3RydWN0dXJlIHZpZXciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIiBsYWJlbD0icGVyc2lzdGVuY2UueG1sIEVkaXRvciI+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bSNDSUFDSUZHSiIgbGFiZWw9IkdlbmVyYWwiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiIGxhYmVsPSJDb25uZWN0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTkuaHRtI0NJQUpBRkVHIiBsYWJlbD0iQ3VzdG9taXphdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDIwLmh0bSNDSUFCRURDSCIgbGFiZWw9IkNhY2hpbmciIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAyMS5odG0jQ0lBQkdISEkiIGxhYmVsPSJMb2dnaW5nIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjIuaHRtI0NJQUZKQ0hFIiBsYWJlbD0iT3B0aW9ucyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDIzLmh0bSNDSUFDQ0ZDQiIgbGFiZWw9IlNjaGVtYSBHZW5lcmF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjQuaHRtI0NJQUhKREZGIiBsYWJlbD0iUHJvcGVydGllcyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDI1Lmh0bSNDSUFIQ0pBSCIgbGFiZWw9IlNvdXJjZSIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgbGFiZWw9IlByZWZlcmVuY2VzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIiBsYWJlbD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI0NBQ0ZCQUVIIiBsYWJlbD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iRGlhbG9ncyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjkuaHRtI0NBQ0NHRUhDIiBsYWJlbD0iRWRpdCBKb2luIENvbHVtbnMgRGlhbG9nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0jQ0lBRkRHSUoiIGxhYmVsPSJTZWxlY3QgQ2FzY2FkZSBkaWFsb2ciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bSNDSUFFREVKRiIgbGFiZWw9Ik5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX2FkZF9jb252ZXJ0ZXIuaHRtI0NJQUdDR0lKIiBsYWJlbD0iQWRkIENvbnZlcnRlciBkaWFsb2ciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfY29uZmlndXJlX2pheGJfY2xhc3NfZ2VuZXJhdGlvbl9kaWFsb2cuaHRtI0NBQ0hISEpBIiBsYWJlbD0iQ29uZmlndXJlIEpBWEIgQ2xhc3MgR2VuZXJhdGlvbiBkaWFsb2ciIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiIGxhYmVsPSJKUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmUiIC8+Ci0gICAgICA8dG9waWMgbGFiZWw9Ikljb25zIGFuZCBidXR0b25zIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMS5odG0jQ0FDR0VBQ0ciIGxhYmVsPSJJY29ucyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMi5odG0jQ0FDREpDRUkiIGxhYmVsPSJCdXR0b25zIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzMuaHRtI0NBQ0JCRElCIiBsYWJlbD0iRGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbiIgLz4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJ0aXBzX2FuZF90cmlja3MuaHRtIiBsYWJlbD0iVGlwcyBhbmQgdHJpY2tzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ3aGF0c19uZXcwMDEuaHRtI3N0aHJlZjMwNiIgbGFiZWw9IkltcHJvdmVkIEludGVybmF0aW9uYWxpemF0aW9uIGFuZCBMb2NhbGl6YXRpb24iIC8+Ci0gICAgICA8dG9waWMgaHJlZj0id2hhdHNfbmV3MDAyLmh0bSNDSkFDRURERSIgbGFiZWw9Ik11bHRpcGxlIEltcHJvdmVtZW50cyB0byB0aGUgRGFsaSBQZXJzcGVjdGl2ZSIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ3aGF0c19uZXcwMDMuaHRtI0NKQURJRkhKIiBsYWJlbD0iU3VwcG9ydCBmb3IgSlBBIDIuMCBhbmQgRWNsaXBzZUxpbmsiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0id2hhdHNfbmV3MDA0Lmh0bSNDSkFCSUpFQyIgbGFiZWw9IkNvbnZlcnNpb24gb2YgSmF2YSBQcm9qZWN0cyB0byBKUEEgUHJvamVjdHMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0id2hhdHNfbmV3MDA1Lmh0bSNDSkFDSkJEQSIgbGFiZWw9IkVjbGlwc2VMaW5rIDIueCBTdXBwb3J0IiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwNi5odG0jc3RocmVmMzA3IiBsYWJlbD0iVGFibGUtcGVyLUNvbmNyZXRlLUNsYXNzIEluaGVyaXRhbmNlIiAvPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGhyZWY9ImxlZ2FsLmh0bSIgbGFiZWw9IiBMZWdhbCI+Ci0gICAgICA8dG9waWMgaHJlZj0iYWJvdXQuaHRtI3N0aHJlZjMwOSIgbGFiZWw9IkFib3V0IHRoaXMgY29udGVudCIgLz4KLSAgICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTI5NGEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5XaGF0J3MgbmV3PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBXaGF0J3MgbmV3IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0ic3RocmVmMjkxIiBuYW1lPSJzdGhyZWYyOTEiPjwvYT4gV2hhdCdzIG5ldzwvcD4KLTxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBkZXNjcmlwdGlvbnMgb2YgdGhlIGZvbGxvd2luZyBuZXcgZmVhdHVyZXMgYW5kIHNpZ25pZmljYW50IGNoYW5nZXMgbWFkZSB0byB0aGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wgZm9yIFJlbGVhc2UgMi4zOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwMi5odG0jQ0pBQ0VEREUiPk11bHRpcGxlIEltcHJvdmVtZW50cyB0byB0aGUgRGFsaSBQZXJzcGVjdGl2ZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDAzLmh0bSNDSkFESUZISiI+U3VwcG9ydCBmb3IgSlBBIDIuMCBhbmQgRWNsaXBzZUxpbms8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwNC5odG0jQ0pBQklKRUMiPkNvbnZlcnNpb24gb2YgSmF2YSBQcm9qZWN0cyB0byBKUEEgUHJvamVjdHM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwNS5odG0jQ0pBQ0pCREEiPkVjbGlwc2VMaW5rIDIueCBTdXBwb3J0PC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwY2E0NDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkltcHJvdmVkIEludGVybmF0aW9uYWxpemF0aW9uIGFuZCBMb2NhbGl6YXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSW1wcm92ZWQgSW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIExvY2FsaXphdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMjkyIiBuYW1lPSJzdGhyZWYyOTIiPjwvYT4KLTxoMT5JbXByb3ZlZCBJbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgTG9jYWxpemF0aW9uPC9oMT4KLTxwPlRoaXMgcmVsZWFzZSBvZiB0aGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wgcHJvdmlkZXMgaW1wcm92ZWQgaW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIGFuZCBsb2NhbGl6YXRpb24gc3VwcG9ydC4gRGFsaSBwcm9qZWN0cyBjYW4gc3VwcG9ydCBkaWZmZXJlbnQgbG9jYWxlcyBhbmQgcHJvY2Vzc2luZyBvZiBpbnRlcm5hdGlvbmFsIGRhdGEgKHN1Y2ggYXMgZGF0ZXMgYW5kIHN0cmluZ3MpLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YjE1ZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk11bHRpcGxlIEltcHJvdmVtZW50cyB0byB0aGUgRGFsaSBQZXJzcGVjdGl2ZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNdWx0aXBsZSBJbXByb3ZlbWVudHMgdG8gdGhlIERhbGkgUGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSkFDRURERSIgbmFtZT0iQ0pBQ0VEREUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk11bHRpcGxlIEltcHJvdmVtZW50cyB0byB0aGUgRGFsaSBQZXJzcGVjdGl2ZTwvaDE+Ci08cD5UaGVyZSBoYXZlIGJlZW4gbXVsdGlwbGUgaW1wcm92ZW1lbnRzIHRvIHRoZSBEYWxpIHBlcnNwZWN0aXZlcyB0byBpbXByb3ZlIGl0cyBlYXNlLW9mLXVzZTo8L3A+Ci08dWw+Ci08bGk+Ci08cD5UaGUgPGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT4gbm93IGFjY2VwdHMgc2hvcnQgbmFtZXMgYXMgYXR0cmlidXRlIHR5cGVzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5EYWxpIHdpbGwgcGVyZm9ybSB2YWxpZGF0aW9uIGFmdGVyIHJlZnJlc2hpbmcgZGF0YWJhc2UgaW5mb3JtYXRpb24uPC9wPgotPC9saT4KLTxsaT4KLTxwPkRhbGkgYWxsb3dzIHByb2plY3QtbGV2ZWwgY3VzdG9taXphdGlvbiBmb3IgdmFsaWRhdGlvbiAoZXJyb3IgYW5kIHdhcm5pbmcgcmVwb3J0cyk8L3A+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjFjYzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlN1cHBvcnQgZm9yIEpQQSAyLjAgYW5kIEVjbGlwc2VMaW5rPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlN1cHBvcnQgZm9yIEpQQSAyLjAgYW5kIEVjbGlwc2VMaW5rIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0pBRElGSEoiIG5hbWU9IkNKQURJRkhKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TdXBwb3J0IGZvciBKUEEgMi4wIGFuZCBFY2xpcHNlTGluazwvaDE+Ci08cD5UaGlzIHJlbGVhc2Ugb2YgdGhlIERhbGkgT1IgTWFwcGluZyBUb29sIHN1cHBvcnRzIGdlbmVyaWMgSlBBIDIuMCBhcyB3ZWxsIGFzIHNwZWNpZmljIGl0ZW1zIGZvciBFY2xpc3BlTGluayAxLjIuPC9wPgotPHVsPgotPGxpPgotPHA+RGVyaXZlZCBJRHM8L3A+Ci08L2xpPgotPGxpPgotPHA+Q2FjaGluZyAoU2hhcmVkIENhY2hlIGFuZCBDYWNoYWJsZSk8L3A+Ci08L2xpPgotPGxpPgotPHA+Q2Fub25pY2FsIG1ldGFtb2RlbCBnZW5lcmF0aW9uPC9wPgotPC9saT4KLTxsaT4KLTxwPk9yZGVyIENvbHVtbiBjb25maWd1cmF0aW9uPC9wPgotPC9saT4KLTxsaT4KLTxwPkVsZW1lbnRDb2xsZWN0aW9uIG1hcHBpbmcgdHlwZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DYXNjYWRlIGRldGFjaDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5EYWxpIHdpbGwgdXBncmFkZSB5b3VyIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZnJvbSBKUEEgMS4wIHRvIDIuMC48L3A+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZDU0NWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNvbnZlcnNpb24gb2YgSmF2YSBQcm9qZWN0cyB0byBKUEEgUHJvamVjdHM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ29udmVyc2lvbiBvZiBKYXZhIFByb2plY3RzIHRvIEpQQSBQcm9qZWN0cyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNKQUJJSkVDIiBuYW1lPSJDSkFCSUpFQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q29udmVyc2lvbiBvZiBKYXZhIFByb2plY3RzIHRvIEpQQSBQcm9qZWN0czwvaDE+Ci08cD5UaGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wgbm93IHVzZXMgdGhlIEVjbGlwc2UgPHNwYW4gY2xhc3M9ImJvbGQiPkNvbmZpZ3VyZTwvc3Bhbj4gbWVudSB0byBjb252ZXJ0IGV4aXN0aW5nIEphdmEgcHJvamVjdHMgdG8gSlBBIHByb2plY3RzLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrczAwMS5odG0jQkVJQkFESEgiPiJDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzFmOTk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FY2xpcHNlTGluayAyLnggU3VwcG9ydDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFY2xpcHNlTGluayAyLnggU3VwcG9ydCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNKQUNKQkRBIiBuYW1lPSJDSkFDSkJEQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RWNsaXBzZUxpbmsgMi54IFN1cHBvcnQ8L2gxPgotPHA+UmVsZWFzZSAyLjMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgRWNsaXBzZUxpbmsgMi54IGZlYXR1cmVzLjwvcD4KLTxwPkVjbGlwc2VMaW5rICh0aGUgRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyBQcm9qZWN0KSBpcyBhIGNvbXBsZXRlIHBlcnNpc3RlbmNlIGZyYW1lIHdvcmsuIFJlZmVyIHRvIDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rLzwvYT48L2NvZGU+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMjg2N2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRhYmxlLXBlci1Db25jcmV0ZS1DbGFzcyBJbmhlcml0YW5jZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJUYWJsZS1wZXItQ29uY3JldGUtQ2xhc3MgSW5oZXJpdGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjI5MyIgbmFtZT0ic3RocmVmMjkzIj48L2E+Ci08aDE+VGFibGUtcGVyLUNvbmNyZXRlLUNsYXNzIEluaGVyaXRhbmNlPC9oMT4KLTxwPlRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbCBub3cgc3VwcG9ydHMgdGhlIEpQQSAxLjAtb3B0aW9uYWwgdGFibGUtcGVyLWNvbmNyZXRlLWNsYXNzIGluaGVyaXRhbmNlIG9wdGlvbi4gVGhpcyBmdW5jdGlvbmFsaXR5IG1heSBiZSByZXF1aXJlZCBpbiBKUEEgMi4wLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI5YTdjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlYzI5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDowOSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MjJmMDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuNC4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTYwNmIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODhiOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAidGlwc0FuZFRyaWNrc0hyZWYiIGNvbnRhaW5zIHRoZSBIZWxwIHRvcGljIGhyZWYgdG8gYSB0aXBzIGFuZCB0cmlja3MgcGFnZSAKLSMgb3B0aW9uYWwKLXRpcHNBbmRUcmlja3NIcmVmPS9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQotCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5tYXBwaW5ncyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwZTM2Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydFxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgT3JhY2xlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDYsIDIwMDkuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlNDU1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwOWMyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjNjBkMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5jbGFzc3BhdGggYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhZmVjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSJsaWIvcGVyc2lzdGVuY2UuamFyIiBzb3VyY2VwYXRoPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW5zcmMuemlwIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NjMxMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTE1NWY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDA3IDE0OjI2OjU0IEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQxYmMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNXZWQgQXByIDMwIDE3OjI0OjQxIEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3OGEwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBsaWIvcGVyc2lzdGVuY2UuamFyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IGphdmF4LnBlcnNpc3RlbmNlLAotIGphdmF4LnBlcnNpc3RlbmNlLnNwaSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MWY1ODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMj5BYm91dCBUaGlzIENvbnRlbnQ8L0gyPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IAotICBvdXQgYmVsb3cuIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgCi0gIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayAKLSAgdG8gdGhlIFJlZGlzdHJpYnV0b3ImIzgyMTc7cyBsaWNlbnNlIGZvciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotCi08aDQ+PGEgbmFtZT0iSlBBIiBpZD0iSlBBIj48L2E+SmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgdjEuMDwvaDQ+Ci0KLTxibG9ja3F1b3RlPgotICA8cD5UaGUgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgd2hpY2ggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgPGEgaHJlZj0iaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sIj5DRERMIAotICAgIHYxLjA8L2E+IGlzIHJlcXVpcmVkIGJ5IHRoZSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgUHJvamVjdCBpbiBvcmRlciAKLSAgICB0byBzdXBwb3J0IHRoaXMgc3RhbmRhcmQuPC9wPgotPC9ibG9ja3F1b3RlPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczYWMxYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2U9MS41Ci1qYXZhY1RhcmdldD0xLjUKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBsaWIvcGVyc2lzdGVuY2UuamFyLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9saWIvcGVyc2lzdGVuY2UuamFyIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2xpYi9wZXJzaXN0ZW5jZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWIyMzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2xpYi9wZXJzaXN0ZW5jZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NjhkMzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IC0gRERMIEdlbmVyYXRpb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2RkbGdlbi9NYWluLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2RkbGdlbi9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjFiZmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9kZGxnZW4vTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLQotLyoqIAotICogVGhpcyBjbGFzcyBjcmVhdGVzIGEgRWNsaXBzZUxpbmsgPGNvZGU+RW50aXR5TWFuYWdlckZhY3Rvcnk8L2NvZGU+LCAKLSAqIGFuZCBleGVjdXRlcyB0aGUgRERMIGdlbmVyYXRvciB3aXRoIHRoZSBjb21tYW5kIHNldCBpbiB0aGUgcHJvcGVydGllczogCi0gKiAgICAgPGNvZGU+ZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb24ub3V0cHV0LW1vZGU8L2NvZGU+IAotICogICAgIDxjb2RlPmVjbGlwc2VsaW5rLmFwcGxpY2F0aW9uLWxvY2F0aW9uPC9jb2RlPgotICogCi0gKiBDdXJyZW50IGNvbW1hbmQtbGluZSBhcmd1bWVudHM6Ci0gKiAgICAgWy1wdSBwdU5hbWVdIC0gcGVyc2lzdGVuY2UgdW5pdCBuYW1lCi0gKiAgICAgWy1wIHByb3BlcnRpZXNGaWxlUGF0aF0gLSBwcm9wZXJ0aWVzIGZvciBFY2xpcHNlTGluayBFbnRpdHlNYW5hZ2VyCi0gKiAgCi0gKiAgRXhhbXBsZSBvZiBhIHByb3BlcnRpZXMgZmlsZToKLSAqICAJZWNsaXBzZWxpbmsuamRiYy5iaW5kLXBhcmFtZXRlcnM9ZmFsc2UKLSAqICAJZWNsaXBzZWxpbmsuamRiYy5kcml2ZXI9b3JnLmFwYWNoZS5kZXJieS5qZGJjLkVtYmVkZGVkRHJpdmVyCi0gKiAgCWVjbGlwc2VsaW5rLmpkYmMudXJsPWpkYmNcOmRlcmJ5XDpjXDovZGVyYnlkYi90ZXN0ZGI7Y3JlYXRlXD10cnVlCi0gKiAgCWVjbGlwc2VsaW5rLmpkYmMudXNlcj10cmFuCi0gKiAgCWVjbGlwc2VsaW5rLmpkYmMucGFzc3dvcmQ9Ci0gKiAgCWVjbGlwc2VsaW5rLmxvZ2dpbmcubGV2ZWw9RklORVNUCi0gKiAgCWVjbGlwc2VsaW5rLmxvZ2dpbmcudGltZXN0YW1wPWZhbHNlCi0gKiAgCWVjbGlwc2VsaW5rLmxvZ2dpbmcudGhyZWFkPWZhbHNlCi0gKiAgCWVjbGlwc2VsaW5rLmxvZ2dpbmcuc2Vzc2lvbj1mYWxzZQotICogIAllY2xpcHNlbGluay5sb2dnaW5nLmV4Y2VwdGlvbnM9dHJ1ZQotICogIAllY2xpcHNlbGluay5vcm0udGhyb3cuZXhjZXB0aW9ucz10cnVlCi0gKiAgCWVjbGlwc2VsaW5rLmRkbC1nZW5lcmF0aW9uLm91dHB1dC1tb2RlPWRhdGFiYXNlCi0gKiAgCWVjbGlwc2VsaW5rLmRkbC1nZW5lcmF0aW9uPWRyb3AtYW5kLWNyZWF0ZS10YWJsZXMKLSAqICAJZWNsaXBzZWxpbmsuYXBwbGljYXRpb24tbG9jYXRpb249Y1w6L19Qcm9qZWN0c18vRXhhbXBsZURETAotICovCi1wdWJsaWMgY2xhc3MgTWFpbgotewotCXByb3RlY3RlZCBFbnRpdHlNYW5hZ2VyRmFjdG9yeSBlbWY7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGVjbGlwc2VMaW5rUHJvcGVydGllczsKLQlwcml2YXRlIFN0cmluZyBjcmVhdGVERExGaWxlTmFtZTsKLQlwcml2YXRlIFN0cmluZyBkcm9wRERMRmlsZU5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgYXBwTG9jYXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aDsKLQlwcml2YXRlIGJvb2xlYW4gaXNEZWJ1Z01vZGU7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJbmV3IE1haW4oKS5leGVjdXRlKGFyZ3MpOwotCX0KLQotCXByaXZhdGUgTWFpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKFN0cmluZ1tdIGFyZ3MpIHsKLQkJdGhpcy5pbml0aWFsaXplV2l0aChhcmdzKTsKLQkJCi0JCXRoaXMuZW1mID0gUGVyc2lzdGVuY2UuY3JlYXRlRW50aXR5TWFuYWdlckZhY3RvcnkodGhpcy5nZXRQVU5hbWUoYXJncyksIHRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzKTsKLQkJdGhpcy5wZXJmb3JtKCk7Ci0JCXRoaXMuY2xvc2VFbnRpdHlNYW5hZ2VyRmFjdG9yeSgpOwotCQkKLQkJdGhpcy5kaXNwb3NlKCk7Ci0JCXJldHVybjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybSgpIHsKLQkJLy8gY3JlYXRlIGFuIEVNIHRvIGdlbmVyYXRlIHNjaGVtYS4KLQkJdGhpcy5lbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpLmNsb3NlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNsb3NlRW50aXR5TWFuYWdlckZhY3RvcnkoKSB7Ci0JCXRoaXMuZW1mLmNsb3NlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplV2l0aChTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoID0gdGhpcy5nZXRFY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKGFyZ3MpOwotCQl0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcyh0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgpOwotCQkKLQkJdGhpcy5jcmVhdGVERExGaWxlTmFtZSA9IHRoaXMuZ2V0Q29uZmlnUHJvcGVydHlBc1N0cmluZyggCi0JCQkJCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0NSRUFURV9GSUxFX05BTUUsIAotCQkJCQkJdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMsICAKLQkJCQkJCVNjaGVtYUdlbmVyYXRpb24uREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9DUkVBVEVfRklMRV9OQU1FKTsKLQotCQl0aGlzLmRyb3BERExGaWxlTmFtZSA9IHRoaXMuZ2V0Q29uZmlnUHJvcGVydHlBc1N0cmluZygKLQkJCQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRFJPUF9GSUxFX05BTUUsIAotCQkJCQkJdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMsICAKLQkJCQkJCVNjaGVtYUdlbmVyYXRpb24uREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9EUk9QX0ZJTEVfTkFNRSk7IAotCQkKLQkJdGhpcy5hcHBMb2NhdGlvbiA9IHRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzLmdldCgKLQkJCQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfQVBQTElDQVRJT05fTE9DQVRJT04pOwotCi0JCXRoaXMuaXNEZWJ1Z01vZGUgPSB0aGlzLmdldERlYnVnTW9kZShhcmdzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJaWYoICEgdGhpcy5pc0RlYnVnTW9kZSkgewotCQkJbmV3IEZpbGUodGhpcy5hcHBMb2NhdGlvbiArICIvIiArIHRoaXMuY3JlYXRlRERMRmlsZU5hbWUpLmRlbGV0ZSgpOwotCQkJbmV3IEZpbGUodGhpcy5hcHBMb2NhdGlvbiArICIvIiArIHRoaXMuZHJvcERETEZpbGVOYW1lKS5kZWxldGUoKTsKLQkJCW5ldyBGaWxlKHRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCkuZGVsZXRlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb3BlcnRpZXMoU3RyaW5nIGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgpIHsKLQkJCi0JCVNldDxFbnRyeTxPYmplY3QsIE9iamVjdD4+IHByb3BlcnRpZXNTZXQgPSBudWxsOwotCQl0cnkgewotCQkJcHJvcGVydGllc1NldCA9IHRoaXMubG9hZEVjbGlwc2VMaW5rUHJvcGVydGllcyhlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk1pc3Npbmc6ICIgKyBlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoLCBlKTsKLQkJfQotCQkKLQkJTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWZvcihFbnRyeTxPYmplY3QsIE9iamVjdD4gcHJvcGVydHkgOiBwcm9wZXJ0aWVzU2V0KSB7Ci0JCQlwcm9wZXJ0aWVzLnB1dCgoU3RyaW5nKXByb3BlcnR5LmdldEtleSgpLCAoU3RyaW5nKXByb3BlcnR5LmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotICAgIHByaXZhdGUgU2V0PEVudHJ5PE9iamVjdCwgT2JqZWN0Pj4gbG9hZEVjbGlwc2VMaW5rUHJvcGVydGllcyhTdHJpbmcgZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgpOwotICAgICAgICAKLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcGVydGllcy5sb2FkKHN0cmVhbSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcHJvcGVydGllcy5lbnRyeVNldCgpOwotCX0KLQotCS8vICoqKioqKioqKiogYXJndW1lbnQgcXVlcmllcyAqKioqKioqKioqCi0gICAgCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UFVOYW1lKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5nZXRBcmd1bWVudFZhbHVlKCItcHUiLCBhcmdzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aChTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0QXJndW1lbnRWYWx1ZSgiLXAiLCBhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0RGVidWdNb2RlKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5hcmd1bWVudEV4aXN0cygiLWRlYnVnIiwgYXJncyk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEFyZ3VtZW50VmFsdWUoU3RyaW5nIGFyZ3VtZW50LCBTdHJpbmdbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGFyZ3VtZW50KSkgewotCQkJCWludCBqID0gaSArIDE7Ci0JCQkJaWYgKGogPCBhcmdzLmxlbmd0aCkgewotCQkJCQlyZXR1cm4gYXJnc1tqXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBhcmd1bWVudEV4aXN0cyhTdHJpbmcgYXJndW1lbnQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1tpXTsKLQkJCWlmIChhcmcudG9Mb3dlckNhc2UoKS5lcXVhbHMoYXJndW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vICoqKioqKiB1dGlsaXR5IG1ldGhvZHMgKioqKioqKgotCQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBwcm92aWRlZCBtYXAgZm9yIGFuIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBrZXkuICBJZiB0aGF0IG9iamVjdCBpcyBub3QgYXZhaWxhYmxlLCBjaGVjayB0aGUKLSAgICAgKiBTeXN0ZW0gcHJvcGVydGllcy4gIElmIGl0IGlzIG5vdCBhdmFpbGFibGUgZnJvbSBlaXRoZXIgbG9jYXRpb24sIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgCi0gICAgICogQHBhcmFtIG1hcCAKLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIAotICAgICAqIEByZXR1cm4gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdQcm9wZXJ0eUFzU3RyaW5nKFN0cmluZyBwcm9wZXJ0eUtleSwgTWFwPFN0cmluZywgU3RyaW5nPiBvdmVycmlkZXMsIFN0cmluZyBkZWZhdWx0VmFsdWUpewotICAgIAlTdHJpbmcgdmFsdWUgPSB0aGlzLmdldENvbmZpZ1Byb3BlcnR5QXNTdHJpbmcocHJvcGVydHlLZXksIG92ZXJyaWRlcyk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKXsKLSAgICAgICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdQcm9wZXJ0eUFzU3RyaW5nKFN0cmluZyBwcm9wZXJ0eUtleSwgTWFwPFN0cmluZywgU3RyaW5nPiBvdmVycmlkZXMpewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgICAgICBpZiAob3ZlcnJpZGVzICE9IG51bGwpewotICAgICAgICAgICAgdmFsdWUgPSAoU3RyaW5nKW92ZXJyaWRlcy5nZXQocHJvcGVydHlLZXkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKXsKLSAgICAgICAgICAgIHZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMjM5NTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTY0NDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhODgwZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjODc0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSNGcmkgSnVsIDMwIDEzOjE1OjE2IEVEVCAyMDEwCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMC54c2Q9VVRGOAotZW5jb2RpbmcvL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMS54c2Q9VVRGOAotZW5jb2RpbmcvL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMi54c2Q9VVRGOAotZW5jb2RpbmcvL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2Q9VVRGOAotZW5jb2RpbmcvL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMS54c2Q9VVRGOAotZW5jb2RpbmcvL3NjaGVtYXMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMi4xLnhzZD1VVEY4Ci1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2ZhNTAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNTdW4gRmViIDI0IDIxOjI1OjM0IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YmE5MTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS40LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmRiO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMTAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuNDAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuNC4xMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwyLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dCwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0sCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbiwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmdlbmVyYWwsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucywKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmRkbGdlbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmxpYnZhbCwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8yLmNvbnRleHQuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzIuY29udGV4dC5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQub3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5kZGxnZW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMS5jb250ZXh0Lm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEucmVzb3VyY2UuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEucmVzb3VyY2UuamF2YS5iaW5hcnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xLnJlc291cmNlLmphdmEuc291cmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucGxhdGZvcm0sCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0sCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzIsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAucmVzb3VyY2UuamF2YQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJhYmQ1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZT0xLjUKLWphdmFjVGFyZ2V0PTEuNQotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgc2NoZW1hcy8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IG1vZGVsLwotc3JjLmluY2x1ZGVzID0gbW9kZWwvLFwKLSAgICAgICAgICAgICAgIHNjaGVtYXMvCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9tb2RlbC9lY2xpcHNlTGlua1Jlc291cmNlTW9kZWxzLmdlbm1vZGVsIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvbW9kZWwvZWNsaXBzZUxpbmtSZXNvdXJjZU1vZGVscy5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFiMWFlMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9tb2RlbC9lY2xpcHNlTGlua1Jlc291cmNlTW9kZWxzLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYyIKLSAgICBjcmVhdGlvbkNvbW1hbmRzPSJmYWxzZSIgY3JlYXRpb25JY29ucz0iZmFsc2UiIGVkaXREaXJlY3Rvcnk9IiIgZWRpdG9yRGlyZWN0b3J5PSIiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUiIG1vZGVsTmFtZT0iRWNsaXBzZUxpbmtDb3JlIiBlZGl0UGx1Z2luQ2xhc3M9IiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0iIiB1cGRhdGVDbGFzc3BhdGg9ImZhbHNlIiByb290RXh0ZW5kc0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3QiCi0gICAgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdCIgc3VwcHJlc3NJbnRlcmZhY2VzPSJ0cnVlIgotICAgIHRlc3RzRGlyZWN0b3J5PSIiIHRlc3RTdWl0ZUNsYXNzPSIiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5lY29yZSIKLSAgICBjb21wbGlhbmNlTGV2ZWw9IjUuMCIgY29weXJpZ2h0RmllbGRzPSJmYWxzZSIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9qcGFSZXNvdXJjZU1vZGVscy5nZW5tb2RlbCMvL29ybSAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9qcGFSZXNvdXJjZU1vZGVscy5nZW5tb2RlbCMvL3htbCI+Ci0gIDxmb3JlaWduTW9kZWw+ZWNsaXBzZWxpbmtfb3JtLmVjb3JlPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkVjbGlwc2VMaW5rT3JtIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UiCi0gICAgICBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIiBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiIGVjb3JlUGFja2FnZT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZUNvb3JkaW5hdGlvblR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZUNvb3JkaW5hdGlvblR5cGUvU0VORF9PQkpFQ1RfQ0hBTkdFUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZUNvb3JkaW5hdGlvblR5cGUvSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVDb29yZGluYXRpb25UeXBlL1NFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0NhY2hlQ29vcmRpbmF0aW9uVHlwZS9OT05FIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL0ZVTEwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL1dFQUsiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL1NPRlQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL1NPRlRfV0VBSyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZVR5cGUvSEFSRF9XRUFLIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0NhY2hlVHlwZS9DQUNIRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZVR5cGUvTk9ORSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENoYW5nZVRyYWNraW5nVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENoYW5nZVRyYWNraW5nVHlwZS9BVFRSSUJVVEUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2hhbmdlVHJhY2tpbmdUeXBlL09CSkVDVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDaGFuZ2VUcmFja2luZ1R5cGUvREVGRVJSRUQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2hhbmdlVHJhY2tpbmdUeXBlL0FVVE8iLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxEaXJlY3Rpb24iPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxEaXJlY3Rpb24vSU4iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRGlyZWN0aW9uL09VVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxEaXJlY3Rpb24vSU5fT1VUIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbERpcmVjdGlvbi9PVVRfQ1VSU09SIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vRXhpc3RlbmNlVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0V4aXN0ZW5jZVR5cGUvQ0hFQ0tfQ0FDSEUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vRXhpc3RlbmNlVHlwZS9DSEVDS19EQVRBQkFTRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9FeGlzdGVuY2VUeXBlL0FTU1VNRV9FWElTVEVOQ0UiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vRXhpc3RlbmNlVHlwZS9BU1NVTUVfTk9OX0VYSVNURU5DRSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEpvaW5GZXRjaFR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxKb2luRmV0Y2hUeXBlL0lOTkVSIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEpvaW5GZXRjaFR5cGUvT1VURVIiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUvQUxMX0NPTFVNTlMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlL0NIQU5HRURfQ09MVU1OUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUvU0VMRUNURURfQ09MVU1OUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUvVkVSU0lPTl9DT0xVTU4iLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQWNjZXNzTWV0aG9kcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQWNjZXNzTWV0aG9kcy9nZXRNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxBY2Nlc3NNZXRob2RzL3NldE1ldGhvZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxBY2Nlc3NNZXRob2RzSG9sZGVyL2FjY2Vzc01ldGhvZHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQXR0cmlidXRlcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0F0dHJpYnV0ZXMvYmFzaWNDb2xsZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL2Jhc2ljTWFwcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL3RyYW5zZm9ybWF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL3ZhcmlhYmxlT25lVG9PbmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEJhc2ljIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxCYXNpY0NvbGxlY3Rpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEJhc2ljTWFwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQmF0Y2hGZXRjaCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQmF0Y2hGZXRjaEhvbGRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEJhdGNoRmV0Y2hIb2xkZXIvYmF0Y2hGZXRjaCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGUvZXhwaXJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGUvc2l6ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlL3NoYXJlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZS9hbHdheXNSZWZyZXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGUvcmVmcmVzaE9ubHlJZk5ld2VyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGUvZGlzYWJsZUhpdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZS9jb29yZGluYXRpb25UeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGUvZXhwaXJ5VGltZU9mRGF5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGVIb2xkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZUhvbGRlci9jYWNoZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlSG9sZGVyL2V4aXN0ZW5jZUNoZWNraW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENoYW5nZVRyYWNraW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDaGFuZ2VUcmFja2luZy90eXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDaGFuZ2VUcmFja2luZ0hvbGRlci9jaGFuZ2VUcmFja2luZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDbG9uZUNvcHlQb2xpY3kiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENsb25lQ29weVBvbGljeS9tZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDbG9uZUNvcHlQb2xpY3kvd29ya2luZ0NvcHlNZXRob2QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVyc2lvblZhbHVlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJzaW9uVmFsdWUvZGF0YVZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVyc2lvblZhbHVlL29iamVjdFZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGVyL2NsYXNzTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlckhvbGRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlckhvbGRlci9jb252ZXJ0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGVySG9sZGVyL3R5cGVDb252ZXJ0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGVySG9sZGVyL29iamVjdFR5cGVDb252ZXJ0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGVySG9sZGVyL3N0cnVjdENvbnZlcnRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlcnNIb2xkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJ0ZXJzSG9sZGVyL2NvbnZlcnRlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGVyc0hvbGRlci90eXBlQ29udmVydGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJ0ZXJzSG9sZGVyL29iamVjdFR5cGVDb252ZXJ0ZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlcnNIb2xkZXIvc3RydWN0Q29udmVydGVycyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJ0aWJsZU1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJ0aWJsZU1hcHBpbmcvY29udmVydCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb3B5UG9saWN5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb3B5UG9saWN5L2NsYXNzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ3VzdG9taXplciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ3VzdG9taXplci9jdXN0b21pemVyQ2xhc3NOYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ3VzdG9taXplckhvbGRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEN1c3RvbWl6ZXJIb2xkZXIvY3VzdG9taXplciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbGVtZW50Q29sbGVjdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVtYmVkZGFibGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbWJlZGRhYmxlL2NvcHlQb2xpY3kiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW1iZWRkYWJsZS9pbnN0YW50aWF0aW9uQ29weVBvbGljeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbWJlZGRhYmxlL2Nsb25lQ29weVBvbGljeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVtYmVkZGFibGUvZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVtYmVkZGVkIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbWJlZGRlZElkIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW50aXR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW50aXR5L29wdGltaXN0aWNMb2NraW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVudGl0eS9jb3B5UG9saWN5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVudGl0eS9pbnN0YW50aWF0aW9uQ29weVBvbGljeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbnRpdHkvY2xvbmVDb3B5UG9saWN5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW50aXR5L2V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxGZXRjaEF0dHJpYnV0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEZldGNoR3JvdXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxJZCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEluc3RhbnRpYXRpb25Db3B5UG9saWN5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxKb2luRmV0Y2giPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEpvaW5GZXRjaC9qb2luRmV0Y2giLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTWFueVRvTWFueSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE1hbnlUb09uZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL29wdGltaXN0aWNMb2NraW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvY29weVBvbGljeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL2luc3RhbnRpYXRpb25Db3B5UG9saWN5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvY2xvbmVDb3B5UG9saWN5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTWFwcGVkU3VwZXJjbGFzcy9leGNsdWRlRGVmYXVsdE1hcHBpbmdzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTXV0YWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTXV0YWJsZS9tdXRhYmxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTmFtZWRDb252ZXJ0ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkQ29udmVydGVyL25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS9yZXN1bHRDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkvcmVzdWx0U2V0TWFwcGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkvcHJvY2VkdXJlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkvcmV0dXJuc1Jlc3VsdFNldCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5L2hpbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkvcGFyYW1ldGVycyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPYmplY3RUeXBlQ29udmVydGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPYmplY3RUeXBlQ29udmVydGVyL2RhdGFUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sT2JqZWN0VHlwZUNvbnZlcnRlci9vYmplY3RUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9iamVjdFR5cGVDb252ZXJ0ZXIvY29udmVyc2lvblZhbHVlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9iamVjdFR5cGVDb252ZXJ0ZXIvZGVmYXVsdE9iamVjdFZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9uZVRvTWFueSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9uZVRvT25lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sT3B0aW1pc3RpY0xvY2tpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9wdGltaXN0aWNMb2NraW5nL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZy9jYXNjYWRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9wdGltaXN0aWNMb2NraW5nL3NlbGVjdGVkQ29sdW1ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcmRlckNvbHVtbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhL2V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUHJpbWFyeUtleSIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUHJpdmF0ZU93bmVkIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQcml2YXRlT3duZWQvcHJpdmF0ZU93bmVkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFByb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQcm9wZXJ0eS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUHJvcGVydHkvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQcm9wZXJ0eS92YWx1ZVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQcm9wZXJ0eUNvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFByb3BlcnR5Q29udGFpbmVyL3Byb3BlcnRpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxRdWVyeUNvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFF1ZXJ5Q29udGFpbmVyL25hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxRdWVyeVJlZGlyZWN0b3JzIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxSZWFkT25seSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUmVhZE9ubHkvcmVhZE9ubHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUmV0dXJuSW5zZXJ0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIvZGlyZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIvcXVlcnlQYXJhbWV0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci9qZGJjVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci9qZGJjVHlwZU5hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sU3RydWN0Q29udmVydGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxTdHJ1Y3RDb252ZXJ0ZXIvY29udmVydGVyIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFRpbWVPZkRheSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVGltZU9mRGF5L2hvdXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxUaW1lT2ZEYXkvbWludXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVGltZU9mRGF5L3NlY29uZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFRpbWVPZkRheS9taWxsaXNlY29uZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFRyYW5zZm9ybWF0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVHJhbnNpZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVHlwZUNvbnZlcnRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVHlwZUNvbnZlcnRlci9kYXRhVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFR5cGVDb252ZXJ0ZXIvb2JqZWN0VHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFZhcmlhYmxlT25lVG9PbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxWZXJzaW9uIi8+Ci0gICAgPG5lc3RlZEdlblBhY2thZ2VzIHByZWZpeD0iRWNsaXBzZUxpbmtPcm1WMV8xIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtIgotICAgICAgICBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIiBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiIGVjb3JlUGFja2FnZT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMSI+Ci0gICAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9JZFZhbGlkYXRpb25UeXBlXzFfMSI+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9JZFZhbGlkYXRpb25UeXBlXzFfMS9OVUxMIi8+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9JZFZhbGlkYXRpb25UeXBlXzFfMS9aRVJPIi8+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9JZFZhbGlkYXRpb25UeXBlXzFfMS9OT05FIi8+Ci0gICAgICA8L2dlbkVudW1zPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92MV8xL1htbEJhc2ljXzFfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9YbWxCYXNpY18xXzEvZ2VuZXJhdGVkVmFsdWUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9YbWxFbnRpdHlfMV8xIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92MV8xL1htbEVudGl0eV8xXzEvcHJpbWFyeUtleSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92MV8xL1htbE1hcHBlZFN1cGVyY2xhc3NfMV8xIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92MV8xL1htbE1hcHBlZFN1cGVyY2xhc3NfMV8xL3ByaW1hcnlLZXkiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9YbWxQcmltYXJ5S2V5XzFfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92MV8xL1htbFByaW1hcnlLZXlfMV8xL3ZhbGlkYXRpb24iLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92MV8xL1htbFByaW1hcnlLZXlfMV8xL2NvbHVtbnMiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8L25lc3RlZEdlblBhY2thZ2VzPgotICAgIDxuZXN0ZWRHZW5QYWNrYWdlcyBwcmVmaXg9IkVjbGlwc2VMaW5rT3JtVjJfMCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybSIKLSAgICAgICAgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIgYWRhcHRlckZhY3Rvcnk9ImZhbHNlIiBlY29yZVBhY2thZ2U9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAiPgotICAgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAiPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAvUkVBRCIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAvUkVBRF9XUklURSIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAvRVhDRVBUSU9OIi8+Ci0gICAgICA8L2dlbkVudW1zPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMC9tYXBLZXlDb252ZXJ0Ii8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sRW50aXR5XzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxFbnRpdHlfMl8wL2NhY2hlSW50ZXJjZXB0b3IiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbEVudGl0eV8yXzAvcXVlcnlSZWRpcmVjdG9ycyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbE1hbnlUb01hbnlfMl8wIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAvbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMC9jYWNoZUludGVyY2VwdG9yIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sT25lVG9NYW55XzJfMCIvPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbE9yZGVyQ29sdW1uXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbE9yZGVyQ29sdW1uXzJfMC9jb3JyZWN0aW9uVHlwZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAvYWxsUXVlcmllcyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC9yZWFkQWxsIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wL3JlYWRPYmplY3QiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAvcmVwb3J0Ii8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wL3VwZGF0ZSIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC9pbnNlcnQiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAvZGVsZXRlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPC9uZXN0ZWRHZW5QYWNrYWdlcz4KLSAgICA8bmVzdGVkR2VuUGFja2FnZXMgcHJlZml4PSJFY2xpcHNlTGlua09ybVYyXzEiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0iCi0gICAgICAgIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiIGFkYXB0ZXJGYWN0b3J5PSJmYWxzZSIgZmlsZUV4dGVuc2lvbnM9ImVjbGlwc2VsaW5rb3JtdjJfMSIKLSAgICAgICAgZWNvcmVQYWNrYWdlPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xIj4KLSAgICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL0NhY2hlS2V5VHlwZV8yXzEiPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvQ2FjaGVLZXlUeXBlXzJfMS9JRF9WQUxVRSIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvQ2FjaGVLZXlUeXBlXzJfMS9DQUNIRV9LRVkiLz4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL0NhY2hlS2V5VHlwZV8yXzEvQVVUTyIvPgotICAgICAgPC9nZW5FbnVtcz4KLSAgICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL0JhdGNoRmV0Y2hUeXBlXzJfMSI+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9CYXRjaEZldGNoVHlwZV8yXzEvSk9JTiIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvQmF0Y2hGZXRjaFR5cGVfMl8xL0VYSVNUUyIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvQmF0Y2hGZXRjaFR5cGVfMl8xL0lOIi8+Ci0gICAgICA8L2dlbkVudW1zPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEJhc2ljXzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxCYXNpY18yXzEvcmV0dXJuSW5zZXJ0Ii8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEJhc2ljXzJfMS9yZXR1cm5VcGRhdGUiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sQmFzaWNfMl8xL2F0dHJpYnV0ZVR5cGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxCYXRjaEZldGNoXzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEJhdGNoRmV0Y2hfMl8xL3NpemUiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sQmF0Y2hGZXRjaF8yXzEvYmF0Y2hGZXRjaFR5cGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEvYXR0cmlidXRlVHlwZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEVtYmVkZGFibGVfMl8xIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRW1iZWRkZWRfMl8xIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRW1iZWRkZWRfMl8xL2F0dHJpYnV0ZVR5cGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxFbWJlZGRlZElkXzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEVtYmVkZGVkSWRfMl8xL2F0dHJpYnV0ZVR5cGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxFbnRpdHlfMl8xIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEVudGl0eV8yXzEvY2xhc3NFeHRyYWN0b3IiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRW50aXR5XzJfMS9wYXJlbnRDbGFzcyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEVudGl0eU1hcHBpbmdzXzJfMSIvPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEZldGNoQXR0cmlidXRlXzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEZldGNoQXR0cmlidXRlXzJfMS9uYW1lIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRmV0Y2hHcm91cF8yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxGZXRjaEdyb3VwXzJfMS9uYW1lIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEZldGNoR3JvdXBfMl8xL2xvYWQiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEZldGNoR3JvdXBfMl8xL2F0dHJpYnV0ZXMiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEvZmV0Y2hHcm91cHMiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxJZF8yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxJZF8yXzEvYXR0cmlidXRlVHlwZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbE1hbnlUb01hbnlfMl8xIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sTWFueVRvTWFueV8yXzEvYXR0cmlidXRlVHlwZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbE1hbnlUb09uZV8yXzEiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMS9zcWxSZXN1bHRTZXRNYXBwaW5ncyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEvcXVlcnlSZWRpcmVjdG9ycyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMS9wYXJlbnRDbGFzcyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbE9uZVRvTWFueV8yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxPbmVUb01hbnlfMl8xL2F0dHJpYnV0ZVR5cGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxPbmVUb09uZV8yXzEiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxQcmltYXJ5S2V5XzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbFByaW1hcnlLZXlfMl8xL2NhY2hlS2V5VHlwZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbFJldHVybkluc2VydF8yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxSZXR1cm5JbnNlcnRfMl8xL3JldHVybk9ubHkiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxUcmFuc2Zvcm1hdGlvbl8yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxUcmFuc2Zvcm1hdGlvbl8yXzEvYXR0cmlidXRlVHlwZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbFZlcnNpb25fMl8xIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sVmVyc2lvbl8yXzEvYXR0cmlidXRlVHlwZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgIDwvbmVzdGVkR2VuUGFja2FnZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvbW9kZWwvZWNsaXBzZWxpbmtfb3JtLmVjb3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvbW9kZWwvZWNsaXBzZWxpbmtfb3JtLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmJjYTNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL21vZGVsL2VjbGlwc2VsaW5rX29ybS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDQ2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJvcm0iCi0gICAgbnNVUkk9ImpwdC5lY2xpcHNlbGluay5vcm0ueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBY2Nlc3NNZXRob2RzIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2V0TWV0aG9kIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXRNZXRob2QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWNjZXNzTWV0aG9kcyIgZVR5cGU9IiMvL1htbEFjY2Vzc01ldGhvZHMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQXR0cmlidXRlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIgIy8vWG1sUHJvcGVydHlDb250YWluZXIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdHRyaWJ1dGVzIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vQXR0cmlidXRlcyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2ljQ29sbGVjdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sQmFzaWNDb2xsZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2ljTWFwcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxCYXNpY01hcCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0cmFuc2Zvcm1hdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sVHJhbnNmb3JtYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFyaWFibGVPbmVUb09uZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sVmFyaWFibGVPbmVUb09uZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxCYXNpYyIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEJhc2ljICMvL3YyXzEvWG1sQmFzaWNfMl8xICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sTXV0YWJsZSAjLy9YbWxDb252ZXJ0aWJsZU1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxCYXNpY0NvbGxlY3Rpb24iIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sQXR0cmlidXRlTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhc2ljTWFwIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbEF0dHJpYnV0ZU1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxCYXRjaEZldGNoIiBlU3VwZXJUeXBlcz0iIy8vdjJfMS9YbWxCYXRjaEZldGNoXzJfMSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhdGNoRmV0Y2hIb2xkZXIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmF0Y2hGZXRjaCIgZVR5cGU9IiMvL1htbEJhdGNoRmV0Y2giCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ2FjaGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHBpcnkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNpemUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNoYXJlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSIjLy9DYWNoZVR5cGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx3YXlzUmVmcmVzaCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZnJlc2hPbmx5SWZOZXdlciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2FibGVIaXRzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29vcmRpbmF0aW9uVHlwZSIgZVR5cGU9IiMvL0NhY2hlQ29vcmRpbmF0aW9uVHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4cGlyeVRpbWVPZkRheSIgZVR5cGU9IiMvL1htbFRpbWVPZkRheSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ2FjaGVIb2xkZXIiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWNoZSIgZVR5cGU9IiMvL1htbENhY2hlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4aXN0ZW5jZUNoZWNraW5nIiBlVHlwZT0iIy8vRXhpc3RlbmNlVHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENoYW5nZVRyYWNraW5nIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9IiMvL1htbENoYW5nZVRyYWNraW5nVHlwZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDaGFuZ2VUcmFja2luZ0hvbGRlciIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGFuZ2VUcmFja2luZyIgZVR5cGU9IiMvL1htbENoYW5nZVRyYWNraW5nIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENsb25lQ29weVBvbGljeSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1ldGhvZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya2luZ0NvcHlNZXRob2QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvbnZlcnNpb25WYWx1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRhdGFWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvYmplY3RWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb252ZXJ0ZXIiIGVTdXBlclR5cGVzPSIjLy9YbWxOYW1lZENvbnZlcnRlciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsYXNzTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb252ZXJ0ZXJIb2xkZXIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udmVydGVyIiBlVHlwZT0iIy8vWG1sQ29udmVydGVyIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InR5cGVDb252ZXJ0ZXIiIGVUeXBlPSIjLy9YbWxUeXBlQ29udmVydGVyIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9iamVjdFR5cGVDb252ZXJ0ZXIiIGVUeXBlPSIjLy9YbWxPYmplY3RUeXBlQ29udmVydGVyIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0cnVjdENvbnZlcnRlciIgZVR5cGU9IiMvL1htbFN0cnVjdENvbnZlcnRlciIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb252ZXJ0ZXJzSG9sZGVyIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnZlcnRlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sQ29udmVydGVyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InR5cGVDb252ZXJ0ZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbFR5cGVDb252ZXJ0ZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib2JqZWN0VHlwZUNvbnZlcnRlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sT2JqZWN0VHlwZUNvbnZlcnRlciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdHJ1Y3RDb252ZXJ0ZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbFN0cnVjdENvbnZlcnRlciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb252ZXJ0aWJsZU1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQ29udmVydGlibGVNYXBwaW5nICMvL1htbENvbnZlcnRlckhvbGRlciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnZlcnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ29weVBvbGljeSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsYXNzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDdXN0b21pemVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VzdG9taXplckNsYXNzTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDdXN0b21pemVySG9sZGVyIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImN1c3RvbWl6ZXIiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQ2xhc3NSZWZlcmVuY2UiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRWxlbWVudENvbGxlY3Rpb24iIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxFbGVtZW50Q29sbGVjdGlvbiAjLy92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCAjLy92Ml8xL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVtYmVkZGFibGUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxFbWJlZGRhYmxlICMvL3YyXzEvWG1sRW1iZWRkYWJsZV8yXzEgIy8vWG1sQ3VzdG9taXplckhvbGRlciAjLy9YbWxDaGFuZ2VUcmFja2luZ0hvbGRlciAjLy9YbWxDb252ZXJ0ZXJzSG9sZGVyICMvL1htbFByb3BlcnR5Q29udGFpbmVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29weVBvbGljeSIgZVR5cGU9IiMvL1htbENvcHlQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjbG9uZUNvcHlQb2xpY3kiIGVUeXBlPSIjLy9YbWxDbG9uZUNvcHlQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVtYmVkZGVkIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sRW1iZWRkZWQgIy8vdjJfMS9YbWxFbWJlZGRlZF8yXzEgIy8vWG1sQXR0cmlidXRlTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVtYmVkZGVkSWQiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxFbWJlZGRlZElkICMvL3YyXzEvWG1sRW1iZWRkZWRJZF8yXzEgIy8vWG1sQXR0cmlidXRlTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEVudGl0eSAjLy92MV8xL1htbEVudGl0eV8xXzEgIy8vdjJfMC9YbWxFbnRpdHlfMl8wICMvL3YyXzEvWG1sRW50aXR5XzJfMSAjLy9YbWxSZWFkT25seSAjLy9YbWxDdXN0b21pemVySG9sZGVyICMvL1htbENoYW5nZVRyYWNraW5nSG9sZGVyICMvL1htbENhY2hlSG9sZGVyICMvL1htbENvbnZlcnRlcnNIb2xkZXIgIy8vWG1sUXVlcnlDb250YWluZXIgIy8vWG1sUHJvcGVydHlDb250YWluZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcHRpbWlzdGljTG9ja2luZyIgZVR5cGU9IiMvL1htbE9wdGltaXN0aWNMb2NraW5nIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvcHlQb2xpY3kiIGVUeXBlPSIjLy9YbWxDb3B5UG9saWN5IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imluc3RhbnRpYXRpb25Db3B5UG9saWN5IgotICAgICAgICBlVHlwZT0iIy8vWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2xvbmVDb3B5UG9saWN5IiBlVHlwZT0iIy8vWG1sQ2xvbmVDb3B5UG9saWN5IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbnRpdHlNYXBwaW5ncyIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzICMvL1htbENvbnZlcnRlcnNIb2xkZXIgIy8vWG1sUXVlcnlDb250YWluZXIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxGZXRjaEF0dHJpYnV0ZSIgZVN1cGVyVHlwZXM9IiMvL3YyXzEvWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRmV0Y2hHcm91cCIgZVN1cGVyVHlwZXM9IiMvL3YyXzEvWG1sRmV0Y2hHcm91cF8yXzEiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxJZCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbElkICMvL3YyXzEvWG1sSWRfMl8xICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sTXV0YWJsZSAjLy9YbWxDb252ZXJ0aWJsZU1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEpvaW5GZXRjaCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImpvaW5GZXRjaCIgZVR5cGU9IiMvL1htbEpvaW5GZXRjaFR5cGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvTWFueSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbE1hbnlUb01hbnkgIy8vdjJfMC9YbWxNYW55VG9NYW55XzJfMCAjLy92Ml8xL1htbE1hbnlUb01hbnlfMl8xICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sSm9pbkZldGNoIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvT25lIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sTWFueVRvT25lICMvL3YyXzEvWG1sTWFueVRvT25lXzJfMSAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbEpvaW5GZXRjaCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hcHBlZFN1cGVyY2xhc3MiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzICMvL3YxXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEgIy8vdjJfMC9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCAjLy92Ml8xL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8xICMvL1htbFJlYWRPbmx5ICMvL1htbEN1c3RvbWl6ZXJIb2xkZXIgIy8vWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIgIy8vWG1sQ2FjaGVIb2xkZXIgIy8vWG1sQ29udmVydGVyc0hvbGRlciAjLy9YbWxQcm9wZXJ0eUNvbnRhaW5lciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGltaXN0aWNMb2NraW5nIiBlVHlwZT0iIy8vWG1sT3B0aW1pc3RpY0xvY2tpbmciCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29weVBvbGljeSIgZVR5cGU9IiMvL1htbENvcHlQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjbG9uZUNvcHlQb2xpY3kiIGVUeXBlPSIjLy9YbWxDbG9uZUNvcHlQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE11dGFibGUiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtdXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTmFtZWRDb252ZXJ0ZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN1bHRDbGFzcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdWx0U2V0TWFwcGluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvY2VkdXJlTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmV0dXJuc1Jlc3VsdFNldCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImhpbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxRdWVyeUhpbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFyYW1ldGVycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT2JqZWN0VHlwZUNvbnZlcnRlciIgZVN1cGVyVHlwZXM9IiMvL1htbE5hbWVkQ29udmVydGVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF0YVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib2JqZWN0VHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb252ZXJzaW9uVmFsdWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbENvbnZlcnNpb25WYWx1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0T2JqZWN0VmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9NYW55IiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sT25lVG9NYW55ICMvL3YyXzAvWG1sT25lVG9NYW55XzJfMCAjLy92Ml8xL1htbE9uZVRvTWFueV8yXzEgIy8vWG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxQcml2YXRlT3duZWQgIy8vWG1sSm9pbkZldGNoIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9PbmUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxPbmVUb09uZSAjLy92Ml8xL1htbE9uZVRvT25lXzJfMSAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbFByaXZhdGVPd25lZCAjLy9YbWxKb2luRmV0Y2giLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPcHRpbWlzdGljTG9ja2luZyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSIjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FzY2FkZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbGVjdGVkQ29sdW1ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQ29sdW1uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9yZGVyQ29sdW1uIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sT3JkZXJDb2x1bW4gIy8vdjJfMC9YbWxPcmRlckNvbHVtbl8yXzAiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzICMvL3YyXzEvWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQcmltYXJ5S2V5IiBlU3VwZXJUeXBlcz0iIy8vdjFfMS9YbWxQcmltYXJ5S2V5XzFfMSAjLy92Ml8xL1htbFByaW1hcnlLZXlfMl8xIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUHJpdmF0ZU93bmVkIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJpdmF0ZU93bmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUHJvcGVydHkiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQcm9wZXJ0eUNvbnRhaW5lciIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9wZXJ0aWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbFByb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFF1ZXJ5Q29udGFpbmVyIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUXVlcnlSZWRpcmVjdG9ycyIgZVN1cGVyVHlwZXM9IiMvL3YyXzAvWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxSZWFkT25seSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYWRPbmx5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUmV0dXJuSW5zZXJ0IiBlU3VwZXJUeXBlcz0iIy8vdjJfMS9YbWxSZXR1cm5JbnNlcnRfMl8xIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlyZWN0aW9uIiBlVHlwZT0iIy8vWG1sRGlyZWN0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InF1ZXJ5UGFyYW1ldGVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqZGJjVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamRiY1R5cGVOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxTdHJ1Y3RDb252ZXJ0ZXIiIGVTdXBlclR5cGVzPSIjLy9YbWxOYW1lZENvbnZlcnRlciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnZlcnRlciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUaW1lT2ZEYXkiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJob3VyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludE9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW51dGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY29uZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWlsbGlzZWNvbmQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFRyYW5zZm9ybWF0aW9uIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL3YyXzEvWG1sVHJhbnNmb3JtYXRpb25fMl8xICMvL1htbEF0dHJpYnV0ZU1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUcmFuc2llbnQiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxUcmFuc2llbnQgIy8vWG1sQXR0cmlidXRlTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFR5cGVDb252ZXJ0ZXIiIGVTdXBlclR5cGVzPSIjLy9YbWxOYW1lZENvbnZlcnRlciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRhdGFUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9iamVjdFR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVmFyaWFibGVPbmVUb09uZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVmVyc2lvbiIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbFZlcnNpb24gIy8vdjJfMS9YbWxWZXJzaW9uXzJfMSAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbE11dGFibGUgIy8vWG1sQ29udmVydGlibGVNYXBwaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJDYWNoZUNvb3JkaW5hdGlvblR5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU0VORF9PQkpFQ1RfQ0hBTkdFUyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5PTkUiIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iQ2FjaGVUeXBlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkZVTEwiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IldFQUsiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJTT0ZUIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU09GVF9XRUFLIiB2YWx1ZT0iMyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSEFSRF9XRUFLIiB2YWx1ZT0iNCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0FDSEUiIHZhbHVlPSI1Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJOT05FIiB2YWx1ZT0iNiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlhtbENoYW5nZVRyYWNraW5nVHlwZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJBVFRSSUJVVEUiIGxpdGVyYWw9IkFUVFJJQlVURSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iT0JKRUNUIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iREVGRVJSRUQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJBVVRPIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlhtbERpcmVjdGlvbiI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJTiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iT1VUIiB2YWx1ZT0iMSIgbGl0ZXJhbD0iT1VUIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJTl9PVVQiIHZhbHVlPSIyIiBsaXRlcmFsPSJJTl9PVVQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9VVF9DVVJTT1IiIHZhbHVlPSIzIiBsaXRlcmFsPSJPVVRfQ1VSU09SIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iRXhpc3RlbmNlVHlwZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJDSEVDS19DQUNIRSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0hFQ0tfREFUQUJBU0UiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJBU1NVTUVfRVhJU1RFTkNFIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQVNTVU1FX05PTl9FWElTVEVOQ0UiIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iWG1sSm9pbkZldGNoVHlwZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJTk5FUiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iT1VURVIiIHZhbHVlPSIxIiBsaXRlcmFsPSJPVVRFUiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJBTExfQ09MVU1OUyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0hBTkdFRF9DT0xVTU5TIiB2YWx1ZT0iMSIgbGl0ZXJhbD0iQ0hBTkdFRF9DT0xVTU5TIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJTRUxFQ1RFRF9DT0xVTU5TIiB2YWx1ZT0iMiIgbGl0ZXJhbD0iU0VMRUNURURfQ09MVU1OUyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iVkVSU0lPTl9DT0xVTU4iIHZhbHVlPSIzIiBsaXRlcmFsPSJWRVJTSU9OX0NPTFVNTiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVTdWJwYWNrYWdlcyBuYW1lPSJ2MV8xIiBuc1VSST0ianB0LmVjbGlwc2VsaW5rLm9ybS52MV8xLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xIj4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhc2ljXzFfMSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgICAgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEdlbmVyYXRvckNvbnRhaW5lciI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ2VuZXJhdGVkVmFsdWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sR2VuZXJhdGVkVmFsdWUiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5XzFfMSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJpbWFyeUtleSIgZVR5cGU9IiMvL1htbFByaW1hcnlLZXkiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmltYXJ5S2V5IiBlVHlwZT0iIy8vWG1sUHJpbWFyeUtleSIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUHJpbWFyeUtleV8xXzEiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbGlkYXRpb24iIGVUeXBlPSIjLy92MV8xL0lkVmFsaWRhdGlvblR5cGVfMV8xIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29sdW1ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxDb2x1bW4iCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJJZFZhbGlkYXRpb25UeXBlXzFfMSI+Ci0gICAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5VTEwiLz4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iWkVSTyIgdmFsdWU9IjIiLz4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iTk9ORSIgdmFsdWU9IjIiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgPC9lU3VicGFja2FnZXM+Ci0gIDxlU3VicGFja2FnZXMgbmFtZT0idjJfMCIgbnNVUkk9ImpwdC5lY2xpcHNlbGluay5vcm0udjJfMC54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMCI+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXBLZXlDb252ZXJ0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbENvbnZlcnRpYmxlTWFwcGluZyAjLy9YbWxDb252ZXJ0ZXJzSG9sZGVyICMvL3YyXzAvWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wIi8+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbnRpdHlfMl8wIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgICBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vdjJfMC9YbWxFbnRpdHlfMl8wIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWNoZUludGVyY2VwdG9yIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbENsYXNzUmVmZXJlbmNlIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJxdWVyeVJlZGlyZWN0b3JzIiBlVHlwZT0iIy8vWG1sUXVlcnlSZWRpcmVjdG9ycyIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYW55VG9NYW55XzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbENvbnZlcnRlckhvbGRlciAjLy92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMCIvPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAiCi0gICAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzIgotICAgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEFzc29jaWF0aW9uT3ZlcnJpZGUiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vdjJfMC9YbWxDYWNoZWFibGVfMl8wIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWNoZUludGVyY2VwdG9yIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbENsYXNzUmVmZXJlbmNlIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9uZVRvTWFueV8yXzAiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9YbWxDb252ZXJ0ZXJIb2xkZXIgIy8vdjJfMC9YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAiLz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9yZGVyQ29sdW1uXzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29ycmVjdGlvblR5cGUiIGVUeXBlPSIjLy92Ml8wL09yZGVyQ29ycmVjdGlvblR5cGVfMl8wIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWxsUXVlcmllcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYWRBbGwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWFkT2JqZWN0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVwb3J0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXBkYXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5zZXJ0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVsZXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9Ik9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIj4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iUkVBRCIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJSRUFEX1dSSVRFIiB2YWx1ZT0iMSIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJFWENFUFRJT04iIHZhbHVlPSIyIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDwvZVN1YnBhY2thZ2VzPgotICA8ZVN1YnBhY2thZ2VzIG5hbWU9InYyXzEiIG5zVVJJPSJqcHQuZWNsaXBzZWxpbmsub3JtLnYyXzEueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEiPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmFzaWNfMl8xIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgICBlU3VwZXJUeXBlcz0iIy8vdjFfMS9YbWxCYXNpY18xXzEiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldHVybkluc2VydCIgZVR5cGU9IiMvL1htbFJldHVybkluc2VydCIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmV0dXJuVXBkYXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRyaWJ1dGVUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmF0Y2hGZXRjaF8yXzEiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNpemUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmF0Y2hGZXRjaFR5cGUiIGVUeXBlPSIjLy92Ml8xL0JhdGNoRmV0Y2hUeXBlXzJfMSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sSm9pbkZldGNoICMvL1htbEJhdGNoRmV0Y2hIb2xkZXIiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dHJpYnV0ZVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbWJlZGRhYmxlXzJfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIiLz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVtYmVkZGVkXzJfMSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0cmlidXRlVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVtYmVkZGVkSWRfMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRyaWJ1dGVUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5XzJfMSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIgIy8vdjJfMS9YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2xhc3NFeHRyYWN0b3IiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQ2xhc3NSZWZlcmVuY2UiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmVudENsYXNzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5TWFwcGluZ3NfMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sQWNjZXNzTWV0aG9kc0hvbGRlciIvPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxGZXRjaEdyb3VwXzJfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvYWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF0dHJpYnV0ZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy9YbWxGZXRjaEF0dHJpYnV0ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZldGNoR3JvdXBzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgICBlVHlwZT0iIy8vWG1sRmV0Y2hHcm91cCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSWRfMl8xIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRyaWJ1dGVUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvTWFueV8yXzEiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9YbWxCYXRjaEZldGNoSG9sZGVyIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRyaWJ1dGVUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvT25lXzJfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbEJhdGNoRmV0Y2hIb2xkZXIiLz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciAjLy92Ml8xL1htbEZldGNoR3JvdXBDb250YWluZXJfMl8xIC4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEdlbmVyYXRvckNvbnRhaW5lciAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxRdWVyeUNvbnRhaW5lciAjLy9YbWxRdWVyeUNvbnRhaW5lciAjLy9YbWxBY2Nlc3NNZXRob2RzSG9sZGVyIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzcWxSZXN1bHRTZXRNYXBwaW5ncyIKLSAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9TcWxSZXN1bHRTZXRNYXBwaW5nIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJxdWVyeVJlZGlyZWN0b3JzIiBlVHlwZT0iIy8vWG1sUXVlcnlSZWRpcmVjdG9ycyIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFyZW50Q2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPbmVUb01hbnlfMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sQmF0Y2hGZXRjaEhvbGRlciI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0cmlidXRlVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9uZVRvT25lXzJfMSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEJhdGNoRmV0Y2hIb2xkZXIiLz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIiLz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFByaW1hcnlLZXlfMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWNoZUtleVR5cGUiIGVUeXBlPSIjLy92Ml8xL0NhY2hlS2V5VHlwZV8yXzEiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFJldHVybkluc2VydF8yXzEiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJldHVybk9ubHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVHJhbnNmb3JtYXRpb25fMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRyaWJ1dGVUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVmVyc2lvbl8yXzEiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dHJpYnV0ZVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkNhY2hlS2V5VHlwZV8yXzEiPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJJRF9WQUxVRSIgbGl0ZXJhbD0iSURfVkFMVUUiLz4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0FDSEVfS0VZIiB2YWx1ZT0iMSIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJBVVRPIiB2YWx1ZT0iMiIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJCYXRjaEZldGNoVHlwZV8yXzEiPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJKT0lOIi8+Ci0gICAgICA8ZUxpdGVyYWxzIG5hbWU9IkVYSVNUUyIgdmFsdWU9IjEiLz4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU4iIHZhbHVlPSIyIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDwvZVN1YnBhY2thZ2VzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDg5MWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgLSBDb3JlCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlQgPSBFY2xpcHNlTGluayBYTUwgbWFwcGluZyBmaWxlcwotCi1FQ0xJUFNFTElOS19QTEFURk9STV9HUk9VUF9MQUJFTD1FY2xpcHNlTGluawotRUNMSVBTRUxJTksxXzBfeF9QTEFURk9STSA9IEVjbGlwc2VMaW5rIDEuMC54Ci1FQ0xJUFNFTElOSzFfMV94X1BMQVRGT1JNID0gRWNsaXBzZUxpbmsgMS4xLngKLUVDTElQU0VMSU5LMV8yX3hfUExBVEZPUk0gPSBFY2xpcHNlTGluayAxLjIueAotRUNMSVBTRUxJTksyXzBfeF9QTEFURk9STSA9IEVjbGlwc2VMaW5rIDIuMC54Ci1FQ0xJUFNFTElOSzJfMV94X1BMQVRGT1JNID0gRWNsaXBzZUxpbmsgMi4xLngKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWFlNTlmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSAgQ29udHJpYnV0b3JzOgotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotCi08cGx1Z2luPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUuY29udGVudFR5cGVzIj4KLQkJCi0JCTxjb250ZW50LXR5cGUKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZW50Lm9ybSIKLQkJCW5hbWU9IiVFQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlQiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRlbnQubWFwcGluZ0ZpbGUiPgotCQkJPGRlc2NyaWJlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5YTUxSb290RWxlbWVudENvbnRlbnREZXNjcmliZXIyIj4KLQkJCQk8cGFyYW1ldGVyIAotCQkJCQluYW1lPSJlbGVtZW50IiAKLQkJCQkJdmFsdWU9IntodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtfWVudGl0eS1tYXBwaW5ncyIvPgotCQkJPC9kZXNjcmliZXI+Ci0JCTwvY29udGVudC10eXBlPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGFQbGF0Zm9ybXMiPgotCQkKLQkJPGpwYVBsYXRmb3JtR3JvdXAKLSAgICAgICAgCWlkPSJlY2xpcHNlbGluayIKLSAgICAgICAgCWxhYmVsPSIlRUNMSVBTRUxJTktfUExBVEZPUk1fR1JPVVBfTEFCRUwiLz4KLQkJCi0JCTxqcGFQbGF0Zm9ybQotCQkJaWQ9Im9yZy5lY2xpcHNlLmVjbGlwc2VsaW5rLnBsYXRmb3JtIgotICAgICAgICAgICAgbGFiZWw9IiVFQ0xJUFNFTElOSzFfMF94X1BMQVRGT1JNIgotCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVBsYXRmb3JtRmFjdG9yeSIKLQkJCWdyb3VwPSJlY2xpcHNlbGluayIKLQkJCWpwYUZhY2V0VmVyc2lvbj0iMS4wIi8+Ci0JICAgIAotCSAgICA8anBhUGxhdGZvcm0KLQkgICAgICAgIGlkPSJlY2xpcHNlbGluazFfMSIKLQkgICAgICAgIGxhYmVsPSIlRUNMSVBTRUxJTksxXzFfeF9QTEFURk9STSIKLQkgICAgICAgIGZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtRmFjdG9yeSIKLQkgICAgICAgIGdyb3VwPSJlY2xpcHNlbGluayIKLQkJCWpwYUZhY2V0VmVyc2lvbj0iMS4wIi8+Ci0JICAgIAotCSAgICA8anBhUGxhdGZvcm0KLQkJCWlkPSJlY2xpcHNlbGluazFfMiIKLQkJCWxhYmVsPSIlRUNMSVBTRUxJTksxXzJfeF9QTEFURk9STSIKLQkJCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMi5FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtRmFjdG9yeSIKLQkJCWdyb3VwPSJlY2xpcHNlbGluayIKLQkJCWpwYUZhY2V0VmVyc2lvbj0iMS4wIi8+Ci0JCQotCSAgICA8anBhUGxhdGZvcm0KLQkgICAgICAgIGlkPSJlY2xpcHNlbGluazJfMCIKLQkgICAgICAgIGxhYmVsPSIlRUNMSVBTRUxJTksyXzBfeF9QTEFURk9STSIKLQkgICAgICAgIGZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtRmFjdG9yeSIKLQkgICAgICAgIGdyb3VwPSJlY2xpcHNlbGluayIKLQkJCWpwYUZhY2V0VmVyc2lvbj0iMi4wIi8+Ci0JCQotCQk8anBhUGxhdGZvcm0KLQkgICAgICAgIGlkPSJlY2xpcHNlbGluazJfMSIKLQkgICAgICAgIGxhYmVsPSIlRUNMSVBTRUxJTksyXzFfeF9QTEFURk9STSIKLQkgICAgICAgIGZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMS5FY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtRmFjdG9yeSIKLQkgICAgICAgIGdyb3VwPSJlY2xpcHNlbGluayIKLQkJCWpwYUZhY2V0VmVyc2lvbj0iMi4wIi8+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmxpYnJhcnlWYWxpZGF0b3JzIj4KLQkJCi0JCTxsaWJyYXJ5VmFsaWRhdG9yCi0JCQlpZD0iZWNsaXBzZWxpbmtMaWJyYXJ5VmFsaWRhdG9yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmxpYnZhbC5FY2xpcHNlTGlua1VzZXJMaWJyYXJ5VmFsaWRhdG9yIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxhbmQ+Ci0JCQkJCTx3aXRoIHZhcmlhYmxlPSJsaWJyYXJ5UHJvdmlkZXIiPgotCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmV4dGVuZHNJZCIgdmFsdWU9ImpwYS11c2VyLWxpYnJhcnktcHJvdmlkZXIiLz4KLQkJCQkJPC93aXRoPgotCQkJCQk8d2l0aCB2YXJpYWJsZT0iY29uZmlnIj4KLQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGFQbGF0Zm9ybUdyb3VwIiB2YWx1ZT0iZWNsaXBzZWxpbmsiLz4KLQkJCQkJPC93aXRoPgotCQkJCTwvYW5kPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2xpYnJhcnlWYWxpZGF0b3I+Ci0JCQotCQk8bGlicmFyeVZhbGlkYXRvcgotCQkJaWQ9ImVjbGlwc2VsaW5rRWNsaXBzZWxpbmtCdW5kbGVzTGlicmFyeVZhbGlkYXRvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5saWJ2YWwuRWNsaXBzZUxpbmtFY2xpcHNlTGlua0J1bmRsZXNMaWJyYXJ5VmFsaWRhdG9yIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxhbmQ+Ci0JCQkJCTx3aXRoIHZhcmlhYmxlPSJsaWJyYXJ5UHJvdmlkZXIiPgotCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmV4dGVuZHNJZCIgdmFsdWU9ImVjbGlwc2VsaW5rLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIvPgotCQkJCQk8L3dpdGg+Ci0JCQkJCTx3aXRoIHZhcmlhYmxlPSJjb25maWciPgotCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYVBsYXRmb3JtR3JvdXAiIHZhbHVlPSJlY2xpcHNlbGluayIvPgotCQkJCQk8L3dpdGg+Ci0JCQkJPC9hbmQ+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvbGlicmFyeVZhbGlkYXRvcj4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPCEtLQotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSogTGlicmFyeSBQcm92aWRlciBGcmFtZXdvcmsgSW50ZWdyYXRpb24gKgotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCS0tPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmRvd25sb2FkYWJsZUxpYnJhcmllcyI+Ci0JCQotCQk8aW1wb3J0LWRlZmluaXRpb25zIAotCQkJdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGkvZGV2L2VjbGlwc2VsaW5rL2VjbGlwc2VsaW5rLWRvd25sb2FkYWJsZS1saWJzLnhtbCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0icmVxdWVzdGluZ1Byb2plY3RGYWNldCI+Ci0JCQkJCTx0ZXN0IAotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgCi0JCQkJCQl2YWx1ZT0ianB0LmpwYSIgCi0JCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvaW1wb3J0LWRlZmluaXRpb25zPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uIAotCQlwb2ludD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicmFyeVByb3ZpZGVycyI+Ci0JCQotCQk8cHJvdmlkZXIgCi0JCQlpZD0ianBhLWVjbGlwc2VsaW5rMV8wLXVzZXItbGlicmFyeS1wcm92aWRlciIgCi0JCQlleHRlbmRzPSJqcGEtZGVwcmVjYXRlZC11c2VyLWxpYnJhcnktcHJvdmlkZXIiCi0JCQloaWRkZW49InRydWUiPgotCQk8L3Byb3ZpZGVyPgotCQkKLQkJPHByb3ZpZGVyIAotCQkJaWQ9ImpwYS1lY2xpcHNlbGluazFfMS11c2VyLWxpYnJhcnktcHJvdmlkZXIiIAotCQkJZXh0ZW5kcz0ianBhLWRlcHJlY2F0ZWQtdXNlci1saWJyYXJ5LXByb3ZpZGVyIgotCQkJaGlkZGVuPSJ0cnVlIj4KLQkJPC9wcm92aWRlcj4KLQkJCi0JCTxwcm92aWRlciAKLQkJCWlkPSJqcGEtZWNsaXBzZWxpbmsxXzItdXNlci1saWJyYXJ5LXByb3ZpZGVyIiAKLQkJCWV4dGVuZHM9ImpwYS1kZXByZWNhdGVkLXVzZXItbGlicmFyeS1wcm92aWRlciIKLQkJCWhpZGRlbj0idHJ1ZSI+Ci0JCTwvcHJvdmlkZXI+Ci0JCQotCQk8cHJvdmlkZXIgCi0JCQlpZD0iZWNsaXBzZWxpbmsyXzAtdXNlci1saWJyYXJ5LXByb3ZpZGVyIiAKLQkJCWV4dGVuZHM9ImpwYS1kZXByZWNhdGVkLXVzZXItbGlicmFyeS1wcm92aWRlciIKLQkJCWhpZGRlbj0idHJ1ZSI+Ci0JCTwvcHJvdmlkZXI+Ci0JCQotCQk8cHJvdmlkZXIgCi0JCQlpZD0ianBhLWVjbGlwc2VsaW5rMl8xLXVzZXItbGlicmFyeS1wcm92aWRlciIgCi0JCQlleHRlbmRzPSJqcGEtZGVwcmVjYXRlZC11c2VyLWxpYnJhcnktcHJvdmlkZXIiCi0JCQloaWRkZW49InRydWUiPgotCQk8L3Byb3ZpZGVyPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8IS0tICoqKioqIFdUUCBleHRlbnNpb25zICoqKioqIC0tPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnJlc291cmNlRmFjdG9yaWVzIj4KLQkJCi0JCTxyZXNvdXJjZUZhY3RvcnkKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZUZhY3RvcnkiCi0JCQlpc0RlZmF1bHQ9InRydWUiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRlbnQub3JtIj4KLQkJCTwvY29udGVudFR5cGVCaW5kaW5nPgotCQk8L3Jlc291cmNlRmFjdG9yeT4KLQkgICAgCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbiAKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jYXRhbG9nQ29udHJpYnV0aW9ucyI+Ci0JCQotCQk8Y2F0YWxvZ0NvbnRyaWJ1dGlvbiBpZD0iZGVmYXVsdCI+Ci0JCQkKLQkJCTxwdWJsaWMKLQkJCQlwdWJsaWNJZD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMS54c2QiLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMV8wLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMC54c2QiIC8+Ci0JCQkKLQkJCTx1cmkKLQkJCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3JtXzFfMS54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzEueHNkIiAvPgotCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX29ybV8xXzIueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8yLnhzZCIgLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl8wLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QiIC8+Ci0JCQkKLQkJCTx1cmkKLQkJCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3JtXzJfMS54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzEueHNkIiAvPgotCQkJCi0JCQk8cHVibGljCi0JCQkJcHVibGljSWQ9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9veG0iCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX294bV8yXzEueHNkIi8+Ci0KLQkJCTx1cmkKLQkJCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3htXzJfMC54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX294bV8yXzAueHNkIiAvPgotCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX294bV8yXzEueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8xLnhzZCIgLz4KLQkJCQkKLQkJCTxwdWJsaWMKLQkJCQlwdWJsaWNJZD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8xLnhzZCIvPgkJCQkKLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4wLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzEuMC54c2QiIC8+Ci0JCQkKLQkJCTx1cmkKLQkJCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzEuMS54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjEueHNkIiAvPgotCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjIueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4yLnhzZCIgLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMi4wLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzIuMC54c2QiIC8+Ci0JCQkJCi0JCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMC54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMC54c2QiIC8+Ci0JCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMS54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMS54c2QiIC8+CQotCQkJCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMi54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMi54c2QiIC8+Ci0JCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMC54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMC54c2QiIC8+CQotCQkJCi0JCTwvY2F0YWxvZ0NvbnRyaWJ1dGlvbj4KLQkJCi0gICAgPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2VjbGlwc2VsaW5rX2pwYV92YWxpZGF0aW9uLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua19qcGFfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzhkY2Q1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2VjbGlwc2VsaW5rX2pwYV92YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQ0FDSEVfRVhQSVJZX0FORF9FWFBJUllfVElNRV9PRl9EQVlfQk9USF9TUEVDSUZJRUQ9VGhlIEBDYWNoZSBhbm5vdGF0aW9uIG9uIGVudGl0eSBcInswfVwiIGhhcyBib3RoIGV4cGlyeSgpIGFuZCBleHBpcnlUaW1lT2ZEYXkoKSBzcGVjaWZpZWQuIE9ubHkgb25lIG9mIHRoZSB0d28gbWF5IGJlIHNwZWNpZmllZAotQ09OVkVSVEVSX0NMQVNTX0lNUExFTUVOVFNfQ09OVkVSVEVSPVRoZSBjb252ZXJ0ZXIgY2xhc3MgXCJ7MH1cIiBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyIGludGVyZmFjZQotQ1VTVE9NSVpFUl9DTEFTU19JTVBMRU1FTlRTX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUj1UaGUgY3VzdG9taXplciBjbGFzcyBcInswfVwiIGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLkRlc2NyaXB0b3JDdXN0b21pemVyIGludGVyZmFjZQotTVVMVElQTEVfT0JKRUNUX1ZBTFVFU19GT1JfREFUQV9WQUxVRT1NdWx0aXBsZSBvYmplY3QgdmFsdWVzIGFyZSBzcGVjaWZpZWQgZm9yIHRoZSBkYXRhIHZhbHVlIFwiezB9XCIKLVBFUlNJU1RFTkNFX1VOSVRfTEVHQUNZX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUj1cInswfVwiIGlzIGEgbGVnYWN5IGRlc2NyaXB0b3IgY3VzdG9taXplciBwcm9wZXJ0eS4gQ29uc2lkZXIgbWlncmF0aW9uIHRvIHRoZSBFY2xpcHNlTGluayBjdXN0b21pemVyIHNldHRpbmdzIHZpYSBhbm5vdGF0aW9uIG9yIFhNTCBtYXBwaW5nIGZpbGUKLVBFUlNJU1RFTkNFX1VOSVRfTEVHQUNZX0VOVElUWV9DQUNISU5HPVwiezB9XCIgaXMgYSBsZWdhY3kgZW50aXR5IGNhY2hpbmcgcHJvcGVydHkuIENvbnNpZGVyIG1pZ3JhdGlvbiB0byBKUEEgMi4wIGFuZCBFY2xpcHNlTGluayBjYWNoZSBzZXR0aW5ncyB2aWEgYW5ub3RhdGlvbiBvciBYTUwgbWFwcGluZyBmaWxlCi1QRVJTSVNURU5DRV9VTklUX0NBQ0hJTkdfUFJPUEVSVFlfSUdOT1JFRD1Qcm9wZXJ0eSBcInswfVwiIHdpbGwgYmUgaWdub3JlZCBhcyBzaGFyZWQtY2FjaGUtbW9kZSBpcyBzZXQgdG8gTk9ORQotQkFTSUNfQ09MTEVDVElPTl9NQVBQSU5HX0RFUFJFQ0FURUQ9VGhlIHR5cGUgYmFzaWMtY29sbGVjdGlvbiBpcyBkZXByZWNhdGVkCi1CQVNJQ19NQVBfTUFQUElOR19ERVBSRUNBVEVEPVRoZSB0eXBlIGJhc2ljLW1hcCBpcyBkZXByZWNhdGVkCi1UWVBFX01BUFBJTkdfTUVNQkVSX0NMQVNTX05PVF9TVEFUSUM9VGhlIGphdmEgY2xhc3MgZm9yIG1hcHBlZCB0eXBlIFwiezB9XCIgaXMgYSBub24tc3RhdGljIG1lbWJlciBjbGFzcyAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwdF9lY2xpcHNlbGlua19jb3JlLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9wcm9wZXJ0eV9maWxlcy9qcHRfZWNsaXBzZWxpbmtfY29yZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDE3M2IzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwdF9lY2xpcHNlbGlua19jb3JlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotRWNsaXBzZUxpbmtMaWJyYXJ5VmFsaWRhdG9yX25vRWNsaXBzZUxpbmtWZXJzaW9uPVNlbGVjdGVkIGxpYnJhcmllcyBkbyBub3QgaW5jbHVkZSByZXF1aXJlZCBFY2xpcHNlTGluayBhbm5vdGF0aW9uIGNsYXNzZXMuCi1FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3JfbXVsdGlwbGVFY2xpcHNlTGlua1ZlcnNpb25zPVRoZXJlIGFyZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBFY2xpcHNlTGluayBpbiBzZWxlY3RlZCBsaWJyYXJpZXMuCi1FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3JfaW1wcm9wZXJFY2xpcHNlTGlua1ZlcnNpb249RWNsaXBzZUxpbmsgdmVyc2lvbiBkb2VzIG5vdCBtZWV0IHBsYXRmb3JtIHJlcXVpcmVtZW50cy4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMC54c2QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjFkMWRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMTI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIEphdmEgUGVyc2lzdGVuY2UgQVBJIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZSBzY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczpvcm09Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAotICB2ZXJzaW9uPSIxLjAiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpZWNsaXBzZWxpbmtfb3JtXzFfMC54c2QgMS4wICBGZWJydWFyeSAxIDIwMDgKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj48IVtDREFUQVsKLQotICAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBuZXcgbmF0aXZlIEVjbGlwc2VMaW5rIFhNTCBtZXRhZGF0YQotICAgICAgIGZvcm1hdCB1c2VkIGZvciBKUEEgYW5kIG5hdGl2ZSBkZXBsb3ltZW50IHhtbCBmaWxlcy4gCi0KLSAgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtcHR5VHlwZSIvPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ2ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XSsoXC5bMC05XSspKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LW1hcHBpbmdzIj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudGl0eS1tYXBwaW5ncyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYW4gbWFwcGluZwotICAgICAgICBmaWxlLiBJdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGZvdXIgdHlwZXMgb2YgZWxlbWVudHM6Ci0KLSAgICAgICAgMS4gVGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBjb250YWlucyBtZXRhZGF0YQotICAgICAgICBmb3IgdGhlIGVudGlyZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgaWYgdGhpcyBlbGVtZW50Ci0gICAgICAgIG9jY3VycyBpbiBtdWx0aXBsZSBtYXBwaW5nIGZpbGVzIHdpdGhpbiB0aGUgc2FtZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAKLSAgICAgICAgMi4gVGhlIHBhY2thZ2UsIHNjaGVtYSwgY2F0YWxvZyBhbmQgYWNjZXNzIGVsZW1lbnRzIGFwcGx5IHRvIGFsbCBvZgotICAgICAgICB0aGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBkZWZpbmVkIGluCi0gICAgICAgIHRoZSBzYW1lIGZpbGUgaW4gd2hpY2ggdGhleSBvY2N1ci4KLQotICAgICAgICAzLiBUaGUgc2VxdWVuY2UtZ2VuZXJhdG9yLCB0YWJsZS1nZW5lcmF0b3IsIG5hbWVkLXF1ZXJ5LAotICAgICAgICBuYW1lZC1uYXRpdmUtcXVlcnkgYW5kIHNxbC1yZXN1bHQtc2V0LW1hcHBpbmcgZWxlbWVudHMgYXJlIGdsb2JhbAotICAgICAgICB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZQotICAgICAgICBzZXF1ZW5jZS1nZW5lcmF0b3Igb3IgdGFibGUtZ2VuZXJhdG9yIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUKLSAgICAgICAgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyBhbHNvIAotICAgICAgICB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIG5hbWVkLXF1ZXJ5IG9yIG5hbWVkLW5hdGl2ZS1xdWVyeQotICAgICAgICBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgCi0gICAgICAgIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgNC4gVGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZWFjaCBkZWZpbmUKLSAgICAgICAgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgbWFuYWdlZCBwZXJzaXN0ZW50IGNsYXNzLiBUaGUgbWFwcGluZwotICAgICAgICBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlc2UgZWxlbWVudHMgbWF5IGJlIGNvbXBsZXRlIG9yIGl0IG1heQotICAgICAgICBiZSBwYXJ0aWFsLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyIgdHlwZT0ib3JtOm1hcHBlZC1zdXBlcmNsYXNzIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eSIgdHlwZT0ib3JtOmVudGl0eSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRhYmxlIiB0eXBlPSJvcm06ZW1iZWRkYWJsZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uVHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBmaXhlZD0iMS4wIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIE1ldGFkYXRhIHRoYXQgYXBwbGllcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgbm90IGp1c3QgdG8gCi0gICAgICAgIHRoZSBtYXBwaW5nIGZpbGUgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLiAKLQotICAgICAgICBJZiB0aGUgeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgZWxlbWVudCBpcyBzcGVjaWZpZWQgdGhlbiAKLSAgICAgICAgdGhlIGNvbXBsZXRlIHNldCBvZiBtYXBwaW5nIG1ldGFkYXRhIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdCAKLSAgICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBYTUwgbWFwcGluZyBmaWxlcyBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGVzZSBkZWZhdWx0cyBhcmUgYXBwbGllZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhcyBhIHdob2xlIAotICAgICAgICB1bmxlc3MgdGhleSBhcmUgb3ZlcnJpZGRlbiBieSBsb2NhbCBhbm5vdGF0aW9uIG9yIFhNTCAKLSAgICAgICAgZWxlbWVudCBzZXR0aW5ncy4gCi0gICAgICAgIAotICAgICAgICBzY2hlbWEgLSBVc2VkIGFzIHRoZSBzY2hlbWEgZm9yIGFsbCB0YWJsZXMgb3Igc2Vjb25kYXJ5IHRhYmxlcwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXRhbG9nIC0gVXNlZCBhcyB0aGUgY2F0YWxvZyBmb3IgYWxsIHRhYmxlcyBvciBzZWNvbmRhcnkgdGFibGVzCi0gICAgICAgICAgICB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGFjY2VzcyAtIFVzZWQgYXMgdGhlIGFjY2VzcyB0eXBlIGZvciBhbGwgbWFuYWdlZCBjbGFzc2VzIGluCi0gICAgICAgICAgICB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXNjYWRlLXBlcnNpc3QgLSBBZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucwotICAgICAgICAgICAgaW4gZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgZW50aXR5LWxpc3RlbmVycyAtIExpc3Qgb2YgZGVmYXVsdCBlbnRpdHkgbGlzdGVuZXJzIHRvIGJlIGludm9rZWQgCi0gICAgICAgICAgICBvbiBlYWNoIGVudGl0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhbiBlbnRpdHkuIElzIGFsbG93ZWQgdG8gYmUKLSAgICAgICAgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGFubm90YXRpb25zLgotICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIAotICAgICAgICBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIG9uIHRoZSBlbnRpdHkgY2xhc3MgKGFuZCBpdHMgZmllbGRzCi0gICAgICAgIG9yIHByb3BlcnRpZXMpIGFyZSB0byBiZSBwcm9jZXNzZWQuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiAKLSAgICAgICAgdGhlIGRlZmF1bHRpbmcgcnVsZXMgZm9yIHRoZSBlbnRpdHkgYW5kIGl0cyBzdWJlbGVtZW50cyB3aWxsIAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ib3JtOnRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWNvbmRhcnktdGFibGUiIHR5cGU9Im9ybTpzZWNvbmRhcnktdGFibGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9Im9ybTppbmhlcml0YW5jZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdmFsdWUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZXMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgY29udGFpbnMgdGhlIGVudGl0eSBmaWVsZCBvciBwcm9wZXJ0eSBtYXBwaW5ncy4KLSAgICAgICAgSXQgbWF5IGJlIHNwYXJzZWx5IHBvcHVsYXRlZCB0byBpbmNsdWRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlCi0gICAgICAgIGZpZWxkcyBvciBwcm9wZXJ0aWVzLiBJZiBtZXRhZGF0YS1jb21wbGV0ZSBmb3IgdGhlIGVudGl0eSBpcyB0cnVlCi0gICAgICAgIHRoZW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGRlZmF1bHRlZCBhY2NvcmRpbmcKLSAgICAgICAgdG8gdGhlIGRlZmF1bHQgcnVsZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ib3JtOmlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkLWlkIiB0eXBlPSJvcm06ZW1iZWRkZWQtaWQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiIgdHlwZT0ib3JtOmJhc2ljLWNvbGxlY3Rpb24iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLW1hcCIgdHlwZT0ib3JtOmJhc2ljLW1hcCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tb25lIiB0eXBlPSJvcm06bWFueS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1tYW55IiB0eXBlPSJvcm06b25lLXRvLW1hbnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1vbmUiIHR5cGU9Im9ybTpvbmUtdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIiB0eXBlPSJvcm06dmFyaWFibGUtb25lLXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNmb3JtYXRpb24iIHR5cGU9Im9ybTp0cmFuc2Zvcm1hdGlvbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNpZW50IiB0eXBlPSJvcm06dHJhbnNpZW50IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJhY2Nlc3MtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBkZXRlcm1pbmVzIGhvdyB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgYWNjZXNzZXMgdGhlCi0gICAgICAgIHN0YXRlIG9mIGFuIGVudGl0eSBvciBlbWJlZGRlZCBvYmplY3QuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9QRVJUWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklFTEQiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5TGlzdGVuZXJzIHsKLSAgICAgICAgICBDbGFzc1tdIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVyIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cwotICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXJlbW92ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXJlbW92ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXVwZGF0ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlVXBkYXRlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXVwZGF0ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1sb2FkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0TG9hZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICBBIHVzZXIgZGVmaW5lZCBtYXBwaW5nJ3MgcHJvcGVydHkuCi0JCUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQotCQlAUmV0ZW50aW9uKFJVTlRJTUUpCi0JCXB1YmxpYyBAaW50ZXJmYWNlIFByb3BlcnR5IHsKLQkJCS8qKgotCQkJKiBQcm9wZXJ0eSBuYW1lLgotCQkJKi8gCi0JCQlTdHJpbmcgbmFtZSgpOwotCQkJCi0JCQkvKioKLQkJCSogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIFByb3BlcnR5IHZhbHVlLAotCQkJKiBjb252ZXJ0ZWQgdG8gYW4gaW5zdGFuY2Ugb2YgdmFsdWVUeXBlLgotCQkJKi8gCi0JCQlTdHJpbmcgdmFsdWUoKTsKLQkJCQotCQkJLyoqCi0JCQkqIFByb3BlcnR5IHZhbHVlIHR5cGUuCi0JCQkqIFRoZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gdmFsdWVUeXBlIGJ5IENvbnZlcnNpb25NYW5hZ2VyLgotCQkJKiBJZiBzcGVjaWZpZWQgbXVzdCBiZSBhIHNpbXBsZSB0eXBlIHRoYXQgY291bGQgYmUgaGFuZGxlZCBieSAKLQkJCSogQ29udmVyc2lvbk1hbmFnZXI6IAotCQkJKiBudW1lcmljYWwsIGJvb2xlYW4sIHRlbXBvcmFsLiAgCi0JCQkqLyAKLQkJCUNsYXNzIHZhbHVlVHlwZSgpIGRlZmF1bHQgU3RyaW5nLmNsYXNzOwotCQl9Ci0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAKLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1oaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKSAKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUXVlcnlIaW50IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFF1ZXJ5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBxdWVyeSgpOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZE5hdGl2ZVF1ZXJ5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBxdWVyeSgpOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7IC8vbmFtZWQgU3FsUmVzdWx0U2V0TWFwcGluZwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTcWxSZXN1bHRTZXRNYXBwaW5nIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEVudGl0eVJlc3VsdFtdIGVudGl0aWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDb2x1bW5SZXN1bHRbXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktcmVzdWx0IiB0eXBlPSJvcm06ZW50aXR5LXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1yZXN1bHQiIHR5cGU9Im9ybTpjb2x1bW4tcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlSZXN1bHQgewotICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzKCk7Ci0gICAgICAgICAgRmllbGRSZXN1bHRbXSBmaWVsZHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1yZXN1bHQiIHR5cGU9Im9ybTpmaWVsZC1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJlbnRpdHktY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZpZWxkUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWNvbmRhcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgfQotCi0gICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFVuaXF1ZUNvbnN0cmFpbnQgewotICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7Ci0gICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KLSAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgc2NhbGUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY2Nlc3MtbWV0aG9kcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXR0cmlidXRlT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgQ29sdW1uIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWRDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQtaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zaWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zaWVudCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2ZXJzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmVyc2lvbiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpYyB7Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCS8qKgotCQkgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0JCSAqIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgCi0JCSAqIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgCi0JCSAqIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0JCSAqICAKLQkJICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKLQkJICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0JCSAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyKS4gCi0JCSAqLyAKLQkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0JCUBSZXRlbnRpb24oUlVOVElNRSkKLQkJcHVibGljIEBpbnRlcmZhY2UgUmVhZFRyYW5zZm9ybWVyIHsKLQkJICAgIC8qKgotCQkgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAotCQkgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkF0dHJpYnV0ZVRyYW5zZm9ybWVyIAotCQkgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyAKLQkJICAgICAqIGJ1aWxkQXR0cmlidXRlVmFsdWUgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgCi0JCSAgICAgKiBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlLgotCQkgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCQkKLQkJICAgIC8qKgotCQkgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLQkJICAgICAqIGEgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSAobm90IGFzc2lnbnMgdGhlIHZhbHVlIHRvIAotCQkgICAgICogdGhlIGF0dHJpYnV0ZSkuIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIAotCQkgICAgICogc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3cml0ZS10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCS8qKgotCQkgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0JCSAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyKS4KLQkJICogIAotCQkgKiBBIHNpbmdsZSBXcml0ZVRyYW5zZm9ybWVyIG1heSBiZSBzcGVjaWZpZWQgZGlyZWN0bHkgb24gdGhlIG1ldGhvZCBvciAKLQkJICogYXR0cmlidXRlLiBNdWx0aXBsZSBXcml0ZVRyYW5zZm9ybWVycyBzaG91bGQgYmUgd3JhcHBlZCBpbnRvIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uLiBObyBXcml0ZVRyYW5zZm9ybWVycyBzcGVjaWZpZWQgZm9yIAotCQkgKiByZWFkLW9ubHkgbWFwcGluZy4gVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgd3JpdGUtb25seSwgaXQgCi0JCSAqIHNob3VsZCBoYXZlIGEgUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIAotCQkgKiBjb2x1bW4ocykgdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLQkJICovIAotCQlAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLQkJQFJldGVudGlvbihSVU5USU1FKQotCQlwdWJsaWMgQGludGVyZmFjZSBXcml0ZVRyYW5zZm9ybWVyIHsKLQkJICAgIC8qKgotCQkgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAotCQkgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkZpZWxkVHJhbnNmb3JtZXIgCi0JCSAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIGJ1aWxkRmllbGRWYWx1ZSAKLQkJICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgZGF0YWJhc2UgCi0JCSAgICAgKiBjb2x1bW4uIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSAKLQkJICAgICAqIHN1cHBvcnRlZCB0aGUgbWV0aG9kIGJ1aWxkRmllbGRWYWx1ZSBpbiB0aGUgY2xhc3Mgc2hvdWxkIGJlIAotCQkgICAgICogZGVmaW5lZCB0byByZXR1cm4gdGhlIHJlbGV2YW50IEphdmEgdHlwZSwgbm90IGp1c3QgT2JqZWN0IGFzIAotCQkgICAgICogZGVmaW5lZCBpbiB0aGUgaW50ZXJmYWNlLCBmb3IgaW5zdGFuY2U6Ci0JCSAgICAgKiBwdWJsaWMgVGltZSBidWlsZEZpZWxkVmFsdWUoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgZmllbGROYW1lLCBTZXNzaW9uIHNlc3Npb24pLgotCQkgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCQkKLQkJICAgIC8qKgotCQkgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLQkJICAgICAqIGEgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSBjb2x1bW4uCi0JCSAgICAgKiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgc3VwcG9ydGVkIHRoZSAKLQkJICAgICAqIG1ldGhvZCBzaG91bGQgYmUgZGVmaW5lZCB0byByZXR1cm4gYSBwYXJ0aWN1bGFyIHR5cGUsIG5vdCBqdXN0IAotCQkgICAgICogT2JqZWN0LCBmb3IgaW5zdGFuY2U6Ci0JCSAgICAgKiBwdWJsaWMgVGltZSBnZXRTdGFydFRpbWUoKS4KLQkJICAgICAqIFRoZSBtZXRob2QgbWF5IHJlcXVpcmUgYSBUcmFuc2llbnQgYW5ub3RhdGlvbiB0byBhdm9pZCBiZWluZyAKLQkJICAgICAqIG1hcHBlZCBhcyBCYXNpYyBieSBkZWZhdWx0LgotCQkgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLQkJCi0JCSAgICAvKioKLQkJICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgotCQkgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKLQkJICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAotCQkgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCi0JCSAgICAgKi8gCi0JCSAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCQl9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkvKioKLQkJICogVHJhbnNmb3JtYXRpb24gaXMgYW4gb3B0aW9uYWwgYW5ub3RhdGlvbiBmb3IgCi0JCSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLQkJICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGFsbG93cyB0byBtYXAgYW4gYXR0cmlidXRlIHRvIG9uZSBvciBtb3JlIAotCQkgKiBkYXRhYmFzZSBjb2x1bW5zLgotCQkgKiAKLQkJICogVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbiBpcyBhbiBvcHRpb25hbCBwYXJ0IG9mIAotCQkgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgZGVmaW5pdGlvbi4gVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgCi0JCSAqIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIAotCQkgKiB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLQkJICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKLQkJICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0JCSAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyKS4gCi0JCSAqLyAKLQkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0JCUBSZXRlbnRpb24oUlVOVElNRSkKLQkJcHVibGljIEBpbnRlcmZhY2UgVHJhbnNmb3JtYXRpb24gewotCQkgICAgLyoqCi0JCSAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotCQkgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLQkJICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0JCSAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKLQkJICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotCQkgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0JCSAgICAgKi8KLQkJICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0JCSAgICAKLQkJICAgIC8qKgotCQkgICAgICogKE9wdGlvbmFsKSBUaGUgb3B0aW9uYWwgZWxlbWVudCBpcyBhIGhpbnQgYXMgdG8gd2hldGhlciB0aGUgdmFsdWUKLQkJICAgICAqICBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgbWF5IGJlIG51bGwuIEl0IGlzIGRpc3JlZ2FyZGVkCi0JCSAgICAgKiAgZm9yIHByaW1pdGl2ZSB0eXBlcywgd2hpY2ggYXJlIGNvbnNpZGVyZWQgbm9uLW9wdGlvbmFsLgotCQkgICAgICovCi0JCSAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotCQl9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTpyZWFkLXRyYW5zZm9ybWVyIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTp3cml0ZS10cmFuc2Zvcm1lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvYiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvYiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUZW1wb3JhbCB7Ci0gICAgICAgICAgVGVtcG9yYWxUeXBlIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOnRlbXBvcmFsLXR5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgewotICAgICAgICAgIERBVEUsIC8vIGphdmEuc3FsLkRhdGUKLSAgICAgICAgICBUSU1FLCAvLyBqYXZhLnNxbC5UaW1lCi0gICAgICAgICAgVElNRVNUQU1QIC8vIGphdmEuc3FsLlRpbWVzdGFtcAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFURSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW1lcmF0ZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnVtZXJhdGVkIHsKLSAgICAgICAgICBFbnVtVHlwZSB2YWx1ZSgpIGRlZmF1bHQgT1JESU5BTDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06ZW51bS10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBFbnVtVHlwZSB7Ci0gICAgICAgICAgT1JESU5BTCwKLSAgICAgICAgICBTVFJJTkcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1JESU5BTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4gICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhc2NhZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIENhc2NhZGVUeXBlIHsgQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1hbGwiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtbWVyZ2UiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4gICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+ICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBpbnZlcnNlSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludmVyc2Utam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBHZW5lcmF0ZWRWYWx1ZSB7Ci0gICAgICAgICAgR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IEFVVE87Ci0gICAgICAgICAgU3RyaW5nIGdlbmVyYXRvcigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06Z2VuZXJhdGlvbi10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJhdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7Ci0gICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUKLSAgICAgICAgICB7IFNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1N9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JWYWx1ZSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRGlzY3JpbWluYXRvclR5cGUgeyBTVFJJTkcsIENIQVIsIElOVEVHRVIgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5URUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiRFRZUEUiOwotICAgICAgICAgIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKCkgZGVmYXVsdCBTVFJJTkc7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDMxOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgZW1iZWRkYWJsZSBvYmplY3RzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIGluIHRoZSBjbGFzcy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkYWJsZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIAotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYSBtYXBwZWQgc3VwZXJjbGFzcy4gSXMgCi0gICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSAKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkIAotICAgICAgICBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCBiZSByZWN1cnNpdmVseSAKLSAgICAgICAgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwcGVkU3VwZXJjbGFzc3t9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDE7Ci0gICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNlcXVlbmNlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBwa0NvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBwa0NvbHVtblZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAwOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCi0gICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50Ci0gICAgICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyIGludGVyZmFjZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBjb252ZXJ0ZXJDbGFzcygpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFR5cGVDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQotICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbmNlIGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgZmllbGQgCi0gICAgICAgICAgICogb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPYmplY3RUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbmNlCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgZGF0YVR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBlbnRpdHkuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVudCAKLSAgICAgICAgICAgKiBmaWVsZCBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBvYmplY3RUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBjb252ZXJzaW9uIHZhbHVlcyB0byBiZSB1c2VkIAotICAgICAgICAgICAqIHdpdGggdGhlIG9iamVjdCBjb252ZXJ0ZXIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVyc2lvblZhbHVlW10gY29udmVyc2lvblZhbHVlcygpOwotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgYSBkZWZhdWx0IG9iamVjdCB2YWx1ZS4gVXNlZCBmb3IgCi0gICAgICAgICAgICAqIGxlZ2FjeSBkYXRhIGlmIHRoZSBkYXRhIHZhbHVlIGlzIG1pc3NpbmcuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICBTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVyc2lvbi12YWx1ZSIgdHlwZT0ib3JtOmNvbnZlcnNpb24tdmFsdWUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LW9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJzaW9uVmFsdWUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgZGF0YWJhc2UgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRhdGFWYWx1ZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBvYmplY3QgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG9iamVjdFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdHJ1Y3RDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCi0gICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgCi0gICAgICAgICAgICogaW1wbGVtZW50IHRoZSBFY2xpcHNlTGluayBpbnRlcmZhY2UgCi0gICAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY29udmVydGVyKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgb24gYW4gRW50aXR5LgotICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0aGF0IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgYmUgc3BlY2lmaWVkIAotICAgICAgICAgKiBhcyB0aGUgYXJndW1lbnQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHkgb3IgTWFwcGVkU3VwZXJjbGFzcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEZvciBpbnN0YW5jZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ29weVBvbGljeSgiZXhhbXBsZS5NeUNvcHlQb2xpY3kiKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29weVBvbGljeSB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKiAoUmVxdWlyZWQpCi0gICAgICAgICogVGhpcyBkZWZpbmVzIHRoZSBjbGFzcyBvZiB0aGUgY29weSBwb2xpY3kuIEl0IG11c3Qgc3BlY2lmeSBhIGNsYXNzIAotICAgICAgICAqIHRoYXQgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kKLSAgICAgICAgKi8KLSAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKiBvbiBhbiBFbnRpdHkuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHRoZSBkZWZhdWx0IENvcHlQb2xpY3kgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rIGFuZCB0aGVyZWZvcmUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBvbmx5IHVzZWQgdG8gCi0gICAgICAgICAqIG92ZXJyaWRlIG90aGVyIHR5cGVzIG9mIGNvcHkgcG9saWNpZXMKLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5IG9yIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBASW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbnN0YW50aWF0aW9uQ29weVBvbGljeSB7Ci0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ2xvbmVDb3B5UG9saWN5IG9uIGFuIAotICAgICAgICAgKiBFbnRpdHkuIEEgQ2xvbmVDb3B5UG9saWN5IG11c3Qgc3BlY2lmeSBhdCBvbmUgb3IgYm90aCBvZiB0aGUgIm1ldGhvZCIgCi0gICAgICAgICAqIG9yICJ3b3JraW5nQ29weU1ldGhvZCIuICJ3b3JraW5nQ29weU1ldGhvZCIgaXMgdXNlZCB0byBjbG9uZSBvYmplY3RzIAotICAgICAgICAgKiB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIHVzZXIgYXMgdGhleSBhcmUgcmVnaXN0ZXJlZCBpbiAKLSAgICAgICAgICogRWNsaXBzZUxpbmsncyB0cmFuc2FjdGlvbmFsIG1lY2hhbmlzbSwgdGhlIFVuaXRPZldvcmsuICJtZXRob2QiIHdpbGwgCi0gICAgICAgICAqIGJlIHVzZWQgZm9yIHRoZSBjbG9uZSB0aGF0IGlzIHVzZWQgZm9yIGNvbXBhcmlzb24gaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgKiAgCi0gICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5IG9yIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KG1ldGhvZD0ibXlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiLCB3b3JraW5nQ29weU1ldGhvZD0ibXlXb3JraW5nQ29weUNsb25lTWV0aG9kIikKLSAgICAgICAgICogCi0gICAgICAgICAqIG9yOgotICAgICAgICAgKiAKLSAgICAgICAgICBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kod29ya2luZ0NvcHlNZXRob2ROYW1lPSJteVdvcmtpbmdDb3B5Q2xvbmUiKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2xvbmVDb3B5UG9saWN5IHsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpCi0gICAgICAgICAgICAgKiBFaXRoZXIgbWV0aG9kIG9yIHdvcmtpbmdDb3B5TWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkIHRoaXMgZGVmaW5lcyAKLSAgICAgICAgICAgICAqIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgd2lsbCBiZSB1c2VkIAotICAgICAgICAgICAgICogZm9yIGNvbXBhcmlzb24gYnkKLSAgICAgICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgRGVmZXJyZWRDaGFuZ2VEZXRlY3Rpb25Qb2xpY3kKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkKLSAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQKLSAgICAgICAgICAgICAqIHRoaXMgZGVmaW5lcyBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBjbG9uZSB0aGF0IAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgb2JqZWN0IHJldHVybmVkIHdoZW4gcmVnaXN0ZXJpbmcgYW4gCi0gICAgICAgICAgICAgKiBPYmplY3QgaW4gYW4gRWNsaXBzZUxpbmsgVW5pdE9mV29yawotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgd29ya2luZ0NvcHlNZXRob2QoKTsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0id29ya2luZy1jb3B5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sbGVjdGlvbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0YWJsZS4gSWYgaXQgaXMgbm90IAotICAgICAgICAgICAqIHNwZWNpZmllZCwgaXQgaXMgZGVmYXVsdGVkIHRvIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmc6IAotICAgICAgICAgICAqIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZW50aXR5OyAiXyIgOyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwIAotICAgICAgICAgICAqIHByb3BlcnR5IG9yIGZpZWxkIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBjYXRhbG9nIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBjYXRhbG9nLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBzY2hlbWEgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IHNjaGVtYS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSBhIHByaW1hcnkga2V5IGNvbHVtbiB0aGF0IGlzIHVzZWQgYXMgYSAKLSAgICAgICAgICAgKiBmb3JlaWduIGtleSB0byBqb2luIHRvIGFub3RoZXIgdGFibGUuIElmIHRoZSBzb3VyY2UgZW50aXR5IHVzZXMgYSAKLSAgICAgICAgICAgKiBjb21wb3NpdGUgcHJpbWFyeSBrZXksIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbXVzdCBiZSBzcGVjaWZpZWQgCi0gICAgICAgICAgICogZm9yIGVhY2ggZmllbGQgb2YgdGhlIGNvbXBvc2l0ZSBwcmltYXJ5IGtleS4gSW4gYSBzaW5nbGUgcHJpbWFyeSAKLSAgICAgICAgICAgKiBrZXkgY2FzZSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtYXkgb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQuIAotICAgICAgICAgICAqIERlZmF1bHRpbmcgd2lsbCBhcHBseSBvdGhlcndpc2UgYXMgZm9sbG93czoKLSAgICAgICAgICAgKiBuYW1lLCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgCi0gICAgICAgICAgICogb2YgdGhlIHNvdXJjZSBlbnRpdHkuIHJlZmVyZW5jZWRDb2x1bW5OYW1lLCB0aGUgc2FtZSBuYW1lIG9mIAotICAgICAgICAgICAqIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSBvZiB0aGUgc291cmNlIGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHByaW1hcnlLZXlKb2luQ29sdW1ucygpIGRlZmF1bHQge307IAotIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVW5pcXVlIGNvbnN0cmFpbnRzIHRoYXQgYXJlIHRvIGJlIHBsYWNlZCBvbiB0aGUgdGFibGUuIAotICAgICAgICAgICAqIFRoZXNlIGFyZSBvbmx5IHVzZWQgaWYgdGFibGUgZ2VuZXJhdGlvbiBpcyBpbiBlZmZlY3QuCi0gICAgICAgICAgICovCi0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsgCi0gICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNDb2xsZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTpjb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtbWFwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNNYXAgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IG1hcCAKLSAgICAgICAgICAgKiBrZXkuIElmIHRoZSBuYW1lIG9uIHRlIGtleSBjb2x1bW4gaXMgIiIsIHRoZSBuYW1lIHdpbGwgZGVmYXVsdCB0bzoKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb3IgZmllbGQ7ICJfa2V5Ii4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4ga2V5Q29sdW1uKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIGtleSBjb252ZXJ0ZXIuIERlZmF1bHQgaXMgZXF1aXZhbGVudCB0byAKLSAgICAgICAgICAgKiBzcGVjaWZ5aW5nIEBDb252ZXJ0KCJub25lIiksIG1lYW5pbmcgbm8gY29udmVydGVyIHdpbGwgYmUgYWRkZWQgdG8gCi0gICAgICAgICAgICogdGhlIGRpcmVjdCBtYXAga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnQga2V5Q29udmVydGVyKCkgZGVmYXVsdCBAQ29udmVydDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGRhdGEgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdmFsdWUgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBjb2x1bW4gbWFwcGluZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IHZhbHVlQ29udmVydGVyKCkgZGVmYXVsdCBAQ29udmVydDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXktY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXktY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTpjb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqb2luLWZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBKb2luRmV0Y2hUeXBlIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCi0gICAgICAgICAqIFRoaXMgZG9lcyBub3QgYWxsb3cgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgSU5ORVIsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCi0gICAgICAgICAqIFRoaXMgYWxsb3dzIGZvciBudWxsL2VtcHR5IHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIE9VVEVSLAotICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5ORVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVEVSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gb3B0aW1pc3RpYy1sb2NraW5nIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIAotICAgICAgICAgKiBvcHRpbWlzdGljIGxvY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIG9yIGRlbGV0aW5nIAotICAgICAgICAgKiBlbnRpdGllcy4gQW4gb3B0aW1pc3RpYy1sb2NraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uCi0gICAgICAgICAqIGFuIGVudGl0eSBvciBtYXBwZWQtc3VwZXJjbGFzcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEl0IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgb3B0aW1pc3RpYy1sb2NraW5nLXR5cGUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3B0aW1pc3RpY0xvY2tpbmcgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2Ygb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSB0byB1c2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHR5cGUoKSBkZWZhdWx0IFZFUlNJT05fQ09MVU1OOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBGb3IgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBvZiB0eXBlIAotICAgICAgICAgICAqIFNFTEVDVEVEX0NPTFVNTlMsIHRoaXMgYW5ub3RhdGlvbiBtZW1iZXIgYmVjb21lcyBhIChSZXF1aXJlZCkgCi0gICAgICAgICAgICogZmllbGQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uW10gc2VsZWN0ZWRDb2x1bW5zKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB3aGVyZSB0aGUgb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBzaG91bGQgCi0gICAgICAgICAgICogY2FzY2FkZSBsb2NrLiBDdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgd2l0aCBWRVJTSU9OX0NPTFVNTiBsb2NraW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gY2FzY2FkZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VsZWN0ZWQtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgIAotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmctdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhc2NhZGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBzaW1wbGUgdHlwZSB0aGF0IGlzIHVzZWQgd2l0aGluIGFuIG9wdGltaXN0aWMtbG9ja2luZyAKLSAgICAgICAgICogc3BlY2lmaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG9wdGltaXN0aWMtbG9ja2luZyB0aGF0Ci0gICAgICAgICAqIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyBlbnRpdGllcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIE9wdGltaXN0aWNMb2NraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGV2ZXJ5IGZpZWxkIGluIHRoZSB0YWJsZQotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZAotICAgICAgICAgICAqIGhhcyBiZWVuIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQUxMX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgb25seSB0aGUgY2hhbmdlZCBmaWVsZHMKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBIGRlbGV0ZQotICAgICAgICAgICAqIHdpbGwgb25seSBjb21wYXJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEFOR0VEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBjb21wYXJlcyBzZWxlY3RlZCBmaWVsZHMgaW4gdGhlIFdIRVJFCi0gICAgICAgICAgICogY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBOb3RlIHRoYXQKLSAgICAgICAgICAgKiB0aGUgZmllbGRzIHNwZWNpZmllZCBtdXN0IGJlIG1hcHBlZCBhbmQgbm90IGJlIHByaW1hcnkga2V5cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRUxFQ1RFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGEgc2luZ2xlIHZlcnNpb24gbnVtYmVyCi0gICAgICAgICAgICogaW4gdGhlIHdoZXJlIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZQotICAgICAgICAgICAqIG1hcHBlZCBhbmQgbm90IGJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBWRVJTSU9OX0NPTFVNTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTEVDVEVEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ09MVU1OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGUgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuaW52YWxpZGF0aW9uLkNhY2hlSW52YWxpZGF0aW9uUG9saWN5IAotICAgICAgICAgKiB3aGljaCBzZXRzIG9iamVjdHMgaW4gRWNsaXBzZUxpbmsncyBpZGVudGl0eSBtYXBzIHRvIGJlIGludmFsaWQgCi0gICAgICAgICAqIGZvbGxvd2luZyBnaXZlbiBydWxlcy4gQnkgZGVmYXVsdCBpbiBFY2xpcHNlTGluaywgb2JqZWN0cyBkbyBub3QgCi0gICAgICAgICAqIGV4cGlyZSBpbiB0aGUgY2FjaGUuIFNldmVyYWwgZGlmZmVyZW50IHBvbGljaWVzIGFyZSBhdmFpbGFibGUgdG8gCi0gICAgICAgICAqIGFsbG93IG9iamVjdHMgdG8gZXhwaXJlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZVR5cGUKLSAgICAgICAgICogCi0gICAgICAgICAqIEEgQ2FjaGUgYW5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvciBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICogSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ2FjaGUgYW5ub3RhdGlvbiBzaG91bGQgb25seSBiZSBkZWZpbmVkIAotICAgICAgICAgKiBvbiB0aGUgcm9vdCBvZiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2FjaGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZVR5cGUgdHlwZSgpIGRlZmF1bHQgU09GVF9XRUFLOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2l6ZSBvZiBjYWNoZSB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBzaXplKCkgZGVmYXVsdCAxMDA7Ci0KLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBDYWNoZWQgaW5zdGFuY2VzIGluIHRoZSBzaGFyZWQgY2FjaGUgb3IgYSBjbGllbnQgCi0JICAgICAgICAgKiBpc29sYXRlZCBjYWNoZS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGJvb2xlYW4gc2hhcmVkKCkgZGVmYXVsdCB0cnVlOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYWZ0ZXIgYSBmaXggcGVyaW9kIG9mIHRpbWUgKG1zKS4gCi0JICAgICAgICAgKiBRdWVyaWVzIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayAKLQkgICAgICAgICAqIHRvIHRoZSBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotCSAgICAgICAgICovIAotCSAgICAgICAgaW50IGV4cGlyeSgpIGRlZmF1bHQgLTE7IC8vIG1pbnVzIG9uZSBpcyBubyBleHBpcnkuCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgRXhwaXJlIGNhY2hlZCBpbnN0YW5jZSBhIHNwZWNpZmljIHRpbWUgb2YgZGF5LiBRdWVyaWVzIAotCSAgICAgICAgICogZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoZSAKLQkgICAgICAgICAqIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0JICAgICAgICAgKi8gCi0JICAgICAgICBUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5KCkgZGVmYXVsdCBAVGltZU9mRGF5KHNwZWNpZmllZD1mYWxzZSk7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgRm9yY2UgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UgdG8gYWx3YXlzIAotCSAgICAgICAgICogcmVmcmVzaCB0aGUgY2FjaGUuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBib29sZWFuIGFsd2F5c1JlZnJlc2goKSBkZWZhdWx0IGZhbHNlOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbGwgcXVlcmllcyB0aGF0IGdvIHRvIHRoZSBkYXRhYmFzZSwgcmVmcmVzaCB0aGUKLQkgICAgICAgICAqIGNhY2hlIG9ubHkgaWYgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYSBxdWVyeSBpcyAKLQkgICAgICAgICAqIG5ld2VyIHRoYW4gdGhlIGRhdGEgaW4gdGhlIGNhY2hlIChhcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcHRpbWlzdGljIAotCSAgICAgICAgICogbG9ja2luZyBmaWVsZCkKLQkgICAgICAgICAqLyAKLQkgICAgICAgIGJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyKCkgZGVmYXVsdCBmYWxzZTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBTZXR0aW5nIHRvIHRydWUgd2lsbCBmb3JjZSBhbGwgcXVlcmllcyB0byBieXBhc3MgdGhlIAotCSAgICAgICAgICogY2FjaGUgZm9yIGhpdHMgYnV0IHN0aWxsIHJlc29sdmUgYWdhaW5zdCB0aGUgY2FjaGUgZm9yIGlkZW50aXR5LiAKLQkgICAgICAgICAqIFRoaXMgZm9yY2VzIGFsbCBxdWVyaWVzIHRvIGhpdCB0aGUgZGF0YWJhc2UuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBib29sZWFuIGRpc2FibGVIaXRzKCkgZGVmYXVsdCBmYWxzZTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2FjaGUgY29vcmRpbmF0aW9uIG1vZGUuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSgpIGRlZmF1bHQgU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLQkgICAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpjaG9pY2U+Ci0JICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnkiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiLz4KLQkgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeS10aW1lLW9mLWRheSIgdHlwZT0ib3JtOnRpbWUtb2YtZGF5IiBtaW5PY2N1cnM9IjAiLz4KLQkgIDwveHNkOmNob2ljZT4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNpemUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFyZWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2FjaGUtdHlwZSIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZyZXNoLW9ubHktaWYtbmV3ZXIiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlLWhpdHMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb29yZGluYXRpb24tdHlwZSIgdHlwZT0ib3JtOmNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAKLQotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQotCSAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlVHlwZSBlbnVtIGlzIHVzZWQgd2l0aCB0aGUgQ2FjaGUgYW5ub3RhdGlvbiBmb3IgYSAKLSAgICAgICAgICogcGVyc2lzdGVudCBjbGFzcy4gSXQgZGVmaW5lcyB0aGUgdHlwZSBvZiBJZGVudGl0eU1hcC9DYWNoZSB1c2VkIGZvciAKLSAgICAgICAgICogdGhlIGNsYXNzLiBCeSBkZWZhdWx0IHRoZSBTT0ZUX1dFQUsgY2FjaGUgdHlwZSBpcyB1c2VkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovCi0JICAgICAgcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogUHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LiBDYWNoZXMgYWxsIG9iamVjdHMKLQkgICAgICAgICAqIGFuZCBkb2VzIG5vdCByZW1vdmUgdGhlbS4gCi0JICAgICAgICAgKiBXQVJOSU5HOiBUaGlzIG1ldGhvZCBtYXkgYmUgbWVtb3J5IGludGVuc2l2ZSB3aGVuIG1hbnkgb2JqZWN0cyBhcmUgCi0JICAgICAgICAgKiByZWFkLgotCSAgICAgICAgICovCi0JICAgICAgICBGVUxMLAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotCSAgICAgICAgICogb2JqZWN0cyB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLQkgICAgICAgICAqIGNvbGxlY3Rpb24gYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4KLQkgICAgICAgICAqLwotCSAgICAgICAgV0VBSywKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKLQkgICAgICAgICAqIG9iamVjdHMgdXNpbmcgc29mdCByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0JICAgICAgICAgKiBjb2xsZWN0aW9uIHdoZW4gbWVtb3J5IGlzIGxvdyBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZAotCSAgICAgICAgICogZ3VhcmFudGVlZCBpZGVudGl0eS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU09GVCwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogU2ltaWxhciB0byB0aGUgV0VBSyBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgaXQgbWFpbnRhaW5zIGEKLQkgICAgICAgICAqIG1vc3QtZnJlcXVlbnRseS11c2VkIHN1Yi1jYWNoZS4gVGhlIHNpemUgb2YgdGhlIHN1Yi1jYWNoZSBpcwotCSAgICAgICAgICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAgYXMgc3BlY2lmaWVkIGJ5Ci0JICAgICAgICAgKiBkZXNjcmlwdG9yJ3Mgc2V0SWRlbnRpdHlNYXBTaXplKCkgbWV0aG9kLiBUaGUgc3ViLWNhY2hlCi0JICAgICAgICAgKiB1c2VzIHNvZnQgcmVmZXJlbmNlcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBvYmplY3RzIGFyZQotCSAgICAgICAgICogZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFNPRlRfV0VBSywKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogSWRlbnRpY2FsIHRvIHRoZSBzb2Z0IGNhY2hlIHdlYWsgKFNPRlRfV0VBSykgaWRlbnRpdHkgbWFwIGV4Y2VwdCAKLQkgICAgICAgICAqIHRoYXQgaXQgdXNlcyBoYXJkIHJlZmVyZW5jZXMgaW4gdGhlIHN1Yi1jYWNoZS4gVXNlIHRoaXMgaWRlbnRpdHkgCi0JICAgICAgICAgKiBtYXAgaWYgc29mdCByZWZlcmVuY2VzIGRvIG5vdCBiZWhhdmUgcHJvcGVybHkgb24geW91ciBwbGF0Zm9ybS4KLQkgICAgICAgICAqLwotCSAgICAgICAgSEFSRF9XRUFLLAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBBIGNhY2hlIGlkZW50aXR5IG1hcCBtYWludGFpbnMgYSBmaXhlZCBudW1iZXIgb2Ygb2JqZWN0cwotCSAgICAgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gT2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZQotCSAgICAgICAgICogb24gYSBsZWFzdC1yZWNlbnRseS11c2VkIGJhc2lzLiBUaGlzIG1ldGhvZCBhbGxvd3Mgb2JqZWN0Ci0JICAgICAgICAgKiBpZGVudGl0eSBmb3IgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBvYmplY3RzLgotCSAgICAgICAgICogV0FSTklORzogRnVybmlzaGVzIGNhY2hpbmcgYW5kIGlkZW50aXR5LCBidXQgZG9lcyBub3QgZ3VhcmFudGVlIAotCSAgICAgICAgICogaWRlbnRpdHkuCi0JICAgICAgICAgKi8KLQkgICAgICAgIENBQ0hFLAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBXQVJOSU5HOiBEb2VzIG5vdCBwcmVzZXJ2ZSBvYmplY3QgaWRlbnRpdHkgYW5kIGRvZXMgbm90IGNhY2hlIAotCSAgICAgICAgICogb2JqZWN0cy4KLQkgICAgICAgICAqLwotCSAgICAgICAgTk9ORQotCSAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZVTEwiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VBSyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlRfV0VBSyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQVJEX1dFQUsiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FDSEUiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotCSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQotCSAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovIAotCSAgICAgIHB1YmxpYyBlbnVtIENhY2hlQ29vcmRpbmF0aW9uVHlwZSB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIFNlbmRzIGEgbGlzdCBvZiBjaGFuZ2VkIG9iamVjdHMgaW5jbHVkaW5nIGRhdGEgYWJvdXQgdGhlIGNoYW5nZXMuCi0JICAgICAgICAgKiBUaGlzIGRhdGEgaXMgbWVyZ2VkIGludG8gdGhlIHJlY2VpdmluZyBjYWNoZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU0VORF9PQkpFQ1RfQ0hBTkdFUywKLQkKLQkgICAgICAgICAvKioKLQkgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgdGhlIGlkZW50aXRpZXMgb2YgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGNoYW5nZWQuIAotCSAgICAgICAgICAqIFRoZSByZWNlaXZpbmcgY2FjaGUgaW52YWxpZGF0ZXMgdGhlIG9iamVjdHMgKHJhdGhlciB0aGFuIGNoYW5naW5nIAotCSAgICAgICAgICAqIGFueSBvZiB0aGUgZGF0YSkKLQkgICAgICAgICAgKi8KLQkgICAgICAgICBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywKLQkKLQkgICAgICAgICAvKioKLQkgICAgICAgICAgKiBTYW1lIGFzIFNFTkRfT0JKRUNUX0NIQU5HRVMgZXhjZXB0IGl0IGFsc28gaW5jbHVkZXMgYW55IG5ld2x5Ci0JICAgICAgICAgICogY3JlYXRlZCBvYmplY3RzIGZyb20gdGhlIHRyYW5zYWN0aW9uLgotCSAgICAgICAgICAqLwotCSAgICAgICAgIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAotCQotCSAgICAgICAgIC8qKgotCSAgICAgICAgICAqIERvZXMgbm8gY2FjaGUgY29vcmRpbmF0aW9uLgotCSAgICAgICAgICAqLwotCSAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9PQkpFQ1RfQ0hBTkdFUyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JICA8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lLW9mLWRheSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLQkgICAgICBAVGFyZ2V0KHt9KQotCSAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLQkgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEhvdXIgb2YgdGhlIGRheS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBob3VyKCkgZGVmYXVsdCAwOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbnV0ZSBvZiB0aGUgZGF5LgotCSAgICAgICAgICovIAotCSAgICAgICAgaW50IG1pbnV0ZSgpIGRlZmF1bHQgMDsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBTZWNvbmQgb2YgdGhlIGRheS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBzZWNvbmQoKSBkZWZhdWx0IDA7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgTWlsbGlzZWNvbmQgb2YgdGhlIGRheS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBtaWxsaXNlY29uZCgpIGRlZmF1bHQgMDsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogSW50ZXJuYWwgdXNlLiBEbyBub3QgbW9kaWZ5LgotCSAgICAgICAgICovIAotCSAgICAgICAgYm9vbGVhbiBzcGVjaWZpZWQoKSBkZWZhdWx0IHRydWU7Ci0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImhvdXIiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaW51dGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaWxsaXNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jaGFuZ2V0cmFja2luZy5PYmplY3RDaGFuZ2VQb2xpY3kgCi0gICAgICAgICAqIHdoaWNoIGNvbXB1dGVzIGNoYW5nZXMgc2V0cyBmb3IgRWNsaXBzZUxpbmsncyBVbml0T2ZXb3JrIGNvbW1pdCAKLSAgICAgICAgICogcHJvY2Vzcy4gQW4gT2JqZWN0Q2hhbmdlUG9saWN5IGlzIHN0b3JlZCBvbiBhbiBFbnRpdHkncyBkZXNjcmlwdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBBIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gbWF5IGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHkgb3IgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2hhbmdlVHJhY2tpbmcgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2hhbmdlIHRyYWNraW5nIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKCkgZGVmYXVsdCBBVVRPOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nLXR5cGUiIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENoYW5nZVRyYWNraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gQVRUUklCVVRFIGNoYW5nZSB0cmFja2luZyB0eXBlIGFsbG93cyBjaGFuZ2UgdHJhY2tpbmcgYXQgdGhlCi0gICAgICAgICAgICogYXR0cmlidXRlIGxldmVsIG9mIGFuIG9iamVjdC4gT2JqZWN0cyB3aXRoIGNoYW5nZWQgYXR0cmlidXRlcyB3aWxsCi0gICAgICAgICAgICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSAKLSAgICAgICAgICAgKiByZXN1bHRzIG9mIHRoZSBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVFRSSUJVVEUsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBPQkpFQ1QgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBhbGxvd3MgYW4gb2JqZWN0IHRvIGNhbGN1bGF0ZSBmb3IgCi0gICAgICAgICAgICogaXRzZWxmIHdoZXRoZXIgaXQgaGFzIGNoYW5nZWQuIENoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIHByb2Nlc3NlZCBpbiAKLSAgICAgICAgICAgKiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgCi0gICAgICAgICAgICogY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgT0JKRUNULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQSBERUZFUlJFRCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGRlZmVycyBhbGwgY2hhbmdlIGRldGVjdGlvbiB0bwotICAgICAgICAgICAqIHRoZSBVbml0T2ZXb3JrJ3MgY2hhbmdlIGRldGVjdGlvbiBwcm9jZXNzLiBFc3NlbnRpYWxseSwgdGhlIAotICAgICAgICAgICAqIGNhbGN1bGF0ZUNoYW5nZXMoKSBtZXRob2Qgd2lsbCBydW4gZm9yIGFsbCBvYmplY3RzIGluIGEgVW5pdE9mV29yay4gCi0gICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBPYmplY3RDaGFuZ2VQb2xpY3kKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBERUZFUlJFRCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdpbGwgbm90IHNldCBhbnkgY2hhbmdlIHRyYWNraW5nIHBvbGljeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVVRPCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUVFJJQlVURSIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPQkpFQ1QiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVGRVJSRUQiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotCSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9taXplciI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLSAgICAgIC8qKiAKLSAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlc3Npb25zLmZhY3Rvcmllcy5EZXNjcmlwdG9yQ3VzdG9taXplciAKLSAgICAgICAqIGludGVyZmFjZSBhbmQgaXMgdG8gcnVuIGFnYWluc3QgYW4gZW5ldGl0eSdzIGNsYXNzIGRlc2NyaXB0b3IgYWZ0ZXIgYWxsIAotICAgICAgICogbWV0YWRhdGEgcHJvY2Vzc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQuCi0gICAgICAgKgotICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MgCi0gICAgICAgKiBvciBFbWJlZGRhYmxlIGNsYXNzLiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDdXN0b21pemVyIGlzIG5vdCAKLSAgICAgICAqIGluaGVyaXRlZCBmcm9tIGl0cyBwYXJlbnQgY2xhc3Nlcy4gCi0gICAgICAgKi8gCi0JICAgIEBUYXJnZXQoe1RZUEV9KQotCSAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0JICAgIHB1YmxpYyBAaW50ZXJmYWNlIEN1c3RvbWl6ZXIgewotCSAgICAgIC8qKgotCSAgICAgICAqIChSZXF1aXJlZCkgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciBjdXN0b21pemVyIGNsYXNzIHRoYXQgCi0JICAgICAgICogc2hvdWxkIGJlIGFwcGxpZWQgZm9yIHRoZSByZWxhdGVkIGVudGl0eSBvciBlbWJlZGRhYmxlIGNsYXNzLgotCSAgICAgICAqLwotCSAgICAgIENsYXNzIHZhbHVlKCk7IAotCSAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24gYWxsb3dzIHRoZSBkZWZpbml0aW9uIG9mIAotICAgICAgICAgKiBxdWVyaWVzIHRoYXQgY2FsbCBzdG9yZWQgcHJvY2VkdXJlcyBhcyBuYW1lZCBxdWVyaWVzLgotICAgICAgICAgCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICovIAotCSAgICAgIEBUYXJnZXQoe1RZUEV9KQotCSAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLQkgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKFJlcXVpcmVkKSBVbmlxdWUgbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhpcyBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgbmFtZSgpOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFF1ZXJ5IGhpbnRzLgotCSAgICAgICAgICovCi0JICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgUmVmZXJzIHRvIHRoZSBjbGFzcyBvZiB0aGUgcmVzdWx0LgotCSAgICAgICAgICovCi0JICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgU1FMUmVzdWx0TWFwcGluZy4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgcHJvY2VkdXJlTmFtZSgpOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIHF1ZXJ5IHNob3VsZCByZXR1cm4gYSByZXN1bHQgc2V0LgotCSAgICAgICAgICovCi0JICAgICAgICBib29sZWFuIHJldHVybnNSZXN1bHRTZXQoKSBkZWZhdWx0IHRydWU7IAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgYXJndW1lbnRzIHRvIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotCSAgICAgICAgICovCi0JICAgICAgICBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsKLQkgICAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOnNlcXVlbmNlPgotCSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgbWluT2NjdXJzPSIwIiAKLQkgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJvcm06c3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiIAotCSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JICAgIDwveHNkOnNlcXVlbmNlPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5zLXJlc3VsdC1zZXQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24gaXMgdXNlZCB3aXRoaW4gYSAKLSAgICAgICAgICogTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotCSAgICAgIEBUYXJnZXQoe30pCi0JICAgICAgQFJldGVudGlvbihSVU5USU1FKQotCSAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIuCi0JICAgICAgICAgKi8KLQkgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBkZWZhdWx0IElOOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyIG5hbWUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgcXVlcnkgcGFyYW1ldGVyIG5hbWUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlcigpOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIEphdmEgY2xhc3MgZGVzaXJlZCBiYWNrIGZyb20gdGhlIHByb2NlZHVyZSwgCi0JICAgICAgICAgKiB0aGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBwcm9jZWR1cmUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIENsYXNzIHR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBjb2RlLCB0aGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCAKLQkgICAgICAgICAqIGZyb20gdGhlIHByb2NlZHVyZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgaW50IGpkYmNUeXBlKCkgZGVmYXVsdCAtMTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIG5hbWUsIHRoaXMgbWF5IGJlIHJlcXVpcmVkIGZvciBBUlJBWSBvciAKLQkgICAgICAgICAqIFNUUlVDVCB0eXBlcy4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIGpkYmNUeXBlTmFtZSgpIGRlZmF1bHQgIiI7Ci0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ib3JtOmRpcmVjdGlvbi10eXBlIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJxdWVyeS1wYXJhbWV0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JCi0JPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCQotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXJlY3Rpb24tdHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uLgotICAgICAgICAgKiBJdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSAKLSAgICAgICAgICogcGFyYW1ldGVycyBvZiBhIG5hbWVkIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAqLwotCSAgICAgIHB1YmxpYyBlbnVtIERpcmVjdGlvbiB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIElucHV0IHBhcmFtZXRlcgotCSAgICAgICAgICovCi0JICAgICAgICBJTiwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogT3V0cHV0IHBhcmFtZXRlcgotCSAgICAgICAgICovCi0JICAgICAgICBPVVQsCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIElucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyCi0JICAgICAgICAgKi8KLQkgICAgICAgIElOX09VVCwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogT3V0cHV0IGN1cnNvcgotCSAgICAgICAgICovCi0JICAgICAgICBPVVRfQ1VSU09SCi0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOX09VVCIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRfQ1VSU09SIi8+Ci0JICA8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCQotCTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQkKLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkvKiogCi0JCQkJICogVmFyaWFibGUgb25lIHRvIG9uZSBtYXBwaW5ncyBhcmUgdXNlZCB0byByZXByZXNlbnQgYSBwb2ludGVyIAotCQkJCSAqIHJlZmVyZW5jZXMgYmV0d2VlbiBhIGphdmEgb2JqZWN0IGFuZCBhbiBpbXBsZW1lbnRlciBvZiBhbiBpbnRlcmZhY2UuIAotCQkJCSAqIFRoaXMgbWFwcGluZyBpcyB1c3VhbGx5IHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHBvaW50ZXIgKHN0b3JlZCBpbiBhbiAKLQkJCQkgKiBpbnN0YW5jZSB2YXJpYWJsZSkgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgb2JqZWN0cy4gSW4gdGhlIAotCQkJCSAqIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGVzLCB0aGVzZSBtYXBwaW5ncyBhcmUgbm9ybWFsbHkgaW1wbGVtZW50ZWQgCi0JCQkJICogdXNpbmcgYSBmb3JlaWduIGtleSBhbmQgYSB0eXBlIGNvZGUuCi0JCQkJICogCi0JCQkJICogQSBWYXJpYWJsZU9uZVRvT25lIGNhbiBiZSBzcGVjaWZpZWQgd2l0aGluIGFuIEVudGl0eSwgCi0JCQkJICogTWFwcGVkU3VwZXJjbGFzcyBhbmQgRW1iZWRkYWJsZSBjbGFzcy4gCi0JCQkJICovIAotCQkJCUBUYXJnZXQoe01FVEhPRCwgRklFTER9KSAKLQkJCQlAUmV0ZW50aW9uKFJVTlRJTUUpCi0JCQkJcHVibGljIEBpbnRlcmZhY2UgVmFyaWFibGVPbmVUb09uZSB7Ci0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIFRoZSBpbnRlcmZhY2UgY2xhc3MgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSAKLQkJCQkgICAgICogYXNzb2NpYXRpb24uIElmIG5vdCBzcGVjaWZpZWQgaXQgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIAotCQkJCSAgICAgKiBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuCi0JCQkJICAgICAqLwotCQkJCSAgICBDbGFzcyB0YXJnZXRJbnRlcmZhY2UoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0JCQkJICAgIAotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBUaGUgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgY2FzY2FkZWQgdG8gdGhlIHRhcmdldCBvZiAKLQkJCQkgICAgICogdGhlIGFzc29jaWF0aW9uLgotCQkJCSAgICAgKi8KLQkJCQkgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLQkJCQkgICAgCi0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotCQkJCSAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotCQkJCSAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotCQkJCSAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKLQkJCQkgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0JCQkJICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotCQkJCSAgICAgKi8KLQkJCQkgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQkJCQkgICAgCi0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIG9wdGlvbmFsLiBJZiBzZXQgdG8gZmFsc2UgCi0JCQkJICAgICAqIHRoZW4gYSBub24tbnVsbCByZWxhdGlvbnNoaXAgbXVzdCBhbHdheXMgZXhpc3QuCi0JCQkJICAgICAqLwotCQkJCSAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotCQkJCSAgCi0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aWxsIGhvbGQgdGhlIHR5cGUgCi0JCQkJICAgICAqIGluZGljYXRvcnMuIElmIHRoZSBEaXNjcmltaW5hdG9yQ29sdW1uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIAotCQkJCSAgICAgKiBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW4gZGVmYXVsdHMgdG8gIkRUWVBFIiBhbmQgdGhlIAotCQkJCSAgICAgKiBkaXNjcmltaW5hdG9yIHR5cGUgdG8gU1RSSU5HLgotCQkJCSAgICAgKi8KLQkJCQkgICAgRGlzY3JpbWluYXRvckNvbHVtbiBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCBARGlzY3JpbWluYXRvckNvbHVtbjsKLQkJCQkgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGxpc3Qgb2YgZGlzY3JpbWluYXRvciB0eXBlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggCi0gICAgICAgICAgICAgKiB0aGlzIFZhcmlhYmxlT25lVG9PbmUuIElmIG5vbmUgYXJlIHNwZWNpZmllZCB0aGVuIHRob3NlIGVudGl0aWVzIAotICAgICAgICAgICAgICogd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHRoYXQgaW1wbGVtZW50IHRoZSB0YXJnZXQgaW50ZXJmYWNlIAotICAgICAgICAgICAgICogd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiB0eXBlcy4gVGhlIGRpc2NyaW1pbmF0b3IgdHlwZSB3aWxsIAotICAgICAgICAgICAgICogZGVmYXVsdCBhcyBmb2xsb3dzOgotICAgICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIFNUUklORzogRW50aXR5Lm5hbWUoKQotICAgICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIENIQVI6IEZpcnN0IGxldHRlciBvZiB0aGUgCi0gICAgICAgICAgICAgKiAgICBFbnRpdHkgY2xhc3MKLSAgICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBJTlRFR0VSOiBUaGUgbmV4dCBpbnRlZ2VyIGFmdGVyIAotICAgICAgICAgICAgICogICAgdGhlIGhpZ2hlc3QgaW50ZWdlciBleHBsaWNpdGx5IGFkZGVkLgotICAgICAgICAgICAgICovCi0JCQkJICAgIERpc2NyaW1pbmF0b3JDbGFzc1tdIGRpc2NyaW1pbmF0b3JDbGFzc2VzKCkgZGVmYXVsdCB7fTsKLQkJCQl9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWludGVyZmFjZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIERpc2NyaW1pbmF0b3JDbGFzcyBpcyB1c2VkIHdpdGhpbiBhIFZhcmlhYmxlT25lVG9PbmUgYW5ub3RhdGlvbi4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KSAKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ2xhc3MgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGRpc2NyaW1pbmF0b3IgdG8gYmUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3IoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNsYXNzIHRvIHRoZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgICAgICAvKioKLSAgICAgICAgICAgKiBUaGUgRXhpc3RlbmNlQ2hlY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAgICogY2hlY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIGVudGl0aWVzLgotICAgICAgICAgICAqIAotICAgICAgICAgICAqIEFuIGV4aXN0ZW5jZS1jaGVja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbiBhbiBFbnRpdHkgb3IgCi0gICAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbm5vdGF0aW9uLgotICAgICAgICAgICAqLwotICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEV4aXN0ZW5jZUNoZWNraW5nIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBTZXQgdGhlIGV4aXN0ZW5jZSBjaGVjayBmb3IgZGV0ZXJtaW5pbmcKLSAgICAgICAgICAgICAqIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICBFeGlzdGVuY2VUeXBlIHZhbHVlKCkgZGVmYXVsdCBDSEVDS19DQUNIRTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIGFuZCAKLSAgICAgICAgICAgKiBpdCBpcyBpbiB0aGUgY2FjaGUsIHRoZW4gaXQgbXVzdCBleGlzdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEVDS19DQUNIRSwKLQkJCQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFBlcmZvcm0gZG9lcyBleGlzdCBjaGVjayBvbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0hFQ0tfREFUQUJBU0UsCi0JCQkKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0cyBwcmltYXJ5IGtleSBkb2VzIG5vdCBpbmNsdWRlIG51bGwgdGhlbiAKLSAgICAgICAgICAgKiBpdCBtdXN0IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIAotICAgICAgICAgICAqIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBU1NVTUVfRVhJU1RFTkNFLAotCQkJCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQXNzdW1lIHRoYXQgdGhlIG9iamVjdCBkb2VzIG5vdCBleGlzdC4gVGhpcyBtYXkgYmUgdXNlZCBpZiB0aGUgCi0gICAgICAgICAgICogYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suICAKLSAgICAgICAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIGZvcmNlIGFuIGluc2VydCB0byBiZSBjYWxsZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVNTVU1FX05PTl9FWElTVEVOQ0UKLQkJCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+CSAKLQkgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfQ0FDSEUiIC8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0RBVEFCQVNFIiAvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1NVTUVfRVhJU1RFTkNFIiAvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1NVTUVfTk9OX0VYSVNURU5DRSIvPgotCSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4JCi0JCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzEueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzZmYxNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzI0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6b3JtPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMS4xIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWVjbGlwc2VsaW5rX29ybV8xXzEueHNkIDEuMSAgRmVicnVhcnkgNCAyMDA5Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmRvY3VtZW50YXRpb24+PCFbQ0RBVEFbCi0KLSAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgbmV3IG5hdGl2ZSBFY2xpcHNlTGluayBYTUwgbWV0YWRhdGEKLSAgICAgICBmb3JtYXQgdXNlZCBmb3IgSlBBIGFuZCBuYXRpdmUgZGVwbG95bWVudCB4bWwgZmlsZXMuIAotCi0gICAgIF1dPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idmVyc2lvblR5cGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV0rKFwuWzAtOV0rKSoiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1tYXBwaW5ncyI+Ci0gICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnRpdHktbWFwcGluZ3MgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuIG1hcHBpbmcKLSAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgotCi0gICAgICAgIDEuIFRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgY29udGFpbnMgbWV0YWRhdGEKLSAgICAgICAgZm9yIHRoZSBlbnRpcmUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIGlmIHRoaXMgZWxlbWVudAotICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgCi0gICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKLSAgICAgICAgdGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZGVmaW5lZCBpbgotICAgICAgICB0aGUgc2FtZSBmaWxlIGluIHdoaWNoIHRoZXkgb2NjdXIuCi0KLSAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKLSAgICAgICAgbmFtZWQtbmF0aXZlLXF1ZXJ5IGFuZCBzcWwtcmVzdWx0LXNldC1tYXBwaW5nIGVsZW1lbnRzIGFyZSBnbG9iYWwKLSAgICAgICAgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUKLSAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCi0gICAgICAgIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgYWxzbyAKLSAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSBvciBuYW1lZC1uYXRpdmUtcXVlcnkKLSAgICAgICAgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIAotICAgICAgICBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgIDQuIFRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGVhY2ggZGVmaW5lCi0gICAgICAgIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIG1hbmFnZWQgcGVyc2lzdGVudCBjbGFzcy4gVGhlIG1hcHBpbmcKLSAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKLSAgICAgICAgYmUgcGFydGlhbC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkYWJsZSIgdHlwZT0ib3JtOmVtYmVkZGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvblR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgZml4ZWQ9IjEuMSIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBNZXRhZGF0YSB0aGF0IGFwcGxpZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYW5kIG5vdCBqdXN0IHRvIAotICAgICAgICB0aGUgbWFwcGluZyBmaWxlIGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZC4gCi0KLSAgICAgICAgSWYgdGhlIHhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIGVsZW1lbnQgaXMgc3BlY2lmaWVkIHRoZW4gCi0gICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQgCi0gICAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlc2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXMgYSB3aG9sZSAKLSAgICAgICAgdW5sZXNzIHRoZXkgYXJlIG92ZXJyaWRkZW4gYnkgbG9jYWwgYW5ub3RhdGlvbiBvciBYTUwgCi0gICAgICAgIGVsZW1lbnQgc2V0dGluZ3MuIAotICAgICAgICAKLSAgICAgICAgc2NoZW1hIC0gVXNlZCBhcyB0aGUgc2NoZW1hIGZvciBhbGwgdGFibGVzIG9yIHNlY29uZGFyeSB0YWJsZXMKLSAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2F0YWxvZyAtIFVzZWQgYXMgdGhlIGNhdGFsb2cgZm9yIGFsbCB0YWJsZXMgb3Igc2Vjb25kYXJ5IHRhYmxlcwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBhY2Nlc3MgLSBVc2VkIGFzIHRoZSBhY2Nlc3MgdHlwZSBmb3IgYWxsIG1hbmFnZWQgY2xhc3NlcyBpbgotICAgICAgICAgICAgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2FzY2FkZS1wZXJzaXN0IC0gQWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMKLSAgICAgICAgICAgIGluIGVudGl0eSByZWxhdGlvbnNoaXBzIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGVudGl0eS1saXN0ZW5lcnMgLSBMaXN0IG9mIGRlZmF1bHQgZW50aXR5IGxpc3RlbmVycyB0byBiZSBpbnZva2VkIAotICAgICAgICAgICAgb24gZWFjaCBlbnRpdHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYW4gZW50aXR5LiBJcyBhbGxvd2VkIHRvIGJlCi0gICAgICAgIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gCi0gICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViZWxlbWVudHMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9Im9ybTp0YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIiB0eXBlPSJvcm06c2Vjb25kYXJ5LXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5IiB0eXBlPSJvcm06cHJpbWFyeS1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJvcm06aW5oZXJpdGFuY2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGVzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBlbnRpdHkgZmllbGQgb3IgcHJvcGVydHkgbWFwcGluZ3MuCi0gICAgICAgIEl0IG1heSBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgdG8gaW5jbHVkZSBvbmx5IGEgc3Vic2V0IG9mIHRoZQotICAgICAgICBmaWVsZHMgb3IgcHJvcGVydGllcy4gSWYgbWV0YWRhdGEtY29tcGxldGUgZm9yIHRoZSBlbnRpdHkgaXMgdHJ1ZQotICAgICAgICB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBkZWZhdWx0ZWQgYWNjb3JkaW5nCi0gICAgICAgIHRvIHRoZSBkZWZhdWx0IHJ1bGVzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9Im9ybTppZCIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZC1pZCIgdHlwZT0ib3JtOmVtYmVkZGVkLWlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iIHR5cGU9Im9ybTpiYXNpYy1jb2xsZWN0aW9uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1tYXAiIHR5cGU9Im9ybTpiYXNpYy1tYXAiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW9uZSIgdHlwZT0ib3JtOm1hbnktdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tbWFueSIgdHlwZT0ib3JtOm9uZS10by1tYW55IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tb25lIiB0eXBlPSJvcm06b25lLXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSIgdHlwZT0ib3JtOnZhcmlhYmxlLW9uZS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tbWFueSIgdHlwZT0ib3JtOm1hbnktdG8tbWFueSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkIiB0eXBlPSJvcm06ZW1iZWRkZWQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWF0aW9uIiB0eXBlPSJvcm06dHJhbnNmb3JtYXRpb24iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQotICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVycyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eUxpc3RlbmVycyB7Ci0gICAgICAgICAgQ2xhc3NbXSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lciIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIGFuIGVudGl0eSBsaXN0ZW5lciB0byBiZSBpbnZva2VkIGF0IGxpZmVjeWNsZSBldmVudHMKLSAgICAgICAgZm9yIHRoZSBlbnRpdGllcyB0aGF0IGxpc3QgdGhpcyBsaXN0ZW5lci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVBlcnNpc3Qge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFBlcnNpc3Qge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtbG9hZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdExvYWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvcGVydHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgQSB1c2VyIGRlZmluZWQgbWFwcGluZydzIHByb3BlcnR5LgotCQlAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLQkJQFJldGVudGlvbihSVU5USU1FKQotCQlwdWJsaWMgQGludGVyZmFjZSBQcm9wZXJ0eSB7Ci0JCQkvKioKLQkJCSogUHJvcGVydHkgbmFtZS4KLQkJCSovIAotCQkJU3RyaW5nIG5hbWUoKTsKLQkJCQotCQkJLyoqCi0JCQkqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBQcm9wZXJ0eSB2YWx1ZSwKLQkJCSogY29udmVydGVkIHRvIGFuIGluc3RhbmNlIG9mIHZhbHVlVHlwZS4KLQkJCSovIAotCQkJU3RyaW5nIHZhbHVlKCk7Ci0JCQkKLQkJCS8qKgotCQkJKiBQcm9wZXJ0eSB2YWx1ZSB0eXBlLgotCQkJKiBUaGUgdmFsdWUgY29udmVydGVkIHRvIHZhbHVlVHlwZSBieSBDb252ZXJzaW9uTWFuYWdlci4KLQkJCSogSWYgc3BlY2lmaWVkIG11c3QgYmUgYSBzaW1wbGUgdHlwZSB0aGF0IGNvdWxkIGJlIGhhbmRsZWQgYnkgCi0JCQkqIENvbnZlcnNpb25NYW5hZ2VyOiAKLQkJCSogbnVtZXJpY2FsLCBib29sZWFuLCB0ZW1wb3JhbC4gIAotCQkJKi8gCi0JCQlDbGFzcyB2YWx1ZVR5cGUoKSBkZWZhdWx0IFN0cmluZy5jbGFzczsKLQkJfQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktaGludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkgCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5SGludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOyAvL25hbWVkIFNxbFJlc3VsdFNldE1hcHBpbmcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3FsUmVzdWx0U2V0TWFwcGluZyB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBFbnRpdHlSZXN1bHRbXSBlbnRpdGllcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ29sdW1uUmVzdWx0W10gY29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LXJlc3VsdCIgdHlwZT0ib3JtOmVudGl0eS1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tcmVzdWx0IiB0eXBlPSJvcm06Y29sdW1uLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5UmVzdWx0IHsKLSAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcygpOwotICAgICAgICAgIEZpZWxkUmVzdWx0W10gZmllbGRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtcmVzdWx0IiB0eXBlPSJvcm06ZmllbGQtcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGaWVsZFJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcGtKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgIH0KLQotICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaXF1ZS1jb25zdHJhaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50IHsKLSAgICAgICAgICBTdHJpbmdbXSBjb2x1bW5OYW1lcygpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZ2VuZXJhdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gR2VuZXJhdGlvblR5cGUgeyBUQUJMRSwgU0VRVUVOQ0UsIElERU5USVRZLCBBVVRPIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VRVUVOQ0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklERU5USVRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWNjZXNzLW1ldGhvZHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIENvbHVtbiBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZC1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkQ2xhc3MgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQtaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2llbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2llbnQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiAvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWMgewotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9iIiB0eXBlPSJvcm06bG9iIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLXRyYW5zZm9ybWVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkJLyoqCi0JCSAqIEFubm90YXRpb24gZm9yIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLQkJICogVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgd3JpdGUtb25seSwgaXQgc2hvdWxkIGhhdmUgYSAKLQkJICogUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIGNvbHVtbihzKSAKLQkJICogdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLQkJICogIAotCQkgKiBBbHNvIHVubGVzcyBpdCdzIGEgcmVhZC1vbmx5IG1hcHBpbmcsIGVpdGhlciBXcml0ZVRyYW5zZm9ybWVyIAotCQkgKiBhbm5vdGF0aW9uIG9yIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24gc2hvdWxkIGJlIHNwZWNpZmllZC4gRWFjaCAKLQkJICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLQkJICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXIpLiAKLQkJICovIAotCQlAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLQkJQFJldGVudGlvbihSVU5USU1FKQotCQlwdWJsaWMgQGludGVyZmFjZSBSZWFkVHJhbnNmb3JtZXIgewotCQkgICAgLyoqCi0JCSAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0JCSAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuQXR0cmlidXRlVHJhbnNmb3JtZXIgCi0JCSAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIAotCQkgICAgICogYnVpbGRBdHRyaWJ1dGVWYWx1ZSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSAKLQkJICAgICAqIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUuCi0JCSAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLQkJICAgICAqLyAKLQkJICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0JCQotCQkgICAgLyoqCi0JCSAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAotCQkgICAgICogYSB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlIChub3QgYXNzaWducyB0aGUgdmFsdWUgdG8gCi0JCSAgICAgKiB0aGUgYXR0cmlidXRlKS4gRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgCi0JCSAgICAgKiBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLQkJICAgICAqLyAKLQkJICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOwotCQl9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkJLyoqCi0JCSAqIEFubm90YXRpb24gZm9yIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLQkJICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLQkJICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXIpLgotCQkgKiAgCi0JCSAqIEEgc2luZ2xlIFdyaXRlVHJhbnNmb3JtZXIgbWF5IGJlIHNwZWNpZmllZCBkaXJlY3RseSBvbiB0aGUgbWV0aG9kIG9yIAotCQkgKiBhdHRyaWJ1dGUuIE11bHRpcGxlIFdyaXRlVHJhbnNmb3JtZXJzIHNob3VsZCBiZSB3cmFwcGVkIGludG8gCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24uIE5vIFdyaXRlVHJhbnNmb3JtZXJzIHNwZWNpZmllZCBmb3IgCi0JCSAqIHJlYWQtb25seSBtYXBwaW5nLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCAKLQkJICogc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgCi0JCSAqIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotCQkgKi8gCi0JCUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotCQlAUmV0ZW50aW9uKFJVTlRJTUUpCi0JCXB1YmxpYyBAaW50ZXJmYWNlIFdyaXRlVHJhbnNmb3JtZXIgewotCQkgICAgLyoqCi0JCSAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0JCSAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuRmllbGRUcmFuc2Zvcm1lciAKLQkJICAgICAqIGludGVyZmFjZS4gVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkLCBpdHMgYnVpbGRGaWVsZFZhbHVlIAotCQkgICAgICogd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSAKLQkJICAgICAqIGNvbHVtbi4gTm90ZSB0aGF0IGZvciBkZGwgZ2VuZXJhdGlvbiBhbmQgcmV0dXJuaW5nIHRvIGJlIAotCQkgICAgICogc3VwcG9ydGVkIHRoZSBtZXRob2QgYnVpbGRGaWVsZFZhbHVlIGluIHRoZSBjbGFzcyBzaG91bGQgYmUgCi0JCSAgICAgKiBkZWZpbmVkIHRvIHJldHVybiB0aGUgcmVsZXZhbnQgSmF2YSB0eXBlLCBub3QganVzdCBPYmplY3QgYXMgCi0JCSAgICAgKiBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UsIGZvciBpbnN0YW5jZToKLQkJICAgICAqIHB1YmxpYyBUaW1lIGJ1aWxkRmllbGRWYWx1ZShPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBmaWVsZE5hbWUsIFNlc3Npb24gc2Vzc2lvbikuCi0JCSAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLQkJICAgICAqLyAKLQkJICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0JCQotCQkgICAgLyoqCi0JCSAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAotCQkgICAgICogYSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIGNvbHVtbi4KLQkJICAgICAqIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSBzdXBwb3J0ZWQgdGhlIAotCQkgICAgICogbWV0aG9kIHNob3VsZCBiZSBkZWZpbmVkIHRvIHJldHVybiBhIHBhcnRpY3VsYXIgdHlwZSwgbm90IGp1c3QgCi0JCSAgICAgKiBPYmplY3QsIGZvciBpbnN0YW5jZToKLQkJICAgICAqIHB1YmxpYyBUaW1lIGdldFN0YXJ0VGltZSgpLgotCQkgICAgICogVGhlIG1ldGhvZCBtYXkgcmVxdWlyZSBhIFRyYW5zaWVudCBhbm5vdGF0aW9uIHRvIGF2b2lkIGJlaW5nIAotCQkgICAgICogbWFwcGVkIGFzIEJhc2ljIGJ5IGRlZmF1bHQuCi0JCSAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLQkJICAgICAqLyAKLQkJICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOwotCQkKLQkJICAgIC8qKgotCQkgICAgICogU3BlY2lmeSBoZXJlIHRoZSBjb2x1bW4gaW50byB3aGljaCB0aGUgdmFsdWUgc2hvdWxkIGJlIHdyaXR0ZW4uCi0JCSAgICAgKiBUaGUgb25seSBjYXNlIHdoZW4gdGhpcyBjb3VsZCBiZSBza2lwcGVkIGlzIGlmIGEgc2luZ2xlIAotCQkgICAgICogV3JpdGVUcmFuc2Zvcm1lciBhbm5vdGF0ZXMgYW4gYXR0cmlidXRlIC0gdGhlIGF0dHJpYnV0ZSdzIG5hbWUgCi0JCSAgICAgKiB3aWxsIGJlIHVzZWQgYXMgYSBjb2x1bW4gbmFtZS4KLQkJICAgICAqLyAKLQkJICAgIENvbHVtbiBjb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0JCX0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCS8qKgotCQkgKiBUcmFuc2Zvcm1hdGlvbiBpcyBhbiBvcHRpb25hbCBhbm5vdGF0aW9uIGZvciAKLQkJICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotCQkgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgYWxsb3dzIHRvIG1hcCBhbiBhdHRyaWJ1dGUgdG8gb25lIG9yIG1vcmUgCi0JCSAqIGRhdGFiYXNlIGNvbHVtbnMuCi0JCSAqIAotCQkgKiBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uIGlzIGFuIG9wdGlvbmFsIHBhcnQgb2YgCi0JCSAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBkZWZpbml0aW9uLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyAKLQkJICogd3JpdGUtb25seSwgaXQgc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgCi0JCSAqIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotCQkgKiBBbHNvIHVubGVzcyBpdCdzIGEgcmVhZC1vbmx5IG1hcHBpbmcsIGVpdGhlciBXcml0ZVRyYW5zZm9ybWVyIAotCQkgKiBhbm5vdGF0aW9uIG9yIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24gc2hvdWxkIGJlIHNwZWNpZmllZC4gRWFjaCAKLQkJICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLQkJICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXIpLiAKLQkJICovIAotCQlAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLQkJQFJldGVudGlvbihSVU5USU1FKQotCQlwdWJsaWMgQGludGVyZmFjZSBUcmFuc2Zvcm1hdGlvbiB7Ci0JCSAgICAvKioKLQkJICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0JCSAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotCQkgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKLQkJICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotCQkgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0JCSAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KLQkJICAgICAqLwotCQkgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQkJICAgIAotCQkgICAgLyoqCi0JCSAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcHRpb25hbCBlbGVtZW50IGlzIGEgaGludCBhcyB0byB3aGV0aGVyIHRoZSB2YWx1ZQotCQkgICAgICogIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSBtYXkgYmUgbnVsbC4gSXQgaXMgZGlzcmVnYXJkZWQKLQkJICAgICAqICBmb3IgcHJpbWl0aXZlIHR5cGVzLCB3aGljaCBhcmUgY29uc2lkZXJlZCBub24tb3B0aW9uYWwuCi0JCSAgICAgKi8KLQkJICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0JCX0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOnJlYWQtdHJhbnNmb3JtZXIiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3cml0ZS10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOndyaXRlLXRyYW5zZm9ybWVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvYiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvYiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUZW1wb3JhbCB7Ci0gICAgICAgICAgVGVtcG9yYWxUeXBlIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOnRlbXBvcmFsLXR5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgewotICAgICAgICAgIERBVEUsIC8vIGphdmEuc3FsLkRhdGUKLSAgICAgICAgICBUSU1FLCAvLyBqYXZhLnNxbC5UaW1lCi0gICAgICAgICAgVElNRVNUQU1QIC8vIGphdmEuc3FsLlRpbWVzdGFtcAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFURSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW1lcmF0ZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnVtZXJhdGVkIHsKLSAgICAgICAgICBFbnVtVHlwZSB2YWx1ZSgpIGRlZmF1bHQgT1JESU5BTDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06ZW51bS10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBFbnVtVHlwZSB7Ci0gICAgICAgICAgT1JESU5BTCwKLSAgICAgICAgICBTVFJJTkcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1JESU5BTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4gICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FzY2FkZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gQ2FzY2FkZVR5cGUgeyBBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0h9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWFsbCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1tZXJnZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlbW92ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlZnJlc2giIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4gICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+ICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pblRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGludmVyc2VKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW52ZXJzZS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hbnlUb01hbnkgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBHZW5lcmF0ZWRWYWx1ZSB7Ci0gICAgICAgICAgR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IEFVVE87Ci0gICAgICAgICAgU3RyaW5nIGdlbmVyYXRvcigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06Z2VuZXJhdGlvbi10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJhdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7Ci0gICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUKLSAgICAgICAgICB7IFNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1N9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JWYWx1ZSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRGlzY3JpbWluYXRvclR5cGUgeyBTVFJJTkcsIENIQVIsIElOVEVHRVIgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5URUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiRFRZUEUiOwotICAgICAgICAgIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKCkgZGVmYXVsdCBTVFJJTkc7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDMxOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgZW1iZWRkYWJsZSBvYmplY3RzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIGluIHRoZSBjbGFzcy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkYWJsZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIAotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGEgbWFwcGVkIHN1cGVyY2xhc3MuIElzIAotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKLSAgICAgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgYmUgcmVjdXJzaXZlbHkgCi0gICAgICAgIGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3N7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXkiIHR5cGU9Im9ybTpwcmltYXJ5LWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAxOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudAotICAgICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgY29udmVydGVyQ2xhc3MoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT2JqZWN0VHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgY29udmVyc2lvbiB2YWx1ZXMgdG8gYmUgdXNlZCAKLSAgICAgICAgICAgKiB3aXRoIHRoZSBvYmplY3QgY29udmVydGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnNpb25WYWx1ZVtdIGNvbnZlcnNpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IGEgZGVmYXVsdCBvYmplY3QgdmFsdWUuIFVzZWQgZm9yIAotICAgICAgICAgICAgKiBsZWdhY3kgZGF0YSBpZiB0aGUgZGF0YSB2YWx1ZSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiIHR5cGU9Im9ybTpjb252ZXJzaW9uLXZhbHVlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1vYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVyc2lvbi12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVyc2lvblZhbHVlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGRhdGFiYXNlIHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkYXRhVmFsdWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgb2JqZWN0IHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBvYmplY3RWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RydWN0Q29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IAotICAgICAgICAgICAqIGltcGxlbWVudCB0aGUgRWNsaXBzZUxpbmsgaW50ZXJmYWNlIAotICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNvbnZlcnRlcigpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IG9uIGFuIEVudGl0eS4KLSAgICAgICAgICogSXQgaXMgcmVxdWlyZWQgdGhhdCBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICogYXMgdGhlIGFyZ3VtZW50LgotICAgICAgICAgKiAKLSAgICAgICAgICogQSBDb3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIG9yIAotICAgICAgICAgKiBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRm9yIGluc3RhbmNlOgotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDb3B5UG9saWN5KCJleGFtcGxlLk15Q29weVBvbGljeSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb3B5UG9saWN5IHsKLQotICAgICAgICAvKgotICAgICAgICAqIChSZXF1aXJlZCkKLSAgICAgICAgKiBUaGlzIGRlZmluZXMgdGhlIGNsYXNzIG9mIHRoZSBjb3B5IHBvbGljeS4gSXQgbXVzdCBzcGVjaWZ5IGEgY2xhc3MgCi0gICAgICAgICogdGhhdCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeQotICAgICAgICAqLwotICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQW4gSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCi0gICAgICAgICAqIG9uIGFuIEVudGl0eS4gSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgaXMgdGhlIGRlZmF1bHQgQ29weVBvbGljeSBpbiAKLSAgICAgICAgICogRWNsaXBzZUxpbmsgYW5kIHRoZXJlZm9yZSB0aGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGlzIG9ubHkgdXNlZCB0byAKLSAgICAgICAgICogb3ZlcnJpZGUgb3RoZXIgdHlwZXMgb2YgY29weSBwb2xpY2llcwotICAgICAgICAgKiAKLSAgICAgICAgICogQW4gSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBFeGFtcGxlOgotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBJbnN0YW50aWF0aW9uQ29weVBvbGljeSAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHsKLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5DbG9uZUNvcHlQb2xpY3kgb24gYW4gCi0gICAgICAgICAqIEVudGl0eS4gQSBDbG9uZUNvcHlQb2xpY3kgbXVzdCBzcGVjaWZ5IGF0IG9uZSBvciBib3RoIG9mIHRoZSAibWV0aG9kIiAKLSAgICAgICAgICogb3IgIndvcmtpbmdDb3B5TWV0aG9kIi4gIndvcmtpbmdDb3B5TWV0aG9kIiBpcyB1c2VkIHRvIGNsb25lIG9iamVjdHMgCi0gICAgICAgICAqIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgdXNlciBhcyB0aGV5IGFyZSByZWdpc3RlcmVkIGluIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIHRyYW5zYWN0aW9uYWwgbWVjaGFuaXNtLCB0aGUgVW5pdE9mV29yay4gIm1ldGhvZCIgd2lsbCAKLSAgICAgICAgICogYmUgdXNlZCBmb3IgdGhlIGNsb25lIHRoYXQgaXMgdXNlZCBmb3IgY29tcGFyaXNvbiBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAqICAKLSAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MKLSAgICAgICAgICogb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIiwgd29ya2luZ0NvcHlNZXRob2Q9Im15V29ya2luZ0NvcHlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAgQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KHdvcmtpbmdDb3B5TWV0aG9kTmFtZT0ibXlXb3JraW5nQ29weUNsb25lIikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsb25lQ29weVBvbGljeSB7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCB0aGlzIGRlZmluZXMgCi0gICAgICAgICAgICAgKiBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBjbG9uZSB0aGF0IHdpbGwgYmUgdXNlZCAKLSAgICAgICAgICAgICAqIGZvciBjb21wYXJpc29uIGJ5Ci0gICAgICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpCi0gICAgICAgICAgICAgKiBFaXRoZXIgbWV0aG9kIG9yIHdvcmtpbmdDb3B5TWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkCi0gICAgICAgICAgICAgKiB0aGlzIGRlZmluZXMgYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG9iamVjdCByZXR1cm5lZCB3aGVuIHJlZ2lzdGVyaW5nIGFuIAotICAgICAgICAgICAgICogT2JqZWN0IGluIGFuIEVjbGlwc2VMaW5rIFVuaXRPZldvcmsKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIHdvcmtpbmdDb3B5TWV0aG9kKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IndvcmtpbmctY29weS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGFibGUuIElmIGl0IGlzIG5vdCAKLSAgICAgICAgICAgKiBzcGVjaWZpZWQsIGl0IGlzIGRlZmF1bHRlZCB0byB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nOiAKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGVudGl0eTsgIl8iIDsgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCAKLSAgICAgICAgICAgKiBwcm9wZXJ0eSBvciBmaWVsZCBvZiB0aGUgc291cmNlIGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2F0YWxvZyBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgY2F0YWxvZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2NoZW1hIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBzY2hlbWEuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVc2VkIHRvIHNwZWNpZnkgYSBwcmltYXJ5IGtleSBjb2x1bW4gdGhhdCBpcyB1c2VkIGFzIGEgCi0gICAgICAgICAgICogZm9yZWlnbiBrZXkgdG8gam9pbiB0byBhbm90aGVyIHRhYmxlLiBJZiB0aGUgc291cmNlIGVudGl0eSB1c2VzIGEgCi0gICAgICAgICAgICogY29tcG9zaXRlIHByaW1hcnkga2V5LCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG11c3QgYmUgc3BlY2lmaWVkIAotICAgICAgICAgICAqIGZvciBlYWNoIGZpZWxkIG9mIHRoZSBjb21wb3NpdGUgcHJpbWFyeSBrZXkuIEluIGEgc2luZ2xlIHByaW1hcnkgCi0gICAgICAgICAgICoga2V5IGNhc2UsIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbWF5IG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkLiAKLSAgICAgICAgICAgKiBEZWZhdWx0aW5nIHdpbGwgYXBwbHkgb3RoZXJ3aXNlIGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogbmFtZSwgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIAotICAgICAgICAgICAqIG9mIHRoZSBzb3VyY2UgZW50aXR5LiByZWZlcmVuY2VkQ29sdW1uTmFtZSwgdGhlIHNhbWUgbmFtZSBvZiAKLSAgICAgICAgICAgKiBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVuaXF1ZSBjb25zdHJhaW50cyB0aGF0IGFyZSB0byBiZSBwbGFjZWQgb24gdGhlIHRhYmxlLiAKLSAgICAgICAgICAgKiBUaGVzZSBhcmUgb25seSB1c2VkIGlmIHRhYmxlIGdlbmVyYXRpb24gaXMgaW4gZWZmZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307IAotICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljQ29sbGVjdGlvbiB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgdGhhdCAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgaGludCB0byAKLSAgICAgICAgICAgKiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gCi0gICAgICAgICAgICogTEFaWS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7IAotIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIHZhbHVlIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06Y29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1tYXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpY01hcCB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgdGhhdCAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgaGludCB0byAKLSAgICAgICAgICAgKiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gCi0gICAgICAgICAgICogTEFaWS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgbWFwIAotICAgICAgICAgICAqIGtleS4gSWYgdGhlIG5hbWUgb24gdGUga2V5IGNvbHVtbiBpcyAiIiwgdGhlIG5hbWUgd2lsbCBkZWZhdWx0IHRvOgotICAgICAgICAgICAqIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvciBmaWVsZDsgIl9LRVkiLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiBrZXlDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIGtleSBjb252ZXJ0ZXIuIERlZmF1bHQgaXMgZXF1aXZhbGVudCB0byAKLSAgICAgICAgICAgKiBzcGVjaWZ5aW5nIEBDb252ZXJ0KCJub25lIiksIG1lYW5pbmcgbm8gY29udmVydGVyIHdpbGwgYmUgYWRkZWQgdG8gCi0gICAgICAgICAgICogdGhlIGRpcmVjdCBtYXAga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnQga2V5Q29udmVydGVyKCkgZGVmYXVsdCBAQ29udmVydDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGRhdGEgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdmFsdWUgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBjb2x1bW4gbWFwcGluZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IHZhbHVlQ29udmVydGVyKCkgZGVmYXVsdCBAQ29udmVydDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXktY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXktY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4gICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjIiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTpjb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSm9pbkZldGNoVHlwZSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBpbm5lciBqb2luIGlzIHVzZWQgdG8gZmV0Y2ggdGhlIHJlbGF0ZWQgb2JqZWN0LgotICAgICAgICAgKiBUaGlzIGRvZXMgbm90IGFsbG93IGZvciBudWxsL2VtcHR5IHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIElOTkVSLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBpbm5lciBqb2luIGlzIHVzZWQgdG8gZmV0Y2ggdGhlIHJlbGF0ZWQgb2JqZWN0LgotICAgICAgICAgKiBUaGlzIGFsbG93cyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBPVVRFUiwKLSAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOTkVSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIG9wdGltaXN0aWMtbG9ja2luZyBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICogb3B0aW1pc3RpYyBsb2NraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyAKLSAgICAgICAgICogZW50aXRpZXMuIEFuIG9wdGltaXN0aWMtbG9ja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbgotICAgICAgICAgKiBhbiBlbnRpdHkgb3IgbWFwcGVkLXN1cGVyY2xhc3MuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJdCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG9wdGltaXN0aWMtbG9ja2luZy10eXBlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9wdGltaXN0aWNMb2NraW5nIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgdG8gdXNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIE9wdGltaXN0aWNMb2NraW5nVHlwZSB0eXBlKCkgZGVmYXVsdCBWRVJTSU9OX0NPTFVNTjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgb2YgdHlwZSAKLSAgICAgICAgICAgKiBTRUxFQ1RFRF9DT0xVTU5TLCB0aGlzIGFubm90YXRpb24gbWVtYmVyIGJlY29tZXMgYSAoUmVxdWlyZWQpIAotICAgICAgICAgICAqIGZpZWxkLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbltdIHNlbGVjdGVkQ29sdW1ucygpIGRlZmF1bHQge307Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgd2hlcmUgdGhlIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgc2hvdWxkIAotICAgICAgICAgICAqIGNhc2NhZGUgbG9jay4gQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIHdpdGggVkVSU0lPTl9DT0xVTU4gbG9ja2luZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIGNhc2NhZGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlbGVjdGVkLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAKLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXNjYWRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgc2ltcGxlIHR5cGUgdGhhdCBpcyB1c2VkIHdpdGhpbiBhbiBvcHRpbWlzdGljLWxvY2tpbmcgCi0gICAgICAgICAqIHNwZWNpZmljYXRpb24gdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBvcHRpbWlzdGljLWxvY2tpbmcgdGhhdAotICAgICAgICAgKiBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgZW50aXRpZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBPcHRpbWlzdGljTG9ja2luZ1R5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBldmVyeSBmaWVsZCBpbiB0aGUgdGFibGUKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQKLSAgICAgICAgICAgKiBoYXMgYmVlbiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFMTF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIG9ubHkgdGhlIGNoYW5nZWQgZmllbGRzCi0gICAgICAgICAgICogaW4gdGhlIFdIRVJFIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gSWYgYW55IGZpZWxkIGhhcyBiZWVuCi0gICAgICAgICAgICogY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gQSBkZWxldGUKLSAgICAgICAgICAgKiB3aWxsIG9ubHkgY29tcGFyZSB0aGUgcHJpbWFyeSBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0hBTkdFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgY29tcGFyZXMgc2VsZWN0ZWQgZmllbGRzIGluIHRoZSBXSEVSRQotICAgICAgICAgICAqIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZSBvciBhIGRlbGV0ZS4gSWYgYW55IGZpZWxkIGhhcyBiZWVuCi0gICAgICAgICAgICogY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gTm90ZSB0aGF0Ci0gICAgICAgICAgICogdGhlIGZpZWxkcyBzcGVjaWZpZWQgbXVzdCBiZSBtYXBwZWQgYW5kIG5vdCBiZSBwcmltYXJ5IGtleXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VMRUNURURfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBhIHNpbmdsZSB2ZXJzaW9uIG51bWJlcgotICAgICAgICAgICAqIGluIHRoZSB3aGVyZSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUuIFRoZSB2ZXJzaW9uIGZpZWxkIG11c3QgYmUKLSAgICAgICAgICAgKiBtYXBwZWQgYW5kIG5vdCBiZSB0aGUgcHJpbWFyeSBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgVkVSU0lPTl9DT0xVTU4KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTExfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBTkdFRF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRUxFQ1RFRF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWRVJTSU9OX0NPTFVNTiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkvKiogCi0JCSAqICBUaGUgUHJpbWFyeUtleSBhbm5vdGF0aW9uIGFsbG93cyBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9mIHRoZSBJZC4KLQkJICogIEEgdmFsaWRhdGlvbiBwb2xpY3kgY2FuIGJlIGdpdmVuIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgaWYgemVybyBpcyBhIHZhbGlkIGlkIHZhbHVlLgotCQkgKiAgVGhlIHNldCBvZiBwcmltYXJ5IGtleSBjb2x1bW5zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBwcmVjaXNlbHkuCi0JCSAqIAotCQkgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLQkJICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMQotCQkgKi8gCi0JCUBUYXJnZXQoe1RZUEV9KQotCQlAUmV0ZW50aW9uKFJVTlRJTUUpCi0JCXB1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlLZXkgewotCQkgICAgLyoqCi0JCSAgICAgKiAoT3B0aW9uYWwpIENvbmZpZ3VyZXMgd2hhdCBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0JCSAgICAgKiBCeSBkZWZhdWx0IDAgaXMgbm90IGEgdmFsaWQgaWQgdmFsdWUsIHRoaXMgY2FuIGJlIHVzZWQgdG8gYWxsb3cgMCBpZCB2YWx1ZXMuCi0JCSAgICAgKi8KLQkJICAgIElkVmFsaWRhdGlvbiB2YWxpZGF0aW9uKCkgZGVmYXVsdCBJZFZhbGlkYXRpb24uWkVSTzsgCi0JCQotCQkgICAgLyoqCi0JCSAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBkaXJlY3RseS4KLQkJICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBASWQgaWYgdGhlIHByaW1hcnkga2V5IGluY2x1ZGVzIGEgbm9uIGJhc2ljIGZpZWxkLAotCQkgICAgICogc3VjaCBhcyBhIGZvcmVpZ24ga2V5LCBvciBhIGluaGVyaXRhbmNlIGRpc2NyaW1pbmF0b3IsIGVtYmVkZGVkLCBvciB0cmFuc2Zvcm1hdGlvbiBtYXBwZWQgZmllbGQuCi0JCSAgICAgKi8KLQkJICAgIENvbHVtbltdIGNvbHVtbnMoKSBkZWZhdWx0IHt9OwotCQl9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAKLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0aW9uIiB0eXBlPSJvcm06aWQtdmFsaWRhdGlvbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iaWQtdmFsaWRhdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCS8qKiAKLQkJICogVGhlIElkVmFsaWRhdGlvbiBlbnVtIGRldGVybWluZXMgdGhlIHR5cGUgdmFsdWUgdGhhdCBhcmUgdmFsaWQgZm9yIGFuIElkLgotCQkgKiBCeSBkZWZhdWx0IG51bGwgaXMgbm90IGFsbG93ZWQsIGFuZCAwIGlzIG5vdCBhbGxvdyBmb3Igc2luZ2xldG9uIGlkcyBvZiBsb25nIG9yIGludCB0eXBlLgotCQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBaRVJPIGZvciBzaW5nbGV0b24gaWRzLCBhbmQgTlVMTCBmb3IgY29tcG9zaXRlIGlkcy4KLQkJICogVGhpcyBjYW4gYmUgc2V0IHVzaW5nIHRoZSBAUHJpbWFyeUtleSBhbm5vdGF0aW9uLCBvciBDbGFzc0Rlc2NyaXB0b3IgQVBJLgotCQkgKiAKLQkJICogQHNlZSBQcmltYXJ5S2V5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuQ2xhc3NEZXNjcmlwdG9yI3NldElkVmFsaWRhdGlvbihJZFZhbGlkYXRpb24pCi0JCSAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotCQkgKiBAc2luY2UgRWNsaXBzZUxpbmsgMS4wIAotCQkgKi8gCi0JCXB1YmxpYyBlbnVtIElkVmFsaWRhdGlvbiB7Ci0JCSAgICAvKioKLQkJICAgICAqIE9ubHkgbnVsbCBpcyBub3QgYWxsb3dlZCBhcyBhbiBpZCB2YWx1ZSwgMCBpcyBhbGxvd2VkLgotCQkgICAgICovCi0JCSAgICBOVUxMLAotCQkKLQkJICAgIC8qKgotCQkgICAgICogbnVsbCBhbmQgMCBhcmUgbm90IGFsbG93ZWQsIChvbmx5IGludCBhbmQgbG9uZykuCi0JCSAgICAgKi8KLQkJICAgIFpFUk8sCi0JCQotCQkgICAgLyoqCi0JCSAgICAgKiBObyBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0JCSAgICAgKi8KLQkJICAgIE5PTkUKLQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaRVJPIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gICAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FjaGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDYWNoZSBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5pbnZhbGlkYXRpb24uQ2FjaGVJbnZhbGlkYXRpb25Qb2xpY3kgCi0gICAgICAgICAqIHdoaWNoIHNldHMgb2JqZWN0cyBpbiBFY2xpcHNlTGluaydzIGlkZW50aXR5IG1hcHMgdG8gYmUgaW52YWxpZCAKLSAgICAgICAgICogZm9sbG93aW5nIGdpdmVuIHJ1bGVzLiBCeSBkZWZhdWx0IGluIEVjbGlwc2VMaW5rLCBvYmplY3RzIGRvIG5vdCAKLSAgICAgICAgICogZXhwaXJlIGluIHRoZSBjYWNoZS4gU2V2ZXJhbCBkaWZmZXJlbnQgcG9saWNpZXMgYXJlIGF2YWlsYWJsZSB0byAKLSAgICAgICAgICogYWxsb3cgb2JqZWN0cyB0byBleHBpcmUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlVHlwZQotICAgICAgICAgKiAKLSAgICAgICAgICogQSBDYWNoZSBhbm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5IG9yIE1hcHBlZFN1cGVyY2xhc3MuIAotICAgICAgICAgKiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDYWNoZSBhbm5vdGF0aW9uIHNob3VsZCBvbmx5IGJlIGRlZmluZWQgCi0gICAgICAgICAqIG9uIHRoZSByb290IG9mIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDYWNoZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBjYWNoZSB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENhY2hlVHlwZSB0eXBlKCkgZGVmYXVsdCBTT0ZUX1dFQUs7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBzaXplIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IHNpemUoKSBkZWZhdWx0IDEwMDsKLQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIENhY2hlZCBpbnN0YW5jZXMgaW4gdGhlIHNoYXJlZCBjYWNoZSBvciBhIGNsaWVudCAKLQkgICAgICAgICAqIGlzb2xhdGVkIGNhY2hlLgotCSAgICAgICAgICovIAotCSAgICAgICAgYm9vbGVhbiBzaGFyZWQoKSBkZWZhdWx0IHRydWU7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgRXhwaXJlIGNhY2hlZCBpbnN0YW5jZSBhZnRlciBhIGZpeCBwZXJpb2Qgb2YgdGltZSAobXMpLiAKLQkgICAgICAgICAqIFF1ZXJpZXMgZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIAotCSAgICAgICAgICogdG8gdGhlIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0JICAgICAgICAgKi8gCi0JICAgICAgICBpbnQgZXhwaXJ5KCkgZGVmYXVsdCAtMTsgLy8gbWludXMgb25lIGlzIG5vIGV4cGlyeS4KLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGEgc3BlY2lmaWMgdGltZSBvZiBkYXkuIFF1ZXJpZXMgCi0JICAgICAgICAgKiBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgdG8gdGhlIAotCSAgICAgICAgICogZGF0YWJhc2UgZm9yIGEgcmVmcmVzaGVkIGNvcHkKLQkgICAgICAgICAqLyAKLQkgICAgICAgIFRpbWVPZkRheSBleHBpcnlUaW1lT2ZEYXkoKSBkZWZhdWx0IEBUaW1lT2ZEYXkoc3BlY2lmaWVkPWZhbHNlKTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBGb3JjZSBhbGwgcXVlcmllcyB0aGF0IGdvIHRvIHRoZSBkYXRhYmFzZSB0byBhbHdheXMgCi0JICAgICAgICAgKiByZWZyZXNoIHRoZSBjYWNoZS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGJvb2xlYW4gYWx3YXlzUmVmcmVzaCgpIGRlZmF1bHQgZmFsc2U7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlLCByZWZyZXNoIHRoZQotCSAgICAgICAgICogY2FjaGUgb25seSBpZiB0aGUgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBkYXRhYmFzZSBieSBhIHF1ZXJ5IGlzIAotCSAgICAgICAgICogbmV3ZXIgdGhhbiB0aGUgZGF0YSBpbiB0aGUgY2FjaGUgKGFzIGRldGVybWluZWQgYnkgdGhlIG9wdGltaXN0aWMgCi0JICAgICAgICAgKiBsb2NraW5nIGZpZWxkKQotCSAgICAgICAgICovIAotCSAgICAgICAgYm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIoKSBkZWZhdWx0IGZhbHNlOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIGZvcmNlIGFsbCBxdWVyaWVzIHRvIGJ5cGFzcyB0aGUgCi0JICAgICAgICAgKiBjYWNoZSBmb3IgaGl0cyBidXQgc3RpbGwgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBjYWNoZSBmb3IgaWRlbnRpdHkuIAotCSAgICAgICAgICogVGhpcyBmb3JjZXMgYWxsIHF1ZXJpZXMgdG8gaGl0IHRoZSBkYXRhYmFzZS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGJvb2xlYW4gZGlzYWJsZUhpdHMoKSBkZWZhdWx0IGZhbHNlOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBjYWNoZSBjb29yZGluYXRpb24gbW9kZS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKCkgZGVmYXVsdCBTRU5EX09CSkVDVF9DSEFOR0VTOwotCSAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmNob2ljZT4KLQkgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeSIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCIvPgotCSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5LXRpbWUtb2YtZGF5IiB0eXBlPSJvcm06dGltZS1vZi1kYXkiIG1pbk9jY3Vycz0iMCIvPgotCSAgPC94c2Q6Y2hvaWNlPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXJlZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjYWNoZS10eXBlIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbHdheXMtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZnJlc2gtb25seS1pZi1uZXdlciIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2FibGUtaGl0cyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvb3JkaW5hdGlvbi10eXBlIiB0eXBlPSJvcm06Y2FjaGUtY29vcmRpbmF0aW9uLXR5cGUiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+IAotCi0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLXR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCi0JICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGVUeXBlIGVudW0gaXMgdXNlZCB3aXRoIHRoZSBDYWNoZSBhbm5vdGF0aW9uIGZvciBhIAotICAgICAgICAgKiBwZXJzaXN0ZW50IGNsYXNzLiBJdCBkZWZpbmVzIHRoZSB0eXBlIG9mIElkZW50aXR5TWFwL0NhY2hlIHVzZWQgZm9yIAotICAgICAgICAgKiB0aGUgY2xhc3MuIEJ5IGRlZmF1bHQgdGhlIFNPRlRfV0VBSyBjYWNoZSB0eXBlIGlzIHVzZWQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8KLQkgICAgICBwdWJsaWMgZW51bSBDYWNoZVR5cGUgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBQcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuIENhY2hlcyBhbGwgb2JqZWN0cwotCSAgICAgICAgICogYW5kIGRvZXMgbm90IHJlbW92ZSB0aGVtLiAKLQkgICAgICAgICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIG1heSBiZSBtZW1vcnkgaW50ZW5zaXZlIHdoZW4gbWFueSBvYmplY3RzIGFyZSAKLQkgICAgICAgICAqIHJlYWQuCi0JICAgICAgICAgKi8KLQkgICAgICAgIEZVTEwsCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0JICAgICAgICAgKiBvYmplY3RzIHVzaW5nIHdlYWsgcmVmZXJlbmNlcy4gVGhpcyBtZXRob2QgYWxsb3dzIGZ1bGwgZ2FyYmFnZQotCSAgICAgICAgICogY29sbGVjdGlvbiBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LgotCSAgICAgICAgICovCi0JICAgICAgICBXRUFLLAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotCSAgICAgICAgICogb2JqZWN0cyB1c2luZyBzb2Z0IHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLQkgICAgICAgICAqIGNvbGxlY3Rpb24gd2hlbiBtZW1vcnkgaXMgbG93IGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kCi0JICAgICAgICAgKiBndWFyYW50ZWVkIGlkZW50aXR5LgotCSAgICAgICAgICovCi0JICAgICAgICBTT0ZULAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBXRUFLIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCBpdCBtYWludGFpbnMgYQotCSAgICAgICAgICogbW9zdC1mcmVxdWVudGx5LXVzZWQgc3ViLWNhY2hlLiBUaGUgc2l6ZSBvZiB0aGUgc3ViLWNhY2hlIGlzCi0JICAgICAgICAgKiBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgdGhlIGlkZW50aXR5IG1hcCBhcyBzcGVjaWZpZWQgYnkKLQkgICAgICAgICAqIGRlc2NyaXB0b3IncyBzZXRJZGVudGl0eU1hcFNpemUoKSBtZXRob2QuIFRoZSBzdWItY2FjaGUKLQkgICAgICAgICAqIHVzZXMgc29mdCByZWZlcmVuY2VzIHRvIGVuc3VyZSB0aGF0IHRoZXNlIG9iamVjdHMgYXJlCi0JICAgICAgICAgKiBnYXJiYWdlLWNvbGxlY3RlZCBvbmx5IGlmIHRoZSBzeXN0ZW0gaXMgbG93IG9uIG1lbW9yeS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU09GVF9XRUFLLAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBJZGVudGljYWwgdG8gdGhlIHNvZnQgY2FjaGUgd2VhayAoU09GVF9XRUFLKSBpZGVudGl0eSBtYXAgZXhjZXB0IAotCSAgICAgICAgICogdGhhdCBpdCB1c2VzIGhhcmQgcmVmZXJlbmNlcyBpbiB0aGUgc3ViLWNhY2hlLiBVc2UgdGhpcyBpZGVudGl0eSAKLQkgICAgICAgICAqIG1hcCBpZiBzb2Z0IHJlZmVyZW5jZXMgZG8gbm90IGJlaGF2ZSBwcm9wZXJseSBvbiB5b3VyIHBsYXRmb3JtLgotCSAgICAgICAgICovCi0JICAgICAgICBIQVJEX1dFQUssCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIEEgY2FjaGUgaWRlbnRpdHkgbWFwIG1haW50YWlucyBhIGZpeGVkIG51bWJlciBvZiBvYmplY3RzCi0JICAgICAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiBPYmplY3RzIGFyZSByZW1vdmVkIGZyb20gdGhlIGNhY2hlCi0JICAgICAgICAgKiBvbiBhIGxlYXN0LXJlY2VudGx5LXVzZWQgYmFzaXMuIFRoaXMgbWV0aG9kIGFsbG93cyBvYmplY3QKLQkgICAgICAgICAqIGlkZW50aXR5IGZvciB0aGUgbW9zdCBjb21tb25seSB1c2VkIG9iamVjdHMuCi0JICAgICAgICAgKiBXQVJOSU5HOiBGdXJuaXNoZXMgY2FjaGluZyBhbmQgaWRlbnRpdHksIGJ1dCBkb2VzIG5vdCBndWFyYW50ZWUgCi0JICAgICAgICAgKiBpZGVudGl0eS4KLQkgICAgICAgICAqLwotCSAgICAgICAgQ0FDSEUsCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIFdBUk5JTkc6IERvZXMgbm90IHByZXNlcnZlIG9iamVjdCBpZGVudGl0eSBhbmQgZG9lcyBub3QgY2FjaGUgCi0JICAgICAgICAgKiBvYmplY3RzLgotCSAgICAgICAgICovCi0JICAgICAgICBOT05FCi0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlVMTCIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXRUFLIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlQiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVF9XRUFLIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhBUkRfV0VBSyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUNIRSIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JICA8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAgCi0KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtY29vcmRpbmF0aW9uLXR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCi0JICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENhY2hlIGFubm90YXRpb24uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8gCi0JICAgICAgcHVibGljIGVudW0gQ2FjaGVDb29yZGluYXRpb25UeXBlIHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIGNoYW5nZWQgb2JqZWN0cyBpbmNsdWRpbmcgZGF0YSBhYm91dCB0aGUgY2hhbmdlcy4KLQkgICAgICAgICAqIFRoaXMgZGF0YSBpcyBtZXJnZWQgaW50byB0aGUgcmVjZWl2aW5nIGNhY2hlLgotCSAgICAgICAgICovCi0JICAgICAgICBTRU5EX09CSkVDVF9DSEFOR0VTLAotCQotCSAgICAgICAgIC8qKgotCSAgICAgICAgICAqIFNlbmRzIGEgbGlzdCBvZiB0aGUgaWRlbnRpdGllcyBvZiB0aGUgb2JqZWN0cyB0aGF0IGhhdmUgY2hhbmdlZC4gCi0JICAgICAgICAgICogVGhlIHJlY2VpdmluZyBjYWNoZSBpbnZhbGlkYXRlcyB0aGUgb2JqZWN0cyAocmF0aGVyIHRoYW4gY2hhbmdpbmcgCi0JICAgICAgICAgICogYW55IG9mIHRoZSBkYXRhKQotCSAgICAgICAgICAqLwotCSAgICAgICAgIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLAotCQotCSAgICAgICAgIC8qKgotCSAgICAgICAgICAqIFNhbWUgYXMgU0VORF9PQkpFQ1RfQ0hBTkdFUyBleGNlcHQgaXQgYWxzbyBpbmNsdWRlcyBhbnkgbmV3bHkKLQkgICAgICAgICAgKiBjcmVhdGVkIG9iamVjdHMgZnJvbSB0aGUgdHJhbnNhY3Rpb24uCi0JICAgICAgICAgICovCi0JICAgICAgICAgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsCi0JCi0JICAgICAgICAgLyoqCi0JICAgICAgICAgICogRG9lcyBubyBjYWNoZSBjb29yZGluYXRpb24uCi0JICAgICAgICAgICovCi0JICAgICAgICAgTk9ORQotICAgICAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX09CSkVDVF9DSEFOR0VTIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQkgIDwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAgCi0KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtb2YtZGF5Ij4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQotCSAgICAgIEBUYXJnZXQoe30pCi0JICAgICAgQFJldGVudGlvbihSVU5USU1FKQotCSAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRpbWVPZkRheSB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgSG91ciBvZiB0aGUgZGF5LgotCSAgICAgICAgICovIAotCSAgICAgICAgaW50IGhvdXIoKSBkZWZhdWx0IDA7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgTWludXRlIG9mIHRoZSBkYXkuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBpbnQgbWludXRlKCkgZGVmYXVsdCAwOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFNlY29uZCBvZiB0aGUgZGF5LgotCSAgICAgICAgICovIAotCSAgICAgICAgaW50IHNlY29uZCgpIGRlZmF1bHQgMDsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBNaWxsaXNlY29uZCBvZiB0aGUgZGF5LgotCSAgICAgICAgICovIAotCSAgICAgICAgaW50IG1pbGxpc2Vjb25kKCkgZGVmYXVsdCAwOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBJbnRlcm5hbCB1c2UuIERvIG5vdCBtb2RpZnkuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBib29sZWFuIHNwZWNpZmllZCgpIGRlZmF1bHQgdHJ1ZTsKLQkgICAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaG91ciIgdHlwZT0ieHNkOmludGVnZXIiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbnV0ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbGxpc2Vjb25kIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNoYW5nZXRyYWNraW5nLk9iamVjdENoYW5nZVBvbGljeSAKLSAgICAgICAgICogd2hpY2ggY29tcHV0ZXMgY2hhbmdlcyBzZXRzIGZvciBFY2xpcHNlTGluaydzIFVuaXRPZldvcmsgY29tbWl0IAotICAgICAgICAgKiBwcm9jZXNzLiBBbiBPYmplY3RDaGFuZ2VQb2xpY3kgaXMgc3RvcmVkIG9uIGFuIEVudGl0eSdzIGRlc2NyaXB0b3IuCi0gICAgICAgICAqCi0gICAgICAgICAqIEEgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBtYXkgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDaGFuZ2VUcmFja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBjaGFuZ2UgdHJhY2tpbmcgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUoKSBkZWZhdWx0IEFVVE87Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmctdHlwZSIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotIAotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbi4gCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gQ2hhbmdlVHJhY2tpbmdUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBBVFRSSUJVVEUgY2hhbmdlIHRyYWNraW5nIHR5cGUgYWxsb3dzIGNoYW5nZSB0cmFja2luZyBhdCB0aGUKLSAgICAgICAgICAgKiBhdHRyaWJ1dGUgbGV2ZWwgb2YgYW4gb2JqZWN0LiBPYmplY3RzIHdpdGggY2hhbmdlZCBhdHRyaWJ1dGVzIHdpbGwKLSAgICAgICAgICAgKiBiZSBwcm9jZXNzZWQgaW4gdGhlIGNvbW1pdCBwcm9jZXNzIHRvIGluY2x1ZGUgYW55IGNoYW5nZXMgaW4gdGhlIAotICAgICAgICAgICAqIHJlc3VsdHMgb2YgdGhlIGNvbW1pdC4gVW5jaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFUVFJJQlVURSwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFuIE9CSkVDVCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGFsbG93cyBhbiBvYmplY3QgdG8gY2FsY3VsYXRlIGZvciAKLSAgICAgICAgICAgKiBpdHNlbGYgd2hldGhlciBpdCBoYXMgY2hhbmdlZC4gQ2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgcHJvY2Vzc2VkIGluIAotICAgICAgICAgICAqIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSByZXN1bHRzIG9mIHRoZSAKLSAgICAgICAgICAgKiBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPQkpFQ1QsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBIERFRkVSUkVEIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgZGVmZXJzIGFsbCBjaGFuZ2UgZGV0ZWN0aW9uIHRvCi0gICAgICAgICAgICogdGhlIFVuaXRPZldvcmsncyBjaGFuZ2UgZGV0ZWN0aW9uIHByb2Nlc3MuIEVzc2VudGlhbGx5LCB0aGUgCi0gICAgICAgICAgICogY2FsY3VsYXRlQ2hhbmdlcygpIG1ldGhvZCB3aWxsIHJ1biBmb3IgYWxsIG9iamVjdHMgaW4gYSBVbml0T2ZXb3JrLiAKLSAgICAgICAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IE9iamVjdENoYW5nZVBvbGljeQotICAgICAgICAgICAqLwotICAgICAgICAgIERFRkVSUkVELAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogV2lsbCBub3Qgc2V0IGFueSBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5LgotICAgICAgICAgICAqLwotICAgICAgICAgIEFVVE8KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRUUklCVVRFIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9CSkVDVCIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUZFUlJFRCIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0JICA8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjdXN0b21pemVyIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQotICAgICAgLyoqIAotICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0gICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLkRlc2NyaXB0b3JDdXN0b21pemVyIAotICAgICAgICogaW50ZXJmYWNlIGFuZCBpcyB0byBydW4gYWdhaW5zdCBhbiBlbmV0aXR5J3MgY2xhc3MgZGVzY3JpcHRvciBhZnRlciBhbGwgCi0gICAgICAgKiBtZXRhZGF0YSBwcm9jZXNzaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC4KLSAgICAgICAqCi0gICAgICAgKiBUaGUgQ3VzdG9taXplciBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcyAKLSAgICAgICAqIG9yIEVtYmVkZGFibGUgY2xhc3MuIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIEN1c3RvbWl6ZXIgaXMgbm90IAotICAgICAgICogaW5oZXJpdGVkIGZyb20gaXRzIHBhcmVudCBjbGFzc2VzLiAKLSAgICAgICAqLyAKLQkgICAgQFRhcmdldCh7VFlQRX0pCi0JICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLQkgICAgcHVibGljIEBpbnRlcmZhY2UgQ3VzdG9taXplciB7Ci0JICAgICAgLyoqCi0JICAgICAgICogKFJlcXVpcmVkKSBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBkZXNjcmlwdG9yIGN1c3RvbWl6ZXIgY2xhc3MgdGhhdCAKLQkgICAgICAgKiBzaG91bGQgYmUgYXBwbGllZCBmb3IgdGhlIHJlbGF0ZWQgZW50aXR5IG9yIGVtYmVkZGFibGUgY2xhc3MuCi0JICAgICAgICovCi0JICAgICAgQ2xhc3MgdmFsdWUoKTsgCi0JICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBhbGxvd3MgdGhlIGRlZmluaXRpb24gb2YgCi0gICAgICAgICAqIHF1ZXJpZXMgdGhhdCBjYWxsIHN0b3JlZCBwcm9jZWR1cmVzIGFzIG5hbWVkIHF1ZXJpZXMuCi0gICAgICAgICAKLSAgICAgICAgICogQSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5IG9yCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MuIAotICAgICAgICAgKi8gCi0JICAgICAgQFRhcmdldCh7VFlQRX0pCi0JICAgICAgQFJldGVudGlvbihSVU5USU1FKQotCSAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoUmVxdWlyZWQpIFVuaXF1ZSBuYW1lIHRoYXQgcmVmZXJlbmNlcyB0aGlzIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgUXVlcnkgaGludHMuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBSZWZlcnMgdG8gdGhlIGNsYXNzIG9mIHRoZSByZXN1bHQuCi0JICAgICAgICAgKi8KLQkgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBTUUxSZXN1bHRNYXBwaW5nLgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyBwcm9jZWR1cmVOYW1lKCk7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgcXVlcnkgc2hvdWxkIHJldHVybiBhIHJlc3VsdCBzZXQuCi0JICAgICAgICAgKi8KLQkgICAgICAgIGJvb2xlYW4gcmV0dXJuc1Jlc3VsdFNldCgpIGRlZmF1bHQgdHJ1ZTsgCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyBhcmd1bWVudHMgdG8gdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IHt9OwotCSAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6c2VxdWVuY2U+Ci0JICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiBtaW5PY2N1cnM9IjAiIAotCSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9Im9ybTpzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciIgCi0JICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkgICAgPC94c2Q6c2VxdWVuY2U+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJvY2VkdXJlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJldHVybnMtcmVzdWx0LXNldCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbiBpcyB1c2VkIHdpdGhpbiBhIAotICAgICAgICAgKiBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0JICAgICAgQFRhcmdldCh7fSkKLQkgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0JICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgZGlyZWN0aW9uIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlci4KLQkgICAgICAgICAqLwotCSAgICAgICAgRGlyZWN0aW9uIGRpcmVjdGlvbigpIGRlZmF1bHQgSU47Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgU3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIgbmFtZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBxdWVyeSBwYXJhbWV0ZXIgbmFtZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIHF1ZXJ5UGFyYW1ldGVyKCk7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgSmF2YSBjbGFzcyBkZXNpcmVkIGJhY2sgZnJvbSB0aGUgcHJvY2VkdXJlLCAKLQkgICAgICAgICAqIHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIHByb2NlZHVyZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgQ2xhc3MgdHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIGNvZGUsIHRoaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIAotCSAgICAgICAgICogZnJvbSB0aGUgcHJvY2VkdXJlLgotCSAgICAgICAgICovCi0JICAgICAgICBpbnQgamRiY1R5cGUoKSBkZWZhdWx0IC0xOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgbmFtZSwgdGhpcyBtYXkgYmUgcmVxdWlyZWQgZm9yIEFSUkFZIG9yIAotCSAgICAgICAgICogU1RSVUNUIHR5cGVzLgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgamRiY1R5cGVOYW1lKCkgZGVmYXVsdCAiIjsKLQkgICAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJvcm06ZGlyZWN0aW9uLXR5cGUiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InF1ZXJ5LXBhcmFtZXRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iamRiYy10eXBlIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iamRiYy10eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQkKLQk8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0JCi0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpcmVjdGlvbi10eXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24uCi0gICAgICAgICAqIEl0IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlIAotICAgICAgICAgKiBwYXJhbWV0ZXJzIG9mIGEgbmFtZWQgc3RvcmVkIHByb2NlZHVyZSBxdWVyeS4KLSAgICAgICAgICovCi0JICAgICAgcHVibGljIGVudW0gRGlyZWN0aW9uIHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogSW5wdXQgcGFyYW1ldGVyCi0JICAgICAgICAgKi8KLQkgICAgICAgIElOLAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBPdXRwdXQgcGFyYW1ldGVyCi0JICAgICAgICAgKi8KLQkgICAgICAgIE9VVCwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogSW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXIKLQkgICAgICAgICAqLwotCSAgICAgICAgSU5fT1VULAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBPdXRwdXQgY3Vyc29yCi0JICAgICAgICAgKi8KLQkgICAgICAgIE9VVF9DVVJTT1IKLQkgICAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTiIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVQiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5fT1VUIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVF9DVVJTT1IiLz4KLQkgIDwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JCi0JPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCQotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQkJCS8qKiAKLQkJCQkgKiBWYXJpYWJsZSBvbmUgdG8gb25lIG1hcHBpbmdzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhIHBvaW50ZXIgCi0JCQkJICogcmVmZXJlbmNlcyBiZXR3ZWVuIGEgamF2YSBvYmplY3QgYW5kIGFuIGltcGxlbWVudGVyIG9mIGFuIGludGVyZmFjZS4gCi0JCQkJICogVGhpcyBtYXBwaW5nIGlzIHVzdWFsbHkgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgcG9pbnRlciAoc3RvcmVkIGluIGFuIAotCQkJCSAqIGluc3RhbmNlIHZhcmlhYmxlKSBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBvYmplY3RzLiBJbiB0aGUgCi0JCQkJICogcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZXMsIHRoZXNlIG1hcHBpbmdzIGFyZSBub3JtYWxseSBpbXBsZW1lbnRlZCAKLQkJCQkgKiB1c2luZyBhIGZvcmVpZ24ga2V5IGFuZCBhIHR5cGUgY29kZS4KLQkJCQkgKiAKLQkJCQkgKiBBIFZhcmlhYmxlT25lVG9PbmUgY2FuIGJlIHNwZWNpZmllZCB3aXRoaW4gYW4gRW50aXR5LCAKLQkJCQkgKiBNYXBwZWRTdXBlcmNsYXNzIGFuZCBFbWJlZGRhYmxlIGNsYXNzLiAKLQkJCQkgKi8gCi0JCQkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIAotCQkJCUBSZXRlbnRpb24oUlVOVElNRSkKLQkJCQlwdWJsaWMgQGludGVyZmFjZSBWYXJpYWJsZU9uZVRvT25lIHsKLQkJCQkgICAgLyoqCi0JCQkJICAgICAqIChPcHRpb25hbCkgVGhlIGludGVyZmFjZSBjbGFzcyB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIAotCQkJCSAgICAgKiBhc3NvY2lhdGlvbi4gSWYgbm90IHNwZWNpZmllZCBpdCB3aWxsIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgCi0JCQkJICAgICAqIG9mIHRoZSBvYmplY3QgYmVpbmcgcmVmZXJlbmNlZC4KLQkJCQkgICAgICovCi0JCQkJICAgIENsYXNzIHRhcmdldEludGVyZmFjZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQkJCQkgICAgCi0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcGVyYXRpb25zIHRoYXQgbXVzdCBiZSBjYXNjYWRlZCB0byB0aGUgdGFyZ2V0IG9mIAotCQkJCSAgICAgKiB0aGUgYXNzb2NpYXRpb24uCi0JCQkJICAgICAqLwotCQkJCSAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotCQkJCSAgICAKLQkJCQkgICAgLyoqCi0JCQkJICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0JCQkJICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0JCQkJICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0JCQkJICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotCQkJCSAgICAgKiBoaW50IHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCAKLQkJCQkgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0JCQkJICAgICAqLwotCQkJCSAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotCQkJCSAgICAKLQkJCQkgICAgLyoqCi0JCQkJICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgYXNzb2NpYXRpb24gaXMgb3B0aW9uYWwuIElmIHNldCB0byBmYWxzZSAKLQkJCQkgICAgICogdGhlbiBhIG5vbi1udWxsIHJlbGF0aW9uc2hpcCBtdXN0IGFsd2F5cyBleGlzdC4KLQkJCQkgICAgICovCi0JCQkJICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0JCQkJICAKLQkJCQkgICAgLyoqCi0JCQkJICAgICAqIChPcHRpb25hbCkgVGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIHdpbGwgaG9sZCB0aGUgdHlwZSAKLQkJCQkgICAgICogaW5kaWNhdG9ycy4gSWYgdGhlIERpc2NyaW1pbmF0b3JDb2x1bW4gaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgCi0JCQkJICAgICAqIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiBkZWZhdWx0cyB0byAiRFRZUEUiIGFuZCB0aGUgCi0JCQkJICAgICAqIGRpc2NyaW1pbmF0b3IgdHlwZSB0byBTVFJJTkcuCi0JCQkJICAgICAqLwotCQkJCSAgICBEaXNjcmltaW5hdG9yQ29sdW1uIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0IEBEaXNjcmltaW5hdG9yQ29sdW1uOwotCQkJCSAgICAKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGxpc3Qgb2YgZGlzY3JpbWluYXRvciB0eXBlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggCi0gICAgICAgICAgICAgICAgICAgICAqIHRoaXMgVmFyaWFibGVPbmVUb09uZS4gSWYgbm9uZSBhcmUgc3BlY2lmaWVkIHRoZW4gdGhvc2UgZW50aXRpZXMgCi0gICAgICAgICAgICAgICAgICAgICAqIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCB0aGF0IGltcGxlbWVudCB0aGUgdGFyZ2V0IGludGVyZmFjZSAKLSAgICAgICAgICAgICAgICAgICAgICogd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiB0eXBlcy4gVGhlIGRpc2NyaW1pbmF0b3IgdHlwZSB3aWxsIAotICAgICAgICAgICAgICAgICAgICAgKiBkZWZhdWx0IGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBTVFJJTkc6IEVudGl0eS5uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIENIQVI6IEZpcnN0IGxldHRlciBvZiB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAqICAgIEVudGl0eSBjbGFzcwotICAgICAgICAgICAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgSU5URUdFUjogVGhlIG5leHQgaW50ZWdlciBhZnRlciAKLSAgICAgICAgICAgICAgICAgICAgICogICAgdGhlIGhpZ2hlc3QgaW50ZWdlciBleHBsaWNpdGx5IGFkZGVkLgotICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCQkgICAgRGlzY3JpbWluYXRvckNsYXNzW10gZGlzY3JpbWluYXRvckNsYXNzZXMoKSBkZWZhdWx0IHt9OwotCQkJCX0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY2xhc3MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1pbnRlcmZhY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBEaXNjcmltaW5hdG9yQ2xhc3MgaXMgdXNlZCB3aXRoaW4gYSBWYXJpYWJsZU9uZVRvT25lIGFubm90YXRpb24uCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7fSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNsYXNzIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBkaXNjcmltaW5hdG9yIHRvIGJlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIAotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjbGFzcyB0byB0aGUgaW5zdGFudGlhdGVkIHdpdGggdGhlIGdpdmVuIAotICAgICAgICAgICAqIGRpc2NyaW1pbmF0b3IuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS10eXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgICAgLyoqCi0gICAgICAgICAgICogVGhlIEV4aXN0ZW5jZUNoZWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIAotICAgICAgICAgICAqIGNoZWNraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBlbnRpdGllcy4KLSAgICAgICAgICAgKiAKLSAgICAgICAgICAgKiBBbiBleGlzdGVuY2UtY2hlY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24gYW4gRW50aXR5IG9yIAotICAgICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MgYW5ub3RhdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFeGlzdGVuY2VDaGVja2luZyB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgU2V0IHRoZSBleGlzdGVuY2UgY2hlY2sgZm9yIGRldGVybWluaW5nCi0gICAgICAgICAgICAgKiBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgRXhpc3RlbmNlVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQ0hFQ0tfQ0FDSEU7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCBhbmQgCi0gICAgICAgICAgICogaXQgaXMgaW4gdGhlIGNhY2hlLCB0aGVuIGl0IG11c3QgZXhpc3QuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0hFQ0tfQ0FDSEUsCi0JCQkKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQZXJmb3JtIGRvZXMgZXhpc3QgY2hlY2sgb24gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENIRUNLX0RBVEFCQVNFLAotCQkJCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIHRoZW4gCi0gICAgICAgICAgICogaXQgbXVzdCBleGlzdC4gVGhpcyBtYXkgYmUgdXNlZCBpZiB0aGUgYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciAKLSAgICAgICAgICAgKiBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVNTVU1FX0VYSVNURU5DRSwKLQkJCQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFzc3VtZSB0aGF0IHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIAotICAgICAgICAgICAqIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIGNoZWNrLiAgCi0gICAgICAgICAgICogVGhpcyB3aWxsIGFsd2F5cyBmb3JjZSBhbiBpbnNlcnQgdG8gYmUgY2FsbGVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFTU1VNRV9OT05fRVhJU1RFTkNFCi0JCQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgkgCi0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0NBQ0hFIiAvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19EQVRBQkFTRSIgLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX0VYSVNURU5DRSIgLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX05PTl9FWElTVEVOQ0UiLz4KLQkgIDwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+CQotCQotPC94c2Q6c2NoZW1hPgotCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMi54c2QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2MyYjI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNTE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCAKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gCi0gVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCAKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS0tPgotCi08IS0tIEphdmEgUGVyc2lzdGVuY2UgQVBJIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZSBzY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczpvcm09Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAotICB2ZXJzaW9uPSIxLjIiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpZWNsaXBzZWxpbmtfb3JtXzFfMi54c2QgMS4wICBGZWJydWFyeSAxIDIwMDgKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj48IVtDREFUQVsKLQotICAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBuYXRpdmUgRWNsaXBzZWxpbmsgWE1MIG1hcHBpbmcgZmlsZQotICAgICAgIFRoZSBmaWxlIG1heSBiZSBuYW1lZCAiTUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbCIgaW4gdGhlIHBlcnNpc3RlbmNlCi0gICAgICAgYXJjaGl2ZSBvciBpdCBtYXkgYmUgbmFtZWQgc29tZSBvdGhlciBuYW1lIHdoaWNoIHdvdWxkIGJlCi0gICAgICAgdXNlZCB0byBsb2NhdGUgdGhlIGZpbGUgYXMgcmVzb3VyY2Ugb24gdGhlIGNsYXNzcGF0aC4KLSAgICAgICBPYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIGZpbGVzIG11c3QgaW5kaWNhdGUgdGhlIG9iamVjdC9yZWxhdGlvbmFsCi0gICAgICAgbWFwcGluZyBmaWxlIHNjaGVtYSBieSB1c2luZyB0aGUgcGVyc2lzdGVuY2UgbmFtZXNwYWNlOgotCi0gICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybQotCi0gICAgICAgYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgICAgIDxlbnRpdHktbWFwcGluZ3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iCi0gICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0gCi0gICAgICAgZWNsaXBzZWxpbmtfb3JtXzFfMi54c2QKLSAgICAgICB2ZXJzaW9uPSIxLjIiPgotICAgICAgIC4uLgotICAgICAgIDwvZW50aXR5LW1hcHBpbmdzPgotCi0gICAgIF1dPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIi8+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ2ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XSsoXC5bMC05XSspKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjY2Vzcy1tZXRob2RzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FjaGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDYWNoZSBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5pbnZhbGlkYXRpb24uQ2FjaGVJbnZhbGlkYXRpb25Qb2xpY3kgCi0gICAgICAgICAqIHdoaWNoIHNldHMgb2JqZWN0cyBpbiBFY2xpcHNlTGluaydzIGlkZW50aXR5IG1hcHMgdG8gYmUgaW52YWxpZCAKLSAgICAgICAgICogZm9sbG93aW5nIGdpdmVuIHJ1bGVzLiBCeSBkZWZhdWx0IGluIEVjbGlwc2VMaW5rLCBvYmplY3RzIGRvIG5vdCAKLSAgICAgICAgICogZXhwaXJlIGluIHRoZSBjYWNoZS4gU2V2ZXJhbCBkaWZmZXJlbnQgcG9saWNpZXMgYXJlIGF2YWlsYWJsZSB0byAKLSAgICAgICAgICogYWxsb3cgb2JqZWN0cyB0byBleHBpcmUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlVHlwZQotICAgICAgICAgKiAKLSAgICAgICAgICogQSBDYWNoZSBhbm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5IG9yIE1hcHBlZFN1cGVyY2xhc3MuIAotICAgICAgICAgKiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDYWNoZSBhbm5vdGF0aW9uIHNob3VsZCBvbmx5IGJlIGRlZmluZWQgCi0gICAgICAgICAqIG9uIHRoZSByb290IG9mIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDYWNoZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBjYWNoZSB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENhY2hlVHlwZSB0eXBlKCkgZGVmYXVsdCBTT0ZUX1dFQUs7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBzaXplIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IHNpemUoKSBkZWZhdWx0IDEwMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgQ2FjaGVkIGluc3RhbmNlcyBpbiB0aGUgc2hhcmVkIGNhY2hlIG9yIGEgY2xpZW50IAotICAgICAgICAgICAqIGlzb2xhdGVkIGNhY2hlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIHNoYXJlZCgpIGRlZmF1bHQgdHJ1ZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRXhwaXJlIGNhY2hlZCBpbnN0YW5jZSBhZnRlciBhIGZpeCBwZXJpb2Qgb2YgdGltZSAobXMpLiAKLSAgICAgICAgICAgKiBRdWVyaWVzIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayAKLSAgICAgICAgICAgKiB0byB0aGUgZGF0YWJhc2UgZm9yIGEgcmVmcmVzaGVkIGNvcHkKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IGV4cGlyeSgpIGRlZmF1bHQgLTE7IC8vIG1pbnVzIG9uZSBpcyBubyBleHBpcnkuCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYSBzcGVjaWZpYyB0aW1lIG9mIGRheS4gUXVlcmllcyAKLSAgICAgICAgICAgKiBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgdG8gdGhlIAotICAgICAgICAgICAqIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0gICAgICAgICAgICovIAotICAgICAgICAgIFRpbWVPZkRheSBleHBpcnlUaW1lT2ZEYXkoKSBkZWZhdWx0IEBUaW1lT2ZEYXkoc3BlY2lmaWVkPWZhbHNlKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yY2UgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UgdG8gYWx3YXlzIAotICAgICAgICAgICAqIHJlZnJlc2ggdGhlIGNhY2hlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIGFsd2F5c1JlZnJlc2goKSBkZWZhdWx0IGZhbHNlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBGb3IgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UsIHJlZnJlc2ggdGhlCi0gICAgICAgICAgICogY2FjaGUgb25seSBpZiB0aGUgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBkYXRhYmFzZSBieSBhIHF1ZXJ5IGlzIAotICAgICAgICAgICAqIG5ld2VyIHRoYW4gdGhlIGRhdGEgaW4gdGhlIGNhY2hlIChhcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcHRpbWlzdGljIAotICAgICAgICAgICAqIGxvY2tpbmcgZmllbGQpCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU2V0dGluZyB0byB0cnVlIHdpbGwgZm9yY2UgYWxsIHF1ZXJpZXMgdG8gYnlwYXNzIHRoZSAKLSAgICAgICAgICAgKiBjYWNoZSBmb3IgaGl0cyBidXQgc3RpbGwgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBjYWNoZSBmb3IgaWRlbnRpdHkuIAotICAgICAgICAgICAqIFRoaXMgZm9yY2VzIGFsbCBxdWVyaWVzIHRvIGhpdCB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZUhpdHMoKSBkZWZhdWx0IGZhbHNlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2FjaGUgY29vcmRpbmF0aW9uIG1vZGUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKCkgZGVmYXVsdCBTRU5EX09CSkVDVF9DSEFOR0VTOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnkiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnktdGltZS1vZi1kYXkiIHR5cGU9Im9ybTp0aW1lLW9mLWRheSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6Y2hvaWNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNpemUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjYWNoZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmcmVzaC1vbmx5LWlmLW5ld2VyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2FibGUtaGl0cyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb29yZGluYXRpb24tdHlwZSIgdHlwZT0ib3JtOmNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gCi0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDYWNoZVR5cGUgZW51bSBpcyB1c2VkIHdpdGggdGhlIENhY2hlIGFubm90YXRpb24gZm9yIGEgCi0gICAgICAgICAqIHBlcnNpc3RlbnQgY2xhc3MuIEl0IGRlZmluZXMgdGhlIHR5cGUgb2YgSWRlbnRpdHlNYXAvQ2FjaGUgdXNlZCBmb3IgCi0gICAgICAgICAqIHRoZSBjbGFzcy4gQnkgZGVmYXVsdCB0aGUgU09GVF9XRUFLIGNhY2hlIHR5cGUgaXMgdXNlZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBDYWNoZVR5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4gQ2FjaGVzIGFsbCBvYmplY3RzCi0gICAgICAgICAgICogYW5kIGRvZXMgbm90IHJlbW92ZSB0aGVtLiAKLSAgICAgICAgICAgKiBXQVJOSU5HOiBUaGlzIG1ldGhvZCBtYXkgYmUgbWVtb3J5IGludGVuc2l2ZSB3aGVuIG1hbnkgb2JqZWN0cyBhcmUgCi0gICAgICAgICAgICogcmVhZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGVUxMLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKLSAgICAgICAgICAgKiBvYmplY3RzIHVzaW5nIHdlYWsgcmVmZXJlbmNlcy4gVGhpcyBtZXRob2QgYWxsb3dzIGZ1bGwgZ2FyYmFnZQotICAgICAgICAgICAqIGNvbGxlY3Rpb24gYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBXRUFLLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKLSAgICAgICAgICAgKiBvYmplY3RzIHVzaW5nIHNvZnQgcmVmZXJlbmNlcy4gVGhpcyBtZXRob2QgYWxsb3dzIGZ1bGwgZ2FyYmFnZQotICAgICAgICAgICAqIGNvbGxlY3Rpb24gd2hlbiBtZW1vcnkgaXMgbG93IGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kCi0gICAgICAgICAgICogZ3VhcmFudGVlZCBpZGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTT0ZULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2ltaWxhciB0byB0aGUgV0VBSyBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgaXQgbWFpbnRhaW5zIGEKLSAgICAgICAgICAgKiBtb3N0LWZyZXF1ZW50bHktdXNlZCBzdWItY2FjaGUuIFRoZSBzaXplIG9mIHRoZSBzdWItY2FjaGUgaXMKLSAgICAgICAgICAgKiBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgdGhlIGlkZW50aXR5IG1hcCBhcyBzcGVjaWZpZWQgYnkKLSAgICAgICAgICAgKiBkZXNjcmlwdG9yJ3Mgc2V0SWRlbnRpdHlNYXBTaXplKCkgbWV0aG9kLiBUaGUgc3ViLWNhY2hlCi0gICAgICAgICAgICogdXNlcyBzb2Z0IHJlZmVyZW5jZXMgdG8gZW5zdXJlIHRoYXQgdGhlc2Ugb2JqZWN0cyBhcmUKLSAgICAgICAgICAgKiBnYXJiYWdlLWNvbGxlY3RlZCBvbmx5IGlmIHRoZSBzeXN0ZW0gaXMgbG93IG9uIG1lbW9yeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTT0ZUX1dFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJZGVudGljYWwgdG8gdGhlIHNvZnQgY2FjaGUgd2VhayAoU09GVF9XRUFLKSBpZGVudGl0eSBtYXAgZXhjZXB0IAotICAgICAgICAgICAqIHRoYXQgaXQgdXNlcyBoYXJkIHJlZmVyZW5jZXMgaW4gdGhlIHN1Yi1jYWNoZS4gVXNlIHRoaXMgaWRlbnRpdHkgCi0gICAgICAgICAgICogbWFwIGlmIHNvZnQgcmVmZXJlbmNlcyBkbyBub3QgYmVoYXZlIHByb3Blcmx5IG9uIHlvdXIgcGxhdGZvcm0uCi0gICAgICAgICAgICovCi0gICAgICAgICAgSEFSRF9XRUFLLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQSBjYWNoZSBpZGVudGl0eSBtYXAgbWFpbnRhaW5zIGEgZml4ZWQgbnVtYmVyIG9mIG9iamVjdHMKLSAgICAgICAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiBPYmplY3RzIGFyZSByZW1vdmVkIGZyb20gdGhlIGNhY2hlCi0gICAgICAgICAgICogb24gYSBsZWFzdC1yZWNlbnRseS11c2VkIGJhc2lzLiBUaGlzIG1ldGhvZCBhbGxvd3Mgb2JqZWN0Ci0gICAgICAgICAgICogaWRlbnRpdHkgZm9yIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgb2JqZWN0cy4KLSAgICAgICAgICAgKiBXQVJOSU5HOiBGdXJuaXNoZXMgY2FjaGluZyBhbmQgaWRlbnRpdHksIGJ1dCBkb2VzIG5vdCBndWFyYW50ZWUgCi0gICAgICAgICAgICogaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0FDSEUsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBXQVJOSU5HOiBEb2VzIG5vdCBwcmVzZXJ2ZSBvYmplY3QgaWRlbnRpdHkgYW5kIGRvZXMgbm90IGNhY2hlIAotICAgICAgICAgICAqIG9iamVjdHMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgTk9ORQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUX1dFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhBUkRfV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FDSEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtY29vcmRpbmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gQ2FjaGVDb29yZGluYXRpb25UeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgY2hhbmdlZCBvYmplY3RzIGluY2x1ZGluZyBkYXRhIGFib3V0IHRoZSBjaGFuZ2VzLgotICAgICAgICAgICAqIFRoaXMgZGF0YSBpcyBtZXJnZWQgaW50byB0aGUgcmVjZWl2aW5nIGNhY2hlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTkRfT0JKRUNUX0NIQU5HRVMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgdGhlIGlkZW50aXRpZXMgb2YgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGNoYW5nZWQuIAotICAgICAgICAgICAqIFRoZSByZWNlaXZpbmcgY2FjaGUgaW52YWxpZGF0ZXMgdGhlIG9iamVjdHMgKHJhdGhlciB0aGFuIGNoYW5naW5nIAotICAgICAgICAgICAqIGFueSBvZiB0aGUgZGF0YSkKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNhbWUgYXMgU0VORF9PQkpFQ1RfQ0hBTkdFUyBleGNlcHQgaXQgYWxzbyBpbmNsdWRlcyBhbnkgbmV3bHkKLSAgICAgICAgICAgKiBjcmVhdGVkIG9iamVjdHMgZnJvbSB0aGUgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBEb2VzIG5vIGNhY2hlIGNvb3JkaW5hdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBOT05FCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTkRfT0JKRUNUX0NIQU5HRVMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY2hhbmdldHJhY2tpbmcuT2JqZWN0Q2hhbmdlUG9saWN5IAotICAgICAgICAgKiB3aGljaCBjb21wdXRlcyBjaGFuZ2VzIHNldHMgZm9yIEVjbGlwc2VMaW5rJ3MgVW5pdE9mV29yayBjb21taXQgCi0gICAgICAgICAqIHByb2Nlc3MuIEFuIE9iamVjdENoYW5nZVBvbGljeSBpcyBzdG9yZWQgb24gYW4gRW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIG1heSBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENoYW5nZVRyYWNraW5nIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNoYW5nZSB0cmFja2luZyB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZy10eXBlIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbi4gCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gQ2hhbmdlVHJhY2tpbmdUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBBVFRSSUJVVEUgY2hhbmdlIHRyYWNraW5nIHR5cGUgYWxsb3dzIGNoYW5nZSB0cmFja2luZyBhdCB0aGUKLSAgICAgICAgICAgKiBhdHRyaWJ1dGUgbGV2ZWwgb2YgYW4gb2JqZWN0LiBPYmplY3RzIHdpdGggY2hhbmdlZCBhdHRyaWJ1dGVzIHdpbGwKLSAgICAgICAgICAgKiBiZSBwcm9jZXNzZWQgaW4gdGhlIGNvbW1pdCBwcm9jZXNzIHRvIGluY2x1ZGUgYW55IGNoYW5nZXMgaW4gdGhlIAotICAgICAgICAgICAqIHJlc3VsdHMgb2YgdGhlIGNvbW1pdC4gVW5jaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFUVFJJQlVURSwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFuIE9CSkVDVCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGFsbG93cyBhbiBvYmplY3QgdG8gY2FsY3VsYXRlIGZvciAKLSAgICAgICAgICAgKiBpdHNlbGYgd2hldGhlciBpdCBoYXMgY2hhbmdlZC4gQ2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgcHJvY2Vzc2VkIGluIAotICAgICAgICAgICAqIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSByZXN1bHRzIG9mIHRoZSAKLSAgICAgICAgICAgKiBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPQkpFQ1QsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBIERFRkVSUkVEIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgZGVmZXJzIGFsbCBjaGFuZ2UgZGV0ZWN0aW9uIHRvCi0gICAgICAgICAgICogdGhlIFVuaXRPZldvcmsncyBjaGFuZ2UgZGV0ZWN0aW9uIHByb2Nlc3MuIEVzc2VudGlhbGx5LCB0aGUgCi0gICAgICAgICAgICogY2FsY3VsYXRlQ2hhbmdlcygpIG1ldGhvZCB3aWxsIHJ1biBmb3IgYWxsIG9iamVjdHMgaW4gYSBVbml0T2ZXb3JrLiAKLSAgICAgICAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IE9iamVjdENoYW5nZVBvbGljeQotICAgICAgICAgICAqLwotICAgICAgICAgIERFRkVSUkVELAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogV2lsbCBub3Qgc2V0IGFueSBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5LgotICAgICAgICAgICAqLwotICAgICAgICAgIEFVVE8KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRUUklCVVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPQkpFQ1QiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFRkVSUkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9taXplciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0gICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuRGVzY3JpcHRvckN1c3RvbWl6ZXIgCi0gICAgICAgICAqIGludGVyZmFjZSBhbmQgaXMgdG8gcnVuIGFnYWluc3QgYW4gZW5ldGl0eSdzIGNsYXNzIGRlc2NyaXB0b3IgYWZ0ZXIgYWxsIAotICAgICAgICAgKiBtZXRhZGF0YSBwcm9jZXNzaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MgCi0gICAgICAgICAqIG9yIEVtYmVkZGFibGUgY2xhc3MuIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIEN1c3RvbWl6ZXIgaXMgbm90IAotICAgICAgICAgKiBpbmhlcml0ZWQgZnJvbSBpdHMgcGFyZW50IGNsYXNzZXMuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEN1c3RvbWl6ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciBjdXN0b21pemVyIGNsYXNzIHRoYXQgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGFwcGxpZWQgZm9yIHRoZSByZWxhdGVkIGVudGl0eSBvciBlbWJlZGRhYmxlIGNsYXNzLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHZhbHVlKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpcmVjdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uLgotICAgICAgICAgKiBJdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSAKLSAgICAgICAgICogcGFyYW1ldGVycyBvZiBhIG5hbWVkIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBEaXJlY3Rpb24gewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElucHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIElOLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogT3V0cHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIE9VVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU5fT1VULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogT3V0cHV0IGN1cnNvcgotICAgICAgICAgICAqLwotICAgICAgICAgIE9VVF9DVVJTT1IKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5fT1VUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRfQ1VSU09SIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbWFwcGluZ3MiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBlbnRpdHktbWFwcGluZ3MgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuIG1hcHBpbmcKLSAgICAgICAgICBmaWxlLiBJdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGZvdXIgdHlwZXMgb2YgZWxlbWVudHM6Ci0KLSAgICAgICAgICAxLiBUaGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IGNvbnRhaW5zIG1ldGFkYXRhCi0gICAgICAgICAgZm9yIHRoZSBlbnRpcmUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIGlmIHRoaXMgZWxlbWVudAotICAgICAgICAgIG9jY3VycyBpbiBtdWx0aXBsZSBtYXBwaW5nIGZpbGVzIHdpdGhpbiB0aGUgc2FtZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgICAgMi4gVGhlIHBhY2thZ2UsIHNjaGVtYSwgY2F0YWxvZyBhbmQgYWNjZXNzIGVsZW1lbnRzIGFwcGx5IHRvIGFsbCBvZgotICAgICAgICAgIHRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGRlZmluZWQgaW4KLSAgICAgICAgICB0aGUgc2FtZSBmaWxlIGluIHdoaWNoIHRoZXkgb2NjdXIuCi0KLSAgICAgICAgICAzLiBUaGUgc2VxdWVuY2UtZ2VuZXJhdG9yLCB0YWJsZS1nZW5lcmF0b3IsIG5hbWVkLXF1ZXJ5LAotICAgICAgICAgIG5hbWVkLW5hdGl2ZS1xdWVyeSBhbmQgc3FsLXJlc3VsdC1zZXQtbWFwcGluZyBlbGVtZW50cyBhcmUgZ2xvYmFsCi0gICAgICAgICAgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUKLSAgICAgICAgICBzZXF1ZW5jZS1nZW5lcmF0b3Igb3IgdGFibGUtZ2VuZXJhdG9yIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUKLSAgICAgICAgICBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIGFsc28KLSAgICAgICAgICB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIG5hbWVkLXF1ZXJ5LCBuYW1lZC1uYXRpdmUtcXVlcnksIG9yCi0gICAgICAgICAgcmVzdWx0LXNldC1tYXBwaW5nIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUgb3IgZGlmZmVyZW50IG1hcHBpbmcKLSAgICAgICAgICBmaWxlcyBpbiBhIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgICA0LiBUaGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBlYWNoIGRlZmluZQotICAgICAgICAgIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIG1hbmFnZWQgcGVyc2lzdGVudCBjbGFzcy4gVGhlIG1hcHBpbmcKLSAgICAgICAgICBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlc2UgZWxlbWVudHMgbWF5IGJlIGNvbXBsZXRlIG9yIGl0IG1heQotICAgICAgICAgIGJlIHBhcnRpYWwuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIiB0eXBlPSJvcm06bWFwcGVkLXN1cGVyY2xhc3MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eSIgdHlwZT0ib3JtOmVudGl0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkYWJsZSIgdHlwZT0ib3JtOmVtYmVkZGFibGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb25UeXBlIiBmaXhlZD0iMS4yIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJleGlzdGVuY2UtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIEV4aXN0ZW5jZUNoZWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIAotICAgICAgICAgKiBjaGVja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgZW50aXRpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBbiBleGlzdGVuY2UtY2hlY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24gYW4gRW50aXR5IG9yIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIGFubm90YXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFeGlzdGVuY2VDaGVja2luZyB7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldCB0aGUgZXhpc3RlbmNlIGNoZWNrIGZvciBkZXRlcm1pbmluZwotICAgICAgICAgICAqIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRXhpc3RlbmNlVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQ0hFQ0tfQ0FDSEU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIGFuZCAKLSAgICAgICAgICogaXQgaXMgaW4gdGhlIGNhY2hlLCB0aGVuIGl0IG11c3QgZXhpc3QuCi0gICAgICAgICAqLwotICAgICAgICBDSEVDS19DQUNIRSwKLQotICAgICAgICAvKioKLSAgICAgICAgICogUGVyZm9ybSBkb2VzIGV4aXN0IGNoZWNrIG9uIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICovCi0gICAgICAgIENIRUNLX0RBVEFCQVNFLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0cyBwcmltYXJ5IGtleSBkb2VzIG5vdCBpbmNsdWRlIG51bGwgdGhlbiAKLSAgICAgICAgICogaXQgbXVzdCBleGlzdC4gVGhpcyBtYXkgYmUgdXNlZCBpZiB0aGUgYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciAKLSAgICAgICAgICogZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIGNoZWNrLgotICAgICAgICAgKi8KLSAgICAgICAgQVNTVU1FX0VYSVNURU5DRSwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQXNzdW1lIHRoYXQgdGhlIG9iamVjdCBkb2VzIG5vdCBleGlzdC4gVGhpcyBtYXkgYmUgdXNlZCBpZiB0aGUgCi0gICAgICAgICAqIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIGNoZWNrLiAgCi0gICAgICAgICAqIFRoaXMgd2lsbCBhbHdheXMgZm9yY2UgYW4gaW5zZXJ0IHRvIGJlIGNhbGxlZC4KLSAgICAgICAgICovCi0gICAgICAgIEFTU1VNRV9OT05fRVhJU1RFTkNFCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4gICAgCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfQ0FDSEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0RBVEFCQVNFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1NVTUVfRVhJU1RFTkNFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1NVTUVfTk9OX0VYSVNURU5DRSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPiAKLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgTWV0YWRhdGEgdGhhdCBhcHBsaWVzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFuZCBub3QganVzdCB0byAKLSAgICAgICAgdGhlIG1hcHBpbmcgZmlsZSBpbiB3aGljaCBpdCBpcyBjb250YWluZWQuIAotCi0gICAgICAgIElmIHRoZSB4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSBlbGVtZW50IGlzIHNwZWNpZmllZCwKLSAgICAgICAgdGhlIGNvbXBsZXRlIHNldCBvZiBtYXBwaW5nIG1ldGFkYXRhIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBpcyBjb250YWluZWQgaW4gdGhlIFhNTCBtYXBwaW5nIGZpbGVzIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPiAgICAgICAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIiB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGVzZSBkZWZhdWx0cyBhcmUgYXBwbGllZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhcyBhIHdob2xlCi0gICAgICAgIHVubGVzcyB0aGV5IGFyZSBvdmVycmlkZGVuIGJ5IGxvY2FsIGFubm90YXRpb24gb3IgWE1MCi0gICAgICAgIGVsZW1lbnQgc2V0dGluZ3MuCi0KLSAgICAgICAgc2NoZW1hIC0gVXNlZCBhcyB0aGUgc2NoZW1hIGZvciBhbGwgdGFibGVzLCBzZWNvbmRhcnkgdGFibGVzLAotICAgICAgICAgICAgY29sbGVjdGlvbiB0YWJsZXMsIHNlcXVlbmNlIGdlbmVyYXRvcnMsIGFuZCB0YWJsZSBnZW5lcmF0b3JzCi0gICAgICAgICAgICB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhdGFsb2cgLSBVc2VkIGFzIHRoZSBjYXRhbG9nIGZvciBhbGwgdGFibGVzLCBzZWNvbmRhcnkgdGFibGVzLAotICAgICAgICAgICAgY29sbGVjdGlvbiB0YWJsZXMsIHNlcXVlbmNlIGdlbmVyYXRvcnMsIGFuZCB0YWJsZSBnZW5lcmF0b3JzCi0gICAgICAgICAgICB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGFjY2VzcyAtIFVzZWQgYXMgdGhlIGFjY2VzcyB0eXBlIGZvciBhbGwgbWFuYWdlZCBjbGFzc2VzIGluCi0gICAgICAgICAgICB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXNjYWRlLXBlcnNpc3QgLSBBZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucwotICAgICAgICAgICAgaW4gYWxsIGVudGl0eSByZWxhdGlvbnNoaXBzIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGVudGl0eS1saXN0ZW5lcnMgLSBMaXN0IG9mIGRlZmF1bHQgZW50aXR5IGxpc3RlbmVycyB0byBiZSBpbnZva2VkCi0gICAgICAgICAgICBvbiBlYWNoIGVudGl0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVsaW1pdGVkLWlkZW50aWZpZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYW4gZW50aXR5LiBJcyBhbGxvd2VkIHRvIGJlCi0gICAgICAgIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0bwotICAgICAgICBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIG9uIHRoZSBlbnRpdHkgY2xhc3MgKGFuZCBpdHMgZmllbGRzCi0gICAgICAgIG9yIHByb3BlcnRpZXMpIGFyZSB0byBiZSBwcm9jZXNzZWQuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbgotICAgICAgICB0aGUgZGVmYXVsdGluZyBydWxlcyBmb3IgdGhlIGVudGl0eSBhbmQgaXRzIHN1Yi1lbGVtZW50cyB3aWxsCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJvcm06dGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY29uZGFyeS10YWJsZSIgdHlwZT0ib3JtOnNlY29uZGFyeS10YWJsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci12YWx1ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQotICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHR7fTsKLSAgICAgICAgICBKb2luVGFibGUgam9pblRhYmxlKCkgZGVmYXVsdCBASm9pblRhYmxlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXR0cmlidXRlT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgQ29sdW1uIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZXMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgY29udGFpbnMgdGhlIGVudGl0eSBmaWVsZCBvciBwcm9wZXJ0eSBtYXBwaW5ncy4KLSAgICAgICAgSXQgbWF5IGJlIHNwYXJzZWx5IHBvcHVsYXRlZCB0byBpbmNsdWRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlCi0gICAgICAgIGZpZWxkcyBvciBwcm9wZXJ0aWVzLiBJZiBtZXRhZGF0YS1jb21wbGV0ZSBmb3IgdGhlIGVudGl0eSBpcyB0cnVlCi0gICAgICAgIHRoZW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGRlZmF1bHRlZCBhY2NvcmRpbmcKLSAgICAgICAgdG8gdGhlIGRlZmF1bHQgcnVsZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9Im9ybTppZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQtaWQiIHR5cGU9Im9ybTplbWJlZGRlZC1pZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iIHR5cGU9Im9ybTpiYXNpYy1jb2xsZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtbWFwIiB0eXBlPSJvcm06YmFzaWMtbWFwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW9uZSIgdHlwZT0ib3JtOm1hbnktdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1vbmUiIHR5cGU9Im9ybTpvbmUtdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSIgdHlwZT0ib3JtOnZhcmlhYmxlLW9uZS10by1vbmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW1hbnkiIHR5cGU9Im9ybTptYW55LXRvLW1hbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbGVtZW50LWNvbGxlY3Rpb24iIHR5cGU9Im9ybTplbGVtZW50LWNvbGxlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWF0aW9uIiB0eXBlPSJvcm06dHJhbnNmb3JtYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpYyB7Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpY0NvbGxlY3Rpb24gewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSB2YWx1ZSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IAotICAgICAgICAgICAqIGNvbGxlY3Rpb24gZGF0YS4gRGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IG9yIGZpZWxkIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIHZhbHVlQ29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmVjbGlwc2VsaW5rLWNvbGxlY3Rpb24tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1tYXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpY01hcCB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgdGhhdCAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgaGludCB0byAKLSAgICAgICAgICAgKiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gCi0gICAgICAgICAgICogTEFaWS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgbWFwIAotICAgICAgICAgICAqIGtleS4gSWYgdGhlIG5hbWUgb24gdGUga2V5IGNvbHVtbiBpcyAiIiwgdGhlIG5hbWUgd2lsbCBkZWZhdWx0IHRvOgotICAgICAgICAgICAqIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvciBmaWVsZDsgIl9LRVkiLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiBrZXlDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIGtleSBjb252ZXJ0ZXIuIERlZmF1bHQgaXMgZXF1aXZhbGVudCB0byAKLSAgICAgICAgICAgKiBzcGVjaWZ5aW5nIEBDb252ZXJ0KCJub25lIiksIG1lYW5pbmcgbm8gY29udmVydGVyIHdpbGwgYmUgYWRkZWQgdG8gCi0gICAgICAgICAgICogdGhlIGRpcmVjdCBtYXAga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnQga2V5Q29udmVydGVyKCkgZGVmYXVsdCBAQ29udmVydDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGRhdGEgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdmFsdWUgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBjb2x1bW4gbWFwcGluZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IHZhbHVlQ29udmVydGVyKCkgZGVmYXVsdCBAQ29udmVydDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXktY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXktY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4gICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjIiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTplY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FzY2FkZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gQ2FzY2FkZVR5cGUgeyBBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0h9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWFsbCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlbW92ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNsb25lQ29weVBvbGljeSBvbiBhbiAKLSAgICAgICAgICogRW50aXR5LiBBIENsb25lQ29weVBvbGljeSBtdXN0IHNwZWNpZnkgYXQgb25lIG9yIGJvdGggb2YgdGhlICJtZXRob2QiIAotICAgICAgICAgKiBvciAid29ya2luZ0NvcHlNZXRob2QiLiAid29ya2luZ0NvcHlNZXRob2QiIGlzIHVzZWQgdG8gY2xvbmUgb2JqZWN0cyAKLSAgICAgICAgICogdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyIGFzIHRoZXkgYXJlIHJlZ2lzdGVyZWQgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgdHJhbnNhY3Rpb25hbCBtZWNoYW5pc20sIHRoZSBVbml0T2ZXb3JrLiAibWV0aG9kIiB3aWxsIAotICAgICAgICAgKiBiZSB1c2VkIGZvciB0aGUgY2xvbmUgdGhhdCBpcyB1c2VkIGZvciBjb21wYXJpc29uIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgRGVmZXJyZWRDaGFuZ2VEZXRlY3Rpb25Qb2xpY3kKLSAgICAgICAgICogIAotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcwotICAgICAgICAgKiBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KG1ldGhvZD0ibXlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiLCB3b3JraW5nQ29weU1ldGhvZD0ibXlXb3JraW5nQ29weUNsb25lTWV0aG9kIikKLSAgICAgICAgICogCi0gICAgICAgICAqIG9yOgotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KHdvcmtpbmdDb3B5TWV0aG9kTmFtZT0ibXlXb3JraW5nQ29weUNsb25lIikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsb25lQ29weVBvbGljeSB7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCB0aGlzIGRlZmluZXMgCi0gICAgICAgICAgICAgKiBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBjbG9uZSB0aGF0IHdpbGwgYmUgdXNlZCAKLSAgICAgICAgICAgICAqIGZvciBjb21wYXJpc29uIGJ5Ci0gICAgICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpCi0gICAgICAgICAgICAgKiBFaXRoZXIgbWV0aG9kIG9yIHdvcmtpbmdDb3B5TWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkCi0gICAgICAgICAgICAgKiB0aGlzIGRlZmluZXMgYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG9iamVjdCByZXR1cm5lZCB3aGVuIHJlZ2lzdGVyaW5nIGFuIAotICAgICAgICAgICAgICogT2JqZWN0IGluIGFuIEVjbGlwc2VMaW5rIFVuaXRPZldvcmsKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIHdvcmtpbmdDb3B5TWV0aG9kKCk7Ci0KLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IndvcmtpbmctY29weS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sbGVjdGlvbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVjbGlwc2VsaW5rLWNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGFibGUuIElmIGl0IGlzIG5vdCAKLSAgICAgICAgICAgKiBzcGVjaWZpZWQsIGl0IGlzIGRlZmF1bHRlZCB0byB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nOiAKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGVudGl0eTsgIl8iIDsgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCAKLSAgICAgICAgICAgKiBwcm9wZXJ0eSBvciBmaWVsZCBvZiB0aGUgc291cmNlIGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2F0YWxvZyBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgY2F0YWxvZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2NoZW1hIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBzY2hlbWEuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVc2VkIHRvIHNwZWNpZnkgYSBwcmltYXJ5IGtleSBjb2x1bW4gdGhhdCBpcyB1c2VkIGFzIGEgCi0gICAgICAgICAgICogZm9yZWlnbiBrZXkgdG8gam9pbiB0byBhbm90aGVyIHRhYmxlLiBJZiB0aGUgc291cmNlIGVudGl0eSB1c2VzIGEgCi0gICAgICAgICAgICogY29tcG9zaXRlIHByaW1hcnkga2V5LCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG11c3QgYmUgc3BlY2lmaWVkIAotICAgICAgICAgICAqIGZvciBlYWNoIGZpZWxkIG9mIHRoZSBjb21wb3NpdGUgcHJpbWFyeSBrZXkuIEluIGEgc2luZ2xlIHByaW1hcnkgCi0gICAgICAgICAgICoga2V5IGNhc2UsIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbWF5IG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkLiAKLSAgICAgICAgICAgKiBEZWZhdWx0aW5nIHdpbGwgYXBwbHkgb3RoZXJ3aXNlIGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogbmFtZSwgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIAotICAgICAgICAgICAqIG9mIHRoZSBzb3VyY2UgZW50aXR5LiByZWZlcmVuY2VkQ29sdW1uTmFtZSwgdGhlIHNhbWUgbmFtZSBvZiAKLSAgICAgICAgICAgKiBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVuaXF1ZSBjb25zdHJhaW50cyB0aGF0IGFyZSB0byBiZSBwbGFjZWQgb24gdGhlIHRhYmxlLiAKLSAgICAgICAgICAgKiBUaGVzZSBhcmUgb25seSB1c2VkIGlmIHRhYmxlIGdlbmVyYXRpb24gaXMgaW4gZWZmZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307IAotICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnZlcnNpb25WYWx1ZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBkYXRhYmFzZSB2YWx1ZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZGF0YVZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIG9iamVjdCB2YWx1ZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgb2JqZWN0VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCi0gICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50Ci0gICAgICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyIGludGVyZmFjZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBjb252ZXJ0ZXJDbGFzcygpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbi1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtblJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGEgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeSBvbiBhbiBFbnRpdHkuCi0gICAgICAgICAqIEl0IGlzIHJlcXVpcmVkIHRoYXQgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeSBiZSBzcGVjaWZpZWQgCi0gICAgICAgICAqIGFzIHRoZSBhcmd1bWVudC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcyBvciAKLSAgICAgICAgICogRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEZvciBpbnN0YW5jZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ29weVBvbGljeSgiZXhhbXBsZS5NeUNvcHlQb2xpY3kiKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29weVBvbGljeSB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKiAoUmVxdWlyZWQpCi0gICAgICAgICogVGhpcyBkZWZpbmVzIHRoZSBjbGFzcyBvZiB0aGUgY29weSBwb2xpY3kuIEl0IG11c3Qgc3BlY2lmeSBhIGNsYXNzIAotICAgICAgICAqIHRoYXQgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kKLSAgICAgICAgKi8KLSAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIkRUWVBFIjsKLSAgICAgICAgICBEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSgpIGRlZmF1bHQgU1RSSU5HOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAzMTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgRGlzY3JpbWluYXRvckNsYXNzIGlzIHVzZWQgd2l0aGluIGEgVmFyaWFibGVPbmVUb09uZSBhbm5vdGF0aW9uLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe30pIAotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDbGFzcyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgZGlzY3JpbWluYXRvciB0byBiZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiAKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvcigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY2xhc3MgdG8gdGhlIGluc3RhbnRpYXRlZCB3aXRoIHRoZSBnaXZlbiAKLSAgICAgICAgICAgKiBkaXNjcmltaW5hdG9yLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3IiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIHsgU1RSSU5HLCBDSEFSLCBJTlRFR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudENvbGxlY3Rpb24gewotICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTpjb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgZW1iZWRkYWJsZSBvYmplY3RzLiBJcwotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZQotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQKLSAgICAgICAgaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGFibGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZC1pZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkSWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cwotICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVycyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eUxpc3RlbmVycyB7Ci0gICAgICAgICAgQ2xhc3NbXSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lciIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlSZXN1bHQgewotICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzKCk7Ci0gICAgICAgICAgRmllbGRSZXN1bHRbXSBmaWVsZHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1yZXN1bHQiIHR5cGU9Im9ybTpmaWVsZC1yZXN1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJlbnRpdHktY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW0tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEVudW1UeXBlIHsKLSAgICAgICAgICBPUkRJTkFMLAotICAgICAgICAgIFNUUklORwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRJTkFMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW1lcmF0ZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnVtZXJhdGVkIHsKLSAgICAgICAgICBFbnVtVHlwZSB2YWx1ZSgpIGRlZmF1bHQgT1JESU5BTDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06ZW51bS10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRmV0Y2hUeXBlIHsgTEFaWSwgRUFHRVIgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBWlkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGaWVsZFJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImdlbmVyYXRpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEdlbmVyYXRpb25UeXBlIHsgVEFCTEUsIFNFUVVFTkNFLCBJREVOVElUWSwgQVVUTyB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFUVVFTkNFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJREVOVElUWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQtY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZENsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImlkLXZhbGlkYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBJZFZhbGlkYXRpb24gZW51bSBkZXRlcm1pbmVzIHRoZSB0eXBlIHZhbHVlIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBJZC4KLSAgICAgICAgICogQnkgZGVmYXVsdCBudWxsIGlzIG5vdCBhbGxvd2VkLCBhbmQgMCBpcyBub3QgYWxsb3cgZm9yIHNpbmdsZXRvbiBpZHMgb2YgbG9uZyBvciBpbnQgdHlwZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWkVSTyBmb3Igc2luZ2xldG9uIGlkcywgYW5kIE5VTEwgZm9yIGNvbXBvc2l0ZSBpZHMuCi0gICAgICAgICAqIFRoaXMgY2FuIGJlIHNldCB1c2luZyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiwgb3IgQ2xhc3NEZXNjcmlwdG9yIEFQSS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUHJpbWFyeUtleQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvciNzZXRJZFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uKQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMCAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBJZFZhbGlkYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBPbmx5IG51bGwgaXMgbm90IGFsbG93ZWQgYXMgYW4gaWQgdmFsdWUsIDAgaXMgYWxsb3dlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTlVMTCwKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBudWxsIGFuZCAwIGFyZSBub3QgYWxsb3dlZCwgKG9ubHkgaW50IGFuZCBsb25nKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgWkVSTywKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBObyBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaRVJPIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7Ci0gICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUgeyBTSU5HTEVfVEFCTEUsIEpPSU5FRCwgVEFCTEVfUEVSX0NMQVNTIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSU5HTEVfVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU5FRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEVfUEVSX0NMQVNTIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQW4gSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCi0gICAgICAgICAqIG9uIGFuIEVudGl0eS4gSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgaXMgdGhlIGRlZmF1bHQgQ29weVBvbGljeSBpbiAKLSAgICAgICAgICogRWNsaXBzZUxpbmsgYW5kIHRoZXJlZm9yZSB0aGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGlzIG9ubHkgdXNlZCB0byAKLSAgICAgICAgICogb3ZlcnJpZGUgb3RoZXIgdHlwZXMgb2YgY29weSBwb2xpY2llcwotICAgICAgICAgKiAKLSAgICAgICAgICogQW4gSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBFeGFtcGxlOgotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBJbnN0YW50aWF0aW9uQ29weVBvbGljeSAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHsKLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEpvaW5GZXRjaFR5cGUgewotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBkb2VzIG5vdCBhbGxvdyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBJTk5FUiwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBhbGxvd3MgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgT1VURVIsCi0gICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTk5FUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VURVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pblRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGludmVyc2VKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW52ZXJzZS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvYiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvYiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9jay1tb2RlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgcHVibGljIGVudW0gTG9ja01vZGVUeXBlIHsgUkVBRCwgV1JJVEUsIE9QVElNSVNUSUMsCi0gICAgICAgIE9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBQRVNTSU1JU1RJQ19SRUFELCBQRVNTSU1JU1RJQ19XUklURSwKLSAgICAgICAgUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBOT05FfTsKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRUFEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1JFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1dSSVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hbnlUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieS1pZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleUNsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5LWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleUNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcwotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZQotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQKLSAgICAgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgYmUgcmVjdXJzaXZlbHkKLSAgICAgICAgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwcGVkU3VwZXJjbGFzc3t9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FjaGVhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGlzdGVuY2UtY2hlY2tpbmciIHR5cGU9Im9ybTpleGlzdGVuY2UtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOyAvL25hbWVkIFNxbFJlc3VsdFNldE1hcHBpbmcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFF1ZXJ5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBxdWVyeSgpOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NrLW1vZGUiIHR5cGU9Im9ybTpsb2NrLW1vZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIGFsbG93cyB0aGUgZGVmaW5pdGlvbiBvZiAKLSAgICAgICAgICogcXVlcmllcyB0aGF0IGNhbGwgc3RvcmVkIHByb2NlZHVyZXMgYXMgbmFtZWQgcXVlcmllcy4KLSAgICAgICAgICogQSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5IG9yCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVW5pcXVlIG5hbWUgdGhhdCByZWZlcmVuY2VzIHRoaXMgc3RvcmVkIHByb2NlZHVyZSBxdWVyeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBRdWVyeSBoaW50cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFJlZmVycyB0byB0aGUgY2xhc3Mgb2YgdGhlIHJlc3VsdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIFNRTFJlc3VsdE1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgcHJvY2VkdXJlTmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBXaGV0aGVyIHRoZSBxdWVyeSBzaG91bGQgcmV0dXJuIGEgcmVzdWx0IHNldC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIHJldHVybnNSZXN1bHRTZXQoKSBkZWZhdWx0IHRydWU7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGFyZ3VtZW50cyB0byB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlciIgdHlwZT0ib3JtOnN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmV0dXJucy1yZXN1bHQtc2V0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPYmplY3RUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbmNlCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgZGF0YVR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBlbnRpdHkuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVudCAKLSAgICAgICAgICAgKiBmaWVsZCBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBvYmplY3RUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBjb252ZXJzaW9uIHZhbHVlcyB0byBiZSB1c2VkIAotICAgICAgICAgICAqIHdpdGggdGhlIG9iamVjdCBjb252ZXJ0ZXIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVyc2lvblZhbHVlW10gY29udmVyc2lvblZhbHVlcygpOwotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgYSBkZWZhdWx0IG9iamVjdCB2YWx1ZS4gVXNlZCBmb3IgCi0gICAgICAgICAgICAqIGxlZ2FjeSBkYXRhIGlmIHRoZSBkYXRhIHZhbHVlIGlzIG1pc3NpbmcuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICBTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVyc2lvbi12YWx1ZSIgdHlwZT0ib3JtOmNvbnZlcnNpb24tdmFsdWUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LW9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgIDwveHNkOmNob2ljZT4KLSAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgPC94c2Q6Y2hvaWNlPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgIDwveHNkOnNlcXVlbmNlPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIG9ycGhhblJlbW92YWwoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9ycGhhbi1yZW1vdmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieS1pZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIG9wdGltaXN0aWMtbG9ja2luZyBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICogb3B0aW1pc3RpYyBsb2NraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyAKLSAgICAgICAgICogZW50aXRpZXMuIEFuIG9wdGltaXN0aWMtbG9ja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbgotICAgICAgICAgKiBhbiBlbnRpdHkgb3IgbWFwcGVkLXN1cGVyY2xhc3MuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJdCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG9wdGltaXN0aWMtbG9ja2luZy10eXBlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9wdGltaXN0aWNMb2NraW5nIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgdG8gdXNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIE9wdGltaXN0aWNMb2NraW5nVHlwZSB0eXBlKCkgZGVmYXVsdCBWRVJTSU9OX0NPTFVNTjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgb2YgdHlwZSAKLSAgICAgICAgICAgKiBTRUxFQ1RFRF9DT0xVTU5TLCB0aGlzIGFubm90YXRpb24gbWVtYmVyIGJlY29tZXMgYSAoUmVxdWlyZWQpIAotICAgICAgICAgICAqIGZpZWxkLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbltdIHNlbGVjdGVkQ29sdW1ucygpIGRlZmF1bHQge307Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgd2hlcmUgdGhlIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgc2hvdWxkIAotICAgICAgICAgICAqIGNhc2NhZGUgbG9jay4gQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIHdpdGggVkVSU0lPTl9DT0xVTU4gbG9ja2luZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIGNhc2NhZGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlbGVjdGVkLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAKLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXNjYWRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIHNpbXBsZSB0eXBlIHRoYXQgaXMgdXNlZCB3aXRoaW4gYW4gb3B0aW1pc3RpYy1sb2NraW5nIAotICAgICAgICAgKiBzcGVjaWZpY2F0aW9uIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2Ygb3B0aW1pc3RpYy1sb2NraW5nIHRoYXQKLSAgICAgICAgICogRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIG9yIGRlbGV0aW5nIGVudGl0aWVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgZXZlcnkgZmllbGQgaW4gdGhlIHRhYmxlCi0gICAgICAgICAgICogaW4gdGhlIFdIRVJFIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZSBvciBhIGRlbGV0ZS4gSWYgYW55IGZpZWxkCi0gICAgICAgICAgICogaGFzIGJlZW4gY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBTExfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBvbmx5IHRoZSBjaGFuZ2VkIGZpZWxkcwotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUuIElmIGFueSBmaWVsZCBoYXMgYmVlbgotICAgICAgICAgICAqIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIEEgZGVsZXRlCi0gICAgICAgICAgICogd2lsbCBvbmx5IGNvbXBhcmUgdGhlIHByaW1hcnkga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENIQU5HRURfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIGNvbXBhcmVzIHNlbGVjdGVkIGZpZWxkcyBpbiB0aGUgV0hFUkUKLSAgICAgICAgICAgKiBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZCBoYXMgYmVlbgotICAgICAgICAgICAqIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIE5vdGUgdGhhdAotICAgICAgICAgICAqIHRoZSBmaWVsZHMgc3BlY2lmaWVkIG11c3QgYmUgbWFwcGVkIGFuZCBub3QgYmUgcHJpbWFyeSBrZXlzLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTEVDVEVEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgYSBzaW5nbGUgdmVyc2lvbiBudW1iZXIKLSAgICAgICAgICAgKiBpbiB0aGUgd2hlcmUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBUaGUgdmVyc2lvbiBmaWVsZCBtdXN0IGJlCi0gICAgICAgICAgICogbWFwcGVkIGFuZCBub3QgYmUgdGhlIHByaW1hcnkga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFZFUlNJT05fQ09MVU1OCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUxMX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQU5HRURfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VMRUNURURfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkVSU0lPTl9DT0xVTU4iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4gIAotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3JkZXItYnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcmRlckJ5IHsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvcmRlci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcmRlckNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGlvbi1tb2RlIiB0eXBlPSJvcm06b3JkZXItY29sdW1uLXZhbGlkYXRpb24tbW9kZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbi12YWxpZGF0aW9uLW1vZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBPcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlIHsKLSAgICAgICAgICBOT05FLAotICAgICAgICAgIENPUlJFQ1RJT04sCi0gICAgICAgICAgRVhDRVBUSU9OCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPUlJFQ1RJT04iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYQ0VQVElPTiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtbG9hZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdExvYWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFBlcnNpc3Qge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXVwZGF0ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVBlcnNpc3Qge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXVwZGF0ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlVXBkYXRlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmltYXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgVGhlIFByaW1hcnlLZXkgYW5ub3RhdGlvbiBhbGxvd3MgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvZiB0aGUgSWQuCi0gICAgICAgICAqICBBIHZhbGlkYXRpb24gcG9saWN5IGNhbiBiZSBnaXZlbiB0aGF0IGFsbG93cyBzcGVjaWZ5aW5nIGlmIHplcm8gaXMgYSB2YWxpZCBpZCB2YWx1ZS4KLSAgICAgICAgICogIFRoZSBzZXQgb2YgcHJpbWFyeSBrZXkgY29sdW1ucyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgcHJlY2lzZWx5LgotICAgICAgICAgKiAKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAxLjEKLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlLZXkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgQ29uZmlndXJlcyB3aGF0IGlkIHZhbGlkYXRpb24gaXMgZG9uZS4KLSAgICAgICAgICAgKiBCeSBkZWZhdWx0IDAgaXMgbm90IGEgdmFsaWQgaWQgdmFsdWUsIHRoaXMgY2FuIGJlIHVzZWQgdG8gYWxsb3cgMCBpZCB2YWx1ZXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgSWRWYWxpZGF0aW9uIHZhbGlkYXRpb24oKSBkZWZhdWx0IElkVmFsaWRhdGlvbi5aRVJPOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IHRoZSBwcmltYXJ5IGtleSBjb2x1bW5zIGRpcmVjdGx5LgotICAgICAgICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBASWQgaWYgdGhlIHByaW1hcnkga2V5IGluY2x1ZGVzIGEgbm9uIGJhc2ljIGZpZWxkLAotICAgICAgICAgICAqIHN1Y2ggYXMgYSBmb3JlaWduIGtleSwgb3IgYSBpbmhlcml0YW5jZSBkaXNjcmltaW5hdG9yLCBlbWJlZGRlZCwgb3IgdHJhbnNmb3JtYXRpb24gbWFwcGVkIGZpZWxkLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbltdIGNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAKLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0aW9uIiB0eXBlPSJvcm06aWQtdmFsaWRhdGlvbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvcGVydHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBBIHVzZXIgZGVmaW5lZCBtYXBwaW5nJ3MgcHJvcGVydHkuCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByb3BlcnR5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm9wZXJ0eSBuYW1lLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIFByb3BlcnR5IHZhbHVlLAotICAgICAgICAgICAqIGNvbnZlcnRlZCB0byBhbiBpbnN0YW5jZSBvZiB2YWx1ZVR5cGUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUHJvcGVydHkgdmFsdWUgdHlwZS4KLSAgICAgICAgICAgKiBUaGUgdmFsdWUgY29udmVydGVkIHRvIHZhbHVlVHlwZSBieSBDb252ZXJzaW9uTWFuYWdlci4KLSAgICAgICAgICAgKiBJZiBzcGVjaWZpZWQgbXVzdCBiZSBhIHNpbXBsZSB0eXBlIHRoYXQgY291bGQgYmUgaGFuZGxlZCBieSAKLSAgICAgICAgICAgKiBDb252ZXJzaW9uTWFuYWdlcjogCi0gICAgICAgICAgICogbnVtZXJpY2FsLCBib29sZWFuLCB0ZW1wb3JhbC4gIAotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDbGFzcyB2YWx1ZVR5cGUoKSBkZWZhdWx0IFN0cmluZy5jbGFzczsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1oaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBRdWVyeUhpbnQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLXRyYW5zZm9ybWVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFubm90YXRpb24gZm9yIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLSAgICAgICAgICogVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgd3JpdGUtb25seSwgaXQgc2hvdWxkIGhhdmUgYSAKLSAgICAgICAgICogUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIGNvbHVtbihzKSAKLSAgICAgICAgICogdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKLSAgICAgICAgICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0gICAgICAgICAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyKS4KLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJlYWRUcmFuc2Zvcm1lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLSAgICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5BdHRyaWJ1dGVUcmFuc2Zvcm1lciAKLSAgICAgICAgICAgICAqIGludGVyZmFjZS4gVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkLCBpdHMgCi0gICAgICAgICAgICAgKiBidWlsZEF0dHJpYnV0ZVZhbHVlIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHZhbHVlIHRvIGJlIAotICAgICAgICAgICAgICogYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAotICAgICAgICAgICAgICogYSB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlIChub3QgYXNzaWducyB0aGUgdmFsdWUgdG8gCi0gICAgICAgICAgICAgKiB0aGUgYXR0cmlidXRlKS4gRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgCi0gICAgICAgICAgICAgKiBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWNvbmRhcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2VxdWVuY2VHZW5lcmF0b3IgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHNlcXVlbmNlTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDE7Ci0gICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNlcXVlbmNlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3FsUmVzdWx0U2V0TWFwcGluZyB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBFbnRpdHlSZXN1bHRbXSBlbnRpdGllcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ29sdW1uUmVzdWx0W10gY29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1yZXN1bHQiIHR5cGU9Im9ybTplbnRpdHktcmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLXJlc3VsdCIgdHlwZT0ib3JtOmNvbHVtbi1yZXN1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uIGlzIHVzZWQgd2l0aGluIGEgCi0gICAgICAgICAqIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbi4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRGlyZWN0aW9uIGRpcmVjdGlvbigpIGRlZmF1bHQgSU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgcXVlcnkgcGFyYW1ldGVyIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHF1ZXJ5UGFyYW1ldGVyKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIEphdmEgY2xhc3MgZGVzaXJlZCBiYWNrIGZyb20gdGhlIHByb2NlZHVyZSwgCi0gICAgICAgICAgICogdGhpcyBpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgY29kZSwgdGhpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgCi0gICAgICAgICAgICogZnJvbSB0aGUgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIGludCBqZGJjVHlwZSgpIGRlZmF1bHQgLTE7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgbmFtZSwgdGhpcyBtYXkgYmUgcmVxdWlyZWQgZm9yIEFSUkFZIG9yIAotICAgICAgICAgICAqIFNUUlVDVCB0eXBlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgamRiY1R5cGVOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJvcm06ZGlyZWN0aW9uLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icXVlcnktcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RydWN0Q29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IAotICAgICAgICAgICAqIGltcGxlbWVudCB0aGUgRWNsaXBzZUxpbmsgaW50ZXJmYWNlIAotICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNvbnZlcnRlcigpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBwa0NvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBwa0NvbHVtblZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAwOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGVtcG9yYWwgewotICAgICAgICAgIFRlbXBvcmFsVHlwZSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTp0ZW1wb3JhbC10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIHsKLSAgICAgICAgICBEQVRFLCAvLyBqYXZhLnNxbC5EYXRlCi0gICAgICAgICAgVElNRSwgLy8gamF2YS5zcWwuVGltZQotICAgICAgICAgIFRJTUVTVEFNUCAvLyBqYXZhLnNxbC5UaW1lc3RhbXAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRVNUQU1QIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAgCi0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lLW9mLWRheSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGltZU9mRGF5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEhvdXIgb2YgdGhlIGRheS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IGhvdXIoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbnV0ZSBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgbWludXRlKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTZWNvbmQgb2YgdGhlIGRheS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IHNlY29uZCgpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgTWlsbGlzZWNvbmQgb2YgdGhlIGRheS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IG1pbGxpc2Vjb25kKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSW50ZXJuYWwgdXNlLiBEbyBub3QgbW9kaWZ5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIHNwZWNpZmllZCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaG91ciIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaW51dGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2Vjb25kIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbGxpc2Vjb25kIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBpcyBhbiBvcHRpb25hbCBhbm5vdGF0aW9uIGZvciAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgYWxsb3dzIHRvIG1hcCBhbiBhdHRyaWJ1dGUgdG8gb25lIG9yIG1vcmUgCi0gICAgICAgICAqIGRhdGFiYXNlIGNvbHVtbnMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uIGlzIGFuIG9wdGlvbmFsIHBhcnQgb2YgCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBkZWZpbml0aW9uLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyAKLSAgICAgICAgICogd3JpdGUtb25seSwgaXQgc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgCi0gICAgICAgICAqIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKiBBbHNvIHVubGVzcyBpdCdzIGEgcmVhZC1vbmx5IG1hcHBpbmcsIGVpdGhlciBXcml0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgKiBhbm5vdGF0aW9uIG9yIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24gc2hvdWxkIGJlIHNwZWNpZmllZC4gRWFjaCAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2Zvcm1hdGlvbiB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKLSAgICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotICAgICAgICAgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcHRpb25hbCBlbGVtZW50IGlzIGEgaGludCBhcyB0byB3aGV0aGVyIHRoZSB2YWx1ZQotICAgICAgICAgICAgICogIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSBtYXkgYmUgbnVsbC4gSXQgaXMgZGlzcmVnYXJkZWQKLSAgICAgICAgICAgICAqICBmb3IgcHJpbWl0aXZlIHR5cGVzLCB3aGljaCBhcmUgY29uc2lkZXJlZCBub24tb3B0aW9uYWwuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOnJlYWQtdHJhbnNmb3JtZXIiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3cml0ZS10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOndyaXRlLXRyYW5zZm9ybWVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zaWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zaWVudCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFR5cGVDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQotICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbmNlIGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgZmllbGQgCi0gICAgICAgICAgICogb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaXF1ZS1jb25zdHJhaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nW10gY29sdW1uTmFtZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKiogCi0gICAgICAgICAqIFZhcmlhYmxlIG9uZSB0byBvbmUgbWFwcGluZ3MgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcG9pbnRlciAKLSAgICAgICAgICogcmVmZXJlbmNlcyBiZXR3ZWVuIGEgamF2YSBvYmplY3QgYW5kIGFuIGltcGxlbWVudGVyIG9mIGFuIGludGVyZmFjZS4gCi0gICAgICAgICAqIFRoaXMgbWFwcGluZyBpcyB1c3VhbGx5IHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHBvaW50ZXIgKHN0b3JlZCBpbiBhbiAKLSAgICAgICAgICogaW5zdGFuY2UgdmFyaWFibGUpIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMuIEluIHRoZSAKLSAgICAgICAgICogcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZXMsIHRoZXNlIG1hcHBpbmdzIGFyZSBub3JtYWxseSBpbXBsZW1lbnRlZCAKLSAgICAgICAgICogdXNpbmcgYSBmb3JlaWduIGtleSBhbmQgYSB0eXBlIGNvZGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIFZhcmlhYmxlT25lVG9PbmUgY2FuIGJlIHNwZWNpZmllZCB3aXRoaW4gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbmQgRW1iZWRkYWJsZSBjbGFzcy4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIAotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZhcmlhYmxlT25lVG9PbmUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGludGVyZmFjZSBjbGFzcyB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIAotICAgICAgICAgICAqIGFzc29jaWF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSAKLSAgICAgICAgICAgKiBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdGFyZ2V0SW50ZXJmYWNlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgY2FzY2FkZWQgdG8gdGhlIHRhcmdldCBvZiAKLSAgICAgICAgICAgKiB0aGUgYXNzb2NpYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotICAgICAgICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotICAgICAgICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIG9wdGlvbmFsLiBJZiBzZXQgdG8gZmFsc2UgCi0gICAgICAgICAgICogdGhlbiBhIG5vbi1udWxsIHJlbGF0aW9uc2hpcCBtdXN0IGFsd2F5cyBleGlzdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2lsbCBob2xkIHRoZSB0eXBlIAotICAgICAgICAgICAqIGluZGljYXRvcnMuIElmIHRoZSBEaXNjcmltaW5hdG9yQ29sdW1uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIAotICAgICAgICAgICAqIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiBkZWZhdWx0cyB0byAiRFRZUEUiIGFuZCB0aGUgCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvciB0eXBlIHRvIFNUUklORy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXNjcmltaW5hdG9yQ29sdW1uIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0IEBEaXNjcmltaW5hdG9yQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbGlzdCBvZiBkaXNjcmltaW5hdG9yIHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCAKLSAgICAgICAgICAgKiB0aGlzIFZhcmlhYmxlT25lVG9PbmUuIElmIG5vbmUgYXJlIHNwZWNpZmllZCB0aGVuIHRob3NlIGVudGl0aWVzIAotICAgICAgICAgICAqIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCB0aGF0IGltcGxlbWVudCB0aGUgdGFyZ2V0IGludGVyZmFjZSAKLSAgICAgICAgICAgKiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHR5cGVzLiBUaGUgZGlzY3JpbWluYXRvciB0eXBlIHdpbGwgCi0gICAgICAgICAgICogZGVmYXVsdCBhcyBmb2xsb3dzOgotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBTVFJJTkc6IEVudGl0eS5uYW1lKCkKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgQ0hBUjogRmlyc3QgbGV0dGVyIG9mIHRoZSAKLSAgICAgICAgICAgKiAgICBFbnRpdHkgY2xhc3MKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgSU5URUdFUjogVGhlIG5leHQgaW50ZWdlciBhZnRlciAKLSAgICAgICAgICAgKiAgICB0aGUgaGlnaGVzdCBpbnRlZ2VyIGV4cGxpY2l0bHkgYWRkZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRGlzY3JpbWluYXRvckNsYXNzW10gZGlzY3JpbWluYXRvckNsYXNzZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqICAKLSAgICAgICAgICogQSBzaW5nbGUgV3JpdGVUcmFuc2Zvcm1lciBtYXkgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSBtZXRob2Qgb3IgCi0gICAgICAgICAqIGF0dHJpYnV0ZS4gTXVsdGlwbGUgV3JpdGVUcmFuc2Zvcm1lcnMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbi4gTm8gV3JpdGVUcmFuc2Zvcm1lcnMgc3BlY2lmaWVkIGZvciAKLSAgICAgICAgICogcmVhZC1vbmx5IG1hcHBpbmcuIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IAotICAgICAgICAgKiBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSAKLSAgICAgICAgICogY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgV3JpdGVUcmFuc2Zvcm1lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLSAgICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5GaWVsZFRyYW5zZm9ybWVyIAotICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyBidWlsZEZpZWxkVmFsdWUgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIAotICAgICAgICAgICAgICogY29sdW1uLiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgCi0gICAgICAgICAgICAgKiBzdXBwb3J0ZWQgdGhlIG1ldGhvZCBidWlsZEZpZWxkVmFsdWUgaW4gdGhlIGNsYXNzIHNob3VsZCBiZSAKLSAgICAgICAgICAgICAqIGRlZmluZWQgdG8gcmV0dXJuIHRoZSByZWxldmFudCBKYXZhIHR5cGUsIG5vdCBqdXN0IE9iamVjdCBhcyAKLSAgICAgICAgICAgICAqIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSwgZm9yIGluc3RhbmNlOgotICAgICAgICAgICAgICogcHVibGljIFRpbWUgYnVpbGRGaWVsZFZhbHVlKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIGZpZWxkTmFtZSwgU2Vzc2lvbiBzZXNzaW9uKS4KLSAgICAgICAgICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAotICAgICAgICAgICAgICogYSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIGNvbHVtbi4KLSAgICAgICAgICAgICAqIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSBzdXBwb3J0ZWQgdGhlIAotICAgICAgICAgICAgICogbWV0aG9kIHNob3VsZCBiZSBkZWZpbmVkIHRvIHJldHVybiBhIHBhcnRpY3VsYXIgdHlwZSwgbm90IGp1c3QgCi0gICAgICAgICAgICAgKiBPYmplY3QsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGdldFN0YXJ0VGltZSgpLgotICAgICAgICAgICAgICogVGhlIG1ldGhvZCBtYXkgcmVxdWlyZSBhIFRyYW5zaWVudCBhbm5vdGF0aW9uIHRvIGF2b2lkIGJlaW5nIAotICAgICAgICAgICAgICogbWFwcGVkIGFzIEJhc2ljIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAgICAgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKLSAgICAgICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMl8wLnhzZCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYTIzYWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMl8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM2MjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIAotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAKLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsKLSAgICAgdHdhcmUgLSB1cGRhdGUgdmVyc2lvbiBudW1iZXIgdG8gMi4wCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS0tPgotCi08IS0tIEphdmEgUGVyc2lzdGVuY2UgQVBJIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZSBzY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczpvcm09Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAotICB2ZXJzaW9uPSIyLjAiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QgMi4wICBPY3RvYmVyIDUgMjAwOAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpkb2N1bWVudGF0aW9uPjwhW0NEQVRBWwotCi0gICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIG5hdGl2ZSBFY2xpcHNlbGluayBYTUwgbWFwcGluZyBmaWxlCi0gICAgICAgVGhlIGZpbGUgbWF5IGJlIG5hbWVkICJNRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiBpbiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICBhcmNoaXZlIG9yIGl0IG1heSBiZSBuYW1lZCBzb21lIG90aGVyIG5hbWUgd2hpY2ggd291bGQgYmUKLSAgICAgICB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsZSBhcyByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgotICAgICAgIE9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZXMgbXVzdCBpbmRpY2F0ZSB0aGUgb2JqZWN0L3JlbGF0aW9uYWwKLSAgICAgICBtYXBwaW5nIGZpbGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSBwZXJzaXN0ZW5jZSBuYW1lc3BhY2U6Ci0KLSAgICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtCi0KLSAgICAgICBhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgICAgPGVudGl0eS1tYXBwaW5ncyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIKLSAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSAKLSAgICAgICBlY2xpcHNlbGlua19vcm1fMl8wLnhzZAotICAgICAgIHZlcnNpb249IjIuMCI+Ci0gICAgICAgLi4uCi0gICAgICAgPC9lbnRpdHktbWFwcGluZ3M+Ci0KLSAgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWNjZXNzLW1ldGhvZHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlIGFubm90YXRpb24gaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmludmFsaWRhdGlvbi5DYWNoZUludmFsaWRhdGlvblBvbGljeSAKLSAgICAgICAgICogd2hpY2ggc2V0cyBvYmplY3RzIGluIEVjbGlwc2VMaW5rJ3MgaWRlbnRpdHkgbWFwcyB0byBiZSBpbnZhbGlkIAotICAgICAgICAgKiBmb2xsb3dpbmcgZ2l2ZW4gcnVsZXMuIEJ5IGRlZmF1bHQgaW4gRWNsaXBzZUxpbmssIG9iamVjdHMgZG8gbm90IAotICAgICAgICAgKiBleHBpcmUgaW4gdGhlIGNhY2hlLiBTZXZlcmFsIGRpZmZlcmVudCBwb2xpY2llcyBhcmUgYXZhaWxhYmxlIHRvIAotICAgICAgICAgKiBhbGxvdyBvYmplY3RzIHRvIGV4cGlyZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGVUeXBlCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENhY2hlIGFub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IgTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIENhY2hlIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCAKLSAgICAgICAgICogb24gdGhlIHJvb3Qgb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVUeXBlIHR5cGUoKSBkZWZhdWx0IFNPRlRfV0VBSzsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNpemUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgMTAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDYWNoZWQgaW5zdGFuY2VzIGluIHRoZSBzaGFyZWQgY2FjaGUgb3IgYSBjbGllbnQgCi0gICAgICAgICAgICogaXNvbGF0ZWQgY2FjaGUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gc2hhcmVkKCkgZGVmYXVsdCB0cnVlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGFmdGVyIGEgZml4IHBlcmlvZCBvZiB0aW1lIChtcykuIAotICAgICAgICAgICAqIFF1ZXJpZXMgZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIAotICAgICAgICAgICAqIHRvIHRoZSBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgZXhwaXJ5KCkgZGVmYXVsdCAtMTsgLy8gbWludXMgb25lIGlzIG5vIGV4cGlyeS4KLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRXhwaXJlIGNhY2hlZCBpbnN0YW5jZSBhIHNwZWNpZmljIHRpbWUgb2YgZGF5LiBRdWVyaWVzIAotICAgICAgICAgICAqIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayB0byB0aGUgCi0gICAgICAgICAgICogZGF0YWJhc2UgZm9yIGEgcmVmcmVzaGVkIGNvcHkKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgVGltZU9mRGF5IGV4cGlyeVRpbWVPZkRheSgpIGRlZmF1bHQgQFRpbWVPZkRheShzcGVjaWZpZWQ9ZmFsc2UpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBGb3JjZSBhbGwgcXVlcmllcyB0aGF0IGdvIHRvIHRoZSBkYXRhYmFzZSB0byBhbHdheXMgCi0gICAgICAgICAgICogcmVmcmVzaCB0aGUgY2FjaGUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gYWx3YXlzUmVmcmVzaCgpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbGwgcXVlcmllcyB0aGF0IGdvIHRvIHRoZSBkYXRhYmFzZSwgcmVmcmVzaCB0aGUKLSAgICAgICAgICAgKiBjYWNoZSBvbmx5IGlmIHRoZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRhdGFiYXNlIGJ5IGEgcXVlcnkgaXMgCi0gICAgICAgICAgICogbmV3ZXIgdGhhbiB0aGUgZGF0YSBpbiB0aGUgY2FjaGUgKGFzIGRldGVybWluZWQgYnkgdGhlIG9wdGltaXN0aWMgCi0gICAgICAgICAgICogbG9ja2luZyBmaWVsZCkKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIoKSBkZWZhdWx0IGZhbHNlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTZXR0aW5nIHRvIHRydWUgd2lsbCBmb3JjZSBhbGwgcXVlcmllcyB0byBieXBhc3MgdGhlIAotICAgICAgICAgICAqIGNhY2hlIGZvciBoaXRzIGJ1dCBzdGlsbCByZXNvbHZlIGFnYWluc3QgdGhlIGNhY2hlIGZvciBpZGVudGl0eS4gCi0gICAgICAgICAgICogVGhpcyBmb3JjZXMgYWxsIHF1ZXJpZXMgdG8gaGl0IHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBkaXNhYmxlSGl0cygpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBjYWNoZSBjb29yZGluYXRpb24gbW9kZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGUoKSBkZWZhdWx0IFNFTkRfT0JKRUNUX0NIQU5HRVM7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeSIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeS10aW1lLW9mLWRheSIgdHlwZT0ib3JtOnRpbWUtb2YtZGF5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFyZWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNhY2hlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbHdheXMtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZyZXNoLW9ubHktaWYtbmV3ZXIiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzYWJsZS1oaXRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvb3JkaW5hdGlvbi10eXBlIiB0eXBlPSJvcm06Y2FjaGUtY29vcmRpbmF0aW9uLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAKLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlLWludGVyY2VwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2FjaGVJbnRlcmNlcHRvciB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGVUeXBlIGVudW0gaXMgdXNlZCB3aXRoIHRoZSBDYWNoZSBhbm5vdGF0aW9uIGZvciBhIAotICAgICAgICAgKiBwZXJzaXN0ZW50IGNsYXNzLiBJdCBkZWZpbmVzIHRoZSB0eXBlIG9mIElkZW50aXR5TWFwL0NhY2hlIHVzZWQgZm9yIAotICAgICAgICAgKiB0aGUgY2xhc3MuIEJ5IGRlZmF1bHQgdGhlIFNPRlRfV0VBSyBjYWNoZSB0eXBlIGlzIHVzZWQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuIENhY2hlcyBhbGwgb2JqZWN0cwotICAgICAgICAgICAqIGFuZCBkb2VzIG5vdCByZW1vdmUgdGhlbS4gCi0gICAgICAgICAgICogV0FSTklORzogVGhpcyBtZXRob2QgbWF5IGJlIG1lbW9yeSBpbnRlbnNpdmUgd2hlbiBtYW55IG9iamVjdHMgYXJlIAotICAgICAgICAgICAqIHJlYWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRlVMTCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0gICAgICAgICAgICogb2JqZWN0cyB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0gICAgICAgICAgICogb2JqZWN0cyB1c2luZyBzb2Z0IHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIHdoZW4gbWVtb3J5IGlzIGxvdyBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZAotICAgICAgICAgICAqIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU09GVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIFdFQUsgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhCi0gICAgICAgICAgICogbW9zdC1mcmVxdWVudGx5LXVzZWQgc3ViLWNhY2hlLiBUaGUgc2l6ZSBvZiB0aGUgc3ViLWNhY2hlIGlzCi0gICAgICAgICAgICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAgYXMgc3BlY2lmaWVkIGJ5Ci0gICAgICAgICAgICogZGVzY3JpcHRvcidzIHNldElkZW50aXR5TWFwU2l6ZSgpIG1ldGhvZC4gVGhlIHN1Yi1jYWNoZQotICAgICAgICAgICAqIHVzZXMgc29mdCByZWZlcmVuY2VzIHRvIGVuc3VyZSB0aGF0IHRoZXNlIG9iamVjdHMgYXJlCi0gICAgICAgICAgICogZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU09GVF9XRUFLLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSWRlbnRpY2FsIHRvIHRoZSBzb2Z0IGNhY2hlIHdlYWsgKFNPRlRfV0VBSykgaWRlbnRpdHkgbWFwIGV4Y2VwdCAKLSAgICAgICAgICAgKiB0aGF0IGl0IHVzZXMgaGFyZCByZWZlcmVuY2VzIGluIHRoZSBzdWItY2FjaGUuIFVzZSB0aGlzIGlkZW50aXR5IAotICAgICAgICAgICAqIG1hcCBpZiBzb2Z0IHJlZmVyZW5jZXMgZG8gbm90IGJlaGF2ZSBwcm9wZXJseSBvbiB5b3VyIHBsYXRmb3JtLgotICAgICAgICAgICAqLwotICAgICAgICAgIEhBUkRfV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEEgY2FjaGUgaWRlbnRpdHkgbWFwIG1haW50YWlucyBhIGZpeGVkIG51bWJlciBvZiBvYmplY3RzCi0gICAgICAgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gT2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZQotICAgICAgICAgICAqIG9uIGEgbGVhc3QtcmVjZW50bHktdXNlZCBiYXNpcy4gVGhpcyBtZXRob2QgYWxsb3dzIG9iamVjdAotICAgICAgICAgICAqIGlkZW50aXR5IGZvciB0aGUgbW9zdCBjb21tb25seSB1c2VkIG9iamVjdHMuCi0gICAgICAgICAgICogV0FSTklORzogRnVybmlzaGVzIGNhY2hpbmcgYW5kIGlkZW50aXR5LCBidXQgZG9lcyBub3QgZ3VhcmFudGVlIAotICAgICAgICAgICAqIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENBQ0hFLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogV0FSTklORzogRG9lcyBub3QgcHJlc2VydmUgb2JqZWN0IGlkZW50aXR5IGFuZCBkb2VzIG5vdCBjYWNoZSAKLSAgICAgICAgICAgKiBvYmplY3RzLgotICAgICAgICAgICAqLwotICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlVMTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVF9XRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQVJEX1dFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAgCi0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENhY2hlIGFubm90YXRpb24uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlQ29vcmRpbmF0aW9uVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIGNoYW5nZWQgb2JqZWN0cyBpbmNsdWRpbmcgZGF0YSBhYm91dCB0aGUgY2hhbmdlcy4KLSAgICAgICAgICAgKiBUaGlzIGRhdGEgaXMgbWVyZ2VkIGludG8gdGhlIHJlY2VpdmluZyBjYWNoZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRU5EX09CSkVDVF9DSEFOR0VTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIHRoZSBpZGVudGl0aWVzIG9mIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgKiBUaGUgcmVjZWl2aW5nIGNhY2hlIGludmFsaWRhdGVzIHRoZSBvYmplY3RzIChyYXRoZXIgdGhhbiBjaGFuZ2luZyAKLSAgICAgICAgICAgKiBhbnkgb2YgdGhlIGRhdGEpCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTYW1lIGFzIFNFTkRfT0JKRUNUX0NIQU5HRVMgZXhjZXB0IGl0IGFsc28gaW5jbHVkZXMgYW55IG5ld2x5Ci0gICAgICAgICAgICogY3JlYXRlZCBvYmplY3RzIGZyb20gdGhlIHRyYW5zYWN0aW9uLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogRG9lcyBubyBjYWNoZSBjb29yZGluYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgTk9ORQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX09CSkVDVF9DSEFOR0VTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNoYW5nZXRyYWNraW5nLk9iamVjdENoYW5nZVBvbGljeSAKLSAgICAgICAgICogd2hpY2ggY29tcHV0ZXMgY2hhbmdlcyBzZXRzIGZvciBFY2xpcHNlTGluaydzIFVuaXRPZldvcmsgY29tbWl0IAotICAgICAgICAgKiBwcm9jZXNzLiBBbiBPYmplY3RDaGFuZ2VQb2xpY3kgaXMgc3RvcmVkIG9uIGFuIEVudGl0eSdzIGRlc2NyaXB0b3IuCi0gICAgICAgICAqCi0gICAgICAgICAqIEEgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBtYXkgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDaGFuZ2VUcmFja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBjaGFuZ2UgdHJhY2tpbmcgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUoKSBkZWZhdWx0IEFVVE87Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmctdHlwZSIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENoYW5nZVRyYWNraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gQVRUUklCVVRFIGNoYW5nZSB0cmFja2luZyB0eXBlIGFsbG93cyBjaGFuZ2UgdHJhY2tpbmcgYXQgdGhlCi0gICAgICAgICAgICogYXR0cmlidXRlIGxldmVsIG9mIGFuIG9iamVjdC4gT2JqZWN0cyB3aXRoIGNoYW5nZWQgYXR0cmlidXRlcyB3aWxsCi0gICAgICAgICAgICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSAKLSAgICAgICAgICAgKiByZXN1bHRzIG9mIHRoZSBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVFRSSUJVVEUsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBPQkpFQ1QgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBhbGxvd3MgYW4gb2JqZWN0IHRvIGNhbGN1bGF0ZSBmb3IgCi0gICAgICAgICAgICogaXRzZWxmIHdoZXRoZXIgaXQgaGFzIGNoYW5nZWQuIENoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIHByb2Nlc3NlZCBpbiAKLSAgICAgICAgICAgKiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgCi0gICAgICAgICAgICogY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgT0JKRUNULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQSBERUZFUlJFRCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGRlZmVycyBhbGwgY2hhbmdlIGRldGVjdGlvbiB0bwotICAgICAgICAgICAqIHRoZSBVbml0T2ZXb3JrJ3MgY2hhbmdlIGRldGVjdGlvbiBwcm9jZXNzLiBFc3NlbnRpYWxseSwgdGhlIAotICAgICAgICAgICAqIGNhbGN1bGF0ZUNoYW5nZXMoKSBtZXRob2Qgd2lsbCBydW4gZm9yIGFsbCBvYmplY3RzIGluIGEgVW5pdE9mV29yay4gCi0gICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBPYmplY3RDaGFuZ2VQb2xpY3kKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBERUZFUlJFRCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdpbGwgbm90IHNldCBhbnkgY2hhbmdlIHRyYWNraW5nIHBvbGljeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVVRPCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUVFJJQlVURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0JKRUNUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUZFUlJFRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbWl6ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLkRlc2NyaXB0b3JDdXN0b21pemVyIAotICAgICAgICAgKiBpbnRlcmZhY2UgYW5kIGlzIHRvIHJ1biBhZ2FpbnN0IGFuIGVuZXRpdHkncyBjbGFzcyBkZXNjcmlwdG9yIGFmdGVyIGFsbCAKLSAgICAgICAgICogbWV0YWRhdGEgcHJvY2Vzc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIAotICAgICAgICAgKiBvciBFbWJlZGRhYmxlIGNsYXNzLiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDdXN0b21pemVyIGlzIG5vdCAKLSAgICAgICAgICogaW5oZXJpdGVkIGZyb20gaXRzIHBhcmVudCBjbGFzc2VzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDdXN0b21pemVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyB0aGF0IAotICAgICAgICAgICAqIHNob3VsZCBiZSBhcHBsaWVkIGZvciB0aGUgcmVsYXRlZCBlbnRpdHkgb3IgZW1iZWRkYWJsZSBjbGFzcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXJlY3Rpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbi4KLSAgICAgICAgICogSXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgCi0gICAgICAgICAqIHBhcmFtZXRlcnMgb2YgYSBuYW1lZCBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gRGlyZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTiwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIE91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPVVQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIElOX09VVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIE91dHB1dCBjdXJzb3IKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPVVRfQ1VSU09SCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOX09VVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUX0NVUlNPUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LW1hcHBpbmdzIj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBtYXBwaW5nCi0gICAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgotCi0gICAgICAgICAgMS4gVGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBjb250YWlucyBtZXRhZGF0YQotICAgICAgICAgIGZvciB0aGUgZW50aXJlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCBpZiB0aGlzIGVsZW1lbnQKLSAgICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKLSAgICAgICAgICB0aGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBkZWZpbmVkIGluCi0gICAgICAgICAgdGhlIHNhbWUgZmlsZSBpbiB3aGljaCB0aGV5IG9jY3VyLgotCi0gICAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKLSAgICAgICAgICBuYW1lZC1uYXRpdmUtcXVlcnkgYW5kIHNxbC1yZXN1bHQtc2V0LW1hcHBpbmcgZWxlbWVudHMgYXJlIGdsb2JhbAotICAgICAgICAgIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCi0gICAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCi0gICAgICAgICAgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyBhbHNvCi0gICAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSwgbmFtZWQtbmF0aXZlLXF1ZXJ5LCBvcgotICAgICAgICAgIHJlc3VsdC1zZXQtbWFwcGluZyBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBtYXBwaW5nCi0gICAgICAgICAgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgICAgNC4gVGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZWFjaCBkZWZpbmUKLSAgICAgICAgICB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBtYW5hZ2VkIHBlcnNpc3RlbnQgY2xhc3MuIFRoZSBtYXBwaW5nCi0gICAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKLSAgICAgICAgICBiZSBwYXJ0aWFsLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyIgdHlwZT0ib3JtOm1hcHBlZC1zdXBlcmNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGFibGUiIHR5cGU9Im9ybTplbWJlZGRhYmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uVHlwZSIgZml4ZWQ9IjIuMCIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICogY2hlY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIGVudGl0aWVzLgotICAgICAgICAgKiAKLSAgICAgICAgICogQW4gZXhpc3RlbmNlLWNoZWNraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbm5vdGF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRXhpc3RlbmNlQ2hlY2tpbmcgewotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTZXQgdGhlIGV4aXN0ZW5jZSBjaGVjayBmb3IgZGV0ZXJtaW5pbmcKLSAgICAgICAgICAgKiBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIEV4aXN0ZW5jZVR5cGUgdmFsdWUoKSBkZWZhdWx0IENIRUNLX0NBQ0hFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCBhbmQgCi0gICAgICAgICAqIGl0IGlzIGluIHRoZSBjYWNoZSwgdGhlbiBpdCBtdXN0IGV4aXN0LgotICAgICAgICAgKi8KLSAgICAgICAgQ0hFQ0tfQ0FDSEUsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBlcmZvcm0gZG9lcyBleGlzdCBjaGVjayBvbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBDSEVDS19EQVRBQkFTRSwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIHRoZW4gCi0gICAgICAgICAqIGl0IG11c3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgCi0gICAgICAgICAqIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4KLSAgICAgICAgICovCi0gICAgICAgIEFTU1VNRV9FWElTVEVOQ0UsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIAotICAgICAgICAgKiBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4gIAotICAgICAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIGZvcmNlIGFuIGluc2VydCB0byBiZSBjYWxsZWQuCi0gICAgICAgICAqLwotICAgICAgICBBU1NVTUVfTk9OX0VYSVNURU5DRQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+ICAgIAotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0NBQ0hFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19EQVRBQkFTRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX0VYSVNURU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX05PTl9FWElTVEVOQ0UiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4gCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIE1ldGFkYXRhIHRoYXQgYXBwbGllcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgbm90IGp1c3QgdG8gCi0gICAgICAgIHRoZSBtYXBwaW5nIGZpbGUgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLiAKLQotICAgICAgICBJZiB0aGUgeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgZWxlbWVudCBpcyBzcGVjaWZpZWQsCi0gICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBYTUwgbWFwcGluZyBmaWxlcyBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlc2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXMgYSB3aG9sZQotICAgICAgICB1bmxlc3MgdGhleSBhcmUgb3ZlcnJpZGRlbiBieSBsb2NhbCBhbm5vdGF0aW9uIG9yIFhNTAotICAgICAgICBlbGVtZW50IHNldHRpbmdzLgotCi0gICAgICAgIHNjaGVtYSAtIFVzZWQgYXMgdGhlIHNjaGVtYSBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywKLSAgICAgICAgICAgIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgZ2VuZXJhdG9ycwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXRhbG9nIC0gVXNlZCBhcyB0aGUgY2F0YWxvZyBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywKLSAgICAgICAgICAgIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgZ2VuZXJhdG9ycwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBhY2Nlc3MgLSBVc2VkIGFzIHRoZSBhY2Nlc3MgdHlwZSBmb3IgYWxsIG1hbmFnZWQgY2xhc3NlcyBpbgotICAgICAgICAgICAgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2FzY2FkZS1wZXJzaXN0IC0gQWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMKLSAgICAgICAgICAgIGluIGFsbCBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBlbnRpdHktbGlzdGVuZXJzIC0gTGlzdCBvZiBkZWZhdWx0IGVudGl0eSBsaXN0ZW5lcnMgdG8gYmUgaW52b2tlZAotICAgICAgICAgICAgb24gZWFjaCBlbnRpdHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlbGltaXRlZC1pZGVudGlmaWVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGFuIGVudGl0eS4gSXMgYWxsb3dlZCB0byBiZQotICAgICAgICBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYW5ub3RhdGlvbnMuCi0gICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8KLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4KLSAgICAgICAgdGhlIGRlZmF1bHRpbmcgcnVsZXMgZm9yIHRoZSBlbnRpdHkgYW5kIGl0cyBzdWItZWxlbWVudHMgd2lsbAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ib3JtOnRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWNvbmRhcnktdGFibGUiIHR5cGU9Im9ybTpzZWNvbmRhcnktdGFibGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXkiIHR5cGU9Im9ybTpwcmltYXJ5LWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9Im9ybTppbmhlcml0YW5jZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtaW50ZXJjZXB0b3IiIHR5cGU9Im9ybTpjYWNoZS1pbnRlcmNlcHRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5LXJlZGlyZWN0b3JzIiB0eXBlPSJvcm06cXVlcnktcmVkaXJlY3RvcnMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FjaGVhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGlzdGVuY2UtY2hlY2tpbmciIHR5cGU9Im9ybTpleGlzdGVuY2UtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJhY2Nlc3MtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBkZXRlcm1pbmVzIGhvdyB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgYWNjZXNzZXMgdGhlCi0gICAgICAgIHN0YXRlIG9mIGFuIGVudGl0eSBvciBlbWJlZGRlZCBvYmplY3QuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9QRVJUWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklFTEQiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEFzc29jaWF0aW9uT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdHt9OwotICAgICAgICAgIEpvaW5UYWJsZSBqb2luVGFibGUoKSBkZWZhdWx0IEBKb2luVGFibGU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBdHRyaWJ1dGVPdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBDb2x1bW4gY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBjb250YWlucyB0aGUgZW50aXR5IGZpZWxkIG9yIHByb3BlcnR5IG1hcHBpbmdzLgotICAgICAgICBJdCBtYXkgYmUgc3BhcnNlbHkgcG9wdWxhdGVkIHRvIGluY2x1ZGUgb25seSBhIHN1YnNldCBvZiB0aGUKLSAgICAgICAgZmllbGRzIG9yIHByb3BlcnRpZXMuIElmIG1ldGFkYXRhLWNvbXBsZXRlIGZvciB0aGUgZW50aXR5IGlzIHRydWUKLSAgICAgICAgdGhlbiB0aGUgcmVtYWluZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGVmYXVsdGVkIGFjY29yZGluZwotICAgICAgICB0byB0aGUgZGVmYXVsdCBydWxlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ib3JtOmlkIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZC1pZCIgdHlwZT0ib3JtOmVtYmVkZGVkLWlkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYyIgdHlwZT0ib3JtOmJhc2ljIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiIgdHlwZT0ib3JtOmJhc2ljLWNvbGxlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1tYXAiIHR5cGU9Im9ybTpiYXNpYy1tYXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tb25lIiB0eXBlPSJvcm06bWFueS10by1vbmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tbWFueSIgdHlwZT0ib3JtOm9uZS10by1tYW55IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW9uZSIgdHlwZT0ib3JtOm9uZS10by1vbmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIiB0eXBlPSJvcm06dmFyaWFibGUtb25lLXRvLW9uZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tbWFueSIgdHlwZT0ib3JtOm1hbnktdG8tbWFueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsZW1lbnQtY29sbGVjdGlvbiIgdHlwZT0ib3JtOmVsZW1lbnQtY29sbGVjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZCIgdHlwZT0ib3JtOmVtYmVkZGVkIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNmb3JtYXRpb24iIHR5cGU9Im9ybTp0cmFuc2Zvcm1hdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljIHsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljQ29sbGVjdGlvbiB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgdGhhdCAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgaGludCB0byAKLSAgICAgICAgICAgKiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gCi0gICAgICAgICAgICogTEFaWS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7IAotIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIHZhbHVlIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06ZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLW1hcCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljTWFwIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGRhdGEgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCBtYXAgCi0gICAgICAgICAgICoga2V5LiBJZiB0aGUgbmFtZSBvbiB0ZSBrZXkgY29sdW1uIGlzICIiLCB0aGUgbmFtZSB3aWxsIGRlZmF1bHQgdG86Ci0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9yIGZpZWxkOyAiX0tFWSIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIGtleUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUga2V5IGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgZGlyZWN0IG1hcCBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCBrZXlDb252ZXJ0ZXIoKSBkZWZhdWx0IEBDb252ZXJ0OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IAotICAgICAgICAgICAqIGNvbGxlY3Rpb24gZGF0YS4gRGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IG9yIGZpZWxkIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIHZhbHVlQ29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB2YWx1ZSBjb252ZXJ0ZXIuIERlZmF1bHQgaXMgZXF1aXZhbGVudCB0byAKLSAgICAgICAgICAgKiBzcGVjaWZ5aW5nIEBDb252ZXJ0KCJub25lIiksIG1lYW5pbmcgbm8gY29udmVydGVyIHdpbGwgYmUgYWRkZWQgdG8gCi0gICAgICAgICAgICogdGhlIHZhbHVlIGNvbHVtbiBtYXBwaW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnQgdmFsdWVDb252ZXJ0ZXIoKSBkZWZhdWx0IEBDb252ZXJ0OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtleS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtleS1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMiI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4gICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmVjbGlwc2VsaW5rLWNvbGxlY3Rpb24tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYXNjYWRlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBDYXNjYWRlVHlwZSB7IEFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtYWxsIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtbWVyZ2UiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlZnJlc2giIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ2xvbmVDb3B5UG9saWN5IG9uIGFuIAotICAgICAgICAgKiBFbnRpdHkuIEEgQ2xvbmVDb3B5UG9saWN5IG11c3Qgc3BlY2lmeSBhdCBvbmUgb3IgYm90aCBvZiB0aGUgIm1ldGhvZCIgCi0gICAgICAgICAqIG9yICJ3b3JraW5nQ29weU1ldGhvZCIuICJ3b3JraW5nQ29weU1ldGhvZCIgaXMgdXNlZCB0byBjbG9uZSBvYmplY3RzIAotICAgICAgICAgKiB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIHVzZXIgYXMgdGhleSBhcmUgcmVnaXN0ZXJlZCBpbiAKLSAgICAgICAgICogRWNsaXBzZUxpbmsncyB0cmFuc2FjdGlvbmFsIG1lY2hhbmlzbSwgdGhlIFVuaXRPZldvcmsuICJtZXRob2QiIHdpbGwgCi0gICAgICAgICAqIGJlIHVzZWQgZm9yIHRoZSBjbG9uZSB0aGF0IGlzIHVzZWQgZm9yIGNvbXBhcmlzb24gaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgKiAgCi0gICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzCi0gICAgICAgICAqIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBFeGFtcGxlOgotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIikKLSAgICAgICAgICogCi0gICAgICAgICAqIG9yOgotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KG1ldGhvZD0ibXlDbG9uZU1ldGhvZCIsIHdvcmtpbmdDb3B5TWV0aG9kPSJteVdvcmtpbmdDb3B5Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kod29ya2luZ0NvcHlNZXRob2ROYW1lPSJteVdvcmtpbmdDb3B5Q2xvbmUiKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2xvbmVDb3B5UG9saWN5IHsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpCi0gICAgICAgICAgICAgKiBFaXRoZXIgbWV0aG9kIG9yIHdvcmtpbmdDb3B5TWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkIHRoaXMgZGVmaW5lcyAKLSAgICAgICAgICAgICAqIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgd2lsbCBiZSB1c2VkIAotICAgICAgICAgICAgICogZm9yIGNvbXBhcmlzb24gYnkKLSAgICAgICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgRGVmZXJyZWRDaGFuZ2VEZXRlY3Rpb25Qb2xpY3kKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCgpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkKLSAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQKLSAgICAgICAgICAgICAqIHRoaXMgZGVmaW5lcyBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBjbG9uZSB0aGF0IAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgb2JqZWN0IHJldHVybmVkIHdoZW4gcmVnaXN0ZXJpbmcgYW4gCi0gICAgICAgICAgICAgKiBPYmplY3QgaW4gYW4gRWNsaXBzZUxpbmsgVW5pdE9mV29yawotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgd29ya2luZ0NvcHlNZXRob2QoKTsKLQotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0id29ya2luZy1jb3B5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sbGVjdGlvblRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0YWJsZS4gSWYgaXQgaXMgbm90IAotICAgICAgICAgICAqIHNwZWNpZmllZCwgaXQgaXMgZGVmYXVsdGVkIHRvIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmc6IAotICAgICAgICAgICAqIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZW50aXR5OyAiXyIgOyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwIAotICAgICAgICAgICAqIHByb3BlcnR5IG9yIGZpZWxkIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBjYXRhbG9nIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBjYXRhbG9nLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBzY2hlbWEgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IHNjaGVtYS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSBhIHByaW1hcnkga2V5IGNvbHVtbiB0aGF0IGlzIHVzZWQgYXMgYSAKLSAgICAgICAgICAgKiBmb3JlaWduIGtleSB0byBqb2luIHRvIGFub3RoZXIgdGFibGUuIElmIHRoZSBzb3VyY2UgZW50aXR5IHVzZXMgYSAKLSAgICAgICAgICAgKiBjb21wb3NpdGUgcHJpbWFyeSBrZXksIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbXVzdCBiZSBzcGVjaWZpZWQgCi0gICAgICAgICAgICogZm9yIGVhY2ggZmllbGQgb2YgdGhlIGNvbXBvc2l0ZSBwcmltYXJ5IGtleS4gSW4gYSBzaW5nbGUgcHJpbWFyeSAKLSAgICAgICAgICAgKiBrZXkgY2FzZSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtYXkgb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQuIAotICAgICAgICAgICAqIERlZmF1bHRpbmcgd2lsbCBhcHBseSBvdGhlcndpc2UgYXMgZm9sbG93czoKLSAgICAgICAgICAgKiBuYW1lLCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgCi0gICAgICAgICAgICogb2YgdGhlIHNvdXJjZSBlbnRpdHkuIHJlZmVyZW5jZWRDb2x1bW5OYW1lLCB0aGUgc2FtZSBuYW1lIG9mIAotICAgICAgICAgICAqIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSBvZiB0aGUgc291cmNlIGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHByaW1hcnlLZXlKb2luQ29sdW1ucygpIGRlZmF1bHQge307IAotIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVW5pcXVlIGNvbnN0cmFpbnRzIHRoYXQgYXJlIHRvIGJlIHBsYWNlZCBvbiB0aGUgdGFibGUuIAotICAgICAgICAgICAqIFRoZXNlIGFyZSBvbmx5IHVzZWQgaWYgdGFibGUgZ2VuZXJhdGlvbiBpcyBpbiBlZmZlY3QuCi0gICAgICAgICAgICovCi0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsgCi0gICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7Ci0gICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KLSAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgc2NhbGUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVyc2lvbi12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVyc2lvblZhbHVlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGRhdGFiYXNlIHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkYXRhVmFsdWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgb2JqZWN0IHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBvYmplY3RWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQKLSAgICAgICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIgaW50ZXJmYWNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGNvbnZlcnRlckNsYXNzKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IG9uIGFuIEVudGl0eS4KLSAgICAgICAgICogSXQgaXMgcmVxdWlyZWQgdGhhdCBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICogYXMgdGhlIGFyZ3VtZW50LgotICAgICAgICAgKiAKLSAgICAgICAgICogQSBDb3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIG9yIAotICAgICAgICAgKiBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRm9yIGluc3RhbmNlOgotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDb3B5UG9saWN5KCJleGFtcGxlLk15Q29weVBvbGljeSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb3B5UG9saWN5IHsKLQotICAgICAgICAvKgotICAgICAgICAqIChSZXF1aXJlZCkKLSAgICAgICAgKiBUaGlzIGRlZmluZXMgdGhlIGNsYXNzIG9mIHRoZSBjb3B5IHBvbGljeS4gSXQgbXVzdCBzcGVjaWZ5IGEgY2xhc3MgCi0gICAgICAgICogdGhhdCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeQotICAgICAgICAqLwotICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiRFRZUEUiOwotICAgICAgICAgIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKCkgZGVmYXVsdCBTVFJJTkc7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDMxOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBEaXNjcmltaW5hdG9yQ2xhc3MgaXMgdXNlZCB3aXRoaW4gYSBWYXJpYWJsZU9uZVRvT25lIGFubm90YXRpb24uCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7fSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNsYXNzIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBkaXNjcmltaW5hdG9yIHRvIGJlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIAotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjbGFzcyB0byB0aGUgaW5zdGFudGlhdGVkIHdpdGggdGhlIGdpdmVuIAotICAgICAgICAgICAqIGRpc2NyaW1pbmF0b3IuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRGlzY3JpbWluYXRvclR5cGUgeyBTVFJJTkcsIENIQVIsIElOVEVHRVIgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5URUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JWYWx1ZSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbGVtZW50LWNvbGxlY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbGVtZW50Q29sbGVjdGlvbiB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9iIiB0eXBlPSJvcm06bG9iIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjIiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmNvbGxlY3Rpb24tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBlbWJlZGRhYmxlIG9iamVjdHMuIElzCi0gICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZAotICAgICAgICBpbiB0aGUgY2xhc3MuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkYWJsZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyBhbiBlbnRpdHkgbGlzdGVuZXIgdG8gYmUgaW52b2tlZCBhdCBsaWZlY3ljbGUgZXZlbnRzCi0gICAgICAgIGZvciB0aGUgZW50aXRpZXMgdGhhdCBsaXN0IHRoaXMgbGlzdGVuZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5TGlzdGVuZXJzIHsKLSAgICAgICAgICBDbGFzc1tdIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVyIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eVJlc3VsdCB7Ci0gICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MoKTsKLSAgICAgICAgICBGaWVsZFJlc3VsdFtdIGZpZWxkcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkLXJlc3VsdCIgdHlwZT0ib3JtOmZpZWxkLXJlc3VsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImVudGl0eS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRW51bVR5cGUgewotICAgICAgICAgIE9SRElOQUwsCi0gICAgICAgICAgU1RSSU5HCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9SRElOQUwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bWVyYXRlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudW1lcmF0ZWQgewotICAgICAgICAgIEVudW1UeXBlIHZhbHVlKCkgZGVmYXVsdCBPUkRJTkFMOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTplbnVtLXR5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBGZXRjaFR5cGUgeyBMQVpZLCBFQUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEFaWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZpZWxkUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBHZW5lcmF0ZWRWYWx1ZSB7Ci0gICAgICAgICAgR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IEFVVE87Ci0gICAgICAgICAgU3RyaW5nIGdlbmVyYXRvcigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06Z2VuZXJhdGlvbi10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJhdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZ2VuZXJhdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gR2VuZXJhdGlvblR5cGUgeyBUQUJMRSwgU0VRVUVOQ0UsIElERU5USVRZLCBBVVRPIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VRVUVOQ0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklERU5USVRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZC1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkQ2xhc3MgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iaWQtdmFsaWRhdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIElkVmFsaWRhdGlvbiBlbnVtIGRldGVybWluZXMgdGhlIHR5cGUgdmFsdWUgdGhhdCBhcmUgdmFsaWQgZm9yIGFuIElkLgotICAgICAgICAgKiBCeSBkZWZhdWx0IG51bGwgaXMgbm90IGFsbG93ZWQsIGFuZCAwIGlzIG5vdCBhbGxvdyBmb3Igc2luZ2xldG9uIGlkcyBvZiBsb25nIG9yIGludCB0eXBlLgotICAgICAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBaRVJPIGZvciBzaW5nbGV0b24gaWRzLCBhbmQgTlVMTCBmb3IgY29tcG9zaXRlIGlkcy4KLSAgICAgICAgICogVGhpcyBjYW4gYmUgc2V0IHVzaW5nIHRoZSBAUHJpbWFyeUtleSBhbm5vdGF0aW9uLCBvciBDbGFzc0Rlc2NyaXB0b3IgQVBJLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBQcmltYXJ5S2V5Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuQ2xhc3NEZXNjcmlwdG9yI3NldElkVmFsaWRhdGlvbihJZFZhbGlkYXRpb24pCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMS4wIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIElkVmFsaWRhdGlvbiB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIE9ubHkgbnVsbCBpcyBub3QgYWxsb3dlZCBhcyBhbiBpZCB2YWx1ZSwgMCBpcyBhbGxvd2VkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBOVUxMLAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIG51bGwgYW5kIDAgYXJlIG5vdCBhbGxvd2VkLCAob25seSBpbnQgYW5kIGxvbmcpLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBaRVJPLAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIE5vIGlkIHZhbGlkYXRpb24gaXMgZG9uZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTk9ORQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5VTEwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpFUk8iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmhlcml0YW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEluaGVyaXRhbmNlIHsKLSAgICAgICAgICBJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IFNJTkdMRV9UQUJMRTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTppbmhlcml0YW5jZS10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iaW5oZXJpdGFuY2UtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEluaGVyaXRhbmNlVHlwZSB7IFNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1MgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJTkdMRV9UQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk9JTkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRV9QRVJfQ0xBU1MiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5JbnN0YW50aWF0aW9uQ29weVBvbGljeSAKLSAgICAgICAgICogb24gYW4gRW50aXR5LiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB0aGUgZGVmYXVsdCBDb3B5UG9saWN5IGluIAotICAgICAgICAgKiBFY2xpcHNlTGluayBhbmQgdGhlcmVmb3JlIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgb25seSB1c2VkIHRvIAotICAgICAgICAgKiBvdmVycmlkZSBvdGhlciB0eXBlcyBvZiBjb3B5IHBvbGljaWVzCi0gICAgICAgICAqIAotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQEluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgewotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSm9pbkZldGNoVHlwZSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBpbm5lciBqb2luIGlzIHVzZWQgdG8gZmV0Y2ggdGhlIHJlbGF0ZWQgb2JqZWN0LgotICAgICAgICAgKiBUaGlzIGRvZXMgbm90IGFsbG93IGZvciBudWxsL2VtcHR5IHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIElOTkVSLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBpbm5lciBqb2luIGlzIHVzZWQgdG8gZmV0Y2ggdGhlIHJlbGF0ZWQgb2JqZWN0LgotICAgICAgICAgKiBUaGlzIGFsbG93cyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBPVVRFUiwKLSAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOTkVSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9iIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTG9iIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2NrLW1vZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICBwdWJsaWMgZW51bSBMb2NrTW9kZVR5cGUgeyBSRUFELCBXUklURSwgT1BUSU1JU1RJQywKLSAgICAgICAgT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQsIFBFU1NJTUlTVElDX1JFQUQsIFBFU1NJTUlTVElDX1dSSVRFLAotICAgICAgICBQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQsIE5PTkV9OwotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldSSVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJTUlTVElDIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hbnlUb01hbnkgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcy1pZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleUNsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5LWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleUNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcwotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZQotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQKLSAgICAgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgYmUgcmVjdXJzaXZlbHkKLSAgICAgICAgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwcGVkU3VwZXJjbGFzc3t9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLWludGVyY2VwdG9yIiB0eXBlPSJvcm06Y2FjaGUtaW50ZXJjZXB0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FjaGVhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGlzdGVuY2UtY2hlY2tpbmciIHR5cGU9Im9ybTpleGlzdGVuY2UtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOyAvL25hbWVkIFNxbFJlc3VsdFNldE1hcHBpbmcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFF1ZXJ5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBxdWVyeSgpOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NrLW1vZGUiIHR5cGU9Im9ybTpsb2NrLW1vZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIGFsbG93cyB0aGUgZGVmaW5pdGlvbiBvZiAKLSAgICAgICAgICogcXVlcmllcyB0aGF0IGNhbGwgc3RvcmVkIHByb2NlZHVyZXMgYXMgbmFtZWQgcXVlcmllcy4KLSAgICAgICAgICogQSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5IG9yCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVW5pcXVlIG5hbWUgdGhhdCByZWZlcmVuY2VzIHRoaXMgc3RvcmVkIHByb2NlZHVyZSBxdWVyeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBRdWVyeSBoaW50cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFJlZmVycyB0byB0aGUgY2xhc3Mgb2YgdGhlIHJlc3VsdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIFNRTFJlc3VsdE1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgcHJvY2VkdXJlTmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBXaGV0aGVyIHRoZSBxdWVyeSBzaG91bGQgcmV0dXJuIGEgcmVzdWx0IHNldC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIHJldHVybnNSZXN1bHRTZXQoKSBkZWZhdWx0IHRydWU7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGFyZ3VtZW50cyB0byB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlciIgdHlwZT0ib3JtOnN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmV0dXJucy1yZXN1bHQtc2V0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPYmplY3RUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbmNlCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgZGF0YVR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBlbnRpdHkuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVudCAKLSAgICAgICAgICAgKiBmaWVsZCBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBvYmplY3RUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBjb252ZXJzaW9uIHZhbHVlcyB0byBiZSB1c2VkIAotICAgICAgICAgICAqIHdpdGggdGhlIG9iamVjdCBjb252ZXJ0ZXIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVyc2lvblZhbHVlW10gY29udmVyc2lvblZhbHVlcygpOwotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgYSBkZWZhdWx0IG9iamVjdCB2YWx1ZS4gVXNlZCBmb3IgCi0gICAgICAgICAgICAqIGxlZ2FjeSBkYXRhIGlmIHRoZSBkYXRhIHZhbHVlIGlzIG1pc3NpbmcuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICBTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVyc2lvbi12YWx1ZSIgdHlwZT0ib3JtOmNvbnZlcnNpb24tdmFsdWUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LW9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgIDwveHNkOmNob2ljZT4KLSAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgPC94c2Q6Y2hvaWNlPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgIDwveHNkOnNlcXVlbmNlPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIG9ycGhhblJlbW92YWwoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9ycGhhbi1yZW1vdmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHMtaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIG9wdGltaXN0aWMgbG9ja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgCi0gICAgICAgICAqIGVudGl0aWVzLiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgICAgICogYW4gZW50aXR5IG9yIG1hcHBlZC1zdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSXQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpbWlzdGljLWxvY2tpbmctdHlwZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcHRpbWlzdGljTG9ja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHRvIHVzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSgpIGRlZmF1bHQgVkVSU0lPTl9DT0xVTU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IG9mIHR5cGUgCi0gICAgICAgICAgICogU0VMRUNURURfQ09MVU1OUywgdGhpcyBhbm5vdGF0aW9uIG1lbWJlciBiZWNvbWVzIGEgKFJlcXVpcmVkKSAKLSAgICAgICAgICAgKiBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBzZWxlY3RlZENvbHVtbnMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHdoZXJlIHRoZSBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHNob3VsZCAKLSAgICAgICAgICAgKiBjYXNjYWRlIGxvY2suIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB3aXRoIFZFUlNJT05fQ09MVU1OIGxvY2tpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYXNjYWRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWxlY3RlZC1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FzY2FkZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBzaW1wbGUgdHlwZSB0aGF0IGlzIHVzZWQgd2l0aGluIGFuIG9wdGltaXN0aWMtbG9ja2luZyAKLSAgICAgICAgICogc3BlY2lmaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG9wdGltaXN0aWMtbG9ja2luZyB0aGF0Ci0gICAgICAgICAqIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyBlbnRpdGllcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIE9wdGltaXN0aWNMb2NraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGV2ZXJ5IGZpZWxkIGluIHRoZSB0YWJsZQotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZAotICAgICAgICAgICAqIGhhcyBiZWVuIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQUxMX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgb25seSB0aGUgY2hhbmdlZCBmaWVsZHMKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBIGRlbGV0ZQotICAgICAgICAgICAqIHdpbGwgb25seSBjb21wYXJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEFOR0VEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBjb21wYXJlcyBzZWxlY3RlZCBmaWVsZHMgaW4gdGhlIFdIRVJFCi0gICAgICAgICAgICogY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBOb3RlIHRoYXQKLSAgICAgICAgICAgKiB0aGUgZmllbGRzIHNwZWNpZmllZCBtdXN0IGJlIG1hcHBlZCBhbmQgbm90IGJlIHByaW1hcnkga2V5cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRUxFQ1RFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGEgc2luZ2xlIHZlcnNpb24gbnVtYmVyCi0gICAgICAgICAgICogaW4gdGhlIHdoZXJlIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZQotICAgICAgICAgICAqIG1hcHBlZCBhbmQgbm90IGJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBWRVJTSU9OX0NPTFVNTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTEVDVEVEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ09MVU1OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+ICAKLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3JkZXItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvcnJlY3Rpb24tdHlwZSIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbi1jb3JyZWN0aW9uLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1jb2x1bW4tY29ycmVjdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gT3JkZXJDb3JyZWN0aW9uVHlwZSB7Ci0gICAgICAgICAgUkVBRCwKLSAgICAgICAgICBSRUFEX1dSSVRFLAotICAgICAgICAgIEVYQ0VQVElPTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRUFEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRUFEX1dSSVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFWENFUFRJT04iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXJlbW92ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogIFRoZSBQcmltYXJ5S2V5IGFubm90YXRpb24gYWxsb3dzIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb2YgdGhlIElkLgotICAgICAgICAgKiAgQSB2YWxpZGF0aW9uIHBvbGljeSBjYW4gYmUgZ2l2ZW4gdGhhdCBhbGxvd3Mgc3BlY2lmeWluZyBpZiB6ZXJvIGlzIGEgdmFsaWQgaWQgdmFsdWUuCi0gICAgICAgICAqICBUaGUgc2V0IG9mIHByaW1hcnkga2V5IGNvbHVtbnMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIHByZWNpc2VseS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMS4xCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIENvbmZpZ3VyZXMgd2hhdCBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICogQnkgZGVmYXVsdCAwIGlzIG5vdCBhIHZhbGlkIGlkIHZhbHVlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIGFsbG93IDAgaWQgdmFsdWVzLgotICAgICAgICAgICAqLwotICAgICAgICAgIElkVmFsaWRhdGlvbiB2YWxpZGF0aW9uKCkgZGVmYXVsdCBJZFZhbGlkYXRpb24uWkVSTzsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBkaXJlY3RseS4KLSAgICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQElkIGlmIHRoZSBwcmltYXJ5IGtleSBpbmNsdWRlcyBhIG5vbiBiYXNpYyBmaWVsZCwKLSAgICAgICAgICAgKiBzdWNoIGFzIGEgZm9yZWlnbiBrZXksIG9yIGEgaW5oZXJpdGFuY2UgZGlzY3JpbWluYXRvciwgZW1iZWRkZWQsIG9yIHRyYW5zZm9ybWF0aW9uIG1hcHBlZCBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGlvbiIgdHlwZT0ib3JtOmlkLXZhbGlkYXRpb24iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQSB1c2VyIGRlZmluZWQgbWFwcGluZydzIHByb3BlcnR5LgotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcm9wZXJ0eSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUHJvcGVydHkgbmFtZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBQcm9wZXJ0eSB2YWx1ZSwKLSAgICAgICAgICAgKiBjb252ZXJ0ZWQgdG8gYW4gaW5zdGFuY2Ugb2YgdmFsdWVUeXBlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IHZhbHVlIHR5cGUuCi0gICAgICAgICAgICogVGhlIHZhbHVlIGNvbnZlcnRlZCB0byB2YWx1ZVR5cGUgYnkgQ29udmVyc2lvbk1hbmFnZXIuCi0gICAgICAgICAgICogSWYgc3BlY2lmaWVkIG11c3QgYmUgYSBzaW1wbGUgdHlwZSB0aGF0IGNvdWxkIGJlIGhhbmRsZWQgYnkgCi0gICAgICAgICAgICogQ29udmVyc2lvbk1hbmFnZXI6IAotICAgICAgICAgICAqIG51bWVyaWNhbCwgYm9vbGVhbiwgdGVtcG9yYWwuICAKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2xhc3MgdmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktaGludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUXVlcnlIaW50IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktcmVkaXJlY3RvcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLXB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5UmVkaXJlY3RvcnMgewotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgQWxsUXVlcmllcyBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nIG9iamVjdCBxdWVyeQotICAgICAqIHRoYXQgZG9lcyBub3QgaGF2ZSBhIG1vcmUgcHJlY2lzZSByZWRpcmVjdG9yIChsaWtlIHRoZSAKLSAgICAgKiBSZWFkT2JqZWN0UXVlcnkgUmVkaXJlY3Rvcikgb3IgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogCi0gICAgICovCi0gICAgQ2xhc3MgYWxsUXVlcmllcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgUmVhZEFsbCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogUmVhZEFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKiBGb3IgdXNlcnMgZXhlY3V0aW5nIGEgSlBBIFF1ZXJ5IHRocm91Z2ggdGhlIGdldFJlc3VsdExpc3QoKSBBUEkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAqLwotICAgIENsYXNzIHJlYWRBbGwoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlYWRPYmplY3QgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIFJlYWRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aHJvdWdoIHRoZSBnZXRTaW5nbGVSZXN1bHQoKSBBUEkgb3IgRW50aXR5TWFuYWdlci5maW5kKCkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAqLwotICAgIENsYXNzIHJlYWRPYmplY3QoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlcG9ydFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBSZXBvcnRRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aGF0IGNvbnRhaW5zIGFncmVnYXRlIGZ1bmN0aW9ucyBvciBzZWxlY3RzIG11bHRpcGxlIGVudGl0aWVzIHRoaXMgaXMgdGhlIHJlZGlyZWN0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQKLSAgICAgKi8KLSAgICBDbGFzcyByZXBvcnQoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFVwZGF0ZSBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogVXBkYXRlT2JqZWN0UXVlcnkgb3IgVXBkYXRlQWxsUXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIEluIEVjbGlwc2VMaW5rIGFuIFVwZGF0ZU9iamVjdFF1ZXJ5IGlzIGV4ZWN1dGVkIHdoZW5ldmVyIGZsdXNoaW5nIGNoYW5nZXMgdG8gdGhlIGRhdGFzb3VyY2UuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICovIAotICAgIENsYXNzIHVwZGF0ZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgSW5zZXJ0IFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBJbnNlcnRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogSW4gRWNsaXBzZUxpbmsgYW4gSW5zZXJ0T2JqZWN0UXVlcnkgaXMgZXhlY3V0ZWQgd2hlbiBwZXJzaXN0aW5nIGFuIG9iamVjdCB0byB0aGUgZGF0YXNvdXJjZS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKi8KLSAgICBDbGFzcyBpbnNlcnQoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IERlbGV0ZSBPYmplY3QgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIERlbGV0ZU9iamVjdFF1ZXJ5IG9yIERlbGV0ZUFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKi8KLSAgICBDbGFzcyBkZWxldGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLX0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGwtcXVlcmllcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtYWxsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vYmplY3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXBvcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkZWxldGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgCi0gICAgICAgICAqIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgCi0gICAgICAgICAqIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSZWFkVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuQXR0cmlidXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIAotICAgICAgICAgICAgICogYnVpbGRBdHRyaWJ1dGVWYWx1ZSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSAKLSAgICAgICAgICAgICAqIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSAobm90IGFzc2lnbnMgdGhlIHZhbHVlIHRvIAotICAgICAgICAgICAgICogdGhlIGF0dHJpYnV0ZSkuIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIAotICAgICAgICAgICAgICogc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcGtKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAxOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNxbFJlc3VsdFNldE1hcHBpbmcgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgRW50aXR5UmVzdWx0W10gZW50aXRpZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENvbHVtblJlc3VsdFtdIGNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktcmVzdWx0IiB0eXBlPSJvcm06ZW50aXR5LXJlc3VsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1yZXN1bHQiIHR5cGU9Im9ybTpjb2x1bW4tcmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbiBpcyB1c2VkIHdpdGhpbiBhIAotICAgICAgICAgKiBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBkZWZhdWx0IElOOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIHF1ZXJ5IHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlcigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBKYXZhIGNsYXNzIGRlc2lyZWQgYmFjayBmcm9tIHRoZSBwcm9jZWR1cmUsIAotICAgICAgICAgICAqIHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB0eXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIGNvZGUsIHRoaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIAotICAgICAgICAgICAqIGZyb20gdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBpbnQgamRiY1R5cGUoKSBkZWZhdWx0IC0xOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIG5hbWUsIHRoaXMgbWF5IGJlIHJlcXVpcmVkIGZvciBBUlJBWSBvciAKLSAgICAgICAgICAgKiBTVFJVQ1QgdHlwZXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGpkYmNUeXBlTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ib3JtOmRpcmVjdGlvbi10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InF1ZXJ5LXBhcmFtZXRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iamRiYy10eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0cnVjdENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCAKLSAgICAgICAgICAgKiBpbXBsZW1lbnQgdGhlIEVjbGlwc2VMaW5rIGludGVyZmFjZSAKLSAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBjb252ZXJ0ZXIoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRlbXBvcmFsIHsKLSAgICAgICAgICBUZW1wb3JhbFR5cGUgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06dGVtcG9yYWwtdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIFRlbXBvcmFsVHlwZSB7Ci0gICAgICAgICAgREFURSwgLy8gamF2YS5zcWwuRGF0ZQotICAgICAgICAgIFRJTUUsIC8vIGphdmEuc3FsLlRpbWUKLSAgICAgICAgICBUSU1FU1RBTVAgLy8gamF2YS5zcWwuVGltZXN0YW1wCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZS1vZi1kYXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRpbWVPZkRheSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBIb3VyIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBob3VyKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaW51dGUgb2YgdGhlIGRheS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IG1pbnV0ZSgpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU2Vjb25kIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbGxpc2Vjb25kIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaWxsaXNlY29uZCgpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEludGVybmFsIHVzZS4gRG8gbm90IG1vZGlmeS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBzcGVjaWZpZWQoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImhvdXIiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWludXRlIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaWxsaXNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogVHJhbnNmb3JtYXRpb24gaXMgYW4gb3B0aW9uYWwgYW5ub3RhdGlvbiBmb3IgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLSAgICAgICAgICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGFsbG93cyB0byBtYXAgYW4gYXR0cmlidXRlIHRvIG9uZSBvciBtb3JlIAotICAgICAgICAgKiBkYXRhYmFzZSBjb2x1bW5zLgotICAgICAgICAgKiAKLSAgICAgICAgICogVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbiBpcyBhbiBvcHRpb25hbCBwYXJ0IG9mIAotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgZGVmaW5pdGlvbi4gVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgCi0gICAgICAgICAqIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIAotICAgICAgICAgKiB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLSAgICAgICAgICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKLSAgICAgICAgICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0gICAgICAgICAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyKS4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNmb3JtYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0gICAgICAgICAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKLSAgICAgICAgICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotICAgICAgICAgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgb3B0aW9uYWwgZWxlbWVudCBpcyBhIGhpbnQgYXMgdG8gd2hldGhlciB0aGUgdmFsdWUKLSAgICAgICAgICAgICAqICBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgbWF5IGJlIG51bGwuIEl0IGlzIGRpc3JlZ2FyZGVkCi0gICAgICAgICAgICAgKiAgZm9yIHByaW1pdGl2ZSB0eXBlcywgd2hpY2ggYXJlIGNvbnNpZGVyZWQgbm9uLW9wdGlvbmFsLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTpyZWFkLXRyYW5zZm9ybWVyIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTp3cml0ZS10cmFuc2Zvcm1lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2llbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2llbnQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKiAKLSAgICAgICAgICogVmFyaWFibGUgb25lIHRvIG9uZSBtYXBwaW5ncyBhcmUgdXNlZCB0byByZXByZXNlbnQgYSBwb2ludGVyIAotICAgICAgICAgKiByZWZlcmVuY2VzIGJldHdlZW4gYSBqYXZhIG9iamVjdCBhbmQgYW4gaW1wbGVtZW50ZXIgb2YgYW4gaW50ZXJmYWNlLiAKLSAgICAgICAgICogVGhpcyBtYXBwaW5nIGlzIHVzdWFsbHkgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgcG9pbnRlciAoc3RvcmVkIGluIGFuIAotICAgICAgICAgKiBpbnN0YW5jZSB2YXJpYWJsZSkgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgb2JqZWN0cy4gSW4gdGhlIAotICAgICAgICAgKiByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlcywgdGhlc2UgbWFwcGluZ3MgYXJlIG5vcm1hbGx5IGltcGxlbWVudGVkIAotICAgICAgICAgKiB1c2luZyBhIGZvcmVpZ24ga2V5IGFuZCBhIHR5cGUgY29kZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEEgVmFyaWFibGVPbmVUb09uZSBjYW4gYmUgc3BlY2lmaWVkIHdpdGhpbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIGFuZCBFbWJlZGRhYmxlIGNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmFyaWFibGVPbmVUb09uZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgaW50ZXJmYWNlIGNsYXNzIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgCi0gICAgICAgICAgICogYXNzb2NpYXRpb24uIElmIG5vdCBzcGVjaWZpZWQgaXQgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIAotICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgYmVpbmcgcmVmZXJlbmNlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB0YXJnZXRJbnRlcmZhY2UoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcGVyYXRpb25zIHRoYXQgbXVzdCBiZSBjYXNjYWRlZCB0byB0aGUgdGFyZ2V0IG9mIAotICAgICAgICAgICAqIHRoZSBhc3NvY2lhdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0gICAgICAgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0gICAgICAgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgYXNzb2NpYXRpb24gaXMgb3B0aW9uYWwuIElmIHNldCB0byBmYWxzZSAKLSAgICAgICAgICAgKiB0aGVuIGEgbm9uLW51bGwgcmVsYXRpb25zaGlwIG11c3QgYWx3YXlzIGV4aXN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aWxsIGhvbGQgdGhlIHR5cGUgCi0gICAgICAgICAgICogaW5kaWNhdG9ycy4gSWYgdGhlIERpc2NyaW1pbmF0b3JDb2x1bW4gaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgCi0gICAgICAgICAgICogb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIGRlZmF1bHRzIHRvICJEVFlQRSIgYW5kIHRoZSAKLSAgICAgICAgICAgKiBkaXNjcmltaW5hdG9yIHR5cGUgdG8gU1RSSU5HLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgQERpc2NyaW1pbmF0b3JDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBsaXN0IG9mIGRpc2NyaW1pbmF0b3IgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIAotICAgICAgICAgICAqIHRoaXMgVmFyaWFibGVPbmVUb09uZS4gSWYgbm9uZSBhcmUgc3BlY2lmaWVkIHRoZW4gdGhvc2UgZW50aXRpZXMgCi0gICAgICAgICAgICogd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHRoYXQgaW1wbGVtZW50IHRoZSB0YXJnZXQgaW50ZXJmYWNlIAotICAgICAgICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdHlwZXMuIFRoZSBkaXNjcmltaW5hdG9yIHR5cGUgd2lsbCAKLSAgICAgICAgICAgKiBkZWZhdWx0IGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIFNUUklORzogRW50aXR5Lm5hbWUoKQotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBDSEFSOiBGaXJzdCBsZXR0ZXIgb2YgdGhlIAotICAgICAgICAgICAqICAgIEVudGl0eSBjbGFzcwotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBJTlRFR0VSOiBUaGUgbmV4dCBpbnRlZ2VyIGFmdGVyIAotICAgICAgICAgICAqICAgIHRoZSBoaWdoZXN0IGludGVnZXIgZXhwbGljaXRseSBhZGRlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXNjcmltaW5hdG9yQ2xhc3NbXSBkaXNjcmltaW5hdG9yQ2xhc3NlcygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY2xhc3MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1pbnRlcmZhY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9ycGhhbi1yZW1vdmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2ZXJzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmVyc2lvbiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3cml0ZS10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0gICAgICAgICAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyKS4KLSAgICAgICAgICogIAotICAgICAgICAgKiBBIHNpbmdsZSBXcml0ZVRyYW5zZm9ybWVyIG1heSBiZSBzcGVjaWZpZWQgZGlyZWN0bHkgb24gdGhlIG1ldGhvZCBvciAKLSAgICAgICAgICogYXR0cmlidXRlLiBNdWx0aXBsZSBXcml0ZVRyYW5zZm9ybWVycyBzaG91bGQgYmUgd3JhcHBlZCBpbnRvIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uLiBObyBXcml0ZVRyYW5zZm9ybWVycyBzcGVjaWZpZWQgZm9yIAotICAgICAgICAgKiByZWFkLW9ubHkgbWFwcGluZy4gVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgd3JpdGUtb25seSwgaXQgCi0gICAgICAgICAqIHNob3VsZCBoYXZlIGEgUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIAotICAgICAgICAgKiBjb2x1bW4ocykgdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBXcml0ZVRyYW5zZm9ybWVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAotICAgICAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkZpZWxkVHJhbnNmb3JtZXIgCi0gICAgICAgICAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIGJ1aWxkRmllbGRWYWx1ZSAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgZGF0YWJhc2UgCi0gICAgICAgICAgICAgKiBjb2x1bW4uIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSAKLSAgICAgICAgICAgICAqIHN1cHBvcnRlZCB0aGUgbWV0aG9kIGJ1aWxkRmllbGRWYWx1ZSBpbiB0aGUgY2xhc3Mgc2hvdWxkIGJlIAotICAgICAgICAgICAgICogZGVmaW5lZCB0byByZXR1cm4gdGhlIHJlbGV2YW50IEphdmEgdHlwZSwgbm90IGp1c3QgT2JqZWN0IGFzIAotICAgICAgICAgICAgICogZGVmaW5lZCBpbiB0aGUgaW50ZXJmYWNlLCBmb3IgaW5zdGFuY2U6Ci0gICAgICAgICAgICAgKiBwdWJsaWMgVGltZSBidWlsZEZpZWxkVmFsdWUoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgZmllbGROYW1lLCBTZXNzaW9uIHNlc3Npb24pLgotICAgICAgICAgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBtYXBwZWQgY2xhc3MgbXVzdCBoYXZlIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIHdoaWNoIHJldHVybnMgCi0gICAgICAgICAgICAgKiBhIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgZGF0YWJhc2UgY29sdW1uLgotICAgICAgICAgICAgICogTm90ZSB0aGF0IGZvciBkZGwgZ2VuZXJhdGlvbiBhbmQgcmV0dXJuaW5nIHRvIGJlIHN1cHBvcnRlZCB0aGUgCi0gICAgICAgICAgICAgKiBtZXRob2Qgc2hvdWxkIGJlIGRlZmluZWQgdG8gcmV0dXJuIGEgcGFydGljdWxhciB0eXBlLCBub3QganVzdCAKLSAgICAgICAgICAgICAqIE9iamVjdCwgZm9yIGluc3RhbmNlOgotICAgICAgICAgICAgICogcHVibGljIFRpbWUgZ2V0U3RhcnRUaW1lKCkuCi0gICAgICAgICAgICAgKiBUaGUgbWV0aG9kIG1heSByZXF1aXJlIGEgVHJhbnNpZW50IGFubm90YXRpb24gdG8gYXZvaWQgYmVpbmcgCi0gICAgICAgICAgICAgKiBtYXBwZWQgYXMgQmFzaWMgYnkgZGVmYXVsdC4KLSAgICAgICAgICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCgpIGRlZmF1bHQgIiI7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogU3BlY2lmeSBoZXJlIHRoZSBjb2x1bW4gaW50byB3aGljaCB0aGUgdmFsdWUgc2hvdWxkIGJlIHdyaXR0ZW4uCi0gICAgICAgICAgICAgKiBUaGUgb25seSBjYXNlIHdoZW4gdGhpcyBjb3VsZCBiZSBza2lwcGVkIGlzIGlmIGEgc2luZ2xlIAotICAgICAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBhbm5vdGF0ZXMgYW4gYXR0cmlidXRlIC0gdGhlIGF0dHJpYnV0ZSdzIG5hbWUgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgYXMgYSBjb2x1bW4gbmFtZS4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENvbHVtbiBjb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzEueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMl8xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzY2U1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPCEtLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPiAKLTwhLS0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4gCi08IS0tIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gZnJvbSBPcmFjbGUgVG9wTGluayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgdHdhcmUgLSB1cGRhdGUgdmVyc2lvbiBudW1iZXIgdG8gMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIDEyLzIvMjAwOS0yLjEgR3V5IFBlbGxldGllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICAgICAtIDI5NjI4OTogQWRkIGN1cnJlbnQgYW5ub3RhdGlvbiBtZXRhZGF0YSBzdXBwb3J0IG9uIG1hcHBlZCBzdXBlcmNsYXNzZXMgdG8gRWNsaXBzZUxpbmstT1JNLlhNTCBTY2hlbWEgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgLSAyOTY2MTI6IEFkZCBjdXJyZW50IGFubm90YXRpb24gb25seSBtZXRhZGF0YSBzdXBwb3J0IG9mIHJldHVybiBpbnNlcnQvdXBkYXRlIHRvIHRoZSBFY2xpcHNlTGluay1PUk0uWE1MIFNjaGVtYSAgICAtLT4KLTwhLS0gICAgICAgIC0gZm9ybWF0dGVkIHRvIG1hdGNoIG9ybV8yXzAueHNkIHNvIHRoYXQgdXNlcnMgY2FuIGVhc2lseSBjb21wYXJlIHRoZSB0d28gc2NoZW1hcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICA1LzQvMjAxMC0yLjEgR3V5IFBlbGxldGllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgLSAyMjcyMTk6IEV4cGFuZCBFY2xpcHNlTGluay1PUk0uWE1MIHNjaGVtYSBmdW5jdGlvbmFsaXR5IGZvciAyLjEgcmVsZWFzZSAgKHVwZGF0ZSB2ZXJzaW9uIHRvIDIuMSkgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTwhLS0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgb2JqZWN0LXJlbGF0aW9uYWwgbWFwcGluZyBmaWxlIHNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIgCi0gIHhtbG5zOm9ybT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIgCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgCi0gIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgCi0gIHZlcnNpb249IjIuMSI+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyllY2xpcHNlbGlua19vcm1fMl8xLnhzZCAyLjEgIEFwcmlsIDA1IDIwMTAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotICAKLSAgPHhzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmRvY3VtZW50YXRpb24+PCFbQ0RBVEFbCi0KLSAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgbmF0aXZlIEVjbGlwc2VsaW5rIFhNTCBtYXBwaW5nIGZpbGUKLSAgICAgICBUaGUgZmlsZSBtYXkgYmUgbmFtZWQgIk1FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWwiIGluIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgIGFyY2hpdmUgb3IgaXQgbWF5IGJlIG5hbWVkIHNvbWUgb3RoZXIgbmFtZSB3aGljaCB3b3VsZCBiZQotICAgICAgIHVzZWQgdG8gbG9jYXRlIHRoZSBmaWxlIGFzIHJlc291cmNlIG9uIHRoZSBjbGFzc3BhdGguCi0gICAgICAgT2JqZWN0L3JlbGF0aW9uYWwgbWFwcGluZyBmaWxlcyBtdXN0IGluZGljYXRlIHRoZSBvYmplY3QvcmVsYXRpb25hbAotICAgICAgIG1hcHBpbmcgZmlsZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHBlcnNpc3RlbmNlIG5hbWVzcGFjZToKLQotICAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0KLQotICAgICAgIGFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLSAgICAgICA8ZW50aXR5LW1hcHBpbmdzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIgotICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIAotICAgICAgIGVjbGlwc2VsaW5rX29ybV8yXzEueHNkCi0gICAgICAgdmVyc2lvbj0iMi4xIj4KLSAgICAgICAuLi4KLSAgICAgICA8L2VudGl0eS1tYXBwaW5ncz4KLQotICAgICBdXT48L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtcHR5VHlwZSIvPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idmVyc2lvblR5cGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV0rKFwuWzAtOV0rKSoiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY2Nlc3MtbWV0aG9kcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGUgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuaW52YWxpZGF0aW9uLkNhY2hlSW52YWxpZGF0aW9uUG9saWN5IAotICAgICAgICAgKiB3aGljaCBzZXRzIG9iamVjdHMgaW4gRWNsaXBzZUxpbmsncyBpZGVudGl0eSBtYXBzIHRvIGJlIGludmFsaWQgCi0gICAgICAgICAqIGZvbGxvd2luZyBnaXZlbiBydWxlcy4gQnkgZGVmYXVsdCBpbiBFY2xpcHNlTGluaywgb2JqZWN0cyBkbyBub3QgCi0gICAgICAgICAqIGV4cGlyZSBpbiB0aGUgY2FjaGUuIFNldmVyYWwgZGlmZmVyZW50IHBvbGljaWVzIGFyZSBhdmFpbGFibGUgdG8gCi0gICAgICAgICAqIGFsbG93IG9iamVjdHMgdG8gZXhwaXJlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZVR5cGUKLSAgICAgICAgICogCi0gICAgICAgICAqIEEgQ2FjaGUgYW5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvciBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICogSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ2FjaGUgYW5ub3RhdGlvbiBzaG91bGQgb25seSBiZSBkZWZpbmVkIAotICAgICAgICAgKiBvbiB0aGUgcm9vdCBvZiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2FjaGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZVR5cGUgdHlwZSgpIGRlZmF1bHQgU09GVF9XRUFLOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2l6ZSBvZiBjYWNoZSB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBzaXplKCkgZGVmYXVsdCAxMDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIENhY2hlZCBpbnN0YW5jZXMgaW4gdGhlIHNoYXJlZCBjYWNoZSBvciBhIGNsaWVudCAKLSAgICAgICAgICAgKiBpc29sYXRlZCBjYWNoZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBzaGFyZWQoKSBkZWZhdWx0IHRydWU7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYWZ0ZXIgYSBmaXggcGVyaW9kIG9mIHRpbWUgKG1zKS4gCi0gICAgICAgICAgICogUXVlcmllcyBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgCi0gICAgICAgICAgICogdG8gdGhlIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBleHBpcnkoKSBkZWZhdWx0IC0xOyAvLyBtaW51cyBvbmUgaXMgbm8gZXhwaXJ5LgotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGEgc3BlY2lmaWMgdGltZSBvZiBkYXkuIFF1ZXJpZXMgCi0gICAgICAgICAgICogZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoZSAKLSAgICAgICAgICAgKiBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5KCkgZGVmYXVsdCBAVGltZU9mRGF5KHNwZWNpZmllZD1mYWxzZSk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvcmNlIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlIHRvIGFsd2F5cyAKLSAgICAgICAgICAgKiByZWZyZXNoIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBhbHdheXNSZWZyZXNoKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlLCByZWZyZXNoIHRoZQotICAgICAgICAgICAqIGNhY2hlIG9ubHkgaWYgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYSBxdWVyeSBpcyAKLSAgICAgICAgICAgKiBuZXdlciB0aGFuIHRoZSBkYXRhIGluIHRoZSBjYWNoZSAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW1pc3RpYyAKLSAgICAgICAgICAgKiBsb2NraW5nIGZpZWxkKQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcigpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIGZvcmNlIGFsbCBxdWVyaWVzIHRvIGJ5cGFzcyB0aGUgCi0gICAgICAgICAgICogY2FjaGUgZm9yIGhpdHMgYnV0IHN0aWxsIHJlc29sdmUgYWdhaW5zdCB0aGUgY2FjaGUgZm9yIGlkZW50aXR5LiAKLSAgICAgICAgICAgKiBUaGlzIGZvcmNlcyBhbGwgcXVlcmllcyB0byBoaXQgdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIGRpc2FibGVIaXRzKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhY2hlIGNvb3JkaW5hdGlvbiBtb2RlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSgpIGRlZmF1bHQgU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5LXRpbWUtb2YtZGF5IiB0eXBlPSJvcm06dGltZS1vZi1kYXkiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOmNob2ljZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXJlZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2FjaGUtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsd2F5cy1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZnJlc2gtb25seS1pZi1uZXdlciIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlLWhpdHMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29vcmRpbmF0aW9uLXR5cGUiIHR5cGU9Im9ybTpjYWNoZS1jb29yZGluYXRpb24tdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+IAotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FjaGUtaW50ZXJjZXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDYWNoZUludGVyY2VwdG9yIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlVHlwZSBlbnVtIGlzIHVzZWQgd2l0aCB0aGUgQ2FjaGUgYW5ub3RhdGlvbiBmb3IgYSAKLSAgICAgICAgICogcGVyc2lzdGVudCBjbGFzcy4gSXQgZGVmaW5lcyB0aGUgdHlwZSBvZiBJZGVudGl0eU1hcC9DYWNoZSB1c2VkIGZvciAKLSAgICAgICAgICogdGhlIGNsYXNzLiBCeSBkZWZhdWx0IHRoZSBTT0ZUX1dFQUsgY2FjaGUgdHlwZSBpcyB1c2VkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LiBDYWNoZXMgYWxsIG9iamVjdHMKLSAgICAgICAgICAgKiBhbmQgZG9lcyBub3QgcmVtb3ZlIHRoZW0uIAotICAgICAgICAgICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIG1heSBiZSBtZW1vcnkgaW50ZW5zaXZlIHdoZW4gbWFueSBvYmplY3RzIGFyZSAKLSAgICAgICAgICAgKiByZWFkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZVTEwsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotICAgICAgICAgICAqIG9iamVjdHMgdXNpbmcgd2VhayByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0gICAgICAgICAgICogY29sbGVjdGlvbiBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFdFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotICAgICAgICAgICAqIG9iamVjdHMgdXNpbmcgc29mdCByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0gICAgICAgICAgICogY29sbGVjdGlvbiB3aGVuIG1lbW9yeSBpcyBsb3cgYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQKLSAgICAgICAgICAgKiBndWFyYW50ZWVkIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFNPRlQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBXRUFLIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCBpdCBtYWludGFpbnMgYQotICAgICAgICAgICAqIG1vc3QtZnJlcXVlbnRseS11c2VkIHN1Yi1jYWNoZS4gVGhlIHNpemUgb2YgdGhlIHN1Yi1jYWNoZSBpcwotICAgICAgICAgICAqIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgaWRlbnRpdHkgbWFwIGFzIHNwZWNpZmllZCBieQotICAgICAgICAgICAqIGRlc2NyaXB0b3IncyBzZXRJZGVudGl0eU1hcFNpemUoKSBtZXRob2QuIFRoZSBzdWItY2FjaGUKLSAgICAgICAgICAgKiB1c2VzIHNvZnQgcmVmZXJlbmNlcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBvYmplY3RzIGFyZQotICAgICAgICAgICAqIGdhcmJhZ2UtY29sbGVjdGVkIG9ubHkgaWYgdGhlIHN5c3RlbSBpcyBsb3cgb24gbWVtb3J5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFNPRlRfV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElkZW50aWNhbCB0byB0aGUgc29mdCBjYWNoZSB3ZWFrIChTT0ZUX1dFQUspIGlkZW50aXR5IG1hcCBleGNlcHQgCi0gICAgICAgICAgICogdGhhdCBpdCB1c2VzIGhhcmQgcmVmZXJlbmNlcyBpbiB0aGUgc3ViLWNhY2hlLiBVc2UgdGhpcyBpZGVudGl0eSAKLSAgICAgICAgICAgKiBtYXAgaWYgc29mdCByZWZlcmVuY2VzIGRvIG5vdCBiZWhhdmUgcHJvcGVybHkgb24geW91ciBwbGF0Zm9ybS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBIQVJEX1dFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBIGNhY2hlIGlkZW50aXR5IG1hcCBtYWludGFpbnMgYSBmaXhlZCBudW1iZXIgb2Ygb2JqZWN0cwotICAgICAgICAgICAqIHNwZWNpZmllZCBieSB0aGUgYXBwbGljYXRpb24uIE9iamVjdHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUKLSAgICAgICAgICAgKiBvbiBhIGxlYXN0LXJlY2VudGx5LXVzZWQgYmFzaXMuIFRoaXMgbWV0aG9kIGFsbG93cyBvYmplY3QKLSAgICAgICAgICAgKiBpZGVudGl0eSBmb3IgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBvYmplY3RzLgotICAgICAgICAgICAqIFdBUk5JTkc6IEZ1cm5pc2hlcyBjYWNoaW5nIGFuZCBpZGVudGl0eSwgYnV0IGRvZXMgbm90IGd1YXJhbnRlZSAKLSAgICAgICAgICAgKiBpZGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDQUNIRSwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdBUk5JTkc6IERvZXMgbm90IHByZXNlcnZlIG9iamVjdCBpZGVudGl0eSBhbmQgZG9lcyBub3QgY2FjaGUgCi0gICAgICAgICAgICogb2JqZWN0cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBOT05FCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZVTEwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlRfV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEFSRF9XRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUNIRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS1jb29yZGluYXRpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNlbmRzIGEgbGlzdCBvZiBjaGFuZ2VkIG9iamVjdHMgaW5jbHVkaW5nIGRhdGEgYWJvdXQgdGhlIGNoYW5nZXMuCi0gICAgICAgICAgICogVGhpcyBkYXRhIGlzIG1lcmdlZCBpbnRvIHRoZSByZWNlaXZpbmcgY2FjaGUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VORF9PQkpFQ1RfQ0hBTkdFUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNlbmRzIGEgbGlzdCBvZiB0aGUgaWRlbnRpdGllcyBvZiB0aGUgb2JqZWN0cyB0aGF0IGhhdmUgY2hhbmdlZC4gCi0gICAgICAgICAgICogVGhlIHJlY2VpdmluZyBjYWNoZSBpbnZhbGlkYXRlcyB0aGUgb2JqZWN0cyAocmF0aGVyIHRoYW4gY2hhbmdpbmcgCi0gICAgICAgICAgICogYW55IG9mIHRoZSBkYXRhKQotICAgICAgICAgICAqLwotICAgICAgICAgIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2FtZSBhcyBTRU5EX09CSkVDVF9DSEFOR0VTIGV4Y2VwdCBpdCBhbHNvIGluY2x1ZGVzIGFueSBuZXdseQotICAgICAgICAgICAqIGNyZWF0ZWQgb2JqZWN0cyBmcm9tIHRoZSB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIERvZXMgbm8gY2FjaGUgY29vcmRpbmF0aW9uLgotICAgICAgICAgICAqLwotICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9PQkpFQ1RfQ0hBTkdFUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jaGFuZ2V0cmFja2luZy5PYmplY3RDaGFuZ2VQb2xpY3kgCi0gICAgICAgICAqIHdoaWNoIGNvbXB1dGVzIGNoYW5nZXMgc2V0cyBmb3IgRWNsaXBzZUxpbmsncyBVbml0T2ZXb3JrIGNvbW1pdCAKLSAgICAgICAgICogcHJvY2Vzcy4gQW4gT2JqZWN0Q2hhbmdlUG9saWN5IGlzIHN0b3JlZCBvbiBhbiBFbnRpdHkncyBkZXNjcmlwdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBBIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gbWF5IGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2hhbmdlVHJhY2tpbmcgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2hhbmdlIHRyYWNraW5nIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKCkgZGVmYXVsdCBBVVRPOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nLXR5cGUiIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBDaGFuZ2VUcmFja2luZ1R5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFuIEFUVFJJQlVURSBjaGFuZ2UgdHJhY2tpbmcgdHlwZSBhbGxvd3MgY2hhbmdlIHRyYWNraW5nIGF0IHRoZQotICAgICAgICAgICAqIGF0dHJpYnV0ZSBsZXZlbCBvZiBhbiBvYmplY3QuIE9iamVjdHMgd2l0aCBjaGFuZ2VkIGF0dHJpYnV0ZXMgd2lsbAotICAgICAgICAgICAqIGJlIHByb2Nlc3NlZCBpbiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgCi0gICAgICAgICAgICogcmVzdWx0cyBvZiB0aGUgY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVRUUklCVVRFLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gT0JKRUNUIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgYWxsb3dzIGFuIG9iamVjdCB0byBjYWxjdWxhdGUgZm9yIAotICAgICAgICAgICAqIGl0c2VsZiB3aGV0aGVyIGl0IGhhcyBjaGFuZ2VkLiBDaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBwcm9jZXNzZWQgaW4gCi0gICAgICAgICAgICogdGhlIGNvbW1pdCBwcm9jZXNzIHRvIGluY2x1ZGUgYW55IGNoYW5nZXMgaW4gdGhlIHJlc3VsdHMgb2YgdGhlIAotICAgICAgICAgICAqIGNvbW1pdC4gVW5jaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIE9CSkVDVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEEgREVGRVJSRUQgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBkZWZlcnMgYWxsIGNoYW5nZSBkZXRlY3Rpb24gdG8KLSAgICAgICAgICAgKiB0aGUgVW5pdE9mV29yaydzIGNoYW5nZSBkZXRlY3Rpb24gcHJvY2Vzcy4gRXNzZW50aWFsbHksIHRoZSAKLSAgICAgICAgICAgKiBjYWxjdWxhdGVDaGFuZ2VzKCkgbWV0aG9kIHdpbGwgcnVuIGZvciBhbGwgb2JqZWN0cyBpbiBhIFVuaXRPZldvcmsuIAotICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgT2JqZWN0Q2hhbmdlUG9saWN5Ci0gICAgICAgICAgICovCi0gICAgICAgICAgREVGRVJSRUQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBXaWxsIG5vdCBzZXQgYW55IGNoYW5nZSB0cmFja2luZyBwb2xpY3kuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVVUTwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVFRSSUJVVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9CSkVDVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVGRVJSRUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjdXN0b21pemVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ3VzdG9taXplciBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAgICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvbmZpZy5EZXNjcmlwdG9yQ3VzdG9taXplciAKLSAgICAgICAgICogaW50ZXJmYWNlIGFuZCBpcyB0byBydW4gYWdhaW5zdCBhbiBlbmV0aXR5J3MgY2xhc3MgZGVzY3JpcHRvciBhZnRlciBhbGwgCi0gICAgICAgICAqIG1ldGFkYXRhIHByb2Nlc3NpbmcgaGFzIGJlZW4gY29tcGxldGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgQ3VzdG9taXplciBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcyAKLSAgICAgICAgICogb3IgRW1iZWRkYWJsZSBjbGFzcy4gSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ3VzdG9taXplciBpcyBub3QgCi0gICAgICAgICAqIGluaGVyaXRlZCBmcm9tIGl0cyBwYXJlbnQgY2xhc3Nlcy4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ3VzdG9taXplciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBkZXNjcmlwdG9yIGN1c3RvbWl6ZXIgY2xhc3MgdGhhdCAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgYXBwbGllZCBmb3IgdGhlIHJlbGF0ZWQgZW50aXR5IG9yIGVtYmVkZGFibGUgY2xhc3MuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlyZWN0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24uCi0gICAgICAgICAqIEl0IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlIAotICAgICAgICAgKiBwYXJhbWV0ZXJzIG9mIGEgbmFtZWQgc3RvcmVkIHByb2NlZHVyZSBxdWVyeS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIERpcmVjdGlvbiB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSW5wdXQgcGFyYW1ldGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU4sCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBPdXRwdXQgcGFyYW1ldGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgT1VULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTl9PVVQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBPdXRwdXQgY3Vyc29yCi0gICAgICAgICAgICovCi0gICAgICAgICAgT1VUX0NVUlNPUgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTl9PVVQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVF9DVVJTT1IiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1tYXBwaW5ncyI+Ci0gICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnRpdHktbWFwcGluZ3MgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgbWFwcGluZwotICAgICAgICBmaWxlLiBJdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGZvdXIgdHlwZXMgb2YgZWxlbWVudHM6Ci0KLSAgICAgICAgMS4gVGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBjb250YWlucyBtZXRhZGF0YQotICAgICAgICBmb3IgdGhlIGVudGlyZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgaWYgdGhpcyBlbGVtZW50Ci0gICAgICAgIG9jY3VycyBpbiBtdWx0aXBsZSBtYXBwaW5nIGZpbGVzIHdpdGhpbiB0aGUgc2FtZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAKLSAgICAgICAgMi4gVGhlIHBhY2thZ2UsIHNjaGVtYSwgY2F0YWxvZyBhbmQgYWNjZXNzIGVsZW1lbnRzIGFwcGx5IHRvIGFsbCBvZgotICAgICAgICB0aGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBkZWZpbmVkIGluCi0gICAgICAgIHRoZSBzYW1lIGZpbGUgaW4gd2hpY2ggdGhleSBvY2N1ci4KLQotICAgICAgICAzLiBUaGUgc2VxdWVuY2UtZ2VuZXJhdG9yLCB0YWJsZS1nZW5lcmF0b3IsIG5hbWVkLXF1ZXJ5LAotICAgICAgICBuYW1lZC1uYXRpdmUtcXVlcnkgYW5kIHNxbC1yZXN1bHQtc2V0LW1hcHBpbmcgZWxlbWVudHMgYXJlIGdsb2JhbAotICAgICAgICB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZQotICAgICAgICBzZXF1ZW5jZS1nZW5lcmF0b3Igb3IgdGFibGUtZ2VuZXJhdG9yIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUKLSAgICAgICAgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyBhbHNvIAotICAgICAgICB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIG5hbWVkLXF1ZXJ5LCBuYW1lZC1uYXRpdmUtcXVlcnksIG9yCi0gICAgICAgIHJlc3VsdC1zZXQtbWFwcGluZyBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBtYXBwaW5nIAotICAgICAgICBmaWxlcyBpbiBhIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgNC4gVGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZWFjaCBkZWZpbmUKLSAgICAgICAgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgbWFuYWdlZCBwZXJzaXN0ZW50IGNsYXNzLiBUaGUgbWFwcGluZwotICAgICAgICBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlc2UgZWxlbWVudHMgbWF5IGJlIGNvbXBsZXRlIG9yIGl0IG1heQotICAgICAgICBiZSBwYXJ0aWFsLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkYWJsZSIgdHlwZT0ib3JtOmVtYmVkZGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvblR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgZml4ZWQ9IjIuMSIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICogY2hlY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIGVudGl0aWVzLgotICAgICAgICAgKiAKLSAgICAgICAgICogQW4gZXhpc3RlbmNlLWNoZWNraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbm5vdGF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRXhpc3RlbmNlQ2hlY2tpbmcgewotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTZXQgdGhlIGV4aXN0ZW5jZSBjaGVjayBmb3IgZGV0ZXJtaW5pbmcKLSAgICAgICAgICAgKiBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIEV4aXN0ZW5jZVR5cGUgdmFsdWUoKSBkZWZhdWx0IENIRUNLX0NBQ0hFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCBhbmQgCi0gICAgICAgICAqIGl0IGlzIGluIHRoZSBjYWNoZSwgdGhlbiBpdCBtdXN0IGV4aXN0LgotICAgICAgICAgKi8KLSAgICAgICAgQ0hFQ0tfQ0FDSEUsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBlcmZvcm0gZG9lcyBleGlzdCBjaGVjayBvbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBDSEVDS19EQVRBQkFTRSwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIHRoZW4gCi0gICAgICAgICAqIGl0IG11c3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgCi0gICAgICAgICAqIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4KLSAgICAgICAgICovCi0gICAgICAgIEFTU1VNRV9FWElTVEVOQ0UsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIAotICAgICAgICAgKiBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4gIAotICAgICAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIGZvcmNlIGFuIGluc2VydCB0byBiZSBjYWxsZWQuCi0gICAgICAgICAqLwotICAgICAgICBBU1NVTUVfTk9OX0VYSVNURU5DRQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+ICAgIAotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0NBQ0hFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19EQVRBQkFTRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX0VYSVNURU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX05PTl9FWElTVEVOQ0UiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4gCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIE1ldGFkYXRhIHRoYXQgYXBwbGllcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgbm90IGp1c3QgdG8gCi0gICAgICAgIHRoZSBtYXBwaW5nIGZpbGUgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLiAKLQotICAgICAgICBJZiB0aGUgeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgZWxlbWVudCBpcyBzcGVjaWZpZWQsCi0gICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQgCi0gICAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGVzZSBkZWZhdWx0cyBhcmUgYXBwbGllZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhcyBhIHdob2xlIAotICAgICAgICB1bmxlc3MgdGhleSBhcmUgb3ZlcnJpZGRlbiBieSBsb2NhbCBhbm5vdGF0aW9uIG9yIFhNTCAKLSAgICAgICAgZWxlbWVudCBzZXR0aW5ncy4gCi0gICAgICAgIAotICAgICAgICBzY2hlbWEgLSBVc2VkIGFzIHRoZSBzY2hlbWEgZm9yIGFsbCB0YWJsZXMsIHNlY29uZGFyeSB0YWJsZXMsIGpvaW4KLSAgICAgICAgICAgIHRhYmxlcywgY29sbGVjdGlvbiB0YWJsZXMsIHNlcXVlbmNlIGdlbmVyYXRvcnMsIGFuZCB0YWJsZSAKLSAgICAgICAgICAgIGdlbmVyYXRvcnMgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXRhbG9nIC0gVXNlZCBhcyB0aGUgY2F0YWxvZyBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywgam9pbgotICAgICAgICAgICAgdGFibGVzLCBjb2xsZWN0aW9uIHRhYmxlcywgc2VxdWVuY2UgZ2VuZXJhdG9ycywgYW5kIHRhYmxlIAotICAgICAgICAgICAgZ2VuZXJhdG9ycyB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGRlbGltaXRlZC1pZGVudGlmaWVycyAtIFVzZWQgdG8gdHJlYXQgZGF0YWJhc2UgaWRlbnRpZmllcnMgYXMKLSAgICAgICAgICAgIGRlbGltaXRlZCBpZGVudGlmaWVycy4KLSAgICAgICAgYWNjZXNzIC0gVXNlZCBhcyB0aGUgYWNjZXNzIHR5cGUgZm9yIGFsbCBtYW5hZ2VkIGNsYXNzZXMgaW4KLSAgICAgICAgICAgIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhc2NhZGUtcGVyc2lzdCAtIEFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zCi0gICAgICAgICAgICBpbiBhbGwgZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgZW50aXR5LWxpc3RlbmVycyAtIExpc3Qgb2YgZGVmYXVsdCBlbnRpdHkgbGlzdGVuZXJzIHRvIGJlIGludm9rZWQgCi0gICAgICAgICAgICBvbiBlYWNoIGVudGl0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxpbWl0ZWQtaWRlbnRpZmllcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYW4gZW50aXR5LiBJcyBhbGxvd2VkIHRvIGJlCi0gICAgICAgIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gCi0gICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViZWxlbWVudHMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9Im9ybTp0YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIiB0eXBlPSJvcm06c2Vjb25kYXJ5LXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5IiB0eXBlPSJvcm06cHJpbWFyeS1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJvcm06aW5oZXJpdGFuY2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLWV4dHJhY3RvciIgdHlwZT0ib3JtOmNsYXNzLWV4dHJhY3RvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1pbnRlcmNlcHRvciIgdHlwZT0ib3JtOmNhY2hlLWludGVyY2VwdG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJvcm06ZmV0Y2gtZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5LXJlZGlyZWN0b3JzIiB0eXBlPSJvcm06cXVlcnktcmVkaXJlY3RvcnMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFyZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWNoZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJhY2Nlc3MtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBkZXRlcm1pbmVzIGhvdyB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgYWNjZXNzZXMgdGhlCi0gICAgICAgIHN0YXRlIG9mIGFuIGVudGl0eSBvciBlbWJlZGRlZCBvYmplY3QuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9QRVJUWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklFTEQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZJUlRVQUwiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHR7fTsKLSAgICAgICAgICBKb2luVGFibGUgam9pblRhYmxlKCkgZGVmYXVsdCBASm9pblRhYmxlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXR0cmlidXRlT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgQ29sdW1uIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGVzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBlbnRpdHkgZmllbGQgb3IgcHJvcGVydHkgbWFwcGluZ3MuCi0gICAgICAgIEl0IG1heSBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgdG8gaW5jbHVkZSBvbmx5IGEgc3Vic2V0IG9mIHRoZQotICAgICAgICBmaWVsZHMgb3IgcHJvcGVydGllcy4gSWYgbWV0YWRhdGEtY29tcGxldGUgZm9yIHRoZSBlbnRpdHkgaXMgdHJ1ZQotICAgICAgICB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBkZWZhdWx0ZWQgYWNjb3JkaW5nCi0gICAgICAgIHRvIHRoZSBkZWZhdWx0IHJ1bGVzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJvcm06aWQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQtaWQiIHR5cGU9Im9ybTplbWJlZGRlZC1pZCIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYyIgdHlwZT0ib3JtOmJhc2ljIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIiB0eXBlPSJvcm06YmFzaWMtY29sbGVjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLW1hcCIgdHlwZT0ib3JtOmJhc2ljLW1hcCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW9uZSIgdHlwZT0ib3JtOm1hbnktdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tbWFueSIgdHlwZT0ib3JtOm9uZS10by1tYW55IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tb25lIiB0eXBlPSJvcm06b25lLXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSIgdHlwZT0ib3JtOnZhcmlhYmxlLW9uZS10by1vbmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW1hbnkiIHR5cGU9Im9ybTptYW55LXRvLW1hbnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbGVtZW50LWNvbGxlY3Rpb24iIHR5cGU9Im9ybTplbGVtZW50LWNvbGxlY3Rpb24iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZCIgdHlwZT0ib3JtOmVtYmVkZGVkIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiIgdHlwZT0ib3JtOnRyYW5zZm9ybWF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNpZW50IiB0eXBlPSJvcm06dHJhbnNpZW50IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWMgewotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9iIiB0eXBlPSJvcm06bG9iIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuLWluc2VydCIgdHlwZT0ib3JtOnJldHVybi1pbnNlcnQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJldHVybi11cGRhdGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpY0NvbGxlY3Rpb24gewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSB2YWx1ZSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IAotICAgICAgICAgICAqIGNvbGxlY3Rpb24gZGF0YS4gRGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IG9yIGZpZWxkIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIHZhbHVlQ29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmVjbGlwc2VsaW5rLWNvbGxlY3Rpb24tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtbWFwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNNYXAgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IG1hcCAKLSAgICAgICAgICAgKiBrZXkuIElmIHRoZSBuYW1lIG9uIHRlIGtleSBjb2x1bW4gaXMgIiIsIHRoZSBuYW1lIHdpbGwgZGVmYXVsdCB0bzoKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb3IgZmllbGQ7ICJfS0VZIi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4ga2V5Q29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06ZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYXNjYWRlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBDYXNjYWRlVHlwZSB7IEFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSCwgREVUQUNIfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1hbGwiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtbWVyZ2UiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtZGV0YWNoIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xhc3MtZXh0cmFjdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ2xhc3NFeHRyYWN0b3IgYWxsb3dzIGZvciBhIHVzZXIgZGVmaW5lZCBjbGFzcyBpbmRpY2F0b3IgaW4gcGxhY2Ugb2YgCi0gICAgICAgICAqIHByb3ZpZGluZyBhIGRpc2NyaW1pbmF0b3IgY29sdW1uLiBUaGUgY2xhc3MgaGFzIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gICAgICAgICAqICAtIEl0IG11c3QgZXh0ZW5kIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5DbGFzc0V4dHJhY3RvciAKLSAgICAgICAgICogICAgY2xhc3MgYW5kIGltcGxlbWVudCB0aGUgZXh0cmFjdENsYXNzRnJvbVJvdyhSZWNvcmQsIFNlc3Npb24pIG1ldGhvZC4gCi0gICAgICAgICAqICAtIFRoYXQgbWV0aG9kIG11c3QgdGFrZSBhIGRhdGFiYXNlIHJvdyAoYSBSZWNvcmQvTWFwKSBhcyBhbiBhcmd1bWVudCBhbmQgCi0gICAgICAgICAqICAgIG11c3QgcmV0dXJuIHRoZSBjbGFzcyB0byB1c2UgZm9yIHRoYXQgcm93LiAKLSAgICAgICAgICogCi0gICAgICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBkZWNpZGUgd2hpY2ggY2xhc3MgdG8gaW5zdGFudGlhdGUgd2hlbiByZWFkaW5nIAotICAgICAgICAgKiBmcm9tIHRoZSBkYXRhYmFzZS4gSXQgaXMgdGhlIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkgdG8gcG9wdWxhdGUgYW55IAotICAgICAgICAgKiB0eXBpbmcgaW5mb3JtYXRpb24gaW4gdGhlIGRhdGFiYXNlIHJlcXVpcmVkIHRvIGRldGVybWluZSB0aGUgY2xhc3MgZnJvbSB0aGUgCi0gICAgICAgICAqIHJvdy4KLSAgICAgICAgICogCi0gICAgICAgICAqIFRoZSBDbGFzc0V4dHJhY3RvciBtdXN0IG9ubHkgYmUgc2V0IG9uIHRoZSByb290IG9mIGFuIGVudGl0eSBjbGFzcyBvcgotICAgICAgICAgKiBzdWItaGllcmFyY2h5IGluIHdoaWNoIGEgZGlmZmVyZW50IGluaGVyaXRhbmNlIHN0cmF0ZWd5IGlzIGFwcGxpZWQuIFRoZSAKLSAgICAgICAgICogQ2xhc3NFeHRyYWN0b3IgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBTSU5HTEVfVEFCTEUgYW5kIEpPSU5FRCBpbmhlcml0YW5jZSAKLSAgICAgICAgICogc3RyYXRlZ2llcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIElmIGEgQ2xhc3NFeHRyYWN0b3IgaXMgdXNlZCB0aGVuIGEgRGlzY3JpbWluYXRvckNvbHVtbiBjYW5ub3QgYmUgdXNlZC4gQSAKLSAgICAgICAgICogQ2xhc3NFeHRyYWN0b3IgYWxzbyBjYW5ub3QgYmUgdXNlZCBvbiBlaXRoZXIgdGhlIHJvb3Qgb3IgaXRzIHN1YmNsYXNzZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJbiBhZGRpdGlvbiwgZm9yIG1vcmUgY29tcGxleCBjb25maWd1cmF0aW9ucyB1c2luZyBhIENsYXNzRXh0cmFjdG9yIGFuZCBhIAotICAgICAgICAgKiBTSU5HTEVfVEFCTEUgc3RyYXRlZ3ksIHRoZSBkZXNjcmlwdG9yJ3Mgd2l0aEFsbFN1YmNsYXNzZXMgYW5kIG9ubHlJbnN0YW5jZXMgCi0gICAgICAgICAqIGV4cHJlc3Npb25zIHNob3VsZCBiZSBzZXQgdGhyb3VnaCB0aGUgQ2xhc3NFeHRyYWN0b3IncyBpbml0aWFsaXplIG1ldGhvZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5Jbmhlcml0YW5jZVBvbGljeS5zZXRXaXRoQWxsU3ViY2xhc3Nlc0V4cHJlc3Npb24oRXhwcmVzc2lvbikKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5Jbmhlcml0YW5jZVBvbGljeS5zZXRPbmx5SW5zdGFuY2VzRXhwcmVzc2lvbihFeHByZXNzaW9uKQotICAgICAgICAgKiAKLSAgICAgICAgICogQGF1dGhvciBHdXkgUGVsbGV0aWVyCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjEgCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2xhc3NFeHRyYWN0b3IgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGV4dHJhY3RvciB0aGF0IHNob3VsZCBiZSAKLSAgICAgICAgICAgICAqIGFwcGxpZWQgdG8gdGhpcyBlbnRpdHkncyBkZXNjcmlwdG9yLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDbGFzcyB2YWx1ZSgpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNsb25lQ29weVBvbGljeSBvbiBhbiAKLSAgICAgICAgICogRW50aXR5LiBBIENsb25lQ29weVBvbGljeSBtdXN0IHNwZWNpZnkgYXQgb25lIG9yIGJvdGggb2YgdGhlICJtZXRob2QiIAotICAgICAgICAgKiBvciAid29ya2luZ0NvcHlNZXRob2QiLiAid29ya2luZ0NvcHlNZXRob2QiIGlzIHVzZWQgdG8gY2xvbmUgb2JqZWN0cyAKLSAgICAgICAgICogdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyIGFzIHRoZXkgYXJlIHJlZ2lzdGVyZWQgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgdHJhbnNhY3Rpb25hbCBtZWNoYW5pc20sIHRoZSBVbml0T2ZXb3JrLiAibWV0aG9kIiB3aWxsIAotICAgICAgICAgKiBiZSB1c2VkIGZvciB0aGUgY2xvbmUgdGhhdCBpcyB1c2VkIGZvciBjb21wYXJpc29uIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgRGVmZXJyZWRDaGFuZ2VEZXRlY3Rpb25Qb2xpY3kKLSAgICAgICAgICogIAotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcwotICAgICAgICAgKiBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KG1ldGhvZD0ibXlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiLCB3b3JraW5nQ29weU1ldGhvZD0ibXlXb3JraW5nQ29weUNsb25lTWV0aG9kIikKLSAgICAgICAgICogCi0gICAgICAgICAqIG9yOgotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KHdvcmtpbmdDb3B5TWV0aG9kTmFtZT0ibXlXb3JraW5nQ29weUNsb25lIikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsb25lQ29weVBvbGljeSB7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCB0aGlzIGRlZmluZXMgCi0gICAgICAgICAgICAgKiBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBjbG9uZSB0aGF0IHdpbGwgYmUgdXNlZCAKLSAgICAgICAgICAgICAqIGZvciBjb21wYXJpc29uIGJ5Ci0gICAgICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpCi0gICAgICAgICAgICAgKiBFaXRoZXIgbWV0aG9kIG9yIHdvcmtpbmdDb3B5TWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkCi0gICAgICAgICAgICAgKiB0aGlzIGRlZmluZXMgYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG9iamVjdCByZXR1cm5lZCB3aGVuIHJlZ2lzdGVyaW5nIGFuIAotICAgICAgICAgICAgICogT2JqZWN0IGluIGFuIEVjbGlwc2VMaW5rIFVuaXRPZldvcmsKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIHdvcmtpbmdDb3B5TWV0aG9kKCk7Ci0KLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IndvcmtpbmctY29weS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sbGVjdGlvbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVjbGlwc2VsaW5rLWNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGFibGUuIElmIGl0IGlzIG5vdCAKLSAgICAgICAgICAgKiBzcGVjaWZpZWQsIGl0IGlzIGRlZmF1bHRlZCB0byB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nOiAKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGVudGl0eTsgIl8iIDsgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCAKLSAgICAgICAgICAgKiBwcm9wZXJ0eSBvciBmaWVsZCBvZiB0aGUgc291cmNlIGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2F0YWxvZyBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgY2F0YWxvZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2NoZW1hIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBzY2hlbWEuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVc2VkIHRvIHNwZWNpZnkgYSBwcmltYXJ5IGtleSBjb2x1bW4gdGhhdCBpcyB1c2VkIGFzIGEgCi0gICAgICAgICAgICogZm9yZWlnbiBrZXkgdG8gam9pbiB0byBhbm90aGVyIHRhYmxlLiBJZiB0aGUgc291cmNlIGVudGl0eSB1c2VzIGEgCi0gICAgICAgICAgICogY29tcG9zaXRlIHByaW1hcnkga2V5LCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG11c3QgYmUgc3BlY2lmaWVkIAotICAgICAgICAgICAqIGZvciBlYWNoIGZpZWxkIG9mIHRoZSBjb21wb3NpdGUgcHJpbWFyeSBrZXkuIEluIGEgc2luZ2xlIHByaW1hcnkgCi0gICAgICAgICAgICoga2V5IGNhc2UsIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbWF5IG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkLiAKLSAgICAgICAgICAgKiBEZWZhdWx0aW5nIHdpbGwgYXBwbHkgb3RoZXJ3aXNlIGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogbmFtZSwgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIAotICAgICAgICAgICAqIG9mIHRoZSBzb3VyY2UgZW50aXR5LiByZWZlcmVuY2VkQ29sdW1uTmFtZSwgdGhlIHNhbWUgbmFtZSBvZiAKLSAgICAgICAgICAgKiBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVuaXF1ZSBjb25zdHJhaW50cyB0aGF0IGFyZSB0byBiZSBwbGFjZWQgb24gdGhlIHRhYmxlLiAKLSAgICAgICAgICAgKiBUaGVzZSBhcmUgb25seSB1c2VkIGlmIHRhYmxlIGdlbmVyYXRpb24gaXMgaW4gZWZmZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307IAotICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJzaW9uVmFsdWUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgZGF0YWJhc2UgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRhdGFWYWx1ZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBvYmplY3QgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG9iamVjdFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudAotICAgICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgY29udmVydGVyQ2xhc3MoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgb24gYW4gRW50aXR5LgotICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0aGF0IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgYmUgc3BlY2lmaWVkIAotICAgICAgICAgKiBhcyB0aGUgYXJndW1lbnQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3Mgb3IgCi0gICAgICAgICAqIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBGb3IgaW5zdGFuY2U6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENvcHlQb2xpY3koImV4YW1wbGUuTXlDb3B5UG9saWN5IikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvcHlQb2xpY3kgewotCi0gICAgICAgIC8qCi0gICAgICAgICogKFJlcXVpcmVkKQotICAgICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgY2xhc3Mgb2YgdGhlIGNvcHkgcG9saWN5LiBJdCBtdXN0IHNwZWNpZnkgYSBjbGFzcyAKLSAgICAgICAgKiB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5Ci0gICAgICAgICovCi0gICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJEVFlQRSI7Ci0gICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIERpc2NyaW1pbmF0b3JDbGFzcyBpcyB1c2VkIHdpdGhpbiBhIFZhcmlhYmxlT25lVG9PbmUgYW5ub3RhdGlvbi4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KSAKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ2xhc3MgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGRpc2NyaW1pbmF0b3IgdG8gYmUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3IoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNsYXNzIHRvIHRoZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBEaXNjcmltaW5hdG9yVHlwZSB7IFNUUklORywgQ0hBUiwgSU5URUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JWYWx1ZSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudENvbGxlY3Rpb24gewotICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bG9iIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjIiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmNvbGxlY3Rpb24tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBlbWJlZGRhYmxlIG9iamVjdHMuIElzIAotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKLSAgICAgICAgaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRhYmxlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQtaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyBhbiBlbnRpdHkgbGlzdGVuZXIgdG8gYmUgaW52b2tlZCBhdCBsaWZlY3ljbGUgZXZlbnRzCi0gICAgICAgIGZvciB0aGUgZW50aXRpZXMgdGhhdCBsaXN0IHRoaXMgbGlzdGVuZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVycyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eUxpc3RlbmVycyB7Ci0gICAgICAgICAgQ2xhc3NbXSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lciIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5UmVzdWx0IHsKLSAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcygpOwotICAgICAgICAgIEZpZWxkUmVzdWx0W10gZmllbGRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtcmVzdWx0IiB0eXBlPSJvcm06ZmllbGQtcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRW51bVR5cGUgewotICAgICAgICAgIE9SRElOQUwsCi0gICAgICAgICAgU1RSSU5HCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9SRElOQUwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW1lcmF0ZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnVtZXJhdGVkIHsKLSAgICAgICAgICBFbnVtVHlwZSB2YWx1ZSgpIGRlZmF1bHQgT1JESU5BTDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06ZW51bS10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZldGNoLWF0dHJpYnV0ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZldGNoQXR0cmlidXRlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBmZXRjaCBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmZXRjaC1ncm91cCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZldGNoR3JvdXAgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGZldGNoIGdyb3VwIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEluZGljYXRlcyB3aGV0aGVyIGFsbCByZWxhdGlvbnNoaXAgYXR0cmlidXRlcwotICAgICAgICAgICAqIHNwZWNpZmllZCBpbiB0aGUgZmV0Y2ggZ3JvdXAgc2hvdWxkIGJlIGxvYWRlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIGxvYWQoKSBkZWZhdWx0IHRydWU7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgbGlzdCBvZiBhdHRyaWJ1dGVzIHRvIGZldGNoLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoQXR0cmlidXRlW10gYXR0cmlidXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgdHlwZT0ib3JtOmZldGNoLWF0dHJpYnV0ZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsb2FkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRmV0Y2hUeXBlIHsgTEFaWSwgRUFHRVIgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBWlkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmllbGRSZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBHZW5lcmF0ZWRWYWx1ZSB7Ci0gICAgICAgICAgR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IEFVVE87Ci0gICAgICAgICAgU3RyaW5nIGdlbmVyYXRvcigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06Z2VuZXJhdGlvbi10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJhdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImdlbmVyYXRpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEdlbmVyYXRpb25UeXBlIHsgVEFCTEUsIFNFUVVFTkNFLCBJREVOVElUWSwgQVVUTyB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFUVVFTkNFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJREVOVElUWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWRDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iaWQtdmFsaWRhdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIElkVmFsaWRhdGlvbiBlbnVtIGRldGVybWluZXMgdGhlIHR5cGUgdmFsdWUgdGhhdCBhcmUgdmFsaWQgZm9yIGFuIElkLgotICAgICAgICAgKiBCeSBkZWZhdWx0IG51bGwgaXMgbm90IGFsbG93ZWQsIGFuZCAwIGlzIG5vdCBhbGxvdyBmb3Igc2luZ2xldG9uIGlkcyBvZiBsb25nIG9yIGludCB0eXBlLgotICAgICAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBaRVJPIGZvciBzaW5nbGV0b24gaWRzLCBhbmQgTlVMTCBmb3IgY29tcG9zaXRlIGlkcy4KLSAgICAgICAgICogVGhpcyBjYW4gYmUgc2V0IHVzaW5nIHRoZSBAUHJpbWFyeUtleSBhbm5vdGF0aW9uLCBvciBDbGFzc0Rlc2NyaXB0b3IgQVBJLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBQcmltYXJ5S2V5Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuQ2xhc3NEZXNjcmlwdG9yI3NldElkVmFsaWRhdGlvbihJZFZhbGlkYXRpb24pCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMS4wIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIElkVmFsaWRhdGlvbiB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIE9ubHkgbnVsbCBpcyBub3QgYWxsb3dlZCBhcyBhbiBpZCB2YWx1ZSwgMCBpcyBhbGxvd2VkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBOVUxMLAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIG51bGwgYW5kIDAgYXJlIG5vdCBhbGxvd2VkLCAob25seSBpbnQgYW5kIGxvbmcpLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBaRVJPLAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIE5vIGlkIHZhbGlkYXRpb24gaXMgZG9uZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTk9ORQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5VTEwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpFUk8iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUta2V5LXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBDb25maWd1cmVzIHdoYXQgdHlwZSBvZiBJZCB2YWx1ZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBvYmplY3QgaW4gdGhlIGNhY2hlLgotICAgICAgICAgICAgICogVGhpcyBjYW4gZWl0aGVyIGJlIHRoZSBiYXNpYyBJZCB2YWx1ZSBmb3Igc2ltcGxlIHNpbmdsZXRvbiBJZHMsCi0gICAgICAgICAgICAgKiBvciBhbiBvcHRpbWl6ZWQgQ2FjaGVLZXkgdHlwZS4KLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICogQHNlZSBQcmltYXJ5S2V5I2NhY2hlS2V5VHlwZSgpCi0gICAgICAgICAgICAgKiBAc2VlIENsYXNzRGVzY3JpcHRvciNzZXRDYWNoZUtleVR5cGUoQ2FjaGVLZXlUeXBlKQotICAgICAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4xCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyBlbnVtIENhY2hlS2V5VHlwZSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyBjYW4gb25seSBiZSB1c2VkIGZvciBzaW1wbGUgc2luZ2xldG9uIElkcywgc3VjaCBhcyBsb25nL2ludC9TdHJpbmcuCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3Igc2ltcGxlIHNpbmdsZXRvbiBJZHMuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgSURfVkFMVUUsCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBPcHRpbWl6ZWQgY2FjaGUga2V5IHR5cGUgdGhhdCBhbGxvd3MgY29tcG9zaXRlIGFuZCBjb21wbGV4IHZhbHVlcy4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciBjb21wb3NpdGUgb3IgY29tcGxleCBJZHMuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgQ0FDSEVfS0VZLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhlIGNhY2hlIGtleSB0eXBlIGlzIGF1dG9tYXRpY2FsbHkgY29uZmlndXJlZCBkZXBlbmRpbmcgb24gd2hhdCBpcyBvcHRpbWFsIGZvciB0aGUgY2xhc3MuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgQVVUTwotICAgICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRF9WQUxVRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FDSEVfS0VZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmhlcml0YW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEluaGVyaXRhbmNlIHsKLSAgICAgICAgICBJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IFNJTkdMRV9UQUJMRTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTppbmhlcml0YW5jZS10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iaW5oZXJpdGFuY2UtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEluaGVyaXRhbmNlVHlwZQotICAgICAgICAgIHsgU0lOR0xFX1RBQkxFLCBKT0lORUQsIFRBQkxFX1BFUl9DTEFTU307Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSU5HTEVfVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU5FRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEVfUEVSX0NMQVNTIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKiBvbiBhbiBFbnRpdHkuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHRoZSBkZWZhdWx0IENvcHlQb2xpY3kgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rIGFuZCB0aGVyZWZvcmUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBvbmx5IHVzZWQgdG8gCi0gICAgICAgICAqIG92ZXJyaWRlIG90aGVyIHR5cGVzIG9mIGNvcHkgcG9saWNpZXMKLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBASW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbnN0YW50aWF0aW9uQ29weVBvbGljeSB7Ci0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSm9pbkZldGNoVHlwZSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBpbm5lciBqb2luIGlzIHVzZWQgdG8gZmV0Y2ggdGhlIHJlbGF0ZWQgb2JqZWN0LgotICAgICAgICAgKiBUaGlzIGRvZXMgbm90IGFsbG93IGZvciBudWxsL2VtcHR5IHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIElOTkVSLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBpbm5lciBqb2luIGlzIHVzZWQgdG8gZmV0Y2ggdGhlIHJlbGF0ZWQgb2JqZWN0LgotICAgICAgICAgKiBUaGlzIGFsbG93cyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBPVVRFUiwKLSAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOTkVSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImJhdGNoLWZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIHB1YmxpYyBlbnVtIEJhdGNoRmV0Y2hUeXBlIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvcm0gb2YgYmF0Y2ggcmVhZGluZy4KLSAgICAgICAgICAgICAgICAgKiBUaGUgb3JpZ2luYWwgcXVlcnkncyBzZWxlY3Rpb24gY3JpdGVyaWEgaXMgam9pbmVkIHdpdGggdGhlIGJhdGNoIHF1ZXJ5LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEpPSU4sCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUaGlzIHVzZXMgYW4gU1FMIEVYSVNUUyBhbmQgYSBzdWItc2VsZWN0IGluIHRoZSBiYXRjaCBxdWVyeSBpbnN0ZWFkIG9mIGEgam9pbi4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIG9mIG5vdCByZXF1aXJpbmcgYW4gU1FMIERJU1RJTkNUIHdoaWNoIGNhbiBoYXZlIGlzc3VlcwotICAgICAgICAgICAgICAgICAqIHdpdGggTE9Ccywgb3IgbWF5IGJlIG1vcmUgZWZmaWNpZW50IGZvciBzb21lIHR5cGVzIG9mIHF1ZXJpZXMgb3Igb24gc29tZSBkYXRhYmFzZXMuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgRVhJU1RTLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyB1c2VzIGFuIFNRTCBJTiBjbGF1c2UgaW4gdGhlIGJhdGNoIHF1ZXJ5IHBhc3NpbmcgaW4gdGhlIHNvdXJjZSBvYmplY3QgSWRzLgotICAgICAgICAgICAgICAgICAqIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2Ugb2Ygb25seSBzZWxlY3RpbmcgdGhlIG9iamVjdHMgbm90IGFscmVhZHkgY29udGFpbmVkIGluIHRoZSBjYWNoZSwKLSAgICAgICAgICAgICAgICAgKiBhbmQgY2FuIHdvcmsgYmV0dGVyIHdpdGggY3Vyc29ycywgb3IgaWYgam9pbnMgY2Fubm90IGJlIHVzZWQuCi0gICAgICAgICAgICAgICAgICogVGhpcyBtYXkgb25seSB3b3JrIGZvciBzaW5nbGV0b24gSWRzIG9uIHNvbWUgZGF0YWJhc2VzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIElOICAgIAotICAgICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk9JTiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVhJU1RTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBpbnZlcnNlSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludmVyc2Utam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9iIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTG9iIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9jay1tb2RlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBMb2NrTW9kZVR5cGUgeyBSRUFELCBXUklURSwgT1BUSU1JU1RJQywgT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQsIFBFU1NJTUlTVElDX1JFQUQsIFBFU1NJTUlTVElDX1dSSVRFLCBQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQsIE5PTkV9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19SRUFEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19XUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hbnlUb01hbnkgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hbnlUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+ICAgICAgIAotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHMtaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleUNsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleUpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGEgbWFwcGVkIHN1cGVyY2xhc3MuIElzIAotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKLSAgICAgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgYmUgcmVjdXJzaXZlbHkgCi0gICAgICAgIGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3N7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXkiIHR5cGU9Im9ybTpwcmltYXJ5LWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1pbnRlcmNlcHRvciIgdHlwZT0ib3JtOmNhY2hlLWludGVyY2VwdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmZXRjaC1ncm91cCIgdHlwZT0ib3JtOmZldGNoLWdyb3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZWRpcmVjdG9ycyIgdHlwZT0ib3JtOnF1ZXJ5LXJlZGlyZWN0b3JzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFyZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWNoZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOyAvL25hbWVkIFNxbFJlc3VsdFNldE1hcHBpbmcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBMb2NrTW9kZVR5cGUgbG9ja01vZGUoKSBkZWZhdWx0IE5PTkU7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2stbW9kZSIgdHlwZT0ib3JtOmxvY2stbW9kZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBhbGxvd3MgdGhlIGRlZmluaXRpb24gb2YgCi0gICAgICAgICAqIHF1ZXJpZXMgdGhhdCBjYWxsIHN0b3JlZCBwcm9jZWR1cmVzIGFzIG5hbWVkIHF1ZXJpZXMuCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFVuaXF1ZSBuYW1lIHRoYXQgcmVmZXJlbmNlcyB0aGlzIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgUXVlcnkgaGludHMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBSZWZlcnMgdG8gdGhlIGNsYXNzIG9mIHRoZSByZXN1bHQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBTUUxSZXN1bHRNYXBwaW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHByb2NlZHVyZU5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgcXVlcnkgc2hvdWxkIHJldHVybiBhIHJlc3VsdCBzZXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiByZXR1cm5zUmVzdWx0U2V0KCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyBhcmd1bWVudHMgdG8gdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9Im9ybTpzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJldHVybnMtcmVzdWx0LXNldCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT2JqZWN0VHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgY29udmVyc2lvbiB2YWx1ZXMgdG8gYmUgdXNlZCAKLSAgICAgICAgICAgKiB3aXRoIHRoZSBvYmplY3QgY29udmVydGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnNpb25WYWx1ZVtdIGNvbnZlcnNpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IGEgZGVmYXVsdCBvYmplY3QgdmFsdWUuIFVzZWQgZm9yIAotICAgICAgICAgICAgKiBsZWdhY3kgZGF0YSBpZiB0aGUgZGF0YSB2YWx1ZSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiIHR5cGU9Im9ybTpjb252ZXJzaW9uLXZhbHVlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1vYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb01hbnkgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgPC94c2Q6Y2hvaWNlPgotICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIG9ycGhhblJlbW92YWwoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9ycGhhbi1yZW1vdmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHMtaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIG9wdGltaXN0aWMtbG9ja2luZyBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICogb3B0aW1pc3RpYyBsb2NraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyAKLSAgICAgICAgICogZW50aXRpZXMuIEFuIG9wdGltaXN0aWMtbG9ja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbgotICAgICAgICAgKiBhbiBlbnRpdHkgb3IgbWFwcGVkLXN1cGVyY2xhc3MuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJdCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG9wdGltaXN0aWMtbG9ja2luZy10eXBlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9wdGltaXN0aWNMb2NraW5nIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgdG8gdXNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIE9wdGltaXN0aWNMb2NraW5nVHlwZSB0eXBlKCkgZGVmYXVsdCBWRVJTSU9OX0NPTFVNTjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgb2YgdHlwZSAKLSAgICAgICAgICAgKiBTRUxFQ1RFRF9DT0xVTU5TLCB0aGlzIGFubm90YXRpb24gbWVtYmVyIGJlY29tZXMgYSAoUmVxdWlyZWQpIAotICAgICAgICAgICAqIGZpZWxkLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbltdIHNlbGVjdGVkQ29sdW1ucygpIGRlZmF1bHQge307Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgd2hlcmUgdGhlIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgc2hvdWxkIAotICAgICAgICAgICAqIGNhc2NhZGUgbG9jay4gQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIHdpdGggVkVSU0lPTl9DT0xVTU4gbG9ja2luZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIGNhc2NhZGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlbGVjdGVkLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAKLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXNjYWRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIHNpbXBsZSB0eXBlIHRoYXQgaXMgdXNlZCB3aXRoaW4gYW4gb3B0aW1pc3RpYy1sb2NraW5nIAotICAgICAgICAgKiBzcGVjaWZpY2F0aW9uIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2Ygb3B0aW1pc3RpYy1sb2NraW5nIHRoYXQKLSAgICAgICAgICogRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIG9yIGRlbGV0aW5nIGVudGl0aWVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgZXZlcnkgZmllbGQgaW4gdGhlIHRhYmxlCi0gICAgICAgICAgICogaW4gdGhlIFdIRVJFIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZSBvciBhIGRlbGV0ZS4gSWYgYW55IGZpZWxkCi0gICAgICAgICAgICogaGFzIGJlZW4gY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBTExfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBvbmx5IHRoZSBjaGFuZ2VkIGZpZWxkcwotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUuIElmIGFueSBmaWVsZCBoYXMgYmVlbgotICAgICAgICAgICAqIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIEEgZGVsZXRlCi0gICAgICAgICAgICogd2lsbCBvbmx5IGNvbXBhcmUgdGhlIHByaW1hcnkga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENIQU5HRURfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIGNvbXBhcmVzIHNlbGVjdGVkIGZpZWxkcyBpbiB0aGUgV0hFUkUKLSAgICAgICAgICAgKiBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZCBoYXMgYmVlbgotICAgICAgICAgICAqIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIE5vdGUgdGhhdAotICAgICAgICAgICAqIHRoZSBmaWVsZHMgc3BlY2lmaWVkIG11c3QgYmUgbWFwcGVkIGFuZCBub3QgYmUgcHJpbWFyeSBrZXlzLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTEVDVEVEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgYSBzaW5nbGUgdmVyc2lvbiBudW1iZXIKLSAgICAgICAgICAgKiBpbiB0aGUgd2hlcmUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBUaGUgdmVyc2lvbiBmaWVsZCBtdXN0IGJlCi0gICAgICAgICAgICogbWFwcGVkIGFuZCBub3QgYmUgdGhlIHByaW1hcnkga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFZFUlNJT05fQ09MVU1OCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUxMX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQU5HRURfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VMRUNURURfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkVSU0lPTl9DT0xVTU4iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4gIAotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3JkZXItYnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcmRlckJ5IHsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3JkZXItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb3JyZWN0aW9uLXR5cGUiIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4tY29ycmVjdGlvbi10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3JkZXItY29sdW1uLWNvcnJlY3Rpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIE9yZGVyQ29ycmVjdGlvblR5cGUgewotICAgICAgICAgIFJFQUQsCi0gICAgICAgICAgUkVBRF9XUklURSwKLSAgICAgICAgICBFWENFUFRJT04KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRF9XUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVhDRVBUSU9OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtbG9hZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdExvYWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXVwZGF0ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXJlbW92ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXVwZGF0ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlVXBkYXRlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogIFRoZSBQcmltYXJ5S2V5IGFubm90YXRpb24gYWxsb3dzIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb2YgdGhlIElkLgotICAgICAgICAgKiAgQSB2YWxpZGF0aW9uIHBvbGljeSBjYW4gYmUgZ2l2ZW4gdGhhdCBhbGxvd3Mgc3BlY2lmeWluZyBpZiB6ZXJvIGlzIGEgdmFsaWQgaWQgdmFsdWUuCi0gICAgICAgICAqICBUaGUgc2V0IG9mIHByaW1hcnkga2V5IGNvbHVtbnMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIHByZWNpc2VseS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMS4xCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIENvbmZpZ3VyZXMgd2hhdCBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICogQnkgZGVmYXVsdCAwIGlzIG5vdCBhIHZhbGlkIGlkIHZhbHVlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIGFsbG93IDAgaWQgdmFsdWVzLgotICAgICAgICAgICAqLwotICAgICAgICAgIElkVmFsaWRhdGlvbiB2YWxpZGF0aW9uKCkgZGVmYXVsdCBJZFZhbGlkYXRpb24uWkVSTzsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIENvbmZpZ3VyZXMgd2hhdCBjYWNoZSBrZXkgdHlwZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBvYmplY3QgaW4gdGhlIGNhY2hlLgotICAgICAgICAgICAqIEJ5IGRlZmF1bHQgdGhlIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB3aGF0IHR5cGUgaXMgb3B0aW1hbCBmb3IgdGhlIGNsYXNzLgotICAgICAgICAgICAqLwotICAgICAgICAgIENhY2hlS2V5VHlwZSBjYWNoZUtleVR5cGUoKSBkZWZhdWx0IENhY2hlS2V5VHlwZS5BVVRPOwotICAgIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IHRoZSBwcmltYXJ5IGtleSBjb2x1bW5zIGRpcmVjdGx5LgotICAgICAgICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBASWQgaWYgdGhlIHByaW1hcnkga2V5IGluY2x1ZGVzIGEgbm9uIGJhc2ljIGZpZWxkLAotICAgICAgICAgICAqIHN1Y2ggYXMgYSBmb3JlaWduIGtleSwgb3IgYSBpbmhlcml0YW5jZSBkaXNjcmltaW5hdG9yLCBlbWJlZGRlZCwgb3IgdHJhbnNmb3JtYXRpb24gbWFwcGVkIGZpZWxkLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbltdIGNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIHR5cGU9Im9ybTppZC12YWxpZGF0aW9uIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FjaGUta2V5LXR5cGUiIHR5cGU9Im9ybTpjYWNoZS1rZXktdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQSB1c2VyIGRlZmluZWQgbWFwcGluZydzIHByb3BlcnR5LgotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcm9wZXJ0eSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUHJvcGVydHkgbmFtZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBQcm9wZXJ0eSB2YWx1ZSwKLSAgICAgICAgICAgKiBjb252ZXJ0ZWQgdG8gYW4gaW5zdGFuY2Ugb2YgdmFsdWVUeXBlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IHZhbHVlIHR5cGUuCi0gICAgICAgICAgICogVGhlIHZhbHVlIGNvbnZlcnRlZCB0byB2YWx1ZVR5cGUgYnkgQ29udmVyc2lvbk1hbmFnZXIuCi0gICAgICAgICAgICogSWYgc3BlY2lmaWVkIG11c3QgYmUgYSBzaW1wbGUgdHlwZSB0aGF0IGNvdWxkIGJlIGhhbmRsZWQgYnkgCi0gICAgICAgICAgICogQ29udmVyc2lvbk1hbmFnZXI6IAotICAgICAgICAgICAqIG51bWVyaWNhbCwgYm9vbGVhbiwgdGVtcG9yYWwuICAKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2xhc3MgdmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktaGludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkgCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5SGludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1yZWRpcmVjdG9ycyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi1AVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotcHVibGljIEBpbnRlcmZhY2UgUXVlcnlSZWRpcmVjdG9ycyB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBBbGxRdWVyaWVzIFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcgb2JqZWN0IHF1ZXJ5Ci0gICAgICogdGhhdCBkb2VzIG5vdCBoYXZlIGEgbW9yZSBwcmVjaXNlIHJlZGlyZWN0b3IgKGxpa2UgdGhlIAotICAgICAqIFJlYWRPYmplY3RRdWVyeSBSZWRpcmVjdG9yKSBvciBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBDbGFzcyBhbGxRdWVyaWVzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgIC8qKgotICAgICAqIEEgRGVmYXVsdCBSZWFkQWxsIFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBSZWFkQWxsUXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIFF1ZXJ5IHJlZGlyZWN0b3JzIGFsbG93IHRoZSB1c2VyIHRvIGludGVyY2VwdCBxdWVyeSBleGVjdXRpb24gcHJldmVudGluZwotICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAqIEZvciB1c2VycyBleGVjdXRpbmcgYSBKUEEgUXVlcnkgdGhyb3VnaCB0aGUgZ2V0UmVzdWx0TGlzdCgpIEFQSSB0aGlzIGlzIHRoZSByZWRpcmVjdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkCi0gICAgICovCi0gICAgQ2xhc3MgcmVhZEFsbCgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgUmVhZE9iamVjdCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogUmVhZE9iamVjdFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKiBGb3IgdXNlcnMgZXhlY3V0aW5nIGEgSlBBIFF1ZXJ5IHRocm91Z2ggdGhlIGdldFNpbmdsZVJlc3VsdCgpIEFQSSBvciBFbnRpdHlNYW5hZ2VyLmZpbmQoKSB0aGlzIGlzIHRoZSByZWRpcmVjdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkCi0gICAgICovCi0gICAgQ2xhc3MgcmVhZE9iamVjdCgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgUmVwb3J0UXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIFJlcG9ydFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKiBGb3IgdXNlcnMgZXhlY3V0aW5nIGEgSlBBIFF1ZXJ5IHRoYXQgY29udGFpbnMgYWdyZWdhdGUgZnVuY3Rpb25zIG9yIHNlbGVjdHMgbXVsdGlwbGUgZW50aXRpZXMgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAqLwotICAgIENsYXNzIHJlcG9ydCgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgVXBkYXRlIFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBVcGRhdGVPYmplY3RRdWVyeSBvciBVcGRhdGVBbGxRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogSW4gRWNsaXBzZUxpbmsgYW4gVXBkYXRlT2JqZWN0UXVlcnkgaXMgZXhlY3V0ZWQgd2hlbmV2ZXIgZmx1c2hpbmcgY2hhbmdlcyB0byB0aGUgZGF0YXNvdXJjZS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKi8gCi0gICAgQ2xhc3MgdXBkYXRlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgIC8qKgotICAgICAqIEEgRGVmYXVsdCBJbnNlcnQgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIEluc2VydE9iamVjdFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBJbiBFY2xpcHNlTGluayBhbiBJbnNlcnRPYmplY3RRdWVyeSBpcyBleGVjdXRlZCB3aGVuIHBlcnNpc3RpbmcgYW4gb2JqZWN0IHRvIHRoZSBkYXRhc291cmNlLgotICAgICAqIFF1ZXJ5IHJlZGlyZWN0b3JzIGFsbG93IHRoZSB1c2VyIHRvIGludGVyY2VwdCBxdWVyeSBleGVjdXRpb24gcHJldmVudGluZwotICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAqLwotICAgIENsYXNzIGluc2VydCgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgRGVsZXRlIE9iamVjdCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogRGVsZXRlT2JqZWN0UXVlcnkgb3IgRGVsZXRlQWxsUXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIFF1ZXJ5IHJlZGlyZWN0b3JzIGFsbG93IHRoZSB1c2VyIHRvIGludGVyY2VwdCBxdWVyeSBleGVjdXRpb24gcHJldmVudGluZwotICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAqLwotICAgIENsYXNzIGRlbGV0ZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbC1xdWVyaWVzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1hbGwiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9iamVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlcG9ydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRlbGV0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLXRyYW5zZm9ybWVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFubm90YXRpb24gZm9yIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLSAgICAgICAgICogVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgd3JpdGUtb25seSwgaXQgc2hvdWxkIGhhdmUgYSAKLSAgICAgICAgICogUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIGNvbHVtbihzKSAKLSAgICAgICAgICogdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKLSAgICAgICAgICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0gICAgICAgICAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyKS4KLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJlYWRUcmFuc2Zvcm1lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLSAgICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5BdHRyaWJ1dGVUcmFuc2Zvcm1lciAKLSAgICAgICAgICAgICAqIGludGVyZmFjZS4gVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkLCBpdHMgCi0gICAgICAgICAgICAgKiBidWlsZEF0dHJpYnV0ZVZhbHVlIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHZhbHVlIHRvIGJlIAotICAgICAgICAgICAgICogYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAotICAgICAgICAgICAgICogYSB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlIChub3QgYXNzaWducyB0aGUgdmFsdWUgdG8gCi0gICAgICAgICAgICAgKiB0aGUgYXR0cmlidXRlKS4gRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgCi0gICAgICAgICAgICAgKiBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXR1cm4taW5zZXJ0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUmV0dXJuSW5zZXJ0IHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQSBSZXR1cm5JbnNlcnQgYW5ub3RhdGlvbiBhbGxvd3MgZm9yIElOU0VSVCBvcGVyYXRpb25zIHRvIHJldHVybiAKLSAgICAgICAgICAgICAqIHZhbHVlcyBiYWNrIGludG8gdGhlIG9iamVjdCBiZWluZyB3cml0dGVuLiBUaGlzIGFsbG93cyBmb3IgdGFibGUgCi0gICAgICAgICAgICAgKiBkZWZhdWx0IHZhbHVlcywgdHJpZ2dlciBvciBzdG9yZWQgcHJvY2VkdXJlcyBjb21wdXRlZCB2YWx1ZXMgdG8gCi0gICAgICAgICAgICAgKiBiZSBzZXQgYmFjayBpbnRvIHRoZSBvYmplY3QuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJvb2xlYW4gcmV0dXJuT25seSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJldHVybi1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY29uZGFyeS10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlY29uZGFyeVRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHBrSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2VxdWVuY2VHZW5lcmF0b3IgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHNlcXVlbmNlTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDE7Ci0gICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNlcXVlbmNlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNxbFJlc3VsdFNldE1hcHBpbmcgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgRW50aXR5UmVzdWx0W10gZW50aXRpZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENvbHVtblJlc3VsdFtdIGNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktcmVzdWx0IiB0eXBlPSJvcm06ZW50aXR5LXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1yZXN1bHQiIHR5cGU9Im9ybTpjb2x1bW4tcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24gaXMgdXNlZCB3aXRoaW4gYSAKLSAgICAgICAgICogTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgZGlyZWN0aW9uIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uKCkgZGVmYXVsdCBJTjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBxdWVyeSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgcXVlcnlQYXJhbWV0ZXIoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgSmF2YSBjbGFzcyBkZXNpcmVkIGJhY2sgZnJvbSB0aGUgcHJvY2VkdXJlLCAKLSAgICAgICAgICAgKiB0aGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBjb2RlLCB0aGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCAKLSAgICAgICAgICAgKiBmcm9tIHRoZSBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgaW50IGpkYmNUeXBlKCkgZGVmYXVsdCAtMTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBuYW1lLCB0aGlzIG1heSBiZSByZXF1aXJlZCBmb3IgQVJSQVkgb3IgCi0gICAgICAgICAgICogU1RSVUNUIHR5cGVzLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBqZGJjVHlwZU5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9Im9ybTpkaXJlY3Rpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJxdWVyeS1wYXJhbWV0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iamRiYy10eXBlIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdHJ1Y3RDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCi0gICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgCi0gICAgICAgICAgICogaW1wbGVtZW50IHRoZSBFY2xpcHNlTGluayBpbnRlcmZhY2UgCi0gICAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY29udmVydGVyKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBwa0NvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBwa0NvbHVtblZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAwOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRlbXBvcmFsIHsKLSAgICAgICAgICBUZW1wb3JhbFR5cGUgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06dGVtcG9yYWwtdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIFRlbXBvcmFsVHlwZSB7Ci0gICAgICAgICAgREFURSwgLy8gamF2YS5zcWwuRGF0ZQotICAgICAgICAgIFRJTUUsIC8vIGphdmEuc3FsLlRpbWUKLSAgICAgICAgICBUSU1FU1RBTVAgLy8gamF2YS5zcWwuVGltZXN0YW1wCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQVRFIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRVNUQU1QIi8+Ci0gICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZS1vZi1kYXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRpbWVPZkRheSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBIb3VyIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBob3VyKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaW51dGUgb2YgdGhlIGRheS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IG1pbnV0ZSgpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU2Vjb25kIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbGxpc2Vjb25kIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaWxsaXNlY29uZCgpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEludGVybmFsIHVzZS4gRG8gbm90IG1vZGlmeS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBzcGVjaWZpZWQoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImhvdXIiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWludXRlIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaWxsaXNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uIGlzIGFuIG9wdGlvbmFsIGFubm90YXRpb24gZm9yIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBhbGxvd3MgdG8gbWFwIGFuIGF0dHJpYnV0ZSB0byBvbmUgb3IgbW9yZSAKLSAgICAgICAgICogZGF0YWJhc2UgY29sdW1ucy4KLSAgICAgICAgICogCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24gaXMgYW4gb3B0aW9uYWwgcGFydCBvZiAKLSAgICAgICAgICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGRlZmluaXRpb24uIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIAotICAgICAgICAgKiB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyAKLSAgICAgICAgICogdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zZm9ybWF0aW9uIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotICAgICAgICAgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0gICAgICAgICAgICAgKiBoaW50IHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCAKLSAgICAgICAgICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG9wdGlvbmFsIGVsZW1lbnQgaXMgYSBoaW50IGFzIHRvIHdoZXRoZXIgdGhlIHZhbHVlCi0gICAgICAgICAgICAgKiAgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IG1heSBiZSBudWxsLiBJdCBpcyBkaXNyZWdhcmRlZAotICAgICAgICAgICAgICogIGZvciBwcmltaXRpdmUgdHlwZXMsIHdoaWNoIGFyZSBjb25zaWRlcmVkIG5vbi1vcHRpb25hbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFkLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06cmVhZC10cmFuc2Zvcm1lciIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06d3JpdGUtdHJhbnNmb3JtZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNpZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNpZW50IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFR5cGVDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQotICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbmNlIGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgZmllbGQgCi0gICAgICAgICAgICogb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaXF1ZS1jb25zdHJhaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nW10gY29sdW1uTmFtZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKiAKLSAgICAgICAgICogVmFyaWFibGUgb25lIHRvIG9uZSBtYXBwaW5ncyBhcmUgdXNlZCB0byByZXByZXNlbnQgYSBwb2ludGVyIAotICAgICAgICAgKiByZWZlcmVuY2VzIGJldHdlZW4gYSBqYXZhIG9iamVjdCBhbmQgYW4gaW1wbGVtZW50ZXIgb2YgYW4gaW50ZXJmYWNlLiAKLSAgICAgICAgICogVGhpcyBtYXBwaW5nIGlzIHVzdWFsbHkgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgcG9pbnRlciAoc3RvcmVkIGluIGFuIAotICAgICAgICAgKiBpbnN0YW5jZSB2YXJpYWJsZSkgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgb2JqZWN0cy4gSW4gdGhlIAotICAgICAgICAgKiByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlcywgdGhlc2UgbWFwcGluZ3MgYXJlIG5vcm1hbGx5IGltcGxlbWVudGVkIAotICAgICAgICAgKiB1c2luZyBhIGZvcmVpZ24ga2V5IGFuZCBhIHR5cGUgY29kZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEEgVmFyaWFibGVPbmVUb09uZSBjYW4gYmUgc3BlY2lmaWVkIHdpdGhpbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIGFuZCBFbWJlZGRhYmxlIGNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmFyaWFibGVPbmVUb09uZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgaW50ZXJmYWNlIGNsYXNzIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgCi0gICAgICAgICAgICogYXNzb2NpYXRpb24uIElmIG5vdCBzcGVjaWZpZWQgaXQgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIAotICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgYmVpbmcgcmVmZXJlbmNlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB0YXJnZXRJbnRlcmZhY2UoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcGVyYXRpb25zIHRoYXQgbXVzdCBiZSBjYXNjYWRlZCB0byB0aGUgdGFyZ2V0IG9mIAotICAgICAgICAgICAqIHRoZSBhc3NvY2lhdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0gICAgICAgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0gICAgICAgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgYXNzb2NpYXRpb24gaXMgb3B0aW9uYWwuIElmIHNldCB0byBmYWxzZSAKLSAgICAgICAgICAgKiB0aGVuIGEgbm9uLW51bGwgcmVsYXRpb25zaGlwIG11c3QgYWx3YXlzIGV4aXN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aWxsIGhvbGQgdGhlIHR5cGUgCi0gICAgICAgICAgICogaW5kaWNhdG9ycy4gSWYgdGhlIERpc2NyaW1pbmF0b3JDb2x1bW4gaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgCi0gICAgICAgICAgICogb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIGRlZmF1bHRzIHRvICJEVFlQRSIgYW5kIHRoZSAKLSAgICAgICAgICAgKiBkaXNjcmltaW5hdG9yIHR5cGUgdG8gU1RSSU5HLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgQERpc2NyaW1pbmF0b3JDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBsaXN0IG9mIGRpc2NyaW1pbmF0b3IgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIAotICAgICAgICAgICAqIHRoaXMgVmFyaWFibGVPbmVUb09uZS4gSWYgbm9uZSBhcmUgc3BlY2lmaWVkIHRoZW4gdGhvc2UgZW50aXRpZXMgCi0gICAgICAgICAgICogd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHRoYXQgaW1wbGVtZW50IHRoZSB0YXJnZXQgaW50ZXJmYWNlIAotICAgICAgICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdHlwZXMuIFRoZSBkaXNjcmltaW5hdG9yIHR5cGUgd2lsbCAKLSAgICAgICAgICAgKiBkZWZhdWx0IGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIFNUUklORzogRW50aXR5Lm5hbWUoKQotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBDSEFSOiBGaXJzdCBsZXR0ZXIgb2YgdGhlIAotICAgICAgICAgICAqICAgIEVudGl0eSBjbGFzcwotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBJTlRFR0VSOiBUaGUgbmV4dCBpbnRlZ2VyIGFmdGVyIAotICAgICAgICAgICAqICAgIHRoZSBoaWdoZXN0IGludGVnZXIgZXhwbGljaXRseSBhZGRlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXNjcmltaW5hdG9yQ2xhc3NbXSBkaXNjcmltaW5hdG9yQ2xhc3NlcygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY2xhc3MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqICAKLSAgICAgICAgICogQSBzaW5nbGUgV3JpdGVUcmFuc2Zvcm1lciBtYXkgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSBtZXRob2Qgb3IgCi0gICAgICAgICAqIGF0dHJpYnV0ZS4gTXVsdGlwbGUgV3JpdGVUcmFuc2Zvcm1lcnMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbi4gTm8gV3JpdGVUcmFuc2Zvcm1lcnMgc3BlY2lmaWVkIGZvciAKLSAgICAgICAgICogcmVhZC1vbmx5IG1hcHBpbmcuIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IAotICAgICAgICAgKiBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSAKLSAgICAgICAgICogY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgV3JpdGVUcmFuc2Zvcm1lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLSAgICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5GaWVsZFRyYW5zZm9ybWVyIAotICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyBidWlsZEZpZWxkVmFsdWUgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIAotICAgICAgICAgICAgICogY29sdW1uLiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgCi0gICAgICAgICAgICAgKiBzdXBwb3J0ZWQgdGhlIG1ldGhvZCBidWlsZEZpZWxkVmFsdWUgaW4gdGhlIGNsYXNzIHNob3VsZCBiZSAKLSAgICAgICAgICAgICAqIGRlZmluZWQgdG8gcmV0dXJuIHRoZSByZWxldmFudCBKYXZhIHR5cGUsIG5vdCBqdXN0IE9iamVjdCBhcyAKLSAgICAgICAgICAgICAqIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSwgZm9yIGluc3RhbmNlOgotICAgICAgICAgICAgICogcHVibGljIFRpbWUgYnVpbGRGaWVsZFZhbHVlKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIGZpZWxkTmFtZSwgU2Vzc2lvbiBzZXNzaW9uKS4KLSAgICAgICAgICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAotICAgICAgICAgICAgICogYSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIGNvbHVtbi4KLSAgICAgICAgICAgICAqIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSBzdXBwb3J0ZWQgdGhlIAotICAgICAgICAgICAgICogbWV0aG9kIHNob3VsZCBiZSBkZWZpbmVkIHRvIHJldHVybiBhIHBhcnRpY3VsYXIgdHlwZSwgbm90IGp1c3QgCi0gICAgICAgICAgICAgKiBPYmplY3QsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGdldFN0YXJ0VGltZSgpLgotICAgICAgICAgICAgICogVGhlIG1ldGhvZCBtYXkgcmVxdWlyZSBhIFRyYW5zaWVudCBhbm5vdGF0aW9uIHRvIGF2b2lkIGJlaW5nIAotICAgICAgICAgICAgICogbWFwcGVkIGFzIEJhc2ljIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAgICAgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKLSAgICAgICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXRjaC1mZXRjaCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBCYXRjaEZldGNoIGFubm90YXRpb24gY2FuIGJlIHVzZWQgb24gYW55IHJlbGF0aW9uc2hpcCBtYXBwaW5nLAotICAgICAgICAgKiAoT25lVG9PbmUsIE1hbnlUb09uZSwgT25lVG9NYW55LCBNYW55VG9NYW55LCBFbGVtZW50Q29sbGVjdGlvbiwgQmFzaWNDb2xsZWN0aW9uLCBCYXNpY01hcCkuCi0gICAgICAgICAqIEl0IGFsbG93cyB0aGUgcmVsYXRlZCBvYmplY3RzIHRvIGJlIGJhdGNoIHJlYWQgaW4gYSBzaW5nbGUgcXVlcnkuCi0gICAgICAgICAqIEJhdGNoIGZldGNoaW5nIGNhbiBhbHNvIGJlIHNldCBhdCB0aGUgcXVlcnkgbGV2ZWwsIGFuZCBpdCBpcyAKLSAgICAgICAgICogbm9ybWFsbHkgcmVjb21tZW5kZWQgdG8gZG8gc28gYXMgYWxsIHF1ZXJpZXMgbWF5IG5vdCByZXF1aXJlIGJhdGNoaW5nLgotICAgICAgICAgKiAKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjEKLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhdGNoRmV0Y2ggewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGJhdGNoLWZldGNoIHRvIHVzZS4KLSAgICAgICAgICAgICAqIEVpdGhlciBKT0lOLCBFWElTVFMgb3IgSU4uCi0gICAgICAgICAgICAgKiBKT0lOIGlzIHRoZSBkZWZhdWx0LgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQmF0Y2hGZXRjaFR5cGUgdmFsdWUoKSBkZWZhdWx0IEJhdGNoRmV0Y2hUeXBlLkpPSU47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRGVmaW5lIHRoZSBkZWZhdWx0IGJhdGNoIGZldGNoIHNpemUuCi0gICAgICAgICAgICAgKiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgSU4gdHlwZSBiYXRjaCByZWFkaW5nIGFuZCBkZWZpbmVzCi0gICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIGtleXMgdXNlZCBpbiBlYWNoIElOIGNsYXVzZS4KLSAgICAgICAgICAgICAqIFRoZSBkZWZhdWx0IHNpemUgaXMgMjU2LCBvciB0aGUgcXVlcnkncyBwYWdlU2l6ZSBmb3IgY3Vyc29yIHF1ZXJpZXMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGludCBzaXplKCkgZGVmYXVsdCAtMTsKLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpiYXRjaC1mZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotPC94c2Q6c2NoZW1hPgotCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMC54c2QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX294bV8yXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjEwY2U0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIAotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAKLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgZG1jY2FubiAtIE5vdmVtYmVyIDI0LzIwMDkgLSAyLjAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS0tPgotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3htIgotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL294bSIgCi0gICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgIHZlcnNpb249IjIuMCI+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYmluZGluZ3MiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNjaGVtYSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXJzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLXR5cGVzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJqYXZhLXR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3ItdHlwZSIgdHlwZT0ieG1sLWFjY2Vzcy10eXBlIiBkZWZhdWx0PSJQVUJMSUNfTUVNQkVSIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3Itb3JkZXIiIHR5cGU9InhtbC1hY2Nlc3Mtb3JkZXIiIGRlZmF1bHQ9IlVOREVGSU5FRCIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iamF2YS10eXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1yb290LWVsZW1lbnQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNlZS1hbHNvIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iamF2YS1hdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJqYXZhLWF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXRyYW5zaWVudCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1jdXN0b21pemVyIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci10eXBlIiB0eXBlPSJ4bWwtYWNjZXNzLXR5cGUiIGRlZmF1bHQ9IlBVQkxJQ19NRU1CRVIiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci1vcmRlciIgdHlwZT0ieG1sLWFjY2Vzcy1vcmRlciIgZGVmYXVsdD0iVU5ERUZJTkVEIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLWF0dHJpYnV0ZSIgdHlwZT0iamF2YS1hdHRyaWJ1dGUiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtYXR0cmlidXRlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iamF2YS1hdHRyaWJ1dGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSBFbnVtcyAtLT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtYWNjZXNzLW9yZGVyIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMUEhBQkVUSUNBTCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU5ERUZJTkVEIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtYWNjZXNzLXR5cGUiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRklFTEQiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQVUJMSUNfTUVNQkVSIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtbnMtZm9ybSI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTlFVQUxJRklFRCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUVVBTElGSUVEIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTlNFVCIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9UEFDS0FHRSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNjaGVtYSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtbnMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZS11cmkiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLWZvcm0tZGVmYXVsdCIgdHlwZT0ieG1sLW5zLWZvcm0iIGRlZmF1bHQ9IlVOU0VUIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbGVtZW50LWZvcm0tZGVmYXVsdCIgdHlwZT0ieG1sLW5zLWZvcm0iIGRlZmF1bHQ9IlVOU0VUIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWphdmEtdHlwZS1hZGFwdGVycyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRCxNRVRIT0QsUEFDS0FHRX0pIC0tPgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtQQUNLQUdFLEZJRUxELE1FVEhPRCxUWVBFLFBBUkFNRVRFUn0pIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlci5ERUZBVUxUIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e0ZJRUxELE1FVEhPRCxUWVBFfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXRyYW5zaWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiIC8+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT1UWVBFKSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdHlwZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByb3Atb3JkZXIiPgotICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcm9vdC1lbGVtZW50Ij4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNlZS1hbHNvIj4KLSAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRH0pICAtLT4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTEQsTUVUSE9EfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFueS1hdHRyaWJ1dGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIiAvPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWF0dHJpYnV0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZHJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWxpc3QiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hdHRhY2htZW50LXJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1pbWUtdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFueS1lbGVtZW50IiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1taXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGF4IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb20taGFuZGxlciIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlczQ0RvbUhhbmRsZXIiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC13cmFwcGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLW1hcCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdC12YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5pbGxhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQuREVGQVVMVCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZHJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWxpc3QiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hdHRhY2htZW50LXJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1pbWUtdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQtd3JhcHBlciI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5pbGxhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdmFsdWUiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIiAvPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLW1hcCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ia2V5IiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPiAKLSAgICA8L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX294bV8yXzEueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwZjVjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX294bV8yXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCAKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gCi0gVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCAKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIGRtY2Nhbm4gLSBEZWNlbWJlciAwOC8yMDA5IC0gMi4xIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL294bSIKLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9veG0iIAotICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICB2ZXJzaW9uPSIyLjEiPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWJpbmRpbmdzIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNjaGVtYS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVycyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXJlZ2lzdHJpZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1yZWdpc3RyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbnVtcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVudW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLXR5cGVzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJqYXZhLXR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3ItdHlwZSIgdHlwZT0ieG1sLWFjY2Vzcy10eXBlIiBkZWZhdWx0PSJQVUJMSUNfTUVNQkVSIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3Itb3JkZXIiIHR5cGU9InhtbC1hY2Nlc3Mtb3JkZXIiIGRlZmF1bHQ9IlVOREVGSU5FRCIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXJlZ2lzdHJ5Ij4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50LWRlY2wiIG1heE9jY3Vycz0idW5ib3VuZGVkIiA+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iamF2YS1tZXRob2QiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0VmFsdWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iXHUwMDAwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzY29wZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnREZWNsLkdMT0JBTCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3Vic3RpdHV0aW9uSGVhZE5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtdHlwZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcm9vdC1lbGVtZW50IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zZWUtYWxzbyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtYXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iamF2YS1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC10cmFuc2llbnQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtY3VzdG9taXplciIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3ItdHlwZSIgdHlwZT0ieG1sLWFjY2Vzcy10eXBlIiBkZWZhdWx0PSJQVUJMSUNfTUVNQkVSIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3Itb3JkZXIiIHR5cGU9InhtbC1hY2Nlc3Mtb3JkZXIiIGRlZmF1bHQ9IlVOREVGSU5FRCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlubGluZS1iaW5hcnktZGF0YSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtYXR0cmlidXRlIiB0eXBlPSJqYXZhLWF0dHJpYnV0ZSIgLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1hdHRyaWJ1dGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLWF0dHJpYnV0ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiB0eXBlPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hY2Nlc3MtbWV0aG9kcyI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2V0LW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gRW51bXMgLS0+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ieG1sLWFjY2Vzcy1vcmRlciI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBTFBIQUJFVElDQUwiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVOREVGSU5FRCIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ieG1sLWFjY2Vzcy10eXBlIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9QRVJUWSIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFVCTElDX01FTUJFUiIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ieG1sLW5zLWZvcm0iPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU5RVUFMSUZJRUQiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlFVQUxJRklFRCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU5TRVQiIC8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InhtbC1tYXJzaGFsLW51bGwtcmVwcmVzZW50YXRpb24iPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iWFNJX05JTCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUJTRU5UX05PREUiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVNUFRZX05PREUiIC8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPVBBQ0tBR0UpIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1zY2hlbWEiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLW5zIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UtdXJpIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS1mb3JtLWRlZmF1bHQiIHR5cGU9InhtbC1ucy1mb3JtIiBkZWZhdWx0PSJVTlNFVCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudC1mb3JtLWRlZmF1bHQiIHR5cGU9InhtbC1ucy1mb3JtIiBkZWZhdWx0PSJVTlNFVCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1zY2hlbWEtdHlwZXMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXJzIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e0ZJRUxELE1FVEhPRCxQQUNLQUdFfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNjaGVtYS10eXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYVR5cGUuREVGQVVMVCIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e1BBQ0tBR0UsRklFTEQsTUVUSE9ELFRZUEUsUEFSQU1FVEVSfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyLkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTEQsTUVUSE9ELFRZUEV9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdHJhbnNpZW50IiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSIgLz4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPVRZUEUpIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbnVtIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVudW0tdmFsdWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLWVudW0iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YS5sYW5nLlN0cmluZyIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXR5cGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5LWNsYXNzIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZS5ERUZBVUxUIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5LW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcm9wLW9yZGVyIj4KLSAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXJvb3QtZWxlbWVudCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1zZWUtYWxzbyI+Ci0gICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTER9KSAgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVudW0tdmFsdWUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iamF2YS1lbnVtLXZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIAotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTEQsTUVUSE9EfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFueS1hdHRyaWJ1dGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hdHRyaWJ1dGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZHJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWxpc3QiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pbmxpbmUtYmluYXJ5LWRhdGEiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hdHRhY2htZW50LXJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1pbWUtdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hbnktZWxlbWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1peGVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYXgiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRvbS1oYW5kbGVyIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uVzNDRG9tSGFuZGxlciIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1wYXRoIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgbWluT2NjdXJzPSIwIiAvPiAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtd3JhcHBlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1tYXAiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGUiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0LXZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmlsbGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudC5ERUZBVUxUIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbGlzdCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlubGluZS1iaW5hcnktZGF0YSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWF0dGFjaG1lbnQtcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWltZS10eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjZGF0YSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50cyIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC13cmFwcGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWRyZWYiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1saXN0IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQtcmVmIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXdyYXBwZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFJlZi5ERUZBVUxUIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQtcmVmcyIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXJlZiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtd3JhcHBlciIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWludmVyc2UtcmVmZXJlbmNlIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50LXdyYXBwZXIiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuaWxsYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXZhbHVlIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2RhdGEiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLW1hcCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ia2V5IiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPiAKLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiB0eXBlPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgYWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhzaS1uaWwtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbXB0eS1ub2RlLXJlcHJlc2VudHMtbnVsbCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibnVsbC1yZXByZXNlbnRhdGlvbi1mb3IteG1sIiB0eXBlPSJ4bWwtbWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIiAvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLW51bGwtcG9saWN5IiBzdWJzdGl0dXRpb25Hcm91cD0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpcy1zZXQtcGVyZm9ybWVkLWZvci1hYnNlbnQtbm9kZSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1pcy1zZXQtbnVsbC1wb2xpY3kiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpcy1zZXQtcGFyYW1ldGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaXMtc2V0LW1ldGhvZC1uYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4wLnhzZCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzEuMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYzZjNjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIAotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAKLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLS0+Ci08IS0tIEVjbGlwc2UgUGVyc2lzdGVuY2UgU2VydmljZSBQcm9qZWN0IDo6IE1hcCBTY2hlbWEgZmlsZSBmb3IgT1JNL09YTS9FSVMgLS0+Ci08eHNkOnNjaGVtYQotICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSIKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSIKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgdmVyc2lvbj0iMS4wIgotICA+Ci0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtcGVyc2lzdGVuY2UiIHR5cGU9Im9iamVjdC1wZXJzaXN0ZW5jZSIgLz4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcGVyc2lzdGVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBvYmplY3QtcGVyc2lzdGVuY2UgbWFwcGluZyBtb2R1bGUsIGEgc2V0IG9mIGNsYXNzLW1hcHBpbmctZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIG5hbWUgZm9yIHRoZSBtb2RlbCBiZWluZyBtYXBwZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3JzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBjbGFzcyBtYXBwaW5nIGRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiIHR5cGU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5mb3JtYXRpb24gb2YgaG93IGEgY2xhc3MgaXMgcGVyc2lzdGVkIHRvIGl0cyBkYXRhLXN0b3JlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsb2dpbiIgdHlwZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJkZWZhdWx0LXRlbXBvcmFsLW11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBkZWZhdWx0IGZvciBob3cgRGF0ZSBhbmQgQ2FsZW5kYXIgdHlwZXMgYXJlIHVzZWQgd2l0aCBjaGFuZ2UgdHJhY2tpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QnkgZGVmYXVsdCB0aGV5IGFyZSBhc3N1bWVkIG5vdCB0byBiZSBjaGFuZ2VkIGRpcmVjdGx5IChvbmx5IHJlcGxhY2VkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBkZWZhdWx0PSJFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2VzIC0gMS4wIChCdWlsZCBZWU1NREQpIiBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBsYXRmb3JtLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHBsYXRmb3JtIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0YXNvdXJjZSB1c2VyLW5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgcGFzc3dvcmQsIHRoaXMgaXMgc3RvcmVkIGluIGVuY3J5cHRlZCBmb3JtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImV4dGVybmFsLWNvbm5lY3Rpb24tcG9vbGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaWYgdGhlIGNvbm5lY3Rpb25zIGFyZSBtYW5hZ2VkIGJ5IHRoZSBkYXRhc291cmNlIGRyaXZlciwgYW5kIGEgbmV3IGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFjcXVpcmUgcGVyIGNhbGwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZXh0ZXJuYWwtdHJhbnNhY3Rpb24tY29udHJvbGxlciIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaWYgdGhlIHRyYW5zYWN0aW9uIGFyZSBtYW5hZ2VkIGJ5IGEgdHJhbnNhY3Rpb24gbWFuYWdlciwgYW5kIHNob3VsZCBub3QgYmUgbWFuYWdlZCBieSBUb3BMaW5rLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGFsc28gYmUgdXNlZCBpZiB0aGUgZGF0YXNvdXJjZSBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zYWN0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNpbmcgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSIgdHlwZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmF1bHQgc2VxdWVuY2UuIFRoZSBuYW1lIGlzIG9wdGlvbmFsLiBJZiBubyBuYW1lIHByb3ZpZGVkIGFuIGVtcHR5IHN0cmluZyB3aWxsIGJlIHVzZWQgYXMgYSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VxdWVuY2VzIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Ob24gZGVmYXVsdCBzZXF1ZW5jZXMuIE1ha2Ugc3VyZSBlYWNoIHNlcXVlbmNlIGhhcyB1bmlxdWUgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic2VxdWVuY2UiIHR5cGU9InNlcXVlbmNlIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSkRCQyBkcml2ZXIgYW5kIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRyaXZlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEpEQkMgZHJpdmVyIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29ubmVjdGlvbi11cmwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGwgSkRCQyBkcml2ZXIgY29ubmVjdGlvbiBVUkwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgcGFyYW1ldGVyIGJpbmRpbmcgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FjaGUtYWxsLXN0YXRlbWVudHMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBzdGF0ZW1lbnQgY2FjaGluZyBzaG91bGQgYmUgdXNlZC4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2l0aCBwYXJhbWV0ZXIgYmluZGluZywgdGhpcyBjYW5ub3QgYmUgdXNlZCB3aXRoIGV4dGVybmFsIGNvbm5lY3Rpb24gcG9vbGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImJ5dGUtYXJyYXktYmluZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIGJ5dGUgYXJyYXkgZGF0YS10eXBlcyBzaG91bGQgdXNlIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic3RyaW5nLWJpbmRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBzdHJpbmcgZGF0YS10eXBlcyBzaG91bGQgdXNlIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIyNTYiIG5hbWU9InN0cmluZy1iaW5kaW5nLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgdGhyZXNob2xkIHN0cmluZyBzaXplIGZvciB1c2FnZSBvZiBzdHJpbmcgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJzdHJlYW1zLWZvci1iaW5kaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgbGFyZ2UgYnl0ZSBhcnJheSBhbmQgc3RyaW5nIGRhdGEtdHlwZXMgc2hvdWxkIGJlIGJvdW5kIGFzIHN0cmVhbXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZm9yY2UtZmllbGQtbmFtZXMtdG8tdXBwZXItY2FzZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRvIGZvcmNlIGFsbCBmaWVsZCBuYW1lcyB0byB1cHBlci1jYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ib3B0aW1pemUtZGF0YS1jb252ZXJzaW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgZGF0YSBvcHRpbWl6YXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJ0cmltLXN0cmluZ3MiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBzdHJpbmcgdHJhaWxpbmcgYmxhbmtzIHNob3VsZCBiZSB0cmltbWVkLiAgVGhpcyBpcyBub3JtYWxseSByZXF1aXJlZCBmb3IgQ0hBUiBkYXRhLXR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXdyaXRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBiYXRjaCB3cml0aW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iamRiYy1iYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB1c2luZyBiYXRjaCB3cml0aW5nLCBjb25maWd1cmUgaWYgdGhlIEpEQkMgZHJpdmVycyBiYXRjaCB3cml0aW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSkNBIGRyaXZlciBhbmQgRUlTIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tc3BlYy1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFRvcExpbmsgcGxhdGZvcm0gc3BlY2lmaWMgY29ubmVjdGlvbiBzcGVjIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29ubmVjdGlvbi1mYWN0b3J5LXVybCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSk5ESSB1cmwgZm9yIHRoZSBtYW5hZ2VkIEpDQSBhZGFwdGVyJ3MgY29ubmVjdGlvbiBmYWN0b3J5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iZXF1YWwtbmFtZXNwYWNlLXJlc29sdmVycyIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmZvcm1hdGlvbiBvZiBob3cgYSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8gaXRzIGRhdGEtc3RvcmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGlzIGFuIGFic3RyYWN0IGRlZmluaXRpb24gdG8gYWxsb3cgZmxleGliaWxpdHkgaW4gdGhlIHR5cGVzIG9mIGNsYXNzZXMgYW5kIGRhdGFzdG9yZXMgcGVyc2lzdGVkLCBpLmUuIGludGVyZmFjZXMsIGFic3RyYWN0IGNsYXNzZXMsIGFnZ3JlZ2F0ZXMsIG5vbi1yZWxhdGlvbmFsIHBlcnNpc3RlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgYmVpbmcgcGVyc2lzdGVkLiAgVGhlIGNsYXNzIG5hbWUgbXVzdCBiZSBmdWxsIHF1YWxpZmllZCB3aXRoIGl0cyBwYWNrYWdlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxjbGFzcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5leGFtcGxlLmVtcGxveWVlLmltcGxlbWVudGF0aW9uLkVtcGxveWVlPC9jbGFzcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFsaWFzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IGFuIGFsaWFzIG5hbWUgY2FuIGJlIGdpdmVuIGZvciB0aGUgY2xhc3MuICBUaGUgYWxpYXMgaXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byByZWZlciB0byB0aGUgY2xhc3MgaW4gcGxhY2Ugb2YgaXRzIGltcGxlbWVudGF0aW9uIG5hbWUsIHN1Y2ggYXMgaW4gcXVlcnlpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGFsaWFzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPkVtcGxveWVlPC9hbGlhcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBmaWVsZHMvY29sdW1ucyB0aGF0IG1ha2UgdXAgdGhlIHByaW1hcnkga2V5IG9yIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGlzIHVzZWQgZm9yIGNhY2hpbmcsIHJlbGF0aW9uc2hpcHMsIGFuZCBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByaW1hcnkga2V5IGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBpZiB0aGUgY2xhc3MgaXMgcmVhZC1vbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvcGVydGllcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHVzZXIgZGVmaW5lZCBwcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InByb3BlcnR5IiB0eXBlPSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSB1c2VyIGRlZmluZWQgcHJvcGVydHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJpbmhlcml0YW5jZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcyBpcyByZWxhdGVkIGluIGluaGVyaXRhbmNlIGFuZCBob3cgdGhpcyBpbmhlcml0YW5jZSBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJldmVudHMiIHR5cGU9ImV2ZW50LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGVyc2lzdGVudCBldmVudHMgZm9yIHRoaXMgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyeWluZyIgdHlwZT0icXVlcnktcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBkZWZpbmVkIHF1ZXJpZXMgZm9yIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1tYXBwaW5ncyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgbWFwcGluZ3MgdGhhdCBkZWZpbmUgaG93IHRoZSBjbGFzcycgYXR0cmlidXRlcyBhcmUgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhdHRyaWJ1dGUtbWFwcGluZyIgdHlwZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgYXR0cmlidXRlIGlzIHBlcnNpc3RlZC4gVGhlIGF0dHJpYnV0ZSBtYXBwaW5nIGRlZmluaXRpb24gaXMgZXh0ZW5kYWJsZSB0byBhbGxvdyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZXNjcmlwdG9yLXR5cGUiIHR5cGU9ImNsYXNzLWRlc2NyaXB0b3ItdHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZGVzY3JpcHRvciB0eXBlLCBzdWNoIGFzIGFnZ3JlZ2F0ZSBvciBpbmRlcGVuZGVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImludGVyZmFjZXMiIHR5cGU9ImludGVyZmFjZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGludGVyZmFjZXMgdGhhdCB0aGlzIGNsYXNzIGltcGxlbWVudHMuLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibG9ja2luZyIgdHlwZT0ibG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGxvY2tpbmcgYmVoYXZpb3IgZm9yIHRoZSBjbGFzcy4gIFN1Y2ggYXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiB2ZXJzaW9uLCB0aW1lc3RhbXAgb3IgY2hhbmdlIHNldCBvZiBjb2x1bW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VxdWVuY2luZyIgdHlwZT0ic2VxdWVuY2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgZ2VuZXJhdGVkIHVuaXF1ZSBpZCBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FjaGluZyIgdHlwZT0iY2FjaGluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcycgaW5zdGFuY2VzIHNob3VsZCBiZSBjYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZW1vdGUtY2FjaGluZyIgdHlwZT0iY2FjaGluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcycgaW5zdGFuY2VzIHNob3VsZCBiZSBjYWNoZWQgb24gcmVtb3RlIGNsaWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXBvbGljeSIgdHlwZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2Ygb2JqZWN0cyBhcmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGhpc3RvcnkgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuaW5nLXBvbGljeSIgdHlwZT0icmV0dXJuaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyByZXR1bmluZyBwb2xpY3kuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gcmV0dXJuaW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFtZW5kbWVudCIgdHlwZT0iYW1lbmRtZW50Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYW1lbmRlZCBvciBjdXN0b21pemVkIHRocm91Z2ggYSBjbGFzcyBBUEkgYWZ0ZXIgbG9hZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc3RhbnRpYXRpb24iIHR5cGU9Imluc3RhbnRpYXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGluc3RhbnRpYXRpb24gYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29weWluZyIgdHlwZT0iY29weS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgY2xvbmluZy9jb3B5aW5nIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyeS1rZXlzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGxpc3Qgb2YgcXVlcnkga2V5cyBvciBhbGlhc2VzIGZvciBkYXRhYmFzZSBpbmZvcm1hdGlvbi4gIFRoZXNlIGNhbiBiZSB1c2VkIGluIHF1ZXJpZXMgaW5zdGVhZCBvZiB0aGUgZGF0YWJhc2UgY29sdW1uIG5hbWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeS1rZXkiIHR5cGU9InF1ZXJ5LWtleSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgcXVlcnlpbmcgZGF0YWJhc2UgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNtcC1wb2xpY3kiIHR5cGU9ImNtcC1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlBsYWNlIGhvbGRlciBvZiBDTVAgaW5mb3JtYXRpb24gc3BlY2lmaWMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1ncm91cHMiIHR5cGU9ImZldGNoLWdyb3VwcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYWxsIHByZS1kZWZpbmVkIGZldGNoIGdyb3VwcyBhdCB0aGUgZGVzY3JpcHRvciBsZXZlbDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjaGFuZ2UtcG9saWN5IiB0eXBlPSJjaGFuZ2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyB0aGUgQ2hhbmdlIFBvbGljeSBmb3IgdGhpcyBkZXNjcmlwdG9yPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgZml4ZWQ9IjEwIiBuYW1lPSJzY2hlbWEtbWFqb3ItdmVyc2lvbiIgdHlwZT0ieHNkOmludGVnZXIiIC8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgZml4ZWQ9IjAiIG5hbWU9InNjaGVtYS1taW5vci12ZXJzaW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjbGFzcy1kZXNjcmlwdG9yLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjbGFzcyBkZXNjcmlwdG9yIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbmRlcGVuZGVudCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFnZ3JlZ2F0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFnZ3JlZ2F0ZS1jb2xsZWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG9zaXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG9zaXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW50ZXJmYWNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyZmFjZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBpbnRlcmZhY2VzIHRoYXQgYSBjbGFzcyBkZXNjcmlwdG9yIGltcGxlbWVudHMsIG9yIHRoZSBpbXBsZW1lbnRpb24gY2xhc3MgZm9yIGFuIGludGVyZmFjZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBhIHNldCBvZiBwdWJsaWMgaW50ZXJmYWNlcyBmb3IgdGhlIGNsYXNzIGNhbiBiZSBzcGVjaWZpZWQuICBUaGlzIGFsbG93cyB0aGUgaW50ZXJmYWNlIHRvIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdHdvIGNsYXNzZXMgaW1wbGVtZW50IHRoZSBzYW1lIGludGVyZmFjZSwgYW4gaW50ZXJmYWNlIGRlc2NyaXB0b3Igc2hvdWxkIGJlIGRlZmluZWQgZm9yIHRoZSBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBhbHNvIGJlIHVzZWQgdG8gZGVmaW5lIGluaGVyaXRhbmNlIGJldHdlZW4gaW50ZXJmYWNlIGRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImludGVyZmFjZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBpbnRlcmZhY2UgY2xhc3MgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8Y2xhc3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+ZXhhbXBsZS5lbXBsb3llZS5hcGkuRW1wbG95ZWU8L2NsYXNzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImltcGxlbWVudG9yLWRlc2NyaXB0b3IiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHdoaWNoIHRoaXMgaW50ZXJmYWNlIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgdGhlIGludGVyZmFjZSBoYXMgb25seSBhIHNpbmdsZSBpbXBsZW1lbnRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8Y2xhc3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+ZXhhbXBsZS5lbXBsb3llZS5pbXBsLkVtcGxveWVlPC9jbGFzcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGNsb25pbmcvY29weWluZyBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNyZWF0ZXMgYSBjb3B5aW5nIHRocm91Z2ggY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2UgdG8gY29weSBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb3B5LXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGNsb25pbmcvY29weWluZyBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkIHRocm91Z2ggYSBjbG9uZSBtZXRob2QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvcHktcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGNsb25lIG1ldGhvZCBvbiB0aGUgb2JqZWN0LCBpLmUuICdjbG9uZSc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zdGFudGlhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGluc3RhbnRpYXRpb24gYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBvbiB0aGUgZmFjdG9yeSB0byBpbnN0YW50aWF0ZSB0aGUgb2JqZWN0IGluc3RhbmNlLic8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZhY3RvcnktY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgZmFjdG9yeSBjbGFzcyBuYW1lLic8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZhY3RvcnktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGluc3RhbnRpYXRlIHRoZSBmYWN0b3J5IGNsYXNzLic8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYW1lbmRtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgY2xhc3MgYW5kIHN0YXRpYyBtZXRob2QgdG8gYmUgY2FsbGVkIHRvIGFsbG93IGZvciB0aGUgZGVzY3JpcHRvciB0byBiZSBhbWVuZGVkIG9yIGN1c3RvbWl6ZWQgdGhyb3VnaCBhIGNsYXNzIEFQSSBhZnRlciBsb2FkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFtZW5kbWVudC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+IFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYW1lbmRtZW50IGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFtZW5kbWVudC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYW1lbmRtZW50IG1ldGhvZCBvbiB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uYWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYSByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlKHMpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRhYmxlcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiB0aGUgdGFibGVzIHRoZSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8uICBUeXBpY2FsbHkgYSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8gYSBzaW5nbGUgdGFibGUsIGJ1dCBtdWx0aXBsZSB0YWJsZXMgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idGFibGUiIHR5cGU9InRhYmxlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHRhYmxlcyB0aGF0IHRoZSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8uICBUaGlzIGlzIHR5cGljYWxseSBhIHNpbmdsZSB0YWJsZSBidXQgY2FuIGJlIG11bHRpcGxlLCBvciBlbXB0eSBmb3IgaW5oZXJpdGFuY2Ugb3IgYWdncmVnYXRlZCBjbGFzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleXMtZm9yLW11bHRpcGxlLXRhYmxlIiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgZm9yZWlnbiBrZXkgZmllbGQgcmVmZXJlbmNlcyB0byBiZSBkZWZpbmUgZm9yIG11bHRpcGxlIHRhYmxlIGRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibXVsdGlwbGUtdGFibGUtam9pbi1jcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGNvbXBsZXggbXVsdGlwbGUgdGFibGUgam9pbiBjb25kaXRpb25zIGFuIGV4cHJlc3Npb24gbWF5IGJlIHByb3ZpZGVkIGluc3RlYWQgb2YgdGhlIHRhYmxlIGZvcmVpZ24ga2V5IGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24tbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gYSBudW1lcmljIHZlcnNpb24gZmllbGQvY29sdW1uIHRoYXQgdHJhY2tzIGNoYW5nZXMgYW5kIHRoZSB2ZXJzaW9uIHRvIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBhbmQgb3B0aW9uYWxseSB0aGUgdGFibGUgb2YgdGhlIGNvbHVtbiB0aGF0IHRoZSBhdHRyaWJ1dGUgaXMgc3RvcmVkIGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJzdG9yZS12ZXJzaW9uLWluLWNhY2hlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSB2ZXJzaW9uIHZhbHVlIHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIGNhY2hlLCBvciBpZiBpdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lc3RhbXAtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gdGltZXN0YW1wIHZlcnNpb24gY29sdW1uIHRoYXQgdHJhY2tzIGNoYW5nZXMgYW5kIHRoZSB2ZXJzaW9uIHRvIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmVyc2lvbi1sb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InNlcnZlci10aW1lIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSB0aW1lc3RhbXAgc2hvdWxkIGJlIG9idGFpbmVkIGxvY2FsbHkgb3IgZnJvbSB0aGUgZGF0YWJhc2Ugc2VydmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhbGwtZmllbGRzLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgcmVhZCB2YWx1ZXMgb2YgYWxsIGZpZWxkcyBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2VkLWZpZWxkcy1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIG9yaWdpbmFsIHJlYWQgdmFsdWVzIG9mIG9ubHkgdGhlIGNoYW5nZWQgZmllbGRzIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlbGVjdGVkLWZpZWxkcy1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIG9yaWdpbmFsIHJlYWQgdmFsdWVzIG9mIGEgc3BlY2lmaWVkIHNldCBvZiBmaWVsZHMgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBzZXQgb2YgZmllbGRzIHRvIGNvbXBhcmUgb24gdXBkYXRlIGFuZCBkZWxldGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jaW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgZGF0YWJhc2UgZ2VuZXJhdGVkIHVuaXF1ZSBpZCBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGdlbmVyYXRvci4gIFRoaXMgY291bGQgYmUgdGhlIG5hbWUgb2YgYSBzZXF1ZW5jZSBvYmplY3QsIG9yIGEgcm93IHZhbHVlIGluIGEgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBmaWVsZC9jb2x1bW4gdGhhdCB0aGUgZ2VuZXJhdGVkIHNlcXVlbmNlIGlkIGlzIGFzc2lnbmVkIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgY2FjaGluZyB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmdWxsIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2FjaGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3ZWFrLXJlZmVyZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNvZnQtcmVmZXJlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic29mdC1jYWNoZS13ZWFrLXJlZmVyZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhhcmQtY2FjaGUtd2Vhay1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FjaGluZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MnIGluc3RhbmNlcyBzaG91bGQgYmUgY2FjaGVkIGFuZCBob3cgb2JqZWN0IGlkZW50aXR5IHNob3VsZCBiZSBtYWludGFpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ic29mdC1jYWNoZS13ZWFrLXJlZmVyZW5jZSIgbmFtZT0iY2FjaGUtdHlwZSIgdHlwZT0iY2FjaGUtdHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgdHlwZSBvZiBjYWNoaW5nLCBzdWNoIGFzIExSVSwgd2VhayByZWZlcmVuY2Ugb3Igbm9uZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjEwMCIgbmFtZT0iY2FjaGUtc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGluaXRpYWwgb3IgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJhbHdheXMtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIHJlZnJlc2ggY2FjaGVkIG9iamVjdHMgb24gcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJvbmx5LXJlZnJlc2gtY2FjaGUtaWYtbmV3ZXItdmVyc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gcmVmcmVzaCBpZiB0aGUgY2FjaGVkIG9iamVjdCBpcyBhbiBvbGRlciB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImRpc2FibGUtY2FjaGUtaGl0cyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRpc2FibGUgb2J0YWluaW5nIGNhY2hlIGhpdHMgb24gcHJpbWFyeSBrZXkgcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJhbHdheXMtY29uZm9ybSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGNvbmZvcm0gcXVlcmllcyB3aXRoaW4gYSB0cmFuc2FjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJpc29sYXRlZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgb2JqZWN0cyBvZiB0aGlzIHR5cGUgc2hvdWxkIGJlIGlzb2xhdGVkIGZyb20gdGhlIHNoYXJlZCBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Imlzb2xhdGUtbmV3LWRhdGEtYWZ0ZXItdHJhbnNhY3Rpb24iIG5hbWU9InVuaXRvZndvcmstaXNvbGF0aW9uLWxldmVsIiB0eXBlPSJ1bml0b2Z3b3JrLWlzb2xhdGlvbi1sZXZlbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHVuaXQgb2Ygd29yayBzaG91bGQgYmUgaXNvbGF0ZWQgdG8gdGhlIHNlc3Npb24gY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5IiB0eXBlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImNoYW5nZS1zZXQiIG5hbWU9ImNhY2hlLXN5bmMtdHlwZSIgdHlwZT0iY2FjaGUtc3luYy10eXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgdHlwZSBvZiBjYWNoZSBzeW5jaHJvbml6YXRpb24gdG8gYmUgdXNlZCB3aXRoIHRoaXMgZGVzY3JpcG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZS1pbnZhbGlkYXRpb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVwZGF0ZS1yZWFkLXRpbWUtb24tdXBkYXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm8tZXhwaXJ5LWNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5IHdoZXJlIG9iamVjdHMgaW4gdGhlIGNhY2hlIGRvIG5vdCBleHBpcmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNhY2hlLWludmFsaWRhdGlvbiIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZS10by1saXZlLWNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5IHdoZXJlIG9iamVjdHMgbGl2ZSBhIHNwZWNpZmljIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhleSBhcmUgcmVhZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGltZS10by1saXZlIiB0eXBlPSJ4c2Q6bG9uZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhaWx5LWNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DYWNoZSBpbnZhbGlkYXRpb24gUG9saWN5IHdoZXJlIG9iamVjdHMgZXhwaXJlIGF0IGEgc3BlY2lmaWMgdGltZSBldmVyeSBkYXk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5LXRpbWUiIHR5cGU9InhzZDpkYXRlVGltZSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiBvYmplY3RzIGFyZSB0byBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJoYW5kbGUtd3JpdGVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UtZGF0YWJhc2UtdGltZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXRhYmxlcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgbmFtZXMgb2YgdGhlIG1pcnJvcmluZyBoaXN0b3JpY2FsIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Imhpc3RvcnktdGFibGUiIHR5cGU9Imhpc3RvcnktdGFibGUiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0YXJ0LWZpZWxkcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc3RhcnQgZmllbGRzIGZvciBlYWNoIGhpc3RvcmljYWwgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzdGFydC1maWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImVuZC1maWVsZHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGVuZCBmaWVsZHMgZm9yIGVhY2ggaGlzdG9yaWNhbCB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImVuZC1maWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaGlzdG9yeS10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkVhY2ggZW50cnkgaXMgYSBzb3VyY2UgKGRlc2NyaXB0b3IpIHRvIGhpc3RvcnkgdGFibGUgbmFtZSBhc3NvY2lhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IiIgbmFtZT0ic291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMSIgbmFtZT0iaGlzdG9yeSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmV0dXJuaW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgcmV0dW5pbmcgcG9saWN5LiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIHJldHVybmluZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBuYW1lPSJyZXR1cm5pbmctZmllbGQtaW5mb3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIHRoZSBmaWVsZHMgdG8gYmUgcmV0dXJuZWQgdG9nZXRoZXIgd2l0aCB0aGUgZmxhZ3MgZGVmaW5pbmcgcmV0dXJuaW5nIG9wdGlvbnM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InJldHVybmluZy1maWVsZC1pbmZvIiB0eXBlPSJyZXR1cm5pbmctZmllbGQtaW5mbyIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXR1cm5pbmctZmllbGQtaW5mbyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZpZWxkIHRvIGJlIHJldHVybmVkIHRvZ2V0aGVyIHdpdGggdHlwZSBhbmQgdGhlIGZsYWdzIGRlZmluaW5nIHJldHVybmluZyBvcHRpb25zLiBBdCBsZWFzdCBvbmUgb2YgaW5zZXJ0LCB1cGRhdGUgc2hvdWxkIGJlIHRydWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdGFyZ2V0IHJlZmVyZW5jZWQgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgdG8gYmUgcmV0dXJuZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iaW5zZXJ0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBiZSByZXR1bmVkIGFmdGVyIEluc2VydC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJpbnNlcnQtbW9kZS1yZXR1cm4tb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIGluc2VydD09dHJ1ZSwgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBub3QgYmUgaW5zZXJ0ZWQgKHRydWUpLiBJZiBpbnNlcnQ9PWZhbHNlIC0gaWdub3JlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgc2hvdWxkIGJlIHJldHVuZWQgYWZ0ZXIgSW5zZXJ0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmhlcml0YW5jZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MgaXMgcmVsYXRlZCBpbiBpbmhlcml0YW5jZSBhbmQgaG93IHRoaXMgaW5oZXJpdGFuY2UgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGFyZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcGFyZW50L3N1cGVyY2xhc3Mgb2YgdGhlIGNsYXNzIGJlaW5nIHBlcnNpc3RlZC4gIFRoZSBjbGFzcyBuYW1lIG11c3QgYmUgZnVsbCBxdWFsaWZpZWQgICB3aXRoIGl0cyBwYWNrYWdlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0icmVhZC1zdWJjbGFzc2VzLW9uLXF1ZXJpZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgaWYgc3ViY2xhc3NlcyBvZiB0aGUgY2xhc3Mgc2hvdWxkIGJlIHJldHVybmVkIG9uIHF1ZXJpZXMsIG9yIG9ubHkgdGhlIGV4YWN0IGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWxsLXN1YmNsYXNzZXMtdmlldyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBuYW1lIG9mIGEgdmlldyB0aGF0IGpvaW5zIGFsbCBvZiB0aGUgc3ViY2xhc3MnIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UtY2xhc3MtbmFtZS1hcy1pbmRpY2F0b3IiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBjbGFzcyB0eXBlIGluZGljYXRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWV4dHJhY3Rpb24tbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiBhIG1ldGhvZCBvbiB0aGUgY2xhc3MgdGhhdCB0YWtlcyB0aGUgY2xhc3MnIHJvdyBhcyBhcmd1bWVudCBhIGNvbXB1dGVkIHRoYXQgY2xhc3MgdHlwZSB0byBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGZyb20gdGhlIHJvdy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWluZGljYXRvci1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSB0eXBlIGZpZWxkL2NvbHVtbiB0aGF0IHRoZSBjbGFzcyB0eXBlIGlzIHN0b3JlZCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIiB0eXBlPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgY2xhc3MgaW5kaWNhdG9yIHZhbHVlcyBhbmQgdGhlIHN1YmNsYXNzZXMgdGhleSBtYXAgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1leHRyYWN0b3IiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgY2xhc3MgZXh0cmFjdG9yIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im9ubHktaW5zdGFuY2VzLWNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNyaXRlcmlhIHRoYXQgZmlsdGVycyBvdXQgYWxsIHNpYmxpbmcgYW5kIHN1YmNsYXNzIGluc3RhbmNlcyBvbiBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWxsLXN1YmNsYXNzZXMtY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY3JpdGVyaWEgdGhhdCBmaWx0ZXJzIG91dCBzaWJsaW5nIGluc3RhbmNlcyBvbiBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Im91dGVyLWpvaW4tc3ViY2xhc3NlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBpbmhlcml0YW5jZSBxdWVyaWVzIHNwZWNpZnkgaWYgYWxsIHN1YmNsYXNzZXMgc2hvdWxkIGJlIG91dGVyIGpvaW5lZCwgaW5zdGVhZCBvZiBhIHF1ZXJ5IHBlciBzdWJjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icW5hbWUtaW5oZXJpdGFuY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXh0ZW5kcyBpbmhlcml0YW5jZSBwb2xpY3kuIEFsbG93cyBmb3IgcHJlZml4ZWQgbmFtZXMgdG8gYmUgcmVzb2x2ZWQgYXQgcnVudGltZSB0byBmaW5kIHRoZSBhcHByb3JpYXRlIGNsYXNzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluaGVyaXRhbmNlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBjbGFzcyBpbmRpY2F0b3IgdmFsdWVzIGFuZCB0aGUgc3ViY2xhc3NlcyB0aGV5IG1hcCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0aGUgdHlwZSBtYXBzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLWluZGljYXRvciIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCB2YWx1ZSB1c2VkIHRvIGRlZmluZSB0aGUgY2xhc3MgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJldmVudC1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwZXJzaXN0ZW50IGV2ZW50cyBmb3IgdGhpcyBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImV2ZW50LWxpc3RlbmVycyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJldmVudC1saXN0ZW5lciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGFuIGV2ZW50IGxpc3RlbmVyIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgZGVzY3JpcHRvciBldmVudCBsaXN0ZW5lciBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtYnVpbGQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgYnVpbGRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS13cml0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgd3JpdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC13cml0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciB3cml0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtaW5zZXJ0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSBpbnNlcnRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtaW5zZXJ0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGluc2VydGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLXVwZGF0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgdXBkYXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtdXBkYXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIHVwZGF0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtZGVsZXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSBkZWxldGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1kZWxldGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgZGVsZXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFib3V0LXRvLWluc2VydC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgaW5zZXJ0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhYm91dC10by11cGRhdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIHVwZGF0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWNsb25lLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGNsb25pbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtbWVyZ2UtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgbWVyZ2luZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1yZWZyZXNoLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIHJlZnJlc2hpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZGVmaW5lZCBxdWVyaWVzIGFuZCBxdWVyeSBwcm9wZXJ0aWVzIGZvciB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyaWVzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5IiB0eXBlPSJxdWVyeSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSBkZWZpbml0aW9uIGZvciB0aGUgY2xhc3MnIGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGltZW91dCIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIHRpbWVvdXQgdG8gYXBwbHkgdG8gYWxsIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJjaGVjay1jYWNoZSIgbmFtZT0iZXhpc3RlbmNlIiB0eXBlPSJleGlzdGVuY2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgYmVoYXZvaXIgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdCB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zZXJ0LXF1ZXJ5IiB0eXBlPSJpbnNlcnQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gaW5zZXJ0IHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IGluc2VydCBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ1cGRhdGUtcXVlcnkiIHR5cGU9InVwZGF0ZS1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSB1cGRhdGUgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgdXBkYXRlIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1xdWVyeSIgdHlwZT0iZGVsZXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIGRlbGV0ZSBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCBkZWxldGUgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZG9lcy1leGlzdC1xdWVyeSIgdHlwZT0iZG9lcy1leGlzdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIGRvZXMgZXhpc3QgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgZGVsZXRlIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlYWQtb2JqZWN0LXF1ZXJ5IiB0eXBlPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIHJlYWQgb2JqZWN0IHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IHJlYWQgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVhZC1hbGwtcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gcmVhZCBhbGwgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgcmVhZCBhbGwgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgZXhpc3RlbmNlIHBvbGljaWVzIGZvciBkZXRlcm1pbmluZyBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stY2FjaGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1kYXRhYmFzZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1leGlzdGVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtbm9uLWV4aXN0ZW5jZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBxdWVyeWluZyBkYXRhYmFzZSBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkta2V5IGFsaWFzIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLXN5bmMtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0eXBlIG9mIGNhY2hlIHN5bmNocm9uaXphdGlvbiB0byB1c2Ugd2l0aCBhIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbnZhbGlkYXRpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuby1jaGFuZ2VzIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hhbmdlLXNldC13aXRoLW5ldy1vYmplY3RzIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hhbmdlLXNldCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InVuaXRvZndvcmstaXNvbGF0aW9uLWxldmVsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHVuaXQgb2Ygd29yayBpc29sYXRlZCBmcm9tIHRoZSBzZXNzaW9uIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXNlLXNlc3Npb24tY2FjaGUtYWZ0ZXItdHJhbnNhY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpc29sYXRlLW5ldy1kYXRhLWFmdGVyLXRyYW5zYWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXNvbGF0ZS1jYWNoZS1hZnRlci10cmFuc2FjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imlzb2xhdGUtY2FjaGUtYWx3YXlzIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1xdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIGRhdGFiYXNlIGNvbHVtbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icXVlcnkta2V5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gYmVpbmcgYWxpYXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwLXF1ZXJ5LWtleSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIGpvaW4gdG8gYW5vdGhlciBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InF1ZXJ5LWtleSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHRhcmdldCByZWZlcmVuY2VkIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgam9pbiBjb25kaXRpb24gYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgY2xhc3MnIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBqb2luIGNyaXRlcmlhIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGNsYXNzJyB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZS1xdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIDEtMSBqb2luIHRvIGFub3RoZXIgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtcXVlcnkta2V5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueS1xdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIDEtbSBqb2luIGZyb20gYW5vdGhlciBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtcXVlcnkta2V5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIGZyb20gYW4gYXR0aXJidXRlIHRvIGEgc2ltcGxlIGZpZWxkIGRhdGF0eXBlLCBpLmUuIFN0cmluZywgTnVtYmVyLCBEYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgYW5kIG9wdGlvbmFsbHkgdGhlIHRhYmxlIG9mIHRoZSBmaWVsZC9jb2x1bW4gdGhhdCB0aGUgYXR0cmlidXRlIGlzIHN0b3JlZCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im51bGwtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGEgdmFsdWUgdGhhdCBudWxsIGRhdGEgdmFsdWVzIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtY2xhc3NpZmljYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGF0dHJpYnV0ZSBpcyBwZXJzaXN0ZWQuIFRoZSBhdHRyaWJ1dGUgbWFwcGluZyBkZWZpbml0aW9uIGlzIGV4dGVuZGFibGUgdG8gYWxsb3cgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiAgVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgYXR0cmlidXRlIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlYWQtb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBnZXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHNldCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9wZXJ0aWVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdXNlciBkZWZpbmVkIHByb3BlcnRpZXMgdG8gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icHJvcGVydHkiIHR5cGU9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHVzZXIgZGVmaW5lZCBwcm9wZXJ0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgc2ltcGxlIGF0dHJpYnV0ZSBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIGZyb20gYW4gYXR0aXJidXRlIHRvIGEgc2ltcGxlIGZpZWxkIGRhdGF0eXBlLCBpLmUuIFN0cmluZywgTnVtYmVyLCBEYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLWNkYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXBvbGljeSIgdHlwZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBmcm9tIGFuIGF0dGlyYnV0ZSB0byBhIHNpbXBsZSBmaWVsZCBkYXRhdHlwZSwgaS5lLiBTdHJpbmcsIE51bWJlciwgRGF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBmaWVsZCB0cmFuc2Zvcm1hdGlvbiBmb3IgYSB0cmFuc2Zvcm1hdGlvbiBtYXBwaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtYmFzZWQtZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtZXItYmFzZWQtZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHRyYW5zZm9ybWF0aW9uIG1hcHBpbmcgdGhhdCB1c2VzIEphdmEgY29kZSB0byB0cmFuc2Zvcm0gYmV0d2VlbiB0aGUgZGF0YSBhbmQgb2JqZWN0IHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRyYW5zZm9ybWF0aW9uIGRlZmluZWQgaW4gdGhlIGRvbWFpbiBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS10cmFuc2Zvcm1lciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRyYW5zZm9ybWVyLiBVc2VkIGluIHBsYWNlIG9mIGF0dHJpYnV0ZS10cmFuc2Zvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQtdHJhbnNmb3JtYXRpb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCB0cmFuc2Zvcm1hdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiIgdHlwZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWdncmVnYXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHJlbGF0aW9uc2hpcCB3aGVyZSB0aGUgdGFyZ2V0IG9iamVjdCBpcyBzdHJpY3RseSBwcml2YXRlbHkgb3duZWQgYnkgdGhlIHNvdXJjZSBvYmplY3QgYW5kIHN0b3JlcyB3aXRoaW4gdGhlIHNvdXJjZSBvYmplY3RzIHJvdzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHRhcmdldCBjbGFzcyBvZiB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iYWxsb3ctbnVsbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiBhIHJvdyBvZiBhbGwgbnVsbHMgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIG51bGwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZC10cmFuc2xhdGlvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHRoZSBtYXBwaW5nIHRvIHVzZSBkaWZmZXJlbnQgZmllbGQgbmFtZXMgdGhhbiB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRyYW5zbGF0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIGluIHRoZSBzb3VyY2UgZGVzY3JpcHRvcidzIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIGluIHRoZSBhZ2dyZWdhdGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gY2xhc3NlcyBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdGFyZ2V0IGNsYXNzIG9mIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgdGFyZ2V0IG9iamVjdHMgYXJlIHByaXZhdGVseSBvd25lZCBkZXBlbmRlbnQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGNyZWF0ZSBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBjcmVhdGUgb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSByZWZyZXNoIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSByZW1vdmUgb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtb25lLXRvLW9uZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9uZS10by1vbmUtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgdGFyZ2V0IGNsYXNzJyB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0cyBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLW9uZS10by1tYW55LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzb3VyY2UtZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRhcmdldC1mb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXktZ3JvdXBpbmctZWxlbWVudCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0cyBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbGxlY3Rpb24gb2Ygc2ltcGxlIHR5cGVzIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gYSBzZXQgb2Ygc2ltcGxlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9ImRhdGEtcmVhZC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLXRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIHNvdXJjZSBwcmltYXJ5IGtleSBhbmQgdGhlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpcmVjdC1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBpbiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnNlcnQtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gaW5zZXJ0IGEgcm93IGludG8gdGhlIHJlZmVyZW5jZSB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhIHJvdyBmcm9tIHRoZSByZWZlcmVuY2UgdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcm93cyBmcm9tIHRoZSByZWZlcmVuY2UgdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlc3Npb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBzZXNzaW9uIHRoYXQgZGVmaW5lcyB0aGUgcmVmZXJlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS1wb2xpY3kiIHR5cGU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2YgdGhpcyBhdHRyaWJ1dGUgYXJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBoaXN0b3J5IHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1tYXAtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXAgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byBhIHNldCBvZiBrZXkgdmFsdWVzIHBhaXJzIG9mIHNpbXBsZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpcmVjdC1rZXktZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gaW4gdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IHNvcmVzIHRoZSBtYXAga2V5IGRhdGEgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJrZXktY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUga2V5IGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhZ2dyZWdhdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzIHdoZXJlIHRoZSB0YXJnZXQgaW5zdGFuY2VzIGFyZSBzdHJpY3RseSBwcml2YXRlbHkgb3duZWQgYnkgdGhlIHNvdXJjZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHRhcmdldCBjbGFzcycgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByZWxhdGVkIG9iamVjdHMgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tbWFueS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG0tbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGF0aW9uLXRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbiB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgc291cmNlL3RhcmdldCBwcmltYXJ5IGtleXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLXJlbGF0aW9uLWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZnJvbSB0aGUgcmVsYXRpb25hbCB0YWJsZSB0byB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtcmVsYXRpb24tZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmcm9tIHRoZSByZWxhdGlvbmFsIHRhYmxlIHRvIHRoZSB0YXJnZXQgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnNlcnQtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gaW5zZXJ0IGEgcm93IGludG8gdGhlIHJlbGF0aW9uIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGEgcm93IGZyb20gdGhlIHJlbGF0aW9uIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJvd3MgZnJvbSB0aGUgcmVsYXRpb24gdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktcG9saWN5IiB0eXBlPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIHRoaXMgYXR0cmlidXRlIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gaGlzdG9yeSBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZSB0aGF0IG1heSBiZSBvZiBzZXZlcmFsIHR5cGVzIHJlbGF0ZWQgdGhyb3VnaCBhbiBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBjb2x1bW4gdG8gc3RvcmUgdGhlIGNsYXNzIHR5cGUgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0IGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmVpZ24ta2V5LXRvLXF1ZXJ5LWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBzb3VyY2UvdGFyZ2V0IGNvbHVtbi9xdWVyeSBrZXkgcmVmZXJlbmNlcyByZWxhdGluZyBhIGZvcmVpZ24ga2V5IGluIG9uZSB0YWJsZSB0byB0aGUgcXVlcnkga2V5cyBkZWZpbmluZyBhIHByaW1hcnkgb3IgdW5pcXVlIGtleSB2YWx1ZSBpbiB0aGUgb3RoZXIgaW50ZXJmYWNlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkta2V5LXJlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcmVmZXJlbmNlIG9mIGEgc291cmNlIHRhYmxlIGZvcmVpZ24ga2V5IGFuZCBhIHRhcmdldCBpbnRlcmZhY2UgZGVzY3JpcHRvciBxdWVyeSBrZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmaWVsZC9jb2x1bW4gbmFtZSBpbiB0aGUgc291cmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1xdWVyeS1rZXkiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IGtleSBuYW1lIG9mIHRoZSB0YXJnZXQgaW50ZXJmYWNlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIiB0eXBlPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBjbGFzcyBpbmRpY2F0b3IgdmFsdWVzIGFuZCB0aGUgc3ViY2xhc3NlcyB0aGV5IG1hcCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb250YWluZXIvY29sbGVjdGlvbiB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29sbGVjdGlvbi10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzb3J0ZWQtY29sbGVjdGlvbi1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHNvcnRlZCBjb2xsZWN0aW9uIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbXBhcmF0b3ItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29tcGFyaXRvciwgdXNlZCB0byBjb21wYXJlIG9iamVjdHMgaW4gc29ydGluZyB0aGUgY29sbGVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibGlzdC1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGxpc3QgY29sbGVjdGlvbiB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAtY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXAgY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1hcC1rZXktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIHRhcmdldCBvYmplY3RzIHRvIGdldCB0aGUga2V5IHZhbHVlIGZvciB0aGUgbWFwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtbWFwLWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IG1hcCBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Nyb2xsYWJsZS1jdXJzb3ItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHNjcm9sbGFibGUgY3Vyc29yIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjdXJzb3JlZC1zdHJlYW0tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGN1cnNvcmVkIHN0cmVhbSBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5kaXJlY3Rpb24tcG9saWN5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkZWZlcnJlZCByZWFkIGluZGlyZWN0aW9uIG1lY2hhbmlzbS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbHVlLWhvbGRlci1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIHZhbHVlIGhvbGRlcnMgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3h5LWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgcHJveGllcyB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwYXJlbnQtY29sbGVjdGlvbi1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIHRyYW5zcGFyZW50IGNvbGxlY3Rpb25zIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb2xsZWN0aW9uLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiBpbnRlcmZhY2UgdG8gdXNlLCBpLmUuIExpc3QsIFNldCwgTWFwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWFwLWtleS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgdGFyZ2V0IG9iamVjdHMgdG8gZ2V0IHRoZSBrZXkgdmFsdWUgZm9yIHRoZSBtYXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnRhaW5lci1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIGEgdXNlciBkZWZpbmVkIGNvbnRhaW5lciB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbnRhaW5lciBpbXBsZW1lbnRlciB0byB1c2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGVzYWZlLWVudW1lcmF0aW9uLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlR5cGVzYWZlIEVudW1lcmF0aW9uIGNvbnZlcnNpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLWNvbnZlcnNpb24tY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBkYXRhIHR5cGUgYW5kIGFuIG9iamVjdCB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgdG8gY29udmVydCBiZXR3ZWVuLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im9iamVjdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRhdGEtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlcyBzdG9yYWdlIGRhdGEgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VyaWFsaXplZC1vYmplY3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyBvYmplY3Qgc2VyaWFsaXphdGlvbiB0byBjb252ZXJ0IGJldHdlZW4gdGhlIG9iamVjdCBhbmQgZGF0YSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGVzIHN0b3JhZ2UgZGF0YSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSBtYXBwaW5nIG9mIHZhbHVlcyBmcm9tIGRhdGFiYXNlIHZhbHVlcyB1c2VkIGluIHRoZSBmaWVsZCBhbmQgb2JqZWN0IHZhbHVlcyB1c2VkIGluIHRoZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QW4gb3B0aW9uYWwgZGVmYXVsdCB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkLiAgVGhpcyB2YWx1ZSBpcyB1c2VkIGlmIGEgZGF0YWJhc2UgdHlwZSBpcyBub3QgZm91bmQgaW4gdGhlIHR5cGUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLW1hcHBpbmdzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWFwcGluZyBvZiB2YWx1ZXMuICBCb3RoIHRoZSBvYmplY3QgYW5kIGRhdGFiYXNlIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ0eXBlLW1hcHBpbmciIHR5cGU9InR5cGUtbWFwcGluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBvYmplY3QgYW5kIGRhdGEgdmFsdWUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW9ubHktdHlwZS1tYXBwaW5ncyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSBtYXBwaW5nIG9mIGFkZGl0aW9uYWwgdmFsdWVzIHRoYXQgbWFwIG5vbi11bmlxdWUgZGF0YSB2YWx1ZXMgdG8gYSB1bmlxdWUgYXR0cmlidXRlIHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InR5cGUtbWFwcGluZyIgdHlwZT0idHlwZS1tYXBwaW5nIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIG9iamVjdCBhbmQgZGF0YSB2YWx1ZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSBhbiBvYmplY3QgYW5kIGRhdGEgdmFsdWUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIHZhbHVlIHRvIHVzZSBpbiB0aGUgb2JqZWN0J3MgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIHZhbHVlIHRvIHVzZSBpbiB0aGUgZGF0YWJhc2UgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeS9pbnRlcmFjdGlvbiBhZ2FpbnN0IGEgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJtYWludGFpbi1jYWNoZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgYnlwYXNzIHRoZSBjYWNoZSBjb21wbGV0ZWx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgdXNlIHBhcmFtYXRlciBiaW5kaW5nIGZvciBhcmd1bWVudHMsIG9yIHByaW50IHRoZSBhcmd1bWVudHMgaW4tbGluZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhY2hlLXN0YXRlbWVudCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyaWVzIHN0YXRlbWVudCBzaG91bGQgYmUgY2FjaGVkLCB0aGlzIG11c3QgYmUgdXNlZCB3aXRoIHBhcmFtZXRlciBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGltZW91dCIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgdGltZW91dCB0byBjYW5jZWwgdGhlIHF1ZXJ5IGluIGlmIHRoZSByZXF1ZXN0IHRha2VzIHRvbyBsb25nIHRvIGNvbXBsZXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0icHJlcGFyZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgcHJlcGFyZSBhbmQgY2FjaGUgaXRzIGdlbmVyYXRlZCBTUUwsIG9yIHJlZ2VuZXJhdGUgdGhlIFNRTCBvbiBlYWNoIGV4ZWN1dGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhbGwiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBzdGF0aWMgY2FsbHMgdGhlIFNRTCBvciBTdG9yZWQgUHJvY2VkdXJlIGNhbGwgZGVmaW5pdGlvbiBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBqb2luIGZldGNoIG9wdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5uZXItam9pbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im91dGVyLWpvaW4iIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYXNjYWRlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBjYXNjYWRlIHBvbGljaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InByaXZhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtcmVhZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZyBhIHNpbmdsZSB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGlyZWN0LXJlYWQtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1yZWFkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nIGEgY29sbGVjdGlvbiBvZiB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGEtcmVhZC1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YS1yZWFkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nIHJhdyBkYXRhLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWFkLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FjaGUtcXVlcnktcmVzdWx0cyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgY2FjaGUgdGhlIHF1ZXJ5IHJlc3VsdHMgdG8gYXZvaWQgZnV0dXJlIGV4ZWN1dGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYXgtcm93cyIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIGZldGNoLCByZXN1bHRzIHdpbGwgYmUgdHJ1bmN0YXRlIG9uIHRoZSBkYXRhYmFzZSB0byB0aGlzIHNpemUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaXJzdC1yZXN1bHQiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB3aGVyZSB0byBzdGFydCB0aGUgY3Vyc29yIGluIGEgcmVzdWx0IHNldCByZXR1cm5lZCBmcm9tIHRoZSBkYXRhYmFzZS4gUmVzdWx0cyBwcmlvciB0byB0aGlzIG51bWJlciB3aWxsIG5vdCBiZSBidWlsdCBpbnRvIG9iamVjdHM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllc3MgdGhlIG51bWJlciBvZiByb3dzIHRvIGZldGNoIGZyb20gdGhlIGRhdGFiYXNlIG9uIGVhY2ggcmVzdWx0IHNldCBuZXh0IG9wZXJhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJ5LXJlc3VsdC1jYWNoZS1wb2xpY3kiIHR5cGU9InF1ZXJ5LXJlc3VsdC1jYWNoZS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHF1ZXJ5IHJlc3VsdHMgc2hvdWxkIGJlIGNhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktcmVzdWx0LWNhY2hlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgcXVlcnkncyByZXN1bHRzIHNob3VsZCBiZSBjYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnZhbGlkYXRpb24tcG9saWN5IiB0eXBlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMTAwIiBuYW1lPSJtYXhpbXVtLWNhY2hlZC1yZXN1bHRzIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBkZWZpbmVzIHRoZSBudW1iZXIgb2YgcXVlcnkgcmVzdWx0IHNldHMgdGhhdCB3aWxsIGJlIGNhY2hlZC4gVGhlIExSVSBxdWVyeSByZXN1bHRzIHdpbGwgYmUgZGlzY2FyZGVkIHdoZW4gdGhlIG1heCBzaXplIGlzIHJlYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBtYW5pcHVsYXRpbmcgZGF0YS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1tb2RpZnktcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBtb2RpZnlpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXBkYXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgdXBkYXRpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnNlcnQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBpbnNlcnRpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWxldGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBkZWxldGluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1tb2RpZnktcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRvZXMtZXhpc3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGRldGVybWluaW5nIGlmIGFuIG9iamVjdCBleGlzdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJleGlzdGVuY2UtY2hlY2siIHR5cGU9ImV4aXN0ZW5jZS1jaGVjayI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZXhpc3RlbmNlIGNoZWNrIG9wdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJleGlzdGVuY2UtY2hlY2siPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgZXhpc3RlbmNlIGNoZWNrIG9wdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1jYWNoZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWRhdGFiYXNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLWV4aXN0ZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1ub24tZXhpc3RlbmNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGRlbGV0aW5nIGEgY3JpdGVyaWEgb2Ygb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1sZXZlbC1yZWFkLXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3Igb2JqZWN0cyAoYXMgYXBwb3NlZCB0byBkYXRhKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVhZC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxsIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyBvZiBvYmplY3RzIGJlaW5nIHF1ZXJpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIHJlZnJlc2ggYW55IGNhY2hlZCBvYmplY3RzIGZyb20gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlbW90ZS1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgcmVmcmVzaCBhbnkgcmVtb3RlbHkgY2FjaGVkIG9iamVjdHMgZnJvbSB0aGUgc2VydmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iY2FzY2FkZS1wb2xpY3kiIHR5cGU9ImNhc2NhZGUtcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcmllcyBzZXR0aW5ncyAoc3VjaCBhcyByZWZyZXNoLCBtYWludGFpbi1jYWNoZSkgc2hvdWxkIGFwcGx5IHRvIHRoZSBvYmplY3QncyByZWxhdGlvbnNoaXAgcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InByaW1hcnkta2V5IiBuYW1lPSJjYWNoZS11c2FnZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgcXVlcnkgc2hvdWxkIGludGVyYWN0IHdpdGggdGhlIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0ibG9jay1tb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCBsb2NrIHRoZSByZXN1bHRpbmcgcm93cyBvbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJkaXN0aW5jdC1zdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgZmlsdGVyIGRpc3RpbmN0IHJlc3VsdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbi1tZW1vcnktcXVlcnlpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluIG1lbW9yeSBxdWVyeWluZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBkZWZhdWx0PSJpZ25vcmUtZXhjZXB0aW9ucy1yZXR1cm4tY29uZm9ybWVkIiBuYW1lPSJwb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgaW5kaXJlY3Rpb24gb3IgdW5jb25mb3JtYWJsZSBleHByZXNzaW9ucyBzaG91bGQgYmUgdHJlYXRpbmcgd2l0aCBpbi1tZW1vcnkgcXVlcnlpbmcgYW5kIGNvbmZvcm1pbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InVzZS1kZWZhdWx0LWZldGNoLWdyb3VwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBkZWZhdWx0IGZldGNoIGdyb3VwIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1ncm91cCIgdHlwZT0iZmV0Y2gtZ3JvdXAiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIHF1ZXJ5IHRvIHBhcnRpYWxseSBmZXRjaCB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtZ3JvdXAtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGEgcHJlLWRlZmluZWQgbmFtZWQgZmV0Y2ggZ3JvdXAgdG8gYWxsb3cgdGhlIHF1ZXJ5IHRvIHBhcnRpYWxseSBmZXRjaCB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS1leGNsdXNpdmUtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgZXhjbHVzaXZlIGNvbm5lY3Rpb24gKFZQRCkgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImpvaW5lZC1hdHRyaWJ1dGUtZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBhdHRyaWJ1dGVzIGJlaW5nIGpvaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBqb2luaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgb2JqZWN0cyByZXN1bHRpbmcgZnJvbSB0aGUgcXVlcnkgYXJlIHJlYWQtb25seSwgYW5kIHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQgaW4gdGhlIHVuaXQgb2Ygd29yay48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJvdXRlci1qb2luLXN1YmNsYXNzZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBpbmhlcml0YW5jZSBxdWVyaWVzIHNwZWNpZnkgaWYgYWxsIHN1YmNsYXNzZXMgc2hvdWxkIGJlIG91dGVyIGpvaW5lZCwgaW5zdGVhZCBvZiBhIHF1ZXJ5IHBlciBzdWJjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1hbGwtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGEgc2V0IG9mIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1sZXZlbC1yZWFkLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJhdGNoLXJlYWQtYXR0cmlidXRlLWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhbGwgYXR0cmlidXRlcyBmb3IgYmF0Y2ggcmVhZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBiYXRjaCByZWFkaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im9yZGVyLWJ5LWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNldHMgdGhlIG9yZGVyIGV4cHJlc3Npb25zIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3Igb3JkZXJpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgYSBzaW5nbGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbGV2ZWwtcmVhZC1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVwb3J0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+UXVlcnkgZm9yIGluZm9ybWF0aW9uIGFib3V0IGEgc2V0IG9mIG9iamVjdHMgaW5zdGVhZCBvZiB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuLWNob2ljZSIgdHlwZT0icmV0dXJuLWNob2ljZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TaW1wbGlmaWVzIHRoZSByZXN1bHQgYnkgb25seSByZXR1cm5pbmcgdGhlIGZpcnN0IHJlc3VsdCwgZmlyc3QgdmFsdWUsIG9yIGFsbCBhdHRyaWJ1dGUgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0cmlldmUtcHJpbWFyeS1rZXlzIiB0eXBlPSJyZXRyaWV2ZS1wcmltYXJ5LWtleXMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdldGhlciB0aGUgcHJpbWFyeSBrZXkgdmFsdWVzIHNob3VsZCBhbHNvIGJlIHJldHJpZXZlZCBmb3IgdGhlIHJlZmVyZW5jZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlcG9ydC1pdGVtcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JdGVtcyB0byBiZSBzZWxlY3RlZCwgdGhlc2UgY291bGQgYmUgYXR0cmlidXRlcyBvciBhZ2dyZWdhdGUgZnVuY3Rpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaXRlbSIgdHlwZT0icmVwb3J0LWl0ZW0iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBpdGVtIHJlcXVlc3RlZDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJncm91cC1ieS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXRzIEdST1VQIEJZIGV4cHJlc3Npb25zIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3IgZ3JvdXBpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJldHVybi1jaG9pY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TaW1wbGlmaWVzIHRoZSByZXN1bHQgYnkgb25seSByZXR1cm5pbmcgdGhlIGZpcnN0IHJlc3VsdCwgZmlyc3QgdmFsdWUsIG9yIGFsbCBhdHRyaWJ1dGUgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmV0dXJuLXNpbmdsZS1yZXN1bHQiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXR1cm4tc2luZ2xlLXZhbHVlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmV0dXJuLXNpbmdsZS1hdHRyaWJ1dGUiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJyZXRyaWV2ZS1wcmltYXJ5LWtleXMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2V0aGVyIHRoZSBwcmltYXJ5IGtleSB2YWx1ZXMgc2hvdWxkIGFsc28gYmUgcmV0cmlldmVkIGZvciB0aGUgcmVmZXJlbmNlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZnVsbC1wcmltYXJ5LWtleSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpcnN0LXByaW1hcnkta2V5IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8tcHJpbWFyeS1rZXkiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVwb3J0LWl0ZW0iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGl0ZW0gcmVxdWVzdGVkIGluIFJlcG9ydFF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk5hbWUgZ2l2ZW4gZm9yIGl0ZW0sIGNhbiBiZSB1c2VkIHRvIHJldGlldmUgdmFsdWUgZnJvbSByZXN1bHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4cHJlc3Npb24gKHBhcnRpYWwpIHRoYXQgZGVzY3JpYmVzIHRoZSBhdHRyaWJ1dGUgd2FudGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJleHByZXNzaW9uIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmaWx0ZXIgZXhwcmVzc2lvbiB0cmVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb24tZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSByZWxhdGlvbiBleHByZXNzaW9uIHRoYXQgY29tcGFyZXMgdG8gZXhwcmVzc2lvbnMgdGhyb3VnaCBvcGVyYXRvcnMgc3VjaCBhcyBlcXVhbCwgbGVzc1RoYW4sIGV0Yy4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsZWZ0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyaWdodCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJvcGVyYXRvciIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naWMtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBleHByZXNzaW9uIGNvbXBvc2VkIG9mIHR3byBzdWItZXhwcmVzc2lvbnMgam9pbmVkIHRocm91Z2ggYW4gb3BlcmF0b3Igc3VjaCBhcyBBTkQsIE9SLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGVmdCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmlnaHQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdHlwZT0ib3BlcmF0b3IiIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZ1bmN0aW9uLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZXhwcmVzc2lvbiBjb21wb3NlZCBvZiBhIGZ1bmN0aW9uIGFwcGxpZWQgdG8gYSBsaXN0IG9mIHN1Yi1leHByZXNzaW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGZ1bmN0aW9uIGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgZXhwcmVzc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmdW5jdGlvbiIgdHlwZT0ib3BlcmF0b3IiIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnN0YW50LWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gdmFsdWUuICBJZiB0aGUgdmFsdWUgaXMgbnVsbCB0aGUgdmFsdWUgdGFnIGNhbiBpcyBhYnNlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWtleS1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIHF1ZXJ5LWtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2UiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbnktb2YiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvdXRlci1qb2luIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzZSIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcmFtZXRlci1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIHBhcmFtZXRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlciIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNlLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gYnVpbGRlci9iYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9wZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIG9wZXJhdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBTUUwgcXVlcnkgbGFuZ3VhZ2Ugc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbCBTUUwgcXVlcnkgc3RyaW5nLiAgQXJndW1lbnRzIGNhbiBiZSBzcGVjaWZpZWQgdGhyb3VnaCAjYXJnLW5hbWUgdG9rZW5zIGluIHRoZSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYnFsLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIEVKQi1RTCBxdWVyeSBsYW5ndWFnZSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpicWwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEVKQi1RTCBxdWVyeSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1wcm9jZWR1cmUtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGludm9jYXRpb24gZGVmaW5pdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImN1cnNvci1vdXRwdXQtcHJvY2VkdXJlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIGNhbGwgdG8gdXNlIGEgY3Vyc29yIG91dHB1dCBwYXJhbWV0ZXIgdG8gZGVmaW5lIHRoZSByZXN1bHQgc2V0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFuZCBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9InByb2NlZHVyZS1hcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9jZWR1cmUuIFRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnRzIG11c3QgbWF0Y2ggdGhlIHByb2NlZHVyZSBhcmd1bWVudHMgaWYgbm90IG5hbWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1mdW5jdGlvbi1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBmdW5jdGlvbiBpbnZvY2F0aW9uIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InN0b3JlZC1wcm9jZWR1cmUtY2FsbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMSIgbmFtZT0ic3RvcmVkLWZ1bmN0aW9uLXJlc3VsdCIgdHlwZT0icHJvY2VkdXJlLW91dHB1dC1hcmd1bWVudCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBzdG9yZWQtZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHN0b3JlZCBwcm9jZWR1cmUgbmFtZSBvZiB0aGUgYXJndW1lbnQuIEZvciBpbmRleGVkIGFyZ3VtZW50IHRoZSBuYW1lIGlzIG5vdCByZXF1aXJlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBuYW1lIG9mIHRoZSBhcmd1bWVudC4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYXMgZGVmaW5lIGluIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGNsYXNzIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtc3FsdHlwZSIgdHlwZT0ieHNkOmludCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpEQkMgaW50IHR5cGUgb2YgdGhlIGFyZ3VtZW50LCBhcyBkZWZpbmVkIGluIGphdmEuamRiYy5UeXBlczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LXNxbHR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHR5cGUgaWYgcHJvY2VkdXJlLWFyZ3VtZW50LXNxbHR5cGUgaXMgU1RSVUNUIG9yIEFSUkFZPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcm9jZWR1cmUgYXJndW1lbnQgdmFsdWUgbWF5YmUgYmUgc3BlY2lmaWVkIGlmIG5vdCB1c2luZyBhIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9jZWR1cmUtb3V0cHV0LWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgY2FsbCBvdXRwdXQgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InByb2NlZHVyZS1hcmd1bWVudCIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvY2VkdXJlLWlub3V0cHV0LWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgY2FsbCBvdXRwdXQgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InByb2NlZHVyZS1hcmd1bWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im91dHB1dC1hcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBuYW1lIG9mIHRoZSBhcmd1bWVudC4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYXMgZGVmaW5lIGluIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtc3RvcmVkLXByb2NlZHVyZS1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgaW52b2NhdGlvbiBkZWZpbml0aW9uIHdob3NlIGFyZ3VtZW50cyBjb250YWluIGF0IGxlYXN0IG9uZSBPcmFjbGUgUEwvU1FMIHR5cGUgdGhhdCBoYXMgbm8gSkRCQyByZXByZXNlbnRhdGlvbiAoZS5nLiBCT09MRUFOLCBQTFNfSU5URUdFUiwgUEwvU1FMIHJlY29yZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvY2VkdXJlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYW5kIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCB0byB0aGUgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kZXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpkYmMtdHlwZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC10eXBlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtcmVjb3JkIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlY29yZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29tcGF0aWJsZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBmaWVsZHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCB0byB0aGUgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhbiBFSVMgcmVjb3JkIGRhdGEgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcmVjb3JkIHN0cnVjdHVyZSBuYW1lIHRoZSBkZXNjcmlwdG9yIG1hcHMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiIHR5cGU9Im5hbWVzcGFjZS1yZXNvbHZlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZXNwYWNlIHJlc29sdmVyIGZvciB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwcGVkLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIE1hcHBlZFJlY29yZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBpbnB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgb3V0cHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIFhNTCByZWNvcmRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcmVjb3JkLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgdG8gdXNlIGZvciB0aGUgaW5wdXQgcmVjb3JkLCBpZiByZXF1aXJlZCBieSB0aGUgYWRhcHRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJvb3QtZWxlbWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBvdXRwdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgaW5wdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIG91dHB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluZGV4ZWQtaW50ZXJhY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIEVJUyBpbnRlcmFjdGlvbiB1dGlsaXppbmcgSW5kZXhlZCByZWNvcmRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGludGVyYWN0aW9uIGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnQtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJvY2VkdXJlIGFyZ3VtZW50IHZhbHVlIG1heWJlIGJlIHNwZWNpZmllZCBpZiBub3QgdXNpbmcgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbnRlcmFjdGlvbiBuYW1lIG9mIHRoZSBhcmd1bWVudC4gRm9yIGluZGV4ZWQgYXJndW1lbnRzIHRoZSBuYW1lIGlzIG5vdCByZXF1aXJlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgbmFtZSBvZiB0aGUgYXJndW1lbi4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYXMgZGVmaW5lIGluIHRoZSBxdWVyeSwgb3IgdGhlIGRlc2NyaXB0b3IgZmllbGQgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1yZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGEgU3RydWN0dXJlIHR5cGUgaW4gYW4gb2JqZWN0LXJlbGF0aW9uYWwgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uYWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzdHJ1Y3R1cmUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG9iamVjdCBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkLW9yZGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBvcmRlcmVkIGxpc3Qgb2YgdGhlIGZpZWxkIGRlZmluZWQgaW4gdGhlIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5lc3RlZC10YWJsZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbS9tLW0gcmVsYXRpb25zaGlwIHRoYXQgbWFrZXMgdXNlIG9mIHRoZSBvYmplY3QtcmVsYXRpb25hbCBuZXN0ZWQtdGFibGUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBpbiB0aGUgc291cmNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBuZXN0ZWQtdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHR5cGUgbmFtZSBvZiB0aGUgbmVzdGVkLXRhYmxlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFycmF5LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBwcmltaXRpdmUvc2ltcGxlIHR5cGUgdmFsdWVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBhcnJheSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHR5cGUgbmFtZSBvZiB0aGUgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1hcnJheS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0LXR5cGVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBhcnJheSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHR5cGUgbmFtZSBvZiB0aGUgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cnVjdHVyZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0cnVjdHVyZSBvZiBvYmplY3QtdHlwZXMgdXNpbmcgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHJlZmVyZW5jZSB0byBhbm90aGVyIG9iamVjdC10eXBlIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCByZWZlcmVuY2UgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIGluIHRoZSBzb3VyY2UgdHlwZSB0aGF0IHN0b3JlcyB0aGUgcmVmZXJlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcmVsYXRpb25hbC1maWVsZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gT2JqZWN0UmVsYXRpb25hbERhdGFiYXNlRmllbGQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5lc3RlZC10eXBlLWZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC14bWwtdHlwZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBtYXBwaW5nIHRvIGFuIE9yYWNsZSBYREIgWE1MIFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWFkLXdob2xlLWRvY3VtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlLWNvbnZlcnRlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgYSB1c2VyIGRlZmluZWQgY29udmVydGVyIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb2xsZWN0aW9uLXJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtTSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIFhNTCBlbGVtZW50IHRvIHRoZSB0YXJnZXQgWE1MIGVsZW1lbnQgYmFzZWQgb24gYSBrZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1vYmplY3QtcmVmZXJlbmNlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lcnBvbGljeSIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXMtc2luZ2xlLW5vZGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLW9iamVjdC1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBYTUwgZWxlbWVudCB0byB0aGUgdGFyZ2V0IFhNTCBlbGVtZW50IGJhc2VkIG9uIG9uZSBvciBtb3JlIGtleXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFnZ3JlZ2F0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic291cmNlLXRvLXRhcmdldC1rZXktZmllbGQtYXNzb2NpYXRpb24iIHR5cGU9ImZvcmVpZ24ta2V5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS10by10YXJnZXQta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLWNkYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIG9iamVjdCBtYXBwaW5nIGZvciBhbiBYTUwgbmVzdGVkIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIG9iamVjdCBtYXBwaW5nIGZvciBhbiBYTUwgbmVzdGVkIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1wb2xpY3kiIHR5cGU9ImFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgb2JqZWN0IG1hcHBpbmcgZm9yIGFuIFhNTCBuZXN0ZWQgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYW4gWE1MIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImRlZmF1bHQtcm9vdC1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRoZSBkZXNjcmlwdG9yIG1hcHMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LXJvb3QtZWxlbWVudC1maWVsZCIgdHlwZT0ibm9kZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgWE1MRmllbGQgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHJvb3QgZWxlbWVudCBvZiB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNob3VsZC1wcmVzZXJ2ZS1kb2N1bWVudCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIGlmIG5vZGVzIHNob3VsZCBiZSBjYWNoZWQgdG8gcHJlc2VydmUgdW5tYXBwZWQgZGF0YTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZXNwYWNlLXJlc29sdmVyIiB0eXBlPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWVzcGFjZSByZXNvbHZlciBmb3IgdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzY2hlbWEiIHR5cGU9InNjaGVtYS1yZWZlcmVuY2UiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxvY2F0aW9uIG9mIHRoZSBYTUwgU2NoZW1hLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhbiB4czphbnkgZGVjbGFyYXRpb24gb3IgeHM6YW55VHlwZSBlbGVtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UteG1sLXJvb3QiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LWF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGFuIHhzOmFueSBkZWNsYXJhdGlvbiBvciB4czphbnlUeXBlIGVsZW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBzaW5nbGUgb2JqZWN0IHRvIGFuIHhzOmFueSBkZWNsYXJhdGlvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UteG1sLXJvb3QiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWZyYWdtZW50LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIHNpbmdsZSBOb2RlIHRvIGEgZnJhZ21lbnQgb2YgYW4gWE1MIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1kaXJlY3QtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWZyYWdtZW50LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiBvZiBOb2RlcyB0byBhIGZyYWdtZW50IG9mIGFuIFhNTCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluYXJ5LWRhdGEtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgYmluYXJ5IG9iamVjdCB0byBiYXNlNjQgYmluYXJ5PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtc3dhLXJlZiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWltZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNob3VsZC1pbmxpbmUtZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2hvaWNlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhIGNob2ljZSBzdHJ1Y3R1cmUgaW4gYW4geG1sIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXBvbGljeSIgdHlwZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiB0eXBlPSJ4bWwtY2hvaWNlLWZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhIGNob2ljZSBzdHJ1Y3R1cmUgaW4gYW4geG1sIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiB0eXBlPSJ4bWwtY2hvaWNlLWZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtZmllbGQiIHR5cGU9Im5vZGUiIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbnZlcnNpb24tcGFpciI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBYUGF0aCBleHByZXNzaW9uIHRvIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlIGluIGFuIFhNTCBkb2N1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcG9zaXRpb24gb2YgdGhlIG5vZGUgaW4gdGhlIHBhcmVudCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZWQtdGV4dC1maWVsZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhpcyBpcyBhIHR5cGVkIHRleHQgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaW5nbGUtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIGlmIGVhY2ggaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBpcyBpbiB0aGUgc2FtZSBub2RlIGluc3RlYWQgb2YgaGF2aW5nIG9uZSBub2RlIHBlciBpdGVtIGluIHRoZSBjb2xsZWN0aW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic2NoZW1hLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNjaGVtYSB0eXBlIG9mIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InhtbC10by1qYXZhLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iamF2YS10by14bWwtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImxlYWYtZWxlbWVudC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGUgZWxlbWVudHMgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5pb24tbm9kZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZSB0byByZXByZXNlbnQgbm9kZXMgd2hpY2ggYXJlIG1hcHBlZCB0byB1bmlvbnM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGVkLXRleHQtZmllbGQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoaXMgaXMgYSB0eXBlZCB0ZXh0IGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2luZ2xlLW5vZGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyBpZiBlYWNoIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24gaXMgaW4gdGhlIHNhbWUgbm9kZSBpbnN0ZWFkIG9mIGhhdmluZyBvbmUgbm9kZSBwZXIgaXRlbSBpbiB0aGUgY29sbGVjdGlvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InNjaGVtYS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzY2hlbWEgdHlwZSBvZiB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ4bWwtdG8tamF2YS1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImphdmEtdG8teG1sLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVzcGFjZS1yZXNvbHZlciI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0ibmFtZXNwYWNlcyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9Im5hbWVzcGFjZSIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0LW5hbWVzcGFjZS11cmkiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVzcGFjZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlLXVyaSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlc291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYS1jb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vZGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLWNsYXNzLXBhdGgtcmVmZXJlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzY2hlbWEtcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtZmlsZS1yZWZlcmVuY2UiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNjaGVtYS1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS11cmwtcmVmZXJlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzY2hlbWEtcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtY2hhcmFjdGVyIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqYXZhLXRpbWVzdGFtcCI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGF0ZVRpbWUiIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqYXZhLXV0aWwtZGF0ZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGF0ZVRpbWUiIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21wLXBvbGljeSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBlc3NpbWlzdGljLWxvY2tpbmciIHR5cGU9InBlc3NpbWlzdGljLWxvY2tpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNtcCBiZWFuLWxldmVsIHBlc3NpbWlzdGljIGxvY2tpbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmZXItdW50aWwtY29tbWl0IiB0eXBlPSJkZWZlci11bnRpbC1jb21taXQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgbW9kaWZpY2F0aW9uIGRlZmVycmFsIGxldmVsIGZvciBub24tZGVmZXJyZWQgd3JpdGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIiB0eXBlPSJub24tZGVmZXJyZWQtY3JlYXRlLXRpbWUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgcG9pbnQgYXQgd2hpY2ggaW5zZXJ0IHdpbGwgYmUgaXNzdWVkIHRvIERhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXNzaW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0id2FpdCIgbmFtZT0ibG9ja2luZy1tb2RlIiB0eXBlPSJsb2NraW5nLW1vZGUiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGVmZXItdW50aWwtY29tbWl0Ij4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsLW1vZGlmaWNhdGlvbnMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1cGRhdGUtbW9kaWZpY2F0aW9ucyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJub24tZGVmZXJyZWQtY3JlYXRlLXRpbWUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZnRlci1lamJjcmVhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZnRlci1lamJwb3N0Y3JlYXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idW5kZWZpbmVkIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9ja2luZy1tb2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SG9sZHMgdGhlIHBlc3NpbWlzdGljIGxvY2tpbmcgbW9kZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndhaXQiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuby13YWl0IiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2Ugb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iIiBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iNTAiIG5hbWU9InByZWFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIHByZWFsbG9jYXRpb24gc2l6ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlZmVyZW5jZXMgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsIG92ZXJyaWRpbmcgaXRzIG5hbWUgYW5kIChvcHRpb25hbGx5KSBwcmVhbGxvY2F0aW9uIHNpemUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UbyB1c2UgcHJlYWxsb2NhdGlvbiBzaXplIG9mIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LCBzZXQgcHJlYWxsb2NhdGlvbiBzaXplIHRvIDA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hdGl2ZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRhdGFiYXNlIHNlcXVlbmNlIG1lY2hhbmlzbSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UYWJsZSBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRVUVOQ0UiIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfTkFNRSIgbmFtZT0ibmFtZS1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX0NPVU5UIiBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlciBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuYXJ5LXRhYmxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VW5hcnkgdGFibGUgc2VxdWVuY2UgLSBzZXF1ZW5jZSBuYW1lIGlzIGEgdGFibGUgbmFtZSwgdGFibGUgaGFzIGEgc2luZ2xlIGZpZWxkIGFuZCBhIHNpbmdsZSByb3c8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUVVFTkNFIiBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlciBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbGZpbGUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWxmaWxlIHNlcXVlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFVRU5DRSIgbmFtZT0icm9vdC1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfTkFNRSIgbmFtZT0ibmFtZS1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZSBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfQ09VTlQiIG5hbWU9ImNvdW50ZXItZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmZXRjaC1ncm91cHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyBhbGwgcHJlLWRlZmluZWQgZmV0Y2ggZ3JvdXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC1mZXRjaC1ncm91cCIgdHlwZT0iZmV0Y2gtZ3JvdXAiIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmV0Y2gtZ3JvdXAiIHR5cGU9ImZldGNoLWdyb3VwIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmZXRjaC1ncm91cCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIHRoZSBmZXRjaCBncm91cCBhdHRyaWJ1dGVzIGluZm8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZldGNoLWdyb3VwLWF0dHJpYnV0ZXMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyBhIGZldGNoIGdyb3VwJ3MgYXR0cmlidXRlIGxpc3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmV0Y2gtZ3JvdXAtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgZm9yIHRoaXMgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmVycmVkLWRldGVjdGlvbi1jaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyBiYWNrdXAgY2xvbmUgdG8gZGV0ZWN0IGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNoYW5nZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1sZXZlbC1jaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyAibWFyayBkaXJ0eSIgdG8gZGV0ZWN0IGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNoYW5nZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1sZXZlbC1jaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyBhIENoYW5nZVRyYWNrZXIgZmlyaW5nIFByb3BlcnR5Q2hhbmdlRXZlbnQncyB0byBkZXRlY3QgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2hhbmdlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBOdWxsIFBvbGljeSBpbiB1c2UgZm9yIHRoaXMgcmVsYXRpb25zaGlwIGN1cnJlbnRseSBhIGNob2ljZSBvZiBbTnVsbFBvbGljeSBhbmQgSXNTZXROdWxsUG9saWN5XS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ4c2ktbmlsLXJlcHJlc2VudHMtbnVsbCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZW1wdHktbm9kZS1yZXByZXNlbnRzLW51bGwiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1yZXByZXNlbnRhdGlvbi1mb3IteG1sIiB0eXBlPSJtYXJzaGFsLW51bGwtcmVwcmVzZW50YXRpb24iIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im51bGwtcG9saWN5Ij4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iaXMtc2V0LXBlcmZvcm1lZC1mb3ItYWJzZW50LW5vZGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaXMtc2V0LW51bGwtcG9saWN5Ij4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtc2V0LW1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpcy1zZXQtcGFyYW1ldGVyLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImlzLXNldC1wYXJhbWV0ZXIiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im1hcnNoYWwtbnVsbC1yZXByZXNlbnRhdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPldyaXRlIG51bGwsIG5vIHRhZyhkZWZhdWx0KSBvciBhbiBlbXB0eSB0YWcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYU0lfTklMIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUJTRU5UX05PREUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFTVBUWV9OT0RFIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGdlbmVyaWMgZmllbGQgY29uY2VwdCwgc3VjaCBhcyBhIGRhdGFiYXNlIGNvbHVtbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sdW1uIGluIGEgcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBjb2x1bW4ncyB0YWJsZS4gVGhpcyB0YWJsZSBtdXN0IGJlIGxpc3RlZCBpbiB0aGUgY2xhc3MnIHRhYmxlcy4gSWYgbm90IHNwZWNpZmllZCB0aGUgZmlyc3QgdGFibGUgb2YgdGhlIGNsYXNzIHdpbGwgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZm9yZWlnbi1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBzb3VyY2UvdGFyZ2V0IGZpZWxkL2NvbHVtbiByZWZlcmVuY2VzIHJlbGF0aW5nIGEgZm9yZWlnbiBrZXkgaW4gb25lIHRhYmxlIHRvIHRoZSBwcmltYXJ5IG9yIHVuaXF1ZSBrZXkgaW4gYW5vdGhlciB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtcmVmZXJlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcmVmZXJlbmNlIG9mIGEgc291cmNlIHRhYmxlIGZvcmVpZ24ga2V5IGFuZCBhIHRhcmdldCB0YWJsZSBwcmltYXJ5IGtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZpZWxkL2NvbHVtbiBuYW1lIGluIHRoZSBzb3VyY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByaW1hcnkgb3IgdW5pcXVlIGtleSBmaWVsZC9jb2x1bW4gbmFtZSBpbiB0aGUgdGFyZ2V0IHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IHNwZWNpZmljYXRpb24gZm9yIHF1ZXJ5aW5nIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgb2YgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBxdWVyeSBhcmd1bWVudHMuIFRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnQgbXVzdCBtYXRjaCB0aGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50IHZhbHVlIHBhc3NlZCB0byB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJxdWVyeS1hcmd1bWVudCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcXVlcnkuICBUaGlzIG5hbWUgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIGFuZCBleGVjdXRlIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNyaXRlcmlhIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZmlsdGVyaW5nIGNsYXVzZSBvZiBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIHR5cGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgbWF5IGJlIHByb3ZpZGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCBjb25zdGFudCB2YWx1ZSBmb3IgdGhlIGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvcGVydHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHVzZXIgZGVmaW5lZCBwcm9wZXJ0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmFueVR5cGUiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiB0YWJsZXMgdGhhdCB0aGUgY2xhc3MgaXMgcGVyc2lzdGVkIHRvLiAgVGhpcyBpcyB0eXBpY2FsbHkgYSBzaW5nbGUgdGFibGUgYnV0IGNhbiBiZSBtdWx0aXBsZSwgb3IgZW1wdHkgZm9yIGluaGVyaXRhbmNlIG9yIGFnZ3JlZ2F0ZWQgY2xhc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgdGFibGUuICBUaGUgbmFtZSBjYW4gYmUgZnVsbHkgcXVhbGlmaWVkIHdpdGggdGhlIHNjaGVtYSwgdGFibGVzcGFjZSBvciBsaW5rLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIFNwZWNpZmllcyBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUKLSAgICAgICAgb2JqZWN0IHZhbHVlLgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLTwveHNkOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjEueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0NmVhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDE4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLgotIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS0tPgotPCEtLSBFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2UgUHJvamVjdCA6OiBNYXAgU2NoZW1hIGZpbGUgZm9yIE9STS9PWE0vRUlTIC0tPgotPHhzZDpzY2hlbWEKLSAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gIHZlcnNpb249IjEuMSIKLSAgPgotICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXBlcnNpc3RlbmNlIiB0eXBlPSJvYmplY3QtcGVyc2lzdGVuY2UiIC8+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXBlcnNpc3RlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QW4gb2JqZWN0LXBlcnNpc3RlbmNlIG1hcHBpbmcgbW9kdWxlLCBhIHNldCBvZiBjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBuYW1lIGZvciB0aGUgbW9kZWwgYmVpbmcgbWFwcGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9ycyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgY2xhc3MgbWFwcGluZyBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIiB0eXBlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIG9mIGhvdyBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBpdHMgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibG9naW4iIHR5cGU9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZGVmYXVsdC10ZW1wb3JhbC1tdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZGVmYXVsdCBmb3IgaG93IERhdGUgYW5kIENhbGVuZGFyIHR5cGVzIGFyZSB1c2VkIHdpdGggY2hhbmdlIHRyYWNraW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkJ5IGRlZmF1bHQgdGhleSBhcmUgYXNzdW1lZCBub3QgdG8gYmUgY2hhbmdlZCBkaXJlY3RseSAob25seSByZXBsYWNlZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgZGVmYXVsdD0iRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyAtIDEuMSAoQnVpbGQgWVlNTUREKSIgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwbGF0Zm9ybS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBwbGF0Zm9ybSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgdXNlci1uYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIHBhc3N3b3JkLCB0aGlzIGlzIHN0b3JlZCBpbiBlbmNyeXB0ZWQgZm9ybS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJleHRlcm5hbC1jb25uZWN0aW9uLXBvb2xpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSBjb25uZWN0aW9ucyBhcmUgbWFuYWdlZCBieSB0aGUgZGF0YXNvdXJjZSBkcml2ZXIsIGFuZCBhIG5ldyBjb25uZWN0aW9uIHNob3VsZCBiZSBhY3F1aXJlIHBlciBjYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXIiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSB0cmFuc2FjdGlvbiBhcmUgbWFuYWdlZCBieSBhIHRyYW5zYWN0aW9uIG1hbmFnZXIsIGFuZCBzaG91bGQgbm90IGJlIG1hbmFnZWQgYnkgVG9wTGluay48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBhbHNvIGJlIHVzZWQgaWYgdGhlIGRhdGFzb3VyY2UgZG9lcyBub3Qgc3VwcG9ydCB0cmFuc2FjdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXF1ZW5jaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jaW5nIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiIHR5cGU9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZhdWx0IHNlcXVlbmNlLiBUaGUgbmFtZSBpcyBvcHRpb25hbC4gSWYgbm8gbmFtZSBwcm92aWRlZCBhbiBlbXB0eSBzdHJpbmcgd2lsbCBiZSB1c2VkIGFzIGEgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNlcyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Tm9uIGRlZmF1bHQgc2VxdWVuY2VzLiBNYWtlIHN1cmUgZWFjaCBzZXF1ZW5jZSBoYXMgdW5pcXVlIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InNlcXVlbmNlIiB0eXBlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpEQkMgZHJpdmVyIGFuZCBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkcml2ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKREJDIGRyaXZlciBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tdXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxsIEpEQkMgZHJpdmVyIGNvbm5lY3Rpb24gVVJMLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIHBhcmFtZXRlciBiaW5kaW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhY2hlLWFsbC1zdGF0ZW1lbnRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RhdGVtZW50IGNhY2hpbmcgc2hvdWxkIGJlIHVzZWQuICBUaGlzIHNob3VsZCBiZSB1c2VkIHdpdGggcGFyYW1ldGVyIGJpbmRpbmcsIHRoaXMgY2Fubm90IGJlIHVzZWQgd2l0aCBleHRlcm5hbCBjb25uZWN0aW9uIHBvb2xpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJieXRlLWFycmF5LWJpbmRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBieXRlIGFycmF5IGRhdGEtdHlwZXMgc2hvdWxkIHVzZSBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InN0cmluZy1iaW5kaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RyaW5nIGRhdGEtdHlwZXMgc2hvdWxkIHVzZSBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMjU2IiBuYW1lPSJzdHJpbmctYmluZGluZy1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIHRocmVzaG9sZCBzdHJpbmcgc2l6ZSBmb3IgdXNhZ2Ugb2Ygc3RyaW5nIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic3RyZWFtcy1mb3ItYmluZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIGxhcmdlIGJ5dGUgYXJyYXkgYW5kIHN0cmluZyBkYXRhLXR5cGVzIHNob3VsZCBiZSBib3VuZCBhcyBzdHJlYW1zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImZvcmNlLWZpZWxkLW5hbWVzLXRvLXVwcGVyLWNhc2UiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0byBmb3JjZSBhbGwgZmllbGQgbmFtZXMgdG8gdXBwZXItY2FzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9Im9wdGltaXplLWRhdGEtY29udmVyc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGRhdGEgb3B0aW1pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0idHJpbS1zdHJpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RyaW5nIHRyYWlsaW5nIGJsYW5rcyBzaG91bGQgYmUgdHJpbW1lZC4gIFRoaXMgaXMgbm9ybWFsbHkgcmVxdWlyZWQgZm9yIENIQVIgZGF0YS10eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgYmF0Y2ggd3JpdGluZyBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImpkYmMtYmF0Y2gtd3JpdGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdXNpbmcgYmF0Y2ggd3JpdGluZywgY29uZmlndXJlIGlmIHRoZSBKREJDIGRyaXZlcnMgYmF0Y2ggd3JpdGluZyBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpDQSBkcml2ZXIgYW5kIEVJUyBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb25uZWN0aW9uLXNwZWMtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBUb3BMaW5rIHBsYXRmb3JtIHNwZWNpZmljIGNvbm5lY3Rpb24gc3BlYyBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tZmFjdG9yeS11cmwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpOREkgdXJsIGZvciB0aGUgbWFuYWdlZCBKQ0EgYWRhcHRlcidzIGNvbm5lY3Rpb24gZmFjdG9yeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgCQluYW1lPSJlcXVhbC1uYW1lc3BhY2UtcmVzb2x2ZXJzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgCTx4c2Q6ZWxlbWVudCBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5IgotICAgICAgICAJCXR5cGU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiIG1heE9jY3Vycz0iMSIKLSAgICAgICAgCQltaW5PY2N1cnM9IjAiPgotICAgICAgICAJPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIG9mIGhvdyBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBpdHMgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgaXMgYW4gYWJzdHJhY3QgZGVmaW5pdGlvbiB0byBhbGxvdyBmbGV4aWJpbGl0eSBpbiB0aGUgdHlwZXMgb2YgY2xhc3NlcyBhbmQgZGF0YXN0b3JlcyBwZXJzaXN0ZWQsIGkuZS4gaW50ZXJmYWNlcywgYWJzdHJhY3QgY2xhc3NlcywgYWdncmVnYXRlcywgbm9uLXJlbGF0aW9uYWwgcGVyc2lzdGVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBiZWluZyBwZXJzaXN0ZWQuICBUaGUgY2xhc3MgbmFtZSBtdXN0IGJlIGZ1bGwgcXVhbGlmaWVkIHdpdGggaXRzIHBhY2thZ2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGNsYXNzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPmV4YW1wbGUuZW1wbG95ZWUuaW1wbGVtZW50YXRpb24uRW1wbG95ZWU8L2NsYXNzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWxpYXMiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgYW4gYWxpYXMgbmFtZSBjYW4gYmUgZ2l2ZW4gZm9yIHRoZSBjbGFzcy4gIFRoZSBhbGlhcyBpcyBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjbGFzcyBpbiBwbGFjZSBvZiBpdHMgaW1wbGVtZW50YXRpb24gbmFtZSwgc3VjaCBhcyBpbiBxdWVyeWluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8YWxpYXMgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+RW1wbG95ZWU8L2FsaWFzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJpbWFyeS1rZXkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGZpZWxkcy9jb2x1bW5zIHRoYXQgbWFrZSB1cCB0aGUgcHJpbWFyeSBrZXkgb3IgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgaXMgdXNlZCBmb3IgY2FjaGluZywgcmVsYXRpb25zaGlwcywgYW5kIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJpbWFyeSBrZXkgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSBjbGFzcyBpcyByZWFkLW9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9wZXJ0aWVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdXNlciBkZWZpbmVkIHByb3BlcnRpZXMgdG8gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icHJvcGVydHkiIHR5cGU9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHVzZXIgZGVmaW5lZCBwcm9wZXJ0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9ImluaGVyaXRhbmNlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzIGlzIHJlbGF0ZWQgaW4gaW5oZXJpdGFuY2UgYW5kIGhvdyB0aGlzIGluaGVyaXRhbmNlIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImV2ZW50cyIgdHlwZT0iZXZlbnQtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwZXJzaXN0ZW50IGV2ZW50cyBmb3IgdGhpcyBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJ5aW5nIiB0eXBlPSJxdWVyeS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGRlZmluZWQgcXVlcmllcyBmb3IgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW1hcHBpbmdzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBtYXBwaW5ncyB0aGF0IGRlZmluZSBob3cgdGhlIGNsYXNzJyBhdHRyaWJ1dGVzIGFyZSBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImF0dHJpYnV0ZS1tYXBwaW5nIiB0eXBlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBhdHRyaWJ1dGUgaXMgcGVyc2lzdGVkLiBUaGUgYXR0cmlidXRlIG1hcHBpbmcgZGVmaW5pdGlvbiBpcyBleHRlbmRhYmxlIHRvIGFsbG93IGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlc2NyaXB0b3ItdHlwZSIgdHlwZT0iY2xhc3MtZGVzY3JpcHRvci10eXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBkZXNjcmlwdG9yIHR5cGUsIHN1Y2ggYXMgYWdncmVnYXRlIG9yIGluZGVwZW5kZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW50ZXJmYWNlcyIgdHlwZT0iaW50ZXJmYWNlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoaXMgY2xhc3MgaW1wbGVtZW50cy4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsb2NraW5nIiB0eXBlPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgbG9ja2luZyBiZWhhdmlvciBmb3IgdGhlIGNsYXNzLiAgU3VjaCBhcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIHZlcnNpb24sIHRpbWVzdGFtcCBvciBjaGFuZ2Ugc2V0IG9mIGNvbHVtbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXF1ZW5jaW5nIiB0eXBlPSJzZXF1ZW5jaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBnZW5lcmF0ZWQgdW5pcXVlIGlkIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWNoaW5nIiB0eXBlPSJjYWNoaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzJyBpbnN0YW5jZXMgc2hvdWxkIGJlIGNhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlbW90ZS1jYWNoaW5nIiB0eXBlPSJjYWNoaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzJyBpbnN0YW5jZXMgc2hvdWxkIGJlIGNhY2hlZCBvbiByZW1vdGUgY2xpZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktcG9saWN5IiB0eXBlPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiBvYmplY3RzIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gaGlzdG9yeSBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm5pbmctcG9saWN5IiB0eXBlPSJyZXR1cm5pbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHJldHVuaW5nIHBvbGljeS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyByZXR1cm5pbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYW1lbmRtZW50IiB0eXBlPSJhbWVuZG1lbnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB0aGUgZGVzY3JpcHRvciB0byBiZSBhbWVuZGVkIG9yIGN1c3RvbWl6ZWQgdGhyb3VnaCBhIGNsYXNzIEFQSSBhZnRlciBsb2FkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zdGFudGlhdGlvbiIgdHlwZT0iaW5zdGFudGlhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgaW5zdGFudGlhdGlvbiBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb3B5aW5nIiB0eXBlPSJjb3B5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBjbG9uaW5nL2NvcHlpbmcgYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJ5LWtleXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgbGlzdCBvZiBxdWVyeSBrZXlzIG9yIGFsaWFzZXMgZm9yIGRhdGFiYXNlIGluZm9ybWF0aW9uLiAgVGhlc2UgY2FuIGJlIHVzZWQgaW4gcXVlcmllcyBpbnN0ZWFkIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4gbmFtZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5LWtleSIgdHlwZT0icXVlcnkta2V5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBxdWVyeWluZyBkYXRhYmFzZSBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY21wLXBvbGljeSIgdHlwZT0iY21wLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UGxhY2UgaG9sZGVyIG9mIENNUCBpbmZvcm1hdGlvbiBzcGVjaWZpYy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLWdyb3VwcyIgdHlwZT0iZmV0Y2gtZ3JvdXBzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyBhbGwgcHJlLWRlZmluZWQgZmV0Y2ggZ3JvdXBzIGF0IHRoZSBkZXNjcmlwdG9yIGxldmVsPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImNoYW5nZS1wb2xpY3kiIHR5cGU9ImNoYW5nZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIHRoZSBDaGFuZ2UgUG9saWN5IGZvciB0aGlzIGRlc2NyaXB0b3I8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBmaXhlZD0iMTAiIG5hbWU9InNjaGVtYS1tYWpvci12ZXJzaW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciIgLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBmaXhlZD0iMCIgbmFtZT0ic2NoZW1hLW1pbm9yLXZlcnNpb24iIHR5cGU9InhzZDppbnRlZ2VyIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNsYXNzLWRlc2NyaXB0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNsYXNzIGRlc2NyaXB0b3IgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImluZGVwZW5kZW50IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWdncmVnYXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWdncmVnYXRlLWNvbGxlY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3NpdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3NpdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbnRlcmZhY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJmYWNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGludGVyZmFjZXMgdGhhdCBhIGNsYXNzIGRlc2NyaXB0b3IgaW1wbGVtZW50cywgb3IgdGhlIGltcGxlbWVudGlvbiBjbGFzcyBmb3IgYW4gaW50ZXJmYWNlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IGEgc2V0IG9mIHB1YmxpYyBpbnRlcmZhY2VzIGZvciB0aGUgY2xhc3MgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMgYWxsb3dzIHRoZSBpbnRlcmZhY2UgdG8gYmUgdXNlZCB0byByZWZlciB0byB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0d28gY2xhc3NlcyBpbXBsZW1lbnQgdGhlIHNhbWUgaW50ZXJmYWNlLCBhbiBpbnRlcmZhY2UgZGVzY3JpcHRvciBzaG91bGQgYmUgZGVmaW5lZCBmb3IgdGhlIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGFsc28gYmUgdXNlZCB0byBkZWZpbmUgaW5oZXJpdGFuY2UgYmV0d2VlbiBpbnRlcmZhY2UgZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGludGVyZmFjZSBjbGFzcyBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxjbGFzcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5leGFtcGxlLmVtcGxveWVlLmFwaS5FbXBsb3llZTwvY2xhc3M+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaW1wbGVtZW50b3ItZGVzY3JpcHRvciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igd2hpY2ggdGhpcyBpbnRlcmZhY2UgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiB0aGUgaW50ZXJmYWNlIGhhcyBvbmx5IGEgc2luZ2xlIGltcGxlbWVudG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxjbGFzcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5leGFtcGxlLmVtcGxveWVlLmltcGwuRW1wbG95ZWU8L2NsYXNzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgY2xvbmluZy9jb3B5aW5nIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3JlYXRlcyBhIGNvcHlpbmcgdGhyb3VnaCBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSB0byBjb3B5IGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvcHktcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgY2xvbmluZy9jb3B5aW5nIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQgdGhyb3VnaCBhIGNsb25lIG1ldGhvZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29weS1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgY2xvbmUgbWV0aG9kIG9uIHRoZSBvYmplY3QsIGkuZS4gJ2Nsb25lJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgaW5zdGFudGlhdGlvbiBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG9uIHRoZSBmYWN0b3J5IHRvIGluc3RhbnRpYXRlIHRoZSBvYmplY3QgaW5zdGFuY2UuJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmFjdG9yeS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBmYWN0b3J5IGNsYXNzIG5hbWUuJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmFjdG9yeS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gaW5zdGFudGlhdGUgdGhlIGZhY3RvcnkgY2xhc3MuJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhbWVuZG1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSBjbGFzcyBhbmQgc3RhdGljIG1ldGhvZCB0byBiZSBjYWxsZWQgdG8gYWxsb3cgZm9yIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFtZW5kZWQgb3IgY3VzdG9taXplZCB0aHJvdWdoIGEgY2xhc3MgQVBJIGFmdGVyIGxvYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW1lbmRtZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4gVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhbWVuZG1lbnQgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW1lbmRtZW50LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhbWVuZG1lbnQgbWV0aG9kIG9uIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25hbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGUocykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGFibGVzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHRoZSB0YWJsZXMgdGhlIGNsYXNzIGlzIHBlcnNpc3RlZCB0by4gIFR5cGljYWxseSBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBhIHNpbmdsZSB0YWJsZSwgYnV0IG11bHRpcGxlIHRhYmxlcyBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ0YWJsZSIgdHlwZT0idGFibGUiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgdGFibGVzIHRoYXQgdGhlIGNsYXNzIGlzIHBlcnNpc3RlZCB0by4gIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2luZ2xlIHRhYmxlIGJ1dCBjYW4gYmUgbXVsdGlwbGUsIG9yIGVtcHR5IGZvciBpbmhlcml0YW5jZSBvciBhZ2dyZWdhdGVkIGNsYXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5cy1mb3ItbXVsdGlwbGUtdGFibGUiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBmb3JlaWduIGtleSBmaWVsZCByZWZlcmVuY2VzIHRvIGJlIGRlZmluZSBmb3IgbXVsdGlwbGUgdGFibGUgZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtdWx0aXBsZS10YWJsZS1qb2luLWNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgY29tcGxleCBtdWx0aXBsZSB0YWJsZSBqb2luIGNvbmRpdGlvbnMgYW4gZXhwcmVzc2lvbiBtYXkgYmUgcHJvdmlkZWQgaW5zdGVhZCBvZiB0aGUgdGFibGUgZm9yZWlnbiBrZXkgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbi1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBhIG51bWVyaWMgdmVyc2lvbiBmaWVsZC9jb2x1bW4gdGhhdCB0cmFja3MgY2hhbmdlcyBhbmQgdGhlIHZlcnNpb24gdG8gYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24tZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIGFuZCBvcHRpb25hbGx5IHRoZSB0YWJsZSBvZiB0aGUgY29sdW1uIHRoYXQgdGhlIGF0dHJpYnV0ZSBpcyBzdG9yZWQgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InN0b3JlLXZlcnNpb24taW4tY2FjaGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHZlcnNpb24gdmFsdWUgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgY2FjaGUsIG9yIGlmIGl0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWVzdGFtcC1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiB0aW1lc3RhbXAgdmVyc2lvbiBjb2x1bW4gdGhhdCB0cmFja3MgY2hhbmdlcyBhbmQgdGhlIHZlcnNpb24gdG8gYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2ZXJzaW9uLWxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic2VydmVyLXRpbWUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHRpbWVzdGFtcCBzaG91bGQgYmUgb2J0YWluZWQgbG9jYWxseSBvciBmcm9tIHRoZSBkYXRhYmFzZSBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFsbC1maWVsZHMtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBvcmlnaW5hbCByZWFkIHZhbHVlcyBvZiBhbGwgZmllbGRzIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZWQtZmllbGRzLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgcmVhZCB2YWx1ZXMgb2Ygb25seSB0aGUgY2hhbmdlZCBmaWVsZHMgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VsZWN0ZWQtZmllbGRzLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgcmVhZCB2YWx1ZXMgb2YgYSBzcGVjaWZpZWQgc2V0IG9mIGZpZWxkcyBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHNldCBvZiBmaWVsZHMgdG8gY29tcGFyZSBvbiB1cGRhdGUgYW5kIGRlbGV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBkYXRhYmFzZSBnZW5lcmF0ZWQgdW5pcXVlIGlkIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgZ2VuZXJhdG9yLiAgVGhpcyBjb3VsZCBiZSB0aGUgbmFtZSBvZiBhIHNlcXVlbmNlIG9iamVjdCwgb3IgYSByb3cgdmFsdWUgaW4gYSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGZpZWxkL2NvbHVtbiB0aGF0IHRoZSBnZW5lcmF0ZWQgc2VxdWVuY2UgaWQgaXMgYXNzaWduZWQgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBjYWNoaW5nIHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZ1bGwiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjYWNoZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndlYWstcmVmZXJlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic29mdC1yZWZlcmVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzb2Z0LWNhY2hlLXdlYWstcmVmZXJlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaGFyZC1jYWNoZS13ZWFrLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoaW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcycgaW5zdGFuY2VzIHNob3VsZCBiZSBjYWNoZWQgYW5kIGhvdyBvYmplY3QgaWRlbnRpdHkgc2hvdWxkIGJlIG1haW50YWluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJzb2Z0LWNhY2hlLXdlYWstcmVmZXJlbmNlIiBuYW1lPSJjYWNoZS10eXBlIiB0eXBlPSJjYWNoZS10eXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSB0eXBlIG9mIGNhY2hpbmcsIHN1Y2ggYXMgTFJVLCB3ZWFrIHJlZmVyZW5jZSBvciBub25lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMTAwIiBuYW1lPSJjYWNoZS1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgaW5pdGlhbCBvciBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImFsd2F5cy1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgcmVmcmVzaCBjYWNoZWQgb2JqZWN0cyBvbiBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Im9ubHktcmVmcmVzaC1jYWNoZS1pZi1uZXdlci12ZXJzaW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byByZWZyZXNoIGlmIHRoZSBjYWNoZWQgb2JqZWN0IGlzIGFuIG9sZGVyIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZGlzYWJsZS1jYWNoZS1oaXRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGlzYWJsZSBvYnRhaW5pbmcgY2FjaGUgaGl0cyBvbiBwcmltYXJ5IGtleSBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImFsd2F5cy1jb25mb3JtIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgY29uZm9ybSBxdWVyaWVzIHdpdGhpbiBhIHRyYW5zYWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Imlzb2xhdGVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiBvYmplY3RzIG9mIHRoaXMgdHlwZSBzaG91bGQgYmUgaXNvbGF0ZWQgZnJvbSB0aGUgc2hhcmVkIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iaXNvbGF0ZS1uZXctZGF0YS1hZnRlci10cmFuc2FjdGlvbiIgbmFtZT0idW5pdG9md29yay1pc29sYXRpb24tbGV2ZWwiIHR5cGU9InVuaXRvZndvcmstaXNvbGF0aW9uLWxldmVsIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgdW5pdCBvZiB3b3JrIHNob3VsZCBiZSBpc29sYXRlZCB0byB0aGUgc2Vzc2lvbiBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiIHR5cGU9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iY2hhbmdlLXNldCIgbmFtZT0iY2FjaGUtc3luYy10eXBlIiB0eXBlPSJjYWNoZS1zeW5jLXR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0eXBlIG9mIGNhY2hlIHN5bmNocm9uaXphdGlvbiB0byBiZSB1c2VkIHdpdGggdGhpcyBkZXNjcmlwb3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlLWludmFsaWRhdGlvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BYnN0cmFjdCBzdXBlcmNsYXNzIGZvciBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWNpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXBkYXRlLXJlYWQtdGltZS1vbi11cGRhdGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuby1leHBpcnktY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kgd2hlcmUgb2JqZWN0cyBpbiB0aGUgY2FjaGUgZG8gbm90IGV4cGlyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2FjaGUtaW52YWxpZGF0aW9uIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lLXRvLWxpdmUtY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kgd2hlcmUgb2JqZWN0cyBsaXZlIGEgc3BlY2lmaWMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhZnRlciB0aGV5IGFyZSByZWFkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aW1lLXRvLWxpdmUiIHR5cGU9InhzZDpsb25nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGFpbHktY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNhY2hlIGludmFsaWRhdGlvbiBQb2xpY3kgd2hlcmUgb2JqZWN0cyBleHBpcmUgYXQgYSBzcGVjaWZpYyB0aW1lIGV2ZXJ5IGRheTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnktdGltZSIgdHlwZT0ieHNkOmRhdGVUaW1lIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIG9iamVjdHMgYXJlIHRvIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImhhbmRsZS13cml0ZXMiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS1kYXRhYmFzZS10aW1lIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktdGFibGVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBuYW1lcyBvZiB0aGUgbWlycm9yaW5nIGhpc3RvcmljYWwgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaGlzdG9yeS10YWJsZSIgdHlwZT0iaGlzdG9yeS10YWJsZSIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RhcnQtZmllbGRzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzdGFydCBmaWVsZHMgZm9yIGVhY2ggaGlzdG9yaWNhbCB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InN0YXJ0LWZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZW5kLWZpZWxkcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZW5kIGZpZWxkcyBmb3IgZWFjaCBoaXN0b3JpY2FsIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZW5kLWZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoaXN0b3J5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RWFjaCBlbnRyeSBpcyBhIHNvdXJjZSAoZGVzY3JpcHRvcikgdG8gaGlzdG9yeSB0YWJsZSBuYW1lIGFzc29jaWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iIiBuYW1lPSJzb3VyY2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBuYW1lPSJoaXN0b3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXR1cm5pbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyByZXR1bmluZyBwb2xpY3kuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gcmV0dXJuaW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG5hbWU9InJldHVybmluZy1maWVsZC1pbmZvcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgdGhlIGZpZWxkcyB0byBiZSByZXR1cm5lZCB0b2dldGhlciB3aXRoIHRoZSBmbGFncyBkZWZpbmluZyByZXR1cm5pbmcgb3B0aW9uczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icmV0dXJuaW5nLWZpZWxkLWluZm8iIHR5cGU9InJldHVybmluZy1maWVsZC1pbmZvIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJldHVybmluZy1maWVsZC1pbmZvIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RmllbGQgdG8gYmUgcmV0dXJuZWQgdG9nZXRoZXIgd2l0aCB0eXBlIGFuZCB0aGUgZmxhZ3MgZGVmaW5pbmcgcmV0dXJuaW5nIG9wdGlvbnMuIEF0IGxlYXN0IG9uZSBvZiBpbnNlcnQsIHVwZGF0ZSBzaG91bGQgYmUgdHJ1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0YXJnZXQgcmVmZXJlbmNlZCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCB0byBiZSByZXR1cm5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJpbnNlcnQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgc2hvdWxkIGJlIHJldHVuZWQgYWZ0ZXIgSW5zZXJ0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Imluc2VydC1tb2RlLXJldHVybi1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgaW5zZXJ0PT10cnVlLCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgc2hvdWxkIG5vdCBiZSBpbnNlcnRlZCAodHJ1ZSkuIElmIGluc2VydD09ZmFsc2UgLSBpZ25vcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVwZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgcmV0dW5lZCBhZnRlciBJbnNlcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcyBpcyByZWxhdGVkIGluIGluaGVyaXRhbmNlIGFuZCBob3cgdGhpcyBpbmhlcml0YW5jZSBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwYXJlbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBwYXJlbnQvc3VwZXJjbGFzcyBvZiB0aGUgY2xhc3MgYmVpbmcgcGVyc2lzdGVkLiAgVGhlIGNsYXNzIG5hbWUgbXVzdCBiZSBmdWxsIHF1YWxpZmllZCAgIHdpdGggaXRzIHBhY2thZ2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJyZWFkLXN1YmNsYXNzZXMtb24tcXVlcmllcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSBpZiBzdWJjbGFzc2VzIG9mIHRoZSBjbGFzcyBzaG91bGQgYmUgcmV0dXJuZWQgb24gcXVlcmllcywgb3Igb25seSB0aGUgZXhhY3QgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbGwtc3ViY2xhc3Nlcy12aWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgdGhlIG5hbWUgb2YgYSB2aWV3IHRoYXQgam9pbnMgYWxsIG9mIHRoZSBzdWJjbGFzcycgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS1jbGFzcy1uYW1lLWFzLWluZGljYXRvciIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGNsYXNzIHR5cGUgaW5kaWNhdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtZXh0cmFjdGlvbi1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIGEgbWV0aG9kIG9uIHRoZSBjbGFzcyB0aGF0IHRha2VzIHRoZSBjbGFzcycgcm93IGFzIGFyZ3VtZW50IGEgY29tcHV0ZWQgdGhhdCBjbGFzcyB0eXBlIHRvIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgZnJvbSB0aGUgcm93LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHR5cGUgZmllbGQvY29sdW1uIHRoYXQgdGhlIGNsYXNzIHR5cGUgaXMgc3RvcmVkIGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiIHR5cGU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBjbGFzcyBpbmRpY2F0b3IgdmFsdWVzIGFuZCB0aGUgc3ViY2xhc3NlcyB0aGV5IG1hcCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWV4dHJhY3RvciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBjbGFzcyBleHRyYWN0b3IgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib25seS1pbnN0YW5jZXMtY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY3JpdGVyaWEgdGhhdCBmaWx0ZXJzIG91dCBhbGwgc2libGluZyBhbmQgc3ViY2xhc3MgaW5zdGFuY2VzIG9uIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbGwtc3ViY2xhc3Nlcy1jcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjcml0ZXJpYSB0aGF0IGZpbHRlcnMgb3V0IHNpYmxpbmcgaW5zdGFuY2VzIG9uIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ib3V0ZXItam9pbi1zdWJjbGFzc2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGluaGVyaXRhbmNlIHF1ZXJpZXMgc3BlY2lmeSBpZiBhbGwgc3ViY2xhc3NlcyBzaG91bGQgYmUgb3V0ZXIgam9pbmVkLCBpbnN0ZWFkIG9mIGEgcXVlcnkgcGVyIHN1YmNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxbmFtZS1pbmhlcml0YW5jZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeHRlbmRzIGluaGVyaXRhbmNlIHBvbGljeS4gQWxsb3dzIGZvciBwcmVmaXhlZCBuYW1lcyB0byBiZSByZXNvbHZlZCBhdCBydW50aW1lIHRvIGZpbmQgdGhlIGFwcHJvcmlhdGUgY2xhc3M8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5oZXJpdGFuY2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGNsYXNzIGluZGljYXRvciB2YWx1ZXMgYW5kIHRoZSBzdWJjbGFzc2VzIHRoZXkgbWFwIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHRoZSB0eXBlIG1hcHMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtaW5kaWNhdG9yIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIHZhbHVlIHVzZWQgdG8gZGVmaW5lIHRoZSBjbGFzcyB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV2ZW50LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBlcnNpc3RlbnQgZXZlbnRzIGZvciB0aGlzIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZXZlbnQtbGlzdGVuZXJzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV2ZW50LWxpc3RlbmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYW4gZXZlbnQgbGlzdGVuZXIgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBkZXNjcmlwdG9yIGV2ZW50IGxpc3RlbmVyIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1idWlsZC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBidWlsZGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLXdyaXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSB3cml0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LXdyaXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIHdyaXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS1pbnNlcnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIGluc2VydGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1pbnNlcnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgaW5zZXJ0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtdXBkYXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSB1cGRhdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC11cGRhdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgdXBkYXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS1kZWxldGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIGRlbGV0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWRlbGV0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBkZWxldGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWJvdXQtdG8taW5zZXJ0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSBpbnNlcnRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFib3V0LXRvLXVwZGF0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgdXBkYXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtY2xvbmUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgY2xvbmluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1tZXJnZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBtZXJnaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LXJlZnJlc2gtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgcmVmcmVzaGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBkZWZpbmVkIHF1ZXJpZXMgYW5kIHF1ZXJ5IHByb3BlcnRpZXMgZm9yIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJpZXMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkiIHR5cGU9InF1ZXJ5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IGRlZmluaXRpb24gZm9yIHRoZSBjbGFzcycgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgdGltZW91dCB0byBhcHBseSB0byBhbGwgcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImNoZWNrLWNhY2hlIiBuYW1lPSJleGlzdGVuY2UiIHR5cGU9ImV4aXN0ZW5jZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBiZWhhdm9pciB1c2VkIHRvIGRldGVybWluZSBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0IHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnNlcnQtcXVlcnkiIHR5cGU9Imluc2VydC1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSBpbnNlcnQgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgaW5zZXJ0IGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InVwZGF0ZS1xdWVyeSIgdHlwZT0idXBkYXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIHVwZGF0ZSBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCB1cGRhdGUgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLXF1ZXJ5IiB0eXBlPSJkZWxldGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gZGVsZXRlIHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IGRlbGV0ZSBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkb2VzLWV4aXN0LXF1ZXJ5IiB0eXBlPSJkb2VzLWV4aXN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gZG9lcyBleGlzdCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCBkZWxldGUgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVhZC1vYmplY3QtcXVlcnkiIHR5cGU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gcmVhZCBvYmplY3QgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgcmVhZCBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWFkLWFsbC1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSByZWFkIGFsbCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCByZWFkIGFsbCBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBleGlzdGVuY2UgcG9saWNpZXMgZm9yIGRldGVybWluaW5nIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1jYWNoZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWRhdGFiYXNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLWV4aXN0ZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1ub24tZXhpc3RlbmNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIHF1ZXJ5aW5nIGRhdGFiYXNlIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeS1rZXkgYWxpYXMgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtc3luYy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHR5cGUgb2YgY2FjaGUgc3luY2hyb25pemF0aW9uIHRvIHVzZSB3aXRoIGEgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImludmFsaWRhdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vLWNoYW5nZXMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGFuZ2Utc2V0LXdpdGgtbmV3LW9iamVjdHMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGFuZ2Utc2V0IiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idW5pdG9md29yay1pc29sYXRpb24tbGV2ZWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgdW5pdCBvZiB3b3JrIGlzb2xhdGVkIGZyb20gdGhlIHNlc3Npb24gY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1c2Utc2Vzc2lvbi1jYWNoZS1hZnRlci10cmFuc2FjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imlzb2xhdGUtbmV3LWRhdGEtYWZ0ZXItdHJhbnNhY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpc29sYXRlLWNhY2hlLWFmdGVyLXRyYW5zYWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXNvbGF0ZS1jYWNoZS1hbHdheXMiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LXF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgZGF0YWJhc2UgY29sdW1uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJxdWVyeS1rZXkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBiZWluZyBhbGlhc2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtcXVlcnkta2V5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgam9pbiB0byBhbm90aGVyIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icXVlcnkta2V5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdGFyZ2V0IHJlZmVyZW5jZWQgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBqb2luIGNvbmRpdGlvbiBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBjbGFzcycgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGpvaW4gY3JpdGVyaWEgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgY2xhc3MnIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lLXF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgMS0xIGpvaW4gdG8gYW5vdGhlciBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1xdWVyeS1rZXkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55LXF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgMS1tIGpvaW4gZnJvbSBhbm90aGVyIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1xdWVyeS1rZXkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhbiBhdHRpcmJ1dGUgdG8gYSBzaW1wbGUgZmllbGQgZGF0YXR5cGUsIGkuZS4gU3RyaW5nLCBOdW1iZXIsIERhdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBhbmQgb3B0aW9uYWxseSB0aGUgdGFibGUgb2YgdGhlIGZpZWxkL2NvbHVtbiB0aGF0IHRoZSBhdHRyaWJ1dGUgaXMgc3RvcmVkIGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibnVsbC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgYSB2YWx1ZSB0aGF0IG51bGwgZGF0YSB2YWx1ZXMgc2hvdWxkIGJlIGNvbnZlcnRlZCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1jbGFzc2lmaWNhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgYXR0cmlidXRlIGlzIHBlcnNpc3RlZC4gVGhlIGF0dHJpYnV0ZSBtYXBwaW5nIGRlZmluaXRpb24gaXMgZXh0ZW5kYWJsZSB0byBhbGxvdyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBhdHRyaWJ1dGUgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVhZC1vbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGdldCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc2V0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb3BlcnRpZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB1c2VyIGRlZmluZWQgcHJvcGVydGllcyB0byBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0icHJvcGVydHkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBzaW1wbGUgYXR0cmlidXRlIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhbiBhdHRpcmJ1dGUgdG8gYSBzaW1wbGUgZmllbGQgZGF0YXR5cGUsIGkuZS4gU3RyaW5nLCBOdW1iZXIsIERhdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtY2RhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcG9saWN5IiB0eXBlPSJhYnN0cmFjdC1udWxsLXBvbGljeSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1kaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIGZyb20gYW4gYXR0aXJidXRlIHRvIGEgc2ltcGxlIGZpZWxkIGRhdGF0eXBlLCBpLmUuIFN0cmluZywgTnVtYmVyLCBEYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGZpZWxkIHRyYW5zZm9ybWF0aW9uIGZvciBhIHRyYW5zZm9ybWF0aW9uIG1hcHBpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1iYXNlZC1maWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1lci1iYXNlZC1maWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgdHJhbnNmb3JtYXRpb24gbWFwcGluZyB0aGF0IHVzZXMgSmF2YSBjb2RlIHRvIHRyYW5zZm9ybSBiZXR3ZWVuIHRoZSBkYXRhIGFuZCBvYmplY3QgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHJhbnNmb3JtYXRpb24gZGVmaW5lZCBpbiB0aGUgZG9tYWluIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLXRyYW5zZm9ybWVyIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHJhbnNmb3JtZXIuIFVzZWQgaW4gcGxhY2Ugb2YgYXR0cmlidXRlLXRyYW5zZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZC10cmFuc2Zvcm1hdGlvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIHRyYW5zZm9ybWF0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIiB0eXBlPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtdHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtdHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhZ2dyZWdhdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcmVsYXRpb25zaGlwIHdoZXJlIHRoZSB0YXJnZXQgb2JqZWN0IGlzIHN0cmljdGx5IHByaXZhdGVseSBvd25lZCBieSB0aGUgc291cmNlIG9iamVjdCBhbmQgc3RvcmVzIHdpdGhpbiB0aGUgc291cmNlIG9iamVjdHMgcm93PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdGFyZ2V0IGNsYXNzIG9mIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJhbGxvdy1udWxsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIGEgcm93IG9mIGFsbCBudWxscyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgbnVsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkLXRyYW5zbGF0aW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdGhlIG1hcHBpbmcgdG8gdXNlIGRpZmZlcmVudCBmaWVsZCBuYW1lcyB0aGFuIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdHJhbnNsYXRpb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgaW4gdGhlIHNvdXJjZSBkZXNjcmlwdG9yJ3MgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgaW4gdGhlIGFnZ3JlZ2F0ZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBjbGFzc2VzIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSB0YXJnZXQgY2xhc3Mgb2YgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSB0YXJnZXQgb2JqZWN0cyBhcmUgcHJpdmF0ZWx5IG93bmVkIGRlcGVuZGVudCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgY3JlYXRlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtbWVyZ2UiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGNyZWF0ZSBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHJlZnJlc2ggb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHJlbW92ZSBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1vbmUtdG8tb25lLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib25lLXRvLW9uZS1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSB0YXJnZXQgY2xhc3MnIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcmVsYXRlZCBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtb25lLXRvLW1hbnktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS1mb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGFyZ2V0LWZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleS1ncm91cGluZy1lbGVtZW50IiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcmVsYXRlZCBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBzaW1wbGUgdHlwZXMgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byBhIHNldCBvZiBzaW1wbGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0iZGF0YS1yZWFkLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtdGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgc291cmNlIHByaW1hcnkga2V5IGFuZCB0aGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlyZWN0LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGluIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc2VydC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBpbnNlcnQgYSByb3cgaW50byB0aGUgcmVmZXJlbmNlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGEgcm93IGZyb20gdGhlIHJlZmVyZW5jZSB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByb3dzIGZyb20gdGhlIHJlZmVyZW5jZSB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2Vzc2lvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIHNlc3Npb24gdGhhdCBkZWZpbmVzIHRoZSByZWZlcmVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXBvbGljeSIgdHlwZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiB0aGlzIGF0dHJpYnV0ZSBhcmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGhpc3RvcnkgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LW1hcC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcCByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIGEgc2V0IG9mIGtleSB2YWx1ZXMgcGFpcnMgb2Ygc2ltcGxlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlyZWN0LWtleS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBpbiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgc29yZXMgdGhlIG1hcCBrZXkgZGF0YSB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtleS1jb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBrZXkgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFnZ3JlZ2F0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMgd2hlcmUgdGhlIHRhcmdldCBpbnN0YW5jZXMgYXJlIHN0cmljdGx5IHByaXZhdGVseSBvd25lZCBieSB0aGUgc291cmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgdGFyZ2V0IGNsYXNzJyB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0cyBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVsYXRpb24tdGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBzb3VyY2UvdGFyZ2V0IHByaW1hcnkga2V5cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtcmVsYXRpb24tZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmcm9tIHRoZSByZWxhdGlvbmFsIHRhYmxlIHRvIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1yZWxhdGlvbi1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZyb20gdGhlIHJlbGF0aW9uYWwgdGFibGUgdG8gdGhlIHRhcmdldCBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc2VydC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBpbnNlcnQgYSByb3cgaW50byB0aGUgcmVsYXRpb24gdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYSByb3cgZnJvbSB0aGUgcmVsYXRpb24gdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcm93cyBmcm9tIHRoZSByZWxhdGlvbiB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS1wb2xpY3kiIHR5cGU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2YgdGhpcyBhdHRyaWJ1dGUgYXJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBoaXN0b3J5IHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlIHRoYXQgbWF5IGJlIG9mIHNldmVyYWwgdHlwZXMgcmVsYXRlZCB0aHJvdWdoIGFuIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGUtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGNvbHVtbiB0byBzdG9yZSB0aGUgY2xhc3MgdHlwZSBvZiB0aGUgcmVsYXRlZCBvYmplY3QgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9yZWlnbi1rZXktdG8tcXVlcnkta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHNvdXJjZS90YXJnZXQgY29sdW1uL3F1ZXJ5IGtleSByZWZlcmVuY2VzIHJlbGF0aW5nIGEgZm9yZWlnbiBrZXkgaW4gb25lIHRhYmxlIHRvIHRoZSBxdWVyeSBrZXlzIGRlZmluaW5nIGEgcHJpbWFyeSBvciB1bmlxdWUga2V5IHZhbHVlIGluIHRoZSBvdGhlciBpbnRlcmZhY2UgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeS1rZXktcmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZWZlcmVuY2Ugb2YgYSBzb3VyY2UgdGFibGUgZm9yZWlnbiBrZXkgYW5kIGEgdGFyZ2V0IGludGVyZmFjZSBkZXNjcmlwdG9yIHF1ZXJ5IGtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZpZWxkL2NvbHVtbiBuYW1lIGluIHRoZSBzb3VyY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LXF1ZXJ5LWtleSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkga2V5IG5hbWUgb2YgdGhlIHRhcmdldCBpbnRlcmZhY2UgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiIHR5cGU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGNsYXNzIGluZGljYXRvciB2YWx1ZXMgYW5kIHRoZSBzdWJjbGFzc2VzIHRoZXkgbWFwIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbnRhaW5lci9jb2xsZWN0aW9uIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb2xsZWN0aW9uLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNvcnRlZC1jb2xsZWN0aW9uLWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc29ydGVkIGNvbGxlY3Rpb24gdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29tcGFyYXRvci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb21wYXJpdG9yLCB1c2VkIHRvIGNvbXBhcmUgb2JqZWN0cyBpbiBzb3J0aW5nIHRoZSBjb2xsZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaXN0LWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbGlzdCBjb2xsZWN0aW9uIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcCBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWFwLWtleS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgdGFyZ2V0IG9iamVjdHMgdG8gZ2V0IHRoZSBrZXkgdmFsdWUgZm9yIHRoZSBtYXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1tYXAtY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgbWFwIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY3JvbGxhYmxlLWN1cnNvci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc2Nyb2xsYWJsZSBjdXJzb3IgY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1cnNvcmVkLXN0cmVhbS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY3Vyc29yZWQgc3RyZWFtIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmRpcmVjdGlvbi1wb2xpY3kiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRlZmVycmVkIHJlYWQgaW5kaXJlY3Rpb24gbWVjaGFuaXNtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtaG9sZGVyLWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgdmFsdWUgaG9sZGVycyB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJveHktaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiBwcm94aWVzIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc3BhcmVudC1jb2xsZWN0aW9uLWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgdHJhbnNwYXJlbnQgY29sbGVjdGlvbnMgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbGxlY3Rpb24tdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIGludGVyZmFjZSB0byB1c2UsIGkuZS4gTGlzdCwgU2V0LCBNYXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYXAta2V5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSB0YXJnZXQgb2JqZWN0cyB0byBnZXQgdGhlIGtleSB2YWx1ZSBmb3IgdGhlIG1hcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udGFpbmVyLWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgYSB1c2VyIGRlZmluZWQgY29udGFpbmVyIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29udGFpbmVyIGltcGxlbWVudGVyIHRvIHVzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZXNhZmUtZW51bWVyYXRpb24tY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VHlwZXNhZmUgRW51bWVyYXRpb24gY29udmVyc2lvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGUtY29udmVyc2lvbi1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGRhdGEgdHlwZSBhbmQgYW4gb2JqZWN0IHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSB0byBjb252ZXJ0IGJldHdlZW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib2JqZWN0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGF0YS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGVzIHN0b3JhZ2UgZGF0YSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJpYWxpemVkLW9iamVjdC1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzIG9iamVjdCBzZXJpYWxpemF0aW9uIHRvIGNvbnZlcnQgYmV0d2VlbiB0aGUgb2JqZWN0IGFuZCBkYXRhIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZXMgc3RvcmFnZSBkYXRhIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIG1hcHBpbmcgb2YgdmFsdWVzIGZyb20gZGF0YWJhc2UgdmFsdWVzIHVzZWQgaW4gdGhlIGZpZWxkIGFuZCBvYmplY3QgdmFsdWVzIHVzZWQgaW4gdGhlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBvcHRpb25hbCBkZWZhdWx0IHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQuICBUaGlzIHZhbHVlIGlzIHVzZWQgaWYgYSBkYXRhYmFzZSB0eXBlIGlzIG5vdCBmb3VuZCBpbiB0aGUgdHlwZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtbWFwcGluZ3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtYXBwaW5nIG9mIHZhbHVlcy4gIEJvdGggdGhlIG9iamVjdCBhbmQgZGF0YWJhc2UgdmFsdWVzIG11c3QgYmUgdW5pcXVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InR5cGUtbWFwcGluZyIgdHlwZT0idHlwZS1tYXBwaW5nIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIG9iamVjdCBhbmQgZGF0YSB2YWx1ZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtb25seS10eXBlLW1hcHBpbmdzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIG1hcHBpbmcgb2YgYWRkaXRpb25hbCB2YWx1ZXMgdGhhdCBtYXAgbm9uLXVuaXF1ZSBkYXRhIHZhbHVlcyB0byBhIHVuaXF1ZSBhdHRyaWJ1dGUgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idHlwZS1tYXBwaW5nIiB0eXBlPSJ0eXBlLW1hcHBpbmciPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgb2JqZWN0IGFuZCBkYXRhIHZhbHVlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIGFuIG9iamVjdCBhbmQgZGF0YSB2YWx1ZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgdmFsdWUgdG8gdXNlIGluIHRoZSBvYmplY3QncyBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YS12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgdmFsdWUgdG8gdXNlIGluIHRoZSBkYXRhYmFzZSBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5L2ludGVyYWN0aW9uIGFnYWluc3QgYSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9Im1haW50YWluLWNhY2hlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBieXBhc3MgdGhlIGNhY2hlIGNvbXBsZXRlbHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCB1c2UgcGFyYW1hdGVyIGJpbmRpbmcgZm9yIGFyZ3VtZW50cywgb3IgcHJpbnQgdGhlIGFyZ3VtZW50cyBpbi1saW5lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FjaGUtc3RhdGVtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJpZXMgc3RhdGVtZW50IHNob3VsZCBiZSBjYWNoZWQsIHRoaXMgbXVzdCBiZSB1c2VkIHdpdGggcGFyYW1ldGVyIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSB0aW1lb3V0IHRvIGNhbmNlbCB0aGUgcXVlcnkgaW4gaWYgdGhlIHJlcXVlc3QgdGFrZXMgdG9vIGxvbmcgdG8gY29tcGxldGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJwcmVwYXJlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBwcmVwYXJlIGFuZCBjYWNoZSBpdHMgZ2VuZXJhdGVkIFNRTCwgb3IgcmVnZW5lcmF0ZSB0aGUgU1FMIG9uIGVhY2ggZXhlY3V0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FsbCIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIHN0YXRpYyBjYWxscyB0aGUgU1FMIG9yIFN0b3JlZCBQcm9jZWR1cmUgY2FsbCBkZWZpbml0aW9uIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGpvaW4gZmV0Y2ggb3B0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbm5lci1qb2luIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib3V0ZXItam9pbiIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhc2NhZGUtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGNhc2NhZGUgcG9saWNpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHJpdmF0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1yZWFkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nIGEgc2luZ2xlIHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtcmVhZC1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LXJlYWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcgYSBjb2xsZWN0aW9uIG9mIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YS1yZWFkLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhLXJlYWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcgcmF3IGRhdGEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlYWQtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYWNoZS1xdWVyeS1yZXN1bHRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBjYWNoZSB0aGUgcXVlcnkgcmVzdWx0cyB0byBhdm9pZCBmdXR1cmUgZXhlY3V0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1heC1yb3dzIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2gsIHJlc3VsdHMgd2lsbCBiZSB0cnVuY3RhdGUgb24gdGhlIGRhdGFiYXNlIHRvIHRoaXMgc2l6ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpcnN0LXJlc3VsdCIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHdoZXJlIHRvIHN0YXJ0IHRoZSBjdXJzb3IgaW4gYSByZXN1bHQgc2V0IHJldHVybmVkIGZyb20gdGhlIGRhdGFiYXNlLiBSZXN1bHRzIHByaW9yIHRvIHRoaXMgbnVtYmVyIHdpbGwgbm90IGJlIGJ1aWx0IGludG8gb2JqZWN0czwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzcyB0aGUgbnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2ggZnJvbSB0aGUgZGF0YWJhc2Ugb24gZWFjaCByZXN1bHQgc2V0IG5leHQgb3BlcmF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcnktcmVzdWx0LWNhY2hlLXBvbGljeSIgdHlwZT0icXVlcnktcmVzdWx0LWNhY2hlLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgcXVlcnkgcmVzdWx0cyBzaG91bGQgYmUgY2FjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1yZXN1bHQtY2FjaGUtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBxdWVyeSdzIHJlc3VsdHMgc2hvdWxkIGJlIGNhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImludmFsaWRhdGlvbi1wb2xpY3kiIHR5cGU9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS4gQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIxMDAiIG5hbWU9Im1heGltdW0tY2FjaGVkLXJlc3VsdHMiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGRlZmluZXMgdGhlIG51bWJlciBvZiBxdWVyeSByZXN1bHQgc2V0cyB0aGF0IHdpbGwgYmUgY2FjaGVkLiBUaGUgTFJVIHF1ZXJ5IHJlc3VsdHMgd2lsbCBiZSBkaXNjYXJkZWQgd2hlbiB0aGUgbWF4IHNpemUgaXMgcmVhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIG1hbmlwdWxhdGluZyBkYXRhLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIG1vZGlmeWluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1cGRhdGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciB1cGRhdGluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1tb2RpZnktcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc2VydC1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGluc2VydGluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1tb2RpZnktcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlbGV0ZS1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGRlbGV0aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9lcy1leGlzdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gb2JqZWN0IGV4aXN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImV4aXN0ZW5jZS1jaGVjayIgdHlwZT0iZXhpc3RlbmNlLWNoZWNrIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBleGlzdGVuY2UgY2hlY2sgb3B0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS1jaGVjayI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBleGlzdGVuY2UgY2hlY2sgb3B0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWNhY2hlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stZGF0YWJhc2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtZXhpc3RlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLW5vbi1leGlzdGVuY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgZGVsZXRpbmcgYSBjcml0ZXJpYSBvZiBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LWxldmVsLXJlYWQtcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBvYmplY3RzIChhcyBhcHBvc2VkIHRvIGRhdGEpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWFkLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGwgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIG9mIG9iamVjdHMgYmVpbmcgcXVlcmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgcmVmcmVzaCBhbnkgY2FjaGVkIG9iamVjdHMgZnJvbSB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVtb3RlLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCByZWZyZXNoIGFueSByZW1vdGVseSBjYWNoZWQgb2JqZWN0cyBmcm9tIHRoZSBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJjYXNjYWRlLXBvbGljeSIgdHlwZT0iY2FzY2FkZS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyaWVzIHNldHRpbmdzIChzdWNoIGFzIHJlZnJlc2gsIG1haW50YWluLWNhY2hlKSBzaG91bGQgYXBwbHkgdG8gdGhlIG9iamVjdCdzIHJlbGF0aW9uc2hpcCBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0icHJpbWFyeS1rZXkiIG5hbWU9ImNhY2hlLXVzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSBxdWVyeSBzaG91bGQgaW50ZXJhY3Qgd2l0aCB0aGUgY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJsb2NrLW1vZGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIGxvY2sgdGhlIHJlc3VsdGluZyByb3dzIG9uIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImRpc3RpbmN0LXN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCBmaWx0ZXIgZGlzdGluY3QgcmVzdWx0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluLW1lbW9yeS1xdWVyeWluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW4gbWVtb3J5IHF1ZXJ5aW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IGRlZmF1bHQ9Imlnbm9yZS1leGNlcHRpb25zLXJldHVybi1jb25mb3JtZWQiIG5hbWU9InBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyBpbmRpcmVjdGlvbiBvciB1bmNvbmZvcm1hYmxlIGV4cHJlc3Npb25zIHNob3VsZCBiZSB0cmVhdGluZyB3aXRoIGluLW1lbW9yeSBxdWVyeWluZyBhbmQgY29uZm9ybWluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0idXNlLWRlZmF1bHQtZmV0Y2gtZ3JvdXAiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGRlZmF1bHQgZmV0Y2ggZ3JvdXAgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJmZXRjaC1ncm91cCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgcXVlcnkgdG8gcGFydGlhbGx5IGZldGNoIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1ncm91cC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgYSBwcmUtZGVmaW5lZCBuYW1lZCBmZXRjaCBncm91cCB0byBhbGxvdyB0aGUgcXVlcnkgdG8gcGFydGlhbGx5IGZldGNoIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLWV4Y2x1c2l2ZS1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBleGNsdXNpdmUgY29ubmVjdGlvbiAoVlBEKSBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iam9pbmVkLWF0dHJpYnV0ZS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGF0dHJpYnV0ZXMgYmVpbmcgam9pbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGpvaW5pbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiBvYmplY3RzIHJlc3VsdGluZyBmcm9tIHRoZSBxdWVyeSBhcmUgcmVhZC1vbmx5LCBhbmQgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgdW5pdCBvZiB3b3JrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Im91dGVyLWpvaW4tc3ViY2xhc3NlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGluaGVyaXRhbmNlIHF1ZXJpZXMgc3BlY2lmeSBpZiBhbGwgc3ViY2xhc3NlcyBzaG91bGQgYmUgb3V0ZXIgam9pbmVkLCBpbnN0ZWFkIG9mIGEgcXVlcnkgcGVyIHN1YmNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgYSBzZXQgb2Ygb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LWxldmVsLXJlYWQtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmF0Y2gtcmVhZC1hdHRyaWJ1dGUtZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGFsbCBhdHRyaWJ1dGVzIGZvciBiYXRjaCByZWFkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGJhdGNoIHJlYWRpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3JkZXItYnktZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2V0cyB0aGUgb3JkZXIgZXhwcmVzc2lvbnMgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBvcmRlcmluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBhIHNpbmdsZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1sZXZlbC1yZWFkLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXBvcnQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5RdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYSBzZXQgb2Ygb2JqZWN0cyBpbnN0ZWFkIG9mIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4tY2hvaWNlIiB0eXBlPSJyZXR1cm4tY2hvaWNlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNpbXBsaWZpZXMgdGhlIHJlc3VsdCBieSBvbmx5IHJldHVybmluZyB0aGUgZmlyc3QgcmVzdWx0LCBmaXJzdCB2YWx1ZSwgb3IgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXRyaWV2ZS1wcmltYXJ5LWtleXMiIHR5cGU9InJldHJpZXZlLXByaW1hcnkta2V5cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2V0aGVyIHRoZSBwcmltYXJ5IGtleSB2YWx1ZXMgc2hvdWxkIGFsc28gYmUgcmV0cmlldmVkIGZvciB0aGUgcmVmZXJlbmNlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVwb3J0LWl0ZW1zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkl0ZW1zIHRvIGJlIHNlbGVjdGVkLCB0aGVzZSBjb3VsZCBiZSBhdHRyaWJ1dGVzIG9yIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpdGVtIiB0eXBlPSJyZXBvcnQtaXRlbSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGl0ZW0gcmVxdWVzdGVkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imdyb3VwLWJ5LWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNldHMgR1JPVVAgQlkgZXhwcmVzc2lvbnMgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBncm91cGluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icmV0dXJuLWNob2ljZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNpbXBsaWZpZXMgdGhlIHJlc3VsdCBieSBvbmx5IHJldHVybmluZyB0aGUgZmlyc3QgcmVzdWx0LCBmaXJzdCB2YWx1ZSwgb3IgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXR1cm4tc2luZ2xlLXJlc3VsdCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJldHVybi1zaW5nbGUtdmFsdWUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXR1cm4tc2luZ2xlLWF0dHJpYnV0ZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJldHJpZXZlLXByaW1hcnkta2V5cyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3ZXRoZXIgdGhlIHByaW1hcnkga2V5IHZhbHVlcyBzaG91bGQgYWxzbyBiZSByZXRyaWV2ZWQgZm9yIHRoZSByZWZlcmVuY2UgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmdWxsLXByaW1hcnkta2V5IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmlyc3QtcHJpbWFyeS1rZXkiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuby1wcmltYXJ5LWtleSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXBvcnQtaXRlbSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gaXRlbSByZXF1ZXN0ZWQgaW4gUmVwb3J0UXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TmFtZSBnaXZlbiBmb3IgaXRlbSwgY2FuIGJlIHVzZWQgdG8gcmV0aWV2ZSB2YWx1ZSBmcm9tIHJlc3VsdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhwcmVzc2lvbiAocGFydGlhbCkgdGhhdCBkZXNjcmliZXMgdGhlIGF0dHJpYnV0ZSB3YW50ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV4cHJlc3Npb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZpbHRlciBleHByZXNzaW9uIHRyZWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbi1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHJlbGF0aW9uIGV4cHJlc3Npb24gdGhhdCBjb21wYXJlcyB0byBleHByZXNzaW9ucyB0aHJvdWdoIG9wZXJhdG9ycyBzdWNoIGFzIGVxdWFsLCBsZXNzVGhhbiwgZXRjLi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxlZnQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJpZ2h0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHR5cGU9Im9wZXJhdG9yIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dpYy1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdHdvIHN1Yi1leHByZXNzaW9ucyBqb2luZWQgdGhyb3VnaCBhbiBvcGVyYXRvciBzdWNoIGFzIEFORCwgT1IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsZWZ0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyaWdodCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJvcGVyYXRvciIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZnVuY3Rpb24tZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBleHByZXNzaW9uIGNvbXBvc2VkIG9mIGEgZnVuY3Rpb24gYXBwbGllZCB0byBhIGxpc3Qgb2Ygc3ViLWV4cHJlc3Npb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZnVuY3Rpb24gYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCBleHByZXNzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZ1bmN0aW9uIiB0eXBlPSJvcGVyYXRvciIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29uc3RhbnQtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBpcyBudWxsIHRoZSB2YWx1ZSB0YWcgY2FuIGlzIGFic2VudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkta2V5LWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gcXVlcnkta2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzZSIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFueS1vZiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im91dGVyLWpvaW4iIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNlIiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFyYW1ldGVyLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gcGFyYW1ldGVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2UtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBidWlsZGVyL2Jhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3BlcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgb3BlcmF0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIFNRTCBxdWVyeSBsYW5ndWFnZSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxsIFNRTCBxdWVyeSBzdHJpbmcuICBBcmd1bWVudHMgY2FuIGJlIHNwZWNpZmllZCB0aHJvdWdoICNhcmctbmFtZSB0b2tlbnMgaW4gdGhlIHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpicWwtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUpCLVFMIHF1ZXJ5IGxhbmd1YWdlIHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamJxbCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgRUpCLVFMIHF1ZXJ5IHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLXByb2NlZHVyZS1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgaW52b2NhdGlvbiBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY3Vyc29yLW91dHB1dC1wcm9jZWR1cmUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgY2FsbCB0byB1c2UgYSBjdXJzb3Igb3V0cHV0IHBhcmFtZXRlciB0byBkZWZpbmUgdGhlIHJlc3VsdCBzZXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYW5kIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0icHJvY2VkdXJlLWFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2NlZHVyZS4gVGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudHMgbXVzdCBtYXRjaCB0aGUgcHJvY2VkdXJlIGFyZ3VtZW50cyBpZiBub3QgbmFtZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLWZ1bmN0aW9uLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIGZ1bmN0aW9uIGludm9jYXRpb24gZGVmaW5pdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic3RvcmVkLXByb2NlZHVyZS1jYWxsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBuYW1lPSJzdG9yZWQtZnVuY3Rpb24tcmVzdWx0IiB0eXBlPSJwcm9jZWR1cmUtb3V0cHV0LWFyZ3VtZW50Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN0b3JlZC1mdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgY2FsbCBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc3RvcmVkIHByb2NlZHVyZSBuYW1lIG9mIHRoZSBhcmd1bWVudC4gRm9yIGluZGV4ZWQgYXJndW1lbnQgdGhlIG5hbWUgaXMgbm90IHJlcXVpcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBhcyBkZWZpbmUgaW4gdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYXJndW1lbnQgY2xhc3MgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC1zcWx0eXBlIiB0eXBlPSJ4c2Q6aW50Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSkRCQyBpbnQgdHlwZSBvZiB0aGUgYXJndW1lbnQsIGFzIGRlZmluZWQgaW4gamF2YS5qZGJjLlR5cGVzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtc3FsdHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgdHlwZSBpZiBwcm9jZWR1cmUtYXJndW1lbnQtc3FsdHlwZSBpcyBTVFJVQ1Qgb3IgQVJSQVk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByb2NlZHVyZSBhcmd1bWVudCB2YWx1ZSBtYXliZSBiZSBzcGVjaWZpZWQgaWYgbm90IHVzaW5nIGEgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb2NlZHVyZS1vdXRwdXQtYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIG91dHB1dCBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icHJvY2VkdXJlLWFyZ3VtZW50IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9jZWR1cmUtaW5vdXRwdXQtYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIG91dHB1dCBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icHJvY2VkdXJlLWFyZ3VtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3V0cHV0LWFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBhcyBkZWZpbmUgaW4gdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1zdG9yZWQtcHJvY2VkdXJlLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBpbnZvY2F0aW9uIGRlZmluaXRpb24gd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gYXQgbGVhc3Qgb25lIE9yYWNsZSBQTC9TUUwgdHlwZSB0aGF0IGhhcyBubyBKREJDIHJlcHJlc2VudGF0aW9uIChlLmcuIEJPT0xFQU4sIFBMU19JTlRFR0VSLCBQTC9TUUwgcmVjb3JkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRleCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamRiYy10eXBlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXR5cGUiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1yZWNvcmQiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbXBhdGlibGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJqYXZhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGZpZWxkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29tcGF0aWJsZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImphdmEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuZXN0ZWQtdHlwZSIgdHlwZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYW4gRUlTIHJlY29yZCBkYXRhIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlY29yZCBzdHJ1Y3R1cmUgbmFtZSB0aGUgZGVzY3JpcHRvciBtYXBzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZXNwYWNlLXJlc29sdmVyIiB0eXBlPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWVzcGFjZSByZXNvbHZlciBmb3IgdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1pbnRlcmFjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUlTIGludGVyYWN0aW9uIHV0aWxpemluZyBNYXBwZWRSZWNvcmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgaW5wdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIG91dHB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1pbnRlcmFjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUlTIGludGVyYWN0aW9uIHV0aWxpemluZyBYTUwgcmVjb3Jkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJlY29yZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGlucHV0IHJlY29yZCwgaWYgcmVxdWlyZWQgYnkgdGhlIGFkYXB0ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yb290LWVsZW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgb3V0cHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIGlucHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBvdXRwdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmRleGVkLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIEluZGV4ZWQgcmVjb3Jkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyYWN0aW9uLWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBpbnRlcmFjdGlvbiBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByb2NlZHVyZSBhcmd1bWVudCB2YWx1ZSBtYXliZSBiZSBzcGVjaWZpZWQgaWYgbm90IHVzaW5nIGEgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW50ZXJhY3Rpb24gbmFtZSBvZiB0aGUgYXJndW1lbnQuIEZvciBpbmRleGVkIGFyZ3VtZW50cyB0aGUgbmFtZSBpcyBub3QgcmVxdWlyZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW4uIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnksIG9yIHRoZSBkZXNjcmlwdG9yIGZpZWxkIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcmVsYXRpb25hbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhIFN0cnVjdHVyZSB0eXBlIGluIGFuIG9iamVjdC1yZWxhdGlvbmFsIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZC1vcmRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgb3JkZXJlZCBsaXN0IG9mIHRoZSBmaWVsZCBkZWZpbmVkIGluIHRoZSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuZXN0ZWQtdGFibGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0vbS1tIHJlbGF0aW9uc2hpcCB0aGF0IG1ha2VzIHVzZSBvZiB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgbmVzdGVkLXRhYmxlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gaW4gdGhlIHNvdXJjZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgbmVzdGVkLXRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIG5lc3RlZC10YWJsZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcnJheS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgcHJpbWl0aXZlL3NpbXBsZSB0eXBlIHZhbHVlcyB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgYXJyYXkgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtYXJyYXktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIG9iamVjdC10eXBlcyB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgYXJyYXkgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3R1cmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdHJ1Y3R1cmUgb2Ygb2JqZWN0LXR5cGVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBvYmplY3QtdHlwZSB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgcmVmZXJlbmNlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgc291cmNlIHR5cGUgdGhhdCBzdG9yZXMgdGhlIHJlZmVyZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXJlbGF0aW9uYWwtZmllbGQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIE9iamVjdFJlbGF0aW9uYWxEYXRhYmFzZUZpZWxkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuZXN0ZWQtdHlwZS1maWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QteG1sLXR5cGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgbWFwcGluZyB0byBhbiBPcmFjbGUgWERCIFhNTCBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVhZC13aG9sZS1kb2N1bWVudCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGEgdXNlciBkZWZpbmVkIGNvbnZlcnRlciBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29sbGVjdGlvbi1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLU0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBYTUwgZWxlbWVudCB0byB0aGUgdGFyZ2V0IFhNTCBlbGVtZW50IGJhc2VkIG9uIGEga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtb2JqZWN0LXJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXJwb2xpY3kiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VzLXNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1vYmplY3QtcmVmZXJlbmNlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgWE1MIGVsZW1lbnQgdG8gdGhlIHRhcmdldCBYTUwgZWxlbWVudCBiYXNlZCBvbiBvbmUgb3IgbW9yZSBrZXlzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhZ2dyZWdhdGUtb2JqZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS10by10YXJnZXQta2V5LWZpZWxkLWFzc29jaWF0aW9uIiB0eXBlPSJmb3JlaWduLWtleSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzb3VyY2UtdG8tdGFyZ2V0LWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1jZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBuZXN0ZWQgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotCSAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIvPgotCSAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1nZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItc2V0LW1ldGhvZCIgbWluT2NjdXJzPSIwIi8+Ci0JPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIi8+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWdldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotCSAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1zZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIG9iamVjdCBtYXBwaW5nIGZvciBhbiBYTUwgbmVzdGVkIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1wb2xpY3kiIHR5cGU9ImFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgb2JqZWN0IG1hcHBpbmcgZm9yIGFuIFhNTCBuZXN0ZWQgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYW4gWE1MIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImRlZmF1bHQtcm9vdC1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRoZSBkZXNjcmlwdG9yIG1hcHMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LXJvb3QtZWxlbWVudC1maWVsZCIgdHlwZT0ibm9kZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgWE1MRmllbGQgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHJvb3QgZWxlbWVudCBvZiB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNob3VsZC1wcmVzZXJ2ZS1kb2N1bWVudCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIGlmIG5vZGVzIHNob3VsZCBiZSBjYWNoZWQgdG8gcHJlc2VydmUgdW5tYXBwZWQgZGF0YTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZXNwYWNlLXJlc29sdmVyIiB0eXBlPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWVzcGFjZSByZXNvbHZlciBmb3IgdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzY2hlbWEiIHR5cGU9InNjaGVtYS1yZWZlcmVuY2UiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxvY2F0aW9uIG9mIHRoZSBYTUwgU2NoZW1hLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhbiB4czphbnkgZGVjbGFyYXRpb24gb3IgeHM6YW55VHlwZSBlbGVtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UteG1sLXJvb3QiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LWF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGFuIHhzOmFueSBkZWNsYXJhdGlvbiBvciB4czphbnlUeXBlIGVsZW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBzaW5nbGUgb2JqZWN0IHRvIGFuIHhzOmFueSBkZWNsYXJhdGlvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UteG1sLXJvb3QiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWZyYWdtZW50LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIHNpbmdsZSBOb2RlIHRvIGEgZnJhZ21lbnQgb2YgYW4gWE1MIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1kaXJlY3QtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWZyYWdtZW50LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiBvZiBOb2RlcyB0byBhIGZyYWdtZW50IG9mIGFuIFhNTCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluYXJ5LWRhdGEtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgYmluYXJ5IG9iamVjdCB0byBiYXNlNjQgYmluYXJ5PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtc3dhLXJlZiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWltZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNob3VsZC1pbmxpbmUtZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2hvaWNlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhIGNob2ljZSBzdHJ1Y3R1cmUgaW4gYW4geG1sIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXBvbGljeSIgdHlwZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiB0eXBlPSJ4bWwtY2hvaWNlLWZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhIGNob2ljZSBzdHJ1Y3R1cmUgaW4gYW4geG1sIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiB0eXBlPSJ4bWwtY2hvaWNlLWZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtZmllbGQiIHR5cGU9Im5vZGUiIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbnZlcnNpb24tcGFpciI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBYUGF0aCBleHByZXNzaW9uIHRvIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlIGluIGFuIFhNTCBkb2N1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcG9zaXRpb24gb2YgdGhlIG5vZGUgaW4gdGhlIHBhcmVudCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZWQtdGV4dC1maWVsZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhpcyBpcyBhIHR5cGVkIHRleHQgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaW5nbGUtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIGlmIGVhY2ggaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBpcyBpbiB0aGUgc2FtZSBub2RlIGluc3RlYWQgb2YgaGF2aW5nIG9uZSBub2RlIHBlciBpdGVtIGluIHRoZSBjb2xsZWN0aW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic2NoZW1hLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNjaGVtYSB0eXBlIG9mIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InhtbC10by1qYXZhLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iamF2YS10by14bWwtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImxlYWYtZWxlbWVudC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGUgZWxlbWVudHMgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5pb24tbm9kZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZSB0byByZXByZXNlbnQgbm9kZXMgd2hpY2ggYXJlIG1hcHBlZCB0byB1bmlvbnM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGVkLXRleHQtZmllbGQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoaXMgaXMgYSB0eXBlZCB0ZXh0IGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2luZ2xlLW5vZGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyBpZiBlYWNoIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24gaXMgaW4gdGhlIHNhbWUgbm9kZSBpbnN0ZWFkIG9mIGhhdmluZyBvbmUgbm9kZSBwZXIgaXRlbSBpbiB0aGUgY29sbGVjdGlvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InNjaGVtYS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzY2hlbWEgdHlwZSBvZiB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ4bWwtdG8tamF2YS1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImphdmEtdG8teG1sLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVzcGFjZS1yZXNvbHZlciI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0ibmFtZXNwYWNlcyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9Im5hbWVzcGFjZSIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0LW5hbWVzcGFjZS11cmkiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVzcGFjZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlLXVyaSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlc291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYS1jb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vZGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLWNsYXNzLXBhdGgtcmVmZXJlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzY2hlbWEtcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtZmlsZS1yZWZlcmVuY2UiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNjaGVtYS1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS11cmwtcmVmZXJlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzY2hlbWEtcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtY2hhcmFjdGVyIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqYXZhLXRpbWVzdGFtcCI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGF0ZVRpbWUiIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqYXZhLXV0aWwtZGF0ZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGF0ZVRpbWUiIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21wLXBvbGljeSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBlc3NpbWlzdGljLWxvY2tpbmciIHR5cGU9InBlc3NpbWlzdGljLWxvY2tpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNtcCBiZWFuLWxldmVsIHBlc3NpbWlzdGljIGxvY2tpbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmZXItdW50aWwtY29tbWl0IiB0eXBlPSJkZWZlci11bnRpbC1jb21taXQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgbW9kaWZpY2F0aW9uIGRlZmVycmFsIGxldmVsIGZvciBub24tZGVmZXJyZWQgd3JpdGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIiB0eXBlPSJub24tZGVmZXJyZWQtY3JlYXRlLXRpbWUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgcG9pbnQgYXQgd2hpY2ggaW5zZXJ0IHdpbGwgYmUgaXNzdWVkIHRvIERhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXNzaW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0id2FpdCIgbmFtZT0ibG9ja2luZy1tb2RlIiB0eXBlPSJsb2NraW5nLW1vZGUiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGVmZXItdW50aWwtY29tbWl0Ij4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsLW1vZGlmaWNhdGlvbnMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1cGRhdGUtbW9kaWZpY2F0aW9ucyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJub24tZGVmZXJyZWQtY3JlYXRlLXRpbWUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZnRlci1lamJjcmVhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZnRlci1lamJwb3N0Y3JlYXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idW5kZWZpbmVkIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9ja2luZy1tb2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SG9sZHMgdGhlIHBlc3NpbWlzdGljIGxvY2tpbmcgbW9kZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndhaXQiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuby13YWl0IiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2Ugb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iIiBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iNTAiIG5hbWU9InByZWFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIHByZWFsbG9jYXRpb24gc2l6ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlZmVyZW5jZXMgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsIG92ZXJyaWRpbmcgaXRzIG5hbWUgYW5kIChvcHRpb25hbGx5KSBwcmVhbGxvY2F0aW9uIHNpemUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UbyB1c2UgcHJlYWxsb2NhdGlvbiBzaXplIG9mIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LCBzZXQgcHJlYWxsb2NhdGlvbiBzaXplIHRvIDA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hdGl2ZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRhdGFiYXNlIHNlcXVlbmNlIG1lY2hhbmlzbSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UYWJsZSBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRVUVOQ0UiIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfTkFNRSIgbmFtZT0ibmFtZS1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX0NPVU5UIiBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlciBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuYXJ5LXRhYmxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VW5hcnkgdGFibGUgc2VxdWVuY2UgLSBzZXF1ZW5jZSBuYW1lIGlzIGEgdGFibGUgbmFtZSwgdGFibGUgaGFzIGEgc2luZ2xlIGZpZWxkIGFuZCBhIHNpbmdsZSByb3c8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUVVFTkNFIiBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlciBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbGZpbGUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWxmaWxlIHNlcXVlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFVRU5DRSIgbmFtZT0icm9vdC1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfTkFNRSIgbmFtZT0ibmFtZS1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZSBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfQ09VTlQiIG5hbWU9ImNvdW50ZXItZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmZXRjaC1ncm91cHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyBhbGwgcHJlLWRlZmluZWQgZmV0Y2ggZ3JvdXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC1mZXRjaC1ncm91cCIgdHlwZT0iZmV0Y2gtZ3JvdXAiIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmV0Y2gtZ3JvdXAiIHR5cGU9ImZldGNoLWdyb3VwIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmZXRjaC1ncm91cCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIHRoZSBmZXRjaCBncm91cCBhdHRyaWJ1dGVzIGluZm8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZldGNoLWdyb3VwLWF0dHJpYnV0ZXMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyBhIGZldGNoIGdyb3VwJ3MgYXR0cmlidXRlIGxpc3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmV0Y2gtZ3JvdXAtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgZm9yIHRoaXMgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmVycmVkLWRldGVjdGlvbi1jaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyBiYWNrdXAgY2xvbmUgdG8gZGV0ZWN0IGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNoYW5nZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1sZXZlbC1jaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyAibWFyayBkaXJ0eSIgdG8gZGV0ZWN0IGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNoYW5nZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1sZXZlbC1jaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyBhIENoYW5nZVRyYWNrZXIgZmlyaW5nIFByb3BlcnR5Q2hhbmdlRXZlbnQncyB0byBkZXRlY3QgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2hhbmdlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBOdWxsIFBvbGljeSBpbiB1c2UgZm9yIHRoaXMgcmVsYXRpb25zaGlwIGN1cnJlbnRseSBhIGNob2ljZSBvZiBbTnVsbFBvbGljeSBhbmQgSXNTZXROdWxsUG9saWN5XS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ4c2ktbmlsLXJlcHJlc2VudHMtbnVsbCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZW1wdHktbm9kZS1yZXByZXNlbnRzLW51bGwiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1yZXByZXNlbnRhdGlvbi1mb3IteG1sIiB0eXBlPSJtYXJzaGFsLW51bGwtcmVwcmVzZW50YXRpb24iIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im51bGwtcG9saWN5Ij4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iaXMtc2V0LXBlcmZvcm1lZC1mb3ItYWJzZW50LW5vZGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaXMtc2V0LW51bGwtcG9saWN5Ij4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtc2V0LW1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpcy1zZXQtcGFyYW1ldGVyLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImlzLXNldC1wYXJhbWV0ZXIiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im1hcnNoYWwtbnVsbC1yZXByZXNlbnRhdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPldyaXRlIG51bGwsIG5vIHRhZyhkZWZhdWx0KSBvciBhbiBlbXB0eSB0YWcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYU0lfTklMIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUJTRU5UX05PREUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFTVBUWV9OT0RFIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGdlbmVyaWMgZmllbGQgY29uY2VwdCwgc3VjaCBhcyBhIGRhdGFiYXNlIGNvbHVtbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sdW1uIGluIGEgcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBjb2x1bW4ncyB0YWJsZS4gVGhpcyB0YWJsZSBtdXN0IGJlIGxpc3RlZCBpbiB0aGUgY2xhc3MnIHRhYmxlcy4gSWYgbm90IHNwZWNpZmllZCB0aGUgZmlyc3QgdGFibGUgb2YgdGhlIGNsYXNzIHdpbGwgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZm9yZWlnbi1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBzb3VyY2UvdGFyZ2V0IGZpZWxkL2NvbHVtbiByZWZlcmVuY2VzIHJlbGF0aW5nIGEgZm9yZWlnbiBrZXkgaW4gb25lIHRhYmxlIHRvIHRoZSBwcmltYXJ5IG9yIHVuaXF1ZSBrZXkgaW4gYW5vdGhlciB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtcmVmZXJlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcmVmZXJlbmNlIG9mIGEgc291cmNlIHRhYmxlIGZvcmVpZ24ga2V5IGFuZCBhIHRhcmdldCB0YWJsZSBwcmltYXJ5IGtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZpZWxkL2NvbHVtbiBuYW1lIGluIHRoZSBzb3VyY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByaW1hcnkgb3IgdW5pcXVlIGtleSBmaWVsZC9jb2x1bW4gbmFtZSBpbiB0aGUgdGFyZ2V0IHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IHNwZWNpZmljYXRpb24gZm9yIHF1ZXJ5aW5nIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgb2YgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBxdWVyeSBhcmd1bWVudHMuIFRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnQgbXVzdCBtYXRjaCB0aGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50IHZhbHVlIHBhc3NlZCB0byB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJxdWVyeS1hcmd1bWVudCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcXVlcnkuICBUaGlzIG5hbWUgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIGFuZCBleGVjdXRlIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNyaXRlcmlhIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZmlsdGVyaW5nIGNsYXVzZSBvZiBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIHR5cGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgbWF5IGJlIHByb3ZpZGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCBjb25zdGFudCB2YWx1ZSBmb3IgdGhlIGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvcGVydHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHVzZXIgZGVmaW5lZCBwcm9wZXJ0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmFueVR5cGUiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiB0YWJsZXMgdGhhdCB0aGUgY2xhc3MgaXMgcGVyc2lzdGVkIHRvLiAgVGhpcyBpcyB0eXBpY2FsbHkgYSBzaW5nbGUgdGFibGUgYnV0IGNhbiBiZSBtdWx0aXBsZSwgb3IgZW1wdHkgZm9yIGluaGVyaXRhbmNlIG9yIGFnZ3JlZ2F0ZWQgY2xhc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgdGFibGUuICBUaGUgbmFtZSBjYW4gYmUgZnVsbHkgcXVhbGlmaWVkIHdpdGggdGhlIHNjaGVtYSwgdGFibGVzcGFjZSBvciBsaW5rLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIFNwZWNpZmllcyBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUKLSAgICAgICAgb2JqZWN0IHZhbHVlLgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAJPHhzZDpzZXF1ZW5jZT4KLSAgCQk8eHNkOmVsZW1lbnQgbmFtZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiCi0gIAkJCXR5cGU9Im5vZGUtb3JkZXJpbmctcG9saWN5IiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0gIAkJPC94c2Q6ZWxlbWVudD4KLSAgCTwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8eHNkOmNvbXBsZXhUeXBlCi0gICAgCW5hbWU9ImRlc2NyaXB0b3ItbGV2ZWwtZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuby1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5kZXItcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFwcGVuZC1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZ25vcmUtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpdmUtcG9zaXRpb24tb3JkZXJpbmctcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4yLnhzZCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzEuMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYTU2OTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4yLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQyNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0Ci0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gZnJvbSBPcmFjbGUgVG9wTGluawotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4KLTwhLS0gRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlIFByb2plY3QgOjogTWFwIFNjaGVtYSBmaWxlIGZvciBPUk0vT1hNL0VJUyAtLT4KLTx4c2Q6c2NoZW1hCi0gIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIgotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIgotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICB2ZXJzaW9uPSIxLjIiCi0gID4KLSAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC1wZXJzaXN0ZW5jZSIgdHlwZT0ib2JqZWN0LXBlcnNpc3RlbmNlIiAvPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1wZXJzaXN0ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFuIG9iamVjdC1wZXJzaXN0ZW5jZSBtYXBwaW5nIG1vZHVsZSwgYSBzZXQgb2YgY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgbmFtZSBmb3IgdGhlIG1vZGVsIGJlaW5nIG1hcHBlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvcnMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGNsYXNzIG1hcHBpbmcgZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciIgdHlwZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmZvcm1hdGlvbiBvZiBob3cgYSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8gaXRzIGRhdGEtc3RvcmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImxvZ2luIiB0eXBlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0YXNvdXJjZSBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImRlZmF1bHQtdGVtcG9yYWwtbXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGRlZmF1bHQgZm9yIGhvdyBEYXRlIGFuZCBDYWxlbmRhciB0eXBlcyBhcmUgdXNlZCB3aXRoIGNoYW5nZSB0cmFja2luZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5CeSBkZWZhdWx0IHRoZXkgYXJlIGFzc3VtZWQgbm90IHRvIGJlIGNoYW5nZWQgZGlyZWN0bHkgKG9ubHkgcmVwbGFjZWQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcmllcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBsaXN0IG9mIHF1ZXJpZXMgdG8gYmUgc3RvcmVkIG9uIHRoZSBzZXNzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeSIgdHlwZT0iZGF0YWJhc2UtcXVlcnkiPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIGRlZmF1bHQ9IkVjbGlwc2UgUGVyc2lzdGVuY2UgU2VydmljZXMgLSAxLjEgKEJ1aWxkIFlZTU1ERCkiIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0YXNvdXJjZSBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGxhdGZvcm0tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgcGxhdGZvcm0gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIHVzZXItbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0YXNvdXJjZSBwYXNzd29yZCwgdGhpcyBpcyBzdG9yZWQgaW4gZW5jcnlwdGVkIGZvcm0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZXh0ZXJuYWwtY29ubmVjdGlvbi1wb29saW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBpZiB0aGUgY29ubmVjdGlvbnMgYXJlIG1hbmFnZWQgYnkgdGhlIGRhdGFzb3VyY2UgZHJpdmVyLCBhbmQgYSBuZXcgY29ubmVjdGlvbiBzaG91bGQgYmUgYWNxdWlyZSBwZXIgY2FsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJleHRlcm5hbC10cmFuc2FjdGlvbi1jb250cm9sbGVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBpZiB0aGUgdHJhbnNhY3Rpb24gYXJlIG1hbmFnZWQgYnkgYSB0cmFuc2FjdGlvbiBtYW5hZ2VyLCBhbmQgc2hvdWxkIG5vdCBiZSBtYW5hZ2VkIGJ5IFRvcExpbmsuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYWxzbyBiZSB1c2VkIGlmIHRoZSBkYXRhc291cmNlIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNhY3Rpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VxdWVuY2luZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2luZyBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIiB0eXBlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmYXVsdCBzZXF1ZW5jZS4gVGhlIG5hbWUgaXMgb3B0aW9uYWwuIElmIG5vIG5hbWUgcHJvdmlkZWQgYW4gZW1wdHkgc3RyaW5nIHdpbGwgYmUgdXNlZCBhcyBhIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXF1ZW5jZXMiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk5vbiBkZWZhdWx0IHNlcXVlbmNlcy4gTWFrZSBzdXJlIGVhY2ggc2VxdWVuY2UgaGFzIHVuaXF1ZSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzZXF1ZW5jZSIgdHlwZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1sb2dpbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBKREJDIGRyaXZlciBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZHJpdmVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSkRCQyBkcml2ZXIgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb25uZWN0aW9uLXVybCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbCBKREJDIGRyaXZlciBjb25uZWN0aW9uIFVSTC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImJpbmQtYWxsLXBhcmFtZXRlcnMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBwYXJhbWV0ZXIgYmluZGluZyBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYWNoZS1hbGwtc3RhdGVtZW50cyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIHN0YXRlbWVudCBjYWNoaW5nIHNob3VsZCBiZSB1c2VkLiAgVGhpcyBzaG91bGQgYmUgdXNlZCB3aXRoIHBhcmFtZXRlciBiaW5kaW5nLCB0aGlzIGNhbm5vdCBiZSB1c2VkIHdpdGggZXh0ZXJuYWwgY29ubmVjdGlvbiBwb29saW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iYnl0ZS1hcnJheS1iaW5kaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgYnl0ZSBhcnJheSBkYXRhLXR5cGVzIHNob3VsZCB1c2UgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJzdHJpbmctYmluZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIHN0cmluZyBkYXRhLXR5cGVzIHNob3VsZCB1c2UgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjI1NiIgbmFtZT0ic3RyaW5nLWJpbmRpbmctc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRoZSB0aHJlc2hvbGQgc3RyaW5nIHNpemUgZm9yIHVzYWdlIG9mIHN0cmluZyBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InN0cmVhbXMtZm9yLWJpbmRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBsYXJnZSBieXRlIGFycmF5IGFuZCBzdHJpbmcgZGF0YS10eXBlcyBzaG91bGQgYmUgYm91bmQgYXMgc3RyZWFtcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJmb3JjZS1maWVsZC1uYW1lcy10by11cHBlci1jYXNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdG8gZm9yY2UgYWxsIGZpZWxkIG5hbWVzIHRvIHVwcGVyLWNhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJvcHRpbWl6ZS1kYXRhLWNvbnZlcnNpb24iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBkYXRhIG9wdGltaXphdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InRyaW0tc3RyaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIHN0cmluZyB0cmFpbGluZyBibGFua3Mgc2hvdWxkIGJlIHRyaW1tZWQuICBUaGlzIGlzIG5vcm1hbGx5IHJlcXVpcmVkIGZvciBDSEFSIGRhdGEtdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtd3JpdGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIGJhdGNoIHdyaXRpbmcgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJqZGJjLWJhdGNoLXdyaXRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHVzaW5nIGJhdGNoIHdyaXRpbmcsIGNvbmZpZ3VyZSBpZiB0aGUgSkRCQyBkcml2ZXJzIGJhdGNoIHdyaXRpbmcgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1sb2dpbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBKQ0EgZHJpdmVyIGFuZCBFSVMgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29ubmVjdGlvbi1zcGVjLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgVG9wTGluayBwbGF0Zm9ybSBzcGVjaWZpYyBjb25uZWN0aW9uIHNwZWMgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb25uZWN0aW9uLWZhY3RvcnktdXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBKTkRJIHVybCBmb3IgdGhlIG1hbmFnZWQgSkNBIGFkYXB0ZXIncyBjb25uZWN0aW9uIGZhY3RvcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1sb2dpbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiCi0gICAgICAgIAkJbmFtZT0iZXF1YWwtbmFtZXNwYWNlLXJlc29sdmVycyIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIAk8eHNkOmVsZW1lbnQgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSIKLSAgICAgICAgCQl0eXBlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5IiBtYXhPY2N1cnM9IjEiCi0gICAgICAgIAkJbWluT2NjdXJzPSIwIj4KLSAgICAgICAgCTwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmZvcm1hdGlvbiBvZiBob3cgYSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8gaXRzIGRhdGEtc3RvcmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGlzIGFuIGFic3RyYWN0IGRlZmluaXRpb24gdG8gYWxsb3cgZmxleGliaWxpdHkgaW4gdGhlIHR5cGVzIG9mIGNsYXNzZXMgYW5kIGRhdGFzdG9yZXMgcGVyc2lzdGVkLCBpLmUuIGludGVyZmFjZXMsIGFic3RyYWN0IGNsYXNzZXMsIGFnZ3JlZ2F0ZXMsIG5vbi1yZWxhdGlvbmFsIHBlcnNpc3RlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgYmVpbmcgcGVyc2lzdGVkLiAgVGhlIGNsYXNzIG5hbWUgbXVzdCBiZSBmdWxsIHF1YWxpZmllZCB3aXRoIGl0cyBwYWNrYWdlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxjbGFzcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5leGFtcGxlLmVtcGxveWVlLmltcGxlbWVudGF0aW9uLkVtcGxveWVlPC9jbGFzcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFsaWFzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IGFuIGFsaWFzIG5hbWUgY2FuIGJlIGdpdmVuIGZvciB0aGUgY2xhc3MuICBUaGUgYWxpYXMgaXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byByZWZlciB0byB0aGUgY2xhc3MgaW4gcGxhY2Ugb2YgaXRzIGltcGxlbWVudGF0aW9uIG5hbWUsIHN1Y2ggYXMgaW4gcXVlcnlpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGFsaWFzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPkVtcGxveWVlPC9hbGlhcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBmaWVsZHMvY29sdW1ucyB0aGF0IG1ha2UgdXAgdGhlIHByaW1hcnkga2V5IG9yIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGlzIHVzZWQgZm9yIGNhY2hpbmcsIHJlbGF0aW9uc2hpcHMsIGFuZCBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByaW1hcnkga2V5IGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBpZiB0aGUgY2xhc3MgaXMgcmVhZC1vbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvcGVydGllcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHVzZXIgZGVmaW5lZCBwcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InByb3BlcnR5IiB0eXBlPSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSB1c2VyIGRlZmluZWQgcHJvcGVydHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJpbmhlcml0YW5jZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcyBpcyByZWxhdGVkIGluIGluaGVyaXRhbmNlIGFuZCBob3cgdGhpcyBpbmhlcml0YW5jZSBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJldmVudHMiIHR5cGU9ImV2ZW50LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGVyc2lzdGVudCBldmVudHMgZm9yIHRoaXMgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyeWluZyIgdHlwZT0icXVlcnktcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBkZWZpbmVkIHF1ZXJpZXMgZm9yIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1tYXBwaW5ncyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgbWFwcGluZ3MgdGhhdCBkZWZpbmUgaG93IHRoZSBjbGFzcycgYXR0cmlidXRlcyBhcmUgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhdHRyaWJ1dGUtbWFwcGluZyIgdHlwZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgYXR0cmlidXRlIGlzIHBlcnNpc3RlZC4gVGhlIGF0dHJpYnV0ZSBtYXBwaW5nIGRlZmluaXRpb24gaXMgZXh0ZW5kYWJsZSB0byBhbGxvdyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZXNjcmlwdG9yLXR5cGUiIHR5cGU9ImNsYXNzLWRlc2NyaXB0b3ItdHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZGVzY3JpcHRvciB0eXBlLCBzdWNoIGFzIGFnZ3JlZ2F0ZSBvciBpbmRlcGVuZGVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImludGVyZmFjZXMiIHR5cGU9ImludGVyZmFjZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGludGVyZmFjZXMgdGhhdCB0aGlzIGNsYXNzIGltcGxlbWVudHMuLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibG9ja2luZyIgdHlwZT0ibG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGxvY2tpbmcgYmVoYXZpb3IgZm9yIHRoZSBjbGFzcy4gIFN1Y2ggYXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiB2ZXJzaW9uLCB0aW1lc3RhbXAgb3IgY2hhbmdlIHNldCBvZiBjb2x1bW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VxdWVuY2luZyIgdHlwZT0ic2VxdWVuY2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgZ2VuZXJhdGVkIHVuaXF1ZSBpZCBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FjaGluZyIgdHlwZT0iY2FjaGluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcycgaW5zdGFuY2VzIHNob3VsZCBiZSBjYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZW1vdGUtY2FjaGluZyIgdHlwZT0iY2FjaGluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcycgaW5zdGFuY2VzIHNob3VsZCBiZSBjYWNoZWQgb24gcmVtb3RlIGNsaWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXBvbGljeSIgdHlwZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2Ygb2JqZWN0cyBhcmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGhpc3RvcnkgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuaW5nLXBvbGljeSIgdHlwZT0icmV0dXJuaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyByZXR1bmluZyBwb2xpY3kuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gcmV0dXJuaW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFtZW5kbWVudCIgdHlwZT0iYW1lbmRtZW50Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYW1lbmRlZCBvciBjdXN0b21pemVkIHRocm91Z2ggYSBjbGFzcyBBUEkgYWZ0ZXIgbG9hZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc3RhbnRpYXRpb24iIHR5cGU9Imluc3RhbnRpYXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGluc3RhbnRpYXRpb24gYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29weWluZyIgdHlwZT0iY29weS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgY2xvbmluZy9jb3B5aW5nIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyeS1rZXlzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGxpc3Qgb2YgcXVlcnkga2V5cyBvciBhbGlhc2VzIGZvciBkYXRhYmFzZSBpbmZvcm1hdGlvbi4gIFRoZXNlIGNhbiBiZSB1c2VkIGluIHF1ZXJpZXMgaW5zdGVhZCBvZiB0aGUgZGF0YWJhc2UgY29sdW1uIG5hbWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeS1rZXkiIHR5cGU9InF1ZXJ5LWtleSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgcXVlcnlpbmcgZGF0YWJhc2UgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNtcC1wb2xpY3kiIHR5cGU9ImNtcC1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlBsYWNlIGhvbGRlciBvZiBDTVAgaW5mb3JtYXRpb24gc3BlY2lmaWMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1ncm91cHMiIHR5cGU9ImZldGNoLWdyb3VwcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYWxsIHByZS1kZWZpbmVkIGZldGNoIGdyb3VwcyBhdCB0aGUgZGVzY3JpcHRvciBsZXZlbDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjaGFuZ2UtcG9saWN5IiB0eXBlPSJjaGFuZ2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyB0aGUgQ2hhbmdlIFBvbGljeSBmb3IgdGhpcyBkZXNjcmlwdG9yPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgZml4ZWQ9IjEwIiBuYW1lPSJzY2hlbWEtbWFqb3ItdmVyc2lvbiIgdHlwZT0ieHNkOmludGVnZXIiIC8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgZml4ZWQ9IjAiIG5hbWU9InNjaGVtYS1taW5vci12ZXJzaW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjbGFzcy1kZXNjcmlwdG9yLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjbGFzcyBkZXNjcmlwdG9yIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbmRlcGVuZGVudCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFnZ3JlZ2F0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFnZ3JlZ2F0ZS1jb2xsZWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG9zaXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG9zaXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW50ZXJmYWNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyZmFjZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBpbnRlcmZhY2VzIHRoYXQgYSBjbGFzcyBkZXNjcmlwdG9yIGltcGxlbWVudHMsIG9yIHRoZSBpbXBsZW1lbnRpb24gY2xhc3MgZm9yIGFuIGludGVyZmFjZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBhIHNldCBvZiBwdWJsaWMgaW50ZXJmYWNlcyBmb3IgdGhlIGNsYXNzIGNhbiBiZSBzcGVjaWZpZWQuICBUaGlzIGFsbG93cyB0aGUgaW50ZXJmYWNlIHRvIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdHdvIGNsYXNzZXMgaW1wbGVtZW50IHRoZSBzYW1lIGludGVyZmFjZSwgYW4gaW50ZXJmYWNlIGRlc2NyaXB0b3Igc2hvdWxkIGJlIGRlZmluZWQgZm9yIHRoZSBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBhbHNvIGJlIHVzZWQgdG8gZGVmaW5lIGluaGVyaXRhbmNlIGJldHdlZW4gaW50ZXJmYWNlIGRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImludGVyZmFjZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBpbnRlcmZhY2UgY2xhc3MgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8Y2xhc3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+ZXhhbXBsZS5lbXBsb3llZS5hcGkuRW1wbG95ZWU8L2NsYXNzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImltcGxlbWVudG9yLWRlc2NyaXB0b3IiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHdoaWNoIHRoaXMgaW50ZXJmYWNlIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgdGhlIGludGVyZmFjZSBoYXMgb25seSBhIHNpbmdsZSBpbXBsZW1lbnRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8Y2xhc3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+ZXhhbXBsZS5lbXBsb3llZS5pbXBsLkVtcGxveWVlPC9jbGFzcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGNsb25pbmcvY29weWluZyBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNyZWF0ZXMgYSBjb3B5aW5nIHRocm91Z2ggY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2UgdG8gY29weSBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb3B5LXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGNsb25pbmcvY29weWluZyBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkIHRocm91Z2ggYSBjbG9uZSBtZXRob2QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvcHktcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGNsb25lIG1ldGhvZCBvbiB0aGUgb2JqZWN0LCBpLmUuICdjbG9uZSc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zdGFudGlhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGluc3RhbnRpYXRpb24gYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBvbiB0aGUgZmFjdG9yeSB0byBpbnN0YW50aWF0ZSB0aGUgb2JqZWN0IGluc3RhbmNlLic8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZhY3RvcnktY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgZmFjdG9yeSBjbGFzcyBuYW1lLic8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZhY3RvcnktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGluc3RhbnRpYXRlIHRoZSBmYWN0b3J5IGNsYXNzLic8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYW1lbmRtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgY2xhc3MgYW5kIHN0YXRpYyBtZXRob2QgdG8gYmUgY2FsbGVkIHRvIGFsbG93IGZvciB0aGUgZGVzY3JpcHRvciB0byBiZSBhbWVuZGVkIG9yIGN1c3RvbWl6ZWQgdGhyb3VnaCBhIGNsYXNzIEFQSSBhZnRlciBsb2FkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFtZW5kbWVudC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+IFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYW1lbmRtZW50IGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFtZW5kbWVudC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYW1lbmRtZW50IG1ldGhvZCBvbiB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uYWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYSByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlKHMpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRhYmxlcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiB0aGUgdGFibGVzIHRoZSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8uICBUeXBpY2FsbHkgYSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8gYSBzaW5nbGUgdGFibGUsIGJ1dCBtdWx0aXBsZSB0YWJsZXMgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idGFibGUiIHR5cGU9InRhYmxlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHRhYmxlcyB0aGF0IHRoZSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8uICBUaGlzIGlzIHR5cGljYWxseSBhIHNpbmdsZSB0YWJsZSBidXQgY2FuIGJlIG11bHRpcGxlLCBvciBlbXB0eSBmb3IgaW5oZXJpdGFuY2Ugb3IgYWdncmVnYXRlZCBjbGFzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleXMtZm9yLW11bHRpcGxlLXRhYmxlIiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgZm9yZWlnbiBrZXkgZmllbGQgcmVmZXJlbmNlcyB0byBiZSBkZWZpbmUgZm9yIG11bHRpcGxlIHRhYmxlIGRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibXVsdGlwbGUtdGFibGUtam9pbi1jcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGNvbXBsZXggbXVsdGlwbGUgdGFibGUgam9pbiBjb25kaXRpb25zIGFuIGV4cHJlc3Npb24gbWF5IGJlIHByb3ZpZGVkIGluc3RlYWQgb2YgdGhlIHRhYmxlIGZvcmVpZ24ga2V5IGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24tbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gYSBudW1lcmljIHZlcnNpb24gZmllbGQvY29sdW1uIHRoYXQgdHJhY2tzIGNoYW5nZXMgYW5kIHRoZSB2ZXJzaW9uIHRvIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBhbmQgb3B0aW9uYWxseSB0aGUgdGFibGUgb2YgdGhlIGNvbHVtbiB0aGF0IHRoZSBhdHRyaWJ1dGUgaXMgc3RvcmVkIGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJzdG9yZS12ZXJzaW9uLWluLWNhY2hlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSB2ZXJzaW9uIHZhbHVlIHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIGNhY2hlLCBvciBpZiBpdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lc3RhbXAtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gdGltZXN0YW1wIHZlcnNpb24gY29sdW1uIHRoYXQgdHJhY2tzIGNoYW5nZXMgYW5kIHRoZSB2ZXJzaW9uIHRvIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmVyc2lvbi1sb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InNlcnZlci10aW1lIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSB0aW1lc3RhbXAgc2hvdWxkIGJlIG9idGFpbmVkIGxvY2FsbHkgb3IgZnJvbSB0aGUgZGF0YWJhc2Ugc2VydmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhbGwtZmllbGRzLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgcmVhZCB2YWx1ZXMgb2YgYWxsIGZpZWxkcyBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2VkLWZpZWxkcy1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIG9yaWdpbmFsIHJlYWQgdmFsdWVzIG9mIG9ubHkgdGhlIGNoYW5nZWQgZmllbGRzIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlbGVjdGVkLWZpZWxkcy1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIG9yaWdpbmFsIHJlYWQgdmFsdWVzIG9mIGEgc3BlY2lmaWVkIHNldCBvZiBmaWVsZHMgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBzZXQgb2YgZmllbGRzIHRvIGNvbXBhcmUgb24gdXBkYXRlIGFuZCBkZWxldGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jaW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgZGF0YWJhc2UgZ2VuZXJhdGVkIHVuaXF1ZSBpZCBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGdlbmVyYXRvci4gIFRoaXMgY291bGQgYmUgdGhlIG5hbWUgb2YgYSBzZXF1ZW5jZSBvYmplY3QsIG9yIGEgcm93IHZhbHVlIGluIGEgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBmaWVsZC9jb2x1bW4gdGhhdCB0aGUgZ2VuZXJhdGVkIHNlcXVlbmNlIGlkIGlzIGFzc2lnbmVkIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgY2FjaGluZyB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmdWxsIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2FjaGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3ZWFrLXJlZmVyZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNvZnQtcmVmZXJlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic29mdC1jYWNoZS13ZWFrLXJlZmVyZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhhcmQtY2FjaGUtd2Vhay1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FjaGluZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MnIGluc3RhbmNlcyBzaG91bGQgYmUgY2FjaGVkIGFuZCBob3cgb2JqZWN0IGlkZW50aXR5IHNob3VsZCBiZSBtYWludGFpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ic29mdC1jYWNoZS13ZWFrLXJlZmVyZW5jZSIgbmFtZT0iY2FjaGUtdHlwZSIgdHlwZT0iY2FjaGUtdHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgdHlwZSBvZiBjYWNoaW5nLCBzdWNoIGFzIExSVSwgd2VhayByZWZlcmVuY2Ugb3Igbm9uZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjEwMCIgbmFtZT0iY2FjaGUtc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGluaXRpYWwgb3IgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJhbHdheXMtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIHJlZnJlc2ggY2FjaGVkIG9iamVjdHMgb24gcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJvbmx5LXJlZnJlc2gtY2FjaGUtaWYtbmV3ZXItdmVyc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gcmVmcmVzaCBpZiB0aGUgY2FjaGVkIG9iamVjdCBpcyBhbiBvbGRlciB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImRpc2FibGUtY2FjaGUtaGl0cyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRpc2FibGUgb2J0YWluaW5nIGNhY2hlIGhpdHMgb24gcHJpbWFyeSBrZXkgcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJhbHdheXMtY29uZm9ybSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGNvbmZvcm0gcXVlcmllcyB3aXRoaW4gYSB0cmFuc2FjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJpc29sYXRlZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgb2JqZWN0cyBvZiB0aGlzIHR5cGUgc2hvdWxkIGJlIGlzb2xhdGVkIGZyb20gdGhlIHNoYXJlZCBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Imlzb2xhdGUtbmV3LWRhdGEtYWZ0ZXItdHJhbnNhY3Rpb24iIG5hbWU9InVuaXRvZndvcmstaXNvbGF0aW9uLWxldmVsIiB0eXBlPSJ1bml0b2Z3b3JrLWlzb2xhdGlvbi1sZXZlbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHVuaXQgb2Ygd29yayBzaG91bGQgYmUgaXNvbGF0ZWQgdG8gdGhlIHNlc3Npb24gY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5IiB0eXBlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImNoYW5nZS1zZXQiIG5hbWU9ImNhY2hlLXN5bmMtdHlwZSIgdHlwZT0iY2FjaGUtc3luYy10eXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgdHlwZSBvZiBjYWNoZSBzeW5jaHJvbml6YXRpb24gdG8gYmUgdXNlZCB3aXRoIHRoaXMgZGVzY3JpcG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZS1pbnZhbGlkYXRpb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVwZGF0ZS1yZWFkLXRpbWUtb24tdXBkYXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm8tZXhwaXJ5LWNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5IHdoZXJlIG9iamVjdHMgaW4gdGhlIGNhY2hlIGRvIG5vdCBleHBpcmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNhY2hlLWludmFsaWRhdGlvbiIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZS10by1saXZlLWNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5IHdoZXJlIG9iamVjdHMgbGl2ZSBhIHNwZWNpZmljIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhleSBhcmUgcmVhZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGltZS10by1saXZlIiB0eXBlPSJ4c2Q6bG9uZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhaWx5LWNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DYWNoZSBpbnZhbGlkYXRpb24gUG9saWN5IHdoZXJlIG9iamVjdHMgZXhwaXJlIGF0IGEgc3BlY2lmaWMgdGltZSBldmVyeSBkYXk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5LXRpbWUiIHR5cGU9InhzZDpkYXRlVGltZSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiBvYmplY3RzIGFyZSB0byBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJoYW5kbGUtd3JpdGVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UtZGF0YWJhc2UtdGltZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXRhYmxlcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgbmFtZXMgb2YgdGhlIG1pcnJvcmluZyBoaXN0b3JpY2FsIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Imhpc3RvcnktdGFibGUiIHR5cGU9Imhpc3RvcnktdGFibGUiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0YXJ0LWZpZWxkcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc3RhcnQgZmllbGRzIGZvciBlYWNoIGhpc3RvcmljYWwgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzdGFydC1maWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImVuZC1maWVsZHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGVuZCBmaWVsZHMgZm9yIGVhY2ggaGlzdG9yaWNhbCB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImVuZC1maWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaGlzdG9yeS10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkVhY2ggZW50cnkgaXMgYSBzb3VyY2UgKGRlc2NyaXB0b3IpIHRvIGhpc3RvcnkgdGFibGUgbmFtZSBhc3NvY2lhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IiIgbmFtZT0ic291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMSIgbmFtZT0iaGlzdG9yeSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmV0dXJuaW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgcmV0dW5pbmcgcG9saWN5LiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIHJldHVybmluZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBuYW1lPSJyZXR1cm5pbmctZmllbGQtaW5mb3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIHRoZSBmaWVsZHMgdG8gYmUgcmV0dXJuZWQgdG9nZXRoZXIgd2l0aCB0aGUgZmxhZ3MgZGVmaW5pbmcgcmV0dXJuaW5nIG9wdGlvbnM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InJldHVybmluZy1maWVsZC1pbmZvIiB0eXBlPSJyZXR1cm5pbmctZmllbGQtaW5mbyIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXR1cm5pbmctZmllbGQtaW5mbyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZpZWxkIHRvIGJlIHJldHVybmVkIHRvZ2V0aGVyIHdpdGggdHlwZSBhbmQgdGhlIGZsYWdzIGRlZmluaW5nIHJldHVybmluZyBvcHRpb25zLiBBdCBsZWFzdCBvbmUgb2YgaW5zZXJ0LCB1cGRhdGUgc2hvdWxkIGJlIHRydWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdGFyZ2V0IHJlZmVyZW5jZWQgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgdG8gYmUgcmV0dXJuZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iaW5zZXJ0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBiZSByZXR1bmVkIGFmdGVyIEluc2VydC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJpbnNlcnQtbW9kZS1yZXR1cm4tb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIGluc2VydD09dHJ1ZSwgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBub3QgYmUgaW5zZXJ0ZWQgKHRydWUpLiBJZiBpbnNlcnQ9PWZhbHNlIC0gaWdub3JlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgc2hvdWxkIGJlIHJldHVuZWQgYWZ0ZXIgSW5zZXJ0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmhlcml0YW5jZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MgaXMgcmVsYXRlZCBpbiBpbmhlcml0YW5jZSBhbmQgaG93IHRoaXMgaW5oZXJpdGFuY2UgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGFyZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcGFyZW50L3N1cGVyY2xhc3Mgb2YgdGhlIGNsYXNzIGJlaW5nIHBlcnNpc3RlZC4gIFRoZSBjbGFzcyBuYW1lIG11c3QgYmUgZnVsbCBxdWFsaWZpZWQgICB3aXRoIGl0cyBwYWNrYWdlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0icmVhZC1zdWJjbGFzc2VzLW9uLXF1ZXJpZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgaWYgc3ViY2xhc3NlcyBvZiB0aGUgY2xhc3Mgc2hvdWxkIGJlIHJldHVybmVkIG9uIHF1ZXJpZXMsIG9yIG9ubHkgdGhlIGV4YWN0IGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWxsLXN1YmNsYXNzZXMtdmlldyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBuYW1lIG9mIGEgdmlldyB0aGF0IGpvaW5zIGFsbCBvZiB0aGUgc3ViY2xhc3MnIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UtY2xhc3MtbmFtZS1hcy1pbmRpY2F0b3IiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBjbGFzcyB0eXBlIGluZGljYXRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWV4dHJhY3Rpb24tbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiBhIG1ldGhvZCBvbiB0aGUgY2xhc3MgdGhhdCB0YWtlcyB0aGUgY2xhc3MnIHJvdyBhcyBhcmd1bWVudCBhIGNvbXB1dGVkIHRoYXQgY2xhc3MgdHlwZSB0byBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGZyb20gdGhlIHJvdy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWluZGljYXRvci1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSB0eXBlIGZpZWxkL2NvbHVtbiB0aGF0IHRoZSBjbGFzcyB0eXBlIGlzIHN0b3JlZCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIiB0eXBlPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgY2xhc3MgaW5kaWNhdG9yIHZhbHVlcyBhbmQgdGhlIHN1YmNsYXNzZXMgdGhleSBtYXAgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1leHRyYWN0b3IiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgY2xhc3MgZXh0cmFjdG9yIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im9ubHktaW5zdGFuY2VzLWNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNyaXRlcmlhIHRoYXQgZmlsdGVycyBvdXQgYWxsIHNpYmxpbmcgYW5kIHN1YmNsYXNzIGluc3RhbmNlcyBvbiBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWxsLXN1YmNsYXNzZXMtY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY3JpdGVyaWEgdGhhdCBmaWx0ZXJzIG91dCBzaWJsaW5nIGluc3RhbmNlcyBvbiBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Im91dGVyLWpvaW4tc3ViY2xhc3NlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBpbmhlcml0YW5jZSBxdWVyaWVzIHNwZWNpZnkgaWYgYWxsIHN1YmNsYXNzZXMgc2hvdWxkIGJlIG91dGVyIGpvaW5lZCwgaW5zdGVhZCBvZiBhIHF1ZXJ5IHBlciBzdWJjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icW5hbWUtaW5oZXJpdGFuY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXh0ZW5kcyBpbmhlcml0YW5jZSBwb2xpY3kuIEFsbG93cyBmb3IgcHJlZml4ZWQgbmFtZXMgdG8gYmUgcmVzb2x2ZWQgYXQgcnVudGltZSB0byBmaW5kIHRoZSBhcHByb3JpYXRlIGNsYXNzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluaGVyaXRhbmNlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBjbGFzcyBpbmRpY2F0b3IgdmFsdWVzIGFuZCB0aGUgc3ViY2xhc3NlcyB0aGV5IG1hcCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0aGUgdHlwZSBtYXBzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLWluZGljYXRvciIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCB2YWx1ZSB1c2VkIHRvIGRlZmluZSB0aGUgY2xhc3MgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJldmVudC1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwZXJzaXN0ZW50IGV2ZW50cyBmb3IgdGhpcyBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImV2ZW50LWxpc3RlbmVycyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJldmVudC1saXN0ZW5lciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGFuIGV2ZW50IGxpc3RlbmVyIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgZGVzY3JpcHRvciBldmVudCBsaXN0ZW5lciBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtYnVpbGQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgYnVpbGRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS13cml0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgd3JpdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC13cml0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciB3cml0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtaW5zZXJ0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSBpbnNlcnRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtaW5zZXJ0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGluc2VydGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLXVwZGF0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgdXBkYXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtdXBkYXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIHVwZGF0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtZGVsZXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSBkZWxldGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1kZWxldGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgZGVsZXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFib3V0LXRvLWluc2VydC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgaW5zZXJ0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhYm91dC10by11cGRhdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIHVwZGF0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWNsb25lLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGNsb25pbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtbWVyZ2UtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgbWVyZ2luZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1yZWZyZXNoLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIHJlZnJlc2hpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZGVmaW5lZCBxdWVyaWVzIGFuZCBxdWVyeSBwcm9wZXJ0aWVzIGZvciB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyaWVzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5IiB0eXBlPSJxdWVyeSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSBkZWZpbml0aW9uIGZvciB0aGUgY2xhc3MnIGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGltZW91dCIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIHRpbWVvdXQgdG8gYXBwbHkgdG8gYWxsIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJjaGVjay1jYWNoZSIgbmFtZT0iZXhpc3RlbmNlIiB0eXBlPSJleGlzdGVuY2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgYmVoYXZvaXIgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdCB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zZXJ0LXF1ZXJ5IiB0eXBlPSJpbnNlcnQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gaW5zZXJ0IHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IGluc2VydCBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ1cGRhdGUtcXVlcnkiIHR5cGU9InVwZGF0ZS1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSB1cGRhdGUgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgdXBkYXRlIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1xdWVyeSIgdHlwZT0iZGVsZXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIGRlbGV0ZSBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCBkZWxldGUgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZG9lcy1leGlzdC1xdWVyeSIgdHlwZT0iZG9lcy1leGlzdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIGRvZXMgZXhpc3QgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgZGVsZXRlIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlYWQtb2JqZWN0LXF1ZXJ5IiB0eXBlPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIHJlYWQgb2JqZWN0IHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IHJlYWQgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVhZC1hbGwtcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gcmVhZCBhbGwgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgcmVhZCBhbGwgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgZXhpc3RlbmNlIHBvbGljaWVzIGZvciBkZXRlcm1pbmluZyBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stY2FjaGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1kYXRhYmFzZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1leGlzdGVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtbm9uLWV4aXN0ZW5jZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBxdWVyeWluZyBkYXRhYmFzZSBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkta2V5IGFsaWFzIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLXN5bmMtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0eXBlIG9mIGNhY2hlIHN5bmNocm9uaXphdGlvbiB0byB1c2Ugd2l0aCBhIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbnZhbGlkYXRpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuby1jaGFuZ2VzIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hhbmdlLXNldC13aXRoLW5ldy1vYmplY3RzIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hhbmdlLXNldCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InVuaXRvZndvcmstaXNvbGF0aW9uLWxldmVsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHVuaXQgb2Ygd29yayBpc29sYXRlZCBmcm9tIHRoZSBzZXNzaW9uIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXNlLXNlc3Npb24tY2FjaGUtYWZ0ZXItdHJhbnNhY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpc29sYXRlLW5ldy1kYXRhLWFmdGVyLXRyYW5zYWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXNvbGF0ZS1jYWNoZS1hZnRlci10cmFuc2FjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imlzb2xhdGUtY2FjaGUtYWx3YXlzIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1xdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIGRhdGFiYXNlIGNvbHVtbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icXVlcnkta2V5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gYmVpbmcgYWxpYXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwLXF1ZXJ5LWtleSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIGpvaW4gdG8gYW5vdGhlciBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InF1ZXJ5LWtleSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHRhcmdldCByZWZlcmVuY2VkIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgam9pbiBjb25kaXRpb24gYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgY2xhc3MnIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBqb2luIGNyaXRlcmlhIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGNsYXNzJyB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZS1xdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIDEtMSBqb2luIHRvIGFub3RoZXIgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtcXVlcnkta2V5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueS1xdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIDEtbSBqb2luIGZyb20gYW5vdGhlciBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtcXVlcnkta2V5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIGZyb20gYW4gYXR0aXJidXRlIHRvIGEgc2ltcGxlIGZpZWxkIGRhdGF0eXBlLCBpLmUuIFN0cmluZywgTnVtYmVyLCBEYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgYW5kIG9wdGlvbmFsbHkgdGhlIHRhYmxlIG9mIHRoZSBmaWVsZC9jb2x1bW4gdGhhdCB0aGUgYXR0cmlidXRlIGlzIHN0b3JlZCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im51bGwtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGEgdmFsdWUgdGhhdCBudWxsIGRhdGEgdmFsdWVzIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtY2xhc3NpZmljYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGF0dHJpYnV0ZSBpcyBwZXJzaXN0ZWQuIFRoZSBhdHRyaWJ1dGUgbWFwcGluZyBkZWZpbml0aW9uIGlzIGV4dGVuZGFibGUgdG8gYWxsb3cgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiAgVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgYXR0cmlidXRlIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlYWQtb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBnZXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHNldCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9wZXJ0aWVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdXNlciBkZWZpbmVkIHByb3BlcnRpZXMgdG8gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icHJvcGVydHkiIHR5cGU9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHVzZXIgZGVmaW5lZCBwcm9wZXJ0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgc2ltcGxlIGF0dHJpYnV0ZSBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIGZyb20gYW4gYXR0aXJidXRlIHRvIGEgc2ltcGxlIGZpZWxkIGRhdGF0eXBlLCBpLmUuIFN0cmluZywgTnVtYmVyLCBEYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLWNkYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXBvbGljeSIgdHlwZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBmcm9tIGFuIGF0dGlyYnV0ZSB0byBhIHNpbXBsZSBmaWVsZCBkYXRhdHlwZSwgaS5lLiBTdHJpbmcsIE51bWJlciwgRGF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBmaWVsZCB0cmFuc2Zvcm1hdGlvbiBmb3IgYSB0cmFuc2Zvcm1hdGlvbiBtYXBwaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtYmFzZWQtZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtZXItYmFzZWQtZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHRyYW5zZm9ybWF0aW9uIG1hcHBpbmcgdGhhdCB1c2VzIEphdmEgY29kZSB0byB0cmFuc2Zvcm0gYmV0d2VlbiB0aGUgZGF0YSBhbmQgb2JqZWN0IHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRyYW5zZm9ybWF0aW9uIGRlZmluZWQgaW4gdGhlIGRvbWFpbiBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS10cmFuc2Zvcm1lciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRyYW5zZm9ybWVyLiBVc2VkIGluIHBsYWNlIG9mIGF0dHJpYnV0ZS10cmFuc2Zvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQtdHJhbnNmb3JtYXRpb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCB0cmFuc2Zvcm1hdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiIgdHlwZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWdncmVnYXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHJlbGF0aW9uc2hpcCB3aGVyZSB0aGUgdGFyZ2V0IG9iamVjdCBpcyBzdHJpY3RseSBwcml2YXRlbHkgb3duZWQgYnkgdGhlIHNvdXJjZSBvYmplY3QgYW5kIHN0b3JlcyB3aXRoaW4gdGhlIHNvdXJjZSBvYmplY3RzIHJvdzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHRhcmdldCBjbGFzcyBvZiB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iYWxsb3ctbnVsbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiBhIHJvdyBvZiBhbGwgbnVsbHMgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIG51bGwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZC10cmFuc2xhdGlvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHRoZSBtYXBwaW5nIHRvIHVzZSBkaWZmZXJlbnQgZmllbGQgbmFtZXMgdGhhbiB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRyYW5zbGF0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIGluIHRoZSBzb3VyY2UgZGVzY3JpcHRvcidzIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIGluIHRoZSBhZ2dyZWdhdGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gY2xhc3NlcyBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdGFyZ2V0IGNsYXNzIG9mIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgdGFyZ2V0IG9iamVjdHMgYXJlIHByaXZhdGVseSBvd25lZCBkZXBlbmRlbnQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGNyZWF0ZSBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBjcmVhdGUgb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSByZWZyZXNoIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSByZW1vdmUgb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtb25lLXRvLW9uZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9uZS10by1vbmUtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgdGFyZ2V0IGNsYXNzJyB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0cyBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLW9uZS10by1tYW55LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzb3VyY2UtZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRhcmdldC1mb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXktZ3JvdXBpbmctZWxlbWVudCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0cyBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbGxlY3Rpb24gb2Ygc2ltcGxlIHR5cGVzIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gYSBzZXQgb2Ygc2ltcGxlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9ImRhdGEtcmVhZC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLXRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIHNvdXJjZSBwcmltYXJ5IGtleSBhbmQgdGhlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpcmVjdC1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBpbiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnNlcnQtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gaW5zZXJ0IGEgcm93IGludG8gdGhlIHJlZmVyZW5jZSB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhIHJvdyBmcm9tIHRoZSByZWZlcmVuY2UgdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcm93cyBmcm9tIHRoZSByZWZlcmVuY2UgdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlc3Npb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBzZXNzaW9uIHRoYXQgZGVmaW5lcyB0aGUgcmVmZXJlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS1wb2xpY3kiIHR5cGU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2YgdGhpcyBhdHRyaWJ1dGUgYXJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBoaXN0b3J5IHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1tYXAtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXAgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byBhIHNldCBvZiBrZXkgdmFsdWVzIHBhaXJzIG9mIHNpbXBsZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpcmVjdC1rZXktZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gaW4gdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IHNvcmVzIHRoZSBtYXAga2V5IGRhdGEgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJrZXktY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUga2V5IGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhZ2dyZWdhdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzIHdoZXJlIHRoZSB0YXJnZXQgaW5zdGFuY2VzIGFyZSBzdHJpY3RseSBwcml2YXRlbHkgb3duZWQgYnkgdGhlIHNvdXJjZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHRhcmdldCBjbGFzcycgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByZWxhdGVkIG9iamVjdHMgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tbWFueS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG0tbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGF0aW9uLXRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbiB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgc291cmNlL3RhcmdldCBwcmltYXJ5IGtleXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLXJlbGF0aW9uLWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZnJvbSB0aGUgcmVsYXRpb25hbCB0YWJsZSB0byB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtcmVsYXRpb24tZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmcm9tIHRoZSByZWxhdGlvbmFsIHRhYmxlIHRvIHRoZSB0YXJnZXQgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnNlcnQtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gaW5zZXJ0IGEgcm93IGludG8gdGhlIHJlbGF0aW9uIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGEgcm93IGZyb20gdGhlIHJlbGF0aW9uIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJvd3MgZnJvbSB0aGUgcmVsYXRpb24gdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktcG9saWN5IiB0eXBlPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIHRoaXMgYXR0cmlidXRlIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gaGlzdG9yeSBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZSB0aGF0IG1heSBiZSBvZiBzZXZlcmFsIHR5cGVzIHJlbGF0ZWQgdGhyb3VnaCBhbiBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBjb2x1bW4gdG8gc3RvcmUgdGhlIGNsYXNzIHR5cGUgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0IGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmVpZ24ta2V5LXRvLXF1ZXJ5LWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBzb3VyY2UvdGFyZ2V0IGNvbHVtbi9xdWVyeSBrZXkgcmVmZXJlbmNlcyByZWxhdGluZyBhIGZvcmVpZ24ga2V5IGluIG9uZSB0YWJsZSB0byB0aGUgcXVlcnkga2V5cyBkZWZpbmluZyBhIHByaW1hcnkgb3IgdW5pcXVlIGtleSB2YWx1ZSBpbiB0aGUgb3RoZXIgaW50ZXJmYWNlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkta2V5LXJlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcmVmZXJlbmNlIG9mIGEgc291cmNlIHRhYmxlIGZvcmVpZ24ga2V5IGFuZCBhIHRhcmdldCBpbnRlcmZhY2UgZGVzY3JpcHRvciBxdWVyeSBrZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmaWVsZC9jb2x1bW4gbmFtZSBpbiB0aGUgc291cmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1xdWVyeS1rZXkiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IGtleSBuYW1lIG9mIHRoZSB0YXJnZXQgaW50ZXJmYWNlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIiB0eXBlPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBjbGFzcyBpbmRpY2F0b3IgdmFsdWVzIGFuZCB0aGUgc3ViY2xhc3NlcyB0aGV5IG1hcCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb250YWluZXIvY29sbGVjdGlvbiB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29sbGVjdGlvbi10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzb3J0ZWQtY29sbGVjdGlvbi1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHNvcnRlZCBjb2xsZWN0aW9uIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbXBhcmF0b3ItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29tcGFyaXRvciwgdXNlZCB0byBjb21wYXJlIG9iamVjdHMgaW4gc29ydGluZyB0aGUgY29sbGVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibGlzdC1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGxpc3QgY29sbGVjdGlvbiB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAtY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXAgY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1hcC1rZXktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIHRhcmdldCBvYmplY3RzIHRvIGdldCB0aGUga2V5IHZhbHVlIGZvciB0aGUgbWFwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtbWFwLWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IG1hcCBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Nyb2xsYWJsZS1jdXJzb3ItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHNjcm9sbGFibGUgY3Vyc29yIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjdXJzb3JlZC1zdHJlYW0tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGN1cnNvcmVkIHN0cmVhbSBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5kaXJlY3Rpb24tcG9saWN5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkZWZlcnJlZCByZWFkIGluZGlyZWN0aW9uIG1lY2hhbmlzbS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbHVlLWhvbGRlci1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIHZhbHVlIGhvbGRlcnMgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3h5LWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgcHJveGllcyB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwYXJlbnQtY29sbGVjdGlvbi1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIHRyYW5zcGFyZW50IGNvbGxlY3Rpb25zIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb2xsZWN0aW9uLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiBpbnRlcmZhY2UgdG8gdXNlLCBpLmUuIExpc3QsIFNldCwgTWFwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWFwLWtleS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgdGFyZ2V0IG9iamVjdHMgdG8gZ2V0IHRoZSBrZXkgdmFsdWUgZm9yIHRoZSBtYXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnRhaW5lci1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIGEgdXNlciBkZWZpbmVkIGNvbnRhaW5lciB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbnRhaW5lciBpbXBsZW1lbnRlciB0byB1c2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1saXN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkxpc3QgY29udmVydGVyPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib2JqZWN0LWNsYXNzLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbGlzdCdzIGVsZW1lbnQgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4gCi0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGVzYWZlLWVudW1lcmF0aW9uLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlR5cGVzYWZlIEVudW1lcmF0aW9uIGNvbnZlcnNpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLWNvbnZlcnNpb24tY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBkYXRhIHR5cGUgYW5kIGFuIG9iamVjdCB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgdG8gY29udmVydCBiZXR3ZWVuLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im9iamVjdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRhdGEtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlcyBzdG9yYWdlIGRhdGEgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VyaWFsaXplZC1vYmplY3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyBvYmplY3Qgc2VyaWFsaXphdGlvbiB0byBjb252ZXJ0IGJldHdlZW4gdGhlIG9iamVjdCBhbmQgZGF0YSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGVzIHN0b3JhZ2UgZGF0YSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSBtYXBwaW5nIG9mIHZhbHVlcyBmcm9tIGRhdGFiYXNlIHZhbHVlcyB1c2VkIGluIHRoZSBmaWVsZCBhbmQgb2JqZWN0IHZhbHVlcyB1c2VkIGluIHRoZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QW4gb3B0aW9uYWwgZGVmYXVsdCB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkLiAgVGhpcyB2YWx1ZSBpcyB1c2VkIGlmIGEgZGF0YWJhc2UgdHlwZSBpcyBub3QgZm91bmQgaW4gdGhlIHR5cGUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLW1hcHBpbmdzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWFwcGluZyBvZiB2YWx1ZXMuICBCb3RoIHRoZSBvYmplY3QgYW5kIGRhdGFiYXNlIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ0eXBlLW1hcHBpbmciIHR5cGU9InR5cGUtbWFwcGluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBvYmplY3QgYW5kIGRhdGEgdmFsdWUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW9ubHktdHlwZS1tYXBwaW5ncyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSBtYXBwaW5nIG9mIGFkZGl0aW9uYWwgdmFsdWVzIHRoYXQgbWFwIG5vbi11bmlxdWUgZGF0YSB2YWx1ZXMgdG8gYSB1bmlxdWUgYXR0cmlidXRlIHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InR5cGUtbWFwcGluZyIgdHlwZT0idHlwZS1tYXBwaW5nIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIG9iamVjdCBhbmQgZGF0YSB2YWx1ZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSBhbiBvYmplY3QgYW5kIGRhdGEgdmFsdWUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIHZhbHVlIHRvIHVzZSBpbiB0aGUgb2JqZWN0J3MgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIHZhbHVlIHRvIHVzZSBpbiB0aGUgZGF0YWJhc2UgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeS9pbnRlcmFjdGlvbiBhZ2FpbnN0IGEgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJtYWludGFpbi1jYWNoZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgYnlwYXNzIHRoZSBjYWNoZSBjb21wbGV0ZWx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgdXNlIHBhcmFtYXRlciBiaW5kaW5nIGZvciBhcmd1bWVudHMsIG9yIHByaW50IHRoZSBhcmd1bWVudHMgaW4tbGluZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhY2hlLXN0YXRlbWVudCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyaWVzIHN0YXRlbWVudCBzaG91bGQgYmUgY2FjaGVkLCB0aGlzIG11c3QgYmUgdXNlZCB3aXRoIHBhcmFtZXRlciBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGltZW91dCIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgdGltZW91dCB0byBjYW5jZWwgdGhlIHF1ZXJ5IGluIGlmIHRoZSByZXF1ZXN0IHRha2VzIHRvbyBsb25nIHRvIGNvbXBsZXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0icHJlcGFyZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgcHJlcGFyZSBhbmQgY2FjaGUgaXRzIGdlbmVyYXRlZCBTUUwsIG9yIHJlZ2VuZXJhdGUgdGhlIFNRTCBvbiBlYWNoIGV4ZWN1dGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhbGwiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBzdGF0aWMgY2FsbHMgdGhlIFNRTCBvciBTdG9yZWQgUHJvY2VkdXJlIGNhbGwgZGVmaW5pdGlvbiBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBqb2luIGZldGNoIG9wdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5uZXItam9pbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im91dGVyLWpvaW4iIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYXNjYWRlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBjYXNjYWRlIHBvbGljaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InByaXZhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtcmVhZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZyBhIHNpbmdsZSB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGlyZWN0LXJlYWQtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1yZWFkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nIGEgY29sbGVjdGlvbiBvZiB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGEtcmVhZC1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YS1yZWFkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nIHJhdyBkYXRhLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWFkLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FjaGUtcXVlcnktcmVzdWx0cyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgY2FjaGUgdGhlIHF1ZXJ5IHJlc3VsdHMgdG8gYXZvaWQgZnV0dXJlIGV4ZWN1dGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYXgtcm93cyIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIGZldGNoLCByZXN1bHRzIHdpbGwgYmUgdHJ1bmN0YXRlIG9uIHRoZSBkYXRhYmFzZSB0byB0aGlzIHNpemUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaXJzdC1yZXN1bHQiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB3aGVyZSB0byBzdGFydCB0aGUgY3Vyc29yIGluIGEgcmVzdWx0IHNldCByZXR1cm5lZCBmcm9tIHRoZSBkYXRhYmFzZS4gUmVzdWx0cyBwcmlvciB0byB0aGlzIG51bWJlciB3aWxsIG5vdCBiZSBidWlsdCBpbnRvIG9iamVjdHM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllc3MgdGhlIG51bWJlciBvZiByb3dzIHRvIGZldGNoIGZyb20gdGhlIGRhdGFiYXNlIG9uIGVhY2ggcmVzdWx0IHNldCBuZXh0IG9wZXJhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJ5LXJlc3VsdC1jYWNoZS1wb2xpY3kiIHR5cGU9InF1ZXJ5LXJlc3VsdC1jYWNoZS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHF1ZXJ5IHJlc3VsdHMgc2hvdWxkIGJlIGNhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktcmVzdWx0LWNhY2hlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgcXVlcnkncyByZXN1bHRzIHNob3VsZCBiZSBjYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnZhbGlkYXRpb24tcG9saWN5IiB0eXBlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMTAwIiBuYW1lPSJtYXhpbXVtLWNhY2hlZC1yZXN1bHRzIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBkZWZpbmVzIHRoZSBudW1iZXIgb2YgcXVlcnkgcmVzdWx0IHNldHMgdGhhdCB3aWxsIGJlIGNhY2hlZC4gVGhlIExSVSBxdWVyeSByZXN1bHRzIHdpbGwgYmUgZGlzY2FyZGVkIHdoZW4gdGhlIG1heCBzaXplIGlzIHJlYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBtYW5pcHVsYXRpbmcgZGF0YS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1tb2RpZnktcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBtb2RpZnlpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXBkYXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgdXBkYXRpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnNlcnQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBpbnNlcnRpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWxldGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBkZWxldGluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1tb2RpZnktcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRvZXMtZXhpc3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGRldGVybWluaW5nIGlmIGFuIG9iamVjdCBleGlzdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJleGlzdGVuY2UtY2hlY2siIHR5cGU9ImV4aXN0ZW5jZS1jaGVjayI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZXhpc3RlbmNlIGNoZWNrIG9wdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJleGlzdGVuY2UtY2hlY2siPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgZXhpc3RlbmNlIGNoZWNrIG9wdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1jYWNoZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWRhdGFiYXNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLWV4aXN0ZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1ub24tZXhpc3RlbmNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGRlbGV0aW5nIGEgY3JpdGVyaWEgb2Ygb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1sZXZlbC1yZWFkLXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3Igb2JqZWN0cyAoYXMgYXBwb3NlZCB0byBkYXRhKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVhZC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxsIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyBvZiBvYmplY3RzIGJlaW5nIHF1ZXJpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIHJlZnJlc2ggYW55IGNhY2hlZCBvYmplY3RzIGZyb20gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlbW90ZS1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgcmVmcmVzaCBhbnkgcmVtb3RlbHkgY2FjaGVkIG9iamVjdHMgZnJvbSB0aGUgc2VydmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iY2FzY2FkZS1wb2xpY3kiIHR5cGU9ImNhc2NhZGUtcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcmllcyBzZXR0aW5ncyAoc3VjaCBhcyByZWZyZXNoLCBtYWludGFpbi1jYWNoZSkgc2hvdWxkIGFwcGx5IHRvIHRoZSBvYmplY3QncyByZWxhdGlvbnNoaXAgcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InByaW1hcnkta2V5IiBuYW1lPSJjYWNoZS11c2FnZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgcXVlcnkgc2hvdWxkIGludGVyYWN0IHdpdGggdGhlIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0ibG9jay1tb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCBsb2NrIHRoZSByZXN1bHRpbmcgcm93cyBvbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJkaXN0aW5jdC1zdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgZmlsdGVyIGRpc3RpbmN0IHJlc3VsdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbi1tZW1vcnktcXVlcnlpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluIG1lbW9yeSBxdWVyeWluZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBkZWZhdWx0PSJpZ25vcmUtZXhjZXB0aW9ucy1yZXR1cm4tY29uZm9ybWVkIiBuYW1lPSJwb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgaW5kaXJlY3Rpb24gb3IgdW5jb25mb3JtYWJsZSBleHByZXNzaW9ucyBzaG91bGQgYmUgdHJlYXRpbmcgd2l0aCBpbi1tZW1vcnkgcXVlcnlpbmcgYW5kIGNvbmZvcm1pbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InVzZS1kZWZhdWx0LWZldGNoLWdyb3VwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBkZWZhdWx0IGZldGNoIGdyb3VwIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1ncm91cCIgdHlwZT0iZmV0Y2gtZ3JvdXAiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIHF1ZXJ5IHRvIHBhcnRpYWxseSBmZXRjaCB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtZ3JvdXAtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGEgcHJlLWRlZmluZWQgbmFtZWQgZmV0Y2ggZ3JvdXAgdG8gYWxsb3cgdGhlIHF1ZXJ5IHRvIHBhcnRpYWxseSBmZXRjaCB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS1leGNsdXNpdmUtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgZXhjbHVzaXZlIGNvbm5lY3Rpb24gKFZQRCkgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImpvaW5lZC1hdHRyaWJ1dGUtZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBhdHRyaWJ1dGVzIGJlaW5nIGpvaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBqb2luaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgb2JqZWN0cyByZXN1bHRpbmcgZnJvbSB0aGUgcXVlcnkgYXJlIHJlYWQtb25seSwgYW5kIHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQgaW4gdGhlIHVuaXQgb2Ygd29yay48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJvdXRlci1qb2luLXN1YmNsYXNzZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBpbmhlcml0YW5jZSBxdWVyaWVzIHNwZWNpZnkgaWYgYWxsIHN1YmNsYXNzZXMgc2hvdWxkIGJlIG91dGVyIGpvaW5lZCwgaW5zdGVhZCBvZiBhIHF1ZXJ5IHBlciBzdWJjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1hbGwtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGEgc2V0IG9mIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1sZXZlbC1yZWFkLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJhdGNoLXJlYWQtYXR0cmlidXRlLWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhbGwgYXR0cmlidXRlcyBmb3IgYmF0Y2ggcmVhZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBiYXRjaCByZWFkaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im9yZGVyLWJ5LWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNldHMgdGhlIG9yZGVyIGV4cHJlc3Npb25zIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3Igb3JkZXJpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgYSBzaW5nbGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbGV2ZWwtcmVhZC1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVwb3J0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+UXVlcnkgZm9yIGluZm9ybWF0aW9uIGFib3V0IGEgc2V0IG9mIG9iamVjdHMgaW5zdGVhZCBvZiB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuLWNob2ljZSIgdHlwZT0icmV0dXJuLWNob2ljZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TaW1wbGlmaWVzIHRoZSByZXN1bHQgYnkgb25seSByZXR1cm5pbmcgdGhlIGZpcnN0IHJlc3VsdCwgZmlyc3QgdmFsdWUsIG9yIGFsbCBhdHRyaWJ1dGUgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0cmlldmUtcHJpbWFyeS1rZXlzIiB0eXBlPSJyZXRyaWV2ZS1wcmltYXJ5LWtleXMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdldGhlciB0aGUgcHJpbWFyeSBrZXkgdmFsdWVzIHNob3VsZCBhbHNvIGJlIHJldHJpZXZlZCBmb3IgdGhlIHJlZmVyZW5jZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlcG9ydC1pdGVtcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JdGVtcyB0byBiZSBzZWxlY3RlZCwgdGhlc2UgY291bGQgYmUgYXR0cmlidXRlcyBvciBhZ2dyZWdhdGUgZnVuY3Rpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaXRlbSIgdHlwZT0icmVwb3J0LWl0ZW0iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBpdGVtIHJlcXVlc3RlZDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJncm91cC1ieS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXRzIEdST1VQIEJZIGV4cHJlc3Npb25zIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3IgZ3JvdXBpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJldHVybi1jaG9pY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TaW1wbGlmaWVzIHRoZSByZXN1bHQgYnkgb25seSByZXR1cm5pbmcgdGhlIGZpcnN0IHJlc3VsdCwgZmlyc3QgdmFsdWUsIG9yIGFsbCBhdHRyaWJ1dGUgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmV0dXJuLXNpbmdsZS1yZXN1bHQiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXR1cm4tc2luZ2xlLXZhbHVlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmV0dXJuLXNpbmdsZS1hdHRyaWJ1dGUiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJyZXRyaWV2ZS1wcmltYXJ5LWtleXMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2V0aGVyIHRoZSBwcmltYXJ5IGtleSB2YWx1ZXMgc2hvdWxkIGFsc28gYmUgcmV0cmlldmVkIGZvciB0aGUgcmVmZXJlbmNlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZnVsbC1wcmltYXJ5LWtleSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpcnN0LXByaW1hcnkta2V5IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8tcHJpbWFyeS1rZXkiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVwb3J0LWl0ZW0iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGl0ZW0gcmVxdWVzdGVkIGluIFJlcG9ydFF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk5hbWUgZ2l2ZW4gZm9yIGl0ZW0sIGNhbiBiZSB1c2VkIHRvIHJldGlldmUgdmFsdWUgZnJvbSByZXN1bHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4cHJlc3Npb24gKHBhcnRpYWwpIHRoYXQgZGVzY3JpYmVzIHRoZSBhdHRyaWJ1dGUgd2FudGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJleHByZXNzaW9uIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmaWx0ZXIgZXhwcmVzc2lvbiB0cmVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb24tZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSByZWxhdGlvbiBleHByZXNzaW9uIHRoYXQgY29tcGFyZXMgdG8gZXhwcmVzc2lvbnMgdGhyb3VnaCBvcGVyYXRvcnMgc3VjaCBhcyBlcXVhbCwgbGVzc1RoYW4sIGV0Yy4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsZWZ0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyaWdodCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJvcGVyYXRvciIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naWMtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBleHByZXNzaW9uIGNvbXBvc2VkIG9mIHR3byBzdWItZXhwcmVzc2lvbnMgam9pbmVkIHRocm91Z2ggYW4gb3BlcmF0b3Igc3VjaCBhcyBBTkQsIE9SLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGVmdCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmlnaHQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdHlwZT0ib3BlcmF0b3IiIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZ1bmN0aW9uLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZXhwcmVzc2lvbiBjb21wb3NlZCBvZiBhIGZ1bmN0aW9uIGFwcGxpZWQgdG8gYSBsaXN0IG9mIHN1Yi1leHByZXNzaW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGZ1bmN0aW9uIGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgZXhwcmVzc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmdW5jdGlvbiIgdHlwZT0ib3BlcmF0b3IiIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnN0YW50LWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gdmFsdWUuICBJZiB0aGUgdmFsdWUgaXMgbnVsbCB0aGUgdmFsdWUgdGFnIGNhbiBpcyBhYnNlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWtleS1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIHF1ZXJ5LWtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2UiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbnktb2YiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvdXRlci1qb2luIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzZSIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcmFtZXRlci1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIHBhcmFtZXRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlciIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNlLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gYnVpbGRlci9iYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9wZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIG9wZXJhdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBTUUwgcXVlcnkgbGFuZ3VhZ2Ugc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbCBTUUwgcXVlcnkgc3RyaW5nLiAgQXJndW1lbnRzIGNhbiBiZSBzcGVjaWZpZWQgdGhyb3VnaCAjYXJnLW5hbWUgdG9rZW5zIGluIHRoZSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYnFsLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIEVKQi1RTCBxdWVyeSBsYW5ndWFnZSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpicWwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEVKQi1RTCBxdWVyeSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1wcm9jZWR1cmUtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGludm9jYXRpb24gZGVmaW5pdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImN1cnNvci1vdXRwdXQtcHJvY2VkdXJlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIGNhbGwgdG8gdXNlIGEgY3Vyc29yIG91dHB1dCBwYXJhbWV0ZXIgdG8gZGVmaW5lIHRoZSByZXN1bHQgc2V0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFuZCBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9InByb2NlZHVyZS1hcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9jZWR1cmUuIFRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnRzIG11c3QgbWF0Y2ggdGhlIHByb2NlZHVyZSBhcmd1bWVudHMgaWYgbm90IG5hbWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1mdW5jdGlvbi1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBmdW5jdGlvbiBpbnZvY2F0aW9uIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InN0b3JlZC1wcm9jZWR1cmUtY2FsbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMSIgbmFtZT0ic3RvcmVkLWZ1bmN0aW9uLXJlc3VsdCIgdHlwZT0icHJvY2VkdXJlLW91dHB1dC1hcmd1bWVudCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBzdG9yZWQtZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHN0b3JlZCBwcm9jZWR1cmUgbmFtZSBvZiB0aGUgYXJndW1lbnQuIEZvciBpbmRleGVkIGFyZ3VtZW50IHRoZSBuYW1lIGlzIG5vdCByZXF1aXJlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBuYW1lIG9mIHRoZSBhcmd1bWVudC4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYXMgZGVmaW5lIGluIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGNsYXNzIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtc3FsdHlwZSIgdHlwZT0ieHNkOmludCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpEQkMgaW50IHR5cGUgb2YgdGhlIGFyZ3VtZW50LCBhcyBkZWZpbmVkIGluIGphdmEuamRiYy5UeXBlczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LXNxbHR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHR5cGUgaWYgcHJvY2VkdXJlLWFyZ3VtZW50LXNxbHR5cGUgaXMgU1RSVUNUIG9yIEFSUkFZPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcm9jZWR1cmUgYXJndW1lbnQgdmFsdWUgbWF5YmUgYmUgc3BlY2lmaWVkIGlmIG5vdCB1c2luZyBhIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9jZWR1cmUtb3V0cHV0LWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgY2FsbCBvdXRwdXQgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InByb2NlZHVyZS1hcmd1bWVudCIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvY2VkdXJlLWlub3V0cHV0LWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgY2FsbCBvdXRwdXQgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InByb2NlZHVyZS1hcmd1bWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im91dHB1dC1hcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBuYW1lIG9mIHRoZSBhcmd1bWVudC4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYXMgZGVmaW5lIGluIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtc3RvcmVkLXByb2NlZHVyZS1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgaW52b2NhdGlvbiBkZWZpbml0aW9uIHdob3NlIGFyZ3VtZW50cyBjb250YWluIGF0IGxlYXN0IG9uZSBPcmFjbGUgUEwvU1FMIHR5cGUgdGhhdCBoYXMgbm8gSkRCQyByZXByZXNlbnRhdGlvbiAoZS5nLiBCT09MRUFOLCBQTFNfSU5URUdFUiwgUEwvU1FMIHJlY29yZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvY2VkdXJlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYW5kIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCB0byB0aGUgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kZXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpkYmMtdHlwZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC10eXBlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtcmVjb3JkIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb21wYXRpYmxlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iamF2YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBmaWVsZHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCB0byB0aGUgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLWNvbGxlY3Rpb24iPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbXBhdGlibGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJqYXZhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmVzdGVkLXR5cGUiIHR5cGU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGFuIEVJUyByZWNvcmQgZGF0YSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGF0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSByZWNvcmQgc3RydWN0dXJlIG5hbWUgdGhlIGRlc2NyaXB0b3IgbWFwcyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWVzcGFjZS1yZXNvbHZlciIgdHlwZT0ibmFtZXNwYWNlLXJlc29sdmVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lc3BhY2UgcmVzb2x2ZXIgZm9yIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXBwZWQtaW50ZXJhY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIEVJUyBpbnRlcmFjdGlvbiB1dGlsaXppbmcgTWFwcGVkUmVjb3JkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIGlucHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBvdXRwdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtaW50ZXJhY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIEVJUyBpbnRlcmFjdGlvbiB1dGlsaXppbmcgWE1MIHJlY29yZHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yZWNvcmQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSB0byB1c2UgZm9yIHRoZSBpbnB1dCByZWNvcmQsIGlmIHJlcXVpcmVkIGJ5IHRoZSBhZGFwdGVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcm9vdC1lbGVtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIG91dHB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBpbnB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgb3V0cHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5kZXhlZC1pbnRlcmFjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUlTIGludGVyYWN0aW9uIHV0aWxpemluZyBJbmRleGVkIHJlY29yZHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmFjdGlvbi1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gaW50ZXJhY3Rpb24gYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcm9jZWR1cmUgYXJndW1lbnQgdmFsdWUgbWF5YmUgYmUgc3BlY2lmaWVkIGlmIG5vdCB1c2luZyBhIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGludGVyYWN0aW9uIG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBGb3IgaW5kZXhlZCBhcmd1bWVudHMgdGhlIG5hbWUgaXMgbm90IHJlcXVpcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBuYW1lIG9mIHRoZSBhcmd1bWVuLiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBhcyBkZWZpbmUgaW4gdGhlIHF1ZXJ5LCBvciB0aGUgZGVzY3JpcHRvciBmaWVsZCBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXJlbGF0aW9uYWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYSBTdHJ1Y3R1cmUgdHlwZSBpbiBhbiBvYmplY3QtcmVsYXRpb25hbCBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25hbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgb2JqZWN0IHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQtb3JkZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG9yZGVyZWQgbGlzdCBvZiB0aGUgZmllbGQgZGVmaW5lZCBpbiB0aGUgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmVzdGVkLXRhYmxlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tL20tbSByZWxhdGlvbnNoaXAgdGhhdCBtYWtlcyB1c2Ugb2YgdGhlIG9iamVjdC1yZWxhdGlvbmFsIG5lc3RlZC10YWJsZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGluIHRoZSBzb3VyY2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIG5lc3RlZC10YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3R1cmUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgdHlwZSBuYW1lIG9mIHRoZSBuZXN0ZWQtdGFibGUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXJyYXktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIHByaW1pdGl2ZS9zaW1wbGUgdHlwZSB2YWx1ZXMgdXNpbmcgdGhlIG9iamVjdC1yZWxhdGlvbmFsIGFycmF5IHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzdHJ1Y3R1cmUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgdHlwZSBuYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LWFycmF5LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBvYmplY3QtdHlwZXMgdXNpbmcgdGhlIG9iamVjdC1yZWxhdGlvbmFsIGFycmF5IHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3R1cmUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgdHlwZSBuYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0dXJlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RydWN0dXJlIG9mIG9iamVjdC10eXBlcyB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVmZXJlbmNlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgb2JqZWN0LXR5cGUgdXNpbmcgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHJlZmVyZW5jZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgaW4gdGhlIHNvdXJjZSB0eXBlIHRoYXQgc3RvcmVzIHRoZSByZWZlcmVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1yZWxhdGlvbmFsLWZpZWxkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBPYmplY3RSZWxhdGlvbmFsRGF0YWJhc2VGaWVsZDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmVzdGVkLXR5cGUtZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LXhtbC10eXBlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IG1hcHBpbmcgdG8gYW4gT3JhY2xlIFhEQiBYTUwgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGlyZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlYWQtd2hvbGUtZG9jdW1lbnQiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUtY29udmVydGVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBhIHVzZXIgZGVmaW5lZCBjb252ZXJ0ZXIgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbGxlY3Rpb24tcmVmZXJlbmNlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1NIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgWE1MIGVsZW1lbnQgdG8gdGhlIHRhcmdldCBYTUwgZWxlbWVudCBiYXNlZCBvbiBhIGtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieG1sLW9iamVjdC1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVycG9saWN5IiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlcy1zaW5nbGUtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1vYmplY3QtcmVmZXJlbmNlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgWE1MIGVsZW1lbnQgdG8gdGhlIHRhcmdldCBYTUwgZWxlbWVudCBiYXNlZCBvbiBvbmUgb3IgbW9yZSBrZXlzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhZ2dyZWdhdGUtb2JqZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS10by10YXJnZXQta2V5LWZpZWxkLWFzc29jaWF0aW9uIiB0eXBlPSJmb3JlaWduLWtleSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzb3VyY2UtdG8tdGFyZ2V0LWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1jZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1wb2xpY3kiIHR5cGU9ImFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBuZXN0ZWQgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItYXR0cmlidXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWdldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItc2V0LW1ldGhvZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBuZXN0ZWQgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgb2JqZWN0IG1hcHBpbmcgZm9yIGFuIFhNTCBuZXN0ZWQgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotCSAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIvPgotCSAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1nZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItc2V0LW1ldGhvZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcG9saWN5IiB0eXBlPSJhYnN0cmFjdC1udWxsLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJrZWVwLWFzLWVsZW1lbnQtcG9saWN5IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgb2JqZWN0IG1hcHBpbmcgZm9yIGFuIFhNTCBuZXN0ZWQgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYW4gWE1MIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImRlZmF1bHQtcm9vdC1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRoZSBkZXNjcmlwdG9yIG1hcHMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LXJvb3QtZWxlbWVudC1maWVsZCIgdHlwZT0ibm9kZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgWE1MRmllbGQgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHJvb3QgZWxlbWVudCBvZiB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNob3VsZC1wcmVzZXJ2ZS1kb2N1bWVudCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIGlmIG5vZGVzIHNob3VsZCBiZSBjYWNoZWQgdG8gcHJlc2VydmUgdW5tYXBwZWQgZGF0YTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZXNwYWNlLXJlc29sdmVyIiB0eXBlPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWVzcGFjZSByZXNvbHZlciBmb3IgdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzY2hlbWEiIHR5cGU9InNjaGVtYS1yZWZlcmVuY2UiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxvY2F0aW9uIG9mIHRoZSBYTUwgU2NoZW1hLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlc3VsdC1hbHdheXMteG1sLXJvb3QiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFueS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYW4geHM6YW55IGRlY2xhcmF0aW9uIG9yIHhzOmFueVR5cGUgZWxlbWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLXhtbC1yb290IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJrZWVwLWFzLWVsZW1lbnQtcG9saWN5IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LWF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGFuIHhzOmFueSBkZWNsYXJhdGlvbiBvciB4czphbnlUeXBlIGVsZW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5jbHVkZS1uYW1lc3BhY2UtZGVjbGFyYXRpb24iIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluY2x1ZGUtc2NoZW1hLWluc3RhbmNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFueS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgc2luZ2xlIG9iamVjdCB0byBhbiB4czphbnkgZGVjbGFyYXRpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLXhtbC1yb290IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJrZWVwLWFzLWVsZW1lbnQtcG9saWN5IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWZyYWdtZW50LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIHNpbmdsZSBOb2RlIHRvIGEgZnJhZ21lbnQgb2YgYW4gWE1MIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1mcmFnbWVudC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gb2YgTm9kZXMgdG8gYSBmcmFnbWVudCBvZiBhbiBYTUwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWJpbmFyeS1kYXRhLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGJpbmFyeSBvYmplY3QgdG8gYmFzZTY0IGJpbmFyeTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtZGlyZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLXN3YS1yZWYiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1pbWUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaG91bGQtaW5saW5lLWRhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluYXJ5LWRhdGEtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBiaW5hcnkgb2JqZWN0IHRvIGJhc2U2NCBiaW5hcnk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieG1sLWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1zd2EtcmVmIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtaW1lLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2hvdWxkLWlubGluZS1kYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jaG9pY2UtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGEgY2hvaWNlIHN0cnVjdHVyZSBpbiBhbiB4bWwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItcG9saWN5IiB0eXBlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIHR5cGU9InhtbC1jaG9pY2UtZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jaG9pY2Utb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYSBjaG9pY2Ugc3RydWN0dXJlIGluIGFuIHhtbCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgdHlwZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jaG9pY2UtZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLWZpZWxkIiB0eXBlPSJub2RlIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb252ZXJzaW9uLXBhaXIiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9kZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gWFBhdGggZXhwcmVzc2lvbiB0byBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSBpbiBhbiBYTUwgZG9jdW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3NpdGlvbiIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlIGluIHRoZSBwYXJlbnQgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGVkLXRleHQtZmllbGQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoaXMgaXMgYSB0eXBlZCB0ZXh0IGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2luZ2xlLW5vZGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyBpZiBlYWNoIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24gaXMgaW4gdGhlIHNhbWUgbm9kZSBpbnN0ZWFkIG9mIGhhdmluZyBvbmUgbm9kZSBwZXIgaXRlbSBpbiB0aGUgY29sbGVjdGlvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InNjaGVtYS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzY2hlbWEgdHlwZSBvZiB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ4bWwtdG8tamF2YS1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImphdmEtdG8teG1sLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsZWFmLWVsZW1lbnQtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgdGhlIGVsZW1lbnRzIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzLXJlcXVpcmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlvbi1ub2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlIHRvIHJlcHJlc2VudCBub2RlcyB3aGljaCBhcmUgbWFwcGVkIHRvIHVuaW9uczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZWQtdGV4dC1maWVsZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhpcyBpcyBhIHR5cGVkIHRleHQgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaW5nbGUtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIGlmIGVhY2ggaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBpcyBpbiB0aGUgc2FtZSBub2RlIGluc3RlYWQgb2YgaGF2aW5nIG9uZSBub2RlIHBlciBpdGVtIGluIHRoZSBjb2xsZWN0aW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic2NoZW1hLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNjaGVtYSB0eXBlIG9mIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InhtbC10by1qYXZhLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iamF2YS10by14bWwtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZXNwYWNlLXJlc29sdmVyIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJuYW1lc3BhY2VzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ibmFtZXNwYWNlIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHQtbmFtZXNwYWNlLXVyaSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZXNwYWNlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lc3BhY2UtdXJpIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtcmVmZXJlbmNlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVzb3VyY2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hLWNvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9kZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtY2xhc3MtcGF0aC1yZWZlcmVuY2UiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNjaGVtYS1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1maWxlLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLXVybC1yZWZlcmVuY2UiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNjaGVtYS1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS1jaGFyYWN0ZXIiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtdGltZXN0YW1wIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkYXRlVGltZSIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtdXRpbC1kYXRlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkYXRlVGltZSIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXAtcG9saWN5Ij4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGVzc2ltaXN0aWMtbG9ja2luZyIgdHlwZT0icGVzc2ltaXN0aWMtbG9ja2luZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY21wIGJlYW4tbGV2ZWwgcGVzc2ltaXN0aWMgbG9ja2luZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZlci11bnRpbC1jb21taXQiIHR5cGU9ImRlZmVyLXVudGlsLWNvbW1pdCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBtb2RpZmljYXRpb24gZGVmZXJyYWwgbGV2ZWwgZm9yIG5vbi1kZWZlcnJlZCB3cml0ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJub24tZGVmZXJyZWQtY3JlYXRlLXRpbWUiIHR5cGU9Im5vbi1kZWZlcnJlZC1jcmVhdGUtdGltZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBwb2ludCBhdCB3aGljaCBpbnNlcnQgd2lsbCBiZSBpc3N1ZWQgdG8gRGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlc3NpbWlzdGljLWxvY2tpbmciPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ3YWl0IiBuYW1lPSJsb2NraW5nLW1vZGUiIHR5cGU9ImxvY2tpbmctbW9kZSIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkZWZlci11bnRpbC1jb21taXQiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwtbW9kaWZpY2F0aW9ucyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVwZGF0ZS1tb2RpZmljYXRpb25zIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im5vbi1kZWZlcnJlZC1jcmVhdGUtdGltZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFmdGVyLWVqYmNyZWF0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFmdGVyLWVqYnBvc3RjcmVhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmRlZmluZWQiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2NraW5nLW1vZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Ib2xkcyB0aGUgcGVzc2ltaXN0aWMgbG9ja2luZyBtb2RlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2FpdCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vLXdhaXQiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIiIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSI1MCIgbmFtZT0icHJlYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2UgcHJlYWxsb2NhdGlvbiBzaXplLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVmZXJlbmNlcyBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgb3ZlcnJpZGluZyBpdHMgbmFtZSBhbmQgKG9wdGlvbmFsbHkpIHByZWFsbG9jYXRpb24gc2l6ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRvIHVzZSBwcmVhbGxvY2F0aW9uIHNpemUgb2YgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsIHNldCBwcmVhbGxvY2F0aW9uIHNpemUgdG8gMDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmF0aXZlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGF0YWJhc2Ugc2VxdWVuY2UgbWVjaGFuaXNtIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRhYmxlIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFVRU5DRSIgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9OQU1FIiBuYW1lPSJuYW1lLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZSBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfQ09VTlQiIG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5hcnktdGFibGUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5VbmFyeSB0YWJsZSBzZXF1ZW5jZSAtIHNlcXVlbmNlIG5hbWUgaXMgYSB0YWJsZSBuYW1lLCB0YWJsZSBoYXMgYSBzaW5nbGUgZmllbGQgYW5kIGEgc2luZ2xlIHJvdzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRVUVOQ0UiIG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sZmlsZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbGZpbGUgc2VxdWVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWwgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUVVFTkNFIiBuYW1lPSJyb290LWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9OQU1FIiBuYW1lPSJuYW1lLWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbmFtZT0iY291bnRlci1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlciBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZldGNoLWdyb3VwcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIGFsbCBwcmUtZGVmaW5lZCBmZXRjaCBncm91cHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LWZldGNoLWdyb3VwIiB0eXBlPSJmZXRjaC1ncm91cCIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmZXRjaC1ncm91cCIgdHlwZT0iZmV0Y2gtZ3JvdXAiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZldGNoLWdyb3VwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgdGhlIGZldGNoIGdyb3VwIGF0dHJpYnV0ZXMgaW5mby48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmV0Y2gtZ3JvdXAtYXR0cmlidXRlcyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIGEgZmV0Y2ggZ3JvdXAncyBhdHRyaWJ1dGUgbGlzdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmZXRjaC1ncm91cC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBmb3IgdGhpcyBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVmZXJyZWQtZGV0ZWN0aW9uLWNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzIGJhY2t1cCBjbG9uZSB0byBkZXRlY3QgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2hhbmdlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LWxldmVsLWNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzICJtYXJrIGRpcnR5IiB0byBkZXRlY3QgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2hhbmdlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLWxldmVsLWNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzIGEgQ2hhbmdlVHJhY2tlciBmaXJpbmcgUHJvcGVydHlDaGFuZ2VFdmVudCdzIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIE51bGwgUG9saWN5IGluIHVzZSBmb3IgdGhpcyByZWxhdGlvbnNoaXAgY3VycmVudGx5IGEgY2hvaWNlIG9mIFtOdWxsUG9saWN5IGFuZCBJc1NldE51bGxQb2xpY3ldLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InhzaS1uaWwtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJlbXB0eS1ub2RlLXJlcHJlc2VudHMtbnVsbCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXJlcHJlc2VudGF0aW9uLWZvci14bWwiIHR5cGU9Im1hcnNoYWwtbnVsbC1yZXByZXNlbnRhdGlvbiIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibnVsbC1wb2xpY3kiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJpcy1zZXQtcGVyZm9ybWVkLWZvci1hYnNlbnQtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpcy1zZXQtbnVsbC1wb2xpY3kiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1zZXQtbWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImlzLXNldC1wYXJhbWV0ZXItdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaXMtc2V0LXBhcmFtZXRlciIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+V3JpdGUgbnVsbCwgbm8gdGFnKGRlZmF1bHQpIG9yIGFuIGVtcHR5IHRhZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhTSV9OSUwiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQlNFTlRfTk9ERSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVNUFRZX05PREUiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZ2VuZXJpYyBmaWVsZCBjb25jZXB0LCBzdWNoIGFzIGEgZGF0YWJhc2UgY29sdW1uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2x1bW4gaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGNvbHVtbidzIHRhYmxlLiBUaGlzIHRhYmxlIG11c3QgYmUgbGlzdGVkIGluIHRoZSBjbGFzcycgdGFibGVzLiBJZiBub3Qgc3BlY2lmaWVkIHRoZSBmaXJzdCB0YWJsZSBvZiB0aGUgY2xhc3Mgd2lsbCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzcWwtdHlwZWNvZGUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+KG9wdGlvbmFsIGZpZWxkKSBUaGUgSkRCQyB0eXBlY29kZSBvZiB0aGlzIGNvbHVtbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPihvcHRpb25hbCBmaWVsZCkgTmFtZSBvZiB0aGUgSkRCQyB0eXBlY29kZSBmb3IgdGhpcyBjb2x1bW48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZm9yZWlnbi1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBzb3VyY2UvdGFyZ2V0IGZpZWxkL2NvbHVtbiByZWZlcmVuY2VzIHJlbGF0aW5nIGEgZm9yZWlnbiBrZXkgaW4gb25lIHRhYmxlIHRvIHRoZSBwcmltYXJ5IG9yIHVuaXF1ZSBrZXkgaW4gYW5vdGhlciB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtcmVmZXJlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcmVmZXJlbmNlIG9mIGEgc291cmNlIHRhYmxlIGZvcmVpZ24ga2V5IGFuZCBhIHRhcmdldCB0YWJsZSBwcmltYXJ5IGtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZpZWxkL2NvbHVtbiBuYW1lIGluIHRoZSBzb3VyY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByaW1hcnkgb3IgdW5pcXVlIGtleSBmaWVsZC9jb2x1bW4gbmFtZSBpbiB0aGUgdGFyZ2V0IHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IHNwZWNpZmljYXRpb24gZm9yIHF1ZXJ5aW5nIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgb2YgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBxdWVyeSBhcmd1bWVudHMuIFRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnQgbXVzdCBtYXRjaCB0aGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50IHZhbHVlIHBhc3NlZCB0byB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJxdWVyeS1hcmd1bWVudCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcXVlcnkuICBUaGlzIG5hbWUgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIGFuZCBleGVjdXRlIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNyaXRlcmlhIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZmlsdGVyaW5nIGNsYXVzZSBvZiBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIHR5cGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgbWF5IGJlIHByb3ZpZGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCBjb25zdGFudCB2YWx1ZSBmb3IgdGhlIGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvcGVydHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHVzZXIgZGVmaW5lZCBwcm9wZXJ0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmFueVR5cGUiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiB0YWJsZXMgdGhhdCB0aGUgY2xhc3MgaXMgcGVyc2lzdGVkIHRvLiAgVGhpcyBpcyB0eXBpY2FsbHkgYSBzaW5nbGUgdGFibGUgYnV0IGNhbiBiZSBtdWx0aXBsZSwgb3IgZW1wdHkgZm9yIGluaGVyaXRhbmNlIG9yIGFnZ3JlZ2F0ZWQgY2xhc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgdGFibGUuICBUaGUgbmFtZSBjYW4gYmUgZnVsbHkgcXVhbGlmaWVkIHdpdGggdGhlIHNjaGVtYSwgdGFibGVzcGFjZSBvciBsaW5rLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIFNwZWNpZmllcyBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUKLSAgICAgICAgb2JqZWN0IHZhbHVlLgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAJPHhzZDpzZXF1ZW5jZT4KLSAgCQk8eHNkOmVsZW1lbnQgbmFtZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiCi0gIAkJCXR5cGU9Im5vZGUtb3JkZXJpbmctcG9saWN5IiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0gIAkJPC94c2Q6ZWxlbWVudD4KLSAgCTwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8eHNkOmNvbXBsZXhUeXBlCi0gICAgCW5hbWU9ImRlc2NyaXB0b3ItbGV2ZWwtZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuby1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5kZXItcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFwcGVuZC1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZ25vcmUtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpdmUtcG9zaXRpb24tb3JkZXJpbmctcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMi4wLnhzZCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzIuMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5M2I5ZWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMi4wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQyNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0Ci0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gZnJvbSBPcmFjbGUgVG9wTGluawotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4KLTwhLS0gRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlIFByb2plY3QgOjogTWFwIFNjaGVtYSBmaWxlIGZvciBPUk0vT1hNL0VJUyAtLT4KLTx4c2Q6c2NoZW1hCi0gIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIgotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIgotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICB2ZXJzaW9uPSIyLjAiCi0gID4KLSAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC1wZXJzaXN0ZW5jZSIgdHlwZT0ib2JqZWN0LXBlcnNpc3RlbmNlIiAvPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1wZXJzaXN0ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFuIG9iamVjdC1wZXJzaXN0ZW5jZSBtYXBwaW5nIG1vZHVsZSwgYSBzZXQgb2YgY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgbmFtZSBmb3IgdGhlIG1vZGVsIGJlaW5nIG1hcHBlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvcnMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGNsYXNzIG1hcHBpbmcgZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciIgdHlwZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmZvcm1hdGlvbiBvZiBob3cgYSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8gaXRzIGRhdGEtc3RvcmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImxvZ2luIiB0eXBlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0YXNvdXJjZSBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImRlZmF1bHQtdGVtcG9yYWwtbXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGRlZmF1bHQgZm9yIGhvdyBEYXRlIGFuZCBDYWxlbmRhciB0eXBlcyBhcmUgdXNlZCB3aXRoIGNoYW5nZSB0cmFja2luZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5CeSBkZWZhdWx0IHRoZXkgYXJlIGFzc3VtZWQgbm90IHRvIGJlIGNoYW5nZWQgZGlyZWN0bHkgKG9ubHkgcmVwbGFjZWQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcmllcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBsaXN0IG9mIHF1ZXJpZXMgdG8gYmUgc3RvcmVkIG9uIHRoZSBzZXNzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeSIgdHlwZT0iZGF0YWJhc2UtcXVlcnkiPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIGRlZmF1bHQ9IkVjbGlwc2UgUGVyc2lzdGVuY2UgU2VydmljZXMgLSAyLjAgKEJ1aWxkIFlZTU1ERCkiIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0YXNvdXJjZSBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGxhdGZvcm0tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgcGxhdGZvcm0gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIHVzZXItbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0YXNvdXJjZSBwYXNzd29yZCwgdGhpcyBpcyBzdG9yZWQgaW4gZW5jcnlwdGVkIGZvcm0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZXh0ZXJuYWwtY29ubmVjdGlvbi1wb29saW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBpZiB0aGUgY29ubmVjdGlvbnMgYXJlIG1hbmFnZWQgYnkgdGhlIGRhdGFzb3VyY2UgZHJpdmVyLCBhbmQgYSBuZXcgY29ubmVjdGlvbiBzaG91bGQgYmUgYWNxdWlyZSBwZXIgY2FsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJleHRlcm5hbC10cmFuc2FjdGlvbi1jb250cm9sbGVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBpZiB0aGUgdHJhbnNhY3Rpb24gYXJlIG1hbmFnZWQgYnkgYSB0cmFuc2FjdGlvbiBtYW5hZ2VyLCBhbmQgc2hvdWxkIG5vdCBiZSBtYW5hZ2VkIGJ5IFRvcExpbmsuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYWxzbyBiZSB1c2VkIGlmIHRoZSBkYXRhc291cmNlIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNhY3Rpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VxdWVuY2luZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2luZyBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIiB0eXBlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmYXVsdCBzZXF1ZW5jZS4gVGhlIG5hbWUgaXMgb3B0aW9uYWwuIElmIG5vIG5hbWUgcHJvdmlkZWQgYW4gZW1wdHkgc3RyaW5nIHdpbGwgYmUgdXNlZCBhcyBhIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXF1ZW5jZXMiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk5vbiBkZWZhdWx0IHNlcXVlbmNlcy4gTWFrZSBzdXJlIGVhY2ggc2VxdWVuY2UgaGFzIHVuaXF1ZSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzZXF1ZW5jZSIgdHlwZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1sb2dpbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBKREJDIGRyaXZlciBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZHJpdmVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSkRCQyBkcml2ZXIgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb25uZWN0aW9uLXVybCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbCBKREJDIGRyaXZlciBjb25uZWN0aW9uIFVSTC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImJpbmQtYWxsLXBhcmFtZXRlcnMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBwYXJhbWV0ZXIgYmluZGluZyBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYWNoZS1hbGwtc3RhdGVtZW50cyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIHN0YXRlbWVudCBjYWNoaW5nIHNob3VsZCBiZSB1c2VkLiAgVGhpcyBzaG91bGQgYmUgdXNlZCB3aXRoIHBhcmFtZXRlciBiaW5kaW5nLCB0aGlzIGNhbm5vdCBiZSB1c2VkIHdpdGggZXh0ZXJuYWwgY29ubmVjdGlvbiBwb29saW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iYnl0ZS1hcnJheS1iaW5kaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgYnl0ZSBhcnJheSBkYXRhLXR5cGVzIHNob3VsZCB1c2UgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJzdHJpbmctYmluZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIHN0cmluZyBkYXRhLXR5cGVzIHNob3VsZCB1c2UgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjI1NiIgbmFtZT0ic3RyaW5nLWJpbmRpbmctc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRoZSB0aHJlc2hvbGQgc3RyaW5nIHNpemUgZm9yIHVzYWdlIG9mIHN0cmluZyBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InN0cmVhbXMtZm9yLWJpbmRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBsYXJnZSBieXRlIGFycmF5IGFuZCBzdHJpbmcgZGF0YS10eXBlcyBzaG91bGQgYmUgYm91bmQgYXMgc3RyZWFtcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJmb3JjZS1maWVsZC1uYW1lcy10by11cHBlci1jYXNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdG8gZm9yY2UgYWxsIGZpZWxkIG5hbWVzIHRvIHVwcGVyLWNhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJvcHRpbWl6ZS1kYXRhLWNvbnZlcnNpb24iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBkYXRhIG9wdGltaXphdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InRyaW0tc3RyaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIHN0cmluZyB0cmFpbGluZyBibGFua3Mgc2hvdWxkIGJlIHRyaW1tZWQuICBUaGlzIGlzIG5vcm1hbGx5IHJlcXVpcmVkIGZvciBDSEFSIGRhdGEtdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtd3JpdGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIGJhdGNoIHdyaXRpbmcgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJqZGJjLWJhdGNoLXdyaXRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHVzaW5nIGJhdGNoIHdyaXRpbmcsIGNvbmZpZ3VyZSBpZiB0aGUgSkRCQyBkcml2ZXJzIGJhdGNoIHdyaXRpbmcgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1sb2dpbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBKQ0EgZHJpdmVyIGFuZCBFSVMgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29ubmVjdGlvbi1zcGVjLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgVG9wTGluayBwbGF0Zm9ybSBzcGVjaWZpYyBjb25uZWN0aW9uIHNwZWMgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb25uZWN0aW9uLWZhY3RvcnktdXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBKTkRJIHVybCBmb3IgdGhlIG1hbmFnZWQgSkNBIGFkYXB0ZXIncyBjb25uZWN0aW9uIGZhY3RvcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1sb2dpbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiCi0gICAgICAgICAgICAgICAgbmFtZT0iZXF1YWwtbmFtZXNwYWNlLXJlc29sdmVycyIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSIKLSAgICAgICAgICAgICAgICB0eXBlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5IiBtYXhPY2N1cnM9IjEiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmZvcm1hdGlvbiBvZiBob3cgYSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8gaXRzIGRhdGEtc3RvcmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGlzIGFuIGFic3RyYWN0IGRlZmluaXRpb24gdG8gYWxsb3cgZmxleGliaWxpdHkgaW4gdGhlIHR5cGVzIG9mIGNsYXNzZXMgYW5kIGRhdGFzdG9yZXMgcGVyc2lzdGVkLCBpLmUuIGludGVyZmFjZXMsIGFic3RyYWN0IGNsYXNzZXMsIGFnZ3JlZ2F0ZXMsIG5vbi1yZWxhdGlvbmFsIHBlcnNpc3RlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgYmVpbmcgcGVyc2lzdGVkLiAgVGhlIGNsYXNzIG5hbWUgbXVzdCBiZSBmdWxsIHF1YWxpZmllZCB3aXRoIGl0cyBwYWNrYWdlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxjbGFzcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5leGFtcGxlLmVtcGxveWVlLmltcGxlbWVudGF0aW9uLkVtcGxveWVlPC9jbGFzcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFsaWFzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IGFuIGFsaWFzIG5hbWUgY2FuIGJlIGdpdmVuIGZvciB0aGUgY2xhc3MuICBUaGUgYWxpYXMgaXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byByZWZlciB0byB0aGUgY2xhc3MgaW4gcGxhY2Ugb2YgaXRzIGltcGxlbWVudGF0aW9uIG5hbWUsIHN1Y2ggYXMgaW4gcXVlcnlpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGFsaWFzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPkVtcGxveWVlPC9hbGlhcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBmaWVsZHMvY29sdW1ucyB0aGF0IG1ha2UgdXAgdGhlIHByaW1hcnkga2V5IG9yIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGlzIHVzZWQgZm9yIGNhY2hpbmcsIHJlbGF0aW9uc2hpcHMsIGFuZCBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByaW1hcnkga2V5IGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBpZiB0aGUgY2xhc3MgaXMgcmVhZC1vbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvcGVydGllcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHVzZXIgZGVmaW5lZCBwcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InByb3BlcnR5IiB0eXBlPSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSB1c2VyIGRlZmluZWQgcHJvcGVydHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJpbmhlcml0YW5jZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcyBpcyByZWxhdGVkIGluIGluaGVyaXRhbmNlIGFuZCBob3cgdGhpcyBpbmhlcml0YW5jZSBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJldmVudHMiIHR5cGU9ImV2ZW50LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGVyc2lzdGVudCBldmVudHMgZm9yIHRoaXMgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyeWluZyIgdHlwZT0icXVlcnktcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBkZWZpbmVkIHF1ZXJpZXMgZm9yIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1tYXBwaW5ncyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgbWFwcGluZ3MgdGhhdCBkZWZpbmUgaG93IHRoZSBjbGFzcycgYXR0cmlidXRlcyBhcmUgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhdHRyaWJ1dGUtbWFwcGluZyIgdHlwZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgYXR0cmlidXRlIGlzIHBlcnNpc3RlZC4gVGhlIGF0dHJpYnV0ZSBtYXBwaW5nIGRlZmluaXRpb24gaXMgZXh0ZW5kYWJsZSB0byBhbGxvdyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZXNjcmlwdG9yLXR5cGUiIHR5cGU9ImNsYXNzLWRlc2NyaXB0b3ItdHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZGVzY3JpcHRvciB0eXBlLCBzdWNoIGFzIGFnZ3JlZ2F0ZSBvciBpbmRlcGVuZGVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImludGVyZmFjZXMiIHR5cGU9ImludGVyZmFjZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGludGVyZmFjZXMgdGhhdCB0aGlzIGNsYXNzIGltcGxlbWVudHMuLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibG9ja2luZyIgdHlwZT0ibG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGxvY2tpbmcgYmVoYXZpb3IgZm9yIHRoZSBjbGFzcy4gIFN1Y2ggYXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiB2ZXJzaW9uLCB0aW1lc3RhbXAgb3IgY2hhbmdlIHNldCBvZiBjb2x1bW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VxdWVuY2luZyIgdHlwZT0ic2VxdWVuY2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgZ2VuZXJhdGVkIHVuaXF1ZSBpZCBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FjaGluZyIgdHlwZT0iY2FjaGluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcycgaW5zdGFuY2VzIHNob3VsZCBiZSBjYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZW1vdGUtY2FjaGluZyIgdHlwZT0iY2FjaGluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcycgaW5zdGFuY2VzIHNob3VsZCBiZSBjYWNoZWQgb24gcmVtb3RlIGNsaWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXBvbGljeSIgdHlwZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2Ygb2JqZWN0cyBhcmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGhpc3RvcnkgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuaW5nLXBvbGljeSIgdHlwZT0icmV0dXJuaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyByZXR1bmluZyBwb2xpY3kuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gcmV0dXJuaW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFtZW5kbWVudCIgdHlwZT0iYW1lbmRtZW50Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYW1lbmRlZCBvciBjdXN0b21pemVkIHRocm91Z2ggYSBjbGFzcyBBUEkgYWZ0ZXIgbG9hZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc3RhbnRpYXRpb24iIHR5cGU9Imluc3RhbnRpYXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGluc3RhbnRpYXRpb24gYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29weWluZyIgdHlwZT0iY29weS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgY2xvbmluZy9jb3B5aW5nIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyeS1rZXlzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGxpc3Qgb2YgcXVlcnkga2V5cyBvciBhbGlhc2VzIGZvciBkYXRhYmFzZSBpbmZvcm1hdGlvbi4gIFRoZXNlIGNhbiBiZSB1c2VkIGluIHF1ZXJpZXMgaW5zdGVhZCBvZiB0aGUgZGF0YWJhc2UgY29sdW1uIG5hbWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeS1rZXkiIHR5cGU9InF1ZXJ5LWtleSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgcXVlcnlpbmcgZGF0YWJhc2UgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNtcC1wb2xpY3kiIHR5cGU9ImNtcC1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlBsYWNlIGhvbGRlciBvZiBDTVAgaW5mb3JtYXRpb24gc3BlY2lmaWMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1ncm91cHMiIHR5cGU9ImZldGNoLWdyb3VwcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYWxsIHByZS1kZWZpbmVkIGZldGNoIGdyb3VwcyBhdCB0aGUgZGVzY3JpcHRvciBsZXZlbDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjaGFuZ2UtcG9saWN5IiB0eXBlPSJjaGFuZ2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyB0aGUgQ2hhbmdlIFBvbGljeSBmb3IgdGhpcyBkZXNjcmlwdG9yPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgZml4ZWQ9IjEwIiBuYW1lPSJzY2hlbWEtbWFqb3ItdmVyc2lvbiIgdHlwZT0ieHNkOmludGVnZXIiIC8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgZml4ZWQ9IjAiIG5hbWU9InNjaGVtYS1taW5vci12ZXJzaW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjbGFzcy1kZXNjcmlwdG9yLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjbGFzcyBkZXNjcmlwdG9yIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbmRlcGVuZGVudCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFnZ3JlZ2F0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFnZ3JlZ2F0ZS1jb2xsZWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG9zaXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG9zaXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW50ZXJmYWNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyZmFjZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBpbnRlcmZhY2VzIHRoYXQgYSBjbGFzcyBkZXNjcmlwdG9yIGltcGxlbWVudHMsIG9yIHRoZSBpbXBsZW1lbnRpb24gY2xhc3MgZm9yIGFuIGludGVyZmFjZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBhIHNldCBvZiBwdWJsaWMgaW50ZXJmYWNlcyBmb3IgdGhlIGNsYXNzIGNhbiBiZSBzcGVjaWZpZWQuICBUaGlzIGFsbG93cyB0aGUgaW50ZXJmYWNlIHRvIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdHdvIGNsYXNzZXMgaW1wbGVtZW50IHRoZSBzYW1lIGludGVyZmFjZSwgYW4gaW50ZXJmYWNlIGRlc2NyaXB0b3Igc2hvdWxkIGJlIGRlZmluZWQgZm9yIHRoZSBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBhbHNvIGJlIHVzZWQgdG8gZGVmaW5lIGluaGVyaXRhbmNlIGJldHdlZW4gaW50ZXJmYWNlIGRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImludGVyZmFjZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBpbnRlcmZhY2UgY2xhc3MgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8Y2xhc3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+ZXhhbXBsZS5lbXBsb3llZS5hcGkuRW1wbG95ZWU8L2NsYXNzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImltcGxlbWVudG9yLWRlc2NyaXB0b3IiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHdoaWNoIHRoaXMgaW50ZXJmYWNlIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgdGhlIGludGVyZmFjZSBoYXMgb25seSBhIHNpbmdsZSBpbXBsZW1lbnRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8Y2xhc3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+ZXhhbXBsZS5lbXBsb3llZS5pbXBsLkVtcGxveWVlPC9jbGFzcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGNsb25pbmcvY29weWluZyBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNyZWF0ZXMgYSBjb3B5aW5nIHRocm91Z2ggY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2UgdG8gY29weSBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb3B5LXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGNsb25pbmcvY29weWluZyBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkIHRocm91Z2ggYSBjbG9uZSBtZXRob2QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvcHktcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGNsb25lIG1ldGhvZCBvbiB0aGUgb2JqZWN0LCBpLmUuICdjbG9uZSc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zdGFudGlhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGluc3RhbnRpYXRpb24gYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBvbiB0aGUgZmFjdG9yeSB0byBpbnN0YW50aWF0ZSB0aGUgb2JqZWN0IGluc3RhbmNlLic8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZhY3RvcnktY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgZmFjdG9yeSBjbGFzcyBuYW1lLic8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZhY3RvcnktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGluc3RhbnRpYXRlIHRoZSBmYWN0b3J5IGNsYXNzLic8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYW1lbmRtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgY2xhc3MgYW5kIHN0YXRpYyBtZXRob2QgdG8gYmUgY2FsbGVkIHRvIGFsbG93IGZvciB0aGUgZGVzY3JpcHRvciB0byBiZSBhbWVuZGVkIG9yIGN1c3RvbWl6ZWQgdGhyb3VnaCBhIGNsYXNzIEFQSSBhZnRlciBsb2FkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFtZW5kbWVudC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+IFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYW1lbmRtZW50IGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFtZW5kbWVudC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYW1lbmRtZW50IG1ldGhvZCBvbiB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uYWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYSByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlKHMpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRhYmxlcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiB0aGUgdGFibGVzIHRoZSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8uICBUeXBpY2FsbHkgYSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8gYSBzaW5nbGUgdGFibGUsIGJ1dCBtdWx0aXBsZSB0YWJsZXMgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idGFibGUiIHR5cGU9InRhYmxlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHRhYmxlcyB0aGF0IHRoZSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8uICBUaGlzIGlzIHR5cGljYWxseSBhIHNpbmdsZSB0YWJsZSBidXQgY2FuIGJlIG11bHRpcGxlLCBvciBlbXB0eSBmb3IgaW5oZXJpdGFuY2Ugb3IgYWdncmVnYXRlZCBjbGFzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleXMtZm9yLW11bHRpcGxlLXRhYmxlIiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgZm9yZWlnbiBrZXkgZmllbGQgcmVmZXJlbmNlcyB0byBiZSBkZWZpbmUgZm9yIG11bHRpcGxlIHRhYmxlIGRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibXVsdGlwbGUtdGFibGUtam9pbi1jcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGNvbXBsZXggbXVsdGlwbGUgdGFibGUgam9pbiBjb25kaXRpb25zIGFuIGV4cHJlc3Npb24gbWF5IGJlIHByb3ZpZGVkIGluc3RlYWQgb2YgdGhlIHRhYmxlIGZvcmVpZ24ga2V5IGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24tbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gYSBudW1lcmljIHZlcnNpb24gZmllbGQvY29sdW1uIHRoYXQgdHJhY2tzIGNoYW5nZXMgYW5kIHRoZSB2ZXJzaW9uIHRvIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBhbmQgb3B0aW9uYWxseSB0aGUgdGFibGUgb2YgdGhlIGNvbHVtbiB0aGF0IHRoZSBhdHRyaWJ1dGUgaXMgc3RvcmVkIGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJzdG9yZS12ZXJzaW9uLWluLWNhY2hlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSB2ZXJzaW9uIHZhbHVlIHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIGNhY2hlLCBvciBpZiBpdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lc3RhbXAtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gdGltZXN0YW1wIHZlcnNpb24gY29sdW1uIHRoYXQgdHJhY2tzIGNoYW5nZXMgYW5kIHRoZSB2ZXJzaW9uIHRvIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmVyc2lvbi1sb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InNlcnZlci10aW1lIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSB0aW1lc3RhbXAgc2hvdWxkIGJlIG9idGFpbmVkIGxvY2FsbHkgb3IgZnJvbSB0aGUgZGF0YWJhc2Ugc2VydmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhbGwtZmllbGRzLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgcmVhZCB2YWx1ZXMgb2YgYWxsIGZpZWxkcyBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2VkLWZpZWxkcy1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIG9yaWdpbmFsIHJlYWQgdmFsdWVzIG9mIG9ubHkgdGhlIGNoYW5nZWQgZmllbGRzIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlbGVjdGVkLWZpZWxkcy1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIG9yaWdpbmFsIHJlYWQgdmFsdWVzIG9mIGEgc3BlY2lmaWVkIHNldCBvZiBmaWVsZHMgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBzZXQgb2YgZmllbGRzIHRvIGNvbXBhcmUgb24gdXBkYXRlIGFuZCBkZWxldGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jaW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgZGF0YWJhc2UgZ2VuZXJhdGVkIHVuaXF1ZSBpZCBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGdlbmVyYXRvci4gIFRoaXMgY291bGQgYmUgdGhlIG5hbWUgb2YgYSBzZXF1ZW5jZSBvYmplY3QsIG9yIGEgcm93IHZhbHVlIGluIGEgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBmaWVsZC9jb2x1bW4gdGhhdCB0aGUgZ2VuZXJhdGVkIHNlcXVlbmNlIGlkIGlzIGFzc2lnbmVkIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgY2FjaGluZyB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmdWxsIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2FjaGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3ZWFrLXJlZmVyZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNvZnQtcmVmZXJlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic29mdC1jYWNoZS13ZWFrLXJlZmVyZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhhcmQtY2FjaGUtd2Vhay1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FjaGluZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MnIGluc3RhbmNlcyBzaG91bGQgYmUgY2FjaGVkIGFuZCBob3cgb2JqZWN0IGlkZW50aXR5IHNob3VsZCBiZSBtYWludGFpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ic29mdC1jYWNoZS13ZWFrLXJlZmVyZW5jZSIgbmFtZT0iY2FjaGUtdHlwZSIgdHlwZT0iY2FjaGUtdHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgdHlwZSBvZiBjYWNoaW5nLCBzdWNoIGFzIExSVSwgd2VhayByZWZlcmVuY2Ugb3Igbm9uZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjEwMCIgbmFtZT0iY2FjaGUtc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGluaXRpYWwgb3IgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJhbHdheXMtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIHJlZnJlc2ggY2FjaGVkIG9iamVjdHMgb24gcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJvbmx5LXJlZnJlc2gtY2FjaGUtaWYtbmV3ZXItdmVyc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gcmVmcmVzaCBpZiB0aGUgY2FjaGVkIG9iamVjdCBpcyBhbiBvbGRlciB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImRpc2FibGUtY2FjaGUtaGl0cyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRpc2FibGUgb2J0YWluaW5nIGNhY2hlIGhpdHMgb24gcHJpbWFyeSBrZXkgcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJhbHdheXMtY29uZm9ybSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGNvbmZvcm0gcXVlcmllcyB3aXRoaW4gYSB0cmFuc2FjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJpc29sYXRlZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgb2JqZWN0cyBvZiB0aGlzIHR5cGUgc2hvdWxkIGJlIGlzb2xhdGVkIGZyb20gdGhlIHNoYXJlZCBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Imlzb2xhdGUtbmV3LWRhdGEtYWZ0ZXItdHJhbnNhY3Rpb24iIG5hbWU9InVuaXRvZndvcmstaXNvbGF0aW9uLWxldmVsIiB0eXBlPSJ1bml0b2Z3b3JrLWlzb2xhdGlvbi1sZXZlbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHVuaXQgb2Ygd29yayBzaG91bGQgYmUgaXNvbGF0ZWQgdG8gdGhlIHNlc3Npb24gY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5IiB0eXBlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImNoYW5nZS1zZXQiIG5hbWU9ImNhY2hlLXN5bmMtdHlwZSIgdHlwZT0iY2FjaGUtc3luYy10eXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgdHlwZSBvZiBjYWNoZSBzeW5jaHJvbml6YXRpb24gdG8gYmUgdXNlZCB3aXRoIHRoaXMgZGVzY3JpcG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZS1pbnZhbGlkYXRpb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVwZGF0ZS1yZWFkLXRpbWUtb24tdXBkYXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm8tZXhwaXJ5LWNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5IHdoZXJlIG9iamVjdHMgaW4gdGhlIGNhY2hlIGRvIG5vdCBleHBpcmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNhY2hlLWludmFsaWRhdGlvbiIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZS10by1saXZlLWNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5IHdoZXJlIG9iamVjdHMgbGl2ZSBhIHNwZWNpZmljIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhleSBhcmUgcmVhZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGltZS10by1saXZlIiB0eXBlPSJ4c2Q6bG9uZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhaWx5LWNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DYWNoZSBpbnZhbGlkYXRpb24gUG9saWN5IHdoZXJlIG9iamVjdHMgZXhwaXJlIGF0IGEgc3BlY2lmaWMgdGltZSBldmVyeSBkYXk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5LXRpbWUiIHR5cGU9InhzZDpkYXRlVGltZSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiBvYmplY3RzIGFyZSB0byBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJoYW5kbGUtd3JpdGVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UtZGF0YWJhc2UtdGltZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXRhYmxlcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgbmFtZXMgb2YgdGhlIG1pcnJvcmluZyBoaXN0b3JpY2FsIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Imhpc3RvcnktdGFibGUiIHR5cGU9Imhpc3RvcnktdGFibGUiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0YXJ0LWZpZWxkcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc3RhcnQgZmllbGRzIGZvciBlYWNoIGhpc3RvcmljYWwgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzdGFydC1maWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImVuZC1maWVsZHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGVuZCBmaWVsZHMgZm9yIGVhY2ggaGlzdG9yaWNhbCB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImVuZC1maWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaGlzdG9yeS10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkVhY2ggZW50cnkgaXMgYSBzb3VyY2UgKGRlc2NyaXB0b3IpIHRvIGhpc3RvcnkgdGFibGUgbmFtZSBhc3NvY2lhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IiIgbmFtZT0ic291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMSIgbmFtZT0iaGlzdG9yeSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmV0dXJuaW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgcmV0dW5pbmcgcG9saWN5LiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIHJldHVybmluZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBuYW1lPSJyZXR1cm5pbmctZmllbGQtaW5mb3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIHRoZSBmaWVsZHMgdG8gYmUgcmV0dXJuZWQgdG9nZXRoZXIgd2l0aCB0aGUgZmxhZ3MgZGVmaW5pbmcgcmV0dXJuaW5nIG9wdGlvbnM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InJldHVybmluZy1maWVsZC1pbmZvIiB0eXBlPSJyZXR1cm5pbmctZmllbGQtaW5mbyIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXR1cm5pbmctZmllbGQtaW5mbyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZpZWxkIHRvIGJlIHJldHVybmVkIHRvZ2V0aGVyIHdpdGggdHlwZSBhbmQgdGhlIGZsYWdzIGRlZmluaW5nIHJldHVybmluZyBvcHRpb25zLiBBdCBsZWFzdCBvbmUgb2YgaW5zZXJ0LCB1cGRhdGUgc2hvdWxkIGJlIHRydWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdGFyZ2V0IHJlZmVyZW5jZWQgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgdG8gYmUgcmV0dXJuZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iaW5zZXJ0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBiZSByZXR1bmVkIGFmdGVyIEluc2VydC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJpbnNlcnQtbW9kZS1yZXR1cm4tb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIGluc2VydD09dHJ1ZSwgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBub3QgYmUgaW5zZXJ0ZWQgKHRydWUpLiBJZiBpbnNlcnQ9PWZhbHNlIC0gaWdub3JlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgc2hvdWxkIGJlIHJldHVuZWQgYWZ0ZXIgSW5zZXJ0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmhlcml0YW5jZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MgaXMgcmVsYXRlZCBpbiBpbmhlcml0YW5jZSBhbmQgaG93IHRoaXMgaW5oZXJpdGFuY2UgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGFyZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcGFyZW50L3N1cGVyY2xhc3Mgb2YgdGhlIGNsYXNzIGJlaW5nIHBlcnNpc3RlZC4gIFRoZSBjbGFzcyBuYW1lIG11c3QgYmUgZnVsbCBxdWFsaWZpZWQgICB3aXRoIGl0cyBwYWNrYWdlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0icmVhZC1zdWJjbGFzc2VzLW9uLXF1ZXJpZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgaWYgc3ViY2xhc3NlcyBvZiB0aGUgY2xhc3Mgc2hvdWxkIGJlIHJldHVybmVkIG9uIHF1ZXJpZXMsIG9yIG9ubHkgdGhlIGV4YWN0IGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWxsLXN1YmNsYXNzZXMtdmlldyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBuYW1lIG9mIGEgdmlldyB0aGF0IGpvaW5zIGFsbCBvZiB0aGUgc3ViY2xhc3MnIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UtY2xhc3MtbmFtZS1hcy1pbmRpY2F0b3IiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBjbGFzcyB0eXBlIGluZGljYXRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWV4dHJhY3Rpb24tbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiBhIG1ldGhvZCBvbiB0aGUgY2xhc3MgdGhhdCB0YWtlcyB0aGUgY2xhc3MnIHJvdyBhcyBhcmd1bWVudCBhIGNvbXB1dGVkIHRoYXQgY2xhc3MgdHlwZSB0byBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGZyb20gdGhlIHJvdy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWluZGljYXRvci1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSB0eXBlIGZpZWxkL2NvbHVtbiB0aGF0IHRoZSBjbGFzcyB0eXBlIGlzIHN0b3JlZCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIiB0eXBlPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgY2xhc3MgaW5kaWNhdG9yIHZhbHVlcyBhbmQgdGhlIHN1YmNsYXNzZXMgdGhleSBtYXAgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1leHRyYWN0b3IiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgY2xhc3MgZXh0cmFjdG9yIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im9ubHktaW5zdGFuY2VzLWNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNyaXRlcmlhIHRoYXQgZmlsdGVycyBvdXQgYWxsIHNpYmxpbmcgYW5kIHN1YmNsYXNzIGluc3RhbmNlcyBvbiBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWxsLXN1YmNsYXNzZXMtY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY3JpdGVyaWEgdGhhdCBmaWx0ZXJzIG91dCBzaWJsaW5nIGluc3RhbmNlcyBvbiBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Im91dGVyLWpvaW4tc3ViY2xhc3NlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBpbmhlcml0YW5jZSBxdWVyaWVzIHNwZWNpZnkgaWYgYWxsIHN1YmNsYXNzZXMgc2hvdWxkIGJlIG91dGVyIGpvaW5lZCwgaW5zdGVhZCBvZiBhIHF1ZXJ5IHBlciBzdWJjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icW5hbWUtaW5oZXJpdGFuY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXh0ZW5kcyBpbmhlcml0YW5jZSBwb2xpY3kuIEFsbG93cyBmb3IgcHJlZml4ZWQgbmFtZXMgdG8gYmUgcmVzb2x2ZWQgYXQgcnVudGltZSB0byBmaW5kIHRoZSBhcHByb3JpYXRlIGNsYXNzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluaGVyaXRhbmNlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBjbGFzcyBpbmRpY2F0b3IgdmFsdWVzIGFuZCB0aGUgc3ViY2xhc3NlcyB0aGV5IG1hcCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0aGUgdHlwZSBtYXBzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLWluZGljYXRvciIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCB2YWx1ZSB1c2VkIHRvIGRlZmluZSB0aGUgY2xhc3MgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJldmVudC1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwZXJzaXN0ZW50IGV2ZW50cyBmb3IgdGhpcyBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImV2ZW50LWxpc3RlbmVycyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJldmVudC1saXN0ZW5lciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGFuIGV2ZW50IGxpc3RlbmVyIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgZGVzY3JpcHRvciBldmVudCBsaXN0ZW5lciBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtYnVpbGQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgYnVpbGRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS13cml0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgd3JpdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC13cml0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciB3cml0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtaW5zZXJ0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSBpbnNlcnRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtaW5zZXJ0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGluc2VydGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLXVwZGF0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgdXBkYXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtdXBkYXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIHVwZGF0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtZGVsZXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSBkZWxldGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1kZWxldGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgZGVsZXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFib3V0LXRvLWluc2VydC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgaW5zZXJ0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhYm91dC10by11cGRhdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIHVwZGF0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWNsb25lLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGNsb25pbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtbWVyZ2UtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgbWVyZ2luZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1yZWZyZXNoLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIHJlZnJlc2hpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZGVmaW5lZCBxdWVyaWVzIGFuZCBxdWVyeSBwcm9wZXJ0aWVzIGZvciB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyaWVzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5IiB0eXBlPSJxdWVyeSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSBkZWZpbml0aW9uIGZvciB0aGUgY2xhc3MnIGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGltZW91dCIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIHRpbWVvdXQgdG8gYXBwbHkgdG8gYWxsIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJjaGVjay1jYWNoZSIgbmFtZT0iZXhpc3RlbmNlIiB0eXBlPSJleGlzdGVuY2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgYmVoYXZvaXIgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdCB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zZXJ0LXF1ZXJ5IiB0eXBlPSJpbnNlcnQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gaW5zZXJ0IHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IGluc2VydCBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ1cGRhdGUtcXVlcnkiIHR5cGU9InVwZGF0ZS1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSB1cGRhdGUgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgdXBkYXRlIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1xdWVyeSIgdHlwZT0iZGVsZXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIGRlbGV0ZSBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCBkZWxldGUgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZG9lcy1leGlzdC1xdWVyeSIgdHlwZT0iZG9lcy1leGlzdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIGRvZXMgZXhpc3QgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgZGVsZXRlIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlYWQtb2JqZWN0LXF1ZXJ5IiB0eXBlPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIHJlYWQgb2JqZWN0IHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IHJlYWQgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVhZC1hbGwtcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gcmVhZCBhbGwgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgcmVhZCBhbGwgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgZXhpc3RlbmNlIHBvbGljaWVzIGZvciBkZXRlcm1pbmluZyBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stY2FjaGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1kYXRhYmFzZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1leGlzdGVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtbm9uLWV4aXN0ZW5jZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBxdWVyeWluZyBkYXRhYmFzZSBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkta2V5IGFsaWFzIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLXN5bmMtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0eXBlIG9mIGNhY2hlIHN5bmNocm9uaXphdGlvbiB0byB1c2Ugd2l0aCBhIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbnZhbGlkYXRpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuby1jaGFuZ2VzIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hhbmdlLXNldC13aXRoLW5ldy1vYmplY3RzIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hhbmdlLXNldCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InVuaXRvZndvcmstaXNvbGF0aW9uLWxldmVsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHVuaXQgb2Ygd29yayBpc29sYXRlZCBmcm9tIHRoZSBzZXNzaW9uIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXNlLXNlc3Npb24tY2FjaGUtYWZ0ZXItdHJhbnNhY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpc29sYXRlLW5ldy1kYXRhLWFmdGVyLXRyYW5zYWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXNvbGF0ZS1jYWNoZS1hZnRlci10cmFuc2FjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imlzb2xhdGUtY2FjaGUtYWx3YXlzIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1xdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIGRhdGFiYXNlIGNvbHVtbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icXVlcnkta2V5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gYmVpbmcgYWxpYXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwLXF1ZXJ5LWtleSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIGpvaW4gdG8gYW5vdGhlciBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InF1ZXJ5LWtleSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHRhcmdldCByZWZlcmVuY2VkIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgam9pbiBjb25kaXRpb24gYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgY2xhc3MnIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBqb2luIGNyaXRlcmlhIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGNsYXNzJyB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZS1xdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIDEtMSBqb2luIHRvIGFub3RoZXIgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtcXVlcnkta2V5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueS1xdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIDEtbSBqb2luIGZyb20gYW5vdGhlciBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtcXVlcnkta2V5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIGZyb20gYW4gYXR0aXJidXRlIHRvIGEgc2ltcGxlIGZpZWxkIGRhdGF0eXBlLCBpLmUuIFN0cmluZywgTnVtYmVyLCBEYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgYW5kIG9wdGlvbmFsbHkgdGhlIHRhYmxlIG9mIHRoZSBmaWVsZC9jb2x1bW4gdGhhdCB0aGUgYXR0cmlidXRlIGlzIHN0b3JlZCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im51bGwtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGEgdmFsdWUgdGhhdCBudWxsIGRhdGEgdmFsdWVzIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtY2xhc3NpZmljYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGF0dHJpYnV0ZSBpcyBwZXJzaXN0ZWQuIFRoZSBhdHRyaWJ1dGUgbWFwcGluZyBkZWZpbml0aW9uIGlzIGV4dGVuZGFibGUgdG8gYWxsb3cgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiAgVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgYXR0cmlidXRlIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlYWQtb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBnZXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHNldCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9wZXJ0aWVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdXNlciBkZWZpbmVkIHByb3BlcnRpZXMgdG8gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icHJvcGVydHkiIHR5cGU9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHVzZXIgZGVmaW5lZCBwcm9wZXJ0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgc2ltcGxlIGF0dHJpYnV0ZSBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIGZyb20gYW4gYXR0aXJidXRlIHRvIGEgc2ltcGxlIGZpZWxkIGRhdGF0eXBlLCBpLmUuIFN0cmluZywgTnVtYmVyLCBEYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLWNkYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXBvbGljeSIgdHlwZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBmcm9tIGFuIGF0dGlyYnV0ZSB0byBhIHNpbXBsZSBmaWVsZCBkYXRhdHlwZSwgaS5lLiBTdHJpbmcsIE51bWJlciwgRGF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBmaWVsZCB0cmFuc2Zvcm1hdGlvbiBmb3IgYSB0cmFuc2Zvcm1hdGlvbiBtYXBwaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtYmFzZWQtZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtZXItYmFzZWQtZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHRyYW5zZm9ybWF0aW9uIG1hcHBpbmcgdGhhdCB1c2VzIEphdmEgY29kZSB0byB0cmFuc2Zvcm0gYmV0d2VlbiB0aGUgZGF0YSBhbmQgb2JqZWN0IHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRyYW5zZm9ybWF0aW9uIGRlZmluZWQgaW4gdGhlIGRvbWFpbiBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS10cmFuc2Zvcm1lciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRyYW5zZm9ybWVyLiBVc2VkIGluIHBsYWNlIG9mIGF0dHJpYnV0ZS10cmFuc2Zvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQtdHJhbnNmb3JtYXRpb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCB0cmFuc2Zvcm1hdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiIgdHlwZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWdncmVnYXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHJlbGF0aW9uc2hpcCB3aGVyZSB0aGUgdGFyZ2V0IG9iamVjdCBpcyBzdHJpY3RseSBwcml2YXRlbHkgb3duZWQgYnkgdGhlIHNvdXJjZSBvYmplY3QgYW5kIHN0b3JlcyB3aXRoaW4gdGhlIHNvdXJjZSBvYmplY3RzIHJvdzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHRhcmdldCBjbGFzcyBvZiB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iYWxsb3ctbnVsbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiBhIHJvdyBvZiBhbGwgbnVsbHMgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIG51bGwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZC10cmFuc2xhdGlvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHRoZSBtYXBwaW5nIHRvIHVzZSBkaWZmZXJlbnQgZmllbGQgbmFtZXMgdGhhbiB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRyYW5zbGF0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIGluIHRoZSBzb3VyY2UgZGVzY3JpcHRvcidzIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIGluIHRoZSBhZ2dyZWdhdGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gY2xhc3NlcyBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdGFyZ2V0IGNsYXNzIG9mIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgdGFyZ2V0IG9iamVjdHMgYXJlIHByaXZhdGVseSBvd25lZCBkZXBlbmRlbnQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGNyZWF0ZSBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBjcmVhdGUgb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSByZWZyZXNoIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSByZW1vdmUgb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtb25lLXRvLW9uZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9uZS10by1vbmUtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgdGFyZ2V0IGNsYXNzJyB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0cyBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLW9uZS10by1tYW55LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzb3VyY2UtZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRhcmdldC1mb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXktZ3JvdXBpbmctZWxlbWVudCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0cyBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbGxlY3Rpb24gb2Ygc2ltcGxlIHR5cGVzIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gYSBzZXQgb2Ygc2ltcGxlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9ImRhdGEtcmVhZC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLXRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIHNvdXJjZSBwcmltYXJ5IGtleSBhbmQgdGhlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpcmVjdC1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBpbiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnNlcnQtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gaW5zZXJ0IGEgcm93IGludG8gdGhlIHJlZmVyZW5jZSB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhIHJvdyBmcm9tIHRoZSByZWZlcmVuY2UgdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcm93cyBmcm9tIHRoZSByZWZlcmVuY2UgdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlc3Npb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBzZXNzaW9uIHRoYXQgZGVmaW5lcyB0aGUgcmVmZXJlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS1wb2xpY3kiIHR5cGU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2YgdGhpcyBhdHRyaWJ1dGUgYXJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBoaXN0b3J5IHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1tYXAtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXAgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byBhIHNldCBvZiBrZXkgdmFsdWVzIHBhaXJzIG9mIHNpbXBsZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpcmVjdC1rZXktZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gaW4gdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IHNvcmVzIHRoZSBtYXAga2V5IGRhdGEgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJrZXktY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUga2V5IGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhZ2dyZWdhdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzIHdoZXJlIHRoZSB0YXJnZXQgaW5zdGFuY2VzIGFyZSBzdHJpY3RseSBwcml2YXRlbHkgb3duZWQgYnkgdGhlIHNvdXJjZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHRhcmdldCBjbGFzcycgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByZWxhdGVkIG9iamVjdHMgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tbWFueS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG0tbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGF0aW9uLXRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbiB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgc291cmNlL3RhcmdldCBwcmltYXJ5IGtleXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLXJlbGF0aW9uLWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZnJvbSB0aGUgcmVsYXRpb25hbCB0YWJsZSB0byB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtcmVsYXRpb24tZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmcm9tIHRoZSByZWxhdGlvbmFsIHRhYmxlIHRvIHRoZSB0YXJnZXQgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnNlcnQtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gaW5zZXJ0IGEgcm93IGludG8gdGhlIHJlbGF0aW9uIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGEgcm93IGZyb20gdGhlIHJlbGF0aW9uIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJvd3MgZnJvbSB0aGUgcmVsYXRpb24gdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktcG9saWN5IiB0eXBlPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIHRoaXMgYXR0cmlidXRlIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gaGlzdG9yeSBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZSB0aGF0IG1heSBiZSBvZiBzZXZlcmFsIHR5cGVzIHJlbGF0ZWQgdGhyb3VnaCBhbiBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBjb2x1bW4gdG8gc3RvcmUgdGhlIGNsYXNzIHR5cGUgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0IGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmVpZ24ta2V5LXRvLXF1ZXJ5LWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBzb3VyY2UvdGFyZ2V0IGNvbHVtbi9xdWVyeSBrZXkgcmVmZXJlbmNlcyByZWxhdGluZyBhIGZvcmVpZ24ga2V5IGluIG9uZSB0YWJsZSB0byB0aGUgcXVlcnkga2V5cyBkZWZpbmluZyBhIHByaW1hcnkgb3IgdW5pcXVlIGtleSB2YWx1ZSBpbiB0aGUgb3RoZXIgaW50ZXJmYWNlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkta2V5LXJlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcmVmZXJlbmNlIG9mIGEgc291cmNlIHRhYmxlIGZvcmVpZ24ga2V5IGFuZCBhIHRhcmdldCBpbnRlcmZhY2UgZGVzY3JpcHRvciBxdWVyeSBrZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmaWVsZC9jb2x1bW4gbmFtZSBpbiB0aGUgc291cmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1xdWVyeS1rZXkiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IGtleSBuYW1lIG9mIHRoZSB0YXJnZXQgaW50ZXJmYWNlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIiB0eXBlPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBjbGFzcyBpbmRpY2F0b3IgdmFsdWVzIGFuZCB0aGUgc3ViY2xhc3NlcyB0aGV5IG1hcCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb250YWluZXIvY29sbGVjdGlvbiB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29sbGVjdGlvbi10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzb3J0ZWQtY29sbGVjdGlvbi1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHNvcnRlZCBjb2xsZWN0aW9uIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbXBhcmF0b3ItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29tcGFyaXRvciwgdXNlZCB0byBjb21wYXJlIG9iamVjdHMgaW4gc29ydGluZyB0aGUgY29sbGVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibGlzdC1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGxpc3QgY29sbGVjdGlvbiB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAtY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXAgY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1hcC1rZXktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIHRhcmdldCBvYmplY3RzIHRvIGdldCB0aGUga2V5IHZhbHVlIGZvciB0aGUgbWFwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtbWFwLWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IG1hcCBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Nyb2xsYWJsZS1jdXJzb3ItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHNjcm9sbGFibGUgY3Vyc29yIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjdXJzb3JlZC1zdHJlYW0tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGN1cnNvcmVkIHN0cmVhbSBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5kaXJlY3Rpb24tcG9saWN5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkZWZlcnJlZCByZWFkIGluZGlyZWN0aW9uIG1lY2hhbmlzbS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbHVlLWhvbGRlci1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIHZhbHVlIGhvbGRlcnMgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3h5LWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgcHJveGllcyB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwYXJlbnQtY29sbGVjdGlvbi1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIHRyYW5zcGFyZW50IGNvbGxlY3Rpb25zIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb2xsZWN0aW9uLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiBpbnRlcmZhY2UgdG8gdXNlLCBpLmUuIExpc3QsIFNldCwgTWFwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWFwLWtleS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgdGFyZ2V0IG9iamVjdHMgdG8gZ2V0IHRoZSBrZXkgdmFsdWUgZm9yIHRoZSBtYXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnRhaW5lci1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIGEgdXNlciBkZWZpbmVkIGNvbnRhaW5lciB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbnRhaW5lciBpbXBsZW1lbnRlciB0byB1c2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1saXN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkxpc3QgY29udmVydGVyPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib2JqZWN0LWNsYXNzLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbGlzdCdzIGVsZW1lbnQgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4gCi0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGVzYWZlLWVudW1lcmF0aW9uLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlR5cGVzYWZlIEVudW1lcmF0aW9uIGNvbnZlcnNpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLWNvbnZlcnNpb24tY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBkYXRhIHR5cGUgYW5kIGFuIG9iamVjdCB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgdG8gY29udmVydCBiZXR3ZWVuLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im9iamVjdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRhdGEtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlcyBzdG9yYWdlIGRhdGEgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VyaWFsaXplZC1vYmplY3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyBvYmplY3Qgc2VyaWFsaXphdGlvbiB0byBjb252ZXJ0IGJldHdlZW4gdGhlIG9iamVjdCBhbmQgZGF0YSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGVzIHN0b3JhZ2UgZGF0YSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSBtYXBwaW5nIG9mIHZhbHVlcyBmcm9tIGRhdGFiYXNlIHZhbHVlcyB1c2VkIGluIHRoZSBmaWVsZCBhbmQgb2JqZWN0IHZhbHVlcyB1c2VkIGluIHRoZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QW4gb3B0aW9uYWwgZGVmYXVsdCB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkLiAgVGhpcyB2YWx1ZSBpcyB1c2VkIGlmIGEgZGF0YWJhc2UgdHlwZSBpcyBub3QgZm91bmQgaW4gdGhlIHR5cGUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLW1hcHBpbmdzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWFwcGluZyBvZiB2YWx1ZXMuICBCb3RoIHRoZSBvYmplY3QgYW5kIGRhdGFiYXNlIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ0eXBlLW1hcHBpbmciIHR5cGU9InR5cGUtbWFwcGluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBvYmplY3QgYW5kIGRhdGEgdmFsdWUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW9ubHktdHlwZS1tYXBwaW5ncyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSBtYXBwaW5nIG9mIGFkZGl0aW9uYWwgdmFsdWVzIHRoYXQgbWFwIG5vbi11bmlxdWUgZGF0YSB2YWx1ZXMgdG8gYSB1bmlxdWUgYXR0cmlidXRlIHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InR5cGUtbWFwcGluZyIgdHlwZT0idHlwZS1tYXBwaW5nIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIG9iamVjdCBhbmQgZGF0YSB2YWx1ZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSBhbiBvYmplY3QgYW5kIGRhdGEgdmFsdWUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIHZhbHVlIHRvIHVzZSBpbiB0aGUgb2JqZWN0J3MgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIHZhbHVlIHRvIHVzZSBpbiB0aGUgZGF0YWJhc2UgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeS9pbnRlcmFjdGlvbiBhZ2FpbnN0IGEgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJtYWludGFpbi1jYWNoZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgYnlwYXNzIHRoZSBjYWNoZSBjb21wbGV0ZWx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgdXNlIHBhcmFtYXRlciBiaW5kaW5nIGZvciBhcmd1bWVudHMsIG9yIHByaW50IHRoZSBhcmd1bWVudHMgaW4tbGluZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhY2hlLXN0YXRlbWVudCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyaWVzIHN0YXRlbWVudCBzaG91bGQgYmUgY2FjaGVkLCB0aGlzIG11c3QgYmUgdXNlZCB3aXRoIHBhcmFtZXRlciBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGltZW91dCIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgdGltZW91dCB0byBjYW5jZWwgdGhlIHF1ZXJ5IGluIGlmIHRoZSByZXF1ZXN0IHRha2VzIHRvbyBsb25nIHRvIGNvbXBsZXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0icHJlcGFyZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgcHJlcGFyZSBhbmQgY2FjaGUgaXRzIGdlbmVyYXRlZCBTUUwsIG9yIHJlZ2VuZXJhdGUgdGhlIFNRTCBvbiBlYWNoIGV4ZWN1dGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhbGwiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBzdGF0aWMgY2FsbHMgdGhlIFNRTCBvciBTdG9yZWQgUHJvY2VkdXJlIGNhbGwgZGVmaW5pdGlvbiBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBqb2luIGZldGNoIG9wdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5uZXItam9pbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im91dGVyLWpvaW4iIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYXNjYWRlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBjYXNjYWRlIHBvbGljaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InByaXZhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtcmVhZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZyBhIHNpbmdsZSB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGlyZWN0LXJlYWQtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1yZWFkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nIGEgY29sbGVjdGlvbiBvZiB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGEtcmVhZC1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YS1yZWFkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nIHJhdyBkYXRhLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWFkLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FjaGUtcXVlcnktcmVzdWx0cyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgY2FjaGUgdGhlIHF1ZXJ5IHJlc3VsdHMgdG8gYXZvaWQgZnV0dXJlIGV4ZWN1dGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYXgtcm93cyIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIGZldGNoLCByZXN1bHRzIHdpbGwgYmUgdHJ1bmN0YXRlIG9uIHRoZSBkYXRhYmFzZSB0byB0aGlzIHNpemUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaXJzdC1yZXN1bHQiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB3aGVyZSB0byBzdGFydCB0aGUgY3Vyc29yIGluIGEgcmVzdWx0IHNldCByZXR1cm5lZCBmcm9tIHRoZSBkYXRhYmFzZS4gUmVzdWx0cyBwcmlvciB0byB0aGlzIG51bWJlciB3aWxsIG5vdCBiZSBidWlsdCBpbnRvIG9iamVjdHM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllc3MgdGhlIG51bWJlciBvZiByb3dzIHRvIGZldGNoIGZyb20gdGhlIGRhdGFiYXNlIG9uIGVhY2ggcmVzdWx0IHNldCBuZXh0IG9wZXJhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJ5LXJlc3VsdC1jYWNoZS1wb2xpY3kiIHR5cGU9InF1ZXJ5LXJlc3VsdC1jYWNoZS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHF1ZXJ5IHJlc3VsdHMgc2hvdWxkIGJlIGNhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktcmVzdWx0LWNhY2hlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgcXVlcnkncyByZXN1bHRzIHNob3VsZCBiZSBjYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnZhbGlkYXRpb24tcG9saWN5IiB0eXBlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMTAwIiBuYW1lPSJtYXhpbXVtLWNhY2hlZC1yZXN1bHRzIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBkZWZpbmVzIHRoZSBudW1iZXIgb2YgcXVlcnkgcmVzdWx0IHNldHMgdGhhdCB3aWxsIGJlIGNhY2hlZC4gVGhlIExSVSBxdWVyeSByZXN1bHRzIHdpbGwgYmUgZGlzY2FyZGVkIHdoZW4gdGhlIG1heCBzaXplIGlzIHJlYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBtYW5pcHVsYXRpbmcgZGF0YS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1tb2RpZnktcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBtb2RpZnlpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXBkYXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgdXBkYXRpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnNlcnQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBpbnNlcnRpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWxldGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBkZWxldGluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1tb2RpZnktcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRvZXMtZXhpc3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGRldGVybWluaW5nIGlmIGFuIG9iamVjdCBleGlzdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJleGlzdGVuY2UtY2hlY2siIHR5cGU9ImV4aXN0ZW5jZS1jaGVjayI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZXhpc3RlbmNlIGNoZWNrIG9wdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJleGlzdGVuY2UtY2hlY2siPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgZXhpc3RlbmNlIGNoZWNrIG9wdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1jYWNoZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWRhdGFiYXNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLWV4aXN0ZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1ub24tZXhpc3RlbmNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGRlbGV0aW5nIGEgY3JpdGVyaWEgb2Ygb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1sZXZlbC1yZWFkLXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3Igb2JqZWN0cyAoYXMgYXBwb3NlZCB0byBkYXRhKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVhZC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxsIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyBvZiBvYmplY3RzIGJlaW5nIHF1ZXJpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIHJlZnJlc2ggYW55IGNhY2hlZCBvYmplY3RzIGZyb20gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlbW90ZS1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgcmVmcmVzaCBhbnkgcmVtb3RlbHkgY2FjaGVkIG9iamVjdHMgZnJvbSB0aGUgc2VydmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iY2FzY2FkZS1wb2xpY3kiIHR5cGU9ImNhc2NhZGUtcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcmllcyBzZXR0aW5ncyAoc3VjaCBhcyByZWZyZXNoLCBtYWludGFpbi1jYWNoZSkgc2hvdWxkIGFwcGx5IHRvIHRoZSBvYmplY3QncyByZWxhdGlvbnNoaXAgcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InByaW1hcnkta2V5IiBuYW1lPSJjYWNoZS11c2FnZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgcXVlcnkgc2hvdWxkIGludGVyYWN0IHdpdGggdGhlIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0ibG9jay1tb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCBsb2NrIHRoZSByZXN1bHRpbmcgcm93cyBvbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJkaXN0aW5jdC1zdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgZmlsdGVyIGRpc3RpbmN0IHJlc3VsdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbi1tZW1vcnktcXVlcnlpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluIG1lbW9yeSBxdWVyeWluZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBkZWZhdWx0PSJpZ25vcmUtZXhjZXB0aW9ucy1yZXR1cm4tY29uZm9ybWVkIiBuYW1lPSJwb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgaW5kaXJlY3Rpb24gb3IgdW5jb25mb3JtYWJsZSBleHByZXNzaW9ucyBzaG91bGQgYmUgdHJlYXRpbmcgd2l0aCBpbi1tZW1vcnkgcXVlcnlpbmcgYW5kIGNvbmZvcm1pbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InVzZS1kZWZhdWx0LWZldGNoLWdyb3VwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBkZWZhdWx0IGZldGNoIGdyb3VwIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1ncm91cCIgdHlwZT0iZmV0Y2gtZ3JvdXAiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIHF1ZXJ5IHRvIHBhcnRpYWxseSBmZXRjaCB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtZ3JvdXAtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGEgcHJlLWRlZmluZWQgbmFtZWQgZmV0Y2ggZ3JvdXAgdG8gYWxsb3cgdGhlIHF1ZXJ5IHRvIHBhcnRpYWxseSBmZXRjaCB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS1leGNsdXNpdmUtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgZXhjbHVzaXZlIGNvbm5lY3Rpb24gKFZQRCkgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImpvaW5lZC1hdHRyaWJ1dGUtZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBhdHRyaWJ1dGVzIGJlaW5nIGpvaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBqb2luaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgb2JqZWN0cyByZXN1bHRpbmcgZnJvbSB0aGUgcXVlcnkgYXJlIHJlYWQtb25seSwgYW5kIHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQgaW4gdGhlIHVuaXQgb2Ygd29yay48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJvdXRlci1qb2luLXN1YmNsYXNzZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBpbmhlcml0YW5jZSBxdWVyaWVzIHNwZWNpZnkgaWYgYWxsIHN1YmNsYXNzZXMgc2hvdWxkIGJlIG91dGVyIGpvaW5lZCwgaW5zdGVhZCBvZiBhIHF1ZXJ5IHBlciBzdWJjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1hbGwtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGEgc2V0IG9mIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1sZXZlbC1yZWFkLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJhdGNoLXJlYWQtYXR0cmlidXRlLWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhbGwgYXR0cmlidXRlcyBmb3IgYmF0Y2ggcmVhZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBiYXRjaCByZWFkaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im9yZGVyLWJ5LWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNldHMgdGhlIG9yZGVyIGV4cHJlc3Npb25zIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3Igb3JkZXJpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgYSBzaW5nbGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbGV2ZWwtcmVhZC1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVwb3J0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+UXVlcnkgZm9yIGluZm9ybWF0aW9uIGFib3V0IGEgc2V0IG9mIG9iamVjdHMgaW5zdGVhZCBvZiB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuLWNob2ljZSIgdHlwZT0icmV0dXJuLWNob2ljZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TaW1wbGlmaWVzIHRoZSByZXN1bHQgYnkgb25seSByZXR1cm5pbmcgdGhlIGZpcnN0IHJlc3VsdCwgZmlyc3QgdmFsdWUsIG9yIGFsbCBhdHRyaWJ1dGUgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0cmlldmUtcHJpbWFyeS1rZXlzIiB0eXBlPSJyZXRyaWV2ZS1wcmltYXJ5LWtleXMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdldGhlciB0aGUgcHJpbWFyeSBrZXkgdmFsdWVzIHNob3VsZCBhbHNvIGJlIHJldHJpZXZlZCBmb3IgdGhlIHJlZmVyZW5jZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlcG9ydC1pdGVtcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JdGVtcyB0byBiZSBzZWxlY3RlZCwgdGhlc2UgY291bGQgYmUgYXR0cmlidXRlcyBvciBhZ2dyZWdhdGUgZnVuY3Rpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaXRlbSIgdHlwZT0icmVwb3J0LWl0ZW0iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBpdGVtIHJlcXVlc3RlZDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJncm91cC1ieS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXRzIEdST1VQIEJZIGV4cHJlc3Npb25zIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3IgZ3JvdXBpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJldHVybi1jaG9pY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TaW1wbGlmaWVzIHRoZSByZXN1bHQgYnkgb25seSByZXR1cm5pbmcgdGhlIGZpcnN0IHJlc3VsdCwgZmlyc3QgdmFsdWUsIG9yIGFsbCBhdHRyaWJ1dGUgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmV0dXJuLXNpbmdsZS1yZXN1bHQiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXR1cm4tc2luZ2xlLXZhbHVlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmV0dXJuLXNpbmdsZS1hdHRyaWJ1dGUiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJyZXRyaWV2ZS1wcmltYXJ5LWtleXMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2V0aGVyIHRoZSBwcmltYXJ5IGtleSB2YWx1ZXMgc2hvdWxkIGFsc28gYmUgcmV0cmlldmVkIGZvciB0aGUgcmVmZXJlbmNlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZnVsbC1wcmltYXJ5LWtleSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpcnN0LXByaW1hcnkta2V5IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8tcHJpbWFyeS1rZXkiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVwb3J0LWl0ZW0iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGl0ZW0gcmVxdWVzdGVkIGluIFJlcG9ydFF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk5hbWUgZ2l2ZW4gZm9yIGl0ZW0sIGNhbiBiZSB1c2VkIHRvIHJldGlldmUgdmFsdWUgZnJvbSByZXN1bHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4cHJlc3Npb24gKHBhcnRpYWwpIHRoYXQgZGVzY3JpYmVzIHRoZSBhdHRyaWJ1dGUgd2FudGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJleHByZXNzaW9uIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmaWx0ZXIgZXhwcmVzc2lvbiB0cmVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb24tZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSByZWxhdGlvbiBleHByZXNzaW9uIHRoYXQgY29tcGFyZXMgdG8gZXhwcmVzc2lvbnMgdGhyb3VnaCBvcGVyYXRvcnMgc3VjaCBhcyBlcXVhbCwgbGVzc1RoYW4sIGV0Yy4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsZWZ0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyaWdodCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJvcGVyYXRvciIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naWMtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBleHByZXNzaW9uIGNvbXBvc2VkIG9mIHR3byBzdWItZXhwcmVzc2lvbnMgam9pbmVkIHRocm91Z2ggYW4gb3BlcmF0b3Igc3VjaCBhcyBBTkQsIE9SLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGVmdCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmlnaHQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdHlwZT0ib3BlcmF0b3IiIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZ1bmN0aW9uLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZXhwcmVzc2lvbiBjb21wb3NlZCBvZiBhIGZ1bmN0aW9uIGFwcGxpZWQgdG8gYSBsaXN0IG9mIHN1Yi1leHByZXNzaW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGZ1bmN0aW9uIGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgZXhwcmVzc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmdW5jdGlvbiIgdHlwZT0ib3BlcmF0b3IiIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnN0YW50LWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gdmFsdWUuICBJZiB0aGUgdmFsdWUgaXMgbnVsbCB0aGUgdmFsdWUgdGFnIGNhbiBpcyBhYnNlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWtleS1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIHF1ZXJ5LWtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2UiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbnktb2YiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvdXRlci1qb2luIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzZSIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcmFtZXRlci1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIHBhcmFtZXRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlciIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNlLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gYnVpbGRlci9iYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9wZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIG9wZXJhdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBTUUwgcXVlcnkgbGFuZ3VhZ2Ugc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbCBTUUwgcXVlcnkgc3RyaW5nLiAgQXJndW1lbnRzIGNhbiBiZSBzcGVjaWZpZWQgdGhyb3VnaCAjYXJnLW5hbWUgdG9rZW5zIGluIHRoZSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYnFsLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIEVKQi1RTCBxdWVyeSBsYW5ndWFnZSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpicWwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEVKQi1RTCBxdWVyeSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1wcm9jZWR1cmUtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGludm9jYXRpb24gZGVmaW5pdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImN1cnNvci1vdXRwdXQtcHJvY2VkdXJlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIGNhbGwgdG8gdXNlIGEgY3Vyc29yIG91dHB1dCBwYXJhbWV0ZXIgdG8gZGVmaW5lIHRoZSByZXN1bHQgc2V0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFuZCBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9InByb2NlZHVyZS1hcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9jZWR1cmUuIFRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnRzIG11c3QgbWF0Y2ggdGhlIHByb2NlZHVyZSBhcmd1bWVudHMgaWYgbm90IG5hbWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1mdW5jdGlvbi1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBmdW5jdGlvbiBpbnZvY2F0aW9uIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InN0b3JlZC1wcm9jZWR1cmUtY2FsbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMSIgbmFtZT0ic3RvcmVkLWZ1bmN0aW9uLXJlc3VsdCIgdHlwZT0icHJvY2VkdXJlLW91dHB1dC1hcmd1bWVudCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBzdG9yZWQtZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHN0b3JlZCBwcm9jZWR1cmUgbmFtZSBvZiB0aGUgYXJndW1lbnQuIEZvciBpbmRleGVkIGFyZ3VtZW50IHRoZSBuYW1lIGlzIG5vdCByZXF1aXJlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBuYW1lIG9mIHRoZSBhcmd1bWVudC4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYXMgZGVmaW5lIGluIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGNsYXNzIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtc3FsdHlwZSIgdHlwZT0ieHNkOmludCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpEQkMgaW50IHR5cGUgb2YgdGhlIGFyZ3VtZW50LCBhcyBkZWZpbmVkIGluIGphdmEuamRiYy5UeXBlczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LXNxbHR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHR5cGUgaWYgcHJvY2VkdXJlLWFyZ3VtZW50LXNxbHR5cGUgaXMgU1RSVUNUIG9yIEFSUkFZPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcm9jZWR1cmUgYXJndW1lbnQgdmFsdWUgbWF5YmUgYmUgc3BlY2lmaWVkIGlmIG5vdCB1c2luZyBhIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9jZWR1cmUtb3V0cHV0LWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgY2FsbCBvdXRwdXQgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InByb2NlZHVyZS1hcmd1bWVudCIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvY2VkdXJlLWlub3V0cHV0LWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgY2FsbCBvdXRwdXQgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InByb2NlZHVyZS1hcmd1bWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im91dHB1dC1hcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBuYW1lIG9mIHRoZSBhcmd1bWVudC4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYXMgZGVmaW5lIGluIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtc3RvcmVkLXByb2NlZHVyZS1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgaW52b2NhdGlvbiBkZWZpbml0aW9uIHdob3NlIGFyZ3VtZW50cyBjb250YWluIGF0IGxlYXN0IG9uZSBPcmFjbGUgUEwvU1FMIHR5cGUgdGhhdCBoYXMgbm8gSkRCQyByZXByZXNlbnRhdGlvbiAoZS5nLiBCT09MRUFOLCBQTFNfSU5URUdFUiwgUEwvU1FMIHJlY29yZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvY2VkdXJlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYW5kIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCB0byB0aGUgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kZXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpkYmMtdHlwZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC10eXBlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtcmVjb3JkIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb21wYXRpYmxlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iamF2YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBmaWVsZHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCB0byB0aGUgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLWNvbGxlY3Rpb24iPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbXBhdGlibGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJqYXZhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmVzdGVkLXR5cGUiIHR5cGU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGFuIEVJUyByZWNvcmQgZGF0YSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGF0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSByZWNvcmQgc3RydWN0dXJlIG5hbWUgdGhlIGRlc2NyaXB0b3IgbWFwcyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWVzcGFjZS1yZXNvbHZlciIgdHlwZT0ibmFtZXNwYWNlLXJlc29sdmVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lc3BhY2UgcmVzb2x2ZXIgZm9yIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXBwZWQtaW50ZXJhY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIEVJUyBpbnRlcmFjdGlvbiB1dGlsaXppbmcgTWFwcGVkUmVjb3JkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIGlucHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBvdXRwdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtaW50ZXJhY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIEVJUyBpbnRlcmFjdGlvbiB1dGlsaXppbmcgWE1MIHJlY29yZHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yZWNvcmQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSB0byB1c2UgZm9yIHRoZSBpbnB1dCByZWNvcmQsIGlmIHJlcXVpcmVkIGJ5IHRoZSBhZGFwdGVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcm9vdC1lbGVtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIG91dHB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBpbnB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgb3V0cHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5kZXhlZC1pbnRlcmFjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUlTIGludGVyYWN0aW9uIHV0aWxpemluZyBJbmRleGVkIHJlY29yZHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmFjdGlvbi1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gaW50ZXJhY3Rpb24gYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcm9jZWR1cmUgYXJndW1lbnQgdmFsdWUgbWF5YmUgYmUgc3BlY2lmaWVkIGlmIG5vdCB1c2luZyBhIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGludGVyYWN0aW9uIG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBGb3IgaW5kZXhlZCBhcmd1bWVudHMgdGhlIG5hbWUgaXMgbm90IHJlcXVpcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBuYW1lIG9mIHRoZSBhcmd1bWVuLiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBhcyBkZWZpbmUgaW4gdGhlIHF1ZXJ5LCBvciB0aGUgZGVzY3JpcHRvciBmaWVsZCBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXJlbGF0aW9uYWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYSBTdHJ1Y3R1cmUgdHlwZSBpbiBhbiBvYmplY3QtcmVsYXRpb25hbCBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25hbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgb2JqZWN0IHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQtb3JkZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG9yZGVyZWQgbGlzdCBvZiB0aGUgZmllbGQgZGVmaW5lZCBpbiB0aGUgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmVzdGVkLXRhYmxlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tL20tbSByZWxhdGlvbnNoaXAgdGhhdCBtYWtlcyB1c2Ugb2YgdGhlIG9iamVjdC1yZWxhdGlvbmFsIG5lc3RlZC10YWJsZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGluIHRoZSBzb3VyY2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIG5lc3RlZC10YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3R1cmUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgdHlwZSBuYW1lIG9mIHRoZSBuZXN0ZWQtdGFibGUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXJyYXktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIHByaW1pdGl2ZS9zaW1wbGUgdHlwZSB2YWx1ZXMgdXNpbmcgdGhlIG9iamVjdC1yZWxhdGlvbmFsIGFycmF5IHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzdHJ1Y3R1cmUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgdHlwZSBuYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LWFycmF5LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBvYmplY3QtdHlwZXMgdXNpbmcgdGhlIG9iamVjdC1yZWxhdGlvbmFsIGFycmF5IHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3R1cmUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgdHlwZSBuYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0dXJlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RydWN0dXJlIG9mIG9iamVjdC10eXBlcyB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVmZXJlbmNlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgb2JqZWN0LXR5cGUgdXNpbmcgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHJlZmVyZW5jZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgaW4gdGhlIHNvdXJjZSB0eXBlIHRoYXQgc3RvcmVzIHRoZSByZWZlcmVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1yZWxhdGlvbmFsLWZpZWxkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBPYmplY3RSZWxhdGlvbmFsRGF0YWJhc2VGaWVsZDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmVzdGVkLXR5cGUtZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LXhtbC10eXBlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IG1hcHBpbmcgdG8gYW4gT3JhY2xlIFhEQiBYTUwgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGlyZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlYWQtd2hvbGUtZG9jdW1lbnQiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUtY29udmVydGVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBhIHVzZXIgZGVmaW5lZCBjb252ZXJ0ZXIgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbGxlY3Rpb24tcmVmZXJlbmNlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1NIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgWE1MIGVsZW1lbnQgdG8gdGhlIHRhcmdldCBYTUwgZWxlbWVudCBiYXNlZCBvbiBhIGtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieG1sLW9iamVjdC1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVycG9saWN5IiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlcy1zaW5nbGUtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1vYmplY3QtcmVmZXJlbmNlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgWE1MIGVsZW1lbnQgdG8gdGhlIHRhcmdldCBYTUwgZWxlbWVudCBiYXNlZCBvbiBvbmUgb3IgbW9yZSBrZXlzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhZ2dyZWdhdGUtb2JqZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS10by10YXJnZXQta2V5LWZpZWxkLWFzc29jaWF0aW9uIiB0eXBlPSJmb3JlaWduLWtleSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzb3VyY2UtdG8tdGFyZ2V0LWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1jZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1wb2xpY3kiIHR5cGU9ImFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBuZXN0ZWQgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItYXR0cmlidXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWdldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItc2V0LW1ldGhvZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBuZXN0ZWQgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgb2JqZWN0IG1hcHBpbmcgZm9yIGFuIFhNTCBuZXN0ZWQgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1nZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItc2V0LW1ldGhvZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcG9saWN5IiB0eXBlPSJhYnN0cmFjdC1udWxsLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJrZWVwLWFzLWVsZW1lbnQtcG9saWN5IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgb2JqZWN0IG1hcHBpbmcgZm9yIGFuIFhNTCBuZXN0ZWQgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYW4gWE1MIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImRlZmF1bHQtcm9vdC1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRoZSBkZXNjcmlwdG9yIG1hcHMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LXJvb3QtZWxlbWVudC1maWVsZCIgdHlwZT0ibm9kZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgWE1MRmllbGQgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHJvb3QgZWxlbWVudCBvZiB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNob3VsZC1wcmVzZXJ2ZS1kb2N1bWVudCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIGlmIG5vZGVzIHNob3VsZCBiZSBjYWNoZWQgdG8gcHJlc2VydmUgdW5tYXBwZWQgZGF0YTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZXNwYWNlLXJlc29sdmVyIiB0eXBlPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWVzcGFjZSByZXNvbHZlciBmb3IgdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzY2hlbWEiIHR5cGU9InNjaGVtYS1yZWZlcmVuY2UiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxvY2F0aW9uIG9mIHRoZSBYTUwgU2NoZW1hLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlc3VsdC1hbHdheXMteG1sLXJvb3QiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFueS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYW4geHM6YW55IGRlY2xhcmF0aW9uIG9yIHhzOmFueVR5cGUgZWxlbWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLXhtbC1yb290IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJrZWVwLWFzLWVsZW1lbnQtcG9saWN5IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LWF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGFuIHhzOmFueSBkZWNsYXJhdGlvbiBvciB4czphbnlUeXBlIGVsZW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5jbHVkZS1uYW1lc3BhY2UtZGVjbGFyYXRpb24iIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluY2x1ZGUtc2NoZW1hLWluc3RhbmNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFueS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgc2luZ2xlIG9iamVjdCB0byBhbiB4czphbnkgZGVjbGFyYXRpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLXhtbC1yb290IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJrZWVwLWFzLWVsZW1lbnQtcG9saWN5IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWZyYWdtZW50LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIHNpbmdsZSBOb2RlIHRvIGEgZnJhZ21lbnQgb2YgYW4gWE1MIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1mcmFnbWVudC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gb2YgTm9kZXMgdG8gYSBmcmFnbWVudCBvZiBhbiBYTUwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWJpbmFyeS1kYXRhLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGJpbmFyeSBvYmplY3QgdG8gYmFzZTY0IGJpbmFyeTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtZGlyZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLXN3YS1yZWYiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1pbWUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaG91bGQtaW5saW5lLWRhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluYXJ5LWRhdGEtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBiaW5hcnkgb2JqZWN0IHRvIGJhc2U2NCBiaW5hcnk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieG1sLWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1zd2EtcmVmIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtaW1lLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2hvdWxkLWlubGluZS1kYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jaG9pY2UtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGEgY2hvaWNlIHN0cnVjdHVyZSBpbiBhbiB4bWwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItcG9saWN5IiB0eXBlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIHR5cGU9InhtbC1jaG9pY2UtZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jaG9pY2Utb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYSBjaG9pY2Ugc3RydWN0dXJlIGluIGFuIHhtbCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgdHlwZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jaG9pY2UtZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLWZpZWxkIiB0eXBlPSJub2RlIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb252ZXJzaW9uLXBhaXIiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9kZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gWFBhdGggZXhwcmVzc2lvbiB0byBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSBpbiBhbiBYTUwgZG9jdW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3NpdGlvbiIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlIGluIHRoZSBwYXJlbnQgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGVkLXRleHQtZmllbGQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoaXMgaXMgYSB0eXBlZCB0ZXh0IGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2luZ2xlLW5vZGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyBpZiBlYWNoIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24gaXMgaW4gdGhlIHNhbWUgbm9kZSBpbnN0ZWFkIG9mIGhhdmluZyBvbmUgbm9kZSBwZXIgaXRlbSBpbiB0aGUgY29sbGVjdGlvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InNjaGVtYS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzY2hlbWEgdHlwZSBvZiB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ4bWwtdG8tamF2YS1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImphdmEtdG8teG1sLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsZWFmLWVsZW1lbnQtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgdGhlIGVsZW1lbnRzIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzLXJlcXVpcmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlvbi1ub2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlIHRvIHJlcHJlc2VudCBub2RlcyB3aGljaCBhcmUgbWFwcGVkIHRvIHVuaW9uczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZWQtdGV4dC1maWVsZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhpcyBpcyBhIHR5cGVkIHRleHQgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaW5nbGUtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIGlmIGVhY2ggaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBpcyBpbiB0aGUgc2FtZSBub2RlIGluc3RlYWQgb2YgaGF2aW5nIG9uZSBub2RlIHBlciBpdGVtIGluIHRoZSBjb2xsZWN0aW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic2NoZW1hLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNjaGVtYSB0eXBlIG9mIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InhtbC10by1qYXZhLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iamF2YS10by14bWwtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZXNwYWNlLXJlc29sdmVyIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJuYW1lc3BhY2VzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ibmFtZXNwYWNlIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHQtbmFtZXNwYWNlLXVyaSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZXNwYWNlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lc3BhY2UtdXJpIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtcmVmZXJlbmNlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVzb3VyY2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hLWNvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9kZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtY2xhc3MtcGF0aC1yZWZlcmVuY2UiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNjaGVtYS1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1maWxlLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLXVybC1yZWZlcmVuY2UiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNjaGVtYS1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS1jaGFyYWN0ZXIiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtdGltZXN0YW1wIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkYXRlVGltZSIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtdXRpbC1kYXRlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkYXRlVGltZSIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXAtcG9saWN5Ij4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGVzc2ltaXN0aWMtbG9ja2luZyIgdHlwZT0icGVzc2ltaXN0aWMtbG9ja2luZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY21wIGJlYW4tbGV2ZWwgcGVzc2ltaXN0aWMgbG9ja2luZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZlci11bnRpbC1jb21taXQiIHR5cGU9ImRlZmVyLXVudGlsLWNvbW1pdCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBtb2RpZmljYXRpb24gZGVmZXJyYWwgbGV2ZWwgZm9yIG5vbi1kZWZlcnJlZCB3cml0ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJub24tZGVmZXJyZWQtY3JlYXRlLXRpbWUiIHR5cGU9Im5vbi1kZWZlcnJlZC1jcmVhdGUtdGltZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBwb2ludCBhdCB3aGljaCBpbnNlcnQgd2lsbCBiZSBpc3N1ZWQgdG8gRGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlc3NpbWlzdGljLWxvY2tpbmciPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ3YWl0IiBuYW1lPSJsb2NraW5nLW1vZGUiIHR5cGU9ImxvY2tpbmctbW9kZSIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkZWZlci11bnRpbC1jb21taXQiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwtbW9kaWZpY2F0aW9ucyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVwZGF0ZS1tb2RpZmljYXRpb25zIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im5vbi1kZWZlcnJlZC1jcmVhdGUtdGltZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFmdGVyLWVqYmNyZWF0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFmdGVyLWVqYnBvc3RjcmVhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmRlZmluZWQiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2NraW5nLW1vZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Ib2xkcyB0aGUgcGVzc2ltaXN0aWMgbG9ja2luZyBtb2RlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2FpdCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vLXdhaXQiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIiIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSI1MCIgbmFtZT0icHJlYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2UgcHJlYWxsb2NhdGlvbiBzaXplLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVmZXJlbmNlcyBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgb3ZlcnJpZGluZyBpdHMgbmFtZSBhbmQgKG9wdGlvbmFsbHkpIHByZWFsbG9jYXRpb24gc2l6ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRvIHVzZSBwcmVhbGxvY2F0aW9uIHNpemUgb2YgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsIHNldCBwcmVhbGxvY2F0aW9uIHNpemUgdG8gMDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmF0aXZlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGF0YWJhc2Ugc2VxdWVuY2UgbWVjaGFuaXNtIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRhYmxlIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFVRU5DRSIgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9OQU1FIiBuYW1lPSJuYW1lLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZSBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfQ09VTlQiIG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5hcnktdGFibGUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5VbmFyeSB0YWJsZSBzZXF1ZW5jZSAtIHNlcXVlbmNlIG5hbWUgaXMgYSB0YWJsZSBuYW1lLCB0YWJsZSBoYXMgYSBzaW5nbGUgZmllbGQgYW5kIGEgc2luZ2xlIHJvdzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRVUVOQ0UiIG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sZmlsZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbGZpbGUgc2VxdWVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWwgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUVVFTkNFIiBuYW1lPSJyb290LWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9OQU1FIiBuYW1lPSJuYW1lLWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbmFtZT0iY291bnRlci1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlciBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZldGNoLWdyb3VwcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIGFsbCBwcmUtZGVmaW5lZCBmZXRjaCBncm91cHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LWZldGNoLWdyb3VwIiB0eXBlPSJmZXRjaC1ncm91cCIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmZXRjaC1ncm91cCIgdHlwZT0iZmV0Y2gtZ3JvdXAiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZldGNoLWdyb3VwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgdGhlIGZldGNoIGdyb3VwIGF0dHJpYnV0ZXMgaW5mby48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmV0Y2gtZ3JvdXAtYXR0cmlidXRlcyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIGEgZmV0Y2ggZ3JvdXAncyBhdHRyaWJ1dGUgbGlzdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmZXRjaC1ncm91cC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBmb3IgdGhpcyBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVmZXJyZWQtZGV0ZWN0aW9uLWNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzIGJhY2t1cCBjbG9uZSB0byBkZXRlY3QgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2hhbmdlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LWxldmVsLWNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzICJtYXJrIGRpcnR5IiB0byBkZXRlY3QgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2hhbmdlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLWxldmVsLWNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzIGEgQ2hhbmdlVHJhY2tlciBmaXJpbmcgUHJvcGVydHlDaGFuZ2VFdmVudCdzIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIE51bGwgUG9saWN5IGluIHVzZSBmb3IgdGhpcyByZWxhdGlvbnNoaXAgY3VycmVudGx5IGEgY2hvaWNlIG9mIFtOdWxsUG9saWN5IGFuZCBJc1NldE51bGxQb2xpY3ldLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InhzaS1uaWwtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJlbXB0eS1ub2RlLXJlcHJlc2VudHMtbnVsbCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXJlcHJlc2VudGF0aW9uLWZvci14bWwiIHR5cGU9Im1hcnNoYWwtbnVsbC1yZXByZXNlbnRhdGlvbiIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibnVsbC1wb2xpY3kiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJpcy1zZXQtcGVyZm9ybWVkLWZvci1hYnNlbnQtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpcy1zZXQtbnVsbC1wb2xpY3kiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1zZXQtbWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImlzLXNldC1wYXJhbWV0ZXItdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaXMtc2V0LXBhcmFtZXRlciIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+V3JpdGUgbnVsbCwgbm8gdGFnKGRlZmF1bHQpIG9yIGFuIGVtcHR5IHRhZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhTSV9OSUwiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQlNFTlRfTk9ERSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVNUFRZX05PREUiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZ2VuZXJpYyBmaWVsZCBjb25jZXB0LCBzdWNoIGFzIGEgZGF0YWJhc2UgY29sdW1uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2x1bW4gaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGNvbHVtbidzIHRhYmxlLiBUaGlzIHRhYmxlIG11c3QgYmUgbGlzdGVkIGluIHRoZSBjbGFzcycgdGFibGVzLiBJZiBub3Qgc3BlY2lmaWVkIHRoZSBmaXJzdCB0YWJsZSBvZiB0aGUgY2xhc3Mgd2lsbCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzcWwtdHlwZWNvZGUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+KG9wdGlvbmFsIGZpZWxkKSBUaGUgSkRCQyB0eXBlY29kZSBvZiB0aGlzIGNvbHVtbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPihvcHRpb25hbCBmaWVsZCkgTmFtZSBvZiB0aGUgSkRCQyB0eXBlY29kZSBmb3IgdGhpcyBjb2x1bW48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZm9yZWlnbi1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBzb3VyY2UvdGFyZ2V0IGZpZWxkL2NvbHVtbiByZWZlcmVuY2VzIHJlbGF0aW5nIGEgZm9yZWlnbiBrZXkgaW4gb25lIHRhYmxlIHRvIHRoZSBwcmltYXJ5IG9yIHVuaXF1ZSBrZXkgaW4gYW5vdGhlciB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtcmVmZXJlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcmVmZXJlbmNlIG9mIGEgc291cmNlIHRhYmxlIGZvcmVpZ24ga2V5IGFuZCBhIHRhcmdldCB0YWJsZSBwcmltYXJ5IGtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZpZWxkL2NvbHVtbiBuYW1lIGluIHRoZSBzb3VyY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByaW1hcnkgb3IgdW5pcXVlIGtleSBmaWVsZC9jb2x1bW4gbmFtZSBpbiB0aGUgdGFyZ2V0IHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IHNwZWNpZmljYXRpb24gZm9yIHF1ZXJ5aW5nIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgb2YgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBxdWVyeSBhcmd1bWVudHMuIFRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnQgbXVzdCBtYXRjaCB0aGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50IHZhbHVlIHBhc3NlZCB0byB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJxdWVyeS1hcmd1bWVudCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcXVlcnkuICBUaGlzIG5hbWUgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIGFuZCBleGVjdXRlIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNyaXRlcmlhIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZmlsdGVyaW5nIGNsYXVzZSBvZiBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIHR5cGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgbWF5IGJlIHByb3ZpZGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCBjb25zdGFudCB2YWx1ZSBmb3IgdGhlIGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvcGVydHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHVzZXIgZGVmaW5lZCBwcm9wZXJ0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmFueVR5cGUiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiB0YWJsZXMgdGhhdCB0aGUgY2xhc3MgaXMgcGVyc2lzdGVkIHRvLiAgVGhpcyBpcyB0eXBpY2FsbHkgYSBzaW5nbGUgdGFibGUgYnV0IGNhbiBiZSBtdWx0aXBsZSwgb3IgZW1wdHkgZm9yIGluaGVyaXRhbmNlIG9yIGFnZ3JlZ2F0ZWQgY2xhc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgdGFibGUuICBUaGUgbmFtZSBjYW4gYmUgZnVsbHkgcXVhbGlmaWVkIHdpdGggdGhlIHNjaGVtYSwgdGFibGVzcGFjZSBvciBsaW5rLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIFNwZWNpZmllcyBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUKLSAgICAgICAgb2JqZWN0IHZhbHVlLgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSIKLSAgICAgICAgICAgIHR5cGU9Im5vZGUtb3JkZXJpbmctcG9saWN5IiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUKLSAgICAgICAgbmFtZT0iZGVzY3JpcHRvci1sZXZlbC1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWJpbmRlci1wb2xpY3kiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwZW5kLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imlnbm9yZS1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGl2ZS1wb3NpdGlvbi1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMC54c2QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MzFhZjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uIAotIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gZnJvbSBPcmFjbGUgVG9wTGluawotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4KLTwhLS0gCi0KLVhNTCBTY2hlbWEgZGVmaW5pdGlvbiBmb3IgdGhlIEVjbGlwc2UgUGVyc2lzdGVuY2UgU2VydmljZXMgUHJvamVjdCBTZXNzaW9uIENvbmZpZ3VyYXRpb24gZmlsZS4gSW5zdGFuY2VzCi1vZiB0aGlzIGZpbGUgYXJlIHR5cGljYWxseSBsb2NhdGVkIGFzOiAnTUVUQS1JTkYvc2Vzc2lvbnMueG1sJwotCi0gLS0+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHZlcnNpb249IjEuMCI+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb25zIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHJvb3QgZWxlbWVudCBhbmQgZXhpc3RzIG9ubHkgZm9yIFhNTAotICAgICAgICAgICAgICAgIHN0cnVjdHVyZQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24iIHR5cGU9InNlc3Npb24iIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgbm9kZSBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIGEgcGFydGljdWxhciBzZXNzaW9uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJpYyBlbGVtZW50IHVzZWQgdG8gZGVzY3JpYmUgYSBzdHJpbmcgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyB0aGUgbmFtZSBvZiBhbiBpdGVtCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmVyLXBsYXRmb3JtIiB0eXBlPSJzZXJ2ZXItcGxhdGZvcm0iCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlLWNvbW1hbmQiPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIGVsZW1lbnQgdGhhdCBkZWZpbmUgdGhlIFJlbW90ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQgTW9kdWxlIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZSBzeW5jaHJvbml6YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFubmVsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBkZWZhdWx0PSJFY2xpcHNlTGlua0NvbW1hbmRDaGFubmVsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21tYW5kcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgcmVtb3RlLWNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZXRlcm1pbmUgd2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZmVhdHVyZXMsIHRoZSBSQ00KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLXN5bmMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGVsZW1lbnQuIEl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybnMgb24gY2FjaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6YXRpb24gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvdyBzZW5kaW5nIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZyBjYWNoZSBzeW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InRyYW5zcG9ydC1tYW5hZ2VyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRlZmluZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZiB0aGUgUkNNLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBSTUkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb2ZpbGVyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHJlcHJlc2VudHMgaWYgdGhlIHByb2ZpbGVyIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYnkgdGhlIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRtcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVjbGlwc2VsaW5rIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24taGFuZGxlci1jbGFzcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgY2xhc3MgdGhhdCB0aGUgc2Vzc2lvbiB3aWxsIHVzZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlIGV4Y2VwdGlvbnMgZ2VuZXJhdGVkIGZyb20gd2l0aGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmciIHR5cGU9ImxvZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvZ2dpbmcgb3B0aW9ucwotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tY3VzdG9taXplci1jbGFzcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgc2Vzc2lvbiBjdXN0b21pemVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyB0byBydW4gb24gYSBsb2FkZWQgc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgbm9kZSBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdoaWNoIHNlcnZlcgotICAgICAgICAgICAgICAgIHBsYXRmb3JtIHRvIHVzZSwgSlRBIHNldHRpbmdzIGFuZCBydW50aW1lIHNlcnZpY2VzCi0gICAgICAgICAgICAgICAgc2V0dGluZ3MKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLXJ1bnRpbWUtc2VydmljZXMiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSBKTVggTUJlYW4gZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRpbmcgcnVudGltZSBzZXJ2aWNlcyBpcyBkZXBsb3llZC4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGUtanRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIHNlc3Npb24gd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyYXRlIHdpdGggdGhlIEpUQSAoaS5lLiB3aGV0aGVyIHRoZSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGEgdHJhbnNhY3Rpb24gY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MuIFRoZSBjaG9pY2Ugb2Ygc2VydmVyLWNsYXNzIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYmUgY2hvc2VuIGJhc2VkIG9uIHRoZSB0cmFuc2FjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5zZXJ2ZXIuQ3VzdG9tU2VydmVyUGxhdGZvcm0iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgc3ViY2xhc3Mgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uc2VydmVyLlBsYXRmb3JtQmFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzcGVjaWZ5IHdoaWNoIHNlcnZlciBwbGF0Zm9ybSB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJleHRlcm5hbC10cmFuc2FjdGlvbi1jb250cm9sbGVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotOTAzLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTkwNC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMDEyLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTEwMTMtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTExMS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy02MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtNzAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTgxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy05LXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy0xMC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTQwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNTAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS01MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTYwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNjEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Impib3NzLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWJyb2tlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBQcm92aWRlcyBhIHNpbmdsZSB2aWV3IHRvIGEgc2Vzc2lvbiB0aGF0Ci0gICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRseSBhY2Nlc3NlcyBtdWx0cGxlIGRhdGFiYXNlcy4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icHJvamVjdCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4bWwiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InByb2plY3QiIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2xhc3MiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InByb2plY3QiIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLXNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhlIHNlc3Npb24gaXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlIGludG8gRWNsaXBzZUxpbmssIHRoZQotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNob3VsZCBkbyBhbGwgb2YgaXRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgb2YKLSAgICAgICAgICAgICAgICBvYmplY3RzIHRocm91Z2ggdGhlIHNlc3Npb24uIFRoZSBzZXNzaW9uIGFsc28gbWFuYWdlcwotICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucyBhbmQgdW5pdHMgb2Ygd29yay4gVGhlIGRhdGFiYXNlIHNlc3Npb24gaXMKLSAgICAgICAgICAgICAgICBpbnRlbmRlZCBmb3IgdXNhZ2UgaW4gdHdvLXRpZXIgY2xpZW50LXNlcnZlcgotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9ucy4gQWx0aG91Z2ggaXQgY291bGQgYmUgdXNlZCBpbiBhIHNlcnZlcgotICAgICAgICAgICAgICAgIHNpdHVhdGlvbiwgaXQgaXMgbGltaXR0ZWQgdG8gb25seSBoYXZpbmcgYSBzaW5nbGUKLSAgICAgICAgICAgICAgICBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBvbmx5IGFsbG93cyBhIHNpbmdsZSBvcGVuCi0gICAgICAgICAgICAgICAgZGF0YWJhc2UgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnktcHJvamVjdCIgdHlwZT0icHJvamVjdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHByb2plY3QgKGNsYXNzIG9yIHhtbCkgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQgYXMgdGhlIHByaW1hcnkgcHJvamVjdCBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZGRpdGlvbmFsLXByb2plY3QiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJwcm9qZWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWwgcHJvamVjdHMgd2lsbCBoYXZlIHRoZWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzIGFwcGVuZGVkIHRvIHRoZSBwcmltYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbiIgdHlwZT0ibG9naW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLXNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgSXMgYW4gZXh0ZW5zaW9uIG9mIGEgRGF0YWJhc2VTZXNzaW9uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2Utc2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbHMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBwb29scyBhcmUgb25seSBmb3IgdXNhZ2Ugd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBjb25uZWN0aW9uIHBvb2xpbmcgYW5kIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYmUgdXNlZCBpZiB1c2luZyBleHRlcm5hbCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWQtY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ3cml0ZS1jb25uZWN0aW9uLXBvb2wiIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJzZXF1ZW5jZS1jb25uZWN0aW9uLXBvb2wiIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhpcyB0YWcgdG8gdXNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBjb25uZWN0aW9uIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb2xpY3kiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjb25uZWN0aW9uLXBvbGljeSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSBob3cgZGVmYXVsdCBjbGllbnQgc2Vzc2lvbnMgYXJlIGFjcXVpcmVkCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1c2l2ZS1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBpZiBhbiBleGNsdXNpdmUgY29ubmVjdGlvbiBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIHJlYWRzLCByZXF1aXJlZCBmb3IgVlBELCBvciB1c2VyIGJhc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkIHNlY3VyaXR5LgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxhenkiIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgaWYgYSBjb25uZWN0aW9uIHNob3VsZCBiZSBhY3F1aXJlZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlbGQgdXBmcm9udCBpbiB0aGUgY2xpZW50IHNlc3Npb24sIG9yIG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkIHdoZW4gbmVlZGVkIGFuZCB0aGVuIHJlbGVhc2VkLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgY29tbW9uIGZpZWxkcyBmb3IgZGF0YWJhc2UtbG9naW4gYW5kIGVpcy1sb2dpbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbGF0Zm9ybS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIHBsYXRmb3JtCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBuYW1lCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvbi1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5zZWN1cml0eS5KQ0VFbmNyeXB0b3IiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLXF1YWxpZmllciIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSBkZWZhdWx0IHF1YWxpZmllciBmb3IgYWxsIHRhYmxlcy4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHRoZSBjcmVhdG9yIG9mIHRoZSB0YWJsZSBvciBkYXRhYmFzZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFibGUgZXhpc3RzIG9uLiBUaGlzIGlzIHJlcXVpcmVkIGJ5IHNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlcyBzdWNoIGFzIE9yYWNsZSBhbmQgREIyLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVybmFsLWNvbm5lY3Rpb24tcG9vbGluZyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgdXNlIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBjb25uZWN0aW9uIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlcm5hbC10cmFuc2FjdGlvbi1jb250cm9sbGVyIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgdGhlIHNlc3Npb24gd2lsbCBiZSB1c2luZyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgdHJhbnNhY3Rpb24gY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jaW5nIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InNlcXVlbmNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBzZXF1ZW5jZS4gVGhlIG5hbWUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsLiBJZiBubyBuYW1lIHByb3ZpZGVkIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSBzdHJpbmcgd2lsbCBiZSB1c2VkIGFzIGEgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb24gZGVmYXVsdCBzZXF1ZW5jZXMuIE1ha2Ugc3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBzZXF1ZW5jZSBoYXMgdW5pcXVlIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InNlcXVlbmNlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIGEgbG9naW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyB1c2VkIHRvIGRlZmluZSBleHRyYSBwcm9wZXJ0aWVzIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgbG9naW4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIEhvbGRzIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBjb25uZWN0Ci0gICAgICAgICAgICAgICAgdG8gYSBKREJDIGRyaXZlci4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRyaXZlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZHJpdmVyIGNsYXNzIGlzIHRoZSBKYXZhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgZm9yIHRoZSBKREJDIGRyaXZlciB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgKGUuZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW4uamRiYy5vZGJjLkpkYmNPZGJjRHJpdmVyLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBVUkwgdGhhdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGFzb3VyY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgVVJMIG9mIGEgZGF0YXNvdXJjZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgdXNlZCBieSB0aGUgc2Vzc2lvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsb29rdXAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Imxvb2t1cC1lbnVtIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gYmluZCBhbGwgYXJndW1lbnRzIHRvIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwgc3RhdGVtZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtYWxsLXN0YXRlbWVudHMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciBwcmVwYXJlZCBzdGF0ZW1lbnRzIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWNoZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJieXRlLWFycmF5LWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgYmluZGluZyBmb3IgbGFyZ2UgYmluYXJ5IGRhdGEuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgRWNsaXBzZUxpbmsgd2lsbCBwcmludCB0aGlzIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgaGV4IHRocm91Z2ggdGhlIEpEQkMgYmluYXJ5IGV4Y2FwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UuIEJvdGggYmluZGluZyBhbmQgcHJpbnRpbmcgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpb3VzIGxpbWl0cyBvbiBhbGwgZGF0YWJhc2VzIChlLmcuIDVrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMzJrKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmluZy1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgc3RyaW5ncyBzaG91bGQgYmUgYm91bmQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgdG8gaGVscCBiZWFuIGludHJvc3BlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJlYW1zLWZvci1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIHN0cmVhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3RvcmUgbGFyZ2UgYmluYXJ5IGRhdGEuIFRoaXMgY2FuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJvdmUgdGhlIG1heCBzaXplIGZvciByZWFkaW5nL3dyaXRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gc29tZSBKREJDIGRyaXZlcnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JjZS1maWVsZC1uYW1lcy10by11cHBlci1jYXNlIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBzZXR0aW5nIGNhbiBiZSB1c2VkIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBleHBlY3RzIHVwcGVyIGNhc2UgYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBkb2VzIG5vdCByZXR1cm4gY29uc2lzdGVudCBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIGRpZmZlcmVudCBkYXRhYmFzZXMpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pemUtZGF0YS1jb252ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciBkcml2ZXIgbGV2ZWwgZGF0YSBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbiBpcyBlbmFibGVkLiBUaGlzIGNhbiBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCBhcyBzb21lIGRyaXZlcnMgcGVyZm9ybSBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gdGhlbXNlbHZlcyBpbmNvcnJlY3RseS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyaW0tc3RyaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBDSEFSIGZpZWxkIHZhbHVlcyBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nIGJsYW5rcyB0cmltbWVkLCB0aGlzIGNhbiBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtd3JpdGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nLiBUaGlzIGZhY2lsaXR5IGFsbG93cyBtdWx0aXBsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSBvcGVyYXRpb25zIHRvIGJlIHN1Ym1pdHRlZCB0byBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIGZvciBwcm9jZXNzaW5nIGF0IG9uY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1pdHRpbmcgbXVsdGlwbGUgdXBkYXRlcyB0b2dldGhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBpbmRpdmlkdWFsbHksIGNhbiBncmVhdGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJvdmUgcGVyZm9ybWFuY2UgaW4gc29tZSBzaXR1YXRpb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamRiYy1iYXRjaC13cml0aW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nIHRoaXMgdGFnIHdpdGggdHJ1ZSBpbmRpY2F0ZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgdGhhdCB0aGUgSkRCQyBkcml2ZXIgc3VwcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggd3JpdGluZy4gRWNsaXBzZUxpbmsncyBpbnRlcm5hbCBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nIGlzIGRpc2FibGVkLiBTZXR0aW5nIHRoaXMgdGFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggZmFsc2UgaW5kaWNhdGVzIHRvIEVjbGlwc2VMaW5rIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZy4gVGhpcyB3aWxsIHJldmVydCB0byB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvdXIgd2hpY2ggaXMgdG8gZGVsZWdhdGUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsncyBpbnRlcm5hbCBiYXRjaCB3cml0aW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWF4LWJhdGNoLXdyaXRpbmctc2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIzMjAwMCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93IGZvciB0aGUgbWF4IGJhdGNoIHdyaXRpbmcgc2l6ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQuIFRoaXMgYWxsb3dzIGZvciB0aGUgYmF0Y2ggc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBsaW1pdGVkIGFzIG1vc3QgZGF0YWJhc2UgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3QgbGltaXRzLiBUaGUgc2l6ZSBpcyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLCB0aGUgZGVmYXVsdCBpcyAzMjAwMCBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWwgdmFsdWUgZGVwZW5kcyBvbiB0aGUgZGF0YWJhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hdGl2ZS1zcWwiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2Ugc3BlY2lmaWMgc3FsIGdyYW1tYXIgbm90IEpEQkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMuIFRoaXMgaXMgYmVjYXVzZSB1bmZvcnR1bmF0ZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWUgYnJpZGdlcyB0byBub3Qgc3VwcG9ydCB0aGUgZnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKREJDIHN0YW5kYXJkLiBCeSBkZWZhdWx0IEVjbGlwc2VMaW5rIHVzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEpEQkMgc3FsIGdyYW1tYXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVycyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJzdHJ1Y3QtY29udmVydGVycyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1oZWFsdGgtdmFsaWRhdGVkLW9uLWVycm9yIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgdHJ1ZSB3aWxsIGNhdXNlIEVjbGlwc2VMaW5rIHRvIHBpbmcgZGF0YWJhc2UgdG8gZGV0ZXJtaW5lIGlmIGFuIFNRTEV4Y2VwdGlvbiB3YXMgY2F1c2UgYnkgYSBjb21tdW5pY2F0aW9uIGZhaWx1cmU8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5LXJldHJ5LWF0dGVtcHQtY291bnQiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIG51bWJlciBvZiBhdHRlbXB0cyBFY2xpcHNlTGluayB3aWxsIG1ha2UgaWYgRWNsaXBzZUxpbmsgaXMgYXR0ZW1wdGluZyB0byByZXRyeSBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZGVsYXktYmV0d2Vlbi1yZWNvbm5lY3QtYXR0ZW1wdHMiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIHRpbWUgaW4gbWlsaXNlY29uZHMgdGhhdCBFY2xpcHNlTGluayB3aWxsIHdhaXQgYmV0d2VlbiBhdHRlbXB0cyB0byByZWNvbm5lY3QgaWYgRWNsaXBzZUxpbmsgaXMgYXR0ZW1wdGluZyB0byByZXRyeSBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icGluZy1zcWwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk92ZXJyaWRlIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBTUUwgdGhhdCBFY2xpcHNlTGluayB3aWxsIGlzc3VlIHRvIGEgY29ubmVjdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgbGl2ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Imxvb2t1cC1lbnVtIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZS1uYW1lIiAvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG91bmQtbmFtZSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gYW5kIGRhdGFzb3VyY2UKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLiBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byBjb25uZWN0IHRocm91Z2ggRUlTLAotICAgICAgICAgICAgICAgIC0gUHJvdmlkZSBhIEpOREkgbmFtZSB0byB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgYW5kIHVzZQotICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IGdldENvbm5lY3Rpb24gLSBQcm92aWRlIGEgSk5ESSBuYW1lIHRvIHRoZQotICAgICAgICAgICAgICAgIENvbm5lY3Rpb25GYWN0b3J5LCBhbmQgYSBkcml2ZXIgc3BlY2lmaWMgQ29ubmVjdGlvblNwZWMKLSAgICAgICAgICAgICAgICB0byBwYXNzIHRvIHRoZSBnZXRDb25uZWN0aW9uIC0gQ29ubmVjdCBpbiBhIG5vbi1tYW5hZ2VkCi0gICAgICAgICAgICAgICAgd2F5IGRpcmVjdGx5IHRvIHRoZSBkcml2ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgQW4KLSAgICAgICAgICAgICAgICBFSVNDb25uZWN0aW9uU3BlYyBtdXN0IGJlIHByb3ZpZGVkIHRvIGRlZmluZSBob3cgdG8KLSAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBFSVMgYWRhcHRlci4gVGhlIEVJUyBwbGF0Zm9ybSBjYW4gYmUgdXNlZAotICAgICAgICAgICAgICAgIHRvIHByb3ZpZGUgZGF0YXNvdXJjZS9kcml2ZXIgc3BlY2lmaWMgYmVoYXZvaXIgc3VjaCBhcwotICAgICAgICAgICAgICAgIEludGVyYWN0aW9uU3BlYyBhbmQgUmVjb3JkIGNvbnZlcnNpb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXNwZWMtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWZhY3RvcnktdXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIGxvZ2luIGFuZCBwbGF0Zm9ybSB0eXBlIHRvIGJlIHVzZWQKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLXBvb2wiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IGhvdyBjb25uZWN0aW9ucyBzaG91bGQgYmUgcG9vbGVkIGluIGEKLSAgICAgICAgICAgICAgICBzZXJ2ZXIgc2Vzc2lvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtY29ubmVjdGlvbnMiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4IG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgaW4gdGhlIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW4tY29ubmVjdGlvbnMiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWluIG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IHdpbGwgYXdheXMgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4iIHR5cGU9ImxvZ2luIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhlIHJlYWQgY29ubmVjdGlvbiBwb29sIGlzIHVzZWQgZm9yIHJlYWQgYWNjZXNzIHRocm91Z2gKLSAgICAgICAgICAgICAgICB0aGUgc2VydmVyIHNlc3Npb24uIEFueSBvZiB0aGUgY29ubmVjdGlvbiBwb29scyBjYW4gYmUKLSAgICAgICAgICAgICAgICB1c2VkIGZvciB0aGUgcmVhZCBwb29sIGhvd2V2ZXIgdGhpcyBpcyB0aGUgZGVmYXVsdC4gVGhpcwotICAgICAgICAgICAgICAgIHBvb2wgYWxsb3dzIGZvciBjb25jdXJyZW50IHJlYWRzIGFnYWluc3QgdGhlIHNhbWUgSkRCQwotICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gYW5kIHJlcXVpcmVzIHRoYXQgdGhlIEpEQkMgY29ubmVjdGlvbiBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgY29uY3VycmVudCByZWFkIGFjY2Vzcy4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb25uZWN0aW9uLXBvb2wiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdXNpdmUiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zIGZyb20gdGhlIHJlYWQgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sIGFyZSBleGNsdXNpdmUgb3Igbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGNvbW1vbiBsb2dnaW5nIG9wdGlvbnMKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBKYXZhIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmctb3B0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImxvZ2dpbmctb3B0aW9ucyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVjbGlwc2VsaW5rLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBFY2xpcHNlTGluayBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2ctbGV2ZWwiIGRlZmF1bHQ9ImluZm8iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgbG9nIGxldmVsIGZvciBsb2dnaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib2ZmIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZXZlcmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Indhcm5pbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImluZm8iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbmZpZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmVzdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBmaWxlIHRvIHdyaXRlIHRoZSBsb2dnaW5nIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb2dnaW5nLW9wdGlvbnMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIFNlcnZlciBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9nZ2luZy1vcHRpb25zIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2ctZXhjZXB0aW9uLXN0YWNrdHJhY2UiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGV4Y2VwdGlvbiBzdGFja3RyYWNlLiBXaXRob3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGVsZW1lbnQsIHRoZSBzdGFja3RyYWNlIGlzIGxvZ2dlZCBmb3IgRklORVIKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yIGxlc3MgKEZJTkVTVCkKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC10aHJlYWQiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIHRocmVhZC4gV2l0aG91dCB0aGlzIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGhyZWFkIGlzIGxvZ2dlZCBmb3IgRklORSBvciBsZXNzIChGSU5FUiBvcgotICAgICAgICAgICAgICAgICAgICAgICAgRklORVNUKQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LXNlc3Npb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgc2Vzc2lvbi4gV2l0aG91dCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCB0aGUgc2Vzc2lvbiBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgY29ubmVjdGlvbi4gV2l0aG91dCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCB0aGUgY29ubmVjdGlvbiBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LWRhdGUiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgZGF0ZS4gV2l0aG91dCB0aGlzIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0ZSBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mIHRoZSBSQ00uCi0gICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG1lY2hhbmlzbSBpcyBSTUkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib24tY29ubmVjdGlvbi1lcnJvciIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJEaXNjYXJkQ29ubmVjdGlvbiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBhbmQgaGFzIHZhbHVlIG9mICJEaXNjYXJkQ29ubmVjdGlvbiIgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICJLZWVwQ29ubmVjdGlvbiIuIEl0IGRldGVybWluZXMgd2hldGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiB0byBhIFJDTSBzZXJ2aWNlIHNob3VsZCBiZSBkcm9wcGVkIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhIGNvbW11bmljYXRpb24gZXJyb3Igd2l0aCB0aGF0IFJDTQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2NhcmRDb25uZWN0aW9uIi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlZXBDb25uZWN0aW9uIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2FyZENvbm5lY3Rpb24iIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJtaS10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGVmaW5lcyB0aGUgUk1JIHRyYW5zcG9ydCBtZWNoYW5pc20uIFRoZQotICAgICAgICAgICAgICAgIGRlZmF1bHQgbmFtaW5nIHNlcnZpY2UgaXMgSk5ESQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VuZC1tb2RlIiBkZWZhdWx0PSJBc3luY2hyb25vdXMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1pIGVsZW1lbnQgYW5kIGhhcyB2YWx1ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIiBvciAiU3luY2hyb25vdXMiLiBJdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIFJDTSBwcm9wYWdhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgYW5kIGRvZXMgbm90IHdhaXQgZm9yIGNvbW1hbmQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoIGl0cyBleGVjdXRpb24gaW4gYXN5bmNocm9ub3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgb3Igd2FpdCBmb3IgY29tbWFuZCB0byBmaW5pc2ggaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBpbiBzeW5jaHJvbm91cyBtb2RlLiBUaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXN5bmNocm9ub3VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW5jaHJvbm91cyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjb3ZlcnkiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWkgZWxlbWVudC4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3Zlcnkgc2V0dGluZ3Mgc2hvdWxkIGJlIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBhIGRlZmF1bHQgRGlzY292ZXJ5IHdpdGggaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgc2V0dGluZ3MgaXMgY3JlYXRlZCB3aGVuIHRoZSBybWkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBpcyBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibXVsdGljYXN0LWdyb3VwLWFkZHJlc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSIyMjYuMTAuMTIuNjQiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpY2FzdC1wb3J0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjMxMjEiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFubm91bmNlbWVudC1kZWxheSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIxMDAwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBtdWx0aWNhc3QgZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBzaG91bGQgYmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGlzICIxMDAwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2V0LXRpbWUtdG8tbGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSB0aW1lLXRvLWxpdmUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhY2tldHMgdGhhdCBhcmUgc2VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBEaXNjb3ZlcnkncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWxzdGljYXN0IHNvY2tldCBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC4gVGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBlbGVtZW50IGlzICIyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqbmRpLW5hbWluZy1zZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icm1pLXJlZ2lzdHJ5LW5hbWluZy1zZXJ2aWNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBybWkgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIFJNSSByZWdpc3RyeSBzaG91bGQgYmUgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWluZyBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJtaS1paW9wLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgUk1JLUlJT1AgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZgotICAgICAgICAgICAgICAgIHRoZSBSQ00uIFRoZSBkZWZhdWx0IG5hbWluZyBzZXJ2aWNlIGlzIEpOREkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJybWktdHJhbnNwb3J0IiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imptcy10b3BpYy10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIEpNUyB0b3BpYyB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtaG9zdC11cmwiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1jb25uZWN0aW9uLWZhY3RvcnktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9Imptcy9FY2xpcHNlTGlua1RvcGljQ29ubmVjdGlvbkZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iam1zL0VjbGlwc2VMaW5rVG9waWMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqbmRpLW5hbWluZy1zZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotamdyb3Vwcy10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIE9DNEogSkdyb3VwcyB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBtZWNoYW5pc20gb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlLXNpbmdsZS10aHJlYWRlZC1ub3RpZmljYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3VuLWNvcmJhLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgU3VuIENPUkJBIHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXNlci1kZWZpbmVkLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgYSB1c2VyIGltcGxlbWVudGVkCi0gICAgICAgICAgICAgICAgdHJhbnNwb3J0IG1lY2hhbmlzbSB0aGF0IHNob3VsZCBiZSB1c2VkLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgVVJMIGZvciBuYW1pbmcgc2VydmljZSBzaG91bGQgYmUgY2hhbmdlZC4gCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImFkbWluIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvbi1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5zZWN1cml0eS5KQ0VFbmNyeXB0b3IiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InBhc3N3b3JkIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8IS0tICBUT0RPOiBOZWVkIHRvIGhhdmUgYSBub24gT3JhY2xlLUFTIGRlZmF1bHQgb3Igcm91dGUgdGhyb3VnaCBzZXJ2ZXIgcGxhdGZvcm0gYnkgZGVmYXVsdCAtLT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0aWFsLWNvbnRleHQtZmFjdG9yeS1uYW1lIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iY29tLmV2ZXJtaW5kLnNlcnZlci5ybWkuUk1JSW5pdGlhbENvbnRleHRGYWN0b3J5IgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbCBjb250ZXh0IGZhY3RvcnkgY2xhc3MgZm9yIG5hbWluZyBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2hhbmdlZC4gCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1pbmcgc2VydmljZSByZXF1aXJlcyBleHRyYSBwcm9wZXJ0eSB0aGF0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBub3QgZGVmaW5lZCBieSBFY2xpcHNlTGluayBidXQgaXQgaXMgcmVxdWlyZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VyIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpncm91cCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpncm91cD4KLSAgICA8eHNkOmdyb3VwIG5hbWU9InN0cnVjdC1jb252ZXJ0ZXJzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmdyb3VwPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2Ugb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSI1MCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIHByZWFsbG9jYXRpb24gc2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFJlZmVyZW5jZXMgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsIG92ZXJyaWRpbmcgaXRzIG5hbWUKLSAgICAgICAgICAgICAgICBhbmQgKG9wdGlvbmFsbHkpIHByZWFsbG9jYXRpb24gc2l6ZS4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVG8gdXNlIHByZWFsbG9jYXRpb24gc2l6ZSBvZiBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwKLSAgICAgICAgICAgICAgICBzZXQgcHJlYWxsb2NhdGlvbiBzaXplIHRvIDAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYXRpdmUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2Ugc2VxdWVuY2UgbWVjaGFuaXNtIHVzZWQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGFibGUgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfTkFNRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX0NPVU5UIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmFyeS10YWJsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVbmFyeSB0YWJsZSBzZXF1ZW5jZSAtIHNlcXVlbmNlIG5hbWUgaXMgYSB0YWJsZSBuYW1lLAotICAgICAgICAgICAgICAgIHRhYmxlIGhhcyBhIHNpbmdsZSBmaWVsZCBhbmQgYSBzaW5nbGUgcm93Ci0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbGZpbGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sZmlsZSBzZXF1ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbCBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9OQU1FIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZWxlbWVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjEueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODcyYTE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMS4xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1ODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgCi0tLT4KLTwhLS0gCi0KLVhNTCBTY2hlbWEgZGVmaW5pdGlvbiBmb3IgdGhlIEVjbGlwc2UgUGVyc2lzdGVuY2UgU2VydmljZXMgUHJvamVjdCBTZXNzaW9uIENvbmZpZ3VyYXRpb24gZmlsZS4gSW5zdGFuY2VzCi1vZiB0aGlzIGZpbGUgYXJlIHR5cGljYWxseSBsb2NhdGVkIGFzOiAnTUVUQS1JTkYvc2Vzc2lvbnMueG1sJwotCi0gLS0+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHZlcnNpb249IjEuMSI+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb25zIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHJvb3QgZWxlbWVudCBhbmQgZXhpc3RzIG9ubHkgZm9yIFhNTAotICAgICAgICAgICAgICAgIHN0cnVjdHVyZQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24iIHR5cGU9InNlc3Npb24iIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgbm9kZSBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIGEgcGFydGljdWxhciBzZXNzaW9uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJpYyBlbGVtZW50IHVzZWQgdG8gZGVzY3JpYmUgYSBzdHJpbmcgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyB0aGUgbmFtZSBvZiBhbiBpdGVtCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmVyLXBsYXRmb3JtIiB0eXBlPSJzZXJ2ZXItcGxhdGZvcm0iCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlLWNvbW1hbmQiPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIGVsZW1lbnQgdGhhdCBkZWZpbmUgdGhlIFJlbW90ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQgTW9kdWxlIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZSBzeW5jaHJvbml6YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFubmVsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBkZWZhdWx0PSJFY2xpcHNlTGlua0NvbW1hbmRDaGFubmVsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21tYW5kcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgcmVtb3RlLWNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZXRlcm1pbmUgd2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZmVhdHVyZXMsIHRoZSBSQ00KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLXN5bmMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGVsZW1lbnQuIEl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybnMgb24gY2FjaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6YXRpb24gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvdyBzZW5kaW5nIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZyBjYWNoZSBzeW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InRyYW5zcG9ydC1tYW5hZ2VyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRlZmluZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZiB0aGUgUkNNLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBSTUkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb2ZpbGVyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHJlcHJlc2VudHMgaWYgdGhlIHByb2ZpbGVyIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYnkgdGhlIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRtcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVjbGlwc2VsaW5rIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24taGFuZGxlci1jbGFzcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgY2xhc3MgdGhhdCB0aGUgc2Vzc2lvbiB3aWxsIHVzZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlIGV4Y2VwdGlvbnMgZ2VuZXJhdGVkIGZyb20gd2l0aGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmciIHR5cGU9ImxvZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvZ2dpbmcgb3B0aW9ucwotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tY3VzdG9taXplci1jbGFzcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgc2Vzc2lvbiBjdXN0b21pemVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyB0byBydW4gb24gYSBsb2FkZWQgc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgbm9kZSBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdoaWNoIHNlcnZlcgotICAgICAgICAgICAgICAgIHBsYXRmb3JtIHRvIHVzZSwgSlRBIHNldHRpbmdzIGFuZCBydW50aW1lIHNlcnZpY2VzCi0gICAgICAgICAgICAgICAgc2V0dGluZ3MKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLXJ1bnRpbWUtc2VydmljZXMiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSBKTVggTUJlYW4gZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRpbmcgcnVudGltZSBzZXJ2aWNlcyBpcyBkZXBsb3llZC4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGUtanRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIHNlc3Npb24gd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyYXRlIHdpdGggdGhlIEpUQSAoaS5lLiB3aGV0aGVyIHRoZSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGEgdHJhbnNhY3Rpb24gY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MuIFRoZSBjaG9pY2Ugb2Ygc2VydmVyLWNsYXNzIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYmUgY2hvc2VuIGJhc2VkIG9uIHRoZSB0cmFuc2FjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5zZXJ2ZXIuQ3VzdG9tU2VydmVyUGxhdGZvcm0iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgc3ViY2xhc3Mgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uc2VydmVyLlBsYXRmb3JtQmFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzcGVjaWZ5IHdoaWNoIHNlcnZlciBwbGF0Zm9ybSB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJleHRlcm5hbC10cmFuc2FjdGlvbi1jb250cm9sbGVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotOTAzLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTkwNC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMDEyLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTEwMTMtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTExMS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy02MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtNzAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTgxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy05LXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy0xMC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTQwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNTAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS01MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTYwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNjEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Impib3NzLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWJyb2tlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBQcm92aWRlcyBhIHNpbmdsZSB2aWV3IHRvIGEgc2Vzc2lvbiB0aGF0Ci0gICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRseSBhY2Nlc3NlcyBtdWx0cGxlIGRhdGFiYXNlcy4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icHJvamVjdCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4bWwiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InByb2plY3QiIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2xhc3MiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InByb2plY3QiIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLXNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhlIHNlc3Npb24gaXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlIGludG8gRWNsaXBzZUxpbmssIHRoZQotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNob3VsZCBkbyBhbGwgb2YgaXRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgb2YKLSAgICAgICAgICAgICAgICBvYmplY3RzIHRocm91Z2ggdGhlIHNlc3Npb24uIFRoZSBzZXNzaW9uIGFsc28gbWFuYWdlcwotICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucyBhbmQgdW5pdHMgb2Ygd29yay4gVGhlIGRhdGFiYXNlIHNlc3Npb24gaXMKLSAgICAgICAgICAgICAgICBpbnRlbmRlZCBmb3IgdXNhZ2UgaW4gdHdvLXRpZXIgY2xpZW50LXNlcnZlcgotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9ucy4gQWx0aG91Z2ggaXQgY291bGQgYmUgdXNlZCBpbiBhIHNlcnZlcgotICAgICAgICAgICAgICAgIHNpdHVhdGlvbiwgaXQgaXMgbGltaXR0ZWQgdG8gb25seSBoYXZpbmcgYSBzaW5nbGUKLSAgICAgICAgICAgICAgICBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBvbmx5IGFsbG93cyBhIHNpbmdsZSBvcGVuCi0gICAgICAgICAgICAgICAgZGF0YWJhc2UgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnktcHJvamVjdCIgdHlwZT0icHJvamVjdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHByb2plY3QgKGNsYXNzIG9yIHhtbCkgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQgYXMgdGhlIHByaW1hcnkgcHJvamVjdCBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZGRpdGlvbmFsLXByb2plY3QiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJwcm9qZWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWwgcHJvamVjdHMgd2lsbCBoYXZlIHRoZWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzIGFwcGVuZGVkIHRvIHRoZSBwcmltYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbiIgdHlwZT0ibG9naW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLXNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgSXMgYW4gZXh0ZW5zaW9uIG9mIGEgRGF0YWJhc2VTZXNzaW9uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2Utc2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbHMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBwb29scyBhcmUgb25seSBmb3IgdXNhZ2Ugd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBjb25uZWN0aW9uIHBvb2xpbmcgYW5kIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYmUgdXNlZCBpZiB1c2luZyBleHRlcm5hbCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWQtY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ3cml0ZS1jb25uZWN0aW9uLXBvb2wiIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJzZXF1ZW5jZS1jb25uZWN0aW9uLXBvb2wiIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhpcyB0YWcgdG8gdXNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBjb25uZWN0aW9uIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb2xpY3kiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjb25uZWN0aW9uLXBvbGljeSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSBob3cgZGVmYXVsdCBjbGllbnQgc2Vzc2lvbnMgYXJlIGFjcXVpcmVkCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1c2l2ZS1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBpZiBhbiBleGNsdXNpdmUgY29ubmVjdGlvbiBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIHJlYWRzLCByZXF1aXJlZCBmb3IgVlBELCBvciB1c2VyIGJhc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkIHNlY3VyaXR5LgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxhenkiIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgaWYgYSBjb25uZWN0aW9uIHNob3VsZCBiZSBhY3F1aXJlZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlbGQgdXBmcm9udCBpbiB0aGUgY2xpZW50IHNlc3Npb24sIG9yIG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkIHdoZW4gbmVlZGVkIGFuZCB0aGVuIHJlbGVhc2VkLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgY29tbW9uIGZpZWxkcyBmb3IgZGF0YWJhc2UtbG9naW4gYW5kIGVpcy1sb2dpbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbGF0Zm9ybS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIHBsYXRmb3JtCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBuYW1lCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvbi1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5zZWN1cml0eS5KQ0VFbmNyeXB0b3IiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLXF1YWxpZmllciIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSBkZWZhdWx0IHF1YWxpZmllciBmb3IgYWxsIHRhYmxlcy4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHRoZSBjcmVhdG9yIG9mIHRoZSB0YWJsZSBvciBkYXRhYmFzZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFibGUgZXhpc3RzIG9uLiBUaGlzIGlzIHJlcXVpcmVkIGJ5IHNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlcyBzdWNoIGFzIE9yYWNsZSBhbmQgREIyLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVybmFsLWNvbm5lY3Rpb24tcG9vbGluZyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgdXNlIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBjb25uZWN0aW9uIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlcm5hbC10cmFuc2FjdGlvbi1jb250cm9sbGVyIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgdGhlIHNlc3Npb24gd2lsbCBiZSB1c2luZyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgdHJhbnNhY3Rpb24gY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jaW5nIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InNlcXVlbmNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBzZXF1ZW5jZS4gVGhlIG5hbWUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsLiBJZiBubyBuYW1lIHByb3ZpZGVkIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSBzdHJpbmcgd2lsbCBiZSB1c2VkIGFzIGEgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb24gZGVmYXVsdCBzZXF1ZW5jZXMuIE1ha2Ugc3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBzZXF1ZW5jZSBoYXMgdW5pcXVlIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InNlcXVlbmNlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIGEgbG9naW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyB1c2VkIHRvIGRlZmluZSBleHRyYSBwcm9wZXJ0aWVzIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgbG9naW4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIEhvbGRzIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBjb25uZWN0Ci0gICAgICAgICAgICAgICAgdG8gYSBKREJDIGRyaXZlci4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRyaXZlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZHJpdmVyIGNsYXNzIGlzIHRoZSBKYXZhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgZm9yIHRoZSBKREJDIGRyaXZlciB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgKGUuZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW4uamRiYy5vZGJjLkpkYmNPZGJjRHJpdmVyLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBVUkwgdGhhdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGFzb3VyY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgVVJMIG9mIGEgZGF0YXNvdXJjZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgdXNlZCBieSB0aGUgc2Vzc2lvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsb29rdXAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Imxvb2t1cC1lbnVtIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gYmluZCBhbGwgYXJndW1lbnRzIHRvIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwgc3RhdGVtZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtYWxsLXN0YXRlbWVudHMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciBwcmVwYXJlZCBzdGF0ZW1lbnRzIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWNoZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJieXRlLWFycmF5LWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgYmluZGluZyBmb3IgbGFyZ2UgYmluYXJ5IGRhdGEuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgRWNsaXBzZUxpbmsgd2lsbCBwcmludCB0aGlzIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgaGV4IHRocm91Z2ggdGhlIEpEQkMgYmluYXJ5IGV4Y2FwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UuIEJvdGggYmluZGluZyBhbmQgcHJpbnRpbmcgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpb3VzIGxpbWl0cyBvbiBhbGwgZGF0YWJhc2VzIChlLmcuIDVrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMzJrKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmluZy1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgc3RyaW5ncyBzaG91bGQgYmUgYm91bmQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgdG8gaGVscCBiZWFuIGludHJvc3BlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJlYW1zLWZvci1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIHN0cmVhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3RvcmUgbGFyZ2UgYmluYXJ5IGRhdGEuIFRoaXMgY2FuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJvdmUgdGhlIG1heCBzaXplIGZvciByZWFkaW5nL3dyaXRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gc29tZSBKREJDIGRyaXZlcnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JjZS1maWVsZC1uYW1lcy10by11cHBlci1jYXNlIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBzZXR0aW5nIGNhbiBiZSB1c2VkIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBleHBlY3RzIHVwcGVyIGNhc2UgYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBkb2VzIG5vdCByZXR1cm4gY29uc2lzdGVudCBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIGRpZmZlcmVudCBkYXRhYmFzZXMpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pemUtZGF0YS1jb252ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciBkcml2ZXIgbGV2ZWwgZGF0YSBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbiBpcyBlbmFibGVkLiBUaGlzIGNhbiBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCBhcyBzb21lIGRyaXZlcnMgcGVyZm9ybSBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gdGhlbXNlbHZlcyBpbmNvcnJlY3RseS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyaW0tc3RyaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBDSEFSIGZpZWxkIHZhbHVlcyBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nIGJsYW5rcyB0cmltbWVkLCB0aGlzIGNhbiBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtd3JpdGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nLiBUaGlzIGZhY2lsaXR5IGFsbG93cyBtdWx0aXBsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSBvcGVyYXRpb25zIHRvIGJlIHN1Ym1pdHRlZCB0byBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIGZvciBwcm9jZXNzaW5nIGF0IG9uY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1pdHRpbmcgbXVsdGlwbGUgdXBkYXRlcyB0b2dldGhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBpbmRpdmlkdWFsbHksIGNhbiBncmVhdGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJvdmUgcGVyZm9ybWFuY2UgaW4gc29tZSBzaXR1YXRpb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamRiYy1iYXRjaC13cml0aW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nIHRoaXMgdGFnIHdpdGggdHJ1ZSBpbmRpY2F0ZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgdGhhdCB0aGUgSkRCQyBkcml2ZXIgc3VwcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggd3JpdGluZy4gRWNsaXBzZUxpbmsncyBpbnRlcm5hbCBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nIGlzIGRpc2FibGVkLiBTZXR0aW5nIHRoaXMgdGFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggZmFsc2UgaW5kaWNhdGVzIHRvIEVjbGlwc2VMaW5rIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZy4gVGhpcyB3aWxsIHJldmVydCB0byB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvdXIgd2hpY2ggaXMgdG8gZGVsZWdhdGUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsncyBpbnRlcm5hbCBiYXRjaCB3cml0aW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWF4LWJhdGNoLXdyaXRpbmctc2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIzMjAwMCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93IGZvciB0aGUgbWF4IGJhdGNoIHdyaXRpbmcgc2l6ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQuIFRoaXMgYWxsb3dzIGZvciB0aGUgYmF0Y2ggc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBsaW1pdGVkIGFzIG1vc3QgZGF0YWJhc2UgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3QgbGltaXRzLiBUaGUgc2l6ZSBpcyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLCB0aGUgZGVmYXVsdCBpcyAzMjAwMCBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWwgdmFsdWUgZGVwZW5kcyBvbiB0aGUgZGF0YWJhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hdGl2ZS1zcWwiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2Ugc3BlY2lmaWMgc3FsIGdyYW1tYXIgbm90IEpEQkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMuIFRoaXMgaXMgYmVjYXVzZSB1bmZvcnR1bmF0ZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWUgYnJpZGdlcyB0byBub3Qgc3VwcG9ydCB0aGUgZnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKREJDIHN0YW5kYXJkLiBCeSBkZWZhdWx0IEVjbGlwc2VMaW5rIHVzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEpEQkMgc3FsIGdyYW1tYXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVycyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJzdHJ1Y3QtY29udmVydGVycyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1oZWFsdGgtdmFsaWRhdGVkLW9uLWVycm9yIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgdHJ1ZSB3aWxsIGNhdXNlIEVjbGlwc2VMaW5rIHRvIHBpbmcgZGF0YWJhc2UgdG8gZGV0ZXJtaW5lIGlmIGFuIFNRTEV4Y2VwdGlvbiB3YXMgY2F1c2UgYnkgYSBjb21tdW5pY2F0aW9uIGZhaWx1cmU8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5LXJldHJ5LWF0dGVtcHQtY291bnQiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIG51bWJlciBvZiBhdHRlbXB0cyBFY2xpcHNlTGluayB3aWxsIG1ha2UgaWYgRWNsaXBzZUxpbmsgaXMgYXR0ZW1wdGluZyB0byByZXRyeSBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZGVsYXktYmV0d2Vlbi1yZWNvbm5lY3QtYXR0ZW1wdHMiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIHRpbWUgaW4gbWlsaXNlY29uZHMgdGhhdCBFY2xpcHNlTGluayB3aWxsIHdhaXQgYmV0d2VlbiBhdHRlbXB0cyB0byByZWNvbm5lY3QgaWYgRWNsaXBzZUxpbmsgaXMgYXR0ZW1wdGluZyB0byByZXRyeSBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icGluZy1zcWwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk92ZXJyaWRlIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBTUUwgdGhhdCBFY2xpcHNlTGluayB3aWxsIGlzc3VlIHRvIGEgY29ubmVjdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgbGl2ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Imxvb2t1cC1lbnVtIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZS1uYW1lIiAvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG91bmQtbmFtZSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gYW5kIGRhdGFzb3VyY2UKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLiBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byBjb25uZWN0IHRocm91Z2ggRUlTLAotICAgICAgICAgICAgICAgIC0gUHJvdmlkZSBhIEpOREkgbmFtZSB0byB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgYW5kIHVzZQotICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IGdldENvbm5lY3Rpb24gLSBQcm92aWRlIGEgSk5ESSBuYW1lIHRvIHRoZQotICAgICAgICAgICAgICAgIENvbm5lY3Rpb25GYWN0b3J5LCBhbmQgYSBkcml2ZXIgc3BlY2lmaWMgQ29ubmVjdGlvblNwZWMKLSAgICAgICAgICAgICAgICB0byBwYXNzIHRvIHRoZSBnZXRDb25uZWN0aW9uIC0gQ29ubmVjdCBpbiBhIG5vbi1tYW5hZ2VkCi0gICAgICAgICAgICAgICAgd2F5IGRpcmVjdGx5IHRvIHRoZSBkcml2ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgQW4KLSAgICAgICAgICAgICAgICBFSVNDb25uZWN0aW9uU3BlYyBtdXN0IGJlIHByb3ZpZGVkIHRvIGRlZmluZSBob3cgdG8KLSAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBFSVMgYWRhcHRlci4gVGhlIEVJUyBwbGF0Zm9ybSBjYW4gYmUgdXNlZAotICAgICAgICAgICAgICAgIHRvIHByb3ZpZGUgZGF0YXNvdXJjZS9kcml2ZXIgc3BlY2lmaWMgYmVoYXZvaXIgc3VjaCBhcwotICAgICAgICAgICAgICAgIEludGVyYWN0aW9uU3BlYyBhbmQgUmVjb3JkIGNvbnZlcnNpb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXNwZWMtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWZhY3RvcnktdXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1sb2dpbiI+Ci0gICAgCTx4c2Q6YW5ub3RhdGlvbj4KLSAgICAJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJCQlEZWZpbmVzIGxvZ2luIGFuZCBwbGF0Zm9ybSB0eXBlIHRvIGJlIHVzZWQKLSAgICAJCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCTwveHNkOmFubm90YXRpb24+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgCQkJPHhzZDpzZXF1ZW5jZT4KLSAgICAJCQkJPHhzZDplbGVtZW50IG5hbWU9ImVxdWFsLW5hbWVzcGFjZS1yZXNvbHZlcnMiCi0gICAgCQkJCQl0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiPgotICAgIAkJCQk8L3hzZDplbGVtZW50PgotICAgIAkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSIKLSAgICAJCQkJCW1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIgotICAgIAkJCQkJdHlwZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0KLSAgICAJCQkJPC94c2Q6ZWxlbWVudD4KLSAgICAJCQk8L3hzZDpzZXF1ZW5jZT4KLSAgICAJCTwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLXBvb2wiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IGhvdyBjb25uZWN0aW9ucyBzaG91bGQgYmUgcG9vbGVkIGluIGEKLSAgICAgICAgICAgICAgICBzZXJ2ZXIgc2Vzc2lvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtY29ubmVjdGlvbnMiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4IG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgaW4gdGhlIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW4tY29ubmVjdGlvbnMiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWluIG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IHdpbGwgYXdheXMgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4iIHR5cGU9ImxvZ2luIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhlIHJlYWQgY29ubmVjdGlvbiBwb29sIGlzIHVzZWQgZm9yIHJlYWQgYWNjZXNzIHRocm91Z2gKLSAgICAgICAgICAgICAgICB0aGUgc2VydmVyIHNlc3Npb24uIEFueSBvZiB0aGUgY29ubmVjdGlvbiBwb29scyBjYW4gYmUKLSAgICAgICAgICAgICAgICB1c2VkIGZvciB0aGUgcmVhZCBwb29sIGhvd2V2ZXIgdGhpcyBpcyB0aGUgZGVmYXVsdC4gVGhpcwotICAgICAgICAgICAgICAgIHBvb2wgYWxsb3dzIGZvciBjb25jdXJyZW50IHJlYWRzIGFnYWluc3QgdGhlIHNhbWUgSkRCQwotICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gYW5kIHJlcXVpcmVzIHRoYXQgdGhlIEpEQkMgY29ubmVjdGlvbiBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgY29uY3VycmVudCByZWFkIGFjY2Vzcy4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb25uZWN0aW9uLXBvb2wiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdXNpdmUiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zIGZyb20gdGhlIHJlYWQgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sIGFyZSBleGNsdXNpdmUgb3Igbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGNvbW1vbiBsb2dnaW5nIG9wdGlvbnMKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBKYXZhIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmctb3B0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImxvZ2dpbmctb3B0aW9ucyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVjbGlwc2VsaW5rLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBFY2xpcHNlTGluayBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2ctbGV2ZWwiIGRlZmF1bHQ9ImluZm8iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgbG9nIGxldmVsIGZvciBsb2dnaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib2ZmIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZXZlcmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Indhcm5pbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImluZm8iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbmZpZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmVzdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBmaWxlIHRvIHdyaXRlIHRoZSBsb2dnaW5nIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb2dnaW5nLW9wdGlvbnMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIFNlcnZlciBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9nZ2luZy1vcHRpb25zIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2ctZXhjZXB0aW9uLXN0YWNrdHJhY2UiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGV4Y2VwdGlvbiBzdGFja3RyYWNlLiBXaXRob3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGVsZW1lbnQsIHRoZSBzdGFja3RyYWNlIGlzIGxvZ2dlZCBmb3IgRklORVIKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yIGxlc3MgKEZJTkVTVCkKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC10aHJlYWQiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIHRocmVhZC4gV2l0aG91dCB0aGlzIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGhyZWFkIGlzIGxvZ2dlZCBmb3IgRklORSBvciBsZXNzIChGSU5FUiBvcgotICAgICAgICAgICAgICAgICAgICAgICAgRklORVNUKQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LXNlc3Npb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgc2Vzc2lvbi4gV2l0aG91dCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCB0aGUgc2Vzc2lvbiBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgY29ubmVjdGlvbi4gV2l0aG91dCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCB0aGUgY29ubmVjdGlvbiBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LWRhdGUiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgZGF0ZS4gV2l0aG91dCB0aGlzIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0ZSBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mIHRoZSBSQ00uCi0gICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG1lY2hhbmlzbSBpcyBSTUkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib24tY29ubmVjdGlvbi1lcnJvciIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJEaXNjYXJkQ29ubmVjdGlvbiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBhbmQgaGFzIHZhbHVlIG9mICJEaXNjYXJkQ29ubmVjdGlvbiIgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICJLZWVwQ29ubmVjdGlvbiIuIEl0IGRldGVybWluZXMgd2hldGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiB0byBhIFJDTSBzZXJ2aWNlIHNob3VsZCBiZSBkcm9wcGVkIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhIGNvbW11bmljYXRpb24gZXJyb3Igd2l0aCB0aGF0IFJDTQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2NhcmRDb25uZWN0aW9uIi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlZXBDb25uZWN0aW9uIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2FyZENvbm5lY3Rpb24iIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJtaS10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGVmaW5lcyB0aGUgUk1JIHRyYW5zcG9ydCBtZWNoYW5pc20uIFRoZQotICAgICAgICAgICAgICAgIGRlZmF1bHQgbmFtaW5nIHNlcnZpY2UgaXMgSk5ESQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VuZC1tb2RlIiBkZWZhdWx0PSJBc3luY2hyb25vdXMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1pIGVsZW1lbnQgYW5kIGhhcyB2YWx1ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIiBvciAiU3luY2hyb25vdXMiLiBJdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIFJDTSBwcm9wYWdhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgYW5kIGRvZXMgbm90IHdhaXQgZm9yIGNvbW1hbmQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoIGl0cyBleGVjdXRpb24gaW4gYXN5bmNocm9ub3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgb3Igd2FpdCBmb3IgY29tbWFuZCB0byBmaW5pc2ggaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBpbiBzeW5jaHJvbm91cyBtb2RlLiBUaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXN5bmNocm9ub3VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW5jaHJvbm91cyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjb3ZlcnkiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWkgZWxlbWVudC4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3Zlcnkgc2V0dGluZ3Mgc2hvdWxkIGJlIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBhIGRlZmF1bHQgRGlzY292ZXJ5IHdpdGggaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgc2V0dGluZ3MgaXMgY3JlYXRlZCB3aGVuIHRoZSBybWkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBpcyBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibXVsdGljYXN0LWdyb3VwLWFkZHJlc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSIyMjYuMTAuMTIuNjQiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpY2FzdC1wb3J0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjMxMjEiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFubm91bmNlbWVudC1kZWxheSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIxMDAwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBtdWx0aWNhc3QgZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBzaG91bGQgYmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGlzICIxMDAwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2V0LXRpbWUtdG8tbGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSB0aW1lLXRvLWxpdmUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhY2tldHMgdGhhdCBhcmUgc2VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBEaXNjb3ZlcnkncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWxzdGljYXN0IHNvY2tldCBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC4gVGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBlbGVtZW50IGlzICIyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqbmRpLW5hbWluZy1zZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icm1pLXJlZ2lzdHJ5LW5hbWluZy1zZXJ2aWNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBybWkgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIFJNSSByZWdpc3RyeSBzaG91bGQgYmUgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWluZyBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJtaS1paW9wLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgUk1JLUlJT1AgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZgotICAgICAgICAgICAgICAgIHRoZSBSQ00uIFRoZSBkZWZhdWx0IG5hbWluZyBzZXJ2aWNlIGlzIEpOREkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJybWktdHJhbnNwb3J0IiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imptcy10b3BpYy10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIEpNUyB0b3BpYyB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtaG9zdC11cmwiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1jb25uZWN0aW9uLWZhY3RvcnktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9Imptcy9FY2xpcHNlTGlua1RvcGljQ29ubmVjdGlvbkZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iam1zL0VjbGlwc2VMaW5rVG9waWMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqbmRpLW5hbWluZy1zZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotamdyb3Vwcy10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIE9DNEogSkdyb3VwcyB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBtZWNoYW5pc20gb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlLXNpbmdsZS10aHJlYWRlZC1ub3RpZmljYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3VuLWNvcmJhLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgU3VuIENPUkJBIHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXNlci1kZWZpbmVkLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgYSB1c2VyIGltcGxlbWVudGVkCi0gICAgICAgICAgICAgICAgdHJhbnNwb3J0IG1lY2hhbmlzbSB0aGF0IHNob3VsZCBiZSB1c2VkLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgVVJMIGZvciBuYW1pbmcgc2VydmljZSBzaG91bGQgYmUgY2hhbmdlZC4gCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImFkbWluIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvbi1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5zZWN1cml0eS5KQ0VFbmNyeXB0b3IiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InBhc3N3b3JkIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8IS0tICBUT0RPOiBOZWVkIHRvIGhhdmUgYSBub24gV2ViTG9naWMgKHByZXZpb3VzbHkgT0M0SikgZGVmYXVsdCBvciByb3V0ZSB0aHJvdWdoIHNlcnZlciBwbGF0Zm9ybSBieSBkZWZhdWx0IC0tPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXRpYWwtY29udGV4dC1mYWN0b3J5LW5hbWUiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ3ZWJsb2dpYy5qbmRpLldMSW5pdGlhbENvbnRleHRGYWN0b3J5IgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbCBjb250ZXh0IGZhY3RvcnkgY2xhc3MgZm9yIG5hbWluZyBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2hhbmdlZC4gCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1pbmcgc2VydmljZSByZXF1aXJlcyBleHRyYSBwcm9wZXJ0eSB0aGF0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBub3QgZGVmaW5lZCBieSBFY2xpcHNlTGluayBidXQgaXQgaXMgcmVxdWlyZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VyIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpncm91cCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpncm91cD4KLSAgICA8eHNkOmdyb3VwIG5hbWU9InN0cnVjdC1jb252ZXJ0ZXJzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmdyb3VwPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2Ugb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSI1MCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIHByZWFsbG9jYXRpb24gc2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFJlZmVyZW5jZXMgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsIG92ZXJyaWRpbmcgaXRzIG5hbWUKLSAgICAgICAgICAgICAgICBhbmQgKG9wdGlvbmFsbHkpIHByZWFsbG9jYXRpb24gc2l6ZS4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVG8gdXNlIHByZWFsbG9jYXRpb24gc2l6ZSBvZiBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwKLSAgICAgICAgICAgICAgICBzZXQgcHJlYWxsb2NhdGlvbiBzaXplIHRvIDAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYXRpdmUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2Ugc2VxdWVuY2UgbWVjaGFuaXNtIHVzZWQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGFibGUgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfTkFNRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX0NPVU5UIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmFyeS10YWJsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVbmFyeSB0YWJsZSBzZXF1ZW5jZSAtIHNlcXVlbmNlIG5hbWUgaXMgYSB0YWJsZSBuYW1lLAotICAgICAgICAgICAgICAgIHRhYmxlIGhhcyBhIHNpbmdsZSBmaWVsZCBhbmQgYSBzaW5nbGUgcm93Ci0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbGZpbGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sZmlsZSBzZXF1ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbCBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9OQU1FIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZWxlbWVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHdoaWNoIGRvY3VtZW50IHByZXNlcnZhdGlvbgotICAgICAgICAJCXN0cmF0ZWd5IHdpbGwgYmUgdXNlZC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgCQk8eHNkOmVsZW1lbnQgbmFtZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiCi0gICAgCQkJdHlwZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4KLSAgICAJCTwveHNkOmVsZW1lbnQ+Ci0gICAgCTwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgCTx4c2Q6YW5ub3RhdGlvbj4KLSAgICAJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJCQlUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHdoaWNoIG5vZGUgb3JkZXJpbmcgc3RyYXRlZ3kgd2lsbAotICAgIAkJCWJlIHVzZWQuCi0gICAgCQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIAk8L3hzZDphbm5vdGF0aW9uPjwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZQotICAgIAluYW1lPSJkZXNjcmlwdG9yLWxldmVsLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgRG9jdW1lbnRQcmVzZXJ2YXRpb24gUG9saWN5IHRoYXQKLSAgICAgICAgCQlhY2Nlc3NlcyB0aGUgc2Vzc2lvbiBjYWNoZSB0byBzdG9yZSBPYmplY3RzIGFuZCB0aGVpcgotICAgICAgICAJCWFzc29jaWF0ZWQgbm9kZXMuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm8tZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBIERvY3VtZW50UHJlc2VydmF0aW9uUG9saWN5IHRvIGluZGljYXRlIHRoYXQgbm8KLSAgICAgICAgCQlkb2N1bWVudCBwcmVzZXJ2YXRpb24gd29yayBzaG91bGQgYmUgZG9uZS4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluZGVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBEb2N1bWVudFByZXNlcnZhdGlvblBvbGljeSB0aGF0Ci0gICAgICAgIAkJbWFpbnRhaW5zIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIEphdmEKLSAgICAgICAgCQlPYmplY3RzIGFuZCB0aGUgWE1MTm9kZXMgdGhleSBvcmlnaW5hdGVkIGZyb20uCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwZW5kLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgTm9kZU9yZGVyaW5nUG9saWN5IHRoYXQgc2ltcGx5Ci0gICAgICAgIAkJYXBwZW5kcyB0aGUgbmV3IGNoaWxkIGVsZW1lbnQgdG8gdGhlIHBhcmVudC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWdub3JlLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgTm9kZU9yZGVyaW5nUG9saWN5IHRoYXQgaWdub3JlcyBhbnkKLSAgICAgICAgCQluZXcgZWxlbWVudHMgd2hlbiB1cGRhdGluZyBhIGNhY2hlZCBkb2N1bWVudC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpdmUtcG9zaXRpb24tb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIE5vZGVPcmRlcmluZ1BvbGljeSB0aGF0IGFkZHMgbmV3Ci0gICAgICAgIAkJZWxlbWVudHMgdG8gYW4gWE1MIERvY3VtZW50IGJhc2VkIG9uIHRoZSBsYXN0IHVwZGF0ZWQKLSAgICAgICAgCQlzaWJsaW5nIGluIHRoZWlyIGNvbnRleHQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMi54c2QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ODI0MjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gZnJvbSBPcmFjbGUgVG9wTGluawotICAgICB0d2FyZSAtIHVwZGF0ZSB2ZXJzaW9uIG51bWJlciB0byAxLjIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgCi0tLT4KLTwhLS0gCi0KLVhNTCBTY2hlbWEgZGVmaW5pdGlvbiBmb3IgdGhlIEVjbGlwc2UgUGVyc2lzdGVuY2UgU2VydmljZXMgUHJvamVjdCBTZXNzaW9uIENvbmZpZ3VyYXRpb24gZmlsZS4gSW5zdGFuY2VzCi1vZiB0aGlzIGZpbGUgYXJlIHR5cGljYWxseSBsb2NhdGVkIGFzOiAnTUVUQS1JTkYvc2Vzc2lvbnMueG1sJwotCi0gLS0+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHZlcnNpb249IjEuMiI+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb25zIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHJvb3QgZWxlbWVudCBhbmQgZXhpc3RzIG9ubHkgZm9yIFhNTAotICAgICAgICAgICAgICAgIHN0cnVjdHVyZQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24iIHR5cGU9InNlc3Npb24iIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgbm9kZSBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIGEgcGFydGljdWxhciBzZXNzaW9uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJpYyBlbGVtZW50IHVzZWQgdG8gZGVzY3JpYmUgYSBzdHJpbmcgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyB0aGUgbmFtZSBvZiBhbiBpdGVtCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmVyLXBsYXRmb3JtIiB0eXBlPSJzZXJ2ZXItcGxhdGZvcm0iCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlLWNvbW1hbmQiPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIGVsZW1lbnQgdGhhdCBkZWZpbmUgdGhlIFJlbW90ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQgTW9kdWxlIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZSBzeW5jaHJvbml6YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFubmVsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBkZWZhdWx0PSJFY2xpcHNlTGlua0NvbW1hbmRDaGFubmVsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21tYW5kcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgcmVtb3RlLWNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZXRlcm1pbmUgd2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZmVhdHVyZXMsIHRoZSBSQ00KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLXN5bmMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGVsZW1lbnQuIEl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybnMgb24gY2FjaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6YXRpb24gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvdyBzZW5kaW5nIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZyBjYWNoZSBzeW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InRyYW5zcG9ydC1tYW5hZ2VyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRlZmluZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZiB0aGUgUkNNLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBSTUkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb2ZpbGVyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHJlcHJlc2VudHMgaWYgdGhlIHByb2ZpbGVyIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYnkgdGhlIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRtcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVjbGlwc2VsaW5rIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24taGFuZGxlci1jbGFzcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgY2xhc3MgdGhhdCB0aGUgc2Vzc2lvbiB3aWxsIHVzZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlIGV4Y2VwdGlvbnMgZ2VuZXJhdGVkIGZyb20gd2l0aGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmciIHR5cGU9ImxvZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvZ2dpbmcgb3B0aW9ucwotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tY3VzdG9taXplci1jbGFzcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgc2Vzc2lvbiBjdXN0b21pemVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyB0byBydW4gb24gYSBsb2FkZWQgc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgbm9kZSBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdoaWNoIHNlcnZlcgotICAgICAgICAgICAgICAgIHBsYXRmb3JtIHRvIHVzZSwgSlRBIHNldHRpbmdzIGFuZCBydW50aW1lIHNlcnZpY2VzCi0gICAgICAgICAgICAgICAgc2V0dGluZ3MKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLXJ1bnRpbWUtc2VydmljZXMiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSBKTVggTUJlYW4gZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRpbmcgcnVudGltZSBzZXJ2aWNlcyBpcyBkZXBsb3llZC4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGUtanRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIHNlc3Npb24gd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyYXRlIHdpdGggdGhlIEpUQSAoaS5lLiB3aGV0aGVyIHRoZSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGEgdHJhbnNhY3Rpb24gY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MuIFRoZSBjaG9pY2Ugb2Ygc2VydmVyLWNsYXNzIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYmUgY2hvc2VuIGJhc2VkIG9uIHRoZSB0cmFuc2FjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5zZXJ2ZXIuQ3VzdG9tU2VydmVyUGxhdGZvcm0iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgc3ViY2xhc3Mgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uc2VydmVyLlBsYXRmb3JtQmFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzcGVjaWZ5IHdoaWNoIHNlcnZlciBwbGF0Zm9ybSB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJleHRlcm5hbC10cmFuc2FjdGlvbi1jb250cm9sbGVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotOTAzLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTkwNC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMDEyLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTEwMTMtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTExMS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy02MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtNzAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTgxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy05LXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy0xMC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTQwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNTAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS01MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTYwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNjEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Impib3NzLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWJyb2tlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBQcm92aWRlcyBhIHNpbmdsZSB2aWV3IHRvIGEgc2Vzc2lvbiB0aGF0Ci0gICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRseSBhY2Nlc3NlcyBtdWx0cGxlIGRhdGFiYXNlcy4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icHJvamVjdCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4bWwiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InByb2plY3QiIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2xhc3MiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InByb2plY3QiIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLXNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhlIHNlc3Npb24gaXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlIGludG8gRWNsaXBzZUxpbmssIHRoZQotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNob3VsZCBkbyBhbGwgb2YgaXRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgb2YKLSAgICAgICAgICAgICAgICBvYmplY3RzIHRocm91Z2ggdGhlIHNlc3Npb24uIFRoZSBzZXNzaW9uIGFsc28gbWFuYWdlcwotICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucyBhbmQgdW5pdHMgb2Ygd29yay4gVGhlIGRhdGFiYXNlIHNlc3Npb24gaXMKLSAgICAgICAgICAgICAgICBpbnRlbmRlZCBmb3IgdXNhZ2UgaW4gdHdvLXRpZXIgY2xpZW50LXNlcnZlcgotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9ucy4gQWx0aG91Z2ggaXQgY291bGQgYmUgdXNlZCBpbiBhIHNlcnZlcgotICAgICAgICAgICAgICAgIHNpdHVhdGlvbiwgaXQgaXMgbGltaXR0ZWQgdG8gb25seSBoYXZpbmcgYSBzaW5nbGUKLSAgICAgICAgICAgICAgICBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBvbmx5IGFsbG93cyBhIHNpbmdsZSBvcGVuCi0gICAgICAgICAgICAgICAgZGF0YWJhc2UgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnktcHJvamVjdCIgdHlwZT0icHJvamVjdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHByb2plY3QgKGNsYXNzIG9yIHhtbCkgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQgYXMgdGhlIHByaW1hcnkgcHJvamVjdCBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZGRpdGlvbmFsLXByb2plY3QiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJwcm9qZWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWwgcHJvamVjdHMgd2lsbCBoYXZlIHRoZWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzIGFwcGVuZGVkIHRvIHRoZSBwcmltYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbiIgdHlwZT0ibG9naW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLXNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgSXMgYW4gZXh0ZW5zaW9uIG9mIGEgRGF0YWJhc2VTZXNzaW9uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2Utc2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbHMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBwb29scyBhcmUgb25seSBmb3IgdXNhZ2Ugd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBjb25uZWN0aW9uIHBvb2xpbmcgYW5kIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYmUgdXNlZCBpZiB1c2luZyBleHRlcm5hbCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWQtY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ3cml0ZS1jb25uZWN0aW9uLXBvb2wiIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJzZXF1ZW5jZS1jb25uZWN0aW9uLXBvb2wiIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhpcyB0YWcgdG8gdXNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBjb25uZWN0aW9uIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb2xpY3kiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjb25uZWN0aW9uLXBvbGljeSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSBob3cgZGVmYXVsdCBjbGllbnQgc2Vzc2lvbnMgYXJlIGFjcXVpcmVkCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1c2l2ZS1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBpZiBhbiBleGNsdXNpdmUgY29ubmVjdGlvbiBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIHJlYWRzLCByZXF1aXJlZCBmb3IgVlBELCBvciB1c2VyIGJhc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkIHNlY3VyaXR5LgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxhenkiIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgaWYgYSBjb25uZWN0aW9uIHNob3VsZCBiZSBhY3F1aXJlZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlbGQgdXBmcm9udCBpbiB0aGUgY2xpZW50IHNlc3Npb24sIG9yIG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkIHdoZW4gbmVlZGVkIGFuZCB0aGVuIHJlbGVhc2VkLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgY29tbW9uIGZpZWxkcyBmb3IgZGF0YWJhc2UtbG9naW4gYW5kIGVpcy1sb2dpbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbGF0Zm9ybS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIHBsYXRmb3JtCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBuYW1lCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvbi1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5zZWN1cml0eS5KQ0VFbmNyeXB0b3IiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLXF1YWxpZmllciIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSBkZWZhdWx0IHF1YWxpZmllciBmb3IgYWxsIHRhYmxlcy4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHRoZSBjcmVhdG9yIG9mIHRoZSB0YWJsZSBvciBkYXRhYmFzZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFibGUgZXhpc3RzIG9uLiBUaGlzIGlzIHJlcXVpcmVkIGJ5IHNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlcyBzdWNoIGFzIE9yYWNsZSBhbmQgREIyLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVybmFsLWNvbm5lY3Rpb24tcG9vbGluZyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgdXNlIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBjb25uZWN0aW9uIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlcm5hbC10cmFuc2FjdGlvbi1jb250cm9sbGVyIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgdGhlIHNlc3Npb24gd2lsbCBiZSB1c2luZyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgdHJhbnNhY3Rpb24gY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jaW5nIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InNlcXVlbmNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBzZXF1ZW5jZS4gVGhlIG5hbWUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsLiBJZiBubyBuYW1lIHByb3ZpZGVkIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSBzdHJpbmcgd2lsbCBiZSB1c2VkIGFzIGEgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb24gZGVmYXVsdCBzZXF1ZW5jZXMuIE1ha2Ugc3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBzZXF1ZW5jZSBoYXMgdW5pcXVlIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InNlcXVlbmNlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIGEgbG9naW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyB1c2VkIHRvIGRlZmluZSBleHRyYSBwcm9wZXJ0aWVzIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgbG9naW4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIEhvbGRzIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBjb25uZWN0Ci0gICAgICAgICAgICAgICAgdG8gYSBKREJDIGRyaXZlci4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRyaXZlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZHJpdmVyIGNsYXNzIGlzIHRoZSBKYXZhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgZm9yIHRoZSBKREJDIGRyaXZlciB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgKGUuZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW4uamRiYy5vZGJjLkpkYmNPZGJjRHJpdmVyLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBVUkwgdGhhdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGFzb3VyY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgVVJMIG9mIGEgZGF0YXNvdXJjZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgdXNlZCBieSB0aGUgc2Vzc2lvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsb29rdXAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Imxvb2t1cC1lbnVtIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gYmluZCBhbGwgYXJndW1lbnRzIHRvIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwgc3RhdGVtZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtYWxsLXN0YXRlbWVudHMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciBwcmVwYXJlZCBzdGF0ZW1lbnRzIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWNoZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJieXRlLWFycmF5LWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgYmluZGluZyBmb3IgbGFyZ2UgYmluYXJ5IGRhdGEuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgRWNsaXBzZUxpbmsgd2lsbCBwcmludCB0aGlzIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgaGV4IHRocm91Z2ggdGhlIEpEQkMgYmluYXJ5IGV4Y2FwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UuIEJvdGggYmluZGluZyBhbmQgcHJpbnRpbmcgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpb3VzIGxpbWl0cyBvbiBhbGwgZGF0YWJhc2VzIChlLmcuIDVrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMzJrKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmluZy1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgc3RyaW5ncyBzaG91bGQgYmUgYm91bmQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgdG8gaGVscCBiZWFuIGludHJvc3BlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJlYW1zLWZvci1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIHN0cmVhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3RvcmUgbGFyZ2UgYmluYXJ5IGRhdGEuIFRoaXMgY2FuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJvdmUgdGhlIG1heCBzaXplIGZvciByZWFkaW5nL3dyaXRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gc29tZSBKREJDIGRyaXZlcnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JjZS1maWVsZC1uYW1lcy10by11cHBlci1jYXNlIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBzZXR0aW5nIGNhbiBiZSB1c2VkIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBleHBlY3RzIHVwcGVyIGNhc2UgYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBkb2VzIG5vdCByZXR1cm4gY29uc2lzdGVudCBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIGRpZmZlcmVudCBkYXRhYmFzZXMpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pemUtZGF0YS1jb252ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciBkcml2ZXIgbGV2ZWwgZGF0YSBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbiBpcyBlbmFibGVkLiBUaGlzIGNhbiBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCBhcyBzb21lIGRyaXZlcnMgcGVyZm9ybSBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gdGhlbXNlbHZlcyBpbmNvcnJlY3RseS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyaW0tc3RyaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBDSEFSIGZpZWxkIHZhbHVlcyBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nIGJsYW5rcyB0cmltbWVkLCB0aGlzIGNhbiBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtd3JpdGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nLiBUaGlzIGZhY2lsaXR5IGFsbG93cyBtdWx0aXBsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSBvcGVyYXRpb25zIHRvIGJlIHN1Ym1pdHRlZCB0byBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIGZvciBwcm9jZXNzaW5nIGF0IG9uY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1pdHRpbmcgbXVsdGlwbGUgdXBkYXRlcyB0b2dldGhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBpbmRpdmlkdWFsbHksIGNhbiBncmVhdGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJvdmUgcGVyZm9ybWFuY2UgaW4gc29tZSBzaXR1YXRpb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamRiYy1iYXRjaC13cml0aW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nIHRoaXMgdGFnIHdpdGggdHJ1ZSBpbmRpY2F0ZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgdGhhdCB0aGUgSkRCQyBkcml2ZXIgc3VwcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggd3JpdGluZy4gRWNsaXBzZUxpbmsncyBpbnRlcm5hbCBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nIGlzIGRpc2FibGVkLiBTZXR0aW5nIHRoaXMgdGFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggZmFsc2UgaW5kaWNhdGVzIHRvIEVjbGlwc2VMaW5rIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZy4gVGhpcyB3aWxsIHJldmVydCB0byB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvdXIgd2hpY2ggaXMgdG8gZGVsZWdhdGUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsncyBpbnRlcm5hbCBiYXRjaCB3cml0aW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWF4LWJhdGNoLXdyaXRpbmctc2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIzMjAwMCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93IGZvciB0aGUgbWF4IGJhdGNoIHdyaXRpbmcgc2l6ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQuIFRoaXMgYWxsb3dzIGZvciB0aGUgYmF0Y2ggc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBsaW1pdGVkIGFzIG1vc3QgZGF0YWJhc2UgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3QgbGltaXRzLiBUaGUgc2l6ZSBpcyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLCB0aGUgZGVmYXVsdCBpcyAzMjAwMCBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWwgdmFsdWUgZGVwZW5kcyBvbiB0aGUgZGF0YWJhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hdGl2ZS1zcWwiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2Ugc3BlY2lmaWMgc3FsIGdyYW1tYXIgbm90IEpEQkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMuIFRoaXMgaXMgYmVjYXVzZSB1bmZvcnR1bmF0ZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWUgYnJpZGdlcyB0byBub3Qgc3VwcG9ydCB0aGUgZnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKREJDIHN0YW5kYXJkLiBCeSBkZWZhdWx0IEVjbGlwc2VMaW5rIHVzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEpEQkMgc3FsIGdyYW1tYXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVycyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJzdHJ1Y3QtY29udmVydGVycyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1oZWFsdGgtdmFsaWRhdGVkLW9uLWVycm9yIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgdHJ1ZSB3aWxsIGNhdXNlIEVjbGlwc2VMaW5rIHRvIHBpbmcgZGF0YWJhc2UgdG8gZGV0ZXJtaW5lIGlmIGFuIFNRTEV4Y2VwdGlvbiB3YXMgY2F1c2UgYnkgYSBjb21tdW5pY2F0aW9uIGZhaWx1cmU8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5LXJldHJ5LWF0dGVtcHQtY291bnQiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIG51bWJlciBvZiBhdHRlbXB0cyBFY2xpcHNlTGluayB3aWxsIG1ha2UgaWYgRWNsaXBzZUxpbmsgaXMgYXR0ZW1wdGluZyB0byByZXRyeSBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZGVsYXktYmV0d2Vlbi1yZWNvbm5lY3QtYXR0ZW1wdHMiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIHRpbWUgaW4gbWlsaXNlY29uZHMgdGhhdCBFY2xpcHNlTGluayB3aWxsIHdhaXQgYmV0d2VlbiBhdHRlbXB0cyB0byByZWNvbm5lY3QgaWYgRWNsaXBzZUxpbmsgaXMgYXR0ZW1wdGluZyB0byByZXRyeSBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icGluZy1zcWwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk92ZXJyaWRlIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBTUUwgdGhhdCBFY2xpcHNlTGluayB3aWxsIGlzc3VlIHRvIGEgY29ubmVjdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgbGl2ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Imxvb2t1cC1lbnVtIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZS1uYW1lIiAvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG91bmQtbmFtZSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gYW5kIGRhdGFzb3VyY2UKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLiBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byBjb25uZWN0IHRocm91Z2ggRUlTLAotICAgICAgICAgICAgICAgIC0gUHJvdmlkZSBhIEpOREkgbmFtZSB0byB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgYW5kIHVzZQotICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IGdldENvbm5lY3Rpb24gLSBQcm92aWRlIGEgSk5ESSBuYW1lIHRvIHRoZQotICAgICAgICAgICAgICAgIENvbm5lY3Rpb25GYWN0b3J5LCBhbmQgYSBkcml2ZXIgc3BlY2lmaWMgQ29ubmVjdGlvblNwZWMKLSAgICAgICAgICAgICAgICB0byBwYXNzIHRvIHRoZSBnZXRDb25uZWN0aW9uIC0gQ29ubmVjdCBpbiBhIG5vbi1tYW5hZ2VkCi0gICAgICAgICAgICAgICAgd2F5IGRpcmVjdGx5IHRvIHRoZSBkcml2ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgQW4KLSAgICAgICAgICAgICAgICBFSVNDb25uZWN0aW9uU3BlYyBtdXN0IGJlIHByb3ZpZGVkIHRvIGRlZmluZSBob3cgdG8KLSAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBFSVMgYWRhcHRlci4gVGhlIEVJUyBwbGF0Zm9ybSBjYW4gYmUgdXNlZAotICAgICAgICAgICAgICAgIHRvIHByb3ZpZGUgZGF0YXNvdXJjZS9kcml2ZXIgc3BlY2lmaWMgYmVoYXZvaXIgc3VjaCBhcwotICAgICAgICAgICAgICAgIEludGVyYWN0aW9uU3BlYyBhbmQgUmVjb3JkIGNvbnZlcnNpb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXNwZWMtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWZhY3RvcnktdXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1sb2dpbiI+Ci0gICAgCTx4c2Q6YW5ub3RhdGlvbj4KLSAgICAJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJCQlEZWZpbmVzIGxvZ2luIGFuZCBwbGF0Zm9ybSB0eXBlIHRvIGJlIHVzZWQKLSAgICAJCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCTwveHNkOmFubm90YXRpb24+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgCQkJPHhzZDpzZXF1ZW5jZT4KLSAgICAJCQkJPHhzZDplbGVtZW50IG5hbWU9ImVxdWFsLW5hbWVzcGFjZS1yZXNvbHZlcnMiCi0gICAgCQkJCQl0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiPgotICAgIAkJCQk8L3hzZDplbGVtZW50PgotICAgIAkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSIKLSAgICAJCQkJCW1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIgotICAgIAkJCQkJdHlwZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0KLSAgICAJCQkJPC94c2Q6ZWxlbWVudD4KLSAgICAJCQk8L3hzZDpzZXF1ZW5jZT4KLSAgICAJCTwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLXBvb2wiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IGhvdyBjb25uZWN0aW9ucyBzaG91bGQgYmUgcG9vbGVkIGluIGEKLSAgICAgICAgICAgICAgICBzZXJ2ZXIgc2Vzc2lvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtY29ubmVjdGlvbnMiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4IG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgaW4gdGhlIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW4tY29ubmVjdGlvbnMiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWluIG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IHdpbGwgYXdheXMgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4iIHR5cGU9ImxvZ2luIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhlIHJlYWQgY29ubmVjdGlvbiBwb29sIGlzIHVzZWQgZm9yIHJlYWQgYWNjZXNzIHRocm91Z2gKLSAgICAgICAgICAgICAgICB0aGUgc2VydmVyIHNlc3Npb24uIEFueSBvZiB0aGUgY29ubmVjdGlvbiBwb29scyBjYW4gYmUKLSAgICAgICAgICAgICAgICB1c2VkIGZvciB0aGUgcmVhZCBwb29sIGhvd2V2ZXIgdGhpcyBpcyB0aGUgZGVmYXVsdC4gVGhpcwotICAgICAgICAgICAgICAgIHBvb2wgYWxsb3dzIGZvciBjb25jdXJyZW50IHJlYWRzIGFnYWluc3QgdGhlIHNhbWUgSkRCQwotICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gYW5kIHJlcXVpcmVzIHRoYXQgdGhlIEpEQkMgY29ubmVjdGlvbiBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgY29uY3VycmVudCByZWFkIGFjY2Vzcy4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb25uZWN0aW9uLXBvb2wiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdXNpdmUiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zIGZyb20gdGhlIHJlYWQgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sIGFyZSBleGNsdXNpdmUgb3Igbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGNvbW1vbiBsb2dnaW5nIG9wdGlvbnMKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBKYXZhIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmctb3B0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImxvZ2dpbmctb3B0aW9ucyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVjbGlwc2VsaW5rLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBFY2xpcHNlTGluayBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2ctbGV2ZWwiIGRlZmF1bHQ9ImluZm8iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgbG9nIGxldmVsIGZvciBsb2dnaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib2ZmIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZXZlcmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Indhcm5pbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImluZm8iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbmZpZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmVzdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBmaWxlIHRvIHdyaXRlIHRoZSBsb2dnaW5nIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb2dnaW5nLW9wdGlvbnMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIFNlcnZlciBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9nZ2luZy1vcHRpb25zIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2ctZXhjZXB0aW9uLXN0YWNrdHJhY2UiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGV4Y2VwdGlvbiBzdGFja3RyYWNlLiBXaXRob3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGVsZW1lbnQsIHRoZSBzdGFja3RyYWNlIGlzIGxvZ2dlZCBmb3IgRklORVIKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yIGxlc3MgKEZJTkVTVCkKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC10aHJlYWQiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIHRocmVhZC4gV2l0aG91dCB0aGlzIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGhyZWFkIGlzIGxvZ2dlZCBmb3IgRklORSBvciBsZXNzIChGSU5FUiBvcgotICAgICAgICAgICAgICAgICAgICAgICAgRklORVNUKQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LXNlc3Npb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgc2Vzc2lvbi4gV2l0aG91dCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCB0aGUgc2Vzc2lvbiBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgY29ubmVjdGlvbi4gV2l0aG91dCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCB0aGUgY29ubmVjdGlvbiBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LWRhdGUiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgZGF0ZS4gV2l0aG91dCB0aGlzIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0ZSBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mIHRoZSBSQ00uCi0gICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG1lY2hhbmlzbSBpcyBSTUkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib24tY29ubmVjdGlvbi1lcnJvciIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJEaXNjYXJkQ29ubmVjdGlvbiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBhbmQgaGFzIHZhbHVlIG9mICJEaXNjYXJkQ29ubmVjdGlvbiIgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICJLZWVwQ29ubmVjdGlvbiIuIEl0IGRldGVybWluZXMgd2hldGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiB0byBhIFJDTSBzZXJ2aWNlIHNob3VsZCBiZSBkcm9wcGVkIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhIGNvbW11bmljYXRpb24gZXJyb3Igd2l0aCB0aGF0IFJDTQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2NhcmRDb25uZWN0aW9uIi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlZXBDb25uZWN0aW9uIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2FyZENvbm5lY3Rpb24iIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJtaS10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGVmaW5lcyB0aGUgUk1JIHRyYW5zcG9ydCBtZWNoYW5pc20uIFRoZQotICAgICAgICAgICAgICAgIGRlZmF1bHQgbmFtaW5nIHNlcnZpY2UgaXMgSk5ESQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VuZC1tb2RlIiBkZWZhdWx0PSJBc3luY2hyb25vdXMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1pIGVsZW1lbnQgYW5kIGhhcyB2YWx1ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIiBvciAiU3luY2hyb25vdXMiLiBJdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIFJDTSBwcm9wYWdhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgYW5kIGRvZXMgbm90IHdhaXQgZm9yIGNvbW1hbmQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoIGl0cyBleGVjdXRpb24gaW4gYXN5bmNocm9ub3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgb3Igd2FpdCBmb3IgY29tbWFuZCB0byBmaW5pc2ggaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBpbiBzeW5jaHJvbm91cyBtb2RlLiBUaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXN5bmNocm9ub3VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW5jaHJvbm91cyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjb3ZlcnkiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWkgZWxlbWVudC4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3Zlcnkgc2V0dGluZ3Mgc2hvdWxkIGJlIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBhIGRlZmF1bHQgRGlzY292ZXJ5IHdpdGggaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgc2V0dGluZ3MgaXMgY3JlYXRlZCB3aGVuIHRoZSBybWkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBpcyBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibXVsdGljYXN0LWdyb3VwLWFkZHJlc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSIyMjYuMTAuMTIuNjQiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpY2FzdC1wb3J0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjMxMjEiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFubm91bmNlbWVudC1kZWxheSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIxMDAwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBtdWx0aWNhc3QgZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBzaG91bGQgYmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGlzICIxMDAwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2V0LXRpbWUtdG8tbGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSB0aW1lLXRvLWxpdmUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhY2tldHMgdGhhdCBhcmUgc2VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBEaXNjb3ZlcnkncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWxzdGljYXN0IHNvY2tldCBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC4gVGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBlbGVtZW50IGlzICIyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqbmRpLW5hbWluZy1zZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icm1pLXJlZ2lzdHJ5LW5hbWluZy1zZXJ2aWNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBybWkgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIFJNSSByZWdpc3RyeSBzaG91bGQgYmUgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWluZyBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJtaS1paW9wLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgUk1JLUlJT1AgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZgotICAgICAgICAgICAgICAgIHRoZSBSQ00uIFRoZSBkZWZhdWx0IG5hbWluZyBzZXJ2aWNlIGlzIEpOREkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJybWktdHJhbnNwb3J0IiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imptcy10b3BpYy10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIEpNUyB0b3BpYyB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtaG9zdC11cmwiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1jb25uZWN0aW9uLWZhY3RvcnktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9Imptcy9FY2xpcHNlTGlua1RvcGljQ29ubmVjdGlvbkZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iam1zL0VjbGlwc2VMaW5rVG9waWMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqbmRpLW5hbWluZy1zZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotamdyb3Vwcy10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIE9DNEogSkdyb3VwcyB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBtZWNoYW5pc20gb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlLXNpbmdsZS10aHJlYWRlZC1ub3RpZmljYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3VuLWNvcmJhLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgU3VuIENPUkJBIHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXNlci1kZWZpbmVkLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgYSB1c2VyIGltcGxlbWVudGVkCi0gICAgICAgICAgICAgICAgdHJhbnNwb3J0IG1lY2hhbmlzbSB0aGF0IHNob3VsZCBiZSB1c2VkLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgVVJMIGZvciBuYW1pbmcgc2VydmljZSBzaG91bGQgYmUgY2hhbmdlZC4gCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImFkbWluIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvbi1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5zZWN1cml0eS5KQ0VFbmNyeXB0b3IiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InBhc3N3b3JkIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8IS0tICBUT0RPOiBOZWVkIHRvIGhhdmUgYSBub24gV2ViTG9naWMgKHByZXZpb3VzbHkgT0M0SikgZGVmYXVsdCBvciByb3V0ZSB0aHJvdWdoIHNlcnZlciBwbGF0Zm9ybSBieSBkZWZhdWx0IC0tPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXRpYWwtY29udGV4dC1mYWN0b3J5LW5hbWUiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ3ZWJsb2dpYy5qbmRpLldMSW5pdGlhbENvbnRleHRGYWN0b3J5IgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbCBjb250ZXh0IGZhY3RvcnkgY2xhc3MgZm9yIG5hbWluZyBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2hhbmdlZC4gCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1pbmcgc2VydmljZSByZXF1aXJlcyBleHRyYSBwcm9wZXJ0eSB0aGF0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBub3QgZGVmaW5lZCBieSBFY2xpcHNlTGluayBidXQgaXQgaXMgcmVxdWlyZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VyIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpncm91cCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpncm91cD4KLSAgICA8eHNkOmdyb3VwIG5hbWU9InN0cnVjdC1jb252ZXJ0ZXJzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmdyb3VwPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2Ugb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSI1MCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIHByZWFsbG9jYXRpb24gc2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFJlZmVyZW5jZXMgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsIG92ZXJyaWRpbmcgaXRzIG5hbWUKLSAgICAgICAgICAgICAgICBhbmQgKG9wdGlvbmFsbHkpIHByZWFsbG9jYXRpb24gc2l6ZS4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVG8gdXNlIHByZWFsbG9jYXRpb24gc2l6ZSBvZiBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwKLSAgICAgICAgICAgICAgICBzZXQgcHJlYWxsb2NhdGlvbiBzaXplIHRvIDAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYXRpdmUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2Ugc2VxdWVuY2UgbWVjaGFuaXNtIHVzZWQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGFibGUgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfTkFNRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX0NPVU5UIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmFyeS10YWJsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVbmFyeSB0YWJsZSBzZXF1ZW5jZSAtIHNlcXVlbmNlIG5hbWUgaXMgYSB0YWJsZSBuYW1lLAotICAgICAgICAgICAgICAgIHRhYmxlIGhhcyBhIHNpbmdsZSBmaWVsZCBhbmQgYSBzaW5nbGUgcm93Ci0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbGZpbGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sZmlsZSBzZXF1ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbCBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9OQU1FIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZWxlbWVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHdoaWNoIGRvY3VtZW50IHByZXNlcnZhdGlvbgotICAgICAgICAJCXN0cmF0ZWd5IHdpbGwgYmUgdXNlZC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgCQk8eHNkOmVsZW1lbnQgbmFtZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiCi0gICAgCQkJdHlwZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4KLSAgICAJCTwveHNkOmVsZW1lbnQ+Ci0gICAgCTwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgCTx4c2Q6YW5ub3RhdGlvbj4KLSAgICAJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJCQlUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHdoaWNoIG5vZGUgb3JkZXJpbmcgc3RyYXRlZ3kgd2lsbAotICAgIAkJCWJlIHVzZWQuCi0gICAgCQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIAk8L3hzZDphbm5vdGF0aW9uPjwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZQotICAgIAluYW1lPSJkZXNjcmlwdG9yLWxldmVsLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgRG9jdW1lbnRQcmVzZXJ2YXRpb24gUG9saWN5IHRoYXQKLSAgICAgICAgCQlhY2Nlc3NlcyB0aGUgc2Vzc2lvbiBjYWNoZSB0byBzdG9yZSBPYmplY3RzIGFuZCB0aGVpcgotICAgICAgICAJCWFzc29jaWF0ZWQgbm9kZXMuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm8tZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBIERvY3VtZW50UHJlc2VydmF0aW9uUG9saWN5IHRvIGluZGljYXRlIHRoYXQgbm8KLSAgICAgICAgCQlkb2N1bWVudCBwcmVzZXJ2YXRpb24gd29yayBzaG91bGQgYmUgZG9uZS4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluZGVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBEb2N1bWVudFByZXNlcnZhdGlvblBvbGljeSB0aGF0Ci0gICAgICAgIAkJbWFpbnRhaW5zIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIEphdmEKLSAgICAgICAgCQlPYmplY3RzIGFuZCB0aGUgWE1MTm9kZXMgdGhleSBvcmlnaW5hdGVkIGZyb20uCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwZW5kLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgTm9kZU9yZGVyaW5nUG9saWN5IHRoYXQgc2ltcGx5Ci0gICAgICAgIAkJYXBwZW5kcyB0aGUgbmV3IGNoaWxkIGVsZW1lbnQgdG8gdGhlIHBhcmVudC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWdub3JlLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgTm9kZU9yZGVyaW5nUG9saWN5IHRoYXQgaWdub3JlcyBhbnkKLSAgICAgICAgCQluZXcgZWxlbWVudHMgd2hlbiB1cGRhdGluZyBhIGNhY2hlZCBkb2N1bWVudC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpdmUtcG9zaXRpb24tb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIE5vZGVPcmRlcmluZ1BvbGljeSB0aGF0IGFkZHMgbmV3Ci0gICAgICAgIAkJZWxlbWVudHMgdG8gYW4gWE1MIERvY3VtZW50IGJhc2VkIG9uIHRoZSBsYXN0IHVwZGF0ZWQKLSAgICAgICAgCQlzaWJsaW5nIGluIHRoZWlyIGNvbnRleHQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMC54c2QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDgyMWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18yLjAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gZnJvbSBPcmFjbGUgVG9wTGluawotICAgICB0d2FyZSAtIHVwZGF0ZSB2ZXJzaW9uIG51bWJlciB0byAyLjAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgCi0tLT4KLTwhLS0gCi0KLVhNTCBTY2hlbWEgZGVmaW5pdGlvbiBmb3IgdGhlIEVjbGlwc2UgUGVyc2lzdGVuY2UgU2VydmljZXMgUHJvamVjdCBTZXNzaW9uIENvbmZpZ3VyYXRpb24gZmlsZS4gSW5zdGFuY2VzCi1vZiB0aGlzIGZpbGUgYXJlIHR5cGljYWxseSBsb2NhdGVkIGFzOiAnTUVUQS1JTkYvc2Vzc2lvbnMueG1sJwotCi0gLS0+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHZlcnNpb249IjIuMCI+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb25zIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHJvb3QgZWxlbWVudCBhbmQgZXhpc3RzIG9ubHkgZm9yIFhNTAotICAgICAgICAgICAgICAgIHN0cnVjdHVyZQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24iIHR5cGU9InNlc3Npb24iIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgbm9kZSBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIGEgcGFydGljdWxhciBzZXNzaW9uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJpYyBlbGVtZW50IHVzZWQgdG8gZGVzY3JpYmUgYSBzdHJpbmcgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyB0aGUgbmFtZSBvZiBhbiBpdGVtCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmVyLXBsYXRmb3JtIiB0eXBlPSJzZXJ2ZXItcGxhdGZvcm0iCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlLWNvbW1hbmQiPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIGVsZW1lbnQgdGhhdCBkZWZpbmUgdGhlIFJlbW90ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQgTW9kdWxlIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZSBzeW5jaHJvbml6YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFubmVsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBkZWZhdWx0PSJFY2xpcHNlTGlua0NvbW1hbmRDaGFubmVsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21tYW5kcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgcmVtb3RlLWNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZXRlcm1pbmUgd2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZmVhdHVyZXMsIHRoZSBSQ00KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLXN5bmMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGVsZW1lbnQuIEl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybnMgb24gY2FjaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6YXRpb24gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvdyBzZW5kaW5nIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZyBjYWNoZSBzeW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InRyYW5zcG9ydC1tYW5hZ2VyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRlZmluZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZiB0aGUgUkNNLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBSTUkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb2ZpbGVyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHJlcHJlc2VudHMgaWYgdGhlIHByb2ZpbGVyIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYnkgdGhlIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRtcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVjbGlwc2VsaW5rIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24taGFuZGxlci1jbGFzcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgY2xhc3MgdGhhdCB0aGUgc2Vzc2lvbiB3aWxsIHVzZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlIGV4Y2VwdGlvbnMgZ2VuZXJhdGVkIGZyb20gd2l0aGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmciIHR5cGU9ImxvZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvZ2dpbmcgb3B0aW9ucwotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tY3VzdG9taXplci1jbGFzcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgc2Vzc2lvbiBjdXN0b21pemVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyB0byBydW4gb24gYSBsb2FkZWQgc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgbm9kZSBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdoaWNoIHNlcnZlcgotICAgICAgICAgICAgICAgIHBsYXRmb3JtIHRvIHVzZSwgSlRBIHNldHRpbmdzIGFuZCBydW50aW1lIHNlcnZpY2VzCi0gICAgICAgICAgICAgICAgc2V0dGluZ3MKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLXJ1bnRpbWUtc2VydmljZXMiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSBKTVggTUJlYW4gZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRpbmcgcnVudGltZSBzZXJ2aWNlcyBpcyBkZXBsb3llZC4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGUtanRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIHNlc3Npb24gd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyYXRlIHdpdGggdGhlIEpUQSAoaS5lLiB3aGV0aGVyIHRoZSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGEgdHJhbnNhY3Rpb24gY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MuIFRoZSBjaG9pY2Ugb2Ygc2VydmVyLWNsYXNzIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYmUgY2hvc2VuIGJhc2VkIG9uIHRoZSB0cmFuc2FjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5zZXJ2ZXIuQ3VzdG9tU2VydmVyUGxhdGZvcm0iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgc3ViY2xhc3Mgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uc2VydmVyLlBsYXRmb3JtQmFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzcGVjaWZ5IHdoaWNoIHNlcnZlciBwbGF0Zm9ybSB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJleHRlcm5hbC10cmFuc2FjdGlvbi1jb250cm9sbGVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotOTAzLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTkwNC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMDEyLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTEwMTMtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTExMS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy02MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtNzAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTgxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy05LXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy0xMC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTQwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNTAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS01MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTYwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNjEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS03LXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYm9zcy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi1icm9rZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgUHJvdmlkZXMgYSBzaW5nbGUgdmlldyB0byBhIHNlc3Npb24gdGhhdAotICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50bHkgYWNjZXNzZXMgbXVsdHBsZSBkYXRhYmFzZXMuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InByb2plY3QiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieG1sIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJwcm9qZWN0IiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNsYXNzIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJwcm9qZWN0IiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1zZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoZSBzZXNzaW9uIGlzIHRoZSBwcmltYXJ5IGludGVyZmFjZSBpbnRvIEVjbGlwc2VMaW5rLCB0aGUKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBzaG91bGQgZG8gYWxsIG9mIGl0cyByZWFkaW5nIGFuZCB3cml0aW5nIG9mCi0gICAgICAgICAgICAgICAgb2JqZWN0cyB0aHJvdWdoIHRoZSBzZXNzaW9uLiBUaGUgc2Vzc2lvbiBhbHNvIG1hbmFnZXMKLSAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMgYW5kIHVuaXRzIG9mIHdvcmsuIFRoZSBkYXRhYmFzZSBzZXNzaW9uIGlzCi0gICAgICAgICAgICAgICAgaW50ZW5kZWQgZm9yIHVzYWdlIGluIHR3by10aWVyIGNsaWVudC1zZXJ2ZXIKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMuIEFsdGhvdWdoIGl0IGNvdWxkIGJlIHVzZWQgaW4gYSBzZXJ2ZXIKLSAgICAgICAgICAgICAgICBzaXR1YXRpb24sIGl0IGlzIGxpbWl0dGVkIHRvIG9ubHkgaGF2aW5nIGEgc2luZ2xlCi0gICAgICAgICAgICAgICAgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgb25seSBhbGxvd3MgYSBzaW5nbGUgb3BlbgotICAgICAgICAgICAgICAgIGRhdGFiYXNlIHRyYW5zYWN0aW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LXByb2plY3QiIHR5cGU9InByb2plY3QiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwcm9qZWN0IChjbGFzcyBvciB4bWwpIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkIGFzIHRoZSBwcmltYXJ5IHByb2plY3QgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRkaXRpb25hbC1wcm9qZWN0IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icHJvamVjdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIHByb2plY3RzIHdpbGwgaGF2ZSB0aGVpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycyBhcHBlbmRlZCB0byB0aGUgcHJpbWFyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4iIHR5cGU9ImxvZ2luIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1zZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIElzIGFuIGV4dGVuc2lvbiBvZiBhIERhdGFiYXNlU2Vzc2lvbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2xzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gcG9vbHMgYXJlIG9ubHkgZm9yIHVzYWdlIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgY29ubmVjdGlvbiBwb29saW5nIGFuZCBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGJlIHVzZWQgaWYgdXNpbmcgZXh0ZXJuYWwgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29saW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InJlYWQtY29ubmVjdGlvbi1wb29sIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0id3JpdGUtY29ubmVjdGlvbi1wb29sIiB0eXBlPSJjb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ic2VxdWVuY2UtY29ubmVjdGlvbi1wb29sIiB0eXBlPSJjb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoaXMgdGFnIHRvIHVzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgY29ubmVjdGlvbiBwb29sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjb25uZWN0aW9uLXBvb2wiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9saWN5IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iY29ubmVjdGlvbi1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgaG93IGRlZmF1bHQgY2xpZW50IHNlc3Npb25zIGFyZSBhY3F1aXJlZAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdXNpdmUtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgaWYgYW4gZXhjbHVzaXZlIGNvbm5lY3Rpb24gc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGZvciByZWFkcywgcmVxdWlyZWQgZm9yIFZQRCwgb3IgdXNlciBiYXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBzZWN1cml0eS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsYXp5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGlmIGEgY29ubmVjdGlvbiBzaG91bGQgYmUgYWNxdWlyZWQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBoZWxkIHVwZnJvbnQgaW4gdGhlIGNsaWVudCBzZXNzaW9uLCBvciBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCB3aGVuIG5lZWRlZCBhbmQgdGhlbiByZWxlYXNlZC4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIGNvbW1vbiBmaWVsZHMgZm9yIGRhdGFiYXNlLWxvZ2luIGFuZCBlaXMtbG9naW4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGxhdGZvcm0tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSBwbGF0Zm9ybQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgbmFtZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuY3J5cHRpb24tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuaW50ZXJuYWwuc2VjdXJpdHkuSkNFRW5jcnlwdG9yIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1xdWFsaWZpZXIiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGUgZGVmYXVsdCBxdWFsaWZpZXIgZm9yIGFsbCB0YWJsZXMuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSB0aGUgY3JlYXRvciBvZiB0aGUgdGFibGUgb3IgZGF0YWJhc2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhYmxlIGV4aXN0cyBvbi4gVGhpcyBpcyByZXF1aXJlZCBieSBzb21lCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZXMgc3VjaCBhcyBPcmFjbGUgYW5kIERCMi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlcm5hbC1jb25uZWN0aW9uLXBvb2xpbmciCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHVzZSBhbgotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgY29ubmVjdGlvbiBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZXJuYWwtdHJhbnNhY3Rpb24tY29udHJvbGxlciIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHRoZSBzZXNzaW9uIHdpbGwgYmUgdXNpbmcgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHRyYW5zYWN0aW9uIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2luZyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJzZXF1ZW5jZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgc2VxdWVuY2UuIFRoZSBuYW1lIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbC4gSWYgbm8gbmFtZSBwcm92aWRlZCBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkgc3RyaW5nIHdpbGwgYmUgdXNlZCBhcyBhIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2VzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uIGRlZmF1bHQgc2VxdWVuY2VzLiBNYWtlIHN1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggc2VxdWVuY2UgaGFzIHVuaXF1ZSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJzZXF1ZW5jZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiBhIGxvZ2luLgotICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgdXNlZCB0byBkZWZpbmUgZXh0cmEgcHJvcGVydGllcyBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBIb2xkcyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gY29ubmVjdAotICAgICAgICAgICAgICAgIHRvIGEgSkRCQyBkcml2ZXIuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkcml2ZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRyaXZlciBjbGFzcyBpcyB0aGUgSmF2YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIGZvciB0aGUgSkRCQyBkcml2ZXIgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIChlLmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuLmpkYmMub2RiYy5KZGJjT2RiY0RyaXZlci5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi11cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgVVJMIHRoYXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhc291cmNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIFVSTCBvZiBhIGRhdGFzb3VyY2UgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIHVzZWQgYnkgdGhlIHNlc3Npb24gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibG9va3VwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb29rdXAtZW51bSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJpbmQtYWxsLXBhcmFtZXRlcnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGJpbmQgYWxsIGFyZ3VtZW50cyB0byBhbnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1FMIHN0YXRlbWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLWFsbC1zdGF0ZW1lbnRzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgcHJlcGFyZWQgc3RhdGVtZW50cyBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FjaGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYnl0ZS1hcnJheS1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGJpbmRpbmcgZm9yIGxhcmdlIGJpbmFyeSBkYXRhLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IEVjbGlwc2VMaW5rIHdpbGwgcHJpbnQgdGhpcyBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGhleCB0aHJvdWdoIHRoZSBKREJDIGJpbmFyeSBleGNhcGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlLiBCb3RoIGJpbmRpbmcgYW5kIHByaW50aW5nIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaW91cyBsaW1pdHMgb24gYWxsIGRhdGFiYXNlcyAoZS5nLiA1awotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDMyaykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJpbmctYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHN0cmluZ3Mgc2hvdWxkIGJlIGJvdW5kLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VkIHRvIGhlbHAgYmVhbiBpbnRyb3NwZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyZWFtcy1mb3ItYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSBzdHJlYW1zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0b3JlIGxhcmdlIGJpbmFyeSBkYXRhLiBUaGlzIGNhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXByb3ZlIHRoZSBtYXggc2l6ZSBmb3IgcmVhZGluZy93cml0aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHNvbWUgSkRCQyBkcml2ZXJzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9yY2UtZmllbGQtbmFtZXMtdG8tdXBwZXItY2FzZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgc2V0dGluZyBjYW4gYmUgdXNlZCBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZXhwZWN0cyB1cHBlciBjYXNlIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgZG9lcyBub3QgcmV0dXJuIGNvbnNpc3RlbnQgY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiBkaWZmZXJlbnQgZGF0YWJhc2VzKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXplLWRhdGEtY29udmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgZHJpdmVyIGxldmVsIGRhdGEgY29udmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb24gaXMgZW5hYmxlZC4gVGhpcyBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgYXMgc29tZSBkcml2ZXJzIHBlcmZvcm0gZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIHRoZW1zZWx2ZXMgaW5jb3JyZWN0bHkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmltLXN0cmluZ3MiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgQ0hBUiBmaWVsZCB2YWx1ZXMgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZyBibGFua3MgdHJpbW1lZCwgdGhpcyBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLXdyaXRpbmciIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZy4gVGhpcyBmYWNpbGl0eSBhbGxvd3MgbXVsdGlwbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUgb3BlcmF0aW9ucyB0byBiZSBzdWJtaXR0ZWQgdG8gYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBmb3IgcHJvY2Vzc2luZyBhdCBvbmNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJtaXR0aW5nIG11bHRpcGxlIHVwZGF0ZXMgdG9nZXRoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgaW5kaXZpZHVhbGx5LCBjYW4gZ3JlYXRseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXByb3ZlIHBlcmZvcm1hbmNlIGluIHNvbWUgc2l0dWF0aW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpkYmMtYmF0Y2gtd3JpdGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZyB0aGlzIHRhZyB3aXRoIHRydWUgaW5kaWNhdGVzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIHRoYXQgdGhlIEpEQkMgZHJpdmVyIHN1cHBvcnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoIHdyaXRpbmcuIEVjbGlwc2VMaW5rJ3MgaW50ZXJuYWwgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZyBpcyBkaXNhYmxlZC4gU2V0dGluZyB0aGlzIHRhZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGZhbHNlIGluZGljYXRlcyB0byBFY2xpcHNlTGluayB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKREJDIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcuIFRoaXMgd2lsbCByZXZlcnQgdG8gdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3VyIHdoaWNoIGlzIHRvIGRlbGVnYXRlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rJ3MgaW50ZXJuYWwgYmF0Y2ggd3JpdGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1iYXRjaC13cml0aW5nLXNpemUiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMzIwMDAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvdyBmb3IgdGhlIG1heCBiYXRjaCB3cml0aW5nIHNpemUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2V0LiBUaGlzIGFsbG93cyBmb3IgdGhlIGJhdGNoIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgbGltaXRlZCBhcyBtb3N0IGRhdGFiYXNlIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0IGxpbWl0cy4gVGhlIHNpemUgaXMgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycywgdGhlIGRlZmF1bHQgaXMgMzIwMDAgYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsIHZhbHVlIGRlcGVuZHMgb24gdGhlIGRhdGFiYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYXRpdmUtc3FsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIHNwZWNpZmljIHNxbCBncmFtbWFyIG5vdCBKREJDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljLiBUaGlzIGlzIGJlY2F1c2UgdW5mb3J0dW5hdGVseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lIGJyaWRnZXMgdG8gbm90IHN1cHBvcnQgdGhlIGZ1bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRCQyBzdGFuZGFyZC4gQnkgZGVmYXVsdCBFY2xpcHNlTGluayB1c2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBKREJDIHNxbCBncmFtbWFyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlcnMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0ic3RydWN0LWNvbnZlcnRlcnMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24taGVhbHRoLXZhbGlkYXRlZC1vbi1lcnJvciIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIHRydWUgd2lsbCBjYXVzZSBFY2xpcHNlTGluayB0byBwaW5nIGRhdGFiYXNlIHRvIGRldGVybWluZSBpZiBhbiBTUUxFeGNlcHRpb24gd2FzIGNhdXNlIGJ5IGEgY29tbXVuaWNhdGlvbiBmYWlsdXJlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZXRyeS1hdHRlbXB0LWNvdW50IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRoZSBudW1iZXIgb2YgYXR0ZW1wdHMgRWNsaXBzZUxpbmsgd2lsbCBtYWtlIGlmIEVjbGlwc2VMaW5rIGlzIGF0dGVtcHRpbmcgdG8gcmV0cnkgYSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImRlbGF5LWJldHdlZW4tcmVjb25uZWN0LWF0dGVtcHRzIiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRoZSB0aW1lIGluIG1pbGlzZWNvbmRzIHRoYXQgRWNsaXBzZUxpbmsgd2lsbCB3YWl0IGJldHdlZW4gYXR0ZW1wdHMgdG8gcmVjb25uZWN0IGlmIEVjbGlwc2VMaW5rIGlzIGF0dGVtcHRpbmcgdG8gcmV0cnkgYSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InBpbmctc3FsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdmVycmlkZSB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgU1FMIHRoYXQgRWNsaXBzZUxpbmsgd2lsbCBpc3N1ZSB0byBhIGNvbm5lY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGxpdmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb29rdXAtZW51bSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3NpdGUtbmFtZSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvdW5kLW5hbWUiIC8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGFuZCBkYXRhc291cmNlCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcy4gVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gY29ubmVjdCB0aHJvdWdoIEVJUywKLSAgICAgICAgICAgICAgICAtIFByb3ZpZGUgYSBKTkRJIG5hbWUgdG8gdGhlIENvbm5lY3Rpb25GYWN0b3J5IGFuZCB1c2UKLSAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBnZXRDb25uZWN0aW9uIC0gUHJvdmlkZSBhIEpOREkgbmFtZSB0byB0aGUKLSAgICAgICAgICAgICAgICBDb25uZWN0aW9uRmFjdG9yeSwgYW5kIGEgZHJpdmVyIHNwZWNpZmljIENvbm5lY3Rpb25TcGVjCi0gICAgICAgICAgICAgICAgdG8gcGFzcyB0byB0aGUgZ2V0Q29ubmVjdGlvbiAtIENvbm5lY3QgaW4gYSBub24tbWFuYWdlZAotICAgICAgICAgICAgICAgIHdheSBkaXJlY3RseSB0byB0aGUgZHJpdmVyIHNwZWNpZmljIENvbm5lY3Rpb25GYWN0b3J5IEFuCi0gICAgICAgICAgICAgICAgRUlTQ29ubmVjdGlvblNwZWMgbXVzdCBiZSBwcm92aWRlZCB0byBkZWZpbmUgaG93IHRvCi0gICAgICAgICAgICAgICAgY29ubmVjdCB0byB0aGUgRUlTIGFkYXB0ZXIuIFRoZSBFSVMgcGxhdGZvcm0gY2FuIGJlIHVzZWQKLSAgICAgICAgICAgICAgICB0byBwcm92aWRlIGRhdGFzb3VyY2UvZHJpdmVyIHNwZWNpZmljIGJlaGF2b2lyIHN1Y2ggYXMKLSAgICAgICAgICAgICAgICBJbnRlcmFjdGlvblNwZWMgYW5kIFJlY29yZCBjb252ZXJzaW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1zcGVjLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1mYWN0b3J5LXVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtbG9naW4iPgotICAgIAk8eHNkOmFubm90YXRpb24+Ci0gICAgCQk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCQkJRGVmaW5lcyBsb2dpbiBhbmQgcGxhdGZvcm0gdHlwZSB0byBiZSB1c2VkCi0gICAgCQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIAk8L3hzZDphbm5vdGF0aW9uPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iPgotICAgIAkJCTx4c2Q6c2VxdWVuY2U+Ci0gICAgCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJlcXVhbC1uYW1lc3BhY2UtcmVzb2x2ZXJzIgotICAgIAkJCQkJdHlwZT0ieHNkOmJvb2xlYW4iIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4KLSAgICAJCQkJPC94c2Q6ZWxlbWVudD4KLSAgICAJCQkJPHhzZDplbGVtZW50IG5hbWU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiCi0gICAgCQkJCQltYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCIKLSAgICAJCQkJCXR5cGU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotCi0gICAgCQkJCTwveHNkOmVsZW1lbnQ+Ci0gICAgCQkJPC94c2Q6c2VxdWVuY2U+Ci0gICAgCQk8L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdGlvbi1wb29sIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSBob3cgY29ubmVjdGlvbnMgc2hvdWxkIGJlIHBvb2xlZCBpbiBhCi0gICAgICAgICAgICAgICAgc2VydmVyIHNlc3Npb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWF4LWNvbm5lY3Rpb25zIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1heCBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIGluIHRoZSBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWluLWNvbm5lY3Rpb25zIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1pbiBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCB3aWxsIGF3YXlzIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luIiB0eXBlPSJsb2dpbiIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtY29ubmVjdGlvbi1wb29sIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoZSByZWFkIGNvbm5lY3Rpb24gcG9vbCBpcyB1c2VkIGZvciByZWFkIGFjY2VzcyB0aHJvdWdoCi0gICAgICAgICAgICAgICAgdGhlIHNlcnZlciBzZXNzaW9uLiBBbnkgb2YgdGhlIGNvbm5lY3Rpb24gcG9vbHMgY2FuIGJlCi0gICAgICAgICAgICAgICAgdXNlZCBmb3IgdGhlIHJlYWQgcG9vbCBob3dldmVyIHRoaXMgaXMgdGhlIGRlZmF1bHQuIFRoaXMKLSAgICAgICAgICAgICAgICBwb29sIGFsbG93cyBmb3IgY29uY3VycmVudCByZWFkcyBhZ2FpbnN0IHRoZSBzYW1lIEpEQkMKLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGFuZCByZXF1aXJlcyB0aGF0IHRoZSBKREJDIGNvbm5lY3Rpb24gc3VwcG9ydAotICAgICAgICAgICAgICAgIGNvbmN1cnJlbnQgcmVhZCBhY2Nlc3MuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29ubmVjdGlvbi1wb29sIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVzaXZlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucyBmcm9tIHRoZSByZWFkIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCBhcmUgZXhjbHVzaXZlIG9yIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBjb21tb24gbG9nZ2luZyBvcHRpb25zCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgSmF2YSBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb2dnaW5nLW9wdGlvbnMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlY2xpcHNlbGluay1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgRWNsaXBzZUxpbmsgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nLWxldmVsIiBkZWZhdWx0PSJpbmZvIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxvZyBsZXZlbCBmb3IgbG9nZ2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im9mZiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2V2ZXJlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3YXJuaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbmZvIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb25maWciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmVyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lc3QiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWxlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSBvZiB0aGUgZmlsZSB0byB3cml0ZSB0aGUgbG9nZ2luZyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZy1vcHRpb25zIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9nZ2luZy1vcHRpb25zIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBTZXJ2ZXIgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2dpbmctb3B0aW9ucyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nLWV4Y2VwdGlvbi1zdGFja3RyYWNlIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBleGNlcHRpb24gc3RhY2t0cmFjZS4gV2l0aG91dAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBlbGVtZW50LCB0aGUgc3RhY2t0cmFjZSBpcyBsb2dnZWQgZm9yIEZJTkVSCi0gICAgICAgICAgICAgICAgICAgICAgICBvciBsZXNzIChGSU5FU1QpCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtdGhyZWFkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyB0aHJlYWQuIFdpdGhvdXQgdGhpcyBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRocmVhZCBpcyBsb2dnZWQgZm9yIEZJTkUgb3IgbGVzcyAoRklORVIgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIEZJTkVTVCkKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC1zZXNzaW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIHNlc3Npb24uIFdpdGhvdXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCwgdGhlIHNlc3Npb24gaXMgYWx3YXlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGNvbm5lY3Rpb24uIFdpdGhvdXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCwgdGhlIGNvbm5lY3Rpb24gaXMgYWx3YXlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC1kYXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGRhdGUuIFdpdGhvdXQgdGhpcyBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRhdGUgaXMgYWx3YXlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZiB0aGUgUkNNLgotICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRyYW5zcG9ydCBtZWNoYW5pc20gaXMgUk1JCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uLWNvbm5lY3Rpb24tZXJyb3IiCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iRGlzY2FyZENvbm5lY3Rpb24iIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgYW5kIGhhcyB2YWx1ZSBvZiAiRGlzY2FyZENvbm5lY3Rpb24iIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAiS2VlcENvbm5lY3Rpb24iLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gdG8gYSBSQ00gc2VydmljZSBzaG91bGQgYmUgZHJvcHBlZCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYSBjb21tdW5pY2F0aW9uIGVycm9yIHdpdGggdGhhdCBSQ00KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGVsZW1lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjYXJkQ29ubmVjdGlvbiIuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZWVwQ29ubmVjdGlvbiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NhcmRDb25uZWN0aW9uIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJybWktdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRlZmluZXMgdGhlIFJNSSB0cmFuc3BvcnQgbWVjaGFuaXNtLiBUaGUKLSAgICAgICAgICAgICAgICBkZWZhdWx0IG5hbWluZyBzZXJ2aWNlIGlzIEpOREkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlbmQtbW9kZSIgZGVmYXVsdD0iQXN5bmNocm9ub3VzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtaSBlbGVtZW50IGFuZCBoYXMgdmFsdWUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyIgb3IgIlN5bmNocm9ub3VzIi4gSXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBSQ00gcHJvcGFnYXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGFuZCBkb2VzIG5vdCB3YWl0IGZvciBjb21tYW5kIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaCBpdHMgZXhlY3V0aW9uIGluIGFzeW5jaHJvbm91cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIG9yIHdhaXQgZm9yIGNvbW1hbmQgdG8gZmluaXNoIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gaW4gc3luY2hyb25vdXMgbW9kZS4gVGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBlbGVtZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMiLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzeW5jaHJvbm91cyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3luY2hyb25vdXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY292ZXJ5IiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1pIGVsZW1lbnQuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY292ZXJ5IHNldHRpbmdzIHNob3VsZCBiZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgYSBkZWZhdWx0IERpc2NvdmVyeSB3aXRoIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHNldHRpbmdzIGlzIGNyZWF0ZWQgd2hlbiB0aGUgcm1pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaXMgc3BlY2lmaWVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im11bHRpY2FzdC1ncm91cC1hZGRyZXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iMjI2LjEwLjEyLjY0IiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtdWx0aWNhc3QtcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIzMTIxIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbm5vdW5jZW1lbnQtZGVsYXkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMTAwMCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIGRpc2NvdmVyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgbXVsdGljYXN0IGdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgc2hvdWxkIGJlIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBpcyAiMTAwMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2tldC10aW1lLXRvLWxpdmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIGRpc2NvdmVyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgdGltZS10by1saXZlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYWNrZXRzIHRoYXQgYXJlIHNlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgRGlzY292ZXJ5J3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsc3RpY2FzdCBzb2NrZXQgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQuIFRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoaXMgZWxlbWVudCBpcyAiMiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iam5kaS1uYW1pbmctc2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InJtaS1yZWdpc3RyeS1uYW1pbmctc2VydmljZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Ygcm1pIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciBSTUkgcmVnaXN0cnkgc2hvdWxkIGJlIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBuYW1pbmcgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJybWktaWlvcC10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIFJNSS1JSU9QIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YKLSAgICAgICAgICAgICAgICB0aGUgUkNNLiBUaGUgZGVmYXVsdCBuYW1pbmcgc2VydmljZSBpcyBKTkRJCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icm1pLXRyYW5zcG9ydCIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbXMtdG9waWMtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBKTVMgdG9waWMgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLWhvc3QtdXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtY29ubmVjdGlvbi1mYWN0b3J5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBkZWZhdWx0PSJqbXMvRWNsaXBzZUxpbmtUb3BpY0Nvbm5lY3Rpb25GYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Imptcy9FY2xpcHNlTGlua1RvcGljIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iam5kaS1uYW1pbmctc2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLWpncm91cHMtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBPQzRKIEpHcm91cHMgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgbWVjaGFuaXNtIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZS1zaW5nbGUtdGhyZWFkZWQtbm90aWZpY2F0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN1bi1jb3JiYS10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIFN1biBDT1JCQSB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVzZXItZGVmaW5lZC10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgdXNlciBpbXBsZW1lbnRlZAotICAgICAgICAgICAgICAgIHRyYW5zcG9ydCBtZWNoYW5pc20gdGhhdCBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGpuZGktbmFtaW5nLXNlcnZpY2UuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBmb3IgbmFtaW5nIHNlcnZpY2Ugc2hvdWxkIGJlIGNoYW5nZWQuIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJhZG1pbiIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuY3J5cHRpb24tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuaW50ZXJuYWwuc2VjdXJpdHkuSkNFRW5jcnlwdG9yIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJwYXNzd29yZCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPCEtLSAgVE9ETzogTmVlZCB0byBoYXZlIGEgbm9uIFdlYkxvZ2ljIChwcmV2aW91c2x5IE9DNEopIGRlZmF1bHQgb3Igcm91dGUgdGhyb3VnaCBzZXJ2ZXIgcGxhdGZvcm0gYnkgZGVmYXVsdCAtLT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0aWFsLWNvbnRleHQtZmFjdG9yeS1uYW1lIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0id2VibG9naWMuam5kaS5XTEluaXRpYWxDb250ZXh0RmFjdG9yeSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGpuZGktbmFtaW5nLXNlcnZpY2UuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWwgY29udGV4dCBmYWN0b3J5IGNsYXNzIGZvciBuYW1pbmcgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNoYW5nZWQuIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGpuZGktbmFtaW5nLXNlcnZpY2UuIEl0IGRldGVybWluZXMgd2hldGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgbmFtaW5nIHNlcnZpY2UgcmVxdWlyZXMgZXh0cmEgcHJvcGVydHkgdGhhdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgbm90IGRlZmluZWQgYnkgRWNsaXBzZUxpbmsgYnV0IGl0IGlzIHJlcXVpcmVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlciBhcHBsaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Z3JvdXAgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Z3JvdXA+Ci0gICAgPHhzZDpncm91cCBuYW1lPSJzdHJ1Y3QtY29udmVydGVycyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpncm91cD4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBuYW1lLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZWFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iNTAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBwcmVhbGxvY2F0aW9uIHNpemUuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBSZWZlcmVuY2VzIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LCBvdmVycmlkaW5nIGl0cyBuYW1lCi0gICAgICAgICAgICAgICAgYW5kIChvcHRpb25hbGx5KSBwcmVhbGxvY2F0aW9uIHNpemUuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRvIHVzZSBwcmVhbGxvY2F0aW9uIHNpemUgb2YgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsCi0gICAgICAgICAgICAgICAgc2V0IHByZWFsbG9jYXRpb24gc2l6ZSB0byAwCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmF0aXZlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERhdGFiYXNlIHNlcXVlbmNlIG1lY2hhbmlzbSB1c2VkLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRhYmxlIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX05BTUUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5hcnktdGFibGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVW5hcnkgdGFibGUgc2VxdWVuY2UgLSBzZXF1ZW5jZSBuYW1lIGlzIGEgdGFibGUgbmFtZSwKLSAgICAgICAgICAgICAgICB0YWJsZSBoYXMgYSBzaW5nbGUgZmllbGQgYW5kIGEgc2luZ2xlIHJvdwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWxmaWxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbGZpbGUgc2VxdWVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWwgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb290LWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfTkFNRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWVsZW1lbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBkZWZhdWx0PSJTRVFfQ09VTlQiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJVGhpcyBlbGVtZW50IHNwZWNpZmllcyB3aGljaCBkb2N1bWVudCBwcmVzZXJ2YXRpb24KLSAgICAgICAgCQlzdHJhdGVneSB3aWxsIGJlIHVzZWQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgIAkJPHhzZDplbGVtZW50IG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5IgotICAgIAkJCXR5cGU9Im5vZGUtb3JkZXJpbmctcG9saWN5IiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0gICAgCQk8L3hzZDplbGVtZW50PgotICAgIAk8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPgotICAgIAk8eHNkOmFubm90YXRpb24+Ci0gICAgCQk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCQkJVGhpcyBlbGVtZW50IHNwZWNpZmllcyB3aGljaCBub2RlIG9yZGVyaW5nIHN0cmF0ZWd5IHdpbGwKLSAgICAJCQliZSB1c2VkLgotICAgIAkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJPC94c2Q6YW5ub3RhdGlvbj48L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUKLSAgICAJbmFtZT0iZGVzY3JpcHRvci1sZXZlbC1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIERvY3VtZW50UHJlc2VydmF0aW9uIFBvbGljeSB0aGF0Ci0gICAgICAgIAkJYWNjZXNzZXMgdGhlIHNlc3Npb24gY2FjaGUgdG8gc3RvcmUgT2JqZWN0cyBhbmQgdGhlaXIKLSAgICAgICAgCQlhc3NvY2lhdGVkIG5vZGVzLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQSBEb2N1bWVudFByZXNlcnZhdGlvblBvbGljeSB0byBpbmRpY2F0ZSB0aGF0IG5vCi0gICAgICAgIAkJZG9jdW1lbnQgcHJlc2VydmF0aW9uIHdvcmsgc2hvdWxkIGJlIGRvbmUuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWJpbmRlci1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgRG9jdW1lbnRQcmVzZXJ2YXRpb25Qb2xpY3kgdGhhdAotICAgICAgICAJCW1haW50YWlucyBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBKYXZhCi0gICAgICAgIAkJT2JqZWN0cyBhbmQgdGhlIFhNTE5vZGVzIHRoZXkgb3JpZ2luYXRlZCBmcm9tLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFwcGVuZC1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIE5vZGVPcmRlcmluZ1BvbGljeSB0aGF0IHNpbXBseQotICAgICAgICAJCWFwcGVuZHMgdGhlIG5ldyBjaGlsZCBlbGVtZW50IHRvIHRoZSBwYXJlbnQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imlnbm9yZS1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIE5vZGVPcmRlcmluZ1BvbGljeSB0aGF0IGlnbm9yZXMgYW55Ci0gICAgICAgIAkJbmV3IGVsZW1lbnRzIHdoZW4gdXBkYXRpbmcgYSBjYWNoZWQgZG9jdW1lbnQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aXZlLXBvc2l0aW9uLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBOb2RlT3JkZXJpbmdQb2xpY3kgdGhhdCBhZGRzIG5ldwotICAgICAgICAJCWVsZW1lbnRzIHRvIGFuIFhNTCBEb2N1bWVudCBiYXNlZCBvbiB0aGUgbGFzdCB1cGRhdGVkCi0gICAgICAgIAkJc2libGluZyBpbiB0aGVpciBjb250ZXh0LgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18yLjEueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18yLjEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTY5NzExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMi4xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1OTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsKLSAgICAgdHdhcmUgLSB1cGRhdGUgdmVyc2lvbiBudW1iZXIgdG8gMi4wCi0gICAgIHBrcm9naC0gdXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDIuMQotICAgICBhZ29lcmxlciAtIGFkZCBOZXQgd2VhdmVyIHN1cHBvcnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgCi0tLT4KLTwhLS0gCi0KLVhNTCBTY2hlbWEgZGVmaW5pdGlvbiBmb3IgdGhlIEVjbGlwc2UgUGVyc2lzdGVuY2UgU2VydmljZXMgUHJvamVjdCBTZXNzaW9uIENvbmZpZ3VyYXRpb24gZmlsZS4gSW5zdGFuY2VzCi1vZiB0aGlzIGZpbGUgYXJlIHR5cGljYWxseSBsb2NhdGVkIGFzOiAnTUVUQS1JTkYvc2Vzc2lvbnMueG1sJwotCi0gLS0+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHZlcnNpb249IjIuMSI+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb25zIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHJvb3QgZWxlbWVudCBhbmQgZXhpc3RzIG9ubHkgZm9yIFhNTAotICAgICAgICAgICAgICAgIHN0cnVjdHVyZQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24iIHR5cGU9InNlc3Npb24iIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgbm9kZSBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIGEgcGFydGljdWxhciBzZXNzaW9uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJpYyBlbGVtZW50IHVzZWQgdG8gZGVzY3JpYmUgYSBzdHJpbmcgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyB0aGUgbmFtZSBvZiBhbiBpdGVtCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmVyLXBsYXRmb3JtIiB0eXBlPSJzZXJ2ZXItcGxhdGZvcm0iCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlLWNvbW1hbmQiPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIGVsZW1lbnQgdGhhdCBkZWZpbmUgdGhlIFJlbW90ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQgTW9kdWxlIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZSBzeW5jaHJvbml6YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFubmVsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBkZWZhdWx0PSJFY2xpcHNlTGlua0NvbW1hbmRDaGFubmVsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21tYW5kcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgcmVtb3RlLWNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZXRlcm1pbmUgd2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZmVhdHVyZXMsIHRoZSBSQ00KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLXN5bmMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGVsZW1lbnQuIEl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybnMgb24gY2FjaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6YXRpb24gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvdyBzZW5kaW5nIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZyBjYWNoZSBzeW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InRyYW5zcG9ydC1tYW5hZ2VyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRlZmluZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZiB0aGUgUkNNLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBSTUkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb2ZpbGVyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHJlcHJlc2VudHMgaWYgdGhlIHByb2ZpbGVyIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYnkgdGhlIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRtcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVjbGlwc2VsaW5rIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24taGFuZGxlci1jbGFzcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgY2xhc3MgdGhhdCB0aGUgc2Vzc2lvbiB3aWxsIHVzZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlIGV4Y2VwdGlvbnMgZ2VuZXJhdGVkIGZyb20gd2l0aGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmciIHR5cGU9ImxvZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvZ2dpbmcgb3B0aW9ucwotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tY3VzdG9taXplci1jbGFzcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgc2Vzc2lvbiBjdXN0b21pemVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyB0byBydW4gb24gYSBsb2FkZWQgc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgbm9kZSBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdoaWNoIHNlcnZlcgotICAgICAgICAgICAgICAgIHBsYXRmb3JtIHRvIHVzZSwgSlRBIHNldHRpbmdzIGFuZCBydW50aW1lIHNlcnZpY2VzCi0gICAgICAgICAgICAgICAgc2V0dGluZ3MKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLXJ1bnRpbWUtc2VydmljZXMiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSBKTVggTUJlYW4gZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRpbmcgcnVudGltZSBzZXJ2aWNlcyBpcyBkZXBsb3llZC4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGUtanRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIHNlc3Npb24gd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyYXRlIHdpdGggdGhlIEpUQSAoaS5lLiB3aGV0aGVyIHRoZSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGEgdHJhbnNhY3Rpb24gY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MuIFRoZSBjaG9pY2Ugb2Ygc2VydmVyLWNsYXNzIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYmUgY2hvc2VuIGJhc2VkIG9uIHRoZSB0cmFuc2FjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5zZXJ2ZXIuQ3VzdG9tU2VydmVyUGxhdGZvcm0iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgc3ViY2xhc3Mgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uc2VydmVyLlBsYXRmb3JtQmFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzcGVjaWZ5IHdoaWNoIHNlcnZlciBwbGF0Zm9ybSB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJleHRlcm5hbC10cmFuc2FjdGlvbi1jb250cm9sbGVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotOTAzLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTkwNC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMDEyLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTEwMTMtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTExMS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy02MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtNzAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTgxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy05LXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy0xMC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTQwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNTAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS01MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTYwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNjEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS03LXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYm9zcy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmV0d2VhdmVyLTcxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWJyb2tlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBQcm92aWRlcyBhIHNpbmdsZSB2aWV3IHRvIGEgc2Vzc2lvbiB0aGF0Ci0gICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRseSBhY2Nlc3NlcyBtdWx0cGxlIGRhdGFiYXNlcy4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icHJvamVjdCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4bWwiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InByb2plY3QiIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2xhc3MiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InByb2plY3QiIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLXNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhlIHNlc3Npb24gaXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlIGludG8gRWNsaXBzZUxpbmssIHRoZQotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNob3VsZCBkbyBhbGwgb2YgaXRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgb2YKLSAgICAgICAgICAgICAgICBvYmplY3RzIHRocm91Z2ggdGhlIHNlc3Npb24uIFRoZSBzZXNzaW9uIGFsc28gbWFuYWdlcwotICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucyBhbmQgdW5pdHMgb2Ygd29yay4gVGhlIGRhdGFiYXNlIHNlc3Npb24gaXMKLSAgICAgICAgICAgICAgICBpbnRlbmRlZCBmb3IgdXNhZ2UgaW4gdHdvLXRpZXIgY2xpZW50LXNlcnZlcgotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9ucy4gQWx0aG91Z2ggaXQgY291bGQgYmUgdXNlZCBpbiBhIHNlcnZlcgotICAgICAgICAgICAgICAgIHNpdHVhdGlvbiwgaXQgaXMgbGltaXR0ZWQgdG8gb25seSBoYXZpbmcgYSBzaW5nbGUKLSAgICAgICAgICAgICAgICBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBvbmx5IGFsbG93cyBhIHNpbmdsZSBvcGVuCi0gICAgICAgICAgICAgICAgZGF0YWJhc2UgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnktcHJvamVjdCIgdHlwZT0icHJvamVjdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHByb2plY3QgKGNsYXNzIG9yIHhtbCkgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQgYXMgdGhlIHByaW1hcnkgcHJvamVjdCBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZGRpdGlvbmFsLXByb2plY3QiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJwcm9qZWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWwgcHJvamVjdHMgd2lsbCBoYXZlIHRoZWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzIGFwcGVuZGVkIHRvIHRoZSBwcmltYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbiIgdHlwZT0ibG9naW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLXNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgSXMgYW4gZXh0ZW5zaW9uIG9mIGEgRGF0YWJhc2VTZXNzaW9uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2Utc2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbHMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBwb29scyBhcmUgb25seSBmb3IgdXNhZ2Ugd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBjb25uZWN0aW9uIHBvb2xpbmcgYW5kIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYmUgdXNlZCBpZiB1c2luZyBleHRlcm5hbCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWQtY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ3cml0ZS1jb25uZWN0aW9uLXBvb2wiIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJzZXF1ZW5jZS1jb25uZWN0aW9uLXBvb2wiIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhpcyB0YWcgdG8gdXNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBjb25uZWN0aW9uIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb2xpY3kiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjb25uZWN0aW9uLXBvbGljeSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSBob3cgZGVmYXVsdCBjbGllbnQgc2Vzc2lvbnMgYXJlIGFjcXVpcmVkCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1c2l2ZS1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBpZiBhbiBleGNsdXNpdmUgY29ubmVjdGlvbiBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIHJlYWRzLCByZXF1aXJlZCBmb3IgVlBELCBvciB1c2VyIGJhc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkIHNlY3VyaXR5LgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxhenkiIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgaWYgYSBjb25uZWN0aW9uIHNob3VsZCBiZSBhY3F1aXJlZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlbGQgdXBmcm9udCBpbiB0aGUgY2xpZW50IHNlc3Npb24sIG9yIG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkIHdoZW4gbmVlZGVkIGFuZCB0aGVuIHJlbGVhc2VkLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgY29tbW9uIGZpZWxkcyBmb3IgZGF0YWJhc2UtbG9naW4gYW5kIGVpcy1sb2dpbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbGF0Zm9ybS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIHBsYXRmb3JtCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBuYW1lCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvbi1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5zZWN1cml0eS5KQ0VFbmNyeXB0b3IiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLXF1YWxpZmllciIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSBkZWZhdWx0IHF1YWxpZmllciBmb3IgYWxsIHRhYmxlcy4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHRoZSBjcmVhdG9yIG9mIHRoZSB0YWJsZSBvciBkYXRhYmFzZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFibGUgZXhpc3RzIG9uLiBUaGlzIGlzIHJlcXVpcmVkIGJ5IHNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlcyBzdWNoIGFzIE9yYWNsZSBhbmQgREIyLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVybmFsLWNvbm5lY3Rpb24tcG9vbGluZyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgdXNlIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBjb25uZWN0aW9uIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlcm5hbC10cmFuc2FjdGlvbi1jb250cm9sbGVyIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgdGhlIHNlc3Npb24gd2lsbCBiZSB1c2luZyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgdHJhbnNhY3Rpb24gY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jaW5nIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InNlcXVlbmNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBzZXF1ZW5jZS4gVGhlIG5hbWUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsLiBJZiBubyBuYW1lIHByb3ZpZGVkIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSBzdHJpbmcgd2lsbCBiZSB1c2VkIGFzIGEgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb24gZGVmYXVsdCBzZXF1ZW5jZXMuIE1ha2Ugc3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBzZXF1ZW5jZSBoYXMgdW5pcXVlIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InNlcXVlbmNlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIGEgbG9naW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyB1c2VkIHRvIGRlZmluZSBleHRyYSBwcm9wZXJ0aWVzIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgbG9naW4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIEhvbGRzIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBjb25uZWN0Ci0gICAgICAgICAgICAgICAgdG8gYSBKREJDIGRyaXZlci4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRyaXZlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZHJpdmVyIGNsYXNzIGlzIHRoZSBKYXZhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgZm9yIHRoZSBKREJDIGRyaXZlciB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgKGUuZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW4uamRiYy5vZGJjLkpkYmNPZGJjRHJpdmVyLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBVUkwgdGhhdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGFzb3VyY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgVVJMIG9mIGEgZGF0YXNvdXJjZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgdXNlZCBieSB0aGUgc2Vzc2lvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsb29rdXAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Imxvb2t1cC1lbnVtIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gYmluZCBhbGwgYXJndW1lbnRzIHRvIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwgc3RhdGVtZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtYWxsLXN0YXRlbWVudHMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciBwcmVwYXJlZCBzdGF0ZW1lbnRzIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWNoZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJieXRlLWFycmF5LWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgYmluZGluZyBmb3IgbGFyZ2UgYmluYXJ5IGRhdGEuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgRWNsaXBzZUxpbmsgd2lsbCBwcmludCB0aGlzIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgaGV4IHRocm91Z2ggdGhlIEpEQkMgYmluYXJ5IGV4Y2FwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UuIEJvdGggYmluZGluZyBhbmQgcHJpbnRpbmcgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpb3VzIGxpbWl0cyBvbiBhbGwgZGF0YWJhc2VzIChlLmcuIDVrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMzJrKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmluZy1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgc3RyaW5ncyBzaG91bGQgYmUgYm91bmQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgdG8gaGVscCBiZWFuIGludHJvc3BlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJlYW1zLWZvci1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIHN0cmVhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3RvcmUgbGFyZ2UgYmluYXJ5IGRhdGEuIFRoaXMgY2FuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJvdmUgdGhlIG1heCBzaXplIGZvciByZWFkaW5nL3dyaXRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gc29tZSBKREJDIGRyaXZlcnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JjZS1maWVsZC1uYW1lcy10by11cHBlci1jYXNlIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBzZXR0aW5nIGNhbiBiZSB1c2VkIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBleHBlY3RzIHVwcGVyIGNhc2UgYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBkb2VzIG5vdCByZXR1cm4gY29uc2lzdGVudCBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIGRpZmZlcmVudCBkYXRhYmFzZXMpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pemUtZGF0YS1jb252ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciBkcml2ZXIgbGV2ZWwgZGF0YSBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbiBpcyBlbmFibGVkLiBUaGlzIGNhbiBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCBhcyBzb21lIGRyaXZlcnMgcGVyZm9ybSBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gdGhlbXNlbHZlcyBpbmNvcnJlY3RseS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyaW0tc3RyaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBDSEFSIGZpZWxkIHZhbHVlcyBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nIGJsYW5rcyB0cmltbWVkLCB0aGlzIGNhbiBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtd3JpdGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nLiBUaGlzIGZhY2lsaXR5IGFsbG93cyBtdWx0aXBsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSBvcGVyYXRpb25zIHRvIGJlIHN1Ym1pdHRlZCB0byBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIGZvciBwcm9jZXNzaW5nIGF0IG9uY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1pdHRpbmcgbXVsdGlwbGUgdXBkYXRlcyB0b2dldGhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBpbmRpdmlkdWFsbHksIGNhbiBncmVhdGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJvdmUgcGVyZm9ybWFuY2UgaW4gc29tZSBzaXR1YXRpb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamRiYy1iYXRjaC13cml0aW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nIHRoaXMgdGFnIHdpdGggdHJ1ZSBpbmRpY2F0ZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgdGhhdCB0aGUgSkRCQyBkcml2ZXIgc3VwcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggd3JpdGluZy4gRWNsaXBzZUxpbmsncyBpbnRlcm5hbCBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nIGlzIGRpc2FibGVkLiBTZXR0aW5nIHRoaXMgdGFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggZmFsc2UgaW5kaWNhdGVzIHRvIEVjbGlwc2VMaW5rIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZy4gVGhpcyB3aWxsIHJldmVydCB0byB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvdXIgd2hpY2ggaXMgdG8gZGVsZWdhdGUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsncyBpbnRlcm5hbCBiYXRjaCB3cml0aW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWF4LWJhdGNoLXdyaXRpbmctc2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIzMjAwMCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93IGZvciB0aGUgbWF4IGJhdGNoIHdyaXRpbmcgc2l6ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQuIFRoaXMgYWxsb3dzIGZvciB0aGUgYmF0Y2ggc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBsaW1pdGVkIGFzIG1vc3QgZGF0YWJhc2UgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3QgbGltaXRzLiBUaGUgc2l6ZSBpcyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLCB0aGUgZGVmYXVsdCBpcyAzMjAwMCBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWwgdmFsdWUgZGVwZW5kcyBvbiB0aGUgZGF0YWJhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hdGl2ZS1zcWwiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2Ugc3BlY2lmaWMgc3FsIGdyYW1tYXIgbm90IEpEQkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMuIFRoaXMgaXMgYmVjYXVzZSB1bmZvcnR1bmF0ZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWUgYnJpZGdlcyB0byBub3Qgc3VwcG9ydCB0aGUgZnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKREJDIHN0YW5kYXJkLiBCeSBkZWZhdWx0IEVjbGlwc2VMaW5rIHVzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEpEQkMgc3FsIGdyYW1tYXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVycyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJzdHJ1Y3QtY29udmVydGVycyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1oZWFsdGgtdmFsaWRhdGVkLW9uLWVycm9yIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgdHJ1ZSB3aWxsIGNhdXNlIEVjbGlwc2VMaW5rIHRvIHBpbmcgZGF0YWJhc2UgdG8gZGV0ZXJtaW5lIGlmIGFuIFNRTEV4Y2VwdGlvbiB3YXMgY2F1c2UgYnkgYSBjb21tdW5pY2F0aW9uIGZhaWx1cmU8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5LXJldHJ5LWF0dGVtcHQtY291bnQiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIG51bWJlciBvZiBhdHRlbXB0cyBFY2xpcHNlTGluayB3aWxsIG1ha2UgaWYgRWNsaXBzZUxpbmsgaXMgYXR0ZW1wdGluZyB0byByZXRyeSBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZGVsYXktYmV0d2Vlbi1yZWNvbm5lY3QtYXR0ZW1wdHMiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIHRpbWUgaW4gbWlsaXNlY29uZHMgdGhhdCBFY2xpcHNlTGluayB3aWxsIHdhaXQgYmV0d2VlbiBhdHRlbXB0cyB0byByZWNvbm5lY3QgaWYgRWNsaXBzZUxpbmsgaXMgYXR0ZW1wdGluZyB0byByZXRyeSBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icGluZy1zcWwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk92ZXJyaWRlIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBTUUwgdGhhdCBFY2xpcHNlTGluayB3aWxsIGlzc3VlIHRvIGEgY29ubmVjdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgbGl2ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Imxvb2t1cC1lbnVtIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZS1uYW1lIiAvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG91bmQtbmFtZSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gYW5kIGRhdGFzb3VyY2UKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLiBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byBjb25uZWN0IHRocm91Z2ggRUlTLAotICAgICAgICAgICAgICAgIC0gUHJvdmlkZSBhIEpOREkgbmFtZSB0byB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgYW5kIHVzZQotICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IGdldENvbm5lY3Rpb24gLSBQcm92aWRlIGEgSk5ESSBuYW1lIHRvIHRoZQotICAgICAgICAgICAgICAgIENvbm5lY3Rpb25GYWN0b3J5LCBhbmQgYSBkcml2ZXIgc3BlY2lmaWMgQ29ubmVjdGlvblNwZWMKLSAgICAgICAgICAgICAgICB0byBwYXNzIHRvIHRoZSBnZXRDb25uZWN0aW9uIC0gQ29ubmVjdCBpbiBhIG5vbi1tYW5hZ2VkCi0gICAgICAgICAgICAgICAgd2F5IGRpcmVjdGx5IHRvIHRoZSBkcml2ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgQW4KLSAgICAgICAgICAgICAgICBFSVNDb25uZWN0aW9uU3BlYyBtdXN0IGJlIHByb3ZpZGVkIHRvIGRlZmluZSBob3cgdG8KLSAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBFSVMgYWRhcHRlci4gVGhlIEVJUyBwbGF0Zm9ybSBjYW4gYmUgdXNlZAotICAgICAgICAgICAgICAgIHRvIHByb3ZpZGUgZGF0YXNvdXJjZS9kcml2ZXIgc3BlY2lmaWMgYmVoYXZvaXIgc3VjaCBhcwotICAgICAgICAgICAgICAgIEludGVyYWN0aW9uU3BlYyBhbmQgUmVjb3JkIGNvbnZlcnNpb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXNwZWMtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWZhY3RvcnktdXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1sb2dpbiI+Ci0gICAgCTx4c2Q6YW5ub3RhdGlvbj4KLSAgICAJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJCQlEZWZpbmVzIGxvZ2luIGFuZCBwbGF0Zm9ybSB0eXBlIHRvIGJlIHVzZWQKLSAgICAJCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCTwveHNkOmFubm90YXRpb24+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgCQkJPHhzZDpzZXF1ZW5jZT4KLSAgICAJCQkJPHhzZDplbGVtZW50IG5hbWU9ImVxdWFsLW5hbWVzcGFjZS1yZXNvbHZlcnMiCi0gICAgCQkJCQl0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiPgotICAgIAkJCQk8L3hzZDplbGVtZW50PgotICAgIAkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSIKLSAgICAJCQkJCW1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIgotICAgIAkJCQkJdHlwZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0KLSAgICAJCQkJPC94c2Q6ZWxlbWVudD4KLSAgICAJCQk8L3hzZDpzZXF1ZW5jZT4KLSAgICAJCTwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLXBvb2wiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IGhvdyBjb25uZWN0aW9ucyBzaG91bGQgYmUgcG9vbGVkIGluIGEKLSAgICAgICAgICAgICAgICBzZXJ2ZXIgc2Vzc2lvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtY29ubmVjdGlvbnMiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4IG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgaW4gdGhlIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW4tY29ubmVjdGlvbnMiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWluIG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IHdpbGwgYXdheXMgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4iIHR5cGU9ImxvZ2luIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhlIHJlYWQgY29ubmVjdGlvbiBwb29sIGlzIHVzZWQgZm9yIHJlYWQgYWNjZXNzIHRocm91Z2gKLSAgICAgICAgICAgICAgICB0aGUgc2VydmVyIHNlc3Npb24uIEFueSBvZiB0aGUgY29ubmVjdGlvbiBwb29scyBjYW4gYmUKLSAgICAgICAgICAgICAgICB1c2VkIGZvciB0aGUgcmVhZCBwb29sIGhvd2V2ZXIgdGhpcyBpcyB0aGUgZGVmYXVsdC4gVGhpcwotICAgICAgICAgICAgICAgIHBvb2wgYWxsb3dzIGZvciBjb25jdXJyZW50IHJlYWRzIGFnYWluc3QgdGhlIHNhbWUgSkRCQwotICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gYW5kIHJlcXVpcmVzIHRoYXQgdGhlIEpEQkMgY29ubmVjdGlvbiBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgY29uY3VycmVudCByZWFkIGFjY2Vzcy4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb25uZWN0aW9uLXBvb2wiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdXNpdmUiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zIGZyb20gdGhlIHJlYWQgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sIGFyZSBleGNsdXNpdmUgb3Igbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGNvbW1vbiBsb2dnaW5nIG9wdGlvbnMKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBKYXZhIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmctb3B0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImxvZ2dpbmctb3B0aW9ucyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVjbGlwc2VsaW5rLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBFY2xpcHNlTGluayBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2ctbGV2ZWwiIGRlZmF1bHQ9ImluZm8iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgbG9nIGxldmVsIGZvciBsb2dnaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib2ZmIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZXZlcmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Indhcm5pbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImluZm8iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbmZpZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmVzdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBmaWxlIHRvIHdyaXRlIHRoZSBsb2dnaW5nIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb2dnaW5nLW9wdGlvbnMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIFNlcnZlciBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9nZ2luZy1vcHRpb25zIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2ctZXhjZXB0aW9uLXN0YWNrdHJhY2UiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGV4Y2VwdGlvbiBzdGFja3RyYWNlLiBXaXRob3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGVsZW1lbnQsIHRoZSBzdGFja3RyYWNlIGlzIGxvZ2dlZCBmb3IgRklORVIKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yIGxlc3MgKEZJTkVTVCkKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC10aHJlYWQiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIHRocmVhZC4gV2l0aG91dCB0aGlzIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGhyZWFkIGlzIGxvZ2dlZCBmb3IgRklORSBvciBsZXNzIChGSU5FUiBvcgotICAgICAgICAgICAgICAgICAgICAgICAgRklORVNUKQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LXNlc3Npb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgc2Vzc2lvbi4gV2l0aG91dCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCB0aGUgc2Vzc2lvbiBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgY29ubmVjdGlvbi4gV2l0aG91dCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCB0aGUgY29ubmVjdGlvbiBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LWRhdGUiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgZGF0ZS4gV2l0aG91dCB0aGlzIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0ZSBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mIHRoZSBSQ00uCi0gICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG1lY2hhbmlzbSBpcyBSTUkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib24tY29ubmVjdGlvbi1lcnJvciIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJEaXNjYXJkQ29ubmVjdGlvbiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBhbmQgaGFzIHZhbHVlIG9mICJEaXNjYXJkQ29ubmVjdGlvbiIgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICJLZWVwQ29ubmVjdGlvbiIuIEl0IGRldGVybWluZXMgd2hldGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiB0byBhIFJDTSBzZXJ2aWNlIHNob3VsZCBiZSBkcm9wcGVkIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhIGNvbW11bmljYXRpb24gZXJyb3Igd2l0aCB0aGF0IFJDTQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2NhcmRDb25uZWN0aW9uIi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlZXBDb25uZWN0aW9uIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2FyZENvbm5lY3Rpb24iIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJtaS10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGVmaW5lcyB0aGUgUk1JIHRyYW5zcG9ydCBtZWNoYW5pc20uIFRoZQotICAgICAgICAgICAgICAgIGRlZmF1bHQgbmFtaW5nIHNlcnZpY2UgaXMgSk5ESQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VuZC1tb2RlIiBkZWZhdWx0PSJBc3luY2hyb25vdXMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1pIGVsZW1lbnQgYW5kIGhhcyB2YWx1ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIiBvciAiU3luY2hyb25vdXMiLiBJdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIFJDTSBwcm9wYWdhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgYW5kIGRvZXMgbm90IHdhaXQgZm9yIGNvbW1hbmQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoIGl0cyBleGVjdXRpb24gaW4gYXN5bmNocm9ub3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgb3Igd2FpdCBmb3IgY29tbWFuZCB0byBmaW5pc2ggaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBpbiBzeW5jaHJvbm91cyBtb2RlLiBUaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXN5bmNocm9ub3VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW5jaHJvbm91cyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjb3ZlcnkiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWkgZWxlbWVudC4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3Zlcnkgc2V0dGluZ3Mgc2hvdWxkIGJlIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBhIGRlZmF1bHQgRGlzY292ZXJ5IHdpdGggaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgc2V0dGluZ3MgaXMgY3JlYXRlZCB3aGVuIHRoZSBybWkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBpcyBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibXVsdGljYXN0LWdyb3VwLWFkZHJlc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSIyMjYuMTAuMTIuNjQiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpY2FzdC1wb3J0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjMxMjEiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFubm91bmNlbWVudC1kZWxheSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIxMDAwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBtdWx0aWNhc3QgZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBzaG91bGQgYmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGlzICIxMDAwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2V0LXRpbWUtdG8tbGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSB0aW1lLXRvLWxpdmUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhY2tldHMgdGhhdCBhcmUgc2VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBEaXNjb3ZlcnkncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWxzdGljYXN0IHNvY2tldCBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC4gVGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBlbGVtZW50IGlzICIyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqbmRpLW5hbWluZy1zZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icm1pLXJlZ2lzdHJ5LW5hbWluZy1zZXJ2aWNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBybWkgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIFJNSSByZWdpc3RyeSBzaG91bGQgYmUgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWluZyBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJtaS1paW9wLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgUk1JLUlJT1AgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZgotICAgICAgICAgICAgICAgIHRoZSBSQ00uIFRoZSBkZWZhdWx0IG5hbWluZyBzZXJ2aWNlIGlzIEpOREkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJybWktdHJhbnNwb3J0IiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imptcy10b3BpYy10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIEpNUyB0b3BpYyB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtaG9zdC11cmwiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1jb25uZWN0aW9uLWZhY3RvcnktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9Imptcy9FY2xpcHNlTGlua1RvcGljQ29ubmVjdGlvbkZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iam1zL0VjbGlwc2VMaW5rVG9waWMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqbmRpLW5hbWluZy1zZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotamdyb3Vwcy10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIE9DNEogSkdyb3VwcyB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBtZWNoYW5pc20gb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlLXNpbmdsZS10aHJlYWRlZC1ub3RpZmljYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3VuLWNvcmJhLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgU3VuIENPUkJBIHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXNlci1kZWZpbmVkLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgYSB1c2VyIGltcGxlbWVudGVkCi0gICAgICAgICAgICAgICAgdHJhbnNwb3J0IG1lY2hhbmlzbSB0aGF0IHNob3VsZCBiZSB1c2VkLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgVVJMIGZvciBuYW1pbmcgc2VydmljZSBzaG91bGQgYmUgY2hhbmdlZC4gCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImFkbWluIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvbi1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5zZWN1cml0eS5KQ0VFbmNyeXB0b3IiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InBhc3N3b3JkIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8IS0tICBUT0RPOiBOZWVkIHRvIGhhdmUgYSBub24gV2ViTG9naWMgKHByZXZpb3VzbHkgT0M0SikgZGVmYXVsdCBvciByb3V0ZSB0aHJvdWdoIHNlcnZlciBwbGF0Zm9ybSBieSBkZWZhdWx0IC0tPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXRpYWwtY29udGV4dC1mYWN0b3J5LW5hbWUiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ3ZWJsb2dpYy5qbmRpLldMSW5pdGlhbENvbnRleHRGYWN0b3J5IgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbCBjb250ZXh0IGZhY3RvcnkgY2xhc3MgZm9yIG5hbWluZyBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2hhbmdlZC4gCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1pbmcgc2VydmljZSByZXF1aXJlcyBleHRyYSBwcm9wZXJ0eSB0aGF0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBub3QgZGVmaW5lZCBieSBFY2xpcHNlTGluayBidXQgaXQgaXMgcmVxdWlyZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VyIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpncm91cCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpncm91cD4KLSAgICA8eHNkOmdyb3VwIG5hbWU9InN0cnVjdC1jb252ZXJ0ZXJzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmdyb3VwPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2Ugb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSI1MCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIHByZWFsbG9jYXRpb24gc2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFJlZmVyZW5jZXMgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsIG92ZXJyaWRpbmcgaXRzIG5hbWUKLSAgICAgICAgICAgICAgICBhbmQgKG9wdGlvbmFsbHkpIHByZWFsbG9jYXRpb24gc2l6ZS4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVG8gdXNlIHByZWFsbG9jYXRpb24gc2l6ZSBvZiBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwKLSAgICAgICAgICAgICAgICBzZXQgcHJlYWxsb2NhdGlvbiBzaXplIHRvIDAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYXRpdmUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2Ugc2VxdWVuY2UgbWVjaGFuaXNtIHVzZWQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGFibGUgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfTkFNRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX0NPVU5UIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmFyeS10YWJsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVbmFyeSB0YWJsZSBzZXF1ZW5jZSAtIHNlcXVlbmNlIG5hbWUgaXMgYSB0YWJsZSBuYW1lLAotICAgICAgICAgICAgICAgIHRhYmxlIGhhcyBhIHNpbmdsZSBmaWVsZCBhbmQgYSBzaW5nbGUgcm93Ci0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbGZpbGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sZmlsZSBzZXF1ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbCBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9OQU1FIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZWxlbWVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHdoaWNoIGRvY3VtZW50IHByZXNlcnZhdGlvbgotICAgICAgICAJCXN0cmF0ZWd5IHdpbGwgYmUgdXNlZC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgCQk8eHNkOmVsZW1lbnQgbmFtZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiCi0gICAgCQkJdHlwZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4KLSAgICAJCTwveHNkOmVsZW1lbnQ+Ci0gICAgCTwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgCTx4c2Q6YW5ub3RhdGlvbj4KLSAgICAJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJCQlUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHdoaWNoIG5vZGUgb3JkZXJpbmcgc3RyYXRlZ3kgd2lsbAotICAgIAkJCWJlIHVzZWQuCi0gICAgCQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIAk8L3hzZDphbm5vdGF0aW9uPjwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZQotICAgIAluYW1lPSJkZXNjcmlwdG9yLWxldmVsLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgRG9jdW1lbnRQcmVzZXJ2YXRpb24gUG9saWN5IHRoYXQKLSAgICAgICAgCQlhY2Nlc3NlcyB0aGUgc2Vzc2lvbiBjYWNoZSB0byBzdG9yZSBPYmplY3RzIGFuZCB0aGVpcgotICAgICAgICAJCWFzc29jaWF0ZWQgbm9kZXMuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm8tZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBIERvY3VtZW50UHJlc2VydmF0aW9uUG9saWN5IHRvIGluZGljYXRlIHRoYXQgbm8KLSAgICAgICAgCQlkb2N1bWVudCBwcmVzZXJ2YXRpb24gd29yayBzaG91bGQgYmUgZG9uZS4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluZGVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBEb2N1bWVudFByZXNlcnZhdGlvblBvbGljeSB0aGF0Ci0gICAgICAgIAkJbWFpbnRhaW5zIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIEphdmEKLSAgICAgICAgCQlPYmplY3RzIGFuZCB0aGUgWE1MTm9kZXMgdGhleSBvcmlnaW5hdGVkIGZyb20uCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwZW5kLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgTm9kZU9yZGVyaW5nUG9saWN5IHRoYXQgc2ltcGx5Ci0gICAgICAgIAkJYXBwZW5kcyB0aGUgbmV3IGNoaWxkIGVsZW1lbnQgdG8gdGhlIHBhcmVudC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWdub3JlLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgTm9kZU9yZGVyaW5nUG9saWN5IHRoYXQgaWdub3JlcyBhbnkKLSAgICAgICAgCQluZXcgZWxlbWVudHMgd2hlbiB1cGRhdGluZyBhIGNhY2hlZCBkb2N1bWVudC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpdmUtcG9zaXRpb24tb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIE5vZGVPcmRlcmluZ1BvbGljeSB0aGF0IGFkZHMgbmV3Ci0gICAgICAgIAkJZWxlbWVudHMgdG8gYW4gWE1MIERvY3VtZW50IGJhc2VkIG9uIHRoZSBsYXN0IHVwZGF0ZWQKLSAgICAgICAgCQlzaWJsaW5nIGluIHRoZWlyIGNvbnRleHQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvRWNsaXBzZUxpbmtKcGFQcm9qZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvRWNsaXBzZUxpbmtKcGFQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NzE2ZGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL0VjbGlwc2VMaW5rSnBhUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIEpQQSBwcm9qZWN0LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0pwYVByb2plY3QKLQlleHRlbmRzIEpwYVByb2plY3QKLXsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbW9kZWwgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGZpbGUKLQkgKiA8Y29kZT5NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sPC9jb2RlPiBpZiB0aGF0IGZpbGUgaGFzIHRoZQotCSAqIEVjbGlwc2VMaW5rIGNvbnRlbnQgdHlwZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbiNERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRICi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4jRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUKLQkgKi8KLQlKcGFYbWxSZXNvdXJjZSBnZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL0VjbGlwc2VMaW5rTWFwcGluZ0tleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlM2E5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua01hcHBpbmdLZXlzIHsKLQotCVN0cmluZyBCQVNJQ19DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJiYXNpY0NvbGxlY3Rpb24iOwotCVN0cmluZyBCQVNJQ19NQVBfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gImJhc2ljTWFwIjsKLQlTdHJpbmcgVFJBTlNGT1JNQVRJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZID0gInRyYW5zZm9ybWF0aW9uIjsKLQlTdHJpbmcgVkFSSUFCTEVfT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAidmFyaWFibGVPbmVUb09uZSI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWY4M2UzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nIGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZwotewotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNGE3NzYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcKLXsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0Jhc2ljTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2E0NzdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGV4dGVuZHMgQmFzaWNNYXBwaW5nCi17Ci0JRWNsaXBzZUxpbmtNdXRhYmxlIGdldE11dGFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGYyZjAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGVudW0gRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgewotCi0JU0VORF9PQkpFQ1RfQ0hBTkdFUywKLQlJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywKLQlTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywKLQlOT05FOwotCQotCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBmcm9tSmF2YVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGUgamF2YUNhY2hlQ29vcmRpbmF0aW9uVHlwZSkgewotCQlpZiAoamF2YUNhY2hlQ29vcmRpbmF0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGphdmFDYWNoZUNvb3JkaW5hdGlvblR5cGUpIHsKLQkJCWNhc2UgU0VORF9PQkpFQ1RfQ0hBTkdFUzoKLQkJCQlyZXR1cm4gU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLQkJCWNhc2UgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFM6Ci0JCQkJcmV0dXJuIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTOwotCQkJY2FzZSBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUzoKLQkJCQlyZXR1cm4gU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM7Ci0JCQljYXNlIE5PTkU6Ci0JCQkJcmV0dXJuIE5PTkU7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2FjaGUgY29vcmRpbmF0aW9uIHR5cGU6ICIgKyBqYXZhQ2FjaGVDb29yZGluYXRpb25UeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGNhY2hlQ29vcmRpbmF0aW9uVHlwZSkgewotCQlpZiAoY2FjaGVDb29yZGluYXRpb25UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoY2FjaGVDb29yZGluYXRpb25UeXBlKSB7Ci0JCQljYXNlIFNFTkRfT0JKRUNUX0NIQU5HRVM6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVM7Ci0JCQljYXNlIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzsKLQkJCWNhc2UgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTOwotCQkJY2FzZSBOT05FOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5OT05FOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIGNvb3JkaW5hdGlvbiB0eXBlOiAiICsgY2FjaGVDb29yZGluYXRpb25UeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlIG9ybUNhY2hlQ29vcmRpbmF0aW9uVHlwZSkgewotCQlpZiAob3JtQ2FjaGVDb29yZGluYXRpb25UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAob3JtQ2FjaGVDb29yZGluYXRpb25UeXBlKSB7Ci0JCQljYXNlIFNFTkRfT0JKRUNUX0NIQU5HRVM6Ci0JCQkJcmV0dXJuIFNFTkRfT0JKRUNUX0NIQU5HRVM7Ci0JCQljYXNlIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTOgotCQkJCXJldHVybiBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzsKLQkJCWNhc2UgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM6Ci0JCQkJcmV0dXJuIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTOwotCQkJY2FzZSBOT05FOgotCQkJCXJldHVybiBOT05FOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIGNvb3JkaW5hdGlvbiB0eXBlOiAiICsgb3JtQ2FjaGVDb29yZGluYXRpb25UeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZSB0b09ybVJlc291cmNlTW9kZWwoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgY2FjaGVDb29yZGluYXRpb25UeXBlKSB7Ci0JCWlmIChjYWNoZUNvb3JkaW5hdGlvblR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChjYWNoZUNvb3JkaW5hdGlvblR5cGUpIHsKLQkJCWNhc2UgU0VORF9PQkpFQ1RfQ0hBTkdFUzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTOwotCQkJY2FzZSBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzsKLQkJCWNhc2UgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM7Ci0JCQljYXNlIE5PTkU6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuTk9ORTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSBjb29yZGluYXRpb24gdHlwZTogIiArIGNhY2hlQ29vcmRpbmF0aW9uVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMThkOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgZW51bSBFY2xpcHNlTGlua0NhY2hlVHlwZSB7Ci0KLQlTT0ZUX1dFQUssCi0JSEFSRF9XRUFLLAotCVdFQUssCi0JU09GVCwKLQlGVUxMLAotCUNBQ0hFLAotCU5PTkU7Ci0JCi0KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZSBqYXZhQ2FjaGVUeXBlKSB7Ci0JCWlmIChqYXZhQ2FjaGVUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YUNhY2hlVHlwZSkgewotCQkJY2FzZSBGVUxMOgotCQkJCXJldHVybiBGVUxMOwotCQkJY2FzZSBXRUFLOgotCQkJCXJldHVybiBXRUFLOwotCQkJY2FzZSBTT0ZUOgotCQkJCXJldHVybiBTT0ZUOwotCQkJY2FzZSBTT0ZUX1dFQUs6Ci0JCQkJcmV0dXJuIFNPRlRfV0VBSzsKLQkJCWNhc2UgSEFSRF9XRUFLOgotCQkJCXJldHVybiBIQVJEX1dFQUs7Ci0JCQljYXNlIENBQ0hFOgotCQkJCXJldHVybiBDQUNIRTsKLQkJCWNhc2UgTk9ORToKLQkJCQlyZXR1cm4gTk9ORTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSB0eXBlOiAiICsgamF2YUNhY2hlVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUgdG9KYXZhUmVzb3VyY2VNb2RlbChFY2xpcHNlTGlua0NhY2hlVHlwZSBjYWNoZVR5cGUpIHsKLQkJaWYgKGNhY2hlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGNhY2hlVHlwZSkgewotCQkJY2FzZSBGVUxMOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5GVUxMOwotCQkJY2FzZSBXRUFLOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5XRUFLOwotCQkJY2FzZSBTT0ZUOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5TT0ZUOwotCQkJY2FzZSBTT0ZUX1dFQUs6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLlNPRlRfV0VBSzsKLQkJCWNhc2UgSEFSRF9XRUFLOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5IQVJEX1dFQUs7Ci0JCQljYXNlIENBQ0hFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5DQUNIRTsKLQkJCWNhc2UgTk9ORToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUuTk9ORTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSB0eXBlOiAiICsgY2FjaGVUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua0NhY2hlVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlIG9ybUNhY2hlVHlwZSkgewotCQlpZiAob3JtQ2FjaGVUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAob3JtQ2FjaGVUeXBlKSB7Ci0JCQljYXNlIEZVTEw6Ci0JCQkJcmV0dXJuIEZVTEw7Ci0JCQljYXNlIFdFQUs6Ci0JCQkJcmV0dXJuIFdFQUs7Ci0JCQljYXNlIFNPRlQ6Ci0JCQkJcmV0dXJuIFNPRlQ7Ci0JCQljYXNlIFNPRlRfV0VBSzoKLQkJCQlyZXR1cm4gU09GVF9XRUFLOwotCQkJY2FzZSBIQVJEX1dFQUs6Ci0JCQkJcmV0dXJuIEhBUkRfV0VBSzsKLQkJCWNhc2UgQ0FDSEU6Ci0JCQkJcmV0dXJuIENBQ0hFOwotCQkJY2FzZSBOT05FOgotCQkJCXJldHVybiBOT05FOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIHR5cGU6ICIgKyBvcm1DYWNoZVR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlIHRvT3JtUmVzb3VyY2VNb2RlbChFY2xpcHNlTGlua0NhY2hlVHlwZSBjYWNoZVR5cGUpIHsKLQkJaWYgKGNhY2hlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGNhY2hlVHlwZSkgewotCQkJY2FzZSBGVUxMOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEw7Ci0JCQljYXNlIFdFQUs6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuV0VBSzsKLQkJCWNhc2UgU09GVDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5TT0ZUOwotCQkJY2FzZSBTT0ZUX1dFQUs6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuU09GVF9XRUFLOwotCQkJY2FzZSBIQVJEX1dFQUs6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuSEFSRF9XRUFLOwotCQkJY2FzZSBDQUNIRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5DQUNIRTsKLQkJCWNhc2UgTk9ORToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5OT05FOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIHR5cGU6ICIgKyBjYWNoZVR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYTI4YzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ2FjaGluZyBleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JLy8qKioqKioqKioqKioqKioqKiBzaGFyZWQgKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY29tYmluYXRpb24gb2YgZGVmYXVsdFNoYXJlZCBhbmQgc3BlY2lmaWVkU2hhcmVkLgotCSAqIElmIGdldFNwZWNpZmllZFNoYXJlZCgpIHJldHVybnMgbnVsbCwgdGhlbiByZXR1cm4gaXNEZWZhdWx0U2hhcmVkKCkKLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkKCk7Ci0JCi0JYm9vbGVhbiBpc0RlZmF1bHRTaGFyZWQoKTsKLQkJU3RyaW5nIERFRkFVTFRfU0hBUkVEX1BST1BFUlRZID0gImRlZmF1bHRTaGFyZWQiOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gREVGQVVMVF9TSEFSRUQgPSB0cnVlOwotCQotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkU2hhcmVkKCk7Ci0JCi0JLyoqCi0JICogU2V0dGluZyB0aGlzIHRvIGZhbHNlIG1lYW5zIHRoYXQgY2FjaGVUeXBlLCBjYWNoZVNpemUsIGFsd2F5c1JlZnJlc2gsIAotCSAqIHJlZnJlc2hPbmx5SWZOZXdlciwgZGlzYWJsZUhpdHMsIGNhY2hlQ29vcmRpbmF0aW9uVHlwZSB3aWxsIGFsbCBiZSBzZXQgCi0JICogdG8gdGhlaXIgZGVmYXVsdCBzdGF0ZXMuICBUaGVzZSBzZXR0aW5ncyBkbyBub3QgYXBwbHkgdG8gYSBjYWNoZSB0aGF0IGlzIG5vdCBzaGFyZWQKLQkgKiBAcGFyYW0gbmV3U3BlY2lmaWVkU2hhcmVkCi0JICovCi0Jdm9pZCBzZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbiBuZXdTcGVjaWZpZWRTaGFyZWQpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1NIQVJFRF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRTaGFyZWQiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JLy8qKioqKioqKioqKioqKioqKiBjYWNoZSB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKgotCQkKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBkZWZhdWx0VHlwZSBhbmQgc3BlY2lmaWVkVHlwZS4KLQkgKiBJZiBnZXRTcGVjaWZpZWRUeXBlKCkgcmV0dXJucyBudWxsLCB0aGVuIHJldHVybiBnZXREZWZhdWx0VHlwZSgpCi0JICovCi0JRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0VHlwZSgpOwotCQotCUVjbGlwc2VMaW5rQ2FjaGVUeXBlIGdldERlZmF1bHRUeXBlKCk7CQkKLQkJU3RyaW5nIERFRkFVTFRfVFlQRV9QUk9QRVJUWSA9ICJkZWZhdWx0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJRWNsaXBzZUxpbmtDYWNoZVR5cGUgREVGQVVMVF9UWVBFID0gRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLOwotCQkKLQlFY2xpcHNlTGlua0NhY2hlVHlwZSBnZXRTcGVjaWZpZWRUeXBlKCk7CQotCXZvaWQgc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZSBuZXdTcGVjaWZpZWRUeXBlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9UWVBFX1BST1BFUlRZID0gInNwZWNpZmllZFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JLy8qKioqKioqKioqKioqKioqKiBzaXplICoqKioqKioqKioqKioqKioqKioqKioqKgotCQkJCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY29tYmluYXRpb24gb2YgZGVmYXVsdFNpemUgYW5kIHNwZWNpZmllZFNpemUuCi0JICogSWYgZ2V0U3BlY2lmaWVkU2l6ZSgpIHJldHVybnMgbnVsbCwgdGhlbiByZXR1cm4gZ2V0RGVmYXVsdFNpemUoKQotCSAqLwotCWludCBnZXRTaXplKCk7Ci0KLQlpbnQgZ2V0RGVmYXVsdFNpemUoKTsKLQlpbnQgREVGQVVMVF9TSVpFID0gMTAwOwotCQlTdHJpbmcgREVGQVVMVF9TSVpFX1BST1BFUlRZID0gImRlZmF1bHRTaXplIjsgLy8kTk9OLU5MUy0xJAotCi0JSW50ZWdlciBnZXRTcGVjaWZpZWRTaXplKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRTaXplKEludGVnZXIgbmV3U3BlY2lmaWVkU2l6ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfU0laRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRTaXplIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vKioqKioqKioqKioqKioqKiogYWx3YXlzIHJlZnJlc2ggKioqKioqKioqKioqKioqKioqKioqKioqCQkKLQkJCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY29tYmluYXRpb24gb2YgZGVmYXVsdEFsd2F5c1JlZnJlc2ggYW5kIHNwZWNpZmllZEFsd2F5c1JlZnJlc2guCi0JICogSWYgZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpIHJldHVybnMgbnVsbCwgdGhlbiByZXR1cm4gaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpCi0JICovCi0JYm9vbGVhbiBpc0Fsd2F5c1JlZnJlc2goKTsKLQkKLQlib29sZWFuIGlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKTsKLQkJU3RyaW5nIERFRkFVTFRfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFkgPSAiZGVmYXVsdEFsd2F5c1JlZnJlc2giOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gREVGQVVMVF9BTFdBWVNfUkVGUkVTSCA9IGZhbHNlOwotCQotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpOwotCXZvaWQgc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuIG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2gpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0FMV0FZU19SRUZSRVNIX1BST1BFUlRZID0gInNwZWNpZmllZEFsd2F5c1JlZnJlc2giOyAvLyROT04tTkxTLTEkCi0KLQotCS8vKioqKioqKioqKioqKioqKiogcmVmcmVzaCBvbmx5IGlmIG5ld2VyICoqKioqKioqKioqKioqKioqKioqKioqKgotCQkKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBkZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyIGFuZCBzcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIuCi0JICogSWYgZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkgcmV0dXJucyBudWxsLCB0aGVuIHJldHVybiBpc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKQotCSAqLwotCWJvb2xlYW4gaXNSZWZyZXNoT25seUlmTmV3ZXIoKTsKLQkKLQlib29sZWFuIGlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQlTdHJpbmcgREVGQVVMVF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFkgPSAiZGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlciI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBERUZBVUxUX1JFRlJFU0hfT05MWV9JRl9ORVdFUiA9IGZhbHNlOwotCQotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbiBuZXdTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1JFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSA9ICJzcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIiOyAvLyROT04tTkxTLTEkCi0KLQkJCi0JLy8qKioqKioqKioqKioqKioqKiBkaXNhYmxlIGhpdHMgKioqKioqKioqKioqKioqKioqKioqKioqCi0JCQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHREaXNhYmxlSGl0cyBhbmQgc3BlY2lmaWVkRGlzYWJsZUhpdHMuCi0JICogSWYgZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHREaXNhYmxlSGl0cygpCi0JICovCi0JYm9vbGVhbiBpc0Rpc2FibGVIaXRzKCk7Ci0JCi0JYm9vbGVhbiBpc0RlZmF1bHREaXNhYmxlSGl0cygpOwotCQlTdHJpbmcgREVGQVVMVF9ESVNBQkxFX0hJVFNfUFJPUEVSVFkgPSAiZGVmYXVsdERpc2FibGVIaXRzIjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIERFRkFVTFRfRElTQUJMRV9ISVRTID0gZmFsc2U7Ci0JCi0JQm9vbGVhbiBnZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpOwotCXZvaWQgc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbiBuZXdTcGVjaWZpZWREaXNhYmxlSGl0cyk7Ci0JCVN0cmluZyBTUEVDSUZJRURfRElTQUJMRV9ISVRTX1BST1BFUlRZID0gInNwZWNpZmllZERpc2FibGVIaXRzIjsgLy8kTk9OLU5MUy0xJAotCi0JCQotCS8vKioqKioqKioqKioqKioqKiogY29vcmRpbmF0aW9uIHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY29tYmluYXRpb24gb2YgZGVmYXVsdENvb3JkaW5hdGlvblR5cGUgYW5kIHNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUuCi0JICogSWYgZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpIHJldHVybnMgbnVsbCwgdGhlbiByZXR1cm4gZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKQotCSAqLwotCUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldENvb3JkaW5hdGlvblR5cGUoKTsKLQkKLQlFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpOwkJCi0JCVN0cmluZyBERUZBVUxUX0NPT1JESU5BVElPTl9UWVBFX1BST1BFUlRZID0gImRlZmF1bHRDb29yZGluYXRpb25UeXBlIjsgLy8kTk9OLU5MUy0xJAotCQlFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBERUZBVUxUX0NPT1JESU5BVElPTl9UWVBFID0gRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLQkJCi0JRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpOwkKLQl2b2lkIHNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgbmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQ09PUkRJTkFUSU9OX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCQkJCi0JLy8qKioqKioqKioqKioqKioqKiBleGlzdGVuY2UgY2hlY2tpbmcgKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY29tYmluYXRpb24gb2YgZGVmYXVsdEV4aXN0ZW5jZVR5cGUgYW5kIHNwZWNpZmllZEV4aXN0ZW5jZVR5cGUuCi0JICogSWYgZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpIHJldHVybnMgbnVsbCwgdGhlbiByZXR1cm4gZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKQotCSAqLwotCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXRFeGlzdGVuY2VUeXBlKCk7Ci0JCi0JRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCk7CQkKLQkJU3RyaW5nIERFRkFVTFRfRVhJU1RFTkNFX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdEV4aXN0ZW5jZVR5cGUiOyAvLyROT04tTkxTLTEkCi0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBERUZBVUxUX0VYSVNURU5DRV9UWVBFID0gRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFOwotCQkKLQlFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpOwkKLQl2b2lkIHNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG5ld1NwZWNpZmllZEV4aXN0ZW5jZVR5cGUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZID0gInNwZWNpZmllZEV4aXN0ZW5jZVR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkJCi0JLy8qKioqKioqKioqKioqKioqKiBleHBpcnkgKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBjb3JyZXNwb25kcyB0byB0aGUgQ2FjaGUgZXhwaXJ5IGVsZW1lbnQuICBJZiB0aGlzIHJldHVybnMKLQkgKiBhIG5vbi1udWxsIHZhbHVlIHRoZW4gZ2V0RXhwaXJ5VGltZU9mRGF5IHdpbGwgcmV0dXJuIG51bGwuCi0JICogSXQgaXMgbm90IHZhbGlkIHRvIHNwZWNpZnkgYm90aAotCSAqLwotCUludGVnZXIgZ2V0RXhwaXJ5KCk7Ci0JCi0JLyoqCi0JICogU2V0dGluZyB0aGlzIHRvIGEgbm9uLW51bGwgdmFsdWUgd2lsbCBzZXQgdGltZU9mRGF5RXhwaXJ5IHRvIG51bGwKLQkgKiBAcGFyYW0gZXhwaXJ5Ci0JICovCi0Jdm9pZCBzZXRFeHBpcnkoSW50ZWdlciBleHBpcnkpOwotCQlTdHJpbmcgRVhQSVJZX1BST1BFUlRZID0gImV4cGlyeSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJCi0JLyoqCi0JICogY29ycmVzcG9uZHMgdG8gdGhlIENhY2hlIGV4cGlyeVRpbWVPZkRheSBhbm5vdGF0aW9uIG9yIHhtbCBlbGVtZW50LiAgCi0JICogSWYgdGhpcyByZXR1cm5zIGEgbm9uLW51bGwgdmFsdWUgdGhlbiBnZXRFeHBpcnkgd2lsbCByZXR1cm4gbnVsbC4KLQkgKiBJdCBpcyBub3QgdmFsaWQgdG8gc3BlY2lmeSBib3RoLgotCSAqLwotCUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IGdldEV4cGlyeVRpbWVPZkRheSgpOwotCQotCS8qKgotCSAqIEFkZCBDYWNoZSBleHBpcnlUaW1lT2ZEYXkgYW5ub3RhdGlvbiBvciB4bWwgZWxlbWVudCwgdGhpcyB3aWxsIHNldCAKLQkgKiBFeHBpcnkgdG8gbnVsbCBhcyBpdCBpcyBub3QgdmFsaWQgdG8gc2V0IGJvdGggZXhwaXJ5IGFuZCB0aW1lT2ZEYXlFeHBpcnkKLQkgKi8KLQlFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSBhZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBDYWNoZSBleHBpcnlUaW1lT2ZEYXkgYW5ub3RhdGlvbi94bWwgZWxlbWVudAotCSAqLwotCXZvaWQgcmVtb3ZlRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCVN0cmluZyBFWFBJUllfVElNRV9PRl9EQVlfUFJPUEVSVFkgPSAiZXhwaXJ5VGltZU9mRGF5IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTUwNGM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRUeXBlIGFuZCBzcGVjaWZpZWRUeXBlLgotCSAqIElmIGdldFNwZWNpZmllZFR5cGUoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHRUeXBlKCkKLQkgKi8KLQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXRUeXBlKCk7Ci0JCi0JRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0RGVmYXVsdFR5cGUoKTsJCQotCQlTdHJpbmcgREVGQVVMVF9UWVBFX1BST1BFUlRZID0gImRlZmF1bHRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBERUZBVUxUX1RZUEUgPSBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPOwotCQkKLQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXRTcGVjaWZpZWRUeXBlKCk7CQotCXZvaWQgc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBuZXdTcGVjaWZpZWRUeXBlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9UWVBFX1BST1BFUlRZID0gInNwZWNpZmllZFR5cGUiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OThkYzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlOwotCi0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGVudW0gRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgewotCi0JQVRUUklCVVRFLAotCU9CSkVDVCwKLQlERUZFUlJFRCwKLQlBVVRPOwotCQotCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBmcm9tSmF2YVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUgamF2YUNoYW5nZVRyYWNraW5nVHlwZSkgewotCQlpZiAoamF2YUNoYW5nZVRyYWNraW5nVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGphdmFDaGFuZ2VUcmFja2luZ1R5cGUpIHsKLQkJCWNhc2UgQVRUUklCVVRFOgotCQkJCXJldHVybiBBVFRSSUJVVEU7Ci0JCQljYXNlIE9CSkVDVDoKLQkJCQlyZXR1cm4gT0JKRUNUOwotCQkJY2FzZSBERUZFUlJFRDoKLQkJCQlyZXR1cm4gREVGRVJSRUQ7Ci0JCQljYXNlIEFVVE86Ci0JCQkJcmV0dXJuIEFVVE87Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2hhbmdlIHRyYWNraW5nIHR5cGU6ICIgKyBqYXZhQ2hhbmdlVHJhY2tpbmdUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGNoYW5nZVRyYWNraW5nVHlwZSkgewotCQlpZiAoY2hhbmdlVHJhY2tpbmdUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoY2hhbmdlVHJhY2tpbmdUeXBlKSB7Ci0JCQljYXNlIEFUVFJJQlVURToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFOwotCQkJY2FzZSBPQkpFQ1Q6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVDsKLQkJCWNhc2UgREVGRVJSRUQ6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEOwotCQkJY2FzZSBBVVRPOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNoYW5nZSB0cmFja2luZyB0eXBlOiAiICsgY2hhbmdlVHJhY2tpbmdUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZnJvbU9ybVJlc291cmNlTW9kZWwoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIG9ybUNoYW5nZVRyYWNraW5nVHlwZSkgewotCQlpZiAob3JtQ2hhbmdlVHJhY2tpbmdUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAob3JtQ2hhbmdlVHJhY2tpbmdUeXBlKSB7Ci0JCQljYXNlIEFUVFJJQlVURToKLQkJCQlyZXR1cm4gQVRUUklCVVRFOwotCQkJY2FzZSBPQkpFQ1Q6Ci0JCQkJcmV0dXJuIE9CSkVDVDsKLQkJCWNhc2UgREVGRVJSRUQ6Ci0JCQkJcmV0dXJuIERFRkVSUkVEOwotCQkJY2FzZSBBVVRPOgotCQkJCXJldHVybiBBVVRPOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNoYW5nZSB0cmFja2luZyB0eXBlOiAiICsgb3JtQ2hhbmdlVHJhY2tpbmdUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIHRvT3JtUmVzb3VyY2VNb2RlbChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBjaGFuZ2VUcmFja2luZ1R5cGUpIHsKLQkJaWYgKGNoYW5nZVRyYWNraW5nVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGNoYW5nZVRyYWNraW5nVHlwZSkgewotCQkJY2FzZSBBVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEU7Ci0JCQljYXNlIE9CSkVDVDoKLQkJCQlyZXR1cm4gWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVDsKLQkJCWNhc2UgREVGRVJSRUQ6Ci0JCQkJcmV0dXJuIFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRDsKLQkJCWNhc2UgQVVUTzoKLQkJCQlyZXR1cm4gWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE87Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2hhbmdlIHRyYWNraW5nIHR5cGU6ICIgKyBjaGFuZ2VUcmFja2luZ1R5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY1NWM1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byBhIENvbnZlcnNpb25WYWx1ZSByZXNvdXJjZSBtb2RlbCBvYmplY3QKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlTdHJpbmcgZ2V0RGF0YVZhbHVlKCk7CQotCXZvaWQgc2V0RGF0YVZhbHVlKFN0cmluZyBkYXRhVmFsdWUpOwotCQlTdHJpbmcgREFUQV9WQUxVRV9QUk9QRVJUWSA9ICJkYXRhVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JCQotCVN0cmluZyBnZXRPYmplY3RWYWx1ZSgpOwkKLQl2b2lkIHNldE9iamVjdFZhbHVlKFN0cmluZyBvYmplY3RWYWx1ZSk7Ci0JCVN0cmluZyBPQkpFQ1RfVkFMVUVfUFJPUEVSVFkgPSAib2JqZWN0VmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0UGFyZW50KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ29udmVydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmVhNjI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ29udmVydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byBhIENvbnZlcnQgcmVzb3VyY2UgbW9kZWwgb2JqZWN0Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NvbnZlcnQgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZSwgQ29udmVydGVyCi17Ci0JCi0JU3RyaW5nIEVDTElQU0VfTElOS19DT05WRVJURVIgPSAiZWNsaXBzZUxpbmtDb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIGdldENvbnZlcnRlck5hbWUoKTsKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdENvbnZlcnRlck5hbWUoKTsKLQkJU3RyaW5nIERFRkFVTFRfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFkgPSAiZGVmYXVsdENvbnZlcnRlck5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpOwotCQotCXZvaWQgc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZShTdHJpbmcgY29udmVydGVyTmFtZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ29udmVydGVyTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXNlcnZlZCBuYW1lIGZvciBzcGVjaWZ5aW5nIGEgc2VyaWFsaXplZCBvYmplY3QgY29udmVydGVyLiAgSW4gdGhpcwotCSAqIGNhc2UgdGhlcmUgZG9lcyBub3QgbmVlZCB0byBiZSBhIGNvcnJlc3BvbmRpbmcgQEN1c3RvbUNvbnZlcnRlciBkZWZpbmVkLgotCSAqLwotCVN0cmluZyBTRVJJQUxJWkVEX0NPTlZFUlRFUiA9ICJzZXJpYWxpemVkIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJlc2VydmVkIG5hbWUgZm9yIHNwZWNpZnlpbmcgYSBjbGFzcyBpbnN0YW5jZSBjb252ZXJ0ZXIuICBXaWxsIHVzZSBhIENsYXNzSW5zdGFuY2VDb252ZXJ0ZXIKLQkgKiBvbiB0aGUgYXNzb2NpYXRlZCBtYXBwaW5nLiAgV2hlbiB1c2luZyBhIENsYXNzSW5zdGFuY2VDb252ZXJ0ZXIgdGhlIGRhdGFiYXNlIHJlcHJlc2VudGF0aW9uIGlzIGEgCi0JICogU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgQ2xhc3MgbmFtZSBhbmQgdGhlIG9iamVjdC1tb2RlbCByZXByZXNlbnRhdGlvbiBpcyBhbiBpbnN0YW5jZSAKLQkgKiBvZiB0aGF0IGNsYXNzIGJ1aWx0IHdpdGggYSBuby1hcmdzIGNvbnN0cnVjdG9yCi0JICogSW4gdGhpcyBjYXNlIHRoZXJlIGRvZXMgbm90IG5lZWQgdG8gYmUgYSBjb3JyZXNwb25kaW5nIEBDdXN0b21Db252ZXJ0ZXIgZGVmaW5lZC4KLQkgKi8KLQlTdHJpbmcgQ0xBU1NfSU5TVEFOQ0VfQ09OVkVSVEVSID0gImNsYXNzLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJlc2VydmVkIG5hbWUgZm9yIHNwZWNpZnlpbmcgbm8gY29udmVydGVyLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBhIHNpdHVhdGlvbiB3aGVyZSBlaXRoZXIgCi0JICogIGFub3RoZXIgY29udmVydGVyIGlzIGRlZmF1bHRlZCBvciBhbm90aGVyIGNvbnZlcnRlciBpcyBzZXQuCi0JICogIEluIHRoaXMgY2FzZSB0aGVyZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGEgY29ycmVzcG9uZGluZyBAQ3VzdG9tQ29udmVydGVyIGRlZmluZWQuCi0JICovCi0JU3RyaW5nIE5PX0NPTlZFUlRFUiA9ICJub25lIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZ1tdIFJFU0VSVkVEX0NPTlZFUlRFUl9OQU1FUyA9IHtOT19DT05WRVJURVIsIENMQVNTX0lOU1RBTkNFX0NPTlZFUlRFUiwgU0VSSUFMSVpFRF9DT05WRVJURVJ9OwotCQotCVN0cmluZyBERUZBVUxUX0NPTlZFUlRFUl9OQU1FID0gTk9fQ09OVkVSVEVSOwotCi0JLyoqCi0JICogVGhpcyB3aWxsIHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIGNvbnZlcnRlciBzcGVjaWZpZWQgb24gdGhlIG1hcHBpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JRWNsaXBzZUxpbmtDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCk7Ci0JCVN0cmluZyBDT05WRVJURVJfUFJPUEVSVFkgPSAiY29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlcyBmb3IgY29udmVydGVyIHR5cGUgYXJlOgotCSAqIHtAdmFsdWUgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlciNUWVBFX0NPTlZFUlRFUn0KLQkgKiB7QHZhbHVlIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXIjU1RSVUNUX0NPTlZFUlRFUn0KLQkgKiB7QHZhbHVlIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXIjQ1VTVE9NX0NPTlZFUlRFUn0KLQkgKiB7QHZhbHVlIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXIjTk9fQ09OVkVSVEVSfQotCSAqIHtAdmFsdWUgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlciNPQkpFQ1RfVFlQRV9DT05WRVJURVJ9Ci0JICogQHBhcmFtIGNvbnZlcnRlclR5cGUKLQkgKi8KLQl2b2lkIHNldENvbnZlcnRlcihTdHJpbmcgY29udmVydGVyVHlwZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDliM2Y5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIGEgKkN1c3RvbUNvbnZlcnRlciByZXNvdXJjZSBtb2RlbCBvYmplY3QKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ29udmVydGVyIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSB0eXBlIG9mIGNvbnZlcnRlci4KLQkgKiBQb3NzaWJpbGl0aWVzIGFyZSBiZWxvdywgTk9fQ09OVkVSVEVSLCBDVVNUT01fQ09OVkVSVEVSLCAKLQkgKiBPQkpFQ1RfVFlQRV9DT05WRVJURVIsIFNUUlVDVF9DT05WRVJURVIsIFRZUEVfQ09OVkVSVEVSCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQkJU3RyaW5nIE5PX0NPTlZFUlRFUiA9ICJub0NvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIENVU1RPTV9DT05WRVJURVIgPSAiY3VzdG9tQ29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gIm9iamVjdFR5cGVDb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBTVFJVQ1RfQ09OVkVSVEVSID0gInN0cnVjdENvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIFRZUEVfQ09OVkVSVEVSID0gInR5cGVDb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIGdldE5hbWUoKTsJCi0Jdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXIgdG8gYmUgdXNlZCBmb3IgYnJvd3Npbmcgb3IgY3JlYXRpbmcgdGhlIGNvbnZlcnRlciBjbGFzcyBJVHlwZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlI2dldEZ1bGx5UXVhbGlmaWVkTmFtZShjaGFyKQotCSAqLwotCWNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbnZlcnRlciBkZWZpbml0aW9uIG92ZXJyaWRlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgCi0JICogZ2l2ZW4gY29udmVydGVyCi0JICogKGUuZy4gYSBjb252ZXJ0ZXIgZGVmaW5lZCBpbiBvcm0ueG1sIG92ZXJyaWRlcyBvbmUgZGVmaW5lZCBpbiBqYXZhKS4KLQkgKi8KLQlib29sZWFuIG92ZXJyaWRlcyhFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb252ZXJ0ZXIgaXMgYSBkdXBsaWNhdGUgb2YgdGhlIGdpdmVuIGNvbnZlcnRlci4KLQkgKiBBIGNvbnZlcnRlciBpcyBub3QgYSBkdXBsaWNhdGUgb2YgYW5vdGhlciBjb252ZXJ0ZXIgaWYgaXMgdGhlIHNhbWUgZXhhY3QgY29udmVydGVyLAotCSAqIGlmIGl0IGlzIGEgbmFtZWxlc3MgY29udmVydGVyICh3aGljaCBpcyBhbiBlcnJvciBjb25kaXRpb24pLCBvciBpZiBpdCBvdmVycmlkZXMgCi0JICogb3IgaXMgb3ZlcnJpZGRlbiBieSB0aGUgb3RoZXIgY29udmVydGVyLiAKLQkgKi8KLQlib29sZWFuIGR1cGxpY2F0ZXMoRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTZkYjIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gYSBDdXN0b21Db252ZXJ0ZXIgcmVzb3VyY2UgbW9kZWwgb2JqZWN0Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyCi17Ci0JCQotCVN0cmluZyBnZXRDb252ZXJ0ZXJDbGFzcygpOwkKLQl2b2lkIHNldENvbnZlcnRlckNsYXNzKFN0cmluZyBjb252ZXJ0ZXJDbGFzcyk7Ci0JCVN0cmluZyBDT05WRVJURVJfQ0xBU1NfUFJPUEVSVFkgPSAiY29udmVydGVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBFQ0xJUFNFTElOS19DT05WRVJURVJfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDdXN0b21pemVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0N1c3RvbWl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA3ZDZlNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0N1c3RvbWl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gYSBDdXN0b21pemVyIHJlc291cmNlIG1vZGVsIG9iamVjdAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDdXN0b21pemVyIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQkKLQlTdHJpbmcgZ2V0Q3VzdG9taXplckNsYXNzKCk7Ci0JCi0JU3RyaW5nIGdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKTsKLQkJU3RyaW5nIERFRkFVTFRfQ1VTVE9NSVpFUl9DTEFTU19QUk9QRVJUWSA9ICJkZWZhdWx0Q3VzdG9taXplckNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBnZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKTsJCi0Jdm9pZCBzZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoU3RyaW5nIGN1c3RvbWl6ZXJDbGFzcyk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQ1VTVE9NSVpFUl9DTEFTU19QUk9QRVJUWSA9ICJzcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBFQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuRGVzY3JpcHRvckN1c3RvbWl6ZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXIgdG8gYmUgdXNlZCBmb3IgYnJvd3Npbmcgb3IgY3JlYXRpbmcgdGhlIGN1c3RvbWl6ZXIgY2xhc3MgSVR5cGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSNnZXRGdWxseVF1YWxpZmllZE5hbWUoY2hhcikKLQkgKi8KLQljaGFyIGdldEN1c3RvbWl6ZXJDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFbWJlZGRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0VtYmVkZGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI2M2FjZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0VtYmVkZGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtFbWJlZGRhYmxlIAotCWV4dGVuZHMgRWNsaXBzZUxpbmtUeXBlTWFwcGluZywgRW1iZWRkYWJsZQotewotCUVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCk7Ci0JCi0JRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0VudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjU3NDEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtFbnRpdHkKLQlleHRlbmRzIEVjbGlwc2VMaW5rVHlwZU1hcHBpbmcsIEVudGl0eQotewotCUVjbGlwc2VMaW5rQ2FjaGluZyBnZXRDYWNoaW5nKCk7Ci0JCi0JRWNsaXBzZUxpbmtSZWFkT25seSBnZXRSZWFkT25seSgpOwotCQotCUVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCk7Ci0JCi0JRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlNDI4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgZW51bSBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgewotCi0gICAgQ0hFQ0tfQ0FDSEUsCi0gICAgQ0hFQ0tfREFUQUJBU0UsCi0gICAgQVNTVU1FX0VYSVNURU5DRSwKLSAgICBBU1NVTUVfTk9OX0VYSVNURU5DRTsKLQkKLQotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUgamF2YUV4aXN0ZW5jZVR5cGUpIHsKLQkJaWYgKGphdmFFeGlzdGVuY2VUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YUV4aXN0ZW5jZVR5cGUpIHsKLQkJCWNhc2UgQ0hFQ0tfQ0FDSEU6Ci0JCQkJcmV0dXJuIENIRUNLX0NBQ0hFOwotCQkJY2FzZSBDSEVDS19EQVRBQkFTRToKLQkJCQlyZXR1cm4gQ0hFQ0tfREFUQUJBU0U7Ci0JCQljYXNlIEFTU1VNRV9FWElTVEVOQ0U6Ci0JCQkJcmV0dXJuIEFTU1VNRV9FWElTVEVOQ0U7Ci0JCQljYXNlIEFTU1VNRV9OT05fRVhJU1RFTkNFOgotCQkJCXJldHVybiBBU1NVTUVfTk9OX0VYSVNURU5DRTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBleGlzdGVuY2UgdHlwZTogIiArIGphdmFFeGlzdGVuY2VUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUgdG9KYXZhUmVzb3VyY2VNb2RlbChFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZXhpc3RlbmNlVHlwZSkgewotCQlpZiAoZXhpc3RlbmNlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGV4aXN0ZW5jZVR5cGUpIHsKLQkJCWNhc2UgQ0hFQ0tfQ0FDSEU6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZS5DSEVDS19DQUNIRTsKLQkJCWNhc2UgQ0hFQ0tfREFUQUJBU0U6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRTsKLQkJCWNhc2UgQVNTVU1FX0VYSVNURU5DRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0U7Ci0JCQljYXNlIEFTU1VNRV9OT05fRVhJU1RFTkNFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0U7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZXhpc3RlbmNlIHR5cGU6ICIgKyBleGlzdGVuY2VUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZnJvbU9ybVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUgb3JtRXhpc3RlbmNlVHlwZSkgewotCQlpZiAob3JtRXhpc3RlbmNlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKG9ybUV4aXN0ZW5jZVR5cGUpIHsKLQkJCWNhc2UgQ0hFQ0tfQ0FDSEU6Ci0JCQkJcmV0dXJuIENIRUNLX0NBQ0hFOwotCQkJY2FzZSBDSEVDS19EQVRBQkFTRToKLQkJCQlyZXR1cm4gQ0hFQ0tfREFUQUJBU0U7Ci0JCQljYXNlIEFTU1VNRV9FWElTVEVOQ0U6Ci0JCQkJcmV0dXJuIEFTU1VNRV9FWElTVEVOQ0U7Ci0JCQljYXNlIEFTU1VNRV9OT05fRVhJU1RFTkNFOgotCQkJCXJldHVybiBBU1NVTUVfTk9OX0VYSVNURU5DRTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBleGlzdGVuY2UgdHlwZTogIiArIG9ybUV4aXN0ZW5jZVR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZSB0b09ybVJlc291cmNlTW9kZWwoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGV4aXN0ZW5jZVR5cGUpIHsKLQkJaWYgKGV4aXN0ZW5jZVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChleGlzdGVuY2VUeXBlKSB7Ci0JCQljYXNlIENIRUNLX0NBQ0hFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5DSEVDS19DQUNIRTsKLQkJCWNhc2UgQ0hFQ0tfREFUQUJBU0U6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFOwotCQkJY2FzZSBBU1NVTUVfRVhJU1RFTkNFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFOwotCQkJY2FzZSBBU1NVTUVfTk9OX0VYSVNURU5DRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0U7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZXhpc3RlbmNlIHR5cGU6ICIgKyBleGlzdGVuY2VUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmNTIwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byBhIFRpbWVPZkRheSByZXNvdXJjZSBtb2RlbCBvYmplY3QKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQkKLQlJbnRlZ2VyIGdldEhvdXIoKTsKLQl2b2lkIHNldEhvdXIoSW50ZWdlciBob3VyKTsKLQkJU3RyaW5nIEhPVVJfUFJPUEVSVFkgPSAiaG91ciI7IC8vJE5PTi1OTFMtMSQKLQotCUludGVnZXIgZ2V0TWludXRlKCk7Ci0Jdm9pZCBzZXRNaW51dGUoSW50ZWdlciBtaW51dGUpOwotCQlTdHJpbmcgTUlOVVRFX1BST1BFUlRZID0gIm1pbnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlJbnRlZ2VyIGdldFNlY29uZCgpOwotCXZvaWQgc2V0U2Vjb25kKEludGVnZXIgc2Vjb25kKTsKLQkJU3RyaW5nIFNFQ09ORF9QUk9QRVJUWSA9ICJzZWNvbmQiOyAvLyROT04tTkxTLTEkCi0JCi0JSW50ZWdlciBnZXRNaWxsaXNlY29uZCgpOwotCXZvaWQgc2V0TWlsbGlzZWNvbmQoSW50ZWdlciBtaWxsaXNlY29uZCk7Ci0JCVN0cmluZyBNSUxMSVNFQ09ORF9QUk9QRVJUWSA9ICJtaWxsaXNlY29uZCI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtJZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rSWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNmQzZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtJZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtJZE1hcHBpbmcgZXh0ZW5kcyBJZE1hcHBpbmcKLXsKLQlFY2xpcHNlTGlua011dGFibGUgZ2V0TXV0YWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rSm9pbkZldGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ODkzYTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rSm9pbkZldGNoIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgZ2V0VmFsdWUoKTsKLQl2b2lkIHNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBuZXdKb2luRmV0Y2hWYWx1ZSk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIERFRkFVTFRfVkFMVUUgPSBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDYxN2YzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGVudW0gRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIHsKLQotCUlOTkVSLAotCU9VVEVSOwotCQotCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZSBqYXZhSm9pbkZldGNoVHlwZSkgewotCQlpZiAoamF2YUpvaW5GZXRjaFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChqYXZhSm9pbkZldGNoVHlwZSkgewotCQkJY2FzZSBJTk5FUjoKLQkJCQlyZXR1cm4gSU5ORVI7Ci0JCQljYXNlIE9VVEVSOgotCQkJCXJldHVybiBPVVRFUjsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBqb2luIGZldGNoIHR5cGU6ICIgKyBqYXZhSm9pbkZldGNoVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlIHRvSmF2YVJlc291cmNlTW9kZWwoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGpvaW5GZXRjaFR5cGUpIHsKLQkJaWYgKGpvaW5GZXRjaFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChqb2luRmV0Y2hUeXBlKSB7Ci0JCQljYXNlIElOTkVSOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVI7Ci0JCQljYXNlIE9VVEVSOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVI7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gam9pbiBmZXRjaCB0eXBlOiAiICsgam9pbkZldGNoVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKFhtbEpvaW5GZXRjaFR5cGUgb3JtSm9pbkZldGNoVHlwZSkgewotCQlpZiAob3JtSm9pbkZldGNoVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKG9ybUpvaW5GZXRjaFR5cGUpIHsKLQkJCWNhc2UgSU5ORVI6Ci0JCQkJcmV0dXJuIElOTkVSOwotCQkJY2FzZSBPVVRFUjoKLQkJCQlyZXR1cm4gT1VURVI7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gam9pbiBmZXRjaCB0eXBlOiAiICsgb3JtSm9pbkZldGNoVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFhtbEpvaW5GZXRjaFR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBmZXRjaFR5cGUpIHsKLQkJaWYgKGZldGNoVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGZldGNoVHlwZSkgewotCQkJY2FzZSBJTk5FUjoKLQkJCQlyZXR1cm4gWG1sSm9pbkZldGNoVHlwZS5JTk5FUjsKLQkJCWNhc2UgT1VURVI6Ci0JCQkJcmV0dXJuIFhtbEpvaW5GZXRjaFR5cGUuT1VURVI7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gam9pbiBmZXRjaCB0eXBlOiAiICsgZmV0Y2hUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmQ3ODNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MKLQlleHRlbmRzIEVjbGlwc2VMaW5rVHlwZU1hcHBpbmcsIE1hcHBlZFN1cGVyY2xhc3MKLXsKLQlFY2xpcHNlTGlua0NhY2hpbmcgZ2V0Q2FjaGluZygpOwotCQotCUVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0UmVhZE9ubHkoKTsKLQkKLQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpOwotCQotCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua011dGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rTXV0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTYxNDkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rTXV0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtNdXRhYmxlIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlib29sZWFuIGlzTXV0YWJsZSgpOwotCQotCWJvb2xlYW4gaXNEZWZhdWx0TXV0YWJsZSgpOwotCQlTdHJpbmcgREVGQVVMVF9NVVRBQkxFX1BST1BFUlRZID0gImRlZmF1bHRNdXRhYmxlIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlCb29sZWFuIGdldFNwZWNpZmllZE11dGFibGUoKTsKLQl2b2lkIHNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRNdXRhYmxlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9NVVRBQkxFX1BST1BFUlRZID0gInNwZWNpZmllZE11dGFibGUiOyAgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0ZDJjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gYSBPYmplY3RUeXBlQ29udmVydGVyIHJlc291cmNlIG1vZGVsIG9iamVjdAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXIKLXsKLQlTdHJpbmcgZ2V0RGF0YVR5cGUoKTsJCi0Jdm9pZCBzZXREYXRhVHlwZShTdHJpbmcgZGF0YVR5cGUpOwotCQlTdHJpbmcgREFUQV9UWVBFX1BST1BFUlRZID0gImRhdGFUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpOwkKLQl2b2lkIHNldE9iamVjdFR5cGUoU3RyaW5nIG9iamVjdFR5cGUpOwotCQlTdHJpbmcgT0JKRUNUX1RZUEVfUFJPUEVSVFkgPSAib2JqZWN0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8vICoqKioqKioqKioqKioqKiogY29udmVyc2lvbiB2YWx1ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIGNvbnZlcnNpb24gdmFsdWVzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBMaXN0SXRlcmF0b3I8VD4gY29udmVyc2lvblZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY29udmVyc2lvbiB2YWx1ZXMuCi0JICovCi0JaW50IGNvbnZlcnNpb25WYWx1ZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBjb252ZXJzaW9uIHZhbHVlIHRvIHRoZSBvYmplY3QgdHlwZSBtYXBwaW5nIHJldHVybiB0aGUgb2JqZWN0IAotCSAqIHJlcHJlc2VudGluZyBpdC4KLQkgKi8KLQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBhZGRDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEFkZCBhIGNvbnZlcnNpb24gdmFsdWUgdG8gdGhlIG9iamVjdCB0eXBlIG1hcHBpbmcgcmV0dXJuIHRoZSBvYmplY3QgCi0JICogcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGFkZENvbnZlcnNpb25WYWx1ZSgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBjb252ZXJzaW9uIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleCBmcm9tIHRoZSBlbnRpdHkuCi0JICovCi0Jdm9pZCByZW1vdmVDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgY29udmVyc2lvbiB2YWx1ZSBmcm9tIHRoZSBlbnRpdHkuCi0JICovCi0Jdm9pZCByZW1vdmVDb252ZXJzaW9uVmFsdWUoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlKTsKLQotCS8qKgotCSAqIE1vdmUgdGhlIGNvbnZlcnNpb24gdmFsdWVzIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZUNvbnZlcnNpb25WYWx1ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCVN0cmluZyBDT05WRVJTSU9OX1ZBTFVFU19MSVNUID0gImNvbnZlcnNpb25WYWx1ZXMiOyAvLyROT04tTkxTLTEkCi0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgTGlzdEl0ZXJhdG9yIG9mIHRoZSBDb252ZXJzaW9uVmFsdWUgZGF0YVZhbHVlcy4KLQkgKiBAcmV0dXJuCi0JICovCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gZGF0YVZhbHVlcygpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogZGVmYXVsdCBvYmplY3QgdmFsdWUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCk7Ci0Jdm9pZCBzZXREZWZhdWx0T2JqZWN0VmFsdWUoU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSk7Ci0JCVN0cmluZyBERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSA9ICJkZWZhdWx0T2JqZWN0VmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MGI4NTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyAKLQlleHRlbmRzIE9uZVRvTWFueU1hcHBpbmcsIEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZwotewotCUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOwotCQotCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGdldFByaXZhdGVPd25lZCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYTYyNDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwUmVmZXJlbmNlOwotCi0KLS8qKgotICogUmVwcmVzZW50cyB0aGUge0BsaW5rIFJlbGF0aW9uc2hpcFJlZmVyZW5jZX0gb2YgYW4gCi0gKiB7QGxpbmsgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nfQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UKLQlleHRlbmRzIE9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwKLQkJSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UKLXsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTZlNjAzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIGV4dGVuZHMgT25lVG9PbmVNYXBwaW5nLCBFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBnZXRQcml2YXRlT3duZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rUHJpdmF0ZU93bmVkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1ByaXZhdGVPd25lZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWUxNWM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rUHJpdmF0ZU93bmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JYm9vbGVhbiBpc1ByaXZhdGVPd25lZCgpOwotCXZvaWQgc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4gcHJpdmF0ZU93bmVkKTsKLQkJU3RyaW5nIFBSSVZBVEVfT1dORURfUFJPUEVSVFkgPSAicHJpdmF0ZU93bmVkIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtSZWFkT25seS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtSZWFkT25seS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODc2YTM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rUmVhZE9ubHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1JlYWRPbmx5IGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlib29sZWFuIGlzUmVhZE9ubHkoKTsKLQkKLQlib29sZWFuIGlzRGVmYXVsdFJlYWRPbmx5KCk7Ci0JCVN0cmluZyBERUZBVUxUX1JFQURfT05MWV9QUk9QRVJUWSA9ICJkZWZhdWx0UmVhZE9ubHkiOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gREVGQVVMVF9SRUFEX09OTFkgPSBmYWxzZTsKLQkKLQlCb29sZWFuIGdldFNwZWNpZmllZFJlYWRPbmx5KCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuIG5ld1NwZWNpZmllZFJlYWRPbmx5KTsKLQkJU3RyaW5nIFNQRUNJRklFRF9SRUFEX09OTFlfUFJPUEVSVFkgPSAic3BlY2lmaWVkUmVhZE9ubHkiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjBkZGMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgCi0JZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JRWNsaXBzZUxpbmtKb2luRmV0Y2ggZ2V0Sm9pbkZldGNoKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3M2JmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIGEgU3RydWN0Q29udmVydGVyIHJlc291cmNlIG1vZGVsIG9iamVjdAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcgotewotCVN0cmluZyBnZXRDb252ZXJ0ZXJDbGFzcygpOwkKLQl2b2lkIHNldENvbnZlcnRlckNsYXNzKFN0cmluZyBjb252ZXJ0ZXJDbGFzcyk7Ci0JCVN0cmluZyBDT05WRVJURVJfQ0xBU1NfUFJPUEVSVFkgPSAiY29udmVydGVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBFQ0xJUFNFTElOS19TVFJVQ1RfQ09OVkVSVEVSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uZGF0YWJhc2UuY29udmVydGVycy5TdHJ1Y3RDb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzE3ZmRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcKLXsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MDkxNzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gYSBUeXBlQ29udmVydGVyIHJlc291cmNlIG1vZGVsIG9iamVjdAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXIKLXsKLQlTdHJpbmcgZ2V0RGF0YVR5cGUoKTsJCi0Jdm9pZCBzZXREYXRhVHlwZShTdHJpbmcgZGF0YVR5cGUpOwotCQlTdHJpbmcgREFUQV9UWVBFX1BST1BFUlRZID0gImRhdGFUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpOwkKLQl2b2lkIHNldE9iamVjdFR5cGUoU3RyaW5nIG9iamVjdFR5cGUpOwotCQlTdHJpbmcgT0JKRUNUX1RZUEVfUFJPUEVSVFkgPSAib2JqZWN0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtUeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtUeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTdiZmE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVHlwZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1R5cGVNYXBwaW5nIGV4dGVuZHMgVHlwZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHR5cGUgbWFwcGluZyBzcGVjaWZpZXMgcHJpbWFyeSBrZXkgY29sdW1ucyByYXRoZXIgdGhhbiB1c2luZwotCSAqIEpQQS1zdHlsZSBhdHRyaWJ1dGVzCi0JICogKFVzZXMgdGhlIEBQcmltYXJ5S2V5IGFubm90YXRpb24gZm9yIGphdmEsIG9yIHRoZSBwcmltYXJ5LWtleSBlbGVtZW50IGZvciB4bWwpCi0JICogCi0JICogTm90ZTogdGhlcmUgaXMgbm8gY29udGV4dC1sZXZlbCBvciBVSSBzdXBwb3J0IGZvciB0aGlzIGZlYXR1cmUgYXMgb2YgeWV0LgotCSAqIE5vdGU6IHRoaXMgaXMgYSAxLjEgZmVhdHVyZSwgYnV0IHRoaXMgY2hlY2sgaGFzIGJlZW4gaW1wbGVtZW50ZWQgZm9yIGFsbCB2ZXJzaW9ucwotCSAqLwotCWJvb2xlYW4gdXNlc1ByaW1hcnlLZXlDb2x1bW5zKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDE0YzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcKLXsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwN2VlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZwotCWV4dGVuZHMgVmVyc2lvbk1hcHBpbmcKLXsKLQlFY2xpcHNlTGlua011dGFibGUgZ2V0TXV0YWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NhY2hpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyOTRlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NhY2hpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZywgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGV4aXN0ZW5jZS1jaGVja2luZyBtb2RlbCBvYmplY3QgZXhpc3RzLiAgCi0JICogSGF2ZSB0byBoYXZlIGEgc2VwYXJhdGUgZmxhZyBmb3IgdGhpcyBzaW5jZSB0aGUgZGVmYXVsdCBleGlzdGVuY2UKLQkgKiB0eXBlIGlzIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gd2hldGhlciBoYXNFeGlzdGVuY2VDaGVja2luZygpIHJldHVybnMKLQkgKiB0cnVlIG9yIGZhbHNlLgotCSAqLwotCWJvb2xlYW4gaGFzRXhpc3RlbmNlQ2hlY2tpbmcoKTsKLQl2b2lkIHNldEV4aXN0ZW5jZUNoZWNraW5nKGJvb2xlYW4gZXhpc3RlbmNlQ2hlY2tpbmcpOwotCQlTdHJpbmcgRVhJU1RFTkNFX0NIRUNLSU5HX1BST1BFUlRZID0gImV4aXN0ZW5jZUNoZWNraW5nIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIEVjbGlwc2VMaW5rSmF2YUNhY2hpbmcgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIENhY2hlQW5ub3RhdGlvbiAKLQkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBvYmplY3QgY3JlYXRpb24uCi0JICovCi0Jdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgRWNsaXBzZUxpbmtKYXZhQ2FjaGluZyBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgQ2FjaGVBbm5vdGF0aW9uIAotCSAqIHJlc291cmNlIG1vZGVsIG9iamVjdC4gc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpfQotCSAqLwotCXZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDAwNjMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZXh0ZW5kcyBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBKYXZhQ29udmVydGVySG9sZGVyIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSAKLQkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBvYmplY3QgY3JlYXRpb24uCi0JICovCi0Jdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpOwotCQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgSmF2YUNvbnZlcnRlckhvbGRlciBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgCi0JICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9Ci0JICovCi0Jdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCk7Ci0JCi0JRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgZ2V0Q3VzdG9tQ29udmVydGVyKCk7Ci0JRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgYWRkQ3VzdG9tQ29udmVydGVyKCk7Ci0Jdm9pZCByZW1vdmVDdXN0b21Db252ZXJ0ZXIoKTsKLQlTdHJpbmcgQ1VTVE9NX0NPTlZFUlRFUl9QUk9QRVJUWSA9ICJjdXN0b21Db252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCXZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCVN0cmluZyBPQkpFQ1RfVFlQRV9DT05WRVJURVJfUFJPUEVSVFkgPSAib2JqZWN0VHlwZUNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBhZGRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQl2b2lkIHJlbW92ZVN0cnVjdENvbnZlcnRlcigpOwotCVN0cmluZyBTVFJVQ1RfQ09OVkVSVEVSX1BST1BFUlRZID0gInN0cnVjdENvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpOwotCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBhZGRUeXBlQ29udmVydGVyKCk7Ci0Jdm9pZCByZW1vdmVUeXBlQ29udmVydGVyKCk7Ci0JU3RyaW5nIFRZUEVfQ09OVkVSVEVSX1BST1BFUlRZID0gInR5cGVDb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJkM2I5Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBleHRlbmRzIEVjbGlwc2VMaW5rRW1iZWRkYWJsZSwgSmF2YUVtYmVkZGFibGUKLXsKLQlKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ2OWU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHk7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZXh0ZW5kcyBFY2xpcHNlTGlua0VudGl0eSwgSmF2YUVudGl0eQotewotCUphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBnZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQotCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgZ2V0Q2FjaGluZygpOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5YzRmNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBleHRlbmRzIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcywgSmF2YU1hcHBlZFN1cGVyY2xhc3MKLXsKLQlKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCi0JLy8qKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqKgotCi0JSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBnZXRDYWNoaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmU0ZWNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQkvLyoqKioqKioqKioqKiBjdXN0b21Db252ZXJ0ZXJzICoqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIGN1c3RvbSBjb252ZXJ0ZXJzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBMaXN0SXRlcmF0b3I8VD4gY3VzdG9tQ29udmVydGVycygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY3VzdG9tIGNvbnZlcnRlcnMuCi0JICovCi0JaW50IGN1c3RvbUNvbnZlcnRlcnNTaXplKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBjdXN0b20gY29udmVydGVyIHRvIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLCByZXR1cm4gdGhlIG9iamVjdCByZXByZXNlbnRpbmcgaXQuCi0JICovCi0JRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgYWRkQ3VzdG9tQ29udmVydGVyKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGN1c3RvbSBjb252ZXJ0ZXIgYXQgdGhlIGluZGV4IGZyb20gdGhlIGNvbnZlcnRlciBob2xkZXIuCi0JICovCi0Jdm9pZCByZW1vdmVDdXN0b21Db252ZXJ0ZXIoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgY3VzdG9tIGNvbnZlcnRlciBhdCBmcm9tIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLgotCSAqLwotCXZvaWQgcmVtb3ZlQ3VzdG9tQ29udmVydGVyKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlcik7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBjdXN0b20gY29udmVydGVyIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZUN1c3RvbUNvbnZlcnRlcihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0KLQlTdHJpbmcgQ1VTVE9NX0NPTlZFUlRFUlNfTElTVCA9ICJjdXN0b21Db252ZXJ0ZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JCi0JLy8qKioqKioqKioqKiogb2JqZWN0IHR5cGUgY29udmVydGVycyAqKioqKioqKioqKioqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIG9iamVjdCB0eXBlIGNvbnZlcnRlcnMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCTxUIGV4dGVuZHMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBMaXN0SXRlcmF0b3I8VD4gb2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIG9iamVjdCB0eXBlIGNvbnZlcnRlcnMuCi0JICovCi0JaW50IG9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpOwotCi0JLyoqCi0JICogQWRkIGEgb2JqZWN0IHR5cGUgY29udmVydGVyIHRvIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLCByZXR1cm4gdGhlIG9iamVjdCByZXByZXNlbnRpbmcgaXQuCi0JICovCi0JRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgb2JqZWN0IHR5cGUgY29udmVydGVyIGF0IHRoZSBpbmRleCBmcm9tIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLgotCSAqLwotCXZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBvYmplY3QgdHlwZSBjb252ZXJ0ZXIgYXQgZnJvbSB0aGUgY29udmVydGVyIGhvbGRlci4KLQkgKi8KLQl2b2lkIHJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlcik7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBvYmplY3QgdHlwZSBjb252ZXJ0ZXIgZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCi0JICovCi0Jdm9pZCBtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0KLQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSU19MSVNUID0gIm9iamVjdFR5cGVDb252ZXJ0ZXJzIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCS8vKioqKioqKioqKioqIHN0cnVjdCBjb252ZXJ0ZXJzICoqKioqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgc3RydWN0IGNvbnZlcnRlcnMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCTxUIGV4dGVuZHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IExpc3RJdGVyYXRvcjxUPiBzdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzdHJ1Y3QgY29udmVydGVycy4KLQkgKi8KLQlpbnQgc3RydWN0Q29udmVydGVyc1NpemUoKTsKLQotCS8qKgotCSAqIEFkZCBhIHN0cnVjdCBjb252ZXJ0ZXIgdG8gdGhlIGNvbnZlcnRlciBob2xkZXIsIHJldHVybiB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyBpdC4KLQkgKi8KLQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBhZGRTdHJ1Y3RDb252ZXJ0ZXIoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3RydWN0IGNvbnZlcnRlciBhdCB0aGUgaW5kZXggZnJvbSB0aGUgY29udmVydGVyIGhvbGRlci4KLQkgKi8KLQl2b2lkIHJlbW92ZVN0cnVjdENvbnZlcnRlcihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzdHJ1Y3QgY29udmVydGVyIGF0IGZyb20gdGhlIGNvbnZlcnRlciBob2xkZXIuCi0JICovCi0Jdm9pZCByZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyKTsKLQotCS8qKgotCSAqIE1vdmUgdGhlIHN0cnVjdCBjb252ZXJ0ZXIgZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCi0JICovCi0Jdm9pZCBtb3ZlU3RydWN0Q29udmVydGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCVN0cmluZyBTVFJVQ1RfQ09OVkVSVEVSU19MSVNUID0gInN0cnVjdENvbnZlcnRlcnMiOyAvLyROT04tTkxTLTEkCi0KLQkKLQkvLyoqKioqKioqKioqKiB0eXBlIGNvbnZlcnRlcnMgKioqKioqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSB0eXBlIGNvbnZlcnRlcnMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCTxUIGV4dGVuZHMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBMaXN0SXRlcmF0b3I8VD4gdHlwZUNvbnZlcnRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHR5cGUgY29udmVydGVycy4KLQkgKi8KLQlpbnQgdHlwZUNvbnZlcnRlcnNTaXplKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSB0eXBlIGNvbnZlcnRlciB0byB0aGUgY29udmVydGVyIGhvbGRlciwgcmV0dXJuIHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBhZGRUeXBlQ29udmVydGVyKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHR5cGUgY29udmVydGVyIGF0IHRoZSBpbmRleCBmcm9tIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLgotCSAqLwotCXZvaWQgcmVtb3ZlVHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSB0eXBlIGNvbnZlcnRlciBhdCBmcm9tIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLgotCSAqLwotCXZvaWQgcmVtb3ZlVHlwZUNvbnZlcnRlcihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyKTsKLQotCS8qKgotCSAqIE1vdmUgdGhlIHR5cGUgY29udmVydGVyIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZVR5cGVDb252ZXJ0ZXIoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JU3RyaW5nIFRZUEVfQ09OVkVSVEVSU19MSVNUID0gInR5cGVDb252ZXJ0ZXJzIjsgLy8kTk9OLU5MUy0xJAotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NDI2ZDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIAotCWV4dGVuZHMgRW50aXR5TWFwcGluZ3MKLXsKLQkKLQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBnZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGUzOTE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUVjbGlwc2VMaW5rQ2FjaGluZwotCWV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nLCBYbWxDb250ZXh0Tm9kZQotewotCXZvaWQgdXBkYXRlKEphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNhY2hpbmcpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTNlMzBlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIGV4dGVuZHMgRWNsaXBzZUxpbmtFbWJlZGRhYmxlLCBPcm1FbWJlZGRhYmxlCi17Ci0JRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZ2V0Q29udmVydGVySG9sZGVyKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGU5NjUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW50aXR5OwotCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUVjbGlwc2VMaW5rRW50aXR5IGV4dGVuZHMgRWNsaXBzZUxpbmtFbnRpdHksIE9ybUVudGl0eQotewotCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIGdldENvbnZlcnRlckhvbGRlcigpOwotCQotCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBnZXRDYWNoaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmOGVlN2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGV4dGVuZHMgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLCBPcm1NYXBwZWRTdXBlcmNsYXNzCi17Ci0JRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCi0JT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTljODllNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeTsKLQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5IGV4dGVuZHMgUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkKLXsJCi0KLQlQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGJ1aWxkTG9nZ2luZyhQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjdlOWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLS8qKgotICogIENhY2hlVHlwZQotICovCi1wdWJsaWMgZW51bSBDYWNoZVR5cGUgewotCXNvZnRfd2VhaywgCi0JaGFyZF93ZWFrLCAKLQl3ZWFrLAotCXNvZnQsCi0JZnVsbCwKLQlub25lOyAKLQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTEwgPSAiRnVsbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFSRF9XRUFLID0gIkhhcmRXZWFrIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIk5PTkUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPRlQgPSAiU29mdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09GVF9XRUFLID0gIlNvZnRXZWFrIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFLID0gIldlYWsiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzNjU1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuRW50aXR5OwotCi0vKioKLSAqICBDYWNoaW5nCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FjaGluZyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLXsKLQlDYWNoZVR5cGUgZ2V0RGVmYXVsdENhY2hlVHlwZURlZmF1bHQoKTsKLQlDYWNoZVR5cGUgZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCXZvaWQgc2V0Q2FjaGVUeXBlRGVmYXVsdChDYWNoZVR5cGUgY2FjaGVUeXBlRGVmYXVsdCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZID0gImNhY2hlVHlwZURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQgPSAiZWNsaXBzZWxpbmsuY2FjaGUudHlwZS5kZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIERFRkFVTFRfQ0FDSEVfVFlQRV9ERUZBVUxUID0gQ2FjaGVUeXBlLnNvZnRfd2VhazsKLQotCUludGVnZXIgZ2V0RGVmYXVsdENhY2hlU2l6ZURlZmF1bHQoKTsKLQlJbnRlZ2VyIGdldENhY2hlU2l6ZURlZmF1bHQoKTsKLQl2b2lkIHNldENhY2hlU2l6ZURlZmF1bHQoSW50ZWdlciBjYWNoZVNpemVEZWZhdWx0KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFkgPSAiY2FjaGVTaXplRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NBQ0hFX1NJWkVfREVGQVVMVCA9ICJlY2xpcHNlbGluay5jYWNoZS5zaXplLmRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfQ0FDSEVfU0laRV9ERUZBVUxUID0gSW50ZWdlci52YWx1ZU9mKDEwMCk7Ci0KLQlCb29sZWFuIGdldERlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHQoKTsKLQlCb29sZWFuIGdldFNoYXJlZENhY2hlRGVmYXVsdCgpOwotCXZvaWQgc2V0U2hhcmVkQ2FjaGVEZWZhdWx0KEJvb2xlYW4gc2hhcmVkQ2FjaGVEZWZhdWx0KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSA9ICJzaGFyZWRDYWNoZURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCA9ICJlY2xpcHNlbGluay5jYWNoZS5zaGFyZWQuZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9TSEFSRURfQ0FDSEVfREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCi0JQ2FjaGVUeXBlIGdldERlZmF1bHRDYWNoZVR5cGUoKTsKLQlDYWNoZVR5cGUgZ2V0Q2FjaGVUeXBlT2YoU3RyaW5nIGVudGl0eU5hbWUpOwotCXZvaWQgc2V0Q2FjaGVUeXBlT2YoU3RyaW5nIGVudGl0eU5hbWUsIENhY2hlVHlwZSBjYWNoZVR5cGUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1RZUEVfUFJPUEVSVFkgPSAiY2FjaGVUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSA9ICJlY2xpcHNlbGluay5jYWNoZS50eXBlLiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIENhY2hlVHlwZSBERUZBVUxUX0NBQ0hFX1RZUEUgPSBDYWNoZVR5cGUuc29mdF93ZWFrOwotCi0JSW50ZWdlciBnZXREZWZhdWx0Q2FjaGVTaXplKCk7Ci0JSW50ZWdlciBnZXRDYWNoZVNpemVPZihTdHJpbmcgZW50aXR5TmFtZSk7Ci0Jdm9pZCBzZXRDYWNoZVNpemVPZihTdHJpbmcgZW50aXR5TmFtZSwgSW50ZWdlciBjYWNoZVNpemUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NJWkVfUFJPUEVSVFkgPSAiY2FjaGVTaXplIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfU0laRSA9ICJlY2xpcHNlbGluay5jYWNoZS5zaXplLiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9DQUNIRV9TSVpFID0gSW50ZWdlci52YWx1ZU9mKDEwMCk7Ci0KLQlCb29sZWFuIGdldERlZmF1bHRTaGFyZWRDYWNoZSgpOwotCUJvb2xlYW4gZ2V0U2hhcmVkQ2FjaGVPZihTdHJpbmcgZW50aXR5TmFtZSk7Ci0Jdm9pZCBzZXRTaGFyZWRDYWNoZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBCb29sZWFuIHNoYXJlZENhY2hlKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRURfQ0FDSEVfUFJPUEVSVFkgPSAic2hhcmVkQ2FjaGUiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUgPSAiZWNsaXBzZWxpbmsuY2FjaGUuc2hhcmVkLiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9TSEFSRURfQ0FDSEUgPSBCb29sZWFuLlRSVUU7Ci0KLQlGbHVzaENsZWFyQ2FjaGUgZ2V0RGVmYXVsdEZsdXNoQ2xlYXJDYWNoZSgpOwotCUZsdXNoQ2xlYXJDYWNoZSBnZXRGbHVzaENsZWFyQ2FjaGUoKTsKLQl2b2lkIHNldEZsdXNoQ2xlYXJDYWNoZShGbHVzaENsZWFyQ2FjaGUgbmV3Rmx1c2hDbGVhckNhY2hlKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBGTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSA9ICJmbHVzaENsZWFyQ2FjaGUiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19GTFVTSF9DTEVBUl9DQUNIRSA9ICJlY2xpcHNlbGluay5mbHVzaC1jbGVhci5jYWNoZSI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEZsdXNoQ2xlYXJDYWNoZSBERUZBVUxUX0ZMVVNIX0NMRUFSX0NBQ0hFID0gRmx1c2hDbGVhckNhY2hlLmRyb3BfaW52YWxpZGF0ZTsKLQotCXZvaWQgcmVtb3ZlRGVmYXVsdENhY2hpbmdQcm9wZXJ0aWVzKCk7Ci0KLQlMaXN0SXRlcmF0b3I8RW50aXR5PiBlbnRpdGllcygpOwotCUl0ZXJhdG9yPFN0cmluZz4gZW50aXR5TmFtZXMoKTsKLQlpbnQgZW50aXRpZXNTaXplKCk7Ci0JYm9vbGVhbiBlbnRpdHlFeGlzdHMoU3RyaW5nIGVudGl0eSk7Ci0JRW50aXR5IGFkZEVudGl0eShTdHJpbmcgZW50aXR5KTsKLQl2b2lkIHJlbW92ZUVudGl0eShTdHJpbmcgZW50aXR5KTsKLQkJU3RyaW5nIEVOVElUSUVTX0xJU1QgPSAiZW50aXRpZXMiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvRmx1c2hDbGVhckNhY2hlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0ZsdXNoQ2xlYXJDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJmNWFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvRmx1c2hDbGVhckNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi0vKioKLSAqICBGbHVzaENsZWFyQ2FjaGUKLSAqLwotcHVibGljIGVudW0gRmx1c2hDbGVhckNhY2hlIHsKLQlkcm9wLAotCWRyb3BfaW52YWxpZGF0ZSwKLQltZXJnZTsgCi0KLQkvLyBFY2xpcHNlTGluayB2YWx1ZSBzdHJpbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QID0gIkRyb3AiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BfSU5WQUxJREFURSA9ICJEcm9wSW52YWxpZGF0ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVSR0UgPSAiTWVyZ2UiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9CYXRjaFdyaXRpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQmF0Y2hXcml0aW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmM2I4YTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9CYXRjaFdyaXRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotLyoqCi0gKiAgQmF0Y2hXcml0aW5nCi0gKi8KLXB1YmxpYyBlbnVtIEJhdGNoV3JpdGluZyB7Ci0JCQlub25lLCAKLQkJCWpkYmMsIAotCQkJYnVmZmVyZWQsIAotCQkJb3JhY2xlX2pkYmM7Ci0KLQkvLyBFY2xpcHNlTGluayB2YWx1ZSBzdHJpbmcKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSAiTm9uZSI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBKREJDID0gIkpEQkMiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQlVGRkVSRUQgPSAiQnVmZmVyZWQiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgT1JBQ0xFX0pEQkMgPSAiT3JhY2xlLUpEQkMiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9Db25uZWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwYTA2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0vKioKLSAqICBDb25uZWN0aW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbiBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLXsKLQlCb29sZWFuIGdldERlZmF1bHROYXRpdmVTcWwoKTsKLQlCb29sZWFuIGdldE5hdGl2ZVNxbCgpOwotCXZvaWQgc2V0TmF0aXZlU3FsKEJvb2xlYW4gbmV3TmF0aXZlU3FsKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVfU1FMX1BST1BFUlRZID0gIm5hdGl2ZVNxbCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX05BVElWRV9TUUwgPSAiZWNsaXBzZWxpbmsuamRiYy5uYXRpdmUtc3FsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX05BVElWRV9TUUwgPSBCb29sZWFuLkZBTFNFOwotCi0JQmF0Y2hXcml0aW5nIGdldERlZmF1bHRCYXRjaFdyaXRpbmcoKTsKLQlCYXRjaFdyaXRpbmcgZ2V0QmF0Y2hXcml0aW5nKCk7Ci0Jdm9pZCBzZXRCYXRjaFdyaXRpbmcoQmF0Y2hXcml0aW5nIG5ld0JhdGNoV3JpdGluZyk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQkFUQ0hfV1JJVElOR19QUk9QRVJUWSA9ICJiYXRjaFdyaXRpbmciOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19CQVRDSF9XUklUSU5HID0gImVjbGlwc2VsaW5rLmpkYmMuYmF0Y2gtd3JpdGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJhdGNoV3JpdGluZyBERUZBVUxUX0JBVENIX1dSSVRJTkcgPSBCYXRjaFdyaXRpbmcubm9uZTsKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdENhY2hlU3RhdGVtZW50cygpOwotCUJvb2xlYW4gZ2V0Q2FjaGVTdGF0ZW1lbnRzKCk7Ci0Jdm9pZCBzZXRDYWNoZVN0YXRlbWVudHMoQm9vbGVhbiBuZXdDYWNoZVN0YXRlbWVudHMpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFkgPSAiY2FjaGVTdGF0ZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UUyA9ICJlY2xpcHNlbGluay5qZGJjLmNhY2hlLXN0YXRlbWVudHMiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfQ0FDSEVfU1RBVEVNRU5UUyA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlJbnRlZ2VyIGdldERlZmF1bHRDYWNoZVN0YXRlbWVudHNTaXplKCk7Ci0JSW50ZWdlciBnZXRDYWNoZVN0YXRlbWVudHNTaXplKCk7Ci0Jdm9pZCBzZXRDYWNoZVN0YXRlbWVudHNTaXplKEludGVnZXIgbmV3Q2FjaGVTdGF0ZW1lbnRzU2l6ZSk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZID0gImNhY2hlU3RhdGVtZW50c1NpemUiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTX1NJWkUgPSAiZWNsaXBzZWxpbmsuamRiYy5jYWNoZS1zdGF0ZW1lbnRzLnNpemUiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfQ0FDSEVfU1RBVEVNRU5UU19TSVpFID0gSW50ZWdlci52YWx1ZU9mKDUwKTsKLQotCVN0cmluZyBnZXREZWZhdWx0RHJpdmVyKCk7Ci0JU3RyaW5nIGdldERyaXZlcigpOwotCXZvaWQgc2V0RHJpdmVyKFN0cmluZyBuZXdEcml2ZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9QUk9QRVJUWSA9ICJkcml2ZXIiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19EUklWRVIgPSAiZWNsaXBzZWxpbmsuamRiYy5kcml2ZXIiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9EUklWRVIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIGdldERlZmF1bHRVcmwoKTsKLQlTdHJpbmcgZ2V0VXJsKCk7Ci0Jdm9pZCBzZXRVcmwoU3RyaW5nIG5ld1VybCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1BST1BFUlRZID0gInVybCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1VSTCA9ICJlY2xpcHNlbGluay5qZGJjLnVybCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1VSTCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgZ2V0RGVmYXVsdFVzZXIoKTsKLQlTdHJpbmcgZ2V0VXNlcigpOwotCXZvaWQgc2V0VXNlcihTdHJpbmcgbmV3VXNlcik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9QUk9QRVJUWSA9ICJ1c2VyIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfVVNFUiA9ICJlY2xpcHNlbGluay5qZGJjLnVzZXIiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9VU0VSID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBnZXREZWZhdWx0UGFzc3dvcmQoKTsKLQlTdHJpbmcgZ2V0UGFzc3dvcmQoKTsKLQl2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBuZXdQYXNzd29yZCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfUFJPUEVSVFkgPSAicGFzc3dvcmQiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19QQVNTV09SRCA9ICJlY2xpcHNlbGluay5qZGJjLnBhc3N3b3JkIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEFTU1dPUkQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JQm9vbGVhbiBnZXREZWZhdWx0QmluZFBhcmFtZXRlcnMoKTsKLQlCb29sZWFuIGdldEJpbmRQYXJhbWV0ZXJzKCk7Ci0Jdm9pZCBzZXRCaW5kUGFyYW1ldGVycyhCb29sZWFuIG5ld0JpbmRQYXJhbWV0ZXJzKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBCSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFkgPSAiYmluZFBhcmFtZXRlcnMiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19CSU5EX1BBUkFNRVRFUlMgPSAiZWNsaXBzZWxpbmsuamRiYy5iaW5kLXBhcmFtZXRlcnMiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfQklORF9QQVJBTUVURVJTID0gQm9vbGVhbi5UUlVFOwotCi0JQm9vbGVhbiBnZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zU2hhcmVkKCk7Ci0JQm9vbGVhbiBnZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKTsKLQl2b2lkIHNldFJlYWRDb25uZWN0aW9uc1NoYXJlZChCb29sZWFuIG5ld1JlYWRDb25uZWN0aW9uc1NoYXJlZCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFkgPSAicmVhZENvbm5lY3Rpb25zU2hhcmVkIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19TSEFSRUQgPSAiZWNsaXBzZWxpbmsuamRiYy5yZWFkLWNvbm5lY3Rpb25zLnNoYXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlJbnRlZ2VyIGdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNNaW4oKTsKLQlJbnRlZ2VyIGdldFJlYWRDb25uZWN0aW9uc01pbigpOwotCXZvaWQgc2V0UmVhZENvbm5lY3Rpb25zTWluKEludGVnZXIgbmV3UmVhZENvbm5lY3Rpb25zTWluKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSA9ICJyZWFkQ29ubmVjdGlvbnNNaW4iOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01JTiA9ICJlY2xpcHNlbGluay5qZGJjLnJlYWQtY29ubmVjdGlvbnMubWluIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgSW50ZWdlciBERUZBVUxUX1JFQURfQ09OTkVDVElPTlNfTUlOID0gSW50ZWdlci52YWx1ZU9mKDIpOwotCi0JSW50ZWdlciBnZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWF4KCk7Ci0JSW50ZWdlciBnZXRSZWFkQ29ubmVjdGlvbnNNYXgoKTsKLQl2b2lkIHNldFJlYWRDb25uZWN0aW9uc01heChJbnRlZ2VyIG5ld1JlYWRDb25uZWN0aW9uc01heCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkgPSAicmVhZENvbm5lY3Rpb25zTWF4IjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19NQVggPSAiZWNsaXBzZWxpbmsuamRiYy5yZWFkLWNvbm5lY3Rpb25zLm1heCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9SRUFEX0NPTk5FQ1RJT05TX01BWCA9IEludGVnZXIudmFsdWVPZigyKTsKLQotCUludGVnZXIgZ2V0RGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNaW4oKTsKLQlJbnRlZ2VyIGdldFdyaXRlQ29ubmVjdGlvbnNNaW4oKTsKLQl2b2lkIHNldFdyaXRlQ29ubmVjdGlvbnNNaW4oSW50ZWdlciBuZXdXcml0ZUNvbm5lY3Rpb25zTWluKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkgPSAid3JpdGVDb25uZWN0aW9uc01pbiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01JTiA9ICJlY2xpcHNlbGluay5qZGJjLndyaXRlLWNvbm5lY3Rpb25zLm1pbiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9XUklURV9DT05ORUNUSU9OU19NSU4gPSBJbnRlZ2VyLnZhbHVlT2YoNSk7Ci0KLQlJbnRlZ2VyIGdldERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWF4KCk7Ci0JSW50ZWdlciBnZXRXcml0ZUNvbm5lY3Rpb25zTWF4KCk7Ci0Jdm9pZCBzZXRXcml0ZUNvbm5lY3Rpb25zTWF4KEludGVnZXIgbmV3V3JpdGVDb25uZWN0aW9uc01heCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZID0gIndyaXRlQ29ubmVjdGlvbnNNYXgiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NQVggPSAiZWNsaXBzZWxpbmsuamRiYy53cml0ZS1jb25uZWN0aW9ucy5tYXgiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfV1JJVEVfQ09OTkVDVElPTlNfTUFYID0gSW50ZWdlci52YWx1ZU9mKDEwKTsKLQotCUV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlIGdldERlZmF1bHRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSgpOwotCUV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlIGdldEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKCk7Ci0Jdm9pZCBzZXRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZShFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBuZXdFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9QUk9QRVJUWSA9ICJleGNsdXNpdmVDb25uZWN0aW9uTW9kZSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0VYQ0xVU0lWRV9DT05ORUNUSU9OX01PREUgPSAiZWNsaXBzZWxpbmsuamRiYy5leGNsdXNpdmUtY29ubmVjdGlvbi5tb2RlIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgREVGQVVMVF9FWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFID0gRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUudHJhbnNhY3Rpb25hbDsKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdExhenlDb25uZWN0aW9uKCk7Ci0JQm9vbGVhbiBnZXRMYXp5Q29ubmVjdGlvbigpOwotCXZvaWQgc2V0TGF6eUNvbm5lY3Rpb24oQm9vbGVhbiBuZXdMYXp5Q29ubmVjdGlvbik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTEFaWV9DT05ORUNUSU9OX1BST1BFUlRZID0gImxhenlDb25uZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfTEFaWV9DT05ORUNUSU9OID0gImVjbGlwc2VsaW5rLmpkYmMuZXhjbHVzaXZlLWNvbm5lY3Rpb24uaXMtbGF6eSI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9MQVpZX0NPTk5FQ1RJT04gPSBCb29sZWFuLlRSVUU7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhOWI4ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi0vKioKLSAqICBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZQotICovCi1wdWJsaWMgZW51bSBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSB7Ci0JYWx3YXlzLAotCWlzb2xhdGVkLAotCXRyYW5zYWN0aW9uYWw7Ci0KLQkvLyBFY2xpcHNlTGluayB2YWx1ZSBzdHJpbmcKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFMV0FZUyA9ICJBbHdheXMiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVNPTEFURUQgPSAiSXNvbGF0ZWQiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNBQ1RJT05BTCA9ICJUcmFuc2FjdGlvbmFsIjsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9DdXN0b21pemF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0N1c3RvbWl6YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwNWIxNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0N1c3RvbWl6YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkVudGl0eTsKLQotLyoqCi0gKiAgQ3VzdG9taXphdGlvbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEN1c3RvbWl6YXRpb24gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JQm9vbGVhbiBnZXREZWZhdWx0VGhyb3dFeGNlcHRpb25zKCk7Ci0JQm9vbGVhbiBnZXRUaHJvd0V4Y2VwdGlvbnMoKTsKLQl2b2lkIHNldFRocm93RXhjZXB0aW9ucyhCb29sZWFuIG5ld1Rocm93RXhjZXB0aW9ucyk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSA9ICJ0aHJvd0V4Y2VwdGlvbnMiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TID0gImVjbGlwc2VsaW5rLm9ybS50aHJvdy5leGNlcHRpb25zIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1RIUk9XX0VYQ0VQVElPTlMgPSBCb29sZWFuLlRSVUU7Ci0JCi0JV2VhdmluZyBnZXREZWZhdWx0V2VhdmluZygpOwotCVdlYXZpbmcgZ2V0V2VhdmluZygpOwotCXZvaWQgc2V0V2VhdmluZyhXZWF2aW5nIG5ld1dlYXZpbmcpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfUFJPUEVSVFkgPSAid2VhdmluZyI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1dFQVZJTkcgPSAiZWNsaXBzZWxpbmsud2VhdmluZyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFdlYXZpbmcgREVGQVVMVF9XRUFWSU5HID0gV2VhdmluZy50cnVlXzsKLSAKLQlCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nTGF6eSgpOwotCUJvb2xlYW4gZ2V0V2VhdmluZ0xhenkoKTsKLQl2b2lkIHNldFdlYXZpbmdMYXp5KEJvb2xlYW4gbmV3V2VhdmluZ0xhenkpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfTEFaWV9QUk9QRVJUWSA9ICJ3ZWF2aW5nTGF6eSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1dFQVZJTkdfTEFaWSA9ICJlY2xpcHNlbGluay53ZWF2aW5nLmxhenkiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfV0VBVklOR19MQVpZID0gQm9vbGVhbi5UUlVFOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdDaGFuZ2VUcmFja2luZygpOwotCUJvb2xlYW4gZ2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCk7Ci0Jdm9pZCBzZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoQm9vbGVhbiBuZXdXZWF2aW5nQ2hhbmdlVHJhY2tpbmcpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZID0gIndlYXZpbmdDaGFuZ2VUcmFja2luZyI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1dFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HID0gImVjbGlwc2VsaW5rLndlYXZpbmcuY2hhbmdldHJhY2tpbmciOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkcgPSBCb29sZWFuLlRSVUU7Ci0KLQlCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nRmV0Y2hHcm91cHMoKTsKLQlCb29sZWFuIGdldFdlYXZpbmdGZXRjaEdyb3VwcygpOwotCXZvaWQgc2V0V2VhdmluZ0ZldGNoR3JvdXBzKEJvb2xlYW4gbmV3V2VhdmluZ0ZldGNoR3JvdXBzKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSA9ICJ3ZWF2aW5nRmV0Y2hHcm91cHMiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUyA9ICJlY2xpcHNlbGluay53ZWF2aW5nLmZldGNoZ3JvdXBzIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1dFQVZJTkdfRkVUQ0hfR1JPVVBTID0gQm9vbGVhbi5UUlVFOwotCi0JQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0ludGVybmFsKCk7Ci0JQm9vbGVhbiBnZXRXZWF2aW5nSW50ZXJuYWwoKTsKLQl2b2lkIHNldFdlYXZpbmdJbnRlcm5hbChCb29sZWFuIG5ld1dlYXZpbmdJbnRlcm5hbCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSA9ICJ3ZWF2aW5nSW50ZXJuYWwiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XRUFWSU5HX0lOVEVSTkFMID0gImVjbGlwc2VsaW5rLndlYXZpbmcuaW50ZXJuYWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfV0VBVklOR19JTlRFUk5BTCA9IEJvb2xlYW4uVFJVRTsKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdFYWdlcigpOwotCUJvb2xlYW4gZ2V0V2VhdmluZ0VhZ2VyKCk7Ci0Jdm9pZCBzZXRXZWF2aW5nRWFnZXIoQm9vbGVhbiBuZXdXZWF2aW5nRWFnZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfRUFHRVJfUFJPUEVSVFkgPSAid2VhdmluZ0VhZ2VyIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfV0VBVklOR19FQUdFUiA9ICJlY2xpcHNlbGluay53ZWF2aW5nLmVhZ2VyIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1dFQVZJTkdfRUFHRVIgPSBCb29sZWFuLkZBTFNFOwotCi0JU3RyaW5nIGdldERlZmF1bHREZXNjcmlwdG9yQ3VzdG9taXplcigpOwotCVN0cmluZyBnZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKFN0cmluZyBlbnRpdHlOYW1lKTsKLQl2b2lkIHNldERlc2NyaXB0b3JDdXN0b21pemVyT2YoU3RyaW5nIGVudGl0eU5hbWUsIFN0cmluZyBuZXdEZXNjcmlwdG9yQ3VzdG9taXplcik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZID0gImRlc2NyaXB0b3JDdXN0b21pemVyIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSID0gImVjbGlwc2VsaW5rLmRlc2NyaXB0b3IuY3VzdG9taXplci4iOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9ERVNDUklQVE9SX0NVU1RPTUlaRVIgPSBudWxsOwkvLyBubyBkZWZhdWx0Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzZXNzaW9uQ3VzdG9taXplcnMoKTsKLQlpbnQgc2Vzc2lvbkN1c3RvbWl6ZXJzU2l6ZSgpOwotCWJvb2xlYW4gc2Vzc2lvbkN1c3RvbWl6ZXJFeGlzdHMoU3RyaW5nIHNlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lKTsKLQlTdHJpbmcgYWRkU2Vzc2lvbkN1c3RvbWl6ZXIoU3RyaW5nIG5ld1Nlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lKTsKLQl2b2lkIHJlbW92ZVNlc3Npb25DdXN0b21pemVyKFN0cmluZyBzZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZSk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DVVNUT01JWkVSX0xJU1QgPSAic2Vzc2lvbkN1c3RvbWl6ZXJzIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSA9ICJzZXNzaW9uQ3VzdG9taXplciI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NFU1NJT05fQ1VTVE9NSVpFUiA9ICJlY2xpcHNlbGluay5zZXNzaW9uLmN1c3RvbWl6ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlMaXN0SXRlcmF0b3I8RW50aXR5PiBlbnRpdGllcygpOwotCUl0ZXJhdG9yPFN0cmluZz4gZW50aXR5TmFtZXMoKTsKLQlpbnQgZW50aXRpZXNTaXplKCk7Ci0JYm9vbGVhbiBlbnRpdHlFeGlzdHMoU3RyaW5nIGVudGl0eSk7Ci0JRW50aXR5IGFkZEVudGl0eShTdHJpbmcgZW50aXR5KTsKLQl2b2lkIHJlbW92ZUVudGl0eShTdHJpbmcgZW50aXR5KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVElFU19MSVNUID0gImVudGl0aWVzIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFByb2ZpbGVyKCk7Ci0JU3RyaW5nIGdldFByb2ZpbGVyKCk7Ci0Jdm9pZCBzZXRQcm9maWxlcihTdHJpbmcgbmV3UHJvZmlsZXIpOwotCXZvaWQgc2V0UHJvZmlsZXIoUHJvZmlsZXIgbmV3UHJvZmlsZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVSX1BST1BFUlRZID0gInByb2ZpbGVyIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUFJPRklMRVIgPSAiZWNsaXBzZWxpbmsucHJvZmlsZXIiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QUk9GSUxFUiA9IAotCQkJQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihQcm9maWxlci5ub19wcm9maWxlcik7Ci0JCVN0cmluZyBFQ0xJUFNFTElOS19TRVNTSU9OX1BST0ZJTEVSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2Uuc2Vzc2lvbnMuU2Vzc2lvblByb2ZpbGVyIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlCb29sZWFuIGdldERlZmF1bHRWYWxpZGF0aW9uT25seSgpOwotCUJvb2xlYW4gZ2V0VmFsaWRhdGlvbk9ubHkoKTsKLQl2b2lkIHNldFZhbGlkYXRpb25Pbmx5KEJvb2xlYW4gbmV3VmFsaWRhdGlvbk9ubHkpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fT05MWV9QUk9QRVJUWSA9ICJ2YWxpZGF0aW9uT25seSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1ZBTElEQVRJT05fT05MWSA9ICJlY2xpcHNlbGluay52YWxpZGF0aW9uLW9ubHkiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfVkFMSURBVElPTl9PTkxZID0gQm9vbGVhbi5UUlVFOwotCi0JU3RyaW5nIGdldERlZmF1bHRFeGNlcHRpb25IYW5kbGVyKCk7Ci0JU3RyaW5nIGdldEV4Y2VwdGlvbkhhbmRsZXIoKTsKLQl2b2lkIHNldEV4Y2VwdGlvbkhhbmRsZXIoU3RyaW5nIG5ld0V4Y2VwdGlvbkhhbmRsZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9IQU5ETEVSX1BST1BFUlRZID0gImV4Y2VwdGlvbkhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19FWENFUFRJT05fSEFORExFUiA9ICJlY2xpcHNlbGluay5leGNlcHRpb24taGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYQ0VQVElPTl9IQU5ETEVSID0gbnVsbDsJLy8gbm8gZGVmYXVsdAotCi0JCVN0cmluZyBFQ0xJUFNFTElOS19FWENFUFRJT05fSEFORExFUl9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmV4Y2VwdGlvbnMuRXhjZXB0aW9uSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdFZhbGlkYXRlU2NoZW1hKCk7Ci0JQm9vbGVhbiBnZXRWYWxpZGF0ZVNjaGVtYSgpOwotCXZvaWQgc2V0VmFsaWRhdGVTY2hlbWEoQm9vbGVhbiBuZXdWYWxpZGF0ZVNjaGVtYSk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfU0NIRU1BX1BST1BFUlRZID0gInZhbGlkYXRlU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfVkFMSURBVEVfU0NIRU1BID0gImVjbGlwc2VsaW5rLm9ybS52YWxpZGF0ZS5zY2hlbWEiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfVkFMSURBVEVfU0NIRU1BID0gQm9vbGVhbi5GQUxTRTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUHJvZmlsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUHJvZmlsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkMmYxYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1Byb2ZpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi0vKioKLSAqICBQcm9maWxlcgotICovCi1wdWJsaWMgZW51bSBQcm9maWxlciB7Ci0JcGVyZm9ybWFuY2VfcHJvZmlsZXIsIAotCXF1ZXJ5X21vbml0b3IsCi0Jbm9fcHJvZmlsZXI7Ci0KLQkvLyBFY2xpcHNlTGluayB2YWx1ZSBzdHJpbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJGT1JNQU5DRV9QUk9GSUxFUiA9ICJQZXJmb3JtYW5jZVByb2ZpbGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX01PTklUT1IgPSAiUXVlcnlNb25pdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1BST0ZJTEVSID0gIk5vUHJvZmlsZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBFY2xpcHNlTGluayBwcm9maWxlciBjbGFzcyBuYW1lcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUkZPUk1BTkNFX1BST0ZJTEVSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMucHJvZmlsZXIuUGVyZm9ybWFuY2VQcm9maWxlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9NT05JVE9SX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMucHJvZmlsZXIuUXVlcnlNb25pdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBQcm9maWxlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaXRlcmFsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvZmlsZXIgZ2V0UHJvZmlsZXJGb3IoU3RyaW5nIGxpdGVyYWwpIHsKLQkJCi0JCWZvciggUHJvZmlsZXIgcHJvZmlsZXIgOiBQcm9maWxlci52YWx1ZXMoKSkgewotCQkJaWYocHJvZmlsZXIudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcHJvZmlsZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb2ZpbGVyQ2xhc3NOYW1lKFN0cmluZyBwcm9maWxlclZhbHVlKSB7Ci0JCWlmIChwcm9maWxlclZhbHVlID09IFBFUkZPUk1BTkNFX1BST0ZJTEVSKSB7Ci0JCQlyZXR1cm4gUEVSRk9STUFOQ0VfUFJPRklMRVJfQ0xBU1NfTkFNRTsKLQkJfQotCQlpZiAocHJvZmlsZXJWYWx1ZSA9PSBRVUVSWV9NT05JVE9SKSB7Ci0JCQlyZXR1cm4gUVVFUllfTU9OSVRPUl9DTEFTU19OQU1FOwotCQl9Ci0JCXJldHVybiBwcm9maWxlclZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiN2MzMzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi0vKioKLSAqICBXZWF2aW5nCi0gKi8KLXB1YmxpYyBlbnVtIFdlYXZpbmcgewotCXRydWVfLAotCWZhbHNlXywgCi0Jc3RhdGljXzsKLQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUVfID0gInRydWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFXyA9ICJmYWxzZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDXyA9ICJzdGF0aWMiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvZ2VuZXJhbC9HZW5lcmFsUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvZ2VuZXJhbC9HZW5lcmFsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzgxOGEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2dlbmVyYWwvR2VuZXJhbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmdlbmVyYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci0KLS8qKgotICogIEdlbmVyYWxQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR2VuZXJhbFByb3BlcnRpZXMgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0KLQlCb29sZWFuIGdldERlZmF1bHRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKTsKLQlCb29sZWFuIGdldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpOwotCXZvaWQgc2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKEJvb2xlYW4gbmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSA9ICJleGNsdWRlRWNsaXBzZWxpbmtPcm0iOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSA9ICJlY2xpcHNlbGluay5leGNsdWRlLWVjbGlwc2VsaW5rLW9ybSI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9FWENMVURFX0VDTElQU0VMSU5LX09STSA9IEJvb2xlYW4uRkFMU0U7Ci0JCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMWRhZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotLyoqCi0gKiBMb2dnZXIKLSAqLwotcHVibGljIGVudW0gTG9nZ2VyIHsKLQkJCWRlZmF1bHRfbG9nZ2VyLCAKLQkJCWphdmFfbG9nZ2VyLCAKLQkJCXNlcnZlcl9sb2dnZXI7Ci0JCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0dHRVIgPSAiRGVmYXVsdExvZ2dlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0xPR0dFUiA9ICJKYXZhTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9MT0dHRVIgPSAiU2VydmVyTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIEVjbGlwc2VMaW5rIGxvZ2dlciBjbGFzcyBuYW1lcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HR0VSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubG9nZ2luZy5EZWZhdWx0U2Vzc2lvbkxvZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0xPR0dFUl9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmxvZ2dpbmcuSmF2YUxvZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfTE9HR0VSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uc2VydmVyLlNlcnZlckxvZyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIExvZ2dlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaXRlcmFsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9nZ2VyIGdldExvZ2dlckZvcihTdHJpbmcgbGl0ZXJhbCkgewotCQkKLQkJZm9yKCBMb2dnZXIgbG9nZ2VyIDogTG9nZ2VyLnZhbHVlcygpKSB7Ci0JCQlpZihsb2dnZXIudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gbG9nZ2VyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2dnZXJDbGFzc05hbWUoU3RyaW5nIGxvZ2dlclZhbHVlKSB7Ci0JCWlmIChsb2dnZXJWYWx1ZSA9PSBERUZBVUxUX0xPR0dFUikgewotCQkJcmV0dXJuIERFRkFVTFRfTE9HR0VSX0NMQVNTX05BTUU7Ci0JCX0KLQkJaWYgKGxvZ2dlclZhbHVlID09IEpBVkFfTE9HR0VSKSB7Ci0JCQlyZXR1cm4gSkFWQV9MT0dHRVJfQ0xBU1NfTkFNRTsKLQkJfQotCQlpZiAobG9nZ2VyVmFsdWUgPT0gU0VSVkVSX0xPR0dFUikgewotCQkJcmV0dXJuIFNFUlZFUl9MT0dHRVJfQ0xBU1NfTkFNRTsKLQkJfQotCQlyZXR1cm4gbG9nZ2VyVmFsdWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNmRhNGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci0KLS8qKgotICogTG9nZ2luZwotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvZ2dpbmcgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JTG9nZ2luZ0xldmVsIGdldERlZmF1bHRMZXZlbCgpOwotCUxvZ2dpbmdMZXZlbCBnZXRMZXZlbCgpOwotCXZvaWQgc2V0TGV2ZWwoTG9nZ2luZ0xldmVsIGxldmVsKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTF9QUk9QRVJUWSA9ICJsZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0xFVkVMID0gImVjbGlwc2VsaW5rLmxvZ2dpbmcubGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgREVGQVVMVF9MRVZFTCA9IExvZ2dpbmdMZXZlbC5pbmZvOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFRpbWVzdGFtcCgpOwotCUJvb2xlYW4gZ2V0VGltZXN0YW1wKCk7Ci0Jdm9pZCBzZXRUaW1lc3RhbXAoQm9vbGVhbiB0aW1lc3RhbXApOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVTVEFNUF9QUk9QRVJUWSA9ICJ0aW1lc3RhbXAiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19USU1FU1RBTVAgPSAiZWNsaXBzZWxpbmsubG9nZ2luZy50aW1lc3RhbXAiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfVElNRVNUQU1QID0gQm9vbGVhbi5UUlVFOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFRocmVhZCgpOwotCUJvb2xlYW4gZ2V0VGhyZWFkKCk7Ci0Jdm9pZCBzZXRUaHJlYWQoQm9vbGVhbiB0aHJlYWQpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9QUk9QRVJUWSA9ICJ0aHJlYWQiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19USFJFQUQgPSAiZWNsaXBzZWxpbmsubG9nZ2luZy50aHJlYWQiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfVEhSRUFEID0gQm9vbGVhbi5UUlVFOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFNlc3Npb24oKTsKLQlCb29sZWFuIGdldFNlc3Npb24oKTsKLQl2b2lkIHNldFNlc3Npb24oQm9vbGVhbiBzZXNzaW9uKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX1BST1BFUlRZID0gInNlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19TRVNTSU9OID0gImVjbGlwc2VsaW5rLmxvZ2dpbmcuc2Vzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9TRVNTSU9OID0gQm9vbGVhbi5UUlVFOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdEV4Y2VwdGlvbnMoKTsKLQlCb29sZWFuIGdldEV4Y2VwdGlvbnMoKTsKLQl2b2lkIHNldEV4Y2VwdGlvbnMoQm9vbGVhbiBleGNlcHRpb25zKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05TX1BST1BFUlRZID0gImV4Y2VwdGlvbnMiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19FWENFUFRJT05TID0gImVjbGlwc2VsaW5rLmxvZ2dpbmcuZXhjZXB0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9FWENFUFRJT05TID0gQm9vbGVhbi5GQUxTRTsKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRMb2dGaWxlTG9jYXRpb24oKTsKLQlTdHJpbmcgZ2V0TG9nRmlsZUxvY2F0aW9uKCk7Ci0Jdm9pZCBzZXRMb2dGaWxlTG9jYXRpb24oU3RyaW5nIG5ld0xvZ0ZpbGVMb2NhdGlvbik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFkgPSAibG9nRmlsZUxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfTE9HX0ZJTEVfTE9DQVRJT04gPSAiZWNsaXBzZWxpbmsubG9nZ2luZy5maWxlIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HX0ZJTEVfTE9DQVRJT04gPSBudWxsOwkJLy8gTm8gRGVmYXVsdAotCQkKLQlTdHJpbmcgZ2V0RGVmYXVsdExvZ2dlcigpOwotCVN0cmluZyBnZXRMb2dnZXIoKTsKLQl2b2lkIHNldExvZ2dlcihTdHJpbmcgbmV3TG9nZ2VyKTsKLQl2b2lkIHNldExvZ2dlcihMb2dnZXIgbmV3TG9nZ2VyKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHRVJfUFJPUEVSVFkgPSAibG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfTE9HR0VSID0gImVjbGlwc2VsaW5rLmxvZ2dpbmcubG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HR0VSID0gCi0JCQlBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKExvZ2dlci5kZWZhdWx0X2xvZ2dlcik7Ci0JCVN0cmluZyBFQ0xJUFNFTElOS19MT0dHRVJfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5sb2dnaW5nLlNlc3Npb25Mb2ciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdMZXZlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nTGV2ZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU2M2I4Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdMZXZlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi0vKioKLSAqICBMb2dnaW5nTGV2ZWwKLSAqLwotcHVibGljIGVudW0gTG9nZ2luZ0xldmVsIHsKLQkJCW9mZiwgCi0JCQlzZXZlcmUsIAotCQkJd2FybmluZywgCi0JCQlpbmZvLCAKLQkJCWNvbmZpZywgCi0JCQlmaW5lLCAKLQkJCWZpbmVyLAotCQkJZmluZXN0LAotCQkJYWxsOwotCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0ZGID0gIk9GRiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VWRVJFID0gIlNFVkVSRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTklORyA9ICJXQVJOSU5HIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPID0gIklORk8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJRyA9ICJDT05GSUciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkUgPSAiRklORSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklORVIgPSAiRklORVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkVTVCA9ICJGSU5FU1QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTCA9ICJBTEwiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9PcHRpb25zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL09wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2YTZjOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL09wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci0KLS8qKgotICogIFNlc3Npb24gT3B0aW9ucwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9wdGlvbnMgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JU3RyaW5nIGdldERlZmF1bHRTZXNzaW9uTmFtZSgpOwotCVN0cmluZyBnZXRTZXNzaW9uTmFtZSgpOwotCXZvaWQgc2V0U2Vzc2lvbk5hbWUoU3RyaW5nIG5ld1Nlc3Npb25OYW1lKTsgCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9OQU1FX1BST1BFUlRZID0gInNlc3Npb25OYW1lIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0VTU0lPTl9OQU1FID0gImVjbGlwc2VsaW5rLnNlc3Npb24tbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFU1NJT05fTkFNRSA9ICIiOwkvLyBubyBkZWZhdWx0IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBnZXREZWZhdWx0U2Vzc2lvbnNYbWwoKTsKLQlTdHJpbmcgZ2V0U2Vzc2lvbnNYbWwoKTsKLQl2b2lkIHNldFNlc3Npb25zWG1sKFN0cmluZyBuZXdTZXNzaW9uc1htbCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTlNfWE1MX1BST1BFUlRZID0gInNlc3Npb25zWG1sIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0VTU0lPTlNfWE1MID0gImVjbGlwc2VsaW5rLnNlc3Npb25zLXhtbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFU1NJT05TX1hNTCA9ICIiOwkvLyBubyBkZWZhdWx0IC8vJE5PTi1OTFMtMSQKLQkJCi0JQm9vbGVhbiBnZXREZWZhdWx0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCk7Ci0JQm9vbGVhbiBnZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKTsKLQl2b2lkIHNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyhCb29sZWFuIG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSA9ICJpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXN5IjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUyA9ICJlY2xpcHNlbGluay5zZXNzaW9uLmluY2x1ZGUuZGVzY3JpcHRvci5xdWVyaWVzIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMgPSBCb29sZWFuLlRSVUU7Ci0JCQotCVN0cmluZyBnZXREZWZhdWx0VGFyZ2V0RGF0YWJhc2UoKTsKLQlTdHJpbmcgZ2V0VGFyZ2V0RGF0YWJhc2UoKTsKLQl2b2lkIHNldFRhcmdldERhdGFiYXNlKFN0cmluZyBuZXdUYXJnZXREYXRhYmFzZSk7Ci0Jdm9pZCBzZXRUYXJnZXREYXRhYmFzZShUYXJnZXREYXRhYmFzZSBuZXdUYXJnZXREYXRhYmFzZSk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZID0gInRhcmdldERhdGFiYXNlIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfVEFSR0VUX0RBVEFCQVNFID0gImVjbGlwc2VsaW5rLnRhcmdldC1kYXRhYmFzZSI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RBUkdFVF9EQVRBQkFTRSA9IAotCQkJQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihUYXJnZXREYXRhYmFzZS5hdXRvKTsKLQotCVN0cmluZyBnZXREZWZhdWx0VGFyZ2V0U2VydmVyKCk7Ci0JU3RyaW5nIGdldFRhcmdldFNlcnZlcigpOwotCXZvaWQgc2V0VGFyZ2V0U2VydmVyKFN0cmluZyBuZXdUYXJnZXRTZXJ2ZXIpOwotCXZvaWQgc2V0VGFyZ2V0U2VydmVyKFRhcmdldFNlcnZlciBuZXdUYXJnZXRTZXJ2ZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9TRVJWRVJfUFJPUEVSVFkgPSAidGFyZ2V0U2VydmVyIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfVEFSR0VUX1NFUlZFUiA9ICJlY2xpcHNlbGluay50YXJnZXQtc2VydmVyIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEFSR0VUX1NFUlZFUiA9IAotCQkJQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihUYXJnZXRTZXJ2ZXIubm9uZSk7Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdEV2ZW50TGlzdGVuZXIoKTsKLQlTdHJpbmcgZ2V0RXZlbnRMaXN0ZW5lcigpOwotCXZvaWQgc2V0RXZlbnRMaXN0ZW5lcihTdHJpbmcgbmV3RXZlbnRMaXN0ZW5lcik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSA9ICJldmVudExpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0VTU0lPTl9FVkVOVF9MSVNURU5FUiA9ICJlY2xpcHNlbGluay5zZXNzaW9uLWV2ZW50LWxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VTU0lPTl9FVkVOVF9MSVNURU5FUiA9IG51bGw7CS8vIG5vIGRlZmF1bHQKLQkJU3RyaW5nIEVDTElQU0VMSU5LX0VWRU5UX0xJU1RFTkVSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2Uuc2Vzc2lvbnMuU2Vzc2lvbkV2ZW50TGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0KLQlCb29sZWFuIGdldERlZmF1bHRUZW1wb3JhbE11dGFibGUoKTsKLQlCb29sZWFuIGdldFRlbXBvcmFsTXV0YWJsZSgpOwotCXZvaWQgc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4gdGVtcG9yYWxNdXRhYmxlKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBURU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZID0gInRlbXBvcmFsTXV0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1RFTVBPUkFMX01VVEFCTEUgPSAiZWNsaXBzZWxpbmsudGVtcG9yYWwubXV0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9URU1QT1JBTF9NVVRBQkxFID0gQm9vbGVhbi5GQUxTRTsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvVGFyZ2V0RGF0YWJhc2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvVGFyZ2V0RGF0YWJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2NDEyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RhcmdldERhdGFiYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi0vKioKLSAqICBUYXJnZXREYXRhYmFzZQotICovCi1wdWJsaWMgZW51bSBUYXJnZXREYXRhYmFzZSB7Ci0JCQlhdHR1bml0eSwKLQkJCWF1dG8sCi0JCQljbG91ZHNjYXBlLAotCQkJZGF0YWJhc2UsCi0JCQlkYjIsCi0JCQlkYjJtYWluZnJhbWUsCi0JCQlkYmFzZSwKLQkJCWRlcmJ5LAotCQkJaHNxbCwKLQkJCWluZm9ybWl4LAotCQkJamF2YWRiLAotCQkJbXlzcWwsCi0JCQlvcmFjbGUsCi0JCQlvcmFjbGUxMSwKLQkJCW9yYWNsZTEwLAotCQkJb3JhY2xlOSwKLQkJCW9yYWNsZTgsCi0JCQlwb2ludGJhc2UsCi0JCQlwb3N0Z3Jlc3FsLAotCQkJc3FsYW55d2hlcmUsCi0JCQlzcWxzZXJ2ZXIsCi0JCQlzeWJhc2UsCi0JCQl0aW1lc3RlbjsKLQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUVU5JVFkgPSAiQXR0dW5pdHkiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUTyA9ICJBdXRvIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENMT1VEU0NBUEUgPSAiQ2xvdWRzY2FwZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRSA9ICJEYXRhYmFzZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQjIgPSAiREIyIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERCMk1BSU5GUkFNRSA9ICJEQjJNYWluZnJhbWUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJBU0UgPSAiREJhc2UiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVSQlkgPSAiRGVyYnkiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFNRTCA9ICJIU1FMIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElORk9STUlYID0gIkluZm9ybWl4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFEQiA9ICJKYXZhREIiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlTUUwgPSAiTXlTUUwiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JBQ0xFID0gIk9yYWNsZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBPUkFDTEUxMSA9ICJPcmFjbGUxMSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBPUkFDTEUxMCA9ICJPcmFjbGUxMGciOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JBQ0xFOSA9ICJPcmFjbGU5aSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBPUkFDTEU4ID0gIk9yYWNsZThpIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBPSU5UQkFTRSA9ICJQb2ludEJhc2UiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TVEdSRVNRTCA9ICJQb3N0Z3JlU1FMIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNRTEFOWVdIRVJFID0gIlNRTEFueXdoZXJlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNRTFNFUlZFUiA9ICJTUUxTZXJ2ZXIiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lCQVNFID0gIlN5YmFzZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FU1RFTiA9ICJUaW1lc1RlbiI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFRhcmdldERhdGFiYXNlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpdGVyYWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBUYXJnZXREYXRhYmFzZSBnZXRUYXJnZXREYXRhYmFzZUZvcihTdHJpbmcgbGl0ZXJhbCkgewotCQkKLQkJZm9yKCBUYXJnZXREYXRhYmFzZSB0YXJnZXREYXRhYmFzZSA6IFRhcmdldERhdGFiYXNlLnZhbHVlcygpKSB7Ci0JCQlpZih0YXJnZXREYXRhYmFzZS50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiB0YXJnZXREYXRhYmFzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RhcmdldFNlcnZlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UYXJnZXRTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5MDQwMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RhcmdldFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotLyoqCi0gKiAgVGFyZ2V0U2VydmVyCi0gKi8KLXB1YmxpYyBlbnVtIFRhcmdldFNlcnZlciB7Ci0JCQlub25lLAotCQkJb2M0aiwKLQkJCXN1bmFzOSwKLQkJCXdlYnNwaGVyZSwKLQkJCXdlYnNwaGVyZV82XzEsCi0JCQl3ZWJsb2dpYywKLQkJCXdlYmxvZ2ljXzksCi0JCQl3ZWJsb2dpY18xMCwKLQkJCWpib3NzOwotCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIk5vbmUiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgT0M0SiA9ICJPQzRKIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNVTkFTOSA9ICJTdW5BUzkiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU1BIRVJFID0gIldlYlNwaGVyZSI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTUEhFUkVfNl8xID0gIldlYlNwaGVyZV82XzEiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCTE9HSUMgPSAiV2ViTG9naWMiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCTE9HSUNfOSA9ICJXZWJMb2dpY185IjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkxPR0lDXzEwID0gIldlYkxvZ2ljXzEwIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpCT1NTID0gIkpCb3NzIjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgVGFyZ2V0U2VydmVyIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpdGVyYWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBUYXJnZXRTZXJ2ZXIgZ2V0VGFyZ2V0U2VydmVyRm9yKFN0cmluZyBsaXRlcmFsKSB7Ci0JCQotCQlmb3IoIFRhcmdldFNlcnZlciB0YXJnZXRTZXJ2ZXIgOiBUYXJnZXRTZXJ2ZXIudmFsdWVzKCkpIHsKLQkJCWlmKHRhcmdldFNlcnZlci50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiB0YXJnZXRTZXJ2ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9EZGxHZW5lcmF0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWU2ZmViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotLyoqCi0gKiAgRGRsR2VuZXJhdGlvblR5cGUKLSAqLwotcHVibGljIGVudW0gRGRsR2VuZXJhdGlvblR5cGUgewotCW5vbmUsIAotCWNyZWF0ZV90YWJsZXMsIAotCWRyb3BfYW5kX2NyZWF0ZV90YWJsZXM7Ci0JCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJub25lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfVEFCTEVTID0gImNyZWF0ZS10YWJsZXMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BfQU5EX0NSRUFURV9UQUJMRVMgPSAiZHJvcC1hbmQtY3JlYXRlLXRhYmxlcyI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vT3V0cHV0TW9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vT3V0cHV0TW9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDAwOWM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL091dHB1dE1vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOwotCi0vKioKLSAqICBPdXRwdXRNb2RlCi0gKi8KLXB1YmxpYyBlbnVtIE91dHB1dE1vZGUgewotCWJvdGgsIAotCXNxbF9zY3JpcHQsIAotCWRhdGFiYXNlOwotCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9USCA9ICJib3RoIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRSA9ICJkYXRhYmFzZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1FMX1NDUklQVCA9ICJzcWwtc2NyaXB0IjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiYzcxNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLQotLyoqCi0gKiAgU2NoZW1hR2VuZXJhdGlvbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUdlbmVyYXRpb24gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JRGRsR2VuZXJhdGlvblR5cGUgZ2V0RGVmYXVsdERkbEdlbmVyYXRpb25UeXBlKCk7Ci0JRGRsR2VuZXJhdGlvblR5cGUgZ2V0RGRsR2VuZXJhdGlvblR5cGUoKTsKLQl2b2lkIHNldERkbEdlbmVyYXRpb25UeXBlKERkbEdlbmVyYXRpb25UeXBlIGRkbEdlbmVyYXRpb25UeXBlKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZID0gImRkbEdlbmVyYXRpb25UeXBlIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSA9ICJlY2xpcHNlbGluay5kZGwtZ2VuZXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIERkbEdlbmVyYXRpb25UeXBlIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRERMX0dFTkVSQVRJT05fVFlQRSA9IERkbEdlbmVyYXRpb25UeXBlLm5vbmU7Ci0KLQlPdXRwdXRNb2RlIGdldERlZmF1bHRPdXRwdXRNb2RlKCk7Ci0JT3V0cHV0TW9kZSBnZXRPdXRwdXRNb2RlKCk7Ci0Jdm9pZCBzZXRPdXRwdXRNb2RlKE91dHB1dE1vZGUgb3V0cHV0TW9kZSk7IC8vIHB1dAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9NT0RFX1BST1BFUlRZID0gIm91dHB1dE1vZGUiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSA9ICJlY2xpcHNlbGluay5kZGwtZ2VuZXJhdGlvbi5vdXRwdXQtbW9kZSI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIE91dHB1dE1vZGUgREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9PVVRQVVRfTU9ERSA9IG51bGw7CQkvLyBObyBEZWZhdWx0Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdENyZWF0ZUZpbGVOYW1lKCk7Ci0JU3RyaW5nIGdldENyZWF0ZUZpbGVOYW1lKCk7Ci0Jdm9pZCBzZXRDcmVhdGVGaWxlTmFtZShTdHJpbmcgY3JlYXRlRmlsZU5hbWUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9GSUxFX05BTUVfUFJPUEVSVFkgPSAiY3JlYXRlRmlsZU5hbWUiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DUkVBVEVfRklMRV9OQU1FID0gImVjbGlwc2VsaW5rLmNyZWF0ZS1kZGwtamRiYy1maWxlLW5hbWUiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9DUkVBVEVfRklMRV9OQU1FID0gImNyZWF0ZURETC5qZGJjIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBnZXREZWZhdWx0RHJvcEZpbGVOYW1lKCk7Ci0JU3RyaW5nIGdldERyb3BGaWxlTmFtZSgpOwotCXZvaWQgc2V0RHJvcEZpbGVOYW1lKFN0cmluZyBkcm9wRmlsZU5hbWUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERST1BfRklMRV9OQU1FX1BST1BFUlRZID0gImRyb3BGaWxlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FID0gImVjbGlwc2VsaW5rLmRyb3AtZGRsLWpkYmMtZmlsZS1uYW1lIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRFJPUF9GSUxFX05BTUUgPSAiZHJvcERETC5qZGJjIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlTdHJpbmcgZ2V0RGVmYXVsdEFwcGxpY2F0aW9uTG9jYXRpb24oKTsKLQlTdHJpbmcgZ2V0QXBwbGljYXRpb25Mb2NhdGlvbigpOwotCXZvaWQgc2V0QXBwbGljYXRpb25Mb2NhdGlvbihTdHJpbmcgYXBwbGljYXRpb25Mb2NhdGlvbik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFkgPSAiYXBwbGljYXRpb25Mb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0FQUExJQ0FUSU9OX0xPQ0FUSU9OID0gImVjbGlwc2VsaW5rLmFwcGxpY2F0aW9uLWxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQVBQTElDQVRJT05fTE9DQVRJT04gPSBudWxsOyAvLyROT04tTkxTLTEkCi0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YmFlZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0RlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIERlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBERUZBVUxUX1BBUk1TID0gbmV3IFN0cmluZ1swXTsKLQlwcml2YXRlIHN0YXRpYyBUZXh0UmFuZ2UgREVGQVVMVF9URVhUX1JBTkdFID0gVGV4dFJhbmdlLkVtcHR5Lmluc3RhbmNlKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoCi0JCQlpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJcmV0dXJuIGJ1aWxkTWVzc2FnZShzZXZlcml0eSwgbWVzc2FnZUlkLCBERUZBVUxUX1BBUk1TLCB0YXJnZXRPYmplY3QpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZSgKLQkJCWludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJcmV0dXJuIGJ1aWxkTWVzc2FnZShzZXZlcml0eSwgbWVzc2FnZUlkLCBwYXJtcywgdGFyZ2V0T2JqZWN0LCBERUZBVUxUX1RFWFRfUkFOR0UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZSgKLQkJCWludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgT2JqZWN0IHRhcmdldE9iamVjdCwgVGV4dFJhbmdlIHRleHRSYW5nZSkgewotCQlyZXR1cm4gYnVpbGRNZXNzYWdlKHNldmVyaXR5LCBtZXNzYWdlSWQsIERFRkFVTFRfUEFSTVMsIHRhcmdldE9iamVjdCwgdGV4dFJhbmdlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoCi0JCQlpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0T2JqZWN0LCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgRWNsaXBzZUxpbmtNZXNzYWdlKEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkJVTkRMRV9OQU1FLCBzZXZlcml0eSwgbWVzc2FnZUlkLCBwYXJtcywgdGFyZ2V0T2JqZWN0KTsKLQkJbWVzc2FnZS5zZXRNYXJrZXJJZChKcHRDb3JlUGx1Z2luLlZBTElEQVRJT05fTUFSS0VSX0lEKTsgLy9UT0RPIGRvIHdlIG5lZWQgYW4gJ0VjbGlwc2VMaW5rIEpQQScgcHJvYmxlbSBtYXJrZXI/Ci0JCWlmICh0ZXh0UmFuZ2UgPT0gbnVsbCkgewotCQkJLy9sb2cgYW4gZXhjZXB0aW9uIGFuZCB0aGVuIGNvbnRpbnVlIHdpdGhvdXQgc2V0dGluZyBsb2NhdGlvbiBpbmZvcm1hdGlvbgotCQkJLy9BdCBsZWFzdCB0aGUgdXNlciB3aWxsIHN0aWxsIGdldCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIGFuZCB3aWxsCi0JCQkvL2JlIGFibGUgdG8gc2VlIG90aGVyIHZhbGlkYXRpb24gbWVzc2FnZXMgd2l0aCB2YWxpZCB0ZXh0UmFuZ2VzCi0JCQlKcHRDb3JlUGx1Z2luLmxvZyhuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIHRleHQgcmFuZ2UgZm9yIG1lc3NhZ2UgSUQ6ICIgKyBtZXNzYWdlSWQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJbWVzc2FnZS5zZXRMaW5lTm8odGV4dFJhbmdlLmdldExpbmVOdW1iZXIoKSk7Ci0JCQltZXNzYWdlLnNldE9mZnNldCh0ZXh0UmFuZ2UuZ2V0T2Zmc2V0KCkpOwotCQkJbWVzc2FnZS5zZXRMZW5ndGgodGV4dFJhbmdlLmdldExlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFVzZWQgc28gdGhhdCB3ZSBjYW4gZmluZCB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzaW5nIHRoaXMgY2xhc3NMb2FkZXIuCi0JICogT3RoZXJ3aXNlIHRoZSB3c3QgdmFsaWRhdGlvbiBtZXNzYWdlIGF0dGVtcHRzIHRvIHVzZSB0aGUgQ2xhc3NMb2FkZXIKLQkgKiBvZiBKcGFWYWxpZGF0b3Igd2hpY2ggaXMgaW4gdGhlIG9yZy5lY2xpcHNlLmpwdC5jb3JlIHBsdWdpbi4KLQkgKiAKLQkgKiBBbm90aGVyIHdheSB3ZSBjb3VsZCBwb3RlbnRpYWxseSBzb2x2ZSB0aGlzIGlzIHRvIGhhdmUgYSBzZXBhcmF0ZQotCSAqIEVjbGlzcGVMaW5rSnBhVmFsaWRhdG9yIGFuZCBzZXQgdXAgdGhlIGV4dGVuc2lvbiBwb2ludHMgc28gdGhhdAotCSAqIGl0IG9ubHkgcnVucyBhZ2FpbnN0IGpwYVByb2plY3RzIHdpdGggdGhlIEVjbGlzcGVMaW5rUGxhdGZvcm0KLQkgKiB3aGlsZSBKcGFWYWxpZGF0b3IgcnVucyBhZ2FpbnN0IGpwYVByb2plY3RzIHdpdGggdGhlIEdlbmVyaWNQbGF0Zm9ybS4KLQkgKiBJIGFtIHVuc3VyZSBpZiB0aGlzIGlzIHBvc3NpYmxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRWNsaXBzZUxpbmtNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7Ci0JCXB1YmxpYyBFY2xpcHNlTGlua01lc3NhZ2UoU3RyaW5nIGFCdW5kbGVOYW1lLCBpbnQgYVNldmVyaXR5LCBTdHJpbmcgYW5JZCwgU3RyaW5nW10gYVBhcmFtcywgT2JqZWN0IGFUYXJnZXRPYmplY3QpIHsKLQkJCXN1cGVyKGFCdW5kbGVOYW1lLCBhU2V2ZXJpdHksIGFuSWQsIGFQYXJhbXMsIGFUYXJnZXRPYmplY3QpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFJlc291cmNlQnVuZGxlIGdldEJ1bmRsZShMb2NhbGUgbG9jYWxlLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJ1bmRsZU5hbWUoKSwgbG9jYWxlLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0QnVuZGxlKGxvY2FsZSwgY2xhc3NMb2FkZXIpOwotCQkJfQotCQkJcmV0dXJuIGJ1bmRsZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1Y2UyMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUFubm90YXRpb25EZWZpbnRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlcyBhbm5vdGF0aW9ucyBmb3IgMS4wIEVjbGlwc2VMaW5rIHBsYXRmb3JtCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmludGlvblByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBJTlNUQU5DRSA9IAotCQkJbmV3IEVjbGlwc2VMaW5rSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CQkKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwkJCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uc1RvKExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsJCQotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsJCQotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CQkKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNDlkMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0lkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFGYWN0b3J5Ci0JZXh0ZW5kcyBBYnN0cmFjdEpwYUZhY3RvcnkKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtKcGFGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vICoqKioqKioqKiogQ29yZSBNb2RlbCAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVjbGlwc2VMaW5rSnBhUHJvamVjdCBidWlsZEpwYVByb2plY3QoSnBhUHJvamVjdC5Db25maWcgY29uZmlnKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKcGFQcm9qZWN0SW1wbChjb25maWcpOwotCX0KLQkKLQkKLQkKLQkvLyAqKioqKioqKioqIEphdmEgQ29udGV4dCBNb2RlbCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUocGFyZW50LCBqcnBhKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFCYXNpY01hcHBpbmcgYnVpbGRKYXZhQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVtYmVkZGFibGUgYnVpbGRKYXZhRW1iZWRkYWJsZShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0VudGl0eSBidWlsZEphdmFFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0VudGl0eUltcGwocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFJZE1hcHBpbmcgYnVpbGRKYXZhSWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0lkTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBidWlsZEphdmFNYXBwZWRTdXBlcmNsYXNzKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbChwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVZlcnNpb25NYXBwaW5nIGJ1aWxkSmF2YVZlcnNpb25NYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhT25lVG9NYW55TWFwcGluZyBidWlsZEphdmFPbmVUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFPbmVUb09uZU1hcHBpbmcgYnVpbGRKYXZhT25lVG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YU1hbnlUb01hbnlNYXBwaW5nIGJ1aWxkSmF2YU1hbnlUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhTWFueVRvT25lTWFwcGluZyBidWlsZEphdmFNYW55VG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyBidWlsZEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nIGJ1aWxkSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nIGJ1aWxkSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyhwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyBidWlsZEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2ZjRmNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtVmFyaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFQbGF0Zm9ybUZhY3RvcnkuU2ltcGxlVmVyc2lvbjsKLQotLyoqCi0gKiBBbGwgdGhlIHN0YXRlIGluIHRoZSBKUEEgcGxhdGZvcm0gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZQotICogaXQgaXMgaW5pdGlhbGl6ZWQpLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkKLQlpbXBsZW1lbnRzIEpwYVBsYXRmb3JtRmFjdG9yeQotewotCi0JLyoqCi0JICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0pwYVBsYXRmb3JtRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIEpwYVBsYXRmb3JtIGJ1aWxkSnBhUGxhdGZvcm0oU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYVBsYXRmb3JtKAotCQkJaWQsCi0JCQlidWlsZEpwYVZlcnNpb24oKSwKLQkJCW5ldyBFY2xpcHNlTGlua0pwYUZhY3RvcnkoKSwgCi0JCQlidWlsZEpwYUFubm90YXRpb25Qcm92aWRlcigpLCAKLQkJCUVjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlci5pbnN0YW5jZSgpLCAKLQkJCWJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSk7Ci0JfQotCQotCXByaXZhdGUgSnBhUGxhdGZvcm0uVmVyc2lvbiBidWlsZEpwYVZlcnNpb24oKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWZXJzaW9uKAotCQkJCUpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzFfMCwKLQkJCQlKcGFGYWNldC5WRVJTSU9OXzFfMC5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkSnBhQW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIoCi0JCQlHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1WYXJpYXRpb24gYnVpbGRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJCXB1YmxpYyBTdXBwb3J0ZWQgZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpIHsKLQkJCQlyZXR1cm4gU3VwcG9ydGVkLk5POwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gaXNKb2luVGFibGVPdmVycmlkYWJsZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVjbGlwc2VMaW5rVmVyc2lvbiBleHRlbmRzIFNpbXBsZVZlcnNpb24gewotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGVjbGlwc2VMaW5rVmVyc2lvbjsKLQotCQlwdWJsaWMgRWNsaXBzZUxpbmtWZXJzaW9uKFN0cmluZyBlY2xpcHNlTGlua1ZlcnNpb24sIFN0cmluZyBqcGFWZXJzaW9uKSB7Ci0JCQlzdXBlcihqcGFWZXJzaW9uKTsKLQkJCXRoaXMuZWNsaXBzZUxpbmtWZXJzaW9uID0gZWNsaXBzZUxpbmtWZXJzaW9uOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rVmVyc2lvbjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiIEVjbGlwc2VMaW5rIHZlcnNpb246ICIgKyB0aGlzLmdldFZlcnNpb24oKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNmVhOTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLlJlc291cmNlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSmF2YVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5Pcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW50aXR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgcGxhdGZvcm0KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlcgotCQlleHRlbmRzIEFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlciB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1Qcm92aWRlciBJTlNUQU5DRSA9IAotCQkJbmV3IEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKiogcmVzb3VyY2UgbW9kZWxzICoqKioqKioqKgkKLQkKLQlwdWJsaWMgSnBhUmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVJfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjb250ZW50VHlwZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gYnVpbGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCkgewotCQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCi0JCXJldHVybiBuZXcgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gewotCQkJSmF2YVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpfTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmdzICoqKioqKioqKgkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IGVjbGlwc2VsaW5rIHVzZXMKLQkJLy8gTk9URTogbm8gdHlwZSBtYXBwaW5ncyBzcGVjaWZpYyB0byBlY2xpcHNlbGluawotCQlyZXR1cm4gbmV3IEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCQlKYXZhRW50aXR5RGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uaW5zdGFuY2UoKX07Ci0JfQotCQotCQotCS8vICoqKioqKioqKiBqYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioJCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IGVjbGlwc2VsaW5rIHVzZXMKLQkJcmV0dXJuIG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBidWlsZE5vbk51bGxTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IGVjbGlwc2VsaW5rIHVzZXMKLQkJcmV0dXJuIG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCQlKYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07Ci0JfQotCQotCQotCS8vICoqKioqKioqKiBtYXBwaW5nIGZpbGVzICoqKioqKioqKgkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVzb3VyY2VEZWZpbml0aW9uW10gYnVpbGRSZXNvdXJjZURlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCi0JCXJldHVybiBuZXcgUmVzb3VyY2VEZWZpbml0aW9uW10gewotCQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJR2VuZXJpY09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhUHJvamVjdEltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYVByb2plY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOTc2OGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhUHJvamVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtKcGFQcm9qZWN0OwotCi0vKioKLSAqIEVjbGlwc2VMaW5rLXNwZWNpZmljIEpQQSBwcm9qZWN0LgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFQcm9qZWN0SW1wbAotCQlleHRlbmRzIEFic3RyYWN0SnBhUHJvamVjdAotCQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSnBhUHJvamVjdCB7Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSnBhUHJvamVjdEltcGwoSnBhUHJvamVjdC5Db25maWcgY29uZmlnKSB7Ci0JCXN1cGVyKGNvbmZpZyk7Ci0JfQotCQotCXB1YmxpYyBKcGFYbWxSZXNvdXJjZSBnZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChKcGFYbWxSZXNvdXJjZSkgdGhpcy5nZXRSZXNvdXJjZU1vZGVsKAotCQkJCUpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILAotCQkJCUpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2MTZlYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJlY2xpcHNlbGlua19qcGFfdmFsaWRhdGlvbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9FWFBJUllfQU5EX0VYUElSWV9USU1FX09GX0RBWV9CT1RIX1NQRUNJRklFRCA9ICJDQUNIRV9FWFBJUllfQU5EX0VYUElSWV9USU1FX09GX0RBWV9CT1RIX1NQRUNJRklFRCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJURVJfQ0xBU1NfSU1QTEVNRU5UU19DT05WRVJURVIgPSAiQ09OVkVSVEVSX0NMQVNTX0lNUExFTUVOVFNfQ09OVkVSVEVSIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTUlaRVJfQ0xBU1NfSU1QTEVNRU5UU19ERVNDUklQVE9SX0NVU1RPTUlaRVIgPSAiQ1VTVE9NSVpFUl9DTEFTU19JTVBMRU1FTlRTX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVBMRV9PQkpFQ1RfVkFMVUVTX0ZPUl9EQVRBX1ZBTFVFID0gIk1VTFRJUExFX09CSkVDVF9WQUxVRVNfRk9SX0RBVEFfVkFMVUUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9MRUdBQ1lfREVTQ1JJUFRPUl9DVVNUT01JWkVSID0gIlBFUlNJU1RFTkNFX1VOSVRfTEVHQUNZX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9MRUdBQ1lfRU5USVRZX0NBQ0hJTkcgPSAiUEVSU0lTVEVOQ0VfVU5JVF9MRUdBQ1lfRU5USVRZX0NBQ0hJTkciOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9DQUNISU5HX1BST1BFUlRZX0lHTk9SRUQgPSAiUEVSU0lTVEVOQ0VfVU5JVF9DQUNISU5HX1BST1BFUlRZX0lHTk9SRUQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTSUNfQ09MTEVDVElPTl9NQVBQSU5HX0RFUFJFQ0FURUQgPSAiQkFTSUNfQ09MTEVDVElPTl9NQVBQSU5HX0RFUFJFQ0FURUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0lDX01BUF9NQVBQSU5HX0RFUFJFQ0FURUQgPSAiQkFTSUNfTUFQX01BUFBJTkdfREVQUkVDQVRFRCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01BUFBJTkdfTUVNQkVSX0NMQVNTX05PVF9TVEFUSUMgPSAiVFlQRV9NQVBQSU5HX01FTUJFUl9DTEFTU19OT1RfU1RBVElDIjsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZiN2EwNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXI7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgb3JtLnhtbAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVJlc291cmNlTW9kZWxQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFOwotCX0KLQkKLQlwdWJsaWMgSnBhWG1sUmVzb3VyY2UgYnVpbGRSZXNvdXJjZU1vZGVsKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyLmdldFhtbFJlc291cmNlUHJvdmlkZXIoZmlsZSkuZ2V0WG1sUmVzb3VyY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvSnB0RWNsaXBzZUxpbmtDb3JlTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9KcHRFY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGU3ZmQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9KcHRFY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgZWNsaXBzZWxpbmsgY29yZS4KLSAqLwotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rQ29yZU1lc3NhZ2VzCi17Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtMaWJyYXJ5VmFsaWRhdG9yX25vRWNsaXBzZUxpbmtWZXJzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rTGlicmFyeVZhbGlkYXRvcl9tdWx0aXBsZUVjbGlwc2VMaW5rVmVyc2lvbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtMaWJyYXJ5VmFsaWRhdG9yX2ltcHJvcGVyRWNsaXBzZUxpbmtWZXJzaW9uOwotCQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfZWNsaXBzZWxpbmtfY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRFY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5jbGFzczsKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOwotCX0KLQkKLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZU1lc3NhZ2VzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxODM5NGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0pwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmsxXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzIuRWNsaXBzZUxpbmsxXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsKLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBWZXJzaW9uIHN0cmluZyBmb3IgRWNsaXBzZUxpbmsgcGxhdGZvcm0gdmVyc2lvbiAxLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzFfMCA9ICIxLjAiOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFZlcnNpb24gc3RyaW5nIGZvciBFY2xpcHNlTGluayBwbGF0Zm9ybSB2ZXJzaW9uIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1BMQVRGT1JNX1ZFUlNJT05fMV8xID0gIjEuMSI7ICAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVmVyc2lvbiBzdHJpbmcgZm9yIEVjbGlwc2VMaW5rIHBsYXRmb3JtIHZlcnNpb24gMS4yCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8xXzIgPSAiMS4yIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBWZXJzaW9uIHN0cmluZyBmb3IgRWNsaXBzZUxpbmsgcGxhdGZvcm0gdmVyc2lvbiAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzJfMCA9ICIyLjAiOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFZlcnNpb24gc3RyaW5nIGZvciBFY2xpcHNlTGluayBwbGF0Zm9ybSB2ZXJzaW9uIDIuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1BMQVRGT1JNX1ZFUlNJT05fMl8xID0gIjIuMSI7ICAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVmFsdWUgb2YgdGhlIGNvbnRlbnQtdHlwZSBmb3IgZWNsaXBzZWxpbmstb3JtLnhtbCAgbWFwcGluZ3MgZmlsZXMuIFVzZSB0aGlzIAotCSAqIHZhbHVlIHRvIHJldHJpZXZlIHRoZSBPUk0geG1sIGNvbnRlbnQgdHlwZSBmcm9tIHRoZSBjb250ZW50IHR5cGUgbWFuYWdlciAKLQkgKiBhbmQgdG8gYWRkIG5ldyBlY2xpcHNlbGluay1vcm0ueG1sLWxpa2UgZXh0ZW5zaW9ucyB0byB0aGlzIGNvbnRlbnQgdHlwZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXIjZ2V0Q29udGVudFR5cGUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbnRlbnRUeXBlIEVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFID0gCi0JCQlQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShQTFVHSU5fSUQgKyAiLmNvbnRlbnQub3JtIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgZWNsaXBzZWxpbmstb3JtLnhtbCB2ZXJzaW9uIDEuMCBtYXBwaW5nIGZpbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcGFSZXNvdXJjZVR5cGUgRUNMSVBTRUxJTktfT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRQotCQkJPSBuZXcgSnBhUmVzb3VyY2VUeXBlKEVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFLCBFY2xpcHNlTGluay5TQ0hFTUFfVkVSU0lPTik7Ci0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlIHR5cGUgZm9yIGVjbGlwc2VsaW5rLW9ybS54bWwgdmVyc2lvbiAxLjEgbWFwcGluZyBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUmVzb3VyY2VUeXBlIEVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUKLQkJCT0gbmV3IEpwYVJlc291cmNlVHlwZShFQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgRWNsaXBzZUxpbmsxXzEuU0NIRU1BX1ZFUlNJT04pOwotCQotCS8qKgotCSAqIFRoZSByZXNvdXJjZSB0eXBlIGZvciBlY2xpcHNlbGluay1vcm0ueG1sIHZlcnNpb24gMS4xIG1hcHBpbmcgZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwYVJlc291cmNlVHlwZSBFQ0xJUFNFTElOS19PUk1fWE1MXzFfMl9SRVNPVVJDRV9UWVBFCi0JCQk9IG5ldyBKcGFSZXNvdXJjZVR5cGUoRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIEVjbGlwc2VMaW5rMV8yLlNDSEVNQV9WRVJTSU9OKTsKLQkKLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgZWNsaXBzZWxpbmstb3JtLnhtbCB2ZXJzaW9uIDIuMCBtYXBwaW5nIGZpbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcGFSZXNvdXJjZVR5cGUgRUNMSVBTRUxJTktfT1JNX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRQotCQkJPSBuZXcgSnBhUmVzb3VyY2VUeXBlKEVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFLCBFY2xpcHNlTGluazJfMC5TQ0hFTUFfVkVSU0lPTik7Ci0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlIHR5cGUgZm9yIGVjbGlwc2VsaW5rLW9ybS54bWwgdmVyc2lvbiAyLjEgbWFwcGluZyBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUmVzb3VyY2VUeXBlIEVDTElQU0VMSU5LX09STV9YTUxfMl8xX1JFU09VUkNFX1RZUEUKLQkJCT0gbmV3IEpwYVJlc291cmNlVHlwZShFQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgRWNsaXBzZUxpbmsyXzEuU0NIRU1BX1ZFUlNJT04pOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSCA9IG5ldyBQYXRoKCJNRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiAqKioqKioqKioqCi0JcHJpdmF0ZSBzdGF0aWMgSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luIElOU1RBTkNFOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uIEpQVCBFY2xpcHNlTGluayBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQkKLQkKLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBzdGF0dXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlJTlNUQU5DRS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwpKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIG9yIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHBsdWctaW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgkKLQkKLQlwdWJsaWMgSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlOU1RBTkNFID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWZkOTExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhTWFueVRvT25lTWFwcGluZwotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0pvaW5GZXRjaCBqb2luRmV0Y2g7Ci0JCi0JCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qb2luRmV0Y2ggPSBuZXcgSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoKHRoaXMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzVG8oVmVjdG9yPFN0cmluZz4gbmFtZXMpIHsKLQkJc3VwZXIuYWRkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lc1RvKG5hbWVzKTsKLQkJbmFtZXMuYWRkKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKb2luRmV0Y2ggZ2V0Sm9pbkZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5qb2luRmV0Y2g7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5qb2luRmV0Y2guaW5pdGlhbGl6ZSh0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5qb2luRmV0Y2gudXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmpvaW5GZXRjaC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxYzgzMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YU9uZVRvT25lTWFwcGluZwotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzAKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoIGpvaW5GZXRjaDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25lZDsKLQkKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuam9pbkZldGNoID0gbmV3IEphdmFFY2xpcHNlTGlua0pvaW5GZXRjaCh0aGlzKTsKLQkJdGhpcy5wcml2YXRlT3duZWQgPSBuZXcgSmF2YUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkKHRoaXMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzVG8oVmVjdG9yPFN0cmluZz4gbmFtZXMpIHsKLQkJc3VwZXIuYWRkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lc1RvKG5hbWVzKTsKLQkJbmFtZXMuYWRkKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCQluYW1lcy5hZGQoRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgZ2V0UHJpdmF0ZU93bmVkKCkgewotCQlyZXR1cm4gdGhpcy5wcml2YXRlT3duZWQ7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5qb2luRmV0Y2guaW5pdGlhbGl6ZSh0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJdGhpcy5wcml2YXRlT3duZWQuaW5pdGlhbGl6ZSh0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5qb2luRmV0Y2gudXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQl0aGlzLnByaXZhdGVPd25lZC51cGRhdGUodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuam9pbkZldGNoLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMucHJpdmF0ZU93bmVkLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhZjU2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcKLXsKLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKiogIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWV0YW1vZGVsRmllbGRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuICgoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzApIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpKS5nZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxUeXBlTmFtZSgpIHsKLQkJU3RyaW5nIHRhcmdldFR5cGVOYW1lID0gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TXVsdGlSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZSgpOwotCQlyZXR1cm4gKHRhcmdldFR5cGVOYW1lICE9IG51bGwpID8gdGFyZ2V0VHlwZU5hbWUgOiBNZXRhbW9kZWxGaWVsZC5ERUZBVUxUX1RZUEVfTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZmEwZDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKEVjbGlwc2VMaW5rSnBhRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNzZiOWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk1ldGFtb2RlbEZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcKLXsKLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKiogIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWV0YW1vZGVsRmllbGRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuICgoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzApIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpKS5nZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxUeXBlTmFtZSgpIHsKLQkJU3RyaW5nIHRhcmdldFR5cGVOYW1lID0gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TXVsdGlSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZSgpOwotCQlyZXR1cm4gKHRhcmdldFR5cGVOYW1lICE9IG51bGwpID8gdGFyZ2V0VHlwZU5hbWUgOiBNZXRhbW9kZWxGaWVsZC5ERUZBVUxUX1RZUEVfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRhbW9kZWxGaWVsZFR5cGVBcmd1bWVudE5hbWVzVG8oQXJyYXlMaXN0PFN0cmluZz4gdHlwZUFyZ3VtZW50TmFtZXMpIHsKLQkJdGhpcy5hZGRNZXRhbW9kZWxGaWVsZE1hcEtleVR5cGVBcmd1bWVudE5hbWVUbyh0eXBlQXJndW1lbnROYW1lcyk7Ci0JCXN1cGVyLmFkZE1ldGFtb2RlbEZpZWxkVHlwZUFyZ3VtZW50TmFtZXNUbyh0eXBlQXJndW1lbnROYW1lcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWV0YW1vZGVsRmllbGRNYXBLZXlUeXBlQXJndW1lbnROYW1lVG8oQXJyYXlMaXN0PFN0cmluZz4gdHlwZUFyZ3VtZW50TmFtZXMpIHsKLQkJU3RyaW5nIG1hcEtleVR5cGVOYW1lID0gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TXVsdGlSZWZlcmVuY2VNYXBLZXlUeXBlTmFtZSgpOwotCQltYXBLZXlUeXBlTmFtZSA9IG1hcEtleVR5cGVOYW1lICE9IG51bGwgPyBtYXBLZXlUeXBlTmFtZSA6IE1ldGFtb2RlbEZpZWxkLkRFRkFVTFRfVFlQRV9OQU1FOwotCQl0eXBlQXJndW1lbnROYW1lcy5hZGQobWFwS2V5VHlwZU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MGNlMWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gKChFY2xpcHNlTGlua0pwYUZhY3RvcnkpIGZhY3RvcnkpLmJ1aWxkSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOTlhOTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nIAotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcKLXsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlOwotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubXV0YWJsZSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtNdXRhYmxlKHRoaXMpOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXNUbyhWZWN0b3I8U3RyaW5nPiBuYW1lcykgewotCQlzdXBlci5hZGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzVG8obmFtZXMpOwotCQluYW1lcy5hZGQoRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JCW5hbWVzLmFkZChFY2xpcHNlTGluay5DT05WRVJUKTsKLQl9Ci0KLQkvLyoqKioqKioqKioqKioqIEFic3RyYWN0SmF2YUJhc2ljTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGJ1aWxkQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7Ci0JCUphdmFDb252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9IHN1cGVyLmJ1aWxkQ29udmVydGVyKGNvbnZlcnRlclR5cGUpOwotCQlpZiAoamF2YUNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gamF2YUNvbnZlcnRlcjsKLQkJfQotCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbChjb252ZXJ0ZXJUeXBlLCBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikpIHsKLQkJCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydCh0aGlzLCB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCkgewotCQkvL2NoZWNrIEBDb252ZXJ0IGZpcnN0LCB0aGlzIGlzIHRoZSBvcmRlciB0aGF0IEVjbGlwc2VMaW5rIHNlYXJjaGVzCi0JCWlmICh0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpICE9IG51bGwpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUjsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCk7Ci0JfQotCQotCS8vKioqKioqKioqKioqIEVjbGlwc2VsaW5rSmF2YUJhc2ljTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rTXV0YWJsZSBnZXRNdXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5tdXRhYmxlOwotCX0KLQotCQotCS8vKioqKioqKioqKioqIGluaXRpYWxpemF0aW9uL3VwZGF0ZSAqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXRoaXMubXV0YWJsZS5pbml0aWFsaXplKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLm11dGFibGUudXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCX0KLQotCQotCS8vKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMubXV0YWJsZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0ltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkNTkxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NhY2hpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuTnVsbEphdmFDYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5KcGFGYWN0b3J5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nSW1wbAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIAotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nLAotCQlKYXZhQ2FjaGVhYmxlSG9sZGVyMl8wCi17Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIHNwZWNpZmllZFR5cGU7Ci0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkU2l6ZTsKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRTaGFyZWQ7Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkQWx3YXlzUmVmcmVzaDsKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXI7Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkRGlzYWJsZUhpdHM7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhpc3RlbmNlQ2hlY2tpbmc7Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBzcGVjaWZpZWRFeGlzdGVuY2VUeXBlOwotCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZGVmYXVsdEV4aXN0ZW5jZVR5cGU7Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBleHBpcnk7Ci0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSBleHBpcnlUaW1lT2ZEYXk7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFDYWNoZWFibGUyXzAgY2FjaGVhYmxlOwotCQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nSW1wbChKYXZhVHlwZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY2FjaGVhYmxlID0gdGhpcy5idWlsZENhY2hlYWJsZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVR5cGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhVHlwZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQotCS8vcXVlcnkgZm9yIHRoZSBjYWNoZSBhbm5vdGF0aW9uIGV2ZXJ5IHRpbWUgb24gc2V0dGVycy4KLQkvL2NhbGwgb25lIHNldHRlciBhbmQgdGhlIENhY2hlQW5ub3RhdGlvbiBjb3VsZCBjaGFuZ2UuIAotCS8vWW91IGNvdWxkIGNhbGwgbW9yZSB0aGFuIG9uZSBzZXR0ZXIgYmVmb3JlIHRoaXMgb2JqZWN0IGhhcyByZWNlaXZlZCBhbnkgbm90aWZpY2F0aW9uCi0JLy9mcm9tIHRoZSBqYXZhIHJlc291cmNlIG1vZGVsCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGdldENhY2hlQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLgotCQkJCWdldE5vbk51bGxBbm5vdGF0aW9uKGdldENhY2hlQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBnZXRFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS4KLQkJCQlnZXRBbm5vdGF0aW9uKGdldEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDYWNoZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkVHlwZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0VHlwZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRUeXBlKCk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGdldERlZmF1bHRUeXBlKCkgewotCQlyZXR1cm4gREVGQVVMVF9UWVBFOwotCX0KLQkJCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGdldFNwZWNpZmllZFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUgbmV3U3BlY2lmaWVkVHlwZSkgewotCQlFY2xpcHNlTGlua0NhY2hlVHlwZSBvbGRTcGVjaWZpZWRUeXBlID0gdGhpcy5zcGVjaWZpZWRUeXBlOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSBuZXdTcGVjaWZpZWRUeXBlOwotCQl0aGlzLmdldENhY2hlQW5ub3RhdGlvbigpLnNldFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRUeXBlKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFR5cGUsIG5ld1NwZWNpZmllZFR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBpbnRlcm5hbCBzZXR0ZXIgdXNlZCBvbmx5IGZvciB1cGRhdGluZyBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4KLQkgKiBUaGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggSW52YWxpZFRocmVhZEFjY2VzcyBleGNlcHRpb25zIGluIHRoZSBVSQotCSAqIHdoZW4geW91IHNldCBhIHZhbHVlIGZyb20gdGhlIFVJIGFuZCB0aGUgYW5ub3RhdGlvbiBkb2Vzbid0IGV4aXN0IHlldC4KLQkgKiBBZGRpbmcgdGhlIGFubm90YXRpb24gY2F1c2VzIGFuIHVwZGF0ZSB0byBvY2N1ciBhbmQgdGhlbiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFR5cGVfKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIG5ld1NwZWNpZmllZFR5cGUpIHsKLQkJRWNsaXBzZUxpbmtDYWNoZVR5cGUgb2xkU3BlY2lmaWVkVHlwZSA9IHRoaXMuc3BlY2lmaWVkVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gbmV3U3BlY2lmaWVkVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVHlwZSwgbmV3U3BlY2lmaWVkVHlwZSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTaXplKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkU2l6ZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFNpemUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkU2l6ZSgpLmludFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWZhdWx0U2l6ZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1NJWkU7Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2l6ZShJbnRlZ2VyIG5ld1NwZWNpZmllZFNpemUpIHsKLQkJSW50ZWdlciBvbGRTcGVjaWZpZWRTaXplID0gdGhpcy5zcGVjaWZpZWRTaXplOwotCQl0aGlzLnNwZWNpZmllZFNpemUgPSBuZXdTcGVjaWZpZWRTaXplOwotCQlnZXRDYWNoZUFubm90YXRpb24oKS5zZXRTaXplKG5ld1NwZWNpZmllZFNpemUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TSVpFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTaXplLCBuZXdTcGVjaWZpZWRTaXplKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2l6ZV8oSW50ZWdlciBuZXdTcGVjaWZpZWRTaXplKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkU2l6ZSA9IHRoaXMuc3BlY2lmaWVkU2l6ZTsKLQkJdGhpcy5zcGVjaWZpZWRTaXplID0gbmV3U3BlY2lmaWVkU2l6ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0laRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2l6ZSwgbmV3U3BlY2lmaWVkU2l6ZSk7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNoYXJlZCA9PSBudWxsKSA/IHRoaXMuaXNEZWZhdWx0U2hhcmVkKCkgOiB0aGlzLnNwZWNpZmllZFNoYXJlZC5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0U2hhcmVkKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfU0hBUkVEOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRTaGFyZWQoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNoYXJlZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4gbmV3U3BlY2lmaWVkU2hhcmVkKSB7Ci0JCUJvb2xlYW4gb2xkU2hhcmVkID0gdGhpcy5zcGVjaWZpZWRTaGFyZWQ7Ci0JCXRoaXMuc3BlY2lmaWVkU2hhcmVkID0gbmV3U3BlY2lmaWVkU2hhcmVkOwotCQl0aGlzLmdldENhY2hlQW5ub3RhdGlvbigpLnNldFNoYXJlZChuZXdTcGVjaWZpZWRTaGFyZWQpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfU0hBUkVEX1BST1BFUlRZLCBvbGRTaGFyZWQsIG5ld1NwZWNpZmllZFNoYXJlZCk7Ci0JCQotCQlpZiAobmV3U3BlY2lmaWVkU2hhcmVkID09IEJvb2xlYW4uRkFMU0UpIHsKLQkJCXNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCQlzZXRTcGVjaWZpZWRTaXplKG51bGwpOwotCQkJc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChudWxsKTsKLQkJCXNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihudWxsKTsKLQkJCXNldFNwZWNpZmllZERpc2FibGVIaXRzKG51bGwpOwotCQkJc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShudWxsKTsKLQkJCXNldEV4cGlyeShudWxsKTsKLQkJCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTaGFyZWRfKEJvb2xlYW4gbmV3U3BlY2lmaWVkU2hhcmVkKSB7Ci0JCUJvb2xlYW4gb2xkU3BlY2lmaWVkU2hhcmVkID0gdGhpcy5zcGVjaWZpZWRTaGFyZWQ7Ci0JCXRoaXMuc3BlY2lmaWVkU2hhcmVkID0gbmV3U3BlY2lmaWVkU2hhcmVkOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfU0hBUkVEX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTaGFyZWQsIG5ld1NwZWNpZmllZFNoYXJlZCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBbHdheXNSZWZyZXNoKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaCA9PSBudWxsKSA/IHRoaXMuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpIDogdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfQUxXQVlTX1JFRlJFU0g7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2g7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbiBuZXdTcGVjaWZpZWRBbHdheXNSZWZyZXNoKSB7Ci0JCUJvb2xlYW4gb2xkQWx3YXlzUmVmcmVzaCA9IHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaDsKLQkJdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoID0gbmV3U3BlY2lmaWVkQWx3YXlzUmVmcmVzaDsKLQkJdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKS5zZXRBbHdheXNSZWZyZXNoKG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2gpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFksIG9sZEFsd2F5c1JlZnJlc2gsIG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2gpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2hfKEJvb2xlYW4gbmV3U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCkgewotCQlCb29sZWFuIG9sZEFsd2F5c1JlZnJlc2ggPSB0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2g7Ci0JCXRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaCA9IG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2g7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9BTFdBWVNfUkVGUkVTSF9QUk9QRVJUWSwgb2xkQWx3YXlzUmVmcmVzaCwgbmV3U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZyZXNoT25seUlmTmV3ZXIoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIgPT0gbnVsbCkgPyB0aGlzLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpIDogdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIuYm9vbGVhblZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1JFRlJFU0hfT05MWV9JRl9ORVdFUjsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIG5ld1NwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcikgewotCQlCb29sZWFuIG9sZFJlZnJlc2hPbmx5SWZOZXdlciA9IHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOwotCQl0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciA9IG5ld1NwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIobmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1JFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSwgb2xkUmVmcmVzaE9ubHlJZk5ld2VyLCBuZXdTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcl8oQm9vbGVhbiBuZXdTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIpIHsKLQkJQm9vbGVhbiBvbGRSZWZyZXNoT25seUlmTmV3ZXIgPSB0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIgPSBuZXdTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXI7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFksIG9sZFJlZnJlc2hPbmx5SWZOZXdlciwgbmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2FibGVIaXRzKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMgPT0gbnVsbCkgPyB0aGlzLmlzRGVmYXVsdERpc2FibGVIaXRzKCkgOiB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHREaXNhYmxlSGl0cygpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX0RJU0FCTEVfSElUUzsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuIG5ld1NwZWNpZmllZERpc2FibGVIaXRzKSB7Ci0JCUJvb2xlYW4gb2xkRGlzYWJsZUhpdHMgPSB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOwotCQl0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzID0gbmV3U3BlY2lmaWVkRGlzYWJsZUhpdHM7Ci0JCXRoaXMuZ2V0Q2FjaGVBbm5vdGF0aW9uKCkuc2V0RGlzYWJsZUhpdHMobmV3U3BlY2lmaWVkRGlzYWJsZUhpdHMpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfRElTQUJMRV9ISVRTX1BST1BFUlRZLCBvbGREaXNhYmxlSGl0cywgbmV3U3BlY2lmaWVkRGlzYWJsZUhpdHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZERpc2FibGVIaXRzXyhCb29sZWFuIG5ld1NwZWNpZmllZERpc2FibGVIaXRzKSB7Ci0JCUJvb2xlYW4gb2xkRGlzYWJsZUhpdHMgPSB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOwotCQl0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzID0gbmV3U3BlY2lmaWVkRGlzYWJsZUhpdHM7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9ESVNBQkxFX0hJVFNfUFJPUEVSVFksIG9sZERpc2FibGVIaXRzLCBuZXdTcGVjaWZpZWREaXNhYmxlSGl0cyk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRDb29yZGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gREVGQVVMVF9DT09SRElOQVRJT05fVFlQRTsKLQl9Ci0JCQotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIG5ld1NwZWNpZmllZENvb3JkaW5hdGlvblR5cGUpIHsKLQkJRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgb2xkU3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSA9IHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlID0gbmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKLQkJdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKS5zZXRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSwgbmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgotCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCi0JICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgotCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZV8oRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgbmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSkgewotCQlFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBvbGRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlID0gdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlOwotCQl0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUgPSBuZXdTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSwgbmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0V4aXN0ZW5jZUNoZWNraW5nKCkgewotCQlyZXR1cm4gdGhpcy5leGlzdGVuY2VDaGVja2luZzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RXhpc3RlbmNlQ2hlY2tpbmcoYm9vbGVhbiBuZXdFeGlzdGVuY2VDaGVja2luZykgewotCQlib29sZWFuIG9sZEV4aXN0ZW5jZUNoZWNraW5nID0gdGhpcy5leGlzdGVuY2VDaGVja2luZzsKLQkJdGhpcy5leGlzdGVuY2VDaGVja2luZyA9IG5ld0V4aXN0ZW5jZUNoZWNraW5nOwotCQlpZiAobmV3RXhpc3RlbmNlQ2hlY2tpbmcpIHsKLQkJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hZGRBbm5vdGF0aW9uKGdldEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbk5hbWUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUucmVtb3ZlQW5ub3RhdGlvbihnZXRFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25OYW1lKCkpOwotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhJU1RFTkNFX0NIRUNLSU5HX1BST1BFUlRZLCBvbGRFeGlzdGVuY2VDaGVja2luZywgbmV3RXhpc3RlbmNlQ2hlY2tpbmcpOwotCQlzZXREZWZhdWx0RXhpc3RlbmNlVHlwZShjYWNsdWxhdGVEZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXhpc3RlbmNlQ2hlY2tpbmdfKGJvb2xlYW4gbmV3RXhpc3RlbmNlQ2hlY2tpbmcpIHsKLQkJYm9vbGVhbiBvbGRFeGlzdGVuY2VDaGVja2luZyA9IHRoaXMuZXhpc3RlbmNlQ2hlY2tpbmc7Ci0JCXRoaXMuZXhpc3RlbmNlQ2hlY2tpbmcgPSBuZXdFeGlzdGVuY2VDaGVja2luZzsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFWElTVEVOQ0VfQ0hFQ0tJTkdfUFJPUEVSVFksIG9sZEV4aXN0ZW5jZUNoZWNraW5nLCBuZXdFeGlzdGVuY2VDaGVja2luZyk7Ci0JfQotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgY2FjbHVsYXRlRGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSB7Ci0JCWlmIChoYXNFeGlzdGVuY2VDaGVja2luZygpKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0NBQ0hFOwotCQl9Ci0JCXJldHVybiBERUZBVUxUX0VYSVNURU5DRV9UWVBFOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldEV4aXN0ZW5jZVR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkgOiB0aGlzLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RXhpc3RlbmNlVHlwZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG5ld0RlZmF1bHRFeGlzdGVuY2VUeXBlKSB7Ci0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBvbGREZWZhdWx0RXhpc3RlbmNlVHlwZSA9IHRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGU7Ci0JCXRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGUgPSBuZXdEZWZhdWx0RXhpc3RlbmNlVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZLCBvbGREZWZhdWx0RXhpc3RlbmNlVHlwZSwgbmV3RGVmYXVsdEV4aXN0ZW5jZVR5cGUpOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG5ld1NwZWNpZmllZEV4aXN0ZW5jZVR5cGUpIHsKLQkJaWYgKCFoYXNFeGlzdGVuY2VDaGVja2luZygpKSB7Ci0JCQlpZiAobmV3U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSAhPSBudWxsKSB7Ci0JCQkJc2V0RXhpc3RlbmNlQ2hlY2tpbmcodHJ1ZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG9sZFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgPSB0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA9IG5ld1NwZWNpZmllZEV4aXN0ZW5jZVR5cGU7Ci0JCXRoaXMuZ2V0RXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkRXhpc3RlbmNlVHlwZSwgbmV3U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgotCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCi0JICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgotCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZV8oRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG5ld1NwZWNpZmllZEV4aXN0ZW5jZVR5cGUpIHsKLQkJRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG9sZFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgPSB0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA9IG5ld1NwZWNpZmllZEV4aXN0ZW5jZVR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlLCBuZXdTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRFeHBpcnkoKSB7Ci0JCXJldHVybiB0aGlzLmV4cGlyeTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RXhwaXJ5KEludGVnZXIgbmV3RXhwaXJ5KSB7Ci0JCUludGVnZXIgb2xkRXhwaXJ5ID0gdGhpcy5leHBpcnk7Ci0JCXRoaXMuZXhwaXJ5ID0gbmV3RXhwaXJ5OwotCQlnZXRDYWNoZUFubm90YXRpb24oKS5zZXRFeHBpcnkobmV3RXhwaXJ5KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFWFBJUllfUFJPUEVSVFksIG9sZEV4cGlyeSwgbmV3RXhwaXJ5KTsKLQkJaWYgKG5ld0V4cGlyeSAhPSBudWxsICYmIHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpIHsKLQkJCXJlbW92ZUV4cGlyeVRpbWVPZkRheSgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEV4cGlyeV8oSW50ZWdlciBuZXdFeHBpcnkpIHsKLQkJSW50ZWdlciBvbGRFeHBpcnkgPSB0aGlzLmV4cGlyeTsKLQkJdGhpcy5leHBpcnkgPSBuZXdFeHBpcnk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1BST1BFUlRZLCBvbGRFeHBpcnksIG5ld0V4cGlyeSk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSBnZXRFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCXJldHVybiB0aGlzLmV4cGlyeVRpbWVPZkRheTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IGFkZEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImV4cGlyeVRpbWVPZkRheSBhbHJlYWR5IGV4aXN0cywgdXNlIGdldEV4cGlyeVRpbWVPZkRheSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oZ2V0Q2FjaGVBbm5vdGF0aW9uTmFtZSgpKSA9PSBudWxsKSB7Ci0JCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbihnZXRDYWNoZUFubm90YXRpb25OYW1lKCkpOwotCQl9Ci0JCUphdmFFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSBuZXdFeHBpcnlUaW1lT2ZEYXkgPSBuZXcgSmF2YUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5KHRoaXMpOwotCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IG5ld0V4cGlyeVRpbWVPZkRheTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheUFubm90YXRpb24gPSBnZXRDYWNoZUFubm90YXRpb24oKS5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJbmV3RXhwaXJ5VGltZU9mRGF5LmluaXRpYWxpemUodGltZU9mRGF5QW5ub3RhdGlvbik7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZLCBudWxsLCBuZXdFeHBpcnlUaW1lT2ZEYXkpOwotCQlzZXRFeHBpcnkobnVsbCk7Ci0JCXJldHVybiBuZXdFeHBpcnlUaW1lT2ZEYXk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheSgpIHsKLQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRpbWVPZkRheUV4cGlyeSBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkgb2xkRXhwaXJ5VGltZU9mRGF5ID0gdGhpcy5leHBpcnlUaW1lT2ZEYXk7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gbnVsbDsKLQkJZ2V0Q2FjaGVBbm5vdGF0aW9uKCkucmVtb3ZlRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZLCBvbGRFeHBpcnlUaW1lT2ZEYXksIG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRFeHBpcnlUaW1lT2ZEYXkoSmF2YUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IG5ld0V4cGlyeVRpbWVPZkRheSkgewotCQlKYXZhRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkgb2xkRXhwaXJ5VGltZU9mRGF5ID0gdGhpcy5leHBpcnlUaW1lT2ZEYXk7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gbmV3RXhwaXJ5VGltZU9mRGF5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSwgb2xkRXhwaXJ5VGltZU9mRGF5LCBuZXdFeHBpcnlUaW1lT2ZEYXkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUNhY2hlYWJsZTJfMCBidWlsZENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPyAKLQkJCSgoSnBhRmFjdG9yeTJfMCkgdGhpcy5nZXRKcGFGYWN0b3J5KCkpLmJ1aWxkSmF2YUNhY2hlYWJsZSh0aGlzKSA6IAotCQkJbmV3IE51bGxKYXZhQ2FjaGVhYmxlMl8wKHRoaXMpOwotCX0KLQotCXB1YmxpYyBKYXZhQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVhYmxlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgewotCQlDYWNoZWFibGVIb2xkZXIyXzAgY2FjaGVhYmxlSG9sZGVyID0gZ2V0Q2FjaGVhYmxlU3VwZXJQZXJzaXN0ZW50VHlwZShnZXRQYXJlbnQoKS5nZXRQZXJzaXN0ZW50VHlwZSgpKTsKLQkJaWYgKGNhY2hlYWJsZUhvbGRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY2FjaGVhYmxlSG9sZGVyLmdldENhY2hlYWJsZSgpLmlzQ2FjaGVhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuICgoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ2FjaGVhYmxlSG9sZGVyMl8wIGdldENhY2hlYWJsZVN1cGVyUGVyc2lzdGVudFR5cGUoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKLQkJUGVyc2lzdGVudFR5cGUgc3VwZXJQZXJzaXN0ZW50VHlwZSA9IHBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKTsKLQkJaWYgKHN1cGVyUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJaWYgKHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQ2FjaGVhYmxlSG9sZGVyMl8wKSB7Ci0JCQkJcmV0dXJuIChDYWNoZWFibGVIb2xkZXIyXzApIHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkJfQotCQkJcmV0dXJuIGdldENhY2hlYWJsZVN1cGVyUGVyc2lzdGVudFR5cGUoc3VwZXJQZXJzaXN0ZW50VHlwZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUgPSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotCQlpbml0aWFsaXplKGdldENhY2hlQW5ub3RhdGlvbigpKTsKLQkJaW5pdGlhbGl6ZShnZXRFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oKSk7Ci0JCXRoaXMuY2FjaGVhYmxlLmluaXRpYWxpemUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSkgewotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSB0aGlzLnNwZWNpZmllZFR5cGUoY2FjaGUpOwotCQl0aGlzLnNwZWNpZmllZFNpemUgPSB0aGlzLnNwZWNpZmllZFNpemUoY2FjaGUpOwotCQl0aGlzLnNwZWNpZmllZFNoYXJlZCA9IHRoaXMuc3BlY2lmaWVkU2hhcmVkKGNhY2hlKTsKLQkJdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoID0gdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoKGNhY2hlKTsKLQkJdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIgPSB0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihjYWNoZSk7Ci0JCXRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMgPSB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzKGNhY2hlKTsKLQkJdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlID0gdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKGNhY2hlKTsKLQkJdGhpcy5pbml0aWFsaXplRXhwaXJ5KGNhY2hlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBleGlzdGVuY2VDaGVja2luZykgewotCQl0aGlzLmV4aXN0ZW5jZUNoZWNraW5nID0gZXhpc3RlbmNlQ2hlY2tpbmcgIT0gbnVsbDsKLQkJdGhpcy5zcGVjaWZpZWRFeGlzdGVuY2VUeXBlID0gc3BlY2lmaWVkRXhpc3RlbmNlVHlwZShleGlzdGVuY2VDaGVja2luZyk7Ci0JCXRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGUgPSB0aGlzLmNhY2x1bGF0ZURlZmF1bHRFeGlzdGVuY2VUeXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUV4cGlyeShFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSkgewotCQlpZiAoY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCkgPT0gbnVsbCkgewotCQkJdGhpcy5leHBpcnkgPSBjYWNoZS5nZXRFeHBpcnkoKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChjYWNoZS5nZXRFeHBpcnkoKSA9PSBudWxsKSB7IC8vaGFuZGxlIHdpdGggdmFsaWRhdGlvbiBpZiBib3RoIGV4cGlyeSBhbmQgZXhwaXJ5VGltZU9mRGF5IGFyZSBzZXQKLQkJCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkodGhpcyk7Ci0JCQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkuaW5pdGlhbGl6ZShjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpIHsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0gcmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLQkJdXBkYXRlKGdldENhY2hlQW5ub3RhdGlvbigpKTsKLQkJdXBkYXRlKGdldEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbigpKTsKLQkJdXBkYXRlRXhwaXJ5KGdldENhY2hlQW5ub3RhdGlvbigpKTsKLQkJdGhpcy5jYWNoZWFibGUudXBkYXRlKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUpIHsKLQkJc2V0U3BlY2lmaWVkVHlwZV8odGhpcy5zcGVjaWZpZWRUeXBlKGNhY2hlKSk7Ci0JCXNldFNwZWNpZmllZFNpemVfKHRoaXMuc3BlY2lmaWVkU2l6ZShjYWNoZSkpOwotCQlzZXRTcGVjaWZpZWRTaGFyZWRfKHRoaXMuc3BlY2lmaWVkU2hhcmVkKGNhY2hlKSk7Ci0JCXNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2hfKHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaChjYWNoZSkpOwotCQlzZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXJfKHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKGNhY2hlKSk7Ci0JCXNldFNwZWNpZmllZERpc2FibGVIaXRzXyh0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzKGNhY2hlKSk7Ci0JCXNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGVfKHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShjYWNoZSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBleGlzdGVuY2VDaGVja2luZykgewotCQlzZXRFeGlzdGVuY2VDaGVja2luZ18oZXhpc3RlbmNlQ2hlY2tpbmcgIT0gbnVsbCk7Ci0JCXNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGVfKHNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoZXhpc3RlbmNlQ2hlY2tpbmcpKTsKLQkJc2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoY2FjbHVsYXRlRGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUV4cGlyeShFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSkgewotCQlpZiAoY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCkgPT0gbnVsbCkgewotCQkJc2V0RXhwaXJ5VGltZU9mRGF5KG51bGwpOwotCQkJc2V0RXhwaXJ5XyhjYWNoZS5nZXRFeHBpcnkoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXkgIT0gbnVsbCkgewotCQkJCXRoaXMuZXhwaXJ5VGltZU9mRGF5LnVwZGF0ZShjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjYWNoZS5nZXRFeHBpcnkoKSA9PSBudWxsKXsKLQkJCQlzZXRFeHBpcnlUaW1lT2ZEYXkobmV3IEphdmFFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSh0aGlzKSk7Ci0JCQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkuaW5pdGlhbGl6ZShjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQl9Ci0JCQllbHNlIHsgLy9oYW5kbGUgd2l0aCB2YWxpZGF0aW9uIGlmIGJvdGggZXhwaXJ5IGFuZCBleHBpcnlUaW1lT2ZEYXkgYXJlIHNldAotCQkJCXNldEV4cGlyeVRpbWVPZkRheShudWxsKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlVHlwZSBzcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0NhY2hlVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwoY2FjaGUuZ2V0VHlwZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRTaXplKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlKSB7Ci0JCXJldHVybiBjYWNoZS5nZXRTaXplKCk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZFNoYXJlZChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSkgewotCQlyZXR1cm4gY2FjaGUuZ2V0U2hhcmVkKCk7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRBbHdheXNSZWZyZXNoKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlKSB7Ci0JCXJldHVybiBjYWNoZS5nZXRBbHdheXNSZWZyZXNoKCk7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUpIHsKLQkJcmV0dXJuIGNhY2hlLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCX0JCi0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkRGlzYWJsZUhpdHMoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUpIHsKLQkJcmV0dXJuIGNhY2hlLmdldERpc2FibGVIaXRzKCk7Ci0JfQotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBzcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwoY2FjaGUuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEludGVnZXIgZXhwaXJ5KEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlKSB7Ci0JCXJldHVybiBjYWNoZS5nZXRFeHBpcnkoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBzcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nKSB7Ci0JCWlmIChleGlzdGVuY2VDaGVja2luZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChleGlzdGVuY2VDaGVja2luZy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gZ2V0Q2FjaGVBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlRXhwaXJ5KG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUV4cGlyeShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSBnZXRDYWNoZUFubm90YXRpb24oKTsKLQkJaWYgKGNhY2hlLmdldEV4cGlyeSgpICE9IG51bGwgJiYgY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCkgIT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNBQ0hFX0VYUElSWV9BTkRfRVhQSVJZX1RJTUVfT0ZfREFZX0JPVEhfU1BFQ0lGSUVELAotCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0UGFyZW50KCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCl9LAotCQkJCQl0aGlzLCAKLQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQotCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODQyOGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcKLXsKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgc3BlY2lmaWVkVHlwZTsKLQkKLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcoSmF2YVR5cGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVR5cGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhVHlwZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKcGFGYWN0b3J5IGdldEpwYUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtKcGFGYWN0b3J5KSBzdXBlci5nZXRKcGFGYWN0b3J5KCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIGdldENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oZ2V0Q2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKCkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbihnZXRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKSB7Ci0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKGdldENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkVHlwZSgpICE9IG51bGwpID8gdGhpcy5nZXRTcGVjaWZpZWRUeXBlKCkgOiB0aGlzLmdldERlZmF1bHRUeXBlKCk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXREZWZhdWx0VHlwZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVFlQRTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGdldFNwZWNpZmllZFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgbmV3U3BlY2lmaWVkVHlwZSkgewotCQlpZiAodGhpcy5zcGVjaWZpZWRUeXBlID09IG5ld1NwZWNpZmllZFR5cGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgb2xkU3BlY2lmaWVkVHlwZSA9IHRoaXMuc3BlY2lmaWVkVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gbmV3U3BlY2lmaWVkVHlwZTsKLQkJCi0JCWlmIChuZXdTcGVjaWZpZWRUeXBlICE9IG51bGwpIHsKLQkJCWlmIChnZXRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKSA9PSBudWxsKSB7Ci0JCQkJYWRkQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKCk7Ci0JCQl9Ci0JCQlnZXRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKS5zZXRWYWx1ZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZFR5cGUpKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChnZXRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVHlwZSwgbmV3U3BlY2lmaWVkVHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgotCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCi0JICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgotCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVHlwZV8oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgbmV3U3BlY2lmaWVkVHlwZSkgewotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBvbGRTcGVjaWZpZWRUeXBlID0gdGhpcy5zcGVjaWZpZWRUeXBlOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSBuZXdTcGVjaWZpZWRUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UWVBFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRUeXBlLCBuZXdTcGVjaWZpZWRUeXBlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IHJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIGNoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiA9IHRoaXMuZ2V0Q2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuc3BlY2lmaWVkVHlwZSA9IGNoYW5nZVRyYWNraW5nVHlwZShjaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUgPSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiBjaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gPSB0aGlzLmdldENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbigpOwotCQl0aGlzLnNldFNwZWNpZmllZFR5cGVfKGNoYW5nZVRyYWNraW5nVHlwZShjaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGNoYW5nZVRyYWNraW5nVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiBjaGFuZ2VUcmFja2luZykgewotCQlpZiAoY2hhbmdlVHJhY2tpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZWxzZSBpZiAoY2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5ERUZBVUxUX1RZUEU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKGNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiBjaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gPSBnZXRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKTsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGNoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiA9PSBudWxsID8gbnVsbCA6IGNoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjOGI4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlCi17CQotCXByaXZhdGUgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIHJlc291cmNlQ29udmVyc2lvblZhbHVlOwotCQotCXByaXZhdGUgU3RyaW5nIGRhdGFWYWx1ZTsKLQkKLQlwcml2YXRlIFN0cmluZyBvYmplY3RWYWx1ZTsKLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlKEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9CQkKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YVZhbHVlKFN0cmluZyBuZXdEYXRhVmFsdWUpIHsKLQkJU3RyaW5nIG9sZERhdGFWYWx1ZSA9IHRoaXMuZGF0YVZhbHVlOwotCQl0aGlzLmRhdGFWYWx1ZSA9IG5ld0RhdGFWYWx1ZTsKLQkJdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5zZXREYXRhVmFsdWUobmV3RGF0YVZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1ZBTFVFX1BST1BFUlRZLCBvbGREYXRhVmFsdWUsIG5ld0RhdGFWYWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERhdGFWYWx1ZV8oU3RyaW5nIG5ld0RhdGFWYWx1ZSkgewotCQlTdHJpbmcgb2xkRGF0YVZhbHVlID0gdGhpcy5kYXRhVmFsdWU7Ci0JCXRoaXMuZGF0YVZhbHVlID0gbmV3RGF0YVZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVkFMVUVfUFJPUEVSVFksIG9sZERhdGFWYWx1ZSwgbmV3RGF0YVZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VmFsdWUoU3RyaW5nIG5ld09iamVjdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGRPYmplY3RWYWx1ZSA9IHRoaXMub2JqZWN0VmFsdWU7Ci0JCXRoaXMub2JqZWN0VmFsdWUgPSBuZXdPYmplY3RWYWx1ZTsKLQkJdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5zZXRPYmplY3RWYWx1ZShuZXdPYmplY3RWYWx1ZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1ZBTFVFX1BST1BFUlRZLCBvbGRPYmplY3RWYWx1ZSwgbmV3T2JqZWN0VmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RWYWx1ZV8oU3RyaW5nIG5ld09iamVjdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGRPYmplY3RWYWx1ZSA9IHRoaXMub2JqZWN0VmFsdWU7Ci0JCXRoaXMub2JqZWN0VmFsdWUgPSBuZXdPYmplY3RWYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVkFMVUVfUFJPUEVSVFksIG9sZE9iamVjdFZhbHVlLCBuZXdPYmplY3RWYWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUpIHsKLQkJdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlOwotCQl0aGlzLmRhdGFWYWx1ZSA9IHRoaXMuZGF0YVZhbHVlKCk7Ci0JCXRoaXMub2JqZWN0VmFsdWUgPSB0aGlzLm9iamVjdFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUpIHsKLQkJdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlOwotCQl0aGlzLnNldERhdGFWYWx1ZV8odGhpcy5kYXRhVmFsdWUoKSk7Ci0JCXRoaXMuc2V0T2JqZWN0VmFsdWVfKHRoaXMub2JqZWN0VmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBkYXRhVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgb2JqZWN0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXREYXRhVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T2JqZWN0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXZhbGlkYXRlRGF0YVZhbHVlc1VuaXF1ZShtZXNzYWdlcywgYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRGF0YVZhbHVlc1VuaXF1ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJTGlzdDxTdHJpbmc+IGRhdGFWYWx1ZXMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChnZXRQYXJlbnQoKS5kYXRhVmFsdWVzKCkpOwotCQlkYXRhVmFsdWVzLnJlbW92ZSh0aGlzLmRhdGFWYWx1ZSk7Ci0JCWlmIChkYXRhVmFsdWVzLmNvbnRhaW5zKHRoaXMuZGF0YVZhbHVlKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1VTFRJUExFX09CSkVDVF9WQUxVRVNfRk9SX0RBVEFfVkFMVUUsCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5kYXRhVmFsdWV9LCAKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXREYXRhVmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyOTYwZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQ29udmVydCBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgRWNsaXBzZUxpbmtDb252ZXJ0LCBKYXZhQ29udmVydGVyCi17Ci0JcHJpdmF0ZSBTdHJpbmcgc3BlY2lmaWVkQ29udmVydGVyTmFtZTsKLQkKLQlwcml2YXRlIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotCQotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcjsKLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydChKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmluaXRpYWxpemUoanJwYSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhQXR0cmlidXRlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkJCi0JcHVibGljIHZvaWQgYWRkVG9SZXNvdXJjZU1vZGVsKCkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbCgpIHsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJaWYgKGdldENvbnZlcnRlcigpICE9IG51bGwpIHsKLQkJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oZ2V0Q29udmVydGVyKCkuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlQ29udmVydCgpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbiBnZXRSZXNvdXJjZUNvbnZlcnQoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJOYW1lKCkgewotCQlyZXR1cm4gZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpID09IG51bGwgPyBnZXREZWZhdWx0Q29udmVydGVyTmFtZSgpIDogZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbnZlcnRlck5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0NPTlZFUlRFUl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ29udmVydGVyTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKFN0cmluZyBuZXdTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lID0gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOwotCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlck5hbWUgPSBuZXdTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOwotCQlnZXRSZXNvdXJjZUNvbnZlcnQoKS5zZXRWYWx1ZShuZXdTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZENvbnZlcnRlck5hbWUsIG5ld1NwZWNpZmllZENvbnZlcnRlck5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lXyhTdHJpbmcgbmV3U3BlY2lmaWVkQ29udmVydGVyTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkQ29udmVydGVyTmFtZSA9IHRoaXMuc3BlY2lmaWVkQ29udmVydGVyTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lID0gbmV3U3BlY2lmaWVkQ29udmVydGVyTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZENvbnZlcnRlck5hbWUsIG5ld1NwZWNpZmllZENvbnZlcnRlck5hbWUpOwotCX0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXI7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udmVydGVyVHlwZSgpIHsKLQkJaWYgKHRoaXMuY29udmVydGVyID09IG51bGwpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlci5OT19DT05WRVJURVI7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29udmVydGVyLmdldFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlclR5cGUpIHsKLQkJaWYgKGdldENvbnZlcnRlclR5cGUoKSA9PSBjb252ZXJ0ZXJUeXBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyIG9sZENvbnZlcnRlciA9IHRoaXMuY29udmVydGVyOwotCQlKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIgbmV3Q29udmVydGVyID0gYnVpbGRDb252ZXJ0ZXIoY29udmVydGVyVHlwZSk7Ci0JCXRoaXMuY29udmVydGVyID0gbnVsbDsKLQkJaWYgKG9sZENvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKG9sZENvbnZlcnRlci5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJfQotCQl0aGlzLmNvbnZlcnRlciA9IG5ld0NvbnZlcnRlcjsKLQkJaWYgKG5ld0NvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKG5ld0NvbnZlcnRlci5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9QUk9QRVJUWSwgb2xkQ29udmVydGVyLCBuZXdDb252ZXJ0ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb252ZXJ0ZXIoSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyIG5ld0NvbnZlcnRlcikgewotCQlKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIgb2xkQ29udmVydGVyID0gdGhpcy5jb252ZXJ0ZXI7Ci0JCXRoaXMuY29udmVydGVyID0gbmV3Q29udmVydGVyOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9QUk9QRVJUWSwgb2xkQ29udmVydGVyLCBuZXdDb252ZXJ0ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGpycGE7Ci0JCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyTmFtZSA9IHRoaXMuZ2V0UmVzb3VyY2VDb252ZXJ0ZXJOYW1lKCk7Ci0JCXRoaXMuY29udmVydGVyID0gdGhpcy5idWlsZENvbnZlcnRlcih0aGlzLmdldFJlc291cmNlQ29udmVydGVyVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGpycGE7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZV8odGhpcy5nZXRSZXNvdXJjZUNvbnZlcnRlck5hbWUoKSk7Ci0JCWlmIChnZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKSA9PSBnZXRDb252ZXJ0ZXJUeXBlKCkpIHsKLQkJCWdldENvbnZlcnRlcigpLnVwZGF0ZSh0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9IGJ1aWxkQ29udmVydGVyKGdldFJlc291cmNlQ29udmVydGVyVHlwZSgpKTsKLQkJCXNldENvbnZlcnRlcihqYXZhQ29udmVydGVyKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlQ29udmVydGVyTmFtZSgpIHsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnQgPSBnZXRSZXNvdXJjZUNvbnZlcnQoKTsKLQkJcmV0dXJuIHJlc291cmNlQ29udmVydCA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlQ29udmVydC5nZXRWYWx1ZSgpOwotCX0KLQotCQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlclR5cGUpIHsKLQkJaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSKSB7Ci0JCQlyZXR1cm4gYnVpbGRDdXN0b21Db252ZXJ0ZXIoKTsKLQkJfQotCQllbHNlIGlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKSB7Ci0JCQlyZXR1cm4gYnVpbGRUeXBlQ29udmVydGVyKCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVIpIHsKLQkJCXJldHVybiBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJfQotCQllbHNlIGlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVIpIHsKLQkJCXJldHVybiBidWlsZFN0cnVjdENvbnZlcnRlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGJ1aWxkQ3VzdG9tQ29udmVydGVyKCkgewotCQlKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IG5ldyBKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIodGhpcyk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuaW5pdGlhbGl6ZSh0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXJldHVybiBjb250ZXh0Q29udmVydGVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGJ1aWxkVHlwZUNvbnZlcnRlcigpIHsKLQkJSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gbmV3IEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIodGhpcyk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuaW5pdGlhbGl6ZSh0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXJldHVybiBjb250ZXh0Q29udmVydGVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlcigpIHsKLQkJSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gbmV3IEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIodGhpcyk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuaW5pdGlhbGl6ZSh0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXJldHVybiBjb250ZXh0Q29udmVydGVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgYnVpbGRTdHJ1Y3RDb252ZXJ0ZXIoKSB7Ci0JCUphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gbmV3IEphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcih0aGlzKTsKLQkJY29udGV4dENvbnZlcnRlci5pbml0aWFsaXplKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJcmV0dXJuIGNvbnRleHRDb252ZXJ0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKSB7Ci0JCWlmICh0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpICE9IG51bGwpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpICE9IG51bGwpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUjsKLQkJfQotCQllbHNlIGlmICh0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkgIT0gbnVsbCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVI7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8vKioqKioqKioqKioqKioqIGNvZGUgYXNzaXN0ICoqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpZiAodGhpcy5jb252ZXJ0VmFsdWVUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJlc3VsdCA9IHRoaXMucGVyc2lzdGVuY2VDb252ZXJ0ZXJzTmFtZXMoZmlsdGVyKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGNvbnZlcnRWYWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKGdldFJlc291cmNlQ29udmVydCgpICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmdldFJlc291cmNlQ29udmVydCgpLnZhbHVlVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBwZXJzaXN0ZW5jZUNvbnZlcnRlcnNOYW1lcygpIHsKLQkJaWYodGhpcy5nZXRFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCgpLmNvbnZlcnRlcnNTaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuPFN0cmluZz4gaW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKHRoaXMuZ2V0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQoKS51bmlxdWVDb252ZXJ0ZXJOYW1lcygpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY29udmVydGVyc05hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZz4odGhpcy5wZXJzaXN0ZW5jZUNvbnZlcnRlcnNOYW1lcygpLCBmaWx0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHBlcnNpc3RlbmNlQ29udmVydGVyc05hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKHRoaXMuY29udmVydGVyc05hbWVzKGZpbHRlcikpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKgotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCWlmIChnZXRDb252ZXJ0ZXIoKSAhPSBudWxsKSB7Ci0JCQlnZXRDb252ZXJ0ZXIoKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVkYTBjMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydGVyCi17Ci0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLQkKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQotCQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuZ2V0QW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLQkKLQlwdWJsaWMgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQlyZXR1cm4gJy4nOwotCX0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIG5hbWUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCWdldEFubm90YXRpb24oKS5zZXROYW1lKG5ld05hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVfKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pIHsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgPSBqcnBtOwotCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUoZ2V0QW5ub3RhdGlvbigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIganJwbSkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudE1lbWJlciA9IGpycG07Ci0JCXRoaXMuc2V0TmFtZV8odGhpcy5uYW1lKGdldEFubm90YXRpb24oKSkpOwotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5hZGRDb252ZXJ0ZXIodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZShFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnRlcikgewotCQlyZXR1cm4gcmVzb3VyY2VDb252ZXJ0ZXIgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZUNvbnZlcnRlci5nZXROYW1lKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgYm9vbGVhbiBvdmVycmlkZXMoRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCS8vIGphdmEgaXMgYXQgdGhlIGJhc2Ugb2YgdGhlIHRyZWUKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBkdXBsaWNhdGVzKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlyZXR1cm4gKHRoaXMgIT0gY29udmVydGVyKQotCQkJCSYmICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLm5hbWUpCi0JCQkJJiYgdGhpcy5uYW1lLmVxdWFscyhjb252ZXJ0ZXIuZ2V0TmFtZSgpKQotCQkJCSYmICEgdGhpcy5vdmVycmlkZXMoY29udmVydGVyKQotCQkJCSYmICEgY29udmVydGVyLm92ZXJyaWRlcyh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVySW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNmMwZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVySW1wbCBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyCi17Ci0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci0JCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjdXN0b21Db252ZXJ0ZXI7Ci0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIHN0cnVjdENvbnZlcnRlcjsKLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciB0eXBlQ29udmVydGVyOwotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXJJbXBsKEphdmFUeXBlTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKiBjb252ZXJ0ZXIgKioqKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBnZXRDdXN0b21Db252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbUNvbnZlcnRlcjsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGFkZEN1c3RvbUNvbnZlcnRlcigpIHsKLQkJaWYgKHRoaXMuY3VzdG9tQ29udmVydGVyICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImN1c3RvbSBjb252ZXJ0ZXIgYWxyZWFkeSBleGlzdHMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuY3VzdG9tQ29udmVydGVyID0gYnVpbGRDdXN0b21Db252ZXJ0ZXIoKTsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24odGhpcy5jdXN0b21Db252ZXJ0ZXIuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ1VTVE9NX0NPTlZFUlRFUl9QUk9QRVJUWSwgbnVsbCwgdGhpcy5jdXN0b21Db252ZXJ0ZXIpOwotCQlyZXR1cm4gdGhpcy5jdXN0b21Db252ZXJ0ZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEN1c3RvbUNvbnZlcnRlcl8oKSB7Ci0JCXRoaXMuY3VzdG9tQ29udmVydGVyID0gYnVpbGRDdXN0b21Db252ZXJ0ZXIoKTsJCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ1VTVE9NX0NPTlZFUlRFUl9QUk9QRVJUWSwgbnVsbCwgdGhpcy5jdXN0b21Db252ZXJ0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVDdXN0b21Db252ZXJ0ZXIoKSB7Ci0JCWlmICh0aGlzLmN1c3RvbUNvbnZlcnRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb252ZXJ0ZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCQkJCi0JCX0KLQkJSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9sZENvbnZlcnRlciA9IHRoaXMuY3VzdG9tQ29udmVydGVyOwotCQl0aGlzLmN1c3RvbUNvbnZlcnRlciA9IG51bGw7Ci0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKG9sZENvbnZlcnRlci5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDVVNUT01fQ09OVkVSVEVSX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXIsIG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDdXN0b21Db252ZXJ0ZXJfKCkgewotCQl0aGlzLmN1c3RvbUNvbnZlcnRlciA9IG51bGw7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ1VTVE9NX0NPTlZFUlRFUl9QUk9QRVJUWSwgdGhpcy5jdXN0b21Db252ZXJ0ZXIsIG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnZlcnRlckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBnZXRSZXNvdXJjZUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRBbm5vdGF0aW9uKGdldENvbnZlcnRlckFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKioqKioqIG9iamVjdCB0eXBlIGNvbnZlcnRlciAqKioqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRPYmplY3RUeXBlQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlQ29udmVydGVyOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoKSB7Ci0JCWlmICh0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigib2JqZWN0IHR5cGUgY29udmVydGVyIGFscmVhZHkgZXhpc3RzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIgPSBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24odGhpcy5vYmplY3RUeXBlQ29udmVydGVyLmdldEFubm90YXRpb25OYW1lKCkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9UWVBFX0NPTlZFUlRFUl9QUk9QRVJUWSwgbnVsbCwgdGhpcy5vYmplY3RUeXBlQ29udmVydGVyKTsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkT2JqZWN0VHlwZUNvbnZlcnRlcl8oKSB7Ci0JCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlciA9IGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlcigpOwkJCQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9UWVBFX0NPTlZFUlRFUl9QUk9QRVJUWSwgbnVsbCwgdGhpcy5vYmplY3RUeXBlQ29udmVydGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigpIHsKLQkJaWYgKHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvYmplY3QgdHlwZSBjb252ZXJ0ZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCQkJCi0JCX0KLQkJSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvbGRDb252ZXJ0ZXIgPSB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlciA9IG51bGw7Ci0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKG9sZENvbnZlcnRlci5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVFlQRV9DT05WRVJURVJfUFJPUEVSVFksIG9sZENvbnZlcnRlciwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcl8oKSB7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvbGRDb252ZXJ0ZXIgPSB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlciA9IG51bGw7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfQ09OVkVSVEVSX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXIsIG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBnZXRSZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oZ2V0T2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKioqKioqIHR5cGUgY29udmVydGVyICoqKioqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGdldFR5cGVDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVDb252ZXJ0ZXI7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgYWRkVHlwZUNvbnZlcnRlcigpIHsKLQkJaWYgKHRoaXMudHlwZUNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0eXBlIGNvbnZlcnRlciBhbHJlYWR5IGV4aXN0cyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy50eXBlQ29udmVydGVyID0gYnVpbGRUeXBlQ29udmVydGVyKCk7Ci0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hZGRBbm5vdGF0aW9uKHRoaXMudHlwZUNvbnZlcnRlci5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX0NPTlZFUlRFUl9QUk9QRVJUWSwgbnVsbCwgdGhpcy50eXBlQ29udmVydGVyKTsKLQkJcmV0dXJuIHRoaXMudHlwZUNvbnZlcnRlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZUNvbnZlcnRlcl8oKSB7Ci0JCXRoaXMudHlwZUNvbnZlcnRlciA9IGJ1aWxkVHlwZUNvbnZlcnRlcigpOwkJCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9DT05WRVJURVJfUFJPUEVSVFksIG51bGwsIHRoaXMudHlwZUNvbnZlcnRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVR5cGVDb252ZXJ0ZXIoKSB7Ci0JCWlmICh0aGlzLnR5cGVDb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidHlwZSBjb252ZXJ0ZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCQkJCi0JCX0KLQkJSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvbGRDb252ZXJ0ZXIgPSB0aGlzLnR5cGVDb252ZXJ0ZXI7Ci0JCXRoaXMudHlwZUNvbnZlcnRlciA9IG51bGw7Ci0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKG9sZENvbnZlcnRlci5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX0NPTlZFUlRFUl9QUk9QRVJUWSwgb2xkQ29udmVydGVyLCBudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVHlwZUNvbnZlcnRlcl8oKSB7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvbGRDb252ZXJ0ZXIgPSB0aGlzLnR5cGVDb252ZXJ0ZXI7Ci0JCXRoaXMudHlwZUNvbnZlcnRlciA9IG51bGw7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9DT05WRVJURVJfUFJPUEVSVFksIG9sZENvbnZlcnRlciwgbnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNvbnZlcnRlckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGdldFJlc291cmNlVHlwZUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSB0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0QW5ub3RhdGlvbihnZXRUeXBlQ29udmVydGVyQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCQotCQotCS8vKioqKioqKioqKioqKiogc3RydWN0IGNvbnZlcnRlciAqKioqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGdldFN0cnVjdENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMuc3RydWN0Q29udmVydGVyOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgYWRkU3RydWN0Q29udmVydGVyKCkgewotCQlpZiAodGhpcy5zdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic3RydWN0IGNvbnZlcnRlciBhbHJlYWR5IGV4aXN0cyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXIgPSBidWlsZFN0cnVjdENvbnZlcnRlcigpOwotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbih0aGlzLnN0cnVjdENvbnZlcnRlci5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTVFJVQ1RfQ09OVkVSVEVSX1BST1BFUlRZLCBudWxsLCB0aGlzLnN0cnVjdENvbnZlcnRlcik7Ci0JCXJldHVybiB0aGlzLnN0cnVjdENvbnZlcnRlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3RydWN0Q29udmVydGVyXygpIHsKLQkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXIgPSBidWlsZFN0cnVjdENvbnZlcnRlcigpOwkJCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1RSVUNUX0NPTlZFUlRFUl9QUk9QRVJUWSwgbnVsbCwgdGhpcy5zdHJ1Y3RDb252ZXJ0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoKSB7Ci0JCWlmICh0aGlzLnN0cnVjdENvbnZlcnRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzdHJ1Y3QgY29udmVydGVyIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAkJCQotCQl9Ci0JCUphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvbGRDb252ZXJ0ZXIgPSB0aGlzLnN0cnVjdENvbnZlcnRlcjsKLQkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXIgPSBudWxsOwotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUucmVtb3ZlQW5ub3RhdGlvbihvbGRDb252ZXJ0ZXIuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1RSVUNUX0NPTlZFUlRFUl9QUk9QRVJUWSwgb2xkQ29udmVydGVyLCBudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3RydWN0Q29udmVydGVyXygpIHsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb2xkQ29udmVydGVyID0gdGhpcy5zdHJ1Y3RDb252ZXJ0ZXI7Ci0JCXRoaXMuc3RydWN0Q29udmVydGVyID0gbnVsbDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTVFJVQ1RfQ09OVkVSVEVSX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXIsIG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cnVjdENvbnZlcnRlckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBnZXRSZXNvdXJjZVN0cnVjdENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRBbm5vdGF0aW9uKGdldFN0cnVjdENvbnZlcnRlckFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBqcnB0OwotCQl0aGlzLnVwZGF0ZUN1c3RvbUNvbnZlcnRlcigpOwotCQl0aGlzLnVwZGF0ZU9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJdGhpcy51cGRhdGVUeXBlQ29udmVydGVyKCk7Ci0JCXRoaXMudXBkYXRlU3RydWN0Q29udmVydGVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUN1c3RvbUNvbnZlcnRlcigpIHsKLQkJaWYgKGdldFJlc291cmNlQ29udmVydGVyKCkgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuY3VzdG9tQ29udmVydGVyICE9IG51bGwpIHsKLQkJCQl0aGlzLmN1c3RvbUNvbnZlcnRlci51cGRhdGUodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFkZEN1c3RvbUNvbnZlcnRlcl8oKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICh0aGlzLmN1c3RvbUNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlQ3VzdG9tQ29udmVydGVyXygpOwotCQkJfQotCQl9CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPYmplY3RUeXBlQ29udmVydGVyKCkgewotCQlpZiAoZ2V0UmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyKCkgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQkJdGhpcy5vYmplY3RUeXBlQ29udmVydGVyLnVwZGF0ZSh0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWRkT2JqZWN0VHlwZUNvbnZlcnRlcl8oKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICh0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJCXJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXJfKCk7Ci0JCQl9Ci0JCX0JCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVR5cGVDb252ZXJ0ZXIoKSB7Ci0JCWlmIChnZXRSZXNvdXJjZVR5cGVDb252ZXJ0ZXIoKSAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy50eXBlQ29udmVydGVyICE9IG51bGwpIHsKLQkJCQl0aGlzLnR5cGVDb252ZXJ0ZXIudXBkYXRlKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGRUeXBlQ29udmVydGVyXygpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHRoaXMudHlwZUNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlVHlwZUNvbnZlcnRlcigpOwotCQkJfQotCQl9CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdHJ1Y3RDb252ZXJ0ZXIoKSB7Ci0JCWlmIChnZXRSZXNvdXJjZVN0cnVjdENvbnZlcnRlcigpICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnN0cnVjdENvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXIudXBkYXRlKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGRTdHJ1Y3RDb252ZXJ0ZXJfKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAodGhpcy5zdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJCXJlbW92ZVN0cnVjdENvbnZlcnRlcl8oKTsKLQkJCX0KLQkJfQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7Ci0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGpycHQ7Ci0JCXRoaXMuaW5pdGlhbGl6ZUN1c3RvbUNvbnZlcnRlcigpOwotCQl0aGlzLmluaXRpYWxpemVPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVR5cGVDb252ZXJ0ZXIoKTsKLQkJdGhpcy5pbml0aWFsaXplU3RydWN0Q29udmVydGVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDdXN0b21Db252ZXJ0ZXIoKSB7Ci0JCWlmIChnZXRSZXNvdXJjZUNvbnZlcnRlcigpICE9IG51bGwpIHsKLQkJCXRoaXMuY3VzdG9tQ29udmVydGVyID0gYnVpbGRDdXN0b21Db252ZXJ0ZXIoKTsKLQkJfQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPYmplY3RUeXBlQ29udmVydGVyKCkgewotCQlpZiAoZ2V0UmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyKCkgIT0gbnVsbCkgewotCQkJdGhpcy5vYmplY3RUeXBlQ29udmVydGVyID0gYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCX0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVHlwZUNvbnZlcnRlcigpIHsKLQkJaWYgKGdldFJlc291cmNlVHlwZUNvbnZlcnRlcigpICE9IG51bGwpIHsKLQkJCXRoaXMudHlwZUNvbnZlcnRlciA9IGJ1aWxkVHlwZUNvbnZlcnRlcigpOwotCQl9CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVN0cnVjdENvbnZlcnRlcigpIHsKLQkJaWYgKGdldFJlc291cmNlU3RydWN0Q29udmVydGVyKCkgIT0gbnVsbCkgewotCQkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXIgPSBidWlsZFN0cnVjdENvbnZlcnRlcigpOwotCQl9CQkKLQl9Ci0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBidWlsZEN1c3RvbUNvbnZlcnRlcigpIHsKLQkJSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBuZXcgSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKHRoaXMpOwotCQljb250ZXh0Q29udmVydGVyLmluaXRpYWxpemUodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJcmV0dXJuIGNvbnRleHRDb252ZXJ0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgYnVpbGRUeXBlQ29udmVydGVyKCkgewotCQlKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBuZXcgSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcih0aGlzKTsKLQkJY29udGV4dENvbnZlcnRlci5pbml0aWFsaXplKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXJldHVybiBjb250ZXh0Q29udmVydGVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlcigpIHsKLQkJSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gbmV3IEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIodGhpcyk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuaW5pdGlhbGl6ZSh0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQlyZXR1cm4gY29udGV4dENvbnZlcnRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGJ1aWxkU3RydWN0Q29udmVydGVyKCkgewotCQlKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IG5ldyBKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIodGhpcyk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuaW5pdGlhbGl6ZSh0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQlyZXR1cm4gY29udGV4dENvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCWlmICh0aGlzLmN1c3RvbUNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLmN1c3RvbUNvbnZlcnRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCWlmICh0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy5vYmplY3RUeXBlQ29udmVydGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQkJaWYgKHRoaXMudHlwZUNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnR5cGVDb252ZXJ0ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCQlpZiAodGhpcy5zdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzE4YWUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBleHRlbmRzIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlciAKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyCi17Ci0JcHJpdmF0ZSBTdHJpbmcgY29udmVydGVyQ2xhc3M7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzczsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0NPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyLkNVU1RPTV9DT05WRVJURVI7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBzdXBlci5nZXRBbm5vdGF0aW9uKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogY29udmVydGVyIGNsYXNzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgbmV3Q29udmVydGVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZENvbnZlcnRlckNsYXNzID0gdGhpcy5jb252ZXJ0ZXJDbGFzczsKLQkJdGhpcy5jb252ZXJ0ZXJDbGFzcyA9IG5ld0NvbnZlcnRlckNsYXNzOwotCQlnZXRBbm5vdGF0aW9uKCkuc2V0Q29udmVydGVyQ2xhc3MobmV3Q29udmVydGVyQ2xhc3MpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSwgb2xkQ29udmVydGVyQ2xhc3MsIG5ld0NvbnZlcnRlckNsYXNzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udmVydGVyQ2xhc3NfKFN0cmluZyBuZXdDb252ZXJ0ZXJDbGFzcykgewotCQlTdHJpbmcgb2xkQ29udmVydGVyQ2xhc3MgPSB0aGlzLmNvbnZlcnRlckNsYXNzOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gbmV3Q29udmVydGVyQ2xhc3M7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXJDbGFzcywgbmV3Q29udmVydGVyQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKFN0cmluZyBjb252ZXJ0ZXJDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3MgPSBjb252ZXJ0ZXJDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9DT05WRVJURVJfQ0xBU1NfUFJPUEVSVFksIG9sZCwgY29udmVydGVyQ2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnRlcikgewotCQlyZXR1cm4gcmVzb3VyY2VDb252ZXJ0ZXIgPT0gbnVsbCA/Ci0JCQkJbnVsbCA6Ci0JCQkJCXJlc291cmNlQ29udmVydGVyLmdldEZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3NOYW1lKCk7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZSBpbnRlcmFjdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBqcnBtKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoanJwbSk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnRlciA9IGdldEFubm90YXRpb24oKTsKLQkJdGhpcy5jb252ZXJ0ZXJDbGFzcyA9IHRoaXMuY29udmVydGVyQ2xhc3MocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3MgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzcyhyZXNvdXJjZUNvbnZlcnRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pIHsKLQkJc3VwZXIudXBkYXRlKGpycG0pOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gcmVzb3VyY2VDb252ZXJ0ZXIgPSBnZXRBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuc2V0Q29udmVydGVyQ2xhc3NfKHRoaXMuY29udmVydGVyQ2xhc3MocmVzb3VyY2VDb252ZXJ0ZXIpKTsKLQkJdGhpcy5zZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKHJlc291cmNlQ29udmVydGVyKSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydGVyQ2xhc3MoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIHJlc291cmNlQ29udmVydGVyKSB7Ci0JCXJldHVybiByZXNvdXJjZUNvbnZlcnRlciA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpLmdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXZhbGlkYXRlQ29udmVydGVyQ2xhc3MobWVzc2FnZXMsIGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnZlcnRlckNsYXNzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAodGhpcy5jb252ZXJ0ZXJDbGFzcyA9PSBudWxsKSB7Ci0JCQkvL0Fubm90YXRpb24gaXRzZWxmIHdpbGwgaGF2ZSBjb21waWxlIGVycm9yIGlmIGNvbnZlcnRlciBjbGFzcyBub3QgZGVmaW5lZAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghIGdldEFubm90YXRpb24oKS5jb252ZXJ0ZXJDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoRUNMSVBTRUxJTktfQ09OVkVSVEVSX0NMQVNTX05BTUUsIGFzdFJvb3QpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09OVkVSVEVSX0NMQVNTX0lNUExFTUVOVFNfQ09OVkVSVEVSLAotCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuY29udmVydGVyQ2xhc3N9LAotCQkJCQl0aGlzLCAKLQkJCQkJZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2NTczOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplciBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgRWNsaXBzZUxpbmtDdXN0b21pemVyCi17CQotCXByaXZhdGUgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLQkKLQlwcml2YXRlIFN0cmluZyBjdXN0b21pemVyQ2xhc3M7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3M7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9DVVNUT01JWkVSX0NMQVNTX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIGNoYXIgZ2V0Q3VzdG9taXplckNsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJcmV0dXJuICcuJzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSnBhRmFjdG9yeSBnZXRKcGFGYWN0b3J5KCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rSnBhRmFjdG9yeSkgc3VwZXIuZ2V0SnBhRmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlQ3VzdG9taXplcigpIHsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlQ3VzdG9taXplcigpIHsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUN1c3RvbWl6ZXIoKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gZ2V0UmVzb3VyY2VDdXN0b21pemVyKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEN1c3RvbWl6ZXJDbGFzcygpIHsKLQkJcmV0dXJuIGdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplckNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzKFN0cmluZyBjdXN0b21pemVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3M7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3MgPSBjdXN0b21pemVyQ2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfQ1VTVE9NSVpFUl9DTEFTU19QUk9QRVJUWSwgb2xkLCBjdXN0b21pemVyQ2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcyhFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIHJlc291cmNlQ3VzdG9taXplcikgewotCQlyZXR1cm4gcmVzb3VyY2VDdXN0b21pemVyID09IG51bGwgPwotCQkJCW51bGwgOgotCQkJCXJlc291cmNlQ3VzdG9taXplci5nZXRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzc05hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoU3RyaW5nIG5ld0N1c3RvbWl6ZXJDbGFzcykgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuY3VzdG9taXplckNsYXNzLCBuZXdDdXN0b21pemVyQ2xhc3MpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZEN1c3RvbWl6ZXJDbGFzcyA9IHRoaXMuY3VzdG9taXplckNsYXNzOwotCQl0aGlzLmN1c3RvbWl6ZXJDbGFzcyA9IG5ld0N1c3RvbWl6ZXJDbGFzczsKLQkJaWYgKHRoaXMuY3VzdG9taXplckNsYXNzICE9IG51bGwpIHsKLQkJCWFkZFJlc291cmNlQ3VzdG9taXplcigpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVtb3ZlUmVzb3VyY2VDdXN0b21pemVyKCk7Ci0JCX0KLQkJaWYgKG5ld0N1c3RvbWl6ZXJDbGFzcyAhPSBudWxsKSB7Ci0JCQlnZXRSZXNvdXJjZUN1c3RvbWl6ZXIoKS5zZXRWYWx1ZShuZXdDdXN0b21pemVyQ2xhc3MpOwotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFksIG9sZEN1c3RvbWl6ZXJDbGFzcywgbmV3Q3VzdG9taXplckNsYXNzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3VzdG9taXplckNsYXNzXyhTdHJpbmcgbmV3Q3VzdG9taXplckNsYXNzKSB7Ci0JCVN0cmluZyBvbGRDdXN0b21pemVyQ2xhc3MgPSB0aGlzLmN1c3RvbWl6ZXJDbGFzczsKLQkJdGhpcy5jdXN0b21pemVyQ2xhc3MgPSBuZXdDdXN0b21pemVyQ2xhc3M7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFksIG9sZEN1c3RvbWl6ZXJDbGFzcywgbmV3Q3VzdG9taXplckNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7Ci0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGpycHQ7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gcmVzb3VyY2VDdXN0b21pemVyID0gZ2V0UmVzb3VyY2VDdXN0b21pemVyKCk7Ci0JCXRoaXMuY3VzdG9taXplckNsYXNzID0gdGhpcy5jdXN0b21pemVyQ2xhc3MocmVzb3VyY2VDdXN0b21pemVyKTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcyA9IHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcyhyZXNvdXJjZUN1c3RvbWl6ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBqcnB0OwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIHJlc291cmNlQ3VzdG9taXplciA9IGdldFJlc291cmNlQ3VzdG9taXplcigpOwotCQl0aGlzLnNldEN1c3RvbWl6ZXJDbGFzc18odGhpcy5jdXN0b21pemVyQ2xhc3MocmVzb3VyY2VDdXN0b21pemVyKSk7Ci0JCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3ModGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzKHJlc291cmNlQ3VzdG9taXplcikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbWl6ZXJDbGFzcyhFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIHJlc291cmNlQ3VzdG9taXplcikgewotCQlyZXR1cm4gcmVzb3VyY2VDdXN0b21pemVyID09IG51bGwgPyBudWxsIDogcmVzb3VyY2VDdXN0b21pemVyLmdldFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDdXN0b21pemVyQ2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlQ3VzdG9taXplcigpLmdldFZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQkvLyoqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXZhbGlkYXRlQ29udmVydGVyQ2xhc3MobWVzc2FnZXMsIGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnZlcnRlckNsYXNzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIHJlc291cmNlQ3VzdG9taXplciA9IGdldFJlc291cmNlQ3VzdG9taXplcigpOwotCQlpZiAocmVzb3VyY2VDdXN0b21pemVyICE9IG51bGwgJiYgIXJlc291cmNlQ3VzdG9taXplci5jdXN0b21pemVyQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19OQU1FLCBhc3RSb290KSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNVU1RPTUlaRVJfQ0xBU1NfSU1QTEVNRU5UU19ERVNDUklQVE9SX0NVU1RPTUlaRVIsCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5jdXN0b21pemVyQ2xhc3N9LAotCQkJCQl0aGlzLCAKLQkJCQkJZ2V0Q3VzdG9taXplckNsYXNzVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJKQotCQkJKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhOGUxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5FY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlSW1wbAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhRW1iZWRkYWJsZQotCWltcGxlbWVudHMgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZQotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgY29udmVydGVySG9sZGVyOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXI7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNoYW5nZVRyYWNraW5nOwotCQotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlSW1wbChKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29udmVydGVySG9sZGVyID0gbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlckltcGwodGhpcyk7Ci0JCXRoaXMuY3VzdG9taXplciA9IG5ldyBKYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyKHRoaXMpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nID0gbmV3IEphdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nKHRoaXMpOwotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiB1c2VzUHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBnZXRDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckhvbGRlcjsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpIHsKLQkJcmV0dXJuIHRoaXMuY2hhbmdlVHJhY2tpbmc7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShqcnB0KTsKLQkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIuaW5pdGlhbGl6ZShqcnB0KTsKLQkJdGhpcy5jdXN0b21pemVyLmluaXRpYWxpemUoanJwdCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcuaW5pdGlhbGl6ZShqcnB0KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKLQkJc3VwZXIudXBkYXRlKGpycHQpOwotCQl0aGlzLmNvbnZlcnRlckhvbGRlci51cGRhdGUoanJwdCk7Ci0JCXRoaXMuY3VzdG9taXplci51cGRhdGUoanJwdCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcudXBkYXRlKGpycHQpOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuY29udmVydGVySG9sZGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuY3VzdG9taXplci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFR5cGVNYXBwaW5nVmFsaWRhdG9yKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtUeXBlTWFwcGluZ1ZhbGlkYXRvcih0aGlzLCB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLCB0aGlzLmJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoYXN0Um9vdCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5SW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNmRjOTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFDYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5FY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFbnRpdHlJbXBsCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFbnRpdHkKLQlpbXBsZW1lbnRzIEphdmFFY2xpcHNlTGlua0VudGl0eQotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGVjbGlwc2VMaW5rQ2FjaGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIGNvbnZlcnRlckhvbGRlcjsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHk7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplcjsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY2hhbmdlVHJhY2tpbmc7Ci0JCi0JCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0VudGl0eUltcGwoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmVjbGlwc2VMaW5rQ2FjaGluZyA9IG5ldyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nSW1wbCh0aGlzKTsKLQkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIgPSBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVySW1wbCh0aGlzKTsKLQkJdGhpcy5yZWFkT25seSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtSZWFkT25seSh0aGlzKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZyA9IG5ldyBKYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyh0aGlzKTsKLQkJdGhpcy5jdXN0b21pemVyID0gbmV3IEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIodGhpcyk7Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIHVzZXNQcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlBSSU1BUllfS0VZKSAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBnZXRDYWNoaW5nKCkgewotCQlyZXR1cm4gdGhpcy5lY2xpcHNlTGlua0NhY2hpbmc7Ci0JfQotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZ2V0Q29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJIb2xkZXI7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua1JlYWRPbmx5IGdldFJlYWRPbmx5KCkgewotCQlyZXR1cm4gdGhpcy5yZWFkT25seTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpIHsKLQkJcmV0dXJuIHRoaXMuY2hhbmdlVHJhY2tpbmc7Ci0JfQotCi0JcHVibGljIEphdmFDYWNoZWFibGUyXzAgZ2V0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gKChKYXZhQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRDYWNoaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gKChKYXZhQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRDYWNoaW5nKCkpLmNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoanJwdCk7Ci0JCXRoaXMuZWNsaXBzZUxpbmtDYWNoaW5nLmluaXRpYWxpemUoanJwdCk7Ci0JCXRoaXMuY29udmVydGVySG9sZGVyLmluaXRpYWxpemUoanJwdCk7Ci0JCXRoaXMucmVhZE9ubHkuaW5pdGlhbGl6ZShqcnB0KTsKLQkJdGhpcy5jdXN0b21pemVyLmluaXRpYWxpemUoanJwdCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcuaW5pdGlhbGl6ZShqcnB0KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKLQkJc3VwZXIudXBkYXRlKGpycHQpOwotCQl0aGlzLmVjbGlwc2VMaW5rQ2FjaGluZy51cGRhdGUoanJwdCk7Ci0JCXRoaXMuY29udmVydGVySG9sZGVyLnVwZGF0ZShqcnB0KTsKLQkJdGhpcy5yZWFkT25seS51cGRhdGUoanJwdCk7Ci0JCXRoaXMuY3VzdG9taXplci51cGRhdGUoanJwdCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcudXBkYXRlKGpycHQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBzdXBlci5idWlsZFNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSAmJiAhY2xhc3NFeHRyYWN0b3JJc1VzZWQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2xhc3NFeHRyYWN0b3JJc1VzZWQoKSB7Ci0JCXJldHVybiBnZXRDbGFzc0V4dHJhY3RvckFubm90YXRpb24oKSAhPSBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEgZ2V0Q2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xKSAKLQkJCQkJZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEuQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQkvLyoqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5lY2xpcHNlTGlua0NhY2hpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5yZWFkT25seS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmN1c3RvbWl6ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkUHJpbWFyeUtleVZhbGlkYXRvcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rRW50aXR5UHJpbWFyeUtleVZhbGlkYXRvcih0aGlzLCBidWlsZFRleHRSYW5nZVJlc29sdmVyKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkVHlwZU1hcHBpbmdWYWxpZGF0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yKHRoaXMsIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUsIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoYXN0Um9vdCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzgwZTA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5Ci17Ci0JCi0JcHJvdGVjdGVkIEludGVnZXIgaG91cjsKLQlwcm90ZWN0ZWQgSW50ZWdlciBtaW51dGU7Ci0JcHJvdGVjdGVkIEludGVnZXIgc2Vjb25kOwotCXByb3RlY3RlZCBJbnRlZ2VyIG1pbGxpc2Vjb25kOwotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5OwotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkoRWNsaXBzZUxpbmtDYWNoaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRIb3VyKCkgewotCQlyZXR1cm4gdGhpcy5ob3VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhvdXIoSW50ZWdlciBuZXdIb3VyKSB7Ci0JCUludGVnZXIgb2xkSG91ciA9IHRoaXMuaG91cjsKLQkJdGhpcy5ob3VyID0gbmV3SG91cjsKLQkJdGhpcy50aW1lT2ZEYXkuc2V0SG91cihuZXdIb3VyKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChIT1VSX1BST1BFUlRZLCBvbGRIb3VyLCBuZXdIb3VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRIb3VyXyhJbnRlZ2VyIG5ld0hvdXIpIHsKLQkJSW50ZWdlciBvbGRIb3VyID0gdGhpcy5ob3VyOwotCQl0aGlzLmhvdXIgPSBuZXdIb3VyOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEhPVVJfUFJPUEVSVFksIG9sZEhvdXIsIG5ld0hvdXIpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldE1pbnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMubWludXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1pbnV0ZShJbnRlZ2VyIG5ld01pbnV0ZSkgewotCQlJbnRlZ2VyIG9sZE1pbnV0ZSA9IHRoaXMubWludXRlOwotCQl0aGlzLm1pbnV0ZSA9IG5ld01pbnV0ZTsKLQkJdGhpcy50aW1lT2ZEYXkuc2V0TWludXRlKG5ld01pbnV0ZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUlOVVRFX1BST1BFUlRZLCBvbGRNaW51dGUsIG5ld01pbnV0ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWludXRlXyhJbnRlZ2VyIG5ld01pbnV0ZSkgewotCQlJbnRlZ2VyIG9sZE1pbnV0ZSA9IHRoaXMubWludXRlOwotCQl0aGlzLm1pbnV0ZSA9IG5ld01pbnV0ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNSU5VVEVfUFJPUEVSVFksIG9sZE1pbnV0ZSwgbmV3TWludXRlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRTZWNvbmQoKSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWNvbmQoSW50ZWdlciBuZXdTZWNvbmQpIHsKLQkJSW50ZWdlciBvbGRTZWNvbmQgPSB0aGlzLnNlY29uZDsKLQkJdGhpcy5zZWNvbmQgPSBuZXdTZWNvbmQ7Ci0JCXRoaXMudGltZU9mRGF5LnNldFNlY29uZChuZXdTZWNvbmQpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFQ09ORF9QUk9QRVJUWSwgb2xkU2Vjb25kLCBuZXdTZWNvbmQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWNvbmRfKEludGVnZXIgbmV3U2Vjb25kKSB7Ci0JCUludGVnZXIgb2xkU2Vjb25kID0gdGhpcy5zZWNvbmQ7Ci0JCXRoaXMuc2Vjb25kID0gbmV3U2Vjb25kOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFQ09ORF9QUk9QRVJUWSwgb2xkU2Vjb25kLCBuZXdTZWNvbmQpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldE1pbGxpc2Vjb25kKCkgewotCQlyZXR1cm4gdGhpcy5taWxsaXNlY29uZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNaWxsaXNlY29uZChJbnRlZ2VyIG5ld01pbGxpc2Vjb25kKSB7Ci0JCUludGVnZXIgb2xkTWlsbGlzZWNvbmQgPSB0aGlzLm1pbGxpc2Vjb25kOwotCQl0aGlzLm1pbGxpc2Vjb25kID0gbmV3TWlsbGlzZWNvbmQ7Ci0JCXRoaXMudGltZU9mRGF5LnNldE1pbGxpc2Vjb25kKG5ld01pbGxpc2Vjb25kKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNSUxMSVNFQ09ORF9QUk9QRVJUWSwgb2xkTWlsbGlzZWNvbmQsIG5ld01pbGxpc2Vjb25kKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWlsbGlzZWNvbmRfKEludGVnZXIgbmV3TWlsbGlzZWNvbmQpIHsKLQkJSW50ZWdlciBvbGRNaWxsaXNlY29uZCA9IHRoaXMubWlsbGlzZWNvbmQ7Ci0JCXRoaXMubWlsbGlzZWNvbmQgPSBuZXdNaWxsaXNlY29uZDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNSUxMSVNFQ09ORF9QUk9QRVJUWSwgb2xkTWlsbGlzZWNvbmQsIG5ld01pbGxpc2Vjb25kKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudGltZU9mRGF5LmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5KSB7Ci0JCXRoaXMudGltZU9mRGF5ID0gdGltZU9mRGF5OwotCQl0aGlzLmhvdXIgPSBnZXRIb3VyKHRpbWVPZkRheSk7Ci0JCXRoaXMubWludXRlID0gZ2V0TWludXRlKHRpbWVPZkRheSk7Ci0JCXRoaXMuc2Vjb25kID0gZ2V0U2Vjb25kKHRpbWVPZkRheSk7Ci0JCXRoaXMubWlsbGlzZWNvbmQgPSBnZXRNaWxsaXNlY29uZCh0aW1lT2ZEYXkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSkgewotCQl0aGlzLnRpbWVPZkRheSA9IHRpbWVPZkRheTsKLQkJdGhpcy5zZXRIb3VyXyhnZXRIb3VyKHRpbWVPZkRheSkpOwotCQl0aGlzLnNldE1pbnV0ZV8oZ2V0TWludXRlKHRpbWVPZkRheSkpOwotCQl0aGlzLnNldFNlY29uZF8oZ2V0U2Vjb25kKHRpbWVPZkRheSkpOwotCQl0aGlzLnNldE1pbGxpc2Vjb25kXyhnZXRNaWxsaXNlY29uZCh0aW1lT2ZEYXkpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEludGVnZXIgZ2V0SG91cihFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5KSB7Ci0JCXJldHVybiB0aW1lT2ZEYXkuZ2V0SG91cigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBnZXRNaW51dGUoRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSkgewotCQlyZXR1cm4gdGltZU9mRGF5LmdldE1pbnV0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBnZXRTZWNvbmQoRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSkgewotCQlyZXR1cm4gdGltZU9mRGF5LmdldFNlY29uZCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBnZXRNaWxsaXNlY29uZChFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5KSB7Ci0JCXJldHVybiB0aW1lT2ZEYXkuZ2V0TWlsbGlzZWNvbmQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzYjA1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0lkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nIAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSWRNYXBwaW5nCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0lkTWFwcGluZwotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGU7Ci0JCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0lkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5tdXRhYmxlID0gbmV3IEphdmFFY2xpcHNlTGlua011dGFibGUodGhpcyk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKiogSmF2YUF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lc1RvKFZlY3RvcjxTdHJpbmc+IG5hbWVzKSB7Ci0JCXN1cGVyLmFkZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXNUbyhuYW1lcyk7Ci0JCW5hbWVzLmFkZChFY2xpcHNlTGluay5NVVRBQkxFKTsKLQkJbmFtZXMuYWRkKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCX0KLQotCQotCS8vKioqKioqKioqKioqKiogQWJzdHJhY3RKYXZhSWRNYXBwaW5nIG92ZXJyaWRlcyAqKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGJ1aWxkQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7Ci0JCUphdmFDb252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9IHN1cGVyLmJ1aWxkQ29udmVydGVyKGNvbnZlcnRlclR5cGUpOwotCQlpZiAoamF2YUNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gamF2YUNvbnZlcnRlcjsKLQkJfQotCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbChjb252ZXJ0ZXJUeXBlLCBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikpIHsKLQkJCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydCh0aGlzLCB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCkgewotCQkvL2NoZWNrIEBDb252ZXJ0IGZpcnN0LCB0aGlzIGlzIHRoZSBvcmRlciB0aGF0IEVjbGlwc2VMaW5rIHNlYXJjaGVzCi0JCWlmICh0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpICE9IG51bGwpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUjsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCk7Ci0JfQotCQotCQotCS8vKioqKioqKioqKioqIEVjbGlwc2VsaW5rSWRNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtNdXRhYmxlIGdldE11dGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm11dGFibGU7Ci0JfQotCQotCQotCS8vKioqKioqKioqKioqIGluaXRpYWxpemF0aW9uL3VwZGF0ZSAqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXRoaXMubXV0YWJsZS5pbml0aWFsaXplKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLm11dGFibGUudXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLm11dGFibGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0pvaW5GZXRjaC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhYWMwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0pvaW5GZXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoIAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUgCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0pvaW5GZXRjaAotewotCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgam9pbkZldGNoVmFsdWU7CQotCQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQkKLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEpvaW5GZXRjaEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBnZXRSZXNvdXJjZUpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFubm90YXRpb24oZ2V0Sm9pbkZldGNoQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlSm9pbkZldGNoKCkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKGdldEpvaW5GZXRjaEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZUpvaW5GZXRjaCgpIHsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihnZXRKb2luRmV0Y2hBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkZldGNoVmFsdWU7Ci0JfQotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtKb2luRmV0Y2guREVGQVVMVF9WQUxVRTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIG5ld0pvaW5GZXRjaFZhbHVlKSB7Ci0JCWlmICh0aGlzLmpvaW5GZXRjaFZhbHVlID09IG5ld0pvaW5GZXRjaFZhbHVlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCQkKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIG9sZEpvaW5GZXRjaFZhbHVlID0gdGhpcy5qb2luRmV0Y2hWYWx1ZTsKLQkJdGhpcy5qb2luRmV0Y2hWYWx1ZSA9IG5ld0pvaW5GZXRjaFZhbHVlOwotCQkKLQkJaWYgKG5ld0pvaW5GZXRjaFZhbHVlICE9IG51bGwpIHsKLQkJCWlmIChnZXRSZXNvdXJjZUpvaW5GZXRjaCgpID09IG51bGwpIHsKLQkJCQlhZGRSZXNvdXJjZUpvaW5GZXRjaCgpOwotCQkJfQotCQkJZ2V0UmVzb3VyY2VKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChuZXdKb2luRmV0Y2hWYWx1ZSkpOwkJCi0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0UmVzb3VyY2VKb2luRmV0Y2goKSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlUmVzb3VyY2VKb2luRmV0Y2goKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVjbGlwc2VMaW5rSm9pbkZldGNoLlZBTFVFX1BST1BFUlRZLCBvbGRKb2luRmV0Y2hWYWx1ZSwgbmV3Sm9pbkZldGNoVmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiBpbnRlcm5hbCBzZXR0ZXIgdXNlZCBvbmx5IGZvciB1cGRhdGluZyBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4KLQkgKiBUaGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggSW52YWxpZFRocmVhZEFjY2VzcyBleGNlcHRpb25zIGluIHRoZSBVSQotCSAqIHdoZW4geW91IHNldCBhIHZhbHVlIGZyb20gdGhlIFVJIGFuZCB0aGUgYW5ub3RhdGlvbiBkb2Vzbid0IGV4aXN0IHlldC4KLQkgKiBBZGRpbmcgdGhlIGFubm90YXRpb24gY2F1c2VzIGFuIHVwZGF0ZSB0byBvY2N1ciBhbmQgdGhlbiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgbmV3Sm9pbkZldGNoVmFsdWUpIHsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIG9sZEpvaW5GZXRjaFZhbHVlID0gdGhpcy5qb2luRmV0Y2hWYWx1ZTsKLQkJdGhpcy5qb2luRmV0Y2hWYWx1ZSA9IG5ld0pvaW5GZXRjaFZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVjbGlwc2VMaW5rSm9pbkZldGNoLlZBTFVFX1BST1BFUlRZLCBvbGRKb2luRmV0Y2hWYWx1ZSwgbmV3Sm9pbkZldGNoVmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGpycGE7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiByZXNvdXJjZUpvaW5GZXRjaCA9IHRoaXMuZ2V0UmVzb3VyY2VKb2luRmV0Y2goKTsKLQkJdGhpcy5qb2luRmV0Y2hWYWx1ZSA9IHRoaXMuam9pbkZldGNoKHJlc291cmNlSm9pbkZldGNoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGpycGE7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiByZXNvdXJjZUpvaW5GZXRjaCA9IHRoaXMuZ2V0UmVzb3VyY2VKb2luRmV0Y2goKTsKLQkJc2V0VmFsdWVfKGpvaW5GZXRjaChyZXNvdXJjZUpvaW5GZXRjaCkpOwotCX0KLQkKLQlwcml2YXRlIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBqb2luRmV0Y2goRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIHJlc291cmNlSm9pbkZldGNoKSB7Ci0JCWlmIChyZXNvdXJjZUpvaW5GZXRjaCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAocmVzb3VyY2VKb2luRmV0Y2guZ2V0VmFsdWUoKSA9PSBudWxsKSB7IAotCQkJLy8gQEpvaW5GZXRjaCBpcyBlcXVpdmFsZW50IHRvIEBKb2luRmV0Y2goSm9pbkZldGNoLklOTkVSKQotCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKHJlc291cmNlSm9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIHJlc291cmNlSm9pbkZldGNoID0gdGhpcy5nZXRSZXNvdXJjZUpvaW5GZXRjaCgpOwotCQlyZXR1cm4gcmVzb3VyY2VKb2luRmV0Y2ggPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZUpvaW5GZXRjaC5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzAxNjU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFNYW55VG9NYW55TWFwcGluZwotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0pvaW5GZXRjaCBqb2luRmV0Y2g7Ci0JCi0JCi0JcHVibGljIEphdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmpvaW5GZXRjaCA9IG5ldyBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2godGhpcyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXNUbyhWZWN0b3I8U3RyaW5nPiBuYW1lcykgewotCQlzdXBlci5hZGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzVG8obmFtZXMpOwotCQluYW1lcy5hZGQoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLmpvaW5GZXRjaC5pbml0aWFsaXplKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5GZXRjaC51cGRhdGUodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuam9pbkZldGNoLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlMjFmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nCi17Ci0JcHVibGljIEphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAgYnVpbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFNYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTcyZDQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ByaW1hcnlLZXlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhTWFwcGVkU3VwZXJjbGFzcwotCWltcGxlbWVudHMgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcywgQ2FjaGVhYmxlSG9sZGVyMl8wCi17Ci0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NhY2hpbmcgZWNsaXBzZUxpbmtDYWNoaW5nOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgY29udmVydGVySG9sZGVyOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjaGFuZ2VUcmFja2luZzsKLQkKLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmVjbGlwc2VMaW5rQ2FjaGluZyA9IG5ldyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nSW1wbCh0aGlzKTsKLQkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIgPSBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVySW1wbCh0aGlzKTsKLQkJdGhpcy5yZWFkT25seSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtSZWFkT25seSh0aGlzKTsKLQkJdGhpcy5jdXN0b21pemVyID0gbmV3IEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIodGhpcyk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcgPSBuZXcgSmF2YUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcodGhpcyk7Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIHVzZXNQcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlBSSU1BUllfS0VZKSAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBnZXRDYWNoaW5nKCkgewotCQlyZXR1cm4gdGhpcy5lY2xpcHNlTGlua0NhY2hpbmc7Ci0JfQotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZ2V0Q29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJIb2xkZXI7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua1JlYWRPbmx5IGdldFJlYWRPbmx5KCkgewotCQlyZXR1cm4gdGhpcy5yZWFkT25seTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpIHsKLQkJcmV0dXJuIHRoaXMuY2hhbmdlVHJhY2tpbmc7Ci0JfQotCQotCXB1YmxpYyBDYWNoZWFibGUyXzAgZ2V0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldENhY2hpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0Q2FjaGluZygpKS5jYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgewotCQlzdXBlci5pbml0aWFsaXplKGpycHQpOwotCQl0aGlzLmVjbGlwc2VMaW5rQ2FjaGluZy5pbml0aWFsaXplKGpycHQpOwotCQl0aGlzLmNvbnZlcnRlckhvbGRlci5pbml0aWFsaXplKGpycHQpOwotCQl0aGlzLnJlYWRPbmx5LmluaXRpYWxpemUoanJwdCk7Ci0JCXRoaXMuY3VzdG9taXplci5pbml0aWFsaXplKGpycHQpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nLmluaXRpYWxpemUoanJwdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7Ci0JCXN1cGVyLnVwZGF0ZShqcnB0KTsKLQkJdGhpcy5lY2xpcHNlTGlua0NhY2hpbmcudXBkYXRlKGpycHQpOwotCQl0aGlzLmNvbnZlcnRlckhvbGRlci51cGRhdGUoanJwdCk7Ci0JCXRoaXMucmVhZE9ubHkudXBkYXRlKGpycHQpOwotCQl0aGlzLmN1c3RvbWl6ZXIudXBkYXRlKGpycHQpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nLnVwZGF0ZShqcnB0KTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuZWNsaXBzZUxpbmtDYWNoaW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuY29udmVydGVySG9sZGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMucmVhZE9ubHkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5jdXN0b21pemVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFByaW1hcnlLZXlWYWxpZGF0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yKHRoaXMsIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUeXBlTWFwcGluZ1ZhbGlkYXRvcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ZhbGlkYXRvcih0aGlzLCB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLCB0aGlzLmJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoYXN0Um9vdCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTXV0YWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNdXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTgzYzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNdXRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rTXV0YWJsZSBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgRWNsaXBzZUxpbmtNdXRhYmxlCi17Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdE11dGFibGU7Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkTXV0YWJsZTsKLQkKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JCi0JcHVibGljIEphdmFFY2xpcHNlTGlua011dGFibGUoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiAoSmF2YUF0dHJpYnV0ZU1hcHBpbmcpIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11dGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBnZXRSZXNvdXJjZU11dGFibGUoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihnZXRNdXRhYmxlQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlTXV0YWJsZSgpIHsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihnZXRNdXRhYmxlQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlTXV0YWJsZSgpIHsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihnZXRNdXRhYmxlQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdE11dGFibGUoKSB7Ci0JCUphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YUF0dHJpYnV0ZSA9IChKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlKSB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCWlmIChqYXZhQXR0cmlidXRlLnR5cGVJc0RhdGVPckNhbGVuZGFyKCkpIHsKLQkJCUJvb2xlYW4gcGVyc2lzdGVuY2VVbml0RGVmYXVsdE11dGFibGUgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5nZXRUZW1wb3JhbE11dGFibGUoKTsKLQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0TXV0YWJsZSA9PSBudWxsID8gZmFsc2UgOiBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0TXV0YWJsZS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gamF2YUF0dHJpYnV0ZS50eXBlSXNTZXJpYWxpemFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc011dGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE11dGFibGUgIT0gbnVsbCA/IHRoaXMuc3BlY2lmaWVkTXV0YWJsZS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuZGVmYXVsdE11dGFibGU7IAotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRNdXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TXV0YWJsZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE11dGFibGUoYm9vbGVhbiBuZXdEZWZhdWx0TXV0YWJsZSkgewotCQlib29sZWFuIG9sZERlZmF1bHRNdXRhYmxlID0gdGhpcy5kZWZhdWx0TXV0YWJsZTsKLQkJdGhpcy5kZWZhdWx0TXV0YWJsZSA9IG5ld0RlZmF1bHRNdXRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTVVUQUJMRV9QUk9QRVJUWSwgb2xkRGVmYXVsdE11dGFibGUsIG5ld0RlZmF1bHRNdXRhYmxlKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkTXV0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTXV0YWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuIG5ld1NwZWNpZmllZE11dGFibGUpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkTXV0YWJsZSA9PSBuZXdTcGVjaWZpZWRNdXRhYmxlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQm9vbGVhbiBvbGRTcGVjaWZpZWRNdXRhYmxlID0gdGhpcy5zcGVjaWZpZWRNdXRhYmxlOwotCQl0aGlzLnNwZWNpZmllZE11dGFibGUgPSBuZXdTcGVjaWZpZWRNdXRhYmxlOwotCi0JCWlmIChuZXdTcGVjaWZpZWRNdXRhYmxlICE9IG51bGwpIHsKLQkJCWlmIChnZXRSZXNvdXJjZU11dGFibGUoKSA9PSBudWxsKSB7Ci0JCQkJYWRkUmVzb3VyY2VNdXRhYmxlKCk7Ci0JCQl9Ci0JCQlpZiAobmV3U3BlY2lmaWVkTXV0YWJsZS5ib29sZWFuVmFsdWUoKSkgewotCQkJCWlmIChnZXRSZXNvdXJjZU11dGFibGUoKS5nZXRWYWx1ZSgpID09IEJvb2xlYW4uRkFMU0UpIHsKLQkJCQkJZ2V0UmVzb3VyY2VNdXRhYmxlKCkuc2V0VmFsdWUobnVsbCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZ2V0UmVzb3VyY2VNdXRhYmxlKCkuc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZW1vdmVSZXNvdXJjZU11dGFibGUoKTsKLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVjbGlwc2VMaW5rTXV0YWJsZS5TUEVDSUZJRURfTVVUQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTXV0YWJsZSwgbmV3U3BlY2lmaWVkTXV0YWJsZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE11dGFibGVfKEJvb2xlYW4gbmV3U3BlY2lmaWVkTXV0YWJsZSkgewotCQlCb29sZWFuIG9sZFNwZWNpZmllZE11dGFibGUgPSB0aGlzLnNwZWNpZmllZE11dGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkTXV0YWJsZSA9IG5ld1NwZWNpZmllZE11dGFibGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01VVEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE11dGFibGUsIG5ld1NwZWNpZmllZE11dGFibGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGpycGE7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gcmVzb3VyY2VNdXRhYmxlID0gdGhpcy5nZXRSZXNvdXJjZU11dGFibGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRNdXRhYmxlID0gdGhpcy5zcGVjaWZpZWRNdXRhYmxlKHJlc291cmNlTXV0YWJsZSk7Ci0JCXRoaXMuZGVmYXVsdE11dGFibGUgPSB0aGlzLmNhbGN1bGF0ZURlZmF1bHRNdXRhYmxlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqcnBhOwotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIHJlc291cmNlTXV0YWJsZSA9IHRoaXMuZ2V0UmVzb3VyY2VNdXRhYmxlKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTXV0YWJsZV8odGhpcy5zcGVjaWZpZWRNdXRhYmxlKHJlc291cmNlTXV0YWJsZSkpOwotCQl0aGlzLnNldERlZmF1bHRNdXRhYmxlKHRoaXMuY2FsY3VsYXRlRGVmYXVsdE11dGFibGUoKSk7Ci0JfQotCQotCXByaXZhdGUgQm9vbGVhbiBzcGVjaWZpZWRNdXRhYmxlKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gcmVzb3VyY2VNdXRhYmxlKSB7Ci0JCWlmIChyZXNvdXJjZU11dGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHJlc291cmNlTXV0YWJsZS5nZXRWYWx1ZSgpID09IG51bGwpIHsgLy9ATXV0YWJsZSBpcyBlcXVpdmFsZW50IHRvIEBNdXRhYmxlKHRydWUpCi0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZU11dGFibGUuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gcmVzb3VyY2VNdXRhYmxlID0gdGhpcy5nZXRSZXNvdXJjZU11dGFibGUoKTsKLQkJcmV0dXJuIHJlc291cmNlTXV0YWJsZSA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlTXV0YWJsZS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjZkMzgzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgZXh0ZW5kcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcgotewkKLQlwcml2YXRlIFN0cmluZyBkYXRhVHlwZTsKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZERhdGFUeXBlOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfREFUQV9UWVBFX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBTdHJpbmcgb2JqZWN0VHlwZTsKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZE9iamVjdFR5cGU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9PQkpFQ1RfVFlQRV9QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZE9iamVjdFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlOwotCQotCXByaXZhdGUgZmluYWwgTGlzdDxKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZXM7Ci0JCi0JCi0JcHVibGljIEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnZlcnNpb25WYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4oKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBzdXBlci5nZXRBbm5vdGF0aW9uKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogZGF0YSB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIG5ld0RhdGFUeXBlKSB7Ci0JCVN0cmluZyBvbGREYXRhVHlwZSA9IHRoaXMuZGF0YVR5cGU7Ci0JCXRoaXMuZGF0YVR5cGUgPSBuZXdEYXRhVHlwZTsKLQkJZ2V0QW5ub3RhdGlvbigpLnNldERhdGFUeXBlKG5ld0RhdGFUeXBlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1RZUEVfUFJPUEVSVFksIG9sZERhdGFUeXBlLCBuZXdEYXRhVHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERhdGFUeXBlXyhTdHJpbmcgbmV3RGF0YVR5cGUpIHsKLQkJU3RyaW5nIG9sZERhdGFUeXBlID0gdGhpcy5kYXRhVHlwZTsKLQkJdGhpcy5kYXRhVHlwZSA9IG5ld0RhdGFUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVFlQRV9QUk9QRVJUWSwgb2xkRGF0YVR5cGUsIG5ld0RhdGFUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZShTdHJpbmcgZGF0YVR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZnVsbHlRdWFsaWZpZWREYXRhVHlwZTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZERhdGFUeXBlID0gZGF0YVR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfREFUQV9UWVBFX1BST1BFUlRZLCBvbGQsIGRhdGFUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWREYXRhVHlwZShFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIHJlc291cmNlQ29udmVydGVyKSB7Ci0JCXJldHVybiByZXNvdXJjZUNvbnZlcnRlciA9PSBudWxsID8KLQkJCQludWxsIDoKLQkJCQkJcmVzb3VyY2VDb252ZXJ0ZXIuZ2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIG9iamVjdCB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBuZXdPYmplY3RUeXBlKSB7Ci0JCVN0cmluZyBvbGRPYmplY3RUeXBlID0gdGhpcy5vYmplY3RUeXBlOwotCQl0aGlzLm9iamVjdFR5cGUgPSBuZXdPYmplY3RUeXBlOwotCQlnZXRBbm5vdGF0aW9uKCkuc2V0T2JqZWN0VHlwZShuZXdPYmplY3RUeXBlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVFlQRV9QUk9QRVJUWSwgb2xkT2JqZWN0VHlwZSwgbmV3T2JqZWN0VHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdFR5cGVfKFN0cmluZyBuZXdPYmplY3RUeXBlKSB7Ci0JCVN0cmluZyBvbGRPYmplY3RUeXBlID0gdGhpcy5vYmplY3RUeXBlOwotCQl0aGlzLm9iamVjdFR5cGUgPSBuZXdPYmplY3RUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9UWVBFX1BST1BFUlRZLCBvbGRPYmplY3RUeXBlLCBuZXdPYmplY3RUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZShTdHJpbmcgb2JqZWN0VHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZE9iamVjdFR5cGU7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlID0gb2JqZWN0VHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9PQkpFQ1RfVFlQRV9QUk9QRVJUWSwgb2xkLCBvYmplY3RUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gcmVzb3VyY2VDb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIHJlc291cmNlQ29udmVydGVyID09IG51bGwgPwotCQkJCW51bGwgOgotCQkJCQlyZXNvdXJjZUNvbnZlcnRlci5nZXRGdWxseVF1YWxpZmllZE9iamVjdFR5cGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBjb252ZXJzaW9uIHZhbHVlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBjb252ZXJzaW9uVmFsdWVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4odGhpcy5jb252ZXJzaW9uVmFsdWVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBjb252ZXJzaW9uVmFsdWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlcy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgYWRkQ29udmVyc2lvblZhbHVlKGludCBpbmRleCkgewotCQlKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlID0gbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSh0aGlzKTsKLQkJdGhpcy5jb252ZXJzaW9uVmFsdWVzLmFkZChpbmRleCwgY29udmVyc2lvblZhbHVlKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIHJlc291cmNlQ29udmVyc2lvblZhbHVlID0gZ2V0QW5ub3RhdGlvbigpLmFkZENvbnZlcnNpb25WYWx1ZShpbmRleCk7Ci0JCWNvbnZlcnNpb25WYWx1ZS5pbml0aWFsaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlKTsKLQkJZmlyZUl0ZW1BZGRlZChDT05WRVJTSU9OX1ZBTFVFU19MSVNULCBpbmRleCwgY29udmVyc2lvblZhbHVlKTsKLQkJcmV0dXJuIGNvbnZlcnNpb25WYWx1ZTsKLQl9Ci0JCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBhZGRDb252ZXJzaW9uVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmFkZENvbnZlcnNpb25WYWx1ZSh0aGlzLmNvbnZlcnNpb25WYWx1ZXMuc2l6ZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udmVyc2lvblZhbHVlKGludCBpbmRleCwgSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBjb252ZXJzaW9uVmFsdWUsIHRoaXMuY29udmVyc2lvblZhbHVlcywgQ09OVkVSU0lPTl9WQUxVRVNfTElTVCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnZlcnNpb25WYWx1ZShKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlKSB7Ci0JCXRoaXMuYWRkQ29udmVyc2lvblZhbHVlKHRoaXMuY29udmVyc2lvblZhbHVlcy5zaXplKCksIGNvbnZlcnNpb25WYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZShFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKLQkJdGhpcy5yZW1vdmVDb252ZXJzaW9uVmFsdWUodGhpcy5jb252ZXJzaW9uVmFsdWVzLmluZGV4T2YoY29udmVyc2lvblZhbHVlKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpIHsKLQkJSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIHJlbW92ZWRDb252ZXJzaW9uVmFsdWUgPSB0aGlzLmNvbnZlcnNpb25WYWx1ZXMucmVtb3ZlKGluZGV4KTsKLQkJZ2V0QW5ub3RhdGlvbigpLnJlbW92ZUNvbnZlcnNpb25WYWx1ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChDT05WRVJTSU9OX1ZBTFVFU19MSVNULCBpbmRleCwgcmVtb3ZlZENvbnZlcnNpb25WYWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZV8oSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoY29udmVyc2lvblZhbHVlLCB0aGlzLmNvbnZlcnNpb25WYWx1ZXMsIENPTlZFUlNJT05fVkFMVUVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlQ29udmVyc2lvblZhbHVlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuY29udmVyc2lvblZhbHVlcywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZ2V0QW5ub3RhdGlvbigpLm1vdmVDb252ZXJzaW9uVmFsdWUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChDT05WRVJTSU9OX1ZBTFVFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBkYXRhVmFsdWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgU3RyaW5nPihjb252ZXJzaW9uVmFsdWVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5nZXREYXRhVmFsdWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBkZWZhdWx0IG9iamVjdCB2YWx1ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcgbmV3RGVmYXVsdE9iamVjdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0T2JqZWN0VmFsdWUgPSB0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZTsKLQkJdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWUgPSBuZXdEZWZhdWx0T2JqZWN0VmFsdWU7Ci0JCWdldEFubm90YXRpb24oKS5zZXREZWZhdWx0T2JqZWN0VmFsdWUobmV3RGVmYXVsdE9iamVjdFZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkRGVmYXVsdE9iamVjdFZhbHVlLCBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0T2JqZWN0VmFsdWVfKFN0cmluZyBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRPYmplY3RWYWx1ZSA9IHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlOwotCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IG5ld0RlZmF1bHRPYmplY3RWYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkRGVmYXVsdE9iamVjdFZhbHVlLCBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShqcnBtKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnRlciA9IGdldEFubm90YXRpb24oKTsKLQkJdGhpcy5kYXRhVHlwZSA9IHRoaXMuZGF0YVR5cGUocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWREYXRhVHlwZShyZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXRoaXMub2JqZWN0VHlwZSA9IHRoaXMub2JqZWN0VHlwZShyZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlID0gdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZShyZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlID0gdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWUocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJzaW9uVmFsdWVzKHJlc291cmNlQ29udmVydGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnNpb25WYWx1ZXMoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnRlcikgewotCQlpZiAocmVzb3VyY2VDb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IHJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IHJlc291cmNlQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJCi0JCXdoaWxlKHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMuY29udmVyc2lvblZhbHVlcy5hZGQoYnVpbGRDb252ZXJzaW9uVmFsdWUocmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBidWlsZENvbnZlcnNpb25WYWx1ZShFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUpIHsKLQkJSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUodGhpcyk7Ci0JCWNvbnZlcnNpb25WYWx1ZS5pbml0aWFsaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlKTsKLQkJcmV0dXJuIGNvbnZlcnNpb25WYWx1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIganJwbSkgewotCQlzdXBlci51cGRhdGUoanJwbSk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gcmVzb3VyY2VDb252ZXJ0ZXIgPSBnZXRBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuc2V0RGF0YVR5cGVfKHRoaXMuZGF0YVR5cGUocmVzb3VyY2VDb252ZXJ0ZXIpKTsKLQkJdGhpcy5zZXRGdWxseVF1YWxpZmllZERhdGFUeXBlKHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZERhdGFUeXBlKHJlc291cmNlQ29udmVydGVyKSk7Ci0JCXRoaXMuc2V0T2JqZWN0VHlwZV8odGhpcy5vYmplY3RUeXBlKHJlc291cmNlQ29udmVydGVyKSk7Ci0JCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZE9iamVjdFR5cGUocmVzb3VyY2VDb252ZXJ0ZXIpKTsKLQkJdGhpcy5zZXREZWZhdWx0T2JqZWN0VmFsdWVfKHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlKHJlc291cmNlQ29udmVydGVyKSk7Ci0JCXRoaXMudXBkYXRlQ29udmVyc2lvblZhbHVlcyhyZXNvdXJjZUNvbnZlcnRlcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnZlcnNpb25WYWx1ZXMoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnRlcikgewotCQlMaXN0SXRlcmF0b3I8SmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBjb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gcmVzb3VyY2VDb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOwotCQl3aGlsZSAoY29udGV4dENvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlcyA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKSB7Ci0JCQkJY29udmVyc2lvblZhbHVlcy51cGRhdGUocmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVDb252ZXJzaW9uVmFsdWVfKGNvbnZlcnNpb25WYWx1ZXMpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSkgewotCQkJYWRkQ29udmVyc2lvblZhbHVlKGJ1aWxkQ29udmVyc2lvblZhbHVlKHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFUeXBlKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gcmVzb3VyY2VDb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIHJlc291cmNlQ29udmVydGVyID09IG51bGwgPyBudWxsIDogcmVzb3VyY2VDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBvYmplY3RUeXBlKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gcmVzb3VyY2VDb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIHJlc291cmNlQ29udmVydGVyID09IG51bGwgPyBudWxsIDogcmVzb3VyY2VDb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZShFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIHJlc291cmNlQ29udmVydGVyKSB7Ci0JCXJldHVybiByZXNvdXJjZUNvbnZlcnRlciA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlQ29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJZm9yIChJdGVyYXRvcjxKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IHN0cmVhbSA9IGNvbnZlcnNpb25WYWx1ZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOWRiNzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PbmVUb01hbnkyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YU9uZVRvTWFueU1hcHBpbmc8T25lVG9NYW55Ml8wQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMAotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2ggam9pbkZldGNoOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgcHJpdmF0ZU93bmVkOwotCQotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmpvaW5GZXRjaCA9IG5ldyBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2godGhpcyk7Ci0JCXRoaXMucHJpdmF0ZU93bmVkID0gbmV3IEphdmFFY2xpcHNlTGlua1ByaXZhdGVPd25lZCh0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFSZWxhdGlvbnNoaXBSZWZlcmVuY2UgYnVpbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlKHRoaXMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzVG8oVmVjdG9yPFN0cmluZz4gbmFtZXMpIHsKLQkJc3VwZXIuYWRkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lc1RvKG5hbWVzKTsKLQkJbmFtZXMuYWRkKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCQluYW1lcy5hZGQoRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgc3VwZXIuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogcHJpdmF0ZSBvd25lZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgZ2V0UHJpdmF0ZU93bmVkKCkgewotCQlyZXR1cm4gdGhpcy5wcml2YXRlT3duZWQ7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJpdmF0ZU93bmVkQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uIGdldFJlc291cmNlUHJpdmF0ZU93bmVkKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKGdldFByaXZhdGVPd25lZEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZVByaXZhdGVPd25lZCgpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKGdldFByaXZhdGVPd25lZEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZVByaXZhdGVPd25lZCgpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKGdldFByaXZhdGVPd25lZEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGpvaW4gZmV0Y2ggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoIGdldEpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkZldGNoOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIC0+IGNvbnRleHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLmpvaW5GZXRjaC5pbml0aWFsaXplKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQl0aGlzLnByaXZhdGVPd25lZC5pbml0aWFsaXplKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5GZXRjaC51cGRhdGUodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCXRoaXMucHJpdmF0ZU93bmVkLnVwZGF0ZSh0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuam9pbkZldGNoLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMucHJpdmF0ZU93bmVkLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjdjNzRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLmdldEtleSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKS5idWlsZE1hcHBpbmcocGFyZW50LCBmYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdGVzdERlZmF1bHQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlTdHJpbmcgdGFyZ2V0RW50aXR5ID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNdWx0aVJlZmVyZW5jZVRhcmdldFR5cGVOYW1lKCk7Ci0JCXJldHVybiAodGFyZ2V0RW50aXR5ICE9IG51bGwpIAotCQkJCSYmIChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVudGl0eSh0YXJnZXRFbnRpdHkpICE9IG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjYzYThmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFUYXJnZXRGb3JpZWduS2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UKLQlleHRlbmRzIEFic3RyYWN0SmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZQotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAKLXsKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlKAotCQkJSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVRhcmdldEZvcmllZ25LZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KHRoaXMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgewotCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldFBhcmVudCgpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSm9pbmluZ1N0cmF0ZWd5IGNhbGN1bGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgewotCQlpZiAodGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5OwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpKSB7Ci0JCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogbWFwcGVkIGJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBtYXlCZU1hcHBlZEJ5KEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGVkQnlNYXBwaW5nKSB7Ci0JCXJldHVybiBzdXBlci5tYXlCZU1hcHBlZEJ5KG1hcHBlZEJ5TWFwcGluZykgfHwKLQkJCW1hcHBlZEJ5TWFwcGluZy5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZlYWY3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZwotewotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wIGJ1aWxkUmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3MzZkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLmdldEtleSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLmJ1aWxkTWFwcGluZyhwYXJlbnQsIGZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB0ZXN0RGVmYXVsdChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCVN0cmluZyB0YXJnZXRFbnRpdHkgPSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNpbmdsZVJlZmVyZW5jZVRhcmdldFR5cGVOYW1lKCk7Ci0JCXJldHVybiAodGFyZ2V0RW50aXR5ICE9IG51bGwpCi0JCQkJJiYgKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RW50aXR5KHRhcmdldEVudGl0eSkgIT0gbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyMDZhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0LkVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvcjsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBKYXZhIHBlcnNpc3RlbnQgYXR0cmlidXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFQZXJzaXN0ZW50QXR0cmlidXRlCi0JaW1wbGVtZW50cyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMAotewotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlKFBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7Ci0JCXN1cGVyKHBhcmVudCwganJwYSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFjY2Vzc0hvbGRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRTcGVjaWZpZWRBY2Nlc3MoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlIHNwZWNpZmllZEFjY2VzcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiBqYXZhLnV0aWwuRGF0ZSBvciBqYXZhLnV0aWwuQ2FsZW5kYXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzRGF0ZU9yQ2FsZW5kYXIoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS50eXBlSXNTdWJUeXBlT2YoREFURV9UWVBFX05BTUUpCi0JCQkJfHwgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUudHlwZUlzU3ViVHlwZU9mKENBTEVOREFSX1RZUEVfTkFNRSk7Ci0JfQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfVFlQRV9OQU1FID0gamF2YS51dGlsLkRhdGUuY2xhc3MuZ2V0TmFtZSgpOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBTEVOREFSX1RZUEVfTkFNRSA9IGphdmEudXRpbC5DYWxlbmRhci5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNTZXJpYWxpemFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS50eXBlSXNWYXJpYWJsZVByaW1pdGl2ZSgpCi0JCQkJfHwgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUudHlwZUlzU3ViVHlwZU9mKFNFUklBTElaQUJMRV9UWVBFX05BTUUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHR5cGVJc1ZhbGlkRm9yVmFyaWFibGVPbmVUb09uZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLnR5cGVJc0ludGVyZmFjZSgpCi0JCQkJJiYgdGhpcy5pbnRlcmZhY2VJc1ZhbGlkRm9yVmFyaWFibGVPbmVUb09uZShnZXRUeXBlTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcmZhY2VJc1ZhbGlkRm9yVmFyaWFibGVPbmVUb09uZShTdHJpbmcgaW50ZXJmYWNlTmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmludGVyZmFjZUlzSW52YWxpZEZvclZhcmlhYmxlT25lVG9PbmUoaW50ZXJmYWNlTmFtZSk7Ci0JfQotCi0JLy8gVE9ETyB3ZSBjb3VsZCBwcm9iYWJseSBhZGQgbW9yZSBpbnRlcmZhY2VzIHRvIHRoaXMgbGlzdC4uLgotCXByb3RlY3RlZCBib29sZWFuIGludGVyZmFjZUlzSW52YWxpZEZvclZhcmlhYmxlT25lVG9PbmUoU3RyaW5nIGludGVyZmFjZU5hbWUpIHsKLQkJcmV0dXJuIChpbnRlcmZhY2VOYW1lID09IG51bGwpIHx8Ci0JCQkJdGhpcy50eXBlSXNDb250YWluZXIoaW50ZXJmYWNlTmFtZSkgfHwKLQkJCQlpbnRlcmZhY2VOYW1lLmVxdWFscygib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuaW5kaXJlY3Rpb24uVmFsdWVIb2xkZXJJbnRlcmZhY2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRBdHRpYnV0ZVZhbGlkYXRvcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvcih0aGlzLCB0aGlzLCBidWlsZFRleHRSYW5nZVJlc29sdmVyKGFzdFJvb3QpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1ByaXZhdGVPd25lZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtQcml2YXRlT3duZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc4OTEwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1ByaXZhdGVPd25lZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtQcml2YXRlT3duZWQKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZAotewotCXByb3RlY3RlZCBib29sZWFuIHByaXZhdGVPd25lZDsKLQkKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JCi0JcHVibGljIEphdmFFY2xpcHNlTGlua1ByaXZhdGVPd25lZChKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcml2YXRlT3duZWRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24gZ2V0UmVzb3VyY2VQcml2YXRlT3duZWQoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uKSB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKGdldFByaXZhdGVPd25lZEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZVByaXZhdGVPd25lZCgpIHsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihnZXRQcml2YXRlT3duZWRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVzb3VyY2VQcml2YXRlT3duZWQoKSB7Ci0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oZ2V0UHJpdmF0ZU93bmVkQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcml2YXRlT3duZWQoKSB7Ci0JCXJldHVybiB0aGlzLnByaXZhdGVPd25lZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4gbmV3UHJpdmF0ZU93bmVkKSB7Ci0JCWlmICh0aGlzLnByaXZhdGVPd25lZCA9PSBuZXdQcml2YXRlT3duZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlib29sZWFuIG9sZFByaXZhdGVPd25lZCA9IHRoaXMucHJpdmF0ZU93bmVkOwotCQl0aGlzLnByaXZhdGVPd25lZCA9IG5ld1ByaXZhdGVPd25lZDsKLQotCQlpZiAobmV3UHJpdmF0ZU93bmVkKSB7Ci0JCQlhZGRSZXNvdXJjZVByaXZhdGVPd25lZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJLy9oYXZlIHRvIGNoZWNrIGlmIGFubm90YXRpb24gZXhpc3RzIGluIGNhc2UgdGhlIGNoYW5nZSBpcyBmcm9tIGZhbHNlIHRvIG51bGwgb3IgdmljZSB2ZXJzYQotCQkJaWYgKGdldFJlc291cmNlUHJpdmF0ZU93bmVkKCkgIT0gbnVsbCkgewotCQkJCXJlbW92ZVJlc291cmNlUHJpdmF0ZU93bmVkKCk7Ci0JCQl9Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQUklWQVRFX09XTkVEX1BST1BFUlRZLCBvbGRQcml2YXRlT3duZWQsIG5ld1ByaXZhdGVPd25lZCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFByaXZhdGVPd25lZF8oYm9vbGVhbiBuZXdQcml2YXRlT3duZWQpIHsKLQkJYm9vbGVhbiBvbGRQcml2YXRlT3duZWQgPSB0aGlzLnByaXZhdGVPd25lZDsKLQkJdGhpcy5wcml2YXRlT3duZWQgPSBuZXdQcml2YXRlT3duZWQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJJVkFURV9PV05FRF9QUk9QRVJUWSwgb2xkUHJpdmF0ZU93bmVkLCBuZXdQcml2YXRlT3duZWQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGpycGE7Ci0JCXRoaXMucHJpdmF0ZU93bmVkID0gcHJpdmF0ZU93bmVkKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqcnBhOwotCQl0aGlzLnNldFByaXZhdGVPd25lZF8ocHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcHJpdmF0ZU93bmVkKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VQcml2YXRlT3duZWQoKSAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uIHJlc291cmNlUHJpdmF0ZU93bmVkID0gdGhpcy5nZXRSZXNvdXJjZVByaXZhdGVPd25lZCgpOwotCQlyZXR1cm4gcmVzb3VyY2VQcml2YXRlT3duZWQgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZVByaXZhdGVPd25lZC5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1JlYWRPbmx5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1JlYWRPbmx5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNjhhOWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtSZWFkT25seS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rUmVhZE9ubHkgZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUmVhZE9ubHkKLXsKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRSZWFkT25seTsKLQkKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLQkKLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rUmVhZE9ubHkoSmF2YVR5cGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlYWRPbmx5QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbiBnZXRSZXNvdXJjZVJlYWRPbmx5KCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uKSB0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0QW5ub3RhdGlvbihnZXRSZWFkT25seUFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZVJlYWRPbmx5KCkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbihnZXRSZWFkT25seUFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZVJlYWRPbmx5KCkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUucmVtb3ZlQW5ub3RhdGlvbihnZXRSZWFkT25seUFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRSZWFkT25seSgpICE9IG51bGwpID8gdGhpcy5nZXRTcGVjaWZpZWRSZWFkT25seSgpLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5pc0RlZmF1bHRSZWFkT25seSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRSZWFkT25seSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rUmVhZE9ubHkuREVGQVVMVF9SRUFEX09OTFk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFJlYWRPbmx5KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRSZWFkT25seTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbiBuZXdSZWFkT25seSkgewotCQlpZiAodGhpcy5zcGVjaWZpZWRSZWFkT25seSA9PSBuZXdSZWFkT25seSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUJvb2xlYW4gb2xkUmVhZE9ubHkgPSB0aGlzLnNwZWNpZmllZFJlYWRPbmx5OwotCQl0aGlzLnNwZWNpZmllZFJlYWRPbmx5ID0gbmV3UmVhZE9ubHk7Ci0KLQkJaWYgKG5ld1JlYWRPbmx5ICE9IG51bGwgJiYgbmV3UmVhZE9ubHkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCWFkZFJlc291cmNlUmVhZE9ubHkoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vaGF2ZSB0byBjaGVjayBpZiBhbm5vdGF0aW9uIGV4aXN0cyBpbiBjYXNlIHRoZSBjaGFuZ2UgaXMgZnJvbSBmYWxzZSB0byBudWxsIG9yIHZpY2UgdmVyc2EKLQkJCWlmIChnZXRSZXNvdXJjZVJlYWRPbmx5KCkgIT0gbnVsbCkgewotCQkJCXJlbW92ZVJlc291cmNlUmVhZE9ubHkoKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRUFEX09OTFlfUFJPUEVSVFksIG9sZFJlYWRPbmx5LCBuZXdSZWFkT25seSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFJlYWRPbmx5XyhCb29sZWFuIG5ld1JlYWRPbmx5KSB7Ci0JCUJvb2xlYW4gb2xkUmVhZE9ubHkgPSB0aGlzLnNwZWNpZmllZFJlYWRPbmx5OwotCQl0aGlzLnNwZWNpZmllZFJlYWRPbmx5ID0gbmV3UmVhZE9ubHk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFQURfT05MWV9QUk9QRVJUWSwgb2xkUmVhZE9ubHksIG5ld1JlYWRPbmx5KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7Ci0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGpycHQ7Ci0JCXRoaXMuc3BlY2lmaWVkUmVhZE9ubHkgPSByZWFkT25seSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBqcnB0OwotCQl0aGlzLnNldFNwZWNpZmllZFJlYWRPbmx5XyhyZWFkT25seSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBCb29sZWFuIHJlYWRPbmx5KCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZWFkT25seSgpID09IG51bGwgPyBudWxsIDogQm9vbGVhbi5UUlVFOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24gcmVzb3VyY2VSZWFkT25seSA9IHRoaXMuZ2V0UmVzb3VyY2VSZWFkT25seSgpOwotCQlyZXR1cm4gcmVzb3VyY2VSZWFkT25seSA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlUmVhZE9ubHkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2E3OGYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBleHRlbmRzIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIKLXsJCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydGVyQ2xhc3M7Ci0JCi0JCi0JcHVibGljIEphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVI7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSBzdXBlci5nZXRBbm5vdGF0aW9uKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogY29udmVydGVyIGNsYXNzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDbGFzczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyQ2xhc3MoU3RyaW5nIG5ld0NvbnZlcnRlckNsYXNzKSB7Ci0JCVN0cmluZyBvbGRDb252ZXJ0ZXJDbGFzcyA9IHRoaXMuY29udmVydGVyQ2xhc3M7Ci0JCXRoaXMuY29udmVydGVyQ2xhc3MgPSBuZXdDb252ZXJ0ZXJDbGFzczsKLQkJZ2V0QW5ub3RhdGlvbigpLnNldENvbnZlcnRlcihuZXdDb252ZXJ0ZXJDbGFzcyk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXJDbGFzcywgbmV3Q29udmVydGVyQ2xhc3MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzc18oU3RyaW5nIG5ld0NvbnZlcnRlckNsYXNzKSB7Ci0JCVN0cmluZyBvbGRDb252ZXJ0ZXJDbGFzcyA9IHRoaXMuY29udmVydGVyQ2xhc3M7Ci0JCXRoaXMuY29udmVydGVyQ2xhc3MgPSBuZXdDb252ZXJ0ZXJDbGFzczsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfQ0xBU1NfUFJPUEVSVFksIG9sZENvbnZlcnRlckNsYXNzLCBuZXdDb252ZXJ0ZXJDbGFzcyk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UgaW50ZXJhY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIganJwbSkgewotCQlzdXBlci5pbml0aWFsaXplKGpycG0pOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gdGhpcy5jb252ZXJ0ZXJDbGFzcyhnZXRBbm5vdGF0aW9uKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBqcnBtKSB7Ci0JCXN1cGVyLnVwZGF0ZShqcnBtKTsKLQkJdGhpcy5zZXRDb252ZXJ0ZXJDbGFzc18odGhpcy5jb252ZXJ0ZXJDbGFzcyhnZXRBbm5vdGF0aW9uKCkpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0ZXJDbGFzcyhFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gcmVzb3VyY2VDb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIHJlc291cmNlQ29udmVydGVyID09IG51bGwgPyBudWxsIDogcmVzb3VyY2VDb252ZXJ0ZXIuZ2V0Q29udmVydGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNTRmYjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nIAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbj4gCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZwotewotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4N2YxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuICgoRWNsaXBzZUxpbmtKcGFGYWN0b3J5KSBmYWN0b3J5KS5idWlsZEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNzJmNzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgZXh0ZW5kcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcgotewkKLQlwcml2YXRlIFN0cmluZyBkYXRhVHlwZTsKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZERhdGFUeXBlOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfREFUQV9UWVBFX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBTdHJpbmcgb2JqZWN0VHlwZTsKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZE9iamVjdFR5cGU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9PQkpFQ1RfVFlQRV9QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZE9iamVjdFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHVibGljIEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIHN1cGVyLmdldEFubm90YXRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBkYXRhIHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShTdHJpbmcgbmV3RGF0YVR5cGUpIHsKLQkJU3RyaW5nIG9sZERhdGFUeXBlID0gdGhpcy5kYXRhVHlwZTsKLQkJdGhpcy5kYXRhVHlwZSA9IG5ld0RhdGFUeXBlOwotCQlnZXRBbm5vdGF0aW9uKCkuc2V0RGF0YVR5cGUobmV3RGF0YVR5cGUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVFlQRV9QUk9QRVJUWSwgb2xkRGF0YVR5cGUsIG5ld0RhdGFUeXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGF0YVR5cGVfKFN0cmluZyBuZXdEYXRhVHlwZSkgewotCQlTdHJpbmcgb2xkRGF0YVR5cGUgPSB0aGlzLmRhdGFUeXBlOwotCQl0aGlzLmRhdGFUeXBlID0gbmV3RGF0YVR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREFUQV9UWVBFX1BST1BFUlRZLCBvbGREYXRhVHlwZSwgbmV3RGF0YVR5cGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWREYXRhVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGdWxseVF1YWxpZmllZERhdGFUeXBlKFN0cmluZyBkYXRhVHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZERhdGFUeXBlOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUgPSBkYXRhVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9EQVRBX1RZUEVfUFJPUEVSVFksIG9sZCwgZGF0YVR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZERhdGFUeXBlKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gcmVzb3VyY2VDb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIHJlc291cmNlQ29udmVydGVyID09IG51bGwgPwotCQkJCW51bGwgOgotCQkJCQlyZXNvdXJjZUNvbnZlcnRlci5nZXRGdWxseVF1YWxpZmllZERhdGFUeXBlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogb2JqZWN0IHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGUoU3RyaW5nIG5ld09iamVjdFR5cGUpIHsKLQkJU3RyaW5nIG9sZE9iamVjdFR5cGUgPSB0aGlzLm9iamVjdFR5cGU7Ci0JCXRoaXMub2JqZWN0VHlwZSA9IG5ld09iamVjdFR5cGU7Ci0JCWdldEFubm90YXRpb24oKS5zZXRPYmplY3RUeXBlKG5ld09iamVjdFR5cGUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9UWVBFX1BST1BFUlRZLCBvbGRPYmplY3RUeXBlLCBuZXdPYmplY3RUeXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0T2JqZWN0VHlwZV8oU3RyaW5nIG5ld09iamVjdFR5cGUpIHsKLQkJU3RyaW5nIG9sZE9iamVjdFR5cGUgPSB0aGlzLm9iamVjdFR5cGU7Ci0JCXRoaXMub2JqZWN0VHlwZSA9IG5ld09iamVjdFR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfUFJPUEVSVFksIG9sZE9iamVjdFR5cGUsIG5ld09iamVjdFR5cGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZE9iamVjdFR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKFN0cmluZyBvYmplY3RUeXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZE9iamVjdFR5cGUgPSBvYmplY3RUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX09CSkVDVF9UWVBFX1BST1BFUlRZLCBvbGQsIG9iamVjdFR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZE9iamVjdFR5cGUoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnRlcikgewotCQlyZXR1cm4gcmVzb3VyY2VDb252ZXJ0ZXIgPT0gbnVsbCA/Ci0JCQkJbnVsbCA6Ci0JCQkJCXJlc291cmNlQ29udmVydGVyLmdldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShqcnBtKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnRlciA9IGdldEFubm90YXRpb24oKTsKLQkJdGhpcy5kYXRhVHlwZSA9IHRoaXMuZGF0YVR5cGUocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWREYXRhVHlwZShyZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXRoaXMub2JqZWN0VHlwZSA9IHRoaXMub2JqZWN0VHlwZShyZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlID0gdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZShyZXNvdXJjZUNvbnZlcnRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pIHsKLQkJc3VwZXIudXBkYXRlKGpycG0pOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIHJlc291cmNlQ29udmVydGVyID0gZ2V0QW5ub3RhdGlvbigpOwotCQl0aGlzLnNldERhdGFUeXBlXyh0aGlzLmRhdGFUeXBlKHJlc291cmNlQ29udmVydGVyKSk7Ci0JCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSh0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWREYXRhVHlwZShyZXNvdXJjZUNvbnZlcnRlcikpOwotCQl0aGlzLnNldE9iamVjdFR5cGVfKHRoaXMub2JqZWN0VHlwZShyZXNvdXJjZUNvbnZlcnRlcikpOwotCQl0aGlzLnNldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSh0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKHJlc291cmNlQ29udmVydGVyKSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZGF0YVR5cGUoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnRlcikgewotCQlyZXR1cm4gcmVzb3VyY2VDb252ZXJ0ZXIgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG9iamVjdFR5cGUoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnRlcikgewotCQlyZXR1cm4gcmVzb3VyY2VDb252ZXJ0ZXIgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjcwYzZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nIAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZwotewotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlZBUklBQkxFX09ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMGU2MDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVkFSSUFCTEVfT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gKChFY2xpcHNlTGlua0pwYUZhY3RvcnkpIGZhY3RvcnkpLmJ1aWxkSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdGVzdERlZmF1bHQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gKChKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlKSBwZXJzaXN0ZW50QXR0cmlidXRlKS50eXBlSXNWYWxpZEZvclZhcmlhYmxlT25lVG9PbmUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE5ODY5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YVZlcnNpb25NYXBwaW5nCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZTsKLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubXV0YWJsZSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtNdXRhYmxlKHRoaXMpOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXNUbyhWZWN0b3I8U3RyaW5nPiBuYW1lcykgewotCQlzdXBlci5hZGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzVG8obmFtZXMpOwotCQluYW1lcy5hZGQoRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JCW5hbWVzLmFkZChFY2xpcHNlTGluay5DT05WRVJUKTsKLQl9Ci0KLQkKLQkvLyoqKioqKioqKioqKioqIEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgb3ZlcnJpZGVzICoqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlclR5cGUpIHsKLQkJSmF2YUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gc3VwZXIuYnVpbGRDb252ZXJ0ZXIoY29udmVydGVyVHlwZSk7Ci0JCWlmIChqYXZhQ29udmVydGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBqYXZhQ29udmVydGVyOwotCQl9Ci0JCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGNvbnZlcnRlclR5cGUsIEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSkgewotCQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0KHRoaXMsIHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKSB7Ci0JCS8vY2hlY2sgQENvbnZlcnQgZmlyc3QsIHRoaXMgaXMgdGhlIG9yZGVyIHRoYXQgRWNsaXBzZUxpbmsgc2VhcmNoZXMKLQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkgIT0gbnVsbCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKiogRWNsaXBzZWxpbmtWZXJzaW9uTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rTXV0YWJsZSBnZXRNdXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5tdXRhYmxlOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKioqKiBpbml0aWFsaXphdGlvbi91cGRhdGUgKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLm11dGFibGUuaW5pdGlhbGl6ZSh0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5tdXRhYmxlLnVwZGF0ZSh0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5tdXRhYmxlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0RWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FhOTVkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uTnVsbE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FbnRpdHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxEZWZpbml0aW9uCi17Ci0KLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0RWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiBPUk0gdHlwZSBtYXBwaW5ncyAqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGRPcm1UeXBlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBzaG91bGQgbm90IG1hdHRlciBoZXJlLCBidXQgd2UnbGwgdXNlIHRoZSBzYW1lIG9yZGVyIGFzIGZvciBqYXZhCi0JCS8vIEBzZWUge0BsaW5rIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlcn0KLQkJcmV0dXJuIG5ldyBPcm1UeXBlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCQlPcm1FbnRpdHlEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlPcm1FbWJlZGRhYmxlRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uaW5zdGFuY2UoKX07Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogT1JNIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGRPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCS8vIG9yZGVyIHNob3VsZCBub3QgbWF0dGVyIGhlcmUsIGJ1dCB3ZSdsbCB1c2UgdGhlIHNhbWUgb3JkZXIgYXMgZm9yIGphdmEKLQkJLy8gQHNlZSB7QGxpbmsgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVByb3ZpZGVyfQotCQlyZXR1cm4gbmV3IE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQkJT3JtVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCU9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJT3JtSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJT3JtVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlPcm1CYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlPcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlPcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCU9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJT3JtTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlPcm1NYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJT3JtT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCU9ybU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCU9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlOdWxsT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM4YmU2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxYbWxCYXNpY0NvbGxlY3Rpb24+IAotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nCi17Ci0JcHJvdGVjdGVkIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxCYXNpY0NvbGxlY3Rpb24gcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZyh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7Ci0JCSgoQXR0cmlidXRlcykgcmVzb3VyY2VBdHRyaWJ1dGVzKS5nZXRCYXNpY0NvbGxlY3Rpb25zKCkuYWRkKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7Ci0JCSgoQXR0cmlidXRlcykgcmVzb3VyY2VBdHRyaWJ1dGVzKS5nZXRCYXNpY0NvbGxlY3Rpb25zKCkucmVtb3ZlKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gMjM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1ldGFtb2RlbCAqKioqKioqKioqICAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1ldGFtb2RlbEZpZWxkVHlwZU5hbWUoKSB7Ci0JCXJldHVybiAoKFBlcnNpc3RlbnRBdHRyaWJ1dGUyXzApIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkuZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKSB7Ci0JCVN0cmluZyB0YXJnZXRUeXBlTmFtZSA9IG51bGw7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJaWYgKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlICE9IG51bGwpIHsKLQkJCXRhcmdldFR5cGVOYW1lID0gamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TXVsdGlSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZSgpOwotCQl9Ci0JCXJldHVybiAodGFyZ2V0VHlwZU5hbWUgIT0gbnVsbCkgPyB0YXJnZXRUeXBlTmFtZSA6IE1ldGFtb2RlbEZpZWxkLkRFRkFVTFRfVFlQRV9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmI5NTlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxYbWxCYXNpY01hcD4gCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZwotewotCXByb3RlY3RlZCBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxCYXNpY01hcCByZXNvdXJjZU1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1BdHRyaWJ1dGVNYXBwaW5nKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkVG9SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgewotCQkoKEF0dHJpYnV0ZXMpIHJlc291cmNlQXR0cmlidXRlcykuZ2V0QmFzaWNNYXBzKCkuYWRkKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7Ci0JCSgoQXR0cmlidXRlcykgcmVzb3VyY2VBdHRyaWJ1dGVzKS5nZXRCYXNpY01hcHMoKS5yZW1vdmUodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQotCQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiAyNzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKiogIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWV0YW1vZGVsRmllbGRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuICgoUGVyc2lzdGVudEF0dHJpYnV0ZTJfMCkgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpKS5nZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxUeXBlTmFtZSgpIHsKLQkJU3RyaW5nIHRhcmdldFR5cGVOYW1lID0gbnVsbDsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlpZiAoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJdGFyZ2V0VHlwZU5hbWUgPSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNdWx0aVJlZmVyZW5jZVRhcmdldFR5cGVOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuICh0YXJnZXRUeXBlTmFtZSAhPSBudWxsKSA/IHRhcmdldFR5cGVOYW1lIDogTWV0YW1vZGVsRmllbGQuREVGQVVMVF9UWVBFX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWV0YW1vZGVsRmllbGRUeXBlQXJndW1lbnROYW1lc1RvKEFycmF5TGlzdDxTdHJpbmc+IHR5cGVBcmd1bWVudE5hbWVzKSB7Ci0JCXRoaXMuYWRkTWV0YW1vZGVsRmllbGRNYXBLZXlUeXBlQXJndW1lbnROYW1lVG8odHlwZUFyZ3VtZW50TmFtZXMpOwotCQlzdXBlci5hZGRNZXRhbW9kZWxGaWVsZFR5cGVBcmd1bWVudE5hbWVzVG8odHlwZUFyZ3VtZW50TmFtZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZUFyZ3VtZW50TmFtZVRvKEFycmF5TGlzdDxTdHJpbmc+IHR5cGVBcmd1bWVudE5hbWVzKSB7Ci0JCVN0cmluZyBtYXBLZXlUeXBlTmFtZSA9IG51bGw7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJaWYgKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlICE9IG51bGwpIHsKLQkJCW1hcEtleVR5cGVOYW1lID0gamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TXVsdGlSZWZlcmVuY2VNYXBLZXlUeXBlTmFtZSgpOwotCQl9Ci0JCW1hcEtleVR5cGVOYW1lID0gbWFwS2V5VHlwZU5hbWUgIT0gbnVsbCA/IG1hcEtleVR5cGVOYW1lIDogTWV0YW1vZGVsRmllbGQuREVGQVVMVF9UWVBFX05BTUU7Ci0JCXR5cGVBcmd1bWVudE5hbWVzLmFkZChtYXBLZXlUeXBlTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzNGEwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtTWFueVRvT25lTWFwcGluZzxYbWxNYW55VG9PbmU+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2ggam9pbkZldGNoOwotCQotCQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JCXRoaXMuam9pbkZldGNoID0gbmV3IE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoKHRoaXMsIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0JCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoIGdldEpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkZldGNoOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlLWNvbnRleHQgaW50ZXJhY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5qb2luRmV0Y2gudXBkYXRlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJLy8gVE9ETyAtIHByaXZhdGUgb3duZWQsIGpvaW4gZmV0Y2ggdmFsaWRhdGlvbgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5NmY5My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1PbmVUb09uZU1hcHBpbmc8WG1sT25lVG9PbmU+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZwotewotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duZWQ7Ci0JCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoIGpvaW5GZXRjaDsKLQkKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sT25lVG9PbmUgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQkJdGhpcy5wcml2YXRlT3duZWQgPSBuZXcgT3JtRWNsaXBzZUxpbmtQcml2YXRlT3duZWQodGhpcywgdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOwotCQl0aGlzLmpvaW5GZXRjaCA9IG5ldyBPcm1FY2xpcHNlTGlua0pvaW5GZXRjaCh0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCQotCQotCXB1YmxpYyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBnZXRQcml2YXRlT3duZWQoKSB7Ci0JCXJldHVybiB0aGlzLnByaXZhdGVPd25lZDsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoIGdldEpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkZldGNoOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlLWNvbnRleHQgaW50ZXJhY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5wcml2YXRlT3duZWQudXBkYXRlKCk7Ci0JCXRoaXMuam9pbkZldGNoLnVwZGF0ZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCS8vIFRPRE8gLSBwcml2YXRlIG93bmVkLCBqb2luIGZldGNoIHZhbGlkYXRpb24KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2Mzc3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NJbXBsCi0JZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzCi17Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgY29udmVydGVySG9sZGVyOwotCQotCXB1YmxpYyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzSW1wbChPcm1YbWwgcGFyZW50LCBYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZSkgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlKTsKLQkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIgPSBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIodGhpcywgKFhtbEVudGl0eU1hcHBpbmdzKSB0aGlzLnhtbEVudGl0eU1hcHBpbmdzKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIGdldENvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVySG9sZGVyOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckhvbGRlci51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZUNvbnZlcnRlclJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNvbnZlcnRlclJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckhvbGRlci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQlzdXBlci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQl0aGlzLmNyZWF0ZUNvbnZlcnRlck1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDb252ZXJ0ZXJNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckhvbGRlci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZUNvbnZlcnRlclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNvbnZlcnRlclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVySG9sZGVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCX0KLQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY29udmVydGVySG9sZGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgbGF0ZXN0RG9jdW1lbnRWZXJzaW9uKCkgewotCQlyZXR1cm4gZ2V0SnBhUGxhdGZvcm0oKS5nZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKAotCQkJCUpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSkuZ2V0VmVyc2lvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDA3MjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci17CQotCi0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluay1zcGVjaWZpYyBPUk0gQ29udGV4dCBNb2RlbCAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVudGl0eU1hcHBpbmdzIGJ1aWxkRW50aXR5TWFwcGluZ3MoT3JtWG1sIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzIHhtbEVudGl0eU1hcHBpbmdzKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0ltcGwocGFyZW50LCAoWG1sRW50aXR5TWFwcGluZ3MpIHhtbEVudGl0eU1hcHBpbmdzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5Pd25lciBvd25lciwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlKHBhcmVudCwgb3duZXIsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUVtYmVkZGFibGUgYnVpbGRPcm1FbWJlZGRhYmxlKE9ybVBlcnNpc3RlbnRUeXBlIHR5cGUsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwodHlwZSwgKFhtbEVtYmVkZGFibGUpIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUVudGl0eSBidWlsZE9ybUVudGl0eShPcm1QZXJzaXN0ZW50VHlwZSB0eXBlLCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5IHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rRW50aXR5SW1wbCh0eXBlLCAoWG1sRW50aXR5KSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtTWFwcGVkU3VwZXJjbGFzcyBidWlsZE9ybU1hcHBlZFN1cGVyY2xhc3MoT3JtUGVyc2lzdGVudFR5cGUgdHlwZSwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbCh0eXBlLCAoWG1sTWFwcGVkU3VwZXJjbGFzcykgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUJhc2ljTWFwcGluZyBidWlsZE9ybUJhc2ljTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKHBhcmVudCwgKFhtbEJhc2ljKSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtSWRNYXBwaW5nIGJ1aWxkT3JtSWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcocGFyZW50LCAoWG1sSWQpIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1NYW55VG9NYW55TWFwcGluZyBidWlsZE9ybU1hbnlUb01hbnlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nKHBhcmVudCwgKFhtbE1hbnlUb01hbnkpIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1NYW55VG9PbmVNYXBwaW5nIGJ1aWxkT3JtTWFueVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcocGFyZW50LCAoWG1sTWFueVRvT25lKSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtT25lVG9NYW55TWFwcGluZyBidWlsZE9ybU9uZVRvTWFueU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKHBhcmVudCwgKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybU9uZVRvT25lTWFwcGluZyBidWlsZE9ybU9uZVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKHBhcmVudCwgKFhtbE9uZVRvT25lKSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtVmVyc2lvbk1hcHBpbmcgYnVpbGRPcm1WZXJzaW9uTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24gcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZyhwYXJlbnQsIChYbWxWZXJzaW9uKSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcgYnVpbGRPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEJhc2ljQ29sbGVjdGlvbiByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyBidWlsZE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxCYXNpY01hcCByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyhwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyBidWlsZE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxUcmFuc2Zvcm1hdGlvbiByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyhwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nIGJ1aWxkT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sVmFyaWFibGVPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluay1zcGVjaWZpYyBPUk0gVmlydHVhbCBSZXNvdXJjZSBNb2RlbCAqKioqKioqKioqCi0JCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQmFzaWMgYnVpbGRWaXJ0dWFsWG1sQmFzaWMoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljKG9ybVR5cGVNYXBwaW5nLCBqYXZhQmFzaWNNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbElkIGJ1aWxkVmlydHVhbFhtbElkKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhSWRNYXBwaW5nIGphdmFJZE1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxJZChvcm1UeXBlTWFwcGluZywgamF2YUlkTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxFbWJlZGRlZElkIGJ1aWxkVmlydHVhbFhtbEVtYmVkZGVkSWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbWJlZGRlZElkTWFwcGluZyBqYXZhRW1iZWRkZWRJZE1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZElkKG9ybVR5cGVNYXBwaW5nLCBqYXZhRW1iZWRkZWRJZE1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sRW1iZWRkZWQgYnVpbGRWaXJ0dWFsWG1sRW1iZWRkZWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbWJlZGRlZE1hcHBpbmcgamF2YUVtYmVkZGVkTWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkKG9ybVR5cGVNYXBwaW5nLCBqYXZhRW1iZWRkZWRNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbE1hbnlUb01hbnkgYnVpbGRWaXJ0dWFsWG1sTWFueVRvTWFueShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55VG9NYW55TWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb01hbnkob3JtVHlwZU1hcHBpbmcsIGphdmFNYW55VG9NYW55TWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxNYW55VG9PbmUgYnVpbGRWaXJ0dWFsWG1sTWFueVRvT25lKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhTWFueVRvT25lTWFwcGluZyBqYXZhTWFueVRvT25lTWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZShvcm1UeXBlTWFwcGluZywgamF2YU1hbnlUb09uZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sT25lVG9NYW55IGJ1aWxkVmlydHVhbFhtbE9uZVRvTWFueShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkob3JtVHlwZU1hcHBpbmcsIChKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBqYXZhT25lVG9NYW55TWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxPbmVUb09uZSBidWlsZFZpcnR1YWxYbWxPbmVUb09uZShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YU9uZVRvT25lTWFwcGluZyBqYXZhT25lVG9PbmVNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUob3JtVHlwZU1hcHBpbmcsIChKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGphdmFPbmVUb09uZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sVmVyc2lvbiBidWlsZFZpcnR1YWxYbWxWZXJzaW9uKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhVmVyc2lvbk1hcHBpbmcgamF2YVZlcnNpb25NYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmVyc2lvbihvcm1UeXBlTWFwcGluZywgamF2YVZlcnNpb25NYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbFRyYW5zaWVudCBidWlsZFZpcnR1YWxYbWxUcmFuc2llbnQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFUcmFuc2llbnRNYXBwaW5nIGphdmFUcmFuc2llbnRNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNpZW50KG9ybVR5cGVNYXBwaW5nLCBqYXZhVHJhbnNpZW50TWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBYbWxCYXNpY0NvbGxlY3Rpb24gYnVpbGRWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb24oT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcgamF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb24ob3JtVHlwZU1hcHBpbmcsIGphdmFCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIFhtbEJhc2ljTWFwIGJ1aWxkVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNNYXAoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyBqYXZhQmFzaWNNYXBNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNNYXAob3JtVHlwZU1hcHBpbmcsIGphdmFCYXNpY01hcE1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgWG1sVHJhbnNmb3JtYXRpb24gYnVpbGRWaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2Zvcm1hdGlvbihPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nIGphdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2Zvcm1hdGlvbihvcm1UeXBlTWFwcGluZywgamF2YVRyYW5zZm9ybWF0aW9uTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBYbWxWYXJpYWJsZU9uZVRvT25lIGJ1aWxkVmlydHVhbEVjbGlwc2VMaW5rWG1sVmFyaWFibGVPbmVUb09uZShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcgamF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmFyaWFibGVPbmVUb09uZShvcm1UeXBlTWFwcGluZywgamF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE51bGxBdHRyaWJ1dGVNYXBwaW5nKG9ybVR5cGVNYXBwaW5nLCBqYXZhQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDA1YmVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybVhtbERlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybVhtbERlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBidWlsZENvbnRleHROb2RlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBKcGFSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8wX1JFU09VUkNFX1RZUEU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDY3MjcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nCi17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQmFzaWNDb2xsZWN0aW9uIHJlc291cmNlTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYmZmMWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCWZhY3RvcnksIAotCQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmFzaWNDb2xsZWN0aW9uKCksIAotCQkJCVhtbEJhc2ljQ29sbGVjdGlvbi5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkQ29udGV4dE1hcHBpbmcoCi0JCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgCi0JCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgCi0JCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gKChFY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeSkgZmFjdG9yeSkuCi0JCQkJYnVpbGRPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcocGFyZW50LCAoWG1sQmFzaWNDb2xsZWN0aW9uKSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFZpcnR1YWxSZXNvdXJjZU1hcHBpbmcoCi0JCQlPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgCi0JCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZywgCi0JCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gKChFY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeSkgZmFjdG9yeSkuCi0JCQkJYnVpbGRWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb24ob3JtVHlwZU1hcHBpbmcsIChKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFhMGE5Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcDsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nCi17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxCYXNpY01hcCByZXNvdXJjZU1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4OWEwOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5FbWZUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXA7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc2ZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCWZhY3RvcnksIAotCQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmFzaWNNYXAoKSwgCi0JCQkJWG1sQmFzaWNNYXAuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZENvbnRleHRNYXBwaW5nKAotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIAotCQkJWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIAotCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkpIGZhY3RvcnkpLgotCQkJCWJ1aWxkT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcocGFyZW50LCAoWG1sQmFzaWNNYXApIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFJlc291cmNlTWFwcGluZygKLQkJCU9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCAKLQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCAKLQkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKEVjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5KSBmYWN0b3J5KS4KLQkJCQlidWlsZFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljTWFwKG9ybVR5cGVNYXBwaW5nLCAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyZTk0Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdE9ybUJhc2ljTWFwcGluZzxYbWxCYXNpYz4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlOwotCQotCQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQmFzaWMgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQkJdGhpcy5tdXRhYmxlID0gbmV3IE9ybUVjbGlwc2VMaW5rTXV0YWJsZSh0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCQotCQotCXB1YmxpYyBFY2xpcHNlTGlua011dGFibGUgZ2V0TXV0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMubXV0YWJsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIGJ1aWxkQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7Ci0JCU9ybUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBzdXBlci5idWlsZENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlKTsKLQkJaWYgKG9ybUNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gb3JtQ29udmVydGVyOwotCQl9Ci0JCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGNvbnZlcnRlclR5cGUsIEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSkgewotCQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0NvbnZlcnQodGhpcywgdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlQ29udmVydGVyVHlwZSgpIHsKLQkJLy9jaGVjayBAQ29udmVydCBmaXJzdCwgdGhpcyBpcyB0aGUgb3JkZXIgdGhhdCBFY2xpcHNlTGluayBzZWFyY2hlcwotCQlpZiAodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydCgpICE9IG51bGwpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUjsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UtY29udGV4dCBpbnRlcmFjdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLm11dGFibGUudXBkYXRlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJLy8gVE9ETyAtIG11dGFibGUgdmFsaWRhdGlvbgotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmdJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDYWNoaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDUwYTgzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZWFibGVfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQ2FjaGluZ0ltcGwgCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyAKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nLAotCQlPcm1DYWNoZWFibGVIb2xkZXIyXzAKLXsKLQlwcm90ZWN0ZWQgZmluYWwgWG1sQ2FjaGVIb2xkZXIgcmVzb3VyY2U7Ci0JCi0JcHJvdGVjdGVkIGludCBkZWZhdWx0U2l6ZTsKLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRTaXplOwotCQotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRTaGFyZWQ7Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkU2hhcmVkOwotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlVHlwZSBkZWZhdWx0VHlwZTsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZVR5cGUgc3BlY2lmaWVkVHlwZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0QWx3YXlzUmVmcmVzaDsKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRBbHdheXNSZWZyZXNoOwotCQotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXI7Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOwotCQotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHREaXNhYmxlSGl0czsKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWREaXNhYmxlSGl0czsKLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZGVmYXVsdENvb3JkaW5hdGlvblR5cGU7Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIHNwZWNpZmllZENvb3JkaW5hdGlvblR5cGU7Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBzcGVjaWZpZWRFeGlzdGVuY2VUeXBlOwotCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZGVmYXVsdEV4aXN0ZW5jZVR5cGU7Ci0JCi0JcHJvdGVjdGVkIEludGVnZXIgZXhwaXJ5OwotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSBleHBpcnlUaW1lT2ZEYXk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZTsKLQkKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDYWNoaW5nSW1wbChPcm1UeXBlTWFwcGluZyBwYXJlbnQsIFhtbENhY2hlSG9sZGVyIHJlc291cmNlLCBYbWxDYWNoZWFibGVfMl8wIGNhY2hlYWJsZVJlc291cmNlLCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDYWNoaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLQkJWG1sQ2FjaGUgcmVzb3VyY2VDYWNoZSA9IGdldFJlc291cmNlQ2FjaGUoKTsKLQkJdGhpcy5kZWZhdWx0U2l6ZSA9IHRoaXMuZGVmYXVsdFNpemUoamF2YUNhY2hpbmcpOwotCQl0aGlzLnNwZWNpZmllZFNpemUgPSBnZXRSZXNvdXJjZVNpemUocmVzb3VyY2VDYWNoZSk7Ci0JCXRoaXMuZGVmYXVsdFNoYXJlZCA9IHRoaXMuZGVmYXVsdFNoYXJlZChqYXZhQ2FjaGluZyk7Ci0JCXRoaXMuc3BlY2lmaWVkU2hhcmVkID0gdGhpcy5nZXRSZXNvdXJjZVNoYXJlZChyZXNvdXJjZUNhY2hlKTsKLQkJdGhpcy5kZWZhdWx0QWx3YXlzUmVmcmVzaCA9IHRoaXMuZGVmYXVsdEFsd2F5c1JlZnJlc2goamF2YUNhY2hpbmcpOwotCQl0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2ggPSB0aGlzLmdldFJlc291cmNlQWx3YXlzUmVmcmVzaChyZXNvdXJjZUNhY2hlKTsKLQkJdGhpcy5kZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyID0gdGhpcy5kZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKGphdmFDYWNoaW5nKTsKLQkJdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIgPSB0aGlzLmdldFJlc291cmNlUmVmcmVzaE9ubHlJZk5ld2VyKHJlc291cmNlQ2FjaGUpOwotCQl0aGlzLmRlZmF1bHREaXNhYmxlSGl0cyA9IHRoaXMuZGVmYXVsdERpc2FibGVIaXRzKGphdmFDYWNoaW5nKTsKLQkJdGhpcy5zcGVjaWZpZWREaXNhYmxlSGl0cyA9IHRoaXMuZ2V0UmVzb3VyY2VEaXNhYmxlSGl0cyhyZXNvdXJjZUNhY2hlKTsKLQkJdGhpcy5kZWZhdWx0VHlwZSA9IHRoaXMuZGVmYXVsdFR5cGUoamF2YUNhY2hpbmcpOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSB0aGlzLmdldFJlc291cmNlVHlwZShyZXNvdXJjZUNhY2hlKTsKLQkJdGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSA9IHRoaXMuZGVmYXVsdENvb3JkaW5hdGlvblR5cGUoamF2YUNhY2hpbmcpOwotCQl0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUgPSB0aGlzLmdldFJlc291cmNlQ29vcmRpbmF0aW9uVHlwZShyZXNvdXJjZUNhY2hlKTsKLQkJdGhpcy5kZWZhdWx0RXhpc3RlbmNlVHlwZSA9IHRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGUoamF2YUNhY2hpbmcpOwotCQl0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgPSB0aGlzLmdldFJlc291cmNlRXhpc3RlbmNlQ2hlY2tpbmcoKTsKLQkJdGhpcy5pbml0aWFsaXplRXhwaXJ5KHJlc291cmNlQ2FjaGUpOwotCQl0aGlzLmNhY2hlYWJsZSA9ICgoT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5KSBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKSkuYnVpbGRPcm1DYWNoZWFibGUodGhpcywgY2FjaGVhYmxlUmVzb3VyY2UpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1UeXBlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtVHlwZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRTaXplID09IG51bGwpID8gdGhpcy5kZWZhdWx0U2l6ZSA6IHRoaXMuc3BlY2lmaWVkU2l6ZS5pbnRWYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldERlZmF1bHRTaXplKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2l6ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNpemUoaW50IG5ld1NpemUpIHsKLQkJaW50IG9sZFNpemUgPSB0aGlzLmRlZmF1bHRTaXplOwotCQl0aGlzLmRlZmF1bHRTaXplID0gbmV3U2l6ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NJWkVfUFJPUEVSVFksIG9sZFNpemUsIG5ld1NpemUpOwotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTaXplOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTaXplKEludGVnZXIgbmV3U3BlY2lmaWVkU2l6ZSkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZFNpemUgPSB0aGlzLnNwZWNpZmllZFNpemU7Ci0JCXRoaXMuc3BlY2lmaWVkU2l6ZSA9IG5ld1NwZWNpZmllZFNpemU7Ci0JCWlmIChvbGRTcGVjaWZpZWRTaXplICE9IG5ld1NwZWNpZmllZFNpemUpIHsKLQkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FjaGUoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkuc2V0U2l6ZShuZXdTcGVjaWZpZWRTaXplKTsJCQkJCQkKLQkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkuaXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZVJlc291cmNlQ2FjaGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdTcGVjaWZpZWRTaXplICE9IG51bGwpIHsKLQkJCQlhZGRSZXNvdXJjZUNhY2hlKCk7Ci0JCQkJZ2V0UmVzb3VyY2VDYWNoZSgpLnNldFNpemUobmV3U3BlY2lmaWVkU2l6ZSk7Ci0JCQl9Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0laRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2l6ZSwgbmV3U3BlY2lmaWVkU2l6ZSk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2l6ZV8oSW50ZWdlciBuZXdTcGVjaWZpZWRTaXplKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkU2l6ZSA9IHRoaXMuc3BlY2lmaWVkU2l6ZTsKLQkJdGhpcy5zcGVjaWZpZWRTaXplID0gbmV3U3BlY2lmaWVkU2l6ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0laRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2l6ZSwgbmV3U3BlY2lmaWVkU2l6ZSk7Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkU2hhcmVkID09IG51bGwpID8gdGhpcy5kZWZhdWx0U2hhcmVkIDogdGhpcy5zcGVjaWZpZWRTaGFyZWQuYm9vbGVhblZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFNoYXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNoYXJlZDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNoYXJlZChib29sZWFuIG5ld0RlZmF1bHRTaGFyZWQpIHsKLQkJYm9vbGVhbiBvbGREZWZhdWx0U2hhcmVkID0gdGhpcy5kZWZhdWx0U2hhcmVkOwotCQl0aGlzLmRlZmF1bHRTaGFyZWQgPSBuZXdEZWZhdWx0U2hhcmVkOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU0hBUkVEX1BST1BFUlRZLCBvbGREZWZhdWx0U2hhcmVkLCBuZXdEZWZhdWx0U2hhcmVkKTsJCi0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFNoYXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2hhcmVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbiBuZXdTcGVjaWZpZWRTaGFyZWQpIHsKLQkJQm9vbGVhbiBvbGRTcGVjaWZpZWRTaGFyZWQgPSB0aGlzLnNwZWNpZmllZFNoYXJlZDsKLQkJdGhpcy5zcGVjaWZpZWRTaGFyZWQgPSBuZXdTcGVjaWZpZWRTaGFyZWQ7Ci0JCWlmIChvbGRTcGVjaWZpZWRTaGFyZWQgIT0gbmV3U3BlY2lmaWVkU2hhcmVkKSB7Ci0JCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpLnNldFNoYXJlZChuZXdTcGVjaWZpZWRTaGFyZWQpOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FjaGUoKS5pc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlUmVzb3VyY2VDYWNoZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZFNoYXJlZCAhPSBudWxsKSB7Ci0JCQkJYWRkUmVzb3VyY2VDYWNoZSgpOwotCQkJCWdldFJlc291cmNlQ2FjaGUoKS5zZXRTaGFyZWQobmV3U3BlY2lmaWVkU2hhcmVkKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TSEFSRURfUFJPUEVSVFksIG9sZFNwZWNpZmllZFNoYXJlZCwgbmV3U3BlY2lmaWVkU2hhcmVkKTsJCQotCQlpZiAobmV3U3BlY2lmaWVkU2hhcmVkID09IEJvb2xlYW4uRkFMU0UpIHsKLQkJCXNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCQlzZXRTcGVjaWZpZWRTaXplKG51bGwpOwotCQkJc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChudWxsKTsKLQkJCXNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihudWxsKTsKLQkJCXNldFNwZWNpZmllZERpc2FibGVIaXRzKG51bGwpOwotCQkJc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShudWxsKTsKLQkJCXNldEV4cGlyeShudWxsKTsKLQkJCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2hhcmVkXyhCb29sZWFuIG5ld1NwZWNpZmllZFNoYXJlZCkgewotCQlCb29sZWFuIG9sZFNwZWNpZmllZFNoYXJlZCA9IHRoaXMuc3BlY2lmaWVkU2hhcmVkOwotCQl0aGlzLnNwZWNpZmllZFNoYXJlZCA9IG5ld1NwZWNpZmllZFNoYXJlZDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0hBUkVEX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTaGFyZWQsIG5ld1NwZWNpZmllZFNoYXJlZCk7CQotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Fsd2F5c1JlZnJlc2goKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoID09IG51bGwpID8gdGhpcy5kZWZhdWx0QWx3YXlzUmVmcmVzaCA6IHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaC5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEFsd2F5c1JlZnJlc2g7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRBbHdheXNSZWZyZXNoKGJvb2xlYW4gbmV3RGVmYXVsdEFsd2F5c1JlZnJlc2gpIHsKLQkJYm9vbGVhbiBvbGREZWZhdWx0QWx3YXlzUmVmcmVzaCA9IHRoaXMuZGVmYXVsdEFsd2F5c1JlZnJlc2g7Ci0JCXRoaXMuZGVmYXVsdEFsd2F5c1JlZnJlc2ggPSBuZXdEZWZhdWx0QWx3YXlzUmVmcmVzaDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0FMV0FZU19SRUZSRVNIX1BST1BFUlRZLCBvbGREZWZhdWx0QWx3YXlzUmVmcmVzaCwgbmV3RGVmYXVsdEFsd2F5c1JlZnJlc2gpOwkKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuIG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2gpIHsKLQkJQm9vbGVhbiBvbGRTcGVjaWZpZWRBbHdheXNSZWZyZXNoID0gdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoOwotCQl0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2ggPSBuZXdTcGVjaWZpZWRBbHdheXNSZWZyZXNoOwotCQlpZiAob2xkU3BlY2lmaWVkQWx3YXlzUmVmcmVzaCAhPSBuZXdTcGVjaWZpZWRBbHdheXNSZWZyZXNoKSB7Ci0JCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpLnNldEFsd2F5c1JlZnJlc2gobmV3U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCk7CQkJCQkJCi0JCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpLmlzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVSZXNvdXJjZUNhY2hlKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCAhPSBudWxsKSB7Ci0JCQkJYWRkUmVzb3VyY2VDYWNoZSgpOwotCQkJCWdldFJlc291cmNlQ2FjaGUoKS5zZXRBbHdheXNSZWZyZXNoKG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2gpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0FMV0FZU19SRUZSRVNIX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRBbHdheXNSZWZyZXNoLCBuZXdTcGVjaWZpZWRBbHdheXNSZWZyZXNoKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoXyhCb29sZWFuIG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2gpIHsKLQkJQm9vbGVhbiBvbGRTcGVjaWZpZWRBbHdheXNSZWZyZXNoID0gdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoOwotCQl0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2ggPSBuZXdTcGVjaWZpZWRBbHdheXNSZWZyZXNoOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BTFdBWVNfUkVGUkVTSF9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQWx3YXlzUmVmcmVzaCwgbmV3U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCk7CQotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciA9PSBudWxsKSA/IHRoaXMuZGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlciA6IHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoYm9vbGVhbiBuZXdEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKSB7Ci0JCWJvb2xlYW4gb2xkRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlciA9IHRoaXMuZGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJdGhpcy5kZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyID0gbmV3RGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1JFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSwgb2xkRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlciwgbmV3RGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcik7CQotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4gbmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKSB7Ci0JCUJvb2xlYW4gb2xkU3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyID0gdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXI7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyID0gbmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOwotCQlpZiAob2xkU3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyICE9IG5ld1NwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcikgewotCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldFJlc291cmNlQ2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIobmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKTsJCQkJCQkKLQkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkuaXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZVJlc291cmNlQ2FjaGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIgIT0gbnVsbCkgewotCQkJCWFkZFJlc291cmNlQ2FjaGUoKTsKLQkJCQlnZXRSZXNvdXJjZUNhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKG5ld1NwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcik7Ci0JCQl9Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVGUkVTSF9PTkxZX0lGX05FV0VSX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIsIG5ld1NwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcik7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyXyhCb29sZWFuIG5ld1NwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcikgewotCQlCb29sZWFuIG9sZFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciA9IHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOwotCQl0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciA9IG5ld1NwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVGUkVTSF9PTkxZX0lGX05FV0VSX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIsIG5ld1NwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcik7CQotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2FibGVIaXRzKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMgPT0gbnVsbCkgPyB0aGlzLmRlZmF1bHREaXNhYmxlSGl0cyA6IHRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMuYm9vbGVhblZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdERpc2FibGVIaXRzKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RGlzYWJsZUhpdHM7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHREaXNhYmxlSGl0cyhib29sZWFuIG5ld0RlZmF1bHREaXNhYmxlSGl0cykgewotCQlib29sZWFuIG9sZERlZmF1bHREaXNhYmxlSGl0cyA9IHRoaXMuZGVmYXVsdERpc2FibGVIaXRzOwotCQl0aGlzLmRlZmF1bHREaXNhYmxlSGl0cyA9IG5ld0RlZmF1bHREaXNhYmxlSGl0czsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0RJU0FCTEVfSElUU19QUk9QRVJUWSwgb2xkRGVmYXVsdERpc2FibGVIaXRzLCBuZXdEZWZhdWx0RGlzYWJsZUhpdHMpOwkKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuIG5ld1NwZWNpZmllZERpc2FibGVIaXRzKSB7Ci0JCUJvb2xlYW4gb2xkU3BlY2lmaWVkRGlzYWJsZUhpdHMgPSB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOwotCQl0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzID0gbmV3U3BlY2lmaWVkRGlzYWJsZUhpdHM7Ci0JCWlmIChvbGRTcGVjaWZpZWREaXNhYmxlSGl0cyAhPSBuZXdTcGVjaWZpZWREaXNhYmxlSGl0cykgewotCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldFJlc291cmNlQ2FjaGUoKS5zZXREaXNhYmxlSGl0cyhuZXdTcGVjaWZpZWREaXNhYmxlSGl0cyk7CQkJCQkJCi0JCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpLmlzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVSZXNvdXJjZUNhY2hlKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3U3BlY2lmaWVkRGlzYWJsZUhpdHMgIT0gbnVsbCkgewotCQkJCWFkZFJlc291cmNlQ2FjaGUoKTsKLQkJCQlnZXRSZXNvdXJjZUNhY2hlKCkuc2V0RGlzYWJsZUhpdHMobmV3U3BlY2lmaWVkRGlzYWJsZUhpdHMpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0RJU0FCTEVfSElUU19QUk9QRVJUWSwgb2xkU3BlY2lmaWVkRGlzYWJsZUhpdHMsIG5ld1NwZWNpZmllZERpc2FibGVIaXRzKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWREaXNhYmxlSGl0c18oQm9vbGVhbiBuZXdTcGVjaWZpZWREaXNhYmxlSGl0cykgewotCQlCb29sZWFuIG9sZFNwZWNpZmllZERpc2FibGVIaXRzID0gdGhpcy5zcGVjaWZpZWREaXNhYmxlSGl0czsKLQkJdGhpcy5zcGVjaWZpZWREaXNhYmxlSGl0cyA9IG5ld1NwZWNpZmllZERpc2FibGVIaXRzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9ESVNBQkxFX0hJVFNfUFJPUEVSVFksIG9sZFNwZWNpZmllZERpc2FibGVIaXRzLCBuZXdTcGVjaWZpZWREaXNhYmxlSGl0cyk7CQotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFR5cGUgPT0gbnVsbCkgPyB0aGlzLmRlZmF1bHRUeXBlIDogdGhpcy5zcGVjaWZpZWRUeXBlOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlVHlwZSBnZXREZWZhdWx0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFR5cGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIG5ld0RlZmF1bHRUeXBlKSB7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVUeXBlIG9sZERlZmF1bHRUeXBlPSB0aGlzLmRlZmF1bHRUeXBlOwotCQl0aGlzLmRlZmF1bHRUeXBlID0gbmV3RGVmYXVsdFR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9UWVBFX1BST1BFUlRZLCBvbGREZWZhdWx0VHlwZSwgbmV3RGVmYXVsdFR5cGUpOwkJCQkKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGdldFNwZWNpZmllZFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUgbmV3U3BlY2lmaWVkVHlwZSkgewotCQlFY2xpcHNlTGlua0NhY2hlVHlwZSBvbGRTcGVjaWZpZWRUeXBlID0gdGhpcy5zcGVjaWZpZWRUeXBlOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSBuZXdTcGVjaWZpZWRUeXBlOwotCQlpZiAob2xkU3BlY2lmaWVkVHlwZSAhPSBuZXdTcGVjaWZpZWRUeXBlKSB7Ci0JCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpLnNldFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZFR5cGUpKTsJCQkJCQkKLQkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkuaXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZVJlc291cmNlQ2FjaGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdTcGVjaWZpZWRUeXBlICE9IG51bGwpIHsKLQkJCQlhZGRSZXNvdXJjZUNhY2hlKCk7Ci0JCQkJZ2V0UmVzb3VyY2VDYWNoZSgpLnNldFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZFR5cGUpKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UWVBFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRUeXBlLCBuZXdTcGVjaWZpZWRUeXBlKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUeXBlXyhFY2xpcHNlTGlua0NhY2hlVHlwZSBuZXdTcGVjaWZpZWRUeXBlKSB7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVUeXBlIG9sZFNwZWNpZmllZFR5cGU9IHRoaXMuc3BlY2lmaWVkVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gbmV3U3BlY2lmaWVkVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVHlwZSwgbmV3U3BlY2lmaWVkVHlwZSk7CQkKLQl9Ci0JCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldENvb3JkaW5hdGlvblR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlID09IG51bGwpID8gdGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSA6IHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgbmV3RGVmYXVsdGNDb29yZGluYXRpb25UeXBlKSB7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIG9sZERlZmF1bHRjQ29vcmRpbmF0aW9uVHlwZT0gdGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZTsKLQkJdGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSA9IG5ld0RlZmF1bHRjQ29vcmRpbmF0aW9uVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NPT1JESU5BVElPTl9UWVBFX1BST1BFUlRZLCBvbGREZWZhdWx0Y0Nvb3JkaW5hdGlvblR5cGUsIG5ld0RlZmF1bHRjQ29vcmRpbmF0aW9uVHlwZSk7CQkJCQotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBuZXdTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKSB7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIG9sZFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUgPSB0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSA9IG5ld1NwZWNpZmllZENvb3JkaW5hdGlvblR5cGU7Ci0JCWlmIChvbGRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlICE9IG5ld1NwZWNpZmllZENvb3JkaW5hdGlvblR5cGUpIHsKLQkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FjaGUoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkuc2V0Q29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSkpOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FjaGUoKS5pc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlUmVzb3VyY2VDYWNoZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZENvb3JkaW5hdGlvblR5cGUgIT0gbnVsbCkgewotCQkJCWFkZFJlc291cmNlQ2FjaGUoKTsKLQkJCQlnZXRSZXNvdXJjZUNhY2hlKCkuc2V0Q29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSkpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NPT1JESU5BVElPTl9UWVBFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlLCBuZXdTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlXyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBuZXdTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKSB7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIG9sZFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUgPSB0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSA9IG5ld1NwZWNpZmllZENvb3JkaW5hdGlvblR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NPT1JESU5BVElPTl9UWVBFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlLCBuZXdTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKTsJCQotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldEV4aXN0ZW5jZVR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRFeGlzdGVuY2VUeXBlID09IG51bGwpID8gdGhpcy5kZWZhdWx0RXhpc3RlbmNlVHlwZSA6IHRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBuZXdEZWZhdWx0RXhpc3RlbmNlVHlwZSkgewotCQlFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgb2xkRGVmYXVsdEV4aXN0ZW5jZVR5cGUgPSB0aGlzLmRlZmF1bHRFeGlzdGVuY2VUeXBlOwotCQl0aGlzLmRlZmF1bHRFeGlzdGVuY2VUeXBlID0gbmV3RGVmYXVsdEV4aXN0ZW5jZVR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSwgb2xkRGVmYXVsdEV4aXN0ZW5jZVR5cGUsIG5ld0RlZmF1bHRFeGlzdGVuY2VUeXBlKTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRFeGlzdGVuY2VUeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBuZXdTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKSB7Ci0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBvbGRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlID0gdGhpcy5zcGVjaWZpZWRFeGlzdGVuY2VUeXBlOwotCQl0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgPSBuZXdTcGVjaWZpZWRFeGlzdGVuY2VUeXBlOwotCQl0aGlzLnJlc291cmNlLnNldEV4aXN0ZW5jZUNoZWNraW5nKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkRXhpc3RlbmNlVHlwZSwgbmV3U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSk7CQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGVfKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBuZXdTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKSB7Ci0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBvbGRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlID0gdGhpcy5zcGVjaWZpZWRFeGlzdGVuY2VUeXBlOwotCQl0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgPSBuZXdTcGVjaWZpZWRFeGlzdGVuY2VUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkRXhpc3RlbmNlVHlwZSwgbmV3U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSk7CQkKLQl9CQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldEV4cGlyeSgpIHsKLQkJcmV0dXJuIHRoaXMuZXhwaXJ5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFeHBpcnkoSW50ZWdlciBuZXdFeHBpcnkpIHsKLQkJSW50ZWdlciBvbGRFeHBpcnkgPSB0aGlzLmV4cGlyeTsKLQkJdGhpcy5leHBpcnkgPSBuZXdFeHBpcnk7Ci0JCWlmIChvbGRFeHBpcnkgIT0gbmV3RXhwaXJ5KSB7Ci0JCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpLnNldEV4cGlyeShuZXdFeHBpcnkpOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FjaGUoKS5pc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlUmVzb3VyY2VDYWNoZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld0V4cGlyeSAhPSBudWxsKSB7Ci0JCQkJYWRkUmVzb3VyY2VDYWNoZSgpOwotCQkJCXRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpLnNldEV4cGlyeShuZXdFeHBpcnkpOwkJCQkJCQotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1BST1BFUlRZLCBvbGRFeHBpcnksIG5ld0V4cGlyeSk7Ci0JCWlmIChuZXdFeHBpcnkgIT0gbnVsbCAmJiB0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7Ci0JCQlyZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRFeHBpcnlfKEludGVnZXIgbmV3RXhwaXJ5KSB7Ci0JCUludGVnZXIgb2xkRXhwaXJ5ID0gdGhpcy5leHBpcnk7Ci0JCXRoaXMuZXhwaXJ5ID0gbmV3RXhwaXJ5OwkJCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1BST1BFUlRZLCBvbGRFeHBpcnksIG5ld0V4cGlyeSk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSBnZXRFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCXJldHVybiB0aGlzLmV4cGlyeVRpbWVPZkRheTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IGFkZEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImV4cGlyeVRpbWVPZkRheSBhbHJlYWR5IGV4aXN0cywgdXNlIGdldEV4cGlyeVRpbWVPZkRheSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZ2V0UmVzb3VyY2VDYWNoZSgpID09IG51bGwpIHsKLQkJCWFkZFJlc291cmNlQ2FjaGUoKTsKLQkJfQotCQlPcm1FY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSBuZXdFeHBpcnlUaW1lT2ZEYXkgPSBuZXcgT3JtRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkodGhpcyk7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gbmV3RXhwaXJ5VGltZU9mRGF5OwotCQlYbWxUaW1lT2ZEYXkgcmVzb3VyY2VUaW1lT2ZEYXkgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRpbWVPZkRheSgpOwotCQluZXdFeHBpcnlUaW1lT2ZEYXkuaW5pdGlhbGl6ZShyZXNvdXJjZVRpbWVPZkRheSk7Ci0JCWdldFJlc291cmNlQ2FjaGUoKS5zZXRFeHBpcnlUaW1lT2ZEYXkocmVzb3VyY2VUaW1lT2ZEYXkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSwgbnVsbCwgbmV3RXhwaXJ5VGltZU9mRGF5KTsKLQkJc2V0RXhwaXJ5KG51bGwpOwotCQlyZXR1cm4gbmV3RXhwaXJ5VGltZU9mRGF5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0aW1lT2ZEYXlFeHBpcnkgZG9lcyBub3QgZXhpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IG9sZEV4cGlyeVRpbWVPZkRheSA9IHRoaXMuZXhwaXJ5VGltZU9mRGF5OwotCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IG51bGw7Ci0JCWdldFJlc291cmNlQ2FjaGUoKS5zZXRFeHBpcnlUaW1lT2ZEYXkobnVsbCk7Ci0JCWlmICh0aGlzLmdldFJlc291cmNlQ2FjaGUoKS5pc1Vuc2V0KCkpIHsKLQkJCXJlbW92ZVJlc291cmNlQ2FjaGUoKTsKLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSwgb2xkRXhwaXJ5VGltZU9mRGF5LCBudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXhwaXJ5VGltZU9mRGF5KE9ybUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IG5ld0V4cGlyeVRpbWVPZkRheSkgewotCQlPcm1FY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSBvbGRFeHBpcnlUaW1lT2ZEYXkgPSB0aGlzLmV4cGlyeVRpbWVPZkRheTsKLQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkgPSBuZXdFeHBpcnlUaW1lT2ZEYXk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZLCBvbGRFeHBpcnlUaW1lT2ZEYXksIG5ld0V4cGlyeVRpbWVPZkRheSk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxDYWNoZSBnZXRSZXNvdXJjZUNhY2hlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZS5nZXRDYWNoZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZUNhY2hlKCkgewotCQl0aGlzLnJlc291cmNlLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVzb3VyY2VDYWNoZSgpIHsKLQkJdGhpcy5yZXNvdXJjZS5zZXRDYWNoZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIE9ybUNhY2hlYWJsZTJfMCBnZXRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlYWJsZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpIHsKLQkJaWYgKCFnZXRQYXJlbnQoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldFBhcmVudCgpLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQlpZiAoamF2YVBlcnNpc3RlbnRUeXBlICE9IG51bGwgJiYgamF2YVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIENhY2hlYWJsZUhvbGRlcjJfMCkgewotCQkJCXJldHVybiAoKENhY2hlYWJsZUhvbGRlcjJfMCkgamF2YVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCkuaXNDYWNoZWFibGUoKTsKLQkJCX0KLQkJfQotCQlDYWNoZWFibGVIb2xkZXIyXzAgY2FjaGVhYmxlSG9sZGVyID0gZ2V0Q2FjaGVhYmxlU3VwZXJQZXJzaXN0ZW50VHlwZShnZXRQYXJlbnQoKS5nZXRQZXJzaXN0ZW50VHlwZSgpKTsKLQkJaWYgKGNhY2hlYWJsZUhvbGRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY2FjaGVhYmxlSG9sZGVyLmdldENhY2hlYWJsZSgpLmlzQ2FjaGVhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuICgoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ2FjaGVhYmxlSG9sZGVyMl8wIGdldENhY2hlYWJsZVN1cGVyUGVyc2lzdGVudFR5cGUoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKLQkJUGVyc2lzdGVudFR5cGUgc3VwZXJQZXJzaXN0ZW50VHlwZSA9IHBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKTsKLQkJaWYgKHN1cGVyUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJaWYgKHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQ2FjaGVhYmxlSG9sZGVyMl8wKSB7Ci0JCQkJcmV0dXJuIChDYWNoZWFibGVIb2xkZXIyXzApIHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkJfQotCQkJcmV0dXJuIGdldENhY2hlYWJsZVN1cGVyUGVyc2lzdGVudFR5cGUoc3VwZXJQZXJzaXN0ZW50VHlwZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqKiogaW5pdGlhbGl6ZS91cGRhdGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFeHBpcnkoWG1sQ2FjaGUgcmVzb3VyY2VDYWNoZSkgewotCQlpZiAocmVzb3VyY2VDYWNoZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHJlc291cmNlQ2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCkgPT0gbnVsbCkgewotCQkJdGhpcy5leHBpcnkgPSByZXNvdXJjZUNhY2hlLmdldEV4cGlyeSgpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHJlc291cmNlQ2FjaGUuZ2V0RXhwaXJ5KCkgPT0gbnVsbCkgeyAvL2hhbmRsZSB3aXRoIHZhbGlkYXRpb24gaWYgYm90aCBleHBpcnkgYW5kIGV4cGlyeVRpbWVPZkRheSBhcmUgc2V0Ci0JCQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkgPSBuZXcgT3JtRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkodGhpcyk7Ci0JCQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkuaW5pdGlhbGl6ZShyZXNvdXJjZUNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDYWNoaW5nKSB7Ci0JCVhtbENhY2hlIHJlc291cmNlQ2FjaGUgPSBnZXRSZXNvdXJjZUNhY2hlKCk7Ci0JCXNldERlZmF1bHRTaXplKHRoaXMuZGVmYXVsdFNpemUoamF2YUNhY2hpbmcpKTsKLQkJc2V0U3BlY2lmaWVkU2l6ZV8odGhpcy5nZXRSZXNvdXJjZVNpemUocmVzb3VyY2VDYWNoZSkpOwotCQlzZXREZWZhdWx0U2hhcmVkKHRoaXMuZGVmYXVsdFNoYXJlZChqYXZhQ2FjaGluZykpOwotCQlzZXRTcGVjaWZpZWRTaGFyZWRfKHRoaXMuZ2V0UmVzb3VyY2VTaGFyZWQocmVzb3VyY2VDYWNoZSkpOwotCQlzZXREZWZhdWx0QWx3YXlzUmVmcmVzaCh0aGlzLmRlZmF1bHRBbHdheXNSZWZyZXNoKGphdmFDYWNoaW5nKSk7Ci0JCXNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2hfKHRoaXMuZ2V0UmVzb3VyY2VBbHdheXNSZWZyZXNoKHJlc291cmNlQ2FjaGUpKTsKLQkJc2V0RGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcih0aGlzLmRlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoamF2YUNhY2hpbmcpKTsKLQkJc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyXyh0aGlzLmdldFJlc291cmNlUmVmcmVzaE9ubHlJZk5ld2VyKHJlc291cmNlQ2FjaGUpKTsKLQkJc2V0RGVmYXVsdERpc2FibGVIaXRzKHRoaXMuZGVmYXVsdERpc2FibGVIaXRzKGphdmFDYWNoaW5nKSk7Ci0JCXNldFNwZWNpZmllZERpc2FibGVIaXRzXyh0aGlzLmdldFJlc291cmNlRGlzYWJsZUhpdHMocmVzb3VyY2VDYWNoZSkpOwotCQlzZXREZWZhdWx0VHlwZSh0aGlzLmRlZmF1bHRUeXBlKGphdmFDYWNoaW5nKSk7Ci0JCXNldFNwZWNpZmllZFR5cGVfKHRoaXMuZ2V0UmVzb3VyY2VUeXBlKHJlc291cmNlQ2FjaGUpKTsKLQkJc2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUodGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZShqYXZhQ2FjaGluZykpOwotCQlzZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlXyh0aGlzLmdldFJlc291cmNlQ29vcmRpbmF0aW9uVHlwZShyZXNvdXJjZUNhY2hlKSk7Ci0JCXNldERlZmF1bHRFeGlzdGVuY2VUeXBlKHRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGUoamF2YUNhY2hpbmcpKTsKLQkJc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZV8odGhpcy5nZXRSZXNvdXJjZUV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQl0aGlzLnVwZGF0ZUV4cGlyeShyZXNvdXJjZUNhY2hlKTsKLQkJdGhpcy5jYWNoZWFibGUudXBkYXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUV4cGlyeShYbWxDYWNoZSByZXNvdXJjZUNhY2hlKSB7Ci0JCWlmIChyZXNvdXJjZUNhY2hlID09IG51bGwpIHsKLQkJCXNldEV4cGlyeVRpbWVPZkRheShudWxsKTsKLQkJCXNldEV4cGlyeV8obnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHJlc291cmNlQ2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCkgPT0gbnVsbCkgewotCQkJc2V0RXhwaXJ5VGltZU9mRGF5KG51bGwpOwotCQkJc2V0RXhwaXJ5XyhyZXNvdXJjZUNhY2hlLmdldEV4cGlyeSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkudXBkYXRlKHJlc291cmNlQ2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQkJfQotCQkJZWxzZSBpZiAocmVzb3VyY2VDYWNoZS5nZXRFeHBpcnkoKSA9PSBudWxsKXsKLQkJCQlzZXRFeHBpcnlUaW1lT2ZEYXkobmV3IE9ybUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5KHRoaXMpKTsKLQkJCQl0aGlzLmV4cGlyeVRpbWVPZkRheS5pbml0aWFsaXplKHJlc291cmNlQ2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQkJfQotCQkJZWxzZSB7IC8vaGFuZGxlIHdpdGggdmFsaWRhdGlvbiBpZiBib3RoIGV4cGlyeSBhbmQgZXhwaXJ5VGltZU9mRGF5IGFyZSBzZXQKLQkJCQlzZXRFeHBpcnlUaW1lT2ZEYXkobnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBkZWZhdWx0U2l6ZShKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDYWNoaW5nKSB7Ci0JCXJldHVybiAoamF2YUNhY2hpbmcgPT0gbnVsbCkgPyBERUZBVUxUX1NJWkUgOiBqYXZhQ2FjaGluZy5nZXRTaXplKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIGdldFJlc291cmNlU2l6ZShYbWxDYWNoZSByZXNvdXJjZSkgewotCQlyZXR1cm4gKHJlc291cmNlID09IG51bGwpID8gbnVsbCA6IHJlc291cmNlLmdldFNpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFNoYXJlZChKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDYWNoaW5nKSB7Ci0JCWlmIChqYXZhQ2FjaGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gREVGQVVMVF9TSEFSRUQ7Ci0JCX0KLQkJcmV0dXJuIGdldFJlc291cmNlQ2FjaGUoKSA9PSBudWxsID8gamF2YUNhY2hpbmcuaXNTaGFyZWQoKSA6IERFRkFVTFRfU0hBUkVEOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBnZXRSZXNvdXJjZVNoYXJlZChYbWxDYWNoZSByZXNvdXJjZSkgewotCQlyZXR1cm4gKHJlc291cmNlID09IG51bGwpID8gbnVsbCA6IHJlc291cmNlLmdldFNoYXJlZCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0QWx3YXlzUmVmcmVzaChKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDYWNoaW5nKSB7Ci0JCWlmIChqYXZhQ2FjaGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gREVGQVVMVF9BTFdBWVNfUkVGUkVTSDsKLQkJfQotCQlyZXR1cm4gZ2V0UmVzb3VyY2VDYWNoZSgpID09IG51bGwgPyBqYXZhQ2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSA6IERFRkFVTFRfQUxXQVlTX1JFRlJFU0g7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIGdldFJlc291cmNlQWx3YXlzUmVmcmVzaChYbWxDYWNoZSByZXNvdXJjZSkgewotCQlyZXR1cm4gKHJlc291cmNlID09IG51bGwpID8gbnVsbCA6IHJlc291cmNlLmdldEFsd2F5c1JlZnJlc2goKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcihKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDYWNoaW5nKSB7Ci0JCWlmIChqYXZhQ2FjaGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gREVGQVVMVF9SRUZSRVNIX09OTFlfSUZfTkVXRVI7Ci0JCX0KLQkJcmV0dXJuIGdldFJlc291cmNlQ2FjaGUoKSA9PSBudWxsID8gamF2YUNhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSA6IERFRkFVTFRfUkVGUkVTSF9PTkxZX0lGX05FV0VSOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBnZXRSZXNvdXJjZVJlZnJlc2hPbmx5SWZOZXdlcihYbWxDYWNoZSByZXNvdXJjZSkgewotCQlyZXR1cm4gKHJlc291cmNlID09IG51bGwpID8gbnVsbCA6IHJlc291cmNlLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0RGlzYWJsZUhpdHMoSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ2FjaGluZykgewotCQlpZiAoamF2YUNhY2hpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIERFRkFVTFRfRElTQUJMRV9ISVRTOwotCQl9Ci0JCXJldHVybiBnZXRSZXNvdXJjZUNhY2hlKCkgPT0gbnVsbCA/IGphdmFDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSA6IERFRkFVTFRfRElTQUJMRV9ISVRTOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBnZXRSZXNvdXJjZURpc2FibGVIaXRzKFhtbENhY2hlIHJlc291cmNlKSB7Ci0JCXJldHVybiAocmVzb3VyY2UgPT0gbnVsbCkgPyBudWxsIDogcmVzb3VyY2UuZ2V0RGlzYWJsZUhpdHMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGRlZmF1bHRUeXBlKEphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNhY2hpbmcpIHsKLQkJaWYgKGphdmFDYWNoaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBERUZBVUxUX1RZUEU7Ci0JCX0KLQkJcmV0dXJuIGdldFJlc291cmNlQ2FjaGUoKSA9PSBudWxsID8gamF2YUNhY2hpbmcuZ2V0VHlwZSgpIDogREVGQVVMVF9UWVBFOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKFhtbENhY2hlIHJlc291cmNlKSB7Ci0JCXJldHVybiAocmVzb3VyY2UgPT0gbnVsbCkgPyBudWxsIDogRWNsaXBzZUxpbmtDYWNoZVR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwocmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGRlZmF1bHRDb29yZGluYXRpb25UeXBlKEphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNhY2hpbmcpIHsKLQkJaWYgKGphdmFDYWNoaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBERUZBVUxUX0NPT1JESU5BVElPTl9UWVBFOwotCQl9Ci0JCXJldHVybiBnZXRSZXNvdXJjZUNhY2hlKCkgPT0gbnVsbCA/IGphdmFDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSA6IERFRkFVTFRfQ09PUkRJTkFUSU9OX1RZUEU7Ci0JfQotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRSZXNvdXJjZUNvb3JkaW5hdGlvblR5cGUoWG1sQ2FjaGUgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIChyZXNvdXJjZSA9PSBudWxsKSA/IG51bGwgOiBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbChyZXNvdXJjZS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGRlZmF1bHRFeGlzdGVuY2VUeXBlKEphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNhY2hpbmcpIHsKLQkJcmV0dXJuIChqYXZhQ2FjaGluZyA9PSBudWxsKSA/IERFRkFVTFRfRVhJU1RFTkNFX1RZUEUgOiBqYXZhQ2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZ2V0UmVzb3VyY2VFeGlzdGVuY2VDaGVja2luZygpIHsKLQkJcmV0dXJuICh0aGlzLnJlc291cmNlID09IG51bGwpID8gbnVsbCA6IEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh0aGlzLnJlc291cmNlLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBnZXRSZXNvdXJjZUV4cGlyeShYbWxDYWNoZSByZXNvdXJjZSkgewotCQlyZXR1cm4gKHJlc291cmNlID09IG51bGwpID8gbnVsbCA6IHJlc291cmNlLmdldEV4cGlyeSgpOwotCX0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVhtbENhY2hlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VDYWNoZSgpOwotCQlyZXR1cm4gcmVzb3VyY2UgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyYjViNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZwotewotCXByb3RlY3RlZCBmaW5hbCBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlciByZXNvdXJjZTsKLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZGVmYXVsdFR5cGU7Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIHNwZWNpZmllZFR5cGU7Ci0JCi0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcoT3JtVHlwZU1hcHBpbmcgcGFyZW50LCBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlciByZXNvdXJjZSwgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBqYXZhQ2hhbmdlVHJhY2tpbmcpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCQl0aGlzLmRlZmF1bHRUeXBlID0gY2FsY3VsYXRlRGVmYXVsdFR5cGUoamF2YUNoYW5nZVRyYWNraW5nKTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gZ2V0UmVzb3VyY2VDaGFuZ2VUcmFja2luZygpOwotCX0KLQkKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIChnZXRTcGVjaWZpZWRUeXBlKCkgIT0gbnVsbCkgPyBnZXRTcGVjaWZpZWRUeXBlKCkgOiBnZXREZWZhdWx0VHlwZSgpOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRUeXBlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VHlwZV8oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgbmV3RGVmYXVsdFR5cGUpIHsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgb2xkRGVmYXVsdFR5cGUgPSB0aGlzLmRlZmF1bHRUeXBlOwotCQl0aGlzLmRlZmF1bHRUeXBlID0gbmV3RGVmYXVsdFR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9UWVBFX1BST1BFUlRZLCBvbGREZWZhdWx0VHlwZSwgbmV3RGVmYXVsdFR5cGUpOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0U3BlY2lmaWVkVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBuZXdTcGVjaWZpZWRUeXBlKSB7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIG9sZFNwZWNpZmllZFR5cGUgPSB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkVHlwZSA9IG5ld1NwZWNpZmllZFR5cGU7Ci0JCQotCQlpZiAobmV3U3BlY2lmaWVkVHlwZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnJlc291cmNlLnNldENoYW5nZVRyYWNraW5nKG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHRoaXMucmVzb3VyY2UuZ2V0Q2hhbmdlVHJhY2tpbmcoKSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5yZXNvdXJjZS5zZXRDaGFuZ2VUcmFja2luZyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENoYW5nZVRyYWNraW5nKCkpOwotCQkJfQotCQkJdGhpcy5yZXNvdXJjZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZFR5cGUpKTsKLQkJfQotCQkKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVHlwZSwgbmV3U3BlY2lmaWVkVHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFR5cGVfKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIG5ld1NwZWNpZmllZFR5cGUpIHsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgb2xkU3BlY2lmaWVkVHlwZSA9IHRoaXMuc3BlY2lmaWVkVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gbmV3U3BlY2lmaWVkVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVHlwZSwgbmV3U3BlY2lmaWVkVHlwZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBqYXZhQ2hhbmdlVHJhY2tpbmcpIHsKLQkJc2V0RGVmYXVsdFR5cGVfKGNhbGN1bGF0ZURlZmF1bHRUeXBlKGphdmFDaGFuZ2VUcmFja2luZykpOwotCQlzZXRTcGVjaWZpZWRUeXBlXyhnZXRSZXNvdXJjZUNoYW5nZVRyYWNraW5nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgY2FsY3VsYXRlRGVmYXVsdFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBqYXZhQ2hhbmdlVHJhY2tpbmcpIHsKLQkJcmV0dXJuIChqYXZhQ2hhbmdlVHJhY2tpbmcgIT0gbnVsbCkgPyBqYXZhQ2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpIDogRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5ERUZBVUxUX1RZUEU7Ci0JfQotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXRSZXNvdXJjZUNoYW5nZVRyYWNraW5nKCkgewotCQlYbWxDaGFuZ2VUcmFja2luZyB4bWxDaGFuZ2VUcmFja2luZyA9IHRoaXMucmVzb3VyY2UuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJcmV0dXJuICh4bWxDaGFuZ2VUcmFja2luZyAhPSBudWxsKSA/IEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKHhtbENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSkgOiBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzFhNzFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUgaW1wbGVtZW50cyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZQotewkKLQlwcml2YXRlIFhtbENvbnZlcnNpb25WYWx1ZSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZTsKLQkKLQlwcml2YXRlIFN0cmluZyBkYXRhVmFsdWU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgb2JqZWN0VmFsdWU7Ci0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlKE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREYXRhVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhVmFsdWUoU3RyaW5nIG5ld0RhdGFWYWx1ZSkgewotCQlTdHJpbmcgb2xkRGF0YVZhbHVlID0gdGhpcy5kYXRhVmFsdWU7Ci0JCXRoaXMuZGF0YVZhbHVlID0gbmV3RGF0YVZhbHVlOwotCQl0aGlzLnJlc291cmNlQ29udmVyc2lvblZhbHVlLnNldERhdGFWYWx1ZShuZXdEYXRhVmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVkFMVUVfUFJPUEVSVFksIG9sZERhdGFWYWx1ZSwgbmV3RGF0YVZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGF0YVZhbHVlXyhTdHJpbmcgbmV3RGF0YVZhbHVlKSB7Ci0JCVN0cmluZyBvbGREYXRhVmFsdWUgPSB0aGlzLmRhdGFWYWx1ZTsKLQkJdGhpcy5kYXRhVmFsdWUgPSBuZXdEYXRhVmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREFUQV9WQUxVRV9QUk9QRVJUWSwgb2xkRGF0YVZhbHVlLCBuZXdEYXRhVmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RWYWx1ZShTdHJpbmcgbmV3T2JqZWN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZE9iamVjdFZhbHVlID0gdGhpcy5vYmplY3RWYWx1ZTsKLQkJdGhpcy5vYmplY3RWYWx1ZSA9IG5ld09iamVjdFZhbHVlOwotCQl0aGlzLnJlc291cmNlQ29udmVyc2lvblZhbHVlLnNldE9iamVjdFZhbHVlKG5ld09iamVjdFZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVkFMVUVfUFJPUEVSVFksIG9sZE9iamVjdFZhbHVlLCBuZXdPYmplY3RWYWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdFZhbHVlXyhTdHJpbmcgbmV3T2JqZWN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZE9iamVjdFZhbHVlID0gdGhpcy5vYmplY3RWYWx1ZTsKLQkJdGhpcy5vYmplY3RWYWx1ZSA9IG5ld09iamVjdFZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkT2JqZWN0VmFsdWUsIG5ld09iamVjdFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbENvbnZlcnNpb25WYWx1ZSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSkgewotCQl0aGlzLnJlc291cmNlQ29udmVyc2lvblZhbHVlID0gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWU7Ci0JCXRoaXMuZGF0YVZhbHVlID0gdGhpcy5nZXRSZXNvdXJjZURhdGFWYWx1ZSgpOwotCQl0aGlzLm9iamVjdFZhbHVlID0gdGhpcy5nZXRSZXNvdXJjZU9iamVjdFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxDb252ZXJzaW9uVmFsdWUgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUpIHsKLQkJdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlOwotCQl0aGlzLnNldERhdGFWYWx1ZV8odGhpcy5nZXRSZXNvdXJjZURhdGFWYWx1ZSgpKTsKLQkJdGhpcy5zZXRPYmplY3RWYWx1ZV8odGhpcy5nZXRSZXNvdXJjZU9iamVjdFZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VEYXRhVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VPYmplY3RWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERhdGFWYWx1ZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRPYmplY3RWYWx1ZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWVUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl2YWxpZGF0ZURhdGFWYWx1ZXNVbmlxdWUobWVzc2FnZXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZURhdGFWYWx1ZXNVbmlxdWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJTGlzdDxTdHJpbmc+IGRhdGFWYWx1ZXMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChnZXRQYXJlbnQoKS5kYXRhVmFsdWVzKCkpOwotCQlkYXRhVmFsdWVzLnJlbW92ZSh0aGlzLmRhdGFWYWx1ZSk7Ci0JCWlmIChkYXRhVmFsdWVzLmNvbnRhaW5zKHRoaXMuZGF0YVZhbHVlKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1VTFRJUExFX09CSkVDVF9WQUxVRVNfRk9SX0RBVEFfVkFMVUUsCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5kYXRhVmFsdWV9LCAKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXREYXRhVmFsdWVUZXh0UmFuZ2UoKQotCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZjFhZmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQ29udmVydCBleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUgaW1wbGVtZW50cyBFY2xpcHNlTGlua0NvbnZlcnQsIE9ybUNvbnZlcnRlcgotewotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ29udmVydGVyTmFtZTsKLQkKLQlwcm90ZWN0ZWQgWG1sQ29udmVydGlibGVNYXBwaW5nIHJlc291cmNlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4gY29udmVydGVyOwotCQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnQoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIFhtbENvbnZlcnRpYmxlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5pbml0aWFsaXplKHJlc291cmNlTWFwcGluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSOwotCX0KLQkJCi0JcHVibGljIHZvaWQgYWRkVG9SZXNvdXJjZU1vZGVsKCkgewotCQl0aGlzLnJlc291cmNlTWFwcGluZy5zZXRDb252ZXJ0KCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbCgpIHsKLQkJdGhpcy5yZXNvdXJjZU1hcHBpbmcuc2V0Q29udmVydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlTWFwcGluZy5nZXRDb252ZXJ0VGV4dFJhbmdlKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydGVyTmFtZSgpIHsKLQkJcmV0dXJuIGdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSA9PSBudWxsID8gZ2V0RGVmYXVsdENvbnZlcnRlck5hbWUoKSA6IGdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb252ZXJ0ZXJOYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9DT05WRVJURVJfTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZENvbnZlcnRlck5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZShTdHJpbmcgbmV3U3BlY2lmaWVkQ29udmVydGVyTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkQ29udmVydGVyTmFtZSA9IHRoaXMuc3BlY2lmaWVkQ29udmVydGVyTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lID0gbmV3U3BlY2lmaWVkQ29udmVydGVyTmFtZTsKLQkJdGhpcy5yZXNvdXJjZU1hcHBpbmcuc2V0Q29udmVydChuZXdTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZENvbnZlcnRlck5hbWUsIG5ld1NwZWNpZmllZENvbnZlcnRlck5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lXyhTdHJpbmcgbmV3U3BlY2lmaWVkQ29udmVydGVyTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkQ29udmVydGVyTmFtZSA9IHRoaXMuc3BlY2lmaWVkQ29udmVydGVyTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lID0gbmV3U3BlY2lmaWVkQ29udmVydGVyTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZENvbnZlcnRlck5hbWUsIG5ld1NwZWNpZmllZENvbnZlcnRlck5hbWUpOwotCX0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjw/PiBnZXRDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb252ZXJ0ZXJUeXBlKCkgewotCQlpZiAodGhpcy5jb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyLk5PX0NPTlZFUlRFUjsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihTdHJpbmcgY29udmVydGVyVHlwZSkgewotCQlpZiAoZ2V0Q29udmVydGVyVHlwZSgpID09IGNvbnZlcnRlclR5cGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjw/PiBvbGRDb252ZXJ0ZXIgPSB0aGlzLmNvbnZlcnRlcjsKLQkJaWYgKG9sZENvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbnZlcnRlciA9IG51bGw7IC8vc2V0IHRvIG51bGwgbm93IHRvIGF2b2lkIHVwZGF0ZSB0cmlnZ2VyaW5nIGV2ZW50cwotCQkJcmVtb3ZlQ29udmVydGVyKG9sZENvbnZlcnRlci5nZXRUeXBlKCkpOwotCQl9Ci0JCUpwYUVPYmplY3QgcmVzb3VyY2VDb252ZXJ0ZXIgPSBidWlsZFJlc291cmNlQ29udmVydGVyKGNvbnZlcnRlclR5cGUpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjw/PiBuZXdDb252ZXJ0ZXIgPSBidWlsZENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlLCByZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXRoaXMuY29udmVydGVyID0gbmV3Q29udmVydGVyOwotCQlpZiAobmV3Q29udmVydGVyICE9IG51bGwpIHsKLQkJCWFkZENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlLCByZXNvdXJjZUNvbnZlcnRlcik7Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfUFJPUEVSVFksIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKLQl9Ci0KLQkvL1RPRE8geWVzLCBpIGtub3csIG1hbnkgaWYvZWxzZSB0eXBlIGNoZWNrcyBpbiB0aGUgbWV0aG9kcyBiZWxvdy4KLQkvL3dpbGwgbG9vayBhdCBmYWN0b3JpbmcgdGhpcyBvdXQgd2hlbiBJIGhhdmUgdGltZSBhZnRlciBNMyEgIEFsc28gRWNsaXBzZUxpbmtKYXZhQ29udmVydAotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbnZlcnRlcihTdHJpbmcgY29udmVydGVyVHlwZSkgewotCQlpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSKSB7Ci0JCQl0aGlzLnJlc291cmNlTWFwcGluZy5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUikgewotCQkJdGhpcy5yZXNvdXJjZU1hcHBpbmcuc2V0VHlwZUNvbnZlcnRlcihudWxsKTsKLQkJfQotCQllbHNlIGlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUikgewotCQkJdGhpcy5yZXNvdXJjZU1hcHBpbmcuc2V0T2JqZWN0VHlwZUNvbnZlcnRlcihudWxsKTsKLQkJfQotCQllbHNlIGlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVIpIHsKLQkJCXRoaXMucmVzb3VyY2VNYXBwaW5nLnNldFN0cnVjdENvbnZlcnRlcihudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhRU9iamVjdCBidWlsZFJlc291cmNlQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7Ci0JCWlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLkNVU1RPTV9DT05WRVJURVIpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJfQotCQllbHNlIGlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUikgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUikgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlLCBKcGFFT2JqZWN0IHJlc291cmNlQ29udmVydGVyKSB7Ci0JCWlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLkNVU1RPTV9DT05WRVJURVIpIHsKLQkJCXRoaXMucmVzb3VyY2VNYXBwaW5nLnNldENvbnZlcnRlcigoWG1sQ29udmVydGVyKSByZXNvdXJjZUNvbnZlcnRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUikgewotCQkJdGhpcy5yZXNvdXJjZU1hcHBpbmcuc2V0VHlwZUNvbnZlcnRlcigoWG1sVHlwZUNvbnZlcnRlcikgcmVzb3VyY2VDb252ZXJ0ZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSB7Ci0JCQl0aGlzLnJlc291cmNlTWFwcGluZy5zZXRPYmplY3RUeXBlQ29udmVydGVyKChYbWxPYmplY3RUeXBlQ29udmVydGVyKSByZXNvdXJjZUNvbnZlcnRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKSB7Ci0JCQl0aGlzLnJlc291cmNlTWFwcGluZy5zZXRTdHJ1Y3RDb252ZXJ0ZXIoKFhtbFN0cnVjdENvbnZlcnRlcikgcmVzb3VyY2VDb252ZXJ0ZXIpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjw/PiBidWlsZENvbnZlcnRlcihTdHJpbmcgY29udmVydGVyVHlwZSwgSnBhRU9iamVjdCByZXNvdXJjZUNvbnZlcnRlcikgewotCQlpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5OT19DT05WRVJURVIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLkNVU1RPTV9DT05WRVJURVIpIHsKLQkJCXJldHVybiBidWlsZEN1c3RvbUNvbnZlcnRlcigoWG1sQ29udmVydGVyKSByZXNvdXJjZUNvbnZlcnRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUikgewotCQkJcmV0dXJuIGJ1aWxkVHlwZUNvbnZlcnRlcigoWG1sVHlwZUNvbnZlcnRlcikgcmVzb3VyY2VDb252ZXJ0ZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSB7Ci0JCQlyZXR1cm4gYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKChYbWxPYmplY3RUeXBlQ29udmVydGVyKSByZXNvdXJjZUNvbnZlcnRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKSB7Ci0JCQlyZXR1cm4gYnVpbGRTdHJ1Y3RDb252ZXJ0ZXIoKFhtbFN0cnVjdENvbnZlcnRlcikgcmVzb3VyY2VDb252ZXJ0ZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENvbnZlcnRlcihPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjw/PiBuZXdDb252ZXJ0ZXIpIHsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4gb2xkQ29udmVydGVyID0gdGhpcy5jb252ZXJ0ZXI7Ci0JCXRoaXMuY29udmVydGVyID0gbmV3Q29udmVydGVyOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9QUk9QRVJUWSwgb2xkQ29udmVydGVyLCBuZXdDb252ZXJ0ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbENvbnZlcnRpYmxlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKLQkJdGhpcy5yZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZU1hcHBpbmc7Ci0JCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyTmFtZSA9IHRoaXMuZ2V0UmVzb3VyY2VDb252ZXJ0KCk7Ci0JCXRoaXMuY29udmVydGVyID0gdGhpcy5idWlsZENvbnZlcnRlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZV8odGhpcy5nZXRSZXNvdXJjZUNvbnZlcnQoKSk7Ci0JCWlmIChnZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKSA9PSBnZXRDb252ZXJ0ZXJUeXBlKCkpIHsKLQkJCXRoaXMuY29udmVydGVyLnVwZGF0ZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0Q29udmVydGVyKGJ1aWxkQ29udmVydGVyKCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VDb252ZXJ0KCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZU1hcHBpbmcgPT0gbnVsbCA/IG51bGwgOiB0aGlzLnJlc291cmNlTWFwcGluZy5nZXRDb252ZXJ0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKSB7Ci0JCWlmICh0aGlzLnJlc291cmNlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUjsKLQkJfQotCQllbHNlIGlmICh0aGlzLnJlc291cmNlTWFwcGluZy5nZXRUeXBlQ29udmVydGVyKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMucmVzb3VyY2VNYXBwaW5nLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMucmVzb3VyY2VNYXBwaW5nLmdldFN0cnVjdENvbnZlcnRlcigpICE9IG51bGwpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyPD8+IGJ1aWxkQ29udmVydGVyKCkgewotCQlpZiAodGhpcy5yZXNvdXJjZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGJ1aWxkQ3VzdG9tQ29udmVydGVyKHRoaXMucmVzb3VyY2VNYXBwaW5nLmdldENvbnZlcnRlcigpKTsKLQkJfQotCQllbHNlIGlmICh0aGlzLnJlc291cmNlTWFwcGluZy5nZXRUeXBlQ29udmVydGVyKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGJ1aWxkVHlwZUNvbnZlcnRlcih0aGlzLnJlc291cmNlTWFwcGluZy5nZXRUeXBlQ29udmVydGVyKCkpOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMucmVzb3VyY2VNYXBwaW5nLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKHRoaXMucmVzb3VyY2VNYXBwaW5nLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5yZXNvdXJjZU1hcHBpbmcuZ2V0U3RydWN0Q29udmVydGVyKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGJ1aWxkU3RydWN0Q29udmVydGVyKHRoaXMucmVzb3VyY2VNYXBwaW5nLmdldFN0cnVjdENvbnZlcnRlcigpKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGJ1aWxkQ3VzdG9tQ29udmVydGVyKFhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcikgewotCQlPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gbmV3IE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKHRoaXMpOwotCQljb250ZXh0Q29udmVydGVyLmluaXRpYWxpemUocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQlyZXR1cm4gY29udGV4dENvbnZlcnRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGJ1aWxkVHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyKSB7Ci0JCU9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gbmV3IE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcih0aGlzKTsKLQkJY29udGV4dENvbnZlcnRlci5pbml0aWFsaXplKHJlc291cmNlQ29udmVydGVyKTsKLQkJcmV0dXJuIGNvbnRleHRDb252ZXJ0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcikgewotCQlPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IG5ldyBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIodGhpcyk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuaW5pdGlhbGl6ZShyZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXJldHVybiBjb250ZXh0Q29udmVydGVyOwotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBidWlsZFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIpIHsKLQkJT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IG5ldyBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcih0aGlzKTsKLQkJY29udGV4dENvbnZlcnRlci5pbml0aWFsaXplKHJlc291cmNlQ29udmVydGVyKTsKLQkJcmV0dXJuIGNvbnRleHRDb252ZXJ0ZXI7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKioqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChnZXRDb252ZXJ0ZXIoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0Q29udmVydGVyKCkuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKGdldENvbnZlcnRlcigpICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRDb252ZXJ0ZXIoKS5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlpZiAoZ2V0Q29udmVydGVyKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldENvbnZlcnRlcigpLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkJCi0JLy8qKioqKioqKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCWlmIChnZXRDb252ZXJ0ZXIoKSAhPSBudWxsKSB7Ci0JCQlnZXRDb252ZXJ0ZXIoKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3NWEwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXI8VCBleHRlbmRzIFhtbE5hbWVkQ29udmVydGVyPgotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydGVyCi17Ci0JcHJvdGVjdGVkIFQgcmVzb3VyY2VDb252ZXJ0ZXI7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCQotCQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgVCBnZXRYbWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VDb252ZXJ0ZXI7Ci0JfQotCQotCXB1YmxpYyBjaGFyIGdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7Ci0JCXJldHVybiAnJCc7Ci0JfQotCi0JcHJvdGVjdGVkIEVudGl0eU1hcHBpbmdzIGdldEVudGl0eU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVudGl0eU1hcHBpbmdzKSBnZXRNYXBwaW5nRmlsZVJvb3QoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBuYW1lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQl0aGlzLnJlc291cmNlQ29udmVydGVyLnNldE5hbWUobmV3TmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UgaW50ZXJhY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFQgcmVzb3VyY2UpIHsKLQkJdGhpcy5yZXNvdXJjZUNvbnZlcnRlciA9IHJlc291cmNlOwotCQl0aGlzLm5hbWUgPSBnZXRSZXNvdXJjZU5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQl0aGlzLnNldE5hbWVfKGdldFJlc291cmNlTmFtZSgpKTsKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkQ29udmVydGVyKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VDb252ZXJ0ZXIuZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIGJvb2xlYW4gb3ZlcnJpZGVzKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyB0aGlzIGlzbid0IGlkZWFsLCBidXQgaXQgd2lsbCBoYXZlIHRvIGRvIHVudGlsIHdlIGhhdmUgZnVydGhlciBhZG9wdGVyIGlucHV0Ci0JCXJldHVybiB0aGlzLmdldE5hbWUoKS5lcXVhbHMoY29udmVydGVyLmdldE5hbWUoKSkgJiYgY29udmVydGVyIGluc3RhbmNlb2YgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBkdXBsaWNhdGVzKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlyZXR1cm4gKHRoaXMgIT0gY29udmVydGVyKQotCQkJCSYmICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLm5hbWUpCi0JCQkJJiYgdGhpcy5uYW1lLmVxdWFscyhjb252ZXJ0ZXIuZ2V0TmFtZSgpKQotCQkJCSYmICEgdGhpcy5vdmVycmlkZXMoY29udmVydGVyKQotCQkJCSYmICEgY29udmVydGVyLm92ZXJyaWRlcyh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUNvbnZlcnRlci5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NGE0ZjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlIGltcGxlbWVudHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIKLXsJCi0JcHJpdmF0ZSBmaW5hbCBYbWxDb252ZXJ0ZXJzSG9sZGVyIHJlc291cmNlQ29udmVydGVyc0hvbGRlcjsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gY3VzdG9tQ29udmVydGVyczsKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9iamVjdFR5cGVDb252ZXJ0ZXJzOwotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBzdHJ1Y3RDb252ZXJ0ZXJzOwotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gdHlwZUNvbnZlcnRlcnM7Ci0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyKFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sQ29udmVydGVyc0hvbGRlciByZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5yZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXIgPSByZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXI7Ci0JCXRoaXMuY3VzdG9tQ29udmVydGVycyA9IG5ldyBBcnJheUxpc3Q8T3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+KCk7Ci0JCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBuZXcgQXJyYXlMaXN0PE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4oKTsKLQkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJzID0gbmV3IEFycmF5TGlzdDxPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4oKTsKLQkJdGhpcy50eXBlQ29udmVydGVycyA9IG5ldyBBcnJheUxpc3Q8T3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPigpOwotCQl0aGlzLmluaXRpYWxpemVDdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZU9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVN0cnVjdENvbnZlcnRlcnMoKTsKLQkJdGhpcy5pbml0aWFsaXplVHlwZUNvbnZlcnRlcnMoKTsJCQotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGN1c3RvbUNvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbUNvbnZlcnRlcnMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gZ2V0Q3VzdG9tQ29udmVydGVycygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8T3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+KHRoaXMuY3VzdG9tQ29udmVydGVycyk7Ci0JfQotCi0JcHVibGljIGludCBjdXN0b21Db252ZXJ0ZXJzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9tQ29udmVydGVycy5zaXplKCk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGFkZEN1c3RvbUNvbnZlcnRlcihpbnQgaW5kZXgpIHsKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IHRoaXMuYnVpbGRDdXN0b21Db252ZXJ0ZXIocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQl0aGlzLmN1c3RvbUNvbnZlcnRlcnMuYWRkKGluZGV4LCBjb250ZXh0Q29udmVydGVyKTsKLQkJdGhpcy5yZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXIuZ2V0Q29udmVydGVycygpLmFkZChpbmRleCwgcmVzb3VyY2VDb252ZXJ0ZXIpOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoQ1VTVE9NX0NPTlZFUlRFUlNfTElTVCwgaW5kZXgsIGNvbnRleHRDb252ZXJ0ZXIpOwotCQlyZXR1cm4gY29udGV4dENvbnZlcnRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDdXN0b21Db252ZXJ0ZXIoaW50IGluZGV4LCBPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgY29udmVydGVyLCB0aGlzLmN1c3RvbUNvbnZlcnRlcnMsIENVU1RPTV9DT05WRVJURVJTX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEN1c3RvbUNvbnZlcnRlcihPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJdGhpcy5hZGRDdXN0b21Db252ZXJ0ZXIodGhpcy5jdXN0b21Db252ZXJ0ZXJzLnNpemUoKSwgY29udmVydGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDdXN0b21Db252ZXJ0ZXIoaW50IGluZGV4KSB7Ci0JCU9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIHJlbW92ZWRDb252ZXJ0ZXIgPSB0aGlzLmN1c3RvbUNvbnZlcnRlcnMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5yZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXIuZ2V0Q29udmVydGVycygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChDVVNUT01fQ09OVkVSVEVSU19MSVNULCBpbmRleCwgcmVtb3ZlZENvbnZlcnRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ3VzdG9tQ29udmVydGVyKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlcikgewotCQl0aGlzLnJlbW92ZUN1c3RvbUNvbnZlcnRlcih0aGlzLmN1c3RvbUNvbnZlcnRlcnMuaW5kZXhPZihjb252ZXJ0ZXIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb252ZXJ0ZXJfKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoY29udmVydGVyLCB0aGlzLmN1c3RvbUNvbnZlcnRlcnMsIENVU1RPTV9DT05WRVJURVJTX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVDdXN0b21Db252ZXJ0ZXIoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5jdXN0b21Db252ZXJ0ZXJzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnJlc291cmNlQ29udmVydGVyc0hvbGRlci5nZXRDb252ZXJ0ZXJzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlmaXJlSXRlbU1vdmVkKENVU1RPTV9DT05WRVJURVJTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbW92ZUN1c3RvbUNvbnZlcnRlcl8oaW50IGluZGV4LCBPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJbW92ZUl0ZW1Jbkxpc3QoaW5kZXgsIHRoaXMuY3VzdG9tQ29udmVydGVycy5pbmRleE9mKGNvbnZlcnRlciksIHRoaXMuY3VzdG9tQ29udmVydGVycywgQ1VTVE9NX0NPTlZFUlRFUlNfTElTVCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlQ29udmVydGVycy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4odGhpcy5vYmplY3RUeXBlQ29udmVydGVycyk7Ci0JfQotCi0JcHVibGljIGludCBvYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KSB7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCU9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IHRoaXMuYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcik7Ci0JCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcnMuYWRkKGluZGV4LCBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcik7Ci0JCXRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKGluZGV4LCByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIpOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoT0JKRUNUX1RZUEVfQ09OVkVSVEVSU19MSVNULCBpbmRleCwgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIpOwotCQlyZXR1cm4gY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkT2JqZWN0VHlwZUNvbnZlcnRlcihpbnQgaW5kZXgsIE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgY29udmVydGVyLCB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJzLCBPQkpFQ1RfVFlQRV9DT05WRVJURVJTX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlcikgewotCQl0aGlzLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIodGhpcy5vYmplY3RUeXBlQ29udmVydGVycy5zaXplKCksIGNvbnZlcnRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpIHsKLQkJT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIHJlbW92ZWRPYmplY3RUeXBlQ29udmVydGVyID0gdGhpcy5vYmplY3RUeXBlQ29udmVydGVycy5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLnJlc291cmNlQ29udmVydGVyc0hvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChPQkpFQ1RfVFlQRV9DT05WRVJURVJTX0xJU1QsIGluZGV4LCByZW1vdmVkT2JqZWN0VHlwZUNvbnZlcnRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCXRoaXMucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcih0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJzLmluZGV4T2YoY29udmVydGVyKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcl8oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoY29udmVydGVyLCB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJzLCBPQkpFQ1RfVFlQRV9DT05WRVJURVJTX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVPYmplY3RUeXBlQ29udmVydGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlmaXJlSXRlbU1vdmVkKE9CSkVDVF9UWVBFX0NPTlZFUlRFUlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcl8oaW50IGluZGV4LCBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCW1vdmVJdGVtSW5MaXN0KGluZGV4LCB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJzLmluZGV4T2YoY29udmVydGVyKSwgdGhpcy5vYmplY3RUeXBlQ29udmVydGVycywgT0JKRUNUX1RZUEVfQ09OVkVSVEVSU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBzdHJ1Y3RDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IGdldFN0cnVjdENvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPih0aGlzLnN0cnVjdENvbnZlcnRlcnMpOwotCX0KLQotCXB1YmxpYyBpbnQgc3RydWN0Q29udmVydGVyc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnN0cnVjdENvbnZlcnRlcnMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBhZGRTdHJ1Y3RDb252ZXJ0ZXIoaW50IGluZGV4KSB7Ci0JCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCU9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkU3RydWN0Q29udmVydGVyKHJlc291cmNlU3RydWN0Q29udmVydGVyKTsKLQkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJzLmFkZChpbmRleCwgY29udGV4dFN0cnVjdENvbnZlcnRlcik7Ci0JCXRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQoaW5kZXgsIHJlc291cmNlU3RydWN0Q29udmVydGVyKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKFNUUlVDVF9DT05WRVJURVJTX0xJU1QsIGluZGV4LCBjb250ZXh0U3RydWN0Q29udmVydGVyKTsKLQkJcmV0dXJuIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3RydWN0Q29udmVydGVyKGludCBpbmRleCwgT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGNvbnZlcnRlciwgdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJzLCBTVFJVQ1RfQ09OVkVSVEVSU19MSVNUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdHJ1Y3RDb252ZXJ0ZXIoT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCXRoaXMuYWRkU3RydWN0Q29udmVydGVyKHRoaXMuc3RydWN0Q29udmVydGVycy5zaXplKCksIGNvbnZlcnRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3RydWN0Q29udmVydGVyKGludCBpbmRleCkgewotCQlPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciByZW1vdmVkU3RydWN0Q29udmVydGVyID0gdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJzLnJlbW92ZShpbmRleCk7Ci0JCXRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoU1RSVUNUX0NPTlZFUlRFUlNfTElTVCwgaW5kZXgsIHJlbW92ZWRTdHJ1Y3RDb252ZXJ0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0cnVjdENvbnZlcnRlcihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJdGhpcy5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIodGhpcy5zdHJ1Y3RDb252ZXJ0ZXJzLmluZGV4T2YoY29udmVydGVyKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3RydWN0Q29udmVydGVyXyhFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGNvbnZlcnRlciwgdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJzLCBTVFJVQ1RfQ09OVkVSVEVSU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlU3RydWN0Q29udmVydGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3RydWN0Q29udmVydGVycywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5yZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChTVFJVQ1RfQ09OVkVSVEVSU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1vdmVTdHJ1Y3RDb252ZXJ0ZXJfKGludCBpbmRleCwgT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCW1vdmVJdGVtSW5MaXN0KGluZGV4LCB0aGlzLnN0cnVjdENvbnZlcnRlcnMuaW5kZXhPZihjb252ZXJ0ZXIpLCB0aGlzLnN0cnVjdENvbnZlcnRlcnMsIFNUUlVDVF9DT05WRVJURVJTX0xJU1QpOwotCX0KLQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IHR5cGVDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gdGhpcy50eXBlQ29udmVydGVycy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gZ2V0VHlwZUNvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4odGhpcy50eXBlQ29udmVydGVycyk7Ci0JfQotCi0JcHVibGljIGludCB0eXBlQ29udmVydGVyc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVDb252ZXJ0ZXJzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGFkZFR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KSB7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCU9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlciA9IHRoaXMuYnVpbGRUeXBlQ29udmVydGVyKHJlc291cmNlVHlwZUNvbnZlcnRlcik7Ci0JCXRoaXMudHlwZUNvbnZlcnRlcnMuYWRkKGluZGV4LCBjb250ZXh0VHlwZUNvbnZlcnRlcik7Ci0JCXRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKGluZGV4LCByZXNvdXJjZVR5cGVDb252ZXJ0ZXIpOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoVFlQRV9DT05WRVJURVJTX0xJU1QsIGluZGV4LCBjb250ZXh0VHlwZUNvbnZlcnRlcik7Ci0JCXJldHVybiBjb250ZXh0VHlwZUNvbnZlcnRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlQ29udmVydGVyKGludCBpbmRleCwgT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBjb252ZXJ0ZXIsIHRoaXMudHlwZUNvbnZlcnRlcnMsIFRZUEVfQ09OVkVSVEVSU19MSVNUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlQ29udmVydGVyKE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJdGhpcy5hZGRUeXBlQ29udmVydGVyKHRoaXMudHlwZUNvbnZlcnRlcnMuc2l6ZSgpLCBjb252ZXJ0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KSB7Ci0JCU9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciByZW1vdmVkVHlwZUNvbnZlcnRlciA9IHRoaXMudHlwZUNvbnZlcnRlcnMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5yZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoVFlQRV9DT05WRVJURVJTX0xJU1QsIGluZGV4LCByZW1vdmVkVHlwZUNvbnZlcnRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVHlwZUNvbnZlcnRlcihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCXRoaXMucmVtb3ZlVHlwZUNvbnZlcnRlcih0aGlzLnR5cGVDb252ZXJ0ZXJzLmluZGV4T2YoY29udmVydGVyKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVHlwZUNvbnZlcnRlcl8oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoY29udmVydGVyLCB0aGlzLnR5cGVDb252ZXJ0ZXJzLCBUWVBFX0NPTlZFUlRFUlNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVR5cGVDb252ZXJ0ZXIoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy50eXBlQ29udmVydGVycywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5yZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoVFlQRV9DT05WRVJURVJTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVR5cGVDb252ZXJ0ZXJfKGludCBpbmRleCwgT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlcikgewotCQltb3ZlSXRlbUluTGlzdChpbmRleCwgdGhpcy50eXBlQ29udmVydGVycy5pbmRleE9mKGNvbnZlcnRlciksIHRoaXMudHlwZUNvbnZlcnRlcnMsIFRZUEVfQ09OVkVSVEVSU19MSVNUKTsKLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDdXN0b21Db252ZXJ0ZXJzKCkgewotCQlmb3IgKFhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlciA6IHRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldENvbnZlcnRlcnMoKSkgewotCQkJdGhpcy5jdXN0b21Db252ZXJ0ZXJzLmFkZCh0aGlzLmJ1aWxkQ3VzdG9tQ29udmVydGVyKHJlc291cmNlQ29udmVydGVyKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgewotCQlmb3IgKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIgOiB0aGlzLnJlc291cmNlQ29udmVydGVyc0hvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpKSB7Ci0JCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJzLmFkZCh0aGlzLmJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlcihyZXNvdXJjZUNvbnZlcnRlcikpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTdHJ1Y3RDb252ZXJ0ZXJzKCkgewotCQlmb3IgKFhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlciA6IHRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKSkgewotCQkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJzLmFkZCh0aGlzLmJ1aWxkU3RydWN0Q29udmVydGVyKHJlc291cmNlQ29udmVydGVyKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVR5cGVDb252ZXJ0ZXJzKCkgewotCQlmb3IgKFhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIgOiB0aGlzLnJlc291cmNlQ29udmVydGVyc0hvbGRlci5nZXRUeXBlQ29udmVydGVycygpKSB7Ci0JCQl0aGlzLnR5cGVDb252ZXJ0ZXJzLmFkZCh0aGlzLmJ1aWxkVHlwZUNvbnZlcnRlcihyZXNvdXJjZUNvbnZlcnRlcikpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBidWlsZEN1c3RvbUNvbnZlcnRlcihYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIpIHsKLQkJT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IG5ldyBPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcih0aGlzKTsKLQkJY29udGV4dENvbnZlcnRlci5pbml0aWFsaXplKHJlc291cmNlQ29udmVydGVyKTsKLQkJcmV0dXJuIGNvbnRleHRDb252ZXJ0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBidWlsZFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcikgewotCQlPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IG5ldyBPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIodGhpcyk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuaW5pdGlhbGl6ZShyZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXJldHVybiBjb250ZXh0Q29udmVydGVyOwotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIpIHsKLQkJT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBuZXcgT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKHRoaXMpOwotCQljb250ZXh0Q29udmVydGVyLmluaXRpYWxpemUocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQlyZXR1cm4gY29udGV4dENvbnZlcnRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgYnVpbGRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlQ29udmVydGVyKSB7Ci0JCU9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBuZXcgT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIodGhpcyk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuaW5pdGlhbGl6ZShyZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXJldHVybiBjb250ZXh0Q29udmVydGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJdGhpcy51cGRhdGVDdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCXRoaXMudXBkYXRlT2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJdGhpcy51cGRhdGVTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCXRoaXMudXBkYXRlVHlwZUNvbnZlcnRlcnMoKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDdXN0b21Db252ZXJ0ZXJzKCkgewotCQlDb2xsZWN0aW9uPE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBjb250ZXh0Q29udmVydGVyc1RvUmVtb3ZlID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oY3VzdG9tQ29udmVydGVycygpKTsKLQkJQ29sbGVjdGlvbjxPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gY29udGV4dENvbnZlcnRlcnNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3Q8T3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+KCk7Ci0JCWludCByZXNvdXJjZUluZGV4ID0gMDsKLQkJCi0JCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBYTUwgY29udmVyc2lvbiB2YWx1ZXMgKHRvIHByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbikKLQkJTGlzdDxYbWxDb252ZXJ0ZXI+IHhtbENvbnZlcnRlcnMgPSB0aGlzLnJlc291cmNlQ29udmVydGVyc0hvbGRlci5nZXRDb252ZXJ0ZXJzKCk7Ci0JCWZvciAoWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyIDogeG1sQ29udmVydGVycy50b0FycmF5KG5ldyBYbWxDb252ZXJ0ZXJbeG1sQ29udmVydGVycy5zaXplKCldKSkgewotCQkJYm9vbGVhbiBjb250ZXh0Q29udmVydGVyRm91bmQgPSBmYWxzZTsKLQkJCWZvciAoT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA6IGNvbnRleHRDb252ZXJ0ZXJzVG9SZW1vdmUpIHsKLQkJCQlpZiAoY29udGV4dENvbnZlcnRlci5nZXRYbWxSZXNvdXJjZSgpID09IHJlc291cmNlQ29udmVydGVyKSB7Ci0JCQkJCW1vdmVDdXN0b21Db252ZXJ0ZXJfKHJlc291cmNlSW5kZXgsIGNvbnRleHRDb252ZXJ0ZXIpOwotCQkJCQljb250ZXh0Q29udmVydGVyc1RvUmVtb3ZlLnJlbW92ZShjb250ZXh0Q29udmVydGVyKTsKLQkJCQkJY29udGV4dENvbnZlcnRlcnNUb1VwZGF0ZS5hZGQoY29udGV4dENvbnZlcnRlcik7Ci0JCQkJCWNvbnRleHRDb252ZXJ0ZXJGb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghY29udGV4dENvbnZlcnRlckZvdW5kKSB7Ci0JCQkJYWRkQ3VzdG9tQ29udmVydGVyKHRoaXMuYnVpbGRDdXN0b21Db252ZXJ0ZXIocmVzb3VyY2VDb252ZXJ0ZXIpKTsKLQkJCX0KLQkJCXJlc291cmNlSW5kZXgrKzsKLQkJfQotCQlmb3IgKE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgOiBjb250ZXh0Q29udmVydGVyc1RvUmVtb3ZlKSB7Ci0JCQlyZW1vdmVDb252ZXJ0ZXJfKGNvbnRleHRDb252ZXJ0ZXIpOwotCQl9Ci0JCS8vZmlyc3QgaGFuZGxlIGFkZGluZy9yZW1vdmluZyBvZiB0aGUgY29udmVydGVycywgdGhlbiB1cGRhdGUgdGhlIG90aGVycyBsYXN0LCAKLQkJLy90aGlzIGNhdXNlcyBsZXNzIGNodXJuIGluIHRoZSB1cGRhdGUgcHJvY2VzcwotCQlmb3IgKE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgOiBjb250ZXh0Q29udmVydGVyc1RvVXBkYXRlKSB7Ci0JCQljb250ZXh0Q29udmVydGVyLnVwZGF0ZSgpOwotCQl9CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPYmplY3RUeXBlQ29udmVydGVycygpIHsKLQkJQ29sbGVjdGlvbjxPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IGNvbnRleHRDb252ZXJ0ZXJzVG9SZW1vdmUgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihvYmplY3RUeXBlQ29udmVydGVycygpKTsKLQkJQ29sbGVjdGlvbjxPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IGNvbnRleHRDb252ZXJ0ZXJzVG9VcGRhdGUgPSBuZXcgQXJyYXlMaXN0PE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4oKTsKLQkJaW50IHJlc291cmNlSW5kZXggPSAwOwotCi0JCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBYTUwgY29udmVydGVycyAodG8gcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKQotCQlMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IHhtbENvbnZlcnRlcnMgPSB0aGlzLnJlc291cmNlQ29udmVydGVyc0hvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpOwotCQlmb3IgKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgeG1sQ29udmVydGVyIDogeG1sQ29udmVydGVycy50b0FycmF5KG5ldyBYbWxPYmplY3RUeXBlQ29udmVydGVyW3htbENvbnZlcnRlcnMuc2l6ZSgpXSkpIHsKLQkJCWJvb2xlYW4gY29udGV4dENvbnZlcnRlckZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA6IGNvbnRleHRDb252ZXJ0ZXJzVG9SZW1vdmUpIHsKLQkJCQlpZiAoY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0WG1sUmVzb3VyY2UoKSA9PSB4bWxDb252ZXJ0ZXIpIHsKLQkJCQkJbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXJfKHJlc291cmNlSW5kZXgsIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyKTsKLQkJCQkJY29udGV4dENvbnZlcnRlcnNUb1JlbW92ZS5yZW1vdmUoY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIpOwotCQkJCQljb250ZXh0Q29udmVydGVyc1RvVXBkYXRlLmFkZChjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcik7Ci0JCQkJCWNvbnRleHRDb252ZXJ0ZXJGb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghY29udGV4dENvbnZlcnRlckZvdW5kKSB7Ci0JCQkJYWRkT2JqZWN0VHlwZUNvbnZlcnRlcih0aGlzLmJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlcih4bWxDb252ZXJ0ZXIpKTsKLQkJCX0KLQkJCXJlc291cmNlSW5kZXgrKzsKLQkJfQotCQlmb3IgKE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA6IGNvbnRleHRDb252ZXJ0ZXJzVG9SZW1vdmUpIHsKLQkJCXJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXJfKGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyKTsKLQkJfQotCQkvL2ZpcnN0IGhhbmRsZSBhZGRpbmcvcmVtb3Zpbmcgb2YgdGhlIGNvbnZlcnRlcnMsIHRoZW4gdXBkYXRlIHRoZSBvdGhlcnMgbGFzdCwgCi0JCS8vdGhpcyBjYXVzZXMgbGVzcyBjaHVybiBpbiB0aGUgdXBkYXRlIHByb2Nlc3MKLQkJZm9yIChPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgOiBjb250ZXh0Q29udmVydGVyc1RvVXBkYXRlKSB7Ci0JCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci51cGRhdGUoKTsKLQkJfQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVHlwZUNvbnZlcnRlcnMoKSB7Ci0JCUNvbGxlY3Rpb248T3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBjb250ZXh0Q29udmVydGVyc1RvUmVtb3ZlID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odHlwZUNvbnZlcnRlcnMoKSk7Ci0JCUNvbGxlY3Rpb248T3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBjb250ZXh0Q29udmVydGVyc1RvVXBkYXRlID0gbmV3IEFycmF5TGlzdDxPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+KCk7Ci0JCWludCByZXNvdXJjZUluZGV4ID0gMDsKLQkJCi0JCUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4geG1sQ29udmVydGVycyA9IHRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCWZvciAoWG1sVHlwZUNvbnZlcnRlciB4bWxDb252ZXJ0ZXIgOiB4bWxDb252ZXJ0ZXJzLnRvQXJyYXkobmV3IFhtbFR5cGVDb252ZXJ0ZXJbeG1sQ29udmVydGVycy5zaXplKCldKSkgewotCQkJYm9vbGVhbiBjb250ZXh0VHlwZUNvbnZlcnRlckZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlciA6IGNvbnRleHRDb252ZXJ0ZXJzVG9SZW1vdmUpIHsKLQkJCQlpZiAoY29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0WG1sUmVzb3VyY2UoKSA9PSB4bWxDb252ZXJ0ZXIpIHsKLQkJCQkJbW92ZVR5cGVDb252ZXJ0ZXJfKHJlc291cmNlSW5kZXgsIGNvbnRleHRUeXBlQ29udmVydGVyKTsKLQkJCQkJY29udGV4dENvbnZlcnRlcnNUb1JlbW92ZS5yZW1vdmUoY29udGV4dFR5cGVDb252ZXJ0ZXIpOwotCQkJCQljb250ZXh0Q29udmVydGVyc1RvVXBkYXRlLmFkZChjb250ZXh0VHlwZUNvbnZlcnRlcik7Ci0JCQkJCWNvbnRleHRUeXBlQ29udmVydGVyRm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWNvbnRleHRUeXBlQ29udmVydGVyRm91bmQpIHsKLQkJCQlhZGRUeXBlQ29udmVydGVyKHRoaXMuYnVpbGRUeXBlQ29udmVydGVyKHhtbENvbnZlcnRlcikpOwotCQkJfQotCQkJcmVzb3VyY2VJbmRleCsrOwotCQl9Ci0JCWZvciAoT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyIDogY29udGV4dENvbnZlcnRlcnNUb1JlbW92ZSkgewotCQkJcmVtb3ZlVHlwZUNvbnZlcnRlcl8oY29udGV4dFR5cGVDb252ZXJ0ZXIpOwotCQl9Ci0JCS8vZmlyc3QgaGFuZGxlIGFkZGluZy9yZW1vdmluZyBvZiB0aGUgY29udmVydGVycywgdGhlbiB1cGRhdGUgdGhlIG90aGVycyBsYXN0LCAKLQkJLy90aGlzIGNhdXNlcyBsZXNzIGNodXJuIGluIHRoZSB1cGRhdGUgcHJvY2VzcwotCQlmb3IgKE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlciA6IGNvbnRleHRDb252ZXJ0ZXJzVG9VcGRhdGUpIHsKLQkJCWNvbnRleHRUeXBlQ29udmVydGVyLnVwZGF0ZSgpOwotCQl9CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdHJ1Y3RDb252ZXJ0ZXJzKCkgewotCQlDb2xsZWN0aW9uPE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBjb250ZXh0Q29udmVydGVyc1RvUmVtb3ZlID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3RydWN0Q29udmVydGVycygpKTsKLQkJQ29sbGVjdGlvbjxPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gY29udGV4dENvbnZlcnRlcnNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3Q8T3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+KCk7Ci0JCWludCByZXNvdXJjZUluZGV4ID0gMDsKLQkJCi0JCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBYTUwgY29udmVydGVycyAodG8gcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKQotCQlMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4geG1sQ29udmVydGVycyA9IHRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKTsKLQkJZm9yIChYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIgOiB4bWxDb252ZXJ0ZXJzLnRvQXJyYXkobmV3IFhtbFN0cnVjdENvbnZlcnRlclt4bWxDb252ZXJ0ZXJzLnNpemUoKV0pKSB7Ci0JCQlib29sZWFuIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJGb3VuZCA9IGZhbHNlOwotCQkJZm9yIChPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyIDogY29udGV4dENvbnZlcnRlcnNUb1JlbW92ZSkgewotCQkJCWlmIChjb250ZXh0U3RydWN0Q29udmVydGVyLmdldFhtbFJlc291cmNlKCkgPT0gcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIpIHsKLQkJCQkJbW92ZVN0cnVjdENvbnZlcnRlcl8ocmVzb3VyY2VJbmRleCwgY29udGV4dFN0cnVjdENvbnZlcnRlcik7Ci0JCQkJCWNvbnRleHRDb252ZXJ0ZXJzVG9SZW1vdmUucmVtb3ZlKGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIpOwotCQkJCQljb250ZXh0Q29udmVydGVyc1RvVXBkYXRlLmFkZChjb250ZXh0U3RydWN0Q29udmVydGVyKTsKLQkJCQkJY29udGV4dFN0cnVjdENvbnZlcnRlckZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFjb250ZXh0U3RydWN0Q29udmVydGVyRm91bmQpIHsKLQkJCQlhZGRTdHJ1Y3RDb252ZXJ0ZXIodGhpcy5idWlsZFN0cnVjdENvbnZlcnRlcihyZXNvdXJjZVN0cnVjdENvbnZlcnRlcikpOwotCQkJfQotCQkJcmVzb3VyY2VJbmRleCsrOwotCQl9Ci0JCWZvciAoT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udGV4dFN0cnVjdENvbnZlcnRlciA6IGNvbnRleHRDb252ZXJ0ZXJzVG9SZW1vdmUpIHsKLQkJCXJlbW92ZVN0cnVjdENvbnZlcnRlcl8oY29udGV4dFN0cnVjdENvbnZlcnRlcik7Ci0JCX0KLQkJLy9maXJzdCBoYW5kbGUgYWRkaW5nL3JlbW92aW5nIG9mIHRoZSBjb252ZXJ0ZXJzLCB0aGVuIHVwZGF0ZSB0aGUgb3RoZXJzIGxhc3QsIAotCQkvL3RoaXMgY2F1c2VzIGxlc3MgY2h1cm4gaW4gdGhlIHVwZGF0ZSBwcm9jZXNzCi0JCWZvciAoT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udGV4dFN0cnVjdENvbnZlcnRlciA6IGNvbnRleHRDb252ZXJ0ZXJzVG9VcGRhdGUpIHsKLQkJCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIudXBkYXRlKCk7Ci0JCX0JCi0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKioqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJdGhpcy5jcmVhdGVSZW5hbWVPYmplY3RUeXBlQ29udmVydGVyRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY3JlYXRlUmVuYW1lVHlwZUNvbnZlcnRlckVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZVJlbmFtZVN0cnVjdENvbnZlcnRlckVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZVJlbmFtZUN1c3RvbUNvbnZlcnRlckVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lT2JqZWN0VHlwZUNvbnZlcnRlckVkaXRzKGZpbmFsIElUeXBlIG9yaWdpbmFsVHlwZSwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvYmplY3RUeXBlQ29udmVydGVyKSB7Ci0JCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVDb252ZXJ0ZXJFZGl0cyhmaW5hbCBJVHlwZSBvcmlnaW5hbFR5cGUsIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KGdldFR5cGVDb252ZXJ0ZXJzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgdHlwZUNvbnZlcnRlcikgewotCQkJCQlyZXR1cm4gdHlwZUNvbnZlcnRlci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVTdHJ1Y3RDb252ZXJ0ZXJFZGl0cyhmaW5hbCBJVHlwZSBvcmlnaW5hbFR5cGUsIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oZ2V0U3RydWN0Q29udmVydGVycygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgc3RydWN0Q29udmVydGVyKSB7Ci0JCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lQ3VzdG9tQ29udmVydGVyRWRpdHMoZmluYWwgSVR5cGUgb3JpZ2luYWxUeXBlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KGdldEN1c3RvbUNvbnZlcnRlcnMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGN1c3RvbUNvbnZlcnRlcikgewotCQkJCQlyZXR1cm4gY3VzdG9tQ29udmVydGVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQl0aGlzLmNyZWF0ZU1vdmVPYmplY3RUeXBlQ29udmVydGVyRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCXRoaXMuY3JlYXRlTW92ZVR5cGVDb252ZXJ0ZXJFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJdGhpcy5jcmVhdGVNb3ZlU3RydWN0Q29udmVydGVyRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCXRoaXMuY3JlYXRlTW92ZUN1c3RvbUNvbnZlcnRlckVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZU9iamVjdFR5cGVDb252ZXJ0ZXJFZGl0cyhmaW5hbCBJVHlwZSBvcmlnaW5hbFR5cGUsIGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PihnZXRPYmplY3RUeXBlQ29udmVydGVycygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9iamVjdFR5cGVDb252ZXJ0ZXIpIHsKLQkJCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlQ29udmVydGVyRWRpdHMoZmluYWwgSVR5cGUgb3JpZ2luYWxUeXBlLCBmaW5hbCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oZ2V0VHlwZUNvbnZlcnRlcnMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciB0eXBlQ29udmVydGVyKSB7Ci0JCQkJCXJldHVybiB0eXBlQ29udmVydGVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlU3RydWN0Q29udmVydGVyRWRpdHMoZmluYWwgSVR5cGUgb3JpZ2luYWxUeXBlLCBmaW5hbCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PihnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBzdHJ1Y3RDb252ZXJ0ZXIpIHsKLQkJCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZUN1c3RvbUNvbnZlcnRlckVkaXRzKGZpbmFsIElUeXBlIG9yaWdpbmFsVHlwZSwgZmluYWwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oZ2V0Q3VzdG9tQ29udmVydGVycygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY3VzdG9tQ29udmVydGVyKSB7Ci0JCQkJCXJldHVybiBjdXN0b21Db252ZXJ0ZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXRoaXMuY3JlYXRlT2JqZWN0VHlwZUNvbnZlcnRlclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJdGhpcy5jcmVhdGVUeXBlQ29udmVydGVyUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZVN0cnVjdENvbnZlcnRlclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJdGhpcy5jcmVhdGVDdXN0b21Db252ZXJ0ZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVPYmplY3RUeXBlQ29udmVydGVyUmVuYW1lUGFja2FnZUVkaXRzKGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PihnZXRPYmplY3RUeXBlQ29udmVydGVycygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9iamVjdFR5cGVDb252ZXJ0ZXIpIHsKLQkJCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlVHlwZUNvbnZlcnRlclJlbmFtZVBhY2thZ2VFZGl0cyhmaW5hbCBJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oZ2V0VHlwZUNvbnZlcnRlcnMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciB0eXBlQ29udmVydGVyKSB7Ci0JCQkJCXJldHVybiB0eXBlQ29udmVydGVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVN0cnVjdENvbnZlcnRlclJlbmFtZVBhY2thZ2VFZGl0cyhmaW5hbCBJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PihnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBzdHJ1Y3RDb252ZXJ0ZXIpIHsKLQkJCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDdXN0b21Db252ZXJ0ZXJSZW5hbWVQYWNrYWdlRWRpdHMoZmluYWwgSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oZ2V0Q3VzdG9tQ29udmVydGVycygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY3VzdG9tQ29udmVydGVyKSB7Ci0JCQkJCXJldHVybiBjdXN0b21Db252ZXJ0ZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCS8vKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXIuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMGE4MGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgZXh0ZW5kcyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjxYbWxDb252ZXJ0ZXI+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcgotewkKLQlwcml2YXRlIFN0cmluZyBjb252ZXJ0ZXJDbGFzczsKLQkKLQlwcml2YXRlIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGNvbnZlcnRlclBlcnNpc3RlbnRUeXBlOwotCQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUjsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNvbnZlcnRlciBjbGFzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ2xhc3M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlckNsYXNzKFN0cmluZyBuZXdDb252ZXJ0ZXJDbGFzcykgewotCQlTdHJpbmcgb2xkQ29udmVydGVyQ2xhc3MgPSB0aGlzLmNvbnZlcnRlckNsYXNzOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gbmV3Q29udmVydGVyQ2xhc3M7Ci0JCXRoaXMucmVzb3VyY2VDb252ZXJ0ZXIuc2V0Q2xhc3NOYW1lKG5ld0NvbnZlcnRlckNsYXNzKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfQ0xBU1NfUFJPUEVSVFksIG9sZENvbnZlcnRlckNsYXNzLCBuZXdDb252ZXJ0ZXJDbGFzcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldENvbnZlcnRlckNsYXNzXyhTdHJpbmcgbmV3Q29udmVydGVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZENvbnZlcnRlckNsYXNzID0gdGhpcy5jb252ZXJ0ZXJDbGFzczsKLQkJdGhpcy5jb252ZXJ0ZXJDbGFzcyA9IG5ld0NvbnZlcnRlckNsYXNzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSwgb2xkQ29udmVydGVyQ2xhc3MsIG5ld0NvbnZlcnRlckNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0Q29udmVydGVySmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eU1hcHBpbmdzKCkucmVzb2x2ZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKHRoaXMuY29udmVydGVyQ2xhc3MpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxDb252ZXJ0ZXIgeG1sUmVzb3VyY2UpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSh4bWxSZXNvdXJjZSk7Ci0JCXRoaXMuY29udmVydGVyQ2xhc3MgPSBnZXRSZXNvdXJjZUNsYXNzTmFtZSgpOwotCQl0aGlzLmNvbnZlcnRlclBlcnNpc3RlbnRUeXBlID0gdGhpcy5nZXRDb252ZXJ0ZXJKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQlzZXRDb252ZXJ0ZXJDbGFzc18oZ2V0UmVzb3VyY2VDbGFzc05hbWUoKSk7Ci0JCXVwZGF0ZUNvbnZlcnRlclBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVydGVyLmdldENsYXNzTmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb252ZXJ0ZXJQZXJzaXN0ZW50VHlwZSgpIHsKLQkJdGhpcy5jb252ZXJ0ZXJQZXJzaXN0ZW50VHlwZSA9IHRoaXMuZ2V0Q29udmVydGVySmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl2YWxpZGF0ZUNvbnZlcnRlckNsYXNzKG1lc3NhZ2VzKTsKLQl9Ci0vL1RPRE8gdmFsaWRhdGUgY29udmVydGVyIGNsYXNzCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ29udmVydGVyQ2xhc3MoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLS8vCQlpZiAoIWdldFJlc291cmNlQ29udmVydGVyKCkuaW1wbGVtZW50c0NvbnZlcnRlcigpKSB7Ci0vLwkJCW1lc3NhZ2VzLmFkZCgKLS8vCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0vLwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLS8vCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5DT05WRVJURVJfQ0xBU1NfSU1QTEVNRU5UU19DT05WRVJURVIsCi0vLwkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmNvbnZlcnRlckNsYXNzfSwKLS8vCQkJCQl0aGlzLCAKLS8vCQkJCQlnZXRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZSgpCi0vLwkJCQkpCi0vLwkJCSk7Ci0vLwkJfQotCX0KLQkKLS8vCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKSB7Ci0vLwkJcmV0dXJuIGdldFJlc291cmNlQ29udmVydGVyKCkuZ2V0Q2xhc3NOYW1lVGV4dFJhbmdlKCk7Ci0vLwl9Ci0KLQotCS8vKioqKioqKioqKioqKioqKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKHRoaXMuaXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIGdldFhtbFJlc291cmNlKCkuY3JlYXRlUmVuYW1lRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlpZiAodGhpcy5pc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChuZXdQYWNrYWdlLmdldEVsZW1lbnROYW1lKCkpKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gZ2V0WG1sUmVzb3VyY2UoKS5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChuZXdOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKHRoaXMuaXNJbihvcmlnaW5hbFBhY2thZ2UpKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChuZXdOYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZvcihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJaWYgKHRoaXMuY29udmVydGVyUGVyc2lzdGVudFR5cGUgIT0gbnVsbCAmJiB0aGlzLmNvbnZlcnRlclBlcnNpc3RlbnRUeXBlLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHModHlwZU5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7CQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW4oSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJaWYgKHRoaXMuY29udmVydGVyUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuY29udmVydGVyUGVyc2lzdGVudFR5cGUuaXNJbihwYWNrYWdlRnJhZ21lbnQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ3VzdG9taXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ3VzdG9taXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWYzM2ZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQ3VzdG9taXplciBleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ3VzdG9taXplcgotewotCXByb3RlY3RlZCBmaW5hbCBYbWxDdXN0b21pemVySG9sZGVyIHJlc291cmNlOwotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzOwotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdEN1c3RvbWl6ZXJDbGFzczsKLQkKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgY3VzdG9taXplclBlcnNpc3RlbnRUeXBlOwotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ3VzdG9taXplcihPcm1UeXBlTWFwcGluZyBwYXJlbnQsIFhtbEN1c3RvbWl6ZXJIb2xkZXIgcmVzb3VyY2UsIEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIgamF2YUN1c3RvbWl6ZXIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCQl0aGlzLmRlZmF1bHRDdXN0b21pemVyQ2xhc3MgPSBnZXRKYXZhQ3VzdG9taXplckNsYXNzKGphdmFDdXN0b21pemVyKTsKLQkJdGhpcy5zcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MgPSBnZXRSZXNvdXJjZUN1c3RvbWl6ZXJDbGFzcygpOwotCQl0aGlzLmN1c3RvbWl6ZXJQZXJzaXN0ZW50VHlwZSA9IGdldFJlc291cmNlQ3VzdG9taXplclBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBjaGFyIGdldEN1c3RvbWl6ZXJDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7Ci0JCXJldHVybiAnJCc7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9taXplckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MgPT0gbnVsbCA/IHRoaXMuZGVmYXVsdEN1c3RvbWl6ZXJDbGFzcyA6IHRoaXMuc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRDdXN0b21pemVyQ2xhc3M7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoU3RyaW5nIG5ld0RlZmF1bHRDdXN0b21pemVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRDdXN0b21pemVyQ2xhc3MgPSB0aGlzLmRlZmF1bHRDdXN0b21pemVyQ2xhc3M7Ci0JCXRoaXMuZGVmYXVsdEN1c3RvbWl6ZXJDbGFzcyA9IG5ld0RlZmF1bHRDdXN0b21pemVyQ2xhc3M7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9DVVNUT01JWkVSX0NMQVNTX1BST1BFUlRZLCBvbGREZWZhdWx0Q3VzdG9taXplckNsYXNzLCBuZXdEZWZhdWx0Q3VzdG9taXplckNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKFN0cmluZyBuZXdDdXN0b21pemVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZEN1c3RvbWl6ZXJDbGFzcyA9IHRoaXMuc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzOwotCQl0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyA9IG5ld0N1c3RvbWl6ZXJDbGFzczsKLQkJaWYgKG9sZEN1c3RvbWl6ZXJDbGFzcyAhPSBuZXdDdXN0b21pemVyQ2xhc3MpIHsKLQkJCWlmICh0aGlzLmdldFJlc291cmNlQ3VzdG9taXplcigpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldFJlc291cmNlQ3VzdG9taXplcigpLnNldENsYXNzTmFtZShuZXdDdXN0b21pemVyQ2xhc3MpOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldFJlc291cmNlQ3VzdG9taXplcigpLmlzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVSZXNvdXJjZUN1c3RvbWl6ZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdDdXN0b21pemVyQ2xhc3MgIT0gbnVsbCkgewotCQkJCWFkZFJlc291cmNlQ3VzdG9taXplcigpOwotCQkJCWdldFJlc291cmNlQ3VzdG9taXplcigpLnNldENsYXNzTmFtZShuZXdDdXN0b21pemVyQ2xhc3MpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFksIG9sZEN1c3RvbWl6ZXJDbGFzcywgbmV3Q3VzdG9taXplckNsYXNzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzXyhTdHJpbmcgbmV3Q3VzdG9taXplckNsYXNzKSB7Ci0JCVN0cmluZyBvbGRDdXN0b21pemVyQ2xhc3MgPSB0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzczsKLQkJdGhpcy5zcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MgPSBuZXdDdXN0b21pemVyQ2xhc3M7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFksIG9sZEN1c3RvbWl6ZXJDbGFzcywgbmV3Q3VzdG9taXplckNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0UmVzb3VyY2VDdXN0b21pemVyUGVyc2lzdGVudFR5cGUoKSB7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIGN1c3RvbWl6ZXJDbGFzc1JlZiA9IHRoaXMuZ2V0UmVzb3VyY2VDdXN0b21pemVyKCk7Ci0JCWlmIChjdXN0b21pemVyQ2xhc3NSZWYgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgY2xhc3NOYW1lID0gY3VzdG9taXplckNsYXNzUmVmLmdldENsYXNzTmFtZSgpOwotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5yZXNvbHZlSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoY2xhc3NOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRW50aXR5TWFwcGluZ3MpIGdldE1hcHBpbmdGaWxlUm9vdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQ2xhc3NSZWZlcmVuY2UgZ2V0UmVzb3VyY2VDdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZS5nZXRDdXN0b21pemVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlQ3VzdG9taXplcigpIHsKLQkJdGhpcy5yZXNvdXJjZS5zZXRDdXN0b21pemVyKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENsYXNzUmVmZXJlbmNlKCkpOwkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlQ3VzdG9taXplcigpIHsKLQkJdGhpcy5yZXNvdXJjZS5zZXRDdXN0b21pemVyKG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRm9yKFN0cmluZyB0eXBlTmFtZSkgewotCQlpZiAodGhpcy5jdXN0b21pemVyUGVyc2lzdGVudFR5cGUgIT0gbnVsbCAmJiB0aGlzLmN1c3RvbWl6ZXJQZXJzaXN0ZW50VHlwZS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHR5cGVOYW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luKElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCWlmICh0aGlzLmN1c3RvbWl6ZXJQZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyUGVyc2lzdGVudFR5cGUuaXNJbihwYWNrYWdlRnJhZ21lbnQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplciBqYXZhQ3VzdG9taXplcikgewotCQlzZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKGdldEphdmFDdXN0b21pemVyQ2xhc3MoamF2YUN1c3RvbWl6ZXIpKTsKLQkJc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzXyhnZXRSZXNvdXJjZUN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJdXBkYXRlQ3VzdG9taXplclBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SmF2YUN1c3RvbWl6ZXJDbGFzcyhKYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyIGphdmFDdXN0b21pemVyKSB7Ci0JCXJldHVybiAoamF2YUN1c3RvbWl6ZXIgPT0gbnVsbCkgPyBudWxsIDogamF2YUN1c3RvbWl6ZXIuZ2V0RnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3MoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUN1c3RvbWl6ZXJDbGFzcygpIHsKLQkJWG1sQ2xhc3NSZWZlcmVuY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZUN1c3RvbWl6ZXIoKTsKLQkJcmV0dXJuIChyZXNvdXJjZSA9PSBudWxsKSA/IG51bGwgOiByZXNvdXJjZS5nZXRDbGFzc05hbWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ3VzdG9taXplclBlcnNpc3RlbnRUeXBlKCkgewotCQl0aGlzLmN1c3RvbWl6ZXJQZXJzaXN0ZW50VHlwZSA9IHRoaXMuZ2V0UmVzb3VyY2VDdXN0b21pemVyUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKHRoaXMuaXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lVHlwZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lVHlwZUVkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VDdXN0b21pemVyKCkuY3JlYXRlUmVuYW1lRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlpZiAodGhpcy5pc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChuZXdQYWNrYWdlLmdldEVsZW1lbnROYW1lKCkpKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAodGhpcy5pc0luKG9yaWdpbmFsUGFja2FnZSkpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KG5ld05hbWUpKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VDdXN0b21pemVyKCkuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VDdXN0b21pemVyKCk7Ci0JCXJldHVybiByZXNvdXJjZSA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlLmdldENsYXNzTmFtZVRleHRSYW5nZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YmQ1ZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXJIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwKLQlleHRlbmRzIEFic3RyYWN0T3JtRW1iZWRkYWJsZQotCWltcGxlbWVudHMgT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyOwotCQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNoYW5nZVRyYWNraW5nOwotCQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBjb252ZXJ0ZXJIb2xkZXI7Ci0JCi0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxFbWJlZGRhYmxlIHJlc291cmNlTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JCXRoaXMuY3VzdG9taXplciA9IG5ldyBPcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIodGhpcywgKFhtbEN1c3RvbWl6ZXJIb2xkZXIpIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZywgZ2V0SmF2YUN1c3RvbWl6ZXIoKSk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcgPSBuZXcgT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyh0aGlzLCAoWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIpIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZywgZ2V0SmF2YUNoYW5nZVRyYWNraW5nKCkpOwotCQl0aGlzLmNvbnZlcnRlckhvbGRlciA9IG5ldyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcih0aGlzLCAoWG1sQ29udmVydGVyc0hvbGRlcikgdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nKTsgCi0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxFbWJlZGRhYmxlIGdldFJlc291cmNlVHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiAoWG1sRW1iZWRkYWJsZSkgc3VwZXIuZ2V0UmVzb3VyY2VUeXBlTWFwcGluZygpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB1c2VzUHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpIHsKLQkJcmV0dXJuIHRoaXMuY2hhbmdlVHJhY2tpbmc7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIGdldENvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVySG9sZGVyOwotCX0KLQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UtY29udGV4dCBpbnRlcmFjdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuY3VzdG9taXplci51cGRhdGUoZ2V0SmF2YUN1c3RvbWl6ZXIoKSk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcudXBkYXRlKGdldEphdmFDaGFuZ2VUcmFja2luZygpKTsKLQkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIudXBkYXRlKCk7IAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBnZXRKYXZhRW1iZWRkYWJsZUZvckRlZmF1bHRzKCkgewotCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUpIHN1cGVyLmdldEphdmFFbWJlZGRhYmxlRm9yRGVmYXVsdHMoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0SmF2YUN1c3RvbWl6ZXIoKSB7Ci0JCUphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUgamF2YUVtYmVkZGFibGUgPSBnZXRKYXZhRW1iZWRkYWJsZUZvckRlZmF1bHRzKCk7Ci0JCXJldHVybiAoamF2YUVtYmVkZGFibGUgPT0gbnVsbCkgPyBudWxsIDogKEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIpIGphdmFFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZ2V0SmF2YUNoYW5nZVRyYWNraW5nKCkgewotCQlKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlIGphdmFFbWJlZGRhYmxlID0gZ2V0SmF2YUVtYmVkZGFibGVGb3JEZWZhdWx0cygpOwotCQlyZXR1cm4gKGphdmFFbWJlZGRhYmxlID09IG51bGwpID8gbnVsbCA6IGphdmFFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKioqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZUN1c3RvbWl6ZXJSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY3JlYXRlQ29udmVydGVySG9sZGVyUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ3VzdG9taXplclJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6ZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDb252ZXJ0ZXJIb2xkZXJSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJIb2xkZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJdGhpcy5jcmVhdGVDdXN0b21pemVyTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJdGhpcy5jcmVhdGVDb252ZXJ0ZXJIb2xkZXJNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ3VzdG9taXplck1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDb252ZXJ0ZXJIb2xkZXJNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckhvbGRlci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZUN1c3RvbWl6ZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY3JlYXRlQ29udmVydGVySG9sZGVyUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ3VzdG9taXplclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNvbnZlcnRlckhvbGRlclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVySG9sZGVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmN1c3RvbWl6ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUeXBlTWFwcGluZ1ZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yKHRoaXMsIGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCksIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW50aXR5SW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjVkM2YwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5FY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXJIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRW50aXR5SW1wbAotCWV4dGVuZHMgQWJzdHJhY3RPcm1FbnRpdHkKLQlpbXBsZW1lbnRzIE9ybUVjbGlwc2VMaW5rRW50aXR5Ci17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHk7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyOwotCQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNoYW5nZVRyYWNraW5nOwotCQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgY29udmVydGVySG9sZGVyOwotCQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBjbGFzc0V4dHJhY3RvclBlcnNpc3RlbnRUeXBlOwotCQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0VudGl0eUltcGwoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxFbnRpdHkgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQkJdGhpcy5yZWFkT25seSA9IG5ldyBPcm1FY2xpcHNlTGlua1JlYWRPbmx5KHRoaXMsIChYbWxSZWFkT25seSkgdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLCBnZXRKYXZhUmVhZE9ubHkoKSk7Ci0JCXRoaXMuY3VzdG9taXplciA9IG5ldyBPcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIodGhpcywgKFhtbEN1c3RvbWl6ZXJIb2xkZXIpIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZywgZ2V0SmF2YUN1c3RvbWl6ZXIoKSk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcgPSBuZXcgT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyh0aGlzLCAoWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIpIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZywgZ2V0SmF2YUNoYW5nZVRyYWNraW5nKCkpOwotCQl0aGlzLmNhY2hpbmcgPSBuZXcgT3JtRWNsaXBzZUxpbmtDYWNoaW5nSW1wbCh0aGlzLCAoWG1sQ2FjaGVIb2xkZXIpIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZywgKFhtbENhY2hlYWJsZV8yXzApIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZywgZ2V0SmF2YUNhY2hpbmcoKSk7Ci0JCXRoaXMuY29udmVydGVySG9sZGVyID0gbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyKHRoaXMsIChYbWxDb252ZXJ0ZXJzSG9sZGVyKSB0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcpOwotCQl0aGlzLmNsYXNzRXh0cmFjdG9yUGVyc2lzdGVudFR5cGUgPSBnZXRSZXNvdXJjZUNsYXNzRXh0cmFjdG9yUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEVudGl0eSBnZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gKFhtbEVudGl0eSkgc3VwZXIuZ2V0UmVzb3VyY2VUeXBlTWFwcGluZygpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB1c2VzUHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeUtleSgpICE9IG51bGwgCi0JCQkJfHwgdXNlc0phdmFQcmltYXJ5S2V5Q29sdW1ucygpOwotCX0KLQkKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hpbmc7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gdGhpcy5jaGFuZ2VUcmFja2luZzsKLQl9Ci0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtSZWFkT25seSBnZXRSZWFkT25seSgpIHsKLQkJcmV0dXJuIHRoaXMucmVhZE9ubHk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBnZXRDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckhvbGRlcjsKLQl9Ci0KLQlwdWJsaWMgT3JtQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuICgoT3JtQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRDYWNoaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldENhY2hpbmcoKSkuY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOwotCX0KLQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHN1cGVyLmJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpICYmICFjbGFzc0V4dHJhY3RvcklzVXNlZCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGFzc0V4dHJhY3RvcklzVXNlZCgpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlQ2xhc3NFeHRyYWN0b3IoKSAhPSBudWxsIHx8IGdldENsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbigpICE9IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxDbGFzc1JlZmVyZW5jZSBnZXRSZXNvdXJjZUNsYXNzRXh0cmFjdG9yKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VUeXBlTWFwcGluZygpLmdldENsYXNzRXh0cmFjdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xIGdldENsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbigpIHsKLQkJaWYgKGdldEphdmFFbnRpdHlGb3JEZWZhdWx0cygpICE9IG51bGwpIHsKLQkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQlyZXR1cm4gKEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xKSBqcnB0LmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEuQU5OT1RBVElPTl9OQU1FKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0UmVzb3VyY2VDbGFzc0V4dHJhY3RvclBlcnNpc3RlbnRUeXBlKCkgewotCQlYbWxDbGFzc1JlZmVyZW5jZSBjbGFzc0V4dHJhY3RvckNsYXNzUmVmID0gdGhpcy5nZXRSZXNvdXJjZUNsYXNzRXh0cmFjdG9yKCk7Ci0JCWlmIChjbGFzc0V4dHJhY3RvckNsYXNzUmVmID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzRXh0cmFjdG9yQ2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCk7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLnJlc29sdmVKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShjbGFzc05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNsYXNzRXh0cmFjdG9ySXNGb3IoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCWlmICh0aGlzLmNsYXNzRXh0cmFjdG9yUGVyc2lzdGVudFR5cGUgIT0gbnVsbCAmJiB0aGlzLmNsYXNzRXh0cmFjdG9yUGVyc2lzdGVudFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0eXBlTmFtZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGFzc0V4dHJhY3RvcklzSW4oSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJaWYgKHRoaXMuY2xhc3NFeHRyYWN0b3JQZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGFzc0V4dHJhY3RvclBlcnNpc3RlbnRUeXBlLmlzSW4ocGFja2FnZUZyYWdtZW50KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIEVudGl0eU1hcHBpbmdzIGdldEVudGl0eU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVudGl0eU1hcHBpbmdzKSBnZXRNYXBwaW5nRmlsZVJvb3QoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UtY29udGV4dCBpbnRlcmFjdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnJlYWRPbmx5LnVwZGF0ZShnZXRKYXZhUmVhZE9ubHkoKSk7Ci0JCXRoaXMuY3VzdG9taXplci51cGRhdGUoZ2V0SmF2YUN1c3RvbWl6ZXIoKSk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcudXBkYXRlKGdldEphdmFDaGFuZ2VUcmFja2luZygpKTsKLQkJdGhpcy5jYWNoaW5nLnVwZGF0ZShnZXRKYXZhQ2FjaGluZygpKTsKLQkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIudXBkYXRlKCk7IAotCQl0aGlzLnVwZGF0ZUNsYXNzRXh0cmFjdG9yUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0VudGl0eSBnZXRKYXZhRW50aXR5Rm9yRGVmYXVsdHMoKSB7Ci0JCXJldHVybiAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBzdXBlci5nZXRKYXZhRW50aXR5Rm9yRGVmYXVsdHMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0SmF2YVJlYWRPbmx5KCkgewotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgamF2YUVudGl0eSA9IGdldEphdmFFbnRpdHlGb3JEZWZhdWx0cygpOwotCQlyZXR1cm4gKGphdmFFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogamF2YUVudGl0eS5nZXRSZWFkT25seSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRKYXZhQ3VzdG9taXplcigpIHsKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGphdmFFbnRpdHkgPSBnZXRKYXZhRW50aXR5Rm9yRGVmYXVsdHMoKTsKLQkJcmV0dXJuIChqYXZhRW50aXR5ID09IG51bGwpID8gbnVsbCA6IChKYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyKSBqYXZhRW50aXR5LmdldEN1c3RvbWl6ZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZ2V0SmF2YUNoYW5nZVRyYWNraW5nKCkgewotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgamF2YUVudGl0eSA9IGdldEphdmFFbnRpdHlGb3JEZWZhdWx0cygpOwotCQlyZXR1cm4gKGphdmFFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogamF2YUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBnZXRKYXZhQ2FjaGluZygpIHsKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGphdmFFbnRpdHkgPSBnZXRKYXZhRW50aXR5Rm9yRGVmYXVsdHMoKTsKLQkJcmV0dXJuIChqYXZhRW50aXR5ID09IG51bGwpID8gbnVsbCA6IGphdmFFbnRpdHkuZ2V0Q2FjaGluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VzSmF2YVByaW1hcnlLZXlDb2x1bW5zKCkgewotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgamF2YUVudGl0eSA9IGdldEphdmFFbnRpdHlGb3JEZWZhdWx0cygpOwotCQlyZXR1cm4gKGphdmFFbnRpdHkgPT0gbnVsbCkgPyBmYWxzZSA6IGphdmFFbnRpdHkudXNlc1ByaW1hcnlLZXlDb2x1bW5zKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNsYXNzRXh0cmFjdG9yUGVyc2lzdGVudFR5cGUoKSB7Ci0JCXRoaXMuY2xhc3NFeHRyYWN0b3JQZXJzaXN0ZW50VHlwZSA9IHRoaXMuZ2V0UmVzb3VyY2VDbGFzc0V4dHJhY3RvclBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKioqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCQlzdXBlci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCQkJdGhpcy5jcmVhdGVDdXN0b21pemVyUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJCXRoaXMuY3JlYXRlQ29udmVydGVySG9sZGVyUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJCXRoaXMuY3JlYXRlQ2xhc3NFeHRyYWN0b3JSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDdXN0b21pemVyUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNvbnZlcnRlckhvbGRlclJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckhvbGRlci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNsYXNzRXh0cmFjdG9yUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKHRoaXMuY2xhc3NFeHRyYWN0b3JJc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5nZXRSZXNvdXJjZUNsYXNzRXh0cmFjdG9yKCkuY3JlYXRlUmVuYW1lRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQkJc3VwZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJCQl0aGlzLmNyZWF0ZUN1c3RvbWl6ZXJNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQkJCXRoaXMuY3JlYXRlQ29udmVydGVySG9sZGVyTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJCQl0aGlzLmNyZWF0ZUNsYXNzRXh0cmFjdG9yTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUN1c3RvbWl6ZXJNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6ZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ29udmVydGVySG9sZGVyTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJIb2xkZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ2xhc3NFeHRyYWN0b3JNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCWlmICh0aGlzLmNsYXNzRXh0cmFjdG9ySXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuZ2V0UmVzb3VyY2VDbGFzc0V4dHJhY3RvcigpLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KG5ld1BhY2thZ2UuZ2V0RWxlbWVudE5hbWUoKSkpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZUN1c3RvbWl6ZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY3JlYXRlQ29udmVydGVySG9sZGVyUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZUNsYXNzRXh0cmFjdG9yUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ3VzdG9taXplclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNvbnZlcnRlckhvbGRlclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVySG9sZGVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ2xhc3NFeHRyYWN0b3JSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmICh0aGlzLmNsYXNzRXh0cmFjdG9ySXNJbihvcmlnaW5hbFBhY2thZ2UpKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5nZXRSZXNvdXJjZUNsYXNzRXh0cmFjdG9yKCkuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3TmFtZSkpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMucmVhZE9ubHkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5jdXN0b21pemVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5jYWNoaW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRQcmltYXJ5S2V5VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rRW50aXR5UHJpbWFyeUtleVZhbGlkYXRvcih0aGlzLCBidWlsZFRleHRSYW5nZVJlc29sdmVyKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUeXBlTWFwcGluZ1ZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yKHRoaXMsIGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCksIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBjZjNkMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5OwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkgZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheQotewotCQotCXByb3RlY3RlZCBJbnRlZ2VyIGhvdXI7Ci0JcHJvdGVjdGVkIEludGVnZXIgbWludXRlOwotCXByb3RlY3RlZCBJbnRlZ2VyIHNlY29uZDsKLQlwcm90ZWN0ZWQgSW50ZWdlciBtaWxsaXNlY29uZDsKLQkKLQlwcm90ZWN0ZWQgWG1sVGltZU9mRGF5IHJlc291cmNlVGltZU9mRGF5OwotCQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheShPcm1FY2xpcHNlTGlua0NhY2hpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldEhvdXIoKSB7Ci0JCXJldHVybiB0aGlzLmhvdXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SG91cihJbnRlZ2VyIG5ld0hvdXIpIHsKLQkJSW50ZWdlciBvbGRIb3VyID0gdGhpcy5ob3VyOwotCQl0aGlzLmhvdXIgPSBuZXdIb3VyOwotCQl0aGlzLnJlc291cmNlVGltZU9mRGF5LnNldEhvdXIobmV3SG91cik7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSE9VUl9QUk9QRVJUWSwgb2xkSG91ciwgbmV3SG91cik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SG91cl8oSW50ZWdlciBuZXdIb3VyKSB7Ci0JCUludGVnZXIgb2xkSG91ciA9IHRoaXMuaG91cjsKLQkJdGhpcy5ob3VyID0gbmV3SG91cjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChIT1VSX1BST1BFUlRZLCBvbGRIb3VyLCBuZXdIb3VyKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRNaW51dGUoKSB7Ci0JCXJldHVybiB0aGlzLm1pbnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNaW51dGUoSW50ZWdlciBuZXdNaW51dGUpIHsKLQkJSW50ZWdlciBvbGRNaW51dGUgPSB0aGlzLm1pbnV0ZTsKLQkJdGhpcy5taW51dGUgPSBuZXdNaW51dGU7Ci0JCXRoaXMucmVzb3VyY2VUaW1lT2ZEYXkuc2V0TWludXRlKG5ld01pbnV0ZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUlOVVRFX1BST1BFUlRZLCBvbGRNaW51dGUsIG5ld01pbnV0ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWludXRlXyhJbnRlZ2VyIG5ld01pbnV0ZSkgewotCQlJbnRlZ2VyIG9sZE1pbnV0ZSA9IHRoaXMubWludXRlOwotCQl0aGlzLm1pbnV0ZSA9IG5ld01pbnV0ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNSU5VVEVfUFJPUEVSVFksIG9sZE1pbnV0ZSwgbmV3TWludXRlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRTZWNvbmQoKSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWNvbmQoSW50ZWdlciBuZXdTZWNvbmQpIHsKLQkJSW50ZWdlciBvbGRTZWNvbmQgPSB0aGlzLnNlY29uZDsKLQkJdGhpcy5zZWNvbmQgPSBuZXdTZWNvbmQ7Ci0JCXRoaXMucmVzb3VyY2VUaW1lT2ZEYXkuc2V0U2Vjb25kKG5ld1NlY29uZCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VDT05EX1BST1BFUlRZLCBvbGRTZWNvbmQsIG5ld1NlY29uZCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNlY29uZF8oSW50ZWdlciBuZXdTZWNvbmQpIHsKLQkJSW50ZWdlciBvbGRTZWNvbmQgPSB0aGlzLnNlY29uZDsKLQkJdGhpcy5zZWNvbmQgPSBuZXdTZWNvbmQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VDT05EX1BST1BFUlRZLCBvbGRTZWNvbmQsIG5ld1NlY29uZCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0TWlsbGlzZWNvbmQoKSB7Ci0JCXJldHVybiB0aGlzLm1pbGxpc2Vjb25kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1pbGxpc2Vjb25kKEludGVnZXIgbmV3TWlsbGlzZWNvbmQpIHsKLQkJSW50ZWdlciBvbGRNaWxsaXNlY29uZCA9IHRoaXMubWlsbGlzZWNvbmQ7Ci0JCXRoaXMubWlsbGlzZWNvbmQgPSBuZXdNaWxsaXNlY29uZDsKLQkJdGhpcy5yZXNvdXJjZVRpbWVPZkRheS5zZXRNaWxsaXNlY29uZChuZXdNaWxsaXNlY29uZCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUlMTElTRUNPTkRfUFJPUEVSVFksIG9sZE1pbGxpc2Vjb25kLCBuZXdNaWxsaXNlY29uZCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE1pbGxpc2Vjb25kXyhJbnRlZ2VyIG5ld01pbGxpc2Vjb25kKSB7Ci0JCUludGVnZXIgb2xkTWlsbGlzZWNvbmQgPSB0aGlzLm1pbGxpc2Vjb25kOwotCQl0aGlzLm1pbGxpc2Vjb25kID0gbmV3TWlsbGlzZWNvbmQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUlMTElTRUNPTkRfUFJPUEVSVFksIG9sZE1pbGxpc2Vjb25kLCBuZXdNaWxsaXNlY29uZCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVRpbWVPZkRheS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sVGltZU9mRGF5IHJlc291cmNlKSB7Ci0JCXRoaXMucmVzb3VyY2VUaW1lT2ZEYXkgPSByZXNvdXJjZTsKLQkJdGhpcy5ob3VyID0gZ2V0UmVzb3VyY2VIb3VyKCk7Ci0JCXRoaXMubWludXRlID0gZ2V0UmVzb3VyY2VNaW51dGUoKTsKLQkJdGhpcy5zZWNvbmQgPSBnZXRSZXNvdXJjZVNlY29uZCgpOwotCQl0aGlzLm1pbGxpc2Vjb25kID0gZ2V0UmVzb3VyY2VNaWxsaXNlY29uZCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sVGltZU9mRGF5IHJlc291cmNlKSB7Ci0JCXRoaXMucmVzb3VyY2VUaW1lT2ZEYXkgPSByZXNvdXJjZTsKLQkJdGhpcy5zZXRIb3VyXyhnZXRSZXNvdXJjZUhvdXIoKSk7Ci0JCXRoaXMuc2V0TWludXRlXyhnZXRSZXNvdXJjZU1pbnV0ZSgpKTsKLQkJdGhpcy5zZXRTZWNvbmRfKGdldFJlc291cmNlU2Vjb25kKCkpOwotCQl0aGlzLnNldE1pbGxpc2Vjb25kXyhnZXRSZXNvdXJjZU1pbGxpc2Vjb25kKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBnZXRSZXNvdXJjZUhvdXIoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVGltZU9mRGF5LmdldEhvdXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEludGVnZXIgZ2V0UmVzb3VyY2VNaW51dGUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVGltZU9mRGF5LmdldE1pbnV0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBnZXRSZXNvdXJjZVNlY29uZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VUaW1lT2ZEYXkuZ2V0U2Vjb25kKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIGdldFJlc291cmNlTWlsbGlzZWNvbmQoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVGltZU9mRGF5LmdldE1pbGxpc2Vjb25kKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rSWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwOTA5NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0lkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1JZE1hcHBpbmc8WG1sSWQ+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0lkTWFwcGluZwotewotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua011dGFibGUgbXV0YWJsZTsKLQkKLQkKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbElkIHJlc291cmNlTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JCXRoaXMubXV0YWJsZSA9IG5ldyBPcm1FY2xpcHNlTGlua011dGFibGUodGhpcywgdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQkKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtNdXRhYmxlIGdldE11dGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm11dGFibGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybUNvbnZlcnRlciBidWlsZENvbnZlcnRlcihTdHJpbmcgY29udmVydGVyVHlwZSkgewotCQlPcm1Db252ZXJ0ZXIgb3JtQ29udmVydGVyID0gc3VwZXIuYnVpbGRDb252ZXJ0ZXIoY29udmVydGVyVHlwZSk7Ci0JCWlmIChvcm1Db252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIG9ybUNvbnZlcnRlcjsKLQkJfQotCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbChjb252ZXJ0ZXJUeXBlLCBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikpIHsKLQkJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0KHRoaXMsIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCkgewotCQkvL2NoZWNrIEBDb252ZXJ0IGZpcnN0LCB0aGlzIGlzIHRoZSBvcmRlciB0aGF0IEVjbGlwc2VMaW5rIHNlYXJjaGVzCi0JCWlmICh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0KCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZS1jb250ZXh0IGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMubXV0YWJsZS51cGRhdGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkvLyBUT0RPIC0gbXV0YWJsZSB2YWxpZGF0aW9uCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rSm9pbkZldGNoLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZjODBhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaDsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoIGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtKb2luRmV0Y2gKLXsKLQlwcm90ZWN0ZWQgWG1sSm9pbkZldGNoIHJlc291cmNlOwotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgam9pbkZldGNoVmFsdWU7Ci0JCi0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBYbWxKb2luRmV0Y2ggcmVzb3VyY2UpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCQl0aGlzLmpvaW5GZXRjaFZhbHVlID0gZ2V0UmVzb3VyY2VKb2luRmV0Y2goKTsKLQl9Ci0JCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkZldGNoVmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBuZXdKb2luRmV0Y2hWYWx1ZSkgewotCQlFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgb2xkSm9pbkZldGNoVmFsdWUgPSB0aGlzLmpvaW5GZXRjaFZhbHVlOwotCQl0aGlzLmpvaW5GZXRjaFZhbHVlID0gbmV3Sm9pbkZldGNoVmFsdWU7Ci0JCXRoaXMucmVzb3VyY2Uuc2V0Sm9pbkZldGNoKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3Sm9pbkZldGNoVmFsdWUpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkSm9pbkZldGNoVmFsdWUsIG5ld0pvaW5GZXRjaFZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBuZXdKb2luRmV0Y2hWYWx1ZSkgewotCQlFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgb2xkSm9pbkZldGNoVmFsdWUgPSB0aGlzLmpvaW5GZXRjaFZhbHVlOwotCQl0aGlzLmpvaW5GZXRjaFZhbHVlID0gbmV3Sm9pbkZldGNoVmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZEpvaW5GZXRjaFZhbHVlLCBuZXdKb2luRmV0Y2hWYWx1ZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogaW5pdGlhbGl6ZS91cGRhdGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXNldFZhbHVlXyhnZXRSZXNvdXJjZUpvaW5GZXRjaCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBnZXRSZXNvdXJjZUpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh0aGlzLnJlc291cmNlLmdldEpvaW5GZXRjaCgpKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZS5nZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1Y2QzMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtTWFueVRvTWFueU1hcHBpbmc8WG1sTWFueVRvTWFueT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZwotewotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0pvaW5GZXRjaCBqb2luRmV0Y2g7Ci0JCi0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE1hbnlUb01hbnkgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQkJdGhpcy5qb2luRmV0Y2ggPSBuZXcgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2godGhpcywgdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQkKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKb2luRmV0Y2ggZ2V0Sm9pbkZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5qb2luRmV0Y2g7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UtY29udGV4dCBpbnRlcmFjdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5GZXRjaC51cGRhdGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkvLyBUT0RPIC0gcHJpdmF0ZSBvd25lZCwgam9pbiBmZXRjaCB2YWxpZGF0aW9uCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBlYTkzMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxNYW55VG9PbmUgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wIGJ1aWxkUmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1NYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UodGhpcywgdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliNjkwNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ByaW1hcnlLZXlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbAotCWV4dGVuZHMgQWJzdHJhY3RPcm1NYXBwZWRTdXBlcmNsYXNzCi0JaW1wbGVtZW50cyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MsIENhY2hlYWJsZUhvbGRlcjJfMAotewotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5OwotCQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplcjsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjaGFuZ2VUcmFja2luZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIGNvbnZlcnRlckhvbGRlcjsKLQkKLQkKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbChPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQkJdGhpcy5yZWFkT25seSA9IG5ldyBPcm1FY2xpcHNlTGlua1JlYWRPbmx5KHRoaXMsIChYbWxSZWFkT25seSkgdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLCBnZXRKYXZhUmVhZE9ubHkoKSk7Ci0JCXRoaXMuY3VzdG9taXplciA9IG5ldyBPcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIodGhpcywgKFhtbEN1c3RvbWl6ZXJIb2xkZXIpIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZywgZ2V0SmF2YUN1c3RvbWl6ZXIoKSk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcgPSBuZXcgT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyh0aGlzLCAoWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIpIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZywgZ2V0SmF2YUNoYW5nZVRyYWNraW5nKCkpOwotCQl0aGlzLmNhY2hpbmcgPSBuZXcgT3JtRWNsaXBzZUxpbmtDYWNoaW5nSW1wbCh0aGlzLCAoWG1sQ2FjaGVIb2xkZXIpIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZywgKFhtbENhY2hlYWJsZV8yXzApIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZywgZ2V0SmF2YUNhY2hpbmcoKSk7Ci0JCXRoaXMuY29udmVydGVySG9sZGVyID0gbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyKHRoaXMsIChYbWxDb252ZXJ0ZXJzSG9sZGVyKSB0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sTWFwcGVkU3VwZXJjbGFzcyBnZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIHN1cGVyLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdXNlc1ByaW1hcnlLZXlDb2x1bW5zKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VUeXBlTWFwcGluZygpLmdldFByaW1hcnlLZXkoKSAhPSBudWxsIAotCQkJCXx8IHVzZXNKYXZhUHJpbWFyeUtleUNvbHVtbnMoKTsKLQl9Ci0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ2FjaGluZyBnZXRDYWNoaW5nKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoaW5nOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpIHsKLQkJcmV0dXJuIHRoaXMuY2hhbmdlVHJhY2tpbmc7Ci0JfQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0UmVhZE9ubHkoKSB7Ci0JCXJldHVybiB0aGlzLnJlYWRPbmx5OwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZ2V0Q29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJIb2xkZXI7Ci0JfQotCQkKLQlwdWJsaWMgQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRDYWNoaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldENhY2hpbmcoKSkuY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOwotCX0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlLWNvbnRleHQgaW50ZXJhY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5yZWFkT25seS51cGRhdGUoZ2V0SmF2YVJlYWRPbmx5KCkpOwotCQl0aGlzLmN1c3RvbWl6ZXIudXBkYXRlKGdldEphdmFDdXN0b21pemVyKCkpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nLnVwZGF0ZShnZXRKYXZhQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXRoaXMuY2FjaGluZy51cGRhdGUoZ2V0SmF2YUNhY2hpbmcoKSk7Ci0JCXRoaXMuY29udmVydGVySG9sZGVyLnVwZGF0ZSgpOyAKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgZ2V0SmF2YU1hcHBlZFN1cGVyY2xhc3NGb3JEZWZhdWx0cygpIHsKLQkJcmV0dXJuIChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBzdXBlci5nZXRKYXZhTWFwcGVkU3VwZXJjbGFzc0ZvckRlZmF1bHRzKCk7Ci0JfQotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1JlYWRPbmx5IGdldEphdmFSZWFkT25seSgpIHsKLQkJSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBqYXZhTWFwcGVkU3VwZXJjbGFzcyA9IGdldEphdmFNYXBwZWRTdXBlcmNsYXNzRm9yRGVmYXVsdHMoKTsKLQkJcmV0dXJuIChqYXZhTWFwcGVkU3VwZXJjbGFzcyA9PSBudWxsKSA/IG51bGwgOiBqYXZhTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRKYXZhQ3VzdG9taXplcigpIHsKLQkJSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBqYXZhTWFwcGVkU3VwZXJjbGFzcyA9IGdldEphdmFNYXBwZWRTdXBlcmNsYXNzRm9yRGVmYXVsdHMoKTsKLQkJcmV0dXJuIChqYXZhTWFwcGVkU3VwZXJjbGFzcyA9PSBudWxsKSA/IG51bGwgOiAoSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplcikgamF2YU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRKYXZhQ2hhbmdlVHJhY2tpbmcoKSB7Ci0JCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YU1hcHBlZFN1cGVyY2xhc3MgPSBnZXRKYXZhTWFwcGVkU3VwZXJjbGFzc0ZvckRlZmF1bHRzKCk7Ci0JCXJldHVybiAoamF2YU1hcHBlZFN1cGVyY2xhc3MgPT0gbnVsbCkgPyBudWxsIDogamF2YU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NhY2hpbmcgZ2V0SmF2YUNhY2hpbmcoKSB7Ci0JCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YU1hcHBlZFN1cGVyY2xhc3MgPSBnZXRKYXZhTWFwcGVkU3VwZXJjbGFzc0ZvckRlZmF1bHRzKCk7Ci0JCXJldHVybiAoamF2YU1hcHBlZFN1cGVyY2xhc3MgPT0gbnVsbCkgPyBudWxsIDogamF2YU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VzSmF2YVByaW1hcnlLZXlDb2x1bW5zKCkgewotCQlKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGphdmFNYXBwZWRTdXBlcmNsYXNzID0gZ2V0SmF2YU1hcHBlZFN1cGVyY2xhc3NGb3JEZWZhdWx0cygpOwotCQlyZXR1cm4gKGphdmFNYXBwZWRTdXBlcmNsYXNzID09IG51bGwpID8gZmFsc2UgOiBqYXZhTWFwcGVkU3VwZXJjbGFzcy51c2VzUHJpbWFyeUtleUNvbHVtbnMoKTsKLQl9Ci0JCi0KLQkvLyoqKioqKioqKioqKioqKioqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZUN1c3RvbWl6ZXJSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY3JlYXRlQ29udmVydGVySG9sZGVyUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ3VzdG9taXplclJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6ZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDb252ZXJ0ZXJIb2xkZXJSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJIb2xkZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQlzdXBlci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQl0aGlzLmNyZWF0ZUN1c3RvbWl6ZXJNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQl0aGlzLmNyZWF0ZUNvbnZlcnRlckhvbGRlck1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDdXN0b21pemVyTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNvbnZlcnRlckhvbGRlck1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVySG9sZGVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQlzdXBlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY3JlYXRlQ3VzdG9taXplclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJdGhpcy5jcmVhdGVDb252ZXJ0ZXJIb2xkZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDdXN0b21pemVyUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ29udmVydGVySG9sZGVyUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJIb2xkZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5yZWFkT25seS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmN1c3RvbWl6ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmNhY2hpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFByaW1hcnlLZXlWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvcih0aGlzLCBidWlsZFRleHRSYW5nZVJlc29sdmVyKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUeXBlTWFwcGluZ1ZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NWYWxpZGF0b3IodGhpcywgZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKSwgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNdXRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNdXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODk5NzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTXV0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXV0YWJsZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTXV0YWJsZSBleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUgCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua011dGFibGUKLXsKLQlwcm90ZWN0ZWQgZmluYWwgWG1sTXV0YWJsZSByZXNvdXJjZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0TXV0YWJsZTsKLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRNdXRhYmxlOwotCQotCQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua011dGFibGUoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIFhtbE11dGFibGUgcmVzb3VyY2UpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCQl0aGlzLmRlZmF1bHRNdXRhYmxlID0gdGhpcy5jYWxjdWxhdGVEZWZhdWx0TXV0YWJsZSgpOwotCQl0aGlzLnNwZWNpZmllZE11dGFibGUgPSB0aGlzLmdldFJlc291cmNlTXV0YWJsZSgpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiAoT3JtQXR0cmlidXRlTWFwcGluZykgZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTXV0YWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE11dGFibGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE11dGFibGUuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmRlZmF1bHRNdXRhYmxlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRNdXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TXV0YWJsZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE11dGFibGUoYm9vbGVhbiBuZXdEZWZhdWx0TXV0YWJsZSkgewotCQlib29sZWFuIG9sZERlZmF1bHRNdXRhYmxlID0gdGhpcy5kZWZhdWx0TXV0YWJsZTsKLQkJdGhpcy5kZWZhdWx0TXV0YWJsZSA9IG5ld0RlZmF1bHRNdXRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTVVUQUJMRV9QUk9QRVJUWSwgb2xkRGVmYXVsdE11dGFibGUsIG5ld0RlZmF1bHRNdXRhYmxlKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkTXV0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTXV0YWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuIG5ld1NwZWNpZmllZE11dGFibGUpIHsKLQkJQm9vbGVhbiBvbGRTcGVjaWZpZWRNdXRhYmxlID0gdGhpcy5zcGVjaWZpZWRNdXRhYmxlOwotCQl0aGlzLnNwZWNpZmllZE11dGFibGUgPSBuZXdTcGVjaWZpZWRNdXRhYmxlOwotCQl0aGlzLnJlc291cmNlLnNldE11dGFibGUobmV3U3BlY2lmaWVkTXV0YWJsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01VVEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE11dGFibGUsIG5ld1NwZWNpZmllZE11dGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRNdXRhYmxlXyhCb29sZWFuIG5ld1NwZWNpZmllZE11dGFibGUpIHsKLQkJQm9vbGVhbiBvbGRTcGVjaWZpZWRNdXRhYmxlID0gdGhpcy5zcGVjaWZpZWRNdXRhYmxlOwotCQl0aGlzLnNwZWNpZmllZE11dGFibGUgPSBuZXdTcGVjaWZpZWRNdXRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9NVVRBQkxFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRNdXRhYmxlLCBuZXdTcGVjaWZpZWRNdXRhYmxlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBpbml0aWFsaXplL3VwZGF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCXNldERlZmF1bHRNdXRhYmxlKHRoaXMuY2FsY3VsYXRlRGVmYXVsdE11dGFibGUoKSk7Ci0JCXNldFNwZWNpZmllZE11dGFibGVfKHRoaXMuZ2V0UmVzb3VyY2VNdXRhYmxlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBnZXRSZXNvdXJjZU11dGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlLmdldE11dGFibGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdE11dGFibGUoKSB7Ci0JCUphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YUF0dHJpYnV0ZSA9IChKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlKSB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJaWYgKGphdmFBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChqYXZhQXR0cmlidXRlLnR5cGVJc0RhdGVPckNhbGVuZGFyKCkpIHsKLQkJCUJvb2xlYW4gcGVyc2lzdGVuY2VVbml0RGVmYXVsdE11dGFibGUgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuZ2V0VGVtcG9yYWxNdXRhYmxlKCk7Ci0JCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0RGVmYXVsdE11dGFibGUgPT0gbnVsbCA/IGZhbHNlIDogcGVyc2lzdGVuY2VVbml0RGVmYXVsdE11dGFibGUuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGphdmFBdHRyaWJ1dGUudHlwZUlzU2VyaWFsaXphYmxlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2UuZ2V0TXV0YWJsZVRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4MGYzNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgZXh0ZW5kcyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjxYbWxPYmplY3RUeXBlQ29udmVydGVyPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyCi17CQotCXByaXZhdGUgU3RyaW5nIGRhdGFUeXBlOwotCQotCXByaXZhdGUgU3RyaW5nIG9iamVjdFR5cGU7Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGRhdGFUeXBlUGVyc2lzdGVudFR5cGU7Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIG9iamVjdFR5cGVQZXJzaXN0ZW50VHlwZTsKLQkKLQlwcml2YXRlIGZpbmFsIExpc3Q8T3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZXM7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlOwotCQotCQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29udmVyc2lvblZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8T3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQl9CQotCQotCS8vICoqKioqKioqKioqKioqKiogZGF0YSB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIG5ld0RhdGFUeXBlKSB7Ci0JCVN0cmluZyBvbGREYXRhVHlwZSA9IHRoaXMuZGF0YVR5cGU7Ci0JCXRoaXMuZGF0YVR5cGUgPSBuZXdEYXRhVHlwZTsKLQkJZ2V0WG1sUmVzb3VyY2UoKS5zZXREYXRhVHlwZShuZXdEYXRhVHlwZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREFUQV9UWVBFX1BST1BFUlRZLCBvbGREYXRhVHlwZSwgbmV3RGF0YVR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREYXRhVHlwZV8oU3RyaW5nIG5ld0RhdGFUeXBlKSB7Ci0JCVN0cmluZyBvbGREYXRhVHlwZSA9IHRoaXMuZGF0YVR5cGU7Ci0JCXRoaXMuZGF0YVR5cGUgPSBuZXdEYXRhVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1RZUEVfUFJPUEVSVFksIG9sZERhdGFUeXBlLCBuZXdEYXRhVHlwZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogb2JqZWN0IHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGUoU3RyaW5nIG5ld09iamVjdFR5cGUpIHsKLQkJU3RyaW5nIG9sZE9iamVjdFR5cGUgPSB0aGlzLm9iamVjdFR5cGU7Ci0JCXRoaXMub2JqZWN0VHlwZSA9IG5ld09iamVjdFR5cGU7Ci0JCWdldFhtbFJlc291cmNlKCkuc2V0T2JqZWN0VHlwZShuZXdPYmplY3RUeXBlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVFlQRV9QUk9QRVJUWSwgb2xkT2JqZWN0VHlwZSwgbmV3T2JqZWN0VHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdFR5cGVfKFN0cmluZyBuZXdPYmplY3RUeXBlKSB7Ci0JCVN0cmluZyBvbGRPYmplY3RUeXBlID0gdGhpcy5vYmplY3RUeXBlOwotCQl0aGlzLm9iamVjdFR5cGUgPSBuZXdPYmplY3RUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9UWVBFX1BST1BFUlRZLCBvbGRPYmplY3RUeXBlLCBuZXdPYmplY3RUeXBlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBjb252ZXJzaW9uIHZhbHVlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+KHRoaXMuY29udmVyc2lvblZhbHVlcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgY29udmVyc2lvblZhbHVlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZXMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgYWRkQ29udmVyc2lvblZhbHVlKGludCBpbmRleCkgewotCQlYbWxDb252ZXJzaW9uVmFsdWUgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnNpb25WYWx1ZSgpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb250ZXh0Q29udmVyc2lvblZhbHVlID0gYnVpbGRDb252ZXJzaW9uVmFsdWUocmVzb3VyY2VDb252ZXJzaW9uVmFsdWUpOwotCQl0aGlzLmNvbnZlcnNpb25WYWx1ZXMuYWRkKGluZGV4LCBjb250ZXh0Q29udmVyc2lvblZhbHVlKTsKLQkJZ2V0WG1sUmVzb3VyY2UoKS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuYWRkKGluZGV4LCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSk7Ci0JCWZpcmVJdGVtQWRkZWQoQ09OVkVSU0lPTl9WQUxVRVNfTElTVCwgaW5kZXgsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUpOwotCQlyZXR1cm4gY29udGV4dENvbnZlcnNpb25WYWx1ZTsKLQl9Ci0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGFkZENvbnZlcnNpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYWRkQ29udmVyc2lvblZhbHVlKHRoaXMuY29udmVyc2lvblZhbHVlcy5zaXplKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4LCBPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgY29udmVyc2lvblZhbHVlLCB0aGlzLmNvbnZlcnNpb25WYWx1ZXMsIENPTlZFUlNJT05fVkFMVUVTX0xJU1QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb252ZXJzaW9uVmFsdWUoT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlKSB7Ci0JCXRoaXMuYWRkQ29udmVyc2lvblZhbHVlKHRoaXMuY29udmVyc2lvblZhbHVlcy5zaXplKCksIGNvbnZlcnNpb25WYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpIHsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgcmVtb3ZlZEpvaW5Db2x1bW4gPSB0aGlzLmNvbnZlcnNpb25WYWx1ZXMucmVtb3ZlKGluZGV4KTsKLQkJZ2V0WG1sUmVzb3VyY2UoKS5nZXRDb252ZXJzaW9uVmFsdWVzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKENPTlZFUlNJT05fVkFMVUVTX0xJU1QsIGluZGV4LCByZW1vdmVkSm9pbkNvbHVtbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZShFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKLQkJdGhpcy5yZW1vdmVDb252ZXJzaW9uVmFsdWUodGhpcy5jb252ZXJzaW9uVmFsdWVzLmluZGV4T2YoY29udmVyc2lvblZhbHVlKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZV8oRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChjb252ZXJzaW9uVmFsdWUsIHRoaXMuY29udmVyc2lvblZhbHVlcywgQ09OVkVSU0lPTl9WQUxVRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVDb252ZXJzaW9uVmFsdWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5jb252ZXJzaW9uVmFsdWVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlnZXRYbWxSZXNvdXJjZSgpLmdldENvbnZlcnNpb25WYWx1ZXMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoQ09OVkVSU0lPTl9WQUxVRVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gZGF0YVZhbHVlcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgU3RyaW5nPihjb252ZXJzaW9uVmFsdWVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmdldERhdGFWYWx1ZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGRlZmF1bHQgb2JqZWN0IHZhbHVlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0T2JqZWN0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlKFN0cmluZyBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRPYmplY3RWYWx1ZSA9IHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlOwotCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IG5ld0RlZmF1bHRPYmplY3RWYWx1ZTsKLQkJZ2V0WG1sUmVzb3VyY2UoKS5zZXREZWZhdWx0T2JqZWN0VmFsdWUobmV3RGVmYXVsdE9iamVjdFZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkRGVmYXVsdE9iamVjdFZhbHVlLCBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0T2JqZWN0VmFsdWVfKFN0cmluZyBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRPYmplY3RWYWx1ZSA9IHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlOwotCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IG5ld0RlZmF1bHRPYmplY3RWYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkRGVmYXVsdE9iamVjdFZhbHVlLCBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxPYmplY3RUeXBlQ29udmVydGVyIHhtbFJlc291cmNlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoeG1sUmVzb3VyY2UpOwotCQl0aGlzLmRhdGFUeXBlID0gdGhpcy5nZXRSZXNvdXJjZURhdGFUeXBlKCk7Ci0JCXRoaXMub2JqZWN0VHlwZSA9IHRoaXMuZ2V0UmVzb3VyY2VPYmplY3RUeXBlKCk7Ci0JCXRoaXMuZGF0YVR5cGVQZXJzaXN0ZW50VHlwZSA9IHRoaXMuZ2V0RGF0YVR5cGVKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpOwotCQl0aGlzLm9iamVjdFR5cGVQZXJzaXN0ZW50VHlwZSA9IHRoaXMuZ2V0T2JqZWN0VHlwZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7Ci0JCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlID0gdGhpcy5nZXRSZXNvdXJjZURlZmF1bHRPYmplY3RWYWx1ZSgpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJzaW9uVmFsdWVzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJzaW9uVmFsdWVzKCkgewkKLQkJZm9yIChYbWxDb252ZXJzaW9uVmFsdWUgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgOiBnZXRYbWxSZXNvdXJjZSgpLmdldENvbnZlcnNpb25WYWx1ZXMoKSkgewotCQkJdGhpcy5jb252ZXJzaW9uVmFsdWVzLmFkZChidWlsZENvbnZlcnNpb25WYWx1ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSkpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXNldERhdGFUeXBlXyhnZXRSZXNvdXJjZURhdGFUeXBlKCkpOwotCQlzZXRPYmplY3RUeXBlXyhnZXRSZXNvdXJjZU9iamVjdFR5cGUoKSk7Ci0JCXVwZGF0ZURhdGFUeXBlUGVyc2lzdGVudFR5cGUoKTsKLQkJdXBkYXRlT2JqZWN0VHlwZVBlcnNpc3RlbnRUeXBlKCk7Ci0JCXNldERlZmF1bHRPYmplY3RWYWx1ZV8oZ2V0UmVzb3VyY2VEZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCXVwZGF0ZUNvbnZlcnNpb25WYWx1ZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGF0YVR5cGVQZXJzaXN0ZW50VHlwZSgpIHsKLQkJdGhpcy5kYXRhVHlwZVBlcnNpc3RlbnRUeXBlID0gdGhpcy5nZXREYXRhVHlwZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlT2JqZWN0VHlwZVBlcnNpc3RlbnRUeXBlKCkgewotCQl0aGlzLm9iamVjdFR5cGVQZXJzaXN0ZW50VHlwZSA9IHRoaXMuZ2V0T2JqZWN0VHlwZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udmVyc2lvblZhbHVlcyggKSB7Ci0JCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBYTUwgY29udmVyc2lvbiB2YWx1ZXMgKHRvIHByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbikKLQkJSXRlcmF0b3I8WG1sQ29udmVyc2lvblZhbHVlPiB4bWxDb252ZXJzaW9uVmFsdWVzID0gbmV3IENsb25lSXRlcmF0b3I8WG1sQ29udmVyc2lvblZhbHVlPih0aGlzLmdldFhtbFJlc291cmNlKCkuZ2V0Q29udmVyc2lvblZhbHVlcygpKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8T3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzID0gdGhpcy5jb252ZXJzaW9uVmFsdWVzKCk7IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKTsgKSB7Ci0JCQlPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQkJaWYgKHhtbENvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKSB7Ci0JCQkJY29udGV4dENvbnZlcnNpb25WYWx1ZS51cGRhdGUoeG1sQ29udmVyc2lvblZhbHVlcy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlQ29udmVyc2lvblZhbHVlXyhjb250ZXh0Q29udmVyc2lvblZhbHVlKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHhtbENvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRDb252ZXJzaW9uVmFsdWUoYnVpbGRDb252ZXJzaW9uVmFsdWUoeG1sQ29udmVyc2lvblZhbHVlcy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgYnVpbGRDb252ZXJzaW9uVmFsdWUoWG1sQ29udmVyc2lvblZhbHVlIHJlc291cmNlQ29udmVyc2lvblZhbHVlKSB7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSA9IG5ldyBPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSh0aGlzKTsKLQkJY29udmVyc2lvblZhbHVlLmluaXRpYWxpemUocmVzb3VyY2VDb252ZXJzaW9uVmFsdWUpOwotCQlyZXR1cm4gY29udmVyc2lvblZhbHVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlRGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVydGVyLmdldERhdGFUeXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZU9iamVjdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVydGVyLmdldE9iamVjdFR5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlRGVmYXVsdE9iamVjdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0RGF0YVR5cGVKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5yZXNvbHZlSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUodGhpcy5nZXREYXRhVHlwZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0T2JqZWN0VHlwZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLnJlc29sdmVKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSh0aGlzLmdldE9iamVjdFR5cGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGF0YVR5cGVJc0ZvcihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNGb3IodGhpcy5kYXRhVHlwZVBlcnNpc3RlbnRUeXBlLCB0eXBlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gb2JqZWN0VHlwZUlzRm9yKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5pc0Zvcih0aGlzLm9iamVjdFR5cGVQZXJzaXN0ZW50VHlwZSwgdHlwZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRm9yKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlICE9IG51bGwgJiYgcGVyc2lzdGVudFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0eXBlTmFtZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkYXRhVHlwZUlzSW4oSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJcmV0dXJuIHRoaXMuaXNJbih0aGlzLmRhdGFUeXBlUGVyc2lzdGVudFR5cGUsIHBhY2thZ2VGcmFnbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gb2JqZWN0VHlwZUlzSW4oSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJcmV0dXJuIHRoaXMuaXNJbih0aGlzLm9iamVjdFR5cGVQZXJzaXN0ZW50VHlwZSwgcGFja2FnZUZyYWdtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlLCBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQlpZiAocGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBlcnNpc3RlbnRUeXBlLmlzSW4ocGFja2FnZUZyYWdtZW50KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKioqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJdGhpcy5jcmVhdGVSZW5hbWVEYXRhVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZURhdGFUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAodGhpcy5kYXRhVHlwZUlzRm9yKG9yaWdpbmFsVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSkpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZURhdGFUeXBlRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVEYXRhVHlwZUVkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gZ2V0WG1sUmVzb3VyY2UoKS5jcmVhdGVSZW5hbWVEYXRhVHlwZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZU9iamVjdFR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmICh0aGlzLm9iamVjdFR5cGVJc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVPYmplY3RUeXBlRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVPYmplY3RUeXBlRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBnZXRYbWxSZXNvdXJjZSgpLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJdGhpcy5jcmVhdGVNb3ZlRGF0YVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJdGhpcy5jcmVhdGVNb3ZlT2JqZWN0VHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZURhdGFUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJaWYgKHRoaXMuZGF0YVR5cGVJc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVEYXRhVHlwZVBhY2thZ2VFZGl0KG5ld1BhY2thZ2UuZ2V0RWxlbWVudE5hbWUoKSkpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZURhdGFUeXBlUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIGdldFhtbFJlc291cmNlKCkuY3JlYXRlUmVuYW1lRGF0YVR5cGVQYWNrYWdlRWRpdChuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVPYmplY3RUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJaWYgKHRoaXMub2JqZWN0VHlwZUlzRm9yKG9yaWdpbmFsVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSkpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVQYWNrYWdlRWRpdChuZXdQYWNrYWdlLmdldEVsZW1lbnROYW1lKCkpKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVPYmplY3RUeXBlUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIGdldFhtbFJlc291cmNlKCkuY3JlYXRlUmVuYW1lT2JqZWN0VHlwZVBhY2thZ2VFZGl0KG5ld05hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXRoaXMuY3JlYXRlUmVuYW1lRGF0YVR5cGVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY3JlYXRlUmVuYW1lT2JqZWN0VHlwZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZURhdGFUeXBlUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAodGhpcy5kYXRhVHlwZUlzSW4ob3JpZ2luYWxQYWNrYWdlKSkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lRGF0YVR5cGVQYWNrYWdlRWRpdChuZXdOYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZU9iamVjdFR5cGVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmICh0aGlzLm9iamVjdFR5cGVJc0luKG9yaWdpbmFsUGFja2FnZSkpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVQYWNrYWdlRWRpdChuZXdOYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQlmb3IgKEl0ZXJhdG9yPE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBzdHJlYW0gPSBjb252ZXJzaW9uVmFsdWVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjdlOTk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtT25lVG9NYW55TWFwcGluZzxYbWxPbmVUb01hbnk+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzAKLXsKLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgcHJpdmF0ZU93bmVkOwotCQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0pvaW5GZXRjaCBqb2luRmV0Y2g7Ci0JCi0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sT25lVG9NYW55IHJlc291cmNlTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JCXRoaXMucHJpdmF0ZU93bmVkID0gbmV3IE9ybUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkKHRoaXMsIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJdGhpcy5qb2luRmV0Y2ggPSBuZXcgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2godGhpcywgdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtUmVsYXRpb25zaGlwUmVmZXJlbmNlIGJ1aWxkUmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlKHRoaXMsIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIChPcm1FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgc3VwZXIuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBnZXRQcml2YXRlT3duZWQoKSB7Ci0JCXJldHVybiB0aGlzLnByaXZhdGVPd25lZDsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoIGdldEpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkZldGNoOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIC0+IGNvbnRleHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5wcml2YXRlT3duZWQudXBkYXRlKCk7Ci0JCXRoaXMuam9pbkZldGNoLnVwZGF0ZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkvLyBUT0RPIC0gcHJpdmF0ZSBvd25lZCwgam9pbiBmZXRjaCB2YWxpZGF0aW9uCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzNzgyYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbmluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1UYXJnZXRGb3JpZWduS2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZQotCWV4dGVuZHMgQWJzdHJhY3RPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wCi17Ci0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlKAotCQkJT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHBhcmVudCwgWG1sT25lVG9NYW55IHJlc291cmNlKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2UpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVRhcmdldEZvcmllZ25LZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KHRoaXMsIGdldFJlc291cmNlTWFwcGluZygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtUmVsYXRpb25zaGlwUmVmZXJlbmNlIG5ld1JlbGF0aW9uc2hpcFJlZmVyZW5jZSkgewotCQlzdXBlci5pbml0aWFsaXplT24obmV3UmVsYXRpb25zaGlwUmVmZXJlbmNlKTsKLQkJbmV3UmVsYXRpb25zaGlwUmVmZXJlbmNlLmluaXRpYWxpemVGcm9tSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UodGhpcyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoCi0JCQlPcm1Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSBvbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZShvbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UpOwotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IgKEpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IAotCQkJCUNvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSgKLQkJCQkJb2xkUmVsYXRpb25zaGlwUmVmZXJlbmNlLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKS5zcGVjaWZpZWRKb2luQ29sdW1ucygpKSkgewotCQkJT3JtSm9pbkNvbHVtbiBuZXdKb2luQ29sdW1uID0gdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW5kZXgrKyk7Ci0JCQluZXdKb2luQ29sdW1uLmluaXRpYWxpemVGcm9tKGpvaW5Db2x1bW4pOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxPbmVUb01hbnkgZ2V0UmVzb3VyY2VNYXBwaW5nKCkgewotCQlyZXR1cm4gKFhtbE9uZVRvTWFueSkgc3VwZXIuZ2V0UmVzb3VyY2VNYXBwaW5nKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1Kb2luaW5nU3RyYXRlZ3kgY2FsY3VsYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB7Ci0JCWlmICh0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5Lmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkpIHsKLQkJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBtYXBwZWQgYnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIG1heUJlTWFwcGVkQnkoQXR0cmlidXRlTWFwcGluZyBtYXBwZWRCeU1hcHBpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLm1heUJlTWFwcGVkQnkobWFwcGVkQnlNYXBwaW5nKSB8fAotCQkJbWFwcGVkQnlNYXBwaW5nLmdldEtleSgpID09IE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNmEzMTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcKLXsKLQkKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE9uZVRvT25lIHJlc291cmNlTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wIGJ1aWxkUmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSh0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1NWMxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQuRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlVmFsaWRhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUgZXh0ZW5kcyBBYnN0cmFjdE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUKLXsKLQkKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgT3duZXIgb3duZXIsIFhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKioqIEFjY2Vzc0hvbGRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGRvZXMgbm90IHN1cHBvcnQgc3BlY2lmaWVkIGFjY2VzcyAobm8gYWNjZXNzIGVsZW1lbnQgaW4gMS4wKSwgc28gd2UgcmV0dXJuIG51bGwKLQkgKi8KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRTcGVjaWZpZWRBY2Nlc3MoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdTcGVjaWZpZWRBY2Nlc3MpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJzcGVjaWZpZWRBY2Nlc3MgaXMgbm90IHN1cHBvcnRlZCBmb3IgT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkQXR0aWJ1dGVWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlVmFsaWRhdG9yKHRoaXMsIGdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCksIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtQcml2YXRlT3duZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyZjdiZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtQcml2YXRlT3duZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZDsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQKLXsKLQlwcm90ZWN0ZWQgZmluYWwgWG1sUHJpdmF0ZU93bmVkIHJlc291cmNlOwotCQotCXByb3RlY3RlZCBib29sZWFuIHByaXZhdGVPd25lZDsKLQkKLQkKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtQcml2YXRlT3duZWQoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIFhtbFByaXZhdGVPd25lZCByZXNvdXJjZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JCXRoaXMucHJpdmF0ZU93bmVkID0gdGhpcy5nZXRSZXNvdXJjZVByaXZhdGVPd25lZCgpOwotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVPd25lZCgpIHsKLQkJcmV0dXJuIHRoaXMucHJpdmF0ZU93bmVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcml2YXRlT3duZWQoYm9vbGVhbiBuZXdQcml2YXRlT3duZWQpIHsKLQkJYm9vbGVhbiBvbGRQcml2YXRlT3duZWQgPSB0aGlzLnByaXZhdGVPd25lZDsKLQkJdGhpcy5wcml2YXRlT3duZWQgPSBuZXdQcml2YXRlT3duZWQ7Ci0JCXRoaXMucmVzb3VyY2Uuc2V0UHJpdmF0ZU93bmVkKG5ld1ByaXZhdGVPd25lZCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJJVkFURV9PV05FRF9QUk9QRVJUWSwgb2xkUHJpdmF0ZU93bmVkLCBuZXdQcml2YXRlT3duZWQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcml2YXRlT3duZWRfKGJvb2xlYW4gbmV3UHJpdmF0ZU93bmVkKSB7Ci0JCWJvb2xlYW4gb2xkUHJpdmF0ZU93bmVkID0gdGhpcy5wcml2YXRlT3duZWQ7Ci0JCXRoaXMucHJpdmF0ZU93bmVkID0gbmV3UHJpdmF0ZU93bmVkOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBSSVZBVEVfT1dORURfUFJPUEVSVFksIG9sZFByaXZhdGVPd25lZCwgbmV3UHJpdmF0ZU93bmVkKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBpbml0aWFsaXplL3VwZGF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKLQkJc2V0UHJpdmF0ZU93bmVkXyh0aGlzLmdldFJlc291cmNlUHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRSZXNvdXJjZVByaXZhdGVPd25lZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2UuaXNQcml2YXRlT3duZWQoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZS5nZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtSZWFkT25seS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rUmVhZE9ubHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ2OWNiMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtSZWFkT25seS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHk7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1JlYWRPbmx5IGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtSZWFkT25seQotewotCXByb3RlY3RlZCBmaW5hbCBYbWxSZWFkT25seSByZXNvdXJjZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0UmVhZE9ubHk7Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkUmVhZE9ubHk7Ci0JCi0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rUmVhZE9ubHkoT3JtVHlwZU1hcHBpbmcgcGFyZW50LCBYbWxSZWFkT25seSByZXNvdXJjZSwgRWNsaXBzZUxpbmtSZWFkT25seSBqYXZhUmVhZE9ubHkpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCQl0aGlzLmRlZmF1bHRSZWFkT25seSA9IHRoaXMuZ2V0SmF2YVJlYWRPbmx5KGphdmFSZWFkT25seSk7Ci0JCXRoaXMuc3BlY2lmaWVkUmVhZE9ubHkgPSB0aGlzLmdldFJlc291cmNlUmVhZE9ubHkoKTsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFJlYWRPbmx5ID09IG51bGwpID8gdGhpcy5kZWZhdWx0UmVhZE9ubHkgOiB0aGlzLnNwZWNpZmllZFJlYWRPbmx5LmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRSZWFkT25seSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFJlYWRPbmx5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0UmVhZE9ubHkoYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlib29sZWFuIG9sZFZhbHVlID0gdGhpcy5kZWZhdWx0UmVhZE9ubHk7Ci0JCXRoaXMuZGVmYXVsdFJlYWRPbmx5ID0gbmV3VmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9SRUFEX09OTFlfUFJPUEVSVFksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFJlYWRPbmx5KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRSZWFkT25seTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbiBuZXdTcGVjaWZpZWRSZWFkT25seSkgewotCQlCb29sZWFuIG9sZFNwZWNpZmllZFJlYWRPbmx5ID0gdGhpcy5zcGVjaWZpZWRSZWFkT25seTsKLQkJdGhpcy5zcGVjaWZpZWRSZWFkT25seSA9IG5ld1NwZWNpZmllZFJlYWRPbmx5OwotCQl0aGlzLnJlc291cmNlLnNldFJlYWRPbmx5KG5ld1NwZWNpZmllZFJlYWRPbmx5KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVBRF9PTkxZX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRSZWFkT25seSwgbmV3U3BlY2lmaWVkUmVhZE9ubHkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGluaXRpYWxpemUvdXBkYXRlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKEVjbGlwc2VMaW5rUmVhZE9ubHkgamF2YVJlYWRPbmx5KSB7Ci0JCXNldERlZmF1bHRSZWFkT25seSh0aGlzLmdldEphdmFSZWFkT25seShqYXZhUmVhZE9ubHkpKTsKLQkJc2V0U3BlY2lmaWVkUmVhZE9ubHkodGhpcy5nZXRSZXNvdXJjZVJlYWRPbmx5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRKYXZhUmVhZE9ubHkoRWNsaXBzZUxpbmtSZWFkT25seSBqYXZhUmVhZE9ubHkpIHsKLQkJcmV0dXJuIChqYXZhUmVhZE9ubHkgPT0gbnVsbCkgPyBmYWxzZSA6IGphdmFSZWFkT25seS5pc1JlYWRPbmx5KCk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIGdldFJlc291cmNlUmVhZE9ubHkoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlLmdldFJlYWRPbmx5KCk7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2UuZ2V0UmVhZE9ubHlUZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzM2MWY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGV4dGVuZHMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXI8WG1sU3RydWN0Q29udmVydGVyPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIKLXsJCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydGVyQ2xhc3M7Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGNvbnZlcnRlclBlcnNpc3RlbnRUeXBlOwotCQotCQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVI7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogY29udmVydGVyIGNsYXNzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDbGFzczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyQ2xhc3MoU3RyaW5nIG5ld0NvbnZlcnRlckNsYXNzKSB7Ci0JCVN0cmluZyBvbGRDb252ZXJ0ZXJDbGFzcyA9IHRoaXMuY29udmVydGVyQ2xhc3M7Ci0JCXRoaXMuY29udmVydGVyQ2xhc3MgPSBuZXdDb252ZXJ0ZXJDbGFzczsKLQkJZ2V0WG1sUmVzb3VyY2UoKS5zZXRDb252ZXJ0ZXIobmV3Q29udmVydGVyQ2xhc3MpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSwgb2xkQ29udmVydGVyQ2xhc3MsIG5ld0NvbnZlcnRlckNsYXNzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udmVydGVyQ2xhc3NfKFN0cmluZyBuZXdDb252ZXJ0ZXJDbGFzcykgewotCQlTdHJpbmcgb2xkQ29udmVydGVyQ2xhc3MgPSB0aGlzLmNvbnZlcnRlckNsYXNzOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gbmV3Q29udmVydGVyQ2xhc3M7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXJDbGFzcywgbmV3Q29udmVydGVyQ2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRDb252ZXJ0ZXJKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5yZXNvbHZlSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUodGhpcy5jb252ZXJ0ZXJDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxTdHJ1Y3RDb252ZXJ0ZXIgeG1sUmVzb3VyY2UpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSh4bWxSZXNvdXJjZSk7Ci0JCXRoaXMuY29udmVydGVyQ2xhc3MgPSBnZXRSZXNvdXJjZUNvbnZlcnRlckNsYXNzKCk7Ci0JCXRoaXMuY29udmVydGVyUGVyc2lzdGVudFR5cGUgPSB0aGlzLmdldENvbnZlcnRlckphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXNldENvbnZlcnRlckNsYXNzXyhnZXRSZXNvdXJjZUNvbnZlcnRlckNsYXNzKCkpOwotCQl1cGRhdGVDb252ZXJ0ZXJQZXJzaXN0ZW50VHlwZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlQ29udmVydGVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVydGVyLmdldENvbnZlcnRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb252ZXJ0ZXJQZXJzaXN0ZW50VHlwZSgpIHsKLQkJdGhpcy5jb252ZXJ0ZXJQZXJzaXN0ZW50VHlwZSA9IHRoaXMuZ2V0Q29udmVydGVySmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdmFsaWRhdGVDb252ZXJ0ZXJDbGFzcyhtZXNzYWdlcyk7Ci0JfQotCQotLy9UT0RPIHZhbGlkYXRlIGNvbnZlcnRlciBjbGFzcwkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnZlcnRlckNsYXNzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0vLwkJaWYgKCFnZXRSZXNvdXJjZUNvbnZlcnRlcigpLmltcGxlbWVudHNDb252ZXJ0ZXIoKSkgewotLy8JCQltZXNzYWdlcy5hZGQoCi0vLwkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotLy8JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0vLwkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09OVkVSVEVSX0NMQVNTX0lNUExFTUVOVFNfQ09OVkVSVEVSLAotLy8JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5jb252ZXJ0ZXJDbGFzc30sCi0vLwkJCQkJdGhpcywgCi0vLwkJCQkJZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKQotLy8JCQkJKQotLy8JCQkpOwotLy8JCX0KLQl9Ci0JCi0vLwlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKCkgewotLy8JCXJldHVybiBnZXRSZXNvdXJjZUNvbnZlcnRlcigpLmdldENsYXNzTmFtZVRleHRSYW5nZSgpOwotLy8JfQotCi0KLQkvLyoqKioqKioqKioqKioqKioqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmICh0aGlzLmlzRm9yKG9yaWdpbmFsVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSkpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBnZXRYbWxSZXNvdXJjZSgpLmNyZWF0ZVJlbmFtZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJaWYgKHRoaXMuaXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3UGFja2FnZS5nZXRFbGVtZW50TmFtZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIGdldFhtbFJlc291cmNlKCkuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmICh0aGlzLmlzSW4ob3JpZ2luYWxQYWNrYWdlKSkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3TmFtZSkpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGb3IoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCWlmICh0aGlzLmNvbnZlcnRlclBlcnNpc3RlbnRUeXBlICE9IG51bGwgJiYgdGhpcy5jb252ZXJ0ZXJQZXJzaXN0ZW50VHlwZS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHR5cGVOYW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwkKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luKElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCWlmICh0aGlzLmNvbnZlcnRlclBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmNvbnZlcnRlclBlcnNpc3RlbnRUeXBlLmlzSW4ocGFja2FnZUZyYWdtZW50KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMGNkZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxYbWxUcmFuc2Zvcm1hdGlvbj4gCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZwotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sVHJhbnNmb3JtYXRpb24gcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZyh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlRSQU5TRk9STUFUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkVG9SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgewotCQkoKEF0dHJpYnV0ZXMpIHJlc291cmNlQXR0cmlidXRlcykuZ2V0VHJhbnNmb3JtYXRpb25zKCkuYWRkKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7Ci0JCSgoQXR0cmlidXRlcykgcmVzb3VyY2VBdHRyaWJ1dGVzKS5nZXRUcmFuc2Zvcm1hdGlvbnMoKS5yZW1vdmUodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQotCQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiA4NTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZWM4M2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVFJBTlNGT1JNQVRJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBFbWZUb29scy5jcmVhdGUoCi0JCQkJZmFjdG9yeSwgCi0JCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUcmFuc2Zvcm1hdGlvbigpLCAKLQkJCQlYbWxUcmFuc2Zvcm1hdGlvbi5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkQ29udGV4dE1hcHBpbmcoCi0JCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgCi0JCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgCi0JCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gKChFY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeSkgZmFjdG9yeSkuCi0JCQkJYnVpbGRPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyhwYXJlbnQsIChYbWxUcmFuc2Zvcm1hdGlvbikgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRWaXJ0dWFsUmVzb3VyY2VNYXBwaW5nKAotCQkJT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIAotCQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIAotCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkpIGZhY3RvcnkpLgotCQkJCWJ1aWxkVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24ob3JtVHlwZU1hcHBpbmcsIChKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNDcxNTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgZXh0ZW5kcyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjxYbWxUeXBlQ29udmVydGVyPiAKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcgotewkKLQlwcml2YXRlIFN0cmluZyBkYXRhVHlwZTsKLQkKLQlwcml2YXRlIFN0cmluZyBvYmplY3RUeXBlOwotCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBkYXRhVHlwZVBlcnNpc3RlbnRUeXBlOwotCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBvYmplY3RUeXBlUGVyc2lzdGVudFR5cGU7Ci0JCi0JCi0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSOwotCX0KLQkJCi0JLy8gKioqKioqKioqKioqKioqKiBkYXRhIHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShTdHJpbmcgbmV3RGF0YVR5cGUpIHsKLQkJU3RyaW5nIG9sZERhdGFUeXBlID0gdGhpcy5kYXRhVHlwZTsKLQkJdGhpcy5kYXRhVHlwZSA9IG5ld0RhdGFUeXBlOwotCQlnZXRYbWxSZXNvdXJjZSgpLnNldERhdGFUeXBlKG5ld0RhdGFUeXBlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1RZUEVfUFJPUEVSVFksIG9sZERhdGFUeXBlLCBuZXdEYXRhVHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERhdGFUeXBlXyhTdHJpbmcgbmV3RGF0YVR5cGUpIHsKLQkJU3RyaW5nIG9sZERhdGFUeXBlID0gdGhpcy5kYXRhVHlwZTsKLQkJdGhpcy5kYXRhVHlwZSA9IG5ld0RhdGFUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVFlQRV9QUk9QRVJUWSwgb2xkRGF0YVR5cGUsIG5ld0RhdGFUeXBlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBvYmplY3QgdHlwZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZShTdHJpbmcgbmV3T2JqZWN0VHlwZSkgewotCQlTdHJpbmcgb2xkT2JqZWN0VHlwZSA9IHRoaXMub2JqZWN0VHlwZTsKLQkJdGhpcy5vYmplY3RUeXBlID0gbmV3T2JqZWN0VHlwZTsKLQkJZ2V0WG1sUmVzb3VyY2UoKS5zZXRPYmplY3RUeXBlKG5ld09iamVjdFR5cGUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9UWVBFX1BST1BFUlRZLCBvbGRPYmplY3RUeXBlLCBuZXdPYmplY3RUeXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0T2JqZWN0VHlwZV8oU3RyaW5nIG5ld09iamVjdFR5cGUpIHsKLQkJU3RyaW5nIG9sZE9iamVjdFR5cGUgPSB0aGlzLm9iamVjdFR5cGU7Ci0JCXRoaXMub2JqZWN0VHlwZSA9IG5ld09iamVjdFR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfUFJPUEVSVFksIG9sZE9iamVjdFR5cGUsIG5ld09iamVjdFR5cGUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxUeXBlQ29udmVydGVyIHhtbFJlc291cmNlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoeG1sUmVzb3VyY2UpOwotCQl0aGlzLmRhdGFUeXBlID0gZ2V0UmVzb3VyY2VEYXRhVHlwZSgpOwotCQl0aGlzLm9iamVjdFR5cGUgPSBnZXRSZXNvdXJjZU9iamVjdFR5cGUoKTsKLQkJdGhpcy5kYXRhVHlwZVBlcnNpc3RlbnRUeXBlID0gdGhpcy5nZXREYXRhVHlwZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7Ci0JCXRoaXMub2JqZWN0VHlwZVBlcnNpc3RlbnRUeXBlID0gdGhpcy5nZXRPYmplY3RUeXBlSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJc2V0RGF0YVR5cGVfKGdldFJlc291cmNlRGF0YVR5cGUoKSk7Ci0JCXNldE9iamVjdFR5cGVfKGdldFJlc291cmNlT2JqZWN0VHlwZSgpKTsKLQkJdXBkYXRlRGF0YVR5cGVQZXJzaXN0ZW50VHlwZSgpOwotCQl1cGRhdGVPYmplY3RUeXBlUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZURhdGFUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlT2JqZWN0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VDb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXREYXRhVHlwZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLnJlc29sdmVKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSh0aGlzLmdldERhdGFUeXBlKCkpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRPYmplY3RUeXBlSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eU1hcHBpbmdzKCkucmVzb2x2ZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKHRoaXMuZ2V0T2JqZWN0VHlwZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGF0YVR5cGVQZXJzaXN0ZW50VHlwZSgpIHsKLQkJdGhpcy5kYXRhVHlwZVBlcnNpc3RlbnRUeXBlID0gdGhpcy5nZXREYXRhVHlwZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlT2JqZWN0VHlwZVBlcnNpc3RlbnRUeXBlKCkgewotCQl0aGlzLm9iamVjdFR5cGVQZXJzaXN0ZW50VHlwZSA9IHRoaXMuZ2V0T2JqZWN0VHlwZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKioqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXRoaXMuY3JlYXRlUmVuYW1lRGF0YVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJdGhpcy5jcmVhdGVSZW5hbWVPYmplY3RUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVEYXRhVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKHRoaXMuZGF0YVR5cGVJc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVEYXRhVHlwZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRGF0YVR5cGVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIGdldFhtbFJlc291cmNlKCkuY3JlYXRlUmVuYW1lRGF0YVR5cGVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVPYmplY3RUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAodGhpcy5vYmplY3RUeXBlSXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lT2JqZWN0VHlwZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lT2JqZWN0VHlwZUVkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gZ2V0WG1sUmVzb3VyY2UoKS5jcmVhdGVSZW5hbWVPYmplY3RUeXBlRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXRoaXMuY3JlYXRlTW92ZURhdGFUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCXRoaXMuY3JlYXRlTW92ZU9iamVjdFR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVEYXRhVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCWlmICh0aGlzLmRhdGFUeXBlSXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lRGF0YVR5cGVQYWNrYWdlRWRpdChuZXdQYWNrYWdlLmdldEVsZW1lbnROYW1lKCkpKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVEYXRhVHlwZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBnZXRYbWxSZXNvdXJjZSgpLmNyZWF0ZVJlbmFtZURhdGFUeXBlUGFja2FnZUVkaXQobmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlT2JqZWN0VHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCWlmICh0aGlzLm9iamVjdFR5cGVJc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVPYmplY3RUeXBlUGFja2FnZUVkaXQobmV3UGFja2FnZS5nZXRFbGVtZW50TmFtZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lT2JqZWN0VHlwZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBnZXRYbWxSZXNvdXJjZSgpLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVQYWNrYWdlRWRpdChuZXdOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQl0aGlzLmNyZWF0ZVJlbmFtZURhdGFUeXBlUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVEYXRhVHlwZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKHRoaXMuZGF0YVR5cGVJc0luKG9yaWdpbmFsUGFja2FnZSkpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZURhdGFUeXBlUGFja2FnZUVkaXQobmV3TmFtZSkpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVPYmplY3RUeXBlUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAodGhpcy5vYmplY3RUeXBlSXNJbihvcmlnaW5hbFBhY2thZ2UpKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVPYmplY3RUeXBlUGFja2FnZUVkaXQobmV3TmFtZSkpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGF0YVR5cGVJc0ZvcihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNGb3IodGhpcy5kYXRhVHlwZVBlcnNpc3RlbnRUeXBlLCB0eXBlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gb2JqZWN0VHlwZUlzRm9yKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5pc0Zvcih0aGlzLm9iamVjdFR5cGVQZXJzaXN0ZW50VHlwZSwgdHlwZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRm9yKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlICE9IG51bGwgJiYgcGVyc2lzdGVudFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0eXBlTmFtZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsJCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGF0YVR5cGVJc0luKElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCXJldHVybiB0aGlzLmlzSW4odGhpcy5kYXRhVHlwZVBlcnNpc3RlbnRUeXBlLCBwYWNrYWdlRnJhZ21lbnQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG9iamVjdFR5cGVJc0luKElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCXJldHVybiB0aGlzLmlzSW4odGhpcy5vYmplY3RUeXBlUGVyc2lzdGVudFR5cGUsIHBhY2thZ2VGcmFnbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSwgSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCXJldHVybiBwZXJzaXN0ZW50VHlwZS5pc0luKHBhY2thZ2VGcmFnbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1MGMzNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8WG1sVmFyaWFibGVPbmVUb09uZT4gCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nCi17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbFZhcmlhYmxlT25lVG9PbmUgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZyh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlZBUklBQkxFX09ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7Ci0JCSgoQXR0cmlidXRlcykgcmVzb3VyY2VBdHRyaWJ1dGVzKS5nZXRWYXJpYWJsZU9uZVRvT25lcygpLmFkZCh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgewotCQkoKEF0dHJpYnV0ZXMpIHJlc291cmNlQXR0cmlidXRlcykuZ2V0VmFyaWFibGVPbmVUb09uZXMoKS5yZW1vdmUodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiA2NTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWIwYTlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVkFSSUFCTEVfT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkUmVzb3VyY2VNYXBwaW5nKEVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKLQkJCQlmYWN0b3J5LCAKLQkJCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFZhcmlhYmxlT25lVG9PbmUoKSwgCi0JCQkJWG1sVmFyaWFibGVPbmVUb09uZS5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkQ29udGV4dE1hcHBpbmcoCi0JCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgCi0JCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgCi0JCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gKChFY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeSkgZmFjdG9yeSkuCi0JCQkJYnVpbGRPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKHBhcmVudCwgKFhtbFZhcmlhYmxlT25lVG9PbmUpIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFJlc291cmNlTWFwcGluZygKLQkJCU9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCAKLQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCAKLQkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKEVjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5KSBmYWN0b3J5KS4KLQkJCQlidWlsZFZpcnR1YWxFY2xpcHNlTGlua1htbFZhcmlhYmxlT25lVG9PbmUob3JtVHlwZU1hcHBpbmcsIChKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZykgamF2YUF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTY2ZDA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1WZXJzaW9uTWFwcGluZzxYbWxWZXJzaW9uPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZwotewkKLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGU7Ci0JCi0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbFZlcnNpb24gcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQkJdGhpcy5tdXRhYmxlID0gbmV3IE9ybUVjbGlwc2VMaW5rTXV0YWJsZSh0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCQotCQotCXB1YmxpYyBFY2xpcHNlTGlua011dGFibGUgZ2V0TXV0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMubXV0YWJsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIGJ1aWxkQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7Ci0JCU9ybUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBzdXBlci5idWlsZENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlKTsKLQkJaWYgKG9ybUNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gb3JtQ29udmVydGVyOwotCQl9Ci0JCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGNvbnZlcnRlclR5cGUsIEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSkgewotCQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0NvbnZlcnQodGhpcywgdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKSB7Ci0JCS8vY2hlY2sgQENvbnZlcnQgZmlyc3QsIHRoaXMgaXMgdGhlIG9yZGVyIHRoYXQgRWNsaXBzZUxpbmsgc2VhcmNoZXMKLQkJaWYgKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnQoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVI7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlQ29udmVydGVyVHlwZSgpOwotCX0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlLWNvbnRleHQgaW50ZXJhY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLm11dGFibGUudXBkYXRlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJLy8gVE9ETyAtIG11dGFibGUgdmFsaWRhdGlvbgotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpYy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZmIxMzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7Ci0KLS8qKgotICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljIGV4dGVuZHMgWG1sQmFzaWMKLXsKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFCYXNpY01hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxCYXNpYyB2aXJ0dWFsWG1sQmFzaWM7Ci0JCi0JcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUJhc2ljTWFwcGluZzsKLQkJdGhpcy52aXJ0dWFsWG1sQmFzaWMgPSBuZXcgVmlydHVhbFhtbEJhc2ljKG9ybVR5cGVNYXBwaW5nLCBqYXZhQmFzaWNNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0TWFwcGluZ0tleSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXROYW1lKG5ld05hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXROYW1lVGV4dFJhbmdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRDb2x1bW4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oWG1sQ29sdW1uIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbEJhc2ljLnNldENvbHVtbih2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRGZXRjaCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgewotCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXRGZXRjaChuZXdGZXRjaCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRPcHRpb25hbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gbmV3T3B0aW9uYWwpIHsKLQkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0T3B0aW9uYWwobmV3T3B0aW9uYWwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzTG9iKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuaXNMb2IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiBuZXdMb2IpIHsKLQkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0TG9iKG5ld0xvYik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9iVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0TG9iVGV4dFJhbmdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldFRlbXBvcmFsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIHNldFRlbXBvcmFsKXsKLQkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0VGVtcG9yYWwoc2V0VGVtcG9yYWwpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRlbXBvcmFsVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRW51bVR5cGUgZ2V0RW51bWVyYXRlZCgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldEVudW1lcmF0ZWQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRFbnVtZXJhdGVkKEVudW1UeXBlIHNldEVudW1lcmF0ZWQpIHsKLQkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0RW51bWVyYXRlZChzZXRFbnVtZXJhdGVkKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRFbnVtZXJhdGVkVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQm9vbGVhbiBnZXRNdXRhYmxlKCkgewotCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoKChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZykuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCX0KLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZigoKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nKS5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNdXRhYmxlKEJvb2xlYW4gdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TXV0YWJsZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0KCkgewotCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgewotCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnQoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkgewotCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgewotCQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyID0gKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUikgewotCQkJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sQ29udmVydGVyKHRoaXMub3JtVHlwZU1hcHBpbmcsIChKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFhtbENvbnZlcnRlciB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRPYmplY3RUeXBlQ29udmVydGVyKCkgewotCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgewotCQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyID0gKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSB7Ci0JCQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPYmplY3RUeXBlQ29udmVydGVyKHRoaXMub3JtVHlwZU1hcHBpbmcsIChKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sU3RydWN0Q29udmVydGVyIGdldFN0cnVjdENvbnZlcnRlcigpIHsKLQkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpIHsKLQkJCUVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCWlmIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVIpIHsKLQkJCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbFN0cnVjdENvbnZlcnRlcih0aGlzLm9ybVR5cGVNYXBwaW5nLCAoSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbFR5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpIHsKLQkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpIHsKLQkJCUVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCWlmIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKSB7Ci0JCQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxUeXBlQ29udmVydGVyKHRoaXMub3JtVHlwZU1hcHBpbmcsIChKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZThjMzFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7Ci0KLS8qKgotICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbiBleHRlbmRzIFhtbEJhc2ljQ29sbGVjdGlvbgotewotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKLQkJCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nIHZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nOwotCi0JcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbihPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyBqYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKLQkJdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyA9IG5ldyBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyhvcm1UeXBlTWFwcGluZywgamF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKLQkJLy8gVE9ETyBnZXQgZnJvbSBqYXZhIGFubm90YXRpb25zCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljTWFwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjYmIyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OwotCi0vKioKLSAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCi0gKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY01hcCBleHRlbmRzIFhtbEJhc2ljTWFwCi17Ci0JcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0JCQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyB2aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZzsKLQotCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY01hcChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nIGphdmFCYXNpY01hcE1hcHBpbmcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUJhc2ljTWFwTWFwcGluZzsKLQkJdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyA9IG5ldyBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyhvcm1UeXBlTWFwcGluZywgamF2YUJhc2ljTWFwTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TWFwcGluZ0tleSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXROYW1lVGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQ29udmVyc2lvblZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQ29udmVyc2lvblZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NmI5YWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbENvbnZlcnNpb25WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZTsKLQotLyoqCi0gKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sQ29udmVyc2lvblZhbHVlIGV4dGVuZHMgWG1sQ29udmVyc2lvblZhbHVlCi17Ci0JcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOwotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBqYXZhQ29udmVyc2lvblZhbHVlOwotCQotCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxDb252ZXJzaW9uVmFsdWUoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGphdmFDb252ZXJzaW9uVmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFDb252ZXJzaW9uVmFsdWUgPSBqYXZhQ29udmVyc2lvblZhbHVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERhdGFWYWx1ZSgpIHsKLQkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXREYXRhVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFZhbHVlKCkgewotCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RGF0YVZhbHVlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRPYmplY3RWYWx1ZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTE0Y2M2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7Ci0KLS8qKgotICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbENvbnZlcnRlciBleHRlbmRzIFhtbENvbnZlcnRlcgotewotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGphdmFDb252ZXJ0ZXI7Ci0JCi0JcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbENvbnZlcnRlcihPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGphdmFDb252ZXJ0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFDb252ZXJ0ZXIgPSBqYXZhQ29udmVydGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFDb252ZXJ0ZXIuZ2V0RnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChpc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YUNvbnZlcnRlci5nZXROYW1lKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MjhjNjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKLQotLyoqCi0gKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQgZXh0ZW5kcyBYbWxFbWJlZGRlZAotewotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVtYmVkZGVkTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKLQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sRW1iZWRkZWQgdmlydHVhbFhtbEVtYmVkZGVkOwotCQkKLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbWJlZGRlZE1hcHBpbmcgamF2YUVtYmVkZGVkTWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhRW1iZWRkZWRNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZCA9IG5ldyBWaXJ0dWFsWG1sRW1iZWRkZWQob3JtVHlwZU1hcHBpbmcsIGphdmFFbWJlZGRlZE1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZC5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMudmlydHVhbFhtbEVtYmVkZGVkLnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKLQkJLy8gVE9ETyBnZXQgZnJvbSBqYXZhIGFubm90YXRpb25zCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZElkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWRJZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjY4ZDM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZElkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbFhtbEVtYmVkZGVkSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKLQotLyoqCi0gKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWRJZCBleHRlbmRzIFhtbEVtYmVkZGVkSWQKLXsKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFbWJlZGRlZElkTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKLQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sRW1iZWRkZWRJZCB2aXJ0dWFsWG1sRW1iZWRkZWRJZDsKLQkJCi0JcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkSWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbWJlZGRlZElkTWFwcGluZyBqYXZhRW1iZWRkZWRJZE1hcHBpbmcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUVtYmVkZGVkSWRNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZElkID0gbmV3IFZpcnR1YWxYbWxFbWJlZGRlZElkKG9ybVR5cGVNYXBwaW5nLCBqYXZhRW1iZWRkZWRJZE1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZElkLmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWRJZC5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZElkLnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQuZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWRJZC5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKSB7Ci0JCS8vIFRPRE8gZ2V0IGZyb20gamF2YSBhbm5vdGF0aW9ucwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sSWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxJZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDg0ODc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxJZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbFhtbElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLQotLyoqCi0gKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sSWQgZXh0ZW5kcyBYbWxJZAotewotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUlkTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKLQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sSWQgdmlydHVhbFhtbElkOwotCQkKLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sSWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFJZE1hcHBpbmcgamF2YUlkTWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhSWRNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxJZCA9IG5ldyBWaXJ0dWFsWG1sSWQob3JtVHlwZU1hcHBpbmcsIGphdmFJZE1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMudmlydHVhbFhtbElkLnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldENvbHVtbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0Q29sdW1uKHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0VGVtcG9yYWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpewotCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRUZW1wb3JhbChuZXdUZW1wb3JhbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRUZW1wb3JhbFRleHRSYW5nZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxHZW5lcmF0ZWRWYWx1ZSBnZXRHZW5lcmF0ZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldEdlbmVyYXRlZFZhbHVlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbElkLnNldEdlbmVyYXRlZFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbElkLnNldFNlcXVlbmNlR2VuZXJhdG9yKHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRUYWJsZUdlbmVyYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbElkLnNldFRhYmxlR2VuZXJhdG9yKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVudW1UeXBlIGdldEVudW1lcmF0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRFbnVtZXJhdGVkKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEVudW1lcmF0ZWQoRW51bVR5cGUgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0RW51bWVyYXRlZCh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNMb2IoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5pc0xvYigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRMb2IodmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldExvYlRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldExvYlRleHRSYW5nZSgpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQm9vbGVhbiBnZXRNdXRhYmxlKCkgewotCQkvL2Rvbid0IG5lZWQgaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgY2hlY2sgYmVjYXVzZSB0aGVyZSBpcyBubyBkZWZhdWx0IElkIG1hcHBpbmcKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZigoKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nKS5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNdXRhYmxlKEJvb2xlYW4gdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0KCkgewotCQkvL2Rvbid0IG5lZWQgaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgY2hlY2sgYmVjYXVzZSB0aGVyZSBpcyBubyBkZWZhdWx0IElkIG1hcHBpbmcKLQkJaWYgKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSB7Ci0JCQlyZXR1cm4gKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlck5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Q29udmVydChTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkgewotCQkvL2Rvbid0IG5lZWQgaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgY2hlY2sgYmVjYXVzZSB0aGVyZSBpcyBubyBkZWZhdWx0IElkIG1hcHBpbmcKLQkJaWYgKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSB7Ci0JCQlFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCQlpZiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSKSB7Ci0JCQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxDb252ZXJ0ZXIodGhpcy5vcm1UeXBlTWFwcGluZywgKEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxPYmplY3RUeXBlQ29udmVydGVyIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSB7Ci0JCS8vZG9uJ3QgbmVlZCBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSBjaGVjayBiZWNhdXNlIHRoZXJlIGlzIG5vIGRlZmF1bHQgSWQgbWFwcGluZwotCQlpZiAodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpIHsKLQkJCUVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCWlmIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUikgewotCQkJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sT2JqZWN0VHlwZUNvbnZlcnRlcih0aGlzLm9ybVR5cGVNYXBwaW5nLCAoSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbFN0cnVjdENvbnZlcnRlciBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKSB7Ci0JCS8vZG9uJ3QgbmVlZCBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSBjaGVjayBiZWNhdXNlIHRoZXJlIGlzIG5vIGRlZmF1bHQgSWQgbWFwcGluZwotCQlpZiAodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpIHsKLQkJCUVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCWlmIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVIpIHsKLQkJCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbFN0cnVjdENvbnZlcnRlcih0aGlzLm9ybVR5cGVNYXBwaW5nLCAoSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbFR5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpIHsKLQkJLy9kb24ndCBuZWVkIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIGNoZWNrIGJlY2F1c2UgdGhlcmUgaXMgbm8gZGVmYXVsdCBJZCBtYXBwaW5nCi0JCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgewotCQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyID0gKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpIHsKLQkJCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbFR5cGVDb252ZXJ0ZXIodGhpcy5vcm1UeXBlTWFwcGluZywgKEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKLQkJLy8gVE9ETyBnZXQgZnJvbSBqYXZhIGFubm90YXRpb25zCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE11dGFibGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvTWFueS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb01hbnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2YWNmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvTWFueS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sTWFueVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7Ci0KLS8qKgotICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb01hbnkgZXh0ZW5kcyBYbWxNYW55VG9NYW55Ci17Ci0JcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbE1hbnlUb01hbnkgdmlydHVhbFhtbE1hbnlUb01hbnk7Ci0JCQotCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55KE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKLQkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFNYW55VG9NYW55TWFwcGluZzsKLQkJdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueSA9IG5ldyBWaXJ0dWFsWG1sTWFueVRvTWFueShvcm1UeXBlTWFwcGluZywgamF2YU1hbnlUb01hbnlNYXBwaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0RmV0Y2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpIHsKLQkJdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5zZXRGZXRjaChuZXdGZXRjaCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldENhc2NhZGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldENhc2NhZGUodmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldEpvaW5UYWJsZSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0VGFyZ2V0RW50aXR5KHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0TWFwcGVkQnkodmFsdWUpOwotCX0KLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBNYXBLZXkgZ2V0TWFwS2V5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRNYXBLZXkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TWFwS2V5KE1hcEtleSB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldE1hcEtleSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0T3JkZXJCeSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5KFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldE9yZGVyQnkodmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sT3JkZXJDb2x1bW4gZ2V0T3JkZXJDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldE9yZGVyQ29sdW1uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldE1hcHBlZEJ5VGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0Sm9pbkZldGNoKCkgewotCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBudWxsOyAvL2Rvbid0IHJldHVybiBkZWZhdWx0IHZhbHVlLCBpdCBvbmx5IGFwcGxpZXMgZm9yIGFuIGVtcHR5IEBKb2luRmV0Y2gKLQkJfQotCQlyZXR1cm4gRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCgoKEphdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nKSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nKS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvT25lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvT25lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZGQ0NjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OwotCi0vKioKLSAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCi0gKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9PbmUgZXh0ZW5kcyBYbWxNYW55VG9PbmUKLXsKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFNYW55VG9PbmVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxNYW55VG9PbmUgdmlydHVhbFhtbE1hbnlUb09uZTsKLQkJCi0JcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YU1hbnlUb09uZU1hcHBpbmcgamF2YU1hbnlUb09uZU1hcHBpbmcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YU1hbnlUb09uZU1hcHBpbmc7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZSA9IG5ldyBWaXJ0dWFsWG1sTWFueVRvT25lKG9ybVR5cGVNYXBwaW5nLCBqYXZhTWFueVRvT25lTWFwcGluZyk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldEZldGNoKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5zZXRGZXRjaChuZXdGZXRjaCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0T3B0aW9uYWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5zZXRPcHRpb25hbChuZXdPcHRpb25hbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRKb2luQ29sdW1ucygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDYXNjYWRlVHlwZSBnZXRDYXNjYWRlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldENhc2NhZGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuc2V0Q2FzY2FkZSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldEpvaW5UYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLnNldEpvaW5UYWJsZSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLnNldFRhcmdldEVudGl0eSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKSB7Ci0JCWlmIChpc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgewotCQkJcmV0dXJuIG51bGw7IC8vZG9uJ3QgcmV0dXJuIGRlZmF1bHQgdmFsdWUsIGl0IG9ubHkgYXBwbGllcyBmb3IgYW4gZW1wdHkgQEpvaW5GZXRjaAotCQl9Ci0JCXJldHVybiBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKCgoQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nKSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nKS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTBjYzk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7Ci0KLS8qKgotICogVmlydHVhbFZlcnNpb24gaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgVmVyc2lvbiB1c2VkIHdoZW4gdGhlcmUgaXMgCi0gKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YVZlcnNpb25NYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbE51bGxBdHRyaWJ1dGVNYXBwaW5nIGV4dGVuZHMgWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JCi0JcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIHZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZzsKLQkKLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKLQkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZyA9IG5ldyBWaXJ0dWFsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcob3JtVHlwZU1hcHBpbmcsIGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TWFwcGluZ0tleSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLnZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5zZXROYW1lKG5ld05hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5nZXROYW1lVGV4dFJhbmdlKCk7Ci0JfQkKLQkKLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9iamVjdFR5cGVDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPYmplY3RUeXBlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZWNmZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLQotLyoqCi0gKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBleHRlbmRzIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIKLXsKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgamF2YUNvbnZlcnRlcjsKLQkKLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sT2JqZWN0VHlwZUNvbnZlcnRlcihPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBqYXZhQ29udmVydGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKLQkJdGhpcy5qYXZhQ29udmVydGVyID0gamF2YUNvbnZlcnRlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFDb252ZXJ0ZXIuZ2V0TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlKCkgewotCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFDb252ZXJ0ZXIuZ2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RUeXBlKCkgewotCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFDb252ZXJ0ZXIuZ2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgewotCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFDb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbENvbnZlcnNpb25WYWx1ZT4gZ2V0Q29udmVyc2lvblZhbHVlcygpIHsKLQkJRUxpc3Q8WG1sQ29udmVyc2lvblZhbHVlPiBjb252ZXJzaW9uVmFsdWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbENvbnZlcnNpb25WYWx1ZT4oWG1sQ29udmVyc2lvblZhbHVlLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVMpOwotCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBjb252ZXJzaW9uVmFsdWVzOwotCQl9Ci0JCWZvciAoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgamF2YUNvbnZlcnNpb25WYWx1ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmphdmFDb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpKSkgewotCQkJWG1sQ29udmVyc2lvblZhbHVlIHhtbENvbnZlcnNpb25WYWx1ZSA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxDb252ZXJzaW9uVmFsdWUodGhpcy5vcm1UeXBlTWFwcGluZywgamF2YUNvbnZlcnNpb25WYWx1ZSk7Ci0JCQljb252ZXJzaW9uVmFsdWVzLmFkZCh4bWxDb252ZXJzaW9uVmFsdWUpOwotCQl9Ci0JCXJldHVybiBjb252ZXJzaW9uVmFsdWVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWJjZWVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci0KLS8qKgotICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueSBleHRlbmRzIFhtbE9uZVRvTWFueQotewkKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbE9uZVRvTWFueSB2aXJ0dWFsWG1sT25lVG9NYW55OwotCQkKLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9NYW55KAotCQkJT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YU9uZVRvTWFueU1hcHBpbmc7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueSA9IG5ldyBWaXJ0dWFsWG1sT25lVG9NYW55KG9ybVR5cGVNYXBwaW5nLCBqYXZhT25lVG9NYW55TWFwcGluZyk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0TWFwcGluZ0tleSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXROYW1lVGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0RmV0Y2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpIHsKLQkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldEZldGNoKG5ld0ZldGNoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2FzY2FkZVR5cGUgZ2V0Q2FzY2FkZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRDYXNjYWRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldENhc2NhZGUoQ2FzY2FkZVR5cGUgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldENhc2NhZGUodmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRKb2luVGFibGUodmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRUYXJnZXRFbnRpdHkodmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE1hcHBlZEJ5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0TWFwcGVkQnkodmFsdWUpOwotCX0KLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBNYXBLZXkgZ2V0TWFwS2V5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE1hcEtleSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXkoTWFwS2V5IHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRNYXBLZXkodmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE9yZGVyQnkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0T3JkZXJCeSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5KFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0T3JkZXJCeSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxPcmRlckNvbHVtbiBnZXRPcmRlckNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRPcmRlckNvbHVtbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE1hcHBlZEJ5VGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgewotCQlFTGlzdDxYbWxKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxKb2luQ29sdW1uPihYbWxKb2luQ29sdW1uLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TKTsKLQkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbnM7Ci0JCX0KLQkJZm9yIChKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiAKLQkJCUNvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSgKLQkJCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLgotCQkJCQlnZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkpIHsKLQkJCVhtbEpvaW5Db2x1bW4geG1sSm9pbkNvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sSm9pbkNvbHVtbihqb2luQ29sdW1uLCBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQlqb2luQ29sdW1ucy5hZGQoeG1sSm9pbkNvbHVtbik7Ci0JCX0KLQkJcmV0dXJuIGpvaW5Db2x1bW5zOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpIHsKLQkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy9kb24ndCByZXR1cm4gZGVmYXVsdCB2YWx1ZSwgaXQgb25seSBhcHBsaWVzIGZvciBhbiBlbXB0eSBASm9pbkZldGNoCi0JCX0KLQkJcmV0dXJuIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZU93bmVkKCkgewotCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRQcml2YXRlT3duZWQoYm9vbGVhbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKSB7Ci0JCS8vIFRPRE8gZ2V0IGZyb20gamF2YSBhbm5vdGF0aW9ucwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFByaXZhdGVPd25lZFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSmF2YU9ycGhhblJlbW92YWJsZTJfMCBnZXRPcnBoYW5SZW1vdmFsT2YoT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nKSB7Ci0JCXJldHVybiAoKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvbmVUb01hbnlNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEJvb2xlYW4gZ2V0T3JwaGFuUmVtb3ZhbCgpIHsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZih0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSk7Ci0JCX0KLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE9ycGhhblJlbW92YWwoQm9vbGVhbiBuZXdPcnBoYW5SZW1vdmFsKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvT25lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ1ZWQ1Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7Ci0KLS8qKgotICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvT25lIGV4dGVuZHMgWG1sT25lVG9PbmUKLXsKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxPbmVUb09uZSB2aXJ0dWFsWG1sT25lVG9PbmU7Ci0JCQotCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgamF2YU9uZVRvT25lTWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhT25lVG9PbmVNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZSA9IG5ldyBWaXJ0dWFsWG1sT25lVG9PbmUob3JtVHlwZU1hcHBpbmcsIGphdmFPbmVUb09uZU1hcHBpbmcpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldEZldGNoKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldEZldGNoKG5ld0ZldGNoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE9wdGlvbmFsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBuZXdPcHRpb25hbCkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRPcHRpb25hbChuZXdPcHRpb25hbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0Sm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2FzY2FkZVR5cGUgZ2V0Q2FzY2FkZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldENhc2NhZGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRDYXNjYWRlKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRKb2luVGFibGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldEpvaW5UYWJsZSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRUYXJnZXRFbnRpdHkodmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRNYXBwZWRCeSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRNYXBwZWRCeSh2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE1hcHBlZEJ5VGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpIHsKLQkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy9kb24ndCByZXR1cm4gZGVmYXVsdCB2YWx1ZSwgaXQgb25seSBhcHBsaWVzIGZvciBhbiBlbXB0eSBASm9pbkZldGNoCi0JCX0KLQkJcmV0dXJuIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwoKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcpLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNQcml2YXRlT3duZWQoKSB7Ci0JCWlmIChpc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiAodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZykuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwcml2YXRlIEphdmFPcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbE9mKE9uZVRvT25lTWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nKSB7Ci0JCXJldHVybiAoKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvbmVUb01hbnlNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEJvb2xlYW4gZ2V0T3JwaGFuUmVtb3ZhbCgpIHsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZih0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSk7Ci0JCX0KLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE9ycGhhblJlbW92YWwoQm9vbGVhbiBuZXdPcnBoYW5SZW1vdmFsKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFN0cnVjdENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFN0cnVjdENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGQ4YTUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxTdHJ1Y3RDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXI7Ci0KLS8qKgotICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbFN0cnVjdENvbnZlcnRlciBleHRlbmRzIFhtbFN0cnVjdENvbnZlcnRlcgotewotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgamF2YUNvbnZlcnRlcjsKLQkKLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sU3RydWN0Q29udmVydGVyKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBqYXZhQ29udmVydGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKLQkJdGhpcy5qYXZhQ29udmVydGVyID0gamF2YUNvbnZlcnRlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlcigpIHsKLQkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhQ29udmVydGVyLmdldE5hbWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjZGQ5YzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbjsKLQotLyoqCi0gKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24gZXh0ZW5kcyBYbWxUcmFuc2Zvcm1hdGlvbgotewotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCQkKLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcgdmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci0KLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24oT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyBqYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKLQkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7Ci0JCXRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcgPSBuZXcgVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcob3JtVHlwZU1hcHBpbmcsIGphdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNpZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTgzZmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sVHJhbnNpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQ7Ci0KLS8qKgotICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zaWVudCBleHRlbmRzIFhtbFRyYW5zaWVudAotewotCQkKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFUcmFuc2llbnRNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxUcmFuc2llbnQgdmlydHVhbFhtbFRyYW5zaWVudDsKLQkKLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNpZW50KE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhVHJhbnNpZW50TWFwcGluZyBqYXZhVHJhbnNpZW50TWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhVHJhbnNpZW50TWFwcGluZzsKLQkJdGhpcy52aXJ0dWFsWG1sVHJhbnNpZW50ID0gbmV3IFZpcnR1YWxYbWxUcmFuc2llbnQob3JtVHlwZU1hcHBpbmcsIGphdmFUcmFuc2llbnRNYXBwaW5nKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVHJhbnNpZW50LmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVHJhbnNpZW50LmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMudmlydHVhbFhtbFRyYW5zaWVudC5zZXROYW1lKG5ld05hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxUcmFuc2llbnQuZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxUeXBlQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sVHlwZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWE4YzdiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxUeXBlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7Ci0KLS8qKgotICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbFR5cGVDb252ZXJ0ZXIgZXh0ZW5kcyBYbWxUeXBlQ29udmVydGVyCi17Ci0JcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOwotCQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGphdmFDb252ZXJ0ZXI7Ci0JCi0JcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbFR5cGVDb252ZXJ0ZXIoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgamF2YUNvbnZlcnRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUNvbnZlcnRlciA9IGphdmFDb252ZXJ0ZXI7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhQ29udmVydGVyLmdldE5hbWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZSgpIHsKLQkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhQ29udmVydGVyLmdldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhQ29udmVydGVyLmdldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sVmFyaWFibGVPbmVUb09uZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFZhcmlhYmxlT25lVG9PbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJiZDBjMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sVmFyaWFibGVPbmVUb09uZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lOwotCi0vKioKLSAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCi0gKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxWYXJpYWJsZU9uZVRvT25lIGV4dGVuZHMgWG1sVmFyaWFibGVPbmVUb09uZQotewotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0JCQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyB2aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZzsKLQotCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxWYXJpYWJsZU9uZVRvT25lKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyBqYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nID0gbmV3IFZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nKG9ybVR5cGVNYXBwaW5nLCBqYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKLQkJLy8gVE9ETyBnZXQgZnJvbSBqYXZhIGFubm90YXRpb25zCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFZlcnNpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxWZXJzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YzMwY2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbFhtbFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLQotLyoqCi0gKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmVyc2lvbiBleHRlbmRzIFhtbFZlcnNpb24KLXsKLQkJCi0JcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhVmVyc2lvbk1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbFZlcnNpb24gdmlydHVhbFhtbFZlcnNpb247Ci0JCi0JcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbFZlcnNpb24oT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFWZXJzaW9uTWFwcGluZyBqYXZhVmVyc2lvbk1hcHBpbmcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YVZlcnNpb25NYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxWZXJzaW9uID0gbmV3IFZpcnR1YWxYbWxWZXJzaW9uKG9ybVR5cGVNYXBwaW5nLCBqYXZhVmVyc2lvbk1hcHBpbmcpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxDb2x1bW4gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXRDb2x1bW4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oWG1sQ29sdW1uIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbFZlcnNpb24uc2V0Q29sdW1uKHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXRUZW1wb3JhbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCl7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRW51bVR5cGUgZ2V0RW51bWVyYXRlZCgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0RW51bWVyYXRlZCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRFbnVtZXJhdGVkKEVudW1UeXBlIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0xvYigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uaXNMb2IoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TG9iKGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRMb2JUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldExvYlRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRlbXBvcmFsVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXRUZW1wb3JhbFRleHRSYW5nZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBCb29sZWFuIGdldE11dGFibGUoKSB7Ci0JCS8vZG9uJ3QgbmVlZCBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSBjaGVjayBiZWNhdXNlIHRoZXJlIGlzIG5vIGRlZmF1bHQgSWQgbWFwcGluZwotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCgoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZykuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TXV0YWJsZShCb29sZWFuIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydCgpIHsKLQkJLy9kb24ndCBuZWVkIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIGNoZWNrIGJlY2F1c2UgdGhlcmUgaXMgbm8gZGVmYXVsdCBJZCBtYXBwaW5nCi0JCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgewotCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnQoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TXV0YWJsZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbENvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKSB7Ci0JCS8vZG9uJ3QgbmVlZCBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSBjaGVjayBiZWNhdXNlIHRoZXJlIGlzIG5vIGRlZmF1bHQgSWQgbWFwcGluZwotCQlpZiAodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpIHsKLQkJCUVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCWlmIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLkNVU1RPTV9DT05WRVJURVIpIHsKLQkJCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbENvbnZlcnRlcih0aGlzLm9ybVR5cGVNYXBwaW5nLCAoSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpIHsKLQkJLy9kb24ndCBuZWVkIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIGNoZWNrIGJlY2F1c2UgdGhlcmUgaXMgbm8gZGVmYXVsdCBJZCBtYXBwaW5nCi0JCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgewotCQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyID0gKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSB7Ci0JCQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPYmplY3RUeXBlQ29udmVydGVyKHRoaXMub3JtVHlwZU1hcHBpbmcsIChKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sU3RydWN0Q29udmVydGVyIGdldFN0cnVjdENvbnZlcnRlcigpIHsKLQkJLy9kb24ndCBuZWVkIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIGNoZWNrIGJlY2F1c2UgdGhlcmUgaXMgbm8gZGVmYXVsdCBJZCBtYXBwaW5nCi0JCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgewotCQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyID0gKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUikgewotCQkJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sU3RydWN0Q29udmVydGVyKHRoaXMub3JtVHlwZU1hcHBpbmcsIChKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBnZXRUeXBlQ29udmVydGVyKCkgewotCQkvL2Rvbid0IG5lZWQgaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgY2hlY2sgYmVjYXVzZSB0aGVyZSBpcyBubyBkZWZhdWx0IElkIG1hcHBpbmcKLQkJaWYgKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSB7Ci0JCQlFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCQlpZiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUikgewotCQkJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHlwZUNvbnZlcnRlcih0aGlzLm9ybVR5cGVNYXBwaW5nLCAoSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0phckZpbGVSZWYuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rSmFyRmlsZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTM4NzdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rSmFyRmlsZVJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RKYXJGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphckZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmFyRmlsZVJlZiAKLQlleHRlbmRzIEFic3RyYWN0SmFyRmlsZVJlZgotewotCXB1YmxpYyBFY2xpcHNlTGlua0phckZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sSmFyRmlsZVJlZik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElQYXRoW10gcmVzb2x2ZVJ1bnRpbWVKYXJGaWxlUGF0aFdlYihJUGF0aCByb290LCBJUGF0aCBqYXJGaWxlUGF0aCkgewotCQlJUGF0aFtdIGdlbmVyaWNQYXRoID0gc3VwZXIucmVzb2x2ZVJ1bnRpbWVKYXJGaWxlUGF0aFdlYihyb290LCBqYXJGaWxlUGF0aCk7Ci0JCXJldHVybiBBcnJheVRvb2xzLnJlbW92ZUxhc3QoZ2VuZXJpY1BhdGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ODQyOTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlLkltcGxpZWRNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmdlbmVyYWwuR2VuZXJhbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuZ2VuZXJhbC5FY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBwZXJzaXN0ZW5jZSB1bml0Ci0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdAotCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQKLXsKLQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVSZWYgaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWY7Ci0KLQlwcml2YXRlLypmaW5hbCovIEdlbmVyYWxQcm9wZXJ0aWVzIGdlbmVyYWxQcm9wZXJ0aWVzOwotCXByaXZhdGUgQ3VzdG9taXphdGlvbiBjdXN0b21pemF0aW9uOwotCXByaXZhdGUgQ2FjaGluZyBjYWNoaW5nOwotCXByaXZhdGUgTG9nZ2luZyBsb2dnaW5nOwotCXByaXZhdGUgU2NoZW1hR2VuZXJhdGlvbiBzY2hlbWFHZW5lcmF0aW9uOwotCi0JLyogZ2xvYmFsIGNvbnZlcnRlciBkZWZpbml0aW9ucywgZGVmaW5lZCBlbHNld2hlcmUgaW4gbW9kZWwgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxFY2xpcHNlTGlua0NvbnZlcnRlcj4gY29udmVydGVycyA9IG5ldyBBcnJheUxpc3Q8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+KCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sUGVyc2lzdGVuY2VVbml0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBnZXRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSkgc3VwZXIuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVQcm9wZXJ0aWVzKCk7Ci0KLQkJdGhpcy5nZW5lcmFsUHJvcGVydGllcyA9IHRoaXMuYnVpbGRFY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzKCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbiA9IHRoaXMuYnVpbGRFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24oKTsKLQkJdGhpcy5jYWNoaW5nID0gdGhpcy5idWlsZEVjbGlwc2VMaW5rQ2FjaGluZygpOwotCQl0aGlzLmxvZ2dpbmcgPSB0aGlzLmJ1aWxkRWNsaXBzZUxpbmtMb2dnaW5nKCk7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbiA9IHRoaXMuYnVpbGRFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKFNldDxTdHJpbmc+IG5vblVwZGF0ZUFzcGVjdE5hbWVzKSB7Ci0JCXN1cGVyLmFkZE5vblVwZGF0ZUFzcGVjdE5hbWVzVG8obm9uVXBkYXRlQXNwZWN0TmFtZXMpOwotCQlub25VcGRhdGVBc3BlY3ROYW1lcy5hZGQoQ09OVkVSVEVSU19MSVNUKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCXN1cGVyLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotCQl0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24ucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0JCXRoaXMuY2FjaGluZy5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLQkJdGhpcy5sb2dnaW5nLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24ucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyLnByb3BlcnR5UmVtb3ZlZChwcm9wZXJ0eU5hbWUpOwotCQl0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLnByb3BlcnR5UmVtb3ZlZChwcm9wZXJ0eU5hbWUpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24ucHJvcGVydHlSZW1vdmVkKHByb3BlcnR5TmFtZSk7Ci0JCXRoaXMuY2FjaGluZy5wcm9wZXJ0eVJlbW92ZWQocHJvcGVydHlOYW1lKTsKLQkJdGhpcy5sb2dnaW5nLnByb3BlcnR5UmVtb3ZlZChwcm9wZXJ0eU5hbWUpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24ucHJvcGVydHlSZW1vdmVkKHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTaGFyZWRDYWNoZU1vZGUgYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVNb2RlKCkgewotCQlyZXR1cm4gU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUgc3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKSB7Ci0JCXN1cGVyLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShzcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUpOwotCQkKLQkJaWYoc3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlID09IFNoYXJlZENhY2hlTW9kZS5OT05FKSB7Ci0JCQl0aGlzLmNhY2hpbmcucmVtb3ZlRGVmYXVsdENhY2hpbmdQcm9wZXJ0aWVzKCk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpIHsKLQkJc3dpdGNoIChnZXRTaGFyZWRDYWNoZU1vZGUoKSkgewotCQkJY2FzZSBOT05FOgotCQkJY2FzZSBFTkFCTEVfU0VMRUNUSVZFOgotCQkJCXJldHVybiBmYWxzZTsKLQkJCWNhc2UgQUxMOgotCQkJY2FzZSBESVNBQkxFX1NFTEVDVElWRToKLQkJCWNhc2UgVU5TUEVDSUZJRUQ6Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ly9udWxsCi0JfQotCi0JLy8gKioqKioqKioqKioqKioqKiBtYXBwaW5nIGZpbGUgcmVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxNYXBwaW5nRmlsZVJlZj4gZ2V0TWFwcGluZ0ZpbGVSZWZzKCkgewotCQlyZXR1cm4gKHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYgPT0gbnVsbCkgPyBzdXBlci5nZXRNYXBwaW5nRmlsZVJlZnMoKSA6IHRoaXMuZ2V0Q29tYmluZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmcygpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8TWFwcGluZ0ZpbGVSZWY+IGdldENvbWJpbmVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlPE1hcHBpbmdGaWxlUmVmPihzdXBlci5nZXRNYXBwaW5nRmlsZVJlZnMoKSwgdGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBtYXBwaW5nRmlsZVJlZnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiA9PSBudWxsID8gc3VwZXIubWFwcGluZ0ZpbGVSZWZzU2l6ZSgpIDogY29tYmluZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmc1NpemUoKTsgCi0JfQotCi0JcHJvdGVjdGVkIGludCBjb21iaW5lZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLm1hcHBpbmdGaWxlUmVmc1NpemUoKSArIDE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIGltcGxpZWQgZWNsaXBzZWxpbmsgbWFwcGluZyBmaWxlIHJlZiAqKioqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIGltcGxpZWQgZWNsaXBzZWxpbmsgbWFwcGluZyBmaWxlIHJlZgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNUExJRURfRUNMSVBTRUxJTktfTUFQUElOR19GSUxFX1JFRl9QUk9QRVJUWSA9ICJpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIE1hcHBpbmdGaWxlUmVmIGdldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCkgewotCQlyZXR1cm4gdGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVSZWYgc2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSB7Ci0JCWlmICh0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBpbXBsaWVkIGVjbGlwc2VsaW5rIG1hcHBpbmcgZmlsZSByZWYgaXMgYWxyZWFkeSBzZXQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IGJ1aWxkRWNsaXBzZUxpbmtJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQkJdGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiA9IG1hcHBpbmdGaWxlUmVmOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSU1QTElFRF9FQ0xJUFNFTElOS19NQVBQSU5HX0ZJTEVfUkVGX1BST1BFUlRZLCBudWxsLCBtYXBwaW5nRmlsZVJlZik7Ci0JCXJldHVybiBtYXBwaW5nRmlsZVJlZjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1bnNldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCkgewotCQlpZiAodGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgaW1wbGllZCBlY2xpcHNlbGluayBtYXBwaW5nIGZpbGUgcmVmIGlzIGFscmVhZHkgdW5zZXQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWY7Ci0JCXRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYuZGlzcG9zZSgpOwotCQl0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmID0gbnVsbDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElNUExJRURfRUNMSVBTRUxJTktfTUFQUElOR19GSUxFX1JFRl9QUk9QRVJUWSwgbWFwcGluZ0ZpbGVSZWYsIG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEdlbmVyYWxQcm9wZXJ0aWVzIGJ1aWxkRWNsaXBzZUxpbmtHZW5lcmFsUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBidWlsZEVjbGlwc2VMaW5rQ29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIChDb25uZWN0aW9uKSB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkQ29ubmVjdGlvbih0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEN1c3RvbWl6YXRpb24gYnVpbGRFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24oKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBDYWNoaW5nIGJ1aWxkRWNsaXBzZUxpbmtDYWNoaW5nKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ2FjaGluZyh0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExvZ2dpbmcgYnVpbGRFY2xpcHNlTGlua0xvZ2dpbmcoKSB7Ci0JCXJldHVybiAoTG9nZ2luZykgdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZExvZ2dpbmcodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBPcHRpb25zIGJ1aWxkRWNsaXBzZUxpbmtPcHRpb25zKCkgewotCQlyZXR1cm4gKE9wdGlvbnMpIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcHRpb25zKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU2NoZW1hR2VuZXJhdGlvbiBidWlsZEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb24odGhpcyk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKioqKioqKiBwcm9wZXJ0aWVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIEdlbmVyYWxQcm9wZXJ0aWVzIGdldEdlbmVyYWxQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmFsUHJvcGVydGllczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gKENvbm5lY3Rpb24pIHN1cGVyLmdldENvbm5lY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQ3VzdG9taXphdGlvbiBnZXRDdXN0b21pemF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemF0aW9uOwotCX0KLQotCXB1YmxpYyBDYWNoaW5nIGdldENhY2hpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hpbmc7Ci0JfQotCi0JcHVibGljIExvZ2dpbmcgZ2V0TG9nZ2luZygpIHsKLQkJcmV0dXJuIHRoaXMubG9nZ2luZzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3B0aW9ucyBnZXRPcHRpb25zKCkgewotCQlyZXR1cm4gKE9wdGlvbnMpIHN1cGVyLmdldE9wdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hR2VuZXJhdGlvbiBnZXRTY2hlbWFHZW5lcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFHZW5lcmF0aW9uOwotCX0KLQotCi0JLy8gKioqKioqKioqKioqKioqKiBjb252ZXJ0ZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogSWRlbnRpZmllciBmb3IgY2hhbmdlcyB0byB0aGUgbGlzdCBvZiBnbG9iYWwgY29udmVydGVyIGRlZmluaXRpb25zLgotCSAqIE5vdGUgdGhhdCB0aGVyZSBhcmUgbm8gZ3JhbnVsYXIgY2hhbmdlcyB0byB0aGlzIGxpc3QuICBUaGVyZSBpcyBvbmx5Ci0JICogbm90aWZpY2F0aW9uIHRoYXQgdGhlIGVudGlyZSBsaXN0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRFUlNfTElTVCA9ICJjb252ZXJ0ZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWRkIHRoZSBjb252ZXJ0ZXIgZGVmaW5pdGlvbiAoZGVmaW5lZCBlbHNld2hlcmUpIHRvIHRoZSBsaXN0IG9mIGNvbnZlcnRlcnMKLQkgKiBkZWZpbmVkIHdpdGhpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCi0JICogTm90ZSB0aGF0IHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyB0aGUgcHJvY2VzcyBvZiB1cGRhdGluZyB0aGUKLQkgKiBsb2NhbCBjb252ZXJ0ZXIgZGVmaW5pdGlvbi4KLQkgKiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFjY29tcGFuaWVzIHRoaXMgYWN0aW9uIHNwZWNpZmljYWxseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCXRoaXMuY29udmVydGVycy5hZGQoY29udmVydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIGNvbnZlcnRlcnMgZGVmaW5lZCB3aXRoaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0LAotCSAqIGluY2x1ZGVkIGR1cGxpY2F0ZWx5IG5hbWVkIGNvbnZlcnRlcnMgZGVmaW5pdGlvbnMuCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnRlcj4gYWxsQ29udmVydGVycygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnRlcj4odGhpcy5jb252ZXJ0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbnZlcnRlcnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIG5hbWVzIG9mIHRoZSBjb252ZXJ0ZXJzIGRlZmluZWQgaW4gdGhlIHBlcnNpc3RlbmNlCi0JICogdW5pdCwgd2l0aCBkdXBsaWNhdGVzIHJlbW92ZWQuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIHVuaXF1ZUNvbnZlcnRlck5hbWVzKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYWxsTm9uTnVsbENvbnZlcnRlck5hbWVzKCkpOwotCQlyZXR1cm4gbmFtZXMudG9BcnJheShuZXcgU3RyaW5nW25hbWVzLnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGFsbE5vbk51bGxDb252ZXJ0ZXJOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmc+KHRoaXMuYWxsQ29udmVydGVyTmFtZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIGNvbnZlcnRlck5hbWUpIHsKLQkJCQlyZXR1cm4gY29udmVydGVyTmFtZSAhPSBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGFsbENvbnZlcnRlck5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJ0ZXIsIFN0cmluZz4odGhpcy5hbGxDb252ZXJ0ZXJzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlci5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCkgewotCQkvLyB0aGUgJ2NvbnZlcnRlcnMnIGxpc3QgaXMgc2ltcGx5IGNsZWFyZWQgb3V0IHdpdGggZWFjaAotCQkvLyAidXBkYXRlIiBhbmQgY29tcGxldGVseSByZWJ1aWx0IGFzIHRoZSAidXBkYXRlIiBjYXNjYWRlcyB0aHJvdWdoCi0JCS8vIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBXaGVuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgInVwZGF0ZSIgaXMKLQkJLy8gY29tcGxldGUsIHRoZSBsaXN0cyBoYXZlIGJlZW4gcG9wdWxhdGVkIGFuZCB3ZSBmaXJlIHRoZSBjaGFuZ2UgZXZlbnQuCi0JCS8vIEBzZWUgI2FkZENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlcikgKGFuZCByZWZlcmVuY2VzKQotCQkvLyBzZWUgYnVnIDMxMTA5MyBiZWZvcmUgYXR0ZW1wdGluZyB0byBjaGFuZ2UgaG93IHRoaXMgd29ya3MKLQkJdGhpcy5jb252ZXJ0ZXJzLmNsZWFyKCk7Ci0KLQkJc3VwZXIudXBkYXRlKHBlcnNpc3RlbmNlVW5pdCk7Ci0KLQkJLy8gc2VlIGNvbW1lbnQgYXQgdG9wIG9mIG1ldGhvZAotCQlmaXJlTGlzdENoYW5nZWQoQ09OVkVSVEVSU19MSVNULCB0aGlzLmNvbnZlcnRlcnMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHBvc3RVcGRhdGUoKSB7Ci0JCXN1cGVyLnBvc3RVcGRhdGUoKTsKLQkJaWYgKHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYgIT0gbnVsbCkgewotCQkJdGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZi5wb3N0VXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFwcGluZ0ZpbGVSZWZzKCkgewotCQlzdXBlci5pbml0aWFsaXplTWFwcGluZ0ZpbGVSZWZzKCk7Ci0KLQkJLy8gdXNlIGltcGxpZWQgbWFwcGluZyBmaWxlIGlmIAotCQkvLyBhKSBwcm9wZXJ0aWVzIGRvZXMgbm90IGV4Y2x1ZGUgaXQKLQkJLy8gYikgaXQgaXNuJ3Qgb3RoZXJ3aXNlIHNwZWNpZmllZAotCQkvLyBjKSB0aGUgZmlsZSBhY3R1YWxseSBleGlzdHMKLQkJaWYgKCEgaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVJc0V4Y2x1ZGVkKCkKLQkJCQkmJiAhIGltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlSXNTcGVjaWZpZWQoKQotCQkJCSYmIGltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlRXhpc3RzKCkpIHsKLQotCQkJdGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiA9IGJ1aWxkRWNsaXBzZUxpbmtJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSW1wbGllZE1hcHBpbmdGaWxlUmVmIGJ1aWxkRWNsaXBzZUxpbmtJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSB7Ci0JCXJldHVybiBuZXcgSW1wbGllZE1hcHBpbmdGaWxlUmVmKHRoaXMsIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1hcHBpbmdGaWxlUmVmcygpIHsKLQkJc3VwZXIudXBkYXRlTWFwcGluZ0ZpbGVSZWZzKCk7Ci0KLQkJLy8gdXNlIGltcGxpZWQgbWFwcGluZyBmaWxlIGlmIAotCQkvLyBhKSBwcm9wZXJ0aWVzIGRvZXMgbm90IGV4Y2x1ZGUgaXQKLQkJLy8gYikgaXQgaXNuJ3Qgb3RoZXJ3aXNlIHNwZWNpZmllZAotCQkvLyBjKSB0aGUgZmlsZSBhY3R1YWxseSBleGlzdHMKLQkJaWYgKCEgaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVJc0V4Y2x1ZGVkKCkKLQkJCQkmJiAhIGltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlSXNTcGVjaWZpZWQoKQotCQkJCSYmIGltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlRXhpc3RzKCkpIHsKLQotCQkJaWYgKHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYgPT0gbnVsbCkgewotCQkJCXNldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCk7Ci0JCQl9Ci0JCQlnZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpLnVwZGF0ZShudWxsKTsKLQkJfQotCQllbHNlIGlmICh0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmICE9IG51bGwpIHsKLQkJCXVuc2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlSXNFeGNsdWRlZCgpIHsKLQkJcmV0dXJuIGdldEdlbmVyYWxQcm9wZXJ0aWVzKCkuZ2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCkgPT0gQm9vbGVhbi5UUlVFOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlSXNTcGVjaWZpZWQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IHN0cmVhbSA9IHNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmIChKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSC5lcXVhbHMobmV3IFBhdGgoc3RyZWFtLm5leHQoKS5nZXRGaWxlTmFtZSgpKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVjbGlwc2VMaW5rSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rSnBhUHJvamVjdCkgc3VwZXIuZ2V0SnBhUHJvamVjdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZUV4aXN0cygpIHsKLQkJcmV0dXJuIGdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpICE9IG51bGw7Ci0JfQotCQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVByb3BlcnRpZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmKHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkpIHsKLQkJCWZvcihQcm9wZXJ0eSBwcm9wZXJ0eTogdGhpcy5nZXRMZWdhY3lFbnRpdHlDYWNoaW5nUHJvcGVydGllcygpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9MRUdBQ1lfRU5USVRZX0NBQ0hJTkcsCi0JCQkJCQluZXcgU3RyaW5nW10ge3Byb3BlcnR5LmdldE5hbWUoKX0sCi0JCQkJCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLAotCQkJCQkJcHJvcGVydHkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJCSkKLQkJCQkpOwotCQkJfQotCQkJZm9yKFByb3BlcnR5IHByb3BlcnR5OiB0aGlzLmdldExlZ2FjeURlc2NyaXB0b3JDdXN0b21pemVyUHJvcGVydGllcygpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9MRUdBQ1lfREVTQ1JJUFRPUl9DVVNUT01JWkVSLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtwcm9wZXJ0eS5nZXROYW1lKCl9LAotCQkJCQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKSwKLQkJCQkJCXByb3BlcnR5LmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJCXRoaXMudmFsaWRhdGVEZWZhdWx0Q2FjaGluZ1Byb3BlcnR5KHRoaXMuZ2V0Q2FjaGVUeXBlRGVmYXVsdFByb3BlcnR5KCksIG1lc3NhZ2VzKTsKLQkJCXRoaXMudmFsaWRhdGVEZWZhdWx0Q2FjaGluZ1Byb3BlcnR5KHRoaXMuZ2V0Q2FjaGVTaXplRGVmYXVsdFByb3BlcnR5KCksIG1lc3NhZ2VzKTsKLQkJCXRoaXMudmFsaWRhdGVEZWZhdWx0Q2FjaGluZ1Byb3BlcnR5KHRoaXMuZ2V0Rmx1c2hDbGVhckNhY2hlUHJvcGVydHkoKSwgbWVzc2FnZXMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVEZWZhdWx0Q2FjaGluZ1Byb3BlcnR5KFByb3BlcnR5IGNhY2hpbmdQcm9wZXJ0eSwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJCi0JCWlmKHRoaXMuZ2V0U2hhcmVkQ2FjaGVNb2RlKCkgPT0gU2hhcmVkQ2FjaGVNb2RlLk5PTkUpIHsKLQkJCWlmKGNhY2hpbmdQcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9DQUNISU5HX1BST1BFUlRZX0lHTk9SRUQsCi0JCQkJCQluZXcgU3RyaW5nW10ge2NhY2hpbmdQcm9wZXJ0eS5nZXROYW1lKCl9LAotCQkJCQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKSwKLQkJCQkJCWNhY2hpbmdQcm9wZXJ0eS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PFByb3BlcnR5PiBnZXRMZWdhY3lEZXNjcmlwdG9yQ3VzdG9taXplclByb3BlcnRpZXMoKSB7Ci0JCUFycmF5TGlzdDxQcm9wZXJ0eT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eT4oKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChyZXN1bHQsIHRoaXMuZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0aWVzKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8UHJvcGVydHk+IGdldExlZ2FjeUVudGl0eUNhY2hpbmdQcm9wZXJ0aWVzKCkgewotCQlBcnJheUxpc3Q8UHJvcGVydHk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHk+KCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwocmVzdWx0LCB0aGlzLmdldFNoYXJlZENhY2hlUHJvcGVydGllcygpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChyZXN1bHQsIHRoaXMuZ2V0RW50aXR5Q2FjaGVUeXBlUHJvcGVydGllcygpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChyZXN1bHQsIHRoaXMuZ2V0RW50aXR5Q2FjaGVTaXplUHJvcGVydGllcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5IGdldENhY2hlVHlwZURlZmF1bHRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHkgZ2V0Q2FjaGVTaXplRGVmYXVsdFByb3BlcnR5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1NJWkVfREVGQVVMVCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eSBnZXRGbHVzaENsZWFyQ2FjaGVQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19GTFVTSF9DTEVBUl9DQUNIRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgU2hhcmVkIENhY2hlIFByb3BlcnRpZXMsIGluY2x1ZGluZyBFbnRpdHkgYW5kIGRlZmF1bHQuCi0JICovCi0JcHJpdmF0ZSBJdGVyYWJsZTxQcm9wZXJ0eT4gZ2V0U2hhcmVkQ2FjaGVQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMucHJvcGVydGllc1dpdGhOYW1lUHJlZml4KENhY2hpbmcuRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBFbnRpdHkgQ2FjaGUgU2l6ZSBQcm9wZXJ0aWVzLCBleGNsdWRpbmcgZGVmYXVsdC4KLQkgKi8KLQlwcml2YXRlIEl0ZXJhYmxlPFByb3BlcnR5PiBnZXRFbnRpdHlDYWNoZVNpemVQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHlQcm9wZXJ0aWVzV2l0aFByZWZpeChDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1NJWkUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIEVudGl0eSBDYWNoZSBUeXBlIFByb3BlcnRpZXMsIGV4Y2x1ZGluZyBkZWZhdWx0LgotCSAqLwotCXByaXZhdGUgSXRlcmFibGU8UHJvcGVydHk+IGdldEVudGl0eUNhY2hlVHlwZVByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eVByb3BlcnRpZXNXaXRoUHJlZml4KENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgRGVzY3JpcHRvciBDdXN0b21pemVyIFByb3BlcnRpZXMuCi0JICovCi0JcHJpdmF0ZSBJdGVyYWJsZTxQcm9wZXJ0eT4gZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHlQcm9wZXJ0aWVzV2l0aFByZWZpeChDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgRW50aXR5IFByb3BlcnRpZXMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LAotCSAqIGV4Y2x1ZGluZyBFbnRpdHkgd2hpY2ggbmFtZSBlcXVhbHMgImRlZmF1bHQiLgotCSAqLwotCXByaXZhdGUgSXRlcmFibGU8UHJvcGVydHk+IGdldEVudGl0eVByb3BlcnRpZXNXaXRoUHJlZml4KFN0cmluZyBwcmVmaXgpIHsKLQkgICByZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFByb3BlcnR5PigKLQkJICAgCQkJCUNvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLnByb3BlcnRpZXNXaXRoTmFtZVByZWZpeChwcmVmaXgpKSkgewotCSAgICAgIEBPdmVycmlkZQotCSAgICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdChQcm9wZXJ0eSBuZXh0KSB7Ci0JCQkJcmV0dXJuICEgbmV4dC5nZXROYW1lKCkuZW5kc1dpdGgoImRlZmF1bHQiKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgIH0KLQkgICB9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXN1cGVyLmNyZWF0ZVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCXRoaXMubG9nZ2luZy5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXN1cGVyLmNyZWF0ZVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJdGhpcy5sb2dnaW5nLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXN1cGVyLmNyZWF0ZVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCXRoaXMubG9nZ2luZy5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlYmVlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLQotLyoqCi0gKiBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLSAqIAotICogTGlzdGVucyB0byB0aGUgcHJvcGVydHlMaXN0QWRhcHRlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8vICoqKioqKioqIENvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgU2V0PFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gZ2V0UHJvcGVydGllc1NldFdpdGhQcmVmaXgoU3RyaW5nIGtleVByZWZpeCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnByb3BlcnRpZXNXaXRoTmFtZVByZWZpeChrZXlQcmVmaXgpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgZW50aXR5TmFtZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUuIElmIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogaGFzIG5vIHN1ZmZpeCwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RFbnRpdHlOYW1lT2YoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCXJldHVybiBleHRyYWN0RW50aXR5TmFtZU9mKHByb3BlcnR5LmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogRXh0cmFjdHMgdGhlIGVudGl0eU5hbWUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcuIElmIHRoZSBzdHJpbmcKLQkgKiBoYXMgbm8gc3VmZml4LCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdEVudGl0eU5hbWVPZihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWludCBpbmRleCA9IHByb3BlcnR5TmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZjMzMmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5KYXJGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXJGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uRWNsaXBzZUxpbmtDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5FY2xpcHNlTGlua0xvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkVjbGlwc2VMaW5rT3B0aW9uczsKLQotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeQotCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeQotCQlpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeQotewotCQotCUBPdmVycmlkZQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQocGFyZW50LCB4bWxQZXJzaXN0ZW5jZVVuaXQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmFyRmlsZVJlZiBidWlsZEphckZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKYXJGaWxlUmVmKHBhcmVudCwgeG1sSmFyRmlsZVJlZik7Ci0JfQotCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRDb25uZWN0aW9uKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0Nvbm5lY3Rpb24ocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRPcHRpb25zKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09wdGlvbnMocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRMb2dnaW5nKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0xvZ2dpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAxYmRjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBidWlsZENvbnRleHROb2RlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBKcGFSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMV8wX1JFU09VUkNFX1RZUEU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YzEyOTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkZsdXNoQ2xlYXJDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtDYWNoaW5nIGVuY2Fwc3VsYXRlcyBFY2xpcHNlTGluayBDYWNoaW5nIHByb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NhY2hpbmcgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLQlpbXBsZW1lbnRzIENhY2hpbmcKLXsKLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgotCXByaXZhdGUgQ2FjaGVUeXBlIGNhY2hlVHlwZURlZmF1bHQ7Ci0JcHJpdmF0ZSBJbnRlZ2VyIGNhY2hlU2l6ZURlZmF1bHQ7Ci0JcHJpdmF0ZSBCb29sZWFuIHNoYXJlZENhY2hlRGVmYXVsdDsKLQlwcml2YXRlIEZsdXNoQ2xlYXJDYWNoZSBmbHVzaENsZWFyQ2FjaGU7Ci0KLQlwcml2YXRlIExpc3Q8RW50aXR5PiBlbnRpdGllczsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGluZyhQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQl0aGlzLmVudGl0aWVzID0gbmV3IEFycmF5TGlzdDxFbnRpdHk+KCk7Ci0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdCA9IAotCQkJdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxULCBDYWNoZVR5cGUudmFsdWVzKCkpOwotCQl0aGlzLmNhY2hlU2l6ZURlZmF1bHQgPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX0NBQ0hFX1NJWkVfREVGQVVMVCk7Ci0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0ID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCk7Ci0JCXRoaXMuZmx1c2hDbGVhckNhY2hlID0gCi0JCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19GTFVTSF9DTEVBUl9DQUNIRSwgRmx1c2hDbGVhckNhY2hlLnZhbHVlcygpKTsKLQkJCi0JCVNldDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IGNhY2hlVHlwZVByb3BlcnRpZXMgPSAKLQkJCXRoaXMuZ2V0UHJvcGVydGllc1NldFdpdGhQcmVmaXgoRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSk7Ci0JCVNldDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IGNhY2hlU2l6ZVByb3BlcnRpZXMgPSAKLQkJCXRoaXMuZ2V0UHJvcGVydGllc1NldFdpdGhQcmVmaXgoRUNMSVBTRUxJTktfQ0FDSEVfU0laRSk7Ci0JCVNldDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IHNoYXJlZENhY2hlUHJvcGVydGllcyA9IAotCQkJdGhpcy5nZXRQcm9wZXJ0aWVzU2V0V2l0aFByZWZpeChFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUpOwotCQkKLQkJdGhpcy5pbml0aWFsaXplRW50aXRpZXNDYWNoZVR5cGUoY2FjaGVUeXBlUHJvcGVydGllcyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVudGl0aWVzQ2FjaGVTaXplKGNhY2hlU2l6ZVByb3BlcnRpZXMpOwotCQl0aGlzLmluaXRpYWxpemVFbnRpdGllc1NoYXJlZENhY2hlKHNoYXJlZENhY2hlUHJvcGVydGllcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVFbnRpdGllc0NhY2hlVHlwZShTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBjYWNoZVR5cGVQcm9wZXJ0aWVzKSB7Ci0JCWZvciAoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGNhY2hlVHlwZVByb3BlcnR5IDogY2FjaGVUeXBlUHJvcGVydGllcykgewotCQkJdGhpcy5zZXRFbnRpdHlDYWNoZVR5cGVPZihjYWNoZVR5cGVQcm9wZXJ0eSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUVudGl0aWVzQ2FjaGVTaXplKFNldDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IGNhY2hlU2l6ZVByb3BlcnRpZXMpIHsKLQkJZm9yIChQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgY2FjaGVTaXplUHJvcGVydHkgOiBjYWNoZVNpemVQcm9wZXJ0aWVzKSB7Ci0JCQl0aGlzLnNldEVudGl0eUNhY2hlU2l6ZU9mKGNhY2hlU2l6ZVByb3BlcnR5KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRW50aXRpZXNTaGFyZWRDYWNoZShTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBzaGFyZWRDYWNoZVByb3BlcnRpZXMpIHsKLQkJZm9yIChQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgc2hhcmVkQ2FjaGVQcm9wZXJ0eSA6IHNoYXJlZENhY2hlUHJvcGVydGllcykgewotCQkJdGhpcy5zZXRFbnRpdHlTaGFyZWRDYWNoZU9mKHNoYXJlZENhY2hlUHJvcGVydHkpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCkpIHsKLQkJCXRoaXMuY2FjaGVUeXBlRGVmYXVsdENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ0FDSEVfU0laRV9ERUZBVUxUKSkgewotCQkJdGhpcy5jYWNoZVNpemVEZWZhdWx0Q2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCkpIHsKLQkJCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0Q2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSkpIHsKLQkJCXRoaXMuY2FjaGVUeXBlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19DQUNIRV9TSVpFKSkgewotCQkJdGhpcy5jYWNoZVNpemVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSkpIHsKLQkJCXRoaXMuc2hhcmVkQ2FjaGVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRkxVU0hfQ0xFQVJfQ0FDSEUpKSB7Ci0JCQl0aGlzLmZsdXNoQ2xlYXJDYWNoZUNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCkpIHsKLQkJCXRoaXMuY2FjaGVUeXBlRGVmYXVsdENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9TSVpFX0RFRkFVTFQpKSB7Ci0JCQl0aGlzLmNhY2hlU2l6ZURlZmF1bHRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQpKSB7Ci0JCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSkpIHsKLQkJCXRoaXMuY2FjaGVUeXBlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUpKSB7Ci0JCQl0aGlzLmNhY2hlU2l6ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUpKSB7Ci0JCQl0aGlzLnNoYXJlZENhY2hlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRkxVU0hfQ0xFQVJfQ0FDSEUpKSB7Ci0JCQl0aGlzLmZsdXNoQ2xlYXJDYWNoZUNoYW5nZWQobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleTsKLQkgKiAJCXZhbHVlID0gcHJvcGVydHkgaWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCwKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQ0FDSEVfU0laRV9ERUZBVUxULAotCQkJQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCwKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19GTFVTSF9DTEVBUl9DQUNIRSwKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX1BST1BFUlRZKTsKLQkJCi0JCS8vIERvbid0IG5lZWQgdG8gaW5pdGlhbGl6ZSBwcm9wZXJ0eU5hbWVzIGZvcjogCi0JCS8vIGNhY2hlVHlwZSwgc2hhcmVkQ2FjaGUsIGNhY2hlU2l6ZQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB1c2VkIGZvciBpZGVudGlmeWluZyB0aGUgZ2l2ZW4gcHJvcGVydHkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXRlbUlzUHJvcGVydHkoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGl0ZW0pIHsKLQkJYm9vbGVhbiBpc1Byb3BlcnR5ID0gc3VwZXIuaXRlbUlzUHJvcGVydHkoaXRlbSk7Ci0JCQotCQlpZiAoICEgaXNQcm9wZXJ0eSAmJiBpdGVtLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGl0ZW0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSkgfHwgCi0JCQkJCQlpdGVtLmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUpIHx8IAotCQkJCQkJaXRlbS5nZXROYW1lKCkuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gaXNQcm9wZXJ0eTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lIHVzZWQgZm9yIGNoYW5nZSBub3RpZmljYXRpb24gb2YgdGhlIGdpdmVuCi0JICogcHJvcGVydHkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBwcm9wZXJ0eUlkT2YoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIucHJvcGVydHlJZE9mKHByb3BlcnR5KTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChwcm9wZXJ0eS5nZXROYW1lKCkuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19DQUNIRV9UWVBFKSkgewotCQkJCXJldHVybiBDQUNIRV9UWVBFX1BST1BFUlRZOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfU0laRSkpIHsKLQkJCQlyZXR1cm4gQ0FDSEVfU0laRV9QUk9QRVJUWTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5LmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSkpIHsKLQkJCQlyZXR1cm4gU0hBUkVEX0NBQ0hFX1BST1BFUlRZOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eS50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHVibGljIEVudGl0eSBhZGRFbnRpdHkoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaWYgKHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbnRpdHkgIiArIGVudGl0eU5hbWUgKyAiIGFscmVhZHkgZXhpc3RzLiIpOwotCQl9Ci0JCUVudGl0eSBuZXdFbnRpdHkgPSB0aGlzLmJ1aWxkRW50aXR5KGVudGl0eU5hbWUpOwotCQl0aGlzLmVudGl0aWVzLmFkZChuZXdFbnRpdHkpOwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChFTlRJVElFU19MSVNULCB0aGlzLmVudGl0aWVzKTsKLQkJcmV0dXJuIG5ld0VudGl0eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRpdHkoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaWYgKCAhIHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRW50aXR5IGVudGl0eSA9IHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSk7Ci0JCXRoaXMuY2xlYXJFbnRpdHkoZW50aXR5KTsKLQkJdGhpcy5yZW1vdmVFbnRpdHkoZW50aXR5KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENhY2hlVHlwZSAqKioqKioqKioqCi0JcHVibGljIENhY2hlVHlwZSBnZXRDYWNoZVR5cGVPZihTdHJpbmcgZW50aXR5TmFtZSkgewotCQlFbnRpdHkgZW50aXR5ID0gdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKTsKLQkJcmV0dXJuIChlbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogZW50aXR5LmdldENhY2hlVHlwZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhY2hlVHlwZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBDYWNoZVR5cGUgbmV3Q2FjaGVUeXBlKSB7Ci0JCUVudGl0eSBvbGQgPSB0aGlzLnNldEVudGl0eUNhY2hlVHlwZU9mKGVudGl0eU5hbWUsIG5ld0NhY2hlVHlwZSk7Ci0JCXRoaXMucHV0RW51bVZhbHVlKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEUsIGVudGl0eU5hbWUsIG5ld0NhY2hlVHlwZSwgZmFsc2UpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfVFlQRV9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVUeXBlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmV4dHJhY3RFbnRpdHlOYW1lT2YocHJvcGVydHlOYW1lKTsKLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShlbnRpdHlOYW1lKSkgewotCQkJRW50aXR5IG9sZCA9IHRoaXMuc2V0RW50aXR5Q2FjaGVUeXBlT2YoZW50aXR5TmFtZSwgc3RyaW5nVmFsdWUpOyAKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9UWVBFX1BST1BFUlRZLCBvbGQsIHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBDYWNoZVR5cGUgZ2V0RGVmYXVsdENhY2hlVHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLmNhY2hlVHlwZURlZmF1bHQgPT0gbnVsbCkgPyBERUZBVUxUX0NBQ0hFX1RZUEUgOiB0aGlzLmNhY2hlVHlwZURlZmF1bHQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVNpemUgKioqKioqKioqKgotCXB1YmxpYyBJbnRlZ2VyIGdldENhY2hlU2l6ZU9mKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCUVudGl0eSBlbnRpdHkgPSB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpOwotCQlyZXR1cm4gKGVudGl0eSA9PSBudWxsKSA/IG51bGwgOiBlbnRpdHkuZ2V0Q2FjaGVTaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FjaGVTaXplT2YoU3RyaW5nIGVudGl0eU5hbWUsIEludGVnZXIgbmV3Q2FjaGVTaXplKSB7Ci0JCUVudGl0eSBvbGQgPSB0aGlzLnNldEVudGl0eUNhY2hlU2l6ZU9mKGVudGl0eU5hbWUsIG5ld0NhY2hlU2l6ZSk7Ci0JCXRoaXMucHV0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUgKyBlbnRpdHlOYW1lLCBuZXdDYWNoZVNpemUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU0laRV9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVTaXplQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmV4dHJhY3RFbnRpdHlOYW1lT2YocHJvcGVydHlOYW1lKTsKLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShlbnRpdHlOYW1lKSkgewotCQkJRW50aXR5IG9sZCA9IHRoaXMuc2V0RW50aXR5Q2FjaGVTaXplT2YoZW50aXR5TmFtZSwgc3RyaW5nVmFsdWUpOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1NJWkVfUFJPUEVSVFksIG9sZCwgdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0Q2FjaGVTaXplKCkgewotCQlyZXR1cm4gKHRoaXMuY2FjaGVTaXplRGVmYXVsdCA9PSBudWxsKSA/IERFRkFVTFRfQ0FDSEVfU0laRSA6IHRoaXMuY2FjaGVTaXplRGVmYXVsdDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNoYXJlZENhY2hlICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRTaGFyZWRDYWNoZU9mKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCUVudGl0eSBlbnRpdHkgPSB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpOwotCQlyZXR1cm4gKGVudGl0eSA9PSBudWxsKSA/IG51bGwgOiBlbnRpdHkuY2FjaGVJc1NoYXJlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNoYXJlZENhY2hlT2YoU3RyaW5nIGVudGl0eU5hbWUsIEJvb2xlYW4gbmV3U2hhcmVkQ2FjaGUpIHsKLQkJRW50aXR5IG9sZCA9IHRoaXMuc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihlbnRpdHlOYW1lLCBuZXdTaGFyZWRDYWNoZSk7Ci0JCXRoaXMucHV0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSwgZW50aXR5TmFtZSwgbmV3U2hhcmVkQ2FjaGUsIGZhbHNlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNIQVJFRF9DQUNIRV9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2hhcmVkQ2FjaGVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZXh0cmFjdEVudGl0eU5hbWVPZihwcm9wZXJ0eU5hbWUpOwotCQlpZiggISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGVudGl0eU5hbWUpKSB7Ci0JCQlFbnRpdHkgb2xkID0gdGhpcy5zZXRFbnRpdHlTaGFyZWRDYWNoZU9mKGVudGl0eU5hbWUsIHN0cmluZ1ZhbHVlKTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSEFSRURfQ0FDSEVfUFJPUEVSVFksIG9sZCwgdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0U2hhcmVkQ2FjaGUoKSB7Ci0JCXJldHVybiAodGhpcy5zaGFyZWRDYWNoZURlZmF1bHQgPT0gbnVsbCkgPyBERUZBVUxUX1NIQVJFRF9DQUNIRSA6IHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0OwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVUeXBlRGVmYXVsdCAqKioqKioqKioqCi0JcHVibGljIENhY2hlVHlwZSBnZXRDYWNoZVR5cGVEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZVR5cGVEZWZhdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhY2hlVHlwZURlZmF1bHQoQ2FjaGVUeXBlIG5ld0NhY2hlVHlwZURlZmF1bHQpIHsKLQkJQ2FjaGVUeXBlIG9sZCA9IHRoaXMuY2FjaGVUeXBlRGVmYXVsdDsKLQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0ID0gbmV3Q2FjaGVUeXBlRGVmYXVsdDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShDQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFksIG5ld0NhY2hlVHlwZURlZmF1bHQpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZLCBvbGQsIG5ld0NhY2hlVHlwZURlZmF1bHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVR5cGVEZWZhdWx0Q2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQ2FjaGVUeXBlIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIENhY2hlVHlwZS52YWx1ZXMoKSk7Ci0JCUNhY2hlVHlwZSBvbGQgPSB0aGlzLmNhY2hlVHlwZURlZmF1bHQ7Ci0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQ2FjaGVUeXBlIGdldERlZmF1bHRDYWNoZVR5cGVEZWZhdWx0KCkgewotCQlyZXR1cm4gREVGQVVMVF9DQUNIRV9UWVBFX0RFRkFVTFQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVNpemVEZWZhdWx0ICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRDYWNoZVNpemVEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZVNpemVEZWZhdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhY2hlU2l6ZURlZmF1bHQoSW50ZWdlciBuZXdDYWNoZVNpemVEZWZhdWx0KSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5jYWNoZVNpemVEZWZhdWx0OwotCQl0aGlzLmNhY2hlU2l6ZURlZmF1bHQgPSBuZXdDYWNoZVNpemVEZWZhdWx0OwotCQl0aGlzLnB1dFByb3BlcnR5KENBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSwgbmV3Q2FjaGVTaXplRGVmYXVsdCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFksIG9sZCwgbmV3Q2FjaGVTaXplRGVmYXVsdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhY2hlU2l6ZURlZmF1bHRDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuY2FjaGVTaXplRGVmYXVsdDsKLQkJdGhpcy5jYWNoZVNpemVEZWZhdWx0ID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRDYWNoZVNpemVEZWZhdWx0KCkgewotCQlyZXR1cm4gREVGQVVMVF9DQUNIRV9TSVpFX0RFRkFVTFQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTaGFyZWRDYWNoZURlZmF1bHQgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFNoYXJlZENhY2hlRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNoYXJlZENhY2hlRGVmYXVsdChCb29sZWFuIG5ld1NoYXJlZENhY2hlRGVmYXVsdCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0OwotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdCA9IG5ld1NoYXJlZENhY2hlRGVmYXVsdDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShTSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSwgbmV3U2hhcmVkQ2FjaGVEZWZhdWx0KTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZLCBvbGQsIG5ld1NoYXJlZENhY2hlRGVmYXVsdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNoYXJlZENhY2hlRGVmYXVsdENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0OwotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHQoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NIQVJFRF9DQUNIRV9ERUZBVUxUOwotCX0KLQotCS8vICoqKioqKioqKiogRmx1c2hDbGVhckNhY2hlICoqKioqKioqKioKLQkKLQlwdWJsaWMgRmx1c2hDbGVhckNhY2hlIGdldEZsdXNoQ2xlYXJDYWNoZSgpIHsKLQkJcmV0dXJuIHRoaXMuZmx1c2hDbGVhckNhY2hlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGbHVzaENsZWFyQ2FjaGUoRmx1c2hDbGVhckNhY2hlIG5ld0ZsdXNoQ2xlYXJDYWNoZSkgewotCQlGbHVzaENsZWFyQ2FjaGUgb2xkID0gdGhpcy5mbHVzaENsZWFyQ2FjaGU7Ci0JCXRoaXMuZmx1c2hDbGVhckNhY2hlID0gbmV3Rmx1c2hDbGVhckNhY2hlOwotCQl0aGlzLnB1dFByb3BlcnR5KEZMVVNIX0NMRUFSX0NBQ0hFX1BST1BFUlRZLCBuZXdGbHVzaENsZWFyQ2FjaGUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxVU0hfQ0xFQVJfQ0FDSEVfUFJPUEVSVFksIG9sZCwgbmV3Rmx1c2hDbGVhckNhY2hlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmx1c2hDbGVhckNhY2hlQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJRmx1c2hDbGVhckNhY2hlIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIEZsdXNoQ2xlYXJDYWNoZS52YWx1ZXMoKSk7Ci0JCUZsdXNoQ2xlYXJDYWNoZSBvbGQgPSB0aGlzLmZsdXNoQ2xlYXJDYWNoZTsKLQkJdGhpcy5mbHVzaENsZWFyQ2FjaGUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZMVVNIX0NMRUFSX0NBQ0hFX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIEZsdXNoQ2xlYXJDYWNoZSBnZXREZWZhdWx0Rmx1c2hDbGVhckNhY2hlKCkgewotCQlyZXR1cm4gREVGQVVMVF9GTFVTSF9DTEVBUl9DQUNIRTsKLQl9Ci0KLQkvLyAqKioqKiogRW50aXR5IENhY2hlVHlwZSAqKioqKioqCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQotCSAqLwotCXByaXZhdGUgRW50aXR5IHNldEVudGl0eUNhY2hlVHlwZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJIGlmKCggISB0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgJiYgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShzdHJpbmdWYWx1ZSkpIHsKLQkJCQkvL3RoaXMgaXMgYSBwcm9wZXJ0eSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBhZGRlZCwgd2UgZG9uJ3QgbmVlZCB0byBkZWFsIHdpdGggaXQgdW50aWwgdGhlIHZhbHVlIGlzIHNldAotCQkJCSByZXR1cm4gbnVsbDsKLQkJCSB9Ci0JCUNhY2hlVHlwZSBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBDYWNoZVR5cGUudmFsdWVzKCkpOwotCQlyZXR1cm4gdGhpcy5zZXRFbnRpdHlDYWNoZVR5cGVPZihlbnRpdHlOYW1lLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQotCSAqLwotCXByaXZhdGUgRW50aXR5IHNldEVudGl0eUNhY2hlVHlwZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBDYWNoZVR5cGUgY2FjaGVUeXBlKSB7Ci0JCUVudGl0eSBlbnRpdHkgPSAodGhpcy5lbnRpdHlFeGlzdHMoZW50aXR5TmFtZSkpID8KLQkJCQkJCXRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSkgOgotCQkJCQkJdGhpcy5hZGRFbnRpdHkoZW50aXR5TmFtZSk7Ci0JCXJldHVybiB0aGlzLnNldEVudGl0eUNhY2hlVHlwZU9mKGVudGl0eSwgY2FjaGVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvbGQgRW50aXR5Ci0JICovCi0JcHJpdmF0ZSBFbnRpdHkgc2V0RW50aXR5Q2FjaGVUeXBlT2YoRW50aXR5IGVudGl0eSwgQ2FjaGVUeXBlIGNhY2hlVHlwZSkgewotCQlpZihlbnRpdHkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUVudGl0eSBvbGQgPSBlbnRpdHkuY2xvbmUoKTsKLQkJZW50aXR5LnNldENhY2hlVHlwZShjYWNoZVR5cGUpOwotCQlyZXR1cm4gb2xkOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFbnRpdHlDYWNoZVR5cGVPZihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgY2FjaGVUeXBlUHJvcGVydHkpIHsKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmV4dHJhY3RFbnRpdHlOYW1lT2YoY2FjaGVUeXBlUHJvcGVydHkpOwotCQl0aGlzLnNldEVudGl0eUNhY2hlVHlwZU9mKGVudGl0eU5hbWUsIGNhY2hlVHlwZVByb3BlcnR5LmdldFZhbHVlKCkpOwotCX0KLQotCS8vICoqKioqKiBFbnRpdHkgQ2FjaGUgc2l6ZSAqKioqKioqCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQotCSAqLwotCXByaXZhdGUgRW50aXR5IHNldEVudGl0eUNhY2hlU2l6ZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJIGlmKCggISB0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgJiYgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShzdHJpbmdWYWx1ZSkpIHsKLQkJCQkvL3RoaXMgaXMgYSBwcm9wZXJ0eSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBhZGRlZCwgd2UgZG9uJ3QgbmVlZCB0byBkZWFsIHdpdGggaXQgdW50aWwgdGhlIHZhbHVlIGlzIHNldAotCQkJCSByZXR1cm4gbnVsbDsKLQkJCSB9Ci0JCUludGVnZXIgbmV3VmFsdWUgPSBnZXRJbnRlZ2VyVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCXJldHVybiB0aGlzLnNldEVudGl0eUNhY2hlU2l6ZU9mKGVudGl0eU5hbWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvbGQgRW50aXR5Ci0JICovCi0JcHJpdmF0ZSBFbnRpdHkgc2V0RW50aXR5Q2FjaGVTaXplT2YoU3RyaW5nIGVudGl0eU5hbWUsIEludGVnZXIgc2l6ZSkgewotCQlFbnRpdHkgZW50aXR5ID0gKHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSA/Ci0JCQkJCQl0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpIDoKLQkJCQkJCXRoaXMuYWRkRW50aXR5KGVudGl0eU5hbWUpOwotCQlyZXR1cm4gdGhpcy5zZXRFbnRpdHlDYWNoZVNpemVPZihlbnRpdHksIHNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKLQkgKi8KLQlwcml2YXRlIEVudGl0eSBzZXRFbnRpdHlDYWNoZVNpemVPZihFbnRpdHkgZW50aXR5LCBJbnRlZ2VyIHNpemUpIHsKLQkJaWYoZW50aXR5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlFbnRpdHkgb2xkID0gZW50aXR5LmNsb25lKCk7Ci0JCWVudGl0eS5zZXRDYWNoZVNpemUoc2l6ZSk7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEVudGl0eUNhY2hlU2l6ZU9mKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBjYWNoZVNpemVQcm9wZXJ0eSkgewotCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZXh0cmFjdEVudGl0eU5hbWVPZihjYWNoZVNpemVQcm9wZXJ0eSk7Ci0JCXRoaXMuc2V0RW50aXR5Q2FjaGVTaXplT2YoZW50aXR5TmFtZSwgY2FjaGVTaXplUHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLy8gKioqKioqIEVudGl0eSBTaGFyZWRDYWNoZSAqKioqKioqCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQotCSAqLwotCXByaXZhdGUgRW50aXR5IHNldEVudGl0eVNoYXJlZENhY2hlT2YoU3RyaW5nIGVudGl0eU5hbWUsIFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQkgaWYoKCAhIHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSAmJiBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHN0cmluZ1ZhbHVlKSkgewotCQkJCS8vdGhpcyBpcyBhIHByb3BlcnR5IHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGFkZGVkLCB3ZSBkb24ndCBuZWVkIHRvIGRlYWwgd2l0aCBpdCB1bnRpbCB0aGUgdmFsdWUgaXMgc2V0Ci0JCQkJIHJldHVybiBudWxsOwotCQkJIH0KLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJcmV0dXJuIHRoaXMuc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihlbnRpdHlOYW1lLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQotCSAqLwotCXByaXZhdGUgRW50aXR5IHNldEVudGl0eVNoYXJlZENhY2hlT2YoU3RyaW5nIGVudGl0eU5hbWUsIEJvb2xlYW4gc2hhcmVkQ2FjaGUpIHsKLQkJRW50aXR5IGVudGl0eSA9ICh0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgPwotCQkJCQkJdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKSA6Ci0JCQkJCQl0aGlzLmFkZEVudGl0eShlbnRpdHlOYW1lKTsKLQkJcmV0dXJuIHRoaXMuc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihlbnRpdHksIHNoYXJlZENhY2hlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvbGQgRW50aXR5Ci0JICovCi0JcHJpdmF0ZSBFbnRpdHkgc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihFbnRpdHkgZW50aXR5LCBCb29sZWFuIHNoYXJlZENhY2hlKSB7Ci0JCWlmKGVudGl0eSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRW50aXR5IG9sZCA9IGVudGl0eS5jbG9uZSgpOwotCQllbnRpdHkuc2V0U2hhcmVkQ2FjaGUoc2hhcmVkQ2FjaGUpOwotCQlyZXR1cm4gb2xkOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFbnRpdHlTaGFyZWRDYWNoZU9mKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBzaGFyZWRDYWNoZVByb3BlcnR5KSB7Ci0JCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5leHRyYWN0RW50aXR5TmFtZU9mKHNoYXJlZENhY2hlUHJvcGVydHkpOwotCQl0aGlzLnNldEVudGl0eVNoYXJlZENhY2hlT2YoZW50aXR5TmFtZSwgc2hhcmVkQ2FjaGVQcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgYWxsIEVudGl0eSBwcm9wZXJ0aWVzIHRvIGRlZmF1bHQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRW50aXR5KEVudGl0eSBlbnRpdHkpIHsKLQkJaWYoZW50aXR5LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBlbnRpdHlOYW1lID0gZW50aXR5LmdldE5hbWUoKTsKLQkJdGhpcy5zZXRDYWNoZVR5cGVPZihlbnRpdHlOYW1lLCBudWxsKTsKLQkJdGhpcy5zZXRDYWNoZVNpemVPZihlbnRpdHlOYW1lLCBudWxsKTsKLQkJdGhpcy5zZXRTaGFyZWRDYWNoZU9mKGVudGl0eU5hbWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEVudGl0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqLwotCXByaXZhdGUgRW50aXR5IGdldEVudGl0eU5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCWZvcihFbnRpdHkgZW50aXR5OiB0aGlzLmVudGl0aWVzKSB7Ci0JCQlpZihlbnRpdHkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBlbnRpdHk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBFbnRpdHkgYnVpbGRFbnRpdHkoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5ldyBFbnRpdHkodGhpcywgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudGl0eShFbnRpdHkgZW50aXR5KSB7Ci0JCWlmKGVudGl0eSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5lbnRpdGllcy5yZW1vdmUoZW50aXR5KTsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoRU5USVRJRVNfTElTVCwgdGhpcy5lbnRpdGllcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIEVudGl0eSBleGlzdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlbnRpdHlFeGlzdHMoU3RyaW5nIG5hbWUpIHsKLQkJZm9yKEVudGl0eSBlbnRpdHk6IHRoaXMuZW50aXRpZXMpIHsKLQkJCWlmKGVudGl0eS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgY2FjaGVUeXBlRGVmYXVsdCwgY2FjaGVTaXplRGVmYXVsdCwgZmx1c2hDbGVhckNhY2hlIHByb3BlcnRpZXMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGVmYXVsdENhY2hpbmdQcm9wZXJ0aWVzKCkgewotCQl0aGlzLnNldENhY2hlVHlwZURlZmF1bHQobnVsbCk7Ci0JCXRoaXMuc2V0Q2FjaGVTaXplRGVmYXVsdChudWxsKTsKLQkJdGhpcy5zZXRGbHVzaENsZWFyQ2FjaGUobnVsbCk7Ci0JfQotCi0JLy8gKioqKioqIGVudGl0aWVzIGxpc3QgKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFbnRpdHk+IGVudGl0aWVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEVudGl0eT4odGhpcy5lbnRpdGllcyk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZW50aXR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxFbnRpdHksIFN0cmluZz4odGhpcy5lbnRpdGllcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEVudGl0eSBlbnRpdHkpIHsKLQkJCQlyZXR1cm4gZW50aXR5LmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgaW50IGVudGl0aWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXRpZXMuc2l6ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjU5NzM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotCi0vKioKLSAqICBFbnRpdHkKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eSBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBDYWNoaW5nIHBhcmVudDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1RZUEVfUFJPUEVSVFkgPSBDYWNoaW5nLkNBQ0hFX1RZUEVfUFJPUEVSVFk7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFX1BST1BFUlRZID0gQ2FjaGluZy5DQUNIRV9TSVpFX1BST1BFUlRZOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkVEX0NBQ0hFX1BST1BFUlRZID0gQ2FjaGluZy5TSEFSRURfQ0FDSEVfUFJPUEVSVFk7IC8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBDYWNoZVR5cGUgY2FjaGVUeXBlOwotCXByaXZhdGUgSW50ZWdlciBjYWNoZVNpemU7Ci0JcHJpdmF0ZSBCb29sZWFuIGNhY2hlSXNTaGFyZWQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRW50aXR5KENhY2hpbmcgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQl0aGlzKHBhcmVudCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBFbnRpdHkoQ2FjaGluZyBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKFN0cmluZyBuYW1lKSB7Ci0JCWlmKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkobmFtZSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3JzICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYobyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIG87Ci0JCXJldHVybiAoCi0JCQkodGhpcy5jYWNoZVR5cGUgPT0gbnVsbCA/Ci0JCQkJZW50aXR5LmNhY2hlVHlwZSA9PSBudWxsIDogdGhpcy5jYWNoZVR5cGUuZXF1YWxzKGVudGl0eS5jYWNoZVR5cGUpKSAmJgotCQkJKHRoaXMuY2FjaGVJc1NoYXJlZCA9PSBudWxsID8KLQkJCQllbnRpdHkuY2FjaGVJc1NoYXJlZCA9PSBudWxsIDogdGhpcy5jYWNoZUlzU2hhcmVkLmVxdWFscyhlbnRpdHkuY2FjaGVJc1NoYXJlZCkpICYmCi0JCQkodGhpcy5jYWNoZVNpemUgPT0gbnVsbCA/Ci0JCQkJZW50aXR5LmNhY2hlU2l6ZSA9PSBudWxsIDogdGhpcy5jYWNoZVNpemUuZXF1YWxzKGVudGl0eS5jYWNoZVNpemUpKSk7Ci0JfQotCQotCSBAT3ZlcnJpZGUKLQkgcHVibGljIEVudGl0eSBjbG9uZSgpIHsKLQkJIHRyeSB7Ci0JCQkgcmV0dXJuIChFbnRpdHkpc3VwZXIuY2xvbmUoKTsKLQkJIH0KLQkJIGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCSB9Ci0JIH0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiAodGhpcy5jYWNoZVR5cGUgPT0gbnVsbCkgJiYKLQkJCQkJKHRoaXMuY2FjaGVTaXplID09IG51bGwpICYmCi0JCQkJCSh0aGlzLmNhY2hlSXNTaGFyZWQgPT0gbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVudGl0eU5hbWVJc1ZhbGlkKCkgewotCQlyZXR1cm4gISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMubmFtZSk7Ci0JfQotCi0JcHVibGljIENhY2hpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCQotCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNhY2hlVHlwZSAqKioqKioqKioqCi0JcHJvdGVjdGVkIENhY2hlVHlwZSBnZXRDYWNoZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDYWNoZVR5cGUoQ2FjaGVUeXBlIGNhY2hlVHlwZSkgewotCQlDYWNoZVR5cGUgb2xkID0gdGhpcy5jYWNoZVR5cGU7Ci0JCXRoaXMuY2FjaGVUeXBlID0gY2FjaGVUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfVFlQRV9QUk9QRVJUWSwgb2xkLCBjYWNoZVR5cGUpOwotCX0KLQotCS8vICoqKioqKioqKiogY2FjaGVTaXplICoqKioqKioqKioKLQlwcm90ZWN0ZWQgSW50ZWdlciBnZXRDYWNoZVNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlU2l6ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDYWNoZVNpemUoSW50ZWdlciBjYWNoZVNpemUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmNhY2hlU2l6ZTsKLQkJdGhpcy5jYWNoZVNpemUgPSBjYWNoZVNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TSVpFX1BST1BFUlRZLCBvbGQsIGNhY2hlU2l6ZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjYWNoZUlzU2hhcmVkICoqKioqKioqKioKLQlwcm90ZWN0ZWQgQm9vbGVhbiBjYWNoZUlzU2hhcmVkKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZUlzU2hhcmVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNoYXJlZENhY2hlKEJvb2xlYW4gaXNTaGFyZWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmNhY2hlSXNTaGFyZWQ7Ci0JCXRoaXMuY2FjaGVJc1NoYXJlZCA9IGlzU2hhcmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0hBUkVEX0NBQ0hFX1BST1BFUlRZLCBvbGQsIGlzU2hhcmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCgibmFtZTogIik7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQlzYi5hcHBlbmQoIiwgY2FjaGVUeXBlOiAiKTsKLQkJc2IuYXBwZW5kKHRoaXMuY2FjaGVUeXBlKTsKLQkJc2IuYXBwZW5kKCIsIGNhY2hlU2l6ZTogIik7Ci0JCXNiLmFwcGVuZCh0aGlzLmNhY2hlU2l6ZSk7Ci0JCXNiLmFwcGVuZCgiLCBjYWNoZUlzU2hhcmVkOiAiKTsKLQkJc2IuYXBwZW5kKHRoaXMuY2FjaGVJc1NoYXJlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRWNsaXBzZUxpbmtDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OGY1MzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5CYXRjaFdyaXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0Nvbm5lY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29ubmVjdGlvbiBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotCWltcGxlbWVudHMgQ29ubmVjdGlvbgotewotCQotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBCYXRjaFdyaXRpbmcgYmF0Y2hXcml0aW5nOwotCXByaXZhdGUgQm9vbGVhbiBuYXRpdmVTcWw7Ci0JcHJpdmF0ZSBCb29sZWFuIGNhY2hlU3RhdGVtZW50czsKLQlwcml2YXRlIEludGVnZXIgY2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHVybDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHVzZXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBwYXNzd29yZDsKLQlwcml2YXRlIEJvb2xlYW4gYmluZFBhcmFtZXRlcnM7Ci0JcHJpdmF0ZSBCb29sZWFuIHJlYWRDb25uZWN0aW9uc1NoYXJlZDsKLQlwcml2YXRlIEludGVnZXIgcmVhZENvbm5lY3Rpb25zTWluOwotCXByaXZhdGUgSW50ZWdlciByZWFkQ29ubmVjdGlvbnNNYXg7Ci0JcHJpdmF0ZSBJbnRlZ2VyIHdyaXRlQ29ubmVjdGlvbnNNaW47Ci0JcHJpdmF0ZSBJbnRlZ2VyIHdyaXRlQ29ubmVjdGlvbnNNYXg7Ci0JcHJpdmF0ZSBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBleGNsdXNpdmVDb25uZWN0aW9uTW9kZTsKLQlwcml2YXRlIEJvb2xlYW4gbGF6eUNvbm5lY3Rpb247Ci0JCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rQ29ubmVjdGlvbihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQl0aGlzLmluaXRpYWxpemVEYXRhYmFzZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzKCk7Ci0JCQotCQl0aGlzLmJhdGNoV3JpdGluZyA9IAotCQkJdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORywgQmF0Y2hXcml0aW5nLnZhbHVlcygpKTsKLQkJdGhpcy5uYXRpdmVTcWwgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX05BVElWRV9TUUwpOwotCQl0aGlzLmNhY2hlU3RhdGVtZW50cyA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UUyk7Ci0JCXRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZSA9IAotCQkJdGhpcy5nZXRJbnRlZ2VyVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFKTsKLQkJdGhpcy5iaW5kUGFyYW1ldGVycyA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfQklORF9QQVJBTUVURVJTKTsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNTaGFyZWQgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEKTsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNaW4gPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOKTsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXggPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUFYKTsKLQkJdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluID0gCi0JCQl0aGlzLmdldEludGVnZXJWYWx1ZShFQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NSU4pOwotCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXggPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01BWCk7Ci0JCXRoaXMuZXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgPSAKLQkJCXRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX0VYQ0xVU0lWRV9DT05ORUNUSU9OX01PREUsIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlLnZhbHVlcygpKTsKLQkJdGhpcy5sYXp5Q29ubmVjdGlvbiA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfTEFaWV9DT05ORUNUSU9OKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURhdGFiYXNlQ29ubmVjdGlvblByb3BlcnRpZXMoKSB7Ci0JCXRoaXMuZHJpdmVyID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0RSSVZFUik7Ci0JCXRoaXMudXJsID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1VSTCk7Ci0JCXRoaXMudXNlciA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19VU0VSKTsKLQkJdGhpcy5wYXNzd29yZCA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19QQVNTV09SRCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX05BVElWRV9TUUwpKSB7Ci0JCQl0aGlzLm5hdGl2ZVNxbENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORykpIHsKLQkJCXRoaXMuYmF0Y2hXcml0aW5nQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTKSkgewotCQkJdGhpcy5jYWNoZVN0YXRlbWVudHNDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RSSVZFUikpIHsKLQkJCXRoaXMuZHJpdmVyQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19VUkwpKSB7Ci0JCQl0aGlzLnVybENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVVNFUikpIHsKLQkJCXRoaXMudXNlckNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfUEFTU1dPUkQpKSB7Ci0JCQl0aGlzLnBhc3N3b3JkQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19CSU5EX1BBUkFNRVRFUlMpKSB7Ci0JCQl0aGlzLmJpbmRQYXJhbWV0ZXJzQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRCkpIHsKLQkJCXRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTX1NJWkUpKSB7Ci0JCQl0aGlzLmNhY2hlU3RhdGVtZW50c1NpemVDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOKSkgewotCQkJcmVhZENvbm5lY3Rpb25zTWluQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01BWCkpIHsKLQkJCXJlYWRDb25uZWN0aW9uc01heENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUlOKSkgewotCQkJd3JpdGVDb25uZWN0aW9uc01pbkNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUFYKSkgewotCQkJd3JpdGVDb25uZWN0aW9uc01heENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERSkpIHsKLQkJCXRoaXMuZXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0xBWllfQ09OTkVDVElPTikpIHsKLQkJCXRoaXMubGF6eUNvbm5lY3Rpb25DaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19OQVRJVkVfU1FMKSkgewotCQkJdGhpcy5uYXRpdmVTcWxDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORykpIHsKLQkJCXRoaXMuYmF0Y2hXcml0aW5nQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFMpKSB7Ci0JCQl0aGlzLmNhY2hlU3RhdGVtZW50c0NoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19EUklWRVIpKSB7Ci0JCQl0aGlzLmRyaXZlckNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19VUkwpKSB7Ci0JCQl0aGlzLnVybENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19VU0VSKSkgewotCQkJdGhpcy51c2VyQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1BBU1NXT1JEKSkgewotCQkJdGhpcy5wYXNzd29yZENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19CSU5EX1BBUkFNRVRFUlMpKSB7Ci0JCQl0aGlzLmJpbmRQYXJhbWV0ZXJzQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEKSkgewotCQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNTaGFyZWRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFKSkgewotCQkJdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOKSkgewotCQkJcmVhZENvbm5lY3Rpb25zTWluQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUFYKSkgewotCQkJcmVhZENvbm5lY3Rpb25zTWF4Q2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01JTikpIHsKLQkJCXdyaXRlQ29ubmVjdGlvbnNNaW5DaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUFYKSkgewotCQkJd3JpdGVDb25uZWN0aW9uc01heENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFKSkgewotCQkJdGhpcy5leGNsdXNpdmVDb25uZWN0aW9uTW9kZUNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19MQVpZX0NPTk5FQ1RJT04pKSB7Ci0JCQl0aGlzLmxhenlDb25uZWN0aW9uQ2hhbmdlZChudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCi0JICogCQlrZXkgPSBFY2xpcHNlTGluayBwcm9wZXJ0eSBrZXkKLQkgKiAJCXZhbHVlID0gcHJvcGVydHkgaWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQl0aGlzLmFkZERhdGFiYXNlQ29ubmVjdGlvblByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX05BVElWRV9TUUwsCi0JCQlOQVRJVkVfU1FMX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19CQVRDSF9XUklUSU5HLAotCQkJQkFUQ0hfV1JJVElOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UUywKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFNfU0laRSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQklORF9QQVJBTUVURVJTLAotCQkJQklORF9QQVJBTUVURVJTX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRCwKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01JTiwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01BWCwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NSU4sCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01BWCwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERSwKLQkJCUVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0xBWllfQ09OTkVDVElPTiwKLQkJCUxBWllfQ09OTkVDVElPTl9QUk9QRVJUWSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGF0YWJhc2VDb25uZWN0aW9uUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19EUklWRVIsCi0JCQlEUklWRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1VSTCwKLQkJCVVSTF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVVNFUiwKLQkJCVVTRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1BBU1NXT1JELAotCQkJUEFTU1dPUkRfUFJPUEVSVFkpOwotCX0KLQotCS8qKgotICAgICAqIERvZXMgYWxsIHByZS10cmVhdG1lbnQgaW4gdGhpcyBtZXRob2QgYmVmb3JlIHRoZSBwcm9wZXJ0eSBpcyBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmVTZXRQcm9wZXJ0eSgpIHsKLQkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0Ci0JfQotCi0JLy8gKioqKioqKioqKiBOYXRpdmVTcWwgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldE5hdGl2ZVNxbCgpIHsKLQkJcmV0dXJuIHRoaXMubmF0aXZlU3FsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hdGl2ZVNxbChCb29sZWFuIG5ld05hdGl2ZVNxbCkgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMubmF0aXZlU3FsOwotCQl0aGlzLm5hdGl2ZVNxbCA9IG5ld05hdGl2ZVNxbDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShOQVRJVkVfU1FMX1BST1BFUlRZLCBuZXdOYXRpdmVTcWwpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFUSVZFX1NRTF9QUk9QRVJUWSwgb2xkLCBuZXdOYXRpdmVTcWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbmF0aXZlU3FsQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5uYXRpdmVTcWw7Ci0JCXRoaXMubmF0aXZlU3FsID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQVRJVkVfU1FMX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0TmF0aXZlU3FsKCkgewotCQlyZXR1cm4gREVGQVVMVF9OQVRJVkVfU1FMOwotCX0KLQotCS8vICoqKioqKioqKiogQmF0Y2hXcml0aW5nICoqKioqKioqKioKLQkKLQlwdWJsaWMgQmF0Y2hXcml0aW5nIGdldEJhdGNoV3JpdGluZygpIHsKLQkJcmV0dXJuIHRoaXMuYmF0Y2hXcml0aW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRCYXRjaFdyaXRpbmcoQmF0Y2hXcml0aW5nIG5ld0JhdGNoV3JpdGluZykgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlCYXRjaFdyaXRpbmcgb2xkID0gdGhpcy5iYXRjaFdyaXRpbmc7Ci0JCXRoaXMuYmF0Y2hXcml0aW5nID0gbmV3QmF0Y2hXcml0aW5nOwotCQl0aGlzLnB1dFByb3BlcnR5KEJBVENIX1dSSVRJTkdfUFJPUEVSVFksIG5ld0JhdGNoV3JpdGluZyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChCQVRDSF9XUklUSU5HX1BST1BFUlRZLCBvbGQsIG5ld0JhdGNoV3JpdGluZyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhdGNoV3JpdGluZ0NoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJhdGNoV3JpdGluZyBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBCYXRjaFdyaXRpbmcudmFsdWVzKCkpOwotCQlCYXRjaFdyaXRpbmcgb2xkID0gdGhpcy5iYXRjaFdyaXRpbmc7Ci0JCXRoaXMuYmF0Y2hXcml0aW5nID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChCQVRDSF9XUklUSU5HX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIEJhdGNoV3JpdGluZyBnZXREZWZhdWx0QmF0Y2hXcml0aW5nKCkgewotCQlyZXR1cm4gREVGQVVMVF9CQVRDSF9XUklUSU5HOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTdGF0ZW1lbnRzICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRDYWNoZVN0YXRlbWVudHMoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlU3RhdGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVN0YXRlbWVudHMoQm9vbGVhbiBuZXdDYWNoZVN0YXRlbWVudHMpIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmNhY2hlU3RhdGVtZW50czsKLQkJdGhpcy5jYWNoZVN0YXRlbWVudHMgPSBuZXdDYWNoZVN0YXRlbWVudHM7Ci0JCXRoaXMucHV0UHJvcGVydHkoQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSwgbmV3Q2FjaGVTdGF0ZW1lbnRzKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFksIG9sZCwgbmV3Q2FjaGVTdGF0ZW1lbnRzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVTdGF0ZW1lbnRzQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5jYWNoZVN0YXRlbWVudHM7Ci0JCXRoaXMuY2FjaGVTdGF0ZW1lbnRzID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0Q2FjaGVTdGF0ZW1lbnRzKCkgewotCQlyZXR1cm4gREVGQVVMVF9DQUNIRV9TVEFURU1FTlRTOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTdGF0ZW1lbnRzU2l6ZSAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVN0YXRlbWVudHNTaXplKEludGVnZXIgbmV3Q2FjaGVTdGF0ZW1lbnRzU2l6ZSkgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQkJdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplID0gbmV3Q2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShDQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFksIG5ld0NhY2hlU3RhdGVtZW50c1NpemUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZLCBvbGQsIG5ld0NhY2hlU3RhdGVtZW50c1NpemUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVN0YXRlbWVudHNTaXplQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplOwotCQl0aGlzLmNhY2hlU3RhdGVtZW50c1NpemUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdENhY2hlU3RhdGVtZW50c1NpemUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0NBQ0hFX1NUQVRFTUVOVFNfU0laRTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIERyaXZlciAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmRyaXZlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREcml2ZXIoU3RyaW5nIG5ld0RyaXZlcikgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlTdHJpbmcgb2xkID0gdGhpcy5kcml2ZXI7Ci0JCXRoaXMuZHJpdmVyID0gbmV3RHJpdmVyOwotCQl0aGlzLnB1dFByb3BlcnR5KERSSVZFUl9QUk9QRVJUWSwgbmV3RHJpdmVyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERSSVZFUl9QUk9QRVJUWSwgb2xkLCBuZXdEcml2ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyaXZlckNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRyaXZlcjsKLQkJdGhpcy5kcml2ZXIgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERSSVZFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RHJpdmVyKCkgewotCQlyZXR1cm4gREVGQVVMVF9EUklWRVI7Ci0JfQotCi0JLy8gKioqKioqKioqKiBVUkwgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gdGhpcy51cmw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyBuZXdVcmwpIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJU3RyaW5nIG9sZCA9IHRoaXMudXJsOwotCQl0aGlzLnVybCA9IG5ld1VybDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShVUkxfUFJPUEVSVFksIG5ld1VybCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVUkxfUFJPUEVSVFksIG9sZCwgbmV3VXJsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cmxDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy51cmw7Ci0JCXRoaXMudXJsID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVUkxfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFVybCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVVJMOwotCX0KLQotCS8vICoqKioqKioqKiogVXNlciAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRVc2VyKCkgewotCQlyZXR1cm4gdGhpcy51c2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVzZXIoU3RyaW5nIG5ld1VzZXIpIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJU3RyaW5nIG9sZCA9IHRoaXMudXNlcjsKLQkJdGhpcy51c2VyID0gbmV3VXNlcjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShVU0VSX1BST1BFUlRZLCBuZXdVc2VyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFVTRVJfUFJPUEVSVFksIG9sZCwgbmV3VXNlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXNlckNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnVzZXI7Ci0JCXRoaXMudXNlciA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVVNFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VXNlcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfVVNFUjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFBhc3N3b3JkICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotCQlyZXR1cm4gdGhpcy5wYXNzd29yZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgbmV3UGFzc3dvcmQpIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJU3RyaW5nIG9sZCA9IHRoaXMucGFzc3dvcmQ7Ci0JCXRoaXMucGFzc3dvcmQgPSBuZXdQYXNzd29yZDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShQQVNTV09SRF9QUk9QRVJUWSwgbmV3UGFzc3dvcmQpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEFTU1dPUkRfUFJPUEVSVFksIG9sZCwgbmV3UGFzc3dvcmQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhc3N3b3JkQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucGFzc3dvcmQ7Ci0JCXRoaXMucGFzc3dvcmQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBBU1NXT1JEX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYXNzd29yZCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfUEFTU1dPUkQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBCaW5kUGFyYW1ldGVycyAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0QmluZFBhcmFtZXRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLmJpbmRQYXJhbWV0ZXJzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJpbmRQYXJhbWV0ZXJzKEJvb2xlYW4gbmV3QmluZFBhcmFtZXRlcnMpIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmJpbmRQYXJhbWV0ZXJzOwotCQl0aGlzLmJpbmRQYXJhbWV0ZXJzID0gbmV3QmluZFBhcmFtZXRlcnM7Ci0JCXRoaXMucHV0UHJvcGVydHkoQklORF9QQVJBTUVURVJTX1BST1BFUlRZLCBuZXdCaW5kUGFyYW1ldGVycyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChCSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFksIG9sZCwgbmV3QmluZFBhcmFtZXRlcnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBiaW5kUGFyYW1ldGVyc0NoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMuYmluZFBhcmFtZXRlcnM7Ci0JCXRoaXMuYmluZFBhcmFtZXRlcnMgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdEJpbmRQYXJhbWV0ZXJzKCkgewotCQlyZXR1cm4gREVGQVVMVF9CSU5EX1BBUkFNRVRFUlM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNTaGFyZWQgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlYWRDb25uZWN0aW9uc1NoYXJlZChCb29sZWFuIG5ld1JlYWRDb25uZWN0aW9uc1NoYXJlZCkgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkOwotCQl0aGlzLnJlYWRDb25uZWN0aW9uc1NoYXJlZCA9IG5ld1JlYWRDb25uZWN0aW9uc1NoYXJlZDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSwgbmV3UmVhZENvbm5lY3Rpb25zU2hhcmVkKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZLCBvbGQsIG5ld1JlYWRDb25uZWN0aW9uc1NoYXJlZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRDb25uZWN0aW9uc1NoYXJlZENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkOwotCQl0aGlzLnJlYWRDb25uZWN0aW9uc1NoYXJlZCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKSB7Ci0JCXJldHVybiBERUZBVUxUX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEOwotCX0KLQotCS8vICoqKioqKioqKiogUmVhZENvbm5lY3Rpb25zTWluICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRSZWFkQ29ubmVjdGlvbnNNaW4oKSB7Ci0JCXJldHVybiB0aGlzLnJlYWRDb25uZWN0aW9uc01pbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWFkQ29ubmVjdGlvbnNNaW4oSW50ZWdlciBuZXdSZWFkQ29ubmVjdGlvbnNNaW4pIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnJlYWRDb25uZWN0aW9uc01pbjsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNaW4gPSBuZXdSZWFkQ29ubmVjdGlvbnNNaW47Ci0JCXRoaXMucHV0UHJvcGVydHkoUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFksIG5ld1JlYWRDb25uZWN0aW9uc01pbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUFEX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSwgb2xkLCBuZXdSZWFkQ29ubmVjdGlvbnNNaW4pOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkQ29ubmVjdGlvbnNNaW5DaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnJlYWRDb25uZWN0aW9uc01pbjsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNaW4gPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWluKCkgewotCQlyZXR1cm4gREVGQVVMVF9SRUFEX0NPTk5FQ1RJT05TX01JTjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFJlYWRDb25uZWN0aW9uc01heCAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0UmVhZENvbm5lY3Rpb25zTWF4KCkgewotCQlyZXR1cm4gdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVhZENvbm5lY3Rpb25zTWF4KEludGVnZXIgbmV3UmVhZENvbm5lY3Rpb25zTWF4KSB7Ci0JCXRoaXMucHJlU2V0UHJvcGVydHkoKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXg7Ci0JCXRoaXMucmVhZENvbm5lY3Rpb25zTWF4ID0gbmV3UmVhZENvbm5lY3Rpb25zTWF4OwotCQl0aGlzLnB1dFByb3BlcnR5KFJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZLCBuZXdSZWFkQ29ubmVjdGlvbnNNYXgpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVBRF9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFksIG9sZCwgbmV3UmVhZENvbm5lY3Rpb25zTWF4KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZENvbm5lY3Rpb25zTWF4Q2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXg7Ci0JCXRoaXMucmVhZENvbm5lY3Rpb25zTWF4ID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc01heCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfUkVBRF9DT05ORUNUSU9OU19NQVg7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXcml0ZUNvbm5lY3Rpb25zTWluICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRXcml0ZUNvbm5lY3Rpb25zTWluKCkgewotCQlyZXR1cm4gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdyaXRlQ29ubmVjdGlvbnNNaW4oSW50ZWdlciBuZXdXcml0ZUNvbm5lY3Rpb25zTWluKSB7Ci0JCXRoaXMucHJlU2V0UHJvcGVydHkoKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluOwotCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNaW4gPSBuZXdXcml0ZUNvbm5lY3Rpb25zTWluOwotCQl0aGlzLnB1dFByb3BlcnR5KFdSSVRFX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSwgbmV3V3JpdGVDb25uZWN0aW9uc01pbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFksIG9sZCwgbmV3V3JpdGVDb25uZWN0aW9uc01pbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ29ubmVjdGlvbnNNaW5DaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJSW50ZWdlciBvbGQgPSB0aGlzLndyaXRlQ29ubmVjdGlvbnNNaW47Ci0JCXRoaXMud3JpdGVDb25uZWN0aW9uc01pbiA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01pbigpIHsKLQkJcmV0dXJuIERFRkFVTFRfV1JJVEVfQ09OTkVDVElPTlNfTUlOOwotCX0KLQotCS8vICoqKioqKioqKiogV3JpdGVDb25uZWN0aW9uc01heCAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0V3JpdGVDb25uZWN0aW9uc01heCgpIHsKLQkJcmV0dXJuIHRoaXMud3JpdGVDb25uZWN0aW9uc01heDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXcml0ZUNvbm5lY3Rpb25zTWF4KEludGVnZXIgbmV3V3JpdGVDb25uZWN0aW9uc01heCkgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlJbnRlZ2VyIG9sZCA9IHRoaXMud3JpdGVDb25uZWN0aW9uc01heDsKLQkJdGhpcy53cml0ZUNvbm5lY3Rpb25zTWF4ID0gbmV3V3JpdGVDb25uZWN0aW9uc01heDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFksIG5ld1dyaXRlQ29ubmVjdGlvbnNNYXgpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV1JJVEVfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZLCBvbGQsIG5ld1dyaXRlQ29ubmVjdGlvbnNNYXgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUNvbm5lY3Rpb25zTWF4Q2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWF4OwotCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXggPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNYXgoKSB7Ci0JCXJldHVybiBERUZBVUxUX1dSSVRFX0NPTk5FQ1RJT05TX01BWDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlICoqKioqKioqKioKLQkKLQlwdWJsaWMgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgZ2V0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoKSB7Ci0JCXJldHVybiB0aGlzLmV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZShFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBuZXdFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSkgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBvbGQgPSB0aGlzLmV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlOwotCQl0aGlzLmV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlID0gbmV3RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGU7Ci0JCXRoaXMucHV0UHJvcGVydHkoRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9QUk9QRVJUWSwgbmV3RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9QUk9QRVJUWSwgb2xkLCBuZXdFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgbmV3VmFsdWUgPSBnZXRFbnVtVmFsdWVPZihzdHJpbmdWYWx1ZSwgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUudmFsdWVzKCkpOwotCQlFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBvbGQgPSB0aGlzLmV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlOwotCQl0aGlzLmV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlIGdldERlZmF1bHRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExhenlDb25uZWN0aW9uICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRMYXp5Q29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMubGF6eUNvbm5lY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF6eUNvbm5lY3Rpb24oQm9vbGVhbiBuZXdMYXp5Q29ubmVjdGlvbikgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMubGF6eUNvbm5lY3Rpb247Ci0JCXRoaXMubGF6eUNvbm5lY3Rpb24gPSBuZXdMYXp5Q29ubmVjdGlvbjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShMQVpZX0NPTk5FQ1RJT05fUFJPUEVSVFksIG5ld0xhenlDb25uZWN0aW9uKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExBWllfQ09OTkVDVElPTl9QUk9QRVJUWSwgb2xkLCBuZXdMYXp5Q29ubmVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxhenlDb25uZWN0aW9uQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5sYXp5Q29ubmVjdGlvbjsKLQkJdGhpcy5sYXp5Q29ubmVjdGlvbiA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTEFaWV9DT05ORUNUSU9OX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0TGF6eUNvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiBERUZBVUxUX0xBWllfQ09OTkVDVElPTjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VjbGlwc2VMaW5rQ3VzdG9taXphdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2ZiYzU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uUHJvZmlsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLldlYXZpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi0vKioKLSAqICBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbiBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotCWltcGxlbWVudHMgQ3VzdG9taXphdGlvbgotewotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBCb29sZWFuIHRocm93RXhjZXB0aW9uczsKLQlwcml2YXRlIFdlYXZpbmcgd2VhdmluZzsKLQlwcml2YXRlIEJvb2xlYW4gd2VhdmluZ0xhenk7Ci0JcHJpdmF0ZSBCb29sZWFuIHdlYXZpbmdDaGFuZ2VUcmFja2luZzsKLQlwcml2YXRlIEJvb2xlYW4gd2VhdmluZ0ZldGNoR3JvdXBzOwotCXByaXZhdGUgQm9vbGVhbiB3ZWF2aW5nSW50ZXJuYWw7Ci0JcHJpdmF0ZSBCb29sZWFuIHdlYXZpbmdFYWdlcjsKLQlwcml2YXRlIEJvb2xlYW4gdmFsaWRhdGlvbk9ubHk7Ci0JcHJpdmF0ZSBCb29sZWFuIHZhbGlkYXRlU2NoZW1hOwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHNlc3Npb25DdXN0b21pemVyczsKLQlwcml2YXRlIFN0cmluZyBwcm9maWxlcjsgLy8gc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlIHNpbmNlIHZhbHVlIGNhbiBiZSBQcm9maWxlciBvciBjdXN0b20gY2xhc3MKLQlwcml2YXRlIFN0cmluZyBleGNlcHRpb25IYW5kbGVyOwotCi0JcHJpdmF0ZSBMaXN0PEVudGl0eT4gZW50aXRpZXM7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24oUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCS8qKgotCSAqIEluaXRpYWxpemVzIHByb3BlcnRpZXMgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcygpIHsKLQkJdGhpcy5lbnRpdGllcyA9IG5ldyBBcnJheUxpc3Q8RW50aXR5PigpOwotCi0JCXRoaXMudGhyb3dFeGNlcHRpb25zID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TKTsKLQkJdGhpcy53ZWF2aW5nID0gCi0JCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19XRUFWSU5HLCBXZWF2aW5nLnZhbHVlcygpKTsKLQkJdGhpcy53ZWF2aW5nTGF6eSA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfV0VBVklOR19MQVpZKTsKLQkJdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmcgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1dFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HKTsKLQkJdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHMgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1dFQVZJTkdfRkVUQ0hfR1JPVVBTKTsKLQkJdGhpcy53ZWF2aW5nSW50ZXJuYWwgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1dFQVZJTkdfSU5URVJOQUwpOwotCQl0aGlzLndlYXZpbmdFYWdlciA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfV0VBVklOR19FQUdFUik7Ci0JCXRoaXMudmFsaWRhdGlvbk9ubHkgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1ZBTElEQVRJT05fT05MWSk7Ci0JCXRoaXMudmFsaWRhdGVTY2hlbWEgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1ZBTElEQVRFX1NDSEVNQSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNlc3Npb25DdXN0b21pemVyc0Zyb21QZXJzaXN0ZW5jZVVuaXQoKTsKLQotCQlTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBwcm9wZXJ0aWVzID0gCi0JCQl0aGlzLmdldFByb3BlcnRpZXNTZXRXaXRoUHJlZml4KEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVudGl0aWVzQ3VzdG9taXplckNsYXNzKHByb3BlcnRpZXMpOwotCQkKLQkJdGhpcy5wcm9maWxlciA9IHRoaXMuZ2V0UHJvZmlsZXJQcm9wZXJ0eVZhbHVlKCk7Ci0JCXRoaXMuZXhjZXB0aW9uSGFuZGxlciA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19FWENFUFRJT05fSEFORExFUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZXNzaW9uQ3VzdG9taXplcnNGcm9tUGVyc2lzdGVuY2VVbml0KCkgewotCQlTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBwcm9wZXJ0aWVzID0gCi0JCQl0aGlzLmdldFByb3BlcnRpZXNTZXRXaXRoUHJlZml4KEVDTElQU0VMSU5LX1NFU1NJT05fQ1VTVE9NSVpFUik7Ci0JCQotCQl0aGlzLnNlc3Npb25DdXN0b21pemVycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihwcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNlc3Npb25DdXN0b21pemVyc1dpdGgocHJvcGVydGllcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZXNzaW9uQ3VzdG9taXplcnNXaXRoKFNldDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IHByb3BlcnRpZXMpIHsKLQkJZm9yIChQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgOiBwcm9wZXJ0aWVzKSB7Ci0JCQl0aGlzLnNlc3Npb25DdXN0b21pemVycy5hZGQocHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUVudGl0aWVzQ3VzdG9taXplckNsYXNzKFNldDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IGRlc2NyaXB0b3JDdXN0b21pemVyUHJvcGVydGllcykgewotCQlmb3IgKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBkZXNjcmlwdG9yQ3VzdG9taXplclByb3BlcnR5IDogZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0aWVzKSB7Ci0JCQl0aGlzLnNldEVudGl0eURlc2NyaXB0b3JDdXN0b21pemVyT2YoZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0eSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBQcm9maWxlciBwcm9wZXJ0eSBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFByb2ZpbGVyUHJvcGVydHlWYWx1ZSgpIHsKLQotCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1BST0ZJTEVSKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwkvLyBubyBwcm9wZXJ0eSBmb3VuZAotCQl9Ci0JCVByb2ZpbGVyIHN0YW5kYXJkUHJvZmlsZXIgPSB0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19QUk9GSUxFUiwgUHJvZmlsZXIudmFsdWVzKCkpOwotCQlyZXR1cm4gKHN0YW5kYXJkUHJvZmlsZXIgPT0gbnVsbCkgPyB2YWx1ZSA6IGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihzdGFuZGFyZFByb2ZpbGVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUykpIHsKLQkJCXRoaXMudGhyb3dFeGNlcHRpb25zQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HKSkgewotCQkJdGhpcy53ZWF2aW5nQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0xBWlkpKSB7Ci0JCQl0aGlzLndlYXZpbmdMYXp5Q2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0NIQU5HRV9UUkFDS0lORykpIHsKLQkJCXRoaXMud2VhdmluZ0NoYW5nZVRyYWNraW5nQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUykpIHsKLQkJCXRoaXMud2VhdmluZ0ZldGNoR3JvdXBzQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0lOVEVSTkFMKSkgewotCQkJdGhpcy53ZWF2aW5nSW50ZXJuYWxDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkdfRUFHRVIpKSB7Ci0JCQl0aGlzLndlYXZpbmdFYWdlckNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVkFMSURBVElPTl9PTkxZKSkgewotCQkJdGhpcy52YWxpZGF0aW9uT25seUNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVkFMSURBVEVfU0NIRU1BKSkgewotCQkJdGhpcy52YWxpZGF0ZVNjaGVtYUNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSKSkgewotCQkJdGhpcy5zZXNzaW9uQ3VzdG9taXplcnNDaGFuZ2VkKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSKSkgewotCQkJdGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplckNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19QUk9GSUxFUikpIHsKLQkJCXRoaXMucHJvZmlsZXJDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0VYQ0VQVElPTl9IQU5ETEVSKSkgewotCQkJdGhpcy5leGNlcHRpb25IYW5kbGVyQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlMpKSB7Ci0JCQl0aGlzLnRocm93RXhjZXB0aW9uc0NoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HKSkgewotCQkJdGhpcy53ZWF2aW5nQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkdfTEFaWSkpIHsKLQkJCXRoaXMud2VhdmluZ0xhenlDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkcpKSB7Ci0JCQl0aGlzLndlYXZpbmdDaGFuZ2VUcmFja2luZ0NoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUykpIHsKLQkJCXRoaXMud2VhdmluZ0ZldGNoR3JvdXBzQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkdfSU5URVJOQUwpKSB7Ci0JCQl0aGlzLndlYXZpbmdJbnRlcm5hbENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0VBR0VSKSkgewotCQkJdGhpcy53ZWF2aW5nRWFnZXJDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVkFMSURBVElPTl9PTkxZKSkgewotCQkJdGhpcy52YWxpZGF0aW9uT25seUNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19WQUxJREFURV9TQ0hFTUEpKSB7Ci0JCQl0aGlzLnZhbGlkYXRlU2NoZW1hQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFU1NJT05fQ1VTVE9NSVpFUikpIHsKLQkJCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzQ2hhbmdlZCgpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUikpIHsKLQkJCXRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXJDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19QUk9GSUxFUikpIHsKLQkJCXRoaXMucHJvZmlsZXJDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRVhDRVBUSU9OX0hBTkRMRVIpKSB7Ci0JCQl0aGlzLmV4Y2VwdGlvbkhhbmRsZXJDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCi0JICogCQlrZXkgPSBFY2xpcHNlTGluayBwcm9wZXJ0eSBrZXkKLQkgKiAJCXZhbHVlID0gcHJvcGVydHkgaWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlMsCi0JCQlUSFJPV19FWENFUFRJT05TX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XRUFWSU5HLAotCQkJV0VBVklOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfV0VBVklOR19MQVpZLAotCQkJV0VBVklOR19MQVpZX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XRUFWSU5HX0NIQU5HRV9UUkFDS0lORywKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUywKLQkJCVdFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XRUFWSU5HX0lOVEVSTkFMLAotCQkJV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfV0VBVklOR19FQUdFUiwKLQkJCVdFQVZJTkdfRUFHRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1ZBTElEQVRJT05fT05MWSwKLQkJCVZBTElEQVRJT05fT05MWV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVkFMSURBVEVfU0NIRU1BLAotCQkJVkFMSURBVEVfU0NIRU1BX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19TRVNTSU9OX0NVU1RPTUlaRVIsCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1BST0ZJTEVSLAotCQkJUFJPRklMRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0VYQ0VQVElPTl9IQU5ETEVSLAotCQkJRVhDRVBUSU9OX0hBTkRMRVJfUFJPUEVSVFkpOwotCi0JCS8vIERvbid0IG5lZWQgdG8gaW5pdGlhbGl6ZSBwcm9wZXJ0eU5hbWVzIGZvcjogCi0JCS8vIGRlc2NyaXB0b3JDdXN0b21pemVyUHJvcGVydHkKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdXNlZCBmb3IgaWRlbnRpZnlpbmcgdGhlIGdpdmVuIHByb3BlcnR5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGl0ZW1Jc1Byb3BlcnR5KFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBpdGVtKSB7Ci0JCWJvb2xlYW4gaXNQcm9wZXJ0eSA9IHN1cGVyLml0ZW1Jc1Byb3BlcnR5KGl0ZW0pOwotCQkKLQkJaWYgKCAhIGlzUHJvcGVydHkgJiYgaXRlbS5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCWlmIChpdGVtLmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBpc1Byb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgdXNlZCBmb3IgY2hhbmdlIG5vdGlmaWNhdGlvbiBvZiB0aGUgZ2l2ZW4KLQkgKiBwcm9wZXJ0eS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHByb3BlcnR5SWRPZihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJaWYgKHByb3BlcnR5LmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUikpIHsKLQkJCQlyZXR1cm4gREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIEVudGl0eSBhZGRFbnRpdHkoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaWYgKHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbnRpdHkgIiArIGVudGl0eU5hbWUgKyAiIGFscmVhZHkgZXhpc3RzLiIpOwotCQl9Ci0JCUVudGl0eSBuZXdFbnRpdHkgPSB0aGlzLmJ1aWxkRW50aXR5KGVudGl0eU5hbWUpOwotCQl0aGlzLmVudGl0aWVzLmFkZChuZXdFbnRpdHkpOwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChFTlRJVElFU19MSVNULCB0aGlzLmVudGl0aWVzKTsKLQkJcmV0dXJuIG5ld0VudGl0eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRpdHkoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaWYgKCAhIHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRW50aXR5IGVudGl0eSA9IHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSk7Ci0JCXRoaXMuY2xlYXJFbnRpdHkoZW50aXR5KTsKLQkJdGhpcy5yZW1vdmVFbnRpdHkoZW50aXR5KTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIFRocm93RXhjZXB0aW9ucyAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0VGhyb3dFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gdGhpcy50aHJvd0V4Y2VwdGlvbnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRocm93RXhjZXB0aW9ucyhCb29sZWFuIG5ld1Rocm93RXhjZXB0aW9ucykgewotCQlCb29sZWFuIG9sZCA9IHRoaXMudGhyb3dFeGNlcHRpb25zOwotCQl0aGlzLnRocm93RXhjZXB0aW9ucyA9IG5ld1Rocm93RXhjZXB0aW9uczsKLQkJdGhpcy5wdXRQcm9wZXJ0eShUSFJPV19FWENFUFRJT05TX1BST1BFUlRZLCBuZXdUaHJvd0V4Y2VwdGlvbnMpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSwgb2xkLCBuZXdUaHJvd0V4Y2VwdGlvbnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0aHJvd0V4Y2VwdGlvbnNDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnRocm93RXhjZXB0aW9uczsKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnMgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VGhyb3dFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gREVGQVVMVF9USFJPV19FWENFUFRJT05TOwotCX0KLQotCS8vICoqKioqKioqKiogV2VhdmluZ0xhenkgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFdlYXZpbmdMYXp5KCkgewotCQlyZXR1cm4gdGhpcy53ZWF2aW5nTGF6eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXZWF2aW5nTGF6eShCb29sZWFuIG5ld1dlYXZpbmdMYXp5KSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nTGF6eTsKLQkJdGhpcy53ZWF2aW5nTGF6eSA9IG5ld1dlYXZpbmdMYXp5OwotCQl0aGlzLnB1dFByb3BlcnR5KFdFQVZJTkdfTEFaWV9QUk9QRVJUWSwgbmV3V2VhdmluZ0xhenkpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19MQVpZX1BST1BFUlRZLCBvbGQsIG5ld1dlYXZpbmdMYXp5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd2VhdmluZ0xhenlDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdMYXp5OwotCQl0aGlzLndlYXZpbmdMYXp5ID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX0xBWllfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nTGF6eSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfV0VBVklOR19MQVpZOwotCX0KLQotCS8vICoqKioqKioqKiogV2VhdmluZ0NoYW5nZVRyYWNraW5nICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKSB7Ci0JCXJldHVybiB0aGlzLndlYXZpbmdDaGFuZ2VUcmFja2luZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoQm9vbGVhbiBuZXdXZWF2aW5nQ2hhbmdlVHJhY2tpbmcpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdDaGFuZ2VUcmFja2luZzsKLQkJdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmcgPSBuZXdXZWF2aW5nQ2hhbmdlVHJhY2tpbmc7Ci0JCXRoaXMucHV0UHJvcGVydHkoV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFksIG5ld1dlYXZpbmdDaGFuZ2VUcmFja2luZyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSwgb2xkLCBuZXdXZWF2aW5nQ2hhbmdlVHJhY2tpbmcpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3ZWF2aW5nQ2hhbmdlVHJhY2tpbmdDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdDaGFuZ2VUcmFja2luZzsKLQkJdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmcgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gREVGQVVMVF9XRUFWSU5HX0NIQU5HRV9UUkFDS0lORzsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdGZXRjaEdyb3VwcyAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0V2VhdmluZ0ZldGNoR3JvdXBzKCkgewotCQlyZXR1cm4gdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2VhdmluZ0ZldGNoR3JvdXBzKEJvb2xlYW4gbmV3V2VhdmluZ0ZldGNoR3JvdXBzKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHM7Ci0JCXRoaXMud2VhdmluZ0ZldGNoR3JvdXBzID0gbmV3V2VhdmluZ0ZldGNoR3JvdXBzOwotCQl0aGlzLnB1dFByb3BlcnR5KFdFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZLCBuZXdXZWF2aW5nRmV0Y2hHcm91cHMpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFksIG9sZCwgbmV3V2VhdmluZ0ZldGNoR3JvdXBzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd2VhdmluZ0ZldGNoR3JvdXBzQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHM7Ci0JCXRoaXMud2VhdmluZ0ZldGNoR3JvdXBzID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdGZXRjaEdyb3VwcygpIHsKLQkJcmV0dXJuIERFRkFVTFRfV0VBVklOR19GRVRDSF9HUk9VUFM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nSW50ZXJuYWwgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFdlYXZpbmdJbnRlcm5hbCgpIHsKLQkJcmV0dXJuIHRoaXMud2VhdmluZ0ludGVybmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdlYXZpbmdJbnRlcm5hbChCb29sZWFuIG5ld1dlYXZpbmdJbnRlcm5hbCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0ludGVybmFsOwotCQl0aGlzLndlYXZpbmdJbnRlcm5hbCA9IG5ld1dlYXZpbmdJbnRlcm5hbDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXRUFWSU5HX0lOVEVSTkFMX1BST1BFUlRZLCBuZXdXZWF2aW5nSW50ZXJuYWwpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSwgb2xkLCBuZXdXZWF2aW5nSW50ZXJuYWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3ZWF2aW5nSW50ZXJuYWxDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdJbnRlcm5hbDsKLQkJdGhpcy53ZWF2aW5nSW50ZXJuYWwgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfSU5URVJOQUxfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nSW50ZXJuYWwoKSB7Ci0JCXJldHVybiBERUZBVUxUX1dFQVZJTkdfSU5URVJOQUw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nRWFnZXIgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFdlYXZpbmdFYWdlcigpIHsKLQkJcmV0dXJuIHRoaXMud2VhdmluZ0VhZ2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdlYXZpbmdFYWdlcihCb29sZWFuIG5ld1dlYXZpbmdFYWdlcikgewotCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0VhZ2VyOwotCQl0aGlzLndlYXZpbmdFYWdlciA9IG5ld1dlYXZpbmdFYWdlcjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXRUFWSU5HX0VBR0VSX1BST1BFUlRZLCBuZXdXZWF2aW5nRWFnZXIpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19FQUdFUl9QUk9QRVJUWSwgb2xkLCBuZXdXZWF2aW5nRWFnZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3ZWF2aW5nRWFnZXJDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdFYWdlcjsKLQkJdGhpcy53ZWF2aW5nRWFnZXIgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfRUFHRVJfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nRWFnZXIoKSB7Ci0JCXJldHVybiBERUZBVUxUX1dFQVZJTkdfRUFHRVI7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uT25seSAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0VmFsaWRhdGlvbk9ubHkoKSB7Ci0JCXJldHVybiB0aGlzLnZhbGlkYXRpb25Pbmx5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25Pbmx5KEJvb2xlYW4gbmV3VmFsaWRhdGlvbk9ubHkpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnZhbGlkYXRpb25Pbmx5OwotCQl0aGlzLnZhbGlkYXRpb25Pbmx5ID0gbmV3VmFsaWRhdGlvbk9ubHk7Ci0JCXRoaXMucHV0UHJvcGVydHkoVkFMSURBVElPTl9PTkxZX1BST1BFUlRZLCBuZXdWYWxpZGF0aW9uT25seSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxJREFUSU9OX09OTFlfUFJPUEVSVFksIG9sZCwgbmV3VmFsaWRhdGlvbk9ubHkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0aW9uT25seUNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMudmFsaWRhdGlvbk9ubHk7Ci0JCXRoaXMudmFsaWRhdGlvbk9ubHkgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTElEQVRJT05fT05MWV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFZhbGlkYXRpb25Pbmx5KCkgewotCQlyZXR1cm4gREVGQVVMVF9WQUxJREFUSU9OX09OTFk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0ZVNjaGVtYSAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0VmFsaWRhdGVTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnZhbGlkYXRlU2NoZW1hOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRlU2NoZW1hKEJvb2xlYW4gbmV3VmFsaWRhdGVTY2hlbWEpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnZhbGlkYXRlU2NoZW1hOwotCQl0aGlzLnZhbGlkYXRlU2NoZW1hID0gbmV3VmFsaWRhdGVTY2hlbWE7Ci0JCXRoaXMucHV0UHJvcGVydHkoVkFMSURBVEVfU0NIRU1BX1BST1BFUlRZLCBuZXdWYWxpZGF0ZVNjaGVtYSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxJREFURV9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgbmV3VmFsaWRhdGVTY2hlbWEpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVNjaGVtYUNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMudmFsaWRhdGVTY2hlbWE7Ci0JCXRoaXMudmFsaWRhdGVTY2hlbWEgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTElEQVRFX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFZhbGlkYXRlU2NoZW1hKCkgewotCQlyZXR1cm4gREVGQVVMVF9WQUxJREFURV9TQ0hFTUE7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uQ3VzdG9taXplcnMgKioqKioqKioqKgotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBzZXNzaW9uQ3VzdG9taXplcnMoKXsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzKTsKLQl9Ci0JCi0JcHVibGljIGludCBzZXNzaW9uQ3VzdG9taXplcnNTaXplKCl7Ci0JCXJldHVybiB0aGlzLnNlc3Npb25DdXN0b21pemVycy5zaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2Vzc2lvbkN1c3RvbWl6ZXJFeGlzdHMoU3RyaW5nIHNlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lKSB7Ci0KLQkJZm9yIChTdHJpbmcgc2Vzc2lvbkN1c3RvbWl6ZXIgOiB0aGlzLnNlc3Npb25DdXN0b21pemVycykgewotCQkJaWYoc2Vzc2lvbkN1c3RvbWl6ZXIuZXF1YWxzKHNlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGFkZFNlc3Npb25DdXN0b21pemVyKFN0cmluZyBuZXdTZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZSl7Ci0KLQkJaWYoICEgdGhpcy5zZXNzaW9uQ3VzdG9taXplckV4aXN0cyhuZXdTZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZSkpIHsKLQkJCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzLmFkZChuZXdTZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZSk7Ci0JCQl0aGlzLnB1dFByb3BlcnR5KFNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSwgbmV3U2Vzc2lvbkN1c3RvbWl6ZXJDbGFzc05hbWUsIHRydWUpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoU0VTU0lPTl9DVVNUT01JWkVSX0xJU1QsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzKTsKLQkJCXJldHVybiBuZXdTZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU2Vzc2lvbkN1c3RvbWl6ZXIoU3RyaW5nIGNsYXNzTmFtZSl7Ci0KLQkJaWYodGhpcy5yZW1vdmVTZXNzaW9uQ3VzdG9taXplcl8oY2xhc3NOYW1lKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZVByb3BlcnR5KFNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSwgY2xhc3NOYW1lKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFNFU1NJT05fQ1VTVE9NSVpFUl9MSVNULCB0aGlzLnNlc3Npb25DdXN0b21pemVycyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlU2Vzc2lvbkN1c3RvbWl6ZXJfKFN0cmluZyBjbGFzc05hbWUpewotCi0JCWZvciAoIExpc3RJdGVyYXRvcjxTdHJpbmc+IGkgPSB0aGlzLnNlc3Npb25DdXN0b21pemVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBzZXNzaW9uQ3VzdG9taXplciA9IGkubmV4dCgpOwotCQkJaWYoc2Vzc2lvbkN1c3RvbWl6ZXIuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQl0aGlzLnNlc3Npb25DdXN0b21pemVycy5yZW1vdmUoc2Vzc2lvbkN1c3RvbWl6ZXIpOwotCQkJCXJldHVybiBzZXNzaW9uQ3VzdG9taXplcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2Vzc2lvbkN1c3RvbWl6ZXJzQ2hhbmdlZCgpIHsKLQotCQl0aGlzLmluaXRpYWxpemVTZXNzaW9uQ3VzdG9taXplcnNGcm9tUGVyc2lzdGVuY2VVbml0KCk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFNFU1NJT05fQ1VTVE9NSVpFUl9MSVNULCB0aGlzLnNlc3Npb25DdXN0b21pemVycyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nICoqKioqKioqKioKLQkKLQlwdWJsaWMgV2VhdmluZyBnZXRXZWF2aW5nKCkgewotCQlyZXR1cm4gdGhpcy53ZWF2aW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXZWF2aW5nKFdlYXZpbmcgbmV3V2VhdmluZykgewotCQlXZWF2aW5nIG9sZCA9IHRoaXMud2VhdmluZzsKLQkJdGhpcy53ZWF2aW5nID0gbmV3V2VhdmluZzsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXRUFWSU5HX1BST1BFUlRZLCBuZXdXZWF2aW5nKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfUFJPUEVSVFksIG9sZCwgbmV3V2VhdmluZyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdlYXZpbmdDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlXZWF2aW5nIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIFdlYXZpbmcudmFsdWVzKCkpOwotCQlXZWF2aW5nIG9sZCA9IHRoaXMud2VhdmluZzsKLQkJdGhpcy53ZWF2aW5nID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIFdlYXZpbmcgZ2V0RGVmYXVsdFdlYXZpbmcoKSB7Ci0JCXJldHVybiBERUZBVUxUX1dFQVZJTkc7Ci0JfQotCi0JLy8gKioqKioqKioqKiBFeGNlcHRpb25IYW5kbGVyICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldEV4Y2VwdGlvbkhhbmRsZXIoKSB7Ci0JCXJldHVybiB0aGlzLmV4Y2VwdGlvbkhhbmRsZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uSGFuZGxlcihTdHJpbmcgbmV3RXhjZXB0aW9uSGFuZGxlcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5leGNlcHRpb25IYW5kbGVyOwotCQl0aGlzLmV4Y2VwdGlvbkhhbmRsZXIgPSBuZXdFeGNlcHRpb25IYW5kbGVyOwotCQl0aGlzLnB1dFByb3BlcnR5KEVYQ0VQVElPTl9IQU5ETEVSX1BST1BFUlRZLCBuZXdFeGNlcHRpb25IYW5kbGVyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYQ0VQVElPTl9IQU5ETEVSX1BST1BFUlRZLCBvbGQsIG5ld0V4Y2VwdGlvbkhhbmRsZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGNlcHRpb25IYW5kbGVyQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZXhjZXB0aW9uSGFuZGxlcjsKLQkJdGhpcy5leGNlcHRpb25IYW5kbGVyID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RXhjZXB0aW9uSGFuZGxlcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfRVhDRVBUSU9OX0hBTkRMRVI7Ci0JfQotCi0JLy8gKioqKioqKioqKiBEZXNjcmlwdG9yQ3VzdG9taXplciAqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCUVudGl0eSBlbnRpdHkgPSB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpOwotCQlyZXR1cm4gKGVudGl0eSA9PSBudWxsKSA/IG51bGwgOiBlbnRpdHkuZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihTdHJpbmcgZW50aXR5TmFtZSwgU3RyaW5nIG5ld0Rlc2NyaXB0b3JDdXN0b21pemVyKSB7Ci0JCUVudGl0eSBvbGQgPSB0aGlzLnNldEVudGl0eURlc2NyaXB0b3JDdXN0b21pemVyT2YoZW50aXR5TmFtZSwgbmV3RGVzY3JpcHRvckN1c3RvbWl6ZXIpOwotCQl0aGlzLnB1dFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiwgZW50aXR5TmFtZSwgbmV3RGVzY3JpcHRvckN1c3RvbWl6ZXIsIGZhbHNlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlc2NyaXB0b3JDdXN0b21pemVyQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmV4dHJhY3RFbnRpdHlOYW1lT2YocHJvcGVydHlOYW1lKTsKLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShlbnRpdHlOYW1lKSkgewotCQkJRW50aXR5IG9sZCA9IHRoaXMuc2V0RW50aXR5RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHlOYW1lLCBzdHJpbmdWYWx1ZSk7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZLCBvbGQsIHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdERlc2NyaXB0b3JDdXN0b21pemVyKCkgewotCQlyZXR1cm4gREVGQVVMVF9ERVNDUklQVE9SX0NVU1RPTUlaRVI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQotCSAqLwotCXByaXZhdGUgRW50aXR5IHNldEVudGl0eURlc2NyaXB0b3JDdXN0b21pemVyT2YoU3RyaW5nIGVudGl0eU5hbWUsIFN0cmluZyBkZXNjcmlwdG9yQ3VzdG9taXplckNsYXNzTmFtZSkgewotCQkgaWYoKCAhIHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSAmJiBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGRlc2NyaXB0b3JDdXN0b21pemVyQ2xhc3NOYW1lKSkgewotCQkJCS8vdGhpcyBpcyBhIHByb3BlcnR5IHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGFkZGVkLCB3ZSBkb24ndCBuZWVkIHRvIGRlYWwgd2l0aCBpdCB1bnRpbCB0aGUgdmFsdWUgaXMgc2V0Ci0JCQkJIHJldHVybiBudWxsOwotCQkJIH0KLQkJRW50aXR5IGVudGl0eSA9ICh0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgPwotCQkJCQkJdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKSA6Ci0JCQkJCQl0aGlzLmFkZEVudGl0eShlbnRpdHlOYW1lKTsKLQkJcmV0dXJuIHRoaXMuc2V0RW50aXR5RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHksIGRlc2NyaXB0b3JDdXN0b21pemVyQ2xhc3NOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQotCSAqLwotCXByaXZhdGUgRW50aXR5IHNldEVudGl0eURlc2NyaXB0b3JDdXN0b21pemVyT2YoRW50aXR5IGVudGl0eSwgU3RyaW5nIGRlc2NyaXB0b3JDdXN0b21pemVyQ2xhc3NOYW1lKSB7Ci0JCWlmKGVudGl0eSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRW50aXR5IG9sZCA9IGVudGl0eS5jbG9uZSgpOwotCQllbnRpdHkuc2V0RGVzY3JpcHRvckN1c3RvbWl6ZXIoZGVzY3JpcHRvckN1c3RvbWl6ZXJDbGFzc05hbWUpOwotCQlyZXR1cm4gb2xkOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gdXBkYXRlIHRoZSBkZXNjcmlwdG9yQ3VzdG9taXplckNsYXNzTmFtZSBpbiBlbnRpdGllcy4KLQkgKiBSZXR1cm5zIHRoZSBvbGQgRW50aXR5Ci0JICovCi0JcHJpdmF0ZSBFbnRpdHkgc2V0RW50aXR5RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0eSkgewotCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZXh0cmFjdEVudGl0eU5hbWVPZihkZXNjcmlwdG9yQ3VzdG9taXplclByb3BlcnR5KTsKLQkJaWYoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShlbnRpdHlOYW1lKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc2V0RW50aXR5RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHlOYW1lLCBkZXNjcmlwdG9yQ3VzdG9taXplclByb3BlcnR5LmdldFZhbHVlKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogUHJvZmlsZXIgKioqKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgUHJvZmlsZXIgb3IgY3VzdG9tIHByb2ZpbGVyIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gRWNsaXBzZUxpbmsgc3RyaW5nIHZhbHVlIGZvciBQcm9maWxlciBlbnVtIG9yIGN1c3RvbSBwcm9maWxlciBjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZmlsZXIoKSB7Ci0JCXJldHVybiB0aGlzLnByb2ZpbGVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgRWNsaXBzZUxpbmsgcHJvZmlsZXIuCi0JICogCi0JICogQHBhcmFtIG5ld1Byb2ZpbGVyIC0gUHJvZmlsZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9maWxlcihQcm9maWxlciBuZXdQcm9maWxlcikgewotCQlpZiggbmV3UHJvZmlsZXIgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRQcm9maWxlcl8oKFN0cmluZykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5zZXRQcm9maWxlcl8oZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKG5ld1Byb2ZpbGVyKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBFY2xpcHNlTGluayBwcm9maWxlciBvciBjdXN0b20gcHJvZmlsZXIuCi0JICogCi0JICogQHBhcmFtIG5ld1Byb2ZpbGVyIC0KLQkgKiAgICAgICAgICAgIENhbiBiZSBhIEVjbGlwc2VMaW5rIHByb2ZpbGVyIGxpdGVyYWwgb3IKLQkgKiAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjdXN0b20gcHJvZmlsZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvZmlsZXIoU3RyaW5nIG5ld1Byb2ZpbGVyKSB7Ci0JCWlmKCBuZXdQcm9maWxlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldFByb2ZpbGVyXygoU3RyaW5nKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlQcm9maWxlciBwID0gUHJvZmlsZXIuZ2V0UHJvZmlsZXJGb3IobmV3UHJvZmlsZXIpOwotCQlpZihwID09IG51bGwpIHsJLy8gY3VzdG9tIHByb2ZpbGVyIGNsYXNzCi0JCQl0aGlzLnNldFByb2ZpbGVyXyhuZXdQcm9maWxlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNldFByb2ZpbGVyKHApOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRQcm9maWxlcl8oU3RyaW5nIG5ld1Byb2ZpbGVyKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnByb2ZpbGVyOwotCQl0aGlzLnByb2ZpbGVyID0gbmV3UHJvZmlsZXI7Ci0JCXRoaXMucHV0UHJvcGVydHkoUFJPRklMRVJfUFJPUEVSVFksIG5ld1Byb2ZpbGVyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST0ZJTEVSX1BST1BFUlRZLCBvbGQsIG5ld1Byb2ZpbGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvZmlsZXJDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5wcm9maWxlcjsKLQkJdGhpcy5wcm9maWxlciA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPRklMRVJfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFByb2ZpbGVyKCkgewotCQlyZXR1cm4gREVGQVVMVF9QUk9GSUxFUjsKLQl9Ci0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQotCS8qKgotCSAqIFNldCBhbGwgRW50aXR5IHByb3BlcnRpZXMgdG8gZGVmYXVsdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJFbnRpdHkoRW50aXR5IGVudGl0eSkgewotCQlpZihlbnRpdHkuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGVudGl0eU5hbWUgPSBlbnRpdHkuZ2V0TmFtZSgpOwotCQl0aGlzLnNldERlc2NyaXB0b3JDdXN0b21pemVyT2YoZW50aXR5TmFtZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRW50aXR5IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICovCi0JcHJpdmF0ZSBFbnRpdHkgZ2V0RW50aXR5TmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yKEVudGl0eSBlbnRpdHk6IHRoaXMuZW50aXRpZXMpIHsKLQkJCWlmKGVudGl0eS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGVudGl0eTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEVudGl0eSBidWlsZEVudGl0eShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmV3IEVudGl0eSh0aGlzLCBuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudGl0eShFbnRpdHkgZW50aXR5KSB7Ci0JCWlmKGVudGl0eSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5lbnRpdGllcy5yZW1vdmUoZW50aXR5KTsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoRU5USVRJRVNfTElTVCwgdGhpcy5lbnRpdGllcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIEVudGl0eSBleGlzdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlbnRpdHlFeGlzdHMoU3RyaW5nIG5hbWUpIHsKLQkJZm9yKEVudGl0eSBlbnRpdHk6IHRoaXMuZW50aXRpZXMpIHsKLQkJCWlmKGVudGl0eS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vICoqKioqKiBlbnRpdGllcyBsaXN0ICoqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RW50aXR5PiBlbnRpdGllcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxFbnRpdHk+KHRoaXMuZW50aXRpZXMpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGVudGl0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RW50aXR5LCBTdHJpbmc+KHRoaXMuZW50aXRpZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShFbnRpdHkgZW50aXR5KSB7Ci0JCQkJcmV0dXJuIGVudGl0eS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIGludCBlbnRpdGllc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0aWVzLnNpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCQl0aGlzLmNyZWF0ZVNlc3Npb25DdXN0b21pemVyUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJCXRoaXMuY3JlYXRlRXhjZXB0aW9uSGFuZGxlclJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVNlc3Npb25DdXN0b21pemVyUmVuYW1lVHlwZUVkaXRzKGZpbmFsIElUeXBlIG9yaWdpbmFsVHlwZSwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHksIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydGllc05hbWVkKEVDTElQU0VMSU5LX1NFU1NJT05fQ1VTVE9NSVpFUikpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJCQkJcmV0dXJuIHByb3BlcnR5LmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUV4Y2VwdGlvbkhhbmRsZXJSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShFQ0xJUFNFTElOS19FWENFUFRJT05fSEFORExFUik7Ci0JCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcGVydHkuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJCXRoaXMuY3JlYXRlU2Vzc2lvbkN1c3RvbWl6ZXJNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQkJCXRoaXMuY3JlYXRlRXhjZXB0aW9uSGFuZGxlck1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVTZXNzaW9uQ3VzdG9taXplck1vdmVUeXBlRWRpdHMoZmluYWwgSVR5cGUgb3JpZ2luYWxUeXBlLCBmaW5hbCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHksIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydGllc05hbWVkKEVDTElQU0VMSU5LX1NFU1NJT05fQ1VTVE9NSVpFUikpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJCQkJcmV0dXJuIHByb3BlcnR5LmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVFeGNlcHRpb25IYW5kbGVyTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShFQ0xJUFNFTElOS19FWENFUFRJT05fSEFORExFUik7Ci0JCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcGVydHkuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCQl0aGlzLmNyZWF0ZVNlc3Npb25DdXN0b21pemVyUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQkJCXRoaXMuY3JlYXRlRXhjZXB0aW9uSGFuZGxlclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVNlc3Npb25DdXN0b21pemVyUmVuYW1lUGFja2FnZUVkaXRzKGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PihnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0aWVzTmFtZWQoRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQkJCQlyZXR1cm4gcHJvcGVydHkuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlRXhjZXB0aW9uSGFuZGxlclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoRUNMSVBTRUxJTktfRVhDRVBUSU9OX0hBTkRMRVIpOwotCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHByb3BlcnR5LmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZjg5OTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotCi0vKioKLSAqICBFbnRpdHkKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eSBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBDdXN0b21pemF0aW9uIHBhcmVudDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSA9IEN1c3RvbWl6YXRpb24uREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZOyAvLyROT04tTkxTLTEkCi0KLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0b3JDdXN0b21pemVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVudGl0eShDdXN0b21pemF0aW9uIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJdGhpcyhwYXJlbnQpOwotCQl0aGlzLmluaXRpYWxpemUobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBFbnRpdHkoQ3VzdG9taXphdGlvbiBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKFN0cmluZyBuYW1lKSB7Ci0JCWlmKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkobmFtZSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3JzICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYobyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRW50aXR5IGN1c3RvbWl6ZXIgPSAoRW50aXR5KSBvOwotCQlyZXR1cm4gKAotCQkJKHRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXIgPT0gbnVsbCA/Ci0JCQkJY3VzdG9taXplci5kZXNjcmlwdG9yQ3VzdG9taXplciA9PSBudWxsIDogCi0JCQkJdGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplci5lcXVhbHMoY3VzdG9taXplci5kZXNjcmlwdG9yQ3VzdG9taXplcikpKTsKLQl9Ci0JCi0JIEBPdmVycmlkZQotCSBwdWJsaWMgRW50aXR5IGNsb25lKCkgewotCQkgdHJ5IHsKLQkJCSByZXR1cm4gKEVudGl0eSlzdXBlci5jbG9uZSgpOwotCQkgfQotCQkgY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJIH0KLQkgfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXIgPT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZW50aXR5TmFtZUlzVmFsaWQoKSB7Ci0JCXJldHVybiAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5uYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ3VzdG9taXphdGlvbiBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldHRlci9zZXR0ZXIgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0b3JDdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZXNjcmlwdG9yQ3VzdG9taXplcihTdHJpbmcgZGVzY3JpcHRvckN1c3RvbWl6ZXIpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXI7Ci0JCXRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXIgPSBkZXNjcmlwdG9yQ3VzdG9taXplcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSwgb2xkLCBkZXNjcmlwdG9yQ3VzdG9taXplcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoIm5hbWU6ICIpOwotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJc2IuYXBwZW5kKCIsIGRlc2NyaXB0b3JDdXN0b21pemVyOiAiKTsKLQkJc2IuYXBwZW5kKHRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtHZW5lcmFsUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvZ2VuZXJhbC9FY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDdiMDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvZ2VuZXJhbC9FY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuZ2VuZXJhbC5HZW5lcmFsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtHZW5lcmFsUHJvcGVydGllcwotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtHZW5lcmFsUHJvcGVydGllcyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotCWltcGxlbWVudHMgR2VuZXJhbFByb3BlcnRpZXMKLXsKLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgotCXByaXZhdGUgQm9vbGVhbiBleGNsdWRlRWNsaXBzZWxpbmtPcm07Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rR2VuZXJhbFByb3BlcnRpZXMoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCS8qKgotCSAqIEluaXRpYWxpemVzIHByb3BlcnRpZXMgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcygpIHsKLQkJCi0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRVhDTFVERV9FQ0xJUFNFTElOS19PUk0pKSB7Ci0JCQlleGNsdWRlRWNsaXBzZWxpbmtPcm1DaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSkpIHsKLQkJCWV4Y2x1ZGVFY2xpcHNlbGlua09ybUNoYW5nZWQobnVsbCk7CQkJCi0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleQotCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRVhDTFVERV9FQ0xJUFNFTElOS19PUk0sCi0JCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSk7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBFeGNsdWRlRWNsaXBzZWxpbmtPcm0gKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpIHsKLQkJcmV0dXJuIHRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVFY2xpcHNlbGlua09ybShCb29sZWFuIG5ld0V4Y2x1ZGVFY2xpcHNlbGlua09ybSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtOwotCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybSA9IG5ld0V4Y2x1ZGVFY2xpcHNlbGlua09ybTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShFWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSwgbmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZLCBvbGQsIG5ld0V4Y2x1ZGVFY2xpcHNlbGlua09ybSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4Y2x1ZGVFY2xpcHNlbGlua09ybUNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtOwotCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKSB7Ci0JCXJldHVybiBERUZBVUxUX0VYQ0xVREVfRUNMSVBTRUxJTktfT1JNOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rTG9nZ2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTlhNDc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nTGV2ZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtMb2dnaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0xvZ2dpbmcgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLQlpbXBsZW1lbnRzIExvZ2dpbmcKLXsKLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgotCXByaXZhdGUgTG9nZ2luZ0xldmVsIGxldmVsOwotCXByaXZhdGUgQm9vbGVhbiB0aW1lc3RhbXA7Ci0JcHJpdmF0ZSBCb29sZWFuIHRocmVhZDsKLQlwcml2YXRlIEJvb2xlYW4gc2Vzc2lvbjsKLQlwcml2YXRlIEJvb2xlYW4gZXhjZXB0aW9uczsKLQlwcml2YXRlIFN0cmluZyBsb2dGaWxlTG9jYXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbG9nZ2VyOyAvLyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUgc2luY2UgdmFsdWUgY2FuIGJlIExvZ2dlciBvciBjdXN0b20gY2xhc3MKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtMb2dnaW5nKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCS8vIFRPUkVWSUVXIC0gaGFuZGxlIGluY29ycmVjdCBTdHJpbmcgaW4gcGVyc2lzdGVuY2UueG1sCi0JCXRoaXMubGV2ZWwgPSAKLQkJCXRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX0xFVkVMLCBMb2dnaW5nTGV2ZWwudmFsdWVzKCkpOwotCQl0aGlzLnRpbWVzdGFtcCA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfVElNRVNUQU1QKTsKLQkJdGhpcy50aHJlYWQgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1RIUkVBRCk7Ci0JCXRoaXMuc2Vzc2lvbiA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfU0VTU0lPTik7Ci0JCXRoaXMuZXhjZXB0aW9ucyA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfRVhDRVBUSU9OUyk7Ci0JCXRoaXMubG9nRmlsZUxvY2F0aW9uID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0xPR19GSUxFX0xPQ0FUSU9OKTsKLQkJCi0JCXRoaXMubG9nZ2VyID0gdGhpcy5nZXRMb2dnZXJQcm90ZXJ0eVZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgTG9nZ2VyIHByb3BlcnR5IGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TG9nZ2VyUHJvdGVydHlWYWx1ZSgpIHsKLQotCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0xPR0dFUik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsJLy8gbm8gcHJvcGVydHkgZm91bmQKLQkJfQotCQlMb2dnZXIgc3RhbmRhcmRMb2dnZXIgPSB0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19MT0dHRVIsIExvZ2dlci52YWx1ZXMoKSk7Ci0JCXJldHVybiAoc3RhbmRhcmRMb2dnZXIgPT0gbnVsbCkgPyB2YWx1ZSA6IGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihzdGFuZGFyZExvZ2dlcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0xFVkVMKSkgewotCQkJdGhpcy5sZXZlbENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVElNRVNUQU1QKSkgewotCQkJdGhpcy50aW1lc3RhbXBDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RIUkVBRCkpIHsKLQkJCXRoaXMudGhyZWFkQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OKSkgewotCQkJdGhpcy5zZXNzaW9uQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FWENFUFRJT05TKSkgewotCQkJdGhpcy5leGNlcHRpb25zQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19MT0dfRklMRV9MT0NBVElPTikpIHsKLQkJCXRoaXMubG9nRmlsZUxvY2F0aW9uQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19MT0dHRVIpKSB7Ci0JCQl0aGlzLmxvZ2dlckNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19MRVZFTCkpIHsKLQkJCXRoaXMubGV2ZWxDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVElNRVNUQU1QKSkgewotCQkJdGhpcy50aW1lc3RhbXBDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVEhSRUFEKSkgewotCQkJdGhpcy50aHJlYWRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTikpIHsKLQkJCXRoaXMuc2Vzc2lvbkNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FWENFUFRJT05TKSkgewotCQkJdGhpcy5leGNlcHRpb25zQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0xPR19GSUxFX0xPQ0FUSU9OKSkgewotCQkJdGhpcy5sb2dGaWxlTG9jYXRpb25DaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfTE9HR0VSKSkgewotCQkJdGhpcy5sb2dnZXJDaGFuZ2VkKG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleQotCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfTEVWRUwsCi0JCQlMRVZFTF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVElNRVNUQU1QLAotCQkJVElNRVNUQU1QX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19USFJFQUQsCi0JCQlUSFJFQURfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFU1NJT04sCi0JCQlTRVNTSU9OX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19FWENFUFRJT05TLAotCQkJRVhDRVBUSU9OU19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfTE9HX0ZJTEVfTE9DQVRJT04sCi0JCQlMT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfTE9HR0VSLAotCQkJTE9HR0VSX1BST1BFUlRZKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExvZ2dpbmdMZXZlbCAqKioqKioqKioqCi0JCi0JcHVibGljIExvZ2dpbmdMZXZlbCBnZXRMZXZlbCgpIHsKLQkJcmV0dXJuIHRoaXMubGV2ZWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExldmVsKExvZ2dpbmdMZXZlbCBuZXdMZXZlbCkgewotCQlMb2dnaW5nTGV2ZWwgb2xkID0gdGhpcy5sZXZlbDsKLQkJdGhpcy5sZXZlbCA9IG5ld0xldmVsOwotCQl0aGlzLnB1dFByb3BlcnR5KExFVkVMX1BST1BFUlRZLCBuZXdMZXZlbCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMRVZFTF9QUk9QRVJUWSwgb2xkLCBuZXdMZXZlbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxldmVsQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJTG9nZ2luZ0xldmVsIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIExvZ2dpbmdMZXZlbC52YWx1ZXMoKSk7Ci0JCUxvZ2dpbmdMZXZlbCBvbGQgPSB0aGlzLmxldmVsOwotCQl0aGlzLmxldmVsID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMRVZFTF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBMb2dnaW5nTGV2ZWwgZ2V0RGVmYXVsdExldmVsKCkgewotCQlyZXR1cm4gREVGQVVMVF9MRVZFTDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFRpbWVzdGFtcCAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0VGltZXN0YW1wKCkgewotCQlyZXR1cm4gdGhpcy50aW1lc3RhbXA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKEJvb2xlYW4gbmV3VGltZXN0YW1wKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy50aW1lc3RhbXA7Ci0JCXRoaXMudGltZXN0YW1wID0gbmV3VGltZXN0YW1wOwotCQl0aGlzLnB1dFByb3BlcnR5KFRJTUVTVEFNUF9QUk9QRVJUWSwgbmV3VGltZXN0YW1wKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRJTUVTVEFNUF9QUk9QRVJUWSwgb2xkLCBuZXdUaW1lc3RhbXApOwotCX0KLQotCXByaXZhdGUgdm9pZCB0aW1lc3RhbXBDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnRpbWVzdGFtcDsKLQkJdGhpcy50aW1lc3RhbXAgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRJTUVTVEFNUF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFRpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVElNRVNUQU1QOwotCX0KLQotCS8vICoqKioqKioqKiogVGhyZWFkICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRUaHJlYWQoKSB7Ci0JCXJldHVybiB0aGlzLnRocmVhZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUaHJlYWQoQm9vbGVhbiBuZXdUaHJlYWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnRocmVhZDsKLQkJdGhpcy50aHJlYWQgPSBuZXdUaHJlYWQ7Ci0JCXRoaXMucHV0UHJvcGVydHkoVEhSRUFEX1BST1BFUlRZLCBuZXdUaHJlYWQpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEhSRUFEX1BST1BFUlRZLCBvbGQsIG5ld1RocmVhZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRocmVhZENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMudGhyZWFkOwotCQl0aGlzLnRocmVhZCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEhSRUFEX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VGhyZWFkKCkgewotCQlyZXR1cm4gREVGQVVMVF9USFJFQUQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRTZXNzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5zZXNzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oQm9vbGVhbiBuZXdTZXNzaW9uKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zZXNzaW9uOwotCQl0aGlzLnNlc3Npb24gPSBuZXdTZXNzaW9uOwotCQl0aGlzLnB1dFByb3BlcnR5KFNFU1NJT05fUFJPUEVSVFksIG5ld1Nlc3Npb24pOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTl9QUk9QRVJUWSwgb2xkLCBuZXdTZXNzaW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2Vzc2lvbkNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMuc2Vzc2lvbjsKLQkJdGhpcy5zZXNzaW9uID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0U2Vzc2lvbigpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0VTU0lPTjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV4Y2VwdGlvbnMgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldEV4Y2VwdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmV4Y2VwdGlvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhjZXB0aW9ucyhCb29sZWFuIG5ld0V4Y2VwdGlvbnMpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmV4Y2VwdGlvbnM7Ci0JCXRoaXMuZXhjZXB0aW9ucyA9IG5ld0V4Y2VwdGlvbnM7Ci0JCXRoaXMucHV0UHJvcGVydHkoRVhDRVBUSU9OU19QUk9QRVJUWSwgbmV3RXhjZXB0aW9ucyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWENFUFRJT05TX1BST1BFUlRZLCBvbGQsIG5ld0V4Y2VwdGlvbnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGNlcHRpb25zQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5leGNlcHRpb25zOwotCQl0aGlzLmV4Y2VwdGlvbnMgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYQ0VQVElPTlNfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gREVGQVVMVF9FWENFUFRJT05TOwotCX0KLQotCS8vICoqKioqKioqKiogbG9nRmlsZUxvY2F0aW9uICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldExvZ0ZpbGVMb2NhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMubG9nRmlsZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvZ0ZpbGVMb2NhdGlvbihTdHJpbmcgbmV3TG9nRmlsZUxvY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmxvZ0ZpbGVMb2NhdGlvbjsKLQkJdGhpcy5sb2dGaWxlTG9jYXRpb24gPSAoU3RyaW5nVG9vbHMuc3RyaW5nSXNOb3RFbXB0eShuZXdMb2dGaWxlTG9jYXRpb24pKSA/IAotCQkJCQkJCQkJCW5ld0xvZ0ZpbGVMb2NhdGlvbiA6IAotCQkJCQkJCQkJCXRoaXMuZ2V0RGVmYXVsdExvZ0ZpbGVMb2NhdGlvbigpOwotCQl0aGlzLnB1dFByb3BlcnR5KExPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZLCB0aGlzLmxvZ0ZpbGVMb2NhdGlvbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSwgb2xkLCB0aGlzLmxvZ0ZpbGVMb2NhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZ0ZpbGVMb2NhdGlvbkNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmxvZ0ZpbGVMb2NhdGlvbjsKLQkJdGhpcy5sb2dGaWxlTG9jYXRpb24gPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRMb2dGaWxlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBERUZBVUxUX0xPR19GSUxFX0xPQ0FUSU9OOwotCX0KLQotCS8vICoqKioqKioqKiogTG9nZ2VyICoqKioqKioqKioKLQkvKioKLQkgKiBSZXR1cm5zIExvZ2dlciBvciBjdXN0b20gbG9nZ2VyIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gRWNsaXBzZUxpbmsgc3RyaW5nIHZhbHVlIGZvciBMb2dnZXIgZW51bSBvciBjdXN0b20gbG9nZ2VyIGNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dnZXIoKSB7Ci0JCXJldHVybiB0aGlzLmxvZ2dlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIEVjbGlwc2VMaW5rIGxvZ2dlci4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TG9nZ2VyIC0gTG9nZ2VyCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9nZ2VyKExvZ2dlciBuZXdMb2dnZXIpIHsKLQkJaWYoIG5ld0xvZ2dlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldExvZ2dlcl8oKFN0cmluZykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5zZXRMb2dnZXJfKGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihuZXdMb2dnZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIEVjbGlwc2VMaW5rIGxvZ2dlciBvciBjdXN0b20gbG9nZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBuZXdMb2dnZXIgLQotCSAqICAgICAgICAgICAgQ2FuIGJlIGEgRWNsaXBzZUxpbmsgbG9nZ2VyIGxpdGVyYWwgb3IKLQkgKiAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjdXN0b20gbG9nZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvZ2dlcihTdHJpbmcgbmV3TG9nZ2VyKSB7Ci0JCWlmKCBuZXdMb2dnZXIgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRMb2dnZXJfKG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUxvZ2dlciBsID0gTG9nZ2VyLmdldExvZ2dlckZvcihuZXdMb2dnZXIpOwotCQlpZihsID09IG51bGwpIHsJLy8gY3VzdG9tIExvZ2dlciBjbGFzcwotCQkJdGhpcy5zZXRMb2dnZXJfKG5ld0xvZ2dlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNldExvZ2dlcihsKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0TG9nZ2VyXyhTdHJpbmcgbmV3TG9nZ2VyKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmxvZ2dlcjsKLQkJdGhpcy5sb2dnZXIgPSBuZXdMb2dnZXI7Ci0JCXRoaXMucHV0UHJvcGVydHkoTE9HR0VSX1BST1BFUlRZLCBuZXdMb2dnZXIpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTE9HR0VSX1BST1BFUlRZLCBvbGQsIG5ld0xvZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZ2dlckNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmxvZ2dlcjsKLQkJdGhpcy5sb2dnZXIgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExPR0dFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TG9nZ2VyKCkgewotCQlyZXR1cm4gREVGQVVMVF9MT0dHRVI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVMb2dnZXJSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUxvZ2dlclJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCS8vVE9ETyBzZWVtcyBsaWtlIHdlIHNob3VsZCBoYXZlIHRoZSBQcm9wZXJ0eSBzdG9yZWQgaW4gYSBTZXNzaW9uQ3VzdG9taXplciBvYmplY3QgaW5zdGVhZCBvZiBoYXZpbmcgdG8gZ28gCi0JCS8vZmluZCBhbGwgb2YgdGhlIFByb3BlcnRpZXMgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoRUNMSVBTRUxJTktfTE9HR0VSKTsKLQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCXJldHVybiBwcm9wZXJ0eS5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVMb2dnZXJNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVMb2dnZXJNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KEVDTElQU0VMSU5LX0xPR0dFUik7Ci0JCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcGVydHkuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUxvZ2dlclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTG9nZ2VyUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQkvL2ZpbmQgYWxsIG9mIHRoZSBQcm9wZXJ0aWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KEVDTElQU0VMSU5LX0xPR0dFUik7Ci0JCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcGVydHkuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvRWNsaXBzZUxpbmtPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYzllNDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5UYXJnZXREYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuVGFyZ2V0U2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rT3B0aW9ucwotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcHRpb25zIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi0JaW1wbGVtZW50cyBPcHRpb25zCi17Ci0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKLQlwcml2YXRlIFN0cmluZyBzZXNzaW9uTmFtZTsKLQlwcml2YXRlIFN0cmluZyBzZXNzaW9uc1htbDsKLQlwcml2YXRlIEJvb2xlYW4gaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzOwotCXByaXZhdGUgU3RyaW5nIHRhcmdldERhdGFiYXNlOyAvLyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUgc2luY2UgdmFsdWUgY2FuIGJlIFRhcmdldERhdGFiYXNlIG9yIGN1c3RvbSBjbGFzcwotCXByaXZhdGUgU3RyaW5nIHRhcmdldFNlcnZlcjsgLy8gc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlIHNpbmNlIHZhbHVlIGNhbiBiZSBUYXJnZXRTZXJ2ZXIgb3IgY3VzdG9tIGNsYXNzCi0JcHJpdmF0ZSBTdHJpbmcgZXZlbnRMaXN0ZW5lcjsKLQlwcml2YXRlIEJvb2xlYW4gdGVtcG9yYWxNdXRhYmxlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rT3B0aW9ucyhQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQkvLyBUT1JFVklFVyAtIGhhbmRsZSBpbmNvcnJlY3QgU3RyaW5nIGluIHBlcnNpc3RlbmNlLnhtbAotCQl0aGlzLnNlc3Npb25OYW1lID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1NFU1NJT05fTkFNRSk7Ci0JCXRoaXMuc2Vzc2lvbnNYbWwgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfU0VTU0lPTlNfWE1MKTsKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMpOwotCQl0aGlzLnRhcmdldERhdGFiYXNlID0gdGhpcy5nZXRUYXJnZXREYXRhYmFzZUZyb21QZXJzaXN0ZW5jZVhtbCgpOwotCQl0aGlzLnRhcmdldFNlcnZlciA9IHRoaXMuZ2V0VGFyZ2V0U2VydmVyRnJvbVBlcnNpc3RlbmNlWG1sKCk7Ci0JCXRoaXMuZXZlbnRMaXN0ZW5lciA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSKTsKLQkJdGhpcy50ZW1wb3JhbE11dGFibGUgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1RFTVBPUkFMX01VVEFCTEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldERhdGFiYXNlRnJvbVBlcnNpc3RlbmNlWG1sKCkgewotCi0JCVN0cmluZyB2YWx1ZSA9IHRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfVEFSR0VUX0RBVEFCQVNFKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVRhcmdldERhdGFiYXNlIHN0YW5kYXJkVGFyZ2V0RGF0YWJhc2UgPSB0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19UQVJHRVRfREFUQUJBU0UsIFRhcmdldERhdGFiYXNlLnZhbHVlcygpKTsKLQkJcmV0dXJuIChzdGFuZGFyZFRhcmdldERhdGFiYXNlID09IG51bGwpID8gdmFsdWUgOiBnZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2Yoc3RhbmRhcmRUYXJnZXREYXRhYmFzZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0U2VydmVyRnJvbVBlcnNpc3RlbmNlWG1sKCkgewotCi0JCVN0cmluZyB2YWx1ZSA9IHRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfVEFSR0VUX1NFUlZFUik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlUYXJnZXRTZXJ2ZXIgc3RhbmRhcmRUYXJnZXRTZXJ2ZXIgPSB0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19UQVJHRVRfU0VSVkVSLCBUYXJnZXRTZXJ2ZXIudmFsdWVzKCkpOwotCQlyZXR1cm4gKHN0YW5kYXJkVGFyZ2V0U2VydmVyID09IG51bGwpID8gdmFsdWUgOiBnZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2Yoc3RhbmRhcmRUYXJnZXRTZXJ2ZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OX05BTUUpKSB7Ci0JCQl0aGlzLnNlc3Npb25OYW1lQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OU19YTUwpKSB7Ci0JCQl0aGlzLnNlc3Npb25zWG1sQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19UQVJHRVRfREFUQUJBU0UpKSB7Ci0JCQl0aGlzLnRhcmdldERhdGFiYXNlQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19UQVJHRVRfU0VSVkVSKSkgewotCQkJdGhpcy50YXJnZXRTZXJ2ZXJDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMpKSB7Ci0JCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTl9FVkVOVF9MSVNURU5FUikpIHsKLQkJCXRoaXMuZXZlbnRMaXN0ZW5lckNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVEVNUE9SQUxfTVVUQUJMRSkpIHsKLQkJCXRoaXMudGVtcG9yYWxNdXRhYmxlQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0JCi0JfQotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFU1NJT05fTkFNRSkpIHsKLQkJCXRoaXMuc2Vzc2lvbk5hbWVDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTlNfWE1MKSkgewotCQkJdGhpcy5zZXNzaW9uc1htbENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19UQVJHRVRfREFUQUJBU0UpKSB7Ci0JCQl0aGlzLnRhcmdldERhdGFiYXNlQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RBUkdFVF9TRVJWRVIpKSB7Ci0JCQl0aGlzLnRhcmdldFNlcnZlckNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTKSkgewotCQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTl9FVkVOVF9MSVNURU5FUikpIHsKLQkJCXRoaXMuZXZlbnRMaXN0ZW5lckNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19URU1QT1JBTF9NVVRBQkxFKSkgewotCQkJdGhpcy50ZW1wb3JhbE11dGFibGVDaGFuZ2VkKG51bGwpOwotCQl9CQotCX0KLQotCS8qKgotCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCi0JICogCQlrZXkgPSBFY2xpcHNlTGluayBwcm9wZXJ0eSBrZXkKLQkgKiAJCXZhbHVlID0gcHJvcGVydHkgaWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFU1NJT05fTkFNRSwKLQkJCVNFU1NJT05fTkFNRV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfU0VTU0lPTlNfWE1MLAotCQkJU0VTU0lPTlNfWE1MX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTLAotCQkJU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVEFSR0VUX0RBVEFCQVNFLAotCQkJVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19UQVJHRVRfU0VSVkVSLAotCQkJVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfU0VTU0lPTl9FVkVOVF9MSVNURU5FUiwKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1RFTVBPUkFMX01VVEFCTEUsCi0JCQlURU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU2Vzc2lvbk5hbWUgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0U2Vzc2lvbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNlc3Npb25OYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlc3Npb25OYW1lKFN0cmluZyBuZXdTZXNzaW9uTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zZXNzaW9uTmFtZTsKLQkJdGhpcy5zZXNzaW9uTmFtZSA9IG5ld1Nlc3Npb25OYW1lOwotCQl0aGlzLnB1dFByb3BlcnR5KFNFU1NJT05fTkFNRV9QUk9QRVJUWSwgbmV3U2Vzc2lvbk5hbWUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld1Nlc3Npb25OYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2Vzc2lvbk5hbWVDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zZXNzaW9uTmFtZTsKLQkJdGhpcy5zZXNzaW9uTmFtZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTZXNzaW9uTmFtZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0VTU0lPTl9OQU1FOwotCX0KLQotCS8vICoqKioqKioqKiogU2Vzc2lvbnNYbWwgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0U2Vzc2lvbnNYbWwoKSB7Ci0JCXJldHVybiB0aGlzLnNlc3Npb25zWG1sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlc3Npb25zWG1sKFN0cmluZyBuZXdTZXNzaW9uc1htbCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zZXNzaW9uc1htbDsKLQkJdGhpcy5zZXNzaW9uc1htbCA9IG5ld1Nlc3Npb25zWG1sOwotCQl0aGlzLnB1dFByb3BlcnR5KFNFU1NJT05TX1hNTF9QUk9QRVJUWSwgbmV3U2Vzc2lvbnNYbWwpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTlNfWE1MX1BST1BFUlRZLCBvbGQsIG5ld1Nlc3Npb25zWG1sKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2Vzc2lvbnNYbWxDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zZXNzaW9uc1htbDsKLQkJdGhpcy5zZXNzaW9uc1htbCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTlNfWE1MX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTZXNzaW9uc1htbCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0VTU0lPTlNfWE1MOwotCX0KLQotCS8vICoqKioqKioqKiogSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKSB7Ci0JCXJldHVybiB0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoQm9vbGVhbiBuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllczsKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgPSBuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXM7Ci0JCXRoaXMucHV0UHJvcGVydHkoU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSwgbmV3SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFksIG9sZCwgbmV3SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXM7Ci0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCkgewotCQlyZXR1cm4gREVGQVVMVF9TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTOwotCX0KLQotCS8vICoqKioqKioqKiogVGFyZ2V0RGF0YWJhc2UgKioqKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgVGFyZ2V0RGF0YWJhc2Ugb3IgY3VzdG9tIHRhcmdldERhdGFiYXNlIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gRWNsaXBzZUxpbmsgc3RyaW5nIHZhbHVlIGZvciBUYXJnZXREYXRhYmFzZSBlbnVtIG9yIGN1c3RvbSB0YXJnZXREYXRhYmFzZSBjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldERhdGFiYXNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgRWNsaXBzZUxpbmsgdGFyZ2V0RGF0YWJhc2UuCi0JICogCi0JICogQHBhcmFtIG5ld1RhcmdldERhdGFiYXNlIC0gVGFyZ2V0RGF0YWJhc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXREYXRhYmFzZShUYXJnZXREYXRhYmFzZSBuZXdUYXJnZXREYXRhYmFzZSkgewotCQlpZiggbmV3VGFyZ2V0RGF0YWJhc2UgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRUYXJnZXREYXRhYmFzZV8oKFN0cmluZykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5zZXRUYXJnZXREYXRhYmFzZV8oZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKG5ld1RhcmdldERhdGFiYXNlKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBFY2xpcHNlTGluayB0YXJnZXREYXRhYmFzZSBvciBjdXN0b20gdGFyZ2V0RGF0YWJhc2UuCi0JICogCi0JICogQHBhcmFtIG5ld1RhcmdldERhdGFiYXNlIC0KLQkgKiAgICAgICAgICAgIENhbiBiZSBhIEVjbGlwc2VMaW5rIFRhcmdldERhdGFiYXNlIGxpdGVyYWwgb3IKLQkgKiAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjdXN0b20gdGFyZ2V0RGF0YWJhc2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RGF0YWJhc2UoU3RyaW5nIG5ld1RhcmdldERhdGFiYXNlKSB7Ci0JCWlmKCBuZXdUYXJnZXREYXRhYmFzZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldFRhcmdldERhdGFiYXNlXygoU3RyaW5nKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlUYXJnZXREYXRhYmFzZSBjdXN0b21UYXJnZXREYXRhYmFzZSA9IFRhcmdldERhdGFiYXNlLmdldFRhcmdldERhdGFiYXNlRm9yKG5ld1RhcmdldERhdGFiYXNlKTsKLQkJaWYoY3VzdG9tVGFyZ2V0RGF0YWJhc2UgPT0gbnVsbCkgewkvLyBjdXN0b20gVGFyZ2V0RGF0YWJhc2UgY2xhc3MKLQkJCXRoaXMuc2V0VGFyZ2V0RGF0YWJhc2VfKG5ld1RhcmdldERhdGFiYXNlKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc2V0VGFyZ2V0RGF0YWJhc2UoY3VzdG9tVGFyZ2V0RGF0YWJhc2UpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRUYXJnZXREYXRhYmFzZV8oU3RyaW5nIG5ld1RhcmdldERhdGFiYXNlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnRhcmdldERhdGFiYXNlOwotCQl0aGlzLnRhcmdldERhdGFiYXNlID0gbmV3VGFyZ2V0RGF0YWJhc2U7Ci0JCXRoaXMucHV0UHJvcGVydHkoVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZLCBuZXdUYXJnZXREYXRhYmFzZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUQVJHRVRfREFUQUJBU0VfUFJPUEVSVFksIG9sZCwgbmV3VGFyZ2V0RGF0YWJhc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0YXJnZXREYXRhYmFzZUNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnRhcmdldERhdGFiYXNlOwotCQl0aGlzLnRhcmdldERhdGFiYXNlID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUQVJHRVRfREFUQUJBU0VfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYXJnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVEFSR0VUX0RBVEFCQVNFOwotCX0KLQotCS8vICoqKioqKioqKiogVGFyZ2V0U2VydmVyICoqKioqKioqKioKLQkvKioKLQkgKiBSZXR1cm5zIFRhcmdldFNlcnZlciBvciBjdXN0b20gdGFyZ2V0U2VydmVyIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gRWNsaXBzZUxpbmsgc3RyaW5nIHZhbHVlIGZvciBUYXJnZXRTZXJ2ZXIgZW51bSBvciBjdXN0b20gdGFyZ2V0U2VydmVyIGNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRTZXJ2ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldFNlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIEVjbGlwc2VMaW5rIHRhcmdldFNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGFyZ2V0U2VydmVyIC0gVGFyZ2V0U2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0U2VydmVyKFRhcmdldFNlcnZlciBuZXdUYXJnZXRTZXJ2ZXIpIHsKLQkJaWYoIG5ld1RhcmdldFNlcnZlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldFRhcmdldFNlcnZlcl8oKFN0cmluZykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5zZXRUYXJnZXRTZXJ2ZXJfKGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihuZXdUYXJnZXRTZXJ2ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIEVjbGlwc2VMaW5rIHRhcmdldFNlcnZlciBvciBjdXN0b20gdGFyZ2V0U2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBuZXdUYXJnZXRTZXJ2ZXIgLQotCSAqICAgICAgICAgICAgQ2FuIGJlIGEgRWNsaXBzZUxpbmsgVGFyZ2V0U2VydmVyIGxpdGVyYWwgb3IKLQkgKiAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjdXN0b20gdGFyZ2V0U2VydmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldFNlcnZlcihTdHJpbmcgbmV3VGFyZ2V0U2VydmVyKSB7Ci0JCWlmKCBuZXdUYXJnZXRTZXJ2ZXIgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRUYXJnZXRTZXJ2ZXJfKChTdHJpbmcpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVRhcmdldFNlcnZlciBjdXN0b21UYXJnZXRTZXJ2ZXIgPSBUYXJnZXRTZXJ2ZXIuZ2V0VGFyZ2V0U2VydmVyRm9yKG5ld1RhcmdldFNlcnZlcik7Ci0JCWlmKGN1c3RvbVRhcmdldFNlcnZlciA9PSBudWxsKSB7CS8vIGN1c3RvbSBUYXJnZXRTZXJ2ZXIgY2xhc3MKLQkJCXRoaXMuc2V0VGFyZ2V0U2VydmVyXyhuZXdUYXJnZXRTZXJ2ZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zZXRUYXJnZXRTZXJ2ZXIoY3VzdG9tVGFyZ2V0U2VydmVyKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VGFyZ2V0U2VydmVyXyhTdHJpbmcgbmV3VGFyZ2V0U2VydmVyKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnRhcmdldFNlcnZlcjsKLQkJdGhpcy50YXJnZXRTZXJ2ZXIgPSBuZXdUYXJnZXRTZXJ2ZXI7Ci0JCXRoaXMucHV0UHJvcGVydHkoVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSwgbmV3VGFyZ2V0U2VydmVyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBUkdFVF9TRVJWRVJfUFJPUEVSVFksIG9sZCwgbmV3VGFyZ2V0U2VydmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGFyZ2V0U2VydmVyQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudGFyZ2V0U2VydmVyOwotCQl0aGlzLnRhcmdldFNlcnZlciA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldFNlcnZlcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfVEFSR0VUX1NFUlZFUjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV2ZW50TGlzdGVuZXIgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0RXZlbnRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuZXZlbnRMaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFdmVudExpc3RlbmVyKFN0cmluZyBuZXdFdmVudExpc3RlbmVyKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmV2ZW50TGlzdGVuZXI7Ci0JCXRoaXMuZXZlbnRMaXN0ZW5lciA9IG5ld0V2ZW50TGlzdGVuZXI7Ci0JCXRoaXMucHV0UHJvcGVydHkoU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSwgbmV3RXZlbnRMaXN0ZW5lcik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1BST1BFUlRZLCBvbGQsIG5ld0V2ZW50TGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBldmVudExpc3RlbmVyQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZXZlbnRMaXN0ZW5lcjsKLQkJdGhpcy5ldmVudExpc3RlbmVyID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRFdmVudExpc3RlbmVyKCkgewotCQlyZXR1cm4gREVGQVVMVF9TRVNTSU9OX0VWRU5UX0xJU1RFTkVSOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFRlbXBvcmFsTXV0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgQm9vbGVhbiBnZXRUZW1wb3JhbE11dGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnRlbXBvcmFsTXV0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbiBuZXdUZW1wb3JhbE11dGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnRlbXBvcmFsTXV0YWJsZTsKLQkJdGhpcy50ZW1wb3JhbE11dGFibGUgPSBuZXdUZW1wb3JhbE11dGFibGU7Ci0JCXRoaXMucHV0UHJvcGVydHkoVEVNUE9SQUxfTVVUQUJMRV9QUk9QRVJUWSwgbmV3VGVtcG9yYWxNdXRhYmxlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRFTVBPUkFMX01VVEFCTEVfUFJPUEVSVFksIG9sZCwgbmV3VGVtcG9yYWxNdXRhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVtcG9yYWxNdXRhYmxlQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy50ZW1wb3JhbE11dGFibGU7Ci0JCXRoaXMudGVtcG9yYWxNdXRhYmxlID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChURU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFRlbXBvcmFsTXV0YWJsZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVEVNUE9SQUxfTVVUQUJMRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUV2ZW50TGlzdGVuZXJSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUV2ZW50TGlzdGVuZXJSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShFQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSKTsKLQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCXJldHVybiBwcm9wZXJ0eS5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVFdmVudExpc3RlbmVyTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlRXZlbnRMaXN0ZW5lck1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoRUNMSVBTRUxJTktfU0VTU0lPTl9FVkVOVF9MSVNURU5FUik7Ci0JCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcGVydHkuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUV2ZW50TGlzdGVuZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUV2ZW50TGlzdGVuZXJSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KEVDTElQU0VMSU5LX1NFU1NJT05fRVZFTlRfTElTVEVORVIpOwotCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHByb3BlcnR5LmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOTJkMDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5EZGxHZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLk91dHB1dE1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbiBlbmNhcHN1bGF0ZXMgRWNsaXBzZUxpbmsgU2NoZW1hR2VuZXJhdGlvbgotICogcHJvcGVydGllcy4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbgotCWV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGltcGxlbWVudHMgU2NoZW1hR2VuZXJhdGlvbgotewotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBPdXRwdXRNb2RlIG91dHB1dE1vZGU7Ci0JcHJpdmF0ZSBEZGxHZW5lcmF0aW9uVHlwZSBkZGxHZW5lcmF0aW9uVHlwZTsKLQlwcml2YXRlIFN0cmluZyBjcmVhdGVGaWxlTmFtZTsKLQlwcml2YXRlIFN0cmluZyBkcm9wRmlsZU5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgYXBwbGljYXRpb25Mb2NhdGlvbjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCXRoaXMub3V0cHV0TW9kZSA9IAotCQkJdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUsIE91dHB1dE1vZGUudmFsdWVzKCkpOwotCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlID0gCi0JCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFLCBEZGxHZW5lcmF0aW9uVHlwZS52YWx1ZXMoKSk7Ci0JCXRoaXMuY3JlYXRlRmlsZU5hbWUgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSk7Ci0JCXRoaXMuZHJvcEZpbGVOYW1lID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FKTsKLQkJdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0FQUExJQ0FUSU9OX0xPQ0FUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IGtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5Ci0JICoga2V5OyB2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSwKLQkJCU9VVFBVVF9NT0RFX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFLAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSwKLQkJCUNSRUFURV9GSUxFX05BTUVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FLAotCQkJRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0FQUExJQ0FUSU9OX0xPQ0FUSU9OLAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFkpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSkpIHsKLQkJCXRoaXMub3V0cHV0TW9kZUNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSkpIHsKLQkJCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NSRUFURV9GSUxFX05BTUUpKSB7Ci0JCQl0aGlzLmNyZWF0ZUZpbGVOYW1lQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19EUk9QX0ZJTEVfTkFNRSkpIHsKLQkJCXRoaXMuZHJvcEZpbGVOYW1lQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19BUFBMSUNBVElPTl9MT0NBVElPTikpIHsKLQkJCXRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbkNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFKSkgewotCQkJdGhpcy5vdXRwdXRNb2RlQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEUpKSB7Ci0JCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NSRUFURV9GSUxFX05BTUUpKSB7Ci0JCQl0aGlzLmNyZWF0ZUZpbGVOYW1lQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FKSkgewotCQkJdGhpcy5kcm9wRmlsZU5hbWVDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQVBQTElDQVRJT05fTE9DQVRJT04pKSB7Ci0JCQl0aGlzLmFwcGxpY2F0aW9uTG9jYXRpb25DaGFuZ2VkKG51bGwpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBEZGxHZW5lcmF0aW9uVHlwZSAqKioqKioqKioqCi0JcHVibGljIERkbEdlbmVyYXRpb25UeXBlIGdldERkbEdlbmVyYXRpb25UeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kZGxHZW5lcmF0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZGxHZW5lcmF0aW9uVHlwZShEZGxHZW5lcmF0aW9uVHlwZSBuZXdEZGxHZW5UeXBlKSB7Ci0JCURkbEdlbmVyYXRpb25UeXBlIG9sZCA9IHRoaXMuZGRsR2VuZXJhdGlvblR5cGU7Ci0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGUgPSBuZXdEZGxHZW5UeXBlOwotCQl0aGlzLnB1dFByb3BlcnR5KERETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFksIG5ld0RkbEdlblR5cGUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSwgb2xkLCBuZXdEZGxHZW5UeXBlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGRsR2VuZXJhdGlvblR5cGVDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlEZGxHZW5lcmF0aW9uVHlwZSBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBEZGxHZW5lcmF0aW9uVHlwZS52YWx1ZXMoKSk7Ci0JCURkbEdlbmVyYXRpb25UeXBlIG9sZCA9IHRoaXMuZGRsR2VuZXJhdGlvblR5cGU7Ci0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBEZGxHZW5lcmF0aW9uVHlwZSBnZXREZWZhdWx0RGRsR2VuZXJhdGlvblR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RETF9HRU5FUkFUSU9OX1RZUEU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBPdXRwdXRNb2RlICoqKioqKioqKioKLQlwdWJsaWMgT3V0cHV0TW9kZSBnZXRPdXRwdXRNb2RlKCkgewotCQlyZXR1cm4gdGhpcy5vdXRwdXRNb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE91dHB1dE1vZGUoT3V0cHV0TW9kZSBuZXdPdXRwdXRNb2RlKSB7Ci0JCU91dHB1dE1vZGUgb2xkID0gdGhpcy5vdXRwdXRNb2RlOwotCQl0aGlzLm91dHB1dE1vZGUgPSBuZXdPdXRwdXRNb2RlOwotCQl0aGlzLnB1dFByb3BlcnR5KE9VVFBVVF9NT0RFX1BST1BFUlRZLCBuZXdPdXRwdXRNb2RlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9VVFBVVF9NT0RFX1BST1BFUlRZLCBvbGQsIG5ld091dHB1dE1vZGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvdXRwdXRNb2RlQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJT3V0cHV0TW9kZSBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBPdXRwdXRNb2RlLnZhbHVlcygpKTsKLQkJT3V0cHV0TW9kZSBvbGQgPSB0aGlzLm91dHB1dE1vZGU7Ci0JCXRoaXMub3V0cHV0TW9kZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1VUUFVUX01PREVfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBPdXRwdXRNb2RlIGdldERlZmF1bHRPdXRwdXRNb2RlKCkgewotCQlyZXR1cm4gREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9PVVRQVVRfTU9ERTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENyZWF0ZUZpbGVOYW1lICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUZpbGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVGaWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGVGaWxlTmFtZShTdHJpbmcgbmV3Q3JlYXRlRmlsZU5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY3JlYXRlRmlsZU5hbWU7Ci0JCXRoaXMuY3JlYXRlRmlsZU5hbWUgPSBuZXdDcmVhdGVGaWxlTmFtZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShDUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZLCBuZXdDcmVhdGVGaWxlTmFtZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld0NyZWF0ZUZpbGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRmlsZU5hbWVDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5jcmVhdGVGaWxlTmFtZTsKLQkJdGhpcy5jcmVhdGVGaWxlTmFtZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ1JFQVRFX0ZJTEVfTkFNRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q3JlYXRlRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0NSRUFURV9GSUxFX05BTUU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBkcm9wRmlsZU5hbWUgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0RHJvcEZpbGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kcm9wRmlsZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RHJvcEZpbGVOYW1lKFN0cmluZyBuZXdEcm9wRmlsZU5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZHJvcEZpbGVOYW1lOwotCQl0aGlzLmRyb3BGaWxlTmFtZSA9IG5ld0Ryb3BGaWxlTmFtZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShEUk9QX0ZJTEVfTkFNRV9QUk9QRVJUWSwgbmV3RHJvcEZpbGVOYW1lKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERST1BfRklMRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld0Ryb3BGaWxlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BGaWxlTmFtZUNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRyb3BGaWxlTmFtZTsKLQkJdGhpcy5kcm9wRmlsZU5hbWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERST1BfRklMRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHREcm9wRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RST1BfRklMRV9OQU1FOwotCX0KLQotCS8vICoqKioqKioqKiogYXBwbGljYXRpb25Mb2NhdGlvbiAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRBcHBsaWNhdGlvbkxvY2F0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uTG9jYXRpb24oU3RyaW5nIG5ld0FwcGxpY2F0aW9uTG9jYXRpb24pIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbjsKLQkJdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uID0gKFN0cmluZ1Rvb2xzLnN0cmluZ0lzTm90RW1wdHkobmV3QXBwbGljYXRpb25Mb2NhdGlvbikpID8gCi0JCQkJCQkJCQkJCQluZXdBcHBsaWNhdGlvbkxvY2F0aW9uIDogCi0JCQkJCQkJCQkJCQl0aGlzLmdldERlZmF1bHRBcHBsaWNhdGlvbkxvY2F0aW9uKCk7Ci0JCXRoaXMucHV0UHJvcGVydHkoQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFksIHRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSwgb2xkLCB0aGlzLmFwcGxpY2F0aW9uTG9jYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBsaWNhdGlvbkxvY2F0aW9uQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbjsKLQkJdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0QXBwbGljYXRpb25Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQVBQTElDQVRJT05fTE9DQVRJT047Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2RkbGdlbi9BYnN0cmFjdEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZGRsZ2VuL0Fic3RyYWN0RWNsaXBzZUxpbmtERExHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4NDAwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZGRsZ2VuL0Fic3RyYWN0RWNsaXBzZUxpbmtERExHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuZGRsZ2VuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcHRDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5nZW4uQWJzdHJhY3RKcHRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nTGV2ZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5EZGxHZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLk91dHB1dE1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5NYW5pZmVzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RKcHRHZW5lcmF0b3IKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVVOQ0hfQ09ORklHX05BTUUgPSAiRGFsaSBFY2xpcHNlTGluayBUYWJsZSBHZW5lcmF0aW9uIjsgICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRERMX0dFTl9QQUNLQUdFX05BTUUgPSAib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuIjsgICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRERMX0dFTl9DTEFTUyA9IERETF9HRU5fUEFDS0FHRV9OQU1FICsgIi5NYWluIjsJICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRERMX0dFTl9KQVIgPSBERExfR0VOX1BBQ0tBR0VfTkFNRSArICJfIjsJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9DTEFTU1BBVEggPSAiQnVuZGxlLUNsYXNzUGF0aCI7CSAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfRklMRV9OQU1FID0gImxvZ2luLnByb3BlcnRpZXMiOwkgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5TX0RJUiA9ICJwbHVnaW5zLyI7CSAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7CSAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFID0gImZhbHNlIjsJICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJOT05FIjsJICAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBwdU5hbWU7Ci0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0RWNsaXBzZUxpbmtERExHZW5lcmF0b3IoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXN1cGVyKEphdmFDb3JlLmNyZWF0ZShqcGFQcm9qZWN0LmdldFByb2plY3QoKSkpOwotCQl0aGlzLnB1TmFtZSA9IHB1TmFtZTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhdW5jaENvbmZpZ05hbWUoKSB7Ci0JCXJldHVybiBMQVVOQ0hfQ09ORklHX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYWluVHlwZSgpIHsKLQkJcmV0dXJuIEVDTElQU0VMSU5LX0RETF9HRU5fQ0xBU1M7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJlR2VuZXJhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMik7Ci0JCS8vZGlzY29ubmVjdCBzaW5jZSB0aGUgcnVudGltZSBwcm92aWRlciB3aWxsIG5lZWQgdG8gY29ubmVjdCB0byBnZW5lcmF0ZSB0aGUgdGFibGVzCi0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCQlpZiAoY3AgIT0gbnVsbCkgewotCQkJY3AuZGlzY29ubmVjdCgpOwotCQkJc20ud29ya2VkKDEpOwotCQl9Ci0JCXNtLnNldFdvcmtSZW1haW5pbmcoMSk7Ci0JCXRoaXMuc2F2ZUxvZ2luUHJvcGVydGllcygpOwotCQlzbS53b3JrZWQoMSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvc3RHZW5lcmF0ZSgpIHsKLQkJc3VwZXIucG9zdEdlbmVyYXRlKCk7Ci0JCXRoaXMucmVjb25uZWN0KCk7Ci0JCXRoaXMudmFsaWRhdGVQcm9qZWN0KCk7Ci0JfQotCi0JLy9yZWNvbm5lY3Qgc2luY2Ugd2UgZGlzY29ubmVjdGVkIGluIHByZUdlbmVyYXRlKCksCi0JLy91c2UgdGhlIHN5bmNocm9ub3VzIEpQQSBwcm9qZWN0IHVwZGF0ZXIgc28gd2UgY2FuIGVuc3VyZQotCS8vdGhlIHByb2plY3QgaXMgZnVsbHkgdXBkYXRlZCBiZWZvcmUgdmFsaWRhdGluZy4gYnVnIDI3NzIzNgotCXByb3RlY3RlZCB2b2lkIHJlY29ubmVjdCgpIHsKLQkJSnBhUHJvamVjdC5VcGRhdGVyIHVwZGF0ZXIgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0VXBkYXRlcigpOwotCQlnZXRKcGFQcm9qZWN0KCkuc2V0VXBkYXRlcihuZXcgU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlcihnZXRKcGFQcm9qZWN0KCkpKTsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCWlmIChjcCAhPSBudWxsKSB7Ci0JCQljcC5jb25uZWN0KCk7Ci0JCX0KLQkJZ2V0SnBhUHJvamVjdCgpLnNldFVwZGF0ZXIodXBkYXRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQcm9qZWN0KCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQlWYWxpZGF0ZUpvYiBqb2IgPSBuZXcgVmFsaWRhdGVKb2IocHJvamVjdCk7Ci0JCWpvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLm1vZGlmeVJ1bGUocHJvamVjdCkpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB2YWxpZGF0aW9uIGFmdGVyIHRhYmxlcyBoYXZlIGJlZW4gZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBWYWxpZGF0ZUpvYiBleHRlbmRzIEpvYiAKLQl7CQotCQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0JCQotCQkKLQkJcHVibGljIFZhbGlkYXRlSm9iKElQcm9qZWN0IHByb2plY3QpIHsKLQkJCXN1cGVyKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9KT0IpOwotCQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJfQotCQkKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl0cnkgewotCQkJCVZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLnZhbGlkYXRlKAotCQkJCQluZXcgSVByb2plY3RbXSB7dGhpcy5wcm9qZWN0fSwgdHJ1ZSwgZmFsc2UsIG1vbml0b3IpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlzdGF0dXMgPSBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJUGF0aCBidWlsZEpkYmNKYXJQYXRoKCkgewotCQlyZXR1cm4gbmV3IFBhdGgodGhpcy5nZXRKcGFQcm9qZWN0Q29ubmVjdGlvbkRyaXZlckphckxpc3QoKSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEpwYVByb2plY3RDb25uZWN0aW9uRHJpdmVySmFyTGlzdCgpIHsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCXJldHVybiAoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldERyaXZlckphckxpc3QoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIElQYXRoIGJ1aWxkQm9vdHN0cmFwSmFyUGF0aCgpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgamFySW5zdGFsbERpciA9IHRoaXMuZ2V0QnVuZGxlUGFyZW50RGlyKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5QTFVHSU5fSUQpOwotCi0JCQlMaXN0PEZpbGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKLQkJCXRoaXMuZmluZEZpbGUoRUNMSVBTRUxJTktfRERMX0dFTl9KQVIsIGphckluc3RhbGxEaXIsIHJlc3VsdCk7Ci0JCQlpZiAocmVzdWx0LmlzRW1wdHkoKSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZDogIiArIERETF9HRU5fUEFDS0FHRV9OQU1FICsgIi5qYXIgaW46ICIgKyBqYXJJbnN0YWxsRGlyKTsKLQkJCX0KLQkJCUZpbGUgZGRsR2VuSmFyRmlsZSA9IHJlc3VsdC5nZXQoMCk7Ci0JCQlTdHJpbmcgZGRsR2VuSmFyUGF0aCA9IGRkbEdlbkphckZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJcmV0dXJuIG5ldyBQYXRoKGRkbEdlbkphclBhdGgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaW5kRmlsZShTdHJpbmcgZmlsZU5hbWUsIEZpbGUgZGlyZWN0b3J5LCBMaXN0PD8gc3VwZXIgRmlsZT4gbGlzdCkgewotCQlpZihkaXJlY3RvcnkubGlzdEZpbGVzKCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIGRpcmVjdG9yeTogIiArIGRpcmVjdG9yeSk7Ci0JCX0KLQkJZm9yIChGaWxlIGZpbGUgOiBkaXJlY3RvcnkubGlzdEZpbGVzKCkpIHsKLQkJCWlmIChmaWxlLmdldE5hbWUoKS5zdGFydHNXaXRoKGZpbGVOYW1lKSkgewotCQkJCWxpc3QuYWRkKGZpbGUpOwotCQkJfQotCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCXRoaXMuZmluZEZpbGUoZmlsZU5hbWUsIGZpbGUsIGxpc3QpOwotCQkJfQotCQl9Ci0JfSAKLQkKLQlwcml2YXRlIEZpbGUgZ2V0QnVuZGxlUGFyZW50RGlyKFN0cmluZyBidW5kbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWlmIChQbGF0Zm9ybS5pbkRldmVsb3BtZW50TW9kZSgpKSB7Ci0JCQlMb2NhdGlvbiBlY2xpcHNlSG9tZUxvYyA9IFBsYXRmb3JtLmdldEluc3RhbGxMb2NhdGlvbigpOwotCQkJU3RyaW5nIGVjbGlwc2VIb21lID0gZWNsaXBzZUhvbWVMb2MuZ2V0VVJMKCkuZ2V0UGF0aCgpOwotCQkJaWYgKCAhIGVjbGlwc2VIb21lLmVuZHNXaXRoKFBMVUdJTlNfRElSKSkgewotCQkJCWVjbGlwc2VIb21lICs9IFBMVUdJTlNfRElSOwotCQkJfQotCQkJcmV0dXJuIG5ldyBGaWxlKGVjbGlwc2VIb21lKTsKLQkJfQotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGJ1bmRsZU5hbWUpOwotCQlyZXR1cm4gRmlsZUxvY2F0b3IuZ2V0QnVuZGxlRmlsZShidW5kbGUpLmdldFBhcmVudEZpbGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU2V0dGluZyBMYXVuY2ggQ29uZmlndXJhdGlvbiAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc3BlY2lmeVByb2dyYW1Bcmd1bWVudHMoKSB7Ci0JCVN0cmluZ0J1ZmZlciBwcm9ncmFtQXJndW1lbnRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0aGlzLmFwcGVuZFB1TmFtZUFyZ3VtZW50KHByb2dyYW1Bcmd1bWVudHMpOwotCQl0aGlzLmFwcGVuZFByb3BlcnRpZXNGaWxlQXJndW1lbnQocHJvZ3JhbUFyZ3VtZW50cyk7Ci0JCXRoaXMuYXBwZW5kRGVidWdBcmd1bWVudChwcm9ncmFtQXJndW1lbnRzKTsKLQkJCi0JCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9HUkFNX0FSR1VNRU5UUywgcHJvZ3JhbUFyZ3VtZW50cy50b1N0cmluZygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGJ1aWxkQ2xhc3NwYXRoKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0PFN0cmluZz4gY2xhc3NwYXRoID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCS8vIERETF9HRU4gamFyCi0JCWNsYXNzcGF0aC5hZGQoZ2V0Qm9vdHN0cmFwSmFyQ2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOwotCQkvLyBEZWZhdWx0IFByb2plY3QgY2xhc3NwYXRoCi0JCWNsYXNzcGF0aC5hZGQodGhpcy5nZXREZWZhdWx0UHJvamVjdENsYXNzcGF0aEVudHJ5KCkuZ2V0TWVtZW50bygpKTsKLQkJLy8gT3NnaSBCdW5kbGVzCi0JCWNsYXNzcGF0aC5hZGRBbGwodGhpcy5nZXRQZXJzaXN0ZW5jZU9zZ2lCdW5kbGVzTWVtZW50bygpKTsKLQkJLy8gSkRCQyBqYXIKLQkJY2xhc3NwYXRoLmFkZChnZXRKZGJjSmFyQ2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOwotCQkvLyBTeXN0ZW0gTGlicmFyeSAgCi0JCWNsYXNzcGF0aC5hZGQodGhpcy5nZXRTeXN0ZW1MaWJyYXJ5Q2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOwotCQlyZXR1cm4gY2xhc3NwYXRoOwotCX0KLQotCS8vICoqKioqKioqKiogQ2xhc3NwYXRoRW50cnkgKioqKioqKioqKgotCQotCXByaXZhdGUgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBnZXRCb290c3RyYXBKYXJDbGFzc3BhdGhFbnRyeSgpIHsKLQkJcmV0dXJuIGdldEFyY2hpdmVDbGFzc3BhdGhFbnRyeSh0aGlzLmJ1aWxkQm9vdHN0cmFwSmFyUGF0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIElSdW50aW1lQ2xhc3NwYXRoRW50cnkgZ2V0SmRiY0phckNsYXNzcGF0aEVudHJ5KCkgewotCQlyZXR1cm4gZ2V0QXJjaGl2ZUNsYXNzcGF0aEVudHJ5KHRoaXMuYnVpbGRKZGJjSmFyUGF0aCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUnVudGltZUNsYXNzcGF0aEVudHJ5IGdldEJ1bmRsZUNsYXNzcGF0aEVudHJ5KFN0cmluZyBidW5kbGVJZCkgewotCQlJUGF0aCBwZXJzaXN0Q2xhc3NwYXRoID0gdGhpcy5nZXRCdW5kbGVDbGFzc3BhdGgoYnVuZGxlSWQpOwotCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGJ1bmRsZUVudHJ5ID0gZ2V0QXJjaGl2ZUNsYXNzcGF0aEVudHJ5KHBlcnNpc3RDbGFzc3BhdGgpOwotCQkKLQkJcmV0dXJuIGJ1bmRsZUVudHJ5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRQcm9qZWN0TG9jYXRpb25Qcm9wZXJ0eShQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLCAKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfQVBQTElDQVRJT05fTE9DQVRJT04sCi0JCQl0aGlzLnByb2plY3RMb2NhdGlvbik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZERETE1vZGVQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsICAKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSwKLQkJCURkbEdlbmVyYXRpb25UeXBlLkRST1BfQU5EX0NSRUFURV9UQUJMRVMpOwotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsICAKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUsCi0JCQlPdXRwdXRNb2RlLkRBVEFCQVNFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRDb25uZWN0aW9uUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLCAgCi0JCQlDb25uZWN0aW9uLkVDTElQU0VMSU5LX0JJTkRfUEFSQU1FVEVSUywKLQkJCUZBTFNFKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29ubmVjdGlvblBvb2xpbmdQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlDb25uZWN0aW9uLkVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVELAotCQkJVFJVRSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZExvZ2dpbmdQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlMb2dnaW5nLkVDTElQU0VMSU5LX0xFVkVMLAotCQkJTG9nZ2luZ0xldmVsLkZJTkUpOwotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlMb2dnaW5nLkVDTElQU0VMSU5LX1RJTUVTVEFNUCwKLQkJCUZBTFNFKTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJTG9nZ2luZy5FQ0xJUFNFTElOS19USFJFQUQsCi0JCQlGQUxTRSk7Ci0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKLQkJCUxvZ2dpbmcuRUNMSVBTRUxJTktfU0VTU0lPTiwKLQkJCUZBTFNFKTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJTG9nZ2luZy5FQ0xJUFNFTElOS19FWENFUFRJT05TLAotCQkJVFJVRSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ3VzdG9taXphdGlvblByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKLQkJCUN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUywKLQkJCVRSVUUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwdXRQcm9wZXJ0eShQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlwcm9wZXJ0aWVzLnB1dChrZXksICh2YWx1ZSA9PSBudWxsKSA/ICIiIDogdmFsdWUpOwkgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRBbGxQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQl0aGlzLmJ1aWxkQ29ubmVjdGlvblByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JCXRoaXMuYnVpbGRDb25uZWN0aW9uUG9vbGluZ1Byb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JCXRoaXMuYnVpbGRMb2dnaW5nUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQkJdGhpcy5idWlsZEN1c3RvbWl6YXRpb25Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCQl0aGlzLmJ1aWxkRERMTW9kZVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JCXRoaXMuYnVpbGRQcm9qZWN0TG9jYXRpb25Qcm9wZXJ0eShwcm9wZXJ0aWVzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNhdmVMb2dpblByb3BlcnRpZXMoKSB7Ci0JCVN0cmluZyBwcm9wZXJ0aWVzRmlsZSAgPSB0aGlzLnByb2plY3RMb2NhdGlvbiArICIvIiArIFBST1BFUlRJRVNfRklMRV9OQU1FOyAJICAvLyROT04tTkxTLTEkCi0KLQkJUHJvcGVydGllcyBlbFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCi0JCXRoaXMuYnVpbGRBbGxQcm9wZXJ0aWVzKGVsUHJvcGVydGllcyk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQkgICAgdHJ5IHsKLQkgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHByb3BlcnRpZXNGaWxlKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSAmJiAhIGZpbGUuY3JlYXRlTmV3RmlsZSgpKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNyZWF0ZU5ld0ZpbGUoKSBmYWlsZWQ6ICIgKyBmaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCSAgICAgICAgc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JICAgICAgICBlbFByb3BlcnRpZXMuc3RvcmUoc3RyZWFtLCBudWxsKTsKLQkgICAgfQotCSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkgICAgCVN0cmluZyBtZXNzYWdlID0gIkVycm9yIHNhdmluZzogIiArIHByb3BlcnRpZXNGaWxlOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlLCBlKTsKLQkJfQotCSAgICBmaW5hbGx5IHsKLQkgICAgCXRoaXMuY2xvc2VTdHJlYW0oc3RyZWFtKTsKLQkgICAgfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xvc2VTdHJlYW0oT3V0cHV0U3RyZWFtIHN0cmVhbSkgewotICAgIAlpZiAoc3RyZWFtICE9IG51bGwpIHsKLSAgICAJCXRyeSB7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQkJfQotICAgIAl9CQkKLQl9Ci0KLQkvLyAqKioqKioqKioqIE1haW4gYXJndW1lbnRzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBhcHBlbmRQdU5hbWVBcmd1bWVudChTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKCIgLXB1IFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMucHVOYW1lKTsKLQkJc2IuYXBwZW5kKCJcIiIpOwkgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZFByb3BlcnRpZXNGaWxlQXJndW1lbnQoU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZCgiIC1wIFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMucHJvamVjdExvY2F0aW9uKS5hcHBlbmQoIi8iKS5hcHBlbmQoUFJPUEVSVElFU19GSUxFX05BTUUpLmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0KLQkvLyAqKioqKioqKioqIFF1ZXJpZXMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybSBnZXRQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmpwYVByb2plY3Q7Ci0JfQotCQotCQotCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBCdW5kbGVzICoqKioqKioqKgotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UGVyc2lzdGVuY2VPc2dpQnVuZGxlc01lbWVudG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJaWYgKGphdmF4UGVyc2lzdGVuY2VCdW5kbGVFeGlzdHMoKSkgewotCQkJcmVzdWx0LmFkZCh0aGlzLmdldEJ1bmRsZUNsYXNzcGF0aEVudHJ5KEpBVkFYX1BFUlNJU1RFTkNFX0JVTkRMRSkuZ2V0TWVtZW50bygpKTsKLQkJCXJlc3VsdC5hZGQodGhpcy5nZXRCdW5kbGVDbGFzc3BhdGhFbnRyeShPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9DT1JFX0JVTkRMRSkuZ2V0TWVtZW50bygpKTsKLQkJCXJlc3VsdC5hZGQodGhpcy5nZXRCdW5kbGVDbGFzc3BhdGhFbnRyeShPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9BU01fQlVORExFKS5nZXRNZW1lbnRvKCkpOwotCQkJcmVzdWx0LmFkZCh0aGlzLmdldEJ1bmRsZUNsYXNzcGF0aEVudHJ5KE9SR19FQ0xJUFNFX1BFUlNJU1RFTkNFX0FOVExSX0JVTkRMRSkuZ2V0TWVtZW50bygpKTsKLQkJCXJlc3VsdC5hZGQodGhpcy5nZXRCdW5kbGVDbGFzc3BhdGhFbnRyeShPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9KUEFfQlVORExFKS5nZXRNZW1lbnRvKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgSVBhdGggZ2V0QnVuZGxlQ2xhc3NwYXRoKFN0cmluZyBwbHVnaW5JRCkgewotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklEKTsKLQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihwbHVnaW5JRCArICIgY2Fubm90IGJlIHJldHJpZXZlZCBmcm9tIHRoZSBQbGF0Zm9ybSIpOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldENsYXNzUGF0aChidW5kbGUpOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0Q2xhc3NQYXRoKEJ1bmRsZSBidW5kbGUpIHsKLQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBidW5kbGUuZ2V0SGVhZGVycygpLmdldChCVU5ETEVfQ0xBU1NQQVRIKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcGF0aCA9ICIuIjsJICAvLyROT04tTkxTLTEkCi0JCX0KLQkJTWFuaWZlc3RFbGVtZW50W10gZWxlbWVudHMgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudHMgPSBNYW5pZmVzdEVsZW1lbnQucGFyc2VIZWFkZXIoQlVORExFX0NMQVNTUEFUSCwgcGF0aCk7Ci0JCX0KLQkJY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBidW5kbGUgaGVhZGVyOiAiICsgYnVuZGxlLCBlKTsKLQkJfQotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkgewotCQkJCU1hbmlmZXN0RWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRWYWx1ZSgpOwotCQkJCWlmICgiLiIuZXF1YWxzKHZhbHVlKSkgewkgIC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSAiLyI7CQkvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCVVSTCB1cmwgPSBidW5kbGUuZ2V0RW50cnkodmFsdWUpOwotCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJVVJMIHJlc29sdmVkVVJMID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotCQkJCQkJU3RyaW5nIGZpbGVzdHJpbmcgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwocmVzb2x2ZWRVUkwpLmdldEZpbGUoKTsKLQkJICAgICAgICAgICAgICAgIGlmIChmaWxlc3RyaW5nLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsJLy8kTk9OLU5MUy0xJAotCQkgICAgICAgICAgICAgICAgCWZpbGVzdHJpbmcgPSBmaWxlc3RyaW5nLnN1YnN0cmluZyhmaWxlc3RyaW5nLmluZGV4T2YoJzonKSArIDEpOwotCQkgICAgICAgICAgICAgICAgfQotCQkgICAgICAgICAgICAgICAgaWYgKGZpbGVzdHJpbmcuZW5kc1dpdGgoIiEvIikpIHsJCS8vJE5PTi1OTFMtMSQKLQkJICAgICAgICAgICAgICAgIAlmaWxlc3RyaW5nID0gZmlsZXN0cmluZy5zdWJzdHJpbmcoMCwgZmlsZXN0cmluZy5sYXN0SW5kZXhPZignIScpKTsKLQkJICAgICAgICAgICAgICAgIH0KLQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVzdHJpbmcpOwotCQkJCQkJU3RyaW5nIGZpbGVQYXRoID0gZmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQkJCQlyZXR1cm4gbmV3IFBhdGgoZmlsZVBhdGgpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3IgbG9jYXRpbmcgYnVuZGxlOiAiICsgYnVuZGxlLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGphdmF4UGVyc2lzdGVuY2VCdW5kbGVFeGlzdHMoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRCdW5kbGUoSkFWQVhfUEVSU0lTVEVOQ0VfQlVORExFKSAhPSBudWxsOwotCX0KLQotCS8vICoqKioqKioqKiogY29uc3RhbnRzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9QRVJTSVNURU5DRV9CVU5ETEUgPSAiamF2YXgucGVyc2lzdGVuY2UiOwkJCQkJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9DT1JFX0JVTkRMRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9BU01fQlVORExFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbSI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfUEVSU0lTVEVOQ0VfQU5UTFJfQlVORExFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFudGxyIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9KUEFfQlVORExFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYSI7CS8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2RkbGdlbi9FY2xpcHNlTGlua0RETEdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2RkbGdlbi9FY2xpcHNlTGlua0RETEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzYyNmIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9kZGxnZW4vRWNsaXBzZUxpbmtERExHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5kZGxnZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtETExHZW5lcmF0b3IgbGF1bmNoZXMgdGhlIEVjbGlwc2VMaW5rIERETCBnZW5lcmF0b3IgaW4gYSBzZXBhcmF0ZSBWTS4KLSAqICBGb3IgdGhpcyBpdCB3aWxsIGNyZWF0ZSBhIEphdmEgQ29uZmlndXJhdGlvbiBuYW1lZCAiRGFsaSBFY2xpcHNlTGluayBUYWJsZSBHZW5lcmF0aW9uIiAKLSAqICBpbiB0aGUgdGFyZ2V0IHdvcmtzcGFjZSAobm90ZTogdGhlIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBvdmVycmlkZGVuIGF0IGVhY2ggcnVuKS4KLSAqICBJdCB3aWxsIHRoYW4gbGF1bmNoIHRoZSBjb25maWd1cmF0aW9uIGNyZWF0ZWQgd2l0aCB0aGUgbG9naW4gaW5mb3JtYXRpb24gZnJvbSAKLSAqICB0aGUgY3VycmVudCBEYWxpIHByb2plY3QsIGFuZCBwYXNzZXMgaXQgdG8gRWNsaXBzZUxpbmsuCi0gKiAgCi0gKiAgUHJlLXJlcSBpbiBQREUgZW52aXJvbm1lbnQ6Ci0gKiAgCW9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi5qYXIgaW4gRUNMSVBTRV9IT01FL3BsdWdpbnMKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua0RETEdlbmVyYXRvcgotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZShTdHJpbmcgcHVOYW1lLCBKcGFQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocHVOYW1lID09IG51bGwgfHwgcHVOYW1lLmxlbmd0aCgpID09IDAgfHwgcHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQluZXcgRWNsaXBzZUxpbmtERExHZW5lcmF0b3IocHVOYW1lLCBwcm9qZWN0KS5nZW5lcmF0ZShtb25pdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlzdXBlcihwdU5hbWUsIGpwYVByb2plY3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ29ubmVjdGlvblByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyLmJ1aWxkQ29ubmVjdGlvblByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCi0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywgCi0JCQlDb25uZWN0aW9uLkVDTElQU0VMSU5LX0RSSVZFUiwKLQkJCShjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0RHJpdmVyQ2xhc3NOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKLQkJCUNvbm5lY3Rpb24uRUNMSVBTRUxJTktfVVJMLAotCQkJKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVUkwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19VU0VSLAotCQkJKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVc2VyTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlDb25uZWN0aW9uLkVDTElQU0VMSU5LX1BBU1NXT1JELAotCQkJKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVc2VyUGFzc3dvcmQoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvbGlidmFsL0VjbGlwc2VMaW5rRWNsaXBzZUxpbmtCdW5kbGVzTGlicmFyeVZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2xpYnZhbC9FY2xpcHNlTGlua0VjbGlwc2VMaW5rQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgwYmYyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvbGlidmFsL0VjbGlwc2VMaW5rRWNsaXBzZUxpbmtCdW5kbGVzTGlicmFyeVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwubGlidmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5saWJwcm92LkpwYU9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5saWJwcm92LkpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubGlidmFsLkFic3RyYWN0T3NnaUJ1bmRsZXNMaWJyYXJ5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucGxhdGZvcm0uRWNsaXBzZUxpbmtQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtFY2xpcHNlTGlua0J1bmRsZXNMaWJyYXJ5VmFsaWRhdG9yCi0JZXh0ZW5kcyBBYnN0cmFjdE9zZ2lCdW5kbGVzTGlicmFyeVZhbGlkYXRvciB7Ci0JCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBjb25maWcpIHsKLQkJSnBhT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGpwYUNvbmZpZyAKLQkJCQk9IChKcGFPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIGNvbmZpZzsKLQkJTWFwPFN0cmluZywgVmVyc2lvblJhbmdlW10+IGJ1bmRsZVZlcnNpb25SYW5nZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZlcnNpb25SYW5nZVtdPigpOwotCQlKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIHBsYXRmb3JtID0ganBhQ29uZmlnLmdldEpwYVBsYXRmb3JtKCk7Ci0JCWlmIChFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMV8wLmVxdWFscyhwbGF0Zm9ybSkpIHsKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29yZSIsCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMCwgMy4wKSIpfSk7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYSIsCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMCwgMy4wKSIpfSk7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbSIsCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMCwgMy4wKSIpfSk7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFudGxyIiwKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAzLjApIil9KTsKLQkJfQotCQllbHNlIGlmIChFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMV8xLmVxdWFscyhwbGF0Zm9ybSkpIHsKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29yZSIsCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMSwgMy4wKSIpfSk7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYSIsCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMSwgMy4wKSIpfSk7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbSIsCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMSwgMy4wKSIpfSk7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFudGxyIiwKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4xLCAzLjApIil9KTsKLQkJfQotCQllbHNlIGlmIChFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMV8yLmVxdWFscyhwbGF0Zm9ybSkpIHsKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29yZSIsCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMiwgMy4wKSIpfSk7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYSIsCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMiwgMy4wKSIpfSk7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbSIsCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMiwgMy4wKSIpfSk7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFudGxyIiwKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4yLCAzLjApIil9KTsKLQkJfQotCQllbHNlIGlmIChFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMl8wLmVxdWFscyhwbGF0Zm9ybSkpIHsKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29yZSIsCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMCwgMy4wKSIpfSk7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYSIsCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMCwgMy4wKSIpfSk7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbSIsCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMCwgMy4wKSIpfSk7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFudGxyIiwKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMi4wLCAzLjApIil9KTsKLQkJfQotCQllbHNlIGlmIChFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMl8xLmVxdWFscyhwbGF0Zm9ybSkpIHsKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29yZSIsCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMSwgMy4wKSIpfSk7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYSIsCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMSwgMy4wKSIpfSk7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbSIsCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMSwgMy4wKSIpfSk7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFudGxyIiwKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMi4xLCAzLjApIil9KTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdGUoanBhQ29uZmlnLCBidW5kbGVWZXJzaW9uUmFuZ2VzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvbGlidmFsL0VjbGlwc2VMaW5rVXNlckxpYnJhcnlWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9saWJ2YWwvRWNsaXBzZUxpbmtVc2VyTGlicmFyeVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA4NTk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9saWJ2YWwvRWNsaXBzZUxpbmtVc2VyTGlicmFyeVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwubGlidmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Ub29sRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDbGFzc0ZpbGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JRmllbGRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmxpYnByb3YuSnBhVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubGlicHJvdi5KcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmxpYnZhbC5MaWJyYXJ5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBMaWJyYXJ5IHZhbGlkYXRvciBmb3IgRWNsaXBzZUxpbmsgdXNlciBsaWJyYXJpZXMuCi0gKiAKLSAqIEluIG9yZGVyIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGNvcnJlY3QgZWNsaXBzZWxpbmsuamFyIGlzIHByZXNlbnQgaW4gdGhlIHVzZXIgbGlicmFyeSwgdGhlIHZlcnNpb24KLSAqIGNsYXNzIHdoaWNoIGFwcGVhcnMgaW4gc3RhbmRhcmQgRWNsaXBzZUxpbmsgbGlicmFyaWVzIHdpbGwgYmUgZXhhbWluZWQgYW5kIGNvbXBhcmVkIGFnYWluc3QgdGhlCi0gKiB1bmlvbiBvZiBjYWxjdWxhdGVkIHZlcnNpb24gcmFuZ2VzLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHNwZWNpZmllZCBpbiB0aGUgY29uZmlnLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtVc2VyTGlicmFyeVZhbGlkYXRvcgotCWltcGxlbWVudHMgTGlicmFyeVZhbGlkYXRvciB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFZFUlNJT05fQ0xBU1NfUEFUSCA9ICJvcmcvZWNsaXBzZS9wZXJzaXN0ZW5jZS9WZXJzaW9uLmNsYXNzIjsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkVSU0lPTl9GSUVMRF9OQU1FID0gInZlcnNpb24iOwotCQotCQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKEpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnKSB7Ci0JCUpwYVVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGpwYUNvbmZpZyAKLQkJCQk9IChKcGFVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgY29uZmlnOwotCQlKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIHBsYXRmb3JtID0ganBhQ29uZmlnLmdldEpwYVBsYXRmb3JtKCk7Ci0JCVNldDxWZXJzaW9uUmFuZ2U+IHZlcnNpb25SYW5nZXMgPSBuZXcgSGFzaFNldDxWZXJzaW9uUmFuZ2U+KCk7Ci0JCWlmIChFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMV8wLmVxdWFscyhwbGF0Zm9ybSkpIHsKLQkJCXZlcnNpb25SYW5nZXMuYWRkKG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAsIDMuMCkiKSk7Ci0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzFfMS5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMS4xLCAzLjApIikpOwotCQl9Ci0JCWVsc2UgaWYgKEVjbGlwc2VMaW5rUGxhdGZvcm0uVkVSU0lPTl8xXzIuZXF1YWxzKHBsYXRmb3JtKSkgewotCQkJdmVyc2lvblJhbmdlcy5hZGQobmV3IFZlcnNpb25SYW5nZSgiWzEuMiwgMy4wKSIpKTsKLQkJfQotCQllbHNlIGlmIChFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMl8wLmVxdWFscyhwbGF0Zm9ybSkpIHsKLQkJCXZlcnNpb25SYW5nZXMuYWRkKG5ldyBWZXJzaW9uUmFuZ2UoIlsyLjAsIDMuMCkiKSk7Ci0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzJfMS5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMi4xLCAzLjApIikpOwotCQl9Ci0JCXJldHVybiB2YWxpZGF0ZShqcGFDb25maWcsIHZlcnNpb25SYW5nZXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZSgKLQkJCUpwYVVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGNvbmZpZywgU2V0PFZlcnNpb25SYW5nZT4gdmVyc2lvblJhbmdlcykgewotCQkKLQkJVmVyc2lvbiB2ZXJzaW9uID0gbnVsbDsKLQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgY3BlIDogY29uZmlnLnJlc29sdmUoKSkgewotCQkJU3RyaW5nIHZlcnNpb25TdHJpbmcgPSBudWxsOwotCQkJaWYgKGNwZS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKLQkJCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzUmVhZGVyID0gCi0JCQkJCQlUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKAotCQkJCQkJCWNwZS5nZXRQYXRoKCkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCksIFZFUlNJT05fQ0xBU1NfUEFUSCwgSUNsYXNzRmlsZVJlYWRlci5GSUVMRF9JTkZPUyk7Ci0JCQkJaWYgKGNsYXNzUmVhZGVyICE9IG51bGwpIHsKLQkJCQkJZm9yIChJRmllbGRJbmZvIGZpZWxkIDogY2xhc3NSZWFkZXIuZ2V0RmllbGRJbmZvcygpKSB7Ci0JCQkJCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKGZpZWxkLmdldE5hbWUoKSwgVkVSU0lPTl9GSUVMRF9OQU1FLnRvQ2hhckFycmF5KCkpKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJdmVyc2lvblN0cmluZyA9IGZpZWxkLmdldENvbnN0YW50VmFsdWVBdHRyaWJ1dGUoKS5nZXRDb25zdGFudFZhbHVlKCkuZ2V0U3RyaW5nVmFsdWUoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIHBvdGVudGlhbGx5IGEgYml0IGNvdWxkIGdvIHdyb25nIHdpdGggdGhhdCBsYXN0IGxpbmUsIGJ1dCBpZiBhbnkKLQkJCQkJCQkJLy8gYXNzdW1wdGlvbnMgYXJlbid0IG1ldCwgdGhlcmUncyBubyB2YWx1ZQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodmVyc2lvblN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCWlmICh2ZXJzaW9uICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQlKcHRFY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3JfbXVsdGlwbGVFY2xpcHNlTGlua1ZlcnNpb25zKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZlcnNpb24gPSBuZXcgVmVyc2lvbih2ZXJzaW9uU3RyaW5nKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCQlKcHRFY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3Jfbm9FY2xpcHNlTGlua1ZlcnNpb24pOwotCQl9Ci0JCQotCQlmb3IgKFZlcnNpb25SYW5nZSB2ZXJzaW9uUmFuZ2UgOiB2ZXJzaW9uUmFuZ2VzKSB7Ci0JCQlpZiAoISB2ZXJzaW9uUmFuZ2UuaXNJbmNsdWRlZCh2ZXJzaW9uKSkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJSVN0YXR1cy5FUlJPUiwgSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0JCQkJCQlKcHRFY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3JfaW1wcm9wZXJFY2xpcHNlTGlua1ZlcnNpb24pOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNTEwZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8yLkVjbGlwc2VMaW5rMV8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLQlleHRlbmRzIE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyCi17Ci0JLyoqCi0JICogcmVxdWlyZWQgZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSC5sYXN0U2VnbWVudCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWZXJzaW9uKCkgewotCQlpZiAoZ2V0UHJvamVjdCgpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZSgKLQkJCQkJSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKS5nZXRWZXJzaW9uKCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCS8vIGVjbGlwc2VsaW5rIGNvbnRlbnQgbm90IHN1cHBvcnRlZCBmb3IgcHJvamVjdAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlsZVZlcnNpb25TdXBwb3J0ZWQoU3RyaW5nIGZpbGVWZXJzaW9uKSB7Ci0JCXJldHVybiBmaWxlVmVyc2lvbi5lcXVhbHMoRWNsaXBzZUxpbmsuU0NIRU1BX1ZFUlNJT04pCi0JCQkJfHwgZmlsZVZlcnNpb24uZXF1YWxzKEVjbGlwc2VMaW5rMV8xLlNDSEVNQV9WRVJTSU9OKQotCQkJCXx8IGZpbGVWZXJzaW9uLmVxdWFscyhFY2xpcHNlTGluazFfMi5TQ0hFTUFfVkVSU0lPTikKLQkJCQl8fCBmaWxlVmVyc2lvbi5lcXVhbHMoRWNsaXBzZUxpbmsyXzAuU0NIRU1BX1ZFUlNJT04pCi0JCQkJfHwgZmlsZVZlcnNpb24uZXF1YWxzKEVjbGlwc2VMaW5rMl8xLlNDSEVNQV9WRVJTSU9OKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlsZVZlcnNpb25TdXBwb3J0ZWRGb3JGYWNldFZlcnNpb24oU3RyaW5nIGZpbGVWZXJzaW9uLCBTdHJpbmcganBhRmFjZXRWZXJzaW9uKSB7Ci0JCS8vIGFzc3VtZSB0aGF0IHBsYXRmb3JtIGhhcyBiZWVuIHBvbGljZWQgZm9yIGZhY2V0IHZlcnNpb24gYWxyZWFkeQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTdXBwb3J0ZWRQbGF0Zm9ybUlkKFN0cmluZyBpZCkgewotCQlKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIHBsYXRmb3JtID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKcGFQbGF0Zm9ybShpZCk7Ci0JCWlmIChwbGF0Zm9ybSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIEVjbGlwc2VMaW5rUGxhdGZvcm0uR1JPVVAuZXF1YWxzKHBsYXRmb3JtLmdldEdyb3VwKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0VjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGQ4OGUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0VjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24gZXh0ZW5kcyBPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0WG1sUmVzb3VyY2VQcm92aWRlciBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlci5nZXRYbWxSZXNvdXJjZVByb3ZpZGVyKGZpbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4NzM0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQmFzaWNDb2xsZWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzhiNjZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkJhc2ljTWFwCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjQ1ZTdkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIChUeXBlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgTnVsbEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YTZhYzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DaGFuZ2VUcmFja2luZwotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgKFR5cGUpIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5MDkwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnQKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDlkYWRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0ZXIKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBwYXJlbnQsIChNZW1iZXIpIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MWNhZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkN1c3RvbWl6ZXIKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgKFR5cGUpIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyN2MxNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkV4aXN0ZW5jZUNoZWNraW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCAoVHlwZSkgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxN2RkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuSm9pbkZldGNoCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgTnVsbEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0ZmNmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk11dGFibGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDM5YzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5PYmplY3RUeXBlQ29udmVydGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIpIHBhcmVudCwgKE1lbWJlcikgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDA5ZTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSAKLQkJCT0gbmV3IEVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCAoVHlwZSkgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDRhODU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Qcml2YXRlT3duZWQKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3MjBkMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlJlYWRPbmx5Ci0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCAoVHlwZSkgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlhMzU0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjYjYxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuU3RydWN0Q29udmVydGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcikgcGFyZW50LCAoTWVtYmVyKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcikgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNDAwMWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHJhbnNmb3JtYXRpb24KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZWM2ZjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIpIHBhcmVudCwgKE1lbWJlcikgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTM4Mzg1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVmFyaWFibGVPbmVUb09uZQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBOdWxsRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDExYTYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuV3JpdGVUcmFuc2Zvcm1lcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTJlYjYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUKLSAqLwotcHVibGljIGNsYXNzIE51bGxFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uCi17Ci0KLQlwcm90ZWN0ZWQgTnVsbEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiB0eXBlCi0JcHVibGljIENhY2hlVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKENhY2hlVHlwZSB0eXBlKSB7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFR5cGUodHlwZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogc2l6ZQotCXB1YmxpYyBJbnRlZ2VyIGdldFNpemUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNpemUoSW50ZWdlciBzaXplKSB7Ci0JCWlmIChzaXplICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFNpemUoc2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNpemVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogc2hhcmVkCi0JcHVibGljIEJvb2xlYW4gZ2V0U2hhcmVkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaGFyZWQoQm9vbGVhbiBzaGFyZWQpIHsKLQkJaWYgKHNoYXJlZCAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRTaGFyZWQoc2hhcmVkKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2hhcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICoqKioqIGV4cGlyeQotCXB1YmxpYyBJbnRlZ2VyIGdldEV4cGlyeSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhwaXJ5KEludGVnZXIgZXhwaXJ5KSB7Ci0JCWlmIChleHBpcnkgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0RXhwaXJ5KGV4cGlyeSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEV4cGlyeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiBleHBpcnkgdGltZSBvZiBkYXkKLQlwdWJsaWMgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGdldEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBhZGRFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCXJldHVybiB0aGlzLmFkZEFubm90YXRpb24oKS5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEV4cGlyeVRpbWVPZkRheVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiBhbHdheXMgcmVmcmVzaAotCXB1YmxpYyBCb29sZWFuIGdldEFsd2F5c1JlZnJlc2goKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsd2F5c1JlZnJlc2goQm9vbGVhbiBhbHdheXNSZWZyZXNoKSB7Ci0JCWlmIChhbHdheXNSZWZyZXNoICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldEFsd2F5c1JlZnJlc2goYWx3YXlzUmVmcmVzaCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEFsd2F5c1JlZnJlc2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogcmVmcmVzaCBvbmx5IGlmIG5ld2VyCi0JcHVibGljIEJvb2xlYW4gZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIpIHsKLQkJaWYgKHJlZnJlc2hPbmx5SWZOZXdlciAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIocmVmcmVzaE9ubHlJZk5ld2VyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmcmVzaE9ubHlJZk5ld2VyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICoqKioqIGRpc2FibGUgaGl0cwotCXB1YmxpYyBCb29sZWFuIGdldERpc2FibGVIaXRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlSGl0cyhCb29sZWFuIGRpc2FibGVIaXRzKSB7Ci0JCWlmIChkaXNhYmxlSGl0cyAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXREaXNhYmxlSGl0cyhkaXNhYmxlSGl0cyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERpc2FibGVzSGl0c1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiBjb29yZGluYXRpb24gdHlwZQotCXB1YmxpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0Q29vcmRpbmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29vcmRpbmF0aW9uVHlwZShDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSkgewotCQlpZiAoY29vcmRpbmF0aW9uVHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRDb29yZGluYXRpb25UeXBlKGNvb3JkaW5hdGlvblR5cGUpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb29yZGluYXRpb25UeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTRlNDJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkpvaW5GZXRjaAotICovCi1wdWJsaWMgY2xhc3MgTnVsbEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbgotewotCXByb3RlY3RlZCBOdWxsRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSBzdXBlci5hZGRBbm5vdGF0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgSm9pbkZldGNoVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoSm9pbkZldGNoVHlwZSB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOGYwNDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHJhbnNmb3JtYXRpb24KLSAqLwotcHVibGljIGNsYXNzIE51bGxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uCi17CQotCXByb3RlY3RlZCBOdWxsRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOwotCX0KLQotCS8vICoqKioqIGZldGNoCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCkgewotCQlpZiAoZmV0Y2ggIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0RmV0Y2goZmV0Y2gpOwotCQl9CQkJCQotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEZldGNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvLyAqKioqKiBvcHRpb25hbAotCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKSB7Ci0JCWlmIChvcHRpb25hbCAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRPcHRpb25hbChvcHRpb25hbCk7Ci0JCX0JCQkJCi0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTNmZTgzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVmFyaWFibGVPbmVUb09uZQotICovCi1wdWJsaWMgY2xhc3MgTnVsbEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24KLQlleHRlbmRzIE51bGxBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uCi17CQotCXByb3RlY3RlZCBOdWxsRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNWU2MGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckNvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbENvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4KLSAqLwotcHVibGljIGNsYXNzIE51bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBOdWxsQ29sdW1uQW5ub3RhdGlvbgotewkKLQlwdWJsaWMgTnVsbEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckNvbHVtbkFubm90YXRpb24oRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gZ2V0V3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgdGhpcy5wYXJlbnQ7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2x1bW5Bbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldFdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKCkuYWRkQ29sdW1uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5MmU5MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5CYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5PYmplY3RUeXBlQ29udmVydGVyCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCi0gKi8KLWFic3RyYWN0IGNsYXNzIEJpbmFyeUJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KLXsKLQlTdHJpbmcgZGF0YVR5cGU7Ci0JU3RyaW5nIG9iamVjdFR5cGU7Ci0KLQotCUJpbmFyeUJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuZGF0YVR5cGUgPSB0aGlzLmJ1aWxkRGF0YVR5cGUoKTsKLQkJdGhpcy5vYmplY3RUeXBlID0gdGhpcy5idWlsZE9iamVjdFR5cGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERhdGFUeXBlXyh0aGlzLmJ1aWxkRGF0YVR5cGUoKSk7Ci0JCXRoaXMuc2V0T2JqZWN0VHlwZV8odGhpcy5idWlsZE9iamVjdFR5cGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGRhdGEgdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFUeXBlKFN0cmluZyBkYXRhVHlwZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGF0YVR5cGVfKFN0cmluZyBkYXRhVHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kYXRhVHlwZTsKLQkJdGhpcy5kYXRhVHlwZSA9IGRhdGFUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREFUQV9UWVBFX1BST1BFUlRZLCBvbGQsIGRhdGFUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGF0YVR5cGUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0RGF0YVR5cGVFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERhdGFUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCWFic3RyYWN0IFN0cmluZyBnZXREYXRhVHlwZUVsZW1lbnROYW1lKCk7Ci0KLQkvLyAqKioqKiBvYmplY3QgdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBvYmplY3RUeXBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRPYmplY3RUeXBlXyhTdHJpbmcgb2JqZWN0VHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5vYmplY3RUeXBlOwotCQl0aGlzLm9iamVjdFR5cGUgPSBvYmplY3RUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfUFJPUEVSVFksIG9sZCwgb2JqZWN0VHlwZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE9iamVjdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRPYmplY3RUeXBlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldE9iamVjdFR5cGVFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9iamVjdFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JYWJzdHJhY3QgU3RyaW5nIGdldE9iamVjdFR5cGVFbGVtZW50TmFtZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMzQ3YTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkJhc2ljQ29sbGVjdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24KLXsKLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OTVjMmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5CYXNpY01hcAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uCi17Ci0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZmE1OGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBDYWNoZVR5cGUgdHlwZTsKLQlwcml2YXRlIEludGVnZXIgc2l6ZTsKLQlwcml2YXRlIEJvb2xlYW4gc2hhcmVkOwotCXByaXZhdGUgSW50ZWdlciBleHBpcnk7Ci0JcHJpdmF0ZSBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gZXhwaXJ5VGltZU9mRGF5OwotCXByaXZhdGUgQm9vbGVhbiBhbHdheXNSZWZyZXNoOwotCXByaXZhdGUgQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIGRpc2FibGVIaXRzOwotCXByaXZhdGUgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGU7Ci0KLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy50eXBlID0gdGhpcy5idWlsZFR5cGUoKTsKLQkJdGhpcy5zaXplID0gdGhpcy5idWlsZFNpemUoKTsKLQkJdGhpcy5zaGFyZWQgPSB0aGlzLmJ1aWxkU2hhcmVkKCk7Ci0JCXRoaXMuZXhwaXJ5ID0gdGhpcy5idWlsZEV4cGlyeSgpOwotCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IHRoaXMuYnVpbGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJdGhpcy5hbHdheXNSZWZyZXNoID0gdGhpcy5idWlsZEFsd2F5c1JlZnJlc2goKTsKLQkJdGhpcy5yZWZyZXNoT25seUlmTmV3ZXIgPSB0aGlzLmJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0JCXRoaXMuZGlzYWJsZUhpdHMgPSB0aGlzLmJ1aWxkRGlzYWJsZUhpdHMoKTsKLQkJdGhpcy5jb29yZGluYXRpb25UeXBlID0gdGhpcy5idWlsZENvb3JkaW5hdGlvblR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCS8vIFRPRE8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFR5cGVfKHRoaXMuYnVpbGRUeXBlKCkpOwotCQl0aGlzLnNldFNpemVfKHRoaXMuYnVpbGRTaXplKCkpOwotCQl0aGlzLnNldFNoYXJlZF8odGhpcy5idWlsZFNoYXJlZCgpKTsKLQkJdGhpcy5zZXRFeHBpcnlfKHRoaXMuYnVpbGRFeHBpcnkoKSk7Ci0JCXRoaXMudXBkYXRlRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCXRoaXMuc2V0QWx3YXlzUmVmcmVzaF8odGhpcy5idWlsZEFsd2F5c1JlZnJlc2goKSk7Ci0JCXRoaXMuc2V0UmVmcmVzaE9ubHlJZk5ld2VyXyh0aGlzLmJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQl0aGlzLnNldERpc2FibGVIaXRzXyh0aGlzLmJ1aWxkRGlzYWJsZUhpdHMoKSk7Ci0JCXRoaXMuc2V0Q29vcmRpbmF0aW9uVHlwZV8odGhpcy5idWlsZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENhY2hlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB0eXBlCi0JcHVibGljIENhY2hlVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoQ2FjaGVUeXBlIHR5cGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFR5cGVfKENhY2hlVHlwZSB0eXBlKSB7Ci0JCUNhY2hlVHlwZSBvbGQgPSB0aGlzLnR5cGU7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByaXZhdGUgQ2FjaGVUeXBlIGJ1aWxkVHlwZSgpIHsKLQkJcmV0dXJuIENhY2hlVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19UWVBFKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHNpemUKLQlwdWJsaWMgSW50ZWdlciBnZXRTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zaXplOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNpemUoSW50ZWdlciBzaXplKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTaXplXyhJbnRlZ2VyIHNpemUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnNpemU7Ci0JCXRoaXMuc2l6ZSA9IHNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSVpFX1BST1BFUlRZLCBvbGQsIHNpemUpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZFNpemUoKSB7Ci0JCXJldHVybiAoSW50ZWdlcikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DQUNIRV9fU0laRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTaXplVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHNoYXJlZAotCXB1YmxpYyBCb29sZWFuIGdldFNoYXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc2hhcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNoYXJlZChCb29sZWFuIHNoYXJlZCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2hhcmVkXyhCb29sZWFuIHNoYXJlZCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc2hhcmVkOwotCQl0aGlzLnNoYXJlZCA9IHNoYXJlZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNIQVJFRF9QUk9QRVJUWSwgb2xkLCBzaGFyZWQpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFNoYXJlZCgpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19TSEFSRUQpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2hhcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGV4cGlyeQotCXB1YmxpYyBJbnRlZ2VyIGdldEV4cGlyeSgpIHsKLQkJcmV0dXJuIHRoaXMuZXhwaXJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4cGlyeShJbnRlZ2VyIGV4cGlyeSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RXhwaXJ5XyhJbnRlZ2VyIGV4cGlyeSkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuZXhwaXJ5OwotCQl0aGlzLmV4cGlyeSA9IGV4cGlyeTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9QUk9QRVJUWSwgb2xkLCBleHBpcnkpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZEV4cGlyeSgpIHsKLQkJcmV0dXJuIChJbnRlZ2VyKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19FWFBJUlkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGV4cGlyeSB0aW1lIG9mIGRheQotCXB1YmxpYyBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gZ2V0RXhwaXJ5VGltZU9mRGF5KCkgewotCQlyZXR1cm4gdGhpcy5leHBpcnlUaW1lT2ZEYXk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBhZGRFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gYnVpbGRFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCUlBbm5vdGF0aW9uIGpkdFRpbWVPZkRheSA9IHRoaXMuZ2V0SmR0RXhwaXJ5VGltZU9mRGF5KCk7Ci0JCXJldHVybiAoamR0VGltZU9mRGF5ID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRUaW1lT2ZEYXkoamR0VGltZU9mRGF5KTsKLQl9Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBidWlsZFRpbWVPZkRheShJQW5ub3RhdGlvbiBqZHRUaW1lT2ZEYXkpIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24odGhpcywgamR0VGltZU9mRGF5KTsKLQl9Ci0KLQlwcml2YXRlIElBbm5vdGF0aW9uIGdldEpkdEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIChJQW5ub3RhdGlvbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RXhwaXJ5VGltZU9mRGF5KEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBleHBpcnlUaW1lT2ZEYXkpIHsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIG9sZCA9IHRoaXMuZXhwaXJ5VGltZU9mRGF5OwotCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IGV4cGlyeVRpbWVPZkRheTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSwgb2xkLCBleHBpcnlUaW1lT2ZEYXkpOwotCX0KLQotCS8vIFRPRE8KLQlwcml2YXRlIHZvaWQgdXBkYXRlRXhwaXJ5VGltZU9mRGF5KCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLS8vCQlJQW5ub3RhdGlvbiBqZHRUaW1lT2ZEYXkgPSB0aGlzLmdldEpkdEV4cGlyeVRpbWVPZkRheSgpOwotLy8JCWlmIChqZHRUaW1lT2ZEYXkgPT0gbnVsbCkgewotLy8JCQl0aGlzLnNldEV4cGlyeVRpbWVPZkRheShudWxsKTsKLS8vCQl9IGVsc2UgewotLy8JCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXkgPT0gbnVsbCkgewotLy8JCQkJdGhpcy5zZXRFeHBpcnlUaW1lT2ZEYXkodGhpcy5idWlsZFRpbWVPZkRheShqZHRUaW1lT2ZEYXkpKTsKLS8vCQkJfSBlbHNlIHsKLS8vCQkJCXRoaXMuZXhwaXJ5VGltZU9mRGF5LnVwZGF0ZShqZHRUaW1lT2ZEYXkpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGltZU9mRGF5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGFsd2F5cyByZWZyZXNoCi0JcHVibGljIEJvb2xlYW4gZ2V0QWx3YXlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIHRoaXMuYWx3YXlzUmVmcmVzaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4gYWx3YXlzUmVmcmVzaCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0QWx3YXlzUmVmcmVzaF8oQm9vbGVhbiBhbHdheXNSZWZyZXNoKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5hbHdheXNSZWZyZXNoOwotCQl0aGlzLmFsd2F5c1JlZnJlc2ggPSBhbHdheXNSZWZyZXNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFksIG9sZCwgYWx3YXlzUmVmcmVzaCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkQWx3YXlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19BTFdBWVNfUkVGUkVTSCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRBbHdheXNSZWZyZXNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHJlZnJlc2ggb25seSBpZiBuZXdlcgotCXB1YmxpYyBCb29sZWFuIGdldFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuIHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVmcmVzaE9ubHlJZk5ld2VyXyhCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgewotCQlCb29sZWFuIG9sZCA9IHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyOwotCQl0aGlzLnJlZnJlc2hPbmx5SWZOZXdlciA9IHJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSwgb2xkLCByZWZyZXNoT25seUlmTmV3ZXIpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVIpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmcmVzaE9ubHlJZk5ld2VyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGRpc2FibGUgaGl0cwotCXB1YmxpYyBCb29sZWFuIGdldERpc2FibGVIaXRzKCkgewotCQlyZXR1cm4gdGhpcy5kaXNhYmxlSGl0czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlSGl0cyhCb29sZWFuIGRpc2FibGVIaXRzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREaXNhYmxlSGl0c18oQm9vbGVhbiBkaXNhYmxlSGl0cykgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuZGlzYWJsZUhpdHM7Ci0JCXRoaXMuZGlzYWJsZUhpdHMgPSBkaXNhYmxlSGl0czsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU0FCTEVfSElUU19QUk9QRVJUWSwgb2xkLCBkaXNhYmxlSGl0cyk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkRGlzYWJsZUhpdHMoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DQUNIRV9fRElTQUJMRV9ISVRTKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERpc2FibGVzSGl0c1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBjb29yZGluYXRpb24gdHlwZQotCXB1YmxpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0Q29vcmRpbmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDb29yZGluYXRpb25UeXBlXyhDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSkgewotCQlDYWNoZUNvb3JkaW5hdGlvblR5cGUgb2xkID0gdGhpcy5jb29yZGluYXRpb25UeXBlOwotCQl0aGlzLmNvb3JkaW5hdGlvblR5cGUgPSBjb29yZGluYXRpb25UeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCBjb29yZGluYXRpb25UeXBlKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBidWlsZENvb3JkaW5hdGlvblR5cGUoKSB7Ci0JCXJldHVybiBDYWNoZUNvb3JkaW5hdGlvblR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEUpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvb3JkaW5hdGlvblR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWM4ZmYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DaGFuZ2VUcmFja2luZwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JLy8gVE9ETwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIENoYW5nZVRyYWNraW5nVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKSB7Ci0JCUNoYW5nZVRyYWNraW5nVHlwZSBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VUcmFja2luZ1R5cGUgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIENoYW5nZVRyYWNraW5nVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lOR19fVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODY4YzU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVyc2lvblZhbHVlCi0gKi8KLWZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgZGF0YVZhbHVlOwotCXByaXZhdGUgU3RyaW5nIG9iamVjdFZhbHVlOwotCi0KLQlCaW5hcnlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5kYXRhVmFsdWUgPSB0aGlzLmJ1aWxkRGF0YVZhbHVlKCk7Ci0JCXRoaXMub2JqZWN0VmFsdWUgPSB0aGlzLmJ1aWxkT2JqZWN0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGF0YVZhbHVlXyh0aGlzLmJ1aWxkRGF0YVZhbHVlKCkpOwotCQl0aGlzLnNldE9iamVjdFZhbHVlXyh0aGlzLmJ1aWxkT2JqZWN0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogZGF0YSB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YVZhbHVlKFN0cmluZyBkYXRhVmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERhdGFWYWx1ZV8oU3RyaW5nIGRhdGFWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kYXRhVmFsdWU7Ci0JCXRoaXMuZGF0YVZhbHVlID0gZGF0YVZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREFUQV9WQUxVRV9QUk9QRVJUWSwgb2xkLCBkYXRhVmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGF0YVZhbHVlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERhdGFWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBvYmplY3QgdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RWYWx1ZShTdHJpbmcgb2JqZWN0VmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE9iamVjdFZhbHVlXyhTdHJpbmcgb2JqZWN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMub2JqZWN0VmFsdWU7Ci0JCXRoaXMub2JqZWN0VmFsdWUgPSBvYmplY3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBvYmplY3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRPYmplY3RWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9iamVjdFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMWQ0MDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29udmVydEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DT05WRVJUX19WQUxVRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZGVjOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBjb252ZXJ0ZXJDbGFzczsKLQotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gdGhpcy5idWlsZENvbnZlcnRlckNsYXNzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldENvbnZlcnRlckNsYXNzXyh0aGlzLmJ1aWxkQ29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJpbmFyeU5hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuQ09OVkVSVEVSX19OQU1FOwotCX0KLQotCS8vICoqKioqKioqKiogQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBjb252ZXJ0ZXIgY2xhc3MKLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENvbnZlcnRlckNsYXNzXyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY29udmVydGVyQ2xhc3M7Ci0JCXRoaXMuY29udmVydGVyQ2xhc3MgPSBjb252ZXJ0ZXJDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSwgb2xkLCBjb252ZXJ0ZXJDbGFzcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ2xhc3M7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRDb252ZXJ0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ09OVkVSVEVSX19DT05WRVJURVJfQ0xBU1MpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udmVydGVyQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2U1NzU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ3VzdG9taXplcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDdXN0b21pemVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQkKLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgY3VzdG9taXplciBjbGFzcyBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVJfX1ZBTFVFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGN1c3RvbWl6ZXJDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZU5hbWUsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0YWRkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkV4aXN0ZW5jZUNoZWNraW5nCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24KLXsKLQlwcml2YXRlIEV4aXN0ZW5jZVR5cGUgdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgRXhpc3RlbmNlVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoRXhpc3RlbmNlVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKEV4aXN0ZW5jZVR5cGUgdmFsdWUpIHsKLQkJRXhpc3RlbmNlVHlwZSBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBFeGlzdGVuY2VUeXBlIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiBFeGlzdGVuY2VUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HX19WQUxVRSkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzcyZmYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkpvaW5GZXRjaAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24KLXsKLQlwcml2YXRlIEpvaW5GZXRjaFR5cGUgdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlKb2luRmV0Y2hBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIEpvaW5GZXRjaFR5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEpvaW5GZXRjaFR5cGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhKb2luRmV0Y2hUeXBlIHZhbHVlKSB7Ci0JCUpvaW5GZXRjaFR5cGUgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgSm9pbkZldGNoVHlwZSBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gSm9pbkZldGNoVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0hfX1ZBTFVFKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGRlZWI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5NdXRhYmxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBCb29sZWFuIHZhbHVlOwotCi0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE11dGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIEJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuTVVUQUJMRV9fVkFMVUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5ZjE3Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydGVyCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5TdHJ1Y3RDb252ZXJ0ZXIKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlR5cGVDb252ZXJ0ZXIKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk9iamVjdFR5cGVDb252ZXJ0ZXIKLSAqLwotYWJzdHJhY3QgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIG5hbWU7Ci0KLQlCaW5hcnlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0TmFtZV8odGhpcy5idWlsZE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldE5hbWVFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JYWJzdHJhY3QgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyM2IxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuT2JqZWN0VHlwZUNvbnZlcnRlcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWU7Ci0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVzOwotCi0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IHRoaXMuYnVpbGREZWZhdWx0T2JqZWN0VmFsdWUoKTsKLQkJdGhpcy5jb252ZXJzaW9uVmFsdWVzID0gdGhpcy5idWlsZENvbnZlcnNpb25WYWx1ZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdE9iamVjdFZhbHVlXyh0aGlzLmJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQl0aGlzLnVwZGF0ZUNvbnZlcnNpb25WYWx1ZXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmluYXJ5TmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX05BTUU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlCYXNlVHlwZUNvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldERhdGFUeXBlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0T2JqZWN0VHlwZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGRlZmF1bHQgb2JqZWN0IHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0T2JqZWN0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0T2JqZWN0VmFsdWUoU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlXyhTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZTsKLQkJdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWUgPSBkZWZhdWx0T2JqZWN0VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBkZWZhdWx0T2JqZWN0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RFRkFVTFRfT0JKRUNUX1ZBTFVFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERlZmF1bHRPYmplY3RWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBjb252ZXJzaW9uIHZhbHVlcwotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4odGhpcy5jb252ZXJzaW9uVmFsdWVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbnZlcnNpb25WYWx1ZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZUF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWVzLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mQ29udmVyc2lvblZhbHVlKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBjb252ZXJzaW9uVmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlcy5pbmRleE9mKGNvbnZlcnNpb25WYWx1ZSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBhZGRDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVDb252ZXJzaW9uVmFsdWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29udmVyc2lvblZhbHVlKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IGJ1aWxkQ29udmVyc2lvblZhbHVlcygpIHsKLQkJT2JqZWN0W10gamR0Q29udmVyc2lvblZhbHVlcyA9IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVzKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVMpOwotCQlWZWN0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgVmVjdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4oamR0Q29udmVyc2lvblZhbHVlcy5sZW5ndGgpOwotCQlmb3IgKE9iamVjdCBqZHRDb252ZXJzaW9uVmFsdWUgOiBqZHRDb252ZXJzaW9uVmFsdWVzKSB7Ci0JCQlyZXN1bHQuYWRkKG5ldyBCaW5hcnlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24odGhpcywgKElBbm5vdGF0aW9uKSBqZHRDb252ZXJzaW9uVmFsdWUpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIFRPRE8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ29udmVyc2lvblZhbHVlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYyMWE5My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlByaW1hcnlLZXkKLSAqLwotcHVibGljIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24KLXsKLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTliZWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlByaXZhdGVPd25lZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE2MGY5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5SZWFkT25seQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uCi17Ci0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiMzdhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlUcmFuc2Zvcm1lckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldFRyYW5zZm9ybWVyQ2xhc3NFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVJfX1RSQU5TRk9STUVSX0NMQVNTOwotCX0KLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRNZXRob2RFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVJfX01FVEhPRDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkOTY1NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5TdHJ1Y3RDb252ZXJ0ZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5RWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIGNvbnZlcnRlcjsKLQotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLmNvbnZlcnRlciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0Q29udmVydGVyXyh0aGlzLmJ1aWxkQ29udmVydGVyKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlOYW1lZENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVJfX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN0cnVjdENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogY29udmVydGVyCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlcikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29udmVydGVyXyhTdHJpbmcgY29udmVydGVyKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNvbnZlcnRlcjsKLQkJdGhpcy5jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfUFJPUEVSVFksIG9sZCwgY29udmVydGVyKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRlclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRlOTUwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UaW1lT2ZEYXkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBJbnRlZ2VyIGhvdXI7Ci0JcHJpdmF0ZSBJbnRlZ2VyIG1pbnV0ZTsKLQlwcml2YXRlIEludGVnZXIgc2Vjb25kOwotCXByaXZhdGUgSW50ZWdlciBtaWxsaXNlY29uZDsKLQotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLmhvdXIgPSB0aGlzLmJ1aWxkSG91cigpOwotCQl0aGlzLm1pbnV0ZSA9IHRoaXMuYnVpbGRNaW51dGUoKTsKLQkJdGhpcy5zZWNvbmQgPSB0aGlzLmJ1aWxkU2Vjb25kKCk7Ci0JCXRoaXMubWlsbGlzZWNvbmQgPSB0aGlzLmJ1aWxkTWlsbGlzZWNvbmQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0SG91cl8odGhpcy5idWlsZEhvdXIoKSk7Ci0JCXRoaXMuc2V0TWludXRlXyh0aGlzLmJ1aWxkTWludXRlKCkpOwotCQl0aGlzLnNldFNlY29uZF8odGhpcy5idWlsZFNlY29uZCgpKTsKLQkJdGhpcy5zZXRNaWxsaXNlY29uZF8odGhpcy5idWlsZE1pbGxpc2Vjb25kKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUaW1lT2ZEYXlBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGhvdXIKLQlwdWJsaWMgSW50ZWdlciBnZXRIb3VyKCkgewotCQlyZXR1cm4gdGhpcy5ob3VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhvdXIoSW50ZWdlciBob3VyKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRIb3VyXyhJbnRlZ2VyIGhvdXIpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmhvdXI7Ci0JCXRoaXMuaG91ciA9IGhvdXI7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChIT1VSX1BST1BFUlRZLCBvbGQsIGhvdXIpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZEhvdXIoKSB7Ci0JCXJldHVybiAoSW50ZWdlcikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5USU1FX09GX0RBWV9fSE9VUik7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRIb3VyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIG1pbnV0ZQotCXB1YmxpYyBJbnRlZ2VyIGdldE1pbnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMubWludXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1pbnV0ZShJbnRlZ2VyIG5ld01pbnV0ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWludXRlXyhJbnRlZ2VyIG5ld01pbnV0ZSkgewotCQlJbnRlZ2VyIG9sZE1pbnV0ZSA9IHRoaXMubWludXRlOwotCQl0aGlzLm1pbnV0ZSA9IG5ld01pbnV0ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1JTlVURV9QUk9QRVJUWSwgb2xkTWludXRlLCBuZXdNaW51dGUpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZE1pbnV0ZSgpIHsKLQkJcmV0dXJuIChJbnRlZ2VyKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZX19NSU5VVEUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWludXRlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHNlY29uZAotCXB1YmxpYyBJbnRlZ2VyIGdldFNlY29uZCgpIHsKLQkJcmV0dXJuIHRoaXMuc2Vjb25kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlY29uZChJbnRlZ2VyIG5ld1NlY29uZCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2Vjb25kXyhJbnRlZ2VyIG5ld1NlY29uZCkgewotCQlJbnRlZ2VyIG9sZFNlY29uZCA9IHRoaXMuc2Vjb25kOwotCQl0aGlzLnNlY29uZCA9IG5ld1NlY29uZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFQ09ORF9QUk9QRVJUWSwgb2xkU2Vjb25kLCBuZXdTZWNvbmQpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZFNlY29uZCgpIHsKLQkJcmV0dXJuIChJbnRlZ2VyKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZX19TRUNPTkQpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2Vjb25kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIG1pbGxpc2Vjb25kCi0JcHVibGljIEludGVnZXIgZ2V0TWlsbGlzZWNvbmQoKSB7Ci0JCXJldHVybiB0aGlzLm1pbGxpc2Vjb25kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1pbGxpc2Vjb25kKEludGVnZXIgbmV3TWlsbGlzZWNvbmQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1pbGxpc2Vjb25kXyhJbnRlZ2VyIG5ld01pbGxpc2Vjb25kKSB7Ci0JCUludGVnZXIgb2xkTWlsbGlzZWNvbmQgPSB0aGlzLm1pbGxpc2Vjb25kOwotCQl0aGlzLm1pbGxpc2Vjb25kID0gbmV3TWlsbGlzZWNvbmQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNSUxMSVNFQ09ORF9QUk9QRVJUWSwgb2xkTWlsbGlzZWNvbmQsIG5ld01pbGxpc2Vjb25kKTsKLQl9Ci0KLQlwcml2YXRlIEludGVnZXIgYnVpbGRNaWxsaXNlY29uZCgpIHsKLQkJcmV0dXJuIChJbnRlZ2VyKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZX19NSUxMSVNFQ09ORCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRNaWxsaXNlY29uZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMmM2MGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHJhbnNmb3JtYXRpb24KLSAqLwotcHVibGljIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbgotewotCXByaXZhdGUgRmV0Y2hUeXBlIGZldGNoOwotCXByaXZhdGUgQm9vbGVhbiBvcHRpb25hbDsKLQotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuZmV0Y2ggPSB0aGlzLmJ1aWxkRmV0Y2goKTsKLQkJdGhpcy5vcHRpb25hbCA9IHRoaXMuYnVpbGRPcHRpb25hbCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRGZXRjaF8odGhpcy5idWlsZEZldGNoKCkpOwotCQl0aGlzLnNldE9wdGlvbmFsXyh0aGlzLmJ1aWxkT3B0aW9uYWwoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBmZXRjaAotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmZldGNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RmV0Y2hfKEZldGNoVHlwZSBmZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkID0gdGhpcy5mZXRjaDsKLQkJdGhpcy5mZXRjaCA9IGZldGNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkVUQ0hfUFJPUEVSVFksIG9sZCwgZmV0Y2gpOwotCX0KLQotCXByaXZhdGUgRmV0Y2hUeXBlIGJ1aWxkRmV0Y2goKSB7Ci0JCXJldHVybiBGZXRjaFR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTl9fRkVUQ0gpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEZldGNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIG9wdGlvbmFsCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE9wdGlvbmFsXyhCb29sZWFuIG9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5vcHRpb25hbDsKLQkJdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1BUSU9OQUxfUFJPUEVSVFksIG9sZCwgb3B0aW9uYWwpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZE9wdGlvbmFsKCkgewotCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT05fX09QVElPTkFMKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2ZjE2Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Xcml0ZVRyYW5zZm9ybWVyCi0gKi8KLWFic3RyYWN0IGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIHRyYW5zZm9ybWVyQ2xhc3M7Ci0JcHJpdmF0ZSBTdHJpbmcgbWV0aG9kOwotCi0KLQlCaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnRyYW5zZm9ybWVyQ2xhc3MgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtZXJDbGFzcygpOwotCQl0aGlzLm1ldGhvZCA9IHRoaXMuYnVpbGRNZXRob2QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFRyYW5zZm9ybWVyQ2xhc3NfKHRoaXMuYnVpbGRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCQl0aGlzLnNldE1ldGhvZF8odGhpcy5idWlsZE1ldGhvZCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVHJhbnNmb3JtZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHRyYW5zZm9ybWVyIGNsYXNzCi0JcHVibGljIFN0cmluZyBnZXRUcmFuc2Zvcm1lckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lckNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRyYW5zZm9ybWVyQ2xhc3MoU3RyaW5nIHRyYW5zZm9ybWVyQ2xhc3MpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRyYW5zZm9ybWVyQ2xhc3NfKFN0cmluZyB0cmFuc2Zvcm1lckNsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnRyYW5zZm9ybWVyQ2xhc3M7Ci0JCXRoaXMudHJhbnNmb3JtZXJDbGFzcyA9IHRyYW5zZm9ybWVyQ2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUUkFOU0ZPUk1FUl9DTEFTU19QUk9QRVJUWSwgb2xkLCB0cmFuc2Zvcm1lckNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFRyYW5zZm9ybWVyQ2xhc3MoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0VHJhbnNmb3JtZXJDbGFzc0VsZW1lbnROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHJhbnNmb3JtZXJDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0VHJhbnNmb3JtZXJDbGFzc0VsZW1lbnROYW1lKCk7Ci0KLQkvLyAqKioqKiBtZXRob2QKLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpIHsKLQkJcmV0dXJuIHRoaXMubWV0aG9kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZChTdHJpbmcgbWV0aG9kKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNZXRob2RfKFN0cmluZyBtZXRob2QpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubWV0aG9kOwotCQl0aGlzLm1ldGhvZCA9IG1ldGhvZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1FVEhPRF9QUk9QRVJUWSwgb2xkLCBtZXRob2QpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTWV0aG9kKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldE1ldGhvZEVsZW1lbnROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWV0aG9kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCWFic3RyYWN0IFN0cmluZyBnZXRNZXRob2RFbGVtZW50TmFtZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2NmM4Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotewotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmluYXJ5TmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUl9fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmluYXJ5QmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXREYXRhVHlwZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0T2JqZWN0VHlwZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YTJmZmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVmFyaWFibGVPbmVUb09uZQotICovCi1wdWJsaWMgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbgotewotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2Y3ZGZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5Q29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW47Ci0KLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuY29sdW1uID0gdGhpcy5idWlsZENvbHVtbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVDb2x1bW4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmluYXJ5VHJhbnNmb3JtZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRUcmFuc2Zvcm1lckNsYXNzRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUl9fVFJBTlNGT1JNRVJfQ0xBU1M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVJfX01FVEhPRDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogY29sdW1uCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Tm9uTnVsbENvbHVtbigpIHsKLQkJcmV0dXJuICh0aGlzLmNvbHVtbiAhPSBudWxsKSA/IHRoaXMuY29sdW1uIDogbmV3IE51bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uKHRoaXMpOwotCX0KLQotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGFkZENvbHVtbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbHVtblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkFubm90YXRpb24gYnVpbGRDb2x1bW4oKSB7Ci0JCUlBbm5vdGF0aW9uIGpkdENvbHVtbiA9IHRoaXMuZ2V0SmR0Q29sdW1uKCk7Ci0JCXJldHVybiAoamR0Q29sdW1uID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRDb2x1bW4oamR0Q29sdW1uKTsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkFubm90YXRpb24gYnVpbGRDb2x1bW4oSUFubm90YXRpb24gamR0Q29sdW1uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5Q29sdW1uQW5ub3RhdGlvbih0aGlzLCBqZHRDb2x1bW4pOwotCX0KLQotCXByaXZhdGUgSUFubm90YXRpb24gZ2V0SmR0Q29sdW1uKCkgewotCQlyZXR1cm4gKElBbm5vdGF0aW9uKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSX19DT0xVTU4pOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDb2x1bW4oQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4pIHsKLQkJQ29sdW1uQW5ub3RhdGlvbiBvbGQgPSB0aGlzLmNvbHVtbjsKLQkJdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xVTU5fUFJPUEVSVFksIG9sZCwgY29sdW1uKTsKLQl9Ci0KLQkvLyBUT0RPCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbHVtbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0vLwkJSUFubm90YXRpb24gamR0Q29sdW1uID0gdGhpcy5nZXRKZHRDb2x1bW4oKTsKLS8vCQlpZiAoamR0Q29sdW1uID09IG51bGwpIHsKLS8vCQkJdGhpcy5zZXRDb2x1bW4obnVsbCk7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJaWYgKHRoaXMuY29sdW1uID09IG51bGwpIHsKLS8vCQkJCXRoaXMuc2V0Q29sdW1uKHRoaXMuYnVpbGRDb2x1bW4oamR0Q29sdW1uKSk7Ci0vLwkJCX0gZWxzZSB7Ci0vLwkJCQl0aGlzLmNvbHVtbi51cGRhdGUoamR0Q29sdW1uKTsKLS8vCQkJfQotLy8JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZjU1ZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlR5cGVDb252ZXJ0ZXIKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk9iamVjdFR5cGVDb252ZXJ0ZXIKLSAqLwotYWJzdHJhY3QgY2xhc3MgU291cmNlQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotewotCWZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGF0YVR5cGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGF0YVR5cGVBZGFwdGVyOwotCVN0cmluZyBkYXRhVHlwZTsKLQlTdHJpbmcgZnVsbHlRdWFsaWZpZWREYXRhVHlwZTsKLQotCWZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gb2JqZWN0VHlwZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBvYmplY3RUeXBlQWRhcHRlcjsKLQlTdHJpbmcgb2JqZWN0VHlwZTsKLQlTdHJpbmcgZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlOwotCi0JU291cmNlQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEpOwotCQl0aGlzLmRhdGFUeXBlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZFR5cGVBZGFwdGVyKHRoaXMuZ2V0RGF0YVR5cGVFbGVtZW50TmFtZSgpKTsKLQkJdGhpcy5kYXRhVHlwZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgdGhpcy5kYXRhVHlwZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0KLQkJdGhpcy5vYmplY3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZFR5cGVBZGFwdGVyKHRoaXMuZ2V0T2JqZWN0VHlwZUVsZW1lbnROYW1lKCkpOwotCQl0aGlzLm9iamVjdFR5cGVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIHRoaXMub2JqZWN0VHlwZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVHlwZUFkYXB0ZXIoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCSAvLyBmYWxzZSA9IGRvIG5vdCByZW1vdmUgYW5ub3RhdGlvbiB3aGVuIGVtcHR5Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5kYWEsIGVsZW1lbnROYW1lLCBmYWxzZSwgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLmRhdGFUeXBlID0gdGhpcy5idWlsZERhdGFUeXBlKGFzdFJvb3QpOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWREYXRhVHlwZShhc3RSb290KTsKLQkJdGhpcy5vYmplY3RUeXBlID0gdGhpcy5idWlsZE9iamVjdFR5cGUoYXN0Um9vdCk7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlID0gdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZShhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNEYXRhVHlwZSh0aGlzLmJ1aWxkRGF0YVR5cGUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNGdWxseVF1YWxpZmllZERhdGFUeXBlKHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZERhdGFUeXBlKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jT2JqZWN0VHlwZSh0aGlzLmJ1aWxkT2JqZWN0VHlwZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY0Z1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSh0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKGFzdFJvb3QpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGRhdGEgdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFUeXBlKFN0cmluZyBkYXRhVHlwZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5kYXRhVHlwZSwgZGF0YVR5cGUpKSB7Ci0JCQl0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7Ci0JCQl0aGlzLmRhdGFUeXBlQWRhcHRlci5zZXRWYWx1ZShkYXRhVHlwZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0RhdGFUeXBlKFN0cmluZyBhc3REYXRhVHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kYXRhVHlwZTsKLQkJdGhpcy5kYXRhVHlwZSA9IGFzdERhdGFUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREFUQV9UWVBFX1BST1BFUlRZLCBvbGQsIGFzdERhdGFUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERhdGFUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERhdGFUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5kYXRhVHlwZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JYWJzdHJhY3QgU3RyaW5nIGdldERhdGFUeXBlRWxlbWVudE5hbWUoKTsKLQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCBkYXRhIHR5cGUKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNGdWxseVF1YWxpZmllZERhdGFUeXBlKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGU7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWREYXRhVHlwZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfREFUQV9UWVBFX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWREYXRhVHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKHRoaXMuZGF0YVR5cGUgPT0gbnVsbCkgPyBudWxsIDogQVNUVG9vbHMucmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLmRhdGFUeXBlQWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQkvLyAqKioqKiBvYmplY3QgdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBvYmplY3RUeXBlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm9iamVjdFR5cGUsIG9iamVjdFR5cGUpKSB7Ci0JCQl0aGlzLm9iamVjdFR5cGUgPSBvYmplY3RUeXBlOwotCQkJdGhpcy5vYmplY3RUeXBlQWRhcHRlci5zZXRWYWx1ZShvYmplY3RUeXBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jT2JqZWN0VHlwZShTdHJpbmcgYXN0T2JqZWN0VHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5vYmplY3RUeXBlOwotCQl0aGlzLm9iamVjdFR5cGUgPSBhc3RPYmplY3RUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfUFJPUEVSVFksIG9sZCwgYXN0T2JqZWN0VHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRPYmplY3RUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T2JqZWN0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMub2JqZWN0VHlwZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JYWJzdHJhY3QgU3RyaW5nIGdldE9iamVjdFR5cGVFbGVtZW50TmFtZSgpOwotCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIG9iamVjdCB0eXBlCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE9iamVjdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0Z1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZE9iamVjdFR5cGU7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9PQkpFQ1RfVFlQRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKHRoaXMub2JqZWN0VHlwZSA9PSBudWxsKSA/IG51bGwgOiBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMub2JqZWN0VHlwZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihhc3RSb290KSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZTg4NDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5CYXNpY0NvbGxlY3Rpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQkKLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3ODU1Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5CYXNpY01hcAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQkKLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYjA3OTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxUeXBlPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFRZUEVfQURBUFRFUiA9IGJ1aWxkVHlwZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHR5cGVBZGFwdGVyOwotCXByaXZhdGUgQ2FjaGVUeXBlIHR5cGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBTSVpFX0FEQVBURVIgPSBidWlsZFNpemVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gc2l6ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBJbnRlZ2VyIHNpemU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBTSEFSRURfQURBUFRFUiA9IGJ1aWxkU2hhcmVkQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHNoYXJlZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIHNoYXJlZDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IEVYUElSWV9BREFQVEVSID0gYnVpbGRFeHBpcnlBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZXhwaXJ5QWRhcHRlcjsKLQlwcml2YXRlIEludGVnZXIgZXhwaXJ5OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gQUxXQVlTX1JFRlJFU0hfQURBUFRFUiA9IGJ1aWxkQWx3YXlzUmVmcmVzaEFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhbHdheXNSZWZyZXNoQWRhcHRlcjsKLQlwcml2YXRlIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBleHBpcnlUaW1lT2ZEYXk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBSRUZSRVNIX09OTFlfSUZfTkVXRVJfQURBUFRFUiA9IGJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VyQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHJlZnJlc2hPbmx5SWZOZXdlckFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIGFsd2F5c1JlZnJlc2g7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBESVNBQkxFX0hJVFNfQURBUFRFUiA9IGJ1aWxkRGlzYWJsZUhpdHNBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGlzYWJsZUhpdHNBZGFwdGVyOwotCXByaXZhdGUgQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IENPT1JESU5BVElPTl9UWVBFX0FEQVBURVIgPSBidWlsZENvb3JkaW5hdGlvblR5cGVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjb29yZGluYXRpb25UeXBlQWRhcHRlcjsKLQlwcml2YXRlIEJvb2xlYW4gZGlzYWJsZUhpdHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIEVYUElSWV9USU1FX09GX0RBWV9BREFQVEVSID0gYnVpbGRFeHBpcnlUaW1lT2ZEYXlBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIgZXhwaXJ5VGltZU9mRGF5QWRhcHRlcjsKLQlwcml2YXRlIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlOwotCi0KLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnR5cGVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0eXBlLCBUWVBFX0FEQVBURVIpOwotCQl0aGlzLnNpemVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odHlwZSwgU0laRV9BREFQVEVSKTsKLQkJdGhpcy5zaGFyZWRBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odHlwZSwgU0hBUkVEX0FEQVBURVIpOwotCQl0aGlzLmV4cGlyeUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPih0eXBlLCBFWFBJUllfQURBUFRFUik7Ci0JCXRoaXMuYWx3YXlzUmVmcmVzaEFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0eXBlLCBBTFdBWVNfUkVGUkVTSF9BREFQVEVSKTsKLQkJdGhpcy5yZWZyZXNoT25seUlmTmV3ZXJBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odHlwZSwgUkVGUkVTSF9PTkxZX0lGX05FV0VSX0FEQVBURVIpOwotCQl0aGlzLmRpc2FibGVIaXRzQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHR5cGUsIERJU0FCTEVfSElUU19BREFQVEVSKTsKLQkJdGhpcy5jb29yZGluYXRpb25UeXBlQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odHlwZSwgQ09PUkRJTkFUSU9OX1RZUEVfQURBUFRFUik7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5QWRhcHRlciA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodHlwZSwgRVhQSVJZX1RJTUVfT0ZfREFZX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnR5cGUgPSB0aGlzLmJ1aWxkVHlwZShhc3RSb290KTsKLQkJdGhpcy5zaXplID0gdGhpcy5idWlsZFNpemUoYXN0Um9vdCk7Ci0JCXRoaXMuc2hhcmVkID0gdGhpcy5idWlsZFNoYXJlZChhc3RSb290KTsKLQkJdGhpcy5leHBpcnkgPSB0aGlzLmJ1aWxkRXhwaXJ5KGFzdFJvb3QpOwotCQl0aGlzLmluaXRpYWxpemVFeHBpcnlUaW1lT2ZEYXkoYXN0Um9vdCk7Ci0JCXRoaXMuYWx3YXlzUmVmcmVzaCA9IHRoaXMuYnVpbGRBbHdheXNSZWZyZXNoKGFzdFJvb3QpOwotCQl0aGlzLnJlZnJlc2hPbmx5SWZOZXdlciA9IHRoaXMuYnVpbGRSZWZyZXNoT25seUlmTmV3ZXIoYXN0Um9vdCk7Ci0JCXRoaXMuZGlzYWJsZUhpdHMgPSB0aGlzLmJ1aWxkRGlzYWJsZUhpdHMoYXN0Um9vdCk7Ci0JCXRoaXMuY29vcmRpbmF0aW9uVHlwZSA9IHRoaXMuYnVpbGRDb29yZGluYXRpb25UeXBlKGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRXhwaXJ5VGltZU9mRGF5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheUFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihhc3RSb290KSAhPSBudWxsKSB7Ci0JCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IHRoaXMuYnVpbGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJCXRoaXMuZXhwaXJ5VGltZU9mRGF5LmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jVHlwZSh0aGlzLmJ1aWxkVHlwZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY1NpemUodGhpcy5idWlsZFNpemUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNTaGFyZWQodGhpcy5idWlsZFNoYXJlZChhc3RSb290KSk7Ci0JCXRoaXMuc3luY0V4cGlyeSh0aGlzLmJ1aWxkRXhwaXJ5KGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jRXhwaXJ5VGltZU9mRGF5KGFzdFJvb3QpOwotCQl0aGlzLnN5bmNBbHdheXNSZWZyZXNoKHRoaXMuYnVpbGRBbHdheXNSZWZyZXNoKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jUmVmcmVzaE9ubHlJZk5ld2VyKHRoaXMuYnVpbGRSZWZyZXNoT25seUlmTmV3ZXIoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNEaXNhYmxlSGl0cyh0aGlzLmJ1aWxkRGlzYWJsZUhpdHMoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNDb29yZGluYXRpb25UeXBlKHRoaXMuYnVpbGRDb29yZGluYXRpb25UeXBlKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDYWNoZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdHlwZQotCXB1YmxpYyBDYWNoZVR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKENhY2hlVHlwZSB0eXBlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnR5cGUsIHR5cGUpKSB7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy50eXBlQWRhcHRlci5zZXRWYWx1ZShDYWNoZVR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKHR5cGUpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZShDYWNoZVR5cGUgYXN0VHlwZSkgewotCQlDYWNoZVR5cGUgb2xkID0gdGhpcy50eXBlOwotCQl0aGlzLnR5cGUgPSBhc3RUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCBhc3RUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hlVHlwZSBidWlsZFR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIENhY2hlVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLnR5cGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShUWVBFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIHNpemUKLQlwdWJsaWMgSW50ZWdlciBnZXRTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zaXplOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNpemUoSW50ZWdlciBzaXplKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnNpemUsIHNpemUpKSB7Ci0JCQl0aGlzLnNpemUgPSBzaXplOwotCQkJdGhpcy5zaXplQWRhcHRlci5zZXRWYWx1ZShzaXplKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jU2l6ZShJbnRlZ2VyIGFzdFNpemUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnNpemU7Ci0JCXRoaXMuc2l6ZSA9IGFzdFNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSVpFX1BST1BFUlRZLCBvbGQsIGFzdFNpemUpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZFNpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTaXplVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoU0laRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBzaGFyZWQKLQlwdWJsaWMgQm9vbGVhbiBnZXRTaGFyZWQoKSB7Ci0JCXJldHVybiB0aGlzLnNoYXJlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaGFyZWQoQm9vbGVhbiBzaGFyZWQpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuc2hhcmVkLCBzaGFyZWQpKSB7Ci0JCQl0aGlzLnNoYXJlZCA9IHNoYXJlZDsKLQkJCXRoaXMuc2hhcmVkQWRhcHRlci5zZXRWYWx1ZShzaGFyZWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNTaGFyZWQoQm9vbGVhbiBhc3RTaGFyZWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNoYXJlZDsKLQkJdGhpcy5zaGFyZWQgPSBhc3RTaGFyZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSEFSRURfUFJPUEVSVFksIG9sZCwgYXN0U2hhcmVkKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRTaGFyZWQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuc2hhcmVkQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNoYXJlZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFNIQVJFRF9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBleHBpcnkKLQlwdWJsaWMgSW50ZWdlciBnZXRFeHBpcnkoKSB7Ci0JCXJldHVybiB0aGlzLmV4cGlyeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeHBpcnkoSW50ZWdlciBleHBpcnkpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuZXhwaXJ5LCBleHBpcnkpKSB7Ci0JCQl0aGlzLmV4cGlyeSA9IGV4cGlyeTsKLQkJCXRoaXMuZXhwaXJ5QWRhcHRlci5zZXRWYWx1ZShleHBpcnkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNFeHBpcnkoSW50ZWdlciBhc3RFeHBpcnkpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmV4cGlyeTsKLQkJdGhpcy5leHBpcnkgPSBhc3RFeHBpcnk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWFBJUllfUFJPUEVSVFksIG9sZCwgYXN0RXhwaXJ5KTsKLQl9Ci0KLQlwcml2YXRlIEludGVnZXIgYnVpbGRFeHBpcnkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZXhwaXJ5QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEV4cGlyeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKEVYUElSWV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBleHBpcnkgdGltZSBvZiBkYXkKLQlwdWJsaWMgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGdldEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIHRoaXMuZXhwaXJ5VGltZU9mRGF5OwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gYWRkRXhwaXJ5VGltZU9mRGF5KCkgewotCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXkgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiJ2V4cGlyeVRpbWVPZkRheScgZWxlbWVudCBhbHJlYWR5IGV4aXN0czogIiArIHRoaXMuZXhwaXJ5VGltZU9mRGF5KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gdGhpcy5idWlsZEV4cGlyeVRpbWVPZkRheSgpOwotCQl0aGlzLmV4cGlyeVRpbWVPZkRheS5uZXdBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmV4cGlyeVRpbWVPZkRheTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCInZXhwaXJ5VGltZU9mRGF5JyBlbGVtZW50IGRvZXMgbm90IGV4aXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmV4cGlyeVRpbWVPZkRheS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBidWlsZEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24odGhpcywgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBFWFBJUllfVElNRV9PRl9EQVlfQURBUFRFUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNFeHBpcnlUaW1lT2ZEYXkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5QWRhcHRlci5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpID09IG51bGwpIHsKLQkJCXRoaXMuc3luY0V4cGlyeVRpbWVPZkRheV8obnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXkgPT0gbnVsbCkgewotCQkJCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0b2QgPSB0aGlzLmJ1aWxkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCQkJdG9kLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCQkJdGhpcy5zeW5jRXhwaXJ5VGltZU9mRGF5Xyh0b2QpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmV4cGlyeVRpbWVPZkRheS5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0V4cGlyeVRpbWVPZkRheV8oRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGFzdEV4cGlyeVRpbWVPZkRheSkgewotCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gb2xkID0gdGhpcy5leHBpcnlUaW1lT2ZEYXk7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gYXN0RXhwaXJ5VGltZU9mRGF5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZLCBvbGQsIGFzdEV4cGlyeVRpbWVPZkRheSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRFeHBpcnlUaW1lT2ZEYXlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ly9UT0RPIHJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoRVhQSVJZX1RJTUVfT0ZfREFZX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIGFsd2F5cyByZWZyZXNoCi0JcHVibGljIEJvb2xlYW4gZ2V0QWx3YXlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIHRoaXMuYWx3YXlzUmVmcmVzaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4gYWx3YXlzUmVmcmVzaCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5hbHdheXNSZWZyZXNoLCBhbHdheXNSZWZyZXNoKSkgewotCQkJdGhpcy5hbHdheXNSZWZyZXNoID0gYWx3YXlzUmVmcmVzaDsKLQkJCXRoaXMuYWx3YXlzUmVmcmVzaEFkYXB0ZXIuc2V0VmFsdWUoYWx3YXlzUmVmcmVzaCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0Fsd2F5c1JlZnJlc2goQm9vbGVhbiBhc3RBbHdheXNSZWZyZXNoKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5hbHdheXNSZWZyZXNoOwotCQl0aGlzLmFsd2F5c1JlZnJlc2ggPSBhc3RBbHdheXNSZWZyZXNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFksIG9sZCwgYXN0QWx3YXlzUmVmcmVzaCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkQWx3YXlzUmVmcmVzaChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5hbHdheXNSZWZyZXNoQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEFsd2F5c1JlZnJlc2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShBTFdBWVNfUkVGUkVTSF9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiByZWZyZXNoIG9ubHkgaWYgbmV3ZXIKLQlwdWJsaWMgQm9vbGVhbiBnZXRSZWZyZXNoT25seUlmTmV3ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnJlZnJlc2hPbmx5SWZOZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyLCByZWZyZXNoT25seUlmTmV3ZXIpKSB7Ci0JCQl0aGlzLnJlZnJlc2hPbmx5SWZOZXdlciA9IHJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJCXRoaXMucmVmcmVzaE9ubHlJZk5ld2VyQWRhcHRlci5zZXRWYWx1ZShyZWZyZXNoT25seUlmTmV3ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbiBhc3RSZWZyZXNoT25seUlmTmV3ZXIpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJdGhpcy5yZWZyZXNoT25seUlmTmV3ZXIgPSBhc3RSZWZyZXNoT25seUlmTmV3ZXI7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFksIG9sZCwgYXN0UmVmcmVzaE9ubHlJZk5ld2VyKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRSZWZyZXNoT25seUlmTmV3ZXIoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlZnJlc2hPbmx5SWZOZXdlclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFJFRlJFU0hfT05MWV9JRl9ORVdFUl9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBkaXNhYmxlIGhpdHMKLQlwdWJsaWMgQm9vbGVhbiBnZXREaXNhYmxlSGl0cygpIHsKLQkJcmV0dXJuIHRoaXMuZGlzYWJsZUhpdHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZUhpdHMoQm9vbGVhbiBkaXNhYmxlSGl0cykgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5kaXNhYmxlSGl0cywgZGlzYWJsZUhpdHMpKSB7Ci0JCQl0aGlzLmRpc2FibGVIaXRzID0gZGlzYWJsZUhpdHM7Ci0JCQl0aGlzLmRpc2FibGVIaXRzQWRhcHRlci5zZXRWYWx1ZShkaXNhYmxlSGl0cyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0Rpc2FibGVIaXRzKEJvb2xlYW4gYXN0RGlzYWJsZUhpdHMpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmRpc2FibGVIaXRzOwotCQl0aGlzLmRpc2FibGVIaXRzID0gYXN0RGlzYWJsZUhpdHM7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNBQkxFX0hJVFNfUFJPUEVSVFksIG9sZCwgYXN0RGlzYWJsZUhpdHMpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZERpc2FibGVIaXRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmRpc2FibGVIaXRzQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERpc2FibGVzSGl0c1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKERJU0FCTEVfSElUU19BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBjb29yZGluYXRpb24gdHlwZQotCXB1YmxpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0Q29vcmRpbmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmNvb3JkaW5hdGlvblR5cGUsIGNvb3JkaW5hdGlvblR5cGUpKSB7Ci0JCQl0aGlzLmNvb3JkaW5hdGlvblR5cGUgPSBjb29yZGluYXRpb25UeXBlOwotCQkJdGhpcy5jb29yZGluYXRpb25UeXBlQWRhcHRlci5zZXRWYWx1ZShDYWNoZUNvb3JkaW5hdGlvblR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKGNvb3JkaW5hdGlvblR5cGUpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jQ29vcmRpbmF0aW9uVHlwZShDYWNoZUNvb3JkaW5hdGlvblR5cGUgYXN0Q29vcmRpbmF0aW9uVHlwZSkgewotCQlDYWNoZUNvb3JkaW5hdGlvblR5cGUgb2xkID0gdGhpcy5jb29yZGluYXRpb25UeXBlOwotCQl0aGlzLmNvb3JkaW5hdGlvblR5cGUgPSBhc3RDb29yZGluYXRpb25UeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCBhc3RDb29yZGluYXRpb25UeXBlKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBidWlsZENvb3JkaW5hdGlvblR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIENhY2hlQ29vcmRpbmF0aW9uVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmNvb3JkaW5hdGlvblR5cGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvb3JkaW5hdGlvblR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShDT09SRElOQVRJT05fVFlQRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNBQ0hFX19UWVBFKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZFNpemVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNBQ0hFX19TSVpFLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFNoYXJlZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX1NIQVJFRCwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRFeHBpcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNBQ0hFX19FWFBJUlksIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkQWx3YXlzUmVmcmVzaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX0FMV0FZU19SRUZSRVNILCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFJlZnJlc2hPbmx5SWZOZXdlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGREaXNhYmxlSGl0c0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX0RJU0FCTEVfSElUUywgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZENvb3JkaW5hdGlvblR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNBQ0hFX19DT09SRElOQVRJT05fVFlQRSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZEV4cGlyeVRpbWVPZkRheUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNBQ0hFX19FWFBJUllfVElNRV9PRl9EQVksIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDY4NTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DaGFuZ2VUcmFja2luZwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb248VHlwZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZTsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHR5cGUsIFZBTFVFX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgQ2hhbmdlVHJhY2tpbmdUeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoQ2hhbmdlVHJhY2tpbmdUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZSh2YWx1ZSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShDaGFuZ2VUcmFja2luZ1R5cGUgYXN0VmFsdWUpIHsKLQkJQ2hhbmdlVHJhY2tpbmdUeXBlIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZVRyYWNraW5nVHlwZSBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBDaGFuZ2VUcmFja2luZ1R5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkdfX1ZBTFVFLCBmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYjRjZDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVyc2lvblZhbHVlCi0gKi8KLWZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxNZW1iZXI+Ci0JaW1wbGVtZW50cyBOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbgotewotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYXRhVmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYXRhVmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIGRhdGFWYWx1ZTsKLQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBvYmplY3RWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG9iamVjdFZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBvYmplY3RWYWx1ZTsKLQotCi0JU291cmNlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBpZGFhLCBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGlkYWEpKTsKLQkJdGhpcy5kYXRhVmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkRGF0YVZhbHVlQWRhcHRlcihpZGFhKTsKLQkJdGhpcy5kYXRhVmFsdWVBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIodGhpcy5kYXRhVmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm9iamVjdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZE9iamVjdFZhbHVlQWRhcHRlcihpZGFhKTsKLQkJdGhpcy5vYmplY3RWYWx1ZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcih0aGlzLm9iamVjdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGREYXRhVmFsdWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcikgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciwgRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRSwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE9iamVjdFZhbHVlQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLmRhdGFWYWx1ZSA9IHRoaXMuYnVpbGREYXRhVmFsdWUoYXN0Um9vdCk7Ci0JCXRoaXMub2JqZWN0VmFsdWUgPSB0aGlzLmJ1aWxkT2JqZWN0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY0RhdGFWYWx1ZSh0aGlzLmJ1aWxkRGF0YVZhbHVlKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jT2JqZWN0VmFsdWUodGhpcy5idWlsZE9iamVjdFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIChJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIpIHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5kYXRhVmFsdWUpOwotCQlzYi5hcHBlbmQoIj0+Iik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMub2JqZWN0VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGRhdGEgdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldERhdGFWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFWYWx1ZShTdHJpbmcgZGF0YVZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmRhdGFWYWx1ZSwgZGF0YVZhbHVlKSkgewotCQkJdGhpcy5kYXRhVmFsdWUgPSBkYXRhVmFsdWU7Ci0JCQl0aGlzLmRhdGFWYWx1ZUFkYXB0ZXIuc2V0VmFsdWUoZGF0YVZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRGF0YVZhbHVlKFN0cmluZyBhc3REYXRhVmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGF0YVZhbHVlOwotCQl0aGlzLmRhdGFWYWx1ZSA9IGFzdERhdGFWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0RGF0YVZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERhdGFWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kYXRhVmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RGF0YVZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5kYXRhVmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIG9iamVjdCB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9iamVjdFZhbHVlKFN0cmluZyBvYmplY3RWYWx1ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5vYmplY3RWYWx1ZSwgb2JqZWN0VmFsdWUpKSB7Ci0JCQl0aGlzLm9iamVjdFZhbHVlID0gb2JqZWN0VmFsdWU7Ci0JCQl0aGlzLm9iamVjdFZhbHVlQWRhcHRlci5zZXRWYWx1ZShvYmplY3RWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY09iamVjdFZhbHVlKFN0cmluZyBhc3RPYmplY3RWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5vYmplY3RWYWx1ZTsKLQkJdGhpcy5vYmplY3RWYWx1ZSA9IGFzdE9iamVjdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1ZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdE9iamVjdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE9iamVjdFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9iamVjdFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5vYmplY3RWYWx1ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKiBOZXN0YWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7Ci0JCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBvbGRDb252ZXJzaW9uVmFsdWUgPSAoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uKSBvbGRBbm5vdGF0aW9uOwotCQl0aGlzLnNldERhdGFWYWx1ZShvbGRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQl0aGlzLnNldE9iamVjdFZhbHVlKG9sZENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKLQkJdGhpcy5nZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKS5tb3ZlQW5ub3RhdGlvbihuZXdJbmRleCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXN0YXRpYyBOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBjcmVhdGVDb252ZXJzaW9uVmFsdWUoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24ocGFyZW50LCBtZW1iZXIsIGJ1aWxkQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbkFkYXB0ZXIoZGFhLCBpbmRleCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYSwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUywgaW5kZXgsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUUsIGZhbHNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjczMzE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0KLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGF0dHJpYnV0ZSwgVkFMVUVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbnZlcnRBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoU3RyaW5nIGFzdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gYXN0VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhWQUxVRV9BREFQVEVSLCBwb3MsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ09OVkVSVF9fVkFMVUUsIGZhbHNlLCBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2EyMjNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0ZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gQ09OVkVSVEVSX0NMQVNTX0FEQVBURVIgPSBidWlsZENvbnZlcnRlckNsYXNzQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gY29udmVydGVyQ2xhc3NBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIGNvbnZlcnRlckNsYXNzOwotCi0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzc05hbWU7Ci0KLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4obWVtYmVyLCBDT05WRVJURVJfQ0xBU1NfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMuY29udmVydGVyQ2xhc3MgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ2xhc3MoYXN0Um9vdCk7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzc05hbWUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzc05hbWUoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJdGhpcy5zeW5jQ29udmVydGVyQ2xhc3ModGhpcy5idWlsZENvbnZlcnRlckNsYXNzKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jRnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzc05hbWUodGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3NOYW1lKGFzdFJvb3QpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5DT05WRVJURVJfX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogY29udmVydGVyIGNsYXNzCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyQ2xhc3MoU3RyaW5nIGNvbnZlcnRlckNsYXNzKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmNvbnZlcnRlckNsYXNzLCBjb252ZXJ0ZXJDbGFzcykpIHsKLQkJCXRoaXMuY29udmVydGVyQ2xhc3MgPSBjb252ZXJ0ZXJDbGFzczsKLQkJCXRoaXMuY29udmVydGVyQ2xhc3NBZGFwdGVyLnNldFZhbHVlKGNvbnZlcnRlckNsYXNzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jQ29udmVydGVyQ2xhc3MoU3RyaW5nIGFzdENvbnZlcnRlckNsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNvbnZlcnRlckNsYXNzOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gYXN0Q29udmVydGVyQ2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfQ0xBU1NfUFJPUEVSVFksIG9sZCwgYXN0Q29udmVydGVyQ2xhc3MpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ29udmVydGVyQ2xhc3MoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ2xhc3NBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShDT05WRVJURVJfQ0xBU1NfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udmVydGVyQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKHRoaXMuY29udmVydGVyQ2xhc3MgIT0gbnVsbCkKLQkJCQkmJiBBU1RUb29scy50eXBlSXNTdWJUeXBlT2YodGhpcy5jb252ZXJ0ZXJDbGFzc0FkYXB0ZXIuZ2V0RXhwcmVzc2lvbihhc3RSb290KSwgaW50ZXJmYWNlTmFtZSk7Ci0JfQotCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIGNvbnZlcnRlciBjbGFzcyBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzc05hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzTmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzTmFtZTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfQ09OVkVSVEVSX0NMQVNTX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKHRoaXMuY29udmVydGVyQ2xhc3MgPT0gbnVsbCkgPyBudWxsIDogQVNUVG9vbHMucmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLmNvbnZlcnRlckNsYXNzQWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZENvbnZlcnRlckNsYXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNPTlZFUlRFUl9fQ09OVkVSVEVSX0NMQVNTLCBmYWxzZSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZkMjg3MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ3VzdG9taXplcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxUeXBlPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzc05hbWU7Ci0KLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0eXBlLCBWQUxVRV9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzc05hbWUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3NOYW1lKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzc05hbWUodGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzTmFtZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEN1c3RvbWl6ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoU3RyaW5nIGFzdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gYXN0VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGN1c3RvbWl6ZXJDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZU5hbWUsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSAhPSBudWxsKQotCQkJCSYmIEFTVFRvb2xzLnR5cGVJc1N1YlR5cGVPZih0aGlzLnZhbHVlQWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpLCBpbnRlcmZhY2VOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCBjdXN0b21pemVyIGNsYXNzIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3NOYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3NOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzTmFtZTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzc05hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyBudWxsIDogQVNUVG9vbHMucmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLnZhbHVlQWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNVU1RPTUlaRVJfX1ZBTFVFLCBmYWxzZSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjYxZjQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkV4aXN0ZW5jZUNoZWNraW5nCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxUeXBlPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgRXhpc3RlbmNlVHlwZSB2YWx1ZTsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHR5cGUsIFZBTFVFX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgRXhpc3RlbmNlVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoRXhpc3RlbmNlVHlwZSB2YWx1ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy52YWx1ZSwgdmFsdWUpKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZShFeGlzdGVuY2VUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZSh2YWx1ZSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShFeGlzdGVuY2VUeXBlIGFzdFZhbHVlKSB7Ci0JCUV4aXN0ZW5jZVR5cGUgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IGFzdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgRXhpc3RlbmNlVHlwZSBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBFeGlzdGVuY2VUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HX19WQUxVRSwgZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmNiNzhjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkpvaW5GZXRjaAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBKb2luRmV0Y2hUeXBlIHZhbHVlOwotCi0KLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYXR0cmlidXRlLCBWQUxVRV9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jVmFsdWUodGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSm9pbkZldGNoQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBKb2luRmV0Y2hUeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShKb2luRmV0Y2hUeXBlIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKEpvaW5GZXRjaFR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKHZhbHVlKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKEpvaW5GZXRjaFR5cGUgYXN0VmFsdWUpIHsKLQkJSm9pbkZldGNoVHlwZSBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gYXN0VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBKb2luRmV0Y2hUeXBlIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIEpvaW5GZXRjaFR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5KT0lOX0ZFVENIX19WQUxVRSwgZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Y2VhOTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk11dGFibGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIEJvb2xlYW4gdmFsdWU7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGF0dHJpYnV0ZSwgVkFMVUVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE11dGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIEJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShCb29sZWFuIGFzdFZhbHVlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IGFzdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLk1VVEFCTEVfX1ZBTFVFLCBmYWxzZSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTY0ZjY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydGVyCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5TdHJ1Y3RDb252ZXJ0ZXIKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlR5cGVDb252ZXJ0ZXIKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk9iamVjdFR5cGVDb252ZXJ0ZXIKLSAqLwotYWJzdHJhY3QgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb248TWVtYmVyPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KLXsKLQlmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZUFkYXB0ZXI7Ci0JU3RyaW5nIG5hbWU7Ci0JCQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JU291cmNlRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEpOwotCQl0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIHRoaXMuZ2V0TmFtZUVsZW1lbnROYW1lKCksIGZhbHNlKTsgLy8gZmFsc2UgPSBkbyBub3QgcmVtb3ZlIGFubm90YXRpb24gd2hlbiBlbXB0eQotCQl0aGlzLm5hbWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY05hbWUodGhpcy5idWlsZE5hbWUoYXN0Um9vdCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWUoU3RyaW5nIGFzdE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gYXN0TmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE92ZXJyaWRlQW5ub3RhdGlvbi5OQU1FX1BST1BFUlRZLCBvbGQsIGFzdE5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjU4ZDY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk9iamVjdFR5cGVDb252ZXJ0ZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBERUZBVUxUX09CSkVDVF9WQUxVRV9BREFQVEVSID0gYnVpbGREZWZhdWx0T2JqZWN0VmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkZWZhdWx0T2JqZWN0VmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZTsKLQotCXByaXZhdGUgZmluYWwgVmVjdG9yPE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVzID0gbmV3IFZlY3RvcjxOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4oKTsKLQlwcml2YXRlIGZpbmFsIENvbnZlcnNpb25WYWx1ZXNBbm5vdGF0aW9uQ29udGFpbmVyIGNvbnZlcnNpb25WYWx1ZXNDb250YWluZXIgPSBuZXcgQ29udmVyc2lvblZhbHVlc0Fubm90YXRpb25Db250YWluZXIoKTsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJc3VwZXIocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4obWVtYmVyLCBERUZBVUxUX09CSkVDVF9WQUxVRV9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWUgPSB0aGlzLmJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlKGFzdFJvb3QpOwotCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMuaW5pdGlhbGl6ZSh0aGlzLmNvbnZlcnNpb25WYWx1ZXNDb250YWluZXIsIGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY0RlZmF1bHRPYmplY3RWYWx1ZSh0aGlzLmJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlKGFzdFJvb3QpKTsKLQkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLnN5bmNocm9uaXplKHRoaXMuY29udmVyc2lvblZhbHVlc0NvbnRhaW5lciwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNvdXJjZU5hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTb3VyY2VCYXNlVHlwZUNvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldERhdGFUeXBlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0T2JqZWN0VHlwZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogZGVmYXVsdCBvYmplY3QgdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRPYmplY3RWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSwgZGVmYXVsdE9iamVjdFZhbHVlKSkgewotCQkJdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWUgPSBkZWZhdWx0T2JqZWN0VmFsdWU7Ci0JCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZUFkYXB0ZXIuc2V0VmFsdWUoZGVmYXVsdE9iamVjdFZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRGVmYXVsdE9iamVjdFZhbHVlKFN0cmluZyBhc3REZWZhdWx0T2JqZWN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlOwotCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IGFzdERlZmF1bHRPYmplY3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfT0JKRUNUX1ZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdERlZmF1bHRPYmplY3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWZhdWx0T2JqZWN0VmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERlZmF1bHRPYmplY3RWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKERFRkFVTFRfT0JKRUNUX1ZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIGNvbnZlcnNpb24gdmFsdWVzCi0JcHVibGljIExpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IGNvbnZlcnNpb25WYWx1ZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPih0aGlzLmNvbnZlcnNpb25WYWx1ZXMpOwotCX0KLQotCUl0ZXJhYmxlPE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBnZXROZXN0YWJsZUNvbnZlcnNpb25WYWx1ZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8TmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+KHRoaXMuY29udmVyc2lvblZhbHVlcyk7Ci0JfQotCi0JcHVibGljIGludCBjb252ZXJzaW9uVmFsdWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlcy5zaXplKCk7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZUF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWVzLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mQ29udmVyc2lvblZhbHVlKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBjb252ZXJzaW9uVmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlcy5pbmRleE9mKGNvbnZlcnNpb25WYWx1ZSk7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGFkZENvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbikgQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgsIHRoaXMuY29udmVyc2lvblZhbHVlc0NvbnRhaW5lcik7Ci0JfQotCi0JTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gYWRkQ29udmVyc2lvblZhbHVlXygpIHsKLQkJcmV0dXJuIHRoaXMuYWRkQ29udmVyc2lvblZhbHVlXyh0aGlzLmNvbnZlcnNpb25WYWx1ZXMuc2l6ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGFkZENvbnZlcnNpb25WYWx1ZV8oaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZSA9IHRoaXMuYnVpbGRDb252ZXJzaW9uVmFsdWUoaW5kZXgpOwotCQl0aGlzLmNvbnZlcnNpb25WYWx1ZXMuYWRkKGNvbnZlcnNpb25WYWx1ZSk7Ci0JCXJldHVybiBjb252ZXJzaW9uVmFsdWU7Ci0JfQotCi0Jdm9pZCBzeW5jQWRkQ29udmVyc2lvblZhbHVlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFzdEFubm90YXRpb24pIHsKLQkJaW50IGluZGV4ID0gdGhpcy5jb252ZXJzaW9uVmFsdWVzLnNpemUoKTsKLQkJTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gY29udmVyc2lvblZhbHVlID0gdGhpcy5hZGRDb252ZXJzaW9uVmFsdWVfKGluZGV4KTsKLQkJY29udmVyc2lvblZhbHVlLmluaXRpYWxpemUoKENvbXBpbGF0aW9uVW5pdCkgYXN0QW5ub3RhdGlvbi5nZXRSb290KCkpOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoQ09OVkVSU0lPTl9WQUxVRVNfTElTVCwgaW5kZXgsIGNvbnZlcnNpb25WYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBidWlsZENvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFNvdXJjZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5jcmVhdGVDb252ZXJzaW9uVmFsdWUodGhpcywgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCB0aGlzLmRhYSwgaW5kZXgpOwotCX0KLQotCXZvaWQgY29udmVyc2lvblZhbHVlQWRkZWQoaW50IGluZGV4LCBOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBjb252ZXJzaW9uVmFsdWUpIHsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKENPTlZFUlNJT05fVkFMVUVTX0xJU1QsIGluZGV4LCBjb252ZXJzaW9uVmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVDb252ZXJzaW9uVmFsdWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLm1vdmVOZXN0ZWRBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5jb252ZXJzaW9uVmFsdWVzQ29udGFpbmVyKTsKLQl9Ci0KLQlOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBtb3ZlQ29udmVyc2lvblZhbHVlXyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5jb252ZXJzaW9uVmFsdWVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpLmdldCh0YXJnZXRJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29udmVyc2lvblZhbHVlKGludCBpbmRleCkgewotCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMucmVtb3ZlTmVzdGVkQW5ub3RhdGlvbihpbmRleCwgdGhpcy5jb252ZXJzaW9uVmFsdWVzQ29udGFpbmVyKTsKLQl9Ci0KLQlOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiByZW1vdmVDb252ZXJzaW9uVmFsdWVfKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWVzLnJlbW92ZShpbmRleCk7Ci0JfQotCi0Jdm9pZCBzeW5jUmVtb3ZlQ29udmVyc2lvblZhbHVlcyhpbnQgaW5kZXgpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KGluZGV4LCB0aGlzLmNvbnZlcnNpb25WYWx1ZXMsIENPTlZFUlNJT05fVkFMVUVTX0xJU1QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUUsIGZhbHNlLCBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJzaW9uIHZhbHVlIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBhZGFwdCB0aGUgQW5ub3RhdGlvbkNvbnRhaW5lciBpbnRlcmZhY2UgdG8gdGhlIG9iamVjdCB0eXBlIGNvbnZlcnRlcidzCi0JICogY29udmVyc2lvbiB2YWx1ZXMKLQkgKi8KLQljbGFzcyBDb252ZXJzaW9uVmFsdWVzQW5ub3RhdGlvbkNvbnRhaW5lcgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25Db250YWluZXI8TmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IAotCXsKLQkJcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEFzdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXJldHVybiBTb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLnRoaXMuZ2V0QXN0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUzsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGVkQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYWJsZTxOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gZ2V0TmVzdGVkQW5ub3RhdGlvbnMoKSB7Ci0JCQlyZXR1cm4gU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi50aGlzLmdldE5lc3RhYmxlQ29udmVyc2lvblZhbHVlcygpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7Ci0JCQlyZXR1cm4gU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi50aGlzLmNvbnZlcnNpb25WYWx1ZXNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gYWRkTmVzdGVkQW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiBTb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLnRoaXMuYWRkQ29udmVyc2lvblZhbHVlXygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3luY0FkZE5lc3RlZEFubm90YXRpb24oQW5ub3RhdGlvbiBhc3RBbm5vdGF0aW9uKSB7Ci0JCQlTb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLnRoaXMuc3luY0FkZENvbnZlcnNpb25WYWx1ZShhc3RBbm5vdGF0aW9uKTsKLQkJfQotCi0JCXB1YmxpYyBOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBtb3ZlTmVzdGVkQW5ub3RhdGlvbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJcmV0dXJuIFNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24udGhpcy5tb3ZlQ29udmVyc2lvblZhbHVlXyh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIHJlbW92ZU5lc3RlZEFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi50aGlzLnJlbW92ZUNvbnZlcnNpb25WYWx1ZV8oaW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3luY1JlbW92ZU5lc3RlZEFubm90YXRpb25zKGludCBpbmRleCkgewotCQkJU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi50aGlzLnN5bmNSZW1vdmVDb252ZXJzaW9uVmFsdWVzKGluZGV4KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYmIyMWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlByaW1hcnlLZXkKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb248VHlwZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiAKLQkJCT0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQkKLQkKLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBub3RoaW5nIHRvIHN5bmMKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDQ2ZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Qcml2YXRlT3duZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBub3RoaW5nIHRvIHN5bmMKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjAzOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5SZWFkT25seQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb248VHlwZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0KLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm90aGluZyB0byBzeW5jCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMjc0YzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRUcmFuc2Zvcm1lckNsYXNzRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSX19UUkFOU0ZPUk1FUl9DTEFTUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSX19NRVRIT0Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOThlOGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuU3RydWN0Q29udmVydGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IENPTlZFUlRFUl9BREFQVEVSID0gYnVpbGRDb252ZXJ0ZXJBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjb252ZXJ0ZXJBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIGNvbnZlcnRlcjsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5jb252ZXJ0ZXJBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihtZW1iZXIsIENPTlZFUlRFUl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5jb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY0NvbnZlcnRlcih0aGlzLmJ1aWxkQ29udmVydGVyKGFzdFJvb3QpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSX19OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGNvbnZlcnRlcgotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXIpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuY29udmVydGVyLCBjb252ZXJ0ZXIpKSB7Ci0JCQl0aGlzLmNvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJCXRoaXMuY29udmVydGVyQWRhcHRlci5zZXRWYWx1ZShjb252ZXJ0ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNDb252ZXJ0ZXIoU3RyaW5nIGFzdENvbnZlcnRlcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5jb252ZXJ0ZXI7Ci0JCXRoaXMuY29udmVydGVyID0gYXN0Q29udmVydGVyOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX1BST1BFUlRZLCBvbGQsIGFzdENvbnZlcnRlcik7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRDb252ZXJ0ZXIoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRlclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKENPTlZFUlRFUl9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZENvbnZlcnRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSX19DT05WRVJURVIsIGZhbHNlLCBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjZlYWQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVGltZU9mRGF5Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb248VHlwZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbgotewotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gaG91ckRlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBob3VyQWRhcHRlcjsKLQlwcml2YXRlIEludGVnZXIgaG91cjsKLQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gbWludXRlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IG1pbnV0ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBJbnRlZ2VyIG1pbnV0ZTsKLQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IHNlY29uZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBJbnRlZ2VyIHNlY29uZDsKLQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gbWlsbGlzZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gbWlsbGlzZWNvbmRBZGFwdGVyOwotCXByaXZhdGUgSW50ZWdlciBtaWxsaXNlY29uZDsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIGRhYSk7Ci0JCXRoaXMuaG91ckRlY2xhcmF0aW9uQWRhcHRlciA9IGJ1aWxkSG91ckFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5ob3VyQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHR5cGUsIHRoaXMuaG91ckRlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubWludXRlRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRNaW51dGVBZGFwdGVyKGRhYSk7Ci0JCXRoaXMubWludXRlQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHR5cGUsIHRoaXMubWludXRlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5zZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZFNlY29uZEFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5zZWNvbmRBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odHlwZSwgdGhpcy5zZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm1pbGxpc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRNaWxsaXNlY29uZEFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5taWxsaXNlY29uZEFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPih0eXBlLCB0aGlzLm1pbGxpc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5ob3VyID0gdGhpcy5idWlsZEhvdXIoYXN0Um9vdCk7Ci0JCXRoaXMubWludXRlID0gdGhpcy5idWlsZE1pbnV0ZShhc3RSb290KTsKLQkJdGhpcy5zZWNvbmQgPSB0aGlzLmJ1aWxkU2Vjb25kKGFzdFJvb3QpOwotCQl0aGlzLm1pbGxpc2Vjb25kID0gdGhpcy5idWlsZE1pbGxpc2Vjb25kKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNIb3VyKHRoaXMuYnVpbGRIb3VyKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jTWludXRlKHRoaXMuYnVpbGRNaW51dGUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNTZWNvbmQodGhpcy5idWlsZFNlY29uZChhc3RSb290KSk7Ci0JCXRoaXMuc3luY01pbGxpc2Vjb25kKHRoaXMuYnVpbGRNaWxsaXNlY29uZChhc3RSb290KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRpbWVPZkRheUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogaG91cgotCXB1YmxpYyBJbnRlZ2VyIGdldEhvdXIoKSB7Ci0JCXJldHVybiB0aGlzLmhvdXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SG91cihJbnRlZ2VyIGhvdXIpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuaG91ciwgaG91cikpIHsKLQkJCXRoaXMuaG91ciA9IGhvdXI7Ci0JCQl0aGlzLmhvdXJBZGFwdGVyLnNldFZhbHVlKGhvdXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNIb3VyKEludGVnZXIgYXN0SG91cikgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuaG91cjsKLQkJdGhpcy5ob3VyID0gYXN0SG91cjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhPVVJfUFJPUEVSVFksIG9sZCwgYXN0SG91cik7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkSG91cihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5ob3VyQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEhvdXJUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmhvdXJEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIG1pbnV0ZQotCXB1YmxpYyBJbnRlZ2VyIGdldE1pbnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMubWludXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1pbnV0ZShJbnRlZ2VyIG1pbnV0ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5taW51dGUsIG1pbnV0ZSkpIHsKLQkJCXRoaXMubWludXRlID0gbWludXRlOwotCQkJdGhpcy5taW51dGVBZGFwdGVyLnNldFZhbHVlKG1pbnV0ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY01pbnV0ZShJbnRlZ2VyIGFzdE1pbnV0ZSkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMubWludXRlOwotCQl0aGlzLm1pbnV0ZSA9IGFzdE1pbnV0ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1JTlVURV9QUk9QRVJUWSwgb2xkLCBhc3RNaW51dGUpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZE1pbnV0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5taW51dGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWludXRlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5taW51dGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIHNlY29uZAotCXB1YmxpYyBJbnRlZ2VyIGdldFNlY29uZCgpIHsKLQkJcmV0dXJuIHRoaXMuc2Vjb25kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlY29uZChJbnRlZ2VyIG5ld1NlY29uZCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5zZWNvbmQsIG5ld1NlY29uZCkpIHsKLQkJCXRoaXMuc2Vjb25kID0gbmV3U2Vjb25kOwotCQkJdGhpcy5zZWNvbmRBZGFwdGVyLnNldFZhbHVlKG5ld1NlY29uZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1NlY29uZChJbnRlZ2VyIGFzdFNlY29uZCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc2Vjb25kOwotCQl0aGlzLnNlY29uZCA9IGFzdFNlY29uZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFQ09ORF9QUk9QRVJUWSwgb2xkLCBhc3RTZWNvbmQpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZFNlY29uZChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmRBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2Vjb25kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5zZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIG1pbGxpc2Vjb25kCi0JcHVibGljIEludGVnZXIgZ2V0TWlsbGlzZWNvbmQoKSB7Ci0JCXJldHVybiB0aGlzLm1pbGxpc2Vjb25kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1pbGxpc2Vjb25kKEludGVnZXIgbWlsbGlzZWNvbmQpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubWlsbGlzZWNvbmQsIG1pbGxpc2Vjb25kKSkgewotCQkJdGhpcy5taWxsaXNlY29uZCA9IG1pbGxpc2Vjb25kOwotCQkJdGhpcy5taWxsaXNlY29uZEFkYXB0ZXIuc2V0VmFsdWUobWlsbGlzZWNvbmQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNNaWxsaXNlY29uZChJbnRlZ2VyIGFzdE1pbGxpc2Vjb25kKSB7Ci0JCUludGVnZXIgb2xkTWlsbGlzZWNvbmQgPSB0aGlzLm1pbGxpc2Vjb25kOwotCQl0aGlzLm1pbGxpc2Vjb25kID0gYXN0TWlsbGlzZWNvbmQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNSUxMSVNFQ09ORF9QUk9QRVJUWSwgb2xkTWlsbGlzZWNvbmQsIGFzdE1pbGxpc2Vjb25kKTsKLQl9Ci0KLQlwcml2YXRlIEludGVnZXIgYnVpbGRNaWxsaXNlY29uZChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5taWxsaXNlY29uZEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRNaWxsaXNlY29uZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubWlsbGlzZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZEhvdXJBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGRhYSwgRWNsaXBzZUxpbmsuVElNRV9PRl9EQVlfX0hPVVIsIGZhbHNlLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZE1pbnV0ZUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZGFhLCBFY2xpcHNlTGluay5USU1FX09GX0RBWV9fTUlOVVRFLCBmYWxzZSwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRTZWNvbmRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGRhYSwgRWNsaXBzZUxpbmsuVElNRV9PRl9EQVlfX1NFQ09ORCwgZmFsc2UsIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkTWlsbGlzZWNvbmRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGRhYSwgRWNsaXBzZUxpbmsuVElNRV9PRl9EQVlfX01JTExJU0VDT05ELCBmYWxzZSwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Q3OWY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHJhbnNmb3JtYXRpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBGRVRDSF9BREFQVEVSID0gYnVpbGRGZXRjaEFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZldGNoQWRhcHRlcjsKLQlwcml2YXRlIEZldGNoVHlwZSBmZXRjaDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IE9QVElPTkFMX0FEQVBURVIgPSBidWlsZE9wdGlvbmFsQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IG9wdGlvbmFsQWRhcHRlcjsKLQlwcml2YXRlIEJvb2xlYW4gb3B0aW9uYWw7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5mZXRjaEFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGF0dHJpYnV0ZSwgRkVUQ0hfQURBUFRFUik7Ci0JCXRoaXMub3B0aW9uYWxBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oYXR0cmlidXRlLCBPUFRJT05BTF9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5vcHRpb25hbCA9IHRoaXMuYnVpbGRPcHRpb25hbChhc3RSb290KTsKLQkJdGhpcy5mZXRjaCA9IHRoaXMuYnVpbGRGZXRjaChhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jT3B0aW9uYWwodGhpcy5idWlsZE9wdGlvbmFsKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jRmV0Y2godGhpcy5idWlsZEZldGNoKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmZldGNoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGZldGNoCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuZmV0Y2g7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIGZldGNoKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmZldGNoLCBmZXRjaCkpIHsKLQkJCXRoaXMuZmV0Y2ggPSBmZXRjaDsKLQkJCXRoaXMuZmV0Y2hBZGFwdGVyLnNldFZhbHVlKEZldGNoVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUoZmV0Y2gpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRmV0Y2goRmV0Y2hUeXBlIGFzdEZldGNoKSB7Ci0JCUZldGNoVHlwZSBvbGQgPSB0aGlzLmZldGNoOwotCQl0aGlzLmZldGNoID0gYXN0RmV0Y2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGRVRDSF9QUk9QRVJUWSwgb2xkLCBhc3RGZXRjaCk7Ci0JfQotCi0JcHJpdmF0ZSBGZXRjaFR5cGUgYnVpbGRGZXRjaChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gRmV0Y2hUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZmV0Y2hBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEZldGNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoRkVUQ0hfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogb3B0aW9uYWwKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5vcHRpb25hbCwgb3B0aW9uYWwpKSB7Ci0JCQl0aGlzLm9wdGlvbmFsID0gb3B0aW9uYWw7Ci0JCQl0aGlzLm9wdGlvbmFsQWRhcHRlci5zZXRWYWx1ZShvcHRpb25hbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY09wdGlvbmFsKEJvb2xlYW4gYXN0T3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLm9wdGlvbmFsOwotCQl0aGlzLm9wdGlvbmFsID0gYXN0T3B0aW9uYWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPUFRJT05BTF9QUk9QRVJUWSwgb2xkLCBhc3RPcHRpb25hbCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkT3B0aW9uYWwoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWxBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T3B0aW9uYWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShPUFRJT05BTF9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRPcHRpb25hbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT05fX09QVElPTkFMLCBmYWxzZSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEZldGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTl9fRkVUQ0gsIGZhbHNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZWFiN2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Xcml0ZVRyYW5zZm9ybWVyCi0gKi8KLWFic3RyYWN0IGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi17Ci0JZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0cmFuc2Zvcm1lckNsYXNzRGVjbGFyYXRpb25BZGFwdGVyOwotCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRyYW5zZm9ybWVyQ2xhc3NBZGFwdGVyOwotCVN0cmluZyB0cmFuc2Zvcm1lckNsYXNzOwotCi0JZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBtZXRob2REZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbWV0aG9kQWRhcHRlcjsKLQlTdHJpbmcgbWV0aG9kOwotCi0KLQlTb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIGRhYSk7Ci0JCXRoaXMudHJhbnNmb3JtZXJDbGFzc0RlY2xhcmF0aW9uQWRhcHRlciA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsIHRoaXMuZ2V0VHJhbnNmb3JtZXJDbGFzc0VsZW1lbnROYW1lKCksIGZhbHNlLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJdGhpcy50cmFuc2Zvcm1lckNsYXNzQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYXR0cmlidXRlLCB0aGlzLnRyYW5zZm9ybWVyQ2xhc3NEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCi0JCXRoaXMubWV0aG9kRGVjbGFyYXRpb25BZGFwdGVyID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCB0aGlzLmdldE1ldGhvZEVsZW1lbnROYW1lKCksIGZhbHNlKTsKLQkJdGhpcy5tZXRob2RBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhdHRyaWJ1dGUsIHRoaXMubWV0aG9kRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudHJhbnNmb3JtZXJDbGFzcyA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1lckNsYXNzKGFzdFJvb3QpOwotCQl0aGlzLm1ldGhvZCA9IHRoaXMuYnVpbGRNZXRob2QoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1RyYW5zZm9ybWVyQ2xhc3ModGhpcy5idWlsZFRyYW5zZm9ybWVyQ2xhc3MoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNNZXRob2QodGhpcy5idWlsZE1ldGhvZChhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy50cmFuc2Zvcm1lckNsYXNzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVHJhbnNmb3JtZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHRyYW5zZm9ybWVyIGNsYXNzCi0JcHVibGljIFN0cmluZyBnZXRUcmFuc2Zvcm1lckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lckNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRyYW5zZm9ybWVyQ2xhc3MoU3RyaW5nIHRyYW5zZm9ybWVyQ2xhc3MpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudHJhbnNmb3JtZXJDbGFzcywgdHJhbnNmb3JtZXJDbGFzcykpIHsKLQkJCXRoaXMudHJhbnNmb3JtZXJDbGFzcyA9IHRyYW5zZm9ybWVyQ2xhc3M7Ci0JCQl0aGlzLnRyYW5zZm9ybWVyQ2xhc3NBZGFwdGVyLnNldFZhbHVlKHRyYW5zZm9ybWVyQ2xhc3MpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNUcmFuc2Zvcm1lckNsYXNzKFN0cmluZyBhc3RUcmFuc2Zvcm1lckNsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnRyYW5zZm9ybWVyQ2xhc3M7Ci0JCXRoaXMudHJhbnNmb3JtZXJDbGFzcyA9IGFzdFRyYW5zZm9ybWVyQ2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUUkFOU0ZPUk1FUl9DTEFTU19QUk9QRVJUWSwgb2xkLCBhc3RUcmFuc2Zvcm1lckNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFRyYW5zZm9ybWVyQ2xhc3MoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXJDbGFzc0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUcmFuc2Zvcm1lckNsYXNzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy50cmFuc2Zvcm1lckNsYXNzRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0VHJhbnNmb3JtZXJDbGFzc0VsZW1lbnROYW1lKCk7Ci0KLQkvLyAqKioqKiBtZXRob2QKLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpIHsKLQkJcmV0dXJuIHRoaXMubWV0aG9kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZChTdHJpbmcgbWV0aG9kKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm1ldGhvZCwgbWV0aG9kKSkgewotCQkJdGhpcy5tZXRob2QgPSBtZXRob2Q7Ci0JCQl0aGlzLm1ldGhvZEFkYXB0ZXIuc2V0VmFsdWUobWV0aG9kKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTWV0aG9kKFN0cmluZyBhc3RNZXRob2QpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubWV0aG9kOwotCQl0aGlzLm1ldGhvZCA9IGFzdE1ldGhvZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1FVEhPRF9QUk9QRVJUWSwgb2xkLCBhc3RNZXRob2QpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTWV0aG9kKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm1ldGhvZEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRNZXRob2RUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm1ldGhvZERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JYWJzdHJhY3QgU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmY3NjcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHlwZUNvbnZlcnRlcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNvdXJjZU5hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNvdXJjZUJhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0RGF0YVR5cGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE9iamVjdFR5cGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjU0MmUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5WYXJpYWJsZU9uZVRvT25lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm90aGluZyB0byB1cGRhdGUKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjJjNTJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLldyaXRlVHJhbnNmb3JtZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBmaW5hbCBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIgY29sdW1uQWRhcHRlcjsKLQlwcml2YXRlIENvbHVtbkFubm90YXRpb24gY29sdW1uOwotCi0KLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5jb2x1bW5BZGFwdGVyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGJ1aWxkQ29sdW1uQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5kYWEpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJaWYgKHRoaXMuY29sdW1uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpICE9IG51bGwpIHsKLQkJCXRoaXMuY29sdW1uID0gY3JlYXRlQ29sdW1uKHRoaXMsIHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgdGhpcy5kYWEpOwotCQkJdGhpcy5jb2x1bW4uaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY0NvbHVtbihhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRUcmFuc2Zvcm1lckNsYXNzRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUl9fVFJBTlNGT1JNRVJfQ0xBU1M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVJfX01FVEhPRDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogY29sdW1uCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Tm9uTnVsbENvbHVtbigpIHsKLQkJcmV0dXJuICh0aGlzLmNvbHVtbiAhPSBudWxsKSA/IHRoaXMuY29sdW1uIDogbmV3IE51bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uKHRoaXMpOwotCX0KLQotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGFkZENvbHVtbigpIHsKLQkJaWYgKHRoaXMuY29sdW1uICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIidjb2x1bW4nIGVsZW1lbnQgYWxyZWFkeSBleGlzdHM6ICIgKyB0aGlzLmNvbHVtbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmNvbHVtbiA9IGNyZWF0ZUNvbHVtbih0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIHRoaXMuZGFhKTsKLQkJdGhpcy5jb2x1bW4ubmV3QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uKCkgewotCQlpZiAodGhpcy5jb2x1bW4gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiJ2NvbHVtbicgZWxlbWVudCBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5jb2x1bW4ucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmNvbHVtbiA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNDb2x1bW4oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKHRoaXMuY29sdW1uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpID09IG51bGwpIHsKLQkJCXRoaXMuc3luY0NvbHVtbl8obnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5jb2x1bW4gPT0gbnVsbCkgewotCQkJCUNvbHVtbkFubm90YXRpb24gY29sID0gY3JlYXRlQ29sdW1uKHRoaXMsIHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgdGhpcy5kYWEpOwotCQkJCWNvbC5pbml0aWFsaXplKGFzdFJvb3QpOwotCQkJCXRoaXMuc3luY0NvbHVtbl8oY29sKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5jb2x1bW4uc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNDb2x1bW5fKENvbHVtbkFubm90YXRpb24gYXN0Q29sdW1uKSB7Ci0JCUNvbHVtbkFubm90YXRpb24gb2xkID0gdGhpcy5jb2x1bW47Ci0JCXRoaXMuY29sdW1uID0gYXN0Q29sdW1uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MVU1OX1BST1BFUlRZLCBvbGQsIGFzdENvbHVtbik7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb2x1bW5UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKHRoaXMuY29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmNvbHVtbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQkJcmV0dXJuIGdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZENvbHVtbkFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgd3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcih3cml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkFkYXB0ZXIsIEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSX19DT0xVTU4sIEpQQS5DT0xVTU4sIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2x1bW5Bbm5vdGF0aW9uIGNyZWF0ZUNvbHVtbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciB3cml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VDb2x1bW5Bbm5vdGF0aW9uKHBhcmVudCwgbWVtYmVyLCBidWlsZENvbHVtbkFubm90YXRpb25BZGFwdGVyKHdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uQWRhcHRlcikpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS9FY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZTRjOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS9FY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyCi0JaW1wbGVtZW50cyBPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzCi17Ci0JLyoqCi0JICogKENvbnZlbmllbmNlIG1ldGhvZCkgUmV0dXJucyBhbiBFY2xpcHNlTGluayBPUk0gcmVzb3VyY2UgbW9kZWwgcHJvdmlkZXIgZm9yIAotCSAqIHRoZSBnaXZlbiBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyIGdldFhtbFJlc291cmNlUHJvdmlkZXIoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gZ2V0WG1sUmVzb3VyY2VQcm92aWRlcl8oZmlsZS5nZXRQcm9qZWN0KCksIGZpbGUuZ2V0RnVsbFBhdGgoKSk7Ci0JfQotCQotCS8qKgotCSAqIChDb252ZW5pZW5jZSBtZXRob2QpIFJldHVybnMgYW4gRWNsaXBzZUxpbmsgT1JNIHJlc291cmNlIG1vZGVsIHByb3ZpZGVyIGZvcgotCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGluIHRoZSBzcGVjaWZpZWQgcnVudGltZSBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyIGdldFhtbFJlc291cmNlUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJcmV0dXJuIGdldFhtbFJlc291cmNlUHJvdmlkZXJfKHByb2plY3QsIHJ1bnRpbWVQYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogKENvbnZlbmllbmNlIG1ldGhvZCkgUmV0dXJucyBhbiBFY2xpcHNlTGluayBPUk0gcmVzb3VyY2UgbW9kZWwgcHJvdmlkZXIgZm9yIAotCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGluIHRoZSBkZWZhdWx0IHJ1bnRpbWUgbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlciBnZXREZWZhdWx0WG1sUmVzb3VyY2VQcm92aWRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyKHByb2plY3QsIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyIGdldFhtbFJlc291cmNlUHJvdmlkZXJfKElQcm9qZWN0IHByb2plY3QsIElQYXRoIGZ1bGxQYXRoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyKHByb2plY3QsIGZ1bGxQYXRoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMocHJvamVjdCwgSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyKElQcm9qZWN0IHByb2plY3QsIElQYXRoIGZpbGVQYXRoKSB7Ci0JCXN1cGVyKHByb2plY3QsIGZpbGVQYXRoLCBKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVJvb3QoT2JqZWN0IGNvbmZpZykgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpOwotCQllbnRpdHlNYXBwaW5ncy5zZXRWZXJzaW9uKGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShWRVJTSU9OKSk7Ci0JCWdldFJlc291cmNlQ29udGVudHMoKS5hZGQoZW50aXR5TWFwcGluZ3MpOwotCQkKLQkJQWNjZXNzVHlwZSBkZWZhdWx0QWNjZXNzID0gKEFjY2Vzc1R5cGUpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShERUZBVUxUX0FDQ0VTUyk7IAotCQlpZiAoZGVmYXVsdEFjY2VzcyAhPSBudWxsKSB7Ci0JCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwdU1ldGFkYXRhID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQkJZW50aXR5TWFwcGluZ3Muc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocHVNZXRhZGF0YSk7Ci0JCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwdURlZmF1bHRzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJCXB1TWV0YWRhdGEuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocHVEZWZhdWx0cyk7Ci0JCQlwdURlZmF1bHRzLnNldEFjY2VzcyhkZWZhdWx0QWNjZXNzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWM5MDliLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtVmFyaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkuRWNsaXBzZUxpbmtWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBBbGwgdGhlIHN0YXRlIGluIHRoZSBKUEEgcGxhdGZvcm0gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZQotICogaXQgaXMgaW5pdGlhbGl6ZWQpLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybUZhY3RvcnkKLQlpbXBsZW1lbnRzIEpwYVBsYXRmb3JtRmFjdG9yeQotewotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFQbGF0Zm9ybSBidWlsZEpwYVBsYXRmb3JtKFN0cmluZyBpZCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybSgKLQkJCWlkLAotCQkJYnVpbGRKcGFWZXJzaW9uKCksCi0JCQluZXcgRWNsaXBzZUxpbmtKcGFGYWN0b3J5KCksIAotCQkJYnVpbGRKcGFBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLQkJCUVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlci5pbnN0YW5jZSgpLCAKLQkJCWJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBKcGFBbm5vdGF0aW9uUHJvdmlkZXIgYnVpbGRKcGFBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcigKLQkJCUdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBidWlsZEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgewotCQkJcHVibGljIFN1cHBvcnRlZCBnZXRUYWJsZVBlckNvbmNyZXRlQ2xhc3NJbmhlcml0YW5jZUlzU3VwcG9ydGVkKCkgewotCQkJCXJldHVybiBTdXBwb3J0ZWQuWUVTOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gaXNKb2luVGFibGVPdmVycmlkYWJsZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgSnBhUGxhdGZvcm0uVmVyc2lvbiBidWlsZEpwYVZlcnNpb24oKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWZXJzaW9uKAotCQkJCUpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzFfMSwKLQkJCQlKcGFGYWNldC5WRVJTSU9OXzFfMC5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MGM3MDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVudGl0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBwbGF0Zm9ybQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVByb3ZpZGVyCi0JCWV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVByb3ZpZGVyIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybVByb3ZpZGVyIElOU1RBTkNFID0gCi0JCQluZXcgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVByb3ZpZGVyKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWxzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhUmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVJfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMV9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjb250ZW50VHlwZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gYnVpbGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCkgewotCQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCi0JCXJldHVybiBuZXcgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gewotCQkJSmF2YVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpfTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmdzICoqKioqKioqKgkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IGVjbGlwc2VsaW5rIHVzZXMKLQkJLy8gTk9URTogbm8gdHlwZSBtYXBwaW5ncyBzcGVjaWZpYyB0byBlY2xpcHNlbGluawotCQlyZXR1cm4gbmV3IEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCQlKYXZhRW50aXR5RGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uaW5zdGFuY2UoKX07Ci0JfQotCQotCQotCS8vICoqKioqKioqKiBqYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioJCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IGVjbGlwc2VsaW5rIHVzZXMKLQkJLy8gTk9URTogbm8gbmV3IGF0dHJpYnV0ZSBtYXBwaW5ncyBmcm9tIGVjbGlwc2VsaW5rIDEuMCB0byAxLjEKLQkJcmV0dXJuIG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBidWlsZE5vbk51bGxTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IGVjbGlwc2VsaW5rIHVzZXMKLQkJLy8gTk9URTogbm8gbmV3IGF0dHJpYnV0ZSBtYXBwaW5ncyBmcm9tIGVjbGlwc2VsaW5rIDEuMCB0byAxLjEKLQkJcmV0dXJuIG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCQlKYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07Ci0JfQotCQotCQotCS8vICoqKioqKioqKiBtYXBwaW5nIGZpbGVzICoqKioqKioqKgkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVzb3VyY2VEZWZpbml0aW9uW10gYnVpbGRSZXNvdXJjZURlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCi0JCXJldHVybiBuZXcgUmVzb3VyY2VEZWZpbml0aW9uW10gewotCQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUdlbmVyaWNPcm1YbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L0Fic3RyYWN0RWNsaXBzZUxpbmtUeXBlTWFwcGluZ1ZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9BYnN0cmFjdEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJkZTA1My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L0Fic3RyYWN0RWNsaXBzZUxpbmtUeXBlTWFwcGluZ1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LlR5cGVNYXBwaW5nVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkFic3RyYWN0VHlwZU1hcHBpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWNsaXBzZUxpbmtUeXBlTWFwcGluZ1ZhbGlkYXRvcjxUIGV4dGVuZHMgVHlwZU1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdFR5cGVNYXBwaW5nVmFsaWRhdG9yPFQ+Ci17Ci0JcHVibGljIEFic3RyYWN0RWNsaXBzZUxpbmtUeXBlTWFwcGluZ1ZhbGlkYXRvcihUIHR5cGVNYXBwaW5nLCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0LCBUeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXN1cGVyKHR5cGVNYXBwaW5nLCBqcnB0LCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVR5cGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKHRoaXMuaXNNZW1iZXJUeXBlKCkgJiYgIXRoaXMuaXNTdGF0aWNUeXBlKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkRWNsaXBzZUxpbmtUeXBlTWVzc2FnZShFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfTUVNQkVSX0NMQVNTX05PVF9TVEFUSUMpKTsKLQkJfQotCQlpZiAoIXRoaXMuaGFzTm9BcmdDb25zdHJ1Y3RvcigpKSB7Ci0JCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZFR5cGVNZXNzYWdlKEpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfQ0xBU1NfTUlTU0lOR19OT19BUkdfQ09OU1RSVUNUT1IpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZEVjbGlwc2VMaW5rVHlwZU1lc3NhZ2UoU3RyaW5nIG1zZ0lEKSB7Ci0JCXJldHVybiBEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJbXNnSUQsCi0JCQkJbmV3IFN0cmluZ1tdIHt0aGlzLnR5cGVNYXBwaW5nLmdldE5hbWUoKX0sCi0JCQkJdGhpcy50eXBlTWFwcGluZywKLQkJCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyLmdldFR5cGVNYXBwaW5nVGV4dFJhbmdlKCkKLQkJCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGlua0VudGl0eVByaW1hcnlLZXlWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvRWNsaXBzZUxpbmtFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMmQ5MDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGlua0VudGl0eVByaW1hcnlLZXlWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5QcmltYXJ5S2V5VGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkdlbmVyaWNFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yCi0JZXh0ZW5kcyBHZW5lcmljRW50aXR5UHJpbWFyeUtleVZhbGlkYXRvcgotewotCXB1YmxpYyBFY2xpcHNlTGlua0VudGl0eVByaW1hcnlLZXlWYWxpZGF0b3IoCi0JCQlFY2xpcHNlTGlua0VudGl0eSBlbnRpdHksIFByaW1hcnlLZXlUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkKLQkJc3VwZXIoZW50aXR5LCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtFbnRpdHkpIHR5cGVNYXBwaW5nKCk7Ci0JfQotCQotCS8vIGluIEVjbGlwc2VMaW5rLCBhIGhpZXJhcmNoeSBtYXkgZGVmaW5lIGl0cyBwcmltYXJ5IGtleSBvbiBtdWx0aXBsZSBjbGFzc2VzLCBzbyBsb25nIGFzIHRoZQotCS8vIHJvb3QgZW50aXR5IGhhcyBhIGNvaGVyZW50IGRlZmluZWQgcHJpbWFyeSBrZXkuCi0JLy8gSG93ZXZlciwgdGhlIGlkIGNsYXNzIG1heSBvbmx5IGJlIGRlZmluZWQgb24gb25lIGNsYXNzIGluIHRoZSBoaWVyYXJjaHkuCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQcmltYXJ5S2V5SXNOb3RSZWRlZmluZWQoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoaWRDbGFzc1JlZmVyZW5jZSgpLmlzU3BlY2lmaWVkKCkgJiYgZGVmaW5lc0lkQ2xhc3NPbkFuY2VzdG9yKHR5cGVNYXBwaW5nKCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfUkVERUZJTkVELAotCQkJCQkJbmV3IFN0cmluZ1swXSwKLQkJCQkJCXR5cGVNYXBwaW5nKCksCi0JCQkJCQl0ZXh0UmFuZ2VSZXNvbHZlcigpLmdldElkQ2xhc3NUZXh0UmFuZ2UoKSkpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGRlZmluZXNQcmltYXJ5S2V5KFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiBzdXBlci5kZWZpbmVzUHJpbWFyeUtleSh0eXBlTWFwcGluZykKLQkJCXx8ICgoRWNsaXBzZUxpbmtUeXBlTWFwcGluZykgdHlwZU1hcHBpbmcpLnVzZXNQcmltYXJ5S2V5Q29sdW1ucygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWZpZXNJZENsYXNzKCkgewotCQlyZXR1cm4gc3VwZXIuc3BlY2lmaWVzSWRDbGFzcygpIHx8IGRlZmluZXNJZENsYXNzKHR5cGVNYXBwaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOTRhMTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5QcmltYXJ5S2V5VGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkdlbmVyaWNNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yCi0JZXh0ZW5kcyBHZW5lcmljTWFwcGVkU3VwZXJjbGFzc1ByaW1hcnlLZXlWYWxpZGF0b3IKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvcigKLQkJCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzLCBQcmltYXJ5S2V5VGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCi0JCXN1cGVyKG1hcHBlZFN1cGVyY2xhc3MsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgdHlwZU1hcHBpbmcoKTsKLQl9Ci0JCi0JLy8gaW4gRWNsaXBzZUxpbmssIGEgaGllcmFyY2h5IG1heSBkZWZpbmUgaXRzIHByaW1hcnkga2V5IG9uIG11bHRpcGxlIGNsYXNzZXMsIHNvIGxvbmcgYXMgdGhlCi0JLy8gcm9vdCBlbnRpdHkgaGFzIGEgY29oZXJlbnQgZGVmaW5lZCBwcmltYXJ5IGtleS4KLQkvLyBIb3dldmVyLCB0aGUgaWQgY2xhc3MgbWF5IG9ubHkgYmUgZGVmaW5lZCBvbiBvbmUgY2xhc3MgaW4gdGhlIGhpZXJhcmNoeS4KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVByaW1hcnlLZXlJc05vdFJlZGVmaW5lZChMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmIChpZENsYXNzUmVmZXJlbmNlKCkuaXNTcGVjaWZpZWQoKSAmJiBkZWZpbmVzSWRDbGFzc09uQW5jZXN0b3IodHlwZU1hcHBpbmcoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19SRURFRklORUQsCi0JCQkJCQluZXcgU3RyaW5nWzBdLAotCQkJCQkJdHlwZU1hcHBpbmcoKSwKLQkJCQkJCXRleHRSYW5nZVJlc29sdmVyKCkuZ2V0SWRDbGFzc1RleHRSYW5nZSgpKSk7Ci0JCX0KLQl9Ci0JCi0JLy8gaW4gRWNsaXBzZUxpbmssIGl0J3Mgb25seSB0aGUgcm9vdCBlbnRpdHkgd2hlcmUgdGhpcyBtYXR0ZXJzCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVJZENsYXNzSXNVc2VkSWZOZWNlc3NhcnkoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBubyBvcAotCX0KLQkKLQkvLyBpbiBFY2xpcHNlTGluaywgaXQncyBvbmx5IHRoZSByb290IGVudGl0eSB3aGVyZSB0aGlzIG1hdHRlcnMKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUlkQ2xhc3MoSmF2YVBlcnNpc3RlbnRUeXBlIGlkQ2xhc3MsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gbm8gb3AKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmaW5lc1ByaW1hcnlLZXkoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmRlZmluZXNQcmltYXJ5S2V5KHR5cGVNYXBwaW5nKQotCQkJfHwgKChFY2xpcHNlTGlua1R5cGVNYXBwaW5nKSB0eXBlTWFwcGluZykudXNlc1ByaW1hcnlLZXlDb2x1bW5zKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNDZmNzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LlR5cGVNYXBwaW5nVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzVmFsaWRhdG9yCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3I8TWFwcGVkU3VwZXJjbGFzcz4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzVmFsaWRhdG9yKE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcywgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCwgVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlzdXBlcihtYXBwZWRTdXBlcmNsYXNzLCBqcnB0LCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVR5cGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKHRoaXMuaXNGaW5hbFR5cGUoKSkgewotCQkJbWVzc2FnZXMuYWRkKHRoaXMuYnVpbGRUeXBlTWVzc2FnZShKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0ZJTkFMX0NMQVNTKSk7Ci0JCX0KLQkJc3VwZXIudmFsaWRhdGVUeXBlKG1lc3NhZ2VzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L0VjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0OTQxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L0VjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQWJzdHJhY3RQZXJzaXN0ZW50QXR0cmlidXRlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGVWYWxpZGF0b3IKLQlleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvcgotewotCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGVWYWxpZGF0b3IoCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFBlcnNpc3RlbnRBdHRyaWJ1dGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikKLQl7Ci0JCXN1cGVyKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJcmV0dXJuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L0VjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2ZjRkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L0VjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5UeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3I8VHlwZU1hcHBpbmc+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3IoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQsIFR5cGVNYXBwaW5nVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJc3VwZXIodHlwZU1hcHBpbmcsIGpycHQsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDFfMUNvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwxXzFDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4YjBlMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDFfMUNvbnRleHROb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNmb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwxXzFDb250ZXh0Tm9kZUZhY3RvcnkgZXh0ZW5kcyBFY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeQotewkKLQkKLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rMS4xLXNwZWNpZmljIE9STSBDb250ZXh0IE1vZGVsICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuT3duZXIgb3duZXIsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZTFfMShwYXJlbnQsIG93bmVyLCAoWG1sQXR0cmlidXRlTWFwcGluZykgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rLXNwZWNpZmljIE9STSBWaXJ0dWFsIFJlc291cmNlIE1vZGVsICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQmFzaWMgYnVpbGRWaXJ0dWFsWG1sQmFzaWMoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhQmFzaWNNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbElkIGJ1aWxkVmlydHVhbFhtbElkKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhSWRNYXBwaW5nIGphdmFJZE1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxJZDFfMShvcm1UeXBlTWFwcGluZywgamF2YUlkTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxFbWJlZGRlZElkIGJ1aWxkVmlydHVhbFhtbEVtYmVkZGVkSWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbWJlZGRlZElkTWFwcGluZyBqYXZhRW1iZWRkZWRJZE1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZElkMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhRW1iZWRkZWRJZE1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sRW1iZWRkZWQgYnVpbGRWaXJ0dWFsWG1sRW1iZWRkZWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbWJlZGRlZE1hcHBpbmcgamF2YUVtYmVkZGVkTWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhRW1iZWRkZWRNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbE1hbnlUb01hbnkgYnVpbGRWaXJ0dWFsWG1sTWFueVRvTWFueShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55VG9NYW55TWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb01hbnkxXzEob3JtVHlwZU1hcHBpbmcsIGphdmFNYW55VG9NYW55TWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxNYW55VG9PbmUgYnVpbGRWaXJ0dWFsWG1sTWFueVRvT25lKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhTWFueVRvT25lTWFwcGluZyBqYXZhTWFueVRvT25lTWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZTFfMShvcm1UeXBlTWFwcGluZywgamF2YU1hbnlUb09uZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sT25lVG9NYW55IGJ1aWxkVmlydHVhbFhtbE9uZVRvTWFueShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkxXzEob3JtVHlwZU1hcHBpbmcsIChKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBqYXZhT25lVG9NYW55TWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxPbmVUb09uZSBidWlsZFZpcnR1YWxYbWxPbmVUb09uZShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YU9uZVRvT25lTWFwcGluZyBqYXZhT25lVG9PbmVNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUxXzEob3JtVHlwZU1hcHBpbmcsIChKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGphdmFPbmVUb09uZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sVmVyc2lvbiBidWlsZFZpcnR1YWxYbWxWZXJzaW9uKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhVmVyc2lvbk1hcHBpbmcgamF2YVZlcnNpb25NYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmVyc2lvbjFfMShvcm1UeXBlTWFwcGluZywgamF2YVZlcnNpb25NYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEJhc2ljQ29sbGVjdGlvbiBidWlsZFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbihPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyBqYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbjFfMShvcm1UeXBlTWFwcGluZywgamF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQmFzaWNNYXAgYnVpbGRWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY01hcChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nIGphdmFCYXNpY01hcE1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY01hcDFfMShvcm1UeXBlTWFwcGluZywgamF2YUJhc2ljTWFwTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxUcmFuc2Zvcm1hdGlvbiBidWlsZFZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgamF2YVRyYW5zZm9ybWF0aW9uTWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbFZhcmlhYmxlT25lVG9PbmUgYnVpbGRWaXJ0dWFsRWNsaXBzZUxpbmtYbWxWYXJpYWJsZU9uZVRvT25lKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyBqYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxWYXJpYWJsZU9uZVRvT25lMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sVHJhbnNpZW50IGJ1aWxkVmlydHVhbFhtbFRyYW5zaWVudChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YVRyYW5zaWVudE1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2llbnQxXzEob3JtVHlwZU1hcHBpbmcsIGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YUVjbGlwc2VMaW5rbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDFfMURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiY2Q0Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDFfMURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDFfMURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtWG1sRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEVjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtWG1sRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGJ1aWxkQ29udGV4dE5vZGVGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMV8xQ29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBKcGFSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUxXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlMDZhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUxXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0LkVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLQotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlMV8xIAotCWV4dGVuZHMgQWJzdHJhY3RPcm1QZXJzaXN0ZW50QXR0cmlidXRlIAotewotCQotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIHNwZWNpZmllZEFjY2VzczsKLQkKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlMV8xKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgT3duZXIgb3duZXIsIFhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIsIHJlc291cmNlTWFwcGluZyk7Ci0JCXRoaXMuc3BlY2lmaWVkQWNjZXNzID0gZ2V0UmVzb3VyY2VBY2Nlc3MoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBnZXRSZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiAoWG1sQXR0cmlidXRlTWFwcGluZykgc3VwZXIuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWNjZXNzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdTcGVjaWZpZWRBY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGRBY2Nlc3MgPSB0aGlzLnNwZWNpZmllZEFjY2VzczsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3MgPSBuZXdTcGVjaWZpZWRBY2Nlc3M7Ci0JCXRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZEFjY2VzcykpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BQ0NFU1NfUFJPUEVSVFksIG9sZEFjY2VzcywgbmV3U3BlY2lmaWVkQWNjZXNzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzXyhBY2Nlc3NUeXBlIG5ld1NwZWNpZmllZEFjY2VzcykgewotCQlBY2Nlc3NUeXBlIG9sZEFjY2VzcyA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzOwotCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IG5ld1NwZWNpZmllZEFjY2VzczsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZLCBvbGRBY2Nlc3MsIG5ld1NwZWNpZmllZEFjY2Vzcyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXNldFNwZWNpZmllZEFjY2Vzc18oZ2V0UmVzb3VyY2VBY2Nlc3MoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGdldFJlc291cmNlQWNjZXNzKCkgewotCQlyZXR1cm4gQWNjZXNzVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbChnZXRSZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZEF0dGlidXRlVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvcih0aGlzLCBnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLCBidWlsZFRleHRSYW5nZVJlc29sdmVyKCkpOwotCX0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFFY2xpcHNlTGlua2xYbWxOdWxsQXR0cmlidXRlTWFwcGluZzFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhRWNsaXBzZUxpbmtsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcxXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTdiOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFFY2xpcHNlTGlua2xYbWxOdWxsQXR0cmlidXRlTWFwcGluZzFfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OwotCi0vKioKLSAqIFZpcnR1YWxWZXJzaW9uIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFZlcnNpb24gdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFWZXJzaW9uTWFwcGluZyBleGlzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFFY2xpcHNlTGlua2xYbWxOdWxsQXR0cmlidXRlTWFwcGluZzFfMQotCWV4dGVuZHMgWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgCi0JaW1wbGVtZW50cyBYbWxBdHRyaWJ1dGVNYXBwaW5nCi17CQotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxFY2xpcHNlTGlua1htbE51bGxBdHRyaWJ1dGVNYXBwaW5nIHZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZzsKLQkKLQlwdWJsaWMgVmlydHVhRWNsaXBzZUxpbmtsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcxXzEoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKLQkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZyA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxOdWxsQXR0cmlidXRlTWFwcGluZyhvcm1UeXBlTWFwcGluZywgamF2YUF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMudmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nLnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQl9CQotCQotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5nZXRBY2Nlc3NNZXRob2RzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5zZXRBY2Nlc3NNZXRob2RzKHZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UHJvcGVydGllcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpYzFfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzdmM2Q0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljMV8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLQotLyoqCi0gKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWMxXzEgZXh0ZW5kcyBYbWxCYXNpYwotewotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUJhc2ljTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWMgdmlydHVhbFhtbEJhc2ljOwotCQkKLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWMxXzEoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhQmFzaWNNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxCYXNpYyA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpYyhvcm1UeXBlTWFwcGluZywgamF2YUJhc2ljTWFwcGluZyk7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMudmlydHVhbFhtbEJhc2ljLnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldENvbHVtbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0Q29sdW1uKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldEZldGNoKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7Ci0JCXRoaXMudmlydHVhbFhtbEJhc2ljLnNldEZldGNoKG5ld0ZldGNoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldE9wdGlvbmFsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBuZXdPcHRpb25hbCkgewotCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXRPcHRpb25hbChuZXdPcHRpb25hbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNMb2IoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5pc0xvYigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldExvYihib29sZWFuIG5ld0xvYikgewotCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXRMb2IobmV3TG9iKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRMb2JUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRMb2JUZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0VGVtcG9yYWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgc2V0VGVtcG9yYWwpewotCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXRUZW1wb3JhbChzZXRUZW1wb3JhbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRUZW1wb3JhbFRleHRSYW5nZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBFbnVtVHlwZSBnZXRFbnVtZXJhdGVkKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0RW51bWVyYXRlZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEVudW1lcmF0ZWQoRW51bVR5cGUgc2V0RW51bWVyYXRlZCkgewotCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXRFbnVtZXJhdGVkKHNldEVudW1lcmF0ZWQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBCb29sZWFuIGdldE11dGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRNdXRhYmxlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE11dGFibGUoQm9vbGVhbiB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXRNdXRhYmxlKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRNdXRhYmxlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0TXV0YWJsZVRleHRSYW5nZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydCgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldENvbnZlcnQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Q29udmVydChTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0Q29udmVydCh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldENvbnZlcnRUZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQ29udmVydGVyIGdldENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldENvbnZlcnRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0Q29udmVydGVyKHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRPYmplY3RUeXBlQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXRPYmplY3RUeXBlQ29udmVydGVyKHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sU3RydWN0Q29udmVydGVyIGdldFN0cnVjdENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldFN0cnVjdENvbnZlcnRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0U3RydWN0Q29udmVydGVyKHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBnZXRUeXBlQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0VHlwZUNvbnZlcnRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXRUeXBlQ29udmVydGVyKHZhbHVlKTsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRBY2Nlc3NNZXRob2RzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXRBY2Nlc3NNZXRob2RzKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0UHJvcGVydGllcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxUYWJsZUdlbmVyYXRvciBnZXRUYWJsZUdlbmVyYXRvcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IgdmFsdWUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbFNlcXVlbmNlR2VuZXJhdG9yIGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvciB2YWx1ZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlIHZhbHVlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNDb2xsZWN0aW9uMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb24xXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxMzFmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb24xXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7Ci0KLS8qKgotICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbjFfMSBleHRlbmRzIFhtbEJhc2ljQ29sbGVjdGlvbgotewotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKLQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb24gdmlydHVhbFhtbEJhc2ljQ29sbGVjdGlvbjsKLQkJCi0JcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbjFfMShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyBqYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKLQkJdGhpcy52aXJ0dWFsWG1sQmFzaWNDb2xsZWN0aW9uID0gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbihvcm1UeXBlTWFwcGluZywgamF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpY0NvbGxlY3Rpb24uZ2V0TWFwcGluZ0tleSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpY0NvbGxlY3Rpb24uZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sQmFzaWNDb2xsZWN0aW9uLnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljQ29sbGVjdGlvbi5nZXROYW1lVGV4dFJhbmdlKCk7Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljQ29sbGVjdGlvbi5nZXRBY2Nlc3NNZXRob2RzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxCYXNpY0NvbGxlY3Rpb24uc2V0QWNjZXNzTWV0aG9kcyh2YWx1ZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljQ29sbGVjdGlvbi5nZXRQcm9wZXJ0aWVzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNNYXAxXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljTWFwMV8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTlkYWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNNYXAxXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7Ci0KLS8qKgotICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljTWFwMV8xIGV4dGVuZHMgWG1sQmFzaWNNYXAKLXsKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKLQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY01hcCB2aXJ0dWFsWG1sQmFzaWNNYXA7Ci0JCQotCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY01hcDFfMShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nIGphdmFCYXNpY01hcE1hcHBpbmcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUJhc2ljTWFwTWFwcGluZzsKLQkJdGhpcy52aXJ0dWFsWG1sQmFzaWNNYXAgPSBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNNYXAob3JtVHlwZU1hcHBpbmcsIGphdmFCYXNpY01hcE1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpY01hcC5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljTWFwLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMudmlydHVhbFhtbEJhc2ljTWFwLnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljTWFwLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWNNYXAuZ2V0QWNjZXNzTWV0aG9kcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sQmFzaWNNYXAuc2V0QWNjZXNzTWV0aG9kcyh2YWx1ZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljTWFwLmdldFByb3BlcnRpZXMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZDFfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWVhNDVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkMV8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7Ci0KLS8qKgotICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkMV8xIGV4dGVuZHMgWG1sRW1iZWRkZWQKLXsKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFbWJlZGRlZE1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQgdmlydHVhbFhtbEVtYmVkZGVkOwotCQkKLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQxXzEoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbWJlZGRlZE1hcHBpbmcgamF2YUVtYmVkZGVkTWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhRW1iZWRkZWRNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZCA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZChvcm1UeXBlTWFwcGluZywgamF2YUVtYmVkZGVkTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkLmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZC5nZXRBY2Nlc3NNZXRob2RzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZC5zZXRBY2Nlc3NNZXRob2RzKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0UHJvcGVydGllcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWRJZDFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWRJZDFfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTU5YTZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkSWQxXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKLQotLyoqCi0gKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWRJZDFfMSBleHRlbmRzIFhtbEVtYmVkZGVkSWQKLXsKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFbWJlZGRlZElkTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKLQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZElkIHZpcnR1YWxYbWxFbWJlZGRlZElkOwotCQkKLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWRJZDFfMShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGphdmFFbWJlZGRlZElkTWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhRW1iZWRkZWRJZE1hcHBpbmc7Ci0JCXRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQgPSBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWRJZChvcm1UeXBlTWFwcGluZywgamF2YUVtYmVkZGVkSWRNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWRJZC5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQuZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWRJZC5zZXROYW1lKG5ld05hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZElkLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZElkLmdldEFjY2Vzc01ldGhvZHMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQuc2V0QWNjZXNzTWV0aG9kcyh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQuZ2V0UHJvcGVydGllcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sSWQxXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbElkMV8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYzVjMDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sSWQxXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLQotLyoqCi0gKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sSWQxXzEgZXh0ZW5kcyBYbWxJZAotewotCQkKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFJZE1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sSWQgdmlydHVhbFhtbElkOwotCQkKLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sSWQxXzEoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFJZE1hcHBpbmcgamF2YUlkTWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhSWRNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxJZCA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxJZChvcm1UeXBlTWFwcGluZywgamF2YUlkTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxDb2x1bW4gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0Q29sdW1uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRDb2x1bW4odmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRUZW1wb3JhbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCl7Ci0JCXRoaXMudmlydHVhbFhtbElkLnNldFRlbXBvcmFsKG5ld1RlbXBvcmFsKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZW1wb3JhbFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldFRlbXBvcmFsVGV4dFJhbmdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEdlbmVyYXRlZFZhbHVlIGdldEdlbmVyYXRlZFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0R2VuZXJhdGVkVmFsdWUodmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxTZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0U2VxdWVuY2VHZW5lcmF0b3IodmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxUYWJsZUdlbmVyYXRvciBnZXRUYWJsZUdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0VGFibGVHZW5lcmF0b3IodmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRW51bVR5cGUgZ2V0RW51bWVyYXRlZCgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldEVudW1lcmF0ZWQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RW51bWVyYXRlZChFbnVtVHlwZSB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRFbnVtZXJhdGVkKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRFbnVtZXJhdGVkVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0xvYigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmlzTG9iKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldExvYihib29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbElkLnNldExvYih2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9iVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0TG9iVGV4dFJhbmdlKCk7Ci0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQm9vbGVhbiBnZXRNdXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0TXV0YWJsZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNdXRhYmxlKEJvb2xlYW4gdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0TXV0YWJsZSh2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0Q29udmVydCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0KFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRDb252ZXJ0KHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbENvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbElkLnNldENvbnZlcnRlcih2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0T2JqZWN0VHlwZUNvbnZlcnRlcih2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbFN0cnVjdENvbnZlcnRlciBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbElkLnNldFN0cnVjdENvbnZlcnRlcih2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbFR5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldFR5cGVDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0VHlwZUNvbnZlcnRlcih2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRBY2Nlc3NNZXRob2RzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRBY2Nlc3NNZXRob2RzKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0UHJvcGVydGllcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE11dGFibGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRNdXRhYmxlVGV4dFJhbmdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0Q29udmVydFRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvTWFueTFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvTWFueTFfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGViMDQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb01hbnkxXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OwotCi0vKioKLSAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCi0gKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55MV8xIGV4dGVuZHMgWG1sTWFueVRvTWFueQotewotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb01hbnkgdmlydHVhbFhtbE1hbnlUb01hbnk7Ci0JCQotCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55MV8xKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKLQkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFNYW55VG9NYW55TWFwcGluZzsKLQkJdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueSA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55KG9ybVR5cGVNYXBwaW5nLCBqYXZhTWFueVRvTWFueU1hcHBpbmcpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0TWFwcGluZ0tleSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXROYW1lVGV4dFJhbmdlKCk7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRGZXRjaCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldEZldGNoKG5ld0ZldGNoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2FzY2FkZVR5cGUgZ2V0Q2FzY2FkZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0Q2FzY2FkZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0Q2FzY2FkZSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5zZXRUYXJnZXRFbnRpdHkodmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRNYXBwZWRCeSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5zZXRNYXBwZWRCeSh2YWx1ZSk7Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE1hcEtleSBnZXRNYXBLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldE1hcEtleSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXkoTWFwS2V5IHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0TWFwS2V5KHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRPcmRlckJ5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRPcmRlckJ5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE9yZGVyQnkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0T3JkZXJCeSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxPcmRlckNvbHVtbiBnZXRPcmRlckNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0T3JkZXJDb2x1bW4oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldEpvaW5GZXRjaCh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldEFjY2Vzc01ldGhvZHMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0QWNjZXNzTWV0aG9kcyh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0UHJvcGVydGllcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEpvaW5GZXRjaFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9PbmUxXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZTFfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWFmNzljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZTFfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7Ci0KLS8qKgotICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZTFfMSBleHRlbmRzIFhtbE1hbnlUb09uZQotewotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YU1hbnlUb09uZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvT25lIHZpcnR1YWxYbWxNYW55VG9PbmU7Ci0JCQotCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9PbmUxXzEoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFNYW55VG9PbmVNYXBwaW5nIGphdmFNYW55VG9PbmVNYXBwaW5nKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKLQkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFNYW55VG9PbmVNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUgPSBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvT25lKG9ybVR5cGVNYXBwaW5nLCBqYXZhTWFueVRvT25lTWFwcGluZyk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldEZldGNoKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5zZXRGZXRjaChuZXdGZXRjaCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0T3B0aW9uYWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5zZXRPcHRpb25hbChuZXdPcHRpb25hbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRKb2luQ29sdW1ucygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDYXNjYWRlVHlwZSBnZXRDYXNjYWRlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldENhc2NhZGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuc2V0Q2FzY2FkZSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldEpvaW5UYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLnNldEpvaW5UYWJsZSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLnNldFRhcmdldEVudGl0eSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5zZXRKb2luRmV0Y2godmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldEFjY2Vzc01ldGhvZHMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5zZXRBY2Nlc3NNZXRob2RzKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldFByb3BlcnRpZXMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkxXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueTFfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWFlODA0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueTFfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKLQotLyoqCi0gKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9NYW55MV8xIGV4dGVuZHMgWG1sT25lVG9NYW55Ci17Ci0JcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueSB2aXJ0dWFsWG1sT25lVG9NYW55OwotCQkKLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9NYW55MV8xKAotCQkJT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YU9uZVRvTWFueU1hcHBpbmc7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueSA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkob3JtVHlwZU1hcHBpbmcsIGphdmFPbmVUb01hbnlNYXBwaW5nKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE5hbWVUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRGZXRjaCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0RmV0Y2gobmV3RmV0Y2gpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDYXNjYWRlVHlwZSBnZXRDYXNjYWRlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldENhc2NhZGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0Q2FzY2FkZSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldEpvaW5UYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldEpvaW5UYWJsZSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldFRhcmdldEVudGl0eSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0TWFwcGVkQnkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRNYXBwZWRCeSh2YWx1ZSk7Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE1hcEtleSBnZXRNYXBLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0TWFwS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE1hcEtleShNYXBLZXkgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldE1hcEtleSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRPcmRlckJ5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE9yZGVyQnkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRPcmRlckJ5KHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbE9yZGVyQ29sdW1uIGdldE9yZGVyQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE9yZGVyQ29sdW1uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCk7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0Sm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRKb2luRmV0Y2godmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVPd25lZCgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5pc1ByaXZhdGVPd25lZCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRQcml2YXRlT3duZWQoYm9vbGVhbiB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0UHJpdmF0ZU93bmVkKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRBY2Nlc3NNZXRob2RzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0QWNjZXNzTWV0aG9kcyh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRQcm9wZXJ0aWVzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldEpvaW5GZXRjaFRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFByaXZhdGVPd25lZFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvT25lMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZTFfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2NkZTdiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvT25lMV8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKLQotLyoqCi0gKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUxXzEgZXh0ZW5kcyBYbWxPbmVUb09uZQotewotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvT25lIHZpcnR1YWxYbWxPbmVUb09uZTsKLQkJCi0JcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvT25lMV8xKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgamF2YU9uZVRvT25lTWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhT25lVG9PbmVNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZSA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZShvcm1UeXBlTWFwcGluZywgamF2YU9uZVRvT25lTWFwcGluZyk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0RmV0Y2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpIHsKLQkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0RmV0Y2gobmV3RmV0Y2gpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0T3B0aW9uYWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldE9wdGlvbmFsKG5ld09wdGlvbmFsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRKb2luQ29sdW1ucygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDYXNjYWRlVHlwZSBnZXRDYXNjYWRlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0Q2FzY2FkZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldENhc2NhZGUodmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldEpvaW5UYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0Sm9pblRhYmxlKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldFRhcmdldEVudGl0eSh2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE1hcHBlZEJ5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldE1hcHBlZEJ5KHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0Sm9pbkZldGNoKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldEpvaW5GZXRjaCh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZU93bmVkKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuaXNQcml2YXRlT3duZWQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0UHJpdmF0ZU93bmVkKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldEFjY2Vzc01ldGhvZHMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldEFjY2Vzc01ldGhvZHModmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRQcm9wZXJ0aWVzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UHJpdmF0ZU93bmVkVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0UHJpdmF0ZU93bmVkVGV4dFJhbmdlKCk7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24xXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uMV8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMGQyZTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24xXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNmb3JtYXRpb247Ci0KLS8qKgotICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uMV8xIGV4dGVuZHMgWG1sVHJhbnNmb3JtYXRpb24KLXsKLQotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uIHZpcnR1YWxYbWxUcmFuc2Zvcm1hdGlvbjsKLQkJCi0JcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uMV8xKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgamF2YVRyYW5zZm9ybWF0aW9uTWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxUcmFuc2Zvcm1hdGlvbiA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2Zvcm1hdGlvbihvcm1UeXBlTWFwcGluZywgamF2YVRyYW5zZm9ybWF0aW9uTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFRyYW5zZm9ybWF0aW9uLmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVHJhbnNmb3JtYXRpb24uZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sVHJhbnNmb3JtYXRpb24uc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVHJhbnNmb3JtYXRpb24uZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVHJhbnNmb3JtYXRpb24uZ2V0QWNjZXNzTWV0aG9kcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sVHJhbnNmb3JtYXRpb24uc2V0QWNjZXNzTWV0aG9kcyh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFRyYW5zZm9ybWF0aW9uLmdldFByb3BlcnRpZXMoKTsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2llbnQxXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zaWVudDFfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzM2YjQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zaWVudDFfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50OwotCi0vKioKLSAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCi0gKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2llbnQxXzEgZXh0ZW5kcyBYbWxUcmFuc2llbnQKLXsKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFUcmFuc2llbnRNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zaWVudCB2aXJ0dWFsWG1sVHJhbnNpZW50OwotCQotCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2llbnQxXzEoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFUcmFuc2llbnRNYXBwaW5nIGphdmFUcmFuc2llbnRNYXBwaW5nKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKLQkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFUcmFuc2llbnRNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxUcmFuc2llbnQgPSBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNpZW50KG9ybVR5cGVNYXBwaW5nLCBqYXZhVHJhbnNpZW50TWFwcGluZyk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFRyYW5zaWVudC5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFRyYW5zaWVudC5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLnZpcnR1YWxYbWxUcmFuc2llbnQuc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVHJhbnNpZW50LmdldE5hbWVUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFRyYW5zaWVudC5nZXRBY2Nlc3NNZXRob2RzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKSB7Ci0JCXRoaXMudmlydHVhbFhtbFRyYW5zaWVudC5zZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQJCQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFZhcmlhYmxlT25lVG9PbmUxXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFZhcmlhYmxlT25lVG9PbmUxXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5MTE0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxWYXJpYWJsZU9uZVRvT25lMV8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sVmFyaWFibGVPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZTsKLQotLyoqCi0gKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmFyaWFibGVPbmVUb09uZTFfMSBleHRlbmRzIFhtbFZhcmlhYmxlT25lVG9PbmUKLXsKLQotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmFyaWFibGVPbmVUb09uZSB2aXJ0dWFsWG1sVmFyaWFibGVPbmVUb09uZTsKLQkJCi0JcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbFZhcmlhYmxlT25lVG9PbmUxXzEoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nIGphdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7Ci0JCXRoaXMudmlydHVhbFhtbFZhcmlhYmxlT25lVG9PbmUgPSBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmFyaWFibGVPbmVUb09uZShvcm1UeXBlTWFwcGluZywgamF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmFyaWFibGVPbmVUb09uZS5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZhcmlhYmxlT25lVG9PbmUuZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sVmFyaWFibGVPbmVUb09uZS5zZXROYW1lKG5ld05hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWYXJpYWJsZU9uZVRvT25lLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmFyaWFibGVPbmVUb09uZS5nZXRBY2Nlc3NNZXRob2RzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxWYXJpYWJsZU9uZVRvT25lLnNldEFjY2Vzc01ldGhvZHModmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxWZXJzaW9uMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxWZXJzaW9uMV8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYzcxM2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sVmVyc2lvbjFfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uOwotCi0vKioKLSAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCi0gKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxWZXJzaW9uMV8xIGV4dGVuZHMgWG1sVmVyc2lvbgotewotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVZlcnNpb25NYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxFY2xpcHNlTGlua1htbFZlcnNpb24gdmlydHVhbFhtbFZlcnNpb247Ci0JCi0JcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbFZlcnNpb24xXzEoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFWZXJzaW9uTWFwcGluZyBqYXZhVmVyc2lvbk1hcHBpbmcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YVZlcnNpb25NYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxYbWxWZXJzaW9uID0gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbFZlcnNpb24ob3JtVHlwZU1hcHBpbmcsIGphdmFWZXJzaW9uTWFwcGluZyk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0TWFwcGluZ0tleSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMudmlydHVhbFhtbFZlcnNpb24uc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXROYW1lVGV4dFJhbmdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldENvbHVtbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5zZXRDb2x1bW4odmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldFRlbXBvcmFsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKXsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFbnVtVHlwZSBnZXRFbnVtZXJhdGVkKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXRFbnVtZXJhdGVkKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEVudW1lcmF0ZWQoRW51bVR5cGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzTG9iKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5pc0xvYigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9CQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldExvYlRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0TG9iVGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldFRlbXBvcmFsVGV4dFJhbmdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEJvb2xlYW4gZ2V0TXV0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0TXV0YWJsZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNdXRhYmxlKEJvb2xlYW4gdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5zZXRNdXRhYmxlKHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnQoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldENvbnZlcnQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Q29udmVydChTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5zZXRDb252ZXJ0KHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE11dGFibGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldE11dGFibGVUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXRDb252ZXJ0VGV4dFJhbmdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbENvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldENvbnZlcnRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5zZXRDb252ZXJ0ZXIodmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxPYmplY3RUeXBlQ29udmVydGVyIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5zZXRPYmplY3RUeXBlQ29udmVydGVyKHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sU3RydWN0Q29udmVydGVyIGdldFN0cnVjdENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0U3RydWN0Q29udmVydGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLnNldFN0cnVjdENvbnZlcnRlcih2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbFR5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0VHlwZUNvbnZlcnRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLnNldFR5cGVDb252ZXJ0ZXIodmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXRBY2Nlc3NNZXRob2RzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLnNldEFjY2Vzc01ldGhvZHModmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldFByb3BlcnRpZXMoKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9FY2xpcHNlTGluazFfMkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8yL0VjbGlwc2VMaW5rMV8ySnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDY1MTY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8yL0VjbGlwc2VMaW5rMV8ySnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8yOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUFubm90YXRpb25EZWZpbnRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlcyBhbm5vdGF0aW9ucyBmb3IgMS4yIEVjbGlwc2VMaW5rIHBsYXRmb3JtCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmludGlvblByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBJTlNUQU5DRSA9IAotCQkJbmV3IEVjbGlwc2VMaW5rMV8ySnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazFfMkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoQWNjZXNzMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9FY2xpcHNlTGluazFfMkpwYUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8yL0VjbGlwc2VMaW5rMV8ySnBhRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmFmYTkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8yL0VjbGlwc2VMaW5rMV8ySnBhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGUuT3duZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8yLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFQZXJzaXN0ZW50VHlwZTFfMjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8ySnBhRmFjdG9yeQotCWV4dGVuZHMgRWNsaXBzZUxpbmtKcGFGYWN0b3J5Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rMV8ySnBhRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBKYXZhIENvbnRleHQgTW9kZWwgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBidWlsZEphdmFQZXJzaXN0ZW50VHlwZShPd25lciBvd25lciwgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rSmF2YVBlcnNpc3RlbnRUeXBlMV8yKG93bmVyLCBqcnB0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzIvRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmY2RjYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkuRWNsaXBzZUxpbmtWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBBbGwgdGhlIHN0YXRlIGluIHRoZSBKUEEgcGxhdGZvcm0gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZQotICogaXQgaXMgaW5pdGlhbGl6ZWQpLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybUZhY3RvcnkKLQlpbXBsZW1lbnRzIEpwYVBsYXRmb3JtRmFjdG9yeQotewotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFQbGF0Zm9ybSBidWlsZEpwYVBsYXRmb3JtKFN0cmluZyBpZCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybSgKLQkJCWlkLAotCQkJYnVpbGRKcGFWZXJzaW9uKCksCi0JCQluZXcgRWNsaXBzZUxpbmsxXzJKcGFGYWN0b3J5KCksIAotCQkJYnVpbGRKcGFBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLQkJCUVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1Qcm92aWRlci5pbnN0YW5jZSgpLCAKLQkJCWJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBKcGFBbm5vdGF0aW9uUHJvdmlkZXIgYnVpbGRKcGFBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcigKLQkJCUdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rMV8ySnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtVmFyaWF0aW9uIGJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgSnBhUGxhdGZvcm1WYXJpYXRpb24oKSB7Ci0JCQlwdWJsaWMgU3VwcG9ydGVkIGdldFRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQoKSB7Ci0JCQkJcmV0dXJuIFN1cHBvcnRlZC5ZRVM7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc0pvaW5UYWJsZU92ZXJyaWRhYmxlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcGFQbGF0Zm9ybS5WZXJzaW9uIGJ1aWxkSnBhVmVyc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1ZlcnNpb24oCi0JCQkJSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX1BMQVRGT1JNX1ZFUlNJT05fMV8yLAotCQkJCUpwYUZhY2V0LlZFUlNJT05fMV8wLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzIvRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3OTY5MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLlJlc291cmNlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSmF2YVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5Pcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW50aXR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzIuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzJEZWZpbml0aW9uOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIHBsYXRmb3JtCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtUHJvdmlkZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXIgewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtUHJvdmlkZXIgSU5TVEFOQ0UgPSAKLQkJCW5ldyBFY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBtb2RlbHMgKioqKioqKioqKgotCQotCXB1YmxpYyBKcGFSZXNvdXJjZVR5cGUgZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZShJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRDb3JlUGx1Z2luLkpBVkFfU09VUkNFX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvcmVQbHVnaW4uSkFSX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRDb3JlUGx1Z2luLkpBUl9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMV8wX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8yX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNvbnRlbnRUeXBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXJbXSBidWlsZFJlc291cmNlTW9kZWxQcm92aWRlcnMoKSB7Ci0JCS8vIG9yZGVyIHNob3VsZCBub3QgYmUgaW1wb3J0YW50IGhlcmUKLQkJcmV0dXJuIG5ldyBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXJbXSB7Ci0JCQlKYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlKYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCl9OwotCX0KLQotCQotCS8vICoqKioqKioqKiBqYXZhIHR5cGUgbWFwcGluZ3MgKioqKioqKioqCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGROb25OdWxsSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCS8vIG9yZGVyIGRldGVybWluZWQgYnkgYW5hbHl6aW5nIG9yZGVyIHRoYXQgZWNsaXBzZWxpbmsgdXNlcwotCQkvLyBOT1RFOiBubyB0eXBlIG1hcHBpbmdzIHNwZWNpZmljIHRvIGVjbGlwc2VsaW5rCi0JCXJldHVybiBuZXcgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJCUphdmFFbnRpdHlEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqIGphdmEgYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKgkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGROb25OdWxsRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCS8vIG9yZGVyIGRldGVybWluZWQgYnkgYW5hbHl6aW5nIG9yZGVyIHRoYXQgZWNsaXBzZWxpbmsgdXNlcwotCQkvLyBOT1RFOiBubyBuZXcgYXR0cmlidXRlIG1hcHBpbmdzIGZyb20gZWNsaXBzZWxpbmsgMS4wIHRvIDEuMQotCQlyZXR1cm4gbmV3IEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCS8vIG9yZGVyIGRldGVybWluZWQgYnkgYW5hbHl6aW5nIG9yZGVyIHRoYXQgZWNsaXBzZWxpbmsgdXNlcwotCQkvLyBOT1RFOiBubyBuZXcgYXR0cmlidXRlIG1hcHBpbmdzIGZyb20gZWNsaXBzZWxpbmsgMS4wIHRvIDEuMQotCQlyZXR1cm4gbmV3IEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJCUphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqIG1hcHBpbmcgZmlsZXMgKioqKioqKioqCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBSZXNvdXJjZURlZmluaXRpb25bXSBidWlsZFJlc291cmNlRGVmaW5pdGlvbnMoKSB7Ci0JCS8vIG9yZGVyIHNob3VsZCBub3QgYmUgaW1wb3J0YW50IGhlcmUKLQkJcmV0dXJuIG5ldyBSZXNvdXJjZURlZmluaXRpb25bXSB7Ci0JCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJR2VuZXJpY09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGlua09ybVhtbDFfMkRlZmluaXRpb24uaW5zdGFuY2UoKX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzIvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVBlcnNpc3RlbnRUeXBlMV8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhUGVyc2lzdGVudFR5cGUxXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QwYmQxNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhUGVyc2lzdGVudFR5cGUxXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIEphdmEgMS4yCi0gKiBTdXBwb3J0IGZvciBzcGVjaWZpZWQgYWNjZXNzLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhUGVyc2lzdGVudFR5cGUxXzIKLQlleHRlbmRzIEFic3RyYWN0SmF2YVBlcnNpc3RlbnRUeXBlCi17Ci0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFQZXJzaXN0ZW50VHlwZTFfMihQZXJzaXN0ZW50VHlwZS5Pd25lciBwYXJlbnQsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKLQkJc3VwZXIocGFyZW50LCBqcnB0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBY2Nlc3MyXzBBbm5vdGF0aW9uIGdldEFjY2Vzc0Fubm90YXRpb24oKSB7Ci0JCXJldHVybiAoQWNjZXNzMl8wQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldE5vbk51bGxBbm5vdGF0aW9uKHRoaXMuZ2V0QWNjZXNzQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWNjZXNzQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYnVpbGRTcGVjaWZpZWRBY2Nlc3MoKSB7Ci0JCXJldHVybiBBY2Nlc3NUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbCh0aGlzLmdldEFjY2Vzc0Fubm90YXRpb24oKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUgc3BlY2lmaWVkQWNjZXNzKSB7Ci0JCUFjY2Vzc1R5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRBY2Nlc3M7Ci0JCXRoaXMuc3BlY2lmaWVkQWNjZXNzID0gc3BlY2lmaWVkQWNjZXNzOwotCQl0aGlzLmdldEFjY2Vzc0Fubm90YXRpb24oKS5zZXRWYWx1ZShBY2Nlc3NUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwoc3BlY2lmaWVkQWNjZXNzKSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZEFjY2Vzcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEFjY2Vzc18oQWNjZXNzVHlwZSBzcGVjaWZpZWRBY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZEFjY2VzczsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3MgPSBzcGVjaWZpZWRBY2Nlc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZEFjY2Vzcyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiByZXNvdXJjZUF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRBY2Nlc3MgPT0gbnVsbCkgPwotCQkJCXN1cGVyLnJlc291cmNlQXR0cmlidXRlcygpIDoKLQkJCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKEFjY2Vzc1R5cGUudG9KYXZhUmVzb3VyY2VNb2RlbCh0aGlzLnNwZWNpZmllZEFjY2VzcykpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGVBY2Nlc3MoKSB7Ci0JCXN1cGVyLnVwZGF0ZUFjY2VzcygpOwotCQl0aGlzLnNldFNwZWNpZmllZEFjY2Vzc18odGhpcy5idWlsZFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDFfMkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8yL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8yRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2IwMzE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8yL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8yRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8yLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdEVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8xQ29udGV4dE5vZGVGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwxXzJEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybVhtbERlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBFY2xpcHNlTGlua09ybVhtbDFfMkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybVhtbERlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtWG1sMV8yRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBidWlsZENvbnRleHROb2RlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVhtbDFfMUNvbnRleHROb2RlRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgSnBhUmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMl9SRVNPVVJDRV9UWVBFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL0VjbGlwc2VMaW5rMl8wSnBhRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvRWNsaXBzZUxpbmsyXzBKcGFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYjBiMGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvRWNsaXBzZUxpbmsyXzBKcGFGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0LkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2VDb2x1bW4uT3duZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuR2VuZXJpY01ldGFtb2RlbFN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFDYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFDb2xsZWN0aW9uVGFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFEZXJpdmVkSWRlbnRpdHkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFOYW1lZFF1ZXJ5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFPcnBoYW5SZW1vdmFsMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5KcGFQcm9qZWN0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxTb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFDYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFEZXJpdmVkSWRlbnRpdHkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua0pwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsyXzBKcGFGYWN0b3J5Ci0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEpwYUZhY3RvcnkKLQlleHRlbmRzIEVjbGlwc2VMaW5rSnBhRmFjdG9yeQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfMEpwYUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogQ29yZSBNb2RlbCAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVjbGlwc2VMaW5rSnBhUHJvamVjdCBidWlsZEpwYVByb2plY3QoQ29uZmlnIGNvbmZpZykgewotCQlpZiAoICEgKGNvbmZpZyBpbnN0YW5jZW9mIEpwYVByb2plY3QyXzAuQ29uZmlnKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29uZmlnIG11c3QgYmUgMi4wLWNvbXBhdGlibGU6ICIgKyBjb25maWcpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN1cGVyLmJ1aWxkSnBhUHJvamVjdChjb25maWcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWV0YW1vZGVsU291cmNlVHlwZS5TeW5jaHJvbml6ZXIgYnVpbGRNZXRhbW9kZWxTeW5jaHJvbml6ZXIoTWV0YW1vZGVsU291cmNlVHlwZSBzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY01ldGFtb2RlbFN5bmNocm9uaXplcihzb3VyY2VUeXBlKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBKYXZhIENvbnRleHQgTW9kZWwgKioqKioqKioqKgotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoUGVyc2lzdGVudFR5cGUuT3duZXIgb3duZXIsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlMl8wKG93bmVyLCBqcnB0KTsKLQl9Ci0JCi0JLy9UaGUgMi4wIEpQQSBzcGVjIHN1cHBvcnRzIGFzc29jaWF0aW9uIG92ZXJyaWRlcyBvbiBhbiBlbWJlZGRlZCBtYXBwaW5nIHdoaWxlIHRoZSAxLjAgc3BlYyBkaWQgbm90Ci0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBwYXJlbnQsIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UgYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZShKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGJ1aWxkSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0sIFN0cmluZyBuYW1lLCBKb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5KSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKGpycG0sIG5hbWUsIGpvaW5pbmdTdHJhdGVneSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRGVyaXZlZElkZW50aXR5Ml8wIGJ1aWxkSmF2YURlcml2ZWRJZGVudGl0eShKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YURlcml2ZWRJZGVudGl0eTJfMChwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBidWlsZEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRKYXZhU2VxdWVuY2VHZW5lcmF0b3IoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzAocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUNhY2hlYWJsZTJfMCBidWlsZEphdmFDYWNoZWFibGUoSmF2YUNhY2hlYWJsZUhvbGRlcjJfMCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUNhY2hlYWJsZTJfMChwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YU9ycGhhblJlbW92YWJsZTJfMCBidWlsZEphdmFPcnBoYW5SZW1vdmFsKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhT3JwaGFuUmVtb3ZhbDJfMChwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhTmFtZWRRdWVyeSBidWlsZEphdmFOYW1lZFF1ZXJ5KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YU5hbWVkUXVlcnkyXzAocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBidWlsZEphdmFDb2xsZWN0aW9uVGFibGUoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBwYXJlbnQsIFRhYmxlLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFDb2xsZWN0aW9uVGFibGUyXzAocGFyZW50LCBvd25lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFPcmRlckNvbHVtbjJfMCBidWlsZEphdmFPcmRlckNvbHVtbihKYXZhT3JkZXJhYmxlMl8wIHBhcmVudCwgSmF2YU5hbWVkQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFPcmRlckNvbHVtbjJfMChwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUNvbHVtbiBidWlsZEphdmFNYXBLZXlDb2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUNvbHVtbihwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YU9uZVRvT25lTWFwcGluZyBidWlsZEphdmFPbmVUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFNYW55VG9PbmVNYXBwaW5nIGJ1aWxkSmF2YU1hbnlUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMChwYXJlbnQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTc4ZWZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm1WYXJpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5HZW5lcmljMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkuRWNsaXBzZUxpbmtWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBBbGwgdGhlIHN0YXRlIGluIHRoZSBKUEEgcGxhdGZvcm0gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZQotICogaXQgaXMgaW5pdGlhbGl6ZWQpLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybUZhY3RvcnkKLQlpbXBsZW1lbnRzIEpwYVBsYXRmb3JtRmFjdG9yeQotewotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwYVBsYXRmb3JtIGJ1aWxkSnBhUGxhdGZvcm0oU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYVBsYXRmb3JtKAotCQkJaWQsCi0JCQlidWlsZEpwYVZlcnNpb24oKSwKLQkJCW5ldyBFY2xpcHNlTGluazJfMEpwYUZhY3RvcnkoKSwgCi0JCQl0aGlzLmJ1aWxkSnBhQW5ub3RhdGlvblByb3ZpZGVyKCksCi0JCQlFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuaW5zdGFuY2UoKSwgCi0JCQl0aGlzLmJ1aWxkSnBhVmFyaWF0aW9uKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm0uVmVyc2lvbiBidWlsZEpwYVZlcnNpb24oKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWZXJzaW9uKAotCQkJCUpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzJfMCwKLQkJCQlKcGFGYWNldC5WRVJTSU9OXzJfMC5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkSnBhQW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIoCi0JCQlHZW5lcmljMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBidWlsZEpwYVZhcmlhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJCXB1YmxpYyBTdXBwb3J0ZWQgZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpIHsKLQkJCQlyZXR1cm4gU3VwcG9ydGVkLllFUzsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGlzSm9pblRhYmxlT3ZlcnJpZGFibGUoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjdjNjQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLlJlc291cmNlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSmF2YVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5Pcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW50aXR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbDJfMERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8yLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8yRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmdEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXIgewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtUHJvdmlkZXIgSU5TVEFOQ0UgPSAKLQkJCW5ldyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByb3RlY3RlZCBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWxzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhUmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVJfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzJfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uT1JNX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjb250ZW50VHlwZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gYnVpbGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCkgewotCQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCi0JCXJldHVybiBuZXcgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gewotCQkJSmF2YVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpfTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmdzICoqKioqKioqKgkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IGVjbGlwc2VsaW5rIHVzZXMKLQkJLy8gTk9URTogbm8gdHlwZSBtYXBwaW5ncyBzcGVjaWZpYyB0byBlY2xpcHNlbGluawotCQlyZXR1cm4gbmV3IEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCQlKYXZhRW50aXR5RGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uaW5zdGFuY2UoKX07Ci0JfQotCQotCQotCS8vICoqKioqKioqKiBqYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioJCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IGVjbGlwc2VsaW5rIHVzZXMKLQkJLy8gTk9URTogbm8gbmV3IGF0dHJpYnV0ZSBtYXBwaW5ncyBmcm9tIGVjbGlwc2VsaW5rIDEuMCB0byAxLjEKLQkJcmV0dXJuIG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBidWlsZE5vbk51bGxTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IGVjbGlwc2VsaW5rIHVzZXMKLQkJLy8gTk9URTogbm8gbmV3IGF0dHJpYnV0ZSBtYXBwaW5ncyBmcm9tIGVjbGlwc2VsaW5rIDEuMCB0byAyLjAKLQkJcmV0dXJuIG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCQlKYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQkJSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQkJSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07Ci0JfQotCQotCQotCS8vICoqKioqKioqKiBtYXBwaW5nIGZpbGVzICoqKioqKioqKgkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVzb3VyY2VEZWZpbml0aW9uW10gYnVpbGRSZXNvdXJjZURlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCi0JCXJldHVybiBuZXcgUmVzb3VyY2VEZWZpbml0aW9uW10gewotCQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlHZW5lcmljT3JtWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJR2VuZXJpY09ybVhtbDJfMERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGlua09ybVhtbDFfMkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmRkZTAzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQuRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0pvaW5GZXRjaCBqb2luRmV0Y2g7Ci0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmpvaW5GZXRjaCA9IG5ldyBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2godGhpcyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXNUbyhWZWN0b3I8U3RyaW5nPiBuYW1lcykgewotCQlzdXBlci5hZGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzVG8obmFtZXMpOwotCQluYW1lcy5hZGQoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoIGdldEpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkZldGNoOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXRoaXMuam9pbkZldGNoLmluaXRpYWxpemUodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuam9pbkZldGNoLnVwZGF0ZSh0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5qb2luRmV0Y2gudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiNTJkOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nRGVmaW5pdGlvbjJfMAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMAotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFY2xpcHNlTGlua0lkTWFwcGluZ0RlZmluaXRpb24yXzAgSU5TVEFOQ0UgPSAKLQkJbmV3IEphdmFFY2xpcHNlTGlua0lkTWFwcGluZ0RlZmluaXRpb24yXzAoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGVzdERlcml2ZWRJZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCVN0cmluZyBkZWZhdWx0TWFwcGluZ0tleSA9IHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKTsKLQkJcmV0dXJuIHN1cGVyLnRlc3REZXJpdmVkSWQocGVyc2lzdGVudEF0dHJpYnV0ZSkKLQkJCQl8fCBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoZGVmYXVsdE1hcHBpbmdLZXksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKQotCQkJCXx8IFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChkZWZhdWx0TWFwcGluZ0tleSwgTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMxODcwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzAKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZwotewotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wIGJ1aWxkUmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQ3ZDNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZwotewotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wIGJ1aWxkUmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxOWZlMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbmluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuT3duZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uR2VuZXJpY09ybUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1Db2xsZWN0aW9uVGFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5HZW5lcmljT3JtRGVyaXZlZElkZW50aXR5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uR2VuZXJpY09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1OYW1lZFF1ZXJ5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uR2VuZXJpY09ybU9ycGhhblJlbW92YWwyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5HZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sQXNzb2NpYXRpb25PdmVycmlkZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRGVyaXZlZElkZW50aXR5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbGxlY3Rpb25UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm0uVmlydHVhRWNsaXBzZUxpbmtsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcxXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpYzFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbjFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljTWFwMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWRJZDFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbElkMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24xXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2llbnQxXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxWYXJpYWJsZU9uZVRvT25lMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sVmVyc2lvbjFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNmb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5IGV4dGVuZHMgRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkKLXsJCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlLk93bmVyIG93bmVyLCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUxXzEocGFyZW50LCBvd25lciwgKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKE9ybUVtYmVkZGVkTWFwcGluZzJfMCBwYXJlbnQsIE93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIocGFyZW50LCBvd25lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlIGJ1aWxkT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZShPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wKHBhcmVudCwgYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1TZXF1ZW5jZUdlbmVyYXRvciBidWlsZE9ybVNlcXVlbmNlR2VuZXJhdG9yKFhtbENvbnRleHROb2RlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yIHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzAocGFyZW50LCByZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybURlcml2ZWRJZGVudGl0eTJfMCBidWlsZE9ybURlcml2ZWRJZGVudGl0eSgKLQkJCU9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcGFyZW50LCBYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCByZXNvdXJjZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1EZXJpdmVkSWRlbnRpdHkyXzAocGFyZW50LCByZXNvdXJjZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYnVpbGRPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEVsZW1lbnRDb2xsZWN0aW9uIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtQ2FjaGVhYmxlMl8wIGJ1aWxkT3JtQ2FjaGVhYmxlKE9ybUNhY2hlYWJsZUhvbGRlcjJfMCBwYXJlbnQsIFhtbENhY2hlYWJsZV8yXzAgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtQ2FjaGVhYmxlMl8wKHBhcmVudCwgcmVzb3VyY2UpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkT3JtT3JwaGFuUmVtb3ZhbChPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wIHBhcmVudCwgWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMCByZXNvdXJjZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1PcnBoYW5SZW1vdmFsMl8wKHBhcmVudCwgcmVzb3VyY2UpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1OYW1lZFF1ZXJ5IGJ1aWxkT3JtTmFtZWRRdWVyeShYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbE5hbWVkUXVlcnkgcmVzb3VyY2VOYW1lZFF1ZXJ5KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU5hbWVkUXVlcnkyXzAocGFyZW50LCByZXNvdXJjZU5hbWVkUXVlcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1Db2xsZWN0aW9uVGFibGUyXzAgYnVpbGRPcm1Db2xsZWN0aW9uVGFibGUoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHBhcmVudCwgVGFibGUuT3duZXIgb3duZXIsIFhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Db2xsZWN0aW9uVGFibGUyXzAocGFyZW50LCBvd25lciwgcmVzb3VyY2UpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1NYW55VG9PbmVNYXBwaW5nIGJ1aWxkT3JtTWFueVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzAocGFyZW50LCAoWG1sTWFueVRvT25lKSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1PbmVUb09uZU1hcHBpbmcgYnVpbGRPcm1PbmVUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMChwYXJlbnQsIChYbWxPbmVUb09uZSkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT1JNIFZpcnR1YWwgUmVzb3VyY2UgTW9kZWwgKioqKioqKioqKgotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxCYXNpYyBidWlsZFZpcnR1YWxYbWxCYXNpYyhPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWMxXzEob3JtVHlwZU1hcHBpbmcsIGphdmFCYXNpY01hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sSWQgYnVpbGRWaXJ0dWFsWG1sSWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFJZE1hcHBpbmcgamF2YUlkTWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbElkMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhSWRNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEVtYmVkZGVkSWQgYnVpbGRWaXJ0dWFsWG1sRW1iZWRkZWRJZChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGphdmFFbWJlZGRlZElkTWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkSWQxXzEob3JtVHlwZU1hcHBpbmcsIGphdmFFbWJlZGRlZElkTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxFbWJlZGRlZCBidWlsZFZpcnR1YWxYbWxFbWJlZGRlZChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVtYmVkZGVkTWFwcGluZyBqYXZhRW1iZWRkZWRNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQyXzAob3JtVHlwZU1hcHBpbmcsIChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBqYXZhRW1iZWRkZWRNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbE1hbnlUb01hbnkgYnVpbGRWaXJ0dWFsWG1sTWFueVRvTWFueShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55VG9NYW55TWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb01hbnkyXzAob3JtVHlwZU1hcHBpbmcsIChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGphdmFNYW55VG9NYW55TWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxNYW55VG9PbmUgYnVpbGRWaXJ0dWFsWG1sTWFueVRvT25lKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhTWFueVRvT25lTWFwcGluZyBqYXZhTWFueVRvT25lTWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZTJfMChvcm1UeXBlTWFwcGluZywgKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBqYXZhTWFueVRvT25lTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxPbmVUb01hbnkgYnVpbGRWaXJ0dWFsWG1sT25lVG9NYW55KE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueTJfMChvcm1UeXBlTWFwcGluZywgKEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGphdmFPbmVUb01hbnlNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbE9uZVRvT25lIGJ1aWxkVmlydHVhbFhtbE9uZVRvT25lKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhT25lVG9PbmVNYXBwaW5nIGphdmFPbmVUb09uZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZTJfMChvcm1UeXBlTWFwcGluZywgKEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMCkgamF2YU9uZVRvT25lTWFwcGluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbFZlcnNpb24gYnVpbGRWaXJ0dWFsWG1sVmVyc2lvbihPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YVZlcnNpb25NYXBwaW5nIGphdmFWZXJzaW9uTWFwcGluZykgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbFZlcnNpb24xXzEob3JtVHlwZU1hcHBpbmcsIGphdmFWZXJzaW9uTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxCYXNpY0NvbGxlY3Rpb24gYnVpbGRWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb24oT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcgamF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb24xXzEob3JtVHlwZU1hcHBpbmcsIGphdmFCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEJhc2ljTWFwIGJ1aWxkVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNNYXAoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyBqYXZhQmFzaWNNYXBNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNNYXAxXzEob3JtVHlwZU1hcHBpbmcsIGphdmFCYXNpY01hcE1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sVHJhbnNmb3JtYXRpb24gYnVpbGRWaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2Zvcm1hdGlvbihPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nIGphdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2Zvcm1hdGlvbjFfMShvcm1UeXBlTWFwcGluZywgamF2YVRyYW5zZm9ybWF0aW9uTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxWYXJpYWJsZU9uZVRvT25lIGJ1aWxkVmlydHVhbEVjbGlwc2VMaW5rWG1sVmFyaWFibGVPbmVUb09uZShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcgamF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmFyaWFibGVPbmVUb09uZTFfMShvcm1UeXBlTWFwcGluZywgamF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbFRyYW5zaWVudCBidWlsZFZpcnR1YWxYbWxUcmFuc2llbnQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFUcmFuc2llbnRNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNpZW50MV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxOdWxsQXR0cmlidXRlTWFwcGluZyBidWlsZFZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZyhPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFFY2xpcHNlTGlua2xYbWxOdWxsQXR0cmlidXRlTWFwcGluZzFfMShvcm1UeXBlTWFwcGluZywgamF2YUF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQXNzb2NpYXRpb25PdmVycmlkZSBidWlsZFZpcnR1YWxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKFN0cmluZyBuYW1lLCBPcm1UeXBlTWFwcGluZyBwYXJlbnQsIEpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsWG1sQXNzb2NpYXRpb25PdmVycmlkZTJfMChuYW1lLCBwYXJlbnQsIGpvaW5pbmdTdHJhdGVneSk7CQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEVsZW1lbnRDb2xsZWN0aW9uIGJ1aWxkVmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uMl8wKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sRWxlbWVudENvbGxlY3Rpb24yXzAob3JtVHlwZU1hcHBpbmcsIGphdmFNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWNjYTkyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk51bGxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRW50aXR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwyXzBEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbERlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1YbWxEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzBEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1YbWxEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEVGYWN0b3J5IGdldFJlc291cmNlTm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGJ1aWxkQ29udGV4dE5vZGVGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBKcGFSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMl8wX1JFU09VUkNFX1RZUEU7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiBPUk0gdHlwZSBtYXBwaW5ncyAqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGRPcm1UeXBlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBzaG91bGQgbm90IG1hdHRlciBoZXJlLCBidXQgd2UnbGwgdXNlIHRoZSBzYW1lIG9yZGVyIGFzIGZvciBqYXZhCi0JCS8vIEBzZWUge0BsaW5rIEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlcn0KLQkJLy8gTk9URTogbm8gbmV3IHR5cGUgbWFwcGluZyBwcm92aWRlcnMgZnJvbSBlY2xpcHNlbGluayAxLjAgdG8gMS4xCi0JCXJldHVybiBuZXcgT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQkJT3JtRW50aXR5RGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJT3JtRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCU9ybU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uLmluc3RhbmNlKCl9OwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIE9STSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBzaG91bGQgbm90IG1hdHRlciBoZXJlLCBidXQgd2UnbGwgdXNlIHRoZSBzYW1lIG9yZGVyIGFzIGZvciBqYXZhCi0JCS8vIEBzZWUge0BsaW5rIEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlcn0KLQkJcmV0dXJuIG5ldyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJCU9ybVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCU9ybUlkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCU9ybVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJT3JtQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJT3JtRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJT3JtRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCU9ybU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCU9ybU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlPcm1PbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJTnVsbE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOTcxZWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1NYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMCBleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nCi17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMCBidWlsZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wKHRoaXMsIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGRhMDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wIGV4dGVuZHMgQWJzdHJhY3RPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZwotewotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMCBidWlsZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAodGhpcywgdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbGVtZW50Q29sbGVjdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sRWxlbWVudENvbGxlY3Rpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxM2ExMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbGVtZW50Q29sbGVjdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLlZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2xsZWN0aW9uVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7Ci0KLS8qKgotICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbEVsZW1lbnRDb2xsZWN0aW9uMl8wIGV4dGVuZHMgWG1sRWxlbWVudENvbGxlY3Rpb24KLXsKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uMl8wIHZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbjsKLQkKLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sRWxlbWVudENvbGxlY3Rpb24yXzAoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YU1hcHBpbmcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YU1hcHBpbmc7Ci0JCXRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uID0gbmV3IFZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbjJfMChvcm1UeXBlTWFwcGluZywgamF2YU1hcHBpbmcpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7Ci0JCXRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG5ld0ZldGNoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLmdldENvbHVtbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sdW1uKHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQ29sdW1uIGdldE1hcEtleUNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNvbHVtbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE1hcEtleUNvbHVtbihYbWxDb2x1bW4gbmV3TWFwS2V5Q29sdW1uKSB7Ci0JCXRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLnNldE1hcEtleUNvbHVtbihuZXdNYXBLZXlDb2x1bW4pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5nZXRUZW1wb3JhbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCl7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRW51bVR5cGUgZ2V0RW51bWVyYXRlZCgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLmdldEVudW1lcmF0ZWQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RW51bWVyYXRlZChFbnVtVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNMb2IoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5pc0xvYigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9CQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLmdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRMb2JUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5nZXRMb2JUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZW1wb3JhbFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLmdldFRlbXBvcmFsVGV4dFJhbmdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5nZXRBY2Nlc3MoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24uc2V0QWNjZXNzKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFRhcmdldENsYXNzKFN0cmluZyBuZXdUYXJnZXRDbGFzcykgewotCQl0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5zZXRUYXJnZXRDbGFzcyhuZXdUYXJnZXRDbGFzcyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxDb2xsZWN0aW9uVGFibGUgZ2V0Q29sbGVjdGlvblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Q29sbGVjdGlvblRhYmxlKFhtbENvbGxlY3Rpb25UYWJsZSB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUodmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBNYXBLZXkgZ2V0TWFwS2V5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE1hcEtleShNYXBLZXkgbmV3TWFwS2V5KSB7Ci0JCXRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLnNldE1hcEtleShuZXdNYXBLZXkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQ2xhc3NSZWZlcmVuY2UgZ2V0TWFwS2V5Q2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXlDbGFzcyhYbWxDbGFzc1JlZmVyZW5jZSBuZXdNYXBLZXlDbGFzcykgewotCQl0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5zZXRNYXBLZXlDbGFzcyhuZXdNYXBLZXlDbGFzcyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLmdldE9yZGVyQnkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0T3JkZXJCeShTdHJpbmcgbmV3T3JkZXJCeSkgewotCQl0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5zZXRPcmRlckJ5KG5ld09yZGVyQnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sT3JkZXJDb2x1bW4gZ2V0T3JkZXJDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5nZXRPcmRlckNvbHVtbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRPcmRlckNvbHVtbihYbWxPcmRlckNvbHVtbiBuZXdPcmRlckNvbHVtbikgewotCQl0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5zZXRPcmRlckNvbHVtbihuZXdPcmRlckNvbHVtbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0Sm9pbkZldGNoKCkgewotCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiBudWxsOyAvL2Rvbid0IHJldHVybiBkZWZhdWx0IHZhbHVlLCBpdCBvbmx5IGFwcGxpZXMgZm9yIGFuIGVtcHR5IEBKb2luRmV0Y2gKLQkJfQotCQlyZXR1cm4gRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCgoKEphdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZykuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NThjOTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sRW1iZWRkZWQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZDFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OwotCi0vKioKLSAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCi0gKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZDJfMCBleHRlbmRzIFhtbEVtYmVkZGVkCi17Ci0JcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkMV8xIHZpcnR1YWxYbWxFbWJlZGRlZDsKLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbEVtYmVkZGVkMl8wIHZpcnR1YWxYbWxFbWJlZGRlZDJfMDsKLQkJCi0JcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkMl8wKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGphdmFFbWJlZGRlZE1hcHBpbmcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUVtYmVkZGVkTWFwcGluZzsKLQkJdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQgPSBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQxXzEob3JtVHlwZU1hcHBpbmcsIGphdmFFbWJlZGRlZE1hcHBpbmcpOwotCQl0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZDJfMCA9IG5ldyBWaXJ0dWFsWG1sRW1iZWRkZWQyXzAob3JtVHlwZU1hcHBpbmcsIGphdmFFbWJlZGRlZE1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZC5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMudmlydHVhbFhtbEVtYmVkZGVkLnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0QWNjZXNzTWV0aG9kcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuc2V0QWNjZXNzTWV0aG9kcyh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkLmdldFByb3BlcnRpZXMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0QWNjZXNzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbEVtYmVkZGVkLnNldEFjY2VzcyhudWxsKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQyXzAuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZGU5Y2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvTWFueTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uVmlydHVhbFhtbE1hbnlUb01hbnkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OwotCi0vKioKLSAqIFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb01hbnkyXzAgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgWG1sTWFueVRvTWFueSB1c2VkIHdoZW4gdGhlcmUgaXMgCi0gKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YSBtYW55IHRvIG1hbnkgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvTWFueTJfMCBleHRlbmRzIFhtbE1hbnlUb01hbnkKLXsKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKLQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55IGVjbGlwc2VMaW5rVmlydHVhbFhtbE1hbnlUb01hbnk7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxNYW55VG9NYW55Ml8wIHZpcnR1YWxYbWxNYW55VG9NYW55OwotCQkKLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvTWFueTJfMChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIGphdmFNYW55VG9NYW55TWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhTWFueVRvTWFueU1hcHBpbmc7Ci0JCXRoaXMuZWNsaXBzZUxpbmtWaXJ0dWFsWG1sTWFueVRvTWFueSA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55KG9ybVR5cGVNYXBwaW5nLCBqYXZhTWFueVRvTWFueU1hcHBpbmcpOwotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55ID0gbmV3IFZpcnR1YWxYbWxNYW55VG9NYW55Ml8wKG9ybVR5cGVNYXBwaW5nLCBqYXZhTWFueVRvTWFueU1hcHBpbmcpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0TWFwcGluZ0tleSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXROYW1lVGV4dFJhbmdlKCk7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRGZXRjaCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldEZldGNoKG5ld0ZldGNoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2FzY2FkZVR5cGUgZ2V0Q2FzY2FkZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0Q2FzY2FkZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0Q2FzY2FkZSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5zZXRUYXJnZXRFbnRpdHkodmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRNYXBwZWRCeSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5zZXRNYXBwZWRCeSh2YWx1ZSk7Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE1hcEtleSBnZXRNYXBLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldE1hcEtleSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXkoTWFwS2V5IHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0TWFwS2V5KHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbENsYXNzUmVmZXJlbmNlIGdldE1hcEtleUNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXlDbGFzcyhYbWxDbGFzc1JlZmVyZW5jZSB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldE1hcEtleUNsYXNzKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbENvbHVtbiBnZXRNYXBLZXlDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldE1hcEtleUNvbHVtbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXlDb2x1bW4oWG1sQ29sdW1uIG5ld01hcEtleUNvbHVtbikgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldE1hcEtleUNvbHVtbihuZXdNYXBLZXlDb2x1bW4pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0T3JkZXJCeSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5KFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldE9yZGVyQnkodmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sT3JkZXJDb2x1bW4gZ2V0T3JkZXJDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldE9yZGVyQ29sdW1uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE9yZGVyQ29sdW1uKFhtbE9yZGVyQ29sdW1uIG5ld09yZGVyQ29sdW1uKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0T3JkZXJDb2x1bW4obmV3T3JkZXJDb2x1bW4pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldE1hcHBlZEJ5VGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0Sm9pbkZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5lY2xpcHNlTGlua1ZpcnR1YWxYbWxNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSB2YWx1ZSkgewotCQl0aGlzLmVjbGlwc2VMaW5rVmlydHVhbFhtbE1hbnlUb01hbnkuc2V0Sm9pbkZldGNoKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtWaXJ0dWFsWG1sTWFueVRvTWFueS5nZXRBY2Nlc3NNZXRob2RzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgewotCQl0aGlzLmVjbGlwc2VMaW5rVmlydHVhbFhtbE1hbnlUb01hbnkuc2V0QWNjZXNzTWV0aG9kcyh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtWaXJ0dWFsWG1sTWFueVRvTWFueS5nZXRQcm9wZXJ0aWVzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5lY2xpcHNlTGlua1ZpcnR1YWxYbWxNYW55VG9NYW55LmdldEpvaW5GZXRjaFRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9PbmUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzU3Y2Q0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sTWFueVRvT25lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OwotCi0vKioKLSAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCi0gKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9PbmUyXzAgZXh0ZW5kcyBYbWxNYW55VG9PbmUKLXsKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YU1hbnlUb09uZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvT25lIGVjbGlwc2VMaW5rVmlydHVhbFhtbE1hbnlUb09uZTsKLQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sTWFueVRvT25lMl8wIHZpcnR1YWxYbWxNYW55VG9PbmU7Ci0KLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvT25lMl8wKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhTWFueVRvT25lTWFwcGluZzJfMCBqYXZhTWFueVRvT25lTWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhTWFueVRvT25lTWFwcGluZzsKLQkJdGhpcy5lY2xpcHNlTGlua1ZpcnR1YWxYbWxNYW55VG9PbmUgPSBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvT25lKG9ybVR5cGVNYXBwaW5nLCBqYXZhTWFueVRvT25lTWFwcGluZyk7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZSA9IG5ldyBWaXJ0dWFsWG1sTWFueVRvT25lMl8wKG9ybVR5cGVNYXBwaW5nLCBqYXZhTWFueVRvT25lTWFwcGluZyk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldEZldGNoKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5zZXRGZXRjaChuZXdGZXRjaCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0T3B0aW9uYWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5zZXRPcHRpb25hbChuZXdPcHRpb25hbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRKb2luQ29sdW1ucygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDYXNjYWRlVHlwZSBnZXRDYXNjYWRlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldENhc2NhZGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuc2V0Q2FzY2FkZSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldEpvaW5UYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLnNldEpvaW5UYWJsZSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLnNldFRhcmdldEVudGl0eSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rVmlydHVhbFhtbE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgdmFsdWUpIHsKLQkJdGhpcy5lY2xpcHNlTGlua1ZpcnR1YWxYbWxNYW55VG9PbmUuc2V0Sm9pbkZldGNoKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtWaXJ0dWFsWG1sTWFueVRvT25lLmdldEFjY2Vzc01ldGhvZHMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7Ci0JCXRoaXMuZWNsaXBzZUxpbmtWaXJ0dWFsWG1sTWFueVRvT25lLnNldEFjY2Vzc01ldGhvZHModmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rVmlydHVhbFhtbE1hbnlUb09uZS5nZXRQcm9wZXJ0aWVzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5lY2xpcHNlTGlua1ZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRBY2Nlc3MoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLnNldEFjY2Vzcyh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBCb29sZWFuIGdldElkKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldElkKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldElkKEJvb2xlYW4gbmV3SWQpIHsKLQkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLnNldElkKG5ld0lkKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNYXBzSWQoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0TWFwc0lkKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE1hcHNJZChTdHJpbmcgbmV3TWFwc0lkKSB7Ci0JCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5zZXRNYXBzSWQobmV3TWFwc0lkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQxMGYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLlZpcnR1YWxYbWxPbmVUb01hbnkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkxXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7Ci0KLS8qKgotICogVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9NYW55Ml8wIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFhtbE9uZVRvTWFueSB1c2VkIHdoZW4gdGhlcmUgaXMgCi0gKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YU9uZVRvTWFueSBleGlzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkyXzAgZXh0ZW5kcyBYbWxPbmVUb01hbnkKLXsKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9NYW55MV8xIGVjbGlwc2VMaW5rVmlydHVhbFhtbE9uZVRvTWFueTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbE9uZVRvTWFueTJfMCB2aXJ0dWFsWG1sT25lVG9NYW55OwotCQkKLQlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9NYW55Ml8wKAotCQkJT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YU9uZVRvTWFueU1hcHBpbmc7Ci0JCXRoaXMuZWNsaXBzZUxpbmtWaXJ0dWFsWG1sT25lVG9NYW55ID0gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueTFfMShvcm1UeXBlTWFwcGluZywgamF2YU9uZVRvTWFueU1hcHBpbmcpOwotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkgPSBuZXcgVmlydHVhbFhtbE9uZVRvTWFueTJfMChvcm1UeXBlTWFwcGluZywgamF2YU9uZVRvTWFueU1hcHBpbmcpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXROYW1lKG5ld05hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldEZldGNoKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRGZXRjaChuZXdGZXRjaCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0Q2FzY2FkZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRDYXNjYWRlKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0Sm9pblRhYmxlKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0VGFyZ2V0RW50aXR5KHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRNYXBwZWRCeSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldE1hcHBlZEJ5KHZhbHVlKTsKLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWFwS2V5IGdldE1hcEtleSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRNYXBLZXkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TWFwS2V5KE1hcEtleSB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0TWFwS2V5KHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbENsYXNzUmVmZXJlbmNlIGdldE1hcEtleUNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE1hcEtleUNsYXNzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE1hcEtleUNsYXNzKFhtbENsYXNzUmVmZXJlbmNlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRNYXBLZXlDbGFzcyh2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbENvbHVtbiBnZXRNYXBLZXlDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TWFwS2V5Q29sdW1uKFhtbENvbHVtbiBuZXdNYXBLZXlDb2x1bW4pIHsKLQkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldE1hcEtleUNvbHVtbihuZXdNYXBLZXlDb2x1bW4pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRPcmRlckJ5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE9yZGVyQnkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRPcmRlckJ5KHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbE9yZGVyQ29sdW1uIGdldE9yZGVyQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE9yZGVyQ29sdW1uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCk7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rVmlydHVhbFhtbE9uZVRvTWFueS5nZXRKb2luQ29sdW1ucygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtWaXJ0dWFsWG1sT25lVG9NYW55LmdldEpvaW5GZXRjaCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSB2YWx1ZSkgewotCQl0aGlzLmVjbGlwc2VMaW5rVmlydHVhbFhtbE9uZVRvTWFueS5zZXRKb2luRmV0Y2godmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVPd25lZCgpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtWaXJ0dWFsWG1sT25lVG9NYW55LmlzUHJpdmF0ZU93bmVkKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFByaXZhdGVPd25lZChib29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMuZWNsaXBzZUxpbmtWaXJ0dWFsWG1sT25lVG9NYW55LnNldFByaXZhdGVPd25lZCh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rVmlydHVhbFhtbE9uZVRvTWFueS5nZXRBY2Nlc3NNZXRob2RzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgewotCQl0aGlzLmVjbGlwc2VMaW5rVmlydHVhbFhtbE9uZVRvTWFueS5zZXRBY2Nlc3NNZXRob2RzKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdGhpcy5lY2xpcHNlTGlua1ZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0UHJvcGVydGllcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEpvaW5GZXRjaFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtWaXJ0dWFsWG1sT25lVG9NYW55LmdldEpvaW5GZXRjaFRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFByaXZhdGVPd25lZFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtWaXJ0dWFsWG1sT25lVG9NYW55LmdldFByaXZhdGVPd25lZFRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rVmlydHVhbFhtbE9uZVRvTWFueS5nZXRBY2Nlc3MoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJdGhpcy5lY2xpcHNlTGlua1ZpcnR1YWxYbWxPbmVUb01hbnkuc2V0QWNjZXNzKHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcnBoYW5SZW1vdmFsKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE9ycGhhblJlbW92YWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4gbmV3T3JwaGFuUmVtb3ZhbCkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0T3JwaGFuUmVtb3ZhbChuZXdPcnBoYW5SZW1vdmFsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTljNDIyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLlZpcnR1YWxYbWxPbmVUb09uZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKLQotLyoqCi0gKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUyXzAgZXh0ZW5kcyBYbWxPbmVUb09uZQotewotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzAgamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUgZWNsaXBzZUxpbmtWaXJ0dWFsWG1sT25lVG9PbmU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbE9uZVRvT25lMl8wIHZpcnR1YWxYbWxPbmVUb09uZTsKLQotCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZTJfMChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wIGphdmFPbmVUb09uZU1hcHBpbmcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YU9uZVRvT25lTWFwcGluZzsKLQkJdGhpcy5lY2xpcHNlTGlua1ZpcnR1YWxYbWxPbmVUb09uZSA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZShvcm1UeXBlTWFwcGluZywgamF2YU9uZVRvT25lTWFwcGluZyk7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvT25lID0gbmV3IFZpcnR1YWxYbWxPbmVUb09uZTJfMChvcm1UeXBlTWFwcGluZywgamF2YU9uZVRvT25lTWFwcGluZyk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0TmFtZShuZXdOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0RmV0Y2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpIHsKLQkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0RmV0Y2gobmV3RmV0Y2gpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0T3B0aW9uYWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldE9wdGlvbmFsKG5ld09wdGlvbmFsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcnBoYW5SZW1vdmFsKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0T3JwaGFuUmVtb3ZhbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE9ycGhhblJlbW92YWwoQm9vbGVhbiBuZXdPcnBoYW5SZW1vdmFsKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldE9ycGhhblJlbW92YWwobmV3T3JwaGFuUmVtb3ZhbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0Sm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2FzY2FkZVR5cGUgZ2V0Q2FzY2FkZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldENhc2NhZGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRDYXNjYWRlKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRKb2luVGFibGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldEpvaW5UYWJsZSh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRUYXJnZXRFbnRpdHkodmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRNYXBwZWRCeSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRNYXBwZWRCeSh2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE1hcHBlZEJ5VGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtWaXJ0dWFsWG1sT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlIHZhbHVlKSB7Ci0JCXRoaXMuZWNsaXBzZUxpbmtWaXJ0dWFsWG1sT25lVG9PbmUuc2V0Sm9pbkZldGNoKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNQcml2YXRlT3duZWQoKSB7Ci0JCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rVmlydHVhbFhtbE9uZVRvT25lLmlzUHJpdmF0ZU93bmVkKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFByaXZhdGVPd25lZChib29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMuZWNsaXBzZUxpbmtWaXJ0dWFsWG1sT25lVG9PbmUuc2V0UHJpdmF0ZU93bmVkKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtWaXJ0dWFsWG1sT25lVG9PbmUuZ2V0QWNjZXNzTWV0aG9kcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKLQkJdGhpcy5lY2xpcHNlTGlua1ZpcnR1YWxYbWxPbmVUb09uZS5zZXRBY2Nlc3NNZXRob2RzKHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdGhpcy5lY2xpcHNlTGlua1ZpcnR1YWxYbWxPbmVUb09uZS5nZXRQcm9wZXJ0aWVzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5lY2xpcHNlTGlua1ZpcnR1YWxYbWxPbmVUb09uZS5nZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rVmlydHVhbFhtbE9uZVRvT25lLmdldFByaXZhdGVPd25lZFRleHRSYW5nZSgpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0QWNjZXNzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldEFjY2Vzcyh2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBCb29sZWFuIGdldElkKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0SWQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0SWQoQm9vbGVhbiBuZXdJZCkgewotCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRJZChuZXdJZCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwc0lkKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0TWFwc0lkKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE1hcHNJZChTdHJpbmcgbmV3TWFwc0lkKSB7Ci0JCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldE1hcHNJZChuZXdNYXBzSWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZGExYWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuSmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcGFDb25uZWN0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkpwYU9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtKYXJGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uRWNsaXBzZUxpbmtDb25uZWN0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkVjbGlwc2VMaW5rTG9nZ2luZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5FY2xpcHNlTGlua09wdGlvbnMyXzA7Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkgCi0JZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci17Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBidWlsZFBlcnNpc3RlbmNlVW5pdChQZXJzaXN0ZW5jZSBwYXJlbnQsIFhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdChwYXJlbnQsIHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXJGaWxlUmVmIGJ1aWxkSmFyRmlsZVJlZihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBYbWxKYXJGaWxlUmVmIHhtbEphckZpbGVSZWYpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0phckZpbGVSZWYocGFyZW50LCB4bWxKYXJGaWxlUmVmKTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbm5lY3Rpb24yXzAgYnVpbGRDb25uZWN0aW9uKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0Nvbm5lY3Rpb24yXzAoKFBlcnNpc3RlbmNlVW5pdDJfMCkgcGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEpwYU9wdGlvbnMyXzAgYnVpbGRPcHRpb25zKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09wdGlvbnMyXzAoKFBlcnNpc3RlbmNlVW5pdDJfMCkgcGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBidWlsZExvZ2dpbmcoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTG9nZ2luZzJfMCgoUGVyc2lzdGVuY2VVbml0Ml8wKSBwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmNWJhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5QZXJzaXN0ZW5jZVYyXzBGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEVGYWN0b3J5IGdldFJlc291cmNlTm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVYyXzBGYWN0b3J5LmVJTlNUQU5DRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5IGJ1aWxkQ29udGV4dE5vZGVGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIEpwYVJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBKcHRDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRWNsaXBzZUxpbmtDb25uZWN0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRWNsaXBzZUxpbmtDb25uZWN0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Mjg2MGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0VjbGlwc2VMaW5rQ29ubmVjdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkVjbGlwc2VMaW5rQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uMl8wOwotCi0KLS8qKgotICogIEVjbGlwc2VMaW5rQ29ubmVjdGlvbjJfMAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDb25uZWN0aW9uMl8wIGV4dGVuZHMgRWNsaXBzZUxpbmtDb25uZWN0aW9uCi0JaW1wbGVtZW50cyBDb25uZWN0aW9uMl8wCi17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rQ29ubmVjdGlvbjJfMChQZXJzaXN0ZW5jZVVuaXQyXzAgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEYXRhYmFzZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzKCkgewotCQl0aGlzLmRyaXZlciA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSKTsKLQkJdGhpcy51cmwgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VSTCk7Ci0JCXRoaXMudXNlciA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVNFUik7Ci0JCXRoaXMucGFzc3dvcmQgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1BBU1NXT1JEKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLnBvc3RJbml0aWFsaXplKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBQcm9wZXJ0aWVzIGZyb20gbGVnYWN5IHByb3BlcnRpZXMgbmFtZXMgaWYgbm90IGluaXRpYWxpemVkLgotCQlpZih0aGlzLnBlcnNpc3RlbmNlVW5pdEtleUV4aXN0cyhFQ0xJUFNFTElOS19EUklWRVIpKSB7Ci0JCQlpZih0aGlzLmRyaXZlciA9PSBudWxsKSB7Ci0JCQkJdGhpcy5kcml2ZXIgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0RSSVZFUik7Ci0JCQl9Ci0JCX0KLQkJaWYodGhpcy5wZXJzaXN0ZW5jZVVuaXRLZXlFeGlzdHMoRUNMSVBTRUxJTktfVVJMKSkgewotCQkJaWYodGhpcy51cmwgPT0gbnVsbCkgewotCQkJCXRoaXMudXJsID0gdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19VUkwpOwotCQkJfQotCQl9Ci0JCWlmKHRoaXMucGVyc2lzdGVuY2VVbml0S2V5RXhpc3RzKEVDTElQU0VMSU5LX1VTRVIpKSB7Ci0JCQlpZih0aGlzLnVzZXIgPT0gbnVsbCkgewotCQkJCXRoaXMudXNlciA9IHRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfVVNFUik7Ci0JCQl9Ci0JCX0KLQkJaWYodGhpcy5wZXJzaXN0ZW5jZVVuaXRLZXlFeGlzdHMoRUNMSVBTRUxJTktfUEFTU1dPUkQpKSB7Ci0JCQlpZih0aGlzLnBhc3N3b3JkID09IG51bGwpIHsKLQkJCQl0aGlzLnBhc3N3b3JkID0gdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19QQVNTV09SRCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlzdXBlci5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSKSkgewotCQkJdGhpcy5kcml2ZXJDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VUkwpKSB7Ci0JCQl0aGlzLnVybENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VTRVIpKSB7Ci0JCQl0aGlzLnVzZXJDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRCkpIHsKLQkJCXRoaXMucGFzc3dvcmRDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eVJlbW92ZWQocHJvcGVydHlOYW1lKTsKLQkJCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19EUklWRVIpKSB7Ci0JCQl0aGlzLmRyaXZlckNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVJMKSkgewotCQkJdGhpcy51cmxDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VTRVIpKSB7Ci0JCQl0aGlzLnVzZXJDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1BBU1NXT1JEKSkgewotCQkJdGhpcy5wYXNzd29yZENoYW5nZWQobnVsbCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREYXRhYmFzZUNvbm5lY3Rpb25Qcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19EUklWRVIsCi0JCQlDb25uZWN0aW9uLkRSSVZFUl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VSTCwKLQkJCUNvbm5lY3Rpb24uVVJMX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVNFUiwKLQkJCUNvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1BBU1NXT1JELAotCQkJQ29ubmVjdGlvbi5QQVNTV09SRF9QUk9QRVJUWSk7Ci0JfQotCQotCS8qKgotCSAqIE1pZ3JhdGUgcHJvcGVydGllcyBuYW1lcyB0byBFY2xpcHNlTGluayAyLjAgbmFtZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1pZ3JhdGVQcm9wZXJ0aWVzKCkgewotCQl0aGlzLm1pZ3JhdGVTdHJpbmdQcm9wZXJ0eShFQ0xJUFNFTElOS19EUklWRVIsIEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19EUklWRVIsIHRoaXMuZHJpdmVyKTsKLQkJdGhpcy5taWdyYXRlU3RyaW5nUHJvcGVydHkoRUNMSVBTRUxJTktfVVJMLCBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVJMLCB0aGlzLnVybCk7Ci0JCXRoaXMubWlncmF0ZVN0cmluZ1Byb3BlcnR5KEVDTElQU0VMSU5LX1VTRVIsIEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VU0VSLCB0aGlzLnVzZXIpOwotCQl0aGlzLm1pZ3JhdGVTdHJpbmdQcm9wZXJ0eShFQ0xJUFNFTElOS19QQVNTV09SRCwgSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1BBU1NXT1JELCB0aGlzLnBhc3N3b3JkKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG1pZ3JhdGVTdHJpbmdQcm9wZXJ0eShTdHJpbmcgb2xkS2V5LCBTdHJpbmcgbmV3S2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYodGhpcy5wZXJzaXN0ZW5jZVVuaXRLZXlFeGlzdHMob2xkS2V5KSkgewotCQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVQcm9wZXJ0eShvbGRLZXkpOwotCQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXRQcm9wZXJ0eShuZXdLZXksIHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotICAgICAqIE1pZ3JhdGUgYWxsIHByb3BlcnRpZXMgbmFtZXMgYmVmb3JlIHRoZSBwcm9wZXJ0eSBpcyBzZXQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcmVTZXRQcm9wZXJ0eSgpIHsKLQkJCi0JCXRoaXMubWlncmF0ZVByb3BlcnRpZXMoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOWYzYmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rTG9nZ2luZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nTGV2ZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkVjbGlwc2VMaW5rTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nMl8wOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0xvZ2dpbmcyXzAKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTG9nZ2luZzJfMCBleHRlbmRzIEVjbGlwc2VMaW5rTG9nZ2luZwotCWltcGxlbWVudHMgTG9nZ2luZzJfMAotewotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0KLQkvKiogCi0JICogU3RvcmUgQ2F0ZWdvcnkgbGV2ZWxzIGluIGEgbWFwCi0JICoga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCi0JICogCQlrZXkgPSBDYXRlZ29yeSBwcm9wZXJ0eSBpZAotCSAqIAkJdmFsdWUgPSB2YWx1ZQotCSAqLwotCXByaXZhdGUgTWFwPFN0cmluZywgTG9nZ2luZ0xldmVsPiBjYXRlZ29yeVZhbHVlczsKLQotCXByaXZhdGUgQm9vbGVhbiBjb25uZWN0aW9uOwotCQotCXByaXZhdGUgTG9nZ2luZ0xldmVsIGNhdGVnb3JpZXNEZWZhdWx0VmFsdWU7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua0xvZ2dpbmcyXzAoUGVyc2lzdGVuY2VVbml0Ml8wIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCS8qKgotCSAqIEluaXRpYWxpemVzIHByb3BlcnRpZXMgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKLQotCQl0aGlzLmNvbm5lY3Rpb24gPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX0NPTk5FQ1RJT04pOwotCQkKLQkJdGhpcy5jYXRlZ29yaWVzRGVmYXVsdFZhbHVlID0gCi0JCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19MRVZFTCwgTG9nZ2luZ0xldmVsLnZhbHVlcygpKTsKLQkJdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoU1FMX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQl0aGlzLmluaXRpYWxpemVDYXRlZ29yeShUUkFOU0FDVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoRVZFTlRfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhdGVnb3J5KENPTk5FQ1RJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhdGVnb3J5KFFVRVJZX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQl0aGlzLmluaXRpYWxpemVDYXRlZ29yeShDQUNIRV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoUFJPUEFHQVRJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhdGVnb3J5KFNFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhdGVnb3J5KEVKQl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoRE1TX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQl0aGlzLmluaXRpYWxpemVDYXRlZ29yeShFSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhdGVnb3J5KE1FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoV0VBVkVSX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQl0aGlzLmluaXRpYWxpemVDYXRlZ29yeShQUk9QRVJUSUVTX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQl0aGlzLmluaXRpYWxpemVDYXRlZ29yeShTRVJWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQotCQl0aGlzLmNhdGVnb3J5VmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMb2dnaW5nTGV2ZWw+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHNldCBhIGxvZ2dpbmcgbGV2ZWwgY2F0ZWdvcnkgdmFsdWUgZnJvbSB0aGUgdmFsdWUgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICogCi0JICoga2V5ID0gQ2F0ZWdvcnkgcHJvcGVydHkgaWQ7IHZhbHVlID0gdmFsdWUgKExvZ2dpbmdMZXZlbCkKLQkgKiBAcGFyYW0gY2F0ZWdvcnlJZCAtIENhdGVnb3J5IHByb3BlcnR5IGlkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnlJZCkgewotCQlTdHJpbmcgcHVLZXkgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdEtleU9mKGNhdGVnb3J5SWQpOwotCQlMb2dnaW5nTGV2ZWwgcHVWYWx1ZSA9IHRoaXMuZ2V0RW51bVZhbHVlKHB1S2V5LCBMb2dnaW5nTGV2ZWwudmFsdWVzKCkpOwotCi0JCXRoaXMuY2F0ZWdvcnlWYWx1ZXMucHV0KGNhdGVnb3J5SWQsIHB1VmFsdWUpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlzdXBlci5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DT05ORUNUSU9OKSkgewotCQkJdGhpcy5jb25uZWN0aW9uQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TUUxfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfU1FMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RSQU5TQUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX1RSQU5TQUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0VWRU5UX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX0VWRU5UX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NPTk5FQ1RJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfQ09OTkVDVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19RVUVSWV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19RVUVSWV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19DQUNIRV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19QUk9QQUdBVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19QUk9QQUdBVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVFVRU5DSU5HX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX1NFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRUpCX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX0VKQl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19ETVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfRE1TX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0VKQl9PUl9NRVRBREFUQV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19FSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfTUVUQU1PREVMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX01FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfV0VBVkVSX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1BST1BFUlRJRVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfU0VSVkVSX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eVJlbW92ZWQocHJvcGVydHlOYW1lKTsKLQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DT05ORUNUSU9OKSkgewotCQkJdGhpcy5jb25uZWN0aW9uQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NRTF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19TUUxfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19UUkFOU0FDVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19UUkFOU0FDVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0VWRU5UX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX0VWRU5UX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ09OTkVDVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19DT05ORUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfUVVFUllfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfUVVFUllfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19DQUNIRV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1BST1BBR0FUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX1BST1BBR0FUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VRVUVOQ0lOR19DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19TRVFVRU5DSU5HX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRUpCX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX0VKQl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RNU19DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19ETVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfRUpCX09SX01FVEFEQVRBX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfTUVUQU1PREVMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX01FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZFUl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19XRUFWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19QUk9QRVJUSUVTX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX1BST1BFUlRJRVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfU0VSVkVSX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleQotCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0KLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19DT05ORUNUSU9OLAotCQkJQ09OTkVDVElPTl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfU1FMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlTUUxfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVFJBTlNBQ1RJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCVRSQU5TQUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0VWRU5UX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlFVkVOVF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19DT05ORUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlDT05ORUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1FVRVJZX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlRVUVSWV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19DQUNIRV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLAotCQkJQ0FDSEVfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfUFJPUEFHQVRJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCVBST1BBR0FUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCVNFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRUpCX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlFSkJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRE1TX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlETVNfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRUpCX09SX01FVEFEQVRBX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlFSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfTUVUQU1PREVMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlNRVRBTU9ERUxfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfV0VBVkVSX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlXRUFWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX0xFVkVMLAotCQkJUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCVNFUlZFUl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENvbm5lY3Rpb24gKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldENvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbihCb29sZWFuIG5ld0Nvbm5lY3Rpb24pIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmNvbm5lY3Rpb247Ci0JCXRoaXMuY29ubmVjdGlvbiA9IG5ld0Nvbm5lY3Rpb247Ci0JCXRoaXMucHV0UHJvcGVydHkoQ09OTkVDVElPTl9QUk9QRVJUWSwgbmV3Q29ubmVjdGlvbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05ORUNUSU9OX1BST1BFUlRZLCBvbGQsIG5ld0Nvbm5lY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb25uZWN0aW9uQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5jb25uZWN0aW9uOwotCQl0aGlzLmNvbm5lY3Rpb24gPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTk5FQ1RJT05fUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gREVGQVVMVF9DT05ORUNUSU9OOwotCX0KLQkKLQkvLyAqKioqKioqKioqIENhdGVnb3J5IExldmVscyAqKioqKioqKioqCi0JCi0JcHVibGljIExvZ2dpbmdMZXZlbCBnZXRMZXZlbChTdHJpbmcgY2F0ZWdvcnkpIHsKLQotCQlyZXR1cm4gdGhpcy5jYXRlZ29yeVZhbHVlcy5nZXQoY2F0ZWdvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExldmVsKFN0cmluZyBjYXRlZ29yeSwgTG9nZ2luZ0xldmVsIG5ld0xldmVsKSB7Ci0JCUxvZ2dpbmdMZXZlbCBvbGQgPSB0aGlzLmdldExldmVsKGNhdGVnb3J5KTsKLQkJdGhpcy5jYXRlZ29yeVZhbHVlcy5wdXQoY2F0ZWdvcnksIG5ld0xldmVsKTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShjYXRlZ29yeSwgbmV3TGV2ZWwpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoY2F0ZWdvcnksIG9sZCwgbmV3TGV2ZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhTdHJpbmcgZWNsaXBzZWxpbmtLZXksIFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlTdHJpbmcgY2F0ZWdvcnkgPSB0aGlzLnByb3BlcnR5SWRPZihlY2xpcHNlbGlua0tleSk7Ci0JCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZChjYXRlZ29yeSwgc3RyaW5nVmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUxvZ2dpbmdMZXZlbCBlbnVtVmFsdWUgPSBnZXRFbnVtVmFsdWVPZihzdHJpbmdWYWx1ZSwgTG9nZ2luZ0xldmVsLnZhbHVlcygpKTsKLQkJTG9nZ2luZ0xldmVsIG9sZCA9IHRoaXMuZ2V0TGV2ZWwoY2F0ZWdvcnkpOwotCQl0aGlzLmNhdGVnb3J5VmFsdWVzLnB1dChjYXRlZ29yeSwgZW51bVZhbHVlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGNhdGVnb3J5LCBvbGQsIGVudW1WYWx1ZSk7Ci0JfQotCi0JcHVibGljIExvZ2dpbmdMZXZlbCBnZXRDYXRlZ29yaWVzRGVmYXVsdExldmVsKCkgewotCQlyZXR1cm4gKHRoaXMuY2F0ZWdvcmllc0RlZmF1bHRWYWx1ZSA9PSBudWxsKSA/IHN1cGVyLmdldERlZmF1bHRMZXZlbCgpIDogdGhpcy5jYXRlZ29yaWVzRGVmYXVsdFZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldExldmVsKExvZ2dpbmdMZXZlbCBsZXZlbCkgewotCQlzdXBlci5zZXRMZXZlbChsZXZlbCk7Ci0JCXRoaXMuc2V0RGVmYXVsdExldmVsKGxldmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TGV2ZWwoTG9nZ2luZ0xldmVsIGxldmVsKSB7Ci0JCUxvZ2dpbmdMZXZlbCBvbGQgPSB0aGlzLmNhdGVnb3JpZXNEZWZhdWx0VmFsdWU7Ci0JCXRoaXMuY2F0ZWdvcmllc0RlZmF1bHRWYWx1ZSA9IGxldmVsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FURUdPUklFU19ERUZBVUxUX0xPR0dJTkdfUFJPUEVSVFksIG9sZCwgbGV2ZWwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE1YzY3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvRWNsaXBzZUxpbmtPcHRpb25zMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuRWNsaXBzZUxpbmtPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqICBFY2xpcHNlTGlua09wdGlvbnMyXzAKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3B0aW9uczJfMCBleHRlbmRzIEVjbGlwc2VMaW5rT3B0aW9ucwotCWltcGxlbWVudHMgT3B0aW9uczJfMAotewotCS8vICoqKioqKioqKiogR2VuZXJpY0Nvbm5lY3Rpb24gcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBJbnRlZ2VyIGxvY2tUaW1lb3V0OwotCXByaXZhdGUgSW50ZWdlciBxdWVyeVRpbWVvdXQ7Ci0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gdmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHM7Ci0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gdmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlczsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua09wdGlvbnMyXzAoUGVyc2lzdGVuY2VVbml0Ml8wIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCS8qKgotCSAqIEluaXRpYWxpemVzIHByb3BlcnRpZXMgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKLQkJCi0JCXRoaXMubG9ja1RpbWVvdXQgPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKFBFUlNJU1RFTkNFX0xPQ0tfVElNRU9VVCk7Ci0JCXRoaXMucXVlcnlUaW1lb3V0ID0gCi0JCQl0aGlzLmdldEludGVnZXJWYWx1ZShQRVJTSVNURU5DRV9RVUVSWV9USU1FT1VUKTsKLQotCQkvLyBWYWxpZGF0aW9uTW9kZSBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGVsZW1lbnQKLQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cyA9IHRoaXMuZ2V0Q29tcG9zaXRlVmFsdWUoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVCk7Ci0JCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcyA9IHRoaXMuZ2V0Q29tcG9zaXRlVmFsdWUoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFKTsKLQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzID0gdGhpcy5nZXRDb21wb3NpdGVWYWx1ZShQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkUpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCXN1cGVyLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotCQkKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfTE9DS19USU1FT1VUKSkgewotCQkJdGhpcy5sb2NrVGltZW91dENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfUVVFUllfVElNRU9VVCkpIHsKLQkJCXRoaXMucXVlcnlUaW1lb3V0Q2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUKSkgewotCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0c0NoYW5nZWQoKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURSkpIHsKLQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlc0NoYW5nZWQoKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRSkpIHsKLQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlc0NoYW5nZWQoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyLnByb3BlcnR5UmVtb3ZlZChwcm9wZXJ0eU5hbWUpOwotCQkKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfTE9DS19USU1FT1VUKSkgewotCQkJdGhpcy5sb2NrVGltZW91dENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9RVUVSWV9USU1FT1VUKSkgewotCQkJdGhpcy5xdWVyeVRpbWVvdXRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVCkpIHsKLQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHNDaGFuZ2VkKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEUpKSB7Ci0JCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXNDaGFuZ2VkKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkUpKSB7Ci0JCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXNDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IAotCSAqIAkJa2V5ID0gUFUgcHJvcGVydHkga2V5Ci0JICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCi0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJUEVSU0lTVEVOQ0VfTE9DS19USU1FT1VULAotCQkJTE9DS19USU1FT1VUX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlQRVJTSVNURU5DRV9RVUVSWV9USU1FT1VULAotCQkJUVVFUllfVElNRU9VVF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVCwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCVBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0Ml8wIGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIChQZXJzaXN0ZW5jZVVuaXQyXzApIHN1cGVyLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLQotCS8vICoqKioqKioqKiogTG9ja1RpbWVvdXQgKioqKioqKioqKgotCXB1YmxpYyBJbnRlZ2VyIGdldExvY2tUaW1lb3V0KCkgewotCQlyZXR1cm4gdGhpcy5sb2NrVGltZW91dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NrVGltZW91dChJbnRlZ2VyIG5ld0xvY2tUaW1lb3V0KSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5sb2NrVGltZW91dDsKLQkJdGhpcy5sb2NrVGltZW91dCA9IG5ld0xvY2tUaW1lb3V0OwotCQl0aGlzLnB1dFByb3BlcnR5KExPQ0tfVElNRU9VVF9QUk9QRVJUWSwgbmV3TG9ja1RpbWVvdXQpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTE9DS19USU1FT1VUX1BST1BFUlRZLCBvbGQsIG5ld0xvY2tUaW1lb3V0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9ja1RpbWVvdXRDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmxvY2tUaW1lb3V0OwotCQl0aGlzLmxvY2tUaW1lb3V0ID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0NLX1RJTUVPVVRfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRMb2NrVGltZW91dCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfTE9DS19USU1FT1VUOwotCX0KLQotCS8vICoqKioqKioqKiogUXVlcnlUaW1lb3V0ICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRRdWVyeVRpbWVvdXQoKSB7Ci0JCXJldHVybiB0aGlzLnF1ZXJ5VGltZW91dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRRdWVyeVRpbWVvdXQoSW50ZWdlciBuZXdRdWVyeVRpbWVvdXQpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnF1ZXJ5VGltZW91dDsKLQkJdGhpcy5xdWVyeVRpbWVvdXQgPSBuZXdRdWVyeVRpbWVvdXQ7Ci0JCXRoaXMucHV0UHJvcGVydHkoUVVFUllfVElNRU9VVF9QUk9QRVJUWSwgbmV3UXVlcnlUaW1lb3V0KTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFFVRVJZX1RJTUVPVVRfUFJPUEVSVFksIG9sZCwgbmV3UXVlcnlUaW1lb3V0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcXVlcnlUaW1lb3V0Q2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy5xdWVyeVRpbWVvdXQ7Ci0JCXRoaXMucXVlcnlUaW1lb3V0ID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChRVUVSWV9USU1FT1VUX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0UXVlcnlUaW1lb3V0KCkgewotCQlyZXR1cm4gREVGQVVMVF9RVUVSWV9USU1FT1VUOwotCX0KLQotCQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzKCl7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzKTsKLQl9Ci0JCi0JcHVibGljIGludCB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0c1NpemUoKXsKLQkJcmV0dXJuIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RFeGlzdHMoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RDbGFzc05hbWUpIHsKLQotCQlmb3IgKFN0cmluZyB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0IDogdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cykgewotCQkJaWYodmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdC5lcXVhbHModmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdENsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBhZGRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KFN0cmluZyBuZXdQcmVQZXJzaXN0Q2xhc3NOYW1lKXsKLQotCQlpZiggISB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RFeGlzdHMobmV3UHJlUGVyc2lzdENsYXNzTmFtZSkpIHsKLQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMuYWRkKG5ld1ByZVBlcnNpc3RDbGFzc05hbWUpOwotCQkJdGhpcy5wdXRQcm9wZXJ0eUNvbXBvc2l0ZVZhbHVlKFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFksIG5ld1ByZVBlcnNpc3RDbGFzc05hbWUpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9MSVNULCB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzKTsKLQkJCXJldHVybiBuZXdQcmVQZXJzaXN0Q2xhc3NOYW1lOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KFN0cmluZyBjbGFzc05hbWUpewotCi0JCWlmKHRoaXMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdF8oY2xhc3NOYW1lKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZVByb3BlcnR5Q29tcG9zaXRlVmFsdWUoVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwgY2xhc3NOYW1lKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfTElTVCwgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdF8oU3RyaW5nIGNsYXNzTmFtZSl7Ci0KLQkJZm9yICggTGlzdEl0ZXJhdG9yPFN0cmluZz4gaSA9IHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgdmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCA9IGkubmV4dCgpOwotCQkJaWYodmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdC5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMucmVtb3ZlKHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QpOwotCQkJCXJldHVybiB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0c0NoYW5nZWQoKSB7Ci0JCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMgPSB0aGlzLmdldENvbXBvc2l0ZVZhbHVlKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1QpOwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0xJU1QsIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMpOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcygpewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKTsKLQl9Ci0JCi0JcHVibGljIGludCB2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzU2l6ZSgpewotCQlyZXR1cm4gdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVFeGlzdHMoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUNsYXNzTmFtZSkgewotCi0JCWZvciAoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSA6IHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcykgewotCQkJaWYodmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlLmVxdWFscyh2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVDbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgYWRkVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKFN0cmluZyBuZXdQcmVVcGRhdGVDbGFzc05hbWUpewotCi0JCWlmKCAhIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlRXhpc3RzKG5ld1ByZVVwZGF0ZUNsYXNzTmFtZSkpIHsKLQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcy5hZGQobmV3UHJlVXBkYXRlQ2xhc3NOYW1lKTsKLQkJCXRoaXMucHV0UHJvcGVydHlDb21wb3NpdGVWYWx1ZShWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksIG5ld1ByZVVwZGF0ZUNsYXNzTmFtZSk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfTElTVCwgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKTsKLQkJCXJldHVybiBuZXdQcmVVcGRhdGVDbGFzc05hbWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZShTdHJpbmcgY2xhc3NOYW1lKXsKLQotCQlpZih0aGlzLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZV8oY2xhc3NOYW1lKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZVByb3BlcnR5Q29tcG9zaXRlVmFsdWUoVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZLCBjbGFzc05hbWUpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0xJU1QsIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlXyhTdHJpbmcgY2xhc3NOYW1lKXsKLQotCQlmb3IoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaSA9IHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcygpOyBpLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyB2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUgPSBpLm5leHQoKTsKLQkJCWlmKHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcy5yZW1vdmUodmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKTsKLQkJCQlyZXR1cm4gdmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzQ2hhbmdlZCgpIHsKLQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzID0gdGhpcy5nZXRDb21wb3NpdGVWYWx1ZShQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEUpOwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfTElTVCwgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMoKXsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgdmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlc1NpemUoKXsKLQkJcmV0dXJuIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlcy5zaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlRXhpc3RzKFN0cmluZyB2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVDbGFzc05hbWUpIHsKLQotCQlmb3IgKFN0cmluZyB2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUgOiB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMpIHsKLQkJCWlmKHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZS5lcXVhbHModmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlQ2xhc3NOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGFkZFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZShTdHJpbmcgbmV3UHJlUmVtb3ZlQ2xhc3NOYW1lKXsKLQotCQlpZiggISB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUV4aXN0cyhuZXdQcmVSZW1vdmVDbGFzc05hbWUpKSB7Ci0JCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMuYWRkKG5ld1ByZVJlbW92ZUNsYXNzTmFtZSk7Ci0JCQl0aGlzLnB1dFByb3BlcnR5Q29tcG9zaXRlVmFsdWUoVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLCBuZXdQcmVSZW1vdmVDbGFzc05hbWUpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0xJU1QsIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlcyk7Ci0JCQlyZXR1cm4gbmV3UHJlUmVtb3ZlQ2xhc3NOYW1lOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoU3RyaW5nIGNsYXNzTmFtZSl7Ci0KLQkJaWYodGhpcy5yZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVfKGNsYXNzTmFtZSkgIT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdmVQcm9wZXJ0eUNvbXBvc2l0ZVZhbHVlKFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSwgY2xhc3NOYW1lKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9MSVNULCB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIHJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVJlbW92ZV8oU3RyaW5nIGNsYXNzTmFtZSl7Ci0KLQkJZm9yKExpc3RJdGVyYXRvcjxTdHJpbmc+IGkgPSB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgdmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlID0gaS5uZXh0KCk7Ci0JCQlpZih2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMucmVtb3ZlKHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSk7Ci0JCQkJcmV0dXJuIHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlc0NoYW5nZWQoKSB7Ci0JCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlcyA9IHRoaXMuZ2V0Q29tcG9zaXRlVmFsdWUoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFKTsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0xJU1QsIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9kZGxnZW4vRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2RkbGdlbi9FY2xpcHNlTGluazJfMERETEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzQwOGZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2RkbGdlbi9FY2xpcHNlTGluazJfMERETEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuZGRsZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcGFDb25uZWN0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5kZGxnZW4uQWJzdHJhY3RFY2xpcHNlTGlua0RETEdlbmVyYXRvcjsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsyXzBETExHZW5lcmF0b3IgbGF1bmNoZXMgdGhlIEVjbGlwc2VMaW5rIERETCBnZW5lcmF0b3IgaW4gYSBzZXBhcmF0ZSBWTS4KLSAqICBGb3IgdGhpcyBpdCB3aWxsIGNyZWF0ZSBhIEphdmEgQ29uZmlndXJhdGlvbiBuYW1lZCAiRGFsaSBFY2xpcHNlTGluayBUYWJsZSBHZW5lcmF0aW9uIiAKLSAqICBpbiB0aGUgdGFyZ2V0IHdvcmtzcGFjZSAobm90ZTogdGhlIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBvdmVycmlkZGVuIGF0IGVhY2ggcnVuKS4KLSAqICBJdCB3aWxsIHRoYW4gbGF1bmNoIHRoZSBjb25maWd1cmF0aW9uIGNyZWF0ZWQgd2l0aCB0aGUgbG9naW4gaW5mb3JtYXRpb24gZnJvbSAKLSAqICB0aGUgY3VycmVudCBEYWxpIHByb2plY3QsIGFuZCBwYXNzZXMgaXQgdG8gRWNsaXBzZUxpbmsuCi0gKiAgCi0gKiAgUHJlLXJlcSBpbiBQREUgZW52aXJvbm1lbnQ6Ci0gKiAgCW9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi5qYXIgaW4gRUNMSVBTRV9IT01FL3BsdWdpbnMKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua0RETEdlbmVyYXRvcgotewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NT0RFX1BST1BFUlRZID0gImphdmF4LnBlcnNpc3RlbmNlLnZhbGlkYXRpb24ubW9kZSI7IAkgIC8vJE5PTi1OTFMtMSQKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChwdU5hbWUgPT0gbnVsbCB8fCBwdU5hbWUubGVuZ3RoKCkgPT0gMCB8fCBwcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCW5ldyBFY2xpcHNlTGluazJfMERETEdlbmVyYXRvcihwdU5hbWUsIHByb2plY3QpLmdlbmVyYXRlKG1vbml0b3IpOwotCX0KLQotCXByaXZhdGUgRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3IoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXN1cGVyKHB1TmFtZSwganBhUHJvamVjdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZEFsbFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyLmJ1aWxkQWxsUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlWQUxJREFUSU9OX01PREVfUFJPUEVSVFksCi0JCQlOT05FKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZEN1c3RvbWl6YXRpb25Qcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlzdXBlci5idWlsZEN1c3RvbWl6YXRpb25Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCQkKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HLAotCQkJRkFMU0UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ29ubmVjdGlvblByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyLmJ1aWxkQ29ubmVjdGlvblByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCi0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywgCi0JCQlKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSLAotCQkJKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXREcml2ZXJDbGFzc05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VSTCwKLQkJCShjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKLQkJCUpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VU0VSLAotCQkJKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVc2VyTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfUEFTU1dPUkQsCi0JCQkoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldFVzZXJQYXNzd29yZCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL0VjbGlwc2VMaW5rMl8xSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvRWNsaXBzZUxpbmsyXzFKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiODg1ZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvRWNsaXBzZUxpbmsyXzFKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmludGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yMl8xQW5ub3RhdGlvbkRlZmluaXRpb247Ci0KLS8qKgotICogUHJvdmlkZXMgYW5ub3RhdGlvbnMgZm9yIDEuMCBFY2xpcHNlTGluayBwbGF0Zm9ybQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzFKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEpwYUFubm90YXRpb25EZWZpbnRpb25Qcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIgSU5TVEFOQ0UgPSAKLQkJCW5ldyBFY2xpcHNlTGluazJfMUpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazJfMUpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlQW5ub3RhdGlvbkRlZmluaXRpb25zVG8oTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3IyXzFBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwkJCi0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsJCQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uc1RvKExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsJCQotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsJCQotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CQkKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9FY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2MDBiYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9FY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLkdlbmVyaWMyXzBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhUGxhdGZvcm1GYWN0b3J5LkVjbGlwc2VMaW5rVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5FY2xpcHNlTGluazJfMEpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1GYWN0b3J5Ci0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtRmFjdG9yeQotewotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFQbGF0Zm9ybSBidWlsZEpwYVBsYXRmb3JtKFN0cmluZyBpZCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybSgKLQkJCWlkLAotCQkJYnVpbGRKcGFWZXJzaW9uKCksCi0JCQluZXcgRWNsaXBzZUxpbmsyXzBKcGFGYWN0b3J5KCksIAotCQkJdGhpcy5idWlsZEpwYUFubm90YXRpb25Qcm92aWRlcigpLAotCQkJRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVByb3ZpZGVyLmluc3RhbmNlKCksIAotCQkJdGhpcy5idWlsZEpwYVZhcmlhdGlvbigpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtLlZlcnNpb24gYnVpbGRKcGFWZXJzaW9uKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVmVyc2lvbigKLQkJCQlKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8yXzEsCi0JCQkJSnBhRmFjZXQuVkVSU0lPTl8yXzAuZ2V0VmVyc2lvblN0cmluZygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYUFubm90YXRpb25Qcm92aWRlciBidWlsZEpwYUFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyKAotCQkJR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rMl8xSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0vLwlAT3ZlcnJpZGUKLS8vCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBidWlsZEpwYVZhcmlhdGlvbigpIHsKLS8vCQlyZXR1cm4gbmV3IEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgewotLy8JCQkJcHVibGljIFN1cHBvcnRlZCBnZXRUYWJsZVBlckNvbmNyZXRlQ2xhc3NJbmhlcml0YW5jZUlzU3VwcG9ydGVkKCkgewotLy8JCQkJCXJldHVybiBTdXBwb3J0ZWQuWUVTOwotLy8JCQkJfQotLy8JCQkJCi0vLwkJCQlwdWJsaWMgYm9vbGVhbiBpc0pvaW5UYWJsZU92ZXJyaWRhYmxlKCkgewotLy8JCQkJCXJldHVybiB0cnVlOwotLy8JCQkJfQotLy8JCQl9OwotLy8JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL0VjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NzY1NjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1YbWwyXzBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8yLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8yRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLkVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbDJfMURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtUHJvdmlkZXIKLQkJZXh0ZW5kcyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIgewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtUHJvdmlkZXIgSU5TVEFOQ0UgPSAKLQkJCW5ldyBFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHJlc291cmNlIG1vZGVscyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYVJlc291cmNlVHlwZSBnZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotLy8JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpKSB7Ci0vLwkJCXJldHVybiBKcHRDb3JlUGx1Z2luLkpBVkFfU09VUkNFX1JFU09VUkNFX1RZUEU7Ci0vLwkJfQotLy8JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7Ci0vLwkJCXJldHVybiBKcHRDb3JlUGx1Z2luLkpBUl9SRVNPVVJDRV9UWVBFOwotLy8JCX0KLS8vCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKSkgewotLy8JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMl8wX1JFU09VUkNFX1RZUEU7Ci0vLwkJfQotLy8JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotLy8JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5PUk1fWE1MXzJfMF9SRVNPVVJDRV9UWVBFOwotLy8JCX0KLQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMl8xX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoY29udGVudFR5cGUpOwotCX0KLQkKLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIGJ1aWxkUmVzb3VyY2VNb2RlbFByb3ZpZGVycygpIHsKLS8vCQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCi0vLwkJcmV0dXJuIG5ldyBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXJbXSB7Ci0vLwkJCUphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLS8vCQkJSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0vLwkJCVBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0vLwkJCU9ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotLy8JCQlFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpfTsKLS8vCX0KLQkKLQkKLQkvLyAqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmdzICoqKioqKioqKgkKLQkKLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSBidWlsZE5vbk51bGxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKLS8vCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IGVjbGlwc2VsaW5rIHVzZXMKLS8vCQkvLyBOT1RFOiBubyB0eXBlIG1hcHBpbmdzIHNwZWNpZmljIHRvIGVjbGlwc2VsaW5rCi0vLwkJcmV0dXJuIG5ldyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gewotLy8JCQlKYXZhRW50aXR5RGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlKYXZhRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKSwKLS8vCQkJSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uLmluc3RhbmNlKCl9OwotLy8JfQotCQotCQotCS8vICoqKioqKioqKiBqYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioJCi0JCi0vLwlAT3ZlcnJpZGUKLS8vCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBidWlsZE5vbk51bGxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKLS8vCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IGVjbGlwc2VsaW5rIHVzZXMKLS8vCQkvLyBOT1RFOiBubyBuZXcgYXR0cmlidXRlIG1hcHBpbmdzIGZyb20gZWNsaXBzZWxpbmsgMS4wIHRvIDEuMQotLy8JCXJldHVybiBuZXcgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotLy8JCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCUphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKLS8vCX0KLQkKLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0vLwkJLy8gb3JkZXIgZGV0ZXJtaW5lZCBieSBhbmFseXppbmcgb3JkZXIgdGhhdCBlY2xpcHNlbGluayB1c2VzCi0vLwkJLy8gTk9URTogbm8gbmV3IGF0dHJpYnV0ZSBtYXBwaW5ncyBmcm9tIGVjbGlwc2VsaW5rIDEuMCB0byAyLjAKLS8vCQlyZXR1cm4gbmV3IEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLS8vCQkJSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCUphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLS8vCQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLS8vCQkJSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotLy8JCQlKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCUphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCUphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLS8vCQkJSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCUphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCUphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKLS8vCX0KLQkKLQkKLQkvLyAqKioqKioqKiogbWFwcGluZyBmaWxlcyAqKioqKioqKioJCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlc291cmNlRGVmaW5pdGlvbltdIGJ1aWxkUmVzb3VyY2VEZWZpbml0aW9ucygpIHsKLQkJLy8gb3JkZXIgc2hvdWxkIG5vdCBiZSBpbXBvcnRhbnQgaGVyZQotCQlyZXR1cm4gbmV3IFJlc291cmNlRGVmaW5pdGlvbltdIHsKLQkJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJR2VuZXJpY09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUdlbmVyaWNPcm1YbWwyXzBEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJRWNsaXBzZUxpbmtPcm1YbWwxXzJEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGlua09ybVhtbDJfMERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rT3JtWG1sMl8xRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY0YzE5Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkFic3RyYWN0T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLQotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzEKLQlleHRlbmRzIEFic3RyYWN0T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPFhtbEVsZW1lbnRDb2xsZWN0aW9uPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAKLXsKLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2ggam9pbkZldGNoOwotCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8xKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxFbGVtZW50Q29sbGVjdGlvbiByZXNvdXJjZU1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCQl0aGlzLmpvaW5GZXRjaCA9IG5ldyBPcm1FY2xpcHNlTGlua0pvaW5GZXRjaCh0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuam9pbkZldGNoLnVwZGF0ZSgpOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKb2luRmV0Y2ggZ2V0Sm9pbkZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5qb2luRmV0Y2g7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzFDb250ZXh0Tm9kZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8xQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjMzODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzFDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMl8xQ29udGV4dE5vZGVGYWN0b3J5IGV4dGVuZHMgRWNsaXBzZUxpbmtPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkKLXsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYnVpbGRPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMShwYXJlbnQsIChYbWxFbGVtZW50Q29sbGVjdGlvbikgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcgYnVpbGRPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEJhc2ljQ29sbGVjdGlvbiByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcyXzEocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nIGJ1aWxkT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEJhc2ljTWFwIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nMl8xKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8xRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODhlOGVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8xRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbDJfMERlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDJfMURlZmluaXRpb24KLQlleHRlbmRzIEVjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybVhtbERlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBFY2xpcHNlTGlua09ybVhtbDJfMURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybVhtbERlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtWG1sMl8xRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0vLwlAT3ZlcnJpZGUKLS8vCXB1YmxpYyBFRmFjdG9yeSBnZXRSZXNvdXJjZU5vZGVGYWN0b3J5KCkgewotLy8JCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFOwotLy8JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzFDb250ZXh0Tm9kZUZhY3RvcnkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYVJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzFfUkVTT1VSQ0VfVFlQRTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqIE9STSB0eXBlIG1hcHBpbmdzICoqKioqKioqKgotCQotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGRPcm1UeXBlTWFwcGluZ0RlZmluaXRpb25zKCkgewotLy8JCS8vIG9yZGVyIHNob3VsZCBub3QgbWF0dGVyIGhlcmUsIGJ1dCB3ZSdsbCB1c2UgdGhlIHNhbWUgb3JkZXIgYXMgZm9yIGphdmEKLS8vCQkvLyBAc2VlIHtAbGluayBFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtUHJvdmlkZXJ9Ci0vLwkJLy8gTk9URTogbm8gbmV3IHR5cGUgbWFwcGluZyBwcm92aWRlcnMgZnJvbSBlY2xpcHNlbGluayAxLjAgdG8gMS4xCi0vLwkJcmV0dXJuIG5ldyBPcm1UeXBlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0vLwkJCU9ybUVudGl0eURlZmluaXRpb24uaW5zdGFuY2UoKSwKLS8vCQkJT3JtRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKSwKLS8vCQkJT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uaW5zdGFuY2UoKX07Ci0vLwl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBPUk0gYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKioKLQkKLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGRPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0vLwkJLy8gb3JkZXIgc2hvdWxkIG5vdCBtYXR0ZXIgaGVyZSwgYnV0IHdlJ2xsIHVzZSB0aGUgc2FtZSBvcmRlciBhcyBmb3IgamF2YQotLy8JCS8vIEBzZWUge0BsaW5rIEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlcn0KLS8vCQlyZXR1cm4gbmV3IE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotLy8JCQlPcm1UcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCU9ybUlkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLS8vCQkJT3JtVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCU9ybUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLS8vCQkJT3JtRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlPcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLS8vCQkJT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCU9ybU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlPcm1NYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlPcm1PbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlPcm1PbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCU9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCU51bGxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKLS8vCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNzkxZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcyXzEKLQlleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nCi17Ci0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzJfMShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQmFzaWNDb2xsZWN0aW9uIHJlc291cmNlTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQlpZiAoIWlzVmlydHVhbCgpKSB7IC8vaWYgdmlydHVhbCB0aGUgdW5kZXJseWluZyBqYXZhIEJhc2ljTWFwIGFubm90YXRpb24gd2lsbCBoYXZlIGEgamF2YSBkZXByZWNhdGlvbiB3YXJuaW5nCi0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5CQVNJQ19DT0xMRUNUSU9OX01BUFBJTkdfREVQUkVDQVRFRCwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjZkMDYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcyXzEKLQlleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcKLXsKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzJfMShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQmFzaWNNYXAgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCWlmICghaXNWaXJ0dWFsKCkpIHsgLy9pZiB2aXJ0dWFsIHRoZSB1bmRlcmx5aW5nIGphdmEgQmFzaWNNYXAgYW5ub3RhdGlvbiB3aWxsIGhhdmUgYSBqYXZhIGRlcHJlY2F0aW9uIHdhcm5pbmcKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkJBU0lDX01BUF9NQVBQSU5HX0RFUFJFQ0FURUQsCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3IyXzFBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yMl8xQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkOWQwMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3IyXzFBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMS5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMTsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DbGFzc0V4dHJhY3RvcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvcjJfMUFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3IyXzFBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yMl8xQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMSgoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgKFR5cGUpIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEoKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMS5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY5OTIzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMTsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DbGFzc0V4dHJhY3RvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEKLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xIAotewotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9DTEFTU19OQU1FX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluazJfMS5DTEFTU19FWFRSQUNUT1JfX1ZBTFVFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lCi0JLyoqCi0JICogYmluYXJ5IGlzIGFscmVhZHkgZnVsbHktcXVhbGlmaWVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2ZmYxYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMS5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNsYXNzRXh0cmFjdG9yCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPFR5cGU+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZTsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHR5cGUsIFZBTFVFX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lID0gdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNGdWxseVF1YWxpZmllZENsYXNzTmFtZSh0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy52YWx1ZSwgdmFsdWUpKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKFN0cmluZyBhc3RWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IGFzdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoU3RyaW5nIGFzdEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lID0gYXN0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfQ0xBU1NfTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3RGdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZENsYXNzTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyBudWxsIDogQVNUVG9vbHMucmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLnZhbHVlQWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsyXzEuQ0xBU1NfRVhUUkFDVE9SX19WQUxVRSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcGxhdGZvcm0vRWNsaXBzZUxpbmtQbGF0Zm9ybS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3BsYXRmb3JtL0VjbGlwc2VMaW5rUGxhdGZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljMDJkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcGxhdGZvcm0vRWNsaXBzZUxpbmtQbGF0Zm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb247Ci0KLS8qKgotICogQ29uc3RhbnRzIHBlcnRhaW5pbmcgdG8gdGhlIEVjbGlwc2VMaW5rIEpQQSBwbGF0Zm9ybXMgYW5kIHRoZWlyIGdyb3VwCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGxhdGZvcm0gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIEdST1VQCi0JCQk9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm1Hcm91cCgiZWNsaXBzZWxpbmsiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBWRVJTSU9OXzFfMAotCQkJPSBKcHRDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtKCJvcmcuZWNsaXBzZS5lY2xpcHNlbGluay5wbGF0Zm9ybSIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIFZFUlNJT05fMV8xCi0JCQk9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm0oImVjbGlwc2VsaW5rMV8xIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gVkVSU0lPTl8xXzIKLQkJCT0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKcGFQbGF0Zm9ybSgiZWNsaXBzZWxpbmsxXzIiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBWRVJTSU9OXzJfMAotCQkJPSBKcHRDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtKCJlY2xpcHNlbGluazJfMCIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIFZFUlNJT05fMl8xCi0JCQk9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm0oImVjbGlwc2VsaW5rMl8xIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBOb3QgZm9yIGluc3RhbnRpYXRpb24KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rUGxhdGZvcm0oKSB7fQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMTU4NTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29tbW9uIHByb3RvY29sIGFtb25nOgotICogICAgIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlR5cGVDb252ZXJ0ZXIKLSAqICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5PYmplY3RUeXBlQ29udmVydGVyCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgotewotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZGF0YVR5cGUnIGVsZW1lbnQgb2YgdGhlIFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGF0YVR5cGUoKTsKLQkJU3RyaW5nIERBVEFfVFlQRV9QUk9QRVJUWSA9ICJkYXRhVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2RhdGFUeXBlJyBlbGVtZW50IG9mIHRoZSBUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIGRhdGFUeXBlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2RhdGFUeXBlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVHlwZUNvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXREYXRhVHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBkYXRhIHR5cGUgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUgQVNUJ3MgYmluZGluZ3MuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDsqVHlwZUNvbnZlcnRlcihkYXRhVHlwZSA9IE15RGF0YVR5cGUuY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gIm1vZGVsLk15RGF0YVR5cGUiIGlmIHRoZXJlIGlzIGFuIGltcG9ydCBmb3IgbW9kZWwuTXlEYXRhVHlwZS4KLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKTsKLQkJU3RyaW5nIEZVTExZX1FVQUxJRklFRF9EQVRBX1RZUEVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWREYXRhVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnb2JqZWN0VHlwZScgZWxlbWVudCBvZiB0aGUgVHlwZUNvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRPYmplY3RUeXBlKCk7Ci0JCVN0cmluZyBPQkpFQ1RfVFlQRV9QUk9QRVJUWSA9ICJvYmplY3RUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnb2JqZWN0VHlwZScgZWxlbWVudCBvZiB0aGUgVHlwZUNvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE9iamVjdFR5cGUoU3RyaW5nIG9iamVjdFR5cGUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnb2JqZWN0VHlwZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0T2JqZWN0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBvYmplY3QgdHlwZSBuYW1lIGFzIHJlc29sdmVkIGJ5IHRoZSBBU1QncyBiaW5kaW5ncy4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0OypUeXBlQ29udmVydGVyKGRhdGFUeXBlID0gTXlPYmplY3RUeXBlLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJtb2RlbC5NeU9iamVjdFR5cGUiIGlmIHRoZXJlIGlzIGFuIGltcG9ydCBmb3IgbW9kZWwuTXlPYmplY3RUeXBlLgotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCk7Ci0JCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfT0JKRUNUX1RZUEVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DYWNoZUNvb3JkaW5hdGlvblR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmIzZTFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBlbnVtCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZUNvb3JkaW5hdGlvblR5cGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgZW51bSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgewotCi0JU0VORF9PQkpFQ1RfQ0hBTkdFUyhFY2xpcHNlTGluay5DQUNIRV9DT09SRElOQVRJT05fVFlQRV9fU0VORF9PQkpFQ1RfQ0hBTkdFUyksCi0JSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMoRWNsaXBzZUxpbmsuQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfX0lOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKSwKLQlTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyhFY2xpcHNlTGluay5DQUNIRV9DT09SRElOQVRJT05fVFlQRV9fU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpLAotCU5PTkUoRWNsaXBzZUxpbmsuQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfX05PTkUpOwotCi0KLQlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOwotCi0JQ2FjaGVDb29yZGluYXRpb25UeXBlKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJZm9yIChDYWNoZUNvb3JkaW5hdGlvblR5cGUgY2FjaGVDb29yZGluYXRpb25UeXBlIDogQ2FjaGVDb29yZGluYXRpb25UeXBlLnZhbHVlcygpKSB7Ci0JCQlpZiAoY2FjaGVDb29yZGluYXRpb25UeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKS5lcXVhbHMoamF2YUFubm90YXRpb25WYWx1ZSkpIHsKLQkJCQlyZXR1cm4gY2FjaGVDb29yZGluYXRpb25UeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShDYWNoZUNvb3JkaW5hdGlvblR5cGUgY2FjaGVDb29yZGluYXRpb25UeXBlKSB7Ci0JCXJldHVybiAoY2FjaGVDb29yZGluYXRpb25UeXBlID09IG51bGwpID8gbnVsbCA6IGNhY2hlQ29vcmRpbmF0aW9uVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DYWNoZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0NhY2hlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzIwMDYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0NhY2hlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBlbnVtCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZVR5cGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgZW51bSBDYWNoZVR5cGUgewotCi0JRlVMTChFY2xpcHNlTGluay5DQUNIRV9UWVBFX19GVUxMKSwKLQlXRUFLKEVjbGlwc2VMaW5rLkNBQ0hFX1RZUEVfX1dFQUspLAotCVNPRlQoRWNsaXBzZUxpbmsuQ0FDSEVfVFlQRV9fU09GVCksCi0JU09GVF9XRUFLKEVjbGlwc2VMaW5rLkNBQ0hFX1RZUEVfX1NPRlRfV0VBSyksCi0JSEFSRF9XRUFLKEVjbGlwc2VMaW5rLkNBQ0hFX1RZUEVfX0hBUkRfV0VBSyksCi0JQ0FDSEUoRWNsaXBzZUxpbmsuQ0FDSEVfVFlQRV9fQ0FDSEUpLAotCU5PTkUoRWNsaXBzZUxpbmsuQ0FDSEVfVFlQRV9fTk9ORSk7Ci0KLQotCXByaXZhdGUgU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0KLQlDYWNoZVR5cGUoU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlID0gamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFBbm5vdGF0aW9uVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgQ2FjaGVUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ2FjaGVUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlmb3IgKENhY2hlVHlwZSBjYWNoZVR5cGUgOiBDYWNoZVR5cGUudmFsdWVzKCkpIHsKLQkJCWlmIChjYWNoZVR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpLmVxdWFscyhqYXZhQW5ub3RhdGlvblZhbHVlKSkgewotCQkJCXJldHVybiBjYWNoZVR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKENhY2hlVHlwZSBjYWNoZVR5cGUpIHsKLQkJcmV0dXJuIChjYWNoZVR5cGUgPT0gbnVsbCkgPyBudWxsIDogY2FjaGVUeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0NoYW5nZVRyYWNraW5nVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2hhbmdlVHJhY2tpbmdUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMjJmNDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2hhbmdlVHJhY2tpbmdUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGVudW0KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNoYW5nZVRyYWNraW5nVHlwZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBlbnVtIENoYW5nZVRyYWNraW5nVHlwZSB7Ci0KLQlBVFRSSUJVVEUoRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HX1RZUEVfX0FUVFJJQlVURSksCi0JT0JKRUNUKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lOR19UWVBFX19PQkpFQ1QpLAotCURFRkVSUkVEKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lOR19UWVBFX19ERUZFUlJFRCksCi0JQVVUTyhFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkdfVFlQRV9fQVVUTyk7Ci0KLQotCXByaXZhdGUgU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0KLQlDaGFuZ2VUcmFja2luZ1R5cGUoU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlID0gamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFBbm5vdGF0aW9uVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgQ2hhbmdlVHJhY2tpbmdUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ2hhbmdlVHJhY2tpbmdUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlmb3IgKENoYW5nZVRyYWNraW5nVHlwZSBjaGFuZ2VUcmFja2luZ1R5cGUgOiBDaGFuZ2VUcmFja2luZ1R5cGUudmFsdWVzKCkpIHsKLQkJCWlmIChjaGFuZ2VUcmFja2luZ1R5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpLmVxdWFscyhqYXZhQW5ub3RhdGlvblZhbHVlKSkgewotCQkJCXJldHVybiBjaGFuZ2VUcmFja2luZ1R5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKENoYW5nZVRyYWNraW5nVHlwZSBjaGFuZ2VUcmFja2luZ1R5cGUpIHsKLQkJcmV0dXJuIChjaGFuZ2VUcmFja2luZ1R5cGUgPT0gbnVsbCkgPyBudWxsIDogY2hhbmdlVHJhY2tpbmdUeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWJlMzAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIEphdmEtcmVsYXRlZCBzdHVmZiAoYW5ub3RhdGlvbnMgZXRjLikKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmsgewotCi0JLy8gRWNsaXBzZUxpbmsgcGFja2FnZQotCVN0cmluZyBQQUNLQUdFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQQUNLQUdFXyA9IFBBQ0tBR0UgKyAiLiI7Ci0KLQotCS8vICoqKioqKioqKiogQVBJICoqKioqKioqKioKLQotCS8vIEVjbGlzcGVMaW5rIGFubm90YXRpb25zCi0JU3RyaW5nIEJBU0lDX0NPTExFQ1RJT04gPSBQQUNLQUdFXyArICJCYXNpY0NvbGxlY3Rpb24iOwotCVN0cmluZyBCQVNJQ19NQVAgPSBQQUNLQUdFXyArICJCYXNpY01hcCI7Ci0JU3RyaW5nIENBQ0hFID0gUEFDS0FHRV8gKyAiQ2FjaGUiOwotCQlTdHJpbmcgQ0FDSEVfX1NIQVJFRCA9ICJzaGFyZWQiOwotCQlTdHJpbmcgQ0FDSEVfX0VYUElSWSA9ICJleHBpcnkiOwotCQlTdHJpbmcgQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSA9ICJleHBpcnlUaW1lT2ZEYXkiOwotCQlTdHJpbmcgQ0FDSEVfX1RZUEUgPSAidHlwZSI7Ci0JCVN0cmluZyBDQUNIRV9fU0laRSA9ICJzaXplIjsKLQkJU3RyaW5nIENBQ0hFX19BTFdBWVNfUkVGUkVTSCA9ICJhbHdheXNSZWZyZXNoIjsKLQkJU3RyaW5nIENBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVIgPSAicmVmcmVzaE9ubHlJZk5ld2VyIjsKLQkJU3RyaW5nIENBQ0hFX19ESVNBQkxFX0hJVFMgPSAiZGlzYWJsZUhpdHMiOwotCQlTdHJpbmcgQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFID0gImNvb3JkaW5hdGlvblR5cGUiOwotCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkcgPSBQQUNLQUdFXyArICJDaGFuZ2VUcmFja2luZyI7Ci0JCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkdfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgQ09OVkVSU0lPTl9WQUxVRSA9IFBBQ0tBR0VfICsgIkNvbnZlcnNpb25WYWx1ZSI7Ci0JCVN0cmluZyBDT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFID0gImRhdGFWYWx1ZSI7Ci0JCVN0cmluZyBDT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUUgPSAib2JqZWN0VmFsdWUiOwotCVN0cmluZyBDT05WRVJUID0gUEFDS0FHRV8gKyAiQ29udmVydCI7Ci0JCVN0cmluZyBDT05WRVJUX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIENPTlZFUlRFUiA9IFBBQ0tBR0VfICsgIkNvbnZlcnRlciI7Ci0JCVN0cmluZyBDT05WRVJURVJfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBDT05WRVJURVJfX0NPTlZFUlRFUl9DTEFTUyA9ICJjb252ZXJ0ZXJDbGFzcyI7Ci0JU3RyaW5nIENVU1RPTUlaRVIgPSBQQUNLQUdFXyArICJDdXN0b21pemVyIjsKLQkJU3RyaW5nIENVU1RPTUlaRVJfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgRVhJU1RFTkNFX0NIRUNLSU5HID0gUEFDS0FHRV8gKyAiRXhpc3RlbmNlQ2hlY2tpbmciOwotCQlTdHJpbmcgRVhJU1RFTkNFX0NIRUNLSU5HX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIEpPSU5fRkVUQ0ggPSBQQUNLQUdFXyArICJKb2luRmV0Y2giOwotCQlTdHJpbmcgSk9JTl9GRVRDSF9fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBNVVRBQkxFID0gUEFDS0FHRV8gKyAiTXV0YWJsZSI7Ci0JCVN0cmluZyBNVVRBQkxFX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IFBBQ0tBR0VfICsgIk9iamVjdFR5cGVDb252ZXJ0ZXIiOwotCQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUgPSAiZGF0YVR5cGUiOwotCQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSA9ICJvYmplY3RUeXBlIjsKLQkJU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVMgPSAiY29udmVyc2lvblZhbHVlcyI7Ci0JCVN0cmluZyBPQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RFRkFVTFRfT0JKRUNUX1ZBTFVFID0gImRlZmF1bHRPYmplY3RWYWx1ZSI7Ci0JU3RyaW5nIFBSSU1BUllfS0VZID0gUEFDS0FHRV8gKyAiUHJpbWFyeUtleSI7Ci0JCVN0cmluZyBQUklNQVJZX0tFWV9fVkFMSURBVElPTiA9ICJ2YWxpZGF0aW9uIjsKLQkJU3RyaW5nIFBSSU1BUllfS0VZX19DQUNIRV9LRVlfVFlQRSA9ICJjYWNoZUtleVR5cGUiOwotCQlTdHJpbmcgUFJJTUFSWV9LRVlfX0NPTFVNTlMgPSAiY29sdW1ucyI7Ci0JU3RyaW5nIFBSSVZBVEVfT1dORUQgPSBQQUNLQUdFXyArICJQcml2YXRlT3duZWQiOwotCVN0cmluZyBSRUFEX09OTFkgPSBQQUNLQUdFXyArICJSZWFkT25seSI7Ci0JU3RyaW5nIFJFQURfVFJBTlNGT1JNRVIgPSBQQUNLQUdFXyArICJSZWFkVHJhbnNmb3JtZXIiOwotCQlTdHJpbmcgUkVBRF9UUkFOU0ZPUk1FUl9fVFJBTlNGT1JNRVJfQ0xBU1MgPSAidHJhbnNmb3JtZXJDbGFzcyI7Ci0JCVN0cmluZyBSRUFEX1RSQU5TRk9STUVSX19NRVRIT0QgPSAibWV0aG9kIjsKLQlTdHJpbmcgU1RSVUNUX0NPTlZFUlRFUiA9IFBBQ0tBR0VfICsgIlN0cnVjdENvbnZlcnRlciI7Ci0JCVN0cmluZyBTVFJVQ1RfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSID0gImNvbnZlcnRlciI7Ci0JU3RyaW5nIFRJTUVfT0ZfREFZID0gUEFDS0FHRV8gKyAiVGltZU9mRGF5IjsKLQkJU3RyaW5nIFRJTUVfT0ZfREFZX19IT1VSID0gImhvdXIiOwotCQlTdHJpbmcgVElNRV9PRl9EQVlfX01JTlVURSA9ICJtaW51dGUiOwotCQlTdHJpbmcgVElNRV9PRl9EQVlfX1NFQ09ORCA9ICJzZWNvbmQiOwotCQlTdHJpbmcgVElNRV9PRl9EQVlfX01JTExJU0VDT05EID0gIm1pbGxpc2Vjb25kIjsKLQlTdHJpbmcgVFJBTlNGT1JNQVRJT04gPSBQQUNLQUdFXyArICJUcmFuc2Zvcm1hdGlvbiI7Ci0JCVN0cmluZyBUUkFOU0ZPUk1BVElPTl9fRkVUQ0ggPSAiZmV0Y2giOwotCQlTdHJpbmcgVFJBTlNGT1JNQVRJT05fX09QVElPTkFMID0gIm9wdGlvbmFsIjsKLQlTdHJpbmcgVFlQRV9DT05WRVJURVIgPSBQQUNLQUdFXyArICJUeXBlQ29udmVydGVyIjsKLQkJU3RyaW5nIFRZUEVfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSA9ICJkYXRhVHlwZSI7Ci0JCVN0cmluZyBUWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUgPSAib2JqZWN0VHlwZSI7Ci0JU3RyaW5nIFZBUklBQkxFX09ORV9UT19PTkUgPSBQQUNLQUdFXyArICJWYXJpYWJsZU9uZVRvT25lIjsKLQlTdHJpbmcgV1JJVEVfVFJBTlNGT1JNRVIgPSBQQUNLQUdFXyArICJXcml0ZVRyYW5zZm9ybWVyIjsKLQkJU3RyaW5nIFdSSVRFX1RSQU5TRk9STUVSX19UUkFOU0ZPUk1FUl9DTEFTUyA9ICJ0cmFuc2Zvcm1lckNsYXNzIjsKLQkJU3RyaW5nIFdSSVRFX1RSQU5TRk9STUVSX19NRVRIT0QgPSAibWV0aG9kIjsKLQkJU3RyaW5nIFdSSVRFX1RSQU5TRk9STUVSX19DT0xVTU4gPSAiY29sdW1uIjsKLQlTdHJpbmcgV1JJVEVfVFJBTlNGT1JNRVJTID0gUEFDS0FHRV8gKyAiV3JpdGVUcmFuc2Zvcm1lcnMiOwotCQlTdHJpbmcgV1JJVEVfVFJBTlNGT1JNRVJTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0KLQkvLyBFY2xpcHNlTGluayBlbnVtcwotCVN0cmluZyBDQUNIRV9DT09SRElOQVRJT05fVFlQRSA9IFBBQ0tBR0VfICsgIkNhY2hlQ29vcmRpbmF0aW9uVHlwZSI7Ci0JCVN0cmluZyBDQUNIRV9DT09SRElOQVRJT05fVFlQRV8gPSBDQUNIRV9DT09SRElOQVRJT05fVFlQRSArICIuIjsKLQkJU3RyaW5nIENBQ0hFX0NPT1JESU5BVElPTl9UWVBFX19TRU5EX09CSkVDVF9DSEFOR0VTID0gQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfICsgIlNFTkRfT0JKRUNUX0NIQU5HRVMiOwotCQlTdHJpbmcgQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfX0lOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTID0gQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfICsgIklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTIjsKLQkJU3RyaW5nIENBQ0hFX0NPT1JESU5BVElPTl9UWVBFX19TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyA9IENBQ0hFX0NPT1JESU5BVElPTl9UWVBFXyArICJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyI7Ci0JCVN0cmluZyBDQUNIRV9DT09SRElOQVRJT05fVFlQRV9fTk9ORSA9IENBQ0hFX0NPT1JESU5BVElPTl9UWVBFXyArICJOT05FIjsKLQlTdHJpbmcgQ0FDSEVfVFlQRSA9IFBBQ0tBR0VfICsgIkNhY2hlVHlwZSI7Ci0JCVN0cmluZyBDQUNIRV9UWVBFXyA9IENBQ0hFX1RZUEUgKyAiLiI7Ci0JCVN0cmluZyBDQUNIRV9UWVBFX19GVUxMID0gQ0FDSEVfVFlQRV8gKyAiRlVMTCI7Ci0JCVN0cmluZyBDQUNIRV9UWVBFX19XRUFLID0gQ0FDSEVfVFlQRV8gKyAiV0VBSyI7Ci0JCVN0cmluZyBDQUNIRV9UWVBFX19TT0ZUID0gQ0FDSEVfVFlQRV8gKyAiU09GVCI7Ci0JCVN0cmluZyBDQUNIRV9UWVBFX19TT0ZUX1dFQUsgPSBDQUNIRV9UWVBFXyArICJTT0ZUX1dFQUsiOwotCQlTdHJpbmcgQ0FDSEVfVFlQRV9fSEFSRF9XRUFLID0gQ0FDSEVfVFlQRV8gKyAiSEFSRF9XRUFLIjsKLQkJU3RyaW5nIENBQ0hFX1RZUEVfX0NBQ0hFID0gQ0FDSEVfVFlQRV8gKyAiQ0FDSEUiOwotCQlTdHJpbmcgQ0FDSEVfVFlQRV9fTk9ORSA9IENBQ0hFX1RZUEVfICsgIk5PTkUiOwotCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkdfVFlQRSA9IFBBQ0tBR0VfICsgIkNoYW5nZVRyYWNraW5nVHlwZSI7Ci0JCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkdfVFlQRV8gPSBDSEFOR0VfVFJBQ0tJTkdfVFlQRSArICIuIjsKLQkJU3RyaW5nIENIQU5HRV9UUkFDS0lOR19UWVBFX19BVFRSSUJVVEUgPSBDSEFOR0VfVFJBQ0tJTkdfVFlQRV8gKyAiQVRUUklCVVRFIjsKLQkJU3RyaW5nIENIQU5HRV9UUkFDS0lOR19UWVBFX19PQkpFQ1QgPSBDSEFOR0VfVFJBQ0tJTkdfVFlQRV8gKyAiT0JKRUNUIjsKLQkJU3RyaW5nIENIQU5HRV9UUkFDS0lOR19UWVBFX19ERUZFUlJFRCA9IENIQU5HRV9UUkFDS0lOR19UWVBFXyArICJERUZFUlJFRCI7Ci0JCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkdfVFlQRV9fQVVUTyA9IENIQU5HRV9UUkFDS0lOR19UWVBFXyArICJBVVRPIjsKLQlTdHJpbmcgRVhJU1RFTkNFX1RZUEUgPSBQQUNLQUdFXyArICJFeGlzdGVuY2VUeXBlIjsKLQkJU3RyaW5nIEVYSVNURU5DRV9UWVBFXyA9IEVYSVNURU5DRV9UWVBFICsgIi4iOwotCQlTdHJpbmcgRVhJU1RFTkNFX1RZUEVfX0NIRUNLX0NBQ0hFID0gRVhJU1RFTkNFX1RZUEVfICsgIkNIRUNLX0NBQ0hFIjsKLQkJU3RyaW5nIEVYSVNURU5DRV9UWVBFX19DSEVDS19EQVRBQkFTRSA9IEVYSVNURU5DRV9UWVBFXyArICJDSEVDS19EQVRBQkFTRSI7Ci0JCVN0cmluZyBFWElTVEVOQ0VfVFlQRV9fQVNTVU1FX0VYSVNURU5DRSA9IEVYSVNURU5DRV9UWVBFXyArICJBU1NVTUVfRVhJU1RFTkNFIjsKLQkJU3RyaW5nIEVYSVNURU5DRV9UWVBFX19BU1NVTUVfTk9OX0VYSVNURU5DRSA9IEVYSVNURU5DRV9UWVBFXyArICJBU1NVTUVfTk9OX0VYSVNURU5DRSI7Ci0JU3RyaW5nIEpPSU5fRkVUQ0hfVFlQRSA9IFBBQ0tBR0VfICsgIkpvaW5GZXRjaFR5cGUiOwotCQlTdHJpbmcgSk9JTl9GRVRDSF9UWVBFXyA9IEpPSU5fRkVUQ0hfVFlQRSArICIuIjsKLQkJU3RyaW5nIEpPSU5fRkVUQ0hfVFlQRV9fSU5ORVIgPSBKT0lOX0ZFVENIX1RZUEVfICsgIklOTkVSIjsKLQkJU3RyaW5nIEpPSU5fRkVUQ0hfVFlQRV9fT1VURVIgPSBKT0lOX0ZFVENIX1RZUEVfICsgIk9VVEVSIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZjVlN2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkJhc2ljQ29sbGVjdGlvbgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLkJBU0lDX0NPTExFQ1RJT047Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg0MDQ5Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlbGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5CYXNpY01hcAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuQkFTSUNfTUFQOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MmRiMzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLkNBQ0hFOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd0eXBlJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQ2FjaGVUeXBlIGdldFR5cGUoKTsKLQkJU3RyaW5nIFRZUEVfUFJPUEVSVFkgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3R5cGUnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VHlwZShDYWNoZVR5cGUgdHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3R5cGUnIGVsZW1lbnQuCi0JICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQotCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NpemUnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlJbnRlZ2VyIGdldFNpemUoKTsKLQkJU3RyaW5nIFNJWkVfUFJPUEVSVFkgPSAic2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NpemUnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0U2l6ZShJbnRlZ2VyIHNpemUpOwotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3NpemUnIGVsZW1lbnQuCi0JICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQotCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0U2l6ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NoYXJlZCcgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0U2hhcmVkKCk7Ci0JCVN0cmluZyBTSEFSRURfUFJPUEVSVFkgPSAic2hhcmVkIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc2hhcmVkJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFNoYXJlZChCb29sZWFuIHNoYXJlZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3NoYXJlZCcgZWxlbWVudC4KLQkgKiBJZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9Ci0JICogZm9yIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTaGFyZWRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2V4cGlyeScgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUludGVnZXIgZ2V0RXhwaXJ5KCk7Ci0JCVN0cmluZyBFWFBJUllfUFJPUEVSVFkgPSAiZXhwaXJ5IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZXhwaXJ5JyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldEV4cGlyeShJbnRlZ2VyIGV4cGlyeSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2V4cGlyeScgZWxlbWVudC4KLQkgKiBJZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9Ci0JICogZm9yIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRFeHBpcnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdleHBpcnlUaW1lT2ZEYXknIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gZ2V0RXhwaXJ5VGltZU9mRGF5KCk7Ci0JCVN0cmluZyBFWFBJUllfVElNRV9PRl9EQVlfUFJPUEVSVFkgPSAiZXhwaXJ5VGltZU9mRGF5IjsgLy8kTk9OLU5MUy0xJAotCi0JRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGFkZEV4cGlyeVRpbWVPZkRheSgpOwotCi0Jdm9pZCByZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdleHBpcnlUaW1lT2ZEYXknIGVsZW1lbnQuCi0JICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQotCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGltZU9mRGF5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnYWx3YXlzUmVmcmVzaCcgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0QWx3YXlzUmVmcmVzaCgpOwotCQlTdHJpbmcgQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFkgPSAiYWx3YXlzUmVmcmVzaCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2Fsd2F5c1JlZnJlc2gnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuIGFsd2F5c1JlZnJlc2gpOwotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2Fsd2F5c1JlZnJlc2gnIGVsZW1lbnQuCi0JICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQotCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0QWx3YXlzUmVmcmVzaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3JlZnJlc2hPbmx5SWZOZXdlcicgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0JCVN0cmluZyBSRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFkgPSAicmVmcmVzaE9ubHlJZk5ld2VyIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncmVmcmVzaE9ubHlJZk5ld2VyJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcik7Ci0JCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAncmVmcmVzaE9ubHlJZk5ld2VyJyBlbGVtZW50LgotCSAqIElmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0KLQkgKiBmb3IgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFJlZnJlc2hPbmx5SWZOZXdlclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2Rpc2FibGVIaXRzJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQm9vbGVhbiBnZXREaXNhYmxlSGl0cygpOwotCQlTdHJpbmcgRElTQUJMRV9ISVRTX1BST1BFUlRZID0gImRpc2FibGVIaXRzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZGlzYWJsZUhpdHMnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0RGlzYWJsZUhpdHMoQm9vbGVhbiBkaXNhYmxlSGl0cyk7Ci0JCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnZGlzYWJsZUhpdHMnIGVsZW1lbnQuCi0JICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQotCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0RGlzYWJsZXNIaXRzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29vcmRpbmF0aW9uVHlwZScgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUNhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRDb29yZGluYXRpb25UeXBlKCk7Ci0JCVN0cmluZyBDT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSA9ICJjb29yZGluYXRpb25UeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29vcmRpbmF0aW9uVHlwZScgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnY29vcmRpbmF0aW9uVHlwZScgZWxlbWVudC4KLQkgKiBJZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9Ci0JICogZm9yIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRDb29yZGluYXRpb25UeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWE1ZmE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2hhbmdlVHJhY2tpbmcKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORzsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMTY1ZWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVyc2lvblZhbHVlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZGF0YVZhbHVlJyBlbGVtZW50IG9mIHRoZSBDb252ZXJzaW9uVmFsdWUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXREYXRhVmFsdWUoKTsKLQkJU3RyaW5nIERBVEFfVkFMVUVfUFJPUEVSVFkgPSAiZGF0YVZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdkYXRhVmFsdWUnIGVsZW1lbnQgb2YgdGhlIENvbnZlcnNpb25WYWx1ZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldERhdGFWYWx1ZShTdHJpbmcgZGF0YVZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnZGF0YVZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ29udmVyc2lvblZhbHVlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldERhdGFWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnb2JqZWN0VmFsdWUnIGVsZW1lbnQgb2YgdGhlIENvbnZlcnNpb25WYWx1ZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldE9iamVjdFZhbHVlKCk7Ci0JCVN0cmluZyBPQkpFQ1RfVkFMVUVfUFJPUEVSVFkgPSAib2JqZWN0VmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ29iamVjdFZhbHVlJyBlbGVtZW50IG9mIHRoZSBDb252ZXJzaW9uVmFsdWUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRPYmplY3RWYWx1ZShTdHJpbmcgb2JqZWN0VmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdvYmplY3RWYWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIENvbnZlcnNpb25WYWx1ZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRPYmplY3RWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhZjIwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5DT05WRVJUOwotCQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBDb252ZXJ0IGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIENvbnZlcnQgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDb252ZXJ0IGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ3ZhbHVlJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIHZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZGY4YTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0ZXIKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbgotCWV4dGVuZHMgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuQ09OVkVSVEVSOwotCQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnRlckNsYXNzJyBlbGVtZW50IG9mIHRoZSBDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0Q29udmVydGVyQ2xhc3MoKTsKLQkJU3RyaW5nIENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSA9ICJjb252ZXJ0ZXJDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnRlckNsYXNzJyBlbGVtZW50IG9mIHRoZSBDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgY3VzdG9taXplciBjbGFzcyBuYW1lIGFzIHJlc29sdmVkIGJ5IHRoZSBBU1QncyBiaW5kaW5ncy4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O0NvbnZlcnRlcihHZW5kZXJDb252ZXJ0ZXIuY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gIm1vZGVsLkdlbmRlckNvbnZlcnRlciIgaWYgdGhlcmUgaXMgYW4gaW1wb3J0IGZvciBtb2RlbC5HZW5kZXJDb252ZXJ0ZXIuCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzTmFtZSgpOwotCQlTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0NPTlZFUlRFUl9DTEFTU19OQU1FX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2NvbnZlcnRlckNsYXNzJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb252ZXJ0ZXIgY2xhc3MgaW1wbGVtZW50cyB0aGUgc3BlY2lmaWVkIGludGVyZmFjZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIjRUNMSVBTRUxJTktfQ09OVkVSVEVSX0NMQVNTX05BTUUKLQkgKi8KLQlib29sZWFuIGNvbnZlcnRlckNsYXNzSW1wbGVtZW50c0ludGVyZmFjZShTdHJpbmcgaW50ZXJmYWNlTmFtZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOTRkYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkN1c3RvbWl6ZXIKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUjsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBDdXN0b21pemVyIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIGN1c3RvbWl6ZXIgY2xhc3MgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUgQVNUJ3MgYmluZGluZ3MuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtDdXN0b21pemVyKEVtcGxveWVlQ3VzdG9taXplci5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAibW9kZWwuRW1wbG95ZWVDdXN0b21pemVyIiBpZiB0aGVyZSBpcyBhbiBpbXBvcnQgZm9yIG1vZGVsLkVtcGxveWVlQ3VzdG9taXplci4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3NOYW1lKCk7Ci0JCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfQ1VTVE9NSVpFUl9DTEFTU19OQU1FX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDdXN0b21pemVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXN0b21pemVyIGNsYXNzIGltcGxlbWVudHMgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplciNFQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRQotCSAqLwotCWJvb2xlYW4gY3VzdG9taXplckNsYXNzSW1wbGVtZW50c0ludGVyZmFjZShTdHJpbmcgaW50ZXJmYWNlTmFtZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkNDk3NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkV4aXN0ZW5jZUNoZWNraW5nCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkc7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JRXhpc3RlbmNlVHlwZSBnZXRWYWx1ZSgpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKEV4aXN0ZW5jZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEV4aXN0ZW5jZUNoZWNraW5nIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY2ZWUxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Kb2luRmV0Y2gKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5KT0lOX0ZFVENIOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgSm9pbkZldGNoIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlKb2luRmV0Y2hUeXBlIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIEpvaW5GZXRjaCBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKEpvaW5GZXRjaFR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEpvaW5GZXRjaCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmNDk1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZWxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuTXV0YWJsZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5NVVRBQkxFOwotCQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBNdXRhYmxlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlCb29sZWFuIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBNdXRhYmxlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIE11dGFibGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EwNDY5MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29tbW9uIHByb3RvY29sIGFtb25nOgotICogICAgIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnRlcgotICogICAgIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlN0cnVjdENvbnZlcnRlcgotICogICAgIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlR5cGVDb252ZXJ0ZXIKLSAqICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5PYmplY3RUeXBlQ29udmVydGVyCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZScgZWxlbWVudCBvZiB0aGUgKkNvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWUnIGVsZW1lbnQgb2YgdGhlICpDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ25hbWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDdXN0b21Db252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgyZDRkYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk9iamVjdFR5cGVDb252ZXJ0ZXIKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIEJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnNpb25WYWx1ZXMnIGVsZW1lbnQgb2YgdGhlIE9iamVjdFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmF0b3IgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVzKCk7Ci0JCVN0cmluZyBDT05WRVJTSU9OX1ZBTFVFU19MSVNUID0gImNvbnZlcnNpb25WYWx1ZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJzaW9uVmFsdWVzJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JaW50IGNvbnZlcnNpb25WYWx1ZXNTaXplKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJzaW9uVmFsdWVzJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZUF0KGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJzaW9uVmFsdWVzJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JaW50IGluZGV4T2ZDb252ZXJzaW9uVmFsdWUoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZSk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJzaW9uVmFsdWVzJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGFkZENvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29udmVyc2lvblZhbHVlcycgZWxlbWVudCBvZiB0aGUgT2JqZWN0VHlwZUNvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgbW92ZUNvbnZlcnNpb25WYWx1ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJzaW9uVmFsdWVzJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KTsKLQkKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZGVmYXVsdE9iamVjdFZhbHVlJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCk7Ci0JCVN0cmluZyBERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSA9ICJkZWZhdWx0T2JqZWN0VmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2RlZmF1bHRPYmplY3RWYWx1ZScgZWxlbWVudCBvZiB0aGUgT2JqZWN0VHlwZUNvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldERlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdkZWZhdWx0T2JqZWN0VmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldERlZmF1bHRPYmplY3RWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1Zjc2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5QcmltYXJ5S2V5Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLlBSSU1BUllfS0VZOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAzN2M2MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUHJpdmF0ZU93bmVkCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsJCi0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQ7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3MmY3Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5SZWFkT25seQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsJCi0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLlJFQURfT05MWTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNTM2MWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlJlYWRUcmFuc2Zvcm1lcgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg1ZmYzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlN0cnVjdENvbnZlcnRlcgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJ0ZXInIGVsZW1lbnQgb2YgdGhlIFN0cnVjdENvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRDb252ZXJ0ZXIoKTsKLQkJU3RyaW5nIENPTlZFUlRFUl9QUk9QRVJUWSA9ICJjb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnRlcicgZWxlbWVudCBvZiB0aGUgU3RydWN0Q29udmVydGVyIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0Q29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdjb252ZXJ0ZXInIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBTdHJ1Y3RDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0Q29udmVydGVyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwZWQwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVGltZU9mRGF5Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuVElNRV9PRl9EQVk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2hvdXInIGVsZW1lbnQgb2YgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uLgotCSAqLwotCUludGVnZXIgZ2V0SG91cigpOwotCQlTdHJpbmcgSE9VUl9QUk9QRVJUWSA9ICJob3VyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdob3VyJyBlbGVtZW50IG9mIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQgZnJvbSB0aGUgYW5ub3RhdGlvbgotCSAqLwotCXZvaWQgc2V0SG91cihJbnRlZ2VyIGhvdXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdob3VyJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldEhvdXJUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ21pbnV0ZScgZWxlbWVudCBvZiB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24uCi0JICovCi0JSW50ZWdlciBnZXRNaW51dGUoKTsKLQkJU3RyaW5nIE1JTlVURV9QUk9QRVJUWSA9ICJtaW51dGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ21pbnV0ZScgZWxlbWVudCBvZiB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50IGZyb20gdGhlIGFubm90YXRpb24KLQkgKi8KLQl2b2lkIHNldE1pbnV0ZShJbnRlZ2VyIG1pbnV0ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ21pbnV0ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRNaW51dGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NlY29uZCcgZWxlbWVudCBvZiB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24uCi0JICovCi0JSW50ZWdlciBnZXRTZWNvbmQoKTsKLQkJU3RyaW5nIFNFQ09ORF9QUk9QRVJUWSA9ICJzZWNvbmQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NlY29uZCcgZWxlbWVudCBvZiB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50IGZyb20gdGhlIGFubm90YXRpb24KLQkgKi8KLQl2b2lkIHNldFNlY29uZChJbnRlZ2VyIHNlY29uZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3NlY29uZCcgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTZWNvbmRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ21pbGxpc2Vjb25kJyBlbGVtZW50IG9mIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlJbnRlZ2VyIGdldE1pbGxpc2Vjb25kKCk7Ci0JCVN0cmluZyBNSUxMSVNFQ09ORF9QUk9QRVJUWSA9ICJtaWxsaXNlY29uZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbWlsbGlzZWNvbmQnIGVsZW1lbnQgb2YgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBhbm5vdGF0aW9uCi0JICovCi0Jdm9pZCBzZXRNaWxsaXNlY29uZChJbnRlZ2VyIG1pbGxpc2Vjb25kKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbWlsbGlzZWNvbmQnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TWlsbGlzZWNvbmRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBlNDA0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlRyYW5zZm9ybWF0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTjsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZmV0Y2gnIGVsZW1lbnQgb2YgdGhlIFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlGZXRjaFR5cGUgZ2V0RmV0Y2goKTsKLQkJU3RyaW5nIEZFVENIX1BST1BFUlRZID0gImZldGNoIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdmZXRjaCcgZWxlbWVudCBvZiB0aGUgVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdmZXRjaCcgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldEZldGNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdvcHRpb25hbCcgZWxlbWVudCBvZiB0aGUgVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0T3B0aW9uYWwoKTsKLQkJU3RyaW5nIE9QVElPTkFMX1BST1BFUlRZID0gIm9wdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdvcHRpb25hbCcgZWxlbWVudCBvZiB0aGUgVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnb3B0aW9uYWwnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzJjOWEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb21tb24gcHJvdG9jb2wgYW1vbmc6Ci0gKiAgICAgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCi0gKiAgICAgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuV3JpdGVUcmFuc2Zvcm1lcgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3RyYW5zZm9ybWVyQ2xhc3MnIGVsZW1lbnQgb2YgdGhlICpUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSBwcmVjZWRpbmcgIi5jbGFzcyIuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtSZWFkVHJhbnNmb3JtZXIodHJhbnNmb3JtZXJDbGFzcz1FbXBsb3llZS5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAiRW1wbG95ZWUiLgotCSAqLwotCVN0cmluZyBnZXRUcmFuc2Zvcm1lckNsYXNzKCk7Ci0JCVN0cmluZyBUUkFOU0ZPUk1FUl9DTEFTU19QUk9QRVJUWSA9ICJ0cmFuc2Zvcm1lckNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd0cmFuc2Zvcm1lckNsYXNzJyBlbGVtZW50IG9mIHRoZSAqVHJhbnNmb3JtZXIgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRUcmFuc2Zvcm1lckNsYXNzKFN0cmluZyB0cmFuc2Zvcm1lckNsYXNzKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndHJhbnNmb3JtZXJDbGFzcycgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRUcmFuc2Zvcm1lckNsYXNzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdtZXRob2QnIGVsZW1lbnQgb2YgdGhlICpUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldE1ldGhvZCgpOwotCQlTdHJpbmcgTUVUSE9EX1BST1BFUlRZID0gIm1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbWV0aG9kJyBlbGVtZW50IG9mIHRoZSAqVHJhbnNmb3JtZXIgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRNZXRob2QoU3RyaW5nIG1ldGhvZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ21ldGhvZCcgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRNZXRob2RUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZGYyOGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmNDU2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVmFyaWFibGVPbmVUb09uZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5WQVJJQUJMRV9PTkVfVE9fT05FOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTBlMmZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlbGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Xcml0ZVRyYW5zZm9ybWVyCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUjsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29sdW1uJyBlbGVtZW50IG9mIHRoZSBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtbigpOwotCQlTdHJpbmcgQ09MVU1OX1BST1BFUlRZID0gImNvbHVtbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiBhIENvbHVtbkFubm90YXRpb24sIGJ1dCBkbyBub3QgcmV0dXJuIG51bGwgaWYgdGhlICdjb2x1bW4nCi0JICogZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgV3JpdGVUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLiBJbnN0ZWFkCi0JICogcmV0dXJuIGEgbnVsbCBvYmplY3QuCi0JICovCi0JQ29sdW1uQW5ub3RhdGlvbiBnZXROb25OdWxsQ29sdW1uKCk7Ci0KLQkvKioKLQkgKiBBZGQgdGhlICdjb2x1bW4nIGVsZW1lbnQgdG8gdGhlIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlDb2x1bW5Bbm5vdGF0aW9uIGFkZENvbHVtbigpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSAnY29sdW1uJyBlbGVtZW50IGZyb20gdGhlIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIHJlbW92ZUNvbHVtbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdjb2x1bW4nIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldENvbHVtblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0V4aXN0ZW5jZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0V4aXN0ZW5jZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiMDZkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FeGlzdGVuY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGVudW0KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkV4aXN0ZW5jZVR5cGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgZW51bSBFeGlzdGVuY2VUeXBlIHsKLQotICAgIENIRUNLX0NBQ0hFKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9UWVBFX19DSEVDS19DQUNIRSksCi0gICAgQ0hFQ0tfREFUQUJBU0UoRWNsaXBzZUxpbmsuRVhJU1RFTkNFX1RZUEVfX0NIRUNLX0RBVEFCQVNFKSwKLSAgICBBU1NVTUVfRVhJU1RFTkNFKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9UWVBFX19BU1NVTUVfRVhJU1RFTkNFKSwKLSAgICBBU1NVTUVfTk9OX0VYSVNURU5DRShFY2xpcHNlTGluay5FWElTVEVOQ0VfVFlQRV9fQVNTVU1FX05PTl9FWElTVEVOQ0UpOwotCi0KLQlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOwotCi0JRXhpc3RlbmNlVHlwZShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBFeGlzdGVuY2VUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXhpc3RlbmNlVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJZm9yIChFeGlzdGVuY2VUeXBlIGV4aXN0ZW5jZVR5cGUgOiBFeGlzdGVuY2VUeXBlLnZhbHVlcygpKSB7Ci0JCQlpZiAoZXhpc3RlbmNlVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIGV4aXN0ZW5jZVR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKEV4aXN0ZW5jZVR5cGUgZXhpc3RlbmNlVHlwZSkgewotCQlyZXR1cm4gKGV4aXN0ZW5jZVR5cGUgPT0gbnVsbCkgPyBudWxsIDogZXhpc3RlbmNlVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9Kb2luRmV0Y2hUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9Kb2luRmV0Y2hUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MDI3OTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvSm9pbkZldGNoVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBlbnVtCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Kb2luRmV0Y2hUeXBlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGVudW0gSm9pbkZldGNoVHlwZSB7Ci0KLSAgICBJTk5FUihFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEVfX0lOTkVSKSwKLSAgICBPVVRFUihFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEVfX09VVEVSKTsKLQotCi0JcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKLQotCUpvaW5GZXRjaFR5cGUoU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlID0gamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFBbm5vdGF0aW9uVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgSm9pbkZldGNoVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEpvaW5GZXRjaFR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWZvciAoSm9pbkZldGNoVHlwZSBqb2luRmV0Y2hUeXBlIDogSm9pbkZldGNoVHlwZS52YWx1ZXMoKSkgewotCQkJaWYgKGpvaW5GZXRjaFR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpLmVxdWFscyhqYXZhQW5ub3RhdGlvblZhbHVlKSkgewotCQkJCXJldHVybiBqb2luRmV0Y2hUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShKb2luRmV0Y2hUeXBlIGpvaW5GZXRjaFR5cGUpIHsKLQkJcmV0dXJuIChqb2luRmV0Y2hUeXBlID09IG51bGwpID8gbnVsbCA6IGpvaW5GZXRjaFR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZTg5NzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJzaW9uVmFsdWUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24KLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uCi17Ci0JLy8gY29tYmluZSB0d28gaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9BdHRyaWJ1dGVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0F0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlMzU3MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0F0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldEJhc2ljQ29sbGVjdGlvbnMgPGVtPkJhc2ljIENvbGxlY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRCYXNpY01hcHMgPGVtPkJhc2ljIE1hcHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldFRyYW5zZm9ybWF0aW9ucyA8ZW0+VHJhbnNmb3JtYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRWYXJpYWJsZU9uZVRvT25lcyA8ZW0+VmFyaWFibGUgT25lIFRvIE9uZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0QXR0cmlidXRlcygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVzIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNpY0NvbGxlY3Rpb25zKCkgPGVtPkJhc2ljIENvbGxlY3Rpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2ljQ29sbGVjdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxCYXNpY0NvbGxlY3Rpb24+IGJhc2ljQ29sbGVjdGlvbnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNpY01hcHMoKSA8ZW0+QmFzaWMgTWFwczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNpY01hcHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxCYXNpY01hcD4gYmFzaWNNYXBzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNmb3JtYXRpb25zKCkgPGVtPlRyYW5zZm9ybWF0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcmFuc2Zvcm1hdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxUcmFuc2Zvcm1hdGlvbj4gdHJhbnNmb3JtYXRpb25zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFibGVPbmVUb09uZXMoKSA8ZW0+VmFyaWFibGUgT25lIFRvIE9uZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFibGVPbmVUb09uZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxWYXJpYWJsZU9uZVRvT25lPiB2YXJpYWJsZU9uZVRvT25lczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBdHRyaWJ1dGVzKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5BVFRSSUJVVEVTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2ljIENvbGxlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNpYyBDb2xsZWN0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2ljIENvbGxlY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRBdHRyaWJ1dGVzX0Jhc2ljQ29sbGVjdGlvbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEJhc2ljQ29sbGVjdGlvbj4gZ2V0QmFzaWNDb2xsZWN0aW9ucygpCi0JewotCQlpZiAoYmFzaWNDb2xsZWN0aW9ucyA9PSBudWxsKQotCQl7Ci0JCQliYXNpY0NvbGxlY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEJhc2ljQ29sbGVjdGlvbj4oWG1sQmFzaWNDb2xsZWN0aW9uLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfQ09MTEVDVElPTlMpOwotCQl9Ci0JCXJldHVybiBiYXNpY0NvbGxlY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2ljIE1hcHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzaWMgTWFwczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2ljIE1hcHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXNfQmFzaWNNYXBzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxCYXNpY01hcD4gZ2V0QmFzaWNNYXBzKCkKLQl7Ci0JCWlmIChiYXNpY01hcHMgPT0gbnVsbCkKLQkJewotCQkJYmFzaWNNYXBzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEJhc2ljTWFwPihYbWxCYXNpY01hcC5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDX01BUFMpOwotCQl9Ci0JCXJldHVybiBiYXNpY01hcHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJhbnNmb3JtYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRyYW5zZm9ybWF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zZm9ybWF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19UcmFuc2Zvcm1hdGlvbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFRyYW5zZm9ybWF0aW9uPiBnZXRUcmFuc2Zvcm1hdGlvbnMoKQotCXsKLQkJaWYgKHRyYW5zZm9ybWF0aW9ucyA9PSBudWxsKQotCQl7Ci0JCQl0cmFuc2Zvcm1hdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVHJhbnNmb3JtYXRpb24+KFhtbFRyYW5zZm9ybWF0aW9uLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVFJBTlNGT1JNQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gdHJhbnNmb3JtYXRpb25zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmxlIE9uZSBUbyBPbmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFibGUgT25lIFRvIE9uZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJsZSBPbmUgVG8gT25lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19WYXJpYWJsZU9uZVRvT25lcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sVmFyaWFibGVPbmVUb09uZT4gZ2V0VmFyaWFibGVPbmVUb09uZXMoKQotCXsKLQkJaWYgKHZhcmlhYmxlT25lVG9PbmVzID09IG51bGwpCi0JCXsKLQkJCXZhcmlhYmxlT25lVG9PbmVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFZhcmlhYmxlT25lVG9PbmU+KFhtbFZhcmlhYmxlT25lVG9PbmUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19WQVJJQUJMRV9PTkVfVE9fT05FUyk7Ci0JCX0KLQkJcmV0dXJuIHZhcmlhYmxlT25lVG9PbmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfQ09MTEVDVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRCYXNpY0NvbGxlY3Rpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDX01BUFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRCYXNpY01hcHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVFJBTlNGT1JNQVRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VHJhbnNmb3JtYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1ZBUklBQkxFX09ORV9UT19PTkVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VmFyaWFibGVPbmVUb09uZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDX0NPTExFQ1RJT05TOgotCQkJCXJldHVybiBnZXRCYXNpY0NvbGxlY3Rpb25zKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19NQVBTOgotCQkJCXJldHVybiBnZXRCYXNpY01hcHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1RSQU5TRk9STUFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0VHJhbnNmb3JtYXRpb25zKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19WQVJJQUJMRV9PTkVfVE9fT05FUzoKLQkJCQlyZXR1cm4gZ2V0VmFyaWFibGVPbmVUb09uZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19DT0xMRUNUSU9OUzoKLQkJCQlnZXRCYXNpY0NvbGxlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRCYXNpY0NvbGxlY3Rpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxCYXNpY0NvbGxlY3Rpb24+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19NQVBTOgotCQkJCWdldEJhc2ljTWFwcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzaWNNYXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxCYXNpY01hcD4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1RSQU5TRk9STUFUSU9OUzoKLQkJCQlnZXRUcmFuc2Zvcm1hdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldFRyYW5zZm9ybWF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHJhbnNmb3JtYXRpb24+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19WQVJJQUJMRV9PTkVfVE9fT05FUzoKLQkJCQlnZXRWYXJpYWJsZU9uZVRvT25lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0VmFyaWFibGVPbmVUb09uZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFZhcmlhYmxlT25lVG9PbmU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19DT0xMRUNUSU9OUzoKLQkJCQlnZXRCYXNpY0NvbGxlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19NQVBTOgotCQkJCWdldEJhc2ljTWFwcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVFJBTlNGT1JNQVRJT05TOgotCQkJCWdldFRyYW5zZm9ybWF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVkFSSUFCTEVfT05FX1RPX09ORVM6Ci0JCQkJZ2V0VmFyaWFibGVPbmVUb09uZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19DT0xMRUNUSU9OUzoKLQkJCQlyZXR1cm4gYmFzaWNDb2xsZWN0aW9ucyAhPSBudWxsICYmICFiYXNpY0NvbGxlY3Rpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDX01BUFM6Ci0JCQkJcmV0dXJuIGJhc2ljTWFwcyAhPSBudWxsICYmICFiYXNpY01hcHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVFJBTlNGT1JNQVRJT05TOgotCQkJCXJldHVybiB0cmFuc2Zvcm1hdGlvbnMgIT0gbnVsbCAmJiAhdHJhbnNmb3JtYXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1ZBUklBQkxFX09ORV9UT19PTkVTOgotCQkJCXJldHVybiB2YXJpYWJsZU9uZVRvT25lcyAhPSBudWxsICYmICF2YXJpYWJsZU9uZVRvT25lcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxYbWxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRBdHRyaWJ1dGVNYXBwaW5ncygpIHsKLQkJLy8gY29udmVydCBsaXN0cyB0byBhcnJheXMgdG8gYXZvaWQgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgdG8gcmVzdWx0IGxpc3QKLQkJQXJyYXlMaXN0PFhtbEF0dHJpYnV0ZU1hcHBpbmc+IGF0dHJpYnV0ZU1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxYbWxBdHRyaWJ1dGVNYXBwaW5nPigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldElkcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0RW1iZWRkZWRJZHMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldEJhc2ljcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0QmFzaWNDb2xsZWN0aW9ucygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0QmFzaWNNYXBzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhdHRyaWJ1dGVNYXBwaW5ncywgdGhpcy5nZXRWZXJzaW9ucygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0TWFueVRvT25lcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0T25lVG9NYW55cygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0T25lVG9PbmVzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhdHRyaWJ1dGVNYXBwaW5ncywgdGhpcy5nZXRWYXJpYWJsZU9uZVRvT25lcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0TWFueVRvTWFueXMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0RW1iZWRkZWRzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhdHRyaWJ1dGVNYXBwaW5ncywgdGhpcy5nZXRUcmFuc2Zvcm1hdGlvbnMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldFRyYW5zaWVudHMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlyZXR1cm4gYXR0cmlidXRlTWFwcGluZ3M7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxBdHRyaWJ1dGVNYXBwaW5nW10gRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZID0gbmV3IFhtbEF0dHJpYnV0ZU1hcHBpbmdbMF07Ci0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBidWlsZFRyYW5zbGF0b3IoCi0JCQlFY2xpcHNlTGluay5BVFRSSUJVVEVTLCAKLQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFR5cGVNYXBwaW5nX0F0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlYbWxJZC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuSUQsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfSWRzKCkpLAotCQkJWG1sRW1iZWRkZWRJZC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuRU1CRURERURfSUQsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfRW1iZWRkZWRJZHMoKSksCi0JCQlYbWxCYXNpYy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuQkFTSUMsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfQmFzaWNzKCkpLAotCQkJWG1sQmFzaWNDb2xsZWN0aW9uLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5CQVNJQ19DT0xMRUNUSU9OLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfQmFzaWNDb2xsZWN0aW9ucygpKSwKLQkJCVhtbEJhc2ljTWFwLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5CQVNJQ19NQVAsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19CYXNpY01hcHMoKSksCi0JCQlYbWxWZXJzaW9uLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5WRVJTSU9OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX1ZlcnNpb25zKCkpLAotCQkJWG1sTWFueVRvT25lLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5NQU5ZX1RPX09ORSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19NYW55VG9PbmVzKCkpLAotCQkJWG1sT25lVG9NYW55LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5PTkVfVE9fTUFOWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19PbmVUb01hbnlzKCkpLAotCQkJWG1sT25lVG9PbmUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk9ORV9UT19PTkUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfT25lVG9PbmVzKCkpLAotCQkJWG1sVmFyaWFibGVPbmVUb09uZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuVkFSSUFCTEVfT05FX1RPX09ORSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX1ZhcmlhYmxlT25lVG9PbmVzKCkpLAotCQkJWG1sTWFueVRvTWFueS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuTUFOWV9UT19NQU5ZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX01hbnlUb01hbnlzKCkpLAotCQkJWG1sRWxlbWVudENvbGxlY3Rpb24uYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZXNfMl8wX0VsZW1lbnRDb2xsZWN0aW9ucygpKSwKLQkJCVhtbEVtYmVkZGVkLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5FTUJFRERFRCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19FbWJlZGRlZHMoKSksCi0JCQlYbWxUcmFuc2Zvcm1hdGlvbi5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuVFJBTlNGT1JNQVRJT04sIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19UcmFuc2Zvcm1hdGlvbnMoKSksCi0JCQlYbWxUcmFuc2llbnQuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlRSQU5TSUVOVCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19UcmFuc2llbnRzKCkpLAotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODEzOGVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkNhY2hlIENvb3JkaW5hdGlvbiBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldENhY2hlQ29vcmRpbmF0aW9uVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gQ2FjaGVDb29yZGluYXRpb25UeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNFTkQgT0JKRUNUIENIQU5HRVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0VORF9PQkpFQ1RfQ0hBTkdFU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVNFTkRfT0JKRUNUX0NIQU5HRVMoMCwgIlNFTkRfT0JKRUNUX0NIQU5HRVMiLCAiU0VORF9PQkpFQ1RfQ0hBTkdFUyIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5WQUxJREFURSBDSEFOR0VEIE9CSkVDVFM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUygxLCAiSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiLCAiSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNFTkQgTkVXIE9CSkVDVFMgV0lUSCBDSEFOR0VTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMoMiwgIlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTIiwgIlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PTkVfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlOT05FKDMsICJOT05FIiwgIk5PTkUiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNFTkQgT0JKRUNUIENIQU5HRVM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNFTkQgT0JKRUNUIENIQU5HRVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0VORF9PQkpFQ1RfQ0hBTkdFUwotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTkRfT0JKRUNUX0NIQU5HRVNfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5WQUxJREFURSBDSEFOR0VEIE9CSkVDVFM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOVkFMSURBVEUgQ0hBTkdFRCBPQkpFQ1RTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFNfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VORCBORVcgT0JKRUNUUyBXSVRIIENIQU5HRVM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNFTkQgTkVXIE9CSkVDVFMgV0lUSCBDSEFOR0VTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVNfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT05FCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORV9WQUxVRSA9IDM7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+Q2FjaGUgQ29vcmRpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENhY2hlQ29vcmRpbmF0aW9uVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBDYWNoZUNvb3JkaW5hdGlvblR5cGVbXQotCQl7Ci0JCQlTRU5EX09CSkVDVF9DSEFOR0VTLAotCQkJSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCi0JCQlTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywKLQkJCU5PTkUsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+Q2FjaGUgQ29vcmRpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDYWNoZUNvb3JkaW5hdGlvblR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q2FjaGUgQ29vcmRpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUNhY2hlQ29vcmRpbmF0aW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJQ2FjaGVDb29yZGluYXRpb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q2FjaGUgQ29vcmRpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgU0VORF9PQkpFQ1RfQ0hBTkdFU19WQUxVRTogcmV0dXJuIFNFTkRfT0JKRUNUX0NIQU5HRVM7Ci0JCQljYXNlIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTX1ZBTFVFOiByZXR1cm4gSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFM7Ci0JCQljYXNlIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTX1ZBTFVFOiByZXR1cm4gU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM7Ci0JCQljYXNlIE5PTkVfVkFMVUU6IHJldHVybiBOT05FOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDYWNoZUNvb3JkaW5hdGlvblR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL0NhY2hlQ29vcmRpbmF0aW9uVHlwZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9DYWNoZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vQ2FjaGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNzZhMmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9DYWNoZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRDYWNoZVR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIENhY2hlVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GVUxMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZVTExfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlGVUxMKDAsICJGVUxMIiwgIkZVTEwiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPldFQUs8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjV0VBS19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVdFQUsoMSwgIldFQUsiLCAiV0VBSyIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U09GVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTT0ZUX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JU09GVCgyLCAiU09GVCIsICJTT0ZUIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TT0ZUIFdFQUs8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU09GVF9XRUFLX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JU09GVF9XRUFLKDMsICJTT0ZUX1dFQUsiLCAiU09GVF9XRUFLIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5IQVJEIFdFQUs8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSEFSRF9XRUFLX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JSEFSRF9XRUFLKDQsICJIQVJEX1dFQUsiLCAiSEFSRF9XRUFLIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DQUNIRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDQUNIRV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUNBQ0hFKDUsICJDQUNIRSIsICJDQUNIRSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT05FX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JTk9ORSg2LCAiTk9ORSIsICJOT05FIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GVUxMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5GVUxMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZVTEwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVUxMX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPldFQUs8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPldFQUs8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjV0VBSwotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFQUtfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U09GVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U09GVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTT0ZUCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09GVF9WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TT0ZUIFdFQUs8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNPRlQgV0VBSzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTT0ZUX1dFQUsKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0ZUX1dFQUtfVkFMVUUgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SEFSRCBXRUFLPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5IQVJEIFdFQUs8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSEFSRF9XRUFLCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFSRF9XRUFLX1ZBTFVFID0gNDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNBQ0hFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DQUNIRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDQUNIRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBQ0hFX1ZBTFVFID0gNTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9ORQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkVfVkFMVUUgPSA2OwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkNhY2hlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENhY2hlVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBDYWNoZVR5cGVbXQotCQl7Ci0JCQlGVUxMLAotCQkJV0VBSywKLQkJCVNPRlQsCi0JCQlTT0ZUX1dFQUssCi0JCQlIQVJEX1dFQUssCi0JCQlDQUNIRSwKLQkJCU5PTkUsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+Q2FjaGUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PENhY2hlVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5DYWNoZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2FjaGVUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlDYWNoZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q2FjaGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENhY2hlVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJQ2FjaGVUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q2FjaGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENhY2hlVHlwZSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBGVUxMX1ZBTFVFOiByZXR1cm4gRlVMTDsKLQkJCWNhc2UgV0VBS19WQUxVRTogcmV0dXJuIFdFQUs7Ci0JCQljYXNlIFNPRlRfVkFMVUU6IHJldHVybiBTT0ZUOwotCQkJY2FzZSBTT0ZUX1dFQUtfVkFMVUU6IHJldHVybiBTT0ZUX1dFQUs7Ci0JCQljYXNlIEhBUkRfV0VBS19WQUxVRTogcmV0dXJuIEhBUkRfV0VBSzsKLQkJCWNhc2UgQ0FDSEVfVkFMVUU6IHJldHVybiBDQUNIRTsKLQkJCWNhc2UgTk9ORV9WQUxVRTogcmV0dXJuIE5PTkU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENhY2hlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vQ2FjaGVUeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0VjbGlwc2VMaW5rLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0VjbGlwc2VMaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYjliMTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FY2xpcHNlTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGluawotCWV4dGVuZHMgSlBBCi17Ci0JU3RyaW5nIFNDSEVNQV9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSI7Ci0JU3RyaW5nIFNDSEVNQV9MT0NBVElPTiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3JtXzFfMC54c2QiOwotCVN0cmluZyBTQ0hFTUFfVkVSU0lPTiA9ICIxLjAiOwotCQotCS8vIEVjbGlwc2VMaW5rIHNwZWNpZmljIG5vZGVzCi0JCi0JU3RyaW5nIEFDQ0VTU19NRVRIT0RTID0gImFjY2Vzcy1tZXRob2RzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBQ0NFU1NfTUVUSE9EU19fR0VUX01FVEhPRCA9ICJnZXQtbWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRCA9ICJzZXQtbWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBCQVNJQ19DT0xMRUNUSU9OID0gImJhc2ljLWNvbGxlY3Rpb24iOyAgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBCQVNJQ19NQVAgPSAiYmFzaWMtbWFwIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQ0FDSEUgPSAiY2FjaGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQUNIRV9fRVhQSVJZID0gImV4cGlyeSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENBQ0hFX19TSVpFID0gInNpemUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQUNIRV9fU0hBUkVEID0gInNoYXJlZCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENBQ0hFX19UWVBFID0gInR5cGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQUNIRV9fQUxXQVlTX1JFRlJFU0ggPSAiYWx3YXlzLXJlZnJlc2giOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSID0gInJlZnJlc2gtb25seS1pZi1uZXdlciI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENBQ0hFX19ESVNBQkxFX0hJVFMgPSAiZGlzYWJsZS1oaXRzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFID0gImNvb3JkaW5hdGlvbi10eXBlIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQ0hBTkdFX1RSQUNLSU5HID0gImNoYW5nZS10cmFja2luZyI7ICAvLyROT04tTkxTLTEkCi0JCQotCVN0cmluZyBDT05WRVJTSU9OX1ZBTFVFID0gImNvbnZlcnNpb24tdmFsdWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUUgPSAiZGF0YS12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFID0gIm9iamVjdC12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBDT05WRVJUID0gImNvbnZlcnQiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIENPTlZFUlRFUiA9ICJjb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlZFUlRFUl9fQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlZFUlRFUl9fTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBDT1BZX1BPTElDWSA9ICJjb3B5LXBvbGljeSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIENPUFlfUE9MSUNZX19DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQ0xPTkVfQ09QWV9QT0xJQ1kgPSAiY2xvbmUtY29weS1wb2xpY3kiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBDTE9ORV9DT1BZX1BPTElDWV9fTUVUSE9EID0gIm1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIENMT05FX0NPUFlfUE9MSUNZX19XT1JLSU5HX0NPUFlfTUVUSE9EID0gIndvcmtpbmctY29weS1tZXRob2QiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIENVU1RPTUlaRVIgPSAiY3VzdG9taXplciI7ICAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyI7ICAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgRVhJU1RFTkNFX0NIRUNLSU5HID0gImV4aXN0ZW5jZS1jaGVja2luZyI7ICAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEVYUElSWV9USU1FX09GX0RBWSA9ICJleHBpcnktdGltZS1vZi1kYXkiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFWFBJUllfVElNRV9PRl9EQVlfX0hPVVIgPSAiaG91ciI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVYUElSWV9USU1FX09GX0RBWV9fTUlOVVRFID0gIm1pbnV0ZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVYUElSWV9USU1FX09GX0RBWV9fU0VDT05EID0gInNlY29uZCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVYUElSWV9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQgPSAibWlsbGlzZWNvbmQiOyAgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBJTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZID0gImluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgSk9JTl9GRVRDSCA9ICJqb2luLWZldGNoIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgTVVUQUJMRSA9ICJtdXRhYmxlIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWSA9ICJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVCA9ICJoaW50IjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX0NMQVNTID0gInJlc3VsdC1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIE5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORyA9ICJyZXN1bHQtc2V0LW1hcHBpbmciOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBOQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QUk9DRURVUkVfTkFNRSA9ICJwcm9jZWR1cmUtbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIE5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVCA9ICJyZXR1cm5zLXJlc3VsdC1zZXQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUiA9ICJwYXJhbWV0ZXIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBQQVJBTUVURVJfX0RJUkVDVElPTiA9ICJkaXJlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBQQVJBTUVURVJfX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIFBBUkFNRVRFUl9fUVVFUllfUEFSQU1FVEVSID0gInF1ZXJ5LXBhcmFtZXRlciI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIFBBUkFNRVRFUl9fVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgUEFSQU1FVEVSX19KREJDX1RZUEUgPSAiamRiYy10eXBlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRSA9ICJqZGJjLXR5cGUtbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0KLQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gIm9iamVjdC10eXBlLWNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFID0gImRhdGEtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSA9ICJvYmplY3QtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRSA9ICJkZWZhdWx0LW9iamVjdC12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBPUFRJTUlTVElDX0xPQ0tJTkcgPSAib3B0aW1pc3RpYy1sb2NraW5nIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU4gPSAic2VsZWN0ZWQtY29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBPUFRJTUlTVElDX0xPQ0tJTkdfX0NBU0NBREUgPSAiY2FzY2FkZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBQUklWQVRFX09XTkVEID0gInByaXZhdGUtb3duZWQiOyAgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBQUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJPUEVSVFlfX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJPUEVSVFlfX1ZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUk9QRVJUWV9fVkFMVUVfVFlQRSA9ICJ2YWx1ZS10eXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBSRUFEX09OTFkgPSAicmVhZC1vbmx5IjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlTdHJpbmcgU1RSVUNUX0NPTlZFUlRFUiA9ICJzdHJ1Y3QtY29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTVFJVQ1RfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUiA9ICJjb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIFRSQU5TRk9STUFUSU9OID0gInRyYW5zZm9ybWF0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUWVBFID0gInR5cGUiOyAgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBUWVBFX0NPTlZFUlRFUiA9ICJ0eXBlLWNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVFlQRV9DT05WRVJURVJfX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSA9ICJkYXRhLXR5cGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSA9ICJvYmplY3QtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JU3RyaW5nIFZBUklBQkxFX09ORV9UT19PTkUgPSAidmFyaWFibGUtb25lLXRvLW9uZSI7ICAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0VjbGlwc2VMaW5rT3JtRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FY2xpcHNlTGlua09ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEzZjIwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0VjbGlwc2VMaW5rT3JtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeUltcGwKLXsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybUZhY3RvcnkgZUlOU1RBTkNFID0gaW5pdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1GYWN0b3J5IGluaXQoKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCUVjbGlwc2VMaW5rT3JtRmFjdG9yeSB0aGVFY2xpcHNlTGlua09ybUZhY3RvcnkgPSAoRWNsaXBzZUxpbmtPcm1GYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqcHQuZWNsaXBzZWxpbmsub3JtLnhtaSIpOyAKLQkJCWlmICh0aGVFY2xpcHNlTGlua09ybUZhY3RvcnkgIT0gbnVsbCkKLQkJCXsKLQkJCQlyZXR1cm4gdGhlRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotCQl7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtRmFjdG9yeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKQotCXsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVM6IHJldHVybiAoRU9iamVjdCljcmVhdGVBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUM6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxCYXNpYygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxCYXNpY0NvbGxlY3Rpb24oKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVA6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxCYXNpY01hcCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQmF0Y2hGZXRjaCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQ2FjaGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQ2xvbmVDb3B5UG9saWN5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSU0lPTl9WQUxVRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbENvbnZlcnNpb25WYWx1ZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbENvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPUFlfUE9MSUNZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQ29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NVU1RPTUlaRVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxDdXN0b21pemVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRW1iZWRkYWJsZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRW1iZWRkZWQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEVtYmVkZGVkSWQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFk6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbnRpdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1M6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0FUVFJJQlVURTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEZldGNoQXR0cmlidXRlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVA6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxGZXRjaEdyb3VwKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSUQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxJZCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE1hbnlUb01hbnkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE1hbnlUb09uZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sTWFwcGVkU3VwZXJjbGFzcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX0NPTlZFUlRFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE5hbWVkQ29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxPbmVUb01hbnkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sT25lVG9PbmUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxPcHRpbWlzdGljTG9ja2luZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE9yZGVyQ29sdW1uKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVk6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQcmltYXJ5S2V5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFk6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQcm9wZXJ0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUXVlcnlSZWRpcmVjdG9ycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFVFVSTl9JTlNFUlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxSZXR1cm5JbnNlcnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVF9DT05WRVJURVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFRpbWVPZkRheSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sVHJhbnNmb3JtYXRpb24oKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxUcmFuc2llbnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sVmFyaWFibGVPbmVUb09uZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxWZXJzaW9uKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5DQUNIRV9DT09SRElOQVRJT05fVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ2FjaGVDb29yZGluYXRpb25UeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5DQUNIRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDYWNoZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmdUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRElSRUNUSU9OOgotCQkJCXJldHVybiBjcmVhdGVYbWxEaXJlY3Rpb25Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkVYSVNURU5DRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFeGlzdGVuY2VUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVYbWxKb2luRmV0Y2hUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVhtbE9wdGltaXN0aWNMb2NraW5nVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDYWNoZUNvb3JkaW5hdGlvblR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQ0FDSEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENhY2hlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRYbWxDaGFuZ2VUcmFja2luZ1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0RJUkVDVElPTjoKLQkJCQlyZXR1cm4gY29udmVydFhtbERpcmVjdGlvblRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5FWElTVEVOQ0VfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEV4aXN0ZW5jZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFhtbEpvaW5GZXRjaFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0WG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGNyZWF0ZVhtbEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyB4bWxBY2Nlc3NNZXRob2RzID0gbmV3IFhtbEFjY2Vzc01ldGhvZHMoKTsKLQkJcmV0dXJuIHhtbEFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZXMgY3JlYXRlQXR0cmlidXRlcygpCi0JewotCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlcygpOwotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQmFzaWMgY3JlYXRlWG1sQmFzaWMoKQotCXsKLQkJWG1sQmFzaWMgeG1sQmFzaWMgPSBuZXcgWG1sQmFzaWMoKTsKLQkJcmV0dXJuIHhtbEJhc2ljOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxCYXNpY0NvbGxlY3Rpb24gY3JlYXRlWG1sQmFzaWNDb2xsZWN0aW9uKCkKLQl7Ci0JCVhtbEJhc2ljQ29sbGVjdGlvbiB4bWxCYXNpY0NvbGxlY3Rpb24gPSBuZXcgWG1sQmFzaWNDb2xsZWN0aW9uKCk7Ci0JCXJldHVybiB4bWxCYXNpY0NvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEJhc2ljTWFwIGNyZWF0ZVhtbEJhc2ljTWFwKCkKLQl7Ci0JCVhtbEJhc2ljTWFwIHhtbEJhc2ljTWFwID0gbmV3IFhtbEJhc2ljTWFwKCk7Ci0JCXJldHVybiB4bWxCYXNpY01hcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQmF0Y2hGZXRjaCBjcmVhdGVYbWxCYXRjaEZldGNoKCkKLQl7Ci0JCVhtbEJhdGNoRmV0Y2ggeG1sQmF0Y2hGZXRjaCA9IG5ldyBYbWxCYXRjaEZldGNoKCk7Ci0JCXJldHVybiB4bWxCYXRjaEZldGNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDYWNoZSBjcmVhdGVYbWxDYWNoZSgpCi0JewotCQlYbWxDYWNoZSB4bWxDYWNoZSA9IG5ldyBYbWxDYWNoZSgpOwotCQlyZXR1cm4geG1sQ2FjaGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENoYW5nZVRyYWNraW5nIGNyZWF0ZVhtbENoYW5nZVRyYWNraW5nKCkKLQl7Ci0JCVhtbENoYW5nZVRyYWNraW5nIHhtbENoYW5nZVRyYWNraW5nID0gbmV3IFhtbENoYW5nZVRyYWNraW5nKCk7Ci0JCXJldHVybiB4bWxDaGFuZ2VUcmFja2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2xvbmVDb3B5UG9saWN5IGNyZWF0ZVhtbENsb25lQ29weVBvbGljeSgpCi0JewotCQlYbWxDbG9uZUNvcHlQb2xpY3kgeG1sQ2xvbmVDb3B5UG9saWN5ID0gbmV3IFhtbENsb25lQ29weVBvbGljeSgpOwotCQlyZXR1cm4geG1sQ2xvbmVDb3B5UG9saWN5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb252ZXJzaW9uVmFsdWUgY3JlYXRlWG1sQ29udmVyc2lvblZhbHVlKCkKLQl7Ci0JCVhtbENvbnZlcnNpb25WYWx1ZSB4bWxDb252ZXJzaW9uVmFsdWUgPSBuZXcgWG1sQ29udmVyc2lvblZhbHVlKCk7Ci0JCXJldHVybiB4bWxDb252ZXJzaW9uVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvbnZlcnRlciBjcmVhdGVYbWxDb252ZXJ0ZXIoKQotCXsKLQkJWG1sQ29udmVydGVyIHhtbENvbnZlcnRlciA9IG5ldyBYbWxDb252ZXJ0ZXIoKTsKLQkJcmV0dXJuIHhtbENvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29weVBvbGljeSBjcmVhdGVYbWxDb3B5UG9saWN5KCkKLQl7Ci0JCVhtbENvcHlQb2xpY3kgeG1sQ29weVBvbGljeSA9IG5ldyBYbWxDb3B5UG9saWN5KCk7Ci0JCXJldHVybiB4bWxDb3B5UG9saWN5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDdXN0b21pemVyIGNyZWF0ZVhtbEN1c3RvbWl6ZXIoKQotCXsKLQkJWG1sQ3VzdG9taXplciB4bWxDdXN0b21pemVyID0gbmV3IFhtbEN1c3RvbWl6ZXIoKTsKLQkJcmV0dXJuIHhtbEN1c3RvbWl6ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnRDb2xsZWN0aW9uIGNyZWF0ZVhtbEVsZW1lbnRDb2xsZWN0aW9uKCkKLQl7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uIHhtbEVsZW1lbnRDb2xsZWN0aW9uID0gbmV3IFhtbEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCXJldHVybiB4bWxFbGVtZW50Q29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRW1iZWRkYWJsZSBjcmVhdGVYbWxFbWJlZGRhYmxlKCkKLQl7Ci0JCVhtbEVtYmVkZGFibGUgeG1sRW1iZWRkYWJsZSA9IG5ldyBYbWxFbWJlZGRhYmxlKCk7Ci0JCXJldHVybiB4bWxFbWJlZGRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxFbWJlZGRlZCBjcmVhdGVYbWxFbWJlZGRlZCgpCi0JewotCQlYbWxFbWJlZGRlZCB4bWxFbWJlZGRlZCA9IG5ldyBYbWxFbWJlZGRlZCgpOwotCQlyZXR1cm4geG1sRW1iZWRkZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEVtYmVkZGVkSWQgY3JlYXRlWG1sRW1iZWRkZWRJZCgpCi0JewotCQlYbWxFbWJlZGRlZElkIHhtbEVtYmVkZGVkSWQgPSBuZXcgWG1sRW1iZWRkZWRJZCgpOwotCQlyZXR1cm4geG1sRW1iZWRkZWRJZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRW50aXR5IGNyZWF0ZVhtbEVudGl0eSgpCi0JewotCQlYbWxFbnRpdHkgeG1sRW50aXR5ID0gbmV3IFhtbEVudGl0eSgpOwotCQlyZXR1cm4geG1sRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxFbnRpdHlNYXBwaW5ncyBjcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpCi0JewotCQlYbWxFbnRpdHlNYXBwaW5ncyB4bWxFbnRpdHlNYXBwaW5ncyA9IG5ldyBYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlyZXR1cm4geG1sRW50aXR5TWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEZldGNoQXR0cmlidXRlIGNyZWF0ZVhtbEZldGNoQXR0cmlidXRlKCkKLQl7Ci0JCVhtbEZldGNoQXR0cmlidXRlIHhtbEZldGNoQXR0cmlidXRlID0gbmV3IFhtbEZldGNoQXR0cmlidXRlKCk7Ci0JCXJldHVybiB4bWxGZXRjaEF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRmV0Y2hHcm91cCBjcmVhdGVYbWxGZXRjaEdyb3VwKCkKLQl7Ci0JCVhtbEZldGNoR3JvdXAgeG1sRmV0Y2hHcm91cCA9IG5ldyBYbWxGZXRjaEdyb3VwKCk7Ci0JCXJldHVybiB4bWxGZXRjaEdyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxJZCBjcmVhdGVYbWxJZCgpCi0JewotCQlYbWxJZCB4bWxJZCA9IG5ldyBYbWxJZCgpOwotCQlyZXR1cm4geG1sSWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGNyZWF0ZVhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQl7Ci0JCVhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5ID0gbmV3IFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCk7Ci0JCXJldHVybiB4bWxJbnN0YW50aWF0aW9uQ29weVBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sTWFueVRvTWFueSBjcmVhdGVYbWxNYW55VG9NYW55KCkKLQl7Ci0JCVhtbE1hbnlUb01hbnkgeG1sTWFueVRvTWFueSA9IG5ldyBYbWxNYW55VG9NYW55KCk7Ci0JCXJldHVybiB4bWxNYW55VG9NYW55OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxNYW55VG9PbmUgY3JlYXRlWG1sTWFueVRvT25lKCkKLQl7Ci0JCVhtbE1hbnlUb09uZSB4bWxNYW55VG9PbmUgPSBuZXcgWG1sTWFueVRvT25lKCk7Ci0JCXJldHVybiB4bWxNYW55VG9PbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE1hcHBlZFN1cGVyY2xhc3MgY3JlYXRlWG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JewotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHhtbE1hcHBlZFN1cGVyY2xhc3MgPSBuZXcgWG1sTWFwcGVkU3VwZXJjbGFzcygpOwotCQlyZXR1cm4geG1sTWFwcGVkU3VwZXJjbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sTmFtZWRDb252ZXJ0ZXIgY3JlYXRlWG1sTmFtZWRDb252ZXJ0ZXIoKQotCXsKLQkJWG1sTmFtZWRDb252ZXJ0ZXIgeG1sTmFtZWRDb252ZXJ0ZXIgPSBuZXcgWG1sTmFtZWRDb252ZXJ0ZXIoKTsKLQkJcmV0dXJuIHhtbE5hbWVkQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGNyZWF0ZVhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCXsKLQkJWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSB4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5ID0gbmV3IFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKTsKLQkJcmV0dXJuIHhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JewotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBuZXcgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXR1cm4geG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT25lVG9NYW55IGNyZWF0ZVhtbE9uZVRvTWFueSgpCi0JewotCQlYbWxPbmVUb01hbnkgeG1sT25lVG9NYW55ID0gbmV3IFhtbE9uZVRvTWFueSgpOwotCQlyZXR1cm4geG1sT25lVG9NYW55OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxPbmVUb09uZSBjcmVhdGVYbWxPbmVUb09uZSgpCi0JewotCQlYbWxPbmVUb09uZSB4bWxPbmVUb09uZSA9IG5ldyBYbWxPbmVUb09uZSgpOwotCQlyZXR1cm4geG1sT25lVG9PbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9wdGltaXN0aWNMb2NraW5nIGNyZWF0ZVhtbE9wdGltaXN0aWNMb2NraW5nKCkKLQl7Ci0JCVhtbE9wdGltaXN0aWNMb2NraW5nIHhtbE9wdGltaXN0aWNMb2NraW5nID0gbmV3IFhtbE9wdGltaXN0aWNMb2NraW5nKCk7Ci0JCXJldHVybiB4bWxPcHRpbWlzdGljTG9ja2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT3JkZXJDb2x1bW4gY3JlYXRlWG1sT3JkZXJDb2x1bW4oKQotCXsKLQkJWG1sT3JkZXJDb2x1bW4geG1sT3JkZXJDb2x1bW4gPSBuZXcgWG1sT3JkZXJDb2x1bW4oKTsKLQkJcmV0dXJuIHhtbE9yZGVyQ29sdW1uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBjcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0JewotCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IG5ldyBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQl7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gbmV3IFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUHJpbWFyeUtleSBjcmVhdGVYbWxQcmltYXJ5S2V5KCkKLQl7Ci0JCVhtbFByaW1hcnlLZXkgeG1sUHJpbWFyeUtleSA9IG5ldyBYbWxQcmltYXJ5S2V5KCk7Ci0JCXJldHVybiB4bWxQcmltYXJ5S2V5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQcm9wZXJ0eSBjcmVhdGVYbWxQcm9wZXJ0eSgpCi0JewotCQlYbWxQcm9wZXJ0eSB4bWxQcm9wZXJ0eSA9IG5ldyBYbWxQcm9wZXJ0eSgpOwotCQlyZXR1cm4geG1sUHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFF1ZXJ5UmVkaXJlY3RvcnMgY3JlYXRlWG1sUXVlcnlSZWRpcmVjdG9ycygpCi0JewotCQlYbWxRdWVyeVJlZGlyZWN0b3JzIHhtbFF1ZXJ5UmVkaXJlY3RvcnMgPSBuZXcgWG1sUXVlcnlSZWRpcmVjdG9ycygpOwotCQlyZXR1cm4geG1sUXVlcnlSZWRpcmVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUmV0dXJuSW5zZXJ0IGNyZWF0ZVhtbFJldHVybkluc2VydCgpCi0JewotCQlYbWxSZXR1cm5JbnNlcnQgeG1sUmV0dXJuSW5zZXJ0ID0gbmV3IFhtbFJldHVybkluc2VydCgpOwotCQlyZXR1cm4geG1sUmV0dXJuSW5zZXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgY3JlYXRlWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCkKLQl7Ci0JCVhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciB4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgPSBuZXcgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCk7Ci0JCXJldHVybiB4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFN0cnVjdENvbnZlcnRlciBjcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKQotCXsKLQkJWG1sU3RydWN0Q29udmVydGVyIHhtbFN0cnVjdENvbnZlcnRlciA9IG5ldyBYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJcmV0dXJuIHhtbFN0cnVjdENvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVGltZU9mRGF5IGNyZWF0ZVhtbFRpbWVPZkRheSgpCi0JewotCQlYbWxUaW1lT2ZEYXkgeG1sVGltZU9mRGF5ID0gbmV3IFhtbFRpbWVPZkRheSgpOwotCQlyZXR1cm4geG1sVGltZU9mRGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUcmFuc2Zvcm1hdGlvbiBjcmVhdGVYbWxUcmFuc2Zvcm1hdGlvbigpCi0JewotCQlYbWxUcmFuc2Zvcm1hdGlvbiB4bWxUcmFuc2Zvcm1hdGlvbiA9IG5ldyBYbWxUcmFuc2Zvcm1hdGlvbigpOwotCQlyZXR1cm4geG1sVHJhbnNmb3JtYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFRyYW5zaWVudCBjcmVhdGVYbWxUcmFuc2llbnQoKQotCXsKLQkJWG1sVHJhbnNpZW50IHhtbFRyYW5zaWVudCA9IG5ldyBYbWxUcmFuc2llbnQoKTsKLQkJcmV0dXJuIHhtbFRyYW5zaWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBjcmVhdGVYbWxUeXBlQ29udmVydGVyKCkKLQl7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgeG1sVHlwZUNvbnZlcnRlciA9IG5ldyBYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJldHVybiB4bWxUeXBlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxWYXJpYWJsZU9uZVRvT25lIGNyZWF0ZVhtbFZhcmlhYmxlT25lVG9PbmUoKQotCXsKLQkJWG1sVmFyaWFibGVPbmVUb09uZSB4bWxWYXJpYWJsZU9uZVRvT25lID0gbmV3IFhtbFZhcmlhYmxlT25lVG9PbmUoKTsKLQkJcmV0dXJuIHhtbFZhcmlhYmxlT25lVG9PbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFZlcnNpb24gY3JlYXRlWG1sVmVyc2lvbigpCi0JewotCQlYbWxWZXJzaW9uIHhtbFZlcnNpb24gPSBuZXcgWG1sVmVyc2lvbigpOwotCQlyZXR1cm4geG1sVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNyZWF0ZUNhY2hlQ29vcmRpbmF0aW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCUNhY2hlQ29vcmRpbmF0aW9uVHlwZSByZXN1bHQgPSBDYWNoZUNvb3JkaW5hdGlvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENhY2hlQ29vcmRpbmF0aW9uVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhY2hlVHlwZSBjcmVhdGVDYWNoZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlDYWNoZVR5cGUgcmVzdWx0ID0gQ2FjaGVUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDYWNoZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDaGFuZ2VUcmFja2luZ1R5cGUgY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmdUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIHJlc3VsdCA9IFhtbENoYW5nZVRyYWNraW5nVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0WG1sQ2hhbmdlVHJhY2tpbmdUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRGlyZWN0aW9uIGNyZWF0ZVhtbERpcmVjdGlvbkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCVhtbERpcmVjdGlvbiByZXN1bHQgPSBYbWxEaXJlY3Rpb24uZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFhtbERpcmVjdGlvblRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4aXN0ZW5jZVR5cGUgY3JlYXRlRXhpc3RlbmNlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCUV4aXN0ZW5jZVR5cGUgcmVzdWx0ID0gRXhpc3RlbmNlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RXhpc3RlbmNlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEpvaW5GZXRjaFR5cGUgY3JlYXRlWG1sSm9pbkZldGNoVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCVhtbEpvaW5GZXRjaFR5cGUgcmVzdWx0ID0gWG1sSm9pbkZldGNoVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0WG1sSm9pbkZldGNoVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBjcmVhdGVYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgcmVzdWx0ID0gWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVBhY2thZ2UgZ2V0RWNsaXBzZUxpbmtPcm1QYWNrYWdlKCkKLQl7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtPcm1QYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1QYWNrYWdlIGdldFBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FY2xpcHNlTGlua09ybVBhY2thZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGQ5NmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FY2xpcHNlTGlua09ybVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1QYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2VJbXBsCi17Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOQU1FID0gIm9ybSI7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfVVJJID0gImpwdC5lY2xpcHNlbGluay5vcm0ueG1pIjsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybSI7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVjbGlwc2VMaW5rT3JtUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmluaXQoKTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzIDxlbT5YbWwgQWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19NRVRIT0RTID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2V0IE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9EID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2V0IE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19NRVRIT0RTX19TRVRfTUVUSE9EID0gMTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEFjY2VzcyBNZXRob2RzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19NRVRIT0RTX0ZFQVRVUkVfQ09VTlQgPSAyOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgPGVtPlhtbCBBY2Nlc3MgTWV0aG9kcyBIb2xkZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUiA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUyA9IDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBY2Nlc3MgTWV0aG9kcyBIb2xkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX0ZFQVRVUkVfQ09VTlQgPSAxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcgPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX01BUFBJTkcgPSAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FID0gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTID0gMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0RFU0NSSVBUSU9OID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBDb2xsZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19FTEVNRU5UX0NPTExFQ1RJT05TID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTEVNRU5UX0NPTExFQ1RJT05TOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fSURTID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX19JRFM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVtYmVkZGVkIElkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19FTUJFRERFRF9JRFMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEX0lEUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzaWNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0JBU0lDUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19WRVJTSU9OUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fVkVSU0lPTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnkgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19NQU5ZX1RPX09ORVMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX01BTllfVE9fT05FUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T25lIFRvIE1hbnlzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX09ORV9UT19NQU5ZUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fT05FX1RPX01BTllTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PbmUgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19PTkVfVE9fT05FUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fT05FX1RPX09ORVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnkgVG8gTWFueXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fTUFOWV9UT19NQU5ZUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fTUFOWV9UT19NQU5ZUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW1iZWRkZWRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0VNQkVEREVEUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fRU1CRURERURTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2llbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX1RSQU5TSUVOVFMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1RSQU5TSUVOVFM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2ljIENvbGxlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0JBU0lDX0NPTExFQ1RJT05TID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNpYyBNYXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0JBU0lDX01BUFMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zZm9ybWF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19UUkFOU0ZPUk1BVElPTlMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmxlIE9uZSBUbyBPbmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX1ZBUklBQkxFX09ORV9UT19PTkVTID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljIDxlbT5YbWwgQmFzaWM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUMgPSA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19OQU1FID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09MVU1OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fTE9CID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfX0xPQjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEVNUE9SQUw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fRU5VTUVSQVRFRCA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX19FTlVNRVJBVEVEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX19GRVRDSDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fT1BUSU9OQUwgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT1BUSU9OQUw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldHVybiBJbnNlcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fUkVUVVJOX0lOU0VSVCA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXR1cm4gVXBkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX1JFVFVSTl9VUERBVEUgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fQVRUUklCVVRFX1RZUEUgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TXV0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19NVVRBQkxFID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19PQkpFQ1RfVFlQRV9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fU1RSVUNUX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19DT05WRVJUID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDEzOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmFzaWM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb24gPGVtPlhtbCBCYXNpYyBDb2xsZWN0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpY0NvbGxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTiA9IDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FDQ0VTUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19DT0xMRUNUSU9OX19OQU1FID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTl9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmFzaWMgQ29sbGVjdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcCA8ZW0+WG1sIEJhc2ljIE1hcDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpY01hcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19NQVAgPSA2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19NQVBfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19NQVBfX05BTUUgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19NQVBfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX01BUF9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmFzaWMgTWFwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX01BUF9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaCA8ZW0+WG1sIEJhdGNoIEZldGNoPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2gKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVRDSF9GRVRDSCA9IDc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVRDSF9GRVRDSF9fU0laRSA9IEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIXzIxX19TSVpFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFUQ0hfRkVUQ0hfX0JBVENIX0ZFVENIX1RZUEUgPSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF8yMV9fQkFUQ0hfRkVUQ0hfVFlQRTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhdGNoIEZldGNoPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBVENIX0ZFVENIX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF8yMV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyIDxlbT5YbWwgQmF0Y2ggRmV0Y2ggSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2hIb2xkZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVRDSF9GRVRDSF9IT0xERVIgPSA4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0ggPSAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmF0Y2ggRmV0Y2ggSG9sZGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBVENIX0ZFVENIX0hPTERFUl9GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSA8ZW0+WG1sIENhY2hlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFID0gOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwaXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfX0VYUElSWSA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fU0laRSA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX19TSEFSRUQgPSAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfX1RZUEUgPSAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHdheXMgUmVmcmVzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX19BTFdBWVNfUkVGUkVTSCA9IDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVIgPSA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNhYmxlIEhpdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fRElTQUJMRV9ISVRTID0gNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29vcmRpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEUgPSA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHBpcnkgVGltZSBPZiBEYXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZID0gODsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENhY2hlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX0ZFQVRVUkVfQ09VTlQgPSA5OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyIDxlbT5YbWwgQ2FjaGUgSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX0hPTERFUiA9IDEwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX0hPTERFUl9fQ0FDSEUgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgQ2hlY2tpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9IT0xERVJfX0VYSVNURU5DRV9DSEVDS0lORyA9IDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDYWNoZSBIb2xkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfSE9MREVSX0ZFQVRVUkVfQ09VTlQgPSAyOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nIDxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NIQU5HRV9UUkFDS0lORyA9IDExOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0hBTkdFX1RSQUNLSU5HX19UWVBFID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENoYW5nZSBUcmFja2luZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DSEFOR0VfVFJBQ0tJTkdfRkVBVFVSRV9DT1VOVCA9IDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIgPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmcgSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVIgPSAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIFRyYWNraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUl9fQ0hBTkdFX1RSQUNLSU5HID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENoYW5nZSBUcmFja2luZyBIb2xkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUl9GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kgPGVtPlhtbCBDbG9uZSBDb3B5IFBvbGljeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NMT05FX0NPUFlfUE9MSUNZID0gMTM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NMT05FX0NPUFlfUE9MSUNZX19NRVRIT0QgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JraW5nIENvcHkgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0QgPSAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfRkVBVFVSRV9DT1VOVCA9IDI7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlIDxlbT5YbWwgQ29udmVyc2lvbiBWYWx1ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVyc2lvblZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlNJT05fVkFMVUUgPSAxNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUUgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUUgPSAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29udmVyc2lvbiBWYWx1ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJTSU9OX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgPSAyOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyIDxlbT5YbWwgTmFtZWQgQ29udmVydGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX0NPTlZFUlRFUiA9IDM3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE5hbWVkIENvbnZlcnRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyIDxlbT5YbWwgQ29udmVydGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSID0gMTU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJfX05BTUUgPSBYTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSX19DTEFTU19OQU1FID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvbnZlcnRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyIDxlbT5YbWwgQ29udmVydGVyIEhvbGRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUl9IT0xERVIgPSAxNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSX0hPTERFUl9fQ09OVkVSVEVSID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUiA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUl9IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSID0gMzsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvbnZlcnRlciBIb2xkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSX0hPTERFUl9GRUFUVVJFX0NPVU5UID0gNDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyIDxlbT5YbWwgQ29udmVydGVycyBIb2xkZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUlNfSE9MREVSID0gMTc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTID0gMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSU19IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMgPSAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSU19IT0xERVJfX1NUUlVDVF9DT05WRVJURVJTID0gMzsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvbnZlcnRlcnMgSG9sZGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUlNfSE9MREVSX0ZFQVRVUkVfQ09VTlQgPSA0OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyA8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HID0gMTg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0xPQiA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0xPQjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19URU1QT1JBTCA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX1RFTVBPUkFMOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fRU5VTUVSQVRFRCA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0VOVU1FUkFURUQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVFlQRV9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19PQkpFQ1RfVFlQRV9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fU1RSVUNUX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19DT05WRVJUID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb3B5UG9saWN5IDxlbT5YbWwgQ29weSBQb2xpY3k8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29weVBvbGljeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPUFlfUE9MSUNZID0gMTk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09QWV9QT0xJQ1lfX0NMQVNTID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvcHkgUG9saWN5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPUFlfUE9MSUNZX0ZFQVRVUkVfQ09VTlQgPSAxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIgPGVtPlhtbCBDdXN0b21pemVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DVVNUT01JWkVSID0gMjA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NVU1RPTUlaRVJfX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRSA9IDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDdXN0b21pemVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NVU1RPTUlaRVJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciA8ZW0+WG1sIEN1c3RvbWl6ZXIgSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXJIb2xkZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DVVNUT01JWkVSX0hPTERFUiA9IDIxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXN0b21pemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ1VTVE9NSVpFUl9IT0xERVJfX0NVU1RPTUlaRVIgPSAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ3VzdG9taXplciBIb2xkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ1VTVE9NSVpFUl9IT0xERVJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24gPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OID0gMjI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTE9CID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19MT0I7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19URU1QT1JBTCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEVNUE9SQUw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0VOVU1FUkFURUQgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0VOVU1FUkFURUQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU47Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9CWSA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQlk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX09WRVJSSURFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEFSR0VUX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UQVJHRVRfQ0xBU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fRkVUQ0g7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVkgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ0xBU1MgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ0xBU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfVEVNUE9SQUw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgRW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9FTlVNRVJBVEVEID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0VOVU1FUkFURUQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTFVNTiA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT0xVTU47Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfSk9JTl9DT0xVTU5TID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0pPSU5fQ09MVU1OUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTFVNTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sbGVjdGlvbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MTEVDVElPTl9UQUJMRSA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MTEVDVElPTl9UQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJUID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT05WRVJUID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSk9JTl9GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMTM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19CQVRDSF9GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfVFlQRSA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMTU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDE2OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUgPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFID0gMjM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0NMQVNTX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTEFTU19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX01FVEFEQVRBX0NPTVBMRVRFID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fTUVUQURBVEFfQ09NUExFVEU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fREVTQ1JJUFRJT04gPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0FUVFJJQlVURVMgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19BVFRSSUJVVEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VzdG9taXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVIgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkcgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19UWVBFX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQ09QWV9QT0xJQ1kgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyA4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1kgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCArIDEyOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkIDxlbT5YbWwgRW1iZWRkZWQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERUQgPSAyNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfVFlQRSA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW1iZWRkZWQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQgPGVtPlhtbCBFbWJlZGRlZCBJZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSUQgPSAyNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRF9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRF9fQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfVFlQRSA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRF9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW1iZWRkZWQgSWQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSA8ZW0+WG1sIEVudGl0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWSA9IDI2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DTEFTU19OQU1FID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTEFTU19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fTUVUQURBVEFfQ09NUExFVEUgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX01FVEFEQVRBX0NPTVBMRVRFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fREVTQ1JJUFRJT04gPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19BVFRSSUJVVEVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19BVFRSSUJVVEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX05BTUVEX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1FVRVJJRVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9OQVRJVkVfUVVFUklFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFUVVFTkNFX0dFTkVSQVRPUjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19UQUJMRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUEVSU0lTVDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QT1NUX1BFUlNJU1QgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUEVSU0lTVDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUFJFX1JFTU9WRSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1JFTU9WRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1JFTU9WRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUFJFX1VQREFURSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1VQREFURTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBVcGRhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BPU1RfVVBEQVRFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1VQREFURTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBMb2FkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QT1NUX0xPQUQgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfTE9BRDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQ0FDSEVBQkxFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRUFCTEU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkIENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19JRF9DTEFTUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSURfQ0xBU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19UQUJMRSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY29uZGFyeSBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fU0VDT05EQVJZX1RBQkxFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VDT05EQVJZX1RBQkxFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbmhlcml0YW5jZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fSU5IRVJJVEFOQ0UgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QUklNQVJZX0tFWSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGUgSW50ZXJjZXB0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0NBQ0hFX0lOVEVSQ0VQVE9SID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RdWVyeSBSZWRpcmVjdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUVVFUllfUkVESVJFQ1RPUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2ggR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0ZFVENIX0dST1VQUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgRXh0cmFjdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DTEFTU19FWFRSQUNUT1IgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUEFSRU5UX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1JFQURfT05MWSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VzdG9taXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQ1VTVE9NSVpFUiA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIFRyYWNraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DSEFOR0VfVFJBQ0tJTkcgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DQUNIRSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBDaGVja2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fRVhJU1RFTkNFX0NIRUNLSU5HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMTM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1NUUlVDVF9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMTY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMTc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGltaXN0aWMgTG9ja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fT1BUSU1JU1RJQ19MT0NLSU5HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0NPUFlfUE9MSUNZID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMjA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMjE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAyMjsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVudGl0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMjM7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MgPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTID0gMjc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1ZFUlNJT04gPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1ZFUlNJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fU0NIRU1BX0xPQ0FUSU9OID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TQ0hFTUFfTE9DQVRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUVVFUklFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUVVFUklFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfTkFUSVZFX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX05BVElWRV9RVUVSSUVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fREVTQ1JJUFRJT04gPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19QQUNLQUdFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QQUNLQUdFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1NDSEVNQSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU0NIRU1BOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19DQVRBTE9HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DQVRBTE9HOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1NFUVVFTkNFX0dFTkVSQVRPUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NFUVVFTkNFX0dFTkVSQVRPUlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fVEFCTEVfR0VORVJBVE9SUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVEFCTEVfR0VORVJBVE9SUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1MgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgU3VwZXJjbGFzc2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX01BUFBFRF9TVVBFUkNMQVNTRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX01BUFBFRF9TVVBFUkNMQVNTRVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0VOVElUSUVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19FTlRJVElFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW1iZWRkYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fRU1CRUREQUJMRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0VNQkVEREFCTEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19UWVBFX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fU1RSVUNUX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hBdHRyaWJ1dGUgPGVtPlhtbCBGZXRjaCBBdHRyaWJ1dGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hBdHRyaWJ1dGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRmV0Y2hBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfQVRUUklCVVRFID0gMjg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9BVFRSSUJVVEVfX05BTUUgPSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9GRVRDSF9BVFRSSUJVVEVfMjFfX05BTUU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBGZXRjaCBBdHRyaWJ1dGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9GRVRDSF9BVFRSSUJVVEVfMjFfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hHcm91cCA8ZW0+WG1sIEZldGNoIEdyb3VwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9HUk9VUCA9IDI5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfR1JPVVBfX05BTUUgPSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF8yMV9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9hZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0dST1VQX19MT0FEID0gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfMjFfX0xPQUQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0dST1VQX19BVFRSSUJVVEVTID0gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfMjFfX0FUVFJJQlVURVM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBGZXRjaCBHcm91cDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9HUk9VUF9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfMjFfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQgPGVtPlhtbCBJZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRCA9IDMwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19OQU1FID0gT3JtUGFja2FnZS5YTUxfSURfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9JRF9fQ09MVU1OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fTE9CID0gT3JtUGFja2FnZS5YTUxfSURfX0xPQjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9JRF9fVEVNUE9SQUw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fRU5VTUVSQVRFRCA9IE9ybVBhY2thZ2UuWE1MX0lEX19FTlVNRVJBVEVEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fU0VRVUVOQ0VfR0VORVJBVE9SID0gT3JtUGFja2FnZS5YTUxfSURfX1NFUVVFTkNFX0dFTkVSQVRPUjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX1RBQkxFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX0lEX19UQUJMRV9HRU5FUkFUT1I7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlZCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19HRU5FUkFURURfVkFMVUUgPSBPcm1QYWNrYWdlLlhNTF9JRF9fR0VORVJBVEVEX1ZBTFVFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19BVFRSSUJVVEVfVFlQRSA9IE9ybVBhY2thZ2UuWE1MX0lEX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX0lEX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX0lEX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NdXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX01VVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0lEX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19UWVBFX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0lEX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfSURfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0lEX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0NPTlZFUlQgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIElkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSA8ZW0+WG1sIEluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSA9IDMxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgSW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZX0ZFQVRVUkVfQ09VTlQgPSAwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaCA8ZW0+WG1sIEpvaW4gRmV0Y2g8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0ZFVENIID0gMzI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEpvaW4gRmV0Y2g8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9GRVRDSF9GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55IDxlbT5YbWwgTWFueSBUbyBNYW55PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTlkgPSAzMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1MgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fVEFSR0VUX0VOVElUWSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVEFSR0VUX0VOVElUWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19GRVRDSDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fQ0FTQ0FERSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ0FTQ0FERTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBQRURfQlkgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUFBFRF9CWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fSk9JTl9UQUJMRSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fSk9JTl9UQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19PUkRFUl9DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX09SREVSX0NPTFVNTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX09SREVSX0JZID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PUkRFUl9CWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IFRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX1RFTVBPUkFMID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX1RFTVBPUkFMOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfRU5VTUVSQVRFRCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9FTlVNRVJBVEVEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09MVU1OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0pPSU5fQ09MVU1OUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9KT0lOX0NPTFVNTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVkgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fVFlQRV9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19CQVRDSF9GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fSk9JTl9GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE1hbnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDExOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSA8ZW0+WG1sIE1hbnkgVG8gT25lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYW55VG9PbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkUgPSAzNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX1RBUkdFVF9FTlRJVFkgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVEFSR0VUX0VOVElUWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fRkVUQ0ggPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fRkVUQ0g7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fQ0FTQ0FERSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19DQVNDQURFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX0pPSU5fVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSk9JTl9UQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fSk9JTl9DT0xVTU5TID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0pPSU5fQ09MVU1OUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fSUQgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSUQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHMgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fTUFQU19JRCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19NQVBTX0lEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19PUFRJT05BTCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19PUFRJT05BTDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fQkFUQ0hfRkVUQ0ggPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19KT0lOX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE9uZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTUyA9IDM1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTEFTU19OQU1FID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMQVNTX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX01FVEFEQVRBX0NPTVBMRVRFID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX01FVEFEQVRBX0NPTVBMRVRFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ERVNDUklQVElPTiA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BVFRSSUJVVEVTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkIENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lEX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lEX0NMQVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FTlRJVFlfTElTVEVORVJTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWSA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVBQkxFID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlIEludGVyY2VwdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFX0lOVEVSQ0VQVE9SID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaCBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19GRVRDSF9HUk9VUFMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fVEFCTEVfR0VORVJBVE9SID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfTkFUSVZFX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UXVlcnkgUmVkaXJlY3RvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUVVFUllfUkVESVJFQ1RPUlMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJFTlRfQ0xBU1MgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRUFEX09OTFkgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ1VTVE9NSVpFUiA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIFRyYWNraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEUgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBDaGVja2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWElTVEVOQ0VfQ0hFQ0tJTkcgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDIwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UWVBFX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMjE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDIyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NUUlVDVF9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDIzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAyNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW1pc3RpYyBMb2NraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAyNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1kgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMjY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAyNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xvbmUgQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xPTkVfQ09QWV9QT0xJQ1kgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMjg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMjk7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDMwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11dGFibGUgPGVtPlhtbCBNdXRhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11dGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXV0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVVRBQkxFID0gMzY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk11dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVVRBQkxFX19NVVRBQkxFID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE11dGFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVUQUJMRV9GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IDxlbT5YbWwgTmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWSA9IDM4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9DTEFTUyA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBTZXQgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORyA9IDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2NlZHVyZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUFJPQ0VEVVJFX05BTUUgPSAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXR1cm5zIFJlc3VsdCBTZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVRVUk5TX1JFU1VMVF9TRVQgPSA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVFMgPSA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QQVJBTUVURVJTID0gNjsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9GRUFUVVJFX0NPVU5UID0gNzsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyIDxlbT5YbWwgT2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVIgPSAzOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fTkFNRSA9IFhNTF9OQU1FRF9DT05WRVJURVJfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGEgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVyc2lvbiBWYWx1ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVMgPSBYTUxfTkFNRURfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUUgPSBYTUxfTkFNRURfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkgPGVtPlhtbCBPbmUgVG8gTWFueTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZID0gNDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19BQ0NFU1MgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19UQVJHRVRfRU5USVRZID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1RBUkdFVF9FTlRJVFk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0ZFVENIOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX0NBU0NBREUgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ0FTQ0FERTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUFBFRF9CWSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBQRURfQlk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fSk9JTl9UQUJMRSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19KT0lOX1RBQkxFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fT1JERVJfQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SREVSX0NPTFVNTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fT1JERVJfQlkgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT1JERVJfQlk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DTEFTUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IFRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9URU1QT1JBTDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBFbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfRU5VTUVSQVRFRCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0VOVU1FUkFURUQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09MVU1OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfSk9JTl9DT0xVTU5TID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfSk9JTl9DT0xVTU5TOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVkgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fQ09MVU1OUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JwaGFuIFJlbW92YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fT1JQSEFOX1JFTU9WQUwgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT1JQSEFOX1JFTU9WQUw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fVFlQRV9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX0JBVENIX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaXZhdGUgT3duZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fUFJJVkFURV9PV05FRCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19KT0lOX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDExOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSA8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT25lVG9PbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORSA9IDQxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19BQ0NFU1MgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19OQU1FID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1RBUkdFVF9FTlRJVFkgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19UQVJHRVRfRU5USVRZOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fRkVUQ0g7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19DQVNDQURFID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQ0FTQ0FERTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0pPSU5fVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX1RBQkxFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0pPSU5fQ09MVU1OUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0pPSU5fQ09MVU1OUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19JRCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0lEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBzIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fTUFQU19JRCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX01BUFNfSUQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fT1BUSU9OQUwgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19PUFRJT05BTDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fTUFQUEVEX0JZID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fTUFQUEVEX0JZOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcnBoYW4gUmVtb3ZhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX09SUEhBTl9SRU1PVkFMID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fT1JQSEFOX1JFTU9WQUw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0JBVENIX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcml2YXRlIE93bmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fUFJJVkFURV9PV05FRCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyA8ZW0+WG1sIE9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcHRpbWlzdGljTG9ja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUFRJTUlTVElDX0xPQ0tJTkcgPSA0MjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09QVElNSVNUSUNfTE9DS0lOR19fVFlQRSA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX0NBU0NBREUgPSAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWxlY3RlZCBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1NFTEVDVEVEX0NPTFVNTlMgPSAyOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09QVElNSVNUSUNfTE9DS0lOR19GRUFUVVJFX0NPVU5UID0gMzsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbiA8ZW0+WG1sIE9yZGVyIENvbHVtbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU4gPSA0MzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSX0NPTFVNTl9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fX05VTExBQkxFID0gT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19OVUxMQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSX0NPTFVNTl9fSU5TRVJUQUJMRSA9IE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fSU5TRVJUQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OX19VUERBVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX1VQREFUQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29ycmVjdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OX19DT1JSRUNUSU9OX1RZUEUgPSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPcmRlciBDb2x1bW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFMgPSA0NDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFU0NSSVBUSU9OID0gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlbGltaXRlZCBJZGVudGlmaWVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFTElNSVRFRF9JREVOVElGSUVSUyA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFTElNSVRFRF9JREVOVElGSUVSUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fU0NIRU1BID0gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fU0NIRU1BOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FUQUxPRyA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBVEFMT0c7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgUGVyc2lzdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBU0NBREVfUEVSU0lTVCA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBU0NBREVfUEVSU0lTVDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlMgPSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19FTlRJVFlfTElTVEVORVJTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9IDQ1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX0RFU0NSSVBUSU9OID0gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhtbCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEUgPSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19YTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFMgPSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MgPSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXkgPGVtPlhtbCBQcmltYXJ5IEtleTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaW1hcnlLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVkgPSA0NjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZX19WQUxJREFUSU9OID0gRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfMTFfX1ZBTElEQVRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZX19DT0xVTU5TID0gRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfMTFfX0NPTFVNTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlIEtleSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfX0NBQ0hFX0tFWV9UWVBFID0gRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfMTFfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQcmltYXJ5IEtleTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfMTFfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpdmF0ZU93bmVkIDxlbT5YbWwgUHJpdmF0ZSBPd25lZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcml2YXRlT3duZWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJpdmF0ZU93bmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSVZBVEVfT1dORUQgPSA0NzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpdmF0ZSBPd25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSVZBVEVfT1dORURfX1BSSVZBVEVfT1dORUQgPSAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUHJpdmF0ZSBPd25lZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklWQVRFX09XTkVEX0ZFQVRVUkVfQ09VTlQgPSAxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5IDxlbT5YbWwgUHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJPUEVSVFkgPSA0ODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRZX19OQU1FID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUWV9fVkFMVUUgPSAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJPUEVSVFlfX1ZBTFVFX1RZUEUgPSAyOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUHJvcGVydHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJPUEVSVFlfRkVBVFVSRV9DT1VOVCA9IDM7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHlDb250YWluZXIgPGVtPlhtbCBQcm9wZXJ0eSBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHlDb250YWluZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJPUEVSVFlfQ09OVEFJTkVSID0gNDk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUyA9IDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQcm9wZXJ0eSBDb250YWluZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJPUEVSVFlfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgPSAxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyIDxlbT5YbWwgUXVlcnkgQ29udGFpbmVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0NPTlRBSU5FUiA9IDUwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFF1ZXJ5IENvbnRhaW5lcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9ycyA8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5UmVkaXJlY3RvcnMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SUyA9IDUxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbGwgUXVlcmllczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX1JFRElSRUNUT1JTX19BTExfUVVFUklFUyA9IEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19BTExfUVVFUklFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBBbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVBRF9BTEwgPSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fUkVBRF9BTEw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfT0JKRUNUID0gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFQURfT0JKRUNUOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVQT1JUID0gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFUE9SVDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfX1VQREFURSA9IEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19VUERBVEU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc2VydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX1JFRElSRUNUT1JTX19JTlNFUlQgPSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fSU5TRVJUOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SU19fREVMRVRFID0gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX0RFTEVURTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX1JFRElSRUNUT1JTX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seSA8ZW0+WG1sIFJlYWQgT25seTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRUFEX09OTFkgPSA1MjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVBRF9PTkxZX19SRUFEX09OTFkgPSAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUmVhZCBPbmx5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFQURfT05MWV9GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZXR1cm5JbnNlcnQgPGVtPlhtbCBSZXR1cm4gSW5zZXJ0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJldHVybkluc2VydAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZXR1cm5JbnNlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVUVVJOX0lOU0VSVCA9IDUzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXR1cm4gT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFVFVSTl9JTlNFUlRfX1JFVFVSTl9PTkxZID0gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfUkVUVVJOX0lOU0VSVF8yMV9fUkVUVVJOX09OTFk7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBSZXR1cm4gSW5zZXJ0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFVFVSTl9JTlNFUlRfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX1JFVFVSTl9JTlNFUlRfMjFfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIDxlbT5YbWwgU3RvcmVkIFByb2NlZHVyZSBQYXJhbWV0ZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUiA9IDU0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXJlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fRElSRUNUSU9OID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19OQU1FID0gMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UXVlcnkgUGFyYW1ldGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1FVRVJZX1BBUkFNRVRFUiA9IDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fVFlQRSA9IDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpkYmMgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEUgPSA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KZGJjIFR5cGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRSA9IDU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBTdG9yZWQgUHJvY2VkdXJlIFBhcmFtZXRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9GRUFUVVJFX0NPVU5UID0gNjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXIgPGVtPlhtbCBTdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdHJ1Y3RDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RSVUNUX0NPTlZFUlRFUiA9IDU1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RSVUNUX0NPTlZFUlRFUl9fTkFNRSA9IFhNTF9OQU1FRF9DT05WRVJURVJfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUiA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBTdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUUlVDVF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5IDxlbT5YbWwgVGltZSBPZiBEYXk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRpbWVPZkRheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9USU1FX09GX0RBWSA9IDU2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib3VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVElNRV9PRl9EQVlfX0hPVVIgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaW51dGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9USU1FX09GX0RBWV9fTUlOVVRFID0gMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2Vjb25kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVElNRV9PRl9EQVlfX1NFQ09ORCA9IDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pbGxpc2Vjb25kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVElNRV9PRl9EQVlfX01JTExJU0VDT05EID0gMzsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFRpbWUgT2YgRGF5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RJTUVfT0ZfREFZX0ZFQVRVUkVfQ09VTlQgPSA0OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uIDxlbT5YbWwgVHJhbnNmb3JtYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNmb3JtYXRpb24KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHJhbnNmb3JtYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNGT1JNQVRJT04gPSA1NzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0ZPUk1BVElPTl9fTkFNRSA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TRk9STUFUSU9OX19BVFRSSUJVVEVfVFlQRSA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVHJhbnNmb3JtYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNGT1JNQVRJT05fRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudCA8ZW0+WG1sIFRyYW5zaWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHJhbnNpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVCA9IDU4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNJRU5UX19OQU1FID0gT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVF9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFRyYW5zaWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyIDxlbT5YbWwgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfQ09OVkVSVEVSID0gNTk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UWVBFX0NPTlZFUlRFUl9fTkFNRSA9IFhNTF9OQU1FRF9DT05WRVJURVJfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGEgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUgPSBYTUxfTkFNRURfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UWVBFX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lIDxlbT5YbWwgVmFyaWFibGUgT25lIFRvIE9uZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFZhcmlhYmxlT25lVG9PbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORSA9IDYwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1MgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fTkFNRSA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFZhcmlhYmxlIE9uZSBUbyBPbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiA8ZW0+WG1sIFZlcnNpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT04gPSA2MTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX0NPTFVNTiA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTFVNTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fTE9CID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTE9COwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX1RFTVBPUkFMID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVEVNUE9SQUw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19FTlVNRVJBVEVEID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fRU5VTUVSQVRFRDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19BVFRSSUJVVEVfVFlQRSA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TXV0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX01VVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX1RZUEVfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX1NUUlVDVF9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fQ09OVkVSVCA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBWZXJzaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlIDxlbT5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRDYWNoZUNvb3JkaW5hdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUNIRV9DT09SRElOQVRJT05fVFlQRSA9IDYyOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZSA8ZW0+Q2FjaGUgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRDYWNoZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUNIRV9UWVBFID0gNjM7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIDxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NIQU5HRV9UUkFDS0lOR19UWVBFID0gNjQ7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlyZWN0aW9uIDxlbT5YbWwgRGlyZWN0aW9uPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlyZWN0aW9uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbERpcmVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ESVJFQ1RJT04gPSA2NTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlIDxlbT5FeGlzdGVuY2UgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0RXhpc3RlbmNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYSVNURU5DRV9UWVBFID0gNjY7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZSA8ZW0+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pbkZldGNoVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0ZFVENIX1RZUEUgPSA2NzsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgPGVtPlhtbCBPcHRpbWlzdGljIExvY2tpbmcgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HX1RZUEUgPSA2ODsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxBY2Nlc3NNZXRob2RzRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxBY2Nlc3NNZXRob2RzSG9sZGVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhdHRyaWJ1dGVzRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxCYXNpY0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzaWNDb2xsZWN0aW9uRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxCYXNpY01hcEVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmF0Y2hGZXRjaEVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmF0Y2hGZXRjaEhvbGRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ2FjaGVFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENhY2hlSG9sZGVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDaGFuZ2VUcmFja2luZ0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENsb25lQ29weVBvbGljeUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ29udmVyc2lvblZhbHVlRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDb252ZXJ0ZXJFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENvbnZlcnRlckhvbGRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ29udmVydGVyc0hvbGRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDb3B5UG9saWN5RUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDdXN0b21pemVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDdXN0b21pemVySG9sZGVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW1iZWRkYWJsZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW1iZWRkZWRFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGVkSWRFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEZldGNoQXR0cmlidXRlRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxGZXRjaEdyb3VwRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxJZEVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3lFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEpvaW5GZXRjaEVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvTWFueUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvT25lRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNdXRhYmxlRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxOYW1lZENvbnZlcnRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT2JqZWN0VHlwZUNvbnZlcnRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9NYW55RUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPbmVUb09uZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE9yZGVyQ29sdW1uRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFByaW1hcnlLZXlFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFByaXZhdGVPd25lZEVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUHJvcGVydHlFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxRdWVyeUNvbnRhaW5lckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUXVlcnlSZWRpcmVjdG9yc0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUmVhZE9ubHlFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFJldHVybkluc2VydEVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxTdHJ1Y3RDb252ZXJ0ZXJFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRpbWVPZkRheUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVHJhbnNmb3JtYXRpb25FQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRyYW5zaWVudEVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVHlwZUNvbnZlcnRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVmFyaWFibGVPbmVUb09uZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVmVyc2lvbkVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBjYWNoZUNvb3JkaW5hdGlvblR5cGVFRW51bSA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBjYWNoZVR5cGVFRW51bSA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB4bWxDaGFuZ2VUcmFja2luZ1R5cGVFRW51bSA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB4bWxEaXJlY3Rpb25FRW51bSA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBleGlzdGVuY2VUeXBlRUVudW0gPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0geG1sSm9pbkZldGNoVHlwZUVFbnVtID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHhtbE9wdGltaXN0aWNMb2NraW5nVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtUGFja2FnZSgpCi0JewotCQlzdXBlcihlTlNfVVJJLCBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCi0JICogCi0JICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBFY2xpcHNlTGlua09ybVBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCi0JICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtUGFja2FnZSBpbml0KCkKLQl7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChFY2xpcHNlTGlua09ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBFY2xpcHNlTGlua09ybVBhY2thZ2UoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCVhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZnJlZXplKCk7Ci0KLSAgCi0JCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQotCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkksIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZSk7Ci0JCXJldHVybiB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMgPGVtPlhtbCBBY2Nlc3MgTWV0aG9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQWNjZXNzIE1ldGhvZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIHhtbEFjY2Vzc01ldGhvZHNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcyNnZXRHZXRNZXRob2QgPGVtPkdldCBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZXQgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMjZ2V0R2V0TWV0aG9kKCkKLQkgKiBAc2VlICNnZXRYbWxBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQWNjZXNzTWV0aG9kc19HZXRNZXRob2QoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEFjY2Vzc01ldGhvZHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzI2dldFNldE1ldGhvZCA8ZW0+U2V0IE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNldCBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcyNnZXRTZXRNZXRob2QoKQotCSAqIEBzZWUgI2dldFhtbEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxBY2Nlc3NNZXRob2RzX1NldE1ldGhvZCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQWNjZXNzTWV0aG9kc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyIDxlbT5YbWwgQWNjZXNzIE1ldGhvZHMgSG9sZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBY2Nlc3MgTWV0aG9kcyBIb2xkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIoKQotCXsKLQkJcmV0dXJuIHhtbEFjY2Vzc01ldGhvZHNIb2xkZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlciNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQHNlZSAjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQWNjZXNzTWV0aG9kc0hvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKLQl7Ci0JCXJldHVybiB4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIDxlbT5BdHRyaWJ1dGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkF0dHJpYnV0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEF0dHJpYnV0ZXMoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldEJhc2ljQ29sbGVjdGlvbnMgPGVtPkJhc2ljIENvbGxlY3Rpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5CYXNpYyBDb2xsZWN0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldEJhc2ljQ29sbGVjdGlvbnMoKQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBdHRyaWJ1dGVzX0Jhc2ljQ29sbGVjdGlvbnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0QmFzaWNNYXBzIDxlbT5CYXNpYyBNYXBzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5CYXNpYyBNYXBzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0QmFzaWNNYXBzKCkKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXR0cmlidXRlc19CYXNpY01hcHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0VHJhbnNmb3JtYXRpb25zIDxlbT5UcmFuc2Zvcm1hdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRyYW5zZm9ybWF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldFRyYW5zZm9ybWF0aW9ucygpCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF0dHJpYnV0ZXNfVHJhbnNmb3JtYXRpb25zKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdHRyaWJ1dGVzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldFZhcmlhYmxlT25lVG9PbmVzIDxlbT5WYXJpYWJsZSBPbmUgVG8gT25lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VmFyaWFibGUgT25lIFRvIE9uZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRWYXJpYWJsZU9uZVRvT25lcygpCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF0dHJpYnV0ZXNfVmFyaWFibGVPbmVUb09uZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMgPGVtPlhtbCBCYXNpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmFzaWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXNpYygpCi0JewotCQlyZXR1cm4geG1sQmFzaWNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbiA8ZW0+WG1sIEJhc2ljIENvbGxlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEJhc2ljIENvbGxlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQmFzaWNDb2xsZWN0aW9uKCkKLQl7Ci0JCXJldHVybiB4bWxCYXNpY0NvbGxlY3Rpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwIDxlbT5YbWwgQmFzaWMgTWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXNpYyBNYXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXNpY01hcCgpCi0JewotCQlyZXR1cm4geG1sQmFzaWNNYXBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2ggPGVtPlhtbCBCYXRjaCBGZXRjaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmF0Y2ggRmV0Y2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEJhdGNoRmV0Y2goKQotCXsKLQkJcmV0dXJuIHhtbEJhdGNoRmV0Y2hFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2hIb2xkZXIgPGVtPlhtbCBCYXRjaCBGZXRjaCBIb2xkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEJhdGNoIEZldGNoIEhvbGRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcigpCi0JewotCQlyZXR1cm4geG1sQmF0Y2hGZXRjaEhvbGRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyI2dldEJhdGNoRmV0Y2ggPGVtPkJhdGNoIEZldGNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaEhvbGRlciNnZXRCYXRjaEZldGNoKCkKLQkgKiBAc2VlICNnZXRYbWxCYXRjaEZldGNoSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcl9CYXRjaEZldGNoKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxCYXRjaEZldGNoSG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlIDxlbT5YbWwgQ2FjaGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENhY2hlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ2FjaGUoKQotCXsKLQkJcmV0dXJuIHhtbENhY2hlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEV4cGlyeSA8ZW0+RXhwaXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhwaXJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEV4cGlyeSgpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZV9FeHBpcnkoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENhY2hlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNpemU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0U2l6ZSgpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZV9TaXplKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDYWNoZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFNoYXJlZCA8ZW0+U2hhcmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2hhcmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFNoYXJlZCgpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZV9TaGFyZWQoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENhY2hlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZV9UeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDYWNoZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEFsd2F5c1JlZnJlc2ggPGVtPkFsd2F5cyBSZWZyZXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWx3YXlzIFJlZnJlc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0QWx3YXlzUmVmcmVzaCgpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZV9BbHdheXNSZWZyZXNoKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDYWNoZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFJlZnJlc2hPbmx5SWZOZXdlciA8ZW0+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFJlZnJlc2hPbmx5SWZOZXdlcigpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZV9SZWZyZXNoT25seUlmTmV3ZXIoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENhY2hlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0RGlzYWJsZUhpdHMgPGVtPkRpc2FibGUgSGl0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpc2FibGUgSGl0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXREaXNhYmxlSGl0cygpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZV9EaXNhYmxlSGl0cygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ2FjaGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRDb29yZGluYXRpb25UeXBlIDxlbT5Db29yZGluYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvb3JkaW5hdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldENvb3JkaW5hdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFhtbENhY2hlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ2FjaGVfQ29vcmRpbmF0aW9uVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ2FjaGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRFeHBpcnlUaW1lT2ZEYXkgPGVtPkV4cGlyeSBUaW1lIE9mIERheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkV4cGlyeSBUaW1lIE9mIERheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRFeHBpcnlUaW1lT2ZEYXkoKQotCSAqIEBzZWUgI2dldFhtbENhY2hlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQ2FjaGVfRXhwaXJ5VGltZU9mRGF5KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDYWNoZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlciA8ZW0+WG1sIENhY2hlIEhvbGRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ2FjaGUgSG9sZGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ2FjaGVIb2xkZXIoKQotCXsKLQkJcmV0dXJuIHhtbENhY2hlSG9sZGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyI2dldENhY2hlIDxlbT5DYWNoZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNhY2hlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyI2dldENhY2hlKCkKLQkgKiBAc2VlICNnZXRYbWxDYWNoZUhvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENhY2hlSG9sZGVyX0NhY2hlKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDYWNoZUhvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyI2dldEV4aXN0ZW5jZUNoZWNraW5nIDxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKQotCSAqIEBzZWUgI2dldFhtbENhY2hlSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ2FjaGVIb2xkZXJfRXhpc3RlbmNlQ2hlY2tpbmcoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENhY2hlSG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nIDxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDaGFuZ2VUcmFja2luZygpCi0JewotCQlyZXR1cm4geG1sQ2hhbmdlVHJhY2tpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmcjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmcjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sQ2hhbmdlVHJhY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDaGFuZ2VUcmFja2luZ19UeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDaGFuZ2VUcmFja2luZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ0hvbGRlciA8ZW0+WG1sIENoYW5nZSBUcmFja2luZyBIb2xkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENoYW5nZSBUcmFja2luZyBIb2xkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcigpCi0JewotCQlyZXR1cm4geG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIjZ2V0Q2hhbmdlVHJhY2tpbmcgPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ0hvbGRlciNnZXRDaGFuZ2VUcmFja2luZygpCi0JICogQHNlZSAjZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcl9DaGFuZ2VUcmFja2luZygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5IDxlbT5YbWwgQ2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENsb25lIENvcHkgUG9saWN5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENsb25lQ29weVBvbGljeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENsb25lQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4geG1sQ2xvbmVDb3B5UG9saWN5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENsb25lQ29weVBvbGljeSNnZXRNZXRob2QgPGVtPk1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kjZ2V0TWV0aG9kKCkKLQkgKiBAc2VlICNnZXRYbWxDbG9uZUNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDbG9uZUNvcHlQb2xpY3lfTWV0aG9kKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDbG9uZUNvcHlQb2xpY3lFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kjZ2V0V29ya2luZ0NvcHlNZXRob2QgPGVtPldvcmtpbmcgQ29weSBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JraW5nIENvcHkgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENsb25lQ29weVBvbGljeSNnZXRXb3JraW5nQ29weU1ldGhvZCgpCi0JICogQHNlZSAjZ2V0WG1sQ2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X1dvcmtpbmdDb3B5TWV0aG9kKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDbG9uZUNvcHlQb2xpY3lFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlIDxlbT5YbWwgQ29udmVyc2lvbiBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ29udmVyc2lvbiBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDb252ZXJzaW9uVmFsdWUoKQotCXsKLQkJcmV0dXJuIHhtbENvbnZlcnNpb25WYWx1ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUjZ2V0RGF0YVZhbHVlIDxlbT5EYXRhIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF0YSBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUjZ2V0RGF0YVZhbHVlKCkKLQkgKiBAc2VlICNnZXRYbWxDb252ZXJzaW9uVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDb252ZXJzaW9uVmFsdWVfRGF0YVZhbHVlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDb252ZXJzaW9uVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUjZ2V0T2JqZWN0VmFsdWUgPGVtPk9iamVjdCBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9iamVjdCBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUjZ2V0T2JqZWN0VmFsdWUoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnNpb25WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENvbnZlcnNpb25WYWx1ZV9PYmplY3RWYWx1ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ29udmVyc2lvblZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlciA8ZW0+WG1sIENvbnZlcnRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ29udmVydGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENvbnZlcnRlcigpCi0JewotCQlyZXR1cm4geG1sQ29udmVydGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlciNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlciNnZXRDbGFzc05hbWUoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENvbnZlcnRlcl9DbGFzc05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbnZlcnRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIgPGVtPlhtbCBDb252ZXJ0ZXIgSG9sZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb252ZXJ0ZXIgSG9sZGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENvbnZlcnRlckhvbGRlcigpCi0JewotCQlyZXR1cm4geG1sQ29udmVydGVySG9sZGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRDb252ZXJ0ZXIgPGVtPkNvbnZlcnRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNvbnZlcnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0Q29udmVydGVyKCkKLQkgKiBAc2VlICNnZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDb252ZXJ0ZXJIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0VHlwZUNvbnZlcnRlciA8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5UeXBlIENvbnZlcnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0VHlwZUNvbnZlcnRlcigpCi0JICogQHNlZSAjZ2V0WG1sQ29udmVydGVySG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQ29udmVydGVySG9sZGVyX1R5cGVDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbENvbnZlcnRlckhvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRPYmplY3RUeXBlQ29udmVydGVyIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnRlckhvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENvbnZlcnRlckhvbGRlcl9PYmplY3RUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDb252ZXJ0ZXJIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0U3RydWN0Q29udmVydGVyIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0U3RydWN0Q29udmVydGVyKCkKLQkgKiBAc2VlICNnZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDb252ZXJ0ZXJIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlciA8ZW0+WG1sIENvbnZlcnRlcnMgSG9sZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb252ZXJ0ZXJzIEhvbGRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ29udmVydGVyc0hvbGRlcigpCi0JewotCQlyZXR1cm4geG1sQ29udmVydGVyc0hvbGRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIjZ2V0Q29udmVydGVycyA8ZW0+Q29udmVydGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udmVydGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyI2dldENvbnZlcnRlcnMoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnRlcnNIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX0NvbnZlcnRlcnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbENvbnZlcnRlcnNIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIjZ2V0VHlwZUNvbnZlcnRlcnMgPGVtPlR5cGUgQ29udmVydGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIjZ2V0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnRlcnNIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1R5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDb252ZXJ0ZXJzSG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnRlcnNIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDb252ZXJ0ZXJzSG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyI2dldFN0cnVjdENvbnZlcnRlcnMgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyI2dldFN0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnRlcnNIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1N0cnVjdENvbnZlcnRlcnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbENvbnZlcnRlcnNIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nIDxlbT5YbWwgQ29udmVydGlibGUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ29udmVydGlibGUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIHhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcjZ2V0Q29udmVydCA8ZW0+Q29udmVydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbnZlcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nI2dldENvbnZlcnQoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDb252ZXJ0aWJsZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29weVBvbGljeSA8ZW0+WG1sIENvcHkgUG9saWN5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb3B5IFBvbGljeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb3B5UG9saWN5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4geG1sQ29weVBvbGljeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb3B5UG9saWN5I2dldENsYXNzXyA8ZW0+Q2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb3B5UG9saWN5I2dldENsYXNzXygpCi0JICogQHNlZSAjZ2V0WG1sQ29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENvcHlQb2xpY3lfQ2xhc3MoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvcHlQb2xpY3lFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplciA8ZW0+WG1sIEN1c3RvbWl6ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEN1c3RvbWl6ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEN1c3RvbWl6ZXIoKQotCXsKLQkJcmV0dXJuIHhtbEN1c3RvbWl6ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplciNnZXRDdXN0b21pemVyQ2xhc3NOYW1lIDxlbT5DdXN0b21pemVyIENsYXNzIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DdXN0b21pemVyIENsYXNzIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplciNnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxDdXN0b21pemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ3VzdG9taXplcl9DdXN0b21pemVyQ2xhc3NOYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDdXN0b21pemVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXJIb2xkZXIgPGVtPlhtbCBDdXN0b21pemVyIEhvbGRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ3VzdG9taXplciBIb2xkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEN1c3RvbWl6ZXJIb2xkZXIoKQotCXsKLQkJcmV0dXJuIHhtbEN1c3RvbWl6ZXJIb2xkZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciNnZXRDdXN0b21pemVyIDxlbT5DdXN0b21pemVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q3VzdG9taXplcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyI2dldEN1c3RvbWl6ZXIoKQotCSAqIEBzZWUgI2dldFhtbEN1c3RvbWl6ZXJIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDdXN0b21pemVySG9sZGVyX0N1c3RvbWl6ZXIoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEN1c3RvbWl6ZXJIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24gPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uKCkKLQl7Ci0JCXJldHVybiB4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSA8ZW0+WG1sIEVtYmVkZGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVtYmVkZGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVtYmVkZGFibGUoKQotCXsKLQkJcmV0dXJuIHhtbEVtYmVkZGFibGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDb3B5UG9saWN5IDxlbT5Db3B5IFBvbGljeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNvcHkgUG9saWN5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0Q29weVBvbGljeSgpCi0JICogQHNlZSAjZ2V0WG1sRW1iZWRkYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVtYmVkZGFibGVfQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBzZWUgI2dldFhtbEVtYmVkZGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbWJlZGRhYmxlX0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDbG9uZUNvcHlQb2xpY3kgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDbG9uZUNvcHlQb2xpY3koKQotCSAqIEBzZWUgI2dldFhtbEVtYmVkZGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbWJlZGRhYmxlX0Nsb25lQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0WG1sRW1iZWRkYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVtYmVkZGFibGVfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZCA8ZW0+WG1sIEVtYmVkZGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbWJlZGRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVtYmVkZGVkKCkKLQl7Ci0JCXJldHVybiB4bWxFbWJlZGRlZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZCA8ZW0+WG1sIEVtYmVkZGVkIElkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbWJlZGRlZCBJZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW1iZWRkZWRJZCgpCi0JewotCQlyZXR1cm4geG1sRW1iZWRkZWRJZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5IDxlbT5YbWwgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW50aXR5KCkKLQl7Ci0JCXJldHVybiB4bWxFbnRpdHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldE9wdGltaXN0aWNMb2NraW5nIDxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldE9wdGltaXN0aWNMb2NraW5nKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfT3B0aW1pc3RpY0xvY2tpbmcoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRDb3B5UG9saWN5IDxlbT5Db3B5IFBvbGljeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNvcHkgUG9saWN5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRDb3B5UG9saWN5KCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENsb25lQ29weVBvbGljeSA8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfQ2xvbmVDb3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzIDxlbT5YbWwgRW50aXR5IE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JewotCQlyZXR1cm4geG1sRW50aXR5TWFwcGluZ3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoQXR0cmlidXRlIDxlbT5YbWwgRmV0Y2ggQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBGZXRjaCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hBdHRyaWJ1dGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxGZXRjaEF0dHJpYnV0ZSgpCi0JewotCQlyZXR1cm4geG1sRmV0Y2hBdHRyaWJ1dGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXAgPGVtPlhtbCBGZXRjaCBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRmV0Y2ggR3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hHcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEZldGNoR3JvdXAoKQotCXsKLQkJcmV0dXJuIHhtbEZldGNoR3JvdXBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkIDxlbT5YbWwgSWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sSWQoKQotCXsKLQkJcmV0dXJuIHhtbElkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSA8ZW0+WG1sIEluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4geG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3lFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaCA8ZW0+WG1sIEpvaW4gRmV0Y2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEpvaW4gRmV0Y2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sSm9pbkZldGNoKCkKLQl7Ci0JCXJldHVybiB4bWxKb2luRmV0Y2hFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoI2dldEpvaW5GZXRjaCA8ZW0+Sm9pbiBGZXRjaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoI2dldEpvaW5GZXRjaCgpCi0JICogQHNlZSAjZ2V0WG1sSm9pbkZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sSm9pbkZldGNoRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkgPGVtPlhtbCBNYW55IFRvIE1hbnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hbnkgVG8gTWFueTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFueVRvTWFueSgpCi0JewotCQlyZXR1cm4geG1sTWFueVRvTWFueUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lIDxlbT5YbWwgTWFueSBUbyBPbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hbnkgVG8gT25lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hbnlUb09uZSgpCi0JewotCQlyZXR1cm4geG1sTWFueVRvT25lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0T3B0aW1pc3RpY0xvY2tpbmcgPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldE9wdGltaXN0aWNMb2NraW5nKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19PcHRpbWlzdGljTG9ja2luZygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q29weVBvbGljeSA8ZW0+Q29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db3B5IFBvbGljeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENvcHlQb2xpY3koKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0NvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q2xvbmVDb3B5UG9saWN5IDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19DbG9uZUNvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXV0YWJsZSA8ZW0+WG1sIE11dGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE11dGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXV0YWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE11dGFibGUoKQotCXsKLQkJcmV0dXJuIHhtbE11dGFibGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXV0YWJsZSNnZXRNdXRhYmxlIDxlbT5NdXRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TXV0YWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdXRhYmxlI2dldE11dGFibGUoKQotCSAqIEBzZWUgI2dldFhtbE11dGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNdXRhYmxlX011dGFibGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE11dGFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb252ZXJ0ZXIgPGVtPlhtbCBOYW1lZCBDb252ZXJ0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE5hbWVkIENvbnZlcnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE5hbWVkQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiB4bWxOYW1lZENvbnZlcnRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlciNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlciNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE5hbWVkQ29udmVydGVyX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE5hbWVkQ29udmVydGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgPGVtPlhtbCBOYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBOYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQl7Ci0JCXJldHVybiB4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXN1bHRDbGFzcyA8ZW0+UmVzdWx0IENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdWx0IENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UmVzdWx0Q2xhc3MoKQotCSAqIEBzZWUgI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Jlc3VsdENsYXNzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXN1bHRTZXRNYXBwaW5nIDxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXN1bHRTZXRNYXBwaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXN1bHRTZXRNYXBwaW5nKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRQcm9jZWR1cmVOYW1lIDxlbT5Qcm9jZWR1cmUgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2NlZHVyZSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UHJvY2VkdXJlTmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUHJvY2VkdXJlTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UmV0dXJuc1Jlc3VsdFNldCA8ZW0+UmV0dXJucyBSZXN1bHQgU2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmV0dXJucyBSZXN1bHQgU2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UmV0dXJuc1Jlc3VsdFNldCgpCi0JICogQHNlZSAjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmV0dXJuc1Jlc3VsdFNldCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRIaW50cyA8ZW0+SGludHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhpbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0SGludHMoKQotCSAqIEBzZWUgI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X0hpbnRzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFBhcmFtZXRlcnMgPGVtPlBhcmFtZXRlcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBhcmFtZXRlcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRQYXJhbWV0ZXJzKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9QYXJhbWV0ZXJzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgPGVtPlhtbCBPYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JewotCQlyZXR1cm4geG1sT2JqZWN0VHlwZUNvbnZlcnRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldERhdGFUeXBlIDxlbT5EYXRhIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EYXRhIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXREYXRhVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfRGF0YVR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldE9iamVjdFR5cGUgPGVtPk9iamVjdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T2JqZWN0IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXRPYmplY3RUeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9PYmplY3RUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldENvbnZlcnNpb25WYWx1ZXMgPGVtPkNvbnZlcnNpb24gVmFsdWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db252ZXJzaW9uIFZhbHVlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldENvbnZlcnNpb25WYWx1ZXMoKQotCSAqIEBzZWUgI2dldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0NvbnZlcnNpb25WYWx1ZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldERlZmF1bHRPYmplY3RWYWx1ZSA8ZW0+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldERlZmF1bHRPYmplY3RWYWx1ZSgpCi0JICogQHNlZSAjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfRGVmYXVsdE9iamVjdFZhbHVlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSA8ZW0+WG1sIE9uZSBUbyBNYW55PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPbmUgVG8gTWFueTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxPbmVUb01hbnkoKQotCXsKLQkJcmV0dXJuIHhtbE9uZVRvTWFueUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUgPGVtPlhtbCBPbmUgVG8gT25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPbmUgVG8gT25lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT25lVG9PbmUoKQotCXsKLQkJcmV0dXJuIHhtbE9uZVRvT25lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyA8ZW0+WG1sIE9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmcoKQotCXsKLQkJcmV0dXJuIHhtbE9wdGltaXN0aWNMb2NraW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFhtbE9wdGltaXN0aWNMb2NraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyNnZXRDYXNjYWRlIDxlbT5DYXNjYWRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FzY2FkZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyNnZXRDYXNjYWRlKCkKLQkgKiBAc2VlICNnZXRYbWxPcHRpbWlzdGljTG9ja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE9wdGltaXN0aWNMb2NraW5nX0Nhc2NhZGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9wdGltaXN0aWNMb2NraW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyNnZXRTZWxlY3RlZENvbHVtbnMgPGVtPlNlbGVjdGVkIENvbHVtbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlbGVjdGVkIENvbHVtbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcjZ2V0U2VsZWN0ZWRDb2x1bW5zKCkKLQkgKiBAc2VlICNnZXRYbWxPcHRpbWlzdGljTG9ja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE9wdGltaXN0aWNMb2NraW5nX1NlbGVjdGVkQ29sdW1ucygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4gPGVtPlhtbCBPcmRlciBDb2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9yZGVyIENvbHVtbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9yZGVyQ29sdW1uKCkKLQl7Ci0JCXJldHVybiB4bWxPcmRlckNvbHVtbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCXsKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JewotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXkgPGVtPlhtbCBQcmltYXJ5IEtleTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUHJpbWFyeSBLZXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFByaW1hcnlLZXkoKQotCXsKLQkJcmV0dXJuIHhtbFByaW1hcnlLZXlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZCA8ZW0+WG1sIFByaXZhdGUgT3duZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFByaXZhdGUgT3duZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpdmF0ZU93bmVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUHJpdmF0ZU93bmVkKCkKLQl7Ci0JCXJldHVybiB4bWxQcml2YXRlT3duZWRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpdmF0ZU93bmVkI2lzUHJpdmF0ZU93bmVkIDxlbT5Qcml2YXRlIE93bmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcml2YXRlT3duZWQjaXNQcml2YXRlT3duZWQoKQotCSAqIEBzZWUgI2dldFhtbFByaXZhdGVPd25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFByaXZhdGVPd25lZF9Qcml2YXRlT3duZWQoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByaXZhdGVPd25lZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSA8ZW0+WG1sIFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFByb3BlcnR5KCkKLQl7Ci0JCXJldHVybiB4bWxQcm9wZXJ0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFByb3BlcnR5X05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFhtbFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUHJvcGVydHlfVmFsdWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0VmFsdWVUeXBlIDxlbT5WYWx1ZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSNnZXRWYWx1ZVR5cGUoKQotCSAqIEBzZWUgI2dldFhtbFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUHJvcGVydHlfVmFsdWVUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eUNvbnRhaW5lciA8ZW0+WG1sIFByb3BlcnR5IENvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUHJvcGVydHkgQ29udGFpbmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Q29udGFpbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUHJvcGVydHlDb250YWluZXIoKQotCXsKLQkJcmV0dXJuIHhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHlDb250YWluZXIjZ2V0UHJvcGVydGllcyA8ZW0+UHJvcGVydGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJvcGVydGllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eUNvbnRhaW5lciNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyIDxlbT5YbWwgUXVlcnkgQ29udGFpbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBRdWVyeSBDb250YWluZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxRdWVyeUNvbnRhaW5lcigpCi0JewotCQlyZXR1cm4geG1sUXVlcnlDb250YWluZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lciNnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyI2dldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlDb250YWluZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFF1ZXJ5Q29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5UmVkaXJlY3RvcnMgPGVtPlhtbCBRdWVyeSBSZWRpcmVjdG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUXVlcnkgUmVkaXJlY3RvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9ycwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnMoKQotCXsKLQkJcmV0dXJuIHhtbFF1ZXJ5UmVkaXJlY3RvcnNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlYWRPbmx5IDxlbT5YbWwgUmVhZCBPbmx5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBSZWFkIE9ubHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxSZWFkT25seSgpCi0JewotCQlyZXR1cm4geG1sUmVhZE9ubHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHkjZ2V0UmVhZE9ubHkgPGVtPlJlYWQgT25seTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlYWQgT25seTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seSNnZXRSZWFkT25seSgpCi0JICogQHNlZSAjZ2V0WG1sUmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxSZWFkT25seV9SZWFkT25seSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUmVhZE9ubHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmV0dXJuSW5zZXJ0IDxlbT5YbWwgUmV0dXJuIEluc2VydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUmV0dXJuIEluc2VydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZXR1cm5JbnNlcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxSZXR1cm5JbnNlcnQoKQotCXsKLQkJcmV0dXJuIHhtbFJldHVybkluc2VydEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIDxlbT5YbWwgU3RvcmVkIFByb2NlZHVyZSBQYXJhbWV0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFN0b3JlZCBQcm9jZWR1cmUgUGFyYW1ldGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCi0JewotCQlyZXR1cm4geG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXREaXJlY3Rpb24gPGVtPkRpcmVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpcmVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0RGlyZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfRGlyZWN0aW9uKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0UXVlcnlQYXJhbWV0ZXIgPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0UXVlcnlQYXJhbWV0ZXIoKQotCSAqIEBzZWUgI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9RdWVyeVBhcmFtZXRlcigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldEpkYmNUeXBlIDxlbT5KZGJjIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5KZGJjIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldEpkYmNUeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfSmRiY1R5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRKZGJjVHlwZU5hbWUgPGVtPkpkYmMgVHlwZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SmRiYyBUeXBlIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldEpkYmNUeXBlTmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlciA8ZW0+WG1sIFN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFN0cnVjdCBDb252ZXJ0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sU3RydWN0Q29udmVydGVyKCkKLQl7Ci0JCXJldHVybiB4bWxTdHJ1Y3RDb252ZXJ0ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyI2dldENvbnZlcnRlciA8ZW0+Q29udmVydGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29udmVydGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlciNnZXRDb252ZXJ0ZXIoKQotCSAqIEBzZWUgI2dldFhtbFN0cnVjdENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFN0cnVjdENvbnZlcnRlcl9Db252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFN0cnVjdENvbnZlcnRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkgPGVtPlhtbCBUaW1lIE9mIERheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVGltZSBPZiBEYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVGltZU9mRGF5KCkKLQl7Ci0JCXJldHVybiB4bWxUaW1lT2ZEYXlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldEhvdXIgPGVtPkhvdXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ib3VyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRIb3VyKCkKLQkgKiBAc2VlICNnZXRYbWxUaW1lT2ZEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUaW1lT2ZEYXlfSG91cigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVGltZU9mRGF5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldE1pbnV0ZSA8ZW0+TWludXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWludXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRNaW51dGUoKQotCSAqIEBzZWUgI2dldFhtbFRpbWVPZkRheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFRpbWVPZkRheV9NaW51dGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFRpbWVPZkRheUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRTZWNvbmQgPGVtPlNlY29uZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlY29uZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0U2Vjb25kKCkKLQkgKiBAc2VlICNnZXRYbWxUaW1lT2ZEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUaW1lT2ZEYXlfU2Vjb25kKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUaW1lT2ZEYXlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0TWlsbGlzZWNvbmQgPGVtPk1pbGxpc2Vjb25kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWlsbGlzZWNvbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldE1pbGxpc2Vjb25kKCkKLQkgKiBAc2VlICNnZXRYbWxUaW1lT2ZEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUaW1lT2ZEYXlfTWlsbGlzZWNvbmQoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFRpbWVPZkRheUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbiA8ZW0+WG1sIFRyYW5zZm9ybWF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUcmFuc2Zvcm1hdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFRyYW5zZm9ybWF0aW9uKCkKLQl7Ci0JCXJldHVybiB4bWxUcmFuc2Zvcm1hdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IDxlbT5YbWwgVHJhbnNpZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUcmFuc2llbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVHJhbnNpZW50KCkKLQl7Ci0JCXJldHVybiB4bWxUcmFuc2llbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIgPGVtPlhtbCBUeXBlIENvbnZlcnRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVHlwZSBDb252ZXJ0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFR5cGVDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIHhtbFR5cGVDb252ZXJ0ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlciNnZXREYXRhVHlwZSA8ZW0+RGF0YSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF0YSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIjZ2V0RGF0YVR5cGUoKQotCSAqIEBzZWUgI2dldFhtbFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUeXBlQ29udmVydGVyX0RhdGFUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUeXBlQ29udmVydGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlciNnZXRPYmplY3RUeXBlIDxlbT5PYmplY3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9iamVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIjZ2V0T2JqZWN0VHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sVHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFR5cGVDb252ZXJ0ZXJfT2JqZWN0VHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVHlwZUNvbnZlcnRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lIDxlbT5YbWwgVmFyaWFibGUgT25lIFRvIE9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVmFyaWFibGUgT25lIFRvIE9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVmFyaWFibGVPbmVUb09uZSgpCi0JewotCQlyZXR1cm4geG1sVmFyaWFibGVPbmVUb09uZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiA8ZW0+WG1sIFZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFZlcnNpb24oKQotCXsKLQkJcmV0dXJuIHhtbFZlcnNpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlIDxlbT5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkNhY2hlIENvb3JkaW5hdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0Q2FjaGVDb29yZGluYXRpb25UeXBlKCkKLQl7Ci0JCXJldHVybiBjYWNoZUNvb3JkaW5hdGlvblR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUgPGVtPkNhY2hlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5DYWNoZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0Q2FjaGVUeXBlKCkKLQl7Ci0JCXJldHVybiBjYWNoZVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGUgPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFhtbENoYW5nZVRyYWNraW5nVHlwZSgpCi0JewotCQlyZXR1cm4geG1sQ2hhbmdlVHJhY2tpbmdUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlyZWN0aW9uIDxlbT5YbWwgRGlyZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+WG1sIERpcmVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXJlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFhtbERpcmVjdGlvbigpCi0JewotCQlyZXR1cm4geG1sRGlyZWN0aW9uRUVudW07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZSA8ZW0+RXhpc3RlbmNlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5FeGlzdGVuY2UgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRFeGlzdGVuY2VUeXBlKCkKLQl7Ci0JCXJldHVybiBleGlzdGVuY2VUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZSA8ZW0+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlhtbCBKb2luIEZldGNoIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0WG1sSm9pbkZldGNoVHlwZSgpCi0JewotCQlyZXR1cm4geG1sSm9pbkZldGNoVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSA8ZW0+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlKCkKLQl7Ci0JCXJldHVybiB4bWxPcHRpbWlzdGljTG9ja2luZ1R5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1GYWN0b3J5IGdldEVjbGlwc2VMaW5rT3JtRmFjdG9yeSgpCi0JewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXhtbEFjY2Vzc01ldGhvZHNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0FDQ0VTU19NRVRIT0RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBY2Nlc3NNZXRob2RzRUNsYXNzLCBYTUxfQUNDRVNTX01FVEhPRFNfX0dFVF9NRVRIT0QpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEFjY2Vzc01ldGhvZHNFQ2xhc3MsIFhNTF9BQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRCk7Ci0KLQkJeG1sQWNjZXNzTWV0aG9kc0hvbGRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyRUNsYXNzLCBYTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUyk7Ci0KLQkJeG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVRUUklCVVRFX01BUFBJTkcpOwotCi0JCWF0dHJpYnV0ZXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVRUUklCVVRFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXR0cmlidXRlc0VDbGFzcywgQVRUUklCVVRFU19fQkFTSUNfQ09MTEVDVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX0JBU0lDX01BUFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX1RSQU5TRk9STUFUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXR0cmlidXRlc0VDbGFzcywgQVRUUklCVVRFU19fVkFSSUFCTEVfT05FX1RPX09ORVMpOwotCi0JCXhtbEJhc2ljRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9CQVNJQyk7Ci0KLQkJeG1sQmFzaWNDb2xsZWN0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9CQVNJQ19DT0xMRUNUSU9OKTsKLQotCQl4bWxCYXNpY01hcEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTSUNfTUFQKTsKLQotCQl4bWxCYXRjaEZldGNoRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9CQVRDSF9GRVRDSCk7Ci0KLQkJeG1sQmF0Y2hGZXRjaEhvbGRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFUQ0hfRkVUQ0hfSE9MREVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxCYXRjaEZldGNoSG9sZGVyRUNsYXNzLCBYTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSCk7Ci0KLQkJeG1sQ2FjaGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NBQ0hFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDYWNoZUVDbGFzcywgWE1MX0NBQ0hFX19FWFBJUlkpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENhY2hlRUNsYXNzLCBYTUxfQ0FDSEVfX1NJWkUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENhY2hlRUNsYXNzLCBYTUxfQ0FDSEVfX1NIQVJFRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2FjaGVFQ2xhc3MsIFhNTF9DQUNIRV9fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2FjaGVFQ2xhc3MsIFhNTF9DQUNIRV9fQUxXQVlTX1JFRlJFU0gpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENhY2hlRUNsYXNzLCBYTUxfQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2FjaGVFQ2xhc3MsIFhNTF9DQUNIRV9fRElTQUJMRV9ISVRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDYWNoZUVDbGFzcywgWE1MX0NBQ0hFX19DT09SRElOQVRJT05fVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQ2FjaGVFQ2xhc3MsIFhNTF9DQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZKTsKLQotCQl4bWxDYWNoZUhvbGRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ0FDSEVfSE9MREVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDYWNoZUhvbGRlckVDbGFzcywgWE1MX0NBQ0hFX0hPTERFUl9fQ0FDSEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENhY2hlSG9sZGVyRUNsYXNzLCBYTUxfQ0FDSEVfSE9MREVSX19FWElTVEVOQ0VfQ0hFQ0tJTkcpOwotCi0JCXhtbENoYW5nZVRyYWNraW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DSEFOR0VfVFJBQ0tJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENoYW5nZVRyYWNraW5nRUNsYXNzLCBYTUxfQ0hBTkdFX1RSQUNLSU5HX19UWVBFKTsKLQotCQl4bWxDaGFuZ2VUcmFja2luZ0hvbGRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJFQ2xhc3MsIFhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSX19DSEFOR0VfVFJBQ0tJTkcpOwotCi0JCXhtbENsb25lQ29weVBvbGljeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ0xPTkVfQ09QWV9QT0xJQ1kpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENsb25lQ29weVBvbGljeUVDbGFzcywgWE1MX0NMT05FX0NPUFlfUE9MSUNZX19NRVRIT0QpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENsb25lQ29weVBvbGljeUVDbGFzcywgWE1MX0NMT05FX0NPUFlfUE9MSUNZX19XT1JLSU5HX0NPUFlfTUVUSE9EKTsKLQotCQl4bWxDb252ZXJzaW9uVmFsdWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NPTlZFUlNJT05fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENvbnZlcnNpb25WYWx1ZUVDbGFzcywgWE1MX0NPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENvbnZlcnNpb25WYWx1ZUVDbGFzcywgWE1MX0NPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRSk7Ci0KLQkJeG1sQ29udmVydGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DT05WRVJURVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENvbnZlcnRlckVDbGFzcywgWE1MX0NPTlZFUlRFUl9fQ0xBU1NfTkFNRSk7Ci0KLQkJeG1sQ29udmVydGVySG9sZGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DT05WRVJURVJfSE9MREVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDb252ZXJ0ZXJIb2xkZXJFQ2xhc3MsIFhNTF9DT05WRVJURVJfSE9MREVSX19DT05WRVJURVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbENvbnZlcnRlckhvbGRlckVDbGFzcywgWE1MX0NPTlZFUlRFUl9IT0xERVJfX1RZUEVfQ09OVkVSVEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDb252ZXJ0ZXJIb2xkZXJFQ2xhc3MsIFhNTF9DT05WRVJURVJfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbENvbnZlcnRlckhvbGRlckVDbGFzcywgWE1MX0NPTlZFUlRFUl9IT0xERVJfX1NUUlVDVF9DT05WRVJURVIpOwotCi0JCXhtbENvbnZlcnRlcnNIb2xkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NPTlZFUlRFUlNfSE9MREVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDb252ZXJ0ZXJzSG9sZGVyRUNsYXNzLCBYTUxfQ09OVkVSVEVSU19IT0xERVJfX0NPTlZFUlRFUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbENvbnZlcnRlcnNIb2xkZXJFQ2xhc3MsIFhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDb252ZXJ0ZXJzSG9sZGVyRUNsYXNzLCBYTUxfQ09OVkVSVEVSU19IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbENvbnZlcnRlcnNIb2xkZXJFQ2xhc3MsIFhNTF9DT05WRVJURVJTX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUlMpOwotCi0JCXhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09OVkVSVElCTEVfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzLCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fQ09OVkVSVCk7Ci0KLQkJeG1sQ29weVBvbGljeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09QWV9QT0xJQ1kpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENvcHlQb2xpY3lFQ2xhc3MsIFhNTF9DT1BZX1BPTElDWV9fQ0xBU1MpOwotCi0JCXhtbEN1c3RvbWl6ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NVU1RPTUlaRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEN1c3RvbWl6ZXJFQ2xhc3MsIFhNTF9DVVNUT01JWkVSX19DVVNUT01JWkVSX0NMQVNTX05BTUUpOwotCi0JCXhtbEN1c3RvbWl6ZXJIb2xkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NVU1RPTUlaRVJfSE9MREVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDdXN0b21pemVySG9sZGVyRUNsYXNzLCBYTUxfQ1VTVE9NSVpFUl9IT0xERVJfX0NVU1RPTUlaRVIpOwotCi0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTEVNRU5UX0NPTExFQ1RJT04pOwotCi0JCXhtbEVtYmVkZGFibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VNQkVEREFCTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVtYmVkZGFibGVFQ2xhc3MsIFhNTF9FTUJFRERBQkxFX19DT1BZX1BPTElDWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW1iZWRkYWJsZUVDbGFzcywgWE1MX0VNQkVEREFCTEVfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVtYmVkZGFibGVFQ2xhc3MsIFhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW1iZWRkYWJsZUVDbGFzcywgWE1MX0VNQkVEREFCTEVfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUyk7Ci0KLQkJeG1sRW1iZWRkZWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VNQkVEREVEKTsKLQotCQl4bWxFbWJlZGRlZElkRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERFRF9JRCk7Ci0KLQkJeG1sRW50aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTlRJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fT1BUSU1JU1RJQ19MT0NLSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0NPUFlfUE9MSUNZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fQ0xPTkVfQ09QWV9QT0xJQ1kpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTKTsKLQotCQl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU5USVRZX01BUFBJTkdTKTsKLQotCQl4bWxGZXRjaEF0dHJpYnV0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRkVUQ0hfQVRUUklCVVRFKTsKLQotCQl4bWxGZXRjaEdyb3VwRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9GRVRDSF9HUk9VUCk7Ci0KLQkJeG1sSWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0lEKTsKLQotCQl4bWxJbnN0YW50aWF0aW9uQ29weVBvbGljeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSk7Ci0KLQkJeG1sSm9pbkZldGNoRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9KT0lOX0ZFVENIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxKb2luRmV0Y2hFQ2xhc3MsIFhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIKTsKLQotCQl4bWxNYW55VG9NYW55RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQU5ZX1RPX01BTlkpOwotCi0JCXhtbE1hbnlUb09uZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFOWV9UT19PTkUpOwotCi0JCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BUFBFRF9TVVBFUkNMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT1BZX1BPTElDWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUyk7Ci0KLQkJeG1sTXV0YWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTVVUQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTXV0YWJsZUVDbGFzcywgWE1MX01VVEFCTEVfX01VVEFCTEUpOwotCi0JCXhtbE5hbWVkQ29udmVydGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9OQU1FRF9DT05WRVJURVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE5hbWVkQ29udmVydGVyRUNsYXNzLCBYTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FKTsKLQotCQl4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcywgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9DTEFTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcywgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcywgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVUVVJOU19SRVNVTFRfU0VUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MsIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QQVJBTUVURVJTKTsKLQotCQl4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3MsIFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sT2JqZWN0VHlwZUNvbnZlcnRlckVDbGFzcywgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3MsIFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLCBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRSk7Ci0KLQkJeG1sT25lVG9NYW55RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PTkVfVE9fTUFOWSk7Ci0KLQkJeG1sT25lVG9PbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09ORV9UT19PTkUpOwotCi0JCXhtbE9wdGltaXN0aWNMb2NraW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PUFRJTUlTVElDX0xPQ0tJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE9wdGltaXN0aWNMb2NraW5nRUNsYXNzLCBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPcHRpbWlzdGljTG9ja2luZ0VDbGFzcywgWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MsIFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1NFTEVDVEVEX0NPTFVNTlMpOwotCi0JCXhtbE9yZGVyQ29sdW1uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PUkRFUl9DT0xVTU4pOwotCi0JCXhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTKTsKLQotCQl4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MpOwotCi0JCXhtbFByaW1hcnlLZXlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BSSU1BUllfS0VZKTsKLQotCQl4bWxQcml2YXRlT3duZWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BSSVZBVEVfT1dORUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFByaXZhdGVPd25lZEVDbGFzcywgWE1MX1BSSVZBVEVfT1dORURfX1BSSVZBVEVfT1dORUQpOwotCi0JCXhtbFByb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUHJvcGVydHlFQ2xhc3MsIFhNTF9QUk9QRVJUWV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUHJvcGVydHlFQ2xhc3MsIFhNTF9QUk9QRVJUWV9fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFByb3BlcnR5RUNsYXNzLCBYTUxfUFJPUEVSVFlfX1ZBTFVFX1RZUEUpOwotCi0JCXhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QUk9QRVJUWV9DT05UQUlORVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzLCBYTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTKTsKLQotCQl4bWxRdWVyeUNvbnRhaW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUVVFUllfQ09OVEFJTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxRdWVyeUNvbnRhaW5lckVDbGFzcywgWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTKTsKLQotCQl4bWxRdWVyeVJlZGlyZWN0b3JzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9RVUVSWV9SRURJUkVDVE9SUyk7Ci0KLQkJeG1sUmVhZE9ubHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1JFQURfT05MWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUmVhZE9ubHlFQ2xhc3MsIFhNTF9SRUFEX09OTFlfX1JFQURfT05MWSk7Ci0KLQkJeG1sUmV0dXJuSW5zZXJ0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9SRVRVUk5fSU5TRVJUKTsKLQotCQl4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MsIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fRElSRUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MsIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1FVRVJZX1BBUkFNRVRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcywgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcywgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRSk7Ci0KLQkJeG1sU3RydWN0Q29udmVydGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxTdHJ1Y3RDb252ZXJ0ZXJFQ2xhc3MsIFhNTF9TVFJVQ1RfQ09OVkVSVEVSX19DT05WRVJURVIpOwotCi0JCXhtbFRpbWVPZkRheUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVElNRV9PRl9EQVkpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFRpbWVPZkRheUVDbGFzcywgWE1MX1RJTUVfT0ZfREFZX19IT1VSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUaW1lT2ZEYXlFQ2xhc3MsIFhNTF9USU1FX09GX0RBWV9fTUlOVVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUaW1lT2ZEYXlFQ2xhc3MsIFhNTF9USU1FX09GX0RBWV9fU0VDT05EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUaW1lT2ZEYXlFQ2xhc3MsIFhNTF9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQpOwotCi0JCXhtbFRyYW5zZm9ybWF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9UUkFOU0ZPUk1BVElPTik7Ci0KLQkJeG1sVHJhbnNpZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9UUkFOU0lFTlQpOwotCi0JCXhtbFR5cGVDb252ZXJ0ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1RZUEVfQ09OVkVSVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUeXBlQ29udmVydGVyRUNsYXNzLCBYTUxfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVHlwZUNvbnZlcnRlckVDbGFzcywgWE1MX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSk7Ci0KLQkJeG1sVmFyaWFibGVPbmVUb09uZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVkFSSUFCTEVfT05FX1RPX09ORSk7Ci0KLQkJeG1sVmVyc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVkVSU0lPTik7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCWNhY2hlQ29vcmRpbmF0aW9uVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEUpOwotCQljYWNoZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKENBQ0hFX1RZUEUpOwotCQl4bWxDaGFuZ2VUcmFja2luZ1R5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFhNTF9DSEFOR0VfVFJBQ0tJTkdfVFlQRSk7Ci0JCXhtbERpcmVjdGlvbkVFbnVtID0gY3JlYXRlRUVudW0oWE1MX0RJUkVDVElPTik7Ci0JCWV4aXN0ZW5jZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKEVYSVNURU5DRV9UWVBFKTsKLQkJeG1sSm9pbkZldGNoVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oWE1MX0pPSU5fRkVUQ0hfVFlQRSk7Ci0JCXhtbE9wdGltaXN0aWNMb2NraW5nVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oWE1MX09QVElNSVNUSUNfTE9DS0lOR19UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCXsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpOwotCQlFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVOU19VUkkpOwotCQlFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVOU19VUkkpOwotCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKLQkJT3JtUGFja2FnZSB0aGVPcm1QYWNrYWdlID0gKE9ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VicGFja2FnZXMKLQkJZ2V0RVN1YnBhY2thZ2VzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UpOwotCQlnZXRFU3VicGFja2FnZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSk7Ci0JCWdldEVTdWJwYWNrYWdlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKTsKLQotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIoKSk7Ci0JCXhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcigpKTsKLQkJYXR0cmlidXRlc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldEF0dHJpYnV0ZXMoKSk7Ci0JCXhtbEJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sQmFzaWMoKSk7Ci0JCXhtbEJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sQmFzaWNfMl8xKCkpOwotCQl4bWxCYXNpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbEJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTXV0YWJsZSgpKTsKLQkJeG1sQmFzaWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7Ci0JCXhtbEJhc2ljQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sQmFzaWNDb2xsZWN0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sQmFzaWNNYXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbEJhc2ljTWFwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sQmF0Y2hGZXRjaEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmdldFhtbEJhdGNoRmV0Y2hfMl8xKCkpOwotCQl4bWxDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxOYW1lZENvbnZlcnRlcigpKTsKLQkJeG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkpOwotCQl4bWxDb252ZXJ0aWJsZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKSk7Ci0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb24oKSk7Ci0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkpOwotCQl4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSgpKTsKLQkJeG1sRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEVtYmVkZGFibGUoKSk7Ci0JCXhtbEVtYmVkZGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxFbWJlZGRhYmxlXzJfMSgpKTsKLQkJeG1sRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEN1c3RvbWl6ZXJIb2xkZXIoKSk7Ci0JCXhtbEVtYmVkZGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcigpKTsKLQkJeG1sRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENvbnZlcnRlcnNIb2xkZXIoKSk7Ci0JCXhtbEVtYmVkZGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcigpKTsKLQkJeG1sRW1iZWRkZWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxFbWJlZGRlZCgpKTsKLQkJeG1sRW1iZWRkZWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxFbWJlZGRlZF8yXzEoKSk7Ci0JCXhtbEVtYmVkZGVkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sRW1iZWRkZWRJZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEVtYmVkZGVkSWQoKSk7Ci0JCXhtbEVtYmVkZGVkSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxFbWJlZGRlZElkXzJfMSgpKTsKLQkJeG1sRW1iZWRkZWRJZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEVudGl0eSgpKTsKLQkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZ2V0WG1sRW50aXR5XzFfMSgpKTsKLQkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZ2V0WG1sRW50aXR5XzJfMCgpKTsKLQkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sRW50aXR5XzJfMSgpKTsKLQkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUmVhZE9ubHkoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEN1c3RvbWl6ZXJIb2xkZXIoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDYWNoZUhvbGRlcigpKTsKLQkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29udmVydGVyc0hvbGRlcigpKTsKLQkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUXVlcnlDb250YWluZXIoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFByb3BlcnR5Q29udGFpbmVyKCkpOwotCQl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEVudGl0eU1hcHBpbmdzKCkpOwotCQl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENvbnZlcnRlcnNIb2xkZXIoKSk7Ci0JCXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUXVlcnlDb250YWluZXIoKSk7Ci0JCXhtbEZldGNoQXR0cmlidXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xKCkpOwotCQl4bWxGZXRjaEdyb3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKSk7Ci0JCXhtbElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sSWQoKSk7Ci0JCXhtbElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sSWRfMl8xKCkpOwotCQl4bWxJZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTXV0YWJsZSgpKTsKLQkJeG1sSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7Ci0JCXhtbE1hbnlUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxNYW55VG9NYW55KCkpOwotCQl4bWxNYW55VG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZ2V0WG1sTWFueVRvTWFueV8yXzAoKSk7Ci0JCXhtbE1hbnlUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxNYW55VG9NYW55XzJfMSgpKTsKLQkJeG1sTWFueVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbE1hbnlUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxKb2luRmV0Y2goKSk7Ci0JCXhtbE1hbnlUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbE1hbnlUb09uZSgpKTsKLQkJeG1sTWFueVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sTWFueVRvT25lXzJfMSgpKTsKLQkJeG1sTWFueVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sTWFueVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sSm9pbkZldGNoKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzAoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSgpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFJlYWRPbmx5KCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ2FjaGVIb2xkZXIoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUHJvcGVydHlDb250YWluZXIoKSk7Ci0JCXhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxOYW1lZENvbnZlcnRlcigpKTsKLQkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sT25lVG9NYW55KCkpOwotCQl4bWxPbmVUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5nZXRYbWxPbmVUb01hbnlfMl8wKCkpOwotCQl4bWxPbmVUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxPbmVUb01hbnlfMl8xKCkpOwotCQl4bWxPbmVUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxPbmVUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxQcml2YXRlT3duZWQoKSk7Ci0JCXhtbE9uZVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEpvaW5GZXRjaCgpKTsKLQkJeG1sT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxPbmVUb09uZSgpKTsKLQkJeG1sT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxPbmVUb09uZV8yXzEoKSk7Ci0JCXhtbE9uZVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxQcml2YXRlT3duZWQoKSk7Ci0JCXhtbE9uZVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sSm9pbkZldGNoKCkpOwotCQl4bWxPcmRlckNvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbE9yZGVyQ29sdW1uKCkpOwotCQl4bWxPcmRlckNvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmdldFhtbE9yZGVyQ29sdW1uXzJfMCgpKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEoKSk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCXhtbFByaW1hcnlLZXlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5nZXRYbWxQcmltYXJ5S2V5XzFfMSgpKTsKLQkJeG1sUHJpbWFyeUtleUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmdldFhtbFByaW1hcnlLZXlfMl8xKCkpOwotCQl4bWxRdWVyeVJlZGlyZWN0b3JzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKSk7Ci0JCXhtbFJldHVybkluc2VydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmdldFhtbFJldHVybkluc2VydF8yXzEoKSk7Ci0JCXhtbFN0cnVjdENvbnZlcnRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE5hbWVkQ29udmVydGVyKCkpOwotCQl4bWxUcmFuc2Zvcm1hdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sVHJhbnNmb3JtYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxUcmFuc2Zvcm1hdGlvbl8yXzEoKSk7Ci0JCXhtbFRyYW5zZm9ybWF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sVHJhbnNpZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sVHJhbnNpZW50KCkpOwotCQl4bWxUcmFuc2llbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxUeXBlQ29udmVydGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTmFtZWRDb252ZXJ0ZXIoKSk7Ci0JCXhtbFZhcmlhYmxlT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbFZhcmlhYmxlT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxWZXJzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sVmVyc2lvbigpKTsKLQkJeG1sVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmdldFhtbFZlcnNpb25fMl8xKCkpOwotCQl4bWxWZXJzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE11dGFibGUoKSk7Ci0JCXhtbFZlcnNpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyh4bWxBY2Nlc3NNZXRob2RzRUNsYXNzLCBYbWxBY2Nlc3NNZXRob2RzLmNsYXNzLCAiWG1sQWNjZXNzTWV0aG9kcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQWNjZXNzTWV0aG9kc19HZXRNZXRob2QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJnZXRNZXRob2QiLCBudWxsLCAwLCAxLCBYbWxBY2Nlc3NNZXRob2RzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxBY2Nlc3NNZXRob2RzX1NldE1ldGhvZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNldE1ldGhvZCIsIG51bGwsIDAsIDEsIFhtbEFjY2Vzc01ldGhvZHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyRUNsYXNzLCBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzLCAiWG1sQWNjZXNzTWV0aG9kc0hvbGRlciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpLCB0aGlzLmdldFhtbEFjY2Vzc01ldGhvZHMoKSwgbnVsbCwgImFjY2Vzc01ldGhvZHMiLCBudWxsLCAwLCAxLCBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcywgWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcywgIlhtbEF0dHJpYnV0ZU1hcHBpbmciLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoYXR0cmlidXRlc0VDbGFzcywgQXR0cmlidXRlcy5jbGFzcywgIkF0dHJpYnV0ZXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF0dHJpYnV0ZXNfQmFzaWNDb2xsZWN0aW9ucygpLCB0aGlzLmdldFhtbEJhc2ljQ29sbGVjdGlvbigpLCBudWxsLCAiYmFzaWNDb2xsZWN0aW9ucyIsIG51bGwsIDAsIC0xLCBBdHRyaWJ1dGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBdHRyaWJ1dGVzX0Jhc2ljTWFwcygpLCB0aGlzLmdldFhtbEJhc2ljTWFwKCksIG51bGwsICJiYXNpY01hcHMiLCBudWxsLCAwLCAtMSwgQXR0cmlidXRlcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXR0cmlidXRlc19UcmFuc2Zvcm1hdGlvbnMoKSwgdGhpcy5nZXRYbWxUcmFuc2Zvcm1hdGlvbigpLCBudWxsLCAidHJhbnNmb3JtYXRpb25zIiwgbnVsbCwgMCwgLTEsIEF0dHJpYnV0ZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF0dHJpYnV0ZXNfVmFyaWFibGVPbmVUb09uZXMoKSwgdGhpcy5nZXRYbWxWYXJpYWJsZU9uZVRvT25lKCksIG51bGwsICJ2YXJpYWJsZU9uZVRvT25lcyIsIG51bGwsIDAsIC0xLCBBdHRyaWJ1dGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQmFzaWNFQ2xhc3MsIFhtbEJhc2ljLmNsYXNzLCAiWG1sQmFzaWMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxCYXNpY0NvbGxlY3Rpb25FQ2xhc3MsIFhtbEJhc2ljQ29sbGVjdGlvbi5jbGFzcywgIlhtbEJhc2ljQ29sbGVjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEJhc2ljTWFwRUNsYXNzLCBYbWxCYXNpY01hcC5jbGFzcywgIlhtbEJhc2ljTWFwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQmF0Y2hGZXRjaEVDbGFzcywgWG1sQmF0Y2hGZXRjaC5jbGFzcywgIlhtbEJhdGNoRmV0Y2giLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxCYXRjaEZldGNoSG9sZGVyRUNsYXNzLCBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzLCAiWG1sQmF0Y2hGZXRjaEhvbGRlciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEJhdGNoRmV0Y2hIb2xkZXJfQmF0Y2hGZXRjaCgpLCB0aGlzLmdldFhtbEJhdGNoRmV0Y2goKSwgbnVsbCwgImJhdGNoRmV0Y2giLCBudWxsLCAwLCAxLCBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ2FjaGVFQ2xhc3MsIFhtbENhY2hlLmNsYXNzLCAiWG1sQ2FjaGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENhY2hlX0V4cGlyeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgImV4cGlyeSIsIG51bGwsIDAsIDEsIFhtbENhY2hlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDYWNoZV9TaXplKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAic2l6ZSIsIG51bGwsIDAsIDEsIFhtbENhY2hlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDYWNoZV9TaGFyZWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAic2hhcmVkIiwgbnVsbCwgMCwgMSwgWG1sQ2FjaGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENhY2hlX1R5cGUoKSwgdGhpcy5nZXRDYWNoZVR5cGUoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVfQWx3YXlzUmVmcmVzaCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJhbHdheXNSZWZyZXNoIiwgbnVsbCwgMCwgMSwgWG1sQ2FjaGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENhY2hlX1JlZnJlc2hPbmx5SWZOZXdlcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJyZWZyZXNoT25seUlmTmV3ZXIiLCBudWxsLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVfRGlzYWJsZUhpdHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAiZGlzYWJsZUhpdHMiLCBudWxsLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVfQ29vcmRpbmF0aW9uVHlwZSgpLCB0aGlzLmdldENhY2hlQ29vcmRpbmF0aW9uVHlwZSgpLCAiY29vcmRpbmF0aW9uVHlwZSIsICIiLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ2FjaGVfRXhwaXJ5VGltZU9mRGF5KCksIHRoaXMuZ2V0WG1sVGltZU9mRGF5KCksIG51bGwsICJleHBpcnlUaW1lT2ZEYXkiLCBudWxsLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENhY2hlSG9sZGVyRUNsYXNzLCBYbWxDYWNoZUhvbGRlci5jbGFzcywgIlhtbENhY2hlSG9sZGVyIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ2FjaGVIb2xkZXJfQ2FjaGUoKSwgdGhpcy5nZXRYbWxDYWNoZSgpLCBudWxsLCAiY2FjaGUiLCBudWxsLCAwLCAxLCBYbWxDYWNoZUhvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVIb2xkZXJfRXhpc3RlbmNlQ2hlY2tpbmcoKSwgdGhpcy5nZXRFeGlzdGVuY2VUeXBlKCksICJleGlzdGVuY2VDaGVja2luZyIsICIiLCAwLCAxLCBYbWxDYWNoZUhvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENoYW5nZVRyYWNraW5nRUNsYXNzLCBYbWxDaGFuZ2VUcmFja2luZy5jbGFzcywgIlhtbENoYW5nZVRyYWNraW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDaGFuZ2VUcmFja2luZ19UeXBlKCksIHRoaXMuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdUeXBlKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgWG1sQ2hhbmdlVHJhY2tpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxDaGFuZ2VUcmFja2luZ0hvbGRlckVDbGFzcywgWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIuY2xhc3MsICJYbWxDaGFuZ2VUcmFja2luZ0hvbGRlciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCksIHRoaXMuZ2V0WG1sQ2hhbmdlVHJhY2tpbmcoKSwgbnVsbCwgImNoYW5nZVRyYWNraW5nIiwgbnVsbCwgMCwgMSwgWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxDbG9uZUNvcHlQb2xpY3lFQ2xhc3MsIFhtbENsb25lQ29weVBvbGljeS5jbGFzcywgIlhtbENsb25lQ29weVBvbGljeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X01ldGhvZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1ldGhvZCIsIG51bGwsIDAsIDEsIFhtbENsb25lQ29weVBvbGljeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X1dvcmtpbmdDb3B5TWV0aG9kKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAid29ya2luZ0NvcHlNZXRob2QiLCBudWxsLCAwLCAxLCBYbWxDbG9uZUNvcHlQb2xpY3kuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxDb252ZXJzaW9uVmFsdWVFQ2xhc3MsIFhtbENvbnZlcnNpb25WYWx1ZS5jbGFzcywgIlhtbENvbnZlcnNpb25WYWx1ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ29udmVyc2lvblZhbHVlX0RhdGFWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGF0YVZhbHVlIiwgbnVsbCwgMCwgMSwgWG1sQ29udmVyc2lvblZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb252ZXJzaW9uVmFsdWVfT2JqZWN0VmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm9iamVjdFZhbHVlIiwgbnVsbCwgMCwgMSwgWG1sQ29udmVyc2lvblZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ29udmVydGVyRUNsYXNzLCBYbWxDb252ZXJ0ZXIuY2xhc3MsICJYbWxDb252ZXJ0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENvbnZlcnRlcl9DbGFzc05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNsYXNzTmFtZSIsIG51bGwsIDAsIDEsIFhtbENvbnZlcnRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENvbnZlcnRlckhvbGRlckVDbGFzcywgWG1sQ29udmVydGVySG9sZGVyLmNsYXNzLCAiWG1sQ29udmVydGVySG9sZGVyIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ29udmVydGVySG9sZGVyX0NvbnZlcnRlcigpLCB0aGlzLmdldFhtbENvbnZlcnRlcigpLCBudWxsLCAiY29udmVydGVyIiwgbnVsbCwgMCwgMSwgWG1sQ29udmVydGVySG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpLCB0aGlzLmdldFhtbFR5cGVDb252ZXJ0ZXIoKSwgbnVsbCwgInR5cGVDb252ZXJ0ZXIiLCBudWxsLCAwLCAxLCBYbWxDb252ZXJ0ZXJIb2xkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbENvbnZlcnRlckhvbGRlcl9PYmplY3RUeXBlQ29udmVydGVyKCksIHRoaXMuZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpLCBudWxsLCAib2JqZWN0VHlwZUNvbnZlcnRlciIsIG51bGwsIDAsIDEsIFhtbENvbnZlcnRlckhvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ29udmVydGVySG9sZGVyX1N0cnVjdENvbnZlcnRlcigpLCB0aGlzLmdldFhtbFN0cnVjdENvbnZlcnRlcigpLCBudWxsLCAic3RydWN0Q29udmVydGVyIiwgbnVsbCwgMCwgMSwgWG1sQ29udmVydGVySG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ29udmVydGVyc0hvbGRlckVDbGFzcywgWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcywgIlhtbENvbnZlcnRlcnNIb2xkZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX0NvbnZlcnRlcnMoKSwgdGhpcy5nZXRYbWxDb252ZXJ0ZXIoKSwgbnVsbCwgImNvbnZlcnRlcnMiLCBudWxsLCAwLCAtMSwgWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9UeXBlQ29udmVydGVycygpLCB0aGlzLmdldFhtbFR5cGVDb252ZXJ0ZXIoKSwgbnVsbCwgInR5cGVDb252ZXJ0ZXJzIiwgbnVsbCwgMCwgLTEsIFhtbENvbnZlcnRlcnNIb2xkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbENvbnZlcnRlcnNIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSwgdGhpcy5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyKCksIG51bGwsICJvYmplY3RUeXBlQ29udmVydGVycyIsIG51bGwsIDAsIC0xLCBYbWxDb252ZXJ0ZXJzSG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1N0cnVjdENvbnZlcnRlcnMoKSwgdGhpcy5nZXRYbWxTdHJ1Y3RDb252ZXJ0ZXIoKSwgbnVsbCwgInN0cnVjdENvbnZlcnRlcnMiLCBudWxsLCAwLCAtMSwgWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcywgWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzLCAiWG1sQ29udmVydGlibGVNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbnZlcnQiLCBudWxsLCAwLCAxLCBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxDb3B5UG9saWN5RUNsYXNzLCBYbWxDb3B5UG9saWN5LmNsYXNzLCAiWG1sQ29weVBvbGljeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ29weVBvbGljeV9DbGFzcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNsYXNzIiwgbnVsbCwgMCwgMSwgWG1sQ29weVBvbGljeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEN1c3RvbWl6ZXJFQ2xhc3MsIFhtbEN1c3RvbWl6ZXIuY2xhc3MsICJYbWxDdXN0b21pemVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDdXN0b21pemVyX0N1c3RvbWl6ZXJDbGFzc05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImN1c3RvbWl6ZXJDbGFzc05hbWUiLCBudWxsLCAwLCAxLCBYbWxDdXN0b21pemVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ3VzdG9taXplckhvbGRlckVDbGFzcywgWG1sQ3VzdG9taXplckhvbGRlci5jbGFzcywgIlhtbEN1c3RvbWl6ZXJIb2xkZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxDdXN0b21pemVySG9sZGVyX0N1c3RvbWl6ZXIoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxDbGFzc1JlZmVyZW5jZSgpLCBudWxsLCAiY3VzdG9taXplciIsIG51bGwsIDAsIDEsIFhtbEN1c3RvbWl6ZXJIb2xkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcywgWG1sRWxlbWVudENvbGxlY3Rpb24uY2xhc3MsICJYbWxFbGVtZW50Q29sbGVjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEVtYmVkZGFibGVFQ2xhc3MsIFhtbEVtYmVkZGFibGUuY2xhc3MsICJYbWxFbWJlZGRhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbWJlZGRhYmxlX0NvcHlQb2xpY3koKSwgdGhpcy5nZXRYbWxDb3B5UG9saWN5KCksIG51bGwsICJjb3B5UG9saWN5IiwgbnVsbCwgMCwgMSwgWG1sRW1iZWRkYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW1iZWRkYWJsZV9JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpLCB0aGlzLmdldFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCksIG51bGwsICJpbnN0YW50aWF0aW9uQ29weVBvbGljeSIsIG51bGwsIDAsIDEsIFhtbEVtYmVkZGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVtYmVkZGFibGVfQ2xvbmVDb3B5UG9saWN5KCksIHRoaXMuZ2V0WG1sQ2xvbmVDb3B5UG9saWN5KCksIG51bGwsICJjbG9uZUNvcHlQb2xpY3kiLCBudWxsLCAwLCAxLCBYbWxFbWJlZGRhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbWJlZGRhYmxlX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAiZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIsIG51bGwsIDAsIDEsIFhtbEVtYmVkZGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbWJlZGRlZEVDbGFzcywgWG1sRW1iZWRkZWQuY2xhc3MsICJYbWxFbWJlZGRlZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEVtYmVkZGVkSWRFQ2xhc3MsIFhtbEVtYmVkZGVkSWQuY2xhc3MsICJYbWxFbWJlZGRlZElkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sRW50aXR5RUNsYXNzLCBYbWxFbnRpdHkuY2xhc3MsICJYbWxFbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9PcHRpbWlzdGljTG9ja2luZygpLCB0aGlzLmdldFhtbE9wdGltaXN0aWNMb2NraW5nKCksIG51bGwsICJvcHRpbWlzdGljTG9ja2luZyIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X0NvcHlQb2xpY3koKSwgdGhpcy5nZXRYbWxDb3B5UG9saWN5KCksIG51bGwsICJjb3B5UG9saWN5IiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKSwgdGhpcy5nZXRYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpLCBudWxsLCAiaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9DbG9uZUNvcHlQb2xpY3koKSwgdGhpcy5nZXRYbWxDbG9uZUNvcHlQb2xpY3koKSwgbnVsbCwgImNsb25lQ29weVBvbGljeSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5X0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAiZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIlhtbEVudGl0eU1hcHBpbmdzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sRmV0Y2hBdHRyaWJ1dGVFQ2xhc3MsIFhtbEZldGNoQXR0cmlidXRlLmNsYXNzLCAiWG1sRmV0Y2hBdHRyaWJ1dGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxGZXRjaEdyb3VwRUNsYXNzLCBYbWxGZXRjaEdyb3VwLmNsYXNzLCAiWG1sRmV0Y2hHcm91cCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbElkRUNsYXNzLCBYbWxJZC5jbGFzcywgIlhtbElkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3lFQ2xhc3MsIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5LmNsYXNzLCAiWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxKb2luRmV0Y2hFQ2xhc3MsIFhtbEpvaW5GZXRjaC5jbGFzcywgIlhtbEpvaW5GZXRjaCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKSwgdGhpcy5nZXRYbWxKb2luRmV0Y2hUeXBlKCksICJqb2luRmV0Y2giLCBudWxsLCAwLCAxLCBYbWxKb2luRmV0Y2guY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYW55VG9NYW55RUNsYXNzLCBYbWxNYW55VG9NYW55LmNsYXNzLCAiWG1sTWFueVRvTWFueSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb09uZUVDbGFzcywgWG1sTWFueVRvT25lLmNsYXNzLCAiWG1sTWFueVRvT25lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIlhtbE1hcHBlZFN1cGVyY2xhc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfT3B0aW1pc3RpY0xvY2tpbmcoKSwgdGhpcy5nZXRYbWxPcHRpbWlzdGljTG9ja2luZygpLCBudWxsLCAib3B0aW1pc3RpY0xvY2tpbmciLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0NvcHlQb2xpY3koKSwgdGhpcy5nZXRYbWxDb3B5UG9saWN5KCksIG51bGwsICJjb3B5UG9saWN5IiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpLCB0aGlzLmdldFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCksIG51bGwsICJpbnN0YW50aWF0aW9uQ29weVBvbGljeSIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfQ2xvbmVDb3B5UG9saWN5KCksIHRoaXMuZ2V0WG1sQ2xvbmVDb3B5UG9saWN5KCksIG51bGwsICJjbG9uZUNvcHlQb2xpY3kiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAiZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNdXRhYmxlRUNsYXNzLCBYbWxNdXRhYmxlLmNsYXNzLCAiWG1sTXV0YWJsZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE11dGFibGVfTXV0YWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJtdXRhYmxlIiwgbnVsbCwgMCwgMSwgWG1sTXV0YWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE5hbWVkQ29udmVydGVyRUNsYXNzLCBYbWxOYW1lZENvbnZlcnRlci5jbGFzcywgIlhtbE5hbWVkQ29udmVydGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxOYW1lZENvbnZlcnRlcl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgWG1sTmFtZWRDb252ZXJ0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLCBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmNsYXNzLCAiWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmVzdWx0Q2xhc3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXN1bHRDbGFzcyIsIG51bGwsIDAsIDEsIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmVzdWx0U2V0TWFwcGluZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlc3VsdFNldE1hcHBpbmciLCBudWxsLCAwLCAxLCBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Byb2NlZHVyZU5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcm9jZWR1cmVOYW1lIiwgbnVsbCwgMCwgMSwgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXR1cm5zUmVzdWx0U2V0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgInJldHVybnNSZXN1bHRTZXQiLCBudWxsLCAwLCAxLCBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X0hpbnRzKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sUXVlcnlIaW50KCksIG51bGwsICJoaW50cyIsIG51bGwsIDAsIC0xLCBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1BhcmFtZXRlcnMoKSwgdGhpcy5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKSwgbnVsbCwgInBhcmFtZXRlcnMiLCBudWxsLCAwLCAtMSwgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3MsIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsICJYbWxPYmplY3RUeXBlQ29udmVydGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0RhdGFUeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkYXRhVHlwZSIsIG51bGwsIDAsIDEsIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfT2JqZWN0VHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAib2JqZWN0VHlwZSIsIG51bGwsIDAsIDEsIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfQ29udmVyc2lvblZhbHVlcygpLCB0aGlzLmdldFhtbENvbnZlcnNpb25WYWx1ZSgpLCBudWxsLCAiY29udmVyc2lvblZhbHVlcyIsIG51bGwsIDAsIC0xLCBYbWxPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0RlZmF1bHRPYmplY3RWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVmYXVsdE9iamVjdFZhbHVlIiwgbnVsbCwgMCwgMSwgWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE9uZVRvTWFueUVDbGFzcywgWG1sT25lVG9NYW55LmNsYXNzLCAiWG1sT25lVG9NYW55IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sT25lVG9PbmVFQ2xhc3MsIFhtbE9uZVRvT25lLmNsYXNzLCAiWG1sT25lVG9PbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPcHRpbWlzdGljTG9ja2luZ0VDbGFzcywgWG1sT3B0aW1pc3RpY0xvY2tpbmcuY2xhc3MsICJYbWxPcHRpbWlzdGljTG9ja2luZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfVHlwZSgpLCB0aGlzLmdldFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSgpLCAidHlwZSIsIG51bGwsIDAsIDEsIFhtbE9wdGltaXN0aWNMb2NraW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxPcHRpbWlzdGljTG9ja2luZ19DYXNjYWRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImNhc2NhZGUiLCBudWxsLCAwLCAxLCBYbWxPcHRpbWlzdGljTG9ja2luZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfU2VsZWN0ZWRDb2x1bW5zKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQ29sdW1uKCksIG51bGwsICJzZWxlY3RlZENvbHVtbnMiLCBudWxsLCAwLCAtMSwgWG1sT3B0aW1pc3RpY0xvY2tpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPcmRlckNvbHVtbkVDbGFzcywgWG1sT3JkZXJDb2x1bW4uY2xhc3MsICJYbWxPcmRlckNvbHVtbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzLCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5jbGFzcywgIlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MsIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmNsYXNzLCAiWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUHJpbWFyeUtleUVDbGFzcywgWG1sUHJpbWFyeUtleS5jbGFzcywgIlhtbFByaW1hcnlLZXkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQcml2YXRlT3duZWRFQ2xhc3MsIFhtbFByaXZhdGVPd25lZC5jbGFzcywgIlhtbFByaXZhdGVPd25lZCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFByaXZhdGVPd25lZF9Qcml2YXRlT3duZWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAicHJpdmF0ZU93bmVkIiwgbnVsbCwgMCwgMSwgWG1sUHJpdmF0ZU93bmVkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUHJvcGVydHlFQ2xhc3MsIFhtbFByb3BlcnR5LmNsYXNzLCAiWG1sUHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFByb3BlcnR5X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgWG1sUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFByb3BlcnR5X1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBYbWxQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUHJvcGVydHlfVmFsdWVUeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWVUeXBlIiwgbnVsbCwgMCwgMSwgWG1sUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQcm9wZXJ0eUNvbnRhaW5lckVDbGFzcywgWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MsICJYbWxQcm9wZXJ0eUNvbnRhaW5lciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRYbWxQcm9wZXJ0eSgpLCBudWxsLCAicHJvcGVydGllcyIsIG51bGwsIDAsIC0xLCBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFF1ZXJ5Q29udGFpbmVyRUNsYXNzLCBYbWxRdWVyeUNvbnRhaW5lci5jbGFzcywgIlhtbFF1ZXJ5Q29udGFpbmVyIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCksIHRoaXMuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSgpLCBudWxsLCAibmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzIiwgbnVsbCwgMCwgLTEsIFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUXVlcnlSZWRpcmVjdG9yc0VDbGFzcywgWG1sUXVlcnlSZWRpcmVjdG9ycy5jbGFzcywgIlhtbFF1ZXJ5UmVkaXJlY3RvcnMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxSZWFkT25seUVDbGFzcywgWG1sUmVhZE9ubHkuY2xhc3MsICJYbWxSZWFkT25seSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFJlYWRPbmx5X1JlYWRPbmx5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgInJlYWRPbmx5IiwgbnVsbCwgMCwgMSwgWG1sUmVhZE9ubHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxSZXR1cm5JbnNlcnRFQ2xhc3MsIFhtbFJldHVybkluc2VydC5jbGFzcywgIlhtbFJldHVybkluc2VydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcywgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmNsYXNzLCAiWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfRGlyZWN0aW9uKCksIHRoaXMuZ2V0WG1sRGlyZWN0aW9uKCksICJkaXJlY3Rpb24iLCBudWxsLCAwLCAxLCBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX1F1ZXJ5UGFyYW1ldGVyKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicXVlcnlQYXJhbWV0ZXIiLCBudWxsLCAwLCAxLCBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9UeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAiamRiY1R5cGUiLCBudWxsLCAwLCAxLCBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9KZGJjVHlwZU5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJqZGJjVHlwZU5hbWUiLCBudWxsLCAwLCAxLCBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxTdHJ1Y3RDb252ZXJ0ZXJFQ2xhc3MsIFhtbFN0cnVjdENvbnZlcnRlci5jbGFzcywgIlhtbFN0cnVjdENvbnZlcnRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sU3RydWN0Q29udmVydGVyX0NvbnZlcnRlcigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29udmVydGVyIiwgbnVsbCwgMCwgMSwgWG1sU3RydWN0Q29udmVydGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sVGltZU9mRGF5RUNsYXNzLCBYbWxUaW1lT2ZEYXkuY2xhc3MsICJYbWxUaW1lT2ZEYXkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFRpbWVPZkRheV9Ib3VyKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAiaG91ciIsIG51bGwsIDAsIDEsIFhtbFRpbWVPZkRheS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGltZU9mRGF5X01pbnV0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgIm1pbnV0ZSIsIG51bGwsIDAsIDEsIFhtbFRpbWVPZkRheS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGltZU9mRGF5X1NlY29uZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgInNlY29uZCIsIG51bGwsIDAsIDEsIFhtbFRpbWVPZkRheS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGltZU9mRGF5X01pbGxpc2Vjb25kKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAibWlsbGlzZWNvbmQiLCBudWxsLCAwLCAxLCBYbWxUaW1lT2ZEYXkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxUcmFuc2Zvcm1hdGlvbkVDbGFzcywgWG1sVHJhbnNmb3JtYXRpb24uY2xhc3MsICJYbWxUcmFuc2Zvcm1hdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFRyYW5zaWVudEVDbGFzcywgWG1sVHJhbnNpZW50LmNsYXNzLCAiWG1sVHJhbnNpZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sVHlwZUNvbnZlcnRlckVDbGFzcywgWG1sVHlwZUNvbnZlcnRlci5jbGFzcywgIlhtbFR5cGVDb252ZXJ0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFR5cGVDb252ZXJ0ZXJfRGF0YVR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRhdGFUeXBlIiwgbnVsbCwgMCwgMSwgWG1sVHlwZUNvbnZlcnRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVHlwZUNvbnZlcnRlcl9PYmplY3RUeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJvYmplY3RUeXBlIiwgbnVsbCwgMCwgMSwgWG1sVHlwZUNvbnZlcnRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFZhcmlhYmxlT25lVG9PbmVFQ2xhc3MsIFhtbFZhcmlhYmxlT25lVG9PbmUuY2xhc3MsICJYbWxWYXJpYWJsZU9uZVRvT25lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sVmVyc2lvbkVDbGFzcywgWG1sVmVyc2lvbi5jbGFzcywgIlhtbFZlcnNpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGNhY2hlQ29vcmRpbmF0aW9uVHlwZUVFbnVtLCBDYWNoZUNvb3JkaW5hdGlvblR5cGUuY2xhc3MsICJDYWNoZUNvb3JkaW5hdGlvblR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlQ29vcmRpbmF0aW9uVHlwZUVFbnVtLCBDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChjYWNoZUNvb3JkaW5hdGlvblR5cGVFRW51bSwgQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlQ29vcmRpbmF0aW9uVHlwZUVFbnVtLCBDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVDb29yZGluYXRpb25UeXBlRUVudW0sIENhY2hlQ29vcmRpbmF0aW9uVHlwZS5OT05FKTsKLQotCQlpbml0RUVudW0oY2FjaGVUeXBlRUVudW0sIENhY2hlVHlwZS5jbGFzcywgIkNhY2hlVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVUeXBlRUVudW0sIENhY2hlVHlwZS5GVUxMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlVHlwZUVFbnVtLCBDYWNoZVR5cGUuV0VBSyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChjYWNoZVR5cGVFRW51bSwgQ2FjaGVUeXBlLlNPRlQpOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVUeXBlRUVudW0sIENhY2hlVHlwZS5TT0ZUX1dFQUspOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVUeXBlRUVudW0sIENhY2hlVHlwZS5IQVJEX1dFQUspOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVUeXBlRUVudW0sIENhY2hlVHlwZS5DQUNIRSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChjYWNoZVR5cGVFRW51bSwgQ2FjaGVUeXBlLk5PTkUpOwotCi0JCWluaXRFRW51bSh4bWxDaGFuZ2VUcmFja2luZ1R5cGVFRW51bSwgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLmNsYXNzLCAiWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxDaGFuZ2VUcmFja2luZ1R5cGVFRW51bSwgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxDaGFuZ2VUcmFja2luZ1R5cGVFRW51bSwgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxDaGFuZ2VUcmFja2luZ1R5cGVFRW51bSwgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbENoYW5nZVRyYWNraW5nVHlwZUVFbnVtLCBYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0KLQkJaW5pdEVFbnVtKHhtbERpcmVjdGlvbkVFbnVtLCBYbWxEaXJlY3Rpb24uY2xhc3MsICJYbWxEaXJlY3Rpb24iKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbERpcmVjdGlvbkVFbnVtLCBYbWxEaXJlY3Rpb24uSU4pOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sRGlyZWN0aW9uRUVudW0sIFhtbERpcmVjdGlvbi5PVVQpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sRGlyZWN0aW9uRUVudW0sIFhtbERpcmVjdGlvbi5JTl9PVVQpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sRGlyZWN0aW9uRUVudW0sIFhtbERpcmVjdGlvbi5PVVRfQ1VSU09SKTsKLQotCQlpbml0RUVudW0oZXhpc3RlbmNlVHlwZUVFbnVtLCBFeGlzdGVuY2VUeXBlLmNsYXNzLCAiRXhpc3RlbmNlVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoZXhpc3RlbmNlVHlwZUVFbnVtLCBFeGlzdGVuY2VUeXBlLkNIRUNLX0NBQ0hFKTsKLQkJYWRkRUVudW1MaXRlcmFsKGV4aXN0ZW5jZVR5cGVFRW51bSwgRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChleGlzdGVuY2VUeXBlRUVudW0sIEV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChleGlzdGVuY2VUeXBlRUVudW0sIEV4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UpOwotCi0JCWluaXRFRW51bSh4bWxKb2luRmV0Y2hUeXBlRUVudW0sIFhtbEpvaW5GZXRjaFR5cGUuY2xhc3MsICJYbWxKb2luRmV0Y2hUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxKb2luRmV0Y2hUeXBlRUVudW0sIFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sSm9pbkZldGNoVHlwZUVFbnVtLCBYbWxKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQotCQlpbml0RUVudW0oeG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlRUVudW0sIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZS5jbGFzcywgIlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlRUVudW0sIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZS5BTExfQ09MVU1OUyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxPcHRpbWlzdGljTG9ja2luZ1R5cGVFRW51bSwgWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlLkNIQU5HRURfQ09MVU1OUyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxPcHRpbWlzdGljTG9ja2luZ1R5cGVFRW51bSwgWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlLlNFTEVDVEVEX0NPTFVNTlMpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlRUVudW0sIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZS5WRVJTSU9OX0NPTFVNTik7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKLQl7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMgPGVtPlhtbCBBY2Nlc3MgTWV0aG9kczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FDQ0VTU19NRVRIT0RTID0gZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdldCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9BQ0NFU1NfTUVUSE9EU19fR0VUX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzX0dldE1ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2V0IE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0FDQ0VTU19NRVRIT0RTX19TRVRfTUVUSE9EID0gZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNfU2V0TWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlciA8ZW0+WG1sIEFjY2VzcyBNZXRob2RzIEhvbGRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUiA9IGVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFMgPSBlSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyA8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQVRUUklCVVRFX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgPGVtPkF0dHJpYnV0ZXM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0QXR0cmlidXRlcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIEFUVFJJQlVURVMgPSBlSU5TVEFOQ0UuZ2V0QXR0cmlidXRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzaWMgQ29sbGVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgQVRUUklCVVRFU19fQkFTSUNfQ09MTEVDVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19CYXNpY0NvbGxlY3Rpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNpYyBNYXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEFUVFJJQlVURVNfX0JBU0lDX01BUFMgPSBlSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19CYXNpY01hcHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zZm9ybWF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBVFRSSUJVVEVTX19UUkFOU0ZPUk1BVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19UcmFuc2Zvcm1hdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmxlIE9uZSBUbyBPbmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEFUVFJJQlVURVNfX1ZBUklBQkxFX09ORV9UT19PTkVTID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfVmFyaWFibGVPbmVUb09uZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyA8ZW0+WG1sIEJhc2ljPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpYygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVNJQyA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpYygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbiA8ZW0+WG1sIEJhc2ljIENvbGxlY3Rpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpY0NvbGxlY3Rpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFTSUNfQ09MTEVDVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY0NvbGxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcCA8ZW0+WG1sIEJhc2ljIE1hcDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNNYXAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFTSUNfTUFQID0gZUlOU1RBTkNFLmdldFhtbEJhc2ljTWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaCA8ZW0+WG1sIEJhdGNoIEZldGNoPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2gKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhdGNoRmV0Y2goKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFUQ0hfRkVUQ0ggPSBlSU5TVEFOQ0UuZ2V0WG1sQmF0Y2hGZXRjaCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2hIb2xkZXIgPGVtPlhtbCBCYXRjaCBGZXRjaCBIb2xkZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaEhvbGRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVRDSF9GRVRDSF9IT0xERVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIID0gZUlOU1RBTkNFLmdldFhtbEJhdGNoRmV0Y2hIb2xkZXJfQmF0Y2hGZXRjaCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlIDxlbT5YbWwgQ2FjaGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NBQ0hFID0gZUlOU1RBTkNFLmdldFhtbENhY2hlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHBpcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DQUNIRV9fRVhQSVJZID0gZUlOU1RBTkNFLmdldFhtbENhY2hlX0V4cGlyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NBQ0hFX19TSVpFID0gZUlOU1RBTkNFLmdldFhtbENhY2hlX1NpemUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNoYXJlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NBQ0hFX19TSEFSRUQgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfU2hhcmVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0FDSEVfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWx3YXlzIFJlZnJlc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DQUNIRV9fQUxXQVlTX1JFRlJFU0ggPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfQWx3YXlzUmVmcmVzaCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUiA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZV9SZWZyZXNoT25seUlmTmV3ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc2FibGUgSGl0czwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NBQ0hFX19ESVNBQkxFX0hJVFMgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfRGlzYWJsZUhpdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvb3JkaW5hdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldFhtbENhY2hlX0Nvb3JkaW5hdGlvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4cGlyeSBUaW1lIE9mIERheTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVkgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfRXhwaXJ5VGltZU9mRGF5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIgPGVtPlhtbCBDYWNoZSBIb2xkZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NBQ0hFX0hPTERFUiA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZUhvbGRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFID0gZUlOU1RBTkNFLmdldFhtbENhY2hlSG9sZGVyX0NhY2hlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgQ2hlY2tpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DQUNIRV9IT0xERVJfX0VYSVNURU5DRV9DSEVDS0lORyA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZUhvbGRlcl9FeGlzdGVuY2VDaGVja2luZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nIDxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDaGFuZ2VUcmFja2luZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DSEFOR0VfVFJBQ0tJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2hhbmdlVHJhY2tpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DSEFOR0VfVFJBQ0tJTkdfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyIDxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nIEhvbGRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ0hvbGRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUiA9IGVJTlNUQU5DRS5nZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIFRyYWNraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUl9fQ0hBTkdFX1RSQUNLSU5HID0gZUlOU1RBTkNFLmdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5IDxlbT5YbWwgQ2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDbG9uZUNvcHlQb2xpY3koKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2xvbmVDb3B5UG9saWN5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DTE9ORV9DT1BZX1BPTElDWV9fTUVUSE9EID0gZUlOU1RBTkNFLmdldFhtbENsb25lQ29weVBvbGljeV9NZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmtpbmcgQ29weSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DTE9ORV9DT1BZX1BPTElDWV9fV09SS0lOR19DT1BZX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRYbWxDbG9uZUNvcHlQb2xpY3lfV29ya2luZ0NvcHlNZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUgPGVtPlhtbCBDb252ZXJzaW9uIFZhbHVlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVyc2lvblZhbHVlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NPTlZFUlNJT05fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVyc2lvblZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJzaW9uVmFsdWVfRGF0YVZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVyc2lvblZhbHVlX09iamVjdFZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyIDxlbT5YbWwgQ29udmVydGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NPTlZFUlRFUiA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT05WRVJURVJfX0NMQVNTX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyX0NsYXNzTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciA8ZW0+WG1sIENvbnZlcnRlciBIb2xkZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09OVkVSVEVSX0hPTERFUiA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUiA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NPTlZFUlRFUl9IT0xERVJfX1RZUEVfQ09OVkVSVEVSID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9UeXBlQ29udmVydGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DT05WRVJURVJfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DT05WRVJURVJfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyIDxlbT5YbWwgQ29udmVydGVycyBIb2xkZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT05WRVJURVJTX0hPTERFUiA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DT05WRVJURVJTX0hPTERFUl9fQ09OVkVSVEVSUyA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX0NvbnZlcnRlcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQ09OVkVSVEVSU19IT0xERVJfX1RZUEVfQ09OVkVSVEVSUyA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1R5cGVDb252ZXJ0ZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DT05WRVJURVJTX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQ09OVkVSVEVSU19IT0xERVJfX1NUUlVDVF9DT05WRVJURVJTID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfU3RydWN0Q29udmVydGVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyA8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09OVkVSVElCTEVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19DT05WRVJUID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29weVBvbGljeSA8ZW0+WG1sIENvcHkgUG9saWN5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvcHlQb2xpY3kKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvcHlQb2xpY3koKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT1BZX1BPTElDWV9fQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29weVBvbGljeV9DbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIgPGVtPlhtbCBDdXN0b21pemVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEN1c3RvbWl6ZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ1VTVE9NSVpFUiA9IGVJTlNUQU5DRS5nZXRYbWxDdXN0b21pemVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DdXN0b21pemVyIENsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DVVNUT01JWkVSX19DVVNUT01JWkVSX0NMQVNTX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ3VzdG9taXplcl9DdXN0b21pemVyQ2xhc3NOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciA8ZW0+WG1sIEN1c3RvbWl6ZXIgSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXJIb2xkZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEN1c3RvbWl6ZXJIb2xkZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ1VTVE9NSVpFUl9IT0xERVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q3VzdG9taXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NVU1RPTUlaRVJfSE9MREVSX19DVVNUT01JWkVSID0gZUlOU1RBTkNFLmdldFhtbEN1c3RvbWl6ZXJIb2xkZXJfQ3VzdG9taXplcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uIDxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTEVNRU5UX0NPTExFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlIDxlbT5YbWwgRW1iZWRkYWJsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VNQkVEREFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTUJFRERBQkxFX19DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlX0NvcHlQb2xpY3koKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGVfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV9DbG9uZUNvcHlQb2xpY3koKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VNQkVEREFCTEVfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZCA8ZW0+WG1sIEVtYmVkZGVkPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRlZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTUJFRERFRCA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQgPGVtPlhtbCBFbWJlZGRlZCBJZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRlZElkKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VNQkVEREVEX0lEID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGVkSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkgPGVtPlhtbCBFbnRpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU5USVRZID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3B0aW1pc3RpYyBMb2NraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X09wdGltaXN0aWNMb2NraW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0NvcHlQb2xpY3koKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbG9uZSBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fQ0xPTkVfQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0Nsb25lQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyA8ZW0+WG1sIEVudGl0eSBNYXBwaW5nczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU5USVRZX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hBdHRyaWJ1dGUgPGVtPlhtbCBGZXRjaCBBdHRyaWJ1dGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hBdHRyaWJ1dGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEZldGNoQXR0cmlidXRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0ZFVENIX0FUVFJJQlVURSA9IGVJTlNUQU5DRS5nZXRYbWxGZXRjaEF0dHJpYnV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXAgPGVtPlhtbCBGZXRjaCBHcm91cDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxGZXRjaEdyb3VwCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0ZFVENIX0dST1VQID0gZUlOU1RBTkNFLmdldFhtbEZldGNoR3JvdXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCA8ZW0+WG1sIElkPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxJZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9JRCA9IGVJTlNUQU5DRS5nZXRYbWxJZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5YbWwgSW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaCA8ZW0+WG1sIEpvaW4gRmV0Y2g8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxKb2luRmV0Y2goKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSk9JTl9GRVRDSCA9IGVJTlNUQU5DRS5nZXRYbWxKb2luRmV0Y2goKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIID0gZUlOU1RBTkNFLmdldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55IDxlbT5YbWwgTWFueSBUbyBNYW55PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hbnlUb01hbnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFOWV9UT19NQU5ZID0gZUlOU1RBTkNFLmdldFhtbE1hbnlUb01hbnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUgPGVtPlhtbCBNYW55IFRvIE9uZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hbnlUb09uZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQU5ZX1RPX09ORSA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9PbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQVBQRURfU1VQRVJDTEFTUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpbWlzdGljIExvY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fT1BUSU1JU1RJQ19MT0NLSU5HID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfT3B0aW1pc3RpY0xvY2tpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfQ2xvbmVDb3B5UG9saWN5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11dGFibGUgPGVtPlhtbCBNdXRhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11dGFibGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE11dGFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTVVUQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxNdXRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NdXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTVVUQUJMRV9fTVVUQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxNdXRhYmxlX011dGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlciA8ZW0+WG1sIE5hbWVkIENvbnZlcnRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRDb252ZXJ0ZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTkFNRURfQ09OVkVSVEVSID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkQ29udmVydGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkQ29udmVydGVyX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IDxlbT5YbWwgTmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUlkgPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXN1bHQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXN1bHRDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzdWx0IFNldCBNYXBwaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmVzdWx0U2V0TWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VkdXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QUk9DRURVUkVfTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Byb2NlZHVyZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldHVybnMgUmVzdWx0IFNldDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVCA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1JldHVybnNSZXN1bHRTZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19ISU5UUyA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X0hpbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QQVJBTUVURVJTID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUGFyYW1ldGVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgPGVtPlhtbCBPYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVIgPSBlSU5TVEFOQ0UuZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9EYXRhVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFID0gZUlOU1RBTkNFLmdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfT2JqZWN0VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udmVyc2lvbiBWYWx1ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9Db252ZXJzaW9uVmFsdWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9EZWZhdWx0T2JqZWN0VmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkgPGVtPlhtbCBPbmUgVG8gTWFueTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fTUFOWSA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSA8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9uZVRvT25lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09ORV9UT19PTkUgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9PbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyA8ZW0+WG1sIE9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HID0gZUlOU1RBTkNFLmdldFhtbE9wdGltaXN0aWNMb2NraW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFID0gZUlOU1RBTkNFLmdldFhtbE9wdGltaXN0aWNMb2NraW5nX1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX0NBU0NBREUgPSBlSU5TVEFOQ0UuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfQ2FzY2FkZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VsZWN0ZWQgQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU5TID0gZUlOU1RBTkNFLmdldFhtbE9wdGltaXN0aWNMb2NraW5nX1NlbGVjdGVkQ29sdW1ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uIDxlbT5YbWwgT3JkZXIgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PUkRFUl9DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0WG1sT3JkZXJDb2x1bW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFMgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleSA8ZW0+WG1sIFByaW1hcnkgS2V5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXkKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaW1hcnlLZXkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUFJJTUFSWV9LRVkgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJpbWFyeUtleSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZCA8ZW0+WG1sIFByaXZhdGUgT3duZWQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpdmF0ZU93bmVkCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcml2YXRlT3duZWQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUFJJVkFURV9PV05FRCA9IGVJTlNUQU5DRS5nZXRYbWxQcml2YXRlT3duZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByaXZhdGUgT3duZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QUklWQVRFX09XTkVEX19QUklWQVRFX09XTkVEID0gZUlOU1RBTkNFLmdldFhtbFByaXZhdGVPd25lZF9Qcml2YXRlT3duZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSA8ZW0+WG1sIFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BST1BFUlRZX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUFJPUEVSVFlfX1ZBTFVFID0gZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUFJPUEVSVFlfX1ZBTFVFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlfVmFsdWVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHlDb250YWluZXIgPGVtPlhtbCBQcm9wZXJ0eSBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHlDb250YWluZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BST1BFUlRZX0NPTlRBSU5FUiA9IGVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTID0gZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lciA8ZW0+WG1sIFF1ZXJ5IENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUVVFUllfQ09OVEFJTkVSID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5Q29udGFpbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5UmVkaXJlY3RvcnMgPGVtPlhtbCBRdWVyeSBSZWRpcmVjdG9yczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeVJlZGlyZWN0b3JzCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1FVRVJZX1JFRElSRUNUT1JTID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seSA8ZW0+WG1sIFJlYWQgT25seTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUmVhZE9ubHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUkVBRF9PTkxZID0gZUlOU1RBTkNFLmdldFhtbFJlYWRPbmx5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9SRUFEX09OTFlfX1JFQURfT05MWSA9IGVJTlNUQU5DRS5nZXRYbWxSZWFkT25seV9SZWFkT25seSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJldHVybkluc2VydCA8ZW0+WG1sIFJldHVybiBJbnNlcnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmV0dXJuSW5zZXJ0Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZXR1cm5JbnNlcnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUkVUVVJOX0lOU0VSVCA9IGVJTlNUQU5DRS5nZXRYbWxSZXR1cm5JbnNlcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgPGVtPlhtbCBTdG9yZWQgUHJvY2VkdXJlIFBhcmFtZXRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUiA9IGVJTlNUQU5DRS5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19ESVJFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0RpcmVjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5RdWVyeSBQYXJhbWV0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fUVVFUllfUEFSQU1FVEVSID0gZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9RdWVyeVBhcmFtZXRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19UWVBFID0gZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KZGJjIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFID0gZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9KZGJjVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmRiYyBUeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlciA8ZW0+WG1sIFN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdHJ1Y3RDb252ZXJ0ZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfU1RSVUNUX0NPTlZFUlRFUiA9IGVJTlNUQU5DRS5nZXRYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUiA9IGVJTlNUQU5DRS5nZXRYbWxTdHJ1Y3RDb252ZXJ0ZXJfQ29udmVydGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5IDxlbT5YbWwgVGltZSBPZiBEYXk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUaW1lT2ZEYXkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVElNRV9PRl9EQVkgPSBlSU5TVEFOQ0UuZ2V0WG1sVGltZU9mRGF5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ib3VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVElNRV9PRl9EQVlfX0hPVVIgPSBlSU5TVEFOQ0UuZ2V0WG1sVGltZU9mRGF5X0hvdXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1pbnV0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RJTUVfT0ZfREFZX19NSU5VVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sVGltZU9mRGF5X01pbnV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2Vjb25kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVElNRV9PRl9EQVlfX1NFQ09ORCA9IGVJTlNUQU5DRS5nZXRYbWxUaW1lT2ZEYXlfU2Vjb25kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NaWxsaXNlY29uZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RJTUVfT0ZfREFZX19NSUxMSVNFQ09ORCA9IGVJTlNUQU5DRS5nZXRYbWxUaW1lT2ZEYXlfTWlsbGlzZWNvbmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbiA8ZW0+WG1sIFRyYW5zZm9ybWF0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUcmFuc2Zvcm1hdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9UUkFOU0ZPUk1BVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxUcmFuc2Zvcm1hdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudCA8ZW0+WG1sIFRyYW5zaWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRyYW5zaWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9UUkFOU0lFTlQgPSBlSU5TVEFOQ0UuZ2V0WG1sVHJhbnNpZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlciA8ZW0+WG1sIFR5cGUgQ29udmVydGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFR5cGVDb252ZXJ0ZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVFlQRV9DT05WRVJURVIgPSBlSU5TVEFOQ0UuZ2V0WG1sVHlwZUNvbnZlcnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxUeXBlQ29udmVydGVyX0RhdGFUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxUeXBlQ29udmVydGVyX09iamVjdFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lIDxlbT5YbWwgVmFyaWFibGUgT25lIFRvIE9uZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxWYXJpYWJsZU9uZVRvT25lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1ZBUklBQkxFX09ORV9UT19PTkUgPSBlSU5TVEFOQ0UuZ2V0WG1sVmFyaWFibGVPbmVUb09uZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24gPGVtPlhtbCBWZXJzaW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFZlcnNpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRYbWxWZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlIDxlbT5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0Q2FjaGVDb29yZGluYXRpb25UeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBDQUNIRV9DT09SRElOQVRJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRDYWNoZUNvb3JkaW5hdGlvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUgPGVtPkNhY2hlIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldENhY2hlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gQ0FDSEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRDYWNoZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGUgPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmdUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBYTUxfQ0hBTkdFX1RSQUNLSU5HX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlyZWN0aW9uIDxlbT5YbWwgRGlyZWN0aW9uPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlyZWN0aW9uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxEaXJlY3Rpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIFhNTF9ESVJFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sRGlyZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZSA8ZW0+RXhpc3RlbmNlIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRFeGlzdGVuY2VUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBFWElTVEVOQ0VfVFlQRSA9IGVJTlNUQU5DRS5nZXRFeGlzdGVuY2VUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZSA8ZW0+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIFhNTF9KT0lOX0ZFVENIX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sSm9pbkZldGNoVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSA8ZW0+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUoKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3Njg0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0VjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3Rvcnk7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VGYWN0b3J5KCkgewotCQl0aGlzKFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLQkJc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua09ybVhtbFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSwgYm9vbGVhbiBsaXN0ZW5pbmdGb3JVcGRhdGVzKSB7Ci0JCXN1cGVyKGFSZW5kZXJlckZhY3RvcnksIGxpc3RlbmluZ0ZvclVwZGF0ZXMpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkjY3JlYXRlUmVzb3VyY2UoVVJJLCBSZW5kZXJlcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXJldHVybiBuZXcgSnBhWG1sUmVzb3VyY2UodXJpLCByZW5kZXJlciwgSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFLCBYbWxFbnRpdHlNYXBwaW5ncy5nZXRSb290VHJhbnNsYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0V4aXN0ZW5jZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRXhpc3RlbmNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2U2ZDcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRXhpc3RlbmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5FeGlzdGVuY2UgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0RXhpc3RlbmNlVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gRXhpc3RlbmNlVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DSEVDSyBDQUNIRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDSEVDS19DQUNIRV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUNIRUNLX0NBQ0hFKDAsICJDSEVDS19DQUNIRSIsICJDSEVDS19DQUNIRSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0hFQ0sgREFUQUJBU0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0hFQ0tfREFUQUJBU0VfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlDSEVDS19EQVRBQkFTRSgxLCAiQ0hFQ0tfREFUQUJBU0UiLCAiQ0hFQ0tfREFUQUJBU0UiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFTU1VNRSBFWElTVEVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVNTVU1FX0VYSVNURU5DRV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUFTU1VNRV9FWElTVEVOQ0UoMiwgIkFTU1VNRV9FWElTVEVOQ0UiLCAiQVNTVU1FX0VYSVNURU5DRSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QVNTVU1FIE5PTiBFWElTVEVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVNTVU1FX05PTl9FWElTVEVOQ0VfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlBU1NVTUVfTk9OX0VYSVNURU5DRSgzLCAiQVNTVU1FX05PTl9FWElTVEVOQ0UiLCAiQVNTVU1FX05PTl9FWElTVEVOQ0UiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNIRUNLIENBQ0hFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DSEVDSyBDQUNIRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDSEVDS19DQUNIRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIRUNLX0NBQ0hFX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNIRUNLIERBVEFCQVNFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DSEVDSyBEQVRBQkFTRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDSEVDS19EQVRBQkFTRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIRUNLX0RBVEFCQVNFX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFTU1VNRSBFWElTVEVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFTU1VNRSBFWElTVEVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVNTVU1FX0VYSVNURU5DRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTU1VNRV9FWElTVEVOQ0VfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QVNTVU1FIE5PTiBFWElTVEVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFTU1VNRSBOT04gRVhJU1RFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FTU1VNRV9OT05fRVhJU1RFTkNFCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTVU1FX05PTl9FWElTVEVOQ0VfVkFMVUUgPSAzOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeGlzdGVuY2VUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEV4aXN0ZW5jZVR5cGVbXQotCQl7Ci0JCQlDSEVDS19DQUNIRSwKLQkJCUNIRUNLX0RBVEFCQVNFLAotCQkJQVNTVU1FX0VYSVNURU5DRSwKLQkJCUFTU1VNRV9OT05fRVhJU1RFTkNFLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8RXhpc3RlbmNlVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4aXN0ZW5jZVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUV4aXN0ZW5jZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RXhpc3RlbmNlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFeGlzdGVuY2VUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlFeGlzdGVuY2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RXhpc3RlbmNlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFeGlzdGVuY2VUeXBlIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIENIRUNLX0NBQ0hFX1ZBTFVFOiByZXR1cm4gQ0hFQ0tfQ0FDSEU7Ci0JCQljYXNlIENIRUNLX0RBVEFCQVNFX1ZBTFVFOiByZXR1cm4gQ0hFQ0tfREFUQUJBU0U7Ci0JCQljYXNlIEFTU1VNRV9FWElTVEVOQ0VfVkFMVUU6IHJldHVybiBBU1NVTUVfRVhJU1RFTkNFOwotCQkJY2FzZSBBU1NVTUVfTk9OX0VYSVNURU5DRV9WQUxVRTogcmV0dXJuIEFTU1VNRV9OT05fRVhJU1RFTkNFOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFeGlzdGVuY2VUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQotCXsKLQkgIHJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCi0JewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQkKLX0gLy9FeGlzdGVuY2VUeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFjY2Vzc01ldGhvZHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQWNjZXNzTWV0aG9kcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDJiOTRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQWNjZXNzTWV0aG9kcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBBY2Nlc3MgTWV0aG9kczwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzI2dldEdldE1ldGhvZCA8ZW0+R2V0IE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMjZ2V0U2V0TWV0aG9kIDxlbT5TZXQgTWV0aG9kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHMoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQWNjZXNzTWV0aG9kcyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2V0TWV0aG9kKCkgPGVtPkdldCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX01FVEhPRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHZXRNZXRob2QoKSA8ZW0+R2V0IE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1ldGhvZCA9IEdFVF9NRVRIT0RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2V0TWV0aG9kKCkgPGVtPlNldCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX01FVEhPRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXRNZXRob2QoKSA8ZW0+U2V0IE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNldE1ldGhvZCA9IFNFVF9NRVRIT0RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0FDQ0VTU19NRVRIT0RTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdldCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdldCBNZXRob2Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R2V0IE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0R2V0TWV0aG9kKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc19HZXRNZXRob2QoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHZXRNZXRob2QoKQotCXsKLQkJcmV0dXJuIGdldE1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcyNnZXRHZXRNZXRob2QgPGVtPkdldCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdldCBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEdldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdldE1ldGhvZChTdHJpbmcgbmV3R2V0TWV0aG9kKQotCXsKLQkJU3RyaW5nIG9sZEdldE1ldGhvZCA9IGdldE1ldGhvZDsKLQkJZ2V0TWV0aG9kID0gbmV3R2V0TWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9ELCBvbGRHZXRNZXRob2QsIGdldE1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNldCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNldCBNZXRob2Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2V0IE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2V0TWV0aG9kKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc19TZXRNZXRob2QoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXRNZXRob2QoKQotCXsKLQkJcmV0dXJuIHNldE1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcyNnZXRTZXRNZXRob2QgPGVtPlNldCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNldCBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNldE1ldGhvZChTdHJpbmcgbmV3U2V0TWV0aG9kKQotCXsKLQkJU3RyaW5nIG9sZFNldE1ldGhvZCA9IHNldE1ldGhvZDsKLQkJc2V0TWV0aG9kID0gbmV3U2V0TWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19TRVRfTUVUSE9ELCBvbGRTZXRNZXRob2QsIHNldE1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9EOgotCQkJCXJldHVybiBnZXRHZXRNZXRob2QoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0U2V0TWV0aG9kKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9EOgotCQkJCXNldEdldE1ldGhvZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfX1NFVF9NRVRIT0Q6Ci0JCQkJc2V0U2V0TWV0aG9kKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19fR0VUX01FVEhPRDoKLQkJCQlzZXRHZXRNZXRob2QoR0VUX01FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19TRVRfTUVUSE9EOgotCQkJCXNldFNldE1ldGhvZChTRVRfTUVUSE9EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9EOgotCQkJCXJldHVybiBHRVRfTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyBnZXRNZXRob2QgIT0gbnVsbCA6ICFHRVRfTUVUSE9EX0VERUZBVUxULmVxdWFscyhnZXRNZXRob2QpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19TRVRfTUVUSE9EOgotCQkJCXJldHVybiBTRVRfTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyBzZXRNZXRob2QgIT0gbnVsbCA6ICFTRVRfTUVUSE9EX0VERUZBVUxULmVxdWFscyhzZXRNZXRob2QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChnZXRNZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdldE1ldGhvZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2V0TWV0aG9kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzZXRNZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLAotCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRHZXRNZXRob2RUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNldE1ldGhvZFRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkR2V0TWV0aG9kVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9ELCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNfR2V0TWV0aG9kKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNldE1ldGhvZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzX1NldE1ldGhvZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLX0gLy8gWG1sQWNjZXNzTWV0aG9kcwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzY2Q1NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEFjY2VzcyBNZXRob2RzIEhvbGRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlciNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlciNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSk7Ci0KLX0gLy8gWG1sQWNjZXNzTWV0aG9kc0hvbGRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3NjdhYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEF0dHJpYnV0ZU1hcHBpbmcgCi0JZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZywgCi0JCQlYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLCBYbWxQcm9wZXJ0eUNvbnRhaW5lcgotewotfSAvLyBYbWxBdHRyaWJ1dGVNYXBwaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YjIyMzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sQmFzaWNfMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEJhc2ljPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhc2ljKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEJhc2ljIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljIGltcGxlbWVudHMgWG1sQmFzaWNfMl8xLCBYbWxBdHRyaWJ1dGVNYXBwaW5nLCBYbWxNdXRhYmxlLCBYbWxDb252ZXJ0aWJsZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3I7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFibGVHZW5lcmF0b3IoKSA8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdlbmVyYXRlZFZhbHVlKCkgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R2VuZXJhdGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldHVybkluc2VydCgpIDxlbT5SZXR1cm4gSW5zZXJ0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXR1cm5JbnNlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSZXR1cm5JbnNlcnQgcmV0dXJuSW5zZXJ0OwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXR1cm5VcGRhdGUoKSA8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV0dXJuVXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gUkVUVVJOX1VQREFURV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmV0dXJuVXBkYXRlKCkgPGVtPlJldHVybiBVcGRhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJldHVyblVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gcmV0dXJuVXBkYXRlID0gUkVUVVJOX1VQREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVUeXBlID0gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNdXRhYmxlKCkgPGVtPk11dGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE11dGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBNVVRBQkxFX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNdXRhYmxlKCkgPGVtPk11dGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE11dGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIG11dGFibGUgPSBNVVRBQkxFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcigpIDxlbT5Db252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbnZlcnRlciBjb252ZXJ0ZXI7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUNvbnZlcnRlcigpIDxlbT5UeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFR5cGVDb252ZXJ0ZXIgdHlwZUNvbnZlcnRlcjsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKSA8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU3RydWN0Q29udmVydGVyIHN0cnVjdENvbnZlcnRlcjsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydCgpIDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJUX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0KCkgPGVtPkNvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydCA9IENPTlZFUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQmFzaWMoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9CQVNJQzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NdXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11dGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE11dGFibGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXV0YWJsZV9NdXRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRNdXRhYmxlKCkKLQl7Ci0JCXJldHVybiBtdXRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRNdXRhYmxlIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TXV0YWJsZShCb29sZWFuIG5ld011dGFibGUpCi0JewotCQlCb29sZWFuIG9sZE11dGFibGUgPSBtdXRhYmxlOwotCQltdXRhYmxlID0gbmV3TXV0YWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTVVUQUJMRSwgb2xkTXV0YWJsZSwgbXV0YWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29udmVydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0KCkKLQl7Ci0JCXJldHVybiBjb252ZXJ0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRDb252ZXJ0IDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udmVydChTdHJpbmcgbmV3Q29udmVydCkKLQl7Ci0JCVN0cmluZyBvbGRDb252ZXJ0ID0gY29udmVydDsKLQkJY29udmVydCA9IG5ld0NvbnZlcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlQsIG9sZENvbnZlcnQsIGNvbnZlcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JDb250YWluZXJfU2VxdWVuY2VHZW5lcmF0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFNlcXVlbmNlR2VuZXJhdG9yIGdldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiBzZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvciBuZXdTZXF1ZW5jZUdlbmVyYXRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIG9sZFNlcXVlbmNlR2VuZXJhdG9yID0gc2VxdWVuY2VHZW5lcmF0b3I7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yID0gbmV3U2VxdWVuY2VHZW5lcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUiwgb2xkU2VxdWVuY2VHZW5lcmF0b3IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0U2VxdWVuY2VHZW5lcmF0b3IgPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yIG5ld1NlcXVlbmNlR2VuZXJhdG9yKQotCXsKLQkJaWYgKG5ld1NlcXVlbmNlR2VuZXJhdG9yICE9IHNlcXVlbmNlR2VuZXJhdG9yKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZXF1ZW5jZUdlbmVyYXRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U2VxdWVuY2VHZW5lcmF0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2VxdWVuY2VHZW5lcmF0b3IpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TRVFVRU5DRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U2VxdWVuY2VHZW5lcmF0b3IobmV3U2VxdWVuY2VHZW5lcmF0b3IsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SLCBuZXdTZXF1ZW5jZUdlbmVyYXRvciwgbmV3U2VxdWVuY2VHZW5lcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JDb250YWluZXJfVGFibGVHZW5lcmF0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciBuZXdUYWJsZUdlbmVyYXRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGFibGVHZW5lcmF0b3I7Ci0JCXRhYmxlR2VuZXJhdG9yID0gbmV3VGFibGVHZW5lcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUiwgb2xkVGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0VGFibGVHZW5lcmF0b3IgPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIG5ld1RhYmxlR2VuZXJhdG9yKQotCXsKLQkJaWYgKG5ld1RhYmxlR2VuZXJhdG9yICE9IHRhYmxlR2VuZXJhdG9yKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0YWJsZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YWJsZUdlbmVyYXRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VGFibGVHZW5lcmF0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VGFibGVHZW5lcmF0b3IpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VGFibGVHZW5lcmF0b3IobmV3VGFibGVHZW5lcmF0b3IsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEFCTEVfR0VORVJBVE9SLCBuZXdUYWJsZUdlbmVyYXRvciwgbmV3VGFibGVHZW5lcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpY18xXzFfR2VuZXJhdGVkVmFsdWUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEdlbmVyYXRlZFZhbHVlIGdldEdlbmVyYXRlZFZhbHVlKCkKLQl7Ci0JCXJldHVybiBnZW5lcmF0ZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRHZW5lcmF0ZWRWYWx1ZShYbWxHZW5lcmF0ZWRWYWx1ZSBuZXdHZW5lcmF0ZWRWYWx1ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEdlbmVyYXRlZFZhbHVlIG9sZEdlbmVyYXRlZFZhbHVlID0gZ2VuZXJhdGVkVmFsdWU7Ci0JCWdlbmVyYXRlZFZhbHVlID0gbmV3R2VuZXJhdGVkVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0dFTkVSQVRFRF9WQUxVRSwgb2xkR2VuZXJhdGVkVmFsdWUsIG5ld0dlbmVyYXRlZFZhbHVlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0R2VuZXJhdGVkVmFsdWUgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRHZW5lcmF0ZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlIG5ld0dlbmVyYXRlZFZhbHVlKQotCXsKLQkJaWYgKG5ld0dlbmVyYXRlZFZhbHVlICE9IGdlbmVyYXRlZFZhbHVlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChnZW5lcmF0ZWRWYWx1ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClnZW5lcmF0ZWRWYWx1ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0dFTkVSQVRFRF9WQUxVRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3R2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3R2VuZXJhdGVkVmFsdWUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0R2VuZXJhdGVkVmFsdWUobmV3R2VuZXJhdGVkVmFsdWUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFLCBuZXdHZW5lcmF0ZWRWYWx1ZSwgbmV3R2VuZXJhdGVkVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXR1cm4gSW5zZXJ0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXR1cm4gSW5zZXJ0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybiBJbnNlcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJldHVybkluc2VydChYbWxSZXR1cm5JbnNlcnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhc2ljXzJfMV9SZXR1cm5JbnNlcnQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJldHVybkluc2VydCBnZXRSZXR1cm5JbnNlcnQoKQotCXsKLQkJcmV0dXJuIHJldHVybkluc2VydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZXR1cm5JbnNlcnQoWG1sUmV0dXJuSW5zZXJ0IG5ld1JldHVybkluc2VydCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFJldHVybkluc2VydCBvbGRSZXR1cm5JbnNlcnQgPSByZXR1cm5JbnNlcnQ7Ci0JCXJldHVybkluc2VydCA9IG5ld1JldHVybkluc2VydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX0lOU0VSVCwgb2xkUmV0dXJuSW5zZXJ0LCBuZXdSZXR1cm5JbnNlcnQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRSZXR1cm5JbnNlcnQgPGVtPlJldHVybiBJbnNlcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybiBJbnNlcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJldHVybkluc2VydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJldHVybkluc2VydChYbWxSZXR1cm5JbnNlcnQgbmV3UmV0dXJuSW5zZXJ0KQotCXsKLQkJaWYgKG5ld1JldHVybkluc2VydCAhPSByZXR1cm5JbnNlcnQpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJldHVybkluc2VydCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXR1cm5JbnNlcnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19SRVRVUk5fSU5TRVJULCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSZXR1cm5JbnNlcnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmV0dXJuSW5zZXJ0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX0lOU0VSVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZXR1cm5JbnNlcnQobmV3UmV0dXJuSW5zZXJ0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9JTlNFUlQsIG5ld1JldHVybkluc2VydCwgbmV3UmV0dXJuSW5zZXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV0dXJuIFVwZGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXR1cm4gVXBkYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXR1cm5VcGRhdGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNfMl8xX1JldHVyblVwZGF0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0UmV0dXJuVXBkYXRlKCkKLQl7Ci0JCXJldHVybiByZXR1cm5VcGRhdGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldFJldHVyblVwZGF0ZSA8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmV0dXJuVXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmV0dXJuVXBkYXRlKEJvb2xlYW4gbmV3UmV0dXJuVXBkYXRlKQotCXsKLQkJQm9vbGVhbiBvbGRSZXR1cm5VcGRhdGUgPSByZXR1cm5VcGRhdGU7Ci0JCXJldHVyblVwZGF0ZSA9IG5ld1JldHVyblVwZGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX1VQREFURSwgb2xkUmV0dXJuVXBkYXRlLCByZXR1cm5VcGRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpY18yXzFfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BVFRSSUJVVEVfVFlQRSwgb2xkQXR0cmlidXRlVHlwZSwgYXR0cmlidXRlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9Db252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIGNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyIG5ld0NvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENvbnZlcnRlciBvbGRDb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCWNvbnZlcnRlciA9IG5ld0NvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVEVSLCBvbGRDb252ZXJ0ZXIsIG5ld0NvbnZlcnRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldENvbnZlcnRlciA8ZW0+Q29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgbmV3Q29udmVydGVyKQotCXsKLQkJaWYgKG5ld0NvbnZlcnRlciAhPSBjb252ZXJ0ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udmVydGVyKG5ld0NvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVIsIG5ld0NvbnZlcnRlciwgbmV3Q29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ3VzdG9tQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9UeXBlQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUeXBlQ29udmVydGVyIGdldFR5cGVDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyIG5ld1R5cGVDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxUeXBlQ29udmVydGVyIG9sZFR5cGVDb252ZXJ0ZXIgPSB0eXBlQ29udmVydGVyOwotCQl0eXBlQ29udmVydGVyID0gbmV3VHlwZUNvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVIsIG9sZFR5cGVDb252ZXJ0ZXIsIG5ld1R5cGVDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRUeXBlQ29udmVydGVyIDxlbT5UeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgbmV3VHlwZUNvbnZlcnRlcikKLQl7Ci0JCWlmIChuZXdUeXBlQ29udmVydGVyICE9IHR5cGVDb252ZXJ0ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdHlwZUNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUeXBlQ29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1R5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUeXBlQ29udmVydGVyKG5ld1R5cGVDb252ZXJ0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVIsIG5ld1R5cGVDb252ZXJ0ZXIsIG5ld1R5cGVDb252ZXJ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIEN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgbmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgb2xkT2JqZWN0VHlwZUNvbnZlcnRlciA9IG9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JCW9iamVjdFR5cGVDb252ZXJ0ZXIgPSBuZXdPYmplY3RUeXBlQ29udmVydGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG9sZE9iamVjdFR5cGVDb252ZXJ0ZXIsIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRPYmplY3RUeXBlQ29udmVydGVyIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBuZXdPYmplY3RUeXBlQ29udmVydGVyKQotCXsKLQkJaWYgKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIgIT0gb2JqZWN0VHlwZUNvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAob2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvYmplY3RUeXBlQ29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdPYmplY3RUeXBlQ29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld09iamVjdFR5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihuZXdPYmplY3RUeXBlQ29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDdXN0b21Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX1N0cnVjdENvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sU3RydWN0Q29udmVydGVyIGdldFN0cnVjdENvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gc3RydWN0Q29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgbmV3U3RydWN0Q29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sU3RydWN0Q29udmVydGVyIG9sZFN0cnVjdENvbnZlcnRlciA9IHN0cnVjdENvbnZlcnRlcjsKLQkJc3RydWN0Q29udmVydGVyID0gbmV3U3RydWN0Q29udmVydGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TVFJVQ1RfQ09OVkVSVEVSLCBvbGRTdHJ1Y3RDb252ZXJ0ZXIsIG5ld1N0cnVjdENvbnZlcnRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldFN0cnVjdENvbnZlcnRlciA8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciBuZXdTdHJ1Y3RDb252ZXJ0ZXIpCi0JewotCQlpZiAobmV3U3RydWN0Q29udmVydGVyICE9IHN0cnVjdENvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc3RydWN0Q29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXN0cnVjdENvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1N0cnVjdENvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTdHJ1Y3RDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TVFJVQ1RfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFN0cnVjdENvbnZlcnRlcihuZXdTdHJ1Y3RDb252ZXJ0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU1RSVUNUX0NPTlZFUlRFUiwgbmV3U3RydWN0Q29udmVydGVyLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXJldHVybiBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VGFibGVHZW5lcmF0b3IobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0dFTkVSQVRFRF9WQUxVRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRHZW5lcmF0ZWRWYWx1ZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX0lOU0VSVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSZXR1cm5JbnNlcnQobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldENvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VHlwZUNvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldE9iamVjdFR5cGVDb252ZXJ0ZXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXJldHVybiBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0dFTkVSQVRFRF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX0lOU0VSVDoKLQkJCQlyZXR1cm4gZ2V0UmV0dXJuSW5zZXJ0KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9VUERBVEU6Ci0JCQkJcmV0dXJuIGdldFJldHVyblVwZGF0ZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX01VVEFCTEU6Ci0JCQkJcmV0dXJuIGdldE11dGFibGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGdldFR5cGVDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGdldFN0cnVjdENvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJUOgotCQkJCXJldHVybiBnZXRDb252ZXJ0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoKFhtbFNlcXVlbmNlR2VuZXJhdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcigoWG1sVGFibGVHZW5lcmF0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFOgotCQkJCXNldEdlbmVyYXRlZFZhbHVlKChYbWxHZW5lcmF0ZWRWYWx1ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19SRVRVUk5fSU5TRVJUOgotCQkJCXNldFJldHVybkluc2VydCgoWG1sUmV0dXJuSW5zZXJ0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9VUERBVEU6Ci0JCQkJc2V0UmV0dXJuVXBkYXRlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX01VVEFCTEU6Ci0JCQkJc2V0TXV0YWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVI6Ci0JCQkJc2V0Q29udmVydGVyKChYbWxDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0VHlwZUNvbnZlcnRlcigoWG1sVHlwZUNvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0T2JqZWN0VHlwZUNvbnZlcnRlcigoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXNldFN0cnVjdENvbnZlcnRlcigoWG1sU3RydWN0Q29udmVydGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlQ6Ci0JCQkJc2V0Q29udmVydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcigoWG1sU2VxdWVuY2VHZW5lcmF0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJc2V0VGFibGVHZW5lcmF0b3IoKFhtbFRhYmxlR2VuZXJhdG9yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFOgotCQkJCXNldEdlbmVyYXRlZFZhbHVlKChYbWxHZW5lcmF0ZWRWYWx1ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9JTlNFUlQ6Ci0JCQkJc2V0UmV0dXJuSW5zZXJ0KChYbWxSZXR1cm5JbnNlcnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19SRVRVUk5fVVBEQVRFOgotCQkJCXNldFJldHVyblVwZGF0ZShSRVRVUk5fVVBEQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoQVRUUklCVVRFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19NVVRBQkxFOgotCQkJCXNldE11dGFibGUoTVVUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVI6Ci0JCQkJc2V0Q29udmVydGVyKChYbWxDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UWVBFX0NPTlZFUlRFUjoKLQkJCQlzZXRUeXBlQ29udmVydGVyKChYbWxUeXBlQ29udmVydGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldE9iamVjdFR5cGVDb252ZXJ0ZXIoKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXNldFN0cnVjdENvbnZlcnRlcigoWG1sU3RydWN0Q29udmVydGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVDoKLQkJCQlzZXRDb252ZXJ0KENPTlZFUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3IgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEFCTEVfR0VORVJBVE9SOgotCQkJCXJldHVybiB0YWJsZUdlbmVyYXRvciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUU6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlZFZhbHVlICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9JTlNFUlQ6Ci0JCQkJcmV0dXJuIHJldHVybkluc2VydCAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19SRVRVUk5fVVBEQVRFOgotCQkJCXJldHVybiBSRVRVUk5fVVBEQVRFX0VERUZBVUxUID09IG51bGwgPyByZXR1cm5VcGRhdGUgIT0gbnVsbCA6ICFSRVRVUk5fVVBEQVRFX0VERUZBVUxULmVxdWFscyhyZXR1cm5VcGRhdGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX01VVEFCTEU6Ci0JCQkJcmV0dXJuIE1VVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IG11dGFibGUgIT0gbnVsbCA6ICFNVVRBQkxFX0VERUZBVUxULmVxdWFscyhtdXRhYmxlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVEVSOgotCQkJCXJldHVybiBjb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJUOgotCQkJCXJldHVybiBDT05WRVJUX0VERUZBVUxUID09IG51bGwgPyBjb252ZXJ0ICE9IG51bGwgOiAhQ09OVkVSVF9FREVGQVVMVC5lcXVhbHMoY29udmVydCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEdlbmVyYXRvckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fU0VRVUVOQ0VfR0VORVJBVE9SOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEFCTEVfR0VORVJBVE9SOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fVEFCTEVfR0VORVJBVE9SOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhc2ljXzFfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5YTUxfQkFTSUNfMTFfX0dFTkVSQVRFRF9WQUxVRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXNpY18yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9JTlNFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9CQVNJQ18yMV9fUkVUVVJOX0lOU0VSVDsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9VUERBVEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9CQVNJQ18yMV9fUkVUVVJOX1VQREFURTsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfQkFTSUNfMjFfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE11dGFibGUuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX01VVEFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VVEFCTEVfX01VVEFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxHZW5lcmF0b3JDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1NFUVVFTkNFX0dFTkVSQVRPUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUjsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1RBQkxFX0dFTkVSQVRPUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXNpY18xXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuWE1MX0JBU0lDXzExX19HRU5FUkFURURfVkFMVUU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmFzaWNfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9CQVNJQ18yMV9fUkVUVVJOX0lOU0VSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9JTlNFUlQ7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9CQVNJQ18yMV9fUkVUVVJOX1VQREFURTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9VUERBVEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9CQVNJQ18yMV9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNdXRhYmxlLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VVEFCTEVfX01VVEFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19NVVRBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVI7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVI7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVI7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJUOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmV0dXJuVXBkYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXR1cm5VcGRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG11dGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG11dGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnZlcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnZlcnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE11dGFibGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2ljKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcHRpb25hbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNdXRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb2x1bW5UcmFuc2xhdG9yKCksIAotCQkJYnVpbGRHZW5lcmF0ZWRWYWx1ZVRyYW5zbGF0b3IoKSwgCi0JCQlidWlsZExvYlRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGVtcG9yYWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZEVudW1lcmF0ZWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbnZlcnRUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRSZXR1cm5JbnNlcnRUcmFuc2xhdG9yKCksCi0JCQlidWlsZFJldHVyblVwZGF0ZVRyYW5zbGF0b3IoKX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE11dGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTVVUQUJMRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNdXRhYmxlX011dGFibGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sR2VuZXJhdGVkVmFsdWUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMV8xLkdFTkVSQVRFRF9WQUxVRSwgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfMV8xX0dlbmVyYXRlZFZhbHVlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9UeXBlQ29udmVydGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFN0cnVjdENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkpOwotCX0KLQkJCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVGFibGVHZW5lcmF0b3IuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMV8xLlRBQkxFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1RhYmxlR2VuZXJhdG9yKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxTZXF1ZW5jZUdlbmVyYXRvci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsxXzEuU0VRVUVOQ0VfR0VORVJBVE9SLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JDb250YWluZXJfU2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmV0dXJuSW5zZXJ0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFJldHVybkluc2VydC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuUkVUVVJOX0lOU0VSVCwgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfMl8xX1JldHVybkluc2VydCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmV0dXJuVXBkYXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLlJFVFVSTl9VUERBVEUsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2ljXzJfMV9SZXR1cm5VcGRhdGUoKSk7CQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEF0dHJpYnV0ZVR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQVRUUklCVVRFX1RZUEUsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2ljXzJfMV9BdHRyaWJ1dGVUeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljQ29sbGVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpY0NvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyZmJmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmFzaWMgQ29sbGVjdGlvbiBJbXBsPC9iPjwvZW0+Jy4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4gKgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNDb2xsZWN0aW9uKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEJhc2ljQ29sbGVjdGlvbiBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxCYXNpY0NvbGxlY3Rpb24oKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9CQVNJQ19DT0xMRUNUSU9OOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbiNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpY01hcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpY01hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2JkNmJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzaWNNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEJhc2ljIE1hcCBJbXBsPC9iPjwvZW0+Jy4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4gKgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNNYXAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQmFzaWNNYXAgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQmFzaWNNYXAoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9CQVNJQ19NQVA7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcCNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhdGNoRmV0Y2guamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmF0Y2hGZXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjk3NmMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmF0Y2hGZXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhdGNoRmV0Y2hfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtIEJhdGNoIEZldGNoPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxCYXRjaEZldGNoIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sQmF0Y2hGZXRjaF8yXzEKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2l6ZSgpIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgU0laRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaXplKCkgPGVtPlNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIHNpemUgPSBTSVpFX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmF0Y2hGZXRjaFR5cGVfMl8xIEJBVENIX0ZFVENIX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmF0Y2hGZXRjaFR5cGUoKSA8ZW0+QmF0Y2ggRmV0Y2ggVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmF0Y2hGZXRjaFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCYXRjaEZldGNoVHlwZV8yXzEgYmF0Y2hGZXRjaFR5cGUgPSBCQVRDSF9GRVRDSF9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEJhdGNoRmV0Y2goKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9CQVRDSF9GRVRDSDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNpemUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaF8yXzFfU2l6ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRTaXplKCkKLQl7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoI2dldFNpemUgPGVtPlNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXplKEludGVnZXIgbmV3U2l6ZSkKLQl7Ci0JCUludGVnZXIgb2xkU2l6ZSA9IHNpemU7Ci0JCXNpemUgPSBuZXdTaXplOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX19TSVpFLCBvbGRTaXplLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2ggVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaCBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQmF0Y2hGZXRjaFR5cGVfMl8xCi0JICogQHNlZSAjc2V0QmF0Y2hGZXRjaFR5cGUoQmF0Y2hGZXRjaFR5cGVfMl8xKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoXzJfMV9CYXRjaEZldGNoVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCYXRjaEZldGNoVHlwZV8yXzEgZ2V0QmF0Y2hGZXRjaFR5cGUoKQotCXsKLQkJcmV0dXJuIGJhdGNoRmV0Y2hUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoI2dldEJhdGNoRmV0Y2hUeXBlIDxlbT5CYXRjaCBGZXRjaCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMQotCSAqIEBzZWUgI2dldEJhdGNoRmV0Y2hUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmF0Y2hGZXRjaFR5cGUoQmF0Y2hGZXRjaFR5cGVfMl8xIG5ld0JhdGNoRmV0Y2hUeXBlKQotCXsKLQkJQmF0Y2hGZXRjaFR5cGVfMl8xIG9sZEJhdGNoRmV0Y2hUeXBlID0gYmF0Y2hGZXRjaFR5cGU7Ci0JCWJhdGNoRmV0Y2hUeXBlID0gbmV3QmF0Y2hGZXRjaFR5cGUgPT0gbnVsbCA/IEJBVENIX0ZFVENIX1RZUEVfRURFRkFVTFQgOiBuZXdCYXRjaEZldGNoVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9fQkFUQ0hfRkVUQ0hfVFlQRSwgb2xkQmF0Y2hGZXRjaFR5cGUsIGJhdGNoRmV0Y2hUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfX1NJWkU6Ci0JCQkJcmV0dXJuIGdldFNpemUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9fQkFUQ0hfRkVUQ0hfVFlQRToKLQkJCQlyZXR1cm4gZ2V0QmF0Y2hGZXRjaFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfX1NJWkU6Ci0JCQkJc2V0U2l6ZSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX19CQVRDSF9GRVRDSF9UWVBFOgotCQkJCXNldEJhdGNoRmV0Y2hUeXBlKChCYXRjaEZldGNoVHlwZV8yXzEpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9fU0laRToKLQkJCQlzZXRTaXplKFNJWkVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9fQkFUQ0hfRkVUQ0hfVFlQRToKLQkJCQlzZXRCYXRjaEZldGNoVHlwZShCQVRDSF9GRVRDSF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX19TSVpFOgotCQkJCXJldHVybiBTSVpFX0VERUZBVUxUID09IG51bGwgPyBzaXplICE9IG51bGwgOiAhU0laRV9FREVGQVVMVC5lcXVhbHMoc2l6ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfX0JBVENIX0ZFVENIX1RZUEU6Ci0JCQkJcmV0dXJuIGJhdGNoRmV0Y2hUeXBlICE9IEJBVENIX0ZFVENIX1RZUEVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNpemU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNpemUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJhdGNoRmV0Y2hUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChiYXRjaEZldGNoVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkU2l6ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQmF0Y2hGZXRjaFR5cGVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNpemVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQkFUQ0hfRkVUQ0hfX1NJWkUsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhdGNoRmV0Y2hfMl8xX1NpemUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQmF0Y2hGZXRjaFR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQkFUQ0hfRkVUQ0hfX1RZUEUsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhdGNoRmV0Y2hfMl8xX0JhdGNoRmV0Y2hUeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi19IC8vIFhtQmF0Y2hGZXRjaApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXRjaEZldGNoSG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhdGNoRmV0Y2hIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI4YjBhOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhdGNoRmV0Y2hIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBCYXRjaCBGZXRjaCBIb2xkZXI8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2hIb2xkZXIjZ2V0QmF0Y2hGZXRjaCA8ZW0+QmF0Y2ggRmV0Y2g8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQmF0Y2hGZXRjaEhvbGRlciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEJhdGNoRmV0Y2goWG1sQmF0Y2hGZXRjaCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcl9CYXRjaEZldGNoKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbEJhdGNoRmV0Y2ggZ2V0QmF0Y2hGZXRjaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2hIb2xkZXIjZ2V0QmF0Y2hGZXRjaCA8ZW0+QmF0Y2ggRmV0Y2g8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2ggdmFsdWUpOwotCi19IC8vIFhtbEJhdGNoRmV0Y2hIb2xkZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2FjaGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4NzYwZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDYWNoZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEV4cGlyeSA8ZW0+RXhwaXJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFNoYXJlZCA8ZW0+U2hhcmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEFsd2F5c1JlZnJlc2ggPGVtPkFsd2F5cyBSZWZyZXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0UmVmcmVzaE9ubHlJZk5ld2VyIDxlbT5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXREaXNhYmxlSGl0cyA8ZW0+RGlzYWJsZSBIaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0Q29vcmRpbmF0aW9uVHlwZSA8ZW0+Q29vcmRpbmF0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRFeHBpcnlUaW1lT2ZEYXkgPGVtPkV4cGlyeSBUaW1lIE9mIERheTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxDYWNoZSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhwaXJ5KCkgPGVtPkV4cGlyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhwaXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgRVhQSVJZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4cGlyeSgpIDxlbT5FeHBpcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4cGlyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgZXhwaXJ5ID0gRVhQSVJZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpemUoKSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFNJWkVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2l6ZSgpIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBzaXplID0gU0laRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaGFyZWQoKSA8ZW0+U2hhcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaGFyZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBTSEFSRURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2hhcmVkKCkgPGVtPlNoYXJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2hhcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBzaGFyZWQgPSBTSEFSRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDYWNoZVR5cGUgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx3YXlzUmVmcmVzaCgpIDxlbT5BbHdheXMgUmVmcmVzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWx3YXlzUmVmcmVzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIEFMV0FZU19SRUZSRVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsd2F5c1JlZnJlc2goKSA8ZW0+QWx3YXlzIFJlZnJlc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsd2F5c1JlZnJlc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGFsd2F5c1JlZnJlc2ggPSBBTFdBWVNfUkVGUkVTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZyZXNoT25seUlmTmV3ZXIoKSA8ZW0+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZyZXNoT25seUlmTmV3ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBSRUZSRVNIX09OTFlfSUZfTkVXRVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkgPGVtPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIgPSBSRUZSRVNIX09OTFlfSUZfTkVXRVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzYWJsZUhpdHMoKSA8ZW0+RGlzYWJsZSBIaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNhYmxlSGl0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIERJU0FCTEVfSElUU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNhYmxlSGl0cygpIDxlbT5EaXNhYmxlIEhpdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc2FibGVIaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBkaXNhYmxlSGl0cyA9IERJU0FCTEVfSElUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBDT09SRElOQVRJT05fVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb29yZGluYXRpb25UeXBlKCkgPGVtPkNvb3JkaW5hdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb29yZGluYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGUgPSBDT09SRElOQVRJT05fVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4cGlyeVRpbWVPZkRheSgpIDxlbT5FeHBpcnkgVGltZSBPZiBEYXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4cGlyeVRpbWVPZkRheSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFRpbWVPZkRheSBleHBpcnlUaW1lT2ZEYXk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2FjaGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9DQUNIRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHBpcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4cGlyeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHBpcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4cGlyeShJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZV9FeHBpcnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0RXhwaXJ5KCkKLQl7Ci0JCXJldHVybiBleHBpcnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEV4cGlyeSA8ZW0+RXhwaXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHBpcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4cGlyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGlyeShJbnRlZ2VyIG5ld0V4cGlyeSkKLQl7Ci0JCUludGVnZXIgb2xkRXhwaXJ5ID0gZXhwaXJ5OwotCQlleHBpcnkgPSBuZXdFeHBpcnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWSwgb2xkRXhwaXJ5LCBleHBpcnkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNpemUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVfU2l6ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRTaXplKCkKLQl7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRTaXplIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZShJbnRlZ2VyIG5ld1NpemUpCi0JewotCQlJbnRlZ2VyIG9sZFNpemUgPSBzaXplOwotCQlzaXplID0gbmV3U2l6ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fU0laRSwgb2xkU2l6ZSwgc2l6ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNoYXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2hhcmVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNoYXJlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2hhcmVkKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlX1NoYXJlZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0U2hhcmVkKCkKLQl7Ci0JCXJldHVybiBzaGFyZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFNoYXJlZCA8ZW0+U2hhcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaGFyZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNoYXJlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNoYXJlZChCb29sZWFuIG5ld1NoYXJlZCkKLQl7Ci0JCUJvb2xlYW4gb2xkU2hhcmVkID0gc2hhcmVkOwotCQlzaGFyZWQgPSBuZXdTaGFyZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1NIQVJFRCwgb2xkU2hhcmVkLCBzaGFyZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZQotCSAqIEBzZWUgI3NldFR5cGUoQ2FjaGVUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZV9UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhY2hlVHlwZSBnZXRUeXBlKCkKLQl7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShDYWNoZVR5cGUgbmV3VHlwZSkKLQl7Ci0JCUNhY2hlVHlwZSBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGUgPT0gbnVsbCA/IFRZUEVfRURFRkFVTFQgOiBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWx3YXlzIFJlZnJlc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFsd2F5cyBSZWZyZXNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsd2F5cyBSZWZyZXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlX0Fsd2F5c1JlZnJlc2goKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldEFsd2F5c1JlZnJlc2goKQotCXsKLQkJcmV0dXJuIGFsd2F5c1JlZnJlc2g7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEFsd2F5c1JlZnJlc2ggPGVtPkFsd2F5cyBSZWZyZXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbHdheXMgUmVmcmVzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWx3YXlzUmVmcmVzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsd2F5c1JlZnJlc2goQm9vbGVhbiBuZXdBbHdheXNSZWZyZXNoKQotCXsKLQkJQm9vbGVhbiBvbGRBbHdheXNSZWZyZXNoID0gYWx3YXlzUmVmcmVzaDsKLQkJYWx3YXlzUmVmcmVzaCA9IG5ld0Fsd2F5c1JlZnJlc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0FMV0FZU19SRUZSRVNILCBvbGRBbHdheXNSZWZyZXNoLCBhbHdheXNSZWZyZXNoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVfUmVmcmVzaE9ubHlJZk5ld2VyKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRSZWZyZXNoT25seUlmTmV3ZXIoKQotCXsKLQkJcmV0dXJuIHJlZnJlc2hPbmx5SWZOZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0UmVmcmVzaE9ubHlJZk5ld2VyIDxlbT5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4gbmV3UmVmcmVzaE9ubHlJZk5ld2VyKQotCXsKLQkJQm9vbGVhbiBvbGRSZWZyZXNoT25seUlmTmV3ZXIgPSByZWZyZXNoT25seUlmTmV3ZXI7Ci0JCXJlZnJlc2hPbmx5SWZOZXdlciA9IG5ld1JlZnJlc2hPbmx5SWZOZXdlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSLCBvbGRSZWZyZXNoT25seUlmTmV3ZXIsIHJlZnJlc2hPbmx5SWZOZXdlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc2FibGUgSGl0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzYWJsZSBIaXRzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc2FibGUgSGl0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGlzYWJsZUhpdHMoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVfRGlzYWJsZUhpdHMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldERpc2FibGVIaXRzKCkKLQl7Ci0JCXJldHVybiBkaXNhYmxlSGl0czsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0RGlzYWJsZUhpdHMgPGVtPkRpc2FibGUgSGl0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzYWJsZSBIaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREaXNhYmxlSGl0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2FibGVIaXRzKEJvb2xlYW4gbmV3RGlzYWJsZUhpdHMpCi0JewotCQlCb29sZWFuIG9sZERpc2FibGVIaXRzID0gZGlzYWJsZUhpdHM7Ci0JCWRpc2FibGVIaXRzID0gbmV3RGlzYWJsZUhpdHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0RJU0FCTEVfSElUUywgb2xkRGlzYWJsZUhpdHMsIGRpc2FibGVIaXRzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29vcmRpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db29yZGluYXRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db29yZGluYXRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlCi0JICogQHNlZSAjc2V0Q29vcmRpbmF0aW9uVHlwZShDYWNoZUNvb3JkaW5hdGlvblR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlX0Nvb3JkaW5hdGlvblR5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0Q29vcmRpbmF0aW9uVHlwZSgpCi0JewotCQlyZXR1cm4gY29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0Q29vcmRpbmF0aW9uVHlwZSA8ZW0+Q29vcmRpbmF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvb3JkaW5hdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUKLQkgKiBAc2VlICNnZXRDb29yZGluYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29vcmRpbmF0aW9uVHlwZShDYWNoZUNvb3JkaW5hdGlvblR5cGUgbmV3Q29vcmRpbmF0aW9uVHlwZSkKLQl7Ci0JCUNhY2hlQ29vcmRpbmF0aW9uVHlwZSBvbGRDb29yZGluYXRpb25UeXBlID0gY29vcmRpbmF0aW9uVHlwZTsKLQkJY29vcmRpbmF0aW9uVHlwZSA9IG5ld0Nvb3JkaW5hdGlvblR5cGUgPT0gbnVsbCA/IENPT1JESU5BVElPTl9UWVBFX0VERUZBVUxUIDogbmV3Q29vcmRpbmF0aW9uVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEUsIG9sZENvb3JkaW5hdGlvblR5cGUsIGNvb3JkaW5hdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHBpcnkgVGltZSBPZiBEYXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4cGlyeSBUaW1lIE9mIERheTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHBpcnkgVGltZSBPZiBEYXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEV4cGlyeVRpbWVPZkRheShYbWxUaW1lT2ZEYXkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlX0V4cGlyeVRpbWVPZkRheSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVGltZU9mRGF5IGdldEV4cGlyeVRpbWVPZkRheSgpCi0JewotCQlyZXR1cm4gZXhwaXJ5VGltZU9mRGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEV4cGlyeVRpbWVPZkRheShYbWxUaW1lT2ZEYXkgbmV3RXhwaXJ5VGltZU9mRGF5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVGltZU9mRGF5IG9sZEV4cGlyeVRpbWVPZkRheSA9IGV4cGlyeVRpbWVPZkRheTsKLQkJZXhwaXJ5VGltZU9mRGF5ID0gbmV3RXhwaXJ5VGltZU9mRGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVksIG9sZEV4cGlyeVRpbWVPZkRheSwgbmV3RXhwaXJ5VGltZU9mRGF5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0RXhwaXJ5VGltZU9mRGF5IDxlbT5FeHBpcnkgVGltZSBPZiBEYXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cGlyeSBUaW1lIE9mIERheTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RXhwaXJ5VGltZU9mRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwaXJ5VGltZU9mRGF5KFhtbFRpbWVPZkRheSBuZXdFeHBpcnlUaW1lT2ZEYXkpCi0JewotCQlpZiAobmV3RXhwaXJ5VGltZU9mRGF5ICE9IGV4cGlyeVRpbWVPZkRheSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWV4cGlyeVRpbWVPZkRheSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0V4cGlyeVRpbWVPZkRheSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFeHBpcnlUaW1lT2ZEYXkobmV3RXhwaXJ5VGltZU9mRGF5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSwgbmV3RXhwaXJ5VGltZU9mRGF5LCBuZXdFeHBpcnlUaW1lT2ZEYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZOgotCQkJCXJldHVybiBiYXNpY1NldEV4cGlyeVRpbWVPZkRheShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWToKLQkJCQlyZXR1cm4gZ2V0RXhwaXJ5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1NJWkU6Ci0JCQkJcmV0dXJuIGdldFNpemUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fU0hBUkVEOgotCQkJCXJldHVybiBnZXRTaGFyZWQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19BTFdBWVNfUkVGUkVTSDoKLQkJCQlyZXR1cm4gZ2V0QWx3YXlzUmVmcmVzaCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVI6Ci0JCQkJcmV0dXJuIGdldFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19ESVNBQkxFX0hJVFM6Ci0JCQkJcmV0dXJuIGdldERpc2FibGVIaXRzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFOgotCQkJCXJldHVybiBnZXRDb29yZGluYXRpb25UeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWToKLQkJCQlyZXR1cm4gZ2V0RXhwaXJ5VGltZU9mRGF5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUlk6Ci0JCQkJc2V0RXhwaXJ5KChJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1NJWkU6Ci0JCQkJc2V0U2l6ZSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSEFSRUQ6Ci0JCQkJc2V0U2hhcmVkKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQ2FjaGVUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0FMV0FZU19SRUZSRVNIOgotCQkJCXNldEFsd2F5c1JlZnJlc2goKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSOgotCQkJCXNldFJlZnJlc2hPbmx5SWZOZXdlcigoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19ESVNBQkxFX0hJVFM6Ci0JCQkJc2V0RGlzYWJsZUhpdHMoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEU6Ci0JCQkJc2V0Q29vcmRpbmF0aW9uVHlwZSgoQ2FjaGVDb29yZGluYXRpb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWToKLQkJCQlzZXRFeHBpcnlUaW1lT2ZEYXkoKFhtbFRpbWVPZkRheSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUlk6Ci0JCQkJc2V0RXhwaXJ5KEVYUElSWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSVpFOgotCQkJCXNldFNpemUoU0laRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSEFSRUQ6Ci0JCQkJc2V0U2hhcmVkKFNIQVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19BTFdBWVNfUkVGUkVTSDoKLQkJCQlzZXRBbHdheXNSZWZyZXNoKEFMV0FZU19SRUZSRVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUjoKLQkJCQlzZXRSZWZyZXNoT25seUlmTmV3ZXIoUkVGUkVTSF9PTkxZX0lGX05FV0VSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0RJU0FCTEVfSElUUzoKLQkJCQlzZXREaXNhYmxlSGl0cyhESVNBQkxFX0hJVFNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEU6Ci0JCQkJc2V0Q29vcmRpbmF0aW9uVHlwZShDT09SRElOQVRJT05fVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVk6Ci0JCQkJc2V0RXhwaXJ5VGltZU9mRGF5KChYbWxUaW1lT2ZEYXkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRVhQSVJZOgotCQkJCXJldHVybiBFWFBJUllfRURFRkFVTFQgPT0gbnVsbCA/IGV4cGlyeSAhPSBudWxsIDogIUVYUElSWV9FREVGQVVMVC5lcXVhbHMoZXhwaXJ5KTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fU0laRToKLQkJCQlyZXR1cm4gU0laRV9FREVGQVVMVCA9PSBudWxsID8gc2l6ZSAhPSBudWxsIDogIVNJWkVfRURFRkFVTFQuZXF1YWxzKHNpemUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSEFSRUQ6Ci0JCQkJcmV0dXJuIFNIQVJFRF9FREVGQVVMVCA9PSBudWxsID8gc2hhcmVkICE9IG51bGwgOiAhU0hBUkVEX0VERUZBVUxULmVxdWFscyhzaGFyZWQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19UWVBFOgotCQkJCXJldHVybiB0eXBlICE9IFRZUEVfRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0FMV0FZU19SRUZSRVNIOgotCQkJCXJldHVybiBBTFdBWVNfUkVGUkVTSF9FREVGQVVMVCA9PSBudWxsID8gYWx3YXlzUmVmcmVzaCAhPSBudWxsIDogIUFMV0FZU19SRUZSRVNIX0VERUZBVUxULmVxdWFscyhhbHdheXNSZWZyZXNoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSOgotCQkJCXJldHVybiBSRUZSRVNIX09OTFlfSUZfTkVXRVJfRURFRkFVTFQgPT0gbnVsbCA/IHJlZnJlc2hPbmx5SWZOZXdlciAhPSBudWxsIDogIVJFRlJFU0hfT05MWV9JRl9ORVdFUl9FREVGQVVMVC5lcXVhbHMocmVmcmVzaE9ubHlJZk5ld2VyKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRElTQUJMRV9ISVRTOgotCQkJCXJldHVybiBESVNBQkxFX0hJVFNfRURFRkFVTFQgPT0gbnVsbCA/IGRpc2FibGVIaXRzICE9IG51bGwgOiAhRElTQUJMRV9ISVRTX0VERUZBVUxULmVxdWFscyhkaXNhYmxlSGl0cyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFOgotCQkJCXJldHVybiBjb29yZGluYXRpb25UeXBlICE9IENPT1JESU5BVElPTl9UWVBFX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVk6Ci0JCQkJcmV0dXJuIGV4cGlyeVRpbWVPZkRheSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChleHBpcnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4cGlyeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2l6ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2l6ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2hhcmVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzaGFyZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsd2F5c1JlZnJlc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsd2F5c1JlZnJlc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlZnJlc2hPbmx5SWZOZXdlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVmcmVzaE9ubHlJZk5ld2VyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkaXNhYmxlSGl0czogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGlzYWJsZUhpdHMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvb3JkaW5hdGlvblR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvb3JkaW5hdGlvblR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRFeHBpcnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEV4cGlyeVRpbWVPZkRheVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2l6ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2hhcmVkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBbHdheXNSZWZyZXNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRSZWZyZXNoT25seUlmTmV3ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZERpc2FibGVIaXRzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb29yZGluYXRpb25UeXBlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEV4cGlyeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DQUNIRV9fRVhQSVJZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlX0V4cGlyeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRXhwaXJ5VGltZU9mRGF5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFRpbWVPZkRheS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuRVhQSVJZX1RJTUVfT0ZfREFZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlX0V4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2l6ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DQUNIRV9fU0laRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZV9TaXplKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNoYXJlZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DQUNIRV9fU0hBUkVELCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlX1NoYXJlZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNBQ0hFX19UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlX1R5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWx3YXlzUmVmcmVzaFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DQUNIRV9fQUxXQVlTX1JFRlJFU0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfQWx3YXlzUmVmcmVzaCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSZWZyZXNoT25seUlmTmV3ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZV9SZWZyZXNoT25seUlmTmV3ZXIoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGlzYWJsZUhpdHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0FDSEVfX0RJU0FCTEVfSElUUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZV9EaXNhYmxlSGl0cygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb29yZGluYXRpb25UeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNBQ0hFX19DT09SRElOQVRJT05fVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZV9Db29yZGluYXRpb25UeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi19IC8vIFhtbENhY2hlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENhY2hlSG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENhY2hlSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzM2QyNWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDYWNoZUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ2FjaGUgSG9sZGVyPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyI2dldENhY2hlIDxlbT5DYWNoZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyI2dldEV4aXN0ZW5jZUNoZWNraW5nIDxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVIb2xkZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbENhY2hlSG9sZGVyIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYWNoZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2FjaGUoWG1sQ2FjaGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyX0NhY2hlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbENhY2hlIGdldENhY2hlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIjZ2V0Q2FjaGUgPGVtPkNhY2hlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhY2hlKFhtbENhY2hlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBDaGVja2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCi0JICogQHNlZSAjc2V0RXhpc3RlbmNlQ2hlY2tpbmcoRXhpc3RlbmNlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVIb2xkZXJfRXhpc3RlbmNlQ2hlY2tpbmcoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4aXN0ZW5jZVR5cGUgZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlciNnZXRFeGlzdGVuY2VDaGVja2luZyA8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUKLQkgKiBAc2VlICNnZXRFeGlzdGVuY2VDaGVja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXhpc3RlbmNlQ2hlY2tpbmcoRXhpc3RlbmNlVHlwZSB2YWx1ZSk7Ci0KLX0gLy8gWG1sQ2FjaGVIb2xkZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2hhbmdlVHJhY2tpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2hhbmdlVHJhY2tpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzMGJlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENoYW5nZVRyYWNraW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ2hhbmdlIFRyYWNraW5nPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQ2hhbmdlVHJhY2tpbmcgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENoYW5nZVRyYWNraW5nKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQ0hBTkdFX1RSQUNLSU5HOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlCi0JICogQHNlZSAjc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nX1R5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIGdldFR5cGUoKQotCXsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZSBuZXdUeXBlKQotCXsKLQkJWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZSA9PSBudWxsID8gVFlQRV9FREVGQVVMVCA6IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19fVFlQRToKLQkJCQlzZXRUeXBlKChYbWxDaGFuZ2VUcmFja2luZ1R5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19fVFlQRToKLQkJCQlyZXR1cm4gdHlwZSAhPSBUWVBFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkVHlwZVRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdfVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotfSAvLyBYbWxDaGFuZ2VUcmFja2luZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2Y2MGExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ2hhbmdlIFRyYWNraW5nIEhvbGRlcjwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ0hvbGRlciNnZXRDaGFuZ2VUcmFja2luZyA8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcl9DaGFuZ2VUcmFja2luZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyI2dldENoYW5nZVRyYWNraW5nIDxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2hhbmdlVHJhY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nIHZhbHVlKTsKLQotfSAvLyBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDaGFuZ2VUcmFja2luZ1R5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZTFiOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDaGFuZ2VUcmFja2luZ1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmdUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBYbWxDaGFuZ2VUcmFja2luZ1R5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+QVRUUklCVVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FUVFJJQlVURV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUFUVFJJQlVURSgwLCAiQVRUUklCVVRFIiwgIkFUVFJJQlVURSIpLCAvKioKLQkgKiBUaGUgJzxlbT48Yj5PQkpFQ1Q8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjT0JKRUNUX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JT0JKRUNUKDEsICJPQkpFQ1QiLCAiT0JKRUNUIiksIC8qKgotCSAqIFRoZSAnPGVtPjxiPkRFRkVSUkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0RFRkVSUkVEX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JREVGRVJSRUQoMiwgIkRFRkVSUkVEIiwgIkRFRkVSUkVEIiksIC8qKgotCSAqIFRoZSAnPGVtPjxiPkFVVE88L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVVUT19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUFVVE8oMywgIkFVVE8iLCAiQVVUTyIpCi0JOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QVRUUklCVVRFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BVFRSSUJVVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVRUUklCVVRFCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX1ZBTFVFID0gMDsKLQotLyoqCi0JICogVGhlICc8ZW0+PGI+T0JKRUNUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PQkpFQ1Q8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjT0JKRUNUCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1ZBTFVFID0gMTsKLQotLyoqCi0JICogVGhlICc8ZW0+PGI+REVGRVJSRUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRFRkVSUkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0RFRkVSUkVECi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGRVJSRURfVkFMVUUgPSAyOwotCi0vKioKLQkgKiBUaGUgJzxlbT48Yj5BVVRPPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BVVRPPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FVVE8KLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVVRPX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5YbWwgQ2hhbmdlIFRyYWNraW5nIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhtbENoYW5nZVRyYWNraW5nVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBYbWxDaGFuZ2VUcmFja2luZ1R5cGVbXQotCQl7Ci0JCQlBVFRSSUJVVEUsCi0JCQlPQkpFQ1QsCi0JCQlERUZFUlJFRCwKLQkJCUFVVE8sCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIENoYW5nZSBUcmFja2luZyBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8WG1sQ2hhbmdlVHJhY2tpbmdUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbENoYW5nZVRyYWNraW5nVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbENoYW5nZVRyYWNraW5nVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIENoYW5nZSBUcmFja2luZyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIEFUVFJJQlVURV9WQUxVRTogcmV0dXJuIEFUVFJJQlVURTsKLQkJCWNhc2UgT0JKRUNUX1ZBTFVFOiByZXR1cm4gT0JKRUNUOwotCQkJY2FzZSBERUZFUlJFRF9WQUxVRTogcmV0dXJuIERFRkVSUkVEOwotCQkJY2FzZSBBVVRPX1ZBTFVFOiByZXR1cm4gQVVUTzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQotCXsKLQkgIHJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCi0JewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQkKLX0gLy9YbWxDaGFuZ2VUcmFja2luZ1R5cGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2xvbmVDb3B5UG9saWN5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENsb25lQ29weVBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzcyYmJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2xvbmVDb3B5UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5I2dldE1ldGhvZCA8ZW0+TWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5I2dldFdvcmtpbmdDb3B5TWV0aG9kIDxlbT5Xb3JraW5nIENvcHkgTWV0aG9kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENsb25lQ29weVBvbGljeSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxDbG9uZUNvcHlQb2xpY3kgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZCgpIDxlbT5NZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZCgpIDxlbT5NZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtZXRob2QgPSBNRVRIT0RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya2luZ0NvcHlNZXRob2QoKSA8ZW0+V29ya2luZyBDb3B5IE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya2luZ0NvcHlNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktJTkdfQ09QWV9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya2luZ0NvcHlNZXRob2QoKSA8ZW0+V29ya2luZyBDb3B5IE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya2luZ0NvcHlNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgd29ya2luZ0NvcHlNZXRob2QgPSBXT1JLSU5HX0NPUFlfTUVUSE9EX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENsb25lQ29weVBvbGljeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0NMT05FX0NPUFlfUE9MSUNZOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWV0aG9kKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X01ldGhvZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpCi0JewotCQlyZXR1cm4gbWV0aG9kOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kjZ2V0TWV0aG9kIDxlbT5NZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kKFN0cmluZyBuZXdNZXRob2QpCi0JewotCQlTdHJpbmcgb2xkTWV0aG9kID0gbWV0aG9kOwotCQltZXRob2QgPSBuZXdNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX01FVEhPRCwgb2xkTWV0aG9kLCBtZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JraW5nIENvcHkgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JraW5nIENvcHkgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmtpbmcgQ29weSBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmtpbmdDb3B5TWV0aG9kKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X1dvcmtpbmdDb3B5TWV0aG9kKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V29ya2luZ0NvcHlNZXRob2QoKQotCXsKLQkJcmV0dXJuIHdvcmtpbmdDb3B5TWV0aG9kOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kjZ2V0V29ya2luZ0NvcHlNZXRob2QgPGVtPldvcmtpbmcgQ29weSBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmtpbmcgQ29weSBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmtpbmdDb3B5TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya2luZ0NvcHlNZXRob2QoU3RyaW5nIG5ld1dvcmtpbmdDb3B5TWV0aG9kKQotCXsKLQkJU3RyaW5nIG9sZFdvcmtpbmdDb3B5TWV0aG9kID0gd29ya2luZ0NvcHlNZXRob2Q7Ci0JCXdvcmtpbmdDb3B5TWV0aG9kID0gbmV3V29ya2luZ0NvcHlNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0QsIG9sZFdvcmtpbmdDb3B5TWV0aG9kLCB3b3JraW5nQ29weU1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19XT1JLSU5HX0NPUFlfTUVUSE9EOgotCQkJCXJldHVybiBnZXRXb3JraW5nQ29weU1ldGhvZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DTE9ORV9DT1BZX1BPTElDWV9fTUVUSE9EOgotCQkJCXNldE1ldGhvZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0Q6Ci0JCQkJc2V0V29ya2luZ0NvcHlNZXRob2QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19NRVRIT0Q6Ci0JCQkJc2V0TWV0aG9kKE1FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19XT1JLSU5HX0NPUFlfTUVUSE9EOgotCQkJCXNldFdvcmtpbmdDb3B5TWV0aG9kKFdPUktJTkdfQ09QWV9NRVRIT0RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX01FVEhPRDoKLQkJCQlyZXR1cm4gTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyBtZXRob2QgIT0gbnVsbCA6ICFNRVRIT0RfRURFRkFVTFQuZXF1YWxzKG1ldGhvZCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIFdPUktJTkdfQ09QWV9NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmtpbmdDb3B5TWV0aG9kICE9IG51bGwgOiAhV09SS0lOR19DT1BZX01FVEhPRF9FREVGQVVMVC5lcXVhbHMod29ya2luZ0NvcHlNZXRob2QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1ldGhvZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29ya2luZ0NvcHlNZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmtpbmdDb3B5TWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTWV0aG9kVHJhbnNsYXRvcigpLAotCQkJYnVpbGRXb3JraW5nQ29weU1ldGhvZFRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWV0aG9kVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNMT05FX0NPUFlfUE9MSUNZX19NRVRIT0QsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X01ldGhvZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRXb3JraW5nQ29weU1ldGhvZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DTE9ORV9DT1BZX1BPTElDWV9fV09SS0lOR19DT1BZX01FVEhPRCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDbG9uZUNvcHlQb2xpY3lfV29ya2luZ0NvcHlNZXRob2QoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi19IC8vIFhtbENsb25lQ29weVBvbGljeQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJzaW9uVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVyc2lvblZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5N2VkMWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJzaW9uVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDb252ZXJzaW9uIFZhbHVlPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZSNnZXREYXRhVmFsdWUgPGVtPkRhdGEgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUjZ2V0T2JqZWN0VmFsdWUgPGVtPk9iamVjdCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJzaW9uVmFsdWUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQ29udmVyc2lvblZhbHVlIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhVmFsdWUoKSA8ZW0+RGF0YSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF0YVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFWYWx1ZSgpIDxlbT5EYXRhIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXRhVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGF0YVZhbHVlID0gREFUQV9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RWYWx1ZSgpIDxlbT5PYmplY3QgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VmFsdWUoKSA8ZW0+T2JqZWN0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBvYmplY3RWYWx1ZSA9IE9CSkVDVF9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb252ZXJzaW9uVmFsdWUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9DT05WRVJTSU9OX1ZBTFVFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGEgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRhdGEgVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGF0YVZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVyc2lvblZhbHVlX0RhdGFWYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVZhbHVlKCkKLQl7Ci0JCXJldHVybiBkYXRhVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZSNnZXREYXRhVmFsdWUgPGVtPkRhdGEgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRhdGEgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERhdGFWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGFWYWx1ZShTdHJpbmcgbmV3RGF0YVZhbHVlKQotCXsKLQkJU3RyaW5nIG9sZERhdGFWYWx1ZSA9IGRhdGFWYWx1ZTsKLQkJZGF0YVZhbHVlID0gbmV3RGF0YVZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUUsIG9sZERhdGFWYWx1ZSwgZGF0YVZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPYmplY3RWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnNpb25WYWx1ZV9PYmplY3RWYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VmFsdWUoKQotCXsKLQkJcmV0dXJuIG9iamVjdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUjZ2V0T2JqZWN0VmFsdWUgPGVtPk9iamVjdCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPYmplY3RWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdFZhbHVlKFN0cmluZyBuZXdPYmplY3RWYWx1ZSkKLQl7Ci0JCVN0cmluZyBvbGRPYmplY3RWYWx1ZSA9IG9iamVjdFZhbHVlOwotCQlvYmplY3RWYWx1ZSA9IG5ld09iamVjdFZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRSwgb2xkT2JqZWN0VmFsdWUsIG9iamVjdFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0RGF0YVZhbHVlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFOgotCQkJCXJldHVybiBnZXRPYmplY3RWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFOgotCQkJCXNldERhdGFWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFOgotCQkJCXNldE9iamVjdFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFOgotCQkJCXNldERhdGFWYWx1ZShEQVRBX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFOgotCQkJCXNldE9iamVjdFZhbHVlKE9CSkVDVF9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFOgotCQkJCXJldHVybiBEQVRBX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBkYXRhVmFsdWUgIT0gbnVsbCA6ICFEQVRBX1ZBTFVFX0VERUZBVUxULmVxdWFscyhkYXRhVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRToKLQkJCQlyZXR1cm4gT0JKRUNUX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBvYmplY3RWYWx1ZSAhPSBudWxsIDogIU9CSkVDVF9WQUxVRV9FREVGQVVMVC5lcXVhbHMob2JqZWN0VmFsdWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkYXRhVmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRhdGFWYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb2JqZWN0VmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG9iamVjdFZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RGF0YVZhbHVlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9iamVjdFZhbHVlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkRGF0YVZhbHVlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPYmplY3RWYWx1ZVRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREYXRhVmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJzaW9uVmFsdWVfRGF0YVZhbHVlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9iamVjdFZhbHVlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJzaW9uVmFsdWVfT2JqZWN0VmFsdWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi19IC8vIFhtbENvbnZlcnNpb25WYWx1ZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMTE3MDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDdXN0b21Db252ZXJ0ZXI8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQ29udmVydGVyIGV4dGVuZHMgWG1sTmFtZWRDb252ZXJ0ZXIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NOYW1lKCkgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NOYW1lKCkgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWUgPSBDTEFTU19OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbnZlcnRlcigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0NPTlZFUlRFUjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENsYXNzTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcl9DbGFzc05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpCi0JewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXIjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIG5ld0NsYXNzTmFtZSkKLQl7Ci0JCVN0cmluZyBvbGRDbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCWNsYXNzTmFtZSA9IG5ld0NsYXNzTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfX0NMQVNTX05BTUUsIG9sZENsYXNzTmFtZSwgY2xhc3NOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX19DTEFTU19OQU1FOgotCQkJCXJldHVybiBnZXRDbGFzc05hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX19DTEFTU19OQU1FOgotCQkJCXNldENsYXNzTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX19DTEFTU19OQU1FOgotCQkJCXNldENsYXNzTmFtZShDTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9fQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gY2xhc3NOYW1lICE9IG51bGwgOiAhQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoY2xhc3NOYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY2xhc3NOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjbGFzc05hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIFRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDbGFzc1RyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVEVSX19DTEFTUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJfQ2xhc3NOYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpOwotCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5jbGFzc05hbWUubGFzdEluZGV4T2Yob3JpZ2luYWxOYW1lKTsKLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoRWNsaXBzZUxpbmsuQ09OVkVSVEVSX19DTEFTUykuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCArIG5hbWVJbmRleCwgb3JpZ2luYWxOYW1lLmxlbmd0aCgpLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJaW50IHBhY2thZ2VMZW5ndGggPSB0aGlzLmNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAocGFja2FnZUxlbmd0aCA9PSAtMSkgewotCQkJcGFja2FnZUxlbmd0aCA9IDA7Ci0JCQluZXdOYW1lID0gbmV3TmFtZSArICcuJzsKLQkJfQotCQlpbnQgb2Zmc2V0ID0gZ2V0QXR0cmlidXRlTm9kZShFY2xpcHNlTGluay5DT05WRVJURVJfX0NMQVNTKS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOyAvLyArMSA9IG9wZW5pbmcgZG91YmxlIHF1b3RlCi0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0LCBwYWNrYWdlTGVuZ3RoLCBuZXdOYW1lKTsKLQl9Ci0KLX0gLy8gWG1sQ29udmVydGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRlckhvbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0ZXJIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJjY2IzNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRlckhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ3VzdG9tQ29udmVydGVyIEhvbGRlcjwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0Q29udmVydGVyIDxlbT5Db252ZXJ0ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0VHlwZUNvbnZlcnRlciA8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlciA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyI2dldFN0cnVjdENvbnZlcnRlciA8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbENvbnZlcnRlckhvbGRlciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9Db252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQ29udmVydGVyIGdldENvbnZlcnRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRDb252ZXJ0ZXIgPGVtPkNvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ3VzdG9tQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9UeXBlQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbFR5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRUeXBlQ29udmVydGVyIDxlbT5UeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIEN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0IEN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbFN0cnVjdENvbnZlcnRlciBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0U3RydWN0Q29udmVydGVyIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgdmFsdWUpOwotCi19IC8vIFhtbENvbnZlcnRlckhvbGRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0ZXJzSG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRlcnNIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM2MzM0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRlcnNIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDb252ZXJ0ZXJzIEhvbGRlcjwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyI2dldENvbnZlcnRlcnMgPGVtPkNvbnZlcnRlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyI2dldFR5cGVDb252ZXJ0ZXJzIDxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlciNnZXRTdHJ1Y3RDb252ZXJ0ZXJzIDxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDb252ZXJ0ZXJzSG9sZGVyIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX0NvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gZ2V0VHlwZUNvbnZlcnRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9PYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfU3RydWN0Q29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IGdldFN0cnVjdENvbnZlcnRlcnMoKTsKLQotfSAvLyBYbWxDb252ZXJ0ZXJzSG9sZGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRpYmxlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0aWJsZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyNTdkZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRpYmxlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nI2dldENvbnZlcnQgPGVtPkNvbnZlcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nLCBYbWxDb252ZXJ0ZXJIb2xkZXIKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbnZlcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfQ29udmVydCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb252ZXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nI2dldENvbnZlcnQgPGVtPkNvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnZlcnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBjb252ZXJ0IGVsZW1lbnQuICBJZiB0aGUgY29udmVydCBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBtYXBwaW5nIGVsZW1lbnQuCi0JICovCi0JVGV4dFJhbmdlIGdldENvbnZlcnRUZXh0UmFuZ2UoKTsKLQotfSAvLyBYbWxDb252ZXJ0aWJsZU1hcHBpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29weVBvbGljeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb3B5UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NjJmN2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb3B5UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENvcHkgUG9saWN5PC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29weVBvbGljeSNnZXRDbGFzc18gPGVtPkNsYXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvcHlQb2xpY3koKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQ29weVBvbGljeSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NfKCkgPGVtPkNsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc18oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzXygpIDxlbT5DbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NfKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzXyA9IENMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvcHlQb2xpY3koKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9DT1BZX1BPTElDWTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29weVBvbGljeV9DbGFzcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzXygpCi0JewotCQlyZXR1cm4gY2xhc3NfOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb3B5UG9saWN5I2dldENsYXNzXyA8ZW0+Q2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDbGFzc18oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzcyhTdHJpbmcgbmV3Q2xhc3MpCi0JewotCQlTdHJpbmcgb2xkQ2xhc3MgPSBjbGFzc187Ci0JCWNsYXNzXyA9IG5ld0NsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPUFlfUE9MSUNZX19DTEFTUywgb2xkQ2xhc3MsIGNsYXNzXykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPUFlfUE9MSUNZX19DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NfKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPUFlfUE9MSUNZX19DTEFTUzoKLQkJCQlzZXRDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09QWV9QT0xJQ1lfX0NMQVNTOgotCQkJCXNldENsYXNzKENMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPUFlfUE9MSUNZX19DTEFTUzoKLQkJCQlyZXR1cm4gQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzXyAhPSBudWxsIDogIUNMQVNTX0VERUZBVUxULmVxdWFscyhjbGFzc18pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2xhc3NfKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09QWV9QT0xJQ1lfX0NMQVNTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvcHlQb2xpY3lfQ2xhc3MoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi19IC8vIFhtbENvcHlQb2xpY3kKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ3VzdG9taXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDdXN0b21pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZWMxOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDdXN0b21pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ3VzdG9taXplcjwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplciNnZXRDdXN0b21pemVyQ2xhc3NOYW1lIDxlbT5DdXN0b21pemVyIENsYXNzIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxDdXN0b21pemVyIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkgPGVtPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VzdG9taXplckNsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NSVpFUl9DTEFTU19OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1c3RvbWl6ZXJDbGFzc05hbWUoKSA8ZW0+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbWl6ZXJDbGFzc05hbWUgPSBDVVNUT01JWkVSX0NMQVNTX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ3VzdG9taXplcigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0NVU1RPTUlaRVI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DdXN0b21pemVyIENsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDdXN0b21pemVyQ2xhc3NOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplcl9DdXN0b21pemVyQ2xhc3NOYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkKLQl7Ci0JCXJldHVybiBjdXN0b21pemVyQ2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVyI2dldEN1c3RvbWl6ZXJDbGFzc05hbWUgPGVtPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VzdG9taXplckNsYXNzTmFtZShTdHJpbmcgbmV3Q3VzdG9taXplckNsYXNzTmFtZSkKLQl7Ci0JCVN0cmluZyBvbGRDdXN0b21pemVyQ2xhc3NOYW1lID0gY3VzdG9taXplckNsYXNzTmFtZTsKLQkJY3VzdG9taXplckNsYXNzTmFtZSA9IG5ld0N1c3RvbWl6ZXJDbGFzc05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9fQ1VTVE9NSVpFUl9DTEFTU19OQU1FLCBvbGRDdXN0b21pemVyQ2xhc3NOYW1lLCBjdXN0b21pemVyQ2xhc3NOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9fQ1VTVE9NSVpFUl9DTEFTU19OQU1FOgotCQkJCXJldHVybiBnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NVU1RPTUlaRVJfX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRToKLQkJCQlzZXRDdXN0b21pemVyQ2xhc3NOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DVVNUT01JWkVSX19DVVNUT01JWkVSX0NMQVNTX05BTUU6Ci0JCQkJc2V0Q3VzdG9taXplckNsYXNzTmFtZShDVVNUT01JWkVSX0NMQVNTX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9fQ1VTVE9NSVpFUl9DTEFTU19OQU1FOgotCQkJCXJldHVybiBDVVNUT01JWkVSX0NMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGN1c3RvbWl6ZXJDbGFzc05hbWUgIT0gbnVsbCA6ICFDVVNUT01JWkVSX0NMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGN1c3RvbWl6ZXJDbGFzc05hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjdXN0b21pemVyQ2xhc3NOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjdXN0b21pemVyQ2xhc3NOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIFhtbEN1c3RvbWl6ZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ3VzdG9taXplckhvbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDdXN0b21pemVySG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OGM4MDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDdXN0b21pemVySG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDdXN0b21pemVyIEhvbGRlcjwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyI2dldEN1c3RvbWl6ZXIgPGVtPkN1c3RvbWl6ZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQ3VzdG9taXplckhvbGRlciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXN0b21pemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DdXN0b21pemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkN1c3RvbWl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEN1c3RvbWl6ZXJIb2xkZXJfQ3VzdG9taXplcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxDbGFzc1JlZmVyZW5jZSBnZXRDdXN0b21pemVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciNnZXRDdXN0b21pemVyIDxlbT5DdXN0b21pemVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b21pemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDdXN0b21pemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDdXN0b21pemVyKFhtbENsYXNzUmVmZXJlbmNlIHZhbHVlKTsKLQotfSAvLyBYbWxDdXN0b21pemVySG9sZGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbERpcmVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxEaXJlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkMjU1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbERpcmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+WG1sIERpcmVjdGlvbjwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxEaXJlY3Rpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIFhtbERpcmVjdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTl9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUlOKDAsICJJTiIsICJJTiIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09VVF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU9VVCgxLCAiT1VUIiwgIk9VVCIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU4gT1VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOX09VVF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUlOX09VVCgyLCAiSU5fT1VUIiwgIklOX09VVCIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1VUIENVUlNPUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPVVRfQ1VSU09SX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JT1VUX0NVUlNPUigzLCAiT1VUX0NVUlNPUiIsICJPVVRfQ1VSU09SIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU4KLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPVVQKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU4gT1VUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTiBPVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5fT1VUCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fT1VUX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9VVCBDVVJTT1I8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9VVCBDVVJTT1I8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjT1VUX0NVUlNPUgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9DVVJTT1JfVkFMVUUgPSAzOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlhtbCBEaXJlY3Rpb248L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhtbERpcmVjdGlvbltdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBYbWxEaXJlY3Rpb25bXQotCQl7Ci0JCQlJTiwKLQkJCU9VVCwKLQkJCUlOX09VVCwKLQkJCU9VVF9DVVJTT1IsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIERpcmVjdGlvbjwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFhtbERpcmVjdGlvbj4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgRGlyZWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sRGlyZWN0aW9uIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlYbWxEaXJlY3Rpb24gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIERpcmVjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbERpcmVjdGlvbiBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sRGlyZWN0aW9uIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIERpcmVjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbERpcmVjdGlvbiBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBJTl9WQUxVRTogcmV0dXJuIElOOwotCQkJY2FzZSBPVVRfVkFMVUU6IHJldHVybiBPVVQ7Ci0JCQljYXNlIElOX09VVF9WQUxVRTogcmV0dXJuIElOX09VVDsKLQkJCWNhc2UgT1VUX0NVUlNPUl9WQUxVRTogcmV0dXJuIE9VVF9DVVJTT1I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFhtbERpcmVjdGlvbihpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vWG1sRGlyZWN0aW9uCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVsZW1lbnRDb2xsZWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVsZW1lbnRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NjBiOTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2xsZWN0aW9uVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbGVtZW50IENvbGxlY3Rpb248L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxFbGVtZW50Q29sbGVjdGlvbiBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiBpbXBsZW1lbnRzIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCwgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXIoKSA8ZW0+Q29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb252ZXJ0ZXIgY29udmVydGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUNvbnZlcnRlcigpIDxlbT5UeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFR5cGVDb252ZXJ0ZXIgdHlwZUNvbnZlcnRlcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBvYmplY3RUeXBlQ29udmVydGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RydWN0Q29udmVydGVyKCkgPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFN0cnVjdENvbnZlcnRlciBzdHJ1Y3RDb252ZXJ0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydCgpIDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnQoKSA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0ID0gQ09OVkVSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcnMoKSA8ZW0+Q29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQ29udmVydGVyPiBjb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gdHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IHN0cnVjdENvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpIDxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUNvbnZlcnQoKSA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5Q29udmVydCgpIDxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcEtleUNvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFwS2V5Q29udmVydCA9IE1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhtbEpvaW5GZXRjaFR5cGUgSk9JTl9GRVRDSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luRmV0Y2goKSA8ZW0+Sm9pbiBGZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Sm9pbkZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSm9pbkZldGNoVHlwZSBqb2luRmV0Y2ggPSBKT0lOX0ZFVENIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmF0Y2hGZXRjaCgpIDxlbT5CYXRjaCBGZXRjaDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmF0Y2hGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEJhdGNoRmV0Y2ggYmF0Y2hGZXRjaDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVR5cGUgPSBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxFbGVtZW50Q29sbGVjdGlvbigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0VMRU1FTlRfQ09MTEVDVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9Db252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIGNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyIG5ld0NvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENvbnZlcnRlciBvbGRDb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCWNvbnZlcnRlciA9IG5ld0NvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUiwgb2xkQ29udmVydGVyLCBuZXdDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRDb252ZXJ0ZXIgPGVtPkNvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyIG5ld0NvbnZlcnRlcikKLQl7Ci0JCWlmIChuZXdDb252ZXJ0ZXIgIT0gY29udmVydGVyKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udmVydGVyKG5ld0NvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSLCBuZXdDb252ZXJ0ZXIsIG5ld0NvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBnZXRUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiB0eXBlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciBuZXdUeXBlQ29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVHlwZUNvbnZlcnRlciBvbGRUeXBlQ29udmVydGVyID0gdHlwZUNvbnZlcnRlcjsKLQkJdHlwZUNvbnZlcnRlciA9IG5ld1R5cGVDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUiwgb2xkVHlwZUNvbnZlcnRlciwgbmV3VHlwZUNvbnZlcnRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldFR5cGVDb252ZXJ0ZXIgPGVtPlR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciBuZXdUeXBlQ29udmVydGVyKQotCXsKLQkJaWYgKG5ld1R5cGVDb252ZXJ0ZXIgIT0gdHlwZUNvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0eXBlQ29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUeXBlQ29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1R5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VHlwZUNvbnZlcnRlcihuZXdUeXBlQ29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUiwgbmV3VHlwZUNvbnZlcnRlciwgbmV3VHlwZUNvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBuZXdPYmplY3RUeXBlQ29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBvbGRPYmplY3RUeXBlQ29udmVydGVyID0gb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQkJb2JqZWN0VHlwZUNvbnZlcnRlciA9IG5ld09iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG9sZE9iamVjdFR5cGVDb252ZXJ0ZXIsIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRPYmplY3RUeXBlQ29udmVydGVyIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBuZXdPYmplY3RUeXBlQ29udmVydGVyKQotCXsKLQkJaWYgKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIgIT0gb2JqZWN0VHlwZUNvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAob2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvYmplY3RUeXBlQ29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdPYmplY3RUeXBlQ29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX1N0cnVjdENvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sU3RydWN0Q29udmVydGVyIGdldFN0cnVjdENvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gc3RydWN0Q29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgbmV3U3RydWN0Q29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sU3RydWN0Q29udmVydGVyIG9sZFN0cnVjdENvbnZlcnRlciA9IHN0cnVjdENvbnZlcnRlcjsKLQkJc3RydWN0Q29udmVydGVyID0gbmV3U3RydWN0Q29udmVydGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUiwgb2xkU3RydWN0Q29udmVydGVyLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRTdHJ1Y3RDb252ZXJ0ZXIgPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgbmV3U3RydWN0Q29udmVydGVyKQotCXsKLQkJaWYgKG5ld1N0cnVjdENvbnZlcnRlciAhPSBzdHJ1Y3RDb252ZXJ0ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHN0cnVjdENvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzdHJ1Y3RDb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U3RydWN0Q29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1N0cnVjdENvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFN0cnVjdENvbnZlcnRlcihuZXdTdHJ1Y3RDb252ZXJ0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVIsIG5ld1N0cnVjdENvbnZlcnRlciwgbmV3U3RydWN0Q29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb252ZXJ0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnQoKQotCXsKLQkJcmV0dXJuIGNvbnZlcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldENvbnZlcnQgPGVtPkNvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0KFN0cmluZyBuZXdDb252ZXJ0KQotCXsKLQkJU3RyaW5nIG9sZENvbnZlcnQgPSBjb252ZXJ0OwotCQljb252ZXJ0ID0gbmV3Q29udmVydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlQsIG9sZENvbnZlcnQsIGNvbnZlcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxDb252ZXJ0ZXI+IGdldENvbnZlcnRlcnMoKQotCXsKLQkJaWYgKGNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJY29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb252ZXJ0ZXI+KFhtbENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9UeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gZ2V0VHlwZUNvbnZlcnRlcnMoKQotCXsKLQkJaWYgKHR5cGVDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCXR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+KFhtbFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiB0eXBlQ29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChvYmplY3RUeXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQlvYmplY3RUeXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPihYbWxPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1N0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpCi0JewotCQlpZiAoc3RydWN0Q29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQlzdHJ1Y3RDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4oWG1sU3RydWN0Q29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBfTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQl7Ci0JCWlmIChtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyA9PSBudWxsKQotCQl7Ci0JCQltYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPihYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcEtleUNvbnZlcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5Q29udmVydCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwS2V5Q29udmVydCgpCi0JewotCQlyZXR1cm4gbWFwS2V5Q29udmVydDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0TWFwS2V5Q29udmVydCA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcEtleUNvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXlDb252ZXJ0KFN0cmluZyBuZXdNYXBLZXlDb252ZXJ0KQotCXsKLQkJU3RyaW5nIG9sZE1hcEtleUNvbnZlcnQgPSBtYXBLZXlDb252ZXJ0OwotCQltYXBLZXlDb252ZXJ0ID0gbmV3TWFwS2V5Q29udmVydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09OVkVSVCwgb2xkTWFwS2V5Q29udmVydCwgbWFwS2V5Q29udmVydCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpCi0JewotCQlyZXR1cm4gam9pbkZldGNoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRKb2luRmV0Y2ggPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAc2VlICNnZXRKb2luRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSBuZXdKb2luRmV0Y2gpCi0JewotCQlYbWxKb2luRmV0Y2hUeXBlIG9sZEpvaW5GZXRjaCA9IGpvaW5GZXRjaDsKLQkJam9pbkZldGNoID0gbmV3Sm9pbkZldGNoID09IG51bGwgPyBKT0lOX0ZFVENIX0VERUZBVUxUIDogbmV3Sm9pbkZldGNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSk9JTl9GRVRDSCwgb2xkSm9pbkZldGNoLCBqb2luRmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEJhdGNoRmV0Y2goWG1sQmF0Y2hGZXRjaCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcl9CYXRjaEZldGNoKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxCYXRjaEZldGNoIGdldEJhdGNoRmV0Y2goKQotCXsKLQkJcmV0dXJuIGJhdGNoRmV0Y2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoIG5ld0JhdGNoRmV0Y2gsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxCYXRjaEZldGNoIG9sZEJhdGNoRmV0Y2ggPSBiYXRjaEZldGNoOwotCQliYXRjaEZldGNoID0gbmV3QmF0Y2hGZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0JBVENIX0ZFVENILCBvbGRCYXRjaEZldGNoLCBuZXdCYXRjaEZldGNoKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0QmF0Y2hGZXRjaCA8ZW0+QmF0Y2ggRmV0Y2g8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoIG5ld0JhdGNoRmV0Y2gpCi0JewotCQlpZiAobmV3QmF0Y2hGZXRjaCAhPSBiYXRjaEZldGNoKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChiYXRjaEZldGNoICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWJhdGNoRmV0Y2gpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQkFUQ0hfRkVUQ0gsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0JhdGNoRmV0Y2ggIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QmF0Y2hGZXRjaCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19CQVRDSF9GRVRDSCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRCYXRjaEZldGNoKG5ld0JhdGNoRmV0Y2gsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0JBVENIX0ZFVENILCBuZXdCYXRjaEZldGNoLCBuZXdCYXRjaEZldGNoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8xX0F0dHJpYnV0ZVR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyBuZXdBdHRyaWJ1dGVUeXBlKQotCXsKLQkJU3RyaW5nIG9sZEF0dHJpYnV0ZVR5cGUgPSBhdHRyaWJ1dGVUeXBlOwotCQlhdHRyaWJ1dGVUeXBlID0gbmV3QXR0cmlidXRlVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFLCBvbGRBdHRyaWJ1dGVUeXBlLCBhdHRyaWJ1dGVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldENvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldFR5cGVDb252ZXJ0ZXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3RydWN0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBiYXNpY1NldEJhdGNoRmV0Y2gobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlQ6Ci0JCQkJcmV0dXJuIGdldENvbnZlcnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldENvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0U3RydWN0Q29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIGdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTlZFUlQ6Ci0JCQkJcmV0dXJuIGdldE1hcEtleUNvbnZlcnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0pPSU5fRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEpvaW5GZXRjaCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQkFUQ0hfRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEJhdGNoRmV0Y2goKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUjoKLQkJCQlzZXRDb252ZXJ0ZXIoKFhtbENvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0VHlwZUNvbnZlcnRlcigoWG1sVHlwZUNvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldE9iamVjdFR5cGVDb252ZXJ0ZXIoKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJc2V0U3RydWN0Q29udmVydGVyKChYbWxTdHJ1Y3RDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlQ6Ci0JCQkJc2V0Q29udmVydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVJTOgotCQkJCWdldENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbENvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFR5cGVDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFN0cnVjdENvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXNzb2NpYXRpb25PdmVycmlkZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09OVkVSVDoKLQkJCQlzZXRNYXBLZXlDb252ZXJ0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0pPSU5fRkVUQ0g6Ci0JCQkJc2V0Sm9pbkZldGNoKChYbWxKb2luRmV0Y2hUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19CQVRDSF9GRVRDSDoKLQkJCQlzZXRCYXRjaEZldGNoKChYbWxCYXRjaEZldGNoKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVI6Ci0JCQkJc2V0Q29udmVydGVyKChYbWxDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0VHlwZUNvbnZlcnRlcigoWG1sVHlwZUNvbnZlcnRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0T2JqZWN0VHlwZUNvbnZlcnRlcigoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXNldFN0cnVjdENvbnZlcnRlcigoWG1sU3RydWN0Q29udmVydGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlQ6Ci0JCQkJc2V0Q29udmVydChDT05WRVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVJTOgotCQkJCWdldENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09OVkVSVDoKLQkJCQlzZXRNYXBLZXlDb252ZXJ0KE1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSk9JTl9GRVRDSDoKLQkJCQlzZXRKb2luRmV0Y2goSk9JTl9GRVRDSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQkFUQ0hfRkVUQ0g6Ci0JCQkJc2V0QmF0Y2hGZXRjaCgoWG1sQmF0Y2hGZXRjaCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKEFUVFJJQlVURV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRlciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gc3RydWN0Q29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJUOgotCQkJCXJldHVybiBDT05WRVJUX0VERUZBVUxUID09IG51bGwgPyBjb252ZXJ0ICE9IG51bGwgOiAhQ09OVkVSVF9FREVGQVVMVC5lcXVhbHMoY29udmVydCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVJTOgotCQkJCXJldHVybiBjb252ZXJ0ZXJzICE9IG51bGwgJiYgIWNvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiB0eXBlQ29udmVydGVycyAhPSBudWxsICYmICF0eXBlQ29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVycyAhPSBudWxsICYmICFvYmplY3RUeXBlQ29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gc3RydWN0Q29udmVydGVycyAhPSBudWxsICYmICFzdHJ1Y3RDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiBtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyAhPSBudWxsICYmICFtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTlZFUlQ6Ci0JCQkJcmV0dXJuIE1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVCA9PSBudWxsID8gbWFwS2V5Q29udmVydCAhPSBudWxsIDogIU1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVC5lcXVhbHMobWFwS2V5Q29udmVydCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19KT0lOX0ZFVENIOgotCQkJCXJldHVybiBqb2luRmV0Y2ggIT0gSk9JTl9GRVRDSF9FREVGQVVMVDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBiYXRjaEZldGNoICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19DT05WRVJURVI7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX1NUUlVDVF9DT05WRVJURVI7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19KT0lOX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhdGNoRmV0Y2hIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19CQVRDSF9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMV9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1NUUlVDVF9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkZldGNoLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfX0pPSU5fRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSk9JTl9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQkFUQ0hfRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjFfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29udmVydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29udmVydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFwS2V5Q29udmVydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWFwS2V5Q29udmVydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgam9pbkZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqb2luRmV0Y2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLkVOVU1FUkFURUQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldExvYlRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuTE9CKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZW1wb3JhbFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuVEVNUE9SQUwpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEpvaW5GZXRjaFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbigpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFyZ2V0Q2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZVR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9yZGVyQnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9yZGVyQ29sdW1uVHJhbnNsYXRvcigpLAkJCi0JCQlidWlsZE1hcEtleVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5Q2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleVRlbXBvcmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlFbnVtZXJhdGVkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlDb252ZXJ0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoKSwKLQkJCVhtbENvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUNvbHVtbigpKSwKLQkJCVhtbEpvaW5Db2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUpvaW5Db2x1bW5zKCkpLAotCQkJWG1sQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEuQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0NvbHVtbigpKSwKLQkJCWJ1aWxkVGVtcG9yYWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZEVudW1lcmF0ZWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZExvYlRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29udmVydFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlYbWxDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkpLAotCQkJWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpKSwKLQkJCVhtbENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9PYmplY3RUeXBlQ29udmVydGVyKCkpLAotCQkJWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXIoKSksCi0JCQlYbWxDb2xsZWN0aW9uVGFibGUuYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0NvbGxlY3Rpb25UYWJsZSgpKSwKLQkJCWJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRCYXRjaEZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlDb252ZXJ0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0NPTlZFUlQsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlDb252ZXJ0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFLCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMF9NYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzFfQXR0cmlidXRlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRKb2luRmV0Y2hUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRCYXRjaEZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEJhdGNoRmV0Y2guYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkJBVENIX0ZFVENILCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhdGNoRmV0Y2hIb2xkZXJfQmF0Y2hGZXRjaCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMzU2Y2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbWJlZGRhYmxlXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbWJlZGRhYmxlPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0Q29weVBvbGljeSA8ZW0+Q29weSBQb2xpY3k8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDbG9uZUNvcHlQb2xpY3kgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxFbWJlZGRhYmxlIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUgaW1wbGVtZW50cyBYbWxFbWJlZGRhYmxlXzJfMSwgWG1sQ3VzdG9taXplckhvbGRlciwgWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIsIFhtbENvbnZlcnRlcnNIb2xkZXIsIFhtbFByb3BlcnR5Q29udGFpbmVyCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1c3RvbWl6ZXIoKSA8ZW0+Q3VzdG9taXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VzdG9taXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENsYXNzUmVmZXJlbmNlIGN1c3RvbWl6ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VUcmFja2luZygpIDxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZVRyYWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2hhbmdlVHJhY2tpbmcgY2hhbmdlVHJhY2tpbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXJzKCkgPGVtPkNvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbENvbnZlcnRlcj4gY29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVDb252ZXJ0ZXJzKCkgPGVtPlR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IHR5cGVDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IG9iamVjdFR5cGVDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RydWN0Q29udmVydGVycygpIDxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBzdHJ1Y3RDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlQb2xpY3koKSA8ZW0+Q29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb3B5UG9saWN5IGNvcHlQb2xpY3k7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpIDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGluc3RhbnRpYXRpb25Db3B5UG9saWN5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbG9uZUNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDbG9uZUNvcHlQb2xpY3kgY2xvbmVDb3B5UG9saWN5OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBleGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEVtYmVkZGFibGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTUJFRERBQkxFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXN0b21pemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DdXN0b21pemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkN1c3RvbWl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEN1c3RvbWl6ZXJIb2xkZXJfQ3VzdG9taXplcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2xhc3NSZWZlcmVuY2UgZ2V0Q3VzdG9taXplcigpCi0JewotCQlyZXR1cm4gY3VzdG9taXplcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDdXN0b21pemVyKFhtbENsYXNzUmVmZXJlbmNlIG5ld0N1c3RvbWl6ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDbGFzc1JlZmVyZW5jZSBvbGRDdXN0b21pemVyID0gY3VzdG9taXplcjsKLQkJY3VzdG9taXplciA9IG5ld0N1c3RvbWl6ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUiwgb2xkQ3VzdG9taXplciwgbmV3Q3VzdG9taXplcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0Q3VzdG9taXplciA8ZW0+Q3VzdG9taXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q3VzdG9taXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q3VzdG9taXplcikKLQl7Ci0JCWlmIChuZXdDdXN0b21pemVyICE9IGN1c3RvbWl6ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGN1c3RvbWl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY3VzdG9taXplcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q3VzdG9taXplciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDdXN0b21pemVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DVVNUT01JWkVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEN1c3RvbWl6ZXIobmV3Q3VzdG9taXplciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVIsIG5ld0N1c3RvbWl6ZXIsIG5ld0N1c3RvbWl6ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcl9DaGFuZ2VUcmFja2luZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2hhbmdlVHJhY2tpbmcgZ2V0Q2hhbmdlVHJhY2tpbmcoKQotCXsKLQkJcmV0dXJuIGNoYW5nZVRyYWNraW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nIG5ld0NoYW5nZVRyYWNraW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ2hhbmdlVHJhY2tpbmcgb2xkQ2hhbmdlVHJhY2tpbmcgPSBjaGFuZ2VUcmFja2luZzsKLQkJY2hhbmdlVHJhY2tpbmcgPSBuZXdDaGFuZ2VUcmFja2luZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkcsIG9sZENoYW5nZVRyYWNraW5nLCBuZXdDaGFuZ2VUcmFja2luZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0Q2hhbmdlVHJhY2tpbmcgPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDaGFuZ2VUcmFja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nIG5ld0NoYW5nZVRyYWNraW5nKQotCXsKLQkJaWYgKG5ld0NoYW5nZVRyYWNraW5nICE9IGNoYW5nZVRyYWNraW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjaGFuZ2VUcmFja2luZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljaGFuZ2VUcmFja2luZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0hBTkdFX1RSQUNLSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDaGFuZ2VUcmFja2luZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDaGFuZ2VUcmFja2luZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0hBTkdFX1RSQUNLSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENoYW5nZVRyYWNraW5nKG5ld0NoYW5nZVRyYWNraW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0hBTkdFX1RSQUNLSU5HLCBuZXdDaGFuZ2VUcmFja2luZywgbmV3Q2hhbmdlVHJhY2tpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxDb252ZXJ0ZXI+IGdldENvbnZlcnRlcnMoKQotCXsKLQkJaWYgKGNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJY29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb252ZXJ0ZXI+KFhtbENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gY29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IGdldFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmICh0eXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQl0eXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUeXBlQ29udmVydGVyPihYbWxUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1RZUEVfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9PYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCXsKLQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCW9iamVjdFR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1N0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpCi0JewotCQlpZiAoc3RydWN0Q29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQlzdHJ1Y3RDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4oWG1sU3RydWN0Q29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0Q29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvcHlQb2xpY3koWG1sQ29weVBvbGljeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZV9Db3B5UG9saWN5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb3B5UG9saWN5IGdldENvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIGNvcHlQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29weVBvbGljeShYbWxDb3B5UG9saWN5IG5ld0NvcHlQb2xpY3ksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDb3B5UG9saWN5IG9sZENvcHlQb2xpY3kgPSBjb3B5UG9saWN5OwotCQljb3B5UG9saWN5ID0gbmV3Q29weVBvbGljeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT1BZX1BPTElDWSwgb2xkQ29weVBvbGljeSwgbmV3Q29weVBvbGljeSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0Q29weVBvbGljeSA8ZW0+Q29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weVBvbGljeShYbWxDb3B5UG9saWN5IG5ld0NvcHlQb2xpY3kpCi0JewotCQlpZiAobmV3Q29weVBvbGljeSAhPSBjb3B5UG9saWN5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvcHlQb2xpY3kpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvcHlQb2xpY3kpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvcHlQb2xpY3kobmV3Q29weVBvbGljeSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZLCBuZXdDb3B5UG9saWN5LCBuZXdDb3B5UG9saWN5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZV9JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIGluc3RhbnRpYXRpb25Db3B5UG9saWN5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgb2xkSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPSBpbnN0YW50aWF0aW9uQ29weVBvbGljeTsKLQkJaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPSBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBvbGRJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KQotCXsKLQkJaWYgKG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IGluc3RhbnRpYXRpb25Db3B5UG9saWN5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbnN0YW50aWF0aW9uQ29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbnN0YW50aWF0aW9uQ29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kobmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3ksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbG9uZSBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENsb25lQ29weVBvbGljeShYbWxDbG9uZUNvcHlQb2xpY3kpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGFibGVfQ2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDbG9uZUNvcHlQb2xpY3kgZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiBjbG9uZUNvcHlQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2xvbmVDb3B5UG9saWN5KFhtbENsb25lQ29weVBvbGljeSBuZXdDbG9uZUNvcHlQb2xpY3ksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDbG9uZUNvcHlQb2xpY3kgb2xkQ2xvbmVDb3B5UG9saWN5ID0gY2xvbmVDb3B5UG9saWN5OwotCQljbG9uZUNvcHlQb2xpY3kgPSBuZXdDbG9uZUNvcHlQb2xpY3k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1ksIG9sZENsb25lQ29weVBvbGljeSwgbmV3Q2xvbmVDb3B5UG9saWN5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDbG9uZUNvcHlQb2xpY3kgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xvbmVDb3B5UG9saWN5KFhtbENsb25lQ29weVBvbGljeSBuZXdDbG9uZUNvcHlQb2xpY3kpCi0JewotCQlpZiAobmV3Q2xvbmVDb3B5UG9saWN5ICE9IGNsb25lQ29weVBvbGljeSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2xvbmVDb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNsb25lQ29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Nsb25lQ29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDbG9uZUNvcHlQb2xpY3kpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NMT05FX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENsb25lQ29weVBvbGljeShuZXdDbG9uZUNvcHlQb2xpY3ksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWSwgbmV3Q2xvbmVDb3B5UG9saWN5LCBuZXdDbG9uZUNvcHlQb2xpY3kpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZV9FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQl7Ci0JCXJldHVybiBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhCb29sZWFuIG5ld0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpCi0JewotCQlCb29sZWFuIG9sZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPSBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOwotCQlleGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gbmV3RXhjbHVkZURlZmF1bHRNYXBwaW5nczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MsIG9sZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MsIGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q3VzdG9taXplcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2hhbmdlVHJhY2tpbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3RydWN0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBiYXNpY1NldENvcHlQb2xpY3kobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRDbG9uZUNvcHlQb2xpY3kobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUjoKLQkJCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NIQU5HRV9UUkFDS0lORzoKLQkJCQlyZXR1cm4gZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRUeXBlQ29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldFN0cnVjdENvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGdldENvcHlQb2xpY3koKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NMT05FX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBnZXRDbG9uZUNvcHlQb2xpY3koKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVI6Ci0JCQkJc2V0Q3VzdG9taXplcigoWG1sQ2xhc3NSZWZlcmVuY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJc2V0Q2hhbmdlVHJhY2tpbmcoKFhtbENoYW5nZVRyYWNraW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09OVkVSVEVSUzoKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxTdHJ1Y3RDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT1BZX1BPTElDWToKLQkJCQlzZXRDb3B5UG9saWN5KChYbWxDb3B5UG9saWN5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlzZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgoWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlzZXRDbG9uZUNvcHlQb2xpY3koKFhtbENsb25lQ29weVBvbGljeSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUjoKLQkJCQlzZXRDdXN0b21pemVyKChYbWxDbGFzc1JlZmVyZW5jZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0hBTkdFX1RSQUNLSU5HOgotCQkJCXNldENoYW5nZVRyYWNraW5nKChYbWxDaGFuZ2VUcmFja2luZyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09OVkVSVEVSUzoKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT1BZX1BPTElDWToKLQkJCQlzZXRDb3B5UG9saWN5KChYbWxDb3B5UG9saWN5KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KChYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1k6Ci0JCQkJc2V0Q2xvbmVDb3B5UG9saWN5KChYbWxDbG9uZUNvcHlQb2xpY3kpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVI6Ci0JCQkJcmV0dXJuIGN1c3RvbWl6ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJcmV0dXJuIGNoYW5nZVRyYWNraW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gY29udmVydGVycyAhPSBudWxsICYmICFjb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVycyAhPSBudWxsICYmICFvYmplY3RUeXBlQ29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnMgIT0gbnVsbCAmJiAhc3RydWN0Q29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gY29weVBvbGljeSAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGluc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGNsb25lQ29weVBvbGljeSAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUID09IG51bGwgPyBleGNsdWRlRGVmYXVsdE1hcHBpbmdzICE9IG51bGwgOiAhRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxULmVxdWFscyhleGNsdWRlRGVmYXVsdE1hcHBpbmdzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbWJlZGRhYmxlXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEN1c3RvbWl6ZXJIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9IT0xERVJfX0NVU1RPTUlaRVI7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0hBTkdFX1RSQUNLSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSX19DSEFOR0VfVFJBQ0tJTkc7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVtYmVkZGFibGVfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ3VzdG9taXplckhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DVVNUT01JWkVSX0hPTERFUl9fQ1VTVE9NSVpFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSX19DSEFOR0VfVFJBQ0tJTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NIQU5HRV9UUkFDS0lORzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpLAotCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ3VzdG9taXplclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2hhbmdlVHJhY2tpbmdUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb3B5UG9saWN5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRJbnN0YW50aWF0aW9uQ295cFBvbGljeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2xvbmVDb3B5UG9saWN5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKLQkJCUF0dHJpYnV0ZXMuYnVpbGRUcmFuc2xhdG9yKCl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYQ0xVREVfREVGQVVMVF9NQVBQSU5HUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ3VzdG9taXplclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDbGFzc1JlZmVyZW5jZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDdXN0b21pemVySG9sZGVyX0N1c3RvbWl6ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENoYW5nZVRyYWNraW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENoYW5nZVRyYWNraW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJfQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX0NvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9UeXBlQ29udmVydGVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxPYmplY3RUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9PYmplY3RUeXBlQ29udmVydGVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFN0cnVjdENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1N0cnVjdENvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvcHlQb2xpY3lUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29weVBvbGljeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09QWV9QT0xJQ1ksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV9Db3B5UG9saWN5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJbnN0YW50aWF0aW9uQ295cFBvbGljeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlX0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDbG9uZUNvcHlQb2xpY3lUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ2xvbmVDb3B5UG9saWN5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DTE9ORV9DT1BZX1BPTElDWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlX0Nsb25lQ29weVBvbGljeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGVkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZDAwMWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbWJlZGRlZF8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbWJlZGRlZCBJbXBsPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sRW1iZWRkZWQgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQgaW1wbGVtZW50cyBYbWxFbWJlZGRlZF8yXzEsIFhtbEF0dHJpYnV0ZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVUeXBlID0gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxFbWJlZGRlZCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0VNQkVEREVEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgbmV3QXR0cmlidXRlVHlwZSkKLQl7Ci0JCVN0cmluZyBvbGRBdHRyaWJ1dGVUeXBlID0gYXR0cmlidXRlVHlwZTsKLQkJYXR0cmlidXRlVHlwZSA9IG5ld0F0dHJpYnV0ZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FUVFJJQlVURV9UWVBFLCBvbGRBdHRyaWJ1dGVUeXBlLCBhdHRyaWJ1dGVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKEFUVFJJQlVURV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYXR0cmlidXRlVHlwZSAhPSBudWxsIDogIUFUVFJJQlVURV9UWVBFX0VERUZBVUxULmVxdWFscyhhdHRyaWJ1dGVUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW1iZWRkZWRfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0VNQkVEREVEXzIxX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVtYmVkZGVkXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRU1CRURERURfMjFfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXR0cmlidXRlVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXR0cmlidXRlVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVtYmVkZGVkKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbWJlZGRlZF8yXzFfQXR0cmlidXRlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZElkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGVkSWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU4Zjg1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGVkSWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRJZF8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbWJlZGRlZCBJZCBJbXBsPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRJZCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxFbWJlZGRlZElkIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQgaW1wbGVtZW50cyBYbWxFbWJlZGRlZElkXzJfMSwgWG1sQXR0cmlidXRlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVR5cGUgPSBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEVtYmVkZGVkSWQoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTUJFRERFRF9JRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRlZElkXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZCNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyBuZXdBdHRyaWJ1dGVUeXBlKQotCXsKLQkJU3RyaW5nIG9sZEF0dHJpYnV0ZVR5cGUgPSBhdHRyaWJ1dGVUeXBlOwotCQlhdHRyaWJ1dGVUeXBlID0gbmV3QXR0cmlidXRlVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQVRUUklCVVRFX1RZUEUsIG9sZEF0dHJpYnV0ZVR5cGUsIGF0dHJpYnV0ZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZShBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVtYmVkZGVkSWRfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEXzIxX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVtYmVkZGVkSWRfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9FTUJFRERFRF9JRF8yMV9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdHRyaWJ1dGVUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdHRyaWJ1dGVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWRJZCgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZVR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5BVFRSSUJVVEVfVFlQRSwgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWRJZF8yXzFfQXR0cmlidXRlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OGIwMzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEVudGl0eV8xXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5XzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbnRpdHk8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldE9wdGltaXN0aWNMb2NraW5nIDxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q29weVBvbGljeSA8ZW0+Q29weSBQb2xpY3k8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2xvbmVDb3B5UG9saWN5IDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEVudGl0eSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkgaW1wbGVtZW50cyBYbWxFbnRpdHlfMV8xLCBYbWxFbnRpdHlfMl8wLCBYbWxFbnRpdHlfMl8xLCBYbWxSZWFkT25seSwgWG1sQ3VzdG9taXplckhvbGRlciwgWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIsIFhtbENhY2hlSG9sZGVyLCBYbWxDb252ZXJ0ZXJzSG9sZGVyLCBYbWxRdWVyeUNvbnRhaW5lciwgWG1sUHJvcGVydHlDb250YWluZXIKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmltYXJ5S2V5KCkgPGVtPlByaW1hcnkgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmltYXJ5S2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUHJpbWFyeUtleSBwcmltYXJ5S2V5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FjaGVJbnRlcmNlcHRvcigpIDxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FjaGVJbnRlcmNlcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENsYXNzUmVmZXJlbmNlIGNhY2hlSW50ZXJjZXB0b3I7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRdWVyeVJlZGlyZWN0b3JzKCkgPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRRdWVyeVJlZGlyZWN0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUXVlcnlSZWRpcmVjdG9ycyBxdWVyeVJlZGlyZWN0b3JzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZldGNoR3JvdXBzKCkgPGVtPkZldGNoIEdyb3VwczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGZXRjaEdyb3VwcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEZldGNoR3JvdXA+IGZldGNoR3JvdXBzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NFeHRyYWN0b3IoKSA8ZW0+Q2xhc3MgRXh0cmFjdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc0V4dHJhY3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENsYXNzUmVmZXJlbmNlIGNsYXNzRXh0cmFjdG9yOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudENsYXNzKCkgPGVtPlBhcmVudCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJlbnRDbGFzcygpIDxlbT5QYXJlbnQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmVudENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmVudENsYXNzID0gUEFSRU5UX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYWRPbmx5KCkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBSRUFEX09OTFlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhZE9ubHkoKSA8ZW0+UmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gcmVhZE9ubHkgPSBSRUFEX09OTFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXN0b21pemVyKCkgPGVtPkN1c3RvbWl6ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1c3RvbWl6ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDbGFzc1JlZmVyZW5jZSBjdXN0b21pemVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlVHJhY2tpbmcoKSA8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VUcmFja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENoYW5nZVRyYWNraW5nIGNoYW5nZVRyYWNraW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FjaGUoKSA8ZW0+Q2FjaGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhY2hlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2FjaGUgY2FjaGU7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFeGlzdGVuY2VUeXBlIEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGlzdGVuY2VDaGVja2luZygpIDxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4aXN0ZW5jZUNoZWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXhpc3RlbmNlVHlwZSBleGlzdGVuY2VDaGVja2luZyA9IEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcnMoKSA8ZW0+Q29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQ29udmVydGVyPiBjb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gdHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IHN0cnVjdENvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKSA8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+IG5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpbWlzdGljTG9ja2luZygpIDxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGltaXN0aWNMb2NraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT3B0aW1pc3RpY0xvY2tpbmcgb3B0aW1pc3RpY0xvY2tpbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5UG9saWN5KCkgPGVtPkNvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29weVBvbGljeSBjb3B5UG9saWN5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKSA8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpbnN0YW50aWF0aW9uQ29weVBvbGljeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsb25lQ29weVBvbGljeSgpIDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2xvbmVDb3B5UG9saWN5IGNsb25lQ29weVBvbGljeTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gZXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxFbnRpdHkoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTlRJVFk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWFkT25seShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZWFkT25seV9SZWFkT25seSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0UmVhZE9ubHkoKQotCXsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UmVhZE9ubHkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KEJvb2xlYW4gbmV3UmVhZE9ubHkpCi0JewotCQlCb29sZWFuIG9sZFJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JCXJlYWRPbmx5ID0gbmV3UmVhZE9ubHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRUFEX09OTFksIG9sZFJlYWRPbmx5LCByZWFkT25seSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbWl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q3VzdG9taXplcihYbWxDbGFzc1JlZmVyZW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplckhvbGRlcl9DdXN0b21pemVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDbGFzc1JlZmVyZW5jZSBnZXRDdXN0b21pemVyKCkKLQl7Ci0JCXJldHVybiBjdXN0b21pemVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q3VzdG9taXplciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIG9sZEN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQljdXN0b21pemVyID0gbmV3Q3VzdG9taXplcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NVU1RPTUlaRVIsIG9sZEN1c3RvbWl6ZXIsIG5ld0N1c3RvbWl6ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q3VzdG9taXplciA8ZW0+Q3VzdG9taXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q3VzdG9taXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q3VzdG9taXplcikKLQl7Ci0JCWlmIChuZXdDdXN0b21pemVyICE9IGN1c3RvbWl6ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGN1c3RvbWl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY3VzdG9taXplcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DVVNUT01JWkVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDdXN0b21pemVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0N1c3RvbWl6ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDdXN0b21pemVyKG5ld0N1c3RvbWl6ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NVU1RPTUlaRVIsIG5ld0N1c3RvbWl6ZXIsIG5ld0N1c3RvbWl6ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcl9DaGFuZ2VUcmFja2luZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2hhbmdlVHJhY2tpbmcgZ2V0Q2hhbmdlVHJhY2tpbmcoKQotCXsKLQkJcmV0dXJuIGNoYW5nZVRyYWNraW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nIG5ld0NoYW5nZVRyYWNraW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ2hhbmdlVHJhY2tpbmcgb2xkQ2hhbmdlVHJhY2tpbmcgPSBjaGFuZ2VUcmFja2luZzsKLQkJY2hhbmdlVHJhY2tpbmcgPSBuZXdDaGFuZ2VUcmFja2luZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORywgb2xkQ2hhbmdlVHJhY2tpbmcsIG5ld0NoYW5nZVRyYWNraW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENoYW5nZVRyYWNraW5nIDxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2hhbmdlVHJhY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VUcmFja2luZyhYbWxDaGFuZ2VUcmFja2luZyBuZXdDaGFuZ2VUcmFja2luZykKLQl7Ci0JCWlmIChuZXdDaGFuZ2VUcmFja2luZyAhPSBjaGFuZ2VUcmFja2luZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2hhbmdlVHJhY2tpbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2hhbmdlVHJhY2tpbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDaGFuZ2VUcmFja2luZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDaGFuZ2VUcmFja2luZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DSEFOR0VfVFJBQ0tJTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2hhbmdlVHJhY2tpbmcobmV3Q2hhbmdlVHJhY2tpbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORywgbmV3Q2hhbmdlVHJhY2tpbmcsIG5ld0NoYW5nZVRyYWNraW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FjaGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhY2hlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDYWNoZShYbWxDYWNoZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVIb2xkZXJfQ2FjaGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENhY2hlIGdldENhY2hlKCkKLQl7Ci0JCXJldHVybiBjYWNoZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDYWNoZShYbWxDYWNoZSBuZXdDYWNoZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENhY2hlIG9sZENhY2hlID0gY2FjaGU7Ci0JCWNhY2hlID0gbmV3Q2FjaGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRSwgb2xkQ2FjaGUsIG5ld0NhY2hlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENhY2hlIDxlbT5DYWNoZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhY2hlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FjaGUoWG1sQ2FjaGUgbmV3Q2FjaGUpCi0JewotCQlpZiAobmV3Q2FjaGUgIT0gY2FjaGUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNhY2hlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNhY2hlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDYWNoZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDYWNoZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDYWNoZShuZXdDYWNoZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEUsIG5ld0NhY2hlLCBuZXdDYWNoZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBDaGVja2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCi0JICogQHNlZSAjc2V0RXhpc3RlbmNlQ2hlY2tpbmcoRXhpc3RlbmNlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVIb2xkZXJfRXhpc3RlbmNlQ2hlY2tpbmcoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeGlzdGVuY2VUeXBlIGdldEV4aXN0ZW5jZUNoZWNraW5nKCkKLQl7Ci0JCXJldHVybiBleGlzdGVuY2VDaGVja2luZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEV4aXN0ZW5jZUNoZWNraW5nIDxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZQotCSAqIEBzZWUgI2dldEV4aXN0ZW5jZUNoZWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhpc3RlbmNlQ2hlY2tpbmcoRXhpc3RlbmNlVHlwZSBuZXdFeGlzdGVuY2VDaGVja2luZykKLQl7Ci0JCUV4aXN0ZW5jZVR5cGUgb2xkRXhpc3RlbmNlQ2hlY2tpbmcgPSBleGlzdGVuY2VDaGVja2luZzsKLQkJZXhpc3RlbmNlQ2hlY2tpbmcgPSBuZXdFeGlzdGVuY2VDaGVja2luZyA9PSBudWxsID8gRVhJU1RFTkNFX0NIRUNLSU5HX0VERUZBVUxUIDogbmV3RXhpc3RlbmNlQ2hlY2tpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWElTVEVOQ0VfQ0hFQ0tJTkcsIG9sZEV4aXN0ZW5jZUNoZWNraW5nLCBleGlzdGVuY2VDaGVja2luZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX0NvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbENvbnZlcnRlcj4gZ2V0Q29udmVydGVycygpCi0JewotCQlpZiAoY29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQljb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbENvbnZlcnRlcj4oWG1sQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1R5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiBnZXRUeXBlQ29udmVydGVycygpCi0JewotCQlpZiAodHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJdHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4oWG1sVHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RZUEVfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9PYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCXsKLQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCW9iamVjdFR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfU3RydWN0Q29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChzdHJ1Y3RDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCXN0cnVjdENvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPihYbWxTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19TVFJVQ1RfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW1pc3RpYyBMb2NraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRPcHRpbWlzdGljTG9ja2luZyhYbWxPcHRpbWlzdGljTG9ja2luZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X09wdGltaXN0aWNMb2NraW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxPcHRpbWlzdGljTG9ja2luZyBnZXRPcHRpbWlzdGljTG9ja2luZygpCi0JewotCQlyZXR1cm4gb3B0aW1pc3RpY0xvY2tpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T3B0aW1pc3RpY0xvY2tpbmcoWG1sT3B0aW1pc3RpY0xvY2tpbmcgbmV3T3B0aW1pc3RpY0xvY2tpbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxPcHRpbWlzdGljTG9ja2luZyBvbGRPcHRpbWlzdGljTG9ja2luZyA9IG9wdGltaXN0aWNMb2NraW5nOwotCQlvcHRpbWlzdGljTG9ja2luZyA9IG5ld09wdGltaXN0aWNMb2NraW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fT1BUSU1JU1RJQ19MT0NLSU5HLCBvbGRPcHRpbWlzdGljTG9ja2luZywgbmV3T3B0aW1pc3RpY0xvY2tpbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0T3B0aW1pc3RpY0xvY2tpbmcgPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRPcHRpbWlzdGljTG9ja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wdGltaXN0aWNMb2NraW5nKFhtbE9wdGltaXN0aWNMb2NraW5nIG5ld09wdGltaXN0aWNMb2NraW5nKQotCXsKLQkJaWYgKG5ld09wdGltaXN0aWNMb2NraW5nICE9IG9wdGltaXN0aWNMb2NraW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChvcHRpbWlzdGljTG9ja2luZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvcHRpbWlzdGljTG9ja2luZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld09wdGltaXN0aWNMb2NraW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld09wdGltaXN0aWNMb2NraW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRPcHRpbWlzdGljTG9ja2luZyhuZXdPcHRpbWlzdGljTG9ja2luZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fT1BUSU1JU1RJQ19MT0NLSU5HLCBuZXdPcHRpbWlzdGljTG9ja2luZywgbmV3T3B0aW1pc3RpY0xvY2tpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvcHlQb2xpY3koWG1sQ29weVBvbGljeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X0NvcHlQb2xpY3koKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvcHlQb2xpY3kgZ2V0Q29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gY29weVBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb3B5UG9saWN5KFhtbENvcHlQb2xpY3kgbmV3Q29weVBvbGljeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENvcHlQb2xpY3kgb2xkQ29weVBvbGljeSA9IGNvcHlQb2xpY3k7Ci0JCWNvcHlQb2xpY3kgPSBuZXdDb3B5UG9saWN5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1ksIG9sZENvcHlQb2xpY3ksIG5ld0NvcHlQb2xpY3kpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q29weVBvbGljeSA8ZW0+Q29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weVBvbGljeShYbWxDb3B5UG9saWN5IG5ld0NvcHlQb2xpY3kpCi0JewotCQlpZiAobmV3Q29weVBvbGljeSAhPSBjb3B5UG9saWN5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvcHlQb2xpY3kpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29weVBvbGljeSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb3B5UG9saWN5KG5ld0NvcHlQb2xpY3ksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPUFlfUE9MSUNZLCBuZXdDb3B5UG9saWN5LCBuZXdDb3B5UG9saWN5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3ksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBvbGRJbnN0YW50aWF0aW9uQ29weVBvbGljeSA9IGluc3RhbnRpYXRpb25Db3B5UG9saWN5OwotCQlpbnN0YW50aWF0aW9uQ29weVBvbGljeSA9IG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgb2xkSW5zdGFudGlhdGlvbkNvcHlQb2xpY3ksIG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KQotCXsKLQkJaWYgKG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IGluc3RhbnRpYXRpb25Db3B5UG9saWN5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbnN0YW50aWF0aW9uQ29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbnN0YW50aWF0aW9uQ29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbG9uZSBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENsb25lQ29weVBvbGljeShYbWxDbG9uZUNvcHlQb2xpY3kpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV9DbG9uZUNvcHlQb2xpY3koKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENsb25lQ29weVBvbGljeSBnZXRDbG9uZUNvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIGNsb25lQ29weVBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDbG9uZUNvcHlQb2xpY3koWG1sQ2xvbmVDb3B5UG9saWN5IG5ld0Nsb25lQ29weVBvbGljeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENsb25lQ29weVBvbGljeSBvbGRDbG9uZUNvcHlQb2xpY3kgPSBjbG9uZUNvcHlQb2xpY3k7Ci0JCWNsb25lQ29weVBvbGljeSA9IG5ld0Nsb25lQ29weVBvbGljeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMT05FX0NPUFlfUE9MSUNZLCBvbGRDbG9uZUNvcHlQb2xpY3ksIG5ld0Nsb25lQ29weVBvbGljeSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRDbG9uZUNvcHlQb2xpY3kgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xvbmVDb3B5UG9saWN5KFhtbENsb25lQ29weVBvbGljeSBuZXdDbG9uZUNvcHlQb2xpY3kpCi0JewotCQlpZiAobmV3Q2xvbmVDb3B5UG9saWN5ICE9IGNsb25lQ29weVBvbGljeSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2xvbmVDb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNsb25lQ29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q2xvbmVDb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Nsb25lQ29weVBvbGljeSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDbG9uZUNvcHlQb2xpY3kobmV3Q2xvbmVDb3B5UG9saWN5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWSwgbmV3Q2xvbmVDb3B5UG9saWN5LCBuZXdDbG9uZUNvcHlQb2xpY3kpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeT4gZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQl7Ci0JCWlmIChuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPT0gbnVsbCkKLQkJewotCQkJbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+KFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVMpOwotCQl9Ci0JCXJldHVybiBuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5XzFfMV9QcmltYXJ5S2V5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQcmltYXJ5S2V5IGdldFByaW1hcnlLZXkoKQotCXsKLQkJcmV0dXJuIHByaW1hcnlLZXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJpbWFyeUtleShYbWxQcmltYXJ5S2V5IG5ld1ByaW1hcnlLZXksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQcmltYXJ5S2V5IG9sZFByaW1hcnlLZXkgPSBwcmltYXJ5S2V5OwotCQlwcmltYXJ5S2V5ID0gbmV3UHJpbWFyeUtleTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZLCBvbGRQcmltYXJ5S2V5LCBuZXdQcmltYXJ5S2V5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJpbWFyeUtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSBuZXdQcmltYXJ5S2V5KQotCXsKLQkJaWYgKG5ld1ByaW1hcnlLZXkgIT0gcHJpbWFyeUtleSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJpbWFyeUtleSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwcmltYXJ5S2V5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmltYXJ5S2V5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ByaW1hcnlLZXkpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJpbWFyeUtleShuZXdQcmltYXJ5S2V5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWSwgbmV3UHJpbWFyeUtleSwgbmV3UHJpbWFyeUtleSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlIEludGVyY2VwdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2FjaGVJbnRlcmNlcHRvcihYbWxDbGFzc1JlZmVyZW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMF9DYWNoZUludGVyY2VwdG9yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDbGFzc1JlZmVyZW5jZSBnZXRDYWNoZUludGVyY2VwdG9yKCkKLQl7Ci0JCXJldHVybiBjYWNoZUludGVyY2VwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q2FjaGVJbnRlcmNlcHRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIG9sZENhY2hlSW50ZXJjZXB0b3IgPSBjYWNoZUludGVyY2VwdG9yOwotCQljYWNoZUludGVyY2VwdG9yID0gbmV3Q2FjaGVJbnRlcmNlcHRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFX0lOVEVSQ0VQVE9SLCBvbGRDYWNoZUludGVyY2VwdG9yLCBuZXdDYWNoZUludGVyY2VwdG9yKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENhY2hlSW50ZXJjZXB0b3IgPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2FjaGVJbnRlcmNlcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q2FjaGVJbnRlcmNlcHRvcikKLQl7Ci0JCWlmIChuZXdDYWNoZUludGVyY2VwdG9yICE9IGNhY2hlSW50ZXJjZXB0b3IpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNhY2hlSW50ZXJjZXB0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2FjaGVJbnRlcmNlcHRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRV9JTlRFUkNFUFRPUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q2FjaGVJbnRlcmNlcHRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDYWNoZUludGVyY2VwdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFX0lOVEVSQ0VQVE9SLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENhY2hlSW50ZXJjZXB0b3IobmV3Q2FjaGVJbnRlcmNlcHRvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5URVJDRVBUT1IsIG5ld0NhY2hlSW50ZXJjZXB0b3IsIG5ld0NhY2hlSW50ZXJjZXB0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RdWVyeSBSZWRpcmVjdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFF1ZXJ5UmVkaXJlY3RvcnMoWG1sUXVlcnlSZWRpcmVjdG9ycykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMF9RdWVyeVJlZGlyZWN0b3JzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxRdWVyeVJlZGlyZWN0b3JzIGdldFF1ZXJ5UmVkaXJlY3RvcnMoKQotCXsKLQkJcmV0dXJuIHF1ZXJ5UmVkaXJlY3RvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UXVlcnlSZWRpcmVjdG9ycyhYbWxRdWVyeVJlZGlyZWN0b3JzIG5ld1F1ZXJ5UmVkaXJlY3RvcnMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxRdWVyeVJlZGlyZWN0b3JzIG9sZFF1ZXJ5UmVkaXJlY3RvcnMgPSBxdWVyeVJlZGlyZWN0b3JzOwotCQlxdWVyeVJlZGlyZWN0b3JzID0gbmV3UXVlcnlSZWRpcmVjdG9yczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1FVRVJZX1JFRElSRUNUT1JTLCBvbGRRdWVyeVJlZGlyZWN0b3JzLCBuZXdRdWVyeVJlZGlyZWN0b3JzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFF1ZXJ5UmVkaXJlY3RvcnMgPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UXVlcnlSZWRpcmVjdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5UmVkaXJlY3RvcnMoWG1sUXVlcnlSZWRpcmVjdG9ycyBuZXdRdWVyeVJlZGlyZWN0b3JzKQotCXsKLQkJaWYgKG5ld1F1ZXJ5UmVkaXJlY3RvcnMgIT0gcXVlcnlSZWRpcmVjdG9ycykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocXVlcnlSZWRpcmVjdG9ycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClxdWVyeVJlZGlyZWN0b3JzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1FVRVJZX1JFRElSRUNUT1JTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdRdWVyeVJlZGlyZWN0b3JzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1F1ZXJ5UmVkaXJlY3RvcnMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUVVFUllfUkVESVJFQ1RPUlMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UXVlcnlSZWRpcmVjdG9ycyhuZXdRdWVyeVJlZGlyZWN0b3JzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19RVUVSWV9SRURJUkVDVE9SUywgbmV3UXVlcnlSZWRpcmVjdG9ycywgbmV3UXVlcnlSZWRpcmVjdG9ycykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmV0Y2ggR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmV0Y2ggR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2ggR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMV9GZXRjaEdyb3VwcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sRmV0Y2hHcm91cD4gZ2V0RmV0Y2hHcm91cHMoKQotCXsKLQkJaWYgKGZldGNoR3JvdXBzID09IG51bGwpCi0JCXsKLQkJCWZldGNoR3JvdXBzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEZldGNoR3JvdXA+KFhtbEZldGNoR3JvdXAuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19GRVRDSF9HUk9VUFMpOwotCQl9Ci0JCXJldHVybiBmZXRjaEdyb3VwczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzcyBFeHRyYWN0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBFeHRyYWN0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENsYXNzRXh0cmFjdG9yKFhtbENsYXNzUmVmZXJlbmNlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8xX0NsYXNzRXh0cmFjdG9yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDbGFzc1JlZmVyZW5jZSBnZXRDbGFzc0V4dHJhY3RvcigpCi0JewotCQlyZXR1cm4gY2xhc3NFeHRyYWN0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2xhc3NFeHRyYWN0b3IoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q2xhc3NFeHRyYWN0b3IsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDbGFzc1JlZmVyZW5jZSBvbGRDbGFzc0V4dHJhY3RvciA9IGNsYXNzRXh0cmFjdG9yOwotCQljbGFzc0V4dHJhY3RvciA9IG5ld0NsYXNzRXh0cmFjdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xBU1NfRVhUUkFDVE9SLCBvbGRDbGFzc0V4dHJhY3RvciwgbmV3Q2xhc3NFeHRyYWN0b3IpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2xhc3NFeHRyYWN0b3IgPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgRXh0cmFjdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDbGFzc0V4dHJhY3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzRXh0cmFjdG9yKFhtbENsYXNzUmVmZXJlbmNlIG5ld0NsYXNzRXh0cmFjdG9yKQotCXsKLQkJaWYgKG5ld0NsYXNzRXh0cmFjdG9yICE9IGNsYXNzRXh0cmFjdG9yKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjbGFzc0V4dHJhY3RvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljbGFzc0V4dHJhY3RvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTEFTU19FWFRSQUNUT1IsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NsYXNzRXh0cmFjdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NsYXNzRXh0cmFjdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMQVNTX0VYVFJBQ1RPUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDbGFzc0V4dHJhY3RvcihuZXdDbGFzc0V4dHJhY3RvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xBU1NfRVhUUkFDVE9SLCBuZXdDbGFzc0V4dHJhY3RvciwgbmV3Q2xhc3NFeHRyYWN0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJlbnQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJlbnQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcmVudENsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMV9QYXJlbnRDbGFzcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudENsYXNzKCkKLQl7Ci0JCXJldHVybiBwYXJlbnRDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFBhcmVudENsYXNzIDxlbT5QYXJlbnQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRDbGFzcyhTdHJpbmcgbmV3UGFyZW50Q2xhc3MpCi0JewotCQlTdHJpbmcgb2xkUGFyZW50Q2xhc3MgPSBwYXJlbnRDbGFzczsKLQkJcGFyZW50Q2xhc3MgPSBuZXdQYXJlbnRDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUkVOVF9DTEFTUywgb2xkUGFyZW50Q2xhc3MsIHBhcmVudENsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV9FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQl7Ci0JCXJldHVybiBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKEJvb2xlYW4gbmV3RXhjbHVkZURlZmF1bHRNYXBwaW5ncykKLQl7Ci0JCUJvb2xlYW4gb2xkRXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3M7Ci0JCWV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPSBuZXdFeGNsdWRlRGVmYXVsdE1hcHBpbmdzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTLCBvbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzLCBleGNsdWRlRGVmYXVsdE1hcHBpbmdzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmltYXJ5S2V5KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5URVJDRVBUT1I6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2FjaGVJbnRlcmNlcHRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXJldHVybiBiYXNpY1NldFF1ZXJ5UmVkaXJlY3RvcnMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRkVUQ0hfR1JPVVBTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RmV0Y2hHcm91cHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xBU1NfRVhUUkFDVE9SOgotCQkJCXJldHVybiBiYXNpY1NldENsYXNzRXh0cmFjdG9yKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDdXN0b21pemVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HOgotCQkJCXJldHVybiBiYXNpY1NldENoYW5nZVRyYWNraW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2FjaGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0T3B0aW1pc3RpY0xvY2tpbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRDb3B5UG9saWN5KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMT05FX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBiYXNpY1NldENsb25lQ29weVBvbGljeShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWToKLQkJCQlyZXR1cm4gZ2V0UHJpbWFyeUtleSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5URVJDRVBUT1I6Ci0JCQkJcmV0dXJuIGdldENhY2hlSW50ZXJjZXB0b3IoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXJldHVybiBnZXRRdWVyeVJlZGlyZWN0b3JzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRkVUQ0hfR1JPVVBTOgotCQkJCXJldHVybiBnZXRGZXRjaEdyb3VwcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xBU1NfRVhUUkFDVE9SOgotCQkJCXJldHVybiBnZXRDbGFzc0V4dHJhY3RvcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSRU5UX0NMQVNTOgotCQkJCXJldHVybiBnZXRQYXJlbnRDbGFzcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVBRF9PTkxZOgotCQkJCXJldHVybiBnZXRSZWFkT25seSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUjoKLQkJCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HOgotCQkJCXJldHVybiBnZXRDaGFuZ2VUcmFja2luZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU6Ci0JCQkJcmV0dXJuIGdldENhY2hlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWElTVEVOQ0VfQ0hFQ0tJTkc6Ci0JCQkJcmV0dXJuIGdldEV4aXN0ZW5jZUNoZWNraW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldFN0cnVjdENvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkc6Ci0JCQkJcmV0dXJuIGdldE9wdGltaXN0aWNMb2NraW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gZ2V0Q29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMT05FX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBnZXRDbG9uZUNvcHlQb2xpY3koKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZOgotCQkJCXNldFByaW1hcnlLZXkoKFhtbFByaW1hcnlLZXkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFX0lOVEVSQ0VQVE9SOgotCQkJCXNldENhY2hlSW50ZXJjZXB0b3IoKFhtbENsYXNzUmVmZXJlbmNlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19RVUVSWV9SRURJUkVDVE9SUzoKLQkJCQlzZXRRdWVyeVJlZGlyZWN0b3JzKChYbWxRdWVyeVJlZGlyZWN0b3JzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19GRVRDSF9HUk9VUFM6Ci0JCQkJZ2V0RmV0Y2hHcm91cHMoKS5jbGVhcigpOwotCQkJCWdldEZldGNoR3JvdXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxGZXRjaEdyb3VwPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xBU1NfRVhUUkFDVE9SOgotCQkJCXNldENsYXNzRXh0cmFjdG9yKChYbWxDbGFzc1JlZmVyZW5jZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSRU5UX0NMQVNTOgotCQkJCXNldFBhcmVudENsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JFQURfT05MWToKLQkJCQlzZXRSZWFkT25seSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUjoKLQkJCQlzZXRDdXN0b21pemVyKChYbWxDbGFzc1JlZmVyZW5jZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HOgotCQkJCXNldENoYW5nZVRyYWNraW5nKChYbWxDaGFuZ2VUcmFja2luZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU6Ci0JCQkJc2V0Q2FjaGUoKFhtbENhY2hlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWElTVEVOQ0VfQ0hFQ0tJTkc6Ci0JCQkJc2V0RXhpc3RlbmNlQ2hlY2tpbmcoKEV4aXN0ZW5jZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxPYmplY3RUeXBlQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sU3RydWN0Q29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORzoKLQkJCQlzZXRPcHRpbWlzdGljTG9ja2luZygoWG1sT3B0aW1pc3RpY0xvY2tpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPUFlfUE9MSUNZOgotCQkJCXNldENvcHlQb2xpY3koKFhtbENvcHlQb2xpY3kpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6Ci0JCQkJc2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlzZXRDbG9uZUNvcHlQb2xpY3koKFhtbENsb25lQ29weVBvbGljeSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgotCQkJCXNldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZOgotCQkJCXNldFByaW1hcnlLZXkoKFhtbFByaW1hcnlLZXkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5URVJDRVBUT1I6Ci0JCQkJc2V0Q2FjaGVJbnRlcmNlcHRvcigoWG1sQ2xhc3NSZWZlcmVuY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUVVFUllfUkVESVJFQ1RPUlM6Ci0JCQkJc2V0UXVlcnlSZWRpcmVjdG9ycygoWG1sUXVlcnlSZWRpcmVjdG9ycyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0ZFVENIX0dST1VQUzoKLQkJCQlnZXRGZXRjaEdyb3VwcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xBU1NfRVhUUkFDVE9SOgotCQkJCXNldENsYXNzRXh0cmFjdG9yKChYbWxDbGFzc1JlZmVyZW5jZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QQVJFTlRfQ0xBU1M6Ci0JCQkJc2V0UGFyZW50Q2xhc3MoUEFSRU5UX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRUFEX09OTFk6Ci0JCQkJc2V0UmVhZE9ubHkoUkVBRF9PTkxZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DVVNUT01JWkVSOgotCQkJCXNldEN1c3RvbWl6ZXIoKFhtbENsYXNzUmVmZXJlbmNlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORzoKLQkJCQlzZXRDaGFuZ2VUcmFja2luZygoWG1sQ2hhbmdlVHJhY2tpbmcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU6Ci0JCQkJc2V0Q2FjaGUoKFhtbENhY2hlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYSVNURU5DRV9DSEVDS0lORzoKLQkJCQlzZXRFeGlzdGVuY2VDaGVja2luZyhFWElTVEVOQ0VfQ0hFQ0tJTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORzoKLQkJCQlzZXRPcHRpbWlzdGljTG9ja2luZygoWG1sT3B0aW1pc3RpY0xvY2tpbmcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1k6Ci0JCQkJc2V0Q29weVBvbGljeSgoWG1sQ29weVBvbGljeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KChYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlzZXRDbG9uZUNvcHlQb2xpY3koKFhtbENsb25lQ29weVBvbGljeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWToKLQkJCQlyZXR1cm4gcHJpbWFyeUtleSAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5URVJDRVBUT1I6Ci0JCQkJcmV0dXJuIGNhY2hlSW50ZXJjZXB0b3IgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXJldHVybiBxdWVyeVJlZGlyZWN0b3JzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRkVUQ0hfR1JPVVBTOgotCQkJCXJldHVybiBmZXRjaEdyb3VwcyAhPSBudWxsICYmICFmZXRjaEdyb3Vwcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTEFTU19FWFRSQUNUT1I6Ci0JCQkJcmV0dXJuIGNsYXNzRXh0cmFjdG9yICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QQVJFTlRfQ0xBU1M6Ci0JCQkJcmV0dXJuIFBBUkVOVF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gcGFyZW50Q2xhc3MgIT0gbnVsbCA6ICFQQVJFTlRfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKHBhcmVudENsYXNzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JFQURfT05MWToKLQkJCQlyZXR1cm4gUkVBRF9PTkxZX0VERUZBVUxUID09IG51bGwgPyByZWFkT25seSAhPSBudWxsIDogIVJFQURfT05MWV9FREVGQVVMVC5lcXVhbHMocmVhZE9ubHkpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUjoKLQkJCQlyZXR1cm4gY3VzdG9taXplciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HOgotCQkJCXJldHVybiBjaGFuZ2VUcmFja2luZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU6Ci0JCQkJcmV0dXJuIGNhY2hlICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWElTVEVOQ0VfQ0hFQ0tJTkc6Ci0JCQkJcmV0dXJuIGV4aXN0ZW5jZUNoZWNraW5nICE9IEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhY29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIW9iamVjdFR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXN0cnVjdENvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCXJldHVybiBuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgIT0gbnVsbCAmJiAhbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkc6Ci0JCQkJcmV0dXJuIG9wdGltaXN0aWNMb2NraW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gY29weVBvbGljeSAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMT05FX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBjbG9uZUNvcHlQb2xpY3kgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUID09IG51bGwgPyBleGNsdWRlRGVmYXVsdE1hcHBpbmdzICE9IG51bGwgOiAhRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxULmVxdWFscyhleGNsdWRlRGVmYXVsdE1hcHBpbmdzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5XzFfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5YTUxfRU5USVRZXzExX19QUklNQVJZX0tFWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5URVJDRVBUT1I6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9FTlRJVFlfMjBfX0NBQ0hFX0lOVEVSQ0VQVE9SOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1FVRVJZX1JFRElSRUNUT1JTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfRU5USVRZXzIwX19RVUVSWV9SRURJUkVDVE9SUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19GRVRDSF9HUk9VUFM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9DT05UQUlORVJfMjFfX0ZFVENIX0dST1VQUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xBU1NfRVhUUkFDVE9SOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRU5USVRZXzIxX19DTEFTU19FWFRSQUNUT1I7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSRU5UX0NMQVNTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRU5USVRZXzIxX19QQVJFTlRfQ0xBU1M7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUmVhZE9ubHkuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRUFEX09OTFk6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFQURfT05MWV9fUkVBRF9PTkxZOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEN1c3RvbWl6ZXJIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DVVNUT01JWkVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DVVNUT01JWkVSX0hPTERFUl9fQ1VTVE9NSVpFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUl9fQ0hBTkdFX1RSQUNLSU5HOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENhY2hlSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX0hPTERFUl9fQ0FDSEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhJU1RFTkNFX0NIRUNLSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0VYSVNURU5DRV9DSEVDS0lORzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NUUlVDVF9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5XzFfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5YTUxfRU5USVRZXzExX19QUklNQVJZX0tFWTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9FTlRJVFlfMjBfX0NBQ0hFX0lOVEVSQ0VQVE9SOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFX0lOVEVSQ0VQVE9SOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfRU5USVRZXzIwX19RVUVSWV9SRURJUkVDVE9SUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19RVUVSWV9SRURJUkVDVE9SUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX0NPTlRBSU5FUl8yMV9fRkVUQ0hfR1JPVVBTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0ZFVENIX0dST1VQUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9FTlRJVFlfMjFfX0NMQVNTX0VYVFJBQ1RPUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTEFTU19FWFRSQUNUT1I7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9FTlRJVFlfMjFfX1BBUkVOVF9DTEFTUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QQVJFTlRfQ0xBU1M7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUmVhZE9ubHkuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkVBRF9PTkxZX19SRUFEX09OTFk6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVBRF9PTkxZOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEN1c3RvbWl6ZXJIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9IT0xERVJfX0NVU1RPTUlaRVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSX19DSEFOR0VfVFJBQ0tJTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENhY2hlSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX0hPTERFUl9fQ0FDSEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX0hPTERFUl9fRVhJU1RFTkNFX0NIRUNLSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYSVNURU5DRV9DSEVDS0lORzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocGFyZW50Q2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcmVudENsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWFkT25seTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVhZE9ubHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4aXN0ZW5jZUNoZWNraW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGlzdGVuY2VDaGVja2luZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXhjbHVkZURlZmF1bHRNYXBwaW5nczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXhjbHVkZURlZmF1bHRNYXBwaW5ncyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVhZE9ubHlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eSgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZFBhcmVudENsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhY2hlYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWV0YWRhdGFDb21wbGV0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUmVhZE9ubHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEV4aXN0ZW5jZUNoZWNraW5nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpLAotCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ3VzdG9taXplclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2hhbmdlVHJhY2tpbmdUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTZWNvbmRhcnlUYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZElkQ2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByaW1hcnlLZXlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEluaGVyaXRhbmNlVHJhbnNsYXRvcigpLAotCQkJYnVpbGREaXNjcmltaW5hdG9yVmFsdWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZENsYXNzRXh0cmFjdG9yVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcHRpbWlzdGljTG9ja2luZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2FjaGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhY2hlSW50ZXJjZXB0b3JUcmFuc2xhdG9yKCksCi0JCQlidWlsZEZldGNoR3JvdXBzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29weVBvbGljeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSW5zdGFudGlhdGlvbkNveXBQb2xpY3lUcmFuc2xhdG9yKCksCi0JCQlidWlsZENsb25lQ29weVBvbGljeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAotCQkJYnVpbGROYW1lZFF1ZXJ5VHJhbnNsYXRvcigpLAotCQkJYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5VHJhbnNsYXRvcigpLAotCQkJYnVpbGROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRTcWxSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRRdWVyeVJlZGlyZWN0b3JzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFeGNsdWRlRGVmYXVsdExpc3RlbmVyc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQlidWlsZEVudGl0eUxpc3RlbmVyc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJlUGVyc2lzdFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUG9zdFBlcnNpc3RUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByZVJlbW92ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUG9zdFJlbW92ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJlVXBkYXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQb3N0VXBkYXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQb3N0TG9hZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJQXR0cmlidXRlcy5idWlsZFRyYW5zbGF0b3IoKX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEN1c3RvbWl6ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ2xhc3NSZWZlcmVuY2UuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ3VzdG9taXplckhvbGRlcl9DdXN0b21pemVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDaGFuZ2VUcmFja2luZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDaGFuZ2VUcmFja2luZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcmltYXJ5S2V5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByaW1hcnlLZXkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMV8xLlBSSU1BUllfS0VZLCBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMV8xX1ByaW1hcnlLZXkoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENsYXNzRXh0cmFjdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENsYXNzUmVmZXJlbmNlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5DTEFTU19FWFRSQUNUT1IsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzFfQ2xhc3NFeHRyYWN0b3IoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9wdGltaXN0aWNMb2NraW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbE9wdGltaXN0aWNMb2NraW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5PUFRJTUlTVElDX0xPQ0tJTkcsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X09wdGltaXN0aWNMb2NraW5nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYWNoZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDYWNoZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVIb2xkZXJfQ2FjaGUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhY2hlSW50ZXJjZXB0b3JUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ2xhc3NSZWZlcmVuY2UuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLkNBQ0hFX0lOVEVSQ0VQVE9SLCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8wX0NhY2hlSW50ZXJjZXB0b3IoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEZldGNoR3JvdXBzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEZldGNoR3JvdXAuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkZFVENIX0dST1VQLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMV9GZXRjaEdyb3VwcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUXVlcnlSZWRpcmVjdG9yc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxRdWVyeVJlZGlyZWN0b3JzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5RVUVSWV9SRURJUkVDVE9SUywgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfMF9RdWVyeVJlZGlyZWN0b3JzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxTdHJ1Y3RDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb3B5UG9saWN5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPUFlfUE9MSUNZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9Db3B5UG9saWN5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJbnN0YW50aWF0aW9uQ295cFBvbGljeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENsb25lQ29weVBvbGljeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDbG9uZUNvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNMT05FX0NPUFlfUE9MSUNZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9DbG9uZUNvcHlQb2xpY3koKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJlYWRPbmx5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlJFQURfT05MWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxSZWFkT25seV9SZWFkT25seSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeGlzdGVuY2VDaGVja2luZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVIb2xkZXJfRXhpc3RlbmNlQ2hlY2tpbmcoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRXhjbHVkZURlZmF1bHRNYXBwaW5nc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWENMVURFX0RFRkFVTFRfTUFQUElOR1MsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFBhcmVudENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLlBBUkVOVF9DTEFTUywgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfMV9QYXJlbnRDbGFzcygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHlNYXBwaW5ncy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHlNYXBwaW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmFhNThhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW50aXR5TWFwcGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVSb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5TcWxSZXN1bHRTZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmsxXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzIuRWNsaXBzZUxpbmsxXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW50aXR5IE1hcHBpbmdzPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxFbnRpdHlNYXBwaW5ncyBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyBpbXBsZW1lbnRzIFhtbENvbnZlcnRlcnNIb2xkZXIsIFhtbFF1ZXJ5Q29udGFpbmVyCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVycygpIDxlbT5Db252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxDb252ZXJ0ZXI+IGNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlQ29udmVydGVycygpIDxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiB0eXBlQ29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBvYmplY3RUeXBlQ29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdENvbnZlcnRlcnMoKSA8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gc3RydWN0Q29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpIDxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeT4gbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEVudGl0eU1hcHBpbmdzKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfRU5USVRZX01BUFBJTkdTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX0NvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbENvbnZlcnRlcj4gZ2V0Q29udmVydGVycygpCi0JewotCQlpZiAoY29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQljb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbENvbnZlcnRlcj4oWG1sQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1R5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiBnZXRUeXBlQ29udmVydGVycygpCi0JewotCQlpZiAodHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJdHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4oWG1sVHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RZUEVfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9PYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCXsKLQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCW9iamVjdFR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfU3RydWN0Q29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChzdHJ1Y3RDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCXN0cnVjdENvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPihYbWxTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TVFJVQ1RfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+IGdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JewotCQlpZiAobmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzID09IG51bGwpCi0JCXsKLQkJCW5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PihYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTKTsKLQkJfQotCQlyZXR1cm4gbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3RydWN0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldENvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0U3RydWN0Q29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCXJldHVybiBnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DT05WRVJURVJTOgotCQkJCWdldENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbENvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFR5cGVDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFN0cnVjdENvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gY29udmVydGVycyAhPSBudWxsICYmICFjb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhdHlwZUNvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhb2JqZWN0VHlwZUNvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnMgIT0gbnVsbCAmJiAhc3RydWN0Q29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIG5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1NUUlVDVF9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZlcnNpb24gLT4gc2NoZW1hIGxvY2F0aW9uIG1hcHBpbmcgKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZXNwYWNlID0gRWNsaXBzZUxpbmsuU0NIRU1BX05BTUVTUEFDRTsKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiB2ZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zID0gYnVpbGRWZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBidWlsZFZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMoKSB7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCW1hcC5wdXQoRWNsaXBzZUxpbmsuU0NIRU1BX1ZFUlNJT04sIEVjbGlwc2VMaW5rLlNDSEVNQV9MT0NBVElPTik7Ci0JCW1hcC5wdXQoRWNsaXBzZUxpbmsxXzEuU0NIRU1BX1ZFUlNJT04sIEVjbGlwc2VMaW5rMV8xLlNDSEVNQV9MT0NBVElPTik7Ci0JCW1hcC5wdXQoRWNsaXBzZUxpbmsxXzIuU0NIRU1BX1ZFUlNJT04sIEVjbGlwc2VMaW5rMV8yLlNDSEVNQV9MT0NBVElPTik7Ci0JCW1hcC5wdXQoRWNsaXBzZUxpbmsyXzAuU0NIRU1BX1ZFUlNJT04sIEVjbGlwc2VMaW5rMl8wLlNDSEVNQV9MT0NBVElPTik7Ci0JCW1hcC5wdXQoRWNsaXBzZUxpbmsyXzEuU0NIRU1BX1ZFUlNJT04sIEVjbGlwc2VMaW5rMl8xLlNDSEVNQV9MT0NBVElPTik7Ci0JCXJldHVybiBtYXA7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2NoZW1hTG9jYXRpb25Gb3JWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiB2ZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zLmdldCh2ZXJzaW9uKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBST09UX1RSQU5TTEFUT1IgPSBidWlsZFJvb3RUcmFuc2xhdG9yKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gUk9PVF9UUkFOU0xBVE9SOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUm9vdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUm9vdFRyYW5zbGF0b3IoCi0JCQkJSlBBLkVOVElUWV9NQVBQSU5HUywKLQkJCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzKCksCi0JCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRWZXJzaW9uVHJhbnNsYXRvcih2ZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zKSwKLQkJCWJ1aWxkTmFtZXNwYWNlVHJhbnNsYXRvcihuYW1lc3BhY2UpLAotCQkJYnVpbGRTY2hlbWFOYW1lc3BhY2VUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNjaGVtYUxvY2F0aW9uVHJhbnNsYXRvcihuYW1lc3BhY2UsIHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMpLAotCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKLQkJCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmJ1aWxkVHJhbnNsYXRvcihKUEEuUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSksCi0JCQlidWlsZFBhY2thZ2VUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNjaGVtYVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpLAotCQkJWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCkpLAotCQkJWG1sVHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9UeXBlQ29udmVydGVycygpKSwKLQkJCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkpLAotCQkJWG1sU3RydWN0Q29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfU3RydWN0Q29udmVydGVycygpKSwKLQkJCVhtbFNlcXVlbmNlR2VuZXJhdG9yLmJ1aWxkVHJhbnNsYXRvcihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19TZXF1ZW5jZUdlbmVyYXRvcnMoKSksCi0JCQlYbWxUYWJsZUdlbmVyYXRvci5idWlsZFRyYW5zbGF0b3IoSlBBLlRBQkxFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfVGFibGVHZW5lcmF0b3JzKCkpLAotCQkJWG1sTmFtZWRRdWVyeS5idWlsZFRyYW5zbGF0b3IoSlBBLk5BTUVEX1FVRVJZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFF1ZXJpZXMoKSksCi0JCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5LmJ1aWxkVHJhbnNsYXRvcihKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZE5hdGl2ZVF1ZXJpZXMoKSksCi0JCQlYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpKSwKLQkJCVNxbFJlc3VsdFNldE1hcHBpbmcuYnVpbGRUcmFuc2xhdG9yKEpQQS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19TcWxSZXN1bHRTZXRNYXBwaW5ncygpKSwKLQkJCVhtbE1hcHBlZFN1cGVyY2xhc3MuYnVpbGRUcmFuc2xhdG9yKEpQQS5NQVBQRURfU1VQRVJDTEFTUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfTWFwcGVkU3VwZXJjbGFzc2VzKCkpLAotCQkJWG1sRW50aXR5LmJ1aWxkVHJhbnNsYXRvcihKUEEuRU5USVRZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19FbnRpdGllcygpKSwKLQkJCVhtbEVtYmVkZGFibGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5FTUJFRERBQkxFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19FbWJlZGRhYmxlcygpKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEZldGNoQXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEZldGNoQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNGRlMjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxGZXRjaEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoQXR0cmlidXRlXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRmV0Y2ggQXR0cmlidXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRmV0Y2hBdHRyaWJ1dGUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sRmV0Y2hBdHRyaWJ1dGUgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxGZXRjaEF0dHJpYnV0ZV8yXzEKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxGZXRjaEF0dHJpYnV0ZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0ZFVENIX0FUVFJJQlVURTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxGZXRjaEF0dHJpYnV0ZV8yXzFfTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hBdHRyaWJ1dGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0FUVFJJQlVURV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0FUVFJJQlVURV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9BVFRSSUJVVEVfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfQVRUUklCVVRFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9BVFRSSUJVVEVfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCQllbGVtZW50TmFtZSwKLQkJCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpfTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuTkFNRSwgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEZldGNoR3JvdXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRmV0Y2hHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTVhZTUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRmV0Y2hHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRmV0Y2ggR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEZldGNoR3JvdXAgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxGZXRjaEdyb3VwXzJfMQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvYWQoKSA8ZW0+TG9hZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9hZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIExPQURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9hZCgpIDxlbT5Mb2FkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2FkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBsb2FkID0gTE9BRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZXMoKSA8ZW0+QXR0cmlidXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sRmV0Y2hBdHRyaWJ1dGU+IGF0dHJpYnV0ZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRmV0Y2hHcm91cCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0ZFVENIX0dST1VQOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEZldGNoR3JvdXBfMl8xX05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXAjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxGZXRjaEF0dHJpYnV0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cF8yXzFfQXR0cmlidXRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sRmV0Y2hBdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKQotCXsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJewotCQkJYXR0cmlidXRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxGZXRjaEF0dHJpYnV0ZT4oWG1sRmV0Y2hBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX0FUVFJJQlVURVMpOwotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvYWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvYWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9hZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9hZChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwXzJfMV9Mb2FkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRMb2FkKCkKLQl7Ci0JCXJldHVybiBsb2FkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxGZXRjaEdyb3VwI2dldExvYWQgPGVtPkxvYWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvYWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvYWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2FkKEJvb2xlYW4gbmV3TG9hZCkKLQl7Ci0JCUJvb2xlYW4gb2xkTG9hZCA9IGxvYWQ7Ci0JCWxvYWQgPSBuZXdMb2FkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19MT0FELCBvbGRMb2FkLCBsb2FkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRBdHRyaWJ1dGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fTE9BRDoKLQkJCQlyZXR1cm4gZ2V0TG9hZCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19MT0FEOgotCQkJCXNldExvYWQoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxGZXRjaEF0dHJpYnV0ZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fTE9BRDoKLQkJCQlzZXRMb2FkKExPQURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX0xPQUQ6Ci0JCQkJcmV0dXJuIExPQURfRURFRkFVTFQgPT0gbnVsbCA/IGxvYWQgIT0gbnVsbCA6ICFMT0FEX0VERUZBVUxULmVxdWFscyhsb2FkKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gYXR0cmlidXRlcyAhPSBudWxsICYmICFhdHRyaWJ1dGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbG9hZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobG9hZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCQllbGVtZW50TmFtZSwKLQkJCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJCWJ1aWxkTG9hZFRyYW5zbGF0b3IoKSwKLQkJCQlidWlsZEF0dHJpYnV0ZXNUcmFuc2xhdG9yKCl9OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQXR0cmlidXRlc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxGZXRjaEF0dHJpYnV0ZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQVRUUklCVVRFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxGZXRjaEdyb3VwXzJfMV9BdHRyaWJ1dGVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRMb2FkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkZFVENIX0dST1VQX19MT0FELCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxGZXRjaEdyb3VwXzJfMV9Mb2FkKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbElkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbElkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOWRjYWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxJZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sSWRfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBJZDwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSWQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sSWQgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQgaW1wbGVtZW50cyBYbWxJZF8yXzEsIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIFhtbE11dGFibGUsIFhtbENvbnZlcnRpYmxlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVR5cGUgPSBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE11dGFibGUoKSA8ZW0+TXV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TXV0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIE1VVEFCTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXV0YWJsZSgpIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBtdXRhYmxlID0gTVVUQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcigpIDxlbT5Db252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbnZlcnRlciBjb252ZXJ0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlQ29udmVydGVyKCkgPGVtPlR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVHlwZUNvbnZlcnRlciB0eXBlQ29udmVydGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxPYmplY3RUeXBlQ29udmVydGVyIG9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKSA8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU3RydWN0Q29udmVydGVyIHN0cnVjdENvbnZlcnRlcjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0KCkgPGVtPkNvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydCgpIDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnQgPSBDT05WRVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbElkKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfSUQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSWRfMl8xX0F0dHJpYnV0ZVR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyBuZXdBdHRyaWJ1dGVUeXBlKQotCXsKLQkJU3RyaW5nIG9sZEF0dHJpYnV0ZVR5cGUgPSBhdHRyaWJ1dGVUeXBlOwotCQlhdHRyaWJ1dGVUeXBlID0gbmV3QXR0cmlidXRlVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQVRUUklCVVRFX1RZUEUsIG9sZEF0dHJpYnV0ZVR5cGUsIGF0dHJpYnV0ZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NdXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11dGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE11dGFibGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXV0YWJsZV9NdXRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRNdXRhYmxlKCkKLQl7Ci0JCXJldHVybiBtdXRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRNdXRhYmxlIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TXV0YWJsZShCb29sZWFuIG5ld011dGFibGUpCi0JewotCQlCb29sZWFuIG9sZE11dGFibGUgPSBtdXRhYmxlOwotCQltdXRhYmxlID0gbmV3TXV0YWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fTVVUQUJMRSwgb2xkTXV0YWJsZSwgbXV0YWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29udmVydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0KCkKLQl7Ci0JCXJldHVybiBjb252ZXJ0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRDb252ZXJ0IDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udmVydChTdHJpbmcgbmV3Q29udmVydCkKLQl7Ci0JCVN0cmluZyBvbGRDb252ZXJ0ID0gY29udmVydDsKLQkJY29udmVydCA9IG5ld0NvbnZlcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlQsIG9sZENvbnZlcnQsIGNvbnZlcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DdXN0b21Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkKLQl7Ci0JCXJldHVybiBjb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udmVydGVyKFhtbENvbnZlcnRlciBuZXdDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDb252ZXJ0ZXIgb2xkQ29udmVydGVyID0gY29udmVydGVyOwotCQljb252ZXJ0ZXIgPSBuZXdDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUiwgb2xkQ29udmVydGVyLCBuZXdDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRDb252ZXJ0ZXIgPGVtPkNvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyIG5ld0NvbnZlcnRlcikKLQl7Ci0JCWlmIChuZXdDb252ZXJ0ZXIgIT0gY29udmVydGVyKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbnZlcnRlcihuZXdDb252ZXJ0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVEVSLCBuZXdDb252ZXJ0ZXIsIG5ld0NvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIEN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBnZXRUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiB0eXBlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciBuZXdUeXBlQ29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVHlwZUNvbnZlcnRlciBvbGRUeXBlQ29udmVydGVyID0gdHlwZUNvbnZlcnRlcjsKLQkJdHlwZUNvbnZlcnRlciA9IG5ld1R5cGVDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSLCBvbGRUeXBlQ29udmVydGVyLCBuZXdUeXBlQ29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0VHlwZUNvbnZlcnRlciA8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyIG5ld1R5cGVDb252ZXJ0ZXIpCi0JewotCQlpZiAobmV3VHlwZUNvbnZlcnRlciAhPSB0eXBlQ29udmVydGVyKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0eXBlQ29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXR5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdUeXBlQ29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VHlwZUNvbnZlcnRlcihuZXdUeXBlQ29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSLCBuZXdUeXBlQ29udmVydGVyLCBuZXdUeXBlQ29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDdXN0b21Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9PYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxPYmplY3RUeXBlQ29udmVydGVyIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIG9sZE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvYmplY3RUeXBlQ29udmVydGVyOwotCQlvYmplY3RUeXBlQ29udmVydGVyID0gbmV3T2JqZWN0VHlwZUNvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBvbGRPYmplY3RUeXBlQ29udmVydGVyLCBuZXdPYmplY3RUeXBlQ29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlciA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikKLQl7Ci0JCWlmIChuZXdPYmplY3RUeXBlQ29udmVydGVyICE9IG9iamVjdFR5cGVDb252ZXJ0ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpb2JqZWN0VHlwZUNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdPYmplY3RUeXBlQ29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE9iamVjdFR5cGVDb252ZXJ0ZXIobmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIsIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ3VzdG9tQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFN0cnVjdENvbnZlcnRlciBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIG5ld1N0cnVjdENvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFN0cnVjdENvbnZlcnRlciBvbGRTdHJ1Y3RDb252ZXJ0ZXIgPSBzdHJ1Y3RDb252ZXJ0ZXI7Ci0JCXN0cnVjdENvbnZlcnRlciA9IG5ld1N0cnVjdENvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUiwgb2xkU3RydWN0Q29udmVydGVyLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRTdHJ1Y3RDb252ZXJ0ZXIgPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgbmV3U3RydWN0Q29udmVydGVyKQotCXsKLQkJaWYgKG5ld1N0cnVjdENvbnZlcnRlciAhPSBzdHJ1Y3RDb252ZXJ0ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHN0cnVjdENvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzdHJ1Y3RDb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19TVFJVQ1RfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U3RydWN0Q29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTdHJ1Y3RDb252ZXJ0ZXIobmV3U3RydWN0Q29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1NUUlVDVF9DT05WRVJURVIsIG5ld1N0cnVjdENvbnZlcnRlciwgbmV3U3RydWN0Q29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldENvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VHlwZUNvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldE9iamVjdFR5cGVDb252ZXJ0ZXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19NVVRBQkxFOgotCQkJCXJldHVybiBnZXRNdXRhYmxlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRUeXBlQ29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVDoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fTVVUQUJMRToKLQkJCQlzZXRNdXRhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUjoKLQkJCQlzZXRDb252ZXJ0ZXIoKFhtbENvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19UWVBFX0NPTlZFUlRFUjoKLQkJCQlzZXRUeXBlQ29udmVydGVyKChYbWxUeXBlQ29udmVydGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlzZXRPYmplY3RUeXBlQ29udmVydGVyKChYbWxPYmplY3RUeXBlQ29udmVydGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJc2V0U3RydWN0Q29udmVydGVyKChYbWxTdHJ1Y3RDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVDoKLQkJCQlzZXRDb252ZXJ0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZShBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX01VVEFCTEU6Ci0JCQkJc2V0TXV0YWJsZShNVVRBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUjoKLQkJCQlzZXRDb252ZXJ0ZXIoKFhtbENvbnZlcnRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldFR5cGVDb252ZXJ0ZXIoKFhtbFR5cGVDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0T2JqZWN0VHlwZUNvbnZlcnRlcigoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJc2V0U3RydWN0Q29udmVydGVyKChYbWxTdHJ1Y3RDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJUOgotCQkJCXNldENvbnZlcnQoQ09OVkVSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBhdHRyaWJ1dGVUeXBlICE9IG51bGwgOiAhQVRUUklCVVRFX1RZUEVfRURFRkFVTFQuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19NVVRBQkxFOgotCQkJCXJldHVybiBNVVRBQkxFX0VERUZBVUxUID09IG51bGwgPyBtdXRhYmxlICE9IG51bGwgOiAhTVVUQUJMRV9FREVGQVVMVC5lcXVhbHMobXV0YWJsZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gY29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiB0eXBlQ29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVDoKLQkJCQlyZXR1cm4gQ09OVkVSVF9FREVGQVVMVCA9PSBudWxsID8gY29udmVydCAhPSBudWxsIDogIUNPTlZFUlRfRURFRkFVTFQuZXF1YWxzKGNvbnZlcnQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxJZF8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfSURfMjFfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE11dGFibGUuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX01VVEFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VVEFCTEVfX01VVEFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxJZF8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0lEXzIxX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE11dGFibGUuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVUQUJMRV9fTVVUQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX01VVEFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdHRyaWJ1dGVUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdHRyaWJ1dGVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtdXRhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtdXRhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb252ZXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb252ZXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TXV0YWJsZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShFY2xpcHNlTGluay5NVVRBQkxFKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZShFY2xpcHNlTGluay5DT05WRVJUKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbElkKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZE11dGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZVR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRlbXBvcmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNdXRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk1VVEFCTEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTXV0YWJsZV9NdXRhYmxlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbnZlcnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfQ29udmVydCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9Db252ZXJ0ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX1R5cGVDb252ZXJ0ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9PYmplY3RUeXBlQ29udmVydGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sU3RydWN0Q29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxJZF8yXzFfQXR0cmlidXRlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzhjOGY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEluc3RhbnRpYXRpb24gUG9saWN5PC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7fTsKLQl9Ci0KLX0gLy8gWG1sSW5zdGFudGlhdGlvblBvbGljeQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luRmV0Y2guamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkZldGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NDc0OTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luRmV0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgSm9pbiBGZXRjaDwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2gjZ2V0Sm9pbkZldGNoIDxlbT5Kb2luIEZldGNoPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSm9pbkZldGNoIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbEpvaW5GZXRjaFR5cGUgZ2V0Sm9pbkZldGNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoI2dldEpvaW5GZXRjaCA8ZW0+Sm9pbiBGZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQotCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBqb2luLWZldGNoIGVsZW1lbnQuCi0JICovCi0JVGV4dFJhbmdlIGdldEpvaW5GZXRjaFRleHRSYW5nZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkZldGNoVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luRmV0Y2hUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NTdmZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luRmV0Y2hUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5YbWwgSm9pbiBGZXRjaCBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxKb2luRmV0Y2hUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBYbWxKb2luRmV0Y2hUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOTkVSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOTkVSX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JSU5ORVIoMCwgIklOTkVSIiwgIklOTkVSIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PVVRFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPVVRFUl9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU9VVEVSKDEsICJPVVRFUiIsICJPVVRFUiIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5ORVI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOTkVSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOTkVSCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5ORVJfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1VURVI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9VVEVSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09VVEVSCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VURVJfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlhtbCBKb2luIEZldGNoIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhtbEpvaW5GZXRjaFR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgWG1sSm9pbkZldGNoVHlwZVtdCi0JCXsKLQkJCUlOTkVSLAotCQkJT1VURVIsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFhtbEpvaW5GZXRjaFR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCVhtbEpvaW5GZXRjaFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCVhtbEpvaW5GZXRjaFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgSm9pbiBGZXRjaCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sSm9pbkZldGNoVHlwZSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBJTk5FUl9WQUxVRTogcmV0dXJuIElOTkVSOwotCQkJY2FzZSBPVVRFUl9WQUxVRTogcmV0dXJuIE9VVEVSOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBYbWxKb2luRmV0Y2hUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQotCXsKLQkgIHJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCi0JewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQkKLX0gLy9YbWxKb2luRmV0Y2hUeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFueVRvTWFueS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTljNjdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFueVRvTWFueS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvTWFueV8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFueSBUbyBNYW55PC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYW55VG9NYW55KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE1hbnlUb01hbnkgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSBpbXBsZW1lbnRzIFhtbE1hbnlUb01hbnlfMl8wLCBYbWxNYW55VG9NYW55XzJfMSwgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sSm9pbkZldGNoCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVyKCkgPGVtPkNvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29udmVydGVyIGNvbnZlcnRlcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVDb252ZXJ0ZXIoKSA8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUeXBlQ29udmVydGVyIHR5cGVDb252ZXJ0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdENvbnZlcnRlcigpIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxTdHJ1Y3RDb252ZXJ0ZXIgc3RydWN0Q29udmVydGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKSA8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlDb252ZXJ0KCkgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwS2V5Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUNvbnZlcnQoKSA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcEtleUNvbnZlcnQgPSBNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXRjaEZldGNoKCkgPGVtPkJhdGNoIEZldGNoPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQmF0Y2hGZXRjaCBiYXRjaEZldGNoOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVHlwZSA9IEFUVFJJQlVURV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxKb2luRmV0Y2hUeXBlIEpPSU5fRkVUQ0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pbkZldGNoKCkgPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEpvaW5GZXRjaFR5cGUgam9pbkZldGNoID0gSk9JTl9GRVRDSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxNYW55VG9NYW55KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTUFOWV9UT19NQU5ZOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpCi0JewotCQlyZXR1cm4gam9pbkZldGNoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2dldEpvaW5GZXRjaCA8ZW0+Sm9pbiBGZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQotCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlIG5ld0pvaW5GZXRjaCkKLQl7Ci0JCVhtbEpvaW5GZXRjaFR5cGUgb2xkSm9pbkZldGNoID0gam9pbkZldGNoOwotCQlqb2luRmV0Y2ggPSBuZXdKb2luRmV0Y2ggPT0gbnVsbCA/IEpPSU5fRkVUQ0hfRURFRkFVTFQgOiBuZXdKb2luRmV0Y2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19KT0lOX0ZFVENILCBvbGRKb2luRmV0Y2gsIGpvaW5GZXRjaCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29udmVydGVyKFhtbENvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX0NvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29udmVydGVyIGdldENvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gY29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgbmV3Q29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29udmVydGVyIG9sZENvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJY29udmVydGVyID0gbmV3Q29udmVydGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSLCBvbGRDb252ZXJ0ZXIsIG5ld0NvbnZlcnRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0Q29udmVydGVyIDxlbT5Db252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFhtbENvbnZlcnRlciBuZXdDb252ZXJ0ZXIpCi0JewotCQlpZiAobmV3Q29udmVydGVyICE9IGNvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbnZlcnRlcihuZXdDb252ZXJ0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NPTlZFUlRFUiwgbmV3Q29udmVydGVyLCBuZXdDb252ZXJ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX1R5cGVDb252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFR5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gdHlwZUNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgbmV3VHlwZUNvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgb2xkVHlwZUNvbnZlcnRlciA9IHR5cGVDb252ZXJ0ZXI7Ci0JCXR5cGVDb252ZXJ0ZXIgPSBuZXdUeXBlQ29udmVydGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVFlQRV9DT05WRVJURVIsIG9sZFR5cGVDb252ZXJ0ZXIsIG5ld1R5cGVDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2dldFR5cGVDb252ZXJ0ZXIgPGVtPlR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciBuZXdUeXBlQ29udmVydGVyKQotCXsKLQkJaWYgKG5ld1R5cGVDb252ZXJ0ZXIgIT0gdHlwZUNvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0eXBlQ29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUeXBlQ29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1R5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VHlwZUNvbnZlcnRlcihuZXdUeXBlQ29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUiwgbmV3VHlwZUNvbnZlcnRlciwgbmV3VHlwZUNvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBuZXdPYmplY3RUeXBlQ29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBvbGRPYmplY3RUeXBlQ29udmVydGVyID0gb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQkJb2JqZWN0VHlwZUNvbnZlcnRlciA9IG5ld09iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG9sZE9iamVjdFR5cGVDb252ZXJ0ZXIsIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2dldE9iamVjdFR5cGVDb252ZXJ0ZXIgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIpCi0JewotCQlpZiAobmV3T2JqZWN0VHlwZUNvbnZlcnRlciAhPSBvYmplY3RUeXBlQ29udmVydGVyKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChvYmplY3RUeXBlQ29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW9iamVjdFR5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdPYmplY3RUeXBlQ29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld09iamVjdFR5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE9iamVjdFR5cGVDb252ZXJ0ZXIobmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBuZXdPYmplY3RUeXBlQ29udmVydGVyLCBuZXdPYmplY3RUeXBlQ29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxTdHJ1Y3RDb252ZXJ0ZXIgZ2V0U3RydWN0Q29udmVydGVyKCkKLQl7Ci0JCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciBuZXdTdHJ1Y3RDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgb2xkU3RydWN0Q29udmVydGVyID0gc3RydWN0Q29udmVydGVyOwotCQlzdHJ1Y3RDb252ZXJ0ZXIgPSBuZXdTdHJ1Y3RDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSLCBvbGRTdHJ1Y3RDb252ZXJ0ZXIsIG5ld1N0cnVjdENvbnZlcnRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0U3RydWN0Q29udmVydGVyIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIG5ld1N0cnVjdENvbnZlcnRlcikKLQl7Ci0JCWlmIChuZXdTdHJ1Y3RDb252ZXJ0ZXIgIT0gc3RydWN0Q29udmVydGVyKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc3RydWN0Q29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1N0cnVjdENvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTdHJ1Y3RDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTdHJ1Y3RDb252ZXJ0ZXIobmV3U3RydWN0Q29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIsIG5ld1N0cnVjdENvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBfTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQl7Ci0JCWlmIChtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyA9PSBudWxsKQotCQl7Ci0JCQltYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPihYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcEtleUNvbnZlcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5Q29udmVydCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwS2V5Q29udmVydCgpCi0JewotCQlyZXR1cm4gbWFwS2V5Q29udmVydDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRNYXBLZXlDb252ZXJ0IDxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFwS2V5Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcEtleUNvbnZlcnQoU3RyaW5nIG5ld01hcEtleUNvbnZlcnQpCi0JewotCQlTdHJpbmcgb2xkTWFwS2V5Q29udmVydCA9IG1hcEtleUNvbnZlcnQ7Ci0JCW1hcEtleUNvbnZlcnQgPSBuZXdNYXBLZXlDb252ZXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJULCBvbGRNYXBLZXlDb252ZXJ0LCBtYXBLZXlDb252ZXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2gpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhdGNoRmV0Y2hIb2xkZXJfQmF0Y2hGZXRjaCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQmF0Y2hGZXRjaCBnZXRCYXRjaEZldGNoKCkKLQl7Ci0JCXJldHVybiBiYXRjaEZldGNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEJhdGNoRmV0Y2goWG1sQmF0Y2hGZXRjaCBuZXdCYXRjaEZldGNoLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQmF0Y2hGZXRjaCBvbGRCYXRjaEZldGNoID0gYmF0Y2hGZXRjaDsKLQkJYmF0Y2hGZXRjaCA9IG5ld0JhdGNoRmV0Y2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19CQVRDSF9GRVRDSCwgb2xkQmF0Y2hGZXRjaCwgbmV3QmF0Y2hGZXRjaCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0QmF0Y2hGZXRjaCA8ZW0+QmF0Y2ggRmV0Y2g8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoIG5ld0JhdGNoRmV0Y2gpCi0JewotCQlpZiAobmV3QmF0Y2hGZXRjaCAhPSBiYXRjaEZldGNoKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChiYXRjaEZldGNoICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWJhdGNoRmV0Y2gpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQkFUQ0hfRkVUQ0gsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0JhdGNoRmV0Y2ggIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QmF0Y2hGZXRjaCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19CQVRDSF9GRVRDSCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRCYXRjaEZldGNoKG5ld0JhdGNoRmV0Y2gsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0JBVENIX0ZFVENILCBuZXdCYXRjaEZldGNoLCBuZXdCYXRjaEZldGNoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzFfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgbmV3QXR0cmlidXRlVHlwZSkKLQl7Ci0JCVN0cmluZyBvbGRBdHRyaWJ1dGVUeXBlID0gYXR0cmlidXRlVHlwZTsKLQkJYXR0cmlidXRlVHlwZSA9IG5ld0F0dHJpYnV0ZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BVFRSSUJVVEVfVFlQRSwgb2xkQXR0cmlidXRlVHlwZSwgYXR0cmlidXRlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q29udmVydGVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VHlwZUNvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTdHJ1Y3RDb252ZXJ0ZXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBiYXNpY1NldEJhdGNoRmV0Y2gobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiBnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOgotCQkJCXJldHVybiBnZXRNYXBLZXlDb252ZXJ0KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19CQVRDSF9GRVRDSDoKLQkJCQlyZXR1cm4gZ2V0QmF0Y2hGZXRjaCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19KT0lOX0ZFVENIOgotCQkJCXJldHVybiBnZXRKb2luRmV0Y2goKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19DT05WRVJURVI6Ci0JCQkJc2V0Q29udmVydGVyKChYbWxDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldFR5cGVDb252ZXJ0ZXIoKFhtbFR5cGVDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlzZXRPYmplY3RUeXBlQ29udmVydGVyKChYbWxPYmplY3RUeXBlQ29udmVydGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXNldFN0cnVjdENvbnZlcnRlcigoWG1sU3RydWN0Q29udmVydGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQ6Ci0JCQkJc2V0TWFwS2V5Q29udmVydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19CQVRDSF9GRVRDSDoKLQkJCQlzZXRCYXRjaEZldGNoKChYbWxCYXRjaEZldGNoKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19KT0lOX0ZFVENIOgotCQkJCXNldEpvaW5GZXRjaCgoWG1sSm9pbkZldGNoVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSOgotCQkJCXNldENvbnZlcnRlcigoWG1sQ29udmVydGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldFR5cGVDb252ZXJ0ZXIoKFhtbFR5cGVDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldE9iamVjdFR5cGVDb252ZXJ0ZXIoKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUjoKLQkJCQlzZXRTdHJ1Y3RDb252ZXJ0ZXIoKFhtbFN0cnVjdENvbnZlcnRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOgotCQkJCXNldE1hcEtleUNvbnZlcnQoTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19CQVRDSF9GRVRDSDoKLQkJCQlzZXRCYXRjaEZldGNoKChYbWxCYXRjaEZldGNoKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoQVRUUklCVVRFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19KT0lOX0ZFVENIOgotCQkJCXNldEpvaW5GZXRjaChKT0lOX0ZFVENIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSOgotCQkJCXJldHVybiBjb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiB0eXBlQ29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzICE9IG51bGwgJiYgIW1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDoKLQkJCQlyZXR1cm4gTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUID09IG51bGwgPyBtYXBLZXlDb252ZXJ0ICE9IG51bGwgOiAhTUFQX0tFWV9DT05WRVJUX0VERUZBVUxULmVxdWFscyhtYXBLZXlDb252ZXJ0KTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBiYXRjaEZldGNoICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0pPSU5fRkVUQ0g6Ci0JCQkJcmV0dXJuIGpvaW5GZXRjaCAhPSBKT0lOX0ZFVENIX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fVFlQRV9DT05WRVJURVI7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVI7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9DT05WRVJUOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hbnlUb01hbnlfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmF0Y2hGZXRjaEhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0JBVENIX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hbnlUb01hbnlfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfMjFfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkZldGNoLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fSk9JTl9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFueVRvTWFueV8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQkFUQ0hfRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFueVRvTWFueV8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV8yMV9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19KT0lOX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWFwS2V5Q29udmVydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWFwS2V5Q29udmVydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXR0cmlidXRlVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXR0cmlidXRlVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgam9pbkZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqb2luRmV0Y2gpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueSgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFyZ2V0RW50aXR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBwZWRCeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT3JkZXJCeVRyYW5zbGF0b3IoKSwKLQkJCVhtbE9yZGVyQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuT1JERVJfQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3JkZXJhYmxlXzJfMF9PcmRlckNvbHVtbigpKSwJCQotCQkJYnVpbGRNYXBLZXlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUNsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5RW51bWVyYXRlZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5Q29udmVydFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZEpvaW5UYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2FzY2FkZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRCYXRjaEZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlDb252ZXJ0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0NPTlZFUlQsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlDb252ZXJ0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBdHRyaWJ1dGVPdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wX01hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFLCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMF9NYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKLQl9CQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9UeXBlQ29udmVydGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFN0cnVjdENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRKb2luRmV0Y2hUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5BVFRSSUJVVEVfVFlQRSwgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueV8yXzFfQXR0cmlidXRlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEJhdGNoRmV0Y2hUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQmF0Y2hGZXRjaC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQkFUQ0hfRkVUQ0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcl9CYXRjaEZldGNoKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxNYW55VG9PbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFueVRvT25lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZWU4Y2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxNYW55VG9PbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb09uZV8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYW55IFRvIE9uZTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFueVRvT25lKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE1hbnlUb09uZSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUgaW1wbGVtZW50cyBYbWxNYW55VG9PbmVfMl8xLCBYbWxBdHRyaWJ1dGVNYXBwaW5nLCBYbWxKb2luRmV0Y2gKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXRjaEZldGNoKCkgPGVtPkJhdGNoIEZldGNoPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQmF0Y2hGZXRjaCBiYXRjaEZldGNoOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxKb2luRmV0Y2hUeXBlIEpPSU5fRkVUQ0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pbkZldGNoKCkgPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEpvaW5GZXRjaFR5cGUgam9pbkZldGNoID0gSk9JTl9GRVRDSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxNYW55VG9PbmUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9NQU5ZX1RPX09ORTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEJhdGNoRmV0Y2goWG1sQmF0Y2hGZXRjaCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcl9CYXRjaEZldGNoKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxCYXRjaEZldGNoIGdldEJhdGNoRmV0Y2goKQotCXsKLQkJcmV0dXJuIGJhdGNoRmV0Y2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoIG5ld0JhdGNoRmV0Y2gsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxCYXRjaEZldGNoIG9sZEJhdGNoRmV0Y2ggPSBiYXRjaEZldGNoOwotCQliYXRjaEZldGNoID0gbmV3QmF0Y2hGZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQkFUQ0hfRkVUQ0gsIG9sZEJhdGNoRmV0Y2gsIG5ld0JhdGNoRmV0Y2gpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUjZ2V0QmF0Y2hGZXRjaCA8ZW0+QmF0Y2ggRmV0Y2g8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoIG5ld0JhdGNoRmV0Y2gpCi0JewotCQlpZiAobmV3QmF0Y2hGZXRjaCAhPSBiYXRjaEZldGNoKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChiYXRjaEZldGNoICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWJhdGNoRmV0Y2gpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19CQVRDSF9GRVRDSCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QmF0Y2hGZXRjaCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCYXRjaEZldGNoKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQkFUQ0hfRkVUQ0gsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QmF0Y2hGZXRjaChuZXdCYXRjaEZldGNoLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0JBVENIX0ZFVENILCBuZXdCYXRjaEZldGNoLCBuZXdCYXRjaEZldGNoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQotCSAqIEBzZWUgI3NldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0Sm9pbkZldGNoKCkKLQl7Ci0JCXJldHVybiBqb2luRmV0Y2g7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSNnZXRKb2luRmV0Y2ggPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAc2VlICNnZXRKb2luRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSBuZXdKb2luRmV0Y2gpCi0JewotCQlYbWxKb2luRmV0Y2hUeXBlIG9sZEpvaW5GZXRjaCA9IGpvaW5GZXRjaDsKLQkJam9pbkZldGNoID0gbmV3Sm9pbkZldGNoID09IG51bGwgPyBKT0lOX0ZFVENIX0VERUZBVUxUIDogbmV3Sm9pbkZldGNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19KT0lOX0ZFVENILCBvbGRKb2luRmV0Y2gsIGpvaW5GZXRjaCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBiYXNpY1NldEJhdGNoRmV0Y2gobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBnZXRCYXRjaEZldGNoKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSk9JTl9GRVRDSDoKLQkJCQlyZXR1cm4gZ2V0Sm9pbkZldGNoKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19CQVRDSF9GRVRDSDoKLQkJCQlzZXRCYXRjaEZldGNoKChYbWxCYXRjaEZldGNoKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSk9JTl9GRVRDSDoKLQkJCQlzZXRKb2luRmV0Y2goKFhtbEpvaW5GZXRjaFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJc2V0QmF0Y2hGZXRjaCgoWG1sQmF0Y2hGZXRjaCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSk9JTl9GRVRDSDoKLQkJCQlzZXRKb2luRmV0Y2goSk9JTl9GRVRDSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJcmV0dXJuIGJhdGNoRmV0Y2ggIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSk9JTl9GRVRDSDoKLQkJCQlyZXR1cm4gam9pbkZldGNoICE9IEpPSU5fRkVUQ0hfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhdGNoRmV0Y2hIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0JBVENIX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hbnlUb09uZV8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0pPSU5fRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfX0pPSU5fRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19CQVRDSF9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYW55VG9PbmVfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkZldGNoLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfX0pPSU5fRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19KT0lOX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoam9pbkZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqb2luRmV0Y2gpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFueVRvT25lKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcHRpb25hbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBzSWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZElkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEpvaW5GZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQmF0Y2hGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJpdmF0ZU93bmVkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJpdmF0ZU93bmVkX1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEJhdGNoRmV0Y2hUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQmF0Y2hGZXRjaC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQkFUQ0hfRkVUQ0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcl9CYXRjaEZldGNoKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxNYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hcHBlZFN1cGVyY2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxYzZmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYXBwZWQgU3VwZXJjbGFzczwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldE9wdGltaXN0aWNMb2NraW5nIDxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENvcHlQb2xpY3kgPGVtPkNvcHkgUG9saWN5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSA8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q2xvbmVDb3B5UG9saWN5IDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sTWFwcGVkU3VwZXJjbGFzcyBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIGltcGxlbWVudHMgWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSwgWG1sUmVhZE9ubHksIFhtbEN1c3RvbWl6ZXJIb2xkZXIsIFhtbENoYW5nZVRyYWNraW5nSG9sZGVyLCBYbWxDYWNoZUhvbGRlciwgWG1sQ29udmVydGVyc0hvbGRlciwgWG1sUHJvcGVydHlDb250YWluZXIKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmltYXJ5S2V5KCkgPGVtPlByaW1hcnkgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmltYXJ5S2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUHJpbWFyeUtleSBwcmltYXJ5S2V5OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhY2hlYWJsZSgpIDxlbT5DYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIENBQ0hFQUJMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWNoZWFibGUoKSA8ZW0+Q2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGNhY2hlYWJsZSA9IENBQ0hFQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhY2hlSW50ZXJjZXB0b3IoKSA8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDbGFzc1JlZmVyZW5jZSBjYWNoZUludGVyY2VwdG9yOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSA8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSA8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmV0Y2hHcm91cHMoKSA8ZW0+RmV0Y2ggR3JvdXBzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZldGNoR3JvdXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sRmV0Y2hHcm91cD4gZmV0Y2hHcm91cHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3I7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZUdlbmVyYXRvcigpIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhYmxlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3I7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZFF1ZXJpZXMoKSA8ZW0+TmFtZWQgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lZFF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSA8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkgPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PiBuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKSA8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTcWxSZXN1bHRTZXRNYXBwaW5nPiBzcWxSZXN1bHRTZXRNYXBwaW5nczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFF1ZXJ5UmVkaXJlY3RvcnMoKSA8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFF1ZXJ5UmVkaXJlY3RvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxRdWVyeVJlZGlyZWN0b3JzIHF1ZXJ5UmVkaXJlY3RvcnM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyZW50Q2xhc3MoKSA8ZW0+UGFyZW50IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJlbnRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudENsYXNzKCkgPGVtPlBhcmVudCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFyZW50Q2xhc3MgPSBQQVJFTlRfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhZE9ubHkoKSA8ZW0+UmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFJFQURfT05MWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFkT25seSgpIDxlbT5SZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiByZWFkT25seSA9IFJFQURfT05MWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1c3RvbWl6ZXIoKSA8ZW0+Q3VzdG9taXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VzdG9taXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENsYXNzUmVmZXJlbmNlIGN1c3RvbWl6ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VUcmFja2luZygpIDxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZVRyYWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2hhbmdlVHJhY2tpbmcgY2hhbmdlVHJhY2tpbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWNoZSgpIDxlbT5DYWNoZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDYWNoZSBjYWNoZTsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEV4aXN0ZW5jZVR5cGUgRVhJU1RFTkNFX0NIRUNLSU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4aXN0ZW5jZUNoZWNraW5nKCkgPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFeGlzdGVuY2VUeXBlIGV4aXN0ZW5jZUNoZWNraW5nID0gRVhJU1RFTkNFX0NIRUNLSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVycygpIDxlbT5Db252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxDb252ZXJ0ZXI+IGNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlQ29udmVydGVycygpIDxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiB0eXBlQ29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBvYmplY3RUeXBlQ29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdENvbnZlcnRlcnMoKSA8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gc3RydWN0Q29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpbWlzdGljTG9ja2luZygpIDxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGltaXN0aWNMb2NraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT3B0aW1pc3RpY0xvY2tpbmcgb3B0aW1pc3RpY0xvY2tpbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5UG9saWN5KCkgPGVtPkNvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29weVBvbGljeSBjb3B5UG9saWN5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKSA8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpbnN0YW50aWF0aW9uQ29weVBvbGljeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsb25lQ29weVBvbGljeSgpIDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2xvbmVDb3B5UG9saWN5IGNsb25lQ29weVBvbGljeTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gZXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTUFQUEVEX1NVUEVSQ0xBU1M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWFkT25seShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZWFkT25seV9SZWFkT25seSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0UmVhZE9ubHkoKQotCXsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFJlYWRPbmx5IDxlbT5SZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShCb29sZWFuIG5ld1JlYWRPbmx5KQotCXsKLQkJQm9vbGVhbiBvbGRSZWFkT25seSA9IHJlYWRPbmx5OwotCQlyZWFkT25seSA9IG5ld1JlYWRPbmx5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRUFEX09OTFksIG9sZFJlYWRPbmx5LCByZWFkT25seSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbWl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q3VzdG9taXplcihYbWxDbGFzc1JlZmVyZW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplckhvbGRlcl9DdXN0b21pemVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDbGFzc1JlZmVyZW5jZSBnZXRDdXN0b21pemVyKCkKLQl7Ci0JCXJldHVybiBjdXN0b21pemVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q3VzdG9taXplciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIG9sZEN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQljdXN0b21pemVyID0gbmV3Q3VzdG9taXplcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ1VTVE9NSVpFUiwgb2xkQ3VzdG9taXplciwgbmV3Q3VzdG9taXplcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q3VzdG9taXplciA8ZW0+Q3VzdG9taXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q3VzdG9taXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q3VzdG9taXplcikKLQl7Ci0JCWlmIChuZXdDdXN0b21pemVyICE9IGN1c3RvbWl6ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGN1c3RvbWl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY3VzdG9taXplcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0N1c3RvbWl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q3VzdG9taXplcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q3VzdG9taXplcihuZXdDdXN0b21pemVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVIsIG5ld0N1c3RvbWl6ZXIsIG5ld0N1c3RvbWl6ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcl9DaGFuZ2VUcmFja2luZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2hhbmdlVHJhY2tpbmcgZ2V0Q2hhbmdlVHJhY2tpbmcoKQotCXsKLQkJcmV0dXJuIGNoYW5nZVRyYWNraW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nIG5ld0NoYW5nZVRyYWNraW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ2hhbmdlVHJhY2tpbmcgb2xkQ2hhbmdlVHJhY2tpbmcgPSBjaGFuZ2VUcmFja2luZzsKLQkJY2hhbmdlVHJhY2tpbmcgPSBuZXdDaGFuZ2VUcmFja2luZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HLCBvbGRDaGFuZ2VUcmFja2luZywgbmV3Q2hhbmdlVHJhY2tpbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENoYW5nZVRyYWNraW5nIDxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2hhbmdlVHJhY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VUcmFja2luZyhYbWxDaGFuZ2VUcmFja2luZyBuZXdDaGFuZ2VUcmFja2luZykKLQl7Ci0JCWlmIChuZXdDaGFuZ2VUcmFja2luZyAhPSBjaGFuZ2VUcmFja2luZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2hhbmdlVHJhY2tpbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2hhbmdlVHJhY2tpbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DSEFOR0VfVFJBQ0tJTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NoYW5nZVRyYWNraW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NoYW5nZVRyYWNraW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENoYW5nZVRyYWNraW5nKG5ld0NoYW5nZVRyYWNraW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORywgbmV3Q2hhbmdlVHJhY2tpbmcsIG5ld0NoYW5nZVRyYWNraW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FjaGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhY2hlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDYWNoZShYbWxDYWNoZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVIb2xkZXJfQ2FjaGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENhY2hlIGdldENhY2hlKCkKLQl7Ci0JCXJldHVybiBjYWNoZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDYWNoZShYbWxDYWNoZSBuZXdDYWNoZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENhY2hlIG9sZENhY2hlID0gY2FjaGU7Ci0JCWNhY2hlID0gbmV3Q2FjaGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFLCBvbGRDYWNoZSwgbmV3Q2FjaGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENhY2hlIDxlbT5DYWNoZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhY2hlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FjaGUoWG1sQ2FjaGUgbmV3Q2FjaGUpCi0JewotCQlpZiAobmV3Q2FjaGUgIT0gY2FjaGUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNhY2hlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNhY2hlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NhY2hlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NhY2hlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2FjaGUobmV3Q2FjaGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEUsIG5ld0NhY2hlLCBuZXdDYWNoZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBDaGVja2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCi0JICogQHNlZSAjc2V0RXhpc3RlbmNlQ2hlY2tpbmcoRXhpc3RlbmNlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVIb2xkZXJfRXhpc3RlbmNlQ2hlY2tpbmcoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeGlzdGVuY2VUeXBlIGdldEV4aXN0ZW5jZUNoZWNraW5nKCkKLQl7Ci0JCXJldHVybiBleGlzdGVuY2VDaGVja2luZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRFeGlzdGVuY2VDaGVja2luZyA8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUKLQkgKiBAc2VlICNnZXRFeGlzdGVuY2VDaGVja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4aXN0ZW5jZUNoZWNraW5nKEV4aXN0ZW5jZVR5cGUgbmV3RXhpc3RlbmNlQ2hlY2tpbmcpCi0JewotCQlFeGlzdGVuY2VUeXBlIG9sZEV4aXN0ZW5jZUNoZWNraW5nID0gZXhpc3RlbmNlQ2hlY2tpbmc7Ci0JCWV4aXN0ZW5jZUNoZWNraW5nID0gbmV3RXhpc3RlbmNlQ2hlY2tpbmcgPT0gbnVsbCA/IEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVCA6IG5ld0V4aXN0ZW5jZUNoZWNraW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWElTVEVOQ0VfQ0hFQ0tJTkcsIG9sZEV4aXN0ZW5jZUNoZWNraW5nLCBleGlzdGVuY2VDaGVja2luZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX0NvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbENvbnZlcnRlcj4gZ2V0Q29udmVydGVycygpCi0JewotCQlpZiAoY29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQljb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbENvbnZlcnRlcj4oWG1sQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gY29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IGdldFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmICh0eXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQl0eXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUeXBlQ29udmVydGVyPihYbWxUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UWVBFX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiB0eXBlQ29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChvYmplY3RUeXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQlvYmplY3RUeXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPihYbWxPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfU3RydWN0Q29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChzdHJ1Y3RDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCXN0cnVjdENvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPihYbWxTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NUUlVDVF9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0Q29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpbWlzdGljIExvY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE9wdGltaXN0aWNMb2NraW5nKFhtbE9wdGltaXN0aWNMb2NraW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX09wdGltaXN0aWNMb2NraW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxPcHRpbWlzdGljTG9ja2luZyBnZXRPcHRpbWlzdGljTG9ja2luZygpCi0JewotCQlyZXR1cm4gb3B0aW1pc3RpY0xvY2tpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T3B0aW1pc3RpY0xvY2tpbmcoWG1sT3B0aW1pc3RpY0xvY2tpbmcgbmV3T3B0aW1pc3RpY0xvY2tpbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxPcHRpbWlzdGljTG9ja2luZyBvbGRPcHRpbWlzdGljTG9ja2luZyA9IG9wdGltaXN0aWNMb2NraW5nOwotCQlvcHRpbWlzdGljTG9ja2luZyA9IG5ld09wdGltaXN0aWNMb2NraW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkcsIG9sZE9wdGltaXN0aWNMb2NraW5nLCBuZXdPcHRpbWlzdGljTG9ja2luZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0T3B0aW1pc3RpY0xvY2tpbmcgPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRPcHRpbWlzdGljTG9ja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wdGltaXN0aWNMb2NraW5nKFhtbE9wdGltaXN0aWNMb2NraW5nIG5ld09wdGltaXN0aWNMb2NraW5nKQotCXsKLQkJaWYgKG5ld09wdGltaXN0aWNMb2NraW5nICE9IG9wdGltaXN0aWNMb2NraW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChvcHRpbWlzdGljTG9ja2luZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvcHRpbWlzdGljTG9ja2luZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T3B0aW1pc3RpY0xvY2tpbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T3B0aW1pc3RpY0xvY2tpbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0T3B0aW1pc3RpY0xvY2tpbmcobmV3T3B0aW1pc3RpY0xvY2tpbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT1BUSU1JU1RJQ19MT0NLSU5HLCBuZXdPcHRpbWlzdGljTG9ja2luZywgbmV3T3B0aW1pc3RpY0xvY2tpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvcHlQb2xpY3koWG1sQ29weVBvbGljeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19Db3B5UG9saWN5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb3B5UG9saWN5IGdldENvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIGNvcHlQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29weVBvbGljeShYbWxDb3B5UG9saWN5IG5ld0NvcHlQb2xpY3ksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDb3B5UG9saWN5IG9sZENvcHlQb2xpY3kgPSBjb3B5UG9saWN5OwotCQljb3B5UG9saWN5ID0gbmV3Q29weVBvbGljeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1ksIG9sZENvcHlQb2xpY3ksIG5ld0NvcHlQb2xpY3kpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENvcHlQb2xpY3kgPGVtPkNvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlQb2xpY3koWG1sQ29weVBvbGljeSBuZXdDb3B5UG9saWN5KQotCXsKLQkJaWYgKG5ld0NvcHlQb2xpY3kgIT0gY29weVBvbGljeSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb3B5UG9saWN5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29weVBvbGljeSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvcHlQb2xpY3kobmV3Q29weVBvbGljeSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT1BZX1BPTElDWSwgbmV3Q29weVBvbGljeSwgbmV3Q29weVBvbGljeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGdldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiBpbnN0YW50aWF0aW9uQ29weVBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IG9sZEluc3RhbnRpYXRpb25Db3B5UG9saWN5ID0gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7Ci0JCWluc3RhbnRpYXRpb25Db3B5UG9saWN5ID0gbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIG9sZEluc3RhbnRpYXRpb25Db3B5UG9saWN5LCBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpCi0JewotCQlpZiAobmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgIT0gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGluc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWluc3RhbnRpYXRpb25Db3B5UG9saWN5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5LCBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2xvbmVDb3B5UG9saWN5KFhtbENsb25lQ29weVBvbGljeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19DbG9uZUNvcHlQb2xpY3koKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENsb25lQ29weVBvbGljeSBnZXRDbG9uZUNvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIGNsb25lQ29weVBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDbG9uZUNvcHlQb2xpY3koWG1sQ2xvbmVDb3B5UG9saWN5IG5ld0Nsb25lQ29weVBvbGljeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENsb25lQ29weVBvbGljeSBvbGRDbG9uZUNvcHlQb2xpY3kgPSBjbG9uZUNvcHlQb2xpY3k7Ci0JCWNsb25lQ29weVBvbGljeSA9IG5ld0Nsb25lQ29weVBvbGljeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xPTkVfQ09QWV9QT0xJQ1ksIG9sZENsb25lQ29weVBvbGljeSwgbmV3Q2xvbmVDb3B5UG9saWN5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDbG9uZUNvcHlQb2xpY3kgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xvbmVDb3B5UG9saWN5KFhtbENsb25lQ29weVBvbGljeSBuZXdDbG9uZUNvcHlQb2xpY3kpCi0JewotCQlpZiAobmV3Q2xvbmVDb3B5UG9saWN5ICE9IGNsb25lQ29weVBvbGljeSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2xvbmVDb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNsb25lQ29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDbG9uZUNvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2xvbmVDb3B5UG9saWN5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xPTkVfQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2xvbmVDb3B5UG9saWN5KG5ld0Nsb25lQ29weVBvbGljeSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWSwgbmV3Q2xvbmVDb3B5UG9saWN5LCBuZXdDbG9uZUNvcHlQb2xpY3kpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmltYXJ5S2V5KFhtbFByaW1hcnlLZXkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xX1ByaW1hcnlLZXkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFByaW1hcnlLZXkgZ2V0UHJpbWFyeUtleSgpCi0JewotCQlyZXR1cm4gcHJpbWFyeUtleTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmltYXJ5S2V5KFhtbFByaW1hcnlLZXkgbmV3UHJpbWFyeUtleSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFByaW1hcnlLZXkgb2xkUHJpbWFyeUtleSA9IHByaW1hcnlLZXk7Ci0JCXByaW1hcnlLZXkgPSBuZXdQcmltYXJ5S2V5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWSwgb2xkUHJpbWFyeUtleSwgbmV3UHJpbWFyeUtleSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UHJpbWFyeUtleSA8ZW0+UHJpbWFyeSBLZXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmltYXJ5S2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleShYbWxQcmltYXJ5S2V5IG5ld1ByaW1hcnlLZXkpCi0JewotCQlpZiAobmV3UHJpbWFyeUtleSAhPSBwcmltYXJ5S2V5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmltYXJ5S2V5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXByaW1hcnlLZXkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJpbWFyeUtleSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQcmltYXJ5S2V5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJpbWFyeUtleShuZXdQcmltYXJ5S2V5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSSU1BUllfS0VZLCBuZXdQcmltYXJ5S2V5LCBuZXdQcmltYXJ5S2V5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYWNoZWFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYWNoZWFibGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVhYmxlXzJfMF9DYWNoZWFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldENhY2hlYWJsZSgpCi0JewotCQlyZXR1cm4gY2FjaGVhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENhY2hlYWJsZSA8ZW0+Q2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhY2hlYWJsZShCb29sZWFuIG5ld0NhY2hlYWJsZSkKLQl7Ci0JCUJvb2xlYW4gb2xkQ2FjaGVhYmxlID0gY2FjaGVhYmxlOwotCQljYWNoZWFibGUgPSBuZXdDYWNoZWFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFQUJMRSwgb2xkQ2FjaGVhYmxlLCBjYWNoZWFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wX0NhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENsYXNzUmVmZXJlbmNlIGdldENhY2hlSW50ZXJjZXB0b3IoKQotCXsKLQkJcmV0dXJuIGNhY2hlSW50ZXJjZXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2FjaGVJbnRlcmNlcHRvcihYbWxDbGFzc1JlZmVyZW5jZSBuZXdDYWNoZUludGVyY2VwdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ2xhc3NSZWZlcmVuY2Ugb2xkQ2FjaGVJbnRlcmNlcHRvciA9IGNhY2hlSW50ZXJjZXB0b3I7Ci0JCWNhY2hlSW50ZXJjZXB0b3IgPSBuZXdDYWNoZUludGVyY2VwdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRV9JTlRFUkNFUFRPUiwgb2xkQ2FjaGVJbnRlcmNlcHRvciwgbmV3Q2FjaGVJbnRlcmNlcHRvcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q2FjaGVJbnRlcmNlcHRvciA8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDYWNoZUludGVyY2VwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FjaGVJbnRlcmNlcHRvcihYbWxDbGFzc1JlZmVyZW5jZSBuZXdDYWNoZUludGVyY2VwdG9yKQotCXsKLQkJaWYgKG5ld0NhY2hlSW50ZXJjZXB0b3IgIT0gY2FjaGVJbnRlcmNlcHRvcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2FjaGVJbnRlcmNlcHRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljYWNoZUludGVyY2VwdG9yKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5URVJDRVBUT1IsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NhY2hlSW50ZXJjZXB0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2FjaGVJbnRlcmNlcHRvcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFX0lOVEVSQ0VQVE9SLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENhY2hlSW50ZXJjZXB0b3IobmV3Q2FjaGVJbnRlcmNlcHRvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRV9JTlRFUkNFUFRPUiwgbmV3Q2FjaGVJbnRlcmNlcHRvciwgbmV3Q2FjaGVJbnRlcmNlcHRvcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl9Bc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKQotCXsKLQkJaWYgKGFzc29jaWF0aW9uT3ZlcnJpZGVzID09IG51bGwpCi0JCXsKLQkJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+KFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCX0KLQkJcmV0dXJuIGFzc29jaWF0aW9uT3ZlcnJpZGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyX0F0dHJpYnV0ZU92ZXJyaWRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpCi0JewotCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGVzID09IG51bGwpCi0JCXsKLQkJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4oWG1sQXR0cmlidXRlT3ZlcnJpZGUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURV9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmV0Y2ggR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmV0Y2ggR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2ggR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMV9GZXRjaEdyb3VwcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sRmV0Y2hHcm91cD4gZ2V0RmV0Y2hHcm91cHMoKQotCXsKLQkJaWYgKGZldGNoR3JvdXBzID09IG51bGwpCi0JCXsKLQkJCWZldGNoR3JvdXBzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEZldGNoR3JvdXA+KFhtbEZldGNoR3JvdXAuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0ZFVENIX0dST1VQUyk7Ci0JCX0KLQkJcmV0dXJuIGZldGNoR3JvdXBzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9TZXF1ZW5jZUdlbmVyYXRvcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yIG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igb2xkU2VxdWVuY2VHZW5lcmF0b3IgPSBzZXF1ZW5jZUdlbmVyYXRvcjsKLQkJc2VxdWVuY2VHZW5lcmF0b3IgPSBuZXdTZXF1ZW5jZUdlbmVyYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SLCBvbGRTZXF1ZW5jZUdlbmVyYXRvciwgbmV3U2VxdWVuY2VHZW5lcmF0b3IpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFNlcXVlbmNlR2VuZXJhdG9yIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvciBuZXdTZXF1ZW5jZUdlbmVyYXRvcikKLQl7Ci0JCWlmIChuZXdTZXF1ZW5jZUdlbmVyYXRvciAhPSBzZXF1ZW5jZUdlbmVyYXRvcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc2VxdWVuY2VHZW5lcmF0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc2VxdWVuY2VHZW5lcmF0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TRVFVRU5DRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1NlcXVlbmNlR2VuZXJhdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NlcXVlbmNlR2VuZXJhdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NFUVVFTkNFX0dFTkVSQVRPUiwgbmV3U2VxdWVuY2VHZW5lcmF0b3IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1RhYmxlR2VuZXJhdG9yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUYWJsZUdlbmVyYXRvciBnZXRUYWJsZUdlbmVyYXRvcigpCi0JewotCQlyZXR1cm4gdGFibGVHZW5lcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IgbmV3VGFibGVHZW5lcmF0b3IsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxUYWJsZUdlbmVyYXRvciBvbGRUYWJsZUdlbmVyYXRvciA9IHRhYmxlR2VuZXJhdG9yOwotCQl0YWJsZUdlbmVyYXRvciA9IG5ld1RhYmxlR2VuZXJhdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UQUJMRV9HRU5FUkFUT1IsIG9sZFRhYmxlR2VuZXJhdG9yLCBuZXdUYWJsZUdlbmVyYXRvcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0VGFibGVHZW5lcmF0b3IgPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIG5ld1RhYmxlR2VuZXJhdG9yKQotCXsKLQkJaWYgKG5ld1RhYmxlR2VuZXJhdG9yICE9IHRhYmxlR2VuZXJhdG9yKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0YWJsZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YWJsZUdlbmVyYXRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RBQkxFX0dFTkVSQVRPUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VGFibGVHZW5lcmF0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VGFibGVHZW5lcmF0b3IpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UQUJMRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VGFibGVHZW5lcmF0b3IobmV3VGFibGVHZW5lcmF0b3IsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVEFCTEVfR0VORVJBVE9SLCBuZXdUYWJsZUdlbmVyYXRvciwgbmV3VGFibGVHZW5lcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sTmFtZWRRdWVyeT4gZ2V0TmFtZWRRdWVyaWVzKCkKLQl7Ci0JCWlmIChuYW1lZFF1ZXJpZXMgPT0gbnVsbCkKLQkJewotCQkJbmFtZWRRdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE5hbWVkUXVlcnk+KFhtbE5hbWVkUXVlcnkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1FVRVJJRVMpOwotCQl9Ci0JCXJldHVybiBuYW1lZFF1ZXJpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZE5hdGl2ZVF1ZXJpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE5hbWVkTmF0aXZlUXVlcnk+IGdldE5hbWVkTmF0aXZlUXVlcmllcygpCi0JewotCQlpZiAobmFtZWROYXRpdmVRdWVyaWVzID09IG51bGwpCi0JCXsKLQkJCW5hbWVkTmF0aXZlUXVlcmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PihYbWxOYW1lZE5hdGl2ZVF1ZXJ5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9OQVRJVkVfUVVFUklFUyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVkTmF0aXZlUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeT4gZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQl7Ci0JCWlmIChuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPT0gbnVsbCkKLQkJewotCQkJbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+KFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfU3FsUmVzdWx0U2V0TWFwcGluZ3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFNxbFJlc3VsdFNldE1hcHBpbmc+IGdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkKLQl7Ci0JCWlmIChzcWxSZXN1bHRTZXRNYXBwaW5ncyA9PSBudWxsKQotCQl7Ci0JCQlzcWxSZXN1bHRTZXRNYXBwaW5ncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxTcWxSZXN1bHRTZXRNYXBwaW5nPihTcWxSZXN1bHRTZXRNYXBwaW5nLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyk7Ci0JCX0KLQkJcmV0dXJuIHNxbFJlc3VsdFNldE1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlF1ZXJ5IFJlZGlyZWN0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UXVlcnlSZWRpcmVjdG9ycyhYbWxRdWVyeVJlZGlyZWN0b3JzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9RdWVyeVJlZGlyZWN0b3JzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxRdWVyeVJlZGlyZWN0b3JzIGdldFF1ZXJ5UmVkaXJlY3RvcnMoKQotCXsKLQkJcmV0dXJuIHF1ZXJ5UmVkaXJlY3RvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UXVlcnlSZWRpcmVjdG9ycyhYbWxRdWVyeVJlZGlyZWN0b3JzIG5ld1F1ZXJ5UmVkaXJlY3RvcnMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxRdWVyeVJlZGlyZWN0b3JzIG9sZFF1ZXJ5UmVkaXJlY3RvcnMgPSBxdWVyeVJlZGlyZWN0b3JzOwotCQlxdWVyeVJlZGlyZWN0b3JzID0gbmV3UXVlcnlSZWRpcmVjdG9yczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUVVFUllfUkVESVJFQ1RPUlMsIG9sZFF1ZXJ5UmVkaXJlY3RvcnMsIG5ld1F1ZXJ5UmVkaXJlY3RvcnMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFF1ZXJ5UmVkaXJlY3RvcnMgPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UXVlcnlSZWRpcmVjdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5UmVkaXJlY3RvcnMoWG1sUXVlcnlSZWRpcmVjdG9ycyBuZXdRdWVyeVJlZGlyZWN0b3JzKQotCXsKLQkJaWYgKG5ld1F1ZXJ5UmVkaXJlY3RvcnMgIT0gcXVlcnlSZWRpcmVjdG9ycykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocXVlcnlSZWRpcmVjdG9ycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClxdWVyeVJlZGlyZWN0b3JzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUVVFUllfUkVESVJFQ1RPUlMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1F1ZXJ5UmVkaXJlY3RvcnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UXVlcnlSZWRpcmVjdG9ycykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1FVRVJZX1JFRElSRUNUT1JTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFF1ZXJ5UmVkaXJlY3RvcnMobmV3UXVlcnlSZWRpcmVjdG9ycywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19RVUVSWV9SRURJUkVDVE9SUywgbmV3UXVlcnlSZWRpcmVjdG9ycywgbmV3UXVlcnlSZWRpcmVjdG9ycykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyZW50Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9QYXJlbnRDbGFzcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudENsYXNzKCkKLQl7Ci0JCXJldHVybiBwYXJlbnRDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQYXJlbnRDbGFzcyA8ZW0+UGFyZW50IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJlbnQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcmVudENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50Q2xhc3MoU3RyaW5nIG5ld1BhcmVudENsYXNzKQotCXsKLQkJU3RyaW5nIG9sZFBhcmVudENsYXNzID0gcGFyZW50Q2xhc3M7Ci0JCXBhcmVudENsYXNzID0gbmV3UGFyZW50Q2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUkVOVF9DTEFTUywgb2xkUGFyZW50Q2xhc3MsIHBhcmVudENsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JewotCQlyZXR1cm4gZXhjbHVkZURlZmF1bHRNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoQm9vbGVhbiBuZXdFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKQotCXsKLQkJQm9vbGVhbiBvbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gZXhjbHVkZURlZmF1bHRNYXBwaW5nczsKLQkJZXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IG5ld0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUywgb2xkRXhjbHVkZURlZmF1bHRNYXBwaW5ncywgZXhjbHVkZURlZmF1bHRNYXBwaW5ncykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmltYXJ5S2V5KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRV9JTlRFUkNFUFRPUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDYWNoZUludGVyY2VwdG9yKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19GRVRDSF9HUk9VUFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRGZXRjaEdyb3VwcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTZXF1ZW5jZUdlbmVyYXRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVEFCTEVfR0VORVJBVE9SOgotCQkJCXJldHVybiBiYXNpY1NldFRhYmxlR2VuZXJhdG9yKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9RVUVSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TmFtZWRRdWVyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfTkFUSVZFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUVVFUllfUkVESVJFQ1RPUlM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UXVlcnlSZWRpcmVjdG9ycyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ1VTVE9NSVpFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDdXN0b21pemVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2hhbmdlVHJhY2tpbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFOgotCQkJCXJldHVybiBiYXNpY1NldENhY2hlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0T3B0aW1pc3RpY0xvY2tpbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBiYXNpY1NldENvcHlQb2xpY3kobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBiYXNpY1NldENsb25lQ29weVBvbGljeShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSSU1BUllfS0VZOgotCQkJCXJldHVybiBnZXRQcmltYXJ5S2V5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFQUJMRToKLQkJCQlyZXR1cm4gZ2V0Q2FjaGVhYmxlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFX0lOVEVSQ0VQVE9SOgotCQkJCXJldHVybiBnZXRDYWNoZUludGVyY2VwdG9yKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0ZFVENIX0dST1VQUzoKLQkJCQlyZXR1cm4gZ2V0RmV0Y2hHcm91cHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXJldHVybiBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIGdldE5hbWVkUXVlcmllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19RVUVSWV9SRURJUkVDVE9SUzoKLQkJCQlyZXR1cm4gZ2V0UXVlcnlSZWRpcmVjdG9ycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJFTlRfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldFBhcmVudENsYXNzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JFQURfT05MWToKLQkJCQlyZXR1cm4gZ2V0UmVhZE9ubHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ1VTVE9NSVpFUjoKLQkJCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJcmV0dXJuIGdldENoYW5nZVRyYWNraW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFOgotCQkJCXJldHVybiBnZXRDYWNoZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWElTVEVOQ0VfQ0hFQ0tJTkc6Ci0JCQkJcmV0dXJuIGdldEV4aXN0ZW5jZUNoZWNraW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldENvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRUeXBlQ29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0U3RydWN0Q29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORzoKLQkJCQlyZXR1cm4gZ2V0T3B0aW1pc3RpY0xvY2tpbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGdldENvcHlQb2xpY3koKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xPTkVfQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGdldENsb25lQ29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSSU1BUllfS0VZOgotCQkJCXNldFByaW1hcnlLZXkoKFhtbFByaW1hcnlLZXkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVBQkxFOgotCQkJCXNldENhY2hlYWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRV9JTlRFUkNFUFRPUjoKLQkJCQlzZXRDYWNoZUludGVyY2VwdG9yKChYbWxDbGFzc1JlZmVyZW5jZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBdHRyaWJ1dGVPdmVycmlkZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRkVUQ0hfR1JPVVBTOgotCQkJCWdldEZldGNoR3JvdXBzKCkuY2xlYXIoKTsKLQkJCQlnZXRGZXRjaEdyb3VwcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sRmV0Y2hHcm91cD4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXNldFNlcXVlbmNlR2VuZXJhdG9yKChYbWxTZXF1ZW5jZUdlbmVyYXRvciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJc2V0VGFibGVHZW5lcmF0b3IoKFhtbFRhYmxlR2VuZXJhdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWRRdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlnZXROYW1lZFF1ZXJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE5hbWVkUXVlcnk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX05BVElWRV9RVUVSSUVTOgotCQkJCWdldE5hbWVkTmF0aXZlUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZE5hdGl2ZVF1ZXJ5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6Ci0JCQkJZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTcWxSZXN1bHRTZXRNYXBwaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19RVUVSWV9SRURJUkVDVE9SUzoKLQkJCQlzZXRRdWVyeVJlZGlyZWN0b3JzKChYbWxRdWVyeVJlZGlyZWN0b3JzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUkVOVF9DTEFTUzoKLQkJCQlzZXRQYXJlbnRDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JFQURfT05MWToKLQkJCQlzZXRSZWFkT25seSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DVVNUT01JWkVSOgotCQkJCXNldEN1c3RvbWl6ZXIoKFhtbENsYXNzUmVmZXJlbmNlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORzoKLQkJCQlzZXRDaGFuZ2VUcmFja2luZygoWG1sQ2hhbmdlVHJhY2tpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEU6Ci0JCQkJc2V0Q2FjaGUoKFhtbENhY2hlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYSVNURU5DRV9DSEVDS0lORzoKLQkJCQlzZXRFeGlzdGVuY2VDaGVja2luZygoRXhpc3RlbmNlVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT05WRVJURVJTOgotCQkJCWdldENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbENvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFN0cnVjdENvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT1BUSU1JU1RJQ19MT0NLSU5HOgotCQkJCXNldE9wdGltaXN0aWNMb2NraW5nKChYbWxPcHRpbWlzdGljTG9ja2luZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT1BZX1BPTElDWToKLQkJCQlzZXRDb3B5UG9saWN5KChYbWxDb3B5UG9saWN5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6Ci0JCQkJc2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZOgotCQkJCXNldENsb25lQ29weVBvbGljeSgoWG1sQ2xvbmVDb3B5UG9saWN5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSSU1BUllfS0VZOgotCQkJCXNldFByaW1hcnlLZXkoKFhtbFByaW1hcnlLZXkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRUFCTEU6Ci0JCQkJc2V0Q2FjaGVhYmxlKENBQ0hFQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRV9JTlRFUkNFUFRPUjoKLQkJCQlzZXRDYWNoZUludGVyY2VwdG9yKChYbWxDbGFzc1JlZmVyZW5jZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19GRVRDSF9HUk9VUFM6Ci0JCQkJZ2V0RmV0Y2hHcm91cHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXNldFNlcXVlbmNlR2VuZXJhdG9yKChYbWxTZXF1ZW5jZUdlbmVyYXRvciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcigoWG1sVGFibGVHZW5lcmF0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9RVUVSSUVTOgotCQkJCWdldE5hbWVkUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6Ci0JCQkJZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUVVFUllfUkVESVJFQ1RPUlM6Ci0JCQkJc2V0UXVlcnlSZWRpcmVjdG9ycygoWG1sUXVlcnlSZWRpcmVjdG9ycyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUkVOVF9DTEFTUzoKLQkJCQlzZXRQYXJlbnRDbGFzcyhQQVJFTlRfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVBRF9PTkxZOgotCQkJCXNldFJlYWRPbmx5KFJFQURfT05MWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DVVNUT01JWkVSOgotCQkJCXNldEN1c3RvbWl6ZXIoKFhtbENsYXNzUmVmZXJlbmNlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HOgotCQkJCXNldENoYW5nZVRyYWNraW5nKChYbWxDaGFuZ2VUcmFja2luZyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFOgotCQkJCXNldENhY2hlKChYbWxDYWNoZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYSVNURU5DRV9DSEVDS0lORzoKLQkJCQlzZXRFeGlzdGVuY2VDaGVja2luZyhFWElTVEVOQ0VfQ0hFQ0tJTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09OVkVSVEVSUzoKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORzoKLQkJCQlzZXRPcHRpbWlzdGljTG9ja2luZygoWG1sT3B0aW1pc3RpY0xvY2tpbmcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT1BZX1BPTElDWToKLQkJCQlzZXRDb3B5UG9saWN5KChYbWxDb3B5UG9saWN5KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlzZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgoWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlzZXRDbG9uZUNvcHlQb2xpY3koKFhtbENsb25lQ29weVBvbGljeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVk6Ci0JCQkJcmV0dXJuIHByaW1hcnlLZXkgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVBQkxFOgotCQkJCXJldHVybiBDQUNIRUFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IGNhY2hlYWJsZSAhPSBudWxsIDogIUNBQ0hFQUJMRV9FREVGQVVMVC5lcXVhbHMoY2FjaGVhYmxlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5URVJDRVBUT1I6Ci0JCQkJcmV0dXJuIGNhY2hlSW50ZXJjZXB0b3IgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlcyAhPSBudWxsICYmICFhc3NvY2lhdGlvbk92ZXJyaWRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlcyAhPSBudWxsICYmICFhdHRyaWJ1dGVPdmVycmlkZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19GRVRDSF9HUk9VUFM6Ci0JCQkJcmV0dXJuIGZldGNoR3JvdXBzICE9IG51bGwgJiYgIWZldGNoR3JvdXBzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXJldHVybiBzZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIG5hbWVkUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFF1ZXJpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gbmFtZWROYXRpdmVRdWVyaWVzICE9IG51bGwgJiYgIW5hbWVkTmF0aXZlUXVlcmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzICE9IG51bGwgJiYgIW5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgotCQkJCXJldHVybiBzcWxSZXN1bHRTZXRNYXBwaW5ncyAhPSBudWxsICYmICFzcWxSZXN1bHRTZXRNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXJldHVybiBxdWVyeVJlZGlyZWN0b3JzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUkVOVF9DTEFTUzoKLQkJCQlyZXR1cm4gUEFSRU5UX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBwYXJlbnRDbGFzcyAhPSBudWxsIDogIVBBUkVOVF9DTEFTU19FREVGQVVMVC5lcXVhbHMocGFyZW50Q2xhc3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRUFEX09OTFk6Ci0JCQkJcmV0dXJuIFJFQURfT05MWV9FREVGQVVMVCA9PSBudWxsID8gcmVhZE9ubHkgIT0gbnVsbCA6ICFSRUFEX09OTFlfRURFRkFVTFQuZXF1YWxzKHJlYWRPbmx5KTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ1VTVE9NSVpFUjoKLQkJCQlyZXR1cm4gY3VzdG9taXplciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJcmV0dXJuIGNoYW5nZVRyYWNraW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFOgotCQkJCXJldHVybiBjYWNoZSAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWElTVEVOQ0VfQ0hFQ0tJTkc6Ci0JCQkJcmV0dXJuIGV4aXN0ZW5jZUNoZWNraW5nICE9IEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gY29udmVydGVycyAhPSBudWxsICYmICFjb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiB0eXBlQ29udmVydGVycyAhPSBudWxsICYmICF0eXBlQ29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIW9iamVjdFR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnMgIT0gbnVsbCAmJiAhc3RydWN0Q29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORzoKLQkJCQlyZXR1cm4gb3B0aW1pc3RpY0xvY2tpbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGNvcHlQb2xpY3kgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xPTkVfQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGNsb25lQ29weVBvbGljeSAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCA9PSBudWxsID8gZXhjbHVkZURlZmF1bHRNYXBwaW5ncyAhPSBudWxsIDogIUVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVC5lcXVhbHMoZXhjbHVkZURlZmF1bHRNYXBwaW5ncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzExX19QUklNQVJZX0tFWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDYWNoZWFibGVfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRUFCTEU6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfQ0FDSEVBQkxFXzIwX19DQUNIRUFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFX0lOVEVSQ0VQVE9SOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjBfX0NBQ0hFX0lOVEVSQ0VQVE9SOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FTU09DSUFUSU9OX09WRVJSSURFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BVFRSSUJVVEVfT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0NPTlRBSU5FUl9fQVRUUklCVVRFX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRkVUQ0hfR1JPVVBTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfQ09OVEFJTkVSXzIxX19GRVRDSF9HUk9VUFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sR2VuZXJhdG9yQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TRVFVRU5DRV9HRU5FUkFUT1I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19TRVFVRU5DRV9HRU5FUkFUT1I7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UQUJMRV9HRU5FUkFUT1I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19UQUJMRV9HRU5FUkFUT1I7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1FVRVJJRVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX1FVRVJJRVM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9OQVRJVkVfUVVFUklFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfTkFUSVZFX1FVRVJJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1FVRVJZX1JFRElSRUNUT1JTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1FVRVJZX1JFRElSRUNUT1JTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSRU5UX0NMQVNTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1BBUkVOVF9DTEFTUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxSZWFkT25seS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVBRF9PTkxZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SRUFEX09OTFlfX1JFQURfT05MWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDdXN0b21pemVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DVVNUT01JWkVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DVVNUT01JWkVSX0hPTERFUl9fQ1VTVE9NSVpFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSX19DSEFOR0VfVFJBQ0tJTkc7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2FjaGVIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhJU1RFTkNFX0NIRUNLSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0VYSVNURU5DRV9DSEVDS0lORzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzExX19QUklNQVJZX0tFWTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSSU1BUllfS0VZOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENhY2hlYWJsZV8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9DQUNIRUFCTEVfMjBfX0NBQ0hFQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjBfX0NBQ0hFX0lOVEVSQ0VQVE9SOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5URVJDRVBUT1I7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX19BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfX0FUVFJJQlVURV9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9DT05UQUlORVJfMjFfX0ZFVENIX0dST1VQUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0ZFVENIX0dST1VQUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxHZW5lcmF0b3JDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1NFUVVFTkNFX0dFTkVSQVRPUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NFUVVFTkNFX0dFTkVSQVRPUjsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1RBQkxFX0dFTkVSQVRPUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RBQkxFX0dFTkVSQVRPUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxRdWVyeUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9RVUVSSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfUVVFUklFUzsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfTkFUSVZFX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9OQVRJVkVfUVVFUklFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1FVRVJZX1JFRElSRUNUT1JTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUVVFUllfUkVESVJFQ1RPUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fUEFSRU5UX0NMQVNTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSRU5UX0NMQVNTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlYWRPbmx5LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFQURfT05MWV9fUkVBRF9PTkxZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVBRF9PTkxZOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEN1c3RvbWl6ZXJIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9IT0xERVJfX0NVU1RPTUlaRVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DVVNUT01JWkVSOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENoYW5nZVRyYWNraW5nSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVJfX0NIQU5HRV9UUkFDS0lORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDYWNoZUhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX0hPTERFUl9fRVhJU1RFTkNFX0NIRUNLSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhJU1RFTkNFX0NIRUNLSU5HOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlcnNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjYWNoZWFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhY2hlYWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyZW50Q2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcmVudENsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWFkT25seTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVhZE9ubHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4aXN0ZW5jZUNoZWNraW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGlzdGVuY2VDaGVja2luZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXhjbHVkZURlZmF1bHRNYXBwaW5nczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXhjbHVkZURlZmF1bHRNYXBwaW5ncyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVhZE9ubHlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRDYWNoZWFibGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JfQotCQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUGFyZW50Q2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2FjaGVhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRSZWFkT25seVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRXhpc3RlbmNlQ2hlY2tpbmdUcmFuc2xhdG9yKCksCi0JCQlidWlsZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDdXN0b21pemVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDaGFuZ2VUcmFja2luZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSWRDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJpbWFyeUtleVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT3B0aW1pc3RpY0xvY2tpbmdUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhY2hlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYWNoZUludGVyY2VwdG9yVHJhbnNsYXRvcigpLAotCQkJYnVpbGRGZXRjaEdyb3Vwc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvcHlQb2xpY3lUcmFuc2xhdG9yKCksCi0JCQlidWlsZEluc3RhbnRpYXRpb25Db3lwUG9saWN5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRDbG9uZUNvcHlQb2xpY3lUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTmFtZWRRdWVyeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTmFtZWROYXRpdmVRdWVyeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU3FsUmVzdWx0U2V0TWFwcGluZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUXVlcnlSZWRpcmVjdG9yc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQlidWlsZEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByZVBlcnNpc3RUcmFuc2xhdG9yKCksCi0JCQlidWlsZFBvc3RQZXJzaXN0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcmVSZW1vdmVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFBvc3RSZW1vdmVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByZVVwZGF0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUG9zdFVwZGF0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUG9zdExvYWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoKSwKLQkJCUF0dHJpYnV0ZXMuYnVpbGRUcmFuc2xhdG9yKCl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYWNoZWFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLkNBQ0hFQUJMRSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlYWJsZV8yXzBfQ2FjaGVhYmxlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmVhZE9ubHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUkVBRF9PTkxZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFJlYWRPbmx5X1JlYWRPbmx5KCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEV4aXN0ZW5jZUNoZWNraW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZUhvbGRlcl9FeGlzdGVuY2VDaGVja2luZygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYQ0xVREVfREVGQVVMVF9NQVBQSU5HUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ3VzdG9taXplclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDbGFzc1JlZmVyZW5jZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDdXN0b21pemVySG9sZGVyX0N1c3RvbWl6ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENoYW5nZVRyYWNraW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENoYW5nZVRyYWNraW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJfQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByaW1hcnlLZXlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUHJpbWFyeUtleS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsxXzEuUFJJTUFSWV9LRVksIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xX1ByaW1hcnlLZXkoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9wdGltaXN0aWNMb2NraW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbE9wdGltaXN0aWNMb2NraW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5PUFRJTUlTVElDX0xPQ0tJTkcsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19PcHRpbWlzdGljTG9ja2luZygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FjaGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ2FjaGUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlSG9sZGVyX0NhY2hlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYWNoZUludGVyY2VwdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENsYXNzUmVmZXJlbmNlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5DQUNIRV9JTlRFUkNFUFRPUiwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzBfQ2FjaGVJbnRlcmNlcHRvcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRmV0Y2hHcm91cHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sRmV0Y2hHcm91cC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuRkVUQ0hfR1JPVVAsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xX0ZldGNoR3JvdXBzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxTdHJ1Y3RDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb3B5UG9saWN5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPUFlfUE9MSUNZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfQ29weVBvbGljeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSW5zdGFudGlhdGlvbkNveXBQb2xpY3lUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLklOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2xvbmVDb3B5UG9saWN5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENsb25lQ29weVBvbGljeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0xPTkVfQ09QWV9QT0xJQ1ksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19DbG9uZUNvcHlQb2xpY3koKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFNlcXVlbmNlR2VuZXJhdG9yLmJ1aWxkVHJhbnNsYXRvcihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JDb250YWluZXJfU2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFRhYmxlR2VuZXJhdG9yLmJ1aWxkVHJhbnNsYXRvcihKUEEuVEFCTEVfR0VORVJBVE9SLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JDb250YWluZXJfVGFibGVHZW5lcmF0b3IoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVkUXVlcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sTmFtZWRRdWVyeS5idWlsZFRyYW5zbGF0b3IoSlBBLk5BTUVEX1FVRVJZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFF1ZXJpZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVkTmF0aXZlUXVlcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sTmFtZWROYXRpdmVRdWVyeS5idWlsZFRyYW5zbGF0b3IoSlBBLk5BTUVEX05BVElWRV9RVUVSWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWROYXRpdmVRdWVyaWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUlksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTcWxSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFNxbFJlc3VsdFNldE1hcHBpbmcuYnVpbGRUcmFuc2xhdG9yKEpQQS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9TcWxSZXN1bHRTZXRNYXBwaW5ncygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUXVlcnlSZWRpcmVjdG9yc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxRdWVyeVJlZGlyZWN0b3JzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5RVUVSWV9SRURJUkVDVE9SUywgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfUXVlcnlSZWRpcmVjdG9ycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBdHRyaWJ1dGVPdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoSlBBLkFUVFJJQlVURV9PVkVSUklERSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl9Bc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQYXJlbnRDbGFzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5QQVJFTlRfQ0xBU1MsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xX1BhcmVudENsYXNzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE11dGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTXV0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmI1OWVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTXV0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNdXRhYmxlPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11dGFibGUjZ2V0TXV0YWJsZSA8ZW0+TXV0YWJsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNdXRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNdXRhYmxlIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk11dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk11dGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TXV0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNdXRhYmxlX011dGFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0TXV0YWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11dGFibGUjZ2V0TXV0YWJsZSA8ZW0+TXV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TXV0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TXV0YWJsZShCb29sZWFuIHZhbHVlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbXV0YWJsZSBhdHRpYnV0ZS4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TXV0YWJsZVRleHRSYW5nZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhYjdiMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTmFtZWQgQ29udmVydGVyPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRDb252ZXJ0ZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sTmFtZWRDb252ZXJ0ZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE5hbWVkQ29udmVydGVyKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTkFNRURfQ09OVkVSVEVSOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29udmVydGVyX05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlciNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9DT05WRVJURVJfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9DT05WRVJURVJfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlRFUl9fTkFNRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxOYW1lZENvbnZlcnRlcl9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi19IC8vIFhtbE5hbWVkQ29udmVydGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTllOTA5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5Cb29sZWFuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBOYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJ5PC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXN1bHRDbGFzcyA8ZW0+UmVzdWx0IENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXN1bHRTZXRNYXBwaW5nIDxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFByb2NlZHVyZU5hbWUgPGVtPlByb2NlZHVyZSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXR1cm5zUmVzdWx0U2V0IDxlbT5SZXR1cm5zIFJlc3VsdCBTZXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldEhpbnRzIDxlbT5IaW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UGFyYW1ldGVycyA8ZW0+UGFyYW1ldGVyczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzdWx0Q2xhc3MoKSA8ZW0+UmVzdWx0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bHRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VsdENsYXNzKCkgPGVtPlJlc3VsdCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzdWx0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzdWx0Q2xhc3MgPSBSRVNVTFRfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzdWx0U2V0TWFwcGluZygpIDxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VsdFNldE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9TRVRfTUFQUElOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bHRTZXRNYXBwaW5nKCkgPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzdWx0U2V0TWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nID0gUkVTVUxUX1NFVF9NQVBQSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2NlZHVyZU5hbWUoKSA8ZW0+UHJvY2VkdXJlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2NlZHVyZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFRFVSRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2NlZHVyZU5hbWUoKSA8ZW0+UHJvY2VkdXJlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2NlZHVyZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvY2VkdXJlTmFtZSA9IFBST0NFRFVSRV9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldHVybnNSZXN1bHRTZXQoKSA8ZW0+UmV0dXJucyBSZXN1bHQgU2V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXR1cm5zUmVzdWx0U2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gUkVUVVJOU19SRVNVTFRfU0VUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldHVybnNSZXN1bHRTZXQoKSA8ZW0+UmV0dXJucyBSZXN1bHQgU2V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXR1cm5zUmVzdWx0U2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiByZXR1cm5zUmVzdWx0U2V0ID0gUkVUVVJOU19SRVNVTFRfU0VUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGludHMoKSA8ZW0+SGludHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxRdWVyeUhpbnQ+IGhpbnRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1ldGVycygpIDxlbT5QYXJhbWV0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtZXRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXI+IHBhcmFtZXRlcnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUlk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3VsdCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzdWx0IENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VsdCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzdWx0Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Jlc3VsdENsYXNzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0Q2xhc3MoKQotCXsKLQkJcmV0dXJuIHJlc3VsdENsYXNzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFJlc3VsdENsYXNzIDxlbT5SZXN1bHQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VsdCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVzdWx0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRDbGFzcyhTdHJpbmcgbmV3UmVzdWx0Q2xhc3MpCi0JewotCQlTdHJpbmcgb2xkUmVzdWx0Q2xhc3MgPSByZXN1bHRDbGFzczsKLQkJcmVzdWx0Q2xhc3MgPSBuZXdSZXN1bHRDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfQ0xBU1MsIG9sZFJlc3VsdENsYXNzLCByZXN1bHRDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3VsdCBTZXQgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzdWx0IFNldCBNYXBwaW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzdWx0U2V0TWFwcGluZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmVzdWx0U2V0TWFwcGluZygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdFNldE1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIHJlc3VsdFNldE1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UmVzdWx0U2V0TWFwcGluZyA8ZW0+UmVzdWx0IFNldCBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc3VsdFNldE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRTZXRNYXBwaW5nKFN0cmluZyBuZXdSZXN1bHRTZXRNYXBwaW5nKQotCXsKLQkJU3RyaW5nIG9sZFJlc3VsdFNldE1hcHBpbmcgPSByZXN1bHRTZXRNYXBwaW5nOwotCQlyZXN1bHRTZXRNYXBwaW5nID0gbmV3UmVzdWx0U2V0TWFwcGluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkcsIG9sZFJlc3VsdFNldE1hcHBpbmcsIHJlc3VsdFNldE1hcHBpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZWR1cmUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvY2VkdXJlIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VkdXJlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb2NlZHVyZU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Byb2NlZHVyZU5hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9jZWR1cmVOYW1lKCkKLQl7Ci0JCXJldHVybiBwcm9jZWR1cmVOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFByb2NlZHVyZU5hbWUgPGVtPlByb2NlZHVyZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZWR1cmUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvY2VkdXJlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2NlZHVyZU5hbWUoU3RyaW5nIG5ld1Byb2NlZHVyZU5hbWUpCi0JewotCQlTdHJpbmcgb2xkUHJvY2VkdXJlTmFtZSA9IHByb2NlZHVyZU5hbWU7Ci0JCXByb2NlZHVyZU5hbWUgPSBuZXdQcm9jZWR1cmVOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FLCBvbGRQcm9jZWR1cmVOYW1lLCBwcm9jZWR1cmVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV0dXJucyBSZXN1bHQgU2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXR1cm5zIFJlc3VsdCBTZXQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJucyBSZXN1bHQgU2V0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXR1cm5zUmVzdWx0U2V0KEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmV0dXJuc1Jlc3VsdFNldCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0UmV0dXJuc1Jlc3VsdFNldCgpCi0JewotCQlyZXR1cm4gcmV0dXJuc1Jlc3VsdFNldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXR1cm5zUmVzdWx0U2V0IDxlbT5SZXR1cm5zIFJlc3VsdCBTZXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybnMgUmVzdWx0IFNldDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmV0dXJuc1Jlc3VsdFNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJldHVybnNSZXN1bHRTZXQoQm9vbGVhbiBuZXdSZXR1cm5zUmVzdWx0U2V0KQotCXsKLQkJQm9vbGVhbiBvbGRSZXR1cm5zUmVzdWx0U2V0ID0gcmV0dXJuc1Jlc3VsdFNldDsKLQkJcmV0dXJuc1Jlc3VsdFNldCA9IG5ld1JldHVybnNSZXN1bHRTZXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVUVVJOU19SRVNVTFRfU0VULCBvbGRSZXR1cm5zUmVzdWx0U2V0LCByZXR1cm5zUmVzdWx0U2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGludHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfSGludHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFF1ZXJ5SGludD4gZ2V0SGludHMoKQotCXsKLQkJaWYgKGhpbnRzID09IG51bGwpCi0JCXsKLQkJCWhpbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFF1ZXJ5SGludD4oWG1sUXVlcnlIaW50LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlRTKTsKLQkJfQotCQlyZXR1cm4gaGludHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyYW1ldGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtZXRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUGFyYW1ldGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCkKLQl7Ci0JCWlmIChwYXJhbWV0ZXJzID09IG51bGwpCi0JCXsKLQkJCXBhcmFtZXRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyPihYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUEFSQU1FVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHBhcmFtZXRlcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRIaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUEFSQU1FVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBhcmFtZXRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX0NMQVNTOgotCQkJCXJldHVybiBnZXRSZXN1bHRDbGFzcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORzoKLQkJCQlyZXR1cm4gZ2V0UmVzdWx0U2V0TWFwcGluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FOgotCQkJCXJldHVybiBnZXRQcm9jZWR1cmVOYW1lKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVUVVJOU19SRVNVTFRfU0VUOgotCQkJCXJldHVybiBnZXRSZXR1cm5zUmVzdWx0U2V0KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVFM6Ci0JCQkJcmV0dXJuIGdldEhpbnRzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUEFSQU1FVEVSUzoKLQkJCQlyZXR1cm4gZ2V0UGFyYW1ldGVycygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9DTEFTUzoKLQkJCQlzZXRSZXN1bHRDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HOgotCQkJCXNldFJlc3VsdFNldE1hcHBpbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FOgotCQkJCXNldFByb2NlZHVyZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVDoKLQkJCQlzZXRSZXR1cm5zUmVzdWx0U2V0KChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVFM6Ci0JCQkJZ2V0SGludHMoKS5jbGVhcigpOwotCQkJCWdldEhpbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxRdWVyeUhpbnQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUEFSQU1FVEVSUzoKLQkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRQYXJhbWV0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfQ0xBU1M6Ci0JCQkJc2V0UmVzdWx0Q2xhc3MoUkVTVUxUX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HOgotCQkJCXNldFJlc3VsdFNldE1hcHBpbmcoUkVTVUxUX1NFVF9NQVBQSU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUFJPQ0VEVVJFX05BTUU6Ci0JCQkJc2V0UHJvY2VkdXJlTmFtZShQUk9DRURVUkVfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVDoKLQkJCQlzZXRSZXR1cm5zUmVzdWx0U2V0KFJFVFVSTlNfUkVTVUxUX1NFVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlRTOgotCQkJCWdldEhpbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUEFSQU1FVEVSUzoKLQkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfQ0xBU1M6Ci0JCQkJcmV0dXJuIFJFU1VMVF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gcmVzdWx0Q2xhc3MgIT0gbnVsbCA6ICFSRVNVTFRfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKHJlc3VsdENsYXNzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkc6Ci0JCQkJcmV0dXJuIFJFU1VMVF9TRVRfTUFQUElOR19FREVGQVVMVCA9PSBudWxsID8gcmVzdWx0U2V0TWFwcGluZyAhPSBudWxsIDogIVJFU1VMVF9TRVRfTUFQUElOR19FREVGQVVMVC5lcXVhbHMocmVzdWx0U2V0TWFwcGluZyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUFJPQ0VEVVJFX05BTUU6Ci0JCQkJcmV0dXJuIFBST0NFRFVSRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwcm9jZWR1cmVOYW1lICE9IG51bGwgOiAhUFJPQ0VEVVJFX05BTUVfRURFRkFVTFQuZXF1YWxzKHByb2NlZHVyZU5hbWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVDoKLQkJCQlyZXR1cm4gUkVUVVJOU19SRVNVTFRfU0VUX0VERUZBVUxUID09IG51bGwgPyByZXR1cm5zUmVzdWx0U2V0ICE9IG51bGwgOiAhUkVUVVJOU19SRVNVTFRfU0VUX0VERUZBVUxULmVxdWFscyhyZXR1cm5zUmVzdWx0U2V0KTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19ISU5UUzoKLQkJCQlyZXR1cm4gaGludHMgIT0gbnVsbCAmJiAhaGludHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlM6Ci0JCQkJcmV0dXJuIHBhcmFtZXRlcnMgIT0gbnVsbCAmJiAhcGFyYW1ldGVycy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc3VsdENsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXN1bHRDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzdWx0U2V0TWFwcGluZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVzdWx0U2V0TWFwcGluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvY2VkdXJlTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJvY2VkdXJlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmV0dXJuc1Jlc3VsdFNldDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmV0dXJuc1Jlc3VsdFNldCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUmVzdWx0Q2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb2NlZHVyZU5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFJldHVyblJlc3VsdFNldFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSGludFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUGFyYW1ldGVyVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmVzdWx0Q2xhc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX0NMQVNTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmVzdWx0Q2xhc3MoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmVzdWx0U2V0TWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkcsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXN1bHRTZXRNYXBwaW5nKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb2NlZHVyZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUFJPQ0VEVVJFX05BTUUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9Qcm9jZWR1cmVOYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJldHVyblJlc3VsdFNldFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQm9vbGVhblRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVUVVJOU19SRVNVTFRfU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmV0dXJuc1Jlc3VsdFNldCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRIaW50VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFF1ZXJ5SGludC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X0hpbnRzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQYXJhbWV0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QQVJBTUVURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9QYXJhbWV0ZXJzKCkpOwotCX0KLX0gLy8gWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPYmplY3RUeXBlQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzOTU4Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9iamVjdCBUeXBlIEN1c3RvbUNvbnZlcnRlcjwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldERhdGFUeXBlIDxlbT5EYXRhIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldE9iamVjdFR5cGUgPGVtPk9iamVjdCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXRDb252ZXJzaW9uVmFsdWVzIDxlbT5Db252ZXJzaW9uIFZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0RGVmYXVsdE9iamVjdFZhbHVlIDxlbT5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgZXh0ZW5kcyBYbWxOYW1lZENvbnZlcnRlcgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhVHlwZSgpIDxlbT5EYXRhIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFUeXBlKCkgPGVtPkRhdGEgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGF0YVR5cGUgPSBEQVRBX1RZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFR5cGUoKSA8ZW0+T2JqZWN0IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlKCkgPGVtPk9iamVjdCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG9iamVjdFR5cGUgPSBPQkpFQ1RfVFlQRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJzaW9uVmFsdWVzKCkgPGVtPkNvbnZlcnNpb24gVmFsdWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnNpb25WYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZXM7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRPYmplY3RWYWx1ZSgpIDxlbT5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX09CSkVDVF9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgPGVtPkRlZmF1bHQgT2JqZWN0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0T2JqZWN0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlID0gREVGQVVMVF9PQkpFQ1RfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXRhIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRhdGEgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERhdGFUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9EYXRhVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKQotCXsKLQkJcmV0dXJuIGRhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldERhdGFUeXBlIDxlbT5EYXRhIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRhdGEgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShTdHJpbmcgbmV3RGF0YVR5cGUpCi0JewotCQlTdHJpbmcgb2xkRGF0YVR5cGUgPSBkYXRhVHlwZTsKLQkJZGF0YVR5cGUgPSBuZXdEYXRhVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSwgb2xkRGF0YVR5cGUsIGRhdGFUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPYmplY3RUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9PYmplY3RUeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RUeXBlKCkKLQl7Ci0JCXJldHVybiBvYmplY3RUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldE9iamVjdFR5cGUgPGVtPk9iamVjdCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGUoU3RyaW5nIG5ld09iamVjdFR5cGUpCi0JewotCQlTdHJpbmcgb2xkT2JqZWN0VHlwZSA9IG9iamVjdFR5cGU7Ci0JCW9iamVjdFR5cGUgPSBuZXdPYmplY3RUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUsIG9sZE9iamVjdFR5cGUsIG9iamVjdFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJzaW9uIFZhbHVlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVyc2lvbiBWYWx1ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJzaW9uIFZhbHVlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9Db252ZXJzaW9uVmFsdWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxDb252ZXJzaW9uVmFsdWU+IGdldENvbnZlcnNpb25WYWx1ZXMoKQotCXsKLQkJaWYgKGNvbnZlcnNpb25WYWx1ZXMgPT0gbnVsbCkKLQkJewotCQkJY29udmVyc2lvblZhbHVlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb252ZXJzaW9uVmFsdWU+KFhtbENvbnZlcnNpb25WYWx1ZS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTKTsKLQkJfQotCQlyZXR1cm4gY29udmVyc2lvblZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfRGVmYXVsdE9iamVjdFZhbHVlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0T2JqZWN0VmFsdWUoKQotCXsKLQkJcmV0dXJuIGRlZmF1bHRPYmplY3RWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXREZWZhdWx0T2JqZWN0VmFsdWUgPGVtPkRlZmF1bHQgT2JqZWN0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlKFN0cmluZyBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpCi0JewotCQlTdHJpbmcgb2xkRGVmYXVsdE9iamVjdFZhbHVlID0gZGVmYXVsdE9iamVjdFZhbHVlOwotCQlkZWZhdWx0T2JqZWN0VmFsdWUgPSBuZXdEZWZhdWx0T2JqZWN0VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRSwgb2xkRGVmYXVsdE9iamVjdFZhbHVlLCBkZWZhdWx0T2JqZWN0VmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udmVyc2lvblZhbHVlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOgotCQkJCXJldHVybiBnZXREYXRhVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEU6Ci0JCQkJcmV0dXJuIGdldE9iamVjdFR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTOgotCQkJCXJldHVybiBnZXRDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOgotCQkJCXNldERhdGFUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOgotCQkJCXNldE9iamVjdFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVM6Ci0JCQkJZ2V0Q29udmVyc2lvblZhbHVlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udmVyc2lvblZhbHVlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQ29udmVyc2lvblZhbHVlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUU6Ci0JCQkJc2V0RGVmYXVsdE9iamVjdFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRToKLQkJCQlzZXREYXRhVHlwZShEQVRBX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOgotCQkJCXNldE9iamVjdFR5cGUoT0JKRUNUX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTOgotCQkJCWdldENvbnZlcnNpb25WYWx1ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RFRkFVTFRfT0JKRUNUX1ZBTFVFOgotCQkJCXNldERlZmF1bHRPYmplY3RWYWx1ZShERUZBVUxUX09CSkVDVF9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRToKLQkJCQlyZXR1cm4gREFUQV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBkYXRhVHlwZSAhPSBudWxsIDogIURBVEFfVFlQRV9FREVGQVVMVC5lcXVhbHMoZGF0YVR5cGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEU6Ci0JCQkJcmV0dXJuIE9CSkVDVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBvYmplY3RUeXBlICE9IG51bGwgOiAhT0JKRUNUX1RZUEVfRURFRkFVTFQuZXF1YWxzKG9iamVjdFR5cGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVM6Ci0JCQkJcmV0dXJuIGNvbnZlcnNpb25WYWx1ZXMgIT0gbnVsbCAmJiAhY29udmVyc2lvblZhbHVlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRToKLQkJCQlyZXR1cm4gREVGQVVMVF9PQkpFQ1RfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRPYmplY3RWYWx1ZSAhPSBudWxsIDogIURFRkFVTFRfT0JKRUNUX1ZBTFVFX0VERUZBVUxULmVxdWFscyhkZWZhdWx0T2JqZWN0VmFsdWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkYXRhVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGF0YVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9iamVjdFR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG9iamVjdFR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRPYmplY3RWYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdE9iamVjdFZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkQ29udmVyc2lvblZhbHVlVHJhbnNsYXRvcigpLAotCQkJYnVpbGREZWZhdWx0T2JqZWN0VmFsdWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZERhdGFUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPYmplY3RUeXBlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJzaW9uVmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29udmVyc2lvblZhbHVlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfQ29udmVyc2lvblZhbHVlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9EZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERhdGFUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfRGF0YVR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT2JqZWN0VHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfT2JqZWN0VHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRGF0YVR5cGVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpOwotCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5kYXRhVHlwZS5sYXN0SW5kZXhPZihvcmlnaW5hbE5hbWUpOwotCQlpbnQgb2Zmc2V0ID0gZ2V0QXR0cmlidXRlTm9kZShFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCArIG5hbWVJbmRleCwgb3JpZ2luYWxOYW1lLmxlbmd0aCgpLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRGF0YVR5cGVQYWNrYWdlRWRpdChTdHJpbmcgbmV3TmFtZSkgewotCQlpbnQgcGFja2FnZUxlbmd0aCA9IHRoaXMuZGF0YVR5cGUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKHBhY2thZ2VMZW5ndGggPT0gLTEpIHsKLQkJCXBhY2thZ2VMZW5ndGggPSAwOwotCQkJbmV3TmFtZSA9IG5ld05hbWUgKyAnLic7Ci0JCX0KLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUpLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKSArIDE7IC8vICsxID0gb3BlbmluZyBkb3VibGUgcXVvdGUKLQkJcmV0dXJuIG5ldyBSZXBsYWNlRWRpdChvZmZzZXQsIHBhY2thZ2VMZW5ndGgsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVPYmplY3RUeXBlRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvcmlnaW5hbE5hbWUgPSBvcmlnaW5hbFR5cGUuZ2V0VHlwZVF1YWxpZmllZE5hbWUoKTsKLQkJaW50IG5hbWVJbmRleCA9IHRoaXMub2JqZWN0VHlwZS5sYXN0SW5kZXhPZihvcmlnaW5hbE5hbWUpOwotCQlpbnQgb2Zmc2V0ID0gZ2V0QXR0cmlidXRlTm9kZShFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFKS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOyAvLyArMSA9IG9wZW5pbmcgZG91YmxlIHF1b3RlCi0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0ICsgbmFtZUluZGV4LCBvcmlnaW5hbE5hbWUubGVuZ3RoKCksIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVPYmplY3RUeXBlUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJaW50IHBhY2thZ2VMZW5ndGggPSB0aGlzLm9iamVjdFR5cGUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKHBhY2thZ2VMZW5ndGggPT0gLTEpIHsKLQkJCXBhY2thZ2VMZW5ndGggPSAwOwotCQkJbmV3TmFtZSA9IG5ld05hbWUgKyAnLic7Ci0JCX0KLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCwgcGFja2FnZUxlbmd0aCwgbmV3TmFtZSk7Ci0JfQotCi19IC8vIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9NYW55LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvTWFueS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQ4ODZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9NYW55LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE9uZVRvTWFueV8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT25lIFRvIE1hbnk8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxPbmVUb01hbnkgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55IGltcGxlbWVudHMgWG1sT25lVG9NYW55XzJfMCwgWG1sT25lVG9NYW55XzJfMSwgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sUHJpdmF0ZU93bmVkLCBYbWxKb2luRmV0Y2gKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXIoKSA8ZW0+Q29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb252ZXJ0ZXIgY29udmVydGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUNvbnZlcnRlcigpIDxlbT5UeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFR5cGVDb252ZXJ0ZXIgdHlwZUNvbnZlcnRlcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBvYmplY3RUeXBlQ29udmVydGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RydWN0Q29udmVydGVyKCkgPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFN0cnVjdENvbnZlcnRlciBzdHJ1Y3RDb252ZXJ0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpIDxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUNvbnZlcnQoKSA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5Q29udmVydCgpIDxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcEtleUNvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFwS2V5Q29udmVydCA9IE1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhdGNoRmV0Y2goKSA8ZW0+QmF0Y2ggRmV0Y2g8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhdGNoRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxCYXRjaEZldGNoIGJhdGNoRmV0Y2g7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVUeXBlID0gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ByaXZhdGVPd25lZCgpIDxlbT5Qcml2YXRlIE93bmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1ByaXZhdGVPd25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBSSVZBVEVfT1dORURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJpdmF0ZU93bmVkKCkgPGVtPlByaXZhdGUgT3duZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHJpdmF0ZU93bmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcml2YXRlT3duZWQgPSBQUklWQVRFX09XTkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgWG1sSm9pbkZldGNoVHlwZSBKT0lOX0ZFVENIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpvaW5GZXRjaCgpIDxlbT5Kb2luIEZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKb2luRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKb2luRmV0Y2hUeXBlIGpvaW5GZXRjaCA9IEpPSU5fRkVUQ0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT25lVG9NYW55KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfT05FX1RPX01BTlk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpdmF0ZSBPd25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcml2YXRlIE93bmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcml2YXRlT3duZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJpdmF0ZU93bmVkX1ByaXZhdGVPd25lZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcml2YXRlT3duZWQoKQotCXsKLQkJcmV0dXJuIHByaXZhdGVPd25lZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2lzUHJpdmF0ZU93bmVkIDxlbT5Qcml2YXRlIE93bmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcml2YXRlIE93bmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1ByaXZhdGVPd25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaXZhdGVPd25lZChib29sZWFuIG5ld1ByaXZhdGVPd25lZCkKLQl7Ci0JCWJvb2xlYW4gb2xkUHJpdmF0ZU93bmVkID0gcHJpdmF0ZU93bmVkOwotCQlwcml2YXRlT3duZWQgPSBuZXdQcml2YXRlT3duZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BSSVZBVEVfT1dORUQsIG9sZFByaXZhdGVPd25lZCwgcHJpdmF0ZU93bmVkKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQotCSAqIEBzZWUgI3NldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0Sm9pbkZldGNoKCkKLQl7Ci0JCXJldHVybiBqb2luRmV0Y2g7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRKb2luRmV0Y2ggPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAc2VlICNnZXRKb2luRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSBuZXdKb2luRmV0Y2gpCi0JewotCQlYbWxKb2luRmV0Y2hUeXBlIG9sZEpvaW5GZXRjaCA9IGpvaW5GZXRjaDsKLQkJam9pbkZldGNoID0gbmV3Sm9pbkZldGNoID09IG51bGwgPyBKT0lOX0ZFVENIX0VERUZBVUxUIDogbmV3Sm9pbkZldGNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19KT0lOX0ZFVENILCBvbGRKb2luRmV0Y2gsIGpvaW5GZXRjaCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29udmVydGVyKFhtbENvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX0NvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29udmVydGVyIGdldENvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gY29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgbmV3Q29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29udmVydGVyIG9sZENvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJY29udmVydGVyID0gbmV3Q29udmVydGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVIsIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldENvbnZlcnRlciA8ZW0+Q29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgbmV3Q29udmVydGVyKQotCXsKLQkJaWYgKG5ld0NvbnZlcnRlciAhPSBjb252ZXJ0ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udmVydGVyKG5ld0NvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVIsIG5ld0NvbnZlcnRlciwgbmV3Q29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9UeXBlQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUeXBlQ29udmVydGVyIGdldFR5cGVDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyIG5ld1R5cGVDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxUeXBlQ29udmVydGVyIG9sZFR5cGVDb252ZXJ0ZXIgPSB0eXBlQ29udmVydGVyOwotCQl0eXBlQ29udmVydGVyID0gbmV3VHlwZUNvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVFlQRV9DT05WRVJURVIsIG9sZFR5cGVDb252ZXJ0ZXIsIG5ld1R5cGVDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0VHlwZUNvbnZlcnRlciA8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyIG5ld1R5cGVDb252ZXJ0ZXIpCi0JewotCQlpZiAobmV3VHlwZUNvbnZlcnRlciAhPSB0eXBlQ29udmVydGVyKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0eXBlQ29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXR5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdUeXBlQ29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VHlwZUNvbnZlcnRlcihuZXdUeXBlQ29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSLCBuZXdUeXBlQ29udmVydGVyLCBuZXdUeXBlQ29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9PYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxPYmplY3RUeXBlQ29udmVydGVyIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIG9sZE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvYmplY3RUeXBlQ29udmVydGVyOwotCQlvYmplY3RUeXBlQ29udmVydGVyID0gbmV3T2JqZWN0VHlwZUNvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBvbGRPYmplY3RUeXBlQ29udmVydGVyLCBuZXdPYmplY3RUeXBlQ29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldE9iamVjdFR5cGVDb252ZXJ0ZXIgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIpCi0JewotCQlpZiAobmV3T2JqZWN0VHlwZUNvbnZlcnRlciAhPSBvYmplY3RUeXBlQ29udmVydGVyKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChvYmplY3RUeXBlQ29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW9iamVjdFR5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBuZXdPYmplY3RUeXBlQ29udmVydGVyLCBuZXdPYmplY3RUeXBlQ29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxTdHJ1Y3RDb252ZXJ0ZXIgZ2V0U3RydWN0Q29udmVydGVyKCkKLQl7Ci0JCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciBuZXdTdHJ1Y3RDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgb2xkU3RydWN0Q29udmVydGVyID0gc3RydWN0Q29udmVydGVyOwotCQlzdHJ1Y3RDb252ZXJ0ZXIgPSBuZXdTdHJ1Y3RDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVIsIG9sZFN0cnVjdENvbnZlcnRlciwgbmV3U3RydWN0Q29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldFN0cnVjdENvbnZlcnRlciA8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciBuZXdTdHJ1Y3RDb252ZXJ0ZXIpCi0JewotCQlpZiAobmV3U3RydWN0Q29udmVydGVyICE9IHN0cnVjdENvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc3RydWN0Q29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXN0cnVjdENvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1N0cnVjdENvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTdHJ1Y3RDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFN0cnVjdENvbnZlcnRlcihuZXdTdHJ1Y3RDb252ZXJ0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUiwgbmV3U3RydWN0Q29udmVydGVyLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JewotCQlpZiAobWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgPT0gbnVsbCkKLQkJewotCQkJbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4oWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcEtleUNvbnZlcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5Q29udmVydCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwS2V5Q29udmVydCgpCi0JewotCQlyZXR1cm4gbWFwS2V5Q29udmVydDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldE1hcEtleUNvbnZlcnQgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBLZXlDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwS2V5Q29udmVydChTdHJpbmcgbmV3TWFwS2V5Q29udmVydCkKLQl7Ci0JCVN0cmluZyBvbGRNYXBLZXlDb252ZXJ0ID0gbWFwS2V5Q29udmVydDsKLQkJbWFwS2V5Q29udmVydCA9IG5ld01hcEtleUNvbnZlcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVCwgb2xkTWFwS2V5Q29udmVydCwgbWFwS2V5Q29udmVydCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoSG9sZGVyX0JhdGNoRmV0Y2goKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEJhdGNoRmV0Y2ggZ2V0QmF0Y2hGZXRjaCgpCi0JewotCQlyZXR1cm4gYmF0Y2hGZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2ggbmV3QmF0Y2hGZXRjaCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEJhdGNoRmV0Y2ggb2xkQmF0Y2hGZXRjaCA9IGJhdGNoRmV0Y2g7Ci0JCWJhdGNoRmV0Y2ggPSBuZXdCYXRjaEZldGNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19CQVRDSF9GRVRDSCwgb2xkQmF0Y2hGZXRjaCwgbmV3QmF0Y2hGZXRjaCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRCYXRjaEZldGNoIDxlbT5CYXRjaCBGZXRjaDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEJhdGNoRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2ggbmV3QmF0Y2hGZXRjaCkKLQl7Ci0JCWlmIChuZXdCYXRjaEZldGNoICE9IGJhdGNoRmV0Y2gpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGJhdGNoRmV0Y2ggIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYmF0Y2hGZXRjaCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0JBVENIX0ZFVENILCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdCYXRjaEZldGNoICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0JhdGNoRmV0Y2gpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19CQVRDSF9GRVRDSCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRCYXRjaEZldGNoKG5ld0JhdGNoRmV0Y2gsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQkFUQ0hfRkVUQ0gsIG5ld0JhdGNoRmV0Y2gsIG5ld0JhdGNoRmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8xX0F0dHJpYnV0ZVR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgbmV3QXR0cmlidXRlVHlwZSkKLQl7Ci0JCVN0cmluZyBvbGRBdHRyaWJ1dGVUeXBlID0gYXR0cmlidXRlVHlwZTsKLQkJYXR0cmlidXRlVHlwZSA9IG5ld0F0dHJpYnV0ZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FUVFJJQlVURV9UWVBFLCBvbGRBdHRyaWJ1dGVUeXBlLCBhdHRyaWJ1dGVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldENvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VHlwZUNvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldE9iamVjdFR5cGVDb252ZXJ0ZXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QmF0Y2hGZXRjaChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGdldFR5cGVDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGdldFN0cnVjdENvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOgotCQkJCXJldHVybiBnZXRNYXBLZXlDb252ZXJ0KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBnZXRCYXRjaEZldGNoKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUFJJVkFURV9PV05FRDoKLQkJCQlyZXR1cm4gaXNQcml2YXRlT3duZWQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9GRVRDSDoKLQkJCQlyZXR1cm4gZ2V0Sm9pbkZldGNoKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVI6Ci0JCQkJc2V0Q29udmVydGVyKChYbWxDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0VHlwZUNvbnZlcnRlcigoWG1sVHlwZUNvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0T2JqZWN0VHlwZUNvbnZlcnRlcigoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXNldFN0cnVjdENvbnZlcnRlcigoWG1sU3RydWN0Q29udmVydGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXNzb2NpYXRpb25PdmVycmlkZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOgotCQkJCXNldE1hcEtleUNvbnZlcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19CQVRDSF9GRVRDSDoKLQkJCQlzZXRCYXRjaEZldGNoKChYbWxCYXRjaEZldGNoKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BSSVZBVEVfT1dORUQ6Ci0JCQkJc2V0UHJpdmF0ZU93bmVkKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fRkVUQ0g6Ci0JCQkJc2V0Sm9pbkZldGNoKChYbWxKb2luRmV0Y2hUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0NPTlZFUlRFUjoKLQkJCQlzZXRDb252ZXJ0ZXIoKFhtbENvbnZlcnRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldFR5cGVDb252ZXJ0ZXIoKFhtbFR5cGVDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0T2JqZWN0VHlwZUNvbnZlcnRlcigoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJc2V0U3RydWN0Q29udmVydGVyKChYbWxTdHJ1Y3RDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQ6Ci0JCQkJc2V0TWFwS2V5Q29udmVydChNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJc2V0QmF0Y2hGZXRjaCgoWG1sQmF0Y2hGZXRjaCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoQVRUUklCVVRFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUklWQVRFX09XTkVEOgotCQkJCXNldFByaXZhdGVPd25lZChQUklWQVRFX09XTkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fRkVUQ0g6Ci0JCQkJc2V0Sm9pbkZldGNoKEpPSU5fRkVUQ0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gY29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiB0eXBlQ29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzICE9IG51bGwgJiYgIW1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOgotCQkJCXJldHVybiBNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQgPT0gbnVsbCA/IG1hcEtleUNvbnZlcnQgIT0gbnVsbCA6ICFNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQuZXF1YWxzKG1hcEtleUNvbnZlcnQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19CQVRDSF9GRVRDSDoKLQkJCQlyZXR1cm4gYmF0Y2hGZXRjaCAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BSSVZBVEVfT1dORUQ6Ci0JCQkJcmV0dXJuIHByaXZhdGVPd25lZCAhPSBQUklWQVRFX09XTkVEX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19KT0lOX0ZFVENIOgotCQkJCXJldHVybiBqb2luRmV0Y2ggIT0gSk9JTl9GRVRDSF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPbmVUb01hbnlfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmF0Y2hGZXRjaEhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQkFUQ0hfRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT25lVG9NYW55XzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV8yMV9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJpdmF0ZU93bmVkLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUklWQVRFX09XTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklWQVRFX09XTkVEX19QUklWQVRFX09XTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5GZXRjaC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVI7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVFlQRV9DT05WRVJURVI7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVI7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT25lVG9NYW55XzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhdGNoRmV0Y2hIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0JBVENIX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvTWFueV8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZXzIxX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByaXZhdGVPd25lZC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklWQVRFX09XTkVEX19QUklWQVRFX09XTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUFJJVkFURV9PV05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtYXBLZXlDb252ZXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYXBLZXlDb252ZXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdHRyaWJ1dGVUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdHRyaWJ1dGVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcml2YXRlT3duZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByaXZhdGVPd25lZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgam9pbkZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqb2luRmV0Y2gpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEpvaW5GZXRjaFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnkoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhcmdldEVudGl0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwcGVkQnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9ycGhhblJlbW92YWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZVR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9yZGVyQnlUcmFuc2xhdG9yKCksCi0JCQlYbWxPcmRlckNvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk9SREVSX0NPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9yZGVyYWJsZV8yXzBfT3JkZXJDb2x1bW4oKSksCQkKLQkJCWJ1aWxkTWFwS2V5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5VGVtcG9yYWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUVudW1lcmF0ZWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUNvbnZlcnRUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlDb2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByaXZhdGVPd25lZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRCYXRjaEZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlDb252ZXJ0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0NPTlZFUlQsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlDb252ZXJ0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk1BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREUsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOwotCX0JCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9Db252ZXJ0ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX1R5cGVDb252ZXJ0ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9PYmplY3RUeXBlQ29udmVydGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sU3RydWN0Q29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByaXZhdGVPd25lZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUklWQVRFX09XTkVELCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByaXZhdGVPd25lZF9Qcml2YXRlT3duZWQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpvaW5GZXRjaFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8xX0F0dHJpYnV0ZVR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRCYXRjaEZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEJhdGNoRmV0Y2guYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkJBVENIX0ZFVENILCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhdGNoRmV0Y2hIb2xkZXJfQmF0Y2hGZXRjaCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9PbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9PbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3ZGQ5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvT25lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb09uZV8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPbmUgVG8gT25lPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxPbmVUb09uZSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSBpbXBsZW1lbnRzIFhtbE9uZVRvT25lXzJfMSwgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sUHJpdmF0ZU93bmVkLCBYbWxKb2luRmV0Y2gKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXRjaEZldGNoKCkgPGVtPkJhdGNoIEZldGNoPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQmF0Y2hGZXRjaCBiYXRjaEZldGNoOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcml2YXRlT3duZWQoKSA8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNQcml2YXRlT3duZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUklWQVRFX09XTkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ByaXZhdGVPd25lZCgpIDxlbT5Qcml2YXRlIE93bmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1ByaXZhdGVPd25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpdmF0ZU93bmVkID0gUFJJVkFURV9PV05FRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhtbEpvaW5GZXRjaFR5cGUgSk9JTl9GRVRDSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luRmV0Y2goKSA8ZW0+Sm9pbiBGZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Sm9pbkZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSm9pbkZldGNoVHlwZSBqb2luRmV0Y2ggPSBKT0lOX0ZFVENIX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE9uZVRvT25lKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfT05FX1RPX09ORTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEJhdGNoRmV0Y2goWG1sQmF0Y2hGZXRjaCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcl9CYXRjaEZldGNoKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxCYXRjaEZldGNoIGdldEJhdGNoRmV0Y2goKQotCXsKLQkJcmV0dXJuIGJhdGNoRmV0Y2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoIG5ld0JhdGNoRmV0Y2gsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxCYXRjaEZldGNoIG9sZEJhdGNoRmV0Y2ggPSBiYXRjaEZldGNoOwotCQliYXRjaEZldGNoID0gbmV3QmF0Y2hGZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSCwgb2xkQmF0Y2hGZXRjaCwgbmV3QmF0Y2hGZXRjaCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldEJhdGNoRmV0Y2ggPGVtPkJhdGNoIEZldGNoPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QmF0Y2hGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhdGNoRmV0Y2goWG1sQmF0Y2hGZXRjaCBuZXdCYXRjaEZldGNoKQotCXsKLQkJaWYgKG5ld0JhdGNoRmV0Y2ggIT0gYmF0Y2hGZXRjaCkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYmF0Y2hGZXRjaCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCliYXRjaEZldGNoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QmF0Y2hGZXRjaCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCYXRjaEZldGNoKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRCYXRjaEZldGNoKG5ld0JhdGNoRmV0Y2gsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSCwgbmV3QmF0Y2hGZXRjaCwgbmV3QmF0Y2hGZXRjaCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByaXZhdGUgT3duZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByaXZhdGUgT3duZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaXZhdGVPd25lZF9Qcml2YXRlT3duZWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZU93bmVkKCkKLQl7Ci0JCXJldHVybiBwcml2YXRlT3duZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2lzUHJpdmF0ZU93bmVkIDxlbT5Qcml2YXRlIE93bmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcml2YXRlIE93bmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1ByaXZhdGVPd25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaXZhdGVPd25lZChib29sZWFuIG5ld1ByaXZhdGVPd25lZCkKLQl7Ci0JCWJvb2xlYW4gb2xkUHJpdmF0ZU93bmVkID0gcHJpdmF0ZU93bmVkOwotCQlwcml2YXRlT3duZWQgPSBuZXdQcml2YXRlT3duZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJVkFURV9PV05FRCwgb2xkUHJpdmF0ZU93bmVkLCBwcml2YXRlT3duZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCi0JICogQHNlZSAjc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKQotCXsKLQkJcmV0dXJuIGpvaW5GZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0Sm9pbkZldGNoIDxlbT5Kb2luIEZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCi0JICogQHNlZSAjZ2V0Sm9pbkZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgbmV3Sm9pbkZldGNoKQotCXsKLQkJWG1sSm9pbkZldGNoVHlwZSBvbGRKb2luRmV0Y2ggPSBqb2luRmV0Y2g7Ci0JCWpvaW5GZXRjaCA9IG5ld0pvaW5GZXRjaCA9PSBudWxsID8gSk9JTl9GRVRDSF9FREVGQVVMVCA6IG5ld0pvaW5GZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENILCBvbGRKb2luRmV0Y2gsIGpvaW5GZXRjaCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QmF0Y2hGZXRjaChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEJhdGNoRmV0Y2goKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklWQVRFX09XTkVEOgotCQkJCXJldHVybiBpc1ByaXZhdGVPd25lZCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0pPSU5fRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEpvaW5GZXRjaCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSDoKLQkJCQlzZXRCYXRjaEZldGNoKChYbWxCYXRjaEZldGNoKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJVkFURV9PV05FRDoKLQkJCQlzZXRQcml2YXRlT3duZWQoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENIOgotCQkJCXNldEpvaW5GZXRjaCgoWG1sSm9pbkZldGNoVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0JBVENIX0ZFVENIOgotCQkJCXNldEJhdGNoRmV0Y2goKFhtbEJhdGNoRmV0Y2gpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSVZBVEVfT1dORUQ6Ci0JCQkJc2V0UHJpdmF0ZU93bmVkKFBSSVZBVEVfT1dORURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENIOgotCQkJCXNldEpvaW5GZXRjaChKT0lOX0ZFVENIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBiYXRjaEZldGNoICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSVZBVEVfT1dORUQ6Ci0JCQkJcmV0dXJuIHByaXZhdGVPd25lZCAhPSBQUklWQVRFX09XTkVEX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0pPSU5fRkVUQ0g6Ci0JCQkJcmV0dXJuIGpvaW5GZXRjaCAhPSBKT0lOX0ZFVENIX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0JBVENIX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvT25lXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcml2YXRlT3duZWQuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJVkFURV9PV05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJVkFURV9PV05FRF9fUFJJVkFURV9PV05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSk9JTl9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhdGNoRmV0Y2hIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQkFUQ0hfRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT25lVG9PbmVfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByaXZhdGVPd25lZC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklWQVRFX09XTkVEX19QUklWQVRFX09XTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklWQVRFX09XTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5GZXRjaC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJpdmF0ZU93bmVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcml2YXRlT3duZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGpvaW5GZXRjaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoam9pbkZldGNoKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UHJpdmF0ZU93bmVkVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZShFY2xpcHNlTGluay5QUklWQVRFX09XTkVEKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT25lVG9PbmUoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhcmdldEVudGl0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9wdGlvbmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcHBlZEJ5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcnBoYW5SZW1vdmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBzSWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZElkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSm9pblRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXNjYWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcml2YXRlT3duZWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZEpvaW5GZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQmF0Y2hGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJpdmF0ZU93bmVkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJpdmF0ZU93bmVkX1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEJhdGNoRmV0Y2hUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQmF0Y2hGZXRjaC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQkFUQ0hfRkVUQ0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcl9CYXRjaEZldGNoKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPcHRpbWlzdGljTG9ja2luZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPcHRpbWlzdGljTG9ja2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGMzNmMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3B0aW1pc3RpY0xvY2tpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuQm9vbGVhblRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT3B0aW1pc3RpYyBMb2NraW5nPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyNnZXRDYXNjYWRlIDxlbT5DYXNjYWRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcjZ2V0U2VsZWN0ZWRDb2x1bW5zIDxlbT5TZWxlY3RlZCBDb2x1bW5zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9wdGltaXN0aWNMb2NraW5nKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE9wdGltaXN0aWNMb2NraW5nIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlKCkgPGVtPkNhc2NhZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhc2NhZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBDQVNDQURFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGUoKSA8ZW0+Q2FzY2FkZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gY2FzY2FkZSA9IENBU0NBREVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWxlY3RlZENvbHVtbnMoKSA8ZW0+U2VsZWN0ZWQgQ29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWxlY3RlZENvbHVtbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxDb2x1bW4+IHNlbGVjdGVkQ29sdW1uczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxPcHRpbWlzdGljTG9ja2luZygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX09QVElNSVNUSUNfTE9DS0lORzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZQotCSAqIEBzZWUgI3NldFR5cGUoWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcHRpbWlzdGljTG9ja2luZ19UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBnZXRUeXBlKCkKLQl7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgbmV3VHlwZSkKLQl7Ci0JCVhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGUgPT0gbnVsbCA/IFRZUEVfRURFRkFVTFQgOiBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcHRpbWlzdGljTG9ja2luZ19DYXNjYWRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRDYXNjYWRlKCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyNnZXRDYXNjYWRlIDxlbT5DYXNjYWRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXNjYWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZShCb29sZWFuIG5ld0Nhc2NhZGUpCi0JewotCQlCb29sZWFuIG9sZENhc2NhZGUgPSBjYXNjYWRlOwotCQljYXNjYWRlID0gbmV3Q2FzY2FkZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX0NBU0NBREUsIG9sZENhc2NhZGUsIGNhc2NhZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWxlY3RlZCBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWxlY3RlZCBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VsZWN0ZWQgQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfU2VsZWN0ZWRDb2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxDb2x1bW4+IGdldFNlbGVjdGVkQ29sdW1ucygpCi0JewotCQlpZiAoc2VsZWN0ZWRDb2x1bW5zID09IG51bGwpCi0JCXsKLQkJCXNlbGVjdGVkQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb2x1bW4+KFhtbENvbHVtbi5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1NFTEVDVEVEX0NPTFVNTlMpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZENvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2VsZWN0ZWRDb2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19DQVNDQURFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU5TOgotCQkJCXJldHVybiBnZXRTZWxlY3RlZENvbHVtbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFOgotCQkJCXNldFR5cGUoKFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERToKLQkJCQlzZXRDYXNjYWRlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU5TOgotCQkJCWdldFNlbGVjdGVkQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxDb2x1bW4+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERToKLQkJCQlzZXRDYXNjYWRlKENBU0NBREVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1NFTEVDVEVEX0NPTFVNTlM6Ci0JCQkJZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fVFlQRToKLQkJCQlyZXR1cm4gdHlwZSAhPSBUWVBFX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERToKLQkJCQlyZXR1cm4gQ0FTQ0FERV9FREVGQVVMVCA9PSBudWxsID8gY2FzY2FkZSAhPSBudWxsIDogIUNBU0NBREVfRURFRkFVTFQuZXF1YWxzKGNhc2NhZGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fU0VMRUNURURfQ09MVU1OUzoKLQkJCQlyZXR1cm4gc2VsZWN0ZWRDb2x1bW5zICE9IG51bGwgJiYgIXNlbGVjdGVkQ29sdW1ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhc2NhZGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXNjYWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTZWxlY3RlZENvbHVtblRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5PUFRJTUlTVElDX0xPQ0tJTkdfX1RZUEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYXNjYWRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcihFY2xpcHNlTGluay5PUFRJTUlTVElDX0xPQ0tJTkdfX0NBU0NBREUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfQ2FzY2FkZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTZWxlY3RlZENvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9QVElNSVNUSUNfTE9DS0lOR19fU0VMRUNURURfQ09MVU1OLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9wdGltaXN0aWNMb2NraW5nX1NlbGVjdGVkQ29sdW1ucygpKTsKLQl9Ci0KLX0gLy8gWG1sT3B0aW1pc3RpY0xvY2tpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9wdGltaXN0aWNMb2NraW5nVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDVmMGVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5YbWwgT3B0aW1pc3RpYyBMb2NraW5nIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFMTCBDT0xVTU5TPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FMTF9DT0xVTU5TX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQUxMX0NPTFVNTlMoMCwgIkFMTF9DT0xVTU5TIiwgIkFMTF9DT0xVTU5TIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DSEFOR0VEIENPTFVNTlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0hBTkdFRF9DT0xVTU5TX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQ0hBTkdFRF9DT0xVTU5TKDEsICJDSEFOR0VEX0NPTFVNTlMiLCAiQ0hBTkdFRF9DT0xVTU5TIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TRUxFQ1RFRCBDT0xVTU5TPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NFTEVDVEVEX0NPTFVNTlNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTRUxFQ1RFRF9DT0xVTU5TKDIsICJTRUxFQ1RFRF9DT0xVTU5TIiwgIlNFTEVDVEVEX0NPTFVNTlMiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlZFUlNJT04gQ09MVU1OPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1ZFUlNJT05fQ09MVU1OX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JVkVSU0lPTl9DT0xVTU4oMywgIlZFUlNJT05fQ09MVU1OIiwgIlZFUlNJT05fQ09MVU1OIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BTEwgQ09MVU1OUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QUxMIENPTFVNTlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQUxMX0NPTFVNTlMKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfQ09MVU1OU19WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DSEFOR0VEIENPTFVNTlM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNIQU5HRUQgQ09MVU1OUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDSEFOR0VEX0NPTFVNTlMKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEX0NPTFVNTlNfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VMRUNURUQgQ09MVU1OUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U0VMRUNURUQgQ09MVU1OUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRUxFQ1RFRF9DT0xVTU5TCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNURURfQ09MVU1OU19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5WRVJTSU9OIENPTFVNTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VkVSU0lPTiBDT0xVTU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVkVSU0lPTl9DT0xVTU4KLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX0NPTFVNTl9WQUxVRSA9IDM7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlW10KLQkJewotCQkJQUxMX0NPTFVNTlMsCi0JCQlDSEFOR0VEX0NPTFVNTlMsCi0JCQlTRUxFQ1RFRF9DT0xVTU5TLAotCQkJVkVSU0lPTl9DT0xVTU4sCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8WG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBPcHRpbWlzdGljIExvY2tpbmcgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBPcHRpbWlzdGljIExvY2tpbmcgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIEFMTF9DT0xVTU5TX1ZBTFVFOiByZXR1cm4gQUxMX0NPTFVNTlM7Ci0JCQljYXNlIENIQU5HRURfQ09MVU1OU19WQUxVRTogcmV0dXJuIENIQU5HRURfQ09MVU1OUzsKLQkJCWNhc2UgU0VMRUNURURfQ09MVU1OU19WQUxVRTogcmV0dXJuIFNFTEVDVEVEX0NPTFVNTlM7Ci0JCQljYXNlIFZFUlNJT05fQ09MVU1OX1ZBTFVFOiByZXR1cm4gVkVSU0lPTl9DT0xVTU47Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9yZGVyQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9yZGVyQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNDViYTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPcmRlckNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5PcmRlckNvcnJlY3Rpb25UeXBlXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9yZGVyIENvbHVtbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9yZGVyQ29sdW1uKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE9yZGVyQ29sdW1uIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uIGltcGxlbWVudHMgWG1sT3JkZXJDb2x1bW5fMl8wCi17Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCBDT1JSRUNUSU9OX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ycmVjdGlvblR5cGUoKSA8ZW0+Q29ycmVjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3JyZWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIGNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVElPTl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE9yZGVyQ29sdW1uKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfT1JERVJfQ09MVU1OOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvcnJlY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvcnJlY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3JyZWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAKLQkgKiBAc2VlICNzZXRDb3JyZWN0aW9uVHlwZShPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX0NvcnJlY3Rpb25UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIGdldENvcnJlY3Rpb25UeXBlKCkKLQl7Ci0JCXJldHVybiBjb3JyZWN0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4jZ2V0Q29ycmVjdGlvblR5cGUgPGVtPkNvcnJlY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29ycmVjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wCi0JICogQHNlZSAjZ2V0Q29ycmVjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3JyZWN0aW9uVHlwZShPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCBuZXdDb3JyZWN0aW9uVHlwZSkKLQl7Ci0JCU9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIG9sZENvcnJlY3Rpb25UeXBlID0gY29ycmVjdGlvblR5cGU7Ci0JCWNvcnJlY3Rpb25UeXBlID0gbmV3Q29ycmVjdGlvblR5cGUgPT0gbnVsbCA/IENPUlJFQ1RJT05fVFlQRV9FREVGQVVMVCA6IG5ld0NvcnJlY3Rpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fQ09SUkVDVElPTl9UWVBFLCBvbGRDb3JyZWN0aW9uVHlwZSwgY29ycmVjdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX0NPUlJFQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0Q29ycmVjdGlvblR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19DT1JSRUNUSU9OX1RZUEU6Ci0JCQkJc2V0Q29ycmVjdGlvblR5cGUoKE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19DT1JSRUNUSU9OX1RZUEU6Ci0JCQkJc2V0Q29ycmVjdGlvblR5cGUoQ09SUkVDVElPTl9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fQ09SUkVDVElPTl9UWVBFOgotCQkJCXJldHVybiBjb3JyZWN0aW9uVHlwZSAhPSBDT1JSRUNUSU9OX1RZUEVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9yZGVyQ29sdW1uXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX0NPUlJFQ1RJT05fVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl8yMF9fQ09SUkVDVElPTl9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT3JkZXJDb2x1bW5fMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fMjBfX0NPUlJFQ1RJT05fVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19DT1JSRUNUSU9OX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb3JyZWN0aW9uVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29ycmVjdGlvblR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE51bGxhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRJbnNlcnRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRVcGRhdGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbHVtbkRlZmluaXRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZENvcnJlY3Rpb25UeXBlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkJCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29ycmVjdGlvblR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuQ09SUkVDVElPTl9UWVBFLCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPcmRlckNvbHVtbl8yXzBfQ29ycmVjdGlvblR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYWM5MzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBpbXBsZW1lbnRzIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMQotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJYnVpbGREZWxpbWl0ZWRJZGVudGlmaWVyc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXNjYWRlUGVyc2lzdFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRW50aXR5TGlzdGVuZXJzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotfSAvLyBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQyODI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLkVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSNpc0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JewotCQlyZXR1cm4gZXhjbHVkZURlZmF1bHRNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhib29sZWFuIG5ld0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpCi0JewotCQlib29sZWFuIG9sZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPSBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOwotCQlleGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gbmV3RXhjbHVkZURlZmF1bHRNYXBwaW5nczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MsIG9sZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MsIGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGlzRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgIT0gRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChleGNsdWRlRGVmYXVsdE1hcHBpbmdzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGNsdWRlRGVmYXVsdE1hcHBpbmdzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpLAotCQkJWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuYnVpbGRUcmFuc2xhdG9yKEpQQS5QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYQ0xVREVfREVGQVVMVF9NQVBQSU5HUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJpbWFyeUtleS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQcmltYXJ5S2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNWVmNGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQcmltYXJ5S2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxQcmltYXJ5S2V5XzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUHJpbWFyeSBLZXk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFByaW1hcnlLZXkgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxQcmltYXJ5S2V5XzFfMSwgWG1sUHJpbWFyeUtleV8yXzEKLXsKLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJZFZhbGlkYXRpb25UeXBlXzFfMSBWQUxJREFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQkKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWxpZGF0aW9uKCkgPGVtPlZhbGlkYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbGlkYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJZFZhbGlkYXRpb25UeXBlXzFfMSB2YWxpZGF0aW9uID0gVkFMSURBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbHVtbnMoKSA8ZW0+Q29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2x1bW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQ29sdW1uPiBjb2x1bW5zOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhY2hlS2V5VHlwZSgpIDxlbT5DYWNoZSBLZXkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FjaGVLZXlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENhY2hlS2V5VHlwZV8yXzEgQ0FDSEVfS0VZX1RZUEVfRURFRkFVTFQgPSBDYWNoZUtleVR5cGVfMl8xLklEX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FjaGVLZXlUeXBlKCkgPGVtPkNhY2hlIEtleSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWNoZUtleVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDYWNoZUtleVR5cGVfMl8xIGNhY2hlS2V5VHlwZSA9IENBQ0hFX0tFWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFByaW1hcnlLZXkoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9QUklNQVJZX0tFWTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWxpZGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuSWRWYWxpZGF0aW9uVHlwZV8xXzF9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xCi0JICogQHNlZSAjc2V0VmFsaWRhdGlvbihJZFZhbGlkYXRpb25UeXBlXzFfMSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleV8xXzFfVmFsaWRhdGlvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJZFZhbGlkYXRpb25UeXBlXzFfMSBnZXRWYWxpZGF0aW9uKCkKLQl7Ci0JCXJldHVybiB2YWxpZGF0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5I2dldFZhbGlkYXRpb24gPGVtPlZhbGlkYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbGlkYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuSWRWYWxpZGF0aW9uVHlwZV8xXzEKLQkgKiBAc2VlICNnZXRWYWxpZGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbihJZFZhbGlkYXRpb25UeXBlXzFfMSBuZXdWYWxpZGF0aW9uKQotCXsKLQkJSWRWYWxpZGF0aW9uVHlwZV8xXzEgb2xkVmFsaWRhdGlvbiA9IHZhbGlkYXRpb247Ci0JCXZhbGlkYXRpb24gPSBuZXdWYWxpZGF0aW9uID09IG51bGwgPyBWQUxJREFUSU9OX0VERUZBVUxUIDogbmV3VmFsaWRhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fVkFMSURBVElPTiwgb2xkVmFsaWRhdGlvbiwgdmFsaWRhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5XzFfMV9Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxDb2x1bW4+IGdldENvbHVtbnMoKQotCXsKLQkJaWYgKGNvbHVtbnMgPT0gbnVsbCkKLQkJewotCQkJY29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb2x1bW4+KFhtbENvbHVtbi5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fQ09MVU1OUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FjaGUgS2V5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5DYWNoZUtleVR5cGVfMl8xfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhY2hlIEtleSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEtleSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzEKLQkgKiBAc2VlICNzZXRDYWNoZUtleVR5cGUoQ2FjaGVLZXlUeXBlXzJfMSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleV8yXzFfQ2FjaGVLZXlUeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhY2hlS2V5VHlwZV8yXzEgZ2V0Q2FjaGVLZXlUeXBlKCkKLQl7Ci0JCXJldHVybiBjYWNoZUtleVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXkjZ2V0Q2FjaGVLZXlUeXBlIDxlbT5DYWNoZSBLZXkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgS2V5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQ2FjaGVLZXlUeXBlXzJfMQotCSAqIEBzZWUgI2dldENhY2hlS2V5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhY2hlS2V5VHlwZShDYWNoZUtleVR5cGVfMl8xIG5ld0NhY2hlS2V5VHlwZSkKLQl7Ci0JCUNhY2hlS2V5VHlwZV8yXzEgb2xkQ2FjaGVLZXlUeXBlID0gY2FjaGVLZXlUeXBlOwotCQljYWNoZUtleVR5cGUgPSBuZXdDYWNoZUtleVR5cGUgPT0gbnVsbCA/IENBQ0hFX0tFWV9UWVBFX0VERUZBVUxUIDogbmV3Q2FjaGVLZXlUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DQUNIRV9LRVlfVFlQRSwgb2xkQ2FjaGVLZXlUeXBlLCBjYWNoZUtleVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fQ09MVU1OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fVkFMSURBVElPTjoKLQkJCQlyZXR1cm4gZ2V0VmFsaWRhdGlvbigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DT0xVTU5TOgotCQkJCXJldHVybiBnZXRDb2x1bW5zKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX0NBQ0hFX0tFWV9UWVBFOgotCQkJCXJldHVybiBnZXRDYWNoZUtleVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX1ZBTElEQVRJT046Ci0JCQkJc2V0VmFsaWRhdGlvbigoSWRWYWxpZGF0aW9uVHlwZV8xXzEpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fQ09MVU1OUzoKLQkJCQlnZXRDb2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRDb2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxDb2x1bW4+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX0NBQ0hFX0tFWV9UWVBFOgotCQkJCXNldENhY2hlS2V5VHlwZSgoQ2FjaGVLZXlUeXBlXzJfMSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19WQUxJREFUSU9OOgotCQkJCXNldFZhbGlkYXRpb24oVkFMSURBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DT0xVTU5TOgotCQkJCWdldENvbHVtbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fQ0FDSEVfS0VZX1RZUEU6Ci0JCQkJc2V0Q2FjaGVLZXlUeXBlKENBQ0hFX0tFWV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19WQUxJREFUSU9OOgotCQkJCXJldHVybiB2YWxpZGF0aW9uICE9IFZBTElEQVRJT05fRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGNvbHVtbnMgIT0gbnVsbCAmJiAhY29sdW1ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX0NBQ0hFX0tFWV9UWVBFOgotCQkJCXJldHVybiBjYWNoZUtleVR5cGUgIT0gQ0FDSEVfS0VZX1RZUEVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByaW1hcnlLZXlfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DQUNIRV9LRVlfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZXzIxX19DQUNIRV9LRVlfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByaW1hcnlLZXlfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9QUklNQVJZX0tFWV8yMV9fQ0FDSEVfS0VZX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DQUNIRV9LRVlfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbGlkYXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbGlkYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhY2hlS2V5VHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FjaGVLZXlUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJpbWFyeUtleSgpLAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZFZhbGlkYXRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZENhY2hlS2V5VHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29sdW1uVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFZhbGlkYXRpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsxXzEuUFJJTUFSWV9LRVlfX1ZBTElEQVRJT04sIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlfMV8xX1ZhbGlkYXRpb24oKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FjaGVLZXlUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkNBQ0hFX0tFWV9UWVBFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5XzJfMV9DYWNoZUtleVR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvbHVtbi5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsxXzEuUFJJTUFSWV9LRVlfX0NPTFVNTiwgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJpbWFyeUtleV8xXzFfQ29sdW1ucygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaXZhdGVPd25lZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQcml2YXRlT3duZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllZGI4Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaXZhdGVPd25lZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQcml2YXRlIE93bmVkPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZCNpc1ByaXZhdGVPd25lZCA8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcml2YXRlT3duZWQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFByaXZhdGVPd25lZCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcml2YXRlIE93bmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcml2YXRlIE93bmVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaXZhdGUgT3duZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByaXZhdGVPd25lZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcml2YXRlT3duZWRfUHJpdmF0ZU93bmVkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUHJpdmF0ZU93bmVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpdmF0ZU93bmVkI2lzUHJpdmF0ZU93bmVkIDxlbT5Qcml2YXRlIE93bmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcml2YXRlIE93bmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1ByaXZhdGVPd25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4gdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBwcml2YXRlLW93bmVkIGF0dGlidXRlLgotCSAqLwotCVRleHRSYW5nZSBnZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByb3BlcnR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MTkyYzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5I2dldFZhbHVlVHlwZSA8ZW0+VmFsdWUgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxQcm9wZXJ0eSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlVHlwZSgpIDxlbT5WYWx1ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVUeXBlKCkgPGVtPlZhbHVlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZVR5cGUgPSBWQUxVRV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFByb3BlcnR5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eV9WYWx1ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLQl7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpCi0JewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlfVmFsdWVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVUeXBlKCkKLQl7Ci0JCXJldHVybiB2YWx1ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5I2dldFZhbHVlVHlwZSA8ZW0+VmFsdWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVUeXBlKFN0cmluZyBuZXdWYWx1ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkVmFsdWVUeXBlID0gdmFsdWVUeXBlOwotCQl2YWx1ZVR5cGUgPSBuZXdWYWx1ZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFX1RZUEUsIG9sZFZhbHVlVHlwZSwgdmFsdWVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlVHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19WQUxVRV9UWVBFOgotCQkJCXNldFZhbHVlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFX1RZUEU6Ci0JCQkJc2V0VmFsdWVUeXBlKFZBTFVFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFX1RZUEU6Ci0JCQkJcmV0dXJuIFZBTFVFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlVHlwZSAhPSBudWxsIDogIVZBTFVFX1RZUEVfRURFRkFVTFQuZXF1YWxzKHZhbHVlVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRWYWx1ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVmFsdWVUeXBlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZX19OQU1FLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5X05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFlfX1ZBTFVFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5X1ZhbHVlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFZhbHVlVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWV9fVkFMVUVfVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eV9WYWx1ZVR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi19IC8vIFhtbFByb3BlcnR5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByb3BlcnR5Q29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByb3BlcnR5Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmY2NlMDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQcm9wZXJ0eUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFByb3BlcnR5IENvbnRhaW5lcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHlDb250YWluZXIjZ2V0UHJvcGVydGllcyA8ZW0+UHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUHJvcGVydHlDb250YWluZXIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpOwotCi19IC8vIFhtbFByb3BlcnR5Q29udGFpbmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5Q29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMWRjZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxRdWVyeUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFF1ZXJ5IENvbnRhaW5lcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIjZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzIDxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFF1ZXJ5Q29udGFpbmVyIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+IGdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpOwotCi19IC8vIFhtbFF1ZXJ5Q29udGFpbmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5UmVkaXJlY3RvcnMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUXVlcnlSZWRpcmVjdG9ycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmFmMGRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUXVlcnlSZWRpcmVjdG9ycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGluazJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBRdWVyeSBSZWRpcmVjdG9yczwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFF1ZXJ5UmVkaXJlY3RvcnMgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGxRdWVyaWVzKCkgPGVtPkFsbCBRdWVyaWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbGxRdWVyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfUVVFUklFU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGxRdWVyaWVzKCkgPGVtPkFsbCBRdWVyaWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbGxRdWVyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFsbFF1ZXJpZXMgPSBBTExfUVVFUklFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFkQWxsKCkgPGVtPlJlYWQgQWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFkQWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX0FMTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFkQWxsKCkgPGVtPlJlYWQgQWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFkQWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlYWRBbGwgPSBSRUFEX0FMTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFkT2JqZWN0KCkgPGVtPlJlYWQgT2JqZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFkT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX09CSkVDVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFkT2JqZWN0KCkgPGVtPlJlYWQgT2JqZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFkT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlYWRPYmplY3QgPSBSRUFEX09CSkVDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBvcnQoKSA8ZW0+UmVwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBvcnQoKSA8ZW0+UmVwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVwb3J0ID0gUkVQT1JUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVwZGF0ZSgpIDxlbT5VcGRhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBEQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVwZGF0ZSgpIDxlbT5VcGRhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1cGRhdGUgPSBVUERBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5zZXJ0KCkgPGVtPkluc2VydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5zZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNFUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5zZXJ0KCkgPGVtPkluc2VydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5zZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGluc2VydCA9IElOU0VSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWxldGUoKSA8ZW0+RGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWxldGUoKSA8ZW0+RGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVsZXRlID0gREVMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFF1ZXJ5UmVkaXJlY3RvcnMoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9RVUVSWV9SRURJUkVDVE9SUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbGwgUXVlcmllczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWxsIFF1ZXJpZXM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWxsIFF1ZXJpZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsbFF1ZXJpZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9BbGxRdWVyaWVzKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbGxRdWVyaWVzKCkKLQl7Ci0JCXJldHVybiBhbGxRdWVyaWVzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeVJlZGlyZWN0b3JzI2dldEFsbFF1ZXJpZXMgPGVtPkFsbCBRdWVyaWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgUXVlcmllczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWxsUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbFF1ZXJpZXMoU3RyaW5nIG5ld0FsbFF1ZXJpZXMpCi0JewotCQlTdHJpbmcgb2xkQWxsUXVlcmllcyA9IGFsbFF1ZXJpZXM7Ci0JCWFsbFF1ZXJpZXMgPSBuZXdBbGxRdWVyaWVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19BTExfUVVFUklFUywgb2xkQWxsUXVlcmllcywgYWxsUXVlcmllcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlYWQgQWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWFkIEFsbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIEFsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVhZEFsbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlYWRBbGwoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlYWRBbGwoKQotCXsKLQkJcmV0dXJuIHJlYWRBbGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5UmVkaXJlY3RvcnMjZ2V0UmVhZEFsbCA8ZW0+UmVhZCBBbGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgQWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWFkQWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZEFsbChTdHJpbmcgbmV3UmVhZEFsbCkKLQl7Ci0JCVN0cmluZyBvbGRSZWFkQWxsID0gcmVhZEFsbDsKLQkJcmVhZEFsbCA9IG5ld1JlYWRBbGw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfQUxMLCBvbGRSZWFkQWxsLCByZWFkQWxsKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhZCBPYmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlYWQgT2JqZWN0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgT2JqZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWFkT2JqZWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVhZE9iamVjdCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVhZE9iamVjdCgpCi0JewotCQlyZXR1cm4gcmVhZE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9ycyNnZXRSZWFkT2JqZWN0IDxlbT5SZWFkIE9iamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBPYmplY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlYWRPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT2JqZWN0KFN0cmluZyBuZXdSZWFkT2JqZWN0KQotCXsKLQkJU3RyaW5nIG9sZFJlYWRPYmplY3QgPSByZWFkT2JqZWN0OwotCQlyZWFkT2JqZWN0ID0gbmV3UmVhZE9iamVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVBRF9PQkpFQ1QsIG9sZFJlYWRPYmplY3QsIHJlYWRPYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcG9ydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlcG9ydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlcG9ydCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwb3J0KCkKLQl7Ci0JCXJldHVybiByZXBvcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5UmVkaXJlY3RvcnMjZ2V0UmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcG9ydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwb3J0KFN0cmluZyBuZXdSZXBvcnQpCi0JewotCQlTdHJpbmcgb2xkUmVwb3J0ID0gcmVwb3J0OwotCQlyZXBvcnQgPSBuZXdSZXBvcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFUE9SVCwgb2xkUmVwb3J0LCByZXBvcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcGRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVwZGF0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVwZGF0ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1VwZGF0ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXBkYXRlKCkKLQl7Ci0JCXJldHVybiB1cGRhdGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5UmVkaXJlY3RvcnMjZ2V0VXBkYXRlIDxlbT5VcGRhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlKFN0cmluZyBuZXdVcGRhdGUpCi0JewotCQlTdHJpbmcgb2xkVXBkYXRlID0gdXBkYXRlOwotCQl1cGRhdGUgPSBuZXdVcGRhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1VQREFURSwgb2xkVXBkYXRlLCB1cGRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnNlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluc2VydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEluc2VydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0luc2VydCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5zZXJ0KCkKLQl7Ci0JCXJldHVybiBpbnNlcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5UmVkaXJlY3RvcnMjZ2V0SW5zZXJ0IDxlbT5JbnNlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW5zZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0KFN0cmluZyBuZXdJbnNlcnQpCi0JewotCQlTdHJpbmcgb2xkSW5zZXJ0ID0gaW5zZXJ0OwotCQlpbnNlcnQgPSBuZXdJbnNlcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX0lOU0VSVCwgb2xkSW5zZXJ0LCBpbnNlcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlbGV0ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0RlbGV0ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVsZXRlKCkKLQl7Ci0JCXJldHVybiBkZWxldGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5UmVkaXJlY3RvcnMjZ2V0RGVsZXRlIDxlbT5EZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlKFN0cmluZyBuZXdEZWxldGUpCi0JewotCQlTdHJpbmcgb2xkRGVsZXRlID0gZGVsZXRlOwotCQlkZWxldGUgPSBuZXdEZWxldGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX0RFTEVURSwgb2xkRGVsZXRlLCBkZWxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fQUxMX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIGdldEFsbFF1ZXJpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVBRF9BTEw6Ci0JCQkJcmV0dXJuIGdldFJlYWRBbGwoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVBRF9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGdldFJlYWRPYmplY3QoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVQT1JUOgotCQkJCXJldHVybiBnZXRSZXBvcnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fVVBEQVRFOgotCQkJCXJldHVybiBnZXRVcGRhdGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fSU5TRVJUOgotCQkJCXJldHVybiBnZXRJbnNlcnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fREVMRVRFOgotCQkJCXJldHVybiBnZXREZWxldGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX0FMTF9RVUVSSUVTOgotCQkJCXNldEFsbFF1ZXJpZXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRUFEX0FMTDoKLQkJCQlzZXRSZWFkQWxsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVBRF9PQkpFQ1Q6Ci0JCQkJc2V0UmVhZE9iamVjdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFUE9SVDoKLQkJCQlzZXRSZXBvcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19VUERBVEU6Ci0JCQkJc2V0VXBkYXRlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fSU5TRVJUOgotCQkJCXNldEluc2VydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX0RFTEVURToKLQkJCQlzZXREZWxldGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19BTExfUVVFUklFUzoKLQkJCQlzZXRBbGxRdWVyaWVzKEFMTF9RVUVSSUVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfQUxMOgotCQkJCXNldFJlYWRBbGwoUkVBRF9BTExfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVBRF9PQkpFQ1Q6Ci0JCQkJc2V0UmVhZE9iamVjdChSRUFEX09CSkVDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRVBPUlQ6Ci0JCQkJc2V0UmVwb3J0KFJFUE9SVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19VUERBVEU6Ci0JCQkJc2V0VXBkYXRlKFVQREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19JTlNFUlQ6Ci0JCQkJc2V0SW5zZXJ0KElOU0VSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19ERUxFVEU6Ci0JCQkJc2V0RGVsZXRlKERFTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fQUxMX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIEFMTF9RVUVSSUVTX0VERUZBVUxUID09IG51bGwgPyBhbGxRdWVyaWVzICE9IG51bGwgOiAhQUxMX1FVRVJJRVNfRURFRkFVTFQuZXF1YWxzKGFsbFF1ZXJpZXMpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRUFEX0FMTDoKLQkJCQlyZXR1cm4gUkVBRF9BTExfRURFRkFVTFQgPT0gbnVsbCA/IHJlYWRBbGwgIT0gbnVsbCA6ICFSRUFEX0FMTF9FREVGQVVMVC5lcXVhbHMocmVhZEFsbCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfT0JKRUNUOgotCQkJCXJldHVybiBSRUFEX09CSkVDVF9FREVGQVVMVCA9PSBudWxsID8gcmVhZE9iamVjdCAhPSBudWxsIDogIVJFQURfT0JKRUNUX0VERUZBVUxULmVxdWFscyhyZWFkT2JqZWN0KTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVQT1JUOgotCQkJCXJldHVybiBSRVBPUlRfRURFRkFVTFQgPT0gbnVsbCA/IHJlcG9ydCAhPSBudWxsIDogIVJFUE9SVF9FREVGQVVMVC5lcXVhbHMocmVwb3J0KTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fVVBEQVRFOgotCQkJCXJldHVybiBVUERBVEVfRURFRkFVTFQgPT0gbnVsbCA/IHVwZGF0ZSAhPSBudWxsIDogIVVQREFURV9FREVGQVVMVC5lcXVhbHModXBkYXRlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fSU5TRVJUOgotCQkJCXJldHVybiBJTlNFUlRfRURFRkFVTFQgPT0gbnVsbCA/IGluc2VydCAhPSBudWxsIDogIUlOU0VSVF9FREVGQVVMVC5lcXVhbHMoaW5zZXJ0KTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fREVMRVRFOgotCQkJCXJldHVybiBERUxFVEVfRURFRkFVTFQgPT0gbnVsbCA/IGRlbGV0ZSAhPSBudWxsIDogIURFTEVURV9FREVGQVVMVC5lcXVhbHMoZGVsZXRlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWxsUXVlcmllczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWxsUXVlcmllcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhZEFsbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVhZEFsbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhZE9iamVjdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVhZE9iamVjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVwb3J0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXBvcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVwZGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXBkYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbnNlcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGluc2VydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVsZXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLAotCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzKCksCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZEFsbFF1ZXJpZXNUcmFuc2xhdG9yKCksCi0JCQlidWlsZFJlYWRBbGxUcmFuc2xhdG9yKCksCi0JCQlidWlsZFJlYWRPYmplY3RUcmFuc2xhdG9yKCksCi0JCQlidWlsZFJlcG9ydFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVXBkYXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRJbnNlcnRUcmFuc2xhdG9yKCksCi0JCQlidWlsZERlbGV0ZVRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWxsUXVlcmllc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5RVUVSWV9SRURJUkVDVE9SU19fQUxMX1FVRVJJRVMsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0FsbFF1ZXJpZXMoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmVhZEFsbFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5RVUVSWV9SRURJUkVDVE9SU19fUkVBRF9BTEwsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlYWRBbGwoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmVhZE9iamVjdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5RVUVSWV9SRURJUkVDVE9SU19fUkVBRF9PQkpFQ1QsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlYWRPYmplY3QoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmVwb3J0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlFVRVJZX1JFRElSRUNUT1JTX19SRVBPUlQsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0FsbFF1ZXJpZXMoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVXBkYXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlFVRVJZX1JFRElSRUNUT1JTX19VUERBVEUsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0FsbFF1ZXJpZXMoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSW5zZXJ0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlFVRVJZX1JFRElSRUNUT1JTX19JTlNFUlQsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0FsbFF1ZXJpZXMoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGVsZXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlFVRVJZX1JFRElSRUNUT1JTX19ERUxFVEUsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0FsbFF1ZXJpZXMoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19IC8vIFhtbFF1ZXJ5UmVkaXJlY3RvcnMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUmVhZE9ubHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUmVhZE9ubHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNDIyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJlYWRPbmx5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFJlYWQgT25seTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seSNnZXRSZWFkT25seSA8ZW0+UmVhZCBPbmx5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJlYWRPbmx5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxSZWFkT25seSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlYWRPbmx5KEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJlYWRPbmx5X1JlYWRPbmx5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldFJlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHkjZ2V0UmVhZE9ubHkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVhZE9ubHkoQm9vbGVhbiB2YWx1ZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHJlYWQtb25seSBhdHRpYnV0ZS4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0UmVhZE9ubHlUZXh0UmFuZ2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJldHVybkluc2VydC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxSZXR1cm5JbnNlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThkMzg2Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJldHVybkluc2VydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFJldHVybkluc2VydF8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFJldHVybiBJbnNlcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZXR1cm5JbnNlcnQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUmV0dXJuSW5zZXJ0IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sUmV0dXJuSW5zZXJ0XzJfMQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXR1cm5Pbmx5KCkgPGVtPlJldHVybiBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXR1cm5Pbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gUkVUVVJOX09OTFlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmV0dXJuT25seSgpIDxlbT5SZXR1cm4gT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV0dXJuT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gcmV0dXJuT25seSA9IFJFVFVSTl9PTkxZX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJldHVybkluc2VydCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1JFVFVSTl9JTlNFUlQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV0dXJuIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldHVybiBPbmx5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybiBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXR1cm5Pbmx5KEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJldHVybkluc2VydF8yXzFfUmV0dXJuT25seSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0UmV0dXJuT25seSgpCi0JewotCQlyZXR1cm4gcmV0dXJuT25seTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmV0dXJuSW5zZXJ0I2dldFJldHVybk9ubHkgPGVtPlJldHVybiBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXR1cm4gT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmV0dXJuT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJldHVybk9ubHkoQm9vbGVhbiBuZXdSZXR1cm5Pbmx5KQotCXsKLQkJQm9vbGVhbiBvbGRSZXR1cm5Pbmx5ID0gcmV0dXJuT25seTsKLQkJcmV0dXJuT25seSA9IG5ld1JldHVybk9ubHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkVUVVJOX0lOU0VSVF9fUkVUVVJOX09OTFksIG9sZFJldHVybk9ubHksIHJldHVybk9ubHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SRVRVUk5fSU5TRVJUX19SRVRVUk5fT05MWToKLQkJCQlyZXR1cm4gZ2V0UmV0dXJuT25seSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SRVRVUk5fSU5TRVJUX19SRVRVUk5fT05MWToKLQkJCQlzZXRSZXR1cm5Pbmx5KChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkVUVVJOX0lOU0VSVF9fUkVUVVJOX09OTFk6Ci0JCQkJc2V0UmV0dXJuT25seShSRVRVUk5fT05MWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SRVRVUk5fSU5TRVJUX19SRVRVUk5fT05MWToKLQkJCQlyZXR1cm4gUkVUVVJOX09OTFlfRURFRkFVTFQgPT0gbnVsbCA/IHJldHVybk9ubHkgIT0gbnVsbCA6ICFSRVRVUk5fT05MWV9FREVGQVVMVC5lcXVhbHMocmV0dXJuT25seSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJldHVybk9ubHk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJldHVybk9ubHkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZFJldHVybk9ubHlUcmFuc2xhdG9yKCl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSZXR1cm5Pbmx5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLlJFVFVSTl9PTkxZLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxSZXR1cm5JbnNlcnRfMl8xX1JldHVybk9ubHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMDM5Y2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgU3RvcmVkIFByb2NlZHVyZSBQYXJhbWV0ZXI8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0RGlyZWN0aW9uIDxlbT5EaXJlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRRdWVyeVBhcmFtZXRlciA8ZW0+UXVlcnkgUGFyYW1ldGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0SmRiY1R5cGUgPGVtPkpkYmMgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRKZGJjVHlwZU5hbWUgPGVtPkpkYmMgVHlwZSBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgWG1sRGlyZWN0aW9uIERJUkVDVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXJlY3Rpb24oKSA8ZW0+RGlyZWN0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXJlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxEaXJlY3Rpb24gZGlyZWN0aW9uID0gRElSRUNUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UXVlcnlQYXJhbWV0ZXIoKSA8ZW0+UXVlcnkgUGFyYW1ldGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRRdWVyeVBhcmFtZXRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUEFSQU1FVEVSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFF1ZXJ5UGFyYW1ldGVyKCkgPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UXVlcnlQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcXVlcnlQYXJhbWV0ZXIgPSBRVUVSWV9QQVJBTUVURVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKZGJjVHlwZSgpIDxlbT5KZGJjIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpkYmNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgSkRCQ19UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpkYmNUeXBlKCkgPGVtPkpkYmMgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmRiY1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIGpkYmNUeXBlID0gSkRCQ19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpkYmNUeXBlTmFtZSgpIDxlbT5KZGJjIFR5cGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmRiY1R5cGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKREJDX1RZUEVfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKZGJjVHlwZU5hbWUoKSA8ZW0+SmRiYyBUeXBlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpkYmNUeXBlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBqZGJjVHlwZU5hbWUgPSBKREJDX1RZUEVfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXJlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlyZWN0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpcmVjdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXJlY3Rpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbERpcmVjdGlvbgotCSAqIEBzZWUgI3NldERpcmVjdGlvbihYbWxEaXJlY3Rpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9EaXJlY3Rpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRGlyZWN0aW9uIGdldERpcmVjdGlvbigpCi0JewotCQlyZXR1cm4gZGlyZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0RGlyZWN0aW9uIDxlbT5EaXJlY3Rpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpcmVjdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlyZWN0aW9uCi0JICogQHNlZSAjZ2V0RGlyZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0aW9uKFhtbERpcmVjdGlvbiBuZXdEaXJlY3Rpb24pCi0JewotCQlYbWxEaXJlY3Rpb24gb2xkRGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCQlkaXJlY3Rpb24gPSBuZXdEaXJlY3Rpb24gPT0gbnVsbCA/IERJUkVDVElPTl9FREVGQVVMVCA6IG5ld0RpcmVjdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fRElSRUNUSU9OLCBvbGREaXJlY3Rpb24sIGRpcmVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlF1ZXJ5IFBhcmFtZXRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UXVlcnkgUGFyYW1ldGVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UXVlcnlQYXJhbWV0ZXIoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfUXVlcnlQYXJhbWV0ZXIoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWVyeVBhcmFtZXRlcigpCi0JewotCQlyZXR1cm4gcXVlcnlQYXJhbWV0ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRRdWVyeVBhcmFtZXRlciA8ZW0+UXVlcnkgUGFyYW1ldGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5RdWVyeSBQYXJhbWV0ZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFF1ZXJ5UGFyYW1ldGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVlcnlQYXJhbWV0ZXIoU3RyaW5nIG5ld1F1ZXJ5UGFyYW1ldGVyKQotCXsKLQkJU3RyaW5nIG9sZFF1ZXJ5UGFyYW1ldGVyID0gcXVlcnlQYXJhbWV0ZXI7Ci0JCXF1ZXJ5UGFyYW1ldGVyID0gbmV3UXVlcnlQYXJhbWV0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1FVRVJZX1BBUkFNRVRFUiwgb2xkUXVlcnlQYXJhbWV0ZXIsIHF1ZXJ5UGFyYW1ldGVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX1R5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLQl7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpCi0JewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SmRiYyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KZGJjIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmRiYyBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRKZGJjVHlwZShJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfSmRiY1R5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SmRiY1R5cGUoKQotCXsKLQkJcmV0dXJuIGpkYmNUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0SmRiY1R5cGUgPGVtPkpkYmMgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmRiYyBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRKZGJjVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpkYmNUeXBlKEludGVnZXIgbmV3SmRiY1R5cGUpCi0JewotCQlJbnRlZ2VyIG9sZEpkYmNUeXBlID0gamRiY1R5cGU7Ci0JCWpkYmNUeXBlID0gbmV3SmRiY1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRSwgb2xkSmRiY1R5cGUsIGpkYmNUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SmRiYyBUeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpkYmMgVHlwZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpkYmMgVHlwZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRKZGJjVHlwZU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfSmRiY1R5cGVOYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmRiY1R5cGVOYW1lKCkKLQl7Ci0JCXJldHVybiBqZGJjVHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRKZGJjVHlwZU5hbWUgPGVtPkpkYmMgVHlwZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KZGJjIFR5cGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SmRiY1R5cGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SmRiY1R5cGVOYW1lKFN0cmluZyBuZXdKZGJjVHlwZU5hbWUpCi0JewotCQlTdHJpbmcgb2xkSmRiY1R5cGVOYW1lID0gamRiY1R5cGVOYW1lOwotCQlqZGJjVHlwZU5hbWUgPSBuZXdKZGJjVHlwZU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRV9OQU1FLCBvbGRKZGJjVHlwZU5hbWUsIGpkYmNUeXBlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19ESVJFQ1RJT046Ci0JCQkJcmV0dXJuIGdldERpcmVjdGlvbigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1FVRVJZX1BBUkFNRVRFUjoKLQkJCQlyZXR1cm4gZ2V0UXVlcnlQYXJhbWV0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEpkYmNUeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRV9OQU1FOgotCQkJCXJldHVybiBnZXRKZGJjVHlwZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0RJUkVDVElPTjoKLQkJCQlzZXREaXJlY3Rpb24oKFhtbERpcmVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19RVUVSWV9QQVJBTUVURVI6Ci0JCQkJc2V0UXVlcnlQYXJhbWV0ZXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEU6Ci0JCQkJc2V0SmRiY1R5cGUoKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFX05BTUU6Ci0JCQkJc2V0SmRiY1R5cGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fRElSRUNUSU9OOgotCQkJCXNldERpcmVjdGlvbihESVJFQ1RJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fUVVFUllfUEFSQU1FVEVSOgotCQkJCXNldFF1ZXJ5UGFyYW1ldGVyKFFVRVJZX1BBUkFNRVRFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEU6Ci0JCQkJc2V0SmRiY1R5cGUoSkRCQ19UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRV9OQU1FOgotCQkJCXNldEpkYmNUeXBlTmFtZShKREJDX1RZUEVfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fRElSRUNUSU9OOgotCQkJCXJldHVybiBkaXJlY3Rpb24gIT0gRElSRUNUSU9OX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1FVRVJZX1BBUkFNRVRFUjoKLQkJCQlyZXR1cm4gUVVFUllfUEFSQU1FVEVSX0VERUZBVUxUID09IG51bGwgPyBxdWVyeVBhcmFtZXRlciAhPSBudWxsIDogIVFVRVJZX1BBUkFNRVRFUl9FREVGQVVMVC5lcXVhbHMocXVlcnlQYXJhbWV0ZXIpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRToKLQkJCQlyZXR1cm4gSkRCQ19UWVBFX0VERUZBVUxUID09IG51bGwgPyBqZGJjVHlwZSAhPSBudWxsIDogIUpEQkNfVFlQRV9FREVGQVVMVC5lcXVhbHMoamRiY1R5cGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRToKLQkJCQlyZXR1cm4gSkRCQ19UWVBFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGpkYmNUeXBlTmFtZSAhPSBudWxsIDogIUpEQkNfVFlQRV9OQU1FX0VERUZBVUxULmVxdWFscyhqZGJjVHlwZU5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkaXJlY3Rpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRpcmVjdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcXVlcnlQYXJhbWV0ZXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHF1ZXJ5UGFyYW1ldGVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqZGJjVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoamRiY1R5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGpkYmNUeXBlTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoamRiY1R5cGVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkRGlyZWN0aW9uVHJhbnNsYXRvcigpLAotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRRdWVyeVBhcmFtZXRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSmRiY1R5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEpkYmNUeXBlTmFtZVRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGlyZWN0aW9uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBBUkFNRVRFUl9fRElSRUNUSU9OLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9EaXJlY3Rpb24oKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBBUkFNRVRFUl9fTkFNRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFF1ZXJ5UGFyYW1ldGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBBUkFNRVRFUl9fUVVFUllfUEFSQU1FVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9RdWVyeVBhcmFtZXRlcigpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUEFSQU1FVEVSX19UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9UeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSmRiY1R5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUEFSQU1FVEVSX19KREJDX1RZUEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSmRiY1R5cGVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBBUkFNRVRFUl9fSkRCQ19UWVBFX05BTUUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLX0gLy8gWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFN0cnVjdENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxTdHJ1Y3RDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlMjE4Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFN0cnVjdENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFN0cnVjdCBDdXN0b21Db252ZXJ0ZXI8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyI2dldENvbnZlcnRlciA8ZW0+Q29udmVydGVyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0cnVjdENvbnZlcnRlcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxTdHJ1Y3RDb252ZXJ0ZXIgZXh0ZW5kcyBYbWxOYW1lZENvbnZlcnRlcgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXIoKSA8ZW0+Q29udmVydGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRFUl9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVyKCkgPGVtPkNvbnZlcnRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRlciA9IENPTlZFUlRFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxTdHJ1Y3RDb252ZXJ0ZXIoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9TVFJVQ1RfQ09OVkVSVEVSOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3VzdG9tQ29udmVydGVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29udmVydGVyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sU3RydWN0Q29udmVydGVyX0NvbnZlcnRlcigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydGVyKCkKLQl7Ci0JCXJldHVybiBjb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlciNnZXRDb252ZXJ0ZXIgPGVtPkNvbnZlcnRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoU3RyaW5nIG5ld0NvbnZlcnRlcikKLQl7Ci0JCVN0cmluZyBvbGRDb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCWNvbnZlcnRlciA9IG5ld0NvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVFJVQ1RfQ09OVkVSVEVSX19DT05WRVJURVIsIG9sZENvbnZlcnRlciwgY29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRDb252ZXJ0ZXIoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSOgotCQkJCXNldENvbnZlcnRlcigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSOgotCQkJCXNldENvbnZlcnRlcihDT05WRVJURVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSOgotCQkJCXJldHVybiBDT05WRVJURVJfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnZlcnRlciAhPSBudWxsIDogIUNPTlZFUlRFUl9FREVGQVVMVC5lcXVhbHMoY29udmVydGVyKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29udmVydGVyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb252ZXJ0ZXIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLAotCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTdHJ1Y3RDb252ZXJ0ZXJfQ29udmVydGVyKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpOwotCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5jb252ZXJ0ZXIubGFzdEluZGV4T2Yob3JpZ2luYWxOYW1lKTsKLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSKS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOyAvLyArMSA9IG9wZW5pbmcgZG91YmxlIHF1b3RlCi0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0ICsgbmFtZUluZGV4LCBvcmlnaW5hbE5hbWUubGVuZ3RoKCksIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChTdHJpbmcgbmV3TmFtZSkgewotCQlpbnQgcGFja2FnZUxlbmd0aCA9IHRoaXMuY29udmVydGVyLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChwYWNrYWdlTGVuZ3RoID09IC0xKSB7Ci0JCQlwYWNrYWdlTGVuZ3RoID0gMDsKLQkJCW5ld05hbWUgPSBuZXdOYW1lICsgJy4nOwotCQl9Ci0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUikuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCwgcGFja2FnZUxlbmd0aCwgbmV3TmFtZSk7Ci0JfQotfSAvLyBYbWxTdHJ1Y3RDb252ZXJ0ZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGltZU9mRGF5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRpbWVPZkRheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTJiNzc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGltZU9mRGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVGltZSBPZiBEYXk8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldEhvdXIgPGVtPkhvdXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0TWludXRlIDxlbT5NaW51dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0U2Vjb25kIDxlbT5TZWNvbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0TWlsbGlzZWNvbmQgPGVtPk1pbGxpc2Vjb25kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRpbWVPZkRheSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxUaW1lT2ZEYXkgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhvdXIoKSA8ZW0+SG91cjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SG91cigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEhPVVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG91cigpIDxlbT5Ib3VyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIb3VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBob3VyID0gSE9VUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaW51dGUoKSA8ZW0+TWludXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW51dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBNSU5VVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWludXRlKCkgPGVtPk1pbnV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWludXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBtaW51dGUgPSBNSU5VVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vjb25kKCkgPGVtPlNlY29uZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2Vjb25kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgU0VDT05EX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY29uZCgpIDxlbT5TZWNvbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY29uZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgc2Vjb25kID0gU0VDT05EX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbGxpc2Vjb25kKCkgPGVtPk1pbGxpc2Vjb25kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaWxsaXNlY29uZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIE1JTExJU0VDT05EX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbGxpc2Vjb25kKCkgPGVtPk1pbGxpc2Vjb25kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaWxsaXNlY29uZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgbWlsbGlzZWNvbmQgPSBNSUxMSVNFQ09ORF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUaW1lT2ZEYXkoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9USU1FX09GX0RBWTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ib3VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ib3VyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhvdXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEhvdXIoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGltZU9mRGF5X0hvdXIoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SG91cigpCi0JewotCQlyZXR1cm4gaG91cjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldEhvdXIgPGVtPkhvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhvdXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhvdXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb3VyKEludGVnZXIgbmV3SG91cikKLQl7Ci0JCUludGVnZXIgb2xkSG91ciA9IGhvdXI7Ci0JCWhvdXIgPSBuZXdIb3VyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19IT1VSLCBvbGRIb3VyLCBob3VyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWludXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NaW51dGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWludXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNaW51dGUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGltZU9mRGF5X01pbnV0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRNaW51dGUoKQotCXsKLQkJcmV0dXJuIG1pbnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldE1pbnV0ZSA8ZW0+TWludXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NaW51dGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1pbnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbnV0ZShJbnRlZ2VyIG5ld01pbnV0ZSkKLQl7Ci0JCUludGVnZXIgb2xkTWludXRlID0gbWludXRlOwotCQltaW51dGUgPSBuZXdNaW51dGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX01JTlVURSwgb2xkTWludXRlLCBtaW51dGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWNvbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY29uZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWNvbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlY29uZChJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUaW1lT2ZEYXlfU2Vjb25kKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldFNlY29uZCgpCi0JewotCQlyZXR1cm4gc2Vjb25kOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0U2Vjb25kIDxlbT5TZWNvbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlY29uZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2Vjb25kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2Vjb25kKEludGVnZXIgbmV3U2Vjb25kKQotCXsKLQkJSW50ZWdlciBvbGRTZWNvbmQgPSBzZWNvbmQ7Ci0JCXNlY29uZCA9IG5ld1NlY29uZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fU0VDT05ELCBvbGRTZWNvbmQsIHNlY29uZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbGxpc2Vjb25kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NaWxsaXNlY29uZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaWxsaXNlY29uZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWlsbGlzZWNvbmQoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGltZU9mRGF5X01pbGxpc2Vjb25kKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldE1pbGxpc2Vjb25kKCkKLQl7Ci0JCXJldHVybiBtaWxsaXNlY29uZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldE1pbGxpc2Vjb25kIDxlbT5NaWxsaXNlY29uZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWlsbGlzZWNvbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1pbGxpc2Vjb25kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWlsbGlzZWNvbmQoSW50ZWdlciBuZXdNaWxsaXNlY29uZCkKLQl7Ci0JCUludGVnZXIgb2xkTWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZDsKLQkJbWlsbGlzZWNvbmQgPSBuZXdNaWxsaXNlY29uZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQsIG9sZE1pbGxpc2Vjb25kLCBtaWxsaXNlY29uZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19IT1VSOgotCQkJCXJldHVybiBnZXRIb3VyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX01JTlVURToKLQkJCQlyZXR1cm4gZ2V0TWludXRlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX1NFQ09ORDoKLQkJCQlyZXR1cm4gZ2V0U2Vjb25kKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX01JTExJU0VDT05EOgotCQkJCXJldHVybiBnZXRNaWxsaXNlY29uZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fSE9VUjoKLQkJCQlzZXRIb3VyKChJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX01JTlVURToKLQkJCQlzZXRNaW51dGUoKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fU0VDT05EOgotCQkJCXNldFNlY29uZCgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19NSUxMSVNFQ09ORDoKLQkJCQlzZXRNaWxsaXNlY29uZCgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19IT1VSOgotCQkJCXNldEhvdXIoSE9VUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19NSU5VVEU6Ci0JCQkJc2V0TWludXRlKE1JTlVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19TRUNPTkQ6Ci0JCQkJc2V0U2Vjb25kKFNFQ09ORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19NSUxMSVNFQ09ORDoKLQkJCQlzZXRNaWxsaXNlY29uZChNSUxMSVNFQ09ORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fSE9VUjoKLQkJCQlyZXR1cm4gSE9VUl9FREVGQVVMVCA9PSBudWxsID8gaG91ciAhPSBudWxsIDogIUhPVVJfRURFRkFVTFQuZXF1YWxzKGhvdXIpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19NSU5VVEU6Ci0JCQkJcmV0dXJuIE1JTlVURV9FREVGQVVMVCA9PSBudWxsID8gbWludXRlICE9IG51bGwgOiAhTUlOVVRFX0VERUZBVUxULmVxdWFscyhtaW51dGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19TRUNPTkQ6Ci0JCQkJcmV0dXJuIFNFQ09ORF9FREVGQVVMVCA9PSBudWxsID8gc2Vjb25kICE9IG51bGwgOiAhU0VDT05EX0VERUZBVUxULmVxdWFscyhzZWNvbmQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19NSUxMSVNFQ09ORDoKLQkJCQlyZXR1cm4gTUlMTElTRUNPTkRfRURFRkFVTFQgPT0gbnVsbCA/IG1pbGxpc2Vjb25kICE9IG51bGwgOiAhTUlMTElTRUNPTkRfRURFRkFVTFQuZXF1YWxzKG1pbGxpc2Vjb25kKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaG91cjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaG91cik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWludXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtaW51dGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlY29uZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2Vjb25kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaWxsaXNlY29uZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWlsbGlzZWNvbmQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRIb3VyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNaW51dGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNlY29uZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWlsbGlzZWNvbmRUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEhvdXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuRVhQSVJZX1RJTUVfT0ZfREFZX19IT1VSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFRpbWVPZkRheV9Ib3VyKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1pbnV0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWFBJUllfVElNRV9PRl9EQVlfX01JTlVURSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUaW1lT2ZEYXlfTWludXRlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNlY29uZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWFBJUllfVElNRV9PRl9EQVlfX1NFQ09ORCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUaW1lT2ZEYXlfU2Vjb25kKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1pbGxpc2Vjb25kVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYUElSWV9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGltZU9mRGF5X01pbGxpc2Vjb25kKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotfSAvLyBYbWxUaW1lT2ZEYXkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHJhbnNmb3JtYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHJhbnNmb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjMDA4Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRyYW5zZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFRyYW5zZm9ybWF0aW9uXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBUcmFuc2Zvcm1hdGlvbiBJbXBsPC9iPjwvZW0+Jy4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4gKgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHJhbnNmb3JtYXRpb24oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sVHJhbnNmb3JtYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxUcmFuc2Zvcm1hdGlvbl8yXzEsIFhtbEF0dHJpYnV0ZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVUeXBlID0gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUcmFuc2Zvcm1hdGlvbigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RSQU5TRk9STUFUSU9OOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUcmFuc2Zvcm1hdGlvbl8yXzFfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BVFRSSUJVVEVfVFlQRSwgb2xkQXR0cmlidXRlVHlwZSwgYXR0cmlidXRlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZShBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFRyYW5zZm9ybWF0aW9uXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl8yMV9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxUcmFuc2Zvcm1hdGlvbl8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OXzIxX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXR0cmlidXRlVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXR0cmlidXRlVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVFJBTlNGT1JNQVRJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLS8vCQkJYnVpbGRGZXRjaFRyYW5zbGF0b3IoKSwKLS8vCQkJYnVpbGRPcHRpb25hbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotLy8JCQlidWlsZE11dGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZVR5cGVUcmFuc2xhdG9yKCksCi0vLwkJCWJ1aWxkUmVhZFRyYW5zZm9ybWVyVHJhbnNsYXRvcigpLAotLy8JCQlidWlsZFdyaXRlVHJhbnNmb3JtZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUcmFuc2Zvcm1hdGlvbl8yXzFfQXR0cmlidXRlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUcmFuc2llbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHJhbnNpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZDQ2YzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUcmFuc2llbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFRyYW5zaWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRyYW5zaWVudCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxUcmFuc2llbnQgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFRyYW5zaWVudCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RSQU5TSUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50I2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVHJhbnNpZW50KCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFR5cGVDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHlwZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjA3YmI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHlwZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFR5cGUgQ3VzdG9tQ29udmVydGVyPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIjZ2V0RGF0YVR5cGUgPGVtPkRhdGEgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIjZ2V0T2JqZWN0VHlwZSA8ZW0+T2JqZWN0IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHlwZUNvbnZlcnRlcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxUeXBlQ29udmVydGVyIGV4dGVuZHMgWG1sTmFtZWRDb252ZXJ0ZXIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YVR5cGUoKSA8ZW0+RGF0YSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhVHlwZSgpIDxlbT5EYXRhIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFUeXBlID0gREFUQV9UWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlKCkgPGVtPk9iamVjdCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZSgpIDxlbT5PYmplY3QgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBvYmplY3RUeXBlID0gT0JKRUNUX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVHlwZUNvbnZlcnRlcigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RZUEVfQ09OVkVSVEVSOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGEgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGEgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGF0YVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUeXBlQ29udmVydGVyX0RhdGFUeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZSgpCi0JewotCQlyZXR1cm4gZGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIjZ2V0RGF0YVR5cGUgPGVtPkRhdGEgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGFUeXBlKFN0cmluZyBuZXdEYXRhVHlwZSkKLQl7Ci0JCVN0cmluZyBvbGREYXRhVHlwZSA9IGRhdGFUeXBlOwotCQlkYXRhVHlwZSA9IG5ld0RhdGFUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUsIG9sZERhdGFUeXBlLCBkYXRhVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T2JqZWN0VHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFR5cGVDb252ZXJ0ZXJfT2JqZWN0VHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpCi0JewotCQlyZXR1cm4gb2JqZWN0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlciNnZXRPYmplY3RUeXBlIDxlbT5PYmplY3QgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBuZXdPYmplY3RUeXBlKQotCXsKLQkJU3RyaW5nIG9sZE9iamVjdFR5cGUgPSBvYmplY3RUeXBlOwotCQlvYmplY3RUeXBlID0gbmV3T2JqZWN0VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUsIG9sZE9iamVjdFR5cGUsIG9iamVjdFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOgotCQkJCXJldHVybiBnZXREYXRhVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRToKLQkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOgotCQkJCXNldERhdGFUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEU6Ci0JCQkJc2V0T2JqZWN0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRToKLQkJCQlzZXREYXRhVHlwZShEQVRBX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEU6Ci0JCQkJc2V0T2JqZWN0VHlwZShPQkpFQ1RfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOgotCQkJCXJldHVybiBEQVRBX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGRhdGFUeXBlICE9IG51bGwgOiAhREFUQV9UWVBFX0VERUZBVUxULmVxdWFscyhkYXRhVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOgotCQkJCXJldHVybiBPQkpFQ1RfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gb2JqZWN0VHlwZSAhPSBudWxsIDogIU9CSkVDVF9UWVBFX0VERUZBVUxULmVxdWFscyhvYmplY3RUeXBlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGF0YVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRhdGFUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvYmplY3RUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvYmplY3RUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGF0YVR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9iamVjdFR5cGVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERhdGFUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVHlwZUNvbnZlcnRlcl9EYXRhVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPYmplY3RUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUeXBlQ29udmVydGVyX09iamVjdFR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZURhdGFUeXBlRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvcmlnaW5hbE5hbWUgPSBvcmlnaW5hbFR5cGUuZ2V0VHlwZVF1YWxpZmllZE5hbWUoKTsKLQkJaW50IG5hbWVJbmRleCA9IHRoaXMuZGF0YVR5cGUubGFzdEluZGV4T2Yob3JpZ2luYWxOYW1lKTsKLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCArIG5hbWVJbmRleCwgb3JpZ2luYWxOYW1lLmxlbmd0aCgpLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRGF0YVR5cGVQYWNrYWdlRWRpdChTdHJpbmcgbmV3TmFtZSkgewotCQlpbnQgcGFja2FnZUxlbmd0aCA9IHRoaXMuZGF0YVR5cGUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKHBhY2thZ2VMZW5ndGggPT0gLTEpIHsKLQkJCXBhY2thZ2VMZW5ndGggPSAwOwotCQkJbmV3TmFtZSA9IG5ld05hbWUgKyAnLic7Ci0JCX0KLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCwgcGFja2FnZUxlbmd0aCwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZU9iamVjdFR5cGVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpOwotCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5vYmplY3RUeXBlLmxhc3RJbmRleE9mKG9yaWdpbmFsTmFtZSk7Ci0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCArIG5hbWVJbmRleCwgb3JpZ2luYWxOYW1lLmxlbmd0aCgpLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lT2JqZWN0VHlwZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKSB7Ci0JCWludCBwYWNrYWdlTGVuZ3RoID0gdGhpcy5vYmplY3RUeXBlLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChwYWNrYWdlTGVuZ3RoID09IC0xKSB7Ci0JCQlwYWNrYWdlTGVuZ3RoID0gMDsKLQkJCW5ld05hbWUgPSBuZXdOYW1lICsgJy4nOwotCQl9Ci0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCwgcGFja2FnZUxlbmd0aCwgbmV3TmFtZSk7Ci0JfQotCi19IC8vIFhtbFR5cGVDb252ZXJ0ZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmFyaWFibGVPbmVUb09uZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxWYXJpYWJsZU9uZVRvT25lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOWRkZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxWYXJpYWJsZU9uZVRvT25lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBWYXJpYWJsZSBPbmUgVG8gT25lIEltcGw8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFZhcmlhYmxlT25lVG9PbmUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sVmFyaWFibGVPbmVUb09uZSBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxWYXJpYWJsZU9uZVRvT25lKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfVkFSSUFCTEVfT05FX1RPX09ORTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlZBUklBQkxFX09ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmVyc2lvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxWZXJzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZmRmZWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxWZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxWZXJzaW9uXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVmVyc2lvbjwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxWZXJzaW9uIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24gaW1wbGVtZW50cyBYbWxWZXJzaW9uXzJfMSwgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sTXV0YWJsZSwgWG1sQ29udmVydGlibGVNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVHlwZSA9IEFUVFJJQlVURV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXV0YWJsZSgpIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gTVVUQUJMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNdXRhYmxlKCkgPGVtPk11dGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE11dGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIG11dGFibGUgPSBNVVRBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVyKCkgPGVtPkNvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29udmVydGVyIGNvbnZlcnRlcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVDb252ZXJ0ZXIoKSA8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUeXBlQ29udmVydGVyIHR5cGVDb252ZXJ0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdENvbnZlcnRlcigpIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxTdHJ1Y3RDb252ZXJ0ZXIgc3RydWN0Q29udmVydGVyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnQoKSA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0KCkgPGVtPkNvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydCA9IENPTlZFUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVmVyc2lvbigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1ZFUlNJT047Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbl8yXzFfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgbmV3QXR0cmlidXRlVHlwZSkKLQl7Ci0JCVN0cmluZyBvbGRBdHRyaWJ1dGVUeXBlID0gYXR0cmlidXRlVHlwZTsKLQkJYXR0cmlidXRlVHlwZSA9IG5ld0F0dHJpYnV0ZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQVRUUklCVVRFX1RZUEUsIG9sZEF0dHJpYnV0ZVR5cGUsIGF0dHJpYnV0ZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NdXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11dGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE11dGFibGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXV0YWJsZV9NdXRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRNdXRhYmxlKCkKLQl7Ci0JCXJldHVybiBtdXRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uI2dldE11dGFibGUgPGVtPk11dGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk11dGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE11dGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNdXRhYmxlKEJvb2xlYW4gbmV3TXV0YWJsZSkKLQl7Ci0JCUJvb2xlYW4gb2xkTXV0YWJsZSA9IG11dGFibGU7Ci0JCW11dGFibGUgPSBuZXdNdXRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX01VVEFCTEUsIG9sZE11dGFibGUsIG11dGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbnZlcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfQ29udmVydCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydCgpCi0JewotCQlyZXR1cm4gY29udmVydDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiNnZXRDb252ZXJ0IDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udmVydChTdHJpbmcgbmV3Q29udmVydCkKLQl7Ci0JCVN0cmluZyBvbGRDb252ZXJ0ID0gY29udmVydDsKLQkJY29udmVydCA9IG5ld0NvbnZlcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVCwgb2xkQ29udmVydCwgY29udmVydCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9Db252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIGNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyIG5ld0NvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENvbnZlcnRlciBvbGRDb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCWNvbnZlcnRlciA9IG5ld0NvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJURVIsIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiNnZXRDb252ZXJ0ZXIgPGVtPkNvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyIG5ld0NvbnZlcnRlcikKLQl7Ci0JCWlmIChuZXdDb252ZXJ0ZXIgIT0gY29udmVydGVyKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb252ZXJ0ZXIobmV3Q29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVEVSLCBuZXdDb252ZXJ0ZXIsIG5ld0NvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIEN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBnZXRUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiB0eXBlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciBuZXdUeXBlQ29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVHlwZUNvbnZlcnRlciBvbGRUeXBlQ29udmVydGVyID0gdHlwZUNvbnZlcnRlcjsKLQkJdHlwZUNvbnZlcnRlciA9IG5ld1R5cGVDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVFlQRV9DT05WRVJURVIsIG9sZFR5cGVDb252ZXJ0ZXIsIG5ld1R5cGVDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uI2dldFR5cGVDb252ZXJ0ZXIgPGVtPlR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciBuZXdUeXBlQ29udmVydGVyKQotCXsKLQkJaWYgKG5ld1R5cGVDb252ZXJ0ZXIgIT0gdHlwZUNvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0eXBlQ29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdUeXBlQ29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUeXBlQ29udmVydGVyKG5ld1R5cGVDb252ZXJ0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUiwgbmV3VHlwZUNvbnZlcnRlciwgbmV3VHlwZUNvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ3VzdG9tQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBuZXdPYmplY3RUeXBlQ29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBvbGRPYmplY3RUeXBlQ29udmVydGVyID0gb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQkJb2JqZWN0VHlwZUNvbnZlcnRlciA9IG5ld09iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBvbGRPYmplY3RUeXBlQ29udmVydGVyLCBuZXdPYmplY3RUeXBlQ29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiNnZXRPYmplY3RUeXBlQ29udmVydGVyIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBuZXdPYmplY3RUeXBlQ29udmVydGVyKQotCXsKLQkJaWYgKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIgIT0gb2JqZWN0VHlwZUNvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAob2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvYmplY3RUeXBlQ29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE9iamVjdFR5cGVDb252ZXJ0ZXIobmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDdXN0b21Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX1N0cnVjdENvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sU3RydWN0Q29udmVydGVyIGdldFN0cnVjdENvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gc3RydWN0Q29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgbmV3U3RydWN0Q29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sU3RydWN0Q29udmVydGVyIG9sZFN0cnVjdENvbnZlcnRlciA9IHN0cnVjdENvbnZlcnRlcjsKLQkJc3RydWN0Q29udmVydGVyID0gbmV3U3RydWN0Q29udmVydGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1NUUlVDVF9DT05WRVJURVIsIG9sZFN0cnVjdENvbnZlcnRlciwgbmV3U3RydWN0Q29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiNnZXRTdHJ1Y3RDb252ZXJ0ZXIgPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgbmV3U3RydWN0Q29udmVydGVyKQotCXsKLQkJaWYgKG5ld1N0cnVjdENvbnZlcnRlciAhPSBzdHJ1Y3RDb252ZXJ0ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHN0cnVjdENvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzdHJ1Y3RDb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1NUUlVDVF9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1N0cnVjdENvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTdHJ1Y3RDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1NUUlVDVF9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG5ld1N0cnVjdENvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1NUUlVDVF9DT05WRVJURVIsIG5ld1N0cnVjdENvbnZlcnRlciwgbmV3U3RydWN0Q29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldENvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRUeXBlQ29udmVydGVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX01VVEFCTEU6Ci0JCQkJcmV0dXJuIGdldE11dGFibGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGdldENvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRUeXBlQ29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fU1RSVUNUX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0U3RydWN0Q29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVDoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19NVVRBQkxFOgotCQkJCXNldE11dGFibGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJURVI6Ci0JCQkJc2V0Q29udmVydGVyKChYbWxDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUjoKLQkJCQlzZXRUeXBlQ29udmVydGVyKChYbWxUeXBlQ29udmVydGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldE9iamVjdFR5cGVDb252ZXJ0ZXIoKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXNldFN0cnVjdENvbnZlcnRlcigoWG1sU3RydWN0Q29udmVydGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVDoKLQkJCQlzZXRDb252ZXJ0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKEFUVFJJQlVURV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTVVUQUJMRToKLQkJCQlzZXRNdXRhYmxlKE1VVEFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJURVI6Ci0JCQkJc2V0Q29udmVydGVyKChYbWxDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldFR5cGVDb252ZXJ0ZXIoKFhtbFR5cGVDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlzZXRPYmplY3RUeXBlQ29udmVydGVyKChYbWxPYmplY3RUeXBlQ29udmVydGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXNldFN0cnVjdENvbnZlcnRlcigoWG1sU3RydWN0Q29udmVydGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJUOgotCQkJCXNldENvbnZlcnQoQ09OVkVSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX01VVEFCTEU6Ci0JCQkJcmV0dXJuIE1VVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IG11dGFibGUgIT0gbnVsbCA6ICFNVVRBQkxFX0VERUZBVUxULmVxdWFscyhtdXRhYmxlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRlciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiB0eXBlQ29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fU1RSVUNUX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gc3RydWN0Q29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVDoKLQkJCQlyZXR1cm4gQ09OVkVSVF9FREVGQVVMVCA9PSBudWxsID8gY29udmVydCAhPSBudWxsIDogIUNPTlZFUlRfRURFRkFVTFQuZXF1YWxzKGNvbnZlcnQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxWZXJzaW9uXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX1ZFUlNJT05fMjFfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNdXRhYmxlLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX01VVEFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VVEFCTEVfX01VVEFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fVFlQRV9DT05WRVJURVI7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19DT05WRVJUOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVmVyc2lvbl8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX1ZFUlNJT05fMjFfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTXV0YWJsZS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVVRBQkxFX19NVVRBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19NVVRBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fU1RSVUNUX0NPTlZFUlRFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG11dGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG11dGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnZlcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnZlcnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRNdXRhYmxlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVmVyc2lvbigpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNdXRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb2x1bW5UcmFuc2xhdG9yKCksIAotCQkJYnVpbGRUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29udmVydFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE11dGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTVVUQUJMRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNdXRhYmxlX011dGFibGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX0NvbnZlcnRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxPYmplY3RUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxTdHJ1Y3RDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX1N0cnVjdENvbnZlcnRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEF0dHJpYnV0ZVR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQVRUUklCVVRFX1RZUEUsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFZlcnNpb25fMl8xX0F0dHJpYnV0ZVR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9FY2xpcHNlTGluazFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0VjbGlwc2VMaW5rMV8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMTk1ZGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0VjbGlwc2VMaW5rMV8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGluazsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rMV8xCi0JZXh0ZW5kcyBFY2xpcHNlTGluawotewotCVN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFID0gRWNsaXBzZUxpbmsuU0NIRU1BX05BTUVTUEFDRTsKLQlTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMV8xLnhzZCI7Ci0JU3RyaW5nIFNDSEVNQV9WRVJTSU9OCT0gIjEuMSI7Ci0JCi0JLy8gRWNsaXBzZUxpbmsgMS4xIHNwZWNpZmljIG5vZGVzCi0JCi0JU3RyaW5nIFBSSU1BUllfS0VZID0gInByaW1hcnkta2V5IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJJTUFSWV9LRVlfX1ZBTElEQVRJT04gPSAidmFsaWRhdGlvbiI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBSSU1BUllfS0VZX19DT0xVTU4gPSAiY29sdW1uIjsgIC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9FY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWJhYTJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9FY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5SW1wbAotewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5IGVJTlNUQU5DRSA9IGluaXQoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkgaW5pdCgpCi0JewotCQl0cnkKLQkJewotCQkJRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSB0aGVFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5ID0gKEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImpwdC5lY2xpcHNlbGluay5vcm0udjFfMS54bWkiKTsgCi0JCQlpZiAodGhlRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSAhPSBudWxsKQotCQkJewotCQkJCXJldHVybiB0aGVFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotCQl7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCi0JewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLklEX1ZBTElEQVRJT05fVFlQRV8xMToKLQkJCQlyZXR1cm4gY3JlYXRlSWRWYWxpZGF0aW9uVHlwZV8xXzFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5JRF9WQUxJREFUSU9OX1RZUEVfMTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRJZFZhbGlkYXRpb25UeXBlXzFfMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSWRWYWxpZGF0aW9uVHlwZV8xXzEgY3JlYXRlSWRWYWxpZGF0aW9uVHlwZV8xXzFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlJZFZhbGlkYXRpb25UeXBlXzFfMSByZXN1bHQgPSBJZFZhbGlkYXRpb25UeXBlXzFfMS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SWRWYWxpZGF0aW9uVHlwZV8xXzFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIGdldEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSBnZXRQYWNrYWdlKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9FY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0VjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyNmJmNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlSW1wbAotewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5BTUUgPSAidjFfMSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19VUkkgPSAianB0LmVjbGlwc2VsaW5rLm9ybS52MV8xLnhtaSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEgPGVtPlhtbCBCYXNpYyAxMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEJhc2ljXzFfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxCYXNpY18xXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfMTEgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDXzExX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19TRVFVRU5DRV9HRU5FUkFUT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfMTFfX1RBQkxFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1RBQkxFX0dFTkVSQVRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18xMV9fR0VORVJBVEVEX1ZBTFVFID0gT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmFzaWMgMTE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfMTFfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEVudGl0eV8xXzEgPGVtPlhtbCBFbnRpdHkgMTE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbEVudGl0eV8xXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzExID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8xMV9fUFJJTUFSWV9LRVkgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgMTE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzExX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDExPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTEgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTFfX1BSSU1BUllfS0VZID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMTE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTFfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xIDxlbT5YbWwgUHJpbWFyeSBLZXkgMTE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5XzFfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV8xMSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZXzExX19WQUxJREFUSU9OID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV8xMV9fQ09MVU1OUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFByaW1hcnkgS2V5IDExPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZXzExX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMSA8ZW0+SWQgVmFsaWRhdGlvbiBUeXBlIDExPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRJZFZhbGlkYXRpb25UeXBlXzFfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1ZBTElEQVRJT05fVFlQRV8xMSA9IDQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxCYXNpY18xXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW50aXR5XzFfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYXBwZWRTdXBlcmNsYXNzXzFfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQcmltYXJ5S2V5XzFfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGlkVmFsaWRhdGlvblR5cGVfMV8xRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSgpCi0JewotCQlzdXBlcihlTlNfVVJJLCBFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgotCSAqIAotCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KLQkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSBpbml0KCkKLQl7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUVjbGlwc2VMaW5rT3JtUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1QYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5mcmVlemUoKTsKLQotICAKLQkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCi0JCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkksIHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UpOwotCQlyZXR1cm4gdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEJhc2ljXzFfMSA8ZW0+WG1sIEJhc2ljIDExPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXNpYyAxMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEJhc2ljXzFfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEJhc2ljXzFfMSgpCi0JewotCQlyZXR1cm4geG1sQmFzaWNfMV8xRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sQmFzaWNfMV8xI2dldEdlbmVyYXRlZFZhbHVlIDxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEjZ2V0R2VuZXJhdGVkVmFsdWUoKQotCSAqIEBzZWUgI2dldFhtbEJhc2ljXzFfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEJhc2ljXzFfMV9HZW5lcmF0ZWRWYWx1ZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQmFzaWNfMV8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sRW50aXR5XzFfMSA8ZW0+WG1sIEVudGl0eSAxMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW50aXR5IDExPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sRW50aXR5XzFfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eV8xXzEoKQotCXsKLQkJcmV0dXJuIHhtbEVudGl0eV8xXzFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xI2dldFByaW1hcnlLZXkoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eV8xXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfMV8xX1ByaW1hcnlLZXkoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eV8xXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDExPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAxMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzEoKQotCXsKLQkJcmV0dXJuIHhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEjZ2V0UHJpbWFyeUtleSA8ZW0+UHJpbWFyeSBLZXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QcmltYXJ5IEtleTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xI2dldFByaW1hcnlLZXkoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzFfUHJpbWFyeUtleSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc18xXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMSA8ZW0+WG1sIFByaW1hcnkgS2V5IDExPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQcmltYXJ5IEtleSAxMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUHJpbWFyeUtleV8xXzEoKQotCXsKLQkJcmV0dXJuIHhtbFByaW1hcnlLZXlfMV8xRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEjZ2V0VmFsaWRhdGlvbiA8ZW0+VmFsaWRhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbGlkYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMSNnZXRWYWxpZGF0aW9uKCkKLQkgKiBAc2VlICNnZXRYbWxQcmltYXJ5S2V5XzFfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFByaW1hcnlLZXlfMV8xX1ZhbGlkYXRpb24oKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByaW1hcnlLZXlfMV8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xI2dldENvbHVtbnMgPGVtPkNvbHVtbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbHVtbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMSNnZXRDb2x1bW5zKCkKLQkgKiBAc2VlICNnZXRYbWxQcmltYXJ5S2V5XzFfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFByaW1hcnlLZXlfMV8xX0NvbHVtbnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFByaW1hcnlLZXlfMV8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMSA8ZW0+SWQgVmFsaWRhdGlvbiBUeXBlIDExPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+SWQgVmFsaWRhdGlvbiBUeXBlIDExPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuSWRWYWxpZGF0aW9uVHlwZV8xXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldElkVmFsaWRhdGlvblR5cGVfMV8xKCkKLQl7Ci0JCXJldHVybiBpZFZhbGlkYXRpb25UeXBlXzFfMUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5IGdldEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkoKQotCXsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJeG1sQmFzaWNfMV8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9CQVNJQ18xMSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQmFzaWNfMV8xRUNsYXNzLCBYTUxfQkFTSUNfMTFfX0dFTkVSQVRFRF9WQUxVRSk7Ci0KLQkJeG1sRW50aXR5XzFfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU5USVRZXzExKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlfMV8xRUNsYXNzLCBYTUxfRU5USVRZXzExX19QUklNQVJZX0tFWSk7Ci0KLQkJeG1sTWFwcGVkU3VwZXJjbGFzc18xXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BUFBFRF9TVVBFUkNMQVNTXzExKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzXzFfMUVDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzExX19QUklNQVJZX0tFWSk7Ci0KLQkJeG1sUHJpbWFyeUtleV8xXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BSSU1BUllfS0VZXzExKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxQcmltYXJ5S2V5XzFfMUVDbGFzcywgWE1MX1BSSU1BUllfS0VZXzExX19WQUxJREFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxQcmltYXJ5S2V5XzFfMUVDbGFzcywgWE1MX1BSSU1BUllfS0VZXzExX19DT0xVTU5TKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJaWRWYWxpZGF0aW9uVHlwZV8xXzFFRW51bSA9IGNyZWF0ZUVFbnVtKElEX1ZBTElEQVRJT05fVFlQRV8xMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJT3JtUGFja2FnZSB0aGVPcm1QYWNrYWdlID0gKE9ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKTsKLQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCXhtbEJhc2ljXzFfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEdlbmVyYXRvckNvbnRhaW5lcigpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHhtbEJhc2ljXzFfMUVDbGFzcywgWG1sQmFzaWNfMV8xLmNsYXNzLCAiWG1sQmFzaWNfMV8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQmFzaWNfMV8xX0dlbmVyYXRlZFZhbHVlKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sR2VuZXJhdGVkVmFsdWUoKSwgbnVsbCwgImdlbmVyYXRlZFZhbHVlIiwgbnVsbCwgMCwgMSwgWG1sQmFzaWNfMV8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sRW50aXR5XzFfMUVDbGFzcywgWG1sRW50aXR5XzFfMS5jbGFzcywgIlhtbEVudGl0eV8xXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfMV8xX1ByaW1hcnlLZXkoKSwgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbFByaW1hcnlLZXkoKSwgbnVsbCwgInByaW1hcnlLZXkiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHlfMV8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sTWFwcGVkU3VwZXJjbGFzc18xXzFFQ2xhc3MsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xLmNsYXNzLCAiWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMV9QcmltYXJ5S2V5KCksIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxQcmltYXJ5S2V5KCksIG51bGwsICJwcmltYXJ5S2V5IiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQcmltYXJ5S2V5XzFfMUVDbGFzcywgWG1sUHJpbWFyeUtleV8xXzEuY2xhc3MsICJYbWxQcmltYXJ5S2V5XzFfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFByaW1hcnlLZXlfMV8xX1ZhbGlkYXRpb24oKSwgdGhpcy5nZXRJZFZhbGlkYXRpb25UeXBlXzFfMSgpLCAidmFsaWRhdGlvbiIsIG51bGwsIDAsIDEsIFhtbFByaW1hcnlLZXlfMV8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQcmltYXJ5S2V5XzFfMV9Db2x1bW5zKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQ29sdW1uKCksIG51bGwsICJjb2x1bW5zIiwgbnVsbCwgMCwgLTEsIFhtbFByaW1hcnlLZXlfMV8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShpZFZhbGlkYXRpb25UeXBlXzFfMUVFbnVtLCBJZFZhbGlkYXRpb25UeXBlXzFfMS5jbGFzcywgIklkVmFsaWRhdGlvblR5cGVfMV8xIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChpZFZhbGlkYXRpb25UeXBlXzFfMUVFbnVtLCBJZFZhbGlkYXRpb25UeXBlXzFfMS5OVUxMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGlkVmFsaWRhdGlvblR5cGVfMV8xRUVudW0sIElkVmFsaWRhdGlvblR5cGVfMV8xLlpFUk8pOwotCQlhZGRFRW51bUxpdGVyYWwoaWRWYWxpZGF0aW9uVHlwZV8xXzFFRW51bSwgSWRWYWxpZGF0aW9uVHlwZV8xXzEuTk9ORSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXRlcmFscwotCXsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEgPGVtPlhtbCBCYXNpYyAxMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEJhc2ljXzFfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sQmFzaWNfMV8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0JBU0lDXzExID0gZUlOU1RBTkNFLmdldFhtbEJhc2ljXzFfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGVkIFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQkFTSUNfMTFfX0dFTkVSQVRFRF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY18xXzFfR2VuZXJhdGVkVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEVudGl0eV8xXzEgPGVtPlhtbCBFbnRpdHkgMTE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxFbnRpdHlfMV8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VOVElUWV8xMSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMV8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV8xMV9fUFJJTUFSWV9LRVkgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzFfMV9QcmltYXJ5S2V5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDExPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzExID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzExX19QUklNQVJZX0tFWSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMV9QcmltYXJ5S2V5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMSA8ZW0+WG1sIFByaW1hcnkgS2V5IDExPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbFByaW1hcnlLZXlfMV8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BSSU1BUllfS0VZXzExID0gZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlfMV8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUFJJTUFSWV9LRVlfMTFfX1ZBTElEQVRJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sUHJpbWFyeUtleV8xXzFfVmFsaWRhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUFJJTUFSWV9LRVlfMTFfX0NPTFVNTlMgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJpbWFyeUtleV8xXzFfQ29sdW1ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuSWRWYWxpZGF0aW9uVHlwZV8xXzEgPGVtPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuSWRWYWxpZGF0aW9uVHlwZV8xXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldElkVmFsaWRhdGlvblR5cGVfMV8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBJRF9WQUxJREFUSU9OX1RZUEVfMTEgPSBlSU5TVEFOQ0UuZ2V0SWRWYWxpZGF0aW9uVHlwZV8xXzEoKTsKLQotCX0KLQotfSAvL0VjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9JZFZhbGlkYXRpb25UeXBlXzFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0lkVmFsaWRhdGlvblR5cGVfMV8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMmY5MWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0lkVmFsaWRhdGlvblR5cGVfMV8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5JZCBWYWxpZGF0aW9uIFR5cGUgMTE8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRJZFZhbGlkYXRpb25UeXBlXzFfMSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gSWRWYWxpZGF0aW9uVHlwZV8xXzEgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+TlVMTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOVUxMX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JTlVMTCgwLCAiTlVMTCIsICJOVUxMIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5aRVJPPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1pFUk9fVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlaRVJPKDIsICJaRVJPIiwgIlpFUk8iKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9ORV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU5PTkUoMiwgIk5PTkUiLCAiTk9ORSIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TlVMTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TlVMTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOVUxMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVMTF9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5aRVJPPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5aRVJPPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1pFUk8KLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBaRVJPX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9ORQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkVfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSWRWYWxpZGF0aW9uVHlwZV8xXzFbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgSWRWYWxpZGF0aW9uVHlwZV8xXzFbXQotCQl7Ci0JCQlOVUxMLAotCQkJWkVSTywKLQkJCU5PTkUsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+SWQgVmFsaWRhdGlvbiBUeXBlIDExPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8SWRWYWxpZGF0aW9uVHlwZV8xXzE+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SWQgVmFsaWRhdGlvbiBUeXBlIDExPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSWRWYWxpZGF0aW9uVHlwZV8xXzEgZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUlkVmFsaWRhdGlvblR5cGVfMV8xIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElkVmFsaWRhdGlvblR5cGVfMV8xIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlJZFZhbGlkYXRpb25UeXBlXzFfMSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElkVmFsaWRhdGlvblR5cGVfMV8xIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIE5VTExfVkFMVUU6IHJldHVybiBOVUxMOwotCQkJY2FzZSBaRVJPX1ZBTFVFOiByZXR1cm4gWkVSTzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSWRWYWxpZGF0aW9uVHlwZV8xXzEoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL0lkVmFsaWRhdGlvblR5cGVfMV8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sQmFzaWNfMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sQmFzaWNfMV8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNjUwYmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbEJhc2ljXzFfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yQ29udGFpbmVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmFzaWMgMTE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sQmFzaWNfMV8xI2dldEdlbmVyYXRlZFZhbHVlIDxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sQmFzaWNfMV8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxCYXNpY18xXzEgZXh0ZW5kcyBYbWxHZW5lcmF0b3JDb250YWluZXIKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxCYXNpY18xXzFfR2VuZXJhdGVkVmFsdWUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEJhc2ljXzFfMSNnZXRHZW5lcmF0ZWRWYWx1ZSA8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEdlbmVyYXRlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHZW5lcmF0ZWRWYWx1ZShYbWxHZW5lcmF0ZWRWYWx1ZSB2YWx1ZSk7Ci0KLX0gLy8gWG1sQmFzaWNfMV8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sRW50aXR5XzFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbEVudGl0eV8xXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM5NmI5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sRW50aXR5XzFfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW50aXR5IDExPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEVudGl0eV8xXzEjZ2V0UHJpbWFyeUtleSA8ZW0+UHJpbWFyeSBLZXk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sRW50aXR5XzFfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRW50aXR5XzFfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sRW50aXR5XzFfMV9QcmltYXJ5S2V5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbFByaW1hcnlLZXkgZ2V0UHJpbWFyeUtleSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sRW50aXR5XzFfMSNnZXRQcmltYXJ5S2V5IDxlbT5QcmltYXJ5IEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByaW1hcnlLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSB2YWx1ZSk7Ci0KLX0gLy8gWG1sRW50aXR5XzFfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbE1hcHBlZFN1cGVyY2xhc3NfMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRlMzZhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDExPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzFfUHJpbWFyeUtleSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxQcmltYXJ5S2V5IGdldFByaW1hcnlLZXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJpbWFyeUtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJpbWFyeUtleShYbWxQcmltYXJ5S2V5IHZhbHVlKTsKLQotfSAvLyBYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbFByaW1hcnlLZXlfMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sUHJpbWFyeUtleV8xXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxNzQ1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sUHJpbWFyeUtleV8xXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFByaW1hcnkgS2V5IDExPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xI2dldFZhbGlkYXRpb24gPGVtPlZhbGlkYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xI2dldENvbHVtbnMgPGVtPkNvbHVtbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleV8xXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFByaW1hcnlLZXlfMV8xIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbGlkYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWxpZGF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbGlkYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuSWRWYWxpZGF0aW9uVHlwZV8xXzEKLQkgKiBAc2VlICNzZXRWYWxpZGF0aW9uKElkVmFsaWRhdGlvblR5cGVfMV8xKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5XzFfMV9WYWxpZGF0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSWRWYWxpZGF0aW9uVHlwZV8xXzEgZ2V0VmFsaWRhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEjZ2V0VmFsaWRhdGlvbiA8ZW0+VmFsaWRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMQotCSAqIEBzZWUgI2dldFZhbGlkYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uVHlwZV8xXzEgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbFByaW1hcnlLZXlfMV8xX0NvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sQ29sdW1uPiBnZXRDb2x1bW5zKCk7Ci0KLX0gLy8gWG1sUHJpbWFyeUtleV8xXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMi9FY2xpcHNlTGluazFfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8yL0VjbGlwc2VMaW5rMV8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNWIxYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8yL0VjbGlwc2VMaW5rMV8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rMV8yCi0JZXh0ZW5kcyBFY2xpcHNlTGluazFfMQotewotCVN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFID0gRWNsaXBzZUxpbmsuU0NIRU1BX05BTUVTUEFDRTsKLQlTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMV8yLnhzZCI7Ci0JU3RyaW5nIFNDSEVNQV9WRVJTSU9OCT0gIjEuMiI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9FY2xpcHNlTGluazJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL0VjbGlwc2VMaW5rMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NmNmMmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL0VjbGlwc2VMaW5rMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmsxXzE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGluazJfMAotCWV4dGVuZHMgRWNsaXBzZUxpbmsxXzEsIEpQQTJfMAotewotCVN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFID0gRWNsaXBzZUxpbmsuU0NIRU1BX05BTUVTUEFDRTsKLQlTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl8wLnhzZCI7Ci0JU3RyaW5nIFNDSEVNQV9WRVJTSU9OCT0gIjIuMCI7Ci0JCi0JLy8gRWNsaXBzZUxpbmsgMi4wIHNwZWNpZmljIG5vZGVzCi0KLQlTdHJpbmcgQ0FDSEVfSU5URVJDRVBUT1IgPSAiY2FjaGUtaW50ZXJjZXB0b3IiOwotCQotCVN0cmluZyBDT1JSRUNUSU9OX1RZUEUgPSAiY29ycmVjdGlvbi10eXBlIjsKLQlTdHJpbmcgTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERSA9ICJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIjsKLQotCVN0cmluZyBRVUVSWV9SRURJUkVDVE9SUyA9ICJxdWVyeS1yZWRpcmVjdG9ycyI7Ci0JU3RyaW5nIFFVRVJZX1JFRElSRUNUT1JTX19BTExfUVVFUklFUyA9ICJhbGwtcXVlcmllcyI7Ci0JU3RyaW5nIFFVRVJZX1JFRElSRUNUT1JTX19SRUFEX0FMTCA9ICJyZWFkLWFsbCI7Ci0JU3RyaW5nIFFVRVJZX1JFRElSRUNUT1JTX19SRUFEX09CSkVDVCA9ICJyZWFkLW9iamVjdCI7Ci0JU3RyaW5nIFFVRVJZX1JFRElSRUNUT1JTX19SRVBPUlQgPSAicmVwb3J0IjsKLQlTdHJpbmcgUVVFUllfUkVESVJFQ1RPUlNfX1VQREFURSA9ICJ1cGRhdGUiOwotCVN0cmluZyBRVUVSWV9SRURJUkVDVE9SU19fSU5TRVJUID0gImluc2VydCI7Ci0JU3RyaW5nIFFVRVJZX1JFRElSRUNUT1JTX19ERUxFVEUgPSAiZGVsZXRlIjsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL0VjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9FY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZTRhYzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL0VjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnlJbXBsCi17Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkgZUlOU1RBTkNFID0gaW5pdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSBpbml0KCkKLQl7Ci0JCXRyeQotCQl7Ci0JCQlFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5IHRoZUVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkgPSAoRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgianB0LmVjbGlwc2VsaW5rLm9ybS52Ml8wLnhtaSIpOyAKLQkJCWlmICh0aGVFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5ICE9IG51bGwpCi0JCQl7Ci0JCQkJcmV0dXJuIHRoZUVjbGlwc2VMaW5rT3JtVjJfMEZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCi0JCXsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykKLQl7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuT1JERVJfQ09SUkVDVElPTl9UWVBFXzIwOgotCQkJCXJldHVybiBjcmVhdGVPcmRlckNvcnJlY3Rpb25UeXBlXzJfMEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLk9SREVSX0NPUlJFQ1RJT05fVFlQRV8yMDoKLQkJCQlyZXR1cm4gY29udmVydE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCBjcmVhdGVPcmRlckNvcnJlY3Rpb25UeXBlXzJfMEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCU9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIHJlc3VsdCA9IE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRPcmRlckNvcnJlY3Rpb25UeXBlXzJfMFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgZ2V0RWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSgpCi0JewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIGdldFBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL0VjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDdlYTc5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlSW1wbAotewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5BTUUgPSAidjJfMCI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19VUkkgPSAianB0LmVjbGlwc2VsaW5rLm9ybS52Ml8wLnhtaSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCA8ZW0+WG1sIE1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGUgQ29udGFpbmVyIDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjAgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVMgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlIENvbnRhaW5lciAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wIDxlbT5YbWwgQ29sbGVjdGlvbiBNYXBwaW5nIDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjAgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQ09OVkVSVCA9IFhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29sbGVjdGlvbiBNYXBwaW5nIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9GRUFUVVJFX0NPVU5UID0gWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19BQ0NFU1MgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTkFNRSA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0FDQ0VTU19NRVRIT0RTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTX01FVEhPRFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19QUk9QRVJUSUVTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fUFJPUEVSVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0xPQiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX1RFTVBPUkFMID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19FTlVNRVJBVEVEID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX1RZUEVfQ09OVkVSVEVSID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fU1RSVUNUX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQ09OVkVSVCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19DT05WRVJURVJTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fVFlQRV9DT05WRVJURVJTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19TVFJVQ1RfQ09OVkVSVEVSUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0NPTlZFUlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAgPGVtPlhtbCBFbnRpdHkgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbEVudGl0eV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIwID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjBfX0NBQ0hFQUJMRSA9IE9ybVYyXzBQYWNrYWdlLlhNTF9FTlRJVFlfMjBfX0NBQ0hFQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMF9fQ0FDSEVfSU5URVJDRVBUT1IgPSBPcm1WMl8wUGFja2FnZS5YTUxfRU5USVRZXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5IFJlZGlyZWN0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIwX19RVUVSWV9SRURJUkVDVE9SUyA9IE9ybVYyXzBQYWNrYWdlLlhNTF9FTlRJVFlfMjBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVudGl0eSAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjBfRkVBVFVSRV9DT1VOVCA9IE9ybVYyXzBQYWNrYWdlLlhNTF9FTlRJVFlfMjBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wIDxlbT5YbWwgTWFueSBUbyBNYW55IDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjBfX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fQ09OVkVSVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX19UWVBFX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fVFlQRV9DT05WRVJURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX19PQkpFQ1RfVFlQRV9DT05WRVJURVIgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX19TVFJVQ1RfQ09OVkVSVEVSID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMF9fTUFQX0tFWV9DT05WRVJUID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE1hbnkgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjBfX0NBQ0hFQUJMRSA9IE9ybVYyXzBQYWNrYWdlLlhNTF9DQUNIRUFCTEVfMjBfX0NBQ0hFQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIwX19DQUNIRV9JTlRFUkNFUFRPUiA9IE9ybVYyXzBQYWNrYWdlLlhNTF9DQUNIRUFCTEVfMjBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIwX0ZFQVRVUkVfQ09VTlQgPSBPcm1WMl8wUGFja2FnZS5YTUxfQ0FDSEVBQkxFXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wIDxlbT5YbWwgT25lIFRvIE1hbnkgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjAgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX19DT05WRVJURVIgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX19UWVBFX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fVFlQRV9DT05WRVJURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjBfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fU1RSVUNUX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX19NQVBfS0VZX0NPTlZFUlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9uZSBUbyBNYW55IDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCA8ZW0+WG1sIE9yZGVyIENvbHVtbiAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OXzIwID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3JyZWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fMjBfX0NPUlJFQ1RJT05fVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9yZGVyIENvbHVtbiAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fMjBfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wIDxlbT5YbWwgUXVlcnkgUmVkaXJlY3RvcnMgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsIFF1ZXJpZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fQUxMX1FVRVJJRVMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgQWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFQURfQUxMID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19SRUFEX09CSkVDVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFUE9SVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1VQREFURSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX0lOU0VSVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX0RFTEVURSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX0ZFQVRVUkVfQ09VTlQgPSA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5PcmRlckNvcnJlY3Rpb25UeXBlXzJfMCA8ZW0+T3JkZXIgQ29ycmVjdGlvbiBUeXBlIDIwPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5PcmRlckNvcnJlY3Rpb25UeXBlXzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SREVSX0NPUlJFQ1RJT05fVFlQRV8yMCA9IDk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDb2xsZWN0aW9uTWFwcGluZ18yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eV8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvTWFueV8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwcGVkU3VwZXJjbGFzc18yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9NYW55XzJfMEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPcmRlckNvbHVtbl8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBvcmRlckNvcnJlY3Rpb25UeXBlXzJfMEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UoKQotCXsKLQkJc3VwZXIoZU5TX1VSSSwgRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KLQkgKiAKLQkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCi0JICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgaW5pdCgpCi0JewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlFY2xpcHNlTGlua09ybVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1QYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZnJlZXplKCk7Ci0KLSAgCi0JCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQotCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJLCB0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKTsKLQkJcmV0dXJuIHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAgPGVtPlhtbCBDb2xsZWN0aW9uIE1hcHBpbmcgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENvbGxlY3Rpb24gTWFwcGluZyAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCgpCi0JewotCQlyZXR1cm4geG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wI2dldE1hcEtleUNvbnZlcnQgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCNnZXRNYXBLZXlDb252ZXJ0KCkKLQkgKiBAc2VlICNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5Q29udmVydCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIDxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKQotCXsKLQkJcmV0dXJuIHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wIDxlbT5YbWwgRW50aXR5IDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHkgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW50aXR5XzJfMCgpCi0JewotCQlyZXR1cm4geG1sRW50aXR5XzJfMEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMCNnZXRDYWNoZUludGVyY2VwdG9yIDxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMCNnZXRDYWNoZUludGVyY2VwdG9yKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5XzJfMF9DYWNoZUludGVyY2VwdG9yKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAjZ2V0UXVlcnlSZWRpcmVjdG9ycyA8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAjZ2V0UXVlcnlSZWRpcmVjdG9ycygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5XzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV8yXzBfUXVlcnlSZWRpcmVjdG9ycygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5XzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAgPGVtPlhtbCBNYW55IFRvIE1hbnkgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFueVRvTWFueV8yXzAoKQotCXsKLQkJcmV0dXJuIHhtbE1hbnlUb01hbnlfMl8wRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wIDxlbT5YbWwgTWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZSBDb250YWluZXIgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGUgQ29udGFpbmVyIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCgpCi0JewotCQlyZXR1cm4geG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAjZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wI2dldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAgPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAjZ2V0Q2FjaGVJbnRlcmNlcHRvciA8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wI2dldENhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzBfQ2FjaGVJbnRlcmNlcHRvcigpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc18yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAgPGVtPlhtbCBPbmUgVG8gTWFueSAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT25lIFRvIE1hbnkgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT25lVG9NYW55XzJfMCgpCi0JewotCQlyZXR1cm4geG1sT25lVG9NYW55XzJfMEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAgPGVtPlhtbCBPcmRlciBDb2x1bW4gMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9yZGVyIENvbHVtbiAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9yZGVyQ29sdW1uXzJfMCgpCi0JewotCQlyZXR1cm4geG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wI2dldENvcnJlY3Rpb25UeXBlIDxlbT5Db3JyZWN0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3JyZWN0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAjZ2V0Q29ycmVjdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFhtbE9yZGVyQ29sdW1uXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE9yZGVyQ29sdW1uXzJfMF9Db3JyZWN0aW9uVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCA8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBRdWVyeSBSZWRpcmVjdG9ycyAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKQotCXsKLQkJcmV0dXJuIHhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRBbGxRdWVyaWVzIDxlbT5BbGwgUXVlcmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFsbCBRdWVyaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0QWxsUXVlcmllcygpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9BbGxRdWVyaWVzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRSZWFkQWxsIDxlbT5SZWFkIEFsbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlYWQgQWxsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0UmVhZEFsbCgpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZWFkQWxsKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRSZWFkT2JqZWN0IDxlbT5SZWFkIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlYWQgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0UmVhZE9iamVjdCgpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZWFkT2JqZWN0KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRSZXBvcnQgPGVtPlJlcG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFJlcG9ydCgpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZXBvcnQoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFVwZGF0ZSA8ZW0+VXBkYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXBkYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0VXBkYXRlKCkKLQkgKiBAc2VlICNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1VwZGF0ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0SW5zZXJ0IDxlbT5JbnNlcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbnNlcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRJbnNlcnQoKQotCSAqIEBzZWUgI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfSW5zZXJ0KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXREZWxldGUgPGVtPkRlbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldERlbGV0ZSgpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9EZWxldGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIDxlbT5PcmRlciBDb3JyZWN0aW9uIFR5cGUgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5PcmRlciBDb3JyZWN0aW9uIFR5cGUgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5PcmRlckNvcnJlY3Rpb25UeXBlXzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0T3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAoKQotCXsKLQkJcmV0dXJuIG9yZGVyQ29ycmVjdGlvblR5cGVfMl8wRUVudW07Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSBnZXRFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5KCkKLQl7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDb2xsZWN0aW9uTWFwcGluZ18yXzBFQ2xhc3MsIFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQ09OVkVSVCk7Ci0KLQkJeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjApOwotCi0JCXhtbEVudGl0eV8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VOVElUWV8yMCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5XzJfMEVDbGFzcywgWE1MX0VOVElUWV8yMF9fQ0FDSEVfSU5URVJDRVBUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eV8yXzBFQ2xhc3MsIFhNTF9FTlRJVFlfMjBfX1FVRVJZX1JFRElSRUNUT1JTKTsKLQotCQl4bWxNYW55VG9NYW55XzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFOWV9UT19NQU5ZXzIwKTsKLQotCQl4bWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjApOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wRUNsYXNzLCBYTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQotCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjApOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjBfX0NBQ0hFX0lOVEVSQ0VQVE9SKTsKLQotCQl4bWxPbmVUb01hbnlfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PTkVfVE9fTUFOWV8yMCk7Ci0KLQkJeG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PUkRFUl9DT0xVTU5fMjApOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE9yZGVyQ29sdW1uXzJfMEVDbGFzcywgWE1MX09SREVSX0NPTFVNTl8yMF9fQ09SUkVDVElPTl9UWVBFKTsKLQotCQl4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjApOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzLCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX0FMTF9RVUVSSUVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcywgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19SRUFEX0FMTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MsIFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fUkVBRF9PQkpFQ1QpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzLCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFUE9SVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MsIFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fVVBEQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcywgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19JTlNFUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzLCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX0RFTEVURSk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCW9yZGVyQ29ycmVjdGlvblR5cGVfMl8wRUVudW0gPSBjcmVhdGVFRW51bShPUkRFUl9DT1JSRUNUSU9OX1RZUEVfMjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUVjbGlwc2VMaW5rT3JtUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lTlNfVVJJKTsKLQkJT3JtVjJfMFBhY2thZ2UgdGhlT3JtVjJfMFBhY2thZ2UgPSAoT3JtVjJfMFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSk7Ci0JCU9ybVBhY2thZ2UgdGhlT3JtUGFja2FnZSA9IChPcm1QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJeG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAoKSk7Ci0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7Ci0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcigpKTsKLQkJeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wKCkpOwotCQl4bWxFbnRpdHlfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbEVudGl0eV8yXzAoKSk7Ci0JCXhtbE1hbnlUb01hbnlfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKSk7Ci0JCXhtbE1hbnlUb01hbnlfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxDYWNoZWFibGVfMl8wKCkpOwotCQl4bWxPbmVUb01hbnlfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKSk7Ci0JCXhtbE9uZVRvTWFueV8yXzBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyh4bWxDb2xsZWN0aW9uTWFwcGluZ18yXzBFQ2xhc3MsIFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMC5jbGFzcywgIlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlDb252ZXJ0KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJtYXBLZXlDb252ZXJ0IiwgbnVsbCwgMCwgMSwgWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MsICJYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sRW50aXR5XzJfMEVDbGFzcywgWG1sRW50aXR5XzJfMC5jbGFzcywgIlhtbEVudGl0eV8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfMl8wX0NhY2hlSW50ZXJjZXB0b3IoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxDbGFzc1JlZmVyZW5jZSgpLCBudWxsLCAiY2FjaGVJbnRlcmNlcHRvciIsIG51bGwsIDAsIDEsIFhtbEVudGl0eV8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV8yXzBfUXVlcnlSZWRpcmVjdG9ycygpLCB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9ycygpLCBudWxsLCAicXVlcnlSZWRpcmVjdG9ycyIsIG51bGwsIDAsIDEsIFhtbEVudGl0eV8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYW55VG9NYW55XzJfMEVDbGFzcywgWG1sTWFueVRvTWFueV8yXzAuY2xhc3MsICJYbWxNYW55VG9NYW55XzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMEVDbGFzcywgWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAuY2xhc3MsICJYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZSgpLCBudWxsLCAibWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMiLCBudWxsLCAwLCAtMSwgWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMEVDbGFzcywgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAuY2xhc3MsICJYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wX0NhY2hlSW50ZXJjZXB0b3IoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxDbGFzc1JlZmVyZW5jZSgpLCBudWxsLCAiY2FjaGVJbnRlcmNlcHRvciIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sT25lVG9NYW55XzJfMEVDbGFzcywgWG1sT25lVG9NYW55XzJfMC5jbGFzcywgIlhtbE9uZVRvTWFueV8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzLCBYbWxPcmRlckNvbHVtbl8yXzAuY2xhc3MsICJYbWxPcmRlckNvbHVtbl8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxPcmRlckNvbHVtbl8yXzBfQ29ycmVjdGlvblR5cGUoKSwgdGhpcy5nZXRPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCgpLCAiY29ycmVjdGlvblR5cGUiLCBudWxsLCAwLCAxLCBYbWxPcmRlckNvbHVtbl8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcywgWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAuY2xhc3MsICJYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0FsbFF1ZXJpZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImFsbFF1ZXJpZXMiLCBudWxsLCAwLCAxLCBYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVhZEFsbCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVhZEFsbCIsIG51bGwsIDAsIDEsIFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZWFkT2JqZWN0KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZWFkT2JqZWN0IiwgbnVsbCwgMCwgMSwgWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlcG9ydCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVwb3J0IiwgbnVsbCwgMCwgMSwgWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1VwZGF0ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXBkYXRlIiwgbnVsbCwgMCwgMSwgWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0luc2VydCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5zZXJ0IiwgbnVsbCwgMCwgMSwgWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0RlbGV0ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVsZXRlIiwgbnVsbCwgMCwgMSwgWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKG9yZGVyQ29ycmVjdGlvblR5cGVfMl8wRUVudW0sIE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wLmNsYXNzLCAiT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAiKTsKLQkJYWRkRUVudW1MaXRlcmFsKG9yZGVyQ29ycmVjdGlvblR5cGVfMl8wRUVudW0sIE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wLlJFQUQpOwotCQlhZGRFRW51bUxpdGVyYWwob3JkZXJDb3JyZWN0aW9uVHlwZV8yXzBFRW51bSwgT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAuUkVBRF9XUklURSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChvcmRlckNvcnJlY3Rpb25UeXBlXzJfMEVFbnVtLCBPcmRlckNvcnJlY3Rpb25UeXBlXzJfMC5FWENFUFRJT04pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKLQl7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wIDxlbT5YbWwgQ29sbGVjdGlvbiBNYXBwaW5nIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwID0gZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0NPTlZFUlQgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUNvbnZlcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMCA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAgPGVtPlhtbCBFbnRpdHkgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VOVElUWV8yMCA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8wKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV8yMF9fQ0FDSEVfSU5URVJDRVBUT1IgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfMF9DYWNoZUludGVyY2VwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5RdWVyeSBSZWRpcmVjdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV8yMF9fUVVFUllfUkVESVJFQ1RPUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfMF9RdWVyeVJlZGlyZWN0b3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCA8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQU5ZX1RPX01BTllfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueV8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wIDxlbT5YbWwgTWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZSBDb250YWluZXIgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBfTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhY2hlIEludGVyY2VwdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjBfX0NBQ0hFX0lOVEVSQ0VQVE9SID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wX0NhY2hlSW50ZXJjZXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAgPGVtPlhtbCBPbmUgVG8gTWFueSAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT05FX1RPX01BTllfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9NYW55XzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wIDxlbT5YbWwgT3JkZXIgQ29sdW1uIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT1JERVJfQ09MVU1OXzIwID0gZUlOU1RBTkNFLmdldFhtbE9yZGVyQ29sdW1uXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29ycmVjdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT1JERVJfQ09MVU1OXzIwX19DT1JSRUNUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX0NvcnJlY3Rpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCA8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbGwgUXVlcmllczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19BTExfUVVFUklFUyA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9BbGxRdWVyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWFkIEFsbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19SRUFEX0FMTCA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZWFkQWxsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19SRUFEX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZWFkT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fUkVQT1JUID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlcG9ydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1VQREFURSA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9VcGRhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluc2VydDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19JTlNFUlQgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfSW5zZXJ0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fREVMRVRFID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0RlbGV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgPGVtPk9yZGVyIENvcnJlY3Rpb24gVHlwZSAyMDwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBPUkRFUl9DT1JSRUNUSU9OX1RZUEVfMjAgPSBlSU5TVEFOQ0UuZ2V0T3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAoKTsKLQotCX0KLQotfSAvL0VjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9PcmRlckNvcnJlY3Rpb25UeXBlXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL09yZGVyQ29ycmVjdGlvblR5cGVfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NzQ5YTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL09yZGVyQ29ycmVjdGlvblR5cGVfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+T3JkZXIgQ29sdW1uIENvcnJlY3Rpb24gVHlwZSAyMDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRUFEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFQURfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlSRUFEKDAsICJSRUFEIiwgIlJFQUQiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFQUQgV1JJVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVBRF9XUklURV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVJFQURfV1JJVEUoMSwgIlJFQURfV1JJVEUiLCAiUkVBRF9XUklURSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVhDRVBUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYQ0VQVElPTl9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUVYQ0VQVElPTigyLCAiRVhDRVBUSU9OIiwgIkVYQ0VQVElPTiIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVBRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UkVBRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRUFECi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRUFEIFdSSVRFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SRUFEIFdSSVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFQURfV1JJVEUKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEX1dSSVRFX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVYQ0VQVElPTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RVhDRVBUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYQ0VQVElPTgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYQ0VQVElPTl9WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+T3JkZXIgQ29ycmVjdGlvbiBUeXBlIDIwPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcmRlckNvcnJlY3Rpb25UeXBlXzJfMFtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBPcmRlckNvcnJlY3Rpb25UeXBlXzJfMFtdCi0JCXsKLQkJCVJFQUQsCi0JCQlSRUFEX1dSSVRFLAotCQkJRVhDRVBUSU9OLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPk9yZGVyIENvcnJlY3Rpb24gVHlwZSAyMDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk9yZGVyIENvcnJlY3Rpb24gVHlwZSAyMDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5PcmRlciBDb3JyZWN0aW9uIFR5cGUgMjA8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5PcmRlciBDb3JyZWN0aW9uIFR5cGUgMjA8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBSRUFEX1ZBTFVFOiByZXR1cm4gUkVBRDsKLQkJCWNhc2UgUkVBRF9XUklURV9WQUxVRTogcmV0dXJuIFJFQURfV1JJVEU7Ci0JCQljYXNlIEVYQ0VQVElPTl9WQUxVRTogcmV0dXJuIEVYQ0VQVElPTjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL09yZGVyQ29sdW1uQ29ycmVjdGlvblR5cGVfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQ2FjaGVJbnRlcmNlcHRvcl8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxDYWNoZUludGVyY2VwdG9yXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjhjYWMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxDYWNoZUludGVyY2VwdG9yXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ2FjaGUgSW50ZXJjZXB0b3IyIDA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlSW50ZXJjZXB0b3JfMl8wI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxDYWNoZUludGVyY2VwdG9yXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQ2FjaGVJbnRlcmNlcHRvcl8yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDbGFzc05hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxDYWNoZUludGVyY2VwdG9yXzJfMF9DbGFzc05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZUludGVyY2VwdG9yXzJfMCNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sQ2FjaGVJbnRlcmNlcHRvcjJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTdlN2Y3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDb2xsZWN0aW9uIE1hcHBpbmcgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCNnZXRNYXBLZXlDb252ZXJ0IDxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAgZXh0ZW5kcyBYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwS2V5Q29udmVydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlDb252ZXJ0KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hcEtleUNvbnZlcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCNnZXRNYXBLZXlDb252ZXJ0IDxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFwS2V5Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFwS2V5Q29udmVydChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzYyOGU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGV4dGVuZHMgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sQ29udmVydGlibGVNYXBwaW5nLCBYbWxDb252ZXJ0ZXJzSG9sZGVyLCBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAKLXsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxFbnRpdHlfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRW50aXR5XzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjgwYmEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxFbnRpdHlfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeVJlZGlyZWN0b3JzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW50aXR5MiAwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wI2dldENhY2hlSW50ZXJjZXB0b3IgPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wI2dldFF1ZXJ5UmVkaXJlY3RvcnMgPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbEVudGl0eV8yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVudGl0eV8yXzAgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FjaGUgSW50ZXJjZXB0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDYWNoZUludGVyY2VwdG9yKFhtbENsYXNzUmVmZXJlbmNlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8wX0NhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQ2xhc3NSZWZlcmVuY2UgZ2V0Q2FjaGVJbnRlcmNlcHRvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMCNnZXRDYWNoZUludGVyY2VwdG9yIDxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UXVlcnkgUmVkaXJlY3RvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRRdWVyeVJlZGlyZWN0b3JzKFhtbFF1ZXJ5UmVkaXJlY3RvcnMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbEVudGl0eV8yXzBfUXVlcnlSZWRpcmVjdG9ycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxRdWVyeVJlZGlyZWN0b3JzIGdldFF1ZXJ5UmVkaXJlY3RvcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAjZ2V0UXVlcnlSZWRpcmVjdG9ycyA8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRRdWVyeVJlZGlyZWN0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRRdWVyeVJlZGlyZWN0b3JzKFhtbFF1ZXJ5UmVkaXJlY3RvcnMgdmFsdWUpOwotCi19IC8vIFhtbEVudGl0eTJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hbnlUb01hbnlfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFueVRvTWFueV8yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5MTBkNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFueVRvTWFueV8yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFueSBUbyBNYW55IDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNYW55VG9NYW55XzJfMCBleHRlbmRzIFhtbENvbnZlcnRlckhvbGRlciwgWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wCi17Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWRmYzAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlIENvbnRhaW5lcjIgMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAjZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0KLX0gLy8gWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3NzFlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlXzJfMDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCNnZXRDYWNoZUludGVyY2VwdG9yIDxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAgZXh0ZW5kcyBYbWxDYWNoZWFibGVfMl8wCi17Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wX0NhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQ2xhc3NSZWZlcmVuY2UgZ2V0Q2FjaGVJbnRlcmNlcHRvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAjZ2V0Q2FjaGVJbnRlcmNlcHRvciA8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDYWNoZUludGVyY2VwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWNoZUludGVyY2VwdG9yKFhtbENsYXNzUmVmZXJlbmNlIHZhbHVlKTsKLQotfSAvLyBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9uZVRvTWFueV8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxPbmVUb01hbnlfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMmE2ODAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9uZVRvTWFueV8yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT25lIFRvIE1hbnkgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sT25lVG9NYW55XzJfMCBleHRlbmRzIFhtbENvbnZlcnRlckhvbGRlciwgWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wCi17Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NGVlOGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9yZGVyQ29sdW1uXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT3JkZXIgQ29sdW1uIDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAjZ2V0Q29ycmVjdGlvblR5cGUgPGVtPkNvcnJlY3Rpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE9yZGVyQ29sdW1uXzJfMCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3JyZWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5PcmRlckNvcnJlY3Rpb25UeXBlXzJfMH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db3JyZWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29ycmVjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wCi0JICogQHNlZSAjc2V0Q29ycmVjdGlvblR5cGUoT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzApCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE9yZGVyQ29sdW1uXzJfMF9Db3JyZWN0aW9uVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIGdldENvcnJlY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAjZ2V0Q29ycmVjdGlvblR5cGUgPGVtPkNvcnJlY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29ycmVjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wCi0JICogQHNlZSAjZ2V0Q29ycmVjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvcnJlY3Rpb25UeXBlKE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIHZhbHVlKTsKLQotfSAvLyBYbWxPcmRlckNvbHVtbl8yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NWNhNjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUXVlcnkgUmVkaXJlY3RvcnMyIDA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldEFsbFF1ZXJpZXMgPGVtPkFsbCBRdWVyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRSZWFkQWxsIDxlbT5SZWFkIEFsbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0UmVhZE9iamVjdCA8ZW0+UmVhZCBPYmplY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRVcGRhdGUgPGVtPlVwZGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0SW5zZXJ0IDxlbT5JbnNlcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldERlbGV0ZSA8ZW0+RGVsZXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbGwgUXVlcmllczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWxsIFF1ZXJpZXM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWxsIFF1ZXJpZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsbFF1ZXJpZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9BbGxRdWVyaWVzKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFsbFF1ZXJpZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldEFsbFF1ZXJpZXMgPGVtPkFsbCBRdWVyaWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgUXVlcmllczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWxsUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWxsUXVlcmllcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhZCBBbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlYWQgQWxsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgQWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWFkQWxsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVhZEFsbCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWFkQWxsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRSZWFkQWxsIDxlbT5SZWFkIEFsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBBbGw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlYWRBbGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlYWRBbGwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlYWQgT2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWFkIE9iamVjdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE9iamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVhZE9iamVjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlYWRPYmplY3QoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVhZE9iamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0UmVhZE9iamVjdCA8ZW0+UmVhZCBPYmplY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgT2JqZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWFkT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWFkT2JqZWN0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcG9ydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlcG9ydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlcG9ydCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZXBvcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVwb3J0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcGRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVwZGF0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVwZGF0ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1VwZGF0ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRVcGRhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFVwZGF0ZSA8ZW0+VXBkYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXBkYXRlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnNlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluc2VydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEluc2VydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0luc2VydCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbnNlcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldEluc2VydCA8ZW0+SW5zZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluc2VydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5zZXJ0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlbGV0ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0RlbGV0ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZWxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldERlbGV0ZSA8ZW0+RGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVsZXRlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sUXVlcnlSZWRpcmVjdG9yczJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL0JhdGNoRmV0Y2hUeXBlXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL0JhdGNoRmV0Y2hUeXBlXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjc5NGEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9CYXRjaEZldGNoVHlwZV8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+QmF0Y2ggRmV0Y2ggVHlwZSAyMTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldEJhdGNoRmV0Y2hUeXBlXzJfMSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gQmF0Y2hGZXRjaFR5cGVfMl8xIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkpPSU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSk9JTl9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUpPSU4oMCwgIkpPSU4iLCAiSk9JTiIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVhJU1RTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYSVNUU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUVYSVNUUygxLCAiRVhJU1RTIiwgIkVYSVNUUyIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5fVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlJTigyLCAiSU4iLCAiSU4iKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkpPSU48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkpPSU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSk9JTgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpPSU5fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVhJU1RTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FWElTVFM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhJU1RTCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhJU1RTX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaCBUeXBlIDIxPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCYXRjaEZldGNoVHlwZV8yXzFbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgQmF0Y2hGZXRjaFR5cGVfMl8xW10KLQkJewotCQkJSk9JTiwKLQkJCUVYSVNUUywKLQkJCUlOLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoIFR5cGUgMjE8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxCYXRjaEZldGNoVHlwZV8yXzE+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2ggVHlwZSAyMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJhdGNoRmV0Y2hUeXBlXzJfMSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJQmF0Y2hGZXRjaFR5cGVfMl8xIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoIFR5cGUgMjE8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBCYXRjaEZldGNoVHlwZV8yXzEgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUJhdGNoRmV0Y2hUeXBlXzJfMSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoIFR5cGUgMjE8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBCYXRjaEZldGNoVHlwZV8yXzEgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgSk9JTl9WQUxVRTogcmV0dXJuIEpPSU47Ci0JCQljYXNlIEVYSVNUU19WQUxVRTogcmV0dXJuIEVYSVNUUzsKLQkJCWNhc2UgSU5fVkFMVUU6IHJldHVybiBJTjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQmF0Y2hGZXRjaFR5cGVfMl8xKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQotCXsKLQkgIHJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCi0JewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQkKLX0gLy9CYXRjaEZldGNoVHlwZV8yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9DYWNoZUtleVR5cGVfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvQ2FjaGVLZXlUeXBlXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjgzYjllLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9DYWNoZUtleVR5cGVfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5DYWNoZSBLZXkgVHlwZSAyMTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldENhY2hlS2V5VHlwZV8yXzEoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIENhY2hlS2V5VHlwZV8yXzEgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+SUQgVkFMVUU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSURfVkFMVUVfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlJRF9WQUxVRSgwLCAiSURfVkFMVUUiLCAiSURfVkFMVUUiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNBQ0hFIEtFWTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDQUNIRV9LRVlfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlDQUNIRV9LRVkoMSwgIkNBQ0hFX0tFWSIsICJDQUNIRV9LRVkiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFVVE88L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVVUT19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUFVVE8oMiwgIkFVVE8iLCAiQVVUTyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SUQgVkFMVUU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklEIFZBTFVFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lEX1ZBTFVFCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVkFMVUVfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0FDSEUgS0VZPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DQUNIRSBLRVk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0FDSEVfS0VZCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfS0VZX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFVVE88L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFVVE88L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVVUTwotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fVkFMVUUgPSAyOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkNhY2hlIEtleSBUeXBlIDIxPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDYWNoZUtleVR5cGVfMl8xW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IENhY2hlS2V5VHlwZV8yXzFbXQotCQl7Ci0JCQlJRF9WQUxVRSwKLQkJCUNBQ0hFX0tFWSwKLQkJCUFVVE8sCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+Q2FjaGUgS2V5IFR5cGUgMjE8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDYWNoZUtleVR5cGVfMl8xPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNhY2hlIEtleSBUeXBlIDIxPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2FjaGVLZXlUeXBlXzJfMSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJQ2FjaGVLZXlUeXBlXzJfMSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5DYWNoZSBLZXkgVHlwZSAyMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENhY2hlS2V5VHlwZV8yXzEgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUNhY2hlS2V5VHlwZV8yXzEgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5DYWNoZSBLZXkgVHlwZSAyMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENhY2hlS2V5VHlwZV8yXzEgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgSURfVkFMVUVfVkFMVUU6IHJldHVybiBJRF9WQUxVRTsKLQkJCWNhc2UgQ0FDSEVfS0VZX1ZBTFVFOiByZXR1cm4gQ0FDSEVfS0VZOwotCQkJY2FzZSBBVVRPX1ZBTFVFOiByZXR1cm4gQVVUTzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ2FjaGVLZXlUeXBlXzJfMShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vQ2FjaGVLZXlUeXBlXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL0VjbGlwc2VMaW5rMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvRWNsaXBzZUxpbmsyXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFmODNmMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvRWNsaXBzZUxpbmsyXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGluazJfMQotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzAKLXsKLQlTdHJpbmcgU0NIRU1BX05BTUVTUEFDRSA9IEVjbGlwc2VMaW5rLlNDSEVNQV9OQU1FU1BBQ0U7Ci0JU3RyaW5nIFNDSEVNQV9MT0NBVElPTiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3JtXzJfMS54c2QiOwotCVN0cmluZyBTQ0hFTUFfVkVSU0lPTgk9ICIyLjEiOwotCQotCQotCS8vIEVjbGlwc2VMaW5rIDIuMSBzcGVjaWZpYyBub2RlcwotCQotCVN0cmluZyBBVFRSSUJVVEUgPSAiYXR0cmlidXRlIjsKLQlTdHJpbmcgQVRUUklCVVRFX1RZUEUgPSAiYXR0cmlidXRlLXR5cGUiOwotCVN0cmluZyBCQVRDSF9GRVRDSCA9ICJiYXRjaC1mZXRjaCI7Ci0JCVN0cmluZyBCQVRDSF9GRVRDSF9fU0laRSA9ICJzaXplIjsKLQkJU3RyaW5nIEJBVENIX0ZFVENIX19UWVBFID0gInR5cGUiOwotCVN0cmluZyBDQUNIRV9LRVlfVFlQRSA9ICJjYWNoZS1rZXktdHlwZSI7Ci0JU3RyaW5nIENMQVNTX0VYVFJBQ1RPUiA9ICJjbGFzcy1leHRyYWN0b3IiOwotCVN0cmluZyBGRVRDSF9HUk9VUCA9ICJmZXRjaC1ncm91cCI7Ci0JCVN0cmluZyBGRVRDSF9HUk9VUF9fTE9BRCA9ICJsb2FkIjsKLQlTdHJpbmcgUEFSRU5UX0NMQVNTID0gInBhcmVudC1jbGFzcyI7Ci0JU3RyaW5nIFJFVFVSTl9JTlNFUlQgPSAicmV0dXJuLWluc2VydCI7Ci0JU3RyaW5nIFJFVFVSTl9PTkxZID0gInJldHVybi1vbmx5IjsKLQlTdHJpbmcgUkVUVVJOX1VQREFURSA9ICJyZXR1cm4tdXBkYXRlIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9FY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzVmMzUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9FY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5SW1wbAotewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5IGVJTlNUQU5DRSA9IGluaXQoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtVjJfMUZhY3RvcnkgaW5pdCgpCi0JewotCQl0cnkKLQkJewotCQkJRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeSB0aGVFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5ID0gKEVjbGlwc2VMaW5rT3JtVjJfMUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImpwdC5lY2xpcHNlbGluay5vcm0udjJfMS54bWkiKTsgCi0JCQlpZiAodGhlRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeSAhPSBudWxsKQotCQkJewotCQkJCXJldHVybiB0aGVFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotCQl7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtVjJfMUZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCi0JewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLkNBQ0hFX0tFWV9UWVBFXzIxOgotCQkJCXJldHVybiBjcmVhdGVDYWNoZUtleVR5cGVfMl8xRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuQkFUQ0hfRkVUQ0hfVFlQRV8yMToKLQkJCQlyZXR1cm4gY3JlYXRlQmF0Y2hGZXRjaFR5cGVfMl8xRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuQ0FDSEVfS0VZX1RZUEVfMjE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDYWNoZUtleVR5cGVfMl8xVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5CQVRDSF9GRVRDSF9UWVBFXzIxOgotCQkJCXJldHVybiBjb252ZXJ0QmF0Y2hGZXRjaFR5cGVfMl8xVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYWNoZUtleVR5cGVfMl8xIGNyZWF0ZUNhY2hlS2V5VHlwZV8yXzFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlDYWNoZUtleVR5cGVfMl8xIHJlc3VsdCA9IENhY2hlS2V5VHlwZV8yXzEuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENhY2hlS2V5VHlwZV8yXzFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCYXRjaEZldGNoVHlwZV8yXzEgY3JlYXRlQmF0Y2hGZXRjaFR5cGVfMl8xRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJQmF0Y2hGZXRjaFR5cGVfMl8xIHJlc3VsdCA9IEJhdGNoRmV0Y2hUeXBlXzJfMS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0QmF0Y2hGZXRjaFR5cGVfMl8xVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSBnZXRFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKCkKLQl7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgZ2V0UGFja2FnZSgpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL0VjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZGM1ZWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL0VjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMUZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlSW1wbAotewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5BTUUgPSAidjJfMSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19VUkkgPSAianB0LmVjbGlwc2VsaW5rLm9ybS52Ml8xLnhtaSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEgPGVtPlhtbCBCYXNpYyAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhc2ljXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxCYXNpY18yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfMjEgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDXzIxX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9CQVNJQ18xMV9fU0VRVUVOQ0VfR0VORVJBVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDXzIxX19UQUJMRV9HRU5FUkFUT1IgPSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9CQVNJQ18xMV9fVEFCTEVfR0VORVJBVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlZCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDXzIxX19HRU5FUkFURURfVkFMVUUgPSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9CQVNJQ18xMV9fR0VORVJBVEVEX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldHVybiBJbnNlcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18yMV9fUkVUVVJOX0lOU0VSVCA9IEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuWE1MX0JBU0lDXzExX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldHVybiBVcGRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18yMV9fUkVUVVJOX1VQREFURSA9IEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuWE1MX0JBU0lDXzExX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfMjFfX0FUVFJJQlVURV9UWVBFID0gRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5YTUxfQkFTSUNfMTFfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2ljIDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDXzIxX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9CQVNJQ18xMV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmF0Y2hGZXRjaF8yXzEgPGVtPlhtbCBCYXRjaCBGZXRjaCAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhdGNoRmV0Y2hfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEJhdGNoRmV0Y2hfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBVENIX0ZFVENIXzIxID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFUQ0hfRkVUQ0hfMjFfX1NJWkUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVRDSF9GRVRDSF8yMV9fQkFUQ0hfRkVUQ0hfVFlQRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhdGNoIEZldGNoIDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBVENIX0ZFVENIXzIxX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEgPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMV9fSk9JTl9GRVRDSCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMV9fQkFUQ0hfRkVUQ0ggPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjFfX0FUVFJJQlVURV9UWVBFID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIxX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGFibGVfMl8xIDxlbT5YbWwgRW1iZWRkYWJsZSAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGFibGVfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVtYmVkZGFibGVfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfMjEgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV8yMV9fQUNDRVNTX01FVEhPRFMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVtYmVkZGFibGUgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV8yMV9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkXzJfMSA8ZW0+WG1sIEVtYmVkZGVkIDIxPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVtYmVkZGVkXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF8yMSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF8yMV9fQVRUUklCVVRFX1RZUEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRlZCAyMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF8yMV9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRJZF8yXzEgPGVtPlhtbCBFbWJlZGRlZCBJZCAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkSWRfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVtYmVkZGVkSWRfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEXzIxID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEXzIxX19BVFRSSUJVVEVfVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVtYmVkZGVkIElkIDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEXzIxX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSA8ZW0+WG1sIEZldGNoIEdyb3VwIENvbnRhaW5lciAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0dST1VQX0NPTlRBSU5FUl8yMSA9IDEwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlfMl8xIDxlbT5YbWwgRW50aXR5IDIxPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5XzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjFfX0FDQ0VTU19NRVRIT0RTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoIEdyb3VwczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIxX19GRVRDSF9HUk9VUFMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBFeHRyYWN0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjFfX0NMQVNTX0VYVFJBQ1RPUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMV9fUEFSRU5UX0NMQVNTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVudGl0eSAyMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjFfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlNYXBwaW5nc18yXzEgPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlNYXBwaW5nc18yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU18yMSA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfMjFfX0FDQ0VTU19NRVRIT0RTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTXzIxX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xIDxlbT5YbWwgRmV0Y2ggQXR0cmlidXRlIDIxPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEZldGNoQXR0cmlidXRlXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9BVFRSSUJVVEVfMjEgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9BVFRSSUJVVEVfMjFfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBGZXRjaCBBdHRyaWJ1dGUgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfQVRUUklCVVRFXzIxX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwXzJfMSA8ZW0+WG1sIEZldGNoIEdyb3VwIDIxPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfR1JPVVBfMjEgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9HUk9VUF8yMV9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9hZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0dST1VQXzIxX19MT0FEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9HUk9VUF8yMV9fQVRUUklCVVRFUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEZldGNoIEdyb3VwIDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0dST1VQXzIxX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoIEdyb3VwczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfR1JPVVBfQ09OVEFJTkVSXzIxX19GRVRDSF9HUk9VUFMgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBGZXRjaCBHcm91cCBDb250YWluZXIgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfR1JPVVBfQ09OVEFJTkVSXzIxX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxJZF8yXzEgPGVtPlhtbCBJZCAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbElkXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxJZF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfMjEgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEXzIxX19BVFRSSUJVVEVfVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIElkIDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEXzIxX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYW55VG9NYW55XzJfMSA8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb01hbnlfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMSA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIxX19CQVRDSF9GRVRDSCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMV9fQVRUUklCVVRFX1RZUEUgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFueSBUbyBNYW55IDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMV9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb09uZV8yXzEgPGVtPlhtbCBNYW55IFRvIE9uZSAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb09uZV8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sTWFueVRvT25lXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV8yMSA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfMjFfX0JBVENIX0ZFVENIID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE9uZSAyMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV8yMV9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMSA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoIEdyb3VwczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX0ZFVENIX0dST1VQUyA9IE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fU0VRVUVOQ0VfR0VORVJBVE9SID0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19UQUJMRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX05BTUVEX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19OQU1FRF9OQVRJVkVfUVVFUklFUyA9IE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RdWVyeSBSZWRpcmVjdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19RVUVSWV9SRURJUkVDVE9SUyA9IE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJlbnQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fUEFSRU5UX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE9uZVRvTWFueV8yXzEgPGVtPlhtbCBPbmUgVG8gTWFueSAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE9uZVRvTWFueV8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMSA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjFfX0JBVENIX0ZFVENIID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjFfX0FUVFJJQlVURV9UWVBFID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9uZSBUbyBNYW55IDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIxX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9PbmVfMl8xIDxlbT5YbWwgT25lIFRvIE9uZSAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE9uZVRvT25lXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxPbmVUb09uZV8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV8yMSA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV8yMV9fQkFUQ0hfRkVUQ0ggPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9uZSBUbyBPbmUgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV8yMV9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjEgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjFfX0FDQ0VTU19NRVRIT0RTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzIDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjFfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxSZXR1cm5JbnNlcnRfMl8xIDxlbT5YbWwgUmV0dXJuIEluc2VydCAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFJldHVybkluc2VydF8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sUmV0dXJuSW5zZXJ0XzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRVRVUk5fSU5TRVJUXzIxID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFRyYW5zZm9ybWF0aW9uXzJfMSA8ZW0+WG1sIFRyYW5zZm9ybWF0aW9uIDIxPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVHJhbnNmb3JtYXRpb25fMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFRyYW5zZm9ybWF0aW9uXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0ZPUk1BVElPTl8yMSA9IDIwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxWZXJzaW9uXzJfMSA8ZW0+WG1sIFZlcnNpb24gMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxWZXJzaW9uXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxWZXJzaW9uXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OXzIxID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFByaW1hcnlLZXlfMl8xIDxlbT5YbWwgUHJpbWFyeSBLZXkgMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxQcmltYXJ5S2V5XzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5XzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV8yMSA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlIEtleSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfMjFfX0NBQ0hFX0tFWV9UWVBFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUHJpbWFyeSBLZXkgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfMjFfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV0dXJuIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRVRVUk5fSU5TRVJUXzIxX19SRVRVUk5fT05MWSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFJldHVybiBJbnNlcnQgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVUVVJOX0lOU0VSVF8yMV9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TRk9STUFUSU9OXzIxX19BVFRSSUJVVEVfVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFRyYW5zZm9ybWF0aW9uIDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TRk9STUFUSU9OXzIxX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl8yMV9fQVRUUklCVVRFX1RZUEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBWZXJzaW9uIDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fMjFfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzEgPGVtPkNhY2hlIEtleSBUeXBlIDIxPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5DYWNoZUtleVR5cGVfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldENhY2hlS2V5VHlwZV8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUNIRV9LRVlfVFlQRV8yMSA9IDIyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5CYXRjaEZldGNoVHlwZV8yXzEgPGVtPkJhdGNoIEZldGNoIFR5cGUgMjE8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRCYXRjaEZldGNoVHlwZV8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVRDSF9GRVRDSF9UWVBFXzIxID0gMjM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxCYXNpY18yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmF0Y2hGZXRjaF8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRWxlbWVudENvbGxlY3Rpb25fMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGFibGVfMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGVkXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbWJlZGRlZElkXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbnRpdHlfMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eU1hcHBpbmdzXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxGZXRjaEF0dHJpYnV0ZV8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRmV0Y2hHcm91cF8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sSWRfMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE1hbnlUb01hbnlfMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE1hbnlUb09uZV8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9NYW55XzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPbmVUb09uZV8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFJldHVybkluc2VydF8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVHJhbnNmb3JtYXRpb25fMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFZlcnNpb25fMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFByaW1hcnlLZXlfMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gY2FjaGVLZXlUeXBlXzJfMUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gYmF0Y2hGZXRjaFR5cGVfMl8xRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSgpCi0JewotCQlzdXBlcihlTlNfVVJJLCBFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgotCSAqIAotCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KLQkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSBpbml0KCkKLQl7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmZyZWV6ZSgpOwotCi0gIAotCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKLQkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSwgdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSk7Ci0JCXJldHVybiB0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xIDxlbT5YbWwgQmFzaWMgMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEJhc2ljIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQmFzaWNfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxCYXNpY18yXzFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEjZ2V0UmV0dXJuSW5zZXJ0IDxlbT5SZXR1cm4gSW5zZXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmV0dXJuIEluc2VydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhc2ljXzJfMSNnZXRSZXR1cm5JbnNlcnQoKQotCSAqIEBzZWUgI2dldFhtbEJhc2ljXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEJhc2ljXzJfMV9SZXR1cm5JbnNlcnQoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEJhc2ljXzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xI2dldFJldHVyblVwZGF0ZSA8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJldHVybiBVcGRhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEjZ2V0UmV0dXJuVXBkYXRlKCkKLQkgKiBAc2VlICNnZXRYbWxCYXNpY18yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXNpY18yXzFfUmV0dXJuVXBkYXRlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxCYXNpY18yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhc2ljXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBzZWUgI2dldFhtbEJhc2ljXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEJhc2ljXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxCYXNpY18yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhdGNoRmV0Y2hfMl8xIDxlbT5YbWwgQmF0Y2ggRmV0Y2ggMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEJhdGNoIEZldGNoIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmF0Y2hGZXRjaF8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXRjaEZldGNoXzJfMSgpCi0JewotCQlyZXR1cm4geG1sQmF0Y2hGZXRjaF8yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhdGNoRmV0Y2hfMl8xI2dldFNpemUgPGVtPlNpemU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaXplPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmF0Y2hGZXRjaF8yXzEjZ2V0U2l6ZSgpCi0JICogQHNlZSAjZ2V0WG1sQmF0Y2hGZXRjaF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXRjaEZldGNoXzJfMV9TaXplKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxCYXRjaEZldGNoXzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMSNnZXRCYXRjaEZldGNoVHlwZSA8ZW0+QmF0Y2ggRmV0Y2ggVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJhdGNoIEZldGNoIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMSNnZXRCYXRjaEZldGNoVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sQmF0Y2hGZXRjaF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXRjaEZldGNoXzJfMV9CYXRjaEZldGNoVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQmF0Y2hGZXRjaF8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGFibGVfMl8xIDxlbT5YbWwgRW1iZWRkYWJsZSAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW1iZWRkYWJsZSAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGFibGVfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW1iZWRkYWJsZV8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbEVtYmVkZGFibGVfMl8xRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRfMl8xIDxlbT5YbWwgRW1iZWRkZWQgMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVtYmVkZGVkIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW1iZWRkZWRfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxFbWJlZGRlZF8yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRfMl8xI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBzZWUgI2dldFhtbEVtYmVkZGVkXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVtYmVkZGVkXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbWJlZGRlZF8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkSWRfMl8xIDxlbT5YbWwgRW1iZWRkZWQgSWQgMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVtYmVkZGVkIElkIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRJZF8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbWJlZGRlZElkXzJfMSgpCi0JewotCQlyZXR1cm4geG1sRW1iZWRkZWRJZF8yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkSWRfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbWJlZGRlZElkXzJfMSNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxFbWJlZGRlZElkXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVtYmVkZGVkSWRfMl8xX0F0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVtYmVkZGVkSWRfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlfMl8xIDxlbT5YbWwgRW50aXR5IDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHkgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW50aXR5XzJfMSgpCi0JewotCQlyZXR1cm4geG1sRW50aXR5XzJfMUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEjZ2V0Q2xhc3NFeHRyYWN0b3IgPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEjZ2V0Q2xhc3NFeHRyYWN0b3IoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eV8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfMl8xX0NsYXNzRXh0cmFjdG9yKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlfMl8xI2dldFBhcmVudENsYXNzIDxlbT5QYXJlbnQgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXJlbnQgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlfMl8xI2dldFBhcmVudENsYXNzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5XzJfMV9QYXJlbnRDbGFzcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5XzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5TWFwcGluZ3NfMl8xIDxlbT5YbWwgRW50aXR5IE1hcHBpbmdzIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlNYXBwaW5nc18yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzEoKQotCXsKLQkJcmV0dXJuIHhtbEVudGl0eU1hcHBpbmdzXzJfMUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoQXR0cmlidXRlXzJfMSA8ZW0+WG1sIEZldGNoIEF0dHJpYnV0ZSAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRmV0Y2ggQXR0cmlidXRlIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxGZXRjaEF0dHJpYnV0ZV8yXzFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEF0dHJpYnV0ZV8yXzEjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEF0dHJpYnV0ZV8yXzEjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEZldGNoQXR0cmlidXRlXzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xIDxlbT5YbWwgRmV0Y2ggR3JvdXAgMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEZldGNoIEdyb3VwIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxGZXRjaEdyb3VwXzJfMSgpCi0JewotCQlyZXR1cm4geG1sRmV0Y2hHcm91cF8yXzFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwXzJfMSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbEZldGNoR3JvdXBfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRmV0Y2hHcm91cF8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEjZ2V0QXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xI2dldEF0dHJpYnV0ZXMoKQotCSAqIEBzZWUgI2dldFhtbEZldGNoR3JvdXBfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRmV0Y2hHcm91cF8yXzFfQXR0cmlidXRlcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRmV0Y2hHcm91cF8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xI2dldExvYWQgPGVtPkxvYWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2FkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEjZ2V0TG9hZCgpCi0JICogQHNlZSAjZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxGZXRjaEdyb3VwXzJfMV9Mb2FkKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxGZXRjaEdyb3VwXzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEgPGVtPlhtbCBGZXRjaCBHcm91cCBDb250YWluZXIgMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEZldGNoIEdyb3VwIENvbnRhaW5lciAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSNnZXRGZXRjaEdyb3VwcyA8ZW0+RmV0Y2ggR3JvdXBzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5GZXRjaCBHcm91cHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSNnZXRGZXRjaEdyb3VwcygpCi0JICogQHNlZSAjZ2V0WG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMV9GZXRjaEdyb3VwcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxJZF8yXzEgPGVtPlhtbCBJZCAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgSWQgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxJZF8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxJZF8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbElkXzJfMUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sSWRfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxJZF8yXzEjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sSWRfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sSWRfMl8xX0F0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbElkXzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvTWFueV8yXzEgPGVtPlhtbCBNYW55IFRvIE1hbnkgMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb01hbnlfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFueVRvTWFueV8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbE1hbnlUb01hbnlfMl8xRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYW55VG9NYW55XzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvTWFueV8yXzEjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sTWFueVRvTWFueV8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNYW55VG9NYW55XzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYW55VG9NYW55XzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvT25lXzJfMSA8ZW0+WG1sIE1hbnkgVG8gT25lIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYW55IFRvIE9uZSAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb09uZV8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9PbmVfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxNYW55VG9PbmVfMl8xRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEgPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MgPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xI2dldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xX1NxbFJlc3VsdFNldE1hcHBpbmdzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEjZ2V0UXVlcnlSZWRpcmVjdG9ycyA8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xI2dldFF1ZXJ5UmVkaXJlY3RvcnMoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfUXVlcnlSZWRpcmVjdG9ycygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xI2dldFBhcmVudENsYXNzIDxlbT5QYXJlbnQgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXJlbnQgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSNnZXRQYXJlbnRDbGFzcygpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9QYXJlbnRDbGFzcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE9uZVRvTWFueV8yXzEgPGVtPlhtbCBPbmUgVG8gTWFueSAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT25lIFRvIE1hbnkgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb01hbnlfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT25lVG9NYW55XzJfMSgpCi0JewotCQlyZXR1cm4geG1sT25lVG9NYW55XzJfMUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9NYW55XzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9NYW55XzJfMSNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxPbmVUb01hbnlfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT25lVG9NYW55XzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxPbmVUb01hbnlfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb09uZV8yXzEgPGVtPlhtbCBPbmUgVG8gT25lIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPbmUgVG8gT25lIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9PbmVfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT25lVG9PbmVfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxPbmVUb09uZV8yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxSZXR1cm5JbnNlcnRfMl8xIDxlbT5YbWwgUmV0dXJuIEluc2VydCAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUmV0dXJuIEluc2VydCAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFJldHVybkluc2VydF8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxSZXR1cm5JbnNlcnRfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxSZXR1cm5JbnNlcnRfMl8xRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUmV0dXJuSW5zZXJ0XzJfMSNnZXRSZXR1cm5Pbmx5IDxlbT5SZXR1cm4gT25seTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJldHVybiBPbmx5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUmV0dXJuSW5zZXJ0XzJfMSNnZXRSZXR1cm5Pbmx5KCkKLQkgKiBAc2VlICNnZXRYbWxSZXR1cm5JbnNlcnRfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUmV0dXJuSW5zZXJ0XzJfMV9SZXR1cm5Pbmx5KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxSZXR1cm5JbnNlcnRfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVHJhbnNmb3JtYXRpb25fMl8xIDxlbT5YbWwgVHJhbnNmb3JtYXRpb24gMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFRyYW5zZm9ybWF0aW9uIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVHJhbnNmb3JtYXRpb25fMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVHJhbnNmb3JtYXRpb25fMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxUcmFuc2Zvcm1hdGlvbl8yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFRyYW5zZm9ybWF0aW9uXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVHJhbnNmb3JtYXRpb25fMl8xI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBzZWUgI2dldFhtbFRyYW5zZm9ybWF0aW9uXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFRyYW5zZm9ybWF0aW9uXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUcmFuc2Zvcm1hdGlvbl8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFZlcnNpb25fMl8xIDxlbT5YbWwgVmVyc2lvbiAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVmVyc2lvbiAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFZlcnNpb25fMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVmVyc2lvbl8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbFZlcnNpb25fMl8xRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxWZXJzaW9uXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVmVyc2lvbl8yXzEjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sVmVyc2lvbl8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxWZXJzaW9uXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxWZXJzaW9uXzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUHJpbWFyeUtleV8yXzEgPGVtPlhtbCBQcmltYXJ5IEtleSAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUHJpbWFyeSBLZXkgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxQcmltYXJ5S2V5XzJfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFByaW1hcnlLZXlfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxQcmltYXJ5S2V5XzJfMUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFByaW1hcnlLZXlfMl8xI2dldENhY2hlS2V5VHlwZSA8ZW0+Q2FjaGUgS2V5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYWNoZSBLZXkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFByaW1hcnlLZXlfMl8xI2dldENhY2hlS2V5VHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sUHJpbWFyeUtleV8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQcmltYXJ5S2V5XzJfMV9DYWNoZUtleVR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByaW1hcnlLZXlfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5DYWNoZUtleVR5cGVfMl8xIDxlbT5DYWNoZSBLZXkgVHlwZSAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkNhY2hlIEtleSBUeXBlIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQ2FjaGVLZXlUeXBlXzJfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0Q2FjaGVLZXlUeXBlXzJfMSgpCi0JewotCQlyZXR1cm4gY2FjaGVLZXlUeXBlXzJfMUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQmF0Y2hGZXRjaFR5cGVfMl8xIDxlbT5CYXRjaCBGZXRjaCBUeXBlIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+QmF0Y2ggRmV0Y2ggVHlwZSAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0QmF0Y2hGZXRjaFR5cGVfMl8xKCkKLQl7Ci0JCXJldHVybiBiYXRjaEZldGNoVHlwZV8yXzFFRW51bTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5IGdldEVjbGlwc2VMaW5rT3JtVjJfMUZhY3RvcnkoKQotCXsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJeG1sQmFzaWNfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9CQVNJQ18yMSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQmFzaWNfMl8xRUNsYXNzLCBYTUxfQkFTSUNfMjFfX1JFVFVSTl9JTlNFUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEJhc2ljXzJfMUVDbGFzcywgWE1MX0JBU0lDXzIxX19SRVRVUk5fVVBEQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxCYXNpY18yXzFFQ2xhc3MsIFhNTF9CQVNJQ18yMV9fQVRUUklCVVRFX1RZUEUpOwotCi0JCXhtbEJhdGNoRmV0Y2hfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9CQVRDSF9GRVRDSF8yMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmF0Y2hGZXRjaF8yXzFFQ2xhc3MsIFhNTF9CQVRDSF9GRVRDSF8yMV9fU0laRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmF0Y2hGZXRjaF8yXzFFQ2xhc3MsIFhNTF9CQVRDSF9GRVRDSF8yMV9fQkFUQ0hfRkVUQ0hfVFlQRSk7Ci0KLQkJeG1sRWxlbWVudENvbGxlY3Rpb25fMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMUVDbGFzcywgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMV9fQVRUUklCVVRFX1RZUEUpOwotCi0JCXhtbEVtYmVkZGFibGVfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERBQkxFXzIxKTsKLQotCQl4bWxFbWJlZGRlZF8yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VNQkVEREVEXzIxKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbWJlZGRlZF8yXzFFQ2xhc3MsIFhNTF9FTUJFRERFRF8yMV9fQVRUUklCVVRFX1RZUEUpOwotCi0JCXhtbEVtYmVkZGVkSWRfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERFRF9JRF8yMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW1iZWRkZWRJZF8yXzFFQ2xhc3MsIFhNTF9FTUJFRERFRF9JRF8yMV9fQVRUUklCVVRFX1RZUEUpOwotCi0JCXhtbEVudGl0eV8yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VOVElUWV8yMSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5XzJfMUVDbGFzcywgWE1MX0VOVElUWV8yMV9fQ0xBU1NfRVhUUkFDVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlfMl8xRUNsYXNzLCBYTUxfRU5USVRZXzIxX19QQVJFTlRfQ0xBU1MpOwotCi0JCXhtbEVudGl0eU1hcHBpbmdzXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU5USVRZX01BUFBJTkdTXzIxKTsKLQotCQl4bWxGZXRjaEF0dHJpYnV0ZV8yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0ZFVENIX0FUVFJJQlVURV8yMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRmV0Y2hBdHRyaWJ1dGVfMl8xRUNsYXNzLCBYTUxfRkVUQ0hfQVRUUklCVVRFXzIxX19OQU1FKTsKLQotCQl4bWxGZXRjaEdyb3VwXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRkVUQ0hfR1JPVVBfMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEZldGNoR3JvdXBfMl8xRUNsYXNzLCBYTUxfRkVUQ0hfR1JPVVBfMjFfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEZldGNoR3JvdXBfMl8xRUNsYXNzLCBYTUxfRkVUQ0hfR1JPVVBfMjFfX0xPQUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEZldGNoR3JvdXBfMl8xRUNsYXNzLCBYTUxfRkVUQ0hfR1JPVVBfMjFfX0FUVFJJQlVURVMpOwotCi0JCXhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9GRVRDSF9HUk9VUF9DT05UQUlORVJfMjEpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xRUNsYXNzLCBYTUxfRkVUQ0hfR1JPVVBfQ09OVEFJTkVSXzIxX19GRVRDSF9HUk9VUFMpOwotCi0JCXhtbElkXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSURfMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbElkXzJfMUVDbGFzcywgWE1MX0lEXzIxX19BVFRSSUJVVEVfVFlQRSk7Ci0KLQkJeG1sTWFueVRvTWFueV8yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BTllfVE9fTUFOWV8yMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTWFueVRvTWFueV8yXzFFQ2xhc3MsIFhNTF9NQU5ZX1RPX01BTllfMjFfX0FUVFJJQlVURV9UWVBFKTsKLQotCQl4bWxNYW55VG9PbmVfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQU5ZX1RPX09ORV8yMSk7Ci0KLQkJeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fUVVFUllfUkVESVJFQ1RPUlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1BBUkVOVF9DTEFTUyk7Ci0KLQkJeG1sT25lVG9NYW55XzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX01BTllfMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE9uZVRvTWFueV8yXzFFQ2xhc3MsIFhNTF9PTkVfVE9fTUFOWV8yMV9fQVRUUklCVVRFX1RZUEUpOwotCi0JCXhtbE9uZVRvT25lXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX09ORV8yMSk7Ci0KLQkJeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIxKTsKLQotCQl4bWxQcmltYXJ5S2V5XzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUFJJTUFSWV9LRVlfMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFByaW1hcnlLZXlfMl8xRUNsYXNzLCBYTUxfUFJJTUFSWV9LRVlfMjFfX0NBQ0hFX0tFWV9UWVBFKTsKLQotCQl4bWxSZXR1cm5JbnNlcnRfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9SRVRVUk5fSU5TRVJUXzIxKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxSZXR1cm5JbnNlcnRfMl8xRUNsYXNzLCBYTUxfUkVUVVJOX0lOU0VSVF8yMV9fUkVUVVJOX09OTFkpOwotCi0JCXhtbFRyYW5zZm9ybWF0aW9uXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVFJBTlNGT1JNQVRJT05fMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFRyYW5zZm9ybWF0aW9uXzJfMUVDbGFzcywgWE1MX1RSQU5TRk9STUFUSU9OXzIxX19BVFRSSUJVVEVfVFlQRSk7Ci0KLQkJeG1sVmVyc2lvbl8yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1ZFUlNJT05fMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFZlcnNpb25fMl8xRUNsYXNzLCBYTUxfVkVSU0lPTl8yMV9fQVRUUklCVVRFX1RZUEUpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQljYWNoZUtleVR5cGVfMl8xRUVudW0gPSBjcmVhdGVFRW51bShDQUNIRV9LRVlfVFlQRV8yMSk7Ci0JCWJhdGNoRmV0Y2hUeXBlXzJfMUVFbnVtID0gY3JlYXRlRUVudW0oQkFUQ0hfRkVUQ0hfVFlQRV8yMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lTlNfVVJJKTsKLQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpOwotCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKLQkJT3JtUGFja2FnZSB0aGVPcm1QYWNrYWdlID0gKE9ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQl4bWxCYXNpY18yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5nZXRYbWxCYXNpY18xXzEoKSk7Ci0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sSm9pbkZldGNoKCkpOwotCQl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbEJhdGNoRmV0Y2hIb2xkZXIoKSk7Ci0JCXhtbEVtYmVkZGFibGVfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkpOwotCQl4bWxFbnRpdHlfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkpOwotCQl4bWxFbnRpdHlfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEoKSk7Ci0JCXhtbEVudGl0eU1hcHBpbmdzXzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpKTsKLQkJeG1sTWFueVRvTWFueV8yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbEJhdGNoRmV0Y2hIb2xkZXIoKSk7Ci0JCXhtbE1hbnlUb09uZV8yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbEJhdGNoRmV0Y2hIb2xkZXIoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSgpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxHZW5lcmF0b3JDb250YWluZXIoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sUXVlcnlDb250YWluZXIoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxRdWVyeUNvbnRhaW5lcigpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIoKSk7Ci0JCXhtbE9uZVRvTWFueV8yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbEJhdGNoRmV0Y2hIb2xkZXIoKSk7Ci0JCXhtbE9uZVRvT25lXzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcigpKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoeG1sQmFzaWNfMl8xRUNsYXNzLCBYbWxCYXNpY18yXzEuY2xhc3MsICJYbWxCYXNpY18yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxCYXNpY18yXzFfUmV0dXJuSW5zZXJ0KCksIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxSZXR1cm5JbnNlcnQoKSwgbnVsbCwgInJldHVybkluc2VydCIsIG51bGwsIDAsIDEsIFhtbEJhc2ljXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQmFzaWNfMl8xX1JldHVyblVwZGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJyZXR1cm5VcGRhdGUiLCBudWxsLCAwLCAxLCBYbWxCYXNpY18yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEJhc2ljXzJfMV9BdHRyaWJ1dGVUeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXR0cmlidXRlVHlwZSIsIG51bGwsIDAsIDEsIFhtbEJhc2ljXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEJhdGNoRmV0Y2hfMl8xRUNsYXNzLCBYbWxCYXRjaEZldGNoXzJfMS5jbGFzcywgIlhtbEJhdGNoRmV0Y2hfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQmF0Y2hGZXRjaF8yXzFfU2l6ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgInNpemUiLCBudWxsLCAwLCAxLCBYbWxCYXRjaEZldGNoXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQmF0Y2hGZXRjaF8yXzFfQmF0Y2hGZXRjaFR5cGUoKSwgdGhpcy5nZXRCYXRjaEZldGNoVHlwZV8yXzEoKSwgImJhdGNoRmV0Y2hUeXBlIiwgbnVsbCwgMCwgMSwgWG1sQmF0Y2hGZXRjaF8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzFFQ2xhc3MsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMS5jbGFzcywgIlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMV9BdHRyaWJ1dGVUeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXR0cmlidXRlVHlwZSIsIG51bGwsIDAsIDEsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVtYmVkZGFibGVfMl8xRUNsYXNzLCBYbWxFbWJlZGRhYmxlXzJfMS5jbGFzcywgIlhtbEVtYmVkZGFibGVfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEVtYmVkZGVkXzJfMUVDbGFzcywgWG1sRW1iZWRkZWRfMl8xLmNsYXNzLCAiWG1sRW1iZWRkZWRfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW1iZWRkZWRfMl8xX0F0dHJpYnV0ZVR5cGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhdHRyaWJ1dGVUeXBlIiwgbnVsbCwgMCwgMSwgWG1sRW1iZWRkZWRfMl8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sRW1iZWRkZWRJZF8yXzFFQ2xhc3MsIFhtbEVtYmVkZGVkSWRfMl8xLmNsYXNzLCAiWG1sRW1iZWRkZWRJZF8yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbWJlZGRlZElkXzJfMV9BdHRyaWJ1dGVUeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXR0cmlidXRlVHlwZSIsIG51bGwsIDAsIDEsIFhtbEVtYmVkZGVkSWRfMl8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sRW50aXR5XzJfMUVDbGFzcywgWG1sRW50aXR5XzJfMS5jbGFzcywgIlhtbEVudGl0eV8yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfMl8xX0NsYXNzRXh0cmFjdG9yKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQ2xhc3NSZWZlcmVuY2UoKSwgbnVsbCwgImNsYXNzRXh0cmFjdG9yIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5XzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5XzJfMV9QYXJlbnRDbGFzcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBhcmVudENsYXNzIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5XzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVudGl0eU1hcHBpbmdzXzJfMUVDbGFzcywgWG1sRW50aXR5TWFwcGluZ3NfMl8xLmNsYXNzLCAiWG1sRW50aXR5TWFwcGluZ3NfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEZldGNoQXR0cmlidXRlXzJfMUVDbGFzcywgWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xLmNsYXNzLCAiWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxGZXRjaEF0dHJpYnV0ZV8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxGZXRjaEdyb3VwXzJfMUVDbGFzcywgWG1sRmV0Y2hHcm91cF8yXzEuY2xhc3MsICJYbWxGZXRjaEdyb3VwXzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEZldGNoR3JvdXBfMl8xX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxGZXRjaEdyb3VwXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTG9hZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJsb2FkIiwgbnVsbCwgMCwgMSwgWG1sRmV0Y2hHcm91cF8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEZldGNoR3JvdXBfMl8xX0F0dHJpYnV0ZXMoKSwgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbEZldGNoQXR0cmlidXRlKCksIG51bGwsICJhdHRyaWJ1dGVzIiwgbnVsbCwgMCwgLTEsIFhtbEZldGNoR3JvdXBfMl8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzFFQ2xhc3MsIFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xLmNsYXNzLCAiWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMV9GZXRjaEdyb3VwcygpLCB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sRmV0Y2hHcm91cCgpLCBudWxsLCAiZmV0Y2hHcm91cHMiLCBudWxsLCAwLCAtMSwgWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxJZF8yXzFFQ2xhc3MsIFhtbElkXzJfMS5jbGFzcywgIlhtbElkXzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbElkXzJfMV9BdHRyaWJ1dGVUeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXR0cmlidXRlVHlwZSIsIG51bGwsIDAsIDEsIFhtbElkXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb01hbnlfMl8xRUNsYXNzLCBYbWxNYW55VG9NYW55XzJfMS5jbGFzcywgIlhtbE1hbnlUb01hbnlfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTWFueVRvTWFueV8yXzFfQXR0cmlidXRlVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImF0dHJpYnV0ZVR5cGUiLCBudWxsLCAwLCAxLCBYbWxNYW55VG9NYW55XzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb09uZV8yXzFFQ2xhc3MsIFhtbE1hbnlUb09uZV8yXzEuY2xhc3MsICJYbWxNYW55VG9PbmVfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xRUNsYXNzLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMS5jbGFzcywgIlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfU3FsUmVzdWx0U2V0TWFwcGluZ3MoKSwgdGhlT3JtUGFja2FnZS5nZXRTcWxSZXN1bHRTZXRNYXBwaW5nKCksIG51bGwsICJzcWxSZXN1bHRTZXRNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfUXVlcnlSZWRpcmVjdG9ycygpLCB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9ycygpLCBudWxsLCAicXVlcnlSZWRpcmVjdG9ycyIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9QYXJlbnRDbGFzcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBhcmVudENsYXNzIiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPbmVUb01hbnlfMl8xRUNsYXNzLCBYbWxPbmVUb01hbnlfMl8xLmNsYXNzLCAiWG1sT25lVG9NYW55XzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE9uZVRvTWFueV8yXzFfQXR0cmlidXRlVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImF0dHJpYnV0ZVR5cGUiLCBudWxsLCAwLCAxLCBYbWxPbmVUb01hbnlfMl8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sT25lVG9PbmVfMl8xRUNsYXNzLCBYbWxPbmVUb09uZV8yXzEuY2xhc3MsICJYbWxPbmVUb09uZV8yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xRUNsYXNzLCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sUHJpbWFyeUtleV8yXzFFQ2xhc3MsIFhtbFByaW1hcnlLZXlfMl8xLmNsYXNzLCAiWG1sUHJpbWFyeUtleV8yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQcmltYXJ5S2V5XzJfMV9DYWNoZUtleVR5cGUoKSwgdGhpcy5nZXRDYWNoZUtleVR5cGVfMl8xKCksICJjYWNoZUtleVR5cGUiLCBudWxsLCAwLCAxLCBYbWxQcmltYXJ5S2V5XzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFJldHVybkluc2VydF8yXzFFQ2xhc3MsIFhtbFJldHVybkluc2VydF8yXzEuY2xhc3MsICJYbWxSZXR1cm5JbnNlcnRfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUmV0dXJuSW5zZXJ0XzJfMV9SZXR1cm5Pbmx5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgInJldHVybk9ubHkiLCBudWxsLCAwLCAxLCBYbWxSZXR1cm5JbnNlcnRfMl8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sVHJhbnNmb3JtYXRpb25fMl8xRUNsYXNzLCBYbWxUcmFuc2Zvcm1hdGlvbl8yXzEuY2xhc3MsICJYbWxUcmFuc2Zvcm1hdGlvbl8yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxUcmFuc2Zvcm1hdGlvbl8yXzFfQXR0cmlidXRlVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImF0dHJpYnV0ZVR5cGUiLCBudWxsLCAwLCAxLCBYbWxUcmFuc2Zvcm1hdGlvbl8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxWZXJzaW9uXzJfMUVDbGFzcywgWG1sVmVyc2lvbl8yXzEuY2xhc3MsICJYbWxWZXJzaW9uXzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFZlcnNpb25fMl8xX0F0dHJpYnV0ZVR5cGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhdHRyaWJ1dGVUeXBlIiwgbnVsbCwgMCwgMSwgWG1sVmVyc2lvbl8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGNhY2hlS2V5VHlwZV8yXzFFRW51bSwgQ2FjaGVLZXlUeXBlXzJfMS5jbGFzcywgIkNhY2hlS2V5VHlwZV8yXzEiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlS2V5VHlwZV8yXzFFRW51bSwgQ2FjaGVLZXlUeXBlXzJfMS5JRF9WQUxVRSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChjYWNoZUtleVR5cGVfMl8xRUVudW0sIENhY2hlS2V5VHlwZV8yXzEuQ0FDSEVfS0VZKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlS2V5VHlwZV8yXzFFRW51bSwgQ2FjaGVLZXlUeXBlXzJfMS5BVVRPKTsKLQotCQlpbml0RUVudW0oYmF0Y2hGZXRjaFR5cGVfMl8xRUVudW0sIEJhdGNoRmV0Y2hUeXBlXzJfMS5jbGFzcywgIkJhdGNoRmV0Y2hUeXBlXzJfMSIpOwotCQlhZGRFRW51bUxpdGVyYWwoYmF0Y2hGZXRjaFR5cGVfMl8xRUVudW0sIEJhdGNoRmV0Y2hUeXBlXzJfMS5KT0lOKTsKLQkJYWRkRUVudW1MaXRlcmFsKGJhdGNoRmV0Y2hUeXBlXzJfMUVFbnVtLCBCYXRjaEZldGNoVHlwZV8yXzEuRVhJU1RTKTsKLQkJYWRkRUVudW1MaXRlcmFsKGJhdGNoRmV0Y2hUeXBlXzJfMUVFbnVtLCBCYXRjaEZldGNoVHlwZV8yXzEuSU4pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKLQl7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xIDxlbT5YbWwgQmFzaWMgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEJhc2ljXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVNJQ18yMSA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY18yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldHVybiBJbnNlcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9CQVNJQ18yMV9fUkVUVVJOX0lOU0VSVCA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY18yXzFfUmV0dXJuSW5zZXJ0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXR1cm4gVXBkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQkFTSUNfMjFfX1JFVFVSTl9VUERBVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfMl8xX1JldHVyblVwZGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVNJQ18yMV9fQVRUUklCVVRFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfMl8xX0F0dHJpYnV0ZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhdGNoRmV0Y2hfMl8xIDxlbT5YbWwgQmF0Y2ggRmV0Y2ggMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaF8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFUQ0hfRkVUQ0hfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sQmF0Y2hGZXRjaF8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVRDSF9GRVRDSF8yMV9fU0laRSA9IGVJTlNUQU5DRS5nZXRYbWxCYXRjaEZldGNoXzJfMV9TaXplKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQkFUQ0hfRkVUQ0hfMjFfX0JBVENIX0ZFVENIX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQmF0Y2hGZXRjaF8yXzFfQmF0Y2hGZXRjaFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMSA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIxX19BVFRSSUJVVEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzFfQXR0cmlidXRlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkYWJsZV8yXzEgPGVtPlhtbCBFbWJlZGRhYmxlIDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkYWJsZV8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVtYmVkZGFibGVfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VNQkVEREFCTEVfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkXzJfMSA8ZW0+WG1sIEVtYmVkZGVkIDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbWJlZGRlZF8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU1CRURERURfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWRfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VNQkVEREVEXzIxX19BVFRSSUJVVEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRlZF8yXzFfQXR0cmlidXRlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRJZF8yXzEgPGVtPlhtbCBFbWJlZGRlZCBJZCAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkSWRfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbWJlZGRlZElkXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTUJFRERFRF9JRF8yMSA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRlZElkXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTUJFRERFRF9JRF8yMV9fQVRUUklCVVRFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWRJZF8yXzFfQXR0cmlidXRlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5XzJfMSA8ZW0+WG1sIEVudGl0eSAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVudGl0eV8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU5USVRZXzIxID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIEV4dHJhY3RvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV8yMV9fQ0xBU1NfRVhUUkFDVE9SID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzFfQ2xhc3NFeHRyYWN0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV8yMV9fUEFSRU5UX0NMQVNTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzFfUGFyZW50Q2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eU1hcHBpbmdzXzJfMSA8ZW0+WG1sIEVudGl0eSBNYXBwaW5ncyAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eU1hcHBpbmdzXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VOVElUWV9NQVBQSU5HU18yMSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoQXR0cmlidXRlXzJfMSA8ZW0+WG1sIEZldGNoIEF0dHJpYnV0ZSAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoQXR0cmlidXRlXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0ZFVENIX0FUVFJJQlVURV8yMSA9IGVJTlNUQU5DRS5nZXRYbWxGZXRjaEF0dHJpYnV0ZV8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9GRVRDSF9BVFRSSUJVVEVfMjFfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xIDxlbT5YbWwgRmV0Y2ggR3JvdXAgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRkVUQ0hfR1JPVVBfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9GRVRDSF9HUk9VUF8yMV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxGZXRjaEdyb3VwXzJfMV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9GRVRDSF9HUk9VUF8yMV9fQVRUUklCVVRFUyA9IGVJTlNUQU5DRS5nZXRYbWxGZXRjaEdyb3VwXzJfMV9BdHRyaWJ1dGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2FkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRkVUQ0hfR1JPVVBfMjFfX0xPQUQgPSBlSU5TVEFOQ0UuZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTG9hZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEgPGVtPlhtbCBGZXRjaCBHcm91cCBDb250YWluZXIgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRkVUQ0hfR1JPVVBfQ09OVEFJTkVSXzIxID0gZUlOU1RBTkNFLmdldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GZXRjaCBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0ZFVENIX0dST1VQX0NPTlRBSU5FUl8yMV9fRkVUQ0hfR1JPVVBTID0gZUlOU1RBTkNFLmdldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xX0ZldGNoR3JvdXBzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxJZF8yXzEgPGVtPlhtbCBJZCAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbElkXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sSWRfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0lEXzIxID0gZUlOU1RBTkNFLmdldFhtbElkXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9JRF8yMV9fQVRUUklCVVRFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sSWRfMl8xX0F0dHJpYnV0ZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb01hbnlfMl8xIDxlbT5YbWwgTWFueSBUbyBNYW55IDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvTWFueV8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BTllfVE9fTUFOWV8yMSA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55XzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9NQU5ZX1RPX01BTllfMjFfX0FUVFJJQlVURV9UWVBFID0gZUlOU1RBTkNFLmdldFhtbE1hbnlUb01hbnlfMl8xX0F0dHJpYnV0ZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb09uZV8yXzEgPGVtPlhtbCBNYW55IFRvIE9uZSAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb09uZV8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE1hbnlUb09uZV8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFOWV9UT19PTkVfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvT25lXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEgPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9TcWxSZXN1bHRTZXRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UXVlcnkgUmVkaXJlY3RvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fUVVFUllfUkVESVJFQ1RPUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfUXVlcnlSZWRpcmVjdG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyZW50IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1BBUkVOVF9DTEFTUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9QYXJlbnRDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9NYW55XzJfMSA8ZW0+WG1sIE9uZSBUbyBNYW55IDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9NYW55XzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fTUFOWV8yMSA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX09ORV9UT19NQU5ZXzIxX19BVFRSSUJVVEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8xX0F0dHJpYnV0ZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE9uZVRvT25lXzJfMSA8ZW0+WG1sIE9uZSBUbyBPbmUgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb09uZV8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE9uZVRvT25lXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fT05FXzIxID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvT25lXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0cyAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxSZXR1cm5JbnNlcnRfMl8xIDxlbT5YbWwgUmV0dXJuIEluc2VydCAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFJldHVybkluc2VydF8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFJldHVybkluc2VydF8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUkVUVVJOX0lOU0VSVF8yMSA9IGVJTlNUQU5DRS5nZXRYbWxSZXR1cm5JbnNlcnRfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXR1cm4gT25seTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1JFVFVSTl9JTlNFUlRfMjFfX1JFVFVSTl9PTkxZID0gZUlOU1RBTkNFLmdldFhtbFJldHVybkluc2VydF8yXzFfUmV0dXJuT25seSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVHJhbnNmb3JtYXRpb25fMl8xIDxlbT5YbWwgVHJhbnNmb3JtYXRpb24gMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxUcmFuc2Zvcm1hdGlvbl8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFRyYW5zZm9ybWF0aW9uXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9UUkFOU0ZPUk1BVElPTl8yMSA9IGVJTlNUQU5DRS5nZXRYbWxUcmFuc2Zvcm1hdGlvbl8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVFJBTlNGT1JNQVRJT05fMjFfX0FUVFJJQlVURV9UWVBFID0gZUlOU1RBTkNFLmdldFhtbFRyYW5zZm9ybWF0aW9uXzJfMV9BdHRyaWJ1dGVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxWZXJzaW9uXzJfMSA8ZW0+WG1sIFZlcnNpb24gMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxWZXJzaW9uXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sVmVyc2lvbl8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVkVSU0lPTl8yMSA9IGVJTlNUQU5DRS5nZXRYbWxWZXJzaW9uXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9WRVJTSU9OXzIxX19BVFRSSUJVVEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxWZXJzaW9uXzJfMV9BdHRyaWJ1dGVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxQcmltYXJ5S2V5XzJfMSA8ZW0+WG1sIFByaW1hcnkgS2V5IDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUHJpbWFyeUtleV8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFByaW1hcnlLZXlfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BSSU1BUllfS0VZXzIxID0gZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBLZXkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BSSU1BUllfS0VZXzIxX19DQUNIRV9LRVlfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5XzJfMV9DYWNoZUtleVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzEgPGVtPkNhY2hlIEtleSBUeXBlIDIxPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5DYWNoZUtleVR5cGVfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRDYWNoZUtleVR5cGVfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBDQUNIRV9LRVlfVFlQRV8yMSA9IGVJTlNUQU5DRS5nZXRDYWNoZUtleVR5cGVfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5CYXRjaEZldGNoVHlwZV8yXzEgPGVtPkJhdGNoIEZldGNoIFR5cGUgMjE8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0QmF0Y2hGZXRjaFR5cGVfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBCQVRDSF9GRVRDSF9UWVBFXzIxID0gZUlOU1RBTkNFLmdldEJhdGNoRmV0Y2hUeXBlXzJfMSgpOwotCi0JfQotCi19IC8vRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEJhc2ljXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEJhc2ljXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDliMzc0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxCYXNpY18yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJldHVybkluc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBCYXNpYyAyMTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEjZ2V0UmV0dXJuSW5zZXJ0IDxlbT5SZXR1cm4gSW5zZXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEjZ2V0UmV0dXJuVXBkYXRlIDxlbT5SZXR1cm4gVXBkYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sQmFzaWNfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxCYXNpY18yXzEgZXh0ZW5kcyBYbWxCYXNpY18xXzEKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXR1cm4gSW5zZXJ0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXR1cm4gSW5zZXJ0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybiBJbnNlcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJldHVybkluc2VydChYbWxSZXR1cm5JbnNlcnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEJhc2ljXzJfMV9SZXR1cm5JbnNlcnQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sUmV0dXJuSW5zZXJ0IGdldFJldHVybkluc2VydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xI2dldFJldHVybkluc2VydCA8ZW0+UmV0dXJuIEluc2VydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIEluc2VydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmV0dXJuSW5zZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXR1cm5JbnNlcnQoWG1sUmV0dXJuSW5zZXJ0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldHVybiBVcGRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldHVybiBVcGRhdGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmV0dXJuVXBkYXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEJhc2ljXzJfMV9SZXR1cm5VcGRhdGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0UmV0dXJuVXBkYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEjZ2V0UmV0dXJuVXBkYXRlIDxlbT5SZXR1cm4gVXBkYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXR1cm4gVXBkYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXR1cm5VcGRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJldHVyblVwZGF0ZShCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEJhc2ljXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sQmFzaWNfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sQmF0Y2hGZXRjaF8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxCYXRjaEZldGNoXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzY1ZjkyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxCYXRjaEZldGNoXzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmF0Y2ggRmV0Y2ggMjE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmF0Y2hGZXRjaF8yXzEjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmF0Y2hGZXRjaF8yXzEjZ2V0QmF0Y2hGZXRjaFR5cGUgPGVtPkJhdGNoIEZldGNoIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaF8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEJhdGNoRmV0Y2hfMl8xIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2l6ZShJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoXzJfMV9TaXplKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUludGVnZXIgZ2V0U2l6ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmF0Y2hGZXRjaF8yXzEjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2l6ZShJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5CYXRjaEZldGNoVHlwZV8yXzF9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2ggVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMQotCSAqIEBzZWUgI3NldEJhdGNoRmV0Y2hUeXBlKEJhdGNoRmV0Y2hUeXBlXzJfMSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaF8yXzFfQmF0Y2hGZXRjaFR5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCYXRjaEZldGNoVHlwZV8yXzEgZ2V0QmF0Y2hGZXRjaFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhdGNoRmV0Y2hfMl8xI2dldEJhdGNoRmV0Y2hUeXBlIDxlbT5CYXRjaCBGZXRjaCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMQotCSAqIEBzZWUgI2dldEJhdGNoRmV0Y2hUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCYXRjaEZldGNoVHlwZShCYXRjaEZldGNoVHlwZV8yXzEgdmFsdWUpOwotCi19IC8vIFhtbEJhdGNoRmV0Y2hfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOGRjOWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2g7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xIGV4dGVuZHMgWG1sSm9pbkZldGNoLCBYbWxCYXRjaEZldGNoSG9sZGVyCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8xX0F0dHJpYnV0ZVR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxFbWJlZGRhYmxlXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVtYmVkZGFibGVfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNTFlMzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVtYmVkZGFibGVfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbWJlZGRhYmxlIDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZV8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVtYmVkZGFibGVfMl8xIGV4dGVuZHMgWG1sQWNjZXNzTWV0aG9kc0hvbGRlcgotewotfSAvLyBYbWxFbWJlZGRhYmxlXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVtYmVkZGVkSWRfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRW1iZWRkZWRJZF8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzOGM1Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRW1iZWRkZWRJZF8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVtYmVkZGVkIElkIDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkSWRfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVtYmVkZGVkSWRfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbWJlZGRlZElkXzJfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbWJlZGRlZElkXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbWJlZGRlZElkXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxFbWJlZGRlZElkXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVtYmVkZGVkXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVtYmVkZGVkXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmQ5OTZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxFbWJlZGRlZF8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVtYmVkZGVkIDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbWJlZGRlZF8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVtYmVkZGVkXzJfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbWJlZGRlZF8yXzFfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbEVtYmVkZGVkXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVudGl0eU1hcHBpbmdzXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVudGl0eU1hcHBpbmdzXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGJkMzdiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxFbnRpdHlNYXBwaW5nc18yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVudGl0eSBNYXBwaW5ncyAyMTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRW50aXR5TWFwcGluZ3NfMl8xIGV4dGVuZHMgWG1sQWNjZXNzTWV0aG9kc0hvbGRlcgotewotfSAvLyBYbWxFbnRpdHlNYXBwaW5nc18yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxFbnRpdHlfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRW50aXR5XzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjhmMWI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxFbnRpdHlfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW50aXR5IDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEjZ2V0Q2xhc3NFeHRyYWN0b3IgPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5XzJfMSNnZXRQYXJlbnRDbGFzcyA8ZW0+UGFyZW50IENsYXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVudGl0eV8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVudGl0eV8yXzEgZXh0ZW5kcyBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLCBYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMQotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsYXNzIEV4dHJhY3RvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3MgRXh0cmFjdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2xhc3NFeHRyYWN0b3IoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVudGl0eV8yXzFfQ2xhc3NFeHRyYWN0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQ2xhc3NSZWZlcmVuY2UgZ2V0Q2xhc3NFeHRyYWN0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEjZ2V0Q2xhc3NFeHRyYWN0b3IgPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgRXh0cmFjdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDbGFzc0V4dHJhY3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2xhc3NFeHRyYWN0b3IoWG1sQ2xhc3NSZWZlcmVuY2UgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyZW50IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJlbnQgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJlbnRDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVudGl0eV8yXzFfUGFyZW50Q2xhc3MoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBhcmVudENsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlfMl8xI2dldFBhcmVudENsYXNzIDxlbT5QYXJlbnQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcmVudENsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sRW50aXR5XzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEZldGNoQXR0cmlidXRlXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEZldGNoQXR0cmlidXRlXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2RlY2Y5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxGZXRjaEF0dHJpYnV0ZV8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEZldGNoIEF0dHJpYnV0ZSAyMTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEF0dHJpYnV0ZV8yXzEjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxGZXRjaEF0dHJpYnV0ZV8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEZldGNoQXR0cmlidXRlXzJfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxGZXRjaEF0dHJpYnV0ZV8yXzFfTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEF0dHJpYnV0ZV8yXzEjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbEZldGNoQXR0cmlidXRlXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEZldGNoR3JvdXBDb250YWluZXJfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViNjhiNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBGZXRjaCBHcm91cCBDb250YWluZXIgMjE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEjZ2V0RmV0Y2hHcm91cHMgPGVtPkZldGNoIEdyb3VwczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmV0Y2ggR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmV0Y2ggR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2ggR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMV9GZXRjaEdyb3VwcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxGZXRjaEdyb3VwPiBnZXRGZXRjaEdyb3VwcygpOwotCi19IC8vIFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRmV0Y2hHcm91cF8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxGZXRjaEdyb3VwXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDg2ZDgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxGZXRjaEdyb3VwXzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoQXR0cmlidXRlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRmV0Y2ggR3JvdXAgMjE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEjZ2V0TG9hZCA8ZW0+TG9hZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEjZ2V0QXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwXzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRmV0Y2hHcm91cF8yXzEgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwXzJfMSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoQXR0cmlidXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwXzJfMV9BdHRyaWJ1dGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbEZldGNoQXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2FkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2FkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvYWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvYWQoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTG9hZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRMb2FkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwXzJfMSNnZXRMb2FkIDxlbT5Mb2FkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2FkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2FkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2FkKEJvb2xlYW4gdmFsdWUpOwotCi19IC8vIFhtbEZldGNoR3JvdXBfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sSWRfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sSWRfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYjJiNDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbElkXzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgSWQgMjE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sSWRfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbElkXzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSWRfMl8xIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbElkXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxJZF8yXzEjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sSWRfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sTWFueVRvTWFueV8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxNYW55VG9NYW55XzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTFiNWMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxNYW55VG9NYW55XzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFueSBUbyBNYW55IDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb01hbnlfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNYW55VG9NYW55XzJfMSBleHRlbmRzIFhtbEJhdGNoRmV0Y2hIb2xkZXIKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYW55VG9NYW55XzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxNYW55VG9NYW55XzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbE1hbnlUb09uZV8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxNYW55VG9PbmVfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMDcxOGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbE1hbnlUb09uZV8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaEhvbGRlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hbnkgVG8gT25lIDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sTWFueVRvT25lXzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTWFueVRvT25lXzJfMSBleHRlbmRzIFhtbEJhdGNoRmV0Y2hIb2xkZXIKLXsKLX0gLy8gWG1sTWFueVRvT25lXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzZDFkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5TcWxSZXN1bHRTZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9yczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xI2dldFNxbFJlc3VsdFNldE1hcHBpbmdzIDxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEjZ2V0UXVlcnlSZWRpcmVjdG9ycyA8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xI2dldFBhcmVudENsYXNzIDxlbT5QYXJlbnQgQ2xhc3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xIGV4dGVuZHMgWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciwgWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIsIFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xLCBYbWxHZW5lcmF0b3JDb250YWluZXIsIFhtbFF1ZXJ5Q29udGFpbmVyLCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIsIFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5TcWxSZXN1bHRTZXRNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xX1NxbFJlc3VsdFNldE1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFNxbFJlc3VsdFNldE1hcHBpbmc+IGdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RdWVyeSBSZWRpcmVjdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFF1ZXJ5UmVkaXJlY3RvcnMoWG1sUXVlcnlSZWRpcmVjdG9ycykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfUXVlcnlSZWRpcmVjdG9ycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxRdWVyeVJlZGlyZWN0b3JzIGdldFF1ZXJ5UmVkaXJlY3RvcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xI2dldFF1ZXJ5UmVkaXJlY3RvcnMgPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UXVlcnlSZWRpcmVjdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UXVlcnlSZWRpcmVjdG9ycyhYbWxRdWVyeVJlZGlyZWN0b3JzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyZW50Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9QYXJlbnRDbGFzcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGFyZW50Q2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xI2dldFBhcmVudENsYXNzIDxlbT5QYXJlbnQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcmVudENsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxPbmVUb01hbnlfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sT25lVG9NYW55XzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTg5YmRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxPbmVUb01hbnlfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2hIb2xkZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPbmUgVG8gTWFueSAyMTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb01hbnlfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE9uZVRvTWFueV8yXzEgZXh0ZW5kcyBYbWxCYXRjaEZldGNoSG9sZGVyCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb01hbnlfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbE9uZVRvTWFueV8yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxPbmVUb09uZV8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxPbmVUb09uZV8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyYTE2MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sT25lVG9PbmVfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2hIb2xkZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPbmUgVG8gT25lIDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sT25lVG9PbmVfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxPbmVUb09uZV8yXzEgZXh0ZW5kcyBYbWxCYXRjaEZldGNoSG9sZGVyCi17Ci19IC8vIFhtbE9uZVRvT25lXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2VkMDRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSBleHRlbmRzIFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIKLXsKLX0gLy8gWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sUHJpbWFyeUtleV8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxQcmltYXJ5S2V5XzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM3MjQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxQcmltYXJ5S2V5XzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUHJpbWFyeSBLZXkgMjE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUHJpbWFyeUtleV8yXzEjZ2V0Q2FjaGVLZXlUeXBlIDxlbT5DYWNoZSBLZXkgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5XzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUHJpbWFyeUtleV8yXzEgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FjaGUgS2V5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5DYWNoZUtleVR5cGVfMl8xfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhY2hlIEtleSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEtleSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzEKLQkgKiBAc2VlICNzZXRDYWNoZUtleVR5cGUoQ2FjaGVLZXlUeXBlXzJfMSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleV8yXzFfQ2FjaGVLZXlUeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2FjaGVLZXlUeXBlXzJfMSBnZXRDYWNoZUtleVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFByaW1hcnlLZXlfMl8xI2dldENhY2hlS2V5VHlwZSA8ZW0+Q2FjaGUgS2V5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEtleSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzEKLQkgKiBAc2VlICNnZXRDYWNoZUtleVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhY2hlS2V5VHlwZShDYWNoZUtleVR5cGVfMl8xIHZhbHVlKTsKLQotfSAvLyBYbWxQcmltYXJ5S2V5XzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbFJldHVybkluc2VydF8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxSZXR1cm5JbnNlcnRfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YjQzZmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbFJldHVybkluc2VydF8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFJldHVybiBJbnNlcnQgMjE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUmV0dXJuSW5zZXJ0XzJfMSNnZXRSZXR1cm5Pbmx5IDxlbT5SZXR1cm4gT25seTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxSZXR1cm5JbnNlcnRfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxSZXR1cm5JbnNlcnRfMl8xIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldHVybiBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXR1cm4gT25seTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXR1cm4gT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmV0dXJuT25seShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxSZXR1cm5JbnNlcnRfMl8xX1JldHVybk9ubHkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0UmV0dXJuT25seSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUmV0dXJuSW5zZXJ0XzJfMSNnZXRSZXR1cm5Pbmx5IDxlbT5SZXR1cm4gT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJldHVybk9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJldHVybk9ubHkoQm9vbGVhbiB2YWx1ZSk7Ci0KLX0gLy8gWG1sUmV0dXJuSW5zZXJ0XzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbFRyYW5zZm9ybWF0aW9uXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbFRyYW5zZm9ybWF0aW9uXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjc4MTkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxUcmFuc2Zvcm1hdGlvbl8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFRyYW5zZm9ybWF0aW9uIDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFRyYW5zZm9ybWF0aW9uXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxUcmFuc2Zvcm1hdGlvbl8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFRyYW5zZm9ybWF0aW9uXzJfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxUcmFuc2Zvcm1hdGlvbl8yXzFfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVHJhbnNmb3JtYXRpb25fMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFRyYW5zZm9ybWF0aW9uXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbFZlcnNpb25fMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sVmVyc2lvbl8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM1MTY1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sVmVyc2lvbl8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFZlcnNpb24gMjE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVmVyc2lvbl8yXzEjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sVmVyc2lvbl8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFZlcnNpb25fMl8xIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFZlcnNpb25fMl8xX0F0dHJpYnV0ZVR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFZlcnNpb25fMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFZlcnNpb25fMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L0VjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L0VjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YWQ3YWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wCi0JZXh0ZW5kcyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAKLXsKLQotCUVjbGlwc2VMaW5rSm9pbkZldGNoIGdldEpvaW5GZXRjaCgpOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS92Ml8wL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NDMzMDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wIAotCWV4dGVuZHMgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nLCBPbmVUb01hbnlNYXBwaW5nMl8wCi17Ci0JRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYmY3OWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOwotCi0KLS8qKgotICogUmVwcmVzZW50cyB0aGUge0BsaW5rIFJlbGF0aW9uc2hpcFJlZmVyZW5jZX0gb2YgYW4gCi0gKiB7QGxpbmsgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nfQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAKLQlleHRlbmRzIAotCQlFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwKLQkJT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wCi17Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOTQ3MTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzAKLQlleHRlbmRzIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLCBPbmVUb09uZU1hcHBpbmcyXzAKLXt9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRjMGFmYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLQotLyoqCi0gKiAgQ29ubmVjdGlvbjJfMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb24yXzAgZXh0ZW5kcyBDb25uZWN0aW9uLCBKcGFDb25uZWN0aW9uMl8wCi17Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE4NTA0YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmdMZXZlbDsKLS8qKgotICogIExvZ2dpbmcyXzAKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2dnaW5nMl8wIGV4dGVuZHMgTG9nZ2luZwotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX1BSRUZJWF8gPSAiZWNsaXBzZWxpbmsubG9nZ2luZy5sZXZlbC4iOyAvLyROT04tTkxTLTEkCi0KLQlCb29sZWFuIGdldERlZmF1bHRDb25uZWN0aW9uKCk7Ci0JQm9vbGVhbiBnZXRDb25uZWN0aW9uKCk7Ci0Jdm9pZCBzZXRDb25uZWN0aW9uKEJvb2xlYW4gY29ubmVjdGlvbik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9QUk9QRVJUWSA9ICJjb25uZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ09OTkVDVElPTiA9ICJlY2xpcHNlbGluay5sb2dnaW5nLmNvbm5lY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfQ09OTkVDVElPTiA9IEJvb2xlYW4uVFJVRTsKLQkJCi0JTG9nZ2luZ0xldmVsIGdldENhdGVnb3JpZXNEZWZhdWx0TGV2ZWwoKTsKLQlMb2dnaW5nTGV2ZWwgZ2V0TGV2ZWwoU3RyaW5nIGNhdGVnb3J5KTsKLQl2b2lkIHNldExldmVsKFN0cmluZyBjYXRlZ29yeSwgTG9nZ2luZ0xldmVsIGxldmVsKTsKLQl2b2lkIHNldERlZmF1bHRMZXZlbChMb2dnaW5nTGV2ZWwgbGV2ZWwpOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUklFU19ERUZBVUxUX0xPR0dJTkdfUFJPUEVSVFkgPSAiY2F0ZWdvcmllc0RlZmF1bHRMb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTUUxfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSA9ICJzcWxMb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU1FMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwgPSBDQVRFR09SWV9QUkVGSVhfICsgInNxbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0FDVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZID0gInRyYW5zYWN0aW9uTG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1RSQU5TQUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwgPSBDQVRFR09SWV9QUkVGSVhfICsgInRyYW5zYWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkgPSAiZXZlbnRMb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRVZFTlRfQ0FURUdPUllfTE9HR0lOR19MRVZFTCA9IENBVEVHT1JZX1BSRUZJWF8gKyAiZXZlbnQiOyAvLyROT04tTkxTLTEkCi0JCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZID0gImNvbm5lY3Rpb25Mb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ09OTkVDVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMID0gQ0FURUdPUllfUFJFRklYXyArICJjb25uZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkgPSAicXVlcnlMb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUVVFUllfQ0FURUdPUllfTE9HR0lOR19MRVZFTCA9IENBVEVHT1JZX1BSRUZJWF8gKyAicXVlcnkiOyAvLyROT04tTkxTLTEkCi0JCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSA9ICJjYWNoZUxvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DQUNIRV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMID0gQ0FURUdPUllfUFJFRklYXyArICJjYWNoZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QQUdBVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZID0gInByb3BhZ2F0aW9uTG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1BST1BBR0FUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwgPSBDQVRFR09SWV9QUkVGSVhfICsgInByb3BhZ2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSA9ICJzZXF1ZW5jaW5nTG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19MRVZFTCA9IENBVEVHT1JZX1BSRUZJWF8gKyAic2VxdWVuY2luZyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSA9ICJlamJMb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRUpCX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwgPSBDQVRFR09SWV9QUkVGSVhfICsgImVqYiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBETVNfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSA9ICJkbXNMb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRE1TX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwgPSBDQVRFR09SWV9QUkVGSVhfICsgImRtcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSA9ICJlamJfb3JfbWV0YWRhdGFMb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRUpCX09SX01FVEFEQVRBX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwgPSBDQVRFR09SWV9QUkVGSVhfICsgImVqYl9vcl9tZXRhZGF0YSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBTU9ERUxfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSA9ICJqcGFfbWV0YW1vZGVsTG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX01FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMID0gQ0FURUdPUllfUFJFRklYXyArICJqcGFfbWV0YW1vZGVsIjsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVkVSX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkgPSAid2VhdmVyTG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1dFQVZFUl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMID0gQ0FURUdPUllfUFJFRklYXyArICJ3ZWF2ZXIiOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkgPSAicHJvcGVydGllc0xvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19QUk9QRVJUSUVTX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwgPSBDQVRFR09SWV9QUkVGSVhfICsgInByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSA9ICJzZXJ2ZXJMb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0VSVkVSX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwgPSBDQVRFR09SWV9QUkVGSVhfICsgInNlcnZlciI7IC8vJE5PTi1OTFMtMSQKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9PcHRpb25zMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvT3B0aW9uczJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDJmN2MyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9PcHRpb25zMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5KcGFPcHRpb25zMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOwotCi0vKioKLSAqICBPcHRpb25zMl8wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3B0aW9uczJfMCBleHRlbmRzIE9wdGlvbnMsIEpwYU9wdGlvbnMyXzAKLXsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGluazJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGluazJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjg3ZGJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS92Ml8wL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmsyXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIEphdmEtcmVsYXRlZCBzdHVmZiAoYW5ub3RhdGlvbnMgZXRjLikKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmsyXzEgewotCi0JLy8gRWNsaXBzZUxpbmsgcGFja2FnZQotCVN0cmluZyBQQUNLQUdFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQQUNLQUdFXyA9IFBBQ0tBR0UgKyAiLiI7Ci0KLQotCS8vICoqKioqKioqKiogQVBJICoqKioqKioqKioKLQotCS8vIEVjbGlzcGVMaW5rIDIuMSBhbm5vdGF0aW9ucwotCVN0cmluZyBDTEFTU19FWFRSQUNUT1IgPSBQQUNLQUdFXyArICJDbGFzc0V4dHJhY3RvciI7Ci0JCVN0cmluZyBDTEFTU19FWFRSQUNUT1JfX1ZBTFVFID0gInZhbHVlIjsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODBkYThmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS92Ml8wL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMQotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluazJfMS5DTEFTU19FWFRSQUNUT1I7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBDbGFzc0V4dHJhY3RvciBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSBwcmVjZWRpbmcgIi5jbGFzcyIuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtDbGFzc0V4dHJhY3Rvcih2YWx1ZT1NeUV4dHJhY3Rvci5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAiTXlFeHRyYWN0b3IiCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIENsYXNzRXh0cmFjdG9yIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqIFRoaXMgd2lsbCBhbHNvIHJlbW92ZSB0aGUgQ2xhc3NFeHRyYWN0b3IgYW5ub3RhdGlvbiBpdHNlbGYuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIENsYXNzRXh0cmFjdG9yIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIENsYXNzRXh0cmFjdG9yIG5hbWUgYXMgcmVzb2x2ZWQgYnkgdGhlIEFTVCdzIGJpbmRpbmdzLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7Q2xhc3NFeHRyYWN0b3IoTXlFeHRyYWN0b3IuY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gIm1vZGVsLk15RXh0cmFjdG9yIiBpZiB0aGVyZSBpcyBhbiBpbXBvcnQgZm9yIG1vZGVsLk15RXh0cmFjdG9yLgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpOwotCQlTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0NMQVNTX05BTUVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmpheGIuY29yZS5zY2hlbWFnZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OGUyMWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmpheGIuY29yZS5zY2hlbWFnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXhiLmNvcmUuc2NoZW1hZ2VuPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4gYW5kIG1vdmVkIHRvIGpheGIgY29tcG9uZW50PC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2YwNzk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L3VpLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlNjQ0Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTcyYmUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkYjJiMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAwNyAxNDoyNjo1OSBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRkNGMzNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIEZlYiAyNCAyMToyNzowMSBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NTQ2ZjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjQuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5KcHRFY2xpcHNlTGlua1VpUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmRiO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZGxnZW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGRsZ2VuLndpemFyZHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZ2VuZXJhbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2V4bWwuZGV0YWlsczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLnBsYXRmb3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzIuZGV0YWlscy5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzIuZGV0YWlscy5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMi5wbGF0Zm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRkbGdlbi53aXphcmRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlsczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMub3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5jYWNoaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UubG9nZ2luZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLm9wdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wbGF0Zm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8xLnBsYXRmb3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHM7eC1pbnRlcm5hbDo9dHJ1ZQotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnRleHQ7dmVyc2lvbj0iNC4wLjEiCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxM2EyZTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlID0gMS41Ci1qYXZhY1RhcmdldCA9IDEuNQotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4YTgyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXBsdWdpbk5hbWU9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgLSBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLWVjbGlwc2VMaW5rV2l6YXJkQ2F0ZWdvcnlOYW1lPUVjbGlwc2VMaW5rCi1uZXdFY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkTmFtZT1FY2xpcHNlTGluayBPUk0gTWFwcGluZyBGaWxlCi1uZXdFY2xpcHNlTGlua0pwYU1hcHBpbmdGaWxlV2l6YXJkRGVzYz1DcmVhdGUgYW4gRWNsaXBzZUxpbmsgT1JNIG1hcHBpbmcgZmlsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9wbHVnaW4ueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MGViOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfdWkucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua191aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTVkYzVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua191aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1NYXBwaW5nRmlsZVdpemFyZF90aXRsZT1OZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlCi1NYXBwaW5nRmlsZVdpemFyZFBhZ2VfbmV3RmlsZV90aXRsZT1FY2xpcHNlTGluayBtYXBwaW5nIGZpbGUKLU1hcHBpbmdGaWxlV2l6YXJkUGFnZV9uZXdGaWxlX2Rlc2M9U3BlY2lmeSBFY2xpcHNlTGluayBtYXBwaW5nIGZpbGUgbmFtZSBhbmQgbG9jYXRpb24KLU1hcHBpbmdGaWxlV2l6YXJkUGFnZV9vcHRpb25zX3RpdGxlPUVjbGlwc2VMaW5rIG1hcHBpbmcgZmlsZQotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX29wdGlvbnNfZGVzYz1TcGVjaWZ5IEVjbGlwc2VMaW5rIG1hcHBpbmcgZmlsZSBvcHRpb25zCi0KLUJvb2xlYW5fVHJ1ZSA9IFRydWUKLUJvb2xlYW5fRmFsc2UgPSBGYWxzZQotCi1EZWZhdWx0V2l0aG91dFZhbHVlPURlZmF1bHQgKCkKLURlZmF1bHRXaXRoVmFsdWU9RGVmYXVsdCAoezB9KQotCQotUGVyc2lzdGVuY2VYbWxUYWJGb2xkZXJfZGVmYXVsdEVtcHR5ID0gRGVmYXVsdCAoKQotUGVyc2lzdGVuY2VYbWxUYWJGb2xkZXJfZGVmYXVsdFdpdGhPbmVQYXJhbSA9IERlZmF1bHQgKHswfSkKLQotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX25hbWUgPSBOYW1lOgotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3Byb3ZpZGVyID0gUHJvdmlkZXI6Ci1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfYnJvd3NlID0gQnJvd3NlLi4uCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZGVzY3JpcHRpb24gPSBEZXNjcmlwdGlvbjoKLQotIyBHZW5lcmFsCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfdGl0bGUgPSBHZW5lcmFsCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZ2VuZXJhbFNlY3Rpb25UaXRsZSA9IEdlbmVyYWwKLVBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9tYXBwZWRDbGFzc2VzU2VjdGlvblRpdGxlID0gTWFuYWdlZCBDbGFzc2VzCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfbWFwcGVkQ2xhc3Nlc1NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBsaXN0IG9mIGNsYXNzZXMgdG8gYmUgbWFuYWdlZCBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfeG1sTWFwcGluZ0ZpbGVzU2VjdGlvblRpdGxlID0gWE1MIE1hcHBpbmcgRmlsZXMKLVBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl94bWxNYXBwaW5nRmlsZXNTZWN0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KLQotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX25hbWVMYWJlbCA9IE5hbWU6Ci1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfcGVyc2lzdGVuY2VQcm92aWRlckxhYmVsID0gUGVyc2lzdGVuY2UgUHJvdmlkZXI6Ci1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZGVzY3JpcHRpb25MYWJlbCA9IERlc2NyaXB0aW9uOgotCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlcz1FeGNsdWRlIHVubGlzdGVkIGNsYXNzZXMKLVBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzV2l0aERlZmF1bHQ9RXhjbHVkZSB1bmxpc3RlZCBjbGFzc2VzICh7MH0pCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfbWFwcGVkQ2xhc3Nlc05vTmFtZT08bmFtZSBub3Qgc2V0PgotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX29wZW49T3BlbgotCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfeG1sTWFwcGluZ0ZpbGVzRGlhbG9nX3RpdGxlPUpQQSBYTUwgTWFwcGluZyBGaWxlIFNlbGVjdGlvbgotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3htbE1hcHBpbmdGaWxlc0RpYWxvZ19tZXNzYWdlPUNob29zZSB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgdG8gYmUgYWRkZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfb3JtTm9OYW1lPTxuYW1lIG5vdCBzZXQ+Ci1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZUVjbGlwc2VsaW5rT3JtPUV4Y2x1ZGUgdW5saXN0ZWQgRWNsaXBzZUxpbmsgWE1MIG1hcHBpbmcgZmlsZQotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2V4Y2x1ZGVFY2xpcHNlbGlua09ybVdpdGhEZWZhdWx0PUV4Y2x1ZGUgdW5saXN0ZWQgRWNsaXBzZUxpbmsgWE1MIG1hcHBpbmcgZmlsZSAoezB9KQotCi0jIENvbm5lY3Rpb24KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl90aXRsZSA9IENvbm5lY3Rpb24KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9zZWN0aW9uVGl0bGUgPSBQZXJzaXN0ZW5jZSBVbml0IENvbm5lY3Rpb24KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIGRhdGEgc291cmNlIG9yIEpEQkMgY29ubmVjdGlvbiBwcm9wZXJ0aWVzLgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0gPSBEZWZhdWx0ICh7MH0pCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfZGVmYXVsdEVtcHR5ID0gRGVmYXVsdCAoKQotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdHJhbnNhY3Rpb25UeXBlTGFiZWwgPSBUcmFuc2FjdGlvbiB0eXBlOgotCi1UcmFuc2FjdGlvblR5cGVDb21wb3NpdGVfanRhID0gSlRBCi1UcmFuc2FjdGlvblR5cGVDb21wb3NpdGVfcmVzb3VyY2VfbG9jYWwgPSBSZXNvdXJjZSBMb2NhbAotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWwgPSBOYXRpdmUgU1FMCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWxEZWZhdWx0ID0gTmF0aXZlIFNRTCAoezB9KQotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmF0Y2hXcml0aW5nTGFiZWwgPSBCYXRjaCB3cml0aW5nOgotCi1CYXRjaFdyaXRpbmdDb21wb3NpdGVfbm9uZSA9IE5vbmUKLUJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9qZGJjID0gSkRCQwotQmF0Y2hXcml0aW5nQ29tcG9zaXRlX2J1ZmZlcmVkID0gQnVmZmVyZWQKLUJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9vcmFjbGVfamRiYyA9IE9yYWNsZSBKREJDCi0KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9jYWNoZVN0YXRlbWVudHNMYWJlbCA9IFN0YXRlbWVudCBjYWNoaW5nOgotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfanRhRGF0YVNvdXJjZUxhYmVsID0gSlRBIGRhdGEgc291cmNlOgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25vbkp0YURhdGFTb3VyY2VMYWJlbCA9IE5vbi1KVEEgZGF0YSBzb3VyY2U6Ci0KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9kcml2ZXJMYWJlbCA9IERyaXZlcjoKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91cmxMYWJlbCA9IFVSTDoKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91c2VyTGFiZWwgPSBVc2VyOgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3Bhc3N3b3JkTGFiZWwgPSBQYXNzd29yZDoKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iaW5kUGFyYW1ldGVyc0xhYmVsID0gQmluZCBwYXJhbWV0ZXJzCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmluZFBhcmFtZXRlcnNMYWJlbERlZmF1bHQgPSBCaW5kIHBhcmFtZXRlcnMgKHswfSkKLQotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NoYXJlZExhYmVsID0gU2hhcmVkCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zU2hhcmVkTGFiZWxEZWZhdWx0ID0gU2hhcmVkICh7MH0pCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zU2VjdGlvblRpdGxlID0gUmVhZCBDb25uZWN0aW9uCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zTWluTGFiZWwgPSBNaW5pbXVtOgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc01heExhYmVsID0gTWF4aW11bToKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zU2VjdGlvblRpdGxlID0gV3JpdGUgQ29ubmVjdGlvbgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3dyaXRlQ29ubmVjdGlvbnNNaW5MYWJlbCA9IE1pbmltdW06Ci1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfd3JpdGVDb25uZWN0aW9uc01heExhYmVsID0gTWF4aW11bToKLQotQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfRGF0YWJhc2VfR3JvdXBCb3ggPSBEYXRhYmFzZQotCi1KZGJjUHJvcGVydGllc0NvbXBvc2l0ZV9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Qb29sX0dyb3VwQm94ID0gRWNsaXBzZUxpbmsgY29ubmVjdGlvbiBwb29sCi0KLUpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9Db25uZWN0aW9uRGlhbG9nX01lc3NhZ2UgPSAmRW50ZXIgY29ubmVjdGlvbiBuYW1lIG9yIHBhdHRlcm4gKCosID8sIG9yIGNhbWVsIGNhc2UpOgotSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0Nvbm5lY3Rpb25EaWFsb2dfVGl0bGUgPSBDb25uZWN0aW9uIFNlbGVjdGlvbgotCi1KZGJjRXhjbHVzaXZlQ29ubmVjdGlvbnNQcm9wZXJ0aWVzQ29tcG9zaXRlX0dyb3VwQm94ID0gRXhjbHVzaXZlIGNvbm5lY3Rpb25zCi0KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9leGNsdXNpdmVDb25uZWN0aW9uTW9kZUxhYmVsID0gRXhjbHVzaXZlIGNvbm5lY3Rpb24gbW9kZToKLQotSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlX2Fsd2F5cyA9IEFsd2F5cwotSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlX2lzb2xhdGVkID0gSXNvbGF0ZWQKLUpkYmNFeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbXBvc2l0ZV90cmFuc2FjdGlvbmFsID0gVHJhbnNhY3Rpb25hbAotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbGF6eUNvbm5lY3Rpb25MYWJlbCA9IExhenkgY29ubmVjdGlvbiBhY3F1aXNpdGlvbgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2xhenlDb25uZWN0aW9uTGFiZWxEZWZhdWx0ID0gTGF6eSBjb25uZWN0aW9uIGFjcXVpc2l0aW9uICh7MH0pCi0KLSMgU2NoZW1hR2VuZXJhdGlvbgotUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX3RpdGxlID0gU2NoZW1hIEdlbmVyYXRpb24KLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9zZWN0aW9uVGl0bGUgPSBQZXJzaXN0ZW5jZSBVbml0IFNjaGVtYSBHZW5lcmF0aW9uCi1QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uID0gQ29uZmlndXJlIHRoZSBFY2xpcHNlTGluayBzY2hlbWEgZ2VuZXJhdGlvbiBwcm9wZXJ0aWVzLgotUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0gPSBEZWZhdWx0ICh7MH0pCi1QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdEVtcHR5ID0gRGVmYXVsdCAoKQotUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHREb3QgPSBEZWZhdWx0ICguKQotCi1QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGRsR2VuZXJhdGlvblR5cGVMYWJlbCA9IERETCBnZW5lcmF0aW9uIHR5cGU6Ci1QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfb3V0cHV0TW9kZUxhYmVsID0gT3V0cHV0IG1vZGU6Ci1QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfY3JlYXRlRGRsRmlsZU5hbWVMYWJlbCA9IENyZWF0ZSBEREwgZmlsZSBuYW1lOgotUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2Ryb3BEZGxGaWxlTmFtZUxhYmVsID0gRHJvcCBEREwgZmlsZSBuYW1lOgotCi1PdXRwdXRNb2RlQ29tcG9zaXRlX2JvdGggPSBCb3RoCi1PdXRwdXRNb2RlQ29tcG9zaXRlX3NxbF9zY3JpcHQgPSBTcWwtc2NyaXB0Ci1PdXRwdXRNb2RlQ29tcG9zaXRlX2RhdGFiYXNlID0gRGF0YWJhc2UKLQotRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGVfbm9uZSA9IE5vbmUKLURkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlX2NyZWF0ZV90YWJsZXMgPSBDcmVhdGUgVGFibGVzCi1EZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZV9kcm9wX2FuZF9jcmVhdGVfdGFibGVzID0gRHJvcCBhbmQgQ3JlYXRlIFRhYmxlcwotCi1QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGRsR2VuZXJhdGlvbkxvY2F0aW9uTGFiZWwgPSBEREwgZ2VuZXJhdGlvbiBsb2NhdGlvbjoKLQkKLURkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZV9kaWFsb2dUaXRsZSA9IEdlbmVyYXRpb24gTG9jYXRpb24KLURkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZV9kaWFsb2dNZXNzYWdlID0gQ2hvb3NlIGEgZm9sZGVyIGZvciB0aGUgZ2VuZXJhdGVkIERETCBmaWxlczoKLQotIyBDYWNoaW5nCi1QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfdGl0bGUgPSBDYWNoaW5nCi1QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2VjdGlvblRpdGxlID0gUGVyc2lzdGVuY2UgVW5pdCBDYWNoaW5nCi1QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uID0gQ29uZmlndXJlIHRoZSBzZXNzaW9uIG9yIGVudGl0eSBzcGVjaWZpYyBFY2xpcHNlTGluayBjYWNoaW5nIHByb3BlcnRpZXMuCi0KLUNhY2hlRGVmYXVsdHNDb21wb3NpdGVfZ3JvdXBUaXRsZSA9IERlZmF1bHRzCi0KLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0Q2FjaGVUeXBlTGFiZWwgPSBEZWZhdWx0IGNhY2hlIHR5cGU6Ci1QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfY2FjaGVUeXBlTGFiZWwgPSBDYWNoZSB0eXBlOgotCi1QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfZGVmYXVsdFNoYXJlZENhY2hlTGFiZWwgPSBTaGFyZWQgY2FjaGUgKHswfSkKLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZUxhYmVsID0gU2hhcmVkIGNhY2hlCi0KLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0U2hhcmVkQ2FjaGVEZWZhdWx0TGFiZWwgPSBEZWZhdWx0IHNoYXJlZCBjYWNoZSAoezB9KQotUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NoYXJlZENhY2hlRGVmYXVsdExhYmVsID0gRGVmYXVsdCBzaGFyZWQgY2FjaGUKLQotQ2FjaGVTaXplQ29tcG9zaXRlX2NhY2hlU2l6ZT1DYWNoZSBzaXplOgotCi1DYWNoZVR5cGVDb21wb3NpdGVfZnVsbCA9IEZ1bGwKLUNhY2hlVHlwZUNvbXBvc2l0ZV9oYXJkX3dlYWsgPSBXZWFrIHdpdGggSGFyZCBTdWJjYWNoZQotQ2FjaGVUeXBlQ29tcG9zaXRlX25vbmUgPSBOb25lCi1DYWNoZVR5cGVDb21wb3NpdGVfc29mdCA9IFNvZnQKLUNhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0X3dlYWsgPSBXZWFrIHdpdGggU29mdCBTdWJjYWNoZQotQ2FjaGVUeXBlQ29tcG9zaXRlX3dlYWsgPSBXZWFrCi0KLURlZmF1bHRDYWNoZVNpemVDb21wb3NpdGVfZGVmYXVsdENhY2hlU2l6ZT1EZWZhdWx0IGNhY2hlIHNpemU6Ci0KLURlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGVfZnVsbCA9IEZ1bGwKLURlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGVfaGFyZF93ZWFrID0gV2VhayBXaXRoIEhhcmQgU3ViY2FjaGUKLURlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGVfbm9uZSA9IE5vbmUKLURlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGVfc29mdCA9IFNvZnQKLURlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGVfc29mdF93ZWFrID0gV2VhayB3aXRoIFNvZnQgU3ViY2FjaGUKLURlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGVfd2VhayA9IFdlYWsKLQotRW50aXR5RGlhbG9nX3NlbGVjdEVudGl0eSA9IFNlbGVjdCBhbiBFbnRpdHkKLUVudGl0eURpYWxvZ19uYW1lID0gTmFtZToKLQotQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZ3JvdXBUaXRsZSA9IEVudGl0eSBjYWNoaW5nCi1DYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9lZGl0QnV0dG9uID0gRWRpdC4uLgotCi1DYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dNZXNzYWdlPSZFbnRlciB0eXBlIG5hbWUgcHJlZml4IG9yIHBhdHRlcm4gKCosID8sIG9yIGNhbWVsIGNhc2UpOgotQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nVGl0bGU9RW50aXR5IFNlbGVjdGlvbgotCi1QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfRmx1c2hDbGVhckNhY2hlTGFiZWwgPSBGbHVzaCBjbGVhciBjYWNoZToKLQotRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlX2Ryb3AgPSBEcm9wCi1GbHVzaENsZWFyQ2FjaGVDb21wb3NpdGVfZHJvcF9pbnZhbGlkYXRlID0gRHJvcCBJbnZhbGlkYXRlCi1GbHVzaENsZWFyQ2FjaGVDb21wb3NpdGVfbWVyZ2UgPSBNZXJnZQotCi0jIEN1c3RvbWl6YXRpb24KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aXRsZSA9IEN1c3RvbWl6YXRpb24KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9zZWN0aW9uVGl0bGUgPSBQZXJzaXN0ZW5jZSBVbml0IEN1c3RvbWl6YXRpb24KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24gPSBTZXQgZGVmYXVsdCBvciBlbnRpdHkgc3BlY2lmaWMgRWNsaXBzZUxpbmsgY3VzdG9taXphdGlvbiBhbmQgdmFsaWRhdGlvbiBwcm9wZXJ0aWVzLgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0gPSBEZWZhdWx0ICh7MH0pCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfZGVmYXVsdEVtcHR5ID0gRGVmYXVsdCAoKQotCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ1Byb3BlcnRpZXNHcm91cEJveCA9IFdlYXZpbmcKLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGFiZWwgPSBXZWF2aW5nOgotCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhenlMYWJlbERlZmF1bHQgPSBMYXp5ICh7MH0pCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhenlMYWJlbCA9IExhenkKLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsRGVmYXVsdCA9IEZldGNoIGdyb3VwcyAoezB9KQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsID0gRmV0Y2ggZ3JvdXBzCi0KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nSW50ZXJuYWxMYWJlbCA9IEludGVybmFsCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ludGVybmFsTGFiZWxEZWZhdWx0ID0gSW50ZXJuYWwgKHswfSkKLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdFYWdlckxhYmVsID0gRWFnZXIKLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRWFnZXJMYWJlbERlZmF1bHQgPSBFYWdlciAoezB9KQotCQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdDaGFuZ2VUcmFja2luZ0xhYmVsRGVmYXVsdCA9IENoYW5nZSB0cmFja2luZyAoezB9KQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdDaGFuZ2VUcmFja2luZ0xhYmVsID0gQ2hhbmdlIHRyYWNraW5nCi0KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0aW9uT25seUxhYmVsID0gVmFsaWRhdGlvbiBvbmx5Ci1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdmFsaWRhdGlvbk9ubHlMYWJlbERlZmF1bHQgPSBWYWxpZGF0aW9uIG9ubHkgKHswfSkKLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3ZhbGlkYXRlU2NoZW1hTGFiZWwgPSBNYXBwaW5nIGZpbGVzIHNjaGVtYSB2YWxpZGF0aW9uCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdmFsaWRhdGVTY2hlbWFMYWJlbERlZmF1bHQgPSBNYXBwaW5nIGZpbGVzIHNjaGVtYSB2YWxpZGF0aW9uICh7MH0pCi0KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbERlZmF1bHQgPSBUaHJvdyBleGNlcHRpb25zICh7MH0pCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdGhyb3dFeGNlcHRpb25zTGFiZWwgPSBUaHJvdyBleGNlcHRpb25zCi0KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9leGNlcHRpb25IYW5kbGVyTGFiZWwgPSBFeGNlcHRpb24gaGFuZGxlcjoKLQotV2VhdmluZ0NvbXBvc2l0ZV90cnVlXyA9IFdlYXZlIER5bmFtaWNhbGx5Ci1XZWF2aW5nQ29tcG9zaXRlX2ZhbHNlXyA9IE5vIFdlYXZpbmcKLVdlYXZpbmdDb21wb3NpdGVfc3RhdGljXyA9IFdlYXZlIFN0YXRpY2FsbHkKLQotQ3VzdG9taXphdGlvbkVudGl0eUxpc3RDb21wb3NpdGVfZ3JvdXBUaXRsZSA9IERlc2NyaXB0b3IgY3VzdG9taXplcnMKLUN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2VkaXRCdXR0b24gPSBFZGl0Li4uCi0KLUN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ01lc3NhZ2U9JkVudGVyIHR5cGUgbmFtZSBwcmVmaXggb3IgcGF0dGVybiAoKiwgPywgb3IgY2FtZWwgY2FzZSk6Ci1DdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dUaXRsZT1FbnRpdHkgU2VsZWN0aW9uCi0KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9jdXN0b21pemVyTGFiZWwgPSBDdXN0b21pemVyOgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Nlc3Npb25DdXN0b21pemVyTGFiZWwgPSBTZXNzaW9uIGN1c3RvbWl6ZXJzCi0KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9ub05hbWU9PG5hbWUgbm90IHNldD4KLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Byb2ZpbGVyTGFiZWwgPSBQcm9maWxlcjoKLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9icm93c2UgPSBCcm93c2UuLi4KLQotUHJvZmlsZXJDb21wb3NpdGVfcGVyZm9ybWFuY2VfcHJvZmlsZXIgPSBQZXJmb3JtYW5jZSBQcm9maWxlcgotUHJvZmlsZXJDb21wb3NpdGVfcXVlcnlfbW9uaXRvciA9IFF1ZXJ5IE1vbml0b3IgCi1Qcm9maWxlckNvbXBvc2l0ZV9ub19wcm9maWxlciA9IE5vIFByb2ZpbGVyCi0KLSMgTG9nZ2luZwotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpdGxlID0gTG9nZ2luZwotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlY3Rpb25UaXRsZSA9IFBlcnNpc3RlbmNlIFVuaXQgTG9nZ2luZwotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlY3Rpb25EZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSB0aGUgRWNsaXBzZUxpbmsgbG9nZ2luZyBwcm9wZXJ0aWVzLgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0gPSBEZWZhdWx0ICh7MH0pCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZGVmYXVsdEVtcHR5ID0gRGVmYXVsdCAoKQotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2RlZmF1bHRTdGRvdXQgPSBEZWZhdWx0IChzdGRvdXQpCi0KLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9jYXRlZ29yeUxvZ2dpbmdMZXZlbFNlY3Rpb25UaXRsZSA9IExvZ2dpbmcgQ2F0ZWdvcmllcwotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2xvZ2dpbmdMZXZlbExhYmVsID0gTG9nZ2luZyBsZXZlbDoKLQotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NxbExvZ2dpbmdMZXZlbExhYmVsID0gU1FMOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RyYW5zYWN0aW9uTG9nZ2luZ0xldmVsTGFiZWwgPSBUcmFuc2FjdGlvbjoKLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9ldmVudExvZ2dpbmdMZXZlbExhYmVsID0gRXZlbnQ6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfY29ubmVjdGlvbkxvZ2dpbmdMZXZlbExhYmVsID0gQ29ubmVjdGlvbjoKLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9xdWVyeUxvZ2dpbmdMZXZlbExhYmVsID0gUXVlcnk6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfY2FjaGVMb2dnaW5nTGV2ZWxMYWJlbCA9IENhY2hlOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3Byb3BhZ2F0aW9uTG9nZ2luZ0xldmVsTGFiZWwgPSBQcm9wYWdhdGlvbjoKLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXF1ZW5jaW5nTG9nZ2luZ0xldmVsTGFiZWwgPSBTZXF1ZW5jaW5nOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2VqYkxvZ2dpbmdMZXZlbExhYmVsID0gRUpCOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Rtc0xvZ2dpbmdMZXZlbExhYmVsID0gRE1TOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2VqYl9vcl9tZXRhZGF0YUxvZ2dpbmdMZXZlbExhYmVsID0gRUpCIG9yIG1ldGFkYXRhOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2pwYV9tZXRhbW9kZWxMb2dnaW5nTGV2ZWxMYWJlbCA9IEpQQSBtZXRhbW9kZWw6Ci0JUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3dlYXZlckxvZ2dpbmdMZXZlbExhYmVsID0gV2VhdmluZzoKLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9wcm9wZXJ0aWVzTG9nZ2luZ0xldmVsTGFiZWwgPSBQcm9wZXJ0aWVzOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlcnZlckxvZ2dpbmdMZXZlbExhYmVsID0gU2VydmVyOgotCi1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfb2ZmID0gT2ZmCi1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfc2V2ZXJlID0gU2V2ZXJlCi1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfd2FybmluZyA9IFdhcm5pbmcKLUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9pbmZvID0gSW5mbwotTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2NvbmZpZyA9IENvbmZpZwotTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmUgPSBGaW5lCi1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZXIgPSBGaW5lcgotTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmVzdCA9IEZpbmVzdAotTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2FsbCA9IEFsbAotCi1FY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX29mZiA9IE9mZgotRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9zZXZlcmUgPSBTZXZlcmUKLUVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfd2FybmluZyA9IFdhcm5pbmcKLUVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfaW5mbyA9IEluZm8KLUVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfY29uZmlnID0gQ29uZmlnCi1FY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmUgPSBGaW5lCi1FY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmVyID0gRmluZXIKLUVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZXN0ID0gRmluZXN0Ci1FY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX2FsbCA9IEFsbAotCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2VyTGFiZWwgPSBMb2dnZXI6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfYnJvd3NlID0gQnJvd3NlLi4uCi1Mb2dnZXJDb21wb3NpdGVfZGVmYXVsdF9sb2dnZXIgPSBEZWZhdWx0IExvZ2dlcgotTG9nZ2VyQ29tcG9zaXRlX2phdmFfbG9nZ2VyID0gSmF2YSBMb2dnZXIKLUxvZ2dlckNvbXBvc2l0ZV9zZXJ2ZXJfbG9nZ2VyID0gU2VydmVyIExvZ2dlcgotCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGltZXN0YW1wTGFiZWwgPSBUaW1lc3RhbXAKLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aW1lc3RhbXBMYWJlbERlZmF1bHQgPSBUaW1lc3RhbXAgKHswfSkKLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aHJlYWRMYWJlbCA9IFRocmVhZAotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RocmVhZExhYmVsRGVmYXVsdCA9IFRocmVhZCAoezB9KQotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3Nlc3Npb25MYWJlbCA9IFNlc3Npb24KLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWxEZWZhdWx0ID0gU2Vzc2lvbiAoezB9KQotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V4Y2VwdGlvbnNMYWJlbCA9IEV4Y2VwdGlvbnMKLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9leGNlcHRpb25zTGFiZWxEZWZhdWx0ID0gRXhjZXB0aW9ucyAoezB9KQotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Nvbm5lY3Rpb25MYWJlbCA9IENvbm5lY3Rpb24KLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9jb25uZWN0aW9uTGFiZWxEZWZhdWx0ID0gQ29ubmVjdGlvbiAoezB9KQotCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2Vyc0xhYmVsID0gTG9nZ2VyczoKLQotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2xvZ2dpbmdGaWxlTGFiZWwgPSBMb2cgZmlsZToKLQotTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZV9kaWFsb2dUaXRsZSA9IENob29zZSBhIGxvZyBmaWxlCi0KLSMgT3B0aW9ucwotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RpdGxlID0gT3B0aW9ucwotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25TZWN0aW9uVGl0bGUgPSBFY2xpcHNlTGluayBTZXNzaW9uIE9wdGlvbnMKLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQ29uZmlndXJlIHRoZSBFY2xpcHNlTGluayBzZXNzaW9uIG9wdGlvbnMuCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSA9IERlZmF1bHQgKHswfSkKLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9kZWZhdWx0RW1wdHkgPSBEZWZhdWx0ICgpCi0KLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uTmFtZSA9IFNlc3Npb24gbmFtZToKLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uc1htbCA9IFNlc3Npb25zIFhNTDoKLQotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xhYmVsID0gSW5jbHVkZSBkZXNjcmlwdG9yIHF1ZXJpZXMKLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMYWJlbERlZmF1bHQgPSBJbmNsdWRlIGRlc2NyaXB0b3IgcXVlcmllcyAoezB9KQotCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZXZlbnRMaXN0ZW5lckxhYmVsID0gRXZlbnQgbGlzdGVuZXI6Ci1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGFyZ2V0RGF0YWJhc2VMYWJlbCA9IFRhcmdldCBkYXRhYmFzZToKLQotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX21pc2NlbGxhbmVvdXNTZWN0aW9uVGl0bGUgPSBNaXNjZWxsYW5lb3VzIE9wdGlvbnMKLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9taXNjZWxsYW5lb3VzU2VjdGlvbkRlc2NyaXB0aW9uID0gQ29uZmlndXJlIHRoZSBtaXNjZWxsYW5lb3VzIG9wdGlvbnMuCi0KLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90ZW1wb3JhbE11dGFibGVMYWJlbCA9IFRlbXBvcmFsIG11dGFibGUKLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90ZW1wb3JhbE11dGFibGVMYWJlbERlZmF1bHQgPSBUZW1wb3JhbCBtdXRhYmxlICh7MH0pCi0KLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9ub05hbWU9PG5hbWUgbm90IHNldD4KLQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfYXR0dW5pdHkgPSBBdHR1bml0eQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfYXV0byA9IEF1dG8KLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2Nsb3Vkc2NhcGUgPSBDbG91ZHNjYXBlCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kYXRhYmFzZSA9IERhdGFiYXNlCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kYjIgPSBEQjIKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2RiMm1haW5mcmFtZSA9IERCMk1haW5mcmFtZQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfZGJhc2UgPSBEQmFzZQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfZGVyYnkgPSBEZXJieQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfaHNxbCA9IEhTUUwKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2luZm9ybWl4ID0gSW5mb3JtaXgKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2phdmFkYiA9IEphdmFEQgotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfbXlzcWwgPSBNeVNRTAotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfb3JhY2xlID0gT3JhY2xlCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGUxMSA9IE9yYWNsZTExCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGUxMCA9IE9yYWNsZTEwZwotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfb3JhY2xlOSA9IE9yYWNsZTlpCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGU4ID0gT3JhY2xlOGkKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3BvaW50YmFzZSA9IFBvaW50QmFzZQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfcG9zdGdyZXNxbCA9IFBvc3RncmVTUUwKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3NxbGFueXdoZXJlID0gU1FMQW55d2hlcmUKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3NxbHNlcnZlciA9IFNRTFNlcnZlcgotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3liYXNlID0gU3liYXNlCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV90aW1lc3RlbiA9IFRpbWVzVGVuCi0KLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90YXJnZXRTZXJ2ZXJMYWJlbCA9IFRhcmdldCBzZXJ2ZXI6Ci0KLVRhcmdldFNlcnZlckNvbXBvc2l0ZV9ub25lID0gTm9uZQotVGFyZ2V0U2VydmVyQ29tcG9zaXRlX29jNGogPSBPQzRKCi1UYXJnZXRTZXJ2ZXJDb21wb3NpdGVfc3VuYXM5ID0gU3VuQVM5Ci1UYXJnZXRTZXJ2ZXJDb21wb3NpdGVfd2Vic3BoZXJlID0gV2ViU3BoZXJlCi1UYXJnZXRTZXJ2ZXJDb21wb3NpdGVfd2Vic3BoZXJlXzZfMSA9IFdlYlNwaGVyZSA2LjEKLVRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJsb2dpYyA9IFdlYkxvZ2ljCi1UYXJnZXRTZXJ2ZXJDb21wb3NpdGVfd2VibG9naWNfOSA9IFdlYkxvZ2ljIDkKLVRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJsb2dpY18xMCA9IFdlYkxvZ2ljIDEwCi1UYXJnZXRTZXJ2ZXJDb21wb3NpdGVfamJvc3MgPSBKQm9zcwotCi0jIERETEdlbmVyYXRpb24KLUVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0RETFdhcm5pbmdUaXRsZSA9IEdlbmVyYXRpbmcgRERMCi1FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2dlbmVyYXRpbmdERExXYXJuaW5nTWVzc2FnZSA9IFdhcm5pbmc6ICBHZW5lcmF0aW5nIERETCB3aWxsIERST1AgZXhpc3RpbmcgdGFibGVzIGFuZHswfUNSRUFURSBuZXcgdGFibGVzIGJhc2VkIG9uIHRoZSBFbnRpdGllcyBpbiB5b3VyIHByb2plY3QuezF9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaV9lcnJvciA9IEVycm9yCi1FQ0xJUFNFTElOS19HRU5FUkFURV9UQUJMRVNfSk9CID0gR2VuZXJhdGluZyBUYWJsZXMgZnJvbSBFbnRpdGllcwotRUNMSVBTRUxJTktfR0VORVJBVEVfVEFCTEVTX1RBU0sgPSBHZW5lcmF0aW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfdWlfZGV0YWlscy5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3Byb3BlcnR5X2ZpbGVzL2VjbGlwc2VsaW5rX3VpX2RldGFpbHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxOGNmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfdWlfZGV0YWlscy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsID0gQmFzaWMgQ29sbGVjdGlvbgotRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWwgPSBiYXNpYyBjb2xsZWN0aW9uCi0KLUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlQcm92aWRlcl9sYWJlbCA9IEJhc2ljIE1hcAotRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbCA9IGJhc2ljIG1hcAotCi1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWwgPSBUcmFuc2Zvcm1hdGlvbgotRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbCA9IHRyYW5zZm9ybWF0aW9uCi0KLUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsID0gVmFyaWFibGUgT25lIHRvIE9uZQotRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsID0gdmFyaWFibGUgb25lIHRvIG9uZQotCi1FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9sYWJlbCA9IFR5cGU6CQotRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfZnVsbCA9IEZ1bGwKLUVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX3dlYWsgPSBXZWFrCi1FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0ID0gU29mdAotRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfc29mdF93ZWFrID0gV2VhayB3aXRoIFNvZnQgU3ViY2FjaGUKLUVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX2hhcmRfd2VhayA9IFdlYWsgd2l0aCBIYXJkIFN1YmNhY2hlCi1FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9jYWNoZSA9IENhY2hlCi1FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9ub25lID0gIE5vbmUKLQotRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGVfc2l6ZSA9IFNpemU6Ci0KLUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX2xhYmVsID0gQ29vcmRpbmF0aW9uIHR5cGU6Ci1FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9zZW5kX29iamVjdF9jaGFuZ2VzID0gU2VuZCBPYmplY3QgQ2hhbmdlcwotRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfaW52YWxpZGF0ZV9jaGFuZ2VkX29iamVjdHMgPSBJbnZhbGlkYXRlIENoYW5nZWQgT2JqZWN0cwotRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfc2VuZF9uZXdfb2JqZWN0c193aXRoX2NoYW5nZXMgPSBTZW5kIE5ldyBPYmplY3RzIHdpdGggQ2hhbmdlcwotRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfbm9uZSA9IE5vbmUKLQotRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlX3NoYXJlZExhYmVsRGVmYXVsdCA9IFNoYXJlZCAoezB9KQotRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlX3NoYXJlZExhYmVsID0gU2hhcmVkCi1FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfYWR2YW5jZWQgPSBBZHZhbmNlZAotCi1FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlX2xhYmVsID0gQ2hhbmdlIHRyYWNraW5nOgotRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZV9hdHRyaWJ1dGUgPSBBdHRyaWJ1dGUKLUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfb2JqZWN0ID0gT2JqZWN0Ci1FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlX2RlZmVycmVkID0gRGVmZXJyZWQKLUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfYXV0byA9IEF1dG8KLQotRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2NvbnZlcnRlck5hbWVMYWJlbCA9IENvbnZlcnRlciBuYW1lOgotRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2RlZmluZUNvbnZlcnRlclNlY3Rpb24gPSBEZWZpbmUgQ29udmVydGVyCi1FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfZGVmYXVsdCA9IERlZmF1bHQKLUVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9jdXN0b20gPSBDdXN0b20KLUVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV90eXBlID0gVHlwZQotRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX29iamVjdFR5cGUgPSBPYmplY3QgdHlwZQotRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX3N0cnVjdCA9IFN0cnVjdAotCi1FY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9uYW1lVGV4dExhYmVsID0gTmFtZToKLUVjbGlwc2VMaW5rQ29udmVydGVyQ29tcG9zaXRlX2NsYXNzTGFiZWwgPSBDbGFzczoKLQotRWNsaXBzZUxpbmtDdXN0b21pemVyQ29tcG9zaXRlX2NsYXNzTGFiZWwgPSBDdXN0b21pemVyIGNsYXNzOgotCi1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfY3VzdG9tQ29udmVydGVyID0gQ3VzdG9tCi1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfb2JqZWN0VHlwZUNvbnZlcnRlciA9IE9iamVjdCB0eXBlCi1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfc3RydWN0Q29udmVydGVyID0gU3RydWN0Ci1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfdHlwZUNvbnZlcnRlciA9IFR5cGUKLQotRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlX2Fsd2F5c1JlZnJlc2hEZWZhdWx0ID0gQWx3YXlzIHJlZnJlc2ggKHswfSkKLUVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZV9hbHdheXNSZWZyZXNoTGFiZWwgPSBBbHdheXMgcmVmcmVzaAotRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGVfcmVmcmVzaE9ubHlJZk5ld2VyRGVmYXVsdCA9IFJlZnJlc2ggb25seSBpZiBuZXdlciAoezB9KQotRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGVfcmVmcmVzaE9ubHlJZk5ld2VyTGFiZWwgPSBSZWZyZXNoIG9ubHkgaWYgbmV3ZXIKLUVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGVfZGlzYWJsZUhpdHNEZWZhdWx0ID0gRGlzYWJsZSBoaXRzICh7MH0pCi1FY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlX2Rpc2FibGVIaXRzTGFiZWwgPSBEaXNhYmxlIGhpdHMKLQotVHlwZVNlY3Rpb25fY29udmVydGVkID0gQ29udmVydGVkCi0KLUVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfYWR2YW5jZWQgPSBBZHZhbmNlZAotRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jYWNoaW5nID0gQ2FjaGluZwotRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jb252ZXJ0ZXJzID0gQ29udmVydGVycwotCi1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2xhYmVsID0gRXhpc3RlbmNlIGNoZWNraW5nOgotSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfY2hlY2tfY2FjaGUgPSBDaGVjayBDYWNoZQotSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfY2hlY2tfZGF0YWJhc2UgPSBDaGVjayBDYWNoZSB0aGVuIERhdGFiYXNlCi1KYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9hc3N1bWVfZXhpc3RlbmNlID0gQXNzdW1lIEV4aXN0ZW5jZQotSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfYXNzdW1lX25vbl9leGlzdGVuY2UgPSBBc3N1bWUgTm9uLUV4aXN0ZW5jZQotT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9jaGVja19jYWNoZSA9IENoZWNrIENhY2hlCi1Pcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2NoZWNrX2RhdGFiYXNlID0gQ2hlY2sgQ2FjaGUgdGhlbiBEYXRhYmFzZQotT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9hc3N1bWVfZXhpc3RlbmNlID0gQXNzdW1lIEV4aXN0ZW5jZQotT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9hc3N1bWVfbm9uX2V4aXN0ZW5jZSA9IEFzc3VtZSBOb24tRXhpc3RlbmNlCi0KLUVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX2V4cGlyeVNlY3Rpb24gPSBFeHBpcnkKLQotRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfbm9FeHBpcnkgPSBObyBleHBpcnkKLUVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVUb0xpdmVFeHBpcnkgPSBUaW1lIHRvIGxpdmUgZXhwaXJ5Ci1FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lVG9MaXZlRXhwaXJ5RXhwaXJlQWZ0ZXIgPSBFeHBpcmUgYWZ0ZXIKLUVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVUb0xpdmVFeHBpcnlNaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHMKLUVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX2RhaWx5RXhwaXJ5ID0gRGFpbHkgZXhwaXJ5Ci1FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lT2ZEYXlFeHBpcnlFeHBpcmVBdCA9IEV4cGlyZSBhdAotCi0KLUVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlX2xhYmVsID0gSm9pbiBmZXRjaDoKLUVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlX2lubmVyID0gSW5uZXIKLUVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlX291dGVyID0gT3V0ZXIKLQotRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlX211dGFibGVMYWJlbD1NdXRhYmxlCi1FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfbXV0YWJsZUxhYmVsRGVmYXVsdD1NdXRhYmxlICh7MH0pCi1FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfdHJ1ZT1UcnVlCi1FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfZmFsc2U9RmFsc2UKLQotRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2RhdGFUeXBlTGFiZWwgPSBEYXRhIHR5cGU6Ci1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfb2JqZWN0VHlwZUxhYmVsID0gT2JqZWN0IHR5cGU6Ci1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlRWRpdCA9IEVkaXQuLi4KLUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVzRGF0YVZhbHVlQ29sdW1uID0gRGF0YSBWYWx1ZQotRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2NvbnZlcnNpb25WYWx1ZXNPYmplY3RWYWx1ZUNvbHVtbiA9IE9iamVjdCBWYWx1ZQotRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2RlZmF1bHRPYmplY3RWYWx1ZUxhYmVsID0gRGVmYXVsdCBvYmplY3QgdmFsdWU6Ci1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlc0dyb3VwVGl0bGUgPSBDb252ZXJzaW9uIHZhbHVlcwotRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfYWRkQ29udmVyc2lvblZhbHVlID0gQWRkIENvbnZlcnNpb24gVmFsdWUKLUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2VkaXRDb252ZXJzaW9uVmFsdWUgPSBFZGl0IENvbnZlcnNpb24gVmFsdWUKLUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2FkZENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uVGl0bGUgPSBDcmVhdGUgbmV3IGNvbnZlcnNpb24gdmFsdWUKLUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2FkZENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGNvbnZlcnNpb24gdmFsdWUgc2V0dGluZyBib3RoIHRoZSAnZGF0YSB2YWx1ZScgYW5kIHRoZSAnb2JqZWN0IHZhbHVlJwotRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZWRpdENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uVGl0bGUgPSBFZGl0IGNvbnZlcnNpb24gdmFsdWUKLUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2VkaXRDb252ZXJzaW9uVmFsdWVEZXNjcmlwdGlvbiA9IEVkaXQgdGhlIGNvbnZlcnNpb24gdmFsdWUsIGNoYW5naW5nIHRoZSAnZGF0YSB2YWx1ZScgb3IgJ29iamVjdCB2YWx1ZScKLQotRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZGF0YVZhbHVlID0gRGF0YSB2YWx1ZToKLUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX29iamVjdFZhbHVlID0gT2JqZWN0IHZhbHVlOgotRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdF9kYXRhVmFsdWVNdXN0QmVTcGVjaWZpZWQgPSBBIGRhdGEgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQuCi1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0X29iamVjdFZhbHVlTXVzdEJlU3BlY2lmaWVkID0gQW4gb2JqZWN0IHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkLgotRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdF9kYXRhVmFsdWVBbHJlYWR5RXhpc3RzID0gVGhpcyBkYXRhIHZhbHVlIGlzIGFscmVhZHkgc3BlY2lmaWVkLCBjYW5ub3QgbWFwIG11bHRpcGxlIG9iamVjdCB2YWx1ZXMgdG8gdGhlIHNhbWUgZGF0YSB2YWx1ZS4KLQotCi1FY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZV9wcml2YXRlT3duZWRMYWJlbCA9IFByaXZhdGUgb3duZWQKLUVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGVfcmVhZE9ubHlMYWJlbCA9IFJlYWQtb25seQotRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZV9yZWFkT25seVdpdGhEZWZhdWx0ID0gUmVhZC1vbmx5ICh7MH0pCi1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGVfZGF0YVR5cGVMYWJlbCA9IERhdGEgdHlwZToKLUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9vYmplY3RUeXBlTGFiZWwgPSBPYmplY3QgdHlwZToKLQotRGVmYXVsdEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1EZWZhdWx0IChPbmUgdG8gT25lKQotRGVmYXVsdEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPURlZmF1bHQgKFZhcmlhYmxlIE9uZSB0byBPbmUpCi1EZWZhdWx0RWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1EZWZhdWx0IChPbmUgdG8gTWFueSkKLURlZmF1bHRFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPWRlZmF1bHQgKG9uZSB0byBvbmUpCi1EZWZhdWx0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPWRlZmF1bHQgKHZhcmlhYmxlIG9uZSB0byBvbmUpCi1EZWZhdWx0RWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw9ZGVmYXVsdCAob25lIHRvIG1hbnkpCi0KLQkKLUVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX25hbWU9TmFtZToKLUVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX2NvbnZlcnRlclR5cGU9VHlwZToKLUVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX2FkZENvbnZlcnRlcj1BZGQgQ29udmVydGVyCi1FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXJEZXNjcmlwdGlvblRpdGxlPUNyZWF0ZSBuZXcgY29udmVydGVyCi1FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXJEZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgY29udmVydGVyIHNldHRpbmcgYm90aCB0aGUgJ25hbWUnIGFuZCB0aGUgJ3R5cGUnCi1FY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X25hbWVNdXN0QmVTcGVjaWZpZWQgPSBBIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuCi1FY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X3R5cGVNdXN0QmVTcGVjaWZpZWQgPSBBIGNvbnZlcnRlciB0eXBlIG11c3QgYmUgc3BlY2lmaWVkLgotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9KcHRFY2xpcHNlTGlua1VpUGx1Z2luLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9KcHRFY2xpcHNlTGlua1VpUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMDgyYzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvSnB0RWNsaXBzZUxpbmtVaVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua1VpUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbgotewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpIjsKLQotCQotCS8vICoqKioqKioqKiogc2luZ2xldG9uICoqKioqKioqKioKLQlwcml2YXRlIHN0YXRpYyBKcHRFY2xpcHNlTGlua1VpUGx1Z2luIElOU1RBTkNFOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIFBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0RWNsaXBzZUxpbmtVaVBsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgSU5TVEFOQ0UuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsKSk7Ci0gICAgfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgdGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBJbWFnZSBBUEkgKioqKioqKioqKgotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCWlmICghIGtleS5zdGFydHNXaXRoKCJpY29ucy8iKSkgewotCQkJa2V5ID0gImljb25zLyIgKyBrZXk7Ci0JCX0KLQkJaWYgKCEga2V5LmVuZHNXaXRoKCIuZ2lmIikpIHsKLQkJCWtleSA9IGtleSArICIuZ2lmIjsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIGtleSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGFuIGltYWdlIGZvciBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyCi0JICovCi0JLy9UT0RPIHdlIGFyZSB1c2luZyB0aGUgSW1hZ2VSZWdpc3RyeSBoZXJlIGFuZCBzdG9yaW5nIGFsbCBvdXIgaWNvbnMgZm9yIHRoZSBsaWZlIG9mIHRoZSBwbHVnaW4sIAotCS8vd2hpY2ggbWVhbnMgdW50aWwgdGhlIHdvcmtzcGFjZSBpcyBjbG9zZWQuICBUaGlzIGlzIGJldHRlciB0aGFuIGJlZm9yZSB3aGVyZSB3ZSBjb25zdGFudGx5IAotCS8vY3JlYXRlZCBuZXcgaW1hZ2VzLiBCdWcgMzA2NDM3IGlzIGFib3V0IGNsZWFuaW5nIHRoaXMgdXAgYW5kIHVzaW5nIExvY2FsIFJlc291cmNlIE1hbmFnZXJzIAotCS8vb24gb3VyIHZpZXdzIHNvIHRoYXQgY2xvc2luZyB0aGUgSlBBIHBlcnNwZWN0aXZlIHdvdWxkIG1lYW4gb3VyIGljb25zIGFyZSBkaXNwb3NlZC4KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gaW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUltYWdlIGltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlUmVnaXN0cnkucHV0KGtleSwgZ2V0SW1hZ2VEZXNjcmlwdG9yKGtleSkpOwotCQkJaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChrZXkpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgSnB0RWNsaXBzZUxpbmtVaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKElOU1RBTkNFICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODMyYzIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0VjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIERhbGkgRWNsaXBzZUxpbmsgVUkuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcyB7Ci0KLQkvL0NvbnRleHRJRCBwcmVmaXgKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBKcHRVaVBsdWdpbi5QTFVHSU5fSUQgKyAiLiI7Ci0KLQkvL1BlcnNpc3RlbnQgVHlwZSBjb21wb3NpdGVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19BTFdBWVNfUkVGUkVTSCA9IFBSRUZJWCArICJjYWNoaW5nX2Fsd2F5c1JlZnJlc2giOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hJTkdfQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEUgPSBQUkVGSVggKyAiY2FjaGluZ19jYWNoZUNvb3JkaW5hdGlvblR5cGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hJTkdfQ0FDSEVfVFlQRSA9IFBSRUZJWCArICJjYWNoaW5nX2NhY2hlVHlwZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19ESVNBQkxFX0hJVFMgPSBQUkVGSVggKyAiY2FjaGluZ19kaXNhYmxlSGl0cyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19SRUZSRVNIX09OTFlfSUZfTkVXRVIgPSBQUkVGSVggKyAiY2FjaGluZ19yZWZyZXNoT25seUlmTmV3ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hJTkdfU0hBUkVEID0gUFJFRklYICsgImNhY2hpbmdfc2hhcmVkIjsKLQotCS8vUGVyc2lzdGVuY2UgWG1sIEVkaXRvcgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX0NBQ0hJTkcgPSBQUkVGSVggKyAicGVyc2lzdGVuY2VfY2FjaGluZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTiA9IFBSRUZJWCArICJwZXJzaXN0ZW5jZV9jdXN0b21pemF0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9MT0dHSU5HID0gUFJFRklYICsgInBlcnNpc3RlbmNlX2xvZ2dpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09QVElPTlMgPSBQUkVGSVggKyAicGVyc2lzdGVuY2Vfb3B0aW9ucyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfU0NIRU1BX0dFTkVSQVRJT04gPSBQUkVGSVggKyAicGVyc2lzdGVuY2Vfc2NoZW1hR2VuZXJhdGlvbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9DQUNISU5HX0RFRkFVTFRfU0hBUkVEID0gUFJFRklYICsgImNhY2hpbmdfZGVmYXVsdFNoYXJlZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfQ0FDSElOR19ERUZBVUxUX1NJWkUgPSBQUkVGSVggKyAiY2FjaGluZ19kZWZhdWx0U2l6ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfQ0FDSElOR19ERUZBVUxUX1RZUEUgPSBQUkVGSVggKyAiY2FjaGluZ19kZWZhdWx0VHlwZSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfTE9HR0lOR19FWENFUFRJT05TID0gUFJFRklYICsgImxvZ2dpbmdfZXhjZXB0aW9ucyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfTE9HR0lOR19MRVZFTCA9IFBSRUZJWCArICJsb2dnaW5nX2xldmVsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9MT0dHSU5HX1NFU1NJT04gPSBQUkVGSVggKyAibG9nZ2luZ19zZXNzaW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9MT0dHSU5HX1RIUkVBRCA9IFBSRUZJWCArICJsb2dnaW5nX3RocmVhZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfTE9HR0lOR19USU1FU1RBTVAgPSBQUkVGSVggKyAibG9nZ2luZ190aW1lU3RhbXAiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09QVElPTlNfU0VTU0lPTl9OQU1FID0gUFJFRklYICsgIm9wdGlvbnNfc2Vzc2lvbk5hbWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09QVElPTlNfU0VTU0lPTlNfWE1MID0gUFJFRklYICsgIm9wdGlvbnNfc2Vzc2lvbnNYbWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09QVElPTlNfVEFSR0VUX0RBVEFCQVNFID0gUFJFRklYICsgIm9wdGlvbnNfdGFyZ2V0RGF0YWJhc2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09QVElPTlNfVEFSR0VUX1NFUlZFUiA9IFBSRUZJWCArICJvcHRpb25zX3RhcmdldFNlcnZlciI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0VjbGlwc2VMaW5rVWlNZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNTZiODAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBFbGlwc2VMaW5rIFVJLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9uZXdGaWxlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9uZXdGaWxlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX29wdGlvbnNfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX29wdGlvbnNfZGVzYzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX1RydWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm9vbGVhbl9GYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRXaXRob3V0VmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFdpdGhWYWx1ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sVGFiRm9sZGVyX2RlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFRhYkZvbGRlcl9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3Byb3ZpZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9icm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2Rlc2NyaXB0aW9uOwotCi0JLy8gR2VuZXJhbAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZ2VuZXJhbFNlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfbWFwcGVkQ2xhc3Nlc1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfbWFwcGVkQ2xhc3Nlc1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfeG1sTWFwcGluZ0ZpbGVzU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl94bWxNYXBwaW5nRmlsZXNTZWN0aW9uRGVzY3JpcHRpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX25hbWVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfcGVyc2lzdGVuY2VQcm92aWRlckxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9kZXNjcmlwdGlvbkxhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX21hcHBlZENsYXNzZXNOb05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX29wZW47Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3htbE1hcHBpbmdGaWxlc0RpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfeG1sTWFwcGluZ0ZpbGVzRGlhbG9nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX29ybU5vTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZUVjbGlwc2VsaW5rT3JtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9leGNsdWRlRWNsaXBzZWxpbmtPcm1XaXRoRGVmYXVsdDsKLQotCS8vIENvbm5lY3Rpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9kZWZhdWx0RW1wdHk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdHJhbnNhY3Rpb25UeXBlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9EYXRhYmFzZV9Hcm91cEJveDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlX0VjbGlwc2VMaW5rQ29ubmVjdGlvblBvb2xfR3JvdXBCb3g7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9Db25uZWN0aW9uRGlhbG9nX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlX2p0YTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGVfcmVzb3VyY2VfbG9jYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25hdGl2ZVNxbExhYmVsRGVmYXVsdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iYXRjaFdyaXRpbmdMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9ub25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9qZGJjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9idWZmZXJlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXRjaFdyaXRpbmdDb21wb3NpdGVfb3JhY2xlX2pkYmM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfY2FjaGVTdGF0ZW1lbnRzTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfanRhRGF0YVNvdXJjZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9ub25KdGFEYXRhU291cmNlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfZHJpdmVyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3VybExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91c2VyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3Bhc3N3b3JkTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JpbmRQYXJhbWV0ZXJzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JpbmRQYXJhbWV0ZXJzTGFiZWxEZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NoYXJlZExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTaGFyZWRMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zTWluTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc01heExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zTWluTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3dyaXRlQ29ubmVjdGlvbnNNYXhMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNFeGNsdXNpdmVDb25uZWN0aW9uc1Byb3BlcnRpZXNDb21wb3NpdGVfR3JvdXBCb3g7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2xhenlDb25uZWN0aW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2xhenlDb25uZWN0aW9uTGFiZWxEZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlX2Fsd2F5czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVDb21wb3NpdGVfaXNvbGF0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlX3RyYW5zYWN0aW9uYWw7Ci0JCi0JLy8gU2NoZW1hR2VuZXJhdGlvbgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfc2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdERvdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZGxHZW5lcmF0aW9uVHlwZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9vdXRwdXRNb2RlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfY3JlYXRlRGRsRmlsZU5hbWVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZHJvcERkbEZpbGVOYW1lTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRNb2RlQ29tcG9zaXRlX2JvdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0TW9kZUNvbXBvc2l0ZV9zcWxfc2NyaXB0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dE1vZGVDb21wb3NpdGVfZGF0YWJhc2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZV9ub25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlX2NyZWF0ZV90YWJsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGVfZHJvcF9hbmRfY3JlYXRlX3RhYmxlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZGxHZW5lcmF0aW9uTG9jYXRpb25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZV9kaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nTWVzc2FnZTsKLQotCS8vIENhY2hpbmcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hlRGVmYXVsdHNDb21wb3NpdGVfZ3JvdXBUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0Q2FjaGVUeXBlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2NhY2hlVHlwZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRTaGFyZWRDYWNoZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVEZWZhdWx0TGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZVNpemVDb21wb3NpdGVfY2FjaGVTaXplOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVUeXBlQ29tcG9zaXRlX2Z1bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVUeXBlQ29tcG9zaXRlX2hhcmRfd2VhazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZVR5cGVDb21wb3NpdGVfbm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZVR5cGVDb21wb3NpdGVfc29mdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZVR5cGVDb21wb3NpdGVfc29mdF93ZWFrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hlVHlwZUNvbXBvc2l0ZV93ZWFrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZV9kZWZhdWx0Q2FjaGVTaXplOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9mdWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGVfaGFyZF93ZWFrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGVfbm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlX3NvZnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0X3dlYWs7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV93ZWFrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5RGlhbG9nX3NlbGVjdEVudGl0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlEaWFsb2dfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2dyb3VwVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZWRpdEJ1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfRmx1c2hDbGVhckNhY2hlTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlX2Ryb3A7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlX2Ryb3BfaW52YWxpZGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGbHVzaENsZWFyQ2FjaGVDb21wb3NpdGVfbWVyZ2U7Ci0JCi0JLy8gQ3VzdG9taXphdGlvbgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfc2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ1Byb3BlcnRpZXNHcm91cEJveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdMYXp5TGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGF6eUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdDaGFuZ2VUcmFja2luZ0xhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0NoYW5nZVRyYWNraW5nTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ZldGNoR3JvdXBzTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRmV0Y2hHcm91cHNMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nSW50ZXJuYWxMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdJbnRlcm5hbExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdFYWdlckxhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0VhZ2VyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2RlZmF1bHRFbXB0eTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdGhyb3dFeGNlcHRpb25zTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfZXhjZXB0aW9uSGFuZGxlckxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2VhdmluZ0NvbXBvc2l0ZV90cnVlXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXZWF2aW5nQ29tcG9zaXRlX2ZhbHNlXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXZWF2aW5nQ29tcG9zaXRlX3N0YXRpY187Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9ncm91cFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2VkaXRCdXR0b247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ1RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9jdXN0b21pemVyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Nlc3Npb25DdXN0b21pemVyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX25vTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0aW9uT25seUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0aW9uT25seUxhYmVsRGVmYXVsdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0ZVNjaGVtYUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0ZVNjaGVtYUxhYmVsRGVmYXVsdDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfcHJvZmlsZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfYnJvd3NlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2ZpbGVyQ29tcG9zaXRlX3BlcmZvcm1hbmNlX3Byb2ZpbGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2ZpbGVyQ29tcG9zaXRlX3F1ZXJ5X21vbml0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZmlsZXJDb21wb3NpdGVfbm9fcHJvZmlsZXI7Ci0KLQkvLyBMb2dnaW5nCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZGVmYXVsdFdpdGhPbmVQYXJhbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZGVmYXVsdEVtcHR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9kZWZhdWx0U3Rkb3V0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2NhdGVnb3J5TG9nZ2luZ0xldmVsU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnaW5nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc3FsTG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RyYW5zYWN0aW9uTG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V2ZW50TG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Nvbm5lY3Rpb25Mb2dnaW5nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfcXVlcnlMb2dnaW5nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfY2FjaGVMb2dnaW5nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfcHJvcGFnYXRpb25Mb2dnaW5nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2VxdWVuY2luZ0xvZ2dpbmdMZXZlbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9lamJMb2dnaW5nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZG1zTG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2VqYl9vcl9tZXRhZGF0YUxvZ2dpbmdMZXZlbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9qcGFfbWV0YW1vZGVsTG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3dlYXZlckxvZ2dpbmdMZXZlbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9wcm9wZXJ0aWVzTG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlcnZlckxvZ2dpbmdMZXZlbExhYmVsOwotCQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nTGV2ZWxDb21wb3NpdGVfb2ZmOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dpbmdMZXZlbENvbXBvc2l0ZV9zZXZlcmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX3dhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2luZm87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2NvbmZpZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmVzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nTGV2ZWxDb21wb3NpdGVfYWxsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9vZmY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9zZXZlcmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV93YXJuaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfaW5mbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX2NvbmZpZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmVzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX2FsbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfYnJvd3NlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2VyQ29tcG9zaXRlX2RlZmF1bHRfbG9nZ2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dlckNvbXBvc2l0ZV9qYXZhX2xvZ2dlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnZXJDb21wb3NpdGVfc2VydmVyX2xvZ2dlcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aW1lc3RhbXBMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGltZXN0YW1wTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aHJlYWRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGhyZWFkTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3Nlc3Npb25MYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V4Y2VwdGlvbnNMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZXhjZXB0aW9uc0xhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfY29ubmVjdGlvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9jb25uZWN0aW9uTGFiZWxEZWZhdWx0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnZXJzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2xvZ2dpbmdGaWxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ1RpdGxlOwotCi0JLy8gU2Vzc2lvbiBPcHRpb25zCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9kZWZhdWx0RW1wdHk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvbk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25zWG1sOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMYWJlbERlZmF1bHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZXZlbnRMaXN0ZW5lckxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90YXJnZXREYXRhYmFzZUxhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9taXNjZWxsYW5lb3VzU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9taXNjZWxsYW5lb3VzU2VjdGlvbkRlc2NyaXB0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90ZW1wb3JhbE11dGFibGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGVtcG9yYWxNdXRhYmxlTGFiZWxEZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfYXR0dW5pdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfYXV0bzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9jbG91ZHNjYXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2RhdGFiYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2RiMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kYjJtYWluZnJhbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfZGJhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfZGVyYnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfaHNxbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9pbmZvcm1peDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9qYXZhZGI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfbXlzcWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfb3JhY2xlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTExOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfb3JhY2xlODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9wb2ludGJhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfcG9zdGdyZXNxbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9zcWxhbnl3aGVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9zcWxzZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3liYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3RpbWVzdGVuOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RhcmdldFNlcnZlckxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9ub05hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX29jNGo7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3N1bmFzOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGVfd2Vic3BoZXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJzcGhlcmVfNl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJsb2dpYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGVfd2VibG9naWNfOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGVfd2VibG9naWNfMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX2pib3NzOwotCi0JLy8gRERMIEdlbmVyYXRpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2dlbmVyYXRpbmdERExXYXJuaW5nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaV9nZW5lcmF0aW5nRERMV2FybmluZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaV9lcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQ0xJUFNFTElOS19HRU5FUkFURV9UQUJMRVNfSk9COwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVDTElQU0VMSU5LX0dFTkVSQVRFX1RBQkxFU19UQVNLOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImVjbGlwc2VsaW5rX3VpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzczsKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOwotCX0KLQkKLQlwcml2YXRlIEVjbGlwc2VMaW5rVWlNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGRsZ2VuL0VjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE2ZGRjMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGRsZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmRkbGdlbi5FY2xpcHNlTGlua0RETEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZGxnZW4ud2l6YXJkcy5HZW5lcmF0ZURETFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0RMTEdlbmVyYXRvclVpIGlzIHVzZWQgYnkgdGhlIEVjbGlwc2VMaW5rUGxhdGZvcm1VaSB0byBpbml0aWF0ZSAKLSAqICB0aGUgZXhlY3V0aW9uIG9mIEVjbGlwc2VMaW5rIERETCBnZW5lcmF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpCi17Ci0JcHJpdmF0ZSBmaW5hbCBKcGFQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3RyaW5nVG9vbHMuQ1I7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKEpwYVByb2plY3QgcHJvamVjdCkgewotCQluZXcgRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaShwcm9qZWN0KS5nZW5lcmF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpKEpwYVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcigpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlKCkgewotCQkKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0cygpLm5leHQoKTsgLy8gVGFrZSB0aGUgZmlyc3QgcGVyc2lzdGVuY2VVbml0Ci0JCVN0cmluZyBwdU5hbWUgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpOwotCQlpZiggISB0aGlzLmRpc3BsYXlHZW5lcmF0aW5nRERMV2FybmluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUdlbmVyYXRlRERMV2l6YXJkIHdpemFyZCA9IG5ldyBHZW5lcmF0ZURETFdpemFyZCh0aGlzLnByb2plY3QpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyh0aGlzLmdldEN1cnJlbnRTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWlmKHdpemFyZC5nZXRQYWdlQ291bnQoKSA+IDApIHsKLQkJCWludCByZXR1cm5Db2RlID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZXR1cm5Db2RlID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJV29ya3NwYWNlSm9iIGpvYiA9IHRoaXMuYnVpbGRHZW5lcmF0ZURETEpvYihwdU5hbWUsIHRoaXMucHJvamVjdCk7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgV29ya3NwYWNlSm9iIGJ1aWxkR2VuZXJhdGVERExKb2IoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJhdGVERExKb2IocHVOYW1lLCBwcm9qZWN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBTaGVsbCBnZXRDdXJyZW50U2hlbGwoKSB7Ci0JICAgIHJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwbGF5R2VuZXJhdGluZ0RETFdhcm5pbmcoKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUy5iaW5kKAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0RETFdhcm5pbmdNZXNzYWdlLAotCQkJQ1IsICBDUiArIENSKTsKLQkJCQotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oCi0JCQl0aGlzLmdldEN1cnJlbnRTaGVsbCgpLCAKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2dlbmVyYXRpbmdERExXYXJuaW5nVGl0bGUsIAotCQkJbWVzc2FnZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBQZXJzaXN0ZW5jZSBVbml0ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybSBnZXRQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBnZXRQZXJzaXN0ZW5jZVVuaXRzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZSgpLnBlcnNpc3RlbmNlVW5pdHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgZ2V0UGVyc2lzdGVuY2UoKSB7Ci0JCXJldHVybiB0aGlzLnByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogcnVubmFibGUgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBHZW5lcmF0ZURETEpvYiBleHRlbmRzIFdvcmtzcGFjZUpvYiB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHB1TmFtZTsKLQkJcHJpdmF0ZSBmaW5hbCBKcGFQcm9qZWN0IHByb2plY3Q7Ci0KLQkJcHVibGljIEdlbmVyYXRlRERMSm9iKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QgcHJvamVjdCkgewotCQkJc3VwZXIoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVDTElQU0VMSU5LX0dFTkVSQVRFX1RBQkxFU19KT0IpOwotCQkJdGhpcy5wdU5hbWUgPSBwdU5hbWU7Ci0JCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRUNMSVBTRUxJTktfR0VORVJBVEVfVEFCTEVTX1RBU0ssIDEpOwotCQkJdHJ5IHsKLQkJCQl0aGlzLmRkbEdlbmVyYXRvckdlbmVyYXRlKHRoaXMucHVOYW1lLCB0aGlzLnByb2plY3QsIHNtLm5ld0NoaWxkKDEpKTsKLQkJCX0gCi0JCQljYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQkJCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IHJlLmdldE1lc3NhZ2UoKTsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IChtc2cgPT0gbnVsbCkgPyByZS50b1N0cmluZygpIDogbXNnOwotCQkJCQotCQkJCXRoaXMubG9nRXJyb3IobWVzc2FnZSk7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24ocmUpOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBkZGxHZW5lcmF0b3JHZW5lcmF0ZShTdHJpbmcgcHVOYW1lLCBKcGFQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJRWNsaXBzZUxpbmtERExHZW5lcmF0b3IuZ2VuZXJhdGUocHVOYW1lLCBwcm9qZWN0LCBtb25pdG9yKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQl0aGlzLmRpc3BsYXlFcnJvcihtZXNzYWdlKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoCi0JCQkJCWdldFNoZWxsKCksCi0JCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2Vycm9yLAotCQkJCQltZXNzYWdlCi0JCQkJKTsKLQkJfQotCi0JCXByaXZhdGUgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJCVNoZWxsIHNoZWxsID0gKGRpc3BsYXkgPT0gbnVsbCkgPyBudWxsIDogZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpOwotCQkJaWYgKHNoZWxsID09IG51bGwgJiYgZGlzcGxheSAhPSBudWxsKSB7Ci0JCQkJU2hlbGxbXSBzaGVsbHMgPSBkaXNwbGF5LmdldFNoZWxscygpOwotCQkJCWlmIChzaGVsbHMubGVuZ3RoID4gMCkKLQkJCQkJc2hlbGwgPSBzaGVsbHNbMF07Ci0JCQl9Ci0JCQlyZXR1cm4gc2hlbGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vd2l6YXJkcy9HZW5lcmF0ZURETFdpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGRsZ2VuL3dpemFyZHMvR2VuZXJhdGVERExXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0ZTViMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vd2l6YXJkcy9HZW5lcmF0ZURETFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZGxnZW4ud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlOwotCi0vKioKLSAqICBHZW5lcmF0ZURETFdpemFyZAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVERExXaXphcmQgZXh0ZW5kcyBXaXphcmQgewkKLQotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCi0JcHJpdmF0ZSBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UgZGJTZXR0aW5nc1BhZ2U7Ci0KLQlwdWJsaWMgR2VuZXJhdGVERExXaXphcmQoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7Ci0JCXRoaXMuc2V0V2luZG93VGl0bGUoSnB0VWlNZXNzYWdlcy5HZW5lcmF0ZURETFdpemFyZF90aXRsZSk7IAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc3VwZXIuYWRkUGFnZXMoKTsKLQkJaWYgKHRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgPT0gbnVsbCkgewotCQkJdGhpcy5kYlNldHRpbmdzUGFnZSA9IG5ldyBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UodGhpcy5qcGFQcm9qZWN0KTsKLQkJCXRoaXMuYWRkUGFnZSh0aGlzLmRiU2V0dGluZ3NQYWdlKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgIT0gbnVsbCk7Ci0JfQotICAgIAotICAgIEBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZGJTZXR0aW5nc1BhZ2UuaXNQYWdlQ29tcGxldGUoKTsKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBnZXRKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmpwYVByb2plY3QuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxYTRlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb248TSwgVCBleHRlbmRzIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotewotCXByb3RlY3RlZCBBYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KUEFfQ09OVEVOVCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyODUxYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQgZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotewotCXByb3RlY3RlZCBBYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpQQV9DT05URU5UKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX01BUF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhZGZkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb248TSwgVCBleHRlbmRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuSlBBX0NPTlRFTlQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVFJBTlNGT1JNQVRJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDBlMDVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotewkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpQQV9DT05URU5UKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5WQVJJQUJMRV9PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYxM2M1ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotCi0vKioKLSAqIFRoaXMgY29tcG9zaXRlIHNpbXBseSBzaG93cyBhIHRyaS1zdGF0ZSBjaGVjayBib3ggZm9yIHRoZSBBbHdheXMgUmVmcmVzaCBvcHRpb24uCi0gKiAKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ2FjaGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9wdGlvbmFsQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGVfYWx3YXlzUmVmcmVzaExhYmVsLAotCQkJYnVpbGRBbHdheXNSZWZyZXNoSG9sZGVyKCksCi0JCQlidWlsZEFsd2F5c1JlZnJlc2hTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ0FDSElOR19BTFdBWVNfUkVGUkVTSAotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQWx3YXlzUmVmcmVzaEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEFsd2F5c1JlZnJlc2hTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRBbHdheXNSZWZyZXNoSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZV9hbHdheXNSZWZyZXNoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlX2Fsd2F5c1JlZnJlc2hMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0QWx3YXlzUmVmcmVzaEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFksCi0JCQlFY2xpcHNlTGlua0NhY2hpbmcuREVGQVVMVF9BTFdBWVNfUkVGUkVTSF9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5M2UyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDk4ODk2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb09uZU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZjJkYWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RCYXNpY01hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkVudW1UeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UZW1wb3JhbFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRW51bVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE11dGFibGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgTG9iQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQmFzaWNNYXBwaW5nCi0gKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQotICogQHNlZSBFbnVtVHlwZUNvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgTG9iQ29tcG9zaXRlCi0gKiBAc2VlIE9wdGlvbmFsQ29tcG9zaXRlCi0gKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIEJhc2ljTWFwcGluZz4gZXh0ZW5kcyBBYnN0cmFjdEJhc2ljTWFwcGluZ0NvbXBvc2l0ZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzaWNNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQmFzaWNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNCkpOwotCQluZXcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkTXV0YWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVHlwZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkoKEdyaWRMYXlvdXQpIGNvbnRhaW5lci5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0KLQkJLy8gTm8gY29udmVydGVyCi0JCUJ1dHRvbiBub0NvbnZlcnRlckJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2RlZmF1bHQsIAotCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKENvbnZlcnRlci5OT19DT05WRVJURVIpLCAKLQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBub0NvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCi0JCS8vIExvYgotCQlCdXR0b24gbG9iQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fbG9iLCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihDb252ZXJ0ZXIuTE9CX0NPTlZFUlRFUiksIAotCQkJbnVsbCk7Ci0JCSgoR3JpZERhdGEpIGxvYkJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlciA9IGJ1aWxkQ29udmVydGVySG9sZGVyKCk7Ci0JCS8vIFRlbXBvcmFsCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX3RlbXBvcmFsLCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKSwgCi0JCQludWxsKTsKLQkJcmVnaXN0ZXJTdWJQYW5lKG5ldyBUZW1wb3JhbFR5cGVDb21wb3NpdGUoYnVpbGRUZW1wb3JhbENvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSkpOwotCQkKLQkJCi0JCS8vIEVudW1lcmF0ZWQKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fZW51bWVyYXRlZCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoQ29udmVydGVyLkVOVU1FUkFURURfQ09OVkVSVEVSKSwgCi0JCQludWxsKTsKLQkJcmVnaXN0ZXJTdWJQYW5lKG5ldyBFbnVtVHlwZUNvbXBvc2l0ZShidWlsZEVudW1lcmF0ZWRDb252ZXJ0ZXJIb2xkZXIoY29udmVydGVySG9sZGVyKSwgY29udGFpbmVyLCBnZXRXaWRnZXRGYWN0b3J5KCkpKTsKLQotCQkvLyBFY2xpcHNlTGluayBDb252ZXJ0ZXIKLQkJQnV0dG9uIGVsQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9jb252ZXJ0ZWQsIAotCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSwgCi0JCQludWxsKTsKLQkJKChHcmlkRGF0YSkgZWxDb252ZXJ0ZXJCdXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGNvbnZlcnRDb21wb3NpdGUgPSBidWlsZENvbnZlcnRDb21wb3NpdGUoYnVpbGRFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCBjb250YWluZXIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgY29udmVydENvbXBvc2l0ZS5nZXRDb250cm9sKCkuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJcmVnaXN0ZXJTdWJQYW5lKGNvbnZlcnRDb21wb3NpdGUpOwotCX0KLQotCXByb3RlY3RlZCBQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4gYnVpbGRDb252ZXJ0Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnQ+IGNvbnZlcnRIb2xkZXIsIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUoY29udmVydEhvbGRlciwgY29udGFpbmVyLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rTXV0YWJsZT4gYnVpbGRNdXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxCYXNpY01hcHBpbmcsIEVjbGlwc2VMaW5rTXV0YWJsZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua011dGFibGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0TXV0YWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydD4gYnVpbGRFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rQ29udmVydD4oY29udmVydGVySG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnQgdHJhbnNmb3JtXyhDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIgPyAoRWNsaXBzZUxpbmtDb252ZXJ0KSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM3YWRkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENvb3JkaW5hdGlvbiBUeXBlOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0NhY2hpbmc+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2FjaGVUeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZT4gYWRkQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NhY2hpbmcuREVGQVVMVF9DT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9DT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5jbGFzcywKLQkJCQkJRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUudGhpcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKHZhbHVlKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfbGFiZWwsCi0JCQlhZGRDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21ibyhjb250YWluZXIpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5DQUNISU5HX0NBQ0hFX0NPT1JESU5BVElPTl9UWVBFCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjgxYWI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICBTaXplOiAgICAgICAgICAgICAgfCBJICAgICAgICAgfEl8ICBEZWZhdWx0IChYWFgpICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtDYWNoaW5nPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhY2hlU2l6ZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWFkZFNpemVDb21ibyhjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkU2l6ZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEludGVnZXJDb21ibzxFY2xpcHNlTGlua0NhY2hpbmc+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlX3NpemU7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJCQlyZXR1cm4gbnVsbDsvL0pwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX0xFTkdUSDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfU0laRV9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1NJWkVfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRTaXplKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRTaXplKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYTAwMzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBUeXBlOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtDYWNoaW5nPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhY2hlVHlwZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEVjbGlwc2VMaW5rQ2FjaGluZywgRWNsaXBzZUxpbmtDYWNoZVR5cGU+IGFkZENhY2hlVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBFY2xpcHNlTGlua0NhY2hlVHlwZT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfVFlQRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9UWVBFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZVR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua0NhY2hlVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtDYWNoZVR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLmNsYXNzLAotCQkJCQlFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZS50aGlzLAotCQkJCQl2YWx1ZQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFR5cGUodmFsdWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9sYWJlbCwKLQkJCWFkZENhY2hlVHlwZUNvbWJvKGNvbnRhaW5lciksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkNBQ0hJTkdfQ0FDSEVfVFlQRQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTNhZjcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBleHRlbmRzIFBhbmU8VD4KLXsKLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAotICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vU2hhcmVkIENoZWNrIGJveCwgdW5jaGVjayB0aGlzIGFuZCB0aGUgcmVzdCBvZiB0aGUgcGFuZWwgaXMgZGlzYWJsZWQKLQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDgpLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfc2hhcmVkTGFiZWwsCi0JCQlidWlsZFNwZWNpZmllZFNoYXJlZEhvbGRlcigpLAotCQkJYnVpbGRTaGFyZWRTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ0FDSElOR19TSEFSRUQKLQkJKTsKLQotCQlDb21wb3NpdGUgc3ViUGFuZSA9IGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCAxNik7Ci0KLQkJQ29sbGVjdGlvbjxQYW5lPD8+PiBwYW5lcyA9IG5ldyBBcnJheUxpc3Q8UGFuZTw/Pj4oKTsKLQkJCi0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUodGhpcywgc3ViUGFuZSkpOwotCQlwYW5lcy5hZGQobmV3IEVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlKHRoaXMsIHN1YlBhbmUpKTsKLQkJCi0JCS8vIEFkdmFuY2VkIHN1Yi1wYW5lCi0JCUNvbXBvc2l0ZSBhZHZhbmNlZFNlY3Rpb24gPSBhZGRDb2xsYXBzaWJsZVN1YlNlY3Rpb24oCi0JCQlzdWJQYW5lLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfYWR2YW5jZWQsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpCi0JCSk7Ci0KLQkJaW5pdGlhbGl6ZUFkdmFuY2VkUGFuZShhZGRTdWJQYW5lKGFkdmFuY2VkU2VjdGlvbiwgMCwgMTYpLCBwYW5lcyk7Ci0JCQkKLQkJbmV3IFBhbmVFbmFibGVyKGJ1aWxkU2hhcmVkQ2FjaGVFbmFibGVyKCksIHBhbmVzKTsKLQkJCi0JCWluaXRpYWxpemVFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShhZGRTdWJQYW5lKGNvbnRhaW5lciwgOCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWR2YW5jZWRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIENvbGxlY3Rpb248UGFuZTw/Pj4gcGFuZXMpIHsKLQkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKLQkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKLQkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZUV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpOwotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2hhcmVkQ2FjaGVFbmFibGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgCi0JCQkJRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9TSEFSRURfUFJPUEVSVFksIAotCQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1NIQVJFRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc1NoYXJlZCgpKTsKLQkJCX0KLQkJfTsKLQl9CQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTcGVjaWZpZWRTaGFyZWRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1NIQVJFRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFNoYXJlZCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZFNoYXJlZCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNoYXJlZFN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFNoYXJlZEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfc2hhcmVkTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfc2hhcmVkTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFNoYXJlZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfU0hBUkVEX1BST1BFUlRZLAotCQkJRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfU0hBUkVEX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkU2hhcmVkKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWQ4MWQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgIAkJCSAgCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQ2hhbmdlIFRyYWNraW5nIDogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgCQkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2hhbmdlVHJhY2tpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLCAKLQkJCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKCAKLSAgICAgICAgICAgIGNvbnRhaW5lciwKLSAgICAgICAgICAgIGFkZExhYmVsKCAKLSAgICAgICAgICAgICAgICAgY29udGFpbmVyLCAKLSAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlX2xhYmVsKSwgCi0gICAgICAgICAgICBhZGRDaGFuZ2VUcmFja2luZ1R5cGVDb21ibyhjb250YWluZXIpLmdldENvbnRyb2woKSwgCi0gICAgICAgICAgICBudWxsIAotICAgICAgICk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcsIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlPiBhZGRDaGFuZ2VUcmFja2luZ1R5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcsIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLkRFRkFVTFRfVFlQRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5TUEVDSUZJRURfVFlQRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5jbGFzcywKLQkJCQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZS50aGlzLAotCQkJCQl2YWx1ZQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFR5cGUodmFsdWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNmYwODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5EaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlZhbGlkYXRpbmdEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBDbGllbnRzIGNhbiB1c2UgdGhpcyBkaWFsb2cgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciBTZWNvbmRhcnlUYWJsZSBzZXR0aW5ncy4KLSAqIFVzZSB0aGUgZm9sbG93aW5nIG9uY2UgdGhlIGRpYWxvZyBpcyBjbG9zZWQ6Ci0gKiAgICAgQHNlZSAjZ2V0U2VsZWN0ZWRUYWJsZSgpCi0gKiAgICAgQHNlZSAjZ2V0U2VsZWN0ZWRDYXRhbG9nKCkKLSAqICAgICBAc2VlICNnZXRTZWxlY3RlZFNjaGVtYSgpCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nIGV4dGVuZHMgVmFsaWRhdGluZ0RpYWxvZzxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0PiB7Ci0KLQkvKioKLQkgKiB3aGVuIGNyZWF0aW5nIGEgbmV3IEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLCAnY29udmVyc2lvblZhbHVlJyB3aWxsIGJlIG51bGwKLQkgKi8KLQlwcml2YXRlIGZpbmFsIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZTsKLQotCXByaXZhdGUgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgdG8gY3JlYXRlIGEgbmV3IGNvbnZlcnNpb24gdmFsdWUKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2coU2hlbGwgcGFyZW50LCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlcikgewotCQl0aGlzKHBhcmVudCxvYmplY3RUeXBlQ29udmVydGVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciB0byBlZGl0IGFuIGV4aXN0aW5nIGNvbnZlcnNpb24gdmFsdWUKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2coU2hlbGwgcGFyZW50LCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlciwgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlciA9IG9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JCXRoaXMuY29udmVyc2lvblZhbHVlID0gY29udmVyc2lvblZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0IGJ1aWxkU3RhdGVPYmplY3QoKSB7Ci0JCVN0cmluZyBkYXRhVmFsdWUgPSBudWxsOwotCQlTdHJpbmcgb2JqZWN0VmFsdWUgPSBudWxsOwotCQlTZXQ8U3RyaW5nPiBkYXRhVmFsdWVzID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIuZGF0YVZhbHVlcygpKTsKLQkJaWYgKGlzRWRpdERpYWxvZygpKSB7Ci0JCQlkYXRhVmFsdWUgPSB0aGlzLmNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKTsKLQkJCW9iamVjdFZhbHVlID0gdGhpcy5jb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKTsKLQkJCS8vcmVtb3ZlICp0aGlzKiBkYXRhVmFsdWUsIGRvbid0IHdhbnQgYSBkdXBsaWNhdGUgZGF0YSB2YWx1ZSBlcnJvcgotCQkJZGF0YVZhbHVlcy5yZW1vdmUoZGF0YVZhbHVlKTsKLQkJfQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3QoCi0JCQlkYXRhVmFsdWUsIAotCQkJb2JqZWN0VmFsdWUsIAotCQkJZGF0YVZhbHVlcyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBvcGVuICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dCh0aGlzLmdldFRpdGxlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiAodGhpcy5pc0FkZERpYWxvZygpKSA/Ci0JCQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2FkZENvbnZlcnNpb25WYWx1ZQotCQkJCQk6Ci0JCQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2VkaXRDb252ZXJzaW9uVmFsdWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvblRpdGxlKCkgewotCQlyZXR1cm4gKHRoaXMuaXNBZGREaWFsb2coKSkgPwotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19hZGRDb252ZXJzaW9uVmFsdWVEZXNjcmlwdGlvblRpdGxlCi0JCToKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZWRpdENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uVGl0bGU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAodGhpcy5pc0FkZERpYWxvZygpKSA/Ci0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2FkZENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uCi0JCToKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZWRpdENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGlhbG9nUGFuZTxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0PiBidWlsZExheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZShjb250YWluZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCi0JCUNvbnZlcnNpb25WYWx1ZURpYWxvZ1BhbmUgcGFuZSA9IChDb252ZXJzaW9uVmFsdWVEaWFsb2dQYW5lKSBnZXRQYW5lKCk7Ci0JCXBhbmUuc2VsZWN0QWxsKCk7Ci0KLQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FkZERpYWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlID09IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0RGlhbG9nKCkgewotCQlyZXR1cm4gISB0aGlzLmlzQWRkRGlhbG9nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhIHZhbHVlIHNldCBpbiB0aGUgdGV4dCB3aWRnZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhVmFsdWUoKSB7Ci0JCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGF0YVZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdmFsdWUgc2V0IGluIHRoZSB0ZXh0IHdpZGdldC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFZhbHVlKCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldE9iamVjdFZhbHVlKCk7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZSBleHRlbmRzIERpYWxvZ1BhbmU8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdD4gewotCi0JCXByaXZhdGUgVGV4dCBkYXRhVmFsdWVUZXh0OwotCQlwcml2YXRlIFRleHQgb2JqZWN0VmFsdWVUZXh0OwotCi0JCUNvbnZlcnNpb25WYWx1ZURpYWxvZ1BhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2cudGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIHBhcmVudCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQl0aGlzLmRhdGFWYWx1ZVRleHQgPSBhZGRMYWJlbGVkVGV4dCgKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19kYXRhVmFsdWUsCi0JCQkJYnVpbGREYXRhVmFsdWVIb2xkZXIoKQotCQkJKTsKLQkJCQotCQkJdGhpcy5vYmplY3RWYWx1ZVRleHQgPSBhZGRMYWJlbGVkVGV4dCgKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19vYmplY3RWYWx1ZSwKLQkJCQlidWlsZE9iamVjdFZhbHVlSG9sZGVyKCkKLQkJCSk7Ci0JCX0KLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREYXRhVmFsdWVIb2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdC5EQVRBX1ZBTFVFX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREYXRhVmFsdWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXREYXRhVmFsdWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRPYmplY3RWYWx1ZUhvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0Lk9CSkVDVF9WQUxVRV9QUk9QRVJUWSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0T2JqZWN0VmFsdWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRPYmplY3RWYWx1ZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXZvaWQgc2VsZWN0QWxsKCkgewotCQkJdGhpcy5kYXRhVmFsdWVUZXh0LnNlbGVjdEFsbCgpOwotCQkJdGhpcy5vYmplY3RWYWx1ZVRleHQuc2VsZWN0QWxsKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTE3ZDllYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLkFic3RyYWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Qcm9ibGVtOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHN0YXRlIG9iamVjdCB1c2VkIGJ5IHRoZSA8Y29kZT5OZXdOYW1lRGlhbG9nPC9jb2RlPiwgd2hpY2ggc3RvcmVzCi0gKiB0aGUgY3VycmVudCBuYW1lIGFuZCB2YWxpZGF0ZXMgaXQgd2hlbiBpdCBpcyBtb2RpZmllZC4KLSAqCi0gKiBAc2VlIE5ld05hbWVEaWFsb2cKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1maW5hbCBjbGFzcyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0IGV4dGVuZHMgQWJzdHJhY3ROb2RlCi17Ci0JLyoqCi0JICogVGhlIGluaXRpYWwgZGF0YVZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGF0YVZhbHVlOwotCQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGRhdGEgdmFsdWVzIHRoYXQgY2FuJ3QgYmUgdXNlZCBvciBhbiBlbXB0eSBjb2xsZWN0aW9uCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gZGF0YVZhbHVlczsKLQotCS8qKgotCSAqIFRoZSBpbml0aWFsIG9iamVjdFZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgb2JqZWN0VmFsdWU7Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+VmFsaWRhdG9yPC9jb2RlPiB1c2VkIHRvIHZhbGlkYXRlIHRoaXMgc3RhdGUgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCS8qKgotCSAqIE5vdGlmaWVzIGEgY2hhbmdlIGluIHRoZSBkYXRhIHZhbHVlIHByb3BlcnR5LgotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9WQUxVRV9QUk9QRVJUWSA9ICJkYXRhVmFsdWUiOwotCQotCS8qKgotCSAqIE5vdGlmaWVzIGEgY2hhbmdlIGluIHRoZSBvYmplY3QgdmFsdWUgcHJvcGVydHkuCi0JICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfVkFMVUVfUFJPUEVSVFkgPSAib2JqZWN0VmFsdWUiOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OZXdOYW1lU3RhdGVPYmplY3Q8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIG5hbWUgVGhlIGluaXRpYWwgaW5wdXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaW5pdGlhbCB2YWx1ZSBjYW4KLQkgKiBiZSBzcGVjaWZpZWQKLQkgKiBAcGFyYW0gbmFtZXMgVGhlIGNvbGxlY3Rpb24gb2YgbmFtZXMgdGhhdCBjYW4ndCBiZSB1c2VkIG9yIGFuIGVtcHR5Ci0JICogY29sbGVjdGlvbiBpZiBub25lIGFyZSBhdmFpbGFibGUKLQkgKi8KLQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0KFN0cmluZyBkYXRhVmFsdWUsIFN0cmluZyBvYmplY3RWYWx1ZSwgQ29sbGVjdGlvbjxTdHJpbmc+IGRhdGFWYWx1ZXMpIHsKLQkJc3VwZXIobnVsbCk7Ci0KLQkJdGhpcy5kYXRhVmFsdWUgID0gZGF0YVZhbHVlOwotCQl0aGlzLm9iamVjdFZhbHVlID0gb2JqZWN0VmFsdWU7Ci0JCXRoaXMuZGF0YVZhbHVlcyA9IGRhdGFWYWx1ZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZERhdGFWYWx1ZVByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5kYXRhVmFsdWUpKSB7Ci0JCQljdXJyZW50UHJvYmxlbXMuYWRkKGJ1aWxkUHJvYmxlbShFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3RfZGF0YVZhbHVlTXVzdEJlU3BlY2lmaWVkKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5kYXRhVmFsdWVzLmNvbnRhaW5zKHRoaXMuZGF0YVZhbHVlKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0X2RhdGFWYWx1ZUFscmVhZHlFeGlzdHMpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRPYmplY3RWYWx1ZVByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5vYmplY3RWYWx1ZSkpIHsKLQkJCWN1cnJlbnRQcm9ibGVtcy5hZGQoYnVpbGRQcm9ibGVtKEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdF9vYmplY3RWYWx1ZU11c3RCZVNwZWNpZmllZCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvYmxlbXNUbyhMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgewotCQlzdXBlci5hZGRQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JCWFkZERhdGFWYWx1ZVByb2JsZW1zVG8oY3VycmVudFByb2JsZW1zKTsKLQkJYWRkT2JqZWN0VmFsdWVQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tQYXJlbnQoTm9kZSBwYXJlbnROb2RlKSB7Ci0JCS8vbm90IHBhcmVudAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JU3RyaW5nIGdldERhdGFWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVZhbHVlOwotCX0KLQotCVN0cmluZyBnZXRPYmplY3RWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YVZhbHVlKFN0cmluZyBkYXRhVmFsdWUpIHsKLQkJU3RyaW5nIG9sZERhdGFWYWx1ZSA9IHRoaXMuZGF0YVZhbHVlOwotCQl0aGlzLmRhdGFWYWx1ZSA9IGRhdGFWYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1ZBTFVFX1BST1BFUlRZLCBvbGREYXRhVmFsdWUsIGRhdGFWYWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VmFsdWUoU3RyaW5nIG9iamVjdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGRPYmplY3RWYWx1ZSA9IHRoaXMub2JqZWN0VmFsdWU7Ci0JCXRoaXMub2JqZWN0VmFsdWUgPSBvYmplY3RWYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVkFMVUVfUFJPUEVSVFksIG9sZE9iamVjdFZhbHVlLCBvYmplY3RWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnZhbGlkYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmMGUzNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0xpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEVudW0gVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnQKLSAqIEBzZWUgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+Ci17Ci0KLQkvKioKLQkgKiBBIGtleSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGVmYXVsdCB2YWx1ZSwgdGhpcyBpcyByZXF1aXJlZCB0byBjb252ZXJ0Ci0JICogdGhlIHNlbGVjdGVkIGl0ZW0gZnJvbSBhIGNvbWJvIHRvIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzIGtleSBpcyBtb3N0Ci0JICogbGlrZWx5IG5ldmVyIHR5cGVkIHRoZSB1c2VyIGFuZCBpdCB3aWxsIGhlbHAgdG8gY29udmVydCB0aGUgdmFsdWUgdG8KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIGl0J3MgdGltZSB0byBzZXQgdGhlIG5ldyBzZWxlY3RlZCB2YWx1ZSBpbnRvIHRoZQotCSAqIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfS0VZID0gIj8hIyE/Iz8jP2RlZmF1bHQ/Iz8hIz8hIz8iOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtVHlwZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbWJvIGNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9jb252ZXJ0ZXJOYW1lTGFiZWwsCi0JCQlidWlsZENvbnZlcnROYW1lTGlzdEhvbGRlcigpLAotCQkJYnVpbGRDb252ZXJ0TmFtZUhvbGRlcigpLAotCQkJYnVpbGROYW1lQ29udmVydGVyKCksCi0JCQludWxsCi0JCSk7Ci0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JCQotCQlDb21wb3NpdGUgc3ViU2VjdGlvbiA9IGFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCWNvbnRhaW5lciwgCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9kZWZpbmVDb252ZXJ0ZXJTZWN0aW9uLCAKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSkpOwotCQkKLQkJLy8gTm8gQ29udmVydGVyCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJc3ViU2VjdGlvbiwgCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9kZWZhdWx0LCAKLQkJCWJ1aWxkTm9Db252ZXJ0ZXJIb2xkZXIoKSwgCi0JCQludWxsKTsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIgPSBidWlsZENvbnZlcnRlckhvbGRlcigpOwotCQkvLyBDdXN0b21Db252ZXJ0ZXIKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQlzdWJTZWN0aW9uLCAKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2N1c3RvbSwgCi0JCQlidWlsZENvbnZlcnRlckhvbGRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSKSwgCi0JCQludWxsKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUgY29udmVydGVyQ29tcG9zaXRlID0gbmV3IEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyQ29tcG9zaXRlKGJ1aWxkQ3VzdG9tQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIHN1YlNlY3Rpb24sIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBjb252ZXJ0ZXJDb21wb3NpdGUuZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlyZWdpc3RlclN1YlBhbmUoY29udmVydGVyQ29tcG9zaXRlKTsKLQkJCi0JCS8vIFR5cGUgQ29udmVydGVyCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJc3ViU2VjdGlvbiwgCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV90eXBlLCAKLQkJCWJ1aWxkQ29udmVydGVySG9sZGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKSwgCi0JCQludWxsKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlIHR5cGVDb252ZXJ0ZXJDb21wb3NpdGUgPSBuZXcgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlKGJ1aWxkVHlwZUNvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCBzdWJTZWN0aW9uLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IChHcmlkRGF0YSkgdHlwZUNvbnZlcnRlckNvbXBvc2l0ZS5nZXRDb250cm9sKCkuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCXJlZ2lzdGVyU3ViUGFuZSh0eXBlQ29udmVydGVyQ29tcG9zaXRlKTsKLQotCQkvLyBPYmplY3QgVHlwZSBDb252ZXJ0ZXIKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQlzdWJTZWN0aW9uLCAKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX29iamVjdFR5cGUsIAotCQkJYnVpbGRDb252ZXJ0ZXJIb2xkZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSwgCi0JCQludWxsKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlIG9iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUgPSBuZXcgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlKGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCBzdWJTZWN0aW9uLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IChHcmlkRGF0YSkgb2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZS5nZXRDb250cm9sKCkuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCXJlZ2lzdGVyU3ViUGFuZShvYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlKTsKLQotCQkvLyBTdHJ1Y3QgQ29udmVydGVyCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJc3ViU2VjdGlvbiwgCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9zdHJ1Y3QsIAotCQkJYnVpbGRDb252ZXJ0ZXJIb2xkZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUiksIAotCQkJbnVsbCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQ29tcG9zaXRlIHN0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZShidWlsZFN0cnVjdENvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCBzdWJTZWN0aW9uLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IChHcmlkRGF0YSkgc3RydWN0Q29udmVydGVyQ29tcG9zaXRlLmdldENvbnRyb2woKS5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJcmVnaXN0ZXJTdWJQYW5lKHN0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSk7Ci0JCQotCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRCb29sZWFuSG9sZGVyKCksIHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbnZlcnROYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnQsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnQuU1BFQ0lGSUVEX0NPTlZFUlRFUl9OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCS8vIENvbnZlcnQgdGhlIGRlZmF1bHQgdmFsdWUgb3IgYW4gZW1wdHkgc3RyaW5nIHRvIG51bGwKLQkJCQlpZiAoKHZhbHVlICE9IG51bGwpICYmCi0JCQkJICAgKCh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB8fCB2YWx1ZS5zdGFydHNXaXRoKERFRkFVTFRfS0VZKSkpIHsKLQotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29udmVydE5hbWVMaXN0SG9sZGVyKCkgewotCQlqYXZhLnV0aWwuTGlzdDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQlsaXN0LmFkZChidWlsZERlZmF1bHROYW1lTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGRSZXNlcnZlZENvbnZlcnRlck5hbWVMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZENvbnZlcnRlck5hbWVMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4obGlzdCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdE5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZERlZmF1bHROYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDb252ZXJ0LkRFRkFVTFRfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHRoaXMuc3ViamVjdC5nZXREZWZhdWx0Q29udmVydGVyTmFtZSgpOwotCi0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gREVGQVVMVF9LRVk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQluYW1lID0gREVGQVVMVF9LRVkgKyBuYW1lOwotCQkJCX0KLQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGROYW1lQ29udmVydGVyKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlpZiAoZ2V0U3ViamVjdCgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIHZhbHVlOwotCQkJCX0KLQotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRDb252ZXJ0ZXJOYW1lKCk7Ci0KLQkJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gREVGQVVMVF9LRVkgKyB2YWx1ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZhbHVlID0gREVGQVVMVF9LRVk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAodmFsdWUuc3RhcnRzV2l0aChERUZBVUxUX0tFWSkpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHROYW1lID0gdmFsdWUuc3Vic3RyaW5nKERFRkFVTFRfS0VZLmxlbmd0aCgpKTsKLQotCQkJCQlpZiAoZGVmYXVsdE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQl2YWx1ZSA9IE5MUy5iaW5kKAotCQkJCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJCQkJZGVmYXVsdE5hbWUKLQkJCQkJCSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2YWx1ZSA9IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFbXB0eTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFJlc2VydmVkQ29udmVydGVyTmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8U3RyaW5nPihFY2xpcHNlTGlua0NvbnZlcnQuUkVTRVJWRURfQ09OVkVSVEVSX05BTUVTKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb252ZXJ0ZXJOYW1lTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPigKLQkJCWJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdC5DT05WRVJURVJTX0xJU1QpLy9UT0RPIG5lZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgaW50ZXJmYWNlCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5saXN0SXRlcmF0b3IoQXJyYXlUb29scy5zb3J0KHRoaXMuc3ViamVjdC51bmlxdWVDb252ZXJ0ZXJOYW1lcygpKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnQsIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIGdldFN1YmplY3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDb252ZXJ0LkNPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXIoKSA9PSBudWxsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLk5PX0NPTlZFUlRFUik7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ29udmVydGVySG9sZGVyKGZpbmFsIFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnQuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCUVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXIoKTsKLQkJCQlpZiAoY29udmVydGVyID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoY29udmVydGVyLmdldFR5cGUoKSA9PSBjb252ZXJ0ZXJUeXBlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0Q29udmVydGVyKGNvbnZlcnRlclR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGJ1aWxkQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnQsIEVjbGlwc2VMaW5rQ29udmVydGVyPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydC5DT05WRVJURVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVydGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBidWlsZEN1c3RvbUNvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyLCBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4oY29udmVydGVySG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCXJldHVybiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSKSA/IChFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgY29udmVydGVyIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBidWlsZFR5cGVDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlciwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPihjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCXJldHVybiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUikgPyAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+KGNvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCQkJcmV0dXJuIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUikgPyAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlciwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+KGNvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgdHJhbnNmb3JtXyhFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJCQlyZXR1cm4gKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUikgPyAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIpIGNvbnZlcnRlciA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0LCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVjbGlwc2VMaW5rQ29udmVydCB2YWx1ZSkgewotCQkJCWlmIChnZXRTdWJqZWN0KCkgIT0gbnVsbCAmJiBnZXRTdWJqZWN0KCkuZ2V0UGFyZW50KCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlICE9IG51bGwpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4OThiYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRlcgotICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPgotewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db252ZXJ0ZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCWFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLCAKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb21wb3NpdGVfbmFtZVRleHRMYWJlbCwgCi0JCQlidWlsZE5hbWVUZXh0SG9sZGVyKCkpOwotCQkKLQkJYWRkQ2xhc3NDaG9vc2VyKGNvbnRhaW5lcik7Ci0JCQotCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRCb29sZWFuSG9sZGVyKCksIHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVUZXh0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciwgU3RyaW5nPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydGVyLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkKLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGFkZENsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5DT05WRVJURVJfQ0xBU1NfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlckNsYXNzKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQotCQkJCQkJdGhpcy5zdWJqZWN0LnNldENvbnZlcnRlckNsYXNzKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRDb252ZXJ0ZXJDbGFzcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyQ29tcG9zaXRlX2NsYXNzTGFiZWw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRDb252ZXJ0ZXJDbGFzcyhjbGFzc05hbWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5FQ0xJUFNFTElOS19DT05WRVJURVJfQ0xBU1NfTkFNRTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgdmFsdWUpIHsKLS8vCQkJCWlmIChnZXRTdWJqZWN0KCkgIT0gbnVsbCAmJiBnZXRTdWJqZWN0KCkuZ2V0UGFyZW50KCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0vLwkJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0vLwkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ3VzdG9taXplckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1NWJjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ3VzdG9taXplckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlckNvbWJvUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtDdXN0b21pemVyCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ3VzdG9taXplcj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkN1c3RvbWl6ZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXplckNvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsIAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ3VzdG9taXplcj4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQ3VzdG9taXplckNsYXNzQ2hvb3NlckNvbWJvUGFuZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgQ3VzdG9taXplckNsYXNzQ2hvb3NlckNvbWJvUGFuZQotCQlleHRlbmRzIENsYXNzQ2hvb3NlckNvbWJvUGFuZTxFY2xpcHNlTGlua0N1c3RvbWl6ZXI+Ci0JewotCQlwdWJsaWMgQ3VzdG9taXplckNsYXNzQ2hvb3NlckNvbWJvUGFuZShQYW5lPEVjbGlwc2VMaW5rQ3VzdG9taXplcj4gcGFyZW50UGFuZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQkJfQkJCi0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhjbGFzc05hbWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDdXN0b21pemVyQ29tcG9zaXRlX2NsYXNzTGFiZWw7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ3VzdG9taXplci5FQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRDdXN0b21pemVyQ2xhc3NFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDdXN0b21pemVyLCBTdHJpbmc+KAotCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIAotCQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIuU1BFQ0lGSUVEX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFksCi0JCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXplci5ERUZBVUxUX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFkpIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKTsKLQkJCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IGRlZmF1bHRUZXh0KHRoaXMuc3ViamVjdCkgOiB2YWx1ZTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCWlmICh2YWx1ZSA9PSBudWxsIAotCQkJCQkJCXx8IHZhbHVlLmxlbmd0aCgpID09IDAgCi0JCQkJCQkJfHwgdmFsdWUuZXF1YWxzKGRlZmF1bHRUZXh0KHRoaXMuc3ViamVjdCkpKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0KLQkJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRleHQoRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIpIHsKLQkJCVN0cmluZyBkZWZhdWx0Q2xhc3NOYW1lID0gY3VzdG9taXplci5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCk7Ci0JCQlyZXR1cm4gKGRlZmF1bHRDbGFzc05hbWUgPT0gbnVsbCkgPwotCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Ob25lU2VsZWN0ZWQKLQkJCQkJOiBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLCBkZWZhdWx0Q2xhc3NOYW1lKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENsYXNzTGlzdEhvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ3VzdG9taXplciwgU3RyaW5nPigKLQkJCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDdXN0b21pemVyLkRFRkFVTFRfQ1VTVE9NSVpFUl9DTEFTU19QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiBkZWZhdWx0VGV4dCh0aGlzLnN1YmplY3QpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTg5MmQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGNvbXBvc2l0ZSBzaW1wbHkgc2hvd3MgYSB0cmktc3RhdGUgY2hlY2sgYm94IGZvciB0aGUgRGlzYWJsZSBIaXRzIG9wdGlvbi4KLSAqIAotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ2FjaGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9wdGlvbmFsQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZV9kaXNhYmxlSGl0c0xhYmVsLAotCQkJYnVpbGREaXNhYmxlSGl0c0hvbGRlcigpLAotCQkJYnVpbGREaXNhYmxlSGl0c1N0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5DQUNISU5HX0RJU0FCTEVfSElUUwotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGlzYWJsZUhpdHNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX0RJU0FCTEVfSElUU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZERpc2FibGVIaXRzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHModmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREaXNhYmxlSGl0c1N0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdERpc2FibGVIaXRzSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGVfZGlzYWJsZUhpdHNEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlX2Rpc2FibGVIaXRzTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdERpc2FibGVIaXRzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9ESVNBQkxFX0hJVFNfUFJPUEVSVFksCi0JCQlFY2xpcHNlTGlua0NhY2hpbmcuREVGQVVMVF9ESVNBQkxFX0hJVFNfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRW1iZWRkYWJsZUFkdmFuY2VkQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRW1iZWRkYWJsZUFkdmFuY2VkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDcwYzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0VtYmVkZGFibGVBZHZhbmNlZENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVtYmVkZGFibGU+IHsKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBFbWJlZGRhYmxlPiBwYXJlbnRQYW5lLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2FkdmFuY2VkCi0JCSk7Ci0JCQotCQluZXcgRWNsaXBzZUxpbmtDdXN0b21pemVyQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ3VzdG9taXplckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSh0aGlzLCBidWlsZENoYW5nZVRyYWNraW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ3VzdG9taXplcj4gYnVpbGRDdXN0b21pemVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbWJlZGRhYmxlLCBFY2xpcHNlTGlua0N1c3RvbWl6ZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDdXN0b21pemVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgdGhpcy5zdWJqZWN0KS5nZXRDdXN0b21pemVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc+IGJ1aWxkQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtYmVkZGFibGUsIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0VtYmVkZGFibGUpIHRoaXMuc3ViamVjdCkuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtFbnRpdHlBZHZhbmNlZENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2NiZGUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtFbnRpdHlBZHZhbmNlZENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eUFkdmFuY2VkQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnRpdHk+IHsKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtFbnRpdHlBZHZhbmNlZENvbXBvc2l0ZSgKLQkJCVBhbmU8PyBleHRlbmRzIEVudGl0eT4gcGFyZW50UGFuZSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9hZHZhbmNlZAotCQkpOwotCQkKLQkJbmV3IEVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGUodGhpcywgYnVpbGRSZWFkT25seUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtDdXN0b21pemVyQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ3VzdG9taXplckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSh0aGlzLCBidWlsZENoYW5nZVRyYWNraW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUmVhZE9ubHk+IGJ1aWxkUmVhZE9ubHlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgRWNsaXBzZUxpbmtSZWFkT25seT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1JlYWRPbmx5IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rRW50aXR5KSB0aGlzLnN1YmplY3QpLmdldFJlYWRPbmx5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ3VzdG9taXplcj4gYnVpbGRDdXN0b21pemVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIEVjbGlwc2VMaW5rQ3VzdG9taXplcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtFbnRpdHkpIHRoaXMuc3ViamVjdCkuZ2V0Q3VzdG9taXplcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nPiBidWlsZENoYW5nZVRyYWNraW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0VudGl0eSkgdGhpcy5zdWJqZWN0KS5nZXRDaGFuZ2VUcmFja2luZygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmYzc5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi0vKioKLSAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLSBFeHBpcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG8gTm8gZXhwaXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgIAkJCQkJLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgbyBUaW1lIHRvIGxpdmUgZXhwaXJ5ICAgRXhwaXJlIGFmdGVyIHwgSSAgICAgICAgICB8SXwgbWlsbGlzZWNvbmRzICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgIAkJCQkgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgfCB8Ci0gKiB8IHwgbyBEYWlseSBleHBpcnkgICAgICAgICAgRXhwaXJlIGF0ICAgIHwgSEg6TU06U1M6QU0vUE0gfEl8ICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCi0gKiBAc2VlIEVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5Ci0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtDYWNoaW5nPiB7Ci0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB0dGxFbmFibGVkOwotCi0JcHVibGljIEVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIGxhenkgaW5pdCBiZWNhdXNlIHdlIG5lZWQgaXQgd2hpbGUgdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IgaXMKLQkgKiBleGVjdXRpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGdldFR0bEVuYWJsZWQoKSB7Ci0JCWlmICh0aGlzLnR0bEVuYWJsZWQgPT0gbnVsbCkgewotCQkJdGhpcy50dGxFbmFibGVkID0gdGhpcy5idWlsZFRpbWVUb0xpdmVFeHBpcnlFbmFibGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMudHRsRW5hYmxlZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gRXhwaXJ5IGdyb3VwIHBhbmUKLQkJR3JvdXAgZXhwaXJ5R3JvdXBQYW5lID0gYWRkVGl0bGVkR3JvdXAoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX2V4cGlyeVNlY3Rpb24sCi0JCQkyLAotCQkJbnVsbAotCQkpOwotCQkJCQotCQkvLyBObyBFeHBpcnkgcmFkaW8gYnV0dG9uCi0JCUJ1dHRvbiBidXR0b24gPSBhZGRSYWRpb0J1dHRvbigKLQkJCWV4cGlyeUdyb3VwUGFuZSwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfbm9FeHBpcnksCi0JCQlidWlsZE5vRXhwaXJ5SG9sZGVyKCksCi0JCQludWxsCi0JCSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCQotCQkvLyBUaW1lIFRvIExpdmUgRXhwaXJ5IHJhZGlvIGJ1dHRvbgotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWV4cGlyeUdyb3VwUGFuZSwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZVRvTGl2ZUV4cGlyeSwKLQkJCWJ1aWxkRXhwaXJ5SG9sZGVyKCksCi0JCQludWxsCi0JCSk7Ci0JCQotCQlhZGRUaW1lVG9MaXZlQ29tcG9zaXRlKGV4cGlyeUdyb3VwUGFuZSk7Ci0JCQotCQkvLyBEYWlseSBFeHBpcnkgcmFkaW8gYnV0dG9uCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJZXhwaXJ5R3JvdXBQYW5lLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV9kYWlseUV4cGlyeSwKLQkJCWJ1aWxkVGltZU9mRGF5RXhwaXJ5Qm9vbGVhbkhvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCQkKLQkJYWRkVGltZU9mRGF5Q29tcG9zaXRlKGV4cGlyeUdyb3VwUGFuZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRpbWVUb0xpdmVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGhpcy5hZGRTdWJQYW5lKHBhcmVudCwgMywgMCwgMTAsIDAsIDApOwotCi0JCWFkZExhYmVsKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lVG9MaXZlRXhwaXJ5RXhwaXJlQWZ0ZXIsCi0JCQl0aGlzLmdldFR0bEVuYWJsZWQoKQotCQkpOwotCQotCQlJbnRlZ2VyQ29tYm88Pz4gY29tYm8gPSBhZGRUaW1lVG9MaXZlRXhwaXJ5Q29tYm8oY29udGFpbmVyKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQljb21iby5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlhZGRMYWJlbCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZVRvTGl2ZUV4cGlyeU1pbGxpc2Vjb25kcywKLQkJCXRoaXMuZ2V0VHRsRW5hYmxlZCgpCi0JCSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRpbWVPZkRheUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0aGlzLmFkZFN1YlBhbmUocGFyZW50LCAyLCAwLCAxMCwgMCwgMCk7Ci0KLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHRvZEVuYWJsZWQgPSB0aGlzLmJ1aWxkVGltZU9mRGF5RXhwaXJ5RW5hYmxlcigpOwotCQlhZGRMYWJlbCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZU9mRGF5RXhwaXJ5RXhwaXJlQXQsCi0JCQl0b2RFbmFibGVkCi0JCSk7Ci0JCQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXk+IHRpbWVPZkRheUV4cGlyeUhvbGRlciA9IGJ1aWxkVGltZU9mRGF5RXhwaXJ5SG9sZGVyKCk7Ci0JCWFkZERhdGVUaW1lKAotCQkJY29udGFpbmVyLCAKLQkJCWJ1aWxkVGltZU9mRGF5RXhwaXJ5SG91ckhvbGRlcih0aW1lT2ZEYXlFeHBpcnlIb2xkZXIpLCAKLQkJCWJ1aWxkVGltZU9mRGF5RXhwaXJ5TWludXRlSG9sZGVyKHRpbWVPZkRheUV4cGlyeUhvbGRlciksCi0JCQlidWlsZFRpbWVPZkRheUV4cGlyeVNlY29uZEhvbGRlcih0aW1lT2ZEYXlFeHBpcnlIb2xkZXIpLAotCQkJbnVsbCwKLQkJCXRvZEVuYWJsZWQKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vRXhwaXJ5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KAotCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIAotCQkJCQlFY2xpcHNlTGlua0NhY2hpbmcuRVhQSVJZX1BST1BFUlRZLCAKLQkJCQkJRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRFeHBpcnkoKSA9PSBudWxsICYmIHRoaXMuc3ViamVjdC5nZXRFeHBpcnlUaW1lT2ZEYXkoKSA9PSBudWxsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRFeHBpcnkobnVsbCk7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRFeHBpcnlUaW1lT2ZEYXkoKSAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEV4cGlyeUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPigKLQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCAKLQkJCQkJRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRFeHBpcnkoKSAhPSBudWxsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSBCb29sZWFuLlRSVUUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEV4cGlyeShJbnRlZ2VyLnZhbHVlT2YoMCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRpbWVPZkRheUV4cGlyeUJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oCi0JCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgCi0JCQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5FWFBJUllfVElNRV9PRl9EQVlfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RXhwaXJ5VGltZU9mRGF5KCkgIT0gbnVsbCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gQm9vbGVhbi5UUlVFKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgSW50ZWdlckNvbWJvPEVjbGlwc2VMaW5rQ2FjaGluZz4gYWRkVGltZVRvTGl2ZUV4cGlyeUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBJbnRlZ2VyQ29tYm88RWNsaXBzZUxpbmtDYWNoaW5nPih0aGlzLCBjb250YWluZXIpIHsKLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb21ibyBhZGRJbnRlZ2VyQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJCXJldHVybiB0aGlzLmFkZEVkaXRhYmxlQ29tYm8oCi0JCQkJCQljb250YWluZXIsCi0JCQkJCQlidWlsZERlZmF1bHRMaXN0SG9sZGVyKCksCi0JCQkJCQlidWlsZFNlbGVjdGVkSXRlbVN0cmluZ0hvbGRlcigpLAotCQkJCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFN0cmluZz5pbnN0YW5jZSgpLAotCQkJCQkJRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGUudGhpcy5nZXRUdGxFbmFibGVkKCkKLQkJCQkJKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkKLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV4cGlyeSgpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJCQl0aGlzLnN1YmplY3Quc2V0RXhwaXJ5KHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGltZVRvTGl2ZUV4cGlyeUVuYWJsZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NhY2hpbmcuRVhQSVJZX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldEV4cGlyeSgpICE9IG51bGwpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRpbWVPZkRheUV4cGlyeUVuYWJsZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NhY2hpbmcuRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldEV4cGlyeVRpbWVPZkRheSgpICE9IG51bGwpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheT4gYnVpbGRUaW1lT2ZEYXlFeHBpcnlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXk+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkVGltZU9mRGF5RXhwaXJ5SG91ckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXk+IHRpbWVPZkRheUV4cGlyeUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSwgSW50ZWdlcj4oCi0JCQkJCXRpbWVPZkRheUV4cGlyeUhvbGRlciwgCi0JCQkJCUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5LkhPVVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRIb3VyKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgaG91cikgewotCQkJCXRoaXMuc3ViamVjdC5zZXRIb3VyKGhvdXIpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRUaW1lT2ZEYXlFeHBpcnlNaW51dGVIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5PiB0aW1lT2ZEYXlFeHBpcnlIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXksIEludGVnZXI+KAotCQkJCQl0aW1lT2ZEYXlFeHBpcnlIb2xkZXIsIAotCQkJCQlFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheS5NSU5VVEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRNaW51dGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciBtaW51dGUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0TWludXRlKG1pbnV0ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFRpbWVPZkRheUV4cGlyeVNlY29uZEhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXk+IHRpbWVPZkRheUV4cGlyeUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSwgSW50ZWdlcj4oCi0JCQkJCXRpbWVPZkRheUV4cGlyeUhvbGRlciwgCi0JCQkJCUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5LlNFQ09ORF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNlY29uZCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHNlY29uZCkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTZWNvbmQoc2Vjb25kKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQyYWU3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0lkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRlbXBvcmFsVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBJZE1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdElkTWFwcGluZ0NvbXBvc2l0ZTxUPgotCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUlkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZSh0aGlzLCBidWlsZE11dGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUeXBlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCSgoR3JpZExheW91dCkgY29udGFpbmVyLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gMjsKLQkJCi0JCS8vIE5vIGNvbnZlcnRlcgotCQlCdXR0b24gbm9Db252ZXJ0ZXJCdXR0b24gPSBhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9kZWZhdWx0LCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSKSwgCi0JCQludWxsKTsKLQkJKChHcmlkRGF0YSkgbm9Db252ZXJ0ZXJCdXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlciA9IGJ1aWxkQ29udmVydGVySG9sZGVyKCk7Ci0JCS8vIFRlbXBvcmFsCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX3RlbXBvcmFsLCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKSwgCi0JCQludWxsKTsKLQkJcmVnaXN0ZXJTdWJQYW5lKG5ldyBUZW1wb3JhbFR5cGVDb21wb3NpdGUoYnVpbGRUZW1wb3JhbENvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSkpOwotCi0JCS8vIEVjbGlwc2VMaW5rIENvbnZlcnRlcgotCQlCdXR0b24gZWxDb252ZXJ0ZXJCdXR0b24gPSBhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwgCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2NvbnZlcnRlZCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpLCAKLQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBlbENvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCi0JCVBhbmU8RWNsaXBzZUxpbmtDb252ZXJ0PiBjb252ZXJ0Q29tcG9zaXRlID0gYnVpbGRDb252ZXJ0Q29tcG9zaXRlKGJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIoY29udmVydGVySG9sZGVyKSwgY29udGFpbmVyKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbnZlcnRDb21wb3NpdGUuZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCXJlZ2lzdGVyU3ViUGFuZShjb252ZXJ0Q29tcG9zaXRlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBhbmU8RWNsaXBzZUxpbmtDb252ZXJ0PiBidWlsZENvbnZlcnRDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydD4gY29udmVydEhvbGRlciwgQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZShjb252ZXJ0SG9sZGVyLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBidWlsZEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlciwgRWNsaXBzZUxpbmtDb252ZXJ0Pihjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVydCB0cmFuc2Zvcm1fKENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJCQlyZXR1cm4gY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiA/IChFY2xpcHNlTGlua0NvbnZlcnQpIGNvbnZlcnRlciA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtNdXRhYmxlPiBidWlsZE11dGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVjbGlwc2VMaW5rTXV0YWJsZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua011dGFibGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0TXV0YWJsZSgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OTIxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwdENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEpvaW4gRmV0Y2g6ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBGZXRjaGFibGUKLSAqIEBzZWUgQmFzaWNNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqIEBzZWUgSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqIEBzZWUgT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKiBAc2VlIE9ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICogQHNlZSBPcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rSm9pbkZldGNoPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5GZXRjaENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLCAKLQkJCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0pvaW5GZXRjaD4gc3ViamVjdEhvbGRlciwKLQkJCQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWFkZExhYmVsZWRDb21wb3NpdGUoIAotICAgICAgICAgICAgY29udGFpbmVyLCAKLSAgICAgICAgICAgIGFkZExhYmVsKCAKLSAgICAgICAgICAgICAgICAgY29udGFpbmVyLCAKLSAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZV9sYWJlbCksIAotICAgICAgICAgICAgYWRkSm9pbkZldGNoVHlwZUNvbWJvKGNvbnRhaW5lcikuZ2V0Q29udHJvbCgpLAotICAgICAgICAgICAgbnVsbCAKLSAgICAgICApOwotCX0KLQkKLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0pvaW5GZXRjaCwgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlPiBhZGRKb2luRmV0Y2hUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0pvaW5GZXRjaCwgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0pvaW5GZXRjaC5WQUxVRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5jbGFzcywKLQkJCQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUudGhpcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgbnVsbERpc3BsYXlTdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIEpwdENvcmVNZXNzYWdlcy5OT05FOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRWYWx1ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjllYzdlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9yZGVyaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9yZGVyaW5nQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55TWFwcGluZ30KLSAqIEBzZWUge0BsaW5rIFRhcmdldEVudGl0eUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lfQotICogQHNlZSB7QGxpbmsgRmV0Y2hUeXBlQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE9yZGVyaW5nQ29tcG9zaXRlfQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgTWFueVRvTWFueU1hcHBpbmc+IAotCWV4dGVuZHMgQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxULCBNYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlPgotCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9NYW55TWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rSm9pbkZldGNoPiBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hbnlUb01hbnlNYXBwaW5nLCBFY2xpcHNlTGlua0pvaW5GZXRjaD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0Sm9pbkZldGNoKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTNhOGQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBNYW55VG9PbmVNYXBwaW5nfQotICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE9wdGlvbmFsQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgTWFueVRvT25lTWFwcGluZz4gCi0JZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU8VCwgTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlPgotCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5NYW55VG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYW55VG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsJCQotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtKb2luRmV0Y2g+IGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgRWNsaXBzZUxpbmtKb2luRmV0Y2g+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2ggYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQWR2YW5jZWRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQWR2YW5jZWRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzMDhhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0FkdmFuY2VkQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQWR2YW5jZWRDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPE1hcHBlZFN1cGVyY2xhc3M+IHsKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQWR2YW5jZWRDb21wb3NpdGUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBNYXBwZWRTdXBlcmNsYXNzPiBwYXJlbnRQYW5lLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2FkdmFuY2VkCi0JCSk7Ci0JCQotCQluZXcgRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZSh0aGlzLCBidWlsZFJlYWRPbmx5SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGUodGhpcywgYnVpbGRDdXN0b21pemVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtSZWFkT25seT4gYnVpbGRSZWFkT25seUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFwcGVkU3VwZXJjbGFzcywgRWNsaXBzZUxpbmtSZWFkT25seT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1JlYWRPbmx5IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgdGhpcy5zdWJqZWN0KS5nZXRSZWFkT25seSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0N1c3RvbWl6ZXI+IGJ1aWxkQ3VzdG9taXplckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFwcGVkU3VwZXJjbGFzcywgRWNsaXBzZUxpbmtDdXN0b21pemVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ3VzdG9taXplciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHRoaXMuc3ViamVjdCkuZ2V0Q3VzdG9taXplcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nPiBidWlsZENoYW5nZVRyYWNraW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYXBwZWRTdXBlcmNsYXNzLCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSB0aGlzLnN1YmplY3QpLmdldENoYW5nZVRyYWNraW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMTgzMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIGEgdHJpLXN0YXRlIGNoZWNrIGJveCBmb3IgdGhlIE11dGFibGUgb3B0aW9uLgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtNdXRhYmxlCi0gKiBAc2VlIEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rTXV0YWJsZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk11dGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsIAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rTXV0YWJsZT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZV9tdXRhYmxlTGFiZWwsCi0JCQlidWlsZE11dGFibGVIb2xkZXIoKSwKLQkJCWJ1aWxkTXV0YWJsZVN0cmluZ0hvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRNdXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua011dGFibGUsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtNdXRhYmxlLlNQRUNJRklFRF9NVVRBQkxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZE11dGFibGUodmFsdWUpOwotCQkJfQotCi0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE11dGFibGVTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRNdXRhYmxlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZV9tdXRhYmxlTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfbXV0YWJsZUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRNdXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua011dGFibGUsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtNdXRhYmxlLlNQRUNJRklFRF9NVVRBQkxFX1BST1BFUlRZLAotCQkJRWNsaXBzZUxpbmtNdXRhYmxlLkRFRkFVTFRfTVVUQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE11dGFibGUoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5MTZmMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlVGFibGVQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRlcgotICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+Ci17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsIAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9uYW1lVGV4dExhYmVsLCAKLQkJCWJ1aWxkTmFtZVRleHRIb2xkZXIoKSk7Ci0JCQotCQlhZGREYXRhVHlwZUNob29zZXIoY29udGFpbmVyKTsKLQkJYWRkT2JqZWN0VHlwZUNob29zZXIoY29udGFpbmVyKTsKLQkJCi0JCWFkZENvbnZlcnNpb25WYWx1ZXNUYWJsZShjb250YWluZXIpOwotCi0JCWFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfZGVmYXVsdE9iamVjdFZhbHVlTGFiZWwsCi0JCQlidWlsZERlZmF1bHRPYmplY3RWYWx1ZUxpc3RIb2xkZXIoKSwKLQkJCWJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlSG9sZGVyKCksCi0JCQlidWlsZFN0cmluZ0NvbnZlcnRlcigpLAotCQkJbnVsbAotCQkpOwotCi0JCW5ldyBQYW5lRW5hYmxlcihidWlsZEJvb2xlYW5Ib2xkZXIoKSwgdGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZVRleHRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciwgU3RyaW5nPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydGVyLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gYWRkRGF0YVR5cGVDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLkRBVEFfVFlQRV9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGF0YVR5cGUoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCi0JCQkJCQl0aGlzLnN1YmplY3Quc2V0RGF0YVR5cGUodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERhdGFUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2RhdGFUeXBlTGFiZWw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXREYXRhVHlwZShjbGFzc05hbWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBjaGFyIGdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gYWRkT2JqZWN0VHlwZUNob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE9iamVjdFR5cGUoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCi0JCQkJCQl0aGlzLnN1YmplY3Quc2V0T2JqZWN0VHlwZSh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0T2JqZWN0VHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9vYmplY3RUeXBlTGFiZWw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRPYmplY3RUeXBlKGNsYXNzTmFtZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBnZXRUeXBlRGlhbG9nU3R5bGUoKSB7Ci0JCQkJcmV0dXJuIElKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9DTEFTU0VTX0FORF9FTlVNUzsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb252ZXJzaW9uVmFsdWVzVGFibGUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJLy8gSm9pbiBDb2x1bW5zIGdyb3VwIHBhbmUKLQkJR3JvdXAgY29udmVyc2lvblZhbHVlc0dyb3VwUGFuZSA9IGFkZFRpdGxlZEdyb3VwKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlc0dyb3VwVGl0bGUKLQkJKTsKLQotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gY29udmVyc2lvblZhbHVlSG9sZGVyID0KLQkJCWJ1aWxkQ29udmVyc2lvblZhbHVlSG9sZGVyKCk7Ci0JCS8vIENvbnZlcnNpb24gVmFsdWVzIGFkZC9yZW1vdmUgbGlzdCBwYW5lCi0JCW5ldyBBZGRSZW1vdmVUYWJsZVBhbmU8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPigKLQkJCXRoaXMsCi0JCQljb252ZXJzaW9uVmFsdWVzR3JvdXBQYW5lLAotCQkJYnVpbGRDb252ZXJzaW9uVmFsdWVzQWRhcHRlcigpLAotCQkJYnVpbGRDb252ZXJzaW9uVmFsdWVzTGlzdE1vZGVsKCksCi0JCQljb252ZXJzaW9uVmFsdWVIb2xkZXIsCi0JCQlidWlsZENvbnZlcnNpb25WYWx1ZXNMYWJlbFByb3ZpZGVyKCksCi0JCQludWxsLy9UT0RPIG5lZWQgYSBoZWxwIGNvbnRleHQgaWQgZm9yIHRoaXMKLQkJKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb2x1bW5BZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBidWlsZENvbHVtbkFkYXB0ZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uVmFsdWVDb2x1bW5BZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGJ1aWxkQ29udmVyc2lvblZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWRkUmVtb3ZlTGlzdFBhbmUuQWRhcHRlciBidWlsZENvbnZlcnNpb25WYWx1ZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2cgZGlhbG9nID0gYnVpbGRDb252ZXJzaW9uVmFsdWVEaWFsb2dGb3JBZGQoKTsKLQkJCQlhZGRDb252ZXJzaW9uVmFsdWVGcm9tRGlhbG9nKGRpYWxvZywgbGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlRWRpdDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBvcHRpb25PblNlbGVjdGlvbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlID0gKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCQkJCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nIGRpYWxvZyA9IG5ldyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZyhnZXRTaGVsbCgpLCBnZXRTdWJqZWN0KCksIGNvbnZlcnNpb25WYWx1ZSk7Ci0JCQkJZWRpdENvbnZlcnNpb25WYWx1ZUZyb21EaWFsb2coZGlhbG9nLCBjb252ZXJzaW9uVmFsdWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gZ2V0U3ViamVjdCgpOwotCQkJCWludFtdIHNlbGVjdGVkSW5kaWNlcyA9IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZEluZGljZXMoKTsKLQotCQkJCWZvciAoaW50IGluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQkJY29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZShzZWxlY3RlZEluZGljZXNbaW5kZXhdKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2cgYnVpbGRDb252ZXJzaW9uVmFsdWVEaWFsb2dGb3JBZGQoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2coZ2V0U2hlbGwoKSwgZ2V0U3ViamVjdCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb252ZXJzaW9uVmFsdWVGcm9tRGlhbG9nKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nIGRpYWxvZywgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0spIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZENvbnZlcnNpb25WYWx1ZSgpOwotCQljb252ZXJzaW9uVmFsdWUuc2V0RGF0YVZhbHVlKGRpYWxvZy5nZXREYXRhVmFsdWUoKSk7Ci0JCWNvbnZlcnNpb25WYWx1ZS5zZXRPYmplY3RWYWx1ZShkaWFsb2cuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0KLQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoY29udmVyc2lvblZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0Q29udmVyc2lvblZhbHVlRnJvbURpYWxvZyhFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZyBkaWFsb2csIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSkgewotCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0spIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWNvbnZlcnNpb25WYWx1ZS5zZXREYXRhVmFsdWUoZGlhbG9nLmdldERhdGFWYWx1ZSgpKTsKLQkJY29udmVyc2lvblZhbHVlLnNldE9iamVjdFZhbHVlKGRpYWxvZy5nZXRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gYnVpbGRDb252ZXJzaW9uVmFsdWVzTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4oYnVpbGRDb252ZXJzaW9uVmFsdWVzTGlzdEhvbGRlcigpLCAKLQkJCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLkRBVEFfVkFMVUVfUFJPUEVSVFksCi0JCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5PQkpFQ1RfVkFMVUVfUFJPUEVSVFkpOwotCX0JCi0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBidWlsZENvbnZlcnNpb25WYWx1ZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciwgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLkNPTlZFUlNJT05fVkFMVUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuY29udmVyc2lvblZhbHVlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElUYWJsZUxhYmVsUHJvdmlkZXIgYnVpbGRDb252ZXJzaW9uVmFsdWVzTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0T2JqZWN0VmFsdWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLCBTdHJpbmc+KGJ1aWxkQ29udmVyc2lvblZhbHVlc0xpc3RNb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtSXRlbShFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKLQkJCQlyZXR1cm4gY29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIsIFN0cmluZz4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuREVGQVVMVF9PQkpFQ1RfVkFMVUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRPYmplY3RWYWx1ZSgpOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0RGVmYXVsdE9iamVjdFZhbHVlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkU3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/ICIiIDogdmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkKLQkJCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSA9IChFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSkgZWxlbWVudDsKLQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCQkKLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIENvbnZlcnNpb25WYWx1ZUNvbHVtbkFkYXB0ZXIuREFUQV9WQUxVRV9DT0xVTU46IHsKLQkJCQkJdmFsdWUgPSBjb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQotCQkJCWNhc2UgQ29udmVyc2lvblZhbHVlQ29sdW1uQWRhcHRlci5PQkpFQ1RfVkFMVUVfQ09MVU1OOiB7Ci0JCQkJCXZhbHVlID0gY29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29udmVyc2lvblZhbHVlQ29sdW1uQWRhcHRlciBpbXBsZW1lbnRzIENvbHVtbkFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IHsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fQ09VTlQgPSAyOwotCQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTl9DT0xVTU4gPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRBX1ZBTFVFX0NPTFVNTiA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9WQUxVRV9DT0xVTU4gPSAxOwotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERhdGFWYWx1ZUhvbGRlcihFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgU3RyaW5nPihFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5EQVRBX1ZBTFVFX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREYXRhVmFsdWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXREYXRhVmFsdWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRPYmplY3RWYWx1ZUhvbGRlcihFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgU3RyaW5nPihFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5PQkpFQ1RfVkFMVUVfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE9iamVjdFZhbHVlKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0T2JqZWN0VmFsdWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBjZWxsTW9kZWxzKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIHN1YmplY3QpIHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gaG9sZGVycyA9IG5ldyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltDT0xVTU5fQ09VTlRdOwotCQkJLy9ob2xkZXJzW1NFTEVDVElPTl9DT0xVTU5dID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JCQlob2xkZXJzW0RBVEFfVkFMVUVfQ09MVU1OXSAgICAgID0gYnVpbGREYXRhVmFsdWVIb2xkZXIoc3ViamVjdCk7Ci0JCQlob2xkZXJzW09CSkVDVF9WQUxVRV9DT0xVTU5dICAgICA9IGJ1aWxkT2JqZWN0VmFsdWVIb2xkZXIoc3ViamVjdCk7Ci0JCQlyZXR1cm4gaG9sZGVyczsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29sdW1uQ291bnQoKSB7Ci0JCQlyZXR1cm4gQ09MVU1OX0NPVU5UOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBjb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSBDb252ZXJzaW9uVmFsdWVDb2x1bW5BZGFwdGVyLkRBVEFfVkFMVUVfQ09MVU1OOiB7Ci0JCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVzRGF0YVZhbHVlQ29sdW1uOwotCQkJCX0KLQotCQkJCWNhc2UgQ29udmVyc2lvblZhbHVlQ29sdW1uQWRhcHRlci5PQkpFQ1RfVkFMVUVfQ09MVU1OOiB7Ci0JCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVzT2JqZWN0VmFsdWVDb2x1bW47Ci0JCQkJfQotCi0JCQkJZGVmYXVsdDogewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVlMTEzMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lIAotCWV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfdGl0bGUsCi0JCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19tYXBwZWRCeUxhYmVsLAotCQkJTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lLmJ1aWxkVXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSksCi0JCQludWxsKTsKLQotCQluZXcgTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbXBvc2l0ZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfam9pbkNvbHVtbkpvaW5pbmdMYWJlbCwKLQkJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lLmJ1aWxkVXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lLgotCQkJYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZVdpdGhJbmNsdWRlT3ZlcnJpZGVDaGVja0JveCh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb21wb3NpdGUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX2pvaW5UYWJsZUpvaW5pbmdMYWJlbCwKLQkJCUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSksCi0JCQludWxsKTsKLQotCQluZXcgSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJYWRkU3ViUGFuZShjb21wb3NpdGUsIDUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQ2ZDNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3JkZXJpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRWNsaXBzZUxpbmt2YXRlT3duZWRDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9yZGVyaW5nQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE9uZVRvT25lTWFwcGluZwotICogQHNlZSBDYXNjYWRlQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgT3JkZXJpbmdDb21wb3NpdGUKLSAqIEBzZWUgVGFyZ2V0RW50aXR5Q29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIE9uZVRvTWFueU1hcHBpbmc+IAotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPFQsIEVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlPgotICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlbGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JT25lVG9NYW55TWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSh0aGlzLCBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKb2luaW5nU3RyYXRlZ3lDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGJ1aWxkSm9pbmluZ0hvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQcml2YXRlT3duZWQ+IGJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgdGhpcy5zdWJqZWN0KS5nZXRQcml2YXRlT3duZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0pvaW5GZXRjaD4gYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBFY2xpcHNlTGlua0pvaW5GZXRjaD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0Sm9pbkZldGNoKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZhZGNhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBPbmVUb09uZU1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxULCBPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4KLQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZWxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JT25lVG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPbmVUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKHRoaXMsIGJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtKb2luRmV0Y2g+IGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgRWNsaXBzZUxpbmtKb2luRmV0Y2g+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2ggYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpdGhpcy5zdWJqZWN0KS5nZXRKb2luRmV0Y2goKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1ByaXZhdGVPd25lZD4gYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpdGhpcy5zdWJqZWN0KS5nZXRQcml2YXRlT3duZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzYyZGM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIHRoZSBMb2IgY2hlY2sgYm94LgotICoKLSAqIEBzZWUgQmFzaWNNYXBwaW5nCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtQcml2YXRlT3duZWQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Qcml2YXRlT3duZWRDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtQcml2YXRlT3duZWQsIEJvb2xlYW4+IGJ1aWxkUHJpdmF0ZU93bmVkSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkLlBSSVZBVEVfT1dORURfUFJPUEVSVFkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc1ByaXZhdGVPd25lZCgpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRQcml2YXRlT3duZWQodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRDaGVja0JveCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGVfcHJpdmF0ZU93bmVkTGFiZWwsCi0JCQlidWlsZFByaXZhdGVPd25lZEhvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjg3YWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIHRoZSBSZWFkIE9ubHkgY2hlY2sgYm94LgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtSZWFkT25seQotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtSZWFkT25seT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlJlYWRPbmx5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtSZWFkT25seT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvLyBVbmlxdWUgdHJpLXN0YXRlIGNoZWNrIGJveAotCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGVfcmVhZE9ubHlMYWJlbCwKLQkJCWJ1aWxkU3BlY2lmaWVkUmVhZE9ubHlIb2xkZXIoKSwKLQkJCWJ1aWxkUmVhZE9ubHlTdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNwZWNpZmllZFJlYWRPbmx5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1JlYWRPbmx5LCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rUmVhZE9ubHkuU1BFQ0lGSUVEX1JFQURfT05MWV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFJlYWRPbmx5KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkUmVhZE9ubHkodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWFkT25seVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFJlYWRPbmx5SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGVfcmVhZE9ubHlXaXRoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZV9yZWFkT25seUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRSZWFkT25seUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtSZWFkT25seSwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua1JlYWRPbmx5LlNQRUNJRklFRF9SRUFEX09OTFlfUFJPUEVSVFksCi0JCQlFY2xpcHNlTGlua1JlYWRPbmx5LkRFRkFVTFRfUkVBRF9PTkxZX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMmNiMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGNvbXBvc2l0ZSBzaW1wbHkgc2hvd3MgYSB0cmktc3RhdGUgY2hlY2sgYm94IGZvciB0aGUgUmVmcmVzaCBPbmx5IElmIE5ld2VyIG9wdGlvbi4KLSAqIAotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0NhY2hpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcHRpb25hbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJMYWJlbCwKLQkJCWJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VySG9sZGVyKCksCi0JCQlidWlsZFJlZnJlc2hPbmx5SWZOZXdlclN0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5DQUNISU5HX1JFRlJFU0hfT05MWV9JRl9ORVdFUgotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWZyZXNoT25seUlmTmV3ZXJTdHJpbmdIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlckhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlX3JlZnJlc2hPbmx5SWZOZXdlckRlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlX3JlZnJlc2hPbmx5SWZOZXdlckxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1JFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSwKLQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1JFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzRmODllLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTmFtZTogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ29udmVydGVyCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+Ci17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0cnVjdENvbnZlcnRlckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsIAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9uYW1lVGV4dExhYmVsLCAKLQkJCWJ1aWxkTmFtZVRleHRIb2xkZXIoKSk7Ci0JCQotCQlhZGRDbGFzc0Nob29zZXIoY29udGFpbmVyKTsKLQkJCi0JCW5ldyBQYW5lRW5hYmxlcihidWlsZEJvb2xlYW5Ib2xkZXIoKSwgdGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZVRleHRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLCBTdHJpbmc+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDb252ZXJ0ZXIuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCQotCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gYWRkQ2xhc3NDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLkNPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVyQ2xhc3MoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCi0JCQkJCQl0aGlzLnN1YmplY3Quc2V0Q29udmVydGVyQ2xhc3ModmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldENvbnZlcnRlckNsYXNzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb21wb3NpdGVfY2xhc3NMYWJlbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldENvbnZlcnRlckNsYXNzKGNsYXNzTmFtZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRTdXBlckludGVyZmFjZU5hbWUoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLkVDTElQU0VMSU5LX1NUUlVDVF9DT05WRVJURVJfQ0xBU1NfTkFNRTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOTBjZmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjc3NDRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBOYW1lOiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtDb252ZXJ0ZXIKLSAqIEBzZWUgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPgotewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UeXBlQ29udmVydGVyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCWFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLCAKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb21wb3NpdGVfbmFtZVRleHRMYWJlbCwgCi0JCQlidWlsZE5hbWVUZXh0SG9sZGVyKCkpOwotCQkKLQkJYWRkRGF0YVR5cGVDaG9vc2VyKGNvbnRhaW5lcik7Ci0JCWFkZE9iamVjdFR5cGVDaG9vc2VyKGNvbnRhaW5lcik7Ci0JCQotCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRCb29sZWFuSG9sZGVyKCksIHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVUZXh0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIsIFN0cmluZz4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnRlci5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gYWRkRGF0YVR5cGVDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLkRBVEFfVFlQRV9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGF0YVR5cGUoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCi0JCQkJCQl0aGlzLnN1YmplY3Quc2V0RGF0YVR5cGUodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERhdGFUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlX2RhdGFUeXBlTGFiZWw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXREYXRhVHlwZShjbGFzc05hbWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBjaGFyIGdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gYWRkT2JqZWN0VHlwZUNob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE9iamVjdFR5cGUoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCi0JCQkJCQl0aGlzLnN1YmplY3Quc2V0T2JqZWN0VHlwZSh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0T2JqZWN0VHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9vYmplY3RUeXBlTGFiZWw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRPYmplY3RUeXBlKGNsYXNzTmFtZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGEzYmVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIGxvY2FsaXplZCBzdHJpbmdzIHVzZWQgYnkgdGhlIG1hcHBpbmcgcGFuZXMuCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX2Z1bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfd2VhazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnRfd2VhazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9oYXJkX3dlYWs7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfY2FjaGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfbm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2FkdmFuY2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY2FjaGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NvbnZlcnRlcnM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGVfc2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9zZW5kX29iamVjdF9jaGFuZ2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX2ludmFsaWRhdGVfY2hhbmdlZF9vYmplY3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX3NlbmRfbmV3X29iamVjdHNfd2l0aF9jaGFuZ2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX25vbmU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfc2hhcmVkTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZV9zaGFyZWRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfYWR2YW5jZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlX2Fsd2F5c1JlZnJlc2hEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZV9hbHdheXNSZWZyZXNoTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGVfcmVmcmVzaE9ubHlJZk5ld2VyRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlX2Rpc2FibGVIaXRzRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlX2Rpc2FibGVIaXRzTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlX2F0dHJpYnV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlX29iamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlX2RlZmVycmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfYXV0bzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfY29udmVydGVyTmFtZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9kZWZpbmVDb252ZXJ0ZXJTZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9jdXN0b207Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX29iamVjdFR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX3N0cnVjdDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9uYW1lVGV4dExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydGVyQ29tcG9zaXRlX2NsYXNzTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfY3VzdG9tQ29udmVydGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9vYmplY3RUeXBlQ29udmVydGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9zdHJ1Y3RDb252ZXJ0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX3R5cGVDb252ZXJ0ZXI7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDdXN0b21pemVyQ29tcG9zaXRlX2NsYXNzTGFiZWw7Ci0JCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFR5cGVTZWN0aW9uX2NvbnZlcnRlZDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2NoZWNrX2NhY2hlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2NoZWNrX2RhdGFiYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2Fzc3VtZV9leGlzdGVuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfYXNzdW1lX25vbl9leGlzdGVuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9jaGVja19jYWNoZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2NoZWNrX2RhdGFiYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfYXNzdW1lX2V4aXN0ZW5jZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2Fzc3VtZV9ub25fZXhpc3RlbmNlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX2V4cGlyeVNlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfbm9FeHBpcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZVRvTGl2ZUV4cGlyeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lVG9MaXZlRXhwaXJ5RXhwaXJlQWZ0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZVRvTGl2ZUV4cGlyeU1pbGxpc2Vjb25kczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV9kYWlseUV4cGlyeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lT2ZEYXlFeHBpcnlFeHBpcmVBdDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZV9pbm5lcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZV9vdXRlcjsJCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlX211dGFibGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfbXV0YWJsZUxhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfdHJ1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2RhdGFUeXBlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX29iamVjdFR5cGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlRWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlc0RhdGFWYWx1ZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlc09iamVjdFZhbHVlQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9kZWZhdWx0T2JqZWN0VmFsdWVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlc0dyb3VwVGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfYWRkQ29udmVyc2lvblZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2VkaXRDb252ZXJzaW9uVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfYWRkQ29udmVyc2lvblZhbHVlRGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19lZGl0Q29udmVyc2lvblZhbHVlRGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19hZGRDb252ZXJzaW9uVmFsdWVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19lZGl0Q29udmVyc2lvblZhbHVlRGVzY3JpcHRpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZGF0YVZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX29iamVjdFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3RfZGF0YVZhbHVlTXVzdEJlU3BlY2lmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3Rfb2JqZWN0VmFsdWVNdXN0QmVTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdF9kYXRhVmFsdWVBbHJlYWR5RXhpc3RzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlX3ByaXZhdGVPd25lZExhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGVfcmVhZE9ubHlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlX3JlYWRPbmx5V2l0aERlZmF1bHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlX2RhdGFUeXBlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlX29iamVjdFR5cGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfY29udmVydGVyVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfYWRkQ29udmVydGVyRGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXJEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X25hbWVNdXN0QmVTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdF90eXBlTXVzdEJlU3BlY2lmaWVkOwotCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoImVjbGlwc2VsaW5rX3VpX2RldGFpbHMiLCBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmQ4NDMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmFhMWY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGlibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0VmVyc2lvbk1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRlbXBvcmFsVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE11dGFibGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgVmVyc2lvbk1hcHBpbmcKLSAqIEBzZWUgQ29sdW1uQ29tcG9zaXRlCi0gKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgVmVyc2lvbk1hcHBpbmc+IGV4dGVuZHMgQWJzdHJhY3RWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTxUPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklWZXJzaW9uTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmVyc2lvblNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUodGhpcywgYnVpbGRNdXRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUeXBlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCSgoR3JpZExheW91dCkgY29udGFpbmVyLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gMjsKLQotCQkvLyBObyBjb252ZXJ0ZXIKLQkJQnV0dG9uIG5vQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fZGVmYXVsdCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoQ29udmVydGVyLk5PX0NPTlZFUlRFUiksIAotCQkJbnVsbCk7Ci0JCSgoR3JpZERhdGEpIG5vQ29udmVydGVyQnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIgPSBidWlsZENvbnZlcnRlckhvbGRlcigpOwotCQkvLyBUZW1wb3JhbAotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90ZW1wb3JhbCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUiksIAotCQkJbnVsbCk7Ci0JCXJlZ2lzdGVyU3ViUGFuZShuZXcgVGVtcG9yYWxUeXBlQ29tcG9zaXRlKGJ1aWxkVGVtcG9yYWxDb252ZXJ0ZXJIb2xkZXIoY29udmVydGVySG9sZGVyKSwgY29udGFpbmVyLCBnZXRXaWRnZXRGYWN0b3J5KCkpKTsKLQotCQkvLyBFY2xpcHNlTGluayBDb252ZXJ0ZXIKLQkJQnV0dG9uIGVsQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9jb252ZXJ0ZWQsIAotCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSwgCi0JCQludWxsKTsKLQkJKChHcmlkRGF0YSkgZWxDb252ZXJ0ZXJCdXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGNvbnZlcnRDb21wb3NpdGUgPSBidWlsZENvbnZlcnRDb21wb3NpdGUoYnVpbGRFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCBjb250YWluZXIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgY29udmVydENvbXBvc2l0ZS5nZXRDb250cm9sKCkuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJcmVnaXN0ZXJTdWJQYW5lKGNvbnZlcnRDb21wb3NpdGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkQ29udmVydENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBjb252ZXJ0SG9sZGVyLCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlKGNvbnZlcnRIb2xkZXIsIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBidWlsZEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlciwgRWNsaXBzZUxpbmtDb252ZXJ0Pihjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVydCB0cmFuc2Zvcm1fKENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJCQlyZXR1cm4gKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpID8gKEVjbGlwc2VMaW5rQ29udmVydCkgY29udmVydGVyIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIENvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb252ZXJ0ZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxUZW1wb3JhbENvbnZlcnRlcj4gYnVpbGRUZW1wb3JhbENvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXIsIFRlbXBvcmFsQ29udmVydGVyPihjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRlbXBvcmFsQ29udmVydGVyIHRyYW5zZm9ybV8oQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCXJldHVybiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIgPyAoVGVtcG9yYWxDb252ZXJ0ZXIpIGNvbnZlcnRlciA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtNdXRhYmxlPiBidWlsZE11dGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVjbGlwc2VMaW5rTXV0YWJsZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua011dGFibGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgdGhpcy5zdWJqZWN0KS5nZXRNdXRhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9BYnN0cmFjdEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9BYnN0cmFjdEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhOTlkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rRW1iZWRkYWJsZUFkdmFuY2VkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHBhbmUgZG9lcyBub3QgaGF2ZSBhbnkgd2lkZ2V0cy4KLSAqCi0gKiBAc2VlIEVtYmVkZGFibGUKLSAqIEBzZWUgSmF2YVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICogQHNlZSBFbWJlZGRhYmxlVWlQcm92aWRlcgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RFbWJlZGRhYmxlQ29tcG9zaXRlPEphdmFFbWJlZGRhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplQWR2YW5jZWRDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NvbnZlcnRlcnMKLQkJKTsKLQkJaW5pdGlhbGl6ZUNvbnZlcnRlcnNTZWN0aW9uKGNvbnRhaW5lciwgdGhpcy5idWlsZENvbnZlcnRlckhvbGRlclZhbHVlTW9kZWwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+IGNvbnZlcnRlckhvbGRlcikgewotCQluZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSh0aGlzLCBjb252ZXJ0ZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+IGJ1aWxkQ29udmVydGVySG9sZGVyVmFsdWVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVtYmVkZGFibGUsIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgdGhpcy5zdWJqZWN0KS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJCX0JCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua0VtYmVkZGFibGVBZHZhbmNlZENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9BYnN0cmFjdEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjExNTc5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9BYnN0cmFjdEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgYW4gRWNsaXBzZUxpbmsgSmF2YSBlbnRpdHkuCi0gKgotICogQHNlZSBKYXZhRWNsaXBzZUxpbmtFbnRpdHkKLSAqIEBzZWUgRWNsaXBzZWxpbmtKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlPFQgZXh0ZW5kcyBKYXZhRW50aXR5PgotCWV4dGVuZHMgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rSmF2YUVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkphdmFFbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5pbml0aWFsaXplRW50aXR5Q29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhY2hpbmdDb2xsYXBzaWJsZVNlY3Rpb25QYW5lKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZVF1ZXJpZXNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplSW5oZXJpdGFuY2VDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQXR0cmlidXRlT3ZlcnJpZGVzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUdlbmVyYXRvcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVTZWNvbmRhcnlUYWJsZXNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQWR2YW5jZWRDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hpbmdDb2xsYXBzaWJsZVNlY3Rpb25QYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJCWNvbnRhaW5lciwKLQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY2FjaGluZyk7Ci0JCWluaXRpYWxpemVDYWNoaW5nU2VjdGlvbihjb250YWluZXIsIGJ1aWxkQ2FjaGluZ0hvbGRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hpbmdTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPiBjYWNoaW5nSG9sZGVyKSB7Ci0JCW5ldyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlKHRoaXMsIGNhY2hpbmdIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFbnRpdHksIEphdmFFY2xpcHNlTGlua0NhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVudGl0eSwgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgdGhpcy5zdWJqZWN0KS5nZXRDYWNoaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJCWNvbnRhaW5lciwKLQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY29udmVydGVycyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNvbnZlcnRlcnNTZWN0aW9uKGNvbnRhaW5lciwgYnVpbGRDb252ZXJ0ZXJIb2xkZXJWYWx1ZU1vZGVsKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCW5ldyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlKHRoaXMsIGNvbnZlcnRlckhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPiBidWlsZENvbnZlcnRlckhvbGRlclZhbHVlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFbnRpdHksIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSB0aGlzLnN1YmplY3QpLmdldENvbnZlcnRlckhvbGRlcigpOwotCQkJfQkKLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUluaGVyaXRhbmNlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBKYXZhSW5oZXJpdGFuY2VDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWR2YW5jZWRDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtFbnRpdHlBZHZhbmNlZENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9BYnN0cmFjdEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9BYnN0cmFjdEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjMDU4NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCwgRm9ybSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NBZHZhbmNlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgYW4gRWNsaXBzZUxpbmsgSmF2YSBNYXBwZWQgU3VwZXJjbGFzcy4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcwotICogQHNlZSBFY2xpcHNlbGlua0pwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8SmF2YU1hcHBlZFN1cGVyY2xhc3M+Ci0gICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVNYXBwZWRTdXBlcmNsYXNzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7CQkKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUFkdmFuY2VkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hpbmdDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jYWNoaW5nKTsKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGluZ1NlY3Rpb24oY29udGFpbmVyLCBidWlsZENhY2hpbmdIb2xkZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoaW5nU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4gY2FjaGluZ0hvbGRlcikgewotCQluZXcgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSh0aGlzLCBjYWNoaW5nSG9sZGVyLCBjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhTWFwcGVkU3VwZXJjbGFzcywgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4gYnVpbGRDYWNoaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhTWFwcGVkU3VwZXJjbGFzcywgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHRoaXMuc3ViamVjdCkuZ2V0Q2FjaGluZygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NvbnZlcnRlcnMpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJ0ZXJzU2VjdGlvbihjb250YWluZXIsIGJ1aWxkQ29udmVydGVySG9sZGVyVmFsdWVNb2RlbCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPiBidWlsZENvbnZlcnRlckhvbGRlclZhbHVlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFNYXBwZWRTdXBlcmNsYXNzLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHRoaXMuc3ViamVjdCkuZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCQl9CQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUodGhpcywgY29udmVydGVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NBZHZhbmNlZENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMWZlN2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhT25lVG9NYW55TWFwcGluZz4KLQlpbXBsZW1lbnRzIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhT25lVG9NYW55TWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IERlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU9uZVRvTWFueU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldERlZmF1bHRLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFPbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlSmF2YU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExZWY3Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhT25lVG9PbmVNYXBwaW5nPgotCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFPbmVUb09uZU1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IERlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhT25lVG9PbmVNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldERlZmF1bHRLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDU4ZTRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4KLQlpbXBsZW1lbnRzIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJbmV3IERlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRGVmYXVsdEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVkFSSUFCTEVfT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpQQV9DT05URU5UKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGlua0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOWFhYTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5BYnN0cmFjdEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkRlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRhYmxlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVudGl0eVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFJZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5OdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBFY2xpcHNlTGlua0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFVaUZhY3RvcnkgYnVpbGRKYXZhVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rSmF2YVVpRmFjdG9yeSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbWJlZGRlZElkTWFwcGluZ1VEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8+PiBkZWZpbml0aW9ucykgewotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoTnVsbEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVudGl0eVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rSmF2YVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rSmF2YVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGE3Mjg3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGlua0phdmFVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkJhc2VKYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFVaUZhY3RvcnkgZXh0ZW5kcyBCYXNlSmF2YVVpRmFjdG9yeQotewotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFVaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbnRpdHlDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbWJlZGRhYmxlQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGphdmEgYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhQmFzaWNNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFCYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YVZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFPbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGYwMmZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc+Ci0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTE1MTI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmIzMDY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcyXzAKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4KLXsKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NhY2hpbmc+IHN1YmplY3RIb2xkZXIsCi0gICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW5ldyBKYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4NjZlMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgWCBDdXN0b21Db252ZXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCBDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBYIFR5cGUgQ29udmVydGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8IFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IFggT2plY3QgVHlwZSBDb252ZXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgWCBTdHJ1Y3QgQ29udmVydGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCBTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcj4KLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udmVyc2lvbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPiBzdWJqZWN0SG9sZGVyLAotCQkJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWluaXRpYWxpemVDb252ZXJ0ZXJQYW5lKGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ29udmVydGVyUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIEN1c3RvbSBDb252ZXJ0ZXIgY2hlY2sgYm94Ci0JCUJ1dHRvbiBjdXN0b21Db252ZXJ0ZXJDaGVja0JveCA9IGFkZENoZWNrQm94KAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDUpLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfY3VzdG9tQ29udmVydGVyLAotCQkJYnVpbGRDdXN0b21Db252ZXJ0ZXJCb29sZWFuSG9sZGVyKCksCi0JCQludWxsCi0JCSk7Ci0KLQkJLy8gQ3VzdG9tIENvbnZlcnRlciBwYW5lCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyQ29tcG9zaXRlIGN1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZSgKLQkJCWJ1aWxkQ3VzdG9tQ29udmVydGVySG9sZGVyKCksCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgY3VzdG9tQ29udmVydGVyQ2hlY2tCb3guZ2V0Qm9yZGVyV2lkdGgoKSArIDE2KSwKLQkJCWdldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCQlyZWdpc3RlclN1YlBhbmUoY3VzdG9tQ29udmVydGVyQ29tcG9zaXRlKTsKLQkKLQkJCi0JCS8vIFR5cGUgQ29udmVydGVyIGNoZWNrIGJveAotCQlCdXR0b24gdHlwZUNvbnZlcnRlckNoZWNrQm94ID0gYWRkQ2hlY2tCb3goCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV90eXBlQ29udmVydGVyLAotCQkJYnVpbGRUeXBlQ29udmVydGVyQm9vbGVhbkhvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCi0JCS8vIFR5cGUgQ29udmVydGVyIHBhbmUKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlIHR5cGVDb252ZXJ0ZXJDb21wb3NpdGUgPSBuZXcgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlKAotCQkJYnVpbGRUeXBlQ29udmVydGVySG9sZGVyKCksCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgdHlwZUNvbnZlcnRlckNoZWNrQm94LmdldEJvcmRlcldpZHRoKCkgKyAxNiksCi0JCQlnZXRXaWRnZXRGYWN0b3J5KCkKLQkJKTsKLQkJcmVnaXN0ZXJTdWJQYW5lKHR5cGVDb252ZXJ0ZXJDb21wb3NpdGUpOwotCQkKLQkJLy8gT2JqZWN0IFR5cGUgQ29udmVydGVyIGNoZWNrIGJveAotCQlCdXR0b24gb2JqZWN0VHlwZUNvbnZlcnRlckNoZWNrQm94ID0gYWRkQ2hlY2tCb3goCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9vYmplY3RUeXBlQ29udmVydGVyLAotCQkJYnVpbGRPYmplY3RUeXBlQ29udmVydGVyQm9vbGVhbkhvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCi0JCS8vIE9iamVjdCBUeXBlIENvbnZlcnRlciBwYW5lCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSBvYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlID0gbmV3IEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSgKLQkJCWJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckhvbGRlcigpLAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDAsIG9iamVjdFR5cGVDb252ZXJ0ZXJDaGVja0JveC5nZXRCb3JkZXJXaWR0aCgpICsgMTYpLAotCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpCi0JCSk7Ci0JCXJlZ2lzdGVyU3ViUGFuZShvYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlKTsKLQkJCi0JCS8vIFN0cnVjdCBDb252ZXJ0ZXIgY2hlY2sgYm94Ci0JCUJ1dHRvbiBzdHJ1Y3RDb252ZXJ0ZXJDaGVja0JveCA9IGFkZENoZWNrQm94KAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDUpLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfc3RydWN0Q29udmVydGVyLAotCQkJYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKCksCi0JCQludWxsCi0JCSk7Ci0KLQkJLy8gU3RydWN0IENvbnZlcnRlciBwYW5lCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQ29tcG9zaXRlIHN0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSgKLQkJCWJ1aWxkU3RydWN0Q29udmVydGVySG9sZGVyKCksCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgc3RydWN0Q29udmVydGVyQ2hlY2tCb3guZ2V0Qm9yZGVyV2lkdGgoKSArIDE2KSwKLQkJCWdldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCQlyZWdpc3RlclN1YlBhbmUoc3RydWN0Q29udmVydGVyQ29tcG9zaXRlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEN1c3RvbUNvbnZlcnRlckJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuQ1VTVE9NX0NPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRDdXN0b21Db252ZXJ0ZXIoKSAhPSBudWxsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldEN1c3RvbUNvbnZlcnRlcigpID09IG51bGwpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5hZGRDdXN0b21Db252ZXJ0ZXIoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIXZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0Q3VzdG9tQ29udmVydGVyKCkgIT0gbnVsbCkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnJlbW92ZUN1c3RvbUNvbnZlcnRlcigpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGJ1aWxkQ3VzdG9tQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIsIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPihnZXRTdWJqZWN0SG9sZGVyKCksIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlci5DVVNUT01fQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEN1c3RvbUNvbnZlcnRlcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVHlwZUNvbnZlcnRlckJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuVFlQRV9DT05WRVJURVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0VHlwZUNvbnZlcnRlcigpICE9IG51bGwpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0VHlwZUNvbnZlcnRlcigpID09IG51bGwpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5hZGRUeXBlQ29udmVydGVyKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCF2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldFR5cGVDb252ZXJ0ZXIoKSAhPSBudWxsKSkgewotCQkJCQl0aGlzLnN1YmplY3QucmVtb3ZlVHlwZUNvbnZlcnRlcigpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBidWlsZFR5cGVDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPihnZXRTdWJqZWN0SG9sZGVyKCksIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlci5UWVBFX0NPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VHlwZUNvbnZlcnRlcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSAhPSBudWxsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSA9PSBudWxsKSkgewotCQkJCQl0aGlzLnN1YmplY3QuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQkJCX0KLQkJCQllbHNlIGlmICghdmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRPYmplY3RUeXBlQ29udmVydGVyKCkgIT0gbnVsbCkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gYnVpbGRPYmplY3RUeXBlQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyLlNUUlVDVF9DT05WRVJURVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0U3RydWN0Q29udmVydGVyKCkgIT0gbnVsbCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRTdHJ1Y3RDb252ZXJ0ZXIoKSA9PSBudWxsKSkgewotCQkJCQl0aGlzLnN1YmplY3QuYWRkU3RydWN0Q29udmVydGVyKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCF2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldFN0cnVjdENvbnZlcnRlcigpICE9IG51bGwpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBidWlsZFN0cnVjdENvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyLCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuU1RSVUNUX0NPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2ZDNiNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHBhbmUgZG9lcyBub3QgaGF2ZSBhbnkgd2lkZ2V0cy4KLSAqCi0gKiBAc2VlIEVtYmVkZGFibGUKLSAqIEBzZWUgSmF2YVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICogQHNlZSBFbWJlZGRhYmxlVWlQcm92aWRlcgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW1iZWRkYWJsZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMTE3NmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgYW4gRWNsaXBzZUxpbmsgSmF2YSBlbnRpdHkuCi0gKgotICogQHNlZSBKYXZhRWNsaXBzZUxpbmtFbnRpdHkKLSAqIEBzZWUgRWNsaXBzZWxpbmtKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGU8SmF2YUVudGl0eT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rSmF2YUVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkphdmFFbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDViMjRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAJCQkgIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHggRXhpc3RlbmNlIENoZWNraW5nOiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgIAkJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgQ2FjaGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKCAKLSAgICAgICAgICAgIGNvbnRhaW5lciwgCi0gICAgICAgICAgICBhZGRDaGVja0JveCggCi0gICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgCi0gICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9sYWJlbCwgCi0gICAgICAgICAgICAgICAgIGJ1aWxkRXhpc3RlbmNlQ2hlY2tpbmdIb2xkZXIoKSwgCi0gICAgICAgICAgICAgICAgIG51bGwgCi0gICAgICAgICAgICApLCAKLSAgICAgICAgICAgIGFkZEV4aXN0ZW5jZUNoZWNraW5nVHlwZUNvbWJvKGNvbnRhaW5lcikuZ2V0Q29udHJvbCgpLCAKLSAgICAgICAgICAgIG51bGwgCi0gICAgICAgKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGU+IGFkZEV4aXN0ZW5jZUNoZWNraW5nVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5jbGFzcywKLQkJCQkJSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUudGhpcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUodmFsdWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEV4aXN0ZW5jZUNoZWNraW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEphdmFFY2xpcHNlTGlua0NhY2hpbmcuRVhJU1RFTkNFX0NIRUNLSU5HX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0Lmhhc0V4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEV4aXN0ZW5jZUNoZWNraW5nKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjY2ZjNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBwYW5lIHVzZWQgZm9yIGFuIEVjbGlwc2VMaW5rIEphdmEgTWFwcGVkIFN1cGVyY2xhc3MuCi0gKgotICogQHNlZSBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MKLSAqIEBzZWUgRWNsaXBzZWxpbmtKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlY2M0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc+Ci0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDFlN2U3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2NTFjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLlNjaGVtYUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGFja2FnZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVF1ZXJpZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgWG1sUGFja2FnZUNob29zZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBTY2hlbWE6ICAgICAgfCBTY2hlbWFDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBDYXRhbG9nOiAgICAgfCBDYXRhbG9nQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBBY2Nlc3MgVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9ybVF1ZXJpZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29udmVydGVyc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3MKLSAqIEBzZWUgQWJzdHJhY3RFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBDYXRhbG9nQ29tYm8KLSAqIEBzZWUgRW51bUZvcm1Db21ib1ZpZXdlcgotICogQHNlZSBFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUKLSAqIEBzZWUgT3JtUGFja2FnZUNob29zZXIKLSAqIEBzZWUgT3JtUXVlcmllc0NvbXBvc2l0ZQotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZQotICogQHNlZSBTY2hlbWFDb21ibwotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVudGl0eU1hcHBpbmdzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUdlbmVyYXRvcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplUXVlcmllc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY29udmVydGVycwotCQkpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZUNvbnZlcnRlcnNTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQl0aGlzLmJ1aWxkQ29udmVydGVySG9sZGVyKCksCi0JCQljb250YWluZXIKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+IGJ1aWxkQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHlNYXBwaW5ncywgRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgdGhpcy5zdWJqZWN0KS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMGQ0ZDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RPcm1FbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RPcm1FbnRpdHlDb21wb3NpdGUKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVudGl0eUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVDYWNoaW5nQ29sbGFwc2libGVTZWN0aW9uUGFuZShjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVRdWVyaWVzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUluaGVyaXRhbmNlQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVHZW5lcmF0b3JzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUFkdmFuY2VkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoaW5nQ29sbGFwc2libGVTZWN0aW9uUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NhY2hpbmcpOwotCQlpbml0aWFsaXplQ2FjaGluZ1NlY3Rpb24oY29udGFpbmVyLCBidWlsZENhY2hpbmdIb2xkZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoaW5nU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWNsaXBzZUxpbmtDYWNoaW5nPiBjYWNoaW5nSG9sZGVyKSB7Ci0JCW5ldyBPcm1FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUodGhpcywgY2FjaGluZ0hvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQkKLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1FbnRpdHksIE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4gYnVpbGRDYWNoaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1FbnRpdHksIE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0NhY2hpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIHRoaXMuc3ViamVjdCkuZ2V0Q2FjaGluZygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NvbnZlcnRlcnMpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJ0ZXJzU2VjdGlvbihjb250YWluZXIsIGJ1aWxkQ29udmVydGVySG9sZGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSh0aGlzLCBjb252ZXJ0ZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPiBidWlsZENvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtRW50aXR5LCBFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChPcm1FY2xpcHNlTGlua0VudGl0eSkgdGhpcy5zdWJqZWN0KS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFkdmFuY2VkQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI4MjNiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0FkdmFuY2VkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklkQ2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUphdmFDbGFzc0Nob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTxUIGV4dGVuZHMgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzPiAKLQlleHRlbmRzIEFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTxUPiAKLQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCXByb3RlY3RlZCBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZU1hcHBlZFN1cGVyY2xhc3NDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUFkdmFuY2VkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYXBwZWRTdXBlcmNsYXNzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1KYXZhQ2xhc3NDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IElkQ2xhc3NDb21wb3NpdGUodGhpcywgYnVpbGRJZENsYXNzUmVmZXJlbmNlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBNZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NhY2hpbmcpOwotCQl0aGlzLmluaXRpYWxpemVDYWNoaW5nU2VjdGlvbihjb250YWluZXIsIGJ1aWxkQ2FjaGluZ0hvbGRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hpbmdTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1FY2xpcHNlTGlua0NhY2hpbmc+IGNhY2hpbmdIb2xkZXIpIHsKLQkJbmV3IE9ybUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSh0aGlzLCBjYWNoaW5nSG9sZGVyLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBPcm1FY2xpcHNlTGlua0NhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgT3JtRWNsaXBzZUxpbmtDYWNoaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ2FjaGluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENhY2hpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jb252ZXJ0ZXJzKTsKLQkJdGhpcy5pbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oY29udGFpbmVyLCBidWlsZENvbnZlcnRlckhvbGRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCW5ldyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUodGhpcywgY29udmVydGVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVySG9sZGVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NBZHZhbmNlZENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Jhc2VFY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQmFzZUVjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOGIzNDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQmFzZUVjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkJhc2VPcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VFY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeSBleHRlbmRzIEJhc2VPcm1YbWxVaUZhY3RvcnkKLXsKLQkvLyAqKioqKioqKioqKioqKioqIG9ybSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW50aXR5Q29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVtYmVkZGFibGVDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBvcm0gYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1CYXNpY01hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVRyYW5zaWVudE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTFmOTEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuVmFsaWRhdGluZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0xpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIENsaWVudHMgY2FuIHVzZSB0aGlzIGRpYWxvZyB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIFNlY29uZGFyeVRhYmxlIHNldHRpbmdzLgotICogVXNlIHRoZSBmb2xsb3dpbmcgb25jZSB0aGUgZGlhbG9nIGlzIGNsb3NlZDoKLSAqICAgICBAc2VlICNnZXRTZWxlY3RlZFRhYmxlKCkKLSAqICAgICBAc2VlICNnZXRTZWxlY3RlZENhdGFsb2coKQotICogICAgIEBzZWUgI2dldFNlbGVjdGVkU2NoZW1hKCkKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2cgZXh0ZW5kcyBWYWxpZGF0aW5nRGlhbG9nPEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3Q+IHsKLQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHRvIGVkaXQgYW4gZXhpc3RpbmcgY29udmVyc2lvbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3QoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG9wZW4gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KHRoaXMuZ2V0VGl0bGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfYWRkQ29udmVydGVyOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb25UaXRsZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfYWRkQ29udmVydGVyRGVzY3JpcHRpb25UaXRsZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfYWRkQ29udmVydGVyRGVzY3JpcHRpb247Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEaWFsb2dQYW5lPEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3Q+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uVmFsdWVEaWFsb2dQYW5lKGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0KLQkJQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZSBwYW5lID0gKENvbnZlcnNpb25WYWx1ZURpYWxvZ1BhbmUpIGdldFBhbmUoKTsKLQkJcGFuZS5zZWxlY3RBbGwoKTsKLQotCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YSB2YWx1ZSBzZXQgaW4gdGhlIHRleHQgd2lkZ2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdmFsdWUgc2V0IGluIHRoZSB0ZXh0IHdpZGdldC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlclR5cGUoKSB7Ci0JCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0Q29udmVydGVyVHlwZSgpOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIENvbnZlcnNpb25WYWx1ZURpYWxvZ1BhbmUgZXh0ZW5kcyBEaWFsb2dQYW5lPEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3Q+IHsKLQotCQlwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0KLQkJQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZy50aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCXRoaXMubmFtZVRleHQgPSBhZGRMYWJlbGVkVGV4dCgKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19uYW1lLAotCQkJCWJ1aWxkTmFtZUhvbGRlcigpCi0JCQkpOwotCQkJCi0JCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQkJY29udGFpbmVyLCAKLQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX2NvbnZlcnRlclR5cGUsIAotCQkJCWJ1aWxkQ29udmVydGVyVHlwZUxpc3RIb2xkZXIoKSwgCi0JCQkJYnVpbGRDb252ZXJ0ZXJUeXBlSG9sZGVyKCksIAotCQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCksCi0JCQkJbnVsbCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbnZlcnRlclR5cGVMaXN0SG9sZGVyKCkgewotCQkJTGlzdDxTdHJpbmc+IGNvbnZlcnRlclR5cGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQljb252ZXJ0ZXJUeXBlcy5hZGQoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUik7Ci0JCQljb252ZXJ0ZXJUeXBlcy5hZGQoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCWNvbnZlcnRlclR5cGVzLmFkZChFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJCWNvbnZlcnRlclR5cGVzLmFkZChFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUik7Ci0JCQkKLQkJCXJldHVybiBuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8U3RyaW5nPihjb252ZXJ0ZXJUeXBlcyk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+KCkgewotCQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQkJCQlpZiAodmFsdWUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUikgewotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX2N1c3RvbUNvbnZlcnRlcjsKLQkJCQkJfQotCQkJCQlpZiAodmFsdWUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSB7Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQkJCQkJfQotCQkJCQlpZiAodmFsdWUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUikgewotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX3N0cnVjdENvbnZlcnRlcjsKLQkJCQkJfQotCQkJCQlpZiAodmFsdWUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpIHsKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV90eXBlQ29udmVydGVyOwotCQkJCQl9Ci0JCQkJCXJldHVybiB2YWx1ZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb252ZXJ0ZXJUeXBlSG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3QuQ09OVkVSVEVSX1RZUEVfUFJPUEVSVFkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlclR5cGUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRDb252ZXJ0ZXJUeXBlKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJdm9pZCBzZWxlY3RBbGwoKSB7Ci0JCQl0aGlzLm5hbWVUZXh0LnNlbGVjdEFsbCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTdmMDE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLkFic3RyYWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Qcm9ibGVtOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHN0YXRlIG9iamVjdCB1c2VkIGJ5IHRoZSA8Y29kZT5FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZzwvY29kZT4sIHdoaWNoIHN0b3JlcwotICogdGhlIGN1cnJlbnQgbmFtZSBhbmQgdmFsaWRhdGVzIGl0IHdoZW4gaXQgaXMgbW9kaWZpZWQuCi0gKgotICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1maW5hbCBjbGFzcyBFY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0IGV4dGVuZHMgQWJzdHJhY3ROb2RlCi17Ci0JLyoqCi0JICogVGhlIGluaXRpYWwgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBUaGUgaW5pdGlhbCBjb252ZXJ0ZXJUeXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydGVyVHlwZTsKLQotCS8qKgotCSAqIFRoZSA8Y29kZT5WYWxpZGF0b3I8L2NvZGU+IHVzZWQgdG8gdmFsaWRhdGUgdGhpcyBzdGF0ZSBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JLyoqCi0JICogTm90aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIGRhdGEgdmFsdWUgcHJvcGVydHkuCi0JICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogTm90aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIG9iamVjdCB2YWx1ZSBwcm9wZXJ0eS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRFUl9UWVBFX1BST1BFUlRZID0gImNvbnZlcnRlclR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5ld05hbWVTdGF0ZU9iamVjdDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBUaGUgaW5pdGlhbCBpbnB1dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpbml0aWFsIHZhbHVlIGNhbgotCSAqIGJlIHNwZWNpZmllZAotCSAqIEBwYXJhbSBuYW1lcyBUaGUgY29sbGVjdGlvbiBvZiBuYW1lcyB0aGF0IGNhbid0IGJlIHVzZWQgb3IgYW4gZW1wdHkKLQkgKiBjb2xsZWN0aW9uIGlmIG5vbmUgYXJlIGF2YWlsYWJsZQotCSAqLwotCUVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3QoKSB7Ci0JCXN1cGVyKG51bGwpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5hbWVQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMubmFtZSkpIHsKLQkJCWN1cnJlbnRQcm9ibGVtcy5hZGQoYnVpbGRQcm9ibGVtKEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ29udmVydGVyVHlwZVByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5jb252ZXJ0ZXJUeXBlKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X3R5cGVNdXN0QmVTcGVjaWZpZWQpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKLQkJc3VwZXIuYWRkUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCQlhZGROYW1lUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCQlhZGRDb252ZXJ0ZXJUeXBlUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNoZWNrUGFyZW50KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBOb2RlIHBhcmVudE5vZGUpIHsKLQkJLy9ubyBwYXJlbnQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCVN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCVN0cmluZyBnZXRDb252ZXJ0ZXJUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyVHlwZShTdHJpbmcgbmV3Q29udmVydGVyVHlwZSkgewotCQlTdHJpbmcgb2xkQ29udmVydGVyVHlwZSA9IHRoaXMuY29udmVydGVyVHlwZTsKLQkJdGhpcy5jb252ZXJ0ZXJUeXBlID0gbmV3Q29udmVydGVyVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfVFlQRV9QUk9QRVJUWSwgb2xkQ29udmVydGVyVHlwZSwgbmV3Q29udmVydGVyVHlwZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnZhbGlkYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTE2MmQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNhdGFsb2dDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QYWNrYWdlQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUXVlcmllc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgWG1sUGFja2FnZUNob29zZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBTY2hlbWE6ICAgICAgfCBTY2hlbWFDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBDYXRhbG9nOiAgICAgfCBDYXRhbG9nQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBBY2Nlc3MgVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9ybVF1ZXJpZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29udmVydGVyc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3MKLSAqIEBzZWUgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgQ2F0YWxvZ0NvbWJvCi0gKiBAc2VlIEVudW1Gb3JtQ29tYm9WaWV3ZXIKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlCi0gKiBAc2VlIE9ybVBhY2thZ2VDaG9vc2VyCi0gKiBAc2VlIE9ybVF1ZXJpZXNDb21wb3NpdGUKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUKLSAqIEBzZWUgU2NoZW1hQ29tYm8KLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSBleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYTc5OTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIHtAbGluayBKcGFEZXRhaWxzUGFnZX0KLSAqIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIFhNTCBmaWxlIChlaXRoZXIgZnJvbSB0aGUgcGVyc2lzdGVuY2UKLSAqIGNvbmZpZ3VyYXRpb24gb3IgZnJvbSB0aGUgTWFwcGluZ3MgRGVzY3JpcHRvcikuCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhRGV0YWlsc1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhRGV0YWlsc1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm92aWRlc0RldGFpbHMoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRSkKLQkJCQl8fCByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMV9SRVNPVVJDRV9UWVBFKQotCQkJCXx8IHJlc291cmNlVHlwZS5lcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8yX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkRGV0YWlsc1BhZ2UoCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZShwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODA2Mzg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnN0cnVjdHVyZS5FY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW50aXR5VWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1JZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVhtbFVpRmFjdG9yeSBidWlsZE9ybVhtbFVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8wX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5pbnN0YW5jZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChPcm1JZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OWFlNWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeSBleHRlbmRzIEJhc2VFY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeQotewotCS8vbm90aGluZwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4MmI1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc+Ci0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YWM5ODIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+Ci0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyODAwZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLy9SZW1vdmUgdGhlIENvbnZlcnRlcnMgc2VjdGlvbiBmcm9tIDEuMCBvcm0gYmFzaWMgbWFwcGluZ3MuCi0vL1RoaXMgaXMgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIGluIHZlcnNpb24gMS4xLCBidXQgbm90IDEuMAotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGU8T3JtQmFzaWNNYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtPcm1CYXNpY01hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5CYXNpY01hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1CYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJhc2ljU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGFkZFN1YlBhbmUoY29udGFpbmVyLCA0KSk7Ci0JCW5ldyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUodGhpcywgYnVpbGRNdXRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JLy9ldmVyeXRoaW5nIGJ1dCB0aGUgJ0RlZmluZSBDb252ZXJ0ZXInIHNlY3Rpb24uICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZWNsaXBzZWxpbmsgMS4wLCBidXQgaXMgaW4gMS4xCi0JcHJvdGVjdGVkIFBhbmU8RWNsaXBzZUxpbmtDb252ZXJ0PiBidWlsZENvbnZlcnRDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydD4gY29udmVydEhvbGRlciwgQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydDFfMENvbXBvc2l0ZShjb252ZXJ0SG9sZGVyLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzYTFmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHBhbmUgc2hvd3MgdGhlIGNhY2hpbmcgb3B0aW9ucy4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCB4IFNoYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgQ2FjaGVUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlU2l6ZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICA+IEFkdmFuY2VkICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIAlFeHBpcnlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJQWx3YXlzUmVmcmVzaENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAJCVJlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIAlEaXNhYmxlSGl0c0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJQ2FjaGVDb29yZGluYXRpb25Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgRXhpc3RlbmNlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZwotICogQHNlZSBKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlIGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlPE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4KLXsKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAotICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWNsaXBzZUxpbmtDYWNoaW5nPiBzdWJqZWN0SG9sZGVyLAotICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQluZXcgT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnQxXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydDFfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDA1NGFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydDFfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENvbnZlcnRlcjogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnQKLSAqIEBzZWUgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi0KLS8vUmVtb3ZlcyB0aGUgRGVmaW5lIENvbnZlcnRlcnMgc2VjdGlvbiBmcm9tIG9ybSBiYXNpYywgaWQsIHZlcnNpb24gbWFwcGluZy4KLS8vVGhpcyBpcyBzdXBwb3J0ZWQgaW4gRWNsaXBzZUxpbmsgaW4gdmVyc2lvbiAxLjEsIGJ1dCBub3QgMS4wCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtDb252ZXJ0MV8wQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+Ci17Ci0KLQkvKioKLQkgKiBBIGtleSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGVmYXVsdCB2YWx1ZSwgdGhpcyBpcyByZXF1aXJlZCB0byBjb252ZXJ0Ci0JICogdGhlIHNlbGVjdGVkIGl0ZW0gZnJvbSBhIGNvbWJvIHRvIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzIGtleSBpcyBtb3N0Ci0JICogbGlrZWx5IG5ldmVyIHR5cGVkIHRoZSB1c2VyIGFuZCBpdCB3aWxsIGhlbHAgdG8gY29udmVydCB0aGUgdmFsdWUgdG8KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIGl0J3MgdGltZSB0byBzZXQgdGhlIG5ldyBzZWxlY3RlZCB2YWx1ZSBpbnRvIHRoZQotCSAqIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfS0VZID0gIj8hIyE/Iz8jP2RlZmF1bHQ/Iz8hIz8hIz8iOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtVHlwZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0MV8wQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbWJvIGNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9jb252ZXJ0ZXJOYW1lTGFiZWwsCi0JCQlidWlsZENvbnZlcnROYW1lTGlzdEhvbGRlcigpLAotCQkJYnVpbGRDb252ZXJ0TmFtZUhvbGRlcigpLAotCQkJYnVpbGROYW1lQ29udmVydGVyKCksCi0JCQludWxsCi0JCSk7Ci0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JCQkJCi0JCW5ldyBQYW5lRW5hYmxlcihidWlsZEJvb2xlYW5Ib2xkZXIoKSwgdGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29udmVydE5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydC5TUEVDSUZJRURfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJLy8gQ29udmVydCB0aGUgZGVmYXVsdCB2YWx1ZSBvciBhbiBlbXB0eSBzdHJpbmcgdG8gbnVsbAotCQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYKLQkJCQkgICAoKHZhbHVlLmxlbmd0aCgpID09IDApIHx8IHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSkgewotCi0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb252ZXJ0TmFtZUxpc3RIb2xkZXIoKSB7Ci0JCWphdmEudXRpbC5MaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGJ1aWxkRGVmYXVsdE5hbWVMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZFJlc2VydmVkQ29udmVydGVyTmFtZUxpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkQ29udmVydGVyTmFtZUxpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPihsaXN0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCWJ1aWxkRGVmYXVsdE5hbWVIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHROYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnQsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnQuREVGQVVMVF9DT05WRVJURVJfTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCVN0cmluZyBuYW1lID0gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRDb252ZXJ0ZXJOYW1lKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBERUZBVUxUX0tFWTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5hbWUgPSBERUZBVUxUX0tFWSArIG5hbWU7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZE5hbWVDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChnZXRTdWJqZWN0KCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQkJfQotCi0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdENvbnZlcnRlck5hbWUoKTsKLQotCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQkJdmFsdWUgPSBERUZBVUxUX0tFWSArIHZhbHVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdmFsdWUgPSBERUZBVUxUX0tFWTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICh2YWx1ZS5zdGFydHNXaXRoKERFRkFVTFRfS0VZKSkgewotCQkJCQlTdHJpbmcgZGVmYXVsdE5hbWUgPSB2YWx1ZS5zdWJzdHJpbmcoREVGQVVMVF9LRVkubGVuZ3RoKCkpOwotCi0JCQkJCWlmIChkZWZhdWx0TmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCXZhbHVlID0gTkxTLmJpbmQoCi0JCQkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQkJCQlkZWZhdWx0TmFtZQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZhbHVlID0gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdEVtcHR5OwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUmVzZXJ2ZWRDb252ZXJ0ZXJOYW1lTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KEVjbGlwc2VMaW5rQ29udmVydC5SRVNFUlZFRF9DT05WRVJURVJfTkFNRVMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbnZlcnRlck5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBTdHJpbmc+KAotCQkJYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LkNPTlZFUlRFUlNfTElTVCkvL1RPRE8gbmVlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBpbnRlcmZhY2UKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3RJdGVyYXRvcihBcnJheVRvb2xzLnNvcnQodGhpcy5zdWJqZWN0LnVuaXF1ZUNvbnZlcnRlck5hbWVzKCkpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydCwgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgZ2V0U3ViamVjdCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShFY2xpcHNlTGlua0NvbnZlcnQgdmFsdWUpIHsKLQkJCQlpZiAoZ2V0U3ViamVjdCgpICE9IG51bGwgJiYgZ2V0U3ViamVjdCgpLmdldFBhcmVudCgpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjgxYjNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBsaXN0IG9mIG5hbWVkIHF1ZXJpZXMgYW5kIG5hbWVkIG5hdGl2ZSBxdWVyaWVzLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENvbnZlcnRlckNvbXBvc2l0ZSBvciBPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvciBTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUgb3IgVHlwZUNvbnZlcnRlckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHkKLSAqIEBzZWUgUXVlcnkKLSAqIEBzZWUgTmFtZWROYXRpdmVRdWVyeQotICogQHNlZSBOYW1lZFF1ZXJ5Ci0gKiBAc2VlIEFic3RyYWN0RW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlCi0gKiBAc2VlIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcj4KLXsKLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lPEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPiBsaXN0UGFuZTsKLQlwcml2YXRlIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyQ29tcG9zaXRlIGNvbnZlcnRlckNvbXBvc2l0ZTsKLQlwcml2YXRlIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSBvYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlOwotCXByaXZhdGUgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUgc3RydWN0Q29udmVydGVyQ29tcG9zaXRlOwotCXByaXZhdGUgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlIHR5cGVDb252ZXJ0ZXJDb21wb3NpdGU7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlcj4gc2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXI7Ci0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlKAotCQlQYW5lPD8+IHBhcmVudFBhbmUsIAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5zZWxlY3RlZENvbnZlcnRlckhvbGRlciA9IGJ1aWxkU2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPiBidWlsZFNlbGVjdGVkQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlcj4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBMaXN0IHBhbmUKLQkJdGhpcy5saXN0UGFuZSA9IGFkZExpc3RQYW5lKGNvbnRhaW5lcik7Ci0KLQkJLy8gUHJvcGVydHkgcGFuZQotCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJdGhpcy5jb252ZXJ0ZXJDb21wb3NpdGUgPSBuZXcgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUoCi0JCQlidWlsZEN1c3RvbUNvbnZlcnRlckhvbGRlcigpLAotCQkJcGFnZUJvb2ssCi0JCQlnZXRXaWRnZXRGYWN0b3J5KCkKLQkJKTsKLQkJcmVnaXN0ZXJTdWJQYW5lKHRoaXMuY29udmVydGVyQ29tcG9zaXRlKTsKLQkJCi0JCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUoCi0JCQlidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJIb2xkZXIoKSwKLQkJCXBhZ2VCb29rLAotCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpCi0JCSk7Ci0JCXJlZ2lzdGVyU3ViUGFuZSh0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUpOwotCQkKLQkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUgPSBuZXcgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUoCi0JCQlidWlsZFN0cnVjdENvbnZlcnRlckhvbGRlcigpLAotCQkJcGFnZUJvb2ssCi0JCQlnZXRXaWRnZXRGYWN0b3J5KCkKLQkJKTsKLQkJcmVnaXN0ZXJTdWJQYW5lKHRoaXMuc3RydWN0Q29udmVydGVyQ29tcG9zaXRlKTsKLQkJCi0JCXRoaXMudHlwZUNvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGUoCi0JCQlidWlsZFR5cGVDb252ZXJ0ZXJIb2xkZXIoKSwKLQkJCXBhZ2VCb29rLAotCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpCi0JCSk7Ci0JCXJlZ2lzdGVyU3ViUGFuZSh0aGlzLnR5cGVDb252ZXJ0ZXJDb21wb3NpdGUpOwotCi0JCWluc3RhbGxQYW5lU3dpdGNoZXIocGFnZUJvb2spOwotCX0KLQotCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8RWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+IGFkZExpc3RQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPigKLQkJCXRoaXMsCi0JCQljb250YWluZXIsCi0JCQlidWlsZENvbnZlcnRlcnNBZGFwdGVyKCksCi0JCQlidWlsZERpc3BsYXlhYmxlQ29udmVydGVyc0xpc3RIb2xkZXIoKSwKLQkJCXRoaXMuc2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXIsCi0JCQlidWlsZENvbnZlcnRlcnNMaXN0TGFiZWxQcm92aWRlcigpLAotCQkJbnVsbC8vSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19OQU1FRF9RVUVSSUVTCi0JCSkgewotCQkJLy9UT0RPIHllYWgsIHRoaXMgaXMgd2VpcmQsIGJ1dCBpIGRvbid0IHdhbnQgdGhpcyB0byBiZSBkaXNhYmxlZCBqdXN0Ci0JCQkvL2JlY2F1c2UgdGhlIHN1YmplY3QgaXMgbnVsbC4gaSBoYXZlIG5vIG5lZWQgZm9yIHRoYXQgYW5kIHRoYXQgaXMKLQkJCS8vY3VycmVudGx5IGhvdyBBZGRSZW1vdmVQYW5lIHdvcmtzLiAgU2VlIE9ybVF1ZXJpZXNDb21wb3NpdGUgd2hlcmUKLQkJCS8vdGhlIHdvcmsgYXJvdW5kIHRoZXJlIGlzIHlldCBhbm90aGVyIHBhbmUgZW5hYmxlci4gIEkgd2FudCB0byBjaGFuZ2UKLQkJCS8vaG93IHRoaXMgd29ya3MgaW4gMi4yCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyh0cnVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVTd2l0Y2hlcihQYWdlQm9vayBwYWdlQm9vaykgewotCQluZXcgQ29udHJvbFN3aXRjaGVyKHRoaXMuc2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXIsIGJ1aWxkUGFuZVRyYW5zZm9ybWVyKCksIHBhZ2VCb29rKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkQ29udmVydGVyc0FkYXB0ZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWFkZENvbnZlcnRlcigpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJaWYgKCgoRWNsaXBzZUxpbmtDb252ZXJ0ZXIpIGl0ZW0pLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSKSB7Ci0JCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlQ3VzdG9tQ29udmVydGVyKChFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgaXRlbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoKChFY2xpcHNlTGlua0NvbnZlcnRlcikgaXRlbSkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUikgewotCQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgaXRlbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoKChFY2xpcHNlTGlua0NvbnZlcnRlcikgaXRlbSkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVIpIHsKLQkJCQkJCWdldFN1YmplY3QoKS5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSBpdGVtKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICgoKEVjbGlwc2VMaW5rQ29udmVydGVyKSBpdGVtKS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpIHsKLQkJCQkJCWdldFN1YmplY3QoKS5yZW1vdmVUeXBlQ29udmVydGVyKChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpIGl0ZW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDb252ZXJ0ZXIoKSB7Ci0JCWFkZEVjbGlwc2VMaW5rQ29udmVydGVyRnJvbURpYWxvZyhidWlsZEVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2cgYnVpbGRFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZygpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZyhnZXRTaGVsbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFY2xpcHNlTGlua0NvbnZlcnRlckZyb21EaWFsb2coRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2cgZGlhbG9nKSB7Ci0JCWlmIChkaWFsb2cub3BlbigpICE9IFdpbmRvdy5PSykgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBjb252ZXJ0ZXJUeXBlID0gZGlhbG9nLmdldENvbnZlcnRlclR5cGUoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyOwotCQlpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSKSB7Ci0JCQljb252ZXJ0ZXIgPSB0aGlzLmdldFN1YmplY3QoKS5hZGRDdXN0b21Db252ZXJ0ZXIoZ2V0U3ViamVjdCgpLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSB7Ci0JCQljb252ZXJ0ZXIgPSB0aGlzLmdldFN1YmplY3QoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKGdldFN1YmplY3QoKS5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKSB7Ci0JCQljb252ZXJ0ZXIgPSB0aGlzLmdldFN1YmplY3QoKS5hZGRTdHJ1Y3RDb252ZXJ0ZXIoZ2V0U3ViamVjdCgpLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpIHsKLQkJCWNvbnZlcnRlciA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZFR5cGVDb252ZXJ0ZXIoZ2V0U3ViamVjdCgpLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQljb252ZXJ0ZXIuc2V0TmFtZShkaWFsb2cuZ2V0TmFtZSgpKTsKLQkJdGhpcy5zZWxlY3RlZENvbnZlcnRlckhvbGRlci5zZXRWYWx1ZShjb252ZXJ0ZXIpOy8vc28gdGhhdCBpdCBnZXRzIHNlbGVjdGVkIGluIHRoZSBMaXN0IGZvciB0aGUgdXNlciB0byBlZGl0Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxFY2xpcHNlTGlua0NvbnZlcnRlciwgQ29udHJvbD4gYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXIsIENvbnRyb2w+KCkgewotCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCWlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAoY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSKSB7Ci0JCQkJCXJldHVybiBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUudGhpcy5jb252ZXJ0ZXJDb21wb3NpdGUuZ2V0Q29udHJvbCgpOwotCQkJCX0KLQkJCQlpZiAoY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVIpIHsKLQkJCQkJcmV0dXJuIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZS50aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUuZ2V0Q29udHJvbCgpOwotCQkJCX0KLQkJCQlpZiAoY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKSB7Ci0JCQkJCXJldHVybiBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUudGhpcy5zdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUuZ2V0Q29udHJvbCgpOwotCQkJCX0KLQkJCQlpZiAoY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUikgewotCQkJCQlyZXR1cm4gT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlLnRoaXMudHlwZUNvbnZlcnRlckNvbXBvc2l0ZS5nZXRDb250cm9sKCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlcj4gYnVpbGREaXNwbGF5YWJsZUNvbnZlcnRlcnNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnRlcj4oCi0JCQlidWlsZEVjbGlwc2VMaW5rQ29udmVydGVyc0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXIuTkFNRV9QUk9QRVJUWQotCQkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJzSG9sZGVyKCkgewotCQlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcj4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcj4+KCk7Ci0JCWxpc3QuYWRkKGJ1aWxkQ3VzdG9tQ29udmVydGVyc0xpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlcnNMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZFN0cnVjdENvbnZlcnRlcnNMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZFR5cGVDb252ZXJ0ZXJzTGlzdEhvbGRlcigpKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+LCBFY2xpcHNlTGlua0NvbnZlcnRlcj4obGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gYnVpbGRDdXN0b21Db252ZXJ0ZXJzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciwgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuQ1VTVE9NX0NPTlZFUlRFUlNfTElTVCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuY3VzdG9tQ29udmVydGVycygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUlNfTElTVCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IGJ1aWxkU3RydWN0Q29udmVydGVyc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyLlNUUlVDVF9DT05WRVJURVJTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc3RydWN0Q29udmVydGVyc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gYnVpbGRUeXBlQ29udmVydGVyc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlci5UWVBFX0NPTlZFUlRFUlNfTElTVCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnR5cGVDb252ZXJ0ZXJzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBidWlsZEN1c3RvbUNvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlciwgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+KHRoaXMuc2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLkNVU1RPTV9DT05WRVJURVIgPyAoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpIHZhbHVlIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlciwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPih0aGlzLnNlbGVjdGVkQ29udmVydGVySG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgdHJhbnNmb3JtXyhFY2xpcHNlTGlua0NvbnZlcnRlciB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSID8gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBidWlsZFN0cnVjdENvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlciwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+KHRoaXMuc2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVIgPyAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIpIHZhbHVlIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IGJ1aWxkVHlwZUNvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlciwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPih0aGlzLnNlbGVjdGVkQ29udmVydGVySG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgdHJhbnNmb3JtXyhFY2xpcHNlTGlua0NvbnZlcnRlciB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIgPyAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSB2YWx1ZSA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZENvbnZlcnRlcnNMaXN0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0NvbnZlcnRlcikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JCXRoaXMubGlzdFBhbmUuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQl9Ci0KLQkvL1RPRE8gbmVlZCB0byBjaGVjayB0aGUgY29udmVydGVyIHJlcG9zaXRvcnkgZm9yIHRoaXMsIHNob3VsZCBjaGVjayBhbGwgY29udmVydGVycywgZXhjZXB0IGZvciB0aGUgb3ZlcnJpZGUgY2FzZSwgaG1tCi0JLy93ZSBhdCBsZWFzdCBuZWVkIHRvIGNoZWNrIHR5cGVjb252ZXJ0ZXJzLCBjb252ZXJ0ZXJzLCBzdHJ1Y3Rjb252ZXJ0ZXJzLCBhbmQgb2JqZWN0eXBlY29udmVydGVycywgb24gdGhpcyBwYXJ0aWN1bGFyCi0JLy9vYmplY3QuICBvciB3ZSBuZWVkIHRvIGdpdmUgYSB3YXJuaW5nIGFib3V0IHRoZSBjYXNlIHdoZXJlIHlvdSBhcmUgb3ZlcnJpZGluZyBvciBhbiBlcnJvciBpZiBpdCdzIG5vdCBhbiBvdmVycmlkZT8KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY29udmVydGVyTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciwgU3RyaW5nPihnZXRTdWJqZWN0KCkuY3VzdG9tQ29udmVydGVycygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMzY1MzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0VtYmVkZGFibGVBZHZhbmNlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtSmF2YUNsYXNzQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHBhbmUgZG9lcyBub3QgaGF2ZSBhbnkgd2lkZ2V0cy4KLSAqCi0gKiBAc2VlIEVtYmVkZGFibGUKLSAqIEBzZWUgRW1iZWRkYWJsZVVpUHJvdmlkZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZTxUIGV4dGVuZHMgT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlPiAKLQlleHRlbmRzIEFic3RyYWN0RW1iZWRkYWJsZUNvbXBvc2l0ZTxUPgotCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVFbWJlZGRhYmxlQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbWJlZGRhYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1KYXZhQ2xhc3NDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGUodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEFjY2Vzc0hvbGRlcj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY29udmVydGVycwotCQkpOwotCQlpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oY29udGFpbmVyLCB0aGlzLmJ1aWxkQ29udmVydGVySG9sZGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+IGNvbnZlcnRlckhvbGRlcikgewotCQluZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlKHRoaXMsIGNvbnZlcnRlckhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+IGJ1aWxkQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlckhvbGRlcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWR2YW5jZWRDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZThkMGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzRjMmM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgIAkJCSAgCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgeCBFeGlzdGVuY2UgQ2hlY2tpbmc6ICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgCQkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZwotICogQHNlZSBDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ2FjaGluZz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSggCi0gICAgICAgICAgICBjb250YWluZXIsIAotICAgICAgICAgICAgRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2xhYmVsLAotICAgICAgICAgICAgYWRkRXhpc3RlbmNlQ2hlY2tpbmdUeXBlQ29tYm8oY29udGFpbmVyKS5nZXRDb250cm9sKCksIAotICAgICAgICAgICAgbnVsbCAKLSAgICAgICApOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZT4gYWRkRXhpc3RlbmNlQ2hlY2tpbmdUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfRVhJU1RFTkNFX1RZUEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfRVhJU1RFTkNFX1RZUEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLmNsYXNzLAotCQkJCQlPcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlLnRoaXMsCi0JCQkJCXZhbHVlCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKHZhbHVlKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYzYzA3OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vL1JlbW92ZSB0aGUgQ29udmVydGVycyBzZWN0aW9uIGZyb20gMS4wIG9ybSBpZCBtYXBwaW5ncy4KLS8vVGhpcyBpcyBzdXBwb3J0ZWQgaW4gRWNsaXBzZUxpbmsgaW4gdmVyc2lvbiAxLjEsIGJ1dCBub3QgMS4wCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUKLQlleHRlbmRzIEVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlPE9ybUlkTWFwcGluZz4KLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewkJCi0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUodGhpcywgYnVpbGRNdXRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQkvL2V2ZXJ5dGhpbmcgYnV0IHRoZSAnRGVmaW5lIENvbnZlcnRlcicgc2VjdGlvbi4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBpbiBlY2xpcHNlbGluayAxLjAsIGJ1dCBpcyBpbiAxLjEKLQlwcm90ZWN0ZWQgUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkQ29udmVydENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBjb252ZXJ0SG9sZGVyLCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0MV8wQ29tcG9zaXRlKGNvbnZlcnRIb2xkZXIsIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOGQ0YTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcmRlcmluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JkZXJpbmdDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUge0BsaW5rIE1hbnlUb01hbnlNYXBwaW5nfQotICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBGZXRjaFR5cGVDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBDYXNjYWRlQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgT3JkZXJpbmdDb21wb3NpdGV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlCi0JZXh0ZW5kcyBFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPE9ybU1hbnlUb01hbnlNYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvTWFueU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMxOTk4Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgTWFueVRvT25lTWFwcGluZ30KLSAqIEBzZWUge0BsaW5rIFRhcmdldEVudGl0eUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBGZXRjaFR5cGVDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBPcHRpb25hbENvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIENhc2NhZGVDb21wb3NpdGV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUKLQlleHRlbmRzIEVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxPcm1NYW55VG9PbmVNYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmsxXzFNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+TWFueVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1NYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvT25lU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsJCQotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYW55VG9PbmVNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2MDEyMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8VCBleHRlbmRzIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcz4KLQlleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlPFQ+Ci17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjUyMjNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUKLQlleHRlbmRzIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxPcm1PbmVUb01hbnlNYXBwaW5nPgotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9uZVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKHRoaXMsIGJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtT25lVG9NYW55TWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZmFlNDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWNjZXNzVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgT25lVG9PbmVNYXBwaW5nCi0gKiBAc2VlIEFjY2Vzc1R5cGVDb21wb3NpdGUKLSAqIEBzZWUgQ2FzY2FkZUNvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgTWFwcGVkQnlQYW5lCi0gKiBAc2VlIE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZQotICogQHNlZSBPcHRpb25hbENvbXBvc2l0ZQotICogQHNlZSBUYXJnZXRFbnRpdHlDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlCi1leHRlbmRzIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPE9ybU9uZVRvT25lTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VsaW5rMV8xT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU9uZVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUodGhpcywgYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T25lVG9PbmVNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIyMzNiOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhlOGEwNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTRlNzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLy9SZW1vdmUgdGhlIENvbnZlcnRlcnMgc2VjdGlvbiBmcm9tIDEuMCBvcm0gdmVyc2lvbiBtYXBwaW5ncy4KLS8vVGhpcyBpcyBzdXBwb3J0ZWQgaW4gRWNsaXBzZUxpbmsgaW4gdmVyc2lvbiAxLjEsIGJ1dCBub3QgMS4wCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8T3JtVmVyc2lvbk1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua09ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+VmVyc2lvbk1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybVZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmVyc2lvblNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkTXV0YWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JLy9ldmVyeXRoaW5nIGJ1dCB0aGUgJ0RlZmluZSBDb252ZXJ0ZXInIHNlY3Rpb24uICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZWNsaXBzZWxpbmsgMS4wLCBidXQgaXMgaW4gMS4xCi0JcHJvdGVjdGVkIFBhbmU8RWNsaXBzZUxpbmtDb252ZXJ0PiBidWlsZENvbnZlcnRDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydD4gY29udmVydEhvbGRlciwgQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydDFfMENvbXBvc2l0ZShjb252ZXJ0SG9sZGVyLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1M2U3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLkFic3RyYWN0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBidWlsZFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXNVaShKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzFfMF9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE3MGUwOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmcuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmdlbmVyYWwuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9ucy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuUGVyc2lzdGVuY2VYbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkgaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeQotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqKioqKioqIHBlcnNpc3RlbmNlIHVuaXQgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKcGFQYWdlQ29tcG9zaXRlPiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGVzKAotCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlBcnJheUxpc3Q8SnBhUGFnZUNvbXBvc2l0ZT4gcGFnZXMgPSBuZXcgQXJyYXlMaXN0PEpwYVBhZ2VDb21wb3NpdGU+KDgpOwotCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gZWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRIb2xkZXIgPSAKLQkJCXRoaXMuYnVpbGRFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlcihzdWJqZWN0SG9sZGVyKTsKLQotCQlwYWdlcy5hZGQodGhpcy5idWlsZEdlbmVyYWxUYWIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCXBhZ2VzLmFkZCh0aGlzLmJ1aWxkQ29ubmVjdGlvblRhYihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJcGFnZXMuYWRkKHRoaXMuYnVpbGRDdXN0b21pemF0aW9uVGFiKGVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJcGFnZXMuYWRkKHRoaXMuYnVpbGRDYWNoaW5nVGFiKGVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJcGFnZXMuYWRkKHRoaXMuYnVpbGRMb2dnaW5nVGFiKGVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJcGFnZXMuYWRkKHRoaXMuYnVpbGRPcHRpb25zVGFiKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOwotCQlwYWdlcy5hZGQodGhpcy5idWlsZFNjaGVtYUdlbmVyYXRpb25UYWIoZWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOwotCQlwYWdlcy5hZGQodGhpcy5idWlsZFByb3BlcnRpZXNUYWIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0KLQkJcmV0dXJuIHBhZ2VzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCS8vICoqKioqKioqKiogcGVyc2lzdGVuY2UgdW5pdCB0YWJzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlIGJ1aWxkR2VuZXJhbFRhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYjw/IGV4dGVuZHMgQ29ubmVjdGlvbj4gYnVpbGRDb25uZWN0aW9uVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPENvbm5lY3Rpb24+IGNvbm5lY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbkhvbGRlcihzdWJqZWN0SG9sZGVyKTsKLQotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYjxDb25uZWN0aW9uPihjb25uZWN0aW9uSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBidWlsZEN1c3RvbWl6YXRpb25UYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPiBjdXN0b21pemF0aW9uSG9sZGVyID0gdGhpcy5idWlsZEN1c3RvbWl6YXRpb25Ib2xkZXIoc3ViamVjdEhvbGRlcik7Ci0KLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWI8Q3VzdG9taXphdGlvbj4oY3VzdG9taXphdGlvbkhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYjw/IGV4dGVuZHMgQ2FjaGluZz4gYnVpbGRDYWNoaW5nVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gY2FjaGluZ0hvbGRlciA9IHRoaXMuYnVpbGRDYWNoaW5nSG9sZGVyKHN1YmplY3RIb2xkZXIpOwotCi0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiPENhY2hpbmc+KGNhY2hpbmdIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWI8PyBleHRlbmRzIExvZ2dpbmc+IGJ1aWxkTG9nZ2luZ1RhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+IGxvZ2dpbmdIb2xkZXIgPSB0aGlzLmJ1aWxkTG9nZ2luZ0hvbGRlcihzdWJqZWN0SG9sZGVyKTsKLQotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYjxMb2dnaW5nPihsb2dnaW5nSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiPD8gZXh0ZW5kcyBPcHRpb25zPiBidWlsZE9wdGlvbnNUYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4gb3B0aW9uc0hvbGRlciA9IHRoaXMuYnVpbGRPcHRpb25zSG9sZGVyKHN1YmplY3RIb2xkZXIpOwotCi0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiPE9wdGlvbnM+KG9wdGlvbnNIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIgYnVpbGRTY2hlbWFHZW5lcmF0aW9uVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4gc2NoZW1hR2VuSG9sZGVyID0gdGhpcy5idWlsZFNjaGVtYUdlbmVyYXRpb25Ib2xkZXIoc3ViamVjdEhvbGRlcik7Ci0KLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIoc2NoZW1hR2VuSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZSBidWlsZFByb3BlcnRpZXNUYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gYnVpbGRFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgdHJhbnNmb3JtXyhQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSB2YWx1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvbj4gYnVpbGRDb25uZWN0aW9uSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQsIENvbm5lY3Rpb24+KHN1YmplY3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbm5lY3Rpb24gdHJhbnNmb3JtXyhQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KXZhbHVlKS5nZXRDb25uZWN0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbj4gYnVpbGRDdXN0b21pemF0aW9uSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBDdXN0b21pemF0aW9uPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDdXN0b21pemF0aW9uIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q3VzdG9taXphdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgQ2FjaGluZz4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGluZyB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldENhY2hpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8TG9nZ2luZz4gYnVpbGRMb2dnaW5nSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBMb2dnaW5nPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMb2dnaW5nIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0TG9nZ2luZygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zPiBidWlsZE9wdGlvbnNIb2xkZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdCwgT3B0aW9ucz4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3B0aW9ucyB0cmFuc2Zvcm1fKFBlcnNpc3RlbmNlVW5pdCB2YWx1ZSkgewotCi0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpdmFsdWUpLmdldE9wdGlvbnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4gYnVpbGRTY2hlbWFHZW5lcmF0aW9uSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBTY2hlbWFHZW5lcmF0aW9uPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTY2hlbWFHZW5lcmF0aW9uIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0U2NoZW1hR2VuZXJhdGlvbigpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlRGVmYXVsdHNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTg3ODMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ2FjaGluZz4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIENhY2hlRGVmYXVsdHNDb21wb3NpdGUoUGFuZTxUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGVEZWZhdWx0c1BhbmUocGFyZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hlRGVmYXVsdHNQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgZGVmYXVsdFBhbmUgPSB0aGlzLmFkZFRpdGxlZEdyb3VwKAotCQkJcGFyZW50LAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkNhY2hlRGVmYXVsdHNDb21wb3NpdGVfZ3JvdXBUaXRsZQotCQkpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZUNhY2hlRGVmYXVsdHNDb21wb3NpdGVzKGRlZmF1bHRQYW5lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hlRGVmYXVsdHNDb21wb3NpdGVzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBEZWZhdWx0IENhY2hlIFR5cGUKLQkJbmV3IERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUodGhpcywgcGFyZW50KTsKLQotCQkvLyBEZWZhdWx0IENhY2hlIFNpemUKLQkJbmV3IERlZmF1bHRDYWNoZVNpemVDb21wb3NpdGU8VD4odGhpcywgcGFyZW50KTsKLQotCQkvLyBEZWZhdWx0IFNoYXJlZCBDYWNoZQotCQluZXcgRGVmYXVsdFNoYXJlZENhY2hlQ29tcG9zaXRlKHRoaXMsIHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZVNpemVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVTaXplQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNmRlM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZVNpemVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIENhY2hlU2l6ZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVTaXplQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYWNoZVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2FjaGVTaXplQ29tcG9zaXRlKFBhbmU8RW50aXR5PiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmFkZENhY2hlU2l6ZUNvbWJvKGNvbnRhaW5lcik7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgYWRkQ2FjaGVTaXplQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSW50ZWdlckNvbWJvPEVudGl0eT4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DYWNoZVNpemVDb21wb3NpdGVfY2FjaGVTaXplOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElORzsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBJbnRlZ2VyPihidWlsZENhY2hpbmdIb2xkZXIoKSwgQ2FjaGluZy5DQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJSW50ZWdlciB2YWx1ZSA9IHRoaXMuc3ViamVjdC5nZXRDYWNoZVNpemVEZWZhdWx0KCk7Ci0JCQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQkJCXZhbHVlID0gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRDYWNoZVNpemVEZWZhdWx0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgSW50ZWdlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5DQUNIRV9TSVpFX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiBnZXRTdWJqZWN0UGFyZW50KCkuZ2V0Q2FjaGVTaXplT2YoZ2V0U3ViamVjdE5hbWUoKSk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCWdldFN1YmplY3RQYXJlbnQoKS5zZXRDYWNoZVNpemVPZihnZXRTdWJqZWN0TmFtZSgpLCB2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRTdWJqZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLmdldFZhbHVlKCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlwcml2YXRlIENhY2hpbmcgZ2V0U3ViamVjdFBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLmdldFZhbHVlKCkuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHksIENhY2hpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoaW5nIHRyYW5zZm9ybV8oRW50aXR5IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldFBhcmVudCgpOwotCQkJfQotCQl9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWJmYzlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIENhY2hlVHlwZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVUeXBlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYWNoZVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2FjaGVUeXBlQ29tcG9zaXRlKFBhbmU8RW50aXR5PiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfY2FjaGVUeXBlTGFiZWwsCi0JCQluZXcgQ2FjaGVUeXBlQ29tYm8oY29udGFpbmVyKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElORwotCQkpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgQ2FjaGVUeXBlQ29tYm8gZXh0ZW5kcyBFbnVtRm9ybUNvbWJvVmlld2VyPEVudGl0eSwgQ2FjaGVUeXBlPiB7Ci0KLQkJcHJpdmF0ZSBDYWNoZVR5cGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihDYWNoZVR5cGVDb21wb3NpdGUudGhpcywgcGFyZW50KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5LkNBQ0hFX1RZUEVfUFJPUEVSVFkpOwotCQl9Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gYnVpbGRDYWNoaW5nSG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHksIENhY2hpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBDYWNoaW5nIHRyYW5zZm9ybV8oRW50aXR5IHZhbHVlKSB7Ci0JCQkJCXJldHVybiB2YWx1ZS5nZXRQYXJlbnQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVUeXBlPiBidWlsZERlZmF1bHRDYWNoZVR5cGVIb2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBDYWNoZVR5cGU+KGJ1aWxkQ2FjaGluZ0hvbGRlcigpLCBDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBDYWNoZVR5cGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCUNhY2hlVHlwZSBjYWNoZVR5cGUgPSBzdWJqZWN0LmdldENhY2hlVHlwZURlZmF1bHQoKTsKLQkJCQkJaWYgKGNhY2hlVHlwZSA9PSBudWxsKSB7Ci0JCQkJCQljYWNoZVR5cGUgPSBzdWJqZWN0LmdldERlZmF1bHRDYWNoZVR5cGVEZWZhdWx0KCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNhY2hlVHlwZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRGVmYXVsdENhY2hpbmdUeXBlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoCi0JCQkJYnVpbGREZWZhdWx0Q2FjaGluZ1R5cGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpCi0JCQkpOwotCQl9Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRGVmYXVsdENhY2hpbmdUeXBlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCQlpZiAoKGUuZ2V0TmV3VmFsdWUoKSAhPSBudWxsKSAmJiAhZ2V0Q29tYm8oKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCUNhY2hlVHlwZUNvbWJvLnRoaXMuZG9Qb3B1bGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCXJldHVybiBDYWNoZVR5cGUudmFsdWVzKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENhY2hlVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gZ2V0U3ViamVjdFBhcmVudCgpLmdldERlZmF1bHRDYWNoZVR5cGUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoQ2FjaGVUeXBlIHZhbHVlKSB7Ci0JCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywKLQkJCQlDYWNoZVR5cGVDb21wb3NpdGUudGhpcywKLQkJCQl2YWx1ZQotCQkJKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQkJLy8gVGhpcyBpcyByZXF1aXJlZCB0byBhbGxvdyB0aGUgY2xhc3MgbG9hZGVyIHRvIGxldCB0aGUgbGlzdGVuZXIKLQkJCS8vIHdyaXR0ZW4gYWJvdmUgdG8gYWNjZXNzIHRoaXMgbWV0aG9kCi0JCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENhY2hlVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiBnZXRTdWJqZWN0UGFyZW50KCkuZ2V0Q2FjaGVUeXBlT2YoZ2V0U3ViamVjdE5hbWUoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCXN1cGVyLmluaXRpYWxpemUoKTsKLQotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gZGVmYXVsdENhY2hlVHlwZUhvbGRlciA9Ci0JCQkJYnVpbGREZWZhdWx0Q2FjaGVUeXBlSG9sZGVyKCk7Ci0KLQkJCWRlZmF1bHRDYWNoZVR5cGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJYnVpbGREZWZhdWx0Q2FjaGluZ1R5cGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkKLQkJCSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoQ2FjaGVUeXBlIHZhbHVlKSB7Ci0JCQlnZXRTdWJqZWN0UGFyZW50KCkuc2V0Q2FjaGVUeXBlT2YoZ2V0U3ViamVjdE5hbWUoKSwgdmFsdWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFN1YmplY3ROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuZ2V0VmFsdWUoKS5nZXROYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBDYWNoaW5nIGdldFN1YmplY3RQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFN1YmplY3RIb2xkZXIoKS5nZXRWYWx1ZSgpLmdldFBhcmVudCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0RlZmF1bHRDYWNoZVNpemVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDc0NWE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQ2FjaGVTaXplQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlPFQgZXh0ZW5kcyBDYWNoaW5nPiBleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhY2hlVHlwZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBEZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlKFBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGREZWZhdWx0Q2FjaGVTaXplQ29tYm8oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZERlZmF1bHRDYWNoZVNpemVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBJbnRlZ2VyQ29tYm88Q2FjaGluZz4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlX2RlZmF1bHRDYWNoZVNpemU7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DQUNISU5HX0RFRkFVTFRfU0laRTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0Q2FjaGVTaXplRGVmYXVsdCgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYWNoaW5nLkNBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENhY2hlU2l6ZURlZmF1bHQoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCQkJdGhpcy5zdWJqZWN0LnNldENhY2hlU2l6ZURlZmF1bHQodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsJCQkKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0RlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWRlMDA5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPENhY2hpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBDYWNoaW5nPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoIHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPiBidWlsZERlZmF1bHRDYWNoZVR5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxDYWNoaW5nLCBDYWNoZVR5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIENhY2hlVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhDYWNoZVR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZS50aGlzLCB2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldENhY2hlVHlwZURlZmF1bHQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShDYWNoZVR5cGUgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0Q2FjaGVUeXBlRGVmYXVsdCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRDYWNoZVR5cGVMYWJlbCwKLQkJCXRoaXMuYnVpbGREZWZhdWx0Q2FjaGVUeXBlQ29tYm8oIGNvbnRhaW5lciksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NBQ0hJTkdfREVGQVVMVF9UWVBFCQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdFNoYXJlZENhY2hlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0RlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTM0YTE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdFNoYXJlZENhY2hlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRGVmYXVsdFNoYXJlQ2FjaGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q2FjaGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRlZmF1bHRTaGFyZUNhY2hlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIERlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgQ2FjaGluZz4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZURlZmF1bHRMYWJlbCwKLQkJCXRoaXMuYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElOR19ERUZBVUxUX1NIQVJFRAotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTaGFyZWRDYWNoZURlZmF1bHQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTaGFyZWRDYWNoZURlZmF1bHQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHREZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0U2hhcmVkQ2FjaGVEZWZhdWx0TGFiZWwsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NoYXJlZENhY2hlRGVmYXVsdExhYmVsOwotCQkJfQotCQl9OwotCX0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHREZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNoYXJlZENhY2hlRGVmYXVsdCgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFNoYXJlZENhY2hlRGVmYXVsdCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmM1MDJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU8VCBleHRlbmRzIENhY2hpbmc+IGV4dGVuZHMgUGFuZTxUPgotewotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUoUGFuZTxUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0aGlzLmFkZFNlY3Rpb24oCi0JCQlwYXJlbnQsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NlY3Rpb25UaXRsZSwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uCi0JCSk7Ci0KLQkJLy8gRGVmYXVsdHMKLQkJbmV3IENhY2hlRGVmYXVsdHNDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQkJLy8gRW50aXRpZXNMaXN0Ci0JCW5ldyBFbnRpdHlMaXN0Q29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7Ci0JCS8vIEZsdXNoIENsZWFyIENhY2hlCi0JCW5ldyBGbHVzaENsZWFyQ2FjaGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9FbnRpdHlDYWNoaW5nUHJvcGVydHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NThmMDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9FbnRpdHlDYWNoaW5nUHJvcGVydHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnRpdHk+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFbnRpdHlDYWNoaW5nUHJvcGVydHlDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgQ2FjaGluZz4gcGFyZW50Q29tcG9zaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gQ2FjaGUgVHlwZQotCQluZXcgQ2FjaGVUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJLy8gQ2FjaGUgU2l6ZQotCQluZXcgQ2FjaGVTaXplQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJLy8gU2hhcmUgQ2FjaGUKLQkJbmV3IFNoYXJlZENhY2hlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9FbnRpdHlMaXN0Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VudGl0eUxpc3RDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmMzE1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VudGl0eUxpc3RDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5KcHRFY2xpcHNlTGlua1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLQotLyoqCi0gKiAgRW50aXR5TGlzdENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5TGlzdENvbXBvc2l0ZTxUIGV4dGVuZHMgQ2FjaGluZz4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5PiBlbnRpdHlIb2xkZXI7Ci0JCi0JcHVibGljIEVudGl0eUxpc3RDb21wb3NpdGUoUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLmVudGl0eUhvbGRlciA9IHRoaXMuYnVpbGRFbnRpdHlIb2xkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZFRpdGxlZEdyb3VwKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkNhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2dyb3VwVGl0bGUKLQkJKTsKLQotCQkvLyBFbnRpdGllcyBhZGQvcmVtb3ZlIGxpc3QgcGFuZQotCQluZXcgQWRkUmVtb3ZlTGlzdFBhbmU8Q2FjaGluZz4oCi0JCQl0aGlzLAotCQkJY29udGFpbmVyLAotCQkJdGhpcy5idWlsZEVudGl0aWVzQWRhcHRlcigpLAotCQkJdGhpcy5idWlsZEVudGl0aWVzTGlzdEhvbGRlcigpLAotCQkJdGhpcy5lbnRpdHlIb2xkZXIsCi0JCQl0aGlzLmJ1aWxkRW50aXR5TGFiZWxQcm92aWRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DQUNISU5HCi0JCSk7Ci0KLQkJLy8gRW50aXR5IENhY2hpbmcgcHJvcGVydHkgcGFuZQotCQlFbnRpdHlDYWNoaW5nUHJvcGVydHlDb21wb3NpdGUgcGFuZSA9IG5ldyBFbnRpdHlDYWNoaW5nUHJvcGVydHlDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJdGhpcy5lbnRpdHlIb2xkZXIsCi0JCQljb250YWluZXIKLQkJKTsKLQkJdGhpcy5pbnN0YWxsUGFuZUVuYWJsZXIodGhpcy5lbnRpdHlIb2xkZXIsIHBhbmUpOwotCX0KLQkKLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lLkFkYXB0ZXIgYnVpbGRFbnRpdGllc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJRW50aXR5TGlzdENvbXBvc2l0ZS50aGlzLmFkZEVudGl0aWVzKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCUNhY2hpbmcgY2FjaGluZyA9IGdldFN1YmplY3QoKTsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJRW50aXR5IGVudGl0eUNhY2hpbmcgPSAoRW50aXR5KSBpdGVtOwotCQkJCQljYWNoaW5nLnJlbW92ZUVudGl0eShlbnRpdHlDYWNoaW5nLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkRW50aXRpZXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCUlUeXBlIHR5cGUgPSB0aGlzLmNob29zZUVudGl0eSgpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5nZXRFbnRpdHlOYW1lKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQkJaWYgKGVudGl0eU5hbWUgPT0gbnVsbCkgewotCQkJCWVudGl0eU5hbWUgPSB0eXBlLmdldEVsZW1lbnROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCWlmKCAhIHRoaXMuZ2V0U3ViamVjdCgpLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLmFkZEVudGl0eShlbnRpdHlOYW1lKTsKLQkJCQlpbnQgaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZih0aGlzLmdldFN1YmplY3QoKS5lbnRpdHlOYW1lcygpLCBlbnRpdHlOYW1lKTsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgbGlzdFNlbGVjdGlvbk1vZGVsLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JCQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoZW50aXR5KTsKLQkJCQl0aGlzLmVudGl0eUhvbGRlci5zZXRWYWx1ZShlbnRpdHkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RW50aXR5TmFtZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCi0JCW9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5IGVudGl0eSA9IGdldFN1YmplY3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JCXJldHVybiAoZW50aXR5ICE9IG51bGwpID8gZW50aXR5LmdldE5hbWUoKSA6IG51bGw7Ci0JfQotCQotCXByaXZhdGUgSVR5cGUgY2hvb3NlRW50aXR5KCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgpOwotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IGphdmFQcm9qZWN0IH07Ci0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJU2VsZWN0aW9uRGlhbG9nIHR5cGVTZWxlY3Rpb25EaWFsb2c7Ci0KLQkJdHJ5IHsKLQkJCXR5cGVTZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZygKLQkJCQlnZXRTaGVsbCgpLAotCQkJCXNlcnZpY2UsCi0JCQkJc2NvcGUsCi0JCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsCi0JCQkJZmFsc2UsCi0JCQkJIiIKLQkJCSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRFY2xpcHNlTGlua1VpUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkNhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ1RpdGxlKTsKLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dNZXNzYWdlKTsKLQotCQlpZiAodHlwZVNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gKElUeXBlKSB0eXBlU2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCX0KLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRFbnRpdHlMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCUVudGl0eSBlbnRpdHlDYWNoaW5nID0gKEVudGl0eSkgZWxlbWVudDsKLQkJCQlyZXR1cm4gZW50aXR5Q2FjaGluZy5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+IGJ1aWxkRW50aXR5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+KCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFbnRpdHk+IGJ1aWxkRW50aXRpZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEVudGl0eT4oCi0JCQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDYWNoaW5nLkVOVElUSUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFbnRpdHk+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5lbnRpdGllcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZW50aXRpZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lRW5hYmxlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+IGVudGl0eUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZSBwYW5lKSB7Ci0KLQkJbmV3IFBhbmVFbmFibGVyKAotCQkJdGhpcy5idWlsZFBhbmVFbmFibGVySG9sZGVyKGVudGl0eUhvbGRlciksCi0JCQlwYW5lCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+IGVudGl0eUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eSwgQm9vbGVhbj4oZW50aXR5SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oRW50aXR5IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmVudGl0eU5hbWVJc1ZhbGlkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9GbHVzaENsZWFyQ2FjaGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzdkZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9GbHVzaENsZWFyQ2FjaGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuRmx1c2hDbGVhckNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBGbHVzaENsZWFyQ2FjaGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q2FjaGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlKAotCQkJCVBhbmU8PyBleHRlbmRzIENhY2hpbmc+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQkJcGFyZW50LAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfRmx1c2hDbGVhckNhY2hlTGFiZWwsCi0JCQkJdGhpcy5hZGRGbHVzaENsZWFyQ2FjaGVDb21ibyhwYXJlbnQpLAotCQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElORwotCQkpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxDYWNoaW5nLCBGbHVzaENsZWFyQ2FjaGU+IGFkZEZsdXNoQ2xlYXJDYWNoZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPENhY2hpbmcsIEZsdXNoQ2xlYXJDYWNoZT4odGhpcywgY29udGFpbmVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKENhY2hpbmcuRkxVU0hfQ0xFQVJfQ0FDSEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBGbHVzaENsZWFyQ2FjaGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBGbHVzaENsZWFyQ2FjaGUudmFsdWVzKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBGbHVzaENsZWFyQ2FjaGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0Rmx1c2hDbGVhckNhY2hlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEZsdXNoQ2xlYXJDYWNoZSB2YWx1ZSkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkRGlzcGxheVN0cmluZyhFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3MsIEZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZS5jbGFzcywgdmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBGbHVzaENsZWFyQ2FjaGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldEZsdXNoQ2xlYXJDYWNoZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEZsdXNoQ2xlYXJDYWNoZSB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldEZsdXNoQ2xlYXJDYWNoZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZWE1YmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiPFQgZXh0ZW5kcyBDYWNoaW5nPgotCQkJCQkJCQlleHRlbmRzIFBhbmU8VD4KLQkJCQkJCQkJaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JcHVibGljIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJbmV3IEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElORzsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl90aXRsZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExheW91dCAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQkJCi0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBhZGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL1NoYXJlZENhY2hlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL1NoYXJlZENhY2hlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDBiZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9TaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlRyaVN0YXRlQ2hlY2tCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgU2hhcmVkQ2FjaGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFNoYXJlZENhY2hlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnRpdHk+Ci17Ci0JcHJpdmF0ZSBUcmlTdGF0ZUNoZWNrQm94IHNoYXJlZENhY2hlQ2hlY2tCb3g7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNoYXJlQ2FjaGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFNoYXJlZENhY2hlQ29tcG9zaXRlKFBhbmU8RW50aXR5PiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBidWlsZENhY2hpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5LCBDYWNoaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGluZyB0cmFuc2Zvcm1fKEVudGl0eSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRBbmROb25EZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4oCi0JCQlidWlsZERlZmF1bHRBbmROb25EZWZhdWx0U2hhcmVkQ2FjaGVMaXN0SG9sZGVyKCkKLQkJKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQkJLy8gSWYgdGhlIG51bWJlciBvZiBMaXN0VmFsdWVNb2RlbCBlcXVhbHMgMSwgdGhhdCBtZWFucyB0aGUgc2hhcmVkCi0JCQkJLy8gQ2FjaGUgcHJvcGVydGllcyBpcyBub3Qgc2V0IChwYXJ0aWFsbHkgc2VsZWN0ZWQpLCB3aGljaCBtZWFucyB3ZQotCQkJCS8vIHdhbnQgdG8gc2VlIHRoZSBkZWZhdWx0IHZhbHVlIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKHRoaXMubGlzdEhvbGRlci5zaXplKCkgPT0gMSkgewotCQkJCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0QW5kTm9uRGVmYXVsdFNoYXJlZENhY2hlTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPEJvb2xlYW4+PiBob2xkZXJzID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxCb29sZWFuPj4oMik7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkU2hhcmVkQ2FjaGVMaXN0SG9sZGVyKCkpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRTaGFyZWRDYWNoZUxpc3RIb2xkZXIoKSk7Ci0KLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxCb29sZWFuPiwgQm9vbGVhbj4oCi0JCQlob2xkZXJzCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KGJ1aWxkQ2FjaGluZ0hvbGRlcigpLCBDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCUJvb2xlYW4gdmFsdWUgPSB0aGlzLnN1YmplY3QuZ2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCk7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFNoYXJlZENhY2hlRGVmYXVsdCgpOwotCQkJCX0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRTaGFyZWRDYWNoZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4oCi0JCQlidWlsZERlZmF1bHRTaGFyZWRDYWNoZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNoYXJlZENhY2hlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIEJvb2xlYW4+KAotCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5TSEFSRURfQ0FDSEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3RQYXJlbnQoKS5nZXRTaGFyZWRDYWNoZU9mKGdldFN1YmplY3ROYW1lKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdFBhcmVudCgpLnNldFNoYXJlZENhY2hlT2YoZ2V0U3ViamVjdE5hbWUoKSwgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRTdWJqZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLmdldFZhbHVlKCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlwcml2YXRlIENhY2hpbmcgZ2V0U3ViamVjdFBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLmdldFZhbHVlKCkuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNoYXJlZENhY2hlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPigKLQkJCWJ1aWxkU2hhcmVkQ2FjaGVIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTaGFyZWRDYWNoZVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEFuZE5vbkRlZmF1bHRTaGFyZWRDYWNoZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRTaGFyZWRDYWNoZUxhYmVsLCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JCXRoaXMuc2hhcmVkQ2FjaGVDaGVja0JveC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuc2hhcmVkQ2FjaGVDaGVja0JveCA9IHRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZUxhYmVsLAotCQkJdGhpcy5idWlsZFNoYXJlZENhY2hlSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU2hhcmVkQ2FjaGVTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElORwotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0JhdGNoV3JpdGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9CYXRjaFdyaXRpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkY2QwMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0JhdGNoV3JpdGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5CYXRjaFdyaXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBCYXRjaFdyaXRpbmdDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4KLQkJZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXRjaFdyaXRpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoIHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q29ubmVjdGlvbiwgQmF0Y2hXcml0aW5nPiBhZGRCYXRjaFdyaXRpbmdDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxDb25uZWN0aW9uLCBCYXRjaFdyaXRpbmc+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChDb25uZWN0aW9uLkJBVENIX1dSSVRJTkdfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCYXRjaFdyaXRpbmdbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBCYXRjaFdyaXRpbmcudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJhdGNoV3JpdGluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0QmF0Y2hXcml0aW5nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEJhdGNoV3JpdGluZyB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBCYXRjaFdyaXRpbmdDb21wb3NpdGUudGhpcywgdmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCYXRjaFdyaXRpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRCYXRjaFdyaXRpbmcoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShCYXRjaFdyaXRpbmcgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0QmF0Y2hXcml0aW5nKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dCggQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmF0Y2hXcml0aW5nTGFiZWwsCi0JCQl0aGlzLmFkZEJhdGNoV3JpdGluZ0NvbWJvKCBjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0NhY2hlU3RhdGVtZW50c1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGEyYTUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBDYWNoZVN0YXRlbWVudHNQcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZVN0YXRlbWVudHNQcm9wZXJ0aWVzQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQlwdWJsaWMgQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZSgKLQkJCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gY2FjaGVTdGF0ZW1lbnRzSG9sZGVyID0gYnVpbGRDYWNoZVN0YXRlbWVudHNIb2xkZXIoKTsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCAzLCA1LCAwLCAwLCAwKTsKLQkJCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfY2FjaGVTdGF0ZW1lbnRzTGFiZWwsCi0JCQljYWNoZVN0YXRlbWVudHNIb2xkZXIsCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgotCQkpOwotCQlJbnRlZ2VyQ29tYm88Pz4gY29tYm8gPSBhZGRDYWNoZVN0YXRlbWVudHNTaXplQ29tYm8oY29udGFpbmVyKTsKLQotCQl0aGlzLmluc3RhbGxDb250cm9sRW5hYmxlcihjYWNoZVN0YXRlbWVudHNIb2xkZXIsIGNvbWJvKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ2FjaGVTdGF0ZW1lbnRzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENhY2hlU3RhdGVtZW50cygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldENhY2hlU3RhdGVtZW50cyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlZChCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgSW50ZWdlckNvbWJvPENvbm5lY3Rpb24+IGFkZENhY2hlU3RhdGVtZW50c1NpemVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgSW50ZWdlckNvbWJvPENvbm5lY3Rpb24+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb21ibyBhZGRJbnRlZ2VyQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJCXJldHVybiB0aGlzLmFkZEVkaXRhYmxlQ29tYm8oCi0JCQkJCQljb250YWluZXIsCi0JCQkJCQlidWlsZERlZmF1bHRMaXN0SG9sZGVyKCksCi0JCQkJCQlidWlsZFNlbGVjdGVkSXRlbVN0cmluZ0hvbGRlcigpLAotCQkJCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRDYWNoZVN0YXRlbWVudHNTaXplKCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJCQl0aGlzLnN1YmplY3Quc2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsQ29udHJvbEVuYWJsZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gY2FjaGVTdGF0ZW1lbnRzSG9sZGVyLCBJbnRlZ2VyQ29tYm88Pz4gY29tYm8pIHsKLQotCQluZXcgUGFuZUVuYWJsZXIoY2FjaGVTdGF0ZW1lbnRzSG9sZGVyLCBjb21ibyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE3M2UyOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKAotCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYWRkVGl0bGVkR3JvdXAoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfRGF0YWJhc2VfR3JvdXBCb3gKLQkJKTsKLQotCQkvLyBEYXRhIHNvdXJjZQotCQluZXcgRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQkJLy8gRWNsaXBzZUxpbmsgQ29ubmVjdGlvbiBQb29sCi0JCW5ldyBKZGJjUHJvcGVydGllc0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCQkvLyBFeGNsdXNpdmUgQ29ubmVjdGlvbnMKLQkJbmV3IEpkYmNFeGNsdXNpdmVDb25uZWN0aW9uc1Byb3BlcnRpZXNDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9EYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9EYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjU3NTNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGUoCi0JCQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRKdGFEYXRhU291cmNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFN0cmluZz4oYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0LkpUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0SnRhRGF0YVNvdXJjZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXRKdGFEYXRhU291cmNlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEpUQURhdGFTb3VyY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLCBCb29sZWFuPihidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMudHJhbnNmb3JtMih2YWx1ZSkpOwotCQkJfQotCQkJcHJpdmF0ZSBib29sZWFuIHRyYW5zZm9ybTIoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLkpUQTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROb25KdGFEYXRhU291cmNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFN0cmluZz4oYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0Lk5PTl9KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5vbkp0YURhdGFTb3VyY2UoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0Tm9uSnRhRGF0YVNvdXJjZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb25KVEFEYXRhU291cmNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSwgQm9vbGVhbj4oYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUwpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4gYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPigKLQkJCQlidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLCAKLQkJCQlQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFksIAotCQkJCVBlcnNpc3RlbmNlVW5pdC5ERUZBVUxUX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIFBlcnNpc3RlbmNlVW5pdD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCX0KLQkJfTsKLQkJCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7Ci0KLQkJY29udGFpbmVyID0gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7Ci0KLQkJLy8gSlRBIERhdGEgU291cmNlCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBqdGFFbmFibGVkID0gdGhpcy5idWlsZEpUQURhdGFTb3VyY2VIb2xkZXIoKTsKLQkJTGFiZWwganRhTGFiZWwgPSBhZGRMYWJlbChjb250YWluZXIsIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfanRhRGF0YVNvdXJjZUxhYmVsLCBqdGFFbmFibGVkKTsKLQkJVGV4dCBqdGFUZXh0ID0gYWRkVGV4dChjb250YWluZXIsIHRoaXMuYnVpbGRKdGFEYXRhU291cmNlSG9sZGVyKCksIHRoaXMuZ2V0SGVscElEKCksIGp0YUVuYWJsZWQpOwotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoY29udGFpbmVyLCBqdGFMYWJlbCwganRhVGV4dCwgdGhpcy5nZXRIZWxwSUQoKSk7Ci0KLQkJLy8gTm9uLUpUQSBEYXRhIFNvdXJjZQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbm9uSnRhRW5hYmxlZCA9IHRoaXMuYnVpbGROb25KVEFEYXRhU291cmNlSG9sZGVyKCk7Ci0JCUxhYmVsIG5vbkp0YUxhYmVsID0gYWRkTGFiZWwoY29udGFpbmVyLCBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25vbkp0YURhdGFTb3VyY2VMYWJlbCwgbm9uSnRhRW5hYmxlZCk7Ci0JCVRleHQgbm9uSnRhVGV4dCA9IGFkZFRleHQoY29udGFpbmVyLCBidWlsZE5vbkp0YURhdGFTb3VyY2VIb2xkZXIoKSwgdGhpcy5nZXRIZWxwSUQoKSwgbm9uSnRhRW5hYmxlZCk7Ci0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZShjb250YWluZXIsIG5vbkp0YUxhYmVsLCBub25KdGFUZXh0LCB0aGlzLmdldEhlbHBJRCgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0VjbGlwc2VMaW5rQ29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxNTVlNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0VjbGlwc2VMaW5rQ29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtDb25uZWN0aW9uQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+Ci0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rQ29ubmVjdGlvbkNvbXBvc2l0ZSgKLQkJCQkJUGFuZTxUPiBzdWJqZWN0SG9sZGVyLAotCQkJCQlDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCkgKiAyOwotCi0JCWNvbnRhaW5lciA9IGFkZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3NlY3Rpb25UaXRsZSwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uCi0JCSk7Ci0KLQkJQ29tcG9zaXRlIHN1YlBhbmUgPSBhZGRTdWJQYW5lKAotCQkJY29udGFpbmVyLAotCQkJMCwgZ3JvdXBCb3hNYXJnaW4sIDEwLCBncm91cEJveE1hcmdpbgotCQkpOwotCi0JCW5ldyBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGU8VD4odGhpcywgc3ViUGFuZSk7Ci0KLQkJbmV3IEJhdGNoV3JpdGluZ0NvbXBvc2l0ZTxUPih0aGlzLCBzdWJQYW5lKTsKLQotCQluZXcgQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZTxUPih0aGlzLCBzdWJQYW5lKTsKLQotCQluZXcgTmF0aXZlU3FsQ29tcG9zaXRlPFQ+KHRoaXMsIHN1YlBhbmUpOwotCi0JCW5ldyBDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNCaW5kUGFyYW1ldGVyc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmMmU5Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNCaW5kUGFyYW1ldGVyc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBKZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNCaW5kUGFyYW1ldGVyc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q29ubmVjdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpkYmNCaW5kUGFyYW1ldGVyc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIENvbm5lY3Rpb24+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmluZFBhcmFtZXRlcnNMYWJlbCwKLQkJCXRoaXMuYnVpbGRCaW5kUGFyYW1ldGVyc0hvbGRlcigpLAotCQkJdGhpcy5idWlsZEJpbmRQYXJhbWV0ZXJzU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQmluZFBhcmFtZXRlcnNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5CSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRCaW5kUGFyYW1ldGVycygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEJpbmRQYXJhbWV0ZXJzKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQmluZFBhcmFtZXRlcnNTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRCaW5kUGFyYW1ldGVyc0hvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JpbmRQYXJhbWV0ZXJzTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iaW5kUGFyYW1ldGVyc0xhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRCaW5kUGFyYW1ldGVyc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDb25uZWN0aW9uLkJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldEJpbmRQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0QmluZFBhcmFtZXRlcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhNWEwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuSnB0RGJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5GaWx0ZXJlZEl0ZW1zU2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqICBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBUaGUgY29uc3RhbnQgSUQgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGlhbG9nIHNldHRpbmdzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfU0VUVElOR1MgPSAib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmRpYWxvZ3MuQ29ubmVjdGlvbkRpYWxvZyI7Ci0KLQlwdWJsaWMgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKAotCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUGFzc3dvcmRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlBBU1NXT1JEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0UGFzc3dvcmQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFBhc3N3b3JkKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUG9wdWxhdGVGcm9tQ29ubmVjdGlvbkFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwcm9tcHRDb25uZWN0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXJsSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5VUkxfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRVcmwoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFVybCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXNlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFVzZXIoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFVzZXIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFBvcHVsYXRlIGZyb20gQ29ubmVjdGlvbiBoeXBlcmxpbmsKLQkJdGhpcy5hZGRIeXBlcmxpbmsoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3BvcHVsYXRlRnJvbUNvbm5lY3Rpb25IeXBlckxpbmssCi0JCQlidWlsZFBvcHVsYXRlRnJvbUNvbm5lY3Rpb25BY3Rpb24oKQotCQkpOwotCi0JCS8vIERyaXZlcgotCQluZXcgSmRiY0RyaXZlckNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCi0JCS8vIFVybAotCQl0aGlzLmFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91cmxMYWJlbCwKLQkJCWJ1aWxkVXJsSG9sZGVyKCkKLQkJKTsKLQotCQkvLyBVc2VyCi0JCXRoaXMuYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3VzZXJMYWJlbCwKLQkJCWJ1aWxkVXNlckhvbGRlcigpCi0JCSk7Ci0KLQkJLy8gUGFzc3dvcmQKLQkJdGhpcy5hZGRMYWJlbGVkUGFzc3dvcmRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9wYXNzd29yZExhYmVsLAotCQkJYnVpbGRQYXNzd29yZEhvbGRlcigpCi0JCSk7Ci0KLQkJLy8gQmluZCBQYXJhbWV0ZXJzCi0JCW5ldyBKZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQl2b2lkIHByb21wdENvbm5lY3Rpb24oKSB7Ci0KLQkJQ29ubmVjdGlvblNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgQ29ubmVjdGlvblNlbGVjdGlvbkRpYWxvZygpOwotCi0JCWlmIChkaWFsb2cub3BlbigpICE9IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gKFN0cmluZykgZGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShuYW1lKTsKLQotCQlDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRTdWJqZWN0KCk7Ci0JCWNvbm5lY3Rpb24uc2V0VXJsKChjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VVJMKCkpOwotCQljb25uZWN0aW9uLnNldFVzZXIoKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVc2VyTmFtZSgpKTsKLQkJY29ubmVjdGlvbi5zZXRQYXNzd29yZCgoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldFVzZXJQYXNzd29yZCgpKTsKLQkJY29ubmVjdGlvbi5zZXREcml2ZXIoKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXREcml2ZXJDbGFzc05hbWUoKSk7Ci0JfQotCi0JQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IGdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpIHsKLQkJLy8gd2UgYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IGFueSBjb25uZWN0aW9uIHByb2ZpbGUgYW5kIHNpbXBseQotCQkvLyB0YWtlIHRoZSBzZXR0aW5ncyBmcm9tIGl0ICh1c2VyLCBwYXNzd29yZCwgZXRjLikgYW5kIGdpdmUgdGhlbQotCQkvLyB0byB0aGUgRWNsaXBzZUxpbmsgY29ubmVjdGlvbiwgc28gd2UgZ28KLQkJLy8gdG8gdGhlIGRiIHBsdWctaW4gZGlyZWN0bHkgdG8gZ2V0IHRoZSBmYWN0b3J5Ci0JCXJldHVybiBKcHREYlBsdWdpbi5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKTsKLQl9Ci0KLQkvLyBicm9hZGVuIGFjY2VzcyBhIGJpdAotCVNoZWxsIGdldFNoZWxsXygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRpYWxvZyBzaG93cyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBjb25uZWN0aW9uIG5hbWVzIGFuZCBsZXRzIHRoZSB1c2VyCi0JICogdGhlIG9wdGlvbiB0byBmaWx0ZXIgdGhlbSB1c2luZyBhIHNlYXJjaCBmaWVsZC4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgQ29ubmVjdGlvblNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIEZpbHRlcmVkSXRlbXNTZWxlY3Rpb25EaWFsb2cgewotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBpbmdTZWxlY3Rpb25EaWFsb2c8L2NvZGU+LgotCQkgKi8KLQkJcHJvdGVjdGVkIENvbm5lY3Rpb25TZWxlY3Rpb25EaWFsb2coKSB7Ci0JCQlzdXBlcihKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUudGhpcy5nZXRTaGVsbF8oKSwgZmFsc2UpOwotCQkJc2V0TWVzc2FnZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0Nvbm5lY3Rpb25EaWFsb2dfTWVzc2FnZSk7Ci0JCQlzZXRUaXRsZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0Nvbm5lY3Rpb25EaWFsb2dfVGl0bGUpOwotCQkJc2V0TGlzdExhYmVsUHJvdmlkZXIoYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQkJc2V0RGV0YWlsc0xhYmVsUHJvdmlkZXIoYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoZWxlbWVudCA9PSBudWxsKSA/ICIiIDogZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRXh0ZW5kZWRDb250ZW50QXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlbXNGaWx0ZXIgY3JlYXRlRmlsdGVyKCkgewotCQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uSXRlbXNGaWx0ZXIoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGVudFByb3ZpZGVyKEFic3RyYWN0Q29udGVudFByb3ZpZGVyIHByb3ZpZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1zRmlsdGVyIGl0ZW1zRmlsdGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCQlJdGVyYWJsZTxTdHJpbmc+IHByb2ZpbGVOYW1lcyA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lcygpOwotCQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwcm9maWxlTmFtZXMpKTsKLQotCQkJLy8gQWRkIHRoZSBjb25uZWN0aW9uIG5hbWVzIHRvIHRoZSBkaWFsb2cKLQkJCWZvciAoU3RyaW5nIG5hbWUgOiBwcm9maWxlTmFtZXMpIHsKLQkJCQlwcm92aWRlci5hZGQobmFtZSwgaXRlbXNGaWx0ZXIpOwotCQkJCXNtLndvcmtlZCgxKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWVzKCkgewotCQkJcmV0dXJuIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS50aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCi0JCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBKcHRVaVBsdWdpbi5pbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBkaWFsb2dTZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19TRVRUSU5HUyk7Ci0KLQkJCWlmIChzZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJc2V0dGluZ3MgPSBkaWFsb2dTZXR0aW5ncy5hZGROZXdTZWN0aW9uKERJQUxPR19TRVRUSU5HUyk7Ci0JCQl9Ci0KLQkJCXJldHVybiBzZXR0aW5nczsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxTdHJpbmc+IGdldEl0ZW1zQ29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgaXRlbTEsIFN0cmluZyBpdGVtMikgewotCQkJCQlyZXR1cm4gaXRlbTEuY29tcGFyZVRvKGl0ZW0yKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlSXRlbShPYmplY3QgaXRlbSkgewotCi0JCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0VWlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiIiwgbnVsbCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSB0aGUgZmlsdGVyIHJlc3BvbnNpYmxlIHRvIHJlbW92ZSBhbnkgY29ubmVjdGlvbiBuYW1lIGJhc2VkIG9uCi0JCSAqIHRoZSBwYXR0ZXJuIGVudGVyZWQgaW4gdGhlIHRleHQgZmllbGQuCi0JCSAqLwotCQlwcml2YXRlIGNsYXNzIENvbm5lY3Rpb25JdGVtc0ZpbHRlciBleHRlbmRzIEl0ZW1zRmlsdGVyIHsKLQotCQkJLyoqCi0JCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbm5lY3Rpb25JdGVtc0ZpbHRlcjwvY29kZT4uCi0JCQkgKi8KLQkJCUNvbm5lY3Rpb25JdGVtc0ZpbHRlcigpIHsKLQotCQkJCXN1cGVyKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhhdCBpZiB0aGUgcGF0dGVybiBpcyBlbXB0eSwgd2Ugc3BlY2lmeSAqIGluIG9yZGVyCi0JCQkJLy8gdG8gc2hvdyBhbGwgdGhlIG1hcHBpbmcgdHlwZXMKLQkJCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRQYXR0ZXJuKCkpKSB7Ci0JCQkJCXBhdHRlcm5NYXRjaGVyLnNldFBhdHRlcm4oIioiKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKi8KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaXNDb25zaXN0ZW50SXRlbShPYmplY3QgaXRlbSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICovCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIG1hdGNoSXRlbShPYmplY3QgaXRlbSkgewotCQkJCXJldHVybiBtYXRjaGVzKGl0ZW0udG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjRHJpdmVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNEcml2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlNWMyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNEcml2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgSmRiY0RyaXZlckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSmRiY0RyaXZlckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q29ubmVjdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkV2ZW50TGlzdGVuZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjRHJpdmVyQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIENvbm5lY3Rpb24+IHBhcmVudFBhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8Q29ubmVjdGlvbj4gaW5pdGlhbGl6ZUNsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPENvbm5lY3Rpb24+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBTdHJpbmc+KAotCQkJCQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLkRSSVZFUl9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RHJpdmVyKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXREcml2ZXIodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RHJpdmVyKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfZHJpdmVyTGFiZWw7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXREcml2ZXIoY2xhc3NOYW1lKTsJCQkJCi0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dUeXBlQ3JlYXRpb24oKSB7Ci0JCQkJLy9Eb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGFsbG93IHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBEcml2ZXIgY2xhc3MKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNFeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGI1YzQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNFeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4KLQkJZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbXBvc2l0ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlKAotCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlTGFiZWwsCi0JCQl0aGlzLmFkZEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPENvbm5lY3Rpb24sIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlPiBhZGRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPENvbm5lY3Rpb24sIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoQ29ubmVjdGlvbi5FWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBKZGJjRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVDb21wb3NpdGUudGhpcywgdmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNFeGNsdXNpdmVDb25uZWN0aW9uc1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25zUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmFiMWI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25zUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBKZGJjRXhjbHVzaXZlQ29ubmVjdGlvbnNQcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjRXhjbHVzaXZlQ29ubmVjdGlvbnNQcm9wZXJ0aWVzQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQlwdWJsaWMgSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25zUHJvcGVydGllc0NvbXBvc2l0ZShQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gdGhpcy5hZGRUaXRsZWRHcm91cCgKLQkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDEwKSwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5KZGJjRXhjbHVzaXZlQ29ubmVjdGlvbnNQcm9wZXJ0aWVzQ29tcG9zaXRlX0dyb3VwQm94Ci0JCSk7Ci0KLQkJLy8gRXhjbHVzaXZlIGNvbm5lY3Rpb24gbW9kZQotCQluZXcgSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJLy8gTGF6eSBDb25uZWN0aW9uCi0JCW5ldyBKZGJjTGF6eUNvbm5lY3Rpb25Db21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQotCQl0aGlzLmluc3RhbGxQYW5lRW5hYmxlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZUVuYWJsZXIoKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcih0aGlzLmJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSwgdGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUsIEJvb2xlYW4+KHRoaXMuYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlID09IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4oCi0JCQl0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCksIAotCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZLCAKLQkJCVBlcnNpc3RlbmNlVW5pdC5ERUZBVUxUX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIFBlcnNpc3RlbmNlVW5pdD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0xhenlDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNMYXp5Q29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFlYmQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0xhenlDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEpkYmNMYXp5Q29ubmVjdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSmRiY0xhenlDb25uZWN0aW9uQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpkYmNMYXp5Q29ubmVjdGlvbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjTGF6eUNvbm5lY3Rpb25Db21wb3NpdGUoCi0JCQkJCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbGF6eUNvbm5lY3Rpb25MYWJlbCwKLQkJCXRoaXMuYnVpbGRMYXp5Q29ubmVjdGlvbkhvbGRlcigpLAotCQkJdGhpcy5idWlsZExhenlDb25uZWN0aW9uU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTGF6eUNvbm5lY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEJvb2xlYW4+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLkxBWllfQ09OTkVDVElPTl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldExhenlDb25uZWN0aW9uKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0TGF6eUNvbm5lY3Rpb24odmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMYXp5Q29ubmVjdGlvblN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KHRoaXMuYnVpbGREZWZhdWx0TGF6eUNvbm5lY3Rpb25Ib2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbGF6eUNvbm5lY3Rpb25MYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2xhenlDb25uZWN0aW9uTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdExhenlDb25uZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBCb29sZWFuPigKLQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ29ubmVjdGlvbi5MQVpZX0NPTk5FQ1RJT05fUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRMYXp5Q29ubmVjdGlvbigpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdExhenlDb25uZWN0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmRiMmQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQlwdWJsaWMgSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUoUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gdGhpcy5hZGRUaXRsZWRHcm91cCgKLQkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDEwKSwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5KZGJjUHJvcGVydGllc0NvbXBvc2l0ZV9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Qb29sX0dyb3VwQm94Ci0JCSk7Ci0KLQkJLy8gQ29ubmVjdGlvbiBQcm9wZXJ0aWVzCi0JCW5ldyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0KLQkJLy8gUmVhZCBDb25uZWN0aW9uCi0JCW5ldyBKZGJjUmVhZENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7Ci0JCS8vIFdyaXRlIENvbm5lY3Rpb24KLQkJbmV3IEpkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7Ci0JCQotCQl0aGlzLmluc3RhbGxQYW5lRW5hYmxlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZUVuYWJsZXIoKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcih0aGlzLmJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSwgdGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUsIEJvb2xlYW4+KHRoaXMuYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlID09IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4oCi0JCQl0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCksIAotCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZLCAKLQkJCVBlcnNpc3RlbmNlVW5pdC5ERUZBVUxUX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIFBlcnNpc3RlbmNlVW5pdD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQl9OwotCQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZjZmZlNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBKZGJjUmVhZENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjUmVhZENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQlwdWJsaWMgSmRiY1JlYWRDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zU2VjdGlvblRpdGxlLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpIC8vZXhhcGFuZGVkCi0JCSk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29udGFpbmVyLmdldExheW91dERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0KLQkJZGF0YSA9IChHcmlkRGF0YSkgZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0KLQkJLy8gUmVhZCBDb25uZWN0aW9ucyBTaGFyZWQKLQkJbmV3IEpkYmNSZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBSZWFkIENvbm5lY3Rpb25zIE1pbmltdW0KLQkJbmV3IEpkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBSZWFkIENvbm5lY3Rpb25zIE1heGltdW0KLQkJbmV3IEpkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2NzA0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5JbnRlZ2VyQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBKZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY1JlYWRDb25uZWN0aW9uc01heENvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJYWRkUmVhZENvbm5lY3Rpb25zTWF4Q29tYm8oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFJlYWRDb25uZWN0aW9uc01heENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEludGVnZXJDb21ibzxDb25uZWN0aW9uPih0aGlzLCBjb250YWluZXIpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNNYXhMYWJlbDsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgewotCQkJCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTjsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWF4KCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRSZWFkQ29ubmVjdGlvbnNNYXgoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCQkJdGhpcy5zdWJqZWN0LnNldFJlYWRDb25uZWN0aW9uc01heCh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uc01pbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjQzMzM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uc01pbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEpkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAotCWV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmRiY1JlYWRDb25uZWN0aW9uc01pbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjUmVhZENvbm5lY3Rpb25zTWluQ29tcG9zaXRlKAotCQkJCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWFkZFJlYWRDb25uZWN0aW9uc01pbkNvbWJvKGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRSZWFkQ29ubmVjdGlvbnNNaW5Db21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBJbnRlZ2VyQ29tYm88Q29ubmVjdGlvbj4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zTWluTGFiZWw7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT047Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc01pbigpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UmVhZENvbm5lY3Rpb25zTWluKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRSZWFkQ29ubmVjdGlvbnNNaW4odmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zU2hhcmVkQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkOGJkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogUmVhZENvbm5lY3Rpb25zU2hhcmVkQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjUmVhZENvbm5lY3Rpb25zU2hhcmVkQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlJlYWRDb25uZWN0aW9uc1NoYXJlZENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjUmVhZENvbm5lY3Rpb25zU2hhcmVkQ29tcG9zaXRlKAotCQkJCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NoYXJlZExhYmVsLAotCQkJdGhpcy5idWlsZFJlYWRDb25uZWN0aW9uc1NoYXJlZEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFJlYWRDb25uZWN0aW9uc1NoYXJlZFN0cmluZ0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFJlYWRDb25uZWN0aW9uc1NoYXJlZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUmVhZENvbm5lY3Rpb25zU2hhcmVkU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0UmVhZENvbm5lY3Rpb25zU2hhcmVkSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NoYXJlZExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zU2hhcmVkTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFJlYWRDb25uZWN0aW9uc1NoYXJlZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zU2hhcmVkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDcxOWM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEpkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQlwdWJsaWMgSmRiY1dyaXRlQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUoCi0JCQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IHRoaXMuYWRkQ29sbGFwc2libGVTdWJTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zU2VjdGlvblRpdGxlLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpIC8vZXhhcGFuZGVkCi0JCSk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29udGFpbmVyLmdldExheW91dERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0KLQkJZGF0YSA9IChHcmlkRGF0YSkgZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0KLQkJLy8gVGhpcyB3aWxsIGFkZCBzcGFjZSB0byBoYXZlIHRoZSBzYW1lIGxheW91dCB0aGFuIHJlYWQgY29ubmVjdGlvbiBwb29sCi0JCUJ1dHRvbiBzcGFjZSA9IHRoaXMuZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNoZWNrQm94KGNvbnRhaW5lciwgIm0iKTsKLQkJUG9pbnQgc2l6ZSA9IHNwYWNlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWNvbnRhaW5lciA9IHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIHNpemUueSArIDUpOwotCQlzcGFjZS5kaXNwb3NlKCk7Ci0KLQkJLy8gV3JpdGUgQ29ubmVjdGlvbnMgTWluaW11bQotCQluZXcgSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBXcml0ZSBDb25uZWN0aW9ucyBNYXhpbXVtCi0JCW5ldyBKZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVlYzczYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSmRiY1dyaXRlQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEpkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlKAotCQkJCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWFkZFdyaXRlQ29ubmVjdGlvbnNNYXhDb21ibyhjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkV3JpdGVDb25uZWN0aW9uc01heENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEludGVnZXJDb21ibzxDb25uZWN0aW9uPih0aGlzLCBjb250YWluZXIpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zTWF4TGFiZWw7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT047Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNYXgoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRXcml0ZUNvbm5lY3Rpb25zTWF4KCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRXcml0ZUNvbm5lY3Rpb25zTWF4KHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2MDEwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25zTWluQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNXcml0ZUNvbm5lY3Rpb25zTWluQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpkYmNXcml0ZUNvbm5lY3Rpb25zTWluQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEpkYmNXcml0ZUNvbm5lY3Rpb25zTWluQ29tcG9zaXRlKAotCQkJCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJYWRkV3JpdGVDb25uZWN0aW9uc01pbkNvbWJvKGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRXcml0ZUNvbm5lY3Rpb25zTWluQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSW50ZWdlckNvbWJvPENvbm5lY3Rpb24+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3dyaXRlQ29ubmVjdGlvbnNNaW5MYWJlbDsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgewotCQkJCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTjsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01pbigpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLldSSVRFX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFdyaXRlQ29ubmVjdGlvbnNNaW4oKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCQkJdGhpcy5zdWJqZWN0LnNldFdyaXRlQ29ubmVjdGlvbnNNaW4odmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9OYXRpdmVTcWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vTmF0aXZlU3FsQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYzczOTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9OYXRpdmVTcWxDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogTmF0aXZlU3FsQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXRpdmVTcWxDb21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAotCWV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TmF0aXZlU3FsQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE5hdGl2ZVNxbENvbXBvc2l0ZSgKLQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWwsCi0JCQl0aGlzLmJ1aWxkTmF0aXZlU3FsSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkTmF0aXZlU3FsU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTmF0aXZlU3FsSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uTkFUSVZFX1NRTF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hdGl2ZVNxbCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hdGl2ZVNxbCh2YWx1ZSk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmF0aXZlU3FsU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0TmF0aXZlU3FsSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25hdGl2ZVNxbExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdE5hdGl2ZVNxbEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDb25uZWN0aW9uLk5BVElWRV9TUUxfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXROYXRpdmVTcWwoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHROYXRpdmVTcWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL1BlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJlYTZjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL1BlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWIKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYjxUIGV4dGVuZHMgQ29ubmVjdGlvbj4KLQlleHRlbmRzIFBhbmU8VD4KLQlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwgCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtDb25uZWN0aW9uQ29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKcGFQYWdlQ29tcG9zaXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVscElEKCkgewotCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT047Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl90aXRsZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExheW91dCAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMuYWRkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL1RyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9UcmFuc2FjdGlvblR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y3OWQzMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL1RyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4KLQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGUoCi0JCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoIHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl90cmFuc2FjdGlvblR5cGVMYWJlbCwKLQkJCXRoaXMuYWRkVHJhbnNhY3Rpb25UeXBlQ29tYm8oIGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgotCQkpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4gYWRkVHJhbnNhY3Rpb25UeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+KHRoaXMsIHRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgY29udGFpbmVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVuY2VVbml0LkRFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGUudGhpcywgdmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSh2YWx1ZSk7Ci0KLQkJCQlpZiAodmFsdWUgPT0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMKSB7Ci0JCQkJCWNsZWFySlRBUHJvcGVydGllcygpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2xlYXJSZXNvdXJjZUxvY2FsUHJvcGVydGllcygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBQZXJzaXN0ZW5jZVVuaXQ+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JCQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckpUQVByb3BlcnRpZXMoKSB7Ci0JCWdldFN1YmplY3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXRKdGFEYXRhU291cmNlKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhclJlc291cmNlTG9jYWxQcm9wZXJ0aWVzKCkgewotCQlDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSB0aGlzLmdldFN1YmplY3QoKTsKLQkJY29ubmVjdGlvbi5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXROb25KdGFEYXRhU291cmNlKG51bGwpOwotCQljb25uZWN0aW9uLnNldERyaXZlcihudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRVcmwobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0VXNlcihudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRQYXNzd29yZChudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRCaW5kUGFyYW1ldGVycyhudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRXcml0ZUNvbm5lY3Rpb25zTWF4KG51bGwpOwotCQljb25uZWN0aW9uLnNldFdyaXRlQ29ubmVjdGlvbnNNaW4obnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0UmVhZENvbm5lY3Rpb25zTWF4KG51bGwpOwotCQljb25uZWN0aW9uLnNldFJlYWRDb25uZWN0aW9uc01pbihudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0TGF6eUNvbm5lY3Rpb24obnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9DdXN0b21pemVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0N1c3RvbWl6ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzNDVhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0N1c3RvbWl6ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgQ3VzdG9taXplckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9taXplckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RW50aXR5PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q3VzdG9taXplckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEN1c3RvbWl6ZXJDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgRW50aXR5PiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEVudGl0eT4gaW5pdGlhbGl6ZUNsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPEVudGl0eT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgU3RyaW5nPigKLQkJCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0U3ViamVjdFBhcmVudCgpLmdldERlc2NyaXB0b3JDdXN0b21pemVyT2YoZ2V0U3ViamVjdE5hbWUoKSk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCWdldFN1YmplY3RQYXJlbnQoKS5zZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGdldFN1YmplY3ROYW1lKCksIHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3RQYXJlbnQoKS5nZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGdldFN1YmplY3ROYW1lKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2N1c3RvbWl6ZXJMYWJlbDsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0UGFyZW50KCkuZ2V0SnBhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQkJZ2V0U3ViamVjdFBhcmVudCgpLnNldERlc2NyaXB0b3JDdXN0b21pemVyT2YoZ2V0U3ViamVjdE5hbWUoKSwgY2xhc3NOYW1lKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN1cGVySW50ZXJmYWNlTmFtZSgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtDdXN0b21pemVyLkVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19OQU1FOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRTdWJqZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLmdldFZhbHVlKCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlwcml2YXRlIEN1c3RvbWl6YXRpb24gZ2V0U3ViamVjdFBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLmdldFZhbHVlKCkuZ2V0UGFyZW50KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDczZTRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLS8qKgotICogIFBlcnNpc3RlbmNlVW5pdEN1c3RvbWl6YXRpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZTxUIGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZShQYW5lPFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04pOwotCQlzZWN0aW9uLnNldFRleHQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9zZWN0aW9uVGl0bGUpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdGhpcy5hZGRTdWJQYW5lKHNlY3Rpb24pOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCi0JCS8vIERlZmF1bHQgcGFuZQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSB0aGlzLmdldEdyb3VwQm94TWFyZ2luKCk7Ci0KLQkJQ29tcG9zaXRlIGRlZmF1bHRQYW5lID0gdGhpcy5hZGRTdWJQYW5lKAotCQkJY29tcG9zaXRlLAotCQkJMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luCi0JCSk7Ci0KLQkJLy8gV2VhdmluZyBHcm91cAotCQluZXcgV2VhdmluZ1Byb3BlcnRpZXNDb21wb3NpdGUodGhpcywgZGVmYXVsdFBhbmUpOwotCi0JCS8vIFZhbGlkYXRpb24gT25seQotCQluZXcgVmFsaWRhdGlvbk9ubHlDb21wb3NpdGUodGhpcywgZGVmYXVsdFBhbmUpOwotCi0JCS8vIE1hcHBpbmcgRmlsZXMgVmFsaWRhdGUgU2NoZW1hCi0JCW5ldyBWYWxpZGF0ZVNjaGVtYUNvbXBvc2l0ZSh0aGlzLCBkZWZhdWx0UGFuZSk7Ci0KLQkJLy8gVGhyb3cgRXhjZXB0aW9ucwotCQluZXcgVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlKHRoaXMsIGRlZmF1bHRQYW5lKTsKLQotCQkvLyBFeGNlcHRpb24gSGFuZGxlcgotCQluZXcgRXhjZXB0aW9uSGFuZGxlckNvbXBvc2l0ZSh0aGlzLCBkZWZhdWx0UGFuZSk7Ci0KLQkJLy8gU2Vzc2lvbiBDdXN0b21pemVyCi0JCW5ldyBTZXNzaW9uQ3VzdG9taXplcnNDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQotCQl0aGlzLmJ1aWxkRW50aXR5TGlzdENvbXBvc2l0ZShjb21wb3NpdGUpOwotCi0JCS8vIFByb2ZpbGVyOgotCQluZXcgUHJvZmlsZXJDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRFbnRpdHlMaXN0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbmV3IEVudGl0eUxpc3RDb21wb3NpdGUodGhpcywgcGFyZW50KTsgCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGI5NDRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBFbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RW50aXR5PiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlKFBhbmU8Q3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gQ3VzdG9taXplcgotCQluZXcgQ3VzdG9taXplckNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VudGl0eUxpc3RDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRW50aXR5TGlzdENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjRkZDU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRW50aXR5TGlzdENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLkpwdEVjbGlwc2VMaW5rVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotCi0vKioKLSAqICBFbnRpdHlMaXN0Q29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlMaXN0Q29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5PiBlbnRpdHlIb2xkZXI7Ci0KLQlwdWJsaWMgRW50aXR5TGlzdENvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLmVudGl0eUhvbGRlciA9IHRoaXMuYnVpbGRFbnRpdHlIb2xkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZFRpdGxlZEdyb3VwKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2dyb3VwVGl0bGUKLQkJKTsKLQotCQkvLyBFbnRpdGllcyBhZGQvcmVtb3ZlIGxpc3QgcGFuZQotCQluZXcgQWRkUmVtb3ZlTGlzdFBhbmU8Q3VzdG9taXphdGlvbj4oCi0JCQl0aGlzLAotCQkJY29udGFpbmVyLAotCQkJdGhpcy5idWlsZEVudGl0aWVzQWRhcHRlcigpLAotCQkJdGhpcy5idWlsZEVudGl0aWVzTGlzdEhvbGRlcigpLAotCQkJdGhpcy5lbnRpdHlIb2xkZXIsCi0JCQl0aGlzLmJ1aWxkRW50aXR5TGFiZWxQcm92aWRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DVVNUT01JWkFUSU9OCi0JCSk7Ci0KLQkJLy8gRW50aXR5IEN1c3RvbWl6YXRpb24gcHJvcGVydHkgcGFuZQotCQlFbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUgcGFuZSA9IG5ldyBFbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJdGhpcy5lbnRpdHlIb2xkZXIsCi0JCQljb250YWluZXIKLQkJKTsKLQkJdGhpcy5pbnN0YWxsUGFuZUVuYWJsZXIodGhpcy5lbnRpdHlIb2xkZXIsIHBhbmUpOwotCX0KLQotCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmUuQWRhcHRlciBidWlsZEVudGl0aWVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlFbnRpdHlMaXN0Q29tcG9zaXRlLnRoaXMuYWRkRW50aXRpZXMobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJQ3VzdG9taXphdGlvbiBjdXN0b21pemF0aW9uID0gZ2V0U3ViamVjdCgpOwotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlFbnRpdHkgZW50aXR5Q3VzdG9taXphdGlvbiA9IChFbnRpdHkpIGl0ZW07Ci0JCQkJCWN1c3RvbWl6YXRpb24ucmVtb3ZlRW50aXR5KGVudGl0eUN1c3RvbWl6YXRpb24uZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRFbnRpdGllcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJSVR5cGUgdHlwZSA9IHRoaXMuY2hvb3NlRW50aXR5KCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmdldEVudGl0eU5hbWUodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCQlpZiAoZW50aXR5TmFtZSA9PSBudWxsKSB7Ci0JCQkJZW50aXR5TmFtZSA9IHR5cGUuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCX0KLQkJCQotCQkJaWYoICEgdGhpcy5nZXRTdWJqZWN0KCkuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSB7Ci0JCQkJdGhpcy5nZXRTdWJqZWN0KCkuYWRkRW50aXR5KGVudGl0eU5hbWUpOwotCQkJCWludCBpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKHRoaXMuZ2V0U3ViamVjdCgpLmVudGl0eU5hbWVzKCksIGVudGl0eU5hbWUpOwotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBsaXN0U2VsZWN0aW9uTW9kZWwuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQkJCQlsaXN0U2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShlbnRpdHkpOwotCQkJCXRoaXMuZW50aXR5SG9sZGVyLnNldFZhbHVlKGVudGl0eSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RW50aXR5TmFtZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCi0JCW9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5IGVudGl0eSA9IGdldFN1YmplY3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JCXJldHVybiBlbnRpdHkgIT0gbnVsbCA/IGVudGl0eS5nZXROYW1lKCkgOiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElUeXBlIGNob29zZUVudGl0eSgpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoKTsKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W10geyBqYXZhUHJvamVjdCB9OwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShlbGVtZW50cyk7Ci0JCUlQcm9ncmVzc1NlcnZpY2Ugc2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCVNlbGVjdGlvbkRpYWxvZyB0eXBlU2VsZWN0aW9uRGlhbG9nOwotCi0JCXRyeSB7Ci0JCQl0eXBlU2VsZWN0aW9uRGlhbG9nID0gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coCi0JCQkJZ2V0U2hlbGwoKSwKLQkJCQlzZXJ2aWNlLAotCQkJCXNjb3BlLAotCQkJCUlKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9DTEFTU0VTLAotCQkJCWZhbHNlLAotCQkJCSIiCi0JCQkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0RWNsaXBzZUxpbmtVaVBsdWdpbi5sb2coZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dUaXRsZSk7Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ3VzdG9taXphdGlvbkVudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nTWVzc2FnZSk7Ci0KLQkJaWYgKHR5cGVTZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIChJVHlwZSkgdHlwZVNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkRW50aXR5TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlFbnRpdHkgZW50aXR5Q3VzdG9taXphdGlvbiA9IChFbnRpdHkpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIGVudGl0eUN1c3RvbWl6YXRpb24uZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5PiBidWlsZEVudGl0eUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5PigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RW50aXR5PiBidWlsZEVudGl0aWVzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBFbnRpdHk+KAotCQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLkVOVElUSUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFbnRpdHk+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5lbnRpdGllcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZW50aXRpZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lRW5hYmxlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+IGVudGl0eUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZSBwYW5lKSB7Ci0KLQkJbmV3IFBhbmVFbmFibGVyKAotCQkJdGhpcy5idWlsZFBhbmVFbmFibGVySG9sZGVyKGVudGl0eUhvbGRlciksCi0JCQlwYW5lCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+IGVudGl0eUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eSwgQm9vbGVhbj4oZW50aXR5SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oRW50aXR5IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmVudGl0eU5hbWVJc1ZhbGlkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FeGNlcHRpb25IYW5kbGVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0V4Y2VwdGlvbkhhbmRsZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjYjQ1ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0V4Y2VwdGlvbkhhbmRsZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgRXhjZXB0aW9uSGFuZGxlckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uSGFuZGxlckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q3VzdG9taXphdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkV4Y2VwdGlvbkhhbmRsZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFeGNlcHRpb25IYW5kbGVyQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHBhcmVudFBhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8Q3VzdG9taXphdGlvbj4gaW5pdGlhbGl6ZUNsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPEN1c3RvbWl6YXRpb24+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBTdHJpbmc+KAotCQkJCQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLkVYQ0VQVElPTl9IQU5ETEVSX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFeGNlcHRpb25IYW5kbGVyKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRFeGNlcHRpb25IYW5kbGVyKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldEV4Y2VwdGlvbkhhbmRsZXIoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9leGNlcHRpb25IYW5kbGVyTGFiZWw7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldEV4Y2VwdGlvbkhhbmRsZXIoY2xhc3NOYW1lKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN1cGVySW50ZXJmYWNlTmFtZSgpIHsKLQkJCQlyZXR1cm4gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19FWENFUFRJT05fSEFORExFUl9DTEFTU19OQU1FOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVDbGFzc0Nob29zZXIoY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1BlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzZTQ1Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1BlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiSXRlbQotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiPFQgZXh0ZW5kcyBDdXN0b21pemF0aW9uPgotCQkJCQkJCQlleHRlbmRzIFBhbmU8VD4KLQkJCQkJCQkJaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JcHVibGljIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJdGhpcy5idWlsZEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZShjb250YWluZXIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIEpwYVBhZ2VDb21wb3NpdGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NVU1RPTUlaQVRJT047Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQYWdlVGV4dCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdGl0bGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBMYXlvdXQgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTU7Ci0JCQotCQlDb21wb3NpdGUgY29udGFpbmVyID0gYWRkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7Ci0JCQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUHJvZmlsZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUHJvZmlsZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVlNmY4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1Byb2ZpbGVyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLlByb2ZpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyQ29tYm9QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgUHJvZmlsZXJDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGVyQ29tcG9zaXRlIGV4dGVuZHMgQ2xhc3NDaG9vc2VyQ29tYm9QYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByb2ZpbGVyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBQcm9maWxlckNvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIFByb2ZpbGVyLmdldFByb2ZpbGVyQ2xhc3NOYW1lKHRoaXMuZ2V0U3ViamVjdCgpLmdldFByb2ZpbGVyKCkpOwotCX0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotICAgIAlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9wcm9maWxlckxhYmVsOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotICAgIAlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLlBST0ZJTEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHRoaXMuc3ViamVjdC5nZXRQcm9maWxlcigpOwotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IFByb2ZpbGVyQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCk7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChnZXREZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFByb2ZpbGVyKHZhbHVlKTsKLQkJCX0KLQkJfTsKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRQcm9maWxlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5ERUZBVUxUX1BST0ZJTEVSKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIFByb2ZpbGVyQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFByb2ZpbGVyTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJdGhpcy5idWlsZERlZmF1bHRQcm9maWxlckhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREaXNwbGF5U3RyaW5nKFN0cmluZyBwcm9maWxlck5hbWUpIHsKLQotCQlzd2l0Y2ggKFByb2ZpbGVyLnZhbHVlT2YocHJvZmlsZXJOYW1lKSkgewotCQkJY2FzZSBub19wcm9maWxlcjogewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUHJvZmlsZXJDb21wb3NpdGVfbm9fcHJvZmlsZXI7Ci0JCQl9Ci0JCQljYXNlIHBlcmZvcm1hbmNlX3Byb2ZpbGVyOiB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Qcm9maWxlckNvbXBvc2l0ZV9wZXJmb3JtYW5jZV9wcm9maWxlcjsKLQkJCX0KLQkJCWNhc2UgcXVlcnlfbW9uaXRvcjogewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUHJvZmlsZXJDb21wb3NpdGVfcXVlcnlfbW9uaXRvcjsKLQkJCX0KLQkJCWRlZmF1bHQ6IHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkUHJvZmlsZXJDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgcHJvZmlsZXIxLCBTdHJpbmcgcHJvZmlsZXIyKSB7Ci0JCQkJcHJvZmlsZXIxID0gYnVpbGREaXNwbGF5U3RyaW5nKHByb2ZpbGVyMSk7Ci0JCQkJcHJvZmlsZXIyID0gYnVpbGREaXNwbGF5U3RyaW5nKHByb2ZpbGVyMik7Ci0JCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShwcm9maWxlcjEsIHByb2ZpbGVyMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkQ2xhc3NDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0cnkgewotCQkJCQlQcm9maWxlci52YWx1ZU9mKHZhbHVlKTsKLQkJCQkJdmFsdWUgPSBidWlsZERpc3BsYXlTdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSWdub3JlIHNpbmNlIHRoZSB2YWx1ZSBpcyBub3QgYSBQcm9maWxlcgotCQkJCX0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENsYXNzTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOwotCQlob2xkZXJzLmFkZCh0aGlzLmJ1aWxkRGVmYXVsdFByb2ZpbGVyTGlzdEhvbGRlcigpKTsKLQkJaG9sZGVycy5hZGQodGhpcy5idWlsZFByb2ZpbGVyc0xpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPihob2xkZXJzKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRQcm9maWxlcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxQcm9maWxlciwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoUHJvZmlsZXIudmFsdWVzKCkpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFByb2ZpbGVyIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5uYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJvZmlsZXJzQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZFByb2ZpbGVycygpKQotCQkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFByb2ZpbGVyc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkUHJvZmlsZXJzQ29sbGVjdGlvbkhvbGRlcigpLAotCQkJdGhpcy5idWlsZFByb2ZpbGVyQ29tcGFyYXRvcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKEN1c3RvbWl6YXRpb24gc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0UHJvZmlsZXIoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2RlZmF1bHRFbXB0eTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0UHJvZmlsZXIoY2xhc3NOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdXBlckludGVyZmFjZU5hbWUoKSB7Ci0JCXJldHVybiBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1NFU1NJT05fUFJPRklMRVJfQ0xBU1NfTkFNRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9TZXNzaW9uQ3VzdG9taXplcnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vU2Vzc2lvbkN1c3RvbWl6ZXJzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMzFjMjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9TZXNzaW9uQ3VzdG9taXplcnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuSnB0RWNsaXBzZUxpbmtVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotCi0vKioKLSAqICBTZXNzaW9uQ3VzdG9taXplcnNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25DdXN0b21pemVyc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q3VzdG9taXphdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlc3Npb25DdXN0b21pemVyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgU2Vzc2lvbkN1c3RvbWl6ZXJzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHBhcmVudFBhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBhZGRTZXNzaW9uQ3VzdG9taXplckNsYXNzKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlJVHlwZSB0eXBlID0gY2hvb3NlVHlwZSgpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnJCcpOwotCQkJaWYoICEgdGhpcy5nZXRTdWJqZWN0KCkuc2Vzc2lvbkN1c3RvbWl6ZXJFeGlzdHMoY2xhc3NOYW1lKSkgewotCQkJCQotCQkJCVN0cmluZyBjbGFzc1JlZiA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZFNlc3Npb25DdXN0b21pemVyKGNsYXNzTmFtZSk7Ci0JCQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoY2xhc3NSZWYpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRTZXNzaW9uQ3VzdG9taXplckNsYXNzKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlU2Vzc2lvbkN1c3RvbWl6ZXIoKFN0cmluZykgaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbGVtZW50OwotCi0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9ub05hbWU7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uU0VTU0lPTl9DVVNUT01JWkVSX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc2Vzc2lvbkN1c3RvbWl6ZXJzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zZXNzaW9uQ3VzdG9taXplcnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0cyB0aGUgdXNlciB0aGUgT3BlbiBUeXBlIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBzZWxlY3RlZCB0eXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB1c2VyCi0JICogY2FuY2VsZWQgdGhlIGRpYWxvZwotCSAqLwotCXByaXZhdGUgSVR5cGUgY2hvb3NlVHlwZSgpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoKTsKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W10geyBqYXZhUHJvamVjdCB9OwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShlbGVtZW50cyk7Ci0JCUlQcm9ncmVzc1NlcnZpY2Ugc2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCVNlbGVjdGlvbkRpYWxvZyB0eXBlU2VsZWN0aW9uRGlhbG9nOwotCi0JCXRyeSB7Ci0JCQl0eXBlU2VsZWN0aW9uRGlhbG9nID0gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coCi0JCQkJZ2V0U2hlbGwoKSwKLQkJCQlzZXJ2aWNlLAotCQkJCXNjb3BlLAotCQkJCUlKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9DTEFTU0VTLAotCQkJCWZhbHNlLAotCQkJCSIiCi0JCQkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0RWNsaXBzZUxpbmtVaVBsdWdpbi5sb2coZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5DbGFzc0Nob29zZXJQYW5lX2RpYWxvZ1RpdGxlKTsKLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKEpwdFVpTWVzc2FnZXMuQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlKTsKLQotCQlpZiAodHlwZVNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gKElUeXBlKSB0eXBlU2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIERlc2NyaXB0aW9uCi0JCWNvbnRhaW5lciA9IGFkZFRpdGxlZEdyb3VwKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9zZXNzaW9uQ3VzdG9taXplckxhYmVsCi0JCSk7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCW5ldyBBZGRSZW1vdmVMaXN0UGFuZTxDdXN0b21pemF0aW9uPigKLQkJCXRoaXMsCi0JCQljb250YWluZXIsCi0JCQlidWlsZEFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGlzdEhvbGRlcigpLAotCQkJYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVGFibGUoVGFibGUgdGFibGUpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplVGFibGUodGFibGUpOwotCi0JCQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRhYmxlLmdldFBhcmVudCgpOwotCQkJCUdyaWREYXRhIGdyaWREYXRhICAgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDc1OwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1Rocm93RXhjZXB0aW9uc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjA4ODJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJvd0V4Y2VwdGlvbnNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UaHJvd0V4Y2VwdGlvbnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Rocm93RXhjZXB0aW9uc0xhYmVsLAotCQkJdGhpcy5idWlsZFRocm93RXhjZXB0aW9uc0hvbGRlcigpLAotCQkJdGhpcy5idWlsZFRocm93RXhjZXB0aW9uc1N0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DVVNUT01JWkFUSU9OCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUaHJvd0V4Y2VwdGlvbnNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGhyb3dFeGNlcHRpb25zKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0VGhyb3dFeGNlcHRpb25zKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGhyb3dFeGNlcHRpb25zU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0VGhyb3dFeGNlcHRpb25zSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdGhyb3dFeGNlcHRpb25zTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0VGhyb3dFeGNlcHRpb25zSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUN1c3RvbWl6YXRpb24uVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFRocm93RXhjZXB0aW9ucygpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFRocm93RXhjZXB0aW9ucygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vVmFsaWRhdGVTY2hlbWFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vVmFsaWRhdGVTY2hlbWFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyYmE2Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1ZhbGlkYXRlU2NoZW1hQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgVmFsaWRhdGVTY2hlbWFDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlU2NoZW1hQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmFsaWRhdGVTY2hlbWFDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGVTY2hlbWFDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdmFsaWRhdGVTY2hlbWFMYWJlbCwKLQkJCXRoaXMuYnVpbGRWYWxpZGF0ZVNjaGVtYUhvbGRlcigpLAotCQkJdGhpcy5idWlsZFZhbGlkYXRlU2NoZW1hU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NVU1RPTUlaQVRJT04KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFZhbGlkYXRlU2NoZW1hSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uVkFMSURBVEVfU0NIRU1BX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VmFsaWRhdGVTY2hlbWEoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRWYWxpZGF0ZVNjaGVtYSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFZhbGlkYXRlU2NoZW1hU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0VmFsaWRhdGVTY2hlbWFIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0ZVNjaGVtYUxhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdmFsaWRhdGVTY2hlbWFMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0VmFsaWRhdGVTY2hlbWFIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ3VzdG9taXphdGlvbi5WQUxJREFURV9TQ0hFTUFfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRWYWxpZGF0ZVNjaGVtYSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFZhbGlkYXRlU2NoZW1hKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9WYWxpZGF0aW9uT25seUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9WYWxpZGF0aW9uT25seUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDg5NjI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vVmFsaWRhdGlvbk9ubHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBWYWxpZGF0aW9uT25seUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbk9ubHlDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WYWxpZGF0aW9uT25seUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uT25seUNvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0aW9uT25seUxhYmVsLAotCQkJdGhpcy5idWlsZFZhbGlkYXRpb25Pbmx5SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVmFsaWRhdGlvbk9ubHlTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVmFsaWRhdGlvbk9ubHlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5WQUxJREFUSU9OX09OTFlfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRWYWxpZGF0aW9uT25seSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFZhbGlkYXRpb25Pbmx5KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVmFsaWRhdGlvbk9ubHlTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRWYWxpZGF0aW9uT25seUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3ZhbGlkYXRpb25Pbmx5TGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0aW9uT25seUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRWYWxpZGF0aW9uT25seUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDdXN0b21pemF0aW9uLlZBTElEQVRJT05fT05MWV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFZhbGlkYXRpb25Pbmx5KCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0VmFsaWRhdGlvbk9ubHkoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5YWM0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFdlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgV2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+V2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFdlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nQ2hhbmdlVHJhY2tpbmdMYWJlbCwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkV2VhdmluZ0NoYW5nZVRyYWNraW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nQ2hhbmdlVHJhY2tpbmdMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdDaGFuZ2VUcmFja2luZ0xhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ3VzdG9taXphdGlvbi5XRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFdlYXZpbmdDaGFuZ2VUcmFja2luZygpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFdlYXZpbmdDaGFuZ2VUcmFja2luZygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMWIwYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLldlYXZpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFdlYXZpbmdDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFdlYXZpbmdDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBXZWF2aW5nQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoIHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q3VzdG9taXphdGlvbiwgV2VhdmluZz4gYWRkV2VhdmluZ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEN1c3RvbWl6YXRpb24sIFdlYXZpbmc+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChDdXN0b21pemF0aW9uLldFQVZJTkdfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXZWF2aW5nW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gV2VhdmluZy52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV2VhdmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0V2VhdmluZygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhXZWF2aW5nIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZyhFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3MsIFdlYXZpbmdDb21wb3NpdGUudGhpcywgdmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXZWF2aW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0V2VhdmluZygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFdlYXZpbmcgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0V2VhdmluZyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdMYWJlbCwKLQkJCXRoaXMuYWRkV2VhdmluZ0NvbWJvKCBjb250YWluZXIpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DVVNUT01JWkFUSU9OCi0JCSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdFYWdlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nRWFnZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1MGU0Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdFYWdlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFdlYXZpbmdFYWdlckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgV2VhdmluZ0VhZ2VyQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+V2VhdmluZ0VhZ2VyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFdlYXZpbmdFYWdlckNvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRWFnZXJMYWJlbCwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nRWFnZXJIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nRWFnZXJTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkV2VhdmluZ0VhZ2VySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uV0VBVklOR19FQUdFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFdlYXZpbmdFYWdlcigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFdlYXZpbmdFYWdlcih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFdlYXZpbmdFYWdlclN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFdlYXZpbmdFYWdlckhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdFYWdlckxhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0VhZ2VyTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFdlYXZpbmdFYWdlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDdXN0b21pemF0aW9uLldFQVZJTkdfRUFHRVJfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRXZWF2aW5nRWFnZXIoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRXZWF2aW5nRWFnZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdGZXRjaEdyb3Vwc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nRmV0Y2hHcm91cHNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4ZTY5NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdGZXRjaEdyb3Vwc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFdlYXZpbmdGZXRjaEdyb3Vwc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+V2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFdlYXZpbmdGZXRjaEdyb3Vwc0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRmV0Y2hHcm91cHNMYWJlbCwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nRmV0Y2hHcm91cHNIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nRmV0Y2hHcm91cHNTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgotCQkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRXZWF2aW5nRmV0Y2hHcm91cHNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5XRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFdlYXZpbmdGZXRjaEdyb3VwcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFdlYXZpbmdGZXRjaEdyb3Vwcyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFdlYXZpbmdGZXRjaEdyb3Vwc1N0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFdlYXZpbmdGZXRjaEdyb3Vwc0hvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ZldGNoR3JvdXBzTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFdlYXZpbmdGZXRjaEdyb3Vwc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDdXN0b21pemF0aW9uLldFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0V2VhdmluZ0ZldGNoR3JvdXBzKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0V2VhdmluZ0ZldGNoR3JvdXBzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nSW50ZXJuYWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0ludGVybmFsQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZGQ5YTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nSW50ZXJuYWxDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBXZWF2aW5nSW50ZXJuYWxDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFdlYXZpbmdJbnRlcm5hbENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q3VzdG9taXphdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPldlYXZpbmdJbnRlcm5hbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBXZWF2aW5nSW50ZXJuYWxDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ludGVybmFsTGFiZWwsCi0JCQl0aGlzLmJ1aWxkV2VhdmluZ0ludGVybmFsSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkV2VhdmluZ0ludGVybmFsU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NVU1RPTUlaQVRJT04KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFdlYXZpbmdJbnRlcm5hbEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLldFQVZJTkdfSU5URVJOQUxfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRXZWF2aW5nSW50ZXJuYWwoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRXZWF2aW5nSW50ZXJuYWwodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRXZWF2aW5nSW50ZXJuYWxTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRXZWF2aW5nSW50ZXJuYWxIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nSW50ZXJuYWxMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdJbnRlcm5hbExhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRXZWF2aW5nSW50ZXJuYWxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ3VzdG9taXphdGlvbi5XRUFWSU5HX0lOVEVSTkFMX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0V2VhdmluZ0ludGVybmFsKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0V2VhdmluZ0ludGVybmFsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nTGF6eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nTGF6eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjRkNjEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0xhenlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBXZWF2aW5nTGF6eUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgV2VhdmluZ0xhenlDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nTGF6eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBXZWF2aW5nTGF6eUNvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGF6eUxhYmVsLAotCQkJdGhpcy5idWlsZFdlYXZpbmdMYXp5SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkV2VhdmluZ0xhenlTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkV2VhdmluZ0xhenlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5XRUFWSU5HX0xBWllfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRXZWF2aW5nTGF6eSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFdlYXZpbmdMYXp5KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkV2VhdmluZ0xhenlTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRXZWF2aW5nTGF6eUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdMYXp5TGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGF6eUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRXZWF2aW5nTGF6eUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDdXN0b21pemF0aW9uLldFQVZJTkdfTEFaWV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFdlYXZpbmdMYXp5KCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0V2VhdmluZ0xhenkoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZTk3NmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgV2VhdmluZ1Byb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFdlYXZpbmdQcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCXB1YmxpYyBXZWF2aW5nUHJvcGVydGllc0NvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSB3ZWF2aW5nR3JvdXAgPSB0aGlzLmFkZFRpdGxlZEdyb3VwKAotCQkJdGhpcy5hZGRTdWJQYW5lKHBhcmVudCwgMTApLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nUHJvcGVydGllc0dyb3VwQm94Ci0JCSk7Ci0KLQkJLy8gV2VhdmluZwotCQluZXcgV2VhdmluZ0NvbXBvc2l0ZSh0aGlzLCB3ZWF2aW5nR3JvdXApOwotCi0JCS8vIFdlYXZpbmcgTGF6eQotCQluZXcgV2VhdmluZ0xhenlDb21wb3NpdGUodGhpcywgd2VhdmluZ0dyb3VwKTsKLQotCQkvLyBXZWF2aW5nIEZldGNoIEdyb3VwcwotCQluZXcgV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlKHRoaXMsIHdlYXZpbmdHcm91cCk7Ci0KLQkJLy8gV2VhdmluZyBJbnRlcm5hbAotCQluZXcgV2VhdmluZ0ludGVybmFsQ29tcG9zaXRlKHRoaXMsIHdlYXZpbmdHcm91cCk7Ci0KLQkJLy8gV2VhdmluZyBFYWdlcgotCQluZXcgV2VhdmluZ0VhZ2VyQ29tcG9zaXRlKHRoaXMsIHdlYXZpbmdHcm91cCk7Ci0KLQkJLy8gV2VhdmluZyBDaGFuZ2UgVHJhY2tpbmcKLQkJbmV3IFdlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSh0aGlzLCB3ZWF2aW5nR3JvdXApOwotCi0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjhmMzYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5nZW5lcmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUKLQlleHRlbmRzIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQkJQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZU1hcHBlZENsYXNzZXNQYW5lKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUpQQU1hcHBpbmdEZXNjcmlwdG9yc1BhbmUoY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplSmFyRmlsZXNQYW5lKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKUEFNYXBwaW5nRGVzY3JpcHRvcnNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qcGFNYXBwaW5nRGVzY3JpcHRvcnMsCi0JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qcGFNYXBwaW5nRGVzY3JpcHRvcnNfZGVzY3JpcHRpb24KLQkJKTsKLQotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIuZ2V0UGFyZW50KCkpOwotCi0JCW5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSmFyRmlsZXNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qYXJGaWxlcwotCQkpOwotCQkKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyLmdldFBhcmVudCgpKTsKLQkJCi0JCW5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZ2VuZXJhbC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NDk2NzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZ2VuZXJhbC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZ2VuZXJhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2cuRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZQotCWV4dGVuZHMgUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZSgKLQkJCVBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4gcGFyZW50UGFuZSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yIGJ1aWxkSmFyRmlsZURlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0RlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcigpOwotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFY2xpcHNlTGlua0RlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcgotCQlleHRlbmRzIEFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nLk1vZHVsZURlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcgotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlRGVwbG95bWVudFBhdGgoSUZpbGUgZmlsZSkgewotCQkJU3RyaW5nIGJhc2VEZXBsb3ltZW50UGF0aCA9IHN1cGVyLmNhbGN1bGF0ZURlcGxveW1lbnRQYXRoKGZpbGUpOwotCQkJaWYgKEpwdENvcmVQbHVnaW4ucHJvamVjdEhhc1dlYkZhY2V0KGZpbGUuZ2V0UHJvamVjdCgpKSkgewotCQkJCXJldHVybiAiLi4vIiArIGJhc2VEZXBsb3ltZW50UGF0aDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBiYXNlRGVwbG95bWVudFBhdGg7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMDI4ZDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZ2VuZXJhbC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZ2VuZXJhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuZ2VuZXJhbC5HZW5lcmFsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Ci0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBBZGRSZW1vdmVMaXN0UGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmFkZE1hcHBpbmdGaWxlc0xpc3QoY29udGFpbmVyKTsKLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2V4Y2x1ZGVFY2xpcHNlbGlua09ybSwKLQkJCXRoaXMuYnVpbGRFeGNsdWRlRWNsaXBzZWxpbmtPcm1Ib2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRFeGNsdWRlRWNsaXBzZWxpbmtPcm1TdHJpbmdIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9HRU5FUkFMCi0JCSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhbFByb3BlcnRpZXM+IGJ1aWxkR2VuZXJhbFByb3BlcnRpZXNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LCBHZW5lcmFsUHJvcGVydGllcz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBHZW5lcmFsUHJvcGVydGllcyB0cmFuc2Zvcm1fKFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgcGVyc2lzdGVuY2VVbml0KS5nZXRHZW5lcmFsUHJvcGVydGllcygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmFsUHJvcGVydGllcywgQm9vbGVhbj4oCi0JCQlidWlsZEdlbmVyYWxQcm9wZXJ0aWVzSG9sZGVyKCksCi0JCQlHZW5lcmFsUHJvcGVydGllcy5FWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEV4Y2x1ZGVFY2xpcHNlbGlua09ybVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2V4Y2x1ZGVFY2xpcHNlbGlua09ybVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9leGNsdWRlRWNsaXBzZWxpbmtPcm07Ci0JCQl9Ci0JCX07Ci0JfQkKLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRFeGNsdWRlRWNsaXBzZWxpbmtPcm1Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYWxQcm9wZXJ0aWVzLCBCb29sZWFuPigKLQkJCWJ1aWxkR2VuZXJhbFByb3BlcnRpZXNIb2xkZXIoKSwKLQkJCUdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rTG9nZ2luZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjUxMDk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rTG9nZ2luZ0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBMb2dnaW5nPgotCWV4dGVuZHMgUGFuZTxUPgotewotCXB1YmxpYyBFY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGUoCi0JCQkJCVBhbmU8VD4gc3ViamVjdEhvbGRlciwgCi0JCQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04pOwotCQlzZWN0aW9uLnNldFRleHQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZWN0aW9uVGl0bGUpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb21wb3NpdGUpOwotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSk7Ci0JCQotCQkvLyBMb2dnaW5nTGV2ZWw6Ci0JCW5ldyBMb2dnaW5nTGV2ZWxDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQotCQkvLyBCb29sZWFuIHByb3BlcnRpZXMgZ3JvdXAKLQkJdGhpcy5sb2dQcm9wZXJ0aWVzQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gTG9nZ2luZ0ZpbGU6Ci0JCW5ldyBMb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQkvLyBMb2dnZXI6Ci0JCW5ldyBMb2dnZXJDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9nUHJvcGVydGllc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gVGltZXN0YW1wOgotCQluZXcgVGltZXN0YW1wQ29tcG9zaXRlKHRoaXMsIHBhcmVudCk7Ci0KLQkJLy8gVGhyZWFkOgotCQluZXcgVGhyZWFkQ29tcG9zaXRlKHRoaXMsIHBhcmVudCk7Ci0KLQkJLy8gU2Vzc2lvbjoKLQkJbmV3IFNlc3Npb25Db21wb3NpdGUodGhpcywgcGFyZW50KTsKLQotCQkvLyBFeGNlcHRpb25zOgotCQluZXcgRXhjZXB0aW9uc0NvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRXhjZXB0aW9uc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9FeGNlcHRpb25zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMGU0OTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9FeGNlcHRpb25zQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRXhjZXB0aW9uc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8TG9nZ2luZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkV4Y2VwdGlvbnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRXhjZXB0aW9uc0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgTG9nZ2luZz4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9leGNlcHRpb25zTGFiZWwsCi0JCQl0aGlzLmJ1aWxkRXhjZXB0aW9uc0hvbGRlcigpLAotCQkJdGhpcy5idWlsZEV4Y2VwdGlvbnNTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfTE9HR0lOR19FWENFUFRJT05TCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFeGNlcHRpb25zSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIExvZ2dpbmcuRVhDRVBUSU9OU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV4Y2VwdGlvbnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRFeGNlcHRpb25zKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRXhjZXB0aW9uc1N0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEV4Y2VwdGlvbnNIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9leGNlcHRpb25zTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9leGNlcHRpb25zTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdEV4Y2VwdGlvbnNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJTG9nZ2luZy5FWENFUFRJT05TX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0RXhjZXB0aW9ucygpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdEV4Y2VwdGlvbnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlMDM4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJDb21ib1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBMb2dnZXJDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIExvZ2dlckNvbXBvc2l0ZSBleHRlbmRzIENsYXNzQ2hvb3NlckNvbWJvUGFuZTxMb2dnaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TG9nZ2VyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBMb2dnZXJDb21wb3NpdGUoCi0JCQkJCQkJCVBhbmU8PyBleHRlbmRzIExvZ2dpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlpZiAodGhpcy5nZXRTdWJqZWN0KCkuZ2V0TG9nZ2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIExvZ2dlci5ERUZBVUxUX0xPR0dFUl9DTEFTU19OQU1FOwotCQl9Ci0JCXJldHVybiBMb2dnZXIuZ2V0TG9nZ2VyQ2xhc3NOYW1lKHRoaXMuZ2V0U3ViamVjdCgpLmdldExvZ2dlcigpKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLSAgICAJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2VyTGFiZWw7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0gICAgCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN1cGVySW50ZXJmYWNlTmFtZSgpIHsKLSAgICAJcmV0dXJuIExvZ2dpbmcuRUNMSVBTRUxJTktfTE9HR0VSX0NMQVNTX05BTUU7Ci0gICAgfQotICAgIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgTG9nZ2luZy5MT0dHRVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQotCQkJCVN0cmluZyBuYW1lID0gdGhpcy5zdWJqZWN0LmdldExvZ2dlcigpOwotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IExvZ2dlckNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZSh0aGlzLnN1YmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlpZiAoZ2V0RGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCkuZXF1YWxzKHZhbHVlKSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXRMb2dnZXIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TG9nZ2VySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLkRFRkFVTFRfTE9HR0VSKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIExvZ2dlckNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZSh0aGlzLnN1YmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRMb2dnZXJMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdExvZ2dlckhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREaXNwbGF5U3RyaW5nKFN0cmluZyBsb2dnZXJOYW1lKSB7Ci0KLQkJc3dpdGNoIChMb2dnZXIudmFsdWVPZihsb2dnZXJOYW1lKSkgewotCQkJY2FzZSBkZWZhdWx0X2xvZ2dlcjogewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuTG9nZ2VyQ29tcG9zaXRlX2RlZmF1bHRfbG9nZ2VyOwotCQkJfQotCQkJY2FzZSBqYXZhX2xvZ2dlcjogewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuTG9nZ2VyQ29tcG9zaXRlX2phdmFfbG9nZ2VyOwotCQkJfQotCQkJY2FzZSBzZXJ2ZXJfbG9nZ2VyOiB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Mb2dnZXJDb21wb3NpdGVfc2VydmVyX2xvZ2dlcjsKLQkJCX0KLQkJCWRlZmF1bHQ6IHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkTG9nZ2VyQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIGxvZ2dlcjEsIFN0cmluZyBsb2dnZXIyKSB7Ci0JCQkJbG9nZ2VyMSA9IGJ1aWxkRGlzcGxheVN0cmluZyhsb2dnZXIxKTsKLQkJCQlsb2dnZXIyID0gYnVpbGREaXNwbGF5U3RyaW5nKGxvZ2dlcjIpOwotCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUobG9nZ2VyMSwgbG9nZ2VyMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkQ2xhc3NDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0cnkgewotCQkJCQlMb2dnZXIudmFsdWVPZih2YWx1ZSk7Ci0JCQkJCXZhbHVlID0gYnVpbGREaXNwbGF5U3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIElnbm9yZSBzaW5jZSB0aGUgdmFsdWUgaXMgbm90IGEgTG9nZ2VyCi0JCQkJfQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENsYXNzTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOwotCQlob2xkZXJzLmFkZCh0aGlzLmJ1aWxkRGVmYXVsdExvZ2dlckxpc3RIb2xkZXIoKSk7Ci0JCWhvbGRlcnMuYWRkKHRoaXMuYnVpbGRMb2dnZXJzTGlzdEhvbGRlcigpKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KGhvbGRlcnMpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZExvZ2dlcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxMb2dnZXIsIFN0cmluZz4oQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKExvZ2dlci52YWx1ZXMoKSkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oTG9nZ2VyIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5uYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTG9nZ2Vyc0NvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigKLQkJCUNvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYnVpbGRMb2dnZXJzKCkpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTG9nZ2Vyc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkTG9nZ2Vyc0NvbGxlY3Rpb25Ib2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRMb2dnZXJDb21wYXJhdG9yKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoTG9nZ2luZyBzdWJqZWN0KSB7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHRMb2dnZXIoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2RlZmF1bHRFbXB0eTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0TG9nZ2VyKGNsYXNzTmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODExOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZpbGVDaG9vc2VyQ29tYm9QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBMb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlIAotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8TG9nZ2luZz4KLXsKLQlwdWJsaWMgTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQluZXcgRmlsZUNob29zZXJDb21ib1BhbmU8TG9nZ2luZz4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIFN0cmluZz4oCi0JCQkJCQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLkxPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCi0JCQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0TG9nRmlsZUxvY2F0aW9uKCk7Ci0JCQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCQkJbmFtZSA9IGRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuYW1lOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKGRlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCQkJCQkJc3ViamVjdC5zZXRMb2dGaWxlTG9jYXRpb24odmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlKExvZ2dpbmcgc3ViamVjdCkgewotCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHRMb2dGaWxlTG9jYXRpb24oKTsKLQotCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJCQlkZWZhdWx0VmFsdWUKLQkJCQkJKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiB0aGlzLmdldERlZmF1bHRTdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0U3RyaW5nKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2RlZmF1bHRTdGRvdXQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dUaXRsZSgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nVGl0bGU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0ZpbGVMYWJlbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RQYXRoKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdMZXZlbENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nTGV2ZWxDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE5YjYxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdMZXZlbENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nTGV2ZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIExvZ2dpbmdMZXZlbENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2luZ0xldmVsQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxMb2dnaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TG9nZ2luZ0xldmVsQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBMb2dnaW5nTGV2ZWxDb21wb3NpdGUoCi0JCQkJUGFuZTw/IGV4dGVuZHMgTG9nZ2luZz4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPExvZ2dpbmcsIExvZ2dpbmdMZXZlbD4gYWRkTG9nZ2luZ0xldmVsQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8TG9nZ2luZywgTG9nZ2luZ0xldmVsPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZy5MRVZFTF9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExvZ2dpbmdMZXZlbFtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIExvZ2dpbmdMZXZlbC52YWx1ZXMoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExvZ2dpbmdMZXZlbCBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRMZXZlbCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhMb2dnaW5nTGV2ZWwgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBMb2dnaW5nTGV2ZWxDb21wb3NpdGUudGhpcywgdmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMb2dnaW5nTGV2ZWwgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldExldmVsKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoTG9nZ2luZ0xldmVsIHZhbHVlKSB7Ci0JCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0TGV2ZWwodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0xldmVsTGFiZWwsCi0JCQkJdGhpcy5hZGRMb2dnaW5nTGV2ZWxDb21ibyhjb250YWluZXIpLAotCQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfTE9HR0lOR19MRVZFTAotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL1BlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGE5MjEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWI8VCBleHRlbmRzIExvZ2dpbmc+Ci0JZXh0ZW5kcyBQYW5lPFQ+Ci0JaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsIAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rTG9nZ2luZ0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfTE9HR0lORzsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpdGxlOwotCX0KLQotCS8vICoqKioqKioqKiogTGF5b3V0ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luVG9wID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJbGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE1OwotCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGhpcy5hZGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvU2Vzc2lvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9TZXNzaW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjRlYjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9TZXNzaW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogU2Vzc2lvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbkNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8TG9nZ2luZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlc3Npb25Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgU2Vzc2lvbkNvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgTG9nZ2luZz4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWwsCi0JCQl0aGlzLmJ1aWxkU2Vzc2lvbkhvbGRlcigpLAotCQkJdGhpcy5idWlsZFNlc3Npb25TdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfTE9HR0lOR19TRVNTSU9OCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTZXNzaW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIExvZ2dpbmcuU0VTU0lPTl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNlc3Npb24oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTZXNzaW9uKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2Vzc2lvblN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFNlc3Npb25Ib2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFNlc3Npb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJTG9nZ2luZy5TRVNTSU9OX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U2Vzc2lvbigpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFNlc3Npb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvVGhyZWFkQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL1RocmVhZENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2Y0ZGQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvVGhyZWFkQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhyZWFkQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJlYWRDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPExvZ2dpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UaHJlYWRDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGhyZWFkQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RocmVhZExhYmVsLAotCQkJdGhpcy5idWlsZFRocmVhZEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFRocmVhZFN0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9MT0dHSU5HX1RIUkVBRAotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGhyZWFkSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIExvZ2dpbmcuVEhSRUFEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGhyZWFkKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0VGhyZWFkKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGhyZWFkU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0VGhyZWFkSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGhyZWFkTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aHJlYWRMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0VGhyZWFkSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUxvZ2dpbmcuVEhSRUFEX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0VGhyZWFkKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0VGhyZWFkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9UaW1lc3RhbXBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvVGltZXN0YW1wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlM2E4OWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9UaW1lc3RhbXBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaW1lc3RhbXBDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFRpbWVzdGFtcENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8TG9nZ2luZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRpbWVzdGFtcENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUaW1lc3RhbXBDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIExvZ2dpbmc+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGltZXN0YW1wTGFiZWwsCi0JCQl0aGlzLmJ1aWxkVGltZXN0YW1wSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVGltZXN0YW1wU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0xPR0dJTkdfVElNRVNUQU1QCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUaW1lc3RhbXBIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUaW1lc3RhbXAoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRUaW1lc3RhbXAodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUaW1lc3RhbXBTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRUaW1lc3RhbXBIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aW1lc3RhbXBMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpbWVzdGFtcExhYmVsOwotCQkJfQotCQl9OwotCX0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRUaW1lc3RhbXBIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRUaW1lc3RhbXAoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRUaW1lc3RhbXAoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJmYThmYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBFY2xpcHNlTGlua09wdGlvbnNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZTxUIGV4dGVuZHMgT3B0aW9ucz4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTxUPiBzdWJqZWN0SG9sZGVyLCAKLQkJCQkJQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmluaXRpYWxpemVTZXNzaW9uT3B0aW9uc1BhbmUocGFyZW50KTsKLQkJdGhpcy5pbml0aWFsaXplTWlzY2VsbGFuZW91c1BhbmUocGFyZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZXNzaW9uT3B0aW9uc1BhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdGhpcy5hZGRTZWN0aW9uKHBhcmVudCwgCi0JCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uU2VjdGlvblRpdGxlLAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvblNlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCQotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZSk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29tcG9zaXRlLmdldFBhcmVudCgpKTsKLQotCQluZXcgU2Vzc2lvbk5hbWVDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQotCQluZXcgU2Vzc2lvbnNYbWxDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCW5ldyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJbmV3IFRhcmdldFNlcnZlckNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJbmV3IEV2ZW50TGlzdGVuZXJDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCW5ldyBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybjsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBpbml0aWFsaXplTWlzY2VsbGFuZW91c1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewkKLQkJCi0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb250YWluZXIuZ2V0UGFyZW50KCkpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRoaXMuYWRkU2VjdGlvbihjb250YWluZXIsIAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfbWlzY2VsbGFuZW91c1NlY3Rpb25UaXRsZSwKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX21pc2NlbGxhbmVvdXNTZWN0aW9uRGVzY3JpcHRpb24pOwotCQkKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb21wb3NpdGUpOwotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSk7Ci0KLQkJbmV3IFRlbXBvcmFsTXV0YWJsZUNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL0V2ZW50TGlzdGVuZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvRXZlbnRMaXN0ZW5lckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmJhNGNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvRXZlbnRMaXN0ZW5lckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBFdmVudExpc3RlbmVyQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFdmVudExpc3RlbmVyQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RXZlbnRMaXN0ZW5lckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEV2ZW50TGlzdGVuZXJDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgT3B0aW9ucz4gcGFyZW50UGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxPcHRpb25zPiBpbml0aWFsaXplQ2xhc3NDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8T3B0aW9ucz4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4oCi0JCQkJCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXZlbnRMaXN0ZW5lcigpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQl0aGlzLnN1YmplY3Quc2V0RXZlbnRMaXN0ZW5lcih2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRFdmVudExpc3RlbmVyKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZXZlbnRMaXN0ZW5lckxhYmVsOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRFdmVudExpc3RlbmVyKGNsYXNzTmFtZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRTdXBlckludGVyZmFjZU5hbWUoKSB7Ci0JCQkJcmV0dXJuIE9wdGlvbnMuRUNMSVBTRUxJTktfRVZFTlRfTElTVEVORVJfQ0xBU1NfTkFNRTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5pbml0aWFsaXplQ2xhc3NDaG9vc2VyKGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9JbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZTBkNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9JbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8T3B0aW9ucz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIE9wdGlvbnM+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGFiZWwsCi0JCQl0aGlzLmJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX09QVElPTlMKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXModmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZmFlY2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWIKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYjxUIGV4dGVuZHMgT3B0aW9ucz4KLQlleHRlbmRzIFBhbmU8VD4KLQlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwgCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfT1BUSU9OUzsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RpdGxlOwotCX0KLQotCS8vICoqKioqKioqKiogTGF5b3V0ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luVG9wID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJbGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE1OwotCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGhpcy5hZGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvU2Vzc2lvbk5hbWVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvU2Vzc2lvbk5hbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhYmIzZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1Nlc3Npb25OYW1lQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgU2Vzc2lvbk5hbWVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25OYW1lQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vzc2lvbk5hbWVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFNlc3Npb25OYW1lQ29tcG9zaXRlKAotCQkJCQkJCQlQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2Vzc2lvbk5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuREVGQVVMVF9TRVNTSU9OX05BTUUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gU2Vzc2lvbk5hbWVDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNlc3Npb25OYW1lTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJdGhpcy5idWlsZERlZmF1bHRTZXNzaW9uTmFtZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2Vzc2lvbk5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0U2Vzc2lvbk5hbWUoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBTZXNzaW9uTmFtZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGdldERlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRTZXNzaW9uTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKE9wdGlvbnMgc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0U2Vzc2lvbk5hbWUoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2RlZmF1bHRFbXB0eTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uTmFtZSwKLQkJCXRoaXMuYnVpbGREZWZhdWx0U2Vzc2lvbk5hbWVMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU2Vzc2lvbk5hbWVIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfT1BUSU9OU19TRVNTSU9OX05BTUUKLQkJKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1Nlc3Npb25zWG1sQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1Nlc3Npb25zWG1sQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTlkMjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9TZXNzaW9uc1htbENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFNlc3Npb25zWG1sQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXNzaW9uc1htbENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8T3B0aW9ucz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlc3Npb25zWG1sQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBTZXNzaW9uc1htbENvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTw/IGV4dGVuZHMgT3B0aW9ucz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNlc3Npb25zWG1sRmlsZU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuREVGQVVMVF9TRVNTSU9OU19YTUwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gU2Vzc2lvbnNYbWxDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNlc3Npb25zWG1sRmlsZU5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdFNlc3Npb25zWG1sRmlsZU5hbWVIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNlc3Npb25zWG1sRmlsZU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuU0VTU0lPTlNfWE1MX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0U2Vzc2lvbnNYbWwoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBTZXNzaW9uc1htbENvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGdldERlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRTZXNzaW9uc1htbCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKE9wdGlvbnMgc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0U2Vzc2lvbnNYbWwoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2RlZmF1bHRFbXB0eTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uc1htbCwKLQkJCXRoaXMuYnVpbGREZWZhdWx0U2Vzc2lvbnNYbWxGaWxlTmFtZUxpc3RIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRTZXNzaW9uc1htbEZpbGVOYW1lSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX09QVElPTlNfU0VTU0lPTlNfWE1MCi0JCSk7Ci0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDRhZWU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuVGFyZ2V0RGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPE9wdGlvbnM+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUoCi0JCQkJCQkJCVBhbmU8PyBleHRlbmRzIE9wdGlvbnM+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRUYXJnZXREYXRhYmFzZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5ERUZBVUxUX1RBUkdFVF9EQVRBQkFTRSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0VGFyZ2V0RGF0YWJhc2VMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdFRhcmdldERhdGFiYXNlSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERpc3BsYXlTdHJpbmcoU3RyaW5nIHRhcmdldERhdGFiYXNlTmFtZSkgewotCQkKLQkJcmV0dXJuIFNXVFV0aWwuYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCAKLQkJCXRoaXMuZ2V0Q2xhc3MoKSwgCi0JCQlUYXJnZXREYXRhYmFzZS52YWx1ZU9mKHRhcmdldERhdGFiYXNlTmFtZSkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0RGF0YWJhc2VDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgdGFyZ2V0RGF0YWJhc2UxLCBTdHJpbmcgdGFyZ2V0RGF0YWJhc2UyKSB7Ci0JCQkJdGFyZ2V0RGF0YWJhc2UxID0gYnVpbGREaXNwbGF5U3RyaW5nKHRhcmdldERhdGFiYXNlMSk7Ci0JCQkJdGFyZ2V0RGF0YWJhc2UyID0gYnVpbGREaXNwbGF5U3RyaW5nKHRhcmdldERhdGFiYXNlMik7Ci0JCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSh0YXJnZXREYXRhYmFzZTEsIHRhcmdldERhdGFiYXNlMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFRhcmdldERhdGFiYXNlQ29udmVydGVyKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGFyZ2V0RGF0YWJhc2UudmFsdWVPZih2YWx1ZSk7Ci0JCQkJCXZhbHVlID0gYnVpbGREaXNwbGF5U3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIElnbm9yZSBzaW5jZSB0aGUgdmFsdWUgaXMgbm90IGEgVGFyZ2V0RGF0YWJhc2UKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhcmdldERhdGFiYXNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zLlRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCi0JCQkJU3RyaW5nIG5hbWUgPSBzdWJqZWN0LmdldFRhcmdldERhdGFiYXNlKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChnZXREZWZhdWx0VmFsdWUoc3ViamVjdCkuZXF1YWxzKHZhbHVlKSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0VGFyZ2V0RGF0YWJhc2UodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhcmdldERhdGFiYXNlTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRUYXJnZXREYXRhYmFzZUxpc3RIb2xkZXIoKSk7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkVGFyZ2V0RGF0YWJhc2VzTGlzdEhvbGRlcigpKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KGhvbGRlcnMpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZFRhcmdldERhdGFiYXNlcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFRhcmdldERhdGFiYXNlLCBTdHJpbmc+KENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihUYXJnZXREYXRhYmFzZS52YWx1ZXMoKSkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oVGFyZ2V0RGF0YWJhc2UgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUYXJnZXREYXRhYmFzZXNDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oCi0JCQlDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihidWlsZFRhcmdldERhdGFiYXNlcygpKQotCQkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhcmdldERhdGFiYXNlc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZFRhcmdldERhdGFiYXNlc0NvbGxlY3Rpb25Ib2xkZXIoKSwKLQkJCWJ1aWxkVGFyZ2V0RGF0YWJhc2VDb21wYXJhdG9yKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoT3B0aW9ucyBzdWJqZWN0KSB7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHRUYXJnZXREYXRhYmFzZSgpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdEVtcHR5OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUNvbWJvIGNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RhcmdldERhdGFiYXNlTGFiZWwsCi0JCQl0aGlzLmJ1aWxkVGFyZ2V0RGF0YWJhc2VMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVGFyZ2V0RGF0YWJhc2VIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRUYXJnZXREYXRhYmFzZUNvbnZlcnRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9PUFRJT05TX1RBUkdFVF9EQVRBQkFTRQotCQkpOwotCi0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UYXJnZXRTZXJ2ZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvVGFyZ2V0U2VydmVyQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOTEyYzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UYXJnZXRTZXJ2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlRhcmdldFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBUYXJnZXRTZXJ2ZXJDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFRhcmdldFNlcnZlckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8T3B0aW9ucz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRhcmdldFNlcnZlckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGFyZ2V0U2VydmVyQ29tcG9zaXRlKAotCQkJCQkJCQlQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0VGFyZ2V0U2VydmVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zLkRFRkFVTFRfVEFSR0VUX1NFUlZFUikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBUYXJnZXRTZXJ2ZXJDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFRhcmdldFNlcnZlckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0VGFyZ2V0U2VydmVySG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERpc3BsYXlTdHJpbmcoU3RyaW5nIHRhcmdldFNlcnZlck5hbWUpIHsKLQkJCi0JCXJldHVybiBTV1RVdGlsLmJ1aWxkRGlzcGxheVN0cmluZygKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgCi0JCQl0aGlzLmdldENsYXNzKCksIAotCQkJVGFyZ2V0U2VydmVyLnZhbHVlT2YodGFyZ2V0U2VydmVyTmFtZSkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVyQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHRhcmdldFNlcnZlcjEsIFN0cmluZyB0YXJnZXRTZXJ2ZXIyKSB7Ci0JCQkJdGFyZ2V0U2VydmVyMSA9IGJ1aWxkRGlzcGxheVN0cmluZyh0YXJnZXRTZXJ2ZXIxKTsKLQkJCQl0YXJnZXRTZXJ2ZXIyID0gYnVpbGREaXNwbGF5U3RyaW5nKHRhcmdldFNlcnZlcjIpOwotCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGFyZ2V0U2VydmVyMSwgdGFyZ2V0U2VydmVyMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFRhcmdldFNlcnZlckNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQkJCXRyeSB7Ci0JCQkJCVRhcmdldFNlcnZlci52YWx1ZU9mKHZhbHVlKTsKLQkJCQkJdmFsdWUgPSBidWlsZERpc3BsYXlTdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSWdub3JlIHNpbmNlIHRoZSB2YWx1ZSBpcyBub3QgYSBUYXJnZXRTZXJ2ZXIKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhcmdldFNlcnZlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5UQVJHRVRfU0VSVkVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0VGFyZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gVGFyZ2V0U2VydmVyQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlpZiAoZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFRhcmdldFNlcnZlcih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVyTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRUYXJnZXRTZXJ2ZXJMaXN0SG9sZGVyKCkpOwotCQlob2xkZXJzLmFkZChidWlsZFRhcmdldFNlcnZlcnNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFRhcmdldFNlcnZlciwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoVGFyZ2V0U2VydmVyLnZhbHVlcygpKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShUYXJnZXRTZXJ2ZXIgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUYXJnZXRTZXJ2ZXJzQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYnVpbGRUYXJnZXRTZXJ2ZXJzKCkpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVyc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZFRhcmdldFNlcnZlcnNDb2xsZWN0aW9uSG9sZGVyKCksCi0JCQlidWlsZFRhcmdldFNlcnZlckNvbXBhcmF0b3IoKQotCQkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRWYWx1ZShPcHRpb25zIHN1YmplY3QpIHsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdFRhcmdldFNlcnZlcigpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdEVtcHR5OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21ibyBjb21ibyA9IGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90YXJnZXRTZXJ2ZXJMYWJlbCwKLQkJCXRoaXMuYnVpbGRUYXJnZXRTZXJ2ZXJMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVGFyZ2V0U2VydmVySG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVGFyZ2V0U2VydmVyQ29udmVydGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX09QVElPTlNfVEFSR0VUX1NFUlZFUgotCQkpOwotCi0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UZW1wb3JhbE11dGFibGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvVGVtcG9yYWxNdXRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYWYxZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UZW1wb3JhbE11dGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBUZW1wb3JhbE11dGFibGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFRlbXBvcmFsTXV0YWJsZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8T3B0aW9ucz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRlbXBvcmFsTXV0YWJsZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUZW1wb3JhbE11dGFibGVDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIE9wdGlvbnM+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGVtcG9yYWxNdXRhYmxlTGFiZWwsCi0JCQl0aGlzLmJ1aWxkVGVtcG9yYWxNdXRhYmxlSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVGVtcG9yYWxNdXRhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX09QVElPTlMKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRlbXBvcmFsTXV0YWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zLlRFTVBPUkFMX01VVEFCTEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUZW1wb3JhbE11dGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRUZW1wb3JhbE11dGFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZW1wb3JhbE11dGFibGVTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRUZW1wb3JhbE11dGFibGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90ZW1wb3JhbE11dGFibGVMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RlbXBvcmFsTXV0YWJsZUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRUZW1wb3JhbE11dGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJT3B0aW9ucy5URU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0VGVtcG9yYWxNdXRhYmxlKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0VGVtcG9yYWxNdXRhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vQ3JlYXRlRGRsRmlsZU5hbWVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0NyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYzU1ZTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vQ3JlYXRlRGRsRmlsZU5hbWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIENyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8U2NoZW1hR2VuZXJhdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTw/IGV4dGVuZHMgU2NoZW1hR2VuZXJhdGlvbj4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdENyZWF0ZURkbEZpbGVOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWFHZW5lcmF0aW9uLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQ1JFQVRFX0ZJTEVfTkFNRSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0Q3JlYXRlRGRsRmlsZU5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdENyZWF0ZURkbEZpbGVOYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDcmVhdGVEZGxGaWxlTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8U2NoZW1hR2VuZXJhdGlvbiwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgU2NoZW1hR2VuZXJhdGlvbi5DUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0Q3JlYXRlRmlsZU5hbWUoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGdldERlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRDcmVhdGVGaWxlTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKFNjaGVtYUdlbmVyYXRpb24gc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0Q3JlYXRlRmlsZU5hbWUoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRFbXB0eTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tYm8gY29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfY3JlYXRlRGRsRmlsZU5hbWVMYWJlbCwKLQkJCXRoaXMuYnVpbGREZWZhdWx0Q3JlYXRlRGRsRmlsZU5hbWVMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkQ3JlYXRlRGRsRmlsZU5hbWVIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfU0NIRU1BX0dFTkVSQVRJT04KLQkJKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9EZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDIxNTg4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvbGRlckNob29zZXJDb21ib1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIERkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxTY2hlbWFHZW5lcmF0aW9uPgotewotCXB1YmxpYyBEZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgU2NoZW1hR2VuZXJhdGlvbj4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJbmV3IEZvbGRlckNob29zZXJDb21ib1BhbmU8U2NoZW1hR2VuZXJhdGlvbj4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIFN0cmluZz4oCi0JCQkJCQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBTY2hlbWFHZW5lcmF0aW9uLkFQUExJQ0FUSU9OX0xPQ0FUSU9OX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCi0JCQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0QXBwbGljYXRpb25Mb2NhdGlvbigpOwotCQkJCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQkJCW5hbWUgPSBkZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbmFtZTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkJCWlmIChkZWZhdWx0VmFsdWUoc3ViamVjdCkuZXF1YWxzKHZhbHVlKSkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXN1YmplY3Quc2V0QXBwbGljYXRpb25Mb2NhdGlvbih2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWUoU2NoZW1hR2VuZXJhdGlvbiBzdWJqZWN0KSB7Ci0JCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdEFwcGxpY2F0aW9uTG9jYXRpb24oKTsKLQotCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJCQlkZWZhdWx0VmFsdWUKLQkJCQkJKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiB0aGlzLmdldERlZmF1bHRTdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0U3RyaW5nKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHREb3Q7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dNZXNzYWdlKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ01lc3NhZ2U7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dUaXRsZSgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZV9kaWFsb2dUaXRsZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZGxHZW5lcmF0aW9uTG9jYXRpb25MYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9EZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjOWZmMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9EZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLkRkbEdlbmVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlCi0JZXh0ZW5kcyBQYW5lPFNjaGVtYUdlbmVyYXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIFNjaGVtYUdlbmVyYXRpb24+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8U2NoZW1hR2VuZXJhdGlvbiwgRGRsR2VuZXJhdGlvblR5cGU+IGFkZERkbEdlbmVyYXRpb25UeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8U2NoZW1hR2VuZXJhdGlvbiwgRGRsR2VuZXJhdGlvblR5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChTY2hlbWFHZW5lcmF0aW9uLkRETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEZGxHZW5lcmF0aW9uVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIERkbEdlbmVyYXRpb25UeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEZGxHZW5lcmF0aW9uVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHREZGxHZW5lcmF0aW9uVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhEZGxHZW5lcmF0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkRGlzcGxheVN0cmluZyhFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3MsIERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlLnRoaXMsIHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGRsR2VuZXJhdGlvblR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERkbEdlbmVyYXRpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRGRsR2VuZXJhdGlvblR5cGUgdmFsdWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXREZGxHZW5lcmF0aW9uVHlwZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZGxHZW5lcmF0aW9uVHlwZUxhYmVsLAotCQkJYWRkRGRsR2VuZXJhdGlvblR5cGVDb21ibyggY29udGFpbmVyKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfU0NIRU1BX0dFTkVSQVRJT04KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9Ecm9wRGRsRmlsZU5hbWVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0Ryb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTYwOTQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0Ryb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPFNjaGVtYUdlbmVyYXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Ecm9wRGRsRmlsZU5hbWVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIERyb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTw/IGV4dGVuZHMgU2NoZW1hR2VuZXJhdGlvbj4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdERyb3BEZGxGaWxlTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8U2NoZW1hR2VuZXJhdGlvbiwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgU2NoZW1hR2VuZXJhdGlvbi5ERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RST1BfRklMRV9OQU1FKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIERyb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0RHJvcERkbEZpbGVOYW1lTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJdGhpcy5idWlsZERlZmF1bHREcm9wRGRsRmlsZU5hbWVIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERyb3BEZGxGaWxlTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8U2NoZW1hR2VuZXJhdGlvbiwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgU2NoZW1hR2VuZXJhdGlvbi5EUk9QX0ZJTEVfTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCi0JCQkJU3RyaW5nIG5hbWUgPSBzdWJqZWN0LmdldERyb3BGaWxlTmFtZSgpOwotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IERyb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKERyb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXREcm9wRmlsZU5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRWYWx1ZShTY2hlbWFHZW5lcmF0aW9uIHN1YmplY3QpIHsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdERyb3BGaWxlTmFtZSgpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdEVtcHR5OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21ibyBjb21ibyA9IGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kcm9wRGRsRmlsZU5hbWVMYWJlbCwKLQkJCXRoaXMuYnVpbGREZWZhdWx0RHJvcERkbEZpbGVOYW1lTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZERyb3BEZGxGaWxlTmFtZUhvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9TQ0hFTUFfR0VORVJBVElPTgotCQkpOwotCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIoY29tYm8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODEyMWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uQ29tcG9zaXRlCi0JZXh0ZW5kcyBQYW5lPFNjaGVtYUdlbmVyYXRpb24+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZSgKLQkJCQkJUGFuZTxTY2hlbWFHZW5lcmF0aW9uPiBzdWJqZWN0SG9sZGVyLAotCQkJCQlDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGFkZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX3NlY3Rpb25UaXRsZSwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uCi0JCSk7Ci0KLQkJLy8gRERMIEdlbmVyYXRpb24gVHlwZToKLQkJbmV3IERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCS8vIE91dHB1dCBNb2RlOgotCQluZXcgT3V0cHV0TW9kZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQkvLyBEREwgR2VuZXJhdGlvbiBMb2NhdGlvbgotCQluZXcgRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCS8vIENyZWF0ZSBEREwgRmlsZSBOYW1lOgotCQluZXcgQ3JlYXRlRGRsRmlsZU5hbWVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJLy8gRHJvcCBEREwgRmlsZSBOYW1lOgotCQluZXcgRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL091dHB1dE1vZGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL091dHB1dE1vZGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4NTFhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9PdXRwdXRNb2RlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uT3V0cHV0TW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIE91dHB1dE1vZGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIE91dHB1dE1vZGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPFNjaGVtYUdlbmVyYXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PdXRwdXRNb2RlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPdXRwdXRNb2RlQ29tcG9zaXRlKAotCQkJCVBhbmU8PyBleHRlbmRzIFNjaGVtYUdlbmVyYXRpb24+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxTY2hlbWFHZW5lcmF0aW9uLCBPdXRwdXRNb2RlPiBhZGRCdWlsZE91dHB1dE1vZGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxTY2hlbWFHZW5lcmF0aW9uLCBPdXRwdXRNb2RlPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE91dHB1dE1vZGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBPdXRwdXRNb2RlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPdXRwdXRNb2RlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdE91dHB1dE1vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoT3V0cHV0TW9kZSB2YWx1ZSkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkRGlzcGxheVN0cmluZyhFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3MsIE91dHB1dE1vZGVDb21wb3NpdGUudGhpcywgdmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPdXRwdXRNb2RlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRPdXRwdXRNb2RlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT3V0cHV0TW9kZSB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldE91dHB1dE1vZGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfb3V0cHV0TW9kZUxhYmVsLAotCQkJCXRoaXMuYWRkQnVpbGRPdXRwdXRNb2RlQ29tYm8oY29udGFpbmVyKSwKLQkJCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1NDSEVNQV9HRU5FUkFUSU9OCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzODRhNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiCi0JZXh0ZW5kcyBQYW5lPFNjaGVtYUdlbmVyYXRpb24+Ci0JaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFNjaGVtYUdlbmVyYXRpb24+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKcGFQYWdlQ29tcG9zaXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVscElEKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9TQ0hFTUFfR0VORVJBVElPTjsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX3RpdGxlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZXhtbC9kZXRhaWxzL0VjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTIxZDNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNleG1sLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuR2VuZXJpY05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQlleHRlbmRzIEdlbmVyaWNOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCWltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci17Ci0JQE92ZXJyaWRlCi0JcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgPSAKLQkJCShEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLQkJCi0JCWlmIChpdGVtIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHsKLQkJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCShFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgaXRlbSwgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5idWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlciAKLQkJZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyCi0JewotCQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJCXN1cGVyKHBlcnNpc3RlbmNlVW5pdCwgY29udGVudFByb3ZpZGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRNb2RlbCgpIHsKLQkJCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldE1vZGVsKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8SnBhQ29udGV4dE5vZGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCUxpc3Q8Q29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYUNvbnRleHROb2RlPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYUNvbnRleHROb2RlPj4oKTsKLQkJCWxpc3QuYWRkKGJ1aWxkU3BlY2lmaWVkT3JtWG1sQ3ZtKCkpOwotCQkJbGlzdC5hZGQoYnVpbGRJbXBsaWVkTWFwcGluZ0ZpbGVDdm0oKSk7Ci0JCQlsaXN0LmFkZChidWlsZEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlQ3ZtKCkpOwotCQkJbGlzdC5hZGQoYnVpbGRQZXJzaXN0ZW50VHlwZUN2bSgpKTsKLQkJCWxpc3QuYWRkKGJ1aWxkSmFyRmlsZUN2bSgpKTsKLQkJCXJldHVybiBuZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8Q29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYUNvbnRleHROb2RlPiwgSnBhQ29udGV4dE5vZGU+KGxpc3QpOwotCQl9Ci0JCQotCQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1hcHBpbmdGaWxlPiBidWlsZEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlQ3ZtKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxNYXBwaW5nRmlsZT4oCi0JCQkJbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYXBwaW5nRmlsZVJlZiwgTWFwcGluZ0ZpbGU+KAotCQkJCQkJbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgTWFwcGluZ0ZpbGVSZWY+KAotCQkJCQkJCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdC5JTVBMSUVEX0VDTElQU0VMSU5LX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFksCi0JCQkJCQkJCWdldE1vZGVsKCkpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVSZWYgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQkJCXJldHVybiBzdWJqZWN0LmdldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSwKLQkJCQkJCU1hcHBpbmdGaWxlUmVmLk1BUFBJTkdfRklMRV9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIE1hcHBpbmdGaWxlIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0TWFwcGluZ0ZpbGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZXhtbC9kZXRhaWxzL0VjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZXhtbC9kZXRhaWxzL0VjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYTAzZDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2V4bWwvZGV0YWlscy9FY2xpcHNlTGlua05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNleG1sLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5HZW5lcmljTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JZXh0ZW5kcyBHZW5lcmljTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLXsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNTc1N2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRkbGdlbi5FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmJhc2UuQmFzZUpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLm5hdmlnYXRvci5KcGFOYXZpZ2F0b3JQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaQotCWV4dGVuZHMgQmFzZUpwYVBsYXRmb3JtVWkKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpKAotCQlKcGFOYXZpZ2F0b3JQcm92aWRlciBuYXZpZ2F0b3JQcm92aWRlciwKLQkJSnBhUGxhdGZvcm1VaVByb3ZpZGVyIHBsYXRmb3JtVWlQcm92aWRlcikgCi0JewotCQlzdXBlcihuYXZpZ2F0b3JQcm92aWRlciwgcGxhdGZvcm1VaVByb3ZpZGVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIERETCBnZW5lcmF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlRERMKEpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWkuZ2VuZXJhdGUocHJvamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYmQ2ZTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaUZhY3RvcnkgaW1wbGVtZW50cyBKcGFQbGF0Zm9ybVVpRmFjdG9yeQotewotCi0JLyoqCi0JICogWmVybyBhcmcgY29uc3RydWN0b3IgZm9yIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpIGJ1aWxkSnBhUGxhdGZvcm1VaSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0pwYVBsYXRmb3JtVWkoCi0JCQluZXcgRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlcigpLAotCQkJRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuaW5zdGFuY2UoKQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGYxNTgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1YbWxVaURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyCi17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZXRhaWxzIHByb3ZpZGVycyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGV0YWlsc1Byb3ZpZGVyc1RvKExpc3Q8SnBhRGV0YWlsc1Byb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHJlc291cmNlIHVpIGRlZmluaXRpb25zICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZVVpRGVmaW5pdGlvbnNUbyhMaXN0PFJlc291cmNlVWlEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGU1YzRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rTmF2aWdhdG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZXhtbC5kZXRhaWxzLkVjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNleG1sLmRldGFpbHMuRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5uYXZpZ2F0b3IuSnBhTmF2aWdhdG9yUHJvdmlkZXI7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlciBpbXBsZW1lbnRzIEpwYU5hdmlnYXRvclByb3ZpZGVyCi17Ci0JcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBnZXRJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3N0cnVjdHVyZS9FY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDNlMDhkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3N0cnVjdHVyZS9FY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlLk9ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuT3JtSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYVN0cnVjdHVyZVByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhU3RydWN0dXJlUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBPcm1JdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBPcm1JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlODlmN2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlLlBlcnNpc3RlbmNlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQlleHRlbmRzIFBlcnNpc3RlbmNlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLXsKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQlEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHRyZWVDb250ZW50UHJvdmlkZXIgPSAoRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgY29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHsKLQkJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyKChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7CQotCQl9Ci0JCXJldHVybiBzdXBlci5idWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlciAKLQkJZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyCi0JewotCQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJCXN1cGVyKHBlcnNpc3RlbmNlVW5pdCwgY29udGVudFByb3ZpZGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRNb2RlbCgpIHsKLQkJCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldE1vZGVsKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8SnBhU3RydWN0dXJlTm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8TWFwcGluZ0ZpbGVSZWY+IHNwZWNpZmllZE1hcHBpbmdGaWxlQ3ZtID0gCi0JCQkJbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8TWFwcGluZ0ZpbGVSZWY+KAotCQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIE1hcHBpbmdGaWxlUmVmPigKLQkJCQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfTUFQUElOR19GSUxFX1JFRlNfTElTVCwKLQkJCQkJCWdldE1vZGVsKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKTsKLQkJCQkJfQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCi0JCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxNYXBwaW5nRmlsZVJlZj4gaW1wbGllZE1hcHBpbmdGaWxlQ3ZtID0gCi0JCQkJbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPE1hcHBpbmdGaWxlUmVmPigKLQkJCQkJbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIE1hcHBpbmdGaWxlUmVmPigKLQkJCQkJCQlQZXJzaXN0ZW5jZVVuaXQuSU1QTElFRF9NQVBQSU5HX0ZJTEVfUkVGX1BST1BFUlRZLAotCQkJCQkJCWdldE1vZGVsKCkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIE1hcHBpbmdGaWxlUmVmIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJCXJldHVybiBzdWJqZWN0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPiBpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZUN2bSA9IAotCQkJCW5ldyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxNYXBwaW5nRmlsZVJlZj4oCi0JCQkJCW5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQsIE1hcHBpbmdGaWxlUmVmPigKLQkJCQkJCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdC5JTVBMSUVEX0VDTElQU0VMSU5LX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFksCi0JCQkJCQkJZ2V0TW9kZWwoKSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVSZWYgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NDdm0gPSAKLQkJCQluZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxDbGFzc1JlZj4oCi0JCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgQ2xhc3NSZWY+KAotCQkJCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9DTEFTU19SRUZTX0xJU1QsCi0JCQkJCQlnZXRNb2RlbCgpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCQkJCX0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRDbGFzc1JlZnNTaXplKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPENsYXNzUmVmPiBpbXBsaWVkQ2xhc3NDdm0gPSAKLQkJCQluZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBDbGFzc1JlZj4oCi0JCQkJCQlQZXJzaXN0ZW5jZVVuaXQuSU1QTElFRF9DTEFTU19SRUZTX0NPTExFQ1RJT04sCi0JCQkJCQlnZXRNb2RlbCgpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8Q2xhc3NSZWY+IGl0ZXJhdG9yXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmltcGxpZWRDbGFzc1JlZnMoKTsKLQkJCQkJfQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmltcGxpZWRDbGFzc1JlZnNTaXplKCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJTGlzdDxDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4oNCk7Ci0JCQlsaXN0LmFkZChzcGVjaWZpZWRNYXBwaW5nRmlsZUN2bSk7Ci0JCQlsaXN0LmFkZChpbXBsaWVkTWFwcGluZ0ZpbGVDdm0pOwotCQkJbGlzdC5hZGQoaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVDdm0pOwotCQkJbGlzdC5hZGQoc3BlY2lmaWVkQ2xhc3NDdm0pOwotCQkJbGlzdC5hZGQoaW1wbGllZENsYXNzQ3ZtKTsKLQkJCQotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4sIEpwYVN0cnVjdHVyZU5vZGU+KGxpc3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3N0cnVjdHVyZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjM2I1NjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZS5QZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYVN0cnVjdHVyZVByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhU3RydWN0dXJlUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBnZXRUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0SXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjA5M2QyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwxXzFVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnN0cnVjdHVyZS5FY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW50aXR5VWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1JZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVhtbFVpRmFjdG9yeSBidWlsZE9ybVhtbFVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVhtbDFfMVVpRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5pbnN0YW5jZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChPcm1JZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVudGl0eVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwxXzFVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwxXzFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkZWUyYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8xVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQmFzZUVjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwxXzFVaUZhY3RvcnkgZXh0ZW5kcyBCYXNlRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkKLXsKLQkvLyAqKioqKioqKioqKioqKioqIG9ybSBhdHRyaWJ1dGUgbWFwcGluZyBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1JZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1CYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1WZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZE1hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTllM2U3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcxXzFDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcxXzFDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCX0JCi0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTcwMjYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzFfMUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb09uZU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcxXzFDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxY2MxMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcxXzFDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZTxPcm1CYXNpY01hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGluazFfMU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQmFzaWNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgYWRkU3ViUGFuZShjb250YWluZXIsIDQpKTsKLQkJbmV3IEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZSh0aGlzLCBidWlsZE11dGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxCYXNpY01hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwNDlhMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcxXzFDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0RW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGU8T3JtRW1iZWRkZWRJZE1hcHBpbmc+Ci0JaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzFfMUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQotCQluZXcgRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlKAotCQkJCXRoaXMsCi0JCQkJY29udGFpbmVyKTsKLQl9CQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1iZWRkZWRJZE1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGVkTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGVkTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmUzNmM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRlZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBFbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbWJlZGRlZE1hcHBpbmcKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nMV8xQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU8T3JtRW1iZWRkZWRNYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+RW1iZWRkZWRNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nMV8xQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbWJlZGRlZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQotCQluZXcgRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWNvbnRhaW5lcgotCQkpOwotCX0JCi0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1FbWJlZGRlZE1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U3NTI1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZzFfMUNvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGU8T3JtSWRNYXBwaW5nPgotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZzFfMUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUlkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7CQkKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZSh0aGlzLCBidWlsZE11dGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxJZE1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5YTViZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9yZGVyaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgTWFueVRvTWFueU1hcHBpbmd9Ci0gKiBAc2VlIHtAbGluayBUYXJnZXRFbnRpdHlDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIENhc2NhZGVDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBPcmRlcmluZ0NvbXBvc2l0ZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUKLQlleHRlbmRzIEVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8T3JtTWFueVRvTWFueU1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9NYW55TWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nMV8xQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYW55VG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5ZTMxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgTWFueVRvT25lTWFwcGluZ30KLSAqIEBzZWUge0BsaW5rIFRhcmdldEVudGl0eUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBGZXRjaFR5cGVDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBPcHRpb25hbENvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIENhc2NhZGVDb21wb3NpdGV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUKLQlleHRlbmRzIEVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxPcm1NYW55VG9PbmVNYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmsxXzFNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+TWFueVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1NYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvT25lU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsJCQotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYW55VG9PbmVNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNTFmOGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZTxUIGV4dGVuZHMgT3JtT25lVG9NYW55TWFwcGluZz4gCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8VD4KLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMV8xQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPbmVUb01hbnlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSh0aGlzLCBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3MGE1Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWNjZXNzVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgT25lVG9PbmVNYXBwaW5nCi0gKiBAc2VlIEFjY2Vzc1R5cGVDb21wb3NpdGUKLSAqIEBzZWUgQ2FzY2FkZUNvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgTWFwcGVkQnlQYW5lCi0gKiBAc2VlIE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZQotICogQHNlZSBPcHRpb25hbENvbXBvc2l0ZQotICogQHNlZSBUYXJnZXRFbnRpdHlDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMV8xQ29tcG9zaXRlCi1leHRlbmRzIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPE9ybU9uZVRvT25lTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VsaW5rMV8xT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU9uZVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUodGhpcywgYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T25lVG9PbmVNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWU5MTk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzFfMUNvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8T3JtVmVyc2lvbk1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua09ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+VmVyc2lvbk1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybVZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWZXJzaW9uU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7CQkKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZSh0aGlzLCBidWlsZE11dGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxWZXJzaW9uTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL3BsYXRmb3JtL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiNmRkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL3BsYXRmb3JtL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybS5FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtLkVjbGlwc2VMaW5rTmF2aWdhdG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWlGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVVpRmFjdG9yeSBpbXBsZW1lbnRzIEpwYVBsYXRmb3JtVWlGYWN0b3J5Ci17Ci0KLQkvKioKLQkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaSgKLQkJCW5ldyBFY2xpcHNlTGlua05hdmlnYXRvclByb3ZpZGVyKCksCi0JCQlFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlQcm92aWRlci5pbnN0YW5jZSgpCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWQxN2JkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvcGxhdGZvcm0vRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEucGxhdGZvcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkVjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGRldGFpbHMgcHJvdmlkZXJzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXRhaWxzUHJvdmlkZXJzVG8oTGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgdWkgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlVWlEZWZpbml0aW9uc1RvKExpc3Q8UmVzb3VyY2VVaURlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwxXzFVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMV8ySmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazFfMkphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2IwZTFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMV8ySmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMi5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5BYnN0cmFjdEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkRlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRhYmxlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVudGl0eVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFJZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5OdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMkphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmsxXzJKYXZhUmVzb3VyY2VVaURlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsxXzJKYXZhUmVzb3VyY2VVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFVaUZhY3RvcnkgYnVpbGRKYXZhVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rMV8ySmF2YVVpRmFjdG9yeSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248Pz4+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVudGl0eVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMi9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmsxXzJKYXZhVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazFfMkphdmFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdmMjUzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazFfMkphdmFVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8yLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5FY2xpcHNlTGlua0phdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzIuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUxXzJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzIuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eTFfMkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMi5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczFfMkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8ySmF2YVVpRmFjdG9yeSBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVVpRmFjdG9yeQotewotCXB1YmxpYyBFY2xpcHNlTGluazFfMkphdmFVaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIGphdmEgdHlwZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczFfMkNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rRW50aXR5MV8yQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRW1iZWRkYWJsZUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUxXzJDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMi9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZTFfMkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMi9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZTFfMkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmE0YzBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGUxXzJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMi5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5BYnN0cmFjdEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHBhbmUgZG9lcyBub3QgaGF2ZSBhbnkgd2lkZ2V0cy4KLSAqCi0gKiBAc2VlIEVtYmVkZGFibGUKLSAqIEBzZWUgSmF2YVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICogQHNlZSBFbWJlZGRhYmxlVWlQcm92aWRlcgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZTFfMkNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW1iZWRkYWJsZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlMV8yQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVFbWJlZGRhYmxlQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQWR2YW5jZWRDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkYWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBjb250YWluZXIpOwkKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFbWJlZGRhYmxlLCBBY2Nlc3NIb2xkZXI+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHkxXzJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eTFfMkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWQ1NDFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eTFfMkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8yLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5BYnN0cmFjdEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkVudGl0eU5hbWVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRDbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluazEuMiBKYXZhIGVudGl0eS4KLSAqCi0gKiBAc2VlIEphdmFFY2xpcHNlTGlua0VudGl0eQotICogQHNlZSBFY2xpcHNlbGlua0pwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rRW50aXR5MV8yQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZTxKYXZhRW50aXR5PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtKYXZhRW50aXR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SmF2YUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFbnRpdHkxXzJDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW50aXR5U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYWJsZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRW50aXR5TmFtZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwkKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsJCi0JCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSWRDbGFzc1JlZmVyZW5jZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVudGl0eSwgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMi9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczFfMkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMi9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczFfMkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjY3MzdkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MxXzJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMi5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5BYnN0cmFjdEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JZENsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBwYW5lIHVzZWQgZm9yIGFuIEVjbGlwc2VMaW5rIEphdmEgTWFwcGVkIFN1cGVyY2xhc3MuCi0gKgotICogQHNlZSBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MKLSAqIEBzZWUgRWNsaXBzZWxpbmtKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MxXzJDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMV8yQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYXBwZWRTdXBlcmNsYXNzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGNvbnRhaW5lcik7CQotCQluZXcgSWRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBidWlsZElkQ2xhc3NSZWZlcmVuY2VIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhTWFwcGVkU3VwZXJjbGFzcywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmMDVkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8yVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMi5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVudGl0eVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVhtbDFfMlVpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxVaUZhY3RvcnkgYnVpbGRPcm1YbWxVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWwxXzFVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXNVaShKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMl9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8T3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChPcm1FbnRpdHlVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL3BsYXRmb3JtL0VjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvcGxhdGZvcm0vRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmU4Y2U0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvcGxhdGZvcm0vRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8yLnBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtLkVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm0uRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtVWlGYWN0b3J5IGltcGxlbWVudHMgSnBhUGxhdGZvcm1VaUZhY3RvcnkKLXsKLQotCS8qKgotCSAqIFplcm8gYXJnIGNvbnN0cnVjdG9yIGZvciBleHRlbnNpb24gcG9pbnQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVVpRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm1VaSBidWlsZEpwYVBsYXRmb3JtVWkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpKAotCQkJbmV3IEVjbGlwc2VMaW5rTmF2aWdhdG9yUHJvdmlkZXIoKSwKLQkJCUVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1VaVByb3ZpZGVyLmluc3RhbmNlKCkKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL3BsYXRmb3JtL0VjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL3BsYXRmb3JtL0VjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZDgwZTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMi9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMi5wbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMi5kZXRhaWxzLmphdmEuRWNsaXBzZUxpbmsxXzJKYXZhUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzIuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5BYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVhtbFVpRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1VaVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVVpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRldGFpbHMgcHJvdmlkZXJzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXRhaWxzUHJvdmlkZXJzVG8oTGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgdWkgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlVWlEZWZpbml0aW9uc1RvKExpc3Q8UmVzb3VyY2VVaURlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGluazFfMkphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwxXzFVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDFfMlVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZGxnZW4vd2l6YXJkcy9FY2xpcHNlTGluazJfMERETEdlbmVyYXRvclVpLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RkbGdlbi93aXphcmRzL0VjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkMGRjYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RkbGdlbi93aXphcmRzL0VjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZGxnZW4ud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuZGRsZ2VuLkVjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZGxnZW4uRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaTsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3JVaQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3JVaSBleHRlbmRzIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWkKLXsKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZCAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGUoSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCW5ldyBFY2xpcHNlTGluazJfMERETEdlbmVyYXRvclVpKHByb2plY3QpLmdlbmVyYXRlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCXByaXZhdGUgRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3JVaShKcGFQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIocHJvamVjdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgV29ya3NwYWNlSm9iIGJ1aWxkR2VuZXJhdGVERExKb2IoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJhdGUyXzBERExKb2IocHVOYW1lLCBwcm9qZWN0KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJ1bm5hYmxlICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgR2VuZXJhdGUyXzBERExKb2IgZXh0ZW5kcyBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpLkdlbmVyYXRlRERMSm9iIHsKLQotCQlwdWJsaWMgR2VuZXJhdGUyXzBERExKb2IoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQlzdXBlcihwdU5hbWUsIHByb2plY3QpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRkbEdlbmVyYXRvckdlbmVyYXRlKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlFY2xpcHNlTGluazJfMERETEdlbmVyYXRvci5nZW5lcmF0ZShwdU5hbWUsIHByb2plY3QsIG1vbml0b3IpOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YjUzNjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBleHRlbmRzIFBhbmU8VD4KLXsKLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCi0gICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZWFibGUyXzA+IGNhY2hlYWJsZUhvbGRlciA9IGJ1aWxkQ2FjaGVhYmxlSG9sZGVyKCk7Ci0JCQotCQkvL1NoYXJlZCBDaGVjayBib3gsIHVuY2hlY2sgdGhpcyBhbmQgdGhlIHJlc3Qgb2YgdGhlIHBhbmVsIGlzIGRpc2FibGVkCi0JCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA4KSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVudGl0eV9jYWNoZWFibGVMYWJlbCwKLQkJCWJ1aWxkU3BlY2lmaWVkQ2FjaGVhYmxlSG9sZGVyKGNhY2hlYWJsZUhvbGRlciksCi0JCQlidWlsZENhY2hlYWJsZVN0cmluZ0hvbGRlcihjYWNoZWFibGVIb2xkZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0NBQ0hFQUJMRQotCQkpOwotCi0JCUNvbXBvc2l0ZSBzdWJQYW5lID0gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIDE2KTsKLQotCQlDb2xsZWN0aW9uPFBhbmU8Pz4+IHBhbmVzID0gbmV3IEFycmF5TGlzdDxQYW5lPD8+PigpOwotCQkKLQkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZSh0aGlzLCBzdWJQYW5lKSk7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUodGhpcywgc3ViUGFuZSkpOwotCQkKLQkJLy8gQWR2YW5jZWQgc3ViLXBhbmUKLQkJQ29tcG9zaXRlIGFkdmFuY2VkU2VjdGlvbiA9IGFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCXN1YlBhbmUsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZV9hZHZhbmNlZCwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSkKLQkJKTsKLQotCQlpbml0aWFsaXplQWR2YW5jZWRQYW5lKGFkZFN1YlBhbmUoYWR2YW5jZWRTZWN0aW9uLCAwLCAxNiksIHBhbmVzKTsKLQkJCQotCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRDYWNoZWFibGVFbmFibGVyKGNhY2hlYWJsZUhvbGRlciksIHBhbmVzKTsKLQkJCi0JCWluaXRpYWxpemVFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShhZGRTdWJQYW5lKGNvbnRhaW5lciwgOCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlYWJsZTJfMD4gYnVpbGRDYWNoZWFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQ2FjaGVhYmxlMl8wPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlYWJsZTJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChDYWNoZWFibGVIb2xkZXIyXzApIHRoaXMuc3ViamVjdCkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFkdmFuY2VkUGFuZShDb21wb3NpdGUgY29udGFpbmVyLCBDb2xsZWN0aW9uPFBhbmU8Pz4+IHBhbmVzKSB7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcikpOwotCQlwYW5lcy5hZGQobmV3IEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcikpOwotCQlwYW5lcy5hZGQobmV3IEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KTsKLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhY2hlYWJsZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlYWJsZTJfMD4gY2FjaGVhYmxlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hlYWJsZTJfMCwgQm9vbGVhbj4oCi0JCQkJY2FjaGVhYmxlSG9sZGVyLAotCQkJCUNhY2hlYWJsZTJfMC5TUEVDSUZJRURfQ0FDSEVBQkxFX1BST1BFUlRZLCAKLQkJCQlDYWNoZWFibGUyXzAuREVGQVVMVF9DQUNIRUFCTEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNDYWNoZWFibGUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQkKLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU3BlY2lmaWVkQ2FjaGVhYmxlSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZWFibGUyXzA+IGNhY2hlYWJsZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoZWFibGUyXzAsIEJvb2xlYW4+KGNhY2hlYWJsZUhvbGRlciwgQ2FjaGVhYmxlMl8wLlNQRUNJRklFRF9DQUNIRUFCTEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRDYWNoZWFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDYWNoZWFibGVTdHJpbmdIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlYWJsZTJfMD4gY2FjaGVhYmxlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRDYWNoZWFibGVIb2xkZXIoY2FjaGVhYmxlSG9sZGVyKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVudGl0eV9jYWNoZWFibGVXaXRoRGVmYXVsdExhYmVsLCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuRW50aXR5X2NhY2hlYWJsZUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRDYWNoZWFibGVIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlYWJsZTJfMD4gY2FjaGVhYmxlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hlYWJsZTJfMCwgQm9vbGVhbj4oCi0JCQljYWNoZWFibGVIb2xkZXIsCi0JCQlDYWNoZWFibGUyXzAuU1BFQ0lGSUVEX0NBQ0hFQUJMRV9QUk9QRVJUWSwKLQkJCUNhY2hlYWJsZTJfMC5ERUZBVUxUX0NBQ0hFQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENhY2hlYWJsZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTQ3MjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkRlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW50aXR5VWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuTnVsbEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhVWlGYWN0b3J5IGJ1aWxkSmF2YVVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGluazJfMEphdmFVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbWJlZGRlZElkTWFwcGluZ1VEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCi0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0KLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248Pz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChOdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChKYXZhRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazJfMEphdmFVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjNjMmZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMi5kZXRhaWxzLmphdmEuRWNsaXBzZUxpbmsxXzJKYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkVtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qcGEyLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wSnBhVWlGYWN0b3J5Ci0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFVaUZhY3RvcnkKLQlleHRlbmRzIEVjbGlwc2VMaW5rMV8ySmF2YVVpRmFjdG9yeQotCWltcGxlbWVudHMgSmF2YVVpRmFjdG9yeTJfMAotewotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFVaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbnRpdHlDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGphdmEgYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEVtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFPbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODg4ZjE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHBhbmUgc2hvd3MgdGhlIGNhY2hpbmcgb3B0aW9ucy4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCB4IFNoYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgQ2FjaGVUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlU2l6ZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICA+IEFkdmFuY2VkICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIAlFeHBpcnlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJQWx3YXlzUmVmcmVzaENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAJCVJlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIAlEaXNhYmxlSGl0c0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJQ2FjaGVDb29yZGluYXRpb25Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgRXhpc3RlbmNlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZwotICogQHNlZSBKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZTxKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPgotewotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAotICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbmV3IEphdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlKHRoaXMsIHBhcmVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNzE0MzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLlRhcmdldENsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGU8SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rMV8xT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+QmFzaWNNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVsZW1lbnRDb2xsZWN0aW9uU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sbGVjdGlvblRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0pvaW5GZXRjaD4gYnVpbGRKb2luRmV0Y2hIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAsIEVjbGlwc2VMaW5rSm9pbkZldGNoPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHkyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzRmYzljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRW50aXR5TmFtZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JZENsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuRW50aXR5Ml8wT3ZlcnJpZGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuR2VuZXJhdGlvbjJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLlF1ZXJpZXMyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgYW4gRWNsaXBzZUxpbmsxLjEgSmF2YSBlbnRpdHkuCi0gKgotICogQHNlZSBKYXZhRWNsaXBzZUxpbmtFbnRpdHkKLSAqIEBzZWUgRWNsaXBzZWxpbmtKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGU8SmF2YUVudGl0eT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rSmF2YUVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkphdmFFbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRW50aXR5Ml8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVudGl0eVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFibGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVudGl0eU5hbWVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsJCi0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGNvbnRhaW5lcik7CQotCQluZXcgSWRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBidWlsZElkQ2xhc3NSZWZlcmVuY2VIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRW50aXR5LCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQXR0cmlidXRlT3ZlcnJpZGVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhdG9yc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gZ2VuZXJhdG9yQ29udGFpbmVySG9sZGVyKSB7Ci0JCW5ldyBHZW5lcmF0aW9uMl8wQ29tcG9zaXRlKHRoaXMsIGdlbmVyYXRvckNvbnRhaW5lckhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NhY2hpbmc+IGNhY2hpbmdIb2xkZXIpIHsKLQkJbmV3IEphdmFFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUodGhpcywgY2FjaGluZ0hvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUXVlcmllc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5Q29udGFpbmVyPiBxdWVyeUNvbnRhaW5lckhvbGRlcikgewotCQluZXcgUXVlcmllczJfMENvbXBvc2l0ZSh0aGlzLCBxdWVyeUNvbnRhaW5lckhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzQwNzkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZTxKYXZhSWRNYXBwaW5nPgotCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JcHVibGljIEphdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkTXV0YWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYXRpb25Db2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3M2JhNTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMFVpRGVmaW5pdGlvbgotCWV4dGVuZHMgSmF2YUlkTWFwcGluZ1VpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMFVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMFVpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhSWRNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRGb3IoUGVyc2lzdGVudEF0dHJpYnV0ZSBtYXBwYWJsZU9iamVjdCkgewotCQkvLyBhIGRlZmF1bHQgZWNsaXBzZWxpbmsgMS0xIG1hcHBpbmcgY2FuIG5vdCBiZSBtYXBwZWQgYXMgYW4gaWQsIGFzIG1hcHBpbmcgaXQKLQkJLy8gdGhhdCB3YXkgd2lsbCBhY3R1YWxseSByZXN1bHQgaW4gYSBkZWZhdWx0IDEtMSB3aXRoIGFuIGlkIGRlcml2ZWQgaWRlbnRpdHkKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCgKLQkJCQltYXBwYWJsZU9iamVjdC5nZXREZWZhdWx0TWFwcGluZ0tleSgpLCAKLQkJCQlNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOGI1NTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5DYXNjYWRlUGFuZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9yZGVyaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxNYW55VG9NYW55TWFwcGluZz4KLXsKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlUGFuZTJfMCh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT3JkZXJpbmdDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JkZXJpbmcyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U+IGJ1aWxkRWNsaXBzZUxpbmtKb2luaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPE1hbnlUb01hbnlNYXBwaW5nLCBNYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSB0cmFuc2Zvcm1fKE1hbnlUb01hbnlNYXBwaW5nIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZGFiOGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ2FzY2FkZVBhbmUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8SmF2YU1hbnlUb09uZU1hcHBpbmcsIEphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA+Ci17Ci0JcHVibGljIEphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0pvaW5GZXRjaD4gYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhTWFueVRvT25lTWFwcGluZywgRWNsaXBzZUxpbmtKb2luRmV0Y2g+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2ggYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMCkgdGhpcy5zdWJqZWN0KS5nZXRKb2luRmV0Y2goKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyM2Y1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRDbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluayBKYXZhIE1hcHBlZCBTdXBlcmNsYXNzLgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzCi0gKiBAc2VlIEVjbGlwc2VsaW5rSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYXBwZWRTdXBlcmNsYXNzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGNvbnRhaW5lcik7CQotCQluZXcgSWRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBidWlsZElkQ2xhc3NSZWZlcmVuY2VIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFNYXBwZWRTdXBlcmNsYXNzLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NhY2hpbmc+IGNhY2hpbmdIb2xkZXIpIHsKLQkJbmV3IEphdmFFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUodGhpcywgY2FjaGluZ0hvbGRlciwgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjcwODcyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT3JkZXJpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPEphdmFPbmVUb01hbnlNYXBwaW5nPgotewotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPbmVUb01hbnlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIHRoaXMuYnVpbGRDYXNjYWRlSG9sZGVyKCksIHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9yZGVyaW5nQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9yZGVyaW5nMl8wQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxPcnBoYW5SZW1vdmFibGUyXzA+IGJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhT25lVG9NYW55TWFwcGluZywgT3JwaGFuUmVtb3ZhYmxlMl8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKE9ycGhhblJlbW92YWxIb2xkZXIyXzApIHRoaXMuc3ViamVjdCkuZ2V0T3JwaGFuUmVtb3ZhbCgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzBjMzI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT25lVG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8SmF2YU9uZVRvT25lTWFwcGluZywgSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wPgotewotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSh0aGlzLCBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlKHRoaXMsIGJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlUGFuZTJfMCh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVneUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPbmVUb09uZUpvaW5pbmdTdHJhdGVneTJfMFBhbmUodGhpcywgYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rSm9pbkZldGNoPiBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFPbmVUb09uZU1hcHBpbmcsIEVjbGlwc2VMaW5rSm9pbkZldGNoPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPiBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhT25lVG9PbmVNYXBwaW5nLCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldFByaXZhdGVPd25lZCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9ycGhhblJlbW92YWJsZTJfMD4gYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFPbmVUb09uZU1hcHBpbmcsIE9ycGhhblJlbW92YWJsZTJfMD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ycGhhblJlbW92YWJsZTJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldE9ycGhhblJlbW92YWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjODEzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5DYXRhbG9nQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuU2NoZW1hQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGFja2FnZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVF1ZXJpZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzR2VuZXJhdG9yczJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1RdWVyaWVzMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFhtbFBhY2thZ2VDaG9vc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgU2NoZW1hOiAgICAgIHwgU2NoZW1hQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQ2F0YWxvZzogICAgIHwgQ2F0YWxvZ0NvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQWNjZXNzIFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1RdWVyaWVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENvbnZlcnRlcnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzCi0gKiBAc2VlIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENhdGFsb2dDb21ibwotICogQHNlZSBFbnVtRm9ybUNvbWJvVmlld2VyCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZQotICogQHNlZSBPcm1QYWNrYWdlQ2hvb3NlcgotICogQHNlZSBPcm1RdWVyaWVzQ29tcG9zaXRlCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlCi0gKiBAc2VlIFNjaGVtYUNvbWJvCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0b3JzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yczJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVRdWVyaWVzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybVF1ZXJpZXMyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiNGVmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIHtAbGluayBKcGFEZXRhaWxzUGFnZX0KLSAqIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIFhNTCBmaWxlIChlaXRoZXIgZnJvbSB0aGUgcGVyc2lzdGVuY2UKLSAqIGNvbmZpZ3VyYXRpb24gb3IgZnJvbSB0aGUgTWFwcGluZ3MgRGVzY3JpcHRvcikuCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhRGV0YWlsc1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhRGV0YWlsc1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm92aWRlc0RldGFpbHMoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRSkgfHwKLQkJcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzFfUkVTT1VSQ0VfVFlQRSk7Ci0JfQotCQotCXB1YmxpYyBKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4gYnVpbGREZXRhaWxzUGFnZSgKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZDRmMGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlLkVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbnRpdHlVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMl8wVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVhtbFVpRmFjdG9yeSBidWlsZE9ybVhtbFVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVhtbDJfMFVpRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMl8wX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5pbnN0YW5jZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChPcm1JZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8T3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChPcm1FbnRpdHlVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MTAxZWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfMFVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkJhc2VFY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzFfMUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nMV8xQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qcGEyLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwyXzBVaUZhY3RvcnkgCi0JZXh0ZW5kcyBCYXNlRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkKLQlpbXBsZW1lbnRzIE9ybVhtbFVpRmFjdG9yeTJfMAotewotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW50aXR5Q29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBvcm0gYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1CYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1WZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMWU1Y2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLkVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZTxPcm1FY2xpcHNlTGlua0NhY2hpbmc+Ci17Ci0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbmV3IE9ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUodGhpcywgcGFyZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyZWQzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm0uT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzFfMUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuRW1iZWRkZWRJZE1hcHBpbmcyXzBNYXBwZWRCeVJlbGF0aW9uc2hpcFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIE9ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcxXzFDb21wb3NpdGUKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJCi0JCW5ldyBFbWJlZGRlZElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDQ2MTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RPcm1FY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkVudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkdlbmVyYXRpb24yXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5RdWVyaWVzMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFbnRpdHkyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0b3JzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdG9yQ29udGFpbmVyPiBnZW5lcmF0b3JDb250YWluZXJIb2xkZXIpIHsKLQkJbmV3IEdlbmVyYXRpb24yXzBDb21wb3NpdGUodGhpcywgZ2VuZXJhdG9yQ29udGFpbmVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoaW5nU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWNsaXBzZUxpbmtDYWNoaW5nPiBjYWNoaW5nSG9sZGVyKSB7Ci0JCW5ldyBPcm1FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUodGhpcywgY2FjaGluZ0hvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUXVlcmllc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5Q29udGFpbmVyPiBxdWVyeUNvbnRhaW5lckhvbGRlcikgewotCQluZXcgUXVlcmllczJfMENvbXBvc2l0ZSh0aGlzLCBxdWVyeUNvbnRhaW5lckhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmMGEzMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMV8xQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5JZE1hcHBpbmcyXzBNYXBwZWRCeVJlbGF0aW9uc2hpcFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5JZE1hcHBpbmdHZW5lcmF0aW9uMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcxXzFDb21wb3NpdGUKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewkJCi0JCW5ldyBJZE1hcHBpbmcyXzBNYXBwZWRCeVJlbGF0aW9uc2hpcFBhbmUodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkTXV0YWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhdGlvbkNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBJZE1hcHBpbmdHZW5lcmF0aW9uMl8wQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyZGQ5My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5DYXNjYWRlUGFuZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9yZGVyaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlIAotCWV4dGVuZHMgRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxPcm1NYW55VG9NYW55TWFwcGluZz4KLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT3JkZXJpbmdDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JkZXJpbmcyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMTQwYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkFic3RyYWN0TWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8T3JtTWFueVRvT25lTWFwcGluZywgT3JtTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wPgotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvT25lU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1NYW55VG9PbmVNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rSm9pbkZldGNoPiBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybU1hbnlUb09uZU1hcHBpbmcsIEVjbGlwc2VMaW5rSm9pbkZldGNoPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMCkgdGhpcy5zdWJqZWN0KS5nZXRKb2luRmV0Y2goKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4NDgzZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkFic3RyYWN0T3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGU8VCBleHRlbmRzIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyA+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTxUPgotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hpbmdTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1FY2xpcHNlTGlua0NhY2hpbmc+IGNhY2hpbmdIb2xkZXIpIHsKLQkJbmV3IE9ybUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZSh0aGlzLCBjYWNoaW5nSG9sZGVyLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTE3M2FmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT3JkZXJpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxPcm1PbmVUb01hbnlNYXBwaW5nPgotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlUGFuZTJfMCh0aGlzLCB0aGlzLmJ1aWxkQ2FzY2FkZUhvbGRlcigpLCB0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcmRlcmluZ0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcmRlcmluZzJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T25lVG9NYW55TWFwcGluZywgQWNjZXNzSG9sZGVyPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9ycGhhblJlbW92YWJsZTJfMD4gYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybU9uZVRvTWFueU1hcHBpbmcsIE9ycGhhblJlbW92YWJsZTJfMD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ycGhhblJlbW92YWJsZTJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldE9ycGhhblJlbW92YWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNzk5ZmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT25lVG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxPcm1PbmVUb09uZU1hcHBpbmcsIE9ybU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wPgotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9uZVRvT25lU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKHRoaXMsIGJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGUodGhpcywgYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZSh0aGlzLCBidWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybU9uZVRvT25lTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0pvaW5GZXRjaD4gYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1PbmVUb09uZU1hcHBpbmcsIEVjbGlwc2VMaW5rSm9pbkZldGNoPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPiBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1PbmVUb09uZU1hcHBpbmcsIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldFByaXZhdGVPd25lZCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9ycGhhblJlbW92YWJsZTJfMD4gYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybU9uZVRvT25lTWFwcGluZywgT3JwaGFuUmVtb3ZhYmxlMl8wPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ycGhhblJlbW92YWJsZTJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldE9ycGhhblJlbW92YWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWEzMzBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmcuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmNhY2hpbmcuUGVyc2lzdGVuY2VYbWxDYWNoaW5nMl8wVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uMl8wVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmxvZ2dpbmcuUGVyc2lzdGVuY2VYbWxMb2dnaW5nMl8wVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLm9wdGlvbnMuUGVyc2lzdGVuY2VYbWxPcHRpb25zMl8wVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5IGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeQotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHBlcnNpc3RlbmNlIHVuaXQgdGFicyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiPEN1c3RvbWl6YXRpb24+IGJ1aWxkQ3VzdG9taXphdGlvblRhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+IGN1c3RvbWl6YXRpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ3VzdG9taXphdGlvbkhvbGRlcihzdWJqZWN0SG9sZGVyKTsKLQotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvbjJfMFRhYihjdXN0b21pemF0aW9uSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWI8Q2FjaGluZz4gYnVpbGRDYWNoaW5nVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gY2FjaGluZ0hvbGRlciA9IHRoaXMuYnVpbGRDYWNoaW5nSG9sZGVyKHN1YmplY3RIb2xkZXIpOwotCi0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nMl8wVGFiKGNhY2hpbmdIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYjw/IGV4dGVuZHMgTG9nZ2luZzJfMD4gYnVpbGRMb2dnaW5nVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8TG9nZ2luZzJfMD4gbG9nZ2luZzJfMEhvbGRlciA9IHRoaXMuYnVpbGRMb2dnaW5nMl8wSG9sZGVyKHN1YmplY3RIb2xkZXIpOwotCi0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nMl8wVGFiKGxvZ2dpbmcyXzBIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWI8T3B0aW9uczJfMD4gYnVpbGRPcHRpb25zVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9wdGlvbnMyXzA+IG9wdGlvbnMyXzBIb2xkZXIgPSB0aGlzLmJ1aWxkT3B0aW9uczJfMEhvbGRlcihzdWJqZWN0SG9sZGVyKTsKLQotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sT3B0aW9uczJfMFRhYihvcHRpb25zMl8wSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmcyXzA+IGJ1aWxkTG9nZ2luZzJfMEhvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgTG9nZ2luZzJfMD4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTG9nZ2luZzJfMCB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0KLQkJCQlyZXR1cm4gKExvZ2dpbmcyXzApIHZhbHVlLmdldExvZ2dpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zMl8wPiBidWlsZE9wdGlvbnMyXzBIb2xkZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdCwgT3B0aW9uczJfMD4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3B0aW9uczJfMCB0cmFuc2Zvcm1fKFBlcnNpc3RlbmNlVW5pdCB2YWx1ZSkgewotCi0JCQkJcmV0dXJuIChPcHRpb25zMl8wKSAoKFBlcnNpc3RlbmNlVW5pdDJfMCl2YWx1ZSkuZ2V0T3B0aW9ucygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTFiZDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uIGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5IGJ1aWxkUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMl8wX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlRGVmYXVsdHMyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZURlZmF1bHRzMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NjgxZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlRGVmYXVsdHMyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZy5EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkRlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgQ2FjaGVEZWZhdWx0czJfMENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVEZWZhdWx0czJfMENvbXBvc2l0ZSBleHRlbmRzIENhY2hlRGVmYXVsdHNDb21wb3NpdGU8Q2FjaGluZz4KLXsKLQlwdWJsaWMgQ2FjaGVEZWZhdWx0czJfMENvbXBvc2l0ZShQYW5lPENhY2hpbmc+IHN1YmplY3RIb2xkZXIsCi0gICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhY2hlRGVmYXVsdHNDb21wb3NpdGVzKHBhcmVudCk7Ci0JCXRoaXMuaW5zdGFsbFBhbmVFbmFibGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hlRGVmYXVsdHNDb21wb3NpdGVzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBEZWZhdWx0IENhY2hlIFR5cGUKLQkJbmV3IERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUodGhpcywgcGFyZW50KTsKLQotCQkvLyBEZWZhdWx0IENhY2hlIFNpemUKLQkJbmV3IERlZmF1bHRDYWNoZVNpemVDb21wb3NpdGU8Q2FjaGluZz4odGhpcywgcGFyZW50KTsKLQotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZUVuYWJsZXIoKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcih0aGlzLmJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSwgdGhpcyk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8U2hhcmVkQ2FjaGVNb2RlLCBCb29sZWFuPih0aGlzLmJ1aWxkU2hhcmVkQ2FjaGVNb2RlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFNoYXJlZENhY2hlTW9kZSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZSAhPSBTaGFyZWRDYWNoZU1vZGUuTk9ORTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTaGFyZWRDYWNoZU1vZGU+IGJ1aWxkU2hhcmVkQ2FjaGVNb2RlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQyXzAsIFNoYXJlZENhY2hlTW9kZT4oCi0JCQkJCQkJCXRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXQyXzBIb2xkZXIoKSwgCi0JCQkJCQkJCVBlcnNpc3RlbmNlVW5pdDJfMC5TUEVDSUZJRURfU0hBUkVEX0NBQ0hFX01PREVfUFJPUEVSVFksIAotCQkJCQkJCQlQZXJzaXN0ZW5jZVVuaXQyXzAuREVGQVVMVF9TSEFSRURfQ0FDSEVfTU9ERV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2hhcmVkQ2FjaGVNb2RlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2hhcmVkQ2FjaGVNb2RlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0Ml8wPiBidWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgUGVyc2lzdGVuY2VVbml0Ml8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0Ml8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoUGVyc2lzdGVuY2VVbml0Ml8wKSB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGRjNWJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5vcHRpb25zLlNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU8Q2FjaGluZz4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKAotCQkJUGFuZTxDYWNoaW5nPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU2VjdGlvbiBzZWN0aW9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBTV1QuRkxBVCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTik7Ci0JCXNlY3Rpb24uc2V0VGV4dChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NlY3Rpb25UaXRsZSk7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zZWN0aW9uRGVzY3JpcHRpb24pOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZSk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29tcG9zaXRlLmdldFBhcmVudCgpKTsKLQotCQkvLyBTaGFyZWRDYWNoZU1vZGUKLQkJbmV3IFNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0Ml8wSG9sZGVyKCksIGNvbXBvc2l0ZSk7Ci0JCS8vIERlZmF1bHRzCi0JCW5ldyBDYWNoZURlZmF1bHRzMl8wQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCS8vIEZsdXNoIENsZWFyIENhY2hlCi0JCW5ldyBGbHVzaENsZWFyQ2FjaGUyXzBDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQyXzA+IGJ1aWxkUGVyc2lzdGVuY2VVbml0Ml8wSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBQZXJzaXN0ZW5jZVVuaXQyXzA+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQyXzAgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIChQZXJzaXN0ZW5jZVVuaXQyXzApIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9GbHVzaENsZWFyQ2FjaGUyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9GbHVzaENsZWFyQ2FjaGUyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA4NDE0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2NhY2hpbmcvRmx1c2hDbGVhckNhY2hlMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlNoYXJlZENhY2hlTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZy5GbHVzaENsZWFyQ2FjaGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgRmx1c2hDbGVhckNhY2hlMl8wQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBGbHVzaENsZWFyQ2FjaGUyXzBDb21wb3NpdGUgZXh0ZW5kcyBGbHVzaENsZWFyQ2FjaGVDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZsdXNoQ2xlYXJDYWNoZTJfMENvbXBvc2l0ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRmx1c2hDbGVhckNhY2hlMl8wQ29tcG9zaXRlKAotCQkJCVBhbmU8PyBleHRlbmRzIENhY2hpbmc+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5pbml0aWFsaXplTGF5b3V0KHBhcmVudCk7Ci0KLQkJdGhpcy5pbnN0YWxsUGFuZUVuYWJsZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKCkgewotCQluZXcgUGFuZUVuYWJsZXIodGhpcy5idWlsZFBhbmVFbmFibGVySG9sZGVyKCksIHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFNoYXJlZENhY2hlTW9kZSwgQm9vbGVhbj4odGhpcy5idWlsZFNoYXJlZENhY2hlTW9kZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShTaGFyZWRDYWNoZU1vZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUgIT0gU2hhcmVkQ2FjaGVNb2RlLk5PTkU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U2hhcmVkQ2FjaGVNb2RlPiBidWlsZFNoYXJlZENhY2hlTW9kZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0Ml8wLCBTaGFyZWRDYWNoZU1vZGU+KAotCQkJCQkJCQl0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0Ml8wSG9sZGVyKCksIAotCQkJCQkJCQlQZXJzaXN0ZW5jZVVuaXQyXzAuU1BFQ0lGSUVEX1NIQVJFRF9DQUNIRV9NT0RFX1BST1BFUlRZLCAKLQkJCQkJCQkJUGVyc2lzdGVuY2VVbml0Ml8wLkRFRkFVTFRfU0hBUkVEX0NBQ0hFX01PREVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNoYXJlZENhY2hlTW9kZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNoYXJlZENhY2hlTW9kZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdDJfMD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXQyXzBIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIFBlcnNpc3RlbmNlVW5pdDJfMD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdDJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdDJfMCkgdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmcyXzBUYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmcyXzBUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQyNDQ3Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2NhY2hpbmcvUGVyc2lzdGVuY2VYbWxDYWNoaW5nMl8wVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBQZXJzaXN0ZW5jZVhtbENhY2hpbmcyXzBUYWIKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sQ2FjaGluZzJfMFRhYiBleHRlbmRzIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYjxDYWNoaW5nPgotewotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbENhY2hpbmcyXzBUYWIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCW5ldyBFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMzlmNjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VjbGlwc2VMaW5rQ3VzdG9taXphdGlvbjJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5FY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbjJfMENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uMl8wQ29tcG9zaXRlIGV4dGVuZHMgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uQ29tcG9zaXRlPEN1c3RvbWl6YXRpb24+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbjJfMENvbXBvc2l0ZSgKLQkJUGFuZTxDdXN0b21pemF0aW9uPiBzdWJqZWN0SG9sZGVyLCAKLQkJQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkRW50aXR5TGlzdENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uMl8wVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uMl8wVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjgyZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1BlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvbjJfMFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uMl8wVGFiCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb24yXzBUYWIgZXh0ZW5kcyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWI8Q3VzdG9taXphdGlvbj4KLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uMl8wVGFiKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbj4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24yXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvQ29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0Nvbm5lY3Rpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ2NjY4Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvQ29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBDb25uZWN0aW9uQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxMb2dnaW5nMl8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29ubmVjdGlvbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBMb2dnaW5nMl8wPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Nvbm5lY3Rpb25MYWJlbCwKLQkJCXRoaXMuYnVpbGRDb25uZWN0aW9uSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkQ29ubmVjdGlvblN0cmluZ0hvbGRlcigpLAotCQkJbnVsbAotLy8JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0xPR0dJTkdfQ09OTkVDVElPTgkvLyBUT0RPCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDb25uZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nMl8wLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIExvZ2dpbmcyXzAuQ09OTkVDVElPTl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbm5lY3Rpb24oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRDb25uZWN0aW9uKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29ubmVjdGlvblN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KHRoaXMuYnVpbGREZWZhdWx0Q29ubmVjdGlvbkhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Nvbm5lY3Rpb25MYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Nvbm5lY3Rpb25MYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0Q29ubmVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZzJfMCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlMb2dnaW5nMl8wLkNPTk5FQ1RJT05fUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRDb25uZWN0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0Q29ubmVjdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvbG9nZ2luZy9FY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YjAzNGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZ0xldmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8TG9nZ2luZzJfMD4KLXsKLQlwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZSgKLQkJCQkJUGFuZTxMb2dnaW5nMl8wPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJdGhpcy5wcm9wZXJ0eSA9IExvZ2dpbmcyXzAuU1FMX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFk7Ci0JCW5ldyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKHRoaXMsIHBhcmVudCk7Ci0JCQotCQl0aGlzLnByb3BlcnR5ID0gTG9nZ2luZzJfMC5UUkFOU0FDVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZOwotCQluZXcgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlcih0aGlzLCBwYXJlbnQpOwotCQkKLQkJdGhpcy5wcm9wZXJ0eSA9IExvZ2dpbmcyXzAuRVZFTlRfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWTsKLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50KTsKLQkJCi0JCXRoaXMucHJvcGVydHkgPSBMb2dnaW5nMl8wLkNPTk5FQ1RJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWTsKLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50KTsKLQkJCi0JCXRoaXMucHJvcGVydHkgPSBMb2dnaW5nMl8wLlFVRVJZX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFk7Ci0JCW5ldyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKHRoaXMsIHBhcmVudCk7Ci0JCQotCQl0aGlzLnByb3BlcnR5ID0gTG9nZ2luZzJfMC5DQUNIRV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZOwotCQluZXcgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlcih0aGlzLCBwYXJlbnQpOwotCQkKLQkJdGhpcy5wcm9wZXJ0eSA9IExvZ2dpbmcyXzAuUFJPUEFHQVRJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWTsKLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50KTsKLQkJCi0JCXRoaXMucHJvcGVydHkgPSBMb2dnaW5nMl8wLlNFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWTsKLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50KTsKLQkJCi0JCXRoaXMucHJvcGVydHkgPSBMb2dnaW5nMl8wLkVKQl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZOwotCQluZXcgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlcih0aGlzLCBwYXJlbnQpOwotCQkKLQkJdGhpcy5wcm9wZXJ0eSA9IExvZ2dpbmcyXzAuRE1TX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFk7Ci0JCW5ldyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKHRoaXMsIHBhcmVudCk7Ci0JCQotCQl0aGlzLnByb3BlcnR5ID0gTG9nZ2luZzJfMC5FSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWTsKLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50KTsKLQkJCi0JCXRoaXMucHJvcGVydHkgPSBMb2dnaW5nMl8wLk1FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZOwotCQluZXcgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlcih0aGlzLCBwYXJlbnQpOwotCi0JCXRoaXMucHJvcGVydHkgPSBMb2dnaW5nMl8wLldFQVZFUl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZOwotCQluZXcgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlcih0aGlzLCBwYXJlbnQpOwotCQkKLQkJdGhpcy5wcm9wZXJ0eSA9IExvZ2dpbmcyXzAuUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZOwotCQluZXcgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlcih0aGlzLCBwYXJlbnQpOwotCQkKLQkJdGhpcy5wcm9wZXJ0eSA9IExvZ2dpbmcyXzAuU0VSVkVSX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFk7Ci0JCW5ldyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKHRoaXMsIHBhcmVudCk7Ci0JfQotCQotCi0KLQlwcml2YXRlIGNsYXNzIENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIgZXh0ZW5kcyBQYW5lPExvZ2dpbmcyXzA+Ci0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QUk9QRVJUWSA9IExvZ2dpbmcyXzAuQ0FURUdPUklFU19ERUZBVUxUX0xPR0dJTkdfUFJPUEVSVFk7Ci0JCWZpbmFsIHByaXZhdGUgU3RyaW5nIGNhdGVnb3J5OwotCQkKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGU8L2NvZGU+LgotCQkgKiAKLQkJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCQkgKiBAcGFyYW0gcGFyZW50Ci0JCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkJICovCi0JCXB1YmxpYyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBMb2dnaW5nMl8wPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50Ci0JCQkJCSkgewotCQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCQkJCi0JCQl0aGlzLmNhdGVnb3J5ID0gRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZS50aGlzLnByb3BlcnR5OwotCQl9Ci0KLQkJcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPExvZ2dpbmcyXzAsIExvZ2dpbmdMZXZlbD4gYWRkTG9nZ2luZ0xldmVsQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPExvZ2dpbmcyXzAsIExvZ2dpbmdMZXZlbD4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChERUZBVUxUX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5TUUxfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCQkJCXByb3BlcnR5TmFtZXMuYWRkKExvZ2dpbmcyXzAuVFJBTlNBQ1RJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCQkJCXByb3BlcnR5TmFtZXMuYWRkKExvZ2dpbmcyXzAuRVZFTlRfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCQkJCXByb3BlcnR5TmFtZXMuYWRkKExvZ2dpbmcyXzAuQ09OTkVDVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5RVUVSWV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5DQUNIRV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5QUk9QQUdBVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5TRVFVRU5DSU5HX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChMb2dnaW5nMl8wLkVKQl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5ETVNfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCQkJCXByb3BlcnR5TmFtZXMuYWRkKExvZ2dpbmcyXzAuRUpCX09SX01FVEFEQVRBX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChMb2dnaW5nMl8wLk1FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5XRUFWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCQkJCXByb3BlcnR5TmFtZXMuYWRkKExvZ2dpbmcyXzAuUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMb2dnaW5nTGV2ZWxbXSBnZXRDaG9pY2VzKCkgewotCQkJCQlyZXR1cm4gTG9nZ2luZ0xldmVsLnZhbHVlcygpOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTG9nZ2luZ0xldmVsIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldENhdGVnb3JpZXNEZWZhdWx0TGV2ZWwoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoTG9nZ2luZ0xldmVsIHZhbHVlKSB7Ci0JCQkJCXJldHVybiB0aGlzLmJ1aWxkRGlzcGxheVN0cmluZyhFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3MsIEVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGUuY2xhc3MsIHZhbHVlKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTG9nZ2luZ0xldmVsIGdldFZhbHVlKCkgewotCQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0TGV2ZWwoY2F0ZWdvcnkpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKExvZ2dpbmdMZXZlbCB2YWx1ZSkgewotCQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRMZXZlbChjYXRlZ29yeSwgdmFsdWUpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQkJCWlmKCBwcm9wZXJ0eU5hbWUgIT0gY2F0ZWdvcnkgJiYgcHJvcGVydHlOYW1lICE9IERFRkFVTFRfUFJPUEVSVFkpIHJldHVybjsKLQkJCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCQkJcGFyZW50LAotCQkJCQl0aGlzLmJ1aWxkTGFiZWxTdHJpbmcoKSwKLQkJCQkJdGhpcy5hZGRMb2dnaW5nTGV2ZWxDb21ibyhwYXJlbnQpLAotCQkJCQludWxsCS8vIFRPRE8KLQkJCSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgU3RyaW5nIGJ1aWxkTGFiZWxTdHJpbmcoKSB7Ci0KLQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJc2IuYXBwZW5kKCJQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfIik7CSAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQoRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZS50aGlzLnByb3BlcnR5KTsKLQkJCXNiLmFwcGVuZCgiTGFiZWwiKTsJIC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJcmV0dXJuIChTdHJpbmcpIFJlZmxlY3Rpb25Ub29scy5nZXRTdGF0aWNGaWVsZFZhbHVlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgc2IudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rTG9nZ2luZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rTG9nZ2luZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWYyMWIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvbG9nZ2luZy9FY2xpcHNlTGlua0xvZ2dpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmcuRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtMb2dnaW5nMl8wQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0xvZ2dpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGU8TG9nZ2luZzJfMD4KLXsKLQotCXB1YmxpYyBFY2xpcHNlTGlua0xvZ2dpbmcyXzBDb21wb3NpdGUoCi0JCQkJCQkJCQlQYW5lPExvZ2dpbmcyXzA+IHN1YmplY3RIb2xkZXIsIAotCQkJCQkJCQkJQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5pbml0aWFsaXplTGF5b3V0KHBhcmVudCk7Ci0KLQkJQ29tcG9zaXRlIGNhdGVnb3J5TG9nZ2luZ1NlY3Rpb24gPSB0aGlzLmFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCXRoaXMuYWRkU3ViUGFuZShwYXJlbnQsIDAsIDE2KSwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfY2F0ZWdvcnlMb2dnaW5nTGV2ZWxTZWN0aW9uVGl0bGUsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpCi0JCSk7Ci0KLQkJdGhpcy5hZGRDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZShjYXRlZ29yeUxvZ2dpbmdTZWN0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQluZXcgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxvZ1Byb3BlcnRpZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5sb2dQcm9wZXJ0aWVzQ29tcG9zaXRlKHBhcmVudCk7Ci0JCQotCQkvLyBDb25uZWN0aW9uOgotCQluZXcgQ29ubmVjdGlvbkNvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvbG9nZ2luZy9QZXJzaXN0ZW5jZVhtbExvZ2dpbmcyXzBUYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvbG9nZ2luZy9QZXJzaXN0ZW5jZVhtbExvZ2dpbmcyXzBUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2ZWM1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvUGVyc2lzdGVuY2VYbWxMb2dnaW5nMl8wVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmcuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFBlcnNpc3RlbmNlWG1sTG9nZ2luZzJfMFRhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxMb2dnaW5nMl8wVGFiIGV4dGVuZHMgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiPExvZ2dpbmcyXzA+Ci17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmcyXzBUYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmcyXzA+IHN1YmplY3RIb2xkZXIsIAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rTG9nZ2luZzJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ3NTM4NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvRWNsaXBzZUxpbmtPcHRpb25zMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnMuRWNsaXBzZUxpbmtPcHRpb25zQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBFY2xpcHNlTGlua09wdGlvbnMyXzBDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3B0aW9uczJfMENvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZTxPcHRpb25zMl8wPgotewotCXB1YmxpYyBFY2xpcHNlTGlua09wdGlvbnMyXzBDb21wb3NpdGUoCi0JCQlQYW5lPE9wdGlvbnMyXzA+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgaW5pdGlhbGl6ZU1pc2NlbGxhbmVvdXNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5pbml0aWFsaXplTWlzY2VsbGFuZW91c1BhbmUoY29udGFpbmVyKTsKLQotCQluZXcgTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJbmV3IFF1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQluZXcgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9Mb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL0xvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZWFhYWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL0xvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBMb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUgZXh0ZW5kcyBQYW5lPE9wdGlvbnMyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Mb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBMb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZSgKLQkJCQkJUGFuZTxPcHRpb25zMl8wPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRMb2NrVGltZW91dENvbWJvKGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRMb2NrVGltZW91dENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEludGVnZXJDb21ibzxPcHRpb25zMl8wPih0aGlzLCBjb250YWluZXIpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLkxvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlX2xvY2tUaW1lb3V0TGFiZWw7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJCQlyZXR1cm4gbnVsbDsJCS8vIFRPRE8KLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zMl8wLCBJbnRlZ2VyPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRMb2NrVGltZW91dCgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9uczJfMCwgSW50ZWdlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMyXzAuTE9DS19USU1FT1VUX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TG9ja1RpbWVvdXQoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCQkJdGhpcy5zdWJqZWN0LnNldExvY2tUaW1lb3V0KHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9QZXJzaXN0ZW5jZVhtbE9wdGlvbnMyXzBUYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9QZXJzaXN0ZW5jZVhtbE9wdGlvbnMyXzBUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2MzdiOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvUGVyc2lzdGVuY2VYbWxPcHRpb25zMl8wVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFBlcnNpc3RlbmNlWG1sT3B0aW9uczJfMFRhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxPcHRpb25zMl8wVGFiIGV4dGVuZHMgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiPE9wdGlvbnMyXzA+Ci17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnMyXzBUYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9wdGlvbnMyXzA+IHN1YmplY3RIb2xkZXIsIAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rT3B0aW9uczJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1F1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1F1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjRjNzEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9RdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFF1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zMl8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFF1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZSgKLQkJCQkJUGFuZTxPcHRpb25zMl8wPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuYWRkUXVlcnlUaW1lb3V0Q29tYm8oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFF1ZXJ5VGltZW91dENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEludGVnZXJDb21ibzxPcHRpb25zMl8wPih0aGlzLCBjb250YWluZXIpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLlF1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZV9xdWVyeVRpbWVvdXRMYWJlbDsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgewotCQkJCXJldHVybiBudWxsOwkJLy8gVE9ETwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMyXzAsIEludGVnZXI+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFF1ZXJ5VGltZW91dCgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9uczJfMCwgSW50ZWdlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMyXzAuUVVFUllfVElNRU9VVF9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFF1ZXJ5VGltZW91dCgpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJCQl0aGlzLnN1YmplY3Quc2V0UXVlcnlUaW1lb3V0KHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTM1MGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5KcHRFY2xpcHNlTGlua1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLQotLyoqCi0gKiAgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zMl8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmFsaWRhdGlvbkdyb3VwQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlKAotCQkJCQlQYW5lPE9wdGlvbnMyXzA+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBWYWxpZGF0aW9uTW9kZQotCQluZXcgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpLCBwYXJlbnQpOwotCi0JCS8vIFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QKLQkJdGhpcy5hZGRHcm91cFByZVBlcnNpc3RMaXN0UGFuZShwYXJlbnQpOwotCi0JCS8vIFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZQotCQl0aGlzLmFkZEdyb3VwUHJlVXBkYXRlTGlzdFBhbmUocGFyZW50KTsKLQotCQkvLyBWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUKLQkJdGhpcy5hZGRHcm91cFByZVJlbW92ZUxpc3RQYW5lKHBhcmVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZEdyb3VwUHJlUGVyc2lzdExpc3RQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUocGFyZW50LCAKLQkJCUpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9ncm91cFByZVBlcnNpc3RMYWJlbCwKLQkJCXRoaXMuYWRkUHJlUGVyc2lzdExpc3RQYW5lKHBhcmVudCksCi0JCQludWxsCS8vIFRPRE8gSGVscAotCQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxPcHRpb25zMl8wPiBhZGRQcmVQZXJzaXN0TGlzdFBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCS8vIExpc3QgcGFuZQotCQlBZGRSZW1vdmVMaXN0UGFuZTxPcHRpb25zMl8wPiBsaXN0UGFuZSA9IG5ldyBBZGRSZW1vdmVMaXN0UGFuZTxPcHRpb25zMl8wPigKLQkJCXRoaXMsCi0JCQlwYXJlbnQsCi0JCQl0aGlzLmJ1aWxkUHJlUGVyc2lzdEFkYXB0ZXIoKSwKLQkJCXRoaXMuYnVpbGRQcmVQZXJzaXN0TGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJdGhpcy5idWlsZExhYmVsUHJvdmlkZXIoKQotCQkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlKFRhYmxlIHRhYmxlKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZVRhYmxlKHRhYmxlKTsKLQotCQkJCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0YWJsZS5nZXRQYXJlbnQoKTsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSAgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDc1OwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGlzdFBhbmU7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUHJlUGVyc2lzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkUHJlUGVyc2lzdENsYXNzKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCgoU3RyaW5nKSBpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJlUGVyc2lzdExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8T3B0aW9uczJfMCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0c1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUHJlUGVyc2lzdENsYXNzKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlJVHlwZSB0eXBlID0gdGhpcy5jaG9vc2VUeXBlKCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk7Ci0JCQlpZiggISB0aGlzLmdldFN1YmplY3QoKS52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0RXhpc3RzKGNsYXNzTmFtZSkpIHsKLQkJCQkKLQkJCQlTdHJpbmcgY2xhc3NSZWYgPSB0aGlzLmdldFN1YmplY3QoKS5hZGRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KGNsYXNzTmFtZSk7Ci0JCQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoY2xhc3NSZWYpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzICoqKioqKioqKioKLQkKLQlwcml2YXRlIHZvaWQgYWRkR3JvdXBQcmVVcGRhdGVMaXN0UGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKHBhcmVudCwgCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGVfZ3JvdXBQcmVVcGRhdGVMYWJlbCwKLQkJCXRoaXMuYWRkUHJlVXBkYXRlTGlzdFBhbmUocGFyZW50KSwKLQkJCW51bGwJLy8gVE9ETyBIZWxwCi0JCQkpOwotCX0KLQkKLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lPE9wdGlvbnMyXzA+IGFkZFByZVVwZGF0ZUxpc3RQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBMaXN0IHBhbmUKLQkJQWRkUmVtb3ZlTGlzdFBhbmU8T3B0aW9uczJfMD4gbGlzdFBhbmUgPSBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8T3B0aW9uczJfMD4oCi0JCQl0aGlzLAotCQkJcGFyZW50LAotCQkJdGhpcy5idWlsZFByZVVwZGF0ZUFkYXB0ZXIoKSwKLQkJCXRoaXMuYnVpbGRQcmVVcGRhdGVMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVGFibGUoVGFibGUgdGFibGUpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplVGFibGUodGFibGUpOwotCi0JCQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRhYmxlLmdldFBhcmVudCgpOwotCQkJCUdyaWREYXRhIGdyaWREYXRhICA9IChHcmlkRGF0YSkgY29udGFpbmVyLmdldExheW91dERhdGEoKTsKLQkJCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNzU7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsaXN0UGFuZTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRQcmVVcGRhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWFkZFByZVVwZGF0ZUNsYXNzKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKChTdHJpbmcpIGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQcmVVcGRhdGVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9wdGlvbnMyXzAsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByZVVwZGF0ZUNsYXNzKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlJVHlwZSB0eXBlID0gdGhpcy5jaG9vc2VUeXBlKCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk7Ci0JCQlpZiggISB0aGlzLmdldFN1YmplY3QoKS52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVFeGlzdHMoY2xhc3NOYW1lKSkgewotCQkJCQotCQkJCVN0cmluZyBjbGFzc1JlZiA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZShjbGFzc05hbWUpOwotCQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGNsYXNzUmVmKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZEdyb3VwUHJlUmVtb3ZlTGlzdFBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZShwYXJlbnQsIAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLlZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlUmVtb3ZlTGFiZWwsCi0JCQl0aGlzLmFkZFByZVJlbW92ZUxpc3RQYW5lKHBhcmVudCksCi0JCQludWxsCS8vIFRPRE8gSGVscAotCQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxPcHRpb25zMl8wPiBhZGRQcmVSZW1vdmVMaXN0UGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCUFkZFJlbW92ZUxpc3RQYW5lPE9wdGlvbnMyXzA+IGxpc3RQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPE9wdGlvbnMyXzA+KAotCQkJdGhpcywKLQkJCXBhcmVudCwKLQkJCXRoaXMuYnVpbGRQcmVSZW1vdmVBZGFwdGVyKCksCi0JCQl0aGlzLmJ1aWxkUHJlUmVtb3ZlTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJdGhpcy5idWlsZExhYmVsUHJvdmlkZXIoKQotCQkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlKFRhYmxlIHRhYmxlKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZVRhYmxlKHRhYmxlKTsKLQotCQkJCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0YWJsZS5nZXRQYXJlbnQoKTsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSAgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDc1OwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGlzdFBhbmU7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUHJlUmVtb3ZlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRQcmVSZW1vdmVDbGFzcyhsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSgoU3RyaW5nKSBpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJlUmVtb3ZlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxPcHRpb25zMl8wLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQcmVSZW1vdmVDbGFzcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJSVR5cGUgdHlwZSA9IHRoaXMuY2hvb3NlVHlwZSgpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnJCcpOwotCQkJaWYoICEgdGhpcy5nZXRTdWJqZWN0KCkudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlRXhpc3RzKGNsYXNzTmFtZSkpIHsKLQkJCQkKLQkJCQlTdHJpbmcgY2xhc3NSZWYgPSB0aGlzLmdldFN1YmplY3QoKS5hZGRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoY2xhc3NOYW1lKTsKLQkJCQlsaXN0U2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShjbGFzc1JlZik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbGVtZW50OwotCi0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9ub05hbWU7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFByb21wdHMgdGhlIHVzZXIgdGhlIE9wZW4gVHlwZSBkaWFsb2cuCi0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciB0aGUgc2VsZWN0ZWQgdHlwZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdXNlcgotCSAqIGNhbmNlbGVkIHRoZSBkaWFsb2cKLQkgKi8KLQlwcml2YXRlIElUeXBlIGNob29zZVR5cGUoKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IHRoaXMuZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IGphdmFQcm9qZWN0IH07Ci0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJU2VsZWN0aW9uRGlhbG9nIHR5cGVTZWxlY3Rpb25EaWFsb2c7Ci0KLQkJdHJ5IHsKLQkJCXR5cGVTZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZygKLQkJCQlnZXRTaGVsbCgpLAotCQkJCXNlcnZpY2UsCi0JCQkJc2NvcGUsCi0JCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsCi0JCQkJZmFsc2UsCi0JCQkJIiIKLQkJCSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRFY2xpcHNlTGlua1VpUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRUaXRsZShKcHRVaU1lc3NhZ2VzLkNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nVGl0bGUpOwotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UoSnB0VWlNZXNzYWdlcy5DbGFzc0Nob29zZXJQYW5lX2RpYWxvZ01lc3NhZ2UpOwotCi0JCWlmICh0eXBlU2VsZWN0aW9uRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiAoSVR5cGUpIHR5cGVTZWxlY3Rpb25EaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0Ml8wPiBidWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zMl8wLCBQZXJzaXN0ZW5jZVVuaXQyXzA+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQyXzAgdHJhbnNmb3JtXyhPcHRpb25zMl8wIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIChQZXJzaXN0ZW5jZVVuaXQyXzApIHZhbHVlLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjU4NTVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlZhbGlkYXRpb25Nb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxQZXJzaXN0ZW5jZVVuaXQyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUoCi0JCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0Ml8wPiBzdWJqZWN0SG9sZGVyLAotCQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJcGFyZW50LAotCQkJCUpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZV92YWxpZGF0aW9uTW9kZUxhYmVsLAotCQkJCXRoaXMuYWRkVmFsaWRhdGlvbk1vZGVDb21ibyhwYXJlbnQpLAotCQkJCW51bGwJCQkvLyBUT0RPCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPFBlcnNpc3RlbmNlVW5pdDJfMCwgVmFsaWRhdGlvbk1vZGU+IGFkZFZhbGlkYXRpb25Nb2RlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPFBlcnNpc3RlbmNlVW5pdDJfMCwgVmFsaWRhdGlvbk1vZGU+KHRoaXMsIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBwYXJlbnQpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVuY2VVbml0Ml8wLlNQRUNJRklFRF9WQUxJREFUSU9OX01PREVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBWYWxpZGF0aW9uTW9kZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIFZhbGlkYXRpb25Nb2RlLnZhbHVlcygpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVmFsaWRhdGlvbk1vZGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0VmFsaWRhdGlvbk1vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoVmFsaWRhdGlvbk1vZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLmNsYXNzLCBWYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZS50aGlzLCB2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFZhbGlkYXRpb25Nb2RlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFZhbGlkYXRpb25Nb2RlIHZhbHVlKSB7Ci0JCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTVhNTBkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGRsZ2VuLndpemFyZHMuRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3JVaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5iYXNlLkJhc2VKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5uYXZpZ2F0b3IuSnBhTmF2aWdhdG9yUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWkgZXh0ZW5kcyBCYXNlSnBhUGxhdGZvcm1VaQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWkoCi0JCQkJCUpwYU5hdmlnYXRvclByb3ZpZGVyIG5hdmlnYXRvclByb3ZpZGVyLAotCQkJCQlKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgcGxhdGZvcm1VaVByb3ZpZGVyKSB7Ci0KLQkJc3VwZXIobmF2aWdhdG9yUHJvdmlkZXIsIHBsYXRmb3JtVWlQcm92aWRlcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBEREwgZ2VuZXJhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZURETChKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlFY2xpcHNlTGluazJfMERETEdlbmVyYXRvclVpLmdlbmVyYXRlKHByb2plY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY1NjNmYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybS5FY2xpcHNlTGlua05hdmlnYXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpRmFjdG9yeTsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeSBpbXBsZW1lbnRzIEpwYVBsYXRmb3JtVWlGYWN0b3J5Ci17Ci0KLQkvKioKLQkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaSgKLQkJCW5ldyBFY2xpcHNlTGlua05hdmlnYXRvclByb3ZpZGVyKCksCi0JCQlFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlQcm92aWRlci5pbnN0YW5jZSgpCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGFmNGMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMi5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDFfMlVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLmphdmEuRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1YbWxVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtWG1sMl8wVWlEZWZpbml0aW9uOwotCi0vKioKLSAqICBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlQcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGV0YWlscyBwcm92aWRlcnMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERldGFpbHNQcm92aWRlcnNUbyhMaXN0PEpwYURldGFpbHNQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHJlc291cmNlIHVpIGRlZmluaXRpb25zICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZVVpRGVmaW5pdGlvbnNUbyhMaXN0PFJlc291cmNlVWlEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8xL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8xVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8xL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8xVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZmRlNWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMS9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfMVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzEuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlLkVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbnRpdHlVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDJfMVVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVhtbDJfMVVpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1YbWwyXzFVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxVaUZhY3RvcnkgYnVpbGRPcm1YbWxVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzFVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXNVaShKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfMV9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMS9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfMVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMS9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfMVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWIxZWFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzEvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzFVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl8wVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwyXzFVaUZhY3RvcnkgCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09ybVhtbDJfMFVpRmFjdG9yeQotewotCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTRjNjNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LkVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLlRhcmdldENsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzFDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZTxPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGluazFfMU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWxlbWVudENvbGxlY3Rpb25TZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldENsYXNzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sbGVjdGlvblRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtKb2luRmV0Y2g+IGJ1aWxkSm9pbkZldGNoSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAsIEVjbGlwc2VMaW5rSm9pbkZldGNoPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8xL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzEvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTNlYmZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzEvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzEucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm0uRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wbGF0Zm9ybS5FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGxhdGZvcm0uRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaUZhY3RvcnkKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkKLXsKLQkvKioKLQkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpIGJ1aWxkSnBhUGxhdGZvcm1VaSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWkoCi0JCQluZXcgRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlcigpLAotCQkJRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuaW5zdGFuY2UoKQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzEvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzEvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ2NDZhMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8xL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzEucGxhdGZvcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzFVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzIuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5qYXZhLkVjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzBVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMS5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDJfMVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybVhtbDJfMFVpRGVmaW5pdGlvbjsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRldGFpbHMgcHJvdmlkZXJzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXRhaWxzUHJvdmlkZXJzVG8oTGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VVaURlZmluaXRpb25zVG8oTGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtWG1sMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMV8yVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDJfMVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL0VjbGlwc2VMaW5rTWFwcGluZ0ZpbGVXaXphcmQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTU4MGZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5vcm0uTWFwcGluZ0ZpbGVOZXdGaWxlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5vcm0uTWFwcGluZ0ZpbGVPcHRpb25zV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5vcm0uTWFwcGluZ0ZpbGVXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgaXMgcmVmZXJlbmNlZCBpbiB0aGUgcGx1Z2luLnhtbCBhcyBhbiBvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIGV4dGVuc2lvbgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZAotCQlleHRlbmRzIE1hcHBpbmdGaWxlV2l6YXJkIHsKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZCgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVXaXphcmQoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQkJc2V0V2luZG93VGl0bGUoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkX3RpdGxlKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE1hcHBpbmdGaWxlTmV3RmlsZVdpemFyZFBhZ2UgYnVpbGRNYXBwaW5nRmlsZU5ld0ZpbGVXaXphcmRQYWdlKCkgewotCQlyZXR1cm4gbmV3IE1hcHBpbmdGaWxlTmV3RmlsZVdpemFyZFBhZ2UoCi0JCQkJIlBhZ2VfMSIsIHRoaXMubXVuZ2VkU2VsZWN0aW9uLCBnZXREYXRhTW9kZWwoKSwKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX25ld0ZpbGVfdGl0bGUsIAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5NYXBwaW5nRmlsZVdpemFyZFBhZ2VfbmV3RmlsZV9kZXNjKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE1hcHBpbmdGaWxlT3B0aW9uc1dpemFyZFBhZ2UgYnVpbGRNYXBwaW5nRmlsZU9wdGlvbnNXaXphcmRQYWdlKCkgewotCQlyZXR1cm4gbmV3IE1hcHBpbmdGaWxlT3B0aW9uc1dpemFyZFBhZ2UoCi0JCQkJIlBhZ2VfMiIsIGdldERhdGFNb2RlbCgpLAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5NYXBwaW5nRmlsZVdpemFyZFBhZ2Vfb3B0aW9uc190aXRsZSwgCi0JCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9vcHRpb25zX2Rlc2MpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjI1NzQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5NmRkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbgotQGRvdAotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwotamF2YUNvbXBpbGVyLi4uYXJncy4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmQ1MDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5nZW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYxNWZmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBKYW4gMTUgMTE6MTI6MDcgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxZDUwYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6Mjg6NTQgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNTc3MmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZ2VuCi1CdW5kbGUtVmVyc2lvbjogMS4zLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5kYjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7YnVuZGxlLXZlcnNpb249IjMuMi4wIiwKLSBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZztidW5kbGUtdmVyc2lvbj0iMi4xLjAiLAotIG9yZy5hcGFjaGUub3JvO2J1bmRsZS12ZXJzaW9uPSIyLjAuOCIsCi0gb3JnLmFwYWNoZS52ZWxvY2l0eTtidW5kbGUtdmVyc2lvbj0iMS41LjAiLAotIG9yZy5qZG9tO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjUuMCwzLjAuMCkiCi1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudGV4dDt2ZXJzaW9uPSI0LjAuMSIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmU4NzVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlcy8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwMzQ0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotICBDb250cmlidXRvcnM6Ci0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5nZW4iPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5nZW4iIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTM3YTI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVudGl0eSBHZW4KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3Byb3BlcnR5X2ZpbGVzL2pwdF9nZW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vcHJvcGVydHlfZmlsZXMvanB0X2dlbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjkwN2EyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vcHJvcGVydHlfZmlsZXMvanB0X2dlbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVBhY2thZ2VHZW5lcmF0b3JfdGFza05hbWU9R2VuZXJhdGUgRW50aXRpZXMKLUdlblNjb3BlX3Rhc2tOYW1lPUJ1aWxkIERhdGFiYXNlIE1vZGVsCi1FbnRpdHlHZW5lcmF0b3JfdGFza05hbWU9R2VuZXJhdGUgRW50aXR5OiB7MH0KLUVycm9yX0dlbmVyYXRpbmdfRW50aXRpZXMgPSBFcnJvciBHZW5lcmF0aW5nIEVudGl0aWVzCi0KLURlbGV0ZV9Gb2xkZXJfRXJyb3IgPSAiVGhlIGRpcmVjdG9yeSB7MH0gY291bGQgbm90IGJlIGRlbGV0ZWQuIgotRGVsZXRlX0ZpbGVfRXJyb3IgPSAiVGhlIGZpbGUgezB9IGNvdWxkIG5vdCBiZSBkZWxldGVkLiIKLUZpbGVfUmVhZF9Pbmx5X0Vycm9yPSAiVGhlIGZpbGUgezB9IGNvdWxkIG5vdCBiZSBtb2RpZmllZCBiZWNhdXNlIHdyaXRlIGFjY2VzcyBpcyBkZW5pZWQuXG5QbGVhc2UgbWFrZSBzdXJlIHRoYXQgdGhlIGZpbGUgaXMgbm90IG1hcmtlZCBhcyByZWFkb25seSBpbiB0aGUgZmlsZSBzeXN0ZW0uIgotCi1UZW1wbGF0ZXNfbm90Rm91bmQgPSBVbmFibGUgdG8gZmluZCBKUEEgZW50aXRpZXMgZ2VuZXJhdGlvbiB0ZW1wbGF0ZXMgaW4gcGx1Z2luClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9Bc3NvY2lhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9Bc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzVhNWE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvQXNzb2NpYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5TdHJpbmdVdGlsOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gT1JNIGFzc29jaWF0aW9uLgotICogVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBhc3NvY2lhdGlvbnM6Ci0gKiA8dWw+PGxpPnNpbXBsZSBhc3NvY2lhdGlvbjogQW4gYXNzb2NpYXRpb24gYmV0d2VlbiB0d28gZGF0YWJhc2UgdGFibGVzLgotICogVGhlIDxlbT5yZWZlcnJlcjwvY29kZT4gdGFibGUgaXMgdGhlIG9uZSBjb250YWluaW5nIHRoZSBmb3JlaWduIGtleQotICogLCB0aGUgPGVtPnJlZmVyZW5jZWQ8L2NvZGU+IHRhYmxlIGlzIHRoZSBvdGhlciBwYXJ0eS48YnI+Ci0gKiAKLSAqIDxsaT5tYW55IHRvIG1hbnkgYXNzb2NpYXRpb246IEFuIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIHRhYmxlcyBqb2luZWQgYnkgCi0gKiBhIDxlbT5qb2luIHRhYmxlPC9lbT4uCi0gKiBJbiB0aGUgZXhhbXBsZSBBVVRIT1IsIEJPT0ssIEFVVEhPUl9CT09LLCBUaGUgcmVmZXJyZXIgYW5kIHJlZmVyZW5jZWQgYXJlIAotICogQVVUSE9SIGFuZCAgQk9PSywgYW5kIHRoZSBqb2luIHRhYmxlIGlzIEFVVEhPUl9CT09LLgotICogPC91bD4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb24gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5ZX1RPX09ORSA9ICJtYW55LXRvLW9uZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOWV9UT19NQU5ZID0gIm1hbnktdG8tbWFueSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1RPX09ORSA9ICJvbmUtdG8tb25lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfVE9fTUFOWSA9ICJvbmUtdG8tbWFueSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklfREkgPSAiYmktZGkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PUk1BTF9ESSA9ICJub3JtYWwtZGkiOyAvL3JlZmVycmVyLT5yZWZlcmVuY2VkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BQT1NJVEVfREkgPSAib3Bwb3NpdGUtZGkiOyAvL3JlZmVyZW5jZWQtPnJlZmVycmVyCi0JCi0JcHJpdmF0ZSB0cmFuc2llbnQgT1JNR2VuQ3VzdG9taXplciBtQ3VzdG9taXplcjsKLQlwcml2YXRlIFN0cmluZyBtUmVmZXJyZXJUYWJsZU5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgbVJlZmVyZW5jZWRUYWJsZU5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgbUpvaW5UYWJsZU5hbWU7Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBtUmVmZXJyZXJDb2xOYW1lczsgLypTdHJpbmcgb2JqZWN0cyovCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVJlZmVyZW5jZWRDb2xOYW1lczsgLypTdHJpbmcgb2JqZWN0cyovCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVJlZmVycmVySm9pbkNvbE5hbWVzOyAvKlN0cmluZyBvYmplY3RzKi8KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBtUmVmZXJlbmNlZEpvaW5Db2xOYW1lczsgLypTdHJpbmcgb2JqZWN0cyovCi0KLQlwcml2YXRlIHRyYW5zaWVudCBMaXN0PE9STUdlbkNvbHVtbj4gbVJlZmVycmVyQ29sczsgLypPUk1HZW5Db2x1bW4gb2JqZWN0cyovCi0JcHJpdmF0ZSB0cmFuc2llbnQgTGlzdDxPUk1HZW5Db2x1bW4+IG1SZWZlcmVuY2VkQ29sczsgLypPUk1HZW5Db2x1bW4gb2JqZWN0cyovCi0JcHJpdmF0ZSB0cmFuc2llbnQgTGlzdDxPUk1HZW5Db2x1bW4+IG1SZWZlcnJlckpvaW5Db2xzOyAvKk9STUdlbkNvbHVtbiBvYmplY3RzKi8KLQlwcml2YXRlIHRyYW5zaWVudCBMaXN0PE9STUdlbkNvbHVtbj4gbVJlZmVyZW5jZWRKb2luQ29sczsgLypPUk1HZW5Db2x1bW4gb2JqZWN0cyovCi0JCi0JcHJpdmF0ZSBTdHJpbmcgbUNhcmRpbmFsaXR5OwotCXByaXZhdGUgU3RyaW5nIG1EaXJlY3Rpb25hbGl0eTsKLQlwcml2YXRlIGJ5dGUgbUZsYWdzID0gR0VORVJBVEVEOwotCQotCXByaXZhdGUgQXNzb2NpYXRpb25Sb2xlIG1SZWZlcnJlclJvbGU7Ci0JcHJpdmF0ZSBBc3NvY2lhdGlvblJvbGUgbVJlZmVyZW5jZWRSb2xlOwotCi0JcHJpdmF0ZSB0cmFuc2llbnQgRm9yZWlnbktleSBtRm9yZWlnbktleTsJCi0JCi0JLypjb25zdGFudHMgZm9yIG1GbGFncyovCi0JLyp3aGV0aGVyIHRoZSBhc3NvY2lhdGlvbiBzaG91bGQgYmUgZ2VuZXJhdGVkKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEdFTkVSQVRFRCA9IDEgPDwgMDsKLQkvKndoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIGN1c3RvbSAoaS5lIGlzIG5vdCBhdXRvIGNvbXB1dGVkIGZyb20gZm9yZWlnbiBrZXlzIHJlbGF0aW9uc2hpcHMpLiovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBDVVNUT00gPSAxIDw8IDE7Ci0JCi0JLyoqCi0JICogVGhlIHNpbXBsZSBhc3NvY2lhdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiBUaGUgMiB0YWJsZXMgYXJlIGpvaW5lZCB3aGVuIHRoZSB2YWx1ZXMgb2YgZWFjaCBjb2x1bW4gaW4KLQkgKiByZWZlcnJlckNvbE5hbWVzIG1hdGNoIGl0cyBjb3JyZXNwb25kaW5nIGNvbHVtbiBpbiByZWZlcmVuY2VkQ29sTmFtZXMuCi0JICogCi0JICogQHBhcmFtIHJlZmVycmVyVGFibGVOYW1lIFRoZSAiZm9yZWlnbiBrZXkiIHRhYmxlLgotCSAqIEBwYXJhbSByZWZlcnJlckNvbE5hbWVzIFRoZSBjb2x1bW4gbmFtZXMgaW4gdGhlIHJlZmVycmVyIHRhYmxlLgotCSAqIEBwYXJhbSByZWZlcmVuY2VkVGFibGVOYW1lIFRoZSAicHJpbWFyeSBrZXkiIHRhYmxlLgotCSAqIEBwYXJhbSByZWZlcmVuY2VkQ29sTmFtZXMgVGhlIGNvbHVtbiBuYW1lcyBpbiB0aGUgcmVmZXJlbmNlZCB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb24oT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyLCBTdHJpbmcgcmVmZXJyZXJUYWJsZU5hbWUsIExpc3Q8U3RyaW5nPiByZWZlcnJlckNvbE5hbWVzCi0JCQksIFN0cmluZyByZWZlcmVuY2VkVGFibGVOYW1lLCBMaXN0PFN0cmluZz4gcmVmZXJlbmNlZENvbE5hbWVzKSAgewotCQlzdXBlcigpOwotCQkKLQkJbUN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQltUmVmZXJyZXJUYWJsZU5hbWUgPSByZWZlcnJlclRhYmxlTmFtZTsKLQkJbVJlZmVyZW5jZWRUYWJsZU5hbWUgPSByZWZlcmVuY2VkVGFibGVOYW1lOwotCQltUmVmZXJyZXJDb2xOYW1lcyA9IHJlZmVycmVyQ29sTmFtZXM7Ci0JCW1SZWZlcmVuY2VkQ29sTmFtZXMgPSByZWZlcmVuY2VkQ29sTmFtZXM7Ci0JCQotCQltQ2FyZGluYWxpdHkgPSBNQU5ZX1RPX09ORTsKLQkJbURpcmVjdGlvbmFsaXR5ID0gQklfREk7Ci0JCQotCQlzZXRDdXN0b20odHJ1ZSk7Ci0JfQotCS8qKgotCSAqIFRoZSBtYW55IHRvIG1hbnkgY29uc3RydWN0b3IuCi0JICogVGhlIDIgdGFibGVzIGFyZSBqb2luZWQgd2hlbiB0aGUgdmFsdWVzIG9mIGVhY2ggY29sdW1uIGluCi0JICogcmVmZXJyZXJDb2xOYW1lcyBtYXRjaCBpdHMgY29ycmVzcG9uZGluZyBjb2x1bW4gaW4gcmVmZXJyZXJKb2luQ29sTmFtZXMKLQkgKiAsIGFuZCBlYWNoIGNvbHVtbiBpbiByZWZlcmVuY2VkQ29sTmFtZXMgbWF0Y2ggaXRzIGNvcnJlc3BvbmRpbmcgY29sdW1uIGluIHJlZmVyZW5jZWRKb2luQ29sTmFtZXMuCi0JICoKLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb24oT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyLCBTdHJpbmcgcmVmZXJyZXJUYWJsZU5hbWUsIExpc3Q8U3RyaW5nPiByZWZlcnJlckNvbE5hbWVzCi0JCQksIFN0cmluZyByZWZlcmVuY2VkVGFibGVOYW1lLCBMaXN0PFN0cmluZz4gcmVmZXJlbmNlZENvbE5hbWVzCi0JCQksIFN0cmluZyBqb2luVGFibGVOYW1lLCBMaXN0PFN0cmluZz4gcmVmZXJyZXJKb2luQ29sTmFtZXMsIExpc3Q8U3RyaW5nPiByZWZlcmVuY2VkSm9pbkNvbE5hbWVzKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQltQ3VzdG9taXplciA9IGN1c3RvbWl6ZXI7Ci0JCW1SZWZlcnJlclRhYmxlTmFtZSA9IHJlZmVycmVyVGFibGVOYW1lOwotCQltUmVmZXJlbmNlZFRhYmxlTmFtZSA9IHJlZmVyZW5jZWRUYWJsZU5hbWU7Ci0JCW1SZWZlcnJlckNvbE5hbWVzID0gcmVmZXJyZXJDb2xOYW1lczsKLQkJbVJlZmVyZW5jZWRDb2xOYW1lcyA9IHJlZmVyZW5jZWRDb2xOYW1lczsKLQkJbUpvaW5UYWJsZU5hbWUgPSBqb2luVGFibGVOYW1lOwotCQltUmVmZXJyZXJKb2luQ29sTmFtZXMgPSByZWZlcnJlckpvaW5Db2xOYW1lczsKLQkJbVJlZmVyZW5jZWRKb2luQ29sTmFtZXMgPSByZWZlcmVuY2VkSm9pbkNvbE5hbWVzOwotCQkKLQkJbUNhcmRpbmFsaXR5ID0gTUFOWV9UT19NQU5ZOwkKLQkJbURpcmVjdGlvbmFsaXR5ID0gQklfREk7Ci0JCQotCQlzZXRDdXN0b20odHJ1ZSk7Ci0JfQotCS8qKgotCSAqIEVtcHR5IGNvbnN0cnVjdG9yIG5lZWRlZCBieSB0aGUgZGVzZXJpYWxpemF0aW9uIChzaG91bGQgbm90IGJlIHVzZWQgb3RoZXJ3aXNlKS4KLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb24oKSB7Ci0JfQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBjYXJkaW5hbGl0eSBiYXNlZG9uIHRoZSBmb3JpZ24ga2V5IGRlZmluaXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXB1dGVDYXJkaW5hbGl0eSgpICB7Ci0JCS8qYnkgZGVmYXVsdCB0aGUgYXNzb2NpYXRpb24gaXMgbWFueS10by1vbmUgdW5sZXNzIHRoZSBmb3JlaWduIGtleSAKLQkJICogaXMgYWxzbyB0aGUgcHJpbWFyeSBrZXksIGluIHdoaWNoIGNhc2UgaXQgaXMgYSBvbmUtdG8tb25lLiovCi0JCW1DYXJkaW5hbGl0eSA9IE1BTllfVE9fT05FOwotCQkKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IHJlZmVycmVyQ29scyA9IGdldFJlZmVycmVyQ29sdW1ucygpOwotCQlMaXN0PE9STUdlbkNvbHVtbj4gcGtDb2xzID0gZ2V0UmVmZXJyZXJUYWJsZSgpLmdldFByaW1hcnlLZXlDb2x1bW5zKCk7Ci0JCWlmIChwa0NvbHMuc2l6ZSgpID09IHJlZmVycmVyQ29scy5zaXplKCkpIHsKLQkJCWJvb2xlYW4gaXNGa1BrID0gdHJ1ZTsKLQkJCWZvciAoaW50IGkgPSAwLCBuID0gcGtDb2xzLnNpemUoKTsgaSA8IG47ICsraSkgewotCQkJCWlmICghKChPUk1HZW5Db2x1bW4pcGtDb2xzLmdldChpKSkuZ2V0TmFtZSgpLmVxdWFscygoKE9STUdlbkNvbHVtbilyZWZlcnJlckNvbHMuZ2V0KGkpKS5nZXROYW1lKCkpKSB7Ci0JCQkJCWlzRmtQayA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNGa1BrKSB7Ci0JCQkJbUNhcmRpbmFsaXR5ID0gT05FX1RPX09ORTsKLQkJCX0KLQkJfQotCQkKLQkJc2V0Q3VzdG9tKGZhbHNlKTsKLQl9Ci0JLyoqCi0JICogQ2FsbGVkIGFmdGVyIHRoZSBhc3Njb2NpYXRpb25zIGFyZSBkZXNlcmlhbGl6ZWQgdG8gYXR0YWNoIAotCSAqIHRoZSBjdXN0b21pemVyIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlKE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplcikgewotCQltQ3VzdG9taXplciA9IGN1c3RvbWl6ZXI7Ci0JCQotCQlpZiAobVJlZmVycmVyUm9sZSAhPSBudWxsKSB7Ci0JCQltUmVmZXJyZXJSb2xlLnJlc3RvcmUodGhpcyk7Ci0JCX0KLQkJaWYgKG1SZWZlcmVuY2VkUm9sZSAhPSBudWxsKSB7Ci0JCQltUmVmZXJlbmNlZFJvbGUucmVzdG9yZSh0aGlzKTsKLQkJfQotCX0KLQlwdWJsaWMgT1JNR2VuVGFibGUgZ2V0UmVmZXJyZXJUYWJsZSgpICB7Ci0JCXJldHVybiBtQ3VzdG9taXplci5nZXRUYWJsZShtUmVmZXJyZXJUYWJsZU5hbWUpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVycmVyVGFibGVOYW1lKCkgewotCQlyZXR1cm4gbVJlZmVycmVyVGFibGVOYW1lOwotCX0KLQlwdWJsaWMgT1JNR2VuVGFibGUgZ2V0UmVmZXJlbmNlZFRhYmxlKCkgIHsKLQkJcmV0dXJuIG1DdXN0b21pemVyLmdldFRhYmxlKG1SZWZlcmVuY2VkVGFibGVOYW1lKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkgewotCQlyZXR1cm4gbVJlZmVyZW5jZWRUYWJsZU5hbWU7Ci0JfQotCXB1YmxpYyBPUk1HZW5UYWJsZSBnZXRKb2luVGFibGUoKSAgewotCQlyZXR1cm4gbUN1c3RvbWl6ZXIuZ2V0VGFibGUobUpvaW5UYWJsZU5hbWUpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEpvaW5UYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBtSm9pblRhYmxlTmFtZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+T1JNR2VuQ29sdW1uPC9jb2RlPiBvYmplY3RzIGZvciB0aGUgcmVmZXJyZXIKLQkgKiBjb2x1bW5zLgotCSAqLwotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0UmVmZXJyZXJDb2x1bW5zKCkgewotCQlpZiAobVJlZmVycmVyQ29scyA9PSBudWxsKSB7Ci0JCQlPUk1HZW5UYWJsZSByZWZlcnJlclRhYmxlID0gZ2V0UmVmZXJyZXJUYWJsZSgpOwotCQkJbVJlZmVycmVyQ29scyA9IHJlZmVycmVyVGFibGUuZ2V0Q29sdW1uc0J5TmFtZXMobVJlZmVycmVyQ29sTmFtZXMpOwotCQl9Ci0JCXJldHVybiBtUmVmZXJyZXJDb2xzOwotCX0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJlZmVycmVyQ29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiBtUmVmZXJyZXJDb2xOYW1lczsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+T1JNR2VuQ29sdW1uPC9jb2RlPiBvYmplY3RzIGZvciB0aGUgcmVmZXJlbmNlZAotCSAqIGNvbHVtbnMuCi0JICovCi0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRSZWZlcmVuY2VkQ29sdW1ucygpIHsKLQkJaWYgKG1SZWZlcmVuY2VkQ29scyA9PSBudWxsKSB7Ci0JCQltUmVmZXJlbmNlZENvbHMgPSBnZXRSZWZlcmVuY2VkVGFibGUoKS5nZXRDb2x1bW5zQnlOYW1lcyhtUmVmZXJlbmNlZENvbE5hbWVzKTsKLQkJfQotCQlyZXR1cm4gbVJlZmVyZW5jZWRDb2xzOwotCX0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpIHsKLQkJcmV0dXJuIG1SZWZlcmVuY2VkQ29sTmFtZXM7Ci0JfQotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0UmVmZXJyZXJKb2luQ29sdW1ucygpIHsKLQkJaWYgKG1SZWZlcnJlckpvaW5Db2xzID09IG51bGwpIHsKLQkJCW1SZWZlcnJlckpvaW5Db2xzID0gZ2V0Sm9pblRhYmxlKCkuZ2V0Q29sdW1uc0J5TmFtZXMobVJlZmVycmVySm9pbkNvbE5hbWVzKTsKLQkJfQotCQlyZXR1cm4gbVJlZmVycmVySm9pbkNvbHM7Ci0JfQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVmZXJyZXJKb2luQ29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiBtUmVmZXJyZXJKb2luQ29sTmFtZXM7Ci0JfQotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5zKCkgIHsKLQkJaWYgKG1SZWZlcmVuY2VkSm9pbkNvbHMgPT0gbnVsbCkgewotCQkJbVJlZmVyZW5jZWRKb2luQ29scyA9IGdldEpvaW5UYWJsZSgpLmdldENvbHVtbnNCeU5hbWVzKG1SZWZlcmVuY2VkSm9pbkNvbE5hbWVzKTsKLQkJfQotCQlyZXR1cm4gbVJlZmVyZW5jZWRKb2luQ29sczsKLQl9Ci0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZWZlcmVuY2VkSm9pbkNvbHVtbk5hbWVzKCkgewotCQlyZXR1cm4gbVJlZmVyZW5jZWRKb2luQ29sTmFtZXM7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFzc29jaWF0aW9uIGNhcmRpbmFsaXR5LCBvbmUgb2Yge0BsaW5rICNNQU5ZX1RPX09ORX18e0BsaW5rICNNQU5ZX1RPX01BTll9Ci0JICogfHtAbGluayAjT05FX1RPX09ORX18e0BsaW5rICNPTkVfVE9fTUFOWX0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhcmRpbmFsaXR5KCkgewotCQlyZXR1cm4gbUNhcmRpbmFsaXR5OwotCX0KLQlwdWJsaWMgdm9pZCBzZXRDYXJkaW5hbGl0eShTdHJpbmcgY2FyZGluYWxpdHkpIHsKLQkJYXNzZXJ0KGNhcmRpbmFsaXR5LmVxdWFscyhNQU5ZX1RPX09ORSkgfHwgY2FyZGluYWxpdHkuZXF1YWxzKE1BTllfVE9fTUFOWSkgfHwgY2FyZGluYWxpdHkuZXF1YWxzKE9ORV9UT19PTkUpIHx8IGNhcmRpbmFsaXR5LmVxdWFscyhPTkVfVE9fTUFOWSkpOwotCQltQ2FyZGluYWxpdHkgPSBjYXJkaW5hbGl0eTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYXNzb2NpYXRpb24gZGlyZWN0aW9uYWxpdHksIG9uZSBvZiB7QGxpbmsgI0JJX0RJfXx7QGxpbmsgI05PUk1BTF9ESX0KLQkgKiB8e0BsaW5rICNPUFBPU0lURV9ESX0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpcmVjdGlvbmFsaXR5KCkgewotCQlyZXR1cm4gbURpcmVjdGlvbmFsaXR5OwotCX0KLQlwdWJsaWMgdm9pZCBzZXREaXJlY3Rpb25hbGl0eShTdHJpbmcgZGlyKSB7Ci0JCWFzc2VydChkaXIuZXF1YWxzKEJJX0RJKSB8fCBkaXIuZXF1YWxzKE5PUk1BTF9ESSkgfHwgZGlyLmVxdWFscyhPUFBPU0lURV9ESSkpOwotCQlpZiAoIWRpci5lcXVhbHMobURpcmVjdGlvbmFsaXR5KSkgewotCQkJbURpcmVjdGlvbmFsaXR5ID0gZGlyOwotCQkJCi0JCQlpZiAoZGlyLmVxdWFscyhOT1JNQUxfREkpKSB7Ci0JCQkJbVJlZmVyZW5jZWRSb2xlID0gbnVsbDsKLQkJCX0gZWxzZSBpZiAoZGlyLmVxdWFscyhPUFBPU0lURV9ESSkpIHsKLQkJCQltUmVmZXJyZXJSb2xlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIHRoaXMgYXNzb2NpYXRpb24gaXMgYmlkaXJlY3Rpb25hbC4KLQkgKiBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yIDxjb2RlPmdldERpcmVjdGlvbmFsaXR5KCkuZXF1YWxzKEJJX0RJKTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCaWRpcmVjdGlvbmFsKCkgewotCQlyZXR1cm4gbURpcmVjdGlvbmFsaXR5LmVxdWFscyhCSV9ESSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBvZiB0aGlzIGFzc29jaWF0aW9uIHNob3VsZCBiZSBnZW5lcmF0ZWQuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVkKCkgewotCQlyZXR1cm4gKG1GbGFncyAmIEdFTkVSQVRFRCkgIT0gMDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVkKGJvb2xlYW4gZ2VuZXJhdGVkKSB7Ci0JCWlmIChnZW5lcmF0ZWQgIT0gaXNHZW5lcmF0ZWQoKSkgewotCQkJaWYgKGdlbmVyYXRlZCkgewotCQkJCW1GbGFncyB8PSBHRU5FUkFURUQ7Ci0JCQl9IGVsc2UgewotCQkJCW1GbGFncyAmPSB+R0VORVJBVEVEOwotCQkJfQotCQkJbVJlZmVycmVyUm9sZSA9IG1SZWZlcmVuY2VkUm9sZSA9IG51bGw7Ci0JCX0KLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIG9mIHRoaXMgYXNzb2NpYXRpb24gaXMgY3VzdG9tIChpLmUgaXMgbm90IGF1dG8gY29tcHV0ZWQgZnJvbSBmb3JlaWduIGtleXMgcmVsYXRpb25zaGlwcykuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ3VzdG9tKCkgewotCQlyZXR1cm4gKG1GbGFncyAmIENVU1RPTSkgIT0gMDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Q3VzdG9tKGJvb2xlYW4gY3VzdG9tKSB7Ci0JCWlmIChjdXN0b20pIHsKLQkJCW1GbGFncyB8PSBDVVNUT007Ci0JCX0gZWxzZSB7Ci0JCQltRmxhZ3MgJj0gfkNVU1RPTTsKLQkJfQotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGlvbiByb2xlIGZvciB0aGUgcmVmZXJyZXIgc2lkZSwgb3IgbnVsbCAKLQkgKiBpZiBub25lIChpLmUgaWYgdGhlIGRpcmVjdGlvbmFsaXR5IGRvZXMgbm90IGluY2x1ZGUgaXQpLgotCSAqLwotCXB1YmxpYyBBc3NvY2lhdGlvblJvbGUgZ2V0UmVmZXJyZXJSb2xlKCkgewotCQlpZiAobVJlZmVycmVyUm9sZSA9PSBudWxsICYmIGlzR2VuZXJhdGVkKCkpIHsKLQkJCWlmICghZ2V0RGlyZWN0aW9uYWxpdHkoKS5lcXVhbHMoT1BQT1NJVEVfREkpKSB7IC8vQklfREkgb3IgTk9STUFMX0RJCi0JCQkJbVJlZmVycmVyUm9sZSA9IG5ldyBBc3NvY2lhdGlvblJvbGUodGhpcywgdHJ1ZS8qaXNSZWZlcnJlckVuZCovKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbVJlZmVycmVyUm9sZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYXNzb2NpYXRpb24gcm9sZSBmb3IgdGhlIHJlZmVyZW5jZWQgc2lkZSwgb3IgbnVsbCAKLQkgKiBpZiBub25lIChpLmUgaWYgdGhlIGRpcmVjdGlvbmFsaXR5IGRvZXMgbm90IGluY2x1ZGUgaXQpLgotCSAqLwotCXB1YmxpYyBBc3NvY2lhdGlvblJvbGUgZ2V0UmVmZXJlbmNlZFJvbGUoKSB7Ci0JCWlmIChtUmVmZXJlbmNlZFJvbGUgPT0gbnVsbCAmJiBpc0dlbmVyYXRlZCgpKSB7Ci0JCQlpZiAoIWdldERpcmVjdGlvbmFsaXR5KCkuZXF1YWxzKEFzc29jaWF0aW9uLk5PUk1BTF9ESSkpIHsgLy9CSV9ESSBvciBPUFBPU0lURV9ESQotCQkJCW1SZWZlcmVuY2VkUm9sZSA9IG5ldyBBc3NvY2lhdGlvblJvbGUodGhpcywgZmFsc2UvKmlzUmVmZXJyZXJFbmQqLyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1SZWZlcmVuY2VkUm9sZTsKLQl9Ci0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGlzIGFzc29jaWF0aW9uIGlzIHZhbGlkICh2YWxpZCB0YWJsZSBhbmQgY29sdW1uIG5hbWVzKS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkKCl7Ci0JCWlmICghaXNWYWxpZFRhYmxlQW5kQ29sdW1ucyhtUmVmZXJyZXJUYWJsZU5hbWUsIG1SZWZlcnJlckNvbE5hbWVzKQotCQkJCXx8ICFpc1ZhbGlkVGFibGVBbmRDb2x1bW5zKG1SZWZlcmVuY2VkVGFibGVOYW1lLCBtUmVmZXJlbmNlZENvbE5hbWVzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChtSm9pblRhYmxlTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoIWlzVmFsaWRUYWJsZUFuZENvbHVtbnMobUpvaW5UYWJsZU5hbWUsIG1SZWZlcnJlckpvaW5Db2xOYW1lcykKLQkJCQkJfHwgIWlzVmFsaWRUYWJsZUFuZENvbHVtbnMobUpvaW5UYWJsZU5hbWUsIG1SZWZlcmVuY2VkSm9pbkNvbE5hbWVzKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRUYWJsZUFuZENvbHVtbnMoU3RyaW5nIHRhYmxlTmFtZSwgTGlzdDxTdHJpbmc+IGNvbHVtbk5hbWVzKSB7Ci0JCU9STUdlblRhYmxlIHRhYmxlID0gbUN1c3RvbWl6ZXIuZ2V0VGFibGUodGFibGVOYW1lKTsKLQkJaWYgKHRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gMCwgbiA9IGNvbHVtbk5hbWVzLnNpemUoKTsgaSA8IG47ICsraSkgewotCQkJU3RyaW5nIGNvbE5hbWUgPSAoU3RyaW5nKWNvbHVtbk5hbWVzLmdldChpKTsKLQkJCWlmICh0YWJsZS5nZXRDb2x1bW5CeU5hbWUoY29sTmFtZSkgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Rm9yZWlnbktleShGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJdGhpcy5tRm9yZWlnbktleSA9IGZvcmVpZ25LZXk7Ci0JCQotCX0KLQlwdWJsaWMgRm9yZWlnbktleSBnZXRGb3JlaWduS2V5KCl7Ci0JCXJldHVybiB0aGlzLm1Gb3JlaWduS2V5OwotCX07CQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmKCB0aGlzID09IG9iaiApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYoIG9iaiBpbnN0YW5jZW9mIEFzc29jaWF0aW9uICl7Ci0JCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbjIgPSAoQXNzb2NpYXRpb24pb2JqOwotCQkJaWYgKCF0aGlzLmdldFJlZmVycmVyVGFibGVOYW1lKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcnJlclRhYmxlTmFtZSgpKQotCQkJCQl8fCAhdGhpcy5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkpCi0JCQkJCXx8ICFTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyh0aGlzLmdldEpvaW5UYWJsZU5hbWUoKSwgYXNzb2NpYXRpb24yLmdldEpvaW5UYWJsZU5hbWUoKSkKLQkJCQkJfHwgIXRoaXMuZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpKQotCQkJCQl8fCAhdGhpcy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpKQotCQkJCQkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9CQkJCQkKLQkJCS8qdGhlIDIgYXNzb2NpYXRpb24gaGF2ZSB0aGUgc2FtZSByZWZlcnJlciwgcmVmZXJlbmNlZCBhbmQgam9pbiB0YWJsZSovCi0JCQkvL0lmIE1UTyBvciBPVE0gYXNzb2NpYXRpb24KLQkJCWlmICh0aGlzLmdldEpvaW5UYWJsZU5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAodGhpcy5nZXRSZWZlcnJlckpvaW5Db2x1bW5OYW1lcygpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJyZXJKb2luQ29sdW1uTmFtZXMoKSkKLQkJCQkJJiYgdGhpcy5nZXRSZWZlcmVuY2VkSm9pbkNvbHVtbk5hbWVzKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcmVuY2VkSm9pbkNvbHVtbk5hbWVzKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCQlyZXR1cm4gbVJlZmVycmVyVGFibGVOYW1lICsgIiAiICsgbUNhcmRpbmFsaXR5ICsgIiAiICsgbVJlZmVyZW5jZWRUYWJsZU5hbWUgOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvQXNzb2NpYXRpb25Sb2xlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0Fzc29jaWF0aW9uUm9sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjY1NGZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvQXNzb2NpYXRpb25Sb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gYXNzb2NpYXRpb24gcm9sZSAodGhlIHJlZmVycmVyIG9yIHJlZmVyZW5jZWQgcm9sZSkuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFzc29jaWF0aW9uUm9sZSBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSB0cmFuc2llbnQgQXNzb2NpYXRpb24gbUFzc29jaWF0aW9uOyAvL3RyYW5zaWVudDogc2VlIHJlc3RvcmUKLQlwcml2YXRlIGJvb2xlYW4gbUlzUmVmZXJyZXJSb2xlOwotCXByaXZhdGUgU3RyaW5nIG1Qcm9wZXJ0eU5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgbUNhc2NhZGU7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTsKLQkJCi0JQXNzb2NpYXRpb25Sb2xlKEFzc29jaWF0aW9uIGFzc29jaWF0aW9uLCBib29sZWFuIGlzUmVmZXJyZXJSb2xlKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQltQXNzb2NpYXRpb24gPSBhc3NvY2lhdGlvbjsKLQkJbUlzUmVmZXJyZXJSb2xlID0gaXNSZWZlcnJlclJvbGU7Ci0JfQotCQotCS8qKgotCSAqIEVtcHR5IGNvbnN0cnVjdG9yIG5lZWRlZCBieSB0aGUgZGVzZXJpYWxpemF0aW9uIChzaG91bGQgbm90IGJlIHVzZWQgb3RoZXJ3aXNlKS4KLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb25Sb2xlKCkgewotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgYWZ0ZXIgdGhlIGFzc2NvY2lhdGlvbnMgYXJlIGRlc2VyaWFsaXplZCB0byBhdHRhY2ggCi0JICogdGhlIGN1c3RvbWl6ZXIgb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmUoQXNzb2NpYXRpb24gYXNzb2NpYXRpb24pIHsKLQkJbUFzc29jaWF0aW9uID0gYXNzb2NpYXRpb247Ci0JfQotCQotCXB1YmxpYyBBc3NvY2lhdGlvbiBnZXRBc3NvY2lhdGlvbigpIHsKLQkJcmV0dXJuIG1Bc3NvY2lhdGlvbjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNSZWZlcnJlclJvbGUoKSB7Ci0JCXJldHVybiBtSXNSZWZlcnJlclJvbGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9wcG9zaXRlIHJvbGUgb3IgbnVsbCBpZiB0aGUgYXNzb2NpYXRpb24gCi0JICogaXMgbm90IGJpIGRpcmVjdGlvbmFsLgotCSAqLwotCXB1YmxpYyBBc3NvY2lhdGlvblJvbGUgZ2V0T3Bwb3NpdGVSb2xlKCkgewotCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA9IGdldEFzc29jaWF0aW9uKCk7Ci0JCWlmICghYXNzb2NpYXRpb24uZ2V0RGlyZWN0aW9uYWxpdHkoKS5lcXVhbHMoQXNzb2NpYXRpb24uQklfREkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoaXNSZWZlcnJlclJvbGUoKSkgewotCQkJcmV0dXJuIGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRSb2xlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJSb2xlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXNzb2NpYXRpb24gY2FyZGluYWxpdHksIG9uZSBvZiB7QGxpbmsgI01BTllfVE9fT05FfXx7QGxpbmsgI01BTllfVE9fTUFOWX0KLQkgKiB8e0BsaW5rICNPTkVfVE9fT05FfXx7QGxpbmsgI09ORV9UT19NQU5ZfQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FyZGluYWxpdHkoKSB7Ci0JCVN0cmluZyB0eXBlID0gbUFzc29jaWF0aW9uLmdldENhcmRpbmFsaXR5KCk7Ci0JCWlmICghbUlzUmVmZXJyZXJSb2xlKSB7Ci0JCQlpZiAodHlwZS5lcXVhbHMoQXNzb2NpYXRpb24uT05FX1RPX01BTlkpKSB7Ci0JCQkJdHlwZSA9IEFzc29jaWF0aW9uLk1BTllfVE9fT05FOwotCQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORSkpIHsKLQkJCQl0eXBlID0gQXNzb2NpYXRpb24uT05FX1RPX01BTlk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCQotCXB1YmxpYyBPUk1HZW5UYWJsZSBnZXRSZWZlcnJlclRhYmxlKCkgewotCQlpZiAobUlzUmVmZXJyZXJSb2xlKSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVycmVyVGFibGUoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRSZWZlcnJlckNvbHVtbnMoKXsKLQkJaWYgKG1Jc1JlZmVycmVyUm9sZSkgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcnJlckNvbHVtbnMoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZENvbHVtbnMoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBjb3JyZXNwb25kaW5nIHRvIGEgcmVmZXJyZXIgY29sdW1uLgotCSAqLwotCXB1YmxpYyBPUk1HZW5Db2x1bW4gZ2V0UmVmZXJlbmNlZENvbHVtbihTdHJpbmcgcmVmZXJyZXJDb2x1bW4pICB7Ci0JCWJvb2xlYW4gaGFzSm9pblRhYmxlID0gbUFzc29jaWF0aW9uLmdldEpvaW5UYWJsZSgpICE9IG51bGw7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiByZWZlcnJlckNvbHVtbnMgPSBnZXRSZWZlcnJlckNvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDAsIG4gPSByZWZlcnJlckNvbHVtbnMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gcmVmZXJyZXJDb2x1bW5zLmdldChpKTsKLQkJCWlmIChjb2x1bW4uZ2V0TmFtZSgpLmVxdWFscyhyZWZlcnJlckNvbHVtbikpIHsKLQkJCQlpZiAoaGFzSm9pblRhYmxlKSB7Ci0JCQkJCXJldHVybiBnZXRSZWZlcnJlckpvaW5Db2x1bW5zKCkuZ2V0KGkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBnZXRSZWZlcmVuY2VkQ29sdW1ucygpLmdldChpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0KGZhbHNlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZmVycmVyIGNvbHVtbiBjb3JyZXNwb25kaW5nIHRvIGEgcmVmZXJlbmNlZCBjb2x1bW4uCi0JICovCi0JcHVibGljIE9STUdlbkNvbHVtbiBnZXRSZWZlcnJlckNvbHVtbihTdHJpbmcgcmVmZXJlbmNlZENvbHVtbikgIHsKLQkJYm9vbGVhbiBoYXNKb2luVGFibGUgPSBtQXNzb2NpYXRpb24uZ2V0Sm9pblRhYmxlKCkgIT0gbnVsbDsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IHJlZmVyZW5jZWRDb2x1bW5zID0gZ2V0UmVmZXJlbmNlZENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDAsIG4gPSByZWZlcmVuY2VkQ29sdW1ucy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSByZWZlcmVuY2VkQ29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAoY29sdW1uLmdldE5hbWUoKS5lcXVhbHMocmVmZXJlbmNlZENvbHVtbikpIHsKLQkJCQlpZiAoaGFzSm9pblRhYmxlKSB7Ci0JCQkJCXJldHVybiBnZXRSZWZlcmVuY2VkSm9pbkNvbHVtbnMoKS5nZXQoaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGdldFJlZmVycmVyQ29sdW1ucygpLmdldChpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0KGZhbHNlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBPUk1HZW5UYWJsZSBnZXRSZWZlcmVuY2VkVGFibGUoKSAgewotCQlpZiAobUlzUmVmZXJyZXJSb2xlKSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcnJlclRhYmxlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRSZWZlcmVuY2VkQ29sdW1ucygpICB7Ci0JCWlmIChtSXNSZWZlcnJlclJvbGUpIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZENvbHVtbnMoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJDb2x1bW5zKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRSZWZlcnJlckpvaW5Db2x1bW5zKCkgIHsKLQkJaWYgKG1Jc1JlZmVycmVyUm9sZSkgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcnJlckpvaW5Db2x1bW5zKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRKb2luQ29sdW1ucygpOwotCQl9Ci0JfQotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5zKCkgIHsKLQkJaWYgKG1Jc1JlZmVycmVyUm9sZSkgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkSm9pbkNvbHVtbnMoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJKb2luQ29sdW1ucygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBieSB0aGUgZ2VuZXJhdG9yIGZvciAKLQkgKiB0aGUgcHJvcGVydHkgY29ycmVzcG9uZGluZyB0byB0aGlzIHJvbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSAgIHsKLQkJaWYgKG1Qcm9wZXJ0eU5hbWUgIT0gbnVsbCkgeyAvL2lmIHRoZSB1c2VyIGV4cGxpY2l0bHkgc2V0IGl0IHRoZW4gZG9uJ3QgYmUgdG9vIHNtYXJ0Ci0JCQlyZXR1cm4gbVByb3BlcnR5TmFtZTsKLQkJfQotCQlyZXR1cm4gZ2V0RGVmYXVsdFByb3BlcnR5TmFtZSgpOwotCX0KLQkJCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFByb3BlcnR5TmFtZSgpIHsKLQkJU3RyaW5nIHByb3BOYW1lID0gIiI7Ci0JCU9STUdlblRhYmxlIHJlZmVycmVyVGFibGUgPSBnZXRSZWZlcnJlclRhYmxlKCk7Ci0JCU9STUdlblRhYmxlIHJlZmVyZW5jZWRUYWJsZSA9IGdldFJlZmVyZW5jZWRUYWJsZSgpOwotCi0JCWJvb2xlYW4gaXNTaW5ndWxhciA9IGlzU2luZ3VsYXIoKTsKLQkJcHJvcE5hbWUgPSByZWZlcmVuY2VkVGFibGUuZ2V0VmFyTmFtZShpc1Npbmd1bGFyKTsKLQkJCi0JCUxpc3Q8QXNzb2NpYXRpb25Sb2xlPiBjbGFzaGluZ1JvbGVzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8QXNzb2NpYXRpb25Sb2xlPigpOyAvL3JvbGVzIHdpdGggb3VyIHNhbWUgcmVmZXJyZXIgYW5kIHJlZmVyZW5jZWQgdGFibGVzIChpLmUgd291bGQgeWllbGQgdGhlIHNhbWUgcHJvcGVydHkgbmFtZSBpbiB0aGUgc2FtZSBiZWFuKQotCQkvKm1ha2Ugc3VyZSB0aGVyZSBpcyBubyByb2xlIHdpdGggdGhlIHNhbWUgbmFtZS4qLwotCQlmb3IgKEl0ZXJhdG9yPEFzc29jaWF0aW9uUm9sZT4gaXRlciA9IHJlZmVycmVyVGFibGUuZ2V0QXNzb2NpYXRpb25Sb2xlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCUFzc29jaWF0aW9uUm9sZSByb2xlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocm9sZS5nZXRSZWZlcnJlclRhYmxlKCkuZ2V0TmFtZSgpLmVxdWFscyhyZWZlcnJlclRhYmxlLmdldE5hbWUoKSkKLQkJCQkJJiYgcm9sZS5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXROYW1lKCkuZXF1YWxzKHJlZmVyZW5jZWRUYWJsZS5nZXROYW1lKCkpCi0JCQkJCSYmIHJvbGUuaXNTaW5ndWxhcigpID09IGlzU2luZ3VsYXIpIHsKLQkJCQljbGFzaGluZ1JvbGVzLmFkZChyb2xlKTsKLQkJCX0KLQkJfQotCQlpZiAoY2xhc2hpbmdSb2xlcy5zaXplKCkgPiAxKSB7Ci0JCQlpbnQgaW5kZXggPSBjbGFzaGluZ1JvbGVzLmluZGV4T2YodGhpcyk7Ci0JCQlhc3NlcnQoaW5kZXggPj0gMCk7Ci0JCQlwcm9wTmFtZSArPSBpbmRleCsxOwotCQl9Ci0JCQotCQkvKm1ha2Ugc3VyZSB0aGVyZSBpcyBubyBjb2x1bW4gd2l0aCB0aGUgc2FtZSBuYW1lLiovCi0JCWZvciAoSXRlcmF0b3I8T1JNR2VuQ29sdW1uPiBpdGVyID0gcmVmZXJyZXJUYWJsZS5nZXRDb2x1bW5zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJT1JNR2VuQ29sdW1uIGNvbHVtbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNvbHVtbi5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMocHJvcE5hbWUpKSB7Ci0JCQkJU3RyaW5nIHByZWZpeCA9IGlzU2luZ3VsYXIgPyAiQmVhbiIgOiAiU2V0IjsKLQkJCQlwcm9wTmFtZSArPSBwcmVmaXg7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwcm9wTmFtZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzU2luZ3VsYXIoKSB7Ci0JCVN0cmluZyBjYXJkaW5hbGl0eSA9IGdldENhcmRpbmFsaXR5KCk7Ci0JCXJldHVybiBjYXJkaW5hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uT05FX1RPX09ORSkgfHwgY2FyZGluYWxpdHkuZXF1YWxzKEFzc29jaWF0aW9uLk1BTllfVE9fT05FKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBnZW5lcmF0b3IgZm9yIAotCSAqIHRoZSBwcm9wZXJ0eSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcm9sZS4KLQkgKiBJZiB0aGUgYXJndW1lbnQgbmFtZSBpcyBudWxsIG9yIGVtcHR5IHN0cmluZyB0aGVuIHRoZSAKLQkgKiBkZWZhdWx0IGNvbXB1dGVkIG5hbWUgaXMgdXNlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpICB7Ci0JCWlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQluYW1lID0gbnVsbDsKLQkJfQotCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUuZXF1YWxzKGdldERlZmF1bHRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCW5hbWUgPSBudWxsOwotCQl9Ci0JCW1Qcm9wZXJ0eU5hbWUgPSBuYW1lOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjYXNjYWRlIHZhbHVlIGZvciB0aGlzIHJvbGUsIG9yIG51bGwgaWYgbm9uZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhc2NhZGUoKSB7Ci0JCXJldHVybiBtQ2FzY2FkZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZShTdHJpbmcgY2FzY2FkZSkgewotCQlpZiAoY2FzY2FkZSAhPSBudWxsICYmIGNhc2NhZGUubGVuZ3RoKCkgPT0gMCkgewotCQkJY2FzY2FkZSA9IG51bGw7Ci0JCX0KLQkJbUNhc2NhZGUgPSBjYXNjYWRlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVzY3JpcHRpdmUgc3RyaW5nIHVzZWQgaW4gYSBjb21tZW50IGluIHRoZSBnZW5lcmF0ZWQgCi0JICogZmlsZSAoZnJvbSB0aGUgVmVsb2NpdHkgdGVtcGxhdGUpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSAgewotCQkvLzwhLS0gJGRpcmVjdGlvbmFsaXR5ICRjYXJkaW5hbGl0eSBhc3NvY2lhdGlvbiB0byAkcmVmZXJlbmNlZENsYXNzTmFtZSAtLT4KLQkJU3RyaW5nIGRpcmVjdGlvbmFsaXR5OwotCQlpZiAoZ2V0QXNzb2NpYXRpb24oKS5nZXREaXJlY3Rpb25hbGl0eSgpLmVxdWFscyhBc3NvY2lhdGlvbi5CSV9ESSkpIHsKLQkJCWRpcmVjdGlvbmFsaXR5ID0gImJpLWRpcmVjdGlvbmFsIjsKLQkJfSBlbHNlIHsKLQkJCWRpcmVjdGlvbmFsaXR5ID0gInVuaS1kaXJlY3Rpb25hbCI7Ci0JCX0KLQkJcmV0dXJuIGRpcmVjdGlvbmFsaXR5ICsgIiAiICsgZ2V0QXNzb2NpYXRpb24oKS5nZXRDYXJkaW5hbGl0eSgpICsgIiBhc3NvY2lhdGlvbiB0byAiICsgZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0Q2xhc3NOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9CYXNlRW50aXR5R2VuQ3VzdG9taXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9CYXNlRW50aXR5R2VuQ3VzdG9taXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTkzMWVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvQmFzZUVudGl0eUdlbkN1c3RvbWl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsLkRUUFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsLlN0cmluZ1V0aWw7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBPUk1HZW5DdXN0b21pemVyIGFjY29yZGluZyB0byBKUEEgc3BlY2lmaWNhdGlvbiBmb3IKLSAqIGVudGl0eSBnZW5lcmF0aW9uLgotICogCi0gKiBUaGlzIGlzIHVzZWQgdG8gcmV0cmlldmUvY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIHdpemFyZCBhbmQgaXMgYWxzbwotICogcGFzc2VkIGFzIGEgY29udGV4dCBvYmplY3QgdG8gVmVsb2NpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlRW50aXR5R2VuQ3VzdG9taXplciBleHRlbmRzIE9STUdlbkN1c3RvbWl6ZXIKLQlpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTsKLQotCS8qIG1hcHBpbmcga2luZHMgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTSUNfTUFQUElOR19LSU5EID0gImJhc2ljIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9NQVBQSU5HX0tJTkQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fTUFQUElOR19LSU5EID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIHRoZSBzdHJpbmdzIGZvciBnZW5lcmF0b3IgbmFtZXMuIFRoZXNlIGFwcGVhciBpbiBhIGNvbWJvIGJveCBhbmQgdXNlZCBieQotCSAqIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSBwcm9jZXNzaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX0dFTkVSQVRPUiA9ICJhdXRvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FX0dFTkVSQVRPUiA9ICJub25lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElUWV9HRU5FUkFUT1IgPSAiaWRlbnRpdHkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUiA9ICJzZXF1ZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfR0VORVJBVE9SID0gInRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEJhc2VFbnRpdHlHZW5DdXN0b21pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoRmlsZSBmaWxlLCBTY2hlbWEgc2NoZW1hKSB7Ci0JCXN1cGVyLmluaXQoZmlsZSwgc2NoZW1hKTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIC0tLS0tLSBPUk1HZW5DdXN0b21pemVyIG1ldGhvZHMKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QWxsSWRHZW5lcmF0b3JzKCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8U3RyaW5nPig1KTsKLQkJLyogYWRkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdvdWxkIGFwcGVhciBpbiB0aGUgY29tYm8gKi8KLQkJcmVzdWx0LmFkZChBVVRPX0dFTkVSQVRPUik7Ci0JCXJlc3VsdC5hZGQoSURFTlRJVFlfR0VORVJBVE9SKTsKLQkJcmVzdWx0LmFkZChTRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlyZXN1bHQuYWRkKFRBQkxFX0dFTkVSQVRPUik7Ci0JCXJlc3VsdC5hZGQoTk9ORV9HRU5FUkFUT1IpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9JZEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIE5PTkVfR0VORVJBVE9SOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpdHlJZEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIElERU5USVRZX0dFTkVSQVRPUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0U2VxdWVuY2VJZEdlbmVyYXRvcnMoKSB7Ci0JCVNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuSGFzaFNldDxTdHJpbmc+KDMpOwotCQlyZXN1bHQuYWRkKFNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVR5cGVGcm9tQ29sdW1uKENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIERUUFV0aWwuZ2V0SmF2YVR5cGUoY29sdW1uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLQlwdWJsaWMgU3RyaW5nW10gZ2V0QWxsUHJvcGVydHlUeXBlcygpIHsKLQkJLyoKLQkJICogSmF2YSBwcmltaXRpdmUgdHlwZXMsIHdyYXBwZXIgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcyAsCi0JCSAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubWF0aC5CaWdJbnRlZ2VyLCBqYXZhLm1hdGguQmlnRGVjaW1hbCwKLQkJICogamF2YS51dGlsLkRhdGUsIGphdmEudXRpbC5DYWxlbmRhciwgamF2YS5zcWwuRGF0ZSwgamF2YS5zcWwuVGltZSwKLQkJICogamF2YS5zcWwuVGltZXN0YW1wLCBieXRlW10sIEJ5dGVbXSwgY2hhcltdLCBDaGFyYWN0ZXJbXSwgZW51bXMsIGFuZAotCQkgKiBhbnkgb3RoZXIgdHlwZSB0aGF0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlLgotCQkgKi8KLQkJLy8gcmV0dXJuIGluIHRoZSBvcmRlciB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgY29tYm8KLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0JCQkiYm9vbGVhbiIsCi0JCQkiQm9vbGVhbiIsCi0JCQkiYnl0ZSIsCi0JCQkiQnl0ZSIsCi0JCQkiYnl0ZVtdIiwKLQkJCSJjaGFyIiwKLQkJCSJjaGFyW10iLAotCQkJIkNoYXJhY3RlciIsCi0JCQkiQ2hhcmFjdGVyW10iLAotCQkJImRvdWJsZSIsCi0JCQkiRG91YmxlIiwKLQkJCSJmbG9hdCIsCi0JCQkiRmxvYXQiLAotCQkJImludCIsCi0JCQkiSW50ZWdlciIsCi0JCQkibG9uZyIsCi0JCQkiTG9uZyIsCi0JCQkiT2JqZWN0IiwKLQkJCSJzaG9ydCIsCi0JCQkiU2hvcnQiLAotCQkJIlN0cmluZyIsCi0JCQlqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcy5nZXROYW1lKCksCi0JCQlqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcy5nZXROYW1lKCksCi0JCQlqYXZhLnV0aWwuQ2FsZW5kYXIuY2xhc3MuZ2V0TmFtZSgpLAotCQkJamF2YS51dGlsLkRhdGUuY2xhc3MuZ2V0TmFtZSgpLAotCQkJamF2YS5zcWwuRGF0ZS5jbGFzcy5nZXROYW1lKCksCi0JCQlqYXZhLnNxbC5UaW1lLmNsYXNzLmdldE5hbWUoKSwKLQkJCWphdmEuc3FsLlRpbWVzdGFtcC5jbGFzcy5nZXROYW1lKCkKLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nW10gZ2V0QWxsTWFwcGluZ0tpbmRzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKLQkJCUJBU0lDX01BUFBJTkdfS0lORCwgSURfTUFQUElOR19LSU5ELCBWRVJTSU9OX01BUFBJTkdfS0lORAotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzaWNNYXBwaW5nS2luZCgpIHsKLQkJcmV0dXJuIEJBU0lDX01BUFBJTkdfS0lORDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldElkTWFwcGluZ0tpbmQoKSB7Ci0JCXJldHVybiBJRF9NQVBQSU5HX0tJTkQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZWRpdENhc2NhZGUoQXNzb2NpYXRpb25Sb2xlIHJvbGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIG1hbnlTaWRlSXNBc3NvY2lhdGlvbk93bmVyKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIC0tLS0gVmVsb2NpdHkgdGVtcGxhdGVzIG1ldGhvZHMKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhc2NhZGVzIGFubm90YXRpb24gbWVtYmVyIHZhbHVlLCBvciBlbXB0eSBzdHJpbmcgaWYgbm9uZS4KLQkgKiBFbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBudWxsIGJlY2F1c2UgVmVsb2NpdHkgZG9lcyBub3QgbGlrZQotCSAqIG51bGwgd2hlbiB1c2VkIGluICNzZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5DYXNjYWRlcyhBc3NvY2lhdGlvblJvbGUgcm9sZSkgewotCQlMaXN0PFN0cmluZz4gY2FzY2FkZXMgPSBTdHJpbmdVdGlsLnN0clRvTGlzdChyb2xlLmdldENhc2NhZGUoKSwgJywnLCB0cnVlLyogdHJpbSAqLyk7Ci0JCWlmIChjYXNjYWRlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCAneycgKTsKLQkJZm9yIChpbnQgaSA9IDAsIG4gPSBjYXNjYWRlcy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCVN0cmluZyBjYXNjYWRlID0gY2FzY2FkZXMuZ2V0KGkpOwotCQkJU3RyaW5nIGVudW1TdHI7Ci0JCQlpZiAoY2FzY2FkZS5lcXVhbHMoVGFnTmFtZXMuQUxMX0NBU0NBREUpKSB7Ci0JCQkJZW51bVN0ciA9ICJDYXNjYWRlVHlwZS5BTEwiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmIChjYXNjYWRlLmVxdWFscyhUYWdOYW1lcy5QRVJTSVNUX0NBU0NBREUpKSB7Ci0JCQkJZW51bVN0ciA9ICJDYXNjYWRlVHlwZS5QRVJTSVNUIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAoY2FzY2FkZS5lcXVhbHMoVGFnTmFtZXMuTUVSR0VfQ0FTQ0FERSkpIHsKLQkJCQllbnVtU3RyID0gIkNhc2NhZGVUeXBlLk1FUkdFIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAoY2FzY2FkZS5lcXVhbHMoVGFnTmFtZXMuUkVNT1ZFX0NBU0NBREUpKSB7Ci0JCQkJZW51bVN0ciA9ICJDYXNjYWRlVHlwZS5SRU1PVkUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhc3NlcnQgKGNhc2NhZGUuZXF1YWxzKFRhZ05hbWVzLlJFRlJFU0hfQ0FTQ0FERSkpOwotCQkJCWVudW1TdHIgPSAiQ2FzY2FkZVR5cGUuUkVGUkVTSCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChpICE9IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKGVudW1TdHIpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJ30nKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZldGNoIHR5cGUgYW5ub3RhdGlvbiBtZW1iZXIgdmFsdWUsIG9yIGVtcHR5IHN0cmluZyBpZiBub25lLgotCSAqIEVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIG51bGwgYmVjYXVzZSBWZWxvY2l0eSBkb2VzIG5vdCBsaWtlCi0JICogbnVsbCB3aGVuIHVzZWQgaW4gI3NldC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdlbkZldGNoKE9STUdlblRhYmxlIHRhYmxlKSB7Ci0JCVN0cmluZyBmZXRjaCA9IHRhYmxlLmdldERlZmF1bHRGZXRjaCgpOwotCQlpZiAoZmV0Y2ggPT0gbnVsbCB8fCBPUk1HZW5UYWJsZS5ERUZBVUxUX0ZFVENILmVxdWFscyhmZXRjaCkpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGZldGNoLmVxdWFscyhPUk1HZW5UYWJsZS5MQVpZX0ZFVENIKSkgewotCQkJcmV0dXJuICJGZXRjaFR5cGUuTEFaWSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAiRmV0Y2hUeXBlLkVBR0VSIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9EYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9EYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzk0MjU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLQotCi0vKioKLSAqIFByb3ZpZGUgYSBwbHVnZ2FibGUgd2F5IHRvIGRldGVybWluZSB3aGV0aGVyIGFuZCBob3cgdGhlIGVudGl0eSBnZW5lcmF0b3IKLSAqIHByaW50cyB0aGUgbmFtZXMgb2YgdmFyaW91cyBkYXRhYmFzZSBvYmplY3RzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIHsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGVudGl0eSBhbmQgdGhlIHRhYmxlIHRvIHdoaWNoIGl0IGlzIG1hcHBlZCwKLQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgZW50aXR5J3MKLQkgKiBUYWJsZSBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuIFJldHVybiBudWxsIGlmIHRoZSBlbnRpdHkKLQkgKiBtYXBzIHRvIHRoZSB0YWJsZSBieSBkZWZhdWx0LgotCSAqLwotCVN0cmluZyBidWlsZFRhYmxlQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGVudGl0eU5hbWUsIFRhYmxlIHRhYmxlKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSAoZmllbGQgb3IgcHJvcGVydHkpIGFuZCB0aGUgY29sdW1uCi0JICogdG8gd2hpY2ggaXQgaXMgbWFwcGVkLAotCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUncwotCSAqIENvbHVtbiBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuIFJldHVybiBudWxsIGlmIHRoZSBhdHRyaWJ1dGUKLQkgKiBtYXBzIHRvIHRoZSBjb2x1bW4gYnkgZGVmYXVsdC4KLQkgKi8KLQlTdHJpbmcgYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgQ29sdW1uIGNvbHVtbik7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgKGZpZWxkIG9yIHByb3BlcnR5KSBhbmQgdGhlCi0JICogbWFueS10by1vbmUgb3IgbWFueS10by1tYW55IGZvcmVpZ24ga2V5IHRvIHdoaWNoIGl0IGlzIG1hcHBlZCwKLQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlJ3MKLQkgKiBKb2luQ29sdW1uIGFubm90YXRpb24ncyAnbmFtZScgZWxlbWVudC4gUmV0dXJuIG51bGwgaWYgdGhlIGF0dHJpYnV0ZQotCSAqIG1hcHMgdG8gdGhlIGpvaW4gY29sdW1uIGJ5IGRlZmF1bHQuCi0JICogVGhlIHNwZWNpZmllZCBmb3JlaWduIGtleSBjb25zaXN0cyBvZiBhIHNpbmdsZSBjb2x1bW4gcGFpciB3aG9zZQotCSAqIHJlZmVyZW5jZWQgY29sdW1uIGlzIHRoZSBzaW5nbGUtY29sdW1uIHByaW1hcnkga2V5IG9mIHRoZSBmb3JlaWduCi0JICoga2V5J3MgcmVmZXJlbmNlZCB0YWJsZS4KLQkgKi8KLQlTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciBhIEpvaW5Db2x1bW4KLQkgKiBhbm5vdGF0aW9uJ3MgJ25hbWUnIG9yICdyZWZlcmVuY2VkQ29sdW1uTmFtZScgZWxlbWVudC4KLQkgKiBUaGlzIGlzIGNhbGxlZCBmb3IgbWFueS10by1vbmUgYW5kIG1hbnktdG8tbWFueSBtYXBwaW5ncyB3aGVuCi0JICogdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gbmFtZSBhbmQvb3IgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBhcmUvaXMKLQkgKiBub3QgYXBwbGljYWJsZS4KLQkgKiBAc2VlIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZywgRm9yZWlnbktleSkKLQkgKi8KLQlTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoQ29sdW1uIGNvbHVtbik7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciBhIEpvaW5UYWJsZQotCSAqIGFubm90YXRpb24ncyAnbmFtZScgZWxlbWVudC4KLQkgKiBUaGlzIGlzIGNhbGxlZCBmb3IgbWFueS10by1tYW55IG1hcHBpbmdzIHdoZW4gdGhlIGRlZmF1bHQKLQkgKiBqb2luIHRhYmxlIG5hbWUgaXMgbm90IGFwcGxpY2FibGUuCi0JICovCi0JU3RyaW5nIGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbk5hbWUoVGFibGUgdGFibGUpOwotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbGUgcmV0dXJucyB0aGUgZGF0YWJhc2Ugb2JqZWN0J3MgbmFtZSwKLQkgKiB1bmFsdGVyZWQuCi0JICovCi0JZmluYWwgY2xhc3MgRGVmYXVsdCBpbXBsZW1lbnRzIERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0KCk7Ci0JCXB1YmxpYyBzdGF0aWMgRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERlZmF1bHQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRUYWJsZUFubm90YXRpb25OYW1lKFN0cmluZyBlbnRpdHlOYW1lLCBUYWJsZSB0YWJsZSkgewotCQkJcmV0dXJuIHRhYmxlLmdldE5hbWUoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGJ1aWxkQ29sdW1uQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiBjb2x1bW4uZ2V0TmFtZSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQkJcmV0dXJuIGZvcmVpZ25LZXkuZ2V0Q29sdW1uUGFpcigpLmdldEJhc2VDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShDb2x1bW4gY29sdW1uKSB7Ci0JCQlyZXR1cm4gY29sdW1uLmdldE5hbWUoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbk5hbWUoVGFibGUgdGFibGUpIHsKLQkJCXJldHVybiB0YWJsZS5nZXROYW1lKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLkRlZmF1bHQiOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0pwdEdlbk1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0pwdEdlbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MDVmOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9KcHRHZW5NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIGVudGl0eSBnZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSnB0R2VuTWVzc2FnZXMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFja2FnZUdlbmVyYXRvcl90YXNrTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5TY29wZV90YXNrTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlHZW5lcmF0b3JfdGFza05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGVtcGxhdGVzX25vdEZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX0dlbmVyYXRpbmdfRW50aXRpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlX0ZvbGRlcl9FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVfRmlsZV9FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlX1JlYWRfT25seV9FcnJvcjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfZ2VuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdEdlbk1lc3NhZ2VzLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCQotCXByaXZhdGUgSnB0R2VuTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9KcHRHZW5QbHVnaW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvSnB0R2VuUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NDBjMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9KcHRHZW5QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRHZW5QbHVnaW4gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuZ2VuIjsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uICggU3RyaW5nIG1zZywgVGhyb3dhYmxlIGUgKSB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJSUxvZyBsb2cgPSBQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKTsKLQkJbG9nLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgbXNnLCBlICkpOwkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oIENvcmVFeGNlcHRpb24gY2UgKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJSUxvZyBsb2cgPSBQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKTsKLQkJbG9nLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgc3RhdHVzLmdldE1lc3NhZ2UoKSwgY2UpKTsJCQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT1JNR2VuQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL09STUdlbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzZjOWViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT1JNR2VuQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5FbnRpdHlHZW5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuU3RyaW5nVXRpbDsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIE9STSBnZW5lcmF0aW9uIHByb3BlcnRpZXMgZm9yIGEgZGF0YWJhc2UgCi0gKiBjb2x1bW4uCi0gKiAKLSAqIDxwPlRoaXMgaXMgZGVzaWduZWQgdG8gYmUgY3JlYXRlZC9jaGFuZ2VkIGJ5IHRoZSBnZW5lcmF0aW9uIHdpemFyZCwKLSAqIGFuZCBnZW5lcmF0ZWQgdXNpbmcgVmVsb2NpdHkgdGVtcGxhdGVzLgotICogVGhlIG1vZGlmaWVkIHByb3BlcnRpZXMgKGlmIGFueSkgYXJlIHBlcnNpc3RlZC9yZXRyaWV2ZWQgdXNpbmcgCi0gKiA8Y29kZT5PUk1HZW5DdXN0b21pemVyPC9jb2RlPi4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT1JNR2VuQ29sdW1uCi17Ci0JcHJpdmF0ZSBUYWJsZSBtVGFibGU7Ci0JcHJpdmF0ZSBDb2x1bW4gbURiQ29sdW1uOwotCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBtQ3VzdG9taXplcjsKLQlwcml2YXRlIE9STUdlblRhYmxlIG1HZW5UYWJsZTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSkFWQV9MQU5HX1BBQ0tBR0UgPSAiamF2YS5sYW5nLiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgT1JNR2VuQ29sdW1uKENvbHVtbiBkYkNvbHVtbiwgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQltRGJDb2x1bW4gPSBkYkNvbHVtbjsKLQkJbUN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQltVGFibGUgPSBkYkNvbHVtbi5nZXRUYWJsZSgpOwotCX0KLQkKLQlwdWJsaWMgT1JNR2VuQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gbUN1c3RvbWl6ZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEdlblRhYmxlKE9STUdlblRhYmxlIG9ybUdlblRhYmxlKSB7Ci0JCW1HZW5UYWJsZSA9IG9ybUdlblRhYmxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbWl6ZWQoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCXJldHVybiBnZXRDdXN0b21pemVyKCkuZ2V0UHJvcGVydHkocHJvcE5hbWUsIG1UYWJsZS5nZXROYW1lKCksIGdldE5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGN1c3RvbWl6ZWRCb29sZWFuKFN0cmluZyBwcm9wTmFtZSkgewotCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wTmFtZSwgbVRhYmxlLmdldE5hbWUoKSwgZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3VzdG9taXplZChTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0KLQkJZ2V0Q3VzdG9taXplcigpLnNldFByb3BlcnR5KHByb3BOYW1lLCB2YWx1ZSwgbVRhYmxlLmdldE5hbWUoKSwgZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3VzdG9taXplZEJvb2xlYW4oU3RyaW5nIHByb3BOYW1lLCBib29sZWFuIHZhbHVlLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlpZiAoZGVmYXVsdFZhbHVlID09IHZhbHVlKSB7Ci0JCQlzZXRDdXN0b21pemVkKHByb3BOYW1lLCBudWxsKTsgLy9yZW1vdmUgdGhlIHByb3BlcnR5Ci0JCX0gZWxzZSB7Ci0JCQlnZXRDdXN0b21pemVyKCkuc2V0Qm9vbGVhblByb3BlcnR5KHByb3BOYW1lLCB2YWx1ZSwgbVRhYmxlLmdldE5hbWUoKSwgZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2x1bW4gbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IHRoaXMubUN1c3RvbWl6ZXIuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS4KLQkJCWJ1aWxkQ29sdW1uQW5ub3RhdGlvbk5hbWUobURiQ29sdW1uLmdldE5hbWUoKSwgbURiQ29sdW1uKTsKLQkJcmV0dXJuIGFubm90YXRpb25OYW1lICE9IG51bGwgPyBhbm5vdGF0aW9uTmFtZSA6IG1EYkNvbHVtbi5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKb2luQ29sdW1uTmFtZSgpewotCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSB0aGlzLm1DdXN0b21pemVyLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuCi0JCQlidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShtRGJDb2x1bW4pOwotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWUgIT0gbnVsbCA/IGFubm90YXRpb25OYW1lIDogbURiQ29sdW1uLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIENvbHVtbiBnZXREYkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMubURiQ29sdW1uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgYmVhbiBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgZ2l2ZW4gY29sdW1uLgotCSAqIERvZXMgbm90IHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGN1c3RvbWl6ZWQoUFJPUEVSVFlfTkFNRSk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCS8vbmFtZSA9IFN0cmluZ1V0aWwuY29sdW1uTmFtZVRvVmFyTmFtZShnZXROYW1lKCkpOwotCQkJbmFtZSA9IEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoZ2V0TmFtZSgpLCBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5U2V0KCkpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKCFTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyhuYW1lLCBnZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCXNldEN1c3RvbWl6ZWQoUFJPUEVSVFlfTkFNRSwgbmFtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlcyBvZiBuYW1lIGVsZW1lbnQgaW4gdGhlIEBDb2x1bW4gaXMgZGVmYXVsdAotCSAqIHNvIHdlIGNhbiBza2lwIGdlbmVyYXRpbmcgdGhlIGFubm90YXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKXsKLQkJcmV0dXJuIGlzRGVmYXVsdG5hbWUoKSAmJiBpc1VwZGF0ZWFibGUoKSAmJiBpc0luc2VydGFibGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlcyBvZiBuYW1lIGVsZW1lbnQgaW4gdGhlIEBDb2x1bW4gaXMgZGVmYXVsdAotCSAqIHNvIHdlIGNhbiBza2lwIGdlbmVyYXRpbmcgdGhlIGFubm90YXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRuYW1lKCl7Ci0JCVN0cmluZyBwcm9wTmFtZSA9IGdldFByb3BlcnR5TmFtZSgpOwotLy8JCVN0cmluZyBkYkNvbHVtbk5hbWUgPSBnZXROYW1lKCk7Ci0vLwkJcmV0dXJuIHByb3BOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIGRiQ29sdW1uTmFtZSApOwotCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSB0aGlzLm1DdXN0b21pemVyLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuCi0JCQlidWlsZENvbHVtbkFubm90YXRpb25OYW1lKHByb3BOYW1lLCB0aGlzLm1EYkNvbHVtbiApOwotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWU9PW51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlcyBvZiBuYW1lIGVsZW1lbnQgaW4gdGhlIEBDb2x1bW4gaXMgZGVmYXVsdAotCSAqIHNvIHdlIGNhbiBza2lwIGdlbmVyYXRpbmcgdGhlIGFubm90YXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRKb2luQ29sdW1uTmFtZShTdHJpbmcgYXNzb2NpYXRpb25Sb2xlUHJvcE5hbWUpewotCQlpZiggIXRoaXMubURiQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUl0ZXJhYmxlPEZvcmVpZ25LZXk+IGl0ID0gbURiQ29sdW1uLmdldFRhYmxlKCkuZ2V0Rm9yZWlnbktleXMoKTsKLQkJSXRlcmF0b3I8Rm9yZWlnbktleT4gaSA9IGl0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlKCBpLmhhc05leHQoKSApewotCQkJRm9yZWlnbktleSBmayA9IGkubmV4dCgpOwotCQkJQ29sdW1uIGMgPSBmay5nZXRCYXNlQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJaWYoIGMuZXF1YWxzKCB0aGlzLm1EYkNvbHVtbiApICl7Ci0JCQkJdHJ5ewotCQkJCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSB0aGlzLm1DdXN0b21pemVyLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuCi0JCQkJCQlidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShhc3NvY2lhdGlvblJvbGVQcm9wTmFtZSwgZmsgKTsKLQkJCQkJcmV0dXJuIGFubm90YXRpb25OYW1lPT1udWxsOwotCQkJCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0JCQkJCS8vY2F0Y2ggdGhlIGNhc2UgdGhhdCByZWZlcmVuY2VkIHRhYmxlIGhhcyBtdWx0aXBsZSBwcmltYXJ5IGtleSBjb2x1bW5zCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2x1bW4gdHlwZS4KLQkgKiBEb2VzIG5vdCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VHlwZSgpICB7Ci0JCVN0cmluZyB0eXBlID0gY3VzdG9taXplZChQUk9QRVJUWV9UWVBFKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJdHlwZSA9IGdldEN1c3RvbWl6ZXIoKS5nZXRQcm9wZXJ0eVR5cGVGcm9tQ29sdW1uKCB0aGlzLm1EYkNvbHVtbiApOwotCQl9Ci0JCWlmKCB0eXBlLnN0YXJ0c1dpdGgoSkFWQV9MQU5HX1BBQ0tBR0UpICkgewotCQkJdHlwZSA9IHR5cGUuc3Vic3RyaW5nKCBKQVZBX0xBTkdfUEFDS0FHRS5sZW5ndGgoKSApOwotCQl9Ci0JCWlmKCB0eXBlLmVxdWFscygiamF2YS5zcWwuRGF0ZSIpKXsgLy8kTk9OLU5MUy0xJAotCQkJdHlwZSA9ICJqYXZhLnV0aWwuRGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkJCi0JCXJldHVybiB0eXBlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNpbXBsZVByb3BlcnR5VHlwZSgpICB7Ci0JCXJldHVybiBtR2VuVGFibGUuZ2V0U2ltcGxpZmllZENvbFR5cGUoIGdldFByb3BlcnR5VHlwZSgpICk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVR5cGUoU3RyaW5nIHR5cGUpICB7Ci0JCWlmICghU3RyaW5nVXRpbC5lcXVhbE9iamVjdHModHlwZSwgZ2V0UHJvcGVydHlUeXBlKCkpKSB7Ci0JCQlzZXRDdXN0b21pemVkKFBST1BFUlRZX1RZUEUsIHR5cGUpOwotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29sdW1uIHR5cGUgaXMgbnVtZXJpYy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc051bWVyaWMoKSB7Ci0JCWJvb2xlYW4gcmV0ID0gdGhpcy5tRGJDb2x1bW4uaXNOdW1lcmljKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcHBpbmcga2luZCwgb25lIG9mIHtAbGluayAjUFJPUEVSVFlfTUFQUElOR19LSU5EfXx7QGxpbmsgI0lEX01BUFBJTkdfS0lORH0KLQkgKiB8e0BsaW5rICNWRVJTSU9OX01BUFBJTkdfS0lORH18e0BsaW5rICNUSU1FU1RBTVBfTUFQUElOR19LSU5EfS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gbnVsbCAoZGVmYXVsdHMgdG8gYmFzaWMgcHJvcGVydHkgdHlwZSkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2luZCgpIHsKLQkJU3RyaW5nIGtpbmQgPSBjdXN0b21pemVkKE1BUFBJTkdfS0lORCk7Ci0JCWlmIChraW5kID09IG51bGwpIHsKLQkJCWtpbmQgPSBnZXRDdXN0b21pemVyKCkuZ2V0QmFzaWNNYXBwaW5nS2luZCgpOwotCQkJCi0JCQlpZiAoIHRoaXMubURiQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpIAotCQkJCSAmJiB0aGlzLm1EYkNvbHVtbi5nZXRUYWJsZSgpLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpID09IDEpIHsKLQkJCQlraW5kID0gZ2V0Q3VzdG9taXplcigpLmdldElkTWFwcGluZ0tpbmQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4ga2luZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWFwcGluZ0tpbmQoU3RyaW5nIG1hcHBpbmdLaW5kKSAgewotCQlpZiAoIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKG1hcHBpbmdLaW5kLCBnZXRNYXBwaW5nS2luZCgpKSkgewotCQkJc2V0Q3VzdG9taXplZChNQVBQSU5HX0tJTkQsIG1hcHBpbmdLaW5kKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc051bGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5tRGJDb2x1bW4uaXNOdWxsYWJsZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKLQkJaWYgKCB0aGlzLm1EYkNvbHVtbi5pc051bWVyaWMoKSl7Ci0JCQlyZXR1cm4gbURiQ29sdW1uLmdldFByZWNpc2lvbigpOwotCQl9Ci0JCXJldHVybiBtRGJDb2x1bW4uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWNpbWFsRGlnaXRzKCkgewotCQlpZiAoIHRoaXMubURiQ29sdW1uLmlzTnVtZXJpYygpICl7Ci0JCQlyZXR1cm4gbURiQ29sdW1uLmdldFNjYWxlKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiB0aGlzLm1EYkNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0T2ZDb21wb3NpdGVQcmltYXJ5S2V5KCkgewotCQlyZXR1cm4gdGhpcy5tRGJDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkgJiYKLQkJCQl0aGlzLm1UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSA+IDE7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRm9yZWlnbktleSgpIHsKLQkJcmV0dXJuIHRoaXMubURiQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1VuaXF1ZSgpIHsKLQkJcmV0dXJuIHRoaXMubURiQ29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBjdXN0b21pemVkKFBST1BFUlRZX0RFU0MpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RhdGFUeXBlTE9CKCkgewotCQlyZXR1cm4gdGhpcy5tRGJDb2x1bW4uaXNMT0IoKTsKLQl9CQotCi0JcHVibGljIGJvb2xlYW4gaXNOZWVkTWFwVGVtcG9yYWxUeXBlKCkgewotCQlTdHJpbmcgcHJvcGVydHlUeXBlID0gdGhpcy5nZXRQcm9wZXJ0eVR5cGUoKTsKLQkJcmV0dXJuICggcHJvcGVydHlUeXBlLmVxdWFscygiamF2YS51dGlsLkRhdGUiKSB8fCBwcm9wZXJ0eVR5cGUuZXF1YWxzKCJqYXZhLnV0aWwuQ2FsZW5kYXIiKSApOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRlbXBvcmFsVHlwZSgpIHsKLQkJU3RyaW5nIGRlZmF1bHRUeXBlID0gZ2V0Q3VzdG9taXplcigpLmdldFByb3BlcnR5VHlwZUZyb21Db2x1bW4oIHRoaXMubURiQ29sdW1uICk7Ci0JCWlmKCBkZWZhdWx0VHlwZS5lcXVhbHMoImphdmEuc3FsLkRhdGUiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAiREFURSI7IC8vJE5PTi1OTFMtMSQKLQkJfWVsc2UgaWYoIGRlZmF1bHRUeXBlLmVxdWFscygiamF2YS5zcWwuVGltZSIpKXsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICJUSU1FIjsgLy8kTk9OLU5MUy0xJAotCQl9ZWxzZSB7Ci0JCQlyZXR1cm4gIlRJTUVTVEFNUCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIHByb3BlcnR5IGdldHRlciBzY29wZSwgb25lIG9mIHtAbGluayAjUFVCTElDX1NDT1BFfXx7QGxpbmsgI1BST1RFQ1RFRF9TQ09QRX0KLQkgKiB8e0BsaW5rICNQUklWQVRFX1NDT1BFfS4KLQkgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwgKGRlZmF1bHRzIHRvIHB1YmxpYykuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUdldFNjb3BlKCkgewotCQlTdHJpbmcgc2NvcGUgPSBjdXN0b21pemVkKFBST1BFUlRZX0dFVF9TQ09QRSk7Ci0JCWlmIChzY29wZSA9PSBudWxsKSB7Ci0JCQlzY29wZSA9IFBVQkxJQ19TQ09QRTsKLQkJfQotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5R2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7Ci0JCWlmICghU3RyaW5nVXRpbC5lcXVhbE9iamVjdHMoc2NvcGUsIGdldFByb3BlcnR5R2V0U2NvcGUoKSkpIHsKLQkJCXNldEN1c3RvbWl6ZWQoUFJPUEVSVFlfR0VUX1NDT1BFLCBzY29wZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIHByb3BlcnR5IHNldHRlciBzY29wZSwgb25lIG9mIHtAbGluayAjUFVCTElDX1NDT1BFfXx7QGxpbmsgI1BST1RFQ1RFRF9TQ09QRX0KLQkgKiB8e0BsaW5rICNQUklWQVRFX1NDT1BFfS4KLQkgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwgKGRlZmF1bHRzIHRvIHB1YmxpYykuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVNldFNjb3BlKCkgewotCQlTdHJpbmcgc2NvcGUgPSBjdXN0b21pemVkKFBST1BFUlRZX1NFVF9TQ09QRSk7Ci0JCWlmIChzY29wZSA9PSBudWxsKSB7Ci0JCQlzY29wZSA9IFBVQkxJQ19TQ09QRTsKLQkJfQotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5U2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7Ci0JCWlmICghU3RyaW5nVXRpbC5lcXVhbE9iamVjdHMoc2NvcGUsIGdldFByb3BlcnR5U2V0U2NvcGUoKSkpIHsKLQkJCXNldEN1c3RvbWl6ZWQoUFJPUEVSVFlfU0VUX1NDT1BFLCBzY29wZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIGZpZWxkIG1lbWJlciBzY29wZSwgb25lIG9mIHtAbGluayAjUFVCTElDX1NDT1BFfXx7QGxpbmsgI1BST1RFQ1RFRF9TQ09QRX0KLQkgKiB8e0BsaW5rICNQUklWQVRFX1NDT1BFfS4KLQkgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwgKGRlZmF1bHRzIHRvIHByaXZhdGUpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGRTY29wZSgpIHsKLQkJU3RyaW5nIHNjb3BlID0gY3VzdG9taXplZChGSUVMRF9TQ09QRSk7Ci0JCWlmIChzY29wZSA9PSBudWxsKSB7Ci0JCQlzY29wZSA9IFBSSVZBVEVfU0NPUEU7Ci0JCX0KLQkJcmV0dXJuIHNjb3BlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb2x1bW4gc2hvdWxkIGJlIHVzZWQgaW4gdGhlIAotCSAqIDxjb2RlPmVxdWFsczwvY29kZT4gbWV0aG9kIGltcGxlbWVudGF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNlSW5FcXVhbHMoKSAgewotCQlyZXR1cm4gY3VzdG9taXplZEJvb2xlYW4oVVNFX0lOX0VRVUFMUykgfHwgaXNQcmltYXJ5S2V5KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZUluRXF1YWxzKGJvb2xlYW4gdmFsdWUpIHsKLQkJc2V0Q3VzdG9taXplZEJvb2xlYW4oVVNFX0lOX0VRVUFMUywgdmFsdWUsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29sdW1uIHNob3VsZCBiZSB1c2VkIGluIHRoZSAKLQkgKiA8Y29kZT50b1N0cmluZzwvY29kZT4gbWV0aG9kIGltcGxlbWVudGF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNlSW5Ub1N0cmluZygpICB7Ci0JCXJldHVybiBjdXN0b21pemVkQm9vbGVhbihVU0VfSU5fVE9fU1RSSU5HKSB8fCBpc1ByaW1hcnlLZXkoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VXNlSW5Ub1N0cmluZyhib29sZWFuIHZhbHVlKSB7Ci0JCXNldEN1c3RvbWl6ZWRCb29sZWFuKFVTRV9JTl9UT19TVFJJTkcsIHZhbHVlLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlYWJsZSgpIHsKLQkJcmV0dXJuICEiZmFsc2UiLmVxdWFscyhjdXN0b21pemVkKFVQREFURUFCTEUpKTsgLy9kZWZhdWx0cyB0byB0cnVlIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlYWJsZShib29sZWFuIHZhbHVlKSB7Ci0JCXNldEN1c3RvbWl6ZWRCb29sZWFuKFVQREFURUFCTEUsIHZhbHVlLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gISJmYWxzZSIuZXF1YWxzKGN1c3RvbWl6ZWQoSU5TRVJUQUJMRSkpOyAvL2RlZmF1bHRzIHRvIHRydWUgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRhYmxlKGJvb2xlYW4gdmFsdWUpIHsKLQkJc2V0Q3VzdG9taXplZEJvb2xlYW4oSU5TRVJUQUJMRSwgdmFsdWUsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlZCgpIHsKLQkJcmV0dXJuICEiZmFsc2UiLmVxdWFscyhjdXN0b21pemVkKEdFTkVSQVRFRCkpOyAvL2RlZmF1bHRzIHRvIHRydWUgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWQoYm9vbGVhbiB2YWx1ZSkgewotCQlzZXRDdXN0b21pemVkQm9vbGVhbihHRU5FUkFURUQsIHZhbHVlLCB0cnVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJuYW1lPSIgKyBnZXROYW1lKCkgKyAiOyB0eXBlPSIgKyBnZXRQcm9wZXJ0eVR5cGUoKSA7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQl9Ci0KLQkvKmdldC9zZXQgYW5kIGZpZWxkIHNjb3BlcyovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX1NDT1BFID0gInB1YmxpYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9URUNURURfU0NPUEUgPSAicHJvdGVjdGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSVZBVEVfU0NPUEUgPSAicHJpdmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qY3VzdG9taXphdGlvbiBwcm9wZXJ0aWVzKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJwcm9wZXJ0eU5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVFlQRSA9ICJwcm9wZXJ0eVR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19LSU5EID0gIm1hcHBpbmdLaW5kIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERVNDID0gInByb3BlcnR5RGVzYyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfR0VUX1NDT1BFID0gInByb3BlcnR5R2V0U2NvcGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1NFVF9TQ09QRSA9ICJwcm9wZXJ0eVNldFNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9TQ09QRSA9ICJmaWVsZFNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfSU5fRVFVQUxTID0gInVzZUluRXF1YWxzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfSU5fVE9fU1RSSU5HID0gInVzZUluVG9TdHJpbmciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURUFCTEUgPSAidXBkYXRlYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUQUJMRSA9ICJpbnNlcnRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURUQgPSAiZ2VuUHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL09STUdlbkN1c3RvbWl6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT1JNR2VuQ3VzdG9taXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDdhY2I1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT1JNR2VuQ3VzdG9taXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsLkRUUFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5Gb3JlaWduS2V5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuU3RyaW5nVXRpbDsKLQotLyoqCi0gKiBDb250YWlucyB0aGUgaW5mb3JtYXRpb24gdXNlZCB0byBjdXN0b21pemUgdGhlIGRhdGFiYXNlIHNjaGVtYSB0byBPUk0gZW50aXR5IAotICogZ2VuZXJhdGlvbi4KLSAqIAotICogPHA+VGhlIGN1c3RvbWl6YXRpb24gc2V0dGluZ3MgYXJlIG1haW5seSBleHBvc2VkIGluIHRoZSBmb3JtIG9mIAotICogcHJvcGVydGllcy4gVGhlcmUgYXJlIG5vIGFzc3VtcHRpb25zIGluIHRoaXMgY2xhc3MgYWJvdXQgdGhlIG1lYW5pbmcgb2YgdGhlIAotICogcHJvcGVydHkgbmFtZXMuIFByb3BlcnRpZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gc3BlY2lmaWMgdGFibGVzIGFuZCB0YWJsZSAKLSAqIGNvbHVtbnMsIG9yIGdsb2JhbGx5IGZvciBhbnkgdGFibGUgYW5kL29yIGNvbHVtbi4KLSAqIAotICogPHA+U3ViY2xhc3MgY2FuIGltcGxlbWVudCB0aGUgc2V0cyBvZiBhYnN0cmFjdCBtZXRob2RzIHRvIHByb3ZpZGUgT1JNIHZlbmRvcgotICogc3BlY2lmaWMgcHJvcGVydGllcy4KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT1JNR2VuQ3VzdG9taXplciBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTsKLQotCS8qKgotCSAqIEEgdmFsdWUgcGFzc2VkIGZvciB0aGUgdGFibGUgbmFtZSBhcmd1bWVudCB0byBnZXQvc2V0UHJvcGVydHkgCi0JICogaW5kaWNhdGluZyB0aGF0IHRoZSB2YWx1ZSBhcHBsaWVzIHRvIGFueSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTllfVEFCTEUgPSAiX19hbnlUYWJsZV9fIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9ERExfQU5OT1RBVElPTiA9ICJnZW5lcmF0ZURETEFubm90YXRpb25zIjsKLQkvKnRoZSBzdHJpbmcgdXNlZCBpbiB0aGUgcHJvcGVydHkgbmFtZSBpbiBtUHJvcHMgdG8gaW5kaWNhdGUgCi0JICogYSBudWxsIHRhYmxlIHZhbHVlLiovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfVEFCTEUgPSAiIjsKLQkvKnRoZSBzdHJpbmcgdXNlZCBpbiB0aGUgcHJvcGVydHkgbmFtZSBpbiBtUHJvcHMgdG8gaW5kaWNhdGUgCi0JICogYSBudWxsIGNvbHVtbiB2YWx1ZS4qLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX0NPTFVNTiA9ICIiOwotCQotCS8qVGhpcyB2ZXJzaW9uIG51bWJlciBpcyB3cml0dGVuIGluIHRoZSBoZWFkZXIgb2YgdGhlIGN1c3RvbWl6YXRpb24gc3RyZWFtCi0JICogYW5kIHJlYWQgYXQgZGUtc2VyaWFsaXphdGlvbiB0aW1lLCBpZiBpdCBpcyBkaWZmZXJlbnQgdGhlbiB0aGUgZmlsZSBpcyBpbnZhbGlkYXRlZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9WRVJTSU9OID0gMjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBEQVRFX0NPTkZJR19GSUxFID0gInVwZGF0ZUNvbmZpZ0ZpbGUiOwotCi0JcHJpdmF0ZSB0cmFuc2llbnQgU2NoZW1hIG1TY2hlbWE7Ci0JcHJpdmF0ZSB0cmFuc2llbnQgRmlsZSBtRmlsZTsKLQkKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBtVGFibGVOYW1lczsKLQkvKmtleTogdGFibGUgbmFtZSwgdmFsdWU6IE9STUdlblRhYmxlIG9iamVjdC4qLwotCXByaXZhdGUgdHJhbnNpZW50IE1hcDxTdHJpbmcgLCBPUk1HZW5UYWJsZT4gbVRhYmxlczsKLQkvKnRoZSA8Y29kZT5Bc3NvY2lhdGlvbjwvY29kZT4gb2JqZWN0cyBzb3J0ZWQgYnkgdGhlaXIgImZyb20iIAotCSAqIHRhYmxlIG5hbWUuIEluY2x1ZGVzIGFsbCBhc3NvY2lhdGlvbiBkZXJpdmVkIGZyb20gZm9yZWlnbiBrZXlzIAotCSAqIGluIHVzZXIgc2VsZWN0ZWQgdGFibGVzLiBTaW5jZSBzb21lIG9mIHRoZSBmb3JlaWduIGtleXMgbWF5IHBvaW50IHRvIHRhYmxlCi0JICogdXNlciBkb2VzIG5vdCBzZWxlY3QsIHRoaXMgbGlzdCBtYXkgYmUgZGlmZmVyZW50IGZyb20gIG1WYWxpZEFzc29jaWF0aW9ucwotCSAqLwotCXByaXZhdGUgTGlzdDxBc3NvY2lhdGlvbj4gbUFzc29jaWF0aW9uczsKLQkvKgotCSAqIExpc3Qgb2YgdmFsaWQgYXNzb2NpYXRpb25zIHdpdGhpbiB0aGUgdXNlciBzZWxlY3RlZCB0YWJsZXMgIAotCSAqLwotCXByaXZhdGUgdHJhbnNpZW50IExpc3Q8QXNzb2NpYXRpb24+IG1WYWxpZEFzc29jaWF0aW9uczsKLQlwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIG1JbnZhbGlkRm9yZWlnbkFzc29jaWF0aW9uczsKLQkKLQkvKnRoZSBwcm9wZXJ0eSBuYW1lIGlzIGluIHRoZSBmb3JtICR0YWJsZU5hbWUuJGNvbHVtbk5hbWUuJHByb3BlcnR5TmFtZS4KLQkgKiBXaGVyZSB0YWJsZU5hbWUgY291bGQgYmUgTlVMTF9UQUJMRSBvciBBTllfVEFCTEUKLQkgKiBhbmQgY29sdW1uTmFtZSBjb3VsZCBiZSBOVUxMX0NPTFVNTiovCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1Qcm9wcyA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotCXByaXZhdGUgdHJhbnNpZW50IERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyID0gRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuRGVmYXVsdC5JTlNUQU5DRTsKLQotCXByaXZhdGUgYm9vbGVhbiBtVXBkYXRlUGVyc2lzdGVuY2VYbWwgPSB0cnVlOwotCQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy0tLS0gYWJzdHJhY3QgbWV0aG9kcwotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgcHJpbWFyeSBrZXkgZ2VuZXJhdG9yIHNjaGVtZXMuCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgTGlzdDxTdHJpbmc+IGdldEFsbElkR2VuZXJhdG9ycygpOwotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRldmVsb3Blci1hc3NpZ25lZCBpZCBnZW5lcmF0b3IuCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5vSWRHZW5lcmF0b3IoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBpZGVudGl0eSBpZCBnZW5lcmF0b3IuCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldElkZW50aXR5SWRHZW5lcmF0b3IoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgc2VxdWVuY2UgZ2VuZXJhdG9ycy4KLQkgKiBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZ3MgYXMgZmFyIGFzIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSAKLQkgKiBwcm9jZXNzb3IgdW5kZXJzdGFuZCB0aGVtLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTZXQ8U3RyaW5nPiBnZXRTZXF1ZW5jZUlkR2VuZXJhdG9ycygpOwotCS8qKgotCSAqIFJldHVybnMgYSBwcm9wZXJ0eSB0eXBlIGZyb20gdGhlIGdpdmVuIGRhdGFiYXNlIGNvbHVtbi4KLQkgKiBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZ3MgYXMgZmFyIGFzIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSAKLQkgKiBwcm9jZXNzb3IgdW5kZXJzdGFuZCB0aGVtLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvcGVydHlUeXBlRnJvbUNvbHVtbihDb2x1bW4gY29sdW1uKSA7Ci0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIHN0cmluZ3MgcmVwcmVzZW50aW5nIHByb3BlcnR5IHR5cGVzLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldEFsbFByb3BlcnR5VHlwZXMoKTsKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgc3RyaW5ncyByZXByZXNlbnRpbmcgcHJvcGVydHkgbWFwcGluZyBraW5kcy4KLQkgKiBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZ3MgYXMgZmFyIGFzIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSAKLQkgKiBwcm9jZXNzb3IgdW5kZXJzdGFuZCB0aGVtLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRBbGxNYXBwaW5nS2luZHMoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNpYyAoZGVmYXVsdCkgcHJvcGVydHkgbWFwcGluZyBraW5kLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRCYXNpY01hcHBpbmdLaW5kKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgKHByaW1hcnkga2V5KSBwcm9wZXJ0eSBtYXBwaW5nIGtpbmQuCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldElkTWFwcGluZ0tpbmQoKTsKLQkvKioKLQkgKiBJbnRlcmFjdHMgd2l0aCB0aGUgdXNlciB0byBlZGl0IHRoZSBjYXNjYWRlIG9mIHRoZSBnaXZlbiAKLQkgKiByb2xlLgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBhbHNvIGNhbGwgPGNvZGU+QXNzb2NpYXRpb25Sb2xlLnNldENhc2NhZGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIHVzZXIgaW50ZXJhY3Rpb24gaXMgY2FuY2VsbGVkLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVkaXRDYXNjYWRlKEFzc29jaWF0aW9uUm9sZSByb2xlKTsKLQkKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY3VzdG9taXphdGlvbiBzZXR0aW5ncy4KLQkgKiBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeSB3aGVuIHRoZSA8Y29kZT5zYXZlPC9jb2RlPiAKLQkgKiBtZXRob2QgaXMgY2FsbGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoIEZpbGUgZmlsZSwgU2NoZW1hIHNjaGVtYSkgewotCQl0aGlzLm1TY2hlbWEgPSBzY2hlbWE7Ci0JCW1GaWxlID0gZmlsZTsKLQkJCi0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJc2V0UHJvcGVydHkoT1JNR2VuVGFibGUuREVGQVVMVF9GRVRDSCwgT1JNR2VuVGFibGUuREVGQVVMVF9GRVRDSCwgT1JNR2VuQ3VzdG9taXplci5BTllfVEFCTEUsIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUlucHV0U3RyZWFtIGlzdHJlYW0gPSBudWxsOwotCQlPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBudWxsOwotCQl0cnkgCi0JCXsKLQkJCS8vcmVhZCBpdCBpbiBhIGZpbGUgZmlyc3QgdG8gc3BlZWR1cCBkZXNlcmlhbGl6YXRpb24KLQkJCWJ5dGVbXSBieXRlcyA9IEZpbGVVdGlsLnJlYWRGaWxlKGZpbGUpOwotCQkJaXN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0JCQlvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaXN0cmVhbSk7Ci0JCQkKLQkJCUZpbGVIZWFkZXIgaGVhZGVyID0gKEZpbGVIZWFkZXIpb2lzLnJlYWRPYmplY3QoKTsKLQkJCWlmIChoZWFkZXIubVZlcnNpb24gPT0gRklMRV9WRVJTSU9OKSB7Ci0JCQkJT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyID0gKE9STUdlbkN1c3RvbWl6ZXIpb2lzLnJlYWRPYmplY3QoKTsKLQkJCQlyZXN0b3JlKGN1c3RvbWl6ZXIpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUpwdEdlblBsdWdpbi5sb2dFeGNlcHRpb24oIioqKk9STUdlbkN1c3RvbWl6ZXIubG9hZCBmYWlsZWQgIitmaWxlLCBleCk7CQkJCQotCQl9Ci0JCWZpbmFsbHkgCi0JCXsKLQkJCWlmIChvaXMgIT0gbnVsbCkKLQkJCXsKLQkJCQl0cnkgCi0JCQkJewotCQkJCQlvaXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoaXN0cmVhbSAhPSBudWxsKQotCQkJewotCQkJCXRyeSAKLQkJCQl7Ci0JCQkJCWlzdHJlYW0uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBGaWxlIGdldEZpbGUoKXsKLQkJcmV0dXJuIHRoaXMubUZpbGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTY2hlbWEgc2NoZW1hKXsKLQkJdGhpcy5tU2NoZW1hID0gc2NoZW1hOwotCX0KLQotCXB1YmxpYyBTY2hlbWEgZ2V0U2NoZW1hKCl7Ci0JCXJldHVybiBtU2NoZW1hOwotCX0KLQkKLQkvKioKLQkgKiBFbXB0eSBjb25zdHJ1Y3RvciBuZWVkZWQgYnkgdGhlIGRlc2VyaWFsaXphdGlvbi4KLQkgKi8KLQlwdWJsaWMgT1JNR2VuQ3VzdG9taXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY3VzdG9taXphdGlvbiBmaWxlLgotCSAqIFRoZSBmaWxlIGlzIGNyZWF0ZWQgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tT1JNR2VuQ3VzdG9taXplci5zYXZlOiAiICsgbUZpbGUpOwotCQlpZiAoIW1GaWxlLmV4aXN0cygpICYmICFtRmlsZS5jcmVhdGVOZXdGaWxlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLQkJamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbnVsbDsKLQkJYm9vbGVhbiBkZWxldGVJdCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlmb3MgPSBuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKG1GaWxlKTsKLQkJCW9vcyA9IG5ldyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbShmb3MpOwotCQkJRmlsZUhlYWRlciBoZWFkZXIgPSBuZXcgRmlsZUhlYWRlcigpOwotCQkJb29zLndyaXRlT2JqZWN0KGhlYWRlcik7Ci0JCQlvb3Mud3JpdGVPYmplY3QodGhpcyk7Ci0JCQlkZWxldGVJdCA9IGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCS8vZGVsZXRlSXQgaXMgdHJ1ZSwgc28gdGhlIGNhY2hlIGlzIG5vdCBzYXZlZC4KLQkJCUNvcmVFeGNlcHRpb24gY2UgPSBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEdlblBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCSJVbmFibGUgdG8gc2F2ZSB0aGUgT1JNR2VuQ3VzdG9taXplciBmaWxlOiAiK21GaWxlLGV4KSk7Ci0JCQlKcHRHZW5QbHVnaW4ubG9nRXhjZXB0aW9uKCBjZSApOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAob29zIT1udWxsKSBvb3MuY2xvc2UoKTsKLQkJCQlpZiAoZm9zIT1udWxsKSBmb3MuY2xvc2UoKTsKLQkJCQlpZiAoZGVsZXRlSXQpIHsKLQkJCQkJbUZpbGUuZGVsZXRlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleDIpIHt9CQotCQl9Ci0JfQotCQotCXB1YmxpYyBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBnZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXI7Ci0JfQotCXB1YmxpYyB2b2lkIHNldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKSB7Ci0JCWlmIChkYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImRhdGFiYXNlIGFubm90YXRpb24gbmFtZSBidWlsZGVyIGlzIHJlcXVpcmVkIik7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5kYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciA9IGRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyOwotCX0JCi0KLQkvKioKLQkgKiBSZXR1cm5zIHtAbGluayAjR0VORVJBVEVfRERMX0FOTk9UQVRJT059ICBpbmRpY2F0aW5nIHdoZXRoZXIKLQkgKiB0aGUgb3B0aW9uYWwgRERMIHBhcmFtZXRlcnMgbGlrZSBsZW5ndGgsIG51bGxhYmxlLCB1bnFpdWUsIGV0YyBzaG91bGQgYmUgZ2VuZXJhdGVkIAotCSAqIGluIEBDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBkZWZhdWx0cyB0byBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlRERMQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiAidHJ1ZSIuZXF1YWxzKGdldFByb3BlcnR5KEdFTkVSQVRFX0RETF9BTk5PVEFUSU9OLCBBTllfVEFCTEUsIG51bGwpKTsgLy9kZWZhdWx0cyB0byBmYWxzZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0YWJsZU5hbWUsIFN0cmluZyBjb2xOYW1lKSB7Ci0JCVN0cmluZyBrZXkgPSBnZXRQcm9wS2V5KHByb3BlcnR5TmFtZSwgdGFibGVOYW1lLCBjb2xOYW1lKTsKLQkJU3RyaW5nIHZhbHVlID0gbVByb3BzLmdldChrZXkpOwotCQkvKmlmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QgYW5kIGl0IGlzIGEgdGFibGUgcHJvcGVydHkgdGhlbiAKLQkJICogZ2V0IHRoZSBkZWZhdWx0IHRhYmxlIHByb3BlcnR5LiovCi0JCWlmICh2YWx1ZSA9PSBudWxsICYmIHRhYmxlTmFtZSAhPSBudWxsICYmIGNvbE5hbWUgPT0gbnVsbCAmJiAhdGFibGVOYW1lLmVxdWFscyhBTllfVEFCTEUpKSB7Ci0JCQl2YWx1ZSA9IGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgQU5ZX1RBQkxFLCBjb2xOYW1lKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCS8qKgotCSAqIENoYW5nZXMgYSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSwgY291bGQgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUsIFN0cmluZyB0YWJsZU5hbWUsIFN0cmluZyBjb2xOYW1lKSB7Ci0JCVN0cmluZyBrZXkgPSBnZXRQcm9wS2V5KHByb3BlcnR5TmFtZSwgdGFibGVOYW1lLCBjb2xOYW1lKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCW1Qcm9wcy5wdXQoa2V5LCB2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQltUHJvcHMucmVtb3ZlKGtleSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogU2FtZSBhcyB7QGxpbmsgI2dldFByb3BlcnR5KFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfSBidXQgCi0JICogY29udmVydHMgdGhlIHZhbHVlIHRvIGJvb2xlYW4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0YWJsZU5hbWUsIFN0cmluZyBjb2xOYW1lKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGFibGVOYW1lLCBjb2xOYW1lKTsKLQkJcmV0dXJuICJ0cnVlIi5lcXVhbHModmFsdWUpOwotCX0KLQkvKioKLQkgKiBDaGFuZ2VzIGEgdGFibGUgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiB2YWx1ZSwgU3RyaW5nIHRhYmxlTmFtZSwgU3RyaW5nIGNvbE5hbWUpIHsKLQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIsIHRhYmxlTmFtZSwgY29sTmFtZSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSB0YWJsZXMgdG8gZ2VuZXJhdGUuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRUYWJsZU5hbWVzKCkgewotCQlyZXR1cm4gbVRhYmxlTmFtZXMgIT0gbnVsbCA/IG1UYWJsZU5hbWVzIDogamF2YS51dGlsLkNvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZldGNoIHR5cGUgYW5ub3RhdGlvbiBtZW1iZXIgdmFsdWUsIG9yIGVtcHR5IHN0cmluZyAKLQkgKiBpZiBub25lLgotCSAqIEVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIG51bGwgYmVjYXVzZSBWZWxvY2l0eSBkb2VzIG5vdCBsaWtlIG51bGwgCi0JICogd2hlbiB1c2VkIGluICNzZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5GZXRjaChPUk1HZW5UYWJsZSB0YWJsZSkgewotCQlyZXR1cm4gIiI7Ci0JfQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgdGFibGUgdXNlciBzZWxlY3Rpb24gaXMgY2hhbmdlZCBpbiB0aGUgCi0JICogZ2VuZXJhdGlvbiB3aXphcmQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFibGVOYW1lcyhMaXN0PFN0cmluZz4gdGFibGVOYW1lcykgewotCQltVGFibGVOYW1lcyA9IHRhYmxlTmFtZXM7Ci0JCW1UYWJsZXMgPSBudWxsOwotCQltVmFsaWRBc3NvY2lhdGlvbnMgPSBudWxsOyAvL3JlY29tcHV0ZQotCQltSW52YWxpZEZvcmVpZ25Bc3NvY2lhdGlvbnMgPSB0cnVlOyAvL21ha2Ugc3VyZSBmb3JlaWduIGFzc29jaWF0aW9ucyBmcm9tIG5ld2x5IGFkZGVkIHRhYmxlcyBhcmUgY29tcHV0ZWQuCi0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhYmxlIG5hbWVzIHRvIGJlIGdlbmVyYXRlZC4KLQkgKiBUaGlzIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIDxjb2RlPmdldFRhYmxlTmFtZXM8L2NvZGU+IGlmIHRoZXJlIAotCSAqIGFyZSBtYW55LXRvLW1hbnkgam9pbiB0YWJsZXMgYW5kIGFyZSBub3QgY29udHJpYnV0aW5nIAotCSAqIGluIGFueSBvdGhlciBhc3NvY2lhdGlvbnMuCi0JICovCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRHZW5UYWJsZU5hbWVzKCkgIHsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzID0gZ2V0VGFibGVOYW1lcygpOwotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8U3RyaW5nPihuYW1lcy5zaXplKCkpOwotCQkKLQkJLypmaWx0ZXIgb3V0IGpvaW4gdGFibGVzKi8KLQkJTGlzdDxBc3NvY2lhdGlvbj4gYXNzb2NpYXRpb25zID0gZ2V0QXNzb2NpYXRpb25zKCk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiB0YWJsZU5hbWVzSXRlciA9IG5hbWVzLml0ZXJhdG9yKCk7IHRhYmxlTmFtZXNJdGVyLmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgdGFibGVOYW1lID0gdGFibGVOYW1lc0l0ZXIubmV4dCgpOwotCQkJYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLQkJCQotCQkJZm9yIChJdGVyYXRvcjxBc3NvY2lhdGlvbj4gYXNzb2NJdGVyID0gYXNzb2NpYXRpb25zLml0ZXJhdG9yKCk7IGFzc29jSXRlci5oYXNOZXh0KCk7ICkgewotCQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gYXNzb2NJdGVyLm5leHQoKTsKLQkJCQlpZiAoIWFzc29jaWF0aW9uLmlzR2VuZXJhdGVkKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmICh0YWJsZU5hbWUuZXF1YWxzKGFzc29jaWF0aW9uLmdldFJlZmVycmVyVGFibGVOYW1lKCkpCi0JCQkJCQl8fCB0YWJsZU5hbWUuZXF1YWxzKGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSkpIHsKLQkJCQkJaXNWYWxpZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAodGFibGVOYW1lLmVxdWFscyhhc3NvY2lhdGlvbi5nZXRKb2luVGFibGVOYW1lKCkpKSB7Ci0JCQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNWYWxpZCkgewotCQkJCXJlc3VsdC5hZGQodGFibGVOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIDxjb2RlPk9STUdlblRhYmxlPC9jb2RlPiBvYmplY3QgZ2l2ZW4gaXRzIG5hbWUsIG9yIAotCSAqIG51bGwgaWYgbm9uZS4KLQkgKi8KLQlwdWJsaWMgT1JNR2VuVGFibGUgZ2V0VGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgIHsKLQkJaWYgKG1UYWJsZXMgPT0gbnVsbCkgewotCQkJbVRhYmxlcyA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcDxTdHJpbmcsIE9STUdlblRhYmxlPihtVGFibGVOYW1lcy5zaXplKCkpOwotCQl9Ci0JCQotCQlpZihtVGFibGVOYW1lcyE9bnVsbCAmJiBtU2NoZW1hIT1udWxsKXsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbVRhYmxlTmFtZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJCVN0cmluZyBuYW1lID0gaXRlci5uZXh0KCk7Ci0JCQkJVGFibGUgZGJUYWJsZSA9IG1TY2hlbWEuZ2V0VGFibGVOYW1lZCggbmFtZSApOwotCQkJCWlmIChkYlRhYmxlICE9IG51bGwpIHsKLQkJCQkJbVRhYmxlcy5wdXQobmFtZSwgY3JlYXRlR2VuVGFibGUoZGJUYWJsZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbVRhYmxlcy5nZXQodGFibGVOYW1lKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+QXNzb2NpYXRpb248L2NvZGU+IG9iamVjdHMgc29ydGVkIGJ5IHRoZWlyICJmcm9tIiAKLQkgKiB0YWJsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBMaXN0PEFzc29jaWF0aW9uPiBnZXRBc3NvY2lhdGlvbnMoKXsKLQkJcmV0dXJuIGdldEFzc29jaWF0aW9ucyh0cnVlLyp2YWxpZE9ubHkqLyk7Ci0JfQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGFzc29jaWF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFzc29jaWF0aW9uKEFzc29jaWF0aW9uIGFzc29jaWF0aW9uKSAgewotCQlnZXRBc3NvY2lhdGlvbnMoZmFsc2UvKnZhbGlkT25seSovKS5hZGQoYXNzb2NpYXRpb24pOwotCQlpZiAobVZhbGlkQXNzb2NpYXRpb25zICE9IG51bGwpIHsKLQkJCW1WYWxpZEFzc29jaWF0aW9ucy5hZGQoYXNzb2NpYXRpb24pOwotCQl9Ci0JCQotCX0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBnaXZlbiBhc3NvY2lhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVBc3NvY2lhdGlvbihBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbikgIHsKLQkJYm9vbGVhbiByZW1vdmVkID0gZ2V0QXNzb2NpYXRpb25zKGZhbHNlLyp2YWxpZE9ubHkqLykucmVtb3ZlKGFzc29jaWF0aW9uKTsKLQkJYXNzZXJ0KHJlbW92ZWQpOwotCQkKLQkJaWYgKG1WYWxpZEFzc29jaWF0aW9ucyAhPSBudWxsKSB7Ci0JCQlyZW1vdmVkID0gbVZhbGlkQXNzb2NpYXRpb25zLnJlbW92ZShhc3NvY2lhdGlvbik7Ci0JCQlhc3NlcnQocmVtb3ZlZCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGFuIGFzc29jaWF0aW9uIHNpbWlsYXIgdG8gdGhlIGdpdmVuIGFzc29jaWF0aW9uIAotCSAqIGFscmVhZHkgZXhpc3RzLgotCSAqIFRoaXMgaXMgZGVjaWRlZCBiYXNlZCBvbmx5IG9uIHRoZSBhc3NvY2lhdGlvbiB0YWJsZXMgYW5kIGNvbHVtbnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2ltaWxhckFzc29jaWF0aW9uRXhpc3RzKEFzc29jaWF0aW9uIGFzc29jaWF0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPEFzc29jaWF0aW9uPiBpdGVyID0gZ2V0QXNzb2NpYXRpb25zKGZhbHNlLyp2YWxpZE9ubHkqLykuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uMiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmICghYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVycmVyVGFibGVOYW1lKCkpCi0JCQkJCQl8fCAhYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpKQotCQkJCQkJfHwgIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKGFzc29jaWF0aW9uLmdldEpvaW5UYWJsZU5hbWUoKSwgYXNzb2NpYXRpb24yLmdldEpvaW5UYWJsZU5hbWUoKSkKLQkJCQkJCXx8ICFhc3NvY2lhdGlvbi5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkpCi0JCQkJCQl8fCAhYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKSkKLQkJCQkJCSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9CQkJCQkKLQkJCQkvKnRoZSAyIGFzc29jaWF0aW9uIGhhdmUgdGhlIHNhbWUgcmVmZXJyZXIsIHJlZmVyZW5jZWQgYW5kIGpvaW4gdGFibGUqLwotCQkJCWlmIChhc3NvY2lhdGlvbi5nZXRKb2luVGFibGVOYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKGFzc29jaWF0aW9uLmdldFJlZmVycmVySm9pbkNvbHVtbk5hbWVzKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcnJlckpvaW5Db2x1bW5OYW1lcygpKQotCQkJCQkJJiYgYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5OYW1lcygpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5OYW1lcygpKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSA8Y29kZT5PUk1HZW5UYWJsZTwvY29kZT4gaW5zdGFuY2UuIAotCSAqLwotCXB1YmxpYyBPUk1HZW5UYWJsZSBjcmVhdGVHZW5UYWJsZShUYWJsZSBkYlRhYmxlKSB7Ci0JCXJldHVybiBuZXcgT1JNR2VuVGFibGUoZGJUYWJsZSwgdGhpcyk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIDxjb2RlPk9STUdlbkNvbHVtbjwvY29kZT4gaW5zdGFuY2UuCi0JICovCi0JcHJvdGVjdGVkIE9STUdlbkNvbHVtbiBjcmVhdGVHZW5Db2x1bW4oQ29sdW1uIGRiQ29sKSB7Ci0JCXJldHVybiBuZXcgT1JNR2VuQ29sdW1uKGRiQ29sLCB0aGlzKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIG9mIHRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIHNwZWNzIHJlcXVpcmUgdGhlICJtYW55IiBzaWRlIAotCSAqIG9mIGFuIGFzc29jaWF0aW9uIHRvIGJlIHRoZSBvd25lciAobGlrZSBFSkIzKS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYW55U2lkZUlzQXNzb2NpYXRpb25Pd25lcigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZUNvbmZpZ0ZpbGUoKSB7Ci0JCXJldHVybiAhImZhbHNlIi5lcXVhbHMoZ2V0UHJvcGVydHkoVVBEQVRFX0NPTkZJR19GSUxFLCBudWxsLCBudWxsKSk7IC8vZGVmYXVsdHMgdG8gdHJ1ZQotCX0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVDb25maWdGaWxlKGJvb2xlYW4gdmFsdWUpIHsKLQkJaWYgKHZhbHVlKSB7IC8vZGVmYXVsdCBpcyB0cnVlCi0JCQlzZXRQcm9wZXJ0eShVUERBVEVfQ09ORklHX0ZJTEUsIG51bGwsIG51bGwsIG51bGwpOyAvL3JlbW92ZSBpdAotCQl9IGVsc2UgewotCQkJc2V0Qm9vbGVhblByb3BlcnR5KFVQREFURV9DT05GSUdfRklMRSwgdmFsdWUsIG51bGwsIG51bGwpOwotCQl9Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vLS0tLSBWZWxvY2l0eSB0ZW1wbGF0ZXMgbWV0aG9kcwotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZ2V0dGVyIG1ldGhvZCBuYW1lIGdpdmVuIGEgcHJvcGVydHkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHByb3BlcnR5R2V0dGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuICJnZXQiK1N0cmluZ1V0aWwuaW5pdFVwcGVyKHByb3BlcnR5TmFtZSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgYSBzZXR0ZXIgbWV0aG9kIG5hbWUgZ2l2ZW4gYSBwcm9wZXJ0eSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcHJvcGVydHlTZXR0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gInNldCIrU3RyaW5nVXRpbC5pbml0VXBwZXIocHJvcGVydHlOYW1lKTsKLQl9Ci0JcHVibGljIFN0cmluZyBxdW90ZShTdHJpbmcgcykgewotCQlyZXR1cm4gU3RyaW5nVXRpbC5xdW90ZShzLCAnIicpOwotCX0KLQlwdWJsaWMgU3RyaW5nIHF1b3RlKGJvb2xlYW4gYikgewotCQlyZXR1cm4gcXVvdGUoU3RyaW5nLnZhbHVlT2YoYikpOwotCX0KLQlwdWJsaWMgU3RyaW5nIHF1b3RlKGludCBpKSB7Ci0JCXJldHVybiBxdW90ZShTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCS8qKgotCSAqIEFwcGVuZHMgYW4gYW5ub3RhdGlvbiBtZW1iZXIgbmFtZSBhbmQgdmFsdWUgdG8gYW4gZXhpc3RpbmcgYW5ub3RhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcyBUaGUgYW5ub3RhdGlvbiBtZW1iZXJzIHN0cmluZy4KLQkgKgotCSAqIEBwYXJhbSBtZW1iZXJWYWx1ZSBUaGUgbWVtYmVyIHZhbHVlLCBpZiBudWxsIG9yIGVtcHR5IHN0cmluZ3MgdGhlbiAKLQkgKiBub3RoaW5nIGlzIGFwcGVuZWQuCi0JICogCi0JICogQHBhcmFtIHdoZXRoZXIgdG8gZG91YmxlIHF1b3RlIHRoZSBtZW1iZXIgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBhcHBlbmRBbm5vdGF0aW9uKFN0cmluZyBzLCBTdHJpbmcgbWVtYmVyTmFtZSwgU3RyaW5nIG1lbWJlclZhbHVlLCBib29sZWFuIHF1b3RlKSB7Ci0JCWlmIChtZW1iZXJWYWx1ZSA9PSBudWxsIHx8IG1lbWJlclZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBzOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHMpOwotCQlpZiAoYnVmZmVyLmxlbmd0aCgpICE9IDApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZChtZW1iZXJOYW1lKTsKLQkJYnVmZmVyLmFwcGVuZCgnPScpOwotCQlpZiAocXVvdGUpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJyInKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKG1lbWJlclZhbHVlKTsKLQkJaWYgKHF1b3RlKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0pESzFfNSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy0tLS0gcHJpdmF0ZSBtZXRob2RzCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSBjdXN0b21pemF0aW9uIHNldHRpbmdzIGZyb20gdGhlIGdpdmVuIAotCSAqIChwZXJzaXN0ZWQpIGN1c3RvbWl6ZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmUoT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyKSAgewotCQltVGFibGVOYW1lcyA9IGN1c3RvbWl6ZXIubVRhYmxlTmFtZXM7Ci0JCW1Bc3NvY2lhdGlvbnMgPSBjdXN0b21pemVyLm1Bc3NvY2lhdGlvbnM7Ci0JCW1Qcm9wcyA9IGN1c3RvbWl6ZXIubVByb3BzOwotCQltVXBkYXRlUGVyc2lzdGVuY2VYbWwgPSBjdXN0b21pemVyLm1VcGRhdGVQZXJzaXN0ZW5jZVhtbDsKLQkJaWYoIG1TY2hlbWEgPT0gbnVsbCApCi0JCQlyZXR1cm47Ci0JCQotCQkvKnJlbW92ZSBpbnZhbGlkIHRhYmxlIG5hbWVzKi8KLQkJZm9yIChpbnQgaSA9IG1UYWJsZU5hbWVzLnNpemUoKS0xOyBpID49IDA7IC0taSkgewotCQkJU3RyaW5nIHRhYmxlTmFtZSA9IG1UYWJsZU5hbWVzLmdldChpKTsKLQkJCWlmIChtU2NoZW1hLmdldFRhYmxlTmFtZWQoIHRhYmxlTmFtZSkgPT0gbnVsbCkgewotCQkJCW1UYWJsZU5hbWVzLnJlbW92ZShpKTsKLQkJCX0KLQkJfQotCQlpZiggbUFzc29jaWF0aW9ucyE9bnVsbCApewotCQkJLypyZXN0b3JlIHRoZSBhc3NvY2lhdGlvbnMqLwotCQkJZm9yIChJdGVyYXRvcjxBc3NvY2lhdGlvbj4gaXRlciA9IG1Bc3NvY2lhdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJYXNzb2NpYXRpb24ucmVzdG9yZSh0aGlzKTsKLQkJCX0KLQkJCS8qYWRkIHRoZSBmb3JlaWduIGtleXMgYXNzb2NpYXRpb25zIGp1c3QgaW4gY2FzZSB0aGUgdGFibGVzIGNoYW5nZWQgc2luY2UgCi0JCQkgKiB0aGUgbGFzdCB0aW1lIHRoZSBzdGF0ZSB3YXMgcGVyc2lzdGVkLiBQYXNzIGNoZWNrRXhpc3RpbmcgdHJ1ZSBzbyB0aGF0IHRoZSAKLQkJCSAqIGFzc29jaWF0aW9ucyByZXN0b3JlZCBhYm92ZSBhcmUgbm90IG92ZXJ3cml0dGVuLiovCi0JCQlhZGRGb3JlaWduS2V5QXNzb2NpYXRpb25zKHRydWUvKmNoZWNrRXhpc3RpbmcqLyk7Ci0JCQkvLyBzb3J0IG9uIHJlc3RvcmUKLQkJCXNvcnRBc3NvY2lhdGlvbnMoIG1Bc3NvY2lhdGlvbnMgKTsKLQkJfQotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBrZXkgaW4gbVByb3BzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCAKLQkgKiBwcm9wZXJ0eU5hbWUsIHRhYmxlIGFuZCBjb2x1bW4uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcEtleShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBTdHJpbmcgY29sTmFtZSkgewotCQlpZiAodGFibGVOYW1lID09IG51bGwpIHsKLQkJCXRhYmxlTmFtZSA9IE5VTExfVEFCTEU7Ci0JCX0KLQkJaWYgKGNvbE5hbWUgPT0gbnVsbCkgewotCQkJY29sTmFtZSA9IE5VTExfQ09MVU1OOwotCQl9Ci0JCXJldHVybiB0YWJsZU5hbWUgKyAnLicgKyBjb2xOYW1lICsgJy4nICsgcHJvcGVydHlOYW1lOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGlvbnMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoZSAKLQkgKiBjdXJyZW50IHRhYmxlcy4KLQkgKi8KLQlwcml2YXRlIExpc3Q8QXNzb2NpYXRpb24+IGdldEFzc29jaWF0aW9ucyhib29sZWFuIHZhbGlkT25seSl7Ci0JCWlmIChtQXNzb2NpYXRpb25zID09IG51bGwpIHsKLQkJCW1Bc3NvY2lhdGlvbnMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxBc3NvY2lhdGlvbj4oKTsKLQkJCQotCQkJYWRkRm9yZWlnbktleUFzc29jaWF0aW9ucyhmYWxzZS8qY2hlY2tFeGlzdGluZyovKTsKLQkJfSBlbHNlIGlmIChtSW52YWxpZEZvcmVpZ25Bc3NvY2lhdGlvbnMpIHsKLQkJCW1JbnZhbGlkRm9yZWlnbkFzc29jaWF0aW9ucyA9IGZhbHNlOwotCQkJCi0JCQlhZGRGb3JlaWduS2V5QXNzb2NpYXRpb25zKHRydWUvKmNoZWNrRXhpc3RpbmcqLyk7Ci0JCX0KLQkJTGlzdDxBc3NvY2lhdGlvbj4gYXNzb2NpYXRpb25zOwotCQlpZiAodmFsaWRPbmx5KSB7Ci0JCQlpZiAobVZhbGlkQXNzb2NpYXRpb25zID09IG51bGwpIHsKLQkJCQkvKmZpbHRlciBvdXQgdGhlIGludmFsaWQgYXNzb2NpYXRpb25zKi8KLQkJCQltVmFsaWRBc3NvY2lhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFzc29jaWF0aW9uPihtQXNzb2NpYXRpb25zLnNpemUoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIG4gPSBtQXNzb2NpYXRpb25zLnNpemUoKTsgaSA8IG47ICsraSkgewotCQkJCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA9IG1Bc3NvY2lhdGlvbnMuZ2V0KGkpOwotCQkJCQlpZiAoYXNzb2NpYXRpb24uaXNWYWxpZCgpKSB7Ci0JCQkJCQltVmFsaWRBc3NvY2lhdGlvbnMuYWRkKGFzc29jaWF0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWFzc29jaWF0aW9ucyA9IG1WYWxpZEFzc29jaWF0aW9uczsKLQkJfSBlbHNlIHsKLQkJCWFzc29jaWF0aW9ucyA9IG1Bc3NvY2lhdGlvbnM7Ci0JCX0KLQkJcmV0dXJuIGFzc29jaWF0aW9uczsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGFkZEZvcmVpZ25LZXlBc3NvY2lhdGlvbnMoYm9vbGVhbiBjaGVja0V4aXN0aW5nKSB7Ci0JCUxpc3Q8U3RyaW5nPiB0YWJsZU5hbWVzID0gZ2V0VGFibGVOYW1lcygpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IHRhYmxlTmFtZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJT1JNR2VuVGFibGUgdGFibGUgPSBnZXRUYWJsZShpdGVyLm5leHQoKSk7Ci0JCQlhZGRGb3JlaWduS2V5QXNzb2NpYXRpb25zKHRhYmxlLCBjaGVja0V4aXN0aW5nKTsKLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgYWRkRm9yZWlnbktleUFzc29jaWF0aW9ucyhPUk1HZW5UYWJsZSB0YWJsZSwgYm9vbGVhbiBjaGVja0V4aXN0aW5nKSB7Ci0JCWlmKHRhYmxlPT1udWxsKQotCQkJcmV0dXJuOwotCQkKLQkJCi0JCUxpc3Q8Rm9yZWlnbktleUluZm8+IGZLZXlzID0gbnVsbDsKLQkJCi0JCXRyeXsKLQkJCWZLZXlzID0gRFRQVXRpbC5nZXRGb3JlaWduS2V5cyh0YWJsZS5nZXREYlRhYmxlKCkpOwotCQl9Y2F0Y2goRXhjZXB0aW9uIGlzZSl7Ci0JCQkvL3dvcmthcm91bmQgRGFsaSBidWcgZm9yIG5vdwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiggZktleXMuc2l6ZSgpPT0wICkKLQkJCXJldHVybjsKLQkJCi0JCUxpc3Q8QXNzb2NpYXRpb24+IGFkZGVkQXNzb2NpYXRpb25zID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8QXNzb2NpYXRpb24+KCk7Ci0JCWZvciAoSXRlcmF0b3I8Rm9yZWlnbktleUluZm8+IGl0ZXIgPSBmS2V5cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQlGb3JlaWduS2V5SW5mbyBma2kgPSBpdGVyLm5leHQoKTsKLQkJCU9STUdlblRhYmxlIHJlZmVyZW5jZWRUYWJsZSA9IGdldFRhYmxlKGZraS5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkpOwotCQkJaWYgKHJlZmVyZW5jZWRUYWJsZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA9IG5ldyBBc3NvY2lhdGlvbih0aGlzLCB0YWJsZS5nZXROYW1lKCksIGZraS5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkKLQkJCQkJCSwgcmVmZXJlbmNlZFRhYmxlLmdldE5hbWUoKSwgZmtpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpKTsKLQkJCWFzc29jaWF0aW9uLmNvbXB1dGVDYXJkaW5hbGl0eSgpOwotCQkJLy9EZWZlciB0aGUgY2hlY2sgb2Ygc2ltaWxhckFzc29jaWF0aW9uRXhpc3RzIGFmdGVyIGNvbXB1dGVNYW55VG9NYW55KCkKLQkJCS8vb3RoZXJ3aXNlIHRoZSBNVE0gYXNzb2NpYXRpb24gd2lsbCBub3QgY29tcHV0ZWQgY29ycmVjdGx5IGluIHNvbWUgY2FzZXMuCi0JCQkvL2lmIChjaGVja0V4aXN0aW5nICYmIHNpbWlsYXJBc3NvY2lhdGlvbkV4aXN0cyhhc3NvY2lhdGlvbikpIHsKLQkJCS8vCWNvbnRpbnVlOwotCQkJLy99Ci0JCQlhZGRlZEFzc29jaWF0aW9ucy5hZGQoYXNzb2NpYXRpb24pOwotCQl9Ci0JCQotCQlBc3NvY2lhdGlvbiBtMm0gPSBjb21wdXRlTWFueVRvTWFueSh0YWJsZSwgYWRkZWRBc3NvY2lhdGlvbnMpOwotCQlpZiAobTJtICE9IG51bGwpIHsKLQkJCS8qZG8gbm90IGdlbmVyYXRlIHRoZSAyIG1hbnktdG8tb25lKi8KLQkJCWFkZGVkQXNzb2NpYXRpb25zLmNsZWFyKCk7Ci0JCQlhZGRlZEFzc29jaWF0aW9ucy5hZGQoMCwgbTJtKTsKLQkJfQotCQkvL3JlbW92ZSB0aGUgYXNzb2NpYXRpb24gaWYgYWxyZWFkeSBleGlzdGluZwotCQlJdGVyYXRvcjxBc3NvY2lhdGlvbj4gaXQgPSAgYWRkZWRBc3NvY2lhdGlvbnMuaXRlcmF0b3IoKTsgCi0JCXdoaWxlKCBpdC5oYXNOZXh0KCkgKXsKLQkJCUFzc29jaWF0aW9uIG5ld0Fzc29jaWF0aW9uID0gaXQubmV4dCgpOwotCQkJZm9yKCBBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA6IG1Bc3NvY2lhdGlvbnMgKXsKLQkJCQlpZiggbmV3QXNzb2NpYXRpb24uZXF1YWxzKCBhc3NvY2lhdGlvbiApKXsKLQkJCQkJaXQucmVtb3ZlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQltQXNzb2NpYXRpb25zLmFkZEFsbChhZGRlZEFzc29jaWF0aW9ucyk7Ci0JfQotCXByaXZhdGUgQXNzb2NpYXRpb24gY29tcHV0ZU1hbnlUb01hbnkoT1JNR2VuVGFibGUgdGFibGUsIExpc3Q8QXNzb2NpYXRpb24+IGFkZGVkQXNzb2NpYXRpb25zKSB7Ci0JCS8qKiBtYW55LXRvLW1hbnkgYXNzb2NpYXRpb25zIGlmOgotCQkgKiAtIGFkZGVkQXNzb2NpYXRpb25zIGNvbnRhaW5zIDIgbWFueS10by1vbmUgYXNzb2NpYXRpb25zCi0JCSAqIC0gdGFibGVzIHQxIGFuZCB0MiBkb2VzIE5PVCBoYXZlIHRvIGJlIGRpZmZlcmVudCggZm9yIHNlbGYtTVRNLXNlbGYgc2l0dWF0aW9uKQotCQkgKiAtIDxjb2RlPnRhYmxlPC9jb2RlPiBjb250YWlucyBvbmx5IHRoZSBmb3JlaWduIGtleSBjb2x1bW5zLgotCQkgKiAKLQkJICogTm90ZTogZm9sbG93aW5nIHJlc3RyaWN0aW9ucyBoYXZlIGJlZW4gcmVtb3ZlZDoKLQkJICogLXRhYmxlIGhhcyBvbmx5IHR3byBjb2x1bW5zCi0JCSAqIC10MSBhbmQgdDIgbXVzdCBiZSBkaWZmZXJlbnQKLQkJICogLXRoZSBwcmltYXJ5IGtleSBvZiA8Y29kZT50YWJsZTwvY29kZT4gaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgaXRzIGZvcmVpZ24gCi0JCSAqIAlrZXlzIHRvIHQxIGFuZCB0Mi4qLwotCQkKLQkJaWYgKGFkZGVkQXNzb2NpYXRpb25zLnNpemUoKSAhPSAyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJLy9NVE0gdGFibGUgc2hvdWxkIGhhdmUgdHdvIE1UTyByZWxhdGlvbnMgdG8gb3JnaW5hbCB0YWJsZXMKLQkJQXNzb2NpYXRpb24gYXNzb2MxID0gYWRkZWRBc3NvY2lhdGlvbnMuZ2V0KDApOwotCQlBc3NvY2lhdGlvbiBhc3NvYzIgPSBhZGRlZEFzc29jaWF0aW9ucy5nZXQoMSk7Ci0JCWlmIChhc3NvYzEuZ2V0Q2FyZGluYWxpdHkoKSAhPSBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORQotCQkJCXx8IGFzc29jMi5nZXRDYXJkaW5hbGl0eSgpICE9IEFzc29jaWF0aW9uLk1BTllfVE9fT05FKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vTVRNIHRhYmxlIHNob3VsZCBvbmx5IGluY2x1ZGUgZm9yZWlnbiBrZXkgY29sdW1ucwotCQlmb3IoIE9STUdlbkNvbHVtbiBjb2wgOiB0YWJsZS5nZXRDb2x1bW5zKCkpewotCQkJaWYoICFjb2wuaXNGb3JlaWduS2V5KCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0KLQkJT1JNR2VuVGFibGUgdDEgPSBhc3NvYzEuZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCU9STUdlblRhYmxlIHQyID0gYXNzb2MyLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCi0JCWlmKCB0MS5nZXROYW1lKCkuZXF1YWxzKHRhYmxlLmdldE5hbWUoKSkgfHwgdDIuZ2V0TmFtZSgpLmVxdWFscyh0YWJsZS5nZXROYW1lKCkpICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvL01ha2UgYSBndWVzcyB3aGljaCB0YWJsZSBpcyB0aGUgb3duaW5nIHNpZGUgb2YgdGhlIE1UTSByZWxhdGlvbgotCQkvL1NlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY4NDQ1Ci0JCS8vTG9naWMgYm9ycm93ZWQgZnJvbSBEVFBUYWJsZVdyYXBwZXIuZ2V0Sm9pblRhYmxlT3duaW5nRm9yZWlnbktleSgpCi0JCWlmKCAhdGFibGUuZ2V0TmFtZSgpLmVxdWFscyh0MS5nZXROYW1lKCkgKyAiXyIgKyB0Mi5nZXROYW1lKCkgKSApIHsKLQkJCS8vc3dhcCB0MSBhbmQgdDIgIAotCQkJT1JNR2VuVGFibGUgdDMgPSB0MTsKLQkJCXQxPXQyOwotCQkJdDI9dDM7Ci0JCQkvL3N3YXAgYXNzb2MxIGFuZCBhc3NvYzIKLQkJCUFzc29jaWF0aW9uIGFzc29jMz1hc3NvYzE7Ci0JCQlhc3NvYzE9YXNzb2MyOwotCQkJYXNzb2MyPWFzc29jMzsKLQkJfQotCQkKLS8vQ29tbWVudGVkIG91dCBiZWNhdXNlIHRoZSBhc3N1bXB0aW9uIGlzIHRvbyByZXN0cmljdGl2ZTogCi0vL3RoaXMgY2hlY2sgd2lsbCBwcmV2ZW50IGdlbmVyYXRpbmcgTVRNIG1hcHBpbmcgdGFibGUgbm90IGhhdmluZyAKLS8vcHJpbWFyeSBrZXkgZGVmaW5lZCAJCQotLy8JCUxpc3QgcGtOYW1lcyA9IERUUFV0aWwuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWVzKHRhYmxlLmdldERiVGFibGUoKSk7Ci0vLwkJaWYgKHBrTmFtZXMuc2l6ZSgpICE9IHRhYmxlLmdldENvbHVtbk5hbWVzKCkuc2l6ZSgpKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCQlMaXN0IGZrTmFtZXMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdChhc3NvYzEuZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpKTsgLy9jbG9uZSBiZWNhdXNlIHdlIG1vZGlmeSBieSBhZGRBbGwgYmVsb3cKLS8vCQlma05hbWVzLmFkZEFsbChhc3NvYzIuZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpKTsKLS8vCQlpZiAoIUNvbGxlY3Rpb25VdGlsLmVxdWFsc0lnbm9yZU9yZGVyKHBrTmFtZXMsIGZrTmFtZXMpKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLQkJQXNzb2NpYXRpb24gbTJtID0gbmV3IEFzc29jaWF0aW9uKHRoaXMsIHQxLmdldE5hbWUoKS8qcmVmZXJyZXJUYWJsZU5hbWUqLywgYXNzb2MxLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpLypyZWZlcnJlckNvbE5hbWVzKi8KLQkJCQksIHQyLmdldE5hbWUoKS8qcmVmZXJlbmNlZFRhYmxlTmFtZSovLCBhc3NvYzIuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkvKnJlZmVyZW5jZWRDb2xOYW1lcyovCi0JCQkJLCB0YWJsZS5nZXROYW1lKCksIGFzc29jMS5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkvKnJlZmVycmVySm9pbkNvbE5hbWVzKi8sIGFzc29jMi5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkvKnJlZmVyZW5jZWRKb2luQ29sTmFtZXMqLyk7Ci0JCW0ybS5zZXRDdXN0b20oZmFsc2UpOwotCQlyZXR1cm4gbTJtOwotCX0KLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8tLS0tIEZpbGVIZWFkZXIgY2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8qKgotCSAqIFRoZSBoZWFkZXIgb2YgdGhlIGN1c3RvbWl6YXRpb24gZmlsZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWxlSGVhZGVyIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkvKioKLQkJICogU2hvdWxkIGJlIGFyZ3VtZW50LWxlc3MgYmVjYXVzZSBpdCBpcyB1c2VkIGluIAotCQkgKiB0aGUgZGUtc2VyaWFsaXphdGlvbiBwcm9jZXNzLgotCQkgKi8KLQkJcHVibGljIEZpbGVIZWFkZXIoKSB7Ci0JCQltVmVyc2lvbiA9IEZJTEVfVkVSU0lPTjsKLQkJfQotCQlpbnQgbVZlcnNpb247Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzb3J0QXNzb2NpYXRpb25zKCBMaXN0PCBBc3NvY2lhdGlvbiA+IGxpc3QgKSB7Ci0JICAgQ29sbGVjdGlvbnMuc29ydCggbGlzdCwgbmV3IENvbXBhcmF0b3I8IEFzc29jaWF0aW9uID4oKSB7Ci0JICAgICAgcHVibGljIGludCBjb21wYXJlKCBBc3NvY2lhdGlvbiBsaHMsIEFzc29jaWF0aW9uIHJocyApIHsKLQkgICAgICAgICAvLyBzb3J0IGJ5IHJlZmVycmVyIHRhYmxlIG5hbWUgZmlyc3QuLi4KLQkgICAgICAgICBpbnQgdGVzdCA9IGxocy5nZXRSZWZlcnJlclRhYmxlTmFtZSgpLmNvbXBhcmVUbyggcmhzLmdldFJlZmVycmVyVGFibGVOYW1lKCkgKTsKLSAgICAgICAgICAgIGlmKCB0ZXN0ICE9IDAgKQotICAgICAgICAgICAgICAgcmV0dXJuIHRlc3Q7Ci0gICAgICAgICAgICAvLyB0aGVuIGJ5IHJlZmVyZW5jZWQgdGFibGUgbmFtZS4uLgotICAgICAgICAgICAgdGVzdCA9IGxocy5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkuY29tcGFyZVRvKCByaHMuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpICk7Ci0gICAgICAgICAgICBpZiggdGVzdCAhPSAwICkKLSAgICAgICAgICAgICAgIHJldHVybiB0ZXN0OwotICAgICAgICAgICAgLy8gaWYgcmVmZXJyZXIgYW5kIHJlZmVyZW5jZWQgdGFibGVzIGFyZSB0aGUgc2FtZSwgdGhleSBzaG91bGQKLSAgICAgICAgICAgIC8vIGFwcGVhciBuZXh0IHRvIGVhY2ggb3RoZXIKLSAgICAgICAgICAgIHJldHVybiAwOwotCSAgICAgIH0KLQkgICB9ICk7Ci0JfQotCXB1YmxpYyBib29sZWFuIHNob3VsZFVwZGF0ZVBlcnNpc3RlbmNlWG1sKCkgewotCQlyZXR1cm4gbVVwZGF0ZVBlcnNpc3RlbmNlWG1sOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTaG91bGRVcGRhdGVQZXJzaXN0ZW5jZVhtbChib29sZWFuIHVwZGF0ZVBlcnNpc3RlbmNlWG1sKSB7Ci0JCXRoaXMubVVwZGF0ZVBlcnNpc3RlbmNlWG1sID0gdXBkYXRlUGVyc2lzdGVuY2VYbWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9PUk1HZW5UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9PUk1HZW5UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJkZGE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT1JNR2VuVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuRFRQVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuRW50aXR5R2VuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsLlN0cmluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuSmF2YVR5cGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgT1JNIGdlbmVyYXRpb24gcHJvcGVydGllcyBmb3IgYSBkYXRhYmFzZSB0YWJsZS4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIGNyZWF0ZWQvY2hhbmdlZCBieSB0aGUgZ2VuZXJhdGlvbiB3aXphcmQsIGFuZAotICogZ2VuZXJhdGVkIHVzaW5nIFZlbG9jaXR5IHRlbXBsYXRlcy4gVGhlIG1vZGlmaWVkIHByb3BlcnRpZXMgKGlmIGFueSkgYXJlCi0gKiBwZXJzaXN0ZWQvcmV0cmlldmVkIHVzaW5nIDxjb2RlPk9STUdlbkN1c3RvbWl6ZXI8L2NvZGU+LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPUk1HZW5UYWJsZQotewotCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBtQ3VzdG9taXplcjsKLQlwcml2YXRlIExpc3Q8T1JNR2VuQ29sdW1uPiBtQ29sdW1uczsKLQlwcml2YXRlIFRhYmxlIG1EYlRhYmxlOwotCXByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gY29sdW1uVHlwZXNNYXAgPSAgbnVsbDsKLQkvKioKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIFRoZSBkYXRhYmFzZSB0YWJsZSBvciBudWxsIGlmIHRoaXMgdGFibGUgaXMgdXNlZCB0byBnZXQvc2V0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0YWJsZSBwcm9wZXJ0aWVzIChwcm9wZXJ0aWVzIHRoYXQgYXBwbHkgdG8gYWxsCi0JICogICAgICAgICAgICB0YWJsZXMgdW5sZXNzIG92ZXJyaWRlbikuCi0JICovCi0JcHVibGljIE9STUdlblRhYmxlKFRhYmxlIHRhYmxlLCBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIpIHsKLQkJc3VwZXIoKTsKLQkJbURiVGFibGUgPSB0YWJsZTsKLQkJbUN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCX0KLQotCXB1YmxpYyBPUk1HZW5DdXN0b21pemVyIGdldEN1c3RvbWl6ZXIoKSB7Ci0JCXJldHVybiBtQ3VzdG9taXplcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB0YWJsZSBpcyBpcyB1c2VkIHRvIGdldC9zZXQgdGhlIGRlZmF1bHQgdGFibGUKLQkgKiBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdHNUYWJsZSgpIHsKLQkJcmV0dXJuIG1EYlRhYmxlID09IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjdXN0b21pemVkKFN0cmluZyBwcm9wTmFtZSkgewotCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpLmdldFByb3BlcnR5KHByb3BOYW1lLCBnZXROYW1lKCksIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGN1c3RvbWl6ZWRCb29sZWFuKFN0cmluZyBwcm9wTmFtZSkgewotCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wTmFtZSwgZ2V0TmFtZSgpLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21pemVkKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJfQotCQlnZXRDdXN0b21pemVyKCkuc2V0UHJvcGVydHkocHJvcE5hbWUsIHZhbHVlLCBnZXROYW1lKCksIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEN1c3RvbWl6ZWRCb29sZWFuKFN0cmluZyBwcm9wTmFtZSwgYm9vbGVhbiB2YWx1ZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSB2YWx1ZSkgewotCQkJc2V0Q3VzdG9taXplZChwcm9wTmFtZSwgbnVsbCk7IC8vIHJlbW92ZSB0aGUgcHJvcGVydHkKLQkJfQotCQllbHNlIHsKLQkJCWdldEN1c3RvbWl6ZXIoKS5zZXRCb29sZWFuUHJvcGVydHkocHJvcE5hbWUsIHZhbHVlLCBnZXROYW1lKCksIG51bGwpOwotCQl9Ci0JfQotCi0JcHVibGljIFRhYmxlIGdldERiVGFibGUoKSB7Ci0JCXJldHVybiBtRGJUYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YWJsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKG1EYlRhYmxlID09IG51bGwpCi0JCQlyZXR1cm4gT1JNR2VuQ3VzdG9taXplci5BTllfVEFCTEU7Ci0JCXJldHVybiBtRGJUYWJsZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKb2luVGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJaWYgKG1EYlRhYmxlID09IG51bGwpCi0JCQlyZXR1cm4gT1JNR2VuQ3VzdG9taXplci5BTllfVEFCTEU7Ci0JCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IHRoaXMubUN1c3RvbWl6ZXIuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS5idWlsZEpvaW5UYWJsZUFubm90YXRpb25OYW1lKG1EYlRhYmxlKTsKLQkJcmV0dXJuIGFubm90YXRpb25OYW1lICE9IG51bGwgPyBhbm5vdGF0aW9uTmFtZSA6IG1EYlRhYmxlLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkYXRhYmFzZSBzY2hlbWEgY29udGFpbmluZyB0aGUgdGFibGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCWlmIChEVFBVdGlsLmlzRGVmYXVsdFNjaGVtYShtRGJUYWJsZSkgfHwgbURiVGFibGUuZ2V0U2NoZW1hKCk9PW51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHNjaGVtYU5hbWUgPSBtRGJUYWJsZS5nZXRTY2hlbWEoKS5nZXROYW1lKCk7Ci0JCXJldHVybiBzY2hlbWFOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUZvbGRlcihTdHJpbmcgc3JjRm9sZGVyKXsKLQkJc2V0Q3VzdG9taXplZChTUkNfRk9MREVSLCBzcmNGb2xkZXIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUZvbGRlcigpewotCQlTdHJpbmcgc3JjRm9sZGVyID0gY3VzdG9taXplZChTUkNfRk9MREVSKTsKLQkJcmV0dXJuIHNyY0ZvbGRlciA9PSBudWxsID8gIiIgOiBzcmNGb2xkZXI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0U3RhdGVtZW50cygpewotCQlidWlsZENvbHVtblR5cGVzTWFwKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBwYWNrYWdlcyA9IGNvbHVtblR5cGVzTWFwLmtleVNldCgpOwotCQlTdHJpbmdCdWlsZGVyIHJldCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWZvciAoIFN0cmluZyBzIDogcGFja2FnZXMgKSB7Ci0JCQlyZXQuYXBwZW5kKCAiaW1wb3J0ICIgKyBzICsgIjtcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlMaXN0PEFzc29jaWF0aW9uUm9sZT4gYXNzb2NpYXRpb25Sb2xlcyA9IGdldEFzc29jaWF0aW9uUm9sZXMoKTsKLQkJZm9yICggQXNzb2NpYXRpb25Sb2xlIHJvbGUgOiAgYXNzb2NpYXRpb25Sb2xlcyApIHsKLQkJCWlmICggcm9sZS5nZXRDYXJkaW5hbGl0eSgpLmVxdWFscyggQXNzb2NpYXRpb24uT05FX1RPX01BTlkgKQotCQkJCQl8fCByb2xlLmdldENhcmRpbmFsaXR5KCkuZXF1YWxzKCBBc3NvY2lhdGlvbi5NQU5ZX1RPX01BTlkgKSApIHsKLQkJCQlyZXQuYXBwZW5kKCAiaW1wb3J0ICIgKyBnZXREZWZhdWx0Q29sbGVjdGlvblR5cGUoKSArICI7XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmV0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBpbXBvcnQgc3RhdGVtZW50cyBmb3IgdHlwZXMgZnJvbSBqYXZheC5wZXJzaXN0ZW5jZSBwYWNrYWdlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEphdmF4UGVyc2lzdGVuY2VJbXBvcnRTdGF0ZW1lbnRzKCkgewotCQlTdHJpbmdCdWlsZGVyIHJldCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXJldC5hcHBlbmQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5O1xuIik7IC8vJE5PTi1OTFMtMSQKLQkJLy9UT0RPOiBvbmx5IGlmIEBDb2x1bW5zIGlzIG5lZWRlZAotCQlyZXQuYXBwZW5kKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjtcbiIpOy8vJE5PTi1OTFMtMSQKLQkJLy9UT0RPOiBvbmx5IGlmIHRoZXJlIGlzIEBJZAotCQlyZXQuYXBwZW5kKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkO1xuIik7Ly8kTk9OLU5MUy0xJAotCQlpZiggIXRoaXMuaXNEZWZhdWx0bmFtZSgpICkKLQkJCXJldC5hcHBlbmQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGFibGU7XG4iKTsvLyROT04tTkxTLTEkCi0JCWlmKCB0aGlzLmlzQ29tcG9zaXRlS2V5KCkgKQotCQkJcmV0LmFwcGVuZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbWJlZGRlZElkO1xuIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYXBwZW5kIGphdmF4LnBlcnNpc3RlbmNlIHBhY2thZ2UgaW1wb3J0cwotCQlIYXNoU2V0PFN0cmluZz4ganBhSW1wb3J0cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsgCi0JCUxpc3Q8QXNzb2NpYXRpb25Sb2xlPiBhc3NvY2lhdGlvblJvbGVzID0gZ2V0QXNzb2NpYXRpb25Sb2xlcygpOwotCQlmb3IoIEFzc29jaWF0aW9uUm9sZSByb2xlIDogIGFzc29jaWF0aW9uUm9sZXMgKXsKLQkJCWlmKCByb2xlLmdldENhcmRpbmFsaXR5KCkuZXF1YWxzKCBBc3NvY2lhdGlvbi5PTkVfVE9fT05FICkgKXsKLQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTsiICk7Ly8kTk9OLU5MUy0xJAotCQkJfWVsc2V7Ci0JCQkJaWYoIHJvbGUuZ2V0Q2FyZGluYWxpdHkoKS5lcXVhbHMoIEFzc29jaWF0aW9uLk9ORV9UT19NQU5ZICkgKXsKLQkJCQkJanBhSW1wb3J0cy5hZGQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuT25lVG9NYW55O1xuIiApOy8vJE5PTi1OTFMtMSQKLQkJCQl9ZWxzZSBpZiggcm9sZS5nZXRDYXJkaW5hbGl0eSgpLmVxdWFscyggQXNzb2NpYXRpb24uTUFOWV9UT19PTkUgKSApewotCQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU7XG4iICk7Ly8kTk9OLU5MUy0xJAotCQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uO1xuIiApOyAvLyROT04tTkxTLTEkCi0JCQkJfWVsc2UgaWYoIHJvbGUuZ2V0Q2FyZGluYWxpdHkoKS5lcXVhbHMoIEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWSApICl7Ci0JCQkJCWpwYUltcG9ydHMuYWRkKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb01hbnk7XG4iICk7Ly8kTk9OLU5MUy0xJAotCQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luVGFibGU7XG4iICk7Ly8kTk9OLU5MUy0xJAotCQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1ucztcbiIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJanBhSW1wb3J0cy5hZGQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbjtcbiIgKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWZvciggU3RyaW5nIHM6IGpwYUltcG9ydHMpewotCQkJcmV0LmFwcGVuZChzKTsKLQkJfQotCQlyZXR1cm4gcmV0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkQ29sdW1uVHlwZXNNYXAoKXsKLQkJaWYgKCBjb2x1bW5UeXBlc01hcCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29sdW1uVHlwZXNNYXA7Ci0JCX0KLQkJY29sdW1uVHlwZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJZm9yICggT1JNR2VuQ29sdW1uIGNvbCA6IHRoaXMuZ2V0Q29sdW1ucygpICkgewotCQkJU3RyaW5nIHR5cGUgPSBjb2wuZ2V0UHJvcGVydHlUeXBlKCk7Ci0JCQlpZiAoICFjb2wuaXNQYXJ0T2ZDb21wb3NpdGVQcmltYXJ5S2V5KCkKLQkJCQkJJiYgIWNvbC5pc0ZvcmVpZ25LZXkoKQotCQkJCQkmJiAhdHlwZS5zdGFydHNXaXRoKCJqYXZhLmxhbmciKSAmJiB0eXBlLmluZGV4T2YoJy4nKT4wICkgewotCQkJCVN0cmluZyBzaW1wbGVUeXBlPSB0eXBlLnN1YnN0cmluZyggdHlwZS5sYXN0SW5kZXhPZignLicpKzEgKTsKLQkJCQljb2x1bW5UeXBlc01hcC5wdXQodHlwZSwgc2ltcGxlVHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbHVtblR5cGVzTWFwOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNpbXBsaWZpZWRDb2xUeXBlKFN0cmluZyBmcXRuICkgewotCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBidWlsZENvbHVtblR5cGVzTWFwKCk7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IG1hcC5nZXQoZnF0bik7Ci0JCWlmICggIHR5cGVOYW1lICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gdHlwZU5hbWU7Ci0JCX0KLQkJcmV0dXJuIGZxdG47Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHBhY2thZ2UgZm9yIHRoZSBnZW5lcmF0ZWQgY2xhc3MgKGVtcHR5IHN0cmluZyBmb3IgdGhlIGRlZmF1bHQKLQkgKiBwYWNrYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2UoU3RyaW5nIHBrZykgewotCQlnZXRDdXN0b21pemVyKCkuc2V0UHJvcGVydHkoUEFDS0FHRSwgcGtnLCBnZXROYW1lKCksIG51bGwpOyAKLQkJLy8gbm90IGNhbGxpbmcgc2V0Q3VzdG9taXplZCBzbyB0aGF0IGVtcHR5IHN0cmluZ3MgZG8gbm90IGdldCBudWxsZWQgb3V0LgotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmEgcGFja2FnZSAoZW1wdHkgc3RyaW5nIGZvciB0aGUgZGVmYXVsdCBwYWNrYWdlKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2UoKSB7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IGN1c3RvbWl6ZWQoUEFDS0FHRSk7Ci0JCXJldHVybiBwYWNrYWdlTmFtZSA9PSBudWxsID8gIiIgOiBwYWNrYWdlTmFtZTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBKYXZhIGNsYXNzIG5hbWUgKG5vdCBxdWFsaWZpZWQpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGN1c3RvbWl6ZWQoQ0xBU1NfTkFNRSk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCS8vIG5hbWUgPSBTdHJpbmdVdGlsLnRhYmxlTmFtZVRvVmFyTmFtZShnZXROYW1lKCkpOwotCQkJLy8gbmFtZSA9IFN0cmluZ1V0aWwuaW5pdFVwcGVyKG5hbWUpOwotCQkJbmFtZSA9IEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZShnZXROYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCW5hbWUgPSBTdHJpbmdVdGlsLnNpbmd1bGFyaXNlKG5hbWUpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCS8qCi0JCSAqIGlmIHRoZSBjbGFzcyBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSAocG9zc2libHkgY29tcHV0ZWQpIGNsYXNzIG5hbWUKLQkJICogdGhlbiBub3RoaW5nIHRvIGRvCi0JCSAqLwotCQlpZiAoIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKGNsYXNzTmFtZSwgZ2V0Q2xhc3NOYW1lKCkpKSB7Ci0JCQlzZXRDdXN0b21pemVkKENMQVNTX05BTUUsIGNsYXNzTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmFtZSBzdWl0YWJsZSB0byBiZSB1c2VkIGFzIGEgdmFyaWFibGUgb3IgY2xhc3MgbmFtZS4gVGhpcyBpcwotCSAqIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSB0YWJsZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBzaW5ndWxhcgotCSAqICAgICAgICAgICAgV2hldGhlciB0aGUgbmFtZSBzaG91bGQgYmUgc2luZ3VsYXIgb3IgcGx1cmFsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFyTmFtZShib29sZWFuIHNpbmd1bGFyKSB7Ci0JCVN0cmluZyBuYW1lID0gU3RyaW5nVXRpbC50YWJsZU5hbWVUb1Zhck5hbWUoZ2V0TmFtZSgpKTsKLQkJaWYgKHNpbmd1bGFyKSB7Ci0JCQluYW1lID0gU3RyaW5nVXRpbC5zaW5ndWxhcmlzZShuYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCW5hbWUgPSBTdHJpbmdVdGlsLnBsdXJhbGlzZShuYW1lKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgZ2VuZXJhdGVkIEphdmEgY2xhc3MgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHF1YWxpZnkoZ2V0Q2xhc3NOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbXBvc2l0ZSBrZXkgSmF2YSBjbGFzcyBuYW1lIChub3QgcXVhbGlmaWVkKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBvc2l0ZUtleUNsYXNzTmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBjdXN0b21pemVkKENPTVBPU0lURV9LRVlfQ0xBU1NfTkFNRSk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCW5hbWUgPSBnZXRDbGFzc05hbWUoKSArICJQSyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY29tcG9zaXRlIGtleSBKYXZhIGNsYXNzIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRDb21wb3NpdGVLZXlDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBxdWFsaWZ5KGdldENvbXBvc2l0ZUtleUNsYXNzTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21wb3NpdGUga2V5IHByb3BlcnR5IG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWUoKSB7Ci0JCXJldHVybiAiaWQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+T1JNR2VuQ29sdW1uPC9jb2RlPiBvYmplY3RzIHRvIGJlIGdlbmVyYXRlZCBmb3IgdGhpcwotCSAqIHRhYmxlLgotCSAqLwotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0Q29sdW1ucygpIHsKLQkJaWYgKG1Db2x1bW5zID09IG51bGwpIHsKLQkJCW1Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxPUk1HZW5Db2x1bW4+KCk7Ci0JCQlmb3IgKENvbHVtbiBjIDogbURiVGFibGUuZ2V0Q29sdW1ucygpKSB7Ci0JCQkJT1JNR2VuQ29sdW1uIGdlbkNvbHVtbiA9IGdldEN1c3RvbWl6ZXIoKS5jcmVhdGVHZW5Db2x1bW4oYyk7Ci0JCQkJZ2VuQ29sdW1uLnNldEdlblRhYmxlKHRoaXMpOwotCQkJCW1Db2x1bW5zLmFkZChnZW5Db2x1bW4pOwotCQkJfQotCQl9Ci0JCXJldHVybiBtQ29sdW1uczsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldENvbHVtbk5hbWVzKCkgewotCQlMaXN0PFN0cmluZz4gcmV0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoQ29sdW1uIGMgOiBtRGJUYWJsZS5nZXRDb2x1bW5zKCkpIHsKLQkJCXJldC5hZGQoYy5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+T1JNR2VuQ29sdW1uPC9jb2RlPiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgdGFibGUncwotCSAqIHByaW1hcnkga2V5LgotCSAqLwotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiByZXQgPSBuZXcgQXJyYXlMaXN0PE9STUdlbkNvbHVtbj4oKTsKLQkJZm9yIChDb2x1bW4gY29sdW1uIDogbURiVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSkgewotCQkJcmV0LmFkZChuZXcgT1JNR2VuQ29sdW1uKGNvbHVtbiwgdGhpcy5tQ3VzdG9taXplcikpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJpbWFyeSBrZXkgY29sdW1uIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gb3IgbWFueSBwcmltYXJ5IGtleQotCSAqIGNvbHVtbnMuCi0JICovCi0JcHVibGljIE9STUdlbkNvbHVtbiBnZXRQcmltYXJ5S2V5Q29sdW1uKCkgewotCQlPUk1HZW5Db2x1bW4gcGtDb2wgPSBudWxsOwotCQlMaXN0PE9STUdlbkNvbHVtbj4gcGtDb2x1bW5zID0gZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKLQkJaWYgKHBrQ29sdW1ucy5zaXplKCkgPT0gMSkgewotCQkJLy8gQ29sdW1uIGRiQ29sID0gKENvbHVtbilwa0NvbHVtbnMuZ2V0KDApOwotCQkJcGtDb2wgPSBwa0NvbHVtbnMuZ2V0KDApOyAvLyAoT1JNR2VuQ29sdW1uKQotCQkJCQkJCQkJCS8vIG1DdXN0b21pemVyLmNyZWF0ZUdlbkNvbHVtbihkYkNvbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKgotCQkJICogaWYgbm8gcGsgY29sdW1uIHRoZW4gbG9vayBmb3IgdGhlIGZpcnN0IGNvbHVtbiB3aXRoIGlkIG1hcHBpbmcKLQkJCSAqIGtpbmQuIFRoaXMgaXMgc28gdGhhdCB0aGUgd2l6YXJkIGNhbiBiZSB1c2VkIHdpdGggdGFibGVzIG5vdAotCQkJICogaGF2aW5nIHByaW1hcnkga2V5cy4KLQkJCSAqLwotCQkJTGlzdDxPUk1HZW5Db2x1bW4+IGNvbHVtbnMgPSBnZXRDb2x1bW5zKCk7Ci0JCQlmb3IgKGludCBpID0gMCwgbiA9IGNvbHVtbnMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQkJT1JNR2VuQ29sdW1uIGNvbHVtbiA9IGNvbHVtbnMuZ2V0KGkpOwotCQkJCWlmIChjb2x1bW4uZ2V0TWFwcGluZ0tpbmQoKS5lcXVhbHMobUN1c3RvbWl6ZXIuZ2V0SWRNYXBwaW5nS2luZCgpKSkgewotCQkJCQlwa0NvbCA9IGNvbHVtbjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwa0NvbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIDEgcGsgY29sdW1uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29tcG9zaXRlS2V5KCkgewotCQlyZXR1cm4gbURiVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkgPiAxOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPk9STUdlbkNvbHVtbjwvY29kZT4gb2JqZWN0cyBmb3IgdGhlIHRoZSBjb2x1bW5zIHRoYXQKLQkgKiBhcmUgbm90IHBhcnQgb2YgYW55IGFzc29jaWF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBnZW5Pbmx5Ci0JICogICAgICAgICAgICBXaGV0aGVyIHRvIGluY2x1ZGUgb25seSB0aGUgY29sdW1ucyBtYXJrZWQgZm9yIGdlbmVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGluY2x1ZGVQawotCSAqICAgICAgICAgICAgV2hldGhlciB0byBpbmNsdWRlIHRoZSBwcmltYXJ5IGtsZXkgY29sdW1uKHMpLgotCSAqIAotCSAqIEBwYXJhbSBpbmNsdWRlSW5oZXJpdGVkCi0JICogICAgICAgICAgICBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGNvbHVtbnMgYXNzb2NpYXRlZCB3aXRoIEphdmEgcHJvcGVydGllcwotCSAqICAgICAgICAgICAgdGhhdCBleGlzdCBpbiB0aGUgc3VwZXIgY2xhc3MgKGlmIGFueSkuCi0JICovCi0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRTaW1wbGVDb2x1bW5zKGJvb2xlYW4gZ2VuT25seSwgYm9vbGVhbiBpbmNsdWRlUGssIGJvb2xlYW4gaW5jbHVkZUluaGVyaXRlZCkgewotCQlMaXN0PE9STUdlbkNvbHVtbj4gcmVzdWx0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8T1JNR2VuQ29sdW1uPigpOwotCQlMaXN0PE9STUdlbkNvbHVtbj4gY29sdW1ucyA9IGdldENvbHVtbnMoKTsKLQkJTGlzdDxBc3NvY2lhdGlvblJvbGU+IHJvbGVzID0gZ2V0QXNzb2NpYXRpb25Sb2xlcygpOwotCQlmb3IgKGludCBpID0gMCwgbiA9IGNvbHVtbnMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gY29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAoZ2VuT25seSAmJiAhY29sdW1uLmlzR2VuZXJhdGVkKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjb2x1bW4uaXNQcmltYXJ5S2V5KCkpIHsKLQkJCQlpZiAoIWluY2x1ZGVQayB8fCBpc0NvbXBvc2l0ZUtleSgpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdC5hZGQoMCwgY29sdW1uKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoaXNDb2x1bW5JbkFzc2NvY2lhdGlvbihjb2x1bW4sIHJvbGVzKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcmVzdWx0LmFkZChjb2x1bW4pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRTaW1wbGVDb2x1bW5zKCkgewotCQlyZXR1cm4gZ2V0U2ltcGxlQ29sdW1ucyh0cnVlLyogZ2VuT25seSAqLywgdHJ1ZS8qIGluY2x1ZGVQayAqLywgdHJ1ZS8qIGluY2x1ZGVJbmhlcml0ZWQgKi8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZmFsc2UgaWYgdGhlIGdpdmVuIGNvbHVtbiBzaG91bGQgYmUgZ2VuZXJhdGVkIHdpdGggZmFsc2UKLQkgKiB1cGRhdGFibGUvaW5zZXJ0YWJsZS4gVGhpcyBpcyB0aGUgY2FzZSB3aGVuIHRoZSBjb2x1bW4gaXMgbWFwcGVkIG1vcmUKLQkgKiB0aGFuIG9uY2UsIHRoaXMgdXN1YWxseSBoYXBwZW4gd2l0aCBjb2x1bW5zIGluIGNvbXBvc2l0ZSBrZXlzIGFuZAotCSAqIG1hbnktdG8tb25lIGFzc29jaWF0aW9ucy4KLQkgKiAKLQkgKiA8YnI+Ci0JICogTm90ZSB0aGF0IGZvciBIaWJlcm5hdGUgdGhlIGNvbHVtbiBwYXJhbSBpcyBudWxsIGJlY2F1c2UgdGhlCi0JICogaW5zZXJ0L3VwZGF0ZSBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWQgZm9yIHRoZSBtYW55LXRvLW9uZSB0YWcgaXRzZWxmCi0JICogaW5zdGVhZCBvZiB0aGUgbmVzdGVkIGNvbHVtbiB0YWdzIChib2d1cyBvYnZpb3VzbHkpLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29sdW1uVXBkYXRlSW5zZXJ0KEFzc29jaWF0aW9uUm9sZSByb2xlLCBPUk1HZW5Db2x1bW4gY29sdW1uKSB7Ci0JCWlmIChjb2x1bW4gPT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvcjxPUk1HZW5Db2x1bW4+IGl0ZXIgPSByb2xlLmdldFJlZmVycmVyQ29sdW1ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9STUdlbkNvbHVtbiBjID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKCFpc0NvbHVtblVwZGF0ZUluc2VydChyb2xlLCBjKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGNvbHVtbi5pc1ByaW1hcnlLZXkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8qCi0JCSAqIHNob3VsZCBsb29rIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBhc3NvY2lhdGlvbnMgdXNpbmcgdGhlIHNhbWUgY29sdW1uCi0JCSAqIGFuZCByZXR1cm4gZmFsc2UsIGJ1dCB0aGlzIGlzIHByb2JhYmx5IGFuIHVudXN1YWwgY2FzZS4KLQkJICovCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPk9STUdlbkNvbHVtbjwvY29kZT4gb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgotCSAqIGNvbHVtbiBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldENvbHVtbnNCeU5hbWVzKExpc3Q8U3RyaW5nPiBuYW1lcykgewotCQlMaXN0PE9STUdlbkNvbHVtbj4gcmVzdWx0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8T1JNR2VuQ29sdW1uPigpOwotCQlmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBnZXRDb2x1bW5CeU5hbWUobmFtZSk7Ci0JCQlhc3NlcnQgKGNvbHVtbiAhPSBudWxsKTsKLQkJCWlmIChjb2x1bW4gIT0gbnVsbCkgewotCQkJCXJlc3VsdC5hZGQoY29sdW1uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbHVtbnMgaGF2aW5nIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsIGlmIG5vbmUuCi0JICovCi0JcHVibGljIE9STUdlbkNvbHVtbiBnZXRDb2x1bW5CeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IGNvbHVtbnMgPSBnZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gY29sdW1ucy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zLmdldChpKTsKLQkJCWlmIChjb2x1bW4uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBjb2x1bW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+QXNzb2NpYXRpb25Sb2xlPC9jb2RlPiBvYmplY3RzIGZvciB0aGlzIHRhYmxlLiBPbmx5IHRoZQotCSAqIGFzc29jaWF0aW9uIG1hcmtlZCBmb3IgZ2VuZXJhdGlvbiBhcmUgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIExpc3Q8QXNzb2NpYXRpb25Sb2xlPiBnZXRBc3NvY2lhdGlvblJvbGVzKCkgewotCQkvKgotCQkgKiB0aGlzIGlzIG5vdCBjYWNoZWQgaW50ZW50aW9uYWxseSBiZWNhdXNlIGludmFsaWRhdGluZyB0aGUgY2FjaGUgd2l0aAotCQkgKiB3aXphcmQgY2hhbmdlcyBpcyBraW5kYSB0cmlja3kuCi0JCSAqLwotCQlMaXN0PEFzc29jaWF0aW9uUm9sZT4gYXNzb2NpYXRpb25Sb2xlcyA9IG5ldyBBcnJheUxpc3Q8QXNzb2NpYXRpb25Sb2xlPigpOwotCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJTGlzdDxBc3NvY2lhdGlvbj4gYXNzb2NpYXRpb25zID0gbUN1c3RvbWl6ZXIuZ2V0QXNzb2NpYXRpb25zKCk7Ci0JCWZvciAoSXRlcmF0b3I8QXNzb2NpYXRpb24+IGl0ZXIgPSBhc3NvY2lhdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFhc3NvY2lhdGlvbi5pc0dlbmVyYXRlZCgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkvKgotCQkJICogY2hlY2sgYm90aCByZWZlcnJlcmFuZCByZWZlcmVuY2VkIGJlY2F1c2UgYW4gYXNzb2NpYXRpb24gY291bGQgYmUKLQkJCSAqIGZyb20tdG8gdGhlIHNhbWUgdGFibGUgKGVtcGxveWVlL21hbmFnZXIpCi0JCQkgKi8KLQkJCWlmIChhc3NvY2lhdGlvbi5nZXRSZWZlcnJlclRhYmxlKCkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCUFzc29jaWF0aW9uUm9sZSByb2xlID0gYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJSb2xlKCk7Ci0JCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQlhc3NvY2lhdGlvblJvbGVzLmFkZChyb2xlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCUFzc29jaWF0aW9uUm9sZSByb2xlID0gYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFJvbGUoKTsKLQkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJCWFzc29jaWF0aW9uUm9sZXMuYWRkKHJvbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYXNzb2NpYXRpb25Sb2xlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBjdXN0b21pemVkKENMQVNTX0RFU0MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBjbGFzcyBzY29wZSwgb25lIG9mIHtAbGluayAjUFVCTElDX1NDT1BFfXwKLQkgKiB7QGxpbmsgI1BST1RFQ1RFRF9TQ09QRX0gfHtAbGluayAjUFJJVkFURV9TQ09QRX0uIFRoaXMgbWV0aG9kIG5ldmVyCi0JICogcmV0dXJucyBudWxsIChkZWZhdWx0cyB0byBwdWJsaWMpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NTY29wZSgpIHsKLQkJU3RyaW5nIHNjb3BlID0gY3VzdG9taXplZChDTEFTU19TQ09QRSk7Ci0JCWlmIChzY29wZSA9PSBudWxsKSB7Ci0JCQlzY29wZSA9IFBVQkxJQ19TQ09QRTsKLQkJfQotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFeHRlbmRzKCkgewotCQlyZXR1cm4gY3VzdG9taXplZChFWFRFTkRTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeHRlbmRzKFN0cmluZyBiYXNlQ2xhc3MpIHsKLQkJc2V0Q3VzdG9taXplZChFWFRFTkRTLCBiYXNlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SW1wbGVtZW50cygpIHsKLQkJU3RyaW5nIHN0ciA9IGN1c3RvbWl6ZWQoSU1QTEVNRU5UUyk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBTdHJpbmdVdGlsLnN0clRvTGlzdChzdHIsICcsJywgdHJ1ZS8qIHRyaW0gKi8pOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1wbGVtZW50cyhMaXN0PFN0cmluZz4gaW50ZXJmYWNlcykgewotCQlzZXRDdXN0b21pemVkKElNUExFTUVOVFMsIFN0cmluZ1V0aWwubGlzdFRvU3RyKGludGVyZmFjZXMsICcsJykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQgaW4gdGhlIEphdmEgY2xhc3MgZm9yIGV4dGVuZHMKLQkgKiBhbmQgaW1wbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRXh0ZW5kc0ltcGxlbWVudHMoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBleHRlbmRzQ2xhc3MgPSBnZXRFeHRlbmRzKCk7Ci0JCWlmIChleHRlbmRzQ2xhc3MgIT0gbnVsbCAmJiAhZXh0ZW5kc0NsYXNzLmVxdWFscygiamF2YS5sYW5nLk9iamVjdCIpICYmICFleHRlbmRzQ2xhc3MuZXF1YWxzKCJPYmplY3QiKSkgewotCQkJYnVmZmVyLmFwcGVuZCgiZXh0ZW5kcyAiICsgc2ltcGxpZnlDbGFzc05hbWUoZXh0ZW5kc0NsYXNzKSArICIgIik7IC8vZml4IGZvciBidWcgMjc4NjI2Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiaW1wbGVtZW50cyBTZXJpYWxpemFibGUiKTsgLy8gYXNzdW1pbmcgdGhhdCB0aGUgSmF2YQotCQkJCQkJCQkJCQkJCS8vIGZpbGUgdGVtcGxhdGUgaW1wb3J0cyB0aGUKLQkJCQkJCQkJCQkJCQkvLyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGdldEltcGxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIiwgIiArIHNpbXBsaWZ5Q2xhc3NOYW1lKGl0ZXIubmV4dCgpKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHNpbXBsaWZ5Q2xhc3NOYW1lKFN0cmluZyBmdWxsQ2xhc3NOYW1lKSB7Ci0JCWZpbmFsIFN0cmluZyBKQVZBX0xBTkcgPSAiamF2YS5sYW5nLiI7Ci0JCWlmIChmdWxsQ2xhc3NOYW1lLnN0YXJ0c1dpdGgoSkFWQV9MQU5HKSkgewotCQkJcmV0dXJuIGZ1bGxDbGFzc05hbWUuc3Vic3RyaW5nKEpBVkFfTEFORy5sZW5ndGgoKSk7Ci0JCX0KLQkJU3RyaW5nIHBrZyA9IFN0cmluZ1V0aWwuZ2V0UGFja2FnZU5hbWUoZnVsbENsYXNzTmFtZSk7Ci0JCWlmIChwa2cgIT0gbnVsbCAmJiBTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyhwa2csIGdldFBhY2thZ2UoKSkpIHsKLQkJCXJldHVybiBTdHJpbmdVdGlsLmdldENsYXNzTmFtZShmdWxsQ2xhc3NOYW1lKTsKLQkJfQotCQlyZXR1cm4gZnVsbENsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBnZW5lcmF0b3Igc2NoZW1lIChhc3NpZ25lZCwgc2VxdWVuY2UsIGV0YykuIERvZXMgbm90Ci0JICogcmV0dXJuIG51bGwsIGRlZmF1bHRzIHRvICJhc3NpZ25lZCIgb3IgImlkZW50aXR5IiBkZXBlbmRpbmcgb24gd2hldGhlcgotCSAqIHRoZSB0YWJsZSBoYXMgYW4gaWRlbnRpdHkgY29sdW1uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWRHZW5lcmF0b3IoKSB7Ci0JCVN0cmluZyBnZW5lcmF0b3IgPSBjdXN0b21pemVkKElEX0dFTkVSQVRPUik7Ci0JCVN0cmluZyBub25lR2VuZXJhdG9yID0gZ2V0Q3VzdG9taXplcigpLmdldE5vSWRHZW5lcmF0b3IoKTsKLQkJaWYgKCFpc0RlZmF1bHRzVGFibGUoKSkgewotCQkJLyoKLQkJCSAqIFRoaXMgaXMgZG9uZSBtYWlubHkgYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBjYXNlcyB3aGVyZSBzb21lCi0JCQkgKiB0YWJsZXMgaGF2ZSBhdXRvaW5jdGVtZW50IHBrIGFuZCBvdGhlcnMgYXJlIGFzc2lnbmVkLiBJbiB0aGlzCi0JCQkgKiBjYXNlIHRoaXMgbWFrZXMgaXQgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgIm5vbmUiCi0JCQkgKiBkZWZhdWx0IHZhbHVlIHRoYXQgaXMgaW50ZXJwcmV0ZWQgZGVwZW5kaW5nIG9uIHRoZSBjYXNlLgotCQkJICovCi0JCQlpZiAoZ2VuZXJhdG9yID09IG51bGwgfHwgZ2VuZXJhdG9yLmVxdWFscyhub25lR2VuZXJhdG9yKSkgewotCQkJCU9STUdlbkNvbHVtbiBwa0NvbHVtbiA9IGdldFByaW1hcnlLZXlDb2x1bW4oKTsKLQkJCQlpZiAocGtDb2x1bW4gIT0gbnVsbCAmJiBEVFBVdGlsLmlzQXV0b0luY3JlbWVudChwa0NvbHVtbi5nZXREYkNvbHVtbigpKSkgewotCQkJCQlnZW5lcmF0b3IgPSBnZXRDdXN0b21pemVyKCkuZ2V0SWRlbnRpdHlJZEdlbmVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZ2VuZXJhdG9yID09IG51bGwpIHsKLQkJCWdlbmVyYXRvciA9IG5vbmVHZW5lcmF0b3I7Ci0JCX0KLQkJcmV0dXJuIGdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBpZCBnZW5lcmF0b3Igc2NoZW1lIChhc3NpZ25lZCwgc2VxdWVuY2UsIGV0YykuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRHZW5lcmF0b3IoU3RyaW5nIHNjaGVtZSkgewotCQlzZXRDdXN0b21pemVkKElEX0dFTkVSQVRPUiwgc2NoZW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXF1ZW5jZSBuYW1lIGZvciB0aGUgZ2l2ZW4gdGFibGUsIG9yIG51bGwgaWYgbm9uZSAobWFrZXMKLQkgKiBzZW5zZSBvbmx5IHdoZW4gdGhlIHNjaGVtZSBpcyBuYXRpdmUsIHNlcXVlbmNlLCAuLikuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIGN1c3RvbWl6ZWQoU0VRVUVOQ0UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcXVlbmNlKFN0cmluZyBuYW1lKSB7Ci0JCXNldEN1c3RvbWl6ZWQoU0VRVUVOQ0UsIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcXVlbmNlIG5hbWUgYWZ0ZXIgcmVwbGFjaW5nIHRoZSAke3RhYmxlfSBhbmQgJHtwa30gYnkgdGhlaXIKLQkgKiB2YWx1ZXMsIG9yIG51bGwgaWYgbm9uZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm1hdHRlZFNlcXVlbmNlKCkgewotCQlTdHJpbmcgc2VxdWVuY2UgPSBnZXRTZXF1ZW5jZSgpOwotCQlpZiAoc2VxdWVuY2UgIT0gbnVsbCkgewotCQkJLyogcmVzb2x2ZSB0aGUgJHt0YWJsZX0gYW5kICR7cGt9IHBhdHRlcm5zICovCi0JCQlzZXF1ZW5jZSA9IFN0cmluZ1V0aWwuc3RyUmVwbGFjZShzZXF1ZW5jZSwgVEFCTEVfU0VRX1BBVFRFUk4sIGdldE5hbWUoKSk7Ci0JCQlpZiAoc2VxdWVuY2UuaW5kZXhPZihQS19TRVFfUEFUVEVSTikgPj0gMCkgewotCQkJCUl0ZXJhdG9yPENvbHVtbj4gcGtDb2xzID0gZ2V0RGJUYWJsZSgpLmdldFByaW1hcnlLZXlDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJCQlTdHJpbmcgcGtOYW1lID0gcGtDb2xzLmhhc05leHQoKSA/IHBrQ29scy5uZXh0KCkuZ2V0TmFtZSgpIDogbnVsbDsKLQkJCQlzZXF1ZW5jZSA9IFN0cmluZ1V0aWwuc3RyUmVwbGFjZShzZXF1ZW5jZSwgUEtfU0VRX1BBVFRFUk4sIHBrTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNlcXVlbmNlICE9IG51bGwgPyBzZXF1ZW5jZS50b1VwcGVyQ2FzZSgpIDogIiI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsZW1lbnRFcXVhbHMoKSB7Ci0JCXJldHVybiAhInRydWUiLmVxdWFscyhjdXN0b21pemVkKElNUExFTUVOVF9FUVVBTFMpKTsgLy8gZGVmYXVsdHMgdG8KLQkJCQkJCQkJCQkJCQkJCQkvLyBmYWxzZQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEltcGxlbWVudEVxdWFscyhib29sZWFuIHZhbHVlKSB7Ci0JCXNldEN1c3RvbWl6ZWRCb29sZWFuKElNUExFTUVOVF9FUVVBTFMsIHZhbHVlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYW55IGNvbHVtbiBwYXJ0aWNpcGF0aW5nIGluIGVxdWFscy9oYXNoY29kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb2x1bW5zSW5FcXVhbHMoKSB7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiBjb2x1bW5zID0gZ2V0U2ltcGxlQ29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMCwgbiA9IGNvbHVtbnMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gY29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAoY29sdW1uLmlzVXNlSW5FcXVhbHMoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHtAbGluayAjR0VORVJBVEVfRERMX0FOTk9UQVRJT059IGluZGljYXRpbmcgd2hldGhlciB0aGUgb3B0aW9uYWwKLQkgKiBEREwgcGFyYW1ldGVycyBsaWtlIGxlbmd0aCwgbnVsbGFibGUsIHVucWl1ZSwgZXRjIHNob3VsZCBiZSBnZW5lcmF0ZWQgaW4gQENvbHVtbgotCSAqIGFubm90YXRpb24uIGRlZmF1bHRzIHRvIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVERExBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuICJ0cnVlIi5lcXVhbHMoY3VzdG9taXplZChPUk1HZW5DdXN0b21pemVyLkdFTkVSQVRFX0RETF9BTk5PVEFUSU9OKSk7IC8vIGRlZmF1bHRzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0bwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmFsc2UKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZURETEFubm90YXRpb25zKGJvb2xlYW4gZ2VuZXJhdGUpIHsKLQkJc2V0Q3VzdG9taXplZEJvb2xlYW4oT1JNR2VuQ3VzdG9taXplci5HRU5FUkFURV9ERExfQU5OT1RBVElPTiwgZ2VuZXJhdGUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9uZSBvZiB7QGxpbmsgI1BST1BFUlRZX0FDQ0VTU318e0BsaW5rICNGSUVMRF9BQ0NFU1N9IGluZGljYXRpbmcKLQkgKiBob3cgdGhlIGVudGl0eSBwcm9wZXJ0aWVzIGFyZSBtYXBwZWQuIERvZXMgbm90IHJldHVybiBudWxsIChkZWZhdWx0cyB0bwotCSAqIHtAbGluayAjRklFTERfQUNDRVNTfSkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY2Nlc3MoKSB7Ci0JCVN0cmluZyBuYW1lID0gY3VzdG9taXplZChBQ0NFU1MpOwotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQluYW1lID0gRklFTERfQUNDRVNTOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhTdHJpbmcgYWNjZXNzKSB7Ci0JCWFzc2VydCAoYWNjZXNzID09IG51bGwgfHwgYWNjZXNzLmVxdWFscyhQUk9QRVJUWV9BQ0NFU1MpIHx8IGFjY2Vzcy5lcXVhbHMoRklFTERfQUNDRVNTKSk7Ci0JCWlmICghU3RyaW5nVXRpbC5lcXVhbE9iamVjdHMoYWNjZXNzLCBnZXRBY2Nlc3MoKSkpIHsKLQkJCXNldEN1c3RvbWl6ZWQoQUNDRVNTLCBhY2Nlc3MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBvbmUgb2Yge0BsaW5rICNMQVpZX0ZFVENIfXx7QGxpbmsgI0VBR0VSX0ZFVENIfSBpbmRpY2F0aW5nIGhvdwotCSAqIHRoZSB0YWJsZSBhc3NvY2lhdGlvbnMgYXJlIGZlY2hlZC4gUmV0dXJucyBudWxsIGlmIHRoZSBwcm92aWRlciBkZWZhdWx0cwotCSAqIHNob3VsZCBiZSB1c2VkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEZldGNoKCkgewotCQlyZXR1cm4gY3VzdG9taXplZChERUZBVUxUX0ZFVENIKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0RmV0Y2goU3RyaW5nIGZldGNoKSB7Ci0JCWFzc2VydCAoZmV0Y2ggPT0gbnVsbCB8fCBmZXRjaC5lcXVhbHMoTEFaWV9GRVRDSCkgfHwgZmV0Y2guZXF1YWxzKEVBR0VSX0ZFVENIKSk7Ci0JCXNldEN1c3RvbWl6ZWQoREVGQVVMVF9GRVRDSCwgZmV0Y2gpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRDb2xsZWN0aW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10gewotCQkJU0VUX0NPTExFQ1RJT05fVFlQRSwgTElTVF9DT0xMRUNUSU9OX1RZUEUKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9uZSBvZiB7QGxpbmsgI0xJU1RfQ09MTEVDVElPTl9UWVBFfXx7QGxpbmsgI1NFVF9DT0xMRUNUSU9OX1RZUEV9Ci0JICogaW5kaWNhdGluZyB0aGUgSmF2YSB0eXBlIChmdWxsIGNsYXNzIG5hbWUpIHVzZWQgZm9yIHByb3BlcnRpZXMgb2YKLQkgKiBjb2xsZWN0aW9uIHR5cGVzLiBUaGlzIGRvZXMgbm90IHJldHVybiBudWxsIChkZWZhdWx0cyB0byBsaXN0KS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2xsZWN0aW9uVHlwZSgpIHsKLQkJU3RyaW5nIGNUeXBlID0gY3VzdG9taXplZChERUZBVUxUX0NPTExFQ1RJT05fVFlQRSk7Ci0JCWlmIChjVHlwZSA9PSBudWxsKSB7Ci0JCQljVHlwZSA9IFNFVF9DT0xMRUNUSU9OX1RZUEU7Ci0JCX0KLQkJcmV0dXJuIGNUeXBlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNpbXBsZUNvbGxlY3Rpb25UeXBlKCl7Ci0JCSBTdHJpbmcgdHlwZSA9IGdldERlZmF1bHRDb2xsZWN0aW9uVHlwZSgpOwotCQlyZXR1cm4gdHlwZS5zdWJzdHJpbmcoIHR5cGUubGFzdEluZGV4T2YoJy4nKSArMSApOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRDb2xsZWN0aW9uVHlwZShTdHJpbmcgY1R5cGUpIHsKLQkJYXNzZXJ0IChjVHlwZS5lcXVhbHMoTElTVF9DT0xMRUNUSU9OX1RZUEUpIHx8IGNUeXBlLmVxdWFscyhTRVRfQ09MTEVDVElPTl9UWVBFKSk7Ci0JCXNldEN1c3RvbWl6ZWQoREVGQVVMVF9DT0xMRUNUSU9OX1RZUEUsIGNUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByaW1hcnkga2V5IGlzIGNvbXBvdW5kIGFuZCBhbnkgb2YgaXRzIGNvbHVtbnMgc2hvdWxkCi0JICogYmUgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPmVxdWFsczwvY29kZT4gbWV0aG9kIGltcGxlbWVudGF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29tcG91bmRLZXlVc2VJbkVxdWFscygpIHsKLQkJaWYgKGlzQ29tcG9zaXRlS2V5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3I8T1JNR2VuQ29sdW1uPiBpdGVyID0gZ2V0UHJpbWFyeUtleUNvbHVtbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGNvbHVtbi5pc1VzZUluRXF1YWxzKCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGVVc2VJbkVxdWFscyhBc3NvY2lhdGlvblJvbGUgcm9sZSkgewotCQlmb3IgKEl0ZXJhdG9yPE9STUdlbkNvbHVtbj4gaXRlciA9IHJvbGUuZ2V0UmVmZXJyZXJDb2x1bW5zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY29sdW1uLmlzVXNlSW5FcXVhbHMoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWVzIG9mIG5hbWUgZWxlbWVudCBpbiB0aGUgQFRhYmxlIGlzIGRlZmF1bHQgc28gd2UKLQkgKiBjYW4gc2tpcCBnZW5lcmF0aW5nIHRoZSBhbm5vdGF0aW9uCi0JICogCi0JICogQHJldHVybiB0cnVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0bmFtZSgpIHsKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSBnZXRDbGFzc05hbWUoKTsKLQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gdGhpcy5tQ3VzdG9taXplci5nZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpLmJ1aWxkVGFibGVBbm5vdGF0aW9uTmFtZShlbnRpdHlOYW1lLCBtRGJUYWJsZSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uTmFtZSA9PSBudWxsOwotCX0KLQotCS8qKgotCSAqIFF1YWxpZmllcyBhIGNsYXNzIG5hbWUgaWYgdGhlcmUgaXMgYSBwYWNrYWdlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHF1YWxpZnkoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlTdHJpbmcgcGtnID0gZ2V0UGFja2FnZSgpOwotCQlpZiAocGtnICE9IG51bGwgJiYgcGtnLmxlbmd0aCgpICE9IDApIHsKLQkJCWNsYXNzTmFtZSA9IHBrZyArICcuJyArIGNsYXNzTmFtZTsKLQkJfQotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29sdW1uIGlzIHBhcnQgb2YgYW55IGFzc29jaWF0aW9uLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NvbHVtbkluQXNzY29jaWF0aW9uKE9STUdlbkNvbHVtbiBjb2x1bW4sIExpc3Q8QXNzb2NpYXRpb25Sb2xlPiByb2xlcykgewotCQlmb3IgKGludCBpID0gMCwgbiA9IHJvbGVzLnNpemUoKTsgaSA8IG47ICsraSkgewotCQkJQXNzb2NpYXRpb25Sb2xlIHJvbGUgPSByb2xlcy5nZXQoaSk7Ci0JCQlMaXN0PE9STUdlbkNvbHVtbj4gY29scyA9IHJvbGUuZ2V0UmVmZXJyZXJDb2x1bW5zKCk7Ci0JCQlmb3IgKE9STUdlbkNvbHVtbiBjb2wgOiBjb2xzKSB7Ci0JCQkJaWYgKGNvbC5nZXROYW1lKCkuZXF1YWxzKGNvbHVtbi5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgdGhlIGNsYXVzZSB0byBiZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgZXF1YWxzKCkgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlFcXVhbHNDbGF1c2UoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJSXRlcmF0b3I8T1JNR2VuQ29sdW1uPiBjb2x1bW5zID0gdGhpcy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjb2x1bW5zLmhhc05leHQoKSkgewotCQkJdGhpcy5wcmludFByaW1hcnlLZXlFcXVhbHNDbGF1c2VPbihjb2x1bW5zLm5leHQoKSwgYnVmKTsKLQkJCWlmIChjb2x1bW5zLmhhc05leHQoKSkgewotCQkJCWJ1Zi5hcHBlbmQoIlxuIik7Ci0JCQkJYnVmLmFwcGVuZCgiXHRcdFx0Iik7Ci0JCQkJYnVmLmFwcGVuZCgiJiYgIik7Ci0JCQl9Ci0JCX0KLQkJYnVmLmFwcGVuZCgiOyIpOwotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUVxdWFsc0NsYXVzZU9uKE9STUdlbkNvbHVtbiBjb2x1bW4sIFN0cmluZ0J1aWxkZXIgYnVmKSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSBjb2x1bW4uZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCUphdmFUeXBlIGphdmFUeXBlID0gY29sdW1uLmdldERiQ29sdW1uKCkuZ2V0UHJpbWFyeUtleUphdmFUeXBlKCk7Ci0JCWlmIChqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQl0aGlzLnByaW50UHJpbWl0aXZlRXF1YWxzQ2xhdXNlT24oZmllbGROYW1lLCBidWYpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5wcmludFJlZmVyZW5jZUVxdWFsc0NsYXVzZU9uKGZpZWxkTmFtZSwgYnVmKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFByaW1pdGl2ZUVxdWFsc0NsYXVzZU9uKFN0cmluZyBmaWVsZE5hbWUsIFN0cmluZ0J1aWxkZXIgYnVmKSB7Ci0JCWJ1Zi5hcHBlbmQoIih0aGlzLiIpOwotCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCWJ1Zi5hcHBlbmQoIiA9PSBjYXN0T3RoZXIuIik7Ci0JCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJYnVmLmFwcGVuZCgnKScpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFJlZmVyZW5jZUVxdWFsc0NsYXVzZU9uKFN0cmluZyBmaWVsZE5hbWUsIFN0cmluZ0J1aWxkZXIgYnVmKSB7Ci0JCWJ1Zi5hcHBlbmQoInRoaXMuIik7Ci0JCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJYnVmLmFwcGVuZCgiLmVxdWFscyhjYXN0T3RoZXIuIik7Ci0JCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJYnVmLmFwcGVuZCgnKScpOwotCX0KLQotCS8qKgotCSAqIFByaW50IHRoZSBjbGF1c2UgdG8gYmUgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIGhhc0NvZGUoKSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUhhc2hDb2RlQ2xhdXNlKCkgewotCQlTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCUl0ZXJhdG9yPE9STUdlbkNvbHVtbj4gY29sdW1ucyA9IHRoaXMuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoY29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCWJ1Zi5hcHBlbmQoImhhc2ggPSBoYXNoICogcHJpbWUgKyAiKTsKLQkJCXRoaXMucHJpbnRQcmltYXJ5S2V5SGFzaENvZGVDbGF1c2VPbihjb2x1bW5zLm5leHQoKSwgYnVmKTsKLQkJCWJ1Zi5hcHBlbmQoJzsnKTsKLQkJCWJ1Zi5hcHBlbmQoJ1xuJyk7Ci0JCQlidWYuYXBwZW5kKCJcdFx0Iik7Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFByaW1hcnlLZXlIYXNoQ29kZUNsYXVzZU9uKE9STUdlbkNvbHVtbiBjb2x1bW4sIFN0cmluZ0J1aWxkZXIgYnVmKSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSBjb2x1bW4uZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCUphdmFUeXBlIGphdmFUeXBlID0gY29sdW1uLmdldERiQ29sdW1uKCkuZ2V0UHJpbWFyeUtleUphdmFUeXBlKCk7Ci0JCWlmIChqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQl0aGlzLnByaW50UHJpbWl0aXZlSGFzaENvZGVDbGF1c2VPbihqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSwgZmllbGROYW1lLCBidWYpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5wcmludFJlZmVyZW5jZUhhc2hDb2RlQ2xhdXNlT24oZmllbGROYW1lLCBidWYpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWl0aXZlSGFzaENvZGVDbGF1c2VPbihTdHJpbmcgcHJpbWl0aXZlTmFtZSwgU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJpbnQiKSkgewotCQkJLy8gdGhpcy52YWx1ZQotCQkJYnVmLmFwcGVuZCgidGhpcy4iKTsKLQkJCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJfQotCQllbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygic2hvcnQiKSB8fCBwcmltaXRpdmVOYW1lLmVxdWFscygiYnl0ZSIpIHx8IHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJjaGFyIikpIHsgLy8gZXhwbGljaXQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2FzdAotCQkJLy8gKChpbnQpIHRoaXMudmFsdWUpCi0JCQlidWYuYXBwZW5kKCIoKGludCkgdGhpcy4iKTsKLQkJCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJCWJ1Zi5hcHBlbmQoJyknKTsKLQkJfQotCQllbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygibG9uZyIpKSB7IC8vIGNyaWJiZWQgZnJvbSBMb25nI2hhc2hDb2RlKCkKLQkJCS8vICgoaW50KSAodGhpcy52YWx1ZSBeICh0aGlzLnZhbHVlID4+PiAzMikpKQotCQkJYnVmLmFwcGVuZCgiKChpbnQpICh0aGlzLiIpOwotCQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQkJYnVmLmFwcGVuZCgiIF4gKHRoaXMuIik7Ci0JCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCQlidWYuYXBwZW5kKCIgPj4+IDMyKSkpIik7Ci0JCX0KLQkJZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImZsb2F0IikpIHsgLy8gY3JpYmJlZCBmcm9tCi0JCQkJCQkJCQkJCQkJLy8gRmxvYXQjaGFzaENvZGUoKQotCQkJLy8gamF2YS5sYW5nLkZsb2F0LmZsb2F0VG9JbnRCaXRzKHRoaXMudmFsdWUpCi0JCQlidWYuYXBwZW5kKCJqYXZhLmxhbmcuRmxvYXQiKTsKLQkJCWJ1Zi5hcHBlbmQoIi5mbG9hdFRvSW50Qml0cyh0aGlzLiIpOwotCQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQkJYnVmLmFwcGVuZCgnKScpOwotCQl9Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJkb3VibGUiKSkgeyAvLyBjcmliYmVkIGZyb20KLQkJCQkJCQkJCQkJCQkvLyBEb3VibGUjaGFzaENvZGUoKQotCQkJLy8gKChpbnQpIChqYXZhLmxhbmcuRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHModGhpcy52YWx1ZSkgXgotCQkJLy8gKGphdmEubGFuZy5Eb3VibGUuZG91YmxlVG9Mb25nQml0cyh0aGlzLnZhbHVlKSA+Pj4gMzIpKSkKLQkJCWJ1Zi5hcHBlbmQoIigoaW50KSAoIik7Ci0JCQlidWYuYXBwZW5kKCJqYXZhLmxhbmcuRG91YmxlIik7Ci0JCQlidWYuYXBwZW5kKCIuZG91YmxlVG9Mb25nQml0cyh0aGlzLiIpOwotCQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQkJYnVmLmFwcGVuZCgiKSBeICgiKTsKLQkJCWJ1Zi5hcHBlbmQoImphdmEubGFuZy5Eb3VibGUiKTsKLQkJCWJ1Zi5hcHBlbmQoIi5kb3VibGVUb0xvbmdCaXRzKHRoaXMuIik7Ci0JCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCQlidWYuYXBwZW5kKCIpID4+PiAzMikpKSIpOwotCQl9Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJib29sZWFuIikpIHsKLQkJCS8vICh0aGlzLnZhbHVlID8gMSA6IDApCi0JCQlidWYuYXBwZW5kKCIodGhpcy4iKTsKLQkJCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJCWJ1Zi5hcHBlbmQoIiA/IDEgOiAwKSIpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihwcmltaXRpdmVOYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFJlZmVyZW5jZUhhc2hDb2RlQ2xhdXNlT24oU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJYnVmLmFwcGVuZCgidGhpcy4iKTsKLQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQlidWYuYXBwZW5kKCIuaGFzaENvZGUoKSIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAibmFtZT0iICsgdGhpcy5nZXROYW1lKCkgKyAiOyBjb2x1bW5zPSIgKyBBcnJheXMudG9TdHJpbmcodGhpcy5nZXRDb2x1bW5OYW1lcygpLnRvQXJyYXkoKSk7Ci0JfQotCi0JLyogY2xhc3Mgc2NvcGVzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX1NDT1BFID0gInB1YmxpYyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9URUNURURfU0NPUEUgPSAicHJvdGVjdGVkIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSVZBVEVfU0NPUEUgPSAicHJpdmF0ZSI7Ci0KLQkvKiBhY2Nlc3MgY29uc3RhbnRzLiBOb3RlIHRoYXQgdGhlc2Ugc3RyaW5ncyBhcmUgdXNlZCBpbiB0aGUgdWkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BQ0NFU1MgPSAicHJvcGVydHkiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfQUNDRVNTID0gImZpZWxkIjsKLQotCS8qCi0JICogZGVmYXVsdCBmZWNoIGNvbnN0YW50cy4gTm90ZSB0aGF0IHRoZXNlIHN0cmluZ3MgYXJlIHVzZWQgaW4gdGhlIGdlbgotCSAqIHZlbG9jaXR5IHRlbXBsYXRlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZFVENIID0gImRlZmF1bHRGZXRjaCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVpZX0ZFVENIID0gImxhenkiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFHRVJfRkVUQ0ggPSAiZWFnZXIiOwotCi0JLyoKLQkgKiBkZWZhdWx0IGNvbGxlY3Rpb24gdHlwZSBjb25zdGFudHMuIE5vdGUgdGhhdCB0aGVzZSBzdHJpbmdzIGFyZSB1c2VkIGluCi0JICogdGhlIGdlbiB2ZWxvY2l0eSB0ZW1wbGF0ZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9DT0xMRUNUSU9OX1RZUEUgPSAiamF2YS51dGlsLkxpc3QiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0NPTExFQ1RJT05fVFlQRSA9ICJqYXZhLnV0aWwuU2V0IjsKLQotCS8qKgotCSAqIFRoZSBwYXR0ZXJuIHJlcGxhY2VkIGJ5IHRoZSB0YWJsZSBuYW1lIGluIHRoZSBpZCBnZW5lcmF0b3Igc2VxdWVuY2UgbmFtZQotCSAqIHBhcmFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX1NFUV9QQVRURVJOID0gIiR0YWJsZSI7Ci0KLQkvKioKLQkgKiBUaGUgcGF0dGVybiByZXBsYWNlZCBieSB0aGUgcHJpbWFyeSBrZXkgaW4gdGhlIGlkIGdlbmVyYXRvciBzZXF1ZW5jZSBuYW1lCi0JICogcGFyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtfU0VRX1BBVFRFUk4gPSAiJHBrIjsKLQotCS8qIGN1c3RvbWl6YXRpb24gcHJvcGVydGllcyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFID0gInBhY2thZ2UiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQ19GT0xERVIgPSAic3JjRm9sZGVyIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FID0gImNsYXNzTmFtZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfREVTQyA9ICJjbGFzc0Rlc2MiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX1NDT1BFID0gImNsYXNzU2NvcGUiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVORFMgPSAiZXh0ZW5kcyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UUyA9ICJpbXBsZW1lbnRzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9HRU5FUkFUT1IgPSAiaWRHZW5lcmF0b3IiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNFID0gInNlcXVlbmNlIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT1NJVEVfS0VZX0NMQVNTX05BTUUgPSAiY29tcG9zaXRlS2V5Q2xhc3NOYW1lIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMRU1FTlRfRVFVQUxTID0gImltcGxlbWVudEVxdWFscyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTID0gImFjY2VzcyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT0xMRUNUSU9OX1RZUEUgPSAiZGVmYXVsdENvbGxlY3Rpb25UeXBlIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT3ZlcndyaXRlQ29uZmlybWVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL092ZXJ3cml0ZUNvbmZpcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmJmMjdkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT3ZlcndyaXRlQ29uZmlybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgT3ZlcndyaXRlQ29uZmlybWVyIHsKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IGdlbmVyYXRvciBzaG91bGQgb3ZlcndyaXRlIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLgotCSAqLwotCWJvb2xlYW4gb3ZlcndyaXRlKFN0cmluZyBjbGFzc05hbWUpOwotCi0KLQlmaW5hbCBjbGFzcyBBbHdheXMgaW1wbGVtZW50cyBPdmVyd3JpdGVDb25maXJtZXIgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIE92ZXJ3cml0ZUNvbmZpcm1lciBJTlNUQU5DRSA9IG5ldyBBbHdheXMoKTsKLQkJcHVibGljIHN0YXRpYyBPdmVyd3JpdGVDb25maXJtZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEFsd2F5cygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gZXZlcnl0aGluZyB3aWxsIGJlIG92ZXJ3cml0dGVuCi0JCXB1YmxpYyBib29sZWFuIG92ZXJ3cml0ZShTdHJpbmcgYXJnMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk92ZXJ3cml0ZUNvbmZpcm1lci5BbHdheXMiOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQlmaW5hbCBjbGFzcyBOZXZlciBpbXBsZW1lbnRzIE92ZXJ3cml0ZUNvbmZpcm1lciB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgT3ZlcndyaXRlQ29uZmlybWVyIElOU1RBTkNFID0gbmV3IE5ldmVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgT3ZlcndyaXRlQ29uZmlybWVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOZXZlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gbm90aGluZyB3aWxsIGJlIG92ZXJ3cml0dGVuCi0JCXB1YmxpYyBib29sZWFuIG92ZXJ3cml0ZShTdHJpbmcgYXJnMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJPdmVyd3JpdGVDb25maXJtZXIuTmV2ZXIiOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9QYWNrYWdlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL1BhY2thZ2VHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U2YzI1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL1BhY2thZ2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LlZlbG9jaXR5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LmFwcC5WZWxvY2l0eUVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUubG9nLkpka0xvZ0NodXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5Db21waWxhdGlvblVuaXRNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsLlVybFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBUaGlzIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGEgcGFja2FnZSBvZiBlbnRpdGllcyBmb3IgYSBzZXQgb2YgdGFibGVzLgotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZUdlbmVyYXRvciB7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dFUl9OQU1FID0gIm9yZy5lY2xpcHNlLmpwdC5lbnRpdGllcy5nZW4ubG9nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCXByaXZhdGUgZmluYWwgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyOwotCXByaXZhdGUgZmluYWwgT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMjApOwotCQlQYWNrYWdlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBQYWNrYWdlR2VuZXJhdG9yKGpwYVByb2plY3QsIGN1c3RvbWl6ZXIsIG92ZXJ3cml0ZUNvbmZpcm1lcik7Ci0JCXNtLndvcmtlZCgxKTsKLQkJdHJ5IHsKLQkJCWdlbmVyYXRvci5kb0dlbmVyYXRlKHNtLm5ld0NoaWxkKDE5KSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEdlblBsdWdpbi5QTFVHSU5fSUQsIEpwdEdlbk1lc3NhZ2VzLkVycm9yX0dlbmVyYXRpbmdfRW50aXRpZXMsIGUpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFBhY2thZ2VHZW5lcmF0b3IoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIsIE92ZXJ3cml0ZUNvbmZpcm1lciBjb25maXJtZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5jdXN0b21pemVyID0gY3VzdG9taXplcjsKLQkJdGhpcy5vdmVyd3JpdGVDb25maXJtZXIgPSBjb25maXJtZXI7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0Q3VzdG9taXplcigpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKLQl9Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldEphdmFQcm9qZWN0KCk7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIHZvaWQgZG9HZW5lcmF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQlnZW5lcmF0ZUludGVybmFsKG1vbml0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlSW50ZXJuYWwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSB0ZW1wbERpciA9IHByZXBhcmVUZW1wbGF0ZXNGb2xkZXIoKTsKLQotCQlMaXN0PFN0cmluZz4gZ2VuQ2xhc3NlcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJTGlzdDxTdHJpbmc+IHRhYmxlTmFtZXMgPSB0aGlzLmN1c3RvbWl6ZXIuZ2V0R2VuVGFibGVOYW1lcygpOwotCi0JCS8qIC5qYXZhIHBlciB0YWJsZSwgcGVyc2lzdGVuY2UueG1sLCByZWZyZXNoIHBhY2thZ2UgZm9sZGVyICovCi0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgdGFibGVOYW1lcy5zaXplKCkgKyAyKTsKLQotCi0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gdGFibGVOYW1lcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmIChzbS5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgdGFibGVOYW1lID0gaXRlci5uZXh0KCk7Ci0JCQlPUk1HZW5UYWJsZSB0YWJsZSA9IHRoaXMuY3VzdG9taXplci5nZXRUYWJsZSh0YWJsZU5hbWUpOwotCi0JCQlTdHJpbmcgY2xhc3NOYW1lID0gdGFibGUuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCk7Ci0KLQkJCWdlbmVyYXRlQ2xhc3ModGFibGUsIHRlbXBsRGlyLmdldEFic29sdXRlUGF0aCgpLCBzbS5uZXdDaGlsZCgxLCBTdWJNb25pdG9yLlNVUFBSRVNTX05PTkUpKTsKLQotCQkJZ2VuQ2xhc3Nlcy5hZGQoY2xhc3NOYW1lKTsKLQkJCS8qCi0JCQkgKiBhZGQgdGhlIGNvbXBvc2l0ZSBrZXkgY2xhc3MgdG8gcGVyc2lzdGVuY2UueG1sIGJlY2F1c2Ugc29tZSAKLQkJCSAqIEpQQSBwcm92aWRlcihlLmcuIEtvZG8pIHJlcXVpcmVzIGl0LiBIaWJlcm5hdGUgZG9lc24ndCBzZWVtIHRvIGNhcmUpLiAKLQkJCSAqLwotCQkJaWYgKHRhYmxlLmlzQ29tcG9zaXRlS2V5KCkpIHsKLQkJCQlnZW5DbGFzc2VzLmFkZCh0YWJsZS5nZXRRdWFsaWZpZWRDb21wb3NpdGVLZXlDbGFzc05hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvL3VwZGF0ZSBwZXJzaXN0ZW5jZS54bWwKLQkJaWYgKHRoaXMuY3VzdG9taXplci5zaG91bGRVcGRhdGVQZXJzaXN0ZW5jZVhtbCgpKSB7Ci0JCQl1cGRhdGVQZXJzaXN0ZW5jZVhtbChnZW5DbGFzc2VzKTsKLQkJfQotCQlzbS53b3JrZWQoMik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVQZXJzaXN0ZW5jZVhtbChmaW5hbCBMaXN0PFN0cmluZz4gZ2VuQ2xhc3NlcykgewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuanBhUHJvamVjdC5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkvL3RoZSByZXNvdXJjZSB3b3VsZCBvbmx5IGJlIG51bGwgaWYgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGhhZCBhbiBpbnZhbGlkIGNvbnRlbnQgdHlwZSwKLQkJCS8vZG8gbm90IGF0dGVtcHQgdG8gdXBkYXRlCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlyZXNvdXJjZS5tb2RpZnkobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gUGFja2FnZUdlbmVyYXRvci50aGlzLmpwYVByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpOwotCQkJCWlmIChwZXJzaXN0ZW5jZSA9PSBudWxsKSB7Ci0JCQkJCS8vIGludmFsaWQgY29udGVudCwgZG8gbm90IGF0dGVtcHQgdG8gdXBkYXRlCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdDsKLQkJCQkvLyBjcmVhdGUgYSBwZXJzaXN0ZW5jZSB1bml0IGlmIG9uZSBkb2Vzbid0IGFscmVhZHkgZXhpc3QKLQkJCQlpZiAocGVyc2lzdGVuY2UucGVyc2lzdGVuY2VVbml0c1NpemUoKSA9PSAwKSB7Ci0JCQkJCXBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlLmFkZFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJCQlwZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZShQYWNrYWdlR2VuZXJhdG9yLnRoaXMuanBhUHJvamVjdC5nZXROYW1lKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHdlIG9ubHkgc3VwcG9ydCBvbmUgcGVyc2lzdGVuY2UgdW5pdCAtIHRha2UgdGhlIGZpcnN0IG9uZQotCQkJCQlwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZVVuaXRzKCkubmV4dCgpOwotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gZ2VuQ2xhc3Nlcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gc3RyZWFtLm5leHQoKTsKLQkJCQkJaWYgKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHBlcnNpc3RlbmNlVW5pdC5tYXBwaW5nRmlsZVJlZnNDb250YWluaW5nKGNsYXNzTmFtZSkpICYmICFwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVzUGVyc2lzdGVudFR5cGUoY2xhc3NOYW1lKSkgewotCQkJCQkJcGVyc2lzdGVuY2VVbml0LmFkZFNwZWNpZmllZENsYXNzUmVmKGNsYXNzTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgRmlsZSBwcmVwYXJlVGVtcGxhdGVzRm9sZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24sCi0JCQlDb3JlRXhjZXB0aW9uIHsKLQkJLy9QcmVwYXJlIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSBmb2xkZXI6Ci0JCS8vSWYgdGhlIHBsdWctaW4gaXMgcGFja2FnZWQgYXMgYSBKQVIsIHdlIG5lZWQgZXh0cmFjdCB0aGUgdGVtcGxhdGUgCi0JCS8vZm9sZGVyIGludG8gdGhlIHBsdWctaW4gc3RhdGUgbG9jYXRpb24uIFRoaXMgaXMgcmVxdWlyZWQgYnkgVmVsb2NpdHkKLQkJLy9zaW5jZSB3ZSB1c2UgaW5jbHVkZWQgdGVtcGxhdGVzLgotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKEpwdEdlblBsdWdpbi5QTFVHSU5fSUQpOwotCQlTdHJpbmcgdGVtcGxhdGVzUGF0aCA9ICJ0ZW1wbGF0ZXMvZW50aXRpZXMvIjsgIC8vJE5PTi1OTFMtMSQKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoIHRlbXBsYXRlc1BhdGgpOwotCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IuZmluZChidW5kbGUsIHBhdGgsIG51bGwpOwotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0R2VuUGx1Z2luLlBMVUdJTl9JRCwgIEpwdEdlbk1lc3NhZ2VzLlRlbXBsYXRlc19ub3RGb3VuZCArICIgIisgIEpwdEdlblBsdWdpbi5QTFVHSU5fSUQgKyAiLyIgKyB0ZW1wbGF0ZXNQYXRoKSApOy8vJE5PTi1OTFMtMSQKLQkJfQkJCi0JCVVSTCB0ZW1wbFVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLQkJCi0JCS8vSGF2ZSB0aGlzIGNoZWNrIHNvIHRoYXQgdGhlIGNvZGUgd291bGQgd29yayBpbiBib3RoIFBERSBhbmQgSkFSZWQgcGx1Zy1pbiBhdCBydW50aW1lCi0JCUZpbGUgdGVtcGxEaXIgPSBudWxsOwotCQlpZiAoVXJsVXRpbC5pc0phclVybCh0ZW1wbFVybCkpIHsKLQkJCXRlbXBsRGlyID0gRmlsZVV0aWwuZXh0cmFjdEZpbGVzRnJvbUJ1bmRsZSggdGVtcGxVcmwsIGJ1bmRsZSwgdGVtcGxhdGVzUGF0aCApOwotCQl9IGVsc2UgewotCQkJdGVtcGxEaXIgPSBVcmxVdGlsLmdldFVybEZpbGUodGVtcGxVcmwpOwotCQl9Ci0JCQotCi0JCWlmICh0ZW1wbERpciA9PSBudWxsIHx8ICF0ZW1wbERpci5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRHZW5QbHVnaW4uUExVR0lOX0lELCAgSnB0R2VuTWVzc2FnZXMuVGVtcGxhdGVzX25vdEZvdW5kICsgIiAiKyAgSnB0R2VuUGx1Z2luLlBMVUdJTl9JRCApICk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0ZW1wbERpcjsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZXMvQ3JlYXRlcyB0aGUgLmphdmEgZmlsZSBjb3JyZXNwb25kaW5nIHRvIGEgZGF0YWJhc2UgdGFibGUgCi0JICogd2l0aCB0aGUgZ2l2ZW4gY29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxEaXIgVGhlIHZlbG9jaXR5IHRlbXBsYXRlIGZpbGUgZGlyZWN0b3J5LiBJdCBpcyBhc3N1bWVkIAotCSAqIHRoYXQgdGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIDIgZmlsZXMgPGVtPm1haW4uamF2YS52bTwvZW0+IAotCSAqIGFuZCA8ZW0+cGsuamF2YS52bTwvZW0+IAotCSAqIEBwYXJhbSBwcm9ncmVzcyAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUNsYXNzKE9STUdlblRhYmxlIHRhYmxlLCBTdHJpbmcgdGVtcGxhdGVEaXJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVN0cmluZyBzdWJUYXNrTmFtZSA9IE5MUy5iaW5kKEpwdEdlbk1lc3NhZ2VzLkVudGl0eUdlbmVyYXRvcl90YXNrTmFtZSwgdGFibGUuZ2V0TmFtZSgpKTsKLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBzdWJUYXNrTmFtZSwgMTApOwotCi0JCXRyeSB7Ci0JCQlJRm9sZGVyIGphdmFQYWNrYWdlRm9sZGVyID0gZ2V0SmF2YVBhY2thZ2VGb2xkZXIodGFibGUsIG1vbml0b3IpOwotCQkJSUZpbGUgamF2YUZpbGUgPSBqYXZhUGFja2FnZUZvbGRlci5nZXRGaWxlKCB0YWJsZS5nZXRDbGFzc05hbWUoKSArICIuamF2YSIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWlmIChqYXZhRmlsZS5leGlzdHMoKSkgewotCQkJCWlmICh0aGlzLm92ZXJ3cml0ZUNvbmZpcm1lciAhPSBudWxsICYmICF0aGlzLm92ZXJ3cml0ZUNvbmZpcm1lci5vdmVyd3JpdGUoamF2YUZpbGUuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJLy9KZGtMb2dDaHV0ZSBpbiB0aGlzIHZlcnNpb24gb2YgVmVsb2NpdHkgbm90IGFsbG93IHRvIHNldCBsb2cgbGV2ZWwKLQkJCS8vV29ya2Fyb3VuZCBieSBwcmVzZXQgdGhlIGxvZyBsZXZlbCBiZWZvcmUgVmVsb2NpdHkgaXMgaW5pdGlhbGl6ZWQKLQkJCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCBMT0dHRVJfTkFNRSApOwotCQkJbG9nZ2VyLnNldExldmVsKCBMZXZlbC5TRVZFUkUgKTsKLQkJCQotCQkJUHJvcGVydGllcyB2ZXAgPSBuZXcgUHJvcGVydGllcygpOwotCQkJdmVwLnNldFByb3BlcnR5KCJmaWxlLnJlc291cmNlLmxvYWRlci5wYXRoIiwgdGVtcGxhdGVEaXJQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJdmVwLnNldFByb3BlcnR5KCBKZGtMb2dDaHV0ZS5SVU5USU1FX0xPR19KREtfTE9HR0VSLCBMT0dHRVJfTkFNRSApOwotCQkJVmVsb2NpdHlFbmdpbmUgdmUgPSBuZXcgVmVsb2NpdHlFbmdpbmUoKTsKLQkJICAgIHZlLmluaXQodmVwKTsKLQkJICAgIHNtLndvcmtlZCgyKTsKLQkJICAgIAotCQkgICAgZ2VuZXJhdGVKYXZhRmlsZSh0YWJsZSwgamF2YUZpbGUsIHZlLCAibWFpbi5qYXZhLnZtIiwgdHJ1ZS8qaXNEb21haW5DbGFzcyovLCBzbS5uZXdDaGlsZCg2KSk7IC8vJE5PTi1OTFMtMSQKLQkJICAgIAotCQkgICAgaWYgKHRhYmxlLmlzQ29tcG9zaXRlS2V5KCkpIHsKLQkJICAgIAlJRmlsZSBjb21wb3NpdGVLZXlGaWxlID0gamF2YVBhY2thZ2VGb2xkZXIuZ2V0RmlsZSggdGFibGUuZ2V0Q29tcG9zaXRlS2V5Q2xhc3NOYW1lKCkrIi5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQkJICAgIAlnZW5lcmF0ZUphdmFGaWxlKHRhYmxlLCBjb21wb3NpdGVLZXlGaWxlLCB2ZSwgInBrLmphdmEudm0iLCBmYWxzZS8qaXNEb21haW5DbGFzcyovLCBzbS5uZXdDaGlsZCgxKSk7IC8vJE5PTi1OTFMtMSQKLQkJICAgIH0KLQkJICAgIGVsc2UgewotCQkgICAgCXNtLnNldFdvcmtSZW1haW5pbmcoMSk7Ci0JCSAgICB9Ci0JCQlqYXZhRmlsZS5yZWZyZXNoTG9jYWwoMSwgc20ubmV3Q2hpbGQoMSkpOwotCQkJCi0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlDb3JlRXhjZXB0aW9uIGNlID0gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRHZW5QbHVnaW4uUExVR0lOX0lELCBKcHRHZW5NZXNzYWdlcy5UZW1wbGF0ZXNfbm90Rm91bmQgKyAiIiArIEpwdEdlblBsdWdpbi5QTFVHSU5fSUQgLCBlKSApOy8vJE5PTi1OTFMtMSQKLQkJCUpwdEdlblBsdWdpbi5sb2dFeGNlcHRpb24oIGNlICk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSmF2YUZpbGUoT1JNR2VuVGFibGUgdGFibGUsIElGaWxlIGphdmFGaWxlLCBWZWxvY2l0eUVuZ2luZSB2ZQotCQkJLCBTdHJpbmcgdGVtcGxhdGVOYW1lLCBib29sZWFuIGlzRG9tYWluQ2xhc3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVZlbG9jaXR5Q29udGV4dCBjb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOwotICAgICAgICBjb250ZXh0LnB1dCgidGFibGUiLCB0YWJsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29udGV4dC5wdXQoImN1c3RvbWl6ZXIiLCBnZXRDdXN0b21pemVyKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotCQlTdHJpbmdXcml0ZXIgdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJdmUubWVyZ2VUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIGNvbnRleHQsIHcpOwotCQkKLQkJU3RyaW5nIGZpbGVDb250ZW50ID0gdy50b1N0cmluZygpOwotCQlpZiAoamF2YUZpbGUuZXhpc3RzKCkpIHsKLQkJCWlmIChpc0RvbWFpbkNsYXNzKSB7Ci0JCQkJdXBkYXRlRXhpc3RpbmdEb21haW5DbGFzcyh0YWJsZS5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKSwgamF2YUZpbGUsIGZpbGVDb250ZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJamF2YUZpbGUuc2V0Q29udGVudHMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZpbGVDb250ZW50LmdldEJ5dGVzKCkpLCB0cnVlLCB0cnVlLCBtb25pdG9yKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZUZpbGUoamF2YUZpbGUsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShmaWxlQ29udGVudC5nZXRCeXRlcygpKSk7Ci0JCX0JCQotCX0KLQkKLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSAoZXhpc3RpbmcpIEphdmEgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YUZpbGUgVGhlIGV4aXN0aW5nIEphdmEgZmlsZSBvZiB0aGUgY2xhc3MgdG8gdXBkYXRlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlQ29udGVudCBUaGUgbmV3IGZpbGUgY29udGVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFeGlzdGluZ0RvbWFpbkNsYXNzKFN0cmluZyBjbGFzc05hbWUsIElGaWxlIGphdmFGaWxlLCBTdHJpbmcgZmlsZUNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24gewotCQkvKnVzZSBDb21waWxhdGlvblVuaXRNb2RpZmllciBpbnN0ZWFkIG9mIGNhbGxpbmcgV2lkZUVudi5nZXRFbnYoKS5zZXRGaWxlQ29udGVudCAKLQkJICogc28gdGhhdCBpZiB0aGUgdW5pdCBpcyB1cCB0byBkYXRlIGlmIGl0IGlzIHVzZWQgYmVmb3JlIGZpbGUgY2hhbmdlIAotCQkgKiBub3RpZmljYXRpb25zIGFyZSBkZWxpdmVyZWQgKHNlZSBFSkIzSW1wb3J0U2NoZW1hV2l6YXJkLnVwZGF0ZUV4aXN0aW5nRG9tYWluQ2xhc3MgZm9yIGV4YW1wbGUpKi8KLQkJQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIgbW9kaWZpZXIgPSBuZXcgQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIodGhpcy5nZXRKYXZhUHJvamVjdCgpLCBjbGFzc05hbWUpOwotCQltb2RpZmllci5zZXRKYXZhU291cmNlKGZpbGVDb250ZW50KTsKLQkJbW9kaWZpZXIuc2F2ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWxlKElGaWxlIGZpbGUsIGphdmEuaW8uSW5wdXRTdHJlYW0gY29udGVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJCQotCQlmaWxlLmNyZWF0ZShjb250ZW50cywgZmFsc2UsIG51bGwvKm1vbml0b3IqLyk7Ci0JfQotCQotCXB1YmxpYyBJRm9sZGVyIGdldEphdmFQYWNrYWdlRm9sZGVyKE9STUdlblRhYmxlIHRhYmxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldERlZmF1bHRKYXZhU291cmNlTG9jYXRpb24odGhpcy5nZXRKYXZhUHJvamVjdCgpLCB0YWJsZS5nZXRTb3VyY2VGb2xkZXIoKSk7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IHRhYmxlLmdldFBhY2thZ2UoKTsKLQkJaWYgKHBhY2thZ2VOYW1lID09IG51bGwpIHBhY2thZ2VOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSByb290LmdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSk7Ci0JCWlmKCAhcGFja2FnZUZyYWdtZW50LmV4aXN0cygpKXsKLQkJCXJvb3QuY3JlYXRlUGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lLCB0cnVlLCBtb25pdG9yKTsKLQkJfQkJCi0JCXJldHVybiAoSUZvbGRlcikgcGFja2FnZUZyYWdtZW50LmdldFJlc291cmNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXREZWZhdWx0SmF2YVNvdXJjZUxvY2F0aW9uKElKYXZhUHJvamVjdCBqcHJvamVjdCwgU3RyaW5nIHNvdXJjZUZvbGRlcil7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IGRlZmF1bHRTcmNQYXRoID0gbnVsbDsKLQkJaWYgKGpwcm9qZWN0ICE9IG51bGwgJiYganByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IGpwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAocm9vdHNbaV0uZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFICl7Ci0JCQkJCQlpZiAoZGVmYXVsdFNyY1BhdGggPT0gbnVsbCkgewotCQkJCQkJCWRlZmF1bHRTcmNQYXRoID0gcm9vdHNbaV07Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgcGF0aCA9IHJvb3RzW2ldLmdldFBhdGgoKS50b1N0cmluZygpOyAKLQkJCQkJCWlmIChwYXRoLmVxdWFscygnLycgKyBzb3VyY2VGb2xkZXIpKSB7Ci0JCQkJCQkJcmV0dXJuIHJvb3RzW2ldIDsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUpwdEdlblBsdWdpbi5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRTcmNQYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvVGFnTmFtZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvVGFnTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2NTMzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL1RhZ05hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLS8qKgotICogVE9ETzogbWVyZ2Ugd2l0aCBKUEEgY2xhc3MgPwotICogVGhlIEpQQSBtYXBwaW5nIHRhZyBhbmQgYXR0cmlidXRlIG5hbWVzLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdOYW1lcwotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0lDX1RBRyA9ICJiYXNpYyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FTQ0FERV9UQUcgPSAiY2FzY2FkZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1RBRyA9ICJjb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEREVEX1RBRyA9ICJlbWJlZGRlZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1CRURERURfSURfVEFHID0gImVtYmVkZGVkLWlkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURURfVkFMVUVfVEFHID0gImdlbmVyYXRlZC12YWx1ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfVEFHID0gImlkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9DTEFTU19UQUcgPSAiaWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5fQ09MVU1OX1RBRyA9ICJqb2luLWNvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUcgPSAiaW52ZXJzZS1qb2luLWNvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9CX1RBRyA9ICJsb2IiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTllfVE9fTUFOWV9UQUcgPSAibWFueS10by1tYW55IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5ZX1RPX09ORV9UQUcgPSAibWFueS10by1vbmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9CWV9UQUcgPSAibWFwcGVkLWJ5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfVE9fTUFOWV9UQUcgPSAib25lLXRvLW1hbnkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9UT19PTkVfVEFHID0gIm9uZS10by1vbmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBLX0pPSU5fQ09MVU1OX1RBRyA9ICJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfVEFHID0gInRhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1RBRyA9ICJ2ZXJzaW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX1RBQkxFX1RBRyA9ICJqb2luLXRhYmxlIjsKLQotCS8qY2FzY2FkZSB0YWdzKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfQ0FTQ0FERSA9ICJhbGwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RfQ0FTQ0FERSA9ICJwZXJzaXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVJHRV9DQVNDQURFID0gIm1lcmdlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfQ0FTQ0FERSA9ICJyZW1vdmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfQ0FTQ0FERSA9ICJyZWZyZXNoIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9Db21waWxhdGlvblVuaXRNb2RpZmllci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0NvbXBpbGF0aW9uVW5pdE1vZGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NmYwMWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0NvbXBpbGF0aW9uVW5pdE1vZGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotCi0KLS8qKgotICogUGVyZm9ybXMgdGhlIGdydW50IHdvcmsgbmVlZGVkIGZvciBtb2RpZnlpbmcgYSBjb21waWxhdGlvbiAKLSAqIHVuaXQgYW5kIHBlcmZvcm1zIHRoZSBtb2RpZmllZCBjb21waWxhdGlvbiB1bml0IHNhdmUuCi0gKiAKLSAqIFRoZSB0eXBpY2FsIHVzYWdlIGlzIGFzIGZvbGxvd3M6Ci0gKiA8b2w+PGxpPkNyZWF0ZSBhbiBpbnN0YW5jZS4KLSAqIAotICogPGxpPk1vZGlmeSB0aGUgY29tcGlsYXRpb24gdW5pdCB1c2luZyBBU1Qgb3BlcmF0aW9ucyBwZXJmb3JtZWQgCi0gKiAJb24gdGhlIG5vZGUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRDb21waWxhdGlvblVuaXROb2RlKCl9LgotICogIEFsdGVybmF0aXZlbHkgeW91IGNhbiBjYWxsIDxjb2RlPnNldEphdmFTb3VyY2U8L2NvZGU+IHRvIGNoYW5nZSB0aGUgZW50aXJlIHNvdXJjZSBjb2RlLiAKLSAqIAotICogPGxpPkNhbGwgdGhlIHtAbGluayAjc2F2ZSgpfSBtZXRob2QuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbXBpbGF0aW9uVW5pdE1vZGlmaWVyCi17Ci0JcHJpdmF0ZSBJSmF2YVByb2plY3QgbVByb2plY3Q7Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IG1Db21waWxhdGlvblVuaXQ7Ci0JcHJpdmF0ZSBDb21waWxhdGlvblVuaXQgbUNvbXBpbGF0aW9uVW5pdE5vZGU7Ci0JcHJpdmF0ZSBEb2N1bWVudCBtRG9jdW1lbnQ7Ci0JCi0JcHVibGljIENvbXBpbGF0aW9uVW5pdE1vZGlmaWVyKElKYXZhUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJCi0JCW1Qcm9qZWN0ID0gcHJvamVjdDsKLQkJCi0JCUlUeXBlIHR5cGUgPSBwcm9qZWN0LmZpbmRUeXBlKGNsYXNzTmFtZSk7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBjbGFzcyAiICsgY2xhc3NOYW1lICsgIiBkb2VzIG5vdCBleGlzdC4iKTsKLQkJfQotCQltQ29tcGlsYXRpb25Vbml0ID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYgKG1Db21waWxhdGlvblVuaXQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIHNvdXJjZSBjb2RlIGZvciAiICsgY2xhc3NOYW1lICsgIiBkb2VzIG5vdCBleGlzdC4iKTsKLQkJfQotCX0KLQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIoSUphdmFQcm9qZWN0IHByb2plY3QsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlcigpOwotCQkKLQkJbVByb2plY3QgPSBwcm9qZWN0OwotCQltQ29tcGlsYXRpb25Vbml0ID0gY3U7Ci0JfQotCXB1YmxpYyBDb21waWxhdGlvblVuaXRNb2RpZmllcihJSmF2YVByb2plY3QgcHJvamVjdCwgSUNvbXBpbGF0aW9uVW5pdCBjdSwgQ29tcGlsYXRpb25Vbml0IGN1Tm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCQotCQltUHJvamVjdCA9IHByb2plY3Q7Ci0JCW1Db21waWxhdGlvblVuaXQgPSBjdTsKLQkJbUNvbXBpbGF0aW9uVW5pdE5vZGUgPSBjdU5vZGU7Ci0JCQotCQlnZXRDb21waWxhdGlvblVuaXROb2RlKCk7IC8vdG8gY3JlYXRlIG1Eb2N1bWVudCAodGhlIGNhbGxlciBpbiB0aGlzIGNhc2UgZG9lcyBub3QgaGF2ZSB0byBjYWxsIGdldENvbXBpbGF0aW9uVW5pdE5vZGUpCi0JfQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKLQkJcmV0dXJuIG1Db21waWxhdGlvblVuaXQ7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgbm9kZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciAKLQkgKiB0eWhlIG1vZGlmaWNhdGlvbiBBU1Qgb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdE5vZGUoKSB7Ci0JCWlmIChtQ29tcGlsYXRpb25Vbml0Tm9kZSA9PSBudWxsKSB7Ci0JCQlBU1RQYXJzZXIgYyA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOwotCQkJYy5zZXRTb3VyY2UobUNvbXBpbGF0aW9uVW5pdCk7Ci0JCQljLnNldFJlc29sdmVCaW5kaW5ncyh0cnVlKTsKLQkJCW1Db21waWxhdGlvblVuaXROb2RlID0gKENvbXBpbGF0aW9uVW5pdCljLmNyZWF0ZUFTVChudWxsKTsKLQkJfQotCQlpZiAobURvY3VtZW50ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbURvY3VtZW50ID0gbmV3IERvY3VtZW50KG1Db21waWxhdGlvblVuaXQuZ2V0QnVmZmVyKCkuZ2V0Q29udGVudHMoKSk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQkKLQkJCW1Db21waWxhdGlvblVuaXROb2RlLnJlY29yZE1vZGlmaWNhdGlvbnMoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG1Db21waWxhdGlvblVuaXROb2RlOwotCX0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBlbnRpcmUgSmF2YSBzb3VyY2UgY29kZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhU291cmNlKFN0cmluZyBuZXdTb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCW1Db21waWxhdGlvblVuaXQuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMobmV3U291cmNlKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogU2F2ZXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgbW9kaWZpY2F0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChtQ29tcGlsYXRpb25Vbml0Tm9kZSAhPSBudWxsKSB7Ci0JCQlhc3NlcnQobURvY3VtZW50ICE9IG51bGwpOyAvL3NlZSBnZXRDb21waWxhdGlvblVuaXROb2RlCi0JCQkKLQkJCS8vY29tcHV0YXRpb24gb2YgdGhlIHRleHQgZWRpdHMKLQkJCVRleHRFZGl0IGVkaXRzID0gbUNvbXBpbGF0aW9uVW5pdE5vZGUucmV3cml0ZShtRG9jdW1lbnQsIG1Qcm9qZWN0LmdldE9wdGlvbnModHJ1ZSkpOwotCQkJLy9jb21wdXRhdGlvbiBvZiB0aGUgbmV3IHNvdXJjZSBjb2RlCi0JCQllZGl0cy5hcHBseShtRG9jdW1lbnQpOwotCQkJU3RyaW5nIG5ld1NvdXJjZSA9IG1Eb2N1bWVudC5nZXQoKTsKLQkJCS8vIHVwZGF0ZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdAotCQkJbUNvbXBpbGF0aW9uVW5pdC5nZXRCdWZmZXIoKS5zZXRDb250ZW50cyhuZXdTb3VyY2UpOwotCQl9Ci0JCQotCQlpZiAobUNvbXBpbGF0aW9uVW5pdC5pc1dvcmtpbmdDb3B5KCkpIHsKLQkJCW1Db21waWxhdGlvblVuaXQuY29tbWl0V29ya2luZ0NvcHkodHJ1ZS8qZm9yY2UqLywgbnVsbC8qbW9uaXRvciovKTsKLQkJfSBlbHNlIHsKLQkJCW1Db21waWxhdGlvblVuaXQuc2F2ZShudWxsLyptb25pdG9yKi8sIHRydWUvKmZvcmNlKi8pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0RUUFV0aWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9EVFBVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YTcxZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0RUUFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5LkNvbHVtblBhaXI7Ci0KLS8qKgotICogQ29sbGVjdGlvbiBvZiB1dGlsaXR5IG1ldGhvZHMgdG8gYWNjZXNzIERUUCBhbmQgb3RoZXIganB0LmRiIEFQSXMgCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRFRQVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdXRvSW5jcmVtZW50KENvbHVtbiBjKXsKLQkJLy9AIFRPRE8KLQkJLy9CbG9ja2VkIGJ5IERUUCBidWcKLQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUwMDIzCi0JCS8vVGhlIERhbGkgYnVnIGlzCi0JCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0OTY1OAotCQkvLwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGxpc3Qgb2YgZmsKLQkgKiBAcGFyYW0gZGJUYWJsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8Rm9yZWlnbktleUluZm8+IGdldEZvcmVpZ25LZXlzKFRhYmxlIGRiVGFibGUpIHsKLQkJTGlzdDxGb3JlaWduS2V5SW5mbz4gcmV0ID0gbmV3IEFycmF5TGlzdDxGb3JlaWduS2V5SW5mbz4oKTsKLQkJaWYoZGJUYWJsZSE9bnVsbCl7Ci0JCQlmb3IgKEZvcmVpZ25LZXkgZmsgOiBkYlRhYmxlLmdldEZvcmVpZ25LZXlzKCkpIHsKLQkJCQlJdGVyYXRvcjxDb2x1bW5QYWlyPiBjb2x1bW5QYWlyZXMgPSBmay5nZXRDb2x1bW5QYWlycygpLml0ZXJhdG9yKCk7Ci0JCQkJRm9yZWlnbktleUluZm8gZmtJbmZvID0gbnVsbDsKLQkJCQl3aGlsZSggY29sdW1uUGFpcmVzLmhhc05leHQoKSApewotCQkJCQlDb2x1bW5QYWlyIGNvbHVtblBhaXIgPSBjb2x1bW5QYWlyZXMubmV4dCgpOwotCQkJCQlpZiggZmtJbmZvID09IG51bGwpewotCQkJCQkJU3RyaW5nIHRhYmxlTmFtZSA9IGRiVGFibGUuZ2V0TmFtZSgpOwotCQkJCQkJU3RyaW5nIHJlZmVyZW5jZWRUYWJsZU5hbWUgPSAiIjsKLQkJCQkJCVRhYmxlIHJlZmVyZW5jZWRUYWJsZSA9IGZrLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCQkJCQkJcmVmZXJlbmNlZFRhYmxlTmFtZSA9IHJlZmVyZW5jZWRUYWJsZS5nZXROYW1lKCk7Ci0JCQkJCQlma0luZm8gPSBuZXcgRm9yZWlnbktleUluZm8oZmssIHRhYmxlTmFtZSwgcmVmZXJlbmNlZFRhYmxlTmFtZSApOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBiYXNlQ29sTmFtZSA9IGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2xOYW1lID0gY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCkuZ2V0TmFtZSgpOwotCQkJCQlma0luZm8uYWRkQ29sdW1uTWFwcGluZyggYmFzZUNvbE5hbWUsICByZWZlcmVuY2VkQ29sTmFtZSApOwotCQkJCX0gCi0JCQkJaWYoIGZrSW5mbyAhPW51bGwgKQotCQkJCQlyZXQuYWRkKCBma0luZm8gKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphdmFUeXBlKENvbHVtbiBkYkNvbHVtbikgewotCQlyZXR1cm4gZGJDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkgPwotCQkJCWRiQ29sdW1uLmdldFByaW1hcnlLZXlKYXZhVHlwZURlY2xhcmF0aW9uKCkgOgotCQkJCWRiQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWZhdWx0U2NoZW1hKFRhYmxlIGRiVGFibGUpewotCQlTdHJpbmcgc2NoZW1hTmFtZSA9IGRiVGFibGUuZ2V0U2NoZW1hKCkuZ2V0TmFtZSgpOwotCQlTY2hlbWEgZGVmYXVsdFNjaGVtYSA9IGRiVGFibGUuZ2V0U2NoZW1hKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5nZXREYXRhYmFzZSgpLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJcmV0dXJuIGRlZmF1bHRTY2hlbWEuZ2V0TmFtZSgpID09IHNjaGVtYU5hbWU7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9FbnRpdHlHZW5Ub29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0VudGl0eUdlblRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZTI1NjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0VudGl0eUdlblRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLk5hbWVUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBVdGlsaXR5IG1ldGhvZHMgZm9yIGVudGl0eSBnZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5R2VuVG9vbHMgewotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIChkYXRhYmFzZSkgaWRlbnRpZmllciB0byBhIHVuaXF1ZSAiSmF2YSBzdHlsZSIKLQkgKiBjbGFzcyBuYW1lLgotCSAqIEBzZWUgI2NvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUlkZW50aWZpZXIoU3RyaW5nLCBib29sZWFuLCBDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZShTdHJpbmcgaWRlbnRpZmllciwgQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUlkZW50aWZpZXIoaWRlbnRpZmllciwgdHJ1ZSwgY2xhc3NOYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIChkYXRhYmFzZSkgaWRlbnRpZmllciB0byBhIHVuaXF1ZSAiSmF2YSBzdHlsZSIKLQkgKiBhdHRyaWJ1dGUgKGZpZWxkL3Byb3BlcnR5KSBuYW1lLgotCSAqIEBzZWUgI2NvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUlkZW50aWZpZXIoU3RyaW5nLCBib29sZWFuLCBDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoU3RyaW5nIGlkZW50aWZpZXIsIENvbGxlY3Rpb248U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcykgewotCQlyZXR1cm4gY29udmVydFRvVW5pcXVlSmF2YVN0eWxlSWRlbnRpZmllcihpZGVudGlmaWVyLCBmYWxzZSwgYXR0cmlidXRlTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAoZGF0YWJhc2UpIGlkZW50aWZpZXIgdG8gYSB1bmlxdWUgIkphdmEgc3R5bGUiCi0JICogaWRlbnRpZmllcjoKLQkgKiAgICAgLSBpZiB0aGUgaWRlbnRpZmllciBpcyBhbGwtY2FwcywgY29udmVydCB1bmRlcnNjb3JlcyB0byAiY2FtZWwgY2FzZSIKLQkgKiAgICAgLSBpZiB0aGUgaWRlbnRpZmllciBpcyBub3QgYWxsLWNhcHMsIGxlYXZlIGl0IHVuY2hhbmdlZCAoZXhjZXB0LCBwb3NzaWJseSwgZm9yIHRoZSBmaXJzdCBsZXR0ZXIpCi0JICogICAgIC0gY29udmVydCB0byBhIGxlZ2FsIEphdmEgaWRlbnRpZmllcgotCSAqICAgICAgICAgLSBlbGltaW5hdGUgaWxsZWdhbCBjaGFyYWN0ZXJzCi0JICogICAgICAgICAtIGlmIHRoZSByZXN1bHQgaXMgYSByZXNlcnZlZCB3b3JkLCBtb2RpZnkgaXQgc2xpZ2h0bHkKLQkgKiBJZiB0aGUgcmVzdWx0IGlzIGFscmVhZHkgb25lIG9mIHRoZSBzcGVjaWZpZWQgZXhpc3RpbmcgaWRlbnRpZmllcnMKLQkgKiAoaWdub3JpbmcgY2FzZSBzbyB3ZSBkb24ndCBoYXZlIGZpbGVuYW1lIGNvbGxpc2lvbnMgb24gV2luZG93cyksCi0JICogbW9kaWZ5IGl0IHNsaWdodGx5IGFnYWluLgotCSAqICAgICAiRk9PIiA9PiAiRm9vIiBvciAiZm9vIgotCSAqICAgICAiRk9PX0JBUiIgPT4gIkZvb0JhciIgb3IgImZvb0JhciIKLQkgKiAgICAgIlBBQ0tBR0UiID0+ICJQYWNrYWdlIiBvciAicGFja2FnZV8iCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvVW5pcXVlSmF2YVN0eWxlSWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllciwgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIENvbGxlY3Rpb248U3RyaW5nPiBpZGVudGlmaWVycykgewotCQlTdHJpbmcgcmVzdWx0ID0gaWRlbnRpZmllcjsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzVXBwZXJjYXNlKHJlc3VsdCkgfHwgU3RyaW5nVG9vbHMuc3RyaW5nSXNMb3dlcmNhc2UocmVzdWx0KSkgewotCQkJLy8gbGVhdmUgbWl4ZWQgY2FzZSBpZGVudGlmaWVycyBhbG9uZT8KLQkJCXJlc3VsdCA9IFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKHJlc3VsdCwgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNhcGl0YWxpemVGaXJzdExldHRlciA/IFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUocmVzdWx0KSA6IFN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZShyZXN1bHQpOwotCQl9Ci0JCXJlc3VsdCA9IE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcihyZXN1bHQpOwotCQkvLyBhc3N1bWUgdGhhdCBjb252ZXJ0aW5nIHRvIGEgdW5pcXVlIG5hbWUgd2lsbCBub3QgcmVzdWx0IGluIGEgSmF2YSByZXNlcnZlZCB3b3JkCi0JCS8vIChzaW5jZSBubyBKYXZhIHJlc2VydmVkIHdvcmRzIGVuZCB3aXRoIGEgbnVtYmVyKQotCQlyZXN1bHQgPSBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UocmVzdWx0LCBpZGVudGlmaWVycyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBFbnRpdHlHZW5Ub29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL3V0aWwvRmlsZVV0aWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9GaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTBiODQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9GaWxlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphcklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLkpwdEdlbk1lc3NhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQ29sbGVjdGlvbnMgb2YgdXRpbGl0eSBtZXRob2RzIGhhbmRsaW5nIGZpbGVzLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbAotewotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVGb2xkZXIoRmlsZSBmb2xkZXIpCi0JCXRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJRmlsZVtdIGZpbGVzID0gZm9sZGVyLmxpc3RGaWxlcygpOwotCQkvL2VtcHR5IHRoZSBmb2xkZXIgZmlyc3QgKGphdmEuaW8uZmlsZS5kZWxldGUgcmVxdWlyZXMgaXQgZW1wdHkpCi0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKSB7Ci0JCQkJRmlsZSBmID0gZmlsZXNbaV07Ci0JCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkKLQkJCQkJZGVsZXRlRm9sZGVyKGYpOwotCQkJCWVsc2UKLQkJCQkJZGVsZXRlUGF0aChmKTsKLQkJCX0KLQkJfQotCQlkZWxldGVQYXRoKGZvbGRlcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZVBhdGgoRmlsZSBmKQotCQl0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCWlmICghZi5kZWxldGUoKSkgewotCQkJU3RyaW5nIG1zZ0lkID0gZi5pc0RpcmVjdG9yeSgpID8gIEpwdEdlbk1lc3NhZ2VzLkRlbGV0ZV9Gb2xkZXJfRXJyb3IgOiAgSnB0R2VuTWVzc2FnZXMuRGVsZXRlX0ZpbGVfRXJyb3I7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIE5MUy5iaW5kKG1zZ0lkLGYuZ2V0UGF0aCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBieXRlW10gcmVhZEZpbGUoRmlsZSBzcmMpCi0JCXRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJamF2YS5pby5GaWxlSW5wdXRTdHJlYW0gZmluID0gbmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0JCXRyeSB7Ci0JCQlsb25nIGZpbGVMZW4gPSBzcmMubGVuZ3RoKCk7Ci0JCQlpZiAoZmlsZUxlbiA+IEludGVnZXIuTUFYX1ZBTFVFKQotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiZmlsZSBsZW5ndGggdG9vIGJpZyB0byBiZSByZWFkIGJ5IEZpbGVVdGlsLnJlYWRGaWxlOiAiICsgZmlsZUxlbik7Ci0JCQotCQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbKGludClmaWxlTGVuXTsKLQkJCWZpbi5yZWFkKGJ5dGVzKTsKLQkJCXJldHVybiBieXRlczsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWZpbi5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRmlsZShGaWxlIGRlc3QsIGJ5dGVbXSBieXRlcykKLQkJdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlpZiAoZGVzdC5leGlzdHMoKSAmJiAhZGVzdC5jYW5Xcml0ZSgpKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCBOTFMuYmluZChKcHRHZW5NZXNzYWdlcy5GaWxlX1JlYWRfT25seV9FcnJvciwgZGVzdC5nZXRQYXRoKCkpKTsgIC8vdGhyb3cgd2l0aCBhIGNsZWFyIGVycm9yIGJlY2F1c2Ugb3RoZXJ3aXNlIEZpbGVPdXRwdXRTdHJlYW0gdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiEKLQkJamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtIGZvdXQgPSBuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKGRlc3QuZ2V0UGF0aCgpLCBmYWxzZS8qYXBwZW5kKi8pOwotCQl0cnkgewotCQkJZm91dC53cml0ZShieXRlcyk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlmb3V0LmZsdXNoKCk7Ci0JCQlmb3V0LmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1cmwgZm9yIGEgZmlsZS4KLQkgKiBUaGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBmaWxlLnRvVXJsKCkgYnV0IHdpdGhvdXQgdGhlIG5vbi1zZW5zZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0RmlsZVVybChGaWxlIGZpbGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmaWxlLnRvVVJJKCkudG9VUkwoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOyAvL3Nob3VsZCBub3QgaGFwcGVuIGFzIGZpbGUudG9VUkwoKSBkb2VzIG5vdCByZWFsbHkgdGhyb3cgYW4gZXhjZXB0aW9uCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmlsZUNvbnRlbnQoRmlsZSBmaWxlLCBqYXZhLmlvLklucHV0U3RyZWFtIGNvbnRlbnRzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl0cnkgewotCQkJSUZpbGUgaUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJCWlmIChpRmlsZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUaGUgcGF0aCAiICsgZmlsZSArICIgZG9lcyBub3Qgc2VlbSB0byBiZSBhIHZhbGlkIGZpbGUgcGF0aC4iKTsKLQkJCX0KLQkJCWlGaWxlLnNldENvbnRlbnRzKGNvbnRlbnRzLCB0cnVlLypmb3JjZSovLCB0cnVlLyprZWVwSGlzdG9yeSovLCBudWxsLyptb25pdG9yKi8pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0JCi0JCi0gICAgLyoqCi0gICAgICogRXh0cmFjdCB0aGUgY29udGVudHMgb2YgYSBKYXIgYXJjaGl2ZSB0byB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bmphcihJbnB1dFN0cmVhbSBpbiwgRmlsZSBkZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoIWRlc3QuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGRlc3QubWtkaXJzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFkZXN0LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRGVzdGluYXRpb24gbXVzdCBiZSBhIGRpcmVjdG9yeS4iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgSmFySW5wdXRTdHJlYW0gamluID0gbmV3IEphcklucHV0U3RyZWFtKGluKTsKLSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotCi0gICAgICAgIFppcEVudHJ5IGVudHJ5ID0gamluLmdldE5leHRFbnRyeSgpOwotICAgICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmNoYXJBdChmaWxlTmFtZS5sZW5ndGgoKSAtIDEpID09ICcvJykgewotICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGZpbGVOYW1lLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZmlsZU5hbWUuY2hhckF0KDApID09ICcvJykgewotICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciAhPSAnLycpIHsKLSAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGVzdCwgZmlsZU5hbWUpOwotICAgICAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMKLSAgICAgICAgICAgICAgICBmaWxlLm1rZGlycygpOwotICAgICAgICAgICAgICAgIGppbi5jbG9zZUVudHJ5KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cwotICAgICAgICAgICAgICAgIEZpbGUgcGFyZW50ID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50Lm1rZGlycygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGR1bXAgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0gICAgICAgICAgICAgICAgaW50IGxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChsZW4gPSBqaW4ucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpKSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBsZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBqaW4uY2xvc2VFbnRyeSgpOwotICAgICAgICAgICAgICAgIGZpbGUuc2V0TGFzdE1vZGlmaWVkKGVudHJ5LmdldFRpbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbnRyeSA9IGppbi5nZXROZXh0RW50cnkoKTsKLSAgICAgICAgfQotICAgICAgICAvKiBFeHBsaWNpdGx5IHdyaXRlIG91dCB0aGUgTUVUQS1JTkYvTUFOSUZFU1QuTUYgc28gdGhhdCBhbnkgaGVhZGVycyBzdWNoCi0gICAgICAgICBhcyB0aGUgQ2xhc3MtUGF0aCBhcmUgc2VlbiBmb3IgdGhlIHVucGFja2FnZWQgamFyCi0gICAgICAgICAqLwotICAgICAgICBNYW5pZmVzdCBtZiA9IGppbi5nZXRNYW5pZmVzdCgpOwotICAgICAgICBpZiAobWYgIT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGVzdCwgIk1FVEEtSU5GL01BTklGRVNULk1GIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgRmlsZSBwYXJlbnQgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnQuZXhpc3RzKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0gICAgICAgICAgICBtZi53cml0ZShvdXQpOwotICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBqaW4uY2xvc2UoKTsKLSAgICB9Ci0gICAgCi0JLy9Vc2VkIHRvIFVuemlwIHRoZSBhIHNwZWNpZmljIGZvbGRlciBwYWNrZWQgaW5zaWRlIGEgcGx1Zy1pbiBidW5kbGUgdG8gdGhlIHBsdWctaW4gc3RhdGUgbG9jYXRpb24KLQlwdWJsaWMgc3RhdGljIEZpbGUgZXh0cmFjdEZpbGVzRnJvbUJ1bmRsZSggVVJMIHVybCwgQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIHBhdGggKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVVJMIGphclVybCA9IFVybFV0aWwuZ2V0SmFyRmlsZVVybCh1cmwpOwotCQlGaWxlIGphckZpbGUgPSBuZXcgRmlsZShqYXJVcmwuZ2V0RmlsZSgpICk7Ci0JCUxvY2F0aW9uIGNvbmZpZ0xvY2F0aW9uID0gUGxhdGZvcm0uZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7Ci0JCVN0cmluZyBwbHVnaW5JZCA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJRmlsZSBjb25maWdGb2xkZXIgPSBuZXcgRmlsZSggY29uZmlnTG9jYXRpb24uZ2V0VVJMKCkuZ2V0RmlsZSgpLCBwbHVnaW5JZCk7Ci0JCUZpbGUgdGVtcGxEaXIgPSBuZXcgRmlsZSggY29uZmlnRm9sZGVyLCBwYXRoICk7Ci0JCWlmKCAhdGVtcGxEaXIuZXhpc3RzKCkgKXsKLQkJCUZpbGVVdGlsLnVuamFyKCBuZXcgRmlsZUlucHV0U3RyZWFtKCBqYXJGaWxlICksIGNvbmZpZ0ZvbGRlciApOwotCQkJLy9EZWxldGUgdW4tcmVsYXRlZCBmaWxlcyBhbmQgZm9sZGVycwotCQkJRmlsZVtdIGZpbGVzID0gY29uZmlnRm9sZGVyLmxpc3RGaWxlcygpOwotCQkJZm9yKCBGaWxlIGYgOiBmaWxlcyApewotCQkJCWlmKCBmLmlzRmlsZSgpICkKLQkJCQkJZi5kZWxldGUoKTsKLQkJCQllbHNlIGlmKCAgdGVtcGxEaXIuZ2V0UGF0aCgpLmluZGV4T2YoIGYuZ2V0UGF0aCgpICkgIT0wICApewotCQkJCQlGaWxlVXRpbC5kZWxldGVGb2xkZXIoZik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0ZW1wbERpciA7Ci0JfQkKLX0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0ZvcmVpZ25LZXlJbmZvLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL3V0aWwvRm9yZWlnbktleUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlOTFlOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL3V0aWwvRm9yZWlnbktleUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgbWV0YWRhdGEgZm9yIGEgcGFydGljdWxhciBmb3JlaWduIGtleSByZWxhdGlvbnNoaXAgCi0gKiBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2Ugc2NoZW1hLgotICogPHAvPgotICogVGhlIHJlZmVycmVyIGNvbHVtbiBpcyBvbmUgd2hpY2ggYWN0dWFsbHkgY29udGFpbnMgYSBmb3JlaWduIAotICoga2V5IGNvbnN0cmFpbnQsIGFuZCBpcyBlcXVpdmFsZW50IHRvIHRoZSAiZm9yZWlnbiBrZXkiIGNvbHVtbi4KLSAqIDxwLz4KLSAqIFRoZSByZWZlcmVuY2VkIGNvbHVtbiBpcyBvbmUgd2hpY2ggYSByZWZlcnJlciBvciBmb3JlaWduIGtleSAKLSAqIGNvbHVtbiByZWZlcmVuY2VzLCBhbmQgaXMgZXF1aXZhbGVudCB0byB0aGUgInByaW1hcnkga2V5IiBjb2x1bW4uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZvcmVpZ25LZXlJbmZvCi17Ci0JcHJpdmF0ZSB0cmFuc2llbnQgRm9yZWlnbktleSBtRm9yZWlnbktleSA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVJlZmVycmVyVGFibGVOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1SZWZlcmVuY2VkVGFibGVOYW1lOwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1SZWZlcnJlckNvbE5hbWVzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1SZWZlcmVuY2VkQ29sTmFtZXMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGZrIFRoZSBuYW1lIG9mIHRoZSBjb25zdHJhaW50IGJhY2tpbmcgCi0gICAgICogdGhpcyBmb3JlaWduIGtleSBtZXRhZGF0YSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRm9yZWlnbktleUluZm8oRm9yZWlnbktleSBmaywgU3RyaW5nIHJlZmVycmVyVGFibGVOYW1lLCBTdHJpbmcgcmVmZXJlbmNlZFRhYmxlTmFtZSkgewotICAgIAltRm9yZWlnbktleSA9IGZrOwotICAgIAltTmFtZSA9IGZrLmdldE5hbWUoKTsKLSAgICAJbVJlZmVycmVyVGFibGVOYW1lID0gcmVmZXJyZXJUYWJsZU5hbWU7Ci0gICAgCW1SZWZlcmVuY2VkVGFibGVOYW1lID0gcmVmZXJlbmNlZFRhYmxlTmFtZTsKLQl9Ci0gICAgLyoqCi0gICAgICogT2J0YWluIHRoZSBjb25zdHJhaW50IG5hbWUgZm9yIHRoaXMgZm9yZWlnbiBrZXkgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiBUaGUgbmFtZSBmb3IgYSBGb3JlaWduIEtleSBtYXksIGFzIHBlciB0aGUgSkRCQyBzcGVjaWZpY2F0aW9uLAotICAgICAqIGJlIDxjb2RlPm51bGw8L2NvZGU+IHdoZXJlIHRoZSBjb25zdHJhaW50IGlzIG5vdCBuYW1lZC4KLSAgICAgKiBJbiBhZGRpdGlvbiwgaXQgbWF5IGJlIGhhcmRseSByZWNvZ25pemFibGUgdG8gdGhlIHVzZXIsCi0gICAgICogcGFydGljdWxhcmx5IGZvciBEQi8yIGNvbnN0cmFpbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGNvbnN0cmFpbnQgYmFja2luZwotICAgICAqICAgICAgICAgdGhpcyBmb3JlaWduIGtleSBtZXRhZGF0YSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRm9yZWlnbktleSBnZXRGb3JlaWduS2V5KCl7Ci0gICAgCXJldHVybiBtRm9yZWlnbktleTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQWRkIGFub3RoZXIgcGFpciBvZiBmb3JlaWduIGtleSBtYXBwaW5ncyBmb3IgdGhpcyBmb3JlaWduIGtleQotICAgICAqIGRlZmluaXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlZmVycmVyQ29sdW1uIFRoZSByZWZlcnJlciBjb2x1bW4gbmFtZSBmb3IgdGhpcyBtYXBwaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZWZlcmVuY2VkQ29sdW1uIFRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29sdW1uTWFwcGluZyhTdHJpbmcgcmVmZXJyZXJDb2xOYW1lLCBTdHJpbmcgcmVmZXJlbmNlZENvbE5hbWUpIHsKLSAgICAJbVJlZmVycmVyQ29sTmFtZXMuYWRkKHJlZmVycmVyQ29sTmFtZSk7Ci0gICAgCW1SZWZlcmVuY2VkQ29sTmFtZXMuYWRkKHJlZmVyZW5jZWRDb2xOYW1lKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVmZXJyZXIgdGFibGUgbmFtZSBvZiB0aGlzIGZvcmVpZ24ga2V5Ci0gICAgICogcmVsYXRpb25zaGlwLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtUmVmZXJyZXJUYWJsZU5hbWU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlZmVycmVyIGNvbHVtbiBuYW1lcyBmb3IgdGhpcwotICAgICAqIGZvcmVpZ24ga2V5LgotICAgICAqIFRoZSBzaXplIG9mIHRoaXMgbGlzdCBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgCi0gICAgICogdGhlIGxpc3QgcmV0dXJlZCBmcm9tIDxjb2RlPmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lczwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJlZmVycmVyQ29sdW1uTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBtUmVmZXJyZXJDb2xOYW1lczsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCB0YWJsZSBuYW1lIG9mIHRoaXMgZm9yZWlnbiBrZXkKLSAgICAgKiByZWxhdGlvbnNoaXAuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkgewotICAgIAkgcmV0dXJuIG1SZWZlcmVuY2VkVGFibGVOYW1lOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lcyBmb3IgdGhpcwotICAgICAqIGZvcmVpZ24ga2V5LgotICAgICAqIFRoZSBzaXplIG9mIHRoaXMgbGlzdCBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgCi0gICAgICogdGhlIGxpc3QgcmV0dXJlZCBmcm9tIDxjb2RlPmdldFJlZmVycmVyQ29sdW1uTmFtZXM8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBtUmVmZXJlbmNlZENvbE5hbWVzOwotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIAlyZXR1cm4gIm5hbWU9IiArIG1OYW1lCi0JCSsgIiwgcmVmZXJyZXJUYWJsZT0iICsgbVJlZmVycmVyVGFibGVOYW1lCi0JCSsgIiwgcmVmZXJlbmNlZFRhYmxlPSIgKyBtUmVmZXJlbmNlZFRhYmxlTmFtZQotCQkrICIsIHJlZmVycmVyQ29sdW1ucz0iICsgbVJlZmVycmVyQ29sTmFtZXMKLQkJKyAiLCByZWZlcmVuY2VkQ29sdW1ucz0iICsgbVJlZmVyZW5jZWRDb2xOYW1lcwotCQkJOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL1N0cmluZ1V0aWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9TdHJpbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNDVlMDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL1N0cmluZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFN0cmluZ1V0aWwKLXsKLQkvKioKLQkgKiBQYWRzIGEgc3RyaW5nIGJ5IGFkZGluZyBhIHNlcXVlbmNlIG9mIGFuIGFyYml0cmFyeSBjaGFyYWN0ZXIgYXQgdGhlIGJlZ2lubmluZy4KLQkgKiBAcGFyYW0gcGFkQ2hhciBUaGUgY2hhcmFjdGVyIHRvIGJlIHVzZWQgZm9yIHBhZGRpbmcuCi0JICogQHBhcmFtIGxlbiBUaGUgZGVzaXJlZCBsZW5ndGggYWZ0ZXIgcGFkZGluZy4KLQkgKiBAcmV0dXJuIFRoZSBwYWRkZWQgc3RyaW5nLiBGb3IgZXhhbXBsZSBpZiA8Y29kZT5zdHI8L2NvZGU+IGlzICJmNGUiIGFuZCA8Y29kZT5wYWRDaGFyPC9jb2RlPiBpcyAnMCcgCi0JICogYW5kIDxjb2RlPmxlbjwvY29kZT4gaXMgNiB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgIjAwMGY0ZSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWRMZWZ0KFN0cmluZyBzdHIsIGNoYXIgcGFkQ2hhciwgaW50IGxlbikgewotCQlpZihzdHIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IHN0ckxlbiA9IHN0ci5sZW5ndGgoKTsKLQkJaWYgKHN0ckxlbiA8IGxlbikgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuKTsKLQkJCWludCBjb3VudCA9IGxlbi1zdHJMZW47Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpCi0JCQkJYnVmZmVyLmFwcGVuZChwYWRDaGFyKTsKLQkJCWJ1ZmZlci5hcHBlbmQoc3RyKTsKLQkJCXN0ciA9IGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBzdHI7Ci0JfQotCS8qKgotCSAqIEluc2VydHMgYSBnaXZlbiBjaGFyYWN0ZXIgYXQgdGhlIGJlZ2lubmluZyBhbmQgYXQgdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKiBGb3IgZXhhbXBsZSBpZiB0aGUgc3RyaW5nIGlzIDx0dD5leHRyZW1lPC90dD4gYW5kIHRoZSBjaGFyIGlzIDx0dD4nPC90dD4gdGhlbiAKLQkgKiB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzIDx0dD4nZXh0ZXJtZSc8L3R0Pi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBxdW90ZShTdHJpbmcgc3RyLCBjaGFyIGMpIHsKLQkJYXNzZXJ0KHN0ciAhPSBudWxsKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyLmxlbmd0aCgpKzIpOwotCQlidWZmZXIuYXBwZW5kKGMpOwotCQlidWZmZXIuYXBwZW5kKHN0cik7Ci0JCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG91YmxlUXVvdGUoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gcXVvdGUoc3RyLCAnIicpOwotCX0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBmaXJzdCBhbmQgbGFzdCBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyAoaWYgdGhleSBleGlzdCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5xdW90ZShTdHJpbmcgcXVvdGVkKSB7Ci0JCWlmIChxdW90ZWQgIT0gbnVsbCAmJiBxdW90ZWQubGVuZ3RoKCkgPj0gMil7Ci0JCQlpbnQgbGVuID0gcXVvdGVkLmxlbmd0aCgpOwotCQkJY2hhciBmaXJzdENoYXIgPSBxdW90ZWQuY2hhckF0KDApOwotCQkJY2hhciBsYXN0Q2hhciA9IHF1b3RlZC5jaGFyQXQobGVuLTEpOwotCQkJaWYgKGZpcnN0Q2hhciA9PSBsYXN0Q2hhciAmJiAoZmlyc3RDaGFyID09ICdcJycgfHwgZmlyc3RDaGFyID09ICciJykpIHsKLQkJCQlyZXR1cm4gcXVvdGVkLnN1YnN0cmluZygxLCBsZW4tMSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHF1b3RlZDsKLQl9Ci0JLyoqCi0JICogVHJ1bmNhdGVzIGEgc3RyaW5nIGFuZCBhZGRzICIuLi4iIGluIHRoZSByZXN1bHQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgbGVuZ3RoIGlzIGxlc3Mgb3IgZXF1YWwgdG8gdGhlIG1heCBsZW4gdGhlbiAKLQkgKiB0aGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRydW5jYXRlKFN0cmluZyBzLCBpbnQgbWF4TGVuKSB7Ci0JCWlmIChzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWludCBsZW4gPSBzLmxlbmd0aCgpOwotCQlpZiAobGVuID4gbWF4TGVuKSB7Ci0JCQlpbnQgc2VnbWVudExlbiA9IG1heExlbi8yOwotCQkJcyA9IHMuc3Vic3RyaW5nKDAsIHNlZ21lbnRMZW4pICsgIi4uLiIgKyBzLnN1YnN0cmluZyhsZW4tc2VnbWVudExlbik7Ci0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc2FtZSBjaGFyYWN0ZXIgcmVwZWF0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwZWF0KGNoYXIgYywgaW50IGNvdW50KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGNvdW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKGMpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RyaW5nIHVubGVzcyBpdCBpcyBlbXRwdHkgd2hlcmUgaXQgcmV0dXJucyBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG51bGxJZkVtcHR5KFN0cmluZyBzKSB7Ci0JCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gczsKLQl9Ci0JLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzYW1lIGNoYXJhY3RlcnMgYXMgdGhlIGFyZ3VtZW50IHN0cmluZyAKLQkgKiBleGNlcHQgdGhhdCB0aGUgY29udHJvbCBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCBieSB0aGUgdGhlaXIgaGV4IGNvZGUuCi0JICogRm9yIGV4YW1wbGUgaWYgdGhlIHN0cmluZyBpcyAiYWJcbmMiIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgImFiezB4QX1jIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWaXNpYmxlU3RyaW5nKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLQkJCWNoYXIgYyA9IHMuY2hhckF0KGkpOwotCQkJaWYgKGMgPD0gMHgxRiB8fCAoYyA9PSAweDIwICYmIChpID09IDAgfHwgaSA9PSBsZW4tMSkpKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiKDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoKGludCljKS50b1VwcGVyQ2FzZSgpICsgIikiKTsKLQkJCX0KLQkJCWVsc2UgYnVmZmVyLmFwcGVuZChjKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIFJlcGxhY2VzIGEgcG9ydGlvbiBvZiBzdHJpbmcuCi0JICogQHBhcmFtIHN0ciBUaGUgb3JpZ2luYWwgc3RyaW5nLgotCSAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBpbiB0aGUgb3JpZ2luYWwgc3RyaW5nIHdoZXJlIHRoZSByZXBsYWNlIHN0YXJ0cwotCSAqIEBwYXJhbSBsZW4gVGhlIHJlcGxhY2UgbGVuZ3RoIHRoZSBvcmlnaW5hbCBzdHJpbmcKLQkgKiBAcGFyYW0gcmVwbGFjZVN0ciBUaGUgcmVwbGFjZW1lbnQgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyUmVwbGFjZShTdHJpbmcgc3RyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuLCBTdHJpbmcgcmVwbGFjZVN0cikgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzdHIubGVuZ3RoKCktbGVuK3JlcGxhY2VTdHIubGVuZ3RoKCkpOwotCQlidWZmZXIuYXBwZW5kKHN0ci5zdWJzdHJpbmcoMCwgb2Zmc2V0KSk7Ci0JCWJ1ZmZlci5hcHBlbmQocmVwbGFjZVN0cik7Ci0JCWJ1ZmZlci5hcHBlbmQoc3RyLnN1YnN0cmluZyhvZmZzZXQrbGVuKSk7Ci0JCQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0clJlcGxhY2UoU3RyaW5nIHN0ciwgU3RyaW5nIHBhdHRlcm4sIFN0cmluZyByZXBsYWNlU3RyKQotCXsKLQkJaWYoc3RyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmKHBhdHRlcm4gPT0gbnVsbCB8fCBwYXR0ZXJuLmVxdWFscygiIikpIHsKLQkJCXJldHVybiBzdHI7Ci0JCX0KLQkJaW50IGluZGV4ID0gc3RyLmluZGV4T2YocGF0dGVybik7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm4gc3RyOwotCQkKLQkJaWYgKHJlcGxhY2VTdHIgPT0gbnVsbCkKLQkJCXJlcGxhY2VTdHIgPSAiIjsKLQkJcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgaW5kZXgpICsgcmVwbGFjZVN0ciArIHN0ci5zdWJzdHJpbmcoaW5kZXggKyBwYXR0ZXJuLmxlbmd0aCgpKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyUmVwbGFjZUFsbChTdHJpbmcgc3RyLCBTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHJlcGxhY2VTdHIpCi0JewotCQlpZihzdHIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHJlcGxhY2VTdHIgPT0gbnVsbCkKLQkJCXJlcGxhY2VTdHIgPSAiIjsKLQkJaWYocGF0dGVybiA9PSBudWxsIHx8IHBhdHRlcm4uZXF1YWxzKCIiKSkgewotCQkJcmV0dXJuIHN0cjsKLQkJfQotCQlpbnQgaW5kZXggPSBzdHIuaW5kZXhPZihwYXR0ZXJuKTsKLQkJd2hpbGUgKGluZGV4ID49IDApIHsKLQkJCXN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgaW5kZXgpICsgcmVwbGFjZVN0ciArIHN0ci5zdWJzdHJpbmcoaW5kZXggKyBwYXR0ZXJuLmxlbmd0aCgpKTsKLQkJCWluZGV4ID0gc3RyLmluZGV4T2YocGF0dGVybiwgaW5kZXgrcmVwbGFjZVN0ci5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RySW5zZXJ0KFN0cmluZyBzdHIsIGludCBpbmRleCwgU3RyaW5nIGluc2VydFN0cikKLQl7Ci0JCXJldHVybiBzdHIuc3Vic3RyaW5nKDAsIGluZGV4KQotCQkJCSsgaW5zZXJ0U3RyCi0JCQkJKyBzdHIuc3Vic3RyaW5nKGluZGV4KTsKLQl9Ci0gICAgLyoqCi0gICAgICogVG9rZW5pemUgdGhlIHNwZWNpZmllZCBzdHJpbmcgaW50byBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mCi0gICAgICogd29yZHMuCi0gICAgICogSWYgdGhlIHN0cmluZyBzcGVjaWZpZWQgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgZW1wdHksIHRoaXMKLSAgICAgKiBtZXRob2Qgd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHMgICAgICBUaGUgc3RyaW5nIHRvIHRva2VuaXplIGludG8gYSA8Y29kZT5MaXN0PC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gc2VwICAgIFRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIHRvIHVzZSB0byBzcGxpdAotICAgICAqICAgICAgICAgICAgICAgdGhlIHN0cmluZy4KLSAgICAgKiBAcGFyYW0gdHJpbSAgIElmIDxjb2RlPnRydWU8L2NvZGU+LCBydW4gPGNvZGU+dHJpbTwvY29kZT4gb24KLSAgICAgKiAgICAgICAgICAgICAgIGVhY2ggZWxlbWVudCBpbiB0aGUgcmVzdWx0IDxjb2RlPkxpc3Q8L2NvZGU+LgotICAgICAqIAotICAgICAqIEByZXR1cm4gQSA8Y29kZT5MaXN0PC9jb2RlPiBjb250YWluaW5nIGFsbCB0b2tlbml6ZWQgd29yZHMKLSAgICAgKiAgICAgICAgIGluIHRoZSBwYXJhbWV0ZXIgc3RyaW5nLgotICAgICAqICAgICAgICAgRWFjaCBlbGVtZW50IGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLSAgICAgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBzdHJUb0xpc3QoU3RyaW5nIHMsIGNoYXIgc2VwLCBib29sZWFuIHRyaW0pCi0JewotCS8vZXg6IGlmIHNlcCBpcyAnOycgdGhlbiBzIHNob3VsZCBiZSBzb21ldGluZyBsaWtlICJSZWQ7QmxhY2siCi0JCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJQXJyYXlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQotCQljaGFyIGRlbGltaXRlcnNbXSA9IHtzZXB9OwotCQlqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyKHMsIG5ldyBTdHJpbmcoZGVsaW1pdGVycyksIHRydWUvKnJldHVybkRlbGltaXRlcnMqLyk7Ci0JCVN0cmluZyBsYXN0VG9rPW51bGw7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaWYgKHRvay5sZW5ndGgoKT09MSAmJiB0b2suY2hhckF0KDApPT1zZXApey8vZGVsaW1pdGVyCi0JCQkgICAgaWYgKHRvay5lcXVhbHMobGFzdFRvayl8fGxhc3RUb2s9PW51bGwvKmZpcnN0IGVsZW1lbnQgaXMgZW1wdHkqLykKLQkJCSAgICAgICAgcmVzdWx0LmFkZCgiIik7Ci0JCQl9Ci0JCQllbHNlewotCQkJICAgIGlmICh0cmltKQotCQkJICAgICAgICB0b2sgPSB0b2sudHJpbSgpOwotCQkJICAgIHJlc3VsdC5hZGQodG9rKTsKLQkJCX0KLQkJCWxhc3RUb2s9dG9rOwotCQl9Ci0JCWlmKGxhc3RUb2subGVuZ3RoKCk9PTEgJiYgbGFzdFRvay5jaGFyQXQoMCk9PXNlcCkvL2xhc3QgZWxlbWVudCBpcyBlbXB0eQotCQkgICAgcmVzdWx0LmFkZCgiIik7Ci0JCXJlc3VsdC50cmltVG9TaXplKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHN0clRvTGlzdChTdHJpbmcgcywgY2hhciBzZXApCi0JewotCQlyZXR1cm4gc3RyVG9MaXN0KHMsIHNlcCwgZmFsc2UvKnRyaW0qLyk7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpc3RUb1N0cihDb2xsZWN0aW9uIGEsIGNoYXIgc2VwKQotCXsKLQkJcmV0dXJuIGxpc3RUb1N0cihhLCBTdHJpbmcudmFsdWVPZihzZXApKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlzdFRvU3RyKENvbGxlY3Rpb248T2JqZWN0PiBhLCBTdHJpbmcgc2VwKSB7Ci0JCS8vcmV2ZXJzZSBvZiBzdHJUb0xpc3QKLQkJaWYgKGEgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgY291bnQgPSBhLnNpemUoKTsKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gaXRlciA9IGEuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLQkJewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJCi0JCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZWxzZQotCQkJCWJ1ZmZlci5hcHBlbmQoc2VwKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQkJYnVmZmVyLmFwcGVuZCgoU3RyaW5nKW9iaik7Ci0JCQllbHNlCi0JCQkJYnVmZmVyLmFwcGVuZChvYmopOwotCQl9Ci0JCXJldHVybiAoYnVmZmVyICE9IG51bGwpID8gYnVmZmVyLnRvU3RyaW5nKCkgOiBudWxsOwotCX0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSB0ZXh0IG9mIGEgU3RyaW5nIGludG8gYSBNYXAgb2YgU3RyaW5ncywgd2hlcmUgZWFjaAotCSAqIGtleSBhbmQgdmFsdWUgaW4gdGhlIE1hcCBpcyBvZiB0eXBlIFN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcyAgICAgIFRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkIHRvIGEgTWFwLgotCSAqIEBwYXJhbSBzZXAxICAgVGhlIHNlcGFyYXRvciBiZXR3ZWVuIGtleXMgYW5kIHRoZWlyCi0JICogICAgICAgICAgICAgICB2YWx1ZXMuCi0JICogQHBhcmFtIHNlcDIgICBUaGUgc2VwYXJhdG9yIGJldHdlZW4ga2V5LXZhbHVlIHBhaXJzLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHN0cmluZyBjb252ZXJ0ZWQgdG8gYSBNYXAuCi0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuTWFwPFN0cmluZywgU3RyaW5nPiBzdHJUb01hcChTdHJpbmcgcywgY2hhciBzZXAxLCBjaGFyIHNlcDIpCi0JewotCQlyZXR1cm4gc3RyVG9NYXAocywgc2VwMSwgc2VwMiwgZmFsc2UvKmxvd2VyY2FzZUtleXMqLyk7Ci0JfQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHRleHQgb2YgYSBTdHJpbmcgaW50byBhIE1hcCBvZiBTdHJpbmdzLCB3aGVyZSBlYWNoCi0JICoga2V5IGFuZCB2YWx1ZSBpbiB0aGUgTWFwIGlzIG9mIHR5cGUgU3RyaW5nLgotCSAqIFRoaXMgZm9ybSBhbHNvIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGF0IGFsbCBrZXlzIHdpbGwgYmUKLQkgKiBjb252ZXJ0ZWQgdG8gbG93ZXItY2FzZSBiZWZvcmUgYWRkaW5nIHRvIHRoZSBNYXAuCi0JICogCi0JICogQHBhcmFtIHMgICAgICBUaGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZCB0byBhIE1hcC4KLQkgKiBAcGFyYW0gc2VwMSAgIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBrZXlzIGFuZCB0aGVpcgotCSAqICAgICAgICAgICAgICAgdmFsdWVzLgotCSAqIEBwYXJhbSBzZXAyICAgVGhlIHNlcGFyYXRvciBiZXR3ZWVuIGtleS12YWx1ZSBwYWlycy4KLQkgKiBAcGFyYW0gbG93ZXJjYXNlS2V5cwotCSAqICAgICAgICAgICAgICAgV2hldGhlciB0byBjb252ZXJ0IGtleXMgdG8gbG93ZXIgY2FzZQotCSAqICAgICAgICAgICAgICAgYmVmb3JlIGFkZGluZyB0byB0aGUgTWFwLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHN0cmluZyBjb252ZXJ0ZWQgdG8gYSBNYXAuCi0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuTWFwPFN0cmluZywgU3RyaW5nPiBzdHJUb01hcChTdHJpbmcgcywgY2hhciBzZXAxLCBjaGFyIHNlcDIsIGJvb2xlYW4gbG93ZXJjYXNlS2V5cykKLQl7Ci0JCS8vZXg6IGlmIHNlcDEgaXMgJzonIGFuZCBzZXAyIGlzICcsJyB0aGVuIHMgc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlICJjb2xvcjpSZWQsc2l6ZTpYTCIKLQkJCi0JCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLQkJfQotCQkJCi0JCWphdmEudXRpbC5MaXN0PFN0cmluZz4gYSA9IHN0clRvTGlzdChzLCBzZXAyKTsKLQkJaWYgKGEgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0JCX0KLQkJCi0JCWphdmEudXRpbC5IYXNoTWFwPFN0cmluZywgU3RyaW5nPiBobSA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJaW50IGNvdW50ID0gYS5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkKLQkJewotCQkJU3RyaW5nIHMyID0gKFN0cmluZylhLmdldChpKTsgLy9leDogY29sb3I6UmVkCi0JCQlpbnQgcG9zID0gczIuaW5kZXhPZihzZXAxKTsKLQkJCWlmIChwb3MgPj0gMCkKLQkJCXsKLQkJCQlTdHJpbmcgbmFtZSA9IHMyLnN1YnN0cmluZygwLCBwb3MpOwotCQkJCVN0cmluZyB2YWwgPSBzMi5zdWJzdHJpbmcocG9zKzEpOwotCQkJCWlmIChsb3dlcmNhc2VLZXlzKQotCQkJCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJCWhtLnB1dChuYW1lLCB2YWwpOwotCQkJfQotCQl9Ci0JCXJldHVybiBobTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFwVG9TdHIoamF2YS51dGlsLk1hcCBobSwgY2hhciBzZXAxLCBjaGFyIHNlcDIpCi0JLy9yZXZlcnNlIG9mIHN0clRvTWFwCi0JewotCQlpZiAoaG0gPT0gbnVsbCB8fCBobS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWphdmEudXRpbC5JdGVyYXRvcjxqYXZhLnV0aWwuTWFwLkVudHJ5PiBpdGVyID0gaG0uZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWphdmEudXRpbC5NYXAuRW50cnkgZW50cnkgPSAoamF2YS51dGlsLk1hcC5FbnRyeSlpdGVyLm5leHQoKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpOwotCQkJYnVmZmVyLmFwcGVuZChzZXAxKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQlpZiAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlidWZmZXIuYXBwZW5kKHNlcDIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0gICAgLyoqCi0gICAgICogUGVyZm9ybSBhIDxlbT5jYXNlIGluc2Vuc2l0aXZlPC9lbT4gY29tcGFyaXNvbiBiZXR3ZWVuCi0gICAgICogdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgdHdvIG9iamVjdHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iajEgICBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUuCi0gICAgICogQHBhcmFtIG9iajIgICBUaGUgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYm90aCBvYmplY3RzIGhhdmUgdGhlCi0gICAgICogICAgICAgICBzYW1lIGNhc2UtaW5zZW5zaXRpdmUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotICAgICAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wYXJlQXNTdHJpbmdzKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikKLQl7CQotCQlpZiAob2JqMSA9PSBudWxsIHx8IG9iajIgPT0gbnVsbCkKLQkJCXJldHVybiBvYmoxID09IG9iajI7Ci0JCQotCQlTdHJpbmcgczEsIHMyOwotCQlpZiAob2JqMSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJczEgPSAoU3RyaW5nKW9iajE7Ci0gICAgICAgIH0gZWxzZSB7Ci0JCQlzMSA9IG9iajEudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCQlpZiAob2JqMiBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJczIgPSAoU3RyaW5nKW9iajI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0JCQlzMiA9IG9iajIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCQkKLQkJcmV0dXJuIHMxLmVxdWFsc0lnbm9yZUNhc2UoczIpOwotCX0KLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIGEgc3RyaW5nIHN0YXJ0cyB3aXRoIGFueSBvZiBhIGxpc3Qgb2Ygc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RhcnRzV2l0aEFueShTdHJpbmcgcywgTGlzdDxTdHJpbmc+IHByZWZpeGVzKSB7Ci0JCWludCBjb3VudCA9IHByZWZpeGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0JCQlpZiAocy5zdGFydHNXaXRoKChTdHJpbmcpcHJlZml4ZXMuZ2V0KGkpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYXJndW1lbnQgc3RyaW5nIHdpdGggdGhlIGZpcnN0IGNoYXIgdXBwZXItY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbml0VXBwZXIoU3RyaW5nIHN0cikgewotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBzdHI7Ci0JCX0KLQkJcmV0dXJuIENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdHIuY2hhckF0KDApKSArIHN0ci5zdWJzdHJpbmcoMSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFyZ3VtZW50IHN0cmluZyB3aXRoIHRoZSBmaXJzdCBjaGFyIGxvd2VyLWNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5pdExvd2VyKFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gc3RyOwotCQl9Ci0JCXJldHVybiBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc3RyLmNoYXJBdCgwKSkgKyBzdHIuc3Vic3RyaW5nKDEpOwotCX0KLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBzdHJpbmcgYXJlIHVwcGVyCi0JICogY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVcHBlckNhc2UoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIHMudG9VcHBlckNhc2UoKS5lcXVhbHMocyk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IG5vbi13aGl0ZSBjaGFyIGluZGV4IHN0YXJ0aW5nIGZyb20gdGhlIAotCSAqIHNwZWNpZmllZCBpbmRleC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBza2lwV2hpdGVTcGFjZXMoU3RyaW5nIHN0ciwgaW50IGluZGV4KSB7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCXdoaWxlIChpbmRleCA8IGxlbikgewotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHN0ci5jaGFyQXQoaW5kZXgpKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJKytpbmRleDsKLQkJfQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCS8qKgotCSAqIENvbGxhcHNlcyBjb25zZWN1dGl2ZSB3aGl0ZSBzcGFjZXMgaW50byBvbmUgc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sbGFwc2VXaGl0ZVNwYWNlcyhTdHJpbmcgc3RyKXsKLQkgICAgU3RyaW5nIHJlc3VsdD1udWxsOwotCSAgICBpZiAoc3RyIT1udWxsKXsKLQkgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXI9bmV3IFN0cmluZ0J1ZmZlcigpOwotCSAgICAgICAgYm9vbGVhbiBpc0luV2hpdGVTcGFjZT1mYWxzZTsKLQkgICAgICAgIGZvciAoaW50IGk9MDtpPHN0ci5sZW5ndGgoKTtpKyspewotCSAgICAgICAgICAgIGNoYXIgYz1zdHIuY2hhckF0KGkpOwotCSAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKXsKLQkgICAgICAgICAgICAgICAgaXNJbldoaXRlU3BhY2U9dHJ1ZTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgZWxzZSB7Ci0JICAgICAgICAgICAgICAgIGlmIChpc0luV2hpdGVTcGFjZSkKLQkgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAiKTsKLQkgICAgICAgICAgICAgICAgaXNJbldoaXRlU3BhY2U9ZmFsc2U7ICAgCi0JICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoYyk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICAgcmVzdWx0PWJ1ZmZlci50b1N0cmluZygpOwotCSAgICB9Ci0JICAgIHJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kcyB1c2VkIHRvIGNvbnZlcnQgREIgb2JqZWN0IG5hbWVzIHRvICAKLQkgKiBhcHByb3ByaWF0ZSBKYXZhIHR5cGUgYW5kIGZpZWxkIG5hbWUgCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGx1cmFsaXNlKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBuYW1lOwotCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAxKSB7Ci0JCQlyZXN1bHQgKz0gJ3MnOwotCQl9IGVsc2UgaWYgKCFzZWVtc1BsdXJhbGlzZWQobmFtZSkpIHsKLQkJCVN0cmluZyBsb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCWlmICghbG93ZXIuZW5kc1dpdGgoImRhdGEiKSkgeyAvL29yZGVyRGF0YSAtLT4gb3JkZXJEYXRhcyBpcyBkdW1iCi0JCQkJY2hhciBzZWNvbmRMYXN0ID0gbG93ZXIuY2hhckF0KG5hbWUubGVuZ3RoKCkgLSAyKTsKLQkJCQlpZiAoIWlzVm93ZWwoc2Vjb25kTGFzdCkgJiYgbG93ZXIuZW5kc1dpdGgoInkiKSkgewotCQkJCQkvLyBjaXR5LCBib2R5IGV0YyAtLT4gY2l0aWVzLCBib2RpZXMKLQkJCQkJcmVzdWx0ID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDEpICsgImllcyI7Ci0JCQkJfSBlbHNlIGlmIChsb3dlci5lbmRzV2l0aCgiY2giKSB8fCBsb3dlci5lbmRzV2l0aCgicyIpKSB7Ci0JCQkJCS8vIHN3aXRjaCAtLT4gc3dpdGNoZXMgIG9yIGJ1cyAtLT4gYnVzZXMKLQkJCQkJcmVzdWx0ID0gbmFtZSArICJlcyI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ID0gbmFtZSArICJzIjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaW5ndWxhcmlzZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbmFtZTsKLQkJaWYgKHNlZW1zUGx1cmFsaXNlZChuYW1lKSkgewotCQkJU3RyaW5nIGxvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKGxvd2VyLmVuZHNXaXRoKCJpZXMiKSkgewotCQkJCS8vIGNpdGllcyAtLT4gY2l0eQotCQkJCXJlc3VsdCA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAzKSArICJ5IjsKLQkJCX0gZWxzZSBpZiAobG93ZXIuZW5kc1dpdGgoImNoZXMiKSB8fCBsb3dlci5lbmRzV2l0aCgic2VzIikpIHsKLQkJCQkvLyBzd2l0Y2hlcyAtLT4gc3dpdGNoIG9yIGJ1c2VzIC0tPiBidXMKLQkJCQlyZXN1bHQgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMik7Ci0JCQl9IGVsc2UgaWYgKGxvd2VyLmVuZHNXaXRoKCJzIikpIHsKLQkJCQkvLyBjdXN0b21lcnMgLS0+IGN1c3RvbWVyCi0JCQkJcmVzdWx0ID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDEpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNWb3dlbChjaGFyIGMpIHsKLQkJYm9vbGVhbiB2b3dlbCA9IGZhbHNlOwotCQl2b3dlbCB8PSBjID09ICdhJzsKLQkJdm93ZWwgfD0gYyA9PSAnZSc7Ci0JCXZvd2VsIHw9IGMgPT0gJ2knOwotCQl2b3dlbCB8PSBjID09ICdvJzsKLQkJdm93ZWwgfD0gYyA9PSAndSc7Ci0JCXZvd2VsIHw9IGMgPT0gJ3knOwotCQlyZXR1cm4gdm93ZWw7Ci0JfQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2VlbXNQbHVyYWxpc2VkKFN0cmluZyBuYW1lKSB7Ci0JCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCWJvb2xlYW4gcGx1cmFsaXNlZCA9IGZhbHNlOwotCQlwbHVyYWxpc2VkIHw9IG5hbWUuZW5kc1dpdGgoImVzIik7Ci0JCXBsdXJhbGlzZWQgfD0gbmFtZS5lbmRzV2l0aCgicyIpOwotCQlwbHVyYWxpc2VkICY9ICEobmFtZS5lbmRzV2l0aCgic3MiKSB8fCBuYW1lLmVuZHNXaXRoKCJ1cyIpKTsKLQkJcmV0dXJuIHBsdXJhbGlzZWQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgbmFtZSBvZiBhIGNsYXNzIG5hbWUuCi0JICogRm9yIGV4YW1wbGUgaWYgZ2l2ZW4gPGNvZGU+b3JhY2xlLnV0aWwuT2JqZWN0VXRpbDwvY29kZT4gaXQgd291bGQgcmV0dXJuIAotCSAqIDxjb2RlPm9yYWNsZS51dGlsPC9jb2RlPi4gSWYgdGhlIGNsYXNzIGlzIG5vdCBpbiBhIHBhY2thZ2UgdGhlbiBudWxsIGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYoY2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWludCBsYXN0RG90SW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGxhc3REb3RJbmRleCA8IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgbGFzdERvdEluZGV4KTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgY2xhc3MgbmFtZSBnaXZlbiBhIGZ1bGwgY2xhc3MgbmFtZS4KLQkgKiBGb3IgZXhhbXBsZSBpZiBnaXZlbiA8Y29kZT5vcmFjbGUudXRpbC5PYmplY3RVdGlsPC9jb2RlPiBpdCB3b3VsZCByZXR1cm4gCi0JICogPGNvZGU+T2JqZWN0VXRpbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIGZ1bGxDbGFzc05hbWUpIHsKLQkJaWYoZnVsbENsYXNzTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgbGFzdERvdEluZGV4ID0gZnVsbENsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAobGFzdERvdEluZGV4IDwgMCkKLQkJCXJldHVybiBmdWxsQ2xhc3NOYW1lOwotCQlyZXR1cm4gZnVsbENsYXNzTmFtZS5zdWJzdHJpbmcobGFzdERvdEluZGV4KzEpOwotCX0KLQotCQotCS8qKgotCSAqIENvbnZlcnRzIGEgZGF0YWJhc2UgY29sdW1uIG5hbWUgdG8gYSBKYXZhIHZhcmlhYmxlIG5hbWUgKDxlbT5maXJzdCBsZXR0ZXIKLQkgKiBub3QgY2FwaXRhbGl6ZWQ8L2VtPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uTmFtZVRvVmFyTmFtZShTdHJpbmcgY29sdW1uTmFtZSkgewotCQlyZXR1cm4gZGJOYW1lVG9WYXJOYW1lKGNvbHVtbk5hbWUpOwotCX0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIGRhdGFiYXNlIHRhYmxlIG5hbWUgdG8gYSBKYXZhIHZhcmlhYmxlIG5hbWUgKDxlbT5maXJzdCBsZXR0ZXIKLQkgKiBub3QgY2FwaXRhbGl6ZWQ8L2VtPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFibGVOYW1lVG9WYXJOYW1lKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIGRiTmFtZVRvVmFyTmFtZSh0YWJsZU5hbWUpOwotCX0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIGRhdGFiYXNlIG5hbWUgKHRhYmxlIG9yIGNvbHVtbikgdG8gYSBqYXZhIG5hbWUgKDxlbT5maXJzdCBsZXR0ZXIKLQkgKiBub3QgY2FwaXRhbGl6ZWQ8L2VtPikuIGVtcGxveWVlX25hbWUgb3IgZW1wbG95ZWUtbmFtZSAtPiBlbXBsb3llZU5hbWUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGJOYW1lVG9WYXJOYW1lKFN0cmluZyBzKSB7Ci0JCWlmICgiIi5lcXVhbHMocykpIHsKLQkJCXJldHVybiBzOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJYm9vbGVhbiBjYXBpdGFsaXplID0gdHJ1ZTsKLQkJYm9vbGVhbiBsYXN0Q2FwaXRhbCA9IGZhbHNlOwotCQlib29sZWFuIGxhc3REZWNhcGl0YWxpemVkID0gZmFsc2U7Ci0JCVN0cmluZyBwID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKLQkJCVN0cmluZyBjID0gcy5zdWJzdHJpbmcoaSwgaSArIDEpOwotCQkJaWYgKCJfIi5lcXVhbHMoYykgfHwgIiAiLmVxdWFscyhjKSkgewotCQkJCWNhcGl0YWxpemUgPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoYy50b1VwcGVyQ2FzZSgpLmVxdWFscyhjKSkgewotCQkJCWlmIChsYXN0RGVjYXBpdGFsaXplZCAmJiAhbGFzdENhcGl0YWwpIHsKLQkJCQkJY2FwaXRhbGl6ZSA9IHRydWU7Ci0JCQkJfQotCQkJCWxhc3RDYXBpdGFsID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGFzdENhcGl0YWwgPSBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKGNhcGl0YWxpemUpIHsKLQkJCQlpZiAocCA9PSBudWxsIHx8ICFwLmVxdWFscygiXyIpKSB7Ci0JCQkJCXJlc3VsdC5hcHBlbmQoYy50b1VwcGVyQ2FzZSgpKTsKLQkJCQkJY2FwaXRhbGl6ZSA9IGZhbHNlOwotCQkJCQlwID0gYzsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQuYXBwZW5kKGMudG9Mb3dlckNhc2UoKSk7Ci0JCQkJCWNhcGl0YWxpemUgPSBmYWxzZTsKLQkJCQkJcCA9IGM7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQuYXBwZW5kKGMudG9Mb3dlckNhc2UoKSk7Ci0JCQkJbGFzdERlY2FwaXRhbGl6ZWQgPSB0cnVlOwotCQkJCXAgPSBjOwotCQkJfQotCi0JCX0KLQkJLyp0aGlzIHdhcyB1c2luZyBTdHJpbmdVdGlsLmluaXRMb3dlci4gQ2hhbmdlZCB0byBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplIHNvIHRoYXQgCi0JCSAqIGl0IHJldHVybnMgdGhlIGNvcnJlY3QgYmVhbiBwcm9wZXJ0eSBuYW1lIHdoZW4gY2FsbGVkIGZyb20gY29sdW1uTmFtZVRvVmFyTmFtZS4KLQkJICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvdGhlcndpc2UgVVJMIHdvdWxkIGJlIHVSTCB3aGljaCB3b3VsZCBjYXVzZSAKLQkJICogYW4gIlRoZSBwcm9wZXJ0eSB1UkwgaXMgdW5kZWZpbmVkIGZvciB0aGUgdHlwZSB4eCIgZXJyb3IgYmVjYXVzZSAKLQkJICogSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvICh1c2VkIGJ5IEphdmFUeXBlSW50cm9zcGVjdG9yKSByZXR1cm5zIAotCQkgKiB0aGUgcHJvcGVydHkgbmFtZSBhcyBVUkwuKi8KLQkJU3RyaW5nIHJlc3VsdFN0ciA9IEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUocmVzdWx0LnRvU3RyaW5nKCkpOwotCQlpZiAocmVzdWx0U3RyLmVxdWFscygiY2xhc3MiKSkgewotCQkJLy8gImNsYXNzIiBpcyBpbGxlZ2FsIGJlY2F1c2VPZiBPYmplY3QuZ2V0Q2xhc3MoKSBjbGFzaAotCQkJcmVzdWx0U3RyID0gImNsYXp6IjsKLQkJfQotCQlyZXR1cm4gcmVzdWx0U3RyOwotCX0KLQkKLQkvKioKLQkgKiBDb21wYXJlIHR3byBvYmplY3RzLiBJZiBib3RoIFN0cmluZywgaWdub3JlIGNhc2UKLQkgKiBAcGFyYW0gbzEKLQkgKiBAcGFyYW0gbzIKLQkgKiBAcGFyYW0gaWdub3JlQ2FzZUlmU3RyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbE9iamVjdHMoT2JqZWN0IG8xLCBPYmplY3QgbzIsIGJvb2xlYW4gaWdub3JlQ2FzZUlmU3RyKQotCXsKLQkJaWYgKG8xID09IG8yKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCSAgICBib29sZWFuIHJlc3VsdDsKLQkgICAgaWYgKG8xID09IG51bGwgfHwgbzIgPT0gbnVsbCkgewotCSAgICAJcmV0dXJuIGZhbHNlOyAvL3dlIGFscmVhZHkgY2hlY2tlZCBvMSA9PSBvMiBhYm92ZQotCSAgICB9Ci0JICAgIGlmIChpZ25vcmVDYXNlSWZTdHIgJiYgbzEgaW5zdGFuY2VvZiBTdHJpbmcgJiYgbzIgaW5zdGFuY2VvZiBTdHJpbmcpCi0JICAgICAgICByZXN1bHQgPSAoKFN0cmluZylvMSkuZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKW8yKTsKLQkgICAgZWxzZQotCSAgICAgICAgcmVzdWx0ID0gbzEuZXF1YWxzKG8yKTsKLQkKLQkgICAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxPYmplY3RzKE9iamVjdCBvMSwgT2JqZWN0IG8yKQotCXsKLQkgICAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvMSwgbzIsIGZhbHNlLyppZ25vcmVDYXNlSWZTdHIqLyk7Ci0JfQotCQotfQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL3V0aWwvVXJsVXRpbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL1VybFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJlZjhmOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL3V0aWwvVXJsVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIENvbGxlY3Rpb25zIG9mIHV0aWxpdHkgbWV0aG9kcyBoYW5kbGluZyBVUkxzLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVcmxVdGlsCi17Ci0JLyoqCi0JICogVGhlIDxjb2RlPmZpbGU8L2NvZGU+IHN0cmluZyBpbmRpY2F0aW5nIGEgdXJsIGZpbGUgcHJvdG9jb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlIjsKLQkvKioKLQkgKiBUaGUgPGNvZGU+ZmlsZTwvY29kZT4gc3RyaW5nIGluZGljYXRpbmcgYSB1cmwgaHR0cCBwcm90b2NvbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHAiOwotCS8qKgotCSAqIFRoZSA8Y29kZT5maWxlPC9jb2RlPiBzdHJpbmcgaW5kaWNhdGluZyBhIHVybCBodHRwIHByb3RvY29sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBTX1BST1RPQ09MID0gImh0dHBzIjsKLQkvKioKLQkgKiBUaGUgPGNvZGU+ZmlsZTwvY29kZT4gc3RyaW5nIGluZGljYXRpbmcgYSB1cmwgZmlsZSBwcm90b2NvbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfUFJPVE9DT0wgPSAiamFyIjsKLQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHVybCBpcyB0byBhIGZpbGUsIGkuZSBpdHMgcHJvdG9jb2wgaXMgPGNvZGU+ZmlsZTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmlsZVVybChVUkwgdXJsKSB7Ci0JCXJldHVybiB1cmwgIT0gbnVsbCAmJiBGSUxFX1BST1RPQ09MLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHVybCBpcyB0byBhIGphciwgaS5lIGl0cyBwcm90b2NvbCBpcyA8Y29kZT5qYXI8L2NvZGU+LgotCSAqIEZvciBleGFtcGxlIDxjb2RlPmphcjpmaWxlOi9DOi90ZXN0YXBwcy9leGFtcGxlL1dFQi1JTkYvbGliL3N0cnV0cy5qYXIhL01FVEEtSU5GL3RsZHMvc3RydXRzLWJlYW4udGxkPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXJVcmwoVVJMIHVybCkgewotCQlyZXR1cm4gdXJsICE9IG51bGwgJiYgSkFSX1BST1RPQ09MLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHVybCBwcm90b2NvbCBpcyBodHRwLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0h0dHBVcmwoVVJMIHVybCkgewotCQlTdHJpbmcgcHJvdG9jb2wgPSAgdXJsLmdldFByb3RvY29sKCk7Ci0JCXJldHVybiB1cmwgIT0gbnVsbCAmJiAoSFRUUF9QUk9UT0NPTC5lcXVhbHMocHJvdG9jb2wpIHx8IEhUVFBTX1BST1RPQ09MLmVxdWFscyhwcm90b2NvbCkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5GaWxlPC9jb2RlPiBjb3JyZXNwb25kaW5nIHRvIGEgdXJsLCBvciBudWxsIGlmIHRoZSB1cmwgCi0JICogcHJvdG9jb2wgaXMgbm90IGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLmlvLkZpbGUgZ2V0VXJsRmlsZShVUkwgdXJsKSB7Ci0JCWlmIChpc0ZpbGVVcmwodXJsKSAmJiAhaXNKYXJVcmwoIHVybCApICl7Ci0JCQlGaWxlIHJldCA9IG5ldyBqYXZhLmlvLkZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCQlyZXR1cm4gcmV0IDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLSAJfQotCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXJsIHRvIGEgamFyIGZpbGUgZ2l2ZW4gYSB1cmwgdG8gYSBmaWxlIGluc2lkZSAKLQkgKiB0aGUgamFyLgotCSAqIEZvciBleGFtcGxlIGlmIGdpdmVuIAotCSAqIDxjb2RlPmphcjpmaWxlOi9DOi90ZXN0YXBwcy9leGFtcGxlL1dFQi1JTkYvbGliL3N0cnV0cy5qYXIhL01FVEEtSU5GL3RsZHMvc3RydXRzLWJlYW4udGxkPC9jb2RlPgotCSAqIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+ZmlsZTovQzovdGVzdGFwcHMvZXhhbXBsZS9XRUItSU5GL2xpYi9zdHJ1dHMuamFyPC9jb2RlPi4KLQkgKiAKLQkgKiA8cD5SZXR1cm5zIG51bGwgaWYgdGhlIGdpdmVuIHVybCBpcyBub3QgcmVjb2duaXplZCBhcyBhIHVybCB0byBhIGZpbGUgCi0JICogaW5zaWRlIGEgamFyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGdldEphckZpbGVVcmwoVVJMIHVybCkgewotCQlpZiAoIWlzSmFyVXJsKHVybCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBmaWxlID0gdXJsLmdldEZpbGUoKTsgLy9maWxlOi9DOi90ZXN0YXBwcy9leGFtcGxlL1dFQi1JTkYvbGliL3N0cnV0cy5qYXIhL01FVEEtSU5GL3RsZHMvc3RydXRzLWJlYW4udGxkCi0JCWludCBpbmRleCA9IGZpbGUuaW5kZXhPZignIScpOwotCQlpZiAoaW5kZXggPCAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgamFyRmlsZVVybFN0ciA9IGZpbGUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVVJMKGphckZpbGVVcmxTdHIpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVtb3RlKFN0cmluZyB1cmwpewotCQlyZXR1cm4gdXJsLnN0YXJ0c1dpdGgoImh0dHA6Iil8fHVybC5zdGFydHNXaXRoKCJodHRwczoiKXx8dXJsLnN0YXJ0c1dpdGgoInd3dy4iKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldFRlbXBsYXRlRm9sZGVyKFN0cmluZyBwbHVnSWQgLCBTdHJpbmcgc3RyUGF0aCApewotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCBwbHVnSWQgKTsKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoIHN0clBhdGggKTsKLQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLCBwYXRoLCBudWxsKTsKLQkJdHJ5IHsKLQkJCVVSTCB0ZW1wbFVybDsKLQkJCXRlbXBsVXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotCQkJRmlsZSB0ZW1wbERpciA9IFVybFV0aWwuZ2V0VXJsRmlsZSh0ZW1wbFVybCk7Ci0JCQlyZXR1cm4gdGVtcGxEaXIgOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL2NvbHVtbi52bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL2NvbHVtbi52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxZjEzYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9jb2x1bW4udm0KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0jI2luY2x1ZGVkIHRlbXBsYXRlLiBHZW5lcmF0ZXMgdGhlIEBDb2x1bW4gYW5ub3RhdGlvbi4KLSMjQXNzdW1lcyB0aGF0IHRoZSBjb250ZXh0IGhhcyBhICJjb2x1bW4iIGFuZCBhICJ0YWJsZSIgb2JqZWN0Ci0jI2dlbmVyYXRlIGFubm90YXRpb24gb25seSB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbHVtbiBOT1QgZGVmYXVsdAotIyNhbmQgdGhlIGdlbmVyYXRlRExMQW5ub3RhdGlvbiBwcm9wZXJ0eSBpcyBub3Qgc2V0IG9uIHRoZSB0YWJsZQotIyMjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jbWFjcm8oIGFwcGVuZCAkbWVtYmVycyAkcGFyYW1ldGVycyApCi0jaWYoICRtZW1iZXJzID09ICIiKQotI3NldCggJG1lbWJlcnMgPSAkcGFyYW1ldGVycyApCi0jZWxzZQotI3NldCggJG1lbWJlcnMgPSAiJG1lbWJlcnMsICRwYXJhbWV0ZXJzIiApIAotI2VuZAkKLSNlbmQKLSMjIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmICggJGNvbHVtbi5kYXRhVHlwZUxPQikKLSAgICBATG9iKCkKLSNlbmQKLSNpZiAoICRjb2x1bW4ubmVlZE1hcFRlbXBvcmFsVHlwZSkKLSAgICBAVGVtcG9yYWwoIFRlbXBvcmFsVHlwZS4kY29sdW1uLnRlbXBvcmFsVHlwZSkKLSNlbmQKLSNzZXQgKCRtZW1iZXJzID0gIiIpCi0jaWYgKCAhJGNvbHVtbi5kZWZhdWx0IHx8ICRjdXN0b21pemVyLmdlbmVyYXRlRERMQW5ub3RhdGlvbnMgKQotI2lmICggISR7Y29sdW1uLmRlZmF1bHRuYW1lfSApCi0jYXBwZW5kKCRtZW1iZXJzICJuYW1lPSRjdXN0b21pemVyLnF1b3RlKCRjb2x1bW4ubmFtZSkiICkKLSNlbmQKLSNpZiAoISRjb2x1bW4uaW5zZXJ0YWJsZSkKLSNhcHBlbmQoJHttZW1iZXJzfSAiaW5zZXJ0YWJsZT1mYWxzZSIpCi0jZW5kCi0jaWYgKCEkY29sdW1uLnVwZGF0ZWFibGUpCi0jYXBwZW5kKCR7bWVtYmVyc30gInVwZGF0YWJsZT1mYWxzZSIpCi0jZW5kCi0jZW5kCi0jaWYoICRjdXN0b21pemVyLmdlbmVyYXRlRERMQW5ub3RhdGlvbnMgKQotI2lmICgkY29sdW1uLnVuaXF1ZSkKLSNhcHBlbmQoJG1lbWJlcnMgICJ1bmlxdWU9dHJ1ZSIpCi0jZW5kCi0jaWYgKCEkY29sdW1uLm51bGxhYmxlKQotI2FwcGVuZCgkbWVtYmVycyAgIm51bGxhYmxlPWZhbHNlIikKLSNlbmQKLSNpZiAoJGNvbHVtbi5zaXplID4gMCkKLSNpZiAoJGNvbHVtbi5udW1lcmljKQotI2FwcGVuZCgkbWVtYmVycyAicHJlY2lzaW9uPSRjb2x1bW4uc2l6ZSIpCi0jaWYgKCRjb2x1bW4uZGVjaW1hbERpZ2l0cyAhPSAwICYmICRjb2x1bW4uZGVjaW1hbERpZ2l0cyAhPSAtMSkKLSNhcHBlbmQoJG1lbWJlcnMgInNjYWxlPSRjb2x1bW4uZGVjaW1hbERpZ2l0cyIpCi0jZW5kCi0jZWxzZQotI2lmICggISRjb2x1bW4uZGF0YVR5cGVMT0IpCi0jYXBwZW5kKCRtZW1iZXJzICJsZW5ndGg9JGNvbHVtbi5zaXplIikKLSNlbmQKLSNlbmQKLSNlbmQKLSNlbmQKLSNpZiggJG1lbWJlcnMgIT0iIiApCi0JQENvbHVtbigkbWVtYmVycykKLSNlbmQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL2pvaW4udm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9qb2luLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzFlNGQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL2pvaW4udm0KKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jI2luY2x1ZGVkIHRlbXBsYXRlLiBHZW5lcmF0ZXMgdGhlIEBKb2luVGFibGUsIEBKb2luQ29sdW1uIG9yIEBKb2luQ29sdW1ucyBhbm5vdGF0aW9uLgotIyNBc3N1bWVzIHRoYXQgdGhlIGNvbnRleHQgaGFzIGEgInJvbGUiIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdlbmVyYXRlZCBBc3NvY2lhdGlvblJvbGUKLSMjCi0jI21hY3JvIGpvaW5Db2x1bW4gdXNlcyAkY29sdW1uLCAkcmVmZXJlbmNlZENvbHVtbgotI21hY3JvIChqb2luQ29sdW1uICRjb2x1bW4gJHJlZmVyZW5jZWRDb2x1bW4pCi0jc2V0ICgkbWVtYmVycyA9ICJuYW1lPSRjdXN0b21pemVyLnF1b3RlKCRjb2x1bW4uam9pbkNvbHVtbk5hbWUpIikKLSNpZiggISRyZWZlcmVuY2VkQ29sdW1uLnByaW1hcnlLZXkgfHwgJHJlZmVyZW5jZWRDb2x1bW4ucGFydE9mQ29tcG9zaXRlUHJpbWFyeUtleSApCi0jc2V0ICgkbWVtYmVycyA9ICIkbWVtYmVycywgcmVmZXJlbmNlZENvbHVtbk5hbWU9JGN1c3RvbWl6ZXIucXVvdGUoJHJlZmVyZW5jZWRDb2x1bW4ubmFtZSkiKQotI2VuZAotI2lmKCAkY3VzdG9taXplci5nZW5lcmF0ZURETEFubm90YXRpb25zICkKLSNpZiAoJGNvbHVtbi51bmlxdWUgJiYgISRjb2x1bW4ucHJpbWFyeUtleSkKLSNzZXQgKCRtZW1iZXJzID0gIiRtZW1iZXJzLCB1bmlxdWU9dHJ1ZSIpCi0jZW5kCi0jaWYgKCEkY29sdW1uLm51bGxhYmxlKQotI3NldCAoJG1lbWJlcnMgPSAiJG1lbWJlcnMsIG51bGxhYmxlPWZhbHNlIikKLSNlbmQKLSNlbmQKLSNpZiAoJGN1c3RvbWl6ZXIuZ2VuZXJhdGVERExBbm5vdGF0aW9ucyAmJiAhJHJvbGUuYXNzb2NpYXRpb24uam9pblRhYmxlICYmICEkcm9sZS5yZWZlcnJlclRhYmxlLmlzQ29sdW1uVXBkYXRlSW5zZXJ0KCRyb2xlLCAkY29sdW1uKSkKLSNzZXQgKCRtZW1iZXJzID0gIiRtZW1iZXJzLCBpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UiKQotI2VuZAotQEpvaW5Db2x1bW4oJG1lbWJlcnMpI2VuZAotIyMKLSMjCi0jIwotI2lmICgkcm9sZS5hc3NvY2lhdGlvbi5qb2luVGFibGUpCi0jc2V0ICgkam9pblRhYmxlID0gJHJvbGUuYXNzb2NpYXRpb24uam9pblRhYmxlKQotCUBKb2luVGFibGUoCi0JCW5hbWU9IiR7am9pblRhYmxlLmpvaW5UYWJsZUFubm90YXRpb25OYW1lfSIKLQkJLCBqb2luQ29sdW1ucz17Ci0jZm9yZWFjaCAoJGNvbHVtbiBpbiAkcm9sZS5yZWZlcnJlckNvbHVtbnMpCi0jc2V0ICgkcmVmZXJlbmNlZENvbHVtbiA9ICRyb2xlLmdldFJlZmVyZW5jZWRDb2x1bW4oJHtjb2x1bW4ubmFtZX0pKQotIyMkcmVmZXJlbmNlZENvbHVtbiBpcyB0aGUgY29sdW1uIGluIHRoZSBqb2luIHRhYmxlCi0JCQkjam9pbkNvbHVtbigkcmVmZXJlbmNlZENvbHVtbiAkY29sdW1uKQotI2lmICgkdmVsb2NpdHlDb3VudCA8ICRyb2xlLnJlZmVycmVyQ29sdW1ucy5zaXplKCkgKQotLAotI2VuZAkJCQotI2VuZAotCi0JCQl9Ci0JCSwgaW52ZXJzZUpvaW5Db2x1bW5zPXsKLSNmb3JlYWNoICgkY29sdW1uIGluICRyb2xlLnJlZmVyZW5jZWRDb2x1bW5zKQotI3NldCAoJHJlZmVyZW5jZWRDb2x1bW4gPSAkcm9sZS5nZXRSZWZlcnJlckNvbHVtbigke2NvbHVtbi5uYW1lfSkpCi0jIyRyZWZlcmVuY2VkQ29sdW1uIGlzIHRoZSBjb2x1bW4gaW4gdGhlIGpvaW4gdGFibGUKLQkJCSNqb2luQ29sdW1uKCRyZWZlcmVuY2VkQ29sdW1uICRjb2x1bW4pCi0jaWYgKCR2ZWxvY2l0eUNvdW50IDwgJHJvbGUucmVmZXJlbmNlZENvbHVtbnMuc2l6ZSgpICkKLSwKLSNlbmQJCQkKLSNlbmQKLQotCQkJfQotCQkpCi0jZWxzZQotI2lmICgkcm9sZS5yZWZlcnJlckNvbHVtbnMuc2l6ZSgpID09IDEpCi0jc2V0ICgkY29sdW1uID0gJHJvbGUucmVmZXJyZXJDb2x1bW5zLmdldCgwKSkKLSNzZXQgKCRyZWZlcmVuY2VkQ29sdW1uID0gJHJvbGUuZ2V0UmVmZXJlbmNlZENvbHVtbigke2NvbHVtbi5uYW1lfSkpCi0jc2V0ICgkcmVmZXJlbmNlZFRhYmxlTmFtZSA9ICRyb2xlLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldE5hbWUoKSApCi0jc2V0KCAkcmVmZXJlbmNlZFRhYmxlUGtOYW1lID0gJHJvbGUuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0UHJpbWFyeUtleUNvbHVtbigpLm5hbWUgKQotI3NldCggJGNvbXB1dGVkSm9pbkNvbHVtbk5hbWUgPSAiJHtyb2xlLnByb3BlcnR5TmFtZX1fJHtyZWZlcmVuY2VkVGFibGVQa05hbWV9IiApCi0jc2V0KCAkaXNEZWZhdWx0Sm9pbkNvbHVtbk5hbWUgPSAgJGNvbHVtbi5pc0RlZmF1bHRKb2luQ29sdW1uTmFtZSggJHtyb2xlLnByb3BlcnR5TmFtZX0pICkKLSNpZiggISAkaXNEZWZhdWx0Sm9pbkNvbHVtbk5hbWUgKQotCSNqb2luQ29sdW1uKCRjb2x1bW4gJHJlZmVyZW5jZWRDb2x1bW4pCi0KLSNlbHNlaWYoICRjdXN0b21pemVyLmdlbmVyYXRlRERMQW5ub3RhdGlvbnMgKQotCSNqb2luQ29sdW1uKCRjb2x1bW4gJHJlZmVyZW5jZWRDb2x1bW4pCi0KLSNlbmQKLSNlbHNlCi0JQEpvaW5Db2x1bW5zKHsKLSNmb3JlYWNoICgkY29sdW1uIGluICRyb2xlLnJlZmVycmVyQ29sdW1ucykKLSNzZXQgKCRyZWZlcmVuY2VkQ29sdW1uID0gJHJvbGUuZ2V0UmVmZXJlbmNlZENvbHVtbigke2NvbHVtbi5uYW1lfSkpCi0JCSNqb2luQ29sdW1uKCRjb2x1bW4gJHJlZmVyZW5jZWRDb2x1bW4pCi0jaWYgKCR2ZWxvY2l0eUNvdW50IDwgJHJvbGUucmVmZXJyZXJDb2x1bW5zLnNpemUoKSApCi0sCi0jZWxzZQotCi0jZW5kCi0jZW5kCQkKLQkJfSkKLSNlbmQKLSNlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYWluLmphdmEudm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYWluLmphdmEudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNTBhNzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFpbi5qYXZhLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLSNpZiAoJHRhYmxlLnBhY2thZ2UgIT0gIiIpCi1wYWNrYWdlICR7dGFibGUucGFja2FnZX07Ci0jZW5kCi0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOwotJHt0YWJsZS5pbXBvcnRTdGF0ZW1lbnRzfQotCi0vKioKLSAqIFRoZSBwZXJzaXN0ZW50IGNsYXNzIGZvciB0aGUgJHt0YWJsZS5uYW1lfSBkYXRhYmFzZSB0YWJsZS4KLSAqIAotICovCi1ARW50aXR5Ci0jaWYoICEke3RhYmxlLmRlZmF1bHRuYW1lfSB8fCAkY3VzdG9taXplci5nZW5lcmF0ZURETEFubm90YXRpb25zKQotQFRhYmxlKG5hbWU9IiR7dGFibGUubmFtZX0iKQotI2VuZAotcHVibGljIGNsYXNzICR7dGFibGUuY2xhc3NOYW1lfSAke3RhYmxlLmdlbmVyYXRlRXh0ZW5kc0ltcGxlbWVudHMoKX0gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotIyMjIyMKLSMjIyMjIGZpZWxkcwotIyMjIyMKLSNpZiAoJHRhYmxlLmNvbXBvc2l0ZUtleSkKLSNpZiAoJHRhYmxlLmFjY2VzcyA9PSAiZmllbGQiKQotCi0JQEVtYmVkZGVkSWQKLSNlbmQKLQlwcml2YXRlICR7dGFibGUuY29tcG9zaXRlS2V5Q2xhc3NOYW1lfSAke3RhYmxlLmNvbXBvc2l0ZUtleVByb3BlcnR5TmFtZX07Ci0jZW5kCi0jZm9yZWFjaCAoJGNvbHVtbiBpbiAkdGFibGUuZ2V0U2ltcGxlQ29sdW1ucyh0cnVlLCB0cnVlLCBmYWxzZSkpCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gImZpZWxkIikKLQotI3BhcnNlKCJtYXBwaW5nS2luZC52bSIpCi0jcGFyc2UoImNvbHVtbi52bSIpCi0jZW5kCi0JJHtjb2x1bW4uZmllbGRTY29wZX0gJHtjb2x1bW4uc2ltcGxlUHJvcGVydHlUeXBlfSAke2NvbHVtbi5wcm9wZXJ0eU5hbWV9OwotI2VuZAotI2ZvcmVhY2ggKCRyb2xlIGluICR0YWJsZS5hc3NvY2lhdGlvblJvbGVzKQotIyMjIyMKLSMjIyMjIGZpZWxkIGFubm90YXRpb25zCi0jIyMjIwotI2lmICgkdGFibGUuYWNjZXNzID09ICJmaWVsZCIpCi0KLQkvLyR7cm9sZS5kZXNjcmlwdGlvbn0KLSNpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm1hbnktdG8tb25lIikKLSNwYXJzZSgibWFueVRvT25lLnZtIikKLSNlbHNlaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW1hbnkiKQotI3BhcnNlKCJtYW55VG9NYW55LnZtIikKLSNlbHNlaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJvbmUtdG8tbWFueSIpCi0jcGFyc2UoIm9uZVRvTWFueS52bSIpCi0jZWxzZWlmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAib25lLXRvLW9uZSIpCi0jcGFyc2UoIm9uZVRvT25lLnZtIikKLSNlbmQKLSNlbmQKLSMjIyMjCi0jIyMjIyBmaWVsZCBkZWNsYXJhdGlvbgotIyMjIyMKLSNpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm1hbnktdG8tb25lIiB8fCAkcm9sZS5jYXJkaW5hbGl0eSA9PSAib25lLXRvLW9uZSIpCi0jc2V0ICgkcHJvcGVydHlUeXBlID0gJHtyb2xlLnJlZmVyZW5jZWRUYWJsZS5jbGFzc05hbWV9KQotI2Vsc2VpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm1hbnktdG8tbWFueSIgfHwgJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1tYW55IikKLSNzZXQgKCRwcm9wZXJ0eVR5cGUgPSAiJHtyb2xlLnJlZmVyZW5jZWRUYWJsZS5zaW1wbGVDb2xsZWN0aW9uVHlwZX08JHtyb2xlLnJlZmVyZW5jZWRUYWJsZS5jbGFzc05hbWV9PiIpCi0jZW5kCi0JcHJpdmF0ZSAkcHJvcGVydHlUeXBlICRyb2xlLnByb3BlcnR5TmFtZTsKLSNlbmQKLQotICAgIHB1YmxpYyAke3RhYmxlLmNsYXNzTmFtZX0oKSB7Ci0gICAgfQotCi0jIyMjIwotIyMjIyMgc2ltcGxlIHByb3BlcnRpZXMgZ2V0dGVycyBhbmQgc2V0dGVycwotIyMjIyMKLSNpZiAoJHRhYmxlLmNvbXBvc2l0ZUtleSkKLSNpZiAoJHRhYmxlLmFjY2VzcyA9PSAicHJvcGVydHkiKQotCi0JQEVtYmVkZGVkSWQKLSNlbmQKLQlwdWJsaWMgJHRhYmxlLmNvbXBvc2l0ZUtleUNsYXNzTmFtZSAkY3VzdG9taXplci5wcm9wZXJ0eUdldHRlcigkdGFibGUuY29tcG9zaXRlS2V5UHJvcGVydHlOYW1lKSgpIHsKLQkJcmV0dXJuIHRoaXMuJHt0YWJsZS5jb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWV9OwotCX0KLQotCXB1YmxpYyB2b2lkICRjdXN0b21pemVyLnByb3BlcnR5U2V0dGVyKCR0YWJsZS5jb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWUpKCR0YWJsZS5jb21wb3NpdGVLZXlDbGFzc05hbWUgJHRhYmxlLmNvbXBvc2l0ZUtleVByb3BlcnR5TmFtZSkgewotCQl0aGlzLiR7dGFibGUuY29tcG9zaXRlS2V5UHJvcGVydHlOYW1lfSA9ICR7dGFibGUuY29tcG9zaXRlS2V5UHJvcGVydHlOYW1lfTsKLQl9Ci0JCi0jZW5kCi0jZm9yZWFjaCAoJGNvbHVtbiBpbiAkdGFibGUuZ2V0U2ltcGxlQ29sdW1ucyh0cnVlLCB0cnVlLCBmYWxzZSkpCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gInByb3BlcnR5IikKLQotI3BhcnNlKCJtYXBwaW5nS2luZC52bSIpCi0jcGFyc2UoImNvbHVtbi52bSIpCi0jZW5kCi0JJGNvbHVtbi5wcm9wZXJ0eUdldFNjb3BlICRjb2x1bW4uc2ltcGxlUHJvcGVydHlUeXBlICRjdXN0b21pemVyLnByb3BlcnR5R2V0dGVyKCRjb2x1bW4ucHJvcGVydHlOYW1lKSgpIHsKLQkJcmV0dXJuIHRoaXMuJHtjb2x1bW4ucHJvcGVydHlOYW1lfTsKLQl9Ci0KLQkkY29sdW1uLnByb3BlcnR5U2V0U2NvcGUgdm9pZCAkY3VzdG9taXplci5wcm9wZXJ0eVNldHRlcigkY29sdW1uLnByb3BlcnR5TmFtZSkoJGNvbHVtbi5zaW1wbGVQcm9wZXJ0eVR5cGUgJGNvbHVtbi5wcm9wZXJ0eU5hbWUpIHsKLQkJdGhpcy4ke2NvbHVtbi5wcm9wZXJ0eU5hbWV9ID0gJHtjb2x1bW4ucHJvcGVydHlOYW1lfTsKLQl9Ci0KLSNlbmQKLSMjIyMjCi0jIyMjIyBhc3NvY2lhdGlvbnMgZ2V0dGVycyBhbmQgc2V0dGVycwotIyMjIyMKLSNmb3JlYWNoICgkcm9sZSBpbiAkdGFibGUuYXNzb2NpYXRpb25Sb2xlcykKLSNpZiAoJHRhYmxlLmFjY2VzcyA9PSAicHJvcGVydHkiKQotCi0JLy8ke3JvbGUuZGVzY3JpcHRpb259Ci0jaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW9uZSIpCi0jcGFyc2UoIm1hbnlUb09uZS52bSIpCi0jZWxzZWlmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAibWFueS10by1tYW55IikKLSNwYXJzZSgibWFueVRvTWFueS52bSIpCi0jZWxzZWlmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAib25lLXRvLW1hbnkiKQotI3BhcnNlKCJvbmVUb01hbnkudm0iKQotI2Vsc2VpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1vbmUiKQotI3BhcnNlKCJvbmVUb09uZS52bSIpCi0jZW5kCi0jZW5kCi0jIwotI2lmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAibWFueS10by1vbmUiIHx8ICRyb2xlLmNhcmRpbmFsaXR5ID09ICJvbmUtdG8tb25lIikKLSNzZXQgKCRwcm9wZXJ0eVR5cGUgPSAkcm9sZS5yZWZlcmVuY2VkVGFibGUuY2xhc3NOYW1lKQotI2Vsc2VpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm1hbnktdG8tbWFueSIgfHwgJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1tYW55IikKLSNzZXQgKCRwcm9wZXJ0eVR5cGUgPSAiJHtyb2xlLnJlZmVyZW5jZWRUYWJsZS5zaW1wbGVDb2xsZWN0aW9uVHlwZX08JHtyb2xlLnJlZmVyZW5jZWRUYWJsZS5jbGFzc05hbWV9PiIpCi0jZW5kCi0JcHVibGljICRwcm9wZXJ0eVR5cGUgJGN1c3RvbWl6ZXIucHJvcGVydHlHZXR0ZXIoJHJvbGUucHJvcGVydHlOYW1lKSgpIHsKLQkJcmV0dXJuIHRoaXMuJHtyb2xlLnByb3BlcnR5TmFtZX07Ci0JfQotCi0JcHVibGljIHZvaWQgJHtjdXN0b21pemVyLnByb3BlcnR5U2V0dGVyKCRyb2xlLnByb3BlcnR5TmFtZSl9KCRwcm9wZXJ0eVR5cGUgJHJvbGUucHJvcGVydHlOYW1lKSB7Ci0JCXRoaXMuJHtyb2xlLnByb3BlcnR5TmFtZX0gPSAkcm9sZS5wcm9wZXJ0eU5hbWU7Ci0JfQotCQotIyMKLSNlbmQKLSMjCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFueVRvTWFueS52bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hbnlUb01hbnkudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ODJhYTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFueVRvTWFueS52bQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjaW5jbHVkZWQgdGVtcGxhdGUuIEdlbmVyYXRlcyB0aGUgQE1hbnlUb01hbnkgYW5ub3RhdGlvbi4KLSMjQXNzdW1lcyB0aGF0IHRoZSBjb250ZXh0IGhhcyBhICJyb2xlIiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBnZW5lcmF0ZWQgQXNzb2NpYXRpb25Sb2xlCi0jIwotI2lmICgkcm9sZS5hc3NvY2lhdGlvbi5iaWRpcmVjdGlvbmFsICYmICEkcm9sZS5pc1JlZmVycmVyUm9sZSgpKSMjdGhlIG93bmluZyBzaWRlIChlaXRoZXIgc2lkZSBmb3IgbWFueS10by1tYW55KQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCIiLCAibWFwcGVkQnkiLCAkcm9sZS5vcHBvc2l0ZVJvbGUucHJvcGVydHlOYW1lLCB0cnVlKSkKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImNhc2NhZGUiLCAkY3VzdG9taXplci5nZW5DYXNjYWRlcygkcm9sZSksIGZhbHNlKSkKLSNpZigkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9IiIgJiYgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSJGZXRjaFR5cGUuTEFaWSIpCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJmZXRjaCIsICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpLCBmYWxzZSkpCi0jZW5kCi0jaWYoJG1lbWJlcnMhPSIiKQotCUBNYW55VG9NYW55KCRtZW1iZXJzKQotI2Vsc2UJCi0gICAgQE1hbnlUb01hbnkKLSNlbmQgICAgCi0jZWxzZQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCIiLCAiY2FzY2FkZSIsICRjdXN0b21pemVyLmdlbkNhc2NhZGVzKCRyb2xlKSwgZmFsc2UpKQotI2lmKCRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0iIiAmJiAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9IkZldGNoVHlwZS5MQVpZIikKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImZldGNoIiwgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSksIGZhbHNlKSkKLSNlbmQKLSNpZigkbWVtYmVycyE9IiIpCi0JQE1hbnlUb01hbnkoJG1lbWJlcnMpCi0jZWxzZQkKLSAgICBATWFueVRvTWFueQotI2VuZCAgICAKLSNwYXJzZSgiam9pbi52bSIpCi0jZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFueVRvT25lLnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFueVRvT25lLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDI3OWJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hbnlUb09uZS52bQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjaW5jbHVkZWQgdGVtcGxhdGUuIEdlbmVyYXRlcyB0aGUgQE1hbnlUb09uZSBhbm5vdGF0aW9uLgotIyNBc3N1bWVzIHRoYXQgdGhlIGNvbnRleHQgaGFzIGEgInJvbGUiIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdlbmVyYXRlZCBBc3NvY2lhdGlvblJvbGUKLSMjCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oIiIsICJjYXNjYWRlIiwgJGN1c3RvbWl6ZXIuZ2VuQ2FzY2FkZXMoJHJvbGUpLCBmYWxzZSkpCi0jaWYoICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0gIiIgJiYgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSAiRmV0Y2hUeXBlLkVBR0VSIikKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImZldGNoIiwgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSksIGZhbHNlKSkKLSNlbmQKLSNpZigkbWVtYmVycyE9IiIpCi0JQE1hbnlUb09uZSgkbWVtYmVycykKLSNlbHNlCi0gICAgQE1hbnlUb09uZQotI2VuZAotI3BhcnNlKCJqb2luLnZtIikKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYXBwaW5nS2luZC52bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hcHBpbmdLaW5kLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGFkMDU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hcHBpbmdLaW5kLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyNpbmNsdWRlZCB0ZW1wbGF0ZS4gR2VuZXJhdGVzIHRoZSBAQmFzaWMsIEBJZCwgQFZlcnNpb24gYW5ub3RhdGlvbnMuCi0jI0Fzc3VtZXMgdGhhdCB0aGUgY29udGV4dCBoYXMgYSAiY29sdW1uIiBvYmplY3QKLSMjCi0jc2V0ICgkbWFwcGluZ0tpbmQgPSAkY29sdW1uLm1hcHBpbmdLaW5kKQotI2lmICgkbWFwcGluZ0tpbmQgPT0gImlkIikKLQlASWQKLSNzZXQgKCRpZEdlbmVyYXRvciA9ICR0YWJsZS5pZEdlbmVyYXRvcikKLSNpZiAoJGlkR2VuZXJhdG9yID09ICJhdXRvIikKLSNzZXQgKCRnZW5lcmF0aW9uVHlwZSA9ICJHZW5lcmF0aW9uVHlwZS5BVVRPIikKLSNlbHNlaWYgKCRpZEdlbmVyYXRvciA9PSAiaWRlbnRpdHkiKQotI3NldCAoJGdlbmVyYXRpb25UeXBlID0gIkdlbmVyYXRpb25UeXBlLklERU5USVRZIikKLSNlbHNlaWYgKCRpZEdlbmVyYXRvciA9PSAic2VxdWVuY2UiKQotI3NldCAoJGdlbmVyYXRpb25UeXBlID0gIkdlbmVyYXRpb25UeXBlLlNFUVVFTkNFIikKLSNlbHNlaWYgKCRpZEdlbmVyYXRvciA9PSAidGFibGUiKQotI3NldCAoJGdlbmVyYXRpb25UeXBlID0gIkdlbmVyYXRpb25UeXBlLlRBQkxFIikKLSNlbHNlCi0jc2V0ICgkZ2VuZXJhdGlvblR5cGUgPSAiIikKLSNlbmQKLSNpZiAoJGlkR2VuZXJhdG9yID09ICJzZXF1ZW5jZSIgKQotI3NldCAoJGdlbmVyYXRvck5hbWUgPSAiJHt0YWJsZS5uYW1lLnRvVXBwZXJDYXNlKCl9XyR7Y29sdW1uLnByb3BlcnR5TmFtZS50b1VwcGVyQ2FzZSgpfV9HRU5FUkFUT1IiKQotI2lmKCAkdGFibGUuZm9ybWF0dGVkU2VxdWVuY2UgIT0gIiIgKQotCUBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPSIkZ2VuZXJhdG9yTmFtZSIsIHNlcXVlbmNlTmFtZT0iJHRhYmxlLmZvcm1hdHRlZFNlcXVlbmNlIikKLSNlbHNlCi0JQFNlcXVlbmNlR2VuZXJhdG9yKG5hbWU9IiRnZW5lcmF0b3JOYW1lIiApCi0jZW5kCQotCUBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneT0kZ2VuZXJhdGlvblR5cGUsIGdlbmVyYXRvcj0iJGdlbmVyYXRvck5hbWUiKQotI2Vsc2VpZiAoJGdlbmVyYXRpb25UeXBlICE9ICIiKQotCUBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneT0kZ2VuZXJhdGlvblR5cGUpCi0jZW5kICAgICAgCi0jZWxzZWlmICgkbWFwcGluZ0tpbmQgPT0gInZlcnNpb24iKQotCUBWZXJzaW9uCi0jZWxzZQotIyNERUZBVUxUIGlzIEBCYXNpYywgbm8gbmVlZCB0byBnZW5lcmF0ZQotI2VuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL29uZVRvTWFueS52bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL29uZVRvTWFueS52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZmMTVjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9vbmVUb01hbnkudm0KKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jI2luY2x1ZGVkIHRlbXBsYXRlLiBHZW5lcmF0ZXMgdGhlIEBPbmVUb01hbnkgYW5ub3RhdGlvbi4KLSMjQXNzdW1lcyB0aGF0IHRoZSBjb250ZXh0IGhhcyBhICJyb2xlIiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBnZW5lcmF0ZWQgQXNzb2NpYXRpb25Sb2xlCi0jIwotI2lmICgkcm9sZS5hc3NvY2lhdGlvbi5iaWRpcmVjdGlvbmFsKQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCIiLCAibWFwcGVkQnkiLCAkcm9sZS5vcHBvc2l0ZVJvbGUucHJvcGVydHlOYW1lLCB0cnVlKSkKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImNhc2NhZGUiLCAkY3VzdG9taXplci5nZW5DYXNjYWRlcygkcm9sZSksIGZhbHNlKSkKLSNpZigkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9IiIgJiYgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkgIT0iRmV0Y2hUeXBlLkxBWlkiKQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCRtZW1iZXJzLCAiZmV0Y2giLCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSwgZmFsc2UpKQotI2VuZAotCUBPbmVUb01hbnkoJG1lbWJlcnMpCi0jZWxzZQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCIiLCAiY2FzY2FkZSIsICRjdXN0b21pemVyLmdlbkNhc2NhZGVzKCRyb2xlKSwgZmFsc2UpKQotI2lmKCRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0iIiAmJiAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSAhPSJGZXRjaFR5cGUuTEFaWSIpCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJmZXRjaCIsICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpLCBmYWxzZSkpCi0jZW5kCi0JQE9uZVRvTWFueSgkbWVtYmVycykKLSNwYXJzZSgiam9pbi52bSIpCi0jZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvb25lVG9PbmUudm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9vbmVUb09uZS52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkNzUxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9vbmVUb09uZS52bQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjaW5jbHVkZWQgdGVtcGxhdGUuIEdlbmVyYXRlcyB0aGUgQE9uZVRvT25lIGFubm90YXRpb24uCi0jI0Fzc3VtZXMgdGhhdCB0aGUgY29udGV4dCBoYXMgYSAicm9sZSIgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ2VuZXJhdGVkIEFzc29jaWF0aW9uUm9sZQotIyMKLSNpZiAoJHJvbGUuYXNzb2NpYXRpb24uYmlkaXJlY3Rpb25hbCAmJiAhJHJvbGUuaXNSZWZlcnJlclJvbGUoKSkjI3RoZSBvd25pbmcgc2lkZSAoZWl0aGVyIHNpZGUgZm9yIG9uZS10by1vbmUpCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oIiIsICJtYXBwZWRCeSIsICRyb2xlLm9wcG9zaXRlUm9sZS5wcm9wZXJ0eU5hbWUsIHRydWUpKQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCRtZW1iZXJzLCAiY2FzY2FkZSIsICRjdXN0b21pemVyLmdlbkNhc2NhZGVzKCRyb2xlKSwgZmFsc2UpKQotI2lmKCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9IiIgJiYgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSJGZXRjaFR5cGUuRUFHRVIiICkKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImZldGNoIiwgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSksIGZhbHNlKSkKLSNlbmQKLQlAT25lVG9PbmUoJG1lbWJlcnMpCi0jZWxzZQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCIiLCAiY2FzY2FkZSIsICRjdXN0b21pemVyLmdlbkNhc2NhZGVzKCRyb2xlKSwgZmFsc2UpKQotI2lmKCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9IiIgJiYgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSJGZXRjaFR5cGUuRUFHRVIiICkKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImZldGNoIiwgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSksIGZhbHNlKSkKLSNlbmQKLSNpZigkbWVtYmVycyE9IiIpCi0JQE9uZVRvT25lKCRtZW1iZXJzKQotI2Vsc2UKLQlAT25lVG9PbmUKLSNlbmQKLSNwYXJzZSgiam9pbi52bSIpCi0jZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvcGsuamF2YS52bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL3BrLmphdmEudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MzEwOTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvcGsuamF2YS52bQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSNpZiAoJHRhYmxlLnBhY2thZ2UgIT0gIiIpCi1wYWNrYWdlICR7dGFibGUucGFja2FnZX07Ci0jZW5kCi0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOwotCi0vKioKLSAqIFRoZSBwcmltYXJ5IGtleSBjbGFzcyBmb3IgdGhlICR7dGFibGUubmFtZX0gZGF0YWJhc2UgdGFibGUuCi0gKiAKLSAqLwotQEVtYmVkZGFibGUKLXB1YmxpYyBjbGFzcyAke3RhYmxlLmNvbXBvc2l0ZUtleUNsYXNzTmFtZX0gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCS8vZGVmYXVsdCBzZXJpYWwgdmVyc2lvbiBpZCwgcmVxdWlyZWQgZm9yIHNlcmlhbGl6YWJsZSBjbGFzc2VzLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotIyMjIyMKLSMjIyMjIGZpZWxkcwotIyMjIyMKLSNmb3JlYWNoICgkY29sdW1uIGluICR0YWJsZS5wcmltYXJ5S2V5Q29sdW1ucykKLSNpZiAoJHRhYmxlLmFjY2VzcyA9PSAiZmllbGQiKQotCi0jcGFyc2UoImNvbHVtbi52bSIpCi0jZW5kCi0JJHtjb2x1bW4uZmllbGRTY29wZX0gJHtjb2x1bW4ucHJvcGVydHlUeXBlfSAke2NvbHVtbi5wcm9wZXJ0eU5hbWV9OwotI2VuZAotCi0gICAgcHVibGljICR7dGFibGUuY29tcG9zaXRlS2V5Q2xhc3NOYW1lfSgpIHsKLSAgICB9Ci0jIyMjIwotIyMjIyMgc2ltcGxlIHByb3BlcnRpZXMgZ2V0dGVycyBhbmQgc2V0dGVycwotIyMjIyMKLSNmb3JlYWNoICgkY29sdW1uIGluICR0YWJsZS5wcmltYXJ5S2V5Q29sdW1ucykKLSNpZiAoJHRhYmxlLmFjY2VzcyA9PSAicHJvcGVydHkiKQotCi0jcGFyc2UoImNvbHVtbi52bSIpCi0jZW5kCi0JJGNvbHVtbi5wcm9wZXJ0eUdldFNjb3BlICRjb2x1bW4ucHJvcGVydHlUeXBlICRjdXN0b21pemVyLnByb3BlcnR5R2V0dGVyKCRjb2x1bW4ucHJvcGVydHlOYW1lKSgpIHsKLQkJcmV0dXJuIHRoaXMuJHtjb2x1bW4ucHJvcGVydHlOYW1lfTsKLQl9Ci0JJGNvbHVtbi5wcm9wZXJ0eVNldFNjb3BlIHZvaWQgJGN1c3RvbWl6ZXIucHJvcGVydHlTZXR0ZXIoJGNvbHVtbi5wcm9wZXJ0eU5hbWUpKCRjb2x1bW4ucHJvcGVydHlUeXBlICRjb2x1bW4ucHJvcGVydHlOYW1lKSB7Ci0JCXRoaXMuJHtjb2x1bW4ucHJvcGVydHlOYW1lfSA9ICR7Y29sdW1uLnByb3BlcnR5TmFtZX07Ci0JfQotI2VuZAotIyMKLSMjIGVxdWFscy9oYXNoQ29kZQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQlpZiAodGhpcyA9PSBvdGhlcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiAke3RhYmxlLmNvbXBvc2l0ZUtleUNsYXNzTmFtZX0pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJJHt0YWJsZS5jb21wb3NpdGVLZXlDbGFzc05hbWV9IGNhc3RPdGhlciA9ICgke3RhYmxlLmNvbXBvc2l0ZUtleUNsYXNzTmFtZX0pb3RoZXI7Ci0JCXJldHVybiAKLQkJCSR7dGFibGUucHJpbWFyeUtleUVxdWFsc0NsYXVzZX0KLQotICAgIH0KLSAgICAKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLQkJaW50IGhhc2ggPSAxNzsKLQkJJHt0YWJsZS5wcmltYXJ5S2V5SGFzaENvZGVDbGF1c2V9Ci0JCXJldHVybiBoYXNoOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDU1MmY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbjwvbmFtZT4KLQk8Y29tbWVudD5tb3ZlZCB0byBqYXhiIGNvbXBvbmVudDwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjMzAxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIudWk8L25hbWU+Ci0JPGNvbW1lbnQ+bW92ZWQgdG8gamF4YiBjb21wb25lbnQ8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTdjNzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pzdC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTZkZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbgotQGRvdAotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwotamF2YUNvbXBpbGVyLi4uYXJncy4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5qZXRwcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5qZXRwcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTA3YzgzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8uamV0cHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08amV0LXNldHRpbmdzPgotCTx0ZW1wbGF0ZS1jb250YWluZXI+dGVtcGxhdGVzPC90ZW1wbGF0ZS1jb250YWluZXI+CTxzb3VyY2UtY29udGFpbmVyPnNyYzwvc291cmNlLWNvbnRhaW5lcj4KLTwvamV0LXNldHRpbmdzPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5vcHRpb25zIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2UxMjI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIG9yZy5lY2xpcHNlLmpwdC51aSBwbHVnLWluCi0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIHRoZSBvcmcuZWNsaXBzZS5qcHQudWkgcGx1Z2luLgotb3JnLmVjbGlwc2UuanB0LnVpL2RlYnVnPWZhbHNlCi0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIHVuaXQtdGVzdHMKLW9yZy5lY2xpcHNlLmpwdC51aS9kZWJ1Zy91bml0LXRlc3RzPWZhbHNlCi0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIGV2ZW50cyBvY2N1cnJpbmcgaW4gdGhlIFVJIHBhbmVzCi1vcmcuZWNsaXBzZS5qcHQudWkvZGVidWcvdWkvbGF5b3V0PWZhbHNlCi1vcmcuZWNsaXBzZS5qcHQudWkvZGVidWcvdWkvZGV0YWlsc1ZpZXc9ZmFsc2UKLQotIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgZXZlbnRzIGNvbWluZyBmcm9tIENvbm5lY3Rpb25Qcm9maWxlCi1vcmcuZWNsaXBzZS5qcHQudWkvZGVidWcvdWkvZGI9ZmFsc2UKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiMTQ3Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5KRVRCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmpldC5JSkVUTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzZkZGE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgSmFuIDE1IDExOjEyOjE0IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTA5YzEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gTWF5IDI3IDE0OjU1OjAxIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmMTg2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuNC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZHJhdzJkO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbjtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuNS4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuaGVscDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMTAwLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2U7YnVuZGxlLXZlcnNpb249IlszLjcuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuZGI7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5kYi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmdlbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4xMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4xMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMTAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53ZWIudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQudWksCi0gb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0sCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuY29tbWFuZHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kaWFsb2dzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmVkaXRvcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuY29ubmVjdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLm9wdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wbGF0Zm9ybS5nZW5lcmljO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tZW51czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlsczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzcGVjdGl2ZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5iYXNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJvcGVydGllczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3cy5zdHJ1Y3R1cmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5vcGVyYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5wcm9qLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLnByb2oubW9kZWwsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5qcGEyLmRldGFpbHMuamF2YSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuanBhMi5kZXRhaWxzLm9ybSwKLSBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLAotIG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS50ZXh0O3ZlcnNpb249IjQuMC4xIgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2ZkZmM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZSA9IDEuNQotamF2YWNUYXJnZXQgPSAxLjUKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZXMvLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IHRlbXBsYXRlcy8sXAotICAgICAgICAgICAgICAgc2NoZW1hLwotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjgzNDU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSAgQ29udHJpYnV0b3JzOgotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotCi08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQudWkiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfZW50aXR5X3dpei5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld19lbnRpdHlfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmN2NjOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld19lbnRpdHlfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2pwYV9maWxlX3dpei5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld19qcGFfZmlsZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTBmNjA0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2pwYV9maWxlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld19qcGFwcm9qZWN0X3dpei5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld19qcGFwcm9qZWN0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMzc2OGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfanBhcHJvamVjdF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9qcGFfZmFjZXQuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9qcGFfZmFjZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGFiOTE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2V0b29sMTYvanBhX2ZhY2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X2VudGl0eV93aXouZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfZW50aXR5X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MzNjYTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfZW50aXR5X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19qcGFfZmlsZV93aXouZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfanBhX2ZpbGVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwMDQyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19qcGFfZmlsZV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfanBhcHJvamVjdF93aXouZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfanBhcHJvamVjdF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmRhODA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X2pwYXByb2plY3Rfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2V2aWV3MTYvanBhX2RldGFpbHMuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfZGV0YWlscy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyODAxMzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfZGV0YWlscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9wZXJzcGVjdGl2ZS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9wZXJzcGVjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWI5MTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfcGVyc3BlY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfc3RydWN0dXJlLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2V2aWV3MTYvanBhX3N0cnVjdHVyZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MmM5MGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfc3RydWN0dXJlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2Jhc2ljLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2Jhc2ljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0N2Q3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9iYXNpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50LWNvbGxlY3Rpb24uZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudC1jb2xsZWN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ3MDZkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50LWNvbGxlY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW1iZWRkYWJsZS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbWJlZGRhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg1NmY3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbWJlZGRhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGVkLWlkLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGVkLWlkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjOGUyMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbWJlZGRlZC1pZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbWJlZGRlZC5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbWJlZGRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYWU2NjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW1iZWRkZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LW1hcHBpbmdzLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eS1tYXBwaW5ncy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDljOTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LW1hcHBpbmdzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjA2ZjQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9pZC5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9pZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMDVlYzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvaWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvanBhLWNvbnRlbnQuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvanBhLWNvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGFiOTE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2pwYS1jb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2pwYS1maWxlLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2pwYS1maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRlOWY0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9qcGEtZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9qcGEtamFyLWZpbGUuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvanBhLWphci1maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkyODI4ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9qcGEtamFyLWZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFueS10by1tYW55LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L21hbnktdG8tbWFueS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ODg1YjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFueS10by1tYW55LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L21hbnktdG8tb25lLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L21hbnktdG8tb25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUxZTJiOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYW55LXRvLW9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYXBwZWQtc3VwZXJjbGFzcy5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYXBwZWQtc3VwZXJjbGFzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYzM3NjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFwcGVkLXN1cGVyY2xhc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbnVsbC1hdHRyaWJ1dGUtbWFwcGluZy5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9udWxsLWF0dHJpYnV0ZS1tYXBwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhOWMyMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9udWxsLWF0dHJpYnV0ZS1tYXBwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L251bGwtdHlwZS1tYXBwaW5nLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L251bGwtdHlwZS1tYXBwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3OTQ3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9udWxsLXR5cGUtbWFwcGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9vbmUtdG8tbWFueS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9vbmUtdG8tbWFueS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOTAwMjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvb25lLXRvLW1hbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvb25lLXRvLW9uZS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9vbmUtdG8tb25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4ZWMzNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9vbmUtdG8tb25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L3BlcnNpc3RlbmNlLXVuaXQuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvcGVyc2lzdGVuY2UtdW5pdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYzQ1ZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvcGVyc2lzdGVuY2UtdW5pdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9wZXJzaXN0ZW5jZS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9wZXJzaXN0ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZjYxNmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvcGVyc2lzdGVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvdHJhbnNpZW50LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L3RyYW5zaWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNWQ4M2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvdHJhbnNpZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L3ZlcnNpb24uZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvdmVyc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMmE4MTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvdmVyc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi93YXJuaW5nLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L3dhcm5pbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDAwOWU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L3dhcm5pbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld19lbnRpdHlfd2l6YmFuLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfZW50aXR5X3dpemJhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDkzNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld19lbnRpdHlfd2l6YmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfanBhX2ZpbGVfd2l6YmFuLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfanBhX2ZpbGVfd2l6YmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0NjIyMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3X2pwYV9maWxlX3dpemJhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3X2pwYV9wcmpfd2l6LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfanBhX3Byal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjUyYmI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfanBhX3Byal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2FkZC1jb25uZWN0aW9uLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9hZGQtY29ubmVjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NDAzNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2FkZC1jb25uZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9hZGQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2FkZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZDM0ODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2FkZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvYnJvd3NlLW1pbmkucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2Jyb3dzZS1taW5pLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2NGYyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvYnJvd3NlLW1pbmkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2Jyb3dzZS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvYnJvd3NlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA4MWZkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvYnJvd3NlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9jb2xsYXBzZS1hbGwucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2NvbGxhcHNlLWFsbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ODJkMTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2NvbGxhcHNlLWFsbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvZGVsZXRlLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9kZWxldGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmJhOGI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9kZWxldGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2Rlc2VsZWN0LWFsbC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvZGVzZWxlY3QtYWxsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1NDRmNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvZGVzZWxlY3QtYWxsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9kb3QuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2RvdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YTUxNGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2RvdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvZWRpdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvZWRpdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNmQ2YTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2VkaXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2V4cGFuZC1hbGwucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2V4cGFuZC1hbGwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjcyOWEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9leHBhbmQtYWxsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9saXN0LW9mLXZhbHVlcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvbGlzdC1vZi12YWx1ZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDgxZmQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9saXN0LW9mLXZhbHVlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvbW92ZS1kb3duLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9tb3ZlLWRvd24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmU1MjgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9tb3ZlLWRvd24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL21vdmUtdXAucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL21vdmUtdXAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzhiMWNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9tb3ZlLXVwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9yZWNvbm5lY3QucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL3JlY29ubmVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMDA5NDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL3JlY29ubmVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvcmVzdG9yZS1kZWZhdWx0cy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvcmVzdG9yZS1kZWZhdWx0cy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNzRhZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL3Jlc3RvcmUtZGVmYXVsdHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL3NlbGVjdC1hbGwucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL3NlbGVjdC1hbGwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWFmZjJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9zZWxlY3QtYWxsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy93YXJuaW5nc3RkLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy93YXJuaW5nc3RkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiNDcxYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvd2FybmluZ3N0ZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vZXhwb3J0LWFzLWltZy1ob3Zlci5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vZXhwb3J0LWFzLWltZy1ob3Zlci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTFiMzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL2V4cG9ydC1hcy1pbWctaG92ZXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL2V4cG9ydC1hcy1pbWcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL2V4cG9ydC1hcy1pbWcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmI0ZGMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9leHBvcnQtYXMtaW1nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9oZWFkZXJfbGVmdF9iZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vaGVhZGVyX2xlZnRfYmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmZmZmU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9oZWFkZXJfbGVmdF9iZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vaGVhZGVyX21pZF9iZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vaGVhZGVyX21pZF9iZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTgyOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL2hlYWRlcl9taWRfYmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL2hlYWRlcl9yaWdodF9iZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vaGVhZGVyX3JpZ2h0X2JnLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ3NDE0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vaGVhZGVyX3JpZ2h0X2JnLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9wcmludC1ob3Zlci5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vcHJpbnQtaG92ZXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjhhMDliLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9wcmludC1ob3Zlci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vcHJpbnQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3ByaW50LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxNWJhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vcHJpbnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy1ib3R0b20ucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy1ib3R0b20ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODRiMzM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctYm90dG9tLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctbG93ZXItbGVmdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vc2hhZG93LWxvd2VyLWxlZnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTI1ZGYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctbG93ZXItbGVmdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vc2hhZG93LWxvd2VyLXJpZ2h0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctbG93ZXItcmlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNThjOTUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctbG93ZXItcmlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy1zaWRlLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctc2lkZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NWVkNmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy1zaWRlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctdXBwZXItcmlnaHQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy11cHBlci1yaWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYWJiOTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy11cHBlci1yaWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vdG9vbGJhcl9iZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vdG9vbGJhcl9iZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ODNhNDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3Rvb2xiYXJfYmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL2NvbHVtbi5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvY29sdW1uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYxNTUxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvY29sdW1uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb2JqZWN0cy9jb2x1bW5LZXkuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL2NvbHVtbktleS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzg1MTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL2NvbHVtbktleS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvZmlsZS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvZmlsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YzE4MTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL2ZpbGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL2ZvbGRlci5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvZm9sZGVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1OWRhNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvZm9sZGVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb2JqZWN0cy9mb3J3YXJkLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb2JqZWN0cy9mb3J3YXJkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyYmQ3MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvbW92ZVJpZ2h0LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb2JqZWN0cy9tb3ZlUmlnaHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTE1MTFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb2JqZWN0cy9tb3ZlUmlnaHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL3BhY2thZ2UucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL3BhY2thZ2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzFjYzQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb2JqZWN0cy9wYWNrYWdlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb2JqZWN0cy90YWJsZS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvdGFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTkzODhhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb2JqZWN0cy90YWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvdGFibGVfb2JqLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb2JqZWN0cy90YWJsZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmNjYWJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb2JqZWN0cy90YWJsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vdmVybGF5cy9lcnJvci5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL292ZXJsYXlzL2Vycm9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZGNjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL292ZXJsYXlzL2Vycm9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb3ZlcmxheXMvd2FybmluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL292ZXJsYXlzL3dhcm5pbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzFlODZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb3ZlcmxheXMvd2FybmluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL3NhdmUtaW1hZ2UtMTYucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9zYXZlLWltYWdlLTE2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhNDc3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL3NhdmUtaW1hZ2UtMTYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2Y5OTkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotcGx1Z2luTmFtZT0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1KUEFfUExBVEZPUk1fVUk9IkpQQSBQbGF0Zm9ybSBVSSIKLQotanBhTmF2aWdhdG9yQ29udGVudD1KUEEgQ29udGVudAotCi1qcGFXaXphcmRDYXRlZ29yeU5hbWUgPSBKUEEKLW5ld0pwYVByb2plY3RXaXphcmROYW1lID0gSlBBIFByb2plY3QKLW5ld0pwYVByb2plY3RXaXphcmREZXNjID0gQ3JlYXRlIGEgSlBBIHByb2plY3QKLW5ld0pwYUVudGl0eVdpemFyZE5hbWUgPSBKUEEgRW50aXR5Ci1uZXdKcGFFbnRpdHlXaXphcmREZXNjID0gQ3JlYXRlIGEgSlBBIEVudGl0eSAKLW5ld0pwYU1hcHBpbmdGaWxlV2l6YXJkTmFtZSA9IEpQQSBPUk0gTWFwcGluZyBGaWxlCi1uZXdKcGFNYXBwaW5nRmlsZVdpemFyZERlc2MgPSBDcmVhdGUgYSBKUEEgT1JNIE1hcHBpbmcgRmlsZQotbmV3SnBhRW50aXR5RnJvbVRhYmxlV2l6YXJkTmFtZSA9IEpQQSBFbnRpdGllcyBmcm9tIFRhYmxlcwotbmV3SnBhRW50aXR5RnJvbVRhYmxlV2l6YXJkRGVzYyA9IENyZWF0ZSBKUEEgRW50aXRpZXMgZnJvbSBkYXRhYmFzZSB0YWJsZXMgCi0KLXVwZ3JhZGVUb0xhdGVzdFZlcnNpb24gPSBVcGdyYWRlIERvY3VtZW50IFZlcnNpb24KLWpwYVN0cnVjdHVyZVZpZXdDb21tYW5kQ2F0ZWdvcnkgPSBKUEEgU3RydWN0dXJlIFZpZXcKLWFkZFBlcnNpc3RlbnRDbGFzcyA9IEFkZCBDbGFzcy4uLgotcmVtb3ZlUGVyc2lzdGVudENsYXNzID0gUmVtb3ZlIENsYXNzCi1hZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWwgPSBBZGQgQXR0cmlidXRlIHRvIFhNTAotYWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwID0gQWRkIEF0dHJpYnV0ZSB0byBYTUwgYW5kIE1hcC4uLgotcmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZUZyb21YbWwgPSBSZW1vdmUgQXR0cmlidXRlIGZyb20gWE1MCi1tYXBBcz1NYXAgQXMKLW1hcEFzTW5lbW9uaWM9TQotbWFwQXNQYXJhbWV0ZXJOYW1lPW1hcHBpbmcga2V5Ci1tYXBBc1NwZWNpZmllZE1hcHBpbmdQYXJhbWV0ZXJOYW1lPXNwZWNpZmllZCBtYXBwaW5nIGtleQotbWFwQXNEZWZhdWx0TWFwcGluZ1BhcmFtZXRlck5hbWU9ZGVmYXVsdCBtYXBwaW5nIGtleQotY29udmVydEphdmFQcm9qZWN0VG9KcGFDb21tYW5kTmFtZT1Db252ZXJ0IHRvIEpQQSBQcm9qZWN0Li4uCi0KLWpwYU1lbnVOYW1lID0gSlBBIFRvb2xzCi1nZW5lcmF0ZUVudGl0aWVzID0gR2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMuLi4KLWdlbmVyYXRlRERMID0gR2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXMuLi4KLXN5bmNocm9uaXplQ2xhc3NlcyA9IFN5bmNocm9uaXplIENsYXNzIExpc3QKLW1ha2VQZXJzaXN0ZW50ID0gTWFrZSBQZXJzaXN0ZW50Li4uCi1wZXJzaXN0ZW5jZUVkaXRvcj1QZXJzaXN0ZW5jZSBYTUwgRWRpdG9yCi0KLWpwYVByb2JsZW1TZXZlcml0aWVzUGFnZU5hbWU9RXJyb3JzL1dhcm5pbmdzCi1qcGFQcmVmZXJlbmNlUGFnZSA9IEphdmEgUGVyc2lzdGVuY2UKLQotanBhUHJvamVjdFByb3BlcnRpZXNQYWdlID0gSmF2YSBQZXJzaXN0ZW5jZQotCi1qcGFQZXJzcGVjdGl2ZSA9IEpQQQotanBhUGVyc3BlY3RpdmVEZXNjcmlwdGlvbiA9IFRoaXMgcGVyc3BlY3RpdmUgaXMgZGVzaWduZWQgdG8gc3VwcG9ydCBKYXZhIFBlcnNpc3RlbmNlIChKUEEpIGRldmVsb3BtZW50LiBJdCBvZmZlcnMgYSBQcm9qZWN0IEV4cGxvcmVyLCBKUEEgRGV0YWlscywgSlBBIFN0cnVjdHVyZSBhbmQgYSBEYXRhIFNvdXJjZSBFeHBsb3Jlci4KLWpwYURldGFpbHMgPSBKUEEgRGV0YWlscwotanBhU3RydWN0dXJlID0gSlBBIFN0cnVjdHVyZQotSnBhUHJvcG9zYWxDYXRlZ29yeSA9IEpQQSBQcm9wb3NhbHMKLQotSnB0Q3JlYXRpb25BY3Rpb25TZXQubGFiZWwgPSBKcHQgQ3JlYXRpb24KLUpwdENyZWF0aW9uQWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gSnB0IENyZWF0aW9uIEFjdGlvbiBTZXQKLQotTmV3RW50aXR5QWN0aW9uLmxhYmVsID0gTmV3IEVudGl0eQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wbHVnaW4ueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTRkNjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08IS0tCi0gIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gIENvbnRyaWJ1dG9yczoKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLQotPHBsdWdpbj4KLQkKLQk8ZXh0ZW5zaW9uLXBvaW50IAotCQlpZD0ianBhUGxhdGZvcm1VaXMiIAotCQluYW1lPSIlSlBBX1BMQVRGT1JNX1VJIiAKLQkJc2NoZW1hPSJzY2hlbWEvanBhUGxhdGZvcm1VaXMuZXhzZCIvPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQkKLQkJPCEtLSAKLQkJCUEgdGVzdCBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBvdXIgY3VycmVudCBjb250ZXh0IGlzIHdpdGhpbiB0aGUgCi0JCQlKUEEgU3RydWN0dXJlIFZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQktLT4KLQkJPGRlZmluaXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkucmVmZXJlbmNlLmluSnBhU3RydWN0dXJlVmlldyI+Ci0JCQk8d2l0aAotCQkJCXZhcmlhYmxlPSJhY3RpdmVQYXJ0SWQiPgotCQkJCTxlcXVhbHMKLQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Ii8+Ci0JCQk8L3dpdGg+Ci0JCTwvZGVmaW5pdGlvbj4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLQkJCi0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLldvcmtiZW5jaFBhcnRBZGFwdGVyRmFjdG9yeSI+Ci0JCQk8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkpwYVNlbGVjdGlvblBhcnRpY2lwYW50Ii8+Ci0JCTwvZmFjdG9yeT4KLQkJCi0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuRWRpdG9yUGFydEFkYXB0ZXJGYWN0b3J5Ij4KLQkJCTxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGUiLz4KLQkJPC9mYWN0b3J5PgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEV4dGVuc2lvbjogSmF2YSBDb21wbGV0aW9uIFByb3Bvc2FsIENvbXB1dGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qZHQudWkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIgotCQlpZD0iSnBhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiPgotCQkKLQkJPGphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciAKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVByb3Bvc2FsQ2F0ZWdvcnkiPgotCQkJPHBhcnRpdGlvbiB0eXBlPSJfX2RmdGxfcGFydGl0aW9uX2NvbnRlbnRfdHlwZSIvPgotCQkJPHBhcnRpdGlvbiB0eXBlPSJfX2phdmFfc3RyaW5nIi8+Ci0JCTwvamF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qZHQudWkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIgotCQlpZD0ianBhUHJvcG9zYWxDYXRlZ29yeSIKLQkJbmFtZT0iJUpwYVByb3Bvc2FsQ2F0ZWdvcnkiPgotCQk8cHJvcG9zYWxDYXRlZ29yeQotCQkJaWNvbj0iJG5sJC9pY29ucy9mdWxsL2V2aWV3MTYvanBhX3BlcnNwZWN0aXZlLmdpZiIvPgotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFQbGF0Zm9ybVVpcyI+Ci0JCQotCQk8anBhUGxhdGZvcm1VaQotCQkJaWQ9ImdlbmVyaWMudWkiCi0JCQlqcGFQbGF0Zm9ybT0iZ2VuZXJpYyIKLQkJCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuR2VuZXJpY0pwYVBsYXRmb3JtVWlGYWN0b3J5Ii8+Ci0JCQotCQk8anBhUGxhdGZvcm1VaQotCQkJaWQ9ImdlbmVyaWMyXzAudWkiCi0JCQlqcGFQbGF0Zm9ybT0iZ2VuZXJpYzJfMCIKLQkJCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGxhdGZvcm0uZ2VuZXJpYy5HZW5lcmljMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0gIAkKLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkubGlicmFyeVByb3ZpZGVyQWN0aW9uUGFuZWxzIj4KLQkJCi0JCTxwYW5lbCAKLQkJCXByb3ZpZGVyPSJ0ZW1wLXd0cC11c2VyLWxpYnJhcnktcHJvdmlkZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpYnByb3YuVGVtcFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwiLz4KLQkJCi0JCTxwYW5lbCAKLQkJCXByb3ZpZGVyPSJ0ZW1wLXd0cC1vc2dpLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlicHJvdi5UZW1wV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0JCQotCQk8YWN0aW9uU2V0Ci0JCQlkZXNjcmlwdGlvbj0iJUpwdENyZWF0aW9uQWN0aW9uU2V0LmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5KcHRDcmVhdGlvbkFjdGlvblNldCIKLQkJCWxhYmVsPSIlSnB0Q3JlYXRpb25BY3Rpb25TZXQubGFiZWwiPgotCQkJPGFjdGlvbgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdFbnRpdHlEcm9wRG93bkFjdGlvbiIKLQkJCQlkaXNhYmxlZEljb249Imljb25zL2Z1bGwvZXRvb2wxNi9uZXdfZW50aXR5X3dpei5naWYiCi0JCQkJaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld19lbnRpdHlfd2l6LmdpZiIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLk5ld0VudGl0eUFjdGlvbiIKLQkJCQlsYWJlbD0iJU5ld0VudGl0eUFjdGlvbi5sYWJlbCIKLQkJCQlwdWxsZG93bj0idHJ1ZSIKLQkJCQl0b29sYmFyUGF0aD0iTm9ybWFsL0pwdFdpemFyZHMiPgotCQkJPC9hY3Rpb24+Ci0JCTwvYWN0aW9uU2V0PgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0JCQotCQk8Y29tbWFuZAotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5jb252ZXJ0SmF2YVByb2plY3RUb0pwYSIKLQkJCW5hbWU9IiVjb252ZXJ0SmF2YVByb2plY3RUb0pwYUNvbW1hbmROYW1lIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZmlsZSIKLQkJCWRlZmF1bHRIYW5kbGVyPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuY29tbWFuZHMuQ29udmVydEphdmFQcm9qZWN0VG9KcGFDb21tYW5kSGFuZGxlciIvPgotCQkJCi0JCTxjb21tYW5kCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnhtbEZpbGVVcGdyYWRlVG9MYXRlc3RWZXJzaW9uIgotCQkJbmFtZT0iJXVwZ3JhZGVUb0xhdGVzdFZlcnNpb24iLz4KLQkJCi0JCTxjYXRlZ29yeQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Q29tbWFuZHMiCi0JCQluYW1lPSIlanBhU3RydWN0dXJlVmlld0NvbW1hbmRDYXRlZ29yeSI+Ci0JCTwvY2F0ZWdvcnk+Ci0JCQotCQk8Y29tbWFuZAotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5lbnRpdHlNYXBwaW5nc0FkZFBlcnNpc3RlbnRDbGFzcyIKLQkJCW5hbWU9IiVhZGRQZXJzaXN0ZW50Q2xhc3MiCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhU3RydWN0dXJlVmlld0NvbW1hbmRzIj4KLQkJPC9jb21tYW5kPgotCQkKLQkJPGNvbW1hbmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkucGVyc2lzdGVudFR5cGVSZW1vdmVQZXJzaXN0ZW50Q2xhc3MiCi0JCQluYW1lPSIlcmVtb3ZlUGVyc2lzdGVudENsYXNzIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVN0cnVjdHVyZVZpZXdDb21tYW5kcyI+Ci0JCTwvY29tbWFuZD4KLQkJCi0JCTxjb21tYW5kCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVBZGRUb1htbCIKLQkJCW5hbWU9IiVhZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWwiCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhU3RydWN0dXJlVmlld0NvbW1hbmRzIj4KLQkJPC9jb21tYW5kPgotCQkKLQkJPGNvbW1hbmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkucGVyc2lzdGVudEF0dHJpYnV0ZUFkZFRvWG1sQW5kTWFwIgotCQkJbmFtZT0iJWFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcCIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Q29tbWFuZHMiPgotCQk8L2NvbW1hbmQ+Ci0JCQotCQk8Y29tbWFuZAotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wZXJzaXN0ZW50QXR0cmlidXRlUmVtb3ZlRnJvbVhtbCIKLQkJCW5hbWU9IiVyZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlRnJvbVhtbCIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Q29tbWFuZHMiPgotCQk8L2NvbW1hbmQ+Ci0KLQkJPGNvbW1hbmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkucGVyc2lzdGVudFR5cGVNYXBBcyIKLQkJCW5hbWU9IiVtYXBBcyIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Q29tbWFuZHMiPgotCQkJPGNvbW1hbmRQYXJhbWV0ZXIKLQkJCQlpZD0icGVyc2lzdGVudFR5cGVNYXBwaW5nS2V5IgotCQkJCW5hbWU9IiVtYXBBc1BhcmFtZXRlck5hbWUiCi0JCQkJb3B0aW9uYWw9ImZhbHNlIj4KLQkJCTwvY29tbWFuZFBhcmFtZXRlcj4KLQkJPC9jb21tYW5kPgotCQkKLQkJPGNvbW1hbmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkucGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzIgotCQkJbmFtZT0iJW1hcEFzIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVN0cnVjdHVyZVZpZXdDb21tYW5kcyI+Ci0JCQk8Y29tbWFuZFBhcmFtZXRlcgotCQkJCWlkPSJzcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlTWFwcGluZ0tleSIKLQkJCQluYW1lPSIlbWFwQXNTcGVjaWZpZWRNYXBwaW5nUGFyYW1ldGVyTmFtZSIKLQkJCQlvcHRpb25hbD0iZmFsc2UiPgotCQkJPC9jb21tYW5kUGFyYW1ldGVyPgotCQkJPGNvbW1hbmRQYXJhbWV0ZXIKLQkJCQlpZD0iZGVmYXVsdFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBwaW5nS2V5IgotCQkJCW5hbWU9IiVtYXBBc0RlZmF1bHRNYXBwaW5nUGFyYW1ldGVyTmFtZSIKLQkJCQlvcHRpb25hbD0iZmFsc2UiPgotCQkJPC9jb21tYW5kUGFyYW1ldGVyPgotCQk8L2NvbW1hbmQ+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRXh0ZW5zaW9uOiBQZXJzaXN0ZW5jZSBFZGl0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQkKLQk8ZXh0ZW5zaW9uIAotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCQotCQk8ZWRpdG9yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmVkaXRvcnMuUGVyc2lzdGVuY2VFZGl0b3IiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZWRpdG9ycy5QZXJzaXN0ZW5jZUNvbnRyaWJ1dG9yIgotCQkJaWNvbj0iJG5sJC9pY29ucy9mdWxsL29iajE2L2pwYS1maWxlLmdpZiIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZWRpdG9ycy5QZXJzaXN0ZW5jZUVkaXRvciIKLQkJCW5hbWU9IiVwZXJzaXN0ZW5jZUVkaXRvciI+Ci0gICAgICAJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZW50LnBlcnNpc3RlbmNlIi8+Ci0JCTwvZWRpdG9yPgotCQkKLSAJPC9leHRlbnNpb24+Ci0gCQotIAkKLSAJPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgotCQkKLQkJPGhhbmRsZXIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLnhtbEZpbGVVcGdyYWRlVG9MYXRlc3RWZXJzaW9uIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kcy5VcGdyYWRlWG1sRmlsZVZlcnNpb25IYW5kbGVyIj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8aXRlcmF0ZT4KLQkJCQkJPG9yPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxGaWxlIj4KLQkJCQkJCQk8dGVzdAotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaXNMYXRlc3RTdXBwb3J0ZWRWZXJzaW9uIgotCQkJCQkJCQl2YWx1ZT0iZmFsc2UiLz4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2UiPgotCQkJCQkJCTx0ZXN0Ci0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pc0xhdGVzdFN1cHBvcnRlZFZlcnNpb24iCi0JCQkJCQkJCXZhbHVlPSJmYWxzZSIvPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9vcj4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L2hhbmRsZXI+Ci0JCQotCQk8aGFuZGxlcgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQudWkuZW50aXR5TWFwcGluZ3NBZGRQZXJzaXN0ZW50Q2xhc3MiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzLkFkZFBlcnNpc3RlbnRDbGFzc0hhbmRsZXIiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZQotCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5yZWZlcmVuY2UuaW5KcGFTdHJ1Y3R1cmVWaWV3Ij4KLQkJCQk8L3JlZmVyZW5jZT4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8YW5kPgotCQkJCQk8Y291bnQgdmFsdWU9IjEiLz4KLQkJCQkJPGl0ZXJhdGU+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3MiLz4KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvYW5kPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCQkKLQkJPGhhbmRsZXIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRUeXBlUmVtb3ZlUGVyc2lzdGVudENsYXNzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kcy5SZW1vdmVQZXJzaXN0ZW50Q2xhc3NIYW5kbGVyIj4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UKLQkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5qcHQudWkucmVmZXJlbmNlLmluSnBhU3RydWN0dXJlVmlldyI+Ci0JCQkJPC9yZWZlcmVuY2U+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGl0ZXJhdGU+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZSIvPgotCQkJCTwvaXRlcmF0ZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQkJCi0JCTxoYW5kbGVyCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wZXJzaXN0ZW50QXR0cmlidXRlQWRkVG9YbWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzLkFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEhhbmRsZXIiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZQotCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5yZWZlcmVuY2UuaW5KcGFTdHJ1Y3R1cmVWaWV3Ij4KLQkJCQk8L3JlZmVyZW5jZT4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8aXRlcmF0ZT4KLQkJCQkJPGFuZD4KLQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlIi8+Ci0JCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaXNWaXJ0dWFsIiB2YWx1ZT0idHJ1ZSIvPgotCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmlzTWFwcGVkIiB2YWx1ZT0idHJ1ZSIvPgotCQkJCQk8L2FuZD4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L2hhbmRsZXI+Ci0JCQotCQk8aGFuZGxlcgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQudWkucGVyc2lzdGVudEF0dHJpYnV0ZUFkZFRvWG1sQW5kTWFwIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBIYW5kbGVyIj4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UKLQkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5qcHQudWkucmVmZXJlbmNlLmluSnBhU3RydWN0dXJlVmlldyI+Ci0JCQkJPC9yZWZlcmVuY2U+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGl0ZXJhdGU+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSIvPgotCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmlzVmlydHVhbCIgdmFsdWU9InRydWUiLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9pdGVyYXRlPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCQkKLQkJPGhhbmRsZXIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVSZW1vdmVGcm9tWG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kcy5SZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlRnJvbVhtbEhhbmRsZXIiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZQotCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5yZWZlcmVuY2UuaW5KcGFTdHJ1Y3R1cmVWaWV3Ij4KLQkJCQk8L3JlZmVyZW5jZT4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8aXRlcmF0ZT4KLQkJCQkJPGFuZD4KLQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlIi8+Ci0JCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaXNWaXJ0dWFsIiB2YWx1ZT0iZmFsc2UiLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9pdGVyYXRlPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCQkKLQkJPGhhbmRsZXIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRUeXBlTWFwQXMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzLlBlcnNpc3RlbnRUeXBlTWFwQXNIYW5kbGVyIj4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UKLQkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5qcHQudWkucmVmZXJlbmNlLmluSnBhU3RydWN0dXJlVmlldyIvPgotCQkJPC9hY3RpdmVXaGVuPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxpdGVyYXRlPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZSIvPgotCQkJCTwvaXRlcmF0ZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQkJCi0JCTxoYW5kbGVyCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wZXJzaXN0ZW50QXR0cmlidXRlTWFwQXMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzLlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXIiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZQotCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5yZWZlcmVuY2UuaW5KcGFTdHJ1Y3R1cmVWaWV3Ii8+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGl0ZXJhdGU+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlIi8+Ci0JCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaXNWaXJ0dWFsIiB2YWx1ZT0iZmFsc2UiLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9pdGVyYXRlPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCQkKLSAJPC9leHRlbnNpb24+Ci0gCQotIAkKLSAJPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotCQkKLQkJPCEtLSBjb250cmlidXRpb25zIGZvciBhbnkgcG9wdXAgLS0+Ci0JCTxtZW51Q29udHJpYnV0aW9uCi0JCQlsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2UudWkucG9wdXAuYW55Ij4KLQkJCQotCQkJPCEtLSAiSlBBIFRvb2xzIiBzdWJtZW51IGZvciAKLQkJCQktIGFueXRoaW5nIHRoYXQgYWRhcHRzIHRvIEpwYVhtbFJlc291cmNlIChJRmlsZSBvYmplY3RzLCBtb3N0bHkpCi0JCQkJLSBhbnl0aGluZyB0aGF0IGFkYXB0cyB0byBJUHJvamVjdCBhbmQgaGFzIGEgSlBBIGZhY2V0IC0tPgotCQkJPG1lbnUKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLm1lbnUuSnBhVG9vbHMiCi0JCQkJbGFiZWw9IiVqcGFNZW51TmFtZSI+Ci0JCQkJPHZpc2libGVXaGVuPgotCQkJCQk8d2l0aAotCQkJCQkJdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0JCQkJCQk8aXRlcmF0ZSBpZkVtcHR5PSJmYWxzZSI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8YWRhcHQKLQkJCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZSIvPgotCQkJCQkJCQk8YWRhcHQKLQkJCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQkJCTx0ZXN0Ci0JCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgCi0JCQkJCQkJCQkJdmFsdWU9ImpwdC5qcGEiLz4KLQkJCQkJCQkJPC9hZGFwdD4KLQkJCQkJCQkJPGFuZD4KLQkgICAgICAgIAkJCQkJCTxhZGFwdAotCSAgICAgICAgICAgICAgCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCQkJCQkJCQk8dGVzdAotCQkJCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiAKLQkJCQkJCQkJCQkJdmFsdWU9ImpwdC5qcGEiLz4KLSAgICAgICAgCQkJCQkJCTwvYWRhcHQ+Ci0gICAgICAgIAkJCQkJCQk8YWRhcHQKLSAgICAgICAgCQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQiLz4KLQkJCQkJCQkJPC9hbmQ+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPC93aXRoPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L21lbnU+Ci0JCQkKLQkJCTwhLS0gY29tbWFuZHMgZm9yIG9iamVjdHMgdGhhdCBkb24ndCBuZWVkICJKUEEgVG9vbHMiIHN1Ym1lbnUgLS0+Ci0JCQk8Y29tbWFuZAotCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLnhtbEZpbGVVcGdyYWRlVG9MYXRlc3RWZXJzaW9uIj4KLQkJCQk8dmlzaWJsZVdoZW4+Ci0JCQkJCTx3aXRoCi0JCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJCQk8YWRhcHQKLQkJCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxGaWxlIj4KLQkJCQkJCQkJPHRlc3QKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pc0xhdGVzdFN1cHBvcnRlZFZlcnNpb24iCi0JCQkJCQkJCQl2YWx1ZT0iZmFsc2UiLz4KLQkJCQkJCQk8L2FkYXB0PgotCQkJCQkJPC9pdGVyYXRlPgotCQkJCQk8L3dpdGg+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4JCi0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQkJCi0JCTwhLS0gY29udHJpYnV0aW9ucyB0byB0aGUgIkpQQSBUb29scyIgc3VibWVudSAtLT4KLQkJPG1lbnVDb250cmlidXRpb24KLQkJCWxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS5qcHQudWkubWVudS5KcGFUb29scyI+Ci0JCQk8Y29tbWFuZAotCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLnhtbEZpbGVVcGdyYWRlVG9MYXRlc3RWZXJzaW9uIj4KLQkJCQk8dmlzaWJsZVdoZW4+Ci0JCQkJCTx3aXRoCi0JCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJCQk8YWRhcHQKLQkJCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlIj4KLQkJCQkJCQkJPHRlc3QKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pc0xhdGVzdFN1cHBvcnRlZFZlcnNpb24iCi0JCQkJCQkJCQl2YWx1ZT0iZmFsc2UiLz4KLQkJCQkJCQk8L2FkYXB0PgotCQkJCQkJPC9pdGVyYXRlPgotCQkJCQk8L3dpdGg+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCQkKLQkJPCEtLSBjb250cmlidXRpb25zIHRvIHRoZSBwcm9qZWN0IGNvbmZpZ3VyZSBtZW51IC0tPgotCQk8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2UudWkucHJvamVjdENvbmZpZ3VyZT9hZnRlcj1hZGRpdGlvbnMiPgotCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQudWkuY29udmVydEphdmFQcm9qZWN0VG9KcGEiIHN0eWxlPSJwdXNoIj4KLQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8Y291bnQgdmFsdWU9IjEiLz4KLQkJCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIiBvcGVyYXRvcj0iYW5kIj4KLQkJCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCQk8YW5kPgotCQkJCQkJCQkJPHRlc3QKLQkJCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvamVjdE5hdHVyZSIKLQkJCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIvPgotCQkJCQkJCQkJPG5vdD4KLQkJCQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByb2plY3ROYXR1cmUiIAotCQkJCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubmF0dXJlIi8+Ci0JCQkJCQkJCQk8L25vdD4KLQkJCQkJCQkJPC9hbmQ+Ci0JCQkJCQkJPC9hZGFwdD4KLQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCQkKLQkJPCEtLSBjb250cmlidXRpb25zIHRvIG9iamVjdHMgaW4gdGhlIEpQQSBzdHJ1Y3R1cmUgdmlldyAtLT4KLQkJPG1lbnVDb250cmlidXRpb24KLQkJCWxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS5qcHQudWkuanBhU3RydWN0dXJlVmlldyI+Ci0JCQk8Y29tbWFuZAotCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLmVudGl0eU1hcHBpbmdzQWRkUGVyc2lzdGVudENsYXNzIj4KLQkJCQk8dmlzaWJsZVdoZW4+Ci0JCQkJCTx3aXRoCi0JCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3MiLz4KLQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPC93aXRoPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCQk8Y29tbWFuZAotCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRUeXBlUmVtb3ZlUGVyc2lzdGVudENsYXNzIj4KLQkJCQk8dmlzaWJsZVdoZW4+Ci0JCQkJCTx3aXRoCi0JCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGUiLz4KLQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPC93aXRoPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCQk8Y29tbWFuZAotCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVBZGRUb1htbCI+Ci0JCQkJPHZpc2libGVXaGVuPgotCQkJCQk8d2l0aAotCQkJCQkJdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0JCQkJCQk8aXRlcmF0ZSBpZkVtcHR5PSJmYWxzZSI+Ci0JCQkJCQkJPGFuZD4KLQkJCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUiLz4KLQkJCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmlzVmlydHVhbCIgdmFsdWU9InRydWUiLz4KLQkJCQkJCQk8L2FuZD4KLQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPC93aXRoPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCQk8Y29tbWFuZAotCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVBZGRUb1htbEFuZE1hcCI+Ci0JCQkJPHZpc2libGVXaGVuPgotCQkJCQk8d2l0aAotCQkJCQkJdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0JCQkJCQk8aXRlcmF0ZSBpZkVtcHR5PSJmYWxzZSI+Ci0JCQkJCQkJPGFuZD4KLQkJCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUiLz4KLQkJCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmlzVmlydHVhbCIgdmFsdWU9InRydWUiLz4KLQkJCQkJCQk8L2FuZD4KLQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPC93aXRoPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCQk8Y29tbWFuZAotCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVSZW1vdmVGcm9tWG1sIj4KLQkJCQk8dmlzaWJsZVdoZW4+Ci0JCQkJCTx3aXRoCi0JCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJCQk8YW5kPgotCQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSIvPgotCQkJCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaXNWaXJ0dWFsIiB2YWx1ZT0iZmFsc2UiLz4KLQkJCQkJCQk8L2FuZD4KLQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPC93aXRoPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCQkKLQkJCTxtZW51Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wZXJzaXN0ZW50VHlwZU1hcEFzIgotCQkJCWxhYmVsPSIlbWFwQXMiCi0JCQkJbW5lbW9uaWM9IiVtYXBBc01uZW1vbmljIj4KLQkJCQk8dmlzaWJsZVdoZW4+Ci0JCQkJCTx3aXRoCi0JCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZSIvPgotCQkJCQkJPC9pdGVyYXRlPgotCQkJCQk8L3dpdGg+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCQk8ZHluYW1pYwotCQkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRUeXBlTWFwQXMiCi0JCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWVudXMuUGVyc2lzdGVudFR5cGVNYXBBc0NvbnRyaWJ1dGlvbiI+Ci0JCQkJPC9keW5hbWljPgotCQkJPC9tZW51PgotCQkJCi0JCQk8bWVudQotCQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkucGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzIgotCQkJCWxhYmVsPSIlbWFwQXMiCi0JCQkJbW5lbW9uaWM9IiVtYXBBc01uZW1vbmljIj4KLQkJCQk8dmlzaWJsZVdoZW4+Ci0JCQkJCTx3aXRoCi0JCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJCQk8YW5kPgotCQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlIi8+Ci0JCQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pc1ZpcnR1YWwiIHZhbHVlPSJmYWxzZSIvPgotCQkJCQkJCTwvYW5kPgotCQkJCQkJPC9pdGVyYXRlPgotCQkJCQk8L3dpdGg+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCQk8ZHluYW1pYwotCQkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBcyIKLQkJCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tZW51cy5QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb250cmlidXRpb24iPgotCQkJCTwvZHluYW1pYz4KLQkJCTwvbWVudT4KLQotCQk8L21lbnVDb250cmlidXRpb24+Ci0JCQotIAk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld2VyIj4KLQkJCi0JCTx2aWV3ZXJDb250ZW50QmluZGluZwotCQkJdmlld2VySWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiPgotCQkJPGluY2x1ZGVzPgotCQkJCTxjb250ZW50RXh0ZW5zaW9uIHBhdHRlcm49Im9yZy5lY2xpcHNlLmpwdC51aS4qIi8+Ci0JCQk8L2luY2x1ZGVzPgotCQk8L3ZpZXdlckNvbnRlbnRCaW5kaW5nPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCI+Ci0JCQotCQk8bmF2aWdhdG9yQ29udGVudAotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFOYXZpZ2F0b3JDb250ZW50IgotCQkJbmFtZT0iJWpwYU5hdmlnYXRvckNvbnRlbnQiIAotCQkJcHJpb3JpdHk9ImhpZ2hlciIKLQkJCWljb249Imljb25zL2Z1bGwvb2JqMTYvanBhLWNvbnRlbnQuZ2lmIgotCQkJYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIgotCQkJY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubmF2aWdhdG9yLkpwYU5hdmlnYXRvckNvbnRlbnRQcm92aWRlciIKLQkJCWxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSnBhTmF2aWdhdG9yTGFiZWxQcm92aWRlciI+Ci0JCQkKLQkJCTx0cmlnZ2VyUG9pbnRzPgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlIi8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPiAKLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQl2YWx1ZT0ianB0LmpwYSIgLz4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCTwvb3I+Ci0JCQk8L3RyaWdnZXJQb2ludHM+Ci0JCQkKLQkJCTxwb3NzaWJsZUNoaWxkcmVuPgotCQkJCTxpbnN0YW5jZW9mCi0JCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlIi8+Ci0JCQk8L3Bvc3NpYmxlQ2hpbGRyZW4+Ci0JCQkKLQkJCTxhY3Rpb25Qcm92aWRlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubmF2aWdhdG9yLkpwYU5hdmlnYXRvckFjdGlvblByb3ZpZGVyIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhQWN0aW9uUHJvdmlkZXIiPgotCQkJCTxlbmFibGVtZW50PgotCQkJCQk8YW5kPgotCQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZSIvPgotCQkJCQk8L2FuZD4KLQkJCQk8L2VuYWJsZW1lbnQ+Ci0JCQk8L2FjdGlvblByb3ZpZGVyPgotCQkJCi0JCQk8Y29tbW9uV2l6YXJkCi0JCQkJbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpwdC51aSIKLQkJCQl0eXBlPSJuZXciCi0JCQkJd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3RW50aXR5Ij4KLQkJCQk8ZW5hYmxlbWVudD4KLQkJCQkJPGFuZD4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdCIvPgotCQkJCQkJPC9vcj4KLQkJCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqcHQuanBhIiAvPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9lbmFibGVtZW50PgotCQkJPC9jb21tb25XaXphcmQ+Ci0JCQkKLQkJCTxjb21tb25XaXphcmQKLQkJCQltZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanB0LnVpIgotCQkJCXR5cGU9Im5ldyIKLQkJCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLndpemFyZC5uZXdNYXBwaW5nRmlsZSI+Ci0JCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8b3I+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXIiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3QiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIvPgotCQkJCQkJPC9vcj4KLQkJCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqcHQuanBhIiAvPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9lbmFibGVtZW50PgotCQkJPC9jb21tb25XaXphcmQ+Ci0JCQkKLQkJCTwhLS0KLQkJCQotCQkJPGNvbW1vblNvcnRlcgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRVZpZXdlclNvcnRlciIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVWaWV3ZXJTb3J0ZXIiIC8+Ci0JCQkKLQkJCS0tPgotCQkJCi0JCQk8Y29tbW9uV2l6YXJkCi0JCQkJbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpwdC51aSIKLQkJCQl0eXBlPSJuZXciCi0JCQkJd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3RW50aXRpZXNGcm9tVGFibGVzIj4KLQkJCQk8ZW5hYmxlbWVudD4KLQkJCQkJPGFuZD4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdCIvPgotCQkJCQkJPC9vcj4KLQkJCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqcHQuanBhIiAvPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9lbmFibGVtZW50PgotCQkJPC9jb21tb25XaXphcmQ+CQkJCi0JCQkKLQkJPC9uYXZpZ2F0b3JDb250ZW50PgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQkJCi0JCTxjYXRlZ29yeQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdCIKLQkJCW5hbWU9IiVqcGFXaXphcmRDYXRlZ29yeU5hbWUiLz4KLQkJCi0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkud2l6YXJkLm5ld0pwYVByb2plY3QiCi0JCQluYW1lPSIlbmV3SnBhUHJvamVjdFdpemFyZE5hbWUiCi0JCQlpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvbmV3X2pwYXByb2plY3Rfd2l6LmdpZiIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qcHQiCi0JCQlwcm9qZWN0PSJ0cnVlIgotCQkJZmluYWxQZXJzcGVjdGl2ZT0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVBlcnNwZWN0aXZlIj4KLQkJCTxkZXNjcmlwdGlvbj4lbmV3SnBhUHJvamVjdFdpemFyZERlc2M8L2Rlc2NyaXB0aW9uPgotCQkJPGNsYXNzIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5wcm9qLkpwYVByb2plY3RXaXphcmQiPiAKLQkJCQk8cGFyYW1ldGVyIG5hbWU9Im1lbnVJbmRleCIgdmFsdWU9IjM1Ii8+IAotCQkJPC9jbGFzcz4gCi0JCTwvd2l6YXJkPgotCQkKLQkJPHdpemFyZAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3RW50aXR5IgotCQkJbmFtZT0iJW5ld0pwYUVudGl0eVdpemFyZE5hbWUiCi0JCQlpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvbmV3X2VudGl0eV93aXouZ2lmIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpwdCI+Ci0JCQk8ZGVzY3JpcHRpb24+JW5ld0pwYUVudGl0eVdpemFyZERlc2M8L2Rlc2NyaXB0aW9uPgotCQkJPGNsYXNzIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuRW50aXR5V2l6YXJkIj4gCi0JCQkJPHBhcmFtZXRlciBuYW1lPSJqYXZhZWVhcnRpZmFjdCIgdmFsdWU9InRydWUiLz4gCi0JCQkJPHBhcmFtZXRlciBuYW1lPSJtZW51SW5kZXgiIHZhbHVlPSIzOCIgLz4gCi0JCQkJPHBhcmFtZXRlciBuYW1lPSJqcHRhcnRpZmFjdCIgdmFsdWU9InRydWUiLz4gCi0JCQk8L2NsYXNzPiAKLQkJPC93aXphcmQ+Ci0JCQotCQk8d2l6YXJkCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbi5HZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCIKLQkJCWljb249InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfZW50aXR5X3dpei5naWYiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLndpemFyZC5uZXdFbnRpdGllc0Zyb21UYWJsZXMiCi0JCQluYW1lPSIlbmV3SnBhRW50aXR5RnJvbVRhYmxlV2l6YXJkTmFtZSI+Ci0JCQk8ZGVzY3JpcHRpb24+JW5ld0pwYUVudGl0eUZyb21UYWJsZVdpemFyZERlc2M8L2Rlc2NyaXB0aW9uPgotCQkJPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIi8+IAotICAgICAgICA8L3dpemFyZD4JCQotCQkKLQkJPHdpemFyZAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3TWFwcGluZ0ZpbGUiCi0JCQluYW1lPSIlbmV3SnBhTWFwcGluZ0ZpbGVXaXphcmROYW1lIgotCQkJaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld19qcGFfZmlsZV93aXouZ2lmIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpwdCI+Ci0JCQk8ZGVzY3JpcHRpb24+JW5ld0pwYU1hcHBpbmdGaWxlV2l6YXJkRGVzYzwvZGVzY3JpcHRpb24+Ci0JCQk8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLm9ybS5NYXBwaW5nRmlsZVdpemFyZCI+IAotCQkJCTxwYXJhbWV0ZXIgbmFtZT0iamF2YWVlYXJ0aWZhY3QiIHZhbHVlPSJ0cnVlIi8+IAotCQkJCTxwYXJhbWV0ZXIgbmFtZT0ibWVudUluZGV4IiB2YWx1ZT0iMzkiIC8+IAotCQkJCTxwYXJhbWV0ZXIgbmFtZT0ianB0YXJ0aWZhY3QiIHZhbHVlPSJ0cnVlIi8+IAotCQkJPC9jbGFzcz4gCi0JCTwvd2l6YXJkPgotICAgICAgCi0JPC9leHRlbnNpb24+Ci0JCi0JCQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRXh0ZW5zaW9uOiBQZXJzaXN0ZW5jZSBQZXJzcGVjdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcyI+Ci0JCQotCQk8cGVyc3BlY3RpdmUKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc3BlY3RpdmUuSnBhUGVyc3BlY3RpdmVGYWN0b3J5IgotCQkJaWNvbj0iaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9wZXJzcGVjdGl2ZS5naWYiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVBlcnNwZWN0aXZlIgotCQkJbmFtZT0iJWpwYVBlcnNwZWN0aXZlIj4KLQkJCTxkZXNjcmlwdGlvbj4lanBhUGVyc3BlY3RpdmVEZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0JCTwvcGVyc3BlY3RpdmU+Ci0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLQkJCi0JCTxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFQZXJzcGVjdGl2ZSI+Ci0JCQkKLQkJCTxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuanB0LnVpLndpemFyZC5uZXdKcGFQcm9qZWN0Ii8+Ci0JCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3RW50aXR5Ii8+Ci0JCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3TWFwcGluZ0ZpbGUiLz4KLQkJCTxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3UGFja2FnZUNyZWF0aW9uV2l6YXJkIi8+Ci0JCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0NsYXNzQ3JlYXRpb25XaXphcmQiLz4KLQkJCTxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3SW50ZXJmYWNlQ3JlYXRpb25XaXphcmQiLz4KLQkJCTxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3RW51bUNyZWF0aW9uV2l6YXJkIi8+Ci0JCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0Fubm90YXRpb25DcmVhdGlvbldpemFyZCIvPgotCQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdTb3VyY2VGb2xkZXJDcmVhdGlvbldpemFyZCIvPgotCQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdKYXZhV29ya2luZ1NldFdpemFyZCIvPgotCQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ldy5maWxlIi8+Ci0JCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZvbGRlciIvPgotCQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLndpemFyZHMuVW50aXRsZWRUZXh0RmlsZVdpemFyZCIvPgotCQkJCi0JCQk8cGVyc3BlY3RpdmVTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLkphdmFQZXJzcGVjdGl2ZSIvPgotCQkJPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnUGVyc3BlY3RpdmUiLz4KLQkJCTxwZXJzcGVjdGl2ZVNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMkVFUGVyc3BlY3RpdmUiLz4KLQkJCTxwZXJzcGVjdGl2ZVNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUJyb3dzaW5nUGVyc3BlY3RpdmUiLz4KLQkJCQotCQkJPGFjdGlvblNldCBpZD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQWN0aW9uU2V0Ii8+Ci0JCQk8YWN0aW9uU2V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUFjdGlvblNldCIvPgotCQkJPGFjdGlvblNldCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50Q3JlYXRpb25BY3Rpb25TZXQiLz4KLQkJCTxhY3Rpb25TZXQgaWQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ii8+Ci0JCQk8YWN0aW9uU2V0IGlkPSJvcmcuZWNsaXBzZS5qcHQudWkuSnB0Q3JlYXRpb25BY3Rpb25TZXQiLz4KLQkJCQotCQkJPHZpZXdTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLlBhY2thZ2VFeHBsb3JlciIvPgotCQkJPHZpZXdTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLlR5cGVIaWVyYXJjaHkiLz4KLQkJCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5Tb3VyY2VWaWV3Ii8+Ci0JCQk8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YWRvY1ZpZXciLz4KLQkJCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiLz4KLQkJCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLkNvbnRlbnRPdXRsaW5lIi8+Ci0JCQk8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ibGVtVmlldyIvPgotCQkJPHZpZXdTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MuUmVzb3VyY2VOYXZpZ2F0b3IiLz4KLQkJCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Ii8+Ci0JCQk8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhRGV0YWlsc1ZpZXciLz4KLQkJCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuRGF0YVNvdXJjZUV4cGxvcmVyTmF2aWdhdG9yIi8+Ci0JCQkKLQkJPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLSAgICAJCi0JCTxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSI+Ci0JCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3SnBhUHJvamVjdCIvPgotCQkJPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFQZXJzcGVjdGl2ZSIvPgotCQk8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJCi0JCTxvYmplY3RDb250cmlidXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkucHJvamVjdC5KUEFUb29scyIKLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLQkJCWFkYXB0YWJsZT0idHJ1ZSI+Ci0JCQkKLQkJCTxlbmFibGVtZW50PgotCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIHZhbHVlPSJqcHQuanBhIi8+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCQkKLQkJCTxhY3Rpb24KLQkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLmdlbmVyYXRlRW50aXRpZXMiCi0JCQkJbGFiZWw9IiVnZW5lcmF0ZUVudGl0aWVzIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9ucy5HZW5lcmF0ZUVudGl0aWVzQWN0aW9uIgotCQkJCWVuYWJsZXNGb3I9IjEiCi0JCQkJbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpwdC51aS5tZW51LkpwYVRvb2xzL2NvbnRlbnQiLz4KLQkJCQotCQkJPGFjdGlvbgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkuZ2VuZXJhdGVEREwiCi0JCQkJbGFiZWw9IiVnZW5lcmF0ZURETCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnMuR2VuZXJhdGVERExBY3Rpb24iCi0JCQkJZW5hYmxlc0Zvcj0iMSIKLQkJCQltZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanB0LnVpLm1lbnUuSnBhVG9vbHMvY29udGVudCIvPgotCQkJCQotCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KLQkJCi0JCTxvYmplY3RDb250cmlidXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkuTWFrZVBlcnNpc3RlbnQiCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50IgotCQkJYWRhcHRhYmxlPSJ0cnVlIj4KLQkJCQotCQkJPGFjdGlvbgotICAgICAgICAgCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnMuTWFrZVBlcnNpc3RlbnRBY3Rpb24iCi0gICAgICAgICAJCWVuYWJsZXNGb3I9IioiCi0gICAgICAgICAJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkuZ2VuZXJhdGVFbnRpdGllcyIKLSAgICAgICAgIAkJbGFiZWw9IiVtYWtlUGVyc2lzdGVudCIKLSAgICAgICAgIAkJbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpwdC51aS5tZW51LkpwYVRvb2xzL2NvbnRlbnQiPgotICAgICAgCQkJPGVuYWJsZW1lbnQ+Ci0gICAgICAgIAkgCQk8b3I+Ci0gICAgICAgICAgICAJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCIvPgotICAgICAgICAgICAgCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlIi8+Ci0gICAgICAgICAgICAJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIvPgotICAgICAgICAgICAgCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ii8+Ci0gICAgICAgICAJCQk8L29yPgotICAgICAgCQkJPC9lbmFibGVtZW50PgotICAgCQkJPC9hY3Rpb24+Ci0JCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0JCTxvYmplY3RDb250cmlidXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkucGVyc2lzdGVuY2VYbWxGaWxlQWN0aW9ucyIKLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCW5hbWVGaWx0ZXI9InBlcnNpc3RlbmNlLnhtbCI+Ci0JCQkKLQkJCTxhY3Rpb24KLQkJCQlpZD0ic3luY2hDbGFzc2VzQWN0aW9uIgotCQkJCWxhYmVsPSIlc3luY2hyb25pemVDbGFzc2VzIgotCQkJCW1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qcHQudWkubWVudS5KcGFUb29scy9jb250ZW50IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9ucy5TeW5jaHJvbml6ZUNsYXNzZXNBY3Rpb24iCi0JCQkJZW5hYmxlc0Zvcj0iMSIvPgotCQkJCi0JCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotCQkKLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wZXJzaXN0ZW5jZVhtbEFjdGlvbnMiCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbCI+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9InN5bmNoQ2xhc3Nlc0FjdGlvbiIKLQkJCQlsYWJlbD0iJXN5bmNocm9uaXplQ2xhc3NlcyIKLQkJCQltZW51YmFyUGF0aD0iY29udGVudCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnMuU3luY2hyb25pemVDbGFzc2VzQWN0aW9uIgotCQkJCWVuYWJsZXNGb3I9IjEiLz4KLQkJPC9vYmplY3RDb250cmlidXRpb24+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCQotCQk8cGFnZQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wcmVmZXJlbmNlcyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSnBhUHJlZmVyZW5jZXNQYWdlIgotCQkJbmFtZT0iJWpwYVByZWZlcmVuY2VQYWdlIj4KLQkJPC9wYWdlPgotCQkKLQkJPHBhZ2UKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qcHQudWkucHJlZmVyZW5jZXMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpwYVByb2JsZW1TZXZlcml0aWVzUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkucHJlZmVyZW5jZXMucHJvYmxlbVNldmVyaXRpZXMiCi0JCQluYW1lPSIlanBhUHJvYmxlbVNldmVyaXRpZXNQYWdlTmFtZSI+Ci0JCTwvcGFnZT4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0JCQotCQk8cGFnZQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UiCi0JCQluYW1lPSIlanBhUHJvamVjdFByb3BlcnRpZXNQYWdlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZSI+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCSAgICAgICAgPHRlc3QgCi0JCQkgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJICAgICAgICAgICAgdmFsdWU9ImpwdC5qcGEiLz4KLQkJICAgICAgICA8L2FkYXB0PgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9wYWdlPgotCQk8cGFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wcm9wZXJ0eVBhZ2VzLnByb2JsZW1TZXZlcml0aWVzIgotICAgICAgICAgbmFtZT0iJWpwYVByb2JsZW1TZXZlcml0aWVzUGFnZU5hbWUiCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZSIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlIj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJICAgICAgICA8dGVzdCAKLQkJCSAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCSAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkgICAgICAgICAgICB2YWx1ZT0ianB0LmpwYSIvPgotCQkgICAgICAgIDwvYWRhcHQ+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0JCi0JICAJCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLQkJCi0JCTxjYXRlZ29yeQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aSIKLQkJCW5hbWU9IiVqcGFQZXJzcGVjdGl2ZSIvPgotCQkKLQkJPHZpZXcKLQkgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhU3RydWN0dXJlVmlldyIKLQkgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qcHQudWkiCi0JICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVWaWV3IgotCSAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9zdHJ1Y3R1cmUuZ2lmIgotCSAgICAgICAgbmFtZT0iJWpwYVN0cnVjdHVyZSIvPgotCQkJCi0JCTx2aWV3Ci0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYURldGFpbHNWaWV3IgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpwdC51aSIKLQkgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3MuSnBhRGV0YWlsc1ZpZXciCi0JICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V2aWV3MTYvanBhX2RldGFpbHMuZ2lmIgotCQkJbmFtZT0iJWpwYURldGFpbHMiLz4KLQkJCi0JPC9leHRlbnNpb24+CQotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMiPgotCQkKLQkJPGltYWdlIGZhY2V0PSJqcHQuanBhIiBwYXRoPSJpY29ucy9mdWxsL2V0b29sMTYvanBhX2ZhY2V0LmdpZiIvPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uIAotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLndpemFyZFBhZ2VzIj4KLQkJCi0JCTx3aXphcmQtcGFnZXMgYWN0aW9uPSJqcHQuanBhLmluc3RhbGwiPgotCQkJPHBhZ2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLkpwYUZhY2V0SW5zdGFsbFBhZ2UiLz4KLQkJPC93aXphcmQtcGFnZXM+Ci0JCQotCQk8d2l6YXJkLXBhZ2VzIGFjdGlvbj0ianB0LmpwYS52ZXJzaW9uLWNoYW5nZSI+Ci0JCQk8cGFnZSBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuSnBhRmFjZXRWZXJzaW9uQ2hhbmdlUGFnZSIvPgotCQk8L3dpemFyZC1wYWdlcz4KLQkJCi0JPC9leHRlbnNpb24+Ci0gCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzI3NDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1DaG9vc2VyUGFuZV9icm93c2VCdXR0b249QnJvd3NlLi4uCi0KLUFjY2Vzc1R5cGVDb21wb3NpdGVfYWNjZXNzPUFjY2VzczoKLUFjY2Vzc1R5cGVDb21wb3NpdGVfZmllbGQ9RmllbGQKLUFjY2Vzc1R5cGVDb21wb3NpdGVfcHJvcGVydHk9UHJvcGVydHkKLQotQWRkVG9FYXJDb21wb3NpdGVfZWFyTWVtYmVyU2hpcD1FQVIgbWVtYmVyc2hpcAotQWRkVG9FYXJDb21wb3NpdGVfYWRkVG9FYXJMYWJlbD0mQWRkIHByb2plY3QgdG8gYW4gRUFSCi1BZGRUb0VhckNvbXBvc2l0ZV9lYXJQcm9qZWN0TGFiZWw9RUFSIHByJm9qZWN0IG5hbWU6Ci1BZGRUb0VhckNvbXBvc2l0ZV9uZXdCdXR0b25MYWJlbD1OZXcgJlByb2plY3QgLi4uCi0KLUFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfdGl0bGU9QWRkIEF0dHJpYnV0ZQotQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ19hdHRyaWJ1dGVMYWJlbD1BdHRyaWJ1dGU6Ci1BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX21hcHBpbmdMYWJlbD1NYXAgYXM6Ci1BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX25vTWFwcGluZ0tleUVycm9yPVlvdSBtdXN0IHNwZWNpZnkgYSBtYXBwaW5nIHR5cGUKLQotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX3RpdGxlPUFkZCBDbGFzcwotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzTGFiZWw9Q2xhc3M6Ci1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NEaWFsb2dfdGl0bGU9UGVyc2lzdGVudCBDbGFzcyBTZWxlY3Rpb24KLUFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc0RpYWxvZ19tZXNzYWdlPUNob29zZSBhIGNsYXNzOgotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX21hcHBpbmdMYWJlbD1NYXAgYXM6Ci1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfbm9DbGFzc0Vycm9yPVlvdSBtdXN0IHNwZWNpZnkgYSBjbGFzcwotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2R1cGxpY2F0ZUNsYXNzV2FybmluZz1GaWxlIGFscmVhZHkgY29udGFpbnMgdGhhdCBwZXJzaXN0ZW50IGNsYXNzCi1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NOb3RGb3VuZFdhcm5pbmc9Q2Fubm90IHJlc29sdmUgY2xhc3MKLUFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19ub01hcHBpbmdLZXlFcnJvcj1Zb3UgbXVzdCBzcGVjaWZ5IGEgbWFwcGluZyB0eXBlCi0KLUFkZFJlbW92ZVBhbmVfQWRkQnV0dG9uVGV4dD1BZGQuLi4KLUFkZFJlbW92ZVBhbmVfUmVtb3ZlQnV0dG9uVGV4dD1SZW1vdmUKLQotQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlPSZFbnRlciB0eXBlIG5hbWUgcHJlZml4IG9yIHBhdHRlcm4gKCosID8sIG9yIGNhbWVsIGNhc2UpOgotQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZT1DbGFzcyBTZWxlY3Rpb24KLQotY29udmVydFRvSnBhX2NvbnZlcnRpbmdQcm9qZWN0PSJDb252ZXJ0aW5nIHByb2plY3QgdG8gZmFjZXRlZCBmb3JtLi4uIgotY29udmVydFRvSnBhX2RldGVjdGluZ1RlY2hub2xvZ2llcz0iRGV0ZWN0aW5nIGV4aXN0aW5nIHRlY2hub2xvZ2llcy4uLiIKLQotRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3RpdGxlPURhdGFiYXNlIFNjaGVtYQotRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2Rlc2M9U2VsZWN0IGEgZGF0YWJhc2Ugc2NoZW1hCi1EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2Vfc2NoZW1hU2V0dGluZ3M9U2NoZW1hIHNldHRpbmdzCi1EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2VfYWRkQ29ubmVjdGlvblRvUHJvamVjdD08YT5BZGQgYSBjb25uZWN0aW9uIHRvIEpQQSBwcm9qZWN0Li4uPC9hPgotRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2Nvbm5lY3RMaW5rPTxhPkNvbm5lY3Q8L2E+Ci1EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2Vfc2NoZW1hPVNjaGVtYToKLURhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV9jb25uZWN0aW9uSW5mbz0oTm90ZTogSlBBIHByb2plY3QgbXVzdCBoYXZlIGEgY29ubmVjdGlvbiBhbmQgaXQgbXVzdCBiZSBhY3RpdmUgdG8gc2VsZWN0IGEgc2NoZW1hKQotRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3NjaGVtYUluZm89KE5vdGU6IE11c3QgaGF2ZSBhY3RpdmUgY29ubmVjdGlvbiB0byBzZWxlY3Qgc2NoZW1hKQotCi1FbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdD1EZWZhdWx0ICgpCi1FbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdFdpdGhEZWZhdWx0PURlZmF1bHQgKHswfSkKLQotRXJyb3Jfb3BlbmluZ0VkaXRvcj1FcnJvciBPcGVuaW5nIEVkaXRvcgotCi1HZW5lcmFsX2Jyb3dzZT1CciZvd3NlLi4uCi1HZW5lcmFsX3JldmVydD1SZXZlcnQKLUdlbmVyYWxfZGVzZWxlY3RBbGw9RGVzZWxlY3QgQWxsCi1HZW5lcmFsX3NlbGVjdEFsbD1TZWxlY3QgQWxsCi0KLUdlbmVyYXRlRERMV2l6YXJkX3RpdGxlPURETCBHZW5lcmF0aW9uCi0KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfZ2VuZXJhdGVFbnRpdGllcz1HZW5lcmF0ZSBFbnRpdGllcwotR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfY2hvb3NlRW50aXR5VGFibGU9Q2hvb3NlIHRhYmxlcyB0byBnZW5lcmF0ZSBlbnRpdGllcyBmcm9tLgotR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfZ2VuZXJhdGVFbnRpdGllcz1HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcwotR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2Vfc3luY2hyb25pemVDbGFzc2VzPVN5bmNocm9uaXplIGNsYXNzZXMgaW4gcGVyc2lzdGVuY2UueG1sCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV90YWJsZXM9VGFibGVzOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfdGFibGVDb2x1bW49VGFibGUKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX2VudGl0eU5hbWVDb2x1bW49RW50aXR5IE5hbWUKLQotRW50aXRpZXNHZW5lcmF0b3Jfam9iTmFtZT1HZW5lcmF0aW5nIEVudGl0aWVzCi0KLUdlbmVyaWNQbGF0Zm9ybVVpRGlhbG9nX25vdFN1cHBvcnRlZE1lc3NhZ2VUaXRsZT1EREwgR2VuZXJhdGlvbgotR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRleHQ9RERMIEdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgR2VuZXJpYyBQbGF0Zm9ybS4KLQotSnBhQ29udGVudF9sYWJlbD1KUEEgQ29udGVudAotCi1KcGFTdHJ1Y3R1cmVWaWV3X3N0cnVjdHVyZU5vdEF2YWlsYWJsZT1KUEEgc3RydWN0dXJlIGlzIG5vdCBhdmFpbGFibGUuCi1KcGFTdHJ1Y3R1cmVWaWV3X2xpbmtXaXRoRWRpdG9yVGV4dD1MaW5rIHdpdGggRWRpdG9yCi1KcGFTdHJ1Y3R1cmVWaWV3X2xpbmtXaXRoRWRpdG9yRGVzYz1MaW5rIHdpdGggQWN0aXZlIEVkaXRvcgotSnBhU3RydWN0dXJlVmlld19saW5rV2l0aEVkaXRvclRvb2x0aXA9TGluayB3aXRoIEVkaXRvcgotSnBhU3RydWN0dXJlVmlld19udW1JdGVtc1NlbGVjdGVkPXswfSBpdGVtcyBzZWxlY3RlZAotCi1KcGFEZXRhaWxzVmlld192aWV3Tm90QXZhaWxhYmxlPURldGFpbHMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQotSnBhRmFjZXRXaXphcmRQYWdlX3RpdGxlPUpQQSBGYWNldAotSnBhRmFjZXRXaXphcmRQYWdlX2Rlc2NyaXB0aW9uPUNvbmZpZ3VyZSBKUEEgc2V0dGluZ3MuCi1KcGFGYWNldFdpemFyZFBhZ2VfcGxhdGZvcm1MYWJlbD0mUGxhdGZvcm0KLUpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGFiZWw9JkNvbm5lY3Rpb24KLUpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGluaz08YT5BZGQgY29ubmVjdGlvbi4uLjwvYT4KLUpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0TGluaz08YT5Db25uZWN0PC9hPgotSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3RlZFRleHQ9PGE+Q29ubmVjdGVkPC9hPgotSnBhRmFjZXRXaXphcmRQYWdlX2FkZERyaXZlckxpYnJhcnlMYWJlbD0mQWRkIGRyaXZlciBsaWJyYXJ5IHRvIGJ1aWxkIHBhdGgKLUpwYUZhY2V0V2l6YXJkUGFnZV9kcml2ZXJMaWJyYXJ5TGFiZWw9JkRyaXZlcjoKLUpwYUZhY2V0V2l6YXJkUGFnZV9vdmVycmlkZURlZmF1bHRDYXRhbG9nTGFiZWw9Jk92ZXJyaWRlIGRlZmF1bHQgY2F0YWxvZyBmcm9tIGNvbm5lY3Rpb24KLUpwYUZhY2V0V2l6YXJkUGFnZV9kZWZhdWx0Q2F0YWxvZ0xhYmVsPUNhdGFsbyZnOgotSnBhRmFjZXRXaXphcmRQYWdlX292ZXJyaWRlRGVmYXVsdFNjaGVtYUxhYmVsPU8mdmVycmlkZSBkZWZhdWx0IHNjaGVtYSBmcm9tIGNvbm5lY3Rpb24KLUpwYUZhY2V0V2l6YXJkUGFnZV9kZWZhdWx0U2NoZW1hTGFiZWw9JlNjaGVtYToKLUpwYUZhY2V0V2l6YXJkUGFnZV9mYWNldHNQYWdlTGluaz08YT5DaGFuZ2UgSlBBIHZlcnNpb24uLi48L2E+Ci1KcGFGYWNldFdpemFyZFBhZ2VfanBhSW1wbGVtZW50YXRpb25MYWJlbD1KUEEgaW1wbGVtZW50YXRpb24KLUpwYUZhY2V0V2l6YXJkUGFnZV91c2VyU2VydmVyTGliTGFiZWw9SW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgc2VydmVyIHJ1bnRpbWUKLUpwYUZhY2V0V2l6YXJkUGFnZV9zcGVjaWZ5TGliTGFiZWw9SW1wbGVtZW50YXRpb24gbGlicmFyeToKLUpwYUZhY2V0V2l6YXJkUGFnZV9qcGFQcmVmc0xpbms9PGE+Q29uZmlndXJlIGRlZmF1bHQgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkuLi48L2E+Ci1KcGFGYWNldFdpemFyZFBhZ2VfdXNlckxpYnNMaW5rPTxhPkNvbmZpZ3VyZSB1c2VyIGxpYnJhcmllcy4uLjwvYT4KLUpwYUZhY2V0V2l6YXJkUGFnZV9wZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50TGFiZWw9UGVyc2lzdGVudCBjbGFzcyBtYW5hZ2VtZW50Ci1KcGFGYWNldFdpemFyZFBhZ2VfZGlzY292ZXJDbGFzc2VzQnV0dG9uPURpc2NvdmVyIGFubm90YXRlZCBjbGFzc2VzIGEmdXRvbWF0aWNhbGx5Ci1KcGFGYWNldFdpemFyZFBhZ2VfbGlzdENsYXNzZXNCdXR0b249QW5ub3RhdGVkIGNsYXNzZXMgbXVzdCBiZSAmbGlzdGVkIGluIHBlcnNpc3RlbmNlLnhtbAotSnBhRmFjZXRXaXphcmRQYWdlX2NyZWF0ZU9ybVhtbEJ1dHRvbj1DcmVhdGUgJm1hcHBpbmcgZmlsZSAob3JtLnhtbCkKLUpwYUZhY2V0V2l6YXJkUGFnZV9tZXRhbW9kZWxMYWJlbD1DYW5vbmljYWwgbWV0YW1vZGVsIChKUEEgMi4wKQotSnBhRmFjZXRXaXphcmRQYWdlX21ldGFtb2RlbFNvdXJjZUZvbGRlckxpbms9PGE+U291cmNlIGZvbCZkZXI6PC9hPgotSnBhRmFjZXRXaXphcmRQYWdlX25vbmU9PE5vbmU+Ci0KLUpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbF9pbmNsdWRlTGlicmFyaWVzPSZJbmNsdWRlIGxpYnJhcmllcyB3aXRoIHRoaXMgYXBwbGljYXRpb24KLQotSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX3RpdGxlPU1ha2UgUGVyc2lzdGVudAotSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21lc3NhZ2U9TWFrZSB0aGUgc2VsZWN0ZWQgSmF2YSBjbGFzc2VzIHBlcnNpc3RlbnQgYnkgc2VsZWN0aW5nIEphdmEgYW5ub3RhdGlvbnMgb3IgbWFwcGluZyBmaWxlCi1KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfYW5ub3RhdGVJbkphdmFSYWRpb0J1dHRvbj1Bbm5vdGF0ZSBpbiAmSmF2YQotSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21hcHBpbmdGaWxlUmFkaW9CdXR0b249QWRkIHRvICZYTUwgbWFwcGluZyBmaWxlCi1KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfbWFwcGluZ0ZpbGVMaW5rPTxhPiZNYXBwaW5nIGZpbGU6PC9hPgotSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21hcHBpbmdGaWxlQnJvd3NlQnV0dG9uPUImcm93c2UuLi4KLUpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV90eXBlVGFibGVDb2x1bW49VHlwZQotSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21hcHBpbmdUYWJsZUNvbHVtbj1NYXBwaW5nCi1KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfbGlzdEluUGVyc2lzdGVuY2VYbWxDaGVja0JveD0mTGlzdCBpbiBwZXJzaXN0ZW5jZS54bWwKLUpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9zZWxlY3RlZFR5cGVzUGVyc2lzdGVudEVycm9yPUFsbCBzZWxlY3RlZCB0eXBlcyBhcmUgYWxyZWFkeSBwZXJzaXN0ZW50Ci1KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfbWFwcGluZ0ZpbGVEb2VzTm90RXhpc3RFcnJvcj1UaGUgWE1MIG1hcHBpbmcgZmlsZSBkb2VzIG5vdCBleGlzdAotSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21hcHBpbmdGaWxlTm90TGlzdGVkSW5QZXJzaXN0ZW5jZVhtbEVycm9yPVRoZSBYTUwgbWFwcGluZyBmaWxlIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotCi1KcGFQcmVmZXJlbmNlc1BhZ2VfRGVzY3JpcHRpb249RXhwYW5kIHRoZSB0cmVlIHRvIGVkaXQgcHJlZmVyZW5jZXMgZm9yIGEgc3BlY2lmaWMgZmVhdHVyZS4KLQotSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX0Rlc2NyaXB0aW9uPVNlbGVjdCB0aGUgc2V2ZXJpdHkgbGV2ZWwgZm9yIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgSmF2YSBQZXJzaXN0ZW5jZSB2YWxpZGF0aW9uIHByb2JsZW1zOgotSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX0Vycm9yPUVycm9yCi1KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfSWdub3JlPUlnbm9yZQotSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX0luZm89SW5mbwotSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX1dhcm5pbmc9V2FybmluZwotCi1NYXBwaW5nRmlsZVdpemFyZF90aXRsZT1OZXcgTWFwcGluZyBGaWxlCi1NYXBwaW5nRmlsZVdpemFyZFBhZ2VfbmV3RmlsZV90aXRsZT1NYXBwaW5nIGZpbGUKLU1hcHBpbmdGaWxlV2l6YXJkUGFnZV9uZXdGaWxlX2Rlc2M9U3BlY2lmeSBtYXBwaW5nIGZpbGUgbmFtZSBhbmQgbG9jYXRpb24KLU1hcHBpbmdGaWxlV2l6YXJkUGFnZV9vcHRpb25zX3RpdGxlPU1hcHBpbmcgZmlsZQotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX29wdGlvbnNfZGVzYz1TcGVjaWZ5IG1hcHBpbmcgZmlsZSBvcHRpb25zCi1NYXBwaW5nRmlsZVdpemFyZFBhZ2VfcHJvamVjdExhYmVsPSZQcm9qZWN0OgotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3NvdXJjZUZvbGRlckxhYmVsPVNvdXJjZSBmb2wmZGVyOgotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2ZpbGVQYXRoTGFiZWw9RmlsZSBwYXQmaDoKLU1hcHBpbmdGaWxlV2l6YXJkUGFnZV9hY2Nlc3NMYWJlbD1EZWZhdWx0IGEmY2Nlc3M6Ci1NYXBwaW5nRmlsZVdpemFyZFBhZ2VfYWRkVG9QZXJzaXN0ZW5jZVVuaXRCdXR0b249JkFkZCB0byBwZXJzaXN0ZW5jZSB1bml0Ci1NYXBwaW5nRmlsZVdpemFyZFBhZ2VfcGVyc2lzdGVuY2VVbml0TGFiZWw9UGVyc2lzdGVuY2UgJnVuaXQ6Ci1NYXBwaW5nRmlsZVdpemFyZFBhZ2VfaW5jb3JyZWN0U291cmNlRm9sZGVyRXJyb3I9U2VsZWN0aW9uIG11c3QgYmUgYSB2YWxpZCBzb3VyY2UgZm9sZGVyCi1NYXBwaW5nRmlsZVdpemFyZFBhZ2VfYWNjZXNzTGFiZWxfc291cmNlRm9sZGVyRGlhbG9nVGl0bGU9U291cmNlIEZvbGRlciBTZWxlY3Rpb24KLU1hcHBpbmdGaWxlV2l6YXJkUGFnZV9hY2Nlc3NMYWJlbF9zb3VyY2VGb2xkZXJEaWFsb2dEZXNjPUNob29zZSBhIHNvdXJjZSBmb2xkZXI6Ci0KLUpwYVByb2plY3RXaXphcmRfdGl0bGU9TmV3IEpQQSBQcm9qZWN0Ci1OZXdKcGFQcm9qZWN0V2l6YXJkX2ZpcnN0UGFnZV90aXRsZT1KUEEgUHJvamVjdAotTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfZGVzY3JpcHRpb249Q29uZmlndXJlIEpQQSBwcm9qZWN0IHNldHRpbmdzLgotCi1Pcm1JdGVtTGFiZWxQcm92aWRlckZhY3RvcnlfZW50aXR5TWFwcGluZ3NMYWJlbD1FbnRpdHkgTWFwcGluZ3MKLQotUGFja2FnZUNob29zZXJQYW5lX2RpYWxvZ1RpdGxlPVBhY2thZ2UgU2VsZWN0aW9uCi1QYWNrYWdlQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZT0mRW50ZXIgcGFja2FnZSBuYW1lIHByZWZpeCBvciBwYXR0ZXJuICgqID0gYW55IHN0cmluZywgPyA9ICBhbnkgY2hhcmFjdGVyKToKLQotUGVyc2lzdGVuY2VJdGVtTGFiZWxQcm92aWRlckZhY3RvcnlfcGVyc2lzdGVuY2VMYWJlbD1QZXJzaXN0ZW5jZQotCi1PdmVyd3JpdGVDb25maXJtZXJEaWFsb2dfdGl0bGU9T3ZlcndyaXRlIEV4aXN0aW5nIENsYXNzCi1PdmVyd3JpdGVDb25maXJtZXJEaWFsb2dfdGV4dD1PdmVyd3JpdGUgc291cmNlIGNvZGUgZm9yIHRoZSBjbGFzcyAnJ3swfScnPwotCi1TZWxlY3RKcGFPcm1NYXBwaW5nRmlsZURpYWxvZ19uZXdCdXR0b249TmV3Li4uCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX2RldGFpbHMucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfZGV0YWlscy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzEzZjc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfZGV0YWlscy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Cb29sZWFuX1RydWU9VHJ1ZQotQm9vbGVhbl9GYWxzZT1GYWxzZQotTm9uZVNlbGVjdGVkPTxOb25lPgotRGVmYXVsdEVtcHR5PURlZmF1bHQKLURlZmF1bHRXaXRoT25lUGFyYW09RGVmYXVsdCAoezB9KQotUHJvdmlkZXJEZWZhdWx0PURlZmF1bHQgKDxQcm92aWRlci1TcGVjaWZpYz4pCi1Ob05hbWVTZXQ9PE5vIG5hbWUgc2V0PgotCi1NYXBBc0NvbXBvc2l0ZV9jaGFuZ2VNYXBwaW5nVHlwZT1oZXJlCi1NYXBBc0NvbXBvc2l0ZV9kZWZhdWx0PURlZmF1bHQKLU1hcEFzQ29tcG9zaXRlX2RpYWxvZ1RpdGxlPU1hcHBpbmcgVHlwZSBTZWxlY3Rpb24KLU1hcEFzQ29tcG9zaXRlX2xhYmVsVGV4dD0mRW50ZXIgbWFwcGluZyB0eXBlIG9yIHBhdHRlcm4gKCosID8sIG9yIGNhbWVsIGNhc2UpOgotTWFwQXNDb21wb3NpdGVfbWFwcGVkQXR0cmlidXRlVGV4dD1BdHRyaWJ1dGUgJyd7MH0nJyBpcyBtYXBwZWQgYXMgezF9LgotTWFwQXNDb21wb3NpdGVfbWFwcGVkVHlwZVRleHQ9VHlwZSAnJ3swfScnIGlzIG1hcHBlZCBhcyB7MX0uCi1NYXBBc0NvbXBvc2l0ZV91bm1hcHBlZEF0dHJpYnV0ZVRleHQ9QXR0cmlidXRlICcnezB9JycgaXMgbm90IG1hcHBlZCwgY2xpY2sgaGVyZSB0byBjaGFuZ2UgdGhlIG1hcHBpbmcgdHlwZS4KLU1hcEFzQ29tcG9zaXRlX3VubWFwcGVkVHlwZVRleHQ9VHlwZSAnJ3swfScnIGlzIG5vdCBtYXBwZWQsIGNsaWNrIGhlcmUgdG8gY2hhbmdlIHRoZSBtYXBwaW5nIHR5cGUuCi1NYXBBc0NvbXBvc2l0ZV92aXJ0dWFsQXR0cmlidXRlVGV4dD1BdHRyaWJ1dGUgJyd7MH0nJyBpcyBub3QgbWFwcGVkLgotCi1CYXNpY1NlY3Rpb25fdGl0bGU9QmFzaWMKLUVtYmVkZGVkU2VjdGlvbl90aXRsZT1FbWJlZGRlZAotRW1iZWRkZWRJZFNlY3Rpb25fdGl0bGU9RW1iZWRkZWQgSUQKLUVtYmVkZGFibGVTZWN0aW9uX3RpdGxlPUVtYmVkZGFibGUKLUVudGl0eVNlY3Rpb25fdGl0bGU9RW50aXR5Ci1JZFNlY3Rpb25fdGl0bGU9SUQKLU1hbnlUb01hbnlTZWN0aW9uX3RpdGxlPU1hbnkgdG8gTWFueQotTWFueVRvT25lU2VjdGlvbl90aXRsZT1NYW55IHRvIE9uZQotTWFwcGVkU3VwZXJjbGFzc1NlY3Rpb25fdGl0bGU9TWFwcGVkIFN1cGVyY2xhc3MKLU9uZVRvTWFueVNlY3Rpb25fdGl0bGU9T25lIHRvIE1hbnkKLU9uZVRvT25lU2VjdGlvbl90aXRsZT1PbmUgdG8gT25lCi1WZXJzaW9uU2VjdGlvbl90aXRsZT1WZXJzaW9uCi0KLUJhc2ljTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9QmFzaWMKLUVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9RW1iZWRkZWQKLUVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1FbWJlZGRlZCBJRAotSWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1JRAotT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9T25lIHRvIE1hbnkKLU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9T25lIHRvIE9uZQotTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPU1hbnkgdG8gTWFueQotTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9TWFueSB0byBPbmUKLVRyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPVRyYW5zaWVudAotVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPVZlcnNpb24KLUJhc2ljTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPWJhc2ljCi1FbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1lbWJlZGRlZAotRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1lbWJlZGRlZCBJRAotSWRNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw9SUQKLU9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1vbmUgdG8gbWFueQotT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw9b25lIHRvIG9uZQotTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1tYW55IHRvIG1hbnkKLU1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1tYW55IHRvIG9uZQotVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPXRyYW5zaWVudAotVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD12ZXJzaW9uCi0KLURlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPURlZmF1bHQgKEJhc2ljKQotRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9RGVmYXVsdCAoRW1iZWRkZWQpCi1EZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw9ZGVmYXVsdCAoYmFzaWMpCi1EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw9ZGVmYXVsdCAoZW1iZWRkZWQpCi0KLUVtYmVkZGFibGVVaVByb3ZpZGVyX2xhYmVsPUVtYmVkZGFibGUKLUVudGl0eVVpUHJvdmlkZXJfbGFiZWw9RW50aXR5Ci1NYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlcl9sYWJlbD1NYXBwZWQgU3VwZXJjbGFzcwotTnVsbFR5cGVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1Vbm1hcHBlZAotCi1FbWJlZGRhYmxlVWlQcm92aWRlcl9saW5rTGFiZWw9ZW1iZWRkYWJsZQotRW50aXR5VWlQcm92aWRlcl9saW5rTGFiZWw9ZW50aXR5Ci1NYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlcl9saW5rTGFiZWw9bWFwcGVkIHN1cGVyY2xhc3MKLQotCi1BZGRRdWVyeURpYWxvZ190aXRsZT1BZGQgUXVlcnkKLUFkZFF1ZXJ5RGlhbG9nX2Rlc2NyaXB0aW9uVGl0bGU9Q3JlYXRlIG5ldyBxdWVyeQotQWRkUXVlcnlEaWFsb2dfbmFtZWRRdWVyeT1OYW1lZCBRdWVyeQotQWRkUXVlcnlEaWFsb2dfbmFtZWROYXRpdmVRdWVyeT0gTmFtZWQgTmF0aXZlIFF1ZXJ5Ci1BZGRRdWVyeURpYWxvZ19kZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgcXVlcnkgc2V0dGluZyBib3RoIHRoZSAnbmFtZScgYW5kIHRoZSAndHlwZScgCi1RdWVyeVN0YXRlT2JqZWN0X25hbWVNdXN0QmVTcGVjaWZpZWQ9QSBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLgotUXVlcnlTdGF0ZU9iamVjdF90eXBlTXVzdEJlU3BlY2lmaWVkPUEgcXVlcnkgdHlwZSBtdXN0IGJlIHNwZWNpZmllZAotQWRkUXVlcnlEaWFsb2dfbmFtZT1OYW1lOgotQWRkUXVlcnlEaWFsb2dfcXVlcnlUeXBlPVR5cGU6Ci1OYW1lZFF1ZXJ5Q29tcG9zaXRlX25hbWVUZXh0TGFiZWw9TmFtZToKLQotRW50aXR5Q29tcG9zaXRlX2luaGVyaXRhbmNlPUluaGVyaXRhbmNlCi1FbnRpdHlDb21wb3NpdGVfcXVlcmllcz1RdWVyaWVzCi1FbnRpdHlDb21wb3NpdGVfdGFibGVEZWZhdWx0PURlZmF1bHQgKHswfSkKLUVudGl0eUNvbXBvc2l0ZV90YWJsZU5vRGVmYXVsdFNwZWNpZmllZD1EZWZhdWx0ICgpCi0KLUVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWU9TmFtZToKLQotRW50aXR5TmFtZUNvbXBvc2l0ZV9uYW1lPU5hbWU6Ci0KLUJhc2ljR2VuZXJhbFNlY3Rpb25fbmFtZT1OYW1lOgotQmFzaWNHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdD1EZWZhdWx0ICh7MH0pCi1CYXNpY0dlbmVyYWxTZWN0aW9uX2ZldGNoTGFiZWw9RmV0Y2g6Ci1CYXNpY0dlbmVyYWxTZWN0aW9uX29wdGlvbmFsTGFiZWw9T3B0aW9uYWwKLUJhc2ljR2VuZXJhbFNlY3Rpb25fb3B0aW9uYWxMYWJlbERlZmF1bHQ9T3B0aW9uYWwgKHswfSkKLUJhc2ljR2VuZXJhbFNlY3Rpb25fbG9iTGFiZWw9TG9iCi1CYXNpY0dlbmVyYWxTZWN0aW9uX3RlbXBvcmFsTGFiZWw9VGVtcG9yYWw6Ci1CYXNpY0dlbmVyYWxTZWN0aW9uX2VudW1lcmF0ZWRMYWJlbD1FbnVtZXJhdGVkOgotVHlwZVNlY3Rpb25fdHlwZT1UeXBlCi1UeXBlU2VjdGlvbl9kZWZhdWx0PURlZmF1bHQKLVR5cGVTZWN0aW9uX2xvYj1Mb2IKLVR5cGVTZWN0aW9uX3RlbXBvcmFsPVRlbXBvcmFsOgotVHlwZVNlY3Rpb25fZW51bWVyYXRlZD1FbnVtZXJhdGVkOgotCi1UYWJsZUNob29zZXJfbGFiZWw9TmFtZToKLUNhdGFsb2dDaG9vc2VyX2xhYmVsPUNhdGFsb2c6Ci1TY2hlbWFDaG9vc2VyX2xhYmVsPVNjaGVtYToKLVRhYmxlQ29tcG9zaXRlX3RhYmxlU2VjdGlvbj1UYWJsZQotCi1UYXJnZXRFbnRpdHlDaG9vc2VyX2xhYmVsPVRhcmdldCBlbnRpdHk6Ci1UYXJnZXRFbnRpdHlDaG9vc2VyX2Jyb3dzZT1Ccm93c2UuLi4KLVRhcmdldEVudGl0eUNob29zZXJfc2VsZWN0VHlwZVRpdGxlPVNlbGVjdCBUeXBlCi0KLUlkQ2xhc3NDb21wb3NpdGVfbGFiZWw9SUQgY2xhc3M6Ci0KLUpvaW5pbmdfdGl0bGU9Sm9pbmluZyBTdHJhdGVneQotSm9pbmluZ19tYXBwZWRCeUxhYmVsPU1hcHBlZCBieQotSm9pbmluZ19tYXBwZWRCeUF0dHJpYnV0ZUxhYmVsPUF0dHJpYnV0ZToKLUpvaW5pbmdfam9pbkNvbHVtbkpvaW5pbmdMYWJlbD1Kb2luIGNvbHVtbnMKLUpvaW5pbmdfcHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nTGFiZWw9UHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zCi1Kb2luaW5nX2pvaW5UYWJsZUpvaW5pbmdMYWJlbD1Kb2luIHRhYmxlCi0KLUpvaW5UYWJsZUNvbXBvc2l0ZV9pbnZlcnNlSm9pbkNvbHVtbj1JbnZlcnNlIGpvaW4gY29sdW1ucwotSm9pblRhYmxlQ29tcG9zaXRlX2pvaW5Db2x1bW49Sm9pbiBjb2x1bW5zCi1Kb2luVGFibGVDb21wb3NpdGVfbmFtZT1OYW1lOgotSm9pblRhYmxlQ29tcG9zaXRlX3NjaGVtYT1TY2hlbWE6Ci1Kb2luVGFibGVDb21wb3NpdGVfY2F0YWxvZz1DYXRhbG9nOgotSm9pblRhYmxlQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zPU92ZXJyaWRlIGRlZmF1bHQKLUpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnM9T3ZlcnJpZGUgZGVmYXVsdAotCi1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfZ2VuZXJhbD1HZW5lcmFsCi1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfam9pblRhYmxlPUpvaW4gVGFibGUKLU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV90YXJnZXRFbnRpdHk9VGFyZ2V0IGVudGl0eToKLU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9jYXNjYWRlVHlwZT1DYXNjYWRlIHR5cGU6Ci1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfZmV0Y2hUeXBlPUZldGNoIHR5cGU6Ci1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfbWFwcGVkQnk9TWFwcGVkIGJ5OgotCi1Db2x1bW5Db21wb3NpdGVfY29sdW1uRGVmaW5pdGlvbj1Db2x1bW4gZGVmaW5pdGlvbjoKLUNvbHVtbkNvbXBvc2l0ZV9jb2x1bW5TZWN0aW9uPUNvbHVtbgotQ29sdW1uQ29tcG9zaXRlX2RldGFpbHM9RGV0YWlscwotQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGU9SW5zZXJ0YWJsZQotQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGVXaXRoRGVmYXVsdD1JbnNlcnRhYmxlICh7MH0pCi1Db2x1bW5Db21wb3NpdGVfbGVuZ3RoPUxlbmd0aDoKLUNvbHVtbkNvbXBvc2l0ZV9uYW1lPU5hbWU6Ci1Db2x1bW5Db21wb3NpdGVfbnVsbGFibGU9TnVsbGFibGUKLUNvbHVtbkNvbXBvc2l0ZV9udWxsYWJsZVdpdGhEZWZhdWx0PU51bGxhYmxlICh7MH0pCi1Db2x1bW5Db21wb3NpdGVfcHJlY2lzaW9uPVByZWNpc2lvbjoKLUNvbHVtbkNvbXBvc2l0ZV9zY2FsZT1TY2FsZToKLUNvbHVtbkNvbXBvc2l0ZV90YWJsZT1UYWJsZToKLUNvbHVtbkNvbXBvc2l0ZV91bmlxdWU9VW5pcXVlCi1Db2x1bW5Db21wb3NpdGVfdW5pcXVlV2l0aERlZmF1bHQ9VW5pcXVlICh7MH0pCi1Db2x1bW5Db21wb3NpdGVfdXBkYXRhYmxlPVVwZGF0YWJsZQotQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZVdpdGhEZWZhdWx0PVVwZGF0YWJsZSAoezB9KQotCi1Kb2luQ29sdW1uc0NvbXBvc2l0ZV9lZGl0PUVkaXQuLi4KLUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zPXswfSAtPiB7MX0KLUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdD1EZWZhdWx0ICh7MH0gLT4gezF9KQotSm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdD1EZWZhdWx0ICh7MH0pIC0+IERlZmF1bHQgKHsxfSkKLUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0PURlZmF1bHQgKHswfSkgLT4gezF9Ci1Kb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQ9ezB9IC0+IERlZmF1bHQgKHsxfSkKLUpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zPU92ZXJyaWRlIGRlZmF1bHQKLQotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucz1PdmVycmlkZSBkZWZhdWx0Ci1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZWRpdD1FZGl0Li4uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfcHJpbWFyeUtleUpvaW5Db2x1bW49UHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXM9ezB9IC0+IHsxfQotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdD1EZWZhdWx0ICh7MH0gLT4gezF9KQotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ9RGVmYXVsdCAoezB9KSAtPiBEZWZhdWx0ICh7MX0pCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQ9RGVmYXVsdCAoezB9KSAtPiB7MX0KLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQ9ezB9IC0+IERlZmF1bHQgKHsxfSkKLQotSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uRGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgTmV3IEpvaW4gQ29sdW1uCi1Kb2luQ29sdW1uRGlhbG9nX2FkZEpvaW5Db2x1bW5UaXRsZT1BZGQgSm9pbiBDb2x1bW4KLUpvaW5Db2x1bW5EaWFsb2dfZGVzY3JpcHRpb249U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLgotSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtbkRlc2NyaXB0aW9uVGl0bGU9RWRpdCBKb2luIENvbHVtbgotSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtblRpdGxlPUVkaXQgSm9pbiBDb2x1bW4KLUpvaW5Db2x1bW5EaWFsb2dfbmFtZT0mTmFtZToKLUpvaW5Db2x1bW5EaWFsb2dfcmVmZXJlbmNlZENvbHVtbk5hbWU9JlJlZmVyZW5jZWQgY29sdW1uIG5hbWU6Ci0KLUpvaW5Db2x1bW5EaWFsb2dQYW5lX2NvbHVtbkRlZmluaXRpb249JkNvbHVtbiBkZWZpbml0aW9uOgotSm9pbkNvbHVtbkRpYWxvZ1BhbmVfaW5zZXJ0YWJsZT0mSW5zZXJ0YWJsZQotSm9pbkNvbHVtbkRpYWxvZ1BhbmVfaW5zZXJ0YWJsZVdpdGhEZWZhdWx0PSZJbnNlcnRhYmxlICh7MH0pCi1Kb2luQ29sdW1uRGlhbG9nUGFuZV9udWxsYWJsZT0mTnVsbGFibGUKLUpvaW5Db2x1bW5EaWFsb2dQYW5lX251bGxhYmxlV2l0aERlZmF1bHQ9Jk51bGxhYmxlICh7MH0pCi1Kb2luQ29sdW1uRGlhbG9nUGFuZV90YWJsZT0mVGFibGU6Ci1Kb2luQ29sdW1uRGlhbG9nUGFuZV91bmlxdWU9JlVuaXF1ZQotSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdW5pcXVlV2l0aERlZmF1bHQ9JlVuaXF1ZSAoezB9KQotSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdXBkYXRhYmxlPSZVcGRhdGFibGUKLUpvaW5Db2x1bW5EaWFsb2dQYW5lX3VwZGF0YWJsZVdpdGhEZWZhdWx0PSZVcGRhdGFibGUgKHswfSkKLQotSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2dfZWRpdEludmVyc2VKb2luQ29sdW1uVGl0bGU9RWRpdCBJbnZlcnNlIEpvaW4gQ29sdW1uCi0KLVByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGREZXNjcmlwdGlvblRpdGxlPUNyZWF0ZSBOZXcgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4KLVByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGRUaXRsZT1BZGQgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4KLVByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0RGVzY3JpcHRpb25UaXRsZT1FZGl0IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdFRpdGxlPUVkaXQgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4KLQotUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfYWRkRGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgTmV3IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19hZGRUaXRsZT1BZGQgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4KLVByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nX2VkaXREZXNjcmlwdGlvblRpdGxlPUVkaXQgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4KLVByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nX2VkaXRUaXRsZT1FZGl0IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi0KLU92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGVPdmVycmlkZXNTZWN0aW9uPUF0dHJpYnV0ZSBPdmVycmlkZXMKLU92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGVPdmVycmlkZXNHcm91cD1BdHRyaWJ1dGUgb3ZlcnJpZGVzCi1PdmVycmlkZXNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0PU92ZXJyaWRlIGRlZmF1bHQKLQotT3ZlcnJpZGVzQ29tcG9zaXRlX2Fzc29jaWF0aW9uPUFzc29jaWF0aW9uIE92ZXJyaWRlCi1PdmVycmlkZXNDb21wb3NpdGVfYXR0cmlidXRlPUF0dHJpYnV0ZSBPdmVycmlkZQotT3ZlcnJpZGVzQ29tcG9zaXRlX25vTmFtZT08TmFtZSBub3Qgc2V0PgotQXNzb2NpYXRpb25PdmVycmlkZXNDb21wb3NpdGVfam9pbkNvbHVtbj1Kb2luIGNvbHVtbnMKLQotSW5oZXJpdGFuY2VDb21wb3NpdGVfZGV0YWlsc0dyb3VwQm94PURldGFpbHMKLUluaGVyaXRhbmNlQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JDb2x1bW5Hcm91cEJveD1EaXNjcmltaW5hdG9yIGNvbHVtbgotSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvclZhbHVlPURpc2NyaW1pbmF0b3IgdmFsdWU6Ci1BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX2pvaW5lZD1Kb2luZWQKLUFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGVfc2luZ2xlX3RhYmxlPVNpbmdsZSBUYWJsZQotSW5oZXJpdGFuY2VDb21wb3NpdGVfc3RyYXRlZ3k9U3RyYXRlZ3k6Ci1BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX3RhYmxlX3Blcl9jbGFzcz1UYWJsZSBwZXIgQ2xhc3MKLQotRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yVHlwZT1UeXBlOgotRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9uYW1lPU5hbWU6Ci1EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2NoYXI9Q2hhcmFjdGVyCi1EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2ludGVnZXI9SW50ZWdlcgotRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9zdHJpbmc9U3RyaW5nCi0KLUdlbmVyYXRvcnNDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveD1TZXF1ZW5jZSBnZW5lcmF0b3IKLUdlbmVyYXRvcnNDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3JTZWN0aW9uPVNlcXVlbmNlIEdlbmVyYXRvcgotR2VuZXJhdG9yc0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvckNoZWNrQm94PVRhYmxlIGdlbmVyYXRvcgotR2VuZXJhdG9yc0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvclNlY3Rpb249VGFibGUgR2VuZXJhdG9yCi0KLUlkTWFwcGluZ0NvbXBvc2l0ZV9wa19nZW5lcmF0aW9uPVBLIEdlbmVyYXRpb24KLUlkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94PVByaW1hcnkga2V5IGdlbmVyYXRpb24KLUlkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvblNlY3Rpb249UHJpbWFyeSBLZXkgR2VuZXJhdGlvbgotSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yQ2hlY2tCb3g9VGFibGUgZ2VuZXJhdG9yCi1JZE1hcHBpbmdDb21wb3NpdGVfdGFibGVHZW5lcmF0b3JTZWN0aW9uPVRhYmxlIEdlbmVyYXRvcgotSWRNYXBwaW5nQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3g9U2VxdWVuY2UgZ2VuZXJhdG9yCi1JZE1hcHBpbmdDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3JTZWN0aW9uPVNlcXVlbmNlIEdlbmVyYXRvcgotCi1HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9nZW5lcmF0ZWRWYWx1ZT1HZW5lcmF0ZWQgVmFsdWUKLUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2dlbmVyYXRvck5hbWU9R2VuZXJhdG9yIG5hbWU6Ci1HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9zdHJhdGVneT1TdHJhdGVneToKLUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2F1dG89QXV0bwotR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfaWRlbnRpdHk9SWRlbnRpdHkKLUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX3NlcXVlbmNlPVNlcXVlbmNlCi1HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV90YWJsZT1UYWJsZQotCi1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9jYXRhbG9nPUNhdGFsb2c6Ci1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0PURlZmF1bHQKLVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWU9TmFtZToKLVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NjaGVtYT1TY2hlbWE6Ci1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9zZXF1ZW5jZT1TZXF1ZW5jZToKLVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yPVNlcXVlbmNlIEdlbmVyYXRvcgotCi1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9jYXRhbG9nPUNhdGFsb2c6Ci1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0PURlZmF1bHQKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWU9TmFtZToKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3BrQ29sdW1uPVByaW1hcnkga2V5IGNvbHVtbjoKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3BrQ29sdW1uVmFsdWU9UHJpbWFyeSBrZXkgY29sdW1uIHZhbHVlOgotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfc2NoZW1hPVNjaGVtYToKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlPVRhYmxlOgotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdGFibGVHZW5lcmF0b3I9VGFibGUgR2VuZXJhdG9yCi1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV92YWx1ZUNvbHVtbj1WYWx1ZSBjb2x1bW46Ci0KLUdlbmVyYXRvckNvbXBvc2l0ZV9hbGxvY2F0aW9uU2l6ZT1BbGxvY2F0aW9uIHNpemU6Ci1HZW5lcmF0b3JDb21wb3NpdGVfaW5pdGlhbFZhbHVlPUluaXRpYWwgdmFsdWU6Ci0KLU9yZGVyaW5nQ29tcG9zaXRlX29yZGVyaW5nR3JvdXA9T3JkZXJpbmcKLU9yZGVyaW5nQ29tcG9zaXRlX25vbmU9Tm9uZQotT3JkZXJpbmdDb21wb3NpdGVfcHJpbWFyeUtleT1QcmltYXJ5IGtleQotT3JkZXJpbmdDb21wb3NpdGVfY3VzdG9tPUN1c3RvbQotCi1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfc2Vjb25kYXJ5VGFibGVzPVNlY29uZGFyeSBUYWJsZXMKLVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9lZGl0PUVkaXQuLi4KLQotU2Vjb25kYXJ5VGFibGVEaWFsb2dfYWRkU2Vjb25kYXJ5VGFibGU9QWRkIFNlY29uZGFyeSBUYWJsZQotU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdFNlY29uZGFyeVRhYmxlPUVkaXQgU2Vjb25kYXJ5IFRhYmxlCi1TZWNvbmRhcnlUYWJsZURpYWxvZ19uYW1lPU5hbWU6Ci1TZWNvbmRhcnlUYWJsZURpYWxvZ19jYXRhbG9nPUNhdGFsb2c6Ci1TZWNvbmRhcnlUYWJsZURpYWxvZ19zY2hlbWE9U2NoZW1hOgotU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdFNjaGVtYT1EZWZhdWx0ICh7MH0pCi1TZWNvbmRhcnlUYWJsZURpYWxvZ19kZWZhdWx0Q2F0YWxvZz1EZWZhdWx0ICh7MH0pCi0KLUFjY2Vzc1R5cGVDb21ib19kZWZhdWx0PURlZmF1bHQKLU1ldGFEYXRhQ29tcGxldGVDb21ib19EZWZhdWx0PURlZmF1bHQgKHswfSkKLQotT3B0aW9uYWxDb21wb3NpdGVfZmFsc2U9RmFsc2UKLU9wdGlvbmFsQ29tcG9zaXRlX3RydWU9VHJ1ZQotCi1FbnVtVHlwZUNvbXBvc2l0ZV9vcmRpbmFsPU9yZGluYWwKLUVudW1UeXBlQ29tcG9zaXRlX3N0cmluZz1TdHJpbmcKLQotRmV0Y2hUeXBlQ29tcG9zaXRlX2VhZ2VyPUVhZ2VyCi1GZXRjaFR5cGVDb21wb3NpdGVfbGF6eT1MYXp5Ci0KLVRlbXBvcmFsVHlwZUNvbXBvc2l0ZV9kYXRlPURhdGUKLVRlbXBvcmFsVHlwZUNvbXBvc2l0ZV90aW1lPVRpbWUKLVRlbXBvcmFsVHlwZUNvbXBvc2l0ZV90aW1lc3RhbXA9VGltZXN0YW1wCi0KLUNhc2NhZGVDb21wb3NpdGVfYWxsPUFsbAotQ2FzY2FkZUNvbXBvc2l0ZV9jYXNjYWRlVGl0bGU9Q2FzY2FkZQotQ2FzY2FkZUNvbXBvc2l0ZV9tZXJnZT1NZXJnZQotQ2FzY2FkZUNvbXBvc2l0ZV9wZXJzaXN0PVBlcnNpc3QKLUNhc2NhZGVDb21wb3NpdGVfcmVmcmVzaD1SZWZyZXNoCi1DYXNjYWRlQ29tcG9zaXRlX3JlbW92ZT1SZW1vdmUKLQotUXVlcmllc0NvbXBvc2l0ZV9kaXNwbGF5U3RyaW5nPTxOYW1lIG5vdCBzZXQ+IHswfQotCi1OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnk9UXVlcnk6Ci1OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnlIaW50c0dyb3VwQm94PVF1ZXJ5IGhpbnRzCi1OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcmVzdWx0Q2xhc3M9UmVzdWx0IGNsYXNzOgotCi1OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnk9UXVlcnk6Ci1OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnlIaW50c0dyb3VwQm94PVF1ZXJ5IGhpbnRzCi0KLU5ld05hbWVTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkPUEgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4KLU5ld05hbWVTdGF0ZU9iamVjdF9uYW1lQWxyZWFkeUV4aXN0cz1BIHF1ZXJ5IHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLgotCi1RdWVyeUhpbnRzQ29tcG9zaXRlX25hbWVDb2x1bW49TmFtZQotUXVlcnlIaW50c0NvbXBvc2l0ZV92YWx1ZUNvbHVtbj1WYWx1ZQotCi1Pcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfZGVmaW5lSW5YbWw9RGVmaW5lIGluIFhNTAotCi1OdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9VW5tYXBwZWQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfZGV0YWlsczJfMC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9kZXRhaWxzMl8wLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMTRmZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9kZXRhaWxzMl8wLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQ2FzY2FkZVBhbmUyXzBfZGV0YWNoPURldGFjaAotCi1Db2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfdGl0bGU9Q29sbGVjdGlvbiBUYWJsZQotQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlX2pvaW5Db2x1bW49Sm9pbiBjb2x1bW5zCi1Db2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfbmFtZT1OYW1lOgotQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlX3NjaGVtYT1TY2hlbWE6Ci1Db2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfY2F0YWxvZz1DYXRhbG9nOgotQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zPU92ZXJyaWRlIGRlZmF1bHQKLQotRGVyaXZlZElkZW50aXR5X3RpdGxlPURlcml2ZWQgSWRlbnRpdHkKLURlcml2ZWRJZGVudGl0eV9udWxsRGVyaXZlZElkZW50aXR5PU5vbmUKLURlcml2ZWRJZGVudGl0eV9pZERlcml2ZWRJZGVudGl0eT1JZAotRGVyaXZlZElkZW50aXR5X21hcHNJZERlcml2ZWRJZGVudGl0eT1NYXBzIGlkOgotRGVyaXZlZElkZW50aXR5X21hcHNJZFVuc3BlY2lmaWVkVmFsdWU9PHVuZGV0ZXJtaW5lZCB2YWx1ZT4KLQotRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wX2xhYmVsPUVsZW1lbnQgQ29sbGVjdGlvbgotRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wX2xpbmtMYWJlbD1lbGVtZW50IGNvbGxlY3Rpb24KLUVsZW1lbnRDb2xsZWN0aW9uU2VjdGlvbl90aXRsZT1FbGVtZW50IENvbGxlY3Rpb24KLUFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wX0NvbXBvc2l0ZV92YWx1ZVNlY3Rpb25UaXRsZT1WYWx1ZQotRW50aXR5X2NhY2hlYWJsZUxhYmVsPUNhY2hlYWJsZQotRW50aXR5X2NhY2hlYWJsZVdpdGhEZWZhdWx0TGFiZWw9Q2FjaGVhYmxlICh7MH0pCi0KLUVtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lX2xhYmVsPUVtYmVkZGVkIElEIGlzIG1hcHBlZCBieSBhIHJlbGF0aW9uc2hpcC4KLUlkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZV9sYWJlbD1JRCBpcyBtYXBwZWQgYnkgYSByZWxhdGlvbnNoaXAuCi0KLU9yZGVyaW5nQ29tcG9zaXRlX29yZGVyQ29sdW1uPU9yZGVyIGNvbHVtbgotCi1PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlX29ycGhhblJlbW92YWxMYWJlbD1PcnBoYW4gcmVtb3ZhbAotT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZV9vcnBoYW5SZW1vdmFsTGFiZWxEZWZhdWx0PU9ycGhhbiByZW1vdmFsICh7MH0pCi0KLUxvY2tNb2RlQ29tcG9zaXRlX2xvY2tNb2RlTGFiZWwgPSBMb2NrIG1vZGU6Ci0KLUxvY2tNb2RlQ29tcG9zaXRlX3JlYWQgPSBSZWFkCi1Mb2NrTW9kZUNvbXBvc2l0ZV93cml0ZSA9IFdyaXRlCi1Mb2NrTW9kZUNvbXBvc2l0ZV9vcHRpbWlzdGljID0gT3B0aW1pc3RpYwotTG9ja01vZGVDb21wb3NpdGVfb3B0aW1pc3RpY19mb3JjZV9pbmNyZW1lbnQgPSBPcHRpbWlzdGljIEZvcmNlIEluY3JlbWVudAotTG9ja01vZGVDb21wb3NpdGVfcGVzc2ltaXN0aWNfcmVhZCA9IFBlc3NpbWlzdGljIFJlYWQKLUxvY2tNb2RlQ29tcG9zaXRlX3Blc3NpbWlzdGljX3dyaXRlID0gUGVzc2ltaXN0aWMgV3JpdGUKLUxvY2tNb2RlQ29tcG9zaXRlX3Blc3NpbWlzdGljX2ZvcmNlX2luY3JlbWVudCA9IFBlc3NpbWlzdGljIEZvcmNlIEluY3JlbWVudAotTG9ja01vZGVDb21wb3NpdGVfbm9uZSA9IE5vbmUKLQotVGFyZ2V0Q2xhc3NDb21wb3NpdGVfbGFiZWw9VGFyZ2V0IGNsYXNzOgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfZGV0YWlsc19vcm0ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfZGV0YWlsc19vcm0ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiYjI0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX2RldGFpbHNfb3JtLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQm9vbGVhbl9GYWxzZT1GYWxzZQotQm9vbGVhbl9UcnVlPVRydWUKLUVudGl0eU1hcHBpbmdzU2VjdGlvbl90aXRsZT1FbnRpdHkgTWFwcGluZ3MKLUVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfYWNjZXNzPUFjY2VzczoKLUVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfY2F0YWxvZz1DYXRhbG9nOgotRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9maWVsZD1GaWVsZAotRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9wYWNrYWdlPVBhY2thZ2U6Ci1FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX3Byb3BlcnR5PVByb3BlcnR5Ci1FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX3NjaGVtYT1TY2hlbWE6Ci1FbnRpdHlNYXBwaW5nc1BhZ2VfY2F0YWxvZ0RlZmF1bHQ9RGVmYXVsdCAoezB9Ci1FbnRpdHlNYXBwaW5nc1BhZ2VfY2F0YWxvZ05vRGVmYXVsdFNwZWNpZmllZD1EZWZhdWx0Ci1FbnRpdHlNYXBwaW5nc1BhZ2Vfc2NoZW1hRGVmYXVsdD1EZWZhdWx0ICh7MH0pCi1FbnRpdHlNYXBwaW5nc1BhZ2Vfc2NoZW1hTm9EZWZhdWx0U3BlY2lmaWVkPURlZmF1bHQKLU1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGVfbWV0YWRhdGFDb21wbGV0ZT1NZXRhZGF0YSBjb21wbGV0ZQotTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZV9tZXRhZGF0YUNvbXBsZXRlV2l0aERlZmF1bHQ9TWV0YWRhdGEgY29tcGxldGUgKHswfSkKLU9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZGlzcGxheVN0cmluZz08TmFtZSBub3Qgc2V0PiB7MH0KLU9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZ3JvdXBCb3g9R2VuZXJhdG9ycwotT3JtTWFwcGluZ05hbWVDaG9vc2VyX25hbWU9TmFtZToKLU9ybUphdmFDbGFzc0Nob29zZXJfamF2YUNsYXNzPUphdmEgY2xhc3M6Ci1Pcm1RdWVyaWVzQ29tcG9zaXRlX2dyb3VwQm94PVF1ZXJpZXMKLVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2FjY2Vzcz1BY2Nlc3M6Ci1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9kZWxpbWl0ZWRJZGVudGlmaWVyc0NoZWNrQm94PURlbGltaXRlZCBpZGVudGlmaWVycwotUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfY2FzY2FkZVBlcnNpc3RDaGVja0JveD1DYXNjYWRlIHBlcnNpc3QKLVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2NhdGFsb2c9Q2F0YWxvZzoKLVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2ZpZWxkPUZpZWxkCi1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9wZXJzaXN0ZW5jZVVuaXRTZWN0aW9uPVBlcnNpc3RlbmNlIFVuaXQKLVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3Byb3BlcnR5PVByb3BlcnR5Ci1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9zY2hlbWE9U2NoZW1hOgotUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVDaGVja0JveD1YTUwgbWFwcGluZyBtZXRhZGF0YSBjb21wbGV0ZQotUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uX2NhdGFsb2dEZWZhdWx0PURlZmF1bHQgKHswfSkKLVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhU2VjdGlvbl9zY2hlbWFEZWZhdWx0PURlZmF1bHQgKHswfSkKLQotQWRkR2VuZXJhdG9yRGlhbG9nX25hbWU9TmFtZToKLUFkZEdlbmVyYXRvckRpYWxvZ19nZW5lcmF0b3JUeXBlPVR5cGU6Ci1BZGRHZW5lcmF0b3JEaWFsb2dfdGl0bGU9QWRkIEdlbmVyYXRvcgotQWRkR2VuZXJhdG9yRGlhbG9nX2Rlc2NyaXB0aW9uVGl0bGU9Q3JlYXRlIG5ldyBnZW5lcmF0b3IKLUFkZEdlbmVyYXRvckRpYWxvZ19kZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgZ2VuZXJhdG9yIHNldHRpbmcgYm90aCB0aGUgJ25hbWUnIGFuZCB0aGUgJ3R5cGUnCi1BZGRHZW5lcmF0b3JEaWFsb2dfdGFibGVHZW5lcmF0b3I9VGFibGUgR2VuZXJhdG9yCi1BZGRHZW5lcmF0b3JEaWFsb2dfc2VxdWVuY2VHZW5lcmF0b3I9U2VxdWVuY2UgR2VuZXJhdG9yCi1HZW5lcmF0b3JTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkPUEgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4KLUdlbmVyYXRvclN0YXRlT2JqZWN0X3R5cGVNdXN0QmVTcGVjaWZpZWQ9QSBnZW5lcmF0b3IgdHlwZSBtdXN0IGJlIHNwZWNpZmllZC4KLQotCi1VbnN1cHBvcnRlZE9ybU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPVVuc3VwcG9ydGVkCi0KLVVuc3VwcG9ydGVkT3JtTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPXVuc3VwcG9ydGVkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9lbnRpdHlfZ2VuLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX2VudGl0eV9nZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViMThlYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX2VudGl0eV9nZW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAotCi1jYXJkaW5hbGl0eT1DYXImZGluYWxpdHk6Ci1wcm9wZXJ0eT1QJnJvcGVydHk6Ci1jYXNjYWRlPSZDYXNjYWRlOgotY29ubmVjdGlvbj0mQ29ubmVjdGlvbjoKLXNjaGVtYT0mU2NoZW1hOgotc2NoZW1hSW5mbz0oTm90ZTogWW91IG11c3QgaGF2ZSBhbiBhY3RpdmUgY29ubmVjdGlvbiB0byBzZWxlY3Qgc2NoZW1hLikKLWFkZENvbm5lY3Rpb25MaW5rPUFkZCBjb25uZWN0aW9ucy4uLgotY29ubmVjdExpbms9Q29ubmVjdAotY29ubmVjdGluZ1RvRGF0YWJhc2U9Q29ubmVjdGluZyB0byBkYXRhYmFzZQotbWFueVRvT25lPSZNYW55IHRvIG9uZQotbWFueVRvTWFueT1NYW4meSB0byBtYW55Ci1vbmVUb01hbnk9Jk9uZSB0byBtYW55Ci1vbmVUb09uZT0mT25lIHRvIG9uZQotbWFueVRvT25lRGVzYz1FYWNoICVzIGhhcyBtYW55ICVzLgotb25lVG9PbmVEZXNjPVRoZXJlIGlzIG9uZSAlcyBwZXIgJXMuCi1tYW55VG9NYW55RGVzYz1FYWNoICVzIGhhcyBtYW55ICVzLCBhbmQgZWFjaCAlcyBoYXMgbWFueSAlcy4KLQotYWRkPSZBZGQKLXJlbW92ZT0mUmVtb3ZlCi0KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfZ2VuZXJhdGVFbnRpdGllcz1HZW5lcmF0ZSBDdXN0b20gRW50aXRpZXMKLQotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9zZWxlY3RKUEFQcm9qZWN0PUpQQSBQcm9qZWN0IFNlbGVjdGlvbgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9zZWxlY3RKUEFQcm9qZWN0X21zZz1TZWxlY3QgYSBKUEEgcHJvamVjdC4KLQotR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2Vfc2VsZWN0VGFibGU9U2VsZWN0IFRhYmxlcwotR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfY2hvb3NlRW50aXR5VGFibGU9U2VsZWN0IHRhYmxlcyB0byBnZW5lcmF0ZSBlbnRpdGllcyBmcm9tLgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfdXBkYXRlUGVyc2lzdGVuY2VYbWw9VXBkYXRlIGNsYXNzIGxpc3QgaW4gcGVyc2lzdGVuY2UueG1sCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV90YWJsZXM9JlRhYmxlczoKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX3RhYmxlQ29sdW1uPVRhYmxlCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9SZXN0b3JlX0RlZmF1bHRzPVJlc3RvcmUgRGVmYXVsdHMKLQotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY1BhZ2VfdGl0bGU9VGFibGUgQXNzb2NpYXRpb25zCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV9sYWJlbD1UYWJsZSAmYXNzb2NpYXRpb25zCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV9kZXNjPUVkaXQgYSB0YWJsZSBhc3NvY2lhdGlvbiBieSBzZWxlY3RpbmcgaXQgYW5kIG1vZGlmeWluZyB0aGUgY29udHJvbHMgaW4gdGhlIGVkaXRpbmcgcGFuZWwuCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV9uZXdBc3NvYz1OZXcgQXNzb2NpYXRpb24KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX2RlbEFzc29jPURlbGV0ZSBTZWxlY3RlZCBBc3NvY2lhdGlvbgotCi0KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV90aXRsZT1DdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX3RhYmxlTWFwcGluZz1UYWJsZSBtYXBwaW5nCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfZG9tYWluSmF2YUNsYXNzPURvbWFpbiBqYXZhIGNsYXNzCi0KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9kZXNjPU9wdGlvbmFsbHkgY3VzdG9taXplIGFzcGVjdHMgb2YgZW50aXRpZXMgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBieSBkZWZhdWx0IGZyb20gZGF0YWJhc2UgdGFibGVzLiBBIEphdmEgcGFja2FnZSBzaG91bGQgYmUgc3BlY2lmaWVkLgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2FjY2Vzcz1FbnRpdHkgJmFjY2VzczoKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9mZXRjaD1Bc3NvY2lhdGlvbnMgJmZldGNoOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2NvbGxUeXBlPUNvbGxlY3Rpb24gcHJvcGVydGllcyAmdHlwZToKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9nZW5PcHRpb25hbEFubm90YXRpb25zID0gQWx3YXlzIGdlbmVyYXRlIG9wdGlvbmFsIEpQQSBhbm5vdGF0aW9ucyBhbmQgRERMIHBhcmFtZXRlcnMKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9nZW5PcHRpb25hbEFubm90YXRpb25zX2Rlc2MgPSAgR2VuZXJhdGUgb3B0aW9uYWwgSlBBIGFubm90YXRpb25zIGFuZCBEREwgcGFyYW1ldGVycyBsaWtlICd1bmlxdWUnLCAnbnVsbGFibGUnLCAnbGVuZ3RoJywgJ3ByZWNpc2lvbicgYW5kICdzY2FsZScsIHdoaWNoIGFyZSBvcHRpb25hbCBhbmQgb25seSB1c2VkIGJ5IGF1dG9tYXRpYyB0YWJsZSBjcmVhdGlvbiB0byBzcGVjaWZ5IHRhYmxlIGNyZWF0aW9uIGRhdGEuCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2Vfa2V5R2VuPUtleSAmZ2VuZXJhdG9yOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX3NlcXVlbmNlPVNlcXVlbmNlICZuYW1lOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX3NlcXVlbmNlTm90ZT1Zb3UgY2FuIHVzZSB0aGUgcGF0dGVybnMgJXMgYW5kL29yICVzIGluIHRoZSBzZXF1ZW5jZSBuYW1lLlxuXAotCQkJVGhlc2UgcGF0dGVybnMgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdGFibGUgbmFtZSBhbmQgdGhlIHByaW1hcnkga2V5IFxuXAotCQkJY29sdW1uIG5hbWUgd2hlbiBhIHRhYmxlIG1hcHBpbmcgaXMgZ2VuZXJhdGVkLgotCi0KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVzQW5kQ29sdW1uc1BhZ2VfdGl0bGU9Q3VzdG9taXplIEluZGl2aWR1YWwgRW50aXRpZXMKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVzQW5kQ29sdW1uc1BhZ2VfZGVzYz1DdXN0b21pemUgZGV0YWlsIG9mIGluZGl2aWR1YWwgZW50aXRpZXMgYnkgc2VsZWN0aW5nIHRoZSBhc3NvY2lhdGVkIHRhYmxlcyBvciBjb2x1bW5zIGFuZCBjaGFuZ2luZyB2YWx1ZXMgaW4gdGhlIGVkaXRpbmcgcGFuZWwuCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlc0FuZENvbHVtbnNQYWdlX2xhYmVsVGFibGVBbmRDb2x1bW5zPSZUYWJsZXMgYW5kIGNvbHVtbnMKLQotR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVBhbmVsX2NsYXNzTmFtZT0mQ2xhc3MgbmFtZToKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfZ2VuUHJvcD1HZW5lcmF0ZSB0aGlzIHByb3BlcnR5Ci1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX2NvbE1hcHBpbmc9Q29sdW1uIG1hcHBpbmcKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfcHJvcE5hbWU9UHJvcGVydHkgJm5hbWU6Ci1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX3Byb3BUeXBlPU1hcHBpbmcgdCZ5cGU6Ci1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX21hcEtpbmQ9TWFwcGluZyAma2luZDoKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfYmVhblByb3A9RG9tYWluIEphdmEgQ2xhc3MKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfZ2V0dGVyU2NvcGU9R2V0dGVyIHNjb3BlOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9zZXR0ZXJTY29wZT1TZXR0ZXIgc2NvcGU6Ci1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX2NvbFVwZGF0ZWFibGU9Q29sdW1uIGlzICZ1cGRhdGFibGUKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfY29sSW5zZXJ0YWJsZT1Db2x1bW4gaXMgJmluc2VydGFibGUKLQotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190aXRsZT1DcmVhdGUgTmV3IEFzc29jaWF0aW9uCi0KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV90aXRsZT1Bc3NvY2lhdGlvbiBUYWJsZXMKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9kZXNjPVNwZWNpZnkgdGhlIGFzc29jaWF0aW9uIHRhYmxlcy4KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9hc3NvY0tpbmQ9QXNzb2NpYXRpb24ga2luZAotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2Fzc29jVGFibGVzPUFzc29jaWF0aW9uICZ0YWJsZXM6Ci1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfdGFibGUxPVRhYmxlICYxOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX3RhYmxlMj1UYWJsZSAmMjoKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9pbnRlcm1lZGlhdGVUYWJsZT1Kb2luIHRhYmxlOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX3NpbXBsZUFzc29jPSZTaW1wbGUgYXNzb2NpYXRpb24KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9tMm1Bc3NvYz0mTWFueSB0byBtYW55IGFzc29jaWF0aW9uCi0KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY2FyZGluYWxpdHlQYWdlX3RpdGxlPUFzc29jaWF0aW9uIENhcmRpbmFsaXR5Ci1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX2NhcmRpbmFsaXR5UGFnZV9kZXNjPVNwZWNpZnkgdGhlIGFzc29jaWF0aW9uIGNhcmRpbmFsaXR5LgotCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX2NvbHNQYWdlX3RpdGxlPUpvaW4gQ29sdW1ucwotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV9kZXNjPVNwZWNpZnkgdGhlIGpvaW4gY29sdW1ucy4KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfbGFiZWw9U3BlY2lmeSB0aGUgam9pbiBjb2x1bW5zIGJldHdlZW4gdGhlICVzIGFuZCAlcyB0YWJsZXM6Ci0KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3JfZW50aXR5UmVmPUdlbmVyYXRlIGEgcmVmZXJlbmNlIHRvICVzIGluICVzCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX3NldFJlZj1HZW5lcmF0ZSBhIHJlZmVyZW5jZSB0byBhIGNvbGxlY3Rpb24gb2YgJXMgaW4gJXMKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3JfdGFibGVKb2luPVRhYmxlICZqb2luOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9qb2luZWRXaGVuPVRoZSB0YWJsZSByb3dzIGFyZSBqb2luZWQgd2hlbjpcbiVzCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX2dlbkFzc29jPUdlbmVyYXRlICZ0aGlzIGFzc29jaWF0aW9uCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RvTm90U2hvd1dhcm5pbmcgPSBEb24ndCBzaG93IG1lIHRoaXMgd2FybmluZyBhZ2FpbgotCi1zZWxlY3RDYXNjYWRlRGxnVGl0bGU9U2VsZWN0IENhc2NhZGUKLXNlbGVjdFRhYmxlRGxnVGl0bGU9VGFibGUgU2VsZWN0aW9uCi1zZWxlY3RUYWJsZURsZ0Rlc2M9JlNlbGVjdCBhIHRhYmxlOgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9lbnRpdHlfd2l6YXJkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX2VudGl0eV93aXphcmQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0ZjM4NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX2VudGl0eV93aXphcmQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBEaW1pdGVyIERpbWl0cm92LCBkLmRpbWl0cm92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotRU5USVRZX1dJWkFSRF9USVRMRT1OZXcgSlBBIEVudGl0eQotRU5USVRZX1dJWkFSRF9QQUdFX1RJVExFPUVudGl0eSBjbGFzcwotRU5USVRZX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OPUNyZWF0ZSBhIG5ldyBKUEEgZW50aXR5LiBPbmx5IEpQQSBlbmFibGVkIHByb2plY3RzIG1heSBiZSBzZWxlY3RlZC4KLURFRkFVTFRfUEFDS0FHRV9XQVJOSU5HPVRoZSB1c2FnZSBvZiB0aGUgZGVmYXVsdCBwYWNrYWdlIGlzIG5vdCByZWNvbW1lbmRlZC4KLUVOVElUWV9QUk9QRVJUSUVTX1RJVExFPUVudGl0eSBQcm9wZXJ0aWVzCi1FTlRJVFlfUFJPUEVSVElFU19ERVNDUklQVElPTj1TZXQgZW50aXR5IG5hbWUsIHRhYmxlIG5hbWUsIGZpZWxkcywgYW5kIGFjY2VzcyB0eXBlLgotRU5USVRZPUVudGl0JnkKLU1BUFBFRF9BU19TVVBFUkNMQVNTPU1hcHBlZCBzdXBlciZjbGFzcwotSU5IRVJJVEFOQ0VfR1JPVVA9SW5oZXJpdGFuY2UKLUlOSEVSSVRBTkNFX0NIRUNLX0JPWD0mSW5oZXJpdGFuY2U6Ci1YTUxfU1RPUkFHRV9HUk9VUD1YTUwgZW50aXR5IG1hcHBpbmdzCi1YTUxfU1VQUE9SVD1BZGQgdG8gZW50aXR5IG1hcHBpbmdzIGluICZYTUwKLUNIT09TRV9YTUw9TSZhcHBpbmcgZmlsZToKLU1BUFBJTkdfWE1MX1RJVExFPU1hcHBpbmcgRmlsZQotWE1MX05BTUVfVElUTEU9WE1MIG5hbWU6Ci1DSE9PU0VfTUFQUElOR19YTUxfTUVTU0FHRT1DaG9vc2UgbWFwcGluZyBYTUwKLUlOVkFMSURfWE1MX05BTUU9VGhlIG1hcHBpbmcgZmlsZSBkb2VzIG5vdCBleGlzdAotVFlQRV9ESUFMT0dfVElUTEU9Q2hvb3NlIFR5cGUKLVRZUEVfRElBTE9HX0RFU0NSSVBUSU9OPUNob29zZSB0aGUgdHlwZSBvZiB0aGUgZW50aXR5IGZpZWxkLgotRU5USVRZX05BTUU9RW50aXR5IG5hJm1lOgotVEFCTEVfTkFNRV9HUk9VUD1UYWJsZSBuYW1lCi1UQUJMRV9OQU1FPSZUYWJsZSBuYW1lOgotVVNFX0RFRkFVTFQ9JlVzZSBkZWZhdWx0Ci1FTlRJVFlfRklFTERTX0dST1VQPUVudGl0eSBmaWVsZCZzCi1FTlRJVFlfRklFTERTX0RJQUxPR19USVRMRT1FbnRpdHkgRmllbGRzCi1LRVk9S2V5Ci1OQU1FX0NPTFVNTj1OYW1lCi1UWVBFX0NPTFVNTj1UeXBlCi1OQU1FX1RFWFRfRklFTEQ9TmEmbWU6Ci1UWVBFX1RFWFRfRklFTEQ9JlR5cGU6Ci1CUk9XU0VfQlVUVE9OX0xBQkVMPUImcm93c2UuLi4KLUFERF9CVVRUT05fTEFCRUw9JkFkZC4uLgotRURJVF9CVVRUT05fTEFCRUw9JkVkaXQuLi4KLVJFTU9WRV9CVVRUT05fTEFCRUw9JlJlbW92ZQotRFVQTElDQVRFRF9FTlRJVFlfTkFNRVNfTUVTU0FHRT1UaGVyZSBhcmUgZHVwbGljYXRlIG5hbWVzIG9uIGNyZWF0ZWQgZW50aXR5IGZpZWxkcy4gUGxlYXNlIHJlc29sdmUgdGhlIGR1cGxpY2F0aW9uLgotQUNDRVNTX1RZUEU9QWNjZXNzIHR5cGUKLUZJRUxEX0JBU0VEPUZpZWwmZAotUFJPUEVSVFlfQkFTRUQ9JlByb3BlcnR5Ci1OT19KUEFfUFJPSkVDVFM9Tm8gSlBBIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UKLUFQUExZX0NIQU5HRVNfVE9fUEVSU0lTVEVOQ0VfWE1MPUFwcGx5IGNoYW5nZXMgdG8gcGVyc2lzdGVuY2UgWE1MCi1BRERfTUFQUEVEX1NVUEVSQ0xBU1NfVE9fWE1MPUFkZCBtYXBwZWQgc3VwZXJjbGFzcyB0byBYTUwKLUFERF9FTlRJVFlfVE9fWE1MPUFkZCBlbnRpdHkgdG8gWE1MCi1FbnRpdHlEYXRhTW9kZWxQcm92aWRlcl90eXBlTm90SW5Qcm9qZWN0Q2xhc3NwYXRoPScnezB9JycgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHByb2plY3QgY2xhc3NwYXRoCi1FbnRpdHlEYXRhTW9kZWxQcm92aWRlcl9pbnZhbGlkUEtUeXBlPScnezB9JycgaXMgbm90IGEgdmFsaWQgc2ltcGxlIHByaW1hcnkga2V5IHR5cGUKLUVudGl0eURhdGFNb2RlbFByb3ZpZGVyX2ludmFsaWRBcmd1bWVudD1JbnZhbGlkIGFyZ3VtZW50ICcnezB9JycKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfcGVyc2lzdGVuY2UucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfcGVyc2lzdGVuY2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlMDczNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX3BlcnNpc3RlbmNlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQm9vbGVhbl9GYWxzZT1GYWxzZQotQm9vbGVhbl9UcnVlPVRydWUKLQotQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2dfamFyUGF0aEhlbHBMYWJlbD1UaGUgY29ycmVjdCBwYXRoIHRvIHRoZSBKQVIgZmlsZSBzZWxlY3RlZCB3aWxsIHZhcnkgb24geW91ciBydW50aW1lIGVudmlyb25tZW50LiAgWW91IG1heSBhbHRlciBpdCBoZXJlIHRvIGNvcnJlY3RseSByZWZsZWN0IHlvdXIgcGFydGljdWxhciBlbnZpcm9ubWVudC4KLUFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nX2phclBhdGhMYWJlbD1KQVIgZmlsZSBwYXRoOgotCi1QZXJzaXN0ZW5jZUVkaXRvcl9wYWdlX2hlbHA9SGVscAotUGVyc2lzdGVuY2VFZGl0b3Jfc291cmNlVGFiPVNvdXJjZQotCi1QZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX2Rlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIGxpc3Qgb2YgY2xhc3NlcyB0byBiZSBtYW5hZ2VkIGluIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KLVBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlcz1FeGNsdWRlIHVubGlzdGVkIGNsYXNzZXMKLVBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlc1dpdGhEZWZhdWx0PUV4Y2x1ZGUgdW5saXN0ZWQgY2xhc3NlcyAoezB9KQotUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9tYXBwZWRDbGFzc2VzTm9OYW1lPTxuYW1lIG5vdCBzZXQ+Ci1QZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX29wZW49T3BlbgotCi1QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZV9kZWZhdWx0PURlZmF1bHQoSlRBKQotUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGVfanRhPUpUQQotUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGVfcmVzb3VyY2VfbG9jYWw9UmVzb3VyY2UgTG9jYWwKLQotUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZV9jb25uZWN0aW9uPUNvbm5lY3Rpb24KLVBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGVfZGF0YWJhc2U9RGF0YWJhc2UKLVBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGVfZ2VuZXJhbD1HZW5lcmFsCi0KLVBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZV9qdGFEYXRhc291cmNlTmFtZT1KVEEgZGF0YSBzb3VyY2UgbmFtZToKLVBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZV9ub25KdGFEYXRhc291cmNlTmFtZT1Ob24tSlRBIGRhdGEgc291cmNlIG5hbWU6Ci0KLVBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX3RyYW5zYWN0aW9uVHlwZT1UcmFuc2FjdGlvbiB0eXBlOgotCi1QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2dlbmVyYWw9R2VuZXJhbAotUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qYXJGaWxlcz1KQVIgRmlsZXMKLVBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfanBhTWFwcGluZ0Rlc2NyaXB0b3JzPVhNTCBNYXBwaW5nIEZpbGVzCi1QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2pwYU1hcHBpbmdEZXNjcmlwdG9yc19kZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBYTUwgbWFwcGluZyBmaWxlcyBmb3IgdGhpcyBwZXJzaXN0ZW5jZSB1bml0LgotUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9tYXBwZWRDbGFzc2VzPU1hbmFnZWQgQ2xhc3NlcwotUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9uYW1lPU5hbWU6Ci1QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX3BlcnNpc3RlbmNlUHJvdmlkZXI9UGVyc2lzdGVuY2UgcHJvdmlkZXI6Ci1QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2Rlc2NyaXB0aW9uPURlc2NyaXB0aW9uOgotCi1QZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZV9ub0ZpbGVOYW1lPTxGaWxlIG5hbWUgbm90IHNldD4KLVBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9qYXJGaWxlRGlhbG9nX3RpdGxlPUpBUiBGaWxlIFNlbGVjdGlvbgotUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX2phckZpbGVEaWFsb2dfbWVzc2FnZT1DaG9vc2UgYSBKQVIgZmlsZSB0byBiZSBhZGRlZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQotUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX21hcHBpbmdGaWxlRGlhbG9nX21lc3NhZ2U9Q2hvb3NlIHRoZSBYTUwgbWFwcGluZyBmaWxlcyB0byBiZSBhZGRlZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLVBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9tYXBwaW5nRmlsZURpYWxvZ190aXRsZT1KUEEgWE1MIE1hcHBpbmcgRmlsZSBTZWxlY3Rpb24KLVBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9vcm1Ob05hbWU9PG5hbWUgbm90IHNldD4KLQotUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZV9uYW1lQ29sdW1uPU5hbWUKLVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGVfcHJvcGVydGllcz1Qcm9wZXJ0aWVzCi1QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlX3Byb3BlcnRpZXNfZGVzY3JpcHRpb249VGhpcyB0YWJsZSBsaXN0cyBhbGwgcHJvcGVydGllcyB0aGF0IGFyZSBkZWZpbmVkIGZvciB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCi1QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlX3ZhbHVlQ29sdW1uPVZhbHVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9wZXJzaXN0ZW5jZTJfMC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9wZXJzaXN0ZW5jZTJfMC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWE0NDA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfcGVyc2lzdGVuY2UyXzAucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Db25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9EYXRhYmFzZV9Hcm91cEJveCA9IERhdGFiYXNlCi0KLURhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlX2p0YURhdGFTb3VyY2VMYWJlbCA9IEpUQSBkYXRhIHNvdXJjZToKLURhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlX25vbkp0YURhdGFTb3VyY2VMYWJlbCA9IE5vbi1KVEEgZGF0YSBzb3VyY2U6Ci0KLUdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uQ29tcG9zaXRlX3NlY3Rpb25UaXRsZSA9IFBlcnNpc3RlbmNlIFVuaXQgQ29ubmVjdGlvbgotR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25Db21wb3NpdGVfc2VjdGlvbkRlc2NyaXB0aW9uID0gQ29uZmlndXJlIHRoZSBkYXRhIHNvdXJjZSBvciBKREJDIGNvbm5lY3Rpb24gcHJvcGVydGllcy4KLQotSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0Nvbm5lY3Rpb25EaWFsb2dfTWVzc2FnZSA9ICZFbnRlciBjb25uZWN0aW9uIG5hbWUgb3IgcGF0dGVybiAoKiwgPywgb3IgY2FtZWwgY2FzZSk6Ci1KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19UaXRsZSA9IENvbm5lY3Rpb24gU2VsZWN0aW9uCi1HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvblRhYl90aXRsZSA9IENvbm5lY3Rpb24KLQotR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNDb21wb3NpdGVfbWlzY2VsbGFuZW91c1NlY3Rpb25UaXRsZSA9IE1pc2NlbGxhbmVvdXMgT3B0aW9ucwotR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNDb21wb3NpdGVfbWlzY2VsbGFuZW91c1NlY3Rpb25EZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSB0aGUgbWlzY2VsbGFuZW91cyBvcHRpb25zLgotR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNUYWJfdGl0bGUgPSBPcHRpb25zCi1HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYl9ub05hbWUgPSA8bmFtZSBub3Qgc2V0PgotCi1KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfcG9wdWxhdGVGcm9tQ29ubmVjdGlvbkh5cGVyTGluayA9CVBvcHVsYXRlIGZyb20gY29ubmVjdGlvbi4uLgotSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX2RyaXZlckxhYmVsID0gRHJpdmVyOgotSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3VybExhYmVsID0gVVJMOgotSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3VzZXJMYWJlbCA9IFVzZXI6Ci1KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfcGFzc3dvcmRMYWJlbCA9IFBhc3N3b3JkOgotCi1KZGJjUHJvcGVydGllc0NvbXBvc2l0ZV9KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNfR3JvdXBCb3ggPSBKREJDIGNvbm5lY3Rpb24gcHJvcGVydGllcwotCi1Mb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9sb2NrVGltZW91dExhYmVsID0gTG9jayB0aW1lb3V0OgotUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlX3F1ZXJ5VGltZW91dExhYmVsID0gUXVlcnkgdGltZW91dDoKLQotVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlX3RyYW5zYWN0aW9uVHlwZUxhYmVsID0gVHJhbnNhY3Rpb24gdHlwZToKLQotVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlX2p0YSA9IEpUQQotVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlX3Jlc291cmNlX2xvY2FsID0gUmVzb3VyY2UgTG9jYWwKLQotU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX3NoYXJlZENhY2hlTW9kZUxhYmVsID0gU2hhcmVkIGNhY2hlIG1vZGU6Ci0KLVNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZV9hbGwgPSBBbGwKLVNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZV9ub25lID0gTm9uZQotU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX2VuYWJsZV9zZWxlY3RpdmUgPSBFbmFibGUgU2VsZWN0aXZlCi1TaGFyZWRDYWNoZU1vZGVDb21wb3NpdGVfZGlzYWJsZV9zZWxlY3RpdmUgPSBEaXNhYmxlIFNlbGVjdGl2ZQotU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX3Vuc3BlY2lmaWVkID0gVW5zcGVjaWZpZWQKLQotVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfdmFsaWRhdGlvbk1vZGVMYWJlbCA9IFZhbGlkYXRpb24gbW9kZToKLQotVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfYXV0byA9IEF1dG8KLVZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlX2NhbGxiYWNrID0gQ2FsbGJhY2sKLVZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlX25vbmUgPSBOb25lCi0KLVZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlUGVyc2lzdExhYmVsID0gVmFsaWRhdGUgcHJlLXBlcnNpc3QgZ3JvdXA6Ci1WYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9ncm91cFByZVVwZGF0ZUxhYmVsID0gVmFsaWRhdGUgcHJlLXVwZGF0ZSBncm91cDoKLVZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlUmVtb3ZlTGFiZWwgPSBWYWxpZGF0ZSBwcmUtcmVtb3ZlIGdyb3VwOgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV92YWxpZGF0aW9uX3ByZWZlcmVuY2VzLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX3ZhbGlkYXRpb25fcHJlZmVyZW5jZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxZGE0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX3ZhbGlkYXRpb25fcHJlZmVyZW5jZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVBST0pFQ1RfTEVWRUxfQ0FURUdPUlk9UHJvamVjdAotCi1OT19KUEFfUFJPSkVDVD1Qcm9qZWN0IGhhcyBKUEEgZmFjZXQsIGJ1dCBKUEEgcHJvamVjdCBjb3VsZG4ndCBiZSBjcmVhdGVkOgotUFJPSkVDVF9OT19DT05ORUNUSU9OPU5vIGNvbm5lY3Rpb24gc3BlY2lmaWVkIGZvciBwcm9qZWN0OgotUFJPSkVDVF9JTlZBTElEX0NPTk5FQ1RJT049Q29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdDoKLVBST0pFQ1RfSU5BQ1RJVkVfQ09OTkVDVElPTj1Db25uZWN0aW9uIGlzIG5vdCBhY3RpdmU6Ci1QUk9KRUNUX05PX1BFUlNJU1RFTkNFX1hNTD1ObyBwZXJzaXN0ZW5jZS54bWwgZmlsZSBmb3VuZCBpbiBwcm9qZWN0OgotUFJPSkVDVF9NVUxUSVBMRV9QRVJTSVNURU5DRV9YTUw9TXVsdGlwbGUgcGVyc2lzdGVuY2UueG1sIGZpbGVzIGluIHByb2plY3Q6Ci0KLVhNTF9WRVJTSU9OX05PVF9MQVRFU1Q9WE1MIGRvY3VtZW50IHZlcnNpb24gbm90IG1vc3QgcmVjZW50OgotCi1QRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklUPU5vIHBlcnNpc3RlbmNlIHVuaXQgZGVmaW5lZDoKLVBFUlNJU1RFTkNFX01VTFRJUExFX1BFUlNJU1RFTkNFX1VOSVRTPU11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzIGRlZmluZWQ6Ci1QRVJTSVNURU5DRV9YTUxfSU5WQUxJRF9DT05URU5UPUludmFsaWQgY29udGVudCAobm8gcm9vdCBub2RlKToKLQotUEVSU0lTVEVOQ0VfVU5JVF9MRVZFTF9DQVRFR09SWT1QZXJzaXN0ZW5jZSB1bml0Ci0KLVBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfTUFQUElOR19GSUxFPVVuc3BlY2lmaWVkIG1hcHBpbmcgZmlsZToKLVBFUlNJU1RFTkNFX1VOSVRfVU5TVVBQT1JURURfTUFQUElOR19GSUxFX0NPTlRFTlQ9TWFwcGluZyBmaWxlIGRvZXMgbm90IGhhdmUgc3VwcG9ydGVkIGNvbnRlbnQ6Ci1QRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX01BUFBJTkdfRklMRT1NYXBwaW5nIGZpbGUgY2Fubm90IGJlIHJlc29sdmVkOgotUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX01BUFBJTkdfRklMRT1NYXBwaW5nIGZpbGUgZG9lcyBub3QgaGF2ZSBPUk0gY29udGVudDoKLVBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX01BUFBJTkdfRklMRT1EdXBsaWNhdGUgbWFwcGluZyBmaWxlOgotUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9DTEFTUz1VbnNwZWNpZmllZCBjbGFzczoKLVBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfQ0xBU1M9Q2xhc3MgY2Fubm90IGJlIHJlc29sdmVkOgotUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX0NMQVNTPUNsYXNzIGlzIGluY2x1ZGVkIGluIGEgcGVyc2lzdGVuY2UgdW5pdCBidXQgaXMgbm90IG1hcHBlZDoKLVBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0NMQVNTPUR1cGxpY2F0ZSBjbGFzczoKLVBFUlNJU1RFTkNFX1VOSVRfUkVEVU5EQU5UX0NMQVNTPUNsYXNzIGlzIGFscmVhZHkgc3BlY2lmaWVkIGluIG1hcHBpbmcgZmlsZToKLVBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0pBUl9GSUxFPUR1cGxpY2F0ZSBKQVIgZmlsZToKLVBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfSkFSX0ZJTEU9VW5zcGVjaWZpZWQgSkFSIGZpbGU6Ci1QRVJTSVNURU5DRV9VTklUX0pBUl9GSUxFX0RFUExPWU1FTlRfUEFUSF9XQVJOSU5HPVRoZSBwYXRoIHRvIHRoZSBKQVIgZmlsZSB3aWxsIHZhcnk6Ci1QRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX0pBUl9GSUxFPUpBUiBmaWxlIGNhbm5vdCBiZSByZXNvbHZlZDoKLU1BUFBJTkdfRklMRV9FWFRSQU5FT1VTX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM9RXh0cmFuZW91cyBwZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzIGZvdW5kOgotUEVSU0lTVEVOVF9UWVBFX01BUFBFRF9CVVRfTk9UX0lOQ0xVREVEX0lOX1BFUlNJU1RFTkNFX1VOSVQ9Q2xhc3MgaXMgbWFwcGVkLCBidXQgaXMgbm90IGluIGEgcGVyc2lzdGVuY2UgdW5pdDoKLVBFUlNJU1RFTlRfVFlQRV9BTk5PVEFURURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklUPUNsYXNzIGlzIGFubm90YXRlZCwgYnV0IGlzIG5vdCBpbiBhIHBlcnNpc3RlbmNlIHVuaXQ6Ci0KLVRZUEVfTEVWRUxfQ0FURUdPUlk9VHlwZQotCi1QRVJTSVNURU5UX1RZUEVfVU5TUEVDSUZJRURfQ0xBU1M9Q2xhc3MgaXMgdW5zcGVjaWZpZWQgaW4gb3JtLnhtbDoKLVBFUlNJU1RFTlRfVFlQRV9VTlJFU09MVkVEX0NMQVNTPUNsYXNzIGluIG9ybS54bWwgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgamF2YSBjbGFzczoKLUVOVElUWV9OT19QSz1FbnRpdHkgaGFzIG5vIHByaW1hcnkga2V5OgotRU5USVRZX1NJTkdMRV9UQUJMRV9ERVNDRU5EQU5UX0RFRklORVNfVEFCTEU9Tm8gdGFibGUgc2hvdWxkIGJlIGRlZmluZWQgZm9yIG5vbi1yb290IGVudGl0eSB1c2luZyBzaW5nbGUtdGFibGUgaW5oZXJpdGFuY2U6Ci1FTlRJVFlfQUJTVFJBQ1RfVEFCTEVfUEVSX0NMQVNTX0RFRklORVNfVEFCTEU9Tm8gdGFibGUgc2hvdWxkIGJlIGRlZmluZWQgZm9yIGFic3RyYWN0IGVudGl0eSB1c2luZyB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2U6Ci1FTlRJVFlfQUJTVFJBQ1RfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVEPU5vIGRpc2NyaW1pbmF0b3IgdmFsdWUgc2hvdWxkIGJlIGRlZmluZWQgZm9yIGFic3RyYWN0IGVudGl0eToKLUVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVEPU5vIGRpc2NyaW1pbmF0b3IgdmFsdWUgc2hvdWxkIGJlIGRlZmluZWQgZm9yIGVudGl0eSB1c2luZyB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2U6Ci1FTlRJVFlfTk9OX1JPT1RfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRD1ObyBkaXNjcmltaW5hdG9yIGNvbHVtbiBzaG91bGQgYmUgZGVmaW5lZCBmb3Igbm9uLXJvb3QgZW50aXR5OgotRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVEPU5vIGRpc2NyaW1pbmF0b3IgY29sdW1uIHNob3VsZCBiZSBkZWZpbmVkIGZvciBlbnRpdHkgdXNpbmcgdGFibGUtcGVyLWNvbmNyZXRlLWNsYXNzIGluaGVyaXRhbmNlOgotVFlQRV9NQVBQSU5HX0ZJTkFMX0NMQVNTPU1hcHBlZCBKYXZhIGNsYXNzIGlzIGZpbmFsOgotVFlQRV9NQVBQSU5HX01FTUJFUl9DTEFTUz1NYXBwZWQgSmF2YSBjbGFzcyBpcyBhIG1lbWJlciBjbGFzczoKLVRZUEVfTUFQUElOR19DTEFTU19NSVNTSU5HX05PX0FSR19DT05TVFJVQ1RPUj1NYXBwZWQgSmF2YSBjbGFzcyBoYXMgbm8gbm8tYXJnIGNvbnN0cnVjdG9yOgotVFlQRV9NQVBQSU5HX0NMQVNTX1BSSVZBVEVfTk9fQVJHX0NPTlNUUlVDVE9SPU1hcHBlZCBKYXZhIGNsYXNzIGhhcyBhIHByaXZhdGUgbm8tYXJnIGNvbnN0cnVjdG9yOgotCi1BVFRSSUJVVEVfTEVWRUxfQ0FURUdPUlk9QXR0cmlidXRlCi0KLVBFUlNJU1RFTlRfQVRUUklCVVRFX1VOU1BFQ0lGSUVEX05BTUU9QXR0cmlidXRlIGluIG9ybS54bWwgaGFzIHVuc3BlY2lmaWVkIG5hbWU6Ci1QRVJTSVNURU5UX0FUVFJJQlVURV9VTlJFU09MVkVEX05BTUU9QXR0cmlidXRlIGluIG9ybS54bWwgY2Fubm90IGJlIHJlc29sdmVkIGluIHRoZSBqYXZhIGNsYXNzOgotUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5IRVJJVEVEX0FUVFJJQlVURVNfTk9UX1NVUFBPUlRFRD1JbiBvcm0ueG1sIHJlZmVyZW5jZWQgaW5oZXJpdGVkIGF0dHJpYnV0ZSBtYXkgbm90IGJlIHN1cHBvcnRlZDoKLVBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfTUFQUElORz1BdHRyaWJ1dGUgaGFzIGludmFsaWQgbWFwcGluZyB0eXBlOgotUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfRklFTEQ9VGhlIGphdmEgZmllbGQgZm9yIGF0dHJpYnV0ZSBpcyBmaW5hbDoKLVBFUlNJU1RFTlRfQVRUUklCVVRFX0ZJTkFMX0dFVFRFUj1UaGUgamF2YSBnZXR0ZXIgZm9yIGF0dHJpYnV0ZSBpcyBmaW5hbDoKLVBFUlNJU1RFTlRfQVRUUklCVVRFX1BVQkxJQ19GSUVMRD1UaGUgamF2YSBmaWVsZCBmb3IgYXR0cmlidXRlIGlzIHB1YmxpYzoKLU1BUFBJTkdfVU5SRVNPTFZFRF9NQVBQRURfQlk9Q2Fubm90IHJlc29sdmUgYXR0cmlidXRlIG5hbWU6Ci1NQVBQSU5HX0lOVkFMSURfTUFQUEVEX0JZPUF0dHJpYnV0ZSBoYXMgaW52YWxpZCBtYXBwaW5nIGZvciB0aGlzIHJlbGF0aW9uc2hpcDoKLU1BUFBJTkdfTUFQUEVEX0JZX1dJVEhfSk9JTl9UQUJMRT1DYW5ub3Qgc3BlY2lmeSBqb2luIHRhYmxlIGlmIGF0dHJpYnV0ZSBpcyBtYXBwZWQgYnkgYW5vdGhlciBhdHRyaWJ1dGU6Ci1NQVBQSU5HX01BUFBFRF9CWV9PTl9CT1RIX1NJREVTPVJlbGF0aW9uc2hpcCBtdXN0IGhhdmUgYW4gb3duZXI6Ci1UQVJHRVRfRU5USVRZX05PVF9ERUZJTkVEPVRhcmdldCBlbnRpdHkgaXMgbm90IGRlZmluZWQ6Ci1UQVJHRVRfRU5USVRZX0lTX05PVF9BTl9FTlRJVFk9VGFyZ2V0IGVudGl0eSBpcyBub3QgYW4gRW50aXR5OgotTUFQU19JRF9WQUxVRV9OT1RfU1BFQ0lGSUVEPSJNYXBzIElEIiBhdHRyaWJ1dGUgdmFsdWUgbm90IHNwZWNpZmllZDoKLU1BUFNfSURfVkFMVUVfTk9UX1JFU09MVkVEPSJNYXBzIElEIiBhdHRyaWJ1dGUgdmFsdWUgbm90IHJlc29sdmVkOgotTUFQU19JRF9WQUxVRV9JTlZBTElEPSJNYXBzIElEIiBhdHRyaWJ1dGUgdmFsdWUgaW52YWxpZDoKLU9SREVSX0NPTFVNTl9BTkRfT1JERVJfQllfQk9USF9TUEVDSUZJRUQ9T3JkZXJDb2x1bW4gYW5kIE9yZGVyQnkgYW5ub3RhdGlvbnMgYXJlIGJvdGggc3BlY2lmaWVkOgotRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19OT1RfREVGSU5FRD1FbGVtZW50IGNvbGxlY3Rpb24gdGFyZ2V0IGNsYXNzIG5vdCBkZWZpbmVkOgotRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19NVVNUX0JFX0VNQkVEREFCTEVfT1JfQkFTSUNfVFlQRT1FbGVtZW50IGNvbGxlY3Rpb24gdGFyZ2V0IGNsYXNzIGlzIG5vdCBlbWJlZGRhYmxlIG9yIGJhc2ljIHR5cGU6Ci1FTEVNRU5UX0NPTExFQ1RJT05fTUFQX0tFWV9DTEFTU19OT1RfREVGSU5FRD1FbGVtZW50IGNvbGxlY3Rpb24gbWFwIGtleSBjbGFzcyBub3QgZGVmaW5lZDoKLQotREFUQUJBU0VfQ0FURUdPUlk9RGF0YWJhc2UKLVRBQkxFX0NBVEVHT1JZPVRhYmxlCi0KLVRBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRz1DYXRhbG9nIGNhbm5vdCBiZSByZXNvbHZlZCBmb3IgdGFibGU6Ci1UQUJMRV9VTlJFU09MVkVEX1NDSEVNQT1TY2hlbWEgY2Fubm90IGJlIHJlc29sdmVkIGZvciB0YWJsZToKLVRBQkxFX1VOUkVTT0xWRURfTkFNRT1UYWJsZSBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1TRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HPUNhdGFsb2cgY2Fubm90IGJlIHJlc29sdmVkIGZvciBzZWNvbmRhcnkgdGFibGU6Ci1TRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE9U2NoZW1hIGNhbm5vdCBiZSByZXNvbHZlZCBmb3Igc2Vjb25kYXJ5IHRhYmxlOgotU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfTkFNRT1TZWNvbmRhcnkgdGFibGUgY2Fubm90IGJlIHJlc29sdmVkOgotSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0c9Q2F0YWxvZyBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIGpvaW4gdGFibGU6Ci1KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BPVNjaGVtYSBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIGpvaW4gdGFibGU6Ci1KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRT1Kb2luIHRhYmxlIGNhbm5vdCBiZSByZXNvbHZlZDoKLVZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbXBsaWVkIHNlY29uZGFyeSB0YWJsZSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX1NFQ09OREFSWV9UQUJMRV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU9SW1wbGllZCBzZWNvbmRhcnkgdGFibGUgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX1NFQ09OREFSWV9UQUJMRV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1JbXBsaWVkIHNlY29uZGFyeSB0YWJsZSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLVZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TPUltcGxpZWQgc2Vjb25kYXJ5IHRhYmxlIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGVzOgotQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0c9Q2F0YWxvZyBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIGNvbGxlY3Rpb24gdGFibGU6Ci1DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BPVNjaGVtYSBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIGNvbGxlY3Rpb24gdGFibGU6Ci1DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfTkFNRT1Db2xsZWN0aW9uIHRhYmxlIGNhbm5vdCBiZSByZXNvbHZlZDoKLQotQ09MVU1OX0NBVEVHT1JZPUNvbHVtbgotCi1DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRT1UYWJsZSBmb3IgY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKLUNPTFVNTl9VTlJFU09MVkVEX05BTUU9Q29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKLUNPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9VGFibGUgZm9yIGNvbHVtbiBub3QgdmFsaWQgZ2l2ZW4gdGhlIGNvbnRleHQ6Ci1KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9VGFibGUgZm9yIGpvaW4gY29sdW1uIGlzIG5vdCB2YWxpZDoKLUpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1Kb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1Kb2luIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLUpPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRT1SZWZlcmVuY2VkIGNvbHVtbiBpbiBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1Kb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLUlOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPVRhYmxlIGZvciBpbnZlcnNlIGpvaW4gY29sdW1uIGlzIG5vdCB2YWxpZDoKLUlOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUludmVyc2Ugam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1JbnZlcnNlIGpvaW4gY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGVzOgotSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU9UmVmZXJlbmNlZCBjb2x1bW4gaW4gaW52ZXJzZSBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TPUludmVyc2Ugam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9UHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FPVJlZmVyZW5jZWQgY29sdW1uIGluIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKLVBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TPVByaW1hcnkga2V5IGpvaW4gY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGVzOgotUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9UHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1NQVBfS0VZX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9VGFibGUgZm9yIG1hcCBrZXkgY29sdW1uIGlzIG5vdCB2YWxpZDoKLU9SREVSX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9T3JkZXIgY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKLVZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUltcGxpZWQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1JbXBsaWVkIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGVzOgotVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU9SW1wbGllZCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGNhbm5vdCBiZSByZXNvbHZlZDoKLVZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9SW1wbGllZCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLQotT1ZFUlJJREVTX0NBVEVHT1JZPUF0dHJpYnV0ZS9hc3NvY2lhdGlvbiBvdmVycmlkZXMKLUlNUExJRURfQVRUUklCVVRFX0xFVkVMX0NBVEVHT1JZPUltcGxpZWQgYXR0cmlidXRlcwotCi1BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FPUF0dHJpYnV0ZSBvdmVycmlkZSBuYW1lIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhbiBhdHRyaWJ1dGUKLUFTU09DSUFUSU9OX09WRVJSSURFX0lOVkFMSURfTkFNRT1Bc3NvY2lhdGlvbiBvdmVycmlkZSBuYW1lIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhbiBhdHRyaWJ1dGUKLVZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRT1JbXBsaWVkIGF0dHJpYnV0ZSBvdmVycmlkZSBuYW1lIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhbiBhdHRyaWJ1dGUKLVZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WQUxJRF9OQU1FPUltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgbmFtZSBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYW4gYXR0cmlidXRlCi1WSVJUVUFMX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRT1JbXBsaWVkIG1hcCBrZXkgYXR0cmlidXRlIG92ZXJyaWRlIG5hbWUgY2Fubm90IGJlIHJlc29sdmVkIHRvIGFuIGF0dHJpYnV0ZQotVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRT1BdHRyaWJ1dGUgb3ZlcnJpZGUgbmFtZSBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYW4gYXR0cmlidXRlCi1WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZBTElEX05BTUU9QXNzb2NpYXRpb24gb3ZlcnJpZGUgbmFtZSBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYW4gYXR0cmlidXRlCi1WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUU9TWFwIGtleSBhdHRyaWJ1dGUgb3ZlcnJpZGUgY2Fubm90IGJlIHJlc29sdmVkIHRvIGFuIGF0dHJpYnV0ZQotVklSVFVBTF9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPUltcGxpZWQgbWFwIGtleSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdGFibGUgZm9yIGNvbHVtbiBpcyBub3QgdmFsaWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUltcGxpZWQgYXR0cmlidXRlIG92ZXJyaWRlIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPUltcGxpZWQgYXR0cmlidXRlIG92ZXJyaWRlIHRhYmxlIGZvciBjb2x1bW4gbm90IHZhbGlkOgotVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRz1JbXBsaWVkIGFzc29jaWF0aW9uIGNhdGFsb2cgY2Fubm90IGJlIHJlc29sdmVkIGZvciBqb2luIHRhYmxlOgotVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BPUltcGxpZWQgYXNzb2NpYXRpb24gc2NoZW1hIGNhbm5vdCBiZSByZXNvbHZlZCBqb2luIHRhYmxlOgotVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRT1JbXBsaWVkIGFzc29jaWF0aW9uIGNhbm5vdCBiZSByZXNvbHZlZCBqb2luIHRhYmxlOgotVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9SW1wbGllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSB0YWJsZSBmb3Igam9pbiBjb2x1bW4gaXMgbm90IHZhbGlkOgotVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9SW1wbGllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRT1JbXBsaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlIHJlZmVyZW5jZWQgY29sdW1uIGluIGpvaW4gY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKLVZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9SW1wbGllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSBqb2luIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLVZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9SW1wbGllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLVZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9SW1wbGllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSB0YWJsZSBmb3IgaW52ZXJzZSBqb2luIGNvbHVtbiBpcyBub3QgdmFsaWQ6Ci1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgaW52ZXJzZSBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FPUltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgcmVmZXJlbmNlZCBjb2x1bW4gaW4gaW52ZXJzZSBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUz1JbXBsaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlIGludmVyc2Ugam9pbiBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUz1JbXBsaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlIGludmVyc2Ugam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci0KLVZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HPUNhdGFsb2cgY2Fubm90IGJlIHJlc29sdmVkIGZvciBqb2luIHRhYmxlOgotVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQT1TY2hlbWEgY2Fubm90IGJlIHJlc29sdmVkIGZvciBqb2luIHRhYmxlOgotVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUU9Sm9pbiB0YWJsZSBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1BdHRyaWJ1dGUgb3ZlcnJpZGUgdGFibGUgZm9yIGNvbHVtbiBub3QgdmFsaWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPVRhYmxlIGZvciBjb2x1bW4gbm90IHZhbGlkOgotVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9QXR0cmlidXRlIG92ZXJyaWRlIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFPVRhYmxlIGZvciBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9Sm9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9Sm9pbiBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU9UmVmZXJlbmNlZCBjb2x1bW4gaW4gam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9Sm9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1WSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX0lTX05PVF9BTl9FTlRJVFk9VGFyZ2V0IGVudGl0eSBpcyBub3QgYW4gRW50aXR5OgotVklSVFVBTF9BVFRSSUJVVEVfVEFSR0VUX0VOVElUWV9OT1RfREVGSU5FRD1UYXJnZXQgZW50aXR5IGlzIG5vdCBkZWZpbmVkOgotVklSVFVBTF9BVFRSSUJVVEVfQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0c9Q2F0YWxvZyBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIGNvbGxlY3Rpb24gdGFibGU6Ci1WSVJUVUFMX0FUVFJJQlVURV9DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BPVNjaGVtYSBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIGNvbGxlY3Rpb24gdGFibGU6Ci1WSVJUVUFMX0FUVFJJQlVURV9DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfTkFNRT1Db2xsZWN0aW9uIHRhYmxlIGNhbm5vdCBiZSByZXNvbHZlZDoKLVZJUlRVQUxfQVRUUklCVVRFX09SREVSX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9T3JkZXIgY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKLVZJUlRVQUxfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfTk9UX0RFRklORUQ9RWxlbWVudCBjb2xsZWN0aW9uIHRhcmdldCBjbGFzcyBub3QgZGVmaW5lZDoKLVZJUlRVQUxfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfTVVTVF9CRV9FTUJFRERBQkxFX09SX0JBU0lDX1RZUEU9RWxlbWVudCBjb2xsZWN0aW9uIHRhcmdldCBjbGFzcyBpcyBub3QgZW1iZWRkYWJsZSBvciBiYXNpYyB0eXBlOgotVklSVFVBTF9BVFRSSUJVVEVfRUxFTUVOVF9DT0xMRUNUSU9OX01BUF9LRVlfQ0xBU1NfTk9UX0RFRklORUQ9RWxlbWVudCBjb2xsZWN0aW9uIG1hcCBrZXkgY2xhc3Mgbm90IGRlZmluZWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9VGFibGUgZm9yIGpvaW4gY29sdW1uIGlzIG5vdCB2YWxpZDoKLVZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPVRhYmxlIGZvciBpbnZlcnNlIGpvaW4gY29sdW1uIGlzIG5vdCB2YWxpZDoKLVZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUludmVyc2Ugam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1JbnZlcnNlIGpvaW4gY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGVzOgotVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU9UmVmZXJlbmNlZCBjb2x1bW4gaW4gaW52ZXJzZSBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TPUludmVyc2Ugam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9VGFibGUgZm9yIG1hcCBrZXkgY29sdW1uIGlzIG5vdCB2YWxpZDoKLVZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9TWFwIGtleSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdGFibGUgZm9yIGNvbHVtbiBub3QgdmFsaWQ6Ci0KLQotVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPUFzc29jaWF0aW9uIG92ZXJyaWRlIHRhYmxlIGZvciBqb2luIGNvbHVtbiBpcyBub3QgdmFsaWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9QXNzb2NpYXRpb24gb3ZlcnJpZGUgam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUFzc29jaWF0aW9uIG92ZXJyaWRlIGpvaW4gY29sdW1uIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgY2Fubm90IGJlIHJlc29sdmVkOgotVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9QXNzb2NpYXRpb24gb3ZlcnJpZGUgam9pbiBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1Bc3NvY2lhdGlvbiBvdmVycmlkZSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLVZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPUFzc29jaWF0aW9uIG92ZXJyaWRlIHRhYmxlIGZvciBpbnZlcnNlIGpvaW4gY29sdW1uIGlzIG5vdCB2YWxpZDoKLVZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUFzc29jaWF0aW9uIG92ZXJyaWRlIGludmVyc2Ugam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9QXNzb2NpYXRpb24gb3ZlcnJpZGUgaW52ZXJzZSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGNhbm5vdCBiZSByZXNvbHZlZDoKLVZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUz1Bc3NvY2lhdGlvbiBvdmVycmlkZSBpbnZlcnNlIGpvaW4gY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGVzOgotVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0lOVkVSU0VfSk9JTl9DT0xVTU5TPUFzc29jaWF0aW9uIG92ZXJyaWRlIGludmVyc2Ugam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci0KLUlOSEVSSVRBTkNFX0NBVEVHT1JZPUluaGVyaXRhbmNlCi0KLURJU0NSSU1JTkFUT1JfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1EaXNjcmltaW5hdG9yIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9TVVBQT1JURURfT05fUExBVEZPUk09RW50aXR5IGNhbm5vdCB1c2UgdGFibGUtcGVyLWNvbmNyZXRlLWNsYXNzIGluaGVyaXRhbmNlOgotRU5USVRZX1RBQkxFX1BFUl9DTEFTU19OT1RfUE9SVEFCTEVfT05fUExBVEZPUk09RW50aXR5IHVzZXMgdGFibGUtcGVyLWNvbmNyZXRlLWNsYXNzIGluaGVyaXRhbmNlIHdoaWNoIGlzIG5vdCBwb3J0YWJsZToKLQotUVVFUklFU19HRU5FUkFUT1JTX0NBVEVHT1JZPVF1ZXJpZXMgYW5kIGdlbmVyYXRvcnMKLQotR0VORVJBVE9SX0RVUExJQ0FURV9OQU1FPUR1cGxpY2F0ZSBnZW5lcmF0b3IgZGVmaW5lZDoKLUlEX01BUFBJTkdfVU5SRVNPTFZFRF9HRU5FUkFUT1JfTkFNRT1VbnJlc29sdmVkIGdlbmVyYXRvciBuYW1lOgotR0VORVJBVEVEX1ZBTFVFX1VOUkVTT0xWRURfR0VORVJBVE9SPUdlbmVyYXRvciBpcyBub3QgZGVmaW5lZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdDoKLVFVRVJZX0RVUExJQ0FURV9OQU1FPUR1cGxpY2F0ZSBxdWVyeSBkZWZpbmVkOgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NjaGVtYS9qcGFQbGF0Zm9ybVVpcy5leHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NjaGVtYS9qcGFQbGF0Zm9ybVVpcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjM0ZWQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zY2hlbWEvanBhUGxhdGZvcm1VaXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQudWkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LnVpIiBpZD0ianBhUGxhdGZvcm1zIiBuYW1lPSJKUEEgUGxhdGZvcm0gVUlzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJqcGFQbGF0Zm9ybVVpIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImpwYVBsYXRmb3JtVWkiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEV4dGVuZCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhbmQgeW91IG11c3QgYWxzbyBleHRlbmQgdGhlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYVBsYXRmb3JtcyBleHRlbnNpb24gcG9pbnQuICBUaGUganBhUGxhdGZvcm1JZCBtdXN0IG1hdGNoIHRoZSBpZCBvZiBhIGNvcmUuanBhUGxhdGZvcm0gZXh0ZW5zaW9uLiAgT25lIGpwYVBsYXRmb3JtIHdpbGwgYmUgY2hvc2VuIHBlciBKcGFQcm9qZWN0LiAgVGhlIHBvc3NpYmxlIGpwYVBsYXRmb3JtcyB3aWxsIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBhcyBhIHByb2plY3QgcHJvcGVydHkuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImpwYVBsYXRmb3JtIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBqcGFQbGF0Zm9ybUlkIG11c3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhUGxhdGZvcm0gZXh0ZW5zaW9uIGlkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY3RvcnlDbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpRmFjdG9yeSZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWlGYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDIuMgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLXVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLXN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi1waW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi13aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi10ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAKLUNvbnRyaWJ1dG9yczoKLU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwYVBsYXRmb3JtVWkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwYVBsYXRmb3JtVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwMWU0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9KcGFQbGF0Zm9ybVVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5EZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIEpQQSB2ZW5kb3IgdG8gcHJvdmlkZSBleHRlbnNpb25zIHRvCi0gKiBKUEEgVUkgZnVuY3Rpb25hbGl0eS4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gd29yayBpbiBjb25qdW5jdGlvbiB3aXRoIGEgY29yZQotICogSlBBIHBsYXRmb3JtICh7QGxpbmsgSnBhUGxhdGZvcm19KSBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZSBzYW1lIElELgotICogPHA+Ci0gKiBBbnkgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIDxpPnN0YXRlbGVzczwvaT4gaW4gbmF0dXJlLgotICogPHA+Ci0gKiBUaGUgImdlbmVyaWMiIGV4dGVuc2lvbiBzdXBwbGllcyBVSSBmb3IgdGhlIGNvcmUgcGxhdGZvcm0gZXh0ZW5zaW9uIHdpdGggdGhlIHNhbWUKLSAqIElELgotICoKLSAqIFNlZSB0aGUgZXh0ZW5zaW9uIHBvaW50OiBvcmcuZWNsaXBzZS5qcHQudWkuanBhUGxhdGZvcm0KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFQbGF0Zm9ybVVpCi17Ci0JLy8gKioqKioqKioqKiBuYXZpZ2F0b3IgcHJvdmlkZXIgKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIEpwYU5hdmlnYXRvclByb3ZpZGVyfSBmb3IgdGhpcyBwbGF0Zm9ybSwgCi0JICogd2hpY2ggZGV0ZXJtaW5lcyBQcm9qZWN0IEV4cGxvcmVyIGNvbnRlbnQgYW5kIGxvb2sKLQkgKi8KLQlKcGFOYXZpZ2F0b3JQcm92aWRlciBnZXROYXZpZ2F0b3JQcm92aWRlcigpOwotCQotCQotCS8vICoqKioqKioqKiogc3RydWN0dXJlIHByb3ZpZGVycyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGEgc3RydWN0dXJlIHByb3ZpZGVyIGZvciB0aGUgc3BlY2lmaWVkIEpQQSBmaWxlLgotCSAqLwotCUpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKEpwYUZpbGUganBhRmlsZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBkZXRhaWxzIHByb3ZpZGVycyAqKioqKioqKioqCi0JCi0JSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkSnBhRGV0YWlsc1BhZ2UoCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJSnBhU3RydWN0dXJlTm9kZSBzdHJ1Y3R1cmVOb2RlLAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkKLQkvLyAqKioqKioqKioqIGZpbGUgdWkgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiBhIHJlc291cmNlIHVpIGRlZmluaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZS4KLQkgKi8KLQlSZXNvdXJjZVVpRGVmaW5pdGlvbiBnZXRSZXNvdXJjZVVpRGVmaW5pdGlvbihKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKLQkKLQkKLQkvLyAqKioqKioqKioqIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgotCQotCUpwYUNvbXBvc2l0ZSBidWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSwgCi0JCQlTdHJpbmcgbWFwcGluZ0tleSwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUeXBlTWFwcGluZz4gbWFwcGluZ0hvbGRlciwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsID8gZXh0ZW5kcyBUeXBlTWFwcGluZz4KLQkJCWdldERlZmF1bHRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbihKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKLQkKLQlJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRUeXBlLCA/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PgotCQkJdHlwZU1hcHBpbmdVaURlZmluaXRpb25zKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpOwotCQotCQotCS8vICoqKioqKioqKiogYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKioKLQkKLQlKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSwgCi0JCQlTdHJpbmcgbWFwcGluZ0tleSwgCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU1hcHBpbmc+IG1hcHBpbmdIb2xkZXIsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCURlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsID8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiAKLQkJCWdldERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUsIFN0cmluZyBtYXBwaW5nS2V5KTsKLQkKLQlJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsID8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4KLQkJCWF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpOwotCQotCQotCS8vICoqKioqKioqKiogZW50aXR5IGdlbmVyYXRpb24gKioqKioqKioqKgotCQotCXZvaWQgZ2VuZXJhdGVFbnRpdGllcyhKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbik7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBEREwgZ2VuZXJhdGlvbiAqKioqKioqKioqCi0JCi0Jdm9pZCBnZW5lcmF0ZURETChKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbik7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9KcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjMDVmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9KcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIEpQQSB2ZW5kb3IgdG8gYnVpbGQgYSBKcGFQbGF0Zm9ybVVpLgotICoKLSAqIFNlZSB0aGUgZXh0ZW5zaW9uIHBvaW50OiBvcmcuZWNsaXBzZS5qcHQudWkuanBhUGxhdGZvcm0KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFQbGF0Zm9ybVVpRmFjdG9yeQotewotCUpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9KcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODUzZDg4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgSlBBIHZlbmRvciB0byBwcm92aWRlIGV4dGVuc2lvbnMgdG8KLSAqIEpQQSBVSSBmdW5jdGlvbmFsaXR5LiAgVGhpcyBpcyBpbnRlbmRlZCB0byB3b3JrIGluIGNvbmp1bmN0aW9uIHdpdGggYSBjb3JlCi0gKiBKUEEgcGxhdGZvcm0gKHtAbGluayBKcGFQbGF0Zm9ybX0pIGltcGxlbWVudGF0aW9uIHdpdGggdGhlIHNhbWUgSUQuCi0gKiA8cD4KLSAqIEFueSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgPGk+c3RhdGVsZXNzPC9pPiBpbiBuYXR1cmUuCi0gKiA8cD4KLSAqIFRoZSAiZ2VuZXJpYyIgZXh0ZW5zaW9uIHN1cHBsaWVzIFVJIGZvciB0aGUgY29yZSBwbGF0Zm9ybSBleHRlbnNpb24gd2l0aCB0aGUgc2FtZQotICogSUQuCi0gKgotICogU2VlIHRoZSBleHRlbnNpb24gcG9pbnQ6IG9yZy5lY2xpcHNlLmpwdC51aS5qcGFQbGF0Zm9ybVVpcwotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYVBsYXRmb3JtVWlQcm92aWRlcgotewotCS8qKgotCSAqIFJldHVybiB0aGUgZGV0YWlscyBwcm92aWRlcnMgdGhhdCBhcHBseSB0byB0aGlzIHBsYXRmb3JtLgotCSAqLwotCUxpc3RJdGVyYXRvcjxKcGFEZXRhaWxzUHJvdmlkZXI+IGRldGFpbHNQcm92aWRlcnMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIHVpIGRlZmluaXRpb25zIHRoYXQgYXBwbHkgdG8gdGhpcyBwbGF0Zm9ybS4KLQkgKi8KLQlMaXN0SXRlcmF0b3I8UmVzb3VyY2VVaURlZmluaXRpb24+IHJlc291cmNlVWlEZWZpbml0aW9ucygpOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvSnB0VWlQbHVnaW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwdFVpUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YWU5ZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvSnB0VWlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybVVpUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLm5hdmlnYXRvci5KcGFOYXZpZ2F0b3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogRGFsaSBVSSBwbHVnLWluLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnB0VWlQbHVnaW4KLQlleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyIGZvY3VzTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RhbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBwbHVnLWluIGlkZW50aWZpZXIgb2YgSlBBIFVJIHN1cHBvcnQgKHZhbHVlIHtAdmFsdWV9KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LnVpIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSURfID0gUExVR0lOX0lEICsgJy4nOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPQ1VTX0RBVEFfS0VZID0gUExVR0lOX0lEXyArICJmb2N1cyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEZPQ1VTX0RBVEEgPSBuZXcgT2JqZWN0KCk7Ci0KLQotCS8vICoqKioqKioqKiogc2luZ2xldG9uICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIEpwdFVpUGx1Z2luIElOU1RBTkNFOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIEpQVCBVSSBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0VWlQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbG9nZ2luZyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIElOU1RBTkNFLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCkpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbWFnZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgPGNvZGU+LmdpZjxjb2RlPgotCSAqIGZpbGUgaW4gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQlpZiAoICEga2V5LnN0YXJ0c1dpdGgoImljb25zLyIpKSB7Ci0JCQlrZXkgPSAiaWNvbnMvIiArIGtleTsKLQkJfQotCQlpZiAoICEga2V5LmVuZHNXaXRoKCIuZ2lmIikpIHsKLQkJCWtleSA9IGtleSArICIuZ2lmIjsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIGtleSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGltYWdlIGZvciB0aGUgc3BlY2lmaWVkIDxjb2RlPi5naWY8Y29kZT4KLQkgKiBmaWxlIGluIHRoZSBpY29ucyBmb2xkZXIuCi0JICovCi0JLy9UT0RPIHdlIGFyZSB1c2luZyB0aGUgSW1hZ2VSZWdpc3RyeSBoZXJlIGFuZCBzdG9yaW5nIGFsbCBvdXIgaWNvbnMgZm9yIHRoZSBsaWZlIG9mIHRoZSBwbHVnaW4sIAotCS8vd2hpY2ggbWVhbnMgdW50aWwgdGhlIHdvcmtzcGFjZSBpcyBjbG9zZWQuICBUaGlzIGlzIGJldHRlciB0aGFuIGJlZm9yZSB3aGVyZSB3ZSBjb25zdGFudGx5IAotCS8vY3JlYXRlZCBuZXcgaW1hZ2VzLiBCdWcgMzA2NDM3IGlzIGFib3V0IGNsZWFuaW5nIHRoaXMgdXAgYW5kIHVzaW5nIExvY2FsIFJlc291cmNlIE1hbmFnZXJzIAotCS8vb24gb3VyIHZpZXdzIHNvIHRoYXQgY2xvc2luZyB0aGUgSlBBIHBlcnNwZWN0aXZlIHdvdWxkIG1lYW4gb3VyIGljb25zIGFyZSBkaXNwb3NlZC4KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gaW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUltYWdlIGltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlUmVnaXN0cnkucHV0KGtleSwgZ2V0SW1hZ2VEZXNjcmlwdG9yKGtleSkpOwotCQkJaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChrZXkpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBKcHRVaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mb2N1c0xpc3RlbmVyID0gdGhpcy5idWlsZEZvY3VzTGlzdGVuZXIoKTsKLQkJaWYgKElOU1RBTkNFICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogV2UgYXJlIHJlZ2lzdGVyZWQgdG8gcmVjZWl2ZSBvbmx5IHtAbGluayBTV1QjRm9jdXNJbn0gZXZlbnRzCi0JICovCi0JcHJpdmF0ZSBMaXN0ZW5lciBidWlsZEZvY3VzTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUpwdFVpUGx1Z2luLnRoaXMuZm9jdXNJbigoQ29udHJvbCkgZXZlbnQud2lkZ2V0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZm9jdXMgaGFuZGxpbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIGEgImZvY3VzIGluIiBldmVudCBpcyBnZW5lcmF0ZWQuCi0JICogSWYgdGhlIGNvbnRyb2wgZ2FpbmluZyBmb2N1cyBpcyBwYXJ0IG9mIG9uZSBvZiBvdXIgY29tcG9zaXRlcyAodHlwaWNhbGx5Ci0JICogYSBKUEEgRGV0YWlscyBWaWV3KSwgd2Ugc3RvcCBsaXN0ZW5pbmcgdG8gSmF2YSBjaGFuZ2UgZXZlbnRzCi0JICogKGFuZCBhc3N1bWUgYWxsIGNoYW5nZXMgdG8gdGhlIEphdmEgbW9kZWwgYXJlIGdlbmVyYXRlZCBieSB1cykuCi0JICogSWYgdGhlIGNvbnRyb2wgZ2FpbmluZyBmb2N1cyBpcyAqbm90KiBwYXJ0IG9mIG9uZSBvZiBvdXIgY29tcG9zaXRlcywKLQkgKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIEphdmEgY2hhbmdlIGV2ZW50cyBhZ2Fpbi4KLQkgKi8KLQl2b2lkIGZvY3VzSW4oQ29udHJvbCBjb250cm9sKSB7Ci0JCXdoaWxlIChjb250cm9sICE9IG51bGwpIHsKLQkJCWlmIChjb250cm9sLmdldERhdGEoRk9DVVNfREFUQV9LRVkpID09IEZPQ1VTX0RBVEEpIHsKLQkJCQl0aGlzLmZvY3VzSW4oKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljb250cm9sID0gY29udHJvbC5nZXRQYXJlbnQoKTsKLQkJfQotCQl0aGlzLmZvY3VzT3V0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIGEgRGFsaSBVSSBjb250cm9sIHRoYXQgYWZmZWN0cyBKYXZhCi0JICogc291cmNlIGNvZGUgZ2FpbnMgdGhlIFVJIGZvY3VzLiBXaGVuIHRoaXMgaGFwcGVucyB3ZSBkZWFjdGl2YXRlCi0JICogdGhlIERhbGkgSmF2YSBjaGFuZ2UgbGlzdGVuZXIgc28gd2UgaWdub3JlIGFueSBjaGFuZ2VzIHRvIHRoZSBKYXZhCi0JICogc291cmNlIGNvZGUgdGhhdCBwcm9iYWJseSBvcmlnaW5hdGVkIGZyb20gRGFsaS4gVGhpcyBtZWFucyB3ZSB3aWxsIG1pc3MKLQkgKiBhbnkgY2hhbmdlcyB0byB0aGUgSmF2YSBzb3VyY2UgY29kZSB0aGF0IGlzIGNhdXNlZCBieSBub24tVUkgYWN0aXZpdHk7Ci0JICogYnV0LCB3ZSBob3BlLCB0aGVzZSBjaGFuZ2VzIGFyZSB1bnJlbGF0ZWQgdG8gSlBBIGFubm90YXRpb25zIGV0Yy4KLQkgKiBAc2VlICNmb2N1c091dCgpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvY3VzSW4oKSB7Ci0JCUpwdENvcmVQbHVnaW4uc2V0SmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcklzQWN0aXZlKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBub24tRGFsaSBVSSBjb250cm9sIGdhaW5zIHRoZSBVSSBmb2N1cy4KLQkgKiBXaGVuIHRoaXMgaGFwcGVucyB3ZSBhY3RpdmF0ZSB0aGUgRGFsaSBKYXZhIGNoYW5nZSBsaXN0ZW5lciBzbyB0aGF0IHdlCi0JICogYmVnaW4gdG8ga2VlcCB0aGUgRGFsaSBtb2RlbCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgSmF2YSBzb3VyY2UgY29kZS4KLQkgKiBAc2VlICNmb2N1c0luKCkKLQkgKi8KLQlwcml2YXRlIHZvaWQgZm9jdXNPdXQoKSB7Ci0JCUpwdENvcmVQbHVnaW4uc2V0SmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcklzQWN0aXZlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIFRhZyB0aGUgc3BlY2lmaWVkIGNvbnRyb2wgc28gdGhhdCB3aGVuZXZlciBpdCAob3IgYW55IG9mIGl0cyBjaGlsZHJlbiwKLQkgKiBncmFuZGNoaWxkcmVuLCBldGMuKSBoYXMgdGhlIGZvY3VzLCB0aGUgRGFsaSBtb2RlbCBpZ25vcmVzIGFueSBKYXZhCi0JICogY2hhbmdlIGV2ZW50cy4gVGhpcyBtZXRob2QgaXMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgaXMgZmlyc3QKLQkgKiBjb25zdHJ1Y3RlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cm9sQWZmZWN0c0phdmFTb3VyY2UoQ29udHJvbCBjb250cm9sKSB7Ci0JCWNvbnRyb2wuc2V0RGF0YShGT0NVU19EQVRBX0tFWSwgRk9DVVNfREFUQSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBsYXRmb3JtICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIHBsYXRmb3JtIFVJIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKUEEgcGxhdGZvcm0uCi0JICovCi0JcHVibGljIEpwYVBsYXRmb3JtVWkgZ2V0SnBhUGxhdGZvcm1VaShKcGFQbGF0Zm9ybSBqcGFQbGF0Zm9ybSkgewotCQlyZXR1cm4gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1VaShqcGFQbGF0Zm9ybS5nZXRJZCgpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhTmF2aWdhdG9yUHJvdmlkZXIgZ2V0SnBhTmF2aWdhdG9yUHJvdmlkZXIoSnBhUGxhdGZvcm0ganBhUGxhdGZvcm0pIHsKLQkJSnBhUGxhdGZvcm1VaSBwbGF0Zm9ybSA9IHRoaXMuZ2V0SnBhUGxhdGZvcm1VaShqcGFQbGF0Zm9ybSk7Ci0JCXJldHVybiAocGxhdGZvcm0gPT0gbnVsbCkgPyBudWxsIDogcGxhdGZvcm0uZ2V0TmF2aWdhdG9yUHJvdmlkZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZWdpc3RlciBvdXIgU1dUIGxpc3RlbmVyIHdpdGggdGhlIGRpc3BsYXkgc28gd2UgcmVjZWl2ZSBub3RpZmljYXRpb24KLQkgKiBvZiBldmVyeSAiZm9jdXMgaW4iIGV2ZW50LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hZGRGaWx0ZXIoU1dULkZvY3VzSW4sIHRoaXMuZm9jdXNMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVW5yZWdpc3RlciBvdXIgU1dUIGxpc3RlbmVyIHdpdGggdGhlIGRpc3BsYXkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkucmVtb3ZlRmlsdGVyKFNXVC5Gb2N1c0luLCB0aGlzLmZvY3VzTGlzdGVuZXIpOwotCQl9IGZpbmFsbHkgewotCQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvTWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9NYXBwaW5nUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlNmE5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9NYXBwaW5nUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkRlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbiBleHRlbmRzIFJlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JLyoqCi0JICogCi0JICovCi0JSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVN0cmluZyBrZXksIAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU1hcHBpbmc+IG1hcHBpbmdIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb2YgYXR0cmlidXRlIG1hcHBpbmcgdWkgZGVmaW5pdGlvbnMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgZmlsZSB0eXBlCi0JICovCi0JSXRlcmF0b3I8TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCA/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IAotCQkJYXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBkZWZhdWx0IGF0dHJpYnV0ZSBtYXBwaW5nIHVpIGRlZmluaXRpb24gZm9yIHRoZSBnaXZlbiBrZXkgb3IgbnVsbAotCSAqLwotCURlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsID8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiAKLQkJCWdldERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKFN0cmluZyBrZXkpOwotCQotCS8qKgotCSAqIAotCSAqLwotCUpwYUNvbXBvc2l0ZSBidWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJU3RyaW5nIGtleSwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VHlwZU1hcHBpbmc+IG1hcHBpbmdIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRUeXBlLCA/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiAKLQkJCXR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpOwotCQotCS8qKgotCSAqIFJldHVybiBhIGRlZmF1bHQgdHlwZSBtYXBwaW5nIHVpIHByb3ZpZGVyIG9yIG51bGwKLQkgKi8KLQlEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50VHlwZSwgPyBleHRlbmRzIFR5cGVNYXBwaW5nPiAKLQkJCWdldERlZmF1bHRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTAwNzBlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL1BlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24gZXh0ZW5kcyBSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCUxpc3RJdGVyYXRvcjxKcGFQYWdlQ29tcG9zaXRlPiBidWlsZFBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZXMoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL1Jlc291cmNlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9SZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWU0MjEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL1Jlc291cmNlVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOwotCi0vKioKLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgZGVmaW5pdGlvbiBwcm92aWRlcyBVSSBmb3IgcmVzb3VyY2Ugb2YgdGhlIGdpdmVuIHR5cGUKLQkgKi8KLQlib29sZWFuIHByb3ZpZGVzVWkoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdHJ1Y3R1cmUgcHJvdmlkZXIgYXNzb2NpYXRpb24gd2l0aCB0aGlzIG1hcHBpbmcgZmlsZSB0eXBlLgotCSAqLwotCUpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9XaWRnZXRGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9XaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZWUyNDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRhdGVUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotCi0vKioKLSAqIEEgd2lkZ2V0IGZhY3RvcnkgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGFuIFNXVCB3aWRnZXQgYmFzZWQgb24gdGhlIHJpZ2h0Ci0gKiBzdHlsZS4gU29tZSBzdHlsZSBzaG93cyB0aGUgd2lkZ2V0cyBkaWZmZXJlbnRseSwgZm9yIGluc3RhbmNlLCB0aGUgZmxhdCBzdHlsZQotICogc2hvd3MgdGhlIHdpZGdldHMgd2l0aCBsZXNzIGJvcmRlcnMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4KLSAqIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nCi0gKiBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdAotICogY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdpZGdldEZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyByZWd1bGFyIGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqLwotCUJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgY3VzdG9tIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqLwotCUBEZXByZWNhdGVkCi0JQ0NvbWJvIGNyZWF0ZUNDb21ibyhDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hlY2sgYm94IGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqLwotCUJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21ibzwvY29kZT4KLQkgKi8KLQlDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IERhdGVUaW1lLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgaXMgdG8gdGVsbCB0aGUgdHlwZSBvZiB3aWRnZXQKLQkgKiAoPGNvZGU+U1dULkRBVEU8L2NvZGU+IG9yIDxjb2RlPlNXVC5USU1FPC9jb2RlPiBvciA8Y29kZT5TV1QuQ0FMRU5EQVI8L2NvZGU+KQotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+RGF0ZVRpbWU8L2NvZGU+Ci0JICovCi0JRGF0ZVRpbWUgY3JlYXRlRGF0ZVRpbWUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIGN1c3RvbSA8Y29kZT5DQ29tYm88L2NvZGU+LgotCSAqCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICovCi0JQERlcHJlY2F0ZWQKLQlDQ29tYm8gY3JlYXRlRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqLwotCUNvbWJvIGNyZWF0ZUVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRpdGxlZCBwYW5lIChncm91cCBib3gpLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0aXRsZSBUaGUgZ3JvdXAgcGFuZSdzIHRpdGxlCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Hcm91cDwvY29kZT4KLQkgKi8KLQlHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGl0bGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsYWJlbCB0aGF0IGlzIHNob3duIGFzIGEgaHlwZXJsaW5rLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkh5cGVybGluazwvY29kZT4KLQkgKi8KLQlIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgbGFiZWwncyB0ZXh0Ci0JICogQHJldHVybiBBIG5ldyA8Y29kZT5MYWJlbDwvY29kZT4KLQkgKi8KLQlMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgbGFiZWxUZXh0KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGlzdC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIGlzIHVzdWFsbHkgdG8gdGVsbCB3aGF0IHR5cGUgb2Ygc2VsZWN0aW9uCi0JICogKDxjb2RlPlNXVC5NVUxUSTwvY29kZT4gb3IgPGNvZGU+U1dULlNJTkdMRTwvY29kZT4pCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5MYWJlbDwvY29kZT4KLQkgKi8KLQlMaXN0IGNyZWF0ZUxpc3QoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHN0eWxlKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGFiZWwgdGhhdCBjYW4gYmUgd3JhcHBlZCBvbiBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkZvcm1UZXh0PC9jb2RlPgotCSAqLwotCUZvcm1UZXh0IGNyZWF0ZU11bHRpTGluZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBsYWJlbFRleHQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSB0ZXh0IGFyZWEuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHBhcmVudCBUaGUgbnVtYmVyIG9mIGxpbmVzIHRoZSB0ZXh0IGFyZWEgc2hvdWxkIGRpc3BsYXkKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+Ci0JICovCi0JVGV4dCBjcmVhdGVNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSB0ZXh0IGZpZWxkIHRoYXQgaGFuZGxlcyBwYXNzd29yZC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+Ci0JICovCi0JVGV4dCBjcmVhdGVQYXNzd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHB1c2ggYnV0dG9uICh0b2dnbGUgYmV0d2VlbiBzZWxlY3RlZCBhbmQgdW5zZWxlY3RlZCkuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKi8KLQlCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHJhZGlvIGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqLwotCUJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNlY3Rpb24sIHdoaWNoIGlzIGEgY29sbGFwc2FibGUgcGFuZSB3aXRoIGEgdGl0bGUgYmFyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgb2YgdGhlIHRpdGxlIGJhciwgd2hpY2ggY2FuIGJlCi0JICogPGNvZGU+RXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFPC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5FeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUjwvY29kZT4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+Ci0JICovCi0JU2VjdGlvbiBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNwaW5uZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5TcGlubmVyPC9jb2RlPgotCSAqLwotCVNwaW5uZXIgY3JlYXRlU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdGFibGUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBhcHBseSB0byB0aGUgdGFibGUKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRhYmxlPC9jb2RlPgotCSAqLwotCVRhYmxlIGNyZWF0ZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIHRleHQgZmllbGQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPgotCSAqLwotCVRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdHJpLXN0YXRlIGNoZWNrIGJveC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPiB0aGF0IGhhcyAzIHNlbGVjdGlvbiBzdGF0ZXMKLQkgKi8KLQlCdXR0b24gY3JlYXRlVHJpU3RhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9EZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9EZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTRiNTM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlsczsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotCWV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotewotCS8qKgotCSAqIFJldHVybnMgYSB1bmlxdWUgc3RyaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGtleSBvZiB0aGUgbWFwcGluZyBpbiB0aGUKLQkgKiBjb3JlLiAgRm9yIGEgZGVmYXVsdCBtYXBwaW5nIHRoZSBtZXRob2QgZ2V0S2V5KCkgd2lsbCByZXR1cm4gbnVsbCBzaW5jZQotCSAqIHRoYXQgaXMgZm9yIHRoZSBzcGVjaWZpZWQgbWFwcGluZy4gIFRoaXMgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgbWFwcGluZyBrZXksIG5vdCBudWxsCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRLZXkoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvSnBhQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0pwYUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDdlNzg1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvSnBhQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIEEge0BsaW5rIEpwYUNvbXBvc2l0ZX0gZGVmaW5lcyB0aGUgY29tbW9uIGJlaGF2aW9yIG9mIHRoZSBKUEEgcmVsYXRlZAotICogd2lkZ2V0cy4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFDb21wb3NpdGUgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0dWFsIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIFRoaXMgY29tcG9zaXRlJ3MgYWN0dWFsIHdpZGdldAotCSAqLwotCUNvbnRyb2wgZ2V0Q29udHJvbCgpOwotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgZW5hYmxlbWVudCBzdGF0ZSBvZiB0aGUgd2lkZ2V0cyBvZiB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gZW5hYmxlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBlbmFibGUgdGhlIHdpZGdldHMgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogdG8gZGlzYWJsZSB0aGVtCi0JICovCi0Jdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCk7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGNvbXBvc2l0ZSBpdCBzaG91bGQgZGlzcG9zZSBhbnkgcmVzb3VyY2VzLgotCSAqLwotCXZvaWQgZGlzcG9zZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvSnBhRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvSnBhRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmOGQ3Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0pwYURldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIEEgZGV0YWlscyBwYWdlIGlzIHVzZWQgdG8gc2hvdyB0aGUgcHJvcGVydHkgcGFuZSBmb3IgYSBnaXZlbiBjb250ZXh0IG5vZGUuIFRoZQotICoge0BsaW5rIEpwYURldGFpbHNQcm92aWRlcn0gaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBwYW5lLgotICoKLSAqIEBzZWUgSnBhRGV0YWlsc1Byb3ZpZGVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYURldGFpbHNQYWdlPFQgZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPgotewotCS8qKgotCSAqIFJldHVybnMgdGhpcyBkZXRhaWxzJyBwYWdlJ3Mgd2lkZ2V0LgotCSAqCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSB3aWRnZXRzIHNob3duIGJ5IHRoaXMgZGV0YWlscyBwYWdlCi0JICovCi0JQ29udHJvbCBnZXRDb250cm9sKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdWJqZWN0IGZvciB0aGlzIGRldGFpbHMgcGFnZS4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0IEVpdGhlciB0aGUgbmV3IHN1YmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHN1YmplY3QKLQkgKiBuZWVkcyB0byBiZSByZW1vdmVkCi0JICovCi0Jdm9pZCBzZXRTdWJqZWN0KFQgc3ViamVjdCk7Ci0JCi0JLyoqCi0JICogRGlzcG9zZSB0aGUgZGV0YWlscyBwYWdlIGFuZCBhbnkgcmVzb3VyY2VzIGl0IGhvbGRzLgotCSAqLwotCXZvaWQgZGlzcG9zZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvSnBhRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0pwYURldGFpbHNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGJjODgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvSnBhRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSB0aGUge0BsaW5rIEpwYURldGFpbHNQYWdlfQotICogcmVzcG9uc2libGUgdG8gc2hvdyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gY29udGVudCBub2RlIGlkLgotICoKLSAqIEBzZWUgSnBhRGV0YWlsc1BhZ2UKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjAKLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFEZXRhaWxzUHJvdmlkZXIKLXsKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHByb3ZpZGVyIHJldHVybnMgYSBkZXRhaWxzIHBhZ2UgZm9yIHRoZSBnaXZlbiBzdHJ1Y3R1cmUgbm9kZQotCSAqLwotCWJvb2xlYW4gcHJvdmlkZXNEZXRhaWxzKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBkZXRhaWxzIHBhZ2UgYmFzZWQgb24gdGhlIGdpdmVuIGNvbnRlbnQgbm9kZSBpZC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gY29udGVudE5vZGVJZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggZGV0YWlscwotCSAqIHBhZ2UgdG8gY3JlYXRlCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICovCi0JLy9UT0RPIFNob3VsZCB3ZSBwYXNzIGluIEpwYVVpRmFjdG9yeSBzbyB0aGVzZSBwYWdlcyBjYW4gYmUgYnVpbHQgdXNpbmcgdGhlIGZhY3RvcnkgYW5kIG92ZXJyaWRlbj8KLQlKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4gYnVpbGREZXRhaWxzUGFnZSgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9KcGFQYWdlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0pwYVBhZ2VDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjYjEyZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0pwYVBhZ2VDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBBIHtAbGluayBKcGFQYWdlQ29tcG9zaXRlfSBkZWZpbmVzIHRoZSBjb21tb24gYmVoYXZpb3Igb2YgdGhlIEpQQQotICogcmVsYXRlZCB3aWRnZXRzIHRoYXQgaXMgc2hvd24gYXMgYSBwYWdlIHdpdGhpbiBhbiBlZGl0b3IuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYVBhZ2VDb21wb3NpdGUgZXh0ZW5kcyBKcGFDb21wb3NpdGUgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGVscCBJRC4gVGhpcyBJRCB3aWxsIGJlIHVzZWQgaWYgdGhlIGhlbHAgYnV0dG9uIGlzIGludm9rZWQuCi0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciB0aGUgaGVscCBJRCBvZiB0aGlzIHBhZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaGVscAotCSAqIGlzIHJlcXVpcmVkCi0JICovCi0JU3RyaW5nIGdldEhlbHBJRCgpOwotCi0JLyoqCi0JICogVGhlIGltYWdlIG9mIHRoZSB0YWIgc2hvd2luZyB0aGlzIHBhZ2UuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwYWdlJ3MgaW1hZ2UKLQkgKi8KLQlJbWFnZURlc2NyaXB0b3IgZ2V0UGFnZUltYWdlRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogVGhlIHRleHQgb2YgdGhlIHRhYiBzaG93aW5nIHRoaXMgcGFnZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHBhZ2UncyB0ZXh0Ci0JICovCi0JU3RyaW5nIGdldFBhZ2VUZXh0KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL01hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTFiNzk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEEgVUkgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgdG8gcHJvdmlkZSB0aGUgc3VwcG9ydCBmb3IgZGlzcGxheWluZyB0aGUKLSAqIGluZm9ybWF0aW9uIGZvciBhIGNlcnRhaW4gbWFwcGluZyB0eXBlLgotICogCi0gKiBUIHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgdGhlIG1hcHBpbmcgdGhlIGRlZmluaXRpb24gcmVwcmVzZW50cwotICogTSByZXByZXNlbnRzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgbWFwcGVkCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQkvKioKLQkgKiBSZXR1cm5zIGEgdW5pcXVlIHN0cmluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgb2YgdGhlIG1hcHBpbmcgaW4gdGhlCi0JICogY29yZSAoSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGFuZC9vciBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIpLgotCSAqCi0JICogQHJldHVybiBUaGUga2V5IHJlcHJlc2VudGluZyB0aGUgbWFwcGluZwotCSAqLwotCVN0cmluZyBnZXRLZXkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgaHVtYW4gcmVhZGFibGUgdGV4dCBvZiB0aGUgbWFwcGluZyB0eXBlLgotCSAqCi0JICogQHJldHVybiBBIGRpc3BsYXkgc3RyaW5nIGZvciB0aGUgbWFwcGluZyB0eXBlCi0JICovCi0JU3RyaW5nIGdldExhYmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgaHVtYW4gcmVhZGFibGUgdGV4dCBvZiB0aGUgbWFwcGluZyB0eXBlIHRvIGJlIHVzZWQgaW4gdGhlIG1hcHBpbmcgY2hhbmdlIGxpbmsgbGFiZWwKLQkgKi8KLQlTdHJpbmcgZ2V0TGlua0xhYmVsKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSB0aGF0IHJlcHJlc2VudHMgdGhlIG1hcHBpbmcgdHlwZSBkZWZpbmVkIGJ5IHRoaXMgcHJvdmlkZXIuCi0JICoKLQkgKiBAcmV0dXJuIEFuIGltYWdlIHJlcHJlc2VudGluZyBhIG1hcHBpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaW1hZ2UKLQkgKiBpcyByZXF1aXJlZAotCSAqLwotCUltYWdlIGdldEltYWdlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1hcHBpbmcgdHlwZSByZXByZXNlbnRlZCBieSB0aGlzIGRlZmluaXRpb24gaXMgZW5hYmxlZCBmb3IgdGhlIGdpdmVuCi0JICogbWFwcGFibGUgb2JqZWN0LiAgVGhpcyBpcyBhbG1vc3QgYWx3YXlzIHRydWUuCi0JICovCi0JYm9vbGVhbiBpc0VuYWJsZWRGb3IoTSBtYXBwYWJsZU9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL2phdmEvRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL2phdmEvRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzODAxMDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkRlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxUIGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gCi0JZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxUPiwgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgVD4KLXsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL2phdmEvRGVmYXVsdEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzRmZmRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5EZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEZWZhdWx0SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBUeXBlTWFwcGluZz4KLQlleHRlbmRzIEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxUPiwgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsIFQ+Ci17Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9qYXZhL0phdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL2phdmEvSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUxOGJlOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL2phdmEvSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPgotCWV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBUPgotewotCS8qKgotCSAqIENyZWF0ZXMgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgbWFwcGluZyB0eXBlLgotCSAqIFRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgYnkgdGhlIDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZTwvY29kZT4KLQkgKiB3aGVuIHRoZSBtYXBwaW5nIGtleSBtYXRjaGVzIHRoZSBrZXkgZ2l2ZW4gYnkgdGhpcyBwcm92aWRlci4gVGhlCi0JICogY29tcG9zaXRlcyB3aWxsIGJlIHN0b3JlZCBpbiBhIE1hcCB3aXRoIHRoZSBtYXBwaW5nIGtleSBhcyB0aGUga2V5LgotCSAqCi0JICogQHBhcmFtIGZhY3RvcnkgVGhlIFVJIGZhY3RvcnkgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSByaWdodCBjb21wb3NpdGUKLQkgKiBmb3IgYW55IG1hcHBpbmcgdHlwZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgYmVpbmcgZGlzcGxheWVkCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB2YXJpb3VzIHdpZGdldHMKLQkgKiBAcmV0dXJuIFRoZSBjb21wb3NpdGUgZGlzcGxheWluZyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgY2VydGFpbiBtYXBwaW5nCi0JICovCi0JSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL2phdmEvSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL2phdmEvSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NzU0ZTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9qYXZhL0phdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248VCBleHRlbmRzIFR5cGVNYXBwaW5nPgotCWV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50VHlwZSwgVD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIG1hcHBpbmcgdHlwZS4KLQkgKiBUaGlzIHdpbGwgYmUgZGlzcGxheWVkIGJ5IHRoZSA8Y29kZT5QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlPC9jb2RlPiB3aGVuCi0JICogdGhlIG1hcHBpbmcga2V5IG1hdGNoZXMgdGhlIGtleSBnaXZlbiBieSB0aGlzIHByb3ZpZGVyLiBUaGUgY29tcG9zaXRlcwotCSAqIHdpbGwgYmUgc3RvcmVkIGluIGEgTWFwIHdpdGggdGhlIG1hcHBpbmcga2V5IGFzIHRoZSBrZXkuCi0JICoKLQkgKiBAcGFyYW0gZmFjdG9yeSBUaGUgVUkgZmFjdG9yeSByZXNwb25zaWJsZSB0byBjcmVhdGUgdGhlIHJpZ2h0IGNvbXBvc2l0ZQotCSAqIGZvciBhbnkgbWFwcGluZyB0eXBlCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCBiZWluZyBkaXNwbGF5ZWQKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEByZXR1cm4gVGhlIGNvbXBvc2l0ZSBkaXNwbGF5aW5nIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBjZXJ0YWluIG1hcHBpbmcKLQkgKi8KLQlKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL2phdmEvSmF2YVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9qYXZhL0phdmFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThmOWJkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL2phdmEvSmF2YVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFVzZSB7QGxpbmsgSmF2YVVpRmFjdG9yeX0gdG8gY3JlYXRlIGFueSBqYXZhIEpQQSBjb21wb3NpdGVzCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4KLSAqIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nCi0gKiBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdAotICogY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVWlGYWN0b3J5Ci17CQotCQotCS8vICoqKioqKioqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGEgPGNvZGU+SmF2YU1hcHBlZFN1cGVyY2xhc3M8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWFwcGVkIHN1cGVyY2xhc3MKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGFuIDxjb2RlPkphdmFFbnRpdHk8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgamF2YSBlbnRpdHkKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVudGl0eUNvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkphdmFFbWJlZGRhYmxlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGVtYmVkZGFibGUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGFibGVDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIG9ybSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1NYXBwZWRTdXBlcmNsYXNzPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG1hcHBlZCBzdXBlcmNsYXNzCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtRW50aXR5PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG9ybSBlbnRpdHkKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW50aXR5Q29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1FbWJlZGRhYmxlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGVtYmVkZGFibGUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkYWJsZUNvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBqYXZhIGF0dHJpYnV0ZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5KYXZhSWRNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIElEIG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUlkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkphdmFFbWJlZGRlZElkTWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBlbWJlZGRlZCBJRCBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGEgPGNvZGU+SmF2YUJhc2ljTWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBiYXNpYyBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFCYXNpY01hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5KYXZhVmVyc2lvbk1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdmVyc2lvbiBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFWZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGEgPGNvZGU+SmF2YU1hbnlUb09uZU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWFueSB0byBvbmUgbWFwcGluZwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5KYXZhT25lVG9NYW55TWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBvbmUgdG8gbWFueSBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkphdmFPbmVUb09uZU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgb25lIHRvIG9uZSBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5KYXZhTWFueVRvTWFueU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWFueSB0byBtYW55IG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5KYXZhRW1iZWRkZWRNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGVtYmVkZGVkIG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkphdmFUcmFuc2llbnRNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRyYW5zaWVudCBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YVRyYW5zaWVudE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9vcm0vT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9vcm0vT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTdmZGUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvb3JtL09ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxUIGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4KLQlleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgVD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIG1hcHBpbmcgdHlwZS4KLQkgKiBUaGlzIHdpbGwgYmUgZGlzcGxheWVkIGJ5IHRoZSA8Y29kZT5QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U8L2NvZGU+Ci0JICogd2hlbiB0aGUgbWFwcGluZyBrZXkgbWF0Y2hlcyB0aGUga2V5IGdpdmVuIGJ5IHRoaXMgcHJvdmlkZXIuIFRoZQotCSAqIGNvbXBvc2l0ZXMgd2lsbCBiZSBzdG9yZWQgaW4gYSBNYXAgd2l0aCB0aGUgbWFwcGluZyBrZXkgYXMgdGhlIGtleS4KLQkgKgotCSAqIEBwYXJhbSBmYWN0b3J5IFRoZSBVSSBmYWN0b3J5IHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSB0aGUgcmlnaHQgY29tcG9zaXRlCi0JICogZm9yIGFueSBtYXBwaW5nIHR5cGUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IGJlaW5nIGRpc3BsYXllZAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHJldHVybiBUaGUgY29tcG9zaXRlIGRpc3BsYXlpbmcgdGhlIGluZm9ybWF0aW9uIGZvciBhIGNlcnRhaW4gbWFwcGluZwotCSAqLwotCUpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL29ybS9Pcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9vcm0vT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0OWE3Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL29ybS9Pcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBUeXBlTWFwcGluZz4KLQlleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsIFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHRoYXQgY29ycmVwb25kcyB0byB0aGlzIG1hcHBpbmcgdHlwZS4KLQkgKiBUaGlzIHdpbGwgYmUgZGlzcGxheWVkIGJ5IHRoZSA8Y29kZT5QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlPC9jb2RlPiB3aGVuCi0JICogdGhlIG1hcHBpbmcga2V5IG1hdGNoZXMgdGhlIGtleSBnaXZlbiBieSB0aGlzIHByb3ZpZGVyLiBUaGUgY29tcG9zaXRlcwotCSAqIHdpbGwgYmUgc3RvcmVkIGluIGEgTWFwIHdpdGggdGhlIG1hcHBpbmcga2V5IGFzIHRoZSBrZXkuCi0JICoKLQkgKiBAcGFyYW0gZmFjdG9yeSBUaGUgVUkgZmFjdG9yeSByZXNwb25zaWJsZSB0byBjcmVhdGUgdGhlIHJpZ2h0IGNvbXBvc2l0ZQotCSAqIGZvciBhbnkgbWFwcGluZyB0eXBlCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCBiZWluZyBkaXNwbGF5ZWQKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEByZXR1cm4gVGhlIGNvbXBvc2l0ZSBkaXNwbGF5aW5nIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBjZXJ0YWluIG1hcHBpbmcKLQkgKi8KLQlKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvb3JtL09ybVhtbFVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9vcm0vT3JtWG1sVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZWI3YzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9vcm0vT3JtWG1sVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFVzZSB7QGxpbmsgT3JtWG1sVWlGYWN0b3J5fSB0byBjcmVhdGUgYW55IE9STSBKUEEgY29tcG9zaXRlcwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuCi0gKiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZwotICogYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QKLSAqIGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5CYXNlSnBhVWlGYWN0b3J5Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtWG1sVWlGYWN0b3J5Ci17Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBvcm0gdHlwZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtTWFwcGVkU3VwZXJjbGFzczwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBtYXBwZWQgc3VwZXJjbGFzcwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGFuIDxjb2RlPk9ybUVudGl0eTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBvcm0gZW50aXR5Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVudGl0eUNvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtRW1iZWRkYWJsZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBlbWJlZGRhYmxlCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVtYmVkZGFibGVDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCi0JLy8gKioqKioqKioqKioqKioqKiBvcm0gYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtSWRNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIElEIG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlT3JtSWRNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtRW1iZWRkZWRJZE1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgZW1iZWRkZWQgSUQgbWFwcGluZwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGVkSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtQmFzaWNNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJhc2ljIG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtVmVyc2lvbk1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdmVyc2lvbiBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1NYW55VG9PbmVNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG1hbnkgdG8gb25lIG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1PbmVUb01hbnlNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG9uZSB0byBtYW55IG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlT3JtT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1PbmVUb09uZU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgb25lIHRvIG9uZSBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGFuIDxjb2RlPk9ybU1hbnlUb01hbnlNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG1hbnkgdG8gbWFueSBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtRW1iZWRkZWRNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGVtYmVkZGVkIG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtVHJhbnNpZW50TWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0cmFuc2llbnQgbWFwcGluZwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVHJhbnNpZW50TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9BYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhMWY5My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9BYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBbGwgdGhlIHN0YXRlIGluIHRoZSBKUEEgcGxhdGZvcm0gdWkgcHJvdmlkZXIgc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZQotICogaXQgaXMgaW5pdGlhbGl6ZWQpLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgaW1wbGVtZW50cyBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKLXsKLQlwcml2YXRlIEpwYURldGFpbHNQcm92aWRlcltdIGRldGFpbHNQcm92aWRlcnM7Ci0KLQlwcml2YXRlIFJlc291cmNlVWlEZWZpbml0aW9uW10gcmVzb3VyY2VVaURlZmluaXRpb25zOwotCQotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRldGFpbHMgcHJvdmlkZXJzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SnBhRGV0YWlsc1Byb3ZpZGVyPiBkZXRhaWxzUHJvdmlkZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPEpwYURldGFpbHNQcm92aWRlcj4oZ2V0RGV0YWlsc1Byb3ZpZGVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBKcGFEZXRhaWxzUHJvdmlkZXJbXSBnZXREZXRhaWxzUHJvdmlkZXJzKCkgewotCQlpZiAodGhpcy5kZXRhaWxzUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCXRoaXMuZGV0YWlsc1Byb3ZpZGVycyA9IHRoaXMuYnVpbGREZXRhaWxzUHJvdmlkZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZGV0YWlsc1Byb3ZpZGVyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhRGV0YWlsc1Byb3ZpZGVyW10gYnVpbGREZXRhaWxzUHJvdmlkZXJzKCkgewotCQlBcnJheUxpc3Q8SnBhRGV0YWlsc1Byb3ZpZGVyPiBwcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PEpwYURldGFpbHNQcm92aWRlcj4oKTsKLQkJdGhpcy5hZGREZXRhaWxzUHJvdmlkZXJzVG8ocHJvdmlkZXJzKTsKLQkJcmV0dXJuIHByb3ZpZGVycy50b0FycmF5KG5ldyBKcGFEZXRhaWxzUHJvdmlkZXJbcHJvdmlkZXJzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudCB0aGlzIHRvIHNwZWNpZnkgSlBBIGRldGFpbHMgcHJvdmlkZXJzLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZERldGFpbHNQcm92aWRlcnNUbyhMaXN0PEpwYURldGFpbHNQcm92aWRlcj4gcHJvdmlkZXJzKTsKLQkKLQkKLQkKLQkvLyAqKioqKioqKioqIHN0cnVjdHVyZSBwcm92aWRlcnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYXRvcjxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gcmVzb3VyY2VVaURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPFJlc291cmNlVWlEZWZpbml0aW9uPihnZXRSZXNvdXJjZVVpRGVmaW5pdGlvbnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUmVzb3VyY2VVaURlZmluaXRpb25bXSBnZXRSZXNvdXJjZVVpRGVmaW5pdGlvbnMoKSB7Ci0JCWlmICh0aGlzLnJlc291cmNlVWlEZWZpbml0aW9ucyA9PSBudWxsKSB7Ci0JCQl0aGlzLnJlc291cmNlVWlEZWZpbml0aW9ucyA9IHRoaXMuYnVpbGRSZXNvdXJjZVVpRGVmaW5pdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVVpRGVmaW5pdGlvbnM7Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlVWlEZWZpbml0aW9uW10gYnVpbGRSZXNvdXJjZVVpRGVmaW5pdGlvbnMoKSB7Ci0JCUFycmF5TGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlVWlEZWZpbml0aW9uPigpOwotCQl0aGlzLmFkZFJlc291cmNlVWlEZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKLQkJcmV0dXJuIGRlZmluaXRpb25zLnRvQXJyYXkobmV3IFJlc291cmNlVWlEZWZpbml0aW9uW2RlZmluaXRpb25zLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudCB0aGlzIHRvIHNwZWNpZnkgSlBBIG1hcHBpbmcgZmlsZSB1aSBkZWZpbml0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRSZXNvdXJjZVVpRGVmaW5pdGlvbnNUbyhMaXN0PFJlc291cmNlVWlEZWZpbml0aW9uPiBkZWZpbml0aW9ucyk7Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9FZGl0b3JQYXJ0QWRhcHRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0VkaXRvclBhcnRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDc2ODU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0VkaXRvclBhcnRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIGJ1aWxkIGFkYXB0ZXJzIGZvciBhIGVkaXRvciBwYXJ0OgotICogICAtIEpQQSBmaWxlIChpZiB0aGUgZWRpdG9yIHBhcnQgaXMgYSBmaWxlIGVkaXRvciBldGMuKQotICogCi0gKiBTZWUgb3JnLmVjbGlwc2UuanB0LnVpIHBsdWdpbi54bWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JQYXJ0QWRhcHRlckZhY3RvcnkKLQlpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gQURBUFRFUl9MSVNUID0gbmV3IENsYXNzW10geyBKcGFGaWxlLmNsYXNzIH07Ci0KLQlwdWJsaWMgQ2xhc3M8Pz5bXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIEFEQVBURVJfTElTVDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0QWRhcHRlcigoSUVkaXRvclBhcnQpIGFkYXB0YWJsZU9iamVjdCwgYWRhcHRlclR5cGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldEFkYXB0ZXIoSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgQ2xhc3M8Pz4gYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IEpwYUZpbGUuY2xhc3MpIHsKLQkJCXJldHVybiB0aGlzLmdldEpwYUZpbGUoZWRpdG9yUGFydCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBKcGFGaWxlIGdldEpwYUZpbGUoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkgewotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBlZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiB0aGlzLmdldEpwYUZpbGUoKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEpwYUZpbGUgZ2V0SnBhRmlsZShJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGaWxlKGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCkpOwotCX0KLQotCXByaXZhdGUgSnBhRmlsZSBnZXRKcGFGaWxlKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0dlbmVyaWNKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0dlbmVyaWNKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiOTJjMWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvR2VuZXJpY0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5HZW5lcmljSmF2YVJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOwotCi0vKioKLSAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIEpQQSBwbGF0Zm9ybSBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlCi0gKiBpdCBpcyBpbml0aWFsaXplZCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSnBhUGxhdGZvcm1VaVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBHZW5lcmljSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBHZW5lcmljSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZXRhaWxzIHByb3ZpZGVycyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGV0YWlsc1Byb3ZpZGVyc1RvKExpc3Q8SnBhRGV0YWlsc1Byb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VVaURlZmluaXRpb25zVG8oTGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gZGVmaW50aW9ucykgewotCQlkZWZpbnRpb25zLmFkZChHZW5lcmljSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbnRpb25zLmFkZChPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmludGlvbnMuYWRkKFBlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0ltYWdlUmVwb3NpdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSW1hZ2VSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YzFlY2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSW1hZ2VSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgSW1hZ2VSZXBvc2l0b3J5IHsKLQotCS8vICoqKioqIG92ZXJsYXlzICoqKioqCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRFcnJvck92ZXJsYXlJbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIEVSUk9SX09WRVJMQVlfREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBFUlJPUl9PVkVSTEFZX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigib3ZlcmxheXMvZXJyb3IuZ2lmIik7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldFdhcm5pbmdPdmVybGF5SW1hZ2UoUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlyZXR1cm4gZ2V0SW1hZ2UocmVzb3VyY2VNYW5hZ2VyLCBXQVJOSU5HX09WRVJMQVlfREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBXQVJOSU5HX09WRVJMQVlfREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJvdmVybGF5cy93YXJuaW5nLnBuZyIpOwotCi0JLy8gKioqKiogYnV0dG9ucyAqKioqKgotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0QWRkQnV0dG9uSW1hZ2UoUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlyZXR1cm4gZ2V0SW1hZ2UocmVzb3VyY2VNYW5hZ2VyLCBBRERfQlVUVE9OX0RFU0NSSVBUT1IpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgQUREX0JVVFRPTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoImJ1dHRvbnMvYWRkLnBuZyIpOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRFZGl0QnV0dG9uSW1hZ2UoUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlyZXR1cm4gZ2V0SW1hZ2UocmVzb3VyY2VNYW5hZ2VyLCBFRElUX0JVVFRPTl9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIEVESVRfQlVUVE9OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigiYnV0dG9ucy9lZGl0LnBuZyIpOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXREZWxldGVCdXR0b25JbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIERFTEVURV9CVVRUT05fREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERUxFVEVfQlVUVE9OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigiYnV0dG9ucy9kZWxldGUucG5nIik7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldE1vdmVVcEJ1dHRvbkltYWdlKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJcmV0dXJuIGdldEltYWdlKHJlc291cmNlTWFuYWdlciwgTU9WRV9VUF9CVVRUT05fREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBNT1ZFX1VQX0JVVFRPTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoImJ1dHRvbnMvbW92ZS11cC5wbmciKTsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0TW92ZURvd25CdXR0b25JbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIE1PVkVfRE9XTl9CVVRUT05fREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBNT1ZFX0RPV05fQlVUVE9OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigiYnV0dG9ucy9tb3ZlLWRvd24ucG5nIik7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEV4cGFuZEFsbEJ1dHRvbkltYWdlKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJcmV0dXJuIGdldEltYWdlKHJlc291cmNlTWFuYWdlciwgRVhQQU5EX0FMTF9CVVRUT05fREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBFWFBBTkRfQUxMX0JVVFRPTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoImJ1dHRvbnMvZXhwYW5kLWFsbC5wbmciKTsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0Q29sbGFwc2VBbGxCdXR0b25JbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIENPTExBUFNFX0FMTF9CVVRUT05fREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBDT0xMQVBTRV9BTExfQlVUVE9OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigiYnV0dG9ucy9jb2xsYXBzZS1hbGwucG5nIik7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldFJlc3RvcmVEZWZhdWx0c0J1dHRvbkltYWdlKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJcmV0dXJuIGdldEltYWdlKHJlc291cmNlTWFuYWdlciwgUkVTVE9SRV9ERUZBVUxUU19CVVRUT05fREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBSRVNUT1JFX0RFRkFVTFRTX0JVVFRPTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoImJ1dHRvbnMvcmVzdG9yZS1kZWZhdWx0cy5wbmciKTsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0QnJvd3NlQnV0dG9uSW1hZ2UoUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlyZXR1cm4gZ2V0SW1hZ2UocmVzb3VyY2VNYW5hZ2VyLCBCUk9XU0VfQlVUVE9OX0RFU0NSSVBUT1IpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgQlJPV1NFX0JVVFRPTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoImJ1dHRvbnMvYnJvd3NlLnBuZyIpOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRNaW5pQnJvd3NlQnV0dG9uSW1hZ2UoUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlyZXR1cm4gZ2V0SW1hZ2UocmVzb3VyY2VNYW5hZ2VyLCBNSU5JX0JST1dTRV9CVVRUT05fREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBNSU5JX0JST1dTRV9CVVRUT05fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJidXR0b25zL2Jyb3dzZS1taW5pLnBuZyIpOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRTZWxlY3RBbGxCdXR0b25JbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIFNFTEVDVF9BTExfQlVUVE9OX0RFU0NSSVBUT1IpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgU0VMRUNUX0FMTF9CVVRUT05fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJidXR0b25zL3NlbGVjdC1hbGwucG5nIik7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldERlc2VsZWN0QWxsQnV0dG9uSW1hZ2UoUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlyZXR1cm4gZ2V0SW1hZ2UocmVzb3VyY2VNYW5hZ2VyLCBERVNFTEVDVF9BTExfQlVUVE9OX0RFU0NSSVBUT1IpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTRUxFQ1RfQUxMX0JVVFRPTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoImJ1dHRvbnMvZGVzZWxlY3QtYWxsLnBuZyIpOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRBZGRDb25uZWN0aW9uQnV0dG9uSW1hZ2UoUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlyZXR1cm4gZ2V0SW1hZ2UocmVzb3VyY2VNYW5hZ2VyLCBBRERfQ09OTkVDVElPTl9CVVRUT05fREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBBRERfQ09OTkVDVElPTl9CVVRUT05fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJidXR0b25zL2FkZC1jb25uZWN0aW9uLmdpZiIpOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRSZWNvbm5lY3RCdXR0b25JbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIFJFQ09OTkVDVF9CVVRUT05fREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBSRUNPTk5FQ1RfQlVUVE9OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigiYnV0dG9ucy9yZWNvbm5lY3QucG5nIik7Ci0KLQkvLyAqKioqKiBvYmplY3RzICoqKioqCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRGaWxlSW1hZ2UoUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlyZXR1cm4gZ2V0SW1hZ2UocmVzb3VyY2VNYW5hZ2VyLCBGSUxFX0RFU0NSSVBUT1IpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRklMRV9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoIm9iamVjdHMvZmlsZS5wbmciKTsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0Rm9sZGVySW1hZ2UoUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlyZXR1cm4gZ2V0SW1hZ2UocmVzb3VyY2VNYW5hZ2VyLCBGT0xERVJfREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBGT0xERVJfREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJvYmplY3RzL2ZvbGRlci5wbmciKTsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0UGFja2FnZUltYWdlKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJcmV0dXJuIGdldEltYWdlKHJlc291cmNlTWFuYWdlciwgUEFDS0FHRV9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIFBBQ0tBR0VfREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJvYmplY3RzL3BhY2thZ2UucG5nIik7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldFRhYmxlSW1hZ2UoUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlyZXR1cm4gZ2V0SW1hZ2UocmVzb3VyY2VNYW5hZ2VyLCBUQUJMRV9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIFRBQkxFX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigib2JqZWN0cy90YWJsZS5naWYiKTsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0VGFibGVPYmpJbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIFRBQkxFX09CSl9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIFRBQkxFX09CSl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoIm9iamVjdHMvdGFibGVfb2JqLmdpZiIpOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIENPTFVNTl9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIENPTFVNTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoIm9iamVjdHMvY29sdW1uLmdpZiIpOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRLZXlDb2x1bW5JbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIEtFWV9DT0xVTU5fREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBLRVlfQ09MVU1OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigib2JqZWN0cy9jb2x1bW5LZXkuZ2lmIik7Ci0KLQotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBidWlsZEltYWdlRGVzY3JpcHRvcihTdHJpbmcgZmlsZU5hbWUpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihKcHRVaVBsdWdpbi5QTFVHSU5fSUQsICJpbWFnZXMvIiArIGZpbGVOYW1lKTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIEltYWdlIGdldEltYWdlKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIsIEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiByZXNvdXJjZU1hbmFnZXIuY3JlYXRlSW1hZ2UoZGVzY3JpcHRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcGFIZWxwQ29udGV4dElkcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnBhSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYzMThkZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcGFIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIERhbGkgSlBBIFVJLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlCi0gKiBpbXBsZW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIEpwYUhlbHBDb250ZXh0SWRzIHsKLQotCS8vQ29udGV4dElEIHByZWZpeAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IEpwdFVpUGx1Z2luLlBMVUdJTl9JRCArICIuIjsKLQotCS8vUGVyc2lzdGVudCBUeXBlIGNvbXBvc2l0ZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQUNDRVNTX1RZUEUgPSBQUkVGSVggKyAiZW50aXR5X2FjY2Vzc1R5cGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9BVFRSSUJVVEVfT1ZFUlJJREVTID0gUFJFRklYICsgImVudGl0eV9hdHRyaWJ1dGVPdmVycmlkZXMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9BVFRSSUJVVEVfT1ZFUlJJREVTX0NPTFVNTiA9IFBSRUZJWCArICJlbnRpdHlfYXR0cmlidXRlT3ZlcnJpZGVzQ29sdW1uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQ0FUQUxPRyA9IFBSRUZJWCArICJlbnRpdHlfY2F0YWxvZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0lOSEVSSVRBTkNFX1NUUkFURUdZID0gUFJFRklYICsgImVudGl0eV9pbmhlcml0YW5jZVN0cmF0ZWd5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfSU5IRVJJVEFOQ0VfRElTQ1JJTUlOQVRPUl9UWVBFID0gUFJFRklYICsgImVudGl0eV9pbmhlcml0YW5jZURpc2NyaW1pbmF0b3JUeXBlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfSU5IRVJJVEFOQ0VfRElTQ1JJTUlOQVRPUl9DT0xVTU4gPSBQUkVGSVggKyAiZW50aXR5X2luaGVyaXRhbmNlRGlzY3JpbWluYXRvckNvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0lOSEVSSVRBTkNFX0RJU0NSSU1JTkFUT1JfVkFMVUUgPSBQUkVGSVggKyAiZW50aXR5X2luaGVyaXRhbmNlRGlzY3JpbWluYXRvclZhbHVlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfTkFNRSA9IFBSRUZJWCArICJlbnRpdHlfbmFtZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX09STV9QQUNLQUdFID0gUFJFRklYICsgIm9ybV9wYWNrYWdlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfT1JNX1NDSEVNQSA9IFBSRUZJWCArICJvcm1fc2NoZW1hIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfT1JNX0NBVEFMT0cgPSBQUkVGSVggKyAib3JtX2NhdGFsb2ciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9PUk1fQUNDRVNTID0gUFJFRklYICsgIm9ybV9hY2Nlc3MiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9PUk1fREVMSU1JVEVEX0lERU5USUZJRVJTID0gUFJFRklYICsgIm9ybV9kZWxpbWl0ZWRfaWRlbnRpZmllcnMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9PUk1fQ0FTQ0FERSA9IFBSRUZJWCArICJvcm1fY2FzY2FkZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX09STV9YTUwgPSBQUkVGSVggKyAib3JtX3htbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1NDSEVNQSA9IFBSRUZJWCArICJlbnRpdHlfc2NoZW1hIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEFCTEUgPSBQUkVGSVggKyAiZW50aXR5X3RhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQ0FDSEVBQkxFID0gUFJFRklYICsgImVudGl0eV9jYWNoZWFibGUiOwotCi0JLy9QZXJzaXN0ZW50IEF0dHJpYnV0ZSBjb21wb3NpdGVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DQVNDQURFX1RZUEUgPSBQUkVGSVggKyAibWFwcGluZ19jYXNjYWRlVHlwZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DT0xVTU4gPSBQUkVGSVggKyAibWFwcGluZ19jb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ09MVU1OX0lOU0VSVEFCTEUgPSBQUkVGSVggKyAibWFwcGluZ19jb2x1bW5JbnNlcnRhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0NPTFVNTl9MRU5HVEggPSBQUkVGSVggKyAibWFwcGluZ19jb2x1bW5MZW5ndGgiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ09MVU1OX05VTExBQkxFID0gUFJFRklYICsgIm1hcHBpbmdfY29sdW1uTnVsbGFibGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ09MVU1OX1BSRUNJU0lPTiA9IFBSRUZJWCArICJtYXBwaW5nX2NvbHVtblByZWNpc2lvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DT0xVTU5fU0NBTEUgPSBQUkVGSVggKyAibWFwcGluZ19jb2x1bW5TY2FsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DT0xVTU5fVEFCTEUgPSBQUkVGSVggKyAibWFwcGluZ19jb2x1bW5UYWJsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DT0xVTU5fVU5JUVVFID0gUFJFRklYICsgIm1hcHBpbmdfY29sdW1uVW5pcXVlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0NPTFVNTl9VUERBVEFCTEU9IFBSRUZJWCArICJtYXBwaW5nX2NvbHVtblVwZGF0YWJsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19FTUJFRERFRF9BVFRSSUJVVEVfT1ZFUlJJREVTID0gUFJFRklYICsgIm1hcHBpbmdfZW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfRU1CRURERURfQVRUUklCVVRFX09WRVJSSURFU19DT0xVTU4gPSBQUkVGSVggKyAibWFwcGluZ19lbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19FTlVNRVJBVEVEID0gUFJFRklYICsgIm1hcHBpbmdfZW51bWVyYXRlZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19GRVRDSF9UWVBFID0gUFJFRklYICsgIm1hcHBpbmdfZmV0Y2hUeXBlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0dFTkVSQVRFRF9WQUxVRV9TVFJBVEVHWSA9IFBSRUZJWCArICJtYXBwaW5nX2dlbmVyYXRlZFZhbHVlU3RyYXRlZ3kiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfR0VORVJBVEVEX1ZBTFVFX0dFTkVSQVRPUl9OQU1FID0gUFJFRklYICsgIm1hcHBpbmdfZ2VuZXJhdGVkVmFsdWVHZW5lcmF0b3JOYW1lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0pPSU5fQ09MVU1OX05BTUUgPSBQUkVGSVggKyAibWFwcGluZ19qb2luQ29sdW1uTmFtZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19KT0lOX1JFRkVSRU5DRURfQ09MVU1OID0gUFJFRklYICsgIm1hcHBpbmdfam9pblJlZmVyZW5jZWRDb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfSk9JTl9UQUJMRV9OQU1FID0gUFJFRklYICsgIm1hcHBpbmdfam9pblRhYmxlTmFtZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19KT0lOX1RBQkxFX1NDSEVNQSA9IFBSRUZJWCArICJtYXBwaW5nX2pvaW5UYWJsZVNjaGVtYSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19KT0lOX1RBQkxFX0NBVEFMT0cgPSBQUkVGSVggKyAibWFwcGluZ19qb2luVGFibGVDYXRhbG9nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0pPSU5fVEFCTEVfQ09MVU1OUyA9IFBSRUZJWCArICJtYXBwaW5nX2pvaW5UYWJsZUpvaW5Db2x1bW5zIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0pPSU5fVEFCTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMgPSBQUkVGSVggKyAibWFwcGluZ19qb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtbnMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfTE9CID0gUFJFRklYICsgIm1hcHBpbmdfbG9iIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX01BUF9BUyA9IFBSRUZJWCArICJtYXBwaW5nX21hcEFzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX01BUFBFRF9CWSA9IFBSRUZJWCArICJtYXBwaW5nX21hcHBlZEJ5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX05BTUVEX05BVElWRV9RVUVSSUVTID0gIm5hbWVkX25hdGl2ZV9xdWVyaWVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX05BTUVEX1FVRVJJRVMgPSBQUkVGSVggKyAibmFtZWRfcXVlcmllcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19PUFRJT05BTCA9IFBSRUZJWCArICJtYXBwaW5nX29wdGlvbmFsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX09SREVSX0JZID0gUFJFRklYICsgIm1hcHBpbmdfb3JkZXJCeSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19PUkRFUl9CWV9OT19PUkRFUklORyA9IFBSRUZJWCArICJtYXBwaW5nX29yZGVyQnlOb09yZGVyaW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX09SREVSX0JZX1BSSU1BUllfS0VZX09SREVSSU5HID0gUFJFRklYICsgIm1hcHBpbmdfb3JkZXJCeVByaW1hcnlLZXlPcmRlcmluZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19PUkRFUl9CWV9DVVNUT01fT1JERVJJTkcgPSBQUkVGSVggKyAibWFwcGluZ19vcmRlckJ5Q3VzdG9tT3JkZXJpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfT1JERVJfQ09MVU1OX09SREVSSU5HID0gUFJFRklYICsgIm1hcHBpbmdfb3JkZXJDb2x1bW5PcmRlcmluZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19PUkRFUl9DT0xVTU5fT1JERVJJTkdfQ09MVU1OID0gUFJFRklYICsgIm1hcHBpbmdfb3JkZXJDb2x1bW5PcmRlcmluZ0NvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19QUklNQVJZX0tFWV9HRU5FUkFUSU9OID0gUFJFRklYICsgIm1hcHBpbmdfcHJpbWFyeUtleUdlbmVyYXRpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfU0VRVUVOQ0VfR0VORVJBVE9SID0gUFJFRklYICsgIm1hcHBpbmdfc2VxdWVuY2VHZW5lcmF0b3IiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfU0VRVUVOQ0VfR0VORVJBVE9SX05BTUUgPSBQUkVGSVggKyAibWFwcGluZ19zZXF1ZW5jZUdlbmVyYXRvck5hbWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfU0VRVUVOQ0VfR0VORVJBVE9SX1NFUVVFTkNFID0gUFJFRklYICsgIm1hcHBpbmdfc2VxdWVuY2VHZW5lcmF0b3JTZXF1ZW5jZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQUJMRV9HRU5FUkFUT1IgPSBQUkVGSVggKyAibWFwcGluZ190YWJsZUdlbmVyYXRvciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfQ0FUQUxPRyA9IFBSRUZJWCArICJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yQ2F0YWxvZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfTkFNRSA9IFBSRUZJWCArICJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yTmFtZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfUFJJTUFSWV9LRVlfQ09MVU1OID0gUFJFRklYICsgIm1hcHBpbmdfdGFibGVHZW5lcmF0b3JQcmltYXJ5S2V5Q29sdW1uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9QUklNQVJZX0tFWV9DT0xVTU5fVkFMVUUgPSBQUkVGSVggKyAibWFwcGluZ190YWJsZUdlbmVyYXRvclByaW1hcnlLZXlDb2x1bW5WYWx1ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfU0NIRU1BID0gUFJFRklYICsgIm1hcHBpbmdfdGFibGVHZW5lcmF0b3JTY2hlbWEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1RBQkxFPSBQUkVGSVggKyAibWFwcGluZ190YWJsZUdlbmVyYXRvclRhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9WQUxVRV9DT0xVTU4gPSBQUkVGSVggKyAibWFwcGluZ190YWJsZUdlbmVyYXRvclZhbHVlQ29sdW1uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1RBUkdFVF9FTlRJVFkgPSBQUkVGSVggKyAibWFwcGluZ190YXJnZXRFbnRpdHkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEVNUE9SQUwgPSBQUkVGSVggKyAibWFwcGluZ190ZW1wb3JhbCI7Ci0KLQkvL1Byb2plY3QgcHJvcGVydGllcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfSkFWQV9QRVJTSVNURU5DRSA9IFBSRUZJWCArICJwcm9wZXJ0aWVzX2phdmFQZXJzaXN0ZW5jZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19KQVZBX1BFUlNJU1RFTkNFX0NPTk5FQ1RJT04gPSBQUkVGSVggKyAicHJvcGVydGllc19qYXZhUGVyc2lzdGVuY2VDb25uZWN0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0pBVkFfUEVSU0lTVEVOQ0VfU0NIRU1BID0gUFJFRklYICsgInByb3BlcnRpZXNfamF2YVBlcnNpc3RlbmNlU2NoZW1hIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0pBVkFfUEVSU0lTVEVOQ0VfTUVUQU1PREVMID0gUFJFRklYICsgInByb3BlcnRpZXNfY2Fub25pY2FsTWV0YW1vZGVsIjsKLQkKLQkvL0RpYWxvZ3MsIFdpemFyZHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfQ1JFQVRFX09STSA9IFBSRUZJWCArICJkaWFsb2dfY3JlYXRlT1JNIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfRURJVF9JTlZFUlNFX0pPSU5fQ09MVU5OID0gUFJFRklYICsgImRpYWxvZ19lZGl0SW52ZXJzZUpvaW5Db2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19HRU5FUkFURV9FTlRJVElFUyA9IFBSRUZJWCArICJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0dFTkVSQVRFX0VOVElUSUVTX1NPVVJDRSA9IFBSRUZJWCArICJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllc19zb3VyY2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19HRU5FUkFURV9FTlRJVElFU19QQUNLQUdFID0gUFJFRklYICsgImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzX3BhY2thZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19HRU5FUkFURV9FTlRJVElFU19UQUJMRVMgPSBQUkVGSVggKyAiZGlhbG9nX2dlbmVyYXRlRW50aXRpZXNfdGFibGVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfSlBBX0ZBQ0VUID0gUFJFRklYICsgImRpYWxvZ19KUEFGYWNldCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0pQQV9QTEFURk9STSA9IFBSRUZJWCArICJkaWFsb2dfSlBBUGxhdGZvcm0iOwotCQotCS8vTmV3IEpQQSBQcm9qZWN0IHdpemFyZDoKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfSlBBX1BST0pFQ1QgPSBQUkVGSVggKyAiZGlhbG9nX25ld0pQQVByb2plY3QiOwotIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfSlBBX1BST0pFQ1RfQ09OVEVOVF9QQUdFX0NMQVNTUEFUSCA9IFBSRUZJWCArICJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlX2NsYXNzcGF0aCI7Ci0gCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfREFUQUJBU0UgPSBQUkVGSVggKyAiZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZV9kYXRhYmFzZSI7Ci0gCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfUEFDS0FHSU5HID0gUFJFRklYICsgImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2VfcGFja2FnaW5nIjsKLSAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9QUk9KRUNUX0NSRUFUSU9OX1BBR0UgPSBQUkVGSVggKyAiZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9QUk9KRUNUX0pQQV9GQUNFVCA9IFBSRUZJWCArICJkaWFsb2dfbmV3SlBBUHJvamVjdEZhY2V0IjsKLQotCS8vT3RoZXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9PVVRMSU5FID0gUFJFRklYICsgInBlcnNpc3RlbmNlT3V0bGluZSI7Ci0KLQkvL1BlcnNpc3RlbmNlIFhtbCBFZGl0b3IKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTiA9IFBSRUZJWCArICJwZXJzaXN0ZW5jZV9jb25uZWN0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9YTUxfR0VORVJBTCA9IFBSRUZJWCArICJwZXJzaXN0ZW5jZV9nZW5lcmFsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9YTUxfUFJPUEVSVElFUyAgPSBQUkVGSVggKyAicGVyc2lzdGVuY2VfcHJvcGVydGllcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX1NPVVJDRSAgPSBQUkVGSVggKyAicGVyc2lzdGVuY2Vfc291cmNlIjsKLQotCS8vTmV3IEpQQSBFbnRpdHkgd2l6YXJkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9FTlRJVFlfRU5USVRZX0NMQVNTICA9IFBSRUZJWCArICJkaWFsb2dfZW50aXR5Q2xhc3NQYWdlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfSlBBX0VOVElUWV9FTlRJVFlfUFJPUEVSVElFUyAgPSBQUkVGSVggKyAiZGlhbG9nX2VudGl0eVByb3BlcnRpZXNQYWdlIjsKLQkKLQkvL0dlbmVyYXRlIEVudGl0aWVzIFdpemFyZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9BU1NPQ0lBVElPTl9DQVJESU5BTElUWSA9IFBSRUZJWCArICJkaWFsb2dfYXNzb2NpYXRpb25DYXJkaW5hbGl0eVBhZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9BU1NPQ0lBVElPTl9UQUJMRVMgPSBQUkVGSVggKyAiZGlhbG9nX2Fzc29jaWF0aW9uVGFibGVzUGFnZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX0NVU1RPTUlaRV9ERUZBVUxUX0VOVElUWV9HRU5FUkFUSU9OID0gUFJFRklYICsgImRpYWxvZ19jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX0NVU1RPTUlaRV9JTkRJVklEVUFMX0VOVElUSUVTID0gUFJFRklYICsgImRpYWxvZ19jdXN0b21pemVJbmRpdmlkdWFsRW50aXRpZXMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9KT0lOX0NPTFVNTlMgPSBQUkVGSVggKyAiZGlhbG9nX2pvaW5Db2x1bW5zUGFnZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX1NFTEVDVF9DQVNDQURFID0gUFJFRklYICsgImRpYWxvZ19zZWxlY3RDYXNjYWRlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9FTlRJVElFU19XSVpBUkRfU0VMRUNUX1RBQkxFUyA9IFBSRUZJWCArICJkaWFsb2dfc2VsZWN0VGFibGVzUGFnZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX1RBQkxFX0FTU09DSUFUSU9OUyA9IFBSRUZJWCArICJkaWFsb2dfdGFibGVBc3NvY2lhdGlvbnNQYWdlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ09MTEVDVElPTl9UQUJMRV9OQU1FID0gUFJFRklYICsgIm1hcHBpbmdfY29sbGVjdGlvblRhYmxlTmFtZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DT0xMRUNUSU9OX1RBQkxFX1NDSEVNQSA9IFBSRUZJWCArICJtYXBwaW5nX2NvbGxlY3Rpb25UYWJsZVNjaGVtYSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DT0xMRUNUSU9OX1RBQkxFX0NBVEFMT0cgPSBQUkVGSVggKyAibWFwcGluZ19jb2xsZWN0aW9uVGFibGVDYXRhbG9nIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0VMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1MgPSBQUkVGSVggKyAibWFwcGluZ19lbGVtZW50Q29sbGVjdGlvblRhcmdldENsYXNzIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwYUphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnBhSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMzU3NjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnBhSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29tcGxldGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLkNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5KYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEpQQSBKYXZhIGNvZGUtY29tcGxldGlvbiBwcm9wb3NhbCBjb21wdXRlcgotICovCi1wdWJsaWMgY2xhc3MgSnBhSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIGltcGxlbWVudHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciB7Ci0KLQlwdWJsaWMgSnBhSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlc3Npb25TdGFydGVkKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gKGNvbnRleHQgaW5zdGFuY2VvZiBKYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0KSA/Ci0JCQkJCXRoaXMuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoKEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQpIGNvbnRleHQpCi0JCQkJOgotCQkJCQlDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSBmYWlsIHNpbGVudGx5IGhlcmUgYmVjYXVzZSAoaXQgc2VlbXMpIDxlbT5leHBlY3RlZDwvZW0+IGV4Y2VwdGlvbnMgb2NjdXIKLQkgKiBtb3JlIGZyZXF1ZW50bHkgdGhhbiBpbnRlcm1pdHRlbnQgPGVtPnVuZXhwZWN0ZWQ8L2VtPiBleGNlcHRpb25zIHRoYXQgbWlnaHQKLQkgKiBtZXJpdCBpbnZlc3RpZ2F0aW9uIChhbmQgYSBsb2dnZWQgc3RhY2t0cmFjZSBtaWdodCBiZSB0aGUgb25seSBoaW50IGFzCi0JICogdG8gd2hhdCBoYXBwZW5lZCkuCi0JICogPHA+Ci0JICogV2Ugd2lsbCBnZXQgYW4gPGVtPmV4cGVjdGVkPC9lbT4gZXhjZXB0aW9uICh0eXBpY2FsbHkgYSB7QGxpbmsgTnVsbFBvaW50ZXJFeGNlcHRpb24gTlBFfSkKLQkgKiBoZXJlIGlmIHRoZSB1c2VyOjxvbD4KLQkgKiA8bGk+bW9kaWZpZXMgdGhlIEphdmEgc291cmNlIGZpbGUgaW4gYSB3YXkgdGhhdCBwdXRzIGl0IGRyYXN0aWNhbGx5IG91dAotCSAqICAgICBvZiBzeW5jIHdpdGggdGhlIERhbGkgY29udGV4dCBtb2RlbCAoZS5nLiBkZWxldGluZyBhIGZpZWxkIG9yCi0JICogICAgIGFubm90YXRpb24pCi0JICogPGxpPmltbWVkaWF0ZWx5IGludm9rZXMgQ29udGVudCBBc3Npc3QgKHR5cGljYWxseSA8Y29kZT5DdHJsK1NwYWNlPC9jb2RlPikKLQkgKiA8L29sPgotCSAqIFRoZSBBU1Qgd2UgYnVpbGQgaGVyZSB3aWxsIGJlIGJhc2VkIG9uIHRoZSBqdXN0LW1vZGlmaWVkIEphdmEgc291cmNlOyBidXQsCi0JICogc2luY2UgdGhlIHVzZXIgbW92ZWQgcXVpY2tseSBhbmQgd2Ugd2lsbCBub3QgaGF2ZSB5ZXQgcmVjZWl2ZWQgYW55IEphdmEKLQkgKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIChzaW5jZSB3ZSBvbmx5IGdldCBhIEphdmEgY2hhbmdlIG5vdGlmaWNhdGlvbiB3aGVuCi0JICogdGhlIHVzZXIgaGFzIHBhdXNlZCB0eXBpbmcgZm9yIGF0IGxlYXN0IDAuNSBzZWNvbmRzKSwgdGhlIGNvbnRleHQgbW9kZWwKLQkgKiB3aWxsIHN0aWxsIGJlIGJhc2VkIG9uIHRoZSB1bm1vZGlmaWVkIEphdmEgc291cmNlLiBBcyB0aGUgbmV3IEFTVCBpcwotCSAqIHBhc3NlZCBkb3duIHRocm91Z2ggdGhlIGNvbnRleHQgbW9kZWwgdG8gdGhlIHJlc291cmNlIG1vZGVsIGFsbCB0aGUgY29kZQotCSAqIGV4cGVjdHMgdG8gZmluZCB0aGUgQVNUIGluIHN5bmMgd2l0aCB0aGUgbW9kZWwuIFdoZW4gdGhpcyBpcyBub3QgdGhlCi0JICogY2FzZSAoZS5nLiBhIGZpZWxkIGluIHRoZSByZXNvdXJjZSBtb2RlbCBpcyBubyBsb25nZXIgcHJlc2VudCBpbiB0aGUgQVNUCi0JICogYmVjYXVzZSB0aGUgdXNlciBoYXMgZGVsZXRlZCBpdCBvciBtb2RpZmllZCB0aGUgY29kZSBpbiBzdWNoIGEgd2F5IHRoYXQKLQkgKiB0aGUgcGFyc2VyIGNhbiBubyBsb25nZXIgZGV0ZWN0IHRoZSBmaWVsZCkgdGhlIG1vZGVsIHdpbGwgcHJvYmFibHkgY2hva2UKLQkgKiB3aGVuIGl0IGNhbm5vdCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIEFTVCBub2RlLgotCSAqIDxwPgotCSAqIEl0IHNlZW1zIHJlYXNvbmFibGUsIGluIHRoZXNlIHNpdHVhdGlvbnMsIHRvIHNpbXBseSByZXR1cm4gbm8gY29tcGxldGlvbgotCSAqIHByb3Bvc2Fscy4gSWYgdGhlIHVzZXIgc2ltcGx5IHdhaXRzIGEgbW9tZW50IGFuZCB0cmllcyBhZ2Fpbiwgd2Ugd2lsbCBiZQotCSAqIGFibGUgdG8gc3VjY2Vzc2Z1bGx5IGNhbGN1bGF0ZSBzb21lIHByb3Bvc2Fscy4KLQkgKiA8cD4KLQkgKiB+Ymp2Ci0JICovCi0JcHJpdmF0ZSBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHNfKGNvbnRleHQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCS8vIEpwdENvcmVQbHVnaW4ubG9nKGV4KTsgIC8vIGRvbid0IGxvZyAiZXhwZWN0ZWQiIGV4Y2VwdGlvbnMgKD8pCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHNfKEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYgKGN1ID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCi0JCUlGaWxlIGZpbGUgPSB0aGlzLmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZShjdSk7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCi0JCUpwYUZpbGUganBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQkJaWYgKGpwYUZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCQotCQlDb2xsZWN0aW9uPEpwYVN0cnVjdHVyZU5vZGU+IHJvb3RTdHJ1Y3R1cmVOb2RlcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkpOwotCQlpZiAocm9vdFN0cnVjdHVyZU5vZGVzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0KLQkJQ29tcGxldGlvbkNvbnRleHQgY2MgPSBjb250ZXh0LmdldENvcmVDb250ZXh0KCk7Ci0KLQkJLy8gdGhlIGNvbnRleHQncyAidG9rZW4iIGlzIHJlYWxseSBhIHNvcnQgb2YgInByZWZpeCIgLSBpdCBkb2VzIE5PVAotCQkvLyBjb3JyZXNwb25kIHRvIHRoZSAic3RhcnQiIGFuZCAiZW5kIiB3ZSBnZXQgYmVsb3cuLi4gCi0JCWNoYXJbXSBwcmVmaXggPSBjYy5nZXRUb2tlbigpOwotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSAoKHByZWZpeCA9PSBudWxsKSA/IEZpbHRlci5OdWxsLjxTdHJpbmc+aW5zdGFuY2UoKSA6IG5ldyBJZ25vcmVDYXNlUHJlZml4RmlsdGVyKHByZWZpeCkpOwotCQkvLyB0aGUgdG9rZW4gInN0YXJ0IiBpcyB0aGUgb2Zmc2V0IG9mIHRoZSB0b2tlbidzIGZpcnN0IGNoYXJhY3RlcgotCQlpbnQgdG9rZW5TdGFydCA9IGNjLmdldFRva2VuU3RhcnQoKTsKLQkJLy8gdGhlIHRva2VuICJlbmQiIGlzIHRoZSBvZmZzZXQgb2YgdGhlIHRva2VuJ3MgbGFzdCBjaGFyYWN0ZXIgKHl1aykKLQkJaW50IHRva2VuRW5kID0gY2MuZ2V0VG9rZW5FbmQoKTsKLQkJaWYgKHRva2VuU3RhcnQgPT0gLTEpIHsgIC8vIG5vdCBzdXJlIHdoeSB0aGlzIGhhcHBlbnMgLSBzZWUgYnVnIDI0MjI4NgotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0KLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oInByZWZpeDogIiArICgocHJlZml4ID09IG51bGwpID8gIltudWxsXSIgOiBuZXcgU3RyaW5nKHByZWZpeCkpKTsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oInRva2VuIHN0YXJ0OiAiICsgdG9rZW5TdGFydCk7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJ0b2tlbiBlbmQ6ICIgKyB0b2tlbkVuZCk7Ci0vLwkJU3RyaW5nIHNvdXJjZSA9IGN1LmdldFNvdXJjZSgpOwotLy8JCVN0cmluZyB0b2tlbiA9IHNvdXJjZS5zdWJzdHJpbmcoTWF0aC5tYXgoMCwgdG9rZW5TdGFydCksIE1hdGgubWluKHNvdXJjZS5sZW5ndGgoKSwgdG9rZW5FbmQgKyAxKSk7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJ0b2tlbjogPT4iICsgdG9rZW4gKyAiPD0iKTsKLS8vCQlTdHJpbmcgc25pcHBldCA9IHNvdXJjZS5zdWJzdHJpbmcoTWF0aC5tYXgoMCwgdG9rZW5TdGFydCAtIDIwKSwgTWF0aC5taW4oc291cmNlLmxlbmd0aCgpLCB0b2tlbkVuZCArIDIxKSk7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJzdXJyb3VuZGluZyBzbmlwcGV0OiA9PiIgKyBzbmlwcGV0ICsgIjw9Iik7Ci0KLQkJLy8gVE9ETyBtb3ZlIHRoaXMgcGFyc2VyIGNhbGwgaW50byB0aGUgbW9kZWwuLi4KLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBBU1RUb29scy5idWlsZEFTVFJvb3QoY3UpOwotCQlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKLQkJZm9yIChKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUgOiByb290U3RydWN0dXJlTm9kZXMpIHsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSAoKEphdmFQZXJzaXN0ZW50VHlwZSkgc3RydWN0dXJlTm9kZSkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoY29udGV4dC5nZXRJbnZvY2F0aW9uT2Zmc2V0KCksIGZpbHRlciwgYXN0Um9vdCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVN0cmluZyBzID0gc3RyZWFtLm5leHQoKTsKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwocywgdG9rZW5TdGFydCwgdG9rZW5FbmQgLSB0b2tlblN0YXJ0ICsgMSwgcy5sZW5ndGgoKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9wb3NhbHM7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZSBnZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQl0cnkgewotCQkJcmV0dXJuIChJRmlsZSkgY3UuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKENvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXNzaW9uRW5kZWQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJZ25vcmVDYXNlUHJlZml4RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyPFN0cmluZz4gewotCQlwcml2YXRlIGZpbmFsIGNoYXJbXSBwcmVmaXg7Ci0JCUlnbm9yZUNhc2VQcmVmaXhGaWx0ZXIoY2hhcltdIHByZWZpeCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucHJlZml4ID0gcHJlZml4OwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKHMudG9DaGFyQXJyYXkoKSwgdGhpcy5wcmVmaXgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcGFNYXBwaW5nSW1hZ2VIZWxwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwYU1hcHBpbmdJbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTZjNmRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwYU1hcHBpbmdJbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIKLXsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgaW1hZ2VGb3JUeXBlTWFwcGluZyhTdHJpbmcgbWFwcGluZ0tleSkgewotCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoaWNvbktleUZvclR5cGVNYXBwaW5nKG1hcHBpbmdLZXkpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpY29uS2V5Rm9yVHlwZU1hcHBpbmcoU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJaWYgKE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSA9PSBtYXBwaW5nS2V5KSB7Ci0JCQlyZXR1cm4gSnB0VWlJY29ucy5OVUxMX1RZUEVfTUFQUElORzsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWS5lcXVhbHMobWFwcGluZ0tleSkpIHsKLQkJCXJldHVybiBKcHRVaUljb25zLkVOVElUWTsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0VWlJY29ucy5FTUJFRERBQkxFOwotCQl9Ci0JCWVsc2UgaWYgKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0VWlJY29ucy5NQVBQRURfU1VQRVJDTEFTUzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhTdHJpbmcgbWFwcGluZ0tleSkgewotCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoaWNvbktleUZvckF0dHJpYnV0ZU1hcHBpbmcobWFwcGluZ0tleSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGljb25LZXlGb3JBdHRyaWJ1dGVNYXBwaW5nKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCWlmIChNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9PSBtYXBwaW5nS2V5KSB7Ci0JCQlyZXR1cm4gSnB0VWlJY29ucy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HOwotCQl9Ci0JCWVsc2UgaWYgKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWS5lcXVhbHMobWFwcGluZ0tleSkpIHsKLQkJCXJldHVybiBKcHRVaUljb25zLkJBU0lDOwotCQl9Ci0JCWVsc2UgaWYgKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWS5lcXVhbHMobWFwcGluZ0tleSkpIHsKLQkJCXJldHVybiBKcHRVaUljb25zLklEOwotCQl9Ci0JCWVsc2UgaWYgKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdFVpSWNvbnMuVkVSU0lPTjsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0VWlJY29ucy5FTUJFRERFRF9JRDsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0VWlJY29ucy5FTUJFRERFRDsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWS5lcXVhbHMobWFwcGluZ0tleSkpIHsKLQkJCXJldHVybiBKcHRVaUljb25zLk9ORV9UT19PTkU7Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdFVpSWNvbnMuT05FX1RPX01BTlk7Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdFVpSWNvbnMuTUFOWV9UT19PTkU7Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWS5lcXVhbHMobWFwcGluZ0tleSkpIHsKLQkJCXJldHVybiBKcHRVaUljb25zLk1BTllfVE9fTUFOWTsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdFVpSWNvbnMuRUxFTUVOVF9DT0xMRUNUSU9OOwotCQl9Ci0JCWVsc2UgaWYgKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0VWlJY29ucy5UUkFOU0lFTlQ7Ci0JCX0KLQkJLy9yZXR1cm4gdGhlIEpQQV9DT05URU5UIGljb24gaW5zdGVhZCBvZiBudWxsLCBtaWdodCBhcyB3ZWxsIGhhdmUgYW4gaWNvbiBpZiBvbmUgaXMgbm90IGRlZmluZWQKLQkJcmV0dXJuIEpwdFVpSWNvbnMuSlBBX0NPTlRFTlQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnB0VWlJY29ucy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnB0VWlJY29ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWFhYTcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwdFVpSWNvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogIENvbnRyaWJ1dG9yczoKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkltYWdlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnB0VWlJY29ucwotewotICAgIC8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgU1dUIGltYWdlIHRoYXQgaXMgYSBncmF5ZWQgb3V0IHZlcnNpb24gb2YgdGhlIGltYWdlIAotCSAqIGNvcnJlc3BvbmRpbmcgIHRvIHRoZSBwYXNzZWQgaW4ga2V5LiBTdG9yZXMgdGhpcyBncmF5IGltYWdlIGluIHRoZSBKcHRVaVBsdWdpbiAKLQkgKiBJbWFnZVJlZ2lzdHJ5IHdpdGggLWdyYXkgYXBwZW5kZWQgdG8gdGhlIGtleS4KLQkgKiBDbGllbnRzIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBub3QgZGlzcG9zZSBvZiB0aGUgaW1hZ2UuCi0JICogCi0JICogQHJldHVybiBhIG5ldyBncmF5ZWQgb3V0IGltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnaG9zdChTdHJpbmcga2V5KSB7Ci0JCUltYWdlIGV4aXN0aW5nSW1hZ2UgPSBKcHRVaVBsdWdpbi5pbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5ICsgIi1ncmF5Iik7Ci0JCWlmIChleGlzdGluZ0ltYWdlICE9IG51bGwpIHsKLQkJCXJldHVybiBleGlzdGluZ0ltYWdlOwotCQl9Ci0KLQkJSW1hZ2UgZ3JheUltYWdlID0gYnVpbGRHaG9zdEltYWdlKGtleSk7Ci0JCUpwdFVpUGx1Z2luLmluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXkgKyAiLWdyYXkiLCBncmF5SW1hZ2UpOwotCQlyZXR1cm4gZ3JheUltYWdlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBidWlsZEdob3N0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlJbWFnZSBvcmlnaW5hbEltYWdlID0gSnB0VWlQbHVnaW4uZ2V0SW1hZ2Uoa2V5KTsKLQkJQ29sb3IgbGlnaHRHcmF5ID0gbmV3IENvbG9yKG9yaWdpbmFsSW1hZ2UuZ2V0RGV2aWNlKCksIDIyMywgMjIzLCAyMjMpOwotCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gSW1hZ2VVdGlsaXRpZXMuY3JlYXRlU2hhZGVkSW1hZ2Uob3JpZ2luYWxJbWFnZSwgbGlnaHRHcmF5KTsKLQotCQlJbWFnZSBzaGFkZWRJbWFnZSA9IG5ldyBJbWFnZShvcmlnaW5hbEltYWdlLmdldERldmljZSgpLCBpbWFnZURhdGEpOwotCQlJbWFnZSBncmF5SW1hZ2UgPSBuZXcgSW1hZ2Uob3JpZ2luYWxJbWFnZS5nZXREZXZpY2UoKSwgc2hhZGVkSW1hZ2UsIFNXVC5JTUFHRV9HUkFZKTsKLQotCQlsaWdodEdyYXkuZGlzcG9zZSgpOwotCQlzaGFkZWRJbWFnZS5kaXNwb3NlKCk7Ci0JCXJldHVybiBncmF5SW1hZ2U7Ci0JfQkKLQotCi0JLy8gKioqKioqKioqKioqKioqKiBHZW5lcmFsIEpQQSBpY29ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9DT05URU5UID0gImZ1bGwvb2JqMTYvanBhLWNvbnRlbnQiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9GSUxFID0gImZ1bGwvb2JqMTYvanBhLWZpbGUiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9GSUxFID0gImZ1bGwvb2JqMTYvanBhLWphci1maWxlIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HID0gImZ1bGwvb2JqMTYvd2FybmluZyI7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBXaXphcmQgaWNvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9XSVpfQkFOTkVSID0gImZ1bGwvd2l6YmFuL25ld19qcGFfcHJqX3dpeiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1dJWl9CQU5ORVIgPSAiZnVsbC93aXpiYW4vbmV3X2VudGl0eV93aXpiYW4iOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9GSUxFX1dJWl9CQU5ORVIgPSAiZnVsbC93aXpiYW4vbmV3X2pwYV9maWxlX3dpemJhbiI7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBQZXJzaXN0ZW5jZSBpY29ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0UgPSAiZnVsbC9vYmoxNi9wZXJzaXN0ZW5jZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUID0gImZ1bGwvb2JqMTYvcGVyc2lzdGVuY2UtdW5pdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0ZJTEVfUkVGID0gImZ1bGwvb2JqMTYvanBhLWZpbGUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfUkVGID0gImZ1bGwvb2JqMTYvbnVsbC10eXBlLW1hcHBpbmciOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9GSUxFX1JFRiA9ICJmdWxsL29iajE2L2pwYS1qYXItZmlsZSI7Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogT3JtIGljb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9NQVBQSU5HUyA9ICJmdWxsL29iajE2L2VudGl0eS1tYXBwaW5ncyI7Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogT3JtL0phdmEgY29tbW9uIGljb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSAiZnVsbC9vYmoxNi9lbnRpdHkiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEREFCTEUgPSAiZnVsbC9vYmoxNi9lbWJlZGRhYmxlIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfU1VQRVJDTEFTUyA9ICJmdWxsL29iajE2L21hcHBlZC1zdXBlcmNsYXNzIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX1RZUEVfTUFQUElORyA9ICJmdWxsL29iajE2L251bGwtdHlwZS1tYXBwaW5nIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJmdWxsL29iajE2L2lkIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERFRF9JRCA9ICJmdWxsL29iajE2L2VtYmVkZGVkLWlkIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQyA9ICJmdWxsL29iajE2L2Jhc2ljIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gImZ1bGwvb2JqMTYvdmVyc2lvbiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOWV9UT19PTkUgPSAiZnVsbC9vYmoxNi9tYW55LXRvLW9uZSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1RPX01BTlkgPSAiZnVsbC9vYmoxNi9vbmUtdG8tbWFueSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1RPX09ORSA9ICJmdWxsL29iajE2L29uZS10by1vbmUiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTllfVE9fTUFOWSA9ICJmdWxsL29iajE2L21hbnktdG8tbWFueSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DT0xMRUNUSU9OID0gImZ1bGwvb2JqMTYvZWxlbWVudC1jb2xsZWN0aW9uIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERFRCA9ICJmdWxsL29iajE2L2VtYmVkZGVkIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0lFTlQgPSAiZnVsbC9vYmoxNi90cmFuc2llbnQiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfQVRUUklCVVRFX01BUFBJTkcgPSAiZnVsbC9vYmoxNi9udWxsLWF0dHJpYnV0ZS1tYXBwaW5nIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwdFVpTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwdFVpTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwN2VmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBVSS4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpwdFVpTWVzc2FnZXMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hvb3NlclBhbmVfYnJvd3NlQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjY2Vzc1R5cGVDb21wb3NpdGVfYWNjZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjY2Vzc1R5cGVDb21wb3NpdGVfZmllbGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWNjZXNzVHlwZUNvbXBvc2l0ZV9wcm9wZXJ0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRUb0VhckNvbXBvc2l0ZV9lYXJNZW1iZXJTaGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFRvRWFyQ29tcG9zaXRlX2FkZFRvRWFyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkVG9FYXJDb21wb3NpdGVfZWFyUHJvamVjdExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFRvRWFyQ29tcG9zaXRlX25ld0J1dHRvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfYXR0cmlidXRlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ19tYXBwaW5nTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ19ub01hcHBpbmdLZXlFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc0RpYWxvZ19tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc0RpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NOb3RGb3VuZFdhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2R1cGxpY2F0ZUNsYXNzV2FybmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfbWFwcGluZ0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19ub0NsYXNzRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX25vTWFwcGluZ0tleUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRSZW1vdmVQYW5lX0FkZEJ1dHRvblRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUmVtb3ZlUGFuZV9SZW1vdmVCdXR0b25UZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc0Nob29zZXJQYW5lX2RpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0pwYV9jb252ZXJ0aW5nUHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9KcGFfZGV0ZWN0aW5nVGVjaG5vbG9naWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2Vfc2NoZW1hU2V0dGluZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2FkZENvbm5lY3Rpb25Ub1Byb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2Nvbm5lY3RMaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV9zY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2Nvbm5lY3Rpb25JbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV9zY2hlbWFJbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudW1Db21ib1ZpZXdlcl9kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudW1Db21ib1ZpZXdlcl9kZWZhdWx0V2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3Jfb3BlbmluZ0VkaXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmFsX2Jyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmFsX3JldmVydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmFsX2Rlc2VsZWN0QWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYWxfc2VsZWN0QWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRERMV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfZ2VuZXJhdGVFbnRpdGllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9jaG9vc2VFbnRpdHlUYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9lbnRpdHlOYW1lQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX2dlbmVyYXRlRW50aXRpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2Vfc3luY2hyb25pemVDbGFzc2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX3RhYmxlQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX3RhYmxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmljUGxhdGZvcm1VaURpYWxvZ19ub3RTdXBwb3J0ZWRNZXNzYWdlVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmljUGxhdGZvcm1VaURpYWxvZ19ub3RTdXBwb3J0ZWRNZXNzYWdlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhQ29udGVudF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFEZXRhaWxzVmlld192aWV3Tm90QXZhaWxhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9hZGREcml2ZXJMaWJyYXJ5TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3RMaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0ZWRUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9jcmVhdGVPcm1YbWxCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2RlZmF1bHRDYXRhbG9nTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2RlZmF1bHRTY2hlbWFMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2Rpc2NvdmVyQ2xhc3Nlc0J1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfZHJpdmVyTGlicmFyeUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9mYWNldHNQYWdlTGluazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfbWV0YW1vZGVsU291cmNlRm9sZGVyTGluazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfanBhSW1wbGVtZW50YXRpb25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfanBhUHJlZnNMaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9saXN0Q2xhc3Nlc0J1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfbWV0YW1vZGVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX292ZXJyaWRlRGVmYXVsdENhdGFsb2dMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2Vfb3ZlcnJpZGVEZWZhdWx0U2NoZW1hTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX3BlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfcGxhdGZvcm1MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2Vfc3BlY2lmeUxpYkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfdXNlckxpYnNMaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV91c2VyU2VydmVyTGliTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbFBhbmVsX2luY2x1ZGVMaWJyYXJpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9hbm5vdGF0ZUluSmF2YVJhZGlvQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tYXBwaW5nRmlsZVJhZGlvQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tYXBwaW5nRmlsZUxpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21hcHBpbmdGaWxlQnJvd3NlQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV90eXBlVGFibGVDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21hcHBpbmdUYWJsZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfbGlzdEluUGVyc2lzdGVuY2VYbWxDaGVja0JveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2Vfc2VsZWN0ZWRUeXBlc1BlcnNpc3RlbnRFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfbWFwcGluZ0ZpbGVEb2VzTm90RXhpc3RFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfbWFwcGluZ0ZpbGVOb3RMaXN0ZWRJblBlcnNpc3RlbmNlWG1sRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhU3RydWN0dXJlVmlld19saW5rV2l0aEVkaXRvckRlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhU3RydWN0dXJlVmlld19saW5rV2l0aEVkaXRvclRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhU3RydWN0dXJlVmlld19saW5rV2l0aEVkaXRvclRvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhU3RydWN0dXJlVmlld19zdHJ1Y3R1cmVOb3RBdmFpbGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhU3RydWN0dXJlVmlld19udW1JdGVtc1NlbGVjdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9uZXdGaWxlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9uZXdGaWxlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX29wdGlvbnNfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX29wdGlvbnNfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZFBhZ2VfcHJvamVjdExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9zb3VyY2VGb2xkZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZFBhZ2VfZmlsZVBhdGhMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZFBhZ2VfYWNjZXNzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2FkZFRvUGVyc2lzdGVuY2VVbml0QnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9wZXJzaXN0ZW5jZVVuaXRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZFBhZ2VfaW5jb3JyZWN0U291cmNlRm9sZGVyRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2FjY2Vzc0xhYmVsX3NvdXJjZUZvbGRlckRpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9hY2Nlc3NMYWJlbF9zb3VyY2VGb2xkZXJEaWFsb2dEZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVByb2plY3RXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5X2VudGl0eU1hcHBpbmdzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhY2thZ2VDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhY2thZ2VDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeV9wZXJzaXN0ZW5jZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0aWVzR2VuZXJhdG9yX2pvYk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhUHJlZmVyZW5jZXNQYWdlX0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVByb2JsZW1TZXZlcml0aWVzUGFnZV9EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX0lnbm9yZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfSW5mbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfV2FybmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RKcGFPcm1NYXBwaW5nRmlsZURpYWxvZ19uZXdCdXR0b247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X3VpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdFVpTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIEpwdFVpTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVmYmI0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9MRVZFTF9DQVRFR09SWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOT19KUEFfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9KRUNUX05PX0NPTk5FQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9JTlZBTElEX0NPTk5FQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9JTkFDVElWRV9DT05ORUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfTk9fUEVSU0lTVEVOQ0VfWE1MOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9WRVJTSU9OX05PVF9MQVRFU1Q7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9NVUxUSVBMRV9QRVJTSVNURU5DRV9YTUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfTk9fUEVSU0lTVEVOQ0VfVU5JVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9NVUxUSVBMRV9QRVJTSVNURU5DRV9VTklUUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9YTUxfSU5WQUxJRF9DT05URU5UOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9MRVZFTF9DQVRFR09SWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX01BUFBJTkdfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX1VOU1VQUE9SVEVEX01BUFBJTkdfRklMRV9DT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfTUFQUElOR19GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfSU5WQUxJRF9NQVBQSU5HX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfTUFQUElOR19GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfQ0xBU1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9DTEFTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX0lOVkFMSURfQ0xBU1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfQ0xBU1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9SRURVTkRBTlRfQ0xBU1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfSkFSX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9KQVJfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX0pBUl9GSUxFX0RFUExPWU1FTlRfUEFUSF9XQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfSkFSX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQUElOR19GSUxFX0VYVFJBTkVPVVNfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5UX1RZUEVfTUFQUEVEX0JVVF9OT1RfSU5DTFVERURfSU5fUEVSU0lTVEVOQ0VfVU5JVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5UX1RZUEVfQU5OT1RBVEVEX0JVVF9OT1RfSU5DTFVERURfSU5fUEVSU0lTVEVOQ0VfVU5JVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5UX1RZUEVfVU5TUEVDSUZJRURfQ0xBU1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOVF9UWVBFX1VOUkVTT0xWRURfQ0xBU1M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX0xFVkVMX0NBVEVHT1JZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9OT19QSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfU0lOR0xFX1RBQkxFX0RFU0NFTkRBTlRfREVGSU5FU19UQUJMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfQUJTVFJBQ1RfVEFCTEVfUEVSX0NMQVNTX0RFRklORVNfVEFCTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX0FCU1RSQUNUX0RJU0NSSU1JTkFUT1JfVkFMVUVfREVGSU5FRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfVEFCTEVfUEVSX0NMQVNTX0RJU0NSSU1JTkFUT1JfVkFMVUVfREVGSU5FRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfTk9OX1JPT1RfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfVEFCTEVfUEVSX0NMQVNTX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0RFRklORUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX0ZJTkFMX0NMQVNTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfTUFQUElOR19NRU1CRVJfQ0xBU1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX0NMQVNTX01JU1NJTkdfTk9fQVJHX0NPTlNUUlVDVE9SOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfTUFQUElOR19DTEFTU19QUklWQVRFX05PX0FSR19DT05TVFJVQ1RPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9VTlNQRUNJRklFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9JTkhFUklURURfQVRUUklCVVRFU19OT1RfU1VQUE9SVEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfTUFQUElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9GSU5BTF9GSUVMRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9GSU5BTF9HRVRURVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfUFVCTElDX0ZJRUxEOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVRUUklCVVRFX0xFVkVMX0NBVEVHT1JZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUFBJTkdfVU5SRVNPTFZFRF9NQVBQRURfQlk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQUElOR19JTlZBTElEX01BUFBFRF9CWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNQVBQSU5HX01BUFBFRF9CWV9XSVRIX0pPSU5fVEFCTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQUElOR19NQVBQRURfQllfT05fQk9USF9TSURFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUQVJHRVRfRU5USVRZX05PVF9ERUZJTkVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBUkdFVF9FTlRJVFlfSVNfTk9UX0FOX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNQVBTX0lEX1ZBTFVFX05PVF9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQU19JRF9WQUxVRV9OT1RfUkVTT0xWRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQU19JRF9WQUxVRV9JTlZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9SREVSX0NPTFVNTl9BTkRfT1JERVJfQllfQk9USF9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19OT1RfREVGSU5FRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX01VU1RfQkVfRU1CRUREQUJMRV9PUl9CQVNJQ19UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVMRU1FTlRfQ09MTEVDVElPTl9NQVBfS0VZX0NMQVNTX05PVF9ERUZJTkVEOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERBVEFCQVNFX0NBVEVHT1JZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBQkxFX0NBVEVHT1JZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTFVNTl9DQVRFR09SWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPVkVSUklERVNfQ0FURUdPUlk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU1QTElFRF9BVFRSSUJVVEVfTEVWRUxfQ0FURUdPUlk7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBQkxFX1VOUkVTT0xWRURfU0NIRU1BOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBQkxFX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT0xVTU5fVU5SRVNPTFZFRF9UQUJMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX1NFQ09OREFSWV9UQUJMRV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUF9LRVlfQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPUkRFUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERV9JTlZBTElEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WQUxJRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WQUxJRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX0lTX05PVF9BTl9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfVEFSR0VUX0VOVElUWV9OT1RfREVGSU5FRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0NPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX09SREVSX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19OT1RfREVGSU5FRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX01VU1RfQkVfRU1CRUREQUJMRV9PUl9CQVNJQ19UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9NQVBfS0VZX0NMQVNTX05PVF9ERUZJTkVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0lOVkVSU0VfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOSEVSSVRBTkNFX0NBVEVHT1JZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9TVVBQT1JURURfT05fUExBVEZPUk07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX1RBQkxFX1BFUl9DTEFTU19OT1RfUE9SVEFCTEVfT05fUExBVEZPUk07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRVUVSSUVTX0dFTkVSQVRPUlNfQ0FURUdPUlk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR0VORVJBVE9SX0RVUExJQ0FURV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEX01BUFBJTkdfVU5SRVNPTFZFRF9HRU5FUkFUT1JfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHRU5FUkFURURfVkFMVUVfVU5SRVNPTFZFRF9HRU5FUkFUT1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUVVFUllfRFVQTElDQVRFX05BTUU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X3VpX3ZhbGlkYXRpb25fcHJlZmVyZW5jZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9UcmFjaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9UcmFjaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNjIwODUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvVHJhY2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgdHJhY2luZyBjbGFzcyBtYW5hZ2VzIHRvIGNvbnZlcnQgdGhlIHN0cmluZyB2YWx1ZSBpbnRvIGJvb2xlYW4gdmFsdWVzIG9yCi0gKiBpbnRlZ2VyIHZhbHVlcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYWNpbmcgZGVidWcgZmxhZ3MuIFRob3NlIGZsYWdzCi0gKiBhcmUgc3BlY2lmaWVkIGluIHRoZSAub3B0aW9ucyBmaWxlLiBUaGUgc3VwcG9ydGVkIGtleXMgYXJlIGRlZmluZWQgaGVyZSBhcwotICogY29uc3RhbnRzIGZvciBxdWljayByZWZlcmVuY2UuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIFRyYWNpbmcKLXsKLQkvKioKLQkgKiBBIGNvbnN0YW50IHVzZWQgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCAiL2RlYnVnIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVRyA9ICIvZGVidWciOwotCi0JLyoqCi0JICogQSBjb25zdGFudCB1c2VkIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggIi9kZWJ1Zy91aS9kYiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfREIgPSAiL2RlYnVnL3VpL2RiIjsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgdXNlZCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoICIvZGVidWcvdWkvZGV0YWlsc1ZpZXciLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0RFVEFJTFNfVklFVyA9ICIvZGVidWcvdWkvZGV0YWlsc1ZpZXciOwotCi0JLyoqCi0JICogQSBjb25zdGFudCB1c2VkIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggIi9kZWJ1Zy91aS9sYXlvdXQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0xBWU9VVCA9ICIvZGVidWcvdWkvbGF5b3V0IjsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgdXNlZCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoICIvdW5pdC10ZXN0cyIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5JVF9URVNUUyA9ICIvdW5pdC10ZXN0cyI7Ci0KLQkvKioKLQkgKiBDYW4ndCBpbnN0YW50aWF0ZSB0aGlzIDxjb2RlPlRyYWNpbmc8L2NvZGU+IGNsYXNzLgotCSAqLwotCXByaXZhdGUgVHJhY2luZygpCi0JewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRyYWNpbmcgY2Fubm90IGJlIGluc3RhbnRpYXRlZCIpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVidWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLiBUaGUgZGVmYXVsdAotCSAqIHZhbHVlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBmbGFnIFRoZSBmbGFnIHRvIHJldHJpZXZlIHRoZSBkZWJ1ZyB2YWx1ZSwgd2hpY2ggc2hvdWxkIGJlCi0JICogY29udGFpbmVkIGluIHRoZSAub3B0aW9ucyBmaWxlLCB0aGUgZmxhZyBzaG91bGQgc3RhcnQgd2l0aCAiLyIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBmbGFnIGlzIGFjdGl2ZTsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGJvb2xlYW5EZWJ1Z09wdGlvbihTdHJpbmcgZmxhZykKLQl7Ci0JCXJldHVybiBib29sZWFuRGVidWdPcHRpb24oZmxhZywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVidWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLgotCSAqCi0JICogQHBhcmFtIGZsYWcgVGhlIGZsYWcgdG8gcmV0cmlldmUgdGhlIGRlYnVnIHZhbHVlLCB3aGljaCBzaG91bGQgYmUKLQkgKiBjb250YWluZWQgaW4gdGhlIC5vcHRpb25zIGZpbGUsIHRoZSBmbGFnIHNob3VsZCBzdGFydCB3aXRoICIvIgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiBmbGFnIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGZsYWcgaXMgYWN0aXZlOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYm9vbGVhbkRlYnVnT3B0aW9uKFN0cmluZyBmbGFnLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkKLQl7Ci0JCVN0cmluZyBzdHJpbmcgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKcHRVaVBsdWdpbi5QTFVHSU5fSUQgKyBmbGFnKTsKLQkJcmV0dXJuIChzdHJpbmcgPT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUgOiBCb29sZWFuLnBhcnNlQm9vbGVhbihzdHJpbmcudHJpbSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlYnVnIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmxhZy4gVGhlIGRlZmF1bHQgdmFsdWUKLQkgKiBpcyAwLgotCSAqCi0JICogQHBhcmFtIGZsYWcgVGhlIGZsYWcgdG8gcmV0cmlldmUgdGhlIGRlYnVnIHZhbHVlLCB3aGljaCBzaG91bGQgYmUKLQkgKiBjb250YWluZWQgaW4gdGhlIC5vcHRpb25zIGZpbGUsIHRoZSBmbGFnIHNob3VsZCBzdGFydCB3aXRoICIvIgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmxhZywgb3IgdGhlIGdpdmVuIGRlZmF1bHQKLQkgKiB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGludERlYnVnT3B0aW9uKFN0cmluZyBmbGFnKQotCXsKLQkJcmV0dXJuIGludERlYnVnT3B0aW9uKGZsYWcsIDApOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVidWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLgotCSAqCi0JICogQHBhcmFtIGZsYWcgVGhlIGZsYWcgdG8gcmV0cmlldmUgdGhlIGRlYnVnIHZhbHVlLCB3aGljaCBzaG91bGQgYmUKLQkgKiBjb250YWluZWQgaW4gdGhlIC5vcHRpb25zIGZpbGUsIHRoZSBmbGFnIHNob3VsZCBzdGFydCB3aXRoICIvIgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiBmbGFnIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmxhZywgb3IgdGhlIGdpdmVuIGRlZmF1bHQKLQkgKiB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGludERlYnVnT3B0aW9uKFN0cmluZyBmbGFnLCBpbnQgZGVmYXVsdFZhbHVlKQotCXsKLQkJU3RyaW5nIHN0cmluZyA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEpwdFVpUGx1Z2luLlBMVUdJTl9JRCArIGZsYWcpOwotCQlyZXR1cm4gKHN0cmluZyA9PSBudWxsKSA/ICBkZWZhdWx0VmFsdWUgOiBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gbWVzc2FnZXMsIGFwcGVuZHMgaXQgd2l0aCB0aGlzIHBsdWctaW4gaWQuCi0JICoKLQkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKQotCXsKLQkJU3lzdGVtLm91dC5wcmludCgiWyIgKyBKcHRVaVBsdWdpbi5QTFVHSU5fSUQgKyAiXSAiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVidWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLiBUaGUgZGVmYXVsdCB2YWx1ZQotCSAqIGlzIGFuIGVtcHR5IHN0cmluZy4KLQkgKgotCSAqIEBwYXJhbSBmbGFnIFRoZSBmbGFnIHRvIHJldHJpZXZlIHRoZSBkZWJ1ZyB2YWx1ZSwgd2hpY2ggc2hvdWxkIGJlCi0JICogY29udGFpbmVkIGluIHRoZSAub3B0aW9ucyBmaWxlLCB0aGUgZmxhZyBzaG91bGQgc3RhcnQgd2l0aCAiLyIKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcsIG9yIHRoZSBnaXZlbiBkZWZhdWx0Ci0JICogdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpbmdEZWJ1Z09wdGlvbihTdHJpbmcgZmxhZykKLQl7Ci0JCXJldHVybiBzdHJpbmdEZWJ1Z09wdGlvbihmbGFnLCAiIik7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZWJ1ZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcuCi0JICoKLQkgKiBAcGFyYW0gZmxhZyBUaGUgZmxhZyB0byByZXRyaWV2ZSB0aGUgZGVidWcgdmFsdWUsIHdoaWNoIHNob3VsZCBiZQotCSAqIGNvbnRhaW5lZCBpbiB0aGUgLm9wdGlvbnMgZmlsZSwgdGhlIGZsYWcgc2hvdWxkIHN0YXJ0IHdpdGggIi8iCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqIGdpdmVuIGZsYWcgY291bGQgbm90IGJlIGZvdW5kCi0JICogQHJldHVybiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLCBvciB0aGUgZ2l2ZW4gZGVmYXVsdAotCSAqIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaW5nRGVidWdPcHRpb24oU3RyaW5nIGZsYWcsIFN0cmluZyBkZWZhdWx0VmFsdWUpCi0JewotCQlTdHJpbmcgc3RyaW5nID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oSnB0VWlQbHVnaW4uUExVR0lOX0lEICsgZmxhZyk7Ci0JCXJldHVybiAoc3RyaW5nICE9IG51bGwpID8gc3RyaW5nIDogZGVmYXVsdFZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVERExBY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVERExBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJlNjc1Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRERMQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLQotLyoqCi0gKiAgR2VuZXJhdGVERExBY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlRERMQWN0aW9uIGV4dGVuZHMgUHJvamVjdEFjdGlvbiB7Ci0JCi0JcHVibGljIEdlbmVyYXRlRERMQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRoaXMuZ2V0SnBhUGxhdGZvcm1VaShwcm9qZWN0KS5nZW5lcmF0ZURETChwcm9qZWN0LCB0aGlzLmdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9HZW5lcmF0ZUVudGl0aWVzQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRW50aXRpZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkMmRlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRW50aXRpZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci0KLS8qKgotICogIEdlbmVyYXRlRW50aXRpZXNBY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlRW50aXRpZXNBY3Rpb24gZXh0ZW5kcyBQcm9qZWN0QWN0aW9uIHsKLQlwdWJsaWMgR2VuZXJhdGVFbnRpdGllc0FjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKEpwYVByb2plY3QgcHJvamVjdCkgewotICAgICAgICB0aGlzLmdldEpwYVBsYXRmb3JtVWkocHJvamVjdCkuZ2VuZXJhdGVFbnRpdGllcyhwcm9qZWN0LCB0aGlzLmdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9NYWtlUGVyc2lzdGVudEFjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9NYWtlUGVyc2lzdGVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmNjNTAzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvTWFrZVBlcnNpc3RlbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5KcGFNYWtlUGVyc2lzdGVudFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotCi1wdWJsaWMgY2xhc3MgTWFrZVBlcnNpc3RlbnRBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JCi0JcHJpdmF0ZSBNYXA8SVByb2plY3QsIExpc3Q8SVR5cGU+PiBzZWxlY3RlZFR5cGVzOwotCQotCXB1YmxpYyBNYWtlUGVyc2lzdGVudEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCS8vIGRvIG5vdGhpbmcJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBBY3Rpb24gaXMgY29udHJpYnV0ZWQgZm9yIElUeXBlLCBJQ29tcGlsYXRpb25Vbml0LCBJUGFja2FnZUZyYWdtZW50LCBhbmQgSVBhY2thZ2VGcmFnbWVudFJvb3QgdGhhdCBpcyBhIHNvdXJjZSBmb2xkZXIKLQkJdGhpcy5zZWxlY3RlZFR5cGVzID0gdGhpcy5idWlsZFNlbGVjdGVkVHlwZXMoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcDxJUHJvamVjdCwgTGlzdDxJVHlwZT4+IGJ1aWxkU2VsZWN0ZWRUeXBlcyhTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJTWFwPElQcm9qZWN0LCBMaXN0PElUeXBlPj4gdHlwZXMgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgTGlzdDxJVHlwZT4+KCk7Ci0JCQotCQlmb3IgKE9iamVjdCBzZWxlY3Rpb24gOiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLnRvTGlzdCgpKSB7Ci0JCQlzd2l0Y2ggKCgoSUphdmFFbGVtZW50KSBzZWxlY3Rpb24pLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCQljYXNlIElKYXZhRWxlbWVudC5UWVBFIDoKLQkJCQkJYWRkU2VsZWN0ZWRUeXBlKChJVHlwZSkgc2VsZWN0aW9uLCB0eXBlcyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgotCQkJCQlhZGRTZWxlY3RlZFR5cGUoKElDb21waWxhdGlvblVuaXQpIHNlbGVjdGlvbiwgdHlwZXMpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UIDoKLQkJCQkJYWRkU2VsZWN0ZWRUeXBlKChJUGFja2FnZUZyYWdtZW50KSBzZWxlY3Rpb24sIHR5cGVzKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKLQkJCQkJYWRkU2VsZWN0ZWRUeXBlKChJUGFja2FnZUZyYWdtZW50Um9vdCkgc2VsZWN0aW9uLCB0eXBlcyk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlbGVjdGVkVHlwZShJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290LCBNYXA8SVByb2plY3QsIExpc3Q8SVR5cGU+PiB0eXBlcykgewotCQlmb3IgKElKYXZhRWxlbWVudCBwa2dGcmFnbWVudCA6IGdldFBhY2thZ2VGcmFnbWVudHMocGFja2FnZUZyYWdtZW50Um9vdCkpIHsKLQkJCWFkZFNlbGVjdGVkVHlwZSgoSVBhY2thZ2VGcmFnbWVudCkgcGtnRnJhZ21lbnQsIHR5cGVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRTZWxlY3RlZFR5cGUoSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQsIE1hcDxJUHJvamVjdCwgTGlzdDxJVHlwZT4+IHR5cGVzKSB7Ci0JCWZvciAoSUNvbXBpbGF0aW9uVW5pdCBjb21wVW5pdCA6IGdldENvbXBpbGF0aW9uVW5pdHMocGFja2FnZUZyYWdtZW50KSkgewotCQkJYWRkU2VsZWN0ZWRUeXBlKGNvbXBVbml0LCB0eXBlcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFNlbGVjdGVkVHlwZShJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwgTWFwPElQcm9qZWN0LCBMaXN0PElUeXBlPj4gdHlwZXMpIHsKLQkJYWRkU2VsZWN0ZWRUeXBlKGdldFByaW1hcnlUeXBlKGNvbXBpbGF0aW9uVW5pdCksIHR5cGVzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFNlbGVjdGVkVHlwZShJVHlwZSBwcmltYXJ5VHlwZSwgTWFwPElQcm9qZWN0LCBMaXN0PElUeXBlPj4gdHlwZXNNYXApIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHByaW1hcnlUeXBlLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQlMaXN0PElUeXBlPiB0eXBlcyA9IHR5cGVzTWFwLmdldChwcm9qZWN0KTsKLQkJaWYgKHR5cGVzID09IG51bGwpIHsKLQkJCXR5cGVzID0gbmV3IEFycmF5TGlzdDxJVHlwZT4oKTsKLQkJCXR5cGVzTWFwLnB1dChwcm9qZWN0LCB0eXBlcyk7Ci0JCX0KLQkJaWYgKCF0eXBlcy5jb250YWlucyhwcmltYXJ5VHlwZSkpIHsKLQkJCXR5cGVzLmFkZChwcmltYXJ5VHlwZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXRbXSBnZXRDb21waWxhdGlvblVuaXRzKElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50LmdldENvbXBpbGF0aW9uVW5pdHMoKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gbmV3IElDb21waWxhdGlvblVuaXRbMF07Ci0JfQotCQotCXByaXZhdGUgSUphdmFFbGVtZW50W10gZ2V0UGFja2FnZUZyYWdtZW50cyhJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRDaGlsZHJlbigpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBuZXcgSUphdmFFbGVtZW50WzBdOwotCX0KLQotCXByaXZhdGUgSVR5cGUgZ2V0UHJpbWFyeVR5cGUoSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKLQkJcmV0dXJuIGNvbXBpbGF0aW9uVW5pdC5maW5kUHJpbWFyeVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJZm9yIChMaXN0PElUeXBlPiB0eXBlcyA6IHRoaXMuc2VsZWN0ZWRUeXBlcy52YWx1ZXMoKSkgewotCQkJLy9vcGVuIHRoZSB3aXphcmQgb25jZSBmb3IgZWFjaCBzZWxlY3RlZCBwcm9qZWN0Ci0JCQlKcGFNYWtlUGVyc2lzdGVudFdpemFyZCB3aXphcmQgPSBuZXcgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmQodHlwZXMpOwotCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2codGhpcy5nZXRDdXJyZW50U2hlbGwoKSwgd2l6YXJkKTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTaGVsbCBnZXRDdXJyZW50U2hlbGwoKSB7Ci0JICAgIHJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvT3BlbkpwYVJlc291cmNlQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL09wZW5KcGFSZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmE4YTQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvT3BlbkpwYVJlc291cmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkRlZmF1bHRKcGFTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5CYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotcHVibGljIGNsYXNzIE9wZW5KcGFSZXNvdXJjZUFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbgotewotCXByaXZhdGUgSnBhQ29udGV4dE5vZGUgc2VsZWN0ZWROb2RlOwotCQotCQotCXB1YmxpYyBPcGVuSnBhUmVzb3VyY2VBY3Rpb24oKSB7Ci0JCXN1cGVyKCJPcGVuIik7ICAgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gcykgewotCQlzZWxlY3RlZE5vZGUgPSBudWxsOwotCQkKLQkJaWYgKCEgc3VwZXIudXBkYXRlU2VsZWN0aW9uKHMpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChzLnNpemUoKSAhPSAxKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChzLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgSnBhUm9vdENvbnRleHROb2RlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXNlbGVjdGVkTm9kZSA9IChKcGFDb250ZXh0Tm9kZSkgcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoISBpc0VuYWJsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBzZWxlY3RlZE5vZGUuZ2V0UmVzb3VyY2UoKTsKLQkJCi0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpICYmIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJb3BlbkVkaXRvcigoSUZpbGUpIHJlc291cmNlKTsKLQkJCQkKLQkJCQotCQkJaWYgKHNlbGVjdGVkTm9kZSBpbnN0YW5jZW9mIEpwYVN0cnVjdHVyZU5vZGUpIHsKLQkJCQlKcGFTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXIgPQotCQkJCQlTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeS5nZXRTZWxlY3Rpb25NYW5hZ2VyKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpOwotCQkJCXNlbGVjdGlvbk1hbmFnZXIuc2VsZWN0KG5ldyBEZWZhdWx0SnBhU2VsZWN0aW9uKChKcGFTdHJ1Y3R1cmVOb2RlKSBzZWxlY3RlZE5vZGUpLCBudWxsKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBvcGVuRWRpdG9yKElGaWxlIGZpbGUpIHsKLQkJSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBJREUuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCUlFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TmFtZSgpLCBjb250ZW50VHlwZSk7Ci0JCWlmIChlZGl0b3JEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCXJldHVybjsgIC8vIG5vIGVkaXRvciBhc3NvY2lhdGVkLi4uCi0JCX0KLQkJCi0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCi0JCXRyeSB7Ci0JCQlwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgZWRpdG9yRGVzY3JpcHRvci5nZXRJZCgpKTsKLQkJfSAKLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihwYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIEpwdFVpTWVzc2FnZXMuRXJyb3Jfb3BlbmluZ0VkaXRvciwgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9Qcm9qZWN0QWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1Byb2plY3RBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1YzdlMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1Byb2plY3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBPdmVycmlkZSBhbnkgb2YgdGhlICNleGVjdXRlKCkgbWV0aG9kcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2plY3RBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0gICAgCi0KLQlwdWJsaWMgUHJvamVjdEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldEN1cnJlbnRTZWxlY3Rpb24oKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJcmV0dXJuIChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5jdXJyZW50U2VsZWN0aW9uOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKHRoaXMuY3VycmVudFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIHN0cmVhbSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuY3VycmVudFNlbGVjdGlvbikuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5leGVjdXRlKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLnByb2plY3RGcm9tU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuZXhlY3V0ZShwcm9qZWN0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0RnJvbVNlbGVjdGlvbihPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJcmV0dXJuIChJUHJvamVjdCkgc2VsZWN0aW9uOwotCQl9Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKLQkJCXJldHVybiAoKElKYXZhUHJvamVjdCkgc2VsZWN0aW9uKS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtVWkgZ2V0SnBhUGxhdGZvcm1VaShKcGFQcm9qZWN0IHByb2plY3QpIHsKLQkJU3RyaW5nIGNvcmVKcGFQbGF0Zm9ybUlkID0gcHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpLmdldElkKCk7Ci0gICAgICAgIHJldHVybiBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkuaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybVVpKGNvcmVKcGFQbGF0Zm9ybUlkKTsgCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2plY3QgcHJvamVjdCkgewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmV4ZWN1dGUoanBhUHJvamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShKcGFQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1N5bmNocm9uaXplQ2xhc3Nlc0FjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9TeW5jaHJvbml6ZUNsYXNzZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwYTEwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1N5bmNocm9uaXplQ2xhc3Nlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5zeW5jaC5TeW5jaHJvbml6ZUNsYXNzZXNKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVDbGFzc2VzQWN0aW9uIAotCWltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIAotewotCXByaXZhdGUgSUZpbGUgZmlsZTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCS8vIG5vLW9wIGZvciBub3cKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJU3luY2hyb25pemVDbGFzc2VzSm9iIGpvYiA9IG5ldyBTeW5jaHJvbml6ZUNsYXNzZXNKb2IoZmlsZSk7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIEFjdGlvbiBpcyBjb250cmlidXRlZCBmb3IgSUZpbGUncyBuYW1lZCAicGVyc2lzdGVuY2UueG1sIiBhbmQKLQkJLy8gZm9yIFBlcmlzdGVuY2VYbWwgb2JqZWN0cy4KLQkJLy8gVGhlcmUgaXMgYWx3YXlzIG9ubHkgb25lIGVsZW1lbnQgaW4gYWN0dWFsIHNlbGVjdGlvbi4KLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCWZpbGUgPSAoSUZpbGUpIHNlbGVjdGVkT2JqZWN0OwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgUGVyc2lzdGVuY2VYbWwpIHsKLQkJCWZpbGUgPSAoSUZpbGUpICgoUGVyc2lzdGVuY2VYbWwpIHNlbGVjdGVkT2JqZWN0KS5nZXRSZXNvdXJjZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwSGFuZGxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjk0NGU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGlhbG9ncy5BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5EZWZhdWx0SnBhU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uSnBhU2VsZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlcgotewotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBleGVjdXRpb25FdmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gCi0JCQlIYW5kbGVyVXRpbC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3dDaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKLQkJCi0JCWZpbmFsIExpc3Q8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gbmV3QXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiAKLQkJCT0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uQ2hlY2tlZChleGVjdXRpb25FdmVudCk7Ci0JCQotCQkKLQkJLy8gb25seSBhcHBsaWVzIGZvciBtdWx0aXBseSBzZWxlY3RlZCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9iamVjdHMgaW4gYSB0cmVlCi0JCWZvciAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiAoSXRlcmFibGU8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4pIENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzZWxlY3Rpb24uaXRlcmF0b3IoKSkpIHsKLQkJCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBhdHRyaWJ1dGUuZ2V0T3duaW5nUGVyc2lzdGVudFR5cGUoKTsKLQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKLQkJCQotCQkJQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2cod2luZG93LmdldFNoZWxsKCksIGF0dHJpYnV0ZSk7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJCi0JCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0dHJpYnV0ZSA9IHR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAobmV3QXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQluZXdBdHRyaWJ1dGVzLmFkZChuZXdBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobmV3QXR0cmlidXRlcy5zaXplKCkgPT0gMSkgewotCQkJd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYygKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciA9IFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmdldFNlbGVjdGlvbk1hbmFnZXIod2luZG93KTsKLQkJCQkJCXNlbGVjdGlvbk1hbmFnZXIuc2VsZWN0KG5ldyBEZWZhdWx0SnBhU2VsZWN0aW9uKG5ld0F0dHJpYnV0ZXMuZ2V0KDApKSwgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sSGFuZGxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjU0ZGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkRlZmF1bHRKcGFTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCi17CQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBleGVjdXRpb25FdmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gCi0JCQlIYW5kbGVyVXRpbC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3dDaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKLQkJCi0JCWZpbmFsIExpc3Q8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gbmV3QXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IAotCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uQ2hlY2tlZChleGVjdXRpb25FdmVudCk7Ci0JCQotCQkvLyBvbmx5IGFwcGxpZXMgZm9yIG11bHRpcGx5IHNlbGVjdGVkIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb2JqZWN0cyBpbiBhIHRyZWUKLQkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IChJdGVyYWJsZTxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPikgQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHNlbGVjdGlvbi5pdGVyYXRvcigpKSkgewotCQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGF0dHJpYnV0ZS5nZXRPd25pbmdQZXJzaXN0ZW50VHlwZSgpOwotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkJYXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3QXR0cmlidXRlID0gdHlwZS5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsKLQkJCWlmIChuZXdBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCW5ld0F0dHJpYnV0ZXMuYWRkKG5ld0F0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChuZXdBdHRyaWJ1dGVzLnNpemUoKSA9PSAxKSB7Ci0JCQl3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSnBhU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyID0gU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuZ2V0U2VsZWN0aW9uTWFuYWdlcih3aW5kb3cpOwotCQkJCQkJc2VsZWN0aW9uTWFuYWdlci5zZWxlY3QobmV3IERlZmF1bHRKcGFTZWxlY3Rpb24obmV3QXR0cmlidXRlcy5nZXQoMCkpLCBudWxsKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQZXJzaXN0ZW50Q2xhc3NIYW5kbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQZXJzaXN0ZW50Q2xhc3NIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MWJhNGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudENsYXNzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kaWFsb2dzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkRlZmF1bHRKcGFTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLQotcHVibGljIGNsYXNzIEFkZFBlcnNpc3RlbnRDbGFzc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIKLXsKLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXhlY3V0aW9uRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IAotCQkJSGFuZGxlclV0aWwuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93Q2hlY2tlZChleGVjdXRpb25FdmVudCk7Ci0JCQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gCi0JCQk9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOwotCQkKLQkJLy8gb25seSBhcHBsaWVzIGZvciBhIHNpbmdseSBzZWxlY3RlZCBFbnRpdHlNYXBwaW5ncyBvYmplY3QgaW4gYSB0cmVlCi0JCUVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0KLQkJCShFbnRpdHlNYXBwaW5ncykgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkKLQkJQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nIGRpYWxvZyA9IAotCQkJbmV3IEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZyh3aW5kb3cuZ2V0U2hlbGwoKSwgZW50aXR5TWFwcGluZ3MpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZmluYWwgT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGRpYWxvZy5vcGVuQW5kUmV0dXJuVHlwZSgpOwotCQkKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYygKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciA9IFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmdldFNlbGVjdGlvbk1hbmFnZXIod2luZG93KTsKLQkJCQkJCXNlbGVjdGlvbk1hbmFnZXIuc2VsZWN0KG5ldyBEZWZhdWx0SnBhU2VsZWN0aW9uKHR5cGUpLCBudWxsKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9Db252ZXJ0SmF2YVByb2plY3RUb0pwYUNvbW1hbmRIYW5kbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9Db252ZXJ0SmF2YVByb2plY3RUb0pwYUNvbW1hbmRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDYyZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvQ29udmVydEphdmFQcm9qZWN0VG9KcGFDb21tYW5kSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuRmlsZVV0aWwuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRlZFByb2plY3ROYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLk1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkOwotCi1wdWJsaWMgY2xhc3MgQ29udmVydEphdmFQcm9qZWN0VG9KcGFDb21tYW5kSGFuZGxlcgotCQlleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0JCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihldmVudCk7Ci0JCQotCQlpZiAoY3VycmVudFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGN1cnJlbnRTZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKGVsZW1lbnQsIElQcm9qZWN0LmNsYXNzKTsKLQkJfSAKLQkJCi0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlJV29ya2JlbmNoV2luZG93IGFjdGl2ZVdvcmtiZW5jaFdpbmRvdyA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdyhldmVudCk7Ci0JCQotCQlpZiAoYWN0aXZlV29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLQkJCVNoZWxsIHNoZWxsID0gYWN0aXZlV29ya2JlbmNoV2luZG93LmdldFNoZWxsKCk7Ci0JCQkKLQkJCUNvbnZlcnRKYXZhUHJvamVjdFRvSnBhUnVubmFibGUucnVuSW5Qcm9ncmVzc0RpYWxvZyhzaGVsbCwgcHJvamVjdCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb252ZXJ0SmF2YVByb2plY3RUb0pwYVJ1bm5hYmxlCi0JCQlpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JCQotCQlwcml2YXRlIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7Ci0JCXByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnByb2p3YzsKLQkJCi0JCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5JblByb2dyZXNzRGlhbG9nKFNoZWxsIHNoZWxsLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQlmaW5hbCBDb252ZXJ0SmF2YVByb2plY3RUb0pwYVJ1bm5hYmxlIHJ1bm5hYmxlIAotCQkJCQk9IG5ldyBDb252ZXJ0SmF2YVByb2plY3RUb0pwYVJ1bm5hYmxlKHByb2plY3QpOwotCQkJCi0JCQl0cnkgewotCQkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpLnJ1bih0cnVlLCB0cnVlLCBydW5uYWJsZSk7Ci0JCQkJCi0JCQkJTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQgd2l6YXJkIAotCQkJCQkJPSBuZXcgTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQocnVubmFibGUuZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpKTsKLQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJCQkKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCQljYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVtb3ZlRmFjZXROYXR1cmUocHJvamVjdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmFjZXROYXR1cmUoSVByb2plY3QgcHJvamVjdCkgewotCQkJdHJ5IHsKLQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IEFycmF5VG9vbHMucmVtb3ZlKHByZXZOYXR1cmVzLCBGYWNldGVkUHJvamVjdE5hdHVyZS5OQVRVUkVfSUQpOwotCQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyggbmV3TmF0dXJlcyApOwotCQkJCQotCQkJCXZhbGlkYXRlRWRpdCggcHJvamVjdC5nZXRGaWxlKCBGSUxFX0RPVF9QUk9KRUNUICkgKTsKLQkJICAgICAgICAgICAgCi0JCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCUpwdFVpUGx1Z2luLmxvZyhjZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgQ29udmVydEphdmFQcm9qZWN0VG9KcGFSdW5uYWJsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkKLQkJCW1vbml0b3IuYmVnaW5UYXNrKEpwdFVpTWVzc2FnZXMuY29udmVydFRvSnBhX2NvbnZlcnRpbmdQcm9qZWN0LCAxMDAwKTsKLQkJCQotCQkJdHJ5IHsKLQkJCQlJUHJvZ3Jlc3NNb25pdG9yIGNyZWF0ZVByb2dyZXNzTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwKTsKLQkJCQlJRmFjZXRlZFByb2plY3QgZnByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUodGhpcy5wcm9qZWN0LCB0cnVlLCBjcmVhdGVQcm9ncmVzc01vbml0b3IpOwotCQkJCQotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJCi0JCQkJbW9uaXRvci5zZXRUYXNrTmFtZShKcHRVaU1lc3NhZ2VzLmNvbnZlcnRUb0pwYV9kZXRlY3RpbmdUZWNobm9sb2dpZXMpOwotCQkJCQotCQkJCUlQcm9ncmVzc01vbml0b3IgZGV0ZWN0UHJvZ3Jlc3NNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA4MDApOwotCQkJCXRoaXMuZnByb2p3YyA9IGZwcm9qLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQkJdGhpcy5mcHJvandjLmRldGVjdChkZXRlY3RQcm9ncmVzc01vbml0b3IpOwotCQkJCQotCQkJCWlmICghIHRoaXMuZnByb2p3Yy5oYXNQcm9qZWN0RmFjZXQoSnBhRmFjZXQuRkFDRVQpKSB7Ci0JCQkJCXRoaXMuZnByb2p3Yy5hZGRQcm9qZWN0RmFjZXQoSnBhRmFjZXQuRkFDRVQuZ2V0RGVmYXVsdFZlcnNpb24oKSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mcHJvandjOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzSGFuZGxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjgyOWU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL1BlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5JRWxlbWVudFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubWVudXMuVUlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzLklFdmFsdWF0aW9uU2VydmljZTsKLQotLyoqCi0gKiBUaGlzIGhhbmRsZXIgaXMgcmVzcG9uc2libGUgdG8gY2hhbmdlIHRoZSBtYXBwaW5nIHR5cGUgb2YgdGhlIHNlbGVjdGVkCi0gKiA8Y29kZT5QZXJzaXN0ZW50QXR0cmlidXRlPC9jb2RlPi4KLSAqIDxwPgotICogVGhpcyBoYW5kbGVyIGlzIGRlZmluZWQgaW4gdGhlIEpQVCBwbHVnaW4ueG1sLiBJdCB3aWxsIGJlIGludm9rZWQgYnkgdGhlCi0gKiBtYXBwaW5nIGFjdGlvbiBkeW5hbWljYWxseSBjcmVhdGVkIGJ5IHRoZSA8Y29kZT5QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb250cmlidXRpb248L2NvZGU+LgotICoKLSAqIEBzZWUgUGVyc2lzdGVudEF0dHJpYnV0ZQotICogQHNlZSBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb250cmlidXRpb24KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlcgotCWltcGxlbWVudHMgSUVsZW1lbnRVcGRhdGVyCi17Ci0JLyoqCi0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBNYXAgQXMgY29tbWFuZCB1c2VkIGZvciA8Y29kZT5QZXJzaXN0ZW50QXR0cmlidXRlPC9jb2RlPgotCSAqIGRlZmluZWQgaW4gdGhlIDxjb2RlPkpwdFVpUGx1Z2luPC9jb2RlPiBwbHVnaW4ueG1sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfSUQgPSAib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBcyI7Ci0JCi0JLyoqCi0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBNYXAgQXMgY29tbWFuZCBwYXJhbWV0ZXIgdXNlZCBmb3IgPGNvZGU+UGVyc2lzdGVudEF0dHJpYnV0ZTwvY29kZT4KLQkgKiBkZWZpbmVkIGluIHRoZSA8Y29kZT5KcHRVaVBsdWdpbjwvY29kZT4gcGx1Z2luLnhtbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDSUZJRURfTUFQUElOR19DT01NQU5EX1BBUkFNRVRFUl9JRCA9ICJzcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlTWFwcGluZ0tleSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NQVBQSU5HX0NPTU1BTkRfUEFSQU1FVEVSX0lEID0gImRlZmF1bHRQZXJzaXN0ZW50QXR0cmlidXRlTWFwcGluZ0tleSI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCi0JCS8vIFJldHJpZXZlIHRoZSBzZWxlY3Rpb24gZnJvbSB0aGUgRXhlY3V0aW9uRXZlbnQKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXZlbnQpOwotCi0JCS8vIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgdW5pcXVlIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNvbW1hbmQKLQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBldmVudC5nZXRQYXJhbWV0ZXIoU1BFQ0lGSUVEX01BUFBJTkdfQ09NTUFORF9QQVJBTUVURVJfSUQpOwotCi0JCS8vIENoYW5nZSB0aGUgbWFwcGluZyBrZXkgZm9yIGFsbCB0aGUgc2VsZWN0ZWQgaXRlbXMKLQkJZm9yIChPYmplY3QgaXRlbSA6IHNlbGVjdGlvbi50b0FycmF5KCkpIHsKLQkJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIGl0ZW07Ci0JCQlhdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShtYXBwaW5nS2V5KTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVFbGVtZW50KFVJRWxlbWVudCBlbGVtZW50LCBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgTWFwIHBhcmFtZXRlcnMpIHsKLQkJLy8gUmV0cmlldmUgdGhlIHNlbGVjdGlvbiBmb3IgdGhlIFVJRWxlbWVudAotCQkKLQkJLy8gRHVlIHRvIEJ1ZyAyMjY3NDYsIHdlIGhhdmUgdG8gdXNlIEFQSSB3b3JrYXJvdW5kIHRvIHJldHJpZXZlIGN1cnJlbnQgCi0JCS8vIHNlbGVjdGlvbgotCQlJRXZhbHVhdGlvblNlcnZpY2UgZXMgCi0JCQk9IChJRXZhbHVhdGlvblNlcnZpY2UpIGVsZW1lbnQuZ2V0U2VydmljZUxvY2F0b3IoKS5nZXRTZXJ2aWNlKElFdmFsdWF0aW9uU2VydmljZS5jbGFzcyk7Ci0JCUlWaWV3UGFydCBwYXJ0ID0gCi0JCQkoSVZpZXdQYXJ0KSBlcy5nZXRDdXJyZW50U3RhdGUoKS5nZXRWYXJpYWJsZShJU291cmNlcy5BQ1RJVkVfUEFSVF9OQU1FKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uIAotCQkJPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQotCQllbGVtZW50LnNldENoZWNrZWQoc2VsZWN0ZWRFbGVtZW50c01hcHBpbmdLZXlzTWF0Y2goc2VsZWN0aW9uLCBwYXJhbWV0ZXJzKSk7Ci0JfQotCQotCS8vQ2hlY2sgYWxsIHRoZSBzZWxlY3RlZCBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBhbmQgdmVyaWZ5IHRoYXQgdGhleSBoYXZlIHRoZSBzYW1lIG1hcHBpbmcgdHlwZS4KLQkvL1RoZXkgbXVzdCBhbGwgYmUgZWl0aGVyIGRlZmF1bHQgbWFwcGluZ3Mgb3Igc3BlY2lmaWVkIG1hcHBpbmdzIGFzIHdlbGwuCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2VsZWN0ZWRFbGVtZW50c01hcHBpbmdLZXlzTWF0Y2goSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgTWFwIHBhcmFtZXRlcnMpIHsKLQkJU3RyaW5nIGhhbmRsZXJTcGVjaWZpZWRNYXBwaW5nS2V5ID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoU1BFQ0lGSUVEX01BUFBJTkdfQ09NTUFORF9QQVJBTUVURVJfSUQpOwotCQlTdHJpbmcgaGFuZGxlckRlZmF1bHRNYXBwaW5nS2V5ID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoREVGQVVMVF9NQVBQSU5HX0NPTU1BTkRfUEFSQU1FVEVSX0lEKTsKLQkJCi0JCVN0cmluZyBjb21tb25EZWZhdWx0S2V5ID0gbnVsbDsKLQkJU3RyaW5nIGNvbW1vblNwZWNpZmllZEtleSA9IG51bGw7Ci0JCWZvciAoT2JqZWN0IG9iaiA6IHNlbGVjdGlvbi50b0FycmF5KCkpIHsKLQkJCWlmICghIChvYmogaW5zdGFuY2VvZiBQZXJzaXN0ZW50QXR0cmlidXRlKSkgewotCQkJCS8vb2RkbHkgZW5vdWdoLCB5b3UgaGF2ZSB0byBjaGVjayBpbnN0YW5jZW9mIGhlcmUsIHNlZW1zIGxpa2UgYSBidWcgaW4gdGhlIGZyYW1ld29yawotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIG9iajsKLQkJCWlmIChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSA9PSBudWxsKSB7Ci0JCQkJaWYgKGNvbW1vblNwZWNpZmllZEtleSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKGNvbW1vbkRlZmF1bHRLZXkgPT0gbnVsbCkgewotCQkJCQljb21tb25EZWZhdWx0S2V5ID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCk7CQkJCQkKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIWNvbW1vbkRlZmF1bHRLZXkuZXF1YWxzKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGNvbW1vbkRlZmF1bHRLZXkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChjb21tb25TcGVjaWZpZWRLZXkgPT0gbnVsbCkgewotCQkJCQljb21tb25TcGVjaWZpZWRLZXkgPSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIWNvbW1vblNwZWNpZmllZEtleS5lcXVhbHMocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGhhbmRsZXJTcGVjaWZpZWRNYXBwaW5nS2V5ICE9IG51bGwpIHsKLQkJCXJldHVybiBoYW5kbGVyU3BlY2lmaWVkTWFwcGluZ0tleS5lcXVhbHMoY29tbW9uU3BlY2lmaWVkS2V5KTsKLQkJfQotCQllbHNlIGlmIChoYW5kbGVyRGVmYXVsdE1hcHBpbmdLZXkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGhhbmRsZXJEZWZhdWx0TWFwcGluZ0tleS5lcXVhbHMoY29tbW9uRGVmYXVsdEtleSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL1BlcnNpc3RlbnRUeXBlTWFwQXNIYW5kbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9QZXJzaXN0ZW50VHlwZU1hcEFzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWE5MDMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL1BlcnNpc3RlbnRUeXBlTWFwQXNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tZW51cy5QZXJzaXN0ZW50VHlwZU1hcEFzQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5JRWxlbWVudFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubWVudXMuVUlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzLklFdmFsdWF0aW9uU2VydmljZTsKLQotLyoqCi0gKiBUaGlzIGhhbmRsZXIgaXMgcmVzcG9uc2libGUgdG8gY2hhbmdlIHRoZSBtYXBwaW5nIHR5cGUgb2YgdGhlIHNlbGVjdGVkCi0gKiA8Y29kZT5QZXJzaXN0ZW50VHlwZTwvY29kZT4uCi0gKiA8cD4KLSAqIFRoaXMgaGFuZGxlciBpcyBkZWZpbmVkIGluIHRoZSBKUFQgcGx1Z2luLnhtbC4gSXQgd2lsbCBiZSBpbnZva2VkIGJ5IHRoZQotICogbWFwcGluZyBhY3Rpb24gZHluYW1pY2FsbHkgY3JlYXRlZCBieSB0aGUgPGNvZGU+UGVyc2lzdGVudFR5cGVNYXBBc0NvbnRyaWJ1dGlvbjwvY29kZT4uCi0gKgotICogQHNlZSBQZXJzaXN0ZW50VHlwZQotICogQHNlZSBQZXJzaXN0ZW50VHlwZU1hcEFzQ29udHJpYnV0aW9uCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRUeXBlTWFwQXNIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCi0JaW1wbGVtZW50cyBJRWxlbWVudFVwZGF0ZXIKLXsKLQkvKioKLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIE1hcCBBcyBjb21tYW5kIHVzZWQgZm9yIHtAbGluayBQZXJzaXN0ZW50VHlwZX0KLQkgKiBkZWZpbmVkIGluIHRoZSA8Y29kZT5KcHRVaVBsdWdpbjwvY29kZT4gcGx1Z2luLnhtbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0lEID0gIm9yZy5lY2xpcHNlLmpwdC51aS5wZXJzaXN0ZW50VHlwZU1hcEFzIjsKLQkKLQkvKioKLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIE1hcCBBcyBjb21tYW5kIHBhcmFtZXRlciB1c2VkIGZvciB7QGxpbmsgUGVyc2lzdGVudFR5cGV9Ci0JICogZGVmaW5lZCBpbiB0aGUgPGNvZGU+SnB0VWlQbHVnaW48L2NvZGU+IHBsdWdpbi54bWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9QQVJBTUVURVJfSUQgPSAicGVyc2lzdGVudFR5cGVNYXBwaW5nS2V5IjsKLQkKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbnRUeXBlTWFwQXNIYW5kbGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVudFR5cGVNYXBBc0hhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgc2VsZWN0aW9uIGZyb20gdGhlIEV4ZWN1dGlvbkV2ZW50Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCUhhbmRsZXJVdGlsLmdldEN1cnJlbnRTZWxlY3Rpb25DaGVja2VkKGV2ZW50KTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgdmFsdWUgb2YgdGhlIHVuaXF1ZSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjb21tYW5kCi0JCVN0cmluZyBtYXBwaW5nS2V5ID0gZXZlbnQuZ2V0UGFyYW1ldGVyKENPTU1BTkRfUEFSQU1FVEVSX0lEKTsKLQotCQkvLyBDaGFuZ2UgdGhlIG1hcHBpbmcga2V5IGZvciBhbGwgdGhlIHNlbGVjdGVkIGl0ZW1zCi0JCWZvciAoT2JqZWN0IGl0ZW0gOiBzZWxlY3Rpb24udG9BcnJheSgpKSB7Ci0JCQlQZXJzaXN0ZW50VHlwZSB0eXBlID0gKFBlcnNpc3RlbnRUeXBlKSBpdGVtOwotCQkJdHlwZS5zZXRNYXBwaW5nS2V5KG1hcHBpbmdLZXkpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIHVwZGF0ZUVsZW1lbnQoVUlFbGVtZW50IGVsZW1lbnQsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCS8vIFJldHJpZXZlIHRoZSBzZWxlY3Rpb24gZm9yIHRoZSBVSUVsZW1lbnQKLQkJCi0JCS8vIER1ZSB0byBCdWcgMjI2NzQ2LCB3ZSBoYXZlIHRvIHVzZSBBUEkgd29ya2Fyb3VuZCB0byByZXRyaWV2ZSBjdXJyZW50IAotCQkvLyBzZWxlY3Rpb24KLQkJSUV2YWx1YXRpb25TZXJ2aWNlIGVzIAotCQkJPSAoSUV2YWx1YXRpb25TZXJ2aWNlKSBlbGVtZW50LmdldFNlcnZpY2VMb2NhdG9yKCkuZ2V0U2VydmljZShJRXZhbHVhdGlvblNlcnZpY2UuY2xhc3MpOwotCQlJVmlld1BhcnQgcGFydCA9IAotCQkJKElWaWV3UGFydCkgZXMuZ2V0Q3VycmVudFN0YXRlKCkuZ2V0VmFyaWFibGUoSVNvdXJjZXMuQUNUSVZFX1BBUlRfTkFNRSk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiAKLQkJCT0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBwYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkKLQkJU3RyaW5nIGNvbW1vbk1hcHBpbmdLZXkgPSBjb21tb25NYXBwaW5nS2V5KHNlbGVjdGlvbik7Ci0JCQotCQlTdHJpbmcgaGFuZGxlck1hcHBpbmdLZXkgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChDT01NQU5EX1BBUkFNRVRFUl9JRCk7Ci0JCWlmIChoYW5kbGVyTWFwcGluZ0tleSAhPSBudWxsKSB7Ci0JCQllbGVtZW50LnNldENoZWNrZWQoaGFuZGxlck1hcHBpbmdLZXkuZXF1YWxzKGNvbW1vbk1hcHBpbmdLZXkpKTsKLQkJfQotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1vbk1hcHBpbmdLZXkoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVN0cmluZyBjb21tb25LZXkgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIHN0cmVhbSA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU9iamVjdCBvYmogPSBzdHJlYW0ubmV4dCgpOwotCQkJCi0JCQlpZiAoISAob2JqIGluc3RhbmNlb2YgUGVyc2lzdGVudFR5cGUpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gKFBlcnNpc3RlbnRUeXBlKSBvYmo7Ci0JCQkKLQkJCWlmIChjb21tb25LZXkgPT0gbnVsbCkgewotCQkJCWNvbW1vbktleSA9IHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmdLZXkoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCEgY29tbW9uS2V5LmVxdWFscyhwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nS2V5KCkpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbW1vbktleTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9SZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlRnJvbVhtbEhhbmRsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL1JlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGVGcm9tWG1sSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTNkYmI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL1JlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGVGcm9tWG1sSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uRGVmYXVsdEpwYVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkpwYVNlbGVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5TZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLQotcHVibGljIGNsYXNzIFJlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGVGcm9tWG1sSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlcgotewkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXhlY3V0aW9uRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IAotCQkJSGFuZGxlclV0aWwuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93Q2hlY2tlZChleGVjdXRpb25FdmVudCk7Ci0JCQotCQlmaW5hbCBMaXN0PE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG5ld0F0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0PE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAKLQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOwotCQkKLQkJLy8gb25seSBhcHBsaWVzIGZvciBtdWx0aXBseSBzZWxlY3RlZCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9iamVjdHMgaW4gYSB0cmVlCi0JCWZvciAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiAoSXRlcmFibGU8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4pIENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzZWxlY3Rpb24uaXRlcmF0b3IoKSkpIHsKLQkJCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBhdHRyaWJ1dGUuZ2V0T3duaW5nUGVyc2lzdGVudFR5cGUoKTsKLQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKLQkJCWF0dHJpYnV0ZS5tYWtlVmlydHVhbCgpOwotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdBdHRyaWJ1dGUgPSB0eXBlLmdldEF0dHJpYnV0ZU5hbWVkKGF0dHJpYnV0ZU5hbWUpOwotCQkJaWYgKG5ld0F0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJbmV3QXR0cmlidXRlcy5hZGQobmV3QXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG5ld0F0dHJpYnV0ZXMuc2l6ZSgpID09IDEpIHsKLQkJCXdpbmRvdy5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlKcGFTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXIgPSBTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeS5nZXRTZWxlY3Rpb25NYW5hZ2VyKHdpbmRvdyk7Ci0JCQkJCQlzZWxlY3Rpb25NYW5hZ2VyLnNlbGVjdChuZXcgRGVmYXVsdEpwYVNlbGVjdGlvbihuZXdBdHRyaWJ1dGVzLmdldCgwKSksIG51bGwpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvUmVtb3ZlUGVyc2lzdGVudENsYXNzSGFuZGxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvUmVtb3ZlUGVyc2lzdGVudENsYXNzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjZhM2M4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL1JlbW92ZVBlcnNpc3RlbnRDbGFzc0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLQotcHVibGljIGNsYXNzIFJlbW92ZVBlcnNpc3RlbnRDbGFzc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIKLXsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXhlY3V0aW9uRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAKLQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOwotCQkKLQkJLy8gb25seSBhcHBsaWVzIGZvciBtdWx0aXBseSBzZWxlY3RlZCBPcm1QZXJzaXN0ZW50VHlwZSBvYmplY3RzIGluIGEgdHJlZQotCQlmb3IgKEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPiBzdHJlYW0gPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkoKEVudGl0eU1hcHBpbmdzKSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nRmlsZVJvb3QoKSkucmVtb3ZlUGVyc2lzdGVudFR5cGUocGVyc2lzdGVudFR5cGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9VcGdyYWRlWG1sRmlsZVZlcnNpb25IYW5kbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9VcGdyYWRlWG1sRmlsZVZlcnNpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYTYxY2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvVXBncmFkZVhtbEZpbGVWZXJzaW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVJvb3RFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLQotcHVibGljIGNsYXNzIFVwZ3JhZGVYbWxGaWxlVmVyc2lvbkhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIKLXsKLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gCi0JCQk9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXZlbnQpOwotCi0JCWZvciAoT2JqZWN0IHNlbGVjdGVkT2JqZWN0IDogc2VsZWN0aW9uLnRvQXJyYXkoKSkgewotCQkJdXBncmFkZVhtbEZpbGVWZXJzaW9uKHNlbGVjdGVkT2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGdyYWRlWG1sRmlsZVZlcnNpb24oT2JqZWN0IHNlbGVjdGVkT2JqZWN0KSB7Ci0JCUpwYVhtbFJlc291cmNlIHhtbFJlc291cmNlID0gCi0JCQkoSnBhWG1sUmVzb3VyY2UpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihzZWxlY3RlZE9iamVjdCwgSnBhWG1sUmVzb3VyY2UuY2xhc3MpOwotCQlpZiAoeG1sUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJWG1sRmlsZSB4bWxGaWxlID0gCi0JCQkJKFhtbEZpbGUpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihzZWxlY3RlZE9iamVjdCwgWG1sRmlsZS5jbGFzcyk7Ci0JCQlpZiAoeG1sRmlsZSAhPSBudWxsKSB7Ci0JCQkJeG1sUmVzb3VyY2UgPSB4bWxGaWxlLmdldFhtbFJlc291cmNlKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHhtbFJlc291cmNlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZpbmFsIEpwYVJvb3RFT2JqZWN0IHJvb3QgPSB4bWxSZXNvdXJjZS5nZXRSb290T2JqZWN0KCk7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IHhtbFJlc291cmNlLmdldENvbnRlbnRUeXBlKCk7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh4bWxSZXNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQlmaW5hbCBTdHJpbmcgbmV3VmVyc2lvbiA9IGpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKS5nZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKGNvbnRlbnRUeXBlKS5nZXRWZXJzaW9uKCk7Ci0KLQkJeG1sUmVzb3VyY2UubW9kaWZ5KAotCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJcm9vdC5zZXRWZXJzaW9uKG5ld1ZlcnNpb24pOwotCQkJCX0KLQkJCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RCYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RCYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM5MzUwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0QmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBFbnVtVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgTG9iQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQmFzaWNNYXBwaW5nCi0gKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQotICogQHNlZSBFbnVtVHlwZUNvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgTG9iQ29tcG9zaXRlCi0gKiBAc2VlIE9wdGlvbmFsQ29tcG9zaXRlCi0gKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCYXNpY01hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIEJhc2ljTWFwcGluZz4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci0JaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklCYXNpY01hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RCYXNpY01hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWluaXRpYWxpemVCYXNpY0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplVHlwZUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQmFzaWNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5CYXNpY1NlY3Rpb25fdGl0bGUsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkKLQkJKTsKLQotCQl0aGlzLmluaXRpYWxpemVCYXNpY1NlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJhc2ljU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgYWRkU3ViUGFuZShjb250YWluZXIsIDQpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVR5cGVDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90eXBlCi0JCSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVR5cGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVR5cGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJKChHcmlkTGF5b3V0KSBjb250YWluZXIuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgPSAyOwotCi0JCS8vIE5vIGNvbnZlcnRlcgotCQlCdXR0b24gbm9Db252ZXJ0ZXJCdXR0b24gPSBhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9kZWZhdWx0LCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSKSwgCi0JCQludWxsKTsKLQkJKChHcmlkRGF0YSkgbm9Db252ZXJ0ZXJCdXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQotCQkvLyBMb2IKLQkJQnV0dG9uIGxvYkJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2xvYiwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoQ29udmVydGVyLkxPQl9DT05WRVJURVIpLCAKLQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBsb2JCdXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIgPSBidWlsZENvbnZlcnRlckhvbGRlcigpOwotCQkvLyBUZW1wb3JhbAotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90ZW1wb3JhbCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUiksIAotCQkJbnVsbCk7Ci0JCXJlZ2lzdGVyU3ViUGFuZShuZXcgVGVtcG9yYWxUeXBlQ29tcG9zaXRlKGJ1aWxkVGVtcG9yYWxDb252ZXJ0ZXJIb2xkZXIoY29udmVydGVySG9sZGVyKSwgY29udGFpbmVyLCBnZXRXaWRnZXRGYWN0b3J5KCkpKTsKLQkJCi0JCQotCQkvLyBFbnVtZXJhdGVkCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2VudW1lcmF0ZWQsIAotCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKENvbnZlcnRlci5FTlVNRVJBVEVEX0NPTlZFUlRFUiksIAotCQkJbnVsbCk7Ci0JCXJlZ2lzdGVyU3ViUGFuZShuZXcgRW51bVR5cGVDb21wb3NpdGUoYnVpbGRFbnVtZXJhdGVkQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDb2x1bW4+IGJ1aWxkQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIENvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb2x1bW4gdHJhbnNmb3JtXyhUIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldENvbHVtbigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIENvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb252ZXJ0ZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxUZW1wb3JhbENvbnZlcnRlcj4gYnVpbGRUZW1wb3JhbENvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXIsIFRlbXBvcmFsQ29udmVydGVyPihjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRlbXBvcmFsQ29udmVydGVyIHRyYW5zZm9ybV8oQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCXJldHVybiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIgPyAoVGVtcG9yYWxDb252ZXJ0ZXIpIGNvbnZlcnRlciA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RW51bWVyYXRlZENvbnZlcnRlcj4gYnVpbGRFbnVtZXJhdGVkQ29udmVydGVySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlciwgRW51bWVyYXRlZENvbnZlcnRlcj4oY29udmVydGVySG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFbnVtZXJhdGVkQ29udmVydGVyIHRyYW5zZm9ybV8oQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCXJldHVybiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IENvbnZlcnRlci5FTlVNRVJBVEVEX0NPTlZFUlRFUiA/IChFbnVtZXJhdGVkQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKGZpbmFsIFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJhc2ljTWFwcGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCUNvbnZlcnRlciBjb252ZXJ0ZXIgPSB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVyKCk7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IGNvbnZlcnRlclR5cGUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRDb252ZXJ0ZXIoY29udmVydGVyVHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOWIwOWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQgZXh0ZW5kcyBCYXNpY01hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RCYXNpY01hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQmFzaWNNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5CYXNpY01hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGFibGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYmFiY2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHBhbmUgZG9lcyBub3QgaGF2ZSBhbnkgd2lkZ2V0cy4KLSAqCi0gKiBAc2VlIEVtYmVkZGFibGUKLSAqIEBzZWUgSmF2YVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICogQHNlZSBFbWJlZGRhYmxlVWlQcm92aWRlcgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbWJlZGRhYmxlQ29tcG9zaXRlPFQgZXh0ZW5kcyBFbWJlZGRhYmxlPiAKLQlleHRlbmRzIFBhbmU8VD4KLQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW1iZWRkYWJsZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEVtYmVkZGFibGVDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGFibGVDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5FbWJlZGRhYmxlU2VjdGlvbl90aXRsZSwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKQotCQkpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZUVtYmVkZGFibGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbWJlZGRhYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGFibGVVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYxOThlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVtYmVkZGFibGVVaURlZmluaXRpb248TSwgVCBleHRlbmRzIEVtYmVkZGFibGU+IAotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0RW1iZWRkYWJsZVVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5FbWJlZGRhYmxlVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5FbWJlZGRhYmxlVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvclR5cGVNYXBwaW5nKGdldEtleSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODljMjFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIEVtYmVkZGVkSWRNYXBwaW5nPiAKLQlleHRlbmRzIFBhbmU8VD4KLQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCXByb3RlY3RlZCBBYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWluaXRpYWxpemVFbWJlZGRlZElkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbWJlZGRlZElkQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5FbWJlZGRlZElkU2VjdGlvbl90aXRsZSwKLQkJCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkpOwotCQkKLQkJdGhpcy5pbml0aWFsaXplRW1iZWRkZWRJZFNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGVkSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzNmJhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgRW1iZWRkZWRJZE1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXRLZXkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTYyMmZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVtYmVkZGVkTWFwcGluZwotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIEVtYmVkZGVkTWFwcGluZz4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci0JaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkVtYmVkZGVkTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW5pdGlhbGl6ZUVtYmVkZGVkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbWJlZGRlZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkVtYmVkZGVkU2VjdGlvbl90aXRsZSwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKQotCQkpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZUVtYmVkZGVkU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQljb250YWluZXIKLQkJKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGE1NDhiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZTxUIGV4dGVuZHMgQmFzZUVtYmVkZGVkTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0T3ZlcnJpZGVzQ29tcG9zaXRlPFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZDM0OTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQgZXh0ZW5kcyBFbWJlZGRlZE1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5FbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXRLZXkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGIxOGZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRW50aXR5TmFtZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYWJsZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IElkQ2xhc3NDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSB2IEF0dHJpYnV0ZSBPdmVycmlkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPdmVycmlkZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gdiBTZWNvbmRhcnkgVGFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIHYgSW5oZXJpdGFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEluaGVyaXRhbmNlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSB2IFF1ZXJpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBRdWVyaWVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gdiBHZW5lcmF0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgR2VuZXJhdG9yc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIEVudGl0eU5hbWVDb21wb3NpdGUKLSAqIEBzZWUgSW5oZXJpdGFuY2VDb21wb3NpdGUKLSAqIEBzZWUgSWRDbGFzc0NvbXBvc2l0ZQotICogQHNlZSBFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUKLSAqIEBzZWUgVGFibGVDb21wb3NpdGUKLSAqIEBzZWUgR2VuZXJhdGlvbkNvbXBvc2l0ZQotICoKLSAqIFRPRE8gdGFsayB0byBKYXZhRWRpdG9yIHBlb3BsZSBhYm91dCB3aGF0IHdlIGNhbiBkbyB0byBob29rIGluIFRhYmJlZFByb3BlcnRpZXMgZm9yIHRoZSBKYXZhRWRpdG9yCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZTxUIGV4dGVuZHMgRW50aXR5PgotCWV4dGVuZHMgUGFuZTxUPgotICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklFbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplSW5oZXJpdGFuY2VTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpOwotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVFbnRpdHlDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplUXVlcmllc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVJbmhlcml0YW5jZUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplR2VuZXJhdG9yc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVTZWNvbmRhcnlUYWJsZXNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVudGl0eUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkVudGl0eVNlY3Rpb25fdGl0bGUsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkKLQkJKTsKLQotCQl0aGlzLmluaXRpYWxpemVFbnRpdHlTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbnRpdHlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhYmxlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFbnRpdHlOYW1lQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSWRDbGFzc1JlZmVyZW5jZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPElkQ2xhc3NSZWZlcmVuY2U+IGJ1aWxkSWRDbGFzc1JlZmVyZW5jZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBJZENsYXNzUmVmZXJlbmNlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElkQ2xhc3NSZWZlcmVuY2UgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRJZENsYXNzUmVmZXJlbmNlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVRdWVyaWVzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5FbnRpdHlDb21wb3NpdGVfcXVlcmllcyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVF1ZXJpZXNTZWN0aW9uKGNvbnRhaW5lciwgYnVpbGRRdWVyeUNvbnRhaW5lckhvbGRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVF1ZXJpZXNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeUNvbnRhaW5lcj4gcXVlcnlDb250YWluZXJIb2xkZXIpIHsKLQkJbmV3IFF1ZXJpZXNDb21wb3NpdGUodGhpcywgcXVlcnlDb250YWluZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5Q29udGFpbmVyPiBidWlsZFF1ZXJ5Q29udGFpbmVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIFF1ZXJ5Q29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFF1ZXJ5Q29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UXVlcnlDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZU92ZXJyaWRlc1NlY3Rpb24pOwotCQlpbml0aWFsaXplQXR0cmlidXRlT3ZlcnJpZGVzU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQXR0cmlidXRlT3ZlcnJpZGVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUluaGVyaXRhbmNlQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5FbnRpdHlDb21wb3NpdGVfaW5oZXJpdGFuY2UpOwotCQlpbml0aWFsaXplSW5oZXJpdGFuY2VTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0b3JzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfcHJpbWFyeUtleUdlbmVyYXRpb25TZWN0aW9uKTsKLQkJaW5pdGlhbGl6ZUdlbmVyYXRvcnNTZWN0aW9uKGNvbnRhaW5lciwgYnVpbGRHZW5lcmF0b3JDb250YWluZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0b3JzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdG9yQ29udGFpbmVyPiBnZW5lcmF0b3JDb250YWluZXJIb2xkZXIpIHsKLQkJbmV3IEdlbmVyYXRpb25Db21wb3NpdGUodGhpcywgZ2VuZXJhdG9yQ29udGFpbmVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGJ1aWxkR2VuZXJhdG9yQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIEdlbmVyYXRvckNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBHZW5lcmF0b3JDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRHZW5lcmF0b3JDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNlY29uZGFyeVRhYmxlc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX3NlY29uZGFyeVRhYmxlcyk7Ci0JCWluaXRpYWxpemVTZWNvbmRhcnlUYWJsZXNTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjU0MzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TdHJ1Y3R1cmVOb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyCi0JaW1wbGVtZW50cyBKcGFEZXRhaWxzUHJvdmlkZXIKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gcHJvdmlkZXNEZXRhaWxzKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHN0cnVjdHVyZU5vZGUuZ2V0SWQoKSwgT3JtU3RydWN0dXJlTm9kZXMuRU5USVRZX01BUFBJTkdTX0lEKQotCQkJCSYmIHByb3ZpZGVzRGV0YWlscyhzdHJ1Y3R1cmVOb2RlLmdldFJlc291cmNlVHlwZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcHJvdmlkZXNEZXRhaWxzKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTFkZDkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0T3ZlcnJpZGVzQ29tcG9zaXRlPEVudGl0eT4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBFbnRpdHk+IHBhcmVudFBhbmUsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI+IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eVVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDIzZTM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbnRpdHlVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVudGl0eVVpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgRW50aXR5PiAKLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotewotCXByb3RlY3RlZCBBYnN0cmFjdEVudGl0eVVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkVudGl0eVVpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRW50aXR5VWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvclR5cGVNYXBwaW5nKGdldEtleSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTg2MDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdElkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGlibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBJZE1hcHBpbmc+Ci0JZXh0ZW5kcyBQYW5lPFQ+Ci0gICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQlwdWJsaWMgQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW5pdGlhbGl6ZUlkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVUeXBlQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVHZW5lcmF0aW9uQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSWRTZWN0aW9uX3RpdGxlLAotCQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKSk7Ci0KLQkJdGhpcy5pbml0aWFsaXplSWRTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcik7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVR5cGVDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX3R5cGUpOwotCQl0aGlzLmluaXRpYWxpemVUeXBlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVHlwZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkoKEdyaWRMYXlvdXQpIGNvbnRhaW5lci5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0JCQotCQkvLyBObyBjb252ZXJ0ZXIKLQkJQnV0dG9uIG5vQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQkJY29udGFpbmVyLCAKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9kZWZhdWx0LCAKLQkJCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoQ29udmVydGVyLk5PX0NPTlZFUlRFUiksIAotCQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBub0NvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQkKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyID0gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJLy8gVGVtcG9yYWwKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQkJY29udGFpbmVyLCAKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90ZW1wb3JhbCwgCi0JCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpLCAKLQkJCQludWxsKTsKLQkJcmVnaXN0ZXJTdWJQYW5lKG5ldyBUZW1wb3JhbFR5cGVDb21wb3NpdGUoYnVpbGRUZW1wb3JhbENvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhdGlvbkNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBJZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIENvbHVtbj4gYnVpbGRDb2x1bW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCkpICB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb2x1bW4gdHJhbnNmb3JtXyhUIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldENvbHVtbigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKGZpbmFsIFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLkNPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcigpOwotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoY29udmVydGVyLmdldFR5cGUoKSA9PSBjb252ZXJ0ZXJUeXBlKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0Q29udmVydGVyKGNvbnZlcnRlclR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGJ1aWxkQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBDb252ZXJ0ZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLkNPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29udmVydGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8VGVtcG9yYWxDb252ZXJ0ZXI+IGJ1aWxkVGVtcG9yYWxDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBUZW1wb3JhbENvbnZlcnRlcj4oY29udmVydGVySG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUZW1wb3JhbENvbnZlcnRlciB0cmFuc2Zvcm1fKENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJCQlyZXR1cm4gY29udmVydGVyLmdldFR5cGUoKSA9PSBDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSID8gKFRlbXBvcmFsQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RJZE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RJZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUzMmM4NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdElkTWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgSWRNYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0SWRNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLklkTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSWRNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NGNmY2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFN0cmF0ZWd5OiAgICAgICAgICAgIHwgRW51bUNvbWJvVmlld2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFZhbHVlOiAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ID4gRGlzY3JpbWluYXRvciBDb2x1bW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgICAgICAgICAgIHwgQ29sdW1uQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFR5cGU6ICAgICAgICAgICAgICAgIHwgRW51bUNvbWJvVmlld2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENvbHVtbiBEZWZpbml0aW9uOiAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IExlbmd0aDogICAgICAgICAgICAgIHwgSSAgICAgICB8SXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENvbHVtbkNvbWJvCi0gKiBAc2VlIEVudW1Db21ib1ZpZXdlcgotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZTxUIGV4dGVuZHMgRW50aXR5PiBleHRlbmRzIFBhbmU8VD4gewotCi0JLyoqCi0JICogQSBrZXkgdXNlZCB0byByZXByZXNlbnQgdGhlIGRlZmF1bHQgdmFsdWUsIHRoaXMgaXMgcmVxdWlyZWQgdG8gY29udmVydAotCSAqIHRoZSBzZWxlY3RlZCBpdGVtIGZyb20gYSBjb21ibyB0byA8Y29kZT5udWxsPC9jb2RlPi4gVGhpcyBrZXkgaXMgbW9zdAotCSAqIGxpa2VseSBuZXZlciB0eXBlZCB0aGUgdXNlciBhbmQgaXQgd2lsbCBoZWxwIHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvCi0JICogPGNvZGU+bnVsbDwvY29kZT4gd2hlbiBpdCdzIHRpbWUgdG8gc2V0IHRoZSBuZXcgc2VsZWN0ZWQgdmFsdWUgaW50byB0aGUKLQkgKiBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBERUZBVUxUX0tFWSA9ICI/ISMhPyM/Iz9kZWZhdWx0PyM/ISM/ISM/IjsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBOT05FX0tFWSA9ICI/ISMhPyM/Iz9ub25lPyM/ISM/ISM/IjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SW5oZXJpdGFuY2VDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7Ci0KLQkJQ29tcG9zaXRlIHN1YlBhbmUgPSBhZGRTdWJQYW5lKAotCQkJY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4KLQkJKTsKLQotCQkvLyBTdHJhdGVneSB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQlzdWJQYW5lLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSW5oZXJpdGFuY2VDb21wb3NpdGVfc3RyYXRlZ3ksCi0JCQlhZGRTdHJhdGVneUNvbWJvKHN1YlBhbmUpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0lOSEVSSVRBTkNFX1NUUkFURUdZCi0JCSk7Ci0KLQkJLy8gRGlzY3JpbmF0b3IgVmFsdWUgd2lkZ2V0cwotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZHZFbmFibGVkID0gdGhpcy5idWlsZERpc2NyaW1pbmF0b3JWYWx1ZUVuYWJsZWRIb2xkZXIoKTsKLQkJQ29tYm8gZGlzY3JpbWluYXRvclZhbHVlQ29tYm8gPSBhZGRFZGl0YWJsZUNvbWJvKAotCQkJc3ViUGFuZSwKLQkJCWJ1aWxkRGlzY3JpbWluYXRvclZhbHVlTGlzdEhvbGRlcigpLAotCQkJYnVpbGREaXNjcmltaW5hdG9yVmFsdWVIb2xkZXIoKSwKLQkJCWJ1aWxkRGlzY3JpbWluYXRvclZhbHVlQ29udmVydGVyKCksCi0JCQlkdkVuYWJsZWQKLQkJKTsKLQkJTGFiZWwgZGlzY3JpbWluYXRvclZhbHVlTGFiZWwgPSBhZGRMYWJlbCgKLQkJCXN1YlBhbmUsIAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvclZhbHVlLAotCQkJZHZFbmFibGVkCi0JCSk7Ci0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQlzdWJQYW5lLAotCQkJZGlzY3JpbWluYXRvclZhbHVlTGFiZWwsCi0JCQlkaXNjcmltaW5hdG9yVmFsdWVDb21ibywKLQkJCW51bGwsCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfSU5IRVJJVEFOQ0VfRElTQ1JJTUlOQVRPUl9WQUxVRQotCQkpOwotCQotCQluZXcgRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZTxFbnRpdHk+KHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJLy8gUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zIHdpZGdldHMKLQkJYWRkUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERpc2NyaW1pbmF0b3JWYWx1ZUVuYWJsZWRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfSVNfQUxMT1dFRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JMaXN0VmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCWJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9WQUxVRV9QUk9QRVJUWSwgRW50aXR5LkRJU0NSSU1JTkFUT1JfVkFMVUVfSVNfVU5ERUZJTkVEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJU3RyaW5nIHZhbHVlID0gdGhpcy5zdWJqZWN0LmdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCAmJiB0aGlzLnN1YmplY3QuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSkgewotCQkJCQlyZXR1cm4gTk9ORV9LRVk7Ci0JCQkJfQotCi0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSBERUZBVUxUX0tFWTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZhbHVlID0gREVGQVVMVF9LRVkgKyB2YWx1ZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZERpc2NyaW1pbmF0b3JWYWx1ZUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGdldFN1YmplY3QoKSA9PSBudWxsKSB7Ci0JCQkJCS8vdGhpcyBpcyBwYXJ0IG9mIGEgbGlzdCBnaXZlbiB0byBhIGNvbWJvLCBjb21ib3MgZG9uJ3QgdGFrZSBraW5kbHkgdG8gbnVsbAotCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTm9uZVNlbGVjdGVkOwotCQkJCX0KLQotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gZ2V0U3ViamVjdCgpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJCQkJaWYgKHZhbHVlID09IG51bGwgJiYgZ2V0U3ViamVjdCgpLmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpIHsKLQkJCQkJCXZhbHVlID0gTk9ORV9LRVk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2YWx1ZSA9ICh2YWx1ZSAhPSBudWxsKSA/IAotCQkJCQkJCQlERUZBVUxUX0tFWSArIHZhbHVlCi0JCQkJCQkJOiAKLQkJCQkJCQkJREVGQVVMVF9LRVk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0TmFtZSA9IHZhbHVlLnN1YnN0cmluZyhERUZBVUxUX0tFWS5sZW5ndGgoKSk7Ci0KLQkJCQkJaWYgKGRlZmF1bHROYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQkJdmFsdWUgPSBOTFMuYmluZCgKLQkJCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCQkJCWRlZmF1bHROYW1lCi0JCQkJCQkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdmFsdWUgPSBKcHRVaURldGFpbHNNZXNzYWdlcy5Qcm92aWRlckRlZmF1bHQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHZhbHVlLnN0YXJ0c1dpdGgoTk9ORV9LRVkpKSB7Ci0JCQkJCXZhbHVlID0gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTm9uZVNlbGVjdGVkOwotCQkJCX0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGlzY3JpbWluYXRvclZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCS8vIENvbnZlcnQgdGhlIGRlZmF1bHQgdmFsdWUgb3IgYW4gZW1wdHkgc3RyaW5nIHRvIG51bGwKLQkJCQlpZiAoKHZhbHVlICE9IG51bGwpICYmCi0JCQkJICAgKCh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB8fCB2YWx1ZS5zdGFydHNXaXRoKERFRkFVTFRfS0VZKSB8fCB2YWx1ZS5zdGFydHNXaXRoKE5PTkVfS0VZKSkpIHsKLQotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCi0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGlzY3JpbWluYXRvclZhbHVlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JMaXN0VmFsdWVIb2xkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RW50aXR5LCBJbmhlcml0YW5jZVR5cGU+IGFkZFN0cmF0ZWd5Q29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFbnRpdHksIEluaGVyaXRhbmNlVHlwZT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5LkRFRkFVTFRfSU5IRVJJVEFOQ0VfU1RSQVRFR1lfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVudGl0eS5TUEVDSUZJRURfSU5IRVJJVEFOQ0VfU1RSQVRFR1lfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBJbmhlcml0YW5jZVR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhJbmhlcml0YW5jZVR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5jbGFzcywKLQkJCQkJQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZS5jbGFzcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoSW5oZXJpdGFuY2VUeXBlIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0Sm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2YyMTc1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sU3dpdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogQWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3Igam9pbmluZyBzdHJhdGVneSBmb3JtIHBhbmVzCi0gKiAKLSAqIEhlcmUgaXMgdGhlIGJhc2ljIGxheW91dCBvZiB0aGlzIHBhbmU6ICAKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCBvIDxsYWJlbD4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgKGpvaW5pbmcgc3RyYXRlZ3kgZGV0YWlscyBjb21wb3NpdGUpICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUge0BsaW5rIE93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2V9Ci0gKiBAc2VlIHtAbGluayBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneX0KLSAqIEBzZWUge0BsaW5rIE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Sm9pbmluZ1N0cmF0ZWd5UGFuZQotCQk8UiBleHRlbmRzIFJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgUyBleHRlbmRzIEpvaW5pbmdTdHJhdGVneT4gCi0JZXh0ZW5kcyBQYW5lPFI+Ci17Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBzdHJhdGVneURldGFpbHNDb21wb3NpdGU7Ci0JCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEpvaW5pbmdTdHJhdGVneVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBmb3JtIHBhbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0Sm9pbmluZ1N0cmF0ZWd5UGFuZSgKLQkJCVBhbmU8PyBleHRlbmRzIFI+IHBhcmVudFBhbmUsIAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RKb2luaW5nU3RyYXRlZ3lQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUj4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNTdHJhdGVneUhvbGRlcigpOwotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IDU7Ci0JCXBhZ2VCb29rLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJdGhpcy5zdHJhdGVneURldGFpbHNDb21wb3NpdGUgPSBidWlsZFN0cmF0ZWd5RGV0YWlsc0NvbXBvc2l0ZShwYWdlQm9vayk7Ci0JCQotCQluZXcgQ29udHJvbFN3aXRjaGVyKHRoaXMuYnVpbGRVc2VzU3RyYXRlZ3lIb2xkZXIoKSwgYnVpbGRQYWdlQm9va1RyYW5zZm9ybWVyKCksIHBhZ2VCb29rKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbXBvc2l0ZSBidWlsZFN0cmF0ZWd5RGV0YWlsc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KTsKLQkKLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQ29udHJvbD4gYnVpbGRQYWdlQm9va1RyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPEJvb2xlYW4sIENvbnRyb2w+KCkgewotCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKEJvb2xlYW4gdXNlc1N0cmF0ZWd5KSB7Ci0JCQkJcmV0dXJuICh1c2VzU3RyYXRlZ3kuYm9vbGVhblZhbHVlKCkpID8gCi0JCQkJCUFic3RyYWN0Sm9pbmluZ1N0cmF0ZWd5UGFuZS50aGlzLnN0cmF0ZWd5RGV0YWlsc0NvbXBvc2l0ZSA6Ci0JCQkJCW51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEpwYURldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SnBhRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzZTUyMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SnBhRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtVWlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIHRoZSBkZXRhaWxzIHZpZXcuCi0gKgotICogQHNlZSBKcGFTdHJ1Y3R1cmVOb2RlCi0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpwYURldGFpbHNQYWdlPFQgZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPgotCWV4dGVuZHMgUGFuZTxUPgotCWltcGxlbWVudHMgSnBhRGV0YWlsc1BhZ2U8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2VKcGFEZXRhaWxzUGFnZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEpwYURldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+KCksIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtVWkgZ2V0SnBhUGxhdGZvcm1VaSgpIHsKLQkJU3RyaW5nIHBsYXRmb3JtSWQgPSBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0SWQoKTsKLQkJcmV0dXJuIEpwYVBsYXRmb3JtVWlSZWdpc3RyeS5pbnN0YW5jZSgpLmdldEpwYVBsYXRmb3JtVWkocGxhdGZvcm1JZCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0U3ViamVjdChUIHN1YmplY3QpIHsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciA9IChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPikgZ2V0U3ViamVjdEhvbGRlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKHN1YmplY3QpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTVjNmIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgTWFueVRvTWFueU1hcHBpbmd9Ci0gKiBAc2VlIHtAbGluayBUYXJnZXRFbnRpdHlDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIENhc2NhZGVDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBPcmRlcmluZ0NvbXBvc2l0ZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIE1hbnlUb01hbnlNYXBwaW5nLCBSIGV4dGVuZHMgTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci0gICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb01hbnlNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbml0aWFsaXplTWFueVRvTWFueUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVPcmRlcmluZ0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvTWFueUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hbnlUb01hbnlTZWN0aW9uX3RpdGxlLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpCi0JCSk7Ci0KLQkJdGhpcy5pbml0aWFsaXplTWFueVRvTWFueVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplTWFueVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcik7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGJ1aWxkSm9pbmluZ0hvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcmRlcmluZ0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcmRlcmluZ0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Uj4gYnVpbGRKb2luaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIFI+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBSIHRyYW5zZm9ybV8oVCB2YWx1ZSkgewotCQkJCXJldHVybiAoUikgdmFsdWUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FzY2FkZT4gYnVpbGRDYXNjYWRlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIENhc2NhZGU+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FzY2FkZSB0cmFuc2Zvcm1fKFQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q2FzY2FkZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlNTBmMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb248TSwgVCBleHRlbmRzIE1hbnlUb01hbnlNYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmM2QxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5DYXNjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgTWFueVRvT25lTWFwcGluZywgUiBleHRlbmRzIE1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci0JaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWluaXRpYWxpemVNYW55VG9PbmVDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVneUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvT25lQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFueVRvT25lU2VjdGlvbl90aXRsZSwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKQotCQkpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZU1hbnlUb09uZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplTWFueVRvT25lU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKb2luaW5nU3RyYXRlZ3lDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBidWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENhc2NhZGU+IGJ1aWxkQ2FzY2FkZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxULCBDYXNjYWRlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhc2NhZGUgdHJhbnNmb3JtXyhUIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldENhc2NhZGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFI+IGJ1aWxkSm9pbmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxULCBSPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUiB0cmFuc2Zvcm1fKFQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKFIpIHZhbHVlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IGdyb3VwQm94TWFyZ2luKSB7Ci0JCXJldHVybiBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc1OTgwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb248TSwgVCBleHRlbmRzIE1hbnlUb09uZU1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMTBiZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8VCBleHRlbmRzIE1hcHBlZFN1cGVyY2xhc3M+Ci0JZXh0ZW5kcyBQYW5lPFQ+Ci0gICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZU1hcHBlZFN1cGVyY2xhc3NDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hcHBlZFN1cGVyY2xhc3NDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5NYXBwZWRTdXBlcmNsYXNzU2VjdGlvbl90aXRsZSwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKQotCQkpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZU1hcHBlZFN1cGVyY2xhc3NTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYXBwZWRTdXBlcmNsYXNzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSWRDbGFzc1JlZmVyZW5jZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SWRDbGFzc1JlZmVyZW5jZT4gYnVpbGRJZENsYXNzUmVmZXJlbmNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBJZENsYXNzUmVmZXJlbmNlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElkQ2xhc3NSZWZlcmVuY2UgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRJZENsYXNzUmVmZXJlbmNlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzA5YTJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgTWFwcGVkU3VwZXJjbGFzcz4KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotewotCXByb3RlY3RlZCBBYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yVHlwZU1hcHBpbmcoZ2V0S2V5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGMwMzdjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLQlpbXBsZW1lbnRzIE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRGb3IoTSBtYXBwYWJsZU9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1MTA4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPbmVUb01hbnlNYXBwaW5nCi0gKiBAc2VlIENhc2NhZGVDb21wb3NpdGUKLSAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIEpvaW5UYWJsZUNvbXBvc2l0ZQotICogQHNlZSBPcmRlcmluZ0NvbXBvc2l0ZQotICogQHNlZSBUYXJnZXRFbnRpdHlDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgT25lVG9NYW55TWFwcGluZywgUiBleHRlbmRzIE9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci0JaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JT25lVG9NYW55TWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW5pdGlhbGl6ZU9uZVRvTWFueUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVPcmRlcmluZ0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9NYW55Q29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuT25lVG9NYW55U2VjdGlvbl90aXRsZSwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKQotCQkpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZU9uZVRvTWFueVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplT25lVG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKb2luaW5nU3RyYXRlZ3lDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBidWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT3JkZXJpbmdDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JkZXJpbmdDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFI+IGJ1aWxkSm9pbmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxULCBSPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUiB0cmFuc2Zvcm1fKFQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKFIpIHZhbHVlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOwotCQkJfQotCQl9OwotCX0JCi0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDYXNjYWRlPiBidWlsZENhc2NhZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgQ2FzY2FkZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYXNjYWRlIHRyYW5zZm9ybV8oVCB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDYXNjYWRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBncm91cEJveE1hcmdpbikgewotCQlyZXR1cm4gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YWFmMTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQgZXh0ZW5kcyBPbmVUb01hbnlNYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXRLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5PbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5PbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3ZDM4ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0T25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBPbmVUb09uZU1hcHBpbmcsIFIgZXh0ZW5kcyBPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci0JaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW5pdGlhbGl6ZU9uZVRvT25lQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVKb2luaW5nU3RyYXRlZ3lDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9uZVRvT25lQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuT25lVG9PbmVTZWN0aW9uX3RpdGxlLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpCi0JCSk7Ci0KLQkJdGhpcy5pbml0aWFsaXplT25lVG9PbmVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZU9uZVRvT25lU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKb2luaW5nU3RyYXRlZ3lDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGJ1aWxkSm9pbmluZ0hvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkUGFuZShDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgZ3JvdXBCb3hNYXJnaW4pIHsKLQkJcmV0dXJuIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Uj4gYnVpbGRKb2luaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIFI+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBSIHRyYW5zZm9ybV8oVCB2YWx1ZSkgewotCQkJCXJldHVybiAoUikgdmFsdWUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDYXNjYWRlPiBidWlsZENhc2NhZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgQ2FzY2FkZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYXNjYWRlIHRyYW5zZm9ybV8oVCB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDYXNjYWRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTViOWM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgT25lVG9PbmVNYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0T25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9yZGVyaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0T3JkZXJpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyOWI5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0T3JkZXJpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT3JkZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gT3JkZXJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG8gUHJpbWFyeSBLZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgbyBDdXN0b20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBDb2xsZWN0aW9uTWFwcGluZwotICogQHNlZSBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9yZGVyaW5nQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDb2xsZWN0aW9uTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9yZGVyaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdE9yZGVyaW5nQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIENvbGxlY3Rpb25NYXBwaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9yZGVyaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdE9yZGVyaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29sbGVjdGlvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxPcmRlcmFibGU+IGJ1aWxkT3JkZXJhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2xsZWN0aW9uTWFwcGluZywgT3JkZXJhYmxlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9yZGVyYWJsZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE9yZGVyYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vT3JkZXJpbmdIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPE9yZGVyYWJsZT4gb3JkZXJhYmxlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9yZGVyYWJsZSwgQm9vbGVhbj4ob3JkZXJhYmxlSG9sZGVyLCBPcmRlcmFibGUuTk9fT1JERVJJTkdfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNOb09yZGVyaW5nKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5vT3JkZXJpbmcodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFByaW1hcnlLZXlPcmRlcmluZ0hvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8T3JkZXJhYmxlPiBvcmRlcmFibGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JkZXJhYmxlLCBCb29sZWFuPihvcmRlcmFibGVIb2xkZXIsIE9yZGVyYWJsZS5QS19PUkRFUklOR19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc1BrT3JkZXJpbmcoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0UGtPcmRlcmluZyh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ3VzdG9tT3JkZXJpbmdIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPE9yZGVyYWJsZT4gb3JkZXJhYmxlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9yZGVyYWJsZSwgQm9vbGVhbj4ob3JkZXJhYmxlSG9sZGVyLCBPcmRlcmFibGUuQ1VTVE9NX09SREVSSU5HX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Q3VzdG9tT3JkZXJpbmcodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU3BlY2lmaWVkT3JkZXJCeUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8T3JkZXJhYmxlPiBvcmRlcmFibGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JkZXJhYmxlLCBTdHJpbmc+KG9yZGVyYWJsZUhvbGRlciwgT3JkZXJhYmxlLlNQRUNJRklFRF9PUkRFUl9CWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkT3JkZXJCeSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTkzZDYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPdmVycmlkZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE92ZXJyaWRlc0NvbXBvc2l0ZTxUIGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+Ci0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHJpdmF0ZSBQYW5lPEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZVBhbmU7Ci0JcHJpdmF0ZSBQYW5lPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVQYW5lOwotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8QmFzZU92ZXJyaWRlPiBzZWxlY3RlZE92ZXJyaWRlSG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gb3ZlcnJpZGVWaXJ0dWFsT3ZlcnJpZGVIb2xkZXI7Ci0JCi0JCi0JcHJvdGVjdGVkIEFic3RyYWN0T3ZlcnJpZGVzQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXRoaXMuc2VsZWN0ZWRPdmVycmlkZUhvbGRlciA9IGJ1aWxkU2VsZWN0ZWRPdmVycmlkZUhvbGRlcigpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2VPdmVycmlkZT4gYnVpbGRTZWxlY3RlZE92ZXJyaWRlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGU+KCk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gT3ZlcnJpZGVzIGdyb3VwIHBhbmUKLQkJY29udGFpbmVyID0gYWRkVGl0bGVkR3JvdXAoCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGVPdmVycmlkZXNHcm91cCk7Ci0JCQotCQkvLyBPdmVycmlkZXMgbGlzdCBwYW5lCi0JCWluaXRpYWxpemVPdmVycmlkZXNMaXN0KGNvbnRhaW5lcik7Ci0JCQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOwotCQkKLQkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBjaGVjayBib3gKLQkJQnV0dG9uIG92ZXJyaWRlQ2hlY2tCb3ggPSBhZGRDaGVja0JveCgKLQkJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKSwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5PdmVycmlkZXNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0LAotCQkJCWdldE92ZXJyaWRlVmlydHVhbE92ZXJyaWRlSG9sZGVyKCksCi0JCQkJbnVsbCk7Ci0JCVNXVFRvb2xzLmNvbnRyb2xWaXNpYmxlU3RhdGUoYnVpbGRTZWxlY3RlZE92ZXJyaWRlQm9vbGVhbkhvbGRlcigpLCBvdmVycmlkZUNoZWNrQm94KTsKLQkJCi0JCS8vIFByb3BlcnR5IHBhbmUKLQkJUGFnZUJvb2sgcGFnZUJvb2sgPSBhZGRQYWdlQm9vayhjb250YWluZXIpOwotCQlpbml0aWFsaXplT3ZlcnJpZGVQYW5lcyhwYWdlQm9vayk7Ci0JCWluc3RhbGxPdmVycmlkZUNvbnRyb2xTd2l0Y2hlcih0aGlzLnNlbGVjdGVkT3ZlcnJpZGVIb2xkZXIsIHBhZ2VCb29rKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU92ZXJyaWRlUGFuZXMoUGFnZUJvb2sgcGFnZUJvb2spIHsKLQkJaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlUGFuZShwYWdlQm9vayk7Ci0JCWlmIChzdXBwb3J0c0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkpIHsKLQkJCWluaXRpYWxpemVBc3NvY2lhdGlvbk92ZXJyaWRlUGFuZShwYWdlQm9vayk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTZWxlY3RlZE92ZXJyaWRlQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGUsIEJvb2xlYW4+KHRoaXMuc2VsZWN0ZWRPdmVycmlkZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oQmFzZU92ZXJyaWRlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVPdmVycmlkZXNMaXN0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEFkZFJlbW92ZUxpc3RQYW5lPFQ+KAotCQkJCXRoaXMsCi0JCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDgpLAotCQkJCWJ1aWxkT3ZlcnJpZGVzQWRhcHRlcigpLAotCQkJCWJ1aWxkT3ZlcnJpZGVzTGlzdE1vZGVsKCksCi0JCQkJdGhpcy5zZWxlY3RlZE92ZXJyaWRlSG9sZGVyLAotCQkJCWJ1aWxkT3ZlcnJpZGVMYWJlbFByb3ZpZGVyKCksCi0JCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0FUVFJJQlVURV9PVkVSUklERVMpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQnV0dG9uUGFuZShDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7Ci0JCQkJLy9ubyBidXR0b25zOiBubyB3YXkgdG8gYWRkL3JlbW92ZS9lZGl0IG92ZXJyaWRlcywgdGhleSBhcmUgYWxsIGRlZmF1bHRlZCBpbgotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbnMoKSB7Ci0JCQkJLy9ubyBidXR0b25zOiBubyB3YXkgdG8gYWRkL3JlbW92ZS9lZGl0IG92ZXJyaWRlcywgdGhleSBhcmUgYWxsIGRlZmF1bHRlZCBpbgotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQXR0cmlidXRlT3ZlcnJpZGVQYW5lKFBhZ2VCb29rIHBhZ2VCb29rKSB7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4gIGF0dHJpYnV0ZU92ZXJyaWRlSG9sZGVyID0gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUhvbGRlcigpOwotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlUGFuZSA9IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVQYW5lKHBhZ2VCb29rLCBhdHRyaWJ1dGVPdmVycmlkZUhvbGRlcik7Ci0JCWluc3RhbGxBdHRyaWJ1dGVPdmVycmlkZVBhbmVFbmFibGVyKHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVQYW5lLCBhdHRyaWJ1dGVPdmVycmlkZUhvbGRlcik7Ci0JfQotCQotCXByb3RlY3RlZCBQYW5lPEF0dHJpYnV0ZU92ZXJyaWRlPiBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlUGFuZShQYWdlQm9vayBwYWdlQm9vaywgUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlQ29tcG9zaXRlKHRoaXMsIGF0dHJpYnV0ZU92ZXJyaWRlSG9sZGVyLCBwYWdlQm9vayk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbnN0YWxsQXR0cmlidXRlT3ZlcnJpZGVQYW5lRW5hYmxlcihQYW5lPEF0dHJpYnV0ZU92ZXJyaWRlPiBwYW5lLCBQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+IG92ZXJyaWRlSG9sZGVyKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcigKLQkJCQlidWlsZE92ZXJyaWRlQm9vbGVhbkhvbGRlcihvdmVycmlkZUhvbGRlciksCi0JCQkJcGFuZSk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT3ZlcnJpZGVCb29sZWFuSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQmFzZU92ZXJyaWRlPiBvdmVycmlkZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGUsIEJvb2xlYW4+KG92ZXJyaWRlSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oQmFzZU92ZXJyaWRlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZighdmFsdWUuaXNWaXJ0dWFsKCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQXNzb2NpYXRpb25PdmVycmlkZVBhbmUoUGFnZUJvb2sgcGFnZUJvb2spIHsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGU+ICBhc3NvY2lhdGlvbk92ZXJyaWRlSG9sZGVyID0gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlSG9sZGVyKCk7Ci0JCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZVBhbmUgPSBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVQYW5lKHBhZ2VCb29rLCBhc3NvY2lhdGlvbk92ZXJyaWRlSG9sZGVyKTsKLQkJaW5zdGFsbEFzc29jaWF0aW9uT3ZlcnJpZGVQYW5lRW5hYmxlcih0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVQYW5lLCBhc3NvY2lhdGlvbk92ZXJyaWRlSG9sZGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBhbmU8QXNzb2NpYXRpb25PdmVycmlkZT4gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlUGFuZShQYWdlQm9vayBwYWdlQm9vaywgUHJvcGVydHlWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlKHRoaXMsIGFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIsIHBhZ2VCb29rKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5zdGFsbEFzc29jaWF0aW9uT3ZlcnJpZGVQYW5lRW5hYmxlcihQYW5lPEFzc29jaWF0aW9uT3ZlcnJpZGU+IHBhbmUsIFByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlPiBvdmVycmlkZUhvbGRlcikgewotCQluZXcgUGFuZUVuYWJsZXIoCi0JCQkJYnVpbGRPdmVycmlkZUJvb2xlYW5Ib2xkZXIob3ZlcnJpZGVIb2xkZXIpLAotCQkJCXBhbmUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5zdGFsbE92ZXJyaWRlQ29udHJvbFN3aXRjaGVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2VPdmVycmlkZT4gb3ZlcnJpZGVIb2xkZXIsCi0JCQlQYWdlQm9vayBwYWdlQm9vaykgewotCQkKLQkJbmV3IENvbnRyb2xTd2l0Y2hlcigKLQkJCQlvdmVycmlkZUhvbGRlciwKLQkJCQlidWlsZFBhbmVUcmFuc2Zvcm1lcigpLAotCQkJCXBhZ2VCb29rKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlPiBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGUsIEFzc29jaWF0aW9uT3ZlcnJpZGU+KHRoaXMuc2VsZWN0ZWRPdmVycmlkZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQXNzb2NpYXRpb25PdmVycmlkZSB0cmFuc2Zvcm1fKEJhc2VPdmVycmlkZSB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBBc3NvY2lhdGlvbk92ZXJyaWRlKSA/IChBc3NvY2lhdGlvbk92ZXJyaWRlKSB2YWx1ZSA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGUsIEF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLnNlbGVjdGVkT3ZlcnJpZGVIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEF0dHJpYnV0ZU92ZXJyaWRlIHRyYW5zZm9ybV8oQmFzZU92ZXJyaWRlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZU92ZXJyaWRlKSA/IChBdHRyaWJ1dGVPdmVycmlkZSkgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGJ1aWxkRGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzTGlzdEhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcj4gY29udGFpbmVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciwgQXNzb2NpYXRpb25PdmVycmlkZT4oY29udGFpbmVySG9sZGVyLCBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxBc3NvY2lhdGlvbk92ZXJyaWRlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4gYnVpbGREZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzTGlzdEhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+IGNvbnRhaW5lckhvbGRlcikgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLCBBdHRyaWJ1dGVPdmVycmlkZT4oY29udGFpbmVySG9sZGVyLCBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZ2V0T3ZlcnJpZGVWaXJ0dWFsT3ZlcnJpZGVIb2xkZXIoKSB7Ci0JCWlmICh0aGlzLm92ZXJyaWRlVmlydHVhbE92ZXJyaWRlSG9sZGVyID09IG51bGwpIHsKLQkJCXRoaXMub3ZlcnJpZGVWaXJ0dWFsT3ZlcnJpZGVIb2xkZXIgPSBidWlsZE92ZXJyaWRlVmlydHVhbE92ZXJyaWRlSG9sZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGVWaXJ0dWFsT3ZlcnJpZGVIb2xkZXI7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZVZpcnR1YWxPdmVycmlkZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGUsIEJvb2xlYW4+KHRoaXMuc2VsZWN0ZWRPdmVycmlkZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdXBkYXRlT3ZlcnJpZGUodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oQmFzZU92ZXJyaWRlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZighdmFsdWUuaXNWaXJ0dWFsKCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZE92ZXJyaWRlRGlzcGxheVN0cmluZyhCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUpIHsKLQkJU3RyaW5nIG92ZXJyaWRlVHlwZTsKLQkJCi0JCS8vIFJldHJpZXZlIHRoZSB0eXBlCi0JCWlmIChvdmVycmlkZSBpbnN0YW5jZW9mIEFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJCW92ZXJyaWRlVHlwZSA9IEpwdFVpRGV0YWlsc01lc3NhZ2VzLk92ZXJyaWRlc0NvbXBvc2l0ZV9hc3NvY2lhdGlvbjsKLQkJfQotCQllbHNlIHsKLQkJCW92ZXJyaWRlVHlwZSA9IEpwdFVpRGV0YWlsc01lc3NhZ2VzLk92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGU7Ci0JCX0KLQkJCi0JCS8vIEZvcm1hdCB0aGUgbmFtZQotCQlTdHJpbmcgbmFtZSA9IG92ZXJyaWRlLmdldE5hbWUoKTsKLQkJCi0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KG5hbWUpKSB7Ci0JCQluYW1lID0gSnB0VWlEZXRhaWxzTWVzc2FnZXMuT3ZlcnJpZGVzQ29tcG9zaXRlX25vTmFtZTsKLQkJfQotCQkKLQkJLy8gRm9ybWF0OiA8bmFtZT4gKEF0dHJpYnV0ZS9Bc3NvY2lhdGlvbiBPdmVycmlkZSkKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZChuYW1lKTsKLQkJc2IuYXBwZW5kKCIgKCIpOwotCQlzYi5hcHBlbmQob3ZlcnJpZGVUeXBlKTsKLQkJc2IuYXBwZW5kKCIpICIpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGJ1aWxkT3ZlcnJpZGVMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBidWlsZE92ZXJyaWRlRGlzcGxheVN0cmluZygoQmFzZU92ZXJyaWRlKSBlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFkYXB0ZXIgYnVpbGRPdmVycmlkZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCS8vbm8gd2F5IHRvIGFkZC9yZW1vdmUvZWRpdCBvdmVycmlkZXMsIHRoZXkgYXJlIGFsbCBkZWZhdWx0ZWQgaW4KLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJLy9ubyB3YXkgdG8gYWRkL3JlbW92ZS9lZGl0IG92ZXJyaWRlcywgdGhleSBhcmUgYWxsIGRlZmF1bHRlZCBpbgotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8QmFzZU92ZXJyaWRlPiBidWlsZE92ZXJyaWRlc0xpc3RIb2xkZXIoKSB7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcj4gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJIb2xkZXIgPSBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVySG9sZGVyKCk7Ci0JCUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEJhc2VPdmVycmlkZT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBCYXNlT3ZlcnJpZGU+PigpOwotCQkKLQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0SG9sZGVyKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVySG9sZGVyKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkRGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlc0xpc3RIb2xkZXIoYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJIb2xkZXIpKTsKLQkJCi0JCWlmIChzdXBwb3J0c0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkpIHsKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyPiBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVySG9sZGVyID0gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVySG9sZGVyKCk7Ci0JCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzTGlzdEhvbGRlcihhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVySG9sZGVyKSk7Ci0JCQlsaXN0LmFkZChidWlsZERlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlc0xpc3RIb2xkZXIoYXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lckhvbGRlcikpOwotCQl9Ci0JCQotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBCYXNlT3ZlcnJpZGU+LCBCYXNlT3ZlcnJpZGU+KGxpc3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyPiBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVySG9sZGVyKCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyPiBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJIb2xkZXIoKTsKLQkKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEJhc2VPdmVycmlkZT4gYnVpbGRPdmVycmlkZXNMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEJhc2VPdmVycmlkZT4oCi0JCQkJYnVpbGRPdmVycmlkZXNMaXN0SG9sZGVyKCksCi0JCQkJQmFzZU92ZXJyaWRlLk5BTUVfUFJPUEVSVFkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zZm9ybWVyPEJhc2VPdmVycmlkZSwgQ29udHJvbD4gYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8QmFzZU92ZXJyaWRlLCBDb250cm9sPigpIHsKLQkJCXB1YmxpYyBDb250cm9sIHRyYW5zZm9ybShCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUpIHsKLQkJCQlyZXR1cm4gQWJzdHJhY3RPdmVycmlkZXNDb21wb3NpdGUudGhpcy50cmFuc2Zvcm1TZWxlY3RlZE92ZXJyaWRlKG92ZXJyaWRlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNlbGVjdGVkIG92ZXJyaWRlLCByZXR1cm4gdGhlIGNvbnRyb2wgdGhhdCB3aWxsIGJlIGRpc3BsYXllZAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIHRyYW5zZm9ybVNlbGVjdGVkT3ZlcnJpZGUoQmFzZU92ZXJyaWRlIHNlbGVjdGVkT3ZlcnJpZGUpIHsKLQkJaWYgKHNlbGVjdGVkT3ZlcnJpZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVPdmVycmlkZSkgewotCQkJcmV0dXJuIEFic3RyYWN0T3ZlcnJpZGVzQ29tcG9zaXRlLnRoaXMuYXR0cmlidXRlT3ZlcnJpZGVQYW5lLmdldENvbnRyb2woKTsKLQkJfQotCQkKLQkJaWYgKHNlbGVjdGVkT3ZlcnJpZGUgaW5zdGFuY2VvZiBBc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPdmVycmlkZXNDb21wb3NpdGUudGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlUGFuZS5nZXRDb250cm9sKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGJ1aWxkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNMaXN0SG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyPiBjb250YWluZXJIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLCBBc3NvY2lhdGlvbk92ZXJyaWRlPihjb250YWluZXJIb2xkZXIsIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuU1BFQ0lGSUVEX0FTU09DSUFUSU9OX09WRVJSSURFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8QXNzb2NpYXRpb25PdmVycmlkZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlPiBidWlsZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc0xpc3RIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyPiBjb250YWluZXJIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciwgQXR0cmlidXRlT3ZlcnJpZGU+KGNvbnRhaW5lckhvbGRlciwgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU92ZXJyaWRlKGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0JCQotCQl0cnkgewotCQkJQmFzZU92ZXJyaWRlIG92ZXJyaWRlID0gdGhpcy5zZWxlY3RlZE92ZXJyaWRlSG9sZGVyLmdldFZhbHVlKCk7Ci0JCQkKLQkJCUJhc2VPdmVycmlkZSBuZXdPdmVycmlkZSA9IG92ZXJyaWRlLnNldFZpcnR1YWwoIXNlbGVjdGVkKTsKLQkJCXRoaXMuc2VsZWN0ZWRPdmVycmlkZUhvbGRlci5zZXRWYWx1ZShuZXdPdmVycmlkZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc5NTk5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0UHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBvc3RFeGVjdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BYnN0cmFjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLSBKb2luIENvbHVtbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIEluaGVyaXRhbmNlQ29tcG9zaXRlIC0gVGhlIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlPFQgZXh0ZW5kcyBFbnRpdHk+IGV4dGVuZHMgUGFuZTxUPgotewotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gam9pbkNvbHVtbkhvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udHJvbGxlciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7Ci0KLQkJRW50aXR5IHN1YmplY3QgPSBnZXRTdWJqZWN0KCk7Ci0JCWludCBpbmRleCA9IHN1YmplY3Quc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBzdWJqZWN0LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGluZGV4KTsKLQkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cgZGlhbG9nID0gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nKAotCQkJZ2V0U2hlbGwoKSwKLQkJCWdldFN1YmplY3QoKSwKLQkJCW51bGwKLQkJKTsKLQotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEFkZFByaW1hcnlLZXlKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248UHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2c+IGJ1aWxkQWRkUHJpbWFyeUtleUpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248UHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyBkaWFsb2cpIHsKLQkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQkJCWFkZEpvaW5Db2x1bW4oZGlhbG9nLmdldFN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpOwotCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nPiBidWlsZEVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJZWRpdEpvaW5Db2x1bW4oZGlhbG9nLmdldFN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkSm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+KCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRKb2luQ29sdW1uTGFiZWwoUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlpZiAoam9pbkNvbHVtbi5pc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQsCi0JCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCQkpOwotCQl9Ci0KLQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwpIHsKLQkJCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQsCi0JCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCQkpOwotCQkJfQotCi0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQsCi0JCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCQkpOwotCQl9Ci0KLQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zLAotCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRKb2luQ29sdW1uc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2VkaXQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtbihsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQkJCWludFtdIHNlbGVjdGVkSW5kaWNlcyA9IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZEluZGljZXMoKTsKLQkJCQlFbnRpdHkgZW50aXR5ID0gZ2V0U3ViamVjdCgpOwotCi0JCQkJZm9yIChpbnQgaW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJCQllbnRpdHkucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oc2VsZWN0ZWRJbmRpY2VzW2luZGV4XSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBidWlsZEpvaW5Db2x1bW5MYWJlbCgoUHJpbWFyeUtleUpvaW5Db2x1bW4pIGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7Ci0JCUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW4+LCBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4obGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFByaW1hcnlLZXlKb2luQ29sdW1uPigKLQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdEhvbGRlcigpLAotCQkJTmFtZWRDb2x1bW4uU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksCi0JCQlOYW1lZENvbHVtbi5ERUZBVUxUX05BTUVfUFJPUEVSVFksCi0JCQlCYXNlSm9pbkNvbHVtbi5TUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwKLQkJCUJhc2VKb2luQ29sdW1uLkRFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWQotCQkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eSwgUHJpbWFyeUtleUpvaW5Db2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oc3RhdGVPYmplY3QuZ2V0Sm9pbkNvbHVtbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZWRpdFByaW1hcnlLZXlKb2luQ29sdW1uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nIGRpYWxvZyA9IG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZygKLQkJCWdldFNoZWxsKCksCi0JCQlnZXRTdWJqZWN0KCksCi0JCQlqb2luQ29sdW1uCi0JCSk7Ci0KLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGRFZGl0UHJpbWFyeUtleUpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJam9pbkNvbHVtbkhvbGRlciA9IGJ1aWxkSm9pbkNvbHVtbkhvbGRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyBncm91cCBwYW5lCi0JCUdyb3VwIGdyb3VwUGFuZSA9IGFkZFRpdGxlZEdyb3VwKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX3ByaW1hcnlLZXlKb2luQ29sdW1uCi0JCSk7Ci0KLQkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBKb2luIENvbHVtbnMgY2hlY2sgYm94Ci0JCWFkZENoZWNrQm94KAotCQkJYWRkU3ViUGFuZShncm91cFBhbmUsIDgpLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucywKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCi0JCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyBsaXN0IHBhbmUKLQkJQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PiBqb2luQ29sdW1uc0xpc3RQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEVudGl0eT4oCi0JCQl0aGlzLAotCQkJZ3JvdXBQYW5lLAotCQkJYnVpbGRKb2luQ29sdW1uc0FkYXB0ZXIoKSwKLQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdE1vZGVsKCksCi0JCQlqb2luQ29sdW1uSG9sZGVyLAotCQkJYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fVEFCTEVfQ09MVU1OUwotCQkpOwotCi0JCWluc3RhbGxKb2luQ29sdW1uc0xpc3RQYW5lRW5hYmxlcihqb2luQ29sdW1uc0xpc3RQYW5lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbEpvaW5Db2x1bW5zTGlzdFBhbmVFbmFibGVyKEFkZFJlbW92ZUxpc3RQYW5lPEVudGl0eT4gcGFuZSkgewotCQluZXcgUGFuZUVuYWJsZXIoCi0JCQlidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSwKLQkJCXBhbmUKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSm9pbkNvbHVtbnMoYm9vbGVhbiBzZWxlY3RlZCkgewotCi0JCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKLQotCQl0cnkgewotCQkJLy8gQWRkIGEgam9pbiBjb2x1bW4gYnkgY3JlYXRpbmcgYSBzcGVjaWZpZWQgb25lIHVzaW5nIHRoZSBkZWZhdWx0Ci0JCQkvLyBvbmUgaWYgaXQgZXhpc3RzCi0JCQlpZiAoc2VsZWN0ZWQpIHsKLQotCQkJCXN3aXRjaERlZmF1bHRUb1NwZWNpZmllZCgpOwotCQkJfQotCQkJLy8gUmVtb3ZlIGFsbCB0aGUgc3BlY2lmaWVkIGpvaW4gY29sdW1ucwotCQkJZWxzZSB7Ci0JCQkJZm9yIChpbnQgaW5kZXggPSBnZXRTdWJqZWN0KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOyAtLWluZGV4ID49IDA7ICkgewotCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc3dpdGNoRGVmYXVsdFRvU3BlY2lmaWVkKCk7Ci0JCi0JcHJpdmF0ZSBjbGFzcyBPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyIGV4dGVuZHMgTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB7Ci0KLQkJcHVibGljIE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCQlzdXBlcihidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQkJcmV0dXJuIGxpc3RIb2xkZXIuc2l6ZSgpID4gMDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJCXVwZGF0ZUpvaW5Db2x1bW5zKHZhbHVlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YjE4ODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE9ybUVudGl0eQotICogQHNlZSBPcm1FbnRpdHlDb21wb3NpdGUgLSBUaGUgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBBZGRSZW1vdmVMaXN0UGFuZQotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTxUIGV4dGVuZHMgRW50aXR5PiBleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklFbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2Vjb25kYXJ5VGFibGVGcm9tRGlhbG9nKFNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZywgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0spIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoKTsKLQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZShkaWFsb2cuZ2V0U2VsZWN0ZWRUYWJsZSgpKTsKLQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZyhkaWFsb2cuZ2V0U2VsZWN0ZWRDYXRhbG9nKCkpOwotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoZGlhbG9nLmdldFNlbGVjdGVkU2NoZW1hKCkpOwotCi0JCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKHNlY29uZGFyeVRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U2Vjb25kYXJ5VGFibGU+IGJ1aWxkU2Vjb25kYXJ5VGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFNlY29uZGFyeVRhYmxlPigpOwotCX0KLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBidWlsZFNlY29uZGFyeVRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkvLyBUT0RPIGRpc3BsYXkgYSBxdWFsaWZpZWQgbmFtZSBpbnN0ZWFkCi0JCQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGUpIGVsZW1lbnQ7Ci0JCQkJaWYgKHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBzZWNvbmRhcnlUYWJsZS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJCXJldHVybiAiIjsvL1RPRE8KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2Vjb25kYXJ5VGFibGVEaWFsb2cgYnVpbGRTZWNvbmRhcnlUYWJsZURpYWxvZ0ZvckFkZCgpIHsKLQkJcmV0dXJuIG5ldyBTZWNvbmRhcnlUYWJsZURpYWxvZyhnZXRTaGVsbCgpLCBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLCBnZXRTdWJqZWN0KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpLCBnZXRTdWJqZWN0KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQWRkUmVtb3ZlTGlzdFBhbmUuQWRhcHRlciBidWlsZFNlY29uZGFyeVRhYmxlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlTZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2cgPSBidWlsZFNlY29uZGFyeVRhYmxlRGlhbG9nRm9yQWRkKCk7Ci0JCQkJYWRkU2Vjb25kYXJ5VGFibGVGcm9tRGlhbG9nKGRpYWxvZywgbGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX2VkaXQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCQkJCVNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWNvbmRhcnlUYWJsZURpYWxvZyhnZXRTaGVsbCgpLCBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLCBzZWNvbmRhcnlUYWJsZSk7Ci0JCQkJZWRpdFNlY29uZGFyeVRhYmxlRnJvbURpYWxvZyhkaWFsb2csIHNlY29uZGFyeVRhYmxlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IGdldFN1YmplY3QoKTsKLQkJCQlpbnRbXSBzZWxlY3RlZEluZGljZXMgPSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRJbmRpY2VzKCk7Ci0KLQkJCQlmb3IgKGludCBpbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQkJCWVudGl0eS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShzZWxlY3RlZEluZGljZXNbaW5kZXhdKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gZW5hYmxlT3B0aW9uT25TZWxlY3Rpb25DaGFuZ2UoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWlmIChsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXNTaXplKCkgIT0gMSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCQkJCXJldHVybiAhc2Vjb25kYXJ5VGFibGUuaXNWaXJ0dWFsKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gZW5hYmxlUmVtb3ZlT25TZWxlY3Rpb25DaGFuZ2UoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWlmIChsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZSkgbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKTsKLQkJCQlyZXR1cm4gIXNlY29uZGFyeVRhYmxlLmlzVmlydHVhbCgpOwkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0U2Vjb25kYXJ5VGFibGVGcm9tRGlhbG9nKFNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZywgU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKGRpYWxvZy5nZXRTZWxlY3RlZFRhYmxlKCkpOwotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKGRpYWxvZy5nZXRTZWxlY3RlZENhdGFsb2coKSk7Ci0JCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYShkaWFsb2cuZ2V0U2VsZWN0ZWRTY2hlbWEoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0VHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdFRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2ODBkZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0VHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb248TSwgVCBleHRlbmRzIFRyYW5zaWVudE1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlRyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlRyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0JCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0VmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3ODBmOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0VmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRpYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFZlcnNpb25NYXBwaW5nCi0gKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQotICogQHNlZSBUZW1wb3JhbFR5cGVDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIFZlcnNpb25NYXBwaW5nPiAKLQlleHRlbmRzIFBhbmU8VD4KLQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JVmVyc2lvbk1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWluaXRpYWxpemVWZXJzaW9uQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVUeXBlQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWZXJzaW9uQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVmVyc2lvblNlY3Rpb25fdGl0bGUsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkKLQkJKTsKLQotCQl0aGlzLmluaXRpYWxpemVWZXJzaW9uU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVWZXJzaW9uU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUeXBlQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fdHlwZQotCQkpOwotCQl0aGlzLmluaXRpYWxpemVUeXBlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVHlwZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkoKEdyaWRMYXlvdXQpIGNvbnRhaW5lci5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0KLQkJLy8gTm8gY29udmVydGVyCi0JCUJ1dHRvbiBub0NvbnZlcnRlckJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2RlZmF1bHQsIAotCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKENvbnZlcnRlci5OT19DT05WRVJURVIpLCAKLQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBub0NvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQkKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyID0gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJLy8gVGVtcG9yYWwKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fdGVtcG9yYWwsIAotCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpLCAKLQkJCW51bGwpOwotCQlyZWdpc3RlclN1YlBhbmUobmV3IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZShidWlsZFRlbXBvcmFsQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDb2x1bW4+IGJ1aWxkQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIENvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb2x1bW4gdHJhbnNmb3JtXyhUIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldENvbHVtbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoZmluYWwgU3RyaW5nIGNvbnZlcnRlclR5cGUpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCUNvbnZlcnRlciBjb252ZXJ0ZXIgPSB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVyKCk7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IGNvbnZlcnRlclR5cGUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRDb252ZXJ0ZXIoY29udmVydGVyVHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFZlcnNpb25NYXBwaW5nLCBDb252ZXJ0ZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLkNPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29udmVydGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFRlbXBvcmFsQ29udmVydGVyPiBidWlsZFRlbXBvcmFsQ29udmVydGVySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlciwgVGVtcG9yYWxDb252ZXJ0ZXI+KGNvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGVtcG9yYWxDb252ZXJ0ZXIgdHJhbnNmb3JtXyhDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUiA/IChUZW1wb3JhbENvbnZlcnRlcikgY29udmVydGVyIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdFZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0VmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjliYWUwNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0VmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb248TSwgVCBleHRlbmRzIFZlcnNpb25NYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0VmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlZlcnNpb25NYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BY2Nlc3NUeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0FjY2Vzc1R5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM2MWU0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0FjY2Vzc1R5cGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBBY2Nlc3MgVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQWNjZXNzSG9sZGVyCi0gKiBAc2VlIE9ybUVudGl0eUNvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBPcm1FbWJlZGRhYmxlQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjY2Vzc1R5cGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEFjY2Vzc0hvbGRlcj4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BY2Nlc3NUeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBBY2Nlc3NUeXBlQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEFjY2Vzc0hvbGRlcj4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEFjY2Vzc1R5cGVDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAotICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEFjY2Vzc0hvbGRlcj4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlFbnVtRm9ybUNvbWJvVmlld2VyPEFjY2Vzc0hvbGRlciwgQWNjZXNzVHlwZT4gY29tYm9WaWV3ZXIgPQotCQkJYWRkQWNjZXNzVHlwZUNvbWJvVmlld2VyKGNvbnRhaW5lcik7Ci0KLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWVzc2FnZXMuQWNjZXNzVHlwZUNvbXBvc2l0ZV9hY2Nlc3MsCi0JCQljb21ib1ZpZXdlci5nZXRDb250cm9sKCkKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEFjY2Vzc0hvbGRlciwgQWNjZXNzVHlwZT4gYWRkQWNjZXNzVHlwZUNvbWJvVmlld2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8QWNjZXNzSG9sZGVyLCBBY2Nlc3NUeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChBY2Nlc3NIb2xkZXIuREVGQVVMVF9BQ0NFU1NfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEFjY2Vzc0hvbGRlci5TUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIEFjY2Vzc1R5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdEFjY2VzcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhBY2Nlc3NUeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQkJSnB0VWlNZXNzYWdlcy5jbGFzcywKLQkJCQkJQWNjZXNzVHlwZUNvbXBvc2l0ZS50aGlzLAotCQkJCQl2YWx1ZQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShBY2Nlc3NUeXBlIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZEFjY2Vzcyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWRkUXVlcnlEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWRkUXVlcnlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5YmE5Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0FkZFF1ZXJ5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuVmFsaWRhdGluZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0xpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIENsaWVudHMgY2FuIHVzZSB0aGlzIGRpYWxvZyB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIFNlY29uZGFyeVRhYmxlIHNldHRpbmdzLgotICogVXNlIHRoZSBmb2xsb3dpbmcgb25jZSB0aGUgZGlhbG9nIGlzIGNsb3NlZDoKLSAqICAgICBAc2VlICNnZXRTZWxlY3RlZFRhYmxlKCkKLSAqICAgICBAc2VlICNnZXRTZWxlY3RlZENhdGFsb2coKQotICogICAgIEBzZWUgI2dldFNlbGVjdGVkU2NoZW1hKCkKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgQWRkUXVlcnlEaWFsb2cgZXh0ZW5kcyBWYWxpZGF0aW5nRGlhbG9nPEFkZFF1ZXJ5U3RhdGVPYmplY3Q+IHsKLQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHRvIGVkaXQgYW4gZXhpc3RpbmcgY29udmVyc2lvbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBBZGRRdWVyeURpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWRkUXVlcnlTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3IEFkZFF1ZXJ5U3RhdGVPYmplY3QoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG9wZW4gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KHRoaXMuZ2V0VGl0bGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkFkZFF1ZXJ5RGlhbG9nX3RpdGxlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb25UaXRsZSgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkFkZFF1ZXJ5RGlhbG9nX2Rlc2NyaXB0aW9uVGl0bGU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5BZGRRdWVyeURpYWxvZ19kZXNjcmlwdGlvbjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmU8QWRkUXVlcnlTdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IFF1ZXJ5RGlhbG9nUGFuZShjb250YWluZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCi0JCVF1ZXJ5RGlhbG9nUGFuZSBwYW5lID0gKFF1ZXJ5RGlhbG9nUGFuZSkgZ2V0UGFuZSgpOwotCQlwYW5lLnNlbGVjdEFsbCgpOwotCi0JCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhIHZhbHVlIHNldCBpbiB0aGUgdGV4dCB3aWRnZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB2YWx1ZSBzZXQgaW4gdGhlIHRleHQgd2lkZ2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlUeXBlKCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFF1ZXJ5VHlwZSgpOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFF1ZXJ5RGlhbG9nUGFuZSBleHRlbmRzIERpYWxvZ1BhbmU8QWRkUXVlcnlTdGF0ZU9iamVjdD4gewotCi0JCXByaXZhdGUgVGV4dCBuYW1lVGV4dDsKLQotCQlRdWVyeURpYWxvZ1BhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIoQWRkUXVlcnlEaWFsb2cudGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIHBhcmVudCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQl0aGlzLm5hbWVUZXh0ID0gYWRkTGFiZWxlZFRleHQoCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkFkZFF1ZXJ5RGlhbG9nX25hbWUsCi0JCQkJYnVpbGROYW1lSG9sZGVyKCkKLQkJCSk7Ci0JCQkKLQkJCWFkZExhYmVsZWRDb21ibygKLQkJCQljb250YWluZXIsIAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkFkZFF1ZXJ5RGlhbG9nX3F1ZXJ5VHlwZSwgCi0JCQkJYnVpbGRRdWVyeVR5cGVMaXN0SG9sZGVyKCksIAotCQkJCWJ1aWxkUXVlcnlUeXBlSG9sZGVyKCksIAotCQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCksCi0JCQkJbnVsbCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFF1ZXJ5VHlwZUxpc3RIb2xkZXIoKSB7Ci0JCQlMaXN0PFN0cmluZz4gcXVlcnlUeXBlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJcXVlcnlUeXBlcy5hZGQoUXVlcnkuTkFNRURfUVVFUlkpOwotCQkJcXVlcnlUeXBlcy5hZGQoUXVlcnkuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCQotCQkJcmV0dXJuIG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHF1ZXJ5VHlwZXMpOwotCQl9Ci0JCQotCQlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkU3RyaW5nQ29udmVydGVyKCkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJaWYgKHZhbHVlID09IFF1ZXJ5Lk5BTUVEX1FVRVJZKSB7Ci0JCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQWRkUXVlcnlEaWFsb2dfbmFtZWRRdWVyeTsKLQkJCQkJfQotCQkJCQlpZiAodmFsdWUgPT0gUXVlcnkuTkFNRURfTkFUSVZFX1FVRVJZKSB7Ci0JCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQWRkUXVlcnlEaWFsb2dfbmFtZWROYXRpdmVRdWVyeTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEFkZFF1ZXJ5U3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBBZGRRdWVyeVN0YXRlT2JqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUXVlcnlUeXBlSG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QWRkUXVlcnlTdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEFkZFF1ZXJ5U3RhdGVPYmplY3QuUVVFUllfVFlQRV9QUk9QRVJUWSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UXVlcnlUeXBlKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0UXVlcnlUeXBlKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJdm9pZCBzZWxlY3RBbGwoKSB7Ci0JCQl0aGlzLm5hbWVUZXh0LnNlbGVjdEFsbCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BZGRRdWVyeVN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0FkZFF1ZXJ5U3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRkODYyYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0FkZFF1ZXJ5U3RhdGVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLkFic3RyYWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Qcm9ibGVtOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHN0YXRlIG9iamVjdCB1c2VkIGJ5IHRoZSA8Y29kZT5BZGRRdWVyeURpYWxvZzwvY29kZT4sIHdoaWNoIHN0b3JlcwotICogdGhlIGN1cnJlbnQgbmFtZSBhbmQgdmFsaWRhdGVzIGl0IHdoZW4gaXQgaXMgbW9kaWZpZWQuCi0gKgotICogQHNlZSBBZGRRdWVyeURpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1maW5hbCBjbGFzcyBBZGRRdWVyeVN0YXRlT2JqZWN0IGV4dGVuZHMgQWJzdHJhY3ROb2RlCi17Ci0JLyoqCi0JICogVGhlIGluaXRpYWwgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBUaGUgaW5pdGlhbCBxdWVyeVR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBxdWVyeVR5cGU7Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+VmFsaWRhdG9yPC9jb2RlPiB1c2VkIHRvIHZhbGlkYXRlIHRoaXMgc3RhdGUgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCS8qKgotCSAqIE5vdGlmaWVzIGEgY2hhbmdlIGluIHRoZSBkYXRhIHZhbHVlIHByb3BlcnR5LgotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lUHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogTm90aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIHF1ZXJ5IHR5cGUgcHJvcGVydHkuCi0JICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9UWVBFX1BST1BFUlRZID0gInF1ZXJ5VHlwZVByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OZXdOYW1lU3RhdGVPYmplY3Q8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIG5hbWUgVGhlIGluaXRpYWwgaW5wdXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaW5pdGlhbCB2YWx1ZSBjYW4KLQkgKiBiZSBzcGVjaWZpZWQKLQkgKiBAcGFyYW0gbmFtZXMgVGhlIGNvbGxlY3Rpb24gb2YgbmFtZXMgdGhhdCBjYW4ndCBiZSB1c2VkIG9yIGFuIGVtcHR5Ci0JICogY29sbGVjdGlvbiBpZiBub25lIGFyZSBhdmFpbGFibGUKLQkgKi8KLQlBZGRRdWVyeVN0YXRlT2JqZWN0KCkgewotCQlzdXBlcihudWxsKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGROYW1lUHJvYmxlbXNUbyhMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLm5hbWUpKSB7Ci0JCQljdXJyZW50UHJvYmxlbXMuYWRkKGJ1aWxkUHJvYmxlbShKcHRVaURldGFpbHNNZXNzYWdlcy5RdWVyeVN0YXRlT2JqZWN0X25hbWVNdXN0QmVTcGVjaWZpZWQpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRRdWVyeVR5cGVQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMucXVlcnlUeXBlKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oSnB0VWlEZXRhaWxzTWVzc2FnZXMuUXVlcnlTdGF0ZU9iamVjdF90eXBlTXVzdEJlU3BlY2lmaWVkKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCXN1cGVyLmFkZFByb2JsZW1zVG8oY3VycmVudFByb2JsZW1zKTsKLQkJYWRkTmFtZVByb2JsZW1zVG8oY3VycmVudFByb2JsZW1zKTsKLQkJYWRkUXVlcnlUeXBlUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNoZWNrUGFyZW50KE5vZGUgcGFyZW50Tm9kZSkgewotCQkvL25vIHBhcmVudAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JU3RyaW5nIGdldFF1ZXJ5VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UXVlcnlUeXBlKFN0cmluZyBuZXdRdWVyeVR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucXVlcnlUeXBlOwotCQl0aGlzLnF1ZXJ5VHlwZSA9IG5ld1F1ZXJ5VHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChRVUVSWV9UWVBFX1BST1BFUlRZLCBvbGQsIG5ld1F1ZXJ5VHlwZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnZhbGlkYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fzc29jaWF0aW9uT3ZlcnJpZGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQXNzb2NpYXRpb25PdmVycmlkZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzYzMDI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQXNzb2NpYXRpb25PdmVycmlkZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEpvaW5Db2x1bW5zQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBBc3NvY2lhdGlvbk92ZXJyaWRlCi0gKiBAc2VlIEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlCi0JZXh0ZW5kcyBQYW5lPEFzc29jaWF0aW9uT3ZlcnJpZGU+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+QXNzb2NpYXRpb25PdmVycmlkZTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGU+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGFkZFRpdGxlZEdyb3VwKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX3RpdGxlKTsKLQkJCi0JCWFkZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRTdWJQYW5lKGNvbXBvc2l0ZSwgNSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuCi0JCQlidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lV2l0aG91dEluY2x1ZGVPdmVycmlkZUNoZWNrQm94KAotCQkJCXRoaXMsIAotCQkJCWJ1aWxkUmVsYXRpb25zaGlwUmVmZXJlbmNlSG9sZGVyKCksIAotCQkJCWNvbnRhaW5lcik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8QXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gYnVpbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8QXNzb2NpYXRpb25PdmVycmlkZSwgQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlIHRyYW5zZm9ybV8oQXNzb2NpYXRpb25PdmVycmlkZSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BdHRyaWJ1dGVPdmVycmlkZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BdHRyaWJ1dGVPdmVycmlkZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODEyYmU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQXR0cmlidXRlT3ZlcnJpZGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQXR0cmlidXRlT3ZlcnJpZGUKLSAqIEBzZWUgRW50aXR5T3ZlcnJpZGVzQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgQ29sdW1uQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVPdmVycmlkZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8QXR0cmlidXRlT3ZlcnJpZGU+Ci17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkF0dHJpYnV0ZU92ZXJyaWRlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+QXR0cmlidXRlT3ZlcnJpZGU8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlT3ZlcnJpZGVDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLCAKLQkJCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZT4gc3ViamVjdEhvbGRlciwKLQkJCQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRDb2x1bW5Ib2xkZXIoKSwKLQkJCWNvbnRhaW5lciwKLQkJCWZhbHNlCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENvbHVtbj4gYnVpbGRDb2x1bW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGUsIENvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb2x1bW4gdHJhbnNmb3JtXyhBdHRyaWJ1dGVPdmVycmlkZSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSm9pbkNvbHVtbkRpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSm9pbkNvbHVtbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M0ZTlmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQmFzZUpvaW5Db2x1bW5EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlZhbGlkYXRpbmdEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGRlZmluaXRpb24gdGhlIGRpYWxvZyBzaG93aW5nIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBqb2luIGNvbHVtbgotICogdG8gZWRpdCBvciB0byBjcmVhdGUuCi0gKgotICogQHNlZSBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSm9pbkNvbHVtbkRpYWxvZzxUIGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdD4gZXh0ZW5kcyBWYWxpZGF0aW5nRGlhbG9nPFQ+IHsKLQotCS8qKgotCSAqIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHN0YXRlIG9iamVjdAotCSAqIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZS4KLQkgKi8KLQlwcml2YXRlIEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW47Ci0KLQkvKioKLQkgKiBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdCBpcyBsb2NhdGVkLgotCSAqLwotCXByaXZhdGUgT2JqZWN0IG93bmVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSm9pbkNvbHVtbkRpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gb3duZXIgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMgbG9jYXRlZAotCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBCYXNlSm9pbkNvbHVtbkRpYWxvZyhTaGVsbCBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvd25lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCi0JCXN1cGVyKHBhcmVudCk7Ci0KLQkJdGhpcy5vd25lciAgICAgID0gb3duZXI7Ci0JCXRoaXMuam9pbkNvbHVtbiA9IGpvaW5Db2x1bW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfZGVzY3JpcHRpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvblRpdGxlKCkgewotCi0JCWlmIChqb2luQ29sdW1uID09IG51bGwpIHsKLQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX2FkZEpvaW5Db2x1bW5EZXNjcmlwdGlvblRpdGxlOwotCQl9Ci0KLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfZWRpdEpvaW5Db2x1bW5EZXNjcmlwdGlvblRpdGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGpvaW4gY29sdW1uIHVzZWQgYnkgdGhpcyBzdGF0ZSBvYmplY3QgZm9yIGVkaXRpbmcgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHN0YXRlIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUuCi0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciB0aGUgZWRpdGVkIGpvaW4gY29sdW1uIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIEJhc2VKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG93bmVyIHdoZXJlIHRoZSBqb2luIGNvbHVtbiBpcyBsb2NhdGVkIG9yIHdoZXJlIGEgbmV3IG9uZSBjYW4KLQkgKiBiZSBhZGRlZC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHBhcmVudCBvZiB0aGUgam9pbiBjb2x1bW4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQotCQlpZiAoam9pbkNvbHVtbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uVGl0bGU7Ci0JCX0KLQotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtblRpdGxlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uRGlhbG9nUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhNTAwNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uRGlhbG9nUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5EaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFJlZmVyZW5jZWQgQ29sdW1uIE5hbWU6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFRhYmxlOiAgICAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENvbHVtbiBEZWZpbml0aW9uOiAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0Ci0gKiBAc2VlIEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVEaWFsb2cgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZTxUIGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdD4gZXh0ZW5kcyBEaWFsb2dQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQSBrZXkgdXNlZCB0byByZXByZXNlbnQgdGhlIGRlZmF1bHQgdmFsdWUsIHRoaXMgaXMgcmVxdWlyZWQgdG8gY29udmVydAotCSAqIHRoZSBzZWxlY3RlZCBpdGVtIGZyb20gYSBjb21ibyB0byA8Y29kZT5udWxsPC9jb2RlPi4gVGhpcyBrZXkgaXMgbW9zdAotCSAqIGxpa2VseSBuZXZlciB0eXBlZCB0aGUgdXNlciBhbmQgaXQgd2lsbCBoZWxwIHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvCi0JICogPGNvZGU+bnVsbDwvY29kZT4gd2hlbiBpdCdzIHRpbWUgdG8gc2V0IHRoZSBuZXcgc2VsZWN0ZWQgdmFsdWUgaW50byB0aGUKLQkgKiBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBERUZBVUxUX0tFWSA9ICI/ISMhPyM/Iz9kZWZhdWx0PyM/ISM/ISM/IjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbHVtbkRlZmluaXRpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LkNPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0Q29sdW1uRGVmaW5pdGlvbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gYWRkU3ViUGFuZShwYXJlbnQsIDAsIDcsIDAsIDUpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybV8oQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCB2YWx1ZSkgewotCQkJCVN0cmluZyBuYW1lID0gdmFsdWUuZ2V0RGVmYXVsdE5hbWUoKTsKLQotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IERFRkFVTFRfS0VZOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmFtZSA9IERFRkFVTFRfS0VZICsgbmFtZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCWJ1aWxkRGVmYXVsdE5hbWVIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm1fKEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QgdmFsdWUpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHZhbHVlLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCi0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gREVGQVVMVF9LRVk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQluYW1lID0gREVGQVVMVF9LRVkgKyBuYW1lOwotCQkJCX0KLQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCWJ1aWxkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtXyhCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0IHZhbHVlKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSB2YWx1ZS5nZXREZWZhdWx0VGFibGUoKTsKLQotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IERFRkFVTFRfS0VZOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmFtZSA9IERFRkFVTFRfS0VZICsgbmFtZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0VGFibGVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZERlZmF1bHRUYWJsZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZERpc3BsYXlhYmxlU3RyaW5nQ29udmVydGVyKGZpbmFsIERlZmF1bHRWYWx1ZUhhbmRsZXIgaGFuZGxlcikgewotCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlpZiAoZ2V0U3ViamVjdCgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSBoYW5kbGVyLmdldERlZmF1bHRWYWx1ZSgpOwotCi0JCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQl2YWx1ZSA9IERFRkFVTFRfS0VZICsgdmFsdWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2YWx1ZSA9IERFRkFVTFRfS0VZOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0TmFtZSA9IHZhbHVlLnN1YnN0cmluZyhERUZBVUxUX0tFWS5sZW5ndGgoKSk7Ci0KLQkJCQkJaWYgKGRlZmF1bHROYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQkJdmFsdWUgPSBOTFMuYmluZCgKLQkJCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCQkJCWRlZmF1bHROYW1lCi0JCQkJCQkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdmFsdWUgPSBKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RW1wdHk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkvLyBDb252ZXJ0IHRoZSBkZWZhdWx0IHZhbHVlIG9yIGFuIGVtcHR5IHN0cmluZyB0byBudWxsCi0JCQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJgotCQkJCSAgICgodmFsdWUubGVuZ3RoKCkgPT0gMCkgfHwgdmFsdWUuc3RhcnRzV2l0aChERUZBVUxUX0tFWSkpKSB7Ci0KLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQotCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuTkFNRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5uYW1lcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmNvbHVtbnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZXNMaXN0SG9sZGVyKCkgewotCQlBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oMik7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkRGVmYXVsdE5hbWVMaXN0SG9sZGVyKCkpOwotCQlob2xkZXJzLmFkZChidWlsZE5hbWVMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZE5hbWVTdHJpbmdDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBidWlsZERpc3BsYXlhYmxlU3RyaW5nQ29udmVydGVyKG5ldyBEZWZhdWx0VmFsdWVIYW5kbGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0TmFtZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJLy8gQ29udmVydCB0aGUgZGVmYXVsdCB2YWx1ZSBvciBhbiBlbXB0eSBzdHJpbmcgdG8gbnVsbAotCQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYKLQkJCQkgICAoKHZhbHVlLmxlbmd0aCgpID09IDApIHx8IHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSkgewotCi0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQlzdWJqZWN0LnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuUkVGRVJFTkNFX0NPTFVNTl9OQU1FU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnJlZmVyZW5jZUNvbHVtbk5hbWVzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QucmVmZXJlbmNlQ29sdW1uc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZXNMaXN0SG9sZGVyKCkgewotCQlBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oMik7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lTGlzdEhvbGRlcigpKTsKLQkJaG9sZGVycy5hZGQoYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZUxpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPihob2xkZXJzKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVTdHJpbmdDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBidWlsZERpc3BsYXlhYmxlU3RyaW5nQ29udmVydGVyKG5ldyBEZWZhdWx0VmFsdWVIYW5kbGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LlRBQkxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkvLyBDb252ZXJ0IHRoZSBkZWZhdWx0IHZhbHVlIG9yIGFuIGVtcHR5IHN0cmluZyB0byBudWxsCi0JCQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJgotCQkJCSAgICgodmFsdWUubGVuZ3RoKCkgPT0gMCkgfHwgdmFsdWUuc3RhcnRzV2l0aChERUZBVUxUX0tFWSkpKSB7Ci0KLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQotCQkJCXN1YmplY3Quc2V0VGFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhYmxlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgIiIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudGFibGVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFibGVzTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRUYWJsZUxpc3RIb2xkZXIoKSk7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkVGFibGVMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFRhYmxlU3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gYnVpbGREaXNwbGF5YWJsZVN0cmluZ0NvbnZlcnRlcihuZXcgRGVmYXVsdFZhbHVlSGFuZGxlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFRhYmxlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQlDb21ibyBuYW1lQ29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfbmFtZSwKLQkJCWJ1aWxkTmFtZXNMaXN0SG9sZGVyKCksCi0JCQlidWlsZE5hbWVIb2xkZXIoKSwKLQkJCWJ1aWxkTmFtZVN0cmluZ0NvbnZlcnRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX0NPTFVNTl9OQU1FCi0JCSk7Ci0KLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKG5hbWVDb21ibyk7Ci0KLQkJLy8gUmVmZXJlbmNlZCBDb2x1bW4gTmFtZSB3aWRnZXRzCi0JCUNvbWJvIHJlZmVyZW5jZWRDb2x1bW5OYW1lQ29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfcmVmZXJlbmNlZENvbHVtbk5hbWUsCi0JCQlidWlsZFJlZmVyZW5jZWRDb2x1bW5OYW1lc0xpc3RIb2xkZXIoKSwKLQkJCWJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVIb2xkZXIoKSwKLQkJCWJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVTdHJpbmdDb252ZXJ0ZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9SRUZFUkVOQ0VEX0NPTFVNTgotCQkpOwotCi0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihyZWZlcmVuY2VkQ29sdW1uTmFtZUNvbWJvKTsKLQotCQkvLyBUYWJsZSB3aWRnZXRzCi0JCWlmIChpc1RhYmxlRWRpdGFibGUoKSkgewotCi0JCQlDb21ibyB0YWJsZUNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX3RhYmxlLAotCQkJCWJ1aWxkVGFibGVzTGlzdEhvbGRlcigpLAotCQkJCWJ1aWxkVGFibGVIb2xkZXIoKSwKLQkJCQlidWlsZFRhYmxlU3RyaW5nQ29udmVydGVyKCksCi0JCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1JFRkVSRU5DRURfQ09MVU1OCi0JCQkpOwotCi0JCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIodGFibGVDb21ibyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDb21ibyB0YWJsZUNvbWJvID0gYWRkTGFiZWxlZENvbWJvKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV90YWJsZSwKLQkJCQlidWlsZFRhYmxlc0xpc3RIb2xkZXIoKSwKLQkJCQlidWlsZFRhYmxlSG9sZGVyKCksCi0JCQkJYnVpbGRUYWJsZVN0cmluZ0NvbnZlcnRlcigpLAotCQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9SRUZFUkVOQ0VEX0NPTFVNTgotCQkJKTsKLQotCQkJdGFibGVDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCS8vIENvbHVtbiBEZWZpbml0aW9uIHdpZGdldHMKLQkJYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV9jb2x1bW5EZWZpbml0aW9uLAotCQkJYnVpbGRDb2x1bW5EZWZpbml0aW9uSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRhYmxlIGNvbWJvIHNob3VsZCBiZSBlZGl0YWJsZSBvciBub3QuIFRoZSBkZWZhdWx0Ci0JICogaXMgdG8ga2VlcCB0aGUgY29tYm8gcmVhZC1vbmx5LgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0byBzdXBwb3J0IHRoZSBlZGl0aW5nIG9mIHRoZSBzZWxlY3RlZCB0YWJsZTsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWJsZUVkaXRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnRlcmZhY2UgRGVmYXVsdFZhbHVlSGFuZGxlciB7Ci0JCVN0cmluZyBnZXREZWZhdWx0VmFsdWUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjY2Y4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuQWJzdHJhY3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiBhIHN0YXRlIG9iamVjdCB1c2VkIHRvIGVkaXQgb3IgY3JlYXRlIGEgbmV3Ci0gKiBqb2luIGNvbHVtbi4KLSAqCi0gKiBAc2VlIEFic3RyYWN0Sm9pbkNvbHVtbgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0IGV4dGVuZHMgQWJzdHJhY3ROb2RlCi17Ci0JLyoqCi0JICogVGhlIFNRTCBmcmFnbWVudCB0aGF0IGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBEREwgZm9yIHRoZSBjb2x1bW4uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbjsKLQotCS8qKgotCSAqIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gaXMgYmVpbmcgZWRpdGVkIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBzdGF0ZQotCSAqIG9iamVjdCBpcyBiZWluZyBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbjsKLQotCS8qKgotCSAqIFRoZSBqb2luIGNvbHVtbidzIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGRlZmluZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzIGxvY2F0ZWQuCi0JICovCi0JcHJpdmF0ZSBPYmplY3Qgb3duZXI7Ci0KLQkvKioKLQkgKiBUaGUgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZGVmaW5lZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQotCS8qKgotCSAqIFRoZSB0YWJsZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIHRhYmxlOwotCi0JLyoqCi0JICogS2VlcHMgdHJhY2sgb2YgdGhlIDxjb2RlPlZhbGlkYXRvcjwvY29kZT4gc2luY2UgdGhpcyBpcyB0aGUgcm9vdCBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JLyoqCi0JICogSWRlbnRpZmllcyBhIGNoYW5nZSBpbiB0aGUgY29sdW1uIGRlZmluaXRpb24gcHJvcGVydHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFkgPSAiY29sdW1uRGVmaW5pdGlvbiI7Ci0KLQkvKioKLQkgKiBJZGVudGlmaWVzIGEgY2hhbmdlIGluIHRoZSBuYW1lIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkvKioKLQkgKiBJZGVudGlmaWVzIGEgY2hhbmdlIGluIHRoZSBsaXN0IG9mIG5hbWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTX0xJU1QgPSAibmFtZXMiOwotCi0JLyoqCi0JICogSWRlbnRpZmllcyBhIGNoYW5nZSBpbiB0aGUgbGlzdCBvZiByZWZlcmVuY2UgY29sdW1uIG5hbWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRV9DT0xVTU5fTkFNRVNfTElTVCA9ICJyZWZlcmVuY2VDb2x1bW5OYW1lcyI7Ci0KLQkvKioKLQkgKiBJZGVudGlmaWVzIGEgY2hhbmdlIGluIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAicmVmZXJlbmNlZENvbHVtbk5hbWUiOwotCi0JLyoqCi0JICogSWRlbnRpZmllcyBhIGNoYW5nZSBpbiB0aGUgdGFibGUgcHJvcGVydHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfUFJPUEVSVFkgPSAidGFibGUiOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEpvaW5Db2x1bW5TdGF0ZU9iamVjdDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gb3duZXIgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMgbG9jYXRlZAotCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0KE9iamVjdCBvd25lciwgQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlzdXBlcihudWxsKTsKLQkJaW5pdGlhbGl6ZShvd25lciwgam9pbkNvbHVtbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2hlY2tQYXJlbnQoTm9kZSBwYXJlbnROb2RlKSB7Ci0JCS8vIFRoaXMgaXMgdGhlIHJvb3Qgb2YgdGhlIEpvaW4gQ29sdW1uIHN0YXRlIG9iamVjdAotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IGNvbHVtbk5hbWVzKFRhYmxlIHRhYmxlKSB7Ci0JCWlmICh0YWJsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3QodGFibGUuZ2V0U29ydGVkQ29sdW1uSWRlbnRpZmllcnMoKSkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGludCBjb2x1bW5zU2l6ZShUYWJsZSB0YWJsZSkgewotCQlpZiAodGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIHRhYmxlLmdldENvbHVtbnNTaXplKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFNRTCBmcmFnbWVudCB0aGF0IGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBEREwgZm9yIHRoZQotCSAqIGNvbHVtbi4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGVkaXRlZCBjb2x1bW4gbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgdXNlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGNvbHVtbkRlZmluaXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBuYW1lIGlmIHRoZSBqb2luIGNvbHVtbiBpcyBiZWluZyBlZGl0ZWQgb3RoZXJ3aXNlCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciB0aGUgZGVmYXVsdCBuYW1lIGRlZmluZWQgYnkgdGhlIGpvaW4gY29sdW1uIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJaWYgKHRoaXMuam9pbkNvbHVtbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgaWYgdGhlIGpvaW4gY29sdW1uIGlzIGJlaW5nCi0JICogZWRpdGVkIG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBkZWZhdWx0IHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgZGVmaW5lZCBieSB0aGUgam9pbgotCSAqIGNvbHVtbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlpZiAodGhpcy5qb2luQ29sdW1uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zCi0JICoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0VGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXRlZCBqb2luIGNvbHVtbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHN0YXRlIG9iamVjdAotCSAqIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGVkaXRlZCBqb2luIGNvbHVtbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBCYXNlSm9pbkNvbHVtbiBnZXRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGpvaW4gY29sdW1uLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgam9pbiBjb2x1bW4ncyBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgZGVmYXVsdAotCSAqIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGF0YWJhc2UgdGFibGUgaWYgb25lIGNhbiBiZSBmb3VuZC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGRhdGFiYXNlIHRhYmxlCi0JICovCi0JcHVibGljIGFic3RyYWN0IFRhYmxlIGdldE5hbWVUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3duZXIgd2hlcmUgdGhlIGpvaW4gY29sdW1uIGlzIGxvY2F0ZWQgb3Igd2hlcmUgYSBuZXcgb25lIGNhbgotCSAqIGJlIGFkZGVkLgotCSAqCi0JICogQHJldHVybiBUaGUgcGFyZW50IG9mIHRoZSBqb2luIGNvbHVtbgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG9mIHRoZSBqb2luIGNvbHVtbi4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIGpvaW4gY29sdW1uJ3MgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIHRvIHVzZSB0aGUgZGVmYXVsdCBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucwotCSAqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zCi0JICoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdGhpcy52YWxpZGF0b3I7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl2YWxpZGF0b3IgPSBOVUxMX1ZBTElEQVRPUjsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHN0YXRlIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBvd25lciBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdCBpcyBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gRWl0aGVyIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhpcyBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgbywgQmFzZUpvaW5Db2x1bW4gamMpIHsKLQotCQl0aGlzLm93bmVyICAgICAgPSBvOwotCQl0aGlzLmpvaW5Db2x1bW4gPSBqYzsKLQkJdGhpcy50YWJsZSAgICAgID0gdGhpcy5nZXRJbml0aWFsVGFibGUoKTsKLQotCQlpZiAoamMgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lICAgICAgICAgICAgICAgICA9IGpjLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJCXRoaXMuY29sdW1uRGVmaW5pdGlvbiAgICAgPSBqYy5nZXRDb2x1bW5EZWZpbml0aW9uKCk7Ci0JCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lID0gamMuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEluaXRpYWxUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sdW1uIG5hbWVzIGlmIHRoZSBkYXRhYmFzZSB0YWJsZSBjYW4gYmUgcmVzb2x2ZWQuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBuYW1lcyBvZiB0aGUgdGFibGUncyBjb2x1bW5zIG9yIGFuIGVtcHR5IGl0ZXJhdG9yIGlmIHRoZSB0YWJsZQotCSAqIGNhbid0IGJlIHJlc29sdmVkCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IG5hbWVzKCkgewotCQlyZXR1cm4gY29sdW1uTmFtZXMoZ2V0TmFtZVRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgY29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiBjb2x1bW5zU2l6ZShnZXROYW1lVGFibGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZmVyZW5jZSBjb2x1bW4gbmFtZXMgaWYgdGhlIGRhdGFiYXNlIHRhYmxlIGNhbiBiZSByZXNvbHZlZC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIG5hbWVzIG9mIHRoZSB0YWJsZSdzIGNvbHVtbnMgb3IgYW4gZW1wdHkgaXRlcmF0b3IgaWYgdGhlIHRhYmxlCi0JICogY2FuJ3QgYmUgcmVzb2x2ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gcmVmZXJlbmNlQ29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiBjb2x1bW5OYW1lcyhnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgaW50IHJlZmVyZW5jZUNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gY29sdW1uc1NpemUoZ2V0UmVmZXJlbmNlZE5hbWVUYWJsZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBTUUwgZnJhZ21lbnQgdGhhdCBpcyB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgRERMIGZvciB0aGUgY29sdW1uLgotCSAqCi0JICogQHBhcmFtIGNvbHVtbkRlZmluaXRpb24gVGhlIG5ldyBqb2luIGNvbHVtbidzIGNvbHVtbiBkZWZpbml0aW9uIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gdG8gY2xlYXIgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uRGVmaW5pdGlvbihTdHJpbmcgY29sdW1uRGVmaW5pdGlvbikgewotCQlTdHJpbmcgb2xkQ29sdW1uRGVmaW5pdGlvbiA9IHRoaXMuY29sdW1uRGVmaW5pdGlvbjsKLQkJdGhpcy5jb2x1bW5EZWZpbml0aW9uID0gY29sdW1uRGVmaW5pdGlvbjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xVTU5fREVGSU5JVElPTl9QUk9QRVJUWSwgb2xkQ29sdW1uRGVmaW5pdGlvbiwgY29sdW1uRGVmaW5pdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgam9pbiBjb2x1bW4uCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IGpvaW4gY29sdW1uJ3MgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgdGhlCi0JICogZGVmYXVsdCBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG9mIHRoZSBqb2luIGNvbHVtbi4KLQkgKgotCSAqIEBwYXJhbSByZWZlcmVuY2VkQ29sdW1uTmFtZSBUaGUgbmV3IGpvaW4gY29sdW1uJ3MgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZQotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgZGVmYXVsdCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7Ci0JCVN0cmluZyBvbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUgPSByZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyB0YWJsZSkgewotCQlTdHJpbmcgb2xkVGFibGUgPSB0aGlzLnRhYmxlOwotCQl0aGlzLnRhYmxlID0gdGFibGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfUFJPUEVSVFksIG9sZFRhYmxlLCB0YWJsZSk7Ci0JCXRhYmxlQ2hhbmdlZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIFRoZSB0YWJsZSBmcm9tIHdoaWNoIHRoZSBjb2x1bW4gbmFtZXMgYXJlIHVzZWQgaGFzIGNoYW5nZWQsIG5vdGlmaWVzIHRoZQotCSAqIGxpc3RlbmVycyB0aGUgbGlzdCBvZiBuYW1lcyBhbmQgcmVmZXJlbmNlIGNvbHVtbiBuYW1lcyBzaG91bGQgYmUgdXBkYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZUNoYW5nZWQoKSB7Ci0JCWZpcmVMaXN0Q2hhbmdlZChOQU1FU19MSVNULCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLm5hbWVzKCkpKTsKLQkJZmlyZUxpc3RDaGFuZ2VkKFJFRkVSRU5DRV9DT0xVTU5fTkFNRVNfTElTVCwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5yZWZlcmVuY2VDb2x1bW5OYW1lcygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIGFsbCB0aGUgdGFibGUgbmFtZXMgY29udGFpbnMgaW4gdGhlIGFzc29jaWF0ZWQKLQkgKiBzY2hlbWEuIFRoZSBkZWZhdWx0IHJldHVybnMgYW4gZW1wdHkgaXRlcmF0b3IuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBuYW1lcyBvZiB0aGUgdGFibGVzCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhYmxlcygpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZ2l2ZW4gam9pbiBjb2x1bW4gd2l0aCB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIHN0YXRlCi0JICogb2JqZWN0LgotCSAqCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIHVwZGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUpvaW5Db2x1bW4oQmFzZUpvaW5Db2x1bW4gamMpIHsKLQotCQkvLyBOYW1lCi0JCWlmICh2YWx1ZXNBcmVEaWZmZXJlbnQobmFtZSwgamMuZ2V0U3BlY2lmaWVkTmFtZSgpKSkgewotCQkJamMuc2V0U3BlY2lmaWVkTmFtZShuYW1lKTsKLQkJfQotCi0JCS8vIFJlZmVyZW5jZWQgQ29sdW1uIE5hbWUKLQkJaWYgKHZhbHVlc0FyZURpZmZlcmVudChyZWZlcmVuY2VkQ29sdW1uTmFtZSwgamMuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSkpIHsKLQkJCWpjLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJfQotCi0JCS8vIENvbHVtbiBEZWZpbml0aW9uCi0JCWlmICh2YWx1ZXNBcmVEaWZmZXJlbnQoY29sdW1uRGVmaW5pdGlvbiwgamMuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKSkgewotCQkJamMuc2V0Q29sdW1uRGVmaW5pdGlvbihjb2x1bW5EZWZpbml0aW9uKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhOTc3Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBFbnVtVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgTG9iQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQmFzaWNNYXBwaW5nCi0gKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQotICogQHNlZSBFbnVtVHlwZUNvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgTG9iQ29tcG9zaXRlCi0gKiBAc2VlIE9wdGlvbmFsQ29tcG9zaXRlCi0gKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RCYXNpY01hcHBpbmdDb21wb3NpdGU8QmFzaWNNYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzaWNNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBCYXNpY01hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBCYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Nhc2NhZGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQ2FzY2FkZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzM2ZmVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQ2FzY2FkZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtIENhc2NhZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgeCBBbGwgICAgICAgeCBQZXJzaXN0ICAgeCBNZXJnZSAgICAgeCBSZW1vdmUgICAgeCBSZWZyZXNoICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQ2FzY2FkZQotICogQHNlZSBSZWxhdGlvbnNoaXBNYXBwaW5nCi0gKiBAc2VlIE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENhc2NhZGVDb21wb3NpdGU8VCBleHRlbmRzIENhc2NhZGU+IGV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2FzY2FkZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUNhc2NhZGU8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDYXNjYWRlQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgUmVsYXRpb25zaGlwTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29sdW1uQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUNhc2NhZGU8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgQ2FzY2FkZUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIENhc2NhZGUgZ3JvdXAKLQkJR3JvdXAgY2FzY2FkZUdyb3VwID0gYWRkQ2FzY2FkZUdyb3VwKGNvbnRhaW5lcik7Ci0JCQotCQkvLyBDb250YWluZXIgb2YgdGhlIGNoZWNrIGJveGVzCi0JCWNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY2FzY2FkZUdyb3VwLCA1LCA4LCAwLCAwLCAwKTsKLQkJCi0JCWFkZEFsbENoZWNrQm94KGNvbnRhaW5lcik7Ci0JCWFkZFBlcnNpc3RDaGVja0JveChjb250YWluZXIpOwotCQlhZGRNZXJnZUNoZWNrQm94KGNvbnRhaW5lcik7Ci0JCWFkZFJlbW92ZUNoZWNrQm94KGNvbnRhaW5lcik7Ci0JCWFkZFJlZnJlc2hDaGVja0JveChjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbGxDaGVja0JveChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIEFsbCBjaGVjayBib3gKLQkJYWRkQ2hlY2tCb3goCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNhc2NhZGVDb21wb3NpdGVfYWxsLAotCQkJCWJ1aWxkQ2FzY2FkZVR5cGVBbGxIb2xkZXIoKSwKLQkJCQludWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGVyc2lzdENoZWNrQm94KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gUGVyc2lzdCBjaGVjayBib3gKLQkJYWRkQ2hlY2tCb3goCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNhc2NhZGVDb21wb3NpdGVfcGVyc2lzdCwKLQkJCQlidWlsZENhc2NhZGVUeXBlUGVyc2lzdEhvbGRlcigpLAotCQkJCW51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXJnZUNoZWNrQm94KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gTWVyZ2UgY2hlY2sgYm94Ci0JCWFkZENoZWNrQm94KAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5DYXNjYWRlQ29tcG9zaXRlX21lcmdlLAotCQkJCWJ1aWxkQ2FzY2FkZVR5cGVNZXJnZUhvbGRlcigpLAotCQkJCW51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZW1vdmVDaGVja0JveChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIFJlbW92ZSBjaGVjayBib3gKLQkJYWRkQ2hlY2tCb3goCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNhc2NhZGVDb21wb3NpdGVfcmVtb3ZlLAotCQkJCWJ1aWxkQ2FzY2FkZVR5cGVSZW1vdmVIb2xkZXIoKSwKLQkJCQludWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVmcmVzaENoZWNrQm94KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gUmVmcmVzaCBjaGVjayBib3gKLQkJYWRkQ2hlY2tCb3goCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNhc2NhZGVDb21wb3NpdGVfcmVmcmVzaCwKLQkJCQlidWlsZENhc2NhZGVUeXBlUmVmcmVzaEhvbGRlcigpLAotCQkJCW51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgR3JvdXAgYWRkQ2FzY2FkZUdyb3VwKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIGFkZFRpdGxlZEdyb3VwKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5DYXNjYWRlQ29tcG9zaXRlX2Nhc2NhZGVUaXRsZSk7Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhc2NhZGVUeXBlQWxsSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYXNjYWRlLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENhc2NhZGUuQUxMX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmlzQWxsKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldEFsbCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhc2NhZGVUeXBlTWVyZ2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhc2NhZGUsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ2FzY2FkZS5NRVJHRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pc01lcmdlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldE1lcmdlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ2FzY2FkZVR5cGVQZXJzaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYXNjYWRlLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENhc2NhZGUuUEVSU0lTVF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pc1BlcnNpc3QoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0UGVyc2lzdCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhc2NhZGVUeXBlUmVmcmVzaEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FzY2FkZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYXNjYWRlLlJFRlJFU0hfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuaXNSZWZyZXNoKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFJlZnJlc2godmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDYXNjYWRlVHlwZVJlbW92ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FzY2FkZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYXNjYWRlLlJFTU9WRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pc1JlbW92ZSgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRSZW1vdmUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0NvbHVtbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Db2x1bW5Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1MDVhYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0NvbHVtbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNvbHVtbkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkRhdGFiYXNlT2JqZWN0Q29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgQ29sdW1uQ29tcG9zaXRlCi0JZXh0ZW5kcyBQYW5lPENvbHVtbj4KLXsKLQlwdWJsaWMgQ29sdW1uQ29tcG9zaXRlKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb2x1bW4+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIENvbHVtbkNvbXBvc2l0ZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29sdW1uPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCWJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cykgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKLQl9Ci0JCi0JcHVibGljIENvbHVtbkNvbXBvc2l0ZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29sdW1uPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCWJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywKLQkJCWJvb2xlYW4gcGFyZW50TWFuYWdlUGFuZSkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzLCBwYXJlbnRNYW5hZ2VQYW5lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBDb2x1bW5Db21ibzxDb2x1bW4+IGFkZENvbHVtbkNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCXJldHVybiBuZXcgQ29sdW1uQ29tYm88Q29sdW1uPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoTmFtZWRDb2x1bW4uREVGQVVMVF9OQU1FX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChOYW1lZENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoQmFzZUNvbHVtbi5ERUZBVUxUX1RBQkxFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChCYXNlQ29sdW1uLlNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlpZiAocHJvcGVydHlOYW1lID09IEJhc2VDb2x1bW4uREVGQVVMVF9UQUJMRV9QUk9QRVJUWSB8fAotCQkJCSAgICBwcm9wZXJ0eU5hbWUgPT0gQmFzZUNvbHVtbi5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkpIHsKLQkJCQkJdGhpcy5kb1BvcHVsYXRlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhYmxlIGdldERiVGFibGVfKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGJUYWJsZSgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZE51bGxEZWZhdWx0VmFsdWVFbnRyeSgpIHsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuTm9uZVNlbGVjdGVkKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiQ29sdW1uQ29tcG9zaXRlLmNvbHVtbkNvbWJvIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb2x1bW5EZWZpbml0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBOYW1lZENvbHVtbi5DT0xVTU5fREVGSU5JVElPTl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXRDb2x1bW5EZWZpbml0aW9uKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEluc2VydGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbHVtbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBCYXNlQ29sdW1uLlNQRUNJRklFRF9JTlNFUlRBQkxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZEluc2VydGFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkSW5zZXJ0YWJsZVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEluc2VydGFibGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9pbnNlcnRhYmxlV2l0aERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfaW5zZXJ0YWJsZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0SW5zZXJ0YWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29sdW1uLCBCb29sZWFuPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQkJQmFzZUNvbHVtbi5TUEVDSUZJRURfSU5TRVJUQUJMRV9QUk9QRVJUWSwKLQkJCQlCYXNlQ29sdW1uLkRFRkFVTFRfSU5TRVJUQUJMRV9QUk9QRVJUWSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROdWxsYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29sdW1uLCBCb29sZWFuPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQkJQmFzZUNvbHVtbi5TUEVDSUZJRURfTlVMTEFCTEVfUFJPUEVSVFkpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE51bGxhYmxlKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkTnVsbGFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTnVsbGFibGVTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHROdWxsYWJsZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX251bGxhYmxlV2l0aERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfbnVsbGFibGU7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdE51bGxhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEJvb2xlYW4+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCQlCYXNlQ29sdW1uLlNQRUNJRklFRF9OVUxMQUJMRV9QUk9QRVJUWSwKLQkJCQlCYXNlQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEVfUFJPUEVSVFkpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE51bGxhYmxlKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUGFuZTxDb2x1bW4+IGFkZFRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJcmV0dXJuIG5ldyBEYXRhYmFzZU9iamVjdENvbWJvPENvbHVtbj4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoQmFzZUNvbHVtbi5ERUZBVUxUX1RBQkxFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChCYXNlQ29sdW1uLlNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRUYWJsZSgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFRhYmxlKHZhbHVlKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRUYWJsZSgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFZhbHVlc18oKSB7Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLnZhbHVlcygpKTsKLQkJCX0KLQkJCQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdmFsdWVzKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5jYW5kaWRhdGVUYWJsZU5hbWVzKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZE51bGxEZWZhdWx0VmFsdWVFbnRyeSgpIHsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuTm9uZVNlbGVjdGVkKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiQ29sdW1uQ29tcG9zaXRlLnRhYmxlQ29tYm8iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVbmlxdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbHVtbiwgQm9vbGVhbj4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJCUJhc2VDb2x1bW4uU1BFQ0lGSUVEX1VOSVFVRV9QUk9QRVJUWSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkVW5pcXVlKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkVW5pcXVlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFVuaXF1ZVN0cmluZ0hvbGRlcigpIHsKLQkJCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRVbmlxdWVIb2xkZXIoKSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0VW5pcXVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEJvb2xlYW4+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCQlCYXNlQ29sdW1uLlNQRUNJRklFRF9VTklRVUVfUFJPUEVSVFksCi0JCQkJQmFzZUNvbHVtbi5ERUZBVUxUX1VOSVFVRV9QUk9QRVJUWSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkVW5pcXVlKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0VW5pcXVlKCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXBkYXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEJvb2xlYW4+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCQlCYXNlQ29sdW1uLkRFRkFVTFRfVVBEQVRBQkxFX1BST1BFUlRZLAotCQkJCUJhc2VDb2x1bW4uU1BFQ0lGSUVEX1VQREFUQUJMRV9QUk9QRVJUWSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkVXBkYXRhYmxlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFVwZGF0YWJsZVN0cmluZ0hvbGRlcigpIHsKLQkJCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRVcGRhdGFibGVIb2xkZXIoKSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0VXBkYXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEJvb2xlYW4+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCQlCYXNlQ29sdW1uLlNQRUNJRklFRF9VUERBVEFCTEVfUFJPUEVSVFksCi0JCQkJQmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRV9QUk9QRVJUWSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gQ29sdW1uIGdyb3VwIHBhbmUKLQkJY29udGFpbmVyID0gYWRkVGl0bGVkR3JvdXAoCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9jb2x1bW5TZWN0aW9uKTsKLQkJCi0JCS8vIENvbHVtbiB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9uYW1lLAotCQkJCWFkZENvbHVtbkNvbWJvKGNvbnRhaW5lciksCi0JCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU4pOwotCQkKLQkJLy8gVGFibGUgd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfdGFibGUsCi0JCQkJYWRkVGFibGVDb21ibyhjb250YWluZXIpLAotCQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX1RBQkxFKTsKLQkJCi0JCS8vIERldGFpbHMgc3ViLXBhbmUKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTdWJTZWN0aW9uKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfZGV0YWlscywKLQkJCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpKTsKLQkJCi0JCW5ldyBEZXRhaWxzQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDAsIDE2KSk7Ci0JfQotCQotCXByb3RlY3RlZCBjbGFzcyBEZXRhaWxzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDb2x1bW4+IHsKLQkJCQkKLQkJcHVibGljIERldGFpbHNDb21wb3NpdGUoCi0JCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29sdW1uPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQotCQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCS8vIEluc2VydGFibGUgdHJpLXN0YXRlIGNoZWNrIGJveAotCQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgNCksCi0JCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9pbnNlcnRhYmxlLAotCQkJCQlidWlsZEluc2VydGFibGVIb2xkZXIoKSwKLQkJCQkJYnVpbGRJbnNlcnRhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX0lOU0VSVEFCTEUpOwotCQkJCi0JCQkvLyBVcGRhdGFibGUgdHJpLXN0YXRlIGNoZWNrIGJveAotCQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJCQljb250YWluZXIsCi0JCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV91cGRhdGFibGUsCi0JCQkJCWJ1aWxkVXBkYXRhYmxlSG9sZGVyKCksCi0JCQkJCWJ1aWxkVXBkYXRhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX1VQREFUQUJMRSk7Ci0JCQkKLQkJCS8vIFVuaXF1ZSB0cmktc3RhdGUgY2hlY2sgYm94Ci0JCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQkJCWNvbnRhaW5lciwKLQkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZSwKLQkJCQkJYnVpbGRVbmlxdWVIb2xkZXIoKSwKLQkJCQkJYnVpbGRVbmlxdWVTdHJpbmdIb2xkZXIoKSwKLQkJCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVU5JUVVFKTsKLQkJCQotCQkJLy8gTnVsbGFibGUgdHJpLXN0YXRlIGNoZWNrIGJveAotCQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJCQljb250YWluZXIsCi0JCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9udWxsYWJsZSwKLQkJCQkJYnVpbGROdWxsYWJsZUhvbGRlcigpLAotCQkJCQlidWlsZE51bGxhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX05VTExBQkxFKTsKLQkJCQotCQkJYWRkTGVuZ3RoQ29tYm8oY29udGFpbmVyKTsKLQkJCWFkZFByZWNpc2lvbkNvbWJvKGNvbnRhaW5lcik7Ci0JCQlhZGRTY2FsZUNvbWJvKGNvbnRhaW5lcik7Ci0JCQkKLQkJCS8vIENvbHVtbiBEZWZpbml0aW9uIHdpZGdldHMKLQkJCWFkZExhYmVsZWRUZXh0KAotCQkJCQljb250YWluZXIsCi0JCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9jb2x1bW5EZWZpbml0aW9uLAotCQkJCQlidWlsZENvbHVtbkRlZmluaXRpb25Ib2xkZXIoKSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBhZGRMZW5ndGhDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQluZXcgSW50ZWdlckNvbWJvPENvbHVtbj4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfbGVuZ3RoOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJCQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX0xFTkdUSDsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbHVtbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb2x1bW4uREVGQVVMVF9MRU5HVEhfUFJPUEVSVFkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29sdW1uLlNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRMZW5ndGgoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRMZW5ndGgodmFsdWUpOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBhZGRQcmVjaXNpb25Db21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQluZXcgSW50ZWdlckNvbWJvPENvbHVtbj4odGhpcywgY29udGFpbmVyKSB7CQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3ByZWNpc2lvbjsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9QUkVDSVNJT047Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgewotCQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OX1BST1BFUlRZKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29sdW1uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbHVtbi5TUEVDSUZJRURfUFJFQ0lTSU9OX1BST1BFUlRZKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkUHJlY2lzaW9uKHZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgYWRkU2NhbGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQluZXcgSW50ZWdlckNvbWJvPENvbHVtbj4odGhpcywgY29udGFpbmVyKSB7CQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3NjYWxlOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJCQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX1NDQUxFOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29sdW1uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbHVtbi5ERUZBVUxUX1NDQUxFX1BST1BFUlRZKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldERlZmF1bHRTY2FsZSgpKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29sdW1uLlNQRUNJRklFRF9TQ0FMRV9QUk9QRVJUWSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFNjYWxlKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkU2NhbGUodmFsdWUpOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQkJCX07Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Rpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjUxZDc3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNvbHVtbkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ID4gRGlzY3JpbWluYXRvciBDb2x1bW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgICAgICAgICAgIHwgQ29sdW1uQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFR5cGU6ICAgICAgICAgICAgICAgIHwgRW51bUNvbWJvVmlld2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgPiBEZXRhaWxzCQkJCQkJCQkJCQkJCQkJCSAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBDb2x1bW4gRGVmaW5pdGlvbjogICB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBMZW5ndGg6ICAgICAgICAgICAgICB8IEkgICAgICAgfEl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIEFic3RyYWN0RW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgQ29sdW1uQ29tYm8KLSAqIEBzZWUgRW51bUNvbWJvVmlld2VyCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZTxUIGV4dGVuZHMgRW50aXR5PiBleHRlbmRzIFBhbmU8VD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Jbmhlcml0YW5jZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIERpc2NyaW1pbmF0b3IgQ29sdW1uIHN1Yi1wYW5lCi0JCUNvbXBvc2l0ZSBkaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyID0gYWRkVGl0bGVkR3JvdXAoCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMTApLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvckNvbHVtbkdyb3VwQm94Ci0JCSk7Ci0KLQkJUHJvcGVydHlWYWx1ZU1vZGVsPERpc2NyaW1pbmF0b3JDb2x1bW4+IGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIgPQotCQkJYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyKCk7Ci0KLQkJLy8gTmFtZSB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQlkaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9uYW1lLAotCQkJYWRkRGlzY3JpbWluYXRvckNvbHVtbkNvbWJvKGNvbnRhaW5lciwgZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfSU5IRVJJVEFOQ0VfRElTQ1JJTUlOQVRPUl9DT0xVTU4KLQkJKTsKLQotCQkvLyBEaXNjcmltaW5hdG9yIFR5cGUgd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJZGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkRpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfZGlzY3JpbWluYXRvclR5cGUsCi0JCQlhZGREaXNjcmltaW5hdG9yVHlwZUNvbWJvKGNvbnRhaW5lciwgZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfSU5IRVJJVEFOQ0VfRElTQ1JJTUlOQVRPUl9UWVBFCi0JCSk7Ci0KLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTdWJTZWN0aW9uKAotCQkJZGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkluaGVyaXRhbmNlQ29tcG9zaXRlX2RldGFpbHNHcm91cEJveCwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSkKLQkJKTsKLQkJCi0JCW5ldyBEZXRhaWxzQ29tcG9zaXRlKHRoaXMsIGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIsIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCAxNikpOwotCQkKLQkJbmV3IFBhbmVFbmFibGVyKGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbkVuYWJsZWRIb2xkZXIoKSwgdGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBDb2x1bW5Db21ibzxEaXNjcmltaW5hdG9yQ29sdW1uPiBhZGREaXNjcmltaW5hdG9yQ29sdW1uQ29tYm8oCi0JCUNvbXBvc2l0ZSBjb250YWluZXIsCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxEaXNjcmltaW5hdG9yQ29sdW1uPiBkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDb2x1bW5Db21ibzxEaXNjcmltaW5hdG9yQ29sdW1uPigKLQkJCXRoaXMsCi0JCQlkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyLAotCQkJY29udGFpbmVyKQotCQl7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoTmFtZWRDb2x1bW4uU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKE5hbWVkQ29sdW1uLkRFRkFVTFRfTkFNRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0TmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWROYW1lKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGUgZ2V0RGJUYWJsZV8oKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREYlRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTnVsbERlZmF1bHRWYWx1ZUVudHJ5KCkgewotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Ob25lU2VsZWN0ZWQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RGlzY3JpbWluYXRvckNvbHVtbj4gYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIERpc2NyaW1pbmF0b3JDb2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvckNvbHVtbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RGlzY3JpbWluYXRvckNvbHVtbiwgRGlzY3JpbWluYXRvclR5cGU+IGFkZERpc2NyaW1pbmF0b3JUeXBlQ29tYm8oCi0JCUNvbXBvc2l0ZSBjb250YWluZXIsCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxEaXNjcmltaW5hdG9yQ29sdW1uPiBkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPERpc2NyaW1pbmF0b3JDb2x1bW4sIERpc2NyaW1pbmF0b3JUeXBlPigKLQkJCXRoaXMsCi0JCQlkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyLAotCQkJY29udGFpbmVyKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKERpc2NyaW1pbmF0b3JDb2x1bW4uU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRGlzY3JpbWluYXRvclR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhEaXNjcmltaW5hdG9yVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLmNsYXNzLAotCQkJCQlEaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlLmNsYXNzLAotCQkJCQl2YWx1ZQotCQkJCSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBudWxsRGlzcGxheVN0cmluZygpIHsKLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTm9uZVNlbGVjdGVkOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRGlzY3JpbWluYXRvclR5cGUgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uRW5hYmxlZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5TUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9DT0xVTU5fSVNfQUxMT1dFRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5zcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgY2xhc3MgRGV0YWlsc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RGlzY3JpbWluYXRvckNvbHVtbj4gewotCQlwdWJsaWMgRGV0YWlsc0NvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0gICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIERpc2NyaW1pbmF0b3JDb2x1bW4+IHN1YmplY3RIb2xkZXIsCi0gICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJLy8gTGVuZ3RoIHdpZGdldHMKLQkJCWFkZExlbmd0aENvbWJvKGNvbnRhaW5lcik7Ci0KLQkJCS8vIENvbHVtbiBEZWZpbml0aW9uIHdpZGdldHMKLQkJCWFkZExhYmVsZWRUZXh0KAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfY29sdW1uRGVmaW5pdGlvbiwKLQkJCQlidWlsZENvbHVtbkRlZmluaXRpb25Ib2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKQotCQkJKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGFkZExlbmd0aENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCW5ldyBJbnRlZ2VyQ29tYm88RGlzY3JpbWluYXRvckNvbHVtbj4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfbGVuZ3RoOwotCQkJCX0KLQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgewotCQkJCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fTEVOR1RIOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgewotCQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxEaXNjcmltaW5hdG9yQ29sdW1uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEhfUFJPUEVSVFkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxEaXNjcmltaW5hdG9yQ29sdW1uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIERpc2NyaW1pbmF0b3JDb2x1bW4uU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZExlbmd0aCgpOwotCQkJCQkJfQotCi0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZExlbmd0aCh2YWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29sdW1uRGVmaW5pdGlvbkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RGlzY3JpbWluYXRvckNvbHVtbj4gZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcikgewotCi0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxEaXNjcmltaW5hdG9yQ29sdW1uLCBTdHJpbmc+KGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIsIE5hbWVkQ29sdW1uLkNPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb2x1bW5EZWZpbml0aW9uKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRDb2x1bW5EZWZpbml0aW9uKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0MTE2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZTxFbWJlZGRlZElkTWFwcGluZz4KLXsKLQlwdWJsaWMgRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVtYmVkZGVkSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGVkSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZSgKLQkJCQl0aGlzLAotCQkJCWNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYTM5NjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVtYmVkZGVkTWFwcGluZwotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU8RW1iZWRkZWRNYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+RW1iZWRkZWRNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVtYmVkZGVkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiZjBiMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlPEJhc2VFbWJlZGRlZE1hcHBpbmc+Ci17Ci0JcHVibGljIEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZSgKLQkJCVBhbmU8PyBleHRlbmRzIEJhc2VFbWJlZGRlZE1hcHBpbmc+IHBhcmVudFBhbmUsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyPiBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxCYXNlRW1iZWRkZWRNYXBwaW5nLCBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcj4gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVySG9sZGVyKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VudGl0eU5hbWVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW50aXR5TmFtZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWYzYzdiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW50aXR5TmFtZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBFbnRpdHkgTmFtZTogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIEFic3RyYWN0RW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eU5hbWVDb21wb3NpdGUKLQlleHRlbmRzIFBhbmU8RW50aXR5PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW50aXR5TmFtZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRW50aXR5TmFtZUNvbXBvc2l0ZSgKLQkJCVBhbmU8PyBleHRlbmRzIEVudGl0eT4gcGFyZW50UGFuZSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21ibyBjb21ibyA9IGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuRW50aXR5TmFtZUNvbXBvc2l0ZV9uYW1lLAotCQkJYnVpbGREZWZhdWx0RW50aXR5TmFtZUxpc3RIb2xkZXIoKSwKLQkJCWJ1aWxkRW50aXR5TmFtZUhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX05BTUUpOwotCQkKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdEVudGl0eU5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZERlZmF1bHRFbnRpdHlOYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdEVudGl0eU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5ERUZBVUxUX05BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRW50aXR5TmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlNQRUNJRklFRF9OQU1FX1BST1BFUlRZLCBFbnRpdHkuREVGQVVMVF9OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWROYW1lKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBkZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlpZiAoZGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCkuZXF1YWxzKHZhbHVlKSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCi0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZShFbnRpdHkgc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0TmFtZSgpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RW1wdHk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbnRpdHlPdmVycmlkZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW50aXR5T3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDY4OWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbnRpdHlPdmVycmlkZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUKLXsKLQlwdWJsaWMgRW50aXR5T3ZlcnJpZGVzQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgRW50aXR5PiBwYXJlbnRQYW5lLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VudW1UeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VudW1UeXBlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNTNmMmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbnVtVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEVudW0gVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBCYXNpY01hcHBpbmcKLSAqIEBzZWUgQmFzaWNNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVudW1UeXBlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnVtZXJhdGVkQ29udmVydGVyPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW51bVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVudW1UeXBlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRW51bWVyYXRlZENvbnZlcnRlcj4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxFbnVtZXJhdGVkQ29udmVydGVyLCBFbnVtVHlwZT4gYWRkRW51bVR5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEVudW1lcmF0ZWRDb252ZXJ0ZXIsIEVudW1UeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFbnVtZXJhdGVkQ29udmVydGVyLlNQRUNJRklFRF9FTlVNX1RZUEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFbnVtVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIEVudW1UeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFbnVtVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0RW51bVR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRW51bVR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5jbGFzcywKLQkJCQkJRW51bVR5cGVDb21wb3NpdGUudGhpcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFbnVtVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZEVudW1UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRW51bVR5cGUgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkRW51bVR5cGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvL0pwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfRU5VTUVSQVRFRAotCQlhZGRFbnVtVHlwZUNvbWJvKGNvbnRhaW5lcik7Ci0JCQotCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRCb29sZWFuSG9sZGVyKCksIHRoaXMpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFbnVtZXJhdGVkQ29udmVydGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVudW1lcmF0ZWRDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJCQlpZiAoZ2V0U3ViamVjdCgpICE9IG51bGwgJiYgZ2V0U3ViamVjdCgpLmdldFBhcmVudCgpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0ZldGNoVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9GZXRjaFR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ3NGI0NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0ZldGNoVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEZldGNoOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBGZXRjaGFibGUKLSAqIEBzZWUgQmFzaWNNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqIEBzZWUgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICogQHNlZSBNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqIEBzZWUgT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKiBAc2VlIE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGZXRjaFR5cGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEZldGNoYWJsZT4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5GZXRjaFR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZldGNoVHlwZUNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBGZXRjaGFibGU+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RmV0Y2hhYmxlLCBGZXRjaFR5cGU+IGFkZEZldGNoVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RmV0Y2hhYmxlLCBGZXRjaFR5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEZldGNoYWJsZS5ERUZBVUxUX0ZFVENIX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChGZXRjaGFibGUuU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRmV0Y2hUeXBlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRmV0Y2hUeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBGZXRjaFR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdEZldGNoKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEZldGNoVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLmNsYXNzLAotCQkJCQlGZXRjaFR5cGVDb21wb3NpdGUudGhpcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBGZXRjaFR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRGZXRjaCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEZldGNoVHlwZSB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRGZXRjaCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkJhc2ljR2VuZXJhbFNlY3Rpb25fZmV0Y2hMYWJlbCwKLQkJCWFkZEZldGNoVHlwZUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0ZFVENIX1RZUEUKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0dlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0dlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5Y2IyYmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBTdHJhdGVneTogICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBHZW5lcmF0b3IgTmFtZTogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgSWRNYXBwaW5nCi0gKiBAc2VlIEdlbmVyYXRlZFZhbHVlCi0gKiBAc2VlIElkTWFwcGluZ0dlbmVyYXRpb25Db21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPElkTWFwcGluZz4KLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+R2VuZXJhdGVkVmFsdWVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIElkTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBTdHJhdGVneSB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9zdHJhdGVneSwKLQkJCWFkZFN0cmF0ZWd5Q29tYm9WaWV3ZXIoY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfR0VORVJBVEVEX1ZBTFVFX1NUUkFURUdZCi0JCSk7Ci0KLQkJYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9nZW5lcmF0b3JOYW1lLAotCQkJYnVpbGRHZW5lcmF0b3JOYW1lTGlzdEhvbGRlcigpLAotCQkJYnVpbGRHZW5lcmF0b3JOYW1lSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0dFTkVSQVRFRF9WQUxVRV9TVFJBVEVHWQotCQkpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxHZW5lcmF0ZWRWYWx1ZSwgR2VuZXJhdGlvblR5cGU+IGFkZFN0cmF0ZWd5Q29tYm9WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxHZW5lcmF0ZWRWYWx1ZSwgR2VuZXJhdGlvblR5cGU+KHRoaXMsIGJ1aWxkR2VuZXJhdGVkVmFsdWVIb2xkZXIoKSwgcGFyZW50KSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoR2VuZXJhdGVkVmFsdWUuREVGQVVMVF9TVFJBVEVHWV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoR2VuZXJhdGVkVmFsdWUuU1BFQ0lGSUVEX1NUUkFURUdZX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgR2VuZXJhdGlvblR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBHZW5lcmF0aW9uVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgR2VuZXJhdGlvblR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFN0cmF0ZWd5KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEdlbmVyYXRpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuY2xhc3MsCi0JCQkJCUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLnRoaXMsCi0JCQkJCXZhbHVlCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgR2VuZXJhdGlvblR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRTdHJhdGVneSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEdlbmVyYXRpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0cmlldmVHZW5lcmF0ZWRWYWx1ZSgpLnNldFNwZWNpZmllZFN0cmF0ZWd5KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0ZWRWYWx1ZT4gYnVpbGRHZW5lcmF0ZWRWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SWRNYXBwaW5nLCBHZW5lcmF0ZWRWYWx1ZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBJZE1hcHBpbmcuR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBHZW5lcmF0ZWRWYWx1ZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEdlbmVyYXRlZFZhbHVlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkR2VuZXJhdG9yTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdGVkVmFsdWUsIFN0cmluZz4oYnVpbGRHZW5lcmF0ZWRWYWx1ZUhvbGRlcigpLCBHZW5lcmF0ZWRWYWx1ZS5TUEVDSUZJRURfR0VORVJBVE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0ICE9IG51bGwpIHsKLQkJCQkJc2V0VmFsdWVfKHZhbHVlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXJldHJpZXZlR2VuZXJhdGVkVmFsdWUoKS5zZXRTcGVjaWZpZWRHZW5lcmF0b3IodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRHZW5lcmF0b3IodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFVzZSB0aGUgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwgZXZlbiB0aG91Z2ggaXQgb25seSBjb250YWlucyAxIGxpc3QgdmFsdWUgbW9kZWwKLQkgKiBUaGlzIHByZXZlbnRzIHRoZSBjb21ibyBpdGVtcyBmcm9tIGJlaW5nIHJlc2V0IHdoZW4gdGhlIGxpc3Qgb2YgZ2VuZXJhdG9ycwotCSAqIGhhc24ndCByZWFsbHkgY2hhbmdlZC4gIFRoaXMga2VlcHMgdGhlIGN1cnNvciBmcm9tIGdvaW5nIGJhY2sgdG8gdGhlIGJlZ2lubmluZwotCSAqIG9mIHRoZSBsaXN0IGV2ZXJ5IHRpbWUgdGhlIGdlbmVyYXRvciBuYW1lIGlzIGVkaXRlZCBpbiB0aGUgY29tYm8uCi0JICogQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci5saXN0Q2hhbmdlZCgpIGRvZXMgbm90IGhhbmRsZSB0aGlzIGNhc2Ugd2VsbCwgCi0JICogdGhlIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsIGRvZXMgaGFuZGxlIGxpc3RDaGFuZ2VkIGV2ZW50cyB3ZWxsLgotCSAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkR2VuZXJhdG9yTmFtZUxpc3RIb2xkZXIoKSB7Ci0JCWphdmEudXRpbC5MaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFN0cmluZz4oCi0JCQlidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLAotCQkJUGVyc2lzdGVuY2VVbml0LkdFTkVSQVRPUlNfTElTVCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3RJdGVyYXRvcihBcnJheVRvb2xzLnNvcnQodGhpcy5zdWJqZWN0LnVuaXF1ZUdlbmVyYXRvck5hbWVzKCkpKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPihsaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPElkTWFwcGluZywgUGVyc2lzdGVuY2VVbml0PihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgR2VuZXJhdGVkVmFsdWUgcmV0cmlldmVHZW5lcmF0ZWRWYWx1ZSgpIHsKLQkJR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUgPSBnZXRTdWJqZWN0KCkuZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQotCQlpZiAoZ2VuZXJhdGVkVmFsdWUgPT0gbnVsbCkgewotCQkJZ2VuZXJhdGVkVmFsdWUgPSBnZXRTdWJqZWN0KCkuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZ2VuZXJhdGVkVmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9HZW5lcmF0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0dlbmVyYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3MTQzOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0dlbmVyYXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkdlbmVyYXRvckNvbXBvc2l0ZS5HZW5lcmF0b3JCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IHYgVGFibGUgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB4IFRhYmxlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8IFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IHYgU2VxdWVuY2UgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB4IFNlcXVlbmNlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8IFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBHZW5lcmF0b3JDb250YWluZXIKLSAqIEBzZWUgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUKLSAqIEBzZWUgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUKLSAqIEBzZWUgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGlvbkNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8R2VuZXJhdG9yQ29udGFpbmVyPgotewotCi0JLy9UaGVzZSBhcmUgYnVpbHQgdG8gc3RhbmQgYWxvbmUgYmVjYXVzZSB3ZSBkbyBub3Qgd2FudCB0aGUgcGFuZWxzIHRvIGNvbGxhcHNlIGp1c3QKLQkvL2JlY2F1c2UgdGhlIGdlbmVyYXRvciBpcyByZW1vdmVkIGVpdGhlciBpbiB0aGUgc291cmNlIG9yIHVzaW5nIHRoZSBjaGVjayBib3ggaW4gdGhlIFVJLiAgCi0JLy9XZSBkb24ndCB3YW50IHRoZXNlIHRvIGJlIGJ1aWx0IG9uIHRoZSBtb2RlbCBnZW5lcmF0b3IgcHJvcGVydGllcy4KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHNlcXVlbmNlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB0YWJsZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyOwotCi0JCi0JcHVibGljIEdlbmVyYXRpb25Db21wb3NpdGUoCi0JCVBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgR2VuZXJhdG9yQ29udGFpbmVyPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKTsKLQkJdGhpcy50YWJsZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyICAgID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlci5zZXRWYWx1ZShCb29sZWFuLnZhbHVlT2YoZ2V0U3ViamVjdCgpICE9IG51bGwgJiYgZ2V0U3ViamVjdCgpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCkpOwotCQl0aGlzLnRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIgICAuc2V0VmFsdWUoQm9vbGVhbi52YWx1ZU9mKGdldFN1YmplY3QoKSAhPSBudWxsICYmIGdldFN1YmplY3QoKS5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmluaXRpYWxpemVUYWJsZUdlbmVyYXRvclBhbmUoY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplU2VxdWVuY2VHZW5lcmF0b3JQYW5lKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvclBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciBzdWItc2VjdGlvbgotCQljb250YWluZXIgPSB0aGlzLmFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDEwKSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkdlbmVyYXRvcnNDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3JTZWN0aW9uLAotCQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyCi0JCSk7Ci0KLQkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIGNoZWNrIGJveAotCQlCdXR0b24gc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveCA9IGFkZENoZWNrQm94KAotCQkJdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5HZW5lcmF0b3JzQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3gsCi0JCQl0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JCb29sZWFuSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUgotCQkpOwotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciBwYW5lCi0JCXRoaXMuYWRkU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoY29udGFpbmVyLCAwLCBzZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94LmdldEJvcmRlcldpZHRoKCkgKyAxNik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsIGludCB0b3BNYXJnaW4sIGludCBsZWZ0TWFyZ2luKSB7Ci0JCW5ldyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQl0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIoKSwKLQkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIHRvcE1hcmdpbiwgbGVmdE1hcmdpbiksCi0JCQl0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JCdWlsZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3JDb250YWluZXIsIFNlcXVlbmNlR2VuZXJhdG9yPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvckNvbnRhaW5lci5TRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgR2VuZXJhdG9yQnVpbGRlcjxTZXF1ZW5jZUdlbmVyYXRvcj4gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckJ1aWxkZXIoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJhdG9yQnVpbGRlcjxTZXF1ZW5jZUdlbmVyYXRvcj4oKSB7Ci0JCQlwdWJsaWMgU2VxdWVuY2VHZW5lcmF0b3IgYWRkR2VuZXJhdG9yKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9yQ29udGFpbmVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvckNvbnRhaW5lci5TRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSkgewotCQkJCQl0aGlzLnN1YmplY3QuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIXZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSkgewotCQkJCQl0aGlzLnN1YmplY3QucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0gCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVGFibGVHZW5lcmF0b3JQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBUYWJsZSBHZW5lcmF0b3Igc3ViLXNlY3Rpb24KLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTdWJTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuR2VuZXJhdG9yc0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvclNlY3Rpb24sCi0JCQl0aGlzLnRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIKLQkJKTsKLQotCQlCdXR0b24gdGFibGVHZW5lcmF0b3JDaGVja0JveCA9IGFkZENoZWNrQm94KAotCQkJdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5HZW5lcmF0b3JzQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yQ2hlY2tCb3gsCi0JCQl0aGlzLmJ1aWxkVGFibGVHZW5lcmF0b3JCb29sZWFuSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUgotCQkpOwotCi0KLQkJLy8gVGFibGUgR2VuZXJhdG9yIHBhbmUKLQkJbmV3IFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCXRoaXMuYnVpbGRUYWJsZUdlbmVyYXRvckhvbGRlcigpLAotCQkJdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgdGFibGVHZW5lcmF0b3JDaGVja0JveC5nZXRCb3JkZXJXaWR0aCgpICsgMTYpLAotCQkJdGhpcy5idWlsZFRhYmxlR2VuZXJhdG9yQnVpbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvckNvbnRhaW5lciwgVGFibGVHZW5lcmF0b3I+KGdldFN1YmplY3RIb2xkZXIoKSwgR2VuZXJhdG9yQ29udGFpbmVyLlRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGVHZW5lcmF0b3IgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgR2VuZXJhdG9yQnVpbGRlcjxUYWJsZUdlbmVyYXRvcj4gYnVpbGRUYWJsZUdlbmVyYXRvckJ1aWxkZXIoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJhdG9yQnVpbGRlcjxUYWJsZUdlbmVyYXRvcj4oKSB7Ci0JCQlwdWJsaWMgVGFibGVHZW5lcmF0b3IgYWRkR2VuZXJhdG9yKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGFibGVHZW5lcmF0b3JFeHBhbnN0aW9uU3RhdGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvckNvbnRhaW5lciwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBHZW5lcmF0b3JDb250YWluZXIuVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCk7Ci0JCQl9CQkKLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGFibGVHZW5lcmF0b3JCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3JDb250YWluZXIsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgR2VuZXJhdG9yQ29udGFpbmVyLlRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQkJCX0KLQkJCQllbHNlIGlmICghdmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0dlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTcxZjJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5JbnRlZ2VyQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBnZW5lcmljIHBhbmUgZm9yIGEgZ2VuZXJhdG9yLgotICoKLSAqIEBzZWUgSWRNYXBwaW5nCi0gKiBAc2VlIEdlbmVyYXRvcgotICogQHNlZSBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSAtIEEgc3ViLXBhbmUKLSAqIEBzZWUgVGFsYmVHZW5lcmF0b3JDb21wb3NpdGUgLSBBIHN1Yi1wYW5lCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmF0b3JDb21wb3NpdGU8VCBleHRlbmRzIEdlbmVyYXRvcj4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0KLQlwcm90ZWN0ZWQgR2VuZXJhdG9yQnVpbGRlcjxUPiBnZW5lcmF0b3JCdWlsZGVyOwotCi0JcHJvdGVjdGVkIEdlbmVyYXRvckNvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0gICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotICAgICAgICBHZW5lcmF0b3JCdWlsZGVyPFQ+IGdlbmVyYXRvckJ1aWxkZXIpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKLQkJdGhpcy5nZW5lcmF0b3JCdWlsZGVyID0gZ2VuZXJhdG9yQnVpbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEdlbmVyYXRvci4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIHRoZSB1c2VyCi0JICogdG8gc2V0IHZhbHVlcyBvbiBhIEdlbmVyYXRvciBiZWZvcmUgdGhlIG1vZGVsIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkLgotCSAqIEFsbG93cyB0aGVtIG5vdCB0byBmaXJzdCBoYXZlIHRvIGNoZWNrIHRoZSBjaGVjayBib3ggdG8gZW5hYmxlIHRoZSBwYW5lbC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVCBidWlsZEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yQnVpbGRlci5hZGRHZW5lcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIDxjb2RlPkdlbmVyYXRvcjwvY29kZT4gYW5kIGlmIGl0IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuCi0JICogY3JlYXRlIGl0LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3QgVGhlIHN1YmplY3QgdXNlZCB0byByZXRyaWV2ZSB0aGUgZ2VuZXJhdG9yCi0JICogQHJldHVybiBUaGUgPGNvZGU+R2VuZXJhdG9yPC9jb2RlPiB3aGljaCBzaG91bGQgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVCByZXRyaWV2ZUdlbmVyYXRvcigpIHsKLQkJVCBnZW5lcmF0b3IgPSBnZXRTdWJqZWN0KCk7Ci0KLQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQlnZW5lcmF0b3IgPSB0aGlzLmJ1aWxkR2VuZXJhdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gZ2VuZXJhdG9yOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkR2VuZXJhdG9yTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9yLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgR2VuZXJhdG9yLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0ICE9IG51bGwpIHsKLQkJCQkJc2V0VmFsdWVfKHZhbHVlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXJldHJpZXZlR2VuZXJhdG9yKCkuc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEFsbG9jYXRpb25TaXplQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSW50ZWdlckNvbWJvPEdlbmVyYXRvcj4odGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuR2VuZXJhdG9yQ29tcG9zaXRlX2FsbG9jYXRpb25TaXplOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ly9KcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9MRU5HVEg7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9yLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvci5ERUZBVUxUX0FMTE9DQVRJT05fU0laRV9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXREZWZhdWx0QWxsb2NhdGlvblNpemUoKSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3IsIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgR2VuZXJhdG9yLlNQRUNJRklFRF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyB2b2lkIHNldFZhbHVlKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXJldHJpZXZlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfTsJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEluaXRpYWxWYWx1ZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEludGVnZXJDb21ibzxHZW5lcmF0b3I+KHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkdlbmVyYXRvckNvbXBvc2l0ZV9pbml0aWFsVmFsdWU7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJCQlyZXR1cm4gbnVsbDsvL0pwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX0xFTkdUSDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3IsIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgR2VuZXJhdG9yLkRFRkFVTFRfSU5JVElBTF9WQUxVRV9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9yLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvci5TUEVDSUZJRURfSU5JVElBTF9WQUxVRV9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyB2b2lkIHNldFZhbHVlKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXJldHJpZXZlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07CQotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgSlBBIHByb2plY3QuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBKUEEgcHJvamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3ViamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmdldFN1YmplY3QoKSA9PSBudWxsID8gbnVsbCA6IHRoaXMuZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lIHVzZWQgdG8gbGlzdGVuIHRvIHRoZSBJRCBtYXBwaW5nIHdoZW4gdGhlCi0JICogZ2VuZXJhdG9yIGNoYW5nZXMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0eSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2VuZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKTsKLQotCi0JcHVibGljIGludGVyZmFjZSBHZW5lcmF0b3JCdWlsZGVyPFQ+IHsKLQkJLyoqCi0JCSAqIEFkZCBhIGdlbmVyYXRvciB0byB0aGUgbW9kZWwgYW5kIHJldHVybiBpdAotCQkgKi8KLQkJVCBhZGRHZW5lcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JZENsYXNzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0lkQ2xhc3NDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4YjI1NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0lkQ2xhc3NDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJDb21ib1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIElkIGNsYXNzIGh5cGVybGluayBsYWJlbCwgY29tYm8sIGFuZCBicm93c2UgYnV0dG9uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSWRDbGFzc0NvbXBvc2l0ZQotCWV4dGVuZHMgUGFuZTxJZENsYXNzUmVmZXJlbmNlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SWRDbGFzc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIElkQ2xhc3NDb21wb3NpdGUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIElkQ2xhc3NSZWZlcmVuY2U+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSWRDbGFzc0NvbXBvc2l0ZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSWRDbGFzc1JlZmVyZW5jZT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgIAlib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSWRDbGFzc0Nob29zZXJDb21ib1BhbmUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBjbGFzcyBJZENsYXNzQ2hvb3NlckNvbWJvUGFuZQotCQlleHRlbmRzIENsYXNzQ2hvb3NlckNvbWJvUGFuZTxJZENsYXNzUmVmZXJlbmNlPgotCXsKLQkJcHVibGljIElkQ2xhc3NDaG9vc2VyQ29tYm9QYW5lKFBhbmU8SWRDbGFzc1JlZmVyZW5jZT4gcGFyZW50UGFuZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQkJfQotCQkKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SWRDbGFzc05hbWUoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoY2xhc3NOYW1lKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLklkQ2xhc3NDb21wb3NpdGVfbGFiZWw7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRJZENsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SWRDbGFzc1JlZmVyZW5jZSwgU3RyaW5nPigKLQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCAKLQkJCQkJSWRDbGFzc1JlZmVyZW5jZS5TUEVDSUZJRURfSURfQ0xBU1NfTkFNRV9QUk9QRVJUWSwKLQkJCQkJSWRDbGFzc1JlZmVyZW5jZS5ERUZBVUxUX0lEX0NMQVNTX05BTUVfUFJPUEVSVFkpIHsKLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlTdHJpbmcgdmFsdWUgPSB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKTsKLQkJCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IGRlZmF1bHRUZXh0KHRoaXMuc3ViamVjdCkgOiB2YWx1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlpZiAodmFsdWUgPT0gbnVsbCAKLQkJCQkJCQl8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwIAotCQkJCQkJCXx8IHZhbHVlLmVxdWFscyhkZWZhdWx0VGV4dCh0aGlzLnN1YmplY3QpKSkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGV4dChJZENsYXNzUmVmZXJlbmNlIGlkQ2xhc3NSZWZlcmVuY2UpIHsKLQkJCVN0cmluZyBkZWZhdWx0Q2xhc3NOYW1lID0gaWRDbGFzc1JlZmVyZW5jZS5nZXREZWZhdWx0SWRDbGFzc05hbWUoKTsKLQkJCXJldHVybiAoZGVmYXVsdENsYXNzTmFtZSA9PSBudWxsKSA/Ci0JCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk5vbmVTZWxlY3RlZAotCQkJCQk6IE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sIGRlZmF1bHRDbGFzc05hbWUpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDbGFzc0xpc3RIb2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQkJbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxJZENsYXNzUmVmZXJlbmNlLCBTdHJpbmc+KAotCQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBJZENsYXNzUmVmZXJlbmNlLkRFRkFVTFRfSURfQ0xBU1NfTkFNRV9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiBkZWZhdWx0VGV4dCh0aGlzLnN1YmplY3QpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JZE1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2MGQ5Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIElkTWFwcGluZ0NvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGU8SWRNYXBwaW5nPgotewotCXB1YmxpYyBJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0lkTWFwcGluZ0dlbmVyYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA1Njc1ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0lkTWFwcGluZ0dlbmVyYXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuR2VuZXJhdG9yQ29tcG9zaXRlLkdlbmVyYXRvckJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lbCBpcyBwYXJ0aWFsbHkgYSBjb3B5IG9mIHRoZSBHZW5lcmF0aW9uQ29tcG9zaXRlIHBhbmVsLiBUaGUgZGlmZmVyZW5jZQotICogaXMgdGhhdCB0aGlzIHBhbmVsIGluY2x1ZGVzIHRoZSBHZW5lcmF0ZWQgVmFsdWUgY29tcG9zaXRlLiAgV2hlbiBhIHRhYmxlCi0gKiBvciBzZXF1ZW5jZSBnZW5lcmF0b3IgaXMgYWRkZWQsIHdlIHNldCB0aGUgIm5hbWUiIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSAKLSAqIGdlbmVyYXRlZCB2YWx1ZSAiZ2VuZXJhdG9yIiBpZiBpdCBhbHJlYWR5IGV4aXN0cwotICogCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IHYgUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB4IFByaW1hcnkgS2V5IEdlbmVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgIHwgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgdiBUYWJsZSBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgIHggVGFibGUgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgIHwgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgdiBTZXF1ZW5jZSBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgIHggU2VxdWVuY2UgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgIHwgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBJZE1hcHBpbmcKLSAqIEBzZWUgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUKLSAqIEBzZWUgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUKLSAqIEBzZWUgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUKLSAqIEBzZWUgSWRNYXBwaW5nQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIElkTWFwcGluZ0dlbmVyYXRpb25Db21wb3NpdGUgZXh0ZW5kcyBQYW5lPElkTWFwcGluZz4KLXsKLQotCS8vVGhlc2UgYXJlIGJ1aWx0IHRvIHN0YW5kIGFsb25lIGJlY2F1c2Ugd2UgZG8gbm90IHdhbnQgdGhlIHBhbmVscyB0byBjb2xsYXBzZSBqdXN0Ci0JLy9iZWNhdXNlIHRoZSBnZW5lcmF0b3IgaXMgcmVtb3ZlZCBlaXRoZXIgaW4gdGhlIHNvdXJjZSBvciB1c2luZyB0aGUgY2hlY2sgYm94IGluIHRoZSBVSS4gIAotCS8vV2UgZG9uJ3Qgd2FudCB0aGVzZSB0byBiZSBidWlsdCBvbiB0aGUgbW9kZWwgZ2VuZXJhdG9yIHByb3BlcnRpZXMuCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBzZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdGFibGVHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlcjsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5HZW5lcmF0aW9uQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBJZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIElkTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKTsKLQkJdGhpcy50YWJsZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyICAgID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlci5zZXRWYWx1ZShCb29sZWFuLnZhbHVlT2YoZ2V0U3ViamVjdCgpICE9IG51bGwgJiYgZ2V0U3ViamVjdCgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCkpOwotCQl0aGlzLnRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIgICAuc2V0VmFsdWUoQm9vbGVhbi52YWx1ZU9mKGdldFN1YmplY3QoKSAhPSBudWxsICYmIGdldFN1YmplY3QoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBQcmltYXJ5IEtleSBHZW5lcmF0aW9uIHNlY3Rpb24KLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3ByaW1hcnlLZXlHZW5lcmF0aW9uU2VjdGlvbiwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKQotCQkpOwotCi0JCS8vIFByaW1hcnkgS2V5IEdlbmVyYXRpb24gY2hlY2sgYm94Ci0JCUJ1dHRvbiBwcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94ID0gYWRkQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfcHJpbWFyeUtleUdlbmVyYXRpb25DaGVja0JveCwKLQkJCWJ1aWxkUHJpbWFyeUtleUdlbmVyYXRpb25Ib2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfUFJJTUFSWV9LRVlfR0VORVJBVElPTgotCQkpOwotCi0JCS8vIEdlbmVyYXRlZCBWYWx1ZSB3aWRnZXRzCi0JCUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlIGdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlID0gbmV3IEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWNvbnRhaW5lcgotCQkpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCAgICAgICAgICA9IHByaW1hcnlLZXlHZW5lcmF0aW9uQ2hlY2tCb3guZ2V0Qm9yZGVyV2lkdGgoKSArIDE2OwotCi0JCWdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdG9yQ29udGFpbmVyPiBnZW5lcmF0b3JIb2xkZXIgPSBidWlsZEdlbmVyYXRvckNvbnRhaW5lcigpOwotCQkvLyBUYWJsZSBHZW5lcmF0b3IgcGFuZQotCQlpbml0aWFsaXplVGFibGVHZW5lcmF0b3JQYW5lKGFkZFN1YlBhbmUoY29udGFpbmVyLCAxMCksIGdlbmVyYXRvckhvbGRlcik7Ci0KLQkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIHBhbmUKLQkJaW5pdGlhbGl6ZVNlcXVlbmNlR2VuZXJhdG9yUGFuZShhZGRTdWJQYW5lKGNvbnRhaW5lciwgMTApLCBnZW5lcmF0b3JIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQcmltYXJ5S2V5R2VuZXJhdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SWRNYXBwaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIElkTWFwcGluZy5HRU5FUkFURURfVkFMVUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0R2VuZXJhdGVkVmFsdWUoKSAhPSBudWxsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0R2VuZXJhdGVkVmFsdWUoKSA9PSBudWxsKSkgewotCQkJCQl0aGlzLnN1YmplY3QuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIXZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0R2VuZXJhdGVkVmFsdWUoKSAhPSBudWxsKSkgewotCQkJCQl0aGlzLnN1YmplY3QucmVtb3ZlR2VuZXJhdGVkVmFsdWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gYnVpbGRHZW5lcmF0b3JDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPElkTWFwcGluZywgR2VuZXJhdG9yQ29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEdlbmVyYXRvckNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEdlbmVyYXRvckNvbnRhaW5lcigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU2VxdWVuY2VHZW5lcmF0b3JQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGdlbmVyYXRvckhvbGRlcikgewotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciBzdWItc2VjdGlvbgotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVN1YlNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3JTZWN0aW9uLAotCQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyCi0JCSk7Ci0KLQkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIGNoZWNrIGJveAotCQlCdXR0b24gc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveCA9IGFkZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3gsCi0JCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcihnZW5lcmF0b3JIb2xkZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1IKLQkJKTsKLQotCQkvLyBTZXF1ZW5jZSBHZW5lcmF0b3IgcGFuZQotCQl0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQljb250YWluZXIsIAotCQkJYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckhvbGRlcihnZW5lcmF0b3JIb2xkZXIpLAotCQkJYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckJ1aWxkZXIoZ2VuZXJhdG9ySG9sZGVyKSwKLQkJCTAsIAotCQkJc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveC5nZXRCb3JkZXJXaWR0aCgpICsgMTYpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckJvb2xlYW5Ib2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gZ2VuZXJhdG9ySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvckNvbnRhaW5lciwgQm9vbGVhbj4oZ2VuZXJhdG9ySG9sZGVyLCBHZW5lcmF0b3JDb250YWluZXIuU0VRVUVOQ0VfR0VORVJBVE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQotCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgPT0gbnVsbCkpIHsKLQotCQkJCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IHRoaXMuc3ViamVjdC5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkJCQlHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSA9IGdldFN1YmplY3QoKS5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCi0JCQkJCWlmICgoZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgJiYKLQkJCQkJICAgIChnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSAhPSBudWxsKSkKLQkJCQkJewotCQkJCQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZShnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIXZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSkgewotCQkJCQl0aGlzLnN1YmplY3QucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSBidWlsZFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlKAotCQkJQ29tcG9zaXRlIGNvbnRhaW5lciwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyLAotCQkJR2VuZXJhdG9yQnVpbGRlcjxTZXF1ZW5jZUdlbmVyYXRvcj4gZ2VuZXJhdG9yQnVpbGRlciwKLQkJCWludCB0b3BNYXJnaW4sCi0JCQlpbnQgbGVmdE1hcmdpbikgewotCi0JCXJldHVybiBuZXcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJc2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIsCi0JCQl0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCB0b3BNYXJnaW4sIGxlZnRNYXJnaW4pLAotCQkJZ2VuZXJhdG9yQnVpbGRlcgotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGdlbmVyYXRvckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3JDb250YWluZXIsIFNlcXVlbmNlR2VuZXJhdG9yPihnZW5lcmF0b3JIb2xkZXIsIEdlbmVyYXRvckNvbnRhaW5lci5TRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JcHJpdmF0ZSBHZW5lcmF0b3JCdWlsZGVyPFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9yQnVpbGRlcihmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdG9yQ29udGFpbmVyPiBnZW5lcmF0b3JIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmF0b3JCdWlsZGVyPFNlcXVlbmNlR2VuZXJhdG9yPigpIHsKLQkJCXB1YmxpYyBTZXF1ZW5jZUdlbmVyYXRvciBhZGRHZW5lcmF0b3IoKSB7Ci0JCQkJcmV0dXJuIGdlbmVyYXRvckhvbGRlci5nZXRWYWx1ZSgpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVGFibGVHZW5lcmF0b3JQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGdlbmVyYXRvckhvbGRlcikgewotCi0JCS8vIFRhYmxlIEdlbmVyYXRvciBzdWItc2VjdGlvbgotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVN1YlNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfdGFibGVHZW5lcmF0b3JTZWN0aW9uLAotCQkJdGhpcy50YWJsZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyCi0JCSk7Ci0KLQkJQnV0dG9uIHRhYmxlR2VuZXJhdG9yQ2hlY2tCb3ggPSBhZGRDaGVja0JveCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvckNoZWNrQm94LAotCQkJYnVpbGRUYWJsZUdlbmVyYXRvckJvb2xlYW5Ib2xkZXIoZ2VuZXJhdG9ySG9sZGVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SCi0JCSk7Ci0KLQkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIHBhbmUKLQkJdGhpcy5idWlsZFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLCAKLQkJCWJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoZ2VuZXJhdG9ySG9sZGVyKSwKLQkJCWJ1aWxkVGFibGVHZW5lcmF0b3JCdWlsZGVyKGdlbmVyYXRvckhvbGRlciksCi0JCQkwLCAKLQkJCXRhYmxlR2VuZXJhdG9yQ2hlY2tCb3guZ2V0Qm9yZGVyV2lkdGgoKSArIDE2KTsKLQl9CQotCQotCXByb3RlY3RlZCBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSBidWlsZFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlKAotCQkJQ29tcG9zaXRlIGNvbnRhaW5lciwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGVHZW5lcmF0b3I+IHRhYmxlR2VuZXJhdG9ySG9sZGVyLAotCQkJR2VuZXJhdG9yQnVpbGRlcjxUYWJsZUdlbmVyYXRvcj4gZ2VuZXJhdG9yQnVpbGRlciwKLQkJCWludCB0b3BNYXJnaW4sCi0JCQlpbnQgbGVmdE1hcmdpbikgewotCi0JCXJldHVybiBuZXcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJdGFibGVHZW5lcmF0b3JIb2xkZXIsCi0JCQl0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCB0b3BNYXJnaW4sIGxlZnRNYXJnaW4pLAotCQkJZ2VuZXJhdG9yQnVpbGRlcgotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFRhYmxlR2VuZXJhdG9yPiBidWlsZFRhYmxlR2VuZXJhdG9ySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGdlbmVyYXRvckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3JDb250YWluZXIsIFRhYmxlR2VuZXJhdG9yPihnZW5lcmF0b3JIb2xkZXIsIEdlbmVyYXRvckNvbnRhaW5lci5UQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhYmxlR2VuZXJhdG9yIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGFibGVHZW5lcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEdlbmVyYXRvckJ1aWxkZXI8VGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVHZW5lcmF0b3JCdWlsZGVyKGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGdlbmVyYXRvckhvbGRlcikgewotCQlyZXR1cm4gbmV3IEdlbmVyYXRvckJ1aWxkZXI8VGFibGVHZW5lcmF0b3I+KCkgewotCQkJcHVibGljIFRhYmxlR2VuZXJhdG9yIGFkZEdlbmVyYXRvcigpIHsKLQkJCQlyZXR1cm4gZ2VuZXJhdG9ySG9sZGVyLmdldFZhbHVlKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLSAJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRhYmxlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdG9yQ29udGFpbmVyPiBnZW5lcmF0b3JIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9yQ29udGFpbmVyLCBCb29sZWFuPihnZW5lcmF0b3JIb2xkZXIsIEdlbmVyYXRvckNvbnRhaW5lci5UQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSkgewotCi0JCQkJCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gdGhpcy5zdWJqZWN0LmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQkJCUdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlID0gZ2V0U3ViamVjdCgpLmdldEdlbmVyYXRlZFZhbHVlKCk7Ci0KLQkJCQkJaWYgKChnZW5lcmF0ZWRWYWx1ZSAhPSBudWxsKSAmJgotCQkJCQkgICAgKGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpICE9IG51bGwpKQotCQkJCQl7Ci0JCQkJCQl0YWJsZUdlbmVyYXRvci5zZXROYW1lKGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICghdmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0ludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODFlYmMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqCi0gKiBAc2VlIEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdAotICogQHNlZSBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtbkRpYWxvZzxJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Q+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSBqb2luVGFibGUgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMKLQkgKiBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gRWl0aGVyIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhpcyBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2coU2hlbGwgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5UYWJsZSBqb2luVGFibGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIocGFyZW50LCBqb2luVGFibGUsIGpvaW5Db2x1bW4pOwotCX0KLQotCS8qCi0JICogbm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmU8SW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0PiBidWlsZExheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbkRpYWxvZ1BhbmU8SW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0PigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCWNvbnRhaW5lcgotCQkpCi0JCQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVFZGl0YWJsZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3IEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdCgKLQkJCWdldE93bmVyKCksCi0JCQlnZXRKb2luQ29sdW1uKCkKLQkJKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSm9pbkNvbHVtbiBnZXRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gKEpvaW5Db2x1bW4pIHN1cGVyLmdldEpvaW5Db2x1bW4oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSm9pblRhYmxlIGdldE93bmVyKCkgewotCQlyZXR1cm4gKEpvaW5UYWJsZSkgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NWE0OTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogVGhlIHN0YXRlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSBvciBlZGl0IGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gb24gYSBqb2luCi0gKiB0YWJsZS4KLSAqCi0gKiBAc2VlIEpvaW5Db2x1bW4KLSAqIEBzZWUgSm9pblRhYmxlCi0gKiBAc2VlIEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdCAKLQlleHRlbmRzIEpvaW5Db2x1bW5TdGF0ZU9iamVjdAotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Q8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGpvaW5UYWJsZQotCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QoCi0JCQlKb2luVGFibGUgam9pblRhYmxlLAotCSAgICAgICAgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKGpvaW5UYWJsZSwgam9pbkNvbHVtbik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKb2luVGFibGUgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoSm9pblRhYmxlKSBzdXBlci5nZXRPd25lcigpOwotCX0KLQkKLQlwcml2YXRlIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXROYW1lVGFibGUoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldERiVGFibGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSB7Ci0JCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkJaWYgKHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRW50aXR5IHRhcmdldEVudGl0eSA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGFyZ2V0RW50aXR5LmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5pdGlhbFRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXROYW1lKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFibGVzKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8U3RyaW5nPihnZXRJbml0aWFsVGFibGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkRpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZmRlYzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRGlhbG9nUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGRlZmluaXRpb24gb2YgdGhlIGRpYWxvZyB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+SUpvaW5Db2x1bW48L2NvZGU+LgotICoKLSAqIEBzZWUgSm9pbkNvbHVtbgotICogQHNlZSBKb2luQ29sdW1uU3RhdGVPYmplY3QKLSAqIEBzZWUgSm9pbkNvbHVtbkRpYWxvZ1BhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpvaW5Db2x1bW5EaWFsb2c8VCBleHRlbmRzIEpvaW5Db2x1bW5TdGF0ZU9iamVjdD4gZXh0ZW5kcyBCYXNlSm9pbkNvbHVtbkRpYWxvZzxUPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0Sm9pbkNvbHVtbkRpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gb3duZXIgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMgbG9jYXRlZAotCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBKb2luQ29sdW1uRGlhbG9nKFNoZWxsIHBhcmVudCwgT2JqZWN0IG93bmVyLCBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJc3VwZXIocGFyZW50LCBvd25lciwgam9pbkNvbHVtbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmU8Pz4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5EaWFsb2dQYW5lPFQ+KGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSm9pbkNvbHVtbiBnZXRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gKEpvaW5Db2x1bW4pIHN1cGVyLmdldEpvaW5Db2x1bW4oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uRGlhbG9nUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uRGlhbG9nUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTZhZDMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkRpYWxvZ1BhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IHggSW5zZXJ0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgeCBOdWxsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCB4IFVuaXF1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IHggVXBkYXRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBKb2luQ29sdW1uU3RhdGVPYmplY3QKLSAqIEBzZWUgSm9pbkNvbHVtbkRpYWxvZyAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uRGlhbG9nUGFuZTxUIGV4dGVuZHMgSm9pbkNvbHVtblN0YXRlT2JqZWN0PiBleHRlbmRzIEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkRpYWxvZ1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKb2luQ29sdW1uRGlhbG9nUGFuZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRJbnNlcnRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEpvaW5Db2x1bW5TdGF0ZU9iamVjdC5JTlNFUlRBQkxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0SW5zZXJ0YWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEluc2VydGFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRJbnNlcnRhYmxlU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0SW5zZXJ0YWJsZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfaW5zZXJ0YWJsZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfaW5zZXJ0YWJsZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRJbnNlcnRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUpvaW5Db2x1bW5TdGF0ZU9iamVjdC5JTlNFUlRBQkxFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0SW5zZXJ0YWJsZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE51bGxhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUpvaW5Db2x1bW5TdGF0ZU9iamVjdC5OVUxMQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE51bGxhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0TnVsbGFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROdWxsYWJsZVN0cmluZ0hvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0TnVsbGFibGVIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfbnVsbGFibGVXaXRoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX251bGxhYmxlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdE51bGxhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUpvaW5Db2x1bW5TdGF0ZU9iamVjdC5OVUxMQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldE51bGxhYmxlKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVuaXF1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlKb2luQ29sdW1uU3RhdGVPYmplY3QuVU5JUVVFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VW5pcXVlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0VW5pcXVlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVW5pcXVlU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0VW5pcXVlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV91bmlxdWVXaXRoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX3VuaXF1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRVbmlxdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJSm9pbkNvbHVtblN0YXRlT2JqZWN0LlVOSVFVRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFVuaXF1ZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXBkYXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEpvaW5Db2x1bW5TdGF0ZU9iamVjdC5VUERBVEFCTEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRVcGRhdGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRVcGRhdGFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVcGRhdGFibGVTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRVcGRhdGFibGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX3VwZGF0YWJsZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdXBkYXRhYmxlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFVwZGF0YWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlKb2luQ29sdW1uU3RhdGVPYmplY3QuVVBEQVRBQkxFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0VXBkYXRhYmxlKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXN1cGVyLmluaXRpYWxpemVMYXlvdXQoY29udGFpbmVyKTsKLQotCQkvLyBJbnNlcnRhYmxlIHRyaS1zdGF0ZSBjaGVjayBib3gKLQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDQpLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfaW5zZXJ0YWJsZSwKLQkJCWJ1aWxkSW5zZXJ0YWJsZUhvbGRlcigpLAotCQkJYnVpbGRJbnNlcnRhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9JTlNFUlRBQkxFCi0JCSk7Ci0KLQkJLy8gVXBkYXRhYmxlIHRyaS1zdGF0ZSBjaGVjayBib3gKLQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdXBkYXRhYmxlLAotCQkJYnVpbGRVcGRhdGFibGVIb2xkZXIoKSwKLQkJCWJ1aWxkVXBkYXRhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9VUERBVEFCTEUKLQkJKTsKLQotCQkvLyBVbmlxdWUgdHJpLXN0YXRlIGNoZWNrIGJveAotCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfdW5pcXVlLAotCQkJYnVpbGRVbmlxdWVIb2xkZXIoKSwKLQkJCWJ1aWxkVW5pcXVlU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9VTklRVUUKLQkJKTsKLQotCQkvLyBOdWxsYWJsZSB0cmktc3RhdGUgY2hlY2sgYm94Ci0JCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9udWxsYWJsZSwKLQkJCWJ1aWxkTnVsbGFibGVIb2xkZXIoKSwKLQkJCWJ1aWxkTnVsbGFibGVTdHJpbmdIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX05VTExBQkxFCi0JCSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWJsZUVkaXRhYmxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MTBmY2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhpcyBkaWFsb2cgaXMgdXNlZCB0byBlaXRoZXIgY3JlYXRlIG9yIGVkaXQgYSBqb2luZyBjb2x1bW4gdGhhdCBpcyBsb2NhdGVkCi0gKiBvbiBhIHJlbGF0aW9uYWwgbWFwcGluZy4KLSAqCi0gKiBAc2VlIEpvaW5Db2x1bW4KLSAqIEBzZWUgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneQotICogQHNlZSBKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lTdGF0ZU9iamVjdAotICogQHNlZSBKb2luQ29sdW1uRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nIAotCWV4dGVuZHMgSm9pbkNvbHVtbkRpYWxvZzxKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lTdGF0ZU9iamVjdD4gCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEpvaW5Db2x1bW5EaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIHJlbGF0aW9uc2hpcE1hcHBpbmcgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIHRvCi0JICogY3JlYXRlCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcwotCSAqIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCUpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZygKLQkJU2hlbGwgcGFyZW50LAotCSAgICBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5Pd25lciwKLQkgICAgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIocGFyZW50LCBqb2luQ29sdW1uT3duZXIsIGpvaW5Db2x1bW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneVN0YXRlT2JqZWN0KAotCQkJZ2V0T3duZXIoKSwKLQkJCWdldEpvaW5Db2x1bW4oKQotCQkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGdldE93bmVyKCkgewotCQlyZXR1cm4gKEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5U3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5U3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNkNWM4MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneVN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci0KLS8qKgotICogVGhlIHN0YXRlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSBvciBlZGl0IGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gb24gYQotICogcmVsYXRpb25zaGlwIG1hcHBpbmcuCi0gKgotICogQHNlZSBKb2luQ29sdW1uCi0gKiBAc2VlIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kKLSAqIEBzZWUgSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lTdGF0ZU9iamVjdCAKLQlleHRlbmRzIEpvaW5Db2x1bW5TdGF0ZU9iamVjdAotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5U3RhdGVPYmplY3Q8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGpvaW5pbmdTdHJhdGVneSBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZQotCSAqIEBwYXJhbSBqb2luQ29sdW1uIFRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgaXMKLQkgKiB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKLQkgKi8KLQlwdWJsaWMgSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5U3RhdGVPYmplY3QoCi0JCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSwKLQkJICAgIEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlzdXBlcihqb2luaW5nU3RyYXRlZ3ksIGpvaW5Db2x1bW4pOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KSBzdXBlci5nZXRPd25lcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YWJsZXMoKSB7Ci0JCVNjaGVtYSBzY2hlbWEgPSBnZXREYlNjaGVtYSgpOwotCQlyZXR1cm4gc2NoZW1hID09IG51bGwgPyBzdXBlci50YWJsZXMoKSA6IENvbGxlY3Rpb25Ub29scy5saXN0KHNjaGVtYS5nZXRTb3J0ZWRUYWJsZUlkZW50aWZpZXJzKCkpLmxpc3RJdGVyYXRvcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU2NoZW1hIGdldERiU2NoZW1hKCkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IGdldFJlbGF0aW9uc2hpcFNvdXJjZSgpOwotCQlyZXR1cm4gdHlwZU1hcHBpbmcgPT0gbnVsbCA/IG51bGwgOiB0eXBlTWFwcGluZy5nZXREYlNjaGVtYSgpOwotCX0KLQotCXByb3RlY3RlZCBUeXBlTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBTb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldFJlbGF0aW9uc2hpcFNvdXJjZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBUYXJnZXQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGUoKSB7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpvaW5Db2x1bW4oKTsKLQotCQlpZiAoam9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKTsKLQkJfQotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IGdldFJlbGF0aW9uc2hpcFNvdXJjZSgpOwkJCi0JCXJldHVybiB0eXBlTWFwcGluZyA9PSBudWxsID8gbnVsbCA6IHR5cGVNYXBwaW5nLmdldFByaW1hcnlUYWJsZU5hbWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldE5hbWVUYWJsZSgpIHsKLQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSBnZXRSZWxhdGlvbnNoaXBTb3VyY2UoKTsKLQkJcmV0dXJuIHR5cGVNYXBwaW5nID09IG51bGwgPyBudWxsIDogdHlwZU1hcHBpbmcuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSB7Ci0JCVR5cGVNYXBwaW5nIHJlbGF0aW9uc2hpcFRhcmdldCA9IGdldFJlbGF0aW9uc2hpcFRhcmdldCgpOwotCQlyZXR1cm4gcmVsYXRpb25zaGlwVGFyZ2V0ID09IG51bGwgPyBudWxsIDogcmVsYXRpb25zaGlwVGFyZ2V0LmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyN2VhY2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVmZXJlbmNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRGlhbG9nUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhpcyBkaWFsb2cgaXMgdXNlZCB0byBlaXRoZXIgY3JlYXRlIG9yIGVkaXQgYSBqb2luIGNvbHVtbiB0aGF0IGlzIGxvY2F0ZWQKLSAqIG9uIGEgam9pbiB0YWJsZS4KLSAqCi0gKiBAc2VlIEpvaW5Db2x1bW4KLSAqIEBzZWUgSm9pblRhYmxlCi0gKiBAc2VlIEpvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlU3RhdGVPYmplY3QKLSAqIEBzZWUgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZURpYWxvZyBleHRlbmRzIEJhc2VKb2luQ29sdW1uRGlhbG9nPEpvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlU3RhdGVPYmplY3Q+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVEaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIGpvaW5UYWJsZSBUaGUgcGFyZW50IG9mIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIHRvIGNyZWF0ZQotCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VUYWJsZSByZWZlcmVuY2VUYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCi0JCXN1cGVyKHBhcmVudCwgcmVmZXJlbmNlVGFibGUsIGpvaW5Db2x1bW4pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEaWFsb2dQYW5lPEpvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlU3RhdGVPYmplY3Q+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uRGlhbG9nUGFuZTxKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZVN0YXRlT2JqZWN0PigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCWNvbnRhaW5lcgotCQkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWJsZUVkaXRhYmxlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlU3RhdGVPYmplY3QoCi0JCQlnZXRPd25lcigpLAotCQkJZ2V0Sm9pbkNvbHVtbigpCi0JCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIChKb2luQ29sdW1uKSBzdXBlci5nZXRKb2luQ29sdW1uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlZmVyZW5jZVRhYmxlIGdldE93bmVyKCkgewotCQlyZXR1cm4gKFJlZmVyZW5jZVRhYmxlKSBzdXBlci5nZXRPd25lcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVTdGF0ZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjEwMWE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVTdGF0ZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWZlcmVuY2VUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBUaGUgc3RhdGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIG9yIGVkaXQgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBvbiBhCi0gKiBqb2ludCB0YWJsZS4KLSAqCi0gKiBAc2VlIEpvaW5Db2x1bW4KLSAqIEBzZWUgSm9pblRhYmxlCi0gKiBAc2VlIEludmVyc2VKb2luQ29sdW1uRGlhbG9nCi0gKiBAc2VlIEludmVyc2VKb2luQ29sdW1uRGlhbG9nUGFuZQotICogQHNlZSBKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZURpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVTdGF0ZU9iamVjdCAKLQlleHRlbmRzIEpvaW5Db2x1bW5TdGF0ZU9iamVjdAotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Q8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGpvaW5UYWJsZSBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB0byBlZGl0Ci0JICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQKLQkgKi8KLQlwdWJsaWMgSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVTdGF0ZU9iamVjdCgKLQkJCVJlZmVyZW5jZVRhYmxlIHJlZmVyZW5jZVRhYmxlLAotCSAgICAgICAgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKHJlZmVyZW5jZVRhYmxlLCBqb2luQ29sdW1uKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlZmVyZW5jZVRhYmxlIGdldE93bmVyKCkgewotCQlyZXR1cm4gKFJlZmVyZW5jZVRhYmxlKSBzdXBlci5nZXRPd25lcigpOwotCX0KLQkKLQlwcml2YXRlIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0T3duaW5nVHlwZU1hcHBpbmcoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0TmFtZVRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXREYlRhYmxlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkgewotCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluaXRpYWxUYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhYmxlRWRpdGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFN0cmluZz4oZ2V0SW5pdGlhbFRhYmxlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMzNiN2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZTogIAotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IG8gSm9pbiBjb2x1bW5zIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZX0KLSAqIEBzZWUge0BsaW5rIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3l9Ci0gKiBAc2VlIHtAbGluayBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lfQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUKLQlleHRlbmRzIEFic3RyYWN0Sm9pbmluZ1N0cmF0ZWd5UGFuZQotCQk8Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGluY2x1ZGVPdmVycmlkZUNoZWNrQm94OwotCQotCQotCXB1YmxpYyBzdGF0aWMgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUgYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZVdpdGhJbmNsdWRlT3ZlcnJpZGVDaGVja0JveCgKLQkJUGFuZTw/IGV4dGVuZHMgSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U+IHBhcmVudFBhbmUsIAotCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUocGFyZW50UGFuZSwgcGFyZW50LCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZSBidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lV2l0aG91dEluY2x1ZGVPdmVycmlkZUNoZWNrQm94KAotCQlQYW5lPD8gZXh0ZW5kcyBKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gcGFyZW50UGFuZSwgCi0JCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZShwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZSBidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lV2l0aEluY2x1ZGVPdmVycmlkZUNoZWNrQm94KAotCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U+IHN1YmplY3RIb2xkZXIsCi0gICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZShwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lIGJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmVXaXRob3V0SW5jbHVkZU92ZXJyaWRlQ2hlY2tCb3goCi0JCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQkKLQkKLQlwcml2YXRlIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKAotCQkJUGFuZTw/IGV4dGVuZHMgSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U+IHBhcmVudFBhbmUsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIGJvb2xlYW4gaW5jbHVkZU92ZXJyaWRlQ2hlY2tCb3gpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQkJdGhpcy5pbmNsdWRlT3ZlcnJpZGVDaGVja0JveCA9IGluY2x1ZGVPdmVycmlkZUNoZWNrQm94OwotCQlpbml0aWFsaXplTGF5b3V0MihnZXRDb250cm9sKCkpOwotCX0KLQkKLQlwcml2YXRlIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJYm9vbGVhbiBpbmNsdWRlT3ZlcnJpZGVDaGVja0JveCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQkJdGhpcy5pbmNsdWRlT3ZlcnJpZGVDaGVja0JveCA9IGluY2x1ZGVPdmVycmlkZUNoZWNrQm94OwotCQlpbml0aWFsaXplTGF5b3V0MihnZXRDb250cm9sKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvL3NlZSBpbml0aWFsaXplTGF5b3V0MgotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUxheW91dChjb250YWluZXIpOyAKLQkJLy9qdXN0IGNhbGwgc3VwZXIsIHdlIGFyZSBkZWxheWluZyB0aGUgaW5pdGlhbGl6ZUxheW91dCBiZWNhdXNlIG9mIHRoZSBpbmNsdWRlT3ZlcnJpZGVDaGVja0JveCBib29sZWFuCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBidWlsZFN0cmF0ZWd5RGV0YWlsc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5PiBqb2luaW5nU3RyYXRlZ3lIb2xkZXIgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcigpOwotCi0JCWlmICh0aGlzLmluY2x1ZGVPdmVycmlkZUNoZWNrQm94KSB7Ci0JCQlyZXR1cm4gbmV3IEpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zV2l0aE92ZXJyaWRlT3B0aW9uQ29tcG9zaXRlKHRoaXMsIGpvaW5pbmdTdHJhdGVneUhvbGRlciwgcGFyZW50KS5nZXRDb250cm9sKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZSh0aGlzLCBqb2luaW5nU3RyYXRlZ3lIb2xkZXIsIHBhcmVudCkuZ2V0Q29udHJvbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNTdHJhdGVneUhvbGRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkVXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+IGJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIKLQkJCQk8Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+KAotCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5SG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIEJvb2xlYW4+KAotCQkJCXN1YmplY3RIb2xkZXIsIFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5QUkVET01JTkFOVF9KT0lOSU5HX1NUUkFURUdZX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyBCb29sZWFuLkZBTFNFIDoKLQkJCQkJQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSBCb29sZWFuLlRSVUUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKLQkJCQl9Ci0JCQkJLy92YWx1ZSA9PSBGQUxTRSAtIHNlbGVjdGlvbiBvZiBhbm90aGVyIHJhZGlvIGJ1dHRvbiBjYXVzZXMgdGhpcyBzdHJhdGVneSB0byBnZXQgdW5zZXQKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5TdGF0ZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkZGNlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5TdGF0ZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBUaGUgc3RhdGUgb2JqZWN0IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkpvaW5Db2x1bW48L2NvZGU+LgotICoKLSAqIEBzZWUgSm9pbkNvbHVtbgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKb2luQ29sdW1uU3RhdGVPYmplY3QgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0Ci17Ci0JcHJpdmF0ZSBCb29sZWFuIGluc2VydGFibGU7Ci0JcHJpdmF0ZSBCb29sZWFuIG51bGxhYmxlOwotCXByaXZhdGUgQm9vbGVhbiB1bmlxdWU7Ci0JcHJpdmF0ZSBCb29sZWFuIHVwZGF0YWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVEFCTEVfUFJPUEVSVFkgPSAiaW5zZXJ0YWJsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTEFCTEVfUFJPUEVSVFkgPSAibnVsbGFibGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSVFVRV9QUk9QRVJUWSA9ICJ1bmlxdWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFUQUJMRV9QUk9QRVJUWSA9ICJ1cGRhdGFibGUiOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uU3RhdGVPYmplY3Q8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIG93bmVyIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzIGxvY2F0ZWQKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBUaGUgam9pbiBjb2x1bW4gdG8gZWRpdAotCSAqLwotCXB1YmxpYyBKb2luQ29sdW1uU3RhdGVPYmplY3QoT2JqZWN0IG93bmVyLCBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJc3VwZXIob3duZXIsIGpvaW5Db2x1bW4pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdEluc2VydGFibGUoKSB7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0Sm9pbkNvbHVtbigpOwotCi0JCWlmIChqb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiBqb2luQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKTsKLQkJfQotCi0JCXJldHVybiBCYXNlQ29sdW1uLkRFRkFVTFRfSU5TRVJUQUJMRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROdWxsYWJsZSgpIHsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKb2luQ29sdW1uKCk7Ci0KLQkJaWYgKGpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIGpvaW5Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKTsKLQkJfQotCi0JCXJldHVybiBCYXNlQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VW5pcXVlKCkgewotCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpvaW5Db2x1bW4oKTsKLQotCQlpZiAoam9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKTsKLQkJfQotCi0JCXJldHVybiBCYXNlQ29sdW1uLkRFRkFVTFRfVU5JUVVFOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFVwZGF0YWJsZSgpIHsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKb2luQ29sdW1uKCk7Ci0KLQkJaWYgKGpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIGpvaW5Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCk7Ci0JCX0KLQotCQlyZXR1cm4gQmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5pbnNlcnRhYmxlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAoSm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldE51bGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5udWxsYWJsZTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRVbmlxdWUoKSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnVwZGF0YWJsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKE9iamVjdCBvd25lciwgQmFzZUpvaW5Db2x1bW4gYmFzZUpvaW5Db2x1bW4pIHsKLQotCQlzdXBlci5pbml0aWFsaXplKG93bmVyLCBiYXNlSm9pbkNvbHVtbik7Ci0KLQkJaWYgKGJhc2VKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uKSBiYXNlSm9pbkNvbHVtbjsKLQotCQkJdGhpcy5pbnNlcnRhYmxlICAgICAgID0gam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCk7Ci0JCQl0aGlzLm51bGxhYmxlICAgICAgICAgPSBqb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCk7Ci0JCQl0aGlzLnVuaXF1ZSAgICAgICAgICAgPSBqb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpOwotCQkJdGhpcy51cGRhdGFibGUgICAgICAgID0gam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5pdGlhbFRhYmxlKCkgewotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKb2luQ29sdW1uKCk7Ci0KLQkJaWYgKGpvaW5Db2x1bW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0YWJsZShCb29sZWFuIGluc2VydGFibGUpIHsKLQkJQm9vbGVhbiBvbGRJbnNlcnRhYmxlID0gdGhpcy5pbnNlcnRhYmxlOwotCQl0aGlzLmluc2VydGFibGUgPSBpbnNlcnRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElOU0VSVEFCTEVfUFJPUEVSVFksIG9sZEluc2VydGFibGUsIGluc2VydGFibGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE51bGxhYmxlKEJvb2xlYW4gbnVsbGFibGUpIHsKLQkJQm9vbGVhbiBvbGROdWxsYWJsZSA9IHRoaXMubnVsbGFibGU7Ci0JCXRoaXMubnVsbGFibGUgPSBudWxsYWJsZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOVUxMQUJMRV9QUk9QRVJUWSwgb2xkTnVsbGFibGUsIG51bGxhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiB1bmlxdWUpIHsKLQkJQm9vbGVhbiBvbGRVbmlxdWUgPSB0aGlzLnVuaXF1ZTsKLQkJdGhpcy51bmlxdWUgPSB1bmlxdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVU5JUVVFX1BST1BFUlRZLCBvbGRVbmlxdWUsIHVuaXF1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRhYmxlKEJvb2xlYW4gdXBkYXRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkVXBkYXRhYmxlID0gdGhpcy51cGRhdGFibGU7Ci0JCXRoaXMudXBkYXRhYmxlID0gdXBkYXRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFVQREFUQUJMRV9QUk9QRVJUWSwgb2xkVXBkYXRhYmxlLCB1cGRhdGFibGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YWJsZXMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZUpvaW5Db2x1bW4oQmFzZUpvaW5Db2x1bW4gYWJzdHJhY3RKb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIudXBkYXRlSm9pbkNvbHVtbihhYnN0cmFjdEpvaW5Db2x1bW4pOwotCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uKSBhYnN0cmFjdEpvaW5Db2x1bW47Ci0KLQkJLy8gVGFibGUKLQkJaWYgKGlzVGFibGVFZGl0YWJsZSgpKSB7Ci0JCQlTdHJpbmcgdGFibGUgPSBnZXRUYWJsZSgpOwotCi0JCQlpZiAodmFsdWVzQXJlRGlmZmVyZW50KHRhYmxlLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpKSB7Ci0JCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSh0YWJsZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBJbnNlcnRhYmxlCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSAhPSB0aGlzLmluc2VydGFibGUpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKHRoaXMuaW5zZXJ0YWJsZSk7Ci0JCX0KLQotCQkvLyBVcGRhdGFibGUKLQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkgIT0gdGhpcy51cGRhdGFibGUpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUodGhpcy51cGRhdGFibGUpOwotCQl9Ci0KLQkJLy8gVW5pcXVlCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpICE9IHRoaXMudW5pcXVlKXsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKHRoaXMudW5pcXVlKTsKLQkJfQotCi0JCS8vIE51bGxhYmxlCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkgIT0gdGhpcy5udWxsYWJsZSl7Ci0JCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKHRoaXMubnVsbGFibGUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlZjgzZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWJzdHJhY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIEpvaW5UYWJsZUNvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Db2x1bW5zQ29tcG9zaXRlPFQgZXh0ZW5kcyBKcGFOb2RlPiBleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBUaGUgZWRpdG9yIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tbW9uIGJlaGF2aW9ycyBkZWZpbmVkIGluIHRoZSBsaXN0IHBhbmUuCi0JICovCi0JcHJpdmF0ZSBKb2luQ29sdW1uc0VkaXRvcjxUPiBqb2luQ29sdW1uc0VkaXRvcjsKLQotCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8VD4gbGlzdFBhbmU7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqIEBwYXJhbSBqb2luQ29sdW1uc0VkaXRvciBUaGUgZWRpdG9yIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tbW9uIGJlaGF2aW9ycwotCSAqIGRlZmluZWQgaW4gdGhlIGxpc3QgcGFuZQotCSAqLwotCXB1YmxpYyBKb2luQ29sdW1uc0NvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luQ29sdW1uc0VkaXRvcjxUPiBqb2luQ29sdW1uc0VkaXRvcikgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JCXRoaXMuam9pbkNvbHVtbnNFZGl0b3IgPSBqb2luQ29sdW1uc0VkaXRvcjsKLQkJaW5pdGlhbGl6ZUxheW91dDIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5zQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udHJvbGxlciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICogQHBhcmFtIGpvaW5Db2x1bW5zRWRpdG9yIFRoZSBlZGl0b3IgdXNlZCB0byBwZXJmb3JtIHRoZSBjb21tb24gYmVoYXZpb3JzCi0JICogZGVmaW5lZCBpbiB0aGUgbGlzdCBwYW5lCi0JICovCi0JcHVibGljIEpvaW5Db2x1bW5zQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luQ29sdW1uc0VkaXRvcjxUPiBqb2luQ29sdW1uc0VkaXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKLQkJdGhpcy5qb2luQ29sdW1uc0VkaXRvciA9IGpvaW5Db2x1bW5zRWRpdG9yOwotCQlpbml0aWFsaXplTGF5b3V0MigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSm9pbkNvbHVtbnNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5Db2x1bW5zRWRpdG9yPFQ+IGpvaW5Db2x1bW5zRWRpdG9yKSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5qb2luQ29sdW1uc0VkaXRvciA9IGpvaW5Db2x1bW5zRWRpdG9yOwotCQlpbml0aWFsaXplTGF5b3V0MigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvL3NlZSBpbnRpYWlsaXplTGF5b3V0MigpCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVMYXlvdXQyKCkgewotCQl0aGlzLmxpc3RQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPFQ+KAotCQkJdGhpcywKLQkJCWdldENvbnRyb2woKSwKLQkJCWJ1aWxkSm9pbkNvbHVtbnNBZGFwdGVyKCksCi0JCQlidWlsZEpvaW5Db2x1bW5zTGlzdE1vZGVsKCksCi0JCQlidWlsZFNlbGVjdGVkSm9pbkNvbHVtbkhvbGRlcigpLAotCQkJYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fVEFCTEVfQ09MVU1OUywKLQkJCWZhbHNlCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZFNlbGVjdGVkSm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEpvaW5Db2x1bW5MYWJlbChKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlpZiAoam9pbkNvbHVtbi5pc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwpIHsKLQotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0JvdGhEZWZhdWx0LAotCQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCQkJKTsKLQkJCX0KLQotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQotCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtcywKLQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkSm9pbkNvbHVtbnNBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFic3RyYWN0QWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJSm9pbkNvbHVtbnNDb21wb3NpdGUudGhpcy5qb2luQ29sdW1uc0VkaXRvci5hZGRKb2luQ29sdW1uKGdldFN1YmplY3QoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaGFzT3B0aW9uYWxCdXR0b24oKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5zQ29tcG9zaXRlX2VkaXQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCQkJCUpvaW5Db2x1bW5zQ29tcG9zaXRlLnRoaXMuam9pbkNvbHVtbnNFZGl0b3IuZWRpdEpvaW5Db2x1bW4oZ2V0U3ViamVjdCgpLCBqb2luQ29sdW1uKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJSm9pbkNvbHVtbnNDb21wb3NpdGUudGhpcy5qb2luQ29sdW1uc0VkaXRvci5yZW1vdmVKb2luQ29sdW1ucyhnZXRTdWJqZWN0KCksIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZEluZGljZXMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZEpvaW5Db2x1bW5zTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKb2luQ29sdW1uPihidWlsZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpLAotCQkJTmFtZWRDb2x1bW4uU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksCi0JCQlOYW1lZENvbHVtbi5ERUZBVUxUX05BTUVfUFJPUEVSVFksCi0JCQlCYXNlSm9pbkNvbHVtbi5TUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwKLQkJCUJhc2VKb2luQ29sdW1uLkRFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJamF2YS51dGlsLkxpc3Q8TGlzdFZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+PigpOwotCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkxpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4sIEpvaW5Db2x1bW4+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4gYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VCwgSm9pbkNvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpLCB0aGlzLmpvaW5Db2x1bW5zRWRpdG9yLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdFByb3BlcnR5TmFtZSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gSm9pbkNvbHVtbnNDb21wb3NpdGUudGhpcy5qb2luQ29sdW1uc0VkaXRvci5zcGVjaWZpZWRKb2luQ29sdW1ucyh0aGlzLnN1YmplY3QpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIEpvaW5Db2x1bW5zQ29tcG9zaXRlLnRoaXMuam9pbkNvbHVtbnNFZGl0b3Iuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKHRoaXMuc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+IGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5MaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEpvaW5Db2x1bW4+KGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBKb2luQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCksIHRoaXMuam9pbkNvbHVtbnNFZGl0b3IuZ2V0RGVmYXVsdFByb3BlcnR5TmFtZSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKb2luQ29sdW1uIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBKb2luQ29sdW1uc0NvbXBvc2l0ZS50aGlzLmpvaW5Db2x1bW5zRWRpdG9yLmdldERlZmF1bHRKb2luQ29sdW1uKHRoaXMuc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbikgZWxlbWVudDsKLQotCQkJCXJldHVybiBidWlsZEpvaW5Db2x1bW5MYWJlbChqb2luQ29sdW1uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5zdGFsbEpvaW5Db2x1bW5zUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGpvaW5Db2x1bW5zUGFuZUVuYWJsZXJIb2xkZXIpIHsKLQkJbmV3IFBhbmVFbmFibGVyKGpvaW5Db2x1bW5zUGFuZUVuYWJsZXJIb2xkZXIsIHRoaXMubGlzdFBhbmUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMubGlzdFBhbmUuc2V0U2VsZWN0ZWRJdGVtKGpvaW5Db2x1bW4pOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgZWRpdG9yIGlzIHVzZWQgdG8gY29tcGxldGUgdGhlIGJlaGF2aW9yIG9mIHRoaXMgcGFuZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBKb2luQ29sdW1uc0VkaXRvcjxUPiB7Ci0KLQkJLyoqCi0JCSAqIEFkZCBhIGpvaW4gY29sdW1uIHRvIHRoZSBnaXZlbiBzdWJqZWN0IGFuZCByZXR1cm4gaXQKLQkJICovCi0JCXZvaWQgYWRkSm9pbkNvbHVtbihUIHN1YmplY3QpOwotCQkKLQkJLyoqCi0JCSAqIEVkaXQgdGhlIGdpdmVuIGpvaW4gY29sdW1uLCB0aGUgRWRpdCBidXR0b24gd2FzIHByZXNzZWQKLQkJICogd2hpbGUgdGhpcyBqb2luIGNvbHVtbiB3YXMgc2VsZWN0ZWQuCi0JCSAqLwotCQl2b2lkIGVkaXRKb2luQ29sdW1uKFQgc3ViamVjdCwgSm9pbkNvbHVtbiBqb2luQ29sdW1uKTsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3ViamVjdCBoYXMgc3BlY2lmaWVkIGpvaW4gY29sdW1ucwotCQkgKi8KLQkJYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucyhUIHN1YmplY3QpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc3BjaWZpZWQgam9pbiBjb2x1bW5zIGZyb20gdGhlIGdpdmVuIHN1YmplY3QKLQkJICovCi0JCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucyhUIHN1YmplY3QpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNwZWNpZmllZCBqb2luIGNvbHVtbnMgb24gdGhlIGdpdmVuIHN1YmplY3QKLQkJICovCi0JCWludCBzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoVCBzdWJqZWN0KTsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gZnJvbSB0aGUgZ2l2ZW4gc3ViamVjdCBvciBudWxsLgotCQkgKi8KLQkJSm9pbkNvbHVtbiBnZXREZWZhdWx0Sm9pbkNvbHVtbihUIHN1YmplY3QpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGpvaW4gY29sdW1ucyBsaXN0Ci0JCSAqLwotCQlTdHJpbmcgZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0UHJvcGVydHlOYW1lKCk7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW5zIGxpc3QKLQkJICovCi0JCVN0cmluZyBnZXREZWZhdWx0UHJvcGVydHlOYW1lKCk7Ci0JCQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMgYXQgdGhlIHNwZWNpZmllZCBpbmRpY2VzIGZyb20gdGhlIHN1YmplY3QKLQkJICovCi0JCXZvaWQgcmVtb3ZlSm9pbkNvbHVtbnMoVCBzdWJqZWN0LCBpbnRbXSBzZWxlY3RlZEluZGljZXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5UYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luVGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE1Y2Y3MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5UYWJsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpvaW5Db2x1bW5zQ29tcG9zaXRlLkpvaW5Db2x1bW5zRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNhdGFsb2dDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5UYWJsZUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUG9zdEV4ZWN1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVMaXN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIHwKLSAqIHwgICBOYW1lOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgICB8Ci0gKiB8ICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBKb2luIENvbHVtbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8IEpvaW5Db2x1bW5zQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIEludmVyc2UgSm9pbiBDb2x1bW5zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgeCBPdmVycmlkZSBEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgSm9pbkNvbHVtbnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgSm9pblRhYmxlfQotICogQHNlZSB7QGxpbmsgSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEpvaW5Db2x1bW5zQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luVGFibGVDb21wb3NpdGUgZXh0ZW5kcyBSZWZlcmVuY2VUYWJsZUNvbXBvc2l0ZTxKb2luVGFibGU+Ci17Ci0JcHJpdmF0ZSBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zQ2hlY2tCb3g7Ci0KLQlwcml2YXRlIEpvaW5Db2x1bW5zQ29tcG9zaXRlPEpvaW5UYWJsZT4gaW52ZXJzZUpvaW5Db2x1bW5zQ29tcG9zaXRlOwotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pblRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKb2luVGFibGVDb21wb3NpdGUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEpvaW5UYWJsZT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pblRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUpvaW5UYWJsZTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKb2luVGFibGVDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKb2luVGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhcmVudFZpcnR1YWwoSm9pblRhYmxlIGpvaW5UYWJsZSkgewotCQlyZXR1cm4gam9pblRhYmxlLmdldFBhcmVudCgpLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmlzUGFyZW50VmlydHVhbCgpOwotCX0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOwotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQlUYWJsZUNvbWJvPEpvaW5UYWJsZT4gdGFibGVDb21ibyA9IGFkZFRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQkJQ29tcG9zaXRlIHRhYmxlUGFuZSA9IGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbik7Ci0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQkJdGFibGVQYW5lLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX25hbWUsCi0JCQl0YWJsZUNvbWJvLmdldENvbnRyb2woKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9OQU1FCi0JCSk7Ci0JCQotCQkvLyBzY2hlbWEgd2lkZ2V0cwotCQlTY2hlbWFDb21ibzxKb2luVGFibGU+IHNjaGVtYUNvbWJvID0gYWRkU2NoZW1hQ29tYm8oY29udGFpbmVyKTsKLQotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJdGFibGVQYW5lLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX3NjaGVtYSwKLQkJCXNjaGVtYUNvbWJvLmdldENvbnRyb2woKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9TQ0hFTUEKLQkJKTsKLQkJCi0JCS8vIGNhdGFsb2cgd2lkZ2V0cwotCQlDYXRhbG9nQ29tYm88Sm9pblRhYmxlPiBjYXRhbG9nQ29tYm8gPSBhZGRDYXRhbG9nQ29tYm8oY29udGFpbmVyKTsKLQotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJdGFibGVQYW5lLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX2NhdGFsb2csCi0JCQljYXRhbG9nQ29tYm8uZ2V0Q29udHJvbCgpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX0NBVEFMT0cKLQkJKTsKLQotCQkvLyBKb2luIENvbHVtbnMgZ3JvdXAgcGFuZQotCQlHcm91cCBqb2luQ29sdW1uR3JvdXBQYW5lID0gYWRkVGl0bGVkR3JvdXAoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfam9pbkNvbHVtbgotCQkpOwotCi0JCS8vIE92ZXJyaWRlIERlZmF1bHQgSm9pbiBDb2x1bW5zIGNoZWNrIGJveAotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3ggPSBhZGRDaGVja0JveCgKLQkJCWFkZFN1YlBhbmUoam9pbkNvbHVtbkdyb3VwUGFuZSwgOCksCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnMsCi0JCQlidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSwKLQkJCW51bGwKLQkJKTsKLQotCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlID0gbmV3IEpvaW5Db2x1bW5zQ29tcG9zaXRlPEpvaW5UYWJsZT4oCi0JCQl0aGlzLAotCQkJam9pbkNvbHVtbkdyb3VwUGFuZSwKLQkJCWJ1aWxkSm9pbkNvbHVtbnNFZGl0b3IoKQotCQkpOwotCi0JCWluc3RhbGxKb2luQ29sdW1uc1BhbmVFbmFibGVyKHRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUpOwotCi0JCS8vIEludmVyc2UgSm9pbiBDb2x1bW5zIGdyb3VwIHBhbmUKLQkJR3JvdXAgaW52ZXJzZUpvaW5Db2x1bW5Hcm91cFBhbmUgPSBhZGRUaXRsZWRHcm91cCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9pbnZlcnNlSm9pbkNvbHVtbgotCQkpOwotCi0JCS8vIE92ZXJyaWRlIERlZmF1bHQgSW52ZXJzZSBKb2luIENvbHVtbnMgY2hlY2sgYm94Ci0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zQ2hlY2tCb3ggPSBhZGRDaGVja0JveCgKLQkJCWFkZFN1YlBhbmUoaW52ZXJzZUpvaW5Db2x1bW5Hcm91cFBhbmUsIDgpLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1ucywKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5Ib2xkZXIoKSwKLQkJCW51bGwKLQkJKTsKLQotCQl0aGlzLmludmVyc2VKb2luQ29sdW1uc0NvbXBvc2l0ZSA9IG5ldyBKb2luQ29sdW1uc0NvbXBvc2l0ZTxKb2luVGFibGU+KAotCQkJdGhpcywKLQkJCWludmVyc2VKb2luQ29sdW1uR3JvdXBQYW5lLAotCQkJYnVpbGRJbnZlcnNlSm9pbkNvbHVtbnNFZGl0b3IoKQotCQkpOwotCi0JCWluc3RhbGxJbnZlcnNlSm9pbkNvbHVtbnNQYW5lRW5hYmxlcih0aGlzLmludmVyc2VKb2luQ29sdW1uc0NvbXBvc2l0ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxJbnZlcnNlSm9pbkNvbHVtbnNQYW5lRW5hYmxlcihKb2luQ29sdW1uc0NvbXBvc2l0ZTxKb2luVGFibGU+IHBhbmUpIHsKLQkJcGFuZS5pbnN0YWxsSm9pbkNvbHVtbnNQYW5lRW5hYmxlcihuZXcgSW52ZXJzZUpvaW5Db2x1bW5QYW5lRW5hYmxlckhvbGRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSW52ZXJzZUpvaW5Db2x1bW4oSm9pblRhYmxlIGpvaW5UYWJsZSkgewotCi0JCUludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nKGdldFNoZWxsKCksIGpvaW5UYWJsZSwgbnVsbCk7Ci0KLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGRBZGRJbnZlcnNlSm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEludmVyc2VKb2luQ29sdW1uRnJvbURpYWxvZyhJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKLQotCQlKb2luVGFibGUgc3ViamVjdCA9IGdldFN1YmplY3QoKTsKLQkJaW50IGluZGV4ID0gc3ViamVjdC5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc3ViamVjdC5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbmRleCk7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JCXRoaXMuc2V0U2VsZWN0ZWRJbnZlcnNlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRJbnZlcnNlSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNDb21wb3NpdGUuc2V0U2VsZWN0ZWRKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCX0KLQotCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nPiBidWlsZEFkZEludmVyc2VKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJYWRkSW52ZXJzZUpvaW5Db2x1bW5Gcm9tRGlhbG9nKGRpYWxvZy5nZXRTdWJqZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248SW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZz4gYnVpbGRFZGl0SW52ZXJzZUpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248SW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZGlhbG9nKSB7Ci0JCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJCQllZGl0SW52ZXJzZUpvaW5Db2x1bW4oZGlhbG9nLmdldFN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCi0JcHJpdmF0ZSBJbnZlcnNlSm9pbkNvbHVtbnNQcm92aWRlciBidWlsZEludmVyc2VKb2luQ29sdW1uc0VkaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJbnZlcnNlSm9pbkNvbHVtbnNQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBPdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbkhvbGRlcigpOwotCX0KLQkKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+IGJ1aWxkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxKb2luVGFibGUsIEpvaW5Db2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSwgSm9pblRhYmxlLlNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgZWRpdEludmVyc2VKb2luQ29sdW1uKEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgewotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKHN0YXRlT2JqZWN0LmdldEpvaW5Db2x1bW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRJbnZlcnNlSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyhnZXRTaGVsbCgpLCBnZXRTdWJqZWN0KCksIGpvaW5Db2x1bW4pOwotCi0JCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkRWRpdEludmVyc2VKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlpZiAodGhpcy5pc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlKb2luVGFibGUgam9pblRhYmxlID0gdGhpcy5nZXRTdWJqZWN0KCk7Ci0JCWlmIChqb2luVGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlib29sZWFuIHNlbGVjdGVkID0gdGhpcy5vdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnNDaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLQkJdGhpcy5zZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCXRyeSB7Ci0JCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCQlqb2luVGFibGUuY29udmVydERlZmF1bHRUb1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCk7Ci0JCQkJc2V0U2VsZWN0ZWRJbnZlcnNlSm9pbkNvbHVtbihqb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJam9pblRhYmxlLmNsZWFyU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQl0aGlzLnNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0KLQotCXByaXZhdGUgY2xhc3MgSW52ZXJzZUpvaW5Db2x1bW5zUHJvdmlkZXIgaW1wbGVtZW50cyBKb2luQ29sdW1uc0VkaXRvcjxKb2luVGFibGU+IHsKLQotCQlwdWJsaWMgdm9pZCBhZGRKb2luQ29sdW1uKEpvaW5UYWJsZSBzdWJqZWN0KSB7Ci0JCQlKb2luVGFibGVDb21wb3NpdGUudGhpcy5hZGRJbnZlcnNlSm9pbkNvbHVtbihzdWJqZWN0KTsKLQkJfQotCi0JCXB1YmxpYyBKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKEpvaW5UYWJsZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFByb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBKb2luVGFibGUuREVGQVVMVF9JTlZFUlNFX0pPSU5fQ09MVU1OOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWRpdEpvaW5Db2x1bW4oSm9pblRhYmxlIHN1YmplY3QsIEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuZWRpdEludmVyc2VKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoSm9pblRhYmxlIHN1YmplY3QpIHsKLQkJCXJldHVybiBzdWJqZWN0Lmhhc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlSm9pbkNvbHVtbnMoSm9pblRhYmxlIHN1YmplY3QsIGludFtdIHNlbGVjdGVkSW5kaWNlcykgewotCQkJZm9yIChpbnQgaW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJCXN1YmplY3QucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oc2VsZWN0ZWRJbmRpY2VzW2luZGV4XSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKEpvaW5UYWJsZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKEpvaW5UYWJsZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdFByb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBKb2luVGFibGUuU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBPdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbkhvbGRlciBleHRlbmRzIExpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEJvb2xlYW4+Ci0JICAgIGltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gewotCQotCQlwdWJsaWMgT3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCQlzdXBlcihidWlsZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMubGlzdEhvbGRlci5zaXplKCkgPiAwKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQl1cGRhdGVJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJfQotCX0KLQotCQotCXByaXZhdGUgY2xhc3MgSW52ZXJzZUpvaW5Db2x1bW5QYW5lRW5hYmxlckhvbGRlciAKLQkJZXh0ZW5kcyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Sm9pblRhYmxlLCBCb29sZWFuPgotCXsKLQkJcHJpdmF0ZSBTdGF0ZUNoYW5nZUxpc3RlbmVyIHN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0JCQotCQkKLQkJcHVibGljIEludmVyc2VKb2luQ29sdW1uUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCQlzdXBlcigKLQkJCQluZXcgVmFsdWVMaXN0QWRhcHRlcjxKb2luVGFibGU+KAotCQkJCQluZXcgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwgCi0JCQkJCUpvaW5UYWJsZS5TUEVDSUZJRURfSU5WRVJTRV9KT0lOX0NPTFVNTlNfTElTVCkpOwotCQkJdGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyID0gYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCX0KLQkJCi0JCQotCQlwcml2YXRlIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCXZhbHVlU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgdmFsdWVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jYWNoZWRWYWx1ZTsKLQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRyYW5zZm9ybU5ldyh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShKb2luVGFibGUgdmFsdWUpIHsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLnRyYW5zZm9ybSh2YWx1ZSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKEpvaW5UYWJsZSB2YWx1ZSkgewotCQkJYm9vbGVhbiB2aXJ0dWFsID0gSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuaXNQYXJlbnRWaXJ0dWFsKHZhbHVlKTsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoISB2aXJ0dWFsICYmIHZhbHVlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSA+IDApOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkJdGhpcy52YWx1ZUhvbGRlci5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIpOwotCQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmE3NDdkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6ICAKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCBvIEpvaW4gdGFibGUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgIEpvaW5UYWJsZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZX0KLSAqIEBzZWUge0BsaW5rIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneX0KLSAqIEBzZWUge0BsaW5rIE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUKLQlleHRlbmRzIEFic3RyYWN0Sm9pbmluZ1N0cmF0ZWd5UGFuZQotCQk8Sm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5PgotewotCXB1YmxpYyBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lKAotCQkJUGFuZTw/IGV4dGVuZHMgSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gcGFyZW50UGFuZSwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHVibGljIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U+IHN1YmplY3RIb2xkZXIsCi0gICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgYnVpbGRTdHJhdGVneURldGFpbHNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEpvaW5UYWJsZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5UYWJsZUhvbGRlcigpLCBwYXJlbnQpLmdldENvbnRyb2woKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVc2VzU3RyYXRlZ3lIb2xkZXIoKSB7Ci0JCXJldHVybiBidWlsZFVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneT4gYnVpbGRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyCi0JCQkJPEpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneT4oCi0JCQkJCWdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxKb2luVGFibGU+IGJ1aWxkSm9pblRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKb2luVGFibGVKb2luaW5nU3RyYXRlZ3ksIEpvaW5UYWJsZT4oCi0JCQkJdGhpcy5idWlsZEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneUhvbGRlcigpLCBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kuSk9JTl9UQUJMRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSm9pblRhYmxlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Sm9pblRhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIEJvb2xlYW4+KAotCQkJc3ViamVjdEhvbGRlciwgUmVsYXRpb25zaGlwUmVmZXJlbmNlLlBSRURPTUlOQU5UX0pPSU5JTkdfU1RSQVRFR1lfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEJvb2xlYW4uRkFMU0UgOgotCQkJCQlCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LnVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gQm9vbGVhbi5UUlVFKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKLQkJCQl9Ci0JCQkJLy92YWx1ZSA9PSBGQUxTRSAtIHNlbGVjdGlvbiBvZiBhbm90aGVyIHJhZGlvIGJ1dHRvbiBjYXVzZXMgdGhpcyBzdHJhdGVneSB0byBnZXQgdW5zZXQKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NTExOTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpvaW5Db2x1bW5zQ29tcG9zaXRlLkpvaW5Db2x1bW5zRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUG9zdEV4ZWN1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVMaXN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgSm9pbkNvbHVtbnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlCi0gKiBAc2VlIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kKLSAqIEBzZWUgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUKLSAqIEBzZWUgSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nCi0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZSAKLQlleHRlbmRzIFBhbmU8Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneT4KLXsKLQkKLQlwcml2YXRlIEpvaW5Db2x1bW5zQ29tcG9zaXRlPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+IGpvaW5Db2x1bW5zQ29tcG9zaXRlOwotCQotCXB1YmxpYyBKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CQkKLQkJdGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZSA9IG5ldyBKb2luQ29sdW1uc0NvbXBvc2l0ZTxKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5Pih0aGlzLCBjb250YWluZXIsIGJ1aWxkSm9pbkNvbHVtbnNQcm92aWRlcigpKTsKLQkJdGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZS5pbnN0YWxsSm9pbkNvbHVtbnNQYW5lRW5hYmxlcihuZXcgSm9pbkNvbHVtblBhbmVFbmFibGVySG9sZGVyKCkpOwotCX0KLQkKLQlwcml2YXRlIEpvaW5Db2x1bW5zRWRpdG9yPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+IGJ1aWxkSm9pbkNvbHVtbnNQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uc0VkaXRvcjxKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5PigpIHsKLQotCQkJcHVibGljIHZvaWQgYWRkSm9pbkNvbHVtbihKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IHN1YmplY3QpIHsKLQkJCQlKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZS50aGlzLmFkZEpvaW5Db2x1bW4oc3ViamVjdCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgc3ViamVjdCkgewotCQkJCXJldHVybiBzdWJqZWN0Lmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGVkaXRKb2luQ29sdW1uKEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgc3ViamVjdCwgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQkJSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNDb21wb3NpdGUudGhpcy5lZGl0Sm9pbkNvbHVtbihzdWJqZWN0LCBqb2luQ29sdW1uKTsKLQkJCX0KLQotCQkJcHVibGljIEpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBzdWJqZWN0KSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0UHJvcGVydHlOYW1lKCkgewotCQkJCXJldHVybiBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LkRFRkFVTFRfSk9JTl9DT0xVTU5fUFJPUEVSVFk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0UHJvcGVydHlOYW1lKCkgewotCQkJCXJldHVybiBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlSm9pbkNvbHVtbnMoSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBzdWJqZWN0LCBpbnRbXSBzZWxlY3RlZEluZGljZXMpIHsKLQkJCQlmb3IgKGludCBpbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQkJCXN1YmplY3QucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihzZWxlY3RlZEluZGljZXNbaW5kZXhdKTsKLQkJCQl9CQkJCQotCQkJfQotCi0JCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgc3ViamVjdCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgc3ViamVjdCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkSm9pbkNvbHVtbihKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSkgewotCQlKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lEaWFsb2coZ2V0U2hlbGwoKSwgam9pbmluZ1N0cmF0ZWd5LCBudWxsKTsKLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGRBZGRKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZz4gYnVpbGRBZGRKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZyBkaWFsb2cpIHsKLQkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQkJCWFkZEpvaW5Db2x1bW4oZGlhbG9nLmdldFN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkSm9pbkNvbHVtbihKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lTdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgewotCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IHN1YmplY3QgPSBnZXRTdWJqZWN0KCk7Ci0JCWludCBpbmRleCA9IHN1YmplY3Quc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBzdWJqZWN0LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW5kZXgpOwotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQl0aGlzLnNldFNlbGVjdGVkSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUuc2V0U2VsZWN0ZWRKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZWRpdEpvaW5Db2x1bW4oSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3ksIEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lEaWFsb2coZ2V0U2hlbGwoKSwgam9pbmluZ1N0cmF0ZWd5LCBqb2luQ29sdW1uKTsKLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGRFZGl0Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSk7Ci0JfQotCQotCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lEaWFsb2c+IGJ1aWxkRWRpdEpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248Sm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJdXBkYXRlSm9pbkNvbHVtbihkaWFsb2cuZ2V0U3ViamVjdCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVKb2luQ29sdW1uKEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneVN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oc3RhdGVPYmplY3QuZ2V0Sm9pbkNvbHVtbigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LCBCb29sZWFuPiBidWlsZEpvaW5Db2x1bW5zUGFuZUVuYWJsZWRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3ksIEJvb2xlYW4+KAotCQkJbmV3IFZhbHVlTGlzdEFkYXB0ZXI8Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneT4oCi0JCQkJbmV3IFJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+KGdldFN1YmplY3RIb2xkZXIoKSksIAotCQkJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci50cmFuc2Zvcm0odmFsdWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSB2YWx1ZSkgewotCQkJCWJvb2xlYW4gdmlydHVhbCA9IHZhbHVlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCk7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZighIHZpcnR1YWwgJiYgdmFsdWUuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgPiAwKTsKLQkJCX0KLQkJfTsKLQotCX0KLQkKLQkKLQlwcml2YXRlIGNsYXNzIEpvaW5Db2x1bW5QYW5lRW5hYmxlckhvbGRlciAKLQkJZXh0ZW5kcyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSwgQm9vbGVhbj4KLQl7Ci0JCXByaXZhdGUgU3RhdGVDaGFuZ2VMaXN0ZW5lciBzdGF0ZUNoYW5nZUxpc3RlbmVyOwotCQkKLQkJCi0JCXB1YmxpYyBKb2luQ29sdW1uUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCQlzdXBlcigKLQkJCQluZXcgVmFsdWVMaXN0QWRhcHRlcjxKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5PigKLQkJCQkJbmV3IFJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+KGdldFN1YmplY3RIb2xkZXIoKSksIAotCQkJCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCkpOwotCQkJdGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyID0gYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCX0KLQkJCi0JCQotCQlwcml2YXRlIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCXZhbHVlU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgdmFsdWVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jYWNoZWRWYWx1ZTsKLQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRyYW5zZm9ybU5ldyh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IHZhbHVlKSB7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLnRyYW5zZm9ybSh2YWx1ZSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgdmFsdWUpIHsKLQkJCWJvb2xlYW4gdmlydHVhbCA9IHZhbHVlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmlzUGFyZW50VmlydHVhbCgpOwotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZighIHZpcnR1YWwgJiYgdmFsdWUuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgPiAwKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJCXRoaXMudmFsdWVIb2xkZXIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyKTsKLQkJCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zV2l0aE92ZXJyaWRlT3B0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zV2l0aE92ZXJyaWRlT3B0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNzc1ZmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc1dpdGhPdmVycmlkZU9wdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZQotICogQHNlZSBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5Ci0gKiBAc2VlIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lCi0gKiBAc2VlIEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNXaXRoT3ZlcnJpZGVPcHRpb25Db21wb3NpdGUgCi0JZXh0ZW5kcyBQYW5lPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+Ci17Ci0JCi0JcHJpdmF0ZSBKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZSBqb2luaW5nU3RyYXRlZ3lDb21wb3NpdGU7Ci0JCi0JcHVibGljIEpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zV2l0aE92ZXJyaWRlT3B0aW9uQ29tcG9zaXRlKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBKb2luIENvbHVtbnMgY2hlY2sgYm94Ci0JCWFkZENoZWNrQm94KAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDgpLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnMsCi0JCQlidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSwKLQkJCW51bGwKLQkJKTsKLQkJCi0JCXRoaXMuam9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlID0gbmV3IEpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQl0aGlzLmpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZS5zZXRTZWxlY3RlZEpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpOwotCX0KLQkKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+IGJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3ksIEpvaW5Db2x1bW4+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlciAKLQkJZXh0ZW5kcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPgotCQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IAotCXsKLQkJcHVibGljIE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCQlzdXBlcihidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMubGlzdEhvbGRlci5zaXplKCkgPiAwKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQkJdXBkYXRlSm9pbkNvbHVtbnModmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgdXBkYXRlSm9pbkNvbHVtbnMoYm9vbGVhbiBzZWxlY3RlZCkgewotCQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCQkJCi0JCQl0cnkgewotCQkJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgc3ViamVjdCA9IGdldFN1YmplY3QoKTsKLQkKLQkJCQkvLyBBZGQgYSBqb2luIGNvbHVtbiBieSBjcmVhdGluZyBhIHNwZWNpZmllZCBvbmUgdXNpbmcgdGhlIGRlZmF1bHQKLQkJCQkvLyBvbmUgaWYgaXQgZXhpc3RzCi0JCQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQkJCUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBzdWJqZWN0LmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ly9UT0RPIGNvdWxkIGJlIG51bGwsIGRpc2FibGUgb3ZlcnJpZGUgZGVmYXVsdCBjaGVjayBib3g/Ci0JCQkJCQotCQkJCQlpZiAoZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQkJCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCQkJCQkKLQkJCQkJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHN1YmplY3QuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShjb2x1bW5OYW1lKTsKLQkJCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQkJCQkJCi0JCQkJCQlKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc1dpdGhPdmVycmlkZU9wdGlvbkNvbXBvc2l0ZS50aGlzLnNldFNlbGVjdGVkSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBSZW1vdmUgYWxsIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW5zCi0JCQkJZWxzZSB7Ci0JCQkJCWZvciAoaW50IGluZGV4ID0gc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQkJCXN1YmplY3QucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbmRleCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSnB0VWlEZXRhaWxzTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSnB0VWlEZXRhaWxzTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmMzU3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pwdFVpRGV0YWlsc01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBtYXBwaW5nIHBhbmVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnB0VWlEZXRhaWxzTWVzc2FnZXMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWNjZXNzVHlwZUNvbWJvX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUXVlcnlEaWFsb2dfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRRdWVyeURpYWxvZ19xdWVyeVR5cGU7Ci0gCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFF1ZXJ5RGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFF1ZXJ5RGlhbG9nX2Rlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUXVlcnlEaWFsb2dfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUXVlcnlEaWFsb2dfbmFtZWRRdWVyeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRRdWVyeURpYWxvZ19uYW1lZE5hdGl2ZVF1ZXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJ5U3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWVyeVN0YXRlT2JqZWN0X3R5cGVNdXN0QmVTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmFtZWRRdWVyeUNvbXBvc2l0ZV9uYW1lVGV4dExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZU92ZXJyaWRlc0dyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGVPdmVycmlkZXNTZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE92ZXJyaWRlc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNTZWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtYmVkZGFibGVTZWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtYmVkZGVkU2VjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbWJlZGRlZElkU2VjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlTZWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkU2VjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW55VG9NYW55U2VjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW55VG9PbmVTZWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBlZFN1cGVyY2xhc3NTZWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9uZVRvTWFueVNlY3Rpb25fdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT25lVG9PbmVTZWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZlcnNpb25TZWN0aW9uX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljR2VuZXJhbFNlY3Rpb25fZW51bWVyYXRlZExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljR2VuZXJhbFNlY3Rpb25fZmV0Y2hMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX2xvYkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljR2VuZXJhbFNlY3Rpb25fbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljR2VuZXJhbFNlY3Rpb25fb3B0aW9uYWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX29wdGlvbmFsTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljR2VuZXJhbFNlY3Rpb25fdGVtcG9yYWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUeXBlU2VjdGlvbl90eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFR5cGVTZWN0aW9uX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZVNlY3Rpb25fbG9iOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFR5cGVTZWN0aW9uX3RlbXBvcmFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFR5cGVTZWN0aW9uX2VudW1lcmF0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm9vbGVhbl9GYWxzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX1RydWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FzY2FkZUNvbXBvc2l0ZV9hbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FzY2FkZUNvbXBvc2l0ZV9jYXNjYWRlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FzY2FkZUNvbXBvc2l0ZV9tZXJnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXNjYWRlQ29tcG9zaXRlX3BlcnNpc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FzY2FkZUNvbXBvc2l0ZV9yZWZyZXNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhc2NhZGVDb21wb3NpdGVfcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dDaG9vc2VyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9jb2x1bW5EZWZpbml0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9jb2x1bW5TZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9kZXRhaWxzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9pbnNlcnRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9pbnNlcnRhYmxlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2xlbmd0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfbnVsbGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX251bGxhYmxlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX3ByZWNpc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfc2NhbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX3RhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV91bmlxdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZVdpdGhEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV91cGRhdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZVdpdGhEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3ZpZGVyRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2NoYXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9pbnRlZ2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfc3RyaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUNvbXBvc2l0ZV9pbmhlcml0YW5jZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlDb21wb3NpdGVfcXVlcmllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlDb21wb3NpdGVfdGFibGVEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUNvbXBvc2l0ZV90YWJsZU5vRGVmYXVsdFNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlHZW5lcmFsU2VjdGlvbl9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU5hbWVDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnVtVHlwZUNvbXBvc2l0ZV9vcmRpbmFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudW1UeXBlQ29tcG9zaXRlX3N0cmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZXRjaFR5cGVDb21wb3NpdGVfZWFnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmV0Y2hUeXBlQ29tcG9zaXRlX2xhenk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfYXV0bzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9nZW5lcmF0ZWRWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9nZW5lcmF0b3JOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2lkZW50aXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX3NlcXVlbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX3N0cmF0ZWd5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX3RhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRvckNvbXBvc2l0ZV9hbGxvY2F0aW9uU2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0b3JDb21wb3NpdGVfaW5pdGlhbFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRvcnNDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0b3JzQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0b3JzQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yQ2hlY2tCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdG9yc0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvclNlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSWRDbGFzc0NvbXBvc2l0ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJZE1hcHBpbmdDb21wb3NpdGVfcGtfZ2VuZXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJZE1hcHBpbmdDb21wb3NpdGVfcHJpbWFyeUtleUdlbmVyYXRpb25DaGVja0JveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJZE1hcHBpbmdDb21wb3NpdGVfcHJpbWFyeUtleUdlbmVyYXRpb25TZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvclNlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yQ2hlY2tCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmhlcml0YW5jZUNvbXBvc2l0ZV9kZXRhaWxzR3JvdXBCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvckNvbHVtbkdyb3VwQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluaGVyaXRhbmNlQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX2pvaW5lZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX3NpbmdsZV90YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmhlcml0YW5jZUNvbXBvc2l0ZV9zdHJhdGVneTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX3RhYmxlX3Blcl9jbGFzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZlcnNlSm9pbkNvbHVtbkRpYWxvZ19lZGl0SW52ZXJzZUpvaW5Db2x1bW5UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luaW5nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5pbmdfbWFwcGVkQnlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luaW5nX21hcHBlZEJ5QXR0cmlidXRlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbmluZ19qb2luQ29sdW1uSm9pbmluZ0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5pbmdfcHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbmluZ19qb2luVGFibGVKb2luaW5nTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbnNDb21wb3NpdGVfZWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0JvdGhEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0ZpcnN0RGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uRGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX2FkZEpvaW5Db2x1bW5UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfZWRpdEpvaW5Db2x1bW5EZXNjcmlwdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfZWRpdEpvaW5Db2x1bW5UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19yZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV9jb2x1bW5EZWZpbml0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dQYW5lX2luc2VydGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfaW5zZXJ0YWJsZVdpdGhEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dQYW5lX251bGxhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dQYW5lX251bGxhYmxlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdW5pcXVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dQYW5lX3VuaXF1ZVdpdGhEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dQYW5lX3VwZGF0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV91cGRhdGFibGVXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfaW52ZXJzZUpvaW5Db2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX2pvaW5Db2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX3NjaGVtYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfY2F0YWxvZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZlcnNpb25NYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9jaGFuZ2VNYXBwaW5nVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2RpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2xhYmVsVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9tYXBwZWRBdHRyaWJ1dGVUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX21hcHBlZFR5cGVUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX3VubWFwcGVkQXR0cmlidXRlVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV91bm1hcHBlZFR5cGVUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX3ZpcnR1YWxBdHRyaWJ1dGVUZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtYmVkZGFibGVVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eVVpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGVkU3VwZXJjbGFzc1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW1iZWRkYWJsZVVpUHJvdmlkZXJfbGlua0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eVVpUHJvdmlkZXJfbGlua0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE51bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0YURhdGFDb21wbGV0ZUNvbWJvX0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2Nhc2NhZGVUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9mZXRjaFR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2dlbmVyYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2pvaW5UYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfbWFwcGVkQnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX3RhcmdldEVudGl0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5SGludHNHcm91cEJveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcmVzdWx0Q2xhc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeUhpbnRzR3JvdXBCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3TmFtZVN0YXRlT2JqZWN0X25hbWVBbHJlYWR5RXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld05hbWVTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vTmFtZVNldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb25lU2VsZWN0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wdGlvbmFsQ29tcG9zaXRlX2ZhbHNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wdGlvbmFsQ29tcG9zaXRlX3RydWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JkZXJpbmdDb21wb3NpdGVfY3VzdG9tOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yZGVyaW5nQ29tcG9zaXRlX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JkZXJpbmdDb21wb3NpdGVfb3JkZXJpbmdHcm91cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlcmluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9kZWZpbmVJblhtbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdmVycmlkZXNDb21wb3NpdGVfYXNzb2NpYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBc3NvY2lhdGlvbk92ZXJyaWRlc0NvbXBvc2l0ZV9qb2luQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE92ZXJyaWRlc0NvbXBvc2l0ZV9ub05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfYWRkRGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19hZGRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19lZGl0RGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19lZGl0VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZERlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0RGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9lZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0ZpcnN0RGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX3ByaW1hcnlLZXlKb2luQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJpZXNDb21wb3NpdGVfZGlzcGxheVN0cmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWVyeUhpbnRzQ29tcG9zaXRlX25hbWVDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcnlIaW50c0NvbXBvc2l0ZV92YWx1ZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFDaG9vc2VyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZFNlY29uZGFyeVRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX2NhdGFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdENhdGFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdFNjaGVtYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0U2Vjb25kYXJ5VGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVEaWFsb2dfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19zY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX2VkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX3NlY29uZGFyeVRhYmxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9jYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9zY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVDaG9vc2VyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlQ29tcG9zaXRlX3RhYmxlU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9jYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtblZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3NjaGVtYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV90YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV90YWJsZUdlbmVyYXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV92YWx1ZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRFbnRpdHlDaG9vc2VyX2Jyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRFbnRpdHlDaG9vc2VyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldEVudGl0eUNob29zZXJfc2VsZWN0VHlwZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZV9kYXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZV90aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZV90aW1lc3RhbXA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X3VpX2RldGFpbHMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0VWlEZXRhaWxzTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIEpwdFVpRGV0YWlsc01lc3NhZ2VzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg5NjYzMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOiAgCi0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLSBKb2luaW5nIFN0cmF0ZWd5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG8gTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCBvIEpvaW5UYWJsZVN0cmF0ZWd5UGFuZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55TWFwcGluZ30KLSAqIEBzZWUge0BsaW5rIE1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2V9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE1hcHBlZEJ5U3RyYXRlZ3lQYW5lfQotICogQHNlZSB7QGxpbmsgSm9pblRhYmxlU3RyYXRlZ3lQYW5lfQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUgCi0JZXh0ZW5kcyBQYW5lPE1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U+Ci17Ci0JcHVibGljIE1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ190aXRsZSwKLQkJCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkpOwotCQkKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb21wb3NpdGUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX21hcHBlZEJ5TGFiZWwsCi0JCQlNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCW5ldyBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19qb2luVGFibGVKb2luaW5nTGFiZWwsCi0JCQlKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lLmJ1aWxkVXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpLAotCQkJbnVsbCk7Ci0KLQkJbmV3IEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCWFkZFN1YlBhbmUoY29tcG9zaXRlLCA1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVc2VzTWFwcGVkQnlTdHJhdGVneUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgQm9vbGVhbj4oCi0JCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5QUkVET01JTkFOVF9KT0lOSU5HX1NUUkFURUdZX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyBCb29sZWFuLkZBTFNFIDoKLQkJCQkJQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gQm9vbGVhbi5UUlVFKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpOwotCQkJCX0KLQkJCQkvL3ZhbHVlID09IEZBTFNFIC0gc2VsZWN0aW9uIG9mIGFub3RoZXIgcmFkaW8gYnV0dG9uIGNhdXNlcyB0aGlzIHN0cmF0ZWd5IHRvIGdldCB1bnNldAotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNKb2luVGFibGVTdHJhdGVneUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Sm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgQm9vbGVhbj4oCi0JCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5QUkVET01JTkFOVF9KT0lOSU5HX1NUUkFURUdZX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyBCb29sZWFuLkZBTFNFIDoKLQkJCQkJQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlID09IEJvb2xlYW4uVFJVRSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7Ci0JCQkJfQotCQkJCS8vdmFsdWUgPT0gRkFMU0UgLSBzZWxlY3Rpb24gb2YgYW5vdGhlciByYWRpbyBidXR0b24gY2F1c2VzIHRoaXMgc3RyYXRlZ3kgdG8gZ2V0IHVuc2V0Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGQ0ZWRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgTWFueVRvTWFueU1hcHBpbmd9Ci0gKiBAc2VlIHtAbGluayBUYXJnZXRFbnRpdHlDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIENhc2NhZGVDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBPcmRlcmluZ0NvbXBvc2l0ZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlIAotCWV4dGVuZHMgQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxNYW55VG9NYW55TWFwcGluZywgTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb01hbnlNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb01hbnlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhMDE0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOiAgCi0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLSBKb2luaW5nIFN0cmF0ZWd5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG8gSm9pbkNvbHVtblN0cmF0ZWd5UGFuZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUge0BsaW5rIE1hbnlUb09uZU1hcHBpbmd9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2V9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgSm9pbkNvbHVtblN0cmF0ZWd5UGFuZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUgZXh0ZW5kcyBQYW5lPE1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4KLXsKLQlwdWJsaWMgTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ190aXRsZSwKLQkJCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkpOwotCQkKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb21wb3NpdGUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX2pvaW5Db2x1bW5Kb2luaW5nTGFiZWwsCi0JCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZS5idWlsZFVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSksCi0JCQludWxsKTsKLQotCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZS4KLQkJCWJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmVXaXRoSW5jbHVkZU92ZXJyaWRlQ2hlY2tCb3godGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCWFkZFN1YlBhbmUoY29tcG9zaXRlLCA1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGNmY2I5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgTWFueVRvT25lTWFwcGluZ30KLSAqIEBzZWUge0BsaW5rIFRhcmdldEVudGl0eUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBGZXRjaFR5cGVDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBPcHRpb25hbENvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIENhc2NhZGVDb21wb3NpdGV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlIAotCWV4dGVuZHMgQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlPE1hbnlUb09uZU1hcHBpbmcsIE1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFwQXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFwQXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhODNlYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hcEFzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkRlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtVWlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUG9zdEV4ZWN1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkZpbHRlcmVkSXRlbXNTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBUaGlzIG1hcCBhcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIGEgc3R5bGVkIHRleHQgd2hlcmUgdGhlIG5hbWUgb2YgdGhlCi0gKiBtYXBwaW5nIGFuZCBpdHMgdHlwZSBhcmUgZGlzcGxheWVkLiBUaGUgbWFwcGluZyB0eXBlIGNhbiBiZSBjbGlja2VkIG9uIHRvCi0gKiBpbnZva2UgYSBkaWFsb2cgaW4gb3JkZXIgdG8gY2hhbmdlIHRoZSB0eXBlLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBBdHRyaWJ1dGUgJ25hbWUnIGlzIG1hcHBlZCBhcyBvbmUgdG8gb25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgwq/Cr8Kvwq/Cr8Kvwq/Cr8Kvwq8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFwQXNDb21wb3NpdGU8VCBleHRlbmRzIEpwYU5vZGU+IGV4dGVuZHMgUGFuZTxUPiB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkcmFnRXZlbnQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZDsKLQlwcm90ZWN0ZWQgQ3Vyc29yIGhhbmRDdXJzb3I7Ci0JcHJvdGVjdGVkIE1hcHBpbmdDaGFuZ2VIYW5kbGVyPFQ+IG1hcHBpbmdDaGFuZ2VIYW5kbGVyOwotCXByb3RlY3RlZCBpbnQgbWFwcGluZ1R5cGVMZW5ndGg7Ci0JcHJvdGVjdGVkIGludCBtYXBwaW5nVHlwZVN0YXJ0OwotCXByb3RlY3RlZCBib29sZWFuIG1vdXNlRG93bjsKLQlwcm90ZWN0ZWQgaW50IG5hbWVMZW5ndGg7Ci0JcHJvdGVjdGVkIGludCBuYW1lU3RhcnQ7Ci0JcHJvdGVjdGVkIFN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQotCS8qKgotCSAqIFRoZSBjb25zdGFudCBJRCB1c2VkIHRvIHJldHJpZXZlIHRoZSBkaWFsb2cgc2V0dGluZ3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19TRVRUSU5HUyA9ICJvcmcuZWNsaXBzZS5qcHQudWkuZGlhbG9ncy5NYXBBc0RpYWxvZyI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcEFzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgTWFwQXNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpQVCBwbGF0Zm9ybSByZXNwb25zYmxlIHRvIG1hbmFnZSB0aGUgdXNlciBpbnRlcmZhY2UgcGFydCBvZgotCSAqIHRoZSBKUFQgcGx1Zy1pbi4KLQkgKgotCSAqIEByZXR1cm4gVGhlIFVJIHBsYXRmb3JtIG9mIHRoZSBKUFQgcGx1Zy1pbgotCSAqLwotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVVpIGdldEpwYVBsYXRmb3JtVWkoKSB7Ci0JCVN0cmluZyBwbGF0Zm9ybUlkID0gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpLmdldElkKCk7Ci0JCXJldHVybiBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkuaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybVVpKHBsYXRmb3JtSWQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgcHJvdmlkZXIgcmVzcG9uc2libGUgZm9yIGNsZWFyaW5nIHRoZSBtYXBwaW5nIHR5cGUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm90IGEgZGVmYXVsdCBwcm92aWRlcgotCSAqIEByZXR1cm4gQSBwcm92aWRlciB0aGF0IGFjdHMgYXMgYSBkZWZhdWx0IG1hcHBpbmcgcHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb24gZ2V0RGVmYXVsdERlZmluaXRpb24oKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbiBnZXREZWZhdWx0RGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSk7Ci0JCi0JcHJvdGVjdGVkIE1hcHBpbmdVaURlZmluaXRpb24gZ2V0TWFwcGluZ1VpRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSkgewotCQlmb3IgKE1hcHBpbmdVaURlZmluaXRpb248VCwgPz4gcHJvdmlkZXIgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5tYXBwaW5nQ2hhbmdlSGFuZGxlci5tYXBwaW5nVWlEZWZpbml0aW9ucygpKSkgewotCQkJaWYgKHByb3ZpZGVyLmdldEtleSgpID09IG1hcHBpbmdLZXkpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgaGFuZGxlciByZXNwb25zaWJsZSB0byBnaXZlIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IKLQkgKiBjb21wbGV0aW5nIHRoZSBiZWhhdmlvciBvZiB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPk1hcHBpbmdDaGFuZ2VIYW5kbGVyPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBNYXBwaW5nQ2hhbmdlSGFuZGxlciBidWlsZE1hcHBpbmdDaGFuZ2VIYW5kbGVyKCk7Ci0JCi0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIGJ1aWxkTW91c2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb3VzZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCWlmIChlLmJ1dHRvbiA9PSAxKSB7Ci0JCQkJCW1vdXNlRG93biA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJCW1vdXNlRG93biA9IGZhbHNlOwotCQkJCVN0eWxlZFRleHQgdGV4dCA9IChTdHlsZWRUZXh0KSBlLndpZGdldDsKLQkJCQlpbnQgb2Zmc2V0ID0gdGV4dC5nZXRDYXJldE9mZnNldCgpOwotCi0JCQkJaWYgKGRyYWdFdmVudCkgewotCQkJCQlkcmFnRXZlbnQgPSBmYWxzZTsKLQotCQkJCQlpZiAoaXNPdmVyTGluayhvZmZzZXQpKSB7Ci0JCQkJCQl0ZXh0LnNldEN1cnNvcihoYW5kQ3Vyc29yKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChpc092ZXJMaW5rKG9mZnNldCkpIHsKLQkJCQkJdGV4dC5zZXRDdXJzb3IoaGFuZEN1cnNvcik7Ci0JCQkJCW9wZW5NYXBwaW5nU2VsZWN0aW9uRGlhbG9nKCk7Ci0JCQkJCXRleHQuc2V0Q3Vyc29yKG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vdXNlTW92ZUxpc3RlbmVyIGJ1aWxkTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7Ci0JCQkJU3R5bGVkVGV4dCB0ZXh0ID0gKFN0eWxlZFRleHQpIGUud2lkZ2V0OwotCi0JCQkJaWYgKG1vdXNlRG93bikgewotCQkJCQlpZiAoIWRyYWdFdmVudCkgewotCQkJCQkJdGV4dC5zZXRDdXJzb3IobnVsbCk7Ci0JCQkJCX0KLQotCQkJCQlkcmFnRXZlbnQgPSB0cnVlOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaW50IG9mZnNldCA9IC0xOwotCi0JCQkJdHJ5IHsKLQkJCQkJb2Zmc2V0ID0gdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludChlLngsIGUueSkpOwotCQkJCX0KLQkJCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkJfQotCi0JCQkJaWYgKGlzT3Zlckxpbmsob2Zmc2V0KSkgewotCQkJCQl0ZXh0LnNldEN1cnNvcihoYW5kQ3Vyc29yKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRleHQuc2V0Q3Vyc29yKG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248TWFwcGluZ1NlbGVjdGlvbkRpYWxvZz4gYnVpbGRQb3N0RXhlY3V0aW9uKCkgewotCi0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxNYXBwaW5nU2VsZWN0aW9uRGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoTWFwcGluZ1NlbGVjdGlvbkRpYWxvZyBkaWFsb2cpIHsKLQotCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCQkJTWFwcGluZ1VpRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKE1hcHBpbmdVaURlZmluaXRpb24pIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJCQltb3JwaE1hcHBpbmcoZGVmaW5pdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGZ1bGwgbG9jYWxpemVkIHN0cmluZyBieSBmb3JtYXR0aW5nIHRoZSBsYWJlbCB0ZXh0IHJldHVybmVkCi0JICogYnkgdGhlIDxjb2RlPk1hcHBpbmdDaGFuZ2VIYW5kbGVyPC9jb2RlPiB3aXRoIHRoZSBtYXBwaW5nIG5hbWUgYW5kIHRoZQotCSAqIG1hcHBpbmcgdHlwZS4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIFRoZSBkaXNwbGF5IHN0cmluZyBvZiB0aGUgbWFwcGluZyBiZWluZyBlZGl0ZWQKLQkgKiBAcGFyYW0gbWFwcGluZ1R5cGUgVGhlIGxvY2FsaXplZCBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIG1hcHBpbmcgdHlwZQotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbWFwcGluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KFN0cmluZyBuYW1lLCBTdHJpbmcgbWFwcGluZ1R5cGUpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJbWFwcGluZ0NoYW5nZUhhbmRsZXIuZ2V0TGFiZWxUZXh0KCksCi0JCQluYW1lLAotCQkJbWFwcGluZ1R5cGUKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFueSBzdHlsZSBhcHBsaWVkIHRvIHRoZSBzdHlsZWQgdGV4dC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclN0eWxlUmFuZ2UoKSB7Ci0JCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZShudWxsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXVwZGF0ZURlc2NyaXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQotCQlpZiAoIXN0eWxlZFRleHQuaXNEaXNwb3NlZCgpKSB7Ci0JCQlzdHlsZWRUZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJCWlmIChlbmFibGVkKSB7Ci0JCQkJdXBkYXRlTGlua1JhbmdlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljbGVhclN0eWxlUmFuZ2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0KLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCi0JCXRoaXMuZW5hYmxlZCA9IHRydWU7Ci0JCXRoaXMubWFwcGluZ0NoYW5nZUhhbmRsZXIgPSBidWlsZE1hcHBpbmdDaGFuZ2VIYW5kbGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaGFuZEN1cnNvciA9IGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcihTV1QuQ1VSU09SX0hBTkQpOwotCi0JCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChjb250YWluZXIsIFNXVC5XUkFQIHwgU1dULlJFQURfT05MWSk7Ci0JCXN0eWxlZFRleHQuYWRkTW91c2VMaXN0ZW5lcihidWlsZE1vdXNlTGlzdGVuZXIoKSk7Ci0JCXN0eWxlZFRleHQuYWRkTW91c2VNb3ZlTGlzdGVuZXIoYnVpbGRNb3VzZU1vdmVMaXN0ZW5lcigpKTsKLQkJc3R5bGVkVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZSB0aGUgPGNvZGU+TWFwcGluZ1VpRGVmaW5pdGlvbjwvY29kZT4gdGhhdCBwcm92aWRlcyB0aGUgVUkgZm9yIHRoZQotCSAqIGN1cnJlbnQgbWFwcGluZy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPk1hcHBpbmdVaVByb3ZpZGVyPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgdGhlCi0JICogbWFwcGluZyBiZWluZyBlZGl0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwcGluZ1VpRGVmaW5pdGlvbiBpbml0aWFsU2VsZWN0aW9uKCkgewotCi0JCWZvciAoSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb24+IGl0ZXIgPSB0aGlzLm1hcHBpbmdDaGFuZ2VIYW5kbGVyLm1hcHBpbmdVaURlZmluaXRpb25zKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCU1hcHBpbmdVaURlZmluaXRpb24gZGVmaW5pdGlvbiA9IGl0ZXIubmV4dCgpOwotCi0JCQlpZiAoZ2V0TWFwcGluZ0tleSgpID09IGRlZmluaXRpb24uZ2V0S2V5KCkpIHsKLQkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gbG9jYXRpb24gaXMgd2l0aGluIHRoZSBtYXBwaW5nIHR5cGUgcmFuZ2UuCi0JICoKLQkgKiBAcGFyYW0gbG9jYXRpb24gVGhlIG1vdXNlIGxvY2F0aW9uIGluIGNoYXJhY3RlciBjb29yZGluYXRlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbW91c2UgaXMgb3ZlciB0aGUgbWFwcGluZyB0eXBlIHRleHQ7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzT3ZlckxpbmsoaW50IGxvY2F0aW9uKSB7Ci0KLQkJcmV0dXJuIChsb2NhdGlvbiA+PSBtYXBwaW5nVHlwZVN0YXJ0ICYmCi0JCSAgICAgICAgbG9jYXRpb24gPD0gbWFwcGluZ1R5cGVTdGFydCArIG1hcHBpbmdUeXBlTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYXBwaW5nIGtleSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgbWFwcGluZyBvYmplY3QuCi0JICoKLQkgKiBAcmV0dXJuIEEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IHVuaXF1ZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB0aGUgdHlwZQotCSAqIG9mIHRoZSBtYXBwaW5nIGJlaW5nIGVkaXRlZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpOwotCi0JLyoqCi0JICogQWtzIHRoZSA8Y29kZT5NYXBwaW5nQ2hhbmdlSGFuZGxlcjwvY29kZT4gdG8gY2hhbmdlIHRoZSBtYXBwaW5nIHR5cGUgdXNpbmcKLQkgKiB0aGUgZ2l2ZW4gPGNvZGU+TWFwcGluZ1VpRGVmaW5pdGlvbjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtYXBwaW5nIHR5cGUgdXNlZCBmb3IKLQkgKiBtb3JwaGluZyB0aGUgbWFwcGluZyBiZWluZyBlZGl0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtb3JwaE1hcHBpbmcoTWFwcGluZ1VpRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0JCW1hcHBpbmdDaGFuZ2VIYW5kbGVyLm1vcnBoTWFwcGluZyhkZWZpbml0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgZGlhbG9nIHRoYXQgc2hvd3MgdGhlIHJlZ2lzdGVyZWQgbWFwcGluZyB0eXBlcyBpbiBvcmRlciBmb3IgdGhlCi0JICogdXNlciB0byBzZWxlY3QgYSBwcm92aWRlciBpbiBvcmRlciB0byBjaGFuZ2UgdGhlIG1hcHBpbmcgdHlwZSBvZiB0aGUKLQkgKiBtYXBwaW5nIGJlaW5nIGVkaXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuTWFwcGluZ1NlbGVjdGlvbkRpYWxvZygpIHsKLQotCQlNYXBwaW5nU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBNYXBwaW5nU2VsZWN0aW9uRGlhbG9nKCk7Ci0JCVNXVFV0aWwuc2hvdyhkaWFsb2csIGJ1aWxkUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBkZXNjcmlwdGlvbiBieSByZWNyZWF0aW5nIHRoZSBsYWJlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZXNjcmlwdGlvbigpIHsKLQkJaWYgKGdldFN1YmplY3QoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQljbGVhclN0eWxlUmFuZ2UoKTsKLQkJdXBkYXRlVGV4dCgpOwotCi0JCWlmIChlbmFibGVkKSB7Ci0JCQl1cGRhdGVMaW5rUmFuZ2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGNvbG9ycyBvZiB0aGUgdGV4dDogKDEpIHRoZSBuYW1lIGlzIHNob3duIGluIGJvbGQgYW5kICgyKSB0aGUKLQkgKiBtYXBwaW5nIHR5cGUgaXMgc2hvd24gaW4gYm9sZCBhbmQgaW4gaHlwZXJsaW5rIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUxpbmtSYW5nZSgpIHsKLQotCQlDb2xvciBsaW5rQ29sb3IgPSBKRmFjZUNvbG9ycy5nZXRIeXBlcmxpbmtUZXh0KGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpKTsKLQotCQkvLyBNYWtlIHRoZSBuYW1lIGJvbGQKLQkJU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoCi0JCQluYW1lU3RhcnQsIG5hbWVMZW5ndGgsCi0JCQludWxsLCBudWxsLAotCQkJU1dULkJPTEQKLQkJKTsKLQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlUmFuZ2UpOwotCi0JCS8vIE1ha2UgdGhlIG1hcHBpbmcgdHlwZSBzaG93biBhcyBhIGh5cGVybGluawotCQlpZiAobWFwcGluZ1R5cGVTdGFydCA+IC0xKSB7Ci0JCQlzdHlsZVJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoCi0JCQkJbWFwcGluZ1R5cGVTdGFydCwgbWFwcGluZ1R5cGVMZW5ndGgsCi0JCQkJbGlua0NvbG9yLCBudWxsCi0JCQkpOwotCi0JCQlzdHlsZVJhbmdlLnVuZGVybGluZSAgICAgID0gdHJ1ZTsKLQkJCXN0eWxlUmFuZ2UudW5kZXJsaW5lQ29sb3IgPSBsaW5rQ29sb3I7Ci0JCQlzdHlsZVJhbmdlLnVuZGVybGluZVN0eWxlID0gU1dULlVOREVSTElORV9TSU5HTEU7Ci0JCQlzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGVSYW5nZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzdHlsZXMgdGV4dCdzIGlucHV0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRleHQoKSB7Ci0KLQkJU3RyaW5nIG5hbWUgPSBtYXBwaW5nQ2hhbmdlSGFuZGxlci5nZXROYW1lKCk7Ci0KLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJbmFtZSA9IEpwdFVpRGV0YWlsc01lc3NhZ2VzLk5vTmFtZVNldDsKLQkJfQotCi0JCVN0cmluZyBtYXBwaW5nVHlwZSA9IG1hcHBpbmdDaGFuZ2VIYW5kbGVyLmdldE1hcHBpbmdUZXh0KCk7Ci0JCVN0cmluZyB0ZXh0ID0gYnVpbGRUZXh0KG5hbWUsIG1hcHBpbmdUeXBlKTsKLQotCQltYXBwaW5nVHlwZVN0YXJ0ICA9IHRleHQubGFzdEluZGV4T2YobWFwcGluZ1R5cGUpOwotCQltYXBwaW5nVHlwZUxlbmd0aCA9IG1hcHBpbmdUeXBlLmxlbmd0aCgpOwotCi0JCW5hbWVTdGFydCAgPSB0ZXh0LmluZGV4T2YobmFtZSk7Ci0JCW5hbWVMZW5ndGggPSBuYW1lLmxlbmd0aCgpOwotCi0JCXN0eWxlZFRleHQuc2V0VGV4dCh0ZXh0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLnN0eWxlZFRleHQuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGdpdmUgdGhlIHRleHQgaW5mb3JtYXRpb24gYW5kIHRvIG9wZW4gdGhlCi0JICogbWFwcGluZyBkaWFsb2cgaWYgdGhlIHVzZXIgY2xpY2tlZCBvbiB0aGUgbWFwcGluZyB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBpbnRlcmZhY2UgTWFwcGluZ0NoYW5nZUhhbmRsZXI8VD4gewotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBlbnRpcmUgdGV4dCBkZXNjcmliaW5nIHRoZSBtYXBwaW5nIChlbnRpdHkgb3IgbWFwcGluZykgYW5kCi0JCSAqIGl0cyB0eXBlLgotCQkgKgotCQkgKiBAcmV0dXJuIEEgbG9jYWxpemVkIHRleHQgd2l0aCB0d28gYXJndW1lbnRzIHdoZXJlIHRoZSBmaXJzdCBvbmUgc2hvdWxkCi0JCSAqIGJlIHJlcGxhY2VkIGJ5IHRoZSBuYW1lIGFuZCB0aGUgc2Vjb25kIGJlIHJlcGxhY2VkIGJ5IHRoZSBtYXBwaW5nIHR5cGUKLQkJICovCi0JCVN0cmluZyBnZXRMYWJlbFRleHQoKTsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgdGV4dCByZXByZXNlbnRpbmcgdGhlIG1hcHBpbmcgdHlwZS4KLQkJICoKLQkJICogQHJldHVybiBBIGh1bWFuIHJlYWRhYmxlIHRleHQgZGVzY3JpYmluZyB0aGUgbWFwcGluZyB0eXBlCi0JCSAqLwotCQlTdHJpbmcgZ2V0TWFwcGluZ1RleHQoKTsKLQotCQkvKioKLQkJICogTW9ycGhlcyB0aGUgY3VycmVudCBtYXBwaW5nIGludG8gYSBuZXcgdHlwZSBieSB1c2luZyB0aGUgZ2l2ZW4gcHJvdmlkZXIuCi0JCSAqCi0JCSAqIEBwYXJhbSBwcm92aWRlciBUaGUgZGVmaW5pdGlvbiB0aGF0IHdhcyBzZWxlY3RlZCBmb3IgY2hhbmdpbmcgdGhlIG1hcHBpbmcKLQkJICovCi0JCXZvaWQgbW9ycGhNYXBwaW5nKE1hcHBpbmdVaURlZmluaXRpb248VCwgPz4gZGVmaW5pdGlvbik7Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbWFwcGluZy4KLQkJICoKLQkJICogQHJldHVybiBUaGUgZGlzcGxheWFibGUgbmFtZSBvZiB0aGUgbWFwcGluZwotCQkgKi8KLQkJU3RyaW5nIGdldE5hbWUoKTsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgbGlzdCBvZiBtYXBwaW5nIFVJIGRlZmluaXRpb25zIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgSlBUIHBsdWdpbi4KLQkJICoKLQkJICogQHJldHVybiBUaGUgc3VwcG9ydGVkIHR5cGVzIG9mIG1hcHBpbmcKLQkJICovCi0JCUl0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248VCwgPz4+IG1hcHBpbmdVaURlZmluaXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkaWFsb2cgc2hvd3MgdGhlIGxpc3Qgb2YgcG9zc2libGUgbWFwcGluZyB0eXBlcyBhbmQgbGV0cyB0aGUgdXNlcgotCSAqIHRoZSBvcHRpb24gdG8gZmlsdGVyIHRoZW0gdXNpbmcgYSBzZWFyY2ggZmllbGQuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIE1hcHBpbmdTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBGaWx0ZXJlZEl0ZW1zU2VsZWN0aW9uRGlhbG9nIAotCXsKLQkJcHJpdmF0ZSBNYXBwaW5nVWlEZWZpbml0aW9uIGRlZmF1bHREZWZpbml0aW9uOwotCQkKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGluZ1NlbGVjdGlvbkRpYWxvZzwvY29kZT4uCi0JCSAqLwotCQlwcml2YXRlIE1hcHBpbmdTZWxlY3Rpb25EaWFsb2coKSB7Ci0JCQlzdXBlcihNYXBBc0NvbXBvc2l0ZS50aGlzLmdldFNoZWxsKCksIGZhbHNlKTsKLQkJCXNldE1lc3NhZ2UoSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFwQXNDb21wb3NpdGVfbGFiZWxUZXh0KTsKLQkJCXNldFRpdGxlKEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcEFzQ29tcG9zaXRlX2RpYWxvZ1RpdGxlKTsKLQkJCXNldExpc3RMYWJlbFByb3ZpZGVyKGJ1aWxkTGFiZWxQcm92aWRlcigpKTsKLQkJCXNldERldGFpbHNMYWJlbFByb3ZpZGVyKGJ1aWxkTGFiZWxQcm92aWRlcigpKTsKLQkJfQotCi0JCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0KLQkJCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlNYXBwaW5nVWlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoTWFwcGluZ1VpRGVmaW5pdGlvbikgZWxlbWVudDsKLQkJCQkJcmV0dXJuIGRlZmluaXRpb24uZ2V0SW1hZ2UoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuICIiOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlNYXBwaW5nVWlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoTWFwcGluZ1VpRGVmaW5pdGlvbikgZWxlbWVudDsKLQkJCQkJcmV0dXJuIGRlZmluaXRpb24uZ2V0TGFiZWwoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUV4dGVuZGVkQ29udGVudEFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEl0ZW1zRmlsdGVyIGNyZWF0ZUZpbHRlcigpIHsKLQkJCXJldHVybiBuZXcgTWFwcGluZ1R5cGVJdGVtc0ZpbHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGZpbGxDb250ZW50UHJvdmlkZXIoCi0JCQkJQWJzdHJhY3RDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIsCi0JCQkJSXRlbXNGaWx0ZXIgaXRlbXNGaWx0ZXIsCi0JCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkKLQkJCW1vbml0b3IuYmVnaW5UYXNrKG51bGwsIC0xKTsKLQotCQkJdHJ5IHsKLQkJCQkvLyBBZGQgdGhlIGRlZmF1bHQgcHJvdmlkZXIKLQkJCQlkZWZhdWx0RGVmaW5pdGlvbiA9IGdldERlZmF1bHREZWZpbml0aW9uKCk7Ci0KLQkJCQlpZiAoZGVmYXVsdERlZmluaXRpb24gIT0gbnVsbCkgewotCQkJCQlwcm92aWRlci5hZGQoZGVmYXVsdERlZmluaXRpb24sIGl0ZW1zRmlsdGVyKTsKLQkJCQl9Ci0KLQkJCQkvLyBBZGQgdGhlIHJlZ2lzdGVyZWQgbWFwcGluZyBwcm92aWRlcnMgdG8gdGhlIGRpYWxvZwotCQkJCWZvciAoSXRlcmF0b3I8TWFwcGluZ1VpRGVmaW5pdGlvbjxULCA/Pj4gaXRlciA9IG1hcHBpbmdDaGFuZ2VIYW5kbGVyLm1hcHBpbmdVaURlZmluaXRpb25zKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCQkJTWFwcGluZ1VpRGVmaW5pdGlvbiBtYXBwaW5nRGVmaW5pdGlvbiA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAobWFwcGluZ0RlZmluaXRpb24uaXNFbmFibGVkRm9yKGdldFN1YmplY3QoKSkpIHsKLQkJCQkJCXByb3ZpZGVyLmFkZChtYXBwaW5nRGVmaW5pdGlvbiwgaXRlbXNGaWx0ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQotCQkJSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzID0gSnB0VWlQbHVnaW4uaW5zdGFuY2UoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZGlhbG9nU2V0dGluZ3MuZ2V0U2VjdGlvbihESUFMT0dfU0VUVElOR1MpOwotCi0JCQlpZiAoc2V0dGluZ3MgPT0gbnVsbCkgewotCQkJCXNldHRpbmdzID0gZGlhbG9nU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihESUFMT0dfU0VUVElOR1MpOwotCQkJfQotCi0JCQlyZXR1cm4gc2V0dGluZ3M7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQlNYXBwaW5nVWlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoTWFwcGluZ1VpRGVmaW5pdGlvbikgb2JqZWN0OwotCQkJcmV0dXJuIGRlZmluaXRpb24uZ2V0TGFiZWwoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPiBnZXRJdGVtc0NvbXBhcmF0b3IoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8TWFwcGluZ1VpRGVmaW5pdGlvbj4oKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKE1hcHBpbmdVaURlZmluaXRpb24gaXRlbTEsIE1hcHBpbmdVaURlZmluaXRpb24gaXRlbTIpIHsKLQotCQkJCQlpZiAoaXRlbTEgPT0gZGVmYXVsdERlZmluaXRpb24pIHsKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJfQotCi0JCQkJCWlmIChpdGVtMiA9PSBkZWZhdWx0RGVmaW5pdGlvbikgewotCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCX0KLQotCQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZzEgPSBpdGVtMS5nZXRMYWJlbCgpOwotCQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZzIgPSBpdGVtMi5nZXRMYWJlbCgpOwotCQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGRpc3BsYXlTdHJpbmcxLCBkaXNwbGF5U3RyaW5nMik7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUl0ZW0oT2JqZWN0IGl0ZW0pIHsKLQotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgIiIsIG51bGwpOwotCQkJfQotCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JCS8qKgotCQkgKiBDcmVhdGUgdGhlIGZpbHRlciByZXNwb25zaWJsZSB0byByZW1vdmUgYW55IG1hcHBpbmcgdHlwZSBiYXNlZCBvbiB0aGUKLQkJICogcGF0dGVybiBlbnRlcmVkIGluIHRoZSB0ZXh0IGZpZWxkLgotCQkgKi8KLQkJcHJpdmF0ZSBjbGFzcyBNYXBwaW5nVHlwZUl0ZW1zRmlsdGVyIGV4dGVuZHMgSXRlbXNGaWx0ZXIgewotCi0JCQkvKioKLQkJCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGluZ1R5cGVJdGVtc0ZpbHRlcjwvY29kZT4uCi0JCQkgKi8KLQkJCU1hcHBpbmdUeXBlSXRlbXNGaWx0ZXIoKSB7Ci0KLQkJCQlzdXBlcigpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoYXQgaWYgdGhlIHBhdHRlcm4gaXMgZW1wdHksIHdlIHNwZWNpZnkgKiBpbiBvcmRlcgotCQkJCS8vIHRvIHNob3cgYWxsIHRoZSBtYXBwaW5nIHR5cGVzCi0JCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0UGF0dGVybigpKSkgewotCQkJCQlwYXR0ZXJuTWF0Y2hlci5zZXRQYXR0ZXJuKCIqIik7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGlzQ29uc2lzdGVudEl0ZW0oT2JqZWN0IGl0ZW0pIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBtYXRjaEl0ZW0oT2JqZWN0IGl0ZW0pIHsKLQkJCQlNYXBwaW5nVWlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoTWFwcGluZ1VpRGVmaW5pdGlvbikgaXRlbTsKLQkJCQlyZXR1cm4gbWF0Y2hlcyhkZWZpbml0aW9uLmdldExhYmVsKCkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhODNmMmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOiAgCi0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgbyBNYXBwZWQgYnkgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8Ci0gKiB8IHwgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tIHwgfAotICogfCB8ICBBdHRyaWJ1dGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgfEJyb3dzZS4ufCB8IHwKLSAqIHwgfCAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBPd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlfQotICogQHNlZSB7QGxpbmsgTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3l9Ci0gKiBAc2VlIHtAbGluayBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lfQotICogQHNlZSB7QGxpbmsgTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUgCi0JZXh0ZW5kcyBBYnN0cmFjdEpvaW5pbmdTdHJhdGVneVBhbmU8T3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBmb3JtIHBhbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZSgKLQkJCVBhbmU8PyBleHRlbmRzIE93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U+IHBhcmVudFBhbmUsIAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgYnVpbGRTdHJhdGVneURldGFpbHNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE1hcHBlZEJ5UGFuZSh0aGlzLCB0aGlzLmJ1aWxkTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lIb2xkZXIoKSwgcGFyZW50KS5nZXRDb250cm9sKCk7Ci0JfQkKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNTdHJhdGVneUhvbGRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkVXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxNYXBwZWRCeUpvaW5pbmdTdHJhdGVneT4gYnVpbGRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVc2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIEJvb2xlYW4+KAotCQkJCXN1YmplY3RIb2xkZXIsIFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5QUkVET01JTkFOVF9KT0lOSU5HX1NUUkFURUdZX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyBCb29sZWFuLkZBTFNFIDoKLQkJCQkJQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC51c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gQm9vbGVhbi5UUlVFKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpOwotCQkJCX0KLQkJCQkvL3ZhbHVlID09IEZBTFNFIC0gc2VsZWN0aW9uIG9mIGFub3RoZXIgcmFkaW8gYnV0dG9uIGNhdXNlcyB0aGlzIHN0cmF0ZWd5IHRvIGdldCB1bnNldAotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFwcGVkQnlQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hcHBlZEJ5UGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmU5OTNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFwcGVkQnlQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE1hcHBlZCBCeTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBOb25Pd25pbmdNYXBwaW5nCi0gKiBAc2VlIE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBwZWRCeVBhbmUgCi0JZXh0ZW5kcyBQYW5lPE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGVkQnlQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgZm9ybSBwYW5lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIFBWTSBmb3IgdGhlIHtAbGluayBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneX0KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE1hcHBlZEJ5UGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxNYXBwZWRCeUpvaW5pbmdTdHJhdGVneT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19tYXBwZWRCeUF0dHJpYnV0ZUxhYmVsLAotCQkJYnVpbGRDYW5kaWRhdGVBdHRyaWJ1dGVzTGlzdFZhbHVlTW9kZWwoKSwKLQkJCWJ1aWxkQXR0cmlidXRlUHJvcGVydHlWYWx1ZU1vZGVsKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX01BUFBFRF9CWSk7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ2FuZGlkYXRlQXR0cmlidXRlc0xpc3RWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LCBTdHJpbmc+KAotCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcl8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQkJCX0KLQkJCX0sCi0JCQlDb2xsYXRvci5nZXRJbnN0YW5jZSgpCi0JCSk7Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQXR0cmlidXRlUHJvcGVydHlWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSwgU3RyaW5nPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5Lk1BUFBFRF9CWV9BVFRSSUJVVEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE1hcHBlZEJ5QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRNYXBwZWRCeUF0dHJpYnV0ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL05hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDk4OTllLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIHwgUmVzdWx0IENsYXNzOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCcm93c2UuLi4gfCB8Ci0gKiB8ICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgIHwKLSAqIHwgUXVlcnk6ICAgICAgICB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBRdWVyeSBIaW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8IFF1ZXJ5SGludHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgTmFtZWROYXRpdmVRdWVyeQotICogQHNlZSBOYW1lZE5hdGl2ZVF1ZXJpZXNDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBDbGFzc0Nob29zZXJQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPE5hbWVkTmF0aXZlUXVlcnk+Ci17Ci0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPE5hbWVkTmF0aXZlUXVlcnk+IHJlc3VsdENsYXNzQ2hvb3NlclBhbmU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTmFtZWROYXRpdmVRdWVyeT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxOYW1lZE5hdGl2ZVF1ZXJ5PiBhZGRDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxOYW1lZE5hdGl2ZVF1ZXJ5Pih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TmFtZWROYXRpdmVRdWVyeSwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIE5hbWVkTmF0aXZlUXVlcnkuUkVTVUxUX0NMQVNTX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRSZXN1bHRDbGFzcygpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRSZXN1bHRDbGFzcyh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0UmVzdWx0Q2xhc3MoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3Jlc3VsdENsYXNzOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0UmVzdWx0Q2xhc3MoY2xhc3NOYW1lKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0UmVzdWx0Q2xhc3NFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUXVlcnlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE5hbWVkTmF0aXZlUXVlcnksIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBRdWVyeS5RVUVSWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UXVlcnkoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFF1ZXJ5KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCQl0aGlzLnJlc3VsdENsYXNzQ2hvb3NlclBhbmUuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCWFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk5hbWVkUXVlcnlDb21wb3NpdGVfbmFtZVRleHRMYWJlbCwgCi0JCQlidWlsZE5hbWVUZXh0SG9sZGVyKCkpOwotCi0JCS8vIFJlc3VsdCBjbGFzcyBjaG9vc2VyCi0JCXRoaXMucmVzdWx0Q2xhc3NDaG9vc2VyUGFuZSA9IGFkZENsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCi0JCS8vIFF1ZXJ5IHRleHQgYXJlYQotCQlhZGRMYWJlbGVkTXVsdGlMaW5lVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeSwKLQkJCWJ1aWxkUXVlcnlIb2xkZXIoKSwKLQkJCTQsCi0JCQludWxsCi0JCSk7Ci0KLQkJLy8gUXVlcnkgSGludHMgcGFuZQotCQljb250YWluZXIgPSBhZGRUaXRsZWRHcm91cCgKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeUhpbnRzR3JvdXBCb3gKLQkJKTsKLQotCQluZXcgUXVlcnlIaW50c0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVUZXh0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxOYW1lZE5hdGl2ZVF1ZXJ5LCBTdHJpbmc+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgUXVlcnkuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL05hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmNzRmYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL05hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgUXVlcnk6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIFF1ZXJ5IEhpbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgUXVlcnlIaW50c0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBOYW1lZFF1ZXJ5Ci0gKiBAc2VlIE5hbWVkUXVlcmllc0NvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIFF1ZXJ5SGludHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZTxUIGV4dGVuZHMgTmFtZWRRdWVyeT4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUXVlcnlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE5hbWVkUXVlcnksIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBRdWVyeS5RVUVSWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UXVlcnkoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFF1ZXJ5KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCWFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk5hbWVkUXVlcnlDb21wb3NpdGVfbmFtZVRleHRMYWJlbCwgCi0JCQlidWlsZE5hbWVUZXh0SG9sZGVyKCkpOwotCi0JCS8vIFF1ZXJ5IHRleHQgYXJlYQotCQlhZGRMYWJlbGVkTXVsdGlMaW5lVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeSwKLQkJCWJ1aWxkUXVlcnlIb2xkZXIoKSwKLQkJCTQsCi0JCQludWxsCi0JCSk7Ci0KLQkJLy8gUXVlcnkgSGludHMgcGFuZQotCQljb250YWluZXIgPSBhZGRUaXRsZWRHcm91cCgKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeUhpbnRzR3JvdXBCb3gKLQkJKTsKLQotCQluZXcgUXVlcnlIaW50c0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQkJCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lVGV4dEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TmFtZWRRdWVyeSwgU3RyaW5nPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIFF1ZXJ5Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9PbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhY2MwMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZTogIAotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gSm9pbmluZyBTdHJhdGVneSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgbyBKb2luVGFibGVTdHJhdGVneVBhbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgT25lVG9NYW55TWFwcGluZ30KLSAqIEBzZWUge0BsaW5rIE9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZX0KLSAqIEBzZWUge0BsaW5rIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBNYXBwZWRCeVN0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEpvaW5UYWJsZVN0cmF0ZWd5UGFuZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIE9uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUgCi0JZXh0ZW5kcyBQYW5lPE9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4KLXsKLQlwdWJsaWMgT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ190aXRsZSwKLQkJCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkpOwotCQkKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb21wb3NpdGUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX21hcHBlZEJ5TGFiZWwsCi0JCQlNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCW5ldyBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCQotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbXBvc2l0ZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfam9pblRhYmxlSm9pbmluZ0xhYmVsLAotCQkJSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZS5idWlsZFVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCW5ldyBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRTdWJQYW5lKGNvbXBvc2l0ZSwgNSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5YzJkZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JkZXJpbmdDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgT25lVG9NYW55TWFwcGluZwotICogQHNlZSBDYXNjYWRlQ29tcG9zaXRlCi0gKiBAc2VlIEZldGNoVHlwZUNvbXBvc2l0ZQotICogQHNlZSBKb2luVGFibGVDb21wb3NpdGUKLSAqIEBzZWUgT3JkZXJpbmdDb21wb3NpdGUKLSAqIEBzZWUgVGFyZ2V0RW50aXR5Q29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlIAotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPE9uZVRvTWFueU1hcHBpbmcsIE9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JT25lVG9NYW55TWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9uZVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmI2OTNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZTogIAotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gSm9pbmluZyBTdHJhdGVneSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgbyBKb2luQ29sdW1uU3RyYXRlZ3lQYW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IG8gUHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneVBhbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUge0BsaW5rIE9uZVRvT25lTWFwcGluZ30KLSAqIEBzZWUge0BsaW5rIE9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlfQotICogQHNlZSB7QGxpbmsgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgTWFwcGVkQnlTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBKb2luQ29sdW1uU3RyYXRlZ3lQYW5lfQotICogQHNlZSB7QGxpbmsgUHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneVBhbmV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUgCi0JZXh0ZW5kcyBQYW5lPE9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlPgotewotCXB1YmxpYyBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsIAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ190aXRsZSwKLQkJCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkpOwotCQkKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19tYXBwZWRCeUxhYmVsLAotCQkJTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lLmJ1aWxkVXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSksCi0JCQludWxsKTsKLQotCQluZXcgTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbXBvc2l0ZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfcHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nTGFiZWwsCi0JCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCW5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19qb2luQ29sdW1uSm9pbmluZ0xhYmVsLAotCQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpLAotCQkJbnVsbCk7Ci0KLQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuCi0JCQkJYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZVdpdGhJbmNsdWRlT3ZlcnJpZGVDaGVja0JveCh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJYWRkU3ViUGFuZShjb21wb3NpdGUsIDUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQ4YjgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPbmVUb09uZU1hcHBpbmcKLSAqIEBzZWUgVGFyZ2V0RW50aXR5Q29tcG9zaXRlCi0gKiBAc2VlIEpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgT3B0aW9uYWxDb21wb3NpdGUKLSAqIEBzZWUgQ2FzY2FkZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlIAotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU8T25lVG9PbmVNYXBwaW5nLCBPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklPbmVUb09uZU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQkKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPbmVUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT3B0aW9uYWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT3B0aW9uYWxDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkNWFlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09wdGlvbmFsQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OdWxsYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgY29tcG9zaXRlIHNpbXBseSBzaG93cyBhIHRyaS1zdGF0ZSBjaGVjayBib3ggZm9yIHRoZSBPcHRpb25hbCBvcHRpb24uCi0gKgotICogQHNlZSBCYXNpY01hcHBpbmcKLSAqIEBzZWUgQmFzaWNNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMS4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHRpb25hbENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8TnVsbGFibGU+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcHRpb25hbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3B0aW9uYWxDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgTnVsbGFibGU+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA0KSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkJhc2ljR2VuZXJhbFNlY3Rpb25fb3B0aW9uYWxMYWJlbCwKLQkJCWJ1aWxkT3B0aW9uYWxIb2xkZXIoKSwKLQkJCWJ1aWxkT3B0aW9uYWxTdHJpbmdIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1BUSU9OQUwKLQkJKTsKLQl9Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE9wdGlvbmFsSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxOdWxsYWJsZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBOdWxsYWJsZS5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRPcHRpb25hbCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZE9wdGlvbmFsKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkT3B0aW9uYWxTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRPcHRpb25hbEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJhc2ljR2VuZXJhbFNlY3Rpb25fb3B0aW9uYWxMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0T3B0aW9uYWxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE51bGxhYmxlLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCU51bGxhYmxlLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwKLQkJCU51bGxhYmxlLkRFRkFVTFRfT1BUSU9OQUxfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRPcHRpb25hbCgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdE9wdGlvbmFsKCkpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09yZGVyaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09yZGVyaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YjhlNzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9PcmRlcmluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PcmRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gT3JkZXJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG8gUHJpbWFyeSBLZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgbyBDdXN0b20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBDb2xsZWN0aW9uTWFwcGluZwotICogQHNlZSBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmRlcmluZ0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0T3JkZXJpbmdDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9yZGVyaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcmRlcmluZ0NvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBDb2xsZWN0aW9uTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcmRlcmluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JkZXJpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb2xsZWN0aW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxPcmRlcmFibGU+IG9yZGVyYWJsZUhvbGRlciA9IGJ1aWxkT3JkZXJhYmxlSG9sZGVyKCk7Ci0JCQotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5PcmRlcmluZ0NvbXBvc2l0ZV9vcmRlcmluZ0dyb3VwCi0JCSk7Ci0KLQkJLy8gTm8gT3JkZXJpbmcgcmFkaW8gYnV0dG9uCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuT3JkZXJpbmdDb21wb3NpdGVfbm9uZSwKLQkJCWJ1aWxkTm9PcmRlcmluZ0hvbGRlcihvcmRlcmFibGVIb2xkZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUkRFUl9CWV9OT19PUkRFUklORwotCQkpOwotCi0JCS8vIE9yZGVyIGJ5IFByaW1hcnkgS2V5IHJhZGlvIGJ1dHRvbgotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk9yZGVyaW5nQ29tcG9zaXRlX3ByaW1hcnlLZXksCi0JCQlidWlsZFByaW1hcnlLZXlPcmRlcmluZ0hvbGRlcihvcmRlcmFibGVIb2xkZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUkRFUl9CWV9QUklNQVJZX0tFWV9PUkRFUklORwotCQkpOwotCi0JCS8vIEN1c3RvbSBPcmRlcmluZyByYWRpbyBidXR0b24KLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5PcmRlcmluZ0NvbXBvc2l0ZV9jdXN0b20sCi0JCQlidWlsZEN1c3RvbU9yZGVyaW5nSG9sZGVyKG9yZGVyYWJsZUhvbGRlciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZX0NVU1RPTV9PUkRFUklORwotCQkpOwotCi0JCS8vIEN1c3RvbSBPcmRlcmluZyB0ZXh0IGZpZWxkCi0JCWFkZFRleHQoCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgMTYpLAotCQkJYnVpbGRTcGVjaWZpZWRPcmRlckJ5SG9sZGVyKG9yZGVyYWJsZUhvbGRlciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZLAotCQkJYnVpbGRDdXN0b21PcmRlcmluZ0hvbGRlcihvcmRlcmFibGVIb2xkZXIpCi0JCSk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiOTUzYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbFN3aXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiB0aGUgZGV0YWlscyBwYWdlIHJlc3BvbnNpYmxlIHRvIHNob3cgdGhlCi0gKiBpbmZvcm1hdGlvbiBmb3IgYW4gcGVyc2lzdGVudCBhdHRyaWJ1dGUuCi0gKgotICogQHNlZSBQZXJzaXN0ZW50QXR0cmlidXRlCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U8VCBleHRlbmRzIFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGV4dGVuZHMgQWJzdHJhY3RKcGFEZXRhaWxzUGFnZTxUPgotewotCXByaXZhdGUgTWFwPFN0cmluZywgSnBhQ29tcG9zaXRlPiBtYXBwaW5nQ29tcG9zaXRlczsKLQlwcml2YXRlIFBhZ2VCb29rIG1hcHBpbmdQYWdlQm9vazsKLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU1hcHBpbmc+IG1hcHBpbmdIb2xkZXI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlKAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLm1hcHBpbmdDb21wb3NpdGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKcGFDb21wb3NpdGU+KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFBhZ2VCb29rIGJ1aWxkTWFwcGluZ1BhZ2VCb29rKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5tYXBwaW5nUGFnZUJvb2sgPSBuZXcgUGFnZUJvb2socGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRoaXMubWFwcGluZ1BhZ2VCb29rLnNob3dQYWdlKHRoaXMuYWRkTGFiZWwodGhpcy5tYXBwaW5nUGFnZUJvb2ssICIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ICAgICAgICAgPSBTV1QuVE9QOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgICA9IHRydWU7Ci0KLQkJdGhpcy5tYXBwaW5nUGFnZUJvb2suc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQl0aGlzLm1hcHBpbmdIb2xkZXIgPSB0aGlzLmJ1aWxkTWFwcGluZ0hvbGRlcigpOwotCQluZXcgQ29udHJvbFN3aXRjaGVyKHRoaXMubWFwcGluZ0hvbGRlciwgdGhpcy5idWlsZFBhbmVUcmFuc2Zvcm1lcigpLCB0aGlzLm1hcHBpbmdQYWdlQm9vayk7Ci0KLQkJcmV0dXJuIHRoaXMubWFwcGluZ1BhZ2VCb29rOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zZm9ybWVyPEF0dHJpYnV0ZU1hcHBpbmcsIENvbnRyb2w+IGJ1aWxkUGFuZVRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPEF0dHJpYnV0ZU1hcHBpbmcsIENvbnRyb2w+KCkgewotCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKEF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZykgewotCQkJCWlmIChhdHRyaWJ1dGVNYXBwaW5nID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBnZXRNYXBwaW5nQ29tcG9zaXRlKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0S2V5KCkpLmdldENvbnRyb2woKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhQ29tcG9zaXRlIGdldE1hcHBpbmdDb21wb3NpdGUoU3RyaW5nIGtleSkgewotCQlKcGFDb21wb3NpdGUgY29tcG9zaXRlID0gdGhpcy5tYXBwaW5nQ29tcG9zaXRlcy5nZXQoa2V5KTsKLQkJaWYgKGNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0KLQkJY29tcG9zaXRlID0gYnVpbGRNYXBwaW5nQ29tcG9zaXRlKHRoaXMubWFwcGluZ1BhZ2VCb29rLCBrZXkpOwotCi0JCWlmIChjb21wb3NpdGUgIT0gbnVsbCkgewotCQkJdGhpcy5tYXBwaW5nQ29tcG9zaXRlcy5wdXQoa2V5LCBjb21wb3NpdGUpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYUNvbXBvc2l0ZSBidWlsZE1hcHBpbmdDb21wb3NpdGUoUGFnZUJvb2sgcGFnZUJvb2ssIFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldEpwYVBsYXRmb3JtVWkoKS5idWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQkJZ2V0U3ViamVjdCgpLmdldFJlc291cmNlVHlwZSgpLAotCQkJCWtleSwKLQkJCQlwYWdlQm9vaywKLQkJCQlidWlsZE1hcHBpbmdIb2xkZXIoa2V5KSwKLQkJCQlnZXRXaWRnZXRGYWN0b3J5KCkpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVNYXBwaW5nPiBidWlsZE1hcHBpbmdIb2xkZXIoZmluYWwgU3RyaW5nIGtleSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVNYXBwaW5nPigKLQkJCXRoaXMubWFwcGluZ0hvbGRlciwKLQkJCWJ1aWxkTWFwcGluZ0ZpbHRlcihrZXkpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWx0ZXI8QXR0cmlidXRlTWFwcGluZz4gYnVpbGRNYXBwaW5nRmlsdGVyKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCXJldHVybiBuZXcgTWFwcGluZ0ZpbHRlcihtYXBwaW5nS2V5KTsKLQl9Ci0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlTWFwcGluZz4gYnVpbGRNYXBwaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBBdHRyaWJ1dGVNYXBwaW5nPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCVBlcnNpc3RlbnRBdHRyaWJ1dGUuREVGQVVMVF9NQVBQSU5HX1BST1BFUlRZLAotCQkJUGVyc2lzdGVudEF0dHJpYnV0ZS5TUEVDSUZJRURfTUFQUElOR19QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQXR0cmlidXRlTWFwcGluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE1hcHBpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlsb2coVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsICJQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuZGlzcG9zZSgpIik7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKEpwYUNvbXBvc2l0ZSBtYXBwaW5nQ29tcG9zaXRlIDogdGhpcy5tYXBwaW5nQ29tcG9zaXRlcy52YWx1ZXMoKSkgewotCQkJbWFwcGluZ0NvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCX0KLQkJdGhpcy5tYXBwaW5nQ29tcG9zaXRlcy5jbGVhcigpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBmbGFnLCBTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlci5sb2coZmxhZywgbWVzc2FnZSk7Ci0KLQkJaWYgKFRyYWNpbmcuVUlfREVUQUlMU19WSUVXLmVxdWFscyhmbGFnKSAmJgotCQkgICAgVHJhY2luZy5ib29sZWFuRGVidWdPcHRpb24oVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcpKQotCQl7Ci0JCQlUcmFjaW5nLmxvZyhtZXNzYWdlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgTWFwcGluZ0ZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcjxBdHRyaWJ1dGVNYXBwaW5nPiB7Ci0JCXByaXZhdGUgU3RyaW5nIG1hcHBpbmdLZXk7Ci0KLQkJTWFwcGluZ0ZpbHRlcihTdHJpbmcgbWFwcGluZ0tleSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubWFwcGluZ0tleSA9IG1hcHBpbmdLZXk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQlyZXR1cm4gKG1hcHBpbmcgPT0gbnVsbCB8fCB0aGlzLm1hcHBpbmdLZXkgPT0gbnVsbCkgfHwgdGhpcy5tYXBwaW5nS2V5LmVxdWFscyhtYXBwaW5nLmdldEtleSgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4MWJjNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uVW5zdXBwb3J0ZWRPcm1NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgIk1hcCBBcyIgY29tcG9zaXRlIGlzIHJlc3BvbnNpYmxlIGZvciBzaG93aW5nIHRoZSBtYXBwaW5nIG5hbWUgYW5kCi0gKiBtYXBwaW5nIHR5cGUgZm9yIGFuIGF0dHJpYnV0ZS4KLSAqCi0gKiBAc2VlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUKLSAqIEBzZWUgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUgCi0JZXh0ZW5kcyBNYXBBc0NvbXBvc2l0ZTxQZXJzaXN0ZW50QXR0cmlidXRlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZT4gcGFyZW50UGFuZSwKLSAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE1hcHBpbmdDaGFuZ2VIYW5kbGVyIGJ1aWxkTWFwcGluZ0NoYW5nZUhhbmRsZXIoKSB7Ci0JCXJldHVybiBuZXcgTWFwcGluZ0NoYW5nZUhhbmRsZXIoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCVN0cmluZyBtYXBwaW5nS2V5ID0gZ2V0TWFwcGluZ0tleSgpOwotCi0JCQkJaWYgKG1hcHBpbmdLZXkgIT0gTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcEFzQ29tcG9zaXRlX21hcHBlZEF0dHJpYnV0ZVRleHQ7Ci0JCQkJfQotCQkJCWlmIChnZXRTdWJqZWN0KCkuaXNWaXJ0dWFsKCkpIHsKLQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcEFzQ29tcG9zaXRlX3ZpcnR1YWxBdHRyaWJ1dGVUZXh0OwotCQkJCX0KLQotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV91bm1hcHBlZEF0dHJpYnV0ZVRleHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ1RleHQoKSB7Ci0JCQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBnZXRNYXBwaW5nS2V5KCk7Ci0KLQkJCQlpZiAobWFwcGluZ0tleSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV9jaGFuZ2VNYXBwaW5nVHlwZTsKLQkJCQl9Ci0KLQkJCQlpZiAoZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZE1hcHBpbmcoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBnZXREZWZhdWx0RGVmaW5pdGlvbihnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSkuZ2V0TGlua0xhYmVsKCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIGdldE1hcHBpbmdVaURlZmluaXRpb24obWFwcGluZ0tleSkuZ2V0TGlua0xhYmVsKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIG1vcnBoTWFwcGluZyhNYXBwaW5nVWlEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShkZWZpbml0aW9uLmdldEtleSgpKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFBlcnNpc3RlbnRBdHRyaWJ1dGUsID8+PiBtYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKLQkJCQlyZXR1cm4gYXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlLCA/Pj4gYXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBnZXRKcGFQbGF0Zm9ybVVpKCkuYXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoZ2V0U3ViamVjdCgpLmdldFJlc291cmNlVHlwZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uIGdldERlZmF1bHREZWZpbml0aW9uKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdERlZmluaXRpb24oZ2V0U3ViamVjdCgpLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb24gZ2V0RGVmYXVsdERlZmluaXRpb24oU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJcmV0dXJuIGdldEpwYVBsYXRmb3JtVWkoKS5nZXREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbihnZXRTdWJqZWN0KCkuZ2V0UmVzb3VyY2VUeXBlKCksIG1hcHBpbmdLZXkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBNYXBwaW5nVWlEZWZpbml0aW9uIGdldE1hcHBpbmdVaURlZmluaXRpb24oU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJTWFwcGluZ1VpRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gc3VwZXIuZ2V0TWFwcGluZ1VpRGVmaW5pdGlvbihtYXBwaW5nS2V5KTsKLQkJaWYgKGRlZmluaXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlZmluaXRpb247Ci0JCX0KLQkJcmV0dXJuIFVuc3VwcG9ydGVkT3JtTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbnRBdHRyaWJ1dGUuREVGQVVMVF9NQVBQSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVudEF0dHJpYnV0ZS5TUEVDSUZJRURfTUFQUElOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbnRBdHRyaWJ1dGUuTkFNRV9QUk9QRVJUWSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0KLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBQZXJzaXN0ZW50QXR0cmlidXRlLlNQRUNJRklFRF9NQVBQSU5HX1BST1BFUlRZIHx8Ci0JCSAgICBwcm9wZXJ0eU5hbWUgPT0gUGVyc2lzdGVudEF0dHJpYnV0ZS5ERUZBVUxUX01BUFBJTkdfUFJPUEVSVFkgICB8fAotCQkgICAgcHJvcGVydHlOYW1lID09IFBlcnNpc3RlbnRBdHRyaWJ1dGUuTkFNRV9QUk9QRVJUWSkgewotCi0JCQl1cGRhdGVEZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkNmI5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbFN3aXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiB0aGUgZGV0YWlscyBwYWdlIHJlc3BvbnNpYmxlIHRvIHNob3cgdGhlCi0gKiBpbmZvcm1hdGlvbiBmb3IgYW4gcGVyc2lzdGVudCB0eXBlLgotICoKLSAqIEBzZWUgUGVyc2lzdGVudFR5cGUKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZSBleHRlbmRzIEFic3RyYWN0SnBhRGV0YWlsc1BhZ2U8UGVyc2lzdGVudFR5cGU+Ci17Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBKcGFDb21wb3NpdGU+IG1hcHBpbmdDb21wb3NpdGVzOwotCXByaXZhdGUgUGFnZUJvb2sgbWFwcGluZ1BhZ2VCb29rOwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFR5cGVNYXBwaW5nPiBtYXBwaW5nSG9sZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLm1hcHBpbmdDb21wb3NpdGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKcGFDb21wb3NpdGU+KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIE1hcCBBcyBjb21wb3NpdGUKLQkJbmV3IFBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDAsIDAsIDUsIDApCi0JCSk7Ci0KLQkJLy8gVHlwZSBwcm9wZXJ0aWVzIHBhZ2UKLQkJYnVpbGRNYXBwaW5nUGFnZUJvb2soY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFnZUJvb2sgYnVpbGRNYXBwaW5nUGFnZUJvb2soQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMubWFwcGluZ1BhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLm1hcHBpbmdQYWdlQm9vay5zaG93UGFnZSh0aGlzLmFkZExhYmVsKHRoaXMubWFwcGluZ1BhZ2VCb29rLCAiIikpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgICAgICAgICA9IFNXVC5UT1A7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSAgID0gdHJ1ZTsKLQotCQl0aGlzLm1hcHBpbmdQYWdlQm9vay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXRoaXMubWFwcGluZ0hvbGRlciA9IHRoaXMuYnVpbGRNYXBwaW5nSG9sZGVyKCk7Ci0JCW5ldyBDb250cm9sU3dpdGNoZXIodGhpcy5tYXBwaW5nSG9sZGVyLCB0aGlzLmJ1aWxkUGFuZVRyYW5zZm9ybWVyKCksIHRoaXMubWFwcGluZ1BhZ2VCb29rKTsKLQotCQlyZXR1cm4gdGhpcy5tYXBwaW5nUGFnZUJvb2s7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNmb3JtZXI8VHlwZU1hcHBpbmcsIENvbnRyb2w+IGJ1aWxkUGFuZVRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPFR5cGVNYXBwaW5nLCBDb250cm9sPigpIHsKLQkJCXB1YmxpYyBDb250cm9sIHRyYW5zZm9ybShUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQkJCWlmICh0eXBlTWFwcGluZyA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gZ2V0TWFwcGluZ0NvbXBvc2l0ZSh0eXBlTWFwcGluZy5nZXRLZXkoKSkuZ2V0Q29udHJvbCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFR5cGVNYXBwaW5nPiBidWlsZE1hcHBpbmdIb2xkZXIoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbDxUeXBlTWFwcGluZz4oCi0JCQl0aGlzLm1hcHBpbmdIb2xkZXIsCi0JCQlidWlsZE1hcHBpbmdGaWx0ZXIoa2V5KQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbnRUeXBlLCBUeXBlTWFwcGluZz4gYnVpbGRNYXBwaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW50VHlwZSwgVHlwZU1hcHBpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVudFR5cGUuTUFQUElOR19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRNYXBwaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBGaWx0ZXI8VHlwZU1hcHBpbmc+IGJ1aWxkTWFwcGluZ0ZpbHRlcihmaW5hbCBTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyPFR5cGVNYXBwaW5nPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChUeXBlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQkJcmV0dXJuIChtYXBwaW5nID09IG51bGwgfHwga2V5ID09IG51bGwpIHx8IGtleS5lcXVhbHMobWFwcGluZy5nZXRLZXkoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCi0JcHJpdmF0ZSBKcGFDb21wb3NpdGUgZ2V0TWFwcGluZ0NvbXBvc2l0ZShTdHJpbmcga2V5KSB7Ci0JCUpwYUNvbXBvc2l0ZSBtYXBwaW5nQ29tcG9zaXRlID0gdGhpcy5tYXBwaW5nQ29tcG9zaXRlcy5nZXQoa2V5KTsKLQkJaWYgKG1hcHBpbmdDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG1hcHBpbmdDb21wb3NpdGU7Ci0JCX0KLQotCQltYXBwaW5nQ29tcG9zaXRlID0gYnVpbGRNYXBwaW5nQ29tcG9zaXRlKHRoaXMubWFwcGluZ1BhZ2VCb29rLCBrZXkpOwotCi0JCWlmIChtYXBwaW5nQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCXRoaXMubWFwcGluZ0NvbXBvc2l0ZXMucHV0KGtleSwgbWFwcGluZ0NvbXBvc2l0ZSk7Ci0JCX0KLQotCQlyZXR1cm4gbWFwcGluZ0NvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYUNvbXBvc2l0ZSBidWlsZE1hcHBpbmdDb21wb3NpdGUoUGFnZUJvb2sgcGFnZUJvb2ssIFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldEpwYVBsYXRmb3JtVWkoKS4KLQkJCWJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCQkJZ2V0U3ViamVjdCgpLmdldFJlc291cmNlVHlwZSgpLCAKLQkJCQlrZXksIAotCQkJCXBhZ2VCb29rLCAKLQkJCQlidWlsZE1hcHBpbmdIb2xkZXIoa2V5KSwgCi0JCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlsb2coVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsICJQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmRpc3Bvc2UoKSIpOwotCi0JCWZvciAoSnBhQ29tcG9zaXRlIG1hcHBpbmdDb21wb3NpdGUgOiB0aGlzLm1hcHBpbmdDb21wb3NpdGVzLnZhbHVlcygpKSB7Ci0JCQltYXBwaW5nQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJfQotCQl0aGlzLm1hcHBpbmdDb21wb3NpdGVzLmNsZWFyKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWVhMTQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkRlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyAiTWFwIEFzIiBjb21wb3NpdGUgaXMgcmVzcG9uc2libGUgZm9yIHNob3dpbmcgdGhlIG1hcHBpbmcgbmFtZSBhbmQKLSAqIG1hcHBpbmcgdHlwZSBmb3IgYSB0eXBlLgotICoKLSAqIEBzZWUgSmF2YVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUKLSAqIEBzZWUgT3JtUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZQotCWV4dGVuZHMgTWFwQXNDb21wb3NpdGU8UGVyc2lzdGVudFR5cGU+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZSgKLQkJCVBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbnRUeXBlPiBwYXJlbnRQYW5lLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwcGluZ0NoYW5nZUhhbmRsZXIgYnVpbGRNYXBwaW5nQ2hhbmdlSGFuZGxlcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBwaW5nQ2hhbmdlSGFuZGxlcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBnZXRNYXBwaW5nS2V5KCk7Ci0KLQkJCQlpZiAobWFwcGluZ0tleSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV9tYXBwZWRUeXBlVGV4dDsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFwQXNDb21wb3NpdGVfdW5tYXBwZWRUeXBlVGV4dDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nVGV4dCgpIHsKLQkJCQlTdHJpbmcgbWFwcGluZ0tleSA9IGdldE1hcHBpbmdLZXkoKTsKLQotCQkJCWlmIChtYXBwaW5nS2V5ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcEFzQ29tcG9zaXRlX2NoYW5nZU1hcHBpbmdUeXBlOwotCQkJCX0KLQotCQkJCXJldHVybiBnZXRNYXBwaW5nVWlEZWZpbml0aW9uKG1hcHBpbmdLZXkpLmdldExpbmtMYWJlbCgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3JwaE1hcHBpbmcoTWFwcGluZ1VpRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldE1hcHBpbmdLZXkoZGVmaW5pdGlvbi5nZXRLZXkoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNob3J0TmFtZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFBlcnNpc3RlbnRUeXBlLCA/Pj4gbWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7Ci0JCQkJcmV0dXJuIHR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIEpQVCBwbHVnaW4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzdXBwb3J0ZWQgdHlwZXMgb2YgbWFwcGluZwotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGUsID8+PiB0eXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBnZXRKcGFQbGF0Zm9ybVVpKCkudHlwZU1hcHBpbmdVaURlZmluaXRpb25zKGdldFN1YmplY3QoKS5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbiBnZXREZWZhdWx0RGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGdldEpwYVBsYXRmb3JtVWkoKS5nZXREZWZhdWx0VHlwZU1hcHBpbmdVaURlZmluaXRpb24oZ2V0U3ViamVjdCgpLmdldFJlc291cmNlVHlwZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uIGdldERlZmF1bHREZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCXJldHVybiBnZXREZWZhdWx0RGVmaW5pdGlvbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbnRUeXBlLk1BUFBJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW50VHlwZS5OQU1FX1BST1BFUlRZKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQotCQlpZiAocHJvcGVydHlOYW1lID09IFBlcnNpc3RlbnRUeXBlLk1BUFBJTkdfUFJPUEVSVFkgfHwKLQkJICAgIHByb3BlcnR5TmFtZSA9PSBQZXJzaXN0ZW50VHlwZS5OQU1FX1BST1BFUlRZKSB7Ci0KLQkJCXVwZGF0ZURlc2NyaXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZkNjMxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5EaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBpcyB1c2VkIHRvIGVpdGhlciBjcmVhdGUgb3IgZWRpdCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIHRoYXQKLSAqIGlzIGxvY2F0ZWQgb24gYW4gZW50aXR5LgotICoKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW4KLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3QKLSAqIEBzZWUgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyBleHRlbmRzIEJhc2VKb2luQ29sdW1uRGlhbG9nPFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3Q+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIGVudGl0eSBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdCBpcwotCSAqIGxvY2F0ZWQKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBFaXRoZXIgdGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGlzIHN0YXRlIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKLQkgKi8KLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2coU2hlbGwgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHkgZW50aXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIocGFyZW50LCBlbnRpdHksIGpvaW5Db2x1bW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEaWFsb2dQYW5lPFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3Q+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmU8UHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdD4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQljb250YWluZXIKLQkJKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3QoZ2V0T3duZXIoKSwgZ2V0Sm9pbkNvbHVtbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uVGl0bGUoKSB7Ci0KLQkJaWYgKGdldEpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfYWRkRGVzY3JpcHRpb25UaXRsZTsKLQkJfQotCi0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19lZGl0RGVzY3JpcHRpb25UaXRsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFbnRpdHkgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoRW50aXR5KSBzdXBlci5nZXRPd25lcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0KLQkJaWYgKGdldEpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfYWRkVGl0bGU7Ci0JCX0KLQotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfZWRpdFRpdGxlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ4ZWE2Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5EaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBpcyB1c2VkIHRvIGVpdGhlciBjcmVhdGUgb3IgZWRpdCBhIHByaW1hcnkga2V5IGpvaW5nIGNvbHVtbiB0aGF0Ci0gKiBpcyB3aXRoaW4gYSBzZWNvbmRhcnkgdGFibGUuCi0gKgotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbgotICogQHNlZSBTZWNvbmRhcnlUYWJsZQotICogQHNlZSBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyBleHRlbmRzIEJhc2VKb2luQ29sdW1uRGlhbG9nPFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0PiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gc2Vjb25kYXJ5VGFibGUgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQKLQkgKiBpcyBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gRWl0aGVyIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhpcyBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlzdXBlcihwYXJlbnQsIHNlY29uZGFyeVRhYmxlLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGlhbG9nUGFuZTxQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZTxQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdD4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQljb250YWluZXIKLQkJKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QgYnVpbGRTdGF0ZU9iamVjdCgpIHsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdCgKLQkJCWdldE93bmVyKCksCi0JCQlnZXRKb2luQ29sdW1uKCkKLQkJKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uVGl0bGUoKSB7Ci0KLQkJaWYgKGdldEpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZERlc2NyaXB0aW9uVGl0bGU7Ci0JCX0KLQotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2VkaXREZXNjcmlwdGlvblRpdGxlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gKFByaW1hcnlLZXlKb2luQ29sdW1uKSBzdXBlci5nZXRKb2luQ29sdW1uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFNlY29uZGFyeVRhYmxlIGdldE93bmVyKCkgewotCQlyZXR1cm4gKFNlY29uZGFyeVRhYmxlKSBzdXBlci5nZXRPd25lcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0KLQkJaWYgKGdldEpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZFRpdGxlOwotCQl9Ci0KLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0VGl0bGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI1ZWNjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogVGhlIHN0YXRlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSBvciBlZGl0IGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gb24gYW4KLSAqIHNlY29uZGFyeSB0YWJsZS4KLSAqCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uCi0gKiBAc2VlIFNlY29uZGFyeVRhYmxlCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc2Vjb25kYXJ5VGFibGUgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQKLQkgKiBpcyBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgdG8KLQkgKiBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0KFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIoc2Vjb25kYXJ5VGFibGUsIGpvaW5Db2x1bW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXROYW1lVGFibGUoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldERiVGFibGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2Vjb25kYXJ5VGFibGUgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoU2Vjb25kYXJ5VGFibGUpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRQYXJlbnQoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5pdGlhbFRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFN0cmluZz4oZ2V0SW5pdGlhbFRhYmxlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk0NTJmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6ICAKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCBvIFByaW1hcnkga2V5IGpvaW4gY29sdW1ucyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwKLSAqIHwgfCAgICAgKG5vIGFjdHVhbCBjb250ZW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBQcmltYXJ5S2V5Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2V9Ci0gKiBAc2VlIHtAbGluayBQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneX0KLSAqIEBzZWUge0BsaW5rIE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZSAKLQlleHRlbmRzIEFic3RyYWN0Sm9pbmluZ1N0cmF0ZWd5UGFuZQotCQk8UHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneT4KLXsKLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKAotCQkJUGFuZTw/IGV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlPiBwYXJlbnRQYW5lLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVc2VzU3RyYXRlZ3lIb2xkZXIoKSB7Ci0JCXJldHVybiBidWlsZFVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyCi0JCQkJPFByaW1hcnlLZXlKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+KAotCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkU3RyYXRlZ3lEZXRhaWxzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIEJvb2xlYW4+KAotCQkJCXN1YmplY3RIb2xkZXIsIFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5QUkVET01JTkFOVF9KT0lOSU5HX1NUUkFURUdZX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyBCb29sZWFuLkZBTFNFIDoKLQkJCQkJQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC51c2VzUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gQm9vbGVhbi5UUlVFKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwotCQkJCX0KLQkJCQkvL3ZhbHVlID09IEZBTFNFIC0gc2VsZWN0aW9uIG9mIGFub3RoZXIgcmFkaW8gYnV0dG9uIGNhdXNlcyB0aGlzIHN0cmF0ZWd5IHRvIGdldCB1bnNldAotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZWJjMmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBUaGUgc3RhdGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIG9yIGVkaXQgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBvbiBhbgotICogZW50aXR5LgotICoKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW4KLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdCBleHRlbmRzIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3Q8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGVudGl0eSBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdCBpcwotCSAqIGxvY2F0ZWQKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBUaGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGlzCi0JICogdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3QoRW50aXR5IGVudGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKGVudGl0eSwgam9pbkNvbHVtbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gKFByaW1hcnlLZXlKb2luQ29sdW1uKSBzdXBlci5nZXRKb2luQ29sdW1uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldE5hbWVUYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRW50aXR5IGdldE93bmVyKCkgewotCQlyZXR1cm4gKEVudGl0eSkgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZE5hbWVUYWJsZSgpIHsKLQkJRW50aXR5IHBhcmVudEVudGl0eSA9IGdldE93bmVyKCkuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCXJldHVybiAocGFyZW50RW50aXR5ID09IG51bGwpID8gZ2V0T3duZXIoKS5nZXRQcmltYXJ5RGJUYWJsZSgpIDogcGFyZW50RW50aXR5LmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbml0aWFsVGFibGUoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldFByaW1hcnlUYWJsZU5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFibGVzKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8U3RyaW5nPihnZXRJbml0aWFsVGFibGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZmFhYTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Qb3N0RXhlY3V0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLSBKb2luIENvbHVtbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgU2Vjb25kYXJ5VGFibGUKLSAqIEBzZWUgRW50aXR5Q29tcG9zaXRlIC0gVGhlIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgQWRkUmVtb3ZlTGlzdFBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPFNlY29uZGFyeVRhYmxlPgotewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5Ib2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgU2Vjb25kYXJ5VGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SVNlY29uZGFyeVRhYmxlPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTZWNvbmRhcnlUYWJsZT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKLQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IHN0YXRlT2JqZWN0LmdldE93bmVyKCk7Ci0JCWludCBpbmRleCA9IHNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgpOwotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2coZ2V0U2hlbGwoKSwgZ2V0U3ViamVjdCgpLCBudWxsKTsKLQotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEFkZFByaW1hcnlLZXlKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248UHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nPiBidWlsZEFkZFByaW1hcnlLZXlKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2cpIHsKLQkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQkJCWFkZEpvaW5Db2x1bW4oZGlhbG9nLmdldFN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ29udHJvbEJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8U2Vjb25kYXJ5VGFibGUsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oU2Vjb25kYXJ5VGFibGUgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZighdmFsdWUuaXNWaXJ0dWFsKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTZWNvbmRhcnlUYWJsZSwgUHJpbWFyeUtleUpvaW5Db2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSwgU2Vjb25kYXJ5VGFibGUuREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UHJpbWFyeUtleUpvaW5Db2x1bW4+KAotCQkJYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZz4gYnVpbGRFZGl0UHJpbWFyeUtleUpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248UHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJZWRpdFByaW1hcnlLZXlKb2luQ29sdW1uKGRpYWxvZy5nZXRTdWJqZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEpvaW5Db2x1bW5MYWJlbChQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJaWYgKGpvaW5Db2x1bW4uaXNWaXJ0dWFsKCkpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNEZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0JvdGhEZWZhdWx0LAotCQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCQkJKTsKLQkJCX0KLQotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0ZpcnN0RGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQotCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCi0JCXJldHVybiBOTFMuYmluZCgKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtcywKLQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgZWxlbWVudDsKLQkJCQlyZXR1cm4gYnVpbGRKb2luQ29sdW1uTGFiZWwoam9pbkNvbHVtbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpOwotCX0KLQotCXByaXZhdGUgQWRkUmVtb3ZlUGFuZS5BZGFwdGVyIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZVBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2VkaXQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtbihsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlyZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJTGlzdDxMaXN0VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5MaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiwgUHJpbWFyeUtleUpvaW5Db2x1bW4+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oCi0JCQlidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSwKLQkJCU5hbWVkQ29sdW1uLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZLAotCQkJTmFtZWRDb2x1bW4uREVGQVVMVF9OQU1FX1BST1BFUlRZLAotCQkJQmFzZUpvaW5Db2x1bW4uU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksCi0JCQlCYXNlSm9pbkNvbHVtbi5ERUZBVUxUX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxTZWNvbmRhcnlUYWJsZSwgUHJpbWFyeUtleUpvaW5Db2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSwgU2Vjb25kYXJ5VGFibGUuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2coCi0JCQkJZ2V0U2hlbGwoKSwKLQkJCQlnZXRTdWJqZWN0KCksCi0JCQkJam9pbkNvbHVtbgotCQkJKTsKLQotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgewotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKHN0YXRlT2JqZWN0LmdldEpvaW5Db2x1bW4oKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQlqb2luQ29sdW1uSG9sZGVyID0gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbkhvbGRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyBncm91cCBwYW5lCi0JCUdyb3VwIGdyb3VwUGFuZSA9IGFkZFRpdGxlZEdyb3VwKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX3ByaW1hcnlLZXlKb2luQ29sdW1uCi0JCSk7Ci0KLQkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBjaGVjayBib3gKLQkJYWRkQ2hlY2tCb3goCi0JCQlhZGRTdWJQYW5lKGdyb3VwUGFuZSwgOCksCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLAotCQkJYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCksCi0JCQludWxsLAotCQkJYnVpbGRDb250cm9sQm9vbGVhbkhvbGRlcigpCi0JCSk7Ci0KLQkJLy8gUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zIGxpc3QgcGFuZQotCQlBZGRSZW1vdmVMaXN0UGFuZTxTZWNvbmRhcnlUYWJsZT4gam9pbkNvbHVtbnNQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPFNlY29uZGFyeVRhYmxlPigKLQkJCXRoaXMsCi0JCQlncm91cFBhbmUsCi0JCQlidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0TW9kZWwoKSwKLQkJCWpvaW5Db2x1bW5Ib2xkZXIsCi0JCQlidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9DT0xVTU5TCi0JCSk7Ci0KLQkJaW5zdGFsbFByaW1hcnlLZXlKb2luQ29sdW1uTGlzdFBhbmVFbmFibGVyKGpvaW5Db2x1bW5zUGFuZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQcmltYXJ5S2V5Sm9pbkNvbHVtbkxpc3RQYW5lRW5hYmxlcihBZGRSZW1vdmVMaXN0UGFuZTxTZWNvbmRhcnlUYWJsZT4gcGtKb2luQ29sdW1uTGlzdFBhbmUpIHsKLQotCQluZXcgUGFuZUVuYWJsZXIoCi0JCQlidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSwKLQkJCXBrSm9pbkNvbHVtbkxpc3RQYW5lCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJaW50W10gc2VsZWN0ZWRJbmRpY2VzID0gbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkSW5kaWNlcygpOwotCi0JCWZvciAoaW50IGluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKLQkJCWdldFN1YmplY3QoKS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihzZWxlY3RlZEluZGljZXNbaW5kZXhdKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVKb2luQ29sdW1ucyhib29sZWFuIHNlbGVjdGVkKSB7Ci0KLQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCXRyeSB7Ci0JCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldFN1YmplY3QoKTsKLQotCQkJLy8gQWRkIGEgam9pbiBjb2x1bW4gYnkgY3JlYXRpbmcgYSBzcGVjaWZpZWQgb25lIHVzaW5nIHRoZSBkZWZhdWx0Ci0JCQkvLyBvbmUgaWYgaXQgZXhpc3RzCi0JCQlpZiAoc2VsZWN0ZWQpIHsKLQotCQkJCVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0KLQkJCQlpZiAoZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCk7Ci0JCQkJCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCi0JCQkJCVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IHNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQkJCQlwa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShjb2x1bW5OYW1lKTsKLQkJCQkJcGtKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQotCQkJCQlqb2luQ29sdW1uSG9sZGVyLnNldFZhbHVlKHBrSm9pbkNvbHVtbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9yIChpbnQgaW5kZXggPSBzZWNvbmRhcnlUYWJsZS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQkJCXNlY29uZGFyeVRhYmxlLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlciBleHRlbmRzIExpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEJvb2xlYW4+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gewotCi0JCXB1YmxpYyBPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQkJc3VwZXIoYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCWlmIChnZXRTdWJqZWN0KCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJfQotCQkJcmV0dXJuICFnZXRTdWJqZWN0KCkuaXNWaXJ0dWFsKCkgJiYgbGlzdEhvbGRlci5zaXplKCkgPiAwOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQkJdXBkYXRlSm9pbkNvbHVtbnModmFsdWUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUXVlcmllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9RdWVyaWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZmU4MTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9RdWVyaWVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBsaXN0IG9mIG5hbWVkIHF1ZXJpZXMgYW5kIG5hbWVkIG5hdGl2ZSBxdWVyaWVzLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZSBvciBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBRdWVyeQotICogQHNlZSBOYW1lZE5hdGl2ZVF1ZXJ5Ci0gKiBAc2VlIE5hbWVkUXVlcnkKLSAqIEBzZWUgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUKLSAqIEBzZWUgTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWVyaWVzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxRdWVyeUNvbnRhaW5lcj4KLXsKLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lPFF1ZXJ5Q29udGFpbmVyPiBsaXN0UGFuZTsKLQlwcml2YXRlIE5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZSBuYW1lZE5hdGl2ZVF1ZXJ5UGFuZTsKLQlwcml2YXRlIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZTw/IGV4dGVuZHMgTmFtZWRRdWVyeT4gbmFtZWRRdWVyeVBhbmU7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeT4gcXVlcnlIb2xkZXI7Ci0KLQotCXB1YmxpYyBRdWVyaWVzQ29tcG9zaXRlKAotCQlQYW5lPD8+IHBhcmVudFBhbmUsIAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFF1ZXJ5Q29udGFpbmVyPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkUXVlcnkoKSB7Ci0JCWFkZFF1ZXJ5RnJvbURpYWxvZyhidWlsZEFkZFF1ZXJ5RGlhbG9nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQWRkUXVlcnlEaWFsb2cgYnVpbGRBZGRRdWVyeURpYWxvZygpIHsKLQkJcmV0dXJuIG5ldyBBZGRRdWVyeURpYWxvZyhnZXRTaGVsbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRRdWVyeUZyb21EaWFsb2coQWRkUXVlcnlEaWFsb2cgZGlhbG9nKSB7Ci0JCWlmIChkaWFsb2cub3BlbigpICE9IFdpbmRvdy5PSykgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBxdWVyeVR5cGUgPSBkaWFsb2cuZ2V0UXVlcnlUeXBlKCk7Ci0JCVF1ZXJ5IHF1ZXJ5OwotCQlpZiAocXVlcnlUeXBlID09IFF1ZXJ5Lk5BTUVEX1FVRVJZKSB7Ci0JCQlxdWVyeSA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZE5hbWVkUXVlcnkoZ2V0U3ViamVjdCgpLm5hbWVkUXVlcmllc1NpemUoKSk7Ci0JCX0KLQkJZWxzZSBpZiAocXVlcnlUeXBlID09IFF1ZXJ5Lk5BTUVEX05BVElWRV9RVUVSWSkgewotCQkJcXVlcnkgPSB0aGlzLmdldFN1YmplY3QoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KGdldFN1YmplY3QoKS5uYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXF1ZXJ5LnNldE5hbWUoZGlhbG9nLmdldE5hbWUoKSk7Ci0JCXRoaXMuZ2V0UXVlcnlIb2xkZXIoKS5zZXRWYWx1ZShxdWVyeSk7Ly9zbyB0aGF0IGl0IGdldHMgc2VsZWN0ZWQgaW4gdGhlIExpc3QgZm9yIHRoZSB1c2VyIHRvIGVkaXQKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFF1ZXJ5PiBidWlsZERpc3BsYXlhYmxlUXVlcmllc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFF1ZXJ5PigKLQkJCWJ1aWxkUXVlcmllc0xpc3RIb2xkZXIoKSwKLQkJCVF1ZXJ5Lk5BTUVfUFJPUEVSVFkKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxRdWVyeUNvbnRhaW5lcj4gYWRkTGlzdFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8UXVlcnlDb250YWluZXI+KAotCQkJdGhpcywKLQkJCWNvbnRhaW5lciwKLQkJCWJ1aWxkUXVlcmllc0FkYXB0ZXIoKSwKLQkJCWJ1aWxkRGlzcGxheWFibGVRdWVyaWVzTGlzdEhvbGRlcigpLAotCQkJdGhpcy5nZXRRdWVyeUhvbGRlcigpLAotCQkJYnVpbGRRdWVyaWVzTGlzdExhYmVsUHJvdmlkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfTkFNRURfUVVFUklFUwotCQkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8TmFtZWROYXRpdmVRdWVyeT4gYnVpbGROYW1lZE5hdGl2ZVF1ZXJpZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFF1ZXJ5Q29udGFpbmVyLCBOYW1lZE5hdGl2ZVF1ZXJ5PigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCVF1ZXJ5Q29udGFpbmVyLk5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxOYW1lZE5hdGl2ZVF1ZXJ5PiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWVkTmF0aXZlUXVlcmllc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxOYW1lZE5hdGl2ZVF1ZXJ5PiBidWlsZE5hbWVkTmF0aXZlUXVlcnlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnksIE5hbWVkTmF0aXZlUXVlcnk+KHRoaXMuZ2V0UXVlcnlIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTmFtZWROYXRpdmVRdWVyeSB0cmFuc2Zvcm1fKFF1ZXJ5IHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWVkTmF0aXZlUXVlcnkpID8gKE5hbWVkTmF0aXZlUXVlcnkpIHZhbHVlIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE5hbWVkUXVlcnk+IGJ1aWxkTmFtZWRRdWVyaWVzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxRdWVyeUNvbnRhaW5lciwgTmFtZWRRdWVyeT4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlRdWVyeUNvbnRhaW5lci5OQU1FRF9RVUVSSUVTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxOYW1lZFF1ZXJ5PiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZWRRdWVyaWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWVkUXVlcmllc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxOYW1lZFF1ZXJ5PiBidWlsZE5hbWVkUXVlcnlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnksIE5hbWVkUXVlcnk+KHRoaXMuZ2V0UXVlcnlIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTmFtZWRRdWVyeSB0cmFuc2Zvcm1fKFF1ZXJ5IHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWVkUXVlcnkpID8gKE5hbWVkUXVlcnkpIHZhbHVlIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPFF1ZXJ5LCBDb250cm9sPiBidWlsZFBhbmVUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxRdWVyeSwgQ29udHJvbD4oKSB7Ci0JCQlwdWJsaWMgQ29udHJvbCB0cmFuc2Zvcm0oUXVlcnkgcXVlcnkpIHsKLQotCQkJCWlmIChxdWVyeSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCWlmIChxdWVyeSBpbnN0YW5jZW9mIE5hbWVkTmF0aXZlUXVlcnkpIHsKLQkJCQkJcmV0dXJuIFF1ZXJpZXNDb21wb3NpdGUudGhpcy5uYW1lZE5hdGl2ZVF1ZXJ5UGFuZS5nZXRDb250cm9sKCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIFF1ZXJpZXNDb21wb3NpdGUudGhpcy5uYW1lZFF1ZXJ5UGFuZS5nZXRDb250cm9sKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZFF1ZXJpZXNBZGFwdGVyKCkgewotCi0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRRdWVyeSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBOYW1lZFF1ZXJ5KSB7Ci0JCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlTmFtZWRRdWVyeSgoTmFtZWRRdWVyeSkgaXRlbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgoTmFtZWROYXRpdmVRdWVyeSkgaXRlbSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxRdWVyeT4gYnVpbGRRdWVyaWVzTGlzdEhvbGRlcigpIHsKLQkJTGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgUXVlcnk+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgUXVlcnk+PigpOwotCQlsaXN0LmFkZChidWlsZE5hbWVkUXVlcmllc0xpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkTmFtZWROYXRpdmVRdWVyaWVzTGlzdEhvbGRlcigpKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgUXVlcnk+LCBRdWVyeT4obGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZFF1ZXJpZXNMaXN0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlRdWVyeSBxdWVyeSA9IChRdWVyeSkgZWxlbWVudDsKLQkJCQlTdHJpbmcgbmFtZSA9IHF1ZXJ5LmdldE5hbWUoKTsKLQotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJaW50IGluZGV4ID0gLTE7Ci0KLQkJCQkJaWYgKHF1ZXJ5IGluc3RhbmNlb2YgTmFtZWRRdWVyeSkgewotCQkJCQkJaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihnZXRTdWJqZWN0KCkubmFtZWRRdWVyaWVzKCksIHF1ZXJ5KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2YoZ2V0U3ViamVjdCgpLm5hbWVkTmF0aXZlUXVlcmllcygpLCBxdWVyeSk7Ci0JCQkJCX0KLQotCQkJCQluYW1lID0gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuUXVlcmllc0NvbXBvc2l0ZV9kaXNwbGF5U3RyaW5nLCBpbmRleCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeT4gYnVpbGRRdWVyeUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnk+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKLQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQkJdGhpcy5saXN0UGFuZS5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5xdWVyeUhvbGRlciA9IGJ1aWxkUXVlcnlIb2xkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBMaXN0IHBhbmUKLQkJdGhpcy5saXN0UGFuZSA9IHRoaXMuYWRkTGlzdFBhbmUoY29udGFpbmVyKTsKLQotCQkvLyBQcm9wZXJ0eSBwYW5lCi0JCVBhZ2VCb29rIHBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkvLyBOYW1lZCBRdWVyeSBwcm9wZXJ0eSBwYW5lCi0JCXRoaXMubmFtZWRRdWVyeVBhbmUgPSB0aGlzLmJ1aWxkTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlKHBhZ2VCb29rKTsKLQotCQkvLyBOYW1lZCBOYXRpdmUgUXVlcnkgcHJvcGVydHkgcGFuZQotCQl0aGlzLm5hbWVkTmF0aXZlUXVlcnlQYW5lID0gbmV3IE5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQl0aGlzLmJ1aWxkTmFtZWROYXRpdmVRdWVyeUhvbGRlcigpLAotCQkJcGFnZUJvb2sKLQkJKTsKLQotCQlpbnN0YWxsUGFuZVN3aXRjaGVyKHBhZ2VCb29rKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZTw/IGV4dGVuZHMgTmFtZWRRdWVyeT4gYnVpbGROYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGUoUGFnZUJvb2sgcGFnZUJvb2spIHsKLQkJcmV0dXJuIG5ldyBOYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGU8TmFtZWRRdWVyeT4oCi0JCQl0aGlzLAotCQkJdGhpcy5idWlsZE5hbWVkUXVlcnlIb2xkZXIoKSwKLQkJCXBhZ2VCb29rCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lU3dpdGNoZXIoUGFnZUJvb2sgcGFnZUJvb2spIHsKLQkJbmV3IENvbnRyb2xTd2l0Y2hlcih0aGlzLmdldFF1ZXJ5SG9sZGVyKCksIHRoaXMuYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSwgcGFnZUJvb2spOwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnk+IGdldFF1ZXJ5SG9sZGVyKCkgewotCQlyZXR1cm4gcXVlcnlIb2xkZXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUXVlcnlIaW50c0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9RdWVyeUhpbnRzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OWU3YzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9RdWVyeUhpbnRzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVUYWJsZVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEFkZFJlbW92ZVRhYmxlUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBRdWVyeQotICogQHNlZSBRdWVyeUhpbnQKLSAqIEBzZWUgQWRkUmVtb3ZlVGFibGVQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFF1ZXJ5SGludHNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPFF1ZXJ5PgotewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnlIaW50PiBxdWVyeUhpbnRIb2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlF1ZXJ5SGludHNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBRdWVyeUhpbnRzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIFF1ZXJ5PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBjb250YWluZXIpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShRdWVyeSBxdWVyeSkgewotCQkJCXJldHVybiAocXVlcnkgIT0gbnVsbCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUXVlcnlIaW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVUYWJsZVBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJUXVlcnlIaW50IHF1ZXJ5SGludCA9IGdldFN1YmplY3QoKS5hZGRIaW50KGdldFN1YmplY3QoKS5oaW50c1NpemUoKSk7Ci0JCQkJcXVlcnlIaW50SG9sZGVyLnNldFZhbHVlKHF1ZXJ5SGludCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlSGludCgoUXVlcnlIaW50KSBpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeUhpbnQ+IGJ1aWxkUXVlcnlIaW50SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeUhpbnQ+KCk7Ci0JfTsKLQotCXByaXZhdGUgSVRhYmxlTGFiZWxQcm92aWRlciBidWlsZFF1ZXJ5SGludExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxRdWVyeUhpbnQ+IGJ1aWxkUXVlcnlIaW50TGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxRdWVyeSwgUXVlcnlIaW50PihnZXRTdWJqZWN0SG9sZGVyKCksIE5hbWVkUXVlcnkuSElOVFNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFF1ZXJ5SGludD4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5oaW50cygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuaGludHNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQlxdWVyeUhpbnRIb2xkZXIgPSBidWlsZFF1ZXJ5SGludEhvbGRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVRhYmxlUGFuZSB0YWJsZVBhbmUgPSBuZXcgVGFibGVQYW5lKGNvbnRhaW5lcik7Ci0JCWluc3RhbGxQYW5lRW5hYmxlcih0YWJsZVBhbmUpOwotCX0KLQotCXByaXZhdGUgUGFuZUVuYWJsZXIgaW5zdGFsbFBhbmVFbmFibGVyKFRhYmxlUGFuZSB0YWJsZVBhbmUpIHsKLQkJcmV0dXJuIG5ldyBQYW5lRW5hYmxlcihidWlsZFBhbmVFbmFibGVIb2xkZXIoKSwgdGFibGVQYW5lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBRdWVyeUhpbnRDb2x1bW5BZGFwdGVyIGltcGxlbWVudHMgQ29sdW1uQWRhcHRlcjxRdWVyeUhpbnQ+IHsKLQotCQlzdGF0aWMgZmluYWwgaW50IENPTFVNTl9DT1VOVCA9IDI7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgTkFNRV9DT0xVTU5fSU5ERVggPSAwOwotCQlzdGF0aWMgZmluYWwgaW50IFZBTFVFX0NPTFVNTl9JTkRFWCA9IDE7Ci0KLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcihRdWVyeUhpbnQgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UXVlcnlIaW50LCBTdHJpbmc+KFF1ZXJ5SGludC5OQU1FX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBidWlsZFZhbHVlSG9sZGVyKFF1ZXJ5SGludCBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxRdWVyeUhpbnQsIFN0cmluZz4oUXVlcnlIaW50LlZBTFVFX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0VmFsdWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXN1YmplY3Quc2V0VmFsdWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBjZWxsTW9kZWxzKFF1ZXJ5SGludCBzdWJqZWN0KSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIG1vZGVscyA9IG5ldyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltDT0xVTU5fQ09VTlRdOwotCQkJbW9kZWxzW05BTUVfQ09MVU1OX0lOREVYXSAgPSBidWlsZE5hbWVIb2xkZXIoc3ViamVjdCk7Ci0JCQltb2RlbHNbVkFMVUVfQ09MVU1OX0lOREVYXSA9IGJ1aWxkVmFsdWVIb2xkZXIoc3ViamVjdCk7Ci0JCQlyZXR1cm4gbW9kZWxzOwotCQl9Ci0KLQkJcHVibGljIGludCBjb2x1bW5Db3VudCgpIHsKLQkJCXJldHVybiBDT0xVTU5fQ09VTlQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGNvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIFF1ZXJ5SGludENvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU5fSU5ERVg6IHsKLQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlF1ZXJ5SGludHNDb21wb3NpdGVfbmFtZUNvbHVtbjsKLQkJCQl9Ci0KLQkJCQljYXNlIFF1ZXJ5SGludENvbHVtbkFkYXB0ZXIuVkFMVUVfQ09MVU1OX0lOREVYOiB7Ci0JCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5RdWVyeUhpbnRzQ29tcG9zaXRlX3ZhbHVlQ29sdW1uOwotCQkJCX0KLQotCQkJCWRlZmF1bHQ6IHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCi0JCQlRdWVyeUhpbnQgcXVlcnlIaW50ID0gKFF1ZXJ5SGludCkgZWxlbWVudDsKLQkJCVN0cmluZyB2YWx1ZSA9ICIiOwotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSBRdWVyeUhpbnRDb2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OX0lOREVYOiB7Ci0JCQkJCXZhbHVlID0gcXVlcnlIaW50LmdldE5hbWUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJY2FzZSBRdWVyeUhpbnRDb2x1bW5BZGFwdGVyLlZBTFVFX0NPTFVNTl9JTkRFWDogewotCQkJCQl2YWx1ZSA9IHF1ZXJ5SGludC5nZXRWYWx1ZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJdmFsdWUgPSAiIjsKLQkJCX0KLQotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZVBhbmUgZXh0ZW5kcyBBZGRSZW1vdmVUYWJsZVBhbmU8UXVlcnk+IHsKLQotCQlwcml2YXRlIFRhYmxlUGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihRdWVyeUhpbnRzQ29tcG9zaXRlLnRoaXMsCi0JCQkgICAgICBwYXJlbnQsCi0JCQkgICAgICBidWlsZFF1ZXJ5SGludEFkYXB0ZXIoKSwKLQkJCSAgICAgIGJ1aWxkUXVlcnlIaW50TGlzdEhvbGRlcigpLAotCQkJICAgICAgcXVlcnlIaW50SG9sZGVyLAotCQkJICAgICAgYnVpbGRRdWVyeUhpbnRMYWJlbFByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcHJpdmF0ZSBDZWxsRWRpdG9yW10gYnVpbGRDZWxsRWRpdG9ycyhUYWJsZSB0YWJsZSkgewotCQkJcmV0dXJuIG5ldyBDZWxsRWRpdG9yW10gewotCQkJCW5ldyBUZXh0Q2VsbEVkaXRvcih0YWJsZSksCi0JCQkJbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgSUNlbGxNb2RpZmllciBidWlsZENlbGxNb2RpZmllcigpIHsKLQkJCXJldHVybiBuZXcgSUNlbGxNb2RpZmllcigpIHsKLQotCQkJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCQlRdWVyeUhpbnQgcXVlcnlIaW50ID0gKFF1ZXJ5SGludCkgZWxlbWVudDsKLQkJCQkJU3RyaW5nIHZhbHVlID0gIiI7Ci0KLQkJCQkJaWYgKHByb3BlcnR5ID09IFF1ZXJ5SGludC5OQU1FX1BST1BFUlRZKSB7Ci0JCQkJCQl2YWx1ZSA9IHF1ZXJ5SGludC5nZXROYW1lKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocHJvcGVydHkgPT0gUXVlcnlIaW50LlZBTFVFX1BST1BFUlRZKSB7Ci0JCQkJCQl2YWx1ZSA9IHF1ZXJ5SGludC5nZXRWYWx1ZSgpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gIiI7Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotCQkJCQlRdWVyeUhpbnQgcXVlcnlIaW50OwotCi0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gKFRhYmxlSXRlbSkgZWxlbWVudDsKLQkJCQkJCXF1ZXJ5SGludCA9IChRdWVyeUhpbnQpIHRhYmxlSXRlbS5nZXREYXRhKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlxdWVyeUhpbnQgPSAoUXVlcnlIaW50KSBlbGVtZW50OwotCQkJCQl9Ci0KLQkJCQkJaWYgKHByb3BlcnR5ID09IFF1ZXJ5SGludC5OQU1FX1BST1BFUlRZKSB7Ci0JCQkJCQkgcXVlcnlIaW50LnNldE5hbWUodmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocHJvcGVydHkgPT0gUXVlcnlIaW50LlZBTFVFX1BST1BFUlRZKSB7Ci0JCQkJCQkgcXVlcnlIaW50LnNldFZhbHVlKHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sdW1uQWRhcHRlcjw/PiBidWlsZENvbHVtbkFkYXB0ZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFF1ZXJ5SGludENvbHVtbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nW10gYnVpbGRDb2x1bW5Qcm9wZXJ0aWVzKCkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0JCQkJUXVlcnlIaW50Lk5BTUVfUFJPUEVSVFksCi0JCQkJUXVlcnlIaW50LlZBTFVFX1BST1BFUlRZCi0JCQl9OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYWluQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCQlzdXBlci5pbml0aWFsaXplTWFpbkNvbXBvc2l0ZSgKLQkJCQljb250YWluZXIsCi0JCQkJYWRhcHRlciwKLQkJCQlsaXN0SG9sZGVyLAotCQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCQlsYWJlbFByb3ZpZGVyLAotCQkJCWhlbHBJZAotCQkJKTsKLQotCQkJVGFibGUgdGFibGUgPSBnZXRNYWluQ29udHJvbCgpOwotCi0JCQlUYWJsZVZpZXdlciB0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCQl0YWJsZVZpZXdlci5zZXRDZWxsRWRpdG9ycyhidWlsZENlbGxFZGl0b3JzKHRhYmxlKSk7Ci0JCQl0YWJsZVZpZXdlci5zZXRDZWxsTW9kaWZpZXIoYnVpbGRDZWxsTW9kaWZpZXIoKSk7Ci0JCQl0YWJsZVZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGJ1aWxkQ29sdW1uUHJvcGVydGllcygpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1JlZmVyZW5jZVRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1JlZmVyZW5jZVRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MjEzNDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9SZWZlcmVuY2VUYWJsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWZlcmVuY2VUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5Kb2luQ29sdW1uc0NvbXBvc2l0ZS5Kb2luQ29sdW1uc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5DYXRhbG9nQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuU2NoZW1hQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuVGFibGVDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBvc3RFeGVjdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlZhbHVlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZlcmVuY2VUYWJsZUNvbXBvc2l0ZTxUIGV4dGVuZHMgUmVmZXJlbmNlVGFibGU+IGV4dGVuZHMgUGFuZTxUPgotewotCXByb3RlY3RlZCBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveDsKLQotCXByb3RlY3RlZCBKb2luQ29sdW1uc0NvbXBvc2l0ZTxUPiBqb2luQ29sdW1uc0NvbXBvc2l0ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UmVmZXJlbmNlVGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIFJlZmVyZW5jZVRhYmxlQ29tcG9zaXRlKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UmVmZXJlbmNlVGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5Db2xsZWN0aW9uVGFibGUyXzA8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgUmVmZXJlbmNlVGFibGVDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsSm9pbkNvbHVtbnNQYW5lRW5hYmxlcihKb2luQ29sdW1uc0NvbXBvc2l0ZTxUPiBwYW5lKSB7Ci0JCXBhbmUuaW5zdGFsbEpvaW5Db2x1bW5zUGFuZUVuYWJsZXIobmV3IEpvaW5Db2x1bW5QYW5lRW5hYmxlckhvbGRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSm9pbkNvbHVtbihUIHJlZmVyZW5jZVRhYmxlKSB7Ci0KLQkJSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZURpYWxvZyhnZXRTaGVsbCgpLCByZWZlcmVuY2VUYWJsZSwgbnVsbCk7Ci0KLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGRBZGRKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSm9pbkNvbHVtbkZyb21EaWFsb2coSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVTdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgewotCQlpbnQgaW5kZXggPSBnZXRTdWJqZWN0KCkuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0U3ViamVjdCgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW5kZXgpOwotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQl0aGlzLnNldFNlbGVjdGVkSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLnNldFNlbGVjdGVkSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248Sm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVEaWFsb2c+IGJ1aWxkQWRkSm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZURpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJYWRkSm9pbkNvbHVtbkZyb21EaWFsb2coZGlhbG9nLmdldFN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZURpYWxvZz4gYnVpbGRFZGl0Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZURpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJZWRpdEpvaW5Db2x1bW4oZGlhbG9nLmdldFN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBKb2luQ29sdW1uc1Byb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNFZGl0b3IoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbnNQcm92aWRlcigpOwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpOwotCX0KLQkJCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxULCBKb2luQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCksIFJlZmVyZW5jZVRhYmxlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IGdyb3VwQm94TWFyZ2luKSB7Ci0JCXJldHVybiBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDEwLCBncm91cEJveE1hcmdpbik7Ci0JfQotCi0JcHJvdGVjdGVkIFRhYmxlQ29tYm88VD4gYWRkVGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBUYWJsZUNvbWJvPFQ+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCQkJCWlmIChwcm9wZXJ0eU5hbWUgPT0gVGFibGUuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkgCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZS5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZS5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkKLQkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZICkgewotCQkJCQlyZXBvcHVsYXRlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0TmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZE5hbWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2NoZW1hIGdldERiU2NoZW1hXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGJTY2hlbWEoKTsKLQkJCX0KLQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgU2NoZW1hQ29tYm88VD4gYWRkU2NoZW1hQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgU2NoZW1hQ29tYm88VD4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHByb3BlcnR5TmFtZSA9PSBUYWJsZS5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkKLQkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZICkgewotCQkJCQlyZXBvcHVsYXRlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkU2NoZW1hKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENhdGFsb2dDb21ibzxUPiBhZGRDYXRhbG9nQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2F0YWxvZ0NvbWJvPFQ+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0Q2F0YWxvZygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZENhdGFsb2codmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZENhdGFsb2coKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZWRpdEpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZURpYWxvZyhnZXRTaGVsbCgpLCBnZXRTdWJqZWN0KCksIGpvaW5Db2x1bW4pOwotCi0JCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkRWRpdEpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0Sm9pbkNvbHVtbihKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZVN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oc3RhdGVPYmplY3QuZ2V0Sm9pbkNvbHVtbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSm9pbkNvbHVtbnMoKSB7Ci0JCWlmICh0aGlzLmlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVQgcmVmZXJlbmNlVGFibGUgPSB0aGlzLmdldFN1YmplY3QoKTsKLQkJaWYgKHJlZmVyZW5jZVRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJYm9vbGVhbiBzZWxlY3RlZCA9IHRoaXMub3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLQkJdGhpcy5zZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCXRyeSB7Ci0JCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCQlyZWZlcmVuY2VUYWJsZS5jb252ZXJ0RGVmYXVsdFRvU3BlY2lmaWVkSm9pbkNvbHVtbigpOwotCQkJCXNldFNlbGVjdGVkSm9pbkNvbHVtbihyZWZlcmVuY2VUYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGluZGV4ID0gcmVmZXJlbmNlVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQkJCXJlZmVyZW5jZVRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW5kZXgpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXRoaXMuc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEpvaW5Db2x1bW5zUHJvdmlkZXIgaW1wbGVtZW50cyBKb2luQ29sdW1uc0VkaXRvcjxUPiB7Ci0KLQkJcHVibGljIHZvaWQgYWRkSm9pbkNvbHVtbihUIHN1YmplY3QpIHsKLQkJCVJlZmVyZW5jZVRhYmxlQ29tcG9zaXRlLnRoaXMuYWRkSm9pbkNvbHVtbihzdWJqZWN0KTsKLQkJfQotCi0JCXB1YmxpYyBKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKFQgc3ViamVjdCkgewotCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFByb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBSZWZlcmVuY2VUYWJsZS5ERUZBVUxUX0pPSU5fQ09MVU1OOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWRpdEpvaW5Db2x1bW4oVCBzdWJqZWN0LCBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCVJlZmVyZW5jZVRhYmxlQ29tcG9zaXRlLnRoaXMuZWRpdEpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucyhUIHN1YmplY3QpIHsKLQkJCXJldHVybiBzdWJqZWN0Lmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1ucyhUIHN1YmplY3QsIGludFtdIHNlbGVjdGVkSW5kaWNlcykgewotCQkJZm9yIChpbnQgaW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJCXN1YmplY3QucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihzZWxlY3RlZEluZGljZXNbaW5kZXhdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoVCBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQl9Ci0KLQkJcHVibGljIGludCBzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoVCBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0UHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFJlZmVyZW5jZVRhYmxlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVDsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIGNsYXNzIE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIgZXh0ZW5kcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPgotCSAgICBpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHsKLQkKLQkJcHVibGljIE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCQlzdXBlcihidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5saXN0SG9sZGVyLnNpemUoKSA+IDApOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJCXVwZGF0ZUpvaW5Db2x1bW5zKCk7Ci0JCX0KLQl9Ci0KLQkKLQlwcml2YXRlIGNsYXNzIEpvaW5Db2x1bW5QYW5lRW5hYmxlckhvbGRlciAKLQkJZXh0ZW5kcyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgQm9vbGVhbj4gCi0JewotCQlwcml2YXRlIFN0YXRlQ2hhbmdlTGlzdGVuZXIgc3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQkJCi0JCQotCQlwdWJsaWMgSm9pbkNvbHVtblBhbmVFbmFibGVySG9sZGVyKCkgewotCQkJc3VwZXIoCi0JCQkJbmV3IFZhbHVlTGlzdEFkYXB0ZXI8VD4oCi0JCQkJCW5ldyBSZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcihnZXRTdWJqZWN0SG9sZGVyKCkpLCAKLQkJCQkJUmVmZXJlbmNlVGFibGUuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKSk7Ci0JCQl0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIgPSBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJfQotCQkKLQkJCi0JCXByaXZhdGUgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJdmFsdWVTdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCB2YWx1ZVN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNhY2hlZFZhbHVlOwotCQkJT2JqZWN0IG5ld1ZhbHVlID0gdHJhbnNmb3JtTmV3KHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFQgdmFsdWUpIHsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIudHJhbnNmb3JtKHZhbHVlKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oVCB2YWx1ZSkgewotCQkJYm9vbGVhbiB2aXJ0dWFsID0gUmVmZXJlbmNlVGFibGVDb21wb3NpdGUudGhpcy5pc1BhcmVudFZpcnR1YWwodmFsdWUpOwotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZighIHZpcnR1YWwgJiYgdmFsdWUuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgPiAwKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJCXRoaXMudmFsdWVIb2xkZXIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyKTsKLQkJCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNQYXJlbnRWaXJ0dWFsKFQgcmVmZXJlbmNlVGFibGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvU2Vjb25kYXJ5VGFibGVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvU2Vjb25kYXJ5VGFibGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2MGY4ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1NlY29uZGFyeVRhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBDbGllbnRzIGNhbiB1c2UgdGhpcyBkaWFsb2cgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciBTZWNvbmRhcnlUYWJsZSBzZXR0aW5ncy4KLSAqIFVzZSB0aGUgZm9sbG93aW5nIG9uY2UgdGhlIGRpYWxvZyBpcyBjbG9zZWQ6Ci0gKiAgICAgQHNlZSAjZ2V0U2VsZWN0ZWRUYWJsZSgpCi0gKiAgICAgQHNlZSAjZ2V0U2VsZWN0ZWRDYXRhbG9nKCkKLSAqICAgICBAc2VlICNnZXRTZWxlY3RlZFNjaGVtYSgpCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWNvbmRhcnlUYWJsZURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIGZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCS8qKgotCSAqIHdoZW4gY3JlYXRpbmcgYSBuZXcgU2Vjb25kYXJ5VGFibGUsICdzZWNvbmRhcnlUYWJsZScgd2lsbCBiZSBudWxsCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0U2NoZW1hOwotCQotCXByb3RlY3RlZCBDb21ibyB0YWJsZUNvbWJvOwotCXByb3RlY3RlZCBDb21ibyBjYXRhbG9nQ29tYm87Ci0JcHJvdGVjdGVkIENvbWJvIHNjaGVtYUNvbWJvOwotCi0JLy8gdGhlc2UgdmFsdWVzIGFyZSBzZXQgdXBvbiBjbG9zZQotCXByaXZhdGUgU3RyaW5nIHNlbGVjdGVkVGFibGU7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWRTY2hlbWE7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWRDYXRhbG9nOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBuZXcgc2Vjb25kYXJ5IHRhYmxlCi0JICovCi0JcHVibGljIFNlY29uZGFyeVRhYmxlRGlhbG9nKFNoZWxsIHBhcmVudCwgSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTdHJpbmcgZGVmYXVsdENhdGFsb2csIFN0cmluZyBkZWZhdWx0U2NoZW1hKSB7Ci0JCXRoaXMocGFyZW50LCBqcGFQcm9qZWN0LCBudWxsLCBkZWZhdWx0Q2F0YWxvZywgZGVmYXVsdFNjaGVtYSk7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgdG8gZWRpdCBhbiBleGlzdGluZyBzZWNvbmRhcnkgdGFibGUKLQkgKi8KLQlwdWJsaWMgU2Vjb25kYXJ5VGFibGVEaWFsb2coU2hlbGwgcGFyZW50LCBKcGFQcm9qZWN0IGpwYVByb2plY3QsIFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCXRoaXMocGFyZW50LCBqcGFQcm9qZWN0LCBzZWNvbmRhcnlUYWJsZSwgc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdENhdGFsb2coKSwgc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnRlcm5hbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBTZWNvbmRhcnlUYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsIEpwYVByb2plY3QganBhUHJvamVjdCwgU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUsIFN0cmluZyBkZWZhdWx0Q2F0YWxvZywgU3RyaW5nIGRlZmF1bHRTY2hlbWEpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlOwotCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gZGVmYXVsdENhdGFsb2c7Ci0JCXRoaXMuZGVmYXVsdFNjaGVtYSA9IGRlZmF1bHRTY2hlbWE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9wZW4gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxTaXplKCkgewotCQlQb2ludCBzaXplID0gc3VwZXIuZ2V0SW5pdGlhbFNpemUoKTsKLQkJc2l6ZS54ID0gdGhpcy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNTApOyAgLy8gPz8/Ci0JCXJldHVybiBzaXplOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dCh0aGlzLmdldFRpdGxlKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiAodGhpcy5zZWNvbmRhcnlUYWJsZSA9PSBudWxsKSA/Ci0JCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGRTZWNvbmRhcnlUYWJsZQotCQkJCQk6Ci0JCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0U2Vjb25kYXJ5VGFibGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0KLQkJLy8gdGFibGUKLQkJTGFiZWwgdGFibGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJdGFibGVMYWJlbC5zZXRUZXh0KEpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX25hbWUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQl0YWJsZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMudGFibGVDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJdGhpcy50YWJsZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIGNhdGFsb2cKLQkJTGFiZWwgY2F0YWxvZ0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQljYXRhbG9nTGFiZWwuc2V0VGV4dChKcHRVaURldGFpbHNNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19jYXRhbG9nKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJY2F0YWxvZ0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMuY2F0YWxvZ0NvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQl0aGlzLmNhdGFsb2dDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBzY2hlbWEKLQkJTGFiZWwgc2NoZW1hTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCXNjaGVtYUxhYmVsLnNldFRleHQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVEaWFsb2dfc2NoZW1hKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJc2NoZW1hTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGhpcy5zY2hlbWFDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJdGhpcy5zY2hlbWFDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl0aGlzLmluaXRpYWxpemVDYXRhbG9nQ29tYm8oKTsKLQkJdGhpcy5pbml0aWFsaXplU2NoZW1hQ29tYm8oKTsKLQkJdGhpcy5pbml0aWFsaXplVGFibGVDb21ibygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQotCQl0aGlzLnRhYmxlQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoYnVpbGRUYWJsZU1vZGlmeUxpc3RlbmVyKCkpOwotCQl0aGlzLmNhdGFsb2dDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkQ2F0YWxvZ1NlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQl0aGlzLnNjaGVtYUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRTY2hlbWFTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy5yZWZyZXNoQnV0dG9ucygpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYXRhbG9nQ29tYm8oKSB7Ci0JCXRoaXMucG9wdWxhdGVDYXRhbG9nQ29tYm8oKTsKLQotCQlpZiAodGhpcy5pc0FkZERpYWxvZygpKSB7Ci0JCQl0aGlzLmNhdGFsb2dDb21iby5zZWxlY3QoMCk7ICAvLyBvdXQtb2YtYm91bmRzIGluZGV4IGlzIGlnbm9yZWQKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBzcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JCQlpZiAoc3BlY2lmaWVkQ2F0YWxvZyA9PSBudWxsKSB7Ci0JCQkJdGhpcy5jYXRhbG9nQ29tYm8uc2VsZWN0KDApOyAgLy8gb3V0LW9mLWJvdW5kcyBpbmRleCBpcyBpZ25vcmVkCi0JCQl9IGVsc2UgewotCQkJCXRoaXMuY2F0YWxvZ0NvbWJvLnNldFRleHQoc3BlY2lmaWVkQ2F0YWxvZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUNhdGFsb2dDb21ibygpIHsKLQkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmdldERhdGFiYXNlKCk7Ci0JCWlmICgoZGF0YWJhc2UgIT0gbnVsbCkgJiYgISBkYXRhYmFzZS5zdXBwb3J0c0NhdGFsb2dzKCkpIHsKLQkJCXRoaXMuY2F0YWxvZ0NvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gYWRkIHRoZSBkZWZhdWx0IGNhdGFsb2cgZmlyc3QKLQkJaWYgKHRoaXMuZGVmYXVsdENhdGFsb2cgIT0gbnVsbCkgewotCQkJdGhpcy5jYXRhbG9nQ29tYm8uYWRkKE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRDYXRhbG9nLCB0aGlzLmRlZmF1bHRDYXRhbG9nKSk7Ci0JCX0KLQotCQlpZiAoZGF0YWJhc2UgIT0gbnVsbCkgewotCQkJZm9yIChTdHJpbmcgaWRlbnRpZmllciA6IGRhdGFiYXNlLmdldFNvcnRlZENhdGFsb2dJZGVudGlmaWVycygpKSB7Ci0JCQkJdGhpcy5jYXRhbG9nQ29tYm8uYWRkKGlkZW50aWZpZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNjaGVtYUNvbWJvKCkgewotCQl0aGlzLnBvcHVsYXRlU2NoZW1hQ29tYm8oKTsKLQotCQlpZiAodGhpcy5pc0FkZERpYWxvZygpKSB7Ci0JCQl0aGlzLnNjaGVtYUNvbWJvLnNlbGVjdCgwKTsgIC8vIG91dC1vZi1ib3VuZHMgaW5kZXggaXMgaWdub3JlZAotCQl9IGVsc2UgewotCQkJU3RyaW5nIHNwZWNpZmllZFNjaGVtYSA9IHRoaXMuc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0JCQlpZiAoc3BlY2lmaWVkU2NoZW1hID09IG51bGwpIHsKLQkJCQl0aGlzLnNjaGVtYUNvbWJvLnNlbGVjdCgwKTsgIC8vIG91dC1vZi1ib3VuZHMgaW5kZXggaXMgaWdub3JlZAotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNjaGVtYUNvbWJvLnNldFRleHQoc3BlY2lmaWVkU2NoZW1hKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIGFzc3VtZSB0aGUgY2F0YWxvZyBjb21ibyBoYXMgYmVlbiBwb3B1bGF0ZWQgYnkgbm93Ci0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVTY2hlbWFDb21ibygpIHsKLQkJLy8gYWRkIHRoZSBkZWZhdWx0IHNjaGVtYSBmaXJzdAotCQlpZiAodGhpcy5kZWZhdWx0U2NoZW1hICE9IG51bGwpIHsKLQkJCXRoaXMuc2NoZW1hQ29tYm8uYWRkKE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRTY2hlbWEsIHRoaXMuZGVmYXVsdFNjaGVtYSkpOwotCQl9Ci0KLQkJU2NoZW1hQ29udGFpbmVyIHNjID0gdGhpcy5nZXRDdXJyZW50RGJTY2hlbWFDb250YWluZXIoKTsKLQkJaWYgKHNjICE9IG51bGwpIHsKLQkJCWZvciAoU3RyaW5nIGlkZW50aWZpZXIgOiBzYy5nZXRTb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpKSB7Ci0JCQkJdGhpcy5zY2hlbWFDb21iby5hZGQoaWRlbnRpZmllcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVGFibGVDb21ibygpIHsKLQkJdGhpcy5wb3B1bGF0ZVRhYmxlQ29tYm8oKTsKLQotCQlpZiAodGhpcy5pc0VkaXREaWFsb2coKSkgewotCQkJU3RyaW5nIHNwZWNpZmllZE5hbWUgPSB0aGlzLnNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJCWlmIChzcGVjaWZpZWROYW1lICE9IG51bGwpIHsKLQkJCQl0aGlzLnRhYmxlQ29tYm8uc2V0VGV4dChzcGVjaWZpZWROYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIGFzc3VtZSB0aGUgc2NoZW1hIGNvbWJvIGhhcyBiZWVuIHBvcHVsYXRlZCBieSBub3cKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVRhYmxlQ29tYm8oKSB7Ci0JCS8vIHdlIGRvbid0IG5lZWQgdG8gYWRkIGEgImRlZmF1bHQiIHRvIHRoZSB0YWJsZSBjb21ibwotCQlTY2hlbWEgZGJTY2hlbWEgPSB0aGlzLmdldEN1cnJlbnREYlNjaGVtYSgpOwotCQlpZiAoZGJTY2hlbWEgIT0gbnVsbCkgewotCQkJZm9yIChTdHJpbmcgaWRlbnRpZmllciA6IGRiU2NoZW1hLmdldFNvcnRlZFRhYmxlSWRlbnRpZmllcnMoKSkgewotCQkJCXRoaXMudGFibGVDb21iby5hZGQoaWRlbnRpZmllcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZENhdGFsb2dTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU2Vjb25kYXJ5VGFibGVEaWFsb2cudGhpcy5zZWxlY3RlZENhdGFsb2dDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVNlY29uZGFyeVRhYmxlRGlhbG9nLnRoaXMuc2VsZWN0ZWRDYXRhbG9nQ2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY2F0YWxvZyBzZWxlY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0ZWRDYXRhbG9nQ2hhbmdlZCgpIHsKLQkJdGhpcy5yZWZyZXNoU2NoZW1hQ29tYm8oKTsKLQkJdGhpcy5yZWZyZXNoVGFibGVDb21ibygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTY2hlbWFDb21ibygpIHsKLQkJU3RyaW5nIHNjaGVtYSA9IHRoaXMuc2NoZW1hQ29tYm8uZ2V0VGV4dCgpOwotCQl0aGlzLnNjaGVtYUNvbWJvLnJlbW92ZUFsbCgpOwotCQl0aGlzLnBvcHVsYXRlU2NoZW1hQ29tYm8oKTsKLQkJdGhpcy5zY2hlbWFDb21iby5zZXRUZXh0KHNjaGVtYSk7Ci0JfQotCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU2NoZW1hU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNlY29uZGFyeVRhYmxlRGlhbG9nLnRoaXMuc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVNlY29uZGFyeVRhYmxlRGlhbG9nLnRoaXMuc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzY2hlbWEgc2VsZWN0aW9uIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkU2NoZW1hQ2hhbmdlZCgpIHsKLQkJdGhpcy5yZWZyZXNoVGFibGVDb21ibygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hUYWJsZUNvbWJvKCkgewotCQlTdHJpbmcgdGFibGUgPSB0aGlzLnRhYmxlQ29tYm8uZ2V0VGV4dCgpOwotCQl0aGlzLnRhYmxlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCXRoaXMucG9wdWxhdGVUYWJsZUNvbWJvKCk7Ci0JCXRoaXMudGFibGVDb21iby5zZXRUZXh0KHRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgYnVpbGRUYWJsZU1vZGlmeUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJCVNlY29uZGFyeVRhYmxlRGlhbG9nLnRoaXMudGFibGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0YWJsZSBtb2RpZnkgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGFibGVDaGFuZ2VkKCkgewotCQl0aGlzLnJlZnJlc2hCdXR0b25zKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBib29sZWFuIGlzQWRkRGlhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmRhcnlUYWJsZSA9PSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdERpYWxvZygpIHsKLQkJcmV0dXJuICEgdGhpcy5pc0FkZERpYWxvZygpOwotCX0KLQotCXByb3RlY3RlZCBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5nZXREYXRhU291cmNlKCkuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2NoZW1hQ29udGFpbmVyIGdldEN1cnJlbnREYlNjaGVtYUNvbnRhaW5lcigpIHsKLQkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmdldERhdGFiYXNlKCk7Ci0JCWlmIChkYXRhYmFzZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoICEgZGF0YWJhc2Uuc3VwcG9ydHNDYXRhbG9ncygpKSB7Ci0JCQlyZXR1cm4gZGF0YWJhc2U7Ci0JCX0KLQkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldEN1cnJlbnRDYXRhbG9nKCk7Ci0JCXJldHVybiAoY2F0YWxvZyA9PSBudWxsKSA/IG51bGwgOiBkYXRhYmFzZS5nZXRDYXRhbG9nRm9ySWRlbnRpZmllcihjYXRhbG9nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEN1cnJlbnRDYXRhbG9nKCkgewotCQlpZiAoKHRoaXMuZGVmYXVsdENhdGFsb2cgIT0gbnVsbCkgJiYgKHRoaXMuY2F0YWxvZ0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkpIHsKLQkJCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0VGV4dCh0aGlzLmNhdGFsb2dDb21ibyk7Ci0JfQotCi0JcHJvdGVjdGVkIFNjaGVtYSBnZXRDdXJyZW50RGJTY2hlbWEoKSB7Ci0JCVN0cmluZyBzY2hlbWEgPSB0aGlzLmdldEN1cnJlbnRTY2hlbWEoKTsKLQkJaWYgKHNjaGVtYSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTY2hlbWFDb250YWluZXIgc2MgPSB0aGlzLmdldEN1cnJlbnREYlNjaGVtYUNvbnRhaW5lcigpOwotCQlyZXR1cm4gKHNjID09IG51bGwpID8gbnVsbCA6IHNjLmdldFNjaGVtYUZvcklkZW50aWZpZXIoc2NoZW1hKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEN1cnJlbnRTY2hlbWEoKSB7Ci0JCWlmICgodGhpcy5kZWZhdWx0U2NoZW1hICE9IG51bGwpICYmICh0aGlzLnNjaGVtYUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkpIHsKLQkJCXJldHVybiB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRUZXh0KHRoaXMuc2NoZW1hQ29tYm8pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQnV0dG9ucygpIHsKLQkJdGhpcy5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZCh0aGlzLnZhbGlkYXRlRW50cnlWYWx1ZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVFbnRyeVZhbHVlcygpIHsKLQkJcmV0dXJuICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLnRhYmxlQ29tYm8uZ2V0VGV4dCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvc2UgKioqKioqKioqKgotCi0JLyoqCi0JICogc2V0IGFsbCB0aGUgdmFyaW91cyB2YWx1ZXMgcXVlcmllZCBieSBjbGllbnRzIG9uY2UgdGhlIGRpYWxvZyBpcyBjbG9zZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJdGhpcy5zZWxlY3RlZFRhYmxlID0gdGhpcy50YWJsZUNvbWJvLmdldFRleHQoKTsKLQkJdGhpcy5zZWxlY3RlZENhdGFsb2cgPSBjb252ZXJ0VGV4dCh0aGlzLmNhdGFsb2dDb21ibywgdGhpcy5kZWZhdWx0Q2F0YWxvZyk7Ci0JCXRoaXMuc2VsZWN0ZWRTY2hlbWEgPSBjb252ZXJ0VGV4dCh0aGlzLnNjaGVtYUNvbWJvLCB0aGlzLmRlZmF1bHRTY2hlbWEpOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gbnVsbCBpZjoKLQkgKiAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgaXMgc2VsZWN0ZWQKLQkgKiAgIC0gdGhlIGNvbWJvJ3MgdGV4dCBpcyBlbXB0eQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUZXh0KENvbWJvIGNvbWJvLCBTdHJpbmcgZGVmYXVsdFRleHQpIHsKLQkJLy8gaWYgdGhlIGRlZmF1bHQgdGV4dCBpcyBwcmVzZW50LCB0aGVuIGl0IHdpbGwgYmUgdGhlIGNvbWJvJ3MgZmlyc3Qgc2VsZWN0aW9uCi0JCWlmICgoZGVmYXVsdFRleHQgIT0gbnVsbCkgJiYgKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0VGV4dChjb21ibyk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIG51bGwgaWYgdGhlIGNvbWJvJ3MgdGV4dCBpcyBlbXB0eQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUZXh0KENvbWJvIGNvbWJvKSB7Ci0JCVN0cmluZyB0ZXh0ID0gY29tYm8uZ2V0VGV4dCgpOwotCQlyZXR1cm4gKHRleHQubGVuZ3RoKCkgPT0gMCkgPyBudWxsIDogdGV4dDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNlbGVjdGVkIHRhYmxlLiBSZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGlmIG5vdGhpbmcKLQkgKiBpcyBzZWxlY3RlZCAoc2luY2UgdGhlcmUgaXMgbm8gZGVmYXVsdCkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZFRhYmxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VsZWN0ZWQgY2F0YWxvZy4gUmV0dXJuIG51bGwgaWYgZWl0aGVyIG5vdGhpbmcgb3IKLQkgKiB0aGUgZGVmYXVsdCBjYXRhbG9nIGlzIHNlbGVjdGVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZENhdGFsb2c7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZWxlY3RlZCBzY2hlbWEuIFJldHVybiBudWxsIGlmIGVpdGhlciBub3RoaW5nIG9yCi0JICogdGhlIGRlZmF1bHQgc2NoZW1hIGlzIHNlbGVjdGVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkU2NoZW1hOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODc5ZTk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuU2VxdWVuY2VDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTmFtZTogICAgICAgICAgICAgICB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgU2VxdWVuY2UgR2VuZXJhdG9yOiB8IFNlcXVlbmNlQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgQWxsb2NhdGlvbiBTaXplOiAgICB8IEkgICAgICAgfEl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgSW5pdGlhbCBWYWx1ZTogICAgICB8ICAgICAgICAgfEl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIElkTWFwcGluZwotICogQHNlZSBTZXF1ZW5jZUdlbmVyYXRvcgotICogQHNlZSBJZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgU2VxdWVuY2VDb21ibwotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUgZXh0ZW5kcyBHZW5lcmF0b3JDb21wb3NpdGU8U2VxdWVuY2VHZW5lcmF0b3I+Ci17Ci0JCi0JcHVibGljIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgCQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxTZXF1ZW5jZUdlbmVyYXRvcj4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgIAkJCQkJCQlHZW5lcmF0b3JCdWlsZGVyPFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZGVyKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBidWlsZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLQkJcmV0dXJuIEdlbmVyYXRvckNvbnRhaW5lci5TRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gTmFtZSB3aWRnZXRzCi0JCWFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfbmFtZSwKLQkJCWJ1aWxkR2VuZXJhdG9yTmFtZUhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1JfTkFNRQotCQkpOwotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9zZXF1ZW5jZSwKLQkJCWJ1aWxkU2VxdWVuY2VOYW1lQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfU0VRVUVOQ0VfR0VORVJBVE9SX1NFUVVFTkNFCi0JCSk7Ci0KLQkJYWRkQWxsb2NhdGlvblNpemVDb21ibyhjb250YWluZXIpOwotCQlhZGRJbml0aWFsVmFsdWVDb21ibyhjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBTZXF1ZW5jZUNvbWJvPFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZFNlcXVlbmNlTmFtZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlyZXR1cm4gbmV3IFNlcXVlbmNlQ29tYm88U2VxdWVuY2VHZW5lcmF0b3I+KHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoU2VxdWVuY2VHZW5lcmF0b3IuREVGQVVMVF9TRVFVRU5DRV9OQU1FX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChTZXF1ZW5jZUdlbmVyYXRvci5TUEVDSUZJRURfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRTZXF1ZW5jZU5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlyZXRyaWV2ZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFNlcXVlbmNlTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gKGdldFN1YmplY3QoKSA9PSBudWxsKSA/IG51bGwgOiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gbnVsbFN1YmplY3RJc0FsbG93ZWQoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogc3ViamVjdCBtYXkgYmUgbnVsbCwgc28gZGVsZWdhdGUgdG8gdGhlIGNvbXBvc2l0ZQotCQkJICovCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuZ2V0SnBhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTY2hlbWEgZ2V0RGJTY2hlbWFfKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREYlNjaGVtYSgpOwotCQkJfQotCi0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9UYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9UYWJsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWQ0ZjhlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5DYXRhbG9nQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuU2NoZW1hQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuVGFibGVDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gVGFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCBUYWJsZTogICB8IFRhYmxlQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8ICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCBDYXRhbG9nOiB8IENhdGFsb2dDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8ICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCBTY2hlbWE6ICB8IFNjaGVtYUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBUYWJsZQotICogQHNlZSBFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBUYWJsZUNvbWJvCi0gKiBAc2VlIENhdGFsb2dDb21ibwotICogQHNlZSBTY2hlbWFDb21ibwotICoKLSAqIEBUT0RPIHJlcG9wdWxhdGUgdGhpcyBwYW5lbCBiYXNlZCBvbiB0aGUgRW50aXR5IHRhYmxlIGNoYW5naW5nCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RW50aXR5PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUYWJsZUNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBFbnRpdHk+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBUYWJsZSBncm91cCBwYW5lCi0JCUdyb3VwIHRhYmxlR3JvdXBQYW5lID0gYWRkVGl0bGVkR3JvdXAoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UYWJsZUNvbXBvc2l0ZV90YWJsZVNlY3Rpb24KLQkJKTsKLQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGU+IHN1YmplY3RIb2xkZXIgPSBidWlsZFRhYmxlSG9sZGVyKCk7Ci0JCS8vIFRhYmxlIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCXRhYmxlR3JvdXBQYW5lLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVGFibGVDaG9vc2VyX2xhYmVsLAotCQkJYWRkVGFibGVDb21ibyhzdWJqZWN0SG9sZGVyLCB0YWJsZUdyb3VwUGFuZSksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfVEFCTEUKLQkJKTsKLQotCQkvLyBDYXRhbG9nIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCXRhYmxlR3JvdXBQYW5lLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ2F0YWxvZ0Nob29zZXJfbGFiZWwsCi0JCQlhZGRDYXRhbG9nQ29tYm8oc3ViamVjdEhvbGRlciwgdGFibGVHcm91cFBhbmUpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0NBVEFMT0cKLQkJKTsKLQotCQkvLyBTY2hlbWEgd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJdGFibGVHcm91cFBhbmUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5TY2hlbWFDaG9vc2VyX2xhYmVsLAotCQkJYWRkU2NoZW1hQ29tYm8oc3ViamVjdEhvbGRlciwgdGFibGVHcm91cFBhbmUpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX1NDSEVNQQotCQkpOwotCQkKLQkJbmV3IFBhbmVFbmFibGVyKGJ1aWxkVGFibGVFbmFibGVkSG9sZGVyKCksIHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGU+IGJ1aWxkVGFibGVIb2xkZXIoKSB7Ci0JCQotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIFRhYmxlPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5UQUJMRV9JU19VTkRFRklORURfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhYmxlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudGFibGVJc1VuZGVmaW5lZCgpID8gbnVsbCA6IHRoaXMuc3ViamVjdC5nZXRUYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUYWJsZUVuYWJsZWRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX1RBQkxFX0lTX0FMTE9XRURfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3Quc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDYXRhbG9nQ29tYm88VGFibGU+IGFkZENhdGFsb2dDb21ibyhQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGU+IHRhYmxlSG9sZGVyLCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDYXRhbG9nQ29tYm88VGFibGU+KHRoaXMsIHRhYmxlSG9sZGVyLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZENhdGFsb2codmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTY2hlbWFDb21ibzxUYWJsZT4gYWRkU2NoZW1hQ29tYm8oUHJvcGVydHlWYWx1ZU1vZGVsPFRhYmxlPiBzdWJqZWN0SG9sZGVyLCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBTY2hlbWFDb21ibzxUYWJsZT4odGhpcywgc3ViamVjdEhvbGRlciwgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRTY2hlbWEodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlQ29tYm88VGFibGU+IGFkZFRhYmxlQ29tYm8oUHJvcGVydHlWYWx1ZU1vZGVsPFRhYmxlPiBzdWJqZWN0SG9sZGVyLCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBUYWJsZUNvbWJvPFRhYmxlPih0aGlzLCBzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5ERUZBVUxUX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJCQlpZiAocHJvcGVydHlOYW1lID09IFRhYmxlLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZIAotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGUuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWQotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGUuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZS5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSApIHsKLQkJCQkJcmVwb3B1bGF0ZSgpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWROYW1lKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNjaGVtYSBnZXREYlNjaGVtYV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERiU2NoZW1hKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTMzZWI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVGFibGVHZW5lcmF0b3JDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNvbHVtbkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLlNjaGVtYUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLlRhYmxlQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFRhYmxlOiAgICAgICAgICAgICAgICAgICAgfCBUYWJsZUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENhdGFsb2c6ICAgICAgICAgICAgICAgICAgfCBDYXRhbG9nQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFNjaGVtYTogICAgICAgICAgICAgICAgICAgfCBTY2hlbWFDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFByaW1hcnkgS2V5IENvbHVtbjogICAgICAgfCBDb2x1bW5Db21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFZhbHVlIENvbHVtbjogICAgICAgICAgICAgfCBDb2x1bW5Db21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFByaW1hcnkgS2V5IENvbHVtbiBWYWx1ZTogfCBDb2x1bW5Db21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEFsbG9jYXRpb24gU2l6ZTogICAgICAgICAgfCBJICAgICAgIHxJfCAgRGVmYXVsdCAoWFgpICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEluaXRpYWwgVmFsdWU6ICAgICAgICAgICAgfCBJICAgICAgIHxJfCAgRGVmYXVsdCAoWFgpICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBJZE1hcHBpbmcKLSAqIEBzZWUgVGFibGVHZW5lcmF0b3IKLSAqIEBzZWUgSWRNYXBwaW5nR2VuZXJhdGlvbkNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENhdGFsb2dDb21ibwotICogQHNlZSBDb2x1bW5Db21ibwotICogQHNlZSBTY2hlbWFDb21ibwotICogQHNlZSBUYWJsZUNvbWJvCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSBleHRlbmRzIEdlbmVyYXRvckNvbXBvc2l0ZTxUYWJsZUdlbmVyYXRvcj4KLXsKLQotCQotCXB1YmxpYyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0gICAgICAgIAkJCQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGVHZW5lcmF0b3I+IHN1YmplY3RIb2xkZXIsCi0gICAgICAgIAkJCQkJCQlDb21wb3NpdGUgcGFyZW50LAotICAgICAgICAJCQkJCQkJR2VuZXJhdG9yQnVpbGRlcjxUYWJsZUdlbmVyYXRvcj4gYnVpbGRlcikgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgYnVpbGRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0JCXJldHVybiBHZW5lcmF0b3JDb250YWluZXIuVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZOwotCX0KLQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQlhZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWUsCi0JCQlidWlsZEdlbmVyYXRvck5hbWVIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX05BTUUKLQkJKTsKLQotCQkvLyBUYWJsZSB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV90YWJsZSwKLQkJCWFkZFRhYmxlTmFtZUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9UQUJMRQotCQkpOwotCi0JCS8vIFNjaGVtYSB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9zY2hlbWEsCi0JCQlhZGRTY2hlbWFDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfU0NIRU1BCi0JCSk7Ci0KLQkJLy8gQ2F0YWxvZyB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9jYXRhbG9nLAotCQkJYWRkQ2F0YWxvZ0NvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9DQVRBTE9HCi0JCSk7Ci0KLQkJLy8gUHJpbWFyeSBLZXkgQ29sdW1uIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3BrQ29sdW1uLAotCQkJYWRkUGtDb2x1bW5OYW1lQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1BSSU1BUllfS0VZX0NPTFVNTgotCQkpOwotCi0JCS8vIFZhbHVlIENvbHVtbiB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV92YWx1ZUNvbHVtbiwKLQkJCWFkZFZhbHVlQ29sdW1uQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1ZBTFVFX0NPTFVNTgotCQkpOwotCi0JCS8vIFByaW1hcnkgS2V5IENvbHVtbiBWYWx1ZSB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtblZhbHVlLAotCQkJYWRkUGtDb2x1bW5WYWx1ZUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9QUklNQVJZX0tFWV9DT0xVTU5fVkFMVUUKLQkJKTsKLQotCQlhZGRBbGxvY2F0aW9uU2l6ZUNvbWJvKGNvbnRhaW5lcik7Ci0JCWFkZEluaXRpYWxWYWx1ZUNvbWJvKGNvbnRhaW5lcik7Ci0JfQkKLQotCXByaXZhdGUgQ2F0YWxvZ0NvbWJvPFRhYmxlR2VuZXJhdG9yPiBhZGRDYXRhbG9nQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2F0YWxvZ0NvbWJvPFRhYmxlR2VuZXJhdG9yPih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBudWxsU3ViamVjdElzQWxsb3dlZCgpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBzdWJqZWN0IG1heSBiZSBudWxsLCBzbyBkZWxlZ2F0ZSB0byB0aGUgY29tcG9zaXRlCi0JCQkgKi8KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5nZXRKcGFQcm9qZWN0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJcmV0cmlldmVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sdW1uQ29tYm88VGFibGVHZW5lcmF0b3I+IGFkZFBrQ29sdW1uTmFtZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlyZXR1cm4gbmV3IENvbHVtbkNvbWJvPFRhYmxlR2VuZXJhdG9yPih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIHBhcmVudCkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfUEtfQ09MVU1OX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9QS19DT0xVTU5fTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9UQUJMRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJCWlmIChwcm9wZXJ0eU5hbWUgPT0gVGFibGVHZW5lcmF0b3IuREVGQVVMVF9UQUJMRV9QUk9QRVJUWSB8fAotCQkJCSAgICBwcm9wZXJ0eU5hbWUgPT0gVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZKSB7Ci0JCQkJCXRoaXMucmVwb3B1bGF0ZUNvbWJvQm94KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIG51bGxTdWJqZWN0SXNBbGxvd2VkKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIHN1YmplY3QgbWF5IGJlIG51bGwsIHNvIGRlbGVnYXRlIHRvIHRoZSBjb21wb3NpdGUKLQkJCSAqLwotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmdldEpwYVByb2plY3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlyZXRyaWV2ZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFBrQ29sdW1uTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhYmxlIGdldERiVGFibGVfKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGJUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkNvbWJvPFRhYmxlR2VuZXJhdG9yPiBhZGRQa0NvbHVtblZhbHVlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXJldHVybiBuZXcgQ29sdW1uQ29tYm88VGFibGVHZW5lcmF0b3I+KHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9QS19DT0xVTU5fVkFMVUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9QS19DT0xVTU5fVkFMVUVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFBrQ29sdW1uVmFsdWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBudWxsU3ViamVjdElzQWxsb3dlZCgpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBzdWJqZWN0IG1heSBiZSBudWxsLCBzbyBkZWxlZ2F0ZSB0byB0aGUgY29tcG9zaXRlCi0JCQkgKi8KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5nZXRKcGFQcm9qZWN0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJcmV0cmlldmVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGUgZ2V0RGJUYWJsZV8oKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREYlRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNjaGVtYUNvbWJvPFRhYmxlR2VuZXJhdG9yPiBhZGRTY2hlbWFDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBTY2hlbWFDb21ibzxUYWJsZUdlbmVyYXRvcj4odGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlpZiAocHJvcGVydHlOYW1lID09IFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWQotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgKSB7Ci0JCQkJCXJlcG9wdWxhdGVDb21ib0JveCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIG51bGxTdWJqZWN0SXNBbGxvd2VkKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIHN1YmplY3QgbWF5IGJlIG51bGwsIHNvIGRlbGVnYXRlIHRvIHRoZSBjb21wb3NpdGUKLQkJCSAqLwotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmdldEpwYVByb2plY3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlyZXRyaWV2ZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFNjaGVtYSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXIoKSB7Ci0JCQkJVGFibGVHZW5lcmF0b3IgdGcgPSB0aGlzLmdldFN1YmplY3QoKTsKLQkJCQlpZiAodGcgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdGcuZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuZ2V0U3ViamVjdCgpLmdldENvbnRleHREZWZhdWx0RGJTY2hlbWFDb250YWluZXIoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyXygpIHsKLQkJCQkvLyB3ZSBvdmVycm9kZSAjZ2V0RGJTY2hlbWFDb250YWluZXIoKSBpbnN0ZWFkCi0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZUNvbWJvPFRhYmxlR2VuZXJhdG9yPiBhZGRUYWJsZU5hbWVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcmV0dXJuIG5ldyBUYWJsZUNvbWJvPFRhYmxlR2VuZXJhdG9yPih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIHBhcmVudCkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfVEFCTEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQkJaWYgKHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSAKLQkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkKLQkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWQotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgKSB7Ci0JCQkJCXJlcG9wdWxhdGVDb21ib0JveCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0VGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBudWxsU3ViamVjdElzQWxsb3dlZCgpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBzdWJqZWN0IG1heSBiZSBudWxsLCBzbyBkZWxlZ2F0ZSB0byB0aGUgY29tcG9zaXRlCi0JCQkgKi8KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5nZXRKcGFQcm9qZWN0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJcmV0cmlldmVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRUYWJsZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2NoZW1hIGdldERiU2NoZW1hKCkgewotCQkJCVRhYmxlR2VuZXJhdG9yIHRnID0gdGhpcy5nZXRTdWJqZWN0KCk7Ci0JCQkJaWYgKHRnICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRnLmdldERiU2NoZW1hKCk7Ci0JCQkJfQotCQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmdldFN1YmplY3QoKS5nZXRDb250ZXh0RGVmYXVsdERiU2NoZW1hKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNjaGVtYSBnZXREYlNjaGVtYV8oKSB7Ci0JCQkJLy8gd2Ugb3ZlcnJvZGUgI2dldERiU2NoZW1hKCkgaW5zdGVhZAotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCi0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2x1bW5Db21ibzxUYWJsZUdlbmVyYXRvcj4gYWRkVmFsdWVDb2x1bW5Db21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcmV0dXJuIG5ldyBDb2x1bW5Db21ibzxUYWJsZUdlbmVyYXRvcj4odGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBwYXJlbnQpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1ZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfVEFCTEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlpZiAocHJvcGVydHlOYW1lID09IFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfVEFCTEVfUFJPUEVSVFkgfHwKLQkJCQkgICAgcHJvcGVydHlOYW1lID09IFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSkgewotCQkJCQl0aGlzLnJlcG9wdWxhdGVDb21ib0JveCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRWYWx1ZUNvbHVtbk5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBudWxsU3ViamVjdElzQWxsb3dlZCgpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBzdWJqZWN0IG1heSBiZSBudWxsLCBzbyBkZWxlZ2F0ZSB0byB0aGUgY29tcG9zaXRlCi0JCQkgKi8KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5nZXRKcGFQcm9qZWN0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJcmV0cmlldmVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUYWJsZSBnZXREYlRhYmxlXygpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERiVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVGFyZ2V0RW50aXR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1RhcmdldEVudGl0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Q5Njk2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVGFyZ2V0RW50aXR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlckNvbWJvUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIHRhcmdldCBlbnRpdHkgaHlwZXJsaW5rIGxhYmVsLCBjb21ibyBhbmQgYnJvd3NlIGJ1dHRvbiAKLSAqLwotcHVibGljIGNsYXNzIFRhcmdldEVudGl0eUNvbXBvc2l0ZQotCWV4dGVuZHMgQ2xhc3NDaG9vc2VyQ29tYm9QYW5lPFJlbGF0aW9uc2hpcE1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYXJnZXRFbnRpdHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRhcmdldEVudGl0eUNvbXBvc2l0ZSgKLQkJCVBhbmU8PyBleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRUYXJnZXRFbnRpdHkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0aGlzLmdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoY2xhc3NOYW1lKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLSAgICAJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlRhcmdldEVudGl0eUNob29zZXJfbGFiZWw7Ci0gICAgfQotICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0gICAgCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBUkdFVF9FTlRJVFk7Ci0gICAgfQotICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLSAgICAJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLSAgICAJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRUYXJnZXRFbnRpdHlFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UmVsYXRpb25zaGlwTWFwcGluZywgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgUmVsYXRpb25zaGlwTWFwcGluZy5TUEVDSUZJRURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCi0JCQkJU3RyaW5nIG5hbWUgPSB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gVGFyZ2V0RW50aXR5Q29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCk7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChnZXREZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZFRhcmdldEVudGl0eSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0gICAgfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDbGFzc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRGVmYXVsdFByb2ZpbGVyTGlzdEhvbGRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRQcm9maWxlckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0UHJvZmlsZXJIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0UHJvZmlsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFJlbGF0aW9uc2hpcE1hcHBpbmcsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIFJlbGF0aW9uc2hpcE1hcHBpbmcuREVGQVVMVF9UQVJHRVRfRU5USVRZX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIFRhcmdldEVudGl0eUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZSh0aGlzLnN1YmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRWYWx1ZShSZWxhdGlvbnNoaXBNYXBwaW5nIHN1YmplY3QpIHsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RW1wdHk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVGVtcG9yYWxUeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1RlbXBvcmFsVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTNmMjQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVGVtcG9yYWxUeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBUZW1wb3JhbDogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQ29sdW1uTWFwcGluZwotICogQHNlZSBUZW1wb3JhbFR5cGUKLSAqIEBzZWUgQmFzaWNNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIElkTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGVtcG9yYWxUeXBlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxUZW1wb3JhbENvbnZlcnRlcj4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZW1wb3JhbFR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFRlbXBvcmFsQ29udmVydGVyPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWJ1aWxkVGVtcG9yYWxUeXBlTGlzdEhvbGRlcigpLAotCQkJYnVpbGRUZW1wb3JhbFR5cGVIb2xkZXIoKSwKLQkJCWJ1aWxkVGVtcG9yYWxUeXBlQ29udmVydGVyKCksCi0JCQlidWlsZEJvb2xlYW5Ib2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVtcG9yYWxUeXBlPiBidWlsZFRlbXBvcmFsVHlwZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVtcG9yYWxDb252ZXJ0ZXIsIFRlbXBvcmFsVHlwZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBUZW1wb3JhbENvbnZlcnRlci5URU1QT1JBTF9UWVBFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUZW1wb3JhbFR5cGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VGVtcG9yYWxUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFRlbXBvcmFsVHlwZSB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0VGVtcG9yYWxUeXBlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRlbXBvcmFsVHlwZT4gYnVpbGRUZW1wb3JhbFR5cGVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFRlbXBvcmFsVHlwZT4oCi0JCQlidWlsZFNvcnRlZFRlbXBvcmFsVHlwZUxpc3QoKQotCQkpOwotCX0KLQkKLQlwcml2YXRlIExpc3Q8VGVtcG9yYWxUeXBlPiBidWlsZFNvcnRlZFRlbXBvcmFsVHlwZUxpc3QoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuc29ydChDb2xsZWN0aW9uVG9vbHMubGlzdChUZW1wb3JhbFR5cGUudmFsdWVzKCkpLCB0aGlzLmJ1aWxkVGVtcG9yYWxUeXBlQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8VGVtcG9yYWxUeXBlPiBidWlsZFRlbXBvcmFsVHlwZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxUZW1wb3JhbFR5cGU+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFRlbXBvcmFsVHlwZSB0eXBlMSwgVGVtcG9yYWxUeXBlIHR5cGUyKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcxID0gZGlzcGxheVN0cmluZyh0eXBlMSk7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcyID0gZGlzcGxheVN0cmluZyh0eXBlMik7Ci0JCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShkaXNwbGF5U3RyaW5nMSwgZGlzcGxheVN0cmluZzIpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFRlbXBvcmFsVHlwZT4gYnVpbGRUZW1wb3JhbFR5cGVDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFRlbXBvcmFsVHlwZT4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhUZW1wb3JhbFR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gbnVsbCA6IGRpc3BsYXlTdHJpbmcodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCVN0cmluZyBkaXNwbGF5U3RyaW5nKFRlbXBvcmFsVHlwZSB0ZW1wb3JhbFR5cGUpIHsKLQkJcmV0dXJuIFNXVFV0aWwuYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuY2xhc3MsCi0JCQlUZW1wb3JhbFR5cGVDb21wb3NpdGUudGhpcywKLQkJCXRlbXBvcmFsVHlwZS5uYW1lKCkKLQkJKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VGVtcG9yYWxDb252ZXJ0ZXIsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oVGVtcG9yYWxDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJCQlpZiAoZ2V0U3ViamVjdCgpICE9IG51bGwgJiYgZ2V0U3ViamVjdCgpLmdldFBhcmVudCgpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1RyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjhjNzI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIGRvZXMgbm90IGhhdmUgYW55IHdpZGdldHMuCi0gKgotICogQHNlZSBUcmFuc2llbnRNYXBwaW5nCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxUcmFuc2llbnRNYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JVHJhbnNpZW50TWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVHJhbnNpZW50TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2ZWJmNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUZW1wb3JhbFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBWZXJzaW9uTWFwcGluZwotICogQHNlZSBDb2x1bW5Db21wb3NpdGUKLSAqIEBzZWUgVGVtcG9yYWxUeXBlQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSAKLQlleHRlbmRzIEFic3RyYWN0VmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8VmVyc2lvbk1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklWZXJzaW9uTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWZXJzaW9uU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9DYXRhbG9nQ29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvZGIvQ2F0YWxvZ0NvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MTVmZTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9DYXRhbG9nQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgY29tYm8tYm94IGRpc3BsYXlzIHRoZSBkYXRhYmFzZSdzIGNhdGFsb2dzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2F0YWxvZ0NvbWJvPFQgZXh0ZW5kcyBKcGFOb2RlPgotCWV4dGVuZHMgRGF0YWJhc2VPYmplY3RDb21ibzxUPgotewotCXB1YmxpYyBDYXRhbG9nQ29tYm8oCi0JCQlQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIENhdGFsb2dDb21ibygKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFZhbHVlc18oKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U29ydGVkQ2F0YWxvZ0lkZW50aWZpZXJzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL0NvbHVtbkNvbWJvLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL0NvbHVtbkNvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYjJkMjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9Db2x1bW5Db21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgY29tYm8tYm94IGRpc3BsYXlzIGEgdGFibGUncyBjb2x1bW5zLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sdW1uQ29tYm88VCBleHRlbmRzIEpwYU5vZGU+Ci0JZXh0ZW5kcyBEYXRhYmFzZU9iamVjdENvbWJvPFQ+Ci17Ci0JcHVibGljIENvbHVtbkNvbWJvKAotCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgQ29sdW1uQ29tYm8oCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRWYWx1ZXNfKCkgewotCQlUYWJsZSBkYlRhYmxlID0gdGhpcy5nZXREYlRhYmxlKCk7Ci0JCXJldHVybiAoZGJUYWJsZSAhPSBudWxsKSA/IGRiVGFibGUuZ2V0U29ydGVkQ29sdW1uSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGFibGUgZ2V0RGJUYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFN1YmplY3QoKSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldERiVGFibGVfKCk7Ci0JfQotCQotCS8qKgotCSAqIEFzc3VtZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVGFibGUgZ2V0RGJUYWJsZV8oKTsKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZUNoYW5nZWRfKFRhYmxlIHRhYmxlKSB7Ci0JCXN1cGVyLnRhYmxlQ2hhbmdlZF8odGFibGUpOwotCQlpZiAodGhpcy5nZXREYlRhYmxlKCkgPT0gdGFibGUpIHsKLQkJCXRoaXMuZG9Qb3B1bGF0ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9EYXRhYmFzZU9iamVjdENvbWJvLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL0RhdGFiYXNlT2JqZWN0Q29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2ODc5ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL0RhdGFiYXNlT2JqZWN0Q29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFEYXRhU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ29tYm9QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBwYW5lIGtlZXBzIGEgY29tYm8gaW4gc3luYyB3aXRoIHRoZSBkYXRhYmFzZSBvYmplY3RzCi0gKiB3aGVuIGEgY29ubmVjdGlvbiBpcyBhY3RpdmUuCi0gKgotICogQHNlZSBDYXRhbG9nQ29tYm8KLSAqIEBzZWUgQ29sdW1uQ29tYm8KLSAqIEBzZWUgU2NoZW1hQ29tYm8KLSAqIEBzZWUgU2VxdWVuY2VDb21ibwotICogQHNlZSBUYWJsZUNvbWJvCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGFiYXNlT2JqZWN0Q29tYm88VCBleHRlbmRzIEpwYU5vZGU+Ci0JZXh0ZW5kcyBDb21ib1BhbmU8VD4KLXsKLQkvKioKLQkgKiBUaGUgbGlzdGVuZXIgYWRkZWQgdG8gdGhlIDxjb2RlPkNvbm5lY3Rpb25Qcm9maWxlPC9jb2RlPi4KLQkgKiBJdCBrZWVwcyB0aGUgY29tYm8gaW4gc3luYyB3aXRoIHRoZSBkYXRhYmFzZSBtZXRhZGF0YS4KLQkgKi8KLQlwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBEYXRhYmFzZU9iamVjdENvbWJvKAotCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGF0YWJhc2VPYmplY3RDb21ibygKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyXygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3Rpb25MaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyXygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCl7Ci0JCQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQljb25uZWN0aW9uUHJvZmlsZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb25uZWN0aW9uUHJvZmlsZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0T2xkVmFsdWUoKSAhPSBudWxsKSB7Ci0JCQkoKENvbm5lY3Rpb25Qcm9maWxlKSBldmVudC5nZXRPbGRWYWx1ZSgpKS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JCWlmIChldmVudC5nZXROZXdWYWx1ZSgpICE9IG51bGwpIHsKLQkJCSgoQ29ubmVjdGlvblByb2ZpbGUpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7CQkJCi0JCX0KLQkJdGhpcy5yZXBvcHVsYXRlQ29tYm9Cb3goKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVyc18oVCBzdWJqZWN0KSB7Ci0JCXN1cGVyLmVuZ2FnZUxpc3RlbmVyc18oc3ViamVjdCk7Ci0KLQkJc3ViamVjdC5nZXRKcGFQcm9qZWN0KCkuZ2V0RGF0YVNvdXJjZSgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSnBhRGF0YVNvdXJjZS5DT05ORUNUSU9OX1BST0ZJTEVfUFJPUEVSVFksIHRoaXMuY29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcik7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gc3ViamVjdC5nZXRKcGFQcm9qZWN0KCkuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJaWYgKGNwICE9IG51bGwpIHsKLQkJCWNwLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzXyhUIHN1YmplY3QpIHsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSBzdWJqZWN0LmdldEpwYVByb2plY3QoKS5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCQlpZiAoY3AgIT0gbnVsbCkgewotCQkJY3AucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCQlzdWJqZWN0LmdldEpwYVByb2plY3QoKS5nZXREYXRhU291cmNlKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihKcGFEYXRhU291cmNlLkNPTk5FQ1RJT05fUFJPRklMRV9QUk9QRVJUWSwgdGhpcy5jb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKTsKLQotCQlzdXBlci5kaXNlbmdhZ2VMaXN0ZW5lcnNfKHN1YmplY3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBnZXRWYWx1ZXMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKSA/IHRoaXMuZ2V0VmFsdWVzXygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCBvbmx5IHdoZW4gY29ubmVjdGlvbiBwcm9maWxlIGlzIGFjdGl2ZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYWJsZTxTdHJpbmc+IGdldFZhbHVlc18oKTsKLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3ViamVjdCdzIEpQQSBwcm9qZWN0LgotCSAqIEFsbG93IHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QsIHNvIHdlIGNhbiBzdGlsbCBnZXQgdGhlIEpQQQotCSAqIHByb2plY3QgZXZlbiB3aGVuIHRoZSBzdWJqZWN0IGlzIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJVCBzdWJqZWN0ID0gdGhpcy5nZXRTdWJqZWN0KCk7Ci0JCXJldHVybiAoc3ViamVjdCA9PSBudWxsKSA/IG51bGwgOiBzdWJqZWN0LmdldEpwYVByb2plY3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdWJqZWN0J3MgY29ubmVjdGlvbiBwcm9maWxlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gdGhpcy5nZXRKcGFQcm9qZWN0KCk7Ci0JCXJldHVybiAoanBhUHJvamVjdCA9PSBudWxsKSA/IG51bGwgOiBqcGFQcm9qZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzdWJqZWN0J3MgY29ubmVjdGlvbiBwcm9maWxlIGlzIGFjdGl2ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCkgewotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJcmV0dXJuIChjcCAhPSBudWxsKSAmJiBjcC5pc0FjdGl2ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWJqZWN0J3MgZGF0YWJhc2UuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIERhdGFiYXNlIGdldERhdGFiYXNlKCkgewotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJcmV0dXJuIChjcCA9PSBudWxsKSA/IG51bGwgOiBjcC5nZXREYXRhYmFzZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbm5lY3Rpb24gbGlzdGVuZXIgY2FsbGJhY2tzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBkYXRhYmFzZUNoYW5nZWQoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJaWYgKCAhIHRoaXMuY29tYm9Cb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmRhdGFiYXNlQ2hhbmdlZF8oZGF0YWJhc2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRhdGFiYXNlQ2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjYXRhbG9nQ2hhbmdlZChDYXRhbG9nIGNhdGFsb2cpIHsKLQkJaWYgKCAhIHRoaXMuY29tYm9Cb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmNhdGFsb2dDaGFuZ2VkXyhjYXRhbG9nKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjYXRhbG9nQ2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENhdGFsb2cgY2F0YWxvZykgewotCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2NoZW1hQ2hhbmdlZChTY2hlbWEgc2NoZW1hKSB7Ci0JCWlmICggISB0aGlzLmNvbWJvQm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5zY2hlbWFDaGFuZ2VkXyhzY2hlbWEpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNjaGVtYUNoYW5nZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTY2hlbWEgc2NoZW1hKSB7Ci0JCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXF1ZW5jZUNoYW5nZWQoU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJaWYgKCAhIHRoaXMuY29tYm9Cb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnNlcXVlbmNlQ2hhbmdlZF8oc2VxdWVuY2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlQ2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFNlcXVlbmNlIHNlcXVlbmNlKSB7Ci0JCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCB0YWJsZUNoYW5nZWQoVGFibGUgdGFibGUpIHsKLQkJaWYgKCAhIHRoaXMuY29tYm9Cb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnRhYmxlQ2hhbmdlZF8odGFibGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRhYmxlQ2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRhYmxlIHRhYmxlKSB7Ci0JCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjb2x1bW5DaGFuZ2VkKENvbHVtbiBjb2x1bW4pIHsKLQkJaWYgKCAhIHRoaXMuY29tYm9Cb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmNvbHVtbkNoYW5nZWRfKGNvbHVtbik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29sdW1uQ2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbHVtbiBjb2x1bW4pIHsKLQkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQlpZiAoICEgdGhpcy5jb21ib0JveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuZm9yZWlnbktleUNoYW5nZWRfKGZvcmVpZ25LZXkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIGZsYWcsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChmbGFnLmVxdWFscyhUcmFjaW5nLlVJX0RCKSAmJiBUcmFjaW5nLmJvb2xlYW5EZWJ1Z09wdGlvbihUcmFjaW5nLlVJX0RCKSkgewotCQkJdGhpcy5sb2cobWVzc2FnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5sb2coZmxhZywgbWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQkvLyBicm9hZGVuIGFjY2Vzc2liaWxpdHkgYSBiaXQKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZXBvcHVsYXRlQ29tYm9Cb3goKSB7Ci0JCXN1cGVyLnJlcG9wdWxhdGVDb21ib0JveCgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbm5lY3Rpb24gbGlzdGVuZXIgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBjbGFzcyBMb2NhbENvbm5lY3Rpb25MaXN0ZW5lciAKLQkJaW1wbGVtZW50cyBDb25uZWN0aW9uTGlzdGVuZXIgCi0JewotCQlwcm90ZWN0ZWQgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5sb2coIm9wZW5lZDogIiArIHByb2ZpbGUuZ2V0TmFtZSgpKTsKLQkJCURhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5yZXBvcHVsYXRlQ29tYm9Cb3goKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5sb2coIm1vZGlmaWVkOiAiICsgcHJvZmlsZS5nZXROYW1lKCkpOwotCQkJRGF0YWJhc2VPYmplY3RDb21iby50aGlzLnJlcG9wdWxhdGVDb21ib0JveCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5sb2coIk9LIHRvIGNsb3NlOiAiICsgcHJvZmlsZS5nZXROYW1lKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQl0aGlzLmxvZygiYWJvdXQgdG8gY2xvc2U6ICIgKyBwcm9maWxlLmdldE5hbWUoKSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQl0aGlzLmxvZygiY2xvc2VkOiAiICsgcHJvZmlsZS5nZXROYW1lKCkpOwotCQkJRGF0YWJhc2VPYmplY3RDb21iby50aGlzLnJlcG9wdWxhdGVDb21ib0JveCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCXRoaXMubG9nKCJkYXRhYmFzZSBjaGFuZ2VkOiAiICsgZGF0YWJhc2UuZ2V0TmFtZSgpKTsKLQkJCURhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5kYXRhYmFzZUNoYW5nZWQoZGF0YWJhc2UpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBjYXRhbG9nQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDYXRhbG9nIGNhdGFsb2cpIHsKLQkJCXRoaXMubG9nKCJjYXRhbG9nIGNoYW5nZWQ6ICIgKyBjYXRhbG9nLmdldE5hbWUoKSk7Ci0JCQlEYXRhYmFzZU9iamVjdENvbWJvLnRoaXMuY2F0YWxvZ0NoYW5nZWQoY2F0YWxvZyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2NoZW1hIHNjaGVtYSkgewotCQkJdGhpcy5sb2coInNjaGVtYSBjaGFuZ2VkOiAiICsgc2NoZW1hLmdldE5hbWUoKSk7Ci0JCQlEYXRhYmFzZU9iamVjdENvbWJvLnRoaXMuc2NoZW1hQ2hhbmdlZChzY2hlbWEpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXF1ZW5jZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJCXRoaXMubG9nKCJzZXF1ZW5jZSBjaGFuZ2VkOiAiICsgc2VxdWVuY2UuZ2V0TmFtZSgpKTsKLQkJCURhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5zZXF1ZW5jZUNoYW5nZWQoc2VxdWVuY2UpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgVGFibGUgdGFibGUpIHsKLQkJCXRoaXMubG9nKCJ0YWJsZSBjaGFuZ2VkOiAiICsgdGFibGUuZ2V0TmFtZSgpKTsKLQkJCURhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy50YWJsZUNoYW5nZWQodGFibGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBjb2x1bW5DaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENvbHVtbiBjb2x1bW4pIHsKLQkJCXRoaXMubG9nKCJjb2x1bW4gY2hhbmdlZDogIiArIGNvbHVtbi5nZXROYW1lKCkpOwotCQkJRGF0YWJhc2VPYmplY3RDb21iby50aGlzLmNvbHVtbkNoYW5nZWQoY29sdW1uKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgZm9yZWlnbktleUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCQl0aGlzLmxvZygiZm9yZWlnbiBrZXkgY2hhbmdlZDogIiArIGZvcmVpZ25LZXkuZ2V0TmFtZSgpKTsKLQkJCURhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5mb3JlaWduS2V5Q2hhbmdlZChmb3JlaWduS2V5KTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQlEYXRhYmFzZU9iamVjdENvbWJvLnRoaXMubG9nKFRyYWNpbmcuVUlfREIsIG1lc3NhZ2UpOwotCQl9Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvZGIvU2NoZW1hQ29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvZGIvU2NoZW1hQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5NjZlMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL1NjaGVtYUNvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgY29tYm8tYm94IGRpc3BsYXlzIGEgc2NoZW1hIGNvbnRhaW5lcidzIHNjaGVtYXRhLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2NoZW1hQ29tYm88VCBleHRlbmRzIEpwYU5vZGU+Ci0JZXh0ZW5kcyBEYXRhYmFzZU9iamVjdENvbWJvPFQ+Ci17Ci0JcHVibGljIFNjaGVtYUNvbWJvKAotCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBTY2hlbWFDb21ibygKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFZhbHVlc18oKSB7Ci0JCVNjaGVtYUNvbnRhaW5lciBzYyA9IHRoaXMuZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKLQkJcmV0dXJuIChzYyAhPSBudWxsKSA/IHNjLmdldFNvcnRlZFNjaGVtYUlkZW50aWZpZXJzKCkgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3ViamVjdCgpID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0RGJTY2hlbWFDb250YWluZXJfKCk7Ci0JfQotCi0JLyoqCi0JICogQXNzdW1lIHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXJfKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvZGIvU2VxdWVuY2VDb21iby5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9TZXF1ZW5jZUNvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNzdiMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9TZXF1ZW5jZUNvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgY29tYm8tYm94IGRpc3BsYXlzIGEgc2NoZW1hJ3Mgc2VxdWVuY2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VxdWVuY2VDb21ibzxUIGV4dGVuZHMgSnBhTm9kZT4KLQlleHRlbmRzIERhdGFiYXNlT2JqZWN0Q29tYm88VD4KLXsKLQlwdWJsaWMgU2VxdWVuY2VDb21ibygKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0VmFsdWVzXygpIHsKLQkJU2NoZW1hIGRiU2NoZW1hID0gdGhpcy5nZXREYlNjaGVtYSgpOwotCQlyZXR1cm4gKGRiU2NoZW1hICE9IG51bGwpID8gZGJTY2hlbWEuZ2V0U29ydGVkU2VxdWVuY2VJZGVudGlmaWVycygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFNjaGVtYSBnZXREYlNjaGVtYSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFN1YmplY3QoKSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldERiU2NoZW1hXygpOwotCX0KLQotCS8qKgotCSAqIEFzc3VtZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU2NoZW1hIGdldERiU2NoZW1hXygpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL1RhYmxlQ29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvZGIvVGFibGVDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTU4NjQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvZGIvVGFibGVDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGNvbWJvLWJveCBkaXNwbGF5cyBhIHNjaGVtYSdzIHRhYmxlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRhYmxlQ29tYm88VCBleHRlbmRzIEpwYU5vZGU+Ci0JZXh0ZW5kcyBEYXRhYmFzZU9iamVjdENvbWJvPFQ+Ci17Ci0JcHVibGljIFRhYmxlQ29tYm8oCi0JCQlQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFRhYmxlQ29tYm8oCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRWYWx1ZXNfKCkgewotCQlTY2hlbWEgZGJTY2hlbWEgPSB0aGlzLmdldERiU2NoZW1hKCk7Ci0JCXJldHVybiAoZGJTY2hlbWEgIT0gbnVsbCkgPyBkYlNjaGVtYS5nZXRTb3J0ZWRUYWJsZUlkZW50aWZpZXJzKCkgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNjaGVtYSBnZXREYlNjaGVtYSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFN1YmplY3QoKSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldERiU2NoZW1hXygpOwotCX0KLQotCS8qKgotCSAqIEFzc3VtZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU2NoZW1hIGdldERiU2NoZW1hXygpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9BYnN0cmFjdEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzI0NDM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9BYnN0cmFjdEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLk1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuSmF2YVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIGRlZmluaXRpb24gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZSBpdCBpcyBpbml0aWFsaXplZCkuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbgotCWltcGxlbWVudHMgUmVzb3VyY2VVaURlZmluaXRpb24sIE1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCXByaXZhdGUgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz5bXSBzcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnM7Ci0JCi0JcHJpdmF0ZSBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBzcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uczsKLQkKLQlwcml2YXRlIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/PltdIGRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uczsKLQkKLQlwcml2YXRlIGZpbmFsIEphdmFVaUZhY3RvcnkgZmFjdG9yeTsKLQkKLQkKLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmZhY3RvcnkgPSBidWlsZEphdmFVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEphdmFVaUZhY3RvcnkgYnVpbGRKYXZhVWlGYWN0b3J5KCk7Ci0JCi0JcHVibGljIEphdmFVaUZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIHRoaXMuZmFjdG9yeTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXNVaShKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdENvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfUkVTT1VSQ0VfVFlQRSk7Ci0JfQotCi0JcHVibGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gSmF2YVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkKLQkvLyAqKioqKioqKioqIHR5cGUgbWFwcGluZyB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJU3RyaW5nIGtleSwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VHlwZU1hcHBpbmc+IG1hcHBpbmdIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCUphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxUeXBlTWFwcGluZz4gbWFwcGluZ1VpRGVmaW5pdGlvbiA9IGdldEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbihtYXBwaW5nSG9sZGVyLmdldFZhbHVlKCkpOwotCQlyZXR1cm4gbWFwcGluZ1VpRGVmaW5pdGlvbi5idWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJCWdldEZhY3RvcnkoKSwgCi0JCQkJbWFwcGluZ0hvbGRlciwKLQkJCQlwYXJlbnQsCi0JCQkJd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248VHlwZU1hcHBpbmc+IGdldEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbihUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlpZiAodHlwZU1hcHBpbmcgPT0gbnVsbCB8fCB0eXBlTWFwcGluZy5nZXRLZXkoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gKEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxUeXBlTWFwcGluZz4pIGdldERlZmF1bHRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQl9Ci0JCXJldHVybiAoSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPFR5cGVNYXBwaW5nPikgZ2V0U3BlY2lmaWVkSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uKHR5cGVNYXBwaW5nLmdldEtleSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+IGdldFNwZWNpZmllZEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSkgewotCQlmb3IgKEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+IGRlZmluaXRpb24gOiBnZXRTcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSkgewotCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKGRlZmluaXRpb24uZ2V0S2V5KCksIG1hcHBpbmdLZXkpKSB7Ci0JCQkJcmV0dXJuIGRlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCB0eXBlIG1hcHBpbmcga2V5OiAiICsgbWFwcGluZ0tleSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIEl0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsID8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IHR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsID8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+KAotCQkJCWdldFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPltdIGdldFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkVHlwZU1hcHBpbmdVaURlZmluaXRpb25zID09IG51bGwpIHsKLQkJCXRoaXMuc3BlY2lmaWVkVHlwZU1hcHBpbmdVaURlZmluaXRpb25zID0gYnVpbGRTcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBtYXBwaW5nIGRlZmluaXRpb25zIHRvIHVzZSBmb3IgdHlwZXMgaW4gbWFwcGluZyBmaWxlcyBvZiB0aGlzIHR5cGUuICAKLQkgKiBUaGUgb3JkZXIgaXMgdW5pbXBvcnRhbnQuCi0JICovCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+W10gYnVpbGRTcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7Ci0JCUFycmF5TGlzdDxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMgPSAKLQkJCQluZXcgQXJyYXlMaXN0PEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PigpOwotCQlhZGRTcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhkZWZpbml0aW9ucyk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPltdIGRlZmluaXRpb25BcnJheSA9IAotCQkJCWRlZmluaXRpb25zLnRvQXJyYXkobmV3IEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbltkZWZpbml0aW9ucy5zaXplKCldKTsKLQkJcmV0dXJuIGRlZmluaXRpb25BcnJheTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkU3BlY2lmaWVkVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucyk7Ci0JCQotCXB1YmxpYyBEZWZhdWx0SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4gZ2V0RGVmYXVsdFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gTnVsbEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGF0dHJpYnV0ZXMgbWFwcGluZyBVSSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlTdHJpbmcga2V5LCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nSG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nVWlEZWZpbml0aW9uID0gCi0JCQkJZ2V0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbihtYXBwaW5nSG9sZGVyLmdldFZhbHVlKCkpOwotCQlyZXR1cm4gbWFwcGluZ1VpRGVmaW5pdGlvbi5idWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQkJZ2V0RmFjdG9yeSgpLCAKLQkJCQltYXBwaW5nSG9sZGVyLAotCQkJCXBhcmVudCwKLQkJCQl3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nKSB7Ci0JCVN0cmluZyBrZXkgPSBhdHRyaWJ1dGVNYXBwaW5nID09IG51bGwgPyBudWxsIDogYXR0cmlidXRlTWFwcGluZy5nZXRLZXkoKTsKLQkJaWYgKGF0dHJpYnV0ZU1hcHBpbmcgPT0gbnVsbCB8fCBhdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdCgpKSB7Ci0JCQlyZXR1cm4gKEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEF0dHJpYnV0ZU1hcHBpbmc+KSBnZXREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbihrZXkpOwotCQl9Ci0JCXJldHVybiAoSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248QXR0cmlidXRlTWFwcGluZz4pIGdldFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oa2V5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBnZXRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCWZvciAoSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IGRlZmluaXRpb24gOiBnZXRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpKSB7Ci0JCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwoZGVmaW5pdGlvbi5nZXRLZXkoKSwgbWFwcGluZ0tleSkpIHsKLQkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGF0dHJpYnV0ZSBtYXBwaW5nIGtleTogIiArIG1hcHBpbmdLZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCA/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IAotCQkJYXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7Ci0JCQotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgPyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PigKLQkJCQlnZXRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBnZXRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMgPT0gbnVsbCkgewotCQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucyA9IGJ1aWxkU3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIG1hcHBpbmcgZGVmaW5pdGlvbnMgdG8gdXNlIGZvciBhdHRyaWJ1dGVzIGluIG1hcHBpbmcgZmlsZXMgb2YgdGhpcyB0eXBlLiAgCi0JICogVGhlIG9yZGVyIGlzIHVuaW1wb3J0YW50LgotCSAqLwotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBidWlsZFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkgewotCQlBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucyA9IAotCQkJCW5ldyBBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PigpOwotCQlhZGRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPltdIGRlZmluaXRpb25BcnJheSA9IAotCQkJCWRlZmluaXRpb25zLnRvQXJyYXkobmV3IEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uW2RlZmluaXRpb25zLnNpemUoKV0pOwotCQlyZXR1cm4gZGVmaW5pdGlvbkFycmF5OwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKTsKLQkKLQkKLQkvLyAqKioqKioqKioqIGRlZmF1bHQgSmF2YSBhdHRyaWJ1dGUgbWFwcGluZyBVSSBwcm92aWRlcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IGdldERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKFN0cmluZyBrZXkpIHsKLQkJZm9yIChEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IGRlZmluaXRpb24gOiBnZXREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSkgewotCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKGRlZmluaXRpb24uZ2V0RGVmYXVsdEtleSgpLCBrZXkpKSB7Ci0JCQkJcmV0dXJuIGRlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBhdHRyaWJ1dGUgbWFwcGluZyBrZXk6ICIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPltdIGdldERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKLQkJaWYgKHRoaXMuZGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zID09IG51bGwpIHsKLQkJCXRoaXMuZGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zID0gdGhpcy5idWlsZERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uczsKLQl9Ci0JCi0JcHJvdGVjdGVkIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/PltdIGJ1aWxkRGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkgewotCQlBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8+PiBkZWZpbml0aW9ucyA9IAotCQkJCW5ldyBBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8+PigpOwotCQlhZGREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhkZWZpbml0aW9ucyk7Ci0JCURlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/PltdIGRlZmluaXRpb25BcnJheSA9IAotCQkJCWRlZmluaXRpb25zLnRvQXJyYXkobmV3IERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbltkZWZpbml0aW9ucy5zaXplKCldKTsKLQkJcmV0dXJuIGRlZmluaXRpb25BcnJheTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkRGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/Pj4gZGVmaW5pdGlvbnMpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Jhc2VKYXZhVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQmFzZUphdmFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcxYzdjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQmFzZUphdmFVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2ljTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlZlcnNpb25NYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVUkgZmFjdG9yeSByZXF1aXJlZCB0byBzaG93IHRoZSBpbmZvcm1hdGlvbgotICogcmVsYXRlZCB0byBhIEpQQSBtYXBwaW5nICh0eXBlIG9yIGF0dHJpYnV0ZSkuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSmF2YVVpRmFjdG9yeSBpbXBsZW1lbnRzIEphdmFVaUZhY3RvcnkKLXsJCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBqYXZhIHR5cGUgbWFwcGluZyBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRW50aXR5Q29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVudGl0eUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbWJlZGRhYmxlQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFbWJlZGRhYmxlQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogb3JtIHR5cGUgbWFwcGluZyBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW50aXR5Q29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FbnRpdHlDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRhYmxlQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRW1iZWRkYWJsZUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGphdmEgYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFCYXNpY01hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBCYXNpY01hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YVZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFPbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhVHJhbnNpZW50TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwM2Q5ZTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIERlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFCYXNpY01hcHBpbmc+Ci0JaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUJhc2ljTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCW5ldyBEZWZhdWx0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUJhc2ljTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIERlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXREZWZhdWx0S2V5KCkpOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlSmF2YUJhc2ljTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDkxYjkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhRW1iZWRkZWRNYXBwaW5nPgotCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbWJlZGRlZE1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhRW1iZWRkZWRNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldERlZmF1bHRLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0dlbmVyaWNKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9HZW5lcmljSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDdkZmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0dlbmVyaWNKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgR2VuZXJpY0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEdlbmVyaWNKYXZhUmVzb3VyY2VVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhVWlGYWN0b3J5IGJ1aWxkSmF2YVVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVVpRmFjdG9yeSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbWJlZGRlZElkTWFwcGluZ1VEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/Pj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoTnVsbEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVudGl0eVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0dlbmVyaWNKYXZhVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvR2VuZXJpY0phdmFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4M2NhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvR2VuZXJpY0phdmFVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBKYXZhIFVJIGZhY3RvcnkgcmVxdWlyZWQgdG8gc2hvdyB0aGUgaW5mb3JtYXRpb24KLSAqIHJlbGF0ZWQgdG8gYSBKUEEgbWFwcGluZyAodHlwZSBvciBhdHRyaWJ1dGUpLgotICoKLSAqIEBzZWUgSmF2YVVpRmFjdG9yeQotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFVaUZhY3RvcnkgZXh0ZW5kcyBCYXNlSmF2YVVpRmFjdG9yeQotewotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0OTFmYzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RCYXNpY01hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YUJhc2ljTWFwcGluZz4KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFCYXNpY01hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQluZXcgSmF2YUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUJhc2ljTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFCYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhQmFzaWNNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5OWYwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHBhbmUgZG9lcyBub3QgaGF2ZSBhbnkgd2lkZ2V0cy4KLSAqCi0gKiBAc2VlIEVtYmVkZGFibGUKLSAqIEBzZWUgRW1iZWRkYWJsZVVpUHJvdmlkZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFFbWJlZGRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RFbWJlZGRhYmxlQ29tcG9zaXRlPEVtYmVkZGFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW1iZWRkYWJsZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRW1iZWRkYWJsZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRhYmxlVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYTY0MGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRhYmxlVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRhYmxlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbiAKLQlleHRlbmRzIEFic3RyYWN0RW1iZWRkYWJsZVVpRGVmaW5pdGlvbjxQZXJzaXN0ZW50VHlwZSwgSmF2YUVtYmVkZGFibGU+Ci0JaW1wbGVtZW50cyBKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUVtYmVkZGFibGU+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhRW1iZWRkYWJsZT4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEphdmFFbWJlZGRhYmxlVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhRW1iZWRkYWJsZUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRlZElkTWFwcGluZ1VEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOWRkNzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRlZElkTWFwcGluZ1VEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhRW1iZWRkZWRJZE1hcHBpbmc+Ci0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhRW1iZWRkZWRJZE1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUVtYmVkZGVkSWRNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQkKLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzN2MyZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhRW1iZWRkZWRNYXBwaW5nPgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUVtYmVkZGVkTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUVtYmVkZGVkTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbnRpdHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRW50aXR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDIzYzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbnRpdHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhIEphdmEgZW50aXR5LgotICoKLSAqIEBzZWUgSmF2YUVudGl0eQotICogQHNlZSBKYXZhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIEphdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFFbnRpdHlDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZTxKYXZhRW50aXR5PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmF2YUVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkphdmFFbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YUVudGl0eUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTZWNvbmRhcnlUYWJsZXNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEphdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSW5oZXJpdGFuY2VTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVudGl0eVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbnRpdHlVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlZTY3My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVudGl0eVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbnRpdHlVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFFbnRpdHlVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RW50aXR5VWlEZWZpbml0aW9uPFBlcnNpc3RlbnRUeXBlLCBKYXZhRW50aXR5PgotCWltcGxlbWVudHMgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbnRpdHk+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVudGl0eVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFFbnRpdHlVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhRW50aXR5PiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmF2YUVudGl0eVVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhRW50aXR5Q29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFJZE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOWJhZGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFJZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUlkTWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RJZE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YUlkTWFwcGluZz4KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFJZE1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUlkTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFJZE1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFJZE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJvdGVjdGVkIEphdmFJZE1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhSWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFJbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFJbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmM3YjZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhSW5oZXJpdGFuY2VDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBqYXZhIGluaGVyaXRhbmNlLgotICoKLSAqIEBzZWUgSmF2YUVudGl0eQotICogQHNlZSBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhSW5oZXJpdGFuY2VDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlPEphdmFFbnRpdHk+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKYXZhSW5oZXJpdGFuY2VDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgSmF2YUVudGl0eT4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzdmZTBmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhTWFueVRvTWFueU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhTWFueVRvTWFueU1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhTWFueVRvTWFueU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZmQ3ODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0TWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhTWFueVRvT25lTWFwcGluZz4KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFNYW55VG9PbmVNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFNYW55VG9PbmVNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlSmF2YU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Q3YWU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRDbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IElkQ2xhc3NDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBNYXBwZWRTdXBlcmNsYXNzCi0gKiBAc2VlIEphdmFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqIEBzZWUgSWRDbGFzc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTxKYXZhTWFwcGVkU3VwZXJjbGFzcz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzM4OTc5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50VHlwZSwgSmF2YU1hcHBlZFN1cGVyY2xhc3M+Ci0JaW1wbGVtZW50cyBKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU1hcHBlZFN1cGVyY2xhc3M+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFNYXBwZWRTdXBlcmNsYXNzPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczMmE5Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFPbmVUb01hbnlNYXBwaW5nPgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU9uZVRvTWFueU1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU9uZVRvTWFueU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDkzODFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0T25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFPbmVUb09uZU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhT25lVG9PbmVNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhT25lVG9PbmVNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmF2YU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlYjI2Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRldGFpbHMgcGFnZSB1c2VkIGZvciB0aGUgSmF2YSBwZXJzaXN0ZW50Ci0gKiBhdHRyaWJ1dGUuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEphdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVHlwZSBtYXBwaW5nIHBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUKLSAqIEBzZWUgSmF2YVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UgZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIE1hcCBhcyBjb21wb3NpdGUKLQkJbmV3IFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgMCwgNSwgMCkKLQkJKTsKLQotCQlidWlsZE1hcHBpbmdQYWdlQm9vayhjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGI1YTQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU3RydWN0dXJlTm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgPGNvZGU+SnBhRGV0YWlsc1BhZ2U8L2NvZGU+Ci0gKiB3aGVuIHRoZSBpbmZvcm1hdGlvbiBjb21lcyBmcm9tIHRoZSBKYXZhIHNvdXJjZSBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYURldGFpbHNQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYURldGFpbHNQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFEZXRhaWxzUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc0RldGFpbHMoSnBhU3RydWN0dXJlTm9kZSBzdHJ1Y3R1cmVOb2RlKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHN0cnVjdHVyZU5vZGUuZ2V0SWQoKSwgSmF2YVN0cnVjdHVyZU5vZGVzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lEKQotCQkJCSYmIHN0cnVjdHVyZU5vZGUuZ2V0UmVzb3VyY2VUeXBlKCkuZ2V0Q29udGVudFR5cGUoKS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhRGV0YWlsc1BhZ2U8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGJ1aWxkRGV0YWlsc1BhZ2UoCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gbmV3IEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NGIxODguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgPGNvZGU+SnBhRGV0YWlsc1BhZ2U8L2NvZGU+Ci0gKiB3aGVuIHRoZSBpbmZvcm1hdGlvbiBjb21lcyBmcm9tIHRoZSBKYXZhIHNvdXJjZSBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyCi0JaW1wbGVtZW50cyBKcGFEZXRhaWxzUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFEZXRhaWxzUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYURldGFpbHNQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc0RldGFpbHMoSnBhU3RydWN0dXJlTm9kZSBzdHJ1Y3R1cmVOb2RlKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHN0cnVjdHVyZU5vZGUuZ2V0SWQoKSwgSmF2YVN0cnVjdHVyZU5vZGVzLlBFUlNJU1RFTlRfVFlQRV9JRCkKLQkJCQkmJiBzdHJ1Y3R1cmVOb2RlLmdldFJlc291cmNlVHlwZSgpLmdldENvbnRlbnRUeXBlKCkuZXF1YWxzKEpwdENvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEpwYURldGFpbHNQYWdlPFBlcnNpc3RlbnRUeXBlPiBidWlsZERldGFpbHNQYWdlKAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYTkyMjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEBzZWUgSmF2YUVudGl0eQotICogQHNlZSBKYXZhSW5oZXJpdGFuY2VDb21wb3NpdGUgLSBUaGUgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlPEphdmFFbnRpdHk+Ci17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250cm9sbGVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UHJpbWFyeUtleUpvaW5Db2x1bW4+KGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIFByaW1hcnlLZXlKb2luQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc3dpdGNoRGVmYXVsdFRvU3BlY2lmaWVkKCkgewotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGdldFN1YmplY3QoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQotCQlpZiAoZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0KLQkJCVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IGdldFN1YmplY3QoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJCXBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtbk5hbWUpOwotCQkJcGtKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQotCQkJdGhpcy5qb2luQ29sdW1uSG9sZGVyLnNldFZhbHVlKHBrSm9pbkNvbHVtbik7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM1NTE3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIEVudGl0eUNvbXBvc2l0ZSAtIFRoZSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIEFkZFJlbW92ZUxpc3RQYW5lCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTxKYXZhRW50aXR5PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEphdmFFbnRpdHk+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklFbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFNlY29uZGFyeVRhYmxlPiBidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U2Vjb25kYXJ5VGFibGU+KGJ1aWxkU2Vjb25kYXJ5VGFibGVzTGlzdEhvbGRlcigpLCAKLQkJCVRhYmxlLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZKTsKLQl9CQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTZWNvbmRhcnlUYWJsZT4gYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eSwgU2Vjb25kYXJ5VGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTZWNvbmRhcnlUYWJsZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOwotCi0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZUhvbGRlciA9Ci0JCQlidWlsZFNlY29uZGFyeVRhYmxlSG9sZGVyKCk7Ci0KLQkJLy8gU2Vjb25kYXJ5IFRhYmxlcyBhZGQvcmVtb3ZlIGxpc3QgcGFuZQotCQluZXcgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PigKLQkJCXRoaXMsCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKSwKLQkJCWJ1aWxkU2Vjb25kYXJ5VGFibGVzQWRhcHRlcigpLAotCQkJYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0TW9kZWwoKSwKLQkJCXNlY29uZGFyeVRhYmxlSG9sZGVyLAotCQkJYnVpbGRTZWNvbmRhcnlUYWJsZUxhYmVsUHJvdmlkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9DT0xVTU5TLy9UT0RPIG5lZWQgYSBoZWxwIGNvbnRleHQgaWQgZm9yIHRoaXMKLQkJKTsKLQotCQkvLyBQcmltYXJ5IEtleSBKb2luIENvbHVtbnMgcGFuZQotCQluZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlzZWNvbmRhcnlUYWJsZUhvbGRlciwKLQkJCWNvbnRhaW5lcgotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWUwN2U0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdFRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdFRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YVRyYW5zaWVudE1hcHBpbmc+Ci0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhVHJhbnNpZW50TWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhVHJhbnNpZW50TWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEphdmFUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhVHJhbnNpZW50TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQ2ZGY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0VmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhVmVyc2lvbk1hcHBpbmc+Ci0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhVmVyc2lvbk1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhVmVyc2lvbk1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFWZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9OdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9OdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkMTY3MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvTnVsbEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgTnVsbEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YUF0dHJpYnV0ZU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUF0dHJpYnV0ZU1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTnVsbEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCW5ldyBOdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhQXR0cmlidXRlTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhQXR0cmlidXRlTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTnVsbENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SmF2YUF0dHJpYnV0ZU1hcHBpbmc+Ci0JCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi0JewotCQlOdWxsQ29tcG9zaXRlKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhQXR0cmlidXRlTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikge30KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvTnVsbEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL051bGxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2NmJhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvTnVsbEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE51bGxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50VHlwZSwgSmF2YVR5cGVNYXBwaW5nPgotCWltcGxlbWVudHMgRGVmYXVsdEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhVHlwZU1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTnVsbEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBOdWxsSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFUeXBlTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvclR5cGVNYXBwaW5nKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTnVsbFR5cGVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEtleSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YVR5cGVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gbmV3IE51bGxDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBOdWxsQ29tcG9zaXRlIAotCQlleHRlbmRzIFBhbmU8SmF2YVR5cGVNYXBwaW5nPgotCQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZSAKLQl7Ci0JCU51bGxDb21wb3NpdGUoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFUeXBlTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkJCi0JCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCQl9Ci0JCQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikge30KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmEwNzkyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEpwYURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNhdGFsb2dDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFhtbFBhY2thZ2VDaG9vc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgU2NoZW1hOiAgICAgIHwgU2NoZW1hQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQ2F0YWxvZzogICAgIHwgQ2F0YWxvZ0NvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQWNjZXNzIFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1RdWVyaWVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHlNYXBwaW5ncwotICogQHNlZSBBYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBDYXRhbG9nQ29tYm8KLSAqIEBzZWUgRW51bUZvcm1Db21ib1ZpZXdlcgotICogQHNlZSBFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUKLSAqIEBzZWUgT3JtUGFja2FnZUNob29zZXIKLSAqIEBzZWUgT3JtUXVlcmllc0NvbXBvc2l0ZQotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZQotICogQHNlZSBTY2hlbWFDb21ibwotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlIGV4dGVuZHMgQWJzdHJhY3RKcGFEZXRhaWxzUGFnZTxFbnRpdHlNYXBwaW5ncz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5pbml0aWFsaXplRW50aXR5TWFwcGluZ3NDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplR2VuZXJhdG9yc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVRdWVyaWVzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbnRpdHlNYXBwaW5nc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLkVudGl0eU1hcHBpbmdzU2VjdGlvbl90aXRsZSwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKQotCQkpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZUVudGl0eU1hcHBpbmdzU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW50aXR5TWFwcGluZ3NTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gUGFja2FnZSB3aWRnZXRzCi0JCW5ldyBPcm1QYWNrYWdlQ2hvb3Nlcih0aGlzLCBjb250YWluZXIpOwotCi0JCS8vIFNjaGVtYSB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX3NjaGVtYSwKLQkJCWFkZFNjaGVtYUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX1NDSEVNQQotCQkpOwotCi0JCS8vIENhdGFsb2cgd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9jYXRhbG9nLAotCQkJYWRkQ2F0YWxvZ0NvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX0NBVEFMT0cKLQkJKTsKLQotCQkvLyBBY2Nlc3MgVHlwZSB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX2FjY2VzcywKLQkJCWFkZEFjY2Vzc1R5cGVDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9BQ0NFU1MKLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRQZXJzaXN0ZW50VW5pdE1ldGFkYXRhSG9sZGVyKCksCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkKLQkJKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RW50aXR5TWFwcGluZ3MsIEFjY2Vzc1R5cGU+IGFkZEFjY2Vzc1R5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEVudGl0eU1hcHBpbmdzLCBBY2Nlc3NUeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFbnRpdHlNYXBwaW5ncy5ERUZBVUxUX0FDQ0VTU19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5TWFwcGluZ3MuU1BFQ0lGSUVEX0FDQ0VTU19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc1R5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBBY2Nlc3NUeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRBY2Nlc3MoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoQWNjZXNzVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZSA9PSBBY2Nlc3NUeXBlLkZJRUxEID8KLQkJCQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLkVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfZmllbGQgOgotCQkJCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9wcm9wZXJ0eTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEFjY2VzcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkQWNjZXNzKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZ0NvbWJvPEVudGl0eU1hcHBpbmdzPiBhZGRDYXRhbG9nQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2F0YWxvZ0NvbWJvPEVudGl0eU1hcHBpbmdzPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFbnRpdHlNYXBwaW5ncy5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVudGl0eU1hcHBpbmdzLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZENhdGFsb2codmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YT4gYnVpbGRQZXJzaXN0ZW50VW5pdE1ldGFkYXRhSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eU1hcHBpbmdzLCBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSB0cmFuc2Zvcm1fKEVudGl0eU1hcHBpbmdzIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFNjaGVtYUNvbWJvPEVudGl0eU1hcHBpbmdzPiBhZGRTY2hlbWFDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBTY2hlbWFDb21ibzxFbnRpdHlNYXBwaW5ncz4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5TWFwcGluZ3MuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVudGl0eU1hcHBpbmdzLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRTY2hlbWEodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKLQkJCX0KLQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0b3JzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQljb250YWluZXIKLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUXVlcmllc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1RdWVyaWVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0T3JtRW50aXR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVudGl0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmE0ZmJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0T3JtRW50aXR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRW50aXR5TmFtZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JZENsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuQmFzZUphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgYW4gT1JNIGVudGl0eS4KLSAqCi0gKiBAc2VlIE9ybUVudGl0eQotICogQHNlZSBCYXNlSmF2YVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1FbnRpdHlDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZTxPcm1FbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1FbnRpdHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5Pcm1FbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1FbnRpdHlDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVFbnRpdHlDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplUXVlcmllc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVJbmhlcml0YW5jZUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplR2VuZXJhdG9yc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVTZWNvbmRhcnlUYWJsZXNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW50aXR5U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1KYXZhQ2xhc3NDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyLCBmYWxzZSk7Ci0JCW5ldyBUYWJsZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRW50aXR5TmFtZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgSWRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBidWlsZElkQ2xhc3NSZWZlcmVuY2VIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGUodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybUVudGl0eSwgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSW5oZXJpdGFuY2VTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybUluaGVyaXRhbmNlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViYzc3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5NYXBwaW5nUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgZGVmaW5pdGlvbiBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlIGl0IGlzIGluaXRpYWxpemVkKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24KLQlpbXBsZW1lbnRzIE1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCQotCXByaXZhdGUgT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPltdIG9ybVR5cGVNYXBwaW5nVWlEZWZpbnRpb25zOwotCi0JcHJpdmF0ZSBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPltdIG9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmludGlvbnM7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeTsKLQkKLQkKLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZmFjdG9yeSA9IGJ1aWxkT3JtWG1sVWlGYWN0b3J5KCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBPcm1YbWxVaUZhY3RvcnkgYnVpbGRPcm1YbWxVaUZhY3RvcnkoKTsKLQkKLQlwdWJsaWMgT3JtWG1sVWlGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiB0aGlzLmZhY3Rvcnk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogT1JNIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZShTdHJpbmcga2V5LCBQcm9wZXJ0eVZhbHVlTW9kZWw8VHlwZU1hcHBpbmc+IG1hcHBpbmdIb2xkZXIsIENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxUeXBlTWFwcGluZz4gbWFwcGluZ1VpRGVmaW5pdGlvbiA9IAotCQkJKE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPFR5cGVNYXBwaW5nPikgZ2V0T3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb24oa2V5KTsKLQkJcmV0dXJuIG1hcHBpbmdVaURlZmluaXRpb24uYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCWdldEZhY3RvcnkoKSwgCi0JCQltYXBwaW5nSG9sZGVyLAotCQkJcGFyZW50LAotCQkJd2lkZ2V0RmFjdG9yeQotCQkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPiBnZXRPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSkgewotCQlmb3IgKE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4gZGVmaW5pdGlvbiA6IGdldE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpKSB7Ci0JCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwoZGVmaW5pdGlvbi5nZXRLZXkoKSwgbWFwcGluZ0tleSkpIHsKLQkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHR5cGUgbWFwcGluZyBrZXk6ICIgKyBtYXBwaW5nS2V5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgSXRlcmF0b3I8TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50VHlwZSwgPyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gCi0JCQl0eXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7Ci0JCQotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50VHlwZSwgPyBleHRlbmRzIFR5cGVNYXBwaW5nPj4oCi0JCQkJZ2V0T3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz5bXSBnZXRPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7Ci0JCWlmICh0aGlzLm9ybVR5cGVNYXBwaW5nVWlEZWZpbnRpb25zID09IG51bGwpIHsKLQkJCXRoaXMub3JtVHlwZU1hcHBpbmdVaURlZmludGlvbnMgPSB0aGlzLmJ1aWxkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmdVaURlZmludGlvbnM7Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBtYXBwaW5nIGRlZmluaXRpb25zIHRvIHVzZSBmb3IgdHlwZXMgaW4gbWFwcGluZyBmaWxlcyBvZiB0aGlzIHR5cGUuICAKLQkgKiBUaGUgb3JkZXIgaXMgdW5pbXBvcnRhbnQuCi0JICovCi0JcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz5bXSBidWlsZE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKLQkJQXJyYXlMaXN0PE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PigpOwotCQl0aGlzLmFkZE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCU9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz5bXSBkZWZpbml0aW9uQXJyYXkgPSBkZWZpbml0aW9ucy50b0FycmF5KG5ldyBPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbltkZWZpbml0aW9ucy5zaXplKCldKTsKLQkJcmV0dXJuIGRlZmluaXRpb25BcnJheTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKTsKLQkKLQlwdWJsaWMgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsID8gZXh0ZW5kcyBUeXBlTWFwcGluZz4gZ2V0RGVmYXVsdFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQkvL3RoZXJlIGlzIG5vIHdheSB0byBjaG9vc2UgYW4gdHlwZSBpbiB0aGUgb3JtLnhtbCB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHNwZWNpZmllZCBtYXBwaW5nIHNvIHdlIGNhbiByZXR1cm4gbnVsbCBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvLyAqKioqKioqKioqIE9STSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqKgotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKFN0cmluZyBrZXksIFByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nSG9sZGVyLCBDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEF0dHJpYnV0ZU1hcHBpbmc+IG1hcHBpbmdVaURlZmluaXRpb24gPSAKLQkJCShPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEF0dHJpYnV0ZU1hcHBpbmc+KSBnZXRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKGtleSk7Ci0JCXJldHVybiBtYXBwaW5nVWlEZWZpbml0aW9uLmJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCWdldEZhY3RvcnkoKSwgCi0JCQltYXBwaW5nSG9sZGVyLAotCQkJcGFyZW50LAotCQkJd2lkZ2V0RmFjdG9yeQotCQkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gZ2V0T3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSkgewotCQlmb3IgKE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IGRlZmluaXRpb24gOiBnZXRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpKSB7Ci0JCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwoZGVmaW5pdGlvbi5nZXRLZXkoKSwgbWFwcGluZ0tleSkpIHsKLQkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gVW5zdXBwb3J0ZWRPcm1NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCA/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgPyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PigKLQkJCQlnZXRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPltdIGdldE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkgewotCQlpZiAodGhpcy5vcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbnRpb25zID09IG51bGwpIHsKLQkJCXRoaXMub3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW50aW9ucyA9IHRoaXMuYnVpbGRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpOwotCQl9Ci0JCXJldHVybiB0aGlzLm9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmludGlvbnM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBtYXBwaW5nIGRlZmluaXRpb25zIHRvIHVzZSBmb3IgYXR0cmlidXRlcyBpbiBtYXBwaW5nIGZpbGVzIG9mIHRoaXMgdHlwZS4gIAotCSAqIFRoZSBvcmRlciBpcyB1bmltcG9ydGFudC4KLQkgKi8KLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBidWlsZE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkgewotCQlBcnJheUxpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4oKTsKLQkJdGhpcy5hZGRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCU9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+W10gZGVmaW5pdGlvbkFycmF5ID0gZGVmaW5pdGlvbnMudG9BcnJheShuZXcgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbltkZWZpbml0aW9ucy5zaXplKCldKTsKLQkJcmV0dXJuIGRlZmluaXRpb25BcnJheTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKTsKLQkKLQlwdWJsaWMgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgPyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IGdldERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWRkR2VuZXJhdG9yRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BZGRHZW5lcmF0b3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjNTZkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BZGRHZW5lcmF0b3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuVmFsaWRhdGluZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0xpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIENsaWVudHMgY2FuIHVzZSB0aGlzIGRpYWxvZyB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIFNlY29uZGFyeVRhYmxlIHNldHRpbmdzLgotICogVXNlIHRoZSBmb2xsb3dpbmcgb25jZSB0aGUgZGlhbG9nIGlzIGNsb3NlZDoKLSAqICAgICBAc2VlICNnZXRTZWxlY3RlZFRhYmxlKCkKLSAqICAgICBAc2VlICNnZXRTZWxlY3RlZENhdGFsb2coKQotICogICAgIEBzZWUgI2dldFNlbGVjdGVkU2NoZW1hKCkKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgQWRkR2VuZXJhdG9yRGlhbG9nIGV4dGVuZHMgVmFsaWRhdGluZ0RpYWxvZzxBZGRHZW5lcmF0b3JTdGF0ZU9iamVjdD4gewotCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgdG8gZWRpdCBhbiBleGlzdGluZyBjb252ZXJzaW9uIHZhbHVlCi0JICovCi0JcHVibGljIEFkZEdlbmVyYXRvckRpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWRkR2VuZXJhdG9yU3RhdGVPYmplY3QgYnVpbGRTdGF0ZU9iamVjdCgpIHsKLQkJcmV0dXJuIG5ldyBBZGRHZW5lcmF0b3JTdGF0ZU9iamVjdCgpOwotCX0KLQotCS8vICoqKioqKioqKiogb3BlbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQodGhpcy5nZXRUaXRsZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuQWRkR2VuZXJhdG9yRGlhbG9nX3RpdGxlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb25UaXRsZSgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLkFkZEdlbmVyYXRvckRpYWxvZ19kZXNjcmlwdGlvblRpdGxlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuQWRkR2VuZXJhdG9yRGlhbG9nX2Rlc2NyaXB0aW9uOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGlhbG9nUGFuZTxBZGRHZW5lcmF0b3JTdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyYXRvckRpYWxvZ1BhbmUoY29udGFpbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQotCQlHZW5lcmF0b3JEaWFsb2dQYW5lIHBhbmUgPSAoR2VuZXJhdG9yRGlhbG9nUGFuZSkgZ2V0UGFuZSgpOwotCQlwYW5lLnNlbGVjdEFsbCgpOwotCi0JCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhIHZhbHVlIHNldCBpbiB0aGUgdGV4dCB3aWRnZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB2YWx1ZSBzZXQgaW4gdGhlIHRleHQgd2lkZ2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R2VuZXJhdG9yVHlwZSgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRHZW5lcmF0b3JUeXBlKCk7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgR2VuZXJhdG9yRGlhbG9nUGFuZSBleHRlbmRzIERpYWxvZ1BhbmU8QWRkR2VuZXJhdG9yU3RhdGVPYmplY3Q+IHsKLQotCQlwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0KLQkJR2VuZXJhdG9yRGlhbG9nUGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihBZGRHZW5lcmF0b3JEaWFsb2cudGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIHBhcmVudCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQl0aGlzLm5hbWVUZXh0ID0gYWRkTGFiZWxlZFRleHQoCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLkFkZEdlbmVyYXRvckRpYWxvZ19uYW1lLAotCQkJCWJ1aWxkTmFtZUhvbGRlcigpCi0JCQkpOwotCQkJCi0JCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQkJY29udGFpbmVyLCAKLQkJCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5BZGRHZW5lcmF0b3JEaWFsb2dfZ2VuZXJhdG9yVHlwZSwgCi0JCQkJYnVpbGRHZW5lcmF0b3JUeXBlTGlzdEhvbGRlcigpLCAKLQkJCQlidWlsZEdlbmVyYXRvclR5cGVIb2xkZXIoKSwgCi0JCQkJYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKSwKLQkJCQludWxsKTsKLQkJfQotCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkR2VuZXJhdG9yVHlwZUxpc3RIb2xkZXIoKSB7Ci0JCQlMaXN0PFN0cmluZz4gZ2VuZXJhdG9yVHlwZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWdlbmVyYXRvclR5cGVzLmFkZChHZW5lcmF0b3IuVEFCTEVfR0VORVJBVE9SKTsKLQkJCWdlbmVyYXRvclR5cGVzLmFkZChHZW5lcmF0b3IuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJCQotCQkJcmV0dXJuIG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KGdlbmVyYXRvclR5cGVzKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFN0cmluZ0NvbnZlcnRlcigpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7Ci0JCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCWlmICh2YWx1ZSA9PSBHZW5lcmF0b3IuVEFCTEVfR0VORVJBVE9SKSB7Ci0JCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuQWRkR2VuZXJhdG9yRGlhbG9nX3RhYmxlR2VuZXJhdG9yOwotCQkJCQl9Ci0JCQkJCWlmICh2YWx1ZSA9PSBHZW5lcmF0b3IuU0VRVUVOQ0VfR0VORVJBVE9SKSB7Ci0JCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuQWRkR2VuZXJhdG9yRGlhbG9nX3NlcXVlbmNlR2VuZXJhdG9yOwotCQkJCQl9Ci0JCQkJCXJldHVybiB2YWx1ZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QWRkR2VuZXJhdG9yU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBBZGRHZW5lcmF0b3JTdGF0ZU9iamVjdC5OQU1FX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEdlbmVyYXRvclR5cGVIb2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxBZGRHZW5lcmF0b3JTdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEFkZEdlbmVyYXRvclN0YXRlT2JqZWN0LkdFTkVSQVRPUl9UWVBFX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRHZW5lcmF0b3JUeXBlKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0R2VuZXJhdG9yVHlwZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXZvaWQgc2VsZWN0QWxsKCkgewotCQkJdGhpcy5uYW1lVGV4dC5zZWxlY3RBbGwoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0FkZEdlbmVyYXRvclN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BZGRHZW5lcmF0b3JTdGF0ZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDEwZjVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0FkZEdlbmVyYXRvclN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuQWJzdHJhY3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLlByb2JsZW07Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgc3RhdGUgb2JqZWN0IHVzZWQgYnkgdGhlIDxjb2RlPkFkZEdlbmVyYXRvckRpYWxvZzwvY29kZT4sIHdoaWNoIHN0b3JlcwotICogdGhlIGN1cnJlbnQgbmFtZSBhbmQgdmFsaWRhdGVzIGl0IHdoZW4gaXQgaXMgbW9kaWZpZWQuCi0gKgotICogQHNlZSBBZGRHZW5lcmF0b3JEaWFsb2cKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotZmluYWwgY2xhc3MgQWRkR2VuZXJhdG9yU3RhdGVPYmplY3QgZXh0ZW5kcyBBYnN0cmFjdE5vZGUKLXsKLQkvKioKLQkgKiBUaGUgaW5pdGlhbCBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIFRoZSBpbml0aWFsIGdlbmVyYXRvclR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZW5lcmF0b3JUeXBlOwotCi0JLyoqCi0JICogVGhlIDxjb2RlPlZhbGlkYXRvcjwvY29kZT4gdXNlZCB0byB2YWxpZGF0ZSB0aGlzIHN0YXRlIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgZGF0YSB2YWx1ZSBwcm9wZXJ0eS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZVByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE5vdGlmaWVzIGEgY2hhbmdlIGluIHRoZSBnZW5lcmF0b3IgdHlwZSBwcm9wZXJ0eS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRPUl9UWVBFX1BST1BFUlRZID0gImdlbmVyYXRvclR5cGVQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TmV3TmFtZVN0YXRlT2JqZWN0PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIFRoZSBpbml0aWFsIGlucHV0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGluaXRpYWwgdmFsdWUgY2FuCi0JICogYmUgc3BlY2lmaWVkCi0JICogQHBhcmFtIG5hbWVzIFRoZSBjb2xsZWN0aW9uIG9mIG5hbWVzIHRoYXQgY2FuJ3QgYmUgdXNlZCBvciBhbiBlbXB0eQotCSAqIGNvbGxlY3Rpb24gaWYgbm9uZSBhcmUgYXZhaWxhYmxlCi0JICovCi0JQWRkR2VuZXJhdG9yU3RhdGVPYmplY3QoKSB7Ci0JCXN1cGVyKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGROYW1lUHJvYmxlbXNUbyhMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLm5hbWUpKSB7Ci0JCQljdXJyZW50UHJvYmxlbXMuYWRkKGJ1aWxkUHJvYmxlbShKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5HZW5lcmF0b3JTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkR2VuZXJhdG9yVHlwZVByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5nZW5lcmF0b3JUeXBlKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuR2VuZXJhdG9yU3RhdGVPYmplY3RfdHlwZU11c3RCZVNwZWNpZmllZCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvYmxlbXNUbyhMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgewotCQlzdXBlci5hZGRQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JCWFkZE5hbWVQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JCWFkZEdlbmVyYXRvclR5cGVQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tQYXJlbnQoTm9kZSBwYXJlbnROb2RlKSB7Ci0JCS8vbm8gcGFyZW50Ci0JfQotCi0JcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0R2VuZXJhdG9yVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRvclR5cGUoU3RyaW5nIG5ld0dlbmVyYXRvclR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZ2VuZXJhdG9yVHlwZTsKLQkJdGhpcy5nZW5lcmF0b3JUeXBlID0gbmV3R2VuZXJhdG9yVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChHRU5FUkFUT1JfVFlQRV9QUk9QRVJUWSwgb2xkLCBuZXdHZW5lcmF0b3JUeXBlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMudmFsaWRhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Jhc2VPcm1YbWxVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Jhc2VPcm1YbWxVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1MjViMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9CYXNlT3JtWG1sVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgT3JtIFhtbCBVSSBmYWN0b3J5IHJlcXVpcmVkIHRvIHNob3cgdGhlIGluZm9ybWF0aW9uCi0gKiByZWxhdGVkIHRvIGEgSlBBIG1hcHBpbmcgKHR5cGUgb3IgYXR0cmlidXRlKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VPcm1YbWxVaUZhY3RvcnkgaW1wbGVtZW50cyBPcm1YbWxVaUZhY3RvcnkKLXsKLQkKLQkvLyAqKioqKioqKioqKioqKioqIG9ybSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRW50aXR5Q29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkYWJsZUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVtYmVkZGFibGVDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBvcm0gYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1JZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1CYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1UcmFuc2llbnRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IFRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExODFiMzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNhdGFsb2dDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBYbWxQYWNrYWdlQ2hvb3NlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFNjaGVtYTogICAgICB8IFNjaGVtYUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENhdGFsb2c6ICAgICB8IENhdGFsb2dDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEFjY2VzcyBUeXBlOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9ybUdlbmVyYXRvcnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtUXVlcmllc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3MKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENhdGFsb2dDb21ibwotICogQHNlZSBFbnVtRm9ybUNvbWJvVmlld2VyCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZQotICogQHNlZSBPcm1QYWNrYWdlQ2hvb3NlcgotICogQHNlZSBPcm1RdWVyaWVzQ29tcG9zaXRlCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlCi0gKiBAc2VlIFNjaGVtYUNvbWJvCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlIGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTk4NTVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSB7QGxpbmsgSnBhRGV0YWlsc1BhZ2V9Ci0gKiB3aGVuIHRoZSBpbmZvcm1hdGlvbiBjb21lcyBmcm9tIHRoZSBYTUwgZmlsZSAoZWl0aGVyIGZyb20gdGhlIHBlcnNpc3RlbmNlCi0gKiBjb25maWd1cmF0aW9uIG9yIGZyb20gdGhlIE1hcHBpbmdzIERlc2NyaXB0b3IpLgotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFEZXRhaWxzUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhRGV0YWlsc1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvdmlkZXNEZXRhaWxzKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEpwYURldGFpbHNQYWdlPEVudGl0eU1hcHBpbmdzPiBidWlsZERldGFpbHNQYWdlKAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNhN2Q1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5HZW5lcmF0b3JDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuR2VuZXJhdG9yQ29tcG9zaXRlLkdlbmVyYXRvckJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbFN3aXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIFRoaXMgcGFuZSBzaG93cyB0aGUgbGlzdCBvZiBuYW1lZCBxdWVyaWVzIGFuZCBuYW1lZCBuYXRpdmUgcXVlcmllcy4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSBvciBPcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHlNYXBwaW5ncwotICogQHNlZSBPcm1HZW5lcmF0b3IKLSAqIEBzZWUgT3JtU2VxdWVuY2VHZW5lcmF0b3IKLSAqIEBzZWUgT3JtVGFibGVHZW5lcmF0b3IKLSAqIEBzZWUgRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgT3JtU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUKLSAqIEBzZWUgT3JtVGFibGVHZW5lcmF0b3JDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RW50aXR5TWFwcGluZ3M+Ci17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPcm1HZW5lcmF0b3I+IGdlbmVyYXRvckhvbGRlcjsKLQlwcml2YXRlIEdlbmVyYXRvckNvbXBvc2l0ZTxTZXF1ZW5jZUdlbmVyYXRvcj4gc2VxdWVuY2VHZW5lcmF0b3JQYW5lOwotCXByaXZhdGUgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUgdGFibGVHZW5lcmF0b3JQYW5lOwotCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5TWFwcGluZ3M+IGxpc3RQYW5lOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZSgKLQkJCQkJCVBhbmU8PyBleHRlbmRzIEVudGl0eU1hcHBpbmdzPiBwYXJlbnRQYW5lLAotCQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkR2VuZXJhdG9yKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJYWRkR2VuZXJhdG9yRnJvbURpYWxvZyhsaXN0U2VsZWN0aW9uTW9kZWwsIGJ1aWxkQWRkR2VuZXJhdG9yRGlhbG9nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQWRkR2VuZXJhdG9yRGlhbG9nIGJ1aWxkQWRkR2VuZXJhdG9yRGlhbG9nKCkgewotCQlyZXR1cm4gbmV3IEFkZEdlbmVyYXRvckRpYWxvZyhnZXRTaGVsbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHZW5lcmF0b3JGcm9tRGlhbG9nKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwsIEFkZEdlbmVyYXRvckRpYWxvZyBkaWFsb2cpIHsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGdlbmVyYXRvclR5cGUgPSBkaWFsb2cuZ2V0R2VuZXJhdG9yVHlwZSgpOwotCQlPcm1HZW5lcmF0b3IgZ2VuZXJhdG9yOwotCQlpZiAoZ2VuZXJhdG9yVHlwZSA9PSBHZW5lcmF0b3IuVEFCTEVfR0VORVJBVE9SKSB7Ci0JCQlnZW5lcmF0b3IgPSB0aGlzLmdldFN1YmplY3QoKS5hZGRUYWJsZUdlbmVyYXRvcihnZXRTdWJqZWN0KCkuZ2V0VGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJfQotCQllbHNlIGlmIChnZW5lcmF0b3JUeXBlID09IEdlbmVyYXRvci5TRVFVRU5DRV9HRU5FUkFUT1IpIHsKLQkJCWdlbmVyYXRvciA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKGdldFN1YmplY3QoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCWdlbmVyYXRvci5zZXROYW1lKGRpYWxvZy5nZXROYW1lKCkpOwotCQl0aGlzLmdlbmVyYXRvckhvbGRlci5zZXRWYWx1ZShnZW5lcmF0b3IpOy8vc28gdGhhdCBpdCBnZXRzIHNlbGVjdGVkIGluIHRoZSBMaXN0IGZvciB0aGUgdXNlciB0byBlZGl0Ci0JCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGdlbmVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxPcm1HZW5lcmF0b3I+IGJ1aWxkRGlzcGxheWFibGVHZW5lcmF0b3JMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxPcm1HZW5lcmF0b3I+KAotCQkJYnVpbGRHZW5lcmF0b3JzTGlzdEhvbGRlcigpLAotCQkJR2VuZXJhdG9yLk5BTUVfUFJPUEVSVFkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRHZW5lcmF0b3JBZGFwdGVyKCkgewotCi0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRHZW5lcmF0b3IobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBPcm1TZXF1ZW5jZUdlbmVyYXRvcikgewotCQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKChPcm1TZXF1ZW5jZUdlbmVyYXRvcikgaXRlbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoKE9ybVRhYmxlR2VuZXJhdG9yKSBpdGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUdlbmVyYXRvcj4gYnVpbGRHZW5lcmF0b3JIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUdlbmVyYXRvcj4oKTsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkR2VuZXJhdG9yTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlPcm1HZW5lcmF0b3IgZ2VuZXJhdG9yID0gKE9ybUdlbmVyYXRvcikgZWxlbWVudDsKLQkJCQlTdHJpbmcgbmFtZSA9IGdlbmVyYXRvci5nZXROYW1lKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCWludCBpbmRleCA9IC0xOwotCi0JCQkJCWlmIChnZW5lcmF0b3IgaW5zdGFuY2VvZiBPcm1TZXF1ZW5jZUdlbmVyYXRvcikgewotCQkJCQkJaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihnZXRTdWJqZWN0KCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCksIGdlbmVyYXRvcik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGdldFN1YmplY3QoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKSwgZ2VuZXJhdG9yKTsKLQkJCQkJfQotCi0JCQkJCW5hbWUgPSBOTFMuYmluZChKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2Rpc3BsYXlTdHJpbmcsIEludGVnZXIudmFsdWVPZihpbmRleCkpOwotCQkJCX0KLQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtR2VuZXJhdG9yPiBidWlsZEdlbmVyYXRvcnNMaXN0SG9sZGVyKCkgewotCQlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1HZW5lcmF0b3I+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtR2VuZXJhdG9yPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckxpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkVGFibGVHZW5lcmF0b3JMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1HZW5lcmF0b3I+LCBPcm1HZW5lcmF0b3I+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5TWFwcGluZ3MsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oRW50aXR5TWFwcGluZ3MgdmFsdWUpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlICE9IG51bGwpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8T3JtR2VuZXJhdG9yLCBDb250cm9sPiBidWlsZFBhbmVUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxPcm1HZW5lcmF0b3IsIENvbnRyb2w+KCkgewotCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKE9ybUdlbmVyYXRvciBnZW5lcmF0b3IpIHsKLQotCQkJCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAoZ2VuZXJhdG9yIGluc3RhbmNlb2YgT3JtU2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJCQkJcmV0dXJuIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZS50aGlzLnNlcXVlbmNlR2VuZXJhdG9yUGFuZS5nZXRDb250cm9sKCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZS50aGlzLnRhYmxlR2VuZXJhdG9yUGFuZS5nZXRDb250cm9sKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8T3JtR2VuZXJhdG9yLCBTZXF1ZW5jZUdlbmVyYXRvcj4odGhpcy5nZW5lcmF0b3JIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNlcXVlbmNlR2VuZXJhdG9yIHRyYW5zZm9ybV8oT3JtR2VuZXJhdG9yIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIFNlcXVlbmNlR2VuZXJhdG9yKSA/IChTZXF1ZW5jZUdlbmVyYXRvcikgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBPcm1TZXF1ZW5jZUdlbmVyYXRvcj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFbnRpdHlNYXBwaW5ncy5TRVFVRU5DRV9HRU5FUkFUT1JTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8T3JtR2VuZXJhdG9yLCBUYWJsZUdlbmVyYXRvcj4odGhpcy5nZW5lcmF0b3JIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhYmxlR2VuZXJhdG9yIHRyYW5zZm9ybV8oT3JtR2VuZXJhdG9yIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIFRhYmxlR2VuZXJhdG9yKSA/IChUYWJsZUdlbmVyYXRvcikgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtVGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVHZW5lcmF0b3JMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBPcm1UYWJsZUdlbmVyYXRvcj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFbnRpdHlNYXBwaW5ncy5UQUJMRV9HRU5FUkFUT1JTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxPcm1UYWJsZUdlbmVyYXRvcj4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGFibGVHZW5lcmF0b3JzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXRoaXMuZ2VuZXJhdG9ySG9sZGVyID0gYnVpbGRHZW5lcmF0b3JIb2xkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2dyb3VwQm94Ci0JCSk7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCXRoaXMubGlzdFBhbmUgPSBhZGRMaXN0UGFuZShjb250YWluZXIpOwotCQl0aGlzLmluc3RhbGxQYW5lRW5hYmxlcigpOwotCi0JCS8vIFByb3BlcnR5IHBhbmUKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvckhvbGRlciA9Ci0JCQl0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIoKTsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFRhYmxlR2VuZXJhdG9yPiB0YWJsZUdlbmVyYXRvckhvbGRlciA9Ci0JCQl0aGlzLmJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoKTsKLQotCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIHByb3BlcnR5IHBhbmUKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvclBhbmUgPSB0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQlwYWdlQm9vaywKLQkJCXNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyLAotCQkJdGhpcy5idWlsZFNlcXVlbmNlR2VuZXJhdG9yQnVpbGRlcigpCi0JCSk7Ci0KLQkJLy8gVGFibGUgR2VuZXJhdG9yIHByb3BlcnR5IHBhbmUKLQkJdGhpcy50YWJsZUdlbmVyYXRvclBhbmUgPSBuZXcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJdGFibGVHZW5lcmF0b3JIb2xkZXIsCi0JCQlwYWdlQm9vaywKLQkJCXRoaXMuYnVpbGRUYWJsZUdlbmVyYXRvckJ1aWxkZXIoKQotCQkpOwotCi0JCXRoaXMuYWRkQWxpZ25SaWdodCh0aGlzLnNlcXVlbmNlR2VuZXJhdG9yUGFuZSk7Ci0JCXRoaXMuYWRkQWxpZ25SaWdodCh0aGlzLnRhYmxlR2VuZXJhdG9yUGFuZSk7Ci0JCXRoaXMuaW5zdGFsbFBhbmVTd2l0Y2hlcihwYWdlQm9vayk7Ci0JfQotCi0JcHJvdGVjdGVkIEdlbmVyYXRvckNvbXBvc2l0ZTxTZXF1ZW5jZUdlbmVyYXRvcj4gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyLAotCQkJR2VuZXJhdG9yQnVpbGRlcjxTZXF1ZW5jZUdlbmVyYXRvcj4gZ2VuZXJhdG9yQnVpbGRlcikgewotCi0JCXJldHVybiBuZXcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJc2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIsCi0JCQlwYXJlbnQsCi0JCQlnZW5lcmF0b3JCdWlsZGVyCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHlNYXBwaW5ncz4gYWRkTGlzdFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5TWFwcGluZ3M+KAotCQkJdGhpcywKLQkJCWNvbnRhaW5lciwKLQkJCXRoaXMuYnVpbGRHZW5lcmF0b3JBZGFwdGVyKCksCi0JCQl0aGlzLmJ1aWxkRGlzcGxheWFibGVHZW5lcmF0b3JMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmdlbmVyYXRvckhvbGRlciwKLQkJCXRoaXMuYnVpbGRHZW5lcmF0b3JMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKCkgewotCQluZXcgUGFuZUVuYWJsZXIoCi0JCQl0aGlzLmJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSwKLQkJCXRoaXMubGlzdFBhbmUKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVTd2l0Y2hlcihQYWdlQm9vayBwYWdlQm9vaykgewotCQluZXcgQ29udHJvbFN3aXRjaGVyKHRoaXMuZ2VuZXJhdG9ySG9sZGVyLCB0aGlzLmJ1aWxkUGFuZVRyYW5zZm9ybWVyKCksIHBhZ2VCb29rKTsKLQl9CQotCi0JcHJpdmF0ZSBHZW5lcmF0b3JCdWlsZGVyPFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9yQnVpbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmF0b3JCdWlsZGVyPFNlcXVlbmNlR2VuZXJhdG9yPigpIHsKLQkJCXB1YmxpYyBTZXF1ZW5jZUdlbmVyYXRvciBhZGRHZW5lcmF0b3IoKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgc2VxdWVuY2UgZ2VuZXJhdG9yIHdpbGwgbmV2ZXIgYmUgbnVsbCBzbyB3ZSBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmF0b3JCdWlsZGVyPFRhYmxlR2VuZXJhdG9yPiBidWlsZFRhYmxlR2VuZXJhdG9yQnVpbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmF0b3JCdWlsZGVyPFRhYmxlR2VuZXJhdG9yPigpIHsKLQkJCXB1YmxpYyBUYWJsZUdlbmVyYXRvciBhZGRHZW5lcmF0b3IoKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgdGFibGUgZ2VuZXJhdG9yIHdpbGwgbmV2ZXIgYmUgbnVsbCBzbyB3ZSBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9HZW5lcmljT3JtWG1sVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9HZW5lcmljT3JtWG1sVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYTcyOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vR2VuZXJpY09ybVhtbFVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1YbWxVaUZhY3RvcnkgZXh0ZW5kcyBCYXNlT3JtWG1sVWlGYWN0b3J5Ci17Ci0JLy9ub3RoaW5nCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9KcHRVaURldGFpbHNPcm1NZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhlZDYzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9KcHRVaURldGFpbHNPcm1NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgT1JNIHdpZGdldHMuCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVaURldGFpbHNPcm1NZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX0ZhbHNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJvb2xlYW5fVHJ1ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzU2VjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX2FjY2VzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX2NhdGFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9maWVsZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX3BhY2thZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9wcm9wZXJ0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX3NjaGVtYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlNYXBwaW5nc1BhZ2VfY2F0YWxvZ0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NQYWdlX2NhdGFsb2dOb0RlZmF1bHRTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NQYWdlX3NjaGVtYURlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NQYWdlX3NjaGVtYU5vRGVmYXVsdFNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlX21ldGFkYXRhQ29tcGxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZV9tZXRhZGF0YUNvbXBsZXRlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9kaXNwbGF5U3RyaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZ3JvdXBCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtTWFwcGluZ05hbWVDaG9vc2VyX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtSmF2YUNsYXNzQ2hvb3Nlcl9qYXZhQ2xhc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtUXVlcmllc0NvbXBvc2l0ZV9ncm91cEJveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9hY2Nlc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfZGVsaW1pdGVkSWRlbnRpZmllcnNDaGVja0JveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9jYXNjYWRlUGVyc2lzdENoZWNrQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2NhdGFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfZmllbGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfcGVyc2lzdGVuY2VVbml0U2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9wcm9wZXJ0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9zY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVDaGVja0JveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb25fY2F0YWxvZ0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uX3NjaGVtYURlZmF1bHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRHZW5lcmF0b3JEaWFsb2dfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRHZW5lcmF0b3JEaWFsb2dfZ2VuZXJhdG9yVHlwZTsKLSAJcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkR2VuZXJhdG9yRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEdlbmVyYXRvckRpYWxvZ19kZXNjcmlwdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEdlbmVyYXRvckRpYWxvZ19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRHZW5lcmF0b3JEaWFsb2dfdGFibGVHZW5lcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkR2VuZXJhdG9yRGlhbG9nX3NlcXVlbmNlR2VuZXJhdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRvclN0YXRlT2JqZWN0X25hbWVNdXN0QmVTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdG9yU3RhdGVPYmplY3RfdHlwZU11c3RCZVNwZWNpZmllZDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbnN1cHBvcnRlZE9ybU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuc3VwcG9ydGVkT3JtTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF91aV9kZXRhaWxzX29ybSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5jbGFzczsKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOwotCX0KLQotCXByaXZhdGUgSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjU4ZTU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL01ldGFkYXRhQ29tcGxldGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcm1UeXBlTWFwcGluZz4gewotCi0JcHVibGljIE1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtVHlwZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZV9tZXRhZGF0YUNvbXBsZXRlLAotCQkJYnVpbGRNZXRhZGF0YUNvbXBsZXRlSG9sZGVyKCksCi0JCQlidWlsZE1ldGFkYXRhQ29tcGxldGVTdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE1ldGFkYXRhQ29tcGxldGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybVR5cGVNYXBwaW5nLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCU9ybVR5cGVNYXBwaW5nLlNQRUNJRklFRF9NRVRBREFUQV9DT01QTEVURV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTWV0YWRhdGFDb21wbGV0ZVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdE1ldGFkYXRhQ29tcGxldGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLk1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGVfbWV0YWRhdGFDb21wbGV0ZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZV9tZXRhZGF0YUNvbXBsZXRlOwotCQkJfQotCQl9OwotCX0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRNZXRhZGF0YUNvbXBsZXRlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1UeXBlTWFwcGluZywgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlPcm1UeXBlTWFwcGluZy5TUEVDSUZJRURfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFksCi0JCQlPcm1UeXBlTWFwcGluZy5ERUZBVUxUX01FVEFEQVRBX0NPTVBMRVRFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMGI5YzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0QmFzaWNNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RCYXNpY01hcHBpbmdDb21wb3NpdGU8T3JtQmFzaWNNYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmsxXzFPcm1CYXNpY01hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5CYXNpY01hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCYXNpY1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOTM5ZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybUJhc2ljTWFwcGluZz4KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtQmFzaWNNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQluZXcgT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUJhc2ljTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVPcm1CYXNpY01hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NjVkMWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRW1iZWRkYWJsZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RW1iZWRkYWJsZUNvbXBvc2l0ZTxPcm1FbWJlZGRhYmxlPiBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCXB1YmxpYyBPcm1FbWJlZGRhYmxlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVFbWJlZGRhYmxlQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGFibGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybUphdmFDbGFzc0Nob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtRW1iZWRkYWJsZSwgQWNjZXNzSG9sZGVyPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0Y2VkNjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRhYmxlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uIAotCWV4dGVuZHMgQWJzdHJhY3RFbWJlZGRhYmxlVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRUeXBlLCBPcm1FbWJlZGRhYmxlPgotCWltcGxlbWVudHMgT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248T3JtRW1iZWRkYWJsZT4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVtYmVkZGFibGU+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtRW1iZWRkYWJsZUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzk1ZGZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZTxPcm1FbWJlZGRlZElkTWFwcGluZz4KLQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCXB1YmxpYyBPcm1FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQotCQluZXcgRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlKAotCQkJCXRoaXMsCi0JCQkJY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwOWZjMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybUVtYmVkZGVkSWRNYXBwaW5nPgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FbWJlZGRlZElkTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVtYmVkZGVkSWRNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQkKLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGVkSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzg3YjZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBFbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbWJlZGRlZE1hcHBpbmcKLSAqIEBzZWUgQmFzZUphdmFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlPE9ybUVtYmVkZGVkTWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkVtYmVkZGVkTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1FbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGVkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCi0JCW5ldyBFbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JfQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNjdjYjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybUVtYmVkZGVkTWFwcGluZz4KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtRW1iZWRkZWRNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FbWJlZGRlZE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW50aXR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbnRpdHlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmMDY5NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbnRpdHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBPUk0gZW50aXR5LgotICoKLSAqIEBzZWUgT3JtRW50aXR5Ci0gKiBAc2VlIEJhc2VKYXZhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIE9ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtRW50aXR5Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RPcm1FbnRpdHlDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybUVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPk9ybUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FbnRpdHlDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW50aXR5VWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbnRpdHlVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2OTY3Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbnRpdHlVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbnRpdHlVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVudGl0eVVpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFbnRpdHlVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsIE9ybUVudGl0eT4KLQlpbXBsZW1lbnRzIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVudGl0eT4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FbnRpdHlVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1FbnRpdHlVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVudGl0eT4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE9ybUVudGl0eVVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtRW50aXR5Q29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1JZE1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyMTZiZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1JZE1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1JZE1hcHBpbmdDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlPE9ybUlkTWFwcGluZz4KLXsKLQlwdWJsaWMgT3JtSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1JZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1JZE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNThiNWY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uIAotCWV4dGVuZHMgQWJzdHJhY3RJZE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgT3JtSWRNYXBwaW5nPgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1JZE1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUlkTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1JZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVPcm1JZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1Jbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtSW5oZXJpdGFuY2VDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1NjNjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1Jbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBwYW5lIHVzZWQgZm9yIGphdmEgaW5oZXJpdGFuY2UuCi0gKgotICogQHNlZSBPcm1FbnRpdHkKLSAqIEBzZWUgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1Jbmhlcml0YW5jZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGU8T3JtRW50aXR5PiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybUluaGVyaXRhbmNlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcm1Jbmhlcml0YW5jZUNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBPcm1FbnRpdHk+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtSmF2YUNsYXNzQ2hvb3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtSmF2YUNsYXNzQ2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDFhZmNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUphdmFDbGFzc0Nob29zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgQ2xhc3NDaG9vc2VyUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBUT0RPIHBvc3NpYmx5IGhlbHAgdGhlIHVzZXIgYW5kIGlmIHRoZXkgaGF2ZSBjaG9zZW4gYSBwYWNrYWdlIGF0IHRoZQotICogZW50aXR5LW1hcHBpbmdzIGxldmVsIG9ubHkgaW5zZXJ0IHRoZSBjbGFzcyBuYW1lIGluIHRoZSB4bWwgZmlsZSBpZiB0aGV5Ci0gKiBjaG9vc2UgYSBjbGFzcyBmcm9tIHRoZSBwYWNrYWdlLgotICogTm90IHN1cmUgaWYgdGhpcyBzaG91bGQgYmUgZHJpdmVuIGJ5IHRoZSBVSSBvciBieSB1aSBhcGkgaW4gdGhlIG1vZGVsCi0gKgotICogQHNlZSBPcm1UeXBlTWFwcGluZwotICogQHNlZSBPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgQ2xhc3NDaG9vc2VyUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtSmF2YUNsYXNzQ2hvb3NlciBleHRlbmRzIFBhbmU8T3JtVHlwZU1hcHBpbmc+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+WG1sSmF2YUNsYXNzQ2hvb3NlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9ybUphdmFDbGFzc0Nob29zZXIoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtVHlwZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JcHVibGljIE9ybUphdmFDbGFzc0Nob29zZXIoUGFuZTw/PiBwYXJlbnRQYW5lLAotICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybVR5cGVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOwotCX0KLQotCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPE9ybVR5cGVNYXBwaW5nPiBhZGRDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxPcm1UeXBlTWFwcGluZz4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybVR5cGVNYXBwaW5nLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgT3JtVHlwZU1hcHBpbmcuQ0xBU1NfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENsYXNzXygpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRDbGFzcyh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0Q2xhc3NfKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLk9ybUphdmFDbGFzc0Nob29zZXJfamF2YUNsYXNzOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0Q2xhc3MoY2xhc3NOYW1lKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJYWRkQ2xhc3NDaG9vc2VyKGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjBjNWYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3JkZXJpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgTWFueVRvTWFueU1hcHBpbmd9Ci0gKiBAc2VlIHtAbGluayBUYXJnZXRFbnRpdHlDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIENhc2NhZGVDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBPcmRlcmluZ0NvbXBvc2l0ZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlIAotCWV4dGVuZHMgQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxPcm1NYW55VG9NYW55TWFwcGluZywgT3JtTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb01hbnlNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb01hbnlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmFiMzg1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgT3JtTWFueVRvTWFueU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybU1hbnlUb01hbnlNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtTWFueVRvTWFueU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZU9ybU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVmODM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgTWFueVRvT25lTWFwcGluZ30KLSAqIEBzZWUge0BsaW5rIFRhcmdldEVudGl0eUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBGZXRjaFR5cGVDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBPcHRpb25hbENvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIENhc2NhZGVDb21wb3NpdGV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlIAotCWV4dGVuZHMgQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlPE9ybU1hbnlUb09uZU1hcHBpbmcsIE9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NzkxNTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgT3JtTWFueVRvT25lTWFwcGluZz4KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtTWFueVRvT25lTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1NYW55VG9PbmVNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU3ZWQ0YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRDbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTxPcm1NYXBwZWRTdXBlcmNsYXNzPgotICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JcHVibGljIE9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFwcGVkU3VwZXJjbGFzc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtSmF2YUNsYXNzQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSWRDbGFzc1JlZmVyZW5jZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtTWFwcGVkU3VwZXJjbGFzcywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2U2ZGYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbiAKLQlleHRlbmRzIEFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50VHlwZSwgT3JtTWFwcGVkU3VwZXJjbGFzcz4KLQlpbXBsZW1lbnRzIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybU1hcHBlZFN1cGVyY2xhc3M+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybU1hcHBlZFN1cGVyY2xhc3M+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hcHBpbmdOYW1lQ2hvb3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFwcGluZ05hbWVDaG9vc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZTNkZTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFwcGluZ05hbWVDaG9vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQHNlZSBPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtTWFwcGluZ05hbWVDaG9vc2VyCi0JZXh0ZW5kcyBQYW5lPE9ybUF0dHJpYnV0ZU1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5YbWxKYXZhQXR0cmlidXRlQ2hvb3NlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtTWFwcGluZ05hbWVDaG9vc2VyKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1BdHRyaWJ1dGVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5hZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLk9ybU1hcHBpbmdOYW1lQ2hvb3Nlcl9uYW1lLAotCQkJYnVpbGROYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtQXR0cmlidXRlTWFwcGluZywgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIE9ybUF0dHJpYnV0ZU1hcHBpbmcuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MGNkOWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5Kb2luVGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3JkZXJpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPbmVUb01hbnlNYXBwaW5nCi0gKiBAc2VlIENhc2NhZGVDb21wb3NpdGUKLSAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIEpvaW5UYWJsZUNvbXBvc2l0ZQotICogQHNlZSBPcmRlcmluZ0NvbXBvc2l0ZQotICogQHNlZSBUYXJnZXRFbnRpdHlDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgCi0JZXh0ZW5kcyBBYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8T3JtT25lVG9NYW55TWFwcGluZywgT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklPbmVUb01hbnlNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1PbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRiNzM1MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBPcm1PbmVUb01hbnlNYXBwaW5nPgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1PbmVUb01hbnlNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybU9uZVRvTWFueU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVPcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiNDIzZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE9uZVRvT25lTWFwcGluZwotICogQHNlZSBUYXJnZXRFbnRpdHlDb21wb3NpdGUKLSAqIEBzZWUgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlCi0gKiBAc2VlIEZldGNoVHlwZUNvbXBvc2l0ZQotICogQHNlZSBPcHRpb25hbENvbXBvc2l0ZQotICogQHNlZSBDYXNjYWRlQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUgCi0JZXh0ZW5kcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxPcm1PbmVUb09uZU1hcHBpbmcsIE9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU9uZVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1PbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9CQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9uZVRvT25lU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZWIwMjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0T25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0T25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybU9uZVRvT25lTWFwcGluZz4KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtT25lVG9PbmVNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1PbmVUb09uZU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUGFja2FnZUNob29zZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVBhY2thZ2VDaG9vc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZDM5NzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUGFja2FnZUNob29zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhY2thZ2VDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgUGFja2FnZUNob29zZXJQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBQYWNrYWdlQ2hvb3NlclBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybVBhY2thZ2VDaG9vc2VyIGV4dGVuZHMgUGFuZTxFbnRpdHlNYXBwaW5ncz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlhtbFBhY2thZ2VDaG9vc2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udHJvbGxlciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtUGFja2FnZUNob29zZXIoUGFuZTw/IGV4dGVuZHMgRW50aXR5TWFwcGluZ3M+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWFkZFBhY2thZ2VDaG9vc2VyUGFuZShjb250YWluZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQYWNrYWdlQ2hvb3NlclBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCW5ldyBQYWNrYWdlQ2hvb3NlclBhbmU8RW50aXR5TWFwcGluZ3M+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5TWFwcGluZ3MsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHlNYXBwaW5ncy5QQUNLQUdFX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0UGFja2FnZSgpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJCXN1YmplY3Quc2V0UGFja2FnZSh2YWx1ZSA9PSAiIiA/IG51bGwgOiB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLkVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfcGFja2FnZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRQYWNrYWdlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0UGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFBhY2thZ2UocGFja2FnZU5hbWUpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjNhNTgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGV0YWlscyBwYWdlIHVzZWQgZm9yIHRoZSBYTUwgcGVyc2lzdGVudAotICogYXR0cmlidXRlLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEF0dHJpYnV0ZSBtYXBwaW5nIHBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUKLSAqIEBzZWUgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UgZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUFycmF5TGlzdDxQYW5lPD8+PiBwYW5lcyA9IG5ldyBBcnJheUxpc3Q8UGFuZTw/Pj4oMik7Ci0KLQkJLy8gTWFwIEFzIGNvbXBvc2l0ZQotCQlQYW5lPD8+IG1hcEFzUGFuZSA9IGJ1aWxkTWFwQXNQYW5lKGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCAwLCA1LCAwKSk7Ci0JCXBhbmVzLmFkZChtYXBBc1BhbmUpOwotCi0JCWJ1aWxkTWFwcGluZ1BhZ2VCb29rKGNvbnRhaW5lcik7Ci0KLQkJaW5zdGFsbFBhbmVFbmFibGVyKHBhbmVzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBhbmU8UGVyc2lzdGVudEF0dHJpYnV0ZT4gYnVpbGRNYXBBc1BhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZUVuYWJsZXIoQXJyYXlMaXN0PFBhbmU8Pz4+IHBhbmVzKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcihidWlsZFBhbmVFbmFibGVySG9sZGVyKCksIHBhbmVzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZighdmFsdWUuaXNWaXJ0dWFsKCkpOwotCQkJfQotCQl9OwotCX0KLQotCQotCS8vVE9ETyB0aGlzIHByb2JhYmx5IG5lZWRzIHRvIGNoYW5nZSBhbmQgdXNlIGEgUGFuZUVuYWJsZXIgaW5zdGVhZC4KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhQ29tcG9zaXRlIGdldE1hcHBpbmdDb21wb3NpdGUoU3RyaW5nIGtleSkgewotCQlKcGFDb21wb3NpdGUgbWFwcGluZ0NvbXBvc2l0ZSA9IHN1cGVyLmdldE1hcHBpbmdDb21wb3NpdGUoa2V5KTsKLQkJaWYgKG1hcHBpbmdDb21wb3NpdGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0KLQkJaWYgKGdldFN1YmplY3QoKSAhPSBudWxsICYmIGdldFN1YmplY3QoKS5nZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0JCQllbmFibGVkID0gIWdldFN1YmplY3QoKS5pc1ZpcnR1YWwoKTsKLQkJfQotCi0JCW1hcHBpbmdDb21wb3NpdGUuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQkJcmV0dXJuIG1hcHBpbmdDb21wb3NpdGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0OGNlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtU3RydWN0dXJlTm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUge0BsaW5rIEpwYURldGFpbHNQYWdlfQotICogd2hlbiB0aGUgaW5mb3JtYXRpb24gY29tZXMgZnJvbSB0aGUgWE1MIGZpbGUgKGVpdGhlciBmcm9tIHRoZSBwZXJzaXN0ZW5jZQotICogY29uZmlndXJhdGlvbiBvciBmcm9tIHRoZSBNYXBwaW5ncyBEZXNjcmlwdG9yKS4KLSAqLwotcHVibGljIGNsYXNzIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYURldGFpbHNQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYURldGFpbHNQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYURldGFpbHNQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXNEZXRhaWxzKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChzdHJ1Y3R1cmVOb2RlLmdldElkKCksIE9ybVN0cnVjdHVyZU5vZGVzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lEKQotCQkJCSYmIHN0cnVjdHVyZU5vZGUuZ2V0UmVzb3VyY2VUeXBlKCkuZ2V0Q29udGVudFR5cGUoKS5pc0tpbmRPZihKcHRDb3JlUGx1Z2luLk1BUFBJTkdfRklMRV9DT05URU5UX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhRGV0YWlsc1BhZ2U8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gYnVpbGREZXRhaWxzUGFnZSgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2OGZkNGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TdHJ1Y3R1cmVOb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIHtAbGluayBKcGFEZXRhaWxzUGFnZX0KLSAqIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIFhNTCBmaWxlIChlaXRoZXIgZnJvbSB0aGUgcGVyc2lzdGVuY2UKLSAqIGNvbmZpZ3VyYXRpb24gb3IgZnJvbSB0aGUgTWFwcGluZ3MgRGVzY3JpcHRvcikuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcgotCWltcGxlbWVudHMgSnBhRGV0YWlsc1Byb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhRGV0YWlsc1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYURldGFpbHNQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzRGV0YWlscyhKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChzdHJ1Y3R1cmVOb2RlLmdldElkKCksIE9ybVN0cnVjdHVyZU5vZGVzLlBFUlNJU1RFTlRfVFlQRV9JRCkKLQkJCQkmJiBzdHJ1Y3R1cmVOb2RlLmdldFJlc291cmNlVHlwZSgpLmdldENvbnRlbnRUeXBlKCkuaXNLaW5kT2YoSnB0Q29yZVBsdWdpbi5NQVBQSU5HX0ZJTEVfQ09OVEVOVF9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEpwYURldGFpbHNQYWdlPFBlcnNpc3RlbnRUeXBlPiBidWlsZERldGFpbHNQYWdlKAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlMjVjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0UHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEBzZWUgT3JtRW50aXR5Ci0gKiBAc2VlIE9ybUluaGVyaXRhbmNlQ29tcG9zaXRlIC0gVGhlIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlPE9ybUVudGl0eT4KLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JtUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udHJvbGxlciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxPcm1FbnRpdHksIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCU9ybUVudGl0eS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQkJfQotLy9UT0RPIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplIHdoZW4gSSBjYW4gY2hhbmdlIHRoZSBBUEkKLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0vLwkJCQlyZXR1cm4gc3ViamVjdC5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotLy8JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN3aXRjaERlZmF1bHRUb1NwZWNpZmllZCgpIHsKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBkZWZhdWx0Sm9pbkNvbHVtbnMgPSBnZXRTdWJqZWN0KCkuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCi0JCWludCBpbmRleCA9IDA7Ci0JCXdoaWxlIChkZWZhdWx0Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGRlZmF1bHRKb2luQ29sdW1ucy5uZXh0KCk7Ci0JCQlTdHJpbmcgY29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldE5hbWUoKTsKLQkJCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0KLQkJCVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IGdldFN1YmplY3QoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbmRleCsrKTsKLQkJCXBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtbk5hbWUpOwotCQkJcGtKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJfQotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1RdWVyaWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1RdWVyaWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZjZiNDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUXVlcmllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUXVlcmllc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFF1ZXJpZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBRdWVyaWVzQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1RdWVyaWVzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnRpdHlNYXBwaW5ncz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1RdWVyaWVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcm1RdWVyaWVzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEVudGl0eU1hcHBpbmdzPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eU1hcHBpbmdzLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVudGl0eU1hcHBpbmdzIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLk9ybVF1ZXJpZXNDb21wb3NpdGVfZ3JvdXBCb3gKLQkJKTsKLQotCQlRdWVyaWVzQ29tcG9zaXRlIHF1ZXJpZXNDb21wb3NpdGUgPSB0aGlzLmJ1aWxkUXVlcmllc0NvbXBvc2l0ZShjb250YWluZXIsIHRoaXMuYnVpbGRRdWVyeUNvbnRhaW5lckhvbGRlcigpKTsKLQotCQl0aGlzLmluc3RhbGxQYW5lRW5hYmxlcihxdWVyaWVzQ29tcG9zaXRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUXVlcmllc0NvbXBvc2l0ZSBidWlsZFF1ZXJpZXNDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5Q29udGFpbmVyPiBxdWVyeUNvbnRhaW5lckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFF1ZXJpZXNDb21wb3NpdGUodGhpcywgcXVlcnlDb250YWluZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnlDb250YWluZXI+IGJ1aWxkUXVlcnlDb250YWluZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBRdWVyeUNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBRdWVyeUNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFF1ZXJ5Q29udGFpbmVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZUVuYWJsZXIoUXVlcmllc0NvbXBvc2l0ZSBxdWVyaWVzQ29tcG9zaXRlKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcigKLQkJCWJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSwKLQkJCXF1ZXJpZXNDb21wb3NpdGUKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWM2ZmVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlNlY29uZGFyeVRhYmxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPcm1FbnRpdHkKLSAqIEBzZWUgT3JtRW50aXR5Q29tcG9zaXRlIC0gVGhlIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgQWRkUmVtb3ZlTGlzdFBhbmUKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU8T3JtRW50aXR5PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgT3JtRW50aXR5PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JRW50aXR5PC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZpbmVJblhtbEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZpbmVJblhtbEhvbGRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtU2Vjb25kYXJ5VGFibGU+IGJ1aWxkU2Vjb25kYXJ5VGFibGVzTGlzdEhvbGRlcigpIHsKLQkJTGlzdDxMaXN0VmFsdWVNb2RlbDxPcm1TZWNvbmRhcnlUYWJsZT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPE9ybVNlY29uZGFyeVRhYmxlPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZFZpcnR1YWxTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPE9ybVNlY29uZGFyeVRhYmxlPiwgT3JtU2Vjb25kYXJ5VGFibGU+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtU2Vjb25kYXJ5VGFibGU+IGJ1aWxkU2Vjb25kYXJ5VGFibGVzTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxPcm1TZWNvbmRhcnlUYWJsZT4oYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCksCi0JCQlUYWJsZS5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxPcm1TZWNvbmRhcnlUYWJsZT4gYnVpbGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9ybUVudGl0eSwgT3JtU2Vjb25kYXJ5VGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE9ybVNlY29uZGFyeVRhYmxlPiBidWlsZFZpcnR1YWxTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9ybUVudGl0eSwgT3JtU2Vjb25kYXJ5VGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSwgT3JtRW50aXR5LlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudmlydHVhbFNlY29uZGFyeVRhYmxlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudmlydHVhbFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOwotCi0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZUhvbGRlciA9Ci0JCQlidWlsZFNlY29uZGFyeVRhYmxlSG9sZGVyKCk7Ci0KLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZGVmaW5lSW5YbWxIb2xkZXIgPQotCQkJYnVpbGREZWZpbmVJblhtbEhvbGRlcigpOwotCi0JCS8vIE92ZXJyaWRlIERlZmluZSBJbiBYTUwgY2hlY2sgYm94Ci0JCWFkZENoZWNrQm94KAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luKSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk9ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9kZWZpbmVJblhtbCwKLQkJCWRlZmluZUluWG1sSG9sZGVyLAotCQkJbnVsbAotCQkpOwotCi0JCS8vIFNlY29uZGFyeSBUYWJsZXMgYWRkL3JlbW92ZSBsaXN0IHBhbmUKLQkJQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PiBsaXN0UGFuZSA9IG5ldyBBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHk+KAotCQkJdGhpcywKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pLAotCQkJYnVpbGRTZWNvbmRhcnlUYWJsZXNBZGFwdGVyKCksCi0JCQlidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RNb2RlbCgpLAotCQkJc2Vjb25kYXJ5VGFibGVIb2xkZXIsCi0JCQlidWlsZFNlY29uZGFyeVRhYmxlTGFiZWxQcm92aWRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMvL1RPRE8gbmVlZCBhIGhlbHAgY29udGV4dCBpZCBmb3IgdGhpcwotCQkpOwotCi0JCWluc3RhbGxMaXN0UGFuZUVuYWJsZXIoZGVmaW5lSW5YbWxIb2xkZXIsIGxpc3RQYW5lKTsKLQotCQkvLyBQcmltYXJ5IEtleSBKb2luIENvbHVtbnMgcGFuZQotCQluZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlzZWNvbmRhcnlUYWJsZUhvbGRlciwKLQkJCWNvbnRhaW5lcgotCQkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5zdGFsbExpc3RQYW5lRW5hYmxlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBkZWZpbmVJblhtbEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHk+IGxpc3RQYW5lKSB7Ci0KLQkJbmV3IFBhbmVFbmFibGVyKGRlZmluZUluWG1sSG9sZGVyLCBsaXN0UGFuZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTZWNvbmRhcnlUYWJsZURpYWxvZyBidWlsZFNlY29uZGFyeVRhYmxlRGlhbG9nRm9yQWRkKCkgewotCQkvLyBkZWZhdWx0U2NoZW1hIGFuZCBkZWZhdWx0Q2F0YWxvZyBzaG91bGQgbm90IGJlIHRha2VuIGZyb20gdGhlIFRhYmxlIGluIHRoaXMgY2FzZS4gIAotCQkvLyBUaGUgdGFibGUgZGVmYXVsdCBzY2hlbWEgY291bGQgYmUgd2hhdCBpcyB0aGUgc3BlY2lmaWVkIHNjaGVtYSBvbiB0aGUgamF2YSB0YWJsZS4KLQkJcmV0dXJuIG5ldyBTZWNvbmRhcnlUYWJsZURpYWxvZygKLQkJCWdldFNoZWxsKCksIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCksIAotCQkJZ2V0U3ViamVjdCgpLmdldE1hcHBpbmdGaWxlUm9vdCgpLmdldENhdGFsb2coKSwgCi0JCQlnZXRTdWJqZWN0KCkuZ2V0TWFwcGluZ0ZpbGVSb290KCkuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgRGVmaW5lSW5YbWxIb2xkZXIgZXh0ZW5kcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPgotCQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHsKLQotCQlwdWJsaWMgRGVmaW5lSW5YbWxIb2xkZXIoKSB7Ci0JCQlzdXBlcihidWlsZFZpcnR1YWxTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQlpZiAoZ2V0U3ViamVjdCgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCX0KLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoZ2V0U3ViamVjdCgpLnNlY29uZGFyeVRhYmxlc0RlZmluZWRJblhtbCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJCWdldFN1YmplY3QoKS5zZXRTZWNvbmRhcnlUYWJsZXNEZWZpbmVkSW5YbWwodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5NzcyOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdFRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0VHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCBPcm1UcmFuc2llbnRNYXBwaW5nPgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1UcmFuc2llbnRNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybVRyYW5zaWVudE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVRyYW5zaWVudE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVPcm1UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYWU2NGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0VmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8T3JtVmVyc2lvbk1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua09ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+VmVyc2lvbk1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1WZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmVyc2lvblNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4MDcxMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0VmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdFZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybVZlcnNpb25NYXBwaW5nPgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1WZXJzaW9uTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybVZlcnNpb25NYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVPcm1WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVhtbFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtWG1sVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDU4MGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtWG1sVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZS5Pcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIE9ybVhtbFVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBPcm1YbWxVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybVhtbFVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVhtbFVpRmFjdG9yeSBidWlsZE9ybVhtbFVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtWG1sVWlGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzVWkoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfMV8wX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8T3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChPcm1FbnRpdHlVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhNGYxMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLlNjaGVtYUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLkpwYTJfMFByb2plY3RGbGFnTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBQZXJzaXN0ZW5jZSBVbml0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCB4IFhNTCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IHggQ2FzY2FkZSBQZXJzaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFNjaGVtYTogICAgICB8IFNjaGVtYUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENhdGFsb2c6ICAgICB8IENhdGFsb2dDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEFjY2VzcyBUeXBlOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YQotICogQHNlZSBPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cwotICogQHNlZSBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgQ2F0YWxvZ0NvbWJvCi0gKiBAc2VlIFNjaGVtYUNvbWJvCi0gKiBAc2VlIEVudW1Gb3JtQ29tYm9WaWV3ZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMsIEFjY2Vzc1R5cGU+IGFkZEFjY2Vzc1R5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLCBBY2Nlc3NUeXBlPih0aGlzLCBidWlsZFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzSG9sZGVyKCksIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLkFDQ0VTU19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc1R5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBBY2Nlc3NUeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoQWNjZXNzVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLmNsYXNzLAotCQkJCQlQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZS50aGlzLAotCQkJCQl2YWx1ZQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRBY2Nlc3MoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShBY2Nlc3NUeXBlIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldEFjY2Vzcyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhc2NhZGVQZXJzaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cywgQm9vbGVhbj4oYnVpbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0hvbGRlcigpLCBPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5DQVNDQURFX1BFUlNJU1RfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRDYXNjYWRlUGVyc2lzdCh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDYXRhbG9nQ29tYm88T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+IGFkZENhdGFsb2dDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDYXRhbG9nQ29tYm88T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+KHRoaXMsIGJ1aWxkUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNIb2xkZXIoKSwgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0Q2F0YWxvZygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPiBidWlsZFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLCBPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyB0cmFuc2Zvcm1fKFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTY2hlbWFDb21ibzxPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cz4gYWRkU2NoZW1hQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgU2NoZW1hQ29tYm88T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+KHRoaXMsIGJ1aWxkUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNIb2xkZXIoKSwgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRTY2hlbWEodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKLQkJCX0KLQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlbGltaXRlZElkZW50aWZpZXJzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cywgQm9vbGVhbj4oYnVpbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0hvbGRlcigpLCBPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czJfMC5ERUxJTUlURURfSURFTlRJRklFUlNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLmJ1aWxkQm9vbGVhblZhbHVlXygpKTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRCb29sZWFuVmFsdWVfKCkgewotCQkJCXJldHVybiBKcHRDb3JlUGx1Z2luLm5vZGVJc0pwYTJfMENvbXBhdGlibGUodGhpcy5zdWJqZWN0KSAmJgotCQkJCQkJKChPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czJfMCkgdGhpcy5zdWJqZWN0KS5pc0RlbGltaXRlZElkZW50aWZpZXJzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAoSnB0Q29yZVBsdWdpbi5ub2RlSXNKcGEyXzBDb21wYXRpYmxlKHRoaXMuc3ViamVjdCkpIHsKLQkJCQkJKChPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czJfMCkgdGhpcy5zdWJqZWN0KS5zZXREZWxpbWl0ZWRJZGVudGlmaWVycyh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFNlY3Rpb24KLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfcGVyc2lzdGVuY2VVbml0U2VjdGlvbgotCQkpOwotCi0JCS8vIFhNTCBtYXBwaW5nIG1ldGFkYXRhIGNvbXBsZXRlIGNoZWNrIGJveAotCQlhZGRDaGVja0JveCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3gsCi0JCQlidWlsZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX1hNTAotCQkpOwotCi0JCS8vIENhc2NhZGUgUGVyc2lzdCBjaGVjay1ib3gKLQkJYWRkQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9jYXNjYWRlUGVyc2lzdENoZWNrQm94LAotCQkJYnVpbGRDYXNjYWRlUGVyc2lzdEhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9DQVNDQURFCi0JCSk7Ci0KLQkJLy8gU2NoZW1hIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3NjaGVtYSwKLQkJCWFkZFNjaGVtYUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX1NDSEVNQQotCQkpOwotCi0JCS8vIENhdGFsb2cgd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfY2F0YWxvZywKLQkJCWFkZENhdGFsb2dDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9DQVRBTE9HCi0JCSk7Ci0KLQkJLy8gQWNjZXNzIFR5cGUgd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfYWNjZXNzLAotCQkJYWRkQWNjZXNzVHlwZUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX0FDQ0VTUwotCQkpOwotCi0JCS8vIERlbGltaXRlZCBJZGVudGlmaWVycyBjaGVjay1ib3gKLQkJQnV0dG9uIGRpQ2hlY2tCb3ggPSB0aGlzLmFkZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfZGVsaW1pdGVkSWRlbnRpZmllcnNDaGVja0JveCwKLQkJCXRoaXMuYnVpbGREZWxpbWl0ZWRJZGVudGlmaWVyc0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9ERUxJTUlURURfSURFTlRJRklFUlMKLQkJKTsKLQkJCi0JCVNXVFRvb2xzLmNvbnRyb2xWaXNpYmxlU3RhdGUobmV3IEpwYTJfMFByb2plY3RGbGFnTW9kZWw8UGVyc2lzdGVuY2VVbml0TWV0YWRhdGE+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSwgZGlDaGVja0JveCk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9VbnN1cHBvcnRlZE9ybU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL1Vuc3VwcG9ydGVkT3JtTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDMzNDc3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL1Vuc3VwcG9ydGVkT3JtTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRPcm1NYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb24KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBVbnN1cHBvcnRlZE9ybU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBVbnN1cHBvcnRlZE9ybU1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFVuc3VwcG9ydGVkT3JtTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXRLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5VbnN1cHBvcnRlZE9ybU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLlVuc3VwcG9ydGVkT3JtTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsIHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gbmV3IE51bGxDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBOdWxsQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxKYXZhQXR0cmlidXRlTWFwcGluZz4KLQkJaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLQl7Ci0JCU51bGxDb21wb3NpdGUoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFBdHRyaWJ1dGVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQkKLQkJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JCX0KLQkJCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7fQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RpYWxvZ3MvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTY5ZDUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RpYWxvZ3MvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlN0YXR1c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi1wdWJsaWMgY2xhc3MgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nIGV4dGVuZHMgU3RhdHVzRGlhbG9nCi17Ci0JcHJpdmF0ZSBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHVubWFwcGVkUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQlwcml2YXRlIFRleHQgYXR0cmlidXRlVGV4dDsKLQlwcml2YXRlIENvbWJvVmlld2VyIG1hcHBpbmdDb21ibzsKLQotCXB1YmxpYyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgdW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy51bm1hcHBlZFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB1bm1hcHBlZFBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JCXNldFRpdGxlKEpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ190aXRsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0FyZWEsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMSwgSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX2F0dHJpYnV0ZUxhYmVsKTsKLQotCQlhdHRyaWJ1dGVUZXh0ID0gY3JlYXRlVGV4dChjb21wb3NpdGUsIDEpOwotLy8JCWF0dHJpYnV0ZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoCi0vLwkJCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0vLwkJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0vLwkJCQkJCXZhbGlkYXRlKCk7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkpOwotCQlhdHRyaWJ1dGVUZXh0LnNldFRleHQodW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMSwgSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfbWFwcGluZ0xhYmVsKTsKLQotCQltYXBwaW5nQ29tYm8gPSBuZXcgQ29tYm9WaWV3ZXIoY3JlYXRlQ29tYm8oY29tcG9zaXRlLCAxKSk7Ci0JCW1hcHBpbmdDb21iby5nZXRDb21ibygpLnNldEZvY3VzKCk7Ci0JCW1hcHBpbmdDb21iby5zZXRDb250ZW50UHJvdmlkZXIoCi0JCQluZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCQlyZXR1cm4gQXJyYXlUb29scy5hcnJheSgKLQkJCQkJCUNvbGxlY3Rpb25Ub29scy5zb3J0KAotCQkJCQkJCW5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsID8+PigKLQkJCQkJCQkJCSgoSnBhUGxhdGZvcm1VaSkgaW5wdXRFbGVtZW50KS5hdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucyh1bm1hcHBlZFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VUeXBlKCkpKSB7Ci0JCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCA/PiBvKSB7Ci0JCQkJCQkJCQlyZXR1cm4gby5pc0VuYWJsZWRGb3IoQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nLnRoaXMudW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0sCi0JCQkJCQkJZ2V0UHJvdmlkZXJzQ29tcGFyYXRvcigpKSk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30KLQkJCX0pOwotCQltYXBwaW5nQ29tYm8uc2V0TGFiZWxQcm92aWRlcigKLQkJCW5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gKChNYXBwaW5nVWlEZWZpbml0aW9uKSBlbGVtZW50KS5nZXRMYWJlbCgpOwotCQkJCX0KLQkJCX0pOwotCQltYXBwaW5nQ29tYm8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkJSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpID0gSnB0VWlQbHVnaW4uaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybVVpKHRoaXMudW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpKTsKLQkJbWFwcGluZ0NvbWJvLnNldElucHV0KGpwYVBsYXRmb3JtVWkpOwotCQltYXBwaW5nQ29tYm8uZ2V0Q29tYm8oKS5zZWxlY3QoMCk7ICAvLyBzZWxlY3QgQmFzaWMgdG8gYmVnaW4KLQotCQkvLyBUT0RPIC0gRjEgSGVscAotCQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBJRGFsaUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfREFUQUJBU0UpOwotCi0JCS8vZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOyAgLy8gZGlzYWJsZWQgdG8gc3RhcnQKLQkJYXBwbHlEaWFsb2dGb250KGRpYWxvZ0FyZWEpOwotCi0JCXZhbGlkYXRlKCk7Ci0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCQotCXByb3RlY3RlZCBDb21wYXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb24+IGdldFByb3ZpZGVyc0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShNYXBwaW5nVWlEZWZpbml0aW9uIGl0ZW0xLCBNYXBwaW5nVWlEZWZpbml0aW9uIGl0ZW0yKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcxID0gaXRlbTEuZ2V0TGFiZWwoKTsKLQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZzIgPSBpdGVtMi5nZXRMYWJlbCgpOwotCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZGlzcGxheVN0cmluZzEsIGRpc3BsYXlTdHJpbmcyKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuLCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuKSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWdkLndpZHRoSGludCA9IDI1MDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbikgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVUZXh0LmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIG1hcHBpbmdDb21iby5nZXRTZWxlY3Rpb24oKTsKLQkJcmV0dXJuIChzZWxlY3Rpb24uaXNFbXB0eSgpKSA/IG51bGwgOiAoKE1hcHBpbmdVaURlZmluaXRpb24pIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0S2V5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgewotLy8JCWlmIChlbnRpdHlNYXBwaW5ncy5jb250YWluc1BlcnNpc3RlbnRUeXBlKHR5cGUpKSB7Ci0vLwkJCXVwZGF0ZVN0YXR1cygKLS8vCQkJCW5ldyBTdGF0dXMoCi0vLwkJCQkJSVN0YXR1cy5XQVJOSU5HLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsCi0vLwkJCQkJSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfZHVwbGljYXRlQ2xhc3NXYXJuaW5nKSk7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0vLwotCQlTdHJpbmcgbWFwcGluZ0tleSA9IGdldE1hcHBpbmdLZXkoKTsKLQkJaWYgKG1hcHBpbmdLZXkgPT0gbnVsbCkgewotCQkJdXBkYXRlU3RhdHVzKAotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX25vTWFwcGluZ0tleUVycm9yKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl1cGRhdGVTdGF0dXMoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQl1bm1hcHBlZFBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZChnZXRNYXBwaW5nS2V5KCkpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGlhbG9ncy9BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q1YTM3MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5Db250cm9sQ29udGVudEFzc2lzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5KYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlN0YXR1c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5GaWVsZERlY29yYXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbnRpdHlVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLQotcHVibGljIGNsYXNzIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZyBleHRlbmRzIFN0YXR1c0RpYWxvZwotewotCXByaXZhdGUgRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3M7Ci0JCi0JcHJpdmF0ZSBUZXh0IGNsYXNzVGV4dDsKLQkKLQlwcml2YXRlIEJ1dHRvbiBjbGFzc0Jyb3dzZUJ1dHRvbjsKLQkKLQlwcml2YXRlIENvbWJvVmlld2VyIG1hcHBpbmdDb21ibzsKLQkKLQlwcml2YXRlIE9ybVBlcnNpc3RlbnRUeXBlIGFkZGVkVHlwZTsKLQkJCi0JCi0JcHVibGljIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmVudGl0eU1hcHBpbmdzID0gZW50aXR5TWFwcGluZ3M7Ci0JCXNldFRpdGxlKEpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX3RpdGxlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NMYWJlbCk7Ci0JCQkKLQkJdGhpcy5jbGFzc1RleHQgPSBjcmVhdGVUZXh0KGNvbXBvc2l0ZSk7Ci0JCXRoaXMuY2xhc3NUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKAotCQkJCW5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCQl2YWxpZGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJCi0JCXRoaXMuY2xhc3NCcm93c2VCdXR0b24gPSBjcmVhdGVCdXR0b24oY29tcG9zaXRlLCBKcHRVaU1lc3NhZ2VzLkdlbmVyYWxfYnJvd3NlKTsKLQkJdGhpcy5jbGFzc0Jyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVR5cGUgdHlwZSA9IGNob29zZVR5cGUoKTsKLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCWNsYXNzVGV4dC5zZXRUZXh0KHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJykpOwotCQkJCX0KLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19tYXBwaW5nTGFiZWwpOwotCQkKLQkJdGhpcy5tYXBwaW5nQ29tYm8gPSBuZXcgQ29tYm9WaWV3ZXIoY3JlYXRlQ29tYm8oY29tcG9zaXRlLCAyKSk7Ci0JCXRoaXMubWFwcGluZ0NvbWJvLnNldENvbnRlbnRQcm92aWRlcigKLQkJCW5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KLQkJCQkKLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsKLQkJCQkJCU9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSwgCi0JCQkJCQlPcm1FbnRpdHlVaURlZmluaXRpb24uaW5zdGFuY2UoKSwgCi0JCQkJCQlPcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkKLQkJCQkJfTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7fQotCQkJfSk7Ci0JCXRoaXMubWFwcGluZ0NvbWJvLnNldExhYmVsUHJvdmlkZXIoCi0JCQluZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuICgoTWFwcGluZ1VpRGVmaW5pdGlvbikgZWxlbWVudCkuZ2V0TGFiZWwoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJdGhpcy5tYXBwaW5nQ29tYm8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkJdGhpcy5tYXBwaW5nQ29tYm8uc2V0SW5wdXQoIkZPTyIpOwotCQl0aGlzLm1hcHBpbmdDb21iby5nZXRDb21ibygpLnNlbGVjdCgxKTsgIC8vIHNlbGVjdCBFbnRpdHkgdG8gYmVnaW4KLQkJCi0JCS8vIFRPRE8gLSBGMSBIZWxwCi0JCS8vIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIElEYWxpSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9EQVRBQkFTRSk7Ci0JCQotCQkvL2dldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsgIC8vIGRpc2FibGVkIHRvIHN0YXJ0Ci0JCWFwcGx5RGlhbG9nRm9udChkaWFsb2dBcmVhKTsJCQotCQkKLQkJdmFsaWRhdGUoKTsKLQkJCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCX0KLQkKLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCXByaXZhdGUgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gVE9ETyBidWcgMTU2MTg1IC0gd2hlbiB0aGlzIGlzIGZpeGVkIHRoZXJlIHNob3VsZCBiZSBhcGkgZm9yIHRoaXMKLQkJSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yIGphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvciA9IG5ldyBKYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IoZmFsc2UsIGZhbHNlKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGZyID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOwotCQlpZiAocGZyICE9IG51bGwpIHsKLQkJCWphdmFUeXBlQ29tcGxldGlvblByb2Nlc3Nvci5zZXRQYWNrYWdlRnJhZ21lbnQocGZyLmdldFBhY2thZ2VGcmFnbWVudCgiIikpOwotCQl9Ci0JCQotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQotCQlDb250cm9sQ29udGVudEFzc2lzdEhlbHBlci5jcmVhdGVUZXh0Q29udGVudEFzc2lzdGFudCgKLQkJCXRleHQsCi0JCQlqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IKLQkJKTsKLQkJCi0JCXRleHQuc2V0TGF5b3V0RGF0YShnZXRGaWVsZEdyaWREYXRhKCkpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEdyaWREYXRhIGdldEZpZWxkR3JpZERhdGEoKSB7Ci0JCWludCBtYXJnaW4gPSBGaWVsZERlY29yYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0TWF4aW11bURlY29yYXRpb25XaWR0aCgpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlkYXRhLndpZHRoSGludCA9IElEaWFsb2dDb25zdGFudHMuRU5UUllfRklFTERfV0lEVEggKyBtYXJnaW47Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IG1hcmdpbjsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCXJldHVybiBKRFRUb29scy5nZXRDb2RlQ29tcGxldGlvbkNvbnRleHRSb290KGdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpKTsKLQl9Ci0KLQkKLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIHRleHQpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQlwcml2YXRlIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuKSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZ2QgPSBnZXRGaWVsZEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0JCi0JcHJpdmF0ZSBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eU1hcHBpbmdzLmdldEpwYVByb2plY3QoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzVGV4dC5nZXRUZXh0KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5tYXBwaW5nQ29tYm8uZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgPyBudWxsIDogKChNYXBwaW5nVWlEZWZpbml0aW9uKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpLmdldEtleSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVR5cGUgY2hvb3NlVHlwZSgpIHsKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpIH07Ci0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGU9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQlJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOwotCQkKLQkJU2VsZWN0aW9uRGlhbG9nIHR5cGVTZWxlY3Rpb25EaWFsb2c7Ci0JCXRyeSB7Ci0JCQl0eXBlU2VsZWN0aW9uRGlhbG9nID0gCi0JCQkJSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coCi0JCQkJCQlnZXRTaGVsbCgpLCBzZXJ2aWNlLCBzY29wZSwgCi0JCQkJCQlJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywgCi0JCQkJCQlmYWxzZSwgZ2V0Q2xhc3NOYW1lKCkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRUaXRsZShKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc0RpYWxvZ190aXRsZSk7IAotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UoSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NEaWFsb2dfbWVzc2FnZSk7IAotCi0JCWlmICh0eXBlU2VsZWN0aW9uRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiAoSVR5cGUpIHR5cGVTZWxlY3Rpb25EaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZSgpOwotCQkKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoY2xhc3NOYW1lKSkgewotCQkJdXBkYXRlU3RhdHVzKAotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgCi0JCQkJCUpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX25vQ2xhc3NFcnJvcikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCckJywgJy4nKTsKLQkJCi0JCUlUeXBlIHR5cGU7Ci0JCXRyeSB7Ci0JCQl0eXBlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoY2xhc3NOYW1lKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJdHlwZSA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXVwZGF0ZVN0YXR1cygKLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLldBUk5JTkcsIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NOb3RGb3VuZFdhcm5pbmcpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKHRoaXMuZW50aXR5TWFwcGluZ3MuY29udGFpbnNQZXJzaXN0ZW50VHlwZShjbGFzc05hbWUpKSB7Ci0JCQl1cGRhdGVTdGF0dXMoCi0JCQkJbmV3IFN0YXR1cygKLQkJCQkJSVN0YXR1cy5XQVJOSU5HLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCQlKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19kdXBsaWNhdGVDbGFzc1dhcm5pbmcpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBnZXRNYXBwaW5nS2V5KCk7Ci0JCWlmIChtYXBwaW5nS2V5ID09IG51bGwpIHsKLQkJCXVwZGF0ZVN0YXR1cygKLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCUpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX25vTWFwcGluZ0tleUVycm9yKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXVwZGF0ZVN0YXR1cyhTdGF0dXMuT0tfU1RBVFVTKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQl0aGlzLmFkZGVkVHlwZSA9IHRoaXMuZW50aXR5TWFwcGluZ3MuYWRkUGVyc2lzdGVudFR5cGUoZ2V0TWFwcGluZ0tleSgpLCBnZXRDbGFzc05hbWUoKSk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQkKLQlwdWJsaWMgT3JtUGVyc2lzdGVudFR5cGUgb3BlbkFuZFJldHVyblR5cGUoKSB7Ci0JCXN1cGVyLm9wZW4oKTsKLQkJcmV0dXJuIGFkZGVkVHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9lZGl0b3JzL1BlcnNpc3RlbmNlQ29udHJpYnV0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2VkaXRvcnMvUGVyc2lzdGVuY2VDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDA4MDNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2VkaXRvcnMvUGVyc2lzdGVuY2VDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREVBY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotCi0vKioKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlQ29udHJpYnV0b3IgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciB7Ci0KLQlwcml2YXRlIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvclBhcnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlQ29udHJpYnV0b3I8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZUNvbnRyaWJ1dG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciBtYW5hZ2VyKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0aW9uIHJlZ2lzdGVkIHdpdGggdGhlIGdpdmVuIHRleHQgZWRpdG9yLgotCSAqIEByZXR1cm4gSUFjdGlvbiBvciBudWxsIGlmIGVkaXRvciBpcyBudWxsLgotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIGdldEFjdGlvbihJVGV4dEVkaXRvciBlZGl0b3IsIFN0cmluZyBhY3Rpb25JRCkgewotCQlyZXR1cm4gKGVkaXRvciA9PSBudWxsID8gbnVsbCA6IGVkaXRvci5nZXRBY3Rpb24oYWN0aW9uSUQpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYWdlKElFZGl0b3JQYXJ0IHBhcnQpIHsKLQotCQlpZiAoYWN0aXZlRWRpdG9yUGFydCA9PSBwYXJ0KQotCQkJcmV0dXJuOwotCi0JCWFjdGl2ZUVkaXRvclBhcnQgPSBwYXJ0OwotCi0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQotCQkJSVRleHRFZGl0b3IgZWRpdG9yID0gKHBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgPyAoSVRleHRFZGl0b3IpIHBhcnQgOiBudWxsOwotCi0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwKLQkJCQlnZXRBY3Rpb24oZWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5ERUxFVEUpKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQlBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSwKLQkJCQlnZXRBY3Rpb24oZWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPKSk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksCi0JCQkJZ2V0QWN0aW9uKGVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETykpOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCUFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksCi0JCQkJZ2V0QWN0aW9uKGVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQ1VUKSk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksCi0JCQkJZ2V0QWN0aW9uKGVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQ09QWSkpOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCUFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwKLQkJCQlnZXRBY3Rpb24oZWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5QQVNURSkpOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCUFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpLAotCQkJCWdldEFjdGlvbihlZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNFTEVDVF9BTEwpKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQlBY3Rpb25GYWN0b3J5LkZJTkQuZ2V0SWQoKSwKLQkJCQlnZXRBY3Rpb24oZWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5GSU5EKSk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJSURFQWN0aW9uRmFjdG9yeS5CT09LTUFSSy5nZXRJZCgpLAotCQkJCWdldEFjdGlvbihlZGl0b3IsIElERUFjdGlvbkZhY3RvcnkuQk9PS01BUksuZ2V0SWQoKSkpOwotCQkJYWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZWRpdG9ycy9QZXJzaXN0ZW5jZUVkaXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZWRpdG9ycy9QZXJzaXN0ZW5jZUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDZhODE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2VkaXRvcnMvUGVyc2lzdGVuY2VFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkxvY2FsUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtVWlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZWRpdG9yIGZvciB0aGUgSlBBIFBlcnNpc3RlbmNlIENvbmZpZ3VyYXRpb24gKHBlcnNpc3RlbmNlLnhtbCkuCi0gKiBUaGUgcGFnZXMgc2hvd24gYmVmb3JlIHRoZSBYTUwgc291cmNlIGVkaXRvciBhcmUgcmV0cmlldmVkIGZyb20gdGhlCi0gKiA8Y29kZT5KcGFVaUZhY3Rvcnk8L2NvZGU+LgotICoKLSAqIEBzZWUgSnBhVWlGYWN0b3J5Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlRWRpdG9yIGV4dGVuZHMgRm9ybUVkaXRvcgotewotCS8qKgotCSAqIFRoZSBYTUwgdGV4dCBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBlZGl0b3I7Ci0KLQkvKioKLQkgKiBUaGUgcm9vdCBvZiB0aGUgaG9sZGVycyB1c2VkIHRvIHJldHJpZXZlIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFuZCBiZQotCSAqIG5vdGlmaWVkIHdoZW4gaXQgY2hhbmdlcy4KLQkgKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPElGaWxlRWRpdG9ySW5wdXQ+IGVkaXRvcklucHV0SG9sZGVyOwotCi0JLyoqCi0JICogVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHZhcmlvdXMgd2lkZ2V0cy4KLQkgKi8KLQlwcml2YXRlIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeTsKLQotCXByaXZhdGUgZmluYWwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VFZGl0b3I8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZUVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZXNvdXJjZU1hbmFnZXIgPSBuZXcgTG9jYWxSZXNvdXJjZU1hbmFnZXIoSkZhY2VSZXNvdXJjZXMuZ2V0UmVzb3VyY2VzKCkpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyQ2xhc3MpIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXJDbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpIHsKLQkJCWFkYXB0ZXIgPSBlZGl0b3IuZ2V0QWRhcHRlcihhZGFwdGVyQ2xhc3MpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWdlcygpIHsKLQkJYWRkUGVyc2lzdGVuY2VVbml0UGFnZXMoKTsKLQkJYWRkWE1MRWRpdG9yUGFnZSgpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIHBhZ2VzIHRoYXQgc2hvdyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UgY29uZmlndXJhdGlvbgotCSAqIG9yIGl0cyBwZXJzaXN0ZW5jZSB1bml0cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUGVyc2lzdGVuY2VVbml0UGFnZXMoKSB7Ci0KLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gZ2V0SnBhUHJvamVjdCgpOwotCi0JCS8vIFRoZSBwcm9qZWN0IGRvZXNuJ3QgaGF2ZSBKUEEKLQkJaWYgKGpwYVByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWwgPSBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCk7Ci0JCWlmIChwZXJzaXN0ZW5jZVhtbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IHBlcnNpc3RlbmNlWG1sLmdldFJlc291cmNlVHlwZSgpOwotCQlpZiAocmVzb3VyY2VUeXBlID09IG51bGwpIHsKLQkJCXJldHVybjsgIC8vIG1pZ2h0IG5vdCBldmVyIGdldCBoZXJlLi4uIChpZiB3ZSBoYXZlIGEgcC54bWwsIGl0IHByb2JhYmx5IGhhcyBhIHJlc291cmNlIHR5cGUuLi4pCi0JCX0KLQkJU3RyaW5nIHBsYXRmb3JtSWQgPSBqcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCkuZ2V0SWQoKTsKLQkJSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVJID0gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1VaShwbGF0Zm9ybUlkKTsKLQkJUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gCi0JCQkoUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbikganBhUGxhdGZvcm1VSS5nZXRSZXNvdXJjZVVpRGVmaW5pdGlvbihyZXNvdXJjZVR5cGUpOwotCi0JCUxpc3RJdGVyYXRvcjxKcGFQYWdlQ29tcG9zaXRlPiBwYWdlcyA9IGRlZmluaXRpb24uYnVpbGRQZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGVzKAotCQkJYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwKLQkJCWdldENvbnRhaW5lcigpLAotCQkJdGhpcy53aWRnZXRGYWN0b3J5Ci0JCSk7Ci0KLQkJd2hpbGUgKHBhZ2VzLmhhc05leHQoKSkgewotCQkJSnBhUGFnZUNvbXBvc2l0ZSBwYWdlID0gcGFnZXMubmV4dCgpOwotCi0JCQl0cnkgewotCQkJCUZvcm1QYWdlIGZvcm1QYWdlID0gbmV3IFBhZ2UocGFnZSk7Ci0JCQkJYWRkUGFnZShmb3JtUGFnZSk7Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgWE1MIGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkWE1MRWRpdG9yUGFnZSgpIHsKLQkJdHJ5IHsKLQkJCWVkaXRvciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dEVkaXRvcigpOwotCQkJZWRpdG9yLnNldEVkaXRvclBhcnQodGhpcyk7Ci0JCQlpbnQgaW5kZXggPSBhZGRQYWdlKGVkaXRvciwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlzZXRQYWdlVGV4dChpbmRleCwgSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlRWRpdG9yX3NvdXJjZVRhYik7Ci0JCX0KLQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8KLQkJfQotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SUZpbGVFZGl0b3JJbnB1dD4gYnVpbGRFZGl0b3JJbnB1dEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SUZpbGVFZGl0b3JJbnB1dD4oKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0PiBidWlsZEpwYVByb2plY3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPElGaWxlRWRpdG9ySW5wdXQsIEpwYVByb2plY3Q+KHRoaXMuZWRpdG9ySW5wdXRIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgdHJhbnNmb3JtXyhJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCkgewotCQkJCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QoZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKS5nZXRQcm9qZWN0KCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlPiBidWlsZFBlcnNpc3RlbmNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVhtbCwgUGVyc2lzdGVuY2U+KGJ1aWxkUGVyc2lzdGVuY2VYbWxIb2xkZXIoKSwgUGVyc2lzdGVuY2VYbWwuUEVSU0lTVEVOQ0VfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFBlcnNpc3RlbmNlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQ+KGJ1aWxkUGVyc2lzdGVuY2VVbml0TGlzdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gbGlzdEhvbGRlci5zaXplKCkgPiAwID8gKFBlcnNpc3RlbmNlVW5pdCkgbGlzdEhvbGRlci5nZXQoMCkgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBidWlsZFBlcnNpc3RlbmNlVW5pdExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2UsIFBlcnNpc3RlbmNlVW5pdD4oYnVpbGRQZXJzaXN0ZW5jZUhvbGRlcigpLCBQZXJzaXN0ZW5jZS5QRVJTSVNURU5DRV9VTklUU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnBlcnNpc3RlbmNlVW5pdHMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnBlcnNpc3RlbmNlVW5pdHNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VYbWw+IGJ1aWxkUGVyc2lzdGVuY2VYbWxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYVJvb3RDb250ZXh0Tm9kZSwgUGVyc2lzdGVuY2VYbWw+KGJ1aWxkUm9vdENvbnRleHROb2RlSG9sZGVyKCksIEpwYVJvb3RDb250ZXh0Tm9kZS5QRVJTSVNURU5DRV9YTUxfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFBlcnNpc3RlbmNlWG1sKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUm9vdENvbnRleHROb2RlPiBidWlsZFJvb3RDb250ZXh0Tm9kZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0LCBKcGFSb290Q29udGV4dE5vZGU+KGJ1aWxkSnBhUHJvamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFSb290Q29udGV4dE5vZGUgdHJhbnNmb3JtXyhKcGFQcm9qZWN0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldFJvb3RDb250ZXh0Tm9kZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV2lkZ2V0RmFjdG9yeSBidWlsZFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRm9ybVdpZGdldEZhY3RvcnkoCi0JCQluZXcgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuZWRpdG9ySW5wdXRIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMucmVzb3VyY2VNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0RWRpdG9yKGdldFBhZ2VDb3VudCgpIC0gMSkuZG9TYXZlKG1vbml0b3IpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJRmlsZUVkaXRvcklucHV0IGdldEVkaXRvcklucHV0KCkgewotCQlyZXR1cm4gKElGaWxlRWRpdG9ySW5wdXQpIHN1cGVyLmdldEVkaXRvcklucHV0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc0xlZ2FsKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCwgIkludmFsaWQgSW5wdXQ6IE11c3QgYmUgSUZpbGVFZGl0b3JJbnB1dCIpOwotCQlzdXBlci5pbml0KHNpdGUsIGVkaXRvcklucHV0KTsKLQotCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOwotCQllZGl0b3JJbnB1dEhvbGRlci5zZXRWYWx1ZShnZXRFZGl0b3JJbnB1dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIG11bHRpLXBhZ2UgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCi0JCXdpZGdldEZhY3RvcnkgICAgICA9IGJ1aWxkV2lkZ2V0RmFjdG9yeSgpOwotCQllZGl0b3JJbnB1dEhvbGRlciAgPSBidWlsZEVkaXRvcklucHV0SG9sZGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBKUEEgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3Qgb3duaW5nIHRoZSBlZGl0b3IKLQkgKiBpbnRwdXQgZmlsZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIEpQQSBwcm9qZWN0Ci0JICovCi0JcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChnZXRFZGl0b3JJbnB1dCgpLmdldEZpbGUoKS5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZXh0ZW5zaW9uIG92ZXIgPGNvZGU+Rm9ybVBhZ2U8L2NvZGU+IHNpbXBseSBjb21wbGV0ZSB0aGUgbGF5b3V0IGJ5Ci0JICogdXNpbmcgdGhlIDxjb2RlPkpwYVBhZ2VDb21wb3NpdGU8L2NvZGU+J3MgY29udHJvbCBhcyBpdHMgZm9ybSBjb250ZW50LgotCSAqLwotCXByaXZhdGUgY2xhc3MgUGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLQotCQkvKioKLQkJICogVGhlIHdyYXBwZWQgcGFnZSB0aGF0IGFjdHVhbGx5IGNvbnRhaW5zIHRoZSB3aWRnZXRzIHRvIHNob3cgd2l0aCB0aGlzCi0JCSAqIGZvcm0gcGFnZS4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgSnBhUGFnZUNvbXBvc2l0ZSBwYWdlOwotCi0JCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvcjsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYWdlPC9jb2RlPi4KLQkJICoKLQkJICogQHBhcmFtIHBhZ2UgVGhlIHdyYXBwZWQgPGNvZGU+SnBhUGFnZUNvbXBvc2l0ZTwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgUGFnZShKcGFQYWdlQ29tcG9zaXRlIHBhZ2UpIHsKLQotCQkJc3VwZXIoUGVyc2lzdGVuY2VFZGl0b3IudGhpcywKLQkJCSAgICAgIHBhZ2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0JCQkgICAgICBwYWdlLmdldFBhZ2VUZXh0KCkpOwotCi0JCQl0aGlzLnBhZ2UgPSBwYWdlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCi0JCQlTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJCW1hbmFnZWRGb3JtLmdldFRvb2xraXQoKS5kZWNvcmF0ZUZvcm1IZWFkaW5nKGZvcm0uZ2V0Rm9ybSgpKTsKLQotCQkJLy8gVXBkYXRlIHRoZSB0ZXh0IGFuZCBpbWFnZQotCQkJdXBkYXRlRm9ybShmb3JtKTsKLQotCQkJLy8gVXBkYXRlIHRoZSBsYXlvdXQKLQkJCXVwZGF0ZUJvZHkoZm9ybSk7Ci0KLQkJCS8vIFRoaXMgd2lsbCBmaW5pc2ggdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBidXR0b25zCi0JCQl1cGRhdGVIZWxwQnV0dG9uKCk7Ci0JCQlmb3JtLnVwZGF0ZVRvb2xCYXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJdGhpcy5wYWdlLmRpc3Bvc2UoKTsKLQkJCWlmICh0aGlzLmltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJUGVyc2lzdGVuY2VFZGl0b3IudGhpcy5yZXNvdXJjZU1hbmFnZXIuZGVzdHJveUltYWdlKHRoaXMuaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCX0KLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJCXRoaXMucGFnZS5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGRzIHRoZSBwYWdlJ3MgY29udHJvbCB0byB0aGlzIHBhZ2UuCi0JCSAqCi0JCSAqIEBwYXJhbSBmb3JtIFRoZSBmb3JtIGNvbnRhaW5pbmcgdGhlIGNvbXBvc2l0ZSB3aXRoIHdoaWNoIHRoZSBwYWdlJ3MKLQkJICogY29udHJvbCBpcyBwYXJlbnRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZUJvZHkoU2Nyb2xsZWRGb3JtIGZvcm0pIHsKLQotCQkJQ29tcG9zaXRlIGJvZHkgPSBmb3JtLmdldEJvZHkoKTsKLQotCQkJYm9keS5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQotCQkJVGFibGVXcmFwRGF0YSB3cmFwRGF0YSA9IG5ldyBUYWJsZVdyYXBEYXRhKAotCQkJCVRhYmxlV3JhcERhdGEuRklMTF9HUkFCLAotCQkJCVRhYmxlV3JhcERhdGEuRklMTF9HUkFCCi0JCQkpOwotCi0JCQl0aGlzLnBhZ2UuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEod3JhcERhdGEpOwotCQkJdGhpcy5wYWdlLmdldENvbnRyb2woKS5zZXRQYXJlbnQoYm9keSk7Ci0JCX0KLQotCQkvKioKLQkJICogVXBkYXRlcyB0aGUgdGV4dCBhbmQgaW1hZ2Ugb2YgdGhlIGZvcm0uCi0JCSAqCi0JCSAqIEBwYXJhbSBmb3JtIFRoZSBmb3JtIHRvIGhhdmUgaXRzIHRpdGxlIGJhciB1cGRhdGVkIGJ5IHNldHRpbmcgdGhlIHRleHQKLQkJICogYW5kIGltYWdlLCB0aGUgaW1hZ2UgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHZvaWQgdXBkYXRlRm9ybShTY3JvbGxlZEZvcm0gZm9ybSkgewotCQkJZm9ybS5zZXRUZXh0KHRoaXMucGFnZS5nZXRQYWdlVGV4dCgpKTsKLQotCQkJdGhpcy5pbWFnZURlc2NyaXB0b3IgPSB0aGlzLnBhZ2UuZ2V0UGFnZUltYWdlRGVzY3JpcHRvcigpOwotCQkJaWYgKHRoaXMuaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQlmb3JtLnNldEltYWdlKFBlcnNpc3RlbmNlRWRpdG9yLnRoaXMucmVzb3VyY2VNYW5hZ2VyLmNyZWF0ZUltYWdlKHRoaXMuaW1hZ2VEZXNjcmlwdG9yKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQWRkcyBhIGhlbHAgYnV0dG9uIHRvIHRoZSBwYWdlJ3MgdG9vbGJhciBpZiBhIGhlbHAgSUQgZXhpc3RzLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZUhlbHBCdXR0b24oKSB7Ci0KLQkJCVN0cmluZyBoZWxwSUQgPSB0aGlzLnBhZ2UuZ2V0SGVscElEKCk7Ci0KLQkJCWlmIChoZWxwSUQgIT0gbnVsbCkgewotCQkJCUFjdGlvbiBoZWxwQWN0aW9uID0gbmV3IEhlbHBBY3Rpb24oaGVscElEKTsKLQotCQkJCVNjcm9sbGVkRm9ybSBmb3JtID0gZ2V0TWFuYWdlZEZvcm0oKS5nZXRGb3JtKCk7Ci0JCQkJSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIgPSBmb3JtLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCQkJbWFuYWdlci5hZGQoaGVscEFjdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGNsYXNzIEhlbHBBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JCQlwcml2YXRlIGZpbmFsIFN0cmluZyBoZWxwSUQ7Ci0KLQkJCUhlbHBBY3Rpb24oU3RyaW5nIGhlbHBJRCkgewotCQkJCXN1cGVyKEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZUVkaXRvcl9wYWdlX2hlbHAsCi0JCQkJICAgICAgSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldERlc2NyaXB0b3IoRGlhbG9nLkRMR19JTUdfSEVMUCkpOwotCi0JCQkJdGhpcy5oZWxwSUQgPSBoZWxwSUQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldE1hbmFnZWRGb3JtKCkuZ2V0Rm9ybSgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5kaXNwbGF5SGVscChoZWxwSUQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmVhODBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL0Fic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEl0ZW1MYWJlbFByb3ZpZGVyfSB0aGF0IHByb3ZpZGVzIHVwZGF0aW5nCi0gKiBsYWJlbCBpbmZvcm1hdGlvbiBmb3IgYSBNb2RlbCBvYmplY3QuCi0gKiAKLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICogI2J1aWxkSW1hZ2VNb2RlbCgpCi0gKiAJICAgcmV0dXJuIGEge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gdGhhdCByZXByZXNlbnRzIHRoZSBpbWFnZSBmb3IgdGhlIAotICogICAgIHJlcHJlc2VudGVkIG1vZGVsIG9iamVjdAotICogI2J1aWxkVGV4dE1vZGVsKCkKLSAqICAgICByZXR1cm4gYSB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSB0aGF0IHJlcHJlc2VudHMgdGhlIHRleHQgZm9yIHRoZSAKLSAqICAgICByZXByZXNlbnRlZCBtb2RlbCBvYmplY3QuCi0gKiAjYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkKLSAqIAkgICByZXR1cm4gYSB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSB0aGF0IHJlcHJlc2VudHMgdGhlIGRlc2NyaXB0aW9uIGZvciAKLSAqICAgICB0aGUgcmVwcmVzZW50ZWQgbW9kZWwgb2JqZWN0Ci0gKiAKLSAqIE90aGVyIG1ldGhvZHMgbWF5IGJlIG92ZXJyaWRkZW4sIGJ1dCB0YWtlIGNhcmUgdG8gcHJlc2VydmUgdGhlIGxvZ2ljIHByb3ZpZGVkIAotICogYnkgdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJdGVtTGFiZWxQcm92aWRlcgotewotCXByaXZhdGUgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0JCi0JcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gaW1hZ2VNb2RlbDsKLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRNb2RlbDsKLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGRlc2NyaXB0aW9uTW9kZWw7Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxhYmVsQ2hhbmdlTGlzdGVuZXI7Ci0JCi0JCi0JcHJvdGVjdGVkIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlNb2RlbCBtb2RlbCwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotCQl0aGlzLmxhYmVsQ2hhbmdlTGlzdGVuZXIgPSBidWlsZExhYmVsQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdGVuZXIgdG8gdXBkYXRlIHRoZSB2aWV3ZXIgKHRocm91Z2ggdGhlIGxhYmVsIHByb3ZpZGVyKQotCSAqIGlmIHRoZSB0ZXh0IG9yIGltYWdlIGNoYW5nZXMKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZExhYmVsQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJbGFiZWxQcm92aWRlcigpLnVwZGF0ZUxhYmVsKG1vZGVsKCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIHZhbHVlIG1vZGVsCi0JICogKGxhenkgYW5kIGp1c3QtaW4tdGltZSBpbml0aWFsaXplZCkKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gaW1hZ2VNb2RlbCgpIHsKLQkJaWYgKGltYWdlTW9kZWwgPT0gbnVsbCkgewotCQkJaW1hZ2VNb2RlbCA9IGJ1aWxkSW1hZ2VNb2RlbCgpOwotCQkJZW5nYWdlSW1hZ2VNb2RlbCgpOwotCQl9Ci0JCXJldHVybiBpbWFnZU1vZGVsOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaW1hZ2UgbW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKTsKLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5lbmdhZ2VJbWFnZU1vZGVsKCkgYmVmb3JlIAotCSAqIHN1YmNsYXNzIGxvZ2ljIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUltYWdlTW9kZWwoKSB7Ci0JCWltYWdlTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxhYmVsQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5kaXNlbmdhZ2VJbWFnZU1vZGVsKCkgYWZ0ZXIgCi0JICogc3ViY2xhc3MgbG9naWMgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSW1hZ2VNb2RlbCgpIHsKLQkJaW1hZ2VNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGFiZWxDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCB2YWx1ZSBtb2RlbAotCSAqIChsYXp5IGFuZCBqdXN0LWluLXRpbWUgaW5pdGlhbGl6ZWQpCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0TW9kZWwoKSB7Ci0JCWlmICh0ZXh0TW9kZWwgPT0gbnVsbCkgewotCQkJdGV4dE1vZGVsID0gYnVpbGRUZXh0TW9kZWwoKTsKLQkJCWVuZ2FnZVRleHRNb2RlbCgpOwotCQl9Ci0JCXJldHVybiB0ZXh0TW9kZWw7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRleHQgdmFsdWUgbW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKTsKLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5lbmdhZ2VUZXh0TW9kZWwoKSBiZWZvcmUgCi0JICogc3ViY2xhc3MgbG9naWMgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVGV4dE1vZGVsKCkgewotCQl0ZXh0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxhYmVsQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5kaXNlbmdhZ2VUZXh0TW9kZWwoKSBhZnRlciAKLQkgKiBzdWJjbGFzcyBsb2dpYyAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VUZXh0TW9kZWwoKSB7Ci0JCXRleHRNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGFiZWxDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gdmFsdWUgbW9kZWwKLQkgKiAobGF6eSBhbmQganVzdC1pbi10aW1lIGluaXRpYWxpemVkKQotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJaWYgKGRlc2NyaXB0aW9uTW9kZWwgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25Nb2RlbCA9IGJ1aWxkRGVzY3JpcHRpb25Nb2RlbCgpOwotCQkJZW5nYWdlRGVzY3JpcHRpb25Nb2RlbCgpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbk1vZGVsOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBkZXNjcmlwdGlvbiB2YWx1ZSBtb2RlbAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKTsKLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5lbmdhZ2VEZXNjcmlwdGlvbk1vZGVsKCkgYmVmb3JlIAotCSAqIHN1YmNsYXNzIGxvZ2ljIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZURlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCWRlc2NyaXB0aW9uTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxhYmVsQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5kaXNlbmdhZ2VEZXNjcmlwdGlvbk1vZGVsKCkgYWZ0ZXIgCi0JICogc3ViY2xhc3MgbG9naWMgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlRGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJZGVzY3JpcHRpb25Nb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGFiZWxDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbW9kZWwgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgaXRlbQotCSAqLwotCXB1YmxpYyBNb2RlbCBtb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxhYmVsIHByb3ZpZGVyIHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgaXRlbQotCSAqLwotCXB1YmxpYyBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlTW9kZWwoKS5nZXRWYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0TW9kZWwoKS5nZXRWYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb25Nb2RlbCgpLmdldFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpc3Bvc2VUZXh0TW9kZWwoKTsKLQkJZGlzcG9zZUltYWdlTW9kZWwoKTsKLQkJZGlzcG9zZURlc2NyaXB0aW9uTW9kZWwoKTsJCi0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlVGV4dE1vZGVsKCkgewotCQlpZiAodGhpcy50ZXh0TW9kZWwgIT0gbnVsbCkgewotCQkJZGlzZW5nYWdlVGV4dE1vZGVsKCk7Ci0JCQl0aGlzLnRleHRNb2RlbCA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRpc3Bvc2VJbWFnZU1vZGVsKCkgewotCQlpZiAodGhpcy5pbWFnZU1vZGVsICE9IG51bGwpIHsKLQkJCWRpc2VuZ2FnZUltYWdlTW9kZWwoKTsKLQkJCXRoaXMuaW1hZ2VNb2RlbCA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRpc3Bvc2VEZXNjcmlwdGlvbk1vZGVsKCkgewotCQlpZiAodGhpcy5kZXNjcmlwdGlvbk1vZGVsICE9IG51bGwpIHsKLQkJCWRpc2VuZ2FnZURlc2NyaXB0aW9uTW9kZWwoKTsKLQkJCXRoaXMuZGVzY3JpcHRpb25Nb2RlbCA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NzViOGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLk51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBUcmVlSXRlbUNvbnRlbnRQcm92aWRlcn0gdGhhdCBwcm92aWRlcyB1cGRhdGluZwotICogY2hpbGRyZW4gaW5mb3JtYXRpb24gZm9yIGEgTW9kZWwgb2JqZWN0LgotICogCi0gKiBUaGUgdHlwaWNhbCBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqICNnZXRQYXJlbnQoKQotICogICAgIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gbnVsbC4gIHRoZXJlIGlzIG5vIAotICogICAgIHByb3BlcnR5IHZhbHVlIG1vZGVsIGZvciB0aGlzIGFzIHRoaXMgc2hvdWxkIG5vdCBiZSBjaGFuZ2luZyBmb3IgYSBnaXZlbgotICogICAgIG5vZGUuICBhbGwgc3VjaCBjaGFuZ2VzIHdpbGwgYmUgcHJvdmlkZWQgYnkgdGhlIHBhcmVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0gKiAjYnVpbGRDaGlsZHJlbk1vZGVsKCkKLSAqICAgICByZXR1cm4gYSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IHRoYXQgcmVwcmVzZW50cyB0aGUgY2hpbGRyZW4gZm9yIHRoZSByZXByZXNlbnRlZAotICogICAgIG1vZGVsIG9iamVjdC4gICNidWlsZENoaWxkcmVuTW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWwpIGFuZCAKLSAqICAgICAjYnVpbGRDaGlsZHJlbk1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbCkgYXJlIHByb3ZpZGVkIGlmIHRoZSBjaGlsZHJlbiBhcmUgbW9yZQotICogICAgIGVhc2lseSByZXByZXNlbnRlZCBhcyBhIGNvbGxlY3Rpb24gb3IgYXMgYSBwcm9wZXJ0eSAoc2luZ2xlIGNoaWxkKQotICogICAgIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJldHVybiBhIHtAbGluayBOdWxsTGlzdFZhbHVlTW9kZWx9Ci0gKiAKLSAqIE90aGVyIG1ldGhvZHMgbWF5IGJlIG92ZXJyaWRkZW4sIGJ1dCB0YWtlIGNhcmUgdG8gcHJlc2VydmUgdGhlIGxvZ2ljIHByb3ZpZGVkIAotICogYnkgdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8RT4KLQlpbXBsZW1lbnRzIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi17Ci0JcHJpdmF0ZSBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHRyZWVDb250ZW50UHJvdmlkZXI7Ci0JCi0JcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNoaWxkcmVuTW9kZWw7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY2hpbGRyZW5MaXN0ZW5lcjsKLQkKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCU1vZGVsIG1vZGVsLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHRyZWVDb250ZW50UHJvdmlkZXIpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLnRyZWVDb250ZW50UHJvdmlkZXIgPSB0cmVlQ29udGVudFByb3ZpZGVyOwotCQl0aGlzLmNoaWxkcmVuTGlzdGVuZXIgPSBidWlsZENoaWxkcmVuTGlzdGVuZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdGVuZXIgdG8gcmVmcmVzaCB0aGUgdHJlZSAodGhyb3VnaCB0aGUgdHJlZSBjb250ZW50IHByb3ZpZGVyKQotCSAqIGlmIHRoZSBjaGlsZHJlbiBjaGFuZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJZ2V0VHJlZUNvbnRlbnRQcm92aWRlcigpLnVwZGF0ZUNvbnRlbnQoZ2V0TW9kZWwoKSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlnZXRUcmVlQ29udGVudFByb3ZpZGVyKCkudXBkYXRlQ29udGVudChnZXRNb2RlbCgpKTsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogZXZlbnQuZ2V0SXRlbXMoKSkgewotCQkJCQlnZXRUcmVlQ29udGVudFByb3ZpZGVyKCkuZGlzcG9zZShpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWdldFRyZWVDb250ZW50UHJvdmlkZXIoKS51cGRhdGVDb250ZW50KGdldE1vZGVsKCkpOwotCQkJCS8vIGluIHRoZSBjYXNlIG9mIGEgbGlzdCBjaGFuZ2VkIGV2ZW50LCB3ZSBkb24ndCBoYXZlIAotCQkJCS8vIGFjY2VzcyB0byB0aGUgcmVtb3ZlZCBvYmplY3RzLCBzbyB3ZSBjYW4ndCBkaXNwb3NlIHRoZW0uCi0JCQkJLy8ga2VlcCBhIHdhdGNoIG9uIHRoaXMgdG8gc2VlIGlmIHRoaXMgYmVjb21lcyBhIHByb2JsZW0uCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJZ2V0VHJlZUNvbnRlbnRQcm92aWRlcigpLnVwZGF0ZUNvbnRlbnQoZ2V0TW9kZWwoKSk7Ci0JCQkJLy8gaW4gdGhlIGNhc2Ugb2YgYSBsaXN0IGNsZWFyZWQgZXZlbnQsIHdlIGRvbid0IGhhdmUgCi0JCQkJLy8gYWNjZXNzIHRvIHRoZSByZW1vdmVkIG9iamVjdHMsIHNvIHdlIGNhbid0IGRpc3Bvc2UgdGhlbS4KLQkJCQkvLyBrZWVwIGEgd2F0Y2ggb24gdGhpcyB0byBzZWUgaWYgdGhpcyBiZWNvbWVzIGEgcHJvYmxlbS4KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGlsZHJlbiBtb2RlbAotCSAqIChsYXp5IGFuZCBqdXN0LWluLXRpbWUgaW5pdGlhbGl6ZWQpCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBJdGVyYXRvcjxFPiBjaGlsZHJlbk1vZGVsKCkgewotCQlpZiAodGhpcy5jaGlsZHJlbk1vZGVsID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW5Nb2RlbCA9IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpOwotCQkJZW5nYWdlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsLml0ZXJhdG9yKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNoaWxkcmVuIG1vZGVsCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4oKTsKLQl9Ci0JCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdGhhdCBjYW4gYmUgdXNlZCBpZiB0aGUgY2hpbGRyZW4gbW9kZWwgaXMgYmV0dGVyIHJlcHJlc2VudGVkCi0JICogYXMgYSBjb2xsZWN0aW9uLgotCSAqIFRoaXMgd3JhcHMgdGhlIGNoaWxkcmVuIGNvbGxlY3Rpb24gbW9kZWwgYW5kIHVzZXMgaXQgaW50ZXJuYWxseSBhcyBhIGxpc3QKLQkgKiBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gYnVpbGRDaGlsZHJlbk1vZGVsKExpc3RWYWx1ZU1vZGVsPEU+IGx2bSkgewotCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4obHZtKTsKLQl9Ci0JCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdGhhdCBjYW4gYmUgdXNlZCBpZiB0aGUgY2hpbGRyZW4gbW9kZWwgaXMgYmV0dGVyIHJlcHJlc2VudGVkCi0JICogYXMgYSBzaW5nbGUgdmFsdWUgcHJvcGVydHkuCi0JICogVGhpcyB3cmFwcyB0aGUgY2hpbGRyZW4gKGNoaWxkKSBwcm9wZXJ0eSBtb2RlbCBhbmQgdXNlcyBpdCBpbnRlcm5hbGx5IGFzIGEgbGlzdAotCSAqIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxFPiBidWlsZENoaWxkcmVuTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEU+IGx2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGx2bSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbW9kZWwgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgbm9kZQotCSAqLwotCXB1YmxpYyBNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubW9kZWw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdHJlZSBjb250ZW50IHByb3ZpZGVyIHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgbm9kZQotCSAqLwotCXB1YmxpYyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGdldFRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnRyZWVDb250ZW50UHJvdmlkZXI7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gQXJyYXlUb29scy5hcnJheSh0aGlzLmNoaWxkcmVuTW9kZWwoKSk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHdpdGggcG90ZW50aWFsbHkgbW9yZSBlZmZpY2llbnQgbG9naWMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbCgpLmhhc05leHQoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5kaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKE9iamVjdCBjaGlsZCA6IGdldENoaWxkcmVuKCkpIHsKLQkJCWdldFRyZWVDb250ZW50UHJvdmlkZXIoKS5kaXNwb3NlKGNoaWxkKTsKLQkJfQotCQlkaXNwb3NlQ2hpbGRyZW5Nb2RlbCgpOwotCX0KLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5lbmdhZ2VDaGlsZHJlbigpIGJlZm9yZSAKLQkgKiBzdWJjbGFzcyBsb2dpYyAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VDaGlsZHJlbigpIHsKLQkJdGhpcy5jaGlsZHJlbk1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY2hpbGRyZW5MaXN0ZW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW5Nb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZUNoaWxkcmVuTW9kZWwoKTsKLQkJCXRoaXMuY2hpbGRyZW5Nb2RlbCA9IG51bGw7Ci0JCX0KLQl9Ci0JLyoqIAotCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZGlzZW5nYWdlQ2hpbGRyZW4oKSBhZnRlciAKLQkgKiBzdWJjbGFzcyBsb2dpYyAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VDaGlsZHJlbk1vZGVsKCkgewotCQl0aGlzLmNoaWxkcmVuTW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jaGlsZHJlbkxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9BcmNoaXZlRmlsZVZpZXdlckZpbHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvQXJjaGl2ZUZpbGVWaWV3ZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2NmI2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9BcmNoaXZlRmlsZVZpZXdlckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGZpbHRlciB3aWxsIGRlbnkgc2hvd2luZyBhbnkgZmlsZSB0aGF0IGFyZSBub3QgSkFSIGZpbGVzIG9yIGZvbGRlcnMKLSAqIHRoYXQgZG9uJ3QgY29udGFpbiBhbnkgSkFSIGZpbGVzIGluIGl0cyBzdWItaGllcmFyY2h5LiAKLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVGaWxlVmlld2VyRmlsdGVyIAotCWV4dGVuZHMgVmlld2VyRmlsdGVyIAotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGFyY2hpdmVFeHRlbnNpb25zPSB7ICJqYXIiLCAiemlwIiB9OyAvLyROT04tTkxTLTEkIAotCQotCQotCXB1YmxpYyBBcmNoaXZlRmlsZVZpZXdlckZpbHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0KAotCQkJVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCXJldHVybiBpc0FyY2hpdmVQYXRoKCgoSUZpbGUpZWxlbWVudCkuZ2V0RnVsbFBhdGgoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCUlGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpIGVsZW1lbnQ7Ci0JCQl0cnkgewotCQkJCWZvciAoSVJlc291cmNlIGVhY2ggOiBmb2xkZXIubWVtYmVycygpKSB7Ci0JCQkJCWlmIChzZWxlY3Qodmlld2VyLCBmb2xkZXIsIGVhY2gpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJLy8ganVzdCBza2lwIHRoaXMgb25lLCB0aGVuCi0JCQkJSnB0VWlQbHVnaW4ubG9nKGNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FyY2hpdmVQYXRoKElQYXRoIHBhdGgpIHsKLQkJU3RyaW5nIGV4dD0gcGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCWlmIChleHQgIT0gbnVsbCAmJiBleHQubGVuZ3RoKCkgIT0gMCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGFyY2hpdmVFeHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGV4dC5lcXVhbHNJZ25vcmVDYXNlKGFyY2hpdmVFeHRlbnNpb25zW2ldKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0JCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTk2NDVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci0KLS8qKgotICogRXh0ZW5zaW9uIG9mIHtAbGluayBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXJ9IHRoYXQgcHJvdmlkZXMgYW4gZXh0ZW5zaW9uCi0gKiB0byBwcm92aWRlIHRyZWUgY29udGVudAotICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciAKLQlleHRlbmRzIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcgotCWltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIKLXsKLQlwdWJsaWMgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcigKLQkJCVRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSB0cmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkpIHsKLQkJc3VwZXIodHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIoCi0JCQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgdHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LAotCQkJSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSkgewotCQlzdXBlcih0cmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnksIGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtQ29udGVudFByb3ZpZGVyKE9iamVjdCBpdGVtKSB7Ci0JCXJldHVybiAoVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHN1cGVyLml0ZW1Db250ZW50UHJvdmlkZXIoaXRlbSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGl0ZW1Db250ZW50UHJvdmlkZXIocGFyZW50RWxlbWVudCk7Ci0JCXJldHVybiAocHJvdmlkZXIgPT0gbnVsbCkgPyBuZXcgT2JqZWN0WzBdIDogcHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGl0ZW1Db250ZW50UHJvdmlkZXIoZWxlbWVudCk7Ci0JCXJldHVybiAocHJvdmlkZXIgPT0gbnVsbCkgPyBudWxsIDogcHJvdmlkZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gaXRlbUNvbnRlbnRQcm92aWRlcihlbGVtZW50KTsKLQkJcmV0dXJuIChwcm92aWRlciA9PSBudWxsKSA/IGZhbHNlIDogcHJvdmlkZXIuaGFzQ2hpbGRyZW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9JbWFnZUltYWdlRGVzY3JpcHRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvSW1hZ2VJbWFnZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI2OWZkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9JbWFnZUltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLQotLyoqCi0gKiBJbWFnZSBkZXNjcmlwdG9yIGZvciBhbiBpbWFnZS4KLSAqLwotcHVibGljIGNsYXNzIEltYWdlSW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSW1hZ2VEZXNjcmlwdG9yIAotewotCQotCXByaXZhdGUgSW1hZ2UgZkltYWdlOwotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBJbWFnSW1hZ2VEZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBJbWFnZUltYWdlRGVzY3JpcHRvcihJbWFnZSBpbWFnZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmZJbWFnZSA9IGltYWdlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gKG9iaiAhPSBudWxsKSAmJiBnZXRDbGFzcygpLmVxdWFscyhvYmouZ2V0Q2xhc3MoKSkgJiYgdGhpcy5mSW1hZ2UuZXF1YWxzKCgoSW1hZ2VJbWFnZURlc2NyaXB0b3IpIG9iaikuZkltYWdlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlRGF0YSBnZXRJbWFnZURhdGEoKSB7Ci0JCXJldHVybiB0aGlzLmZJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZkltYWdlLmhhc2hDb2RlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvSmFyRmlsZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9KYXJGaWxlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4Zjk2Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9KYXJGaWxlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgSmFyRmlsZUl0ZW1MYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcgotewotCXB1YmxpYyBKYXJGaWxlSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlKYXJGaWxlIGphckZpbGUsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKGphckZpbGUsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPihKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpBUl9GSUxFKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigoKEphckZpbGUpIG1vZGVsKCkpLmdldFJlc291cmNlKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJSmFyRmlsZSBqYXJGaWxlID0gKEphckZpbGUpIG1vZGVsKCk7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oCi0JCQlqYXJGaWxlLmdldFJlc291cmNlKCkuZ2V0TmFtZSgpCi0JCQkrICIgLSAiICsgamFyRmlsZS5nZXRSZXNvdXJjZSgpLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvTnVsbExhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL051bGxMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ODNkMzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvTnVsbExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIE51bGwgaW1wbGVtZW50YXRpb24gb2YgdGhlIElMYWJlbFByb3ZpZGVyIGludGVyZmFjZS4KLSAqIEltcGxlbWVudGVkIGFzIGEgc2luZ2xldG9uLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbExhYmVsUHJvdmlkZXIgCi0JaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciAKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE51bGxMYWJlbFByb3ZpZGVyIElOU1RBTkNFID0gbmV3IE51bGxMYWJlbFByb3ZpZGVyKCk7Ci0KLQlwdWJsaWMgc3RhdGljIElMYWJlbFByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIGEgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTnVsbExhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvTnVsbFRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL051bGxUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjdlMGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvTnVsbFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBOdWxsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJTGFiZWxQcm92aWRlciBpbnRlcmZhY2UuCi0gKiBJbXBsZW1lbnRlZCBhcyBhIHNpbmdsZXRvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxUcmVlQ29udGVudFByb3ZpZGVyCi0JaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciAKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBOdWxsVHJlZUNvbnRlbnRQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsVHJlZUNvbnRlbnRQcm92aWRlcigpOwotCi0JcHVibGljIHN0YXRpYyBJVHJlZUNvbnRlbnRQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBhIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlyZXR1cm4gRU1QVFlfQVJSQVk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBFTVBUWV9BUlJBWTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL1N0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9TdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTBjYzJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL1N0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0TGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8ga2VlcCBhbiBBYnN0cmFjdExpc3RWaWV3ZXIKLSAqIChlLmcuIGEgTGlzdFZpZXdlciBvciBDb21ib1ZpZXdlcikgaW4gc3luY2ggd2l0aCBhIExpc3RWYWx1ZU1vZGVsCi0gKiAob3IgYSBDb2xsZWN0aW9uVmFsdWVNb2RlbCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlcgotCWltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLXsKLQkvKiogVGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWwgbGlzdEhvbGRlcjsKLQotCS8qKiBUaGUgbGlzdCB2aWV3ZXIgd2Uga2VlcCBpbiBzeW5jaCB3aXRoIHRoZSBtb2RlbCBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBBYnN0cmFjdExpc3RWaWV3ZXIgbGlzdFZpZXdlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIGZvcndhcmQgY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbGlzdCB2aWV3ZXIgdG8gdGhlIHNwZWNpZmllZCBsaXN0IGhvbGRlciBzbyB0aGV5Ci0JICogc3RheSBpbiBzeW5jaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyIGFkYXB0KEFic3RyYWN0TGlzdFZpZXdlciBsaXN0Vmlld2VyLCBMaXN0VmFsdWVNb2RlbCBsaXN0SG9sZGVyKSB7Ci0JCS8vIHdlIG5lZWQgb25seSBjb25zdHJ1Y3QgdGhlIGFkYXB0ZXIgYW5kIGl0IHdpbGwgaG9vayB1cCB0byB0aGUgbGlzdCB2aWV3ZXIgZXRjLgotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyKGxpc3RWaWV3ZXIsIGxpc3RIb2xkZXIpOwotCX0KLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbGlzdCB2aWV3ZXIgdG8gdGhlIHNwZWNpZmllZCBsaXN0IGhvbGRlciBzbyB0aGV5Ci0JICogc3RheSBpbiBzeW5jaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyIGFkYXB0KEFic3RyYWN0TGlzdFZpZXdlciBsaXN0Vmlld2VyLCBDb2xsZWN0aW9uVmFsdWVNb2RlbCBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCS8vIHdlIG5lZWQgb25seSBjb25zdHJ1Y3QgdGhlIGFkYXB0ZXIgYW5kIGl0IHdpbGwgaG9vayB1cCB0byB0aGUgbGlzdCB2aWV3ZXIgZXRjLgotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyKGxpc3RWaWV3ZXIsIGNvbGxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyKEFic3RyYWN0TGlzdFZpZXdlciBsaXN0Vmlld2VyLCBMaXN0VmFsdWVNb2RlbCBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmxpc3RWaWV3ZXIgPSBsaXN0Vmlld2VyOwotCQl0aGlzLmxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHRoaXMpOwotCQkvLyB0aGUgbGlzdCB2aWV3ZXIgd2lsbCBjYWxsIGJhY2sgdG8gI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCQl0aGlzLmxpc3RWaWV3ZXIuc2V0SW5wdXQobGlzdEhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyKEFic3RyYWN0TGlzdFZpZXdlciBsaXN0Vmlld2VyLCBDb2xsZWN0aW9uVmFsdWVNb2RlbCBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMobGlzdFZpZXdlciwgbmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlci50aGlzLml0ZW1zUmVwbGFjZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLnRoaXMuaXRlbXNNb3ZlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlpZiAoaW5wdXRFbGVtZW50ICE9IHRoaXMubGlzdEhvbGRlcikgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBpbnB1dCBlbGVtZW50OiAiICsgaW5wdXRFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgbGlzdCB2aWV3ZXIsIHNvIGRvbid0IHVwZGF0ZSB0aGUgbGlzdCB2aWV3ZXIgaGVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKHZpZXdlciAhPSB0aGlzLmxpc3RWaWV3ZXIpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgdmlld2VyOiAiICsgdmlld2VyKTsKLQkJfQotCQlpZiAob2xkSW5wdXQgIT0gdGhpcy5saXN0SG9sZGVyKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIG9sZCBpbnB1dDogIiArIG9sZElucHV0KTsKLQkJfQotCQl0aGlzLm1vZGVsQ2hhbmdlZCgoTGlzdFZhbHVlTW9kZWwpIG9sZElucHV0LCAoTGlzdFZhbHVlTW9kZWwpIG5ld0lucHV0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nIC0gbGlzdGVuZXJzIHNob3VsZCd2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBpbiAjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKExpc3RWYWx1ZU1vZGVsIG9sZE1vZGVsLCBMaXN0VmFsdWVNb2RlbCBuZXdNb2RlbCkgewotCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkgewotCQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ld01vZGVsOwotCQlpZiAobmV3TW9kZWwgIT0gbnVsbCkgewotCQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHVibGljIExpc3RWYWx1ZU1vZGVsIG1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKExpc3RWYWx1ZU1vZGVsIGxpc3RIb2xkZXIpIHsKLQkJLy8gdGhlIGxpc3Qgdmlld2VyIHdpbGwgY2FsbCBiYWNrIHRvICNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkJdGhpcy5saXN0Vmlld2VyLnNldElucHV0KGxpc3RIb2xkZXIpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsIGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcy5zZXRNb2RlbChuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcihjb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCWludCBpID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKE9iamVjdCBpdGVtIDogZS5nZXRJdGVtcygpKSB7Ci0JCQl0aGlzLmxpc3RWaWV3ZXIuaW5zZXJ0KGl0ZW0sIGkrKyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0Vmlld2VyLnJlbW92ZShBcnJheVRvb2xzLmFycmF5KGUuZ2V0SXRlbXMoKSwgZS5nZXRJdGVtc1NpemUoKSkpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKiBTeW5jaHJvbml6ZSB0aGUgbGlzdCB2aWV3ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0Vmlld2VyLnJlbW92ZShBcnJheVRvb2xzLmFycmF5KGUuZ2V0T2xkSXRlbXMoKSwgZS5nZXRJdGVtc1NpemUoKSkpOwotCQlpbnQgaSA9IGUuZ2V0SW5kZXgoKTsKLQkJZm9yIChPYmplY3QgaXRlbSA6IGUuZ2V0TmV3SXRlbXMoKSkgewotCQkJdGhpcy5saXN0Vmlld2VyLmluc2VydChpdGVtLCBpKyspOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQlpbnQgbGVuID0gZS5nZXRMZW5ndGgoKTsKLQkJT2JqZWN0W10gaXRlbXMgPSBuZXcgT2JqZWN0W2xlbl07Ci0JCWludCBvZmZzZXQgPSBlLmdldFNvdXJjZUluZGV4KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWl0ZW1zW2ldID0gdGhpcy5saXN0SG9sZGVyLmdldChvZmZzZXQgKyBpKTsKLQkJfQotCQl0aGlzLmxpc3RWaWV3ZXIucmVtb3ZlKGl0ZW1zKTsKLQotCQlvZmZzZXQgPSBlLmdldFRhcmdldEluZGV4KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXRoaXMubGlzdFZpZXdlci5pbnNlcnQoaXRlbXNbaV0sIG9mZnNldCArIGkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdCB3YXMgY2xlYXJlZC4KLQkgKiBTeW5jaHJvbml6ZSB0aGUgbGlzdCB2aWV3ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoKSB7Ci0JCXRoaXMubGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdCBoYXMgY2hhbmdlZCAiZHJhbWF0aWNhbGx5Ii4KLQkgKiBTeW5jaHJvbml6ZSB0aGUgbGlzdCB2aWV3ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoKSB7Ci0JCXRoaXMubGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL1htbE1hcHBpbmdGaWxlVmlld2VyRmlsdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9YbWxNYXBwaW5nRmlsZVZpZXdlckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjM4NDNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL1htbE1hcHBpbmdGaWxlVmlld2VyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCBkZW55IHNob3dpbmcgYW55IGZpbGUgdGhhdCBhcmUgbm90IFhNTCBtYXBwaW5nIGZpbGVzIG9yIGZvbGRlcnMKLSAqIHRoYXQgZG9uJ3QgY29udGFpbiBhbnkgWE1MIG1hcHBpbmcgZmlsZXMgaW4gaXRzIHN1Yi1oaWVyYXJjaHkuIEFuIFhNTCBtYXBwaW5nCi0gKiBmaWxlIGlzIG9uZSB0aGF0IGhhcyBhIGNvcnJlc3BvbmRpbmcgSnBhRmlsZSBpbiB0aGUgcHJvamVjdCB3aXRoIGEgbWFwcGluZyBmaWxlCi0gKiBjb250ZW50IHR5cGUuCi0gKiBAc2VlIEpwdENvcmVQbHVnaW4uTUFQUElOR19GSUxFX0NPTlRFTlRfVFlQRQotICovCi1wdWJsaWMgY2xhc3MgWG1sTWFwcGluZ0ZpbGVWaWV3ZXJGaWx0ZXIKLQkJZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCQotCXByaXZhdGUgZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCQotCQotCXB1YmxpYyBYbWxNYXBwaW5nRmlsZVZpZXdlckZpbHRlcihKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJcmV0dXJuIGlzTWFwcGluZ0ZpbGUoKElGaWxlKSBlbGVtZW50KTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgZWxlbWVudDsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLmpwYVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQkJaWYgKEpwdENvcmVQbHVnaW4uZ2V0UmVzb3VyY2VMb2NhdG9yKHByb2plY3QpLmFjY2VwdFJlc291cmNlTG9jYXRpb24ocHJvamVjdCwgY29udGFpbmVyKSkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoSVJlc291cmNlIHJlc291cmNlIDogY29udGFpbmVyLm1lbWJlcnMoKSkgewotCQkJCQkJaWYgKHNlbGVjdCh2aWV3ZXIsIGNvbnRhaW5lciwgcmVzb3VyY2UpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJLy8gZmFsbCB0aHJvdWdoCi0JCQkJCUpwdFVpUGx1Z2luLmxvZyhjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBmaWxlIChhbiBYTUwgZmlsZSkgaXMgYSBKUEEgbWFwcGluZwotCSAqIGRlc2NyaXB0b3IgZmlsZS4gCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTWFwcGluZ0ZpbGUoSUZpbGUgZmlsZSkgewotCQlKcGFGaWxlIGpwYUZpbGUgPSB0aGlzLmpwYVByb2plY3QuZ2V0SnBhRmlsZShmaWxlKTsKLQkJcmV0dXJuIGpwYUZpbGUgIT0gbnVsbCA/IGpwYUZpbGUuZ2V0Q29udGVudFR5cGUoKS5pc0tpbmRPZihKcHRDb3JlUGx1Z2luLk1BUFBJTkdfRklMRV9DT05URU5UX1RZUEUpOiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL0dlbmVyaWMyXzBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvR2VuZXJpYzJfMEpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTkyYjU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvR2VuZXJpYzJfMEpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVhtbFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5qYXZhLkdlbmVyaWMyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtWG1sMl8wVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOwotCi0vKioKLSAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIEpQQSBwbGF0Zm9ybSBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlCi0gKiBpdCBpcyBpbml0aWFsaXplZCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBHZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBHZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZXRhaWxzIHByb3ZpZGVycyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGV0YWlsc1Byb3ZpZGVyc1RvKExpc3Q8SnBhRGV0YWlsc1Byb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VVaURlZmluaXRpb25zVG8oTGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKEdlbmVyaWMyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKFBlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL0dlbmVyaWNPcm1YbWwyXzBVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvR2VuZXJpY09ybVhtbDJfMFVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzNkM2M4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvR2VuZXJpY09ybVhtbDJfMFVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkJhc2VPcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtQmFzaWNNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtRW50aXR5Ml8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybUlkTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybU9uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybVZlcnNpb25NYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qcGEyLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVhtbDJfMFVpRmFjdG9yeSAKLQlleHRlbmRzIEJhc2VPcm1YbWxVaUZhY3RvcnkKLQlpbXBsZW1lbnRzIE9ybVhtbFVpRmFjdG9yeTJfMAotewotCS8vICoqKioqKioqKioqKioqKiogb3JtIHR5cGUgbWFwcGluZyBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbnRpdHlDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVudGl0eTJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCQotCS8vICoqKioqKioqKioqKioqKiogb3JtIGF0dHJpYnV0ZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUlkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1JZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtSWRNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1CYXNpY01hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUJhc2ljTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybVZlcnNpb25NYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1PbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybVRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVHJhbnNpZW50TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvSnBhMl8wUHJvamVjdEZsYWdNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9KcGEyXzBQcm9qZWN0RmxhZ01vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NWEzZTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9KcGEyXzBQcm9qZWN0RmxhZ01vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBKUEEgcHJvamVjdCBzdXBwb3J0cyBKUEEgMi4wLgotICovCi1wdWJsaWMgY2xhc3MgSnBhMl8wUHJvamVjdEZsYWdNb2RlbDxUIGV4dGVuZHMgSnBhTm9kZT4KLQlleHRlbmRzIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIEJvb2xlYW4+Ci17Ci0JcHVibGljIEpwYTJfMFByb2plY3RGbGFnTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IGpwYVByb2plY3RNb2RlbCkgeyAKLQkJc3VwZXIoanBhUHJvamVjdE1vZGVsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKFQgdmFsdWUpIHsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihKcHRDb3JlUGx1Z2luLm5vZGVJc0pwYTJfMENvbXBhdGlibGUodmFsdWUpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9BYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmY2NTdjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9BYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5Db2x1bW5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRW51bVR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRlbXBvcmFsVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sU3dpdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENvbHVtbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUZW1wb3JhbFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVudW1UeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBMb2JDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBCYXNpY01hcHBpbmcKLSAqIEBzZWUgT3JkZXJDb2x1bW5Db21wb3NpdGUKLSAqIEBzZWUgRW51bVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIExvYkNvbXBvc2l0ZQotICogQHNlZSBPcHRpb25hbENvbXBvc2l0ZQotICogQHNlZSBUZW1wb3JhbFR5cGVDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlPFQgZXh0ZW5kcyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IAotCWV4dGVuZHMgUGFuZTxUPgotCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JCQotCXByaXZhdGUgQ29tcG9zaXRlIGJhc2ljVmFsdWVDb21wb3NpdGU7Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgZW1iZWRkYWJsZVZhbHVlQ29tcG9zaXRlOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzaWNNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWluaXRpYWxpemVFbGVtZW50Q29sbGVjdGlvbkNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplVmFsdWVDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUtleUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplT3JkZXJpbmdDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVsZW1lbnRDb2xsZWN0aW9uQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuRWxlbWVudENvbGxlY3Rpb25TZWN0aW9uX3RpdGxlLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpCi0JCSk7Ci0KLQkJdGhpcy5pbml0aWFsaXplRWxlbWVudENvbGxlY3Rpb25TZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVsZW1lbnRDb2xsZWN0aW9uU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDb2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGUodGhpcywgYnVpbGRDb2xsZWN0aW9uVGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT3JkZXJpbmdDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JkZXJpbmcyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIHZhbHVlU2VjdGlvbiA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wX0NvbXBvc2l0ZV92YWx1ZVNlY3Rpb25UaXRsZQotCQkpOwotCQlpbml0aWFsaXplVmFsdWVTZWN0aW9uKHZhbHVlU2VjdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVLZXlDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJUGFnZUJvb2sgcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQgPSA1OwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQl0aGlzLmluaXRpYWxpemVCYXNpY1ZhbHVlU2VjdGlvbihwYWdlQm9vayk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVtYmVkZGFibGVWYWx1ZVNlY3Rpb24ocGFnZUJvb2spOwotCQkKLQkJaW5zdGFsbFZhbHVlQ29udHJvbFN3aXRjaGVyKHBhZ2VCb29rKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJhc2ljVmFsdWVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5iYXNpY1ZhbHVlQ29tcG9zaXRlID0gYWRkU3ViUGFuZShjb250YWluZXIpOwotCi0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRWYWx1ZUNvbHVtbkhvbGRlcigpLCB0aGlzLmJhc2ljVmFsdWVDb21wb3NpdGUpOwotCi0JCS8vIHR5cGUgc2VjdGlvbgotCQlDb21wb3NpdGUgY29udmVydGVyU2VjdGlvbiA9IGFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCXRoaXMuYmFzaWNWYWx1ZUNvbXBvc2l0ZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX3R5cGUsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpCi0JCSk7Ci0JCSgoR3JpZExheW91dCkgY29udmVydGVyU2VjdGlvbi5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0KLQkJLy8gTm8gY29udmVydGVyCi0JCUJ1dHRvbiBub0NvbnZlcnRlckJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAotCQkJY29udmVydGVyU2VjdGlvbiwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9kZWZhdWx0LCAKLQkJCWJ1aWxkTm9Db252ZXJ0ZXJIb2xkZXIoKSwgCi0JCQludWxsKTsKLQkJKChHcmlkRGF0YSkgbm9Db252ZXJ0ZXJCdXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQotCQkvLyBMb2IKLQkJQnV0dG9uIGxvYkJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAotCQkJY29udmVydGVyU2VjdGlvbiwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9sb2IsIAotCQkJYnVpbGRMb2JDb252ZXJ0ZXJIb2xkZXIoKSwgCi0JCQludWxsKTsKLQkJKChHcmlkRGF0YSkgbG9iQnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkKLQkJCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlciA9IGJ1aWxkQ29udmVydGVySG9sZGVyKCk7Ci0JCS8vIFRlbXBvcmFsCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29udmVydGVyU2VjdGlvbiwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90ZW1wb3JhbCwgCi0JCQlidWlsZFRlbXBvcmFsQm9vbGVhbkhvbGRlcigpLCAKLQkJCW51bGwpOwotCQlyZWdpc3RlclN1YlBhbmUobmV3IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZShidWlsZFRlbXBvcmFsQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIGNvbnZlcnRlclNlY3Rpb24sIGdldFdpZGdldEZhY3RvcnkoKSkpOwotCQkKLQkJCi0JCS8vIEVudW1lcmF0ZWQKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb252ZXJ0ZXJTZWN0aW9uLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2VudW1lcmF0ZWQsIAotCQkJYnVpbGRFbnVtZXJhdGVkQm9vbGVhbkhvbGRlcigpLCAKLQkJCW51bGwpOwotCQlyZWdpc3RlclN1YlBhbmUobmV3IEVudW1UeXBlQ29tcG9zaXRlKGJ1aWxkRW51bWVyYXRlZENvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCBjb252ZXJ0ZXJTZWN0aW9uLCBnZXRXaWRnZXRGYWN0b3J5KCkpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGFibGVWYWx1ZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmVtYmVkZGFibGVWYWx1ZUNvbXBvc2l0ZSA9IG5ldyBFbGVtZW50Q29sbGVjdGlvblZhbHVlT3ZlcnJpZGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcikuZ2V0Q29udHJvbCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsVmFsdWVDb250cm9sU3dpdGNoZXIoUGFnZUJvb2sgcGFnZUJvb2spIHsKLQotCQluZXcgQ29udHJvbFN3aXRjaGVyKAotCQkJYnVpbGRWYWx1ZUhvbGRlcigpLAotCQkJYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSwKLQkJCXBhZ2VCb29rCi0JCSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGU+IGJ1aWxkVmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlPigKLQkJCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlZBTFVFX1RZUEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VmFsdWVUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZSwgQ29udHJvbD4gYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUsIENvbnRyb2w+KCkgewotCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlIHR5cGUpIHsKLQkJCQlyZXR1cm4gQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUudGhpcy50cmFuc2Zvcm1WYWx1ZVR5cGUodHlwZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNlbGVjdGVkIG92ZXJyaWRlLCByZXR1cm4gdGhlIGNvbnRyb2wgdGhhdCB3aWxsIGJlIGRpc3BsYXllZAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIHRyYW5zZm9ybVZhbHVlVHlwZShFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZSB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBCQVNJQ19UWVBFIDoKLQkJCQlyZXR1cm4gdGhpcy5iYXNpY1ZhbHVlQ29tcG9zaXRlOwotCQkJY2FzZSBFTUJFRERBQkxFX1RZUEUgOgotCQkJCXJldHVybiB0aGlzLmVtYmVkZGFibGVWYWx1ZUNvbXBvc2l0ZTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29sbGVjdGlvblRhYmxlMl8wPiBidWlsZENvbGxlY3Rpb25UYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLCBDb2xsZWN0aW9uVGFibGUyXzA+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblRhYmxlMl8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29sdW1uPiBidWlsZFZhbHVlQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAsIENvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb2x1bW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRWYWx1ZUNvbHVtbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb0NvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0Q29udmVydGVyKENvbnZlcnRlci5OT19DT05WRVJURVIpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZExvYkNvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCUNvbnZlcnRlciBjb252ZXJ0ZXIgPSB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVyKCk7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IENvbnZlcnRlci5MT0JfQ09OVkVSVEVSKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0Q29udmVydGVyKENvbnZlcnRlci5MT0JfQ09OVkVSVEVSKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIENvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb252ZXJ0ZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VGVtcG9yYWxDb252ZXJ0ZXI+IGJ1aWxkVGVtcG9yYWxDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBUZW1wb3JhbENvbnZlcnRlcj4oY29udmVydGVySG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUZW1wb3JhbENvbnZlcnRlciB0cmFuc2Zvcm1fKENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJCQlyZXR1cm4gY29udmVydGVyLmdldFR5cGUoKSA9PSBDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSID8gKFRlbXBvcmFsQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFbnVtZXJhdGVkQ29udmVydGVyPiBidWlsZEVudW1lcmF0ZWRDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBFbnVtZXJhdGVkQ29udmVydGVyPihjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVudW1lcmF0ZWRDb252ZXJ0ZXIgdHJhbnNmb3JtXyhDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gQ29udmVydGVyLkVOVU1FUkFURURfQ09OVkVSVEVSID8gKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIGNvbnZlcnRlciA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRlbXBvcmFsQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCUNvbnZlcnRlciBjb252ZXJ0ZXIgPSB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVyKCk7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRW51bWVyYXRlZEJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLkNPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcigpOwotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoY29udmVydGVyLmdldFR5cGUoKSA9PSBDb252ZXJ0ZXIuRU5VTUVSQVRFRF9DT05WRVJURVIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRDb252ZXJ0ZXIoQ29udmVydGVyLkVOVU1FUkFURURfQ09OVkVSVEVSKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkUGFuZShDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgZ3JvdXBCb3hNYXJnaW4pIHsKLQkJcmV0dXJuIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9BYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjVlYTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uPE0sIFQgZXh0ZW5kcyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wX2xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMF9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjAwNDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fic3RyYWN0TWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuRGVyaXZlZElkZW50aXR5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5NYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlPFQgZXh0ZW5kcyBNYW55VG9PbmVNYXBwaW5nLCBSIGV4dGVuZHMgTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wPgotCWV4dGVuZHMgQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlPFQsIFI+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0TWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbml0aWFsaXplTWFueVRvT25lQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVEZXJpdmVkSWRlbnRpdHlDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVneUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZXJpdmVkSWRlbnRpdHlDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRGVyaXZlZElkZW50aXR5Ml8wUGFuZSh0aGlzLCBidWlsZERlcml2ZWRJZGVudGl0eUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKb2luaW5nU3RyYXRlZ3lDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZSh0aGlzLCBidWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPERlcml2ZWRJZGVudGl0eTJfMD4gYnVpbGREZXJpdmVkSWRlbnRpdHlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIERlcml2ZWRJZGVudGl0eTJfMD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEZXJpdmVkSWRlbnRpdHkyXzAgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoTWFueVRvT25lTWFwcGluZzJfMCkgdGhpcy5zdWJqZWN0KS5nZXREZXJpdmVkSWRlbnRpdHkoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQWJzdHJhY3RPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9BYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGY1YTMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9BYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5EZXJpdmVkSWRlbnRpdHkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgT25lVG9PbmVNYXBwaW5nLCBSIGV4dGVuZHMgT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxULCBSPgotewotCXByb3RlY3RlZCBBYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbml0aWFsaXplT25lVG9PbmVDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZURlcml2ZWRJZGVudGl0eUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlcml2ZWRJZGVudGl0eUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBEZXJpdmVkSWRlbnRpdHkyXzBQYW5lKHRoaXMsIGJ1aWxkRGVyaXZlZElkZW50aXR5SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RGVyaXZlZElkZW50aXR5Ml8wPiBidWlsZERlcml2ZWRJZGVudGl0eUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgRGVyaXZlZElkZW50aXR5Ml8wPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERlcml2ZWRJZGVudGl0eTJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChPbmVUb09uZU1hcHBpbmcyXzApIHRoaXMuc3ViamVjdCkuZ2V0RGVyaXZlZElkZW50aXR5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fzc29jaWF0aW9uT3ZlcnJpZGUyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZWE5ZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fzc29jaWF0aW9uT3ZlcnJpZGUyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQXNzb2NpYXRpb25PdmVycmlkZQotICogQHNlZSBFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBKb2luQ29sdW1uc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZTJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QXNzb2NpYXRpb25PdmVycmlkZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkFzc29jaWF0aW9uT3ZlcnJpZGU8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb25PdmVycmlkZTJfMENvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsIAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBBc3NvY2lhdGlvbk92ZXJyaWRlPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBhZGRUaXRsZWRHcm91cCgKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ190aXRsZSk7Ci0JCQotCQlhZGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZShjb21wb3NpdGUpOwotCQkKLQkJYWRkSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZShjb21wb3NpdGUpOwotCQkKLQkJYWRkU3ViUGFuZShjb21wb3NpdGUsIDUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgYnVpbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2VIb2xkZXIoKSwgY29udGFpbmVyKTsJCQotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wPiBidWlsZFJlbGF0aW9uc2hpcFJlZmVyZW5jZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlLCBBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAgdHJhbnNmb3JtXyhBc3NvY2lhdGlvbk92ZXJyaWRlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIChBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wKSB2YWx1ZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0NhY2hlYWJsZTJfMFBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9DYWNoZWFibGUyXzBQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMzI3MjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0NhY2hlYWJsZTJfMFBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCBbWF0gIENhY2hlYWJsZSAodHJ1ZS9mYWxzZSkKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBDYWNoZWFibGUyXzAKLSAqIEBzZWUgSmF2YUVudGl0eTJfMENvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKiBAc2VlIE9ybUVudGl0eTJfMENvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZWFibGUyXzBQYW5lIAotCWV4dGVuZHMgUGFuZTxDYWNoZWFibGUyXzA+Ci17Ci0JcHVibGljIENhY2hlYWJsZTJfMFBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIENhY2hlYWJsZTJfMD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlczJfMC5FbnRpdHlfY2FjaGVhYmxlTGFiZWwsCi0JCQlidWlsZENhY2hlYWJsZUJvb2xlYW5Ib2xkZXIoKSwKLQkJCWJ1aWxkQ2FjaGVhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfQ0FDSEVBQkxFCi0JCSk7Ci0JfQotCQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhY2hlYWJsZUJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hlYWJsZTJfMCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDYWNoZWFibGUyXzAuREVGQVVMVF9DQUNIRUFCTEVfUFJPUEVSVFksCi0JCQlDYWNoZWFibGUyXzAuU1BFQ0lGSUVEX0NBQ0hFQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENhY2hlYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZENhY2hlYWJsZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENhY2hlYWJsZVN0cmluZ0hvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0Q2FjaGVhYmxlSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVudGl0eV9jYWNoZWFibGVXaXRoRGVmYXVsdExhYmVsLCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuRW50aXR5X2NhY2hlYWJsZUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRDYWNoZWFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hlYWJsZTJfMCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDYWNoZWFibGUyXzAuU1BFQ0lGSUVEX0NBQ0hFQUJMRV9QUk9QRVJUWSwKLQkJCUNhY2hlYWJsZTJfMC5ERUZBVUxUX0NBQ0hFQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENhY2hlYWJsZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9DYXNjYWRlUGFuZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Nhc2NhZGVQYW5lMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZWFlNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Nhc2NhZGVQYW5lMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYXNjYWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotcHVibGljIGNsYXNzIENhc2NhZGVQYW5lMl8wPFQgZXh0ZW5kcyBDYXNjYWRlMl8wPgotCWV4dGVuZHMgQ2FzY2FkZUNvbXBvc2l0ZTxUPgotewotCXB1YmxpYyBDYXNjYWRlUGFuZTJfMCgKLQkJCVBhbmU8PyBleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBDYXNjYWRlUGFuZTJfMCgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIENhc2NhZGUgZ3JvdXAKLQkJR3JvdXAgY2FzY2FkZUdyb3VwID0gYWRkQ2FzY2FkZUdyb3VwKGNvbnRhaW5lcik7Ci0JCQotCQkvLyBDb250YWluZXIgb2YgdGhlIGNoZWNrIGJveGVzCi0JCWNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY2FzY2FkZUdyb3VwLCA2LCA4LCAwLCAwLCAwKTsKLQkJCi0JCWFkZEFsbENoZWNrQm94KGNvbnRhaW5lcik7Ci0JCWFkZFBlcnNpc3RDaGVja0JveChjb250YWluZXIpOwotCQlhZGRNZXJnZUNoZWNrQm94KGNvbnRhaW5lcik7Ci0JCWFkZFJlbW92ZUNoZWNrQm94KGNvbnRhaW5lcik7Ci0JCWFkZFJlZnJlc2hDaGVja0JveChjb250YWluZXIpOwotCQlhZGREZXRhY2hDaGVja0JveChjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXRhY2hDaGVja0JveChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWFkZENoZWNrQm94KAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlczJfMC5DYXNjYWRlUGFuZTJfMF9kZXRhY2gsCi0JCQkJYnVpbGRDYXNjYWRlVHlwZURldGFjaEhvbGRlcigpLAotCQkJCW51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDYXNjYWRlVHlwZURldGFjaEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FzY2FkZTJfMCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYXNjYWRlMl8wLkRFVEFDSF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pc0RldGFjaCgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXREZXRhY2godmFsdWUpOwotCQkJfQotCQl9OwotCX0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NmRiNTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0NvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSm9pbkNvbHVtbnNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUmVmZXJlbmNlVGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLlNjaGVtYUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLlRhYmxlQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi0vKioKLSAqIFRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgfAotICogfCAgIE5hbWU6ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCAgIHwKLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICB8Ci0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgfAotICogfCAgIFNjaGVtYTogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCAgIHwKLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICB8Ci0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgfAotICogfCAgIENhdGFsb2c6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCAgIHwKLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIEpvaW4gQ29sdW1ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgeCBPdmVycmlkZSBEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgSm9pbkNvbHVtbnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgQ29sbGVjdGlvblRhYmxlMl8wfQotICogQHNlZSB7QGxpbmsgSm9pbkNvbHVtbnNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIENvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZSBleHRlbmRzIFJlZmVyZW5jZVRhYmxlQ29tcG9zaXRlPENvbGxlY3Rpb25UYWJsZTJfMD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb2xsZWN0aW9uVGFibGUyXzA+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkNvbGxlY3Rpb25UYWJsZTJfMDwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb2xsZWN0aW9uVGFibGUyXzA+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gY29sbGVjdGlvbiB0YWJsZSBncm91cCBwYW5lCi0JCWNvbnRhaW5lciA9IGFkZFRpdGxlZEdyb3VwKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlX3RpdGxlCi0JCSk7Ci0KLQkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKLQotCQkvLyBOYW1lIHdpZGdldHMKLQkJVGFibGVDb21ibzxDb2xsZWN0aW9uVGFibGUyXzA+IHRhYmxlQ29tYm8gPSBhZGRUYWJsZUNvbWJvKGNvbnRhaW5lcik7Ci0JCUNvbXBvc2l0ZSB0YWJsZVBhbmUgPSBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pOwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJCXRhYmxlUGFuZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkNvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZV9uYW1lLAotCQkJdGFibGVDb21iby5nZXRDb250cm9sKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTExFQ1RJT05fVEFCTEVfTkFNRQotCQkpOwotCQkKLQkJLy8gc2NoZW1hIHdpZGdldHMKLQkJU2NoZW1hQ29tYm88Q29sbGVjdGlvblRhYmxlMl8wPiBzY2hlbWFDb21ibyA9IGFkZFNjaGVtYUNvbWJvKGNvbnRhaW5lcik7Ci0KLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCXRhYmxlUGFuZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkNvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZV9zY2hlbWEsCi0JCQlzY2hlbWFDb21iby5nZXRDb250cm9sKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTExFQ1RJT05fVEFCTEVfU0NIRU1BCi0JCSk7Ci0JCQotCQkvLyBjYXRhbG9nIHdpZGdldHMKLQkJQ2F0YWxvZ0NvbWJvPENvbGxlY3Rpb25UYWJsZTJfMD4gY2F0YWxvZ0NvbWJvID0gYWRkQ2F0YWxvZ0NvbWJvKGNvbnRhaW5lcik7Ci0KLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCXRhYmxlUGFuZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkNvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZV9jYXRhbG9nLAotCQkJY2F0YWxvZ0NvbWJvLmdldENvbnRyb2woKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MTEVDVElPTl9UQUJMRV9DQVRBTE9HCi0JCSk7Ci0KLQkJLy8gSm9pbiBDb2x1bW5zIGdyb3VwIHBhbmUKLQkJR3JvdXAgam9pbkNvbHVtbkdyb3VwUGFuZSA9IGFkZFRpdGxlZEdyb3VwKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlX2pvaW5Db2x1bW4KLQkJKTsKLQotCQkvLyBPdmVycmlkZSBEZWZhdWx0IEpvaW4gQ29sdW1ucyBjaGVjayBib3gKLQkJdGhpcy5vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94ID0gYWRkQ2hlY2tCb3goCi0JCQlhZGRTdWJQYW5lKGpvaW5Db2x1bW5Hcm91cFBhbmUsIDgpLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zLAotCQkJYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCksCi0JCQludWxsCi0JCSk7Ci0KLQkJdGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZSA9IG5ldyBKb2luQ29sdW1uc0NvbXBvc2l0ZTxDb2xsZWN0aW9uVGFibGUyXzA+KAotCQkJdGhpcywKLQkJCWpvaW5Db2x1bW5Hcm91cFBhbmUsCi0JCQlidWlsZEpvaW5Db2x1bW5zRWRpdG9yKCkKLQkJKTsKLQotCQlpbnN0YWxsSm9pbkNvbHVtbnNQYW5lRW5hYmxlcih0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJlbnRWaXJ0dWFsKENvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUpIHsKLQkJcmV0dXJuIGNvbGxlY3Rpb25UYWJsZS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9EZXJpdmVkSWRlbnRpdHkyXzBQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRGVyaXZlZElkZW50aXR5Ml8wUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjZjMGVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9EZXJpdmVkSWRlbnRpdHkyXzBQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuRGVyaXZlZElkZW50aXR5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5NYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Db21ib1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBEZXJpdmVkSWRlbnRpdHkyXzBQYW5lCi0JZXh0ZW5kcyBQYW5lPERlcml2ZWRJZGVudGl0eTJfMD4KLXsKLQlwdWJsaWMgRGVyaXZlZElkZW50aXR5Ml8wUGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIERlcml2ZWRJZGVudGl0eTJfMD4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuRGVyaXZlZElkZW50aXR5X3RpdGxlKTsKLQkJKChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgPSAyOwotCQkKLQkJYWRkTnVsbERlcml2ZWRJZGVudGl0eVBhbmUoY29tcG9zaXRlKTsKLQkJYWRkSWREZXJpdmVkSWRlbnRpdHlQYW5lKGNvbXBvc2l0ZSk7Ci0JCWFkZE1hcHNJZERlcml2ZWRJZGVudGl0eVBhbmUoY29tcG9zaXRlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTnVsbERlcml2ZWRJZGVudGl0eVBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gYnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQkJcGFyZW50LAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkRlcml2ZWRJZGVudGl0eV9udWxsRGVyaXZlZElkZW50aXR5LAotCQkJCWJ1aWxkVXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneUhvbGRlcigpLAotCQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBidXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3lIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPERlcml2ZWRJZGVudGl0eTJfMCwgQm9vbGVhbj4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBEZXJpdmVkSWRlbnRpdHkyXzAuUFJFRE9NSU5BTlRfREVSSVZFRF9JREVOVElUWV9TVFJBVEVHWV9QUk9QRVJUWSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJLy8gcmFkaW8gYnV0dG9uIC0gc2hvdWxkIG9ubHkgaGF2ZSB0cnVlIHZhbHVlcyBoZXJlCi0JCQkJaWYgKHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXROdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZElkRGVyaXZlZElkZW50aXR5UGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBhZGRSYWRpb0J1dHRvbigKLQkJCQlwYXJlbnQsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuRGVyaXZlZElkZW50aXR5X2lkRGVyaXZlZElkZW50aXR5LAotCQkJCWJ1aWxkVXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3lIb2xkZXIoKSwKLQkJCQludWxsKTsKLQkJKChHcmlkRGF0YSkgYnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVc2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RGVyaXZlZElkZW50aXR5Ml8wLCBCb29sZWFuPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIERlcml2ZWRJZGVudGl0eTJfMC5QUkVET01JTkFOVF9ERVJJVkVEX0lERU5USVRZX1NUUkFURUdZX1BST1BFUlRZKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJLy8gcmFkaW8gYnV0dG9uIC0gc2hvdWxkIG9ubHkgaGF2ZSB0cnVlIHZhbHVlcyBoZXJlCi0JCQkJaWYgKHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYXBzSWREZXJpdmVkSWRlbnRpdHlQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdXNlc01hcHNJZE1vZGVsID0gYnVpbGRVc2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3lIb2xkZXIoKTsKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQlwYXJlbnQsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlczJfMC5EZXJpdmVkSWRlbnRpdHlfbWFwc0lkRGVyaXZlZElkZW50aXR5LAotCQkJdXNlc01hcHNJZE1vZGVsLAotCQkJbnVsbCk7Ci0KLQkJYnVpbGRNYXBzSWRWYWx1ZUNvbWJvUGFuZShwYXJlbnQsIHVzZXNNYXBzSWRNb2RlbCk7Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RGVyaXZlZElkZW50aXR5Ml8wLCBCb29sZWFuPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIERlcml2ZWRJZGVudGl0eTJfMC5QUkVET01JTkFOVF9ERVJJVkVEX0lERU5USVRZX1NUUkFURUdZX1BST1BFUlRZKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEJvb2xlYW4uRkFMU0UgOiB0aGlzLnN1YmplY3QudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQkvLyByYWRpbyBidXR0b24gLSBzaG91bGQgb25seSBoYXZlIHRydWUgdmFsdWVzIGhlcmUKLQkJCQlpZiAodmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tYm9QYW5lIGJ1aWxkTWFwc0lkVmFsdWVDb21ib1BhbmUoQ29tcG9zaXRlIHBhcmVudCwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHVzZXNNYXBzSWRNb2RlbCkgewotCQlyZXR1cm4gbmV3IE1hcHNJZFZhbHVlQ29tYm9QYW5lKHRoaXMsIGJ1aWxkTWFwc0lkU3RyYXRlZ3lIb2xkZXIoKSwgcGFyZW50LCB1c2VzTWFwc0lkTW9kZWwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wPiBidWlsZE1hcHNJZFN0cmF0ZWd5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxEZXJpdmVkSWRlbnRpdHkyXzAsIE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBjbGFzcyBNYXBzSWRWYWx1ZUNvbWJvUGFuZQotCQlleHRlbmRzIENvbWJvUGFuZTxNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMD4KLQl7Ci0JCXB1YmxpYyBNYXBzSWRWYWx1ZUNvbWJvUGFuZSgKLQkJCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQkJCQotCQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBlbmFibGVkTW9kZWwpOwotCQl9Ci0JCQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5ERUZBVUxUX1ZBTFVFX1BST1BFUlRZKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wLlNQRUNJRklFRF9WQUxVRV9QUk9QRVJUWSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIChnZXRTdWJqZWN0KCkgPT0gbnVsbCkgPyBudWxsIDogZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFZhbHVlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCWlmIChnZXRTdWJqZWN0KCkgIT0gbnVsbCkgZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFZhbHVlKHZhbHVlKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZXNEZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gKGdldFN1YmplY3QoKSA9PSBudWxsKSA/IHRydWUgOiBnZXRTdWJqZWN0KCkudXNlc0RlZmF1bHRWYWx1ZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gKGdldFN1YmplY3QoKSA9PSBudWxsKSA/IG51bGwgOiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRWYWx1ZXMoKSB7Ci0JCQlyZXR1cm4gKGdldFN1YmplY3QoKSA9PSBudWxsKSA/IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpIDogZ2V0U3ViamVjdCgpLmdldFNvcnRlZFZhbHVlQ2hvaWNlcygpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZE51bGxEZWZhdWx0VmFsdWVFbnRyeSgpIHsKLQkJCXJldHVybiBidWlsZE5vbk51bGxEZWZhdWx0VmFsdWVFbnRyeShKcHRVaURldGFpbHNNZXNzYWdlczJfMC5EZXJpdmVkSWRlbnRpdHlfbWFwc0lkVW5zcGVjaWZpZWRWYWx1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YzkzY2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0Q2xhc3NDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENvbGxlY3Rpb25UYWJsZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IExvYkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEJhc2ljTWFwcGluZwotICogQHNlZSBPcmRlckNvbHVtbkNvbXBvc2l0ZQotICogQHNlZSBFbnVtVHlwZUNvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgTG9iQ29tcG9zaXRlCi0gKiBAc2VlIE9wdGlvbmFsQ29tcG9zaXRlCi0gKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGU8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzaWNNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRWxlbWVudENvbGxlY3Rpb25WYWx1ZU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0VsZW1lbnRDb2xsZWN0aW9uVmFsdWVPdmVycmlkZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiMDRkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRWxlbWVudENvbGxlY3Rpb25WYWx1ZU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPdmVycmlkZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQXNzb2NpYXRpb25PdmVycmlkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbGVtZW50Q29sbGVjdGlvblZhbHVlT3ZlcnJpZGVzQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE92ZXJyaWRlc0NvbXBvc2l0ZTxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+Ci17Ci0JcHVibGljIEVsZW1lbnRDb2xsZWN0aW9uVmFsdWVPdmVycmlkZXNDb21wb3NpdGUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHBhcmVudFBhbmUsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBhbmU8QXNzb2NpYXRpb25PdmVycmlkZT4gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlUGFuZShQYWdlQm9vayBwYWdlQm9vaywgUHJvcGVydHlWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlKHRoaXMsIGFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIsIHBhZ2VCb29rKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcj4gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLCBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyPiBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCwgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0VtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZmYTYzMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZTxFbWJlZGRlZElkTWFwcGluZz4KLXsKLQlwdWJsaWMgRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVtYmVkZGVkSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGVkSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9FbWJlZGRlZElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0VtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzN2VkZGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0VtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZTxUIGV4dGVuZHMgRW1iZWRkZWRJZE1hcHBpbmcyXzA+Ci0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHJpdmF0ZSBMYWJlbCBtYXBwZWRCeVJlbGF0aW9uc2hpcExhYmVsOwotCi0JcHVibGljIEVtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJdGhpcy5tYXBwZWRCeVJlbGF0aW9uc2hpcExhYmVsID0gYWRkTGFiZWwocGFnZUJvb2ssIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lX2xhYmVsKTsKLQotCQluZXcgQ29udHJvbFN3aXRjaGVyKGJ1aWxkSXNNYXBwZWRCeVJlbGF0aW9uc2hpcEhvbGRlcigpLCBidWlsZFBhbmVUcmFuc2Zvcm1lcigpLCBwYWdlQm9vayk7Ci0JfQotCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkSXNNYXBwZWRCeVJlbGF0aW9uc2hpcEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbWJlZGRlZElkTWFwcGluZzJfMC5NQVBQRURfQllfUkVMQVRJT05TSElQX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzTWFwcGVkQnlSZWxhdGlvbnNoaXAoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxCb29sZWFuLCBDb250cm9sPiBidWlsZFBhbmVUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxCb29sZWFuLCBDb250cm9sPigpIHsKLQkJCXB1YmxpYyBDb250cm9sIHRyYW5zZm9ybShCb29sZWFuIGNvbnZlcnRlcikgewotCQkJCWlmIChjb252ZXJ0ZXIgPT0gbnVsbCB8fCBjb252ZXJ0ZXIgPT0gQm9vbGVhbi5GQUxTRSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lLnRoaXMubWFwcGVkQnlSZWxhdGlvbnNoaXBMYWJlbDsgCi0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0VtYmVkZGVkTWFwcGluZzJfME92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0VtYmVkZGVkTWFwcGluZzJfME92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2MwZDNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9FbWJlZGRlZE1hcHBpbmcyXzBPdmVycmlkZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5FbWJlZGRlZE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRNYXBwaW5nMl8wT3ZlcnJpZGVzQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZTxFbWJlZGRlZE1hcHBpbmc+Ci17Ci0JcHVibGljIEVtYmVkZGVkTWFwcGluZzJfME92ZXJyaWRlc0NvbXBvc2l0ZSgKLQkJCVBhbmU8PyBleHRlbmRzIEVtYmVkZGVkTWFwcGluZz4gcGFyZW50UGFuZSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzQXNzb2NpYXRpb25PdmVycmlkZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcj4gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1iZWRkZWRNYXBwaW5nLCBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQYW5lPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZVBhbmUoUGFnZUJvb2sgcGFnZUJvb2ssIFByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZTJfMENvbXBvc2l0ZSh0aGlzLCBhc3NvY2lhdGlvbk92ZXJyaWRlSG9sZGVyLCBwYWdlQm9vayk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcj4gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbWJlZGRlZE1hcHBpbmcsIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFbWJlZGRlZE1hcHBpbmcyXzApIHRoaXMuc3ViamVjdCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9FbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9FbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMjZlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRW50aXR5Ml8wT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbnRpdHlPdmVycmlkZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0RW50aXR5T3ZlcnJpZGVzQ29tcG9zaXRlCi17Ci0JcHVibGljIEVudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZSgKLQkJCVBhbmU8PyBleHRlbmRzIEVudGl0eT4gcGFyZW50UGFuZSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQYW5lPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZVBhbmUoUGFnZUJvb2sgcGFnZUJvb2ssIFByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZTJfMENvbXBvc2l0ZSh0aGlzLCBhc3NvY2lhdGlvbk92ZXJyaWRlSG9sZGVyLCBwYWdlQm9vayk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0dlbmVyYXRpb24yXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9HZW5lcmF0aW9uMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MmUxYmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0dlbmVyYXRpb24yXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3JDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuR2VuZXJhdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEdlbmVyYXRpb24yXzBDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRpb24yXzBDb21wb3NpdGUgZXh0ZW5kcyBHZW5lcmF0aW9uQ29tcG9zaXRlCi17Ci0JCi0JcHVibGljIEdlbmVyYXRpb24yXzBDb21wb3NpdGUoCi0JCVBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgR2VuZXJhdG9yQ29udGFpbmVyPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHRvcE1hcmdpbiwgaW50IGxlZnRNYXJnaW4pIHsKLQkJbmV3IFNlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCXRoaXMuYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckhvbGRlcigpLAotCQkJdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgdG9wTWFyZ2luLCBsZWZ0TWFyZ2luKSwKLQkJCXRoaXMuYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckJ1aWxkZXIoKQotCQkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0lkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0lkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTFmYmRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9JZE1hcHBpbmcyXzBNYXBwZWRCeVJlbGF0aW9uc2hpcFBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuSWRNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLQotcHVibGljIGNsYXNzIElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZTxUIGV4dGVuZHMgSWRNYXBwaW5nMl8wPgotCWV4dGVuZHMgUGFuZTxUPgotewotCi0JcHJpdmF0ZSBMYWJlbCBtYXBwZWRCeVJlbGF0aW9uc2hpcExhYmVsOwotCi0JcHVibGljIElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJUGFnZUJvb2sgcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCXBhZ2VCb29rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCXRoaXMubWFwcGVkQnlSZWxhdGlvbnNoaXBMYWJlbCA9IGFkZExhYmVsKHBhZ2VCb29rLCBKcHRVaURldGFpbHNNZXNzYWdlczJfMC5JZE1hcHBpbmcyXzBNYXBwZWRCeVJlbGF0aW9uc2hpcFBhbmVfbGFiZWwpOwotCi0JCW5ldyBDb250cm9sU3dpdGNoZXIoYnVpbGRJc01hcHBlZEJ5UmVsYXRpb25zaGlwSG9sZGVyKCksIGJ1aWxkUGFuZVRyYW5zZm9ybWVyKCksIHBhZ2VCb29rKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRJc01hcHBlZEJ5UmVsYXRpb25zaGlwSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIElkTWFwcGluZzJfMC5NQVBQRURfQllfUkVMQVRJT05TSElQX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzTWFwcGVkQnlSZWxhdGlvbnNoaXAoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxCb29sZWFuLCBDb250cm9sPiBidWlsZFBhbmVUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxCb29sZWFuLCBDb250cm9sPigpIHsKLQkJCXB1YmxpYyBDb250cm9sIHRyYW5zZm9ybShCb29sZWFuIGNvbnZlcnRlcikgewotCQkJCWlmIChjb252ZXJ0ZXIgPT0gbnVsbCB8fCBjb252ZXJ0ZXIgPT0gQm9vbGVhbi5GQUxTRSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZS50aGlzLm1hcHBlZEJ5UmVsYXRpb25zaGlwTGFiZWw7IAotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9JZE1hcHBpbmdHZW5lcmF0aW9uMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODFhZTRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9JZE1hcHBpbmdHZW5lcmF0aW9uMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRNYXBwaW5nR2VuZXJhdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5HZW5lcmF0b3JDb21wb3NpdGUuR2VuZXJhdG9yQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIElkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIElkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGUgZXh0ZW5kcyBJZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlCi17Ci0KLQlwdWJsaWMgSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBJZE1hcHBpbmc+IHBhcmVudFBhbmUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUgYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciwgCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxTZXF1ZW5jZUdlbmVyYXRvcj4gc2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIsCi0JCUdlbmVyYXRvckJ1aWxkZXI8U2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9yQnVpbGRlciwKLQkJaW50IHRvcE1hcmdpbiwKLQkJaW50IGxlZnRNYXJnaW4pIHsKLQotCQlyZXR1cm4gbmV3IFNlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCXNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyLAotCQkJdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgdG9wTWFyZ2luLCBsZWZ0TWFyZ2luKSwKLQkJCXNlcXVlbmNlR2VuZXJhdG9yQnVpbGRlcgotCQkpOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9KcHRVaURldGFpbHNNZXNzYWdlczJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0pwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MDQ0ZTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0pwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgbWFwcGluZyBwYW5lcy4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGNsYXNzIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wIAotewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhc2NhZGVQYW5lMl8wX2RldGFjaDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlX2pvaW5Db2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlX3NjaGVtYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfY2F0YWxvZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVyaXZlZElkZW50aXR5X3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlcml2ZWRJZGVudGl0eV9udWxsRGVyaXZlZElkZW50aXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlcml2ZWRJZGVudGl0eV9pZERlcml2ZWRJZGVudGl0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXJpdmVkSWRlbnRpdHlfbWFwc0lkRGVyaXZlZElkZW50aXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlcml2ZWRJZGVudGl0eV9tYXBzSWRVbnNwZWNpZmllZFZhbHVlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBfbGlua0xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRDb2xsZWN0aW9uU2VjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMF9Db21wb3NpdGVfdmFsdWVTZWN0aW9uVGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5X2NhY2hlYWJsZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eV9jYWNoZWFibGVXaXRoRGVmYXVsdExhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lX2xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZV9sYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlcmluZ0NvbXBvc2l0ZV9vcmRlckNvbHVtbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlX29ycGhhblJlbW92YWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlX29ycGhhblJlbW92YWxMYWJlbERlZmF1bHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9ja01vZGVDb21wb3NpdGVfbG9ja01vZGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2tNb2RlQ29tcG9zaXRlX3JlYWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9ja01vZGVDb21wb3NpdGVfd3JpdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9ja01vZGVDb21wb3NpdGVfb3B0aW1pc3RpYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NrTW9kZUNvbXBvc2l0ZV9vcHRpbWlzdGljX2ZvcmNlX2luY3JlbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NrTW9kZUNvbXBvc2l0ZV9wZXNzaW1pc3RpY19yZWFkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2tNb2RlQ29tcG9zaXRlX3Blc3NpbWlzdGljX3dyaXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2tNb2RlQ29tcG9zaXRlX3Blc3NpbWlzdGljX2ZvcmNlX2luY3JlbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NrTW9kZUNvbXBvc2l0ZV9ub25lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0Q2xhc3NDb21wb3NpdGVfbGFiZWw7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF91aV9kZXRhaWxzMl8wIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVaURldGFpbHNNZXNzYWdlczJfMCgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvTG9ja01vZGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9Mb2NrTW9kZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTM3ZmM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9Mb2NrTW9kZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5Mb2NrTW9kZVR5cGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk5hbWVkUXVlcnkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgTG9ja01vZGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIExvY2tNb2RlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxOYW1lZFF1ZXJ5Ml8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TG9ja01vZGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIExvY2tNb2RlQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIE5hbWVkUXVlcnkyXzA+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlczJfMC5Mb2NrTW9kZUNvbXBvc2l0ZV9sb2NrTW9kZUxhYmVsLAotCQkJdGhpcy5hZGRMb2NrTW9kZVR5cGVDb21ibyhjb250YWluZXIpLAotCQkJbnVsbAkJLy8gVE9ETwotCQkpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxOYW1lZFF1ZXJ5Ml8wLCBMb2NrTW9kZVR5cGUyXzA+IGFkZExvY2tNb2RlVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8TmFtZWRRdWVyeTJfMCwgTG9ja01vZGVUeXBlMl8wPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChOYW1lZFF1ZXJ5Ml8wLkRFRkFVTFRfTE9DS19NT0RFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChOYW1lZFF1ZXJ5Ml8wLlNQRUNJRklFRF9MT0NLX01PREVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMb2NrTW9kZVR5cGUyXzBbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBMb2NrTW9kZVR5cGUyXzAudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExvY2tNb2RlVHlwZTJfMCBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRMb2NrTW9kZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhMb2NrTW9kZVR5cGUyXzAgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLmNsYXNzLAotCQkJCQlMb2NrTW9kZUNvbXBvc2l0ZS50aGlzLAotCQkJCQl2YWx1ZQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExvY2tNb2RlVHlwZTJfMCBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkTG9ja01vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShMb2NrTW9kZVR5cGUyXzAgdmFsdWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRMb2NrTW9kZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL01hbnlUb09uZUpvaW5pbmdTdHJhdGVneTJfMFBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9NYW55VG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MTNhYWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL01hbnlUb09uZUpvaW5pbmdTdHJhdGVneTJfMFBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOiAgCi0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLSBKb2luaW5nIFN0cmF0ZWd5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG8gSm9pbkNvbHVtblN0cmF0ZWd5UGFuZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCBvIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmVfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBNYW55VG9PbmVNYXBwaW5nfQotICogQHNlZSB7QGxpbmsgTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlfQotICogQHNlZSB7QGxpbmsgT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIEpvaW5Db2x1bW5TdHJhdGVneVBhbmV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lIGV4dGVuZHMgUGFuZTxNYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA+Ci17Ci0JcHVibGljIE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneTJfMFBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsIAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBNYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfdGl0bGUsCi0JCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19qb2luQ29sdW1uSm9pbmluZ0xhYmVsLAotCQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpLAotCQkJbnVsbCk7Ci0KLQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuCi0JCQlidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lV2l0aEluY2x1ZGVPdmVycmlkZUNoZWNrQm94KHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbXBvc2l0ZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfam9pblRhYmxlSm9pbmluZ0xhYmVsLAotCQkJSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZS5idWlsZFVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCW5ldyBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGNvbXBvc2l0ZSk7Ci0KLQkJYWRkU3ViUGFuZShjb21wb3NpdGUsIDUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9OYW1lZFF1ZXJ5UHJvcGVydHkyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9OYW1lZFF1ZXJ5UHJvcGVydHkyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3M2E1Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvTmFtZWRRdWVyeVByb3BlcnR5Ml8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5OYW1lZFF1ZXJ5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5RdWVyeUhpbnRzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgTmFtZWRRdWVyeVByb3BlcnR5Ml8wQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lZFF1ZXJ5UHJvcGVydHkyXzBDb21wb3NpdGUgZXh0ZW5kcyBOYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGU8TmFtZWRRdWVyeTJfMD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5hbWVkUXVlcnlQcm9wZXJ0eTJfMENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgTmFtZWRRdWVyeVByb3BlcnR5Ml8wQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxOYW1lZFF1ZXJ5Ml8wPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQl0aGlzLmFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk5hbWVkUXVlcnlDb21wb3NpdGVfbmFtZVRleHRMYWJlbCwgCi0JCQl0aGlzLmJ1aWxkTmFtZVRleHRIb2xkZXIoKSk7Ci0KLQkJLy8gUXVlcnkgdGV4dCBhcmVhCi0JCXRoaXMuYWRkTGFiZWxlZE11bHRpTGluZVRleHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnksCi0JCQl0aGlzLmJ1aWxkUXVlcnlIb2xkZXIoKSwKLQkJCTQsCi0JCQludWxsCi0JCSk7Ci0KLQkJbmV3IExvY2tNb2RlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCQkKLQkJLy8gUXVlcnkgSGludHMgcGFuZQotCQljb250YWluZXIgPSB0aGlzLmFkZFRpdGxlZEdyb3VwKAotCQkJdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnlIaW50c0dyb3VwQm94Ci0JCSk7Ci0KLQkJbmV3IFF1ZXJ5SGludHNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL09uZVRvTWFueUpvaW5pbmdTdHJhdGVneTJfMFBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmNmIyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZTogIAotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gSm9pbmluZyBTdHJhdGVneSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgbyBKb2luVGFibGVTdHJhdGVneVBhbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgT25lVG9NYW55TWFwcGluZ30KLSAqIEBzZWUge0BsaW5rIE9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZX0KLSAqIEBzZWUge0BsaW5rIE9ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBNYXBwZWRCeVN0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEpvaW5UYWJsZVN0cmF0ZWd5UGFuZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIE9uZVRvTWFueUpvaW5pbmdTdHJhdGVneTJfMFBhbmUgCi0JZXh0ZW5kcyBQYW5lPE9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMD4KLXsKLQlwdWJsaWMgT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMD4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfdGl0bGUsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkpOwotCQotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbXBvc2l0ZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfbWFwcGVkQnlMYWJlbCwKLQkJCU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZS5idWlsZFVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpLAotCQkJbnVsbCk7Ci0KLQkJbmV3IE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb21wb3NpdGUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX2pvaW5Db2x1bW5Kb2luaW5nTGFiZWwsCi0JCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZS5idWlsZFVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSksCi0JCQludWxsKTsKLQotCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZS4KLQkJCWJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmVXaXRoSW5jbHVkZU92ZXJyaWRlQ2hlY2tCb3godGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19qb2luVGFibGVKb2luaW5nTGFiZWwsCi0JCQlKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lLmJ1aWxkVXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpLAotCQkJbnVsbCk7Ci0KLQkJbmV3IEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCWFkZFN1YlBhbmUoY29tcG9zaXRlLCA1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvT25lVG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvT25lVG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYTFiOWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL09uZVRvT25lSm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5NYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6ICAKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtIEpvaW5pbmcgU3RyYXRlZ3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgbyBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IG8gSm9pbkNvbHVtblN0cmF0ZWd5UGFuZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCBvIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmVfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgbyBQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5UGFuZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgT25lVG9PbmVNYXBwaW5nfQotICogQHNlZSB7QGxpbmsgT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2V9Ci0gKiBAc2VlIHtAbGluayBPbmVUb09uZU1hcHBpbmdDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBNYXBwZWRCeVN0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEpvaW5Db2x1bW5TdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5UGFuZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZSAKLQlleHRlbmRzIFBhbmU8T25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA+Ci17Ci0JcHVibGljIE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX3RpdGxlLAotCQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKSk7Ci0JCQotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbXBvc2l0ZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfbWFwcGVkQnlMYWJlbCwKLQkJCU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZS5idWlsZFVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpLAotCQkJbnVsbCk7Ci0KLQkJbmV3IE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb21wb3NpdGUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX3ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ0xhYmVsLAotCQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lLmJ1aWxkVXNlc1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSksCi0JCQludWxsKTsKLQotCQluZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbXBvc2l0ZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfam9pbkNvbHVtbkpvaW5pbmdMYWJlbCwKLQkJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lLmJ1aWxkVXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lLgotCQkJCWJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmVXaXRoSW5jbHVkZU92ZXJyaWRlQ2hlY2tCb3godGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19qb2luVGFibGVKb2luaW5nTGFiZWwsCi0JCQlKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lLmJ1aWxkVXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpLAotCQkJbnVsbCk7Ci0KLQkJbmV3IEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgY29tcG9zaXRlKTsKLQotCQlhZGRTdWJQYW5lKGNvbXBvc2l0ZSwgNSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL09yZGVyQ29sdW1uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvT3JkZXJDb2x1bW5Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyMTNhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvT3JkZXJDb2x1bW5Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuQ29sdW1uQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDb2x1bW5Db21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ID4gRGV0YWlscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB4IEluc2VydGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIHggVXBkYXRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgeCBOdWxsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgQ29sdW1uIERlZmluaXRpb246IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKiAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIE9yZGVyQ29sdW1uQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcmRlckNvbHVtbjJfMD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db2x1bW5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklDb2x1bW48L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcmRlckNvbHVtbkNvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9yZGVyQ29sdW1uMl8wPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29sdW1uQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JQ29sdW1uPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCi0JICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IGNvbnRyb2xsZXI7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCi0JICovCi0JcHVibGljIE9yZGVyQ29sdW1uQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JkZXJDb2x1bW4yXzA+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db2x1bW5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklDb2x1bW48L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgY29udHJvbGxlcjsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKi8KLQlwdWJsaWMgT3JkZXJDb2x1bW5Db21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcmRlckNvbHVtbjJfMD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsCi0JICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBhcmVudE1hbmFnZVBhbmUpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsIHBhcmVudE1hbmFnZVBhbmUpOwotCX0KLQotCXByaXZhdGUgQ29sdW1uQ29tYm88T3JkZXJDb2x1bW4yXzA+IGFkZENvbHVtbkNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENvbHVtbkNvbWJvPE9yZGVyQ29sdW1uMl8wPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChOYW1lZENvbHVtbi5ERUZBVUxUX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKE5hbWVkQ29sdW1uLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZE5hbWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUYWJsZSBnZXREYlRhYmxlXygpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERiVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiT3JkZXJDb2x1bW5Db21wb3NpdGUuY29sdW1uQ29tYm8iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29sdW1uRGVmaW5pdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JkZXJDb2x1bW4yXzAsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBOYW1lZENvbHVtbi5DT0xVTU5fREVGSU5JVElPTl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXRDb2x1bW5EZWZpbml0aW9uKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEluc2VydGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9yZGVyQ29sdW1uMl8wLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VDb2x1bW4uU1BFQ0lGSUVEX0lOU0VSVEFCTEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEluc2VydGFibGVTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRJbnNlcnRhYmxlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfaW5zZXJ0YWJsZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGU7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdEluc2VydGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9yZGVyQ29sdW1uMl8wLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUJhc2VDb2x1bW4uU1BFQ0lGSUVEX0lOU0VSVEFCTEVfUFJPUEVSVFksCi0JCQlCYXNlQ29sdW1uLkRFRkFVTFRfSU5TRVJUQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZEluc2VydGFibGUoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROdWxsYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JkZXJDb2x1bW4yXzAsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQmFzZUNvbHVtbi5TUEVDSUZJRURfTlVMTEFCTEVfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWROdWxsYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZE51bGxhYmxlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTnVsbGFibGVTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHROdWxsYWJsZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX251bGxhYmxlV2l0aERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfbnVsbGFibGU7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdE51bGxhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcmRlckNvbHVtbjJfMCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlCYXNlQ29sdW1uLlNQRUNJRklFRF9OVUxMQUJMRV9QUk9QRVJUWSwKLQkJCUJhc2VDb2x1bW4uREVGQVVMVF9OVUxMQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE51bGxhYmxlKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXBkYXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcmRlckNvbHVtbjJfMCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlCYXNlQ29sdW1uLkRFRkFVTFRfVVBEQVRBQkxFX1BST1BFUlRZLAotCQkJQmFzZUNvbHVtbi5TUEVDSUZJRURfVVBEQVRBQkxFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkVXBkYXRhYmxlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXBkYXRhYmxlU3RyaW5nSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRVcGRhdGFibGVIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0VXBkYXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcmRlckNvbHVtbjJfMCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlCYXNlQ29sdW1uLlNQRUNJRklFRF9VUERBVEFCTEVfUFJPUEVSVFksCi0JCQlCYXNlQ29sdW1uLkRFRkFVTFRfVVBEQVRBQkxFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvLyBDb2x1bW4gd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX25hbWUsCi0JCQlhZGRDb2x1bW5Db21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUkRFUl9DT0xVTU5fT1JERVJJTkdfQ09MVU1OCi0JCSk7Ci0KLQkJLy8gRGV0YWlscyBzdWItcGFuZQotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVN1YlNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfZGV0YWlscywKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSkKLQkJKTsKLQotCQluZXcgRGV0YWlsc0NvbXBvc2l0ZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCAxNikpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBEZXRhaWxzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcmRlckNvbHVtbjJfMD4gewotCQkJCQotCQlwdWJsaWMgRGV0YWlsc0NvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0gICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9yZGVyQ29sdW1uMl8wPiBzdWJqZWN0SG9sZGVyLAotICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkJLy8gSW5zZXJ0YWJsZSB0cmktc3RhdGUgY2hlY2sgYm94Ci0JCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDQpLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9pbnNlcnRhYmxlLAotCQkJCWJ1aWxkSW5zZXJ0YWJsZUhvbGRlcigpLAotCQkJCWJ1aWxkSW5zZXJ0YWJsZVN0cmluZ0hvbGRlcigpLAotCQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX0lOU0VSVEFCTEUKLQkJCSk7Ci0KLQkJCS8vIFVwZGF0YWJsZSB0cmktc3RhdGUgY2hlY2sgYm94Ci0JCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV91cGRhdGFibGUsCi0JCQkJYnVpbGRVcGRhdGFibGVIb2xkZXIoKSwKLQkJCQlidWlsZFVwZGF0YWJsZVN0cmluZ0hvbGRlcigpLAotCQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX1VQREFUQUJMRQotCQkJKTsKLQotCQkJLy8gTnVsbGFibGUgdHJpLXN0YXRlIGNoZWNrIGJveAotCQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfbnVsbGFibGUsCi0JCQkJYnVpbGROdWxsYWJsZUhvbGRlcigpLAotCQkJCWJ1aWxkTnVsbGFibGVTdHJpbmdIb2xkZXIoKSwKLQkJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9OVUxMQUJMRQotCQkJKTsKLQotCQkJLy8gQ29sdW1uIERlZmluaXRpb24gd2lkZ2V0cwotCQkJYWRkTGFiZWxlZFRleHQoCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9jb2x1bW5EZWZpbml0aW9uLAotCQkJCWJ1aWxkQ29sdW1uRGVmaW5pdGlvbkhvbGRlcigpCi0JCQkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9PcmRlcmluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL09yZGVyaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNjE2YjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL09yZGVyaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT3JkZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE9yZGVyaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtIE9yZGVyaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgbyBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIFByaW1hcnkgS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG8gQ3VzdG9tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgICB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQ29sbGVjdGlvbk1hcHBpbmcKLSAqIEBzZWUgT3JtTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgT3JtT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3JkZXJpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdE9yZGVyaW5nQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcmRlcmluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JkZXJpbmcyXzBDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgQ29sbGVjdGlvbk1hcHBpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JkZXJpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9yZGVyaW5nMl8wQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29sbGVjdGlvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JkZXJhYmxlPiBvcmRlcmFibGVIb2xkZXIgPSBidWlsZE9yZGVyYWJsZUhvbGRlcigpOwotCi0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk9yZGVyaW5nQ29tcG9zaXRlX29yZGVyaW5nR3JvdXAKLQkJKTsKLQotCQkvLyBObyBPcmRlcmluZyByYWRpbyBidXR0b24KLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5PcmRlcmluZ0NvbXBvc2l0ZV9ub25lLAotCQkJYnVpbGROb09yZGVyaW5nSG9sZGVyKG9yZGVyYWJsZUhvbGRlciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZX05PX09SREVSSU5HCi0JCSk7Ci0KLQkJLy8gT3JkZXIgYnkgUHJpbWFyeSBLZXkgcmFkaW8gYnV0dG9uCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuT3JkZXJpbmdDb21wb3NpdGVfcHJpbWFyeUtleSwKLQkJCWJ1aWxkUHJpbWFyeUtleU9yZGVyaW5nSG9sZGVyKG9yZGVyYWJsZUhvbGRlciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZX1BSSU1BUllfS0VZX09SREVSSU5HCi0JCSk7Ci0KLQkJLy8gQ3VzdG9tIE9yZGVyaW5nIHJhZGlvIGJ1dHRvbgotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk9yZGVyaW5nQ29tcG9zaXRlX2N1c3RvbSwKLQkJCWJ1aWxkQ3VzdG9tT3JkZXJpbmdIb2xkZXIob3JkZXJhYmxlSG9sZGVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1JERVJfQllfQ1VTVE9NX09SREVSSU5HCi0JCSk7Ci0KLQkJLy8gQ3VzdG9tIE9yZGVyaW5nIHRleHQgZmllbGQKLQkJYWRkVGV4dCgKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCAxNiksCi0JCQlidWlsZFNwZWNpZmllZE9yZGVyQnlIb2xkZXIob3JkZXJhYmxlSG9sZGVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1JERVJfQlksCi0JCQlidWlsZEN1c3RvbU9yZGVyaW5nSG9sZGVyKG9yZGVyYWJsZUhvbGRlcikKLQkJKTsKLQotCQkKLQkJLy8gT3JkZXIgQ29sdW1uIE9yZGVyaW5nIHJhZGlvIGJ1dHRvbgotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLk9yZGVyaW5nQ29tcG9zaXRlX29yZGVyQ29sdW1uLAotCQkJYnVpbGRPcmRlckNvbHVtbk9yZGVyaW5nSG9sZGVyKG9yZGVyYWJsZUhvbGRlciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0NPTFVNTl9PUkRFUklORwotCQkpOwotCi0JCU9yZGVyQ29sdW1uQ29tcG9zaXRlIG9yZGVyQ29sdW1uQ29tcG9zaXRlID0gbmV3IE9yZGVyQ29sdW1uQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWJ1aWxkT3JkZXJDb2x1bW5Ib2xkZXIob3JkZXJhYmxlSG9sZGVyKSwgCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgMTYpKTsKLQotCQlpbnN0YWxsT3JkZXJDb2x1bW5Db21wb3NpdGVFbmFibGVyKG9yZGVyYWJsZUhvbGRlciwgb3JkZXJDb2x1bW5Db21wb3NpdGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsT3JkZXJDb2x1bW5Db21wb3NpdGVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxPcmRlcmFibGU+IG9yZGVyYWJsZUhvbGRlciwgT3JkZXJDb2x1bW5Db21wb3NpdGUgcGFuZSkgewotCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRQYW5lRW5hYmxlckhvbGRlcihvcmRlcmFibGVIb2xkZXIpLCBwYW5lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8T3JkZXJhYmxlPiBvcmRlcmFibGVIb2xkZXIpIHsKLQkJcmV0dXJuIGJ1aWxkT3JkZXJDb2x1bW5PcmRlcmluZ0hvbGRlcihvcmRlcmFibGVIb2xkZXIpOwotCX0KLQotCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT3JkZXJDb2x1bW5PcmRlcmluZ0hvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8T3JkZXJhYmxlPiBvcmRlcmFibGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JkZXJhYmxlLCBCb29sZWFuPihvcmRlcmFibGVIb2xkZXIsIE9yZGVyYWJsZTJfMC5PUkRFUl9DT0xVTU5fT1JERVJJTkdfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZigoKE9yZGVyYWJsZTJfMCkgdGhpcy5zdWJqZWN0KS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQkoKE9yZGVyYWJsZTJfMCkgdGhpcy5zdWJqZWN0KS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxPcmRlckNvbHVtbjJfMD4gYnVpbGRPcmRlckNvbHVtbkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8T3JkZXJhYmxlPiBvcmRlcmFibGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JkZXJhYmxlLCBPcmRlckNvbHVtbjJfMD4ob3JkZXJhYmxlSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcmRlckNvbHVtbjJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChPcmRlcmFibGUyXzApIHRoaXMuc3ViamVjdCkuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL09ycGhhblJlbW92YWwyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YTRkYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL09ycGhhblJlbW92YWwyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBbWF0gIE9ycGhhbiByZW1vdmFsICh0cnVlL2ZhbHNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUge0BsaW5rIE9ycGhhblJlbW92YWJsZTJfMH0KLSAqIEBzZWUge0BsaW5rIEphdmFPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGV9IC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqIEBzZWUge0BsaW5rIE9ybU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZX0gLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICovCi1wdWJsaWMgY2xhc3MgT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8T3JwaGFuUmVtb3ZhYmxlMl8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZSgKLQkJCQkJCQlQYW5lPD8gZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nPiBwYXJlbnRQYW5lLAotCQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JwaGFuUmVtb3ZhYmxlMl8wPiBzdWJqZWN0SG9sZGVyLAotCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLk9ycGhhblJlbW92YWwyXzBDb21wb3NpdGVfb3JwaGFuUmVtb3ZhbExhYmVsLAotCQkJdGhpcy5idWlsZE9ycGhhblJlbW92YWxIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRPcnBoYW5SZW1vdmFsU3RyaW5nSG9sZGVyKCksCi0JCQludWxsCQkvLyBUT0RPCi0JCSk7Ci0JfQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPcnBoYW5SZW1vdmFsSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcnBoYW5SZW1vdmFibGUyXzAsIEJvb2xlYW4+KAotCQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCAKLQkJCQlPcnBoYW5SZW1vdmFibGUyXzAuREVGQVVMVF9PUlBIQU5fUkVNT1ZBTF9QUk9QRVJUWSwKLQkJCQlPcnBoYW5SZW1vdmFibGUyXzAuU1BFQ0lGSUVEX09SUEhBTl9SRU1PVkFMX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRPcnBoYW5SZW1vdmFsU3RyaW5nSG9sZGVyKCkgewotCQkKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KHRoaXMuYnVpbGREZWZhdWx0T3JwaGFuUmVtb3ZhbEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZV9vcnBoYW5SZW1vdmFsTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZV9vcnBoYW5SZW1vdmFsTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdE9ycGhhblJlbW92YWxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ycGhhblJlbW92YWJsZTJfMCwgQm9vbGVhbj4oCi0JCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwKLQkJCU9ycGhhblJlbW92YWJsZTJfMC5TUEVDSUZJRURfT1JQSEFOX1JFTU9WQUxfUFJPUEVSVFksCi0JCQlPcnBoYW5SZW1vdmFibGUyXzAuREVGQVVMVF9PUlBIQU5fUkVNT1ZBTF9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRPcnBoYW5SZW1vdmFsKCkpOwotCQkJfQotCQl9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9RdWVyaWVzMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvUXVlcmllczJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWE0YzY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9RdWVyaWVzMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk5hbWVkUXVlcnkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlF1ZXJpZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogIFF1ZXJpZXMyXzBDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFF1ZXJpZXMyXzBDb21wb3NpdGUKLQlleHRlbmRzIFF1ZXJpZXNDb21wb3NpdGUKLXsKLQlwdWJsaWMgUXVlcmllczJfMENvbXBvc2l0ZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFF1ZXJ5Q29udGFpbmVyPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZTxOYW1lZFF1ZXJ5Ml8wPiBidWlsZE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZShQYWdlQm9vayBwYWdlQm9vaykgewotCQlyZXR1cm4gbmV3IE5hbWVkUXVlcnlQcm9wZXJ0eTJfMENvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQl0aGlzLmJ1aWxkTmFtZWRRdWVyeTJfMEhvbGRlcigpLAotCQkJcGFnZUJvb2spOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE5hbWVkUXVlcnkyXzA+IGJ1aWxkTmFtZWRRdWVyeTJfMEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeSwgTmFtZWRRdWVyeTJfMD4odGhpcy5nZXRRdWVyeUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBOYW1lZFF1ZXJ5Ml8wIHRyYW5zZm9ybV8oUXVlcnkgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgTmFtZWRRdWVyeSkgPyAoTmFtZWRRdWVyeTJfMCkgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9TZXF1ZW5jZUdlbmVyYXRvcjJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL1NlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMWIyZmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL1NlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3IyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLlNjaGVtYUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXF1ZW5jZUdlbmVyYXRvcjJfMENvbXBvc2l0ZSBleHRlbmRzIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlCi17Ci0KLQlwdWJsaWMgU2VxdWVuY2VHZW5lcmF0b3IyXzBDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U2VxdWVuY2VHZW5lcmF0b3I+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCUdlbmVyYXRvckJ1aWxkZXI8U2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkZXIpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGJ1aWxkZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQl0aGlzLmFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfbmFtZSwKLQkJCXRoaXMuYnVpbGRHZW5lcmF0b3JOYW1lSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9OQU1FCi0JCSk7Ci0KLQkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIHdpZGdldHMKLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2UsCi0JCQl0aGlzLmJ1aWxkU2VxdWVuY2VOYW1lQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfU0VRVUVOQ0VfR0VORVJBVE9SX1NFUVVFTkNFCi0JCSk7Ci0KLQkJLy8gU2NoZW1hIHdpZGdldHMKLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2NoZW1hLAotCQkJdGhpcy5hZGRTY2hlbWFDb21ibyhjb250YWluZXIpLAotCQkJbnVsbAkvLyBKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9TQ0hFTUEKLQkJKTsKLQotCQkvLyBDYXRhbG9nIHdpZGdldHMKLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfY2F0YWxvZywKLQkJCXRoaXMuYWRkQ2F0YWxvZ0NvbWJvKGNvbnRhaW5lciksCi0JCQludWxsCS8vIEpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfU0VRVUVOQ0VfR0VORVJBVE9SX0NBVEFMT0cKLQkJKTsKLQotCQl0aGlzLmFkZEFsbG9jYXRpb25TaXplQ29tYm8oY29udGFpbmVyKTsKLQkJdGhpcy5hZGRJbml0aWFsVmFsdWVDb21ibyhjb250YWluZXIpOwotCX0KLQotCXByaXZhdGUgU2NoZW1hQ29tYm88U2VxdWVuY2VHZW5lcmF0b3I+IGFkZFNjaGVtYUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IFNjaGVtYUNvbWJvPFNlcXVlbmNlR2VuZXJhdG9yPih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFNlcXVlbmNlR2VuZXJhdG9yMl8wLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChTZXF1ZW5jZUdlbmVyYXRvcjJfMC5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChTZXF1ZW5jZUdlbmVyYXRvcjJfMC5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFNlcXVlbmNlR2VuZXJhdG9yMl8wLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJCWlmIChwcm9wZXJ0eU5hbWUgPT0gU2VxdWVuY2VHZW5lcmF0b3IyXzAuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBTZXF1ZW5jZUdlbmVyYXRvcjJfMC5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSApIHsKLQkJCQkJcmVwb3B1bGF0ZUNvbWJvQm94KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuICgoU2VxdWVuY2VHZW5lcmF0b3IyXzApIGdldFN1YmplY3QoKSkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIG51bGxTdWJqZWN0SXNBbGxvd2VkKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIHN1YmplY3QgbWF5IGJlIG51bGwsIHNvIGRlbGVnYXRlIHRvIHRoZSBjb21wb3NpdGUKLQkJCSAqLwotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQkJCXJldHVybiBTZXF1ZW5jZUdlbmVyYXRvcjJfMENvbXBvc2l0ZS50aGlzLmdldEpwYVByb2plY3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQkoKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBTZXF1ZW5jZUdlbmVyYXRvcjJfMENvbXBvc2l0ZS50aGlzLnJldHJpZXZlR2VuZXJhdG9yKCkpLnNldFNwZWNpZmllZFNjaGVtYSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gKChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgZ2V0U3ViamVjdCgpKS5nZXRTcGVjaWZpZWRTY2hlbWEoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyKCkgewotCQkJCVNlcXVlbmNlR2VuZXJhdG9yMl8wIHRnID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSB0aGlzLmdldFN1YmplY3QoKTsKLQkJCQlpZiAodGcgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdGcuZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIFNlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlLnRoaXMuZ2V0U3ViamVjdCgpLmdldENvbnRleHREZWZhdWx0RGJTY2hlbWFDb250YWluZXIoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyXygpIHsKLQkJCQkvLyB3ZSBvdmVycm9kZSAjZ2V0RGJTY2hlbWFDb250YWluZXIoKSBpbnN0ZWFkCi0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDYXRhbG9nQ29tYm88U2VxdWVuY2VHZW5lcmF0b3I+IGFkZENhdGFsb2dDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDYXRhbG9nQ29tYm88U2VxdWVuY2VHZW5lcmF0b3I+KHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoU2VxdWVuY2VHZW5lcmF0b3IyXzAuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChTZXF1ZW5jZUdlbmVyYXRvcjJfMC5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuICgoU2VxdWVuY2VHZW5lcmF0b3IyXzApIGdldFN1YmplY3QoKSkuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBudWxsU3ViamVjdElzQWxsb3dlZCgpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBzdWJqZWN0IG1heSBiZSBudWxsLCBzbyBkZWxlZ2F0ZSB0byB0aGUgY29tcG9zaXRlCi0JCQkgKi8KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gU2VxdWVuY2VHZW5lcmF0b3IyXzBDb21wb3NpdGUudGhpcy5nZXRKcGFQcm9qZWN0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJKChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgU2VxdWVuY2VHZW5lcmF0b3IyXzBDb21wb3NpdGUudGhpcy5yZXRyaWV2ZUdlbmVyYXRvcigpKS5zZXRTcGVjaWZpZWRDYXRhbG9nKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiAoKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBnZXRTdWJqZWN0KCkpLmdldFNwZWNpZmllZENhdGFsb2coKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvVGFyZ2V0Q2xhc3NDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9UYXJnZXRDbGFzc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzlmMDA2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9UYXJnZXRDbGFzc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJDb21ib1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICB0YXJnZXQgZW50aXR5IGh5cGVybGluayBsYWJlbCwgY29tYm8gYW5kIGJyb3dzZSBidXR0b24gCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXJnZXRDbGFzc0NvbXBvc2l0ZSBleHRlbmRzIENsYXNzQ2hvb3NlckNvbWJvUGFuZTxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+Ci17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRhcmdldEVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGFyZ2V0Q2xhc3NDb21wb3NpdGUoCi0JCQkJCQkJCVBhbmU8PyBleHRlbmRzIEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRUYXJnZXRDbGFzcygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXRoaXMuZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFRhcmdldENsYXNzKGNsYXNzTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRUYXJnZXRDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLQl9Ci0JCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0gICAgCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlczJfMC5UYXJnZXRDbGFzc0NvbXBvc2l0ZV9sYWJlbDsKLSAgICB9Ci0gICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLSAgICAJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTUzsKLSAgICB9Ci0gICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotICAgIAlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlNQRUNJRklFRF9UQVJHRVRfQ0xBU1NfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQotCQkJCVN0cmluZyBuYW1lID0gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFRhcmdldENsYXNzKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gVGFyZ2V0Q2xhc3NDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGdldERlZmF1bHRWYWx1ZSh0aGlzLnN1YmplY3QpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3ModmFsdWUpOwotCQkJfQotCQl9OwotICAgIH0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ2xhc3NMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZERlZmF1bHRQcm9maWxlckxpc3RIb2xkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0UHJvZmlsZXJMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdFByb2ZpbGVySG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFByb2ZpbGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5ERUZBVUxUX1RBUkdFVF9DTEFTU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBUYXJnZXRDbGFzc0NvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZSh0aGlzLnN1YmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRWYWx1ZShFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCWRlZmF1bHRWYWx1ZQotCQkJKTsKLQkJfQotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdEVtcHR5OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9HZW5lcmljMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9HZW5lcmljMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYzllN2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvR2VuZXJpYzJfMEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkRlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW50aXR5VWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLk51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWMyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24gZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEdlbmVyaWMyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBHZW5lcmljMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YVVpRmFjdG9yeSBidWlsZEphdmFVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpYzJfMEphdmFVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChOdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9HZW5lcmljMl8wSmF2YVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvR2VuZXJpYzJfMEphdmFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiNjkxMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9HZW5lcmljMl8wSmF2YVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuQmFzZUphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5FbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5HZW5lcmljUGVyc2lzdGVuY2VYbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpwYTIuZGV0YWlscy5qYXZhLkphdmFVaUZhY3RvcnkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVUkgZmFjdG9yeSByZXF1aXJlZCB0byBzaG93IHRoZSBpbmZvcm1hdGlvbgotICogcmVsYXRlZCB0byBhIEpQQSBtYXBwaW5nICh0eXBlIG9yIGF0dHJpYnV0ZSkuCi0gKgotICogQHNlZSBHZW5lcmljUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkKLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWMyXzBKYXZhVWlGYWN0b3J5Ci0JZXh0ZW5kcyBCYXNlSmF2YVVpRmFjdG9yeQotCWltcGxlbWVudHMgSmF2YVVpRmFjdG9yeTJfMAotewotCS8vICoqKioqKioqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YU1hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRW50aXR5Q29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRW50aXR5Ml8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGFibGVDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRW1iZWRkYWJsZTJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGphdmEgYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUlkTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEVtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YU9uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxMjliOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpwYTIuZGV0YWlscy5qYXZhLkphdmFVaUZhY3RvcnkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+Ci0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiAoKEphdmFVaUZhY3RvcnkyXzApIGZhY3RvcnkpLmNyZWF0ZUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkYWJsZTJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGFibGUyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwMTBiZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkYWJsZTJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIGRvZXMgbm90IGhhdmUgYW55IHdpZGdldHMuCi0gKgotICogQHNlZSBFbWJlZGRhYmxlCi0gKiBAc2VlIEVtYmVkZGFibGVVaVByb3ZpZGVyCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkYWJsZTJfMENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RW1iZWRkYWJsZUNvbXBvc2l0ZTxKYXZhRW1iZWRkYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFFbWJlZGRhYmxlMl8wQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVFbWJlZGRhYmxlQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGFibGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsJCi0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRW1iZWRkYWJsZSwgQWNjZXNzSG9sZGVyPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOGQyOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkVtYmVkZGVkTWFwcGluZzJfME92ZXJyaWRlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVtYmVkZGVkTWFwcGluZwotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlPEphdmFFbWJlZGRlZE1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5FbWJlZGRlZE1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGVkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFbWJlZGRlZE1hcHBpbmcyXzBPdmVycmlkZXNDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFFbnRpdHkyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFFbnRpdHkyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkNzExZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRW50aXR5TmFtZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JZENsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhY2hlYWJsZTJfMFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5FbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5RdWVyaWVzMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBwYW5lIHVzZWQgZm9yIGEgSmF2YSBlbnRpdHkuCi0gKgotICogQHNlZSBKYXZhRW50aXR5Ci0gKiBAc2VlIEphdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFFbnRpdHkyXzBDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0RW50aXR5Q29tcG9zaXRlPEphdmFFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KYXZhRW50aXR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SmF2YUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRW50aXR5Ml8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVudGl0eVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFibGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVudGl0eU5hbWVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsJCi0JCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSWRDbGFzc1JlZmVyZW5jZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FjaGVhYmxlMl8wUGFuZSh0aGlzLCBidWlsZENhY2hlYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFbnRpdHksIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlYWJsZTJfMD4gYnVpbGRDYWNoZWFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFbnRpdHksIENhY2hlYWJsZTJfMD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoZWFibGUyXzAgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldENhY2hlYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTZWNvbmRhcnlUYWJsZXNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEphdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSW5oZXJpdGFuY2VTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVRdWVyaWVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnlDb250YWluZXI+IHF1ZXJ5Q29udGFpbmVySG9sZGVyKSB7Ci0JCW5ldyBRdWVyaWVzMl8wQ29tcG9zaXRlKHRoaXMsIHF1ZXJ5Q29udGFpbmVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjNWQ0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUlkTWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGU8SWRNYXBwaW5nPgotewotCXB1YmxpYyBKYXZhSWRNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYXRpb25Db2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZTU4MjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ2FzY2FkZVBhbmUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcmRlcmluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPEphdmFNYW55VG9NYW55TWFwcGluZywgSmF2YU1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U+Ci17Ci0JcHVibGljIEphdmFNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb01hbnlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlUGFuZTJfMCh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9yZGVyaW5nQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9yZGVyaW5nMl8wQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjdjMGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5DYXNjYWRlUGFuZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0TWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxKYXZhTWFueVRvT25lTWFwcGluZywgSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMD4KLXsKLQlwdWJsaWMgSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlUGFuZTJfMCh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZzJfMFBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxNzBjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZzJfMFBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKLQotcHVibGljIGNsYXNzIEphdmFNYW55VG9PbmVNYXBwaW5nMl8wUGFuZQote30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzgyNjhkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRDbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkJhc2VKYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IElkQ2xhc3NDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBNYXBwZWRTdXBlcmNsYXNzCi0gKiBAc2VlIEJhc2VKYXZhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIElkQ2xhc3NDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8SmF2YU1hcHBlZFN1cGVyY2xhc3M+Ci0gICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YU1hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hcHBlZFN1cGVyY2xhc3NTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsJCi0JCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSWRDbGFzc1JlZmVyZW5jZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFNYXBwZWRTdXBlcmNsYXNzLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ODNiNjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ2FzY2FkZVBhbmUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PbmVUb01hbnlKb2luaW5nU3RyYXRlZ3kyXzBQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT3JkZXJpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YU9uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxKYXZhT25lVG9NYW55TWFwcGluZywgSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMD4KLXsKLQlwdWJsaWMgSmF2YU9uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFPbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9uZVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZE9ycGhhblJlbW92YWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZVBhbmUyXzAodGhpcywgdGhpcy5idWlsZENhc2NhZGVIb2xkZXIoKSwgdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9uZVRvTWFueUpvaW5pbmdTdHJhdGVneTJfMFBhbmUodGhpcywgdGhpcy5idWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT3JkZXJpbmdDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JkZXJpbmcyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9ycGhhblJlbW92YWJsZTJfMD4gYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFPbmVUb01hbnlNYXBwaW5nLCBPcnBoYW5SZW1vdmFibGUyXzA+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcnBoYW5SZW1vdmFibGUyXzAgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgdGhpcy5zdWJqZWN0KS5nZXRPcnBoYW5SZW1vdmFsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWM3NjI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT25lVG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0T25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlPEphdmFPbmVUb09uZU1hcHBpbmcsIEphdmFPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMD4KLXsKLQlwdWJsaWMgSmF2YU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPbmVUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlKHRoaXMsIGJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlUGFuZTJfMCh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKb2luaW5nU3RyYXRlZ3lDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT25lVG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lKHRoaXMsIGJ1aWxkSm9pbmluZ0hvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9ycGhhblJlbW92YWJsZTJfMD4gYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFPbmVUb09uZU1hcHBpbmcsIE9ycGhhblJlbW92YWJsZTJfMD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcnBoYW5SZW1vdmFibGUyXzAgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgdGhpcy5zdWJqZWN0KS5nZXRPcnBoYW5SZW1vdmFsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nczJfMERldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyZWY3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQYWdlIGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnRpdHlNYXBwaW5nczJfMERldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0b3JzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yczJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVRdWVyaWVzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybVF1ZXJpZXMyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliOWQwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYURldGFpbHNQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFEZXRhaWxzUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm92aWRlc0RldGFpbHMoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfMl8wX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhRGV0YWlsc1BhZ2U8RW50aXR5TWFwcGluZ3M+IGJ1aWxkRGV0YWlsc1BhZ2UoCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gbmV3IEVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzR2VuZXJhdG9yczJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnMyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmODliNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzR2VuZXJhdG9yczJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5HZW5lcmF0b3JDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuR2VuZXJhdG9yQ29tcG9zaXRlLkdlbmVyYXRvckJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLlNlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzMl8wQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnMyXzBDb21wb3NpdGUgZXh0ZW5kcyBFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudGl0eU1hcHBpbmdzR2VuZXJhdG9yczJfMENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzMl8wQ29tcG9zaXRlKAotCQkJCQkJUGFuZTw/IGV4dGVuZHMgRW50aXR5TWFwcGluZ3M+IHBhcmVudFBhbmUsCi0JCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEdlbmVyYXRvckNvbXBvc2l0ZTxTZXF1ZW5jZUdlbmVyYXRvcj4gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyLAotCQkJR2VuZXJhdG9yQnVpbGRlcjxTZXF1ZW5jZUdlbmVyYXRvcj4gZ2VuZXJhdG9yQnVpbGRlcikgewotCi0JCXJldHVybiBuZXcgU2VxdWVuY2VHZW5lcmF0b3IyXzBDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJc2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIsCi0JCQlwYXJlbnQsCi0JCQlnZW5lcmF0b3JCdWlsZGVyCi0JCSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtQmFzaWNNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUJhc2ljTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmE3MzFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtQmFzaWNNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RCYXNpY01hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5Db2x1bW5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1CYXNpY01hcHBpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEJhc2ljTWFwcGluZ0NvbXBvc2l0ZTxPcm1CYXNpY01hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGluazFfMU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1CYXNpY01hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1CYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJhc2ljU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGFkZFN1YlBhbmUoY29udGFpbmVyLCA0KSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtQmFzaWNNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlYzgzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuVGFyZ2V0Q2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZTxPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGluazFfMU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVsZW1lbnRDb2xsZWN0aW9uU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sbGVjdGlvblRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4YTg1My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuanBhMi5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3RvcnkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCW5ldyBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiAoKE9ybVhtbFVpRmFjdG9yeTJfMCkgZmFjdG9yeSkuY3JlYXRlT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTA0NmQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5FbWJlZGRlZElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlPE9ybUVtYmVkZGVkSWRNYXBwaW5nPgotCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JcHVibGljIE9ybUVtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1FbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbWJlZGRlZElkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQkKLQkJbmV3IEVtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0JCi0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1FbWJlZGRlZElkTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRiYjg4Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5FbWJlZGRlZE1hcHBpbmcyXzBPdmVycmlkZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW1iZWRkZWRNYXBwaW5nCi0gKiBAc2VlIEJhc2VKYXZhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTxPcm1FbWJlZGRlZE1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5FbWJlZGRlZE1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbWJlZGRlZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQotCQluZXcgRW1iZWRkZWRNYXBwaW5nMl8wT3ZlcnJpZGVzQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWNvbnRhaW5lcgotCQkpOwotCX0JCi0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1FbWJlZGRlZE1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVudGl0eTJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDQ0ZTc5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5FbnRpdHlOYW1lQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklkQ2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkFic3RyYWN0T3JtRW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5NZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1KYXZhQ2xhc3NDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ2FjaGVhYmxlMl8wUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkVudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkdlbmVyYXRpb24yXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5RdWVyaWVzMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBwYW5lIHVzZWQgZm9yIGFuIE9STSBlbnRpdHkgMi4wLgotICoKLSAqIEBzZWUgT3JtRW50aXR5Ci0gKiBAc2VlIEVudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgT3JtRW50aXR5Ml8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUVudGl0eUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JtRW50aXR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+T3JtRW50aXR5PC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVudGl0eTJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVudGl0eVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtSmF2YUNsYXNzQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lciwgZmFsc2UpOwotCQluZXcgVGFibGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVudGl0eU5hbWVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IElkQ2xhc3NDb21wb3NpdGUodGhpcywgYnVpbGRJZENsYXNzUmVmZXJlbmNlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYWNoZWFibGUyXzBQYW5lKHRoaXMsIGJ1aWxkQ2FjaGVhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBNZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZWFibGUyXzA+IGJ1aWxkQ2FjaGVhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1FbnRpdHksIENhY2hlYWJsZTJfMD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoZWFibGUyXzAgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldENhY2hlYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0b3JzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdG9yQ29udGFpbmVyPiBnZW5lcmF0b3JDb250YWluZXJIb2xkZXIpIHsKLQkJbmV3IEdlbmVyYXRpb24yXzBDb21wb3NpdGUodGhpcywgZ2VuZXJhdG9yQ29udGFpbmVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVRdWVyaWVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnlDb250YWluZXI+IHF1ZXJ5Q29udGFpbmVySG9sZGVyKSB7Ci0JCW5ldyBRdWVyaWVzMl8wQ29tcG9zaXRlKHRoaXMsIHF1ZXJ5Q29udGFpbmVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUlkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDgxZTljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5Db2x1bW5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLklkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLklkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1JZE1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlPE9ybUlkTWFwcGluZz4KLXsKLQlwdWJsaWMgT3JtSWRNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1JZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0aW9uQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IElkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1JZE1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1NYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1NYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzkxMzRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT3JkZXJpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPE9ybU1hbnlUb01hbnlNYXBwaW5nLCBPcm1NYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvTWFueU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb01hbnlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZVBhbmUyXzAodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcmRlcmluZ0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcmRlcmluZzJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjVmN2UwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkFic3RyYWN0TWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlPE9ybU1hbnlUb09uZU1hcHBpbmcsIE9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMD4KLXsKLQlwdWJsaWMgT3JtTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYW55VG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1NYW55VG9PbmVNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTliMDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ2FzY2FkZVBhbmUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PbmVUb01hbnlKb2luaW5nU3RyYXRlZ3kyXzBQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT3JkZXJpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPE9ybU9uZVRvTWFueU1hcHBpbmcsIE9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMD4KLXsKLQlwdWJsaWMgT3JtT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPbmVUb01hbnlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIHRoaXMuYnVpbGRDYXNjYWRlSG9sZGVyKCksIHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9uZVRvTWFueUpvaW5pbmdTdHJhdGVneTJfMFBhbmUodGhpcywgdGhpcy5idWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT3JkZXJpbmdDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JkZXJpbmcyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybU9uZVRvTWFueU1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxPcnBoYW5SZW1vdmFibGUyXzA+IGJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1PbmVUb01hbnlNYXBwaW5nLCBPcnBoYW5SZW1vdmFibGUyXzA+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcnBoYW5SZW1vdmFibGUyXzAgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgdGhpcy5zdWJqZWN0KS5nZXRPcnBoYW5SZW1vdmFsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1PbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YmZlZTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1PbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT25lVG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8T3JtT25lVG9PbmVNYXBwaW5nLCBPcm1PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMD4KLXsKLQlwdWJsaWMgT3JtT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1PbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGUodGhpcywgYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZSh0aGlzLCBidWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybU9uZVRvT25lTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxPcnBoYW5SZW1vdmFibGUyXzA+IGJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1PbmVUb09uZU1hcHBpbmcsIE9ycGhhblJlbW92YWJsZTJfMD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcnBoYW5SZW1vdmFibGUyXzAgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgdGhpcy5zdWJqZWN0KS5nZXRPcnBoYW5SZW1vdmFsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1RdWVyaWVzMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybVF1ZXJpZXMyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjZTZhMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybVF1ZXJpZXMyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUXVlcmllc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUXVlcmllc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLlF1ZXJpZXMyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBPcm1RdWVyaWVzMl8wQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1RdWVyaWVzMl8wQ29tcG9zaXRlIGV4dGVuZHMgT3JtUXVlcmllc0NvbXBvc2l0ZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybVF1ZXJpZXMyXzBDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9ybVF1ZXJpZXMyXzBDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgRW50aXR5TWFwcGluZ3M+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFF1ZXJpZXNDb21wb3NpdGUgYnVpbGRRdWVyaWVzQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeUNvbnRhaW5lcj4gcXVlcnlDb250YWluZXJIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBRdWVyaWVzMl8wQ29tcG9zaXRlKHRoaXMsIHF1ZXJ5Q29udGFpbmVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtVmVyc2lvbk1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtVmVyc2lvbk1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxMTk3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybVZlcnNpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1WZXJzaW9uTWFwcGluZzJfMENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0VmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8T3JtVmVyc2lvbk1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua09ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+VmVyc2lvbk1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtVmVyc2lvbk1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1WZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmVyc2lvblNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtVmVyc2lvbk1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtWG1sMl8wVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybVhtbDJfMFVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWI4NDk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtWG1sMl8wVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW50aXR5VWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1JZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLkdlbmVyaWNPcm1YbWwyXzBVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZS5Pcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIE9ybVhtbDJfMFVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBPcm1YbWwyXzBVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybVhtbDJfMFVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVhtbFVpRmFjdG9yeSBidWlsZE9ybVhtbFVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtWG1sMl8wVWlGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzVWkoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfMl8wX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwM2M5MzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuSnBhT3B0aW9uczJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2Uub3B0aW9ucy5HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5HZW5lcmljUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVJIGZhY3RvcnkgcmVxdWlyZWQgdG8gc2hvdyB0aGUgaW5mb3JtYXRpb24KLSAqIHJlbGF0ZWQgdG8gYSBKUEEgbWFwcGluZyAodHlwZSBvciBhdHRyaWJ1dGUpLgotICoKLSAqIEBzZWUgR2VuZXJpY1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5Ci0gKgotICogQHZlcnNpb24gMS4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljMl8wUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkgaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeQotewotCQotCS8vICoqKioqKioqKioqKioqKiogcGVyc2lzdGVuY2UgdW5pdCBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpwYVBhZ2VDb21wb3NpdGU+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZXMoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCUFycmF5TGlzdDxKcGFQYWdlQ29tcG9zaXRlPiBwYWdlcyA9IG5ldyBBcnJheUxpc3Q8SnBhUGFnZUNvbXBvc2l0ZT4oNCk7Ci0JCQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhQ29ubmVjdGlvbjJfMD4gY29ubmVjdGlvbjJfMEhvbGRlciA9IAotCQkJdGhpcy5idWlsZEpwYUNvbm5lY3Rpb24yXzBIb2xkZXIoc3ViamVjdEhvbGRlcik7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxKcGFPcHRpb25zMl8wPiBvcHRpb25zMl8wSG9sZGVyID0gCi0JCQl0aGlzLmJ1aWxkSnBhT3B0aW9uczJfMEhvbGRlcihzdWJqZWN0SG9sZGVyKTsKLQkJCi0JCXBhZ2VzLmFkZChuZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCXBhZ2VzLmFkZChuZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWIoY29ubmVjdGlvbjJfMEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCXBhZ2VzLmFkZChuZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNUYWIob3B0aW9uczJfMEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCXBhZ2VzLmFkZChuZXcgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQotCQlyZXR1cm4gcGFnZXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEpwYUNvbm5lY3Rpb24yXzA+IGJ1aWxkSnBhQ29ubmVjdGlvbjJfMEhvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LCBKcGFDb25uZWN0aW9uMl8wPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFDb25uZWN0aW9uMl8wIHRyYW5zZm9ybV8oUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIChKcGFDb25uZWN0aW9uMl8wKSAoKFBlcnNpc3RlbmNlVW5pdDJfMCkgdmFsdWUpLmdldENvbm5lY3Rpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhT3B0aW9uczJfMD4gYnVpbGRKcGFPcHRpb25zMl8wSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQsIEpwYU9wdGlvbnMyXzA+KHN1YmplY3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYU9wdGlvbnMyXzAgdHJhbnNmb3JtXyhQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKEpwYU9wdGlvbnMyXzApICgoUGVyc2lzdGVuY2VVbml0Ml8wKSB2YWx1ZSkuZ2V0T3B0aW9ucygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL0pwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjE2YWQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqICBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMKLSAqLwotcHVibGljIGNsYXNzIEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcwotewotCS8vIENvbm5lY3Rpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9EYXRhYmFzZV9Hcm91cEJveDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlX2p0YURhdGFTb3VyY2VMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZV9ub25KdGFEYXRhU291cmNlTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25Db21wb3NpdGVfc2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uQ29tcG9zaXRlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvblRhYl90aXRsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc0NvbXBvc2l0ZV9taXNjZWxsYW5lb3VzU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zQ29tcG9zaXRlX21pc2NlbGxhbmVvdXNTZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNUYWJfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNUYWJfbm9OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0Nvbm5lY3Rpb25EaWFsb2dfTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9wb3B1bGF0ZUZyb21Db25uZWN0aW9uSHlwZXJMaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9kcml2ZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfdXJsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3VzZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfcGFzc3dvcmRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlX0pkYmNDb25uZWN0aW9uUHJvcGVydGllc19Hcm91cEJveDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlX2xvY2tUaW1lb3V0TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlX3F1ZXJ5VGltZW91dExhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZV90cmFuc2FjdGlvblR5cGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZV9qdGE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlX3Jlc291cmNlX2xvY2FsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZV9zaGFyZWRDYWNoZU1vZGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZV9hbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX2VuYWJsZV9zZWxlY3RpdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX2Rpc2FibGVfc2VsZWN0aXZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZV91bnNwZWNpZmllZDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZV92YWxpZGF0aW9uTW9kZUxhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlX2F1dG87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfY2FsbGJhY2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfbm9uZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlUGVyc2lzdExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlVXBkYXRlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGVfZ3JvdXBQcmVSZW1vdmVMYWJlbDsKLQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfdWlfcGVyc2lzdGVuY2UyXzAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjA4MTU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLkFic3RyYWN0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFBlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5IGJ1aWxkUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpYzJfMFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzVWkoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRSk7Ci0JfQotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExN2I0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SnBhQ29ubmVjdGlvbjJfMD4KLXsKLQlwdWJsaWMgQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUoUGFuZTxKcGFDb25uZWN0aW9uMl8wPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYWRkVGl0bGVkR3JvdXAoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfRGF0YWJhc2VfR3JvdXBCb3gKLQkJKTsKLQotCQluZXcgRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0RhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhZmUxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogIERhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SnBhQ29ubmVjdGlvbjJfMD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBEYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZShQYW5lPEpwYUNvbm5lY3Rpb24yXzA+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkSnRhRGF0YVNvdXJjZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBTdHJpbmc+KHRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0LkpUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0SnRhRGF0YVNvdXJjZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXRKdGFEYXRhU291cmNlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEpUQURhdGFTb3VyY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLCBCb29sZWFuPihidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMudHJhbnNmb3JtMih2YWx1ZSkpOwotCQkJfQotCQkJcHJpdmF0ZSBib29sZWFuIHRyYW5zZm9ybTIoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLkpUQTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROb25KdGFEYXRhU291cmNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFN0cmluZz4oYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0Lk5PTl9KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5vbkp0YURhdGFTb3VyY2UoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0Tm9uSnRhRGF0YVNvdXJjZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb25KVEFEYXRhU291cmNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSwgQm9vbGVhbj4oYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUwpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4gYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPigKLQkJCQlidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLCAKLQkJCQlQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFksIAotCQkJCVBlcnNpc3RlbmNlVW5pdC5ERUZBVUxUX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYUNvbm5lY3Rpb24yXzAsIFBlcnNpc3RlbmNlVW5pdD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW50IGdyb3VwQm94TWFyZ2luID0gdGhpcy5nZXRHcm91cEJveE1hcmdpbigpOwotCi0JCWNvbnRhaW5lciA9IHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7Ci0KLQkJLy8gSlRBIERhdGEgU291cmNlCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBqdGFFbmFibGVkID0gdGhpcy5idWlsZEpUQURhdGFTb3VyY2VIb2xkZXIoKTsKLQkJTGFiZWwganRhTGFiZWwgPSB0aGlzLmFkZExhYmVsKGNvbnRhaW5lciwgSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLkRhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlX2p0YURhdGFTb3VyY2VMYWJlbCwganRhRW5hYmxlZCk7Ci0JCVRleHQganRhVGV4dCA9IHRoaXMuYWRkVGV4dChjb250YWluZXIsIHRoaXMuYnVpbGRKdGFEYXRhU291cmNlSG9sZGVyKCksIHRoaXMuZ2V0SGVscElEKCksIGp0YUVuYWJsZWQpOwotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoY29udGFpbmVyLCBqdGFMYWJlbCwganRhVGV4dCwgdGhpcy5nZXRIZWxwSUQoKSk7Ci0KLQkJLy8gTm9uLUpUQSBEYXRhIFNvdXJjZQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbm9uSlRBRW5hYmxlZCA9IHRoaXMuYnVpbGROb25KVEFEYXRhU291cmNlSG9sZGVyKCk7Ci0JCUxhYmVsIG5vbkp0YUxhYmVsID0gdGhpcy5hZGRMYWJlbChjb250YWluZXIsIEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5EYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZV9ub25KdGFEYXRhU291cmNlTGFiZWwsIG5vbkpUQUVuYWJsZWQpOwotCQlUZXh0IG5vbkp0YVRleHQgPSB0aGlzLmFkZFRleHQoY29udGFpbmVyLCB0aGlzLmJ1aWxkTm9uSnRhRGF0YVNvdXJjZUhvbGRlcigpLCB0aGlzLmdldEhlbHBJRCgpLCBub25KVEFFbmFibGVkKTsKLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKGNvbnRhaW5lciwgbm9uSnRhTGFiZWwsIG5vbkp0YVRleHQsIHRoaXMuZ2V0SGVscElEKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVscElEKCkgewotCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT047CS8vIFRPRE8gLSBSZXZpZXcgZm9yIEpQQSAyLjAKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDE4OGIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcGFDb25uZWN0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxKcGFDb25uZWN0aW9uMl8wPgotewotCXB1YmxpYyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvbkNvbXBvc2l0ZSgKLQkJCQkJCQkJCQkJCQkJCVBhbmU8SnBhQ29ubmVjdGlvbjJfMD4gc3ViamVjdEhvbGRlciwKLQkJCQkJCQkJCQkJCQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW50IGdyb3VwQm94TWFyZ2luID0gdGhpcy5nZXRHcm91cEJveE1hcmdpbigpICogMjsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25Db21wb3NpdGVfc2VjdGlvblRpdGxlLAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLkdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uQ29tcG9zaXRlX3NlY3Rpb25EZXNjcmlwdGlvbgotCQkpOwotCi0JCUNvbXBvc2l0ZSBzdWJQYW5lID0gdGhpcy5hZGRTdWJQYW5lKAotCQkJY29udGFpbmVyLAotCQkJMCwgZ3JvdXBCb3hNYXJnaW4sIDEwLCBncm91cEJveE1hcmdpbgotCQkpOwotCi0JCW5ldyBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGUodGhpcywgc3ViUGFuZSk7Ci0KLQkJbmV3IENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmZTdhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvblRhYgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWIgZXh0ZW5kcyBQYW5lPEpwYUNvbm5lY3Rpb24yXzA+Ci0JaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+R2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWIoCi0JCQkJCQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKcGFDb25uZWN0aW9uMl8wPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25Db21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExheW91dCAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMuYWRkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKcGFQYWdlQ29tcG9zaXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVscElEKCkgewotCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT047CS8vIFRPRE8gLSBSZXZpZXcgZm9yIEpQQSAyLjAKLQl9Ci0JCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgewotCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLkdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uVGFiX3RpdGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1OWQzMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsdGVyZWRJdGVtc1NlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiAgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SnBhQ29ubmVjdGlvbjJfMD4KLXsKLQkvKioKLQkgKiBUaGUgY29uc3RhbnQgSUQgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGlhbG9nIHNldHRpbmdzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfU0VUVElOR1MgPSAib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGlhbG9ncy5Db25uZWN0aW9uRGlhbG9nIjsKLQotCXB1YmxpYyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUoUGFuZTxKcGFDb25uZWN0aW9uMl8wPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUGFzc3dvcmRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYUNvbm5lY3Rpb24yXzAsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIEpwYUNvbm5lY3Rpb24yXzAuUEFTU1dPUkRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBhc3N3b3JkKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFBhc3N3b3JkKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUG9wdWxhdGVGcm9tQ29ubmVjdGlvbkFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwcm9tcHRDb25uZWN0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXJsSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKcGFDb25uZWN0aW9uMl8wLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBKcGFDb25uZWN0aW9uMl8wLlVSTF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VXJsKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFVybCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXNlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhQ29ubmVjdGlvbjJfMCwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgSnBhQ29ubmVjdGlvbjJfMC5VU0VSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRVc2VyKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFVzZXIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFBvcHVsYXRlIGZyb20gQ29ubmVjdGlvbiBoeXBlcmxpbmsKLQkJdGhpcy5hZGRIeXBlcmxpbmsoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3BvcHVsYXRlRnJvbUNvbm5lY3Rpb25IeXBlckxpbmssCi0JCQl0aGlzLmJ1aWxkUG9wdWxhdGVGcm9tQ29ubmVjdGlvbkFjdGlvbigpCi0JCSk7Ci0KLQkJLy8gRHJpdmVyCi0JCW5ldyBKZGJjRHJpdmVyQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJLy8gVXJsCi0JCXRoaXMuYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3VybExhYmVsLAotCQkJdGhpcy5idWlsZFVybEhvbGRlcigpCi0JCSk7Ci0KLQkJLy8gVXNlcgotCQl0aGlzLmFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLkpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV91c2VyTGFiZWwsCi0JCQl0aGlzLmJ1aWxkVXNlckhvbGRlcigpCi0JCSk7Ci0KLQkJLy8gUGFzc3dvcmQKLQkJdGhpcy5hZGRMYWJlbGVkUGFzc3dvcmRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLkpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9wYXNzd29yZExhYmVsLAotCQkJdGhpcy5idWlsZFBhc3N3b3JkSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQl2b2lkIHByb21wdENvbm5lY3Rpb24oKSB7Ci0KLQkJQ29ubmVjdGlvblNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgQ29ubmVjdGlvblNlbGVjdGlvbkRpYWxvZygpOwotCi0JCWlmIChkaWFsb2cub3BlbigpICE9IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gKFN0cmluZykgZGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShuYW1lKTsKLQotCQlKcGFDb25uZWN0aW9uMl8wIGNvbm5lY3Rpb24gPSBnZXRTdWJqZWN0KCk7Ci0JCWNvbm5lY3Rpb24uc2V0VXJsKChjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VVJMKCkpOwotCQljb25uZWN0aW9uLnNldFVzZXIoKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVc2VyTmFtZSgpKTsKLQkJY29ubmVjdGlvbi5zZXRQYXNzd29yZCgoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldFVzZXJQYXNzd29yZCgpKTsKLQkJY29ubmVjdGlvbi5zZXREcml2ZXIoKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXREcml2ZXJDbGFzc05hbWUoKSk7Ci0JfQotCi0JQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IGdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpIHsKLQkJLy8gd2UgYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IGFueSBjb25uZWN0aW9uIHByb2ZpbGUgYW5kIHNpbXBseQotCQkvLyB0YWtlIHRoZSBzZXR0aW5ncyBmcm9tIGl0ICh1c2VyLCBwYXNzd29yZCwgZXRjLikgYW5kIGdpdmUgdGhlbQotCQkvLyB0byB0aGUgcGVyc2lzdGVuY2UgY29ubmVjdGlvbiwgc28gd2UgZ28KLQkJLy8gdG8gdGhlIGRiIHBsdWctaW4gZGlyZWN0bHkgdG8gZ2V0IHRoZSBmYWN0b3J5Ci0JCXJldHVybiBKcHREYlBsdWdpbi5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKTsKLQl9Ci0KLQkvLyBicm9hZGVuIGFjY2VzcyBhIGJpdAotCVNoZWxsIGdldFNoZWxsXygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRpYWxvZyBzaG93cyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBjb25uZWN0aW9uIG5hbWVzIGFuZCBsZXRzIHRoZSB1c2VyCi0JICogdGhlIG9wdGlvbiB0byBmaWx0ZXIgdGhlbSB1c2luZyBhIHNlYXJjaCBmaWVsZC4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgQ29ubmVjdGlvblNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIEZpbHRlcmVkSXRlbXNTZWxlY3Rpb25EaWFsb2cgewotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBpbmdTZWxlY3Rpb25EaWFsb2c8L2NvZGU+LgotCQkgKi8KLQkJcHJvdGVjdGVkIENvbm5lY3Rpb25TZWxlY3Rpb25EaWFsb2coKSB7Ci0JCQlzdXBlcihKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUudGhpcy5nZXRTaGVsbF8oKSwgZmFsc2UpOwotCQkJdGhpcy5zZXRNZXNzYWdlKEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19NZXNzYWdlKTsKLQkJCXRoaXMuc2V0VGl0bGUoSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLkpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9Db25uZWN0aW9uRGlhbG9nX1RpdGxlKTsKLQkJCXRoaXMuc2V0TGlzdExhYmVsUHJvdmlkZXIodGhpcy5idWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCQl0aGlzLnNldERldGFpbHNMYWJlbFByb3ZpZGVyKHRoaXMuYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoZWxlbWVudCA9PSBudWxsKSA/ICIiIDogZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRXh0ZW5kZWRDb250ZW50QXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlbXNGaWx0ZXIgY3JlYXRlRmlsdGVyKCkgewotCQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uSXRlbXNGaWx0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGVudFByb3ZpZGVyKEFic3RyYWN0Q29udGVudFByb3ZpZGVyIHByb3ZpZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1zRmlsdGVyIGl0ZW1zRmlsdGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCQltb25pdG9yLmJlZ2luVGFzayhudWxsLCAtMSk7Ci0KLQkJCXRyeSB7Ci0JCQkJLy8gQWRkIHRoZSBjb25uZWN0aW9uIG5hbWVzIHRvIHRoZSBkaWFsb2cKLQkJCQlmb3IgKFN0cmluZyBuYW1lIDogdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWVzKCkpIHsKLQkJCQkJcHJvdmlkZXIuYWRkKG5hbWUsIGl0ZW1zRmlsdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWVzKCkgewotCQkJcmV0dXJuIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS50aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCi0JCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBKcHRVaVBsdWdpbi5pbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBkaWFsb2dTZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19TRVRUSU5HUyk7Ci0KLQkJCWlmIChzZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJc2V0dGluZ3MgPSBkaWFsb2dTZXR0aW5ncy5hZGROZXdTZWN0aW9uKERJQUxPR19TRVRUSU5HUyk7Ci0JCQl9Ci0JCQlyZXR1cm4gc2V0dGluZ3M7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbXBhcmF0b3I8U3RyaW5nPiBnZXRJdGVtc0NvbXBhcmF0b3IoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIGl0ZW0xLCBTdHJpbmcgaXRlbTIpIHsKLQkJCQkJcmV0dXJuIGl0ZW0xLmNvbXBhcmVUbyhpdGVtMik7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUl0ZW0oT2JqZWN0IGl0ZW0pIHsKLQotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgIiIsIG51bGwpOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlIHRoZSBmaWx0ZXIgcmVzcG9uc2libGUgdG8gcmVtb3ZlIGFueSBjb25uZWN0aW9uIG5hbWUgYmFzZWQgb24KLQkJICogdGhlIHBhdHRlcm4gZW50ZXJlZCBpbiB0aGUgdGV4dCBmaWVsZC4KLQkJICovCi0JCXByaXZhdGUgY2xhc3MgQ29ubmVjdGlvbkl0ZW1zRmlsdGVyIGV4dGVuZHMgSXRlbXNGaWx0ZXIgewotCi0JCQkvKioKLQkJCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29ubmVjdGlvbkl0ZW1zRmlsdGVyPC9jb2RlPi4KLQkJCSAqLwotCQkJQ29ubmVjdGlvbkl0ZW1zRmlsdGVyKCkgewotCi0JCQkJc3VwZXIoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IGlmIHRoZSBwYXR0ZXJuIGlzIGVtcHR5LCB3ZSBzcGVjaWZ5ICogaW4gb3JkZXIKLQkJCQkvLyB0byBzaG93IGFsbCB0aGUgbWFwcGluZyB0eXBlcwotCQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdldFBhdHRlcm4oKSkpIHsKLQkJCQkJcGF0dGVybk1hdGNoZXIuc2V0UGF0dGVybigiKiIpOwotCQkJCX0KLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqLwotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnNpc3RlbnRJdGVtKE9iamVjdCBpdGVtKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKi8KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gbWF0Y2hJdGVtKE9iamVjdCBpdGVtKSB7Ci0JCQkJcmV0dXJuIG1hdGNoZXMoaXRlbS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjRHJpdmVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0RyaXZlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmVhZGZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjRHJpdmVyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEpkYmNEcml2ZXJDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNEcml2ZXJDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEpwYUNvbm5lY3Rpb24yXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KZGJjRHJpdmVyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY0RyaXZlckNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBKcGFDb25uZWN0aW9uMl8wPiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEpwYUNvbm5lY3Rpb24yXzA+IGluaXRpYWxpemVDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxKcGFDb25uZWN0aW9uMl8wPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhQ29ubmVjdGlvbjJfMCwgU3RyaW5nPigKLQkJCQkJCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgSnBhQ29ubmVjdGlvbjJfMC5EUklWRVJfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERyaXZlcigpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQl0aGlzLnN1YmplY3Quc2V0RHJpdmVyKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERyaXZlcigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX2RyaXZlckxhYmVsOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXREcml2ZXIoY2xhc3NOYW1lKTsJCQkJCi0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dUeXBlQ3JlYXRpb24oKSB7Ci0JCQkJLy9Eb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGFsbG93IHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBEcml2ZXIgY2xhc3MKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMTg2MzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjUHJvcGVydGllc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SnBhQ29ubmVjdGlvbjJfMD4KLXsKLQlwdWJsaWMgSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUoUGFuZTxKcGFDb25uZWN0aW9uMl8wPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUsIEJvb2xlYW4+KGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPiBidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+KAotCQkJYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgCi0JCQlQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFksIAotCQkJUGVyc2lzdGVuY2VVbml0LkRFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhQ29ubmVjdGlvbjJfMCwgUGVyc2lzdGVuY2VVbml0PihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGFkZFRpdGxlZEdyb3VwKAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDEwKSwKLQkJCUpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5KZGJjUHJvcGVydGllc0NvbXBvc2l0ZV9KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNfR3JvdXBCb3gKLQkJKTsKLQotCQluZXcgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJdGhpcy5pbnN0YWxsUGFuZUVuYWJsZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKCkgewotCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpLCB0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL1RyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL1RyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWVmYWE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9UcmFuc2FjdGlvblR5cGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxKcGFDb25uZWN0aW9uMl8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgSnBhQ29ubmVjdGlvbjJfMD4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoIHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IGJ1aWxkVHJhbnNhY3Rpb25UeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4odGhpcywgCi0JCQkJCQkJCQkJCXRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgCi0JCQkJCQkJCQkJCWNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbmNlVW5pdC5ERUZBVUxUX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGREaXNwbGF5U3RyaW5nKEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5jbGFzcywgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlLnRoaXMsIHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUodmFsdWUpOwotCi0JCQkJaWYgKHZhbHVlID09IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTCkgewotCQkJCQljbGVhckpUQVByb3BlcnRpZXMoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNsZWFyUmVzb3VyY2VMb2NhbFByb3BlcnRpZXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhQ29ubmVjdGlvbjJfMCwgUGVyc2lzdGVuY2VVbml0Pih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFySlRBUHJvcGVydGllcygpIHsKLQkJdGhpcy5nZXRTdWJqZWN0KCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0SnRhRGF0YVNvdXJjZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJSZXNvdXJjZUxvY2FsUHJvcGVydGllcygpIHsKLQkJSnBhQ29ubmVjdGlvbjJfMCBjb25uZWN0aW9uID0gdGhpcy5nZXRTdWJqZWN0KCk7Ci0JCWNvbm5lY3Rpb24uZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0Tm9uSnRhRGF0YVNvdXJjZShudWxsKTsKLQkJY29ubmVjdGlvbi5zZXREcml2ZXIobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0VXJsKG51bGwpOwotCQljb25uZWN0aW9uLnNldFVzZXIobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0UGFzc3dvcmQobnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dCggQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5UcmFuc2FjdGlvblR5cGVDb21wb3NpdGVfdHJhbnNhY3Rpb25UeXBlTGFiZWwsCi0JCQl0aGlzLmJ1aWxkVHJhbnNhY3Rpb25UeXBlQ29tYm8oIGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgkvLyBUT0RPIC0gUmV2aWV3IGZvciBKUEEgMi4wCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzY2YxMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuSnBhT3B0aW9uczJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEpwYU9wdGlvbnMyXzA+Ci17Ci0JcHVibGljIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zQ29tcG9zaXRlKAotCQkJCQlQYW5lPEpwYU9wdGlvbnMyXzA+IHN1YmplY3RIb2xkZXIsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmluaXRpYWxpemVNaXNjZWxsYW5lb3VzUGFuZShwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplTWlzY2VsbGFuZW91c1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewkKLQkJCi0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb250YWluZXIuZ2V0UGFyZW50KCkpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRoaXMuYWRkU2VjdGlvbihjb250YWluZXIsIAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLkdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zQ29tcG9zaXRlX21pc2NlbGxhbmVvdXNTZWN0aW9uVGl0bGUsCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNDb21wb3NpdGVfbWlzY2VsbGFuZW91c1NlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCQotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZSk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29tcG9zaXRlLmdldFBhcmVudCgpKTsKLQotCQluZXcgTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJbmV3IFF1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQluZXcgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmMjRhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkpwYU9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zVGFiCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYiBleHRlbmRzIFBhbmU8SnBhT3B0aW9uczJfMD4KLQlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYigKLQkJCQkJCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEpwYU9wdGlvbnMyXzA+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW5ldyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc0NvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCi0JfQotCi0JLy8gKioqKioqKioqKiBMYXlvdXQgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTU7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0aGlzLmFkZFBhbmUocGFyZW50LCBsYXlvdXQpOwotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIG51bGw7CQkJCQkJLy8gVE9ETyAtIFJldmlldyBmb3IgSlBBIDIuMAotCX0KLQkKLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNUYWJfdGl0bGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL0xvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzOTkyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5KcGFPcHRpb25zMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5JbnRlZ2VyQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIExvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxKcGFPcHRpb25zMl8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIEpwYU9wdGlvbnMyXzA+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5hZGRMb2NrVGltZW91dENvbWJvKHBhcmVudCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRMb2NrVGltZW91dENvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbmV3IEludGVnZXJDb21ibzxKcGFPcHRpb25zMl8wPih0aGlzLCBwYXJlbnQpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLkxvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlX2xvY2tUaW1lb3V0TGFiZWw7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJCQlyZXR1cm4gbnVsbDsJCS8vIFRPRE8KLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKcGFPcHRpb25zMl8wLCBJbnRlZ2VyPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRMb2NrVGltZW91dCgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhT3B0aW9uczJfMCwgSW50ZWdlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIEpwYU9wdGlvbnMyXzAuTE9DS19USU1FT1VUX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TG9ja1RpbWVvdXQoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCQkJdGhpcy5zdWJqZWN0LnNldExvY2tUaW1lb3V0KHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9RdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9RdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMzOThjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkpwYU9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBRdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFF1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SnBhT3B0aW9uczJfMD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlF1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBRdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIEpwYU9wdGlvbnMyXzA+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5hZGRRdWVyeVRpbWVvdXRDb21ibyhwYXJlbnQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkUXVlcnlUaW1lb3V0Q29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQluZXcgSW50ZWdlckNvbWJvPEpwYU9wdGlvbnMyXzA+KHRoaXMsIHBhcmVudCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlX3F1ZXJ5VGltZW91dExhYmVsOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIG51bGw7CQkvLyBUT0RPCi0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhT3B0aW9uczJfMCwgSW50ZWdlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0UXVlcnlUaW1lb3V0KCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKcGFPcHRpb25zMl8wLCBJbnRlZ2VyPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgSnBhT3B0aW9uczJfMC5RVUVSWV9USU1FT1VUX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UXVlcnlUaW1lb3V0KCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRRdWVyeVRpbWVvdXQodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL1NoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL1NoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTIwYTBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9TaGFyZWRDYWNoZU1vZGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlNoYXJlZENhY2hlTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxQZXJzaXN0ZW5jZVVuaXQyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TaGFyZWRDYWNoZU1vZGVDb21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdDJfMD4gc3ViamVjdEhvbGRlciwKLQkJCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0Jc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCXBhcmVudCwKLQkJCUpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5TaGFyZWRDYWNoZU1vZGVDb21wb3NpdGVfc2hhcmVkQ2FjaGVNb2RlTGFiZWwsCi0JCQl0aGlzLmFkZFNoYXJlZENhY2hlTW9kZUNvbWJvKHBhcmVudCksCi0JCQludWxsCQkJLy8gVE9ETwotCQkpOwotCX0KLQkKLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0Ml8wLCBTaGFyZWRDYWNoZU1vZGU+IGFkZFNoYXJlZENhY2hlTW9kZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXQyXzAsIFNoYXJlZENhY2hlTW9kZT4odGhpcywgdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIHBhcmVudCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW5jZVVuaXQyXzAuU1BFQ0lGSUVEX1NIQVJFRF9DQUNIRV9NT0RFX1BST1BFUlRZKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2hhcmVkQ2FjaGVNb2RlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gU2hhcmVkQ2FjaGVNb2RlLnZhbHVlcygpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2hhcmVkQ2FjaGVNb2RlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFNoYXJlZENhY2hlTW9kZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhTaGFyZWRDYWNoZU1vZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLmNsYXNzLCBTaGFyZWRDYWNoZU1vZGVDb21wb3NpdGUudGhpcywgdmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTaGFyZWRDYWNoZU1vZGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFNoYXJlZENhY2hlTW9kZSB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiYjM0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkpwYU9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotCi0vKioKLSAqICBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUgZXh0ZW5kcyBQYW5lPEpwYU9wdGlvbnMyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WYWxpZGF0aW9uR3JvdXBDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIEpwYU9wdGlvbnMyXzA+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBTaGFyZWRDYWNoZU1vZGUKLQkJbmV3IFNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0Ml8wSG9sZGVyKCksIHBhcmVudCk7Ci0KLQkJLy8gVmFsaWRhdGlvbk1vZGUKLQkJbmV3IFZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXQyXzBIb2xkZXIoKSwgcGFyZW50KTsKLQotCQkvLyBWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0Ci0JCXRoaXMuYWRkR3JvdXBQcmVQZXJzaXN0TGlzdFBhbmUocGFyZW50KTsKLQotCQkvLyBWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUKLQkJdGhpcy5hZGRHcm91cFByZVVwZGF0ZUxpc3RQYW5lKHBhcmVudCk7Ci0KLQkJLy8gVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlCi0JCXRoaXMuYWRkR3JvdXBQcmVSZW1vdmVMaXN0UGFuZShwYXJlbnQpOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMgKioqKioqKioqKgotCQotCXByaXZhdGUgdm9pZCBhZGRHcm91cFByZVBlcnNpc3RMaXN0UGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKHBhcmVudCwgCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGVfZ3JvdXBQcmVQZXJzaXN0TGFiZWwsCi0JCQl0aGlzLmFkZFByZVBlcnNpc3RMaXN0UGFuZShwYXJlbnQpLAotCQkJbnVsbAkvLyBUT0RPIEhlbHAKLQkJCSk7Ci0JfQotCQotCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8SnBhT3B0aW9uczJfMD4gYWRkUHJlUGVyc2lzdExpc3RQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBMaXN0IHBhbmUKLQkJQWRkUmVtb3ZlTGlzdFBhbmU8SnBhT3B0aW9uczJfMD4gbGlzdFBhbmUgPSBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8SnBhT3B0aW9uczJfMD4oCi0JCQl0aGlzLAotCQkJcGFyZW50LAotCQkJdGhpcy5idWlsZFByZVBlcnNpc3RBZGFwdGVyKCksCi0JCQl0aGlzLmJ1aWxkUHJlUGVyc2lzdExpc3RIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUYWJsZShUYWJsZSB0YWJsZSkgewotCQkJCXN1cGVyLmluaXRpYWxpemVUYWJsZSh0YWJsZSk7Ci0KLQkJCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGFibGUuZ2V0UGFyZW50KCk7Ci0JCQkJR3JpZERhdGEgZ3JpZERhdGEgID0gKEdyaWREYXRhKSBjb250YWluZXIuZ2V0TGF5b3V0RGF0YSgpOwotCQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA3NTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxpc3RQYW5lOwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZFByZVBlcnNpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWFkZFByZVBlcnNpc3RDbGFzcyhsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoKFN0cmluZykgaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFByZVBlcnNpc3RMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEpwYU9wdGlvbnMyXzAsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByZVBlcnNpc3RDbGFzcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJSVR5cGUgdHlwZSA9IHRoaXMuY2hvb3NlVHlwZSgpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnJCcpOwotCQkJaWYoICEgdGhpcy5nZXRTdWJqZWN0KCkudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdEV4aXN0cyhjbGFzc05hbWUpKSB7Ci0JCQkJCi0JCQkJU3RyaW5nIGNsYXNzUmVmID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdChjbGFzc05hbWUpOwotCQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGNsYXNzUmVmKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZEdyb3VwUHJlVXBkYXRlTGlzdFBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZShwYXJlbnQsIAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLlZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlVXBkYXRlTGFiZWwsCi0JCQl0aGlzLmFkZFByZVVwZGF0ZUxpc3RQYW5lKHBhcmVudCksCi0JCQludWxsCS8vIFRPRE8gSGVscAotCQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxKcGFPcHRpb25zMl8wPiBhZGRQcmVVcGRhdGVMaXN0UGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCUFkZFJlbW92ZUxpc3RQYW5lPEpwYU9wdGlvbnMyXzA+IGxpc3RQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEpwYU9wdGlvbnMyXzA+KAotCQkJdGhpcywKLQkJCXBhcmVudCwKLQkJCXRoaXMuYnVpbGRQcmVVcGRhdGVBZGFwdGVyKCksCi0JCQl0aGlzLmJ1aWxkUHJlVXBkYXRlTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJdGhpcy5idWlsZExhYmVsUHJvdmlkZXIoKQotCQkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlKFRhYmxlIHRhYmxlKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZVRhYmxlKHRhYmxlKTsKLQotCQkJCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0YWJsZS5nZXRQYXJlbnQoKTsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSAgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDc1OwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGlzdFBhbmU7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUHJlVXBkYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRQcmVVcGRhdGVDbGFzcyhsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSgoU3RyaW5nKSBpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJlVXBkYXRlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxKcGFPcHRpb25zMl8wLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQcmVVcGRhdGVDbGFzcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJSVR5cGUgdHlwZSA9IHRoaXMuY2hvb3NlVHlwZSgpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnJCcpOwotCQkJaWYoICEgdGhpcy5nZXRTdWJqZWN0KCkudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlRXhpc3RzKGNsYXNzTmFtZSkpIHsKLQkJCQkKLQkJCQlTdHJpbmcgY2xhc3NSZWYgPSB0aGlzLmdldFN1YmplY3QoKS5hZGRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoY2xhc3NOYW1lKTsKLQkJCQlsaXN0U2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShjbGFzc1JlZik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMgKioqKioqKioqKgotCQotCXByaXZhdGUgdm9pZCBhZGRHcm91cFByZVJlbW92ZUxpc3RQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUocGFyZW50LCAKLQkJCUpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9ncm91cFByZVJlbW92ZUxhYmVsLAotCQkJdGhpcy5hZGRQcmVSZW1vdmVMaXN0UGFuZShwYXJlbnQpLAotCQkJbnVsbAkvLyBUT0RPIEhlbHAKLQkJCSk7Ci0JfQotCQotCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8SnBhT3B0aW9uczJfMD4gYWRkUHJlUmVtb3ZlTGlzdFBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCS8vIExpc3QgcGFuZQotCQlBZGRSZW1vdmVMaXN0UGFuZTxKcGFPcHRpb25zMl8wPiBsaXN0UGFuZSA9IG5ldyBBZGRSZW1vdmVMaXN0UGFuZTxKcGFPcHRpb25zMl8wPigKLQkJCXRoaXMsCi0JCQlwYXJlbnQsCi0JCQl0aGlzLmJ1aWxkUHJlUmVtb3ZlQWRhcHRlcigpLAotCQkJdGhpcy5idWlsZFByZVJlbW92ZUxpc3RIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUYWJsZShUYWJsZSB0YWJsZSkgewotCQkJCXN1cGVyLmluaXRpYWxpemVUYWJsZSh0YWJsZSk7Ci0KLQkJCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGFibGUuZ2V0UGFyZW50KCk7Ci0JCQkJR3JpZERhdGEgZ3JpZERhdGEgID0gKEdyaWREYXRhKSBjb250YWluZXIuZ2V0TGF5b3V0RGF0YSgpOwotCQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA3NTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxpc3RQYW5lOwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZFByZVJlbW92ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkUHJlUmVtb3ZlQ2xhc3MobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCWdldFN1YmplY3QoKS5yZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoKFN0cmluZykgaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFByZVJlbW92ZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8SnBhT3B0aW9uczJfMCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUHJlUmVtb3ZlQ2xhc3MoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCUlUeXBlIHR5cGUgPSB0aGlzLmNob29zZVR5cGUoKTsKLQotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJyQnKTsKLQkJCWlmKCAhIHRoaXMuZ2V0U3ViamVjdCgpLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUV4aXN0cyhjbGFzc05hbWUpKSB7Ci0JCQkJCi0JCQkJU3RyaW5nIGNsYXNzUmVmID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKGNsYXNzTmFtZSk7Ci0JCQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoY2xhc3NSZWYpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0Ml8wPiBidWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhT3B0aW9uczJfMCwgUGVyc2lzdGVuY2VVbml0Ml8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0Ml8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoUGVyc2lzdGVuY2VVbml0Ml8wKSB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVsZW1lbnQ7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNUYWJfbm9OYW1lOwotCQkJCX0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHRoZSB1c2VyIHRoZSBPcGVuIFR5cGUgZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgdGhlIHNlbGVjdGVkIHR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHVzZXIKLQkgKiBjYW5jZWxlZCB0aGUgZGlhbG9nCi0JICovCi0JcHJpdmF0ZSBJVHlwZSBjaG9vc2VUeXBlKCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSB0aGlzLmdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W10geyBqYXZhUHJvamVjdCB9OwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShlbGVtZW50cyk7Ci0JCUlQcm9ncmVzc1NlcnZpY2Ugc2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCVNlbGVjdGlvbkRpYWxvZyB0eXBlU2VsZWN0aW9uRGlhbG9nOwotCi0JCXRyeSB7Ci0JCQl0eXBlU2VsZWN0aW9uRGlhbG9nID0gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coCi0JCQkJZ2V0U2hlbGwoKSwKLQkJCQlzZXJ2aWNlLAotCQkJCXNjb3BlLAotCQkJCUlKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9DTEFTU0VTLAotCQkJCWZhbHNlLAotCQkJCSIiCi0JCQkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKEpwdFVpTWVzc2FnZXMuQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZSk7Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShKcHRVaU1lc3NhZ2VzLkNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZSk7Ci0KLQkJaWYgKHR5cGVTZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIChJVHlwZSkgdHlwZVNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjhlNzkyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlZhbGlkYXRpb25Nb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxQZXJzaXN0ZW5jZVVuaXQyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUoCi0JCQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXQyXzA+IHN1YmplY3RIb2xkZXIsCi0JCQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQlwYXJlbnQsCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfdmFsaWRhdGlvbk1vZGVMYWJlbCwKLQkJCXRoaXMuYWRkVmFsaWRhdGlvbk1vZGVDb21ibyhwYXJlbnQpLAotCQkJbnVsbAkJCS8vIFRPRE8KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPFBlcnNpc3RlbmNlVW5pdDJfMCwgVmFsaWRhdGlvbk1vZGU+IGFkZFZhbGlkYXRpb25Nb2RlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPFBlcnNpc3RlbmNlVW5pdDJfMCwgVmFsaWRhdGlvbk1vZGU+KHRoaXMsIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBwYXJlbnQpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVuY2VVbml0Ml8wLlNQRUNJRklFRF9WQUxJREFUSU9OX01PREVfUFJPUEVSVFkpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBWYWxpZGF0aW9uTW9kZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIFZhbGlkYXRpb25Nb2RlLnZhbHVlcygpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVmFsaWRhdGlvbk1vZGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0VmFsaWRhdGlvbk1vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoVmFsaWRhdGlvbk1vZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLmNsYXNzLCBWYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZS50aGlzLCB2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFZhbGlkYXRpb25Nb2RlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFZhbGlkYXRpb25Nb2RlIHZhbHVlKSB7Ci0JCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUyNWNlMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpYzJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5HZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWNKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWNOYXZpZ2F0b3JQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWMyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeSBpbXBsZW1lbnRzIEpwYVBsYXRmb3JtVWlGYWN0b3J5Ci17Ci0KLQkvKioKLQkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIEdlbmVyaWMyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm1VaSBidWlsZEpwYVBsYXRmb3JtVWkoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYVBsYXRmb3JtVWkoCi0JCQluZXcgR2VuZXJpY05hdmlnYXRvclByb3ZpZGVyKCksCi0JCQlHZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmluc3RhbmNlKCkKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saWJwcm92L1RlbXBXdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlicHJvdi9UZW1wV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3ZjRiYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saWJwcm92L1RlbXBXdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpYnByb3Y7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubGlicHJvdi5UZW1wV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubGlicHJvdi5UZW1wV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmxpYnByb3Yub3NnaS5Pc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0KLXB1YmxpYyBjbGFzcyBUZW1wV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwgCi0JCWV4dGVuZHMgT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwKLSAgICAKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVGb290ZXIoIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgKQotICAgIHsKLSAgICAgICAgZmluYWwgVGVtcFd0cE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBjZmcKLSAgICAgICAgICAgID0gKFRlbXBXdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIGdldE9wZXJhdGlvbkNvbmZpZygpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgQnV0dG9uIGNvcHlPblB1Ymxpc2hDaGVja0JveCA9IG5ldyBCdXR0b24oIGNvbXBvc2l0ZSwgU1dULkNIRUNLICk7Ci0gICAgICAgIGNvcHlPblB1Ymxpc2hDaGVja0JveC5zZXRUZXh0KCBSZXNvdXJjZXMuY29weUxpYnJhcmllcyApOwotICAgICAgICBjb3B5T25QdWJsaXNoQ2hlY2tCb3guc2V0U2VsZWN0aW9uKCBjZmcuaXNJbmNsdWRlV2l0aEFwcGxpY2F0aW9uRW5hYmxlZCgpICk7Ci0gICAgICAgIGNvcHlPblB1Ymxpc2hDaGVja0JveC5zZXRFbmFibGVkKCBjZmcuaXNJbmNsdWRlV2l0aEFwcGxpY2F0aW9uU2V0dGluZ0VuYWJsZWQoKSApOwotICAgICAgICAKLSAgICAgICAgY29weU9uUHVibGlzaENoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggZmluYWwgU2VsZWN0aW9uRXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2ZnLnNldEluY2x1ZGVXaXRoQXBwbGljYXRpb25FbmFibGVkKCBjb3B5T25QdWJsaXNoQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZCggZmluYWwgU3RyaW5nIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2xkVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBuZXdWYWx1ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIFBST1BfSU5DTFVERV9XSVRIX0FQUExJQ0FUSU9OX0VOQUJMRUQuZXF1YWxzKCBwcm9wZXJ0eSApKSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvcHlPblB1Ymxpc2hDaGVja0JveC5zZXRTZWxlY3Rpb24oIGNmZy5pc0luY2x1ZGVXaXRoQXBwbGljYXRpb25FbmFibGVkKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggUFJPUF9JTkNMVURFX1dJVEhfQVBQTElDQVRJT05fU0VUVElOR19FTkFCTEVELmVxdWFscyggcHJvcGVydHkgKSApIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29weU9uUHVibGlzaENoZWNrQm94LnNldEVuYWJsZWQoIGNmZy5pc0luY2x1ZGVXaXRoQXBwbGljYXRpb25TZXR0aW5nRW5hYmxlZCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgY2ZnLmFkZExpc3RlbmVyKCBsaXN0ZW5lciwgUFJPUF9JTkNMVURFX1dJVEhfQVBQTElDQVRJT05fRU5BQkxFRCwgUFJPUF9JTkNMVURFX1dJVEhfQVBQTElDQVRJT05fU0VUVElOR19FTkFCTEVEICk7Ci0gICAgICAgIAotICAgICAgICBjb3B5T25QdWJsaXNoQ2hlY2tCb3guYWRkRGlzcG9zZUxpc3RlbmVyCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBEaXNwb3NlTGlzdGVuZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKCBmaW5hbCBEaXNwb3NlRXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2ZnLnJlbW92ZUxpc3RlbmVyKCBsaXN0ZW5lciApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjb3B5T25QdWJsaXNoQ2hlY2tCb3g7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUxpYnJhcmllczsKLQotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBUZW1wV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saWJwcm92L1RlbXBXdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlicHJvdi9UZW1wV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiOGZlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saWJwcm92L1RlbXBXdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAKLSMgIENvbnRyaWJ1dG9yczogCi0jICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1jb3B5TGlicmFyaWVzID0gJkluY2x1ZGUgbGlicmFyaWVzIHdpdGggdGhpcyBhcHBsaWNhdGlvbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlicHJvdi9UZW1wV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlicHJvdi9UZW1wV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTJhYTM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpYnByb3YvVGVtcFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saWJwcm92OwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmxpYnByb3YuVGVtcFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubGlicHJvdi5UZW1wV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkubGlicHJvdi51c2VyLlVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb25zdGFudGluLmtvbWlzc2FyY2hpa0BvcmFjbGUuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgVGVtcFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwKLQotICAgIGV4dGVuZHMgVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbAotICAgIAotewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2xOZXh0VG9NYW5hZ2VIeXBlcmxpbmsoIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgKQotICAgIHsKLSAgICAgICAgZmluYWwgVGVtcFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGNmZwotICAgICAgICAgICAgPSAoVGVtcFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSBnZXRPcGVyYXRpb25Db25maWcoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIEJ1dHRvbiBjb3B5T25QdWJsaXNoQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKCBjb21wb3NpdGUsIFNXVC5DSEVDSyApOwotICAgICAgICBjb3B5T25QdWJsaXNoQ2hlY2tCb3guc2V0VGV4dCggUmVzb3VyY2VzLmNvcHlMaWJyYXJpZXMgKTsKLSAgICAgICAgY29weU9uUHVibGlzaENoZWNrQm94LnNldFNlbGVjdGlvbiggY2ZnLmlzSW5jbHVkZVdpdGhBcHBsaWNhdGlvbkVuYWJsZWQoKSApOwotICAgICAgICBjb3B5T25QdWJsaXNoQ2hlY2tCb3guc2V0RW5hYmxlZCggY2ZnLmlzSW5jbHVkZVdpdGhBcHBsaWNhdGlvblNldHRpbmdFbmFibGVkKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGNvcHlPblB1Ymxpc2hDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcgotICAgICAgICAoCi0gICAgICAgICAgICBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIGZpbmFsIFNlbGVjdGlvbkV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNmZy5zZXRJbmNsdWRlV2l0aEFwcGxpY2F0aW9uRW5hYmxlZCggY29weU9uUHVibGlzaENoZWNrQm94LmdldFNlbGVjdGlvbigpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoIGZpbmFsIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9sZFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgbmV3VmFsdWUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBQUk9QX0lOQ0xVREVfV0lUSF9BUFBMSUNBVElPTl9FTkFCTEVELmVxdWFscyggcHJvcGVydHkgKSkgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb3B5T25QdWJsaXNoQ2hlY2tCb3guc2V0U2VsZWN0aW9uKCBjZmcuaXNJbmNsdWRlV2l0aEFwcGxpY2F0aW9uRW5hYmxlZCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIFBST1BfSU5DTFVERV9XSVRIX0FQUExJQ0FUSU9OX1NFVFRJTkdfRU5BQkxFRC5lcXVhbHMoIHByb3BlcnR5ICkgKSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvcHlPblB1Ymxpc2hDaGVja0JveC5zZXRFbmFibGVkKCBjZmcuaXNJbmNsdWRlV2l0aEFwcGxpY2F0aW9uU2V0dGluZ0VuYWJsZWQoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIGNmZy5hZGRMaXN0ZW5lciggbGlzdGVuZXIsIFBST1BfSU5DTFVERV9XSVRIX0FQUExJQ0FUSU9OX0VOQUJMRUQsIFBST1BfSU5DTFVERV9XSVRIX0FQUExJQ0FUSU9OX1NFVFRJTkdfRU5BQkxFRCApOwotICAgICAgICAKLSAgICAgICAgY29weU9uUHVibGlzaENoZWNrQm94LmFkZERpc3Bvc2VMaXN0ZW5lcgotICAgICAgICAoCi0gICAgICAgICAgICBuZXcgRGlzcG9zZUxpc3RlbmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZCggZmluYWwgRGlzcG9zZUV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNmZy5yZW1vdmVMaXN0ZW5lciggbGlzdGVuZXIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY29weU9uUHVibGlzaENoZWNrQm94OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlMaWJyYXJpZXM7Ci0KLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggVGVtcFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saWJwcm92L1RlbXBXdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbFBhbmVsLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saWJwcm92L1RlbXBXdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbFBhbmVsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYjhmZWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlicHJvdi9UZW1wV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAKLSMgIENvbnRyaWJ1dG9yczogCi0jICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1jb3B5TGlicmFyaWVzID0gJkluY2x1ZGUgbGlicmFyaWVzIHdpdGggdGhpcyBhcHBsaWNhdGlvbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OGM5ZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBTV1QKLSAqIFVJIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgaWYgbmVjZXNzYXJ5LiBJZiB0aGUgZXZlbnQgYXJyaXZlZCBvbiB0aGUgVUkKLSAqIHRocmVhZCB0aGF0IGlzIHByb2JhYmx5IGJlY2F1c2UgaXQgd2FzIGluaXRpYXRlZCBieSBhIFVJIHdpZGdldDsgYXMgYQotICogcmVzdWx0LCB3ZSB3YW50IHRvIGxvb3AgYmFjayBzeW5jaHJvbm91c2x5IHNvIHRoZSBldmVudHMgY2FuIGJlCi0gKiBzaG9ydC1jaXJjdWl0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkQ29sbGVjdGlvbkNsZWFyZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNBZGRlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyBhZGRlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgcmVtb3ZlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQ29sbGVjdGlvbkNsZWFyZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjbGVhcmVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSB7Ci0JCXJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBEaXNwbGF5I2FzeW5jRXhlYyhSdW5uYWJsZSl9IHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nIHtAbGluayBEaXNwbGF5I3N5bmNFeGVjKFJ1bm5hYmxlKX0gY2FuIHNvbXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25VSVRocmVhZChSdW5uYWJsZSByKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhyKTsKLS8vCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhyKTsKLQl9Ci0KLQl2b2lkIGl0ZW1zQWRkZWRfKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZW1vdmVkXyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgY29sbGVjdGlvbkNsZWFyZWRfKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgY29sbGVjdGlvbkNoYW5nZWRfKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAyMjM1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBjb25uZWN0aW9uIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgU1dUCi0gKiBVSSB0aHJlYWQsIGFzeW5jaHJvbm91c2x5IGlmIG5lY2Vzc2FyeS4gSWYgdGhlIGV2ZW50IGFycml2ZWQgb24gdGhlIFVJCi0gKiB0aHJlYWQgdGhhdCBpcyBwcm9iYWJseSBiZWNhdXNlIGl0IHdhcyBpbml0aWF0ZWQgYnkgYSBVSSB3aWRnZXQ7IGFzIGEKLSAqIHJlc3VsdCwgd2Ugd2FudCB0byBsb29wIGJhY2sgc3luY2hyb25vdXNseSBzbyB0aGUgZXZlbnRzIGNhbiBiZQotICogc2hvcnQtY2lyY3VpdGVkLgotICovCi1wdWJsaWMgY2xhc3MgU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgQ29ubmVjdGlvbkxpc3RlbmVyCi17Ci0KLQlwcml2YXRlIGZpbmFsIENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBTV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLm9wZW5lZF8ocHJvZmlsZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRPcGVuZWRSdW5uYWJsZShwcm9maWxlKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLm1vZGlmaWVkXyhwcm9maWxlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZE1vZGlmaWVkUnVubmFibGUocHJvZmlsZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXJldHVybiB0aGlzLm9rVG9DbG9zZV8ocHJvZmlsZSk7Ci0JCX0KLQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkT2tUb0Nsb3NlUnVubmFibGUocHJvZmlsZSkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5hYm91dFRvQ2xvc2VfKHByb2ZpbGUpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkQWJvdXRUb0Nsb3NlUnVubmFibGUocHJvZmlsZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuY2xvc2VkXyhwcm9maWxlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZENsb3NlZFJ1bm5hYmxlKHByb2ZpbGUpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5kYXRhYmFzZUNoYW5nZWRfKHByb2ZpbGUsIGRhdGFiYXNlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZERhdGFiYXNlQ2hhbmdlZFJ1bm5hYmxlKHByb2ZpbGUsIGRhdGFiYXNlKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjYXRhbG9nQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDYXRhbG9nIGNhdGFsb2cpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuY2F0YWxvZ0NoYW5nZWRfKHByb2ZpbGUsIGNhdGFsb2cpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkQ2F0YWxvZ0NoYW5nZWRSdW5uYWJsZShwcm9maWxlLCBjYXRhbG9nKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNjaGVtYSBzY2hlbWEpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuc2NoZW1hQ2hhbmdlZF8ocHJvZmlsZSwgc2NoZW1hKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFNjaGVtYUNoYW5nZWRSdW5uYWJsZShwcm9maWxlLCBzY2hlbWEpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNlcXVlbmNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTZXF1ZW5jZSBzZXF1ZW5jZSkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5zZXF1ZW5jZUNoYW5nZWRfKHByb2ZpbGUsIHNlcXVlbmNlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFNlcXVlbmNlQ2hhbmdlZFJ1bm5hYmxlKHByb2ZpbGUsIHNlcXVlbmNlKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgVGFibGUgdGFibGUpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMudGFibGVDaGFuZ2VkXyhwcm9maWxlLCB0YWJsZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRUYWJsZUNoYW5nZWRSdW5uYWJsZShwcm9maWxlLCB0YWJsZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29sdW1uQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDb2x1bW4gY29sdW1uKSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLmNvbHVtbkNoYW5nZWRfKHByb2ZpbGUsIGNvbHVtbik7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRDb2x1bW5DaGFuZ2VkUnVubmFibGUocHJvZmlsZSwgY29sdW1uKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JlaWduS2V5Q2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuZm9yZWlnbktleUNoYW5nZWRfKHByb2ZpbGUsIGZvcmVpZ25LZXkpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkRm9yZWlnbktleUNoYW5nZWRSdW5uYWJsZShwcm9maWxlLCBmb3JlaWduS2V5KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkT3BlbmVkUnVubmFibGUoZmluYWwgQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIudGhpcy5vcGVuZWRfKHByb2ZpbGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAib3BlbmVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRNb2RpZmllZFJ1bm5hYmxlKGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyLnRoaXMubW9kaWZpZWRfKHByb2ZpbGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibW9kaWZpZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE9rVG9DbG9zZVJ1bm5hYmxlKGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyLnRoaXMub2tUb0Nsb3NlXyhwcm9maWxlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIk9LIHRvIGNsb3NlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRBYm91dFRvQ2xvc2VSdW5uYWJsZShmaW5hbCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci50aGlzLmFib3V0VG9DbG9zZV8ocHJvZmlsZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJhYm91dCB0byBjbG9zZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQ2xvc2VkUnVubmFibGUoZmluYWwgQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIudGhpcy5jbG9zZWRfKHByb2ZpbGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY2xvc2VkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGREYXRhYmFzZUNoYW5nZWRSdW5uYWJsZShmaW5hbCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBmaW5hbCBEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIudGhpcy5kYXRhYmFzZUNoYW5nZWRfKHByb2ZpbGUsIGRhdGFiYXNlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImRhdGFiYXNlIGNoYW5nZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENhdGFsb2dDaGFuZ2VkUnVubmFibGUoZmluYWwgQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgZmluYWwgQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci50aGlzLmNhdGFsb2dDaGFuZ2VkXyhwcm9maWxlLCBjYXRhbG9nKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNhdGFsb2cgY2hhbmdlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkU2NoZW1hQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIGZpbmFsIFNjaGVtYSBzY2hlbWEpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyLnRoaXMuc2NoZW1hQ2hhbmdlZF8ocHJvZmlsZSwgc2NoZW1hKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInNjaGVtYSBjaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRTZXF1ZW5jZUNoYW5nZWRSdW5uYWJsZShmaW5hbCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBmaW5hbCBTZXF1ZW5jZSBzZXF1ZW5jZSkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIudGhpcy5zZXF1ZW5jZUNoYW5nZWRfKHByb2ZpbGUsIHNlcXVlbmNlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInNlcXVlbmNlIGNoYW5nZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRhYmxlQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIGZpbmFsIFRhYmxlIHRhYmxlKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci50aGlzLnRhYmxlQ2hhbmdlZF8ocHJvZmlsZSwgdGFibGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidGFibGUgY2hhbmdlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQ29sdW1uQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIGZpbmFsIENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyLnRoaXMuY29sdW1uQ2hhbmdlZF8ocHJvZmlsZSwgY29sdW1uKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbHVtbiBjaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRGb3JlaWduS2V5Q2hhbmdlZFJ1bm5hYmxlKGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIGZpbmFsIEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIudGhpcy5mb3JlaWduS2V5Q2hhbmdlZF8ocHJvZmlsZSwgZm9yZWlnbktleSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJmb3JlaWduIGtleSBjaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSB7Ci0JCXJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBEaXNwbGF5I2FzeW5jRXhlYyhSdW5uYWJsZSl9IHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nIHtAbGluayBEaXNwbGF5I3N5bmNFeGVjKFJ1bm5hYmxlKX0gY2FuIHNvbXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25VSVRocmVhZChSdW5uYWJsZSByKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhyKTsKLS8vCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhyKTsKLQl9Ci0KLQl2b2lkIG9wZW5lZF8oQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQl0aGlzLmxpc3RlbmVyLm9wZW5lZChwcm9maWxlKTsKLQl9Ci0KLQl2b2lkIG1vZGlmaWVkXyhDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCXRoaXMubGlzdGVuZXIubW9kaWZpZWQocHJvZmlsZSk7Ci0JfQotCi0JYm9vbGVhbiBva1RvQ2xvc2VfKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJcmV0dXJuIHRoaXMubGlzdGVuZXIub2tUb0Nsb3NlKHByb2ZpbGUpOwotCX0KLQotCXZvaWQgYWJvdXRUb0Nsb3NlXyhDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCXRoaXMubGlzdGVuZXIuYWJvdXRUb0Nsb3NlKHByb2ZpbGUpOwotCX0KLQotCXZvaWQgY2xvc2VkXyhDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCXRoaXMubGlzdGVuZXIuY2xvc2VkKHByb2ZpbGUpOwotCX0KLQotCXZvaWQgZGF0YWJhc2VDaGFuZ2VkXyhDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBEYXRhYmFzZSBkYXRhYmFzZSkgewotCQl0aGlzLmxpc3RlbmVyLmRhdGFiYXNlQ2hhbmdlZChwcm9maWxlLCBkYXRhYmFzZSk7Ci0JfQotCi0Jdm9pZCBjYXRhbG9nQ2hhbmdlZF8oQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCXRoaXMubGlzdGVuZXIuY2F0YWxvZ0NoYW5nZWQocHJvZmlsZSwgY2F0YWxvZyk7Ci0JfQotCi0Jdm9pZCBzY2hlbWFDaGFuZ2VkXyhDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTY2hlbWEgc2NoZW1hKSB7Ci0JCXRoaXMubGlzdGVuZXIuc2NoZW1hQ2hhbmdlZChwcm9maWxlLCBzY2hlbWEpOwotCX0KLQotCXZvaWQgc2VxdWVuY2VDaGFuZ2VkXyhDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTZXF1ZW5jZSBzZXF1ZW5jZSkgewotCQl0aGlzLmxpc3RlbmVyLnNlcXVlbmNlQ2hhbmdlZChwcm9maWxlLCBzZXF1ZW5jZSk7Ci0JfQotCi0Jdm9pZCB0YWJsZUNoYW5nZWRfKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFRhYmxlIHRhYmxlKSB7Ci0JCXRoaXMubGlzdGVuZXIudGFibGVDaGFuZ2VkKHByb2ZpbGUsIHRhYmxlKTsKLQl9Ci0KLQl2b2lkIGNvbHVtbkNoYW5nZWRfKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENvbHVtbiBjb2x1bW4pIHsKLQkJdGhpcy5saXN0ZW5lci5jb2x1bW5DaGFuZ2VkKHByb2ZpbGUsIGNvbHVtbik7Ci0JfQotCi0Jdm9pZCBmb3JlaWduS2V5Q2hhbmdlZF8oQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCXRoaXMubGlzdGVuZXIuZm9yZWlnbktleUNoYW5nZWQocHJvZmlsZSwgZm9yZWlnbktleSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MGIxZDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIGxpc3QgY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgU1dUCi0gKiBVSSB0aHJlYWQsIGFzeW5jaHJvbm91c2x5IGlmIG5lY2Vzc2FyeS4gSWYgdGhlIGV2ZW50IGFycml2ZWQgb24gdGhlIFVJCi0gKiB0aHJlYWQgdGhhdCBpcyBwcm9iYWJseSBiZWNhdXNlIGl0IHdhcyBpbml0aWF0ZWQgYnkgYSBVSSB3aWRnZXQ7IGFzIGEKLSAqIHJlc3VsdCwgd2Ugd2FudCB0byBsb29wIGJhY2sgc3luY2hyb25vdXNseSBzbyB0aGUgZXZlbnRzIGNhbiBiZQotICogc2hvcnQtY2lyY3VpdGVkLgotICovCi1wdWJsaWMgY2xhc3MgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZEl0ZW1zUmVwbGFjZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubGlzdENsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZExpc3RDbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5saXN0Q2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkTGlzdENoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIG1vdmVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlcGxhY2VkUnVubmFibGUoZmluYWwgTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZXBsYWNlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTGlzdENsZWFyZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjbGVhcmVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRMaXN0Q2hhbmdlZFJ1bm5hYmxlKGZpbmFsIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSB7Ci0JCXJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBEaXNwbGF5I2FzeW5jRXhlYyhSdW5uYWJsZSl9IHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nIHtAbGluayBEaXNwbGF5I3N5bmNFeGVjKFJ1bm5hYmxlKX0gY2FuIHNvbXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25VSVRocmVhZChSdW5uYWJsZSByKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhyKTsKLS8vCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhyKTsKLQl9Ci0KLQl2b2lkIGl0ZW1zQWRkZWRfKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZW1vdmVkXyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZXBsYWNlZF8oTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENsZWFyZWRfKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENoYW5nZWRfKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTMyMjFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIFNXVAotICogVUkgdGhyZWFkLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4KLSAqLwotcHVibGljIGNsYXNzIFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUHJvcGVydHlDaGFuZ2VkUnVubmFibGUoZmluYWwgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMucHJvcGVydHlDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25VSVRocmVhZCgpIHsKLQkJcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIERpc3BsYXkjYXN5bmNFeGVjKFJ1bm5hYmxlKX0gc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcge0BsaW5rIERpc3BsYXkjc3luY0V4ZWMoUnVubmFibGUpfSBjYW4gc29tdGltZXMgbWFrZSB0aGluZ3MKLQkgKiBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPblVJVGhyZWFkKFJ1bm5hYmxlIHIpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHIpOwotLy8JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKHIpOwotCX0KLQotCXZvaWQgcHJvcGVydHlDaGFuZ2VkXyhQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjJhNDEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIHN0YXRlIGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIFNXVAotICogVUkgdGhyZWFkLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4KLSAqLwotcHVibGljIGNsYXNzIFNXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBTdGF0ZUNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIFNXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5zdGF0ZUNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFN0YXRlQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkU3RhdGVDaGFuZ2VkUnVubmFibGUoZmluYWwgU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuc3RhdGVDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25VSVRocmVhZCgpIHsKLQkJcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIERpc3BsYXkjYXN5bmNFeGVjKFJ1bm5hYmxlKX0gc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcge0BsaW5rIERpc3BsYXkjc3luY0V4ZWMoUnVubmFibGUpfSBjYW4gc29tdGltZXMgbWFrZSB0aGluZ3MKLQkgKiBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPblVJVGhyZWFkKFJ1bm5hYmxlIHIpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHIpOwotLy8JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKHIpOwotCX0KLQotCXZvaWQgc3RhdGVDaGFuZ2VkXyhTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk0NjJlOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciB0cmVlIGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIFNXVAotICogVUkgdGhyZWFkLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4KLSAqLwotcHVibGljIGNsYXNzIFNXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIFRyZWVDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIFNXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5ub2RlQWRkZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZE5vZGVBZGRlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubm9kZVJlbW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZE5vZGVSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnRyZWVDbGVhcmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRUcmVlQ2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMudHJlZUNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFRyZWVDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGROb2RlQWRkZWRSdW5uYWJsZShmaW5hbCBUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubm9kZUFkZGVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIGFkZGVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGROb2RlUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5ub2RlUmVtb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibm9kZSByZW1vdmVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRUcmVlQ2xlYXJlZFJ1bm5hYmxlKGZpbmFsIFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnRyZWVDbGVhcmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNsZWFyZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRyZWVDaGFuZ2VkUnVubmFibGUoZmluYWwgVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnRyZWVDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNoYW5nZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25VSVRocmVhZCgpIHsKLQkJcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIERpc3BsYXkjYXN5bmNFeGVjKFJ1bm5hYmxlKX0gc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcge0BsaW5rIERpc3BsYXkjc3luY0V4ZWMoUnVubmFibGUpfSBjYW4gc29tdGltZXMgbWFrZSB0aGluZ3MKLQkgKiBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPblVJVGhyZWFkKFJ1bm5hYmxlIHIpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHIpOwotLy8JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKHIpOwotCX0KLQotCXZvaWQgbm9kZUFkZGVkXyhUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5ub2RlQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbm9kZVJlbW92ZWRfKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIHRyZWVDbGVhcmVkXyhUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIHRyZWVDaGFuZ2VkXyhUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci50cmVlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWVudXMvTWFwQXNDb250cmlidXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21lbnVzL01hcEFzQ29udHJpYnV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMjMyMTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWVudXMvTWFwQXNDb250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1lbnVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkRlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkltYWdlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Db21wb3VuZENvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSUhhbmRsZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1lbnVzLkNvbW1hbmRDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1lbnVzLkNvbW1hbmRDb250cmlidXRpb25JdGVtUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1lbnVzLklXb3JrYmVuY2hDb250cmlidXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuc2VydmljZXMuSVNlcnZpY2VMb2NhdG9yOwotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogVGhpcyBtZW51IGNvbnRyaWJ1dGlvbiBpcyByZXNwb25zaWJsZSB0byBwb3B1bGF0ZSB0aGUgTWFwIEFzIG1lbnUgd2l0aCB0aGUKLSAqIHJlZ2lzdGVyZWQgbWFwcGluZyB0eXBlcyBkZWZpbmVkIGluIHRoZSA8Y29kZT5KcHRQbGF0Zm9ybVVpPC9jb2RlPi4KLSAqCi0gKiBAc2VlIEpwYVBsYXRmb3JtCi0gKiBAc2VlIEpwYVBsYXRmb3JtVWkKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFwQXNDb250cmlidXRpb248VCBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+Ci0JZXh0ZW5kcyBDb21wb3VuZENvbnRyaWJ1dGlvbkl0ZW0KLQlpbXBsZW1lbnRzIElXb3JrYmVuY2hDb250cmlidXRpb24KLXsKLQkvKioKLQkgKiBLZWVwcyB0cmFjayBvZiB0aGUgPGNvZGU+SVNlcnZpY2VMb2NhdG9yPC9jb2RlPiB3aGljaCBpcyB1c2VkIHRvIHJldHJpZXZlCi0JICogdmFyaW91cyBzZXJ2aWNlcyByZXF1aXJlZCBmb3IgaW52b2tpbmcgdGhlIDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXI8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgSVNlcnZpY2VMb2NhdG9yIHNlcnZpY2VMb2NhdG9yOwotCQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29udHJpYnV0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTWFwQXNDb250cmlidXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVNlcnZpY2VMb2NhdG9yIHNlcnZpY2VMb2NhdG9yKSB7Ci0JCXRoaXMuc2VydmljZUxvY2F0b3IgPSBzZXJ2aWNlTG9jYXRvcjsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbVtdIGdldENvbnRyaWJ1dGlvbkl0ZW1zKCkgewotCQkvLyBSZXRyaWV2ZSB0aGUgc2VsZWN0aW9uIGZyb20gdGhlIGhhbmRsZXIgc2VydmljZQotCQkvLyB3aGljaCBzaG91bGQgYmUgYW4gSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2YgSnBhU3RydWN0dXJlTm9kZXMKLQkJSUhhbmRsZXJTZXJ2aWNlIGhhbmRsZXJTZXJ2aWNlID0gCi0JCQkoSUhhbmRsZXJTZXJ2aWNlKSB0aGlzLnNlcnZpY2VMb2NhdG9yLmdldFNlcnZpY2UoSUhhbmRsZXJTZXJ2aWNlLmNsYXNzKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IAotCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBoYW5kbGVyU2VydmljZS5nZXRDdXJyZW50U3RhdGUoKS5nZXRWYXJpYWJsZShJU291cmNlcy5BQ1RJVkVfQ1VSUkVOVF9TRUxFQ1RJT05fTkFNRSk7Ci0JCQotCQkvLyBBc3N1bWUgdGhhdCBhbGwgbm9kZXMgYXJlIGluIHRoZSBzYW1lIHByb2plY3QgKHdoaWNoIGlzIHZlcnkgc2FmZSkKLQkJLy8gYW5kIHJldHJpZXZlIHRoZSBtYXBwaW5nIFVJIHByb3ZpZGVycyBqdXN0IGZyb20gdGhlIGZpcnN0IGl0ZW0KLQkJVCBub2RlID0gKFQpIGN1cnJlbnRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQotCQlyZXR1cm4gCi0JCQlBcnJheVRvb2xzLmFycmF5KAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248VCwgPz4sIElDb250cmlidXRpb25JdGVtPihtYXBwaW5nVWlEZWZpbml0aW9ucyhub2RlKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIElDb250cmlidXRpb25JdGVtIHRyYW5zZm9ybShNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+IG5leHQpIHsKLQkJCQkJCXJldHVybiBjcmVhdGVDb250cmlidXRpb25JdGVtKG5leHQpOwotCQkJCQl9Ci0JCQkJfSwKLQkJCQluZXcgSUNvbnRyaWJ1dGlvbkl0ZW1bMF0pOwotCX0KLQkKLQotCXByb3RlY3RlZCBDb21wYXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248VCwgPz4+IGdldERlZmluaXRpb25zQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248VCwgPz4+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE1hcHBpbmdVaURlZmluaXRpb248VCwgPz4gaXRlbTEsIE1hcHBpbmdVaURlZmluaXRpb248VCwgPz4gaXRlbTIpIHsKLQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZzEgPSBpdGVtMS5nZXRMYWJlbCgpOwotCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMiA9IGl0ZW0yLmdldExhYmVsKCk7Ci0JCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShkaXNwbGF5U3RyaW5nMSwgZGlzcGxheVN0cmluZzIpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgcmVnaXN0ZXJlZCB7QGxpbmsgTWFwcGluZ1VpRGVmaW5pdGlvbn1zIGZyb20gdGhlIGdpdmVuIG5vZGUsIAotCSAqIHVzaW5nIGl0cyB7QGxpbmsgSnBhUGxhdGZvcm1VaX0uCi0JICoKLQkgKiBAcGFyYW0gbm9kZSBBIHRlc3Qgbm9kZSB0byBkZXRlcm1pbmUgdGhlIHtAbGluayBKcGFQbGF0Zm9ybVVpfSBhbmQgdHlwZSAKLQkgKiBvZiBwcm92aWRlcnMgdG8gcmV0dXJuCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiByZWdpc3RlcmVkIHtAbGluayBNYXBwaW5nVWlEZWZpbml0aW9ufXMKLQkgKi8KLQlwcm90ZWN0ZWQgPFUgZXh0ZW5kcyBUPiBJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxULCA/Pj4gbWFwcGluZ1VpRGVmaW5pdGlvbnMoZmluYWwgVCBub2RlKSB7Ci0JCUpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtID0gbm9kZS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKTsKLQkJSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpID0gSnB0VWlQbHVnaW4uaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybVVpKGpwYVBsYXRmb3JtKTsKLQkJCi0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+PiBzb3J0ZWRNYXBwaW5nVWlEZWZpbml0aW9ucyA9IAotCQkJCUNvbGxlY3Rpb25Ub29scy5zb3J0KAotCQkJCQluZXcgRmlsdGVyaW5nSXRlcmF0b3I8TWFwcGluZ1VpRGVmaW5pdGlvbjxULCA/Pj4oCi0JCQkJCQkJbWFwcGluZ1VpRGVmaW5pdGlvbnMoanBhUGxhdGZvcm1VaSwgbm9kZS5nZXRSZXNvdXJjZVR5cGUoKSkpIHsKLQkJCQkJCSBAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+IG8pIHsKLQkJCQkJCQlyZXR1cm4gby5pc0VuYWJsZWRGb3Iobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0sCi0JCQkJCWdldERlZmluaXRpb25zQ29tcGFyYXRvcigpKTsKLQkJCi0JCURlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+IGRlZmF1bHREZWZpbml0aW9uID0gZ2V0RGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb24oanBhUGxhdGZvcm1VaSwgbm9kZSk7Ci0JCWlmIChkZWZhdWx0RGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248VCwgPz4+KGRlZmF1bHREZWZpbml0aW9uLCBzb3J0ZWRNYXBwaW5nVWlEZWZpbml0aW9ucyk7Ci0JCX0KLQkJcmV0dXJuIHNvcnRlZE1hcHBpbmdVaURlZmluaXRpb25zOwotCX0KLQotCS8qKgotCSogUmV0cmlldmVzIHRoZSByZWdpc3RlcmVkIHtAbGluayBNYXBwaW5nVWlEZWZpbml0aW9ufXMgZnJvbSB0aGUgZ2l2ZW4gCi0JKiB7QGxpbmsgSnBhUGxhdGZvcm1VaX0gYW5kIHtAbGluayBKcGFTdHJ1Y3R1cmVOb2RlfSAodG8gZGV0ZXJtaW5lIHR5cGUgb2YgCi0JKiBtYXBwaW5nIHByb3ZpZGVycyB0byByZXRyaWV2ZSkuCi0JKgotCSogQHBhcmFtIGpwYVBsYXRmb3JtVWkgVGhlIGFjdGl2ZSB7QGxpbmsgSnBhUGxhdGZvcm1VaX0gZnJvbSB3aGVyZSB0aGUKLQkqIHByb3ZpZGVyIGNhbiBiZSByZXRyaWV2ZWQKLQkqIEBwYXJhbSBub2RlIEEgdGVzdCBub2RlIHRvIGRldGVybWluZSB0eXBlIG9mIHByb3ZpZGVycyB0byByZXR1cm4KLQkqIEByZXR1cm4gVGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCB7QGxpbmsgTWFwcGluZ1VpRGVmaW5pdGlvbn1zCi0JKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248VCwgPz4+IAotCQltYXBwaW5nVWlEZWZpbml0aW9ucyhKcGFQbGF0Zm9ybVVpIHBsYXRmb3JtVWksIEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpOwotCQotCS8qKgotCSogQ3JlYXRlcyB0aGUgZGVmYXVsdCBwcm92aWRlciByZXNwb25zaWJsZSBmb3IgY2xlYXJpbmcgdGhlIG1hcHBpbmcgdHlwZS4KLQkqIElmIG5vdCBkZWZhdWx0IHByb3ZpZGVyLCB0aGVuIHJldHVybiBudWxsCi0JKgotCSogQHJldHVybiBBIHByb3ZpZGVyIHRoYXQgYWN0cyBhcyBhIGRlZmF1bHQgbWFwcGluZyBwcm92aWRlcgotCSovCi0JcHJvdGVjdGVkIGFic3RyYWN0IERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+IGdldERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uKEpwYVBsYXRmb3JtVWkgcGxhdGZvcm1VaSwgVCBub2RlKTsKLQkJCQotCXByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbSBjcmVhdGVDb250cmlidXRpb25JdGVtKE1hcHBpbmdVaURlZmluaXRpb248VCwgPz4gbWFwcGluZ1VpUHJvdmlkZXIpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kQ29udHJpYnV0aW9uSXRlbShjcmVhdGVQYXJhbWV0ZXIobWFwcGluZ1VpUHJvdmlkZXIpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbW1hbmRDb250cmlidXRpb25JdGVtUGFyYW1ldGVyIGNyZWF0ZVBhcmFtZXRlcihNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+IG1hcHBpbmdVaURlZmluaXRpb24pIHsKLQkJQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW1QYXJhbWV0ZXIgcGFyYW1ldGVyID0KLQkJCW5ldyBDb21tYW5kQ29udHJpYnV0aW9uSXRlbVBhcmFtZXRlcigKLQkJCQkJdGhpcy5zZXJ2aWNlTG9jYXRvciwgCi0JCQkJCWNyZWF0ZUNvbW1hbmRDb250cmlidXRpb25JdGVtSWQobWFwcGluZ1VpRGVmaW5pdGlvbiksCi0JCQkJCWdldENvbW1hbmRJZCgpLAotCQkJCQlDb21tYW5kQ29udHJpYnV0aW9uSXRlbS5TVFlMRV9DSEVDSyk7Ci0JCXBhcmFtZXRlci5sYWJlbCA9IG1hcHBpbmdVaURlZmluaXRpb24uZ2V0TGFiZWwoKTsKLQkJTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCXBhcmFtZXRlcnMucHV0KGdldENvbW1hbmRQYXJhbWV0ZXJJZCgpLCBtYXBwaW5nVWlEZWZpbml0aW9uLmdldEtleSgpKTsKLQkJcGFyYW1ldGVyLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOwotCQlwYXJhbWV0ZXIuaWNvbiA9IG5ldyBJbWFnZUltYWdlRGVzY3JpcHRvcihtYXBwaW5nVWlEZWZpbml0aW9uLmdldEltYWdlKCkpOwotCQlwYXJhbWV0ZXIudmlzaWJsZUVuYWJsZWQgPSB0cnVlOwotCQlyZXR1cm4gcGFyYW1ldGVyOwotCX0KLQkKLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb21tYW5kIHRoYXQgd2lsbCBiZSBpbnZva2VkIGZvcgotCSAqIGNoYW5naW5nIHRoZSBtYXBwaW5nIHR5cGUgb2YgdGhlIHNlbGVjdGVkIG5vZGVzLgotCSAqCi0JICogQHJldHVybiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlICJtYXAgYXMiIGNvbW1hbmQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENvbW1hbmRJZCgpOwotCQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIG1hcHBpbmcga2V5IGNvbW1hbmQgcGFyYW1ldGVyIHRoYXQgCi0JICogd2lsbCBiZSB1c2VkIGZvciB0aGUgbmV3IG1hcHBpbmcgdHlwZSBvZiB0aGUgc2VsZWN0ZWQgbm9kZXMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgIm1hcCBhcyIgY29tbWFuZCBwYXJhbWV0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENvbW1hbmRQYXJhbWV0ZXJJZCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgYW4gaWQgZm9yIGEge0BsaW5rIENvbW1hbmRDb250cmlidXRpb25JdGVtfSBpbiB0aGUgZm9ybSBvZiAKLQkgKiAiPGNvbW1hbmRJZD4uPG1hcHBpbmdLZXk+IiAgCi0JICogKGZvciBleGFtcGxlICJvcmcuZWNsaXBzZS5qcHQuY29yZS51aS5wZXJzaXN0ZW50VHlwZU1hcEFzLmVudGl0eSIpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVDb21tYW5kQ29udHJpYnV0aW9uSXRlbUlkKE1hcHBpbmdVaURlZmluaXRpb248VCwgPz4gbWFwcGluZ1VpRGVmaW5pdGlvbikgewotCQlyZXR1cm4gZ2V0Q29tbWFuZElkKCkgKyAiLiIgKyBtYXBwaW5nVWlEZWZpbml0aW9uLmdldEtleSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21lbnVzL1BlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWVudXMvUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29udHJpYnV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjY2I2MGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWVudXMvUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1lbnVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuY29tbWFuZHMuUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tZW51cy5Db21tYW5kQ29udHJpYnV0aW9uSXRlbVBhcmFtZXRlcjsKLQotLyoqCi0gKiBUaGlzIG1lbnUgY29udHJpYnV0aW9uIGlzIHJlc3BvbnNpYmxlIHRvIHBvcHVsYXRlIHRoZSBNYXAgQXMgbWVudSB3aXRoIHRoZQotICogcmVnaXN0ZXJlZCBhdHRyaWJ1dGUgbWFwcGluZyB0eXBlcyBkZWZpbmVkIGluIHRoZSA8Y29kZT5KcHRQbGF0Zm9ybVVpPC9jb2RlPgotICogZm9yIDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGU8L2NvZGU+IG9iamVjdHMuCi0gKgotICogQHNlZSBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyCi0gKiBAc2VlIFBlcnNpc3RlbnRBdHRyaWJ1dGUKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbgotCWV4dGVuZHMgTWFwQXNDb250cmlidXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbW1hbmRJZCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXIuQ09NTUFORF9JRDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21tYW5kUGFyYW1ldGVySWQoKSB7Ci0JCXJldHVybiBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyLlNQRUNJRklFRF9NQVBQSU5HX0NPTU1BTkRfUEFSQU1FVEVSX0lEOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW1QYXJhbWV0ZXIgY3JlYXRlUGFyYW1ldGVyKE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudEF0dHJpYnV0ZSwgPz4gbWFwcGluZ1VpUHJvdmlkZXIpIHsKLQkJQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW1QYXJhbWV0ZXIgcGFyYW1ldGVyID0gc3VwZXIuY3JlYXRlUGFyYW1ldGVyKG1hcHBpbmdVaVByb3ZpZGVyKTsKLQkJU3RyaW5nIGRlZmF1bHRLZXkgPSBudWxsOwotCQlpZiAobWFwcGluZ1VpUHJvdmlkZXIgaW5zdGFuY2VvZiBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjw/LCA/PikgewotCQkJZGVmYXVsdEtleSA9ICgoRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFBlcnNpc3RlbnRBdHRyaWJ1dGUsID8+KSBtYXBwaW5nVWlQcm92aWRlcikuZ2V0RGVmYXVsdEtleSgpOwotCQl9Ci0JCXBhcmFtZXRlci5wYXJhbWV0ZXJzLnB1dChQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyLkRFRkFVTFRfTUFQUElOR19DT01NQU5EX1BBUkFNRVRFUl9JRCwgZGVmYXVsdEtleSk7Ci0JCXJldHVybiBwYXJhbWV0ZXI7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCA/Pj4gbWFwcGluZ1VpRGVmaW5pdGlvbnMoCi0JCQlKcGFQbGF0Zm9ybVVpIGpwYVBsYXRmb3JtVWksIEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJCi0JCXJldHVybiBqcGFQbGF0Zm9ybVVpLmF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKHJlc291cmNlVHlwZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50QXR0cmlidXRlLCA/PiBnZXREZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbigKLQkJCUpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaSwgUGVyc2lzdGVudEF0dHJpYnV0ZSBub2RlKSB7Ci0JCQotCQlyZXR1cm4gZ2V0RGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb24oCi0JCQkJanBhUGxhdGZvcm1VaSwgCi0JCQkJKChQZXJzaXN0ZW50QXR0cmlidXRlKSBub2RlKS5nZXREZWZhdWx0TWFwcGluZ0tleSgpLCAKLQkJCQlub2RlLmdldFJlc291cmNlVHlwZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsID8+IGdldERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uKAotCQkJSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpLCBTdHJpbmcgZGVmYXVsdE1hcHBpbmdLZXksIEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJCi0JCXJldHVybiBqcGFQbGF0Zm9ybVVpLmdldERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKHJlc291cmNlVHlwZSwgZGVmYXVsdE1hcHBpbmdLZXkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21lbnVzL1BlcnNpc3RlbnRUeXBlTWFwQXNDb250cmlidXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21lbnVzL1BlcnNpc3RlbnRUeXBlTWFwQXNDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2NzI2ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tZW51cy9QZXJzaXN0ZW50VHlwZU1hcEFzQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1lbnVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkRlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzLlBlcnNpc3RlbnRUeXBlTWFwQXNIYW5kbGVyOwotCi0vKioKLSAqIFRoaXMgbWVudSBjb250cmlidXRpb24gaXMgcmVzcG9uc2libGUgdG8gcG9wdWxhdGUgdGhlIE1hcCBBcyBtZW51IHdpdGggdGhlCi0gKiByZWdpc3RlcmVkIG1hcHBpbmcgdHlwZXMgZGVmaW5lZCBpbiB0aGUgPGNvZGU+SnB0UGxhdGZvcm1VaTwvY29kZT4gZm9yCi0gKiA8Y29kZT5QZXJzaXN0ZW50VHlwZTwvY29kZT4gb2JqZWN0cy4KLSAqCi0gKiBAc2VlIEpwYVBsYXRmb3JtCi0gKiBAc2VlIEpwYVBsYXRmb3JtVWkKLSAqIEBzZWUgUGVyc2lzdGVudFR5cGUKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRUeXBlTWFwQXNDb250cmlidXRpb24KLQlleHRlbmRzIE1hcEFzQ29udHJpYnV0aW9uPFBlcnNpc3RlbnRUeXBlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVudFR5cGVNYXBBc0NvbnRyaWJ1dGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlTWFwQXNDb250cmlidXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tbWFuZElkKCkgewotCQlyZXR1cm4gUGVyc2lzdGVudFR5cGVNYXBBc0hhbmRsZXIuQ09NTUFORF9JRDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21tYW5kUGFyYW1ldGVySWQoKSB7Ci0JCXJldHVybiBQZXJzaXN0ZW50VHlwZU1hcEFzSGFuZGxlci5DT01NQU5EX1BBUkFNRVRFUl9JRDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRUeXBlLCA/Pj4gbWFwcGluZ1VpRGVmaW5pdGlvbnMoCi0JCQlKcGFQbGF0Zm9ybVVpIGpwYVBsYXRmb3JtVWksIEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJCi0JCXJldHVybiBqcGFQbGF0Zm9ybVVpLnR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucyhyZXNvdXJjZVR5cGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsID8+IGdldERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uKAotCQkJSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpLCBQZXJzaXN0ZW50VHlwZSBub2RlKSB7Ci0JCQotCQlyZXR1cm4ganBhUGxhdGZvcm1VaS5nZXREZWZhdWx0VHlwZU1hcHBpbmdVaURlZmluaXRpb24obm9kZS5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckFjdGlvblByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjMGFiMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yQWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnMuT3BlbkpwYVJlc291cmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25BY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uTWVudUNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEpwYU5hdmlnYXRvckFjdGlvblByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uQWN0aW9uUHJvdmlkZXIKLXsKLQlwcml2YXRlIE9wZW5KcGFSZXNvdXJjZUFjdGlvbiBvcGVuQWN0aW9uOwotCQotCXB1YmxpYyBKcGFOYXZpZ2F0b3JBY3Rpb25Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBhQ29uZmlnKSB7Ci0JCW9wZW5BY3Rpb24gPSBuZXcgT3BlbkpwYVJlc291cmNlQWN0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbnRleHQoQWN0aW9uQ29udGV4dCBhQ29udGV4dCkgewotCQlpZiAoYUNvbnRleHQgIT0gbnVsbCAmJiBhQ29udGV4dC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFDb250ZXh0LmdldFNlbGVjdGlvbigpOwotCQkJb3BlbkFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JCX0KLQkJCi0JCXN1cGVyLnNldENvbnRleHQoYUNvbnRleHQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyB0aGVBY3Rpb25CYXJzKSB7Ci0JCWlmIChvcGVuQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQl0aGVBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSUNvbW1vbkFjdGlvbkNvbnN0YW50cy5PUEVOLCBvcGVuQWN0aW9uKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIGFNZW51KSB7Ci0JCWlmIChnZXRDb250ZXh0KCkgPT0gbnVsbCB8fCBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChvcGVuQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQlhTWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBvcGVuQWN0aW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZGEyYjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBKcGFOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlciBleHRlbmRzIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgSnBhTmF2aWdhdG9yQ29udGVudEFuZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKG5ldyBKcGFOYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSwgbmV3IEpwYU5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MTcxZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQ29udGVudEV4dGVuc2lvblNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVByb2plY3RGYWNldEFjdGlvbkV2ZW50OwotCi0vKioKLSAqIFRoaXMgZXh0ZW5zaW9uIG9mIG5hdmlnYXRvciBjb250ZW50IHByb3ZpZGVyIGRlbGVnYXRlcyB0byB0aGUgcGxhdGZvcm0gVUkKLSAqIChzZWUgdGhlIG9yZy5lY2xpcHNlLmpwdC51aS5qcGFQbGF0Zm9ybSBleHRlbnNpb24gcG9pbnQpIGZvciBuYXZpZ2F0b3IgY29udGVudC4KLSAqIAotICogSWYgdGhlcmUgaXMgYSBwbGF0Zm9ybSBVSSBmb3IgdGhlIGdpdmVuIHByb2plY3QsIHRoaXMgY29udGVudCBwcm92aWRlciB3aWxsCi0gKiBwcm92aWRlIGEgcm9vdCAiSlBBIENvbnRlbnQiIG5vZGUgKGNoaWxkIG9mIHRoZSBwcm9qZWN0KSwgb3RoZXJ3aXNlIHRoZXJlCi0gKiB3aWxsIGJlIG5vIGNvbnRlbnQuICBGb3IgY2hpbGRyZW4gb2YgdGhlICJKUEEgQ29udGVudCIgbm9kZSAob3IgZm9yIGFueSBvdGhlcgotICogc3ViLW5vZGUpLCB0aGlzIHByb3ZpZGVyIHdpbGwgZGVsZWdhdGUgdG8gdGhlIGNvbnRlbnQgcHJvdmlkZXIgcmV0dXJuZWQgYnkgdGhlIAotICogcGxhdGZvcm0gVUkgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGFOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIKLQlpbXBsZW1lbnRzIElDb21tb25Db250ZW50UHJvdmlkZXIKLXsKLQlwcml2YXRlIEpwYU5hdmlnYXRvckNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGRlbGVnYXRlOwotCQotCXByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgZmFjZXRMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyOwotCQotCQotCXB1YmxpYyBKcGFOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZhY2V0TGlzdGVuZXIgPSBuZXcgRmFjZXRMaXN0ZW5lcigpOwotCQlGYWNldGVkUHJvamVjdEZyYW1ld29yay5hZGRMaXN0ZW5lcigKLQkJCQlmYWNldExpc3RlbmVyLCAKLQkJCQlJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBPU1RfSU5TVEFMTCwKLQkJCQlJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBPU1RfVU5JTlNUQUxMLAotCQkJCUlGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJPSkVDVF9NT0RJRklFRCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlciBkZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIElDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJRmFjZXRlZFByb2plY3RGcmFtZXdvcmsucmVtb3ZlTGlzdGVuZXIoZmFjZXRMaXN0ZW5lcik7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5pbnB1dENoYW5nZWQodmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwotCQl9Ci0JCXRoaXMudmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcjsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIElUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgZWxlbWVudCkuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0JCQkKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCQkJaWYgKGpwYVByb2plY3QgIT0gbnVsbCkgewotCQkJCQlKcGFQbGF0Zm9ybVVpIHBsYXRmb3JtVWkgPSBKcHRVaVBsdWdpbi5pbnN0YW5jZSgpLmdldEpwYVBsYXRmb3JtVWkoanBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpKTsKLQkJCQkJCi0JCQkJCXJldHVybiBwbGF0Zm9ybVVpICE9IG51bGw7Ci0JCQkJfQkKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5oYXNDaGlsZHJlbihlbGVtZW50KTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIHBhcmVudEVsZW1lbnQpLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCQkJCi0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwotCQkJCWlmIChqcGFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJSnBhUGxhdGZvcm1VaSBwbGF0Zm9ybVVpID0gSnB0VWlQbHVnaW4uaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybVVpKGpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKSk7Ci0JCQkJCQotCQkJCQlpZiAocGxhdGZvcm1VaSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpfTsKLQkJCQkJfQotCQkJCX0JCi0JCQl9Ci0JCX0KLQkJCi0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGUuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7Ci0JCX0KLQkJCQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJTWVtZW50b0F3YXJlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCS8vIG5vIG9wCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCS8vIG5vIG9wCi0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSUNvbW1vbkNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBpbml0KElDb21tb25Db250ZW50RXh0ZW5zaW9uU2l0ZSBjb25maWcpIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCUpwYU5hdmlnYXRvckxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IChKcGFOYXZpZ2F0b3JMYWJlbFByb3ZpZGVyKSBjb25maWcuZ2V0RXh0ZW5zaW9uKCkuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCAmJiBsYWJlbFByb3ZpZGVyLmRlbGVnYXRlKCkgIT0gbnVsbCkgewotCQkJCWRlbGVnYXRlID0gbGFiZWxQcm92aWRlci5kZWxlZ2F0ZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZGVsZWdhdGUgPSBuZXcgSnBhTmF2aWdhdG9yQ29udGVudEFuZExhYmVsUHJvdmlkZXIoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBjbGFzcyBGYWNldExpc3RlbmVyCi0JCWltcGxlbWVudHMgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIKLQl7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJPSkVDVF9NT0RJRklFRCkgewotCQkJCXJlZnJlc2hWaWV3ZXIoZXZlbnQuZ2V0UHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChldmVudC5nZXRUeXBlKCkgPT0gSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QT1NUX0lOU1RBTEwKLQkJCQkJfHwgZXZlbnQuZ2V0VHlwZSgpID09IElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUE9TVF9VTklOU1RBTEwpIHsKLQkJCQlJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQgaXBhRXZlbnQgPSAoSVByb2plY3RGYWNldEFjdGlvbkV2ZW50KSBldmVudDsKLQkJCQlpZiAoaXBhRXZlbnQuZ2V0UHJvamVjdEZhY2V0KCkuZXF1YWxzKEpwYUZhY2V0LkZBQ0VUKSkgewotCQkJCQlyZWZyZXNoVmlld2VyKGlwYUV2ZW50LmdldFByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIHJlZnJlc2hWaWV3ZXIoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQkJaWYgKHZpZXdlciAhPSBudWxsIAotCQkJCQkmJiB2aWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwgCi0JCQkJCSYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCS8vIFVzaW5nIGpvYiBoZXJlIHNvIHRoYXQgcHJvamVjdCBtb2RlbCB1cGRhdGUgKHdoaWNoIGFsc28gdXNlcwotCQkJCS8vICBhIGpvYikgd2lsbCBjb21wbGV0ZSBmaXJzdAotCQkJCUpvYiByZWZyZXNoSm9iID0gbmV3IEpvYigiUmVmcmVzaCB2aWV3ZXIiKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQkvLyBVc2luZyBydW5uYWJsZSBoZXJlIHNvIHRoYXQgcmVmcmVzaCB3aWxsIGdvIG9uIGNvcnJlY3QgdGhyZWFkCi0JCQkJCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJdmlld2VyLnJlZnJlc2gocHJvamVjdCk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJfQotCQkJCX07Ci0JCQkJcmVmcmVzaEpvYi5zZXRSdWxlKHByb2plY3QpOwotCQkJCXJlZnJlc2hKb2Iuc2NoZWR1bGUoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVlZmYwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgSnBhTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLXsKLQkvKioKLQkgKiBFeGFjdGx5ICpvbmUqIG9mIHRoZXNlIGZhY3RvcmllcyBpcyBjcmVhdGVkIGZvciBlYWNoIHZpZXcgdGhhdCB1dGlsaXplcyBpdC4gIAotCSAqIFRoZXJlZm9yZSwgYXMgd2UgZGVsZWdhdGUgdG8gdGhlIHBsYXRmb3JtIFVJIGZvciBlYWNoIHByb2plY3QsIHdlIHNob3VsZCAKLQkgKiBtYWludGFpbiB0aGUgc2FtZSBtdWx0aXBsaWNpdHkuICBUaGF0IGlzLCBpZiB0aGVyZSBpcyBhIGRlbGVnYXRlIGZvciBlYWNoIAotCSAqIHBsYXRmb3JtIFVJLCB3ZSBzaG91bGQgbWFpbnRhaW4gKm9uZSogZGVsZWdhdGUgZm9yIGVhY2ggdmlldy4KLQkgKiAKLQkgKiBLZXk6IHBsYXRmb3JtIGlkLCAgVmFsdWU6IGRlbGVnYXRlIGNvbnRlbnQgcHJvdmlkZXIgZmFjdG9yeQotCSAqLwotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5PiBkZWxlZ2F0ZXM7Ci0JCi0JCi0JcHVibGljIEpwYU5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kZWxlZ2F0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeT4oKTsKLQl9Ci0JCi0JcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyIGJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQlJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZGVsZWdhdGUgPSBnZXREZWxlZ2F0ZShpdGVtKTsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5idWlsZEl0ZW1MYWJlbFByb3ZpZGVyKGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0RGVsZWdhdGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKCEgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUpwYUNvbnRleHROb2RlIGNvbnRleHROb2RlID0gKEpwYUNvbnRleHROb2RlKSAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoSnBhQ29udGV4dE5vZGUuY2xhc3MpOwotCQkKLQkJaWYgKGNvbnRleHROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlKcGFQbGF0Zm9ybSBwbGF0Zm9ybSA9IGNvbnRleHROb2RlLmdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpOwotCQlTdHJpbmcgcGxhdGZvcm1JZCA9IHBsYXRmb3JtLmdldElkKCk7Ci0JCWlmIChkZWxlZ2F0ZXMuY29udGFpbnNLZXkocGxhdGZvcm1JZCkpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZXMuZ2V0KHBsYXRmb3JtSWQpOwotCQl9Ci0JCUpwYU5hdmlnYXRvclByb3ZpZGVyIG5hdmlnYXRvclByb3ZpZGVyID0gSnB0VWlQbHVnaW4uaW5zdGFuY2UoKS5nZXRKcGFOYXZpZ2F0b3JQcm92aWRlcihwbGF0Zm9ybSk7Ci0JCUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBkZWxlZ2F0ZSA9IG51bGw7Ci0JCWlmIChuYXZpZ2F0b3JQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZSA9IG5hdmlnYXRvclByb3ZpZGVyLmdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotCQl9Ci0JCWRlbGVnYXRlcy5wdXQocGxhdGZvcm1JZCwgZGVsZWdhdGUpOwotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlM2I5NzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkNvbnRlbnRFeHRlbnNpb25TaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGV4dGVuc2lvbiBvZiBuYXZpZ2F0b3IgbGFiZWwgcHJvdmlkZXIgZGVsZWdhdGVzIHRvIHRoZSBwbGF0Zm9ybSBVSQotICogKHNlZSB0aGUgb3JnLmVjbGlwc2UuanB0LnVpLmpwYVBsYXRmb3JtIGV4dGVuc2lvbiBwb2ludCkgZm9yIG5hdmlnYXRvciBsYWJlbHMuCi0gKiAKLSAqIFRoaXMgbGFiZWwgcHJvdmlkZXIgcHJvdmlkZXMgYSBsYWJlbCBmb3IgdGhlIHJvb3QgIkpQQSBDb250ZW50IiBub2RlIHByb3ZpZGVkCi0gKiBieSB0aGUgY29udGVudCBwcm92aWRlciAoc2VlIHtAbGluayBKcGFOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXJ9KSBhbmQgZGVsZWdhdGVzCi0gKiB0byB0aGUgbGFiZWwgcHJvdmlkZXIgcmV0dXJuZWQgYnkgdGhlIHBsYXRmb3JtIFVJIGltcGxlbWVudGF0aW9uIGZvciBsYWJlbHMKLSAqIGZvciBjaGlsZHJlbiBvZiB0aGUgIkpQQSBDb250ZW50IiBub2RlIChvciBmb3IgYW55IG90aGVyIHN1Yi1ub2RlKS4KLSAqLwotcHVibGljIGNsYXNzIEpwYU5hdmlnYXRvckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JaW1wbGVtZW50cyBJQ29tbW9uTGFiZWxQcm92aWRlcgotewotCXByaXZhdGUgSnBhTmF2aWdhdG9yQ29udGVudEFuZExhYmVsUHJvdmlkZXIgZGVsZWdhdGU7Ci0JCi0JCi0JcHVibGljIEpwYU5hdmlnYXRvckxhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlciBkZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIElCYXNlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JCXN1cGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5pc0xhYmVsUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuaXNMYWJlbFByb3BlcnR5KGVsZW1lbnQsIHByb3BlcnR5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5nZXRJbWFnZShlbGVtZW50KTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5nZXRUZXh0KGVsZW1lbnQpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJRGVzY3JpcHRpb25Qcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5nZXREZXNjcmlwdGlvbihlbGVtZW50KTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSU1lbWVudG9Bd2FyZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQkvLyBubyBvcAotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQkvLyBubyBvcAotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIElDb21tb25MYWJlbFByb3ZpZGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQ29udGVudEV4dGVuc2lvblNpdGUgY29uZmlnKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQlKcGFOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gKEpwYU5hdmlnYXRvckNvbnRlbnRQcm92aWRlcikgY29uZmlnLmdldEV4dGVuc2lvbigpLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsICYmIGNvbnRlbnRQcm92aWRlci5kZWxlZ2F0ZSgpICE9IG51bGwpIHsKLQkJCQlkZWxlZ2F0ZSA9IGNvbnRlbnRQcm92aWRlci5kZWxlZ2F0ZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZGVsZWdhdGUgPSBuZXcgSnBhTmF2aWdhdG9yQ29udGVudEFuZExhYmVsUHJvdmlkZXIoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1MWZjMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgSnBhTmF2aWdhdG9yVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLXsKLQkvKioKLQkgKiBFeGFjdGx5ICpvbmUqIG9mIHRoZXNlIGZhY3RvcmllcyBpcyBjcmVhdGVkIGZvciBlYWNoIHZpZXcgdGhhdCB1dGlsaXplcyBpdC4gIAotCSAqIFRoZXJlZm9yZSwgYXMgd2UgZGVsZWdhdGUgdG8gdGhlIHBsYXRmb3JtIFVJIGZvciBlYWNoIHByb2plY3QsIHdlIHNob3VsZCAKLQkgKiBtYWludGFpbiB0aGUgc2FtZSBtdWx0aXBsaWNpdHkuICBUaGF0IGlzLCBpZiB0aGVyZSBpcyBhIGRlbGVnYXRlIGZvciBlYWNoIAotCSAqIHBsYXRmb3JtIFVJLCB3ZSBzaG91bGQgbWFpbnRhaW4gKm9uZSogZGVsZWdhdGUgZm9yIGVhY2ggdmlldy4KLQkgKiAKLQkgKiBLZXk6IHBsYXRmb3JtIGlkLCAgVmFsdWU6IGRlbGVnYXRlIGNvbnRlbnQgcHJvdmlkZXIgZmFjdG9yeQotCSAqLwotCXByaXZhdGUgTWFwPFN0cmluZywgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5PiBkZWxlZ2F0ZXM7Ci0JCi0JCi0JcHVibGljIEpwYU5hdmlnYXRvclRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kZWxlZ2F0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeT4oKTsKLQl9Ci0JCi0JcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCVRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBkZWxlZ2F0ZSA9IGdldERlbGVnYXRlKGl0ZW0pOwotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlLmJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXByaXZhdGUgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGdldERlbGVnYXRlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICghIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlKcGFDb250ZXh0Tm9kZSBjb250ZXh0Tm9kZSA9IChKcGFDb250ZXh0Tm9kZSkgKChJQWRhcHRhYmxlKSBlbGVtZW50KS5nZXRBZGFwdGVyKEpwYUNvbnRleHROb2RlLmNsYXNzKTsKLQkJCi0JCWlmIChjb250ZXh0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSnBhUGxhdGZvcm0gcGxhdGZvcm0gPSBjb250ZXh0Tm9kZS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKTsKLQkJU3RyaW5nIHBsYXRmb3JtSWQgPSBwbGF0Zm9ybS5nZXRJZCgpOwotCQlpZiAoZGVsZWdhdGVzLmNvbnRhaW5zS2V5KHBsYXRmb3JtSWQpKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGVzLmdldChwbGF0Zm9ybUlkKTsKLQkJfQotCQlKcGFOYXZpZ2F0b3JQcm92aWRlciBuYXZpZ2F0b3JQcm92aWRlciA9IEpwdFVpUGx1Z2luLmluc3RhbmNlKCkuZ2V0SnBhTmF2aWdhdG9yUHJvdmlkZXIocGxhdGZvcm0pOwotCQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZGVsZWdhdGUgPSBudWxsOwotCQlpZiAobmF2aWdhdG9yUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUgPSBuYXZpZ2F0b3JQcm92aWRlci5nZXRUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKTsKLQkJfQotCQlkZWxlZ2F0ZXMucHV0KHBsYXRmb3JtSWQsIGRlbGVnYXRlKTsKLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL0pwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYWFmNWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBwZXJzaXN0ZW5jZSBlZGl0b3IuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm9vbGVhbl9GYWxzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX1RydWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2dfamFyUGF0aEhlbHBMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcmNoaXZlRmlsZVNlbGVjdGlvbkRpYWxvZ19qYXJQYXRoTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZUVkaXRvcl9wYWdlX2hlbHA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VFZGl0b3Jfc291cmNlVGFiOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX2V4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9tYXBwZWRDbGFzc2VzTm9OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfb3BlbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGVfY29ubmVjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlX2RhdGFiYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGVfZ2VuZXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZV9qdGFEYXRhc291cmNlTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGVfbm9uSnRhRGF0YXNvdXJjZU5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZV9kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX2p0YTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZV9yZXNvdXJjZV9sb2NhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZV90cmFuc2FjdGlvblR5cGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2dlbmVyYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qYXJGaWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2pwYU1hcHBpbmdEZXNjcmlwdG9yczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2pwYU1hcHBpbmdEZXNjcmlwdG9yc19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX21hcHBlZENsYXNzZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfcGVyc2lzdGVuY2VQcm92aWRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2Rlc2NyaXB0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlX25vRmlsZU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX2phckZpbGVEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX2phckZpbGVEaWFsb2dfbWVzc2FnZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGVfbWFwcGluZ0ZpbGVEaWFsb2dfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGVfbWFwcGluZ0ZpbGVEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX29ybU5vTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGVfbmFtZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlX3Byb3BlcnRpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZV9wcm9wZXJ0aWVzX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGVfdmFsdWVDb2x1bW47Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X3VpX3BlcnNpc3RlbmNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5jbGFzczsKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOwotCX0KLQotCXByaXZhdGUgSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0Fic3RyYWN0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2M4MGQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLlBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIGRlZmluaXRpb24gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZSBpdCBpcyBpbml0aWFsaXplZCkuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24KLQlpbXBsZW1lbnRzIFJlc291cmNlVWlEZWZpbml0aW9uLCBQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JCi0JCi0JcHJpdmF0ZSBmaW5hbCBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBmYWN0b3J5OwotCQotCQotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmZhY3RvcnkgPSBidWlsZFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBidWlsZFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCk7Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiB0aGlzLmZhY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SnBhUGFnZUNvbXBvc2l0ZT4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGVzKFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsIENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gdGhpcy5mYWN0b3J5LmNyZWF0ZVBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZXMoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0FyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0FyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Y2M0YjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9BcmNoaXZlRmlsZVNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BcmNoaXZlRmlsZVZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2cgCi0JZXh0ZW5kcyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZwotewotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBqYXJQYXRoTW9kZWw7Ci0JCi0JcHJpdmF0ZSBEZXBsb3ltZW50UGF0aENhbGN1bGF0b3IgcGF0aENhbGN1bGF0b3I7Ci0JCi0JCi0JcHVibGljIEFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQl0aGlzKHBhcmVudCwgbmV3IFNpbXBsZURlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcigpKTsKLQl9Ci0JCi0JcHVibGljIEFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudCwgRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yIHBhdGhDYWxjdWxhdG9yKSB7Ci0JCXN1cGVyKHBhcmVudCwgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLQkJdGhpcy5wYXRoQ2FsY3VsYXRvciA9IHBhdGhDYWxjdWxhdG9yOwotCQlzZXRDb21wYXJhdG9yKG5ldyBSZXNvdXJjZUNvbXBhcmF0b3IoUmVzb3VyY2VDb21wYXJhdG9yLk5BTUUpKTsKLQkJYWRkRmlsdGVyKG5ldyBBcmNoaXZlRmlsZVZpZXdlckZpbHRlcigpKTsKLQkJc2V0VmFsaWRhdG9yKG5ldyBBcmNoaXZlRmlsZVNlbGVjdGlvblZhbGlkYXRvcigpKTsKLQkJdGhpcy5qYXJQYXRoTW9kZWwgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCQotCQlMYWJlbCBoZWxwTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCWhlbHBMYWJlbC5zZXRUZXh0KEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5BcmNoaXZlRmlsZVNlbGVjdGlvbkRpYWxvZ19qYXJQYXRoSGVscExhYmVsKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gNDAwOwotCQloZWxwTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlDb21wb3NpdGUgc3ViQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJc3ViQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlzdWJDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQlMYWJlbCBqYXJQYXRoTGFiZWwgPSBuZXcgTGFiZWwoc3ViQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWphclBhdGhMYWJlbC5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCQlqYXJQYXRoTGFiZWwuc2V0VGV4dChKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2dfamFyUGF0aExhYmVsKTsKLQkJCi0JCVRleHQgamFyUGF0aFRleHQgPSBuZXcgVGV4dChzdWJDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlqYXJQYXRoVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJU1dUVG9vbHMuYmluZChqYXJQYXRoTW9kZWwsIGphclBhdGhUZXh0KTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUcmVlVmlld2VyIGRvQ3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJVHJlZVZpZXdlciB0cmVlVmlld2VyID0gc3VwZXIuZG9DcmVhdGVUcmVlVmlld2VyKHBhcmVudCwgc3R5bGUpOwotCQkKLQkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQl1cGRhdGVKYXJQYXRoTW9kZWwoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0pOwotCQkKLQkJcmV0dXJuIHRyZWVWaWV3ZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUphclBhdGhNb2RlbChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3Qgc2VsZWN0ZWRPYmogPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoc2VsZWN0ZWRPYmogaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJdGhpcy5qYXJQYXRoTW9kZWwuc2V0VmFsdWUoY2FsY3VsYXRlRGVwbG95UGF0aCgoSUZpbGUpIHNlbGVjdGVkT2JqKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmphclBhdGhNb2RlbC5zZXRWYWx1ZSgiIik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBjYWxjdWxhdGVEZXBsb3lQYXRoKElGaWxlIGFyY2hpdmVGaWxlKSB7Ci0JCXJldHVybiB0aGlzLnBhdGhDYWxjdWxhdG9yLmNhbGN1bGF0ZURlcGxveW1lbnRQYXRoKGFyY2hpdmVGaWxlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlc3VsdCgpIHsKLQkJc2V0UmVzdWx0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodGhpcy5qYXJQYXRoTW9kZWwuZ2V0VmFsdWUoKSkpOwotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBBcmNoaXZlRmlsZVNlbGVjdGlvblZhbGlkYXRvciAKLQkJaW1wbGVtZW50cyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIAotCXsKLQkJcHVibGljIEFyY2hpdmVGaWxlU2VsZWN0aW9uVmFsaWRhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotCQkJaW50IG5TZWxlY3RlZD0gc2VsZWN0aW9uLmxlbmd0aDsKLQkJCWlmIChuU2VsZWN0ZWQgPT0gMCB8fCAoblNlbGVjdGVkID4gMSkpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWZvciAoaW50IGk9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgY3Vycj0gc2VsZWN0aW9uW2ldOwotCQkJCWlmIChjdXJyIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSnB0VWlQbHVnaW4uUExVR0lOX0lELCAiIik7ICAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0VWlQbHVnaW4uUExVR0lOX0lELCAiIik7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9CQotCQotCQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIERlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcgotCXsKLQkJU3RyaW5nIGNhbGN1bGF0ZURlcGxveW1lbnRQYXRoKElGaWxlIGZpbGUpOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZURlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcgotCQlpbXBsZW1lbnRzIERlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcgotCXsKLQkJcHVibGljIFN0cmluZyBjYWxjdWxhdGVEZXBsb3ltZW50UGF0aChJRmlsZSBmaWxlKSB7Ci0JCQlyZXR1cm4gZmlsZS5nZXROYW1lKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBNb2R1bGVEZXBsb3ltZW50UGF0aENhbGN1bGF0b3IKLQkJZXh0ZW5kcyBTaW1wbGVEZXBsb3ltZW50UGF0aENhbGN1bGF0b3IKLQl7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZURlcGxveW1lbnRQYXRoKElGaWxlIGZpbGUpIHsKLQkJCS8vIGZpcnN0IGxvb2sgZm9yIHZpcnR1YWwgY29tcG9uZW50IHRoYXQgbWF0Y2hlcyB0aGlzIGZpbGUsIHJldHVybmluZwotCQkJLy8gdGhlIHBhdGggdG8gdGhhdCB2aXJ0dWFsIGNvbXBvbmVudAotCQkJSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCWlmICh2Q29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQlJVmlydHVhbEZvbGRlciB2Rm9sZGVyID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCQkJSVZpcnR1YWxGaWxlIHZGaWxlID0gZmluZFZpcnR1YWxGaWxlKHZGb2xkZXIsIGZpbGUpOwotCQkJCWlmICh2RmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBjYWxjdWxhdGVQZXJzaXN0ZW5jZVJvb3RSZWxhdGl2ZVBhdGgodkZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gdGhlbiBkZWZhdWx0IHRvIHNpbXBsZSBiZWhhdmlvcgotCQkJcmV0dXJuIHN1cGVyLmNhbGN1bGF0ZURlcGxveW1lbnRQYXRoKGZpbGUpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgSVZpcnR1YWxGaWxlIGZpbmRWaXJ0dWFsRmlsZShJVmlydHVhbENvbnRhaW5lciB2Q29udGFpbmVyLCBJRmlsZSByZWFsRmlsZSkgewotCQkJdHJ5IHsgCi0JCQkJZm9yIChJVmlydHVhbFJlc291cmNlIHZSZXNvdXJjZSA6IHZDb250YWluZXIubWVtYmVycygpKSB7Ci0JCQkJCWlmICh2UmVzb3VyY2UuZ2V0VHlwZSgpID09IElWaXJ0dWFsUmVzb3VyY2UuRklMRSkgewotCQkJCQkJSVZpcnR1YWxGaWxlIHZGaWxlID0gKElWaXJ0dWFsRmlsZSkgdlJlc291cmNlOwotCQkJCQkJaWYgKHJlYWxGaWxlLmVxdWFscyh2RmlsZS5nZXRVbmRlcmx5aW5nRmlsZSgpKSkgewotCQkJCQkJCXJldHVybiB2RmlsZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUlWaXJ0dWFsRmlsZSB2RmlsZSA9IGZpbmRWaXJ0dWFsRmlsZSgoSVZpcnR1YWxDb250YWluZXIpIHZSZXNvdXJjZSwgcmVhbEZpbGUpOwotCQkJCQkJaWYgKHZGaWxlICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gdkZpbGU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCUpwdFVpUGx1Z2luLmxvZyhjZSk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgU3RyaW5nIGNhbGN1bGF0ZVBlcnNpc3RlbmNlUm9vdFJlbGF0aXZlUGF0aChJVmlydHVhbEZpbGUgdkZpbGUpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSB2RmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQlJUGF0aCBwdVJvb3RQYXRoID0gSnB0Q29yZVBsdWdpbi5nZXRKYXJSdW50aW1lUm9vdFBhdGgocHJvamVjdCk7Ci0JCQkKLQkJCUlQYXRoIHBhdGggPSB2RmlsZS5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZVRvKHB1Um9vdFBhdGgpOwotCQkJCi0JCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9HZW5lcmljUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9HZW5lcmljUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTA0MzdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIEdlbmVyYWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgTmFtZTogICAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgUGVyc2lzdGVuY2UgUHJvdmlkZXI6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIE1hcHBlZCBDbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgUGVyc2lzdGVuY2VVbml0TWFwcGVkQ2xhc3Nlc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gWE1MIE1hcHBpbmcgRmlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Ci0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdE1hcHBlZENsYXNzZXNDb21wb3NpdGUKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZSBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhUGFnZUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBHZW5lcmljUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVNYXBwZWRDbGFzc2VzUGFuZShjb250YWluZXIpOwotCQlpbml0aWFsaXplSlBBTWFwcGluZ0Rlc2NyaXB0b3JzUGFuZShjb250YWluZXIpOwotCQlpbml0aWFsaXplSmFyRmlsZXNQYW5lKGNvbnRhaW5lcik7Ci0JfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUpQQU1hcHBpbmdEZXNjcmlwdG9yc1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2pwYU1hcHBpbmdEZXNjcmlwdG9ycywKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2pwYU1hcHBpbmdEZXNjcmlwdG9yc19kZXNjcmlwdGlvbgotCQkpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7Ci0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lci5nZXRQYXJlbnQoKSk7Ci0KLQkJbmV3IEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUphckZpbGVzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfamFyRmlsZXMKLQkJKTsKLQkJCi0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7Ci0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lci5nZXRQYXJlbnQoKSk7Ci0JCQotCQluZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9HZW5lcmljUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OTU1OTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9HZW5lcmljUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUKLQlleHRlbmRzIFBlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlCi17Ci0JcHVibGljIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZSgKLQkJCVBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4gcGFyZW50UGFuZSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9HZW5lcmljUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMGMxMDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9HZW5lcmljUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXQKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIEFkZFJlbW92ZUxpc3RQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBHZW5lcmljUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRNYXBwaW5nRmlsZXNMaXN0KGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvR2VuZXJpY1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0dlbmVyaWNQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWQwM2U4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvR2VuZXJpY1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5IGltcGxlbWVudHMgUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkKLXsKLQkvLyAqKioqKioqKioqKioqKioqIHBlcnNpc3RlbmNlIHVuaXQgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKcGFQYWdlQ29tcG9zaXRlPiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGVzKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlBcnJheUxpc3Q8SnBhUGFnZUNvbXBvc2l0ZT4gcGFnZXMgPSBuZXcgQXJyYXlMaXN0PEpwYVBhZ2VDb21wb3NpdGU+KDMpOwotCi0JCXBhZ2VzLmFkZChuZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCXBhZ2VzLmFkZChuZXcgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJcGFnZXMuYWRkKG5ldyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOwotCi0JCXJldHVybiBwYWdlcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYzcyZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IHggRXhjbHVkZSBVbmxpc3RlZCBNYXBwZWQgQ2xhc3NlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXQKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIEFkZFJlbW92ZUxpc3RQYW5lCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPFBlcnNpc3RlbmNlVW5pdD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdE1hcHBlZENsYXNzZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTWFwcGVkQ2xhc3MoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk7Ci0JCQlpZihjbGFzc1JlZkV4aXN0cyhjbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBnZXRTdWJqZWN0KCkuYWRkU3BlY2lmaWVkQ2xhc3NSZWYoY2xhc3NOYW1lKTsKLQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGNsYXNzUmVmKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2xhc3NSZWZFeGlzdHMoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlmb3IgKCBMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGkgPSBnZXRTdWJqZWN0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCUNsYXNzUmVmIGNsYXNzUmVmID0gaS5uZXh0KCk7Ci0JCQlpZiggY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRNYXBwZWRDbGFzcyhsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGVuYWJsZU9wdGlvbk9uU2VsZWN0aW9uQ2hhbmdlKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlpZiAoIXN1cGVyLmVuYWJsZU9wdGlvbk9uU2VsZWN0aW9uQ2hhbmdlKGxpc3RTZWxlY3Rpb25Nb2RlbCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXJldHVybiBmaW5kVHlwZSgoQ2xhc3NSZWYpIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCkpICE9IG51bGw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaGFzT3B0aW9uYWxCdXR0b24oKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX29wZW47Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCW9wZW5NYXBwZWRDbGFzcygoQ2xhc3NSZWYpIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVNwZWNpZmllZENsYXNzUmVmKChDbGFzc1JlZikgaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFeGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9FWENMVURFX1VOTElTVEVEX0NMQVNTRVNfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3Nlcyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEV4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXNTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRFeGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzV2l0aERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRFeGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9FWENMVURFX1VOTElTVEVEX0NMQVNTRVNfUFJPUEVSVFksCi0JCQlQZXJzaXN0ZW5jZVVuaXQuREVGQVVMVF9FWENMVURFX1VOTElTVEVEX0NMQVNTRVNfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCUNsYXNzUmVmIGNsYXNzUmVmID0gKENsYXNzUmVmKSBlbGVtZW50OwotCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkJCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQkJCWlmIChwZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJCWltYWdlID0gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yVHlwZU1hcHBpbmcocGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIEpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuV0FSTklORyk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSAoQ2xhc3NSZWYpIGVsZW1lbnQ7Ci0JCQkJU3RyaW5nIG5hbWUgPSBjbGFzc1JlZi5nZXRDbGFzc05hbWUoKTsKLQotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX21hcHBlZENsYXNzZXNOb05hbWU7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxDbGFzc1JlZj4gYnVpbGRJdGVtTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Q2xhc3NSZWY+KAotCQkJYnVpbGRMaXN0SG9sZGVyKCksCi0JCQlDbGFzc1JlZi5KQVZBX1BFUlNJU1RFTlRfVFlQRV9QUk9QRVJUWSwKLQkJCUNsYXNzUmVmLkNMQVNTX05BTUVfUFJPUEVSVFkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPENsYXNzUmVmPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBDbGFzc1JlZj4oZ2V0U3ViamVjdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX0NMQVNTX1JFRlNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZENsYXNzUmVmcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q2xhc3NSZWY+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxDbGFzc1JlZj4oKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHRoZSB1c2VyIHRoZSBPcGVuIFR5cGUgZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgdGhlIHNlbGVjdGVkIHR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHVzZXIKLQkgKiBjYW5jZWxlZCB0aGUgZGlhbG9nCi0JICovCi0JcHJpdmF0ZSBJVHlwZSBjaG9vc2VUeXBlKCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgpOwotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IGphdmFQcm9qZWN0IH07Ci0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJU2VsZWN0aW9uRGlhbG9nIHR5cGVTZWxlY3Rpb25EaWFsb2c7Ci0KLQkJdHJ5IHsKLQkJCXR5cGVTZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZygKLQkJCQlnZXRTaGVsbCgpLAotCQkJCXNlcnZpY2UsCi0JCQkJc2NvcGUsCi0JCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsCi0JCQkJZmFsc2UsCi0JCQkJIiIKLQkJCSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5DbGFzc0Nob29zZXJQYW5lX2RpYWxvZ1RpdGxlKTsKLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKEpwdFVpTWVzc2FnZXMuQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlKTsKLQotCQlpZiAodHlwZVNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gKElUeXBlKSB0eXBlU2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZSBmaW5kVHlwZShDbGFzc1JlZiBjbGFzc1JlZikgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCk7Ci0KLQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoY2xhc3NOYW1lLnJlcGxhY2UoJyQnLCAnLicpKTsKLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIERlc2NyaXB0aW9uCi0JCWFkZE11bHRpTGluZUxhYmVsKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfZGVzY3JpcHRpb24KLQkJKTsKLQotCQkvLyBMaXN0IHBhbmUKLQkJbmV3IEFkZFJlbW92ZUxpc3RQYW5lPFBlcnNpc3RlbmNlVW5pdD4oCi0JCQl0aGlzLAotCQkJY29udGFpbmVyLAotCQkJdGhpcy5idWlsZEFkYXB0ZXIoKSwKLQkJCXRoaXMuYnVpbGRJdGVtTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJdGhpcy5idWlsZExhYmVsUHJvdmlkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9HRU5FUkFMCi0JCSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVGFibGUoVGFibGUgdGFibGUpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplVGFibGUodGFibGUpOwotCi0JCQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRhYmxlLmdldFBhcmVudCgpOwotCQkJCUdyaWREYXRhIGdyaWREYXRhICAgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDc1OwotCQkJfQotCQl9OwotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3NlcywKLQkJCWJ1aWxkRXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlc0hvbGRlcigpLAotCQkJYnVpbGRFeGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfR0VORVJBTAotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuTWFwcGVkQ2xhc3MoQ2xhc3NSZWYgY2xhc3NSZWYpIHsKLQotCQlJVHlwZSB0eXBlID0gZmluZFR5cGUoY2xhc3NSZWYpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gdHlwZS5nZXRQYXJlbnQoKTsKLQkJCQlKYXZhVUkub3BlbkluRWRpdG9yKGphdmFFbGVtZW50LCB0cnVlLCB0cnVlKTsKLQkJCX0KLQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmI4NWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBHZW5lcmFsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gRGF0YWJhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Ci0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8UGVyc2lzdGVuY2VVbml0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgICAgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggICAgID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCAgICAgICA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ICAgICAgPSAwOwotCQlsYXlvdXQubWFyZ2luQm90dG9tICAgID0gMDsKLQkJbGF5b3V0Lm1hcmdpblJpZ2h0ICAgICA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQotCQlDb21wb3NpdGUgY29udGFpbmVyID0gYWRkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7Ci0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRGF0YWJhc2VQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBhZGRTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGVfZGF0YWJhc2UKLQkJKTsKLQotCQluZXcgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVHZW5lcmFsUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYWRkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlX2dlbmVyYWwKLQkJKTsKLQotCQluZXcgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbml0aWFsaXplR2VuZXJhbFBhbmUoY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZURhdGFiYXNlUGFuZShjb250YWluZXIpOwotCX0KLQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0UGFnZUltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlVGV4dCgpIHsKLQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlX2Nvbm5lY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgICA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgICAgICAgICA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTZjNmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgSlRBIERhdGFzb3VyY2UgTmFtZTogICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTm9uLUpUQSBEYXRhc291cmNlIE5hbWU6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdAotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8UGVyc2lzdGVuY2VVbml0PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlKFBhbmU8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRKVEFEYXRhc291cmNlTmFtZUJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLCBCb29sZWFuPihidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRKVEFEYXRhc291cmNlTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0LkpUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldEp0YURhdGFTb3VyY2UoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldEp0YURhdGFTb3VyY2UodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTm9uSlRBRGF0YXNvdXJjZU5hbWVCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSwgQm9vbGVhbj4oYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUgPT0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROb25KVEFEYXRhc291cmNlTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0Lk5PTl9KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXROb25KdGFEYXRhU291cmNlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXROb25KdGFEYXRhU291cmNlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlQZXJzaXN0ZW5jZVVuaXQuREVGQVVMVF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZLAotCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gSlRBIERhdGFzb3VyY2UgTmFtZSB3aWRnZXRzCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkID0gdGhpcy5idWlsZEpUQURhdGFzb3VyY2VOYW1lQm9vbGVhbkhvbGRlcigpOwotCQlMYWJlbCBsYWJlbCA9IGFkZExhYmVsKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGVfanRhRGF0YXNvdXJjZU5hbWUsCi0JCQllbmFibGVkCi0JCSk7Ci0JCVRleHQgdGV4dCA9IGFkZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlidWlsZEpUQURhdGFzb3VyY2VOYW1lSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTiwKLQkJCWVuYWJsZWQKLQkJKTsKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZShjb250YWluZXIsIGxhYmVsLCB0ZXh0LCBKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTik7Ci0JCQotCQkKLQkJLy8gTm9uLUpUQSBEYXRhc291cmNlIE5hbWUgd2lkZ2V0cwotCQllbmFibGVkID0gdGhpcy5idWlsZE5vbkpUQURhdGFzb3VyY2VOYW1lQm9vbGVhbkhvbGRlcigpOwotCQlsYWJlbCA9IGFkZExhYmVsKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGVfbm9uSnRhRGF0YXNvdXJjZU5hbWUsCi0JCQllbmFibGVkCi0JCSk7Ci0JCXRleHQgPSBhZGRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJYnVpbGROb25KVEFEYXRhc291cmNlTmFtZUhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04sCi0JCQllbmFibGVkCi0JCSk7Ci0JCWFkZExhYmVsZWRDb21wb3NpdGUoY29udGFpbmVyLCBsYWJlbCwgdGV4dCwgSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MjkzZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgVHJhbnNhY3Rpb24gVHlwZTogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdAotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxQZXJzaXN0ZW5jZVVuaXQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlKFBhbmU8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IGJ1aWxkVHJhbnNhY3Rpb25UeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW5jZVVuaXQuREVGQVVMVF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuY2xhc3MsCi0JCQkJCVBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlLnRoaXMsCi0JCQkJCXZhbHVlCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gVHJhbnNhY3Rpb24gVHlwZSB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGVfdHJhbnNhY3Rpb25UeXBlLAotCQkJYnVpbGRUcmFuc2FjdGlvblR5cGVDb21ibyhjb250YWluZXIpLmdldENvbnRyb2woKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmMTQwMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIEdlbmVyYWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgTmFtZTogICAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgUGVyc2lzdGVuY2UgUHJvdmlkZXI6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIE1hcHBlZCBDbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgUGVyc2lzdGVuY2VVbml0TWFwcGVkQ2xhc3Nlc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gWE1MIE1hcHBpbmcgRmlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBKQVIgRmlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8IFBlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXQKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0TWFwcGVkQ2xhc3Nlc0NvbXBvc2l0ZQotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPFBlcnNpc3RlbmNlVW5pdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhUGFnZUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBhZGRTdWJQYW5lKHBhcmVudCk7Ci0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7Ci0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQZXJzaXN0ZW5jZVByb3ZpZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuUFJPVklERVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQcm92aWRlcigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0UHJvdmlkZXIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFBlcnNpc3RlbmNlVW5pdE5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIFBlcnNpc3RlbmNlVW5pdC5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFBlcnNpc3RlbmNlVW5pdERlc2NyaXB0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuREVTQ1JJUFRJT05fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0RGVzY3JpcHRpb24odmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SGVscElEKCkgewotCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0dFTkVSQUw7Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgewotCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfZ2VuZXJhbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IHRoaXMuYWRkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2dlbmVyYWwKLQkJKTsKLQotCQkvLyBOYW1lIHdpZGdldHMKLQkJdGhpcy5hZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX25hbWUsCi0JCQl0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0TmFtZUhvbGRlcigpLAotCQkJdGhpcy5nZXRIZWxwSUQoKQotCQkpOwotCi0JCS8vIFBlcnNpc3RlbmNlIFByb3ZpZGVyIHdpZGdldHMKLQkJdGhpcy5hZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX3BlcnNpc3RlbmNlUHJvdmlkZXIsCi0JCQl0aGlzLmJ1aWxkUGVyc2lzdGVuY2VQcm92aWRlckhvbGRlcigpLAotCQkJdGhpcy5nZXRIZWxwSUQoKQotCQkpOwotCi0JCS8vIERlc2NyaXB0aW9uIHdpZGdldHMKLQkJdGhpcy5hZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2Rlc2NyaXB0aW9uLAotCQkJdGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdERlc2NyaXB0aW9uSG9sZGVyKCksCi0JCQl0aGlzLmdldEhlbHBJRCgpCi0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hcHBlZENsYXNzZXNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9tYXBwZWRDbGFzc2VzCi0JCSk7Ci0KLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyLmdldFBhcmVudCgpKTsKLQotCQluZXcgUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlICAgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ICAgICAgICAgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzMDg5Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5KYXJGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUG9zdEV4ZWN1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Ci0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBBZGRSZW1vdmVMaXN0UGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUgCi0JZXh0ZW5kcyBQYW5lPFBlcnNpc3RlbmNlVW5pdD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdEpQQU1hcHBpbmdEZXNjcmlwdG9yc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0PiBwYXJlbnRQYW5lLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRKYXJGaWxlc0xpc3QoY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmFyRmlsZXNMaXN0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gTGlzdCBwYW5lCi0JCW5ldyBBZGRSZW1vdmVMaXN0UGFuZTxQZXJzaXN0ZW5jZVVuaXQ+KAotCQkJdGhpcywKLQkJCWNvbnRhaW5lciwKLQkJCXRoaXMuYnVpbGRBZGFwdGVyKCksCi0JCQl0aGlzLmJ1aWxkSXRlbUxpc3RIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRMYWJlbFByb3ZpZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfR0VORVJBTAotCQkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCXBhcmVudCA9IHN1cGVyLmFkZENvbnRhaW5lcihwYXJlbnQpOwotCQkJCXVwZGF0ZUdyaWREYXRhKHBhcmVudCk7Ci0JCQkJcmV0dXJuIHBhcmVudDsKLQkJCX0KLQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZUxheW91dChjb250YWluZXIpOwotCQkJCXVwZGF0ZUdyaWREYXRhKGdldENvbnRhaW5lcigpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlICAgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ICAgICAgICAgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWFkZEphckZpbGVSZWYobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCWdldFN1YmplY3QoKS5yZW1vdmVKYXJGaWxlUmVmKChKYXJGaWxlUmVmKSBpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8SmFyRmlsZVJlZj4gYnVpbGRJdGVtTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SmFyRmlsZVJlZj4oCi0JCQlidWlsZExpc3RIb2xkZXIoKSwKLQkJCUphckZpbGVSZWYuRklMRV9OQU1FX1BST1BFUlRZCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8SmFyRmlsZVJlZj4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgSmFyRmlsZVJlZj4oZ2V0U3ViamVjdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuSkFSX0ZJTEVfUkVGU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8SmFyRmlsZVJlZj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmphckZpbGVSZWZzKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmphckZpbGVSZWZzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEphckZpbGVSZWY+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKYXJGaWxlUmVmPigpOwotCX0KLQkKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KQVJfRklMRV9SRUYpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCUphckZpbGVSZWYgamFyRmlsZVJlZiA9IChKYXJGaWxlUmVmKSBlbGVtZW50OwotCQkJCVN0cmluZyBuYW1lID0gamFyRmlsZVJlZi5nZXRGaWxlTmFtZSgpOwotCQkJCQotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZV9ub0ZpbGVOYW1lOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEphckZpbGVSZWYoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0KLQkJRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nKAotCQkJZ2V0U2hlbGwoKSwgYnVpbGRKYXJGaWxlRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yKCkpOwotCQkKLQkJZGlhbG9nLnNldEhlbHBBdmFpbGFibGUoZmFsc2UpOwotCQlkaWFsb2cuc2V0VGl0bGUoSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9qYXJGaWxlRGlhbG9nX3RpdGxlKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9qYXJGaWxlRGlhbG9nX21lc3NhZ2UpOwotCQlkaWFsb2cuc2V0SW5wdXQocHJvamVjdCk7Ci0JCQotCQlTV1RVdGlsLnNob3coCi0JCQlkaWFsb2csCi0JCQlidWlsZFNlbGVjdGlvbkRpYWxvZ1Bvc3RFeGVjdXRpb24obGlzdFNlbGVjdGlvbk1vZGVsKQotCQkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2cuRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yIGJ1aWxkSmFyRmlsZURlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBBcmNoaXZlRmlsZVNlbGVjdGlvbkRpYWxvZy5Nb2R1bGVEZXBsb3ltZW50UGF0aENhbGN1bGF0b3IoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nPiBidWlsZFNlbGVjdGlvbkRpYWxvZ1Bvc3RFeGVjdXRpb24oCi0JCQlmaW5hbCBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJZm9yIChPYmplY3QgcmVzdWx0IDogZGlhbG9nLmdldFJlc3VsdCgpKSB7Ci0JCQkJCVN0cmluZyBmaWxlUGF0aCA9IChTdHJpbmcpIHJlc3VsdDsKLQkJCQkJaWYgKGphckZpbGVSZWZFeGlzdHMoZmlsZVBhdGgpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlKYXJGaWxlUmVmIGphckZpbGVSZWYgPSBnZXRTdWJqZWN0KCkuYWRkSmFyRmlsZVJlZihmaWxlUGF0aCk7Ci0KLQkJCQkJbGlzdFNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGVkVmFsdWUoamFyRmlsZVJlZik7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gamFyRmlsZVJlZkV4aXN0cyhTdHJpbmcgZmlsZU5hbWUpIHsKLQkJZm9yIChKYXJGaWxlUmVmIGVhY2ggOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoZ2V0U3ViamVjdCgpLmphckZpbGVSZWZzKCkpKSB7Ci0JCQlpZiAoZWFjaC5nZXRGaWxlTmFtZSgpLmVxdWFscyhmaWxlTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MTg0NDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5YbWxNYXBwaW5nRmlsZVZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUG9zdEV4ZWN1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLlJlc291cmNlQ29tcGFyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlCi0JCWV4dGVuZHMgUGFuZTxQZXJzaXN0ZW5jZVVuaXQ+IHsKLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0PiBwYXJlbnRQYW5lLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYXBwaW5nRmlsZXNMaXN0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gTGlzdCBwYW5lCi0JCW5ldyBBZGRSZW1vdmVMaXN0UGFuZTxQZXJzaXN0ZW5jZVVuaXQ+KAotCQkJCXRoaXMsCi0JCQkJY29udGFpbmVyLAotCQkJCWJ1aWxkQWRhcHRlcigpLAotCQkJCWJ1aWxkSXRlbUxpc3RIb2xkZXIoKSwKLQkJCQlidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpLAotCQkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9HRU5FUkFMKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCXBhcmVudCA9IHN1cGVyLmFkZENvbnRhaW5lcihwYXJlbnQpOwotCQkJCXVwZGF0ZUdyaWREYXRhKHBhcmVudCk7Ci0JCQkJcmV0dXJuIHBhcmVudDsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplTGF5b3V0KGNvbnRhaW5lcik7Ci0JCQkJdXBkYXRlR3JpZERhdGEoZ2V0Q29udGFpbmVyKCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBQcm9tcHRzIGEgZGlhbG9nIHNob3dpbmcgYSB0cmVlIHN0cnVjdHVyZSBvZiB0aGUgc291cmNlIHBhdGhzIHdoZXJlIHRoZQotCSAqIG9ubHkgZmlsZXMgc2hvd24gYXJlIEpQQSBtYXBwaW5nIGRlc2NyaXB0b3JzIGZpbGUuIFRoZSBYTUwgZmlsZSBoYXMgdG8gYmUKLQkgKiBhbiBYTUwgZmlsZSB3aXRoIHRoZSByb290IHRhZzoge0Bjb2RlIDxlbnRpdHktbWFwcGluZ3M+fS4KLQkgKgotCSAqIEBwYXJhbSBsaXN0U2VsZWN0aW9uTW9kZWwgVGhlIHNlbGVjdGlvbiBtb2RlbCB1c2VkIHRvIHNlbGVjdCB0aGUgbmV3IGZpbGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEpQQU1hcHBpbmdEZXNjcmlwdG9yKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCi0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJCi0JCUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZygKLQkJCQlnZXRTaGVsbCgpLAotCQkJCW5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCksCi0JCQkJbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLQkJCi0JCWRpYWxvZy5zZXRIZWxwQXZhaWxhYmxlKGZhbHNlKTsKLQkJZGlhbG9nLnNldFZhbGlkYXRvcihidWlsZFZhbGlkYXRvcigpKTsKLQkJZGlhbG9nLnNldFRpdGxlKEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGVfbWFwcGluZ0ZpbGVEaWFsb2dfdGl0bGUpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX21hcHBpbmdGaWxlRGlhbG9nX21lc3NhZ2UpOwotCQlkaWFsb2cuYWRkRmlsdGVyKG5ldyBYbWxNYXBwaW5nRmlsZVZpZXdlckZpbHRlcihnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpKSk7Ci0JCWRpYWxvZy5zZXRJbnB1dChwcm9qZWN0KTsKLQkJZGlhbG9nLnNldENvbXBhcmF0b3IobmV3IFJlc291cmNlQ29tcGFyYXRvcihSZXNvdXJjZUNvbXBhcmF0b3IuTkFNRSkpOwotCi0JCVNXVFV0aWwuc2hvdygKLQkJCQlkaWFsb2csCi0JCQkJYnVpbGRTZWxlY3Rpb25EaWFsb2dQb3N0RXhlY3V0aW9uKGxpc3RTZWxlY3Rpb25Nb2RlbCkpOwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWFkZEpQQU1hcHBpbmdEZXNjcmlwdG9yKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoKE1hcHBpbmdGaWxlUmVmKSBpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCAgICA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ICAgPSAwOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJbGF5b3V0Lm1hcmdpblJpZ2h0ICA9IDA7Ci0KLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IGFkZFBhbmUocGFyZW50LCBsYXlvdXQpOwotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8TWFwcGluZ0ZpbGVSZWY+IGJ1aWxkSXRlbUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPE1hcHBpbmdGaWxlUmVmPigKLQkJCQlidWlsZExpc3RIb2xkZXIoKSwKLQkJCQlNYXBwaW5nRmlsZVJlZi5GSUxFX05BTUVfUFJPUEVSVFkpOwotCX0KLQkKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5NQVBQSU5HX0ZJTEVfUkVGKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IChNYXBwaW5nRmlsZVJlZikgZWxlbWVudDsKLQkJCQlTdHJpbmcgbmFtZSA9IG1hcHBpbmdGaWxlUmVmLmdldEZpbGVOYW1lKCk7Ci0JCQkJCi0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9vcm1Ob05hbWU7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBNYXBwaW5nRmlsZVJlZj4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX01BUFBJTkdfRklMRV9SRUZTX0xJU1QpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNYXBwaW5nRmlsZVJlZj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPigpOwotCX0KLQkKLQlwcml2YXRlIFBvc3RFeGVjdXRpb248RWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c+IGJ1aWxkU2VsZWN0aW9uRGlhbG9nUG9zdEV4ZWN1dGlvbigKLQkJCWZpbmFsIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCi0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZz4oKSB7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nKSB7Ci0JCQkJCi0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkKLQkJCQlmb3IgKE9iamVjdCByZXN1bHQgOiBkaWFsb2cuZ2V0UmVzdWx0KCkpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzdWx0OwotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gSnB0Q29yZVBsdWdpbi5nZXRSZXNvdXJjZUxvY2F0b3IocHJvamVjdCkuZ2V0UnVudGltZVBhdGgocHJvamVjdCwgZmlsZS5nZXRGdWxsUGF0aCgpKTsKLQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gcnVudGltZVBhdGgudG9Qb3J0YWJsZVN0cmluZygpOwotCQkJCQlpZiAobWFwcGluZ0ZpbGVSZWZFeGlzdHMoZmlsZU5hbWUpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IGdldFN1YmplY3QoKS5hZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZihmaWxlTmFtZSk7Ci0JCQkJCQotCQkJCQlsaXN0U2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRWYWx1ZShtYXBwaW5nRmlsZVJlZik7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gbWFwcGluZ0ZpbGVSZWZFeGlzdHMoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWZvciAoIExpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gaSA9IGdldFN1YmplY3QoKS5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBpLm5leHQoKTsKLQkJCWlmKCBtYXBwaW5nRmlsZVJlZi5nZXRGaWxlTmFtZSgpLmVxdWFscyhmaWxlTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciBidWlsZFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yKCkgewotCQkJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gc2VsZWN0aW9uKSB7Ci0KLQkJCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgIiIpOwotCQkJCX0KLQotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBzZWxlY3Rpb24pIHsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsICIiKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgIiIpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlICAgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ICAgICAgICAgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Y1NDI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkJhc2VKYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlVGFibGVQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtIFByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgQWRkUmVtb3ZlVGFibGVQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdAotICogQHNlZSBCYXNlSmF2YVVpRmFjdG9yeSAtIFRoZSBpbnZva2VyCi0gKiBAc2VlIEFkZFJlbW92ZVRhYmxlUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxQZXJzaXN0ZW5jZVVuaXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gcHJvcGVydHlIb2xkZXI7Ci0JcHJpdmF0ZSBUYWJsZVBhbmUgdGFibGVQYW5lOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IGJ1aWxkUHJvcGVydGllc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0LlBST1BFUlRJRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5wcm9wZXJ0aWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5wcm9wZXJ0aWVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSVRhYmxlTGFiZWxQcm92aWRlciBidWlsZFByb3BlcnR5TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIEFkZFJlbW92ZVRhYmxlUGFuZS5BZGFwdGVyIGJ1aWxkVGFibGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZVRhYmxlUGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gZ2V0U3ViamVjdCgpLmFkZFByb3BlcnR5KCk7Ci0JCQkJcHJvcGVydHlIb2xkZXIuc2V0VmFsdWUocHJvcGVydHkpOwotCi0JCQkJdGFibGVQYW5lLmdldFRhYmxlVmlld2VyKCkuZWRpdEVsZW1lbnQoCi0JCQkJCXByb3BlcnR5LAotCQkJCQlQcm9wZXJ0eUNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4KLQkJCQkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVByb3BlcnR5KChQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkpIGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9QUk9QRVJUSUVTOwotCX0KLQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0UGFnZUltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlVGV4dCgpIHsKLQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlX3Byb3BlcnRpZXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQlwcm9wZXJ0eUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWFkZExhYmVsKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGVfcHJvcGVydGllc19kZXNjcmlwdGlvbgotCQkpOwotCi0JCXRhYmxlUGFuZSA9IG5ldyBUYWJsZVBhbmUoY29udGFpbmVyKTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFByb3BlcnR5Q29sdW1uQWRhcHRlciBpbXBsZW1lbnRzIENvbHVtbkFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiB7Ci0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NPVU5UID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9DT0xVTU4gPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RJT05fQ09MVU1OID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfQ09MVU1OID0gMjsKLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHksIFN0cmluZz4oUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5Lk5BTUVfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlzdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRWYWx1ZUhvbGRlcihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5LCBTdHJpbmc+KFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSwgc3ViamVjdCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmdldFZhbHVlKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlzdWJqZWN0LnNldFZhbHVlKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHVibGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gY2VsbE1vZGVscyhQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgc3ViamVjdCkgewotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBob2xkZXJzID0gbmV3IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W0NPTFVNTl9DT1VOVF07Ci0JCQlob2xkZXJzW1NFTEVDVElPTl9DT0xVTU5dID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JCQlob2xkZXJzW05BTUVfQ09MVU1OXSAgICAgID0gYnVpbGROYW1lSG9sZGVyKHN1YmplY3QpOwotCQkJaG9sZGVyc1tWQUxVRV9DT0xVTU5dICAgICA9IGJ1aWxkVmFsdWVIb2xkZXIoc3ViamVjdCk7Ci0JCQlyZXR1cm4gaG9sZGVyczsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29sdW1uQ291bnQoKSB7Ci0JCQlyZXR1cm4gQ09MVU1OX0NPVU5UOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBjb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSBQcm9wZXJ0eUNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU46IHsKLQkJCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlX25hbWVDb2x1bW47Ci0JCQkJfQotCi0JCQkJY2FzZSBQcm9wZXJ0eUNvbHVtbkFkYXB0ZXIuVkFMVUVfQ09MVU1OOiB7Ci0JCQkJCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZV92YWx1ZUNvbHVtbjsKLQkJCQl9Ci0KLQkJCQlkZWZhdWx0OiB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQotCQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSkgZWxlbWVudDsKLQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIFByb3BlcnR5Q29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTjogewotCQkJCQl2YWx1ZSA9IHByb3BlcnR5LmdldE5hbWUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJY2FzZSBQcm9wZXJ0eUNvbHVtbkFkYXB0ZXIuVkFMVUVfQ09MVU1OOiB7Ci0JCQkJCXZhbHVlID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCXZhbHVlID0gIiI7Ci0JCQl9Ci0KLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFibGVQYW5lIGV4dGVuZHMgQWRkUmVtb3ZlVGFibGVQYW5lPFBlcnNpc3RlbmNlVW5pdD4gewotCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nIFNFTEVDVElPTl9DT0xVTU4gPSAic2VsZWN0aW9uIjsKLQotCQlwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCi0JCXByaXZhdGUgVGFibGVQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGUudGhpcywKLQkJCSAgICAgIHBhcmVudCwKLQkJCQkJYnVpbGRUYWJsZUFkYXB0ZXIoKSwKLQkJCQkJYnVpbGRQcm9wZXJ0aWVzTGlzdEhvbGRlcigpLAotCQkJCQlwcm9wZXJ0eUhvbGRlciwKLQkJCQkJYnVpbGRQcm9wZXJ0eUxhYmVsUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHN1cGVyLmFkZENvbnRhaW5lcihwYXJlbnQpOwotCQkJY29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCi0JCXByaXZhdGUgQ2VsbEVkaXRvcltdIGJ1aWxkQ2VsbEVkaXRvcnMoVGFibGUgdGFibGUpIHsKLQkJCXJldHVybiBuZXcgQ2VsbEVkaXRvcltdIHsKLQkJCQludWxsLAotCQkJCW5ldyBUZXh0Q2VsbEVkaXRvcih0YWJsZSksCi0JCQkJbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgSUNlbGxNb2RpZmllciBidWlsZENlbGxNb2RpZmllcigpIHsKLQkJCXJldHVybiBuZXcgSUNlbGxNb2RpZmllcigpIHsKLQotCQkJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJCXJldHVybiAhU0VMRUNUSU9OX0NPTFVNTi5lcXVhbHMocHJvcGVydHkpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHlNb2RlbCA9IChQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkpIGVsZW1lbnQ7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0KLQkJCQkJaWYgKHByb3BlcnR5ID09IFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eS5OQU1FX1BST1BFUlRZKSB7Ci0JCQkJCQl2YWx1ZSA9IHByb3BlcnR5TW9kZWwuZ2V0TmFtZSgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHByb3BlcnR5ID09IFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSkgewotCQkJCQkJdmFsdWUgPSBwcm9wZXJ0eU1vZGVsLmdldFZhbHVlKCk7Ci0JCQkJCX0KLQotCQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQkJdmFsdWUgPSAiIjsKLQkJCQkJfQotCi0JCQkJCXJldHVybiB2YWx1ZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eU1vZGVsOwotCi0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gKFRhYmxlSXRlbSkgZWxlbWVudDsKLQkJCQkJCXByb3BlcnR5TW9kZWwgPSAoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5KSB0YWJsZUl0ZW0uZ2V0RGF0YSgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcHJvcGVydHlNb2RlbCA9IChQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkpIGVsZW1lbnQ7Ci0JCQkJCX0KLQotCQkJCQlpZiAocHJvcGVydHkgPT0gUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQkJCXByb3BlcnR5TW9kZWwuc2V0TmFtZSh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChwcm9wZXJ0eSA9PSBQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkuVkFMVUVfUFJPUEVSVFkpIHsKLQkJCQkJCXByb3BlcnR5TW9kZWwuc2V0VmFsdWUodmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2x1bW5BZGFwdGVyPD8+IGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlDb2x1bW5BZGFwdGVyKCk7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkQ29sdW1uUHJvcGVydGllcygpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nW10gewotCQkJCVNFTEVDVElPTl9DT0xVTU4sCi0JCQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5Lk5BTUVfUFJPUEVSVFksCi0JCQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5LlZBTFVFX1BST1BFUlRZCi0JCQl9OwotCQl9Ci0KLQkJVGFibGVWaWV3ZXIgZ2V0VGFibGVWaWV3ZXIoKSB7Ci0JCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJCXN1cGVyLmluaXRpYWxpemVNYWluQ29tcG9zaXRlKAotCQkJCWNvbnRhaW5lciwKLQkJCQlhZGFwdGVyLAotCQkJCWxpc3RIb2xkZXIsCi0JCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJCWxhYmVsUHJvdmlkZXIsCi0JCQkJaGVscElkCi0JCQkpOwotCi0JCQlUYWJsZSB0YWJsZSA9IGdldE1haW5Db250cm9sKCk7Ci0JCQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkJLy8gTWFrZSB0aGUgc2VsZWN0aW9uIGNvbHVtbiBub24tcmVzaXphYmxlIHNpbmNlIGl0J3Mgb25seSB1c2VkIHRvCi0JCQkvLyBlYXNlIHRoZSBzZWxlY3Rpb24gb2Ygcm93cwotCQkJVGFibGVDb2x1bW4gc2VsZWN0aW9uQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKFByb3BlcnR5Q29sdW1uQWRhcHRlci5TRUxFQ1RJT05fQ09MVU1OKTsKLQkJCXNlbGVjdGlvbkNvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCQkJc2VsZWN0aW9uQ29sdW1uLnNldFdpZHRoKDIwKTsKLQotCQkJLy8gSW5zdGFsbCB0aGUgZWRpdG9ycwotCQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQkJdGFibGVWaWV3ZXIuc2V0Q2VsbEVkaXRvcnMoYnVpbGRDZWxsRWRpdG9ycyh0YWJsZSkpOwotCQkJdGFibGVWaWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKGJ1aWxkQ2VsbE1vZGlmaWVyKCkpOwotCQkJdGFibGVWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhidWlsZENvbHVtblByb3BlcnRpZXMoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJc3VwZXIuaXRlbXNBZGRlZChlKTsKLQkJCXJldmFsaWRhdGVMYXlvdXQoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCXN1cGVyLml0ZW1zUmVtb3ZlZChlKTsKLQkJCXJldmFsaWRhdGVMYXlvdXQoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJc3VwZXIubGlzdENoYW5nZWQoZSk7Ci0JCQlyZXZhbGlkYXRlTGF5b3V0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV2YWxpZGF0ZXMgdGhlIHRhYmxlIGxheW91dCBhZnRlciB0aGUgbGlzdCBvZiBpdGVtcyBoYXMgY2hhbmdlZC4gVGhlCi0JCSAqIGxheW91dCBoYXMgdG8gYmUgZG9uZSBpbiBhIG5ldyBVSSB0aHJlYWQgYmVjYXVzZSBvdXIgbGlzdGVuZXIgbWlnaHQgYmUKLQkJICogbm90aWZpZWQgYmVmb3JlIHRoZSB0YWJsZSBoYXMgYmVlbiB1cGRhdGVkICh0YWJsZSBjb2x1bW4gYWRkZWQgb3IgcmVtb3ZlZCkuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgcmV2YWxpZGF0ZUxheW91dCgpIHsKLQkJCVNXVFV0aWwuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRhYmxlIHRhYmxlID0gZ2V0TWFpbkNvbnRyb2woKTsKLQkJCQlpZiAoIXRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJCQkvLyBXZSBoYXZlIHRvIGRvIGEgdG90YWwgcmVsYXlvdXQgb2YgdGhlIHRhYiBvdGhlcndpc2UgdGhlCi0JCQkJCS8vIHRhYmxlIG1pZ2h0IGJlY29tZSBjdXQgb2ZmIGF0IHRoZSBib3R0b20KLQkJCQkJU1dUVXRpbC5yZWZsb3codGFibGUpOwotCQkJCX0KLQkJCX19KTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMWY2MzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZS5QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24gZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBidWlsZFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMV8wX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkMDM3Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeQotewotCS8vICoqKioqKioqKioqKioqKiogcGVyc2lzdGVuY2UgdW5pdCBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsaXN0IG9mIDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT5zIHVzZWQgdG8gZWRpdCBhCi0JICogPGNvZGU+UGVyc2lzdGVuY2VVbml0PC9jb2RlPi4gVGhlIHByb3BlcnRpZXMgY2FuIGJlIHJlZ3JvdXBlZCBpbnRvCi0JICogc2VjdGlvbnMgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBlZGl0b3IgYXMgcGFnZXMuCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBwZXJ0aXN0ZW5jZSB1bml0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JTGlzdEl0ZXJhdG9yPEpwYVBhZ2VDb21wb3NpdGU+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZXMoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9KcGFQZXJzcGVjdGl2ZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNwZWN0aXZlL0pwYVBlcnNwZWN0aXZlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjNmOWVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNwZWN0aXZlL0pwYVBlcnNwZWN0aXZlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgICAgIAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLlByb2plY3RFeHBsb3JlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBKcGFQZXJzcGVjdGl2ZUZhY3RvcnkgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCVN0cmluZyBlZGl0b3JBcmVhID0gbGF5b3V0LmdldEVkaXRvckFyZWEoKTsKLQotCQkvL1BhY2thZ2UgYXJlYQotCQlJRm9sZGVyTGF5b3V0IGZvbGRlciA9IGxheW91dC5jcmVhdGVGb2xkZXIoCi0JCQkJImxlZnQiLCBJUGFnZUxheW91dC5MRUZULCAoZmxvYXQpIDAuMjUsIGVkaXRvckFyZWEpOyAvLyROT04tTkxTLTEkCi0JCWZvbGRlci5hZGRWaWV3KFByb2plY3RFeHBsb3Jlci5WSUVXX0lEKTsKLQkJZm9sZGVyLmFkZFBsYWNlaG9sZGVyKEphdmFVSS5JRF9UWVBFX0hJRVJBUkNIWSk7Ci0JCWZvbGRlci5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQotCQkvL0RhdGFiYXNlIEV4cGxvcmVyIGFyZWEKLQkJbGF5b3V0LmFkZFZpZXcoIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuRGF0YVNvdXJjZUV4cGxvcmVyTmF2aWdhdG9yIiwgLy8kTk9OLU5MUy0xJAotCQkJSVBhZ2VMYXlvdXQuQk9UVE9NLCAoZmxvYXQpIDAuNjAsIFByb2plY3RFeHBsb3Jlci5WSUVXX0lEKTsKLQotCQkvL1Byb2JsZW1zL0NvbnNvbGUgYXJlYQotCQlJRm9sZGVyTGF5b3V0IG91dHB1dEZvbGRlciA9IGxheW91dC5jcmVhdGVGb2xkZXIoCi0JCQkJImJvdHRvbSIsIElQYWdlTGF5b3V0LkJPVFRPTSwgKGZsb2F0KSAwLjYwLCBlZGl0b3JBcmVhKTsgLy8kTk9OLU5MUy0xJAotCQlvdXRwdXRGb2xkZXIuYWRkVmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcpOwotCQlvdXRwdXRGb2xkZXIuYWRkUGxhY2Vob2xkZXIoSVBhZ2VMYXlvdXQuSURfQk9PS01BUktTKTsKLQkJb3V0cHV0Rm9sZGVyLmFkZFBsYWNlaG9sZGVyKElQcm9ncmVzc0NvbnN0YW50cy5QUk9HUkVTU19WSUVXX0lEKTsKLQotCQkvL0pQQSBEZXRhaWxzIChTcGxpdCB3aXRoIFByb2JsZW1zL0NvbnNvbGUgYXJlYSkKLQkJbGF5b3V0LmFkZFZpZXcoIm9yZy5lY2xpcHNlLmpwdC51aS5qcGFEZXRhaWxzVmlldyIsIC8vJE5PTi1OTFMtMSQKLQkJCQlJUGFnZUxheW91dC5SSUdIVCwgKGZsb2F0KSAuNjAsICJib3R0b20iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy9KUEEgU3RydWN0dXJlIGFyZWEKLQkJSUZvbGRlckxheW91dCBvdXRsaW5lRm9sZGVyID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigKLQkJCQkicmlnaHQiLCBJUGFnZUxheW91dC5SSUdIVCwgKGZsb2F0KSAwLjc1LCBlZGl0b3JBcmVhKTsgLy8kTk9OLU5MUy0xJAotCQlvdXRsaW5lRm9sZGVyLmFkZFZpZXcoIm9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQkJb3V0bGluZUZvbGRlci5hZGRWaWV3KElQYWdlTGF5b3V0LklEX09VVExJTkUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVWlSZWdpc3RyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NWFjMmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkgCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IEpwYVBsYXRmb3JtVWlSZWdpc3RyeSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0lEID0gCi0JCSJqcGFQbGF0Zm9ybVVpcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUExBVEZPUk1fVUkgPQotCQkianBhUGxhdGZvcm1VaSI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRfSUQgPQotCQkiaWQiOyAvLyROT04tTkxTLTEkCQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVF9KUEFfUExBVEZPUk0gPQotCQkianBhUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUX0ZBQ1RPUllfQ0xBU1MgPQotCQkiZmFjdG9yeUNsYXNzIjsgLy8kTk9OLU5MUy0xJAkKLQkJCi0JLy8ga2V5OiBTdHJpbmcgaWQgIHZhbHVlOiBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2xhc3MgZGVzY3JpcHRvcgotCXByaXZhdGUgTWFwPFN0cmluZywgSUNvbmZpZ3VyYXRpb25FbGVtZW50PiBqcGFQbGF0Zm9ybVVpQ29uZmlnRWxlbWVudHM7Ci0JCi0JLy9jYWNoZSB0aGUganBhUGxhdGZvcm1VaXMgd2hlbiB0aGV5IGFyZSBidWlsdAotCS8va2V5OiBqcGEgcGxhdGZvcm0gaWQgIHZhbHVlOiBKcGFQbGFmb3JtVWkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIEpwYVBsYXRmb3JtVWk+IGpwYVBsYXRmb3JtVWlzOwotCQotCS8qIChub24gSmF2YSBkb2MpCi0JICogcmVzdHJpY3QgYWNjZXNzCi0JICovCi0JcHJpdmF0ZSBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkoKSB7Ci0JCWJ1aWxkSnBhUGxhdGZvcm1VaUNvbmZpZ0VsZW1lbnRzKCk7Ci0JCXRoaXMuanBhUGxhdGZvcm1VaXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpwYVBsYXRmb3JtVWk+KCk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBidWlsZEpwYVBsYXRmb3JtVWlDb25maWdFbGVtZW50cygpIHsKLQkJdGhpcy5qcGFQbGF0Zm9ybVVpQ29uZmlnRWxlbWVudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBzdHJlYW0gPSBhbGxDb25maWdFbGVtZW50cygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWJ1aWxkSnBhUGxhdGZvcm1VaShzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRKcGFQbGF0Zm9ybVVpKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7Ci0JCWlmICghIGNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFTF9QTEFURk9STV9VSSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU3RyaW5nIHBsYXRmb3JtVWlJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0lEKTsKLQkJU3RyaW5nIHBsYXRmb3JtID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfSlBBX1BMQVRGT1JNKTsKLQkJU3RyaW5nIHBsYXRmb3JtVWlGYWN0b3J5Q2xhc3MgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVF9GQUNUT1JZX0NMQVNTKTsKLQkJCi0JCWlmICgocGxhdGZvcm1VaUlkID09IG51bGwpIHx8IChwbGF0Zm9ybVVpRmFjdG9yeUNsYXNzID09IG51bGwpKSB7Ci0JCQlpZiAocGxhdGZvcm1VaUlkID09IG51bGwpIHsKLQkJCQlyZXBvcnRNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIEFUX0lEKTsKLQkJCX0KLQkJCWlmIChwbGF0Zm9ybSA9PSBudWxsKSB7Ci0JCQkJcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZShjb25maWdFbGVtZW50LCBBVF9KUEFfUExBVEZPUk0pOwotCQkJfQotCQkJaWYgKHBsYXRmb3JtVWlGYWN0b3J5Q2xhc3MgPT0gbnVsbCkgewotCQkJCXJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoY29uZmlnRWxlbWVudCwgQVRfRkFDVE9SWV9DTEFTUyk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICh0aGlzLmpwYVBsYXRmb3JtVWlDb25maWdFbGVtZW50cy5jb250YWluc0tleShwbGF0Zm9ybVVpSWQpKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgb3RoZXJDb25maWdFbGVtZW50ID0gdGhpcy5qcGFQbGF0Zm9ybVVpQ29uZmlnRWxlbWVudHMuZ2V0KHBsYXRmb3JtKTsKLQkJCXJlcG9ydER1cGxpY2F0ZVBsYXRmb3JtVWkoY29uZmlnRWxlbWVudCwgb3RoZXJDb25maWdFbGVtZW50KTsKLQkJfQotCQkKLQkJdGhpcy5qcGFQbGF0Zm9ybVVpQ29uZmlnRWxlbWVudHMucHV0KHBsYXRmb3JtVWlJZCwgY29uZmlnRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpIGdldEpwYVBsYXRmb3JtVWkoU3RyaW5nIHBsYXRmb3JtSWQpIHsKLQkJaWYgKHRoaXMuanBhUGxhdGZvcm1VaXMuY29udGFpbnNLZXkocGxhdGZvcm1JZCkpIHsKLQkJCXJldHVybiB0aGlzLmpwYVBsYXRmb3JtVWlzLmdldChwbGF0Zm9ybUlkKTsKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgcmVnaXN0ZXJlZENvbmZpZ0VsZW1lbnQgPSBudWxsOwotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA6IHRoaXMuanBhUGxhdGZvcm1VaUNvbmZpZ0VsZW1lbnRzLnZhbHVlcygpKSB7Ci0JCQlpZiAoY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0pQQV9QTEFURk9STSkuZXF1YWxzKHBsYXRmb3JtSWQpKSB7Ci0JCQkJcmVnaXN0ZXJlZENvbmZpZ0VsZW1lbnQgPSBjb25maWd1cmF0aW9uRWxlbWVudDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHJlZ2lzdGVyZWRDb25maWdFbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUpwYVBsYXRmb3JtVWlGYWN0b3J5IGpwYVBsYXRmb3JtVWlGYWN0b3J5OwotCQl0cnkgewotCQkJanBhUGxhdGZvcm1VaUZhY3RvcnkgPSAoSnBhUGxhdGZvcm1VaUZhY3RvcnkpIHJlZ2lzdGVyZWRDb25maWdFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRfRkFDVE9SWV9DTEFTUyk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJlcG9ydEZhaWxlZEluc3RhbnRpYXRpb24ocmVnaXN0ZXJlZENvbmZpZ0VsZW1lbnQpOwotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihwbGF0Zm9ybUlkKTsKLQkJfQotCQlKcGFQbGF0Zm9ybVVpIHBsYXRmb3JtVWkgPSBqcGFQbGF0Zm9ybVVpRmFjdG9yeS5idWlsZEpwYVBsYXRmb3JtVWkoKTsKLQkJdGhpcy5qcGFQbGF0Zm9ybVVpcy5wdXQocGxhdGZvcm1JZCwgcGxhdGZvcm1VaSk7Ci0JCXJldHVybiBwbGF0Zm9ybVVpOwotCX0KLQkKLQlwcml2YXRlIEl0ZXJhdG9yPElDb25maWd1cmF0aW9uRWxlbWVudD4gYWxsQ29uZmlnRWxlbWVudHMoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IAotCQkJcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoSnB0VWlQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fSUQpOwotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCi0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxJRXh0ZW5zaW9uLCBJdGVyYXRvcjxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+PihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoZXh0ZW5zaW9ucykpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IHRyYW5zZm9ybShJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQl9Ci0JCi0JLy8gVE9ETyBleHRlcm5hbGl6ZSBzdHJpbmdzCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gCi0JCQkiQW4gZXh0ZW5zaW9uIGVsZW1lbnQgXCIiCi0JCQkrIGNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpCi0JCQkrICJcIiBpbiBwbHVnaW4gXCIiCi0JCQkrIGNvbmZpZ0VsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkKLQkJCSsgIlwiIGlzIG1pc3NpbmcgYSByZXF1aXJlZCBhdHRyaWJ1dGUgXCIiCi0JCQkrIGF0dHJpYnV0ZU5hbWUKLQkJCSsgIlwiLiI7Ci0JCUpwdFVpUGx1Z2luLmxvZyhtZXNzYWdlKTsKLQl9Ci0JCi0JLy8gVE9ETyBleHRlcm5hbGl6ZSBzdHJpbmdzCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydER1cGxpY2F0ZVBsYXRmb3JtVWkoCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgb25lQ29uZmlnRWxlbWVudCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IG90aGVyQ29uZmlnRWxlbWVudCkgewotCQlTdHJpbmcgbWVzc2FnZSA9Ci0JCQkiVGhlIHBsdWdpbnMgXCIiCi0JCQkrIG9uZUNvbmZpZ0VsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkKLQkJCSsgIlwiIGFuZCBcIiIKLQkJCSsgb3RoZXJDb25maWdFbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpCi0JCQkrICJcIiBoYXZlIHJlZ2lzdGVyZWQgYSBkdXBsaWNhdGUgYXR0cmlidXRlIFwiaWRcIiAiCi0JCQkrICJmb3IgdGhlIGV4dGVuc2lvbiBlbGVtZW50IFwianBhUGxhdGZvcm1VaVwiLiI7Ci0JCUpwdFVpUGx1Z2luLmxvZyhtZXNzYWdlKTsKLQl9Ci0JCQotCS8vIFRPRE8gZXh0ZXJuYWxpemUgc3RyaW5ncwotCXByaXZhdGUgdm9pZCByZXBvcnRGYWlsZWRJbnN0YW50aWF0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7Ci0JCVN0cmluZyBtZXNzYWdlID0KLQkJCSJDb3VsZCBub3QgaW5zdGFudGlhdGUgdGhlIGNsYXNzIFwiIgotCQkJKyBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVF9GQUNUT1JZX0NMQVNTKQotCQkJKyAiXCIgZm9yIHRoZSBleHRlbnNpb24gZWxlbWVudCBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXROYW1lKCkKLQkJCSsgIlwiIGluIHRoZSBwbHVnaW4gXCIiCi0JCQkrIGNvbmZpZ0VsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkKLQkJCSsgIlwiLiI7Ci0JCUpwdFVpUGx1Z2luLmxvZyhtZXNzYWdlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9iYXNlL0Jhc2VKcGFQbGF0Zm9ybVVpLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9iYXNlL0Jhc2VKcGFQbGF0Zm9ybVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOGQ3YWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vYmFzZS9CYXNlSnBhUGxhdGZvcm1VaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uYmFzZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuTWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5EZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLm5hdmlnYXRvci5KcGFOYXZpZ2F0b3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSnBhUGxhdGZvcm1VaQotCWltcGxlbWVudHMgSnBhUGxhdGZvcm1VaQotewotCXByaXZhdGUgZmluYWwgSnBhTmF2aWdhdG9yUHJvdmlkZXIgbmF2aWdhdG9yUHJvdmlkZXI7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgcGxhdGZvcm1VaVByb3ZpZGVyOwotCQotCQotCXByb3RlY3RlZCBCYXNlSnBhUGxhdGZvcm1VaSgKLQkJCUpwYU5hdmlnYXRvclByb3ZpZGVyIG5hdmlnYXRvclByb3ZpZGVyLCBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgcGxhdGZvcm1VaVByb3ZpZGVyKSB7Ci0JCQotCQlzdXBlcigpOwotCQl0aGlzLm5hdmlnYXRvclByb3ZpZGVyID0gbmF2aWdhdG9yUHJvdmlkZXI7Ci0JCXRoaXMucGxhdGZvcm1VaVByb3ZpZGVyID0gcGxhdGZvcm1VaVByb3ZpZGVyOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIG5hdmlnYXRvciBwcm92aWRlciAqKioqKioqKioqCi0JCi0JcHVibGljIEpwYU5hdmlnYXRvclByb3ZpZGVyIGdldE5hdmlnYXRvclByb3ZpZGVyKCkgewotCQlyZXR1cm4gdGhpcy5uYXZpZ2F0b3JQcm92aWRlcjsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBzdHJ1Y3R1cmUgcHJvdmlkZXJzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoSnBhRmlsZSBqcGFGaWxlKSB7Ci0JCUpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKS5nZXRSZXNvdXJjZVR5cGUoKTsKLQkJcmV0dXJuIChyZXNvdXJjZVR5cGUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXRTdHJ1Y3R1cmVQcm92aWRlcihyZXNvdXJjZVR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlSZXNvdXJjZVVpRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotCQl0cnkgewotCQkJZGVmaW5pdGlvbiA9IGdldFJlc291cmNlVWlEZWZpbml0aW9uKHJlc291cmNlVHlwZSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCUpwdFVpUGx1Z2luLmxvZyhpYWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGRlZmluaXRpb24uZ2V0U3RydWN0dXJlUHJvdmlkZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBkZXRhaWxzIHByb3ZpZGVycyAqKioqKioqKioqCi0JCi0JcHVibGljIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBidWlsZEpwYURldGFpbHNQYWdlKAotCQkJQ29tcG9zaXRlIHBhcmVudCwgSnBhU3RydWN0dXJlTm9kZSBzdHJ1Y3R1cmVOb2RlLCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCUpwYURldGFpbHNQcm92aWRlciBqcGFEZXRhaWxzUHJvdmlkZXIgPSBnZXREZXRhaWxzUHJvdmlkZXIoc3RydWN0dXJlTm9kZSk7Ci0JCXJldHVybiBqcGFEZXRhaWxzUHJvdmlkZXIgPT0gbnVsbCA/IG51bGwgOiBqcGFEZXRhaWxzUHJvdmlkZXIuYnVpbGREZXRhaWxzUGFnZShwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhRGV0YWlsc1Byb3ZpZGVyIGdldERldGFpbHNQcm92aWRlcihKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUpIHsKLQkJZm9yIChKcGFEZXRhaWxzUHJvdmlkZXIgcHJvdmlkZXIgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5kZXRhaWxzUHJvdmlkZXJzKCkpKSB7Ci0JCQlpZiAocHJvdmlkZXIucHJvdmlkZXNEZXRhaWxzKHN0cnVjdHVyZU5vZGUpKSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOy8vcmV0dXJuIG51bGwsIHNvbWUgc3RydWN0dXJlIG5vZGVzIGRvIG5vdCBoYXZlIGEgZGV0YWlscyBwYWdlCi0JfQotCQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8SnBhRGV0YWlsc1Byb3ZpZGVyPiBkZXRhaWxzUHJvdmlkZXJzKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVVpUHJvdmlkZXIuZGV0YWlsc1Byb3ZpZGVycygpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIG1hcHBpbmcgdWkgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUsIAotCQkJU3RyaW5nIG1hcHBpbmdLZXksIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VHlwZU1hcHBpbmc+IG1hcHBpbmdIb2xkZXIsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZ2V0TWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uKHJlc291cmNlVHlwZSkuYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCQltYXBwaW5nS2V5LCBtYXBwaW5nSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUsIAotCQkJU3RyaW5nIG1hcHBpbmdLZXksIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlTWFwcGluZz4gbWFwcGluZ0hvbGRlciwgCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBnZXRNYXBwaW5nUmVzb3VyY2VVaURlZmluaXRpb24ocmVzb3VyY2VUeXBlKS5idWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQkJbWFwcGluZ0tleSwgbWFwcGluZ0hvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsID8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBnZXREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbihKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlLCBTdHJpbmcgbWFwcGluZ0tleSkgewotCQlyZXR1cm4gZ2V0TWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uKHJlc291cmNlVHlwZSkuZ2V0RGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24obWFwcGluZ0tleSk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRBdHRyaWJ1dGUsID8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gYXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gZ2V0TWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uKHJlc291cmNlVHlwZSkuYXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsKLQl9Ci0JCi0JcHVibGljIERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRUeXBlLCA/IGV4dGVuZHMgVHlwZU1hcHBpbmc+IGdldERlZmF1bHRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbihKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiBnZXRNYXBwaW5nUmVzb3VyY2VVaURlZmluaXRpb24ocmVzb3VyY2VUeXBlKS5nZXREZWZhdWx0VHlwZU1hcHBpbmdVaURlZmluaXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsID8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IHR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucyhKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiBnZXRNYXBwaW5nUmVzb3VyY2VVaURlZmluaXRpb24ocmVzb3VyY2VUeXBlKS50eXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gcmVzb3VyY2VVaURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVVpUHJvdmlkZXIucmVzb3VyY2VVaURlZmluaXRpb25zKCk7Ci0JfQotCQotCXB1YmxpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBnZXRSZXNvdXJjZVVpRGVmaW5pdGlvbihKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCWZvciAoUmVzb3VyY2VVaURlZmluaXRpb24gZGVmaW5pdGlvbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLnJlc291cmNlVWlEZWZpbml0aW9ucygpKSkgewotCQkJaWYgKGRlZmluaXRpb24ucHJvdmlkZXNVaShyZXNvdXJjZVR5cGUpKSB7Ci0JCQkJcmV0dXJuIGRlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJLy8gVE9ETyAoYnVnIDMxMzYzMikgLSByZXR1cm4gYSBudWxsIHJlc291cmNlIHVpIGRlZmluaXRpb24/Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIHJlc291cmNlIFVJIGRlZmluaXRpb24gZm9yIHRoZSByZXNvdXJjZSB0eXBlOiAiICsgcmVzb3VyY2VUeXBlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgTWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uIGdldE1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbihKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKE1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbikgZ2V0UmVzb3VyY2VVaURlZmluaXRpb24ocmVzb3VyY2VUeXBlKTsKLQkJfQotCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgewotCQkJLy8gVE9ETyAoYnVnIDMxMzYzMikgLSByZXR1cm4gYSBudWxsIHJlc291cmNlIHVpIGRlZmluaXRpb24/Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBtYXBwaW5nIHJlc291cmNlIFVJIGRlZmluaXRpb24gZm9yIHRoZSByZXNvdXJjZSB0eXBlOiAiICsgcmVzb3VyY2VUeXBlLCBjY2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBlbnRpdHkgZ2VuZXJhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVFbnRpdGllcyhKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlFbnRpdGllc0dlbmVyYXRvci5nZW5lcmF0ZShwcm9qZWN0LCBzZWxlY3Rpb24pOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGRpc3BsYXlNZXNzYWdlKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkgICAgU2hlbGwgY3VycmVudFNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oY3VycmVudFNoZWxsLCB0aXRsZSwgbWVzc2FnZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vYmFzZS9FbnRpdGllc0dlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vYmFzZS9FbnRpdGllc0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmIwMmE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2Jhc2UvRW50aXRpZXNHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmJhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbi5HZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqICBFbnRpdGllc0dlbmVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRW50aXRpZXNHZW5lcmF0b3IgewotCXByaXZhdGUgSnBhUHJvamVjdCBwcm9qZWN0OwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKEpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCW5ldyBFbnRpdGllc0dlbmVyYXRvcihwcm9qZWN0LCBzZWxlY3Rpb24pLmdlbmVyYXRlKCk7Ci0JfQotCQotCXByaXZhdGUgRW50aXRpZXNHZW5lcmF0b3IoSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdlbmVyYXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIHByb21wdCB0aGUgdXNlciB3aXRoIGEgd2l6YXJkOwotCSAqIHNjaGVkdWxlIGEgam9iIHRvIGdlbmVyYXRlIHRoZSBlbnRpdGllczsKLQkgKiBvcHRpb25hbGx5IHNjaGVkdWxlIGEgam9iIHRvIHN5bmNocm9uaXplIHBlcnNpc3RlbmNlLnhtbCB0bwotCSAqIHJ1biBhZnRlcndhcmRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGUoKSB7Ci0JCUdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkIHdpemFyZCA9IG5ldyBHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCh0aGlzLnByb2plY3QsIHRoaXMuc2VsZWN0aW9uKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2codGhpcy5nZXRDdXJyZW50U2hlbGwoKSwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlpbnQgcmV0dXJuQ29kZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyZXR1cm5Db2RlICE9IFdpbmRvdy5PSykgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vRW50aXRpZXMgZ2VuZXJhdGlvbiBoYXBwZW5zIGluIHRoZSBHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZC5wZXJmb3JtRmluaXNoKCkKLQkJLy9tZXRob2QKLQl9Ci0JCi0JcHJpdmF0ZSBTaGVsbCBnZXRDdXJyZW50U2hlbGwoKSB7Ci0JICAgIHJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0NsYXNzUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvQ2xhc3NSZWZJdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Q1YmVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvQ2xhc3NSZWZJdGVtTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc1JlZkl0ZW1MYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcgotewotCXB1YmxpYyBDbGFzc1JlZkl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJQ2xhc3NSZWYgY2xhc3NSZWYsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKGNsYXNzUmVmLCBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlJbWFnZSBpbWFnZTsKLQkJaWYgKCgoQ2xhc3NSZWYpIG1vZGVsKCkpLmlzVmlydHVhbCgpKSB7Ci0JCQlpbWFnZSA9IEpwdFVpSWNvbnMuZ2hvc3QoSnB0VWlJY29ucy5DTEFTU19SRUYpOwotCQl9Ci0JCWVsc2UgewotCQkJIGltYWdlID0gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5DTEFTU19SRUYpOwotCQl9Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPihpbWFnZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2xhc3NSZWYsIFN0cmluZz4oQ2xhc3NSZWYuQ0xBU1NfTkFNRV9QUk9QRVJUWSwgKENsYXNzUmVmKSBtb2RlbCgpKSB7Ci0JCQkgQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldENsYXNzTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgewotCQkvL1RPRE8gYWxzbyBuZWVkIHRvIGxpc3RlbiB0byB0aGUgUGVyc2lzdGVuY2VVbml0IG5hbWUgcHJvcGVydHkgc2luY2UgdGhpcyB2YWx1ZSBkZXBlbmRzIG9uIGl0Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENsYXNzUmVmLCBTdHJpbmc+KENsYXNzUmVmLkNMQVNTX05BTUVfUFJPUEVSVFksIChDbGFzc1JlZikgbW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE5hbWUoKSAKLQkJCQkrICIvXCIiICsgc3ViamVjdC5nZXRDbGFzc05hbWUoKQotCQkJCSsgIlwiIC0gIiArIHN1YmplY3QuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvRW50aXR5TWFwcGluZ3NJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9FbnRpdHlNYXBwaW5nc0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMGExMWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9FbnRpdHlNYXBwaW5nc0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIEVudGl0eU1hcHBpbmdzSXRlbUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIEVudGl0eU1hcHBpbmdzSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncywgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJc3VwZXIoZW50aXR5TWFwcGluZ3MsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPigKLQkJCUpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuRU5USVRZX01BUFBJTkdTKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigKLQkJCUpwdFVpTWVzc2FnZXMuT3JtSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5X2VudGl0eU1hcHBpbmdzTGFiZWwpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJSnB0VWlNZXNzYWdlcy5Pcm1JdGVtTGFiZWxQcm92aWRlckZhY3RvcnlfZW50aXR5TWFwcGluZ3NMYWJlbAotCQkJCSsgIiAtICIgKyAoKEVudGl0eU1hcHBpbmdzKSBtb2RlbCgpKS5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY0pwYVBsYXRmb3JtVWkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY0pwYVBsYXRmb3JtVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQyNTAzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNKcGFQbGF0Zm9ybVVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uYmFzZS5CYXNlSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYVBsYXRmb3JtVWkKLQlleHRlbmRzIEJhc2VKcGFQbGF0Zm9ybVVpCi17Ci0JcHVibGljIEdlbmVyaWNKcGFQbGF0Zm9ybVVpKAotCQkJSnBhTmF2aWdhdG9yUHJvdmlkZXIgbmF2aWdhdG9yUHJvdmlkZXIsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBwbGF0Zm9ybVVpUHJvdmlkZXIpIHsKLQkJCi0JCXN1cGVyKG5hdmlnYXRvclByb3ZpZGVyLCBwbGF0Zm9ybVVpUHJvdmlkZXIpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIERETCBnZW5lcmF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZURETChKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLmRpc3BsYXlNZXNzYWdlKEpwdFVpTWVzc2FnZXMuR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRpdGxlLCBKcHRVaU1lc3NhZ2VzLkdlbmVyaWNQbGF0Zm9ybVVpRGlhbG9nX25vdFN1cHBvcnRlZE1lc3NhZ2VUZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4OTAxZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYVBsYXRmb3JtVWlGYWN0b3J5IGltcGxlbWVudHMgSnBhUGxhdGZvcm1VaUZhY3RvcnkKLXsKLQotCS8qKgotCSAqIFplcm8gYXJnIGNvbnN0cnVjdG9yIGZvciBleHRlbnNpb24gcG9pbnQKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY0pwYVBsYXRmb3JtVWlGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpIGJ1aWxkSnBhUGxhdGZvcm1VaSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm1VaSgKLQkJCW5ldyBHZW5lcmljTmF2aWdhdG9yUHJvdmlkZXIoKSwKLQkJCUdlbmVyaWNKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuaW5zdGFuY2UoKQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTYwYjc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuSmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLXsKLQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKE9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgPSAoRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgY29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci0JCQotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEpwYVJvb3RDb250ZXh0Tm9kZSkgewotCQkJcmV0dXJuIG5ldyBSb290Q29udGV4dEl0ZW1Db250ZW50UHJvdmlkZXIoKEpwYVJvb3RDb250ZXh0Tm9kZSkgaXRlbSwgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VYbWwpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxJdGVtQ29udGVudFByb3ZpZGVyKChQZXJzaXN0ZW5jZVhtbCkgaXRlbSwgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlVW5pdCkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyKChQZXJzaXN0ZW5jZVVuaXQpIGl0ZW0sIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBPcm1YbWwpIHsKLQkJCXJldHVybiBuZXcgT3JtWG1sSXRlbUNvbnRlbnRQcm92aWRlcigoT3JtWG1sKSBpdGVtLCB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgT3JtUGVyc2lzdGVudFR5cGUpIHsKLQkJCXJldHVybiBuZXcgT3JtUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyKChPcm1QZXJzaXN0ZW50VHlwZSkgaXRlbSwgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotCQkJcmV0dXJuIG5ldyBKYXZhUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyKChKYXZhUGVyc2lzdGVudFR5cGUpIGl0ZW0sIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtQ29udGVudFByb3ZpZGVyKChQZXJzaXN0ZW50QXR0cmlidXRlKSBpdGVtLCB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxKcGFDb250ZXh0Tm9kZT4KLQl7Ci0JCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCQlzdXBlcihwZXJzaXN0ZW5jZVVuaXQsIGNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGdldE1vZGVsKCkgewotCQkJcmV0dXJuIChQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldE1vZGVsKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgUGVyc2lzdGVuY2VYbWwgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIGdldE1vZGVsKCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKcGFDb250ZXh0Tm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJTGlzdDxDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+PigpOwotCQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRPcm1YbWxDdm0oKSk7Ci0JCQlsaXN0LmFkZChidWlsZEltcGxpZWRNYXBwaW5nRmlsZUN2bSgpKTsKLQkJCWxpc3QuYWRkKGJ1aWxkUGVyc2lzdGVudFR5cGVDdm0oKSk7Ci0JCQlsaXN0LmFkZChidWlsZEphckZpbGVDdm0oKSk7Ci0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZT4sIEpwYUNvbnRleHROb2RlPihsaXN0KTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEpwYUNvbnRleHROb2RlPiBidWlsZFNwZWNpZmllZE9ybVhtbEN2bSgpIHsKLQkJCXJldHVybiBuZXcgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8SnBhQ29udGV4dE5vZGU+KAotCQkJCQluZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxNYXBwaW5nRmlsZT4oCi0JCQkJCQluZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8TWFwcGluZ0ZpbGVSZWYsIE1hcHBpbmdGaWxlPigKLQkJCQkJCQluZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPE1hcHBpbmdGaWxlUmVmPigKLQkJCQkJCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgTWFwcGluZ0ZpbGVSZWY+KAotCQkJCQkJCQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfTUFQUElOR19GSUxFX1JFRlNfTElTVCwKLQkJCQkJCQkJCQlnZXRNb2RlbCgpKSB7Ci0JCQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJCQkJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJCQkJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9LCBNYXBwaW5nRmlsZVJlZi5NQVBQSU5HX0ZJTEVfUFJPUEVSVFkpKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIE1hcHBpbmdGaWxlIHRyYW5zZm9ybUl0ZW0oTWFwcGluZ0ZpbGVSZWYgaXRlbSkgewotCQkJCQkJCQlyZXR1cm4gaXRlbS5nZXRNYXBwaW5nRmlsZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0pKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8SnBhQ29udGV4dE5vZGU+IGZpbHRlcihJdGVyYWJsZTw/IGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+IGl0ZW1zKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpwYUNvbnRleHROb2RlPihpdGVtcykgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKcGFDb250ZXh0Tm9kZSBvKSB7Ci0JCQkJCQkJCXJldHVybiBvICE9IG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJfTsKLQkJCQkJfQotCQkJCX07Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxNYXBwaW5nRmlsZT4gYnVpbGRJbXBsaWVkTWFwcGluZ0ZpbGVDdm0oKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPE1hcHBpbmdGaWxlPigKLQkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hcHBpbmdGaWxlUmVmLCBNYXBwaW5nRmlsZT4oCi0JCQkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgTWFwcGluZ0ZpbGVSZWY+KAotCQkJCQkJCQlQZXJzaXN0ZW5jZVVuaXQuSU1QTElFRF9NQVBQSU5HX0ZJTEVfUkVGX1BST1BFUlRZLAotCQkJCQkJCQlnZXRNb2RlbCgpKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIE1hcHBpbmdGaWxlUmVmIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9LAotCQkJCQkJTWFwcGluZ0ZpbGVSZWYuTUFQUElOR19GSUxFX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRNYXBwaW5nRmlsZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEpwYUNvbnRleHROb2RlPiBidWlsZFBlcnNpc3RlbnRUeXBlQ3ZtKCkgewotCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbDxKcGFDb250ZXh0Tm9kZT4oCi0JCQkJCW5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFBlcnNpc3RlbnRUeXBlPigKLQkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxDbGFzc1JlZiwgUGVyc2lzdGVudFR5cGU+KAotCQkJCQkJCW5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Q2xhc3NSZWY+KGJ1aWxkQ2xhc3NSZWZDdm0oKSwgQ2xhc3NSZWYuSkFWQV9QRVJTSVNURU5UX1RZUEVfUFJPUEVSVFkpKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIFBlcnNpc3RlbnRUeXBlIHRyYW5zZm9ybUl0ZW0oQ2xhc3NSZWYgaXRlbSkgewotCQkJCQkJCQlyZXR1cm4gaXRlbS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEpwYUNvbnRleHROb2RlPiBmaWx0ZXIoSXRlcmFibGU8PyBleHRlbmRzIEpwYUNvbnRleHROb2RlPiBpdGVtcykgewotCQkJCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKcGFDb250ZXh0Tm9kZT4oaXRlbXMpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSnBhQ29udGV4dE5vZGUgbykgewotCQkJCQkJCQlyZXR1cm4gbyAhPSBudWxsOwotCQkJCQkJCX0KLQkJCQkJCX07Ci0JCQkJCX0KLQkJCQl9OwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8Q2xhc3NSZWY+IGJ1aWxkQ2xhc3NSZWZDdm0oKSB7Ci0JCQlBcnJheUxpc3Q8Q29sbGVjdGlvblZhbHVlTW9kZWw8Q2xhc3NSZWY+PiBob2xkZXJzID0gbmV3IEFycmF5TGlzdDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxDbGFzc1JlZj4+KDIpOwotCQkJaG9sZGVycy5hZGQoYnVpbGRTcGVjaWZpZWRDbGFzc1JlZkN2bSgpKTsKLQkJCWhvbGRlcnMuYWRkKGJ1aWxkSW1wbGllZENsYXNzUmVmQ3ZtKCkpOwotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxDbGFzc1JlZj4sIENsYXNzUmVmPihob2xkZXJzKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPENsYXNzUmVmPiBidWlsZFNwZWNpZmllZENsYXNzUmVmQ3ZtKCkgewotCQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPENsYXNzUmVmPigKLQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIENsYXNzUmVmPigKLQkJCQlQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX0NMQVNTX1JFRlNfTElTVCwgZ2V0TW9kZWwoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxDbGFzc1JlZj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZENsYXNzUmVmcygpOwotCQkJCQl9Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpOwotCQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPENsYXNzUmVmPiBidWlsZEltcGxpZWRDbGFzc1JlZkN2bSgpIHsKLQkJCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBDbGFzc1JlZj4oCi0JCQkJUGVyc2lzdGVuY2VVbml0LklNUExJRURfQ0xBU1NfUkVGU19DT0xMRUNUSU9OLCBnZXRNb2RlbCgpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8Q2xhc3NSZWY+IGl0ZXJhdG9yXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmltcGxpZWRDbGFzc1JlZnMoKTsKLQkJCQkJfQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmltcGxpZWRDbGFzc1JlZnNTaXplKCk7Ci0JCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKcGFDb250ZXh0Tm9kZT4gYnVpbGRKYXJGaWxlQ3ZtKCkgewotCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbDxKcGFDb250ZXh0Tm9kZT4oCi0JCQkJCW5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEphckZpbGU+KAotCQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEphckZpbGVSZWYsIEphckZpbGU+KAotCQkJCQkJCW5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SmFyRmlsZVJlZj4oYnVpbGRKYXJGaWxlUmVmQ3ZtKCksIEphckZpbGVSZWYuSkFSX0ZJTEVfUFJPUEVSVFkpKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIEphckZpbGUgdHJhbnNmb3JtSXRlbShKYXJGaWxlUmVmIGl0ZW0pIHsKLQkJCQkJCQkJcmV0dXJuIGl0ZW0uZ2V0SmFyRmlsZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0pKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8SnBhQ29udGV4dE5vZGU+IGZpbHRlcihJdGVyYWJsZTw/IGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+IGl0ZW1zKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpwYUNvbnRleHROb2RlPihpdGVtcykgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKcGFDb250ZXh0Tm9kZSBvKSB7Ci0JCQkJCQkJCXJldHVybiBvICE9IG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJfTsKLQkJCQkJfQotCQkJCX07Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKYXJGaWxlUmVmPiBidWlsZEphckZpbGVSZWZDdm0oKSB7Ci0JCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8SmFyRmlsZVJlZj4oCi0JCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgSmFyRmlsZVJlZj4oCi0JCQkJCVBlcnNpc3RlbmNlVW5pdC5KQVJfRklMRV9SRUZTX0xJU1QsIGdldE1vZGVsKCkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKYXJGaWxlUmVmPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCQkJCXJldHVybiBzdWJqZWN0LmphckZpbGVSZWZzKCk7Ci0JCQkJCQl9Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJCQkJcmV0dXJuIHN1YmplY3QuamFyRmlsZVJlZnNTaXplKCk7Ci0JCQkJCQl9Ci0JCQkJfSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRjOTVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkphckZpbGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotCWltcGxlbWVudHMgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci17Ci0JcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyIGJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEpwYVJvb3RDb250ZXh0Tm9kZSkgewotCQkJcmV0dXJuIG5ldyBSb290Q29udGV4dEl0ZW1MYWJlbFByb3ZpZGVyKChKcGFSb290Q29udGV4dE5vZGUpIGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VYbWwpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxJdGVtTGFiZWxQcm92aWRlcigoUGVyc2lzdGVuY2VYbWwpIGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlVW5pdCkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVuaXRJdGVtTGFiZWxQcm92aWRlcigoUGVyc2lzdGVuY2VVbml0KSBpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBPcm1YbWwpIHsKLQkJCXJldHVybiBuZXcgT3JtWG1sSXRlbUxhYmVsUHJvdmlkZXIoKE9ybVhtbCkgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVudFR5cGUpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVudFR5cGVJdGVtTGFiZWxQcm92aWRlcigoUGVyc2lzdGVudFR5cGUpIGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyKChQZXJzaXN0ZW50QXR0cmlidXRlKSBpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBKYXJGaWxlKSB7Ci0JCQlyZXR1cm4gbmV3IEphckZpbGVJdGVtTGFiZWxQcm92aWRlcigoSmFyRmlsZSkgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvclByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNOYXZpZ2F0b3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmI5MjVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLm5hdmlnYXRvci5KcGFOYXZpZ2F0b3JQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNOYXZpZ2F0b3JQcm92aWRlciBpbXBsZW1lbnRzIEpwYU5hdmlnYXRvclByb3ZpZGVyCi17Ci0JcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBnZXRJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9KYXJGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvSmFyRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNTRmNjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9KYXJGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5KYXJGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIEphckZpbGVSZWZJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgSmFyRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJSmFyRmlsZVJlZiBqYXJGaWxlUmVmLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcihqYXJGaWxlUmVmLCBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXJGaWxlUmVmLCBTdHJpbmc+KEphckZpbGVSZWYuRklMRV9OQU1FX1BST1BFUlRZLCAoSmFyRmlsZVJlZikgbW9kZWwoKSkgewotCQkJIEBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRGaWxlTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPihKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpBUl9GSUxFX1JFRikpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXJGaWxlUmVmLCBTdHJpbmc+KEphckZpbGVSZWYuRklMRV9OQU1FX1BST1BFUlRZLCAoSmFyRmlsZVJlZikgbW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE5hbWUoKSAKLQkJCQkrICIvXCIiICsgc3ViamVjdC5nZXRGaWxlTmFtZSgpCi0JCQkJKyAiXCIgLSAiICsgc3ViamVjdC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9KYXZhUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0phdmFQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhNmZlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0phdmFQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotcHVibGljIGNsYXNzIEphdmFQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPgotewotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQlzdXBlcihwZXJzaXN0ZW50VHlwZSwgY29udGVudFByb3ZpZGVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIChKYXZhUGVyc2lzdGVudFR5cGUpIHN1cGVyLmdldE1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gZ2V0TW9kZWwoKS5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oCi0JCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxKYXZhUGVyc2lzdGVudFR5cGUsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPihQZXJzaXN0ZW50VHlwZS5BVFRSSUJVVEVTX0xJU1QsIGdldE1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5hdHRyaWJ1dGVzKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5hdHRyaWJ1dGVzU2l6ZSgpOwotCQkJfQotCQl9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9NYXBwaW5nRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL01hcHBpbmdGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5ZmRiMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL01hcHBpbmdGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgTWFwcGluZ0ZpbGVSZWZJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgTWFwcGluZ0ZpbGVSZWZJdGVtTGFiZWxQcm92aWRlcigKLQkJCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcihtYXBwaW5nRmlsZVJlZiwgbGFiZWxQcm92aWRlcik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJSW1hZ2UgaW1hZ2U7Ci0JCWlmICgoKE1hcHBpbmdGaWxlUmVmKSBtb2RlbCgpKS5pc0ltcGxpZWQoKSkgewotCQkJaW1hZ2UgPSBKcHRVaUljb25zLmdob3N0KEpwdFVpSWNvbnMuTUFQUElOR19GSUxFX1JFRik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkgaW1hZ2UgPSBKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLk1BUFBJTkdfRklMRV9SRUYpOwotCQl9Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPihpbWFnZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFwcGluZ0ZpbGVSZWYsIFN0cmluZz4oTWFwcGluZ0ZpbGVSZWYuRklMRV9OQU1FX1BST1BFUlRZLCAoTWFwcGluZ0ZpbGVSZWYpIG1vZGVsKCkpIHsKLQkJCSBAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RmlsZU5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFwcGluZ0ZpbGVSZWYsIFN0cmluZz4oTWFwcGluZ0ZpbGVSZWYuRklMRV9OQU1FX1BST1BFUlRZLCAoTWFwcGluZ0ZpbGVSZWYpIG1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXROYW1lKCkgCi0JCQkJKyAiL1wiIiArIHN1YmplY3QuZ2V0RmlsZU5hbWUoKSArICJcIiIKLQkJCQkrICIgLSAiICsgc3ViamVjdC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1QZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZmI5MzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1QZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBPcm1QZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+Ci0JewotCQlwdWJsaWMgT3JtUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQkJc3VwZXIocGVyc2lzdGVudFR5cGUsIGNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgT3JtUGVyc2lzdGVudFR5cGUgZ2V0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gKE9ybVBlcnNpc3RlbnRUeXBlKSBzdXBlci5nZXRNb2RlbCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gZ2V0TW9kZWwoKS5nZXRQYXJlbnQoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlMaXN0PENvbGxlY3Rpb25WYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPj4oMik7Ci0JCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzQ29sbGVjdGlvbkhvbGRlcigpKTsKLQkJCWxpc3QuYWRkKGJ1aWxkVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzQ29sbGVjdGlvbkhvbGRlcigpKTsKLQkJCXJldHVybiBuZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8Q29sbGVjdGlvblZhbHVlTW9kZWw8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4sIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KGxpc3QpOwotCQl9Ci0JCQotCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBidWlsZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPigKLQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxPcm1QZXJzaXN0ZW50VHlwZSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4oUGVyc2lzdGVudFR5cGUuQVRUUklCVVRFU19MSVNULCBnZXRNb2RlbCgpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRBdHRyaWJ1dGVzKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBidWlsZFZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlc0NvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4oCi0JCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8T3JtUGVyc2lzdGVudFR5cGUsIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KE9ybVBlcnNpc3RlbnRUeXBlLlZJUlRVQUxfQVRUUklCVVRFU19MSVNULCBnZXRNb2RlbCgpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC52aXJ0dWFsQXR0cmlidXRlcygpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC52aXJ0dWFsQXR0cmlidXRlc1NpemUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtWG1sSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1YbWxJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjA5NzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1YbWxJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotcHVibGljIGNsYXNzIE9ybVhtbEl0ZW1Db250ZW50UHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8T3JtUGVyc2lzdGVudFR5cGU+Ci17Ci0JcHVibGljIE9ybVhtbEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQlPcm1YbWwgb3JtWG1sLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQlzdXBlcihvcm1YbWwsIGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1YbWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoT3JtWG1sKSBzdXBlci5nZXRNb2RlbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIGdldE1vZGVsKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxPcm1QZXJzaXN0ZW50VHlwZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8T3JtUGVyc2lzdGVudFR5cGU+KAotCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8RW50aXR5TWFwcGluZ3MsIE9ybVBlcnNpc3RlbnRUeXBlPigKLQkJCQlidWlsZEVudGl0eU1hcHBpbmdzSG9sZGVyKCksCi0JCQkJRW50aXR5TWFwcGluZ3MuUEVSU0lTVEVOVF9UWVBFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8T3JtUGVyc2lzdGVudFR5cGU+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZXMoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZXNTaXplKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eU1hcHBpbmdzPiBidWlsZEVudGl0eU1hcHBpbmdzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1YbWwsIEVudGl0eU1hcHBpbmdzPigKLQkJCQlPcm1YbWwuRU5USVRZX01BUFBJTkdTX1BST1BFUlRZLCBnZXRNb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFbnRpdHlNYXBwaW5ncyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRFbnRpdHlNYXBwaW5ncygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtWG1sSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtWG1sSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5MTI0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL09ybVhtbEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBPcm1YbWxJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgT3JtWG1sSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlPcm1YbWwgb3JtWG1sLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcihvcm1YbWwsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPihKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpQQV9GSUxFKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigoKE9ybVhtbCkgbW9kZWwoKSkuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgewotCQlPcm1YbWwgb3JtWG1sID0gKE9ybVhtbCkgbW9kZWwoKTsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigKLQkJCW9ybVhtbC5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKQotCQkJKyAiIC0gIiArIG9ybVhtbC5nZXRSZXNvdXJjZSgpLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEwN2E2Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcgotewotCXB1YmxpYyBQZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbmNlLCBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5QRVJTSVNURU5DRSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oCi0JCQlKcHRVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5X3BlcnNpc3RlbmNlTGFiZWwpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJSnB0VWlNZXNzYWdlcy5QZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeV9wZXJzaXN0ZW5jZUxhYmVsCi0JCQkJKyAiIC0gIiArICgoUGVyc2lzdGVuY2UpIG1vZGVsKCkpLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW5jZVVuaXRJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW5jZVVuaXRJdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTZlNTVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVuY2VVbml0SXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdEl0ZW1MYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcgotewotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRJdGVtTGFiZWxQcm92aWRlcigKLQkJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbmNlVW5pdCwgbGFiZWxQcm92aWRlcik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KEpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuUEVSU0lTVEVOQ0VfVU5JVCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPihQZXJzaXN0ZW5jZVVuaXQuTkFNRV9QUk9QRVJUWSwgKFBlcnNpc3RlbmNlVW5pdCkgbW9kZWwoKSkgewotCQkJIEBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPihQZXJzaXN0ZW5jZVVuaXQuTkFNRV9QUk9QRVJUWSwgKFBlcnNpc3RlbmNlVW5pdCkgbW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldE5hbWUoKQotCQkJCSsgIiAtICIgKyBzdWJqZWN0LmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlWG1sSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW5jZVhtbEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlNjNhNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlWG1sSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxJdGVtQ29udGVudFByb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPFBlcnNpc3RlbmNlVW5pdD4KLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWwsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbmNlWG1sLCBjb250ZW50UHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoUGVyc2lzdGVuY2VYbWwpIHN1cGVyLmdldE1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFSb290Q29udGV4dE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEpwYVJvb3RDb250ZXh0Tm9kZSkgZ2V0TW9kZWwoKS5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0PigKLQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlLCBQZXJzaXN0ZW5jZVVuaXQ+KAotCQkJCW5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VYbWwsIFBlcnNpc3RlbmNlPigKLQkJCQkJCVBlcnNpc3RlbmNlWG1sLlBFUlNJU1RFTkNFX1BST1BFUlRZLCBnZXRNb2RlbCgpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQZXJzaXN0ZW5jZSgpOwotCQkJCQl9Ci0JCQkJfSwKLQkJCQlQZXJzaXN0ZW5jZS5QRVJTSVNURU5DRV9VTklUU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnBlcnNpc3RlbmNlVW5pdHMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW5jZVhtbEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlWG1sSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmZjllYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlWG1sSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbEl0ZW1MYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcgotewotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbEl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWwsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbmNlWG1sLCBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KUEFfRklMRSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKChQZXJzaXN0ZW5jZVhtbCkgbW9kZWwoKSkuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgewotCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCA9IChQZXJzaXN0ZW5jZVhtbCkgbW9kZWwoKTsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigKLQkJCXBlcnNpc3RlbmNlWG1sLmdldFJlc291cmNlKCkuZ2V0TmFtZSgpCi0JCQkrICIgLSAiICsgcGVyc2lzdGVuY2VYbWwuZ2V0UmVzb3VyY2UoKS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3NzEyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi17Ci0JcHVibGljIFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQlzdXBlcihwZXJzaXN0ZW50QXR0cmlidXRlLCBjb250ZW50UHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIChQZXJzaXN0ZW50QXR0cmlidXRlKSBzdXBlci5nZXRNb2RlbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIGdldE1vZGVsKCkuZ2V0UGFyZW50KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzEzNGU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcihwZXJzaXN0ZW50QXR0cmlidXRlLCBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0JCi0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW50QXR0cmlidXRlLCBJbWFnZT4oCi0JCQkJbmV3IFN0cmluZ1tdIHtQZXJzaXN0ZW50QXR0cmlidXRlLkRFRkFVTFRfTUFQUElOR19QUk9QRVJUWSwgUGVyc2lzdGVudEF0dHJpYnV0ZS5TUEVDSUZJRURfTUFQUElOR19QUk9QRVJUWX0sIAotCQkJCShQZXJzaXN0ZW50QXR0cmlidXRlKSBtb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbWFnZSBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAoKChQZXJzaXN0ZW50QXR0cmlidXRlKSBtb2RlbCgpKS5pc1ZpcnR1YWwoKSkgewotCQkJCQlyZXR1cm4gSnB0VWlJY29ucy5naG9zdChKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaWNvbktleUZvckF0dHJpYnV0ZU1hcHBpbmcodGhpcy5zdWJqZWN0LmdldE1hcHBpbmdLZXkoKSkpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyh0aGlzLnN1YmplY3QuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW50QXR0cmlidXRlLCBTdHJpbmc+KFBlcnNpc3RlbnRBdHRyaWJ1dGUuTkFNRV9QUk9QRVJUWSwgKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIG1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZz4oUGVyc2lzdGVudEF0dHJpYnV0ZS5OQU1FX1BST1BFUlRZLCAoUGVyc2lzdGVudEF0dHJpYnV0ZSkgbW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJCXNiLmFwcGVuZCh0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0TmFtZSgpKTsKLQkJCQlzYi5hcHBlbmQoJy8nKTsKLQkJCQlzYi5hcHBlbmQodGhpcy5zdWJqZWN0LmdldE93bmluZ1BlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpKTsKLQkJCQlzYi5hcHBlbmQoJy8nKTsKLQkJCQlzYi5hcHBlbmQodGhpcy5zdWJqZWN0LmdldE5hbWUoKSk7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gdGhpcy5zdWJqZWN0LmdldFJlc291cmNlKCk7Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJc2IuYXBwZW5kKCIgLSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzYi5hcHBlbmQocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKSk7Ci0JCQkJfQotCQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudFR5cGVJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW50VHlwZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzY2U5MjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW50VHlwZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50VHlwZUl0ZW1MYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcgotewotCXB1YmxpYyBQZXJzaXN0ZW50VHlwZUl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbnRUeXBlLCBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW50VHlwZSwgSW1hZ2U+KFBlcnNpc3RlbnRUeXBlLk1BUFBJTkdfUFJPUEVSVFksIChQZXJzaXN0ZW50VHlwZSkgbW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW1hZ2UgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvclR5cGVNYXBwaW5nKHN1YmplY3QuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW50VHlwZSwgU3RyaW5nPihQZXJzaXN0ZW50VHlwZS5OQU1FX1BST1BFUlRZLCAoUGVyc2lzdGVudFR5cGUpIG1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRTaG9ydE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVudFR5cGUsIFN0cmluZz4oUGVyc2lzdGVudFR5cGUuTkFNRV9QUk9QRVJUWSwgKFBlcnNpc3RlbnRUeXBlKSBtb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQkJc2IuYXBwZW5kKHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXROYW1lKCkpOwotCQkJCXNiLmFwcGVuZCgnLycpOwotCQkJCXNiLmFwcGVuZCh0aGlzLnN1YmplY3QuZ2V0TmFtZSgpKTsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLnN1YmplY3QuZ2V0UmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlzYi5hcHBlbmQoIiAtICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXNiLmFwcGVuZChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Sb290Q29udGV4dEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUm9vdENvbnRleHRJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMTlmNTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Sb290Q29udGV4dEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBSb290Q29udGV4dEl0ZW1Db250ZW50UHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8UGVyc2lzdGVuY2VYbWw+Ci17Ci0JcHVibGljIFJvb3RDb250ZXh0SXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCUpwYVJvb3RDb250ZXh0Tm9kZSByb290Q29udGV4dCwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJc3VwZXIocm9vdENvbnRleHQsIGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFSb290Q29udGV4dE5vZGUgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoSnBhUm9vdENvbnRleHROb2RlKSBzdXBlci5nZXRNb2RlbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVByb2plY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gZ2V0TW9kZWwoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8UGVyc2lzdGVuY2VYbWw+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxQZXJzaXN0ZW5jZVhtbD4oCi0JCQkJbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKcGFSb290Q29udGV4dE5vZGUsIFBlcnNpc3RlbmNlWG1sPigKLQkJCQkJCUpwYVJvb3RDb250ZXh0Tm9kZS5QRVJTSVNURU5DRV9YTUxfUFJPUEVSVFksCi0JCQkJCQlnZXRNb2RlbCgpKSB7Ci0JCQkJCSBAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUm9vdENvbnRleHRJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Sb290Q29udGV4dEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMjBjYWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Sb290Q29udGV4dEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIFJvb3RDb250ZXh0SXRlbUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIFJvb3RDb250ZXh0SXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlKcGFSb290Q29udGV4dE5vZGUgcm9vdENvbnRleHROb2RlLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcihyb290Q29udGV4dE5vZGUsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPihKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpQQV9DT05URU5UKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihKcHRVaU1lc3NhZ2VzLkpwYUNvbnRlbnRfbGFiZWwpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJSnB0VWlNZXNzYWdlcy5KcGFDb250ZW50X2xhYmVsCi0JCQkJKyAiIC0gIiArICgoSnBhUm9vdENvbnRleHROb2RlKSBtb2RlbCgpKS5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pwYVByZWZlcmVuY2VzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSnBhUHJlZmVyZW5jZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNzJiODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSnBhUHJlZmVyZW5jZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSByb290IG9mIHRoZSBKYXZhIFBlcnNpc3RlbmNlIHByZWZlcmVuY2VzIGhpZXJhcmNoeSBpbiB0aGUgSURFCi0gKiBwcmVmZXJlbmNlcyBkaWFsb2cuCi0gKiA8cD4KLSAqIFN0cnVjdHVyZToKLSAqIDxwPgotICogSmF2YSBQZXJzaXN0ZW5jZTxicj4KLSAqICB8LSBFcnJvcnMvV2FybmluZ3MKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIEpwYVByZWZlcmVuY2VzUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhUHJlZmVyZW5jZXNQYWdlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSnBhUHJlZmVyZW5jZXNQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQkvLyBNZXNzYWdlIGxhYmVsCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhUHJlZmVyZW5jZXNQYWdlX0Rlc2NyaXB0aW9uKTsKLQkJbGFiZWwuc2V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5CRUdJTk5JTkcsIHRydWUsIHRydWUpKTsKLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShKcHRVaVBsdWdpbi5pbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiMGJkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLlByb3BlcnR5QW5kUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLlNjcm9sbGVkUGFnZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LlBpeGVsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkV4cGFuc2lvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkV4cGFuc2lvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHBhZ2Ugc2hvd3MgdGhlIEphdmEgUGVyc2lzdGVuY2UgdmFsaWRhdGlvbiBvcHRpb25zLiBJdCBzdXBwb3J0cwotICogd29ya3NwYWNlIGFuZCBwcm9qZWN0IGxldmVscyBzZXZlcml0aWVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEpwYVByb2JsZW1TZXZlcml0aWVzUGFnZSBleHRlbmRzIFByb3BlcnR5QW5kUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogU2V2ZXJpdHkgbGV2ZWwgc3RhdGUgaXMgc3RvcmVkIGluIHRoaXMgTWFwIGFuZCBpcyBlaXRoZXIgY29tbWl0dGVkIG9yIGRpc2NhcmRlZAotCSAqIGJhc2VkIG9uIHVzZXIgYWN0aW9uLgotCSAqIDxicj4ga2V5IGlzIHRoZSBwcmVmZXJlbmNlS2V5IHdoaWNoIGlzIGFsc28gdGhlIHZhbGlkYXRpb24gbWVzc2FnZSBrZXkgQHNlZSBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuCi0JICogPGJyPiB2YWx1ZSBpcyBhIHNldmVyaXR5IGxldmVsIC0gQHNlZSBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMjRVJST1IgV0FSTklORyBJTkZPIElHTk9SRQotCSAqLwotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBzZXZlcml0eUxldmVsczsKLQotCS8qKgotCSAqIERlZmF1bHQgc2V2ZXJpdHkgbGV2ZWxzIGFyZSBzdG9yZWQgaGVyZSwgIEVSUk9SIGlzIHRoZSBkZWZhdWx0IGRlZmF1bHQgc28gb25seSBuZWVkCi0JICogdG8gaW5jbHVkZSBXQVJOSU5HLCBJTkZPLCBJR05PUkUgaW4gdGhpcyBNYXAuIFRoZXNlIHdpbGwgYmUgZGlzcGxheWVkIGlmIG5laXRoZXIgdGhlIHByb2plY3QgCi0JICogb3Igd29ya3NwYWNlIHByZWZlcmVuY2UgYXBwbGllcy4KLQkgKiA8YnI+IGtleSBpcyB0aGUgcHJlZmVyZW5jZUtleSB3aGljaCBpcyBhbHNvIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Uga2V5IEBzZWUgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLgotCSAqIDxicj4gdmFsdWUgaXMgYSBzZXZlcml0eSBsZXZlbCAtIEBzZWUgSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzI0VSUk9SIFdBUk5JTkcgSU5GTyBJR05PUkUKLQkgKi8KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZGVmYXVsdFNldmVyaXRpZXM7Ci0JCi0JLyoqCi0JICogVGhlIGxpc3Qgb2YgPGNvZGU+Q29tYm88L2NvZGU+cyBpcyBjYWNoZWQgaW4gb3JkZXIgdG8gcGVyZm9ybSBhIHJldmVydCBvZgotCSAqIHRoZSBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgTGlzdDxDb21ibz4gY29tYm9zOwotCi0JLyoqCi0JICogVGhlIGxpc3Qgb2YgPGNvZGU+RXhwYW5kYWJsZUNvbXBvc2l0ZTwvY29kZT4gaXMgY2FjaGVkIGluIG9yZGVyIHRvIHNhdmUKLQkgKiBhbmQgcmVzdG9yZSB0aGUgZXhwYW5zaW9uIHN0YXRlLgotCSAqLwotCXByaXZhdGUgTGlzdDxFeHBhbmRhYmxlQ29tcG9zaXRlPiBleHBhbmRhYmxlUGFuZXM7Ci0KLQkvKioKLQkgKiBUaGUgcG9zaXRpb24gb2YgdGhlICJFcnJvciIgY2hvaWNlIGluIHRoZSBjb21ibydzIG1vZGVsLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTkRFWCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgcG9zaXRpb24gb2YgdGhlICJXYXJuaW5nIiBjaG9pY2UgaW4gdGhlIGNvbWJvJ3MgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfSU5ERVggPSAxOwotCi0JLyoqCi0JICogVGhlIHBvc2l0aW9uIG9mIHRoZSAiSW5mbyIgY2hvaWNlIGluIHRoZSBjb21ibydzIG1vZGVsLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkZPX0lOREVYID0gMjsKLQotCS8qKgotCSAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgIklnbm9yZSIgY2hvaWNlIGluIHRoZSBjb21ibydzIG1vZGVsLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJR05PUkVfSU5ERVggPSAzOwotCi0JLyoqCi0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBhZ2Ugd2hlbiBpdCBpcyBzaG93biBpbiB0aGUgSURFCi0JICogcHJlZmVyZW5jZXMgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKUFRfUFJFRkVSRU5DRVNfUFJPQkxFTV9TRVZFUklUSUVTX0lEID0gIm9yZy5lY2xpcHNlLmpwdC51aS5wcmVmZXJlbmNlcy5wcm9ibGVtU2V2ZXJpdGllcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwYWdlIHdoZW4gaXQgaXMgc2hvd24gaW4gdGhlIHByb2plY3QKLQkgKiBwcmVmZXJlbmNlcyBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpQVF9QUk9QRVJUWV9QQUdFU19QUk9CTEVNX1NFVkVSSVRJRVNfSUQgPSAib3JnLmVjbGlwc2UuanB0LnVpLnByb3BlcnR5UGFnZXMucHJvYmxlbVNldmVyaXRpZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIGNvbnN0YW50IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIHRoZSBwcmVmZXJlbmNlIGtleSAobWVzc2FnZSBJRCkgZnJvbQotCSAqIHRoZSBjb21iby4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9LRVkgPSAicHJlZmVyZW5jZUtleSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzY3JvbGxhYmxlIHBhbmUgdXNlZCB0byBzaG93IHRoZSBjb250ZW50IG9mIHRoaXMgcGFnZS4KLQkgKi8KLQlwcml2YXRlIFNjcm9sbGVkUGFnZUNvbnRlbnQgc2Nyb2xsYWJsZTsKLQotCS8qKgotCSAqIFRoZSBwb3NzaWJsZSBjaG9pY2VzIHdoaWNoIGRlc2NyaWJlcyB0aGUgc2V2ZXJpdHkgb2YgYSBzaW5nbGUgcHJvYmxlbS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIHNldmVyaXR5RGlzcGxheVN0cmluZ3M7Ci0KLQkvKioKLQkgKiBDb25zdGFudCB1c2VkIHRvIHN0b3JlIHRoZSBleHBhbnNpb24gc3RhdGUgb2YgZWFjaCBleHBhbmRhYmxlIHBhbmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUVElOR1NfRVhQQU5ERUQgPSAiZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcHJlZmVyZW5jZSBrZXkgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGlhbG9nIHNldHRpbmdzIHdoZXJlIHRoZSBleHBhbnNpb24KLQkgKiBzdGF0ZXMgaGF2ZSBiZWVuIHN0b3JlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUSU5HU19TRUNUSU9OX05BTUUgPSAiSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBCb29sZWFuIGhhc1Byb2plY3RTcGVjaWZpY1ByZWZlcmVuY2VzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQl0aGlzLnNldFByZWZlcmVuY2VTdG9yZShKcHRVaVBsdWdpbi5pbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJdGhpcy5zZXREZXNjcmlwdGlvbihKcHRVaU1lc3NhZ2VzLkpwYVByb2JsZW1TZXZlcml0aWVzUGFnZV9EZXNjcmlwdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5jb21ib3MgPSBuZXcgQXJyYXlMaXN0PENvbWJvPigpOwotCQl0aGlzLmV4cGFuZGFibGVQYW5lcyA9IG5ldyBBcnJheUxpc3Q8RXhwYW5kYWJsZUNvbXBvc2l0ZT4oKTsKLQkJdGhpcy5zZXZlcml0eURpc3BsYXlTdHJpbmdzID0gYnVpbGRTZXZlcml0eURpc3BsYXlTdHJpbmdzKCk7Ci0JCXRoaXMuc2V2ZXJpdHlMZXZlbHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJdGhpcy5kZWZhdWx0U2V2ZXJpdGllcyA9IGJ1aWxkRGVmYXVsdFNldmVydGllcygpOwotCX0KLQotCS8vc2luY2UgbW9zdCBvZiBvdXIgcHJvYmxlbXMgaGF2ZSBhIGRlZmF1bHQgc2V2ZXJpdHkgb2YgRVJST1IsIHdlIGFyZSBqdXN0IGRlZmluaW5nIHRoZSBXQVJOSU5HLCBJTkZPLCBJR05PUkUgY2FzZXMKLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBidWlsZERlZmF1bHRTZXZlcnRpZXMoKSB7Ci0JCSBNYXA8U3RyaW5nLCBTdHJpbmc+IGRlZmF1bHRTZXZlcml0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQkJIGRlZmF1bHRTZXZlcml0aWVzLnB1dChKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUFJPSkVDVF9OT19DT05ORUNUSU9OLCBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuV0FSTklORyk7Ci0JCSBkZWZhdWx0U2V2ZXJpdGllcy5wdXQoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfSU5WQUxJRF9DT05ORUNUSU9OLCBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuV0FSTklORyk7Ci0JCSBkZWZhdWx0U2V2ZXJpdGllcy5wdXQoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfSU5BQ1RJVkVfQ09OTkVDVElPTiwgSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLldBUk5JTkcpOwotCQkgZGVmYXVsdFNldmVyaXRpZXMucHV0KEpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfQUJTVFJBQ1RfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVELCBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuV0FSTklORyk7Ci0JCSBkZWZhdWx0U2V2ZXJpdGllcy5wdXQoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVELCBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuV0FSTklORyk7Ci0JCSBkZWZhdWx0U2V2ZXJpdGllcy5wdXQoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfTk9UX1BPUlRBQkxFX09OX1BMQVRGT1JNLCBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuV0FSTklORyk7Ci0JCSBkZWZhdWx0U2V2ZXJpdGllcy5wdXQoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfSkFSX0ZJTEVfREVQTE9ZTUVOVF9QQVRIX1dBUk5JTkcsIEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5XQVJOSU5HKTsKLQkJIGRlZmF1bHRTZXZlcml0aWVzLnB1dChKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19GSUxFX0VYVFJBTkVPVVNfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUywgSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLldBUk5JTkcpOwotCQkgZGVmYXVsdFNldmVyaXRpZXMucHV0KEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX1RZUEVfQU5OT1RBVEVEX0JVVF9OT1RfSU5DTFVERURfSU5fUEVSU0lTVEVOQ0VfVU5JVCwgSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLldBUk5JTkcpOwotCQkgZGVmYXVsdFNldmVyaXRpZXMucHV0KEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JTkhFUklURURfQVRUUklCVVRFU19OT1RfU1VQUE9SVEVELCBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuV0FSTklORyk7Ci0JCSBkZWZhdWx0U2V2ZXJpdGllcy5wdXQoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX01VTFRJUExFX1BFUlNJU1RFTkNFX1VOSVRTLCBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuV0FSTklORyk7Ci0KLQkJIGRlZmF1bHRTZXZlcml0aWVzLnB1dChKcGFWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1ZFUlNJT05fTk9UX0xBVEVTVCwgSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLklORk8pOwotCQkgZGVmYXVsdFNldmVyaXRpZXMucHV0KEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1JFRFVOREFOVF9DTEFTUywgSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLklORk8pOwotCi0JCSByZXR1cm4gZGVmYXVsdFNldmVyaXRpZXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlUHJlZmVyZW5jZUNvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCVBpeGVsQ29udmVydGVyIHBpeGVsQ29udmVydGVyID0gbmV3IFBpeGVsQ29udmVydGVyKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGEgY29udGFpbmVyIGJlY2F1c2UgdGhlIGNhbGxlciB3aWxsIHNldCB0aGUgR3JpZERhdGEgYW5kIHdlIG5lZWQKLQkJLy8gdG8gY2hhbmdlIHRoZSBoZWlnaHRIaW50IG9mIHRoZSBmaXJzdCBjaGlsZCBhbmQgd2UgYWxzbyBuZWVkIHRvIHNldCB0aGUKLQkJLy8gZm9udCBvdGhlcndpc2UgdGhlIGxheW91dCB3b24ndCBiZSBjYWxjdWxhdGVkIGNvcnJlY3RseQotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoICA9IDA7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBDcmVhdGUgdGhlIG1haW4gY29tcG9zaXRlIG9mIHRoaXMgcGFnZQotCQl0aGlzLnNjcm9sbGFibGUgPSBuZXcgU2Nyb2xsZWRQYWdlQ29udGVudChjb250YWluZXIpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gcGl4ZWxDb252ZXJ0ZXIuY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygyMCk7Ci0JCXRoaXMuc2Nyb2xsYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBVcGRhdGUgdGhlIGxheW91dCBvZiB0aGUgU2Nyb2xsZWRQYWdlQ29udGVudCdzIGJvZHkKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoICA9IDA7Ci0KLQkJcGFyZW50ID0gdGhpcy5zY3JvbGxhYmxlLmdldEJvZHkoKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUpKTsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEFkZCBlYWNoIGV4cGFuZGFibGUgY2F0ZWdvcnkKLQkJYWRkUHJvamVjdExldmVsQ2F0ZWdvcnkocGFyZW50KTsKLQkJYWRkUGVyc2lzdGVuY2VVbml0TGV2ZWxDYXRlZ29yeShwYXJlbnQpOwotCQlhZGRUeXBlTGV2ZWxDYXRlZ29yeShwYXJlbnQpOwotCQlhZGRBdHRyaWJ1dGVMZXZlbENhdGVnb3J5KHBhcmVudCk7Ci0JCWFkZERhdGFiYXNlQ2F0ZWdvcnkocGFyZW50KTsKLQkJYWRkSW5oZXJpdGFuY2VTdHJhdGVneUNhdGVnb3J5KHBhcmVudCk7Ci0JCWFkZFF1ZXJpZXNHZW5lcmF0b3JzQ2F0ZWdvcnkocGFyZW50KTsKLQotCQkvLyBSZXN0b3JlIHRoZSBleHBhbnNpb24gc3RhdGVzCi0JCXJlc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKGdldERpYWxvZ1ByZWZlcmVuY2VzKCkpOwotCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzKSB7Ci0JCWZvciAoaW50IGluZGV4ID0gdGhpcy5leHBhbmRhYmxlUGFuZXMuc2l6ZSgpOyAtLWluZGV4ID49IDA7ICkgewotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSBleHBhbmRhYmxlUGFuZSA9IHRoaXMuZXhwYW5kYWJsZVBhbmVzLmdldChpbmRleCk7Ci0KLQkJCWlmIChzZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJLy8gT25seSBleHBhbmQgdGhlIGZpcnN0IG5vZGUgYnkgZGVmYXVsdAotCQkJCWV4cGFuZGFibGVQYW5lLnNldEV4cGFuZGVkKGluZGV4ID09IDApOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZXhwYW5kYWJsZVBhbmUuc2V0RXhwYW5kZWQoc2V0dGluZ3MuZ2V0Qm9vbGVhbihTRVRUSU5HU19FWFBBTkRFRCArIGluZGV4KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmRvQ29tcHV0ZVNpemUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUHJvamVjdExldmVsQ2F0ZWdvcnkoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXBhcmVudCA9IGFkZEV4cGFuZGFibGVTZWN0aW9uKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBST0pFQ1RfTEVWRUxfQ0FURUdPUlkpOwotCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5OT19KUEFfUFJPSkVDVCwgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk5PX0pQQV9QUk9KRUNUKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBST0pFQ1RfTk9fQ09OTkVDVElPTiwgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUFJPSkVDVF9OT19DT05ORUNUSU9OKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBST0pFQ1RfSU5WQUxJRF9DT05ORUNUSU9OLCAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUFJPSkVDVF9JTlZBTElEX0NPTk5FQ1RJT04pOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUFJPSkVDVF9JTkFDVElWRV9DT05ORUNUSU9OLCAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX0lOQUNUSVZFX0NPTk5FQ1RJT04pOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuWE1MX1ZFUlNJT05fTk9UX0xBVEVTVCwgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5YTUxfVkVSU0lPTl9OT1RfTEFURVNUKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBST0pFQ1RfTk9fUEVSU0lTVEVOQ0VfWE1MLCAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUFJPSkVDVF9OT19QRVJTSVNURU5DRV9YTUwpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUFJPSkVDVF9NVUxUSVBMRV9QRVJTSVNURU5DRV9YTUwsICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX01VTFRJUExFX1BFUlNJU1RFTkNFX1hNTCk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklULCAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX05PX1BFUlNJU1RFTkNFX1VOSVQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfTVVMVElQTEVfUEVSU0lTVEVOQ0VfVU5JVFMsIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9NVUxUSVBMRV9QRVJTSVNURU5DRV9VTklUUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9YTUxfSU5WQUxJRF9DT05URU5ULCAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1hNTF9JTlZBTElEX0NPTlRFTlQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQZXJzaXN0ZW5jZVVuaXRMZXZlbENhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlwYXJlbnQgPSBhZGRFeHBhbmRhYmxlU2VjdGlvbihwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0xFVkVMX0NBVEVHT1JZKTsKLQotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9NQVBQSU5HX0ZJTEUsICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX01BUFBJTkdfRklMRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1VOU1VQUE9SVEVEX01BUFBJTkdfRklMRV9DT05URU5ULCAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfVU5TVVBQT1JURURfTUFQUElOR19GSUxFX0NPTlRFTlQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9NQVBQSU5HX0ZJTEUsICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX01BUFBJTkdfRklMRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0lOVkFMSURfTUFQUElOR19GSUxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfSU5WQUxJRF9NQVBQSU5HX0ZJTEUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfTUFQUElOR19GSUxFLCAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9NQVBQSU5HX0ZJTEUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9DTEFTUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0NMQVNTKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfQ0xBU1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9DTEFTUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0lOVkFMSURfQ0xBU1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfSU5WQUxJRF9DTEFTUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9DTEFTUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0NMQVNTKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfUkVEVU5EQU5UX0NMQVNTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9SRURVTkRBTlRfQ0xBU1MpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfSkFSX0ZJTEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9KQVJfRklMRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0pBUl9GSUxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfSkFSX0ZJTEUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9KQVJfRklMRV9ERVBMT1lNRU5UX1BBVEhfV0FSTklORywgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0pBUl9GSUxFX0RFUExPWU1FTlRfUEFUSF9XQVJOSU5HKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfSkFSX0ZJTEUsICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9KQVJfRklMRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5NQVBQSU5HX0ZJTEVfRVhUUkFORU9VU19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTLCAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfRklMRV9FWFRSQU5FT1VTX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRUeXBlTGV2ZWxDYXRlZ29yeShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcGFyZW50ID0gYWRkRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVFlQRV9MRVZFTF9DQVRFR09SWSk7Ci0KLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9UWVBFX01BUFBFRF9CVVRfTk9UX0lOQ0xVREVEX0lOX1BFUlNJU1RFTkNFX1VOSVQsCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9UWVBFX01BUFBFRF9CVVRfTk9UX0lOQ0xVREVEX0lOX1BFUlNJU1RFTkNFX1VOSVQpOwotCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQlwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5UX1RZUEVfQU5OT1RBVEVEX0JVVF9OT1RfSU5DTFVERURfSU5fUEVSU0lTVEVOQ0VfVU5JVCwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX1RZUEVfQU5OT1RBVEVEX0JVVF9OT1RfSU5DTFVERURfSU5fUEVSU0lTVEVOQ0VfVU5JVCk7Ci0JCWFkZExhYmVsZWRDb21ibygKLQkJCXBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTlRfVFlQRV9VTlNQRUNJRklFRF9DTEFTUywKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX1RZUEVfVU5TUEVDSUZJRURfQ0xBU1MpOwotCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQlwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5UX1RZUEVfVU5SRVNPTFZFRF9DTEFTUywKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX1RZUEVfVU5SRVNPTFZFRF9DTEFTUyk7Ci0JCWFkZExhYmVsZWRDb21ibygKLQkJCXBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkVOVElUWV9OT19QSywKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfTk9fUEspOwotCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQlwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UWVBFX01BUFBJTkdfRklOQUxfQ0xBU1MsCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0ZJTkFMX0NMQVNTKTsKLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVFlQRV9NQVBQSU5HX01FTUJFUl9DTEFTUywKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfTUVNQkVSX0NMQVNTKTsKLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0NMQVNTX01JU1NJTkdfTk9fQVJHX0NPTlNUUlVDVE9SLAotCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19DTEFTU19NSVNTSU5HX05PX0FSR19DT05TVFJVQ1RPUik7Ci0JCWFkZExhYmVsZWRDb21ibygKLQkJCXBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRZUEVfTUFQUElOR19DTEFTU19QUklWQVRFX05PX0FSR19DT05TVFJVQ1RPUiwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfQ0xBU1NfUFJJVkFURV9OT19BUkdfQ09OU1RSVUNUT1IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBdHRyaWJ1dGVMZXZlbENhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlwYXJlbnQgPSBhZGRFeHBhbmRhYmxlU2VjdGlvbihwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5BVFRSSUJVVEVfTEVWRUxfQ0FURUdPUlkpOwotCQkKLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5TUEVDSUZJRURfTkFNRSwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9VTlNQRUNJRklFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5SRVNPTFZFRF9OQU1FLAotCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibygKLQkJCXBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOSEVSSVRFRF9BVFRSSUJVVEVTX05PVF9TVVBQT1JURUQKLQkJCSwgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOSEVSSVRFRF9BVFRSSUJVVEVTX05PVF9TVVBQT1JURUQpOwotCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQlwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX01BUFBJTkcsCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9NQVBQSU5HKTsKLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfRklFTEQsCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfRklFTEQpOwotCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQlwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9GSU5BTF9HRVRURVIsCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfR0VUVEVSKTsKLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfUFVCTElDX0ZJRUxELAotCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX1BVQkxJQ19GSUVMRCk7Ci0JCWFkZExhYmVsZWRDb21ibygKLQkJCXBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLk1BUFBJTkdfVU5SRVNPTFZFRF9NQVBQRURfQlksCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19VTlJFU09MVkVEX01BUFBFRF9CWSk7Ci0JCWFkZExhYmVsZWRDb21ibygKLQkJCXBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLk1BUFBJTkdfSU5WQUxJRF9NQVBQRURfQlksCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19JTlZBTElEX01BUFBFRF9CWSk7Ci0JCWFkZExhYmVsZWRDb21ibygKLQkJCXBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLk1BUFBJTkdfTUFQUEVEX0JZX09OX0JPVEhfU0lERVMsCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19NQVBQRURfQllfT05fQk9USF9TSURFUyk7Ci0JCWFkZExhYmVsZWRDb21ibygKLQkJCXBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRBUkdFVF9FTlRJVFlfTk9UX0RFRklORUQsCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFSR0VUX0VOVElUWV9OT1RfREVGSU5FRCk7Ci0JCWFkZExhYmVsZWRDb21ibygKLQkJCXBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRBUkdFVF9FTlRJVFlfSVNfTk9UX0FOX0VOVElUWSwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UQVJHRVRfRU5USVRZX0lTX05PVF9BTl9FTlRJVFkpOwotCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQlwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5NQVBTX0lEX1ZBTFVFX05PVF9TUEVDSUZJRUQsCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQU19JRF9WQUxVRV9OT1RfU1BFQ0lGSUVEKTsKLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuTUFQU19JRF9WQUxVRV9OT1RfUkVTT0xWRUQsCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQU19JRF9WQUxVRV9OT1RfUkVTT0xWRUQpOwotCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQlwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5NQVBTX0lEX1ZBTFVFX0lOVkFMSUQsCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQU19JRF9WQUxVRV9JTlZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuT1JERVJfQ09MVU1OX0FORF9PUkRFUl9CWV9CT1RIX1NQRUNJRklFRCwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5PUkRFUl9DT0xVTU5fQU5EX09SREVSX0JZX0JPVEhfU1BFQ0lGSUVEKTsKLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19OT1RfREVGSU5FRCwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX05PVF9ERUZJTkVEKTsKLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19NVVNUX0JFX0VNQkVEREFCTEVfT1JfQkFTSUNfVFlQRSwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX01VU1RfQkVfRU1CRUREQUJMRV9PUl9CQVNJQ19UWVBFKTsKLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuRUxFTUVOVF9DT0xMRUNUSU9OX01BUF9LRVlfQ0xBU1NfTk9UX0RFRklORUQsCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRUxFTUVOVF9DT0xMRUNUSU9OX01BUF9LRVlfQ0xBU1NfTk9UX0RFRklORUQpOwotCi0JCXBhcmVudCA9IGFkZFN1YkV4cGFuZGFibGVTZWN0aW9uKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLklNUExJRURfQVRUUklCVVRFX0xFVkVMX0NBVEVHT1JZKTsKLQkJCi0JCWFkZExhYmVsZWRDb21ibygKLQkJCXBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX1RBUkdFVF9FTlRJVFlfSVNfTk9UX0FOX0VOVElUWSwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX0lTX05PVF9BTl9FTlRJVFkpOwotCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQlwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX05PVF9ERUZJTkVELAotCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX1RBUkdFVF9FTlRJVFlfTk9UX0RFRklORUQpOwotCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQlwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX05PVF9ERUZJTkVELAotCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfTk9UX0RFRklORUQpOwotCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQlwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX01VU1RfQkVfRU1CRUREQUJMRV9PUl9CQVNJQ19UWVBFLAotCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfTVVTVF9CRV9FTUJFRERBQkxFX09SX0JBU0lDX1RZUEUpOwotCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQlwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fTUFQX0tFWV9DTEFTU19OT1RfREVGSU5FRCwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fTUFQX0tFWV9DTEFTU19OT1RfREVGSU5FRCk7CQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGREYXRhYmFzZUNhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcGFyZW50ID0gYWRkRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuREFUQUJBU0VfQ0FURUdPUlkpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJYWRkVGFibGVDYXRlZ29yeShwYXJlbnQpOwotCQlhZGRDb2x1bW5DYXRlZ29yeShwYXJlbnQpOwotCQlhZGRPdmVycmlkZXNDYXRlZ29yeShwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRUYWJsZUNhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXBhcmVudCA9IGFkZEV4cGFuZGFibGVTZWN0aW9uKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRBQkxFX0NBVEVHT1JZKTsKLQkJCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0cpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0cpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0cpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX1NFQ09OREFSWV9UQUJMRV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsIAkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TLCAJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX1NFQ09OREFSWV9UQUJMRV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX1NFQ09OREFSWV9UQUJMRV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUywgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkNPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0cpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSAJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfTkFNRSk7Ci0KLQkJcGFyZW50ID0gYWRkU3ViRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSU1QTElFRF9BVFRSSUJVVEVfTEVWRUxfQ0FURUdPUlkpOwotCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX05BTUUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQ29sdW1uQ2F0ZWdvcnkoQ29tcG9zaXRlIHBhcmVudCkgewkKLQkJcGFyZW50ID0gYWRkRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuQ09MVU1OX0NBVEVHT1JZKTsKLQkJCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5DT0xVTU5fVEFCTEVfTk9UX1ZBTElELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVEFCTEVfTk9UX1ZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX1RBQkxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX1RBQkxFKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUywgICAgICAgICAgICAgICAgICAgCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUywgCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLklOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLklOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLklOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLklOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLklOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsICAgICAgICAgICAgICAgICAgIAlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgICAgICAgICAgICAgICAgICAgICAgIAkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TLCAJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLklOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAJIAkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TLCAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgICAgICAgICAgIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyxKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsIAkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsIAkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCAJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUywgCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5PUkRFUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5PUkRFUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLk1BUF9LRVlfQ09MVU1OX1RBQkxFX05PVF9WQUxJRCwgCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQX0tFWV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEKTsKLQotCQlwYXJlbnQgPSBhZGRTdWJFeHBhbmRhYmxlU2VjdGlvbihwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5JTVBMSUVEX0FUVFJJQlVURV9MRVZFTF9DQVRFR09SWSk7Ci0KLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElELCAgICAgICAgICAgICAgICAgIAkJCQkgICAgICAgICAgICAgICAgICAgCSAJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUywgICAgICAgICAgICAgICAgICAgCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsCQkgCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQsICAgICAgCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQsICAgICAgCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsICAgICAgCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUywgICAgICAJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUsICAgICAgCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsICAgICAgICAgICAgICAgICAJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgICAgICAgICAgIAkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PUkRFUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX09SREVSX0NPTFVNTl9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElELCAJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQ09MVU1OX1RBQkxFX05PVF9WQUxJRCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE92ZXJyaWRlc0NhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsJCi0KLQkJcGFyZW50ID0gYWRkRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuT1ZFUlJJREVTX0NBVEVHT1JZKTsKLQotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRSwgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkFTU09DSUFUSU9OX09WRVJSSURFX0lOVkFMSURfTkFNRSwgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkFTU09DSUFUSU9OX09WRVJSSURFX0lOVkFMSURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUUsICAgICAgICAgICAgICAgICAgICAJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkFMSURfTkFNRSwgICAgICAgICAgICAgICAgICAgIAkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkFMSURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRSwgICAgICAgICAgICAgICAgICAgIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQsICAgICAgICAgICAgICAgICAgICAJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQsIAkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0csIAkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEsIAkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUUsIAkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgIAkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUsIAkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQsIAkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsIAkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TLCBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQsIAkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMsIAkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMsIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUyk7Ci0KLQkJCi0JCXBhcmVudCA9IGFkZFN1YkV4cGFuZGFibGVTZWN0aW9uKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLklNUExJRURfQVRUUklCVVRFX0xFVkVMX0NBVEVHT1JZKTsKLQotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRSwgICAgICAgICAgICAgICAgICAJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZBTElEX05BTUUsICAgICAgICAgICAgICAgICAgCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WQUxJRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRSwgICAgICAgICAgICAgICAgICAJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1RBQkxFX05PVF9WQUxJRCwgICAgICAgICAgICAgICAgICAJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQsIAkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRCwgICAgICAgICAgICAgICAgICAgCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLCAJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsIAkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TLCBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQsICAgICAgICAgICAgICAgICAgIAkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsIAkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMsIAkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMsIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJbmhlcml0YW5jZVN0cmF0ZWd5Q2F0ZWdvcnkoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXBhcmVudCA9IGFkZEV4cGFuZGFibGVTZWN0aW9uKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLklOSEVSSVRBTkNFX0NBVEVHT1JZKTsKLQotCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQlwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5ESVNDUklNSU5BVE9SX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRElTQ1JJTUlOQVRPUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuRU5USVRZX1RBQkxFX1BFUl9DTEFTU19OT1RfU1VQUE9SVEVEX09OX1BMQVRGT1JNLAotCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfTk9UX1NVUFBPUlRFRF9PTl9QTEFURk9STSk7Ci0JCWFkZExhYmVsZWRDb21ibygKLQkJCXBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfTk9UX1BPUlRBQkxFX09OX1BMQVRGT1JNLAotCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfTk9UX1BPUlRBQkxFX09OX1BMQVRGT1JNKTsKLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuRU5USVRZX1NJTkdMRV9UQUJMRV9ERVNDRU5EQU5UX0RFRklORVNfVEFCTEUsCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX1NJTkdMRV9UQUJMRV9ERVNDRU5EQU5UX0RFRklORVNfVEFCTEUpOwotCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQlwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5FTlRJVFlfQUJTVFJBQ1RfVEFCTEVfUEVSX0NMQVNTX0RFRklORVNfVEFCTEUsCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX0FCU1RSQUNUX1RBQkxFX1BFUl9DTEFTU19ERUZJTkVTX1RBQkxFKTsKLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuRU5USVRZX0FCU1RSQUNUX0RJU0NSSU1JTkFUT1JfVkFMVUVfREVGSU5FRCwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfQUJTVFJBQ1RfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVEKTsKLQkJYWRkTGFiZWxlZENvbWJvKAotCQkJcGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQsCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQpOwotCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQlwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5FTlRJVFlfTk9OX1JPT1RfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRCwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfTk9OX1JPT1RfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRCk7Ci0JCWFkZExhYmVsZWRDb21ibygKLQkJCXBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRCwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0RFRklORUQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRRdWVyaWVzR2VuZXJhdG9yc0NhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlwYXJlbnQgPSBhZGRFeHBhbmRhYmxlU2VjdGlvbihwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5RVUVSSUVTX0dFTkVSQVRPUlNfQ0FURUdPUlkpOwotCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5HRU5FUkFUT1JfRFVQTElDQVRFX05BTUUsICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5HRU5FUkFUT1JfRFVQTElDQVRFX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSURfTUFQUElOR19VTlJFU09MVkVEX0dFTkVSQVRPUl9OQU1FLCBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSURfTUFQUElOR19VTlJFU09MVkVEX0dFTkVSQVRPUl9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkdFTkVSQVRFRF9WQUxVRV9VTlJFU09MVkVEX0dFTkVSQVRPUiwgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkdFTkVSQVRFRF9WQUxVRV9VTlJFU09MVkVEX0dFTkVSQVRPUik7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5RVUVSWV9EVVBMSUNBVEVfTkFNRSwgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5RVUVSWV9EVVBMSUNBVEVfTkFNRSk7Ci0JfQotCQotCXByaXZhdGUgQ29tcG9zaXRlIGFkZEV4cGFuZGFibGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBhZGRFeHBhbmRhYmxlU2VjdGlvbihwYXJlbnQsIHRleHQsIG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCX0KLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBhZGRTdWJFeHBhbmRhYmxlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gYWRkRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCB0ZXh0LCBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBhZGRzIHRvIHRoZSBnaXZlbiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IGFuIGV4cGFuZGFibGUgcGFuZQotCSAqIHdoZXJlIGl0cyBjb250ZW50IGNhbiBiZSBzaG93biBvciBoaWRkZW4gZGVwZW5kaW5nIG9uIHRoZSBleHBhbnNpb24gc3RhdGUuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIHRpdGxlIG9mIHRoZSBleHBhbmRhYmxlIHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgdG8gd2hpY2ggd2lkZ2V0cyBjYW4gYmUgYWRkZWQsIHdoaWNoIGlzIGEgY2hpbGQgb2YKLQkgKiB0aGUgZXhwYW5kYWJsZSBwYW5lCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgYWRkRXhwYW5kYWJsZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIEdyaWREYXRhIGdyaWREYXRhKSB7Ci0JCUV4cGFuZGFibGVDb21wb3NpdGUgZXhwYW5kYWJsZVBhbmUgPSBuZXcgRXhwYW5kYWJsZUNvbXBvc2l0ZSgKLQkJCXBhcmVudCwKLQkJCVNXVC5OT05FLAotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5DTElFTlRfSU5ERU5UCi0JCSk7Ci0KLQkJZXhwYW5kYWJsZVBhbmUuc2V0VGV4dCh0ZXh0KTsKLQkJZXhwYW5kYWJsZVBhbmUuc2V0RXhwYW5kZWQoZmFsc2UpOwotCQlleHBhbmRhYmxlUGFuZS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldEJvbGQoSkZhY2VSZXNvdXJjZXMuRElBTE9HX0ZPTlQpKTsKLQkJZXhwYW5kYWJsZVBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWV4cGFuZGFibGVQYW5lLmFkZEV4cGFuc2lvbkxpc3RlbmVyKGJ1aWxkRXhwYW5zaW9uTGlzdGVuZXIoKSk7Ci0KLQkJdGhpcy5zY3JvbGxhYmxlLmFkYXB0Q2hpbGQoZXhwYW5kYWJsZVBhbmUpOwotCQl0aGlzLmV4cGFuZGFibGVQYW5lcy5hZGQoZXhwYW5kYWJsZVBhbmUpOwotCi0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoZXhwYW5kYWJsZVBhbmUsIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlleHBhbmRhYmxlUGFuZS5zZXRDbGllbnQocGFyZW50KTsKLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIGFkZHMgdG8gdGhlIGdpdmVuIHBhcmVudCBhIGxhYmVsZWQgY29tYm8gd2hlcmUgdGhlIHBvc3NpYmxlCi0JICogY2hvaWNlcyBhcmUgIklnbm9yZSIsICJFcnJvciIgYW5kICJXYXJuaW5nIi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB0byB3aGljaCB0aGUgd2lkZ2V0cyBhcmUgYWRkZWQKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGxhYmVsbGluZyB0aGUgY29tYm8KLQkgKiBAcGFyYW0gcHJlZmVyZW5jZUtleSBUaGUga2V5IHVzZWQgdG8gcmV0cmlldmUgYW5kIHRvIHN0b3JlIHRoZSB2YWx1ZQotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsaWRhdGlvbiBwcm9ibGVtCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExhYmVsZWRDb21ibyhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0LCBTdHJpbmcgcHJlZmVyZW5jZUtleSkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWxhYmVsLnNldFRleHQobGFiZWxUZXh0KTsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQljb21iby5zZXRJdGVtcyh0aGlzLnNldmVyaXR5RGlzcGxheVN0cmluZ3MpOwotCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJY29tYm8uc2V0RGF0YShQUkVGRVJFTkNFX0tFWSwgcHJlZmVyZW5jZUtleSk7Ci0JCWNvbWJvLnNlbGVjdChjb252ZXJ0UHJlZmVyZW5jZUtleVRvQ29tYm9JbmRleChwcmVmZXJlbmNlS2V5KSk7Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1aWxkQ29tYm9TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotCQl0aGlzLnNjcm9sbGFibGUuYWRhcHRDaGlsZChjb21ibyk7Ci0JCXRoaXMuY29tYm9zLmFkZChjb21ibyk7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZENvbWJvU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBlLndpZGdldDsKLQkJCQlTdHJpbmcgcHJlZmVyZW5jZUtleSA9IChTdHJpbmcpIGNvbWJvLmdldERhdGEoUFJFRkVSRU5DRV9LRVkpOwotCQkJCVN0cmluZyB2YWx1ZSA9IGNvbnZlcnRUb1ByZWZlcmVuY2VWYWx1ZShjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCQlKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2UudGhpcy5zZXZlcml0eUxldmVscy5wdXQocHJlZmVyZW5jZUtleSwgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRXhwYW5zaW9uQWRhcHRlciBidWlsZEV4cGFuc2lvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEV4cGFuc2lvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGV4cGFuc2lvblN0YXRlQ2hhbmdlZChFeHBhbnNpb25FdmVudCBlKSB7Ci0JCQkJSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlLnRoaXMuZXhwYW5zaW9uU3RhdGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGJ1aWxkU2V2ZXJpdHlEaXNwbGF5U3RyaW5ncygpIHsKLQkJU3RyaW5nW10gc2V2ZXJpdGllcyA9IG5ldyBTdHJpbmdbNF07Ci0JCXNldmVyaXRpZXNbRVJST1JfSU5ERVhdICAgPSBKcHRVaU1lc3NhZ2VzLkpwYVByb2JsZW1TZXZlcml0aWVzUGFnZV9FcnJvcjsKLQkJc2V2ZXJpdGllc1tXQVJOSU5HX0lOREVYXSA9IEpwdFVpTWVzc2FnZXMuSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX1dhcm5pbmc7Ci0JCXNldmVyaXRpZXNbSU5GT19JTkRFWF0gICAgPSBKcHRVaU1lc3NhZ2VzLkpwYVByb2JsZW1TZXZlcml0aWVzUGFnZV9JbmZvOwotCQlzZXZlcml0aWVzW0lHTk9SRV9JTkRFWF0gID0gSnB0VWlNZXNzYWdlcy5KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfSWdub3JlOwotCQlyZXR1cm4gc2V2ZXJpdGllczsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGNvbnZlcnRQcmVmZXJlbmNlS2V5VG9Db21ib0luZGV4KFN0cmluZyBwcmVmZXJlbmNlS2V5KSB7Ci0JCXJldHVybiBjb252ZXJ0UHJlZmVyZW5jZVZhbHVlVG9Db21ib0luZGV4KGdldFByZWZlcmVuY2VWYWx1ZShwcmVmZXJlbmNlS2V5KSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJlbmNlVmFsdWUoU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKLQkJU3RyaW5nIHByZWZlcmVuY2UgPSBudWxsOwotCQlpZiAoaXNQcm9qZWN0UHJlZmVyZW5jZVBhZ2UoKSAmJiBoYXNQcm9qZWN0U3BlY2lmaWNPcHRpb25zKGdldFByb2plY3QoKSkpIHsgLy91c2VQcm9qZWN0U2V0dGluZ3MoKSB3b24ndCB3b3JrIHNpbmNlIHRoZSBwYWdlIGlzIGJlaW5nIGJ1aWx0Ci0JCQlwcmVmZXJlbmNlID0gSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLmdldFByb2plY3RMZXZlbFByb2JsZW1QcmVmZXJlbmNlKGdldFByb2plY3QoKSwgcHJlZmVyZW5jZUtleSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvL2Rvbid0IGdldCB0aGUgd29ya3NwYWNlIHByZWZlcmVuY2Ugd2hlbiB0aGUgcHJvamVjdCBoYXMgb3ZlcnJpZGRlbiB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMKLQkJCXByZWZlcmVuY2UgPSBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuZ2V0V29ya3NwYWNlTGV2ZWxQcm9ibGVtUHJlZmVyZW5jZShwcmVmZXJlbmNlS2V5KTsKLQkJfQotCQlpZiAocHJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQlwcmVmZXJlbmNlID0gZ2V0RGVmYXVsdFByZWZlcmVuY2VWYWx1ZShwcmVmZXJlbmNlS2V5KTsKLQkJfQotCQlyZXR1cm4gcHJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgc2V2ZXJpdHkgb3IgRVJST1IgaWYgbm8gZGVmYXVsdCBleGlzdHMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0UHJlZmVyZW5jZVZhbHVlKFN0cmluZyBwcmVmZXJlbmNlS2V5KSB7Ci0JCVN0cmluZyBwcmVmZXJlbmNlID0gdGhpcy5kZWZhdWx0U2V2ZXJpdGllcy5nZXQocHJlZmVyZW5jZUtleSk7Ci0JCXJldHVybiBwcmVmZXJlbmNlID09IG51bGwgPyBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuRVJST1IgOiBwcmVmZXJlbmNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IGNvbnZlcnRQcmVmZXJlbmNlVmFsdWVUb0NvbWJvSW5kZXgoU3RyaW5nIHByZWZlcmVuY2VWYWx1ZSkgewotCQlpZiAoSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLkVSUk9SLmVxdWFscyhwcmVmZXJlbmNlVmFsdWUpKSB7Ci0JCQlyZXR1cm4gRVJST1JfSU5ERVg7Ci0JCX0KLQkJaWYgKEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5XQVJOSU5HLmVxdWFscyhwcmVmZXJlbmNlVmFsdWUpKSB7Ci0JCQlyZXR1cm4gV0FSTklOR19JTkRFWDsKLQkJfQotCQlpZiAoSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLklORk8uZXF1YWxzKHByZWZlcmVuY2VWYWx1ZSkpIHsKLQkJCXJldHVybiBJTkZPX0lOREVYOwotCQl9Ci0JCWlmIChKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuSUdOT1JFLmVxdWFscyhwcmVmZXJlbmNlVmFsdWUpKSB7Ci0JCQlyZXR1cm4gSUdOT1JFX0lOREVYOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1ByZWZlcmVuY2VWYWx1ZShpbnQgc2VsZWN0aW9uSW5kZXgpIHsKLQkJc3dpdGNoIChzZWxlY3Rpb25JbmRleCkgewotCQkJY2FzZSBFUlJPUl9JTkRFWDogICByZXR1cm4gSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLkVSUk9SOwotCQkJY2FzZSBXQVJOSU5HX0lOREVYOiByZXR1cm4gSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLldBUk5JTkc7Ci0JCQljYXNlIElORk9fSU5ERVg6ICAgIHJldHVybiBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuSU5GTzsKLQkJCWNhc2UgSUdOT1JFX0lOREVYOiAgcmV0dXJuIEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5JR05PUkU7Ci0JCQlkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV2YWxpZGF0ZXMgdGhlIGxheW91dCBpbiBvcmRlciB0byBzaG93IG9yIGhpZGUgdGhlIHZlcnRpY2FsIHNjcm9sbCBiYXIKLQkgKiBhZnRlciBhIHNlY3Rpb24gd2FzIGVpdGhlciBleHBhbmRlZCBvciBjb2xsYXBzZWQuIFRoaXMgdW5mb3J0dW5hdGVseSBkb2VzCi0JICogbm90IGhhcHBlbiBhdXRvbWF0aWNhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4cGFuc2lvblN0YXRlQ2hhbmdlZCgpIHsKLQkJdGhpcy5zY3JvbGxhYmxlLnJlZmxvdyh0cnVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSUQoKSB7Ci0JCXJldHVybiBKUFRfUFJFRkVSRU5DRVNfUFJPQkxFTV9TRVZFUklUSUVTX0lEOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHlQYWdlSUQoKSB7Ci0JCXJldHVybiBKUFRfUFJPUEVSVFlfUEFHRVNfUFJPQkxFTV9TRVZFUklUSUVTX0lEOwotCX0KLQotCXByb3RlY3RlZCBJRWNsaXBzZVByZWZlcmVuY2VzIGdldFByb2plY3RQcmVmZXJlbmNlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNQcm9qZWN0U3BlY2lmaWNPcHRpb25zKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZmVyZW5jZXMgPSBnZXRQcm9qZWN0UHJlZmVyZW5jZXMocHJvamVjdCk7Ci0JCXJldHVybiBwcm9qZWN0UHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuV09SS1NQQUNFX1BSRUZFUkVOQ0VTX09WRVJSSURFTiwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCS8vdGhpcyBjYWxsIHdvdWxkIGJlIHJlZHVuZGFudCBvbiBwcm9qZWN0IHByZWZlcmVuY2UgcGFnZSAtIGJ1ZyBpbiB0aGUgSkRUIHN1cGVyY2xhc3MKLQkJaWYgKCFpc1Byb2plY3RQcmVmZXJlbmNlUGFnZSgpKSB7Ci0JCQlyZXZlcnRUb0RlZmF1bHQoKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVQcm9qZWN0U3BlY2lmaWNTZXR0aW5ncyhib29sZWFuIHVzZVByb2plY3RTcGVjaWZpY1NldHRpbmdzKSB7Ci0JCXN1cGVyLmVuYWJsZVByb2plY3RTcGVjaWZpY1NldHRpbmdzKHVzZVByb2plY3RTcGVjaWZpY1NldHRpbmdzKTsKLQkJaWYgKGdldERlZmF1bHRzQnV0dG9uKCkgPT0gbnVsbCkgewotCQkJLy9ASGFjaygiSWYgdGhlIGRlZmF1bHRzIGJ1dHRvbiBpcyBudWxsIHRoZSBjb250cm9sIGlzIGN1cnJlbnRseSBiZWluZyBidWlsdCwiICsKLQkJCS8vICAgICAgIm90aGVyd2lzZSB0aGUgJ2VuYWJsZSBwcm9qZWN0IHNwZWNpZmljIHNldHRpbmdzJyBjaGVja2JveCBpcyBiZWluZyBwcmVzc2VkIikKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdGhpcy5oYXNQcm9qZWN0U3BlY2lmaWNQcmVmZXJlbmNlcyA9IEJvb2xlYW4udmFsdWVPZih1c2VQcm9qZWN0U3BlY2lmaWNTZXR0aW5ncyk7Ci0JCQotCQkvL3NldCBhbGwgc3BlY2lmaWVkIHdvcmtzcGFjZSBwcmVmZXJlbmNlcyBpbiB0aGUgcHJvamVjdCBwcmVmZXJlbmNlcwotCQlpZiAodXNlUHJvamVjdFNwZWNpZmljU2V0dGluZ3MpewotCQkJdGhpcy5vdmVycmlkZVdvcmtzcGFjZVByZWZlcmVuY2VzKCk7Ci0JCX0KLQkJZWxzZSB7Ly9yZW1vdmUgYW55IHByb2plY3Qgc3BlY2lmaWMgc2V0dGluZ3MgaWYgc2V0IHRvIGZhbHNlCi0JCQl0aGlzLnJldmVydFRvRGVmYXVsdCgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRvbid0IGNhbGwgdGhpcywgc2VlIGVuYWJsZVByb2plY3RTcGVjaWZpY1NldHRpbmdzIGZvciB0aGUgaGFjayB0aGF0IGxvb2tzIGZvciB0aGUgZGVmYXVsdHNCdXR0b24gYmVpbmcgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmV2ZXJ0VG9EZWZhdWx0KCkgewotCQlmb3IgKENvbWJvIGNvbWJvIDogdGhpcy5jb21ib3MpIHsKLQkJCVN0cmluZyBwcmVmZXJlbmNlS2V5ID0gKFN0cmluZykgY29tYm8uZ2V0RGF0YShQUkVGRVJFTkNFX0tFWSk7Ci0JCQlTdHJpbmcgcHJlZmVyZW5jZSA9IEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5nZXRXb3Jrc3BhY2VMZXZlbFByb2JsZW1QcmVmZXJlbmNlKHByZWZlcmVuY2VLZXkpOwotCQkJaWYgKHByZWZlcmVuY2UgPT0gbnVsbCkgewotCQkJCXByZWZlcmVuY2UgPSBnZXREZWZhdWx0UHJlZmVyZW5jZVZhbHVlKHByZWZlcmVuY2VLZXkpOwotCQkJfQotCQkJY29tYm8uc2VsZWN0KGNvbnZlcnRQcmVmZXJlbmNlVmFsdWVUb0NvbWJvSW5kZXgocHJlZmVyZW5jZSkpOwotCQkJLy9VSSB3aWxsIHNob3cgdGhlIGRlZmF1bHRzIGZyb20gdGhlIHdvcmtzcGFjZSwgYnV0IHNldCBhbGwgcHJlZmVyZW5jZXMgCi0JCQkvL3RvIG51bGwgc28gdGhleSB3aWxsIGJlIGRlbGV0ZWQgZnJvbSBwcm9qZWN0IHByZWZlcmVuY2VzCi0JCQl0aGlzLnNldmVyaXR5TGV2ZWxzLnB1dChwcmVmZXJlbmNlS2V5LCBudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG92ZXJyaWRlV29ya3NwYWNlUHJlZmVyZW5jZXMoKSB7Ci0JCWZvciAoQ29tYm8gY29tYm8gOiB0aGlzLmNvbWJvcykgewotCQkJU3RyaW5nIHByZWZlcmVuY2VLZXkgPSAoU3RyaW5nKSBjb21iby5nZXREYXRhKFBSRUZFUkVOQ0VfS0VZKTsKLQkJCVN0cmluZyB3b3Jrc3BhY2VQcmVmZXJlbmNlID0gSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLmdldFdvcmtzcGFjZUxldmVsUHJvYmxlbVByZWZlcmVuY2UocHJlZmVyZW5jZUtleSk7Ci0JCQlTdHJpbmcgZGVmYXVsdFByZWZlcmVuY2UgPSBnZXREZWZhdWx0UHJlZmVyZW5jZVZhbHVlKHByZWZlcmVuY2VLZXkpOwotCQkJaWYgKHdvcmtzcGFjZVByZWZlcmVuY2UgIT0gbnVsbCAmJiAhd29ya3NwYWNlUHJlZmVyZW5jZS5lcXVhbHMoZGVmYXVsdFByZWZlcmVuY2UpKSB7Ci0JCQkJY29tYm8uc2VsZWN0KGNvbnZlcnRQcmVmZXJlbmNlVmFsdWVUb0NvbWJvSW5kZXgod29ya3NwYWNlUHJlZmVyZW5jZSkpOwotCQkJCS8vc2lsbHkgY29tYm8gZG9lc24ndCBmaXJlIGEgc2VsZWN0aW9uIGV2ZW50LCBzbyB3ZSBjYW4ndCBleHBlY3Qgb3VyIGxpc3RlbmVyIHRvIHNldCB0aGlzCi0JCQkJdGhpcy5zZXZlcml0eUxldmVscy5wdXQocHJlZmVyZW5jZUtleSwgd29ya3NwYWNlUHJlZmVyZW5jZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljb21iby5zZWxlY3QoY29udmVydFByZWZlcmVuY2VWYWx1ZVRvQ29tYm9JbmRleChkZWZhdWx0UHJlZmVyZW5jZSkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8vICoqKioqKioqKiogT0svUmV2ZXJ0L0FwcGx5IGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3VwZXIucGVyZm9ybU9rKCk7Ci0JCWlmICh0aGlzLmhhc1Byb2plY3RTcGVjaWZpY1ByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJvamVjdFByZWZlcmVuY2VzID0gZ2V0UHJvamVjdFByZWZlcmVuY2VzKGdldFByb2plY3QoKSk7Ci0JCQlpZiAodGhpcy5oYXNQcm9qZWN0U3BlY2lmaWNQcmVmZXJlbmNlcy5ib29sZWFuVmFsdWUoKSkgewotCQkJCXByb2plY3RQcmVmZXJlbmNlcy5wdXRCb29sZWFuKEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5XT1JLU1BBQ0VfUFJFRkVSRU5DRVNfT1ZFUlJJREVOLCB0cnVlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXByb2plY3RQcmVmZXJlbmNlcy5yZW1vdmUoSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLldPUktTUEFDRV9QUkVGRVJFTkNFU19PVkVSUklERU4pOwotCQkJfQotCQkJSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLmZsdXNoKHByb2plY3RQcmVmZXJlbmNlcyk7Ci0JCX0KLQkJZm9yIChTdHJpbmcgdmFsaWRhdGlvblByZWZlcmVuY2VLZXkgOiB0aGlzLnNldmVyaXR5TGV2ZWxzLmtleVNldCgpKSB7Ci0JCQl1cGRhdGVQcmVmZXJlbmNlKHZhbGlkYXRpb25QcmVmZXJlbmNlS2V5LCB0aGlzLnNldmVyaXR5TGV2ZWxzLmdldCh2YWxpZGF0aW9uUHJlZmVyZW5jZUtleSkpOwotCQl9Ci0JCXRyeSB7Ci0JCQkvLyB0cnVlPWZvcms7IGZhbHNlPXVuY2FuY2VsbGFibGUKLQkJCXRoaXMuYnVpbGRPa1Byb2dyZXNzTW9uaXRvckRpYWxvZygpLnJ1bih0cnVlLCBmYWxzZSwgdGhpcy5idWlsZE9rUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSk7Ci0JCX0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gCi0JCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleC5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcmVmZXJlbmNlKFN0cmluZyBwcmVmZXJlbmNlS2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGlzUHJvamVjdFByZWZlcmVuY2VQYWdlKCkpIHsKLQkJCUpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5zZXRQcm9qZWN0TGV2ZWxQcm9ibGVtUHJlZmVyZW5jZShnZXRQcm9qZWN0KCksIHByZWZlcmVuY2VLZXksIHZhbHVlKTsKLQkJfQotCQllbHNlIHsKLQkJCUpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5zZXRXb3Jrc3BhY2VMZXZlbFByb2JsZW1QcmVmZXJlbmNlKHByZWZlcmVuY2VLZXksIHZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVJ1bm5hYmxlQ29udGV4dCBidWlsZE9rUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKCkgewotCQlyZXR1cm4gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyh0aGlzLmdldFNoZWxsKCkpOwotCX0KLQotCXByaXZhdGUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGJ1aWxkT2tSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJcmV0dXJuIG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCUlXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhlIGJ1aWxkIHdlIGV4ZWN1dGUgaW4gI3BlcmZvcm1Pa18oKSBsb2NrcyB0aGUgd29ya3NwYWNlIHJvb3QsCi0JCQkJCS8vIHNvIHdlIG5lZWQgdG8gdXNlIHRoZSB3b3Jrc3BhY2Ugcm9vdCBhcyBvdXIgc2NoZWR1bGluZyBydWxlIGhlcmUKLQkJCQkJd3MucnVuKAotCQkJCQkJCUpwYVByb2JsZW1TZXZlcml0aWVzUGFnZS50aGlzLmJ1aWxkT2tXb3Jrc3BhY2VSdW5uYWJsZSgpLAotCQkJCQkJCXdzLmdldFJvb3QoKSwKLQkJCQkJCQlJV29ya3NwYWNlLkFWT0lEX1VQREFURSwKLQkJCQkJCQltb25pdG9yCi0JCQkJCSk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JSVdvcmtzcGFjZVJ1bm5hYmxlIGJ1aWxkT2tXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlLnRoaXMucGVyZm9ybU9rXyhtb25pdG9yKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHBlcmZvcm1Pa18oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vaWYgcHJvamVjdCBpcyBudWxsIHRoaXMgaXMgYSB3b3Jrc3BhY2UgcHJlZmVyZW5jZSBwYWdlCi0JCWlmICh0aGlzLmdldFByb2plY3QoKT09bnVsbCkgewotCQkJSmF2YVBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsIG1vbml0b3IpOwotCQl9Ci0JCWVsc2UgdGhpcy5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBtb25pdG9yKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoZ2V0RGlhbG9nUHJlZmVyZW5jZXMoKSk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1ByZWZlcmVuY2VzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgcm9vdFNldHRpbmdzID0gSnB0VWlQbHVnaW4uaW5zdGFuY2UoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSByb290U2V0dGluZ3MuZ2V0U2VjdGlvbihTRVRUSU5HU19TRUNUSU9OX05BTUUpOwotCQlpZiAoc2V0dGluZ3MgPT0gbnVsbCkgewotCQkJc2V0dGluZ3MgPSByb290U2V0dGluZ3MuYWRkTmV3U2VjdGlvbihTRVRUSU5HU19TRUNUSU9OX05BTUUpOwotCQl9Ci0JCXJldHVybiBzZXR0aW5nczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzKSB7Ci0JCWZvciAoaW50IGluZGV4ID0gdGhpcy5leHBhbmRhYmxlUGFuZXMuc2l6ZSgpOyAtLWluZGV4ID49IDA7ICkgewotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSBleHBhbmRhYmxlUGFuZSA9IHRoaXMuZXhwYW5kYWJsZVBhbmVzLmdldChpbmRleCk7Ci0JCQlzZXR0aW5ncy5wdXQoU0VUVElOR1NfRVhQQU5ERUQgKyBpbmRleCwgZXhwYW5kYWJsZVBhbmUuaXNFeHBhbmRlZCgpKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRGF0YU1vZGVsUHJvcGVydHlQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0RhdGFNb2RlbFByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzBiNjRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRGF0YU1vZGVsUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsU3luY2hIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlZhbGlkYXRpb25TdGF0dXM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYXRhTW9kZWxQcm9wZXJ0eVBhZ2UgCi0JZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UKLQlpbXBsZW1lbnRzIExpc3RlbmVyLCBJRGF0YU1vZGVsTGlzdGVuZXIKLXsKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBtb2RlbDsKLQkKLQlwcml2YXRlIFZhbGlkYXRpb25TdGF0dXMgc3RhdHVzID0gbmV3IFZhbGlkYXRpb25TdGF0dXMoKTsKLQlwcml2YXRlIE1hcCB2YWxpZGF0aW9uTWFwOwotCXByaXZhdGUgU3RyaW5nW10gdmFsaWRhdGlvblByb3BlcnR5TmFtZXM7Ci0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRhdGluZyA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBEYXRhTW9kZWxTeW5jaEhlbHBlciBzeW5jaEhlbHBlcjsKLQkKLQlwcml2YXRlIFN0cmluZyBpbmZvcG9wSUQ7Ci0JCi0JCi0JcHJvdGVjdGVkIERhdGFNb2RlbFByb3BlcnR5UGFnZShJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJbW9kZWwuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCXN5bmNoSGVscGVyID0gaW5pdGlhbGl6ZVN5bmNoSGVscGVyKG1vZGVsKTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIERhdGFNb2RlbFN5bmNoSGVscGVyIGluaXRpYWxpemVTeW5jaEhlbHBlcihJRGF0YU1vZGVsIGRtKSB7Ci0JCXJldHVybiBuZXcgRGF0YU1vZGVsU3luY2hIZWxwZXIoZG0pOwotCX0KLQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHRvcCA9IGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7Ci0JCXNldHVwSW5mb3BvcCh0b3ApOwotCQlzZXREZWZhdWx0cygpOwotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJaW5pdGlhbGl6ZVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCk7Ci0JCXJldHVybiB0b3A7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvblByb3BlcnRpZXMoKSB7Ci0JCXZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzID0gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKTsKLQkJaWYgKHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzID09IG51bGwgfHwgdmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoID09IDApCi0JCQl2YWxpZGF0aW9uTWFwID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQllbHNlIHsKLQkJCXZhbGlkYXRpb25NYXAgPSBuZXcgSGFzaE1hcCh2YWxpZGF0aW9uUHJvcGVydHlOYW1lcy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykKLQkJCQl2YWxpZGF0aW9uTWFwLnB1dCh2YWxpZGF0aW9uUHJvcGVydHlOYW1lc1tpXSwgbmV3IEludGVnZXIoaSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3Mgc2hvdWxkIHJldHVybiB0aGUgbW9kZWwgcHJvcGVydHkgbmFtZXMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkYXRlZCBvbiB0aGlzIHBhZ2UgaW4gdGhlCi0JICogb3JkZXIgdGhhdCB0aGV5IHNob3VsZCBwcmVzZW50IHRoZWlyIG1lc3NhZ2VzLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdG9wIGxldmVsIENvbXBvc2l0ZSBmb3IgdGhpcyBwYWdlLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBTZXQgdXAgaW5mbyBwb3AgaG9va3MgaWYgc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwSW5mb3BvcChDb250cm9sIHBhcmVudCkgewotCQlpZiAoZ2V0SW5mb3BvcElEKCkgIT0gbnVsbCkKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBnZXRJbmZvcG9wSUQoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0dXAgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGlzIHBhZ2UuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHByb3ZpZGUgYXBwcm9wcmlhdGUKLQkgKiBkZWZhdWx0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0cygpIHsKLQkJcmVzdG9yZURlZmF1bHRTZXR0aW5ncygpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzIG1ldGhvZCBpZiB0aGV5IGhhdmUgZGVmYXVsdCBzZXR0aW5ncyB0aGF0IGhhdmUgYmVlbiBzdG9yZWQKLQkgKiBhbmQgbmVlZCB0byBiZSByZXN0b3JlZC4KLQkgKiAKLQkgKiBAc2VlIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCX0KLQotCS8qKgotCSAqIEFkZCBMaXN0ZW5lcnMgdG8gY29udHJvbHMgYXQgdGhpcyBwb2ludCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBldmVudHMuIFN1YmNsYXNzZXMgc2hvdWxkCi0JICogb3ZlcnJpZGUgdG8gYWRkIGxpc3RlbmVycyB0byBpdHMgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCX0KLQotCS8qKgotCSAqIEV4aXRpbmcgdGhlIHBhZ2UuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleGl0KCkgewotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGdldFN0YXR1cyhJbnRlZ2VyIGtleSkgewotCQlyZXR1cm4gc3RhdHVzLmhhc0Vycm9yKGtleSk7Ci0JfQotCi0JLyoqCi0JICogU2VudCB3aGVuIGFuIGV2ZW50IHRoYXQgdGhlIHJlY2VpdmVyIGhhcyByZWdpc3RlcmVkIGZvciBvY2N1cnMuIElmIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoaXMKLQkgKiBtZXRob2QsIGl0IG11c3QgY2FsbCBzdXBlci4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBldmVudCB3aGljaCBvY2N1cnJlZAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHBhZ2UgYmFzZWQgb24gdGhlIGxhc3QgZXJyb3IgaW4gdGhlIFZhbGlkYXRpb25TdGF0dXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JNZXNzYWdlKCkgewotCQlTdHJpbmcgZXJyb3IgPSBzdGF0dXMuZ2V0TGFzdEVyck1zZygpOwotCQlpZiAoZXJyb3IgPT0gbnVsbCkgewotCQkJaWYgKGdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpCi0JCQkJc2V0RXJyb3JNZXNzYWdlKChTdHJpbmcpIG51bGwpOwotCQkJU3RyaW5nIHdhcm5pbmcgPSBzdGF0dXMuZ2V0TGFzdFdhcm5pbmdNc2coKTsKLQkJCWlmICh3YXJuaW5nID09IG51bGwpIHsKLQkJCQlpZiAoZ2V0TWVzc2FnZSgpICE9IG51bGwgJiYgZ2V0TWVzc2FnZVR5cGUoKSA9PSBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpCi0JCQkJCXNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJCQllbHNlIHsKLQkJCQkJU3RyaW5nIGluZm8gPSBzdGF0dXMuZ2V0TGFzdEluZm9Nc2coKTsKLQkJCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCQkJaWYgKGdldE1lc3NhZ2UoKSAhPSBudWxsICYmIGdldE1lc3NhZ2VUeXBlKCkgPT0gSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTikKLQkJCQkJCQlzZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pOwotCQkJCQl9IGVsc2UgaWYgKCFpbmZvLmVxdWFscyhnZXRNZXNzYWdlKCkpKSB7Ci0JCQkJCQlzZXRNZXNzYWdlKGluZm8sIElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmICghd2FybmluZy5lcXVhbHMoZ2V0TWVzc2FnZSgpKSkKLQkJCQlzZXRNZXNzYWdlKHdhcm5pbmcsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCX0gZWxzZSBpZiAoIWVycm9yLmVxdWFscyhnZXRFcnJvck1lc3NhZ2UoKSkpCi0JCQkJCQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yKTsKLQkJCQkJCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yU3RhdHVzKEludGVnZXIga2V5LCBTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCXN0YXR1cy5zZXRFcnJvclN0YXR1cyhrZXksIGVycm9yTWVzc2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2FybmluZ1N0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIHdhcm5pbmdNZXNzYWdlKSB7Ci0JCXN0YXR1cy5zZXRXYXJuaW5nU3RhdHVzKGtleSwgd2FybmluZ01lc3NhZ2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbmZvU3RhdHVzKEludGVnZXIga2V5LCBTdHJpbmcgaW5mb01lc3NhZ2UpIHsKLQkJc3RhdHVzLnNldEluZm9TdGF0dXMoa2V5LCBpbmZvTWVzc2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T0tTdGF0dXMoSW50ZWdlciBrZXkpIHsKLQkJc3RhdHVzLnNldE9LU3RhdHVzKGtleSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBXaXphcmQganVzdCBwcmlvciB0byBydW5uaW5nIHRoZSBwZXJmb3JtRmluaXNoIG9wZXJhdGlvbi4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBzdG9yZSB0aGVpciBkZWZhdWx0IHNldHRpbmdzLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCX0KLQotCS8qKgotCSAqIFRoZSBwYWdlIGlzIG5vdyBiZWluZyB2YWxpZGF0ZWQuIEF0IHRoaXMgdGltZSwgZWFjaCBjb250cm9sIGlzIHZhbGlkYXRlZCBhbmQgdGhlbiB0aGUKLQkgKiBjb250cm9scyBhcmUgdXBkYXRlZCBiYXNlZCBvbiB0aGUgcmVzdWx0cyBpbiB0aGUgVmFsaWRhdGlvblN0YXR1cyB3aGljaCB3YXMgdXBkYXRlZCBkdXJpbmcKLQkgKiA8Y29kZT52YWxpZGF0ZUNvbnRyb2xzKCk8L2NvZGU+LiBGaW5hbGx5LCBpdCB3aWxsIGRpc3BsYXkgdGhlIGxhc3QgZXJyb3IgbWVzc2FnZSBhbmQgaXQKLQkgKiB3aWxsIHNldCB0aGUgcGFnZSBjb21wbGV0ZS4gU3ViY2xhc3NlcyB3aWxsIG5vdCB0eXBpY2FsbHkgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYWdlKCkgewotCQlpZiAoIWlzVmFsaWRhdGluZykgewotCQkJaXNWYWxpZGF0aW5nID0gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJdmFsaWRhdGVDb250cm9sc0Jhc2UoKTsKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJCXNldEVycm9yTWVzc2FnZSgpOwotCQkJCXNldFZhbGlkKHN0YXR1cy5nZXRMYXN0RXJyTXNnKCkgPT0gbnVsbCk7Ci0JCQl9IAotCQkJZmluYWxseSB7Ci0JCQkJaXNWYWxpZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSBpbmRpdmlkdWFsIGNvbnRyb2xzLiBVc2UgdmFsaWRhdGlvbiBrZXlzIHRvIGtlZXAgdHJhY2sgb2YgZXJyb3JzLgotCSAqIAotCSAqIEBzZWUgc2V0T0tTdGF0dXMoSW50ZWdlcikgYW5kIHNldEVycm9yTWVzc2FnZShJbnRlZ2VyLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyB2YWxpZGF0ZUNvbnRyb2xzQmFzZSgpIHsKLQkJaWYgKCF2YWxpZGF0aW9uTWFwLmlzRW1wdHkoKSkgewotCQkJU3RyaW5nIHByb3BOYW1lOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCXByb3BOYW1lID0gdmFsaWRhdGlvblByb3BlcnR5TmFtZXNbaV07Ci0JCQkJSW50ZWdlciB2YWxLZXkgPSAoSW50ZWdlcikgdmFsaWRhdGlvbk1hcC5nZXQocHJvcE5hbWUpOwotCQkJCWlmICh2YWxLZXkgIT0gbnVsbCkKLQkJCQkJdmFsaWRhdGVQcm9wZXJ0eShwcm9wTmFtZSwgdmFsS2V5KTsKLQkJCQlpZiAoIWdldFN0YXR1cyh2YWxLZXkpKQotCQkJCQlyZXR1cm4gcHJvcE5hbWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBwYXJhbSB2YWxpZGF0aW9ua2V5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgSW50ZWdlciB2YWxpZGF0aW9uS2V5KSB7Ci0JCXNldE9LU3RhdHVzKHZhbGlkYXRpb25LZXkpOwotCQlJU3RhdHVzIHN0YXR1czEgPSBtb2RlbC52YWxpZGF0ZVByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmICghc3RhdHVzMS5pc09LKCkpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gc3RhdHVzMS5pc011bHRpU3RhdHVzKCkgPyBzdGF0dXMxLmdldENoaWxkcmVuKClbMF0uZ2V0TWVzc2FnZSgpIDogc3RhdHVzMS5nZXRNZXNzYWdlKCk7Ci0JCQlzd2l0Y2ggKHN0YXR1czEuZ2V0U2V2ZXJpdHkoKSkgewotCQkJCWNhc2UgSVN0YXR1cy5FUlJPUiA6Ci0JCQkJCXNldEVycm9yU3RhdHVzKHZhbGlkYXRpb25LZXksIG1lc3NhZ2UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElTdGF0dXMuV0FSTklORyA6Ci0JCQkJCXNldFdhcm5pbmdTdGF0dXModmFsaWRhdGlvbktleSwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVN0YXR1cy5JTkZPIDoKLQkJCQkJc2V0SW5mb1N0YXR1cyh2YWxpZGF0aW9uS2V5LCBtZXNzYWdlKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGVuYWJsZW1lbnQgb2YgY29udHJvbHMgYWZ0ZXIgdmFsaWRhdGlvbi4gU3VibGNhc3NlcyBzaG91bGQgY2hlY2sgdGhlIHN0YXR1cyBvZgotCSAqIHZhbGlkYXRpb24ga2V5cyB0byBkZXRlcm1pbmUgZW5hYmxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQl9Ci0JCi0JCi0JLyoKLQkgKiBJZiBhIHByb3BlcnR5IGNoYW5nZXMgdGhhdCB3ZSB3YW50IHRvIHZhbGlkYXRlLCBmb3JjZSB2YWxpZGF0aW9uIG9uIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uV1RQT3BlcmF0aW9uRGF0YU1vZGVsTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2VkKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCWlmICh2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyAhPSBudWxsICYmIChldmVudC5nZXRGbGFnKCkgPT0gRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHIHx8ICghaXNWYWxpZCgpICYmIGV2ZW50LmdldEZsYWcoKSA9PSBEYXRhTW9kZWxFdmVudC5WQUxJRF9WQUxVRVNfQ0hHKSkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodmFsaWRhdGlvblByb3BlcnR5TmFtZXNbaV0uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCQkJdmFsaWRhdGVQYWdlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAoc3luY2hIZWxwZXIgIT0gbnVsbCkgewotCQkJc3luY2hIZWxwZXIuZGlzcG9zZSgpOwotCQkJc3luY2hIZWxwZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbmZvcG9wSUQoKSB7Ci0JCXJldHVybiBpbmZvcG9wSUQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5mb3BvcElEKFN0cmluZyBpbmZvcG9wSUQpIHsKLQkJdGhpcy5pbmZvcG9wSUQgPSBpbmZvcG9wSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSnBhUHJvamVjdFByb3BlcnRpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MjNiNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5saWJwcm92LkxpYnJhcnlQcm92aWRlckZyYW1ld29ya1VpLmNyZWF0ZUluc3RhbGxMaWJyYXJ5UGFuZWw7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwdENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5saWJwcm92LkpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5KcGFQcm9qZWN0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5KcHREYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi51aS5pbnRlcm5hbC5EVFBVaVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5KcGEyXzBQcm9qZWN0RmxhZ01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CaXRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTm90Qm9vbGVhblRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Bc3BlY3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNldENvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TaW1wbGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5JTGlicmFyeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5MaWJyYXJ5SW5zdGFsbERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5saWJwcm92LkxpYnJhcnlGYWNldFByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLkZhY2V0c1Byb3BlcnR5UGFnZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogV2F5IG1vcmUgY29tcGxpY2F0ZWQgVUkgdGhhbiB5b3Ugd291bGQgdGhpbmsuLi4uCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UKLQlleHRlbmRzIExpYnJhcnlGYWNldFByb3BlcnR5UGFnZSAKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lEID0gIm9yZy5lY2xpcHNlLmpwdC51aS5qcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPElQcm9qZWN0PiBwcm9qZWN0TW9kZWw7Ci0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsOwotCXByaXZhdGUgZmluYWwgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5UcmlnZ2VyIHRyaWdnZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBwbGF0Zm9ybUlkTW9kZWw7Ci0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHBsYXRmb3JtSWRMaXN0ZW5lcjsKLQotCXByaXZhdGUgZmluYWwgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGNvbm5lY3Rpb25Nb2RlbDsKLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxDb25uZWN0aW9uUHJvZmlsZT4gY29ubmVjdGlvblByb2ZpbGVNb2RlbDsKLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBkaXNjb25uZWN0ZWRNb2RlbDsKLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZGlzY29ubmVjdGVkTW9kZWxMaXN0ZW5lcjsKLQlwcml2YXRlIExpbmsgY29ubmVjdExpbms7Ci0KLQlwcml2YXRlIGZpbmFsIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWw7Ci0JcHJpdmF0ZSBmaW5hbCBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dNb2RlbDsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGVmYXVsdENhdGFsb2dNb2RlbDsKLQlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gY2F0YWxvZ0Nob2ljZXNNb2RlbDsKLQotCXByaXZhdGUgZmluYWwgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hRmxhZ01vZGVsOwotCXByaXZhdGUgZmluYWwgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFNb2RlbDsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGVmYXVsdFNjaGVtYU1vZGVsOwotCXByaXZhdGUgZmluYWwgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBzY2hlbWFDaG9pY2VzTW9kZWw7Ci0KLQlwcml2YXRlIGZpbmFsIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzTW9kZWw7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBsaXN0QW5ub3RhdGVkQ2xhc3Nlc01vZGVsOwotCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4ganBhMl8wUHJvamVjdEZsYWdNb2RlbDsKLQotCXByaXZhdGUgZmluYWwgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG1ldGFtb2RlbFNvdXJjZUZvbGRlck1vZGVsOwotCXByaXZhdGUgZmluYWwgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBqYXZhU291cmNlRm9sZGVyQ2hvaWNlc01vZGVsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9QQVRIU19QUk9QRVJUWV9QQUdFX0lEID0gIm9yZy5lY2xpcHNlLmpkdC51aS5wcm9wZXJ0eVBhZ2VzLkJ1aWxkUGF0aHNQcm9wZXJ0eVBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIENoYW5nZUxpc3RlbmVyIHZhbGlkYXRpb25MaXN0ZW5lcjsKLQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JLyogcHJpdmF0ZSAqLyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxTdHJpbmc+IFNUUklOR19DT01QQVJBVE9SID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQotCi0JLy8gKioqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqKioKLQotCXB1YmxpYyBKcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5wcm9qZWN0TW9kZWwgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPElQcm9qZWN0PigpOwotCQl0aGlzLmpwYVByb2plY3RNb2RlbCA9IG5ldyBKcGFQcm9qZWN0TW9kZWwodGhpcy5wcm9qZWN0TW9kZWwpOwotCQl0aGlzLnRyaWdnZXIgPSBuZXcgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5UcmlnZ2VyKCk7Ci0KLQkJdGhpcy5wbGF0Zm9ybUlkTW9kZWwgPSB0aGlzLmJ1aWxkUGxhdGZvcm1JZE1vZGVsKCk7Ci0JCXRoaXMucGxhdGZvcm1JZExpc3RlbmVyID0gdGhpcy5idWlsZFBsYXRmb3JtSWRMaXN0ZW5lcigpOwotCQl0aGlzLnBsYXRmb3JtSWRNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wbGF0Zm9ybUlkTGlzdGVuZXIpOwotCi0JCXRoaXMuY29ubmVjdGlvbk1vZGVsID0gdGhpcy5idWlsZENvbm5lY3Rpb25Nb2RlbCgpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTW9kZWwgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGVNb2RlbCgpOwotCQl0aGlzLmRpc2Nvbm5lY3RlZE1vZGVsID0gdGhpcy5idWlsZERpc2Nvbm5lY3RlZE1vZGVsKCk7Ci0JCXRoaXMuZGlzY29ubmVjdGVkTW9kZWxMaXN0ZW5lciA9IGJ1aWxkRGlzY29ubmVjdGVkTW9kZWxMaXN0ZW5lcigpOwotCi0JCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwgPSB0aGlzLmJ1aWxkVXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwoKTsKLQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ01vZGVsID0gdGhpcy5idWlsZFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nTW9kZWwoKTsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsID0gdGhpcy5idWlsZERlZmF1bHRDYXRhbG9nTW9kZWwoKTsKLQkJdGhpcy5jYXRhbG9nQ2hvaWNlc01vZGVsID0gdGhpcy5idWlsZENhdGFsb2dDaG9pY2VzTW9kZWwoKTsKLQotCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnTW9kZWwgPSB0aGlzLmJ1aWxkVXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYUZsYWdNb2RlbCgpOwotCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFNb2RlbCA9IHRoaXMuYnVpbGRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTW9kZWwoKTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hTW9kZWwgPSB0aGlzLmJ1aWxkRGVmYXVsdFNjaGVtYU1vZGVsKCk7Ci0JCXRoaXMuc2NoZW1hQ2hvaWNlc01vZGVsID0gdGhpcy5idWlsZFNjaGVtYUNob2ljZXNNb2RlbCgpOwotCi0JCXRoaXMuZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzTW9kZWwgPSB0aGlzLmJ1aWxkRGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzTW9kZWwoKTsKLQkJdGhpcy5saXN0QW5ub3RhdGVkQ2xhc3Nlc01vZGVsID0gdGhpcy5idWlsZExpc3RBbm5vdGF0ZWRDbGFzc2VzTW9kZWwoKTsKLQotCQl0aGlzLmpwYTJfMFByb2plY3RGbGFnTW9kZWwgPSB0aGlzLmJ1aWxkSnBhMl8wUHJvamVjdEZsYWdNb2RlbCgpOwotCi0JCXRoaXMubWV0YW1vZGVsU291cmNlRm9sZGVyTW9kZWwgPSB0aGlzLmJ1aWxkTWV0YW1vZGVsU291cmNlRm9sZGVyTW9kZWwoKTsKLQkJdGhpcy5qYXZhU291cmNlRm9sZGVyQ2hvaWNlc01vZGVsID0gdGhpcy5idWlsZEphdmFTb3VyY2VGb2xkZXJDaG9pY2VzTW9kZWwoKTsKLQotCQl0aGlzLnZhbGlkYXRpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWxpZGF0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5lbmdhZ2VWYWxpZGF0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQkvLyAqKioqKiBwbGF0Zm9ybSBJRCBtb2RlbAotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUGxhdGZvcm1JZE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihuZXcgUGxhdGZvcm1JZE1vZGVsKHRoaXMuanBhUHJvamVjdE1vZGVsKSwgdGhpcy50cmlnZ2VyKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQbGF0Zm9ybUlkTGlzdGVuZXIoKXsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlKcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UudGhpcy5wbGF0Zm9ybUlkQ2hhbmdlZCgoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHBsYXRmb3JtSWRDaGFuZ2VkKFN0cmluZyBuZXdQbGF0Zm9ybUlkKSB7Ci0JCWlmICggISB0aGlzLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCS8vIGhhbmRsZSBudWxsLCBpbiB0aGUgY2FzZSB0aGUganBhIGZhY2V0IGlzIGNoYW5nZWQgdmlhIHRoZSBmYWNldHMgcGFnZSwKLQkJCS8vIHRoZSBsaWJyYXJ5IGluc3RhbGwgZGVsZWdhdGUgaXMgdGVtcG9yYXJpbHkgbnVsbAotCQkJYWRqdXN0TGlicmFyeVByb3ZpZGVycygpOwotCQl9Ci0JfQotCi0JLy8gKioqKiogY29ubmVjdGlvbiBtb2RlbHMKLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbm5lY3Rpb25Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4obmV3IENvbm5lY3Rpb25Nb2RlbCh0aGlzLmpwYVByb2plY3RNb2RlbCksIHRoaXMudHJpZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvblByb2ZpbGU+IGJ1aWxkQ29ubmVjdGlvblByb2ZpbGVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uUHJvZmlsZU1vZGVsKHRoaXMuY29ubmVjdGlvbk1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERpc2Nvbm5lY3RlZE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IERpc2Nvbm5lY3RlZE1vZGVsKHRoaXMuY29ubmVjdGlvblByb2ZpbGVNb2RlbCk7Ci0JfQotCi0JLy8gKioqKiogY2F0YWxvZyBtb2RlbHMKLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0ZsYWdNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KG5ldyBVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0ZsYWdNb2RlbCh0aGlzLmpwYVByb2plY3RNb2RlbCksIHRoaXMudHJpZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ01vZGVsKCkgewotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihuZXcgVXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dNb2RlbCh0aGlzLmpwYVByb2plY3RNb2RlbCksIHRoaXMudHJpZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdENhdGFsb2dNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0TW9kZWwoCi0JCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwsCi0JCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dNb2RlbCwKLQkJCQkJdGhpcy5idWlsZERhdGFiYXNlRGVmYXVsdENhdGFsb2dNb2RlbCgpCi0JCQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGF0YWJhc2VEZWZhdWx0Q2F0YWxvZ01vZGVsKCkgewotCQlyZXR1cm4gbmV3IERhdGFiYXNlRGVmYXVsdENhdGFsb2dNb2RlbCh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgZGVmYXVsdCBjYXRhbG9nIGlmIGl0IGlzIG5vdCBvbiB0aGUgbGlzdCBmcm9tIHRoZSBkYXRhYmFzZQotCSAqLwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENhdGFsb2dDaG9pY2VzTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy5idWlsZFVuc29ydGVkQ2F0YWxvZ0Nob2ljZXNNb2RlbCgpLCBTVFJJTkdfQ09NUEFSQVRPUik7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBkZWZhdWx0IGNhdGFsb2cgaWYgaXQgaXMgbm90IG9uIHRoZSBsaXN0IGZyb20gdGhlIGRhdGFiYXNlCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVW5zb3J0ZWRDYXRhbG9nQ2hvaWNlc01vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNldENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oCi0JCQkJCW5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KAotCQkJCQkJCW5ldyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMuZGVmYXVsdENhdGFsb2dNb2RlbCksCi0JCQkJCQkJdGhpcy5idWlsZERhdGFiYXNlQ2F0YWxvZ0Nob2ljZXNNb2RlbCgpCi0JCQkJCSkKLQkJCSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGF0YWJhc2VDYXRhbG9nQ2hvaWNlc01vZGVsKCkgewotCQlyZXR1cm4gbmV3IERhdGFiYXNlQ2F0YWxvZ0Nob2ljZXNNb2RlbCh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpOwotCX0KLQotCS8vICoqKioqIHNjaGVtYSBtb2RlbHMKLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hRmxhZ01vZGVsKCkgewotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4obmV3IFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnTW9kZWwodGhpcy5qcGFQcm9qZWN0TW9kZWwpLCB0aGlzLnRyaWdnZXIpOwotCX0KLQotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihuZXcgVXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU1vZGVsKHRoaXMuanBhUHJvamVjdE1vZGVsKSwgdGhpcy50cmlnZ2VyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2NoZW1hTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdE1vZGVsKAotCQkJCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnTW9kZWwsCi0JCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU1vZGVsLAotCQkJCQl0aGlzLmJ1aWxkRGF0YWJhc2VEZWZhdWx0U2NoZW1hTW9kZWwoKQotCQkJCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERhdGFiYXNlRGVmYXVsdFNjaGVtYU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IERhdGFiYXNlRGVmYXVsdFNjaGVtYU1vZGVsKHRoaXMuY29ubmVjdGlvblByb2ZpbGVNb2RlbCwgdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGRlZmF1bHQgY2F0YWxvZyBpZiBpdCBpcyBub3Qgb24gdGhlIGxpc3QgZnJvbSB0aGUgZGF0YWJhc2UKLQkgKi8KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTY2hlbWFDaG9pY2VzTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy5idWlsZFVuc29ydGVkU2NoZW1hQ2hvaWNlc01vZGVsKCksIFNUUklOR19DT01QQVJBVE9SKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVbnNvcnRlZFNjaGVtYUNob2ljZXNNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJCW5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KAotCQkJCQkJbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy5kZWZhdWx0U2NoZW1hTW9kZWwpLAotCQkJCQkJdGhpcy5idWlsZERhdGFiYXNlU2NoZW1hQ2hvaWNlc01vZGVsKCkKLQkJCQkpCi0JCQkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERhdGFiYXNlU2NoZW1hQ2hvaWNlc01vZGVsKCkgewotCQlyZXR1cm4gbmV3IERhdGFiYXNlU2NoZW1hQ2hvaWNlc01vZGVsKHRoaXMuY29ubmVjdGlvblByb2ZpbGVNb2RlbCwgdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsKTsKLQl9Ci0KLQkvLyAqKioqKiBkaXNjb3Zlci9saXN0IGFubm90YXRlZCBjbGFzc2VzIG1vZGVscwotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlc01vZGVsKCkgewotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4obmV3IERpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlc01vZGVsKHRoaXMuanBhUHJvamVjdE1vZGVsKSwgdGhpcy50cmlnZ2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgb3Bwb3NpdGUgb2YgdGhlICJkaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyIgZmxhZy4KLQkgKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTGlzdEFubm90YXRlZENsYXNzZXNNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIEJvb2xlYW4+KHRoaXMuZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzTW9kZWwsIE5vdEJvb2xlYW5UcmFuc2Zvcm1lci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JLy8gKioqKiogSlBBIDIuMCBwcm9qZWN0IGZsYWcKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEpwYTJfMFByb2plY3RGbGFnTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgSnBhMl8wUHJvamVjdEZsYWdNb2RlbDxKcGFQcm9qZWN0Pih0aGlzLmpwYVByb2plY3RNb2RlbCk7Ci0JfQotCi0JLy8gKioqKiogbWV0YW1vZGVsIG1vZGVscwotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTWV0YW1vZGVsU291cmNlRm9sZGVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KG5ldyBNZXRhbW9kZWxTb3VyY2VGb2xkZXJNb2RlbCh0aGlzLmpwYVByb2plY3RNb2RlbCksIHRoaXMudHJpZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkSmF2YVNvdXJjZUZvbGRlckNob2ljZXNNb2RlbCgpIHsKLQkJLy8gYnkgZGVmYXVsdCwgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIgcHV0cyBhIG51bGwgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdAotCQlyZXR1cm4gbmV3IEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4oCi0JCQkJCW5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCQkJCW5ldyBKYXZhU291cmNlRm9sZGVyQ2hvaWNlc01vZGVsKHRoaXMuanBhUHJvamVjdE1vZGVsKSwKLQkJCQkJCVNUUklOR19DT01QQVJBVE9SCi0JCQkJCSkKLQkJCQkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgU3RyaW5nIGdldENvbm5lY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uTW9kZWwuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZU1vZGVsLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nRmxhZ0lzU2V0KCkgewotCQlyZXR1cm4gZmxhZ0lzU2V0KHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwpOwotCX0KLQotCS8qIHByaXZhdGUgKi8gc3RhdGljIGJvb2xlYW4gZmxhZ0lzU2V0KFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnTW9kZWwpIHsKLQkJQm9vbGVhbiBmbGFnID0gZmxhZ01vZGVsLmdldFZhbHVlKCk7Ci0JCXJldHVybiAoZmxhZyAhPSBudWxsKSAmJiBmbGFnLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ01vZGVsLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnSXNTZXQoKSB7Ci0JCXJldHVybiBmbGFnSXNTZXQodGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hRmxhZ01vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTW9kZWwuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyIGdldFdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIoKSB7Ci0JCUlXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyIGNvbnRhaW5lcj0gKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExpYnJhcnlGYWNldFByb3BlcnR5UGFnZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RmFjZXRlZFByb2plY3QoKS5nZXRJbnN0YWxsZWRWZXJzaW9uKEpwYUZhY2V0LkZBQ0VUKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBjcmVhdGVMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKElGYWNldGVkUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdikgewotCQlMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGxpZCA9IG5ldyBMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKHByb2plY3QsIGZ2LCBudWxsKTsKLQkJbGlkLmFkZExpc3RlbmVyKGJ1aWxkTGlicmFyeVByb3ZpZGVyTGlzdGVuZXIoKSk7Ci0JCXJldHVybiBsaWQ7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZExpYnJhcnlQcm92aWRlckxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHksIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlICkgewotCQkJCQlpZiAoTGlicmFyeUluc3RhbGxEZWxlZ2F0ZS5QUk9QX0FWQUlMQUJMRV9QUk9WSURFUlMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJCQkJYWRqdXN0TGlicmFyeVByb3ZpZGVycygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRqdXN0TGlicmFyeVByb3ZpZGVycygpIHsKLQkJTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBsaWQgPSB0aGlzLmdldExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoKTsKLQkJaWYgKGxpZCAhPSBudWxsKSB7Ci0JCQlMaXN0PEpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc+IGpwYUNvbmZpZ3MgCi0JCQkJCT0gbmV3IEFycmF5TGlzdDxKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnPigpOwotCQkJLy8gYWRkIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb25lIGZpcnN0Ci0JCQlKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGN1cnJlbnRKcGFDb25maWcgPSBudWxsOwotCQkJTGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uQ29uZmlnIGNvbmZpZyA9IGxpZC5nZXRMaWJyYXJ5UHJvdmlkZXJPcGVyYXRpb25Db25maWcoKTsKLQkJCWlmIChjb25maWcgaW5zdGFuY2VvZiBKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSB7Ci0JCQkJY3VycmVudEpwYUNvbmZpZyA9IChKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSBjb25maWc7Ci0JCQkJanBhQ29uZmlncy5hZGQoY3VycmVudEpwYUNvbmZpZyk7Ci0JCQl9Ci0JCQlmb3IgKElMaWJyYXJ5UHJvdmlkZXIgbHAgOiBsaWQuZ2V0TGlicmFyeVByb3ZpZGVycygpKSB7Ci0JCQkJY29uZmlnID0gbGlkLmdldExpYnJhcnlQcm92aWRlck9wZXJhdGlvbkNvbmZpZyhscCk7Ci0JCQkJaWYgKGNvbmZpZyBpbnN0YW5jZW9mIEpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcKLQkJCQkJCSYmICEgY29uZmlnLmVxdWFscyhjdXJyZW50SnBhQ29uZmlnKSkgewotCQkJCQlqcGFDb25maWdzLmFkZCgoSnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgY29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKEpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcganBhQ29uZmlnIDoganBhQ29uZmlncykgewotCQkJCWpwYUNvbmZpZy5zZXRKcGFQbGF0Zm9ybShKcHRDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtKHRoaXMucGxhdGZvcm1JZE1vZGVsLmdldFZhbHVlKCkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHBhZ2UgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlUGFnZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5wcm9qZWN0TW9kZWwuc2V0VmFsdWUodGhpcy5nZXRQcm9qZWN0KCkpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQl0aGlzLmJ1aWxkUGxhdGZvcm1Hcm91cChjb21wb3NpdGUpOwotCi0JCUNvbnRyb2wgbGlicmFyeVByb3ZpZGVyQ29tcG9zaXRlID0gY3JlYXRlSW5zdGFsbExpYnJhcnlQYW5lbCgKLQkJCQljb21wb3NpdGUsIAotCQkJCXRoaXMuZ2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpLCAKLQkJCQlKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9qcGFJbXBsZW1lbnRhdGlvbkxhYmVsKTsKLQotIAkJbGlicmFyeVByb3ZpZGVyQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCXRoaXMuYnVpbGRDb25uZWN0aW9uR3JvdXAoY29tcG9zaXRlKTsKLQkJdGhpcy5idWlsZFBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cChjb21wb3NpdGUpOwotCQl0aGlzLmJ1aWxkTWV0YW1vZGVsR3JvdXAoY29tcG9zaXRlKTsKLQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5QUk9QRVJUSUVTX0pBVkFfUEVSU0lTVEVOQ0UpOwotCQkKLQkJYWRqdXN0TGlicmFyeVByb3ZpZGVycygpOwotCQl0aGlzLnVwZGF0ZVZhbGlkYXRpb24oKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIERvbid0IGFsbG93IHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NvbXB1dGVTaXplKCl9Ci0JICogdG8gY2FjaGUgdGhlIHBhZ2UncyBzaXplLCBzaW5jZSB0aGUgc2l6ZSBvZiB0aGUgIkxpYnJhcnkiIHBhbmVsIGNhbgotCSAqIGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlIHVzZXIncyBzZWxlY3Rpb24gZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFBvaW50IGNvbXB1dGVTaXplKCkgewotCQlyZXR1cm4gdGhpcy5kb0NvbXB1dGVTaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBsYXRmb3JtIGdyb3VwICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBidWlsZFBsYXRmb3JtR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9wbGF0Zm9ybUxhYmVsKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlDb21ibyBwbGF0Zm9ybURyb3BEb3duID0gdGhpcy5idWlsZERyb3BEb3duKGdyb3VwKTsKLQkJU1dUVG9vbHMuYmluZCgKLQkJCQl0aGlzLmJ1aWxkUGxhdGZvcm1DaG9pY2VzTW9kZWwoKSwKLQkJCQl0aGlzLnBsYXRmb3JtSWRNb2RlbCwKLQkJCQlwbGF0Zm9ybURyb3BEb3duLAotCQkJCUpQQV9QTEFURk9STV9MQUJFTF9DT05WRVJURVIKLQkJKTsKLQkJCi0JCUxpbmsgZmFjZXRzUGFnZUxpbmsgPSB0aGlzLmJ1aWxkTGluayhncm91cCwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfZmFjZXRzUGFnZUxpbmspOwotCQlmYWNldHNQYWdlTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkRmFjZXRzUGFnZUxpbmtMaXN0ZW5lcigpKTsgIC8vIHRoZSBsaW5rIHdpbGwgYmUgR0NlZAotCQlTeXN0ZW0ub3V0LnByaW50bG4oZmFjZXRzUGFnZUxpbmsuaXNFbmFibGVkKCkpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRGYWNldHNQYWdlTGlua0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlKcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UudGhpcy5vcGVuUHJvamVjdEZhY2V0c1BhZ2UoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImZhY2V0cyBwYWdlIGxpbmsgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb3BlblByb2plY3RGYWNldHNQYWdlKCkgewotCQkoKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKWdldENvbnRhaW5lcigpKS5vcGVuUGFnZShGYWNldHNQcm9wZXJ0eVBhZ2UuSUQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgcHJvamVjdCdzIEpQQSBwbGF0Zm9ybSBpZiBpdCBpcyBub3Qgb24gdGhlIGxpc3Qgb2YgdmFsaWQKLQkgKiBwbGF0Zm9ybXMuCi0JICogPHA+Ci0JICogVGhpcyBpcyBwcm9iYWJseSBvbmx5IHVzZWZ1bCBpZiB0aGUgcHJvamVjdCBpcyBjb3JydXB0ZWQKLQkgKiBhbmQgaGFzIGEgcGxhdGZvcm0gdGhhdCBleGlzdHMgaW4gdGhlIHJlZ2lzdHJ5IGJ1dCBpcyBub3Qgb24gdGhlCi0JICogbGlzdCBvZiB2YWxpZCBwbGF0Zm9ybXMgZm9yIHRoZSBwcm9qZWN0J3MgSlBBIGZhY2V0IHZlcnNpb24uCi0JICogQmVjYXVzZSwgaWYgdGhlIHByb2plY3QncyBKUEEgcGxhdGZvcm0gaXMgY29tcGxldGVseSBpbnZhbGlkLCB0aGVyZQotCSAqIHdvdWxkIGJlIG5vIEpQQSBwcm9qZWN0IQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFBsYXRmb3JtQ2hvaWNlc01vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJCW5ldyBTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJCQkJbmV3IENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oCi0JCQkJCQkJCW5ldyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMucGxhdGZvcm1JZE1vZGVsKSwKLQkJCQkJCQkJdGhpcy5idWlsZFJlZ2lzdHJ5UGxhdGZvcm1zTW9kZWwoKQotCQkJCQkJKQotCQkJCSksCi0JCQkJSlBBX1BMQVRGT1JNX0NPTVBBUkFUT1IKLQkJCSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUmVnaXN0cnlQbGF0Zm9ybXNNb2RlbCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBlbmFibGVkUGxhdGZvcm1JZHMgPSAKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEpwYVBsYXRmb3JtRGVzY3JpcHRpb24sIFN0cmluZz4oCi0JCQkJCW5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKcGFQbGF0Zm9ybURlc2NyaXB0aW9uPihKcHRDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtcygpKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIG8pIHsKLQkJCQkJCQlyZXR1cm4gby5zdXBwb3J0c0pwYUZhY2V0VmVyc2lvbihnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkpOwotCQkJCQkJfQotCQkJCQl9KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBvKSB7Ci0JCQkJCXJldHVybiBvLmdldElkKCk7Ci0JCQkJfQotCQkJfTsKLQkJcmV0dXJuIG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KGVuYWJsZWRQbGF0Zm9ybUlkcyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxTdHJpbmc+IEpQQV9QTEFURk9STV9DT01QQVJBVE9SID0KLQkJCW5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBpZDEsIFN0cmluZyBpZDIpIHsKLQkJCQkJU3RyaW5nIGxhYmVsMSA9IGdldEpwYVBsYXRmb3JtTGFiZWwoaWQxKTsKLQkJCQkJU3RyaW5nIGxhYmVsMiA9IGdldEpwYVBsYXRmb3JtTGFiZWwoaWQyKTsKLQkJCQkJcmV0dXJuIFNUUklOR19DT01QQVJBVE9SLmNvbXBhcmUobGFiZWwxLCBsYWJlbDIpOwotCQkJCX0KLQkJCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBKUEFfUExBVEZPUk1fTEFCRUxfQ09OVkVSVEVSID0KLQkJCW5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgaWQpIHsKLQkJCQkJcmV0dXJuIGdldEpwYVBsYXRmb3JtTGFiZWwoaWQpOwotCQkJCX0KLQkJCX07Ci0KLQkvKiBwcml2YXRlICovIHN0YXRpYyBTdHJpbmcgZ2V0SnBhUGxhdGZvcm1MYWJlbChTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm0oaWQpLmdldExhYmVsKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbm5lY3Rpb24gZ3JvdXAgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29ubmVjdGlvbkdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxhYmVsKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLlBST1BFUlRJRVNfSkFWQV9QRVJTSVNURU5DRV9DT05ORUNUSU9OKTsKLQotCQlDb21ibyBjb25uZWN0aW9uRHJvcERvd24gPSB0aGlzLmJ1aWxkRHJvcERvd24oZ3JvdXAsIDMpOwotCQlTV1RUb29scy5iaW5kKAotCQkJCUNPTk5FQ1RJT05fQ0hPSUNFU19NT0RFTCwKLQkJCQl0aGlzLmNvbm5lY3Rpb25Nb2RlbCwKLQkJCQljb25uZWN0aW9uRHJvcERvd24sCi0JCQkJU0lNUExFX1NUUklOR19DT05WRVJURVIKLQkJCSk7Ci0KLQkJTGluayBhZGRDb25uZWN0aW9uTGluayA9IHRoaXMuYnVpbGRMaW5rKGdyb3VwLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGluayk7Ci0JCWFkZENvbm5lY3Rpb25MaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRBZGRDb25uZWN0aW9uTGlua0xpc3RlbmVyKCkpOyAgLy8gdGhlIGxpbmsgd2lsbCBiZSBHQ2VkCi0KLQkJdGhpcy5jb25uZWN0TGluayA9IHRoaXMuYnVpbGRMaW5rKGdyb3VwLCBidWlsZENvbm5lY3RMaW5rVGV4dCgpKTsKLQkJU1dUVG9vbHMuY29udHJvbEVuYWJsZWRTdGF0ZSh0aGlzLmRpc2Nvbm5lY3RlZE1vZGVsLCB0aGlzLmNvbm5lY3RMaW5rKTsKLQkJdGhpcy5jb25uZWN0TGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkQ29ubmVjdExpbmtMaXN0ZW5lcigpKTsgIC8vIHRoZSBsaW5rIHdpbGwgYmUgR0NlZAotCQl0aGlzLmRpc2Nvbm5lY3RlZE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmRpc2Nvbm5lY3RlZE1vZGVsTGlzdGVuZXIpOwotCi0JCS8vIG92ZXJyaWRlIGRlZmF1bHQgY2F0YWxvZwotCQlCdXR0b24gb3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0NoZWNrQm94ID0gdGhpcy5idWlsZENoZWNrQm94KGdyb3VwLCAzLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9vdmVycmlkZURlZmF1bHRDYXRhbG9nTGFiZWwpOwotCQlTV1RUb29scy5iaW5kKHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwsIG92ZXJyaWRlRGVmYXVsdENhdGFsb2dDaGVja0JveCk7Ci0KLQkJTGFiZWwgZGVmYXVsdENhdGFsb2dMYWJlbCA9IHRoaXMuYnVpbGRMYWJlbChncm91cCwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfZGVmYXVsdENhdGFsb2dMYWJlbCk7Ci0JCUNvbWJvIGRlZmF1bHRDYXRhbG9nRHJvcERvd24gPSB0aGlzLmJ1aWxkRHJvcERvd24oZ3JvdXApOwotCQlTV1RUb29scy5iaW5kKHRoaXMuY2F0YWxvZ0Nob2ljZXNNb2RlbCwgdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsLCBkZWZhdWx0Q2F0YWxvZ0Ryb3BEb3duKTsKLQotCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwsIGRlZmF1bHRDYXRhbG9nTGFiZWwsIGRlZmF1bHRDYXRhbG9nRHJvcERvd24pOwotCi0JCS8vIG92ZXJyaWRlIGRlZmF1bHQgc2NoZW1hCi0JCUJ1dHRvbiBvdmVycmlkZURlZmF1bHRTY2hlbWFCdXR0b24gPSB0aGlzLmJ1aWxkQ2hlY2tCb3goZ3JvdXAsIDMsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX292ZXJyaWRlRGVmYXVsdFNjaGVtYUxhYmVsKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnTW9kZWwsIG92ZXJyaWRlRGVmYXVsdFNjaGVtYUJ1dHRvbik7Ci0KLQkJTGFiZWwgZGVmYXVsdFNjaGVtYUxhYmVsID0gdGhpcy5idWlsZExhYmVsKGdyb3VwLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kZWZhdWx0U2NoZW1hTGFiZWwpOwotCQlDb21ibyBkZWZhdWx0U2NoZW1hRHJvcERvd24gPSB0aGlzLmJ1aWxkRHJvcERvd24oZ3JvdXApOwotCQlTV1RUb29scy5iaW5kKHRoaXMuc2NoZW1hQ2hvaWNlc01vZGVsLCB0aGlzLmRlZmF1bHRTY2hlbWFNb2RlbCwgZGVmYXVsdFNjaGVtYURyb3BEb3duKTsKLQotCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYUZsYWdNb2RlbCwgZGVmYXVsdFNjaGVtYUxhYmVsLCBkZWZhdWx0U2NoZW1hRHJvcERvd24pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IFNJTVBMRV9TVFJJTkdfQ09OVkVSVEVSID0KLQkJCW5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQkJCXJldHVybiAoc3RyaW5nICE9IG51bGwpID8gc3RyaW5nIDogSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2Vfbm9uZTsKLQkJCQl9Ci0JCQl9OwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRGlzY29ubmVjdGVkTW9kZWxMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcihidWlsZERpc2Nvbm5lY3RlZE1vZGVsTGlzdGVuZXJfKCkpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREaXNjb25uZWN0ZWRNb2RlbExpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS50aGlzLnVwZGF0ZUNvbm5lY3RMaW5rVGV4dChidWlsZENvbm5lY3RMaW5rVGV4dCgpKTsJCi0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ29ubmVjdExpbmtUZXh0KCl7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlID0gZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJaWYgKGNvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwgJiYgY29ubmVjdGlvblByb2ZpbGUuaXNDb25uZWN0ZWQoKSkgewotCQkJcmV0dXJuIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3RlZFRleHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdExpbms7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbm5lY3RMaW5rVGV4dChTdHJpbmcgdGV4dCkgewotCQljb25uZWN0TGluay5zZXRUZXh0KHRleHQpOwotCQlTV1RVdGlsLnJlZmxvdyhjb25uZWN0TGluay5nZXRQYXJlbnQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZEFkZENvbm5lY3Rpb25MaW5rTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS50aGlzLm9wZW5OZXdDb25uZWN0aW9uV2l6YXJkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb25uZWN0aW9uIGxpbmsgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCBvcGVuTmV3Q29ubmVjdGlvbldpemFyZCgpIHsKLQkJU3RyaW5nIGNvbm5lY3Rpb25OYW1lID0gRFRQVWlUb29scy5jcmVhdGVOZXdDb25uZWN0aW9uUHJvZmlsZSgpOwotCQlpZiAoY29ubmVjdGlvbk5hbWUgIT0gbnVsbCkgewotCQkJdGhpcy5jb25uZWN0aW9uTW9kZWwuc2V0VmFsdWUoY29ubmVjdGlvbk5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3RMaW5rTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS50aGlzLm9wZW5Db25uZWN0aW9uUHJvZmlsZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29ubmVjdCBsaW5rIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgb3BlbkNvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJaWYgKGNwICE9IG51bGwpIHsKLQkJCWNwLmNvbm5lY3QoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwZXJzaXN0ZW50IGNsYXNzIG1hbmFnZW1lbnQgZ3JvdXAgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudExhYmVsKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlCdXR0b24gZGlzY292ZXJDbGFzc2VzUmFkaW9CdXR0b24gPSB0aGlzLmJ1aWxkUmFkaW9CdXR0b24oZ3JvdXAsIDEsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Rpc2NvdmVyQ2xhc3Nlc0J1dHRvbik7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5kaXNjb3ZlckFubm90YXRlZENsYXNzZXNNb2RlbCwgZGlzY292ZXJDbGFzc2VzUmFkaW9CdXR0b24pOwotCi0JCUJ1dHRvbiBsaXN0Q2xhc3Nlc1JhZGlvQnV0dG9uID0gdGhpcy5idWlsZFJhZGlvQnV0dG9uKGdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9saXN0Q2xhc3Nlc0J1dHRvbik7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5saXN0QW5ub3RhdGVkQ2xhc3Nlc01vZGVsLCBsaXN0Q2xhc3Nlc1JhZGlvQnV0dG9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsIGdyb3VwICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBidWlsZE1ldGFtb2RlbEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfbWV0YW1vZGVsTGFiZWwpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGluayBtZXRhbW9kZWxTb3VyY2VGb2xkZXJMaW5rID0gdGhpcy5idWlsZExpbmsoZ3JvdXAsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX21ldGFtb2RlbFNvdXJjZUZvbGRlckxpbmspOwotCQltZXRhbW9kZWxTb3VyY2VGb2xkZXJMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1aWxkTWV0YW1vZGVsU291cmNlRm9sZGVyTGlua0xpc3RlbmVyKCkpOwotCQlDb21ibyBtZXRhbW9kZWxTb3VyY2VGb2xkZXJEcm9wRG93biA9IHRoaXMuYnVpbGREcm9wRG93bihncm91cCk7Ci0JCVNXVFRvb2xzLmJpbmQoCi0JCQkJdGhpcy5qYXZhU291cmNlRm9sZGVyQ2hvaWNlc01vZGVsLAotCQkJCXRoaXMubWV0YW1vZGVsU291cmNlRm9sZGVyTW9kZWwsCi0JCQkJbWV0YW1vZGVsU291cmNlRm9sZGVyRHJvcERvd24sCi0JCQkJU0lNUExFX1NUUklOR19DT05WRVJURVIKLQkJKTsKLQkJCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLlBST1BFUlRJRVNfSkFWQV9QRVJTSVNURU5DRV9NRVRBTU9ERUwpOwotCi0JCVNXVFRvb2xzLmNvbnRyb2xWaXNpYmxlU3RhdGUodGhpcy5qcGEyXzBQcm9qZWN0RmxhZ01vZGVsLCBncm91cCwgbWV0YW1vZGVsU291cmNlRm9sZGVyTGluaywgbWV0YW1vZGVsU291cmNlRm9sZGVyRHJvcERvd24pOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRNZXRhbW9kZWxTb3VyY2VGb2xkZXJMaW5rTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS50aGlzLm9wZW5KYXZhQnVpbGRQYXRoUGFnZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibWV0YW1vZGVsIHNvdXJjZSBmb2xkZXIgbGluayBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIG9wZW5KYXZhQnVpbGRQYXRoUGFnZSgpIHsKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIgY29udGFpbmVyID0gZ2V0V29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcigpOwotCQljb250YWluZXIub3BlblBhZ2UoQlVJTERfUEFUSFNfUFJPUEVSVFlfUEFHRV9JRCwgbnVsbCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogd2lkZ2V0cyAqKioqKioqKioqCi0KLQlwcml2YXRlIEJ1dHRvbiBidWlsZENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRCdXR0b24ocGFyZW50LCBob3Jpem9udGFsU3BhbiwgdGV4dCwgU1dULkNIRUNLKTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBidWlsZFJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRCdXR0b24ocGFyZW50LCBob3Jpem9udGFsU3BhbiwgdGV4dCwgU1dULlJBRElPKTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBidWlsZEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBpbnQgaG9yaXpvbnRhbFNwYW4sIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSB8IHN0eWxlKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwcml2YXRlIENvbWJvIGJ1aWxkRHJvcERvd24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5idWlsZERyb3BEb3duKHBhcmVudCwgMSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21ibyBidWlsZERyb3BEb3duKENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbikgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQljb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCXByaXZhdGUgTGFiZWwgYnVpbGRMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgTGluayBidWlsZExpbmsoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGluayBsaW5rID0gbmV3IExpbmsocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxpbmsuc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9LL1JldmVydC9BcHBseSBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN1cGVyLnBlcmZvcm1PaygpOwotCi0JCXRyeSB7Ci0JCQkvLyB0cnVlPWZvcms7IGZhbHNlPXVuY2FuY2VsbGFibGUKLQkJCXRoaXMuYnVpbGRPa1Byb2dyZXNzTW9uaXRvckRpYWxvZygpLnJ1bih0cnVlLCBmYWxzZSwgdGhpcy5idWlsZE9rUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSk7Ci0JCX0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gCi0JCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleC5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIElSdW5uYWJsZUNvbnRleHQgYnVpbGRPa1Byb2dyZXNzTW9uaXRvckRpYWxvZygpIHsKLQkJcmV0dXJuIG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2codGhpcy5nZXRTaGVsbCgpKTsKLQl9Ci0KLQlwcml2YXRlIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBidWlsZE9rUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCXJldHVybiBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIHRoZSBidWlsZCB3ZSBleGVjdXRlIGluICNwZXJmb3JtT2tfKCkgbG9ja3MgdGhlIHdvcmtzcGFjZSByb290LAotCQkJCQkvLyBzbyB3ZSBuZWVkIHRvIHVzZSB0aGUgd29ya3NwYWNlIHJvb3QgYXMgb3VyIHNjaGVkdWxpbmcgcnVsZSBoZXJlCi0JCQkJCXdzLnJ1bigKLQkJCQkJCQlKcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UudGhpcy5idWlsZE9rV29ya3NwYWNlUnVubmFibGUoKSwKLQkJCQkJCQl3cy5nZXRSb290KCksCi0JCQkJCQkJSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsCi0JCQkJCQkJbW9uaXRvcgotCQkJCQkpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihleCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qIHByaXZhdGUgKi8gSVdvcmtzcGFjZVJ1bm5hYmxlIGJ1aWxkT2tXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJSnBhUHJvamVjdFByb3BlcnRpZXNQYWdlLnRoaXMucGVyZm9ybU9rXyhtb25pdG9yKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHBlcmZvcm1Pa18oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmlzQnVmZmVyaW5nKCkpIHsKLQkJCWJvb2xlYW4gcGxhdGZvcm1DaGFuZ2VkID0gdGhpcy5wbGF0Zm9ybUlkTW9kZWwuaXNCdWZmZXJpbmcoKTsKLQkJCXRoaXMudHJpZ2dlci5hY2NlcHQoKTsKLQkJCWlmIChwbGF0Zm9ybUNoYW5nZWQpIHsKLQkJCQkvLyBpZiB0aGUgSlBBIHBsYXRmb3JtIGlzIGNoYW5nZWQsIHdlIG5lZWQgdG8gY29tcGxldGVseSByZWJ1aWxkIHRoZSBKUEEgcHJvamVjdAotCQkJCUpwdENvcmVQbHVnaW4ucmVidWlsZEpwYVByb2plY3QodGhpcy5nZXRQcm9qZWN0KCkpOwotCQkJfQotCQkJdGhpcy5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBtb25pdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBvZiB0aGUgbW9kZWxzIGFyZSBidWZmZXJpbmcgYSBjaGFuZ2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQnVmZmVyaW5nKCkgewotCQlmb3IgKEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gbW9kZWwgOiB0aGlzLmJ1aWxkQnVmZmVyZWRNb2RlbHMoKSkgewotCQkJaWYgKG1vZGVsLmlzQnVmZmVyaW5nKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gYnVpbGRCdWZmZXJlZE1vZGVscygpIHsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsW10gewotCQkJCXRoaXMucGxhdGZvcm1JZE1vZGVsLAotCQkJCXRoaXMuY29ubmVjdGlvbk1vZGVsLAotCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwsCi0JCQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ01vZGVsLAotCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYUZsYWdNb2RlbCwKLQkJCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFNb2RlbCwKLQkJCQl0aGlzLmRpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlc01vZGVsLAotCQkJCXRoaXMubWV0YW1vZGVsU291cmNlRm9sZGVyTW9kZWwKLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQl0aGlzLnRyaWdnZXIucmVzZXQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmRpc2VuZ2FnZVZhbGlkYXRpb25MaXN0ZW5lcigpOwotCQl0aGlzLnBsYXRmb3JtSWRNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wbGF0Zm9ybUlkTGlzdGVuZXIpOwotCQl0aGlzLmRpc2Nvbm5lY3RlZE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmRpc2Nvbm5lY3RlZE1vZGVsTGlzdGVuZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbGlkYXRpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKCkgewotCQkJCUpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS50aGlzLnZhbGlkYXRlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWxpZGF0aW9uIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgdmFsaWRhdGUoKSB7Ci0JCWlmICggISB0aGlzLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMudXBkYXRlVmFsaWRhdGlvbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZ2FnZVZhbGlkYXRpb25MaXN0ZW5lcigpIHsKLQkJZm9yIChNb2RlbCBtb2RlbCA6IHRoaXMuYnVpbGRWYWxpZGF0aW9uTW9kZWxzKCkpIHsKLQkJCW1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMudmFsaWRhdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTW9kZWxbXSBidWlsZFZhbGlkYXRpb25Nb2RlbHMoKSB7Ci0JCXJldHVybiBuZXcgTW9kZWxbXSB7Ci0JCQkJdGhpcy5wbGF0Zm9ybUlkTW9kZWwsCi0JCQkJdGhpcy5jb25uZWN0aW9uTW9kZWwsCi0JCQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0ZsYWdNb2RlbCwKLQkJCQl0aGlzLmRlZmF1bHRDYXRhbG9nTW9kZWwsCi0JCQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hRmxhZ01vZGVsLAotCQkJCXRoaXMuZGVmYXVsdFNjaGVtYU1vZGVsLAotCQkJCXRoaXMuZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzTW9kZWwKLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlVmFsaWRhdGlvbkxpc3RlbmVyKCkgewotCQlmb3IgKE1vZGVsIG1vZGVsIDogdGhpcy5idWlsZFJldmVyc2VWYWxpZGF0aW9uTW9kZWxzKCkpIHsKLQkJCW1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMudmFsaWRhdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTW9kZWxbXSBidWlsZFJldmVyc2VWYWxpZGF0aW9uTW9kZWxzKCkgewotCQlyZXR1cm4gQXJyYXlUb29scy5yZXZlcnNlKHRoaXMuYnVpbGRWYWxpZGF0aW9uTW9kZWxzKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgRVJST1JfU1RBVFVTID0gSW50ZWdlci52YWx1ZU9mKElTdGF0dXMuRVJST1IpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgV0FSTklOR19TVEFUVVMgPSBJbnRlZ2VyLnZhbHVlT2YoSVN0YXR1cy5XQVJOSU5HKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIElORk9fU1RBVFVTID0gSW50ZWdlci52YWx1ZU9mKElTdGF0dXMuSU5GTyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBPS19TVEFUVVMgPSBJbnRlZ2VyLnZhbHVlT2YoSVN0YXR1cy5PSyk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVN0YXR1cyBwZXJmb3JtVmFsaWRhdGlvbigpIHsKLQkJSGFzaE1hcDxJbnRlZ2VyLCBBcnJheUxpc3Q8SVN0YXR1cz4+IHN0YXR1c2VzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgQXJyYXlMaXN0PElTdGF0dXM+PigpOwotCQlzdGF0dXNlcy5wdXQoRVJST1JfU1RBVFVTLCBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KCkpOwotCQlzdGF0dXNlcy5wdXQoV0FSTklOR19TVEFUVVMsIG5ldyBBcnJheUxpc3Q8SVN0YXR1cz4oKSk7Ci0JCXN0YXR1c2VzLnB1dChJTkZPX1NUQVRVUywgbmV3IEFycmF5TGlzdDxJU3RhdHVzPigpKTsKLQkJc3RhdHVzZXMucHV0KE9LX1NUQVRVUywgQ29sbGVjdGlvblRvb2xzLmxpc3QoU3RhdHVzLk9LX1NUQVRVUykpOwotCQkKLQkJLyogcGxhdGZvcm0gKi8KLQkJLy8gdXNlciBpcyB1bmFibGUgdG8gdW5zZXQgdGhlIHBsYXRmb3JtLCBzbyBubyB2YWxpZGF0aW9uIG5lY2Vzc2FyeQotCQkKLQkJLyogbGlicmFyeSBwcm92aWRlciAqLwotCQlJU3RhdHVzIGxwU3RhdHVzID0gc3VwZXIucGVyZm9ybVZhbGlkYXRpb24oKTsKLQkJc3RhdHVzZXMuZ2V0KEludGVnZXIudmFsdWVPZihscFN0YXR1cy5nZXRTZXZlcml0eSgpKSkuYWRkKGxwU3RhdHVzKTsKLQkJCi0JCS8qIGNvbm5lY3Rpb24gKi8KLQkJQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCVN0cmluZyBjb25uZWN0aW9uTmFtZSA9IHRoaXMuZ2V0Q29ubmVjdGlvbk5hbWUoKTsKLQkJaWYgKCAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoY29ubmVjdGlvbk5hbWUpKSB7Ci0JCQlpZiAoY29ubmVjdGlvblByb2ZpbGUgPT0gbnVsbCkgewotCQkJCXN0YXR1c2VzLmdldChFUlJPUl9TVEFUVVMpLmFkZCh0aGlzLmJ1aWxkRXJyb3JTdGF0dXMoTkxTLmJpbmQoCi0JCQkJCQlKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfQ09OTkVDVElPTl9JTlZBTElELAotCQkJCQkJY29ubmVjdGlvbk5hbWUKLQkJCQkpKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICggISBjb25uZWN0aW9uUHJvZmlsZS5pc0FjdGl2ZSgpKSB7Ci0JCQkJc3RhdHVzZXMuZ2V0KElORk9fU1RBVFVTKS5hZGQodGhpcy5idWlsZEluZm9TdGF0dXMoSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX0NPTk5FQ1RJT05fTk9UX0NPTk5FQ1RFRCkpOwotCQkJfQotCQl9Ci0KLQkJLyogZGVmYXVsdCBjYXRhbG9nICovCi0JCWlmICh0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nRmxhZ0lzU2V0KCkpIHsKLQkJCVN0cmluZyBkZWZhdWx0Q2F0YWxvZyA9IHRoaXMuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coKTsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGRlZmF1bHRDYXRhbG9nKSkgewotCQkJCXN0YXR1c2VzLmdldChFUlJPUl9TVEFUVVMpLmFkZCh0aGlzLmJ1aWxkRXJyb3JTdGF0dXMoSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX0RFRkFVTFRfQ0FUQUxPR19OT1RfU1BFQ0lGSUVEKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICgoY29ubmVjdGlvblByb2ZpbGUgIT0gbnVsbCkKLQkJCQkJJiYgY29ubmVjdGlvblByb2ZpbGUuaXNDb25uZWN0ZWQoKQotCQkJCQkmJiAhIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNhdGFsb2dDaG9pY2VzTW9kZWwuaXRlcmF0b3IoKSwgZGVmYXVsdENhdGFsb2cpKSB7Ci0JCQkJc3RhdHVzZXMuZ2V0KFdBUk5JTkdfU1RBVFVTKS5hZGQodGhpcy5idWlsZFdhcm5pbmdTdGF0dXMoTkxTLmJpbmQoCi0JCQkJCQlKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfQ09OTkVDVElPTl9ET0VTTlRfQ09OVEFJTl9DQVRBTE9HLAotCQkJCQkJZGVmYXVsdENhdGFsb2cKLQkJCQkpKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBkZWZhdWx0IHNjaGVtYSAqLwotCQlpZiAodGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hRmxhZ0lzU2V0KCkpIHsKLQkJCVN0cmluZyBkZWZhdWx0U2NoZW1hID0gdGhpcy5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCk7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShkZWZhdWx0U2NoZW1hKSkgewotCQkJCXN0YXR1c2VzLmdldChFUlJPUl9TVEFUVVMpLmFkZCh0aGlzLmJ1aWxkRXJyb3JTdGF0dXMoSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX0RFRkFVTFRfU0NIRU1BX05PVF9TUEVDSUZJRUQpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChjb25uZWN0aW9uUHJvZmlsZSAhPSBudWxsKQotCQkJCQkmJiBjb25uZWN0aW9uUHJvZmlsZS5pc0Nvbm5lY3RlZCgpCi0JCQkJCSYmICEgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuc2NoZW1hQ2hvaWNlc01vZGVsLml0ZXJhdG9yKCksIGRlZmF1bHRTY2hlbWEpKSB7Ci0JCQkJc3RhdHVzZXMuZ2V0KFdBUk5JTkdfU1RBVFVTKS5hZGQodGhpcy5idWlsZFdhcm5pbmdTdGF0dXMoTkxTLmJpbmQoCi0JCQkJCQlKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfQ09OTkVDVElPTl9ET0VTTlRfQ09OVEFJTl9TQ0hFTUEsCi0JCQkJCQlkZWZhdWx0U2NoZW1hCi0JCQkJKSkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCAhIHN0YXR1c2VzLmdldChFUlJPUl9TVEFUVVMpLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHN0YXR1c2VzLmdldChFUlJPUl9TVEFUVVMpLmdldCgwKTsKLQkJfQotCQllbHNlIGlmICggISBzdGF0dXNlcy5nZXQoV0FSTklOR19TVEFUVVMpLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHN0YXR1c2VzLmdldChXQVJOSU5HX1NUQVRVUykuZ2V0KDApOwotCQl9Ci0JCWVsc2UgaWYgKCAhIHN0YXR1c2VzLmdldChJTkZPX1NUQVRVUykuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gc3RhdHVzZXMuZ2V0KElORk9fU1RBVFVTKS5nZXQoMCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gc3RhdHVzZXMuZ2V0KE9LX1NUQVRVUykuZ2V0KDApOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSVN0YXR1cyBidWlsZEluZm9TdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdGF0dXMoSVN0YXR1cy5JTkZPLCBtZXNzYWdlKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgYnVpbGRXYXJuaW5nU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3RhdHVzKElTdGF0dXMuV0FSTklORywgbWVzc2FnZSk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIGJ1aWxkRXJyb3JTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIGJ1aWxkU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIEpwdENvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVUkgbW9kZWwgYWRhcHRlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogVHJlYXQgdGhlIEpQQSBwcm9qZWN0IGFzIGFuICJhc3BlY3QiIG9mIHRoZSBFY2xpcHNlIHByb2plY3QgKElQcm9qZWN0KTsKLQkgKiBidXQgdGhlIEpQQSBwcm9qZWN0IGlzIHN0b3JlZCBpbiB0aGUgSlBBIG1vZGVsLCBub3QgdGhlIEVjbGlwc2UgcHJvamVjdAotCSAqIGl0c2VsZi4uLi4KLQkgKiBXZSBhbHNvIG5lZWQgdG8gbGlzdGVuIGZvciB0aGUgSlBBIHByb2plY3QgdG8gYmUgcmVidWlsdCBpZiB0aGUgdXNlcgotCSAqIGNoYW5nZXMgdGhlIEVjbGlwc2UgcHJvamVjdCdzIEpQQSBwbGF0Zm9ybSAod2hpY2ggaXMgc3RvcmVkIGluIHRoZQotCSAqIEVjbGlwc2UgcHJvamVjdCdzIHByZWZlcmVuY2VzKS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgSnBhUHJvamVjdE1vZGVsCi0JCWV4dGVuZHMgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxJUHJvamVjdCwgSnBhUHJvamVjdD4KLQl7Ci0JCS8qKgotCQkgKiBUaGUgSlBBIHByb2plY3QncyBwbGF0Zm9ybSBpcyBzdG9yZWQgYXMgYSBwcmVmZXJlbmNlLgotCQkgKiBJZiBpdCBjaGFuZ2VzLCBhIG5ldyBKUEEgcHJvamVjdCBpcyBidWlsdC4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgSVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBwcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci0JCQotCQkvKioKLQkJICogVGhlIEpQQSBwcm9qZWN0IG1heSBhbHNvIGNoYW5nZSB2aWEgYW5vdGhlciBwYWdlIChub3RhYmx5LCB0aGUgcHJvamVjdCBmYWNldHMgcGFnZSkuCi0JCSAqIEluIHRoYXQgY2FzZSwgdGhlIHByZWZlcmVuY2UgY2hhbmdlIG9jY3VycyBiZWZvcmUgd2UgYWN0dWFsbHkgaGF2ZSBhbm90aGVyIHByb2plY3QsCi0JCSAqIHNvIHdlIG11c3QgbGlzdGVuIHRvIHRoZSBwcm9qZWN0cyBtYW5hZ2VyCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBwcm9qZWN0TWFuYWdlckxpc3RlbmVyOwotCQkKLQkJCi0JCUpwYVByb2plY3RNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SVByb2plY3Q+IHByb2plY3RNb2RlbCkgewotCQkJc3VwZXIocHJvamVjdE1vZGVsKTsKLQkJCXRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpOwotCQkJdGhpcy5wcm9qZWN0TWFuYWdlckxpc3RlbmVyID0gYnVpbGRQcm9qZWN0TWFuYWdlckxpc3RlbmVyKCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgSVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBidWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgSVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKFByZWZlcmVuY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlpZiAoZXZlbnQuZ2V0S2V5KCkuZXF1YWxzKEpwdENvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1JZFByZWZLZXkoKSkpIHsKLQkJCQkJCUpwYVByb2plY3RNb2RlbC50aGlzLnBsYXRmb3JtQ2hhbmdlZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAicHJlZmVyZW5jZSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9qZWN0TWFuYWdlckxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlQWRhcHRlcigpIHsKLQkJCQkvLyB3ZSBhcmUgb25seSBsb29raW5nIGZvciB0aGUgcHJvamVjdCByZWJ1aWxkICphZGQqIGV2ZW50IGhlcmUgc28gd2UgY2FuCi0JCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBwbGF0Zm9ybSBoYXMgY2hhbmdlZC4KLQkJCQkvLyB0aGUgb3RoZXIgZXZlbnRzIGFyZSB1bmltcG9ydGFudCBpbiB0aGlzIGNhc2UKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCQlKcGFQcm9qZWN0TW9kZWwudGhpcy5wbGF0Zm9ybUNoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQl2b2lkIHBsYXRmb3JtQ2hhbmdlZCgpIHsKLQkJCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJCXRoaXMuZ2V0UHJlZmVyZW5jZXMoKS5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCQkJSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0TWFuYWdlcigpLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigKLQkJCQkJCUpwYVByb2plY3RNYW5hZ2VyLkpQQV9QUk9KRUNUU19DT0xMRUNUSU9OLCB0aGlzLnByb2plY3RNYW5hZ2VyTGlzdGVuZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0JCQl0aGlzLmdldFByZWZlcmVuY2VzKCkucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQkJCUpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoCi0JCQkJCQlKcGFQcm9qZWN0TWFuYWdlci5KUEFfUFJPSkVDVFNfQ09MTEVDVElPTiwgdGhpcy5wcm9qZWN0TWFuYWdlckxpc3RlbmVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKcGFQcm9qZWN0IGJ1aWxkVmFsdWVfKCkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0aGlzLnN1YmplY3QpOwotCQl9Ci0JCQotCQlwcml2YXRlIElFY2xpcHNlUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXRQcm9qZWN0UHJlZmVyZW5jZXModGhpcy5zdWJqZWN0KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogVGhlIEpQQSBwcm9qZWN0J3MgZGF0YSBzb3VyY2UgaXMgYW4gYXV4aWxpYXJ5IG9iamVjdCB0aGF0IG5ldmVyIGNoYW5nZXM7Ci0JICogc28gaWYgd2UgaGF2ZSBhIEpQQSBwcm9qZWN0LCB3ZSBoYXZlIGEgSlBBIGRhdGEgc291cmNlIGFsc28uCi0JICovCi0Jc3RhdGljIGNsYXNzIERhdGFTb3VyY2VNb2RlbAotCQlleHRlbmRzIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEpwYVByb2plY3QsIEpwYURhdGFTb3VyY2U+Ci0JewotCQlEYXRhU291cmNlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEpwYVByb2plY3Q+IGpwYVByb2plY3RNb2RlbCkgewotCQkJc3VwZXIoanBhUHJvamVjdE1vZGVsKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSnBhRGF0YVNvdXJjZSB0cmFuc2Zvcm1fKEpwYVByb2plY3QgdmFsdWUpIHsKLQkJCXJldHVybiB2YWx1ZS5nZXREYXRhU291cmNlKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFRoZSBEVFAgY29ubmVjdGlvbiBwcm9maWxlIG5hbWUgaXMgYW4gYXNwZWN0IG9mIHRoZSBKUEEgcHJvamVjdCdzCi0JICogZGF0YSBzb3VyY2UKLQkgKi8KLQlzdGF0aWMgY2xhc3MgQ29ubmVjdGlvbk1vZGVsCi0JCWV4dGVuZHMgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYURhdGFTb3VyY2UsIFN0cmluZz4KLQl7Ci0JCUNvbm5lY3Rpb25Nb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsKSB7Ci0JCQlzdXBlcihuZXcgRGF0YVNvdXJjZU1vZGVsKGpwYVByb2plY3RNb2RlbCksIEpwYURhdGFTb3VyY2UuQ09OTkVDVElPTl9QUk9GSUxFX05BTUVfUFJPUEVSVFkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlXyhTdHJpbmcgY29ubmVjdGlvbikgewotCQkJdGhpcy5zdWJqZWN0LnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShjb25uZWN0aW9uKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlIG5hbWUgdG8gYSBjb25uZWN0aW9uIHByb2ZpbGUKLQkgKi8KLQlzdGF0aWMgY2xhc3MgQ29ubmVjdGlvblByb2ZpbGVNb2RlbAotCQlleHRlbmRzIENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmcsIENvbm5lY3Rpb25Qcm9maWxlPgotCXsKLQkJQ29ubmVjdGlvblByb2ZpbGVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBjb25uZWN0aW9uTW9kZWwpIHsKLQkJCXN1cGVyKGNvbm5lY3Rpb25Nb2RlbCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlIHRyYW5zZm9ybV8oU3RyaW5nIGNvbm5lY3Rpb25OYW1lKSB7Ci0JCQlyZXR1cm4gSnB0RGJQbHVnaW4uZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShjb25uZWN0aW9uTmFtZSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFRyZWF0IHRoZSBKUEEgcGxhdGZvcm0gSUQgYXMgYW4gImFzcGVjdCIgb2YgdGhlIEpQQSBwcm9qZWN0LgotCSAqIFRoZSBwbGF0Zm9ybSBJRCBpcyBzdG9yZWQgaW4gdGhlIHByb2plY3QgcHJlZmVyZW5jZXMuCi0JICogVGhlIHBsYXRmb3JtIElEIGRvZXMgbm90IGNoYW5nZSBmb3IgYSBKUEEgcHJvamVjdCAtIGlmIHRoZSB1c2VyIHdhbnRzIGEKLQkgKiBkaWZmZXJlbnQgcGxhdGZvcm0sIHdlIGJ1aWxkIGFuIGVudGlyZWx5IG5ldyBKUEEgcHJvamVjdC4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgUGxhdGZvcm1JZE1vZGVsCi0JCWV4dGVuZHMgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxKcGFQcm9qZWN0LCBTdHJpbmc+Ci0JewotCQlQbGF0Zm9ybUlkTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEpwYVByb2plY3Q+IGpwYVByb2plY3RNb2RlbCkgewotCQkJc3VwZXIoanBhUHJvamVjdE1vZGVsKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1JZCh0aGlzLnN1YmplY3QuZ2V0UHJvamVjdCgpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIG5ld1BsYXRmb3JtSWQpIHsKLQkJCUpwdENvcmVQbHVnaW4uc2V0SnBhUGxhdGZvcm1JZCh0aGlzLnN1YmplY3QuZ2V0UHJvamVjdCgpLCBuZXdQbGF0Zm9ybUlkKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJCS8vIHRoZSBwbGF0Zm9ybSBJRCBkb2VzIG5vdCBjaGFuZ2UKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLQkJCS8vIHRoZSBwbGF0Zm9ybSBJRCBkb2VzIG5vdCBjaGFuZ2UKLQkJfQotCX0KLQotCi0JLyoqCi0JICogVGhlIGNvbm5lY3Rpb25zIGFyZSBoZWxkIGJ5IGEgc2luZ2xldG9uLCBzbyB0aGUgbW9kZWwgY2FuIGJlIGEgc2luZ2xldG9uCi0JICogYWxzby4KLQkgKi8KLQkvLyBieSBkZWZhdWx0LCBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlciBwdXRzIGEgbnVsbCBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBDT05ORUNUSU9OX0NIT0lDRVNfTU9ERUwgPQotCQkJbmV3IEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4oCi0JCQkJCW5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCQkJCQluZXcgQ29ubmVjdGlvbkNob2ljZXNNb2RlbCgpLAotCQkJCQkJCVNUUklOR19DT01QQVJBVE9SCi0JCQkJCSkKLQkJCSk7Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgbmFtZXMgaGVsZCBieSB0aGUgY29ubmVjdGlvbiBwcm9maWxlCi0JICogZmFjdG9yeSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIGNsYXNzIENvbm5lY3Rpb25DaG9pY2VzTW9kZWwKLQkJZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsCi0JCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPgotCXsKLQkJcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI7Ci0KLQkJQ29ubmVjdGlvbkNob2ljZXNNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpOwotCQl9Ci0KLQkJcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZUFkZGVkKFN0cmluZyBuYW1lKSB7Ci0JCQkJCUNvbm5lY3Rpb25DaG9pY2VzTW9kZWwudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZCgpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZVJlbW92ZWQoU3RyaW5nIG5hbWUpIHsKLQkJCQkJQ29ubmVjdGlvbkNob2ljZXNNb2RlbC50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVuYW1lZChTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJCQkJLy8gSWdub3JlIHRoaXMgZXZlbnQgZm9yIG5vdy4gQ29ubmVjdGluZyBhIHByb2ZpbGUgYWN0dWFsbHkKLQkJCQkJLy8gdGhyb3dzIGEgY29ubmVjdGlvbiByZW5hbWVkIGV2ZW50LCB3aGljaCBtZXNzZXMgdXAgdGhlIAotCQkJCQkvLyBsaXN0IHNlbGVjdGlvbi4gVGhlcmUgc2hvdWxkbid0IGJlIGEgY29ubmVjdGlvbiByZW5hbWVkCi0JCQkJCS8vIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhpcyBkaWFsb2cgYW55aG93LgotCQkJCQkvLyBDb25uZWN0aW9uQ2hvaWNlc01vZGVsLnRoaXMuY29sbGVjdGlvbkNoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5pdGVyYXRvcigpKSk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcigpIHsKLQkJCXJldHVybiB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKS5pdGVyYXRvcigpOwotCQl9Ci0KLQkJcHVibGljIGludCBzaXplKCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuaXRlcmF0b3IoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmFkZENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkucmVtb3ZlQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIpOwotCQl9Ci0KLQkJcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQkJcmV0dXJuIEpwdERiUGx1Z2luLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBBZGFwdCB3aGV0aGVyIHRoZSBKUEEgcHJvamVjdCBoYXMgYSB1c2VyIG92ZXJyaWRlIHNwZWNpZmllZAotCSAqIChlaXRoZXIgY2F0YWxvZyBvciBzY2hlbWEpOwotCSAqLwotCWFic3RyYWN0IHN0YXRpYyBjbGFzcyBVc2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ01vZGVsCi0JCWV4dGVuZHMgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYVByb2plY3QsIEJvb2xlYW4+Ci0JewotCQlVc2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ01vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0PiBqcGFQcm9qZWN0TW9kZWwsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXN1cGVyKGpwYVByb2plY3RNb2RlbCwgcHJvcGVydHlOYW1lKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zcGVjaWZpZXNVc2VyT3ZlcnJpZGVEZWZhdWx0KCkpOwotCQl9Ci0KLQkJYm9vbGVhbiBzcGVjaWZpZXNVc2VyT3ZlcnJpZGVEZWZhdWx0KCkgewotCQkJcmV0dXJuICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmdldFVzZXJPdmVycmlkZURlZmF1bHQoKSk7Ci0JCX0KLQotCQlhYnN0cmFjdCBTdHJpbmcgZ2V0VXNlck92ZXJyaWRlRGVmYXVsdCgpOwotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFdoZXRoZXIgdGhlIEpQQSBwcm9qZWN0IGhhcyBhIHVzZXIgb3ZlcnJpZGUgZGVmYXVsdCBjYXRhbG9nIHNwZWNpZmllZC4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgVXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwKLQkJZXh0ZW5kcyBVc2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ01vZGVsCi0JewotCQlVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0ZsYWdNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsKSB7Ci0JCQlzdXBlcihqcGFQcm9qZWN0TW9kZWwsIEpwYVByb2plY3QuVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldFVzZXJPdmVycmlkZURlZmF1bHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFdoZXRoZXIgdGhlIEpQQSBwcm9qZWN0IGhhcyBhIHVzZXIgb3ZlcnJpZGUgZGVmYXVsdCBzY2hlbWEgc3BlY2lmaWVkLgotCSAqLwotCXN0YXRpYyBjbGFzcyBVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hRmxhZ01vZGVsCi0JCWV4dGVuZHMgVXNlck92ZXJyaWRlRGVmYXVsdEZsYWdNb2RlbAotCXsKLQkJVXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYUZsYWdNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsKSB7Ci0JCQlzdXBlcihqcGFQcm9qZWN0TW9kZWwsIEpwYVByb2plY3QuVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VXNlck92ZXJyaWRlRGVmYXVsdCgpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSgpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBUaGUgSlBBIHByb2plY3QncyB1c2VyIG92ZXJyaWRlIGRlZmF1bHQgY2F0YWxvZwotCSAqLwotCXN0YXRpYyBjbGFzcyBVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ01vZGVsCi0JCWV4dGVuZHMgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYVByb2plY3QsIFN0cmluZz4KLQl7Ci0JCVVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEpwYVByb2plY3Q+IGpwYVByb2plY3RNb2RlbCkgeyAKLQkJCXN1cGVyKGpwYVByb2plY3RNb2RlbCwgSnBhUHJvamVjdC5VU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIGNhdGFsb2cpIHsKLQkJCXRoaXMuc3ViamVjdC5zZXRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZyhjYXRhbG9nKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogVGhlIEpQQSBwcm9qZWN0J3MgdXNlciBvdmVycmlkZSBkZWZhdWx0IGNhdGFsb2cKLQkgKi8KLQlzdGF0aWMgY2xhc3MgVXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU1vZGVsCi0JCWV4dGVuZHMgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYVByb2plY3QsIFN0cmluZz4KLQl7Ci0JCVVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsKSB7IAotCQkJc3VwZXIoanBhUHJvamVjdE1vZGVsLCBKcGFQcm9qZWN0LlVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHNjaGVtYSkgewotCQkJdGhpcy5zdWJqZWN0LnNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoc2NoZW1hKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogRmxhZyBvbiB0aGUgSlBBIHByb2plY3QgaW5kaWNhdGluZyB3aGV0aGVyIGl0IHNob3VsZCBkaXNjb3ZlciBhbm5vdGF0ZWQKLQkgKiBjbGFzc2VzCi0JICovCi0Jc3RhdGljIGNsYXNzIERpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlc01vZGVsCi0JCWV4dGVuZHMgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYVByb2plY3QsIEJvb2xlYW4+Ci0JewotCQlEaXNjb3ZlckFubm90YXRlZENsYXNzZXNNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsKSB7IAotCQkJc3VwZXIoanBhUHJvamVjdE1vZGVsLCBKcGFQcm9qZWN0LkRJU0NPVkVSU19BTk5PVEFURURfQ0xBU1NFU19QUk9QRVJUWSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQl0aGlzLnN1YmplY3Quc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgZm9sZGVyIHdoZXJlIHRoZSBzb3VyY2UgZm9yIHRoZSBnZW5lcmF0ZWQgQ2Fub25pY2FsIE1ldGFtb2RlbAotCSAqIGlzIHdyaXR0ZW4uCi0JICovCi0Jc3RhdGljIGNsYXNzIE1ldGFtb2RlbFNvdXJjZUZvbGRlck1vZGVsCi0JCWV4dGVuZHMgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYVByb2plY3QsIFN0cmluZz4KLQl7Ci0JCU1ldGFtb2RlbFNvdXJjZUZvbGRlck1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0PiBqcGFQcm9qZWN0TW9kZWwpIHsKLQkJCXN1cGVyKGpwYVByb2plY3RNb2RlbCwgSnBhUHJvamVjdDJfMC5NRVRBTU9ERUxfU09VUkNFX0ZPTERFUl9OQU1FX1BST1BFUlRZKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJcmV0dXJuIGpwYVByb2plY3RJc0pwYTJfMCgpID8gKChKcGFQcm9qZWN0Ml8wKSB0aGlzLnN1YmplY3QpLmdldE1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUoKSA6IG51bGw7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJaWYgKHRoaXMuanBhUHJvamVjdElzSnBhMl8wKCkpIHsKLQkJCQkoKEpwYVByb2plY3QyXzApIHRoaXMuc3ViamVjdCkuc2V0TWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4ganBhUHJvamVjdElzSnBhMl8wKCkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4ubm9kZUlzSnBhMl8wQ29tcGF0aWJsZSh0aGlzLnN1YmplY3QpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBKYXZhIHByb2plY3Qgc291cmNlIGZvbGRlcnMuCi0JICogV2Uga2VlcCB0aGUgbWV0YW1vZGVsIHNvdXJjZSBmb2xkZXIgaW4gc3luY2ggd2l0aCB0aGUgSmF2YSBzb3VyY2UgZm9sZGVycwotCSAqIChpLmUuIGlmIGEgSmF2YSBzb3VyY2UgZm9sZGVyIGlzIGRlbGV0ZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBidWlsZCBwYXRoLAotCSAqIHdlIHJlbW92ZSB0aGUgbWV0YW1vZGVsIHNvdXJjZSBmb2xkZXIpOyB0aGVyZWZvcmUgdGhlIGxpc3Qgb2YgZm9sZGVyCi0JICogY2hvaWNlcyBkb2VzIG5vdCBuZWVkIHRvIGJlIGF1Z21lbnRlZCB3aXRoIHRoZSBjdXJyZW50IGZvbGRlciAoYXMgd2UgZG8KLQkgKiB3aGVuIHRoZSBjdXJyZW50IGZvbGRlciBpcyBub3QgaW4gdGhlIGxpc3Qgb2YgY2hvaWNlcykuCi0JICovCi0Jc3RhdGljIGNsYXNzIEphdmFTb3VyY2VGb2xkZXJDaG9pY2VzTW9kZWwKLQkJZXh0ZW5kcyBBc3BlY3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8SnBhUHJvamVjdCwgU3RyaW5nPgotCXsKLQkJcHJpdmF0ZSBmaW5hbCBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciBqYXZhRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKLQotCQlKYXZhU291cmNlRm9sZGVyQ2hvaWNlc01vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0PiBqcGFQcm9qZWN0TW9kZWwpIHsgCi0JCQlzdXBlcihqcGFQcm9qZWN0TW9kZWwpOwotCQkJdGhpcy5qYXZhRWxlbWVudENoYW5nZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRKYXZhRWxlbWVudENoYW5nZWRMaXN0ZW5lcigpOwotCQl9Ci0KLQkJcHJpdmF0ZSBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciBidWlsZEphdmFFbGVtZW50Q2hhbmdlZExpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCUphdmFTb3VyY2VGb2xkZXJDaG9pY2VzTW9kZWwudGhpcy5wcm9jZXNzSmF2YURlbHRhKGV2ZW50LmdldERlbHRhKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQl2b2lkIHByb2Nlc3NKYXZhRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJCXN3aXRjaCAoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX01PREVMIDoKLQkJCQkJdGhpcy5wcm9jZXNzSmF2YURlbHRhQ2hpbGRyZW4oZGVsdGEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgOgotCQkJCQl0aGlzLnByb2Nlc3NKYXZhUHJvamVjdERlbHRhKGRlbHRhKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOyAvLyBpZ25vcmUgZXZlcnl0aGluZyBlbHNlCi0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc0phdmFEZWx0YUNoaWxkcmVuKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCQlmb3IgKElKYXZhRWxlbWVudERlbHRhIGNoaWxkIDogZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKSB7Ci0JCQkJdGhpcy5wcm9jZXNzSmF2YURlbHRhKGNoaWxkKTsgLy8gcmVjdXJzZQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NKYXZhUHJvamVjdERlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoamF2YVByb2plY3QuZXF1YWxzKHRoaXMuc3ViamVjdC5nZXRKYXZhUHJvamVjdCgpKSAmJiB0aGlzLmNsYXNzcGF0aEhhc0NoYW5nZWQoZGVsdGEpKSB7Ci0JCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLml0ZXJhdG9yKCkpKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBjbGFzc3BhdGhIYXNDaGFuZ2VkKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWx0YUZsYWdJc1NldChkZWx0YSwgSUphdmFFbGVtZW50RGVsdGEuRl9SRVNPTFZFRF9DTEFTU1BBVEhfQ0hBTkdFRCk7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gZGVsdGFGbGFnSXNTZXQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEsIGludCBmbGFnKSB7Ci0JCQlyZXR1cm4gKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEKSAmJgotCQkJCQlCaXRUb29scy5mbGFnSXNTZXQoZGVsdGEuZ2V0RmxhZ3MoKSwgZmxhZyk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SXRlcmFibGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0SXNKcGEyXzAoKSA/Ci0JCQkJCSgoSnBhUHJvamVjdDJfMCkgdGhpcy5zdWJqZWN0KS5nZXRKYXZhU291cmNlRm9sZGVyTmFtZXMoKSA6Ci0JCQkJCUVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGpwYVByb2plY3RJc0pwYTJfMCgpIHsKLQkJCXJldHVybiBKcHRDb3JlUGx1Z2luLm5vZGVJc0pwYTJfMENvbXBhdGlibGUodGhpcy5zdWJqZWN0KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcy5qYXZhRWxlbWVudENoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0JCQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMuamF2YUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBBYnN0cmFjdCBwcm9wZXJ0eSBhc3BlY3QgYWRhcHRlciBmb3IgRFRQIGNvbm5lY3Rpb24gcHJvZmlsZSBjb25uZWN0aW9uL2RhdGFiYXNlCi0JICovCi0JYWJzdHJhY3Qgc3RhdGljIGNsYXNzIENvbm5lY3Rpb25Qcm9maWxlUHJvcGVydHlBc3BlY3RBZGFwdGVyPFY+Ci0JCWV4dGVuZHMgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxDb25uZWN0aW9uUHJvZmlsZSwgVj4KLQl7Ci0JCXByaXZhdGUgZmluYWwgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKLQotCQlDb25uZWN0aW9uUHJvZmlsZVByb3BlcnR5QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvblByb2ZpbGU+IGNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpIHsKLQkJCXN1cGVyKGNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpOwotCQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCX0KLQotCQkvLyB0aGUgY29ubmVjdGlvbiBvcGVuaW5nIGlzIHByb2JhYmx5IHRoZSBvbmx5IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4uLi4KLQkJcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25BZGFwdGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQkJCUNvbm5lY3Rpb25Qcm9maWxlUHJvcGVydHlBc3BlY3RBZGFwdGVyLnRoaXMuY29ubmVjdGlvbk9wZW5lZChwcm9maWxlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJdm9pZCBjb25uZWN0aW9uT3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCWlmIChwcm9maWxlLmVxdWFscyh0aGlzLnN1YmplY3QpKSB7Ci0JCQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJCXRoaXMuc3ViamVjdC5hZGRDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotCQkJdGhpcy5zdWJqZWN0LnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIE1vbml0b3IgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSdzIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlCi0JICogKHVzZWQgdG8gZW5hYmxlIHRoZSAiQ29ubmVjdCIgbGluaykKLQkgKi8KLQlzdGF0aWMgY2xhc3MgRGlzY29ubmVjdGVkTW9kZWwKLQkJZXh0ZW5kcyBDb25uZWN0aW9uUHJvZmlsZVByb3BlcnR5QXNwZWN0QWRhcHRlcjxCb29sZWFuPgotCXsKLQkJRGlzY29ubmVjdGVkTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPENvbm5lY3Rpb25Qcm9maWxlPiBjb25uZWN0aW9uUHJvZmlsZU1vZGVsKSB7Ci0JCQlzdXBlcihjb25uZWN0aW9uUHJvZmlsZU1vZGVsKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoKHRoaXMuc3ViamVjdCAhPSBudWxsKSAmJiB0aGlzLnN1YmplY3QuaXNEaXNjb25uZWN0ZWQoKSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERhdGFiYXNlLWRldGVybWluZWQgZGVmYXVsdCBjYXRhbG9nCi0JICovCi0Jc3RhdGljIGNsYXNzIERhdGFiYXNlRGVmYXVsdENhdGFsb2dNb2RlbAotCQlleHRlbmRzIENvbm5lY3Rpb25Qcm9maWxlUHJvcGVydHlBc3BlY3RBZGFwdGVyPFN0cmluZz4KLQl7Ci0JCURhdGFiYXNlRGVmYXVsdENhdGFsb2dNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvblByb2ZpbGU+IGNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpIHsKLQkJCXN1cGVyKGNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQlEYXRhYmFzZSBkYiA9IHRoaXMuc3ViamVjdC5nZXREYXRhYmFzZSgpOwotCQkJcmV0dXJuIChkYiA9PSBudWxsKSA/IG51bGwgOiBkYi5nZXREZWZhdWx0Q2F0YWxvZ0lkZW50aWZpZXIoKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc2NoZW1hIGlzIG5vdCBkZXJpdmVkIHB1cmVseSBmcm9tIHRoZSBkYXRhYmFzZTsgaXQgaXMgYWxzbyBkZXBlbmRlbnQKLQkgKiBvbiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBjYXRhbG9nICh3aGljaCBtYXkgYmUgb3ZlcnJpZGRlbgotCSAqIGJ5IHRoZSB1c2VyKS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgRGF0YWJhc2VEZWZhdWx0U2NoZW1hTW9kZWwKLQkJZXh0ZW5kcyBDb25uZWN0aW9uUHJvZmlsZVByb3BlcnR5QXNwZWN0QWRhcHRlcjxTdHJpbmc+Ci0JewotCQlwcml2YXRlIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGRlZmF1bHRDYXRhbG9nTW9kZWw7Ci0JCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjYXRhbG9nTGlzdGVuZXI7Ci0KLQkJRGF0YWJhc2VEZWZhdWx0U2NoZW1hTW9kZWwoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPENvbm5lY3Rpb25Qcm9maWxlPiBjb25uZWN0aW9uUHJvZmlsZU1vZGVsLAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGRlZmF1bHRDYXRhbG9nTW9kZWwKLQkJKSB7Ci0JCQlzdXBlcihjb25uZWN0aW9uUHJvZmlsZU1vZGVsKTsKLQkJCXRoaXMuZGVmYXVsdENhdGFsb2dNb2RlbCA9IGRlZmF1bHRDYXRhbG9nTW9kZWw7Ci0JCQl0aGlzLmNhdGFsb2dMaXN0ZW5lciA9IHRoaXMuYnVpbGRDYXRhbG9nTGlzdGVuZXIoKTsKLQkJfQotCi0JCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENhdGFsb2dMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlEYXRhYmFzZURlZmF1bHRTY2hlbWFNb2RlbC50aGlzLmNhdGFsb2dDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXZvaWQgY2F0YWxvZ0NoYW5nZWQoKSB7Ci0JCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotCQkJc3VwZXIuZW5nYWdlU3ViamVjdF8oKTsKLQkJCXRoaXMuZGVmYXVsdENhdGFsb2dNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYXRhbG9nTGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotCQkJdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNhdGFsb2dMaXN0ZW5lcik7Ci0JCQlzdXBlci5kaXNlbmdhZ2VTdWJqZWN0XygpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQlTY2hlbWFDb250YWluZXIgc2MgPSB0aGlzLmdldFNjaGVtYUNvbnRhaW5lcigpOwotCQkJcmV0dXJuIChzYyA9PSBudWxsKSA/IG51bGwgOiBzYy5nZXREZWZhdWx0U2NoZW1hSWRlbnRpZmllcigpOwotCQl9Ci0KLQkJcHJpdmF0ZSBTY2hlbWFDb250YWluZXIgZ2V0U2NoZW1hQ29udGFpbmVyKCkgewotCQkJcmV0dXJuIHRoaXMuZGF0YWJhc2VTdXBwb3J0c0NhdGFsb2dzKCkgPyB0aGlzLmdldENhdGFsb2coKSA6IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBkYXRhYmFzZVN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJCXJldHVybiAoZGIgIT0gbnVsbCkgJiYgZGIuc3VwcG9ydHNDYXRhbG9ncygpOwotCQl9Ci0KLQkJcHJpdmF0ZSBDYXRhbG9nIGdldENhdGFsb2coKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHRoaXMuZGVmYXVsdENhdGFsb2dNb2RlbC5nZXRWYWx1ZSgpOwotCQkJLy8gaWYgd2UgZ2V0IGhlcmUgd2Uga25vdyB0aGUgZGF0YWJhc2UgaXMgbm90IG51bGwKLQkJCXJldHVybiAobmFtZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ0ZvcklkZW50aWZpZXIobmFtZSk7Ci0JCX0KLQotCQlwcml2YXRlIERhdGFiYXNlIGdldERhdGFiYXNlKCkgewotCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREYXRhYmFzZSgpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBBYnN0cmFjdCBjb2xsZWN0aW9uIGFzcGVjdCBhZGFwdGVyIGZvciBEVFAgY29ubmVjdGlvbiBwcm9maWxlIGNvbm5lY3Rpb24vZGF0YWJhc2UKLQkgKi8KLQlhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQ29ubmVjdGlvblByb2ZpbGVDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxFPgotCQlleHRlbmRzIEFzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxDb25uZWN0aW9uUHJvZmlsZSwgRT4KLQl7Ci0JCXByaXZhdGUgZmluYWwgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKLQotCQlDb25uZWN0aW9uUHJvZmlsZUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDb25uZWN0aW9uUHJvZmlsZT4gY29ubmVjdGlvblByb2ZpbGVNb2RlbCkgewotCQkJc3VwZXIoY29ubmVjdGlvblByb2ZpbGVNb2RlbCk7Ci0JCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJfQotCi0JCS8vIHRoZSBjb25uZWN0aW9uIG9wZW5pbmcgaXMgcHJvYmFibHkgdGhlIG9ubHkgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbi4uLgotCQlwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgQ29ubmVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCQkJQ29ubmVjdGlvblByb2ZpbGVDb2xsZWN0aW9uQXNwZWN0QWRhcHRlci50aGlzLmNvbm5lY3Rpb25PcGVuZWQocHJvZmlsZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXZvaWQgY29ubmVjdGlvbk9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQlpZiAocHJvZmlsZS5lcXVhbHModGhpcy5zdWJqZWN0KSkgewotCQkJCXRoaXMuY29sbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJCXRoaXMuc3ViamVjdC5hZGRDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotCQkJdGhpcy5zdWJqZWN0LnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIENhdGFsb2dzIG9uIHRoZSBkYXRhYmFzZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgRGF0YWJhc2VDYXRhbG9nQ2hvaWNlc01vZGVsCi0JCWV4dGVuZHMgQ29ubmVjdGlvblByb2ZpbGVDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxTdHJpbmc+Ci0JewotCQlEYXRhYmFzZUNhdGFsb2dDaG9pY2VzTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPENvbm5lY3Rpb25Qcm9maWxlPiBjb25uZWN0aW9uUHJvZmlsZU1vZGVsKSB7Ci0JCQlzdXBlcihjb25uZWN0aW9uUHJvZmlsZU1vZGVsKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRJdGVyYWJsZSgpIHsKLQkJCURhdGFiYXNlIGRiID0gdGhpcy5zdWJqZWN0LmdldERhdGFiYXNlKCk7Ci0JCQkvLyB1c2UgY2F0YWxvZyAqaWRlbnRpZmllcnMqIHNpbmNlIHRoZSBzdHJpbmcgZW5kcyB1cCBiZWluZyB0aGUgImRlZmF1bHQiIGZvciB2YXJpb3VzIHRleHQgZW50cmllcwotCQkJcmV0dXJuIChkYiAhPSBudWxsKSA/IGRiLmdldFNvcnRlZENhdGFsb2dJZGVudGlmaWVycygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFNjaGVtYXMgb24gdGhlIGRhdGFiYXNlIG9yIGNhdGFsb2cuCi0JICogVGhpcyBsaXN0IGlzIG5vdCBkZXJpdmVkIHB1cmVseSBmcm9tIHRoZSBkYXRhYmFzZTsgaXQgaXMgYWxzbyBkZXBlbmRlbnQKLQkgKiBvbiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBjYXRhbG9nICh3aGljaCBtYXkgYmUgb3ZlcnJpZGRlbgotCSAqIGJ5IHRoZSB1c2VyKS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgRGF0YWJhc2VTY2hlbWFDaG9pY2VzTW9kZWwKLQkJZXh0ZW5kcyBDb25uZWN0aW9uUHJvZmlsZUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPFN0cmluZz4KLQl7Ci0JCXByaXZhdGUgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGVmYXVsdENhdGFsb2dNb2RlbDsKLQkJcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNhdGFsb2dMaXN0ZW5lcjsKLQotCQlEYXRhYmFzZVNjaGVtYUNob2ljZXNNb2RlbCgKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvblByb2ZpbGU+IGNvbm5lY3Rpb25Qcm9maWxlTW9kZWwsCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGVmYXVsdENhdGFsb2dNb2RlbAotCQkpIHsKLQkJCXN1cGVyKGNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpOwotCQkJdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsID0gZGVmYXVsdENhdGFsb2dNb2RlbDsKLQkJCXRoaXMuY2F0YWxvZ0xpc3RlbmVyID0gdGhpcy5idWlsZENhdGFsb2dMaXN0ZW5lcigpOwotCQl9Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2F0YWxvZ0xpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCURhdGFiYXNlU2NoZW1hQ2hvaWNlc01vZGVsLnRoaXMuY2F0YWxvZ0NoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJdm9pZCBjYXRhbG9nQ2hhbmdlZCgpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNoYW5nZWQoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJCXN1cGVyLmVuZ2FnZVN1YmplY3RfKCk7Ci0JCQl0aGlzLmRlZmF1bHRDYXRhbG9nTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2F0YWxvZ0xpc3RlbmVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLQkJCXRoaXMuZGVmYXVsdENhdGFsb2dNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYXRhbG9nTGlzdGVuZXIpOwotCQkJc3VwZXIuZGlzZW5nYWdlU3ViamVjdF8oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRJdGVyYWJsZSgpIHsKLQkJCVNjaGVtYUNvbnRhaW5lciBzYyA9IHRoaXMuZ2V0U2NoZW1hQ29udGFpbmVyKCk7Ci0JCQkvLyB1c2Ugc2NoZW1hICppZGVudGlmaWVycyogc2luY2UgdGhlIHN0cmluZyBlbmRzIHVwIGJlaW5nIHRoZSAiZGVmYXVsdCIgZm9yIHZhcmlvdXMgdGV4dCBlbnRyaWVzCi0JCQlyZXR1cm4gKHNjICE9IG51bGwpID8gc2MuZ2V0U29ydGVkU2NoZW1hSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBTY2hlbWFDb250YWluZXIgZ2V0U2NoZW1hQ29udGFpbmVyKCkgewotCQkJcmV0dXJuIHRoaXMuZGF0YWJhc2VTdXBwb3J0c0NhdGFsb2dzKCkgPyB0aGlzLmdldENhdGFsb2coKSA6IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBkYXRhYmFzZVN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJCXJldHVybiAoZGIgIT0gbnVsbCkgJiYgZGIuc3VwcG9ydHNDYXRhbG9ncygpOwotCQl9Ci0KLQkJcHJpdmF0ZSBDYXRhbG9nIGdldENhdGFsb2coKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHRoaXMuZGVmYXVsdENhdGFsb2dNb2RlbC5nZXRWYWx1ZSgpOwotCQkJLy8gaWYgd2UgZ2V0IGhlcmUgd2Uga25vdyB0aGUgZGF0YWJhc2UgaXMgbm90IG51bGwKLQkJCXJldHVybiAobmFtZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ0ZvcklkZW50aWZpZXIobmFtZSk7Ci0JCX0KLQotCQlwcml2YXRlIERhdGFiYXNlIGdldERhdGFiYXNlKCkgewotCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREYXRhYmFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tYmluZSB2YXJpb3VzIG1vZGVscyB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgY2F0YWxvZyBvciBzY2hlbWEuCi0JICogSWYgdGhlIHVzZXIgaGFzIGNoZWNrZWQgdGhlICJPdmVycmlkZSBEZWZhdWx0IiBjaGVjay1ib3gsIHRoZSBkZWZhdWx0Ci0JICogaXMgdGhlIEpQQSBwcm9qZWN0J3MgdXNlciBvdmVycmlkZSBkZWZhdWx0LCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgaXMKLQkgKiBkZXRlcm1pbmVkIGJ5IHRoZSBkYXRhYmFzZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgRGVmYXVsdE1vZGVsCi0JCWV4dGVuZHMgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4KLQkJaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+Ci0JewotCQlwcml2YXRlIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB1c2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ01vZGVsOwotCQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdXNlck92ZXJyaWRlRGVmYXVsdE1vZGVsOwotCQlwcml2YXRlIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGRhdGFiYXNlRGVmYXVsdE1vZGVsOwotCi0JCURlZmF1bHRNb2RlbCgKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdXNlck92ZXJyaWRlRGVmYXVsdEZsYWdNb2RlbCwKLQkJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHVzZXJPdmVycmlkZURlZmF1bHRNb2RlbCwKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBkYXRhYmFzZURlZmF1bHRNb2RlbAotCQkpIHsKLQkJCXN1cGVyKHVzZXJPdmVycmlkZURlZmF1bHRGbGFnTW9kZWwsIHVzZXJPdmVycmlkZURlZmF1bHRNb2RlbCwgZGF0YWJhc2VEZWZhdWx0TW9kZWwpOwotCQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ01vZGVsID0gdXNlck92ZXJyaWRlRGVmYXVsdEZsYWdNb2RlbDsKLQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdE1vZGVsID0gdXNlck92ZXJyaWRlRGVmYXVsdE1vZGVsOwotCQkJdGhpcy5kYXRhYmFzZURlZmF1bHRNb2RlbCA9IGRhdGFiYXNlRGVmYXVsdE1vZGVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIElmIHRoZSBjaGVja2JveCBoYXMgYmVlbiB1bmNoZWNrZWQsIHdlIG5lZWQgdG8gY2xlYXIgb3V0IHRoZSBKUEEKLQkJICogcHJvamVjdCdzIHVzZXIgb3ZlcnJpZGUuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQlpZiAoZXZlbnQuZ2V0U291cmNlKCkgPT0gdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ01vZGVsKSB7Ci0JCQkJaWYgKCAhIHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdEZsYWdJc1NldCgpKSB7Ci0JCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdE1vZGVsLnNldFZhbHVlKG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBJZiB0aGUgY2hlY2tib3ggaXMgY2hlY2tlZCwgcmV0dXJuIHRoZSB1c2VyIG92ZXJyaWRlIGZyb20gdGhlIEpQQSBwcm9qZWN0OwotCQkgKiBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0IGZyb20gdGhlIGRhdGFiYXNlCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlKCkgewotCQkJcmV0dXJuIHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdEZsYWdJc1NldCgpID8KLQkJCQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0TW9kZWwuZ2V0VmFsdWUoKSA6Ci0JCQkJCXRoaXMuZGF0YWJhc2VEZWZhdWx0TW9kZWwuZ2V0VmFsdWUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVzZXIgbWFrZXMgYSBzZWxlY3Rpb24gZnJvbSB0aGUKLQkJICogZHJvcC1kb3duOyB3aGljaCBpcyBvbmx5IHBvc3NpYmxlIHdoZW4gdGhlIGNoZWNrYm94IGlzIGNoZWNrZWQKLQkJICogKGFuZCB0aGUgZHJvcC1kb3duIGlzIGVuYWJsZWQpLgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRNb2RlbC5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHVzZXJPdmVycmlkZURlZmF1bHRGbGFnSXNTZXQoKSB7Ci0JCQlyZXR1cm4gZmxhZ0lzU2V0KHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdEZsYWdNb2RlbCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKHRoaXMuZ2V0VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9EZWZhdWx0SnBhU2VsZWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vRGVmYXVsdEpwYVNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjY0YTY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9EZWZhdWx0SnBhU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBKcGFTZWxlY3Rpb24gaW50ZXJmYWNlLgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEpwYVNlbGVjdGlvbgotCWltcGxlbWVudHMgSnBhU2VsZWN0aW9uCi17Ci0JcHJpdmF0ZSBmaW5hbCBKcGFTdHJ1Y3R1cmVOb2RlIHNlbGVjdGVkTm9kZTsKLQotCi0JcHVibGljIERlZmF1bHRKcGFTZWxlY3Rpb24oSnBhU3RydWN0dXJlTm9kZSBzZWxlY3RlZE5vZGUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHNlbGVjdGVkTm9kZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkEgJ3NlbGVjdGVkTm9kZScgaXMgcmVxdWlyZWQ7IG90aGVyd2lzZSB1c2UgTlVMTF9TRUxFQ1RJT04uIik7Ci0JCX0KLQkJdGhpcy5zZWxlY3RlZE5vZGUgPSBzZWxlY3RlZE5vZGU7Ci0JfQotCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U2VsZWN0ZWROb2RlKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZE5vZGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJLy8gYnkgZGVmaW5pdGlvbiwgdGhpcyBzZWxlY3Rpb24gaXMgbmV2ZXIgZW1wdHkKLQkJLy8gdXNlIElKcGFTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT04gZm9yIGVtcHR5IHNlbGVjdGlvbnMKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICghIChvYmogaW5zdGFuY2VvZiBKcGFTZWxlY3Rpb24pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSnBhU2VsZWN0aW9uIG90aGVyID0gKEpwYVNlbGVjdGlvbikgb2JqOwotCQlyZXR1cm4gKCAhIG90aGVyLmlzRW1wdHkoKSkgJiYgdGhpcy5zZWxlY3RlZE5vZGUuZXF1YWxzKG90aGVyLmdldFNlbGVjdGVkTm9kZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZE5vZGUuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZE5vZGUudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9EZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0RlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NmRlNjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0RlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotCi0vKioKLSAqIEEge0BsaW5rIEpwYVNlbGVjdGlvbk1hbmFnZXJ9IHN0b3JlcyB0aGUgY3VycmVudCB7QGxpbmsgSnBhU2VsZWN0aW9ufSBhbmQgCi0gKiBub3RpZmllcyA8Y29kZT5JU2VsZWN0aW9uTGlzdGVuZXI8L2NvZGU+cyB3aGVuIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyCi0JaW1wbGVtZW50cyBKcGFTZWxlY3Rpb25NYW5hZ2VyCi17Ci0JLyogVGhlIHdpbmRvdyBmb3Igd2hpY2ggdGhpcyBvYmplY3QgbWFuYWdlcyBzZWxlY3Rpb25zICovCi0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQkKLQkvKiBUaGUgc2V0IG9mIHBhZ2VzIGZvciB3aGljaCB0aGlzIG9iamVjdCBpcyBtYW5hZ2luZyBzZWxlY3Rpb25zICovCi0JcHJpdmF0ZSBTZXQ8SVdvcmtiZW5jaFBhZ2U+IHBhZ2VzOwotCQotCS8qIFRoZSBhY3RpdmUgZWRpdG9yIHBhcnQgKi8KLQlwcml2YXRlIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcjsKLQkKLQlwcml2YXRlIEpwYVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uOwotCQotCS8qIFRoZSBtYXAgb2YgPGNvZGU+SUpwYVNlbGVjdGlvblBhcnRpY2lwYW50PC9jb2RlPnMgKGtleWVkIGJ5IHBhcnQpICovCi0JcHJpdmF0ZSBNYXA8SVdvcmtiZW5jaFBhcnQsIEpwYVNlbGVjdGlvblBhcnRpY2lwYW50PiBzZWxlY3Rpb25QYXJ0aWNpcGFudHM7Ci0JCi0JcHJpdmF0ZSBJUGFnZUxpc3RlbmVyIHBhZ2VMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIElQYXJ0TGlzdGVuZXIyIHBhcnRMaXN0ZW5lcjsKLQkKLQkKLQlwdWJsaWMgRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXBhZ2VzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU2V0KG5ldyBIYXNoU2V0PElXb3JrYmVuY2hQYWdlPigpKTsKLQkJc2VsZWN0aW9uUGFydGljaXBhbnRzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwPElXb3JrYmVuY2hQYXJ0LCBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudD4oKSk7Ci0JCXBhZ2VMaXN0ZW5lciA9IG5ldyBQYWdlTGlzdGVuZXIoKTsKLQkJcGFydExpc3RlbmVyID0gbmV3IFBhcnRMaXN0ZW5lcigpOwotCQljdXJyZW50U2VsZWN0aW9uID0gRGVmYXVsdEpwYVNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjsKLQl9Ci0JCi0Jdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgYVdpbmRvdykgewotCQl3aW5kb3cgPSBhV2luZG93OwotCQlhV2luZG93LmFkZFBhZ2VMaXN0ZW5lcihwYWdlTGlzdGVuZXIpOwotCQlpbml0UGFnZShhV2luZG93LmdldEFjdGl2ZVBhZ2UoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0UGFnZShJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCWlmICgocGFnZSAhPSBudWxsKSAmJiAoISBwYWdlcy5jb250YWlucyhwYWdlKSkpIHsKLQkJCXBhZ2UuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0JCQlwYWdlcy5hZGQocGFnZSk7Ci0JCQlhY3RpdmF0ZUVkaXRvcihwYWdlLmdldEFjdGl2ZUVkaXRvcigpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzcG9zZVBhZ2UoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQlpZiAoKHBhZ2UgIT0gbnVsbCkgJiYgKHBhZ2VzLmNvbnRhaW5zKHBhZ2UpKSkgewotCQkJcGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkJCXBhZ2VzLnJlbW92ZShwYWdlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWN0aXZhdGVFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCWlmIChlZGl0b3IgPT0gYWN0aXZlRWRpdG9yKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGFjdGl2ZUVkaXRvciAhPSBudWxsKSB7Ci0JCQlpbmFjdGl2YXRlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCX0KLQkJaW5pdFBhcnQoZWRpdG9yKTsKLQkJYWN0aXZlRWRpdG9yID0gZWRpdG9yOwotCQlzZWxlY3RFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluYWN0aXZhdGVFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCQotCX0KLQkKLQl2b2lkIGluaXRQYXJ0KElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJaWYgKHNlbGVjdGlvblBhcnRpY2lwYW50cy5nZXQocGFydCkgPT0gbnVsbCkgewotCQkJCUpwYVNlbGVjdGlvblBhcnRpY2lwYW50IHNlbGVjdGlvblBhcnRpY2lwYW50ID0gCi0JCQkJCShKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCkgcGFydC5nZXRBZGFwdGVyKEpwYVNlbGVjdGlvblBhcnRpY2lwYW50LmNsYXNzKTsKLQkJCQlpZiAoc2VsZWN0aW9uUGFydGljaXBhbnQgIT0gbnVsbCkgewotCQkJCQlzZWxlY3Rpb25QYXJ0aWNpcGFudHMucHV0KHBhcnQsIHNlbGVjdGlvblBhcnRpY2lwYW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdEVkaXRvcihJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJc2VsZWN0UGFydChlZGl0b3IpOwotCX0KLQkKLQl2b2lkIHNlbGVjdFBhcnQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCBzZWxlY3Rpb25QYXJ0aWNpcGFudCA9IGdldFNlbGVjdGlvblBhcnRpY2lwYW50KHBhcnQpOwotCQlpZiAoc2VsZWN0aW9uUGFydGljaXBhbnQgIT0gbnVsbCkgewotCQkJc2VsZWN0KHNlbGVjdGlvblBhcnRpY2lwYW50LmdldFNlbGVjdGlvbigpLCBzZWxlY3Rpb25QYXJ0aWNpcGFudCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBoaWRlUGFydChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCUpwYVNlbGVjdGlvblBhcnRpY2lwYW50IHNlbGVjdGlvblBhcnRpY2lwYW50ID0gZ2V0U2VsZWN0aW9uUGFydGljaXBhbnQocGFydCk7Ci0JCWlmICgoc2VsZWN0aW9uUGFydGljaXBhbnQgIT0gbnVsbCkgJiYgKHNlbGVjdGlvblBhcnRpY2lwYW50LmRpc3Bvc2VPbkhpZGUoKSkpIHsKLQkJCWNsb3NlUGFydChwYXJ0KTsKLQkJfQotCX0KLQkKLQl2b2lkIGNsb3NlUGFydChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCUpwYVNlbGVjdGlvblBhcnRpY2lwYW50IHNlbGVjdGlvblBhcnRpY2lwYW50ID0gZ2V0U2VsZWN0aW9uUGFydGljaXBhbnQocGFydCk7Ci0JCWlmIChzZWxlY3Rpb25QYXJ0aWNpcGFudCAhPSBudWxsKSB7Ci0JCQlkaXNwb3NlUGFydChwYXJ0KTsKLQkJCWNoZWNrRm9yTm9FZGl0b3JzKCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBkaXNwb3NlUGFydChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWlmICgocGFydCAhPSBudWxsKSAmJiAoc2VsZWN0aW9uUGFydGljaXBhbnRzLmNvbnRhaW5zS2V5KHBhcnQpKSkgewotCQkJc2VsZWN0aW9uUGFydGljaXBhbnRzLnJlbW92ZShwYXJ0KS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBjaGVja0Zvck5vRWRpdG9ycygpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmICgoYWN0aXZlUGFnZSA9PSBudWxsKQotCQkJCXx8IChhY3RpdmVQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKS5sZW5ndGggPT0gMCkpIHsKLQkJCXNlbGVjdChEZWZhdWx0SnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OLCBudWxsKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWdpc3RlcihJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWluaXRQYXJ0KHBhcnQpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlyZXR1cm4gc2VsZWN0aW9uUGFydGljaXBhbnRzLmdldChwYXJ0KSAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3QoSnBhU2VsZWN0aW9uIG5ld1NlbGVjdGlvbiwgSnBhU2VsZWN0aW9uUGFydGljaXBhbnQgc291cmNlKSB7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uLmVxdWFscyhuZXdTZWxlY3Rpb24pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWN1cnJlbnRTZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247Ci0JCU9iamVjdCBub25OdWxsU291cmNlID0gKHNvdXJjZSA9PSBudWxsKSA/IHRoaXMgOiBzb3VyY2U7Ci0JCWZpcmVTZWxlY3Rpb25DaGFuZ2UoCi0JCQluZXcgSnBhU2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBKcGFTZWxlY3Rpb25FdmVudC5TRUxFQ1RJT04sIG5vbk51bGxTb3VyY2UpCi0JCSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRlc2VsZWN0KEpwYVNlbGVjdGlvbiBvbGRTZWxlY3Rpb24sIEpwYVNlbGVjdGlvblBhcnRpY2lwYW50IHNvdXJjZSkgewotCQlpZiAoY3VycmVudFNlbGVjdGlvbi5lcXVhbHMob2xkU2VsZWN0aW9uKSkgewotCQkJY3VycmVudFNlbGVjdGlvbiA9IERlZmF1bHRKcGFTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT047Ci0JCQlPYmplY3Qgbm9uTnVsbFNvdXJjZSA9IChzb3VyY2UgPT0gbnVsbCkgPyB0aGlzIDogc291cmNlOwotCQkJZmlyZVNlbGVjdGlvbkNoYW5nZSgKLQkJCQluZXcgSnBhU2VsZWN0aW9uRXZlbnQob2xkU2VsZWN0aW9uLCBKcGFTZWxlY3Rpb25FdmVudC5ERVNFTEVDVElPTiwgbm9uTnVsbFNvdXJjZSkKLQkJCSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpcmVTZWxlY3Rpb25DaGFuZ2UoSnBhU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCBzcCA6IHNlbGVjdGlvblBhcnRpY2lwYW50cy52YWx1ZXMoKSkgewotCQkJc3Auc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCBnZXRTZWxlY3Rpb25QYXJ0aWNpcGFudChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXJldHVybiBzZWxlY3Rpb25QYXJ0aWNpcGFudHMuZ2V0KHBhcnQpOwotCX0KLQkJCi0JcHVibGljIEpwYVNlbGVjdGlvbiBnZXRDdXJyZW50U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFNlbGVjdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJd2luZG93LnJlbW92ZVBhZ2VMaXN0ZW5lcihwYWdlTGlzdGVuZXIpOwotCQlzZWxlY3Rpb25QYXJ0aWNpcGFudHMuY2xlYXIoKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8SVdvcmtiZW5jaFBhZ2U+IHN0cmVhbSA9IG5ldyBDbG9uZUl0ZXJhdG9yPElXb3JrYmVuY2hQYWdlPih0aGlzLnBhZ2VzKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmRpc3Bvc2VQYWdlKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvcjxJV29ya2JlbmNoUGFydD4gc3RyZWFtID0gbmV3IENsb25lSXRlcmF0b3I8SVdvcmtiZW5jaFBhcnQ+KHNlbGVjdGlvblBhcnRpY2lwYW50cy5rZXlTZXQoKSk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5kaXNwb3NlUGFydChzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIGNsYXNzIFBhZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElQYWdlTGlzdGVuZXIKLQl7Ci0JCXB1YmxpYyB2b2lkIHBhZ2VBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQkJLy8gbm9wCi0JCX0KLQkJCi0JCVBhZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhZ2VDbG9zZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQkJRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIudGhpcy5kaXNwb3NlUGFnZShwYWdlKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcGFnZU9wZW5lZChJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCQlEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci50aGlzLmluaXRQYWdlKHBhZ2UpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgY2xhc3MgUGFydExpc3RlbmVyIGltcGxlbWVudHMgSVBhcnRMaXN0ZW5lcjIKLQl7Ci0JCVBhcnRMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHBhcnRSZWYuZ2V0UGFydChmYWxzZSk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIudGhpcy5pbml0UGFydChwYXJ0KTsKLQkJCQlEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci50aGlzLnNlbGVjdFBhcnQocGFydCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHBhcnRSZWYuZ2V0UGFydChmYWxzZSk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJaW5pdFBhcnQocGFydCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHBhcnRSZWYuZ2V0UGFydChmYWxzZSk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIudGhpcy5jbG9zZVBhcnQocGFydCk7Ci0JCQkJRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIudGhpcy5kaXNwb3NlUGFydChwYXJ0KTsKLQkJCQlEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci50aGlzLmNoZWNrRm9yTm9FZGl0b3JzKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkvLyBub3AKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcGFydEhpZGRlbihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFydFJlZi5nZXRQYXJ0KGZhbHNlKTsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci50aGlzLmhpZGVQYXJ0KHBhcnQpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0SW5wdXRDaGFuZ2VkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCS8vIG5vcAotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBwYXJ0UmVmLmdldFBhcnQoZmFsc2UpOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCWluaXRQYXJ0KHBhcnQpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0VmlzaWJsZShJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFydFJlZi5nZXRQYXJ0KGZhbHNlKTsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlpbml0UGFydChwYXJ0KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFEZXRhaWxzU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFEZXRhaWxzU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE4ZWVmNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhRGV0YWlsc1NlbGVjdGlvblBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3MuSnBhRGV0YWlsc1ZpZXc7Ci0KLQotcHVibGljIGNsYXNzIEpwYURldGFpbHNTZWxlY3Rpb25QYXJ0aWNpcGFudAotCWltcGxlbWVudHMgSnBhU2VsZWN0aW9uUGFydGljaXBhbnQgCi17Ci0JcHJpdmF0ZSBmaW5hbCBKcGFEZXRhaWxzVmlldyBkZXRhaWxzVmlldzsKLQkKLQkKLQlwdWJsaWMgSnBhRGV0YWlsc1NlbGVjdGlvblBhcnRpY2lwYW50KEpwYURldGFpbHNWaWV3IGRldGFpbHNWaWV3KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGV0YWlsc1ZpZXcgPSBkZXRhaWxzVmlldzsKLQl9Ci0KLQlwdWJsaWMgSnBhU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZGV0YWlsc1ZpZXcuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChKcGFTZWxlY3Rpb25FdmVudCBldnQpIHsKLQkJdGhpcy5kZXRhaWxzVmlldy5zZWxlY3QoZXZ0LmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkaXNwb3NlT25IaWRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gTk9QCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU2VsZWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MjM5MjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLgotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqICBDb250cmlidXRvcnM6Ci0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIEpwYVNlbGVjdGlvbiBleHRlbmRzIElTZWxlY3Rpb24KLXsKLQlzdGF0aWMgSnBhU2VsZWN0aW9uIE5VTExfU0VMRUNUSU9OID0KLQkJbmV3IEpwYVNlbGVjdGlvbigpIHsKLQkJCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFNlbGVjdGVkTm9kZSgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiTlVMTCBTRUxFQ1RJT04iOwotCQkJfQotCQl9OwotCi0KLQlKcGFTdHJ1Y3R1cmVOb2RlIGdldFNlbGVjdGVkTm9kZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVNlbGVjdGlvbkV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU2VsZWN0aW9uRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4YmFmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU2VsZWN0aW9uRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgSnBhU2VsZWN0aW9uRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCAKLXsKLQkvKioKLQkgKiBTZXJpYWxpemFibGUgdWlkCi0JICogQHNpbmNlIDAuNQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIAotCQotCS8qKgotCSAqIEluZGljYXRlcyB0aGF0IHRoZSBzZWxlY3Rpb24gb2JqZWN0IGlzIG5vdyBzZWxlY3RlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IFNFTEVDVElPTiA9IDE7Ci0JCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoYXQgdGhlIHNlbGVjdGlvbiBvYmplY3QgaGFzIG5vdyBiZWVuIGRlc2VsZWN0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBERVNFTEVDVElPTiA9IDI7Ci0JCi0JCi0JLyoqCi0JICogVGhlIHNlbGVjdGlvbiBvYmplY3Qgd2hvc2Ugc2VsZWN0aW9uIHN0YXR1cyBoYXMgY2hhbmdlZAotCSAqLwotCXByaXZhdGUgSnBhU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkKLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgc2VsZWN0aW9uIGV2ZW50LCBlaXRoZXIgYSBTRUxFQ1RJT04gb3IgYSBERVNFTEVDVElPTgotCSAqLwotCXByaXZhdGUgaW50IHR5cGU7Ci0JCi0JCi0JcHVibGljIEpwYVNlbGVjdGlvbkV2ZW50KEpwYVNlbGVjdGlvbiB0aGVTZWxlY3Rpb24sIGludCB0aGVUeXBlLCBPYmplY3Qgc291cmNlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCXNlbGVjdGlvbiA9IHRoZVNlbGVjdGlvbjsKLQkJdHlwZSA9IHRoZVR5cGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VsZWN0aW9uIG9iamVjdCB3aG9zZSBzZWxlY3Rpb24gc3RhdHVzIGhhcyBjaGFuZ2VkCi0JICovCi0JcHVibGljIEpwYVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBvZiBzZWxlY3Rpb24gZXZlbnQsIGVpdGhlciBhIFNFTEVDVElPTiBvciBhIERFU0VMRUNUSU9OCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU2VsZWN0aW9uTWFuYWdlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVNlbGVjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlM2UzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU2VsZWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSnBhU2VsZWN0aW9uTWFuYWdlciAKLXsJCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gIAotCSAqIFRoaXMgd2lsbCBuZXZlciBiZSBudWxsLCBidXQgaXQgbWF5IGJlIGVtcHR5LgotCSAqLwotCXB1YmxpYyBKcGFTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbigpOwotCQotCS8qKgotCSAqIE5vdCB0byBiZSBjYWxsZWQgbGlnaHRseSwgdGhpcyB3aWxsIGFmZmVjdCB0aGUgc2VsZWN0aW9uIGZvciBhbGwgaW50ZXJlc3RlZAotCSAqIG9iamVjdHMgaW4gYSB3aW5kb3cuCi0JICogQHBhcmFtIG5ld1NlbGVjdGlvbiAgVGhlIG5ldyBzZWxlY3Rpb24gZm9yIHRoZSBjdXJyZW50IHdpbmRvdy4KLQkgKiBAcGFyYW0gc291cmNlICBUaGUgc2VsZWN0aW9uIHBhcnRpY2lwYW50IChpZiBhbnkpIHRoYXQgaXMgY2F1c2luZyB0aGUgCi0JICogc2VsZWN0aW9uLiAgTWF5IGJlIG51bGwuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0KEpwYVNlbGVjdGlvbiBuZXdTZWxlY3Rpb24sIEpwYVNlbGVjdGlvblBhcnRpY2lwYW50IHNvdXJjZSk7Ci0JCi0JLyoqCi0JICogTm90IHRvIGJlIGNhbGxlZCBsaWdodGx5LCB0aGlzIHdpbGwgYWZmZWN0IHRoZSBzZWxlY3Rpb24gZm9yIGFsbCBpbnRlcmVzdGVkCi0JICogb2JqZWN0cyBpbiBhIHdpbmRvdy4KLQkgKiBAcGFyYW0gb2xkU2VsZWN0aW9uICBUaGUgb2xkU2VsZWN0aW9uIHdpbGwgYmUgZGVzZWxlY3RlZCwgaWZmIGl0IG1hdGNoZXMgCi0JICogdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiAgSWYgc28sIHRoZSBuZXcgc2VsZWN0aW9uIHdpbGwgYmUgYW4gZW1wdHkgSnBhU2VsZWN0aW9uLgotCSAqIEBwYXJhbSBzb3VyY2UgIFRoZSBzZWxlY3Rpb24gcGFydGljaXBhbnQgKGlmIGFueSkgdGhhdCBpcyBjYXVzaW5nIHRoZSAKLQkgKiBzZWxlY3Rpb24uICBNYXkgYmUgbnVsbC4gCi0JICovCi0JcHVibGljIHZvaWQgZGVzZWxlY3QoSnBhU2VsZWN0aW9uIG9sZFNlbGVjdGlvbiwgSnBhU2VsZWN0aW9uUGFydGljaXBhbnQgc291cmNlKTsKLQkKLQkvKioKLQkgKiBUaGlzIG1heSBiZSB1c2VkIHRvIHJlZ2lzdGVyIGEgcGFydCB3aXRoIHRoZSBzZWxlY3Rpb24gbWFuYWdlciBpZiB0aGUgcGFydAotCSAqIGlzIGtub3duIHRvIG5lZWQgYWNjZXNzIHRvIHRoZSBzZWxlY3Rpb24gbWFuYWdlciBiZWZvcmUgaXQgaXMgZXZlciBhY3RpdmF0ZWQKLQkgKiBvciBpbiB0aGUgY2FzZSBpdCBtYXkgYmUgYWN0aXZhdGVkIHByaW9yIHRvIHRoZSBzZWxlY3Rpb24gbWFuYWdlciBiZWluZyAKLQkgKiBjcmVhdGVkLgotCSAqIAotCSAqIEl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIGRlcmVnaXN0ZXIgYSBwYXJ0LCBhcyB0aGF0IGhhcHBlbnMgd2hlbiB0aGUgCi0JICogcGFydCBpcyBjbG9zZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXIoSVdvcmtiZW5jaFBhcnQgcGFydCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBwYXJ0IGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIHRvIHJlc3BvbmQgdG8gc2VsZWN0aW9ucwotCSAqIGZyb20gdGhpcyBzZWxlY3Rpb24gbWFuYWdlcgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVnaXN0ZXJlZChJV29ya2JlbmNoUGFydCBwYXJ0KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Y2YxMWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSnBhU2VsZWN0aW9uUGFydGljaXBhbnQgCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBvZiB0aGUgcGFydGljaXBhbnQKLQkgKi8KLQlKcGFTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCk7Ci0JCi0JLyoqCi0JICogVGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCBpbiB0aGUgY2VudHJhbCBzZWxlY3Rpb24gbWFuYWdlci4KLQkgKiBVcGRhdGUgdGhpcyBwYXJ0aWNpcGFudCBhY2NvcmRpbmdseS4KLQkgKi8KLQl2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSnBhU2VsZWN0aW9uRXZlbnQgZXZ0KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHNlbGVjdGlvbiBwYXJ0aWNpcGFudCBzaG91bGQgZGlzY29ubmVjdCBpdHNlbGYgZnJvbQotCSAqIGl0cyBwYXJ0IHdoZW4gaXRzIHBhcnQgaXMgaGlkZGVuIGZyb20gdmlldy4KLQkgKiA8Yj5UeXBpY2FsbHk8L2I+IGVkaXRvciBwYXJ0aWNpcGFudHMgd2lsbCByZXR1cm4gdHJ1ZSBhbmQgdmlldyBwYXJ0aWNpcGFudHMgd2lsbAotCSAqIHJldHVybiBmYWxzZS4KLQkgKi8KLQlib29sZWFuIGRpc3Bvc2VPbkhpZGUoKTsKLQkKLQkvKioKLQkgKiBUaGlzIHBhcnRpY2lwYW50IGlzIG5vIGxvbmdlciBuZWVkZWQgKG1vc3QgbGlrZWx5IGJlY2F1c2UgaXRzIHBhcnQgaGFzIAotCSAqIGNsb3NlZCkuICBEaXNwb3NlIG9mIGl0LgotCSAqLwotCXZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVN0cnVjdHVyZVNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU3RydWN0dXJlU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEzYTM2OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU3RydWN0dXJlU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3Muc3RydWN0dXJlLkpwYVN0cnVjdHVyZVZpZXc7Ci0KLXB1YmxpYyBjbGFzcyBKcGFTdHJ1Y3R1cmVTZWxlY3Rpb25QYXJ0aWNpcGFudAotCWltcGxlbWVudHMgSnBhU2VsZWN0aW9uUGFydGljaXBhbnQgCi17Ci0JZmluYWwgSnBhU3RydWN0dXJlVmlldyBzdHJ1Y3R1cmVWaWV3OwotCQotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVTZWxlY3Rpb25QYXJ0aWNpcGFudChKcGFTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXIsIEpwYVN0cnVjdHVyZVZpZXcgc3RydWN0dXJlVmlldykgewotCQlzdXBlcigpOwotCQl0aGlzLnN0cnVjdHVyZVZpZXcgPSBzdHJ1Y3R1cmVWaWV3OwotCQlzdHJ1Y3R1cmVWaWV3LmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgU3RydWN0dXJlVmlld1NlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbk1hbmFnZXIsIHN0cnVjdHVyZVZpZXcpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuc3RydWN0dXJlVmlldy5nZXRKcGFTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChKcGFTZWxlY3Rpb25FdmVudCBldnQpIHsKLQkJaWYgKGV2dC5nZXRTb3VyY2UoKSAhPSB0aGlzKSB7Ci0JCQl0aGlzLnN0cnVjdHVyZVZpZXcuc2VsZWN0KGV2dC5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkaXNwb3NlT25IaWRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIE5PUAotCX0KLQkKLQotCS8vICoqKioqKioqKiogbGlzdGVuZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBTdHJ1Y3R1cmVWaWV3U2VsZWN0aW9uTGlzdGVuZXIgCi0JCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotCXsKLQkJcHJpdmF0ZSBmaW5hbCBKcGFTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXI7Ci0KLQkJU3RydWN0dXJlVmlld1NlbGVjdGlvbkxpc3RlbmVyKEpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciwgSnBhU3RydWN0dXJlVmlldyBzdHJ1Y3R1cmVWaWV3KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zZWxlY3Rpb25NYW5hZ2VyID0gc2VsZWN0aW9uTWFuYWdlcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoc3RydWN0dXJlVmlldy5nZXRWaWV3U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkuZ2V0QWN0aXZlUGFydCgpID09IHN0cnVjdHVyZVZpZXcpIHsKLQkJCQlzZWxlY3Rpb25NYW5hZ2VyLnNlbGVjdCh0aGlzLnN0cnVjdHVyZVZpZXdTZWxlY3Rpb24oKSwgSnBhU3RydWN0dXJlU2VsZWN0aW9uUGFydGljaXBhbnQudGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIEpwYVNlbGVjdGlvbiBzdHJ1Y3R1cmVWaWV3U2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIEpwYVN0cnVjdHVyZVNlbGVjdGlvblBhcnRpY2lwYW50LnRoaXMuc3RydWN0dXJlVmlldy5nZXRKcGFTZWxlY3Rpb24oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMjgzYWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotcHVibGljIGNsYXNzIFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkgSU5TVEFOQ0U7Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgTVVURVggPSBuZXcgT2JqZWN0KCk7Ci0KLQotCS8qKgotCSAqIEVhY2ggPGNvZGU+SVdvcmtiZW5jaFdpbmRvdzwvY29kZT4gaGFzIGl0cyBvd24gPGNvZGU+SnBhU2VsZWN0aW9uTWFuYWdlcjwvY29kZT4KLQkgKiB0byB0cmFjayB0aGUgc2VsZWN0aW9uIGV2ZW50cyBpbiB0aGUgPGNvZGU+SVdvcmtiZW5jaFdpbmRvdzwvY29kZT4uIEFsbAotCSAqIDxjb2RlPklTZWxlY3Rpb25MaXN0ZW5lcjwvY29kZT5zIGluIHRoZSBzYW1lIDxjb2RlPklXb3JrYmVuY2hXaW5kb3c8L2NvZGU+Ci0JICogc2hhcmUgdGhlIHNhbWUgPGNvZGU+SnBhU2VsZWN0aW9uTWFuYWdlcjwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5KcGFTZWxlY3Rpb25NYW5hZ2VyPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQKLQkgKiA8Y29kZT5JV29ya2JlbmNoV2luZG93PC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhU2VsZWN0aW9uTWFuYWdlciBnZXRTZWxlY3Rpb25NYW5hZ2VyKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQkvLyB0aGlzIGlzIHRocmVhZCBzYWZlIGZvciBub3cuIHlvdSBuZXZlciBrbm93IHdoYXRzIGNvbW1pbmcKLQkJCXN5bmNocm9uaXplZCAoTVVURVgpIHsKLQkJCQlpZihJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQkJCUlOU1RBTkNFID0gbmV3IFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5KCk7Ci0JCQkJCS8vIGlmIHdlIGRvIHRoZSBpbml0IGluc2lkZSB0aGUgY29uc3RydWN0b3Igd2UgZW5kIHVwIGluIGEgbG9vcAotCQkJCQkvLyBiZWNhdXNlIHRoZSBhZGRXaW5kb3dMaXN0ZW5lcih0aGlzKSBkb2VzIGEgY2FsbGJhY2sgdG8gdXMKLQkJCQkJSU5TVEFOQ0UuaW5pdCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0UuaW50ZXJuYWxHZXRTZWxlY3Rpb25NYW5hZ2VyKHdpbmRvdyk7Ci0JfQotCi0KLQlNYXA8SVdvcmtiZW5jaFdpbmRvdywgRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXI+IG1hbmFnZXJzOwotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciB3aW5kb3dMaXN0ZW5lcjsKLQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeSgpIHsKLQkJbWFuYWdlcnMgPSBuZXcgSGFzaE1hcDxJV29ya2JlbmNoV2luZG93LCBEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlcj4oKTsKLQkJd2luZG93TGlzdGVuZXIgPSBuZXcgV2luZG93TGlzdGVuZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQl3b3JrYmVuY2guYWRkV2luZG93TGlzdGVuZXIod2luZG93TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpwYVNlbGVjdGlvbk1hbmFnZXIgZm9yIHRoZSBJV29ya2JlbmNoV2luZG93LgotCSAqIENyZWF0ZXMgYSBuZXcgb25lIGlmIG5vbmUgZXhpc3RzIHlldC4KLQkgKi8KLQlEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlciBpbnRlcm5hbEdldFNlbGVjdGlvbk1hbmFnZXIoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgSVdvcmtiZW5jaFdpbmRvdyBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoISBtYW5hZ2Vycy5jb250YWluc0tleSh3aW5kb3cpKSB7Ci0JCQlEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlciBtYW5hZ2VyID0gbmV3IERlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyKCk7Ci0JCQl0aGlzLm1hbmFnZXJzLnB1dCh3aW5kb3csIG1hbmFnZXIpOwotCQkJbWFuYWdlci5pbml0KHdpbmRvdyk7Ci0JCX0KLQotCQlyZXR1cm4gbWFuYWdlcnMuZ2V0KHdpbmRvdyk7Ci0JfQotCi0KLQljbGFzcyBXaW5kb3dMaXN0ZW5lciBpbXBsZW1lbnRzIElXaW5kb3dMaXN0ZW5lcgotCXsKLQkJcHVibGljIHZvaWQgd2luZG93T3BlbmVkKElXb3JrYmVuY2hXaW5kb3cgYVdpbmRvdykgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2VkKElXb3JrYmVuY2hXaW5kb3cgYVdpbmRvdykgewotCQkJRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIgbWFuYWdlciA9IGludGVybmFsR2V0U2VsZWN0aW9uTWFuYWdlcihhV2luZG93KTsKLQkJCW1hbmFnZXIuZGlzcG9zZSgpOwotCQkJbWFuYWdlcnMucmVtb3ZlKGFXaW5kb3cpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgYVdpbmRvdykgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2luZG93RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyBhV2luZG93KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ODBiN2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1RleHRFZGl0b3JTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklQb3N0U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50Ci0JaW1wbGVtZW50cyBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudAotewotCXByaXZhdGUgZmluYWwgSnBhU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyOwotCi0JZmluYWwgSVRleHRFZGl0b3IgdGV4dEVkaXRvcjsKLQotCXByaXZhdGUgZmluYWwgSVByb3BlcnR5TGlzdGVuZXIgZWRpdG9ySW5wdXRMaXN0ZW5lcjsKLQotCXByaXZhdGUgZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBlZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcjsKLQotCXByaXZhdGUgSnBhU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gZm9yd2FyZFNlbGVjdGlvbiA9IHRydWU7ICAvLyBUT0RPIHRoaXMganVzdCBzbWVsbHMgd3JvbmcgIH5ianYKLQotCi0JcHVibGljIFRleHRFZGl0b3JTZWxlY3Rpb25QYXJ0aWNpcGFudChKcGFTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXIsIElUZXh0RWRpdG9yIHRleHRFZGl0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZWxlY3Rpb25NYW5hZ2VyID0gc2VsZWN0aW9uTWFuYWdlcjsKLQkJdGhpcy50ZXh0RWRpdG9yID0gdGV4dEVkaXRvcjsKLQkJdGhpcy5lZGl0b3JJbnB1dExpc3RlbmVyID0gbmV3IEVkaXRvcklucHV0TGlzdGVuZXIoKTsKLQkJdGhpcy50ZXh0RWRpdG9yLmFkZFByb3BlcnR5TGlzdGVuZXIodGhpcy5lZGl0b3JJbnB1dExpc3RlbmVyKTsKLQkJdGhpcy5lZGl0b3JTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmdldFBvc3RTZWxlY3Rpb25Qcm92aWRlcigpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcy5lZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXRoaXMuY3VycmVudFNlbGVjdGlvbiA9IHRoaXMuY2FsY3VsYXRlU2VsZWN0aW9uKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBJSnBhU2VsZWN0aW9uUGFydGljaXBhbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEpwYVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmN1cnJlbnRTZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChKcGFTZWxlY3Rpb25FdmVudCBldnQpIHsKLQkJSnBhU2VsZWN0aW9uIG5ld1NlbGVjdGlvbiA9IGV2dC5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoKG5ld1NlbGVjdGlvbiA9PSBKcGFTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT04pCi0JCQl8fCBuZXdTZWxlY3Rpb24uZXF1YWxzKHRoaXMuY3VycmVudFNlbGVjdGlvbikpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChnZXRBY3RpdmVUZXh0RWRpdG9yKCkgIT0gdGhpcy50ZXh0RWRpdG9yKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0aGlzLmZvcndhcmRTZWxlY3Rpb24gPSBmYWxzZTsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IG5ld1NlbGVjdGlvbi5nZXRTZWxlY3RlZE5vZGUoKS5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKLQkJaWYgKHRleHRSYW5nZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnRleHRFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKHRleHRSYW5nZS5nZXRPZmZzZXQoKSwgdGV4dFJhbmdlLmdldExlbmd0aCgpKTsKLQkJCXRoaXMuY3VycmVudFNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKLQkJfQotCQl0aGlzLmZvcndhcmRTZWxlY3Rpb24gPSB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGRpc3Bvc2VPbkhpZGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMudGV4dEVkaXRvci5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKHRoaXMuZWRpdG9ySW5wdXRMaXN0ZW5lcik7Ci0JCXRoaXMuZ2V0UG9zdFNlbGVjdGlvblByb3ZpZGVyKCkucmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzLmVkaXRvclNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSnBhU2VsZWN0aW9uIGNhbGN1bGF0ZVNlbGVjdGlvbigpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0aGlzLnRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCEgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSkgewotCQkJcmV0dXJuIEpwYVNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjsKLQkJfQotCi0JCUpwYUZpbGUganBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZSgpOwotCQlpZiAoanBhRmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRTZWxlY3Rpb24oanBhRmlsZS5nZXRTdHJ1Y3R1cmVOb2RlKCgoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0T2Zmc2V0KCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhU2VsZWN0aW9uIGJ1aWxkU2VsZWN0aW9uKEpwYVN0cnVjdHVyZU5vZGUgc2VsZWN0ZWROb2RlKSB7Ci0JCXJldHVybiAoc2VsZWN0ZWROb2RlID09IG51bGwpID8gSnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OIDogbmV3IERlZmF1bHRKcGFTZWxlY3Rpb24oc2VsZWN0ZWROb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlUGFnZSgpIHsKLQkJcmV0dXJuIHRoaXMudGV4dEVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgZ2V0QWN0aXZlUGFydCgpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJcmV0dXJuIChhY3RpdmVQYWdlID09IG51bGwpID8gbnVsbDogYWN0aXZlUGFnZS5nZXRBY3RpdmVQYXJ0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBnZXRBY3RpdmVQYWdlKCk7Ci0JCXJldHVybiAoYWN0aXZlUGFnZSA9PSBudWxsKSA/IG51bGw6IGFjdGl2ZVBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJVGV4dEVkaXRvciBnZXRBY3RpdmVUZXh0RWRpdG9yKCkgewotCQlyZXR1cm4gZ2V0VGV4dEVkaXRvcihnZXRBY3RpdmVFZGl0b3IoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJVGV4dEVkaXRvciBnZXRUZXh0RWRpdG9yKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJcmV0dXJuIChwYXJ0ID09IG51bGwpID8gbnVsbCA6IChJVGV4dEVkaXRvcikgcGFydC5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYUZpbGUgZ2V0SnBhRmlsZSgpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gdGhpcy50ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCWlmICggISAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRGaWxlKCkpOwotCX0KLQotCXByb3RlY3RlZCBJUG9zdFNlbGVjdGlvblByb3ZpZGVyIGdldFBvc3RTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSB0aGlzLnRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXIgY2FsbGJhY2tzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGVkaXRvcklucHV0Q2hhbmdlZCgpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWRpdG9yU2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJLy8gVGhpcyBpcyBhIGJpdCBrbHVkZ2V5LiAgV2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBzZWxlY3Rpb24gZXZlbnQgCi0JCS8vIG9jY3VycmVkIHdoZW4gYSBwYXJ0aWNpcGF0aW5nIHBhcnQgaXMgYWN0aXZlIChhbmQgc28sIG9zdGVuc2libHksCi0JCS8vICpiZWNhdXNlKiBvZiB0aGUgcGFydGljaXBhdGluZyBwYXJ0KS4gIElmIHNvLCB3ZSByZXNlbGVjdCB0aGUgdmFsaWQgCi0JCS8vIHRleHQuCi0JCUlXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBnZXRBY3RpdmVQYXJ0KCk7Ci0JCWlmIChnZXRUZXh0RWRpdG9yKGFjdGl2ZVBhcnQpICE9IHRoaXMudGV4dEVkaXRvciAmJiB0aGlzLnNlbGVjdGlvbk1hbmFnZXIuaXNSZWdpc3RlcmVkKGFjdGl2ZVBhcnQpKSB7Ci0JCQlpZiAodGhpcy5jdXJyZW50U2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJdGhpcy5mb3J3YXJkU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uLmdldFNlbGVjdGVkTm9kZSgpLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOwotCQkJaWYgKHRleHRSYW5nZSAhPSBudWxsKSB7Ci0JCQkJdGhpcy50ZXh0RWRpdG9yLnNlbGVjdEFuZFJldmVhbCh0ZXh0UmFuZ2UuZ2V0T2Zmc2V0KCksIHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQl0aGlzLmZvcndhcmRTZWxlY3Rpb24gPSB0cnVlOwotCQkJCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCUpwYVNlbGVjdGlvbiBuZXdTZWxlY3Rpb24gPSB0aGlzLmNhbGN1bGF0ZVNlbGVjdGlvbigpOwotCQlpZiAobmV3U2VsZWN0aW9uLmVxdWFscyh0aGlzLmN1cnJlbnRTZWxlY3Rpb24pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotCQkKLQkJaWYgKHRoaXMuZm9yd2FyZFNlbGVjdGlvbikgewotCQkJdGhpcy5zZWxlY3Rpb25NYW5hZ2VyLnNlbGVjdChuZXdTZWxlY3Rpb24sIHRoaXMpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRWRpdG9ySW5wdXRMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIEVkaXRvcklucHV0TGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgc291cmNlLCBpbnQgcHJvcElkKSB7Ci0JCQlpZiAoKHNvdXJjZSA9PSBUZXh0RWRpdG9yU2VsZWN0aW9uUGFydGljaXBhbnQudGhpcy50ZXh0RWRpdG9yKQotCQkJCQkJJiYgKHByb3BJZCA9PSBJRWRpdG9yUGFydC5QUk9QX0lOUFVUKSkgewotCQkJCVRleHRFZGl0b3JTZWxlY3Rpb25QYXJ0aWNpcGFudC50aGlzLmVkaXRvcklucHV0Q2hhbmdlZCgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIEVkaXRvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50LnRoaXMuZWRpdG9yU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9Xb3JrYmVuY2hQYXJ0QWRhcHRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9Xb3JrYmVuY2hQYXJ0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhOWFhMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vV29ya2JlbmNoUGFydEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3cy5KcGFEZXRhaWxzVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3Muc3RydWN0dXJlLkpwYVN0cnVjdHVyZVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIGJ1aWxkIGFkYXB0ZXJzIGZvciBhIHdvcmtiZW5jaCBwYXJ0OgotICogICAtIEpQQSBzZWxlY3Rpb24gcGFydGljaXBhbnQgKGlmIHRoZSBlZGl0b3IgcGFydCBpcyBhIHRleHQgZWRpdG9yIGV0Yy4pCi0gKiAKLSAqIFNlZSBvcmcuZWNsaXBzZS5qcHQudWkgcGx1Z2luLnhtbC4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtiZW5jaFBhcnRBZGFwdGVyRmFjdG9yeSAKLQlpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gQURBUFRFUl9MSVNUID0gbmV3IENsYXNzW10geyBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudC5jbGFzcyB9OwotCi0JcHVibGljIENsYXNzPD8+W10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBBREFQVEVSX0xJU1Q7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSVdvcmtiZW5jaFBhcnQpIHsKLQkJCXJldHVybiB0aGlzLmdldEFkYXB0ZXIoKElXb3JrYmVuY2hQYXJ0KSBhZGFwdGFibGVPYmplY3QsIGFkYXB0ZXJUeXBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRBZGFwdGVyKElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQsIENsYXNzPD8+IGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGVyVHlwZSA9PSBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudC5jbGFzcykgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCh3b3JrYmVuY2hQYXJ0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEpwYVNlbGVjdGlvblBhcnRpY2lwYW50IGJ1aWxkSnBhU2VsZWN0aW9uUGFydGljaXBhbnQoSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCkgewotCQlKcGFTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXIgPSBTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeS5nZXRTZWxlY3Rpb25NYW5hZ2VyKHdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKTsKLQkJaWYgKHdvcmtiZW5jaFBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJcmV0dXJuIG5ldyBUZXh0RWRpdG9yU2VsZWN0aW9uUGFydGljaXBhbnQoc2VsZWN0aW9uTWFuYWdlciwgKElUZXh0RWRpdG9yKSB3b3JrYmVuY2hQYXJ0KTsKLQkJfQotCQlpZiAod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIEpwYVN0cnVjdHVyZVZpZXcpIHsKLQkJCXJldHVybiBuZXcgSnBhU3RydWN0dXJlU2VsZWN0aW9uUGFydGljaXBhbnQoc2VsZWN0aW9uTWFuYWdlciwgKEpwYVN0cnVjdHVyZVZpZXcpIHdvcmtiZW5jaFBhcnQpOwotCQl9Ci0JCWlmICh3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSnBhRGV0YWlsc1ZpZXcpIHsKLQkJCXJldHVybiBuZXcgSnBhRGV0YWlsc1NlbGVjdGlvblBhcnRpY2lwYW50KChKcGFEZXRhaWxzVmlldykgd29ya2JlbmNoUGFydCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvR2VuZXJhbEpwYU1hcHBpbmdJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9HZW5lcmFsSnBhTWFwcGluZ0l0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmMwZTk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9HZW5lcmFsSnBhTWFwcGluZ0l0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLlBlcnNpc3RlbnRUeXBlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyYWxKcGFNYXBwaW5nSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLXsKLQlwdWJsaWMgSXRlbUxhYmVsUHJvdmlkZXIgYnVpbGRJdGVtTGFiZWxQcm92aWRlcigKLQkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNpc3RlbnRUeXBlSXRlbUxhYmVsUHJvdmlkZXIoKFBlcnNpc3RlbnRUeXBlKSBpdGVtLCBsYWJlbFByb3ZpZGVyKTsKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIoKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIGl0ZW0sIGxhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9KYXZhSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9KYXZhSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5NGIxOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvSmF2YUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkphdmFQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci17Ci0JcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCURlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlciA9IChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXI7Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgSnBhRmlsZSkgewotCQkJcmV0dXJuIG5ldyBSZXNvdXJjZU1vZGVsSXRlbUNvbnRlbnRQcm92aWRlcigoSnBhRmlsZSkgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCXJldHVybiBuZXcgSmF2YVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlcigoSmF2YVBlcnNpc3RlbnRUeXBlKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKLQkJfQotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtQ29udGVudFByb3ZpZGVyKChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0phdmFJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9KYXZhSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNzg0OTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0phdmFJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZTsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBleHRlbmRzIEdlbmVyYWxKcGFNYXBwaW5nSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci17Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvSmF2YVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0phdmFSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiNWNkNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvSmF2YVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYVN0cnVjdHVyZVByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhU3RydWN0dXJlUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF2YVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBnZXRUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0SXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEphdmFJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvT3JtSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9Pcm1JdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmFhZTE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9Pcm1JdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLk9ybVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5QZXJzaXN0ZW50QXR0cmlidXRlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotcHVibGljIGNsYXNzIE9ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci17Ci0JcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCURlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlciA9IChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXI7Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgSnBhRmlsZSkgewotCQkJcmV0dXJuIG5ldyBSZXNvdXJjZU1vZGVsSXRlbUNvbnRlbnRQcm92aWRlcigoSnBhRmlsZSkgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBFbnRpdHlNYXBwaW5ncykgewotCQkJcmV0dXJuIG5ldyBFbnRpdHlNYXBwaW5nc0l0ZW1Db250ZW50UHJvdmlkZXIoKEVudGl0eU1hcHBpbmdzKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKLQkJfQotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIE9ybVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlyZXR1cm4gbmV3IE9ybVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlcigoT3JtUGVyc2lzdGVudFR5cGUpIGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUNvbnRlbnRQcm92aWRlcigoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRW50aXR5TWFwcGluZ3NJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxPcm1QZXJzaXN0ZW50VHlwZT4KLQl7Ci0JCXB1YmxpYyBFbnRpdHlNYXBwaW5nc0l0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCQlzdXBlcihlbnRpdHlNYXBwaW5ncywgY29udGVudFByb3ZpZGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBFbnRpdHlNYXBwaW5ncyBnZXRNb2RlbCgpIHsKLQkJCXJldHVybiAoRW50aXR5TWFwcGluZ3MpIHN1cGVyLmdldE1vZGVsKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCS8vIEknZCBsaWtlIHRvIHJldHVybiB0aGUgcmVzb3VyY2UgbW9kZWwgaGVyZSwgYnV0IHRoYXQgaW52b2x2ZXMgYSBoZWZ0eSAKLQkJCS8vIEFQSSBjaGFuZ2UgLSB3ZSdsbCBzZWUgd2hhdCBoYXBwZW5zIHdpdGggdGhpcyBjb2RlIGZpcnN0Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxPcm1QZXJzaXN0ZW50VHlwZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPE9ybVBlcnNpc3RlbnRUeXBlPigKLQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFbnRpdHlNYXBwaW5ncywgT3JtUGVyc2lzdGVudFR5cGU+KAotCQkJCQlFbnRpdHlNYXBwaW5ncy5QRVJTSVNURU5UX1RZUEVTX0xJU1QsIGdldE1vZGVsKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE9ybVBlcnNpc3RlbnRUeXBlPiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGVzKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvT3JtSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvT3JtSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MjcyOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL09ybUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuRW50aXR5TWFwcGluZ3NJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIE9ybUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBleHRlbmRzIEdlbmVyYWxKcGFNYXBwaW5nSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci17Ci0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyIGJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBFbnRpdHlNYXBwaW5ncykgewotCQkJcmV0dXJuIG5ldyBFbnRpdHlNYXBwaW5nc0l0ZW1MYWJlbFByb3ZpZGVyKChFbnRpdHlNYXBwaW5ncykgaXRlbSwgbGFiZWxQcm92aWRlcik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoaXRlbSwgbGFiZWxQcm92aWRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGFhMzczLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9Pcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYVN0cnVjdHVyZVByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhU3RydWN0dXJlUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IE9ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0SXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IE9ybUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9QZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTAxMmZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9QZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkphckZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQlpbXBsZW1lbnRzIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotewotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQlPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCURlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlciA9IChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBKcGFGaWxlKSB7Ci0JCQlyZXR1cm4gbmV3IFJlc291cmNlTW9kZWxJdGVtQ29udGVudFByb3ZpZGVyKChKcGFGaWxlKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVuY2UpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyKChQZXJzaXN0ZW5jZSkgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlVW5pdCkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyKChQZXJzaXN0ZW5jZVVuaXQpIGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOwkKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgTWFwcGluZ0ZpbGVSZWYpIHsKLQkJCXJldHVybiBuZXcgTWFwcGluZ0ZpbGVSZWZJdGVtQ29udGVudFByb3ZpZGVyKChNYXBwaW5nRmlsZVJlZikgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDbGFzc1JlZikgewotCQkJcmV0dXJuIG5ldyBDbGFzc1JlZkl0ZW1Db250ZW50UHJvdmlkZXIoKENsYXNzUmVmKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEphckZpbGVSZWYpIHsKLQkJCXJldHVybiBuZXcgSmFyRmlsZVJlZkl0ZW1Db250ZW50UHJvdmlkZXIoKEphckZpbGVSZWYpIGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNpc3RlbmNlSXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8UGVyc2lzdGVuY2VVbml0PgotCXsKLQkJcHVibGljIFBlcnNpc3RlbmNlSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQlQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJCXN1cGVyKHBlcnNpc3RlbmNlLCBjb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBQZXJzaXN0ZW5jZSBnZXRNb2RlbCgpIHsKLQkJCXJldHVybiAoUGVyc2lzdGVuY2UpIHN1cGVyLmdldE1vZGVsKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCS8vIEknZCBsaWtlIHRvIHJldHVybiB0aGUgcmVzb3VyY2UgbW9kZWwgaGVyZSwgYnV0IHRoYXQgaW52b2x2ZXMgYSBoZWZ0eSAKLQkJCS8vIEFQSSBjaGFuZ2UgLSB3ZSdsbCBzZWUgd2hhdCBoYXBwZW5zIHdpdGggdGhpcyBjb2RlIGZpcnN0Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQ+KAotCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlLCBQZXJzaXN0ZW5jZVVuaXQ+KFBlcnNpc3RlbmNlLlBFUlNJU1RFTkNFX1VOSVRTX0xJU1QsIGdldE1vZGVsKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QucGVyc2lzdGVuY2VVbml0cygpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5wZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8SnBhU3RydWN0dXJlTm9kZT4KLQl7Ci0JCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCQlzdXBlcihwZXJzaXN0ZW5jZVVuaXQsIGNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGdldE1vZGVsKCkgewotCQkJcmV0dXJuIChQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldE1vZGVsKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgUGVyc2lzdGVuY2UgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIGdldE1vZGVsKCkuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8SnBhU3RydWN0dXJlTm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJTGlzdFZhbHVlTW9kZWw8TWFwcGluZ0ZpbGVSZWY+IHNwZWNpZmllZE1hcHBpbmdGaWxlTHZtID0gCi0JCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgTWFwcGluZ0ZpbGVSZWY+KAotCQkJCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9NQVBQSU5HX0ZJTEVfUkVGU19MSVNULAotCQkJCQkJZ2V0TW9kZWwoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpOwotCQkJCQl9Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQotCQkJTGlzdFZhbHVlTW9kZWw8TWFwcGluZ0ZpbGVSZWY+IGltcGxpZWRNYXBwaW5nRmlsZUN2bSA9IAotCQkJCW5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxNYXBwaW5nRmlsZVJlZj4oCi0JCQkJCW5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBNYXBwaW5nRmlsZVJlZj4oCi0JCQkJCQkJUGVyc2lzdGVuY2VVbml0LklNUExJRURfTUFQUElOR19GSUxFX1JFRl9QUk9QRVJUWSwKLQkJCQkJCQlnZXRNb2RlbCgpKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBidWlsZFZhbHVlXygpIHsKLQkJCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQlMaXN0VmFsdWVNb2RlbDxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NDdm0gPSAKLQkJCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBDbGFzc1JlZj4oCi0JCQkJCQlQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX0NMQVNTX1JFRlNfTElTVCwKLQkJCQkJCWdldE1vZGVsKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJCQkJfQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZENsYXNzUmVmc1NpemUoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQlMaXN0VmFsdWVNb2RlbDxDbGFzc1JlZj4gaW1wbGllZENsYXNzQ3ZtID0gCi0JCQkJbmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Q2xhc3NSZWY+KAotCQkJCQluZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBDbGFzc1JlZj4oCi0JCQkJCQkJUGVyc2lzdGVuY2VVbml0LklNUExJRURfQ0xBU1NfUkVGU19DT0xMRUNUSU9OLAotCQkJCQkJCWdldE1vZGVsKCkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPENsYXNzUmVmPiBpdGVyYXRvcl8oKSB7Ci0JCQkJCQkJcmV0dXJuIHN1YmplY3QuaW1wbGllZENsYXNzUmVmcygpOwotCQkJCQkJfQotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCQkJCXJldHVybiBzdWJqZWN0LmltcGxpZWRDbGFzc1JlZnNTaXplKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJTGlzdFZhbHVlTW9kZWw8SmFyRmlsZVJlZj4gamFyRmlsZUN2bSA9Ci0JCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgSmFyRmlsZVJlZj4oCi0JCQkJCQlQZXJzaXN0ZW5jZVVuaXQuSkFSX0ZJTEVfUkVGU19MSVNULAotCQkJCQkJZ2V0TW9kZWwoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKYXJGaWxlUmVmPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuamFyRmlsZVJlZnMoKTsKLQkJCQkJfQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmphckZpbGVSZWZzU2l6ZSgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4+KDQpOwotCQkJbGlzdC5hZGQoc3BlY2lmaWVkTWFwcGluZ0ZpbGVMdm0pOwotCQkJbGlzdC5hZGQoaW1wbGllZE1hcHBpbmdGaWxlQ3ZtKTsKLQkJCWxpc3QuYWRkKHNwZWNpZmllZENsYXNzQ3ZtKTsKLQkJCWxpc3QuYWRkKGltcGxpZWRDbGFzc0N2bSk7Ci0JCQlsaXN0LmFkZChqYXJGaWxlQ3ZtKTsKLQkJCQotCQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEpwYVN0cnVjdHVyZU5vZGU+KAotCQkJCW5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbAotCQkJCQk8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+LCBKcGFTdHJ1Y3R1cmVOb2RlPgotCQkJCQkJKGxpc3QpKTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE1hcHBpbmdGaWxlUmVmSXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8TWFwcGluZ0ZpbGVSZWY+Ci0JewotCQlwdWJsaWMgTWFwcGluZ0ZpbGVSZWZJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQkJc3VwZXIobWFwcGluZ0ZpbGVSZWYsIGNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgTWFwcGluZ0ZpbGVSZWYgZ2V0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gKE1hcHBpbmdGaWxlUmVmKSBzdXBlci5nZXRNb2RlbCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gZ2V0TW9kZWwoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xhc3NSZWZJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxDbGFzc1JlZj4KLQl7Ci0JCXB1YmxpYyBDbGFzc1JlZkl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJQ2xhc3NSZWYgY2xhc3NSZWYsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCQlzdXBlcihjbGFzc1JlZiwgY29udGVudFByb3ZpZGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDbGFzc1JlZiBnZXRNb2RlbCgpIHsKLQkJCXJldHVybiAoQ2xhc3NSZWYpIHN1cGVyLmdldE1vZGVsKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBnZXRNb2RlbCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBKYXJGaWxlUmVmSXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8SmFyRmlsZVJlZj4KLQl7Ci0JCXB1YmxpYyBKYXJGaWxlUmVmSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQlKYXJGaWxlUmVmIGphckZpbGVSZWYsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCQlzdXBlcihqYXJGaWxlUmVmLCBjb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEphckZpbGVSZWYgZ2V0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gKEphckZpbGVSZWYpIHN1cGVyLmdldE1vZGVsKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBnZXRNb2RlbCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUGVyc2lzdGVuY2VJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9QZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjEyOTk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9QZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkphckZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkNsYXNzUmVmSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuSmFyRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLk1hcHBpbmdGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuUGVyc2lzdGVuY2VJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5QZXJzaXN0ZW5jZVVuaXRJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLQlpbXBsZW1lbnRzIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotewotCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlciBidWlsZEl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXIoKFBlcnNpc3RlbmNlKSBpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlVW5pdCkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVuaXRJdGVtTGFiZWxQcm92aWRlcigoUGVyc2lzdGVuY2VVbml0KSBpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBNYXBwaW5nRmlsZVJlZikgewotCQkJcmV0dXJuIG5ldyBNYXBwaW5nRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyKChNYXBwaW5nRmlsZVJlZikgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ2xhc3NSZWYpIHsKLQkJCXJldHVybiBuZXcgQ2xhc3NSZWZJdGVtTGFiZWxQcm92aWRlcigoQ2xhc3NSZWYpIGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEphckZpbGVSZWYpIHsKLQkJCXJldHVybiBuZXcgSmFyRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyKChKYXJGaWxlUmVmKSBpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkMTk0NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcgotCWltcGxlbWVudHMgSnBhU3RydWN0dXJlUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFTdHJ1Y3R1cmVQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBnZXRJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUmVzb3VyY2VNb2RlbEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9SZXNvdXJjZU1vZGVsSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWRkNzI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9SZXNvdXJjZU1vZGVsSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotcHVibGljIGNsYXNzIFJlc291cmNlTW9kZWxJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxKcGFTdHJ1Y3R1cmVOb2RlPgotewotCXB1YmxpYyBSZXNvdXJjZU1vZGVsSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCUpwYUZpbGUganBhRmlsZSwgCi0JCQlEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQlzdXBlcihqcGFGaWxlLCBjb250ZW50UHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFGaWxlIGdldE1vZGVsKCkgewotCQlyZXR1cm4gKEpwYUZpbGUpIHN1cGVyLmdldE1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKcGFTdHJ1Y3R1cmVOb2RlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8SnBhRmlsZSwgSnBhU3RydWN0dXJlTm9kZT4oCi0JCQlidWlsZEpwYUZpbGVWYWx1ZU1vZGVsKCksIEpwYUZpbGUuUk9PVF9TVFJVQ1RVUkVfTk9ERVNfQ09MTEVDVElPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8SnBhU3RydWN0dXJlTm9kZT4gaXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnJvb3RTdHJ1Y3R1cmVOb2RlcygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEpwYUZpbGU+IGJ1aWxkSnBhRmlsZVZhbHVlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEpwYUZpbGU+KHRoaXMuZ2V0TW9kZWwoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDRhM2NkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIHByb3ZpZGVzIGEgbW9yZSBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlIHRvIHRoZSBpdGVtcyBhbmQKLSAqIHNlbGVjdGVkIGl0ZW0gaW4gYSBjb21iby4KLSAqIDxwPgotICogPGI+bGlzdEhvbGRlcjwvYj4gY29udGFpbnMgdGhlIGl0ZW1zIGluIHRoZSBjb21iby48YnI+Ci0gKiA8Yj5zZWxlY3RlZEl0ZW1Ib2xkZXI8L2I+IGNvbnRhaW5zIHRoZSBpdGVtcyBpbiAnbGlzdEhvbGRlcicgdGhhdCBhcmUKLSAqIHNlbGVjdGVkIGluIHRoZSBjb21iby4KLSAqCi0gKiBAcGFyYW0gPEU+IFRoZSB0eXBlIG9mIHRoZSBpdGVtcyBpbiA8Yj5saXN0SG9sZGVyPC9iPgotICogQHNlZSBDb21ib01vZGVsQWRhcHRlcgotICogQHNlZSBDQ29tYm9Nb2RlbEFkYXB0ZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxFPiB7Ci0KLQkvLyAqKioqKioqKioqIG1vZGVsICoqKioqKioqKioKLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBjb21ibydzIGNvbnRlbnRzIHdpdGgKLQkgKiB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Ib2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBjb21ibydzIHNlbGVjdGlvbiB3aXRoIHRoZQotCSAqIG1vZGVsIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgY29udmVydGVyIHRoYXQgY29udmVydHMgaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QKLQkgKiB0byBzdHJpbmdzIHRoYXQgY2FuIGJlIHB1dCBpbiB0aGUgY29tYm8uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXI7Ci0KLQkvLyAqKioqKioqKioqIFVJICoqKioqKioqKioKLQkvKioKLQkgKiBUaGUgY29tYm8gd2Uga2VlcCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm9Ib2xkZXIgY29tYm9Ib2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIG91ciBzZWxlY3Rpb24gbGlzdCBob2xkZXIKLQkgKiB3aXRoIHRoZSBjb21ibydzIHRleHQuCi0JICovCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIGNvbWJvTW9kaWZ5TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIG91ciBzZWxlY3Rpb24gbGlzdCBob2xkZXIKLQkgKiB3aXRoIHRoZSBjb21ibydzIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uTGlzdGVuZXIgY29tYm9TZWxlY3Rpb25MaXN0ZW5lcjsKLQotCS8qKgotCSAqIENsaWVudHMgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50cy4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdGVuZXJMaXN0PFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3Q7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gZG91YmxlIGNsaWNrIGV2ZW50cy4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdGVuZXJMaXN0PERvdWJsZUNsaWNrTGlzdGVuZXI+IGRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0OwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSBjb21ibwotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgY29tYm9EaXNwb3NlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyLCBzZWxlY3Rpb25zIGhvbGRlciwgY29tYm8sIGFuZAotCSAqIHN0cmluZyBjb252ZXJ0ZXIgYXJlIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyKAotCQkJTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCUNvbWJvSG9sZGVyIGNvbWJvSG9sZGVyLAotCQkJU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikKLQl7Ci0JCXN1cGVyKCk7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChsaXN0SG9sZGVyLCAgICAgICAgICJUaGUgaG9sZGVyIG9mIHRoZSBpdGVtcyIpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHNlbGVjdGVkSXRlbUhvbGRlciwgIlRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0gY2Fubm90IGJlIG51bGwiKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb21ib0hvbGRlciwgICAgICAgICJUaGUgaG9sZGVyIG9mIHRoZSBjb21ibyB3aWRnZXQgY2Fubm90IGJlIG51bGwiKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChzdHJpbmdDb252ZXJ0ZXIsICAgICJUaGUgc3RyaW5nIGNvbnZlcnRlciBjYW5ub3QgYmUgbnVsbCIpOwotCi0JCXRoaXMubGlzdEhvbGRlciAgICAgICAgID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIgPSBzZWxlY3RlZEl0ZW1Ib2xkZXI7Ci0JCXRoaXMuY29tYm9Ib2xkZXIgICAgICAgID0gY29tYm9Ib2xkZXI7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyICAgID0gc3RyaW5nQ29udmVydGVyOwotCi0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNlbGVjdGVkSXRlbUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNFZGl0YWJsZSgpKSB7Ci0JCQl0aGlzLmNvbWJvTW9kaWZ5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29tYm9Nb2RpZnlMaXN0ZW5lcigpOwotCQkJdGhpcy5jb21ib0hvbGRlci5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzLmNvbWJvTW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5jb21ib1NlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZENvbWJvU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5jb21ib1NlbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCi0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0ID0gdGhpcy5idWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdCgpOwotCQl0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0ID0gdGhpcy5idWlsZERvdWJsZUNsaWNrTGlzdGVuZXJMaXN0KCk7Ci0KLQkJdGhpcy5jb21ib0Rpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb21ib0Rpc3Bvc2VMaXN0ZW5lcigpOwotCQl0aGlzLmNvbWJvSG9sZGVyLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLmNvbWJvRGlzcG9zZUxpc3RlbmVyKTsKLQotCQl0aGlzLnN5bmNocm9uaXplQ29tYm8oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgYnVpbGRDb21ib01vZGlmeUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIudGhpcy5jb21ib1NlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb21ibyBtb2RpZnkgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZENvbWJvU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMuY29tYm9TZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29tYm8gbW9kaWZ5IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdGVuZXJMaXN0PERvdWJsZUNsaWNrTGlzdGVuZXI+IGJ1aWxkRG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgTGlzdGVuZXJMaXN0PERvdWJsZUNsaWNrTGlzdGVuZXI+KERvdWJsZUNsaWNrTGlzdGVuZXIuY2xhc3MpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0ZW5lckxpc3Q8U2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IExpc3RlbmVyTGlzdDxTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4oU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBEaXNwb3NlTGlzdGVuZXIgYnVpbGRDb21ib0Rpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMuY29tYm9EaXNwb3NlZChldmVudCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbWJvIGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplQ29tYm8oKSB7Ci0JCXRoaXMuc3luY2hyb25pemVDb21ib0l0ZW1zKCk7Ci0JCXRoaXMuc3luY2hyb25pemVDb21ib1NlbGVjdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdHJpbmcgY29udmVydGVyICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldFN0cmluZ0NvbnZlcnRlcihTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoc3RyaW5nQ29udmVydGVyLCAiVGhlIFN0cmluZ0NvbnZlcnRlciBjYW5ub3QgYmUgbnVsbCIpOwotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciA9IHN0cmluZ0NvbnZlcnRlcjsKLQkJdGhpcy5zeW5jaHJvbml6ZUNvbWJvKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlIHRoZSBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBpdGVtIHRvIGEKLQkgKiBzdHJpbmcgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydChFIGl0ZW0pIHsKLQkJcmV0dXJuIHRoaXMuc3RyaW5nQ29udmVydGVyLmNvbnZlcnRUb1N0cmluZyhpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBCcnV0ZSBmb3JjZSBzeW5jaHJvbml6YXRpb24gb2YgY29tYm8gd2l0aCB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZUNvbWJvSXRlbXMoKSB7Ci0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBsZW4gPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbbGVuXTsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbjsgaW5kZXgrKykgewotCQkJaXRlbXNbaW5kZXhdID0gdGhpcy5jb252ZXJ0KHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpKTsKLQkJfQotCQl0cnkgewotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKHRydWUpOwotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRJdGVtcyhpdGVtcyk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBjb3VudCA9IHRoaXMuY29tYm9Ib2xkZXIuZ2V0SXRlbUNvdW50KCk7Ci0JCWludCBpbmRleCA9IGV2ZW50LmdldEluZGV4KCk7Ci0KLQkJZm9yIChFIGl0ZW0gOiB0aGlzLmdldEl0ZW1zKGV2ZW50KSkgewotCQkJdGhpcy5jb21ib0hvbGRlci5hZGQodGhpcy5jb252ZXJ0KGl0ZW0pLCBpbmRleCsrKTsKLQkJfQotCi0JCS8vIFdoZW4gdGhlIGNvbWJvIGlzIHBvcHVsYXRlZCwgaXQncyBwb3NzaWJsZSB0aGUgc2VsZWN0aW9uIHdhcyBhbHJlYWR5Ci0JCS8vIHNldCBidXQgbm8gaXRlbXMgd2FzIGZvdW5kLCByZXN5bmMgdGhlIHNlbGVjdGVkIGl0ZW0KLQkJc3luY2hyb25pemVDb21ib1NlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmNvbWJvSG9sZGVyLnJlbW92ZShldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJbmRleCgpICsgZXZlbnQuZ2V0SXRlbXNTaXplKCkgLSAxKTsKLQkJdGhpcy5zeW5jaHJvbml6ZUNvbWJvU2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IHRhcmdldCA9IGV2ZW50LmdldFRhcmdldEluZGV4KCk7Ci0JCWludCBzb3VyY2UgPSBldmVudC5nZXRTb3VyY2VJbmRleCgpOwotCQlpbnQgbGVuID0gZXZlbnQuZ2V0TGVuZ3RoKCk7Ci0JCWludCBsb1N0YXJ0ID0gTWF0aC5taW4odGFyZ2V0LCBzb3VyY2UpOwotCQlpbnQgaGlTdGFydCA9IE1hdGgubWF4KHRhcmdldCwgc291cmNlKTsKLQkJLy8gbWFrZSBhIGNvcHkgb2YgdGhlIGFmZmVjdGVkIGl0ZW1zLi4uCi0JCVN0cmluZ1tdIHN1YkFycmF5ID0gQXJyYXlUb29scy5zdWJBcnJheSh0aGlzLmNvbWJvSG9sZGVyLmdldEl0ZW1zKCksIGxvU3RhcnQsIGhpU3RhcnQgKyBsZW4gLSBsb1N0YXJ0KTsKLQkJLy8gLi4ubW92ZSB0aGVtIGFyb3VuZC4uLgotCQlzdWJBcnJheSA9IEFycmF5VG9vbHMubW92ZShzdWJBcnJheSwgdGFyZ2V0IC0gbG9TdGFydCwgc291cmNlIC0gbG9TdGFydCwgbGVuKTsKLQkJLy8gLi4uYW5kIHRoZW4gcHV0IHRoZW0gYmFjawotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc3ViQXJyYXkubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnNldEl0ZW0obG9TdGFydCArIGluZGV4LCBzdWJBcnJheVtpbmRleF0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGluZGV4ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJaW50IHNlbGVjdGlvbkluZGV4ID0gdGhpcy5jb21ib0hvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkvL2ZpeGluZyBidWcgMjY5MTAwIGJ5IHNldHRpbmcgdGhlIHBvcHVsYXRpbmcgZmxhZyB0byB0cnVlCi0JCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyh0cnVlKTsKLQkJdHJ5IHsKLQkJCWZvciAoRSBpdGVtIDogdGhpcy5nZXROZXdJdGVtcyhldmVudCkpIHsKLQkJCQl0aGlzLmNvbWJvSG9sZGVyLnNldEl0ZW0oaW5kZXgrKywgdGhpcy5jb252ZXJ0KGl0ZW0pKTsKLQkJCX0KLQkJCWlmIChzZWxlY3Rpb25JbmRleCA9PSAwKSB7Ci0JCQkJdGhpcy5jb21ib0hvbGRlci5zZXRUZXh0KHRoaXMuY29tYm9Ib2xkZXIuZ2V0SXRlbXMoKVswXSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyh0cnVlKTsKLQkJdHJ5IHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIucmVtb3ZlQWxsKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplQ29tYm8oKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXROZXdJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlbGVjdGVkIGl0ZW1zICoqKioqKioqKioKLQotCXByb3RlY3RlZCBpbnQgaW5kZXhPZihFIGl0ZW0pIHsKLQkJaW50IGxlbmd0aCA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHsKLQkJCWlmICh2YWx1ZXNBcmVFcXVhbCh0aGlzLmxpc3RIb2xkZXIuZ2V0KGluZGV4KSwgaXRlbSkpIHsKLQkJCQlyZXR1cm4gaW5kZXg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplQ29tYm9TZWxlY3Rpb24oKSB7Ci0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRGlzcG9zZWQoKSB8fCB0aGlzLmNvbWJvSG9sZGVyLmlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFIHNlbGVjdGVkVmFsdWUgPSB0aGlzLnNlbGVjdGVkSXRlbUhvbGRlci5nZXRWYWx1ZSgpOwotCQlpZiAodGhpcy5jb21ib0hvbGRlci5nZXRUZXh0KCkuZXF1YWxzKHNlbGVjdGVkVmFsdWUpKSB7Ci0JCQkvL2lmIHRoZSBzZWxlY3Rpb24gaXMgc3RpbGwgdGhlIHNhbWUsIGRvbid0IHJlc2V0IGl0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKHRydWUpOwotCQl0cnkgewotCQkJdGhpcy5jb21ib0hvbGRlci5kZXNlbGVjdEFsbCgpOwotCQkJU3RyaW5nIHNlbGVjdGVkSXRlbSA9IHRoaXMuY29udmVydChzZWxlY3RlZFZhbHVlKTsKLQkJCWlmIChzZWxlY3RlZEl0ZW0gPT0gbnVsbCkgewotCQkJCXNlbGVjdGVkSXRlbSA9ICIiOwotCQkJfQotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRUZXh0KHNlbGVjdGVkSXRlbSk7Ci0JCQl0aGlzLm5vdGlmeUxpc3RlbmVycyhzZWxlY3RlZFZhbHVlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUNvbWJvU2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlcyBhcmUgZXF1YWwsIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bGwgY2hlY2tzLgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBhdHRyaWJ1dGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gdmFsdWVzQXJlRXF1YWwoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlpZiAoKHZhbHVlMSA9PSBudWxsKSAmJiAodmFsdWUyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsJLy8gYm90aCBhcmUgbnVsbAotCQl9Ci0JCWlmICgodmFsdWUxID09IG51bGwpIHx8ICh2YWx1ZTIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsJLy8gb25lIGlzIG51bGwgYnV0IHRoZSBvdGhlciBpcyBub3QKLQkJfQotCQlyZXR1cm4gdmFsdWUxLmVxdWFscyh2YWx1ZTIpOwotCX0KLQotCS8vICoqKioqKioqKiogY29tYm8gZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGNvbWJvU2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb21ib1NlbGVjdGlvbkNoYW5nZWQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJaWYgKCF0aGlzLmNvbWJvSG9sZGVyLmlzUG9wdWxhdGluZygpKSB7Ci0JCQlFIHNlbGVjdGVkSXRlbSA9IHRoaXMuc2VsZWN0ZWRJdGVtKCk7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0JCQl0cnkgewotCQkJCXRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKHNlbGVjdGVkSXRlbSk7Ci0JCQkJdGhpcy5ub3RpZnlMaXN0ZW5lcnMoc2VsZWN0ZWRJdGVtKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKEUgc2VsZWN0ZWRJdGVtKSB7Ci0JCWlmICh0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBzY0V2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZUV2ZW50PEU+KHRoaXMsIHNlbGVjdGVkSXRlbSk7Ci0JCQlmb3IgKFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IHNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIDogdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKHNjRXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEUgc2VsZWN0ZWRJdGVtKCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNFZGl0YWJsZSgpKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IHRoaXMuY29tYm9Ib2xkZXIuZ2V0VGV4dCgpOwotCi0JCQlpZiAodGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGluZGV4ID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQlFIGl0ZW0gPSB0aGlzLmxpc3RIb2xkZXIuZ2V0KGluZGV4KTsKLQkJCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmNvbnZlcnQoaXRlbSk7Ci0JCQkJaWYgKHZhbHVlc0FyZUVxdWFsKHRleHQsIHZhbHVlKSkgewotCQkJCQlyZXR1cm4gaXRlbTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFRPRE86IEZpbmQgYSB3YXkgdG8gcHJldmVudCB0aGlzIHR5cGUgY2FzdCAoaXQnbGwgd29yayBpZiBFIGlzCi0JCQkvLyBTdHJpbmcgYnV0IGl0IHdvbid0IHdvcmsgaWYgRSBpcyBzb21ldGhpbmcgZWxzZSksIG1heWJlIHVzZSBhCi0JCQkvLyBCaWRpU3RyaW5nQ29udmVydGVyIGluc3RlYWQgb2YgU3RyaW5nQ29udmVydGVyCi0JCQl0cnkgewotCQkJCXJldHVybiAoRSkgdGV4dDsKLQkJCX0KLQkJCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJaW50IGluZGV4ID0gdGhpcy5jb21ib0hvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpOwotCi0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmdldChpbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29tYm9Eb3VibGVDbGlja2VkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0LnNpemUoKSA+IDApIHsKLQkJCS8vIHRoZXJlIHNob3VsZCBiZSBvbmx5IGEgc2luZ2xlIGl0ZW0gc2VsZWN0ZWQgZHVyaW5nIGEgZG91YmxlLWNsaWNrKD8pCi0JCQlFIHNlbGVjdGlvbiA9IHRoaXMubGlzdEhvbGRlci5nZXQodGhpcy5jb21ib0hvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCURvdWJsZUNsaWNrRXZlbnQ8RT4gZGNFdmVudCA9IG5ldyBEb3VibGVDbGlja0V2ZW50PEU+KHRoaXMsIHNlbGVjdGlvbik7Ci0JCQlmb3IgKERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gZG91YmxlQ2xpY2tMaXN0ZW5lciA6IHRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlkb3VibGVDbGlja0xpc3RlbmVyLmRvdWJsZUNsaWNrKGRjRXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpc3Bvc2UgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgY29tYm9EaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIGNvbWJvIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy5jb21ib0hvbGRlci5yZW1vdmVEaXNwb3NlTGlzdGVuZXIodGhpcy5jb21ib0Rpc3Bvc2VMaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRWRpdGFibGUoKSkgewotCQkJdGhpcy5jb21ib0hvbGRlci5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzLmNvbWJvTW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5jb21ib0hvbGRlci5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmNvbWJvU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubGlzdEhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRvdWJsZSBjbGljayBzdXBwb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZERvdWJsZUNsaWNrTGlzdGVuZXIoRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihEb3VibGVDbGlja0xpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQkJdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50PEU+IGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERvdWJsZUNsaWNrRXZlbnQ8RT4gZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JCXByaXZhdGUgZmluYWwgRSBzZWxlY3Rpb247Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXByb3RlY3RlZCBEb3VibGVDbGlja0V2ZW50KEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8RT4gc291cmNlLCBFIHNlbGVjdGlvbikgewotCQkJc3VwZXIoc291cmNlKTsKLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPEU+IGdldFNvdXJjZSgpIHsKLQkJCXJldHVybiAoQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxFPikgc3VwZXIuZ2V0U291cmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRSBzZWxlY3Rpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zZWxlY3Rpb247Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VsZWN0aW9uIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQkJdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50PEU+IGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNlbGVjdGlvbkNoYW5nZUV2ZW50PEU+IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCQlwcml2YXRlIGZpbmFsIEUgc2VsZWN0ZWRJdGVtOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwcm90ZWN0ZWQgU2VsZWN0aW9uQ2hhbmdlRXZlbnQoQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxFPiBzb3VyY2UsIEUgc2VsZWN0ZWRJdGVtKSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQkJdGhpcy5zZWxlY3RlZEl0ZW0gPSBzZWxlY3RlZEl0ZW07Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPEU+IGdldFNvdXJjZSgpIHsKLQkJCXJldHVybiAoQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxFPikgc3VwZXIuZ2V0U291cmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRSBzZWxlY3RlZEl0ZW0oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW07Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIEludGVybmFsIG1lbWJlciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGhvbGRlciBpcyByZXF1aXJlZCBmb3Igc3VwcG9ydGluZyA8Y29kZT5Db21ibzwvY29kZT4gYW5kCi0JICogPGNvZGU+Q0NvbWJvPC9jb2RlPiB0cmFuc3BhcmVudGx5LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50ZXJmYWNlIENvbWJvSG9sZGVyIHsKLQkJdm9pZCBhZGQoU3RyaW5nIGl0ZW0sIGludCBpbmRleCk7Ci0JCXZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBkaXNwb3NlTGlzdGVuZXIpOwotCQl2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyKTsKLQkJdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXZvaWQgZGVzZWxlY3RBbGwoKTsKLQkJaW50IGdldEl0ZW1Db3VudCgpOwotCQlTdHJpbmdbXSBnZXRJdGVtcygpOwotCQlpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJU3RyaW5nIGdldFRleHQoKTsKLQkJYm9vbGVhbiBpc0Rpc3Bvc2VkKCk7Ci0JCWJvb2xlYW4gaXNFZGl0YWJsZSgpOwotCQlib29sZWFuIGlzUG9wdWxhdGluZygpOwotCQl2b2lkIHJlbW92ZURpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgZGlzcG9zZUxpc3RlbmVyKTsKLQkJdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcik7Ci0JCXZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl2b2lkIHNldEl0ZW0oaW50IGluZGV4LCBTdHJpbmcgaXRlbSk7Ci0JCXZvaWQgc2V0SXRlbXMoU3RyaW5nW10gaXRlbXMpOwotCQl2b2lkIHNldFBvcHVsYXRpbmcoYm9vbGVhbiBwb3B1bGF0aW5nKTsKLQkJdm9pZCBzZXRUZXh0KFN0cmluZyBpdGVtKTsKLQkJdm9pZCByZW1vdmUoaW50IHN0YXJ0LCBpbnQgZW5kKTsKLQkJdm9pZCByZW1vdmVBbGwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvQ29sdW1uQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0NvbHVtbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyMWVlMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvQ29sdW1uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgaXMgdXNlZCBieSB0aGUgdGFibGUgbW9kZWwgYWRhcHRlciB0byBjb252ZXJ0IGEgbW9kZWwgb2JqZWN0Ci0gKiBpbnRvIHRoZSBtb2RlbHMgdXNlZCBmb3IgZWFjaCBvZiB0aGUgY2VsbHMgZm9yIHRoZSBvYmplY3QncyBjb3JyZXNwb25kaW5nIHJvdwotICogaW4gdGhlIHRhYmxlLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbHVtbkFkYXB0ZXI8Vj4gewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsIG1vZGVscyBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogdGhhdCBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSByb3cgaW4gdGhlIHRhYmxlLgotCSAqLwotCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gY2VsbE1vZGVscyhWIHN1YmplY3QpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHRhYmxlLiBUeXBpY2FsbHkgdGhpcyBpcyBzdGF0aWMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgY29sdW1ucwotCSAqLwotCWludCBjb2x1bW5Db3VudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICoKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmV0cmlldmUgaXRzIGRpc3BsYXkgdGV4dAotCSAqIEByZXR1cm4gVGhlIGRpc3BsYXkgdGV4dCBvZiB0aGUgY29sdW1uCi0JICovCi0JU3RyaW5nIGNvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbHVtbiBpcyBlZGl0YWJsZS4gVHlwaWNhbGx5IHRoaXMgaXMgdGhlCi0JICogc2FtZSBmb3IgZXZlcnkgcm93LgotCSAqCi0JICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sdW1uIGZvciB3aGljaCB3ZSBkZXRlcm1pbmUgaWYKLQkgKiB0aGUgY29udGVudCBjYW4gYmUgbW9kaWZpZWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIGFsbG93IGVkaXRpbmcgb2YgdGhlIGNlbGwgYXQgdGhlIGdpdmVuCi0JICogY29sdW1uIGluZGV4OyA8Y29kZT5mYWxzZTwvY29kZT4gdG8ga2VlcCBpdCBub3QgZWRpdGFibGUKLQkgKi8KLS8vCWJvb2xlYW4gY29sdW1uSXNFZGl0YWJsZShpbnQgY29sdW1uSW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0NvbWJvTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkyNmMwNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgcHJvdmlkZXMgYSBtb3JlIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2UgdG8gdGhlIGl0ZW1zIGFuZAotICogc2VsZWN0ZWQgaXRlbSBpbiBhIDxjb2RlPkNvbWJvPC9jb2RlPi4KLSAqIDxwPgotICogPGI+bGlzdEhvbGRlcjwvYj4gY29udGFpbnMgdGhlIGl0ZW1zIGluIHRoZSA8Y29kZT5Db21ibzwvY29kZT4uPGJyPgotICogPGI+c2VsZWN0ZWRJdGVtSG9sZGVyPC9iPiBjb250YWlucyB0aGUgaXRlbXMgaW4gJ2xpc3RIb2xkZXInIHRoYXQgYXJlCi0gKiBzZWxlY3RlZCBpbiB0aGUgPGNvZGU+Q29tYm88L2NvZGU+LgotICoKLSAqIEBwYXJhbSA8RT4gVGhlIHR5cGUgb2YgdGhlIGl0ZW1zIGluIDxiPmxpc3RIb2xkZXI8L2I+Ci0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tYm9Nb2RlbEFkYXB0ZXI8RT4gZXh0ZW5kcyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPEU+IHsKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBjb21iby4KLQkgKiBVc2UgdGhlIGRlZmF1bHQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBjb21ibywgd2hpY2ggY2FsbHMgI3RvU3RyaW5nKCkgb24gdGhlCi0JICogaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29tYm9Nb2RlbEFkYXB0ZXI8VD4gYWRhcHQoCi0JCQlMaXN0VmFsdWVNb2RlbDxUPiBsaXN0SG9sZGVyLAotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJQ29tYm8gY29tYm8pCi0JewotCQlyZXR1cm4gYWRhcHQoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJY29tYm8sCi0JCQlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48VD5pbnN0YW5jZSgpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBjb21iby4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGNvbWJvLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbWJvTW9kZWxBZGFwdGVyPFQ+IGFkYXB0KAotCQkJTGlzdFZhbHVlTW9kZWw8VD4gbGlzdEhvbGRlciwKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCUNvbWJvIGNvbWJvLAotCQkJU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcikKLQl7Ci0JCXJldHVybiBuZXcgQ29tYm9Nb2RlbEFkYXB0ZXI8VD4oCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJY29tYm8sCi0JCQlzdHJpbmdDb252ZXJ0ZXIKLQkJKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyLCBzZWxlY3Rpb25zIGhvbGRlciwgY29tYm8sIGFuZAotCSAqIHN0cmluZyBjb252ZXJ0ZXIgYXJlIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBDb21ib01vZGVsQWRhcHRlcigKLQkJCUxpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlDb21ibyBjb21ibywKLQkJCVN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIpCi0JewotCQlzdXBlcihsaXN0SG9sZGVyLAotCQkgICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgIG5ldyBTV1RDb21ib0hvbGRlcihjb21ibyksCi0JCSAgICAgIHN0cmluZ0NvbnZlcnRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEludGVybmFsIG1lbWJlciAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTV1RDb21ib0hvbGRlciBpbXBsZW1lbnRzIENvbWJvSG9sZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBjb21ibzsKLQkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGVkaXRhYmxlOwotCQlwcml2YXRlIFN0cmluZyBzZWxlY3RlZEl0ZW07Ci0KLQkJU1dUQ29tYm9Ib2xkZXIoQ29tYm8gY29tYm8pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbWJvICAgID0gY29tYm87Ci0JCQl0aGlzLmVkaXRhYmxlID0gKGNvbWJvLmdldFN0eWxlKCkgJiBTV1QuUkVBRF9PTkxZKSA9PSAwOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKFN0cmluZyBpdGVtLCBpbnQgaW5kZXgpIHsKLQkJCXRoaXMuY29tYm8uYWRkKGl0ZW0sIGluZGV4KTsKLQotCQkJLy8gSXQgaXMgcG9zc2libGUgdGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHNldCBiZWZvcmUgdGhlIGNvbWJvIGlzIGJlaW5nCi0JCQkvLyBwb3B1bGF0ZWQsIHVwZGF0ZSB0aGUgc2VsZWN0ZWQgaXRlbSBpZiBpdCdzIG1hdGNoZXMgdGhlIGl0ZW0gYmVpbmcKLQkJCS8vIGFkZGVkCi0JCQlpZiAoKHRoaXMuc2VsZWN0ZWRJdGVtICE9IG51bGwpICYmIHRoaXMuc2VsZWN0ZWRJdGVtLmVxdWFscyhpdGVtKSkgewotCQkJCXRoaXMuc2V0VGV4dCh0aGlzLnNlbGVjdGVkSXRlbSk7Ci0JCQkJdGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBkaXNwb3NlTGlzdGVuZXIpIHsKLQkJCXRoaXMuY29tYm8uYWRkRGlzcG9zZUxpc3RlbmVyKGRpc3Bvc2VMaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcikgewotCQkJdGhpcy5jb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcikgewotCQkJdGhpcy5jb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkZXNlbGVjdEFsbCgpIHsKLQkJCXRoaXMuY29tYm8uZGVzZWxlY3RBbGwoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0SXRlbUNvdW50KCkgewotCQkJcmV0dXJuIHRoaXMuY29tYm8uZ2V0SXRlbUNvdW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0SXRlbXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21iby5nZXRJdGVtcygpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRTZWxlY3Rpb25JbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLmNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21iby5nZXRUZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQkJcmV0dXJuIHRoaXMuY29tYm8uaXNEaXNwb3NlZCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJCXJldHVybiB0aGlzLmVkaXRhYmxlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQb3B1bGF0aW5nKCkgewotCQkJcmV0dXJuIHRoaXMuY29tYm8uZ2V0RGF0YSgicG9wdWxhdGluZyIpID09IEJvb2xlYW4uVFJVRTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJCXRoaXMuY29tYm8ucmVtb3ZlKHN0YXJ0LCBlbmQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotCQkJdGhpcy5jb21iby5yZW1vdmVBbGwoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZURpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgZGlzcG9zZUxpc3RlbmVyKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcihkaXNwb3NlTGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIpIHsKLQkJCXRoaXMuY29tYm8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIpIHsKLQkJCXRoaXMuY29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0SXRlbShpbnQgaW5kZXgsIFN0cmluZyBpdGVtKSB7Ci0JCQl0aGlzLmNvbWJvLnNldEl0ZW0oaW5kZXgsIGl0ZW0pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0SXRlbXMoU3RyaW5nW10gaXRlbXMpIHsKLQkJCXRoaXMuY29tYm8uc2V0SXRlbXMoaXRlbXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0UG9wdWxhdGluZyhib29sZWFuIHBvcHVsYXRpbmcpIHsKLQkJCXRoaXMuY29tYm8uc2V0RGF0YSgicG9wdWxhdGluZyIsIEJvb2xlYW4udmFsdWVPZihwb3B1bGF0aW5nKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBpdGVtKSB7Ci0KLQkJCS8vIEtlZXAgdHJhY2sgb2YgdGhlIHNlbGVjdGVkIGl0ZW0gc2luY2UgaXQncyBwb3NzaWJsZSB0aGUgc2VsZWN0ZWQKLQkJCS8vIGl0ZW0gaXMgYmVmb3JlIHRoZSBjb21ibyBpcyBwb3B1bGF0ZWQKLQkJCWlmICh0aGlzLmNvbWJvLmdldEl0ZW1Db3VudCgpID09IDApIHsKLQkJCQl0aGlzLnNlbGVjdGVkSXRlbSA9IGl0ZW07Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7Ci0JCQl9Ci0JCQl0aGlzLmNvbWJvLnNldFRleHQoaXRlbSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvRGF0ZVRpbWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9EYXRlVGltZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTA0NDRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9EYXRlVGltZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EYXRlVGltZTsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIERhdGVUaW1lIHdpZGdldCBpbiBzeW5jaCB3aXRoCi0gKiBtb2RlbCBpbnRlZ2VycyBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMuICBIYXMgZGVmYXVsdCBob3VycywKLSAqIG1pbnV0ZXMgYW5kIHNlY29uZHMgb2YgMCB3aGljaCBjb3JyZXNwb25kcyB0byAxMjowMDowMCBBTS4gVGhpcyBtb2RlbAotICogYWRhcHRlciBjYW4gb25seSBiZSB1c2VkIGZvciBhIERhdGVUaW1lIHdpZGdldCB3aXRoIHRoZSBzdHlsZSBTV1QuVElNRQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBEYXRlVGltZU1vZGVsQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGhvdXJzIGludGVnZXIuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGhvdXJzSG9sZGVyOwotCQotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgbWludXRlcyBpbnRlZ2VyLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBtaW51dGVzSG9sZGVyOwotCQotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgc2Vjb25kcyBpbnRlZ2VyLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBzZWNvbmRzSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgZGF0ZVRpbWUncyBzZWxlY3Rpb24gc3RhdGUgd2l0aAotCSAqIHRoZSBtb2RlbCBob3VycyBpbnRlZ2VyLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGhvdXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQkKLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBkYXRlVGltZSdzIHNlbGVjdGlvbiBzdGF0ZSB3aXRoCi0JICogdGhlIG1vZGVsIG1pbnV0ZXMgaW50ZWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBtaW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQkKLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBkYXRlVGltZSdzIHNlbGVjdGlvbiBzdGF0ZSB3aXRoCi0JICogdGhlIG1vZGVsIHNlY29uZHMgaW50ZWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzZWNvbmRzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSBkYXRlVGltZSB3ZSBrZWVwIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCBpbnRlZ2Vycy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGF0ZVRpbWUgZGF0ZVRpbWU7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIG91ciBzZWxlY3Rpb24gbnVtYmVyIGhvbGRlcgotCSAqIHdpdGggdGhlIHNwaW5uZXIncyB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2VsZWN0aW9uTGlzdGVuZXIgZGF0ZVRpbWVTZWxlY3Rpb25MaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgZGF0ZVRpbWUKLQkgKiBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGlzcG9zZUxpc3RlbmVyIGRhdGVUaW1lRGlzcG9zZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhpcyBsb2NrIGlzIHVzZWQgdG8gcHJldmVudCB0aGUgbGlzdGVuZXJzIHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHZhbHVlCi0JICogY2hhbmdlcyBmcm9tIHRoZSBzcGlubmVyIG9yIGZyb20gdGhlIGhvbGRlci4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbG9ja2VkOwotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIG1vZGVsIGludGVnZXIgaG9sZGVycyB0byB0aGUgc3BlY2lmaWVkIGRhdGVUaW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGF0ZVRpbWVNb2RlbEFkYXB0ZXIgYWRhcHQoCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBob3Vyc0hvbGRlciwKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG1pbnV0ZXNIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBzZWNvbmRzSG9sZGVyLAotCQkJRGF0ZVRpbWUgZGF0ZVRpbWUpCi0JewotCQlyZXR1cm4gbmV3IERhdGVUaW1lTW9kZWxBZGFwdGVyKGhvdXJzSG9sZGVyLCBtaW51dGVzSG9sZGVyLCBzZWNvbmRzSG9sZGVyLCBkYXRlVGltZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBob3Vyc0hvbGRlciwgbWludXRlc0hvbGRlciwgc2Vjb25kc0hvbGRlciwgYW5kIGRhdGVUaW1lIGFyZSByZXF1aXJlZAotCSAqLwotCXByb3RlY3RlZCBEYXRlVGltZU1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBob3Vyc0hvbGRlciwKLQkJCQkJCQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG1pbnV0ZXNIb2xkZXIsCi0JCQkJCQkJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBzZWNvbmRzSG9sZGVyLAotCQkJCQkJCQkJRGF0ZVRpbWUgZGF0ZVRpbWUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChob3Vyc0hvbGRlciA9PSBudWxsKSAKLQkJCXx8IChtaW51dGVzSG9sZGVyID09IG51bGwpIAotCQkJfHwgKHNlY29uZHNIb2xkZXIgPT0gbnVsbCkgCi0JCQl8fCAoZGF0ZVRpbWUgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuaG91cnNIb2xkZXIgPSBob3Vyc0hvbGRlcjsKLQkJdGhpcy5taW51dGVzSG9sZGVyID0gbWludXRlc0hvbGRlcjsKLQkJdGhpcy5zZWNvbmRzSG9sZGVyID0gc2Vjb25kc0hvbGRlcjsKLQkJdGhpcy5kYXRlVGltZSA9IGRhdGVUaW1lOwotCi0JCXRoaXMuaG91cnNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEhvdXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmhvdXJzSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmhvdXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5taW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRNaW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLm1pbnV0ZXNIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubWludXRlc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuc2Vjb25kc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2Vjb25kc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zZWNvbmRzSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNlY29uZHNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJCi0JCXRoaXMuZGF0ZVRpbWVTZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGREYXRlVGltZVNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuZGF0ZVRpbWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5kYXRlVGltZVNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQl0aGlzLmRhdGVUaW1lRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZERhdGVUaW1lRGlzcG9zZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZGF0ZVRpbWUuYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMuZGF0ZVRpbWVEaXNwb3NlTGlzdGVuZXIpOwotCi0JCXRoaXMudXBkYXRlRGF0ZVRpbWVIb3Vycyhob3Vyc0hvbGRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy51cGRhdGVEYXRlVGltZU1pbnV0ZXMobWludXRlc0hvbGRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy51cGRhdGVEYXRlVGltZVNlY29uZHMoc2Vjb25kc0hvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRIb3Vyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZEhvdXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRIb3Vyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCURhdGVUaW1lTW9kZWxBZGFwdGVyLnRoaXMuaG91cnNDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImRhdGVUaW1lIGhvdXJzIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRNaW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTWludXRlc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTWludXRlc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCURhdGVUaW1lTW9kZWxBZGFwdGVyLnRoaXMubWludXRlc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiZGF0ZVRpbWUgbWludXRlcyBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2Vjb25kc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFNlY29uZHNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlY29uZHNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlEYXRlVGltZU1vZGVsQWRhcHRlci50aGlzLnNlY29uZHNDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImRhdGVUaW1lIHNlY29uZHMgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZERhdGVUaW1lU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJRGF0ZVRpbWVNb2RlbEFkYXB0ZXIudGhpcy5kYXRlVGltZVNlbGVjdGVkKGUpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewkJCQkKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiZGF0ZVRpbWUgc2VsZWN0aW9uIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkRGF0ZVRpbWVEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJRGF0ZVRpbWVNb2RlbEFkYXB0ZXIudGhpcy5kYXRlVGltZURpc3Bvc2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImRhdGVUaW1lIGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb2RlbCBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaG91cnNDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCF0aGlzLmxvY2tlZCkgewotCQkJdGhpcy51cGRhdGVEYXRlVGltZUhvdXJzKChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1pbnV0ZXNDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCF0aGlzLmxvY2tlZCkgewotCQkJdGhpcy51cGRhdGVEYXRlVGltZU1pbnV0ZXMoKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2Vjb25kc0NoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoIXRoaXMubG9ja2VkKSB7Ci0JCQl0aGlzLnVwZGF0ZURhdGVUaW1lU2Vjb25kcygoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGRhdGVUaW1lIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBkYXRlVGltZVNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICghdGhpcy5sb2NrZWQpIHsKLQkJCXRoaXMubG9ja2VkID0gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJLy90b28gYmFkIHRoZXkgZGlkbid0IHNwbGl0IHRoZSBldmVudCB1cAotCQkJCWhvdXJzU2VsZWN0ZWQoKTsKLQkJCQltaW51dGVzU2VsZWN0ZWQoKTsKLQkJCQlzZWNvbmRzU2VsZWN0ZWQoKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXRoaXMubG9ja2VkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaG91cnNTZWxlY3RlZCgpIHsKLQkJSW50ZWdlciBob3VycyA9IG51bGw7Ci0JCWlmICh0aGlzLmRhdGVUaW1lLmdldEhvdXJzKCkgIT0gMCkgewotCQkJaG91cnMgPSBJbnRlZ2VyLnZhbHVlT2YodGhpcy5kYXRlVGltZS5nZXRIb3VycygpKTsKLQkJfQotCQl0aGlzLmhvdXJzSG9sZGVyLnNldFZhbHVlKGhvdXJzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbWludXRlc1NlbGVjdGVkKCkgewotCQlJbnRlZ2VyIG1pbnV0ZXMgPSBudWxsOwotCQlpZiAodGhpcy5kYXRlVGltZS5nZXRNaW51dGVzKCkgIT0gMCkgewotCQkJbWludXRlcyA9IEludGVnZXIudmFsdWVPZih0aGlzLmRhdGVUaW1lLmdldE1pbnV0ZXMoKSk7Ci0JCX0KLQkJdGhpcy5taW51dGVzSG9sZGVyLnNldFZhbHVlKG1pbnV0ZXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZWNvbmRzU2VsZWN0ZWQoKSB7Ci0JCUludGVnZXIgc2Vjb25kcyA9IG51bGw7Ci0JCWlmICh0aGlzLmRhdGVUaW1lLmdldFNlY29uZHMoKSAhPSAwKSB7Ci0JCQlzZWNvbmRzID0gSW50ZWdlci52YWx1ZU9mKHRoaXMuZGF0ZVRpbWUuZ2V0U2Vjb25kcygpKTsKLQkJfQotCQl0aGlzLnNlY29uZHNIb2xkZXIuc2V0VmFsdWUoc2Vjb25kcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGF0ZVRpbWVEaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIGRhdGVUaW1lIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy5kYXRlVGltZS5yZW1vdmVEaXNwb3NlTGlzdGVuZXIodGhpcy5kYXRlVGltZURpc3Bvc2VMaXN0ZW5lcik7Ci0JCXRoaXMuZGF0ZVRpbWUucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5kYXRlVGltZVNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdGhpcy5ob3Vyc0hvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ob3Vyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm1pbnV0ZXNIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubWludXRlc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNlY29uZHNIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2Vjb25kc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogdXBkYXRlICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURhdGVUaW1lSG91cnMoSW50ZWdlciBob3VycykgewotCQlpZiAodGhpcy5kYXRlVGltZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoaG91cnMgPT0gbnVsbCkgewotCQkJaG91cnMgPSBJbnRlZ2VyLnZhbHVlT2YoMCk7Ly9UT0RPIGRlZmF1bHRIb3VycwotCQl9Ci0JCXRoaXMubG9ja2VkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXRoaXMuZGF0ZVRpbWUuc2V0SG91cnMoaG91cnMuaW50VmFsdWUoKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0aGlzLmxvY2tlZCA9IGZhbHNlOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURhdGVUaW1lTWludXRlcyhJbnRlZ2VyIG1pbnV0ZXMpIHsKLQkJaWYgKHRoaXMuZGF0ZVRpbWUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG1pbnV0ZXMgPT0gbnVsbCkgewotCQkJbWludXRlcyA9IEludGVnZXIudmFsdWVPZigwKTsvL1RPRE8gZGVmYXVsdE1pbnV0ZXMKLQkJfQotCQl0aGlzLmxvY2tlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQl0aGlzLmRhdGVUaW1lLnNldE1pbnV0ZXMobWludXRlcy5pbnRWYWx1ZSgpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRoaXMubG9ja2VkID0gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGF0ZVRpbWVTZWNvbmRzKEludGVnZXIgc2Vjb25kcykgewotCQlpZiAodGhpcy5kYXRlVGltZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc2Vjb25kcyA9PSBudWxsKSB7Ci0JCQlzZWNvbmRzID0gSW50ZWdlci52YWx1ZU9mKDApOy8vVE9ETyBkZWZhdWx0U2Vjb25kcwotCQl9Ci0JCXRoaXMubG9ja2VkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXRoaXMuZGF0ZVRpbWUuc2V0U2Vjb25kcyhzZWNvbmRzLmludFZhbHVlKCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmhvdXJzSG9sZGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L1NwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY5OTdlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotCi0vKioKLSAqCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNwaW5uZXJNb2RlbEFkYXB0ZXIgewotCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBzcGlubmVyJ3MgY29udGVudHMgd2l0aAotCSAqIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgc3Bpbm5lciB3ZSBrZWVwIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCBzdHJpbmcuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNwaW5uZXIgc3Bpbm5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgb3VyIHNlbGVjdGlvbiBudW1iZXIgaG9sZGVyCi0JICogd2l0aCB0aGUgc3Bpbm5lcidzIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBNb2RpZnlMaXN0ZW5lciBzcGlubmVyTW9kaWZ5TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHN0dWZmIHdoZW4gdGhlIHNwaW5uZXIKLQkgKiBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGlzcG9zZUxpc3RlbmVyIHNwaW5uZXJEaXNwb3NlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgc2hvd24gd2hlbiB0aGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBpbnQgZGVmYXVsdFZhbHVlOwotCi0JLyoqCi0JICogVGhpcyBsb2NrIGlzIHVzZWQgdG8gcHJldmVudCB0aGUgbGlzdGVuZXJzIHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHZhbHVlCi0JICogY2hhbmdlcyBmcm9tIHRoZSBzcGlubmVyIG9yIGZyb20gdGhlIGhvbGRlci4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbG9ja2VkOwotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBzcGlubmVyLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgc3Bpbm5lci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNwaW5uZXJNb2RlbEFkYXB0ZXIgYWRhcHQoCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIsCi0JCQlTcGlubmVyIHNwaW5uZXIsCi0JCQlpbnQgZGVmYXVsdFZhbHVlKQotCXsKLQkJcmV0dXJuIG5ldyBTcGlubmVyTW9kZWxBZGFwdGVyKG51bWJlckhvbGRlciwgc3Bpbm5lciwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyLCBzZWxlY3Rpb25zIGhvbGRlciwgbGlzdCBib3gsIGFuZAotCSAqIHN0cmluZyBjb252ZXJ0ZXIgYXJlIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGlubmVyIHNwaW5uZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcigpOwotCQlpZiAoKG51bWJlckhvbGRlciA9PSBudWxsKSB8fCAoc3Bpbm5lciA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5udW1iZXJIb2xkZXIgPSBudW1iZXJIb2xkZXI7Ci0JCXRoaXMuc3Bpbm5lciA9IHNwaW5uZXI7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMubnVtYmVySG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuc3Bpbm5lck1vZGlmeUxpc3RlbmVyID0gdGhpcy5idWlsZFNwaW5uZXJNb2RpZnlMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXIuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcy5zcGlubmVyTW9kaWZ5TGlzdGVuZXIpOwotCi0JCXRoaXMuc3Bpbm5lckRpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTcGlubmVyRGlzcG9zZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc3Bpbm5lci5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy5zcGlubmVyRGlzcG9zZUxpc3RlbmVyKTsKLQotCQl0aGlzLnVwZGF0ZVNwaW5uZXIobnVtYmVySG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLnZhbHVlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzcGlubmVyIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgYnVpbGRTcGlubmVyTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMuc3Bpbm5lck1vZGlmaWVkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic3Bpbm5lciBzZWxlY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBEaXNwb3NlTGlzdGVuZXIgYnVpbGRTcGlubmVyRGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXIudGhpcy5zcGlubmVyRGlzcG9zZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic3Bpbm5lciBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbW9kZWwgZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICghdGhpcy5sb2NrZWQpIHsKLQkJCXRoaXMudXBkYXRlU3Bpbm5lcigoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3Bpbm5lciBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgc3Bpbm5lck1vZGlmaWVkKE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCWlmICghdGhpcy5sb2NrZWQpIHsKLQkJCXRoaXMubG9ja2VkID0gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5udW1iZXJIb2xkZXIuc2V0VmFsdWUodGhpcy5zcGlubmVyLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXRoaXMubG9ja2VkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzcGlubmVyRGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRoZSBzcGlubmVyIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy5zcGlubmVyLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLnNwaW5uZXJEaXNwb3NlTGlzdGVuZXIpOwotCQl0aGlzLnNwaW5uZXIucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcy5zcGlubmVyTW9kaWZ5TGlzdGVuZXIpOwotCQl0aGlzLm51bWJlckhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHVwZGF0ZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGlubmVyKEludGVnZXIgdmFsdWUpIHsKLQkJaWYgKHRoaXMuc3Bpbm5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyB0aGUgbW9kZWwgY2FuIGJlIG51bGwsIGJ1dCB0aGUgc3Bpbm5lciBjYW5ub3QKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gZGVmYXVsdFZhbHVlOwotCQl9Ci0JCXRoaXMubG9ja2VkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXRoaXMuc3Bpbm5lci5zZXRTZWxlY3Rpb24odmFsdWUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm51bWJlckhvbGRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L1RhYmxlSXRlbU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L1RhYmxlSXRlbU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTE3NzEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9UYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIHRhYmxlIGl0ZW0gaW4gc3luY2ggd2l0aCB0aGUgcHJvcGVydGllcyBvZgotICogYSBtb2RlbC4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGFibGVJdGVtTW9kZWxBZGFwdGVyIHsKLQotCS8qKiBUaGUgdGFibGUgaXRlbSB3ZSBzeW5jaHJvbml6ZSB3aXRoIHRoZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGFibGVJdGVtIHRhYmxlSXRlbTsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgYnV0dG9uCi0JICogaXMgZGlzcG9zZWQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIERpc3Bvc2VMaXN0ZW5lciB0YWJsZUl0ZW1EaXNwb3NlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDbGllbnQtc3VwcGxpZWQgYWRhcHRlciB0aGF0IHByb3ZpZGVzIHdpdGggdGhlIHZhcmlvdXMgY29sdW1uIHNldHRpbmdzIGFuZAotCSAqIGNvbnZlcnRzIHRoZSBvYmplY3RzIGluIHRoZSBMVk0gaW50byBhbiBhcnJheSBvZiBjZWxsIG1vZGVscy4KLQkgKi8KLQlwcml2YXRlIENvbHVtbkFkYXB0ZXI8T2JqZWN0PiBjb2x1bW5BZGFwdGVyOwotCi0JLyoqCi0JICogVGhlIHZhbHVlIG1vZGVscyB1c2VkIHRvIGxpc3RlbiB0byBlYWNoIHByb3BlcnR5IHRoYXQgYXJlIGRpc3BsYXkgYnkgdGhlCi0JICogdGFibGUgaXRlbS4KLQkgKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gdmFsdWVIb2xkZXJzOwotCi0JLyoqCi0JICogVGhlIGxpc3Qgb2YgPGNvZGU+UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjwvY29kZT5zIHVzZWQgdG8gYmUgbm90aWZpZWQgd2hlbgotCSAqIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBtb2RlbCBiZWluZyBkaXNwbGF5IGludG8gYSByb3cgY2hhbmdlLgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzOwotCi0JLyoqCi0JICogVGhlIGxhYmVsIHVzZWQgdG8gZm9ybWF0IHRoZSBvYmplY3RzIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICovCi0JcHJpdmF0ZSBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgYm9vbGVhbiB0byB0aGUgc3BlY2lmaWVkIGJ1dHRvbi4KLQkgKiBJZiB0aGUgYm9vbGVhbiBpcyBudWxsLCB0aGUgYnV0dG9uJ3MgdmFsdWUgd2lsbCBiZSAidW5zZWxlY3RlZCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIgYWRhcHQoVGFibGVJdGVtIHRhYmxlSXRlbSwgQ29sdW1uQWRhcHRlcjw/PiBjb2x1bW5BZGFwdGVyLCBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIodGFibGVJdGVtLCBjb2x1bW5BZGFwdGVyLCBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGFuZCBidXR0b24gYXJlIHJlcXVpcmVkLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIoVGFibGVJdGVtIHRhYmxlSXRlbSwgQ29sdW1uQWRhcHRlcjw/PiBjb2x1bW5BZGFwdGVyLCBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHRhYmxlSXRlbSA9PSBudWxsIHx8IGNvbHVtbkFkYXB0ZXIgPT0gbnVsbCB8fCBsYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudGFibGVJdGVtID0gdGFibGVJdGVtOwotCQl0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotCQl0aGlzLmNvbHVtbkFkYXB0ZXIgPSAoQ29sdW1uQWRhcHRlcjxPYmplY3Q+KSBjb2x1bW5BZGFwdGVyOwotCi0JCXRoaXMudGFibGVJdGVtRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZFRhYmxlSXRlbURpc3Bvc2VMaXN0ZW5lcigpOwotCQl0aGlzLnRhYmxlSXRlbS5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy50YWJsZUl0ZW1EaXNwb3NlTGlzdGVuZXIpOwotCi0JCXRoaXMudmFsdWVIb2xkZXJzID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNlbGxNb2RlbHModGFibGVJdGVtLmdldERhdGEoKSk7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKTsKLQotCQlmb3IgKGludCBpbmRleCA9IHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5Db3VudCgpOyAtLWluZGV4ID49IDA7ICkgewotCQkJdGFibGVJdGVtQ2hhbmdlZChpbmRleCwgdGFibGVJdGVtLmdldERhdGEoKSwgZmFsc2UpOwotCQkJdmFsdWVIb2xkZXJzW2luZGV4XS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnNbaW5kZXhdKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gbGlzdGVuZXJzID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbY29sdW1uQWRhcHRlci5jb2x1bW5Db3VudCgpXTsKLQkJZm9yIChpbnQgaW5kZXggPSBsaXN0ZW5lcnMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJbGlzdGVuZXJzW2luZGV4XSA9IGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3RlbmVyczsKLQl9Ci0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigKLQkJCXRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXyhpbmRleCkKLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IFRhYmxlSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBEaXNwb3NlTGlzdGVuZXIgYnVpbGRUYWJsZUl0ZW1EaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVJdGVtTW9kZWxBZGFwdGVyLnRoaXMudGFibGVJdGVtRGlzcG9zZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVGFibGVJdGVtIGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZUl0ZW1DaGFuZ2VkKGludCBpbmRleCwgT2JqZWN0IHN1YmplY3QsIGJvb2xlYW4gcmV2YWxpZGF0ZSkgewotCi0JCWlmICghdGhpcy50YWJsZUl0ZW0uaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnVwZGF0ZVRhYmxlSXRlbVRleHQoaW5kZXgsIHN1YmplY3QpOwotCQkJdGhpcy51cGRhdGVUYWJsZUl0ZW1JbWFnZShpbmRleCwgc3ViamVjdCk7Ci0KLQkJCWlmIChyZXZhbGlkYXRlKSB7Ci0JCQkJdGhpcy5sYXlvdXRUYWJsZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhYmxlSXRlbVRleHQoaW50IGluZGV4LCBPYmplY3Qgc3ViamVjdCkgewotCQlTdHJpbmcgdGV4dCA9IHRoaXMubGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0KHN1YmplY3QsIGluZGV4KTsKLQkJaWYgKHRleHQgPT0gbnVsbCkgewotCQkJdGV4dCA9ICIiOwotCQl9Ci0JCXRoaXMudGFibGVJdGVtLnNldFRleHQoaW5kZXgsIHRleHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVUYWJsZUl0ZW1JbWFnZShpbnQgaW5kZXgsIE9iamVjdCBzdWJqZWN0KSB7Ci0JCUltYWdlIGltYWdlID0gdGhpcy5sYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlKHN1YmplY3QsIGluZGV4KTsKLQkJdGhpcy50YWJsZUl0ZW0uc2V0SW1hZ2UoaW5kZXgsIGltYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGF5b3V0VGFibGUoKSB7Ci0JCS8vIFJlZnJlc2ggdGhlIHRhYmxlIGluIG9yZGVyIHRvIHNob3cgdGhlIHNjcm9sbGJhciBpZiByZXF1aXJlZAotCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGhpcy50YWJsZUl0ZW0uZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7Ci0JCWNvbnRhaW5lci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQljb250YWluZXIubGF5b3V0KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBkaXNwb3NlICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHRhYmxlSXRlbURpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkvLyB0aGUgYnV0dG9uIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy50YWJsZUl0ZW0ucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMudGFibGVJdGVtRGlzcG9zZUxpc3RlbmVyKTsKLQotCQlmb3IgKGludCBpbmRleCA9IHZhbHVlSG9sZGVycy5sZW5ndGg7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQl2YWx1ZUhvbGRlcnNbaW5kZXhdLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyc1tpbmRleF0pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi0gICBwcml2YXRlIGNsYXNzIFRhYmxlSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQotICAgCXByaXZhdGUgZmluYWwgaW50IGluZGV4OwotCi0gICAJVGFibGVJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihpbnQgaW5kZXgpIHsKLSAgIAkJc3VwZXIoKTsKLSAgIAkJdGhpcy5pbmRleCA9IGluZGV4OwotICAgCX0KLQotICAgCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAJCWlmICghdGFibGVJdGVtLmlzRGlzcG9zZWQoKSkgewotICAgCQkJVGFibGUgdGFibGUgPSB0YWJsZUl0ZW0uZ2V0UGFyZW50KCk7Ci0gICAJCQl0YWJsZUl0ZW1DaGFuZ2VkKGluZGV4LCB0YWJsZUl0ZW0uZ2V0RGF0YSgpLCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpID09IDApOwotICAgCQl9Ci0gICAJfQotICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9UYWJsZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L1RhYmxlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMzA2ODkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L1RhYmxlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgcHJvdmlkZXMgYSBtb3JlIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2UgdG8gdGhlIGl0ZW1zIGFuZAotICogc2VsZWN0ZWQgaXRlbXMgaW4gYSB0YWJsZS4KLSAqICdsaXN0SG9sZGVyJyBjb250YWlucyB0aGUgZGF0YSBvZiBhIHNpbmdsZSBjb2x1bW4gaW4gdGhlIGNvbHVtbi4KLSAqICdzZWxlY3RlZEl0ZW1zSG9sZGVyJyBjb250YWlucyB0aGUgZGF0YSBvZiBhIHNpbmdsZSBjb2x1bW4gaW4gJ2xpc3RIb2xkZXInCi0gKiB0aGF0IGFyZSBzZWxlY3RlZCBpbiB0aGUgdGFibGUuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRhYmxlTW9kZWxBZGFwdGVyPEU+IHsKLQotCS8vICoqKioqKioqKiogbW9kZWwgKioqKioqKioqKgotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIHRhYmxlJ3MgY29udGVudHMgd2l0aAotCSAqIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBzZWxlY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1zSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgdGFibGUncyBzZWxlY3Rpb24gd2l0aAotCSAqIHRoZSBtb2RlbCBzZWxlY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgc2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIHRhYmxlIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRhYmxlIHRhYmxlOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0aW9uIGxpc3QgaG9sZGVyCi0JICogd2l0aCB0aGUgdGFibGUncyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNlbGVjdGlvbkxpc3RlbmVyIHRhYmxlU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gc2VsZWN0aW9uIGNoYW5nZSBldmVudHMuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdDxTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0OwotCi0JLyoqCi0JICogQ2xpZW50cyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIGRvdWJsZSBjbGljayBldmVudHMuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdDxEb3VibGVDbGlja0xpc3RlbmVyPiBkb3VibGVDbGlja0xpc3RlbmVyTGlzdDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgdGFibGUKLQkgKiBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGlzcG9zZUxpc3RlbmVyIHRhYmxlRGlzcG9zZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhpcyBsYWJlbCBwcm92aWRlciBpcyByZXNwb25zaWJsZSB0byBjb252ZXJ0IGEgcHJvcGVydHkgYXQgYSBjb2x1bW4gaW5kZXgKLQkgKiB0byBhIHN0cmluZyB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhlIGNvbHVtbiBhZGFwdGVyIGlzIHJlc3BvbnNpYmxlIHRvIHJldHVybiB0aGUgY291bnQgb2YgY29sdW1ucyBhbmQgdG8KLQkgKiBjcmVhdGUgdGhlIHZhbHVlIGhvbGRlcnMgZm9yIGFsbCB0aGUgcHJvcGVydGllcy4KLQkgKi8KLQlwcml2YXRlIENvbHVtbkFkYXB0ZXI8RT4gY29sdW1uQWRhcHRlcjsKLQotCS8qKgotCSAqIEtlZXBzIHRyYWNrIG9mIHRoZSA8Y29kZT5UYWJsZUl0ZW1Nb2RlbEFkYXB0ZXI8L2NvZGU+cyB0aGF0IHdlcmUgY3JlYXRlZAotCSAqIGZvciBlYWNoIGl0ZW0gb2YgdGhlIGxpc3QgaG9sZGVyLgotCSAqLwotCXByaXZhdGUgTGlzdDxUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXI+IHRhYmxlSXRlbU1vZGVsQWRhcHRlcnM7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCB0YWJsZS4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFRhYmxlTW9kZWxBZGFwdGVyPFQ+IGFkYXB0KAotCQkJTGlzdFZhbHVlTW9kZWw8VD4gbGlzdEhvbGRlciwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlUYWJsZSB0YWJsZSwKLQkJCUNvbHVtbkFkYXB0ZXI8VD4gY29sdW1uQWRhcHRlciwKLQkJCUlUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikKLQl7Ci0JCXJldHVybiBuZXcgVGFibGVNb2RlbEFkYXB0ZXI8VD4oCi0JCQlsaXN0SG9sZGVyLAotCQkJbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFQ+KHNlbGVjdGVkSXRlbUhvbGRlciksCi0JCQl0YWJsZSwKLQkJCWNvbHVtbkFkYXB0ZXIsCi0JCQlsYWJlbFByb3ZpZGVyCi0JCSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciwgc2VsZWN0aW9ucyBob2xkZXIsIHRhYmxlLCBhbmQKLQkgKiBzdHJpbmcgY29udmVydGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVGFibGVNb2RlbEFkYXB0ZXIoCi0JCQlMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLAotCQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJCVRhYmxlIHRhYmxlLAotCQkJQ29sdW1uQWRhcHRlcjxFPiBjb2x1bW5BZGFwdGVyLAotCQkJSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKQotCXsKLQkJc3VwZXIoKTsKLQkJaWYgKChsaXN0SG9sZGVyID09IG51bGwpIHx8IChzZWxlY3RlZEl0ZW1zSG9sZGVyID09IG51bGwpIHx8ICh0YWJsZSA9PSBudWxsKSB8fCAobGFiZWxQcm92aWRlciA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyID0gc2VsZWN0ZWRJdGVtc0hvbGRlcjsKLQkJdGhpcy50YWJsZSA9IHRhYmxlOwotCQl0aGlzLmNvbHVtbkFkYXB0ZXIgPSBjb2x1bW5BZGFwdGVyOwotCQl0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotCQl0aGlzLnRhYmxlSXRlbU1vZGVsQWRhcHRlcnMgPSBuZXcgQXJyYXlMaXN0PFRhYmxlSXRlbU1vZGVsQWRhcHRlcj4oY29sdW1uQWRhcHRlci5jb2x1bW5Db3VudCgpKTsKLQotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNlbGVjdGVkSXRlbXNIb2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMudGFibGVTZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRUYWJsZVNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMudGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy50YWJsZVNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdCA9IHRoaXMuYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QoKTsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdCA9IHRoaXMuYnVpbGREb3VibGVDbGlja0xpc3RlbmVyTGlzdCgpOwotCi0JCXRoaXMudGFibGVEaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGFibGVEaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy50YWJsZS5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy50YWJsZURpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zeW5jaHJvbml6ZVRhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5zZWxlY3RlZEl0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMuc2VsZWN0ZWRJdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnNlbGVjdGVkSXRlbXNDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic2VsZWN0ZWQgaXRlbXMgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFRhYmxlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMudGFibGVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMudGFibGVEb3VibGVDbGlja2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRhYmxlIHNlbGVjdGlvbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3RlbmVyTGlzdDxEb3VibGVDbGlja0xpc3RlbmVyPiBidWlsZERvdWJsZUNsaWNrTGlzdGVuZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IExpc3RlbmVyTGlzdDxEb3VibGVDbGlja0xpc3RlbmVyPihEb3VibGVDbGlja0xpc3RlbmVyLmNsYXNzKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdGVuZXJMaXN0PFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBidWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0ZW5lckxpc3Q8U2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+KFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkVGFibGVEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy50YWJsZURpc3Bvc2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRhYmxlIGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplVGFibGUoKSB7Ci0JCXRoaXMuc3luY2hyb25pemVUYWJsZUNvbHVtbnMoKTsKLQkJdGhpcy5zeW5jaHJvbml6ZVRhYmxlSXRlbXMoKTsKLQkJdGhpcy5zeW5jaHJvbml6ZVRhYmxlU2VsZWN0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFibGUgY29sdW1zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplVGFibGVDb2x1bW5zKCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBjb2x1bW5Db3VudCA9IHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5Db3VudCgpOwotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjb2x1bW5Db3VudDsgaW5kZXgrKykgewotCQkJVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGhpcy50YWJsZSwgU1dULk5VTEwsIGluZGV4KTsKLQkJCXRhYmxlQ29sdW1uLnNldE1vdmVhYmxlKGZhbHNlKTsKLQkJCXRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCXRhYmxlQ29sdW1uLnNldFdpZHRoKDEwMCk7Ci0KLQkJCVN0cmluZyBjb2x1bW5OYW1lID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbk5hbWUoaW5kZXgpOwotCi0JCQlpZiAoY29sdW1uTmFtZSA9PSBudWxsKSB7Ci0JCQkJY29sdW1uTmFtZSA9ICIiOwotCQkJfQotCi0JCQl0YWJsZUNvbHVtbi5zZXRUZXh0KGNvbHVtbk5hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnJ1dGUgZm9yY2Ugc3luY2hyb25pemF0aW9uIG9mIHRhYmxlIHdpdGggdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVUYWJsZUl0ZW1zKCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGluZGV4ID0gdGFibGUuZ2V0SXRlbUNvdW50KCk7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQl0aGlzLnRhYmxlLnJlbW92ZShpbmRleCk7Ci0JCQl0aGlzLnRhYmxlSXRlbU1vZGVsQWRhcHRlcnMucmVtb3ZlKGluZGV4KTsKLQkJfQotCi0JCWludCBpdGVtQ291bnQgPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtQ291bnQ7IGluZGV4KyspIHsKLQotCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0odGhpcy50YWJsZSwgU1dULk5VTEwsIGluZGV4KTsKLQkJCXRhYmxlSXRlbS5zZXREYXRhKHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpKTsKLQotCQkJVGFibGVJdGVtTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBidWlsZEl0ZW1Nb2RlbCh0YWJsZUl0ZW0pOwotCQkJdGFibGVJdGVtTW9kZWxBZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgdGFibGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0KLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgaW5kZXggPSBldmVudC5nZXRJbmRleCgpOwotCi0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKLQotCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0odGhpcy50YWJsZSwgU1dULk5VTEwsIGluZGV4KTsKLQkJCXRhYmxlSXRlbS5zZXREYXRhKGl0ZW0pOwotCi0JCQlUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIgYWRhcHRlciA9IHRoaXMuYnVpbGRJdGVtTW9kZWwodGFibGVJdGVtKTsKLQkJCXRhYmxlSXRlbU1vZGVsQWRhcHRlcnMuYWRkKGluZGV4KyssIGFkYXB0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIHRhYmxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0KLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0aGlzLnRhYmxlLnJlbW92ZShldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJbmRleCgpICsgZXZlbnQuZ2V0SXRlbXNTaXplKCkgLSAxKTsKLQotCQlmb3IgKGludCBpbmRleCA9IGV2ZW50LmdldEluZGV4KCkgKyBldmVudC5nZXRJdGVtc1NpemUoKTsgLS1pbmRleCA+PSBldmVudC5nZXRJbmRleCgpOyApIHsKLQkJCXRhYmxlSXRlbU1vZGVsQWRhcHRlcnMucmVtb3ZlKGluZGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSB0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0KLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgbGVuZ3RoICAgICAgICA9IGV2ZW50LmdldExlbmd0aCgpOwotCQlpbnQgc291cmNlSW5kZXggICA9IGV2ZW50LmdldFNvdXJjZUluZGV4KCk7Ci0JCWludCB0YXJnZXRJbmRleCAgID0gZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKTsKLQkJaW50IGxvd1N0YXJ0SW5kZXggPSBNYXRoLm1pbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlpbnQgaGlTdGFydEluZGV4ICA9IE1hdGgubWF4KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0KLQkJT2JqZWN0W10gaXRlbXMgPSBuZXcgT2JqZWN0W2hpU3RhcnRJbmRleCAtIGxvd1N0YXJ0SW5kZXggKyBsZW5ndGhdOwotCQlpbnQgaXRlbXNJbmRleCA9IGl0ZW1zLmxlbmd0aDsKLQotCQkvLyBSZW1vdmUgdGhlIFRhYmxlSXRlbXMgd3JhcHBpbmcgdGhlIG1vdmVkIGl0ZW1zCi0JCWZvciAoaW50IGluZGV4ID0gaGlTdGFydEluZGV4ICsgbGVuZ3RoOyAtLWluZGV4ID49IGxvd1N0YXJ0SW5kZXg7ICkgewotCi0JCQlUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIgdGFibGVJdGVtTW9kZWwgPSB0aGlzLnRhYmxlSXRlbU1vZGVsQWRhcHRlcnMuZ2V0KGluZGV4KTsKLQkJCWl0ZW1zWy0taXRlbXNJbmRleF0gPSB0YWJsZUl0ZW1Nb2RlbC50YWJsZUl0ZW0uZ2V0RGF0YSgpOwotCi0JCQkvLyBSZW1vdmUgdGhlIFRhYmxlSXRlbSwgd2hpY2ggd2lsbCBhbHNvIGRpc3Bvc2UgVGFibGVJdGVtTW9kZWxBZGFwdGVyCi0JCQl0aGlzLnRhYmxlLnJlbW92ZShpbmRleCk7Ci0JCX0KLQotCQkvLyBNb3ZlIHRoZSBpdGVtcyBzbyB0aGV5IGNhbiByZXRyaWV2ZWQgaW4gdGhlIHJpZ2h0IG9yZGVyIHdoZW4KLQkJLy8gcmUtY3JlYXRpbmcgdGhlIFRhYmxlSXRlbXMKLQkJQXJyYXlUb29scy5tb3ZlKAotCQkJaXRlbXMsCi0JCQl0YXJnZXRJbmRleCAtIGxvd1N0YXJ0SW5kZXgsCi0JCQlzb3VyY2VJbmRleCAtIGxvd1N0YXJ0SW5kZXgsCi0JCQlsZW5ndGgKLQkJKTsKLQotCQlpdGVtc0luZGV4ID0gMDsKLQotCQkvLyBBZGQgVGFibGVJdGVtcyBmb3IgdGhlIG1vdmVkIGl0ZW1zCi0JCWZvciAoaW50IGluZGV4ID0gbG93U3RhcnRJbmRleDsgaW5kZXggPD0gaGlTdGFydEluZGV4ICsgbGVuZ3RoIC0gMTsgaW5kZXgrKykgewotCi0JCQkvLyBDcmVhdGUgdGhlIG5ldyBUYWJsZUl0ZW0KLQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSBuZXcgVGFibGVJdGVtKHRoaXMudGFibGUsIFNXVC5OVUxMLCBpbmRleCk7Ci0JCQl0YWJsZUl0ZW0uc2V0RGF0YShpdGVtc1tpdGVtc0luZGV4KytdKTsKLQotCQkJLy8gQWRhcHQgaXQgd2l0aCBhIG1vZGVsIGFkYXB0ZXIKLQkJCVRhYmxlSXRlbU1vZGVsQWRhcHRlciBhZGFwdGVyID0gdGhpcy5idWlsZEl0ZW1Nb2RlbCh0YWJsZUl0ZW0pOwotCQkJdGFibGVJdGVtTW9kZWxBZGFwdGVycy5zZXQoaW5kZXgsIGFkYXB0ZXIpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIFRhYmxlSXRlbU1vZGVsQWRhcHRlciBidWlsZEl0ZW1Nb2RlbChUYWJsZUl0ZW0gdGFibGVJdGVtKSB7Ci0JCXJldHVybiBUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQl0YWJsZUl0ZW0sCi0JCQljb2x1bW5BZGFwdGVyLAotCQkJbGFiZWxQcm92aWRlcgotCQkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSB0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHJvd0luZGV4ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpKSB7Ci0JCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGhpcy50YWJsZS5nZXRJdGVtKHJvd0luZGV4KTsKLQkJCXRhYmxlSXRlbS5zZXREYXRhKGl0ZW0pOwotCi0JCQlUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIgYWRhcHRlciA9IHRhYmxlSXRlbU1vZGVsQWRhcHRlcnMuZ2V0KHJvd0luZGV4KTsKLQotCQkJaW50IGNvbHVtbkNvdW50ID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNvdW50KCk7Ci0JCQlib29sZWFuIHJldmFsaWRhdGUgPSAoY29sdW1uQ291bnQgPT0gMSk7Ci0KLQkJCWZvciAoaW50IGNvbHVtbkluZGV4ID0gY29sdW1uQ291bnQ7IC0tY29sdW1uSW5kZXggPj0gMDsgKSB7Ci0JCQkJYWRhcHRlci50YWJsZUl0ZW1DaGFuZ2VkKGNvbHVtbkluZGV4LCB0YWJsZUl0ZW0uZ2V0RGF0YSgpLCByZXZhbGlkYXRlKTsKLQkJCX0KLQotCQkJcm93SW5kZXgrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSB0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy50YWJsZS5yZW1vdmVBbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgdGFibGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplVGFibGVJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldE5ld0l0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0TmV3SXRlbXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VsZWN0ZWQgaXRlbXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGludCBpbmRleE9mKEUgaXRlbSkgewotCQlpbnQgbGVuID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKHRoaXMubGlzdEhvbGRlci5nZXQoaSkgPT0gaXRlbSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZVRhYmxlU2VsZWN0aW9uKCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFt0aGlzLnNlbGVjdGVkSXRlbXNIb2xkZXIuc2l6ZSgpXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEU+IHN0cmVhbSA9IHRoaXMuc2VsZWN0ZWRJdGVtc0hvbGRlci5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWluZGljZXNbaSsrXSA9IHRoaXMuaW5kZXhPZihzdHJlYW0ubmV4dCgpKTsKLQkJfQotCQl0aGlzLnRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JCXRoaXMudGFibGUuc2VsZWN0KGluZGljZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkSXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy50YWJsZS5zZWxlY3QodGhpcy5nZXRJbmRpY2VzKGV2ZW50LmdldEl0ZW1zU2l6ZSgpLCB0aGlzLmdldEl0ZW1zKGV2ZW50KSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkSXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLnRhYmxlLmRlc2VsZWN0KHRoaXMuZ2V0SW5kaWNlcyhldmVudC5nZXRJdGVtc1NpemUoKSwgdGhpcy5nZXRJdGVtcyhldmVudCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50W10gZ2V0SW5kaWNlcyhpbnQgaXRlbXNTaXplLCBJdGVyYWJsZTxFPiBpdGVtcykgewotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFtpdGVtc1NpemVdOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRSBpdGVtIDogaXRlbXMpIHsKLQkJCWluZGljZXNbaSsrXSA9IHRoaXMuaW5kZXhPZihpdGVtKTsKLQkJfQotCQlyZXR1cm4gaW5kaWNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1zQ2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy50YWJsZS5kZXNlbGVjdEFsbCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkSXRlbXNDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZVRhYmxlU2VsZWN0aW9uKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgYm94IGV2ZW50cyAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZVNlbGVjdGlvbkNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBzY0V2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMsIHRoaXMuc2VsZWN0ZWRJdGVtcygpKTsKLQkJCWZvciAoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgOiB0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCXNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoc2NFdmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxFPiBzZWxlY3RlZEl0ZW1zKCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCQl9Ci0JCUFycmF5TGlzdDxFPiBzZWxlY3RlZEl0ZW1zID0gbmV3IEFycmF5TGlzdCh0aGlzLnRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQlmb3IgKGludCBzZWxlY3Rpb25JbmRleCA6IHRoaXMudGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKSB7Ci0JCQlzZWxlY3RlZEl0ZW1zLmFkZCh0aGlzLmxpc3RIb2xkZXIuZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkSXRlbXM7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHZvaWQgdGFibGVEb3VibGVDbGlja2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkvLyB0aGVyZSBzaG91bGQgYmUgb25seSBhIHNpbmdsZSBpdGVtIHNlbGVjdGVkIGR1cmluZyBhIGRvdWJsZS1jbGljayg/KQotCQkJRSBzZWxlY3Rpb24gPSB0aGlzLmxpc3RIb2xkZXIuZ2V0KHRoaXMudGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQlEb3VibGVDbGlja0V2ZW50PEU+IGRjRXZlbnQgPSBuZXcgRG91YmxlQ2xpY2tFdmVudCh0aGlzLCBzZWxlY3Rpb24pOwotCQkJZm9yIChEb3VibGVDbGlja0xpc3RlbmVyPEU+IGRvdWJsZUNsaWNrTGlzdGVuZXIgOiB0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJZG91YmxlQ2xpY2tMaXN0ZW5lci5kb3VibGVDbGljayhkY0V2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwb3NlICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHRhYmxlRGlzcG9zZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIERpc3Bvc2VFdmVudCBldmVudCkgewotCQkvLyB0aGUgdGFibGUgaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50Ci0JCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVycwotCQl0aGlzLnRhYmxlLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLnRhYmxlRGlzcG9zZUxpc3RlbmVyKTsKLQkJdGhpcy50YWJsZS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLnRhYmxlU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLnNlbGVjdGVkSXRlbXNIb2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZG91YmxlIGNsaWNrIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihEb3VibGVDbGlja0xpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCQl2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQ8RT4gZXZlbnQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRG91YmxlQ2xpY2tFdmVudDxFPiBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQkJcHJpdmF0ZSBmaW5hbCBFIHNlbGVjdGlvbjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHJvdGVjdGVkIERvdWJsZUNsaWNrRXZlbnQoVGFibGVNb2RlbEFkYXB0ZXI8RT4gc291cmNlLCBFIHNlbGVjdGlvbikgewotCQkJc3VwZXIoc291cmNlKTsKLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBUYWJsZU1vZGVsQWRhcHRlcjxFPiBnZXRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gKFRhYmxlTW9kZWxBZGFwdGVyPEU+KSBzdXBlci5nZXRTb3VyY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBFIHNlbGVjdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLnNlbGVjdGlvbjsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlbGVjdGlvbiBzdXBwb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0JCXZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBldmVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPEU+IHNlbGVjdGlvbjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHJvdGVjdGVkIFNlbGVjdGlvbkNoYW5nZUV2ZW50KFRhYmxlTW9kZWxBZGFwdGVyPEU+IHNvdXJjZSwgQ29sbGVjdGlvbjxFPiBzZWxlY3Rpb24pIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgVGFibGVNb2RlbEFkYXB0ZXI8RT4gZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIChUYWJsZU1vZGVsQWRhcHRlcjxFPikgc3VwZXIuZ2V0U291cmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gc2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L1RyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhOGJlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlRyaVN0YXRlQ2hlY2tCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBjYW4gYmUgdXNlZCB0byBrZWVwIGEgdHJpLXN0YXRlIGNoZWNrIGJveCBpbiBzeW5jaCB3aXRoCi0gKiBhIG1vZGVsIEJvb2xlYW4gd2hlcmUgdGhlIHZhbHVlIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlciB7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBib29sZWFuLiAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgYnV0dG9uJ3Mgc2VsZWN0aW9uIHN0YXRlIHdpdGgKLQkgKiB0aGUgbW9kZWwgYm9vbGVhbi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBib29sZWFuQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKiogVGhlIGNoZWNrIGJveC90b2dnbGUgYnV0dG9uIHdlIHN5bmNocm9uaXplIHdpdGggdGhlIG1vZGVsIGJvb2xlYW4uICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyaVN0YXRlQ2hlY2tCb3ggYnV0dG9uOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgbW9kZWwgYm9vbGVhbiB3aXRoCi0JICogdGhlIGJ1dHRvbidzIHNlbGVjdGlvbiBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2VsZWN0aW9uTGlzdGVuZXIgYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHN0dWZmIHdoZW4gdGhlIGJ1dHRvbgotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgYnV0dG9uRGlzcG9zZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgYm9vbGVhbiB0byB0aGUgc3BlY2lmaWVkIGJ1dHRvbi4KLQkgKiBJZiB0aGUgYm9vbGVhbiBpcyBudWxsLCB0aGUgYnV0dG9uJ3MgdmFsdWUgd2lsbCBiZSAicGFydGlhbGx5IGNoZWNrZWQiCi0JICogKGkuZS4gdGhlIGJ1dHRvbiB3aWxsIGJlIGNoZWNrZWQgYnV0IGdyYXllZCBvdXQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlciBhZGFwdChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLCBUcmlTdGF0ZUNoZWNrQm94IGJ1dHRvbikgewotCQlyZXR1cm4gbmV3IFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIoYm9vbGVhbkhvbGRlciwgYnV0dG9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGFuZCBidXR0b24gYXJlIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIFRyaVN0YXRlQ2hlY2tCb3ggYnV0dG9uKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChib29sZWFuSG9sZGVyLCAiVGhlIGJvb2xlYW4gaG9sZGVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCUFzc2VydC5pc05vdE51bGwoYnV0dG9uLCAiVGhlIGNoZWNrIGJveCBjYW5ub3QgYmUgbnVsbCIpOwotCi0JCXRoaXMuYm9vbGVhbkhvbGRlciA9IGJvb2xlYW5Ib2xkZXI7Ci0JCXRoaXMuYnV0dG9uID0gYnV0dG9uOwotCi0JCXRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmJ1dHRvbkRpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdXR0b25EaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy5idXR0b24uYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMuYnV0dG9uRGlzcG9zZUxpc3RlbmVyKTsKLQotCQl0aGlzLmJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCXRoaXMuc2V0QnV0dG9uU2VsZWN0aW9uKHRoaXMuYm9vbGVhbkhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIudGhpcy5ib29sZWFuQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmktc3RhdGUgYm9vbGVhbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLnRoaXMuYnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJpLXN0YXRlIGJ1dHRvbiBzZWxlY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBEaXNwb3NlTGlzdGVuZXIgYnVpbGRCdXR0b25EaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci50aGlzLmJ1dHRvbkRpc3Bvc2VkKGV2ZW50KTsKLQkJCX0KLQkJICAgIEBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyaS1zdGF0ZSBidXR0b24gZGlzcG9zZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBidXR0b24uCi0JICogSWYgdGhlIG5ldyBtb2RlbCB2YWx1ZSBpcyBudWxsLCB1c2UgdGhlIGFkYXB0ZXIncyBkZWZhdWx0IHZhbHVlCi0JICogKHdoaWNoIGlzIHR5cGljYWxseSBmYWxzZSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYm9vbGVhbkNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnNldEJ1dHRvblNlbGVjdGlvbigoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QnV0dG9uU2VsZWN0aW9uKEJvb2xlYW4gc2VsZWN0aW9uKSB7Ci0JCWlmICh0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmJ1dHRvbi5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYnV0dG9uIGhhcyBiZWVuICJzZWxlY3RlZCIgLSBzeW5jaHJvbml6ZSB0aGUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuYnV0dG9uLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwb3NlICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvbkRpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkvLyB0aGUgYnV0dG9uIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy5idXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXRoaXMuYnV0dG9uLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLmJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcik7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYm9vbGVhbkhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZmYzYmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9Db250cm9sQWxpZ25lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSB0byBzZXQgYSBwcmVmZXJyZWQgd2lkdGggb24gdGhlIHJlZ2lzdGVyZWQgd2lkZ2V0cwotICogKGVpdGhlciA8Y29kZT5Db250cm9sPC9jb2RlPiBvciA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4pIGJhc2VkIG9uIHRoZQotICogd2lkZXN0IHdpZGdldC4KLSAqIDxwPgotICogSW1wb3J0YW50OiBUaGUgbGF5b3V0IGRhdGEgaGFzIHRvIGJlIGEgPGNvZGU+R3JpZERhdGE8L2NvZGU+LiBJZiBub25lIGlzIHNldCwKLSAqIHRoZW4gYSBuZXcgPGNvZGU+R3JpZERhdGE8L2NvZGU+IGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4KLSAqIDxwPgotICogSGVyZSBhbiBleGFtcGxlIG9mIHRoZSByZXN1bHQgaWYgdGhpcyBhbGlnbmVyIGlzIHVzZWQgdG8gYWxpZ24gY29udHJvbHMKLSAqIHdpdGhpbiBlaXRoZXIgb25lIG9yIHR3byBncm91cCBib3hlcywgdGhlIGNvbnRyb2xzIGFkZGVkIGFyZSB0aGUgbGFiZWxzIGluCi0gKiB0aGlzIGNhc2UuIEl0IGlzIGFsc28gcG9zc2libGUgdG8gYWxpZ24gY29udHJvbHMgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlCi0gKiBtYWluIGNvbXBvbmVudCwgYSBzcGFjZXIgY2FuIGJlIHVzZWQgZm9yIGV4dHJhIHNwYWNlLgotICogPHA+Ci0gKiBIZXJlJ3MgYW4gZXhhbXBsZToKLSAqIDxwcmU+Ci0gKiAtIEdyb3VwIEJveCAxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCcm93c2UuLi4gfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IFByZWFsbG9jYXRpb24gU2l6ZTogfCAgICAgfEl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICB8Ci0gKiB8IERlc2NyaXB0b3I6ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogLSBHcm91cCBCb3ggMiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgfAotICogfCBNYXBwaW5nIFR5cGU6ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFZ8ICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgfAotICogfCBDaGVjayBpbiBTY3JpcHQ6ICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sQWxpZ25lcgotewotCS8qKgotCSAqIEZsYWcgdXNlZCB0byBwcmV2ZW50IGEgdmFsaWRhdGlvbiBzbyBpdCBjYW4gYmUgZG9uZSBhZnRlciBhbiBvcGVyYXRpb24KLQkgKiBjb21wbGV0ZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGF1dG9WYWxpZGF0ZTsKLQotCS8qKgotCSAqIFRoZSB1dGlsaXR5IGNsYXNzIHVzZWQgdG8gc3VwcG9ydCBib3VuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxMaXN0ZW5lcj4gY2hhbmdlU3VwcG9ydDsKLQotCS8qKgotCSAqIFRoZSBsaXN0ZW5lciBhZGRlZCB0byBlYWNoIG9mIHRoZSBjb250cm9scyB0aGF0IGxpc3RlbnMgb25seSB0byBhIHRleHQKLQkgKiBjaGFuZ2UuCi0JICovCi0JcHJpdmF0ZSBMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCS8qKgotCSAqIFByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiB3aGVuIHJlY2FsY3VsYXRpbmcgdGhlIHByZWZlcnJlZCB3aWR0aC4KLQkgKiBUaGlzIGhhcHBlbnMgaW4gYW4gaGllcmFyY2h5IG9mIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPnMuIFRoZSBsb2NrCi0JICogaGFzIHRvIGJlIHBsYWNlZCBoZXJlIGFuZCBub3QgaW4gdGhlIHtAbGluayBDb250cm9sQWxpZ25lcldyYXBwZXJ9LgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQ7Ci0KLQkvKioKLQkgKiBUaGUgbGVuZ3RoIG9mIHRoZSB3aWRlc3QgY29udHJvbC4gSWYgdGhlIGxlbmd0aCB3YXMgbm90IGNhbGN1bGF0ZWQsIHRoZW4KLQkgKiB0aGlzIHZhbHVlIGlzIDAuCi0JICovCi0JcHJpdmF0ZSBpbnQgbWF4aW11bVdpZHRoOwotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFdyYXBwZXJ9cyBlbmNhcHN1bGF0aW5nIGVpdGhlciA8Y29kZT5Db250cm9sPC9jb2RlPnMKLQkgKiBvciB7QGxpbmsgQ29udHJvbEFsaWduZXJ9cy4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248V3JhcHBlcj4gd3JhcHBlcnM7Ci0KLQkvKioKLQkgKiBBIG51bGwtPGNvZGU+UG9pbnQ8L2NvZGU+IG9iamVjdCB1c2VkIHRvIGNsZWFyIHRoZSBwcmVmZXJyZWQgc2l6ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQb2ludCBERUZBVUxUX1NJWkUgPSBuZXcgUG9pbnQoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCS8qKgotCSAqIFRoZSB0eXBlcyBvZiBldmVudHMgdG8gbGlzdGVuIGluIG9yZGVyIHRvIHByb3Blcmx5IGFkanVzdCB0aGUgc2l6ZSBvZiBhbGwKLQkgKiB0aGUgd2lkZ2V0cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBFVkVOVF9UWVBFUyA9IHsKLQkJU1dULkRpc3Bvc2UsCi0JCVNXVC5IaWRlLAotCQlTV1QuUmVzaXplLAotCQlTV1QuU2hvdwotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbEFsaWduZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250cm9scyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sPC9jb2RlPnMKLQkgKi8KLQlwdWJsaWMgQ29udHJvbEFsaWduZXIoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMpIHsKLQkJdGhpcygpOwotCQlhZGRBbGxDb250cm9scyhjb250cm9scyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY29udHJvbC4gSXRzIHdpZHRoIHdpbGwgYmUgdXNlZCBhbG9uZyB3aXRoIHRoZSB3aWR0aCBvZiBhbGwKLQkgKiB0aGUgb3RoZXIgcmVnaXN0ZXJlZCBjb250cm9scyBpbiBvcmRlciB0byBnZXQgdGhlIGdyZWF0ZXIgd2l0ZGggYW5kIHVzZQotCSAqIGl0IGFzIHRoZSB3aWR0aCBmb3IgYWxsIHRoZSBjb250cm9scy4KLQkgKgotCSAqIEBwYXJhbSBjb250cm9sIFRoZSA8Y29kZT5Db250cm9sPC9jb2RlPiB0byBiZSBhZGRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChDb250cm9sIGNvbnRyb2wpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRyb2wsICJDYW4ndCBhZGQgbnVsbCB0byB0aGlzIENvbnRyb2xBbGlnbmVyIik7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gYnVpbGRXcmFwcGVyKGNvbnRyb2wpOwotCQl3cmFwcGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJd3JhcHBlcnMuYWRkKHdyYXBwZXIpOwotCi0JCXJldmFsaWRhdGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbnRyb2wuIEl0cyB3aWR0aCB3aWxsIGJlIHVzZWQgYWxvbmcgd2l0aCB0aGUgd2lkdGggb2YgYWxsCi0JICogdGhlIG90aGVyIHJlZ2lzdGVyZWQgY29udHJvbHMgaW4gb3JkZXIgdG8gZ2V0IHRoZSBncmVhdGVyIHdpdGRoIGFuZCB1c2UKLQkgKiBpdCBhcyB0aGUgd2lkdGggZm9yIGFsbCB0aGUgY29udHJvbHMuCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbEFsaWduZXIgVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiB0byBiZSBhZGRlZAotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIENhbid0IGFkZCB0aGUgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+Ci0JICogdG8gaXRzZWxmCi0JICovCi0JcHVibGljIHZvaWQgYWRkKENvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sQWxpZ25lciwgIkNhbid0IGFkZCBudWxsIHRvIHRoaXMgQ29udHJvbEFsaWduZXIiKTsKLQkJQXNzZXJ0LmlzTGVnYWwoY29udHJvbEFsaWduZXIgIT0gdGhpcywgIkNhbid0IGFkZCB0aGUgQ29udHJvbEFsaWduZXIgdG8gaXRzZWxmIik7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gYnVpbGRXcmFwcGVyKGNvbnRyb2xBbGlnbmVyKTsKLQkJd3JhcHBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXdyYXBwZXJzLmFkZCh3cmFwcGVyKTsKLQotCQlpZiAoIWNvbnRyb2xBbGlnbmVyLndyYXBwZXJzLmlzRW1wdHkoKSkgewotCQkJcmV2YWxpZGF0ZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBpdGVtcyBjb250YWluZWQgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gaW50byB0aGlzCi0JICogPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LiBUaGUgcHJlZmVycmVkIHdpZHRoIG9mIGVhY2ggaXRlbSB3aWxsIGJlCi0JICogdXNlZCBhbG9uZyB3aXRoIHRoZSB3aWR0aCBvZiBhbGwgdGhlIG90aGVyIGl0ZW1zIGluIG9yZGVyIHRvIGdldCB0aGUKLQkgKiB3aWRlc3QgY29udHJvbCBhbmQgdXNlIGl0cyB3aWR0aCBhcyB0aGUgd2lkdGggZm9yIGFsbCB0aGUgY29udHJvbHMuCi0JICoKLQkgKiBAcGFyYW0gYWxpZ25lcnMgVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+cwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbENvbnRyb2xBbGlnbmVycyhDb2xsZWN0aW9uPENvbnRyb2xBbGlnbmVyPiBhbGlnbmVycykgewotCi0JCS8vIERlYWN0aXZhdGUgdGhlIGF1dG8gdmFsaWRhdGlvbiB3aGlsZSBhZGRpbmcgYWxsIHRoZSBDb250cm9scyBhbmQvb3IKLQkJLy8gQ29udHJvbEFsaWduZXJzIGluIG9yZGVyIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKLQkJYm9vbGVhbiBvbGRBdXRvVmFsaWRhdGUgPSBhdXRvVmFsaWRhdGU7Ci0JCWF1dG9WYWxpZGF0ZSA9IGZhbHNlOwotCi0JCWZvciAoQ29udHJvbEFsaWduZXIgYWxpZ25lciA6IGFsaWduZXJzKSB7Ci0JCQlhZGQoYWxpZ25lcik7Ci0JCX0KLQotCQlhdXRvVmFsaWRhdGUgPSBvbGRBdXRvVmFsaWRhdGU7Ci0JCXJldmFsaWRhdGUoZmFsc2UpOwotCX0KLQotICAgLyoqCi0JICogQWRkcyB0aGUgaXRlbXMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGludG8gdGhpcwotCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4gVGhlIHByZWZlcnJlZCB3aWR0aCBvZiBlYWNoIGl0ZW0gd2lsbCBiZQotCSAqIHVzZWQgYWxvbmcgd2l0aCB0aGUgd2lkdGggb2YgYWxsIHRoZSBvdGhlciBpdGVtcyBpbiBvcmRlciB0byBnZXQgdGhlCi0JICogd2lkZXN0IGNvbnRyb2wgYW5kIHVzZSBpdHMgd2lkdGggYXMgdGhlIHdpZHRoIGZvciBhbGwgdGhlIGNvbnRyb2xzLgotCSAqCi0JICogQHBhcmFtIGNvbnRyb2xzIFRoZSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNvbnRyb2w8L2NvZGU+cwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbENvbnRyb2xzKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzKSB7Ci0KLQkJLy8gRGVhY3RpdmF0ZSB0aGUgYXV0byB2YWxpZGF0aW9uIHdoaWxlIGFkZGluZyBhbGwgdGhlIENvbnRyb2xzIGFuZC9vcgotCQkvLyBDb250cm9sQWxpZ25lcnMgaW4gb3JkZXIgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQotCQlib29sZWFuIG9sZEF1dG9WYWxpZGF0ZSA9IGF1dG9WYWxpZGF0ZTsKLQkJYXV0b1ZhbGlkYXRlID0gZmFsc2U7Ci0KLQkJZm9yIChDb250cm9sIGNvbnRyb2wgOiBjb250cm9scykgewotCQkJYWRkKGNvbnRyb2wpOwotCQl9Ci0KLQkJYXV0b1ZhbGlkYXRlID0gb2xkQXV0b1ZhbGlkYXRlOwotCQlyZXZhbGlkYXRlKGZhbHNlKTsKLQl9Ci0KLSAgIC8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIDxjb2RlPkNvbnRyb0xpc3RlbmVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIGJlIGFkZGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJaWYgKGNoYW5nZVN1cHBvcnQgPT0gbnVsbCkgewotCQkgICAgY2hhbmdlU3VwcG9ydCA9IG5ldyBBcnJheUxpc3Q8TGlzdGVuZXI+KCk7Ci0JCX0KLQotCQljaGFuZ2VTdXBwb3J0LmFkZChsaXN0ZW5lcik7Ci0gICB9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPldyYXBwZXI8L2NvZGU+IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBnaXZlbiBzb3VyY2UuCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCB0byBiZSB3cmFwcGVkCi0JICogQHJldHVybiBBIG5ldyB7QGxpbmsgV3JhcHBlcn0KLQkgKi8KLQlwcml2YXRlIFdyYXBwZXIgYnVpbGRXcmFwcGVyKENvbnRyb2wgY29udHJvbCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2xXcmFwcGVyKGNvbnRyb2wpOwotCX0KLQotICAgLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XcmFwcGVyPC9jb2RlPiB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgZ2l2ZW4gc291cmNlLgotCSAqCi0JICogQHBhcmFtIENvbnRyb2xBbGlnbmVyIFRoZSA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4gdG8gYmUgd3JhcHBlZAotCSAqIEByZXR1cm4gQSBuZXcge0BsaW5rIENvbnRyb2xBbGlnbmVyV3JhcHBlcn0KLQkgKi8KLQlwcml2YXRlIFdyYXBwZXIgYnVpbGRXcmFwcGVyKENvbnRyb2xBbGlnbmVyIENvbnRyb2xBbGlnbmVyKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbEFsaWduZXJXcmFwcGVyKENvbnRyb2xBbGlnbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCB0YWtlbiBieSB0aGUgd2lkZ2V0cyBhbmQgcmV0dXJucyB0aGUgbWF4aW11bSB3aWR0aC4KLQkgKgotCSAqIEBwYXJhbSByZWNhbGN1bGF0ZVNpemUgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gcmVjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBzaXplCi0JICogb2YgYWxsIHRoZSB3cmFwcGVycyBjb250YWluZWQgd2l0aGluIHRoZW0gcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGNhY2hlZAotCSAqIHNpemU7IDxjb2RlPmZhbHNlPC9jb2RlPiB0byB1c2UgdGhlIGNhY2hlZCBzaXplCi0JICovCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlV2lkdGgoYm9vbGVhbiByZWNhbGN1bGF0ZVNpemUpIHsKLQotCQlpbnQgd2lkdGggPSAwOwotCi0JCWZvciAoV3JhcHBlciB3cmFwcGVyIDogd3JhcHBlcnMpIHsKLQkJCVBvaW50IHNpemUgPSB3cmFwcGVyLmNhY2hlZFNpemUoKTsKLQotCQkJLy8gVGhlIHNpemUgaGFzIG5vdCBiZWVuIGNhbGN1bGF0ZWQgeWV0Ci0JCQlpZiAocmVjYWxjdWxhdGVTaXplIHx8IChzaXplLnggPT0gMCkpIHsKLQkJCQlzaXplID0gd3JhcHBlci5jYWxjdWxhdGVTaXplKCk7Ci0JCQl9Ci0KLQkJCS8vIE9ubHkga2VlcCB0aGUgZ3JlYXRlc3Qgd2lkdGgKLQkJCXdpZHRoID0gTWF0aC5tYXgoc2l6ZS54LCB3aWR0aCk7Ci0JCX0KLQotCQlyZXR1cm4gd2lkdGg7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0cyBhIGJvdW5kIHByb3BlcnR5IGNoYW5nZS4KLQkgKgotCSAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSAoYXMgYW4gaW50KQotCSAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSAoYXMgYW4gaW50KQotCSAqLwotCXByaXZhdGUgdm9pZCBjb250cm9sUmVzaXplZChpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCi0JCWlmICgoY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpKSB7Ci0JCQlFdmVudCBldmVudCAgPSBuZXcgRXZlbnQoKTsKLQkJCWV2ZW50LndpZGdldCA9IFNXVFV0aWwuZ2V0U2hlbGwoKTsKLQkJCWV2ZW50LmRhdGEgICA9IHRoaXM7Ci0KLQkJCWZvciAoTGlzdGVuZXIgbGlzdGVuZXIgOiBjaGFuZ2VTdXBwb3J0KSB7Ci0JCQkJbGlzdGVuZXIuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhpcyA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4sIHRoaXMgY2FuIGltcHJvdmUgdGhlIHNwZWVkIG9mCi0JICogZGlzcG9zaW5nIGEgcGFuZS4gV2hlbiBhIHBhbmUgaXMgZGlzcG9zZWQsIHRoaXMgYWxpZ25lciBkb2Vzbid0IG5lZWQgdG8KLQkgKiByZXZhbGlkYXRlIGl0cyBzaXplIHVwb24gZGlzcG9zZSBvZiBpdHMgd2lkZ2V0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCi0JCWZvciAoSXRlcmF0b3I8V3JhcHBlcj4gaXRlciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCVdyYXBwZXIgd3JhcHBlciA9IGl0ZXIubmV4dCgpOwotCQkJd3JhcHBlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlpdGVyLnJlbW92ZSgpOwotCQl9Ci0KLQkJdGhpcy53cmFwcGVycy5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgd2lkZXN0IGNvbnRyb2wuIElmIHRoZSBsZW5ndGggd2FzIG5vdAotCSAqIGNhbGN1bGF0ZWQsIHRoZW4gdGhpcyB2YWx1ZSBpcyAwLgotCSAqCi0JICogQHJldHVybiBUaGUgd2lkdGggb2YgdGhlIHdpZGVzdCBjb250cm9sIG9yIDAgaWYgdGhlIGxlbmd0aCBoYXMgbm90IGJlZW4KLQkgKiBjYWxjdWxhdGVkIHlldAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4aW11bVdpZHRoKCkgewotCQlyZXR1cm4gbWF4aW11bVdpZHRoOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCi0JCXRoaXMuYXV0b1ZhbGlkYXRlID0gdHJ1ZTsKLQkJdGhpcy5tYXhpbXVtV2lkdGggPSAwOwotCQl0aGlzLmxpc3RlbmVyICAgICA9IG5ldyBMaXN0ZW5lckhhbmRsZXIoKTsKLQkJdGhpcy53cmFwcGVycyAgICAgPSBuZXcgQXJyYXlMaXN0PFdyYXBwZXI+KCk7Ci0JfQotCi0JLyoqCi0JICogSW52YWxpZGF0ZXMgdGhlIHNpemUgb2YgdGhlIGdpdmVuIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgdG8gYmUgaW52YWxpZGF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW52YWxpZGF0ZShPYmplY3Qgc291cmNlKSB7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gcmV0cmlldmVXcmFwcGVyKHNvdXJjZSk7Ci0KLQkJaWYgKCF3cmFwcGVyLmxvY2tlZCgpKSB7Ci0JCQlQb2ludCBzaXplID0gd3JhcHBlci5jYWNoZWRTaXplKCk7Ci0JCQlzaXplLnggPSBzaXplLnkgPSAwOwotCQkJd3JhcHBlci5zZXRTaXplKERFRkFVTFRfU0laRSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBtYXhpbXVtIGxlbmd0aCBiYXNlZCBvbiB0aGUgd2lkZXN0IGNvbnRyb2wuIFRoaXMgbWV0aG9kcwotCSAqIGRvZXMgbm90IHVwZGF0ZSB0aGUgd2lkdGggb2YgdGhlIGNvbnRyb2xzLgotCSAqCi0JICogQHBhcmFtIHJlY2FsY3VsYXRlU2l6ZSA8Y29kZT50cnVlPC9jb2RlPiB0byByZWNhbGN1bGF0ZSB0aGUgcHJlZmVycmVkIHNpemUKLQkgKiBvZiBhbGwgdGhlIHdyYXBwZXJzIGNvbnRhaW5lZCB3aXRoaW4gdGhlbSByYXRoZXIgdGhhbiB1c2luZyB0aGUgY2FjaGVkCi0JICogc2l6ZTsgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVzZSB0aGUgY2FjaGVkIHNpemUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVjYWxjdWxhdGVXaWR0aChib29sZWFuIHJlY2FsY3VsYXRlU2l6ZSkgewotCi0JCWludCB3aWR0aCA9IGNhbGN1bGF0ZVdpZHRoKHJlY2FsY3VsYXRlU2l6ZSk7Ci0KLQkJdHJ5IHsKLQkJCWxvY2tlZCA9IHRydWU7Ci0JCQlzZXRNYXhpbXVtV2lkdGgod2lkdGgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbG9ja2VkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb250cm9sLiBJdHMgcHJlZmVycmVkIHdpZHRoIHdpbGwgbm90IGJlIHVzZWQgd2hlbgotCSAqIGNhbGN1bGF0aW5nIHRoZSBwcmVmZXJyZWQgd2lkdGguCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCB0byBiZSByZW1vdmVkCi0JICogQGV4Y2VwdGlvbiBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gSWYgdGhlIGdpdmVuIDxjb2RlPkNvbnRyb2w8L2NvZGU+IGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoQ29udHJvbCBjb250cm9sKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sLCAiVGhlIENvbnRyb2wgdG8gcmVtb3ZlIGNhbm5vdCBiZSBudWxsIik7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gcmV0cmlldmVXcmFwcGVyKGNvbnRyb2wpOwotCQl3cmFwcGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJd3JhcHBlcnMucmVtb3ZlKHdyYXBwZXIpOwotCi0JCXJldmFsaWRhdGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LiBJdHMgcHJlZmVycmVkIHdpZHRoCi0JICogd2lsbCBub3QgYmUgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBwcmVmZXJyZWQgd2l0ZGguCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbEFsaWduZXIgVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiB0byBiZSByZW1vdmVkCi0JICogQGV4Y2VwdGlvbiBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gSWYgdGhlIGdpdmVuIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPgotCSAqIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKENvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sQWxpZ25lciwgIlRoZSBDb250cm9sQWxpZ25lciB0byByZW1vdmUgY2Fubm90IGJlIG51bGwiKTsKLQotCQlXcmFwcGVyIHdyYXBwZXIgPSByZXRyaWV2ZVdyYXBwZXIoY29udHJvbEFsaWduZXIpOwotCQl3cmFwcGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJd3JhcHBlcnMucmVtb3ZlKHdyYXBwZXIpOwotCi0JCXJldmFsaWRhdGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gPGNvZGU+TGlzdGVuZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIFRoZSA8Y29kZT5MaXN0ZW5lcjwvY29kZT4gdG8gYmUgcmVtb3ZlZAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCWNoYW5nZVN1cHBvcnQucmVtb3ZlKGxpc3RlbmVyKTsKLQotCQlpZiAoY2hhbmdlU3VwcG9ydC5pc0VtcHR5KCkpIHsKLQkJCWNoYW5nZVN1cHBvcnQgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSA8Y29kZT5XcmFwcGVyPC9jb2RlPiB0aGF0IGlzIGVuY2Fwc3VsYXRpbmcgdGhlIGdpdmVuIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgRWl0aGVyIGEgPGNvZGU+Q29udHJvbDwvY29kZT4gb3IgYSA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4KLQkgKiBAcmV0dXJuIEl0cyA8Y29kZT5XcmFwcGVyPC9jb2RlPgotCSAqLwotCXByaXZhdGUgV3JhcHBlciByZXRyaWV2ZVdyYXBwZXIoT2JqZWN0IHNvdXJjZSkgewotCi0JCWZvciAoV3JhcHBlciB3cmFwcGVyIDogd3JhcHBlcnMpIHsKLQkJCWlmICh3cmFwcGVyLnNvdXJjZSgpID09IHNvdXJjZSkgewotCQkJCXJldHVybiB3cmFwcGVyOwotCQkJfQotCQl9Ci0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgcmV0cmlldmUgdGhlIFdyYXBwZXIgZm9yICIgKyBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBjb3VudCBvZiBjb250cm9sIGlzIGdyZWF0ZXIgdGhhbiBvbmUgYW5kIHtAbGluayAjaXNBdXRvVmFsaWRhdGUoKX0KLQkgKiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSBzaXplIG9mIGFsbCB0aGUgcmVnaXN0ZXJlZAotCSAqIDxjb2RlPkNvbnRyb2w8L2NvZGU+cyB3aWxsIGJlIHVkcGF0ZWQuCi0JICoKLQkgKiBAcGFyYW0gcmVjYWxjdWxhdGVTaXplIDxjb2RlPnRydWU8L2NvZGU+IHRvIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZQotCSAqIG9mIGFsbCB0aGUgd3JhcHBlcnMgY29udGFpbmVkIHdpdGhpbiB0aGVtIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBjYWNoZWQKLQkgKiBzaXplOyA8Y29kZT5mYWxzZTwvY29kZT4gdG8gdXNlIHRoZSBjYWNoZWQgc2l6ZQotCSAqLwotCXByaXZhdGUgdm9pZCByZXZhbGlkYXRlKGJvb2xlYW4gcmVjYWxjdWxhdGVTaXplKSB7Ci0KLQkJaWYgKGF1dG9WYWxpZGF0ZSkgewotCQkJcmVjYWxjdWxhdGVXaWR0aChyZWNhbGN1bGF0ZVNpemUpOwotCQkJdXBkYXRlV3JhcHBlclNpemUocmVjYWxjdWxhdGVTaXplKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJhc2VzIG9uIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIGdpdmVuIDxjb2RlPkV2ZW50PC9jb2RlPiwKLQkgKiByZXNpemUgdGhlIGNvbnRyb2xzLgotCSAqCi0JICogQHBhcmFtIGV2ZW50IFRoZSA8Y29kZT5FdmVudDwvY29kZT4gc2VudCBieSB0aGUgVUkgdGhyZWFkIHdoZW4gdGhlIHN0YXRlCi0JICogb2YgYSB3aWRnZXQgY2hhbmdlZAotCSAqLwotCXByaXZhdGUgdm9pZCByZXZhbGlkYXRlKEV2ZW50IGV2ZW50KSB7Ci0KLQkJLy8gV2UgZG9uJ3QgbmVlZCB0byByZXZhbGlkYXRlIGR1cmluZyBhIHJldmFsaWRhdGlvbiBwcm9jZXNzCi0JCWlmIChsb2NrZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCU9iamVjdCBzb3VyY2U7Ci0KLQkJaWYgKGV2ZW50LndpZGdldCAhPSBTV1RVdGlsLmdldFNoZWxsKCkpIHsKLQkJCXNvdXJjZSA9IGV2ZW50LndpZGdldDsKLQkJCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBzb3VyY2U7Ci0KLQkJCS8vIFdoZW4gYSBkaWFsb2cgaXMgb3BlbmVkLCB3ZSBuZWVkIHRvIGFjdHVhbGx5IGZvcmNlIGEgbGF5b3V0IG9mCi0JCQkvLyB0aGUgY29udHJvbHMsIHRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgY29udHJvbCBpcyBhY3R1YWxseQotCQkJLy8gbm90IHZpc2libGUgd2hlbiB0aGUgcHJlZmVycmVkIHdpZHRoIGlzIGNhY3VsYXRlZAotCQkJaWYgKGNvbnRyb2wgPT0gY29udHJvbC5nZXRTaGVsbCgpKSB7Ci0JCQkJaWYgKGV2ZW50LnR5cGUgPT0gU1dULkRpc3Bvc2UpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCXNvdXJjZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzb3VyY2UgPSBldmVudC5kYXRhOwotCQl9Ci0KLQkJLy8gRWl0aGVyIHJlbW92ZSB0aGUgQ29udHJvbFdyYXBwZXIgaWYgdGhlIHdpZGdldCB3YXMgZGlzcG9zZWQgb3IKLQkJLy8gaW52YWxpZGF0ZSB0aGUgd2lkZ2V0IGluIG9yZGVyIHRvIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZQotCQlpZiAoc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChldmVudC50eXBlID09IFNXVC5EaXNwb3NlKSB7Ci0JCQkJV3JhcHBlciB3cmFwcGVyID0gcmV0cmlldmVXcmFwcGVyKHNvdXJjZSk7Ci0JCQkJd3JhcHBlcnMucmVtb3ZlKHdyYXBwZXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW52YWxpZGF0ZShzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQkJLy8gTm93IHJldmFsaWRhdGUgYWxsIHRoZSBDb250cm9scyBhbmQgQ29udHJvbEFsaWduZXJzCi0JCXJldmFsaWRhdGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSB3aWRlc3QgY29udHJvbC4gSWYgdGhlIGxlbmd0aCB3YXMgbm90IGNhbHVsY2F0ZWQsCi0JICogdGhlbiB0aGlzIHZhbHVlIGlzIDAuCi0JICoKLQkgKiBAcGFyYW0gbWF4aW11bVdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TWF4aW11bVdpZHRoKGludCBtYXhpbXVtV2lkdGgpIHsKLQotCQlpbnQgb2xkTWF4aW11bVdpZHRoID0gdGhpcy5tYXhpbXVtV2lkdGg7Ci0JCXRoaXMubWF4aW11bVdpZHRoID0gbWF4aW11bVdpZHRoOwotCQljb250cm9sUmVzaXplZChvbGRNYXhpbXVtV2lkdGgsIG1heGltdW1XaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvYmplY3QKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCJtYXhpbXVtV2lkdGg9Iik7Ci0JCXNiLmFwcGVuZChtYXhpbXVtV2lkdGgpOwotCQlzYi5hcHBlbmQoIiwgd3JhcHBlcnM9Iik7Ci0JCXNiLmFwcGVuZCh3cmFwcGVycyk7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzaXplIG9mIGV2ZXJ5IDxjb2RlPldyYXBwZXI8L2NvZGU+IGJhc2VkIG9uIHRoZSBtYXhpbXVtIHdpZHRoLgotCSAqCi0JICogQHBhcmFtIGZvcmNlUmV2YWxpZGF0ZSA8Y29kZT50cnVlPC9jb2RlPiB0byByZXZhbGlkYXRlIHRoZSB3cmFwcGVyJ3Mgc2l6ZQotCSAqIGV2ZW4gdGhvdWdoIGl0cyBjdXJyZW50IHNpemUgbWlnaHQgYmUgdGhlIHNhbWUgYXMgdGhlIG1heGltdW0gd2lkdGg7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG9ubHkgcmV2YWxpZGF0ZSB0aGUgd3JhcHBlcnMgd2l0aCBhIGRpZmZlcmVudCB3aWR0aAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVXcmFwcGVyU2l6ZShib29sZWFuIGZvcmNlUmV2YWxpZGF0ZSkgewotCi0JCWZvciAoV3JhcHBlciB3cmFwcGVyIDogd3JhcHBlcnMpIHsKLQkJCVBvaW50IGNhY2hlZFNpemUgPSB3cmFwcGVyLmNhY2hlZFNpemUoKTsKLQotCQkJLy8gTm8gbmVlZCB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIHdyYXBwZXIgc2luY2UgaXQncyBhbHdheXMgdXNpbmcKLQkJCS8vIHRoZSBtYXhpbXVtIHdpZHRoCi0JCQlpZiAoZm9yY2VSZXZhbGlkYXRlIHx8IChjYWNoZWRTaXplLnggIT0gbWF4aW11bVdpZHRoKSkgewotCQkJCVBvaW50IHNpemUgPSBuZXcgUG9pbnQobWF4aW11bVdpZHRoLCBjYWNoZWRTaXplLnkpOwotCQkJCXdyYXBwZXIuc2V0U2l6ZShzaXplKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgPGNvZGU+V3JhcHBlcjwvY29kZT4gZW5jYXBzdWxhdGVzIGEge0BsaW5rIENvbnRyb2xBbGlnbmVyfS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbnRyb2xBbGlnbmVyV3JhcHBlciBpbXBsZW1lbnRzIFdyYXBwZXIgewotCQkvKioKLQkJICogVGhlIGNhY2hlZCBzaXplLCB3aGljaCBpcyB7QGxpbmsgQ29udHJvbEFsaWduZXIjbWF4aW11bVdpZHRofS4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgUG9pbnQgY2FjaGVkU2l6ZTsKLQotCQkvKioKLQkJICogVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBlbmNhcHN1bGF0ZWQgYnkgdGhpcwotCQkgKiA8Y29kZT5XcmFwcGVyPC9jb2RlPi4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXI7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbEFsaWduZXJXcmFwcGVyPC9jb2RlPiB0aGF0IGVuY2Fwc3VsYXRlcwotCQkgKiB0aGUgZ2l2ZW4gPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LgotCQkgKgotCQkgKiBAcGFyYW0gY29udHJvbEFsaWduZXIgVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiB0byBiZQotCQkgKiBlbmNhcHN1bGF0ZWQgYnkgdGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBDb250cm9sQWxpZ25lcldyYXBwZXIoQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbnRyb2xBbGlnbmVyID0gY29udHJvbEFsaWduZXI7Ci0JCQl0aGlzLmNhY2hlZFNpemUgICAgID0gbmV3IFBvaW50KGNvbnRyb2xBbGlnbmVyLm1heGltdW1XaWR0aCwgMCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJY29udHJvbEFsaWduZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIFBvaW50IGNhY2hlZFNpemUoKSB7Ci0JCQljYWNoZWRTaXplLnggPSBjb250cm9sQWxpZ25lci5tYXhpbXVtV2lkdGg7Ci0JCQlyZXR1cm4gY2FjaGVkU2l6ZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBQb2ludCBjYWxjdWxhdGVTaXplKCkgewotCi0JCQlQb2ludCBzaXplID0gbmV3IFBvaW50KGNvbnRyb2xBbGlnbmVyLmNhbGN1bGF0ZVdpZHRoKGZhbHNlKSwgMCk7Ci0KLQkJCWlmIChzaXplLnggIT0gU1dULkRFRkFVTFQpIHsKLQkJCQljYWNoZWRTaXplLnggPSBzaXplLng7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljYWNoZWRTaXplLnggPSAwOwotCQkJfQotCi0JCQlpZiAoc2l6ZS55ICE9IFNXVC5ERUZBVUxUKSB7Ci0JCQkJY2FjaGVkU2l6ZS55ID0gc2l6ZS55OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY2FjaGVkU2l6ZS55ID0gMDsKLQkJCX0KLQotCQkJcmV0dXJuIHNpemU7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBsb2NrZWQoKSB7Ci0JCQlyZXR1cm4gY29udHJvbEFsaWduZXIubG9ja2VkOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCWNvbnRyb2xBbGlnbmVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgewotCi0JCQlpZiAoc2l6ZSA9PSBERUZBVUxUX1NJWkUpIHsKLQkJCQljb250cm9sQWxpZ25lci5tYXhpbXVtV2lkdGggPSAwOwotCQkJfQotCQkJZWxzZSBpZiAoY29udHJvbEFsaWduZXIubWF4aW11bVdpZHRoICE9IHNpemUueCkgewotCQkJCWNvbnRyb2xBbGlnbmVyLm1heGltdW1XaWR0aCA9IHNpemUueDsKLQkJCQljb250cm9sQWxpZ25lci51cGRhdGVXcmFwcGVyU2l6ZSh0cnVlKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBPYmplY3Qgc291cmNlKCkgewotCQkJcmV0dXJuIGNvbnRyb2xBbGlnbmVyOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0KLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXNiLmFwcGVuZCgiQ2FjaGVkIHNpemU9Iik7Ci0JCQlzYi5hcHBlbmQoY2FjaGVkU2l6ZSk7Ci0JCQlzYi5hcHBlbmQoIiwgQ29udHJvbEFsaWduZXI9Iik7Ci0JCQlzYi5hcHBlbmQoY29udHJvbEFsaWduZXIpOwotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPiBlbmNhcHN1bGF0ZXMgYSB7QGxpbmsgQ29udHJvbH0uCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDb250cm9sV3JhcHBlciBpbXBsZW1lbnRzIFdyYXBwZXIgewotCQkvKioKLQkJICogVGhlIGNhY2hlZCBzaXplLCB3aGljaCBpcyBjb250cm9sJ3Mgc2l6ZS4KLQkJICovCi0JCXByaXZhdGUgUG9pbnQgY2FjaGVkU2l6ZTsKLQotCQkvKioKLQkJICogVGhlIGNvbnRyb2wgdG8gYmUgZW5jYXBzdWxhdGVkIGJ5IHRoaXMgPGNvZGU+V3JhcHBlcjwvY29kZT4uCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIENvbnRyb2wgY29udHJvbDsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5jb250cm9sV3JhcHBlcjwvY29kZT4gdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIGdpdmVuCi0JCSAqIGNvbnRyb2wuCi0JCSAqCi0JCSAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIHRvIGJlIGVuY2Fwc3VsYXRlZCBieSB0aGlzIDxjb2RlPldyYXBwZXI8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIENvbnRyb2xXcmFwcGVyKENvbnRyb2wgY29udHJvbCkgewotCQkJc3VwZXIoKTsKLQotCQkJdGhpcy5jb250cm9sICAgID0gY29udHJvbDsKLQkJCXRoaXMuY2FjaGVkU2l6ZSA9IG5ldyBQb2ludCgwLCAwKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJCWZvciAoaW50IGV2ZW50VHlwZSA6IEVWRU5UX1RZUEVTKSB7Ci0JCQkJY29udHJvbC5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBQb2ludCBjYWNoZWRTaXplKCkgewotCQkJcmV0dXJuIGNhY2hlZFNpemU7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgUG9pbnQgY2FsY3VsYXRlU2l6ZSgpIHsKLQotCQkJY2FjaGVkU2l6ZSA9IGNvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQotCQkJLy8gVXBkYXRlIHJpZ2h0IGF3YXkgdGhlIGNvbnRyb2wncyBHcmlkRGF0YQotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbnRyb2wuZ2V0TGF5b3V0RGF0YSgpOwotCi0JCQlpZiAoZ3JpZERhdGEgPT0gbnVsbCkgewotCQkJCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJfQotCi0JCQlncmlkRGF0YS53aWR0aEhpbnQgID0gY2FjaGVkU2l6ZS54OwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGNhY2hlZFNpemUueTsKLQotCQkJLy8gTWFrZSBzdXJlIHRoZSBzaXplIGlzIG5vdCAtMQotCQkJaWYgKGNhY2hlZFNpemUueCA9PSBTV1QuREVGQVVMVCkgewotCQkJCWNhY2hlZFNpemUueCA9IDA7Ci0JCQl9Ci0KLQkJCWlmIChjYWNoZWRTaXplLnkgPT0gU1dULkRFRkFVTFQpIHsKLQkJCQljYWNoZWRTaXplLnkgPSAwOwotCQkJfQotCi0JCQlyZXR1cm4gY2FjaGVkU2l6ZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGxvY2tlZCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJCWZvciAoaW50IGV2ZW50VHlwZSA6IEVWRU5UX1RZUEVTKSB7Ci0JCQkJY29udHJvbC5yZW1vdmVMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgewotCi0JCQlpZiAoY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIFVwZGF0ZSB0aGUgR3JpZERhdGEgd2l0aCB0aGUgbmV3IHNpemUKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBjb250cm9sLmdldExheW91dERhdGEoKTsKLQotCQkJaWYgKGdyaWREYXRhID09IG51bGwpIHsKLQkJCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCX0KLQotCQkJZ3JpZERhdGEud2lkdGhIaW50ICA9IHNpemUueDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSBzaXplLnk7Ci0KLQkJCS8vIEZvcmNlIHRoZSBjb250cm9sIHRvIGJlIHJlc2l6ZWQsIGFuZCB0ZWxsIGl0cyBwYXJlbnQgdG8gbGF5b3V0Ci0JCQkvLyBpdHMgd2lkZ2V0cwotCQkJaWYgKHNpemUueCA+IDApIHsKLS8vCQkJCWxvY2tlZCA9IHRydWU7Ci0vLwkJCQl0cnkgIHsKLS8vLy8JCQkJCWNvbnRyb2wuZ2V0UGFyZW50KCkubGF5b3V0KG5ldyBDb250cm9sW10geyBjb250cm9sIH0pOwotLy8JCQkJCWNvbnRyb2wuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotLy8JCQkJfQotLy8JCQkJZmluYWxseSB7Ci0vLwkJCQkJbG9ja2VkID0gZmFsc2U7Ci0vLwkJCQl9Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNvbnRyb2wuZ2V0Qm91bmRzKCk7Ci0KLQkJCQkvLyBPbmx5IHVwZGF0ZSB0aGUgY29udHJvbCdzIHdpZHRoIGlmIGl0J3MKLQkJCQkvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzaXplCi0JCQkJaWYgKGJvdW5kcy53aWR0aCAhPSBzaXplLngpIHsKLQkJCQkJbG9ja2VkID0gdHJ1ZTsKLQotCQkJCQl0cnkgewotLy8JCQkJCQljb250cm9sLnNldEJvdW5kcyhib3VuZHMueCwgYm91bmRzLnksIHNpemUueCwgc2l6ZS55KTsKLQkJCQkJCWNvbnRyb2wuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkKLQkJCQkJewotCQkJCQkJbG9ja2VkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgQ29udHJvbCBzb3VyY2UoKSB7Ci0JCQlyZXR1cm4gY29udHJvbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCi0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzYi5hcHBlbmQoIkNhY2hlZCBzaXplPSIpOwotCQkJc2IuYXBwZW5kKGNhY2hlZFNpemUpOwotCQkJc2IuYXBwZW5kKCIsIENvbnRyb2w9Iik7Ci0JCQlzYi5hcHBlbmQoY29udHJvbCk7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGlzdGVuZXIgYWRkZWQgdG8gZWFjaCBvZiB0aGUgY29udHJvbCB0aGF0IGlzIG5vdGlmaWVkIGluIG9yZGVyIHRvCi0JICogcmV2YWxpZGF0ZSB0aGUgcHJlZmVycmVkIHNpemUuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBMaXN0ZW5lckhhbmRsZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlDb250cm9sQWxpZ25lci50aGlzLnJldmFsaWRhdGUoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPiBoZWxwcyB0byBlbmNhcHN1bGF0ZSBoZXRlcm9nZW5lb3VzIG9iamVjdHMgYW5kCi0JICogYXBwbHkgdGhlIHNhbWUgYmVoYXZpb3Igb24gdGhlbS4KLQkgKi8KLQlwcml2YXRlIGludGVyZmFjZSBXcmFwcGVyIHsKLQkgICAvKioKLQkJICogQWRkcyB0aGUgZ2l2ZW4gPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIHdyYXBwZWQgb2JqZWN0IGluIG9yZGVyIHRvCi0JCSAqIHJlY2VpdmUgbm90aWZpY2F0aW9uIHdoZW4gaXRzIHByb3BlcnR5IGNoYW5nZWQuCi0JCSAqCi0JCSAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIGJlIGFkZGVkCi0JCSAqLwotCQl2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgY2FjaGVkIHNpemUgb2YgdGhlIGVuY2Fwc3VsYXRlZCBzb3VyY2UuCi0JCSAqCi0JCSAqIEByZXR1cm4gQSBub24tPGNvZGU+bnVsbDwvY29kZT4gPGNvZGU+UG9pbnQ8L2NvZGU+IHdoZXJlIHRoZSB4IGlzIHRoZQotCQkgKiB3aWR0aCBhbmQgdGhlIHkgaXMgdGhlIGhlaWdodCBvZiB0aGUgd2lkZ2V0Ci0JCSAqLwotCQlQb2ludCBjYWNoZWRTaXplKCk7Ci0KLQkJLyoqCi0JCSAqIENhbGN1bGF0ZXMgdGhlIHByZWZlcnJlZCBzaXplIHRoZSB3cmFwcGVkIG9iamVjdCB3b3VsZCB0YWtlIGJ5IGl0c2VsZi4KLQkJICoKLQkJICogQHJldHVybiBUaGUgY2FsY3VsYXRlZCBzaXplCi0JCSAqLwotCQlQb2ludCBjYWxjdWxhdGVTaXplKCk7Ci0KLQkJLyoqCi0JCSAqIFByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiB3aGVuIHJlY2FsY3VsYXRpbmcgdGhlIHByZWZlcnJlZCB3aWR0aC4KLQkJICogVGhpcyBoYXBwZW5zIGluIGFuIGhpZXJhcmNoeSBvZiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT5zLgotCQkgKgotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIHByZXZlbnQgdGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPiBmcm9tCi0JCSAqIGJlaW5nIGludmFsaWRhdGVkOyBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JCSAqLwotCQlib29sZWFuIGxvY2tlZCgpOwotCi0JCS8qKgotCQkgKiBSZW1vdmVzIHRoZSBnaXZlbiA8Y29kZT5MaXN0ZW5lcjwvY29kZT4uCi0JCSAqCi0JCSAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIGJlIHJlbW92ZWQKLQkJICovCi0JCXZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBzaXplIG9uIHRoZSBlbmNhcHN1bGF0ZWQgc291cmNlLgotCQkgKgotCQkgKiBAcGFyYW0gc2l6ZSBUaGUgbmV3IHNpemUKLQkJICovCi0JCXZvaWQgc2V0U2l6ZShQb2ludCBzaXplKTsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgZW5jYXBzdWxhdGVkIG9iamVjdC4KLQkJICoKLQkJICogQHJldHVybiBUaGUgb2JqZWN0IHRoYXQgaXMgYmVlbiB3cmFwcGVkCi0JCSAqLwotCQlPYmplY3Qgc291cmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvQ29udHJvbFN3aXRjaGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0NvbnRyb2xTd2l0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDQ2MzFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvQ29udHJvbFN3aXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIFRoaXMgY29udHJvbGxlciBpcyByZXNwb25zaWJsZSB0byBzd2l0Y2ggdGhlIGFjdGl2ZSBwYWdlIGJhc2VkIG9uIGEgdmFsdWUuIEEKLSAqIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiBpcyB1c2VkIHRvIHRyYW5zZm9ybWVkIHRoYXQgdmFsdWUgaW50byBhCi0gKiA8Y29kZT5Db250cm9sPC9jb2RlPi4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyb2xTd2l0Y2hlcgotewotCS8qKgotCSAqIFRoZSB3aWRnZXQgdGhhdCBpcyB1c2VkIHRvIHNob3cgdGhlIGFjdGl2ZSA8Y29kZT5Db250cm9sPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIFBhZ2VCb29rIHBhZ2VCb29rOwotCi0JLyoqCi0JICogVGhlIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgaW50byBhCi0JICogPGNvZGU+Q29udHJvbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjw/LCBDb250cm9sPiBwYW5lVHJhbnNmb3JtZXI7Ci0KLQlwcml2YXRlIExhYmVsIGVtcHR5TGFiZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xTd2l0Y2hlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3dpdGNoSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJldHJpZXZlCi0JICogdGhlIHJpZ2h0IDxjb2RlPkNvbnRyb2w8L2NvZGU+IHdoZW4gcGFzc2VkIHRvIHRoZSBnaXZlbiB0cmFuc2Zvcm1lcgotCSAqIEBwYXJhbSBwYW5lVHJhbnNmb3JtZXIgVGhlIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgaW50byBhCi0JICogPGNvZGU+Q29udHJvbDwvY29kZT4KLQkgKiBAcGFyYW0gcGFnZUJvb2sgVGhlIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUKLQkgKiBpbnRvIGEgPGNvZGU+Q29udHJvbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgPFQ+IENvbnRyb2xTd2l0Y2hlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN3aXRjaEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lcjxULCBDb250cm9sPiBwYW5lVHJhbnNmb3JtZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFnZUJvb2sgcGFnZUJvb2spCi0JewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKHN3aXRjaEhvbGRlciwgcGFuZVRyYW5zZm9ybWVyLCBwYWdlQm9vayk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHN3aXRjaEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lcjw/LCBDb250cm9sPiBwYW5lVHJhbnNmb3JtZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgUGFnZUJvb2sgcGFnZUJvb2spCi0JewotCQl0aGlzLnBhZ2VCb29rICAgICAgICA9IHBhZ2VCb29rOwotCQl0aGlzLnBhbmVUcmFuc2Zvcm1lciA9IHBhbmVUcmFuc2Zvcm1lcjsKLQotCQl0aGlzLmVtcHR5TGFiZWwgPSB0aGlzLmJ1aWxkRW1wdHlMYWJlbCgpOwotCi0JCXN3aXRjaEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkKLQkJKTsKLQotCQlzd2l0Y2hQYWdlcyhzd2l0Y2hIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLy9CdWlsZCBhbiBlbXB0eSBsYWJlbCB0byBkaXNwbGF5IGluIHRoZSBwYWdlIGJvb2sgd2hlbiB0aGUgcGFuZVRyYW5zZm9ybWVyIHJldHVybnMgbnVsbC4KLQkvL1NXVC5TSEFET1dfTk9ORSBtYWtlcyB0aGUgbGluZSBzZXBhcmF0b3Igbm90IHZpc2libGUKLQkvL1RoaXMgaXMgdGhlIGJlc3Qgd2UgY2FuIGNvbWUgdXAgd2l0aCBmb3IgYW4gZW1wdHkgcGFnZQotCXByaXZhdGUgTGFiZWwgYnVpbGRFbXB0eUxhYmVsKCkgewotCQlyZXR1cm4gbmV3IExhYmVsKHRoaXMucGFnZUJvb2ssIFNXVC5TRVBBUkFUT1IgfCBTV1QuU0hBRE9XX05PTkUgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigKLQkJCWJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJc3dpdGNoUGFnZXMoZS5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBTd2l0Y2hlcyB0aGUgYWN0aXZlIHBhZ2UgYnkgdHJhbnNmb3JtaW5nIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIGl0cwotCSAqIGNvcnJlc3BvbmRpbmcgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RhdGUgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm1lciBpbiBvcmRlciB0byByZXRyaWV2ZSB0aGUKLQkgKiBuZXcgcGFuZQotCSAqLwotCXByaXZhdGUgdm9pZCBzd2l0Y2hQYWdlcyhPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHRoaXMucGFnZUJvb2suaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBSZXRyaWV2ZSB0aGUgQ29udHJvbCBmb3IgdGhlIG5ldyB2YWx1ZQotCQlDb250cm9sIHBhZ2UgPSB0cmFuc2Zvcm0odmFsdWUpOwotCi0JCWlmIChwYWdlID09IG51bGwpIHsKLQkJCS8vTm90ZTogV2UgY2FuJ3QgcGFzcyBpbiBudWxsIGR1ZSB0byBhIGJ1ZyBpbiBQYWdlQm9vawotCQkJcGFnZSA9IHRoaXMuZW1wdHlMYWJlbDsKLQkJfQotCQl0aGlzLnBhZ2VCb29rLnNob3dQYWdlKHBhZ2UpOwotCi0JCS8vIFJldmFsaWRhdGUgdGhlIHBhcmVudHMgaW4gb3JkZXIgdG8gdXBkYXRlIHRoZSBsYXlvdXQKLQkJU1dUVXRpbC5yZWZsb3codGhpcy5wYWdlQm9vayk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBDb250cm9sIHRyYW5zZm9ybShPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuICgoVHJhbnNmb3JtZXI8T2JqZWN0LCBDb250cm9sPikgdGhpcy5wYW5lVHJhbnNmb3JtZXIpLnRyYW5zZm9ybSh2YWx1ZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZWJiMzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotCi0vKioKLSAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5MYWJlbGVkQ29udHJvbDwvY29kZT4gdGhhdCB1cGRhdGVzIGEKLSAqIDxjb2RlPkJ1dHRvbjwvY29kZT4gd2hlbiByZXF1aXJlZC4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZEJ1dHRvbiBpbXBsZW1lbnRzIExhYmVsZWRDb250cm9sCi17Ci0JLyoqCi0JICogVGhlIGJ1dHRvbiB0byBiZSB1cGRhdGVkIHdpdGggYSBkaWZmZXJlbnQgaWNvbiBhbmQgdGV4dC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBidXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkxhYmVsZWRCdXR0b248L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIHRoYXQgd2lsbCBoYXZlIGl0cyB0ZXh0IGFuZCBpY29uIHVwZGF0ZWQgd2hlbgotCSAqIHJlcXVpcmVkCi0JICogQGV4Y2VwdGlvbiBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gSWYgdGhlIGdpdmVuIDxjb2RlPkJ1dHRvbjwvY29kZT4gaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBMYWJlbGVkQnV0dG9uKEJ1dHRvbiBidXR0b24pIHsKLQkJc3VwZXIoKTsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGJ1dHRvbiwgIlRoZSBidXR0b24gY2Fubm90IGJlIG51bGwiKTsKLQkJdGhpcy5idXR0b24gPSBidXR0b247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJaWYgKCF0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuYnV0dG9uLnNldEltYWdlKGltYWdlKTsKLQkJCXRoaXMuYnV0dG9uLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKCF0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCQl0aGlzLmJ1dHRvbi5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOTcxNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGlzIDxjb2RlPkxhYmVsZWRDb250cm9sPC9jb2RlPiBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIGEgd2lkZ2V0IGFuZCB1cGRhdGUKLSAqIGl0cyBwcm9wZXJ0aWVzIChpY29uIGFuZCB0ZXh0KS4KLSAqCi0gKiBAc2VlIExhYmVsZWRCdXR0b24KLSAqIEBzZWUgTGFiZWxlZExhYmVsCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGFiZWxlZENvbnRyb2wgewotCS8qKgotCSAqIFBhc3NlcyB0aGUgaW1hZ2Ugc28gdGhlIHdyYXBwZWQgY29tcG9uZW50IGNhbiByZWNlaXZlIGl0LgotCSAqCi0JICogQHBhcmFtIGltYWdlIFRoZSBuZXcgPGNvZGU+SW1hZ2U8L2NvZGU+Ci0JICovCi0Jdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSk7Ci0KLQkvKioKLQkgKiBQYXNzZXMgdGhlIHRleHQgc28gdGhlIHdyYXBwZWQgY29tcG9uZW50IGNhbiByZWNlaXZlIGl0LgotCSAqCi0JICogQHBhcmFtIHRleHQgVGhlIG5ldyB0ZXh0Ci0JICovCi0Jdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2xVcGRhdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjMzM2FhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2xVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGlzIHVwZGF0ZXIgaXMgcmVzcG9uc2libGUgdG8gdXBkYXRlIHRoZSA8Y29kZT5MYWJlbGVkQ29udHJvbDwvY29kZT4gd2hlbgotICogdGhlIHRleHQgYW5kIHRoZSBpY29uIG5lZWQgdG8gY2hhbmdlLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIgewotCi0JLyoqCi0JICogVGhlIHdyYXBwZXIgYXJvdW5kIGEgY29udHJvbCB0aGF0IGhhcyB0ZXh0IGFuZCBpY29uLgotCSAqLwotCXByaXZhdGUgTGFiZWxlZENvbnRyb2wgbGFiZWxlZENvbnRyb2w7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkxhYmVsZWRDb250cm9sVXBkYXRlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbGFiZWxlZENvbnRyb2wgVGhlIHdyYXBwZXIgYXJvdW5kIHRoZSBjb250cm9sIHRoYXQgbmVlZHMgdG8KLQkgKiBoYXZlIGl0cyB0ZXh0IHVwZGF0ZWQKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIHRoaXMgY2xhc3Mgd2lsbCBsaXN0ZW4gZm9yIGNoYW5nZXMKLQkgKi8KLQlwdWJsaWMgTGFiZWxlZENvbnRyb2xVcGRhdGVyKExhYmVsZWRDb250cm9sIGxhYmVsZWRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcikKLQl7Ci0JCXRoaXMobGFiZWxlZENvbnRyb2wsIHRleHRIb2xkZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TGFiZWxlZENvbnRyb2xVcGRhdGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBsYWJlbGVkQ29udHJvbCBUaGUgd3JhcHBlciBhcm91bmQgdGhlIGNvbnRyb2wgdGhhdCBuZWVkcyB0bwotCSAqIGhhdmUgaXRzIGltYWdlIGFuZCB0ZXh0IHVwZGF0ZWQKLQkgKiBAcGFyYW0gaW1hZ2VIb2xkZXIgVGhlIGhvbGRlciB0aGlzIGNsYXNzIHdpbGwgbGlzdGVuIGZvciBjaGFuZ2VzIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHRleHQgbmV2ZXIgY2hhbmdlcwotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgdGhpcyBjbGFzcyB3aWxsIGxpc3RlbiBmb3IgY2hhbmdlcyBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbWFnZSBuZXZlciBjaGFuZ2VzCi0JICovCi0JcHVibGljIExhYmVsZWRDb250cm9sVXBkYXRlcihMYWJlbGVkQ29udHJvbCBsYWJlbGVkQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGltYWdlSG9sZGVyKQotCXsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZShsYWJlbGVkQ29udHJvbCwgdGV4dEhvbGRlciwgaW1hZ2VIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEljb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcihidWlsZEljb25MaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkSWNvbkxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxhYmVsZWRDb250cm9sVXBkYXRlci50aGlzLnNldEltYWdlKChJbWFnZSkgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiTGFiZWxlZENvbnRyb2xVcGRhdGVyLmltYWdlTGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRleHRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcihidWlsZFRleHRMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVGV4dExpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxhYmVsZWRDb250cm9sVXBkYXRlci50aGlzLnNldFRleHQoKFN0cmluZykgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiTGFiZWxlZENvbnRyb2xVcGRhdGVyLnRleHRMaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoTGFiZWxlZENvbnRyb2wgbGFiZWxlZENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGltYWdlSG9sZGVyKQotCXsKLQkJQXNzZXJ0LmlzTm90TnVsbChsYWJlbGVkQ29udHJvbCwgIlRoZSBMYWJlbGVkQ29udHJvbCBjYW5ub3QgYmUgbnVsbCIpOwotCi0JCXRoaXMubGFiZWxlZENvbnRyb2wgPSBsYWJlbGVkQ29udHJvbDsKLQotCQlpZiAodGV4dEhvbGRlciAhPSBudWxsKSB7Ci0JCQl0ZXh0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWlsZFRleHRMaXN0ZW5lcigpKTsKLQkJCXNldFRleHQodGV4dEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJfQotCi0JCWlmIChpbWFnZUhvbGRlciAhPSBudWxsKSB7Ci0JCQlpbWFnZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVpbGRJY29uTGlzdGVuZXIoKSk7Ci0JCQlzZXRJbWFnZShpbWFnZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRJbWFnZShJbWFnZSBpY29uKSB7Ci0JCWxhYmVsZWRDb250cm9sLnNldEltYWdlKGljb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0KLQkJaWYgKHRleHQgPT0gbnVsbCkgewotCQkJdGV4dCA9ICIiOwotCQl9Ci0KLQkJbGFiZWxlZENvbnRyb2wuc2V0VGV4dCh0ZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZExhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDAzMGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+TGFiZWxlZENvbnRyb2w8L2NvZGU+IHRoYXQgdXBkYXRlcyBhbgotICogPGNvZGU+TGFiZWw8L2NvZGU+IHdoZW4gcmVxdWlyZWQuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIExhYmVsZWRMYWJlbCBpbXBsZW1lbnRzIExhYmVsZWRDb250cm9sCi17Ci0JLyoqCi0JICogVGhlIGxhYmVsIHRvIGJlIHVwZGF0ZWQgd2l0aCBhIGRpZmZlcmVudCBpY29uIGFuZCB0ZXh0LgotCSAqLwotCXByaXZhdGUgZmluYWwgTGFiZWwgbGFiZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkxhYmVsZWRCdXR0b248L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB0aGF0IHdpbGwgaGF2ZSBpdHMgdGV4dCBhbmQgaWNvbiB1cGRhdGVkIHdoZW4KLQkgKiByZXF1aXJlZAotCSAqIEBleGNlcHRpb24gQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIElmIHRoZSBnaXZlbiA8Y29kZT5MYWJlbDwvY29kZT4gaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBMYWJlbGVkTGFiZWwoTGFiZWwgbGFiZWwpIHsKLQkJc3VwZXIoKTsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGxhYmVsLCAiVGhlIGxhYmVsIGNhbm5vdCBiZSBudWxsIik7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQlpZiAoIXRoaXMubGFiZWwuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxhYmVsLnNldEltYWdlKGltYWdlKTsKLQkJCXRoaXMubGFiZWwuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoIXRoaXMubGFiZWwuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxhYmVsLnNldFRleHQodGV4dCk7Ci0JCQl0aGlzLmxhYmVsLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExMjg4MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1BhbmVFbmFibGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIDxjb2RlPlBhbmVFbmFibGVyPC9jb2RlPiBrZWVwcyB0aGUgImVuYWJsZWQiIHN0YXRlIG9mIGEgY29sbGVjdGlvbiBvZgotICogY29udHJvbHMgaW4gc3luY2ggd2l0aCB0aGUgcHJvdmlkZWQgYm9vbGVhbiBob2xkZXIuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYW5lRW5hYmxlciBleHRlbmRzIFN0YXRlQ29udHJvbGxlcgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZUVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIGRpc2FibGVkKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHdob3NlICJlbmFibGVkIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUKLQkgKiBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIFBhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBQYW5lPD8+IHBhbmUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBkaXNhYmxlZCkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgImVuYWJsZWQiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIFBhbmU8Pz4uLi4gcGFuZXMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHBhbmVzKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZUVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgd2hvc2UgImVuYWJsZWQiIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZQotCSAqIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFBhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBQYW5lPD8+IHBhbmUsCi0JICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuc2luZ2xldG9uSXRlcmF0b3IocGFuZSksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBUaGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAiZW5hYmxlZCIgc3RhdGUgaXMga2VwdCBpbiBzeW5jCi0JICogd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIFBhbmU8Pz5bXSBwYW5lcywKLQkgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihwYW5lcyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSnBhQ29udHJvbGxlckVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlCi0JICogb2YqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBkaXNhYmxlZCkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgImVuYWJsZWQiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBwYW5lcywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzZUpwYUNvbnRyb2xsZXJFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBUaGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAiZW5hYmxlZCIgc3RhdGUgaXMga2VwdCBpbiBzeW5jCi0JICogd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzLAotCSAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZXMuaXRlcmF0b3IoKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2VKcGFDb250cm9sbGVyRW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gZGlzYWJsZWQpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIEFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJlbmFibGVkIiBzdGF0ZQotCSAqIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIFBhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmVzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSnBhQ29udHJvbGxlckVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIEFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJlbmFibGVkIiBzdGF0ZQotCSAqIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzLAotCSAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXN1cGVyKGJvb2xlYW5Ib2xkZXIsIHdyYXAocGFuZXMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248Q29udHJvbEhvbGRlcj4gd3JhcChJdGVyYXRvcjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBhbmU8Pz4sIENvbnRyb2xIb2xkZXI+KHBhbmVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb250cm9sSG9sZGVyIHRyYW5zZm9ybShQYW5lPD8+IHBhbmUpIHsKLQkJCQlyZXR1cm4gbmV3IFBhbmVIb2xkZXIocGFuZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaG9sZGVyIGhvbGRzIG9udG8gYW4gPGNvZGU+UGFuZTwvY29kZT4gYW5kIHVwZGF0ZSBpdHMgZW5hYmxlZAotCSAqIHN0YXRlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFBhbmVIb2xkZXIgaW1wbGVtZW50cyBDb250cm9sSG9sZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBQYW5lPD8+IHBhbmU7Ci0KLQkJUGFuZUhvbGRlcihQYW5lPD8+IHBhbmUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnBhbmUgPSBwYW5lOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlU3RhdGUoYm9vbGVhbiBzdGF0ZSkgewotCQkJaWYgKCF0aGlzLnBhbmUuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCXRoaXMucGFuZS5lbmFibGVXaWRnZXRzKHN0YXRlKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9QYW5lVmlzaWJpbGl0eUVuYWJsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U2ZjAzZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgPGNvZGU+UGFuZVZpc2liaWxpdHlFbmFibGVyPC9jb2RlPiBrZWVwcyB0aGUgInZpc2libGUiIHN0YXRlIG9mIGEKLSAqIGNvbGxlY3Rpb24gb2YgY29udHJvbHMgaW4gc3luY2ggd2l0aCB0aGUgcHJvdmlkZWQgYm9vbGVhbiBob2xkZXIuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIgZXh0ZW5kcyBTdGF0ZUNvbnRyb2xsZXIKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gbm90IHZpc2libGUpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgd2hvc2UgInZpc2libGUiIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZQotCSAqIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuZTw/PiBwYW5lKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBwYW5lLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIG5vdCB2aXNpYmxlKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBUaGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMga2VwdCBpbiBzeW5jCi0JICogd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lPD8+Li4uIHBhbmVzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihwYW5lcyksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlCi0JICogYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuZTw/PiBwYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcihwYW5lKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZVZpc2liaWxpdHlFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBUaGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMga2VwdCBpbiBzeW5jCi0JICogd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuZTw/PltdIHBhbmVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihwYW5lcyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIG5vdCB2aXNpYmxlKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBUaGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMga2VwdCBpbiBzeW5jCi0JICogd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQYW5lPD8+PiBwYW5lcykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZXMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgInZpc2libGUiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFBhbmVWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmVzLml0ZXJhdG9yKCksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIG5vdCB2aXNpYmxlKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBBbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAidmlzaWJsZSIgc3RhdGUKLQkgKiBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmVzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIEFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJ2aXNpYmxlIiBzdGF0ZQotCSAqIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXN1cGVyKGJvb2xlYW5Ib2xkZXIsIHdyYXAocGFuZXMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248Q29udHJvbEhvbGRlcj4gd3JhcChJdGVyYXRvcjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBhbmU8Pz4sIENvbnRyb2xIb2xkZXI+KHBhbmVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb250cm9sSG9sZGVyIHRyYW5zZm9ybShQYW5lPD8+IHBhbmUpIHsKLQkJCQlyZXR1cm4gbmV3IFBhbmVIb2xkZXIocGFuZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaG9sZGVyIGhvbGRzIG9udG8gYW4gPGNvZGU+UGFuZTwvY29kZT4gYW5kIHVwZGF0ZSBpdHMgdmlzaWJsZQotCSAqIHN0YXRlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFBhbmVIb2xkZXIgaW1wbGVtZW50cyBDb250cm9sSG9sZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBQYW5lPD8+IHBhbmU7Ci0KLQkJUGFuZUhvbGRlcihQYW5lPD8+IHBhbmUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnBhbmUgPSBwYW5lOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlU3RhdGUoYm9vbGVhbiBzdGF0ZSkgewotCQkJdGhpcy5wYW5lLnNldFZpc2libGUoc3RhdGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9TV1RVdGlsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1NXVFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAzOWQwOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1NXVFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5OdWxsUG9zdEV4ZWN1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Qb3N0RXhlY3V0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLQotLyoqCi0gKiBBIHN1aXRlIG9mIHV0aWxpdHkgbWV0aG9kcyByZWxhdGVkIHRvIHRoZSB1c2VyIGludGVyZmFjZS4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU1dUVXRpbCB7Ci0KLQkvKioKLQkgKiBDYXVzZXMgdGhlIDxjb2RlPnJ1bigpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIGdpdmVuIHJ1bm5hYmxlIHRvIGJlIGludm9rZWQKLQkgKiBieSB0aGUgdXNlci1pbnRlcmZhY2UgdGhyZWFkIGF0IHRoZSBuZXh0IHJlYXNvbmFibGUgb3Bwb3J0dW5pdHkuIFRoZSBjYWxsZXIKLQkgKiBvZiB0aGlzIG1ldGhvZCBjb250aW51ZXMgdG8gcnVuIGluIHBhcmFsbGVsLCBhbmQgaXMgbm90IG5vdGlmaWVkIHdoZW4gdGhlCi0JICogcnVubmFibGUgaGFzIGNvbXBsZXRlZC4KLQkgKgotCSAqIEBwYXJhbSBydW5uYWJsZSBDb2RlIHRvIHJ1biBvbiB0aGUgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uCi0JICogPHVsPgotCSAqIDxsaT5FUlJPUl9ERVZJQ0VfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotCSAqIDwvdWw+Ci0JICogQHNlZSAjc3luY0V4ZWMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXN5bmNFeGVjKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCWdldFN0YW5kYXJkRGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogVHdlYWtzIHRoZSBnaXZlbiA8Y29kZT5Db21ibzwvY29kZT4gdG8gcmVtb3ZlIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlCi0JICogd2lkZ2V0IHJlY2VpdmVzIHRoZSBmb2N1cyBhbmQgdG8gc2hvdyB0aGUgZGVmYXVsdCB3aGVuIHRoZSB3aWRnZXQgbG9zZXMKLQkgKiB0aGUgZm9jdXMuCi0JICoKLQkgKiBAcGFyYW0gY29tYm8gVGhlIHdpZGdldCBoYXZpbmcgYSBkZWZhdWx0IHZhbHVlIHRoYXQgaXMgYWx3YXlzIGF0IHRoZQotCSAqIGJlZ2lubmluZyBvZiB0aGUgbGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKENvbWJvIGNvbWJvKSB7Ci0JCUNvbWJvSGFuZGxlciBoYW5kbGVyID0gbmV3IENvbWJvSGFuZGxlcigpOwotCQljb21iby5hZGRGb2N1c0xpc3RlbmVyKGhhbmRsZXIpOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihoYW5kbGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGxvY2FsaXplZCBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gTkxTIGNsYXNzIGJ5IGNyZWF0aW5nIHRoZQotCSAqIGtleS4gVGhhdCBrZXkgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGNvbXBvc2l0ZSdzIHNob3J0IGNsYXNzIG5hbWUKLQkgKiB3aXRoIHRoZSB0b1N0cmluZygpIG9mIHRoZSBnaXZlbiB2YWx1ZSBzZXBhcmF0ZWQgYnkgYW4gdW5kZXJzY29yZS4KLQkgKgotCSAqIEBwYXJhbSBubHNDbGFzcyBUaGUgTkxTIGNsYXNzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGxvY2FsaXplZCB0ZXh0Ci0JICogQHBhcmFtIGNvbXBvc2l0ZUNsYXNzIFRoZSBjbGFzcyB1c2VkIGZvciBjcmVhdGluZyB0aGUga2V5LCBpdHMgc2hvcnQgY2xhc3MKLQkgKiBuYW1lIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGtleQotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdXNlZCB0byBhcHBlbmQgaXRzIHRvU3RyaW5nKCkgdG8gdGhlIGdlbmVyYXRlZCBrZXkKLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGREaXNwbGF5U3RyaW5nKENsYXNzPD8+IG5sc0NsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiBjb21wb3NpdGVDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7Ci0KLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZChjb21wb3NpdGVDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotCQlzYi5hcHBlbmQoIl8iKTsKLQkJc2IuYXBwZW5kKHZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpKTsvL2J1ZyAyMzQ5NTMKLQkJLy9UT0RPIGluIGEgZnV0dXJlIHJlbGVhc2Ugd2Ugc2hvdWxkIG5vdCBiZSBjb252ZXJ0aW5nIHRoZSBrZXkgdXNpbmcgdG9Mb3dlckNhc2UoKQotCi0JCXJldHVybiAoU3RyaW5nKSBSZWZsZWN0aW9uVG9vbHMuZ2V0U3RhdGljRmllbGRWYWx1ZShubHNDbGFzcywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGZyb20gdGhlIGdpdmVuIE5MUyBjbGFzcyBieSBjcmVhdGluZyB0aGUKLQkgKiBrZXkuIFRoYXQga2V5IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBjb21wb3NpdGUncyBzaG9ydCBjbGFzcyBuYW1lCi0JICogd2l0aCB0aGUgdG9TdHJpbmcoKSBvZiB0aGUgZ2l2ZW4gdmFsdWUgc2VwYXJhdGVkIGJ5IGFuIHVuZGVyc2NvcmUuCi0JICoKLQkgKiBAcGFyYW0gbmxzQ2xhc3MgVGhlIE5MUyBjbGFzcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBsb2NhbGl6ZWQgdGV4dAotCSAqIEBwYXJhbSBjb21wb3NpdGUgVGhlIG9iamVjdCB1c2VkIHRvIHJldHJpZXZlIHRoZSBzaG9ydCBjbGFzcyBuYW1lIHRoYXQgaXMKLQkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHVzZWQgdG8gYXBwZW5kIGl0cyB0b1N0cmluZygpIHRvIHRoZSBnZW5lcmF0ZWQga2V5Ci0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGJ1aWxkRGlzcGxheVN0cmluZyhDbGFzczw/PiBubHNDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7Ci0KLQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZyhubHNDbGFzcywgY29tcG9zaXRlLmdldENsYXNzKCksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSA8Y29kZT5SdW5uYWJsZTwvY29kZT4gdGhhdCB3aWxsIGludm9rZSB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5Qb3N0RXhlY3V0aW9uPC9jb2RlPiBpbiBvcmRlciB0byBpdHMgZXhlY3V0aW9uIHRvIGJlIGRvbmUgaW4gdGhlCi0JICogVUkgdGhyZWFkLgotCSAqCi0JICogQHBhcmFtIGRpYWxvZyBUaGUgZGlhbG9nIHRoYXQgd2FzIGp1c3QgZGlwb3NlZAotCSAqIEBwYXJhbSBwb3N0RXhlY3V0aW9uIFRoZSBwb3N0IGV4ZWN1dGlvbiBvbmNlIHRoZSBkaWFsb2cgaXMgZGlzcG9zZWQKLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5SdW5uYWJsZTwvY29kZT4gdGhhdCB3aWxsIGludm9rZQotCSAqIHtAbGluayBQb3N0RXhlY3V0aW9uI2V4ZWN1dGUoRGlhbG9nKX0KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyA8RDEgZXh0ZW5kcyBEaWFsb2csIEQyIGV4dGVuZHMgRDE+Ci0JCVJ1bm5hYmxlIGJ1aWxkUG9zdEV4ZWN1dGlvblJ1bm5hYmxlKAotCQkJZmluYWwgRDEgZGlhbG9nLAotCQkJZmluYWwgUG9zdEV4ZWN1dGlvbjxEMj4gcG9zdEV4ZWN1dGlvbikgewotCi0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2V0VXNlckludGVyZmFjZUFjdGl2ZShmYWxzZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJcG9zdEV4ZWN1dGlvbi5leGVjdXRlKChEMikgZGlhbG9nKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCXNldFVzZXJJbnRlcmZhY2VBY3RpdmUodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBzaGVsbC4gSWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzCi0JICogbm90IHRoZSBVSSB0aHJlYWQsIHRoZW4gYW4gaW52YWxpZCB0aHJlYWQgYWNjZXNzIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHNoZWxsLCBuZXZlciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIGFjdGl2ZSBzaGVsbCwgd2hpY2ggY2FuIGJlIHRoZSBzaGVsbCBmcm9tIGFueSB3aW5kb3cKLQkJU2hlbGwgc2hlbGwgPSBnZXRTdGFuZGFyZERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCi0JCS8vIE5vIHNoZWxsIGNvdWxkIGJlIGZvdW5kLCByZXZlcnQgYmFjayB0byB0aGUgYWN0aXZlIHdvcmtiZW5jaCB3aW5kb3cKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCXNoZWxsID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJfQotCi0JCS8vIE1ha2Ugc3VyZSBpdCdzIG5ldmVyIG51bGwKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCXNoZWxsID0gbmV3IFNoZWxsKGdldFN0YW5kYXJkRGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpc3BsYXkgdG8gYmUgdXNlZC4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MsIGlmIHRoZQotCSAqIHRocmVhZCBjYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBhbiBhc3NvY2lhdGVkIGRpc3BsYXkuIElmIHNvLCB0aGlzIGRpc3BsYXkKLQkgKiBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgZGVmYXVsdCBkaXNwbGF5LgotCSAqCi0JICogQHJldHVybiBUaGUgY3VycmVudCBkaXNwbGF5IGlmIG5vdCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UgdGhlIGRlZmF1bHQKLQkgKiBkaXNwbGF5IGlzIHJldHVybmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFN0YW5kYXJkRGlzcGxheSgpCi0JewotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQotCQlpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCX0KLQotCQlyZXR1cm4gZGlzcGxheTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRUYWJsZUhlaWdodEhpbnQoVGFibGUgdGFibGUsIGludCByb3dzKSB7Ci0JCWlmICh0YWJsZS5nZXRGb250KCkuZXF1YWxzKEpGYWNlUmVzb3VyY2VzLmdldERlZmF1bHRGb250KCkpKQotCQkJdGFibGUuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlpbnQgcmVzdWx0PSB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgKiByb3dzICsgdGFibGUuZ2V0SGVhZGVySGVpZ2h0KCk7Ci0JCWlmICh0YWJsZS5nZXRMaW5lc1Zpc2libGUoKSkKLQkJCXJlc3VsdCs9IHRhYmxlLmdldEdyaWRMaW5lV2lkdGgoKSAqIChyb3dzIC0gMSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0gICAvKioKLQkgKiBSZXR1cm5zIHRoZSBQbGF0Zm9ybSBVSSB3b3JrYmVuY2guCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB3b3JrYmVuY2ggZm9yIHRoaXMgcGx1Zy1pbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCX0KLQotCS8qKgotCSAqIFJlbGF5cyBvdXQgdGhlIHBhcmVudHMgb2YgdGhlIDxjb2RlPkNvbnRyb2w8L2NvZGU+LiBUaGlzIHdhcyB0YWtlbiBmcm9tCi0JICogdGhlIHdpZGdldCA8Y29kZT5TZWN0aW9uPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHRvIHJldmFsaWRhdGUgYXMgd2VsbCBhcyBpdHMgcGFyZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZsb3coQ29tcG9zaXRlIHBhbmUpIHsKLQotCQlmb3IgKENvbXBvc2l0ZSBjb21wb3NpdGUgPSBwYW5lOyBjb21wb3NpdGUgIT0gbnVsbDsgKSB7Ci0JCQljb21wb3NpdGUuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCWNvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLQotCQkJaWYgKGNvbXBvc2l0ZSBpbnN0YW5jZW9mIFNjcm9sbGVkRm9ybSB8fCBjb21wb3NpdGUgaW5zdGFuY2VvZiBTaGVsbCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJZm9yIChDb21wb3NpdGUgY29tcG9zaXRlID0gcGFuZTsgY29tcG9zaXRlICE9IG51bGw7ICkgewotCQkJY29tcG9zaXRlLmxheW91dCh0cnVlKTsKLQkJCWNvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLQotCQkJaWYgKGNvbXBvc2l0ZSBpbnN0YW5jZW9mIFNjcm9sbGVkRm9ybSkgewotCQkJCSgoU2Nyb2xsZWRGb3JtKSBjb21wb3NpdGUpLnJlZmxvdyh0cnVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWZvciAoQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHBhbmU7IGNvbXBvc2l0ZSAhPSBudWxsOyApIHsKLQkJCWNvbXBvc2l0ZS5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQljb21wb3NpdGUgPSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0KLQkJCWlmIChjb21wb3NpdGUgaW5zdGFuY2VvZiBTY3JvbGxlZEZvcm0gfHwgY29tcG9zaXRlIGluc3RhbmNlb2YgU2hlbGwpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgZW50aXJlIHNoZWxsIGFuZCBpdHMgd2lkZ2V0cyBzaG91bGQgYmUgZW5hYmxlZCBvcgotCSAqIGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIHVuYWNjZXNzaWJsZS4KLQkgKgotCSAqIEBwYXJhbSBhY3RpdmUgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSBhbGwgdGhlIFVJIGFjdGl2ZSBvdGhlcndpc2UKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gZGVhY3RpdmF0ZSBpdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVc2VySW50ZXJmYWNlQWN0aXZlKGJvb2xlYW4gYWN0aXZlKSB7Ci0JCVNoZWxsW10gc2hlbGxzID0gZ2V0U3RhbmRhcmREaXNwbGF5KCkuZ2V0U2hlbGxzKCk7Ci0KLQkJZm9yIChTaGVsbCBzaGVsbCA6IHNoZWxscykgewotCQkJc2hlbGwuc2V0RW5hYmxlZChhY3RpdmUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXN5bmNocm9ub3VzbHkgbGF1bmNoZXMgdGhlIHNwZWNpZmllZCBkaWFsb2cgaW4gdGhlIFVJIHRocmVhZC4KLQkgKgotCSAqIEBwYXJhbSBkaWFsb2cgVGhlIGRpYWxvZyB0byBzaG93IG9uIHNjcmVlbgotCSAqIEBwYXJhbSBwb3N0RXhlY3V0aW9uIFRoaXMgaW50ZXJmYWNlIGxldCB0aGUgY2FsbGVyIHRvIGludm9rZSBhIHBpZWNlIG9mCi0JICogY29kZSBvbmNlIHRoZSBkaWFsb2cgaXMgZGlzcG9zZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxEMSBleHRlbmRzIERpYWxvZywgRDIgZXh0ZW5kcyBEMT4KLQkJdm9pZCBzaG93KGZpbmFsIEQxIGRpYWxvZywgZmluYWwgUG9zdEV4ZWN1dGlvbjxEMj4gcG9zdEV4ZWN1dGlvbikgewotCi0JCXRyeSB7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKGRpYWxvZywgICAgICAgICJUaGUgZGlhbG9nIGNhbm5vdCBiZSBudWxsIik7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKHBvc3RFeGVjdXRpb24sICJUaGUgUG9zdEV4ZWN1dGlvbiBjYW5ub3QgYmUgbnVsbCIpOwotCQl9Ci0JCWNhdGNoIChBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZSkgewotCQkJLy8gTWFrZSBzdXJlIHRoZSBVSSBpcyBpbnRlcmFjdGl2ZQotCQkJc2V0VXNlckludGVyZmFjZUFjdGl2ZSh0cnVlKTsKLQkJCXRocm93IGU7Ci0JCX0KLQotCQluZXcgVGhyZWFkKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJYXN5bmNFeGVjKAotCQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJc2hvd0ltcChkaWFsb2csIHBvc3RFeGVjdXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCX0KLQkJfS5zdGFydCgpOwotCX0KLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IGxhdW5jaGVzIHRoZSBzcGVjaWZpZWQgZGlhbG9nIGluIHRoZSBVSSB0aHJlYWQuCi0JICoKLQkgKiBAcGFyYW0gZGlhbG9nIFRoZSBkaWFsb2cgdG8gc2hvdyBvbiBzY3JlZW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2hvdyhEaWFsb2cgZGlhbG9nKSB7Ci0JCXNob3coZGlhbG9nLCBOdWxsUG9zdEV4ZWN1dGlvbi48RGlhbG9nPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IGxhdW5jaGVzIHRoZSBzcGVjaWZpZWQgZGlhbG9nIGluIHRoZSBVSSB0aHJlYWQuCi0JICoKLQkgKiBAcGFyYW0gZGlhbG9nIFRoZSBkaWFsb2cgdG8gc2hvdyBvbiBzY3JlZW4KLQkgKiBAcGFyYW0gcG9zdEV4ZWN1dGlvbiBUaGlzIGludGVyZmFjZSBsZXQgdGhlIGNhbGxlciB0byBpbnZva2UgYSBwaWVjZSBvZgotCSAqIGNvZGUgb25jZSB0aGUgZGlhbG9nIGlzIGRpc3Bvc2VkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEQxIGV4dGVuZHMgRGlhbG9nLCBEMiBleHRlbmRzIEQxPgotCQl2b2lkIHNob3dJbXAoRDEgZGlhbG9nLCBQb3N0RXhlY3V0aW9uPEQyPiBwb3N0RXhlY3V0aW9uKSB7Ci0KLQkJc2V0VXNlckludGVyZmFjZUFjdGl2ZSh0cnVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQotCQlpZiAocG9zdEV4ZWN1dGlvbiAhPSBOdWxsUG9zdEV4ZWN1dGlvbi48RDI+aW5zdGFuY2UoKSkgewotCQkJYXN5bmNFeGVjKGJ1aWxkUG9zdEV4ZWN1dGlvblJ1bm5hYmxlKGRpYWxvZywgcG9zdEV4ZWN1dGlvbikpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2F1c2VzIHRoZSA8Y29kZT5ydW4oKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBnaXZlbiBydW5uYWJsZSB0byBiZSBpbnZva2VkCi0JICogYnkgdGhlIHVzZXItaW50ZXJmYWNlIHRocmVhZCBhdCB0aGUgbmV4dCByZWFzb25hYmxlIG9wcG9ydHVuaXR5LiBUaGUKLQkgKiB0aHJlYWQgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgaXMgc3VzcGVuZGVkIHVudGlsIHRoZSBydW5uYWJsZSBjb21wbGV0ZXMuCi0JICoKLQkgKiBAcGFyYW0gcnVubmFibGUgY29kZSB0byBydW4gb24gdGhlIHVzZXItaW50ZXJmYWNlIHRocmVhZC4KLQkgKiBAc2VlICNhc3luY0V4ZWMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3luY0V4ZWMoUnVubmFibGUgcnVubmFibGUpIHsKLQkJZ2V0U3RhbmRhcmREaXNwbGF5KCkuc3luY0V4ZWMocnVubmFibGUpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBVSSBldmVudCB0aHJlYWQuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0J3MgdGhlIFVJIGV2ZW50IHRocmVhZCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHVpVGhyZWFkKCkgewotCQlyZXR1cm4gZ2V0U3RhbmRhcmREaXNwbGF5KCkuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyB0aGUgVUkgZXZlbnQgdGhyZWFkIGJ5IHVzaW5nIHRoZQotCSAqIHRocmVhZCBmcm9tIHdoaWNoIHRoZSBnaXZlbiB2aWV3ZXIncyBkaXNwbGF5IHdhcyBpbnN0YW50aWF0ZWQuCi0JICoKLQkgKiBAcGFyYW0gdmlld2VyIFRoZSB2aWV3ZXIgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGN1cnJlbnQgdGhyZWFkCi0JICogaXMgdGhlIFVJIGV2ZW50IHRocmVhZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBVSSBldmVudCB0aHJlYWQ7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1aVRocmVhZChWaWV3ZXIgdmlld2VyKSB7Ci0JCXJldHVybiB1aVRocmVhZCh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyB0aGUgVUkgZXZlbnQgdGhyZWFkIGJ5IHVzaW5nIHRoZQotCSAqIHRocmVhZCBmcm9tIHdoaWNoIHRoZSBnaXZlbiB3aWRnZXQncyBkaXNwbGF5IHdhcyBpbnN0YW50aWF0ZWQuCi0JICoKLQkgKiBAcGFyYW0gd2lkZ2V0IFRoZSB3aWRnZXQgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGN1cnJlbnQgdGhyZWFkCi0JICogaXMgdGhlIFVJIGV2ZW50IHRocmVhZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBVSSBldmVudCB0aHJlYWQ7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1aVRocmVhZChXaWRnZXQgd2lkZ2V0KSB7Ci0JCXJldHVybiB3aWRnZXQuZ2V0RGlzcGxheSgpLmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXIgaXMgcmVzcG9uc2libGUgZm9yIHJlbW92aW5nIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlIGNvbWJvCi0JICogaGFzIHRoZSBmb2N1cyBvciB3aGVuIHRoZSBzZWxlY3RlZCBpdGVtIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGFuZCB0byBzZWxlY3QKLQkgKiBpdCB3aGVuIHRoZSBjb21ibyBsb3NlcyB0aGUgZm9jdXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tYm9IYW5kbGVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9jdXNMaXN0ZW5lciB7Ci0KLQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQlDb21ibyBjb21ibyA9IChDb21ibykgZS53aWRnZXQ7Ci0KLQkJCWlmIChjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IDApIHsJCi0JCQkJLy8gVGhlIHRleHQgc2VsZWN0aW9uIGhhcyB0byBiZSBjaGFuZ2VkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgdGhpcwotCQkJCS8vIGxpc3RlbmVyIG90aGVyd2lzZSB0aGUgY29tYm8gd29uJ3QgdXBkYXRlIGJlY2F1c2UgaXQncyBjdXJyZW50bHkKLQkJCQkvLyBub3RpZnlpbmcgaXRzIGxpc3RlbmVycwotCQkJCWFzeW5jRXhlYyhuZXcgU2VsZWN0VGV4dChjb21ibykpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJLy9kbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQotCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGUud2lkZ2V0OwotCi0JCQlpZiAoY29tYm8uaXNGb2N1c0NvbnRyb2woKSAmJgotCQkJICAgIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkgewotCi0JCQkJLy8gVGhlIHRleHQgaGFzIHRvIGJlIGNoYW5nZWQgb3V0c2lkZSBvZiB0aGUgY29udGV4dCBvZiB0aGlzCi0JCQkJLy8gbGlzdGVuZXIgb3RoZXJ3aXNlIHRoZSBjb21ibyB3b24ndCB1cGRhdGUgYmVjYXVzZSBpdCdzIGN1cnJlbnRseQotCQkJCS8vIG5vdGlmeWluZyBpdHMgbGlzdGVuZXJzCi0JCQkJYXN5bmNFeGVjKG5ldyBNb2RpZnlUZXh0KGNvbWJvKSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGNsYXNzIE1vZGlmeVRleHQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCQlwcml2YXRlIGZpbmFsIENvbWJvIGNvbWJvOwotCi0JCQlwdWJsaWMgTW9kaWZ5VGV4dChDb21ibyBjb21ibykgewotCQkJCXN1cGVyKCk7Ci0JCQkJdGhpcy5jb21ibyA9IGNvbWJvOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKHRoaXMuY29tYm8uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIHRleHQgPSB0aGlzLmNvbWJvLmdldFRleHQoKTsKLQotCQkJCWlmICh0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCQkJdGV4dCA9IHRoaXMuY29tYm8uZ2V0SXRlbSgwKTsKLQkJCQkJdGhpcy5jb21iby5zZXRUZXh0KHRleHQpOwotCQkJCX0KLQotCQkJCXRoaXMuY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCB0ZXh0Lmxlbmd0aCgpKSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGNsYXNzIFNlbGVjdFRleHQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCQlwcml2YXRlIGZpbmFsIENvbWJvIGNvbWJvOwotCi0JCQlwdWJsaWMgU2VsZWN0VGV4dChDb21ibyBjb21ibykgewotCQkJCXN1cGVyKCk7Ci0JCQkJdGhpcy5jb21ibyA9IGNvbWJvOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKHRoaXMuY29tYm8uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIHRleHQgPSB0aGlzLmNvbWJvLmdldFRleHQoKTsKLQkJCQl0aGlzLmNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgdGV4dC5sZW5ndGgoKSkpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvU3RhdGVDb250cm9sbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1N0YXRlQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRmMjMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvU3RhdGVDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4ga2VlcHMgdGhlIHN0YXRlIG9mIGEgY29sbGVjdGlvbiBvZiB3aWRnZXRzIGluCi0gKiBzeW5jaCB3aXRoIHRoZSBwcm92aWRlZCBib29sZWFuIGhvbGRlci4KLSAqCi0gKiBAc2VlIENvbnRyb2xFbmFibGVyCi0gKiBAc2VlIENvbnRyb2xWaXNpYmlsaXR5RW5hYmxlcgotICogQHNlZSBQYW5lRW5hYmxlcgotICogQHNlZSBQYW5lVmlzaWJpbGl0eUVuYWJsZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1hYnN0cmFjdCBjbGFzcyBTdGF0ZUNvbnRyb2xsZXIKLXsKLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBjb250cm9sSG9sZGVycyB3aXRoIGNoYW5nZXMKLQkgKiBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJvb2xlYW5DaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqLwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXI7Ci0KLQkvKioKLQkgKiBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2Ugc3RhdGUgaXMga2VwdCBpbiBzeW5jCi0JICogd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZS4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248Q29udHJvbEhvbGRlcj4gY29udHJvbEhvbGRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgc3RhdGU7IGZvciB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uIFRoZSBkZWZhdWx0IFtkZWZhdWx0IHZhbHVlXSBpcyA8Y29kZT5mYWxzZTxjb2RlPi4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZGVmYXVsdFZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+LgotCSAqLwotCVN0YXRlQ29udHJvbGxlcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2UKLQkgKiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCVN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgY29udHJvbEhvbGRlcnMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlCi0JICogc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPENvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzLAotCSAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoKTsKLQkJaW5pdGlhbGl6ZShib29sZWFuSG9sZGVyLCBjb250cm9sSG9sZGVycywgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlciBUaGUgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT4gd2hvc2Ugc3RhdGUgaXMga2VwdAotCSAqIGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCVN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgQ29udHJvbEhvbGRlciBjb250cm9sSG9sZGVyKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBjb250cm9sSG9sZGVyLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xIb2xkZXJzIFRoZSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZQotCSAqIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBDb250cm9sSG9sZGVyLi4uIGNvbnRyb2xIb2xkZXJzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihjb250cm9sSG9sZGVycyksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlciBUaGUgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT4gd2hvc2Ugc3RhdGUgaXMga2VwdAotCSAqIGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIENvbnRyb2xIb2xkZXIgY29udHJvbEhvbGRlciwKLQkgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIG5ldyBDb250cm9sSG9sZGVyW10geyBjb250cm9sSG9sZGVyIH0sIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlCi0JICogc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBDb250cm9sSG9sZGVyW10gY29udHJvbEhvbGRlcnMsCi0JICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcygpOwotCQl0aGlzLmluaXRpYWxpemUoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oY29udHJvbEhvbGRlcnMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBBbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbiBvZgotCSAqIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZSBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbgotCSAqIGhvbGRlcidzIHZhbHVlCi0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBJdGVyYXRvcjxDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oY29udHJvbEhvbGRlcnMpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xIb2xkZXJzIEFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uIG9mCi0JICogPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuCi0JICogaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBJdGVyYXRvcjxDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycywKLQkgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKCk7Ci0JCWluaXRpYWxpemUoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oY29udHJvbEhvbGRlcnMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJvb2xlYW4gcHJpbWl0aXZlIG9mIHRoZSBnaXZlbiA8Y29kZT5Cb29sZWFuPC9jb2RlPiB2YWx1ZSBidXQKLQkgKiBhbHNvIGNoZWNrcyBmb3IgPGNvZGU+bnVsbDwvY29kZT4sIGlmIHRoYXQgaXMgdGhlIGNhc2UsIHRoZW4KLQkgKiB7QGxpbmsgI2RlZmF1bHRWYWx1ZX0gaXMgcmV0dXJuZWQuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIDxjb2RlPkJvb2xlYW48L2NvZGU+IHZhbHVlIHRvIGJlIHJldHVybmVkIGFzIGEgcHJpbWl0aXZlCi0JICogQHJldHVybiBUaGUgcHJpbWl0aXZlIG9mIHRoZSBnaXZlbiB2YWx1ZSBvciB7QGxpbmsgI2RlZmF1bHRWYWx1ZX13aGVuIHRoZQotCSAqIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYm9vbGVhblZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IHRoaXMuZGVmYXVsdFZhbHVlIDogdmFsdWUuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpc3RlbmVyIGZvciB0aGUgYm9vbGVhbiBob2xkZXIuCi0JICoKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKAotCQkJYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkKLQkJKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJTdGF0ZUNvbnRyb2xsZXIuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIiOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsaXN0ZW5lciBmb3IgdGhlIGJvb2xlYW4gaG9sZGVyLgotCSAqCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPC9jb2RlPgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlU3RhdGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiU3RhdGVDb250cm9sbGVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gPGNvZGU+SXRlcmF0b3I8L2NvZGU+IG92ZXIgdGhlIGNvbGxlY3Rpb24gb2YKLQkgKiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBpdGVyYXRpb24gb2YgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEl0ZXJhdG9yPENvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8Q29udHJvbEhvbGRlcj4odGhpcy5jb250cm9sSG9sZGVycyk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+IGJ5IGJ1aWxkaW5nIHRoZSBhcHByb3ByaWF0ZQotCSAqIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4gd2l0aCB0aGUgZ2l2ZW4gc3RhdGUuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgQSA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2UgZW5hYmxlbWVudCBzdGF0ZQotCSAqIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JCQkJCQkJCQkgIENvbGxlY3Rpb248Q29udHJvbEhvbGRlcj4gY29udHJvbEhvbGRlcnMsCi0JCQkJCQkJCQkgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChib29sZWFuSG9sZGVyLCAgIlRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdmFsdWUgY2Fubm90IGJlIG51bGwiKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sSG9sZGVycywgIlRoZSBjb2xsZWN0aW9uIG9mIENvbnRyb2xIb2xkZXJzIGNhbm5vdCBiZSBudWxsIik7Ci0KLQkJdGhpcy5jb250cm9sSG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8Q29udHJvbEhvbGRlcj4oY29udHJvbEhvbGRlcnMpOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSAgID0gZGVmYXVsdFZhbHVlOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIgID0gYm9vbGVhbkhvbGRlcjsKLQotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCXRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyCi0JCSk7Ci0KLQkJdGhpcy51cGRhdGVTdGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sIGhvbGRlcnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdGUoKSB7Ci0JCXRoaXMudXBkYXRlU3RhdGUoYm9vbGVhblZhbHVlKHRoaXMuYm9vbGVhbkhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc3RhdGUgb2YgdGhlIDxjb2RlPkNvbnRyb2w8L2NvZGU+cy4KLQkgKgotCSAqIEBwYXJhbSBzdGF0ZSBUaGUgbmV3IHN0YXRlIHRoZSB3aWRnZXRzIG5lZWQgdG8gaGF2ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXRlKGJvb2xlYW4gc3RhdGUpIHsKLQkJZm9yIChDb250cm9sSG9sZGVyIGNvbnRyb2xIb2xkZXIgOiB0aGlzLmNvbnRyb2xIb2xkZXJzKSB7Ci0JCQljb250cm9sSG9sZGVyLnVwZGF0ZVN0YXRlKHN0YXRlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBob2xkZXIgb2YgdGhlIGFjdHVhbCB3aWRnZXQuCi0JICovCi0Jc3RhdGljIGludGVyZmFjZSBDb250cm9sSG9sZGVyIHsKLQotCQkvKioKLQkJICogVXBkYXRlcyB0aGUgc3RhdGUgb2YgdGhlIHdyYXBwZWQgY29udHJvbC4KLQkJICoKLQkJICogQHBhcmFtIHN0YXRlIFRoZSBuZXcgc3RhdGUgdGhlIGNvbnRyb2wgc2hvdWxkIGhhdmUKLQkJICovCi0JCXZvaWQgdXBkYXRlU3RhdGUoYm9vbGVhbiBzdGF0ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9UYWJsZUxheW91dENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9UYWJsZUxheW91dENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjY1NjY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvVGFibGVMYXlvdXRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS51dGlsLlRhYmxlTGF5b3V0Q29tcG9zaXRlCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYXlvdXREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uUGl4ZWxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLQotLyoqCi0gKiBBIHNwZWNpYWwgY29tcG9zaXRlIHRvIGxheW91dCBjb2x1bW5zIGluc2lkZSBhIHRhYmxlLiBUaGUgY29tcG9zaXRlIGlzIG5lZWRlZCBzaW5jZSB3ZSBoYXZlCi0gKiB0byBsYXlvdXQgdGhlIGNvbHVtbnMgImJlZm9yZSIgdGhlIGFjdHVhbCB0YWJsZSBnZXRzIGxheW91dGVkLiBIZW5jZSB3ZSBjYW4ndCB1c2UgYSBub3JtYWwKLSAqIGxheW91dCBtYW5hZ2VyLgotICogPHA+Ci0gKiBYWFg6IFNob3VsZCBzd2l0Y2ggdG8gdXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuVGFibGVDb2x1bW5MYXlvdXR9LgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVGFibGVMYXlvdXRDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBleHRyYSBwaXhlbHMgdGFrZW4gYXMgaG9yaXpvbnRhbCB0cmltIGJ5IHRoZSB0YWJsZSBjb2x1bW4uCi0JICogVG8gZW5zdXJlIHRoZXJlIGFyZSBOIHBpeGVscyBhdmFpbGFibGUgZm9yIHRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4sCi0JICogYXNzaWduIE4rQ09MVU1OX1RSSU0gZm9yIHRoZSBjb2x1bW4gd2lkdGguCi0JICogPHA+Ci0JICogWFhYOiBTaG91bGQgZWl0aGVyIHN3aXRjaCB0byB1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5UYWJsZUNvbHVtbkxheW91dH0gb3IgZ2V0IEFQSSBmcm9tIEpGYWNlIG9yIFNXVCwgc2VlOiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE4NDgzCi0JICogPC9wPgotCSAqCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBDT0xVTU5fVFJJTTsKLQlzdGF0aWMgewotCQlTdHJpbmcgcGxhdGZvcm09IFNXVC5nZXRQbGF0Zm9ybSgpOwotCQlpZiAoIndpbjMyIi5lcXVhbHMocGxhdGZvcm0pKSAvLyROT04tTkxTLTEkCi0JCQlDT0xVTU5fVFJJTT0gNDsKLQkJZWxzZSBpZiAoImNhcmJvbiIuZXF1YWxzKHBsYXRmb3JtKSkgLy8kTk9OLU5MUy0xJAotCQkJQ09MVU1OX1RSSU09IDI0OwotCQllbHNlCi0JCQlDT0xVTU5fVFJJTT0gMzsKLQl9Ci0KLQlwcml2YXRlIExpc3QgY29sdW1ucz0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYWJsZUxheW91dENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlIHRoZSBTV1Qgc3R5bGUKLQkgKi8KLQlwdWJsaWMgVGFibGVMYXlvdXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICBhZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgYXJlYT0gZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgICAgIFRhYmxlIHRhYmxlPSAoVGFibGUpZ2V0Q2hpbGRyZW4oKVswXTsKLSAgICAgICAgICAgICAgICBQb2ludCBwcmVmZXJyZWRTaXplPSBjb21wdXRlVGFibGVTaXplKHRhYmxlKTsKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGg9IGFyZWEud2lkdGggLSAyICogdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4gd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICBQb2ludCB2QmFyU2l6ZSA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICB3aWR0aCAtPSB2QmFyU2l6ZS54OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsYXlvdXRUYWJsZSh0YWJsZSwgd2lkdGgsIGFyZWEsIHRhYmxlLmdldFNpemUoKS54IDwgYXJlYS53aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgY29sdW1uIG9mIGRhdGEgdG8gdGhpcyB0YWJsZSBsYXlvdXQuCi0JICoKLQkgKiBAcGFyYW0gZGF0YSB0aGUgY29sdW1uIGxheW91dCBkYXRhCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29sdW1uRGF0YShDb2x1bW5MYXlvdXREYXRhIGRhdGEpIHsKLQkJY29sdW1ucy5hZGQoZGF0YSk7Ci0JfQotCi0JLy8tLS0tIEhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JcHJpdmF0ZSBQb2ludCBjb21wdXRlVGFibGVTaXplKFRhYmxlIHRhYmxlKSB7Ci0JCVBvaW50IHJlc3VsdD0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQlpbnQgd2lkdGg9IDA7Ci0JCWludCBzaXplPSBjb2x1bW5zLnNpemUoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7ICsraSkgewotCQkJQ29sdW1uTGF5b3V0RGF0YSBsYXlvdXREYXRhPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAobGF5b3V0RGF0YSBpbnN0YW5jZW9mIENvbHVtblBpeGVsRGF0YSkgewotCQkJCUNvbHVtblBpeGVsRGF0YSBjb2w9IChDb2x1bW5QaXhlbERhdGEpIGxheW91dERhdGE7Ci0JCQkJd2lkdGggKz0gY29sLndpZHRoOwotCQkJCWlmIChjb2wuYWRkVHJpbSkgewotCQkJCQl3aWR0aCArPSBDT0xVTU5fVFJJTTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGxheW91dERhdGEgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7Ci0JCQkJQ29sdW1uV2VpZ2h0RGF0YSBjb2w9IChDb2x1bW5XZWlnaHREYXRhKSBsYXlvdXREYXRhOwotCQkJCXdpZHRoICs9IGNvbC5taW5pbXVtV2lkdGg7Ci0JCQl9IGVsc2UgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGNvbHVtbiBsYXlvdXQgZGF0YSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKHdpZHRoID4gcmVzdWx0LngpCi0JCQlyZXN1bHQueD0gd2lkdGg7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxheW91dFRhYmxlKFRhYmxlIHRhYmxlLCBpbnQgd2lkdGgsIFJlY3RhbmdsZSBhcmVhLCBib29sZWFuIGluY3JlYXNlKSB7Ci0JCS8vIFhYWDogTGF5b3V0IGlzIGJlaW5nIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgdmFsdWUgdGhlIGZpcnN0IHRpbWUKLQkJLy8gaXQgaXMgYmVpbmcgY2FsbGVkIG9uIExpbnV4LiBUaGlzIG1ldGhvZCByZXNldHMgdGhlCi0JCS8vIExheW91dCB0byBudWxsIHNvIHdlIG1ha2Ugc3VyZSB3ZSBydW4gaXQgb25seSB3aGVuCi0JCS8vIHRoZSB2YWx1ZSBpcyBPSy4KLQkJaWYgKHdpZHRoIDw9IDEpCi0JCQlyZXR1cm47Ci0KLQkJVGFibGVDb2x1bW5bXSB0YWJsZUNvbHVtbnM9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJaW50IHNpemU9IE1hdGgubWluKGNvbHVtbnMuc2l6ZSgpLCB0YWJsZUNvbHVtbnMubGVuZ3RoKTsKLQkJaW50W10gd2lkdGhzPSBuZXcgaW50W3NpemVdOwotCQlpbnQgZml4ZWRXaWR0aD0gMDsKLQkJaW50IG51bWJlck9mV2VpZ2h0Q29sdW1ucz0gMDsKLQkJaW50IHRvdGFsV2VpZ2h0PSAwOwotCi0JCS8vIEZpcnN0IGNhbGMgc3BhY2Ugb2NjdXBpZWQgYnkgZml4ZWQgY29sdW1ucwotCQlmb3IgKGludCBpPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlDb2x1bW5MYXlvdXREYXRhIGNvbD0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOwotCQkJaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtblBpeGVsRGF0YSkgewotCQkJCUNvbHVtblBpeGVsRGF0YSBjcGQ9IChDb2x1bW5QaXhlbERhdGEpIGNvbDsKLQkJCQlpbnQgcGl4ZWxzPSBjcGQud2lkdGg7Ci0JCQkJaWYgKGNwZC5hZGRUcmltKSB7Ci0JCQkJCXBpeGVscyArPSBDT0xVTU5fVFJJTTsKLQkJCQl9Ci0JCQkJd2lkdGhzW2ldPSBwaXhlbHM7Ci0JCQkJZml4ZWRXaWR0aCArPSBwaXhlbHM7Ci0JCQl9IGVsc2UgaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtbldlaWdodERhdGEpIHsKLQkJCQlDb2x1bW5XZWlnaHREYXRhIGN3PSAoQ29sdW1uV2VpZ2h0RGF0YSkgY29sOwotCQkJCW51bWJlck9mV2VpZ2h0Q29sdW1ucysrOwotCQkJCS8vIGZpcnN0IHRpbWUsIHVzZSB0aGUgd2VpZ2h0IHNwZWNpZmllZCBieSB0aGUgY29sdW1uIGRhdGEsIG90aGVyd2lzZSB1c2UgdGhlIGFjdHVhbCB3aWR0aCBhcyB0aGUgd2VpZ2h0Ci0JCQkJLy8gaW50IHdlaWdodCA9IGZpcnN0VGltZSA/IGN3LndlaWdodCA6IHRhYmxlQ29sdW1uc1tpXS5nZXRXaWR0aCgpOwotCQkJCWludCB3ZWlnaHQ9IGN3LndlaWdodDsKLQkJCQl0b3RhbFdlaWdodCArPSB3ZWlnaHQ7Ci0JCQl9IGVsc2UgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGNvbHVtbiBsYXlvdXQgZGF0YSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvLyBEbyB3ZSBoYXZlIGNvbHVtbnMgdGhhdCBoYXZlIGEgd2VpZ2h0Ci0JCWlmIChudW1iZXJPZldlaWdodENvbHVtbnMgPiAwKSB7Ci0JCQkvLyBOb3cgZGlzdHJpYnV0ZSB0aGUgcmVzdCB0byB0aGUgY29sdW1ucyB3aXRoIHdlaWdodC4KLQkJCWludCByZXN0PSB3aWR0aCAtIGZpeGVkV2lkdGg7Ci0JCQlpbnQgdG90YWxEaXN0cmlidXRlZD0gMDsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJCQlDb2x1bW5MYXlvdXREYXRhIGNvbD0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOwotCQkJCWlmIChjb2wgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7Ci0JCQkJCUNvbHVtbldlaWdodERhdGEgY3c9IChDb2x1bW5XZWlnaHREYXRhKSBjb2w7Ci0JCQkJCS8vIGNhbGN1bGF0ZSB3ZWlnaHQgYXMgYWJvdmUKLQkJCQkJLy8gaW50IHdlaWdodCA9IGZpcnN0VGltZSA/IGN3LndlaWdodCA6IHRhYmxlQ29sdW1uc1tpXS5nZXRXaWR0aCgpOwotCQkJCQlpbnQgd2VpZ2h0PSBjdy53ZWlnaHQ7Ci0JCQkJCWludCBwaXhlbHM9IHRvdGFsV2VpZ2h0ID09IDAgPyAwIDogd2VpZ2h0ICogcmVzdCAvIHRvdGFsV2VpZ2h0OwotCQkJCQlpZiAocGl4ZWxzIDwgY3cubWluaW11bVdpZHRoKQotCQkJCQkJcGl4ZWxzPSBjdy5taW5pbXVtV2lkdGg7Ci0JCQkJCXRvdGFsRGlzdHJpYnV0ZWQgKz0gcGl4ZWxzOwotCQkJCQl3aWR0aHNbaV09IHBpeGVsczsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIERpc3RyaWJ1dGUgYW55IHJlbWFpbmluZyBwaXhlbHMgdG8gY29sdW1ucyB3aXRoIHdlaWdodC4KLQkJCWludCBkaWZmPSByZXN0IC0gdG90YWxEaXN0cmlidXRlZDsKLQkJCWZvciAoaW50IGk9IDA7IGRpZmYgPiAwOyArK2kpIHsKLQkJCQlpZiAoaSA9PSBzaXplKQotCQkJCQlpPSAwOwotCQkJCUNvbHVtbkxheW91dERhdGEgY29sPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7Ci0JCQkJaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtbldlaWdodERhdGEpIHsKLQkJCQkJKyt3aWR0aHNbaV07Ci0JCQkJCS0tZGlmZjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW5jcmVhc2UpIHsKLQkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOwotCQl9Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRhYmxlQ29sdW1uc1tpXS5zZXRXaWR0aCh3aWR0aHNbaV0pOwotCQl9Ci0JCWlmICghaW5jcmVhc2UpIHsKLQkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9Bc3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9Bc3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjU3MzQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db21tYW5kUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIENvbW1hbmRFeGVjdXRvciBjYW4gYmUgdXNlZCBieSBhIG5vbi1VSQotICogdGhyZWFkIHRvIGFzeW5jaHJvbm91c2x5IG1vZGlmeSBhIEpQQSBwcm9qZWN0IHdpdGggYW55IG9iamVjdHMgYXNzb2NpYXRlZAotICogd2l0aCBkb2N1bWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXllZCBpbiB0aGUgVUkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvcgotCWltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21tYW5kRXhlY3V0b3IgSU5TVEFOQ0UgPSBuZXcgQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IoKTsKLQotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZEV4ZWN1dG9yIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCXByaXZhdGUgQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJdGhpcy5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKHRoaXMuYnVpbGRSdW5uYWJsZShjb21tYW5kKSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmRSdW5uYWJsZShjb21tYW5kKTsKLQl9Ci0KLQlwcml2YXRlIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCXJldHVybiAoZGlzcGxheSAhPSBudWxsKSA/IGRpc3BsYXkgOiBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvU3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9TeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZDE1ZTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9TeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29tbWFuZFJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBDb21tYW5kRXhlY3V0b3IgY2FuIGJlIHVzZWQgYnkgYSBub24tVUkKLSAqIHRocmVhZCB0byBzeW5jaHJvbm91c2x5IG1vZGlmeSBhIEpQQSBwcm9qZWN0IHdpdGggYW55IG9iamVjdHMgYXNzb2NpYXRlZAotICogd2l0aCBkb2N1bWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXllZCBpbiB0aGUgVUkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yCi0JaW1wbGVtZW50cyBDb21tYW5kRXhlY3V0b3IKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmRFeGVjdXRvciBJTlNUQU5DRSA9IG5ldyBTeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yKCk7Ci0KLQlwdWJsaWMgc3RhdGljIENvbW1hbmRFeGVjdXRvciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQlwcml2YXRlIFN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJdGhpcy5nZXREaXNwbGF5KCkuc3luY0V4ZWModGhpcy5idWlsZFJ1bm5hYmxlKGNvbW1hbmQpKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZFJ1bm5hYmxlKGNvbW1hbmQpOwotCX0KLQotCXByaXZhdGUgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJcmV0dXJuIChkaXNwbGF5ICE9IG51bGwpID8gZGlzcGxheSA6IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWUxZWIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Fic3RyYWN0TGlzdFdpZGdldEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIEFsbCB0aGUgImxpc3Qgd2lkZ2V0cyIgYXJlIHN1YmNsYXNzZXMgb2Yge0BsaW5rIFdpZGdldH07IHNvIHdlIGNhbiBwcm92aWRlCi0gKiBhIHNtaWRnZW4gb2YgY29tbW9uIGJlaGF2aW9yIGhlcmUuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0TGlzdFdpZGdldEFkYXB0ZXI8VyBleHRlbmRzIFdpZGdldD4KLQlpbXBsZW1lbnRzIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuTGlzdFdpZGdldAotewotCWZpbmFsIFcgd2lkZ2V0OwotCi0JQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlcihXIHdpZGdldCkgewotCQlzdXBlcigpOwotCQl0aGlzLndpZGdldCA9IHdpZGdldDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQlyZXR1cm4gdGhpcy53aWRnZXQuaXNEaXNwb3NlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy53aWRnZXQuYWRkRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMud2lkZ2V0LnJlbW92ZURpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Jvb2xlYW5CdXR0b25Nb2RlbEJpbmRpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Jvb2xlYW5CdXR0b25Nb2RlbEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkMWY4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuQnV0dG9uTW9kZWxCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci0KLS8qKgotICogVGhpcyBiaW5kaW5nIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBjaGVjay1ib3gsIHRvZ2dsZSBidXR0b24sIG9yIHJhZGlvIGJ1dHRvbgotICogInNlbGVjdGlvbiIgc3luY2hyb25pemVkIHdpdGggYSBtb2RlbCBib29sZWFuLgotICogCi0gKiBAc2VlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsCi0gKiBAc2VlIEJ1dHRvbgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWZpbmFsIGNsYXNzIEJvb2xlYW5CdXR0b25Nb2RlbEJpbmRpbmcgewotCi0JLy8gKioqKiogbW9kZWwKLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBib29sZWFuLiAqLwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgYnV0dG9uJ3Mgc2VsZWN0aW9uIHN0YXRlIHdpdGgKLQkgKiB0aGUgbW9kZWwgYm9vbGVhbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYm9vbGVhbkNoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgdGhlIGNoZWNrLWJveC90b2dnbGUgYnV0dG9uL3JhZGlvIGJ1dHRvbjsKLQkgKiBmb3Igd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBUaGUgZGVmYXVsdCBbZGVmYXVsdCB2YWx1ZV0gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIHRoZSBjaGVjay1ib3gKLQkgKiBpcyB1bmNoZWNrZWQvdG9nZ2xlIGJ1dHRvbiBwb3BwZWQgb3V0L3JhZGlvIGJ1dHRvbiB1bmNoZWNrZWQpLgotCSAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQkvLyAqKioqKiBVSQotCS8qKiBUaGUgY2hlY2stYm94L3RvZ2dsZSBidXR0b24vcmFkaW8gYnV0dG9uIHdlIHN5bmNocm9uaXplIHdpdGggdGhlIG1vZGVsIGJvb2xlYW4uICovCi0JcHJpdmF0ZSBmaW5hbCBCdXR0b24gYnV0dG9uOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgbW9kZWwgYm9vbGVhbiB3aXRoCi0JICogdGhlIGJ1dHRvbidzIHNlbGVjdGlvbiBzdGF0ZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFNlbGVjdGlvbkxpc3RlbmVyIGJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSBidXR0b24KLQkgKiBpcyBkaXNwb3NlZC4gKENyaXRpY2FsIGZvciBwcmV2ZW50aW5nIG1lbW9yeSBsZWFrcy4pCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgYnV0dG9uRGlzcG9zZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gbW9kZWwgYW5kIGJ1dHRvbiBhcmUgcmVxdWlyZWQuCi0JICovCi0JQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZyhXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIEJ1dHRvbiBidXR0b24sIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgoYm9vbGVhbk1vZGVsID09IG51bGwpIHx8IChidXR0b24gPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuYm9vbGVhbk1vZGVsID0gYm9vbGVhbk1vZGVsOwotCQl0aGlzLmJ1dHRvbiA9IGJ1dHRvbjsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0KLQkJdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuYm9vbGVhbk1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idXR0b25TZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQl0aGlzLmJ1dHRvbkRpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdXR0b25EaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy5idXR0b24uYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMuYnV0dG9uRGlzcG9zZUxpc3RlbmVyKTsKLQotCQl0aGlzLnNldEJ1dHRvblNlbGVjdGlvbih0aGlzLmJvb2xlYW5Nb2RlbC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZy50aGlzLmJvb2xlYW5DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJICAgIEBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImJvb2xlYW4gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUJvb2xlYW5CdXR0b25Nb2RlbEJpbmRpbmcudGhpcy5idXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiYnV0dG9uIHNlbGVjdGlvbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBEaXNwb3NlTGlzdGVuZXIgYnVpbGRCdXR0b25EaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZy50aGlzLmJ1dHRvbkRpc3Bvc2VkKCk7Ci0JCQl9Ci0JCSAgICBAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJidXR0b24gZGlzcG9zZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJvb2xlYW4gbW9kZWwgZXZlbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBidXR0b24uCi0JICogSWYgdGhlIG5ldyBtb2RlbCB2YWx1ZSBpcyBudWxsLCB1c2UgdGhlIGJpbmRpbmcncyBkZWZhdWx0IHZhbHVlCi0JICogKHdoaWNoIGlzIHR5cGljYWxseSBmYWxzZSkuCi0JICovCi0JLyogcHJpdmF0ZSAqLyB2b2lkIGJvb2xlYW5DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRCdXR0b25TZWxlY3Rpb24oKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRCdXR0b25TZWxlY3Rpb24oQm9vbGVhbiBiKSB7Ci0JCWlmICggISB0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuYnV0dG9uLnNldFNlbGVjdGlvbih0aGlzLmJvb2xlYW5WYWx1ZShiKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYm9vbGVhblZhbHVlKEJvb2xlYW4gYikgewotCQlyZXR1cm4gKGIgIT0gbnVsbCkgPyBiLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJ1dHRvbiBldmVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGJ1dHRvbiBoYXMgYmVlbiAic2VsZWN0ZWQiIC0gc3luY2hyb25pemUgdGhlIG1vZGVsLgotCSAqLwotCS8qIHByaXZhdGUgKi8gdm9pZCBidXR0b25TZWxlY3RlZCgpIHsKLQkJaWYgKCAhIHRoaXMuYnV0dG9uLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5ib29sZWFuTW9kZWwuc2V0VmFsdWUoQm9vbGVhbi52YWx1ZU9mKHRoaXMuYnV0dG9uLmdldFNlbGVjdGlvbigpKSk7Ci0JCX0KLQl9Ci0KLQkvKiBwcml2YXRlICovIHZvaWQgYnV0dG9uRGlzcG9zZWQoKSB7Ci0JCS8vIHRoZSBidXR0b24gaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50Ci0JCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVycwotCQl0aGlzLmJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdGhpcy5idXR0b24ucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMuYnV0dG9uRGlzcG9zZUxpc3RlbmVyKTsKLQkJdGhpcy5ib29sZWFuTW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmJvb2xlYW5Nb2RlbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuU3RhdGVDb250cm9sbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuU3RhdGVDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YjM3MzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhblN0YXRlQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogVGhpcyBjb250cm9sbGVyIGVuYWJsZXMgYSBib29sZWFuIG1vZGVsIHRvIGNvbnRyb2wgZWl0aGVyIHRoZQotICogPGVtPmVuYWJsZWQ8L2VtPiBvciA8ZW0+dmlzaWJsZTwvZW0+IHByb3BlcnRpZXMgb2YgU1dUIGNvbnRyb2xzOyBpLmUuIHRoZQotICogY29udHJvbHMnIHByb3BlcnRpZXMgYXJlIGtlcHQgaW4gc3luY2ggd2l0aCB0aGUgYm9vbGVhbiBtb2RlbCwKLSAqIGJ1dCA8ZW0+bm90PC9lbT4gdmljZS12ZXJzYS4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IG1hbmFnZSB0aGUgbGlzdGVuZXJzOyBpLmUuIHRoZSBlbmdhZ2luZyBhbmQgZGlzZW5nYWdpbmcgb2YKLSAqIHRoZSBib29sZWFuIG1vZGVsIGFuZCB0aGUgY29udHJvbChzKS4KLSAqIAotICogQHNlZSBQcm9wZXJ0eVZhbHVlTW9kZWwKLSAqIEBzZWUgQ29udHJvbCNzZXRFbmFibGVkKGJvb2xlYW4pCi0gKiBAc2VlIENvbnRyb2wjc2V0VmlzaWJsZShib29sZWFuKQotICovCi1hYnN0cmFjdCBjbGFzcyBCb29sZWFuU3RhdGVDb250cm9sbGVyIHsKLQotCS8qKgotCSAqIFRoZSBjb250cm9sbGluZyBib29sZWFuIG1vZGVsLgotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGNvbnRyb2wgc3RhdGVzIHdpdGgKLQkgKiBjaGFuZ2VzIGluIHRoZSB2YWx1ZSBvZiB0aGUgYm9vbGVhbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYm9vbGVhbkNoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIGFsbCB0aGUKLQkgKiBjb250cm9scyBhcmUgZGlzcG9zZWQuIChDcml0aWNhbCBmb3IgcHJldmVudGluZyBtZW1vcnkgbGVha3MuKQotCSAqLwotCXByaXZhdGUgZmluYWwgRGlzcG9zZUxpc3RlbmVyIGNvbnRyb2xEaXNwb3NlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgc3RhdGU7IGZvciB3aGVuIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIGRlZmF1bHQgW2RlZmF1bHQgdmFsdWVdIGlzIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQkvKioKLQkgKiBUaGUgYWRhcHRlciBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlICdlbmFibGVkJyBvciAndmlzaWJsZScgcHJvcGVydHkgaXMKLQkgKiBjb250cm9sbGVkLgotCSAqLwotCXByaXZhdGUgZmluYWwgQWRhcHRlciBhZGFwdGVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gbW9kZWwgYW5kIHRoZSBhZGFwdGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlCb29sZWFuU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIGJvb2xlYW4gZGVmYXVsdFZhbHVlLCBBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChib29sZWFuTW9kZWwgPT0gbnVsbCkgfHwgKGFkYXB0ZXIgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuYm9vbGVhbk1vZGVsID0gYm9vbGVhbk1vZGVsOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLQotCQl0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5jb250cm9sRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZENvbnRyb2xEaXNwb3NlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLmJvb2xlYW5DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImJvb2xlYW4gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBEaXNwb3NlTGlzdGVuZXIgYnVpbGRDb250cm9sRGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCS8vIHRoZSBjb250cm9sIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkJCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVyCi0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLmNvbnRyb2xEaXNwb3NlZCgoQ29udHJvbCkgZXZlbnQud2lkZ2V0KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbnRyb2wgZGlzcG9zZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYm9vbGVhbiBtb2RlbCAqKioqKioqKioqCi0KLQl2b2lkIGVuZ2FnZUJvb2xlYW5Nb2RlbCgpIHsKLQkJdGhpcy5ib29sZWFuTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQl2b2lkIGRpc2VuZ2FnZUJvb2xlYW5Nb2RlbCgpIHsKLQkJdGhpcy5ib29sZWFuTW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYm9vbGVhbiBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb250cm9scy4KLQkgKiBJZiB0aGUgbmV3IGJvb2xlYW4gbW9kZWwgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHVzZSB0aGUgY29udHJvbGxlcidzCi0JICogZGVmYXVsdCB2YWx1ZSAod2hpY2ggaXMgdHlwaWNhbGx5IGZhbHNlKS4KLQkgKi8KLQkvKiBwcml2YXRlICovIHZvaWQgYm9vbGVhbkNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnNldENvbnRyb2xTdGF0ZSgoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0KLQlib29sZWFuIGdldEJvb2xlYW5WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYm9vbGVhblZhbHVlKHRoaXMuYm9vbGVhbk1vZGVsLmdldFZhbHVlKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBib29sZWFuVmFsdWUoQm9vbGVhbiBiKSB7Ci0JCXJldHVybiAoYiAhPSBudWxsKSA/IGIuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udHJvbCAqKioqKioqKioqCi0KLQl2b2lkIGVuZ2FnZUNvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCWNvbnRyb2wuYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMuY29udHJvbERpc3Bvc2VMaXN0ZW5lcik7Ci0JfQotCi0Jdm9pZCBkaXNlbmdhZ2VDb250cm9sKENvbnRyb2wgY29udHJvbCkgewotCQljb250cm9sLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLmNvbnRyb2xEaXNwb3NlTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDb250cm9sU3RhdGUoQm9vbGVhbiBiKSB7Ci0JCXRoaXMuc2V0Q29udHJvbFN0YXRlKHRoaXMuYm9vbGVhblZhbHVlKGIpKTsKLQl9Ci0KLQlhYnN0cmFjdCB2b2lkIHNldENvbnRyb2xTdGF0ZShib29sZWFuIGIpOwotCi0Jdm9pZCBzZXRDb250cm9sU3RhdGUoQ29udHJvbCBjb250cm9sLCBib29sZWFuIGIpIHsKLQkJaWYgKCAhIGNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmFkYXB0ZXIuc2V0U3RhdGUoY29udHJvbCwgYik7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNvbnRyb2xEaXNwb3NlZChDb250cm9sIGNvbnRyb2wpIHsKLQkJdGhpcy5kaXNlbmdhZ2VDb250cm9sKGNvbnRyb2wpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYm9vbGVhbk1vZGVsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRhcHRlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JaW50ZXJmYWNlIEFkYXB0ZXIgewotCQl2b2lkIHNldFN0YXRlKENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Ryb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Ryb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4NWMwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Ecm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgYmluZGluZyBjYW4gYmUgdXNlZCB0byBrZWVwIGEgZHJvcC1kb3duIGxpc3QgYm94J3Mgc2VsZWN0aW9uCi0gKiBzeW5jaHJvbml6ZWQgd2l0aCBhIG1vZGVsLiBUaGUgc2VsZWN0aW9uIGNhbiBiZSBtb2RpZmllZCBieSBlaXRoZXIgdGhlCi0gKiBkcm9wLWRvd24gbGlzdCBib3ggb3IgdGhlIG1vZGVsLCBzbyBjaGFuZ2VzIG11c3QgYmUgY29vcmRpbmF0ZWQuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IEEgc2VsZWN0ZWQgaXRlbSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiBjYW4gYmUgdXNlZAotICogdG8gY2xlYXIgdGhlIGRyb3AtZG93biBsaXN0IGJveCdzIHNlbGVjdGlvbi4gSWYgPGNvZGU+bnVsbDwvY29kZT4gaXMgYQotICogdmFsaWQgaXRlbSBpbiB0aGUgbW9kZWwgbGlzdCwgYW4gaW52YWxpZCBzZWxlY3RlZCBpdGVtIGNhbiBiZSB1c2VkIHRvIGNsZWFyCi0gKiB0aGUgc2VsZWN0aW9uLgotICogCi0gKiBAc2VlIExpc3RWYWx1ZU1vZGVsCi0gKiBAc2VlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsCi0gKiBAc2VlIERyb3BEb3duTGlzdEJveAotICogQHNlZSBTV1RUb29scwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWZpbmFsIGNsYXNzIERyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmc8RT4KLQlpbXBsZW1lbnRzIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuU2VsZWN0aW9uQmluZGluZwotewotCS8vICoqKioqIG1vZGVsCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbGlzdCBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbDsKLQotCS8qKgotCSAqIEEgd3JpdGFibGUgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgc2VsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtTW9kZWw7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBkcm9wLWRvd24gbGlzdCBib3gncwotCSAqIHNlbGVjdGlvbiB3aXRoIHRoZSBtb2RlbCBzZWxlY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyOwotCi0JLy8gKioqKiogVUkKLQkvKioKLQkgKiBUaGUgZHJvcC1kb3duIGxpc3QgYm94IHdob3NlIHNlbGVjdGlvbiB3ZSBrZWVwIHN5bmNocm9uaXplZAotCSAqIHdpdGggdGhlIG1vZGVsIHNlbGVjdGlvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIERyb3BEb3duTGlzdEJveCBkcm9wZG93bkxpc3RCb3g7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIG91ciBzZWxlY3RlZCBpdGVtIGhvbGRlcgotCSAqIHdpdGggdGhlIGRyb3AtZG93biBsaXN0IGJveCdzIHNlbGVjdGlvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFNlbGVjdGlvbkxpc3RlbmVyIGRyb3Bkb3duTGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gYWxsIHBhcmFtZXRlcnMgYXJlIHJlcXVpcmVkLgotCSAqLwotCURyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcoCi0JCQlMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWwsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Nb2RlbCwKLQkJCURyb3BEb3duTGlzdEJveCBkcm9wZG93bkxpc3RCb3gKLQkpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChsaXN0TW9kZWwgPT0gbnVsbCkgfHwgKHNlbGVjdGVkSXRlbU1vZGVsID09IG51bGwpIHx8IChkcm9wZG93bkxpc3RCb3ggPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdE1vZGVsID0gbGlzdE1vZGVsOwotCQl0aGlzLnNlbGVjdGVkSXRlbU1vZGVsID0gc2VsZWN0ZWRJdGVtTW9kZWw7Ci0JCXRoaXMuZHJvcGRvd25MaXN0Qm94ID0gZHJvcGRvd25MaXN0Qm94OwotCi0JCXRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1Nb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wZG93bkxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGREcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmRyb3Bkb3duTGlzdEJveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmRyb3Bkb3duTGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLnNlbGVjdGVkSXRlbUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic2VsZWN0ZWQgaXRlbSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZERyb3BEb3duTGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLnRoaXMuZHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLnRoaXMuZHJvcERvd25MaXN0Qm94RG91YmxlQ2xpY2tlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkcm9wLWRvd24gbGlzdCBib3ggc2VsZWN0aW9uIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFdpZGdldE1vZGVsQmluZGluZy5TZWxlY3Rpb25CaW5kaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIE1vZGlmeWluZyB0aGUgZHJvcC1kb3duIGxpc2IgYm94J3Mgc2VsZWN0ZWQgaXRlbSBwcm9ncmFtbWF0aWNhbGx5IGRvZXMKLQkgKiBub3QgdHJpZ2dlciBhIFNlbGVjdGlvbkV2ZW50LgotCSAqIDxwPgotCSAqIFByZS1jb25kaXRpb246IFRoZSBkcm9wLWRvd24gbGlzdCBib3ggaXMgbm90IGRpc3Bvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpIHsKLQkJaW50IG9sZEluZGV4ID0gdGhpcy5kcm9wZG93bkxpc3RCb3guZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJRSB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRJdGVtTW9kZWwuZ2V0VmFsdWUoKTsKLQkJaW50IG5ld0luZGV4ID0gdGhpcy5pbmRleE9mKHZhbHVlKTsKLQkJaWYgKChvbGRJbmRleCAhPSAtMSkgJiYgKG5ld0luZGV4ICE9IC0xKSAmJiAobmV3SW5kZXggIT0gb2xkSW5kZXgpKSB7Ci0JCQl0aGlzLmRyb3Bkb3duTGlzdEJveC5kZXNlbGVjdChvbGRJbmRleCk7Ci0JCX0KLQkJaWYgKG5ld0luZGV4ID09IC0xKSB7Ci0JCQl0aGlzLmRyb3Bkb3duTGlzdEJveC5kZXNlbGVjdEFsbCgpOwotCQl9IGVsc2UgewotCQkJaWYgKG5ld0luZGV4ICE9IG9sZEluZGV4KSB7Ci0JCQkJdGhpcy5kcm9wZG93bkxpc3RCb3guc2VsZWN0KG5ld0luZGV4KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuZHJvcGRvd25MaXN0Qm94LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuZHJvcGRvd25MaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLnNlbGVjdGVkSXRlbU1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VsZWN0ZWQgaXRlbSAqKioqKioqKioqCi0KLQl2b2lkIHNlbGVjdGVkSXRlbUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoICEgdGhpcy5kcm9wZG93bkxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnNlbGVjdGVkSXRlbUNoYW5nZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1vZGlmeWluZyB0aGUgZHJvcC1kb3duIGxpc3QgYm94J3Mgc2VsZWN0ZWQgaXRlbSBwcm9ncmFtbWF0aWNhbGx5IGRvZXMKLQkgKiBub3QgdHJpZ2dlciBhIFNlbGVjdGlvbkV2ZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZWxlY3RlZEl0ZW1DaGFuZ2VkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpOwotCX0KLQotCXByaXZhdGUgaW50IGluZGV4T2YoRSBpdGVtKSB7Ci0JCWludCBsZW4gPSB0aGlzLmxpc3RNb2RlbC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLmxpc3RNb2RlbC5nZXQoaSksIGl0ZW0pKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgJ251bGwnIGlzIG5vdCBpbiB0aGUgbGlzdCwgdXNlIGl0IHRvIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCS8vIFdlIGNhbiBnZXQgaGVyZSB2aWEgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JCS8vIDEuIFRoZSBzZWxlY3RlZCBpdGVtIG1vZGVsIGlzIGludmFsaWQgYW5kIG5vdCBpbiBzeW5jIHdpdGggdGhlIGxpc3QKLQkJLy8gICAgbW9kZWwuIFRoaXMgaXMgbm90IGdvb2QgYW5kIHdlIGRvbid0IG1ha2UgdGhpcyAocHJvZ3JhbW1pbmcKLQkJLy8gICAgZXJyb3IpIG9idmlvdXMgKGUuZy4gdmlhIGFuIGV4Y2VwdGlvbikuIDotKAotCQkvLyAyLiBJZiBib3RoIHRoZSBzZWxlY3RlZCBpdGVtIG1vZGVsIGFuZCB0aGUgbGlzdCBtb2RlbCBhcmUgZGVwZW5kZW50Ci0JCS8vICAgIG9uIHRoZSBzYW1lIHVuZGVybHlpbmcgbW9kZWwsIHRoZSBzZWxlY3RlZCBpdGVtIG1vZGVsIG1heSByZWNlaXZlCi0JCS8vICAgIGl0cyBldmVudCBmaXJzdCwgcmVzdWx0aW5nIGluIGEgbWlzc2luZyBpdGVtLiBUaGlzIHdpbGwgcmVzb2x2ZQotCQkvLyAgICBpdHNlbGYgb25jZSB0aGUgbGlzdCBtb2RlbCByZWNlaXZlcyBpdHMgZXZlbnQgYW5kIHN5bmNocm9uaXplcwotCQkvLyAgICB3aXRoIHRoZSBzYW1lIHVuZGVybHlpbmcgbW9kZWwuIFRoaXMgc2l0dWF0aW9uIGlzIGFjY2VwdGFibGUuCi0JCXJldHVybiAtMTsKLQotLy8gVGhpcyBpcyB3aGF0IHdlIHVzZWQgdG8gZG86Ci0vLwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2VsZWN0ZWQgaXRlbSBub3QgZm91bmQ6ICIgKyBpdGVtKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29tYm8tYm94IGV2ZW50cyAqKioqKioqKioqCi0KLQl2b2lkIGRyb3BEb3duTGlzdEJveFNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMuZHJvcGRvd25MaXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5kcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGRyb3BEb3duTGlzdEJveERvdWJsZUNsaWNrZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMuZHJvcGRvd25MaXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5kcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQ2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtTW9kZWwuc2V0VmFsdWUodGhpcy5nZXREcm9wRG93bkxpc3RCb3hTZWxlY3RlZEl0ZW0oKSk7Ci0JfQotCi0JcHJpdmF0ZSBFIGdldERyb3BEb3duTGlzdEJveFNlbGVjdGVkSXRlbSgpIHsKLQkJaW50IHNlbGVjdGlvbkluZGV4ID0gdGhpcy5kcm9wZG93bkxpc3RCb3guZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJcmV0dXJuIChzZWxlY3Rpb25JbmRleCA9PSAtMSkgPyBudWxsIDogdGhpcy5saXN0TW9kZWwuZ2V0KHNlbGVjdGlvbkluZGV4KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnNlbGVjdGVkSXRlbU1vZGVsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRhcHRlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHRlciB1c2VkIGJ5IHRoZSBkcm9wLWRvd24gbGlzdCBib3ggc2VsZWN0aW9uIGJpbmRpbmcgdG8gcXVlcnkgYW5kIG1hbmlwdWxhdGUKLQkgKiB0aGUgZHJvcC1kb3duIGxpc3QgYm94LgotCSAqLwotCWludGVyZmFjZSBEcm9wRG93bkxpc3RCb3ggewotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29tYm8tYm94IGlzICJkaXNwb3NlZCIuCi0JCSAqLwotCQlib29sZWFuIGlzRGlzcG9zZWQoKTsKLQotCQkvKioKLQkJICogQWRkIHRoZSBzcGVjaWZpZWQgc2VsZWN0aW9uIGxpc3RlbmVyIHRvIHRoZSBjb21iby1ib3guCi0JCSAqLwotCQl2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgc2VsZWN0aW9uIGxpc3RlbmVyIGZyb20gdGhlIGNvbWJvLWJveC4KLQkJICovCi0JCXZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBjb21iby1ib3gncyBzZWxlY3Rpb24uCi0JCSAqLwotCQlpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQotCQkvKioKLQkJICogU2VsZWN0IHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhlIGNvbWJvLWJveC4KLQkJICovCi0JCXZvaWQgc2VsZWN0KGludCBpbmRleCk7Ci0KLQkJLyoqCi0JCSAqIERlc2VsZWN0IHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhlIGNvbWJvLWJveC4KLQkJICovCi0JCXZvaWQgZGVzZWxlY3QoaW50IGluZGV4KTsKLQotCQkvKioKLQkJICogQ2xlYXIgdGhlIGNvbWJvLWJveCdzIHNlbGVjdGlvbi4KLQkJICovCi0JCXZvaWQgZGVzZWxlY3RBbGwoKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNTY4NjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotCi0vKioKLSAqIFRoaXMgYmluZGluZyBjYW4gYmUgdXNlZCB0byBrZWVwIGEgbGlzdCBib3gncyBzZWxlY3Rpb24KLSAqIHN5bmNocm9uaXplZCB3aXRoIGEgbW9kZWwuIFRoZSBzZWxlY3Rpb24gY2FuIGJlIG1vZGlmaWVkIGJ5IGVpdGhlciB0aGUgbGlzdAotICogYm94IG9yIHRoZSBtb2RlbCwgc28gY2hhbmdlcyBtdXN0IGJlIGNvb3JkaW5hdGVkLgotICogCi0gKiBAc2VlIExpc3RWYWx1ZU1vZGVsCi0gKiBAc2VlIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWwKLSAqIEBzZWUgTGlzdAotICogQHNlZSBTV1RUb29scwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWZpbmFsIGNsYXNzIExpc3RCb3hTZWxlY3Rpb25CaW5kaW5nPEU+Ci0JaW1wbGVtZW50cyBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLlNlbGVjdGlvbkJpbmRpbmcKLXsKLQkvLyAqKioqKiBtb2RlbAotCS8qKgotCSAqIFRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWw7Ci0KLQkvKioKLQkgKiBBIHdyaXRhYmxlIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHNlbGVjdGlvbnMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbXNNb2RlbDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGxpc3QgYm94J3Mgc2VsZWN0aW9uIHdpdGgKLQkgKiB0aGUgbW9kZWwgc2VsZWN0aW9ucy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBzZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvLyAqKioqKiBVSQotCS8qKgotCSAqIFRoZSBsaXN0IGJveCB3aG9zZSBzZWxlY3Rpb24gd2Uga2VlcCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbW9kZWwgc2VsZWN0aW9ucy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExpc3QgbGlzdEJveDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgb3VyIHNlbGVjdGVkIGl0ZW1zIGhvbGRlcgotCSAqIHdpdGggdGhlIGxpc3QgYm94J3Mgc2VsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gYWxsIHBhcmFtZXRlcnMgYXJlIHJlcXVpcmVkLgotCSAqLwotCUxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nKAotCQkJTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsLAotCQkJV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1zTW9kZWwsCi0JCQlMaXN0IGxpc3RCb3gKLQkpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChsaXN0TW9kZWwgPT0gbnVsbCkgfHwgKHNlbGVjdGVkSXRlbXNNb2RlbCA9PSBudWxsKSB8fCAobGlzdEJveCA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0TW9kZWwgPSBsaXN0TW9kZWw7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtc01vZGVsID0gc2VsZWN0ZWRJdGVtc01vZGVsOwotCQl0aGlzLmxpc3RCb3ggPSBsaXN0Qm94OwotCi0JCXRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNlbGVjdGVkSXRlbXNNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5saXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMubGlzdEJveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcudGhpcy5zZWxlY3RlZEl0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLnRoaXMuc2VsZWN0ZWRJdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLnNlbGVjdGVkSXRlbXNDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLnRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic2VsZWN0ZWQgaXRlbXMgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRMaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLnRoaXMubGlzdEJveFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcudGhpcy5saXN0Qm94RG91YmxlQ2xpY2tlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGJveCBzZWxlY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLlNlbGVjdGlvbkJpbmRpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogTW9kaWZ5aW5nIHRoZSBsaXN0IGJveCdzIHNlbGVjdGVkIGl0ZW1zIHByb2dyYW1tYXRpY2FsbHkgZG9lcyBub3QKLQkgKiB0cmlnZ2VyIGEgU2VsZWN0aW9uRXZlbnQuCi0JICogCi0JICogUHJlLWNvbmRpdGlvbjogVGhlIGxpc3QtYm94IGlzIG5vdCBkaXNwb3NlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKSB7Ci0JCWludCBzZWxlY3RlZEl0ZW1zU2l6ZSA9IHRoaXMuc2VsZWN0ZWRJdGVtc01vZGVsLnNpemUoKTsKLQkJaW50W10gc2VsZWN0ID0gbmV3IGludFtzZWxlY3RlZEl0ZW1zU2l6ZV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChFIGl0ZW0gOiB0aGlzLnNlbGVjdGVkSXRlbXNNb2RlbCkgewotCQkJc2VsZWN0W2krK10gPSB0aGlzLmluZGV4T2YoaXRlbSk7Ci0JCX0KLQotCQlpbnQgbGlzdFNpemUgPSB0aGlzLmxpc3RNb2RlbC5zaXplKCk7Ci0JCWludFtdIGRlc2VsZWN0ID0gbmV3IGludFtsaXN0U2l6ZSAtIHNlbGVjdGVkSXRlbXNTaXplXTsKLQkJaSA9IDA7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgbGlzdFNpemU7IGorKykgewotCQkJaWYgKCAhIEFycmF5VG9vbHMuY29udGFpbnMoc2VsZWN0LCBqKSkgewotCQkJCWRlc2VsZWN0W2krK10gPSBqOwotCQkJfQotCQl9Ci0KLQkJaW50W10gb2xkID0gQXJyYXlUb29scy5zb3J0KHRoaXMubGlzdEJveC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQlzZWxlY3QgPSBBcnJheVRvb2xzLnNvcnQoc2VsZWN0KTsKLQkJaWYgKCAhIEFycmF5cy5lcXVhbHMoc2VsZWN0LCBvbGQpKSB7Ci0JCQl0aGlzLmxpc3RCb3guZGVzZWxlY3QoZGVzZWxlY3QpOwotCQkJdGhpcy5saXN0Qm94LnNlbGVjdChzZWxlY3QpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5saXN0Qm94LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMubGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1zTW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZWxlY3RlZCBpdGVtcyAqKioqKioqKioqCi0KLQl2b2lkIHNlbGVjdGVkSXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuc2VsZWN0ZWRJdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnlpbmcgdGhlIGxpc3QgYm94J3Mgc2VsZWN0ZWQgaXRlbXMgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdAotCSAqIHRyaWdnZXIgYSBTZWxlY3Rpb25FdmVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0ZWRJdGVtc0FkZGVkXyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbZXZlbnQuZ2V0SXRlbXNTaXplKCldOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKLQkJCWluZGljZXNbaSsrXSA9IHRoaXMuaW5kZXhPZihpdGVtKTsKLQkJfQotCQl0aGlzLmxpc3RCb3guc2VsZWN0KGluZGljZXMpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBJdGVyYWJsZTxFPiBnZXRJdGVtcyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQl2b2lkIHNlbGVjdGVkSXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAoICEgdGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5zZWxlY3RlZEl0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5aW5nIHRoZSBsaXN0IGJveCdzIHNlbGVjdGVkIGl0ZW1zIHByb2dyYW1tYXRpY2FsbHkgZG9lcyBub3QKLQkgKiB0cmlnZ2VyIGEgU2VsZWN0aW9uRXZlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdGVkSXRlbXNSZW1vdmVkXyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbZXZlbnQuZ2V0SXRlbXNTaXplKCldOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKLQkJCWluZGljZXNbaSsrXSA9IHRoaXMuaW5kZXhPZihpdGVtKTsKLQkJfQotCQl0aGlzLmxpc3RCb3guZGVzZWxlY3QoaW5kaWNlcyk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCXZvaWQgc2VsZWN0ZWRJdGVtc0NsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuc2VsZWN0ZWRJdGVtc0NsZWFyZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1vZGlmeWluZyB0aGUgbGlzdCBib3gncyBzZWxlY3RlZCBpdGVtcyBwcm9ncmFtbWF0aWNhbGx5IGRvZXMgbm90Ci0JICogdHJpZ2dlciBhIFNlbGVjdGlvbkV2ZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZWxlY3RlZEl0ZW1zQ2xlYXJlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdEJveC5kZXNlbGVjdEFsbCgpOwotCX0KLQotCXZvaWQgc2VsZWN0ZWRJdGVtc0NoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0ZWRJdGVtc0NoYW5nZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwcml2YXRlIGludCBpbmRleE9mKEUgaXRlbSkgewotCQlpbnQgbGVuID0gdGhpcy5saXN0TW9kZWwuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5saXN0TW9kZWwuZ2V0KGkpLCBpdGVtKSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCS8vIHNlZSBjb21tZW50IGluIERyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuaW5kZXhPZihFKQotCQlyZXR1cm4gLTE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgYm94IGV2ZW50cyAqKioqKioqKioqCi0KLQl2b2lkIGxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGxpc3RCb3hEb3VibGVDbGlja2VkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGlzdEJveFNlbGVjdGlvbkNoYW5nZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl0aGlzLnNlbGVjdGVkSXRlbXNNb2RlbC5zZXRWYWx1ZXModGhpcy5nZXRMaXN0Qm94U2VsZWN0ZWRJdGVtcygpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEU+IGdldExpc3RCb3hTZWxlY3RlZEl0ZW1zKCkgewotCQlBcnJheUxpc3Q8RT4gc2VsZWN0ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4odGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQlmb3IgKGludCBzZWxlY3Rpb25JbmRleCA6IHRoaXMubGlzdEJveC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpIHsKLQkJCXNlbGVjdGVkSXRlbXMuYWRkKHRoaXMubGlzdE1vZGVsLmdldChzZWxlY3Rpb25JbmRleCkpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZEl0ZW1zOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc2VsZWN0ZWRJdGVtc01vZGVsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RXaWRnZXRNb2RlbEJpbmRpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RXaWRnZXRNb2RlbEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzZjg0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBiaW5kaW5nIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBsaXN0IHdpZGdldCdzIGNvbnRlbnRzCi0gKiBzeW5jaHJvbml6ZWQgd2l0aCBhIG1vZGVsLiBUaGUgbGlzdCB3aWRnZXQgbmV2ZXIgYWx0ZXJzCi0gKiBpdHMgY29udGVudHMgZGlyZWN0bHk7IGFsbCBjaGFuZ2VzIGFyZSBkcml2ZW4gYnkgdGhlIG1vZGVsLgotICogCi0gKiBAc2VlIExpc3RWYWx1ZU1vZGVsCi0gKiBAc2VlIFN0cmluZ0NvbnZlcnRlcgotICogQHNlZSBMaXN0V2lkZ2V0Ci0gKiBAc2VlIFNlbGVjdGlvbkJpbmRpbmcKLSAqIEBzZWUgU1dUVG9vbHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1maW5hbCBjbGFzcyBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nPEU+IHsKLQotCS8vICoqKioqIG1vZGVsCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbGlzdCBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGxpc3Qgd2lkZ2V0J3MgY29udGVudHMgd2l0aAotCSAqIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXByaXZhdGUgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgY29udmVydGVyIHRoYXQgY29udmVydHMgaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QKLQkgKiB0byBzdHJpbmdzIHRoYXQgY2FuIGJlIHB1dCBpbiB0aGUgbGlzdCB3aWRnZXQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyOwotCi0JLy8gKioqKiogVUkKLQkvKioKLQkgKiBBbiBhZGFwdGVyIG9uIHRoZSBsaXN0IHdpZGdldCB3ZSBrZWVwIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXByaXZhdGUgZmluYWwgTGlzdFdpZGdldCBsaXN0V2lkZ2V0OwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSBsaXN0IHdpZGdldAotCSAqIGlzIGRpc3Bvc2VkLiAoQ3JpdGljYWwgZm9yIHByZXZlbnRpbmcgbWVtb3J5IGxlYWtzLikKLQkgKi8KLQlwcml2YXRlIGZpbmFsIERpc3Bvc2VMaXN0ZW5lciBsaXN0V2lkZ2V0RGlzcG9zZUxpc3RlbmVyOwotCi0JLy8gKioqKiogc2VsZWN0aW9uCi0JLyoqCi0JICogV2lkZ2V0LXNwZWNpZmljIHNlbGVjdGlvbiBiaW5kaW5nLgotCSAqLwotCXByaXZhdGUgZmluYWwgU2VsZWN0aW9uQmluZGluZyBzZWxlY3Rpb25CaW5kaW5nOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gYWxsIHBhcmFtZXRlcnMgYXJlIHJlcXVpcmVkLgotCSAqLwotCUxpc3RXaWRnZXRNb2RlbEJpbmRpbmcoCi0JCQlMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWwsCi0JCQlMaXN0V2lkZ2V0IGxpc3RXaWRnZXQsCi0JCQlTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyLAotCQkJU2VsZWN0aW9uQmluZGluZyBzZWxlY3Rpb25CaW5kaW5nCi0JKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgobGlzdE1vZGVsID09IG51bGwpIHx8IChsaXN0V2lkZ2V0ID09IG51bGwpIHx8IChzdHJpbmdDb252ZXJ0ZXIgPT0gbnVsbCkgfHwgKHNlbGVjdGlvbkJpbmRpbmcgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdE1vZGVsID0gbGlzdE1vZGVsOwotCQl0aGlzLmxpc3RXaWRnZXQgPSBsaXN0V2lkZ2V0OwotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciA9IHN0cmluZ0NvbnZlcnRlcjsKLQkJdGhpcy5zZWxlY3Rpb25CaW5kaW5nID0gc2VsZWN0aW9uQmluZGluZzsKLQotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5saXN0V2lkZ2V0RGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RXaWRnZXREaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0V2lkZ2V0LmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLmxpc3RXaWRnZXREaXNwb3NlTGlzdGVuZXIpOwotCi0JCXRoaXMuc3luY2hyb25pemVMaXN0V2lkZ2V0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFdpZGdldE1vZGVsQmluZGluZy50aGlzLmxpc3RJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdEl0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFdpZGdldE1vZGVsQmluZGluZy50aGlzLmxpc3RJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFdpZGdldE1vZGVsQmluZGluZy50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RXaWRnZXRNb2RlbEJpbmRpbmcudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIERpc3Bvc2VMaXN0ZW5lciBidWlsZExpc3RXaWRnZXREaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFdpZGdldE1vZGVsQmluZGluZy50aGlzLmxpc3RXaWRnZXREaXNwb3NlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IHdpZGdldCBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCcnV0ZSBmb3JjZSBzeW5jaHJvbml6YXRpb24gb2YgbGlzdCB3aWRnZXQgd2l0aCB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3luY2hyb25pemVMaXN0V2lkZ2V0KCkgewotCQlpZiAoICEgdGhpcy5saXN0V2lkZ2V0LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRfKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY2hyb25pemVMaXN0V2lkZ2V0XygpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odGhpcy5saXN0TW9kZWwuc2l6ZSgpKTsKLQkJZm9yIChFIGl0ZW0gOiB0aGlzLmxpc3RNb2RlbCkgewotCQkJaXRlbXMuYWRkKHRoaXMuY29udmVydChpdGVtKSk7Ci0JCX0KLQkJdGhpcy5saXN0V2lkZ2V0LnNldEl0ZW1zKGl0ZW1zLnRvQXJyYXkobmV3IFN0cmluZ1tpdGVtcy5zaXplKCldKSk7Ci0KLQkJLy8gbm93IHRoYXQgdGhlIGxpc3QgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gc3luY2ggdGhlIHNlbGVjdGlvbgotCQl0aGlzLnNlbGVjdGlvbkJpbmRpbmcuc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGxpc3Qgd2lkZ2V0LgotCSAqLwotCXZvaWQgbGlzdEl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxpc3RJdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGlzdEl0ZW1zQWRkZWRfKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpbnQgaSA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKLQkJCXRoaXMubGlzdFdpZGdldC5hZGQodGhpcy5jb252ZXJ0KGl0ZW0pLCBpKyspOwotCQl9Ci0KLQkJLy8gbm93IHRoYXQgdGhlIGxpc3QgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gc3luY2ggdGhlIHNlbGVjdGlvbgotCQl0aGlzLnNlbGVjdGlvbkJpbmRpbmcuc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBsaXN0IHdpZGdldC4KLQkgKi8KLQl2b2lkIGxpc3RJdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxpc3RJdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0SXRlbXNSZW1vdmVkXyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0V2lkZ2V0LnJlbW92ZShldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJbmRleCgpICsgZXZlbnQuZ2V0SXRlbXNTaXplKCkgLSAxKTsKLQotCQkvLyBub3cgdGhhdCB0aGUgbGlzdCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byBzeW5jaCB0aGUgc2VsZWN0aW9uCi0JCXRoaXMuc2VsZWN0aW9uQmluZGluZy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgbGlzdCB3aWRnZXQuCi0JICovCi0Jdm9pZCBsaXN0SXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxpc3RJdGVtc01vdmVkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGlzdEl0ZW1zTW92ZWRfKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHRhcmdldCA9IGV2ZW50LmdldFRhcmdldEluZGV4KCk7Ci0JCWludCBzb3VyY2UgPSBldmVudC5nZXRTb3VyY2VJbmRleCgpOwotCQlpbnQgbGVuID0gZXZlbnQuZ2V0TGVuZ3RoKCk7Ci0JCWludCBsb1N0YXJ0ID0gTWF0aC5taW4odGFyZ2V0LCBzb3VyY2UpOwotCQlpbnQgaGlTdGFydCA9IE1hdGgubWF4KHRhcmdldCwgc291cmNlKTsKLQkJLy8gbWFrZSBhIGNvcHkgb2YgdGhlIGFmZmVjdGVkIGl0ZW1zLi4uCi0JCVN0cmluZ1tdIHN1YkFycmF5ID0gQXJyYXlUb29scy5zdWJBcnJheSh0aGlzLmxpc3RXaWRnZXQuZ2V0SXRlbXMoKSwgbG9TdGFydCwgaGlTdGFydCArIGxlbik7Ci0JCS8vIC4uLm1vdmUgdGhlbSBhcm91bmQuLi4KLQkJc3ViQXJyYXkgPSBBcnJheVRvb2xzLm1vdmUoc3ViQXJyYXksIHRhcmdldCAtIGxvU3RhcnQsIHNvdXJjZSAtIGxvU3RhcnQsIGxlbik7Ci0JCS8vIC4uLmFuZCB0aGVuIHB1dCB0aGVtIGJhY2sKLQkJaW50IGkgPSBsb1N0YXJ0OwotCQlmb3IgKFN0cmluZyBpdGVtIDogc3ViQXJyYXkpIHsKLQkJCXRoaXMubGlzdFdpZGdldC5zZXRJdGVtKGkrKywgaXRlbSk7Ci0JCX0KLQotCQkvLyBub3cgdGhhdCB0aGUgbGlzdCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byBzeW5jaCB0aGUgc2VsZWN0aW9uCi0JCXRoaXMuc2VsZWN0aW9uQmluZGluZy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgbGlzdCB3aWRnZXQuCi0JICovCi0Jdm9pZCBsaXN0SXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxpc3RJdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGlzdEl0ZW1zUmVwbGFjZWRfKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJaW50IGkgPSBldmVudC5nZXRJbmRleCgpOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpKSB7Ci0JCQl0aGlzLmxpc3RXaWRnZXQuc2V0SXRlbShpKyssIHRoaXMuY29udmVydChpdGVtKSk7Ci0JCX0KLQotCQkvLyBub3cgdGhhdCB0aGUgbGlzdCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byBzeW5jaCB0aGUgc2VsZWN0aW9uCi0JCXRoaXMuc2VsZWN0aW9uQmluZGluZy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSXRlcmFibGU8RT4gZ2V0TmV3SXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXROZXdJdGVtcygpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBsaXN0IHdpZGdldC4KLQkgKi8KLQl2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxpc3RDbGVhcmVkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGlzdENsZWFyZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RXaWRnZXQucmVtb3ZlQWxsKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGxpc3Qgd2lkZ2V0LgotCSAqLwotCXZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxpc3RDaGFuZ2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGlzdENoYW5nZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRfKCk7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoZSBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBpdGVtIHRvIGEKLQkgKiBzdHJpbmcgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3Qgd2lkZ2V0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNvbnZlcnQoRSBpdGVtKSB7Ci0JCXJldHVybiB0aGlzLnN0cmluZ0NvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcoaXRlbSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3Qgd2lkZ2V0IGV2ZW50cyAqKioqKioqKioqCi0KLQl2b2lkIGxpc3RXaWRnZXREaXNwb3NlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRoZSBsaXN0IHdpZGdldCBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMubGlzdFdpZGdldC5yZW1vdmVEaXNwb3NlTGlzdGVuZXIodGhpcy5saXN0V2lkZ2V0RGlzcG9zZUxpc3RlbmVyKTsKLQkJdGhpcy5saXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuc2VsZWN0aW9uQmluZGluZy5kaXNwb3NlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0TW9kZWwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGFwdGVyIGludGVyZmFjZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHRlciB1c2VkIGJ5IHRoZSBsaXN0IHdpZGdldCBtb2RlbCBiaW5kaW5nIHRvIHF1ZXJ5IGFuZCBtYW5pcHVsYXRlCi0JICogdGhlIHdpZGdldC4KLQkgKi8KLQlpbnRlcmZhY2UgTGlzdFdpZGdldCB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IHdpZGdldCBpcyAiZGlzcG9zZWQiLgotCQkgKi8KLQkJYm9vbGVhbiBpc0Rpc3Bvc2VkKCk7Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGRpc3Bvc2UgbGlzdGVuZXIgdG8gdGhlIGxpc3Qgd2lkZ2V0LgotCQkgKi8KLQkJdm9pZCBhZGREaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZGlzcG9zZSBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IHdpZGdldC4KLQkJICovCi0JCXZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbGlzdCB3aWRnZXQncyBpdGVtcy4KLQkJICovCi0JCVN0cmluZ1tdIGdldEl0ZW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFNldCB0aGUgbGlzdCB3aWRnZXQncyBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggdG8gdGhlIHNwZWNpZmllZCBpdGVtLgotCQkgKi8KLQkJdm9pZCBzZXRJdGVtKGludCBpbmRleCwgU3RyaW5nIGl0ZW0pOwotCi0JCS8qKgotCQkgKiBTZXQgdGhlIGxpc3Qgd2lkZ2V0J3MgaXRlbXMuCi0JCSAqLwotCQl2b2lkIHNldEl0ZW1zKFN0cmluZ1tdIGl0ZW1zKTsKLQotCQkvKioKLQkJICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgbGlzdCB3aWRnZXQncyBpdGVtcyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCQkgKi8KLQkJdm9pZCBhZGQoU3RyaW5nIGl0ZW0sIGludCBpbmRleCk7Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIGl0ZW1zIGZyb20gdGhlIGxpc3Qgd2lkZ2V0J3MgaXRlbXMuCi0JCSAqLwotCQl2b2lkIHJlbW92ZShpbnQgc3RhcnQsIGludCBlbmQpOwotCi0JCS8qKgotCQkgKiBSZW1vdmUgYWxsIHRoZSBpdGVtcyBmcm9tIHRoZSBsaXN0IHdpZGdldC4KLQkJICovCi0JCXZvaWQgcmVtb3ZlQWxsKCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdpZGdldC1zcGVjaWZpYyBzZWxlY3Rpb24gYmluZGluZyB0aGF0IGlzIGNvbnRyb2xsZWQgYnkgdGhlIGxpc3Qgd2lkZ2V0Ci0JICogbW9kZWwgYmluZGluZy4KLQkgKi8KLQlpbnRlcmZhY2UgU2VsZWN0aW9uQmluZGluZyB7Ci0KLQkJLyoqCi0JCSAqIFN5bmNocm9uaXplIHRoZSBzZWxlY3Rpb24gYmluZGluZydzIHdpZGdldCB3aXRoIHRoZSBzZWxlY3Rpb24gbW9kZWwuCi0JCSAqIDxwPgotCQkgKiBQcmUtY29uZGl0aW9uOiBUaGUgd2lkZ2V0IGlzIG5vdCBkaXNwb3NlZC4KLQkJICovCi0JCXZvaWQgc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSB3aWRnZXQgaGFzIGJlZW4gZGlzcG9zZWQ7IGRpc3Bvc2UgdGhlIHNlbGVjdGlvbiBiaW5kaW5nLgotCQkgKi8KLQkJdm9pZCBkaXNwb3NlKCk7Ci0KLQotCQkvKioKLQkJICogVXNlZnVsIGZvciBsaXN0IGJveGVzIHRoYXQgaWdub3JlIHRoZSBzZWxlY3Rpb24uCi0JCSAqLwotCQlmaW5hbCBjbGFzcyBOdWxsIGltcGxlbWVudHMgU2VsZWN0aW9uQmluZGluZyB7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFNlbGVjdGlvbkJpbmRpbmcgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQkJcHVibGljIHN0YXRpYyBTZWxlY3Rpb25CaW5kaW5nIGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgTnVsbCgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiU2VsZWN0aW9uQmluZGluZy5OdWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L011bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L011bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5NTc2OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9NdWx0aUNvbnRyb2xCb29sZWFuU3RhdGVDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TbmFwc2hvdENsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIFRoaXMgY29udHJvbGxlciBlbmFibGVzIGEgYm9vbGVhbiBtb2RlbCB0byBjb250cm9sIGVpdGhlciB0aGUKLSAqIDxlbT5lbmFibGVkPC9lbT4gb3IgPGVtPnZpc2libGU8L2VtPiBwcm9wZXJ0aWVzIG9mIGEgc2V0IG9mIFNXVCBjb250cm9sczsKLSAqIGkuZS4gdGhlIGNvbnRyb2xzJyBwcm9wZXJ0aWVzIGFyZSBrZXB0IGluIHN5bmNoIHdpdGggdGhlIGJvb2xlYW4gbW9kZWwsCi0gKiBidXQgPGVtPm5vdDwvZW0+IHZpY2UtdmVyc2EuCi0gKiAKLSAqIEBzZWUgUHJvcGVydHlWYWx1ZU1vZGVsCi0gKiBAc2VlIENvbGxlY3Rpb25WYWx1ZU1vZGVsCi0gKiBAc2VlIENvbnRyb2wjc2V0RW5hYmxlZChib29sZWFuKQotICogQHNlZSBDb250cm9sI3NldFZpc2libGUoYm9vbGVhbikKLSAqLwotZmluYWwgY2xhc3MgTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlcgotCWV4dGVuZHMgQm9vbGVhblN0YXRlQ29udHJvbGxlcgotewotCS8qKgotCSAqIFRoZSBzZXQgb2YgY29udHJvbHMgd2hvc2Ugc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHNNb2RlbDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgY2xpZW50cyB0byBhZGQvcmVtb3ZlIGNvbnRyb2xzLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbnRyb2xzTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDYWNoZSBvZiBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEhhc2hTZXQ8Q29udHJvbD4gY29udHJvbHMgPSBuZXcgSGFzaFNldDxDb250cm9sPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gbW9kZWwsIHRoZSBjb250cm9scyBtb2RlbCwgYW5kIHRoZSBhZGFwdGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlNdWx0aUNvbnRyb2xCb29sZWFuU3RhdGVDb250cm9sbGVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwKLQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9sc01vZGVsLAotCQkJYm9vbGVhbiBkZWZhdWx0VmFsdWUsCi0JCQlBZGFwdGVyIGFkYXB0ZXIKLQkpIHsKLQkJc3VwZXIoYm9vbGVhbk1vZGVsLCBkZWZhdWx0VmFsdWUsIGFkYXB0ZXIpOwotCQlpZiAoY29udHJvbHNNb2RlbCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbnRyb2xzTW9kZWwgPSBjb250cm9sc01vZGVsOwotCQl0aGlzLmNvbnRyb2xzTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29udHJvbHNMaXN0ZW5lcigpOwotCQl0aGlzLmFkZENvbnRyb2xzKGNvbnRyb2xzTW9kZWwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbnRyb2xzTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCU11bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIudGhpcy5hZGRDb250cm9scygoSXRlcmFibGU8PyBleHRlbmRzIENvbnRyb2w+KSBldmVudC5nZXRJdGVtcygpKTsKLQkJCX0KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCU11bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIudGhpcy5yZW1vdmVDb250cm9scygoSXRlcmFibGU8PyBleHRlbmRzIENvbnRyb2w+KSBldmVudC5nZXRJdGVtcygpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLmNsZWFyQ29udHJvbHMoKTsKLQkJCX0KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLmNsZWFyQ29udHJvbHMoKTsKLQkJCQlNdWx0aUNvbnRyb2xCb29sZWFuU3RhdGVDb250cm9sbGVyLnRoaXMuYWRkQ29udHJvbHMoKEl0ZXJhYmxlPD8gZXh0ZW5kcyBDb250cm9sPikgZXZlbnQuZ2V0Q29sbGVjdGlvbigpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbnRyb2xzIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250cm9scyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQl2b2lkIHNldENvbnRyb2xTdGF0ZShib29sZWFuIGIpIHsKLQkJZm9yIChDb250cm9sIGNvbnRyb2wgOiB0aGlzLmNvbnRyb2xzKSB7Ci0JCQl0aGlzLnNldENvbnRyb2xTdGF0ZShjb250cm9sLCBiKTsKLQkJfQotCX0KLQotCS8qIHByaXZhdGUgKi8gdm9pZCBhZGRDb250cm9scyhJdGVyYWJsZTw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHNfKSB7Ci0JCWJvb2xlYW4gYiA9IHRoaXMuZ2V0Qm9vbGVhblZhbHVlKCk7Ci0JCWZvciAoQ29udHJvbCBjb250cm9sIDogY29udHJvbHNfKSB7Ci0JCQl0aGlzLmFkZENvbnRyb2woY29udHJvbCwgYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ29udHJvbChDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gYikgewotCQlpZiAodGhpcy5jb250cm9scy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZW5nYWdlQm9vbGVhbk1vZGVsKCk7Ci0JCQl0aGlzLmNvbnRyb2xzTW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb250cm9sc0xpc3RlbmVyKTsKLQkJfQotCQlpZiAodGhpcy5jb250cm9scy5hZGQoY29udHJvbCkpIHsKLQkJCXRoaXMuZW5nYWdlQ29udHJvbChjb250cm9sKTsKLQkJCXRoaXMuc2V0Q29udHJvbFN0YXRlKGNvbnRyb2wsIGIpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVwbGljYXRlIGNvbnRyb2w6ICIgKyBjb250cm9sKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogcHJpdmF0ZSAqLyB2b2lkIGNsZWFyQ29udHJvbHMoKSB7Ci0JCXRoaXMucmVtb3ZlQ29udHJvbHMobmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxDb250cm9sPih0aGlzLmNvbnRyb2xzKSk7Ci0JfQotCi0JLyogcHJpdmF0ZSAqLyB2b2lkIHJlbW92ZUNvbnRyb2xzKEl0ZXJhYmxlPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9sc18pIHsKLQkJZm9yIChDb250cm9sIGNvbnRyb2wgOiBjb250cm9sc18pIHsKLQkJCXRoaXMuZGlzZW5nYWdlQ29udHJvbChjb250cm9sKTsKLQkJCXRoaXMucmVtb3ZlQ29udHJvbChjb250cm9sKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVDb250cm9sKENvbnRyb2wgY29udHJvbCkgewotCQl0aGlzLmNvbnRyb2xzLnJlbW92ZShjb250cm9sKTsKLQkJaWYgKHRoaXMuY29udHJvbHMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmNvbnRyb2xzTW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb250cm9sc0xpc3RlbmVyKTsKLQkJCXRoaXMuZGlzZW5nYWdlQm9vbGVhbk1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIGNvbnRyb2xEaXNwb3NlZChDb250cm9sIGNvbnRyb2wpIHsKLQkJc3VwZXIuY29udHJvbERpc3Bvc2VkKGNvbnRyb2wpOwotCQl0aGlzLnJlbW92ZUNvbnRyb2woY29udHJvbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TV1RDb21ib0FkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVENvbWJvQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDUwNzFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVENvbWJvQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotCi0vKioKLSAqIEFkYXB0IGFuIFNXVCB7QGxpbmsgQ29tYm99IHRvIHRoZSBsaXN0IHdpZGdldCBleHBlY3RlZCBieQotICoge0BsaW5rIExpc3RXaWRnZXRNb2RlbEJpbmRpbmd9IGFuZCB0aGUKLSAqIGRyb3AtZG93biBsaXN0IGJveCBleHBlY3RlZCBieSB7QGxpbmsgRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZ30uCi0gKi8KLWZpbmFsIGNsYXNzIFNXVENvbWJvQWRhcHRlcgotCWV4dGVuZHMgQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlcjxDb21ibz4KLQlpbXBsZW1lbnRzIERyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuRHJvcERvd25MaXN0Qm94Ci17Ci0JU1dUQ29tYm9BZGFwdGVyKENvbWJvIGNvbWJvKSB7Ci0JCXN1cGVyKGNvbWJvKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuTGlzdFdpZGdldCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JcHVibGljIFN0cmluZ1tdIGdldEl0ZW1zKCkgewotCQlyZXR1cm4gdGhpcy53aWRnZXQuZ2V0SXRlbXMoKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SXRlbShpbnQgaW5kZXgsIFN0cmluZyBpdGVtKSB7Ci0JCXRoaXMud2lkZ2V0LnNldEl0ZW0oaW5kZXgsIGl0ZW0pOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRJdGVtcyhTdHJpbmdbXSBpdGVtcykgewotCQl0aGlzLndpZGdldC5zZXRJdGVtcyhpdGVtcyk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcgaXRlbSwgaW50IGluZGV4KSB7Ci0JCXRoaXMud2lkZ2V0LmFkZChpdGVtLCBpbmRleCk7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJdGhpcy53aWRnZXQucmVtb3ZlKHN0YXJ0LCBlbmQpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0JCXRoaXMud2lkZ2V0LnJlbW92ZUFsbCgpOwotCX0KLQotCS8vICoqKioqKioqKiogQ29tYm9Cb3hTZWxlY3Rpb25CaW5kaW5nLkNvbWJvQm94IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLndpZGdldC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMud2lkZ2V0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JcHVibGljIGludCBnZXRTZWxlY3Rpb25JbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JfQotCXB1YmxpYyB2b2lkIHNlbGVjdChpbnQgaW5kZXgpIHsKLQkJdGhpcy53aWRnZXQuc2VsZWN0KGluZGV4KTsKLQl9Ci0JcHVibGljIHZvaWQgZGVzZWxlY3QoaW50IGluZGV4KSB7Ci0JCXRoaXMud2lkZ2V0LmRlc2VsZWN0KGluZGV4KTsKLQl9Ci0JcHVibGljIHZvaWQgZGVzZWxlY3RBbGwoKSB7Ci0JCXRoaXMud2lkZ2V0LmRlc2VsZWN0QWxsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU1dUTGlzdEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVExpc3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjgxZTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU1dUTGlzdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotCi0vKioKLSAqIEFkYXB0IGFuIFNXVCB7QGxpbmsgTGlzdH0gdG8gdGhlIGxpc3Qgd2lkZ2V0IGV4cGVjdGVkIGJ5Ci0gKiB7QGxpbmsgTGlzdFdpZGdldE1vZGVsQmluZGluZ30uCi0gKi8KLWZpbmFsIGNsYXNzIFNXVExpc3RBZGFwdGVyCi0JZXh0ZW5kcyBBYnN0cmFjdExpc3RXaWRnZXRBZGFwdGVyPExpc3Q+Ci17Ci0JU1dUTGlzdEFkYXB0ZXIoTGlzdCBsaXN0KSB7Ci0JCXN1cGVyKGxpc3QpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLndpZGdldC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMud2lkZ2V0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JcHVibGljIFN0cmluZ1tdIGdldEl0ZW1zKCkgewotCQlyZXR1cm4gdGhpcy53aWRnZXQuZ2V0SXRlbXMoKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SXRlbShpbnQgaW5kZXgsIFN0cmluZyBpdGVtKSB7Ci0JCXRoaXMud2lkZ2V0LnNldEl0ZW0oaW5kZXgsIGl0ZW0pOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRJdGVtcyhTdHJpbmdbXSBpdGVtcykgewotCQl0aGlzLndpZGdldC5zZXRJdGVtcyhpdGVtcyk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcgaXRlbSwgaW50IGluZGV4KSB7Ci0JCXRoaXMud2lkZ2V0LmFkZChpdGVtLCBpbmRleCk7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJdGhpcy53aWRnZXQucmVtb3ZlKHN0YXJ0LCBlbmQpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0JCXRoaXMud2lkZ2V0LnJlbW92ZUFsbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVFRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TV1RUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjI1ZjUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQml0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIFZhcmlvdXMgU1dUIHRvb2xzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBTV1RUb29scyB7Ci0KLQkvLyAqKioqKioqKioqIGNoZWNrLWJveC9yYWRpbyBidXR0b24vdG9nZ2xlIGJ1dHRvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgYnV0dG9uIChjaGVjay1ib3gsIHJhZGlvIGJ1dHRvbiwgb3IgdG9nZ2xlIGJ1dHRvbikKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGJvb2xlYW4gbW9kZWwuCi0JICogSWYgdGhlIGJvb2xlYW4gbW9kZWwgaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGJ1dHRvbidzICdzZWxlY3Rpb24nIHN0YXRlIHdpbGwKLQkgKiBiZSA8Y29kZT5mYWxzZTxjb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYmluZChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIEJ1dHRvbiBidXR0b24pIHsKLQkJYmluZChib29sZWFuTW9kZWwsIGJ1dHRvbiwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBidXR0b24gKGNoZWNrLWJveCwgcmFkaW8gYnV0dG9uLCBvciB0b2dnbGUgYnV0dG9uKQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgYm9vbGVhbiBtb2RlbC4KLQkgKiBJZiB0aGUgYm9vbGVhbiBtb2RlbCBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgYnV0dG9uJ3MgJ3NlbGVjdGlvbicgc3RhdGUgd2lsbAotCSAqIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYmluZChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIEJ1dHRvbiBidXR0b24sIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCS8vIHRoZSBuZXcgYmluZGluZyB3aWxsIGFkZCBpdHNlbGYgYXMgYSBsaXN0ZW5lciB0byB0aGUgYm9vbGVhbiBtb2RlbCBhbmQgdGhlIGJ1dHRvbgotCQluZXcgQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZyhib29sZWFuTW9kZWwsIGJ1dHRvbiwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGV4dCBmaWVsZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgdGV4dCBtb2RlbCB0byB0aGUgc3BlY2lmaWVkIHRleHQgZmllbGQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dE1vZGVsLCBUZXh0IHRleHRGaWVsZCkgewotCQkvLyB0aGUgbmV3IGJpbmRpbmcgd2lsbCBhZGQgaXRzZWxmIGFzIGEgbGlzdGVuZXIgdG8gdGhlIHRleHQgbW9kZWwgYW5kIHRoZSB0ZXh0IGZpZWxkCi0JCW5ldyBUZXh0RmllbGRNb2RlbEJpbmRpbmcodGV4dE1vZGVsLCB0ZXh0RmllbGQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGJveCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgotCSAqIFRoZSBsaXN0IGJveCBzZWxlY3Rpb24gaXMgaWdub3JlZC4KLQkgKiBVc2UgdGhlIGRlZmF1bHQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IGJveCwgd2hpY2ggY2FsbHMge0BsaW5rIE9iamVjdCN0b1N0cmluZygpfQotCSAqIG9uIHRoZSBpdGVtcyBpbiB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsLCBMaXN0IGxpc3RCb3gpIHsKLQkJYmluZChsaXN0TW9kZWwsIGxpc3RCb3gsIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCi0JICogVGhlIGxpc3QgYm94IHNlbGVjdGlvbiBpcyBpZ25vcmVkLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgTGlzdCBsaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCWJpbmQobGlzdE1vZGVsLCBuZXcgU1dUTGlzdEFkYXB0ZXIobGlzdEJveCksIHN0cmluZ0NvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQmluZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgotCSAqIFVzZSB0aGUgZGVmYXVsdCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LCB3aGljaCBjYWxscyB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nKCl9Ci0JICogb24gdGhlIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IHZvaWQgYmluZChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWwsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbU1vZGVsLCBMaXN0IGxpc3RCb3gpIHsKLQkJYmluZChsaXN0TW9kZWwsIHNlbGVjdGVkSXRlbU1vZGVsLCBsaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtTW9kZWwsIExpc3QgbGlzdEJveCwgU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikgewotCQljaGVja0ZvclNpbmdsZVNlbGVjdGlvblN0eWxlKGxpc3RCb3gpOwotCQliaW5kKGxpc3RNb2RlbCwgbmV3IFdyaXRhYmxlUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4oc2VsZWN0ZWRJdGVtTW9kZWwpLCBsaXN0Qm94LCBzdHJpbmdDb252ZXJ0ZXIpOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb25zIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCi0JICogVXNlIHRoZSBkZWZhdWx0IHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3gsIHdoaWNoIGNhbGxzIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKX0KLQkgKiBvbiB0aGUgaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1zTW9kZWwsIExpc3QgbGlzdEJveCkgewotCQliaW5kKGxpc3RNb2RlbCwgc2VsZWN0ZWRJdGVtc01vZGVsLCBsaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1zTW9kZWwsIExpc3QgbGlzdEJveCwgU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikgewotCQliaW5kKAotCQkJbGlzdE1vZGVsLAotCQkJbmV3IFNXVExpc3RBZGFwdGVyKGxpc3RCb3gpLAotCQkJc3RyaW5nQ29udmVydGVyLAotCQkJbmV3IExpc3RCb3hTZWxlY3Rpb25CaW5kaW5nPEU+KGxpc3RNb2RlbCwgc2VsZWN0ZWRJdGVtc01vZGVsLCBsaXN0Qm94KQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tGb3JTaW5nbGVTZWxlY3Rpb25TdHlsZShMaXN0IGxpc3RCb3gpIHsKLQkJaWYgKCAhIEJpdFRvb2xzLmZsYWdJc1NldChsaXN0Qm94LmdldFN0eWxlKCksIFNXVC5TSU5HTEUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJsaXN0IGJveCBtdXN0IGJlIHNpbmdsZS1zZWxlY3Rpb246ICIgKyBsaXN0Qm94KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkcm9wLWRvd24gbGlzdCBib3ggKioqKioqKioqKgotCi0JLyoqCi0JICogQmluZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGRyb3AtZG93biBsaXN0IGJveC4KLQkgKiBVc2UgdGhlIGRlZmF1bHQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBkcm9wLWRvd24gbGlzdCBib3gsIHdoaWNoIGNhbGxzIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKX0KLQkgKiBvbiB0aGUgaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtTW9kZWwsIENvbWJvIGRyb3BEb3duTGlzdEJveCkgewotCQliaW5kKGxpc3RNb2RlbCwgc2VsZWN0ZWRJdGVtTW9kZWwsIGRyb3BEb3duTGlzdEJveCwgU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBkcm9wLWRvd24gbGlzdCBib3guCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBkcm9wLWRvd24gbGlzdCBib3guCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtTW9kZWwsIENvbWJvIGRyb3BEb3duTGlzdEJveCwgU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikgewotCQljaGVja0ZvclJlYWRPbmx5U3R5bGUoZHJvcERvd25MaXN0Qm94KTsKLQkJU1dUQ29tYm9BZGFwdGVyIGNvbWJvQWRhcHRlciA9IG5ldyBTV1RDb21ib0FkYXB0ZXIoZHJvcERvd25MaXN0Qm94KTsKLQkJYmluZCgKLQkJCWxpc3RNb2RlbCwKLQkJCWNvbWJvQWRhcHRlciwKLQkJCXN0cmluZ0NvbnZlcnRlciwKLQkJCW5ldyBEcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nPEU+KGxpc3RNb2RlbCwgc2VsZWN0ZWRJdGVtTW9kZWwsIGNvbWJvQWRhcHRlcikKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRm9yUmVhZE9ubHlTdHlsZShXaWRnZXQgY29tYm9Cb3gpIHsKLQkJaWYgKCAhIEJpdFRvb2xzLmZsYWdJc1NldChjb21ib0JveC5nZXRTdHlsZSgpLCBTV1QuUkVBRF9PTkxZKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY29tYm8tYm94IG11c3QgYmUgcmVhZC1vbmx5OiAiICsgY29tYm9Cb3gpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgIndpZGdldCIgKioqKioqKioqKgotCi0JLyoqCi0JICogQmluZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgdG8gdGhlIHNwZWNpZmllZCBsaXN0IHdpZGdldC4KLQkgKiBUaGUgbGlzdCB3aWRnZXQncyBzZWxlY3Rpb24gaXMgaWdub3JlZC4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LgotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsLCBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLkxpc3RXaWRnZXQgbGlzdFdpZGdldCwgU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikgewotCQliaW5kKGxpc3RNb2RlbCwgbGlzdFdpZGdldCwgc3RyaW5nQ29udmVydGVyLCBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLlNlbGVjdGlvbkJpbmRpbmcuTnVsbC5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCB0byB0aGUgc3BlY2lmaWVkIGxpc3Qgd2lkZ2V0LgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHNlbGVjdGlvbiBiaW5kaW5nIHRvIGNvbnRyb2wgdGhlIGxpc3Qgd2lkZ2V0J3Mgc2VsZWN0aW9uLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IHZvaWQgYmluZChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWwsIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuTGlzdFdpZGdldCBsaXN0V2lkZ2V0LCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyLCBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLlNlbGVjdGlvbkJpbmRpbmcgc2VsZWN0aW9uQmluZGluZykgewotCQkvLyB0aGUgbmV3IGJpbmRpbmcgd2lsbCBhZGQgaXRzZWxmIGFzIGEgbGlzdGVuZXIgdG8gdGhlIHZhbHVlIG1vZGVscyBhbmQgdGhlIGxpc3QgYm94Ci0JCW5ldyBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nPEU+KGxpc3RNb2RlbCwgbGlzdFdpZGdldCwgc3RyaW5nQ29udmVydGVyLCBzZWxlY3Rpb25CaW5kaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogJ2VuYWJsZWQnIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnRyb2wgdGhlIDxlbT5lbmFibGVkPC9lbT4gc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9scyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbHMnCi0JICogPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZXMgd2lsbCBiZSA8Y29kZT5mYWxzZTxjb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb250cm9sLi4uIGNvbnRyb2xzKSB7Ci0JCWNvbnRyb2xFbmFibGVkU3RhdGUoYm9vbGVhbk1vZGVsLCBjb250cm9scywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENvbnRyb2wgdGhlIDxlbT5lbmFibGVkPC9lbT4gc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9scyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbHMnCi0JICogPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZXMgd2lsbCBiZSB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xFbmFibGVkU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29udHJvbFtdIGNvbnRyb2xzLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlzd2l0Y2ggKGNvbnRyb2xzLmxlbmd0aCkgewotCQkJY2FzZSAwOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVtcHR5IGNvbnRyb2xzIGFycmF5OiAiICsgQXJyYXlzLnRvU3RyaW5nKGNvbnRyb2xzKSk7Ci0JCQljYXNlIDE6Ci0JCQkJY29udHJvbEVuYWJsZWRTdGF0ZShib29sZWFuTW9kZWwsIGNvbnRyb2xzWzBdLCBkZWZhdWx0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQljb250cm9sRW5hYmxlZFN0YXRlKGJvb2xlYW5Nb2RlbCwgbmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPENvbnRyb2w+KGNvbnRyb2xzKSwgZGVmYXVsdFZhbHVlKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnRyb2wgdGhlIDxlbT5lbmFibGVkPC9lbT4gc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9scyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbHMnCi0JICogPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZXMgd2lsbCBiZSA8Y29kZT5mYWxzZTxjb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBJdGVyYWJsZTw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMpIHsKLQkJY29udHJvbEVuYWJsZWRTdGF0ZShib29sZWFuTW9kZWwsIGNvbnRyb2xzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlcyB3aWxsIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBJdGVyYWJsZTw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCWNvbnRyb2xFbmFibGVkU3RhdGUoYm9vbGVhbk1vZGVsLCBuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8Q29udHJvbD4oY29udHJvbHMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnRyb2wgdGhlIDxlbT5lbmFibGVkPC9lbT4gc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9scyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbHMnCi0JICogPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZXMgd2lsbCBiZSA8Y29kZT5mYWxzZTxjb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHNNb2RlbCkgewotCQljb250cm9sRW5hYmxlZFN0YXRlKGJvb2xlYW5Nb2RlbCwgY29udHJvbHNNb2RlbCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENvbnRyb2wgdGhlIDxlbT5lbmFibGVkPC9lbT4gc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9scyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbHMnCi0JICogPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZXMgd2lsbCBiZSB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xFbmFibGVkU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzTW9kZWwsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCWNvbnRyb2woYm9vbGVhbk1vZGVsLCBjb250cm9sc01vZGVsLCBkZWZhdWx0VmFsdWUsIEVOQUJMRURfQURBUFRFUik7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2wgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2wncwotCSAqIDxlbT5lbmFibGVkPC9lbT4gc3RhdGUgd2lsbCBiZSB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xFbmFibGVkU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29udHJvbCBjb250cm9sLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQljb250cm9sKGJvb2xlYW5Nb2RlbCwgY29udHJvbCwgZGVmYXVsdFZhbHVlLCBFTkFCTEVEX0FEQVBURVIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuQWRhcHRlciBFTkFCTEVEX0FEQVBURVIgPQotCQkJbmV3IEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZXRTdGF0ZShDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gYikgewotCQkJCQljb250cm9sLnNldEVuYWJsZWQoYik7Ci0JCQkJfQotCQkJfTsKLSAgIAotCi0JLy8gKioqKioqKioqKiAndmlzaWJsZScgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPnZpc2libGU8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlcyB3aWxsIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbnRyb2wuLi4gY29udHJvbHMpIHsKLQkJY29udHJvbFZpc2libGVTdGF0ZShib29sZWFuTW9kZWwsIGNvbnRyb2xzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPnZpc2libGU8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlcyB3aWxsIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbFZpc2libGVTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb250cm9sW10gY29udHJvbHMsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN3aXRjaCAoY29udHJvbHMubGVuZ3RoKSB7Ci0JCQljYXNlIDA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZW1wdHkgY29udHJvbHMgYXJyYXk6ICIgKyBBcnJheXMudG9TdHJpbmcoY29udHJvbHMpKTsKLQkJCWNhc2UgMToKLQkJCQljb250cm9sVmlzaWJsZVN0YXRlKGJvb2xlYW5Nb2RlbCwgY29udHJvbHNbMF0sIGRlZmF1bHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWNvbnRyb2xWaXNpYmxlU3RhdGUoYm9vbGVhbk1vZGVsLCBuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8Q29udHJvbD4oY29udHJvbHMpLCBkZWZhdWx0VmFsdWUpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPnZpc2libGU8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlcyB3aWxsIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scykgewotCQljb250cm9sVmlzaWJsZVN0YXRlKGJvb2xlYW5Nb2RlbCwgY29udHJvbHMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2xzJwotCSAqIDxlbT52aXNpYmxlPC9lbT4gc3RhdGVzIHdpbGwgYmUgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scywgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJY29udHJvbFZpc2libGVTdGF0ZShib29sZWFuTW9kZWwsIG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb250cm9sPihjb250cm9scyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPnZpc2libGU8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlcyB3aWxsIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9sc01vZGVsKSB7Ci0JCWNvbnRyb2xWaXNpYmxlU3RhdGUoYm9vbGVhbk1vZGVsLCBjb250cm9sc01vZGVsLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPnZpc2libGU8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlcyB3aWxsIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbFZpc2libGVTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHNNb2RlbCwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJY29udHJvbChib29sZWFuTW9kZWwsIGNvbnRyb2xzTW9kZWwsIGRlZmF1bHRWYWx1ZSwgVklTSUJMRV9BREFQVEVSKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbCdzCi0JICogPGVtPnZpc2libGU8L2VtPiBzdGF0ZSB3aWxsIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbFZpc2libGVTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCWNvbnRyb2woYm9vbGVhbk1vZGVsLCBjb250cm9sLCBkZWZhdWx0VmFsdWUsIFZJU0lCTEVfQURBUFRFUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9vbGVhblN0YXRlQ29udHJvbGxlci5BZGFwdGVyIFZJU0lCTEVfQURBUFRFUiA9Ci0JCQluZXcgQm9vbGVhblN0YXRlQ29udHJvbGxlci5BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNldFN0YXRlKENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBiKSB7Ci0JCQkJCWNvbnRyb2wuc2V0VmlzaWJsZShiKTsKLQkJCQl9Ci0JCQl9OwotICAgCi0KLQkvLyAqKioqKioqKioqIGJvb2xlYW4gc3RhdGUgY29udHJvbGxlciAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnRyb2woUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzTW9kZWwsIGJvb2xlYW4gZGVmYXVsdFZhbHVlLCBCb29sZWFuU3RhdGVDb250cm9sbGVyLkFkYXB0ZXIgYWRhcHRlcikgewotCQkvLyB0aGUgbmV3IGNvbnRyb2xsZXIgd2lsbCBhZGQgaXRzZWxmIGFzIGEgbGlzdGVuZXIgdG8gdGhlIHZhbHVlIG1vZGVsIGFuZCB0aGUgY29udHJvbHMKLQkJbmV3IE11bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIoYm9vbGVhbk1vZGVsLCBjb250cm9sc01vZGVsLCBkZWZhdWx0VmFsdWUsIGFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udHJvbChQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gZGVmYXVsdFZhbHVlLCBCb29sZWFuU3RhdGVDb250cm9sbGVyLkFkYXB0ZXIgYWRhcHRlcikgewotCQkvLyB0aGUgbmV3IGNvbnRyb2xsZXIgd2lsbCBhZGQgaXRzZWxmIGFzIGEgbGlzdGVuZXIgdG8gdGhlIHZhbHVlIG1vZGVsIGFuZCB0aGUgY29udHJvbHMKLQkJbmV3IFNpbXBsZUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIoYm9vbGVhbk1vZGVsLCBjb250cm9sLCBkZWZhdWx0VmFsdWUsIGFkYXB0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgU1dUVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU2ltcGxlQm9vbGVhblN0YXRlQ29udHJvbGxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU2ltcGxlQm9vbGVhblN0YXRlQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmYxNThlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NpbXBsZUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogVGhpcyBjb250cm9sbGVyIGVuYWJsZXMgYSBib29sZWFuIG1vZGVsIHRvIGNvbnRyb2wgZWl0aGVyIHRoZQotICogPGVtPmVuYWJsZWQ8L2VtPiBvciA8ZW0+dmlzaWJsZTwvZW0+IHByb3BlcnRpZXMgb2YgYW4gU1dUIGNvbnRyb2w7IGkuZS4gdGhlCi0gKiBjb250cm9sJ3MgcHJvcGVydHkgaXMga2VwdCBpbiBzeW5jaCB3aXRoIHRoZSBib29sZWFuIG1vZGVsLAotICogYnV0IDxlbT5ub3Q8L2VtPiB2aWNlLXZlcnNhLgotICogPHA+Ci0gKiBPbmNlIHRoZSBjb250cm9sIGlzIGRpc3Bvc2VkLCB0aGlzIGNvbnRyb2xsZXIgaXMga2FwdXQuCi0gKiAKLSAqIEBzZWUgUHJvcGVydHlWYWx1ZU1vZGVsCi0gKiBAc2VlIENvbnRyb2wjc2V0RW5hYmxlZChib29sZWFuKQotICogQHNlZSBDb250cm9sI3NldFZpc2libGUoYm9vbGVhbikKLSAqLwotZmluYWwgY2xhc3MgU2ltcGxlQm9vbGVhblN0YXRlQ29udHJvbGxlcgotCWV4dGVuZHMgQm9vbGVhblN0YXRlQ29udHJvbGxlcgotewotCXByaXZhdGUgZmluYWwgQ29udHJvbCBjb250cm9sOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gbW9kZWwsIHRoZSBjb250cm9sLCBhbmQgdGhlIGFkYXB0ZXIgYXJlIHJlcXVpcmVkLgotCSAqLwotCVNpbXBsZUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLAotCQkJQ29udHJvbCBjb250cm9sLAotCQkJYm9vbGVhbiBkZWZhdWx0VmFsdWUsCi0JCQlBZGFwdGVyIGFkYXB0ZXIKLQkpIHsKLQkJc3VwZXIoYm9vbGVhbk1vZGVsLCBkZWZhdWx0VmFsdWUsIGFkYXB0ZXIpOwotCQlpZiAoY29udHJvbCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbnRyb2wgPSBjb250cm9sOwotCQl0aGlzLmVuZ2FnZUJvb2xlYW5Nb2RlbCgpOwotCQl0aGlzLmVuZ2FnZUNvbnRyb2woY29udHJvbCk7Ci0JCXRoaXMuc2V0Q29udHJvbFN0YXRlKGNvbnRyb2wsIHRoaXMuZ2V0Qm9vbGVhblZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250cm9scyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQl2b2lkIHNldENvbnRyb2xTdGF0ZShib29sZWFuIGIpIHsKLQkJdGhpcy5zZXRDb250cm9sU3RhdGUodGhpcy5jb250cm9sLCBiKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIGNvbnRyb2xEaXNwb3NlZChDb250cm9sIGMpIHsKLQkJc3VwZXIuY29udHJvbERpc3Bvc2VkKGMpOwotCQl0aGlzLmRpc2VuZ2FnZUJvb2xlYW5Nb2RlbCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvVGV4dEZpZWxkTW9kZWxCaW5kaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9UZXh0RmllbGRNb2RlbEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiMGM0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9UZXh0RmllbGRNb2RlbEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGlzIGJpbmRpbmcgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIHRleHQgZmllbGQKLSAqIHN5bmNocm9uaXplZCB3aXRoIGEgbW9kZWwgdGV4dC9zdHJpbmcuCi0gKiAKLSAqIEBzZWUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwKLSAqIEBzZWUgVGV4dAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWNsYXNzIFRleHRGaWVsZE1vZGVsQmluZGluZyB7Ci0KLQkvKioKLQkgKiBUaGUgdGV4dCBtb2RlbCB3ZSBrZWVwIHN5bmNocm9uaXplZCB3aXRoIHRoZSB0ZXh0IGZpZWxkLgotCSAqLwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0TW9kZWw7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSB0ZXh0IGZpZWxkJ3MgY29udGVudHMgd2l0aAotCSAqIHRoZSB0ZXh0IG1vZGVsLgotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0ZXh0TW9kZWxDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSB0ZXh0IGZpZWxkIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIHRleHQgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBUZXh0IHRleHRGaWVsZDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgb3VyIHRleHQgbW9kZWwKLQkgKiB3aXRoIHRoZSB0ZXh0IGZpZWxkJ3MgY29udGVudHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNb2RpZnlMaXN0ZW5lciB0ZXh0RmllbGRNb2RpZnlMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgdGV4dCBmaWVsZAotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByaXZhdGUgZmluYWwgRGlzcG9zZUxpc3RlbmVyIHRleHRGaWVsZERpc3Bvc2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEhtbS4uLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzZXR0aW5nVGV4dEZpZWxkVGV4dCA9IGZhbHNlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHRleHQgbW9kZWwgYW5kIHRleHQgZmllbGQgYXJlIHJlcXVpcmVkLgotCSAqLwotCVRleHRGaWVsZE1vZGVsQmluZGluZyhXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRNb2RlbCwgVGV4dCB0ZXh0RmllbGQpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKCh0ZXh0TW9kZWwgPT0gbnVsbCkgfHwgKHRleHRGaWVsZCA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy50ZXh0TW9kZWwgPSB0ZXh0TW9kZWw7Ci0JCXRoaXMudGV4dEZpZWxkID0gdGV4dEZpZWxkOwotCi0JCXRoaXMudGV4dE1vZGVsQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGV4dE1vZGVsQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy50ZXh0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudGV4dE1vZGVsQ2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMudGV4dEZpZWxkTW9kaWZ5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGV4dEZpZWxkTW9kaWZ5TGlzdGVuZXIoKTsKLQkJdGhpcy50ZXh0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcy50ZXh0RmllbGRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJdGhpcy50ZXh0RmllbGREaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGV4dEZpZWxkRGlzcG9zZUxpc3RlbmVyKCk7Ci0JCXRoaXMudGV4dEZpZWxkLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLnRleHRGaWVsZERpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zZXRUZXh0RmllbGRUZXh0KHRleHRNb2RlbC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVGV4dE1vZGVsQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFRleHRNb2RlbENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUZXh0TW9kZWxDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxCaW5kaW5nLnRoaXMudGV4dE1vZGVsQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0ZXh0IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGJ1aWxkVGV4dEZpZWxkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxCaW5kaW5nLnRoaXMudGV4dEZpZWxkTW9kaWZpZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRleHQgZmllbGQgbW9kaWZ5IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIERpc3Bvc2VMaXN0ZW5lciBidWlsZFRleHRGaWVsZERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEJpbmRpbmcudGhpcy50ZXh0RmllbGREaXNwb3NlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidGV4dCBmaWVsZCBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGV4dCBtb2RlbCBldmVudHMgKioqKioqKioqKgotCi0JLyogcHJpdmF0ZSAqLyB2b2lkIHRleHRNb2RlbENoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoICEgdGhpcy50ZXh0RmllbGQuaXNEaXNwb3NlZCgpKSB7ICAvLyA/Pz8KLQkJCXRoaXMuc2V0VGV4dEZpZWxkVGV4dCgoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0RmllbGRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCS8vIHRoZSB0ZXh0IG1vZGVsIGNhbiBiZSBudWxsLCBidXQgdGhlIHRleHQgZmllbGQgY2Fubm90Ci0JCXRoaXMuc2V0VGV4dEZpZWxkVGV4dF8oKHRleHQgPT0gbnVsbCkgPyAiIiA6IHRleHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0RmllbGRUZXh0XyhTdHJpbmcgdGV4dCkgewotCQlpZiAoICEgdGV4dC5lcXVhbHModGhpcy50ZXh0RmllbGQuZ2V0VGV4dCgpKSkgeyAgLy8gPz8/Ci0JCQl0aGlzLnNldFRleHRGaWVsZFRleHRfXyh0ZXh0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0RmllbGRUZXh0X18oU3RyaW5nIHRleHQpIHsKLQkJdGhpcy5zZXR0aW5nVGV4dEZpZWxkVGV4dCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRleHRGaWVsZC5zZXRUZXh0KHRleHQpOwotCQl9IGZpbmFsbHkgewotCQkJdGhpcy5zZXR0aW5nVGV4dEZpZWxkVGV4dCA9IGZhbHNlOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRleHQgZmllbGQgZXZlbnRzICoqKioqKioqKioKLQotCS8qIHByaXZhdGUgKi8gdm9pZCB0ZXh0RmllbGRNb2RpZmllZCgpIHsKLQkJaWYgKCAhIHRoaXMuc2V0dGluZ1RleHRGaWVsZFRleHQpIHsKLQkJCXRoaXMuc2V0VGV4dE1vZGVsVGV4dCh0aGlzLnRleHRGaWVsZC5nZXRUZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRleHRNb2RlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKCAhIHRleHQuZXF1YWxzKHRoaXMudGV4dE1vZGVsLmdldFZhbHVlKCkpKSB7ICAvLyA/Pz8KLQkJCXRoaXMudGV4dE1vZGVsLnNldFZhbHVlKHRleHQpOwotCQl9Ci0JfQotCi0JLyogcHJpdmF0ZSAqLyB2b2lkIHRleHRGaWVsZERpc3Bvc2VkKCkgewotCQkvLyB0aGUgdGV4dCBmaWVsZCBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMudGV4dEZpZWxkLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLnRleHRGaWVsZERpc3Bvc2VMaXN0ZW5lcik7Ci0JCXRoaXMudGV4dEZpZWxkLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMudGV4dEZpZWxkTW9kaWZ5TGlzdGVuZXIpOwotCQl0aGlzLnRleHRNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy50ZXh0TW9kZWxDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy50ZXh0TW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3MvQWJzdHJhY3RKcGFWaWV3LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9BYnN0cmFjdEpwYVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyZmNkZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9BYnN0cmFjdEpwYVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBWZXJzYW50LiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczogVmVyc2FudCBhbmQgT3RoZXJzLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIEpQQSB2aWV3LiBUaGUgc2VsZWN0aW9uIGlzIGNoYW5nZWQKLSAqIGJ5IHJlY2VpdmluZyBhIDxjb2RlPklKcGFTZWxlY3Rpb248L2NvZGU+LgotICoKLSAqIEBzZWUgSnBhU2VsZWN0aW9uCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpwYVZpZXcgZXh0ZW5kcyBWaWV3UGFydAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHBhZ2UgdXNlZCB3aGVuIG5vdGhpbmcgY2FuIGJlIHNob3duLgotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGRlZmF1bHRDb21wb3NpdGU7Ci0KLQkvKioKLQkgKiBUaGUgc3RyaW5nIHRvIGRpc3BsYXkgd2hlbiB0aGVyZSBpcyBubyB2aWV3IGNvbnRlbnQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0TGFiZWw7Ci0KLQkvKioKLQkgKiBUaGUgY29udGFpbmVyIG9mIHRoZSBjdXJyZW50IHBhZ2UuCi0JICovCi0JcHJpdmF0ZSBQYWdlQm9vayBwYWdlQm9vazsKLQotCXByaXZhdGUgU2Nyb2xsZWRGb3JtIHNjcm9sbGVkRm9ybTsKLQkKLQkKLQkvKioKLQkgKiBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFyaW91cyB3aWRnZXRzLgotCSAqLwotCXByaXZhdGUgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEpwYVZpZXc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGRlZmF1bHRMYWJlbAotCSAqLwotCXB1YmxpYyBBYnN0cmFjdEpwYVZpZXcoU3RyaW5nIGRlZmF1bHRMYWJlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLmRlZmF1bHRMYWJlbCA9IGRlZmF1bHRMYWJlbDsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYnVpbGREZWZhdWx0Q29tcG9zaXRlKCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFnZUJvb2spOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBkZWZhdWx0TGFiZWwpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5zY3JvbGxlZEZvcm0gPSBnZXRGb3JtV2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVNjcm9sbGVkRm9ybShwYXJlbnQpOwotCQlKcHRVaVBsdWdpbi5pbnN0YW5jZSgpLmNvbnRyb2xBZmZlY3RzSmF2YVNvdXJjZSh0aGlzLnNjcm9sbGVkRm9ybSk7Ci0JCXRoaXMuc2Nyb2xsZWRGb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJdGhpcy5wYWdlQm9vayA9IG5ldyBQYWdlQm9vayh0aGlzLnNjcm9sbGVkRm9ybS5nZXRCb2R5KCksIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJdGhpcy5wYWdlQm9vay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdGhpcy5zY3JvbGxlZEZvcm0uc2V0Q29udGVudCh0aGlzLnBhZ2VCb29rKTsKLQotCQl0aGlzLmRlZmF1bHRDb21wb3NpdGUgPSBidWlsZERlZmF1bHRDb21wb3NpdGUoKTsKLQkJdGhpcy5wYWdlQm9vay5zaG93UGFnZSh0aGlzLmRlZmF1bHRDb21wb3NpdGUpOwotCi0JCXN1YmNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7Ci0KLQkJSnBhU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyID0KLQkJCVNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmdldFNlbGVjdGlvbk1hbmFnZXIoZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0KLQkJc2VsZWN0aW9uTWFuYWdlci5yZWdpc3Rlcih0aGlzKTsKLQkJc2VsZWN0KHNlbGVjdGlvbk1hbmFnZXIuZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUGFnZUJvb2sgZ2V0UGFnZUJvb2soKSB7Ci0JCXJldHVybiB0aGlzLnBhZ2VCb29rOwotCX0KLQotCXB1YmxpYyBmaW5hbCBXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiB0aGlzLndpZGdldEZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBKUEEgdmlldy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLndpZGdldEZhY3RvcnkgPSBuZXcgUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkoCi0JCQluZXcgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCX0KLQotCXByaXZhdGUgRm9ybVRvb2xraXQgZ2V0Rm9ybVdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoKEZvcm1XaWRnZXRGYWN0b3J5KSB3aWRnZXRGYWN0b3J5KS5nZXRXaWRnZXRGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCwgdXBkYXRlIHRoZSBjdXJyZW50IHBhZ2UgYnkgdXNpbmcgdGhlIGdpdmVuCi0JICogc2VsZWN0aW9uIHN0YXRlLgotCSAqCi0JICogQHBhcmFtIGpwYVNlbGVjdGlvbiBUaGUgbmV3IHNlbGVjdGlvbiB1c2VkIHRvIHVwZGF0ZSB0aGlzIEpQQSB2aWV3Ci0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2VsZWN0KEpwYVNlbGVjdGlvbiBqcGFTZWxlY3Rpb24pOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXBhZ2VCb29rLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgY3VycmVudCBwYWdlIGFuZCBzaG93IHRoZSBkZWZhdWx0IG9uZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93RGVmYXVsdFBhZ2UoKSB7Ci0JCXNob3dQYWdlKGRlZmF1bHRDb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGN1cnJlbnQgcGFnZSBhbmQgc2hvdyB0aGUgZ2l2ZW4gb25lLgotCSAqCi0JICogQHBhcmFtIHBhZ2UgVGhlIG5ldyBwYWdlIHRvIHNob3csIDxjb2RlPm51bGw8L2NvZGU+IGNhbid0IGJlIHBhc3NlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNob3dQYWdlKENvbnRyb2wgcGFnZSkgewotCQlwYWdlLnNldFBhcmVudCh0aGlzLnBhZ2VCb29rKTsKLQkJdGhpcy5wYWdlQm9vay5zaG93UGFnZShwYWdlKTsKLQkJdGhpcy5zY3JvbGxlZEZvcm0ucmVmbG93KHRydWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN1YmNyZWF0ZVBhcnRDb250cm9sKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIG5vIG9wIC0gZm9yIHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUgaWYgd2lzaGVkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9KcGFEZXRhaWxzVmlldy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3MvSnBhRGV0YWlsc1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI4MDU2ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9KcGFEZXRhaWxzVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybVVpUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBKUEEgdmlldyB0aGF0IHNob3dzIHRoZSBkZXRhaWxzIG9mIGEgc3RydWN0dXJlIG5vZGUKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpwYURldGFpbHNWaWV3IGV4dGVuZHMgQWJzdHJhY3RKcGFWaWV3Ci17Ci0JLyoqCi0JICogVGhlIGN1cnJlbnQgPGNvZGU+SnBhRGV0YWlsc1BhZ2U8L2NvZGU+IHRoYXQgd2FzIHJldHJpZXZlIGJhc2VkIG9uIHRoZQotCSAqIGN1cnJlbnQgc2VsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgSnBhRGV0YWlsc1BhZ2U8SnBhU3RydWN0dXJlTm9kZT4gY3VycmVudFBhZ2U7Ci0KLQkvKioKLQkgKiBUaGUgY3VycmVudCBzZWxlY3Rpb24gdXNlZCB0byBzaG93IHRoZSByaWdodCA8Y29kZT5JSnBhRGV0YWlsc1BhZ2U8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgSnBhU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0KLQkvL1RPRE8gdGhpcyBpcyBjcmFwLCBhIE1hcCBvZiBNYXBzIG9mIE1hcHMuIE5lZWRzIHRvIGJlIGRvbmUgZGlmZmVyZW50bHksIHRoZSBmYWN0b3J5L3BsYXRmb3JtIHNob3VsZCBoYW5kbGUgY2FjaGluZyBpbnN0ZWFkCi0JLy8ga2V5MSBwbGF0Zm9ybSBpZAotCS8vIGtleTIgSnBhUmVzb3VyY2VUeXBlCi0JLy8ga2V5MyBzdHJ1Y3R1cmUgbm9kZSB0eXBlCi0JLy8gdmFsdWUgQ29tcG9zaXRlIHBhZ2UKLQlwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxKcGFSZXNvdXJjZVR5cGUsIE1hcDxTdHJpbmcsIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4+PiBkZXRhaWxzUGFnZXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYURldGFpbHNWaWV3PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSnBhRGV0YWlsc1ZpZXcoKSB7Ci0JCXN1cGVyKEpwdFVpTWVzc2FnZXMuSnBhRGV0YWlsc1ZpZXdfdmlld05vdEF2YWlsYWJsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCi0JCXRoaXMuY3VycmVudFNlbGVjdGlvbiA9IEpwYVNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjsKLQkJdGhpcy5kZXRhaWxzUGFnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxKcGFSZXNvdXJjZVR5cGUsIE1hcDxTdHJpbmcsIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4+PigpOwotCX0KLQotCXByaXZhdGUgSnBhUGxhdGZvcm1VaSBnZXRKcGFQbGF0Zm9ybVVpKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgewotCQlTdHJpbmcgcGxhdGZvcm1JZCA9IHN0cnVjdHVyZU5vZGUuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0SWQoKTsKLQkJcmV0dXJuIEpwYVBsYXRmb3JtVWlSZWdpc3RyeS5pbnN0YW5jZSgpLmdldEpwYVBsYXRmb3JtVWkocGxhdGZvcm1JZCk7Ci0JfQotCi0JcHVibGljIEpwYVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmN1cnJlbnRTZWxlY3Rpb247Ci0JfQotCQotCXByaXZhdGUgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGdldERldGFpbHNQYWdlKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgewotCQlTdHJpbmcgcGxhdGZvcm1JZCA9IHN0cnVjdHVyZU5vZGUuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0SWQoKTsKLQkJaWYgKHRoaXMuZGV0YWlsc1BhZ2VzLmNvbnRhaW5zS2V5KHBsYXRmb3JtSWQpKSB7Ci0JCQlNYXA8SnBhUmVzb3VyY2VUeXBlLCBNYXA8U3RyaW5nLCBKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4+PiBwbGF0Zm9ybURldGFpbHNQYWdlcyA9IHRoaXMuZGV0YWlsc1BhZ2VzLmdldChwbGF0Zm9ybUlkKTsKLQkJCU1hcDxTdHJpbmcsIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4gY29udGVudFR5cGVEZXRhaWxzUGFnZXMgPSBwbGF0Zm9ybURldGFpbHNQYWdlcy5nZXQoc3RydWN0dXJlTm9kZS5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JCQlpZiAoY29udGVudFR5cGVEZXRhaWxzUGFnZXMgIT0gbnVsbCkgewotCQkJCUpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBwYWdlID0gIGNvbnRlbnRUeXBlRGV0YWlsc1BhZ2VzLmdldChzdHJ1Y3R1cmVOb2RlLmdldElkKCkpOwotCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQkJaWYgKHBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcGxhdGZvcm1EZXRhaWxzUGFnZXMucmVtb3ZlKHN0cnVjdHVyZU5vZGUuZ2V0SWQoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gcGFnZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVpbGREZXRhaWxzUGFnZShzdHJ1Y3R1cmVOb2RlKTsKLQl9Ci0KLQlwcml2YXRlIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBidWlsZERldGFpbHNQYWdlKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgewotCQlKcGFQbGF0Zm9ybVVpIGpwYVBsYXRmb3JtVWkgPSBnZXRKcGFQbGF0Zm9ybVVpKHN0cnVjdHVyZU5vZGUpOwotCQkKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoZ2V0UGFnZUJvb2soKSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoU1dULkhPUklaT05UQUwpKTsKLQotCQlKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4gcGFnZSA9IGpwYVBsYXRmb3JtVWkuYnVpbGRKcGFEZXRhaWxzUGFnZShjb250YWluZXIsIHN0cnVjdHVyZU5vZGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWlmIChwYWdlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIHBsYXRmb3JtSWQgPSBzdHJ1Y3R1cmVOb2RlLmdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpLmdldElkKCk7Ci0JCU1hcDxKcGFSZXNvdXJjZVR5cGUsIE1hcDxTdHJpbmcsIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4+IHBsYXRmb3JtRGV0YWlsc1BhZ2VzID0gdGhpcy5kZXRhaWxzUGFnZXMuZ2V0KHBsYXRmb3JtSWQpOwotCQlpZiAocGxhdGZvcm1EZXRhaWxzUGFnZXMgPT0gbnVsbCkgewotCQkJcGxhdGZvcm1EZXRhaWxzUGFnZXMgPSBuZXcgSGFzaE1hcDxKcGFSZXNvdXJjZVR5cGUsIE1hcDxTdHJpbmcsIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4+KCk7Ci0JCQl0aGlzLmRldGFpbHNQYWdlcy5wdXQocGxhdGZvcm1JZCwgcGxhdGZvcm1EZXRhaWxzUGFnZXMpOwotCQl9Ci0JCUpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBzdHJ1Y3R1cmVOb2RlLmdldFJlc291cmNlVHlwZSgpOwotCQlNYXA8U3RyaW5nLCBKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4+IGNvbnRlbnRUeXBlRGV0YWlsc1BhZ2VzID0gcGxhdGZvcm1EZXRhaWxzUGFnZXMuZ2V0KHJlc291cmNlVHlwZSk7Ci0JCWlmIChjb250ZW50VHlwZURldGFpbHNQYWdlcyA9PSBudWxsKSB7Ci0JCQljb250ZW50VHlwZURldGFpbHNQYWdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+PigpOwotCQkJcGxhdGZvcm1EZXRhaWxzUGFnZXMucHV0KHJlc291cmNlVHlwZSwgY29udGVudFR5cGVEZXRhaWxzUGFnZXMpOwotCQl9Ci0JCWNvbnRlbnRUeXBlRGV0YWlsc1BhZ2VzLnB1dChzdHJ1Y3R1cmVOb2RlLmdldElkKCksIHBhZ2UpOwotCi0JCXJldHVybiBwYWdlOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIHNlbGVjdChKcGFTZWxlY3Rpb24ganBhU2VsZWN0aW9uKSB7Ci0JCWlmIChqcGFTZWxlY3Rpb24uZXF1YWxzKHRoaXMuY3VycmVudFNlbGVjdGlvbikpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRoaXMuY3VycmVudFNlbGVjdGlvbiA9IGpwYVNlbGVjdGlvbjsKLQkJaWYgKGpwYVNlbGVjdGlvbiA9PSBKcGFTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT04pIHsKLQkJCWlmICh0aGlzLmN1cnJlbnRQYWdlICE9IG51bGwpIHsKLQkJCQl0aGlzLmN1cnJlbnRQYWdlLnNldFN1YmplY3QobnVsbCk7Ci0JCQkJdGhpcy5zZXRDdXJyZW50UGFnZShudWxsKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlKcGFTdHJ1Y3R1cmVOb2RlIG5ld05vZGUgPSBqcGFTZWxlY3Rpb24uZ2V0U2VsZWN0ZWROb2RlKCk7Ci0JCUpwYURldGFpbHNQYWdlPEpwYVN0cnVjdHVyZU5vZGU+IG5ld1BhZ2UgPSAoSnBhRGV0YWlsc1BhZ2U8SnBhU3RydWN0dXJlTm9kZT4pIGdldERldGFpbHNQYWdlKG5ld05vZGUpOwotCQlpZiAodGhpcy5jdXJyZW50UGFnZSAhPSBudWxsICYmIHRoaXMuY3VycmVudFBhZ2UgIT0gbmV3UGFnZSl7Ci0JCQl0cnkgewotCQkJCXRoaXMuY3VycmVudFBhZ2Uuc2V0U3ViamVjdChudWxsKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JCWlmIChuZXdQYWdlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbmV3UGFnZS5zZXRTdWJqZWN0KG5ld05vZGUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQluZXdQYWdlID0gbnVsbDsvLyBTaG93IGVycm9yIHBhZ2UKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJc2V0Q3VycmVudFBhZ2UobmV3UGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgY3VycmVudCBwYWdlIGFuZCBzaG93cyB0aGUgZ2l2ZW4gcGFnZS4KLQkgKgotCSAqIEBwYXJhbSBuZXdQYWdlIFRoZSBuZXcgcGFnZSB0byBkaXNwbGF5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEN1cnJlbnRQYWdlKEpwYURldGFpbHNQYWdlPEpwYVN0cnVjdHVyZU5vZGU+IG5ld1BhZ2UpIHsKLQkJdGhpcy5jdXJyZW50UGFnZSA9IG5ld1BhZ2U7Ci0KLQkJLy8gU2hvdyBuZXcgcGFnZQotCQlpZiAobmV3UGFnZSA9PSBudWxsKSB7Ci0JCQlzaG93RGVmYXVsdFBhZ2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXNob3dQYWdlKG5ld1BhZ2UuZ2V0Q29udHJvbCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZvciAoTWFwPEpwYVJlc291cmNlVHlwZSwgTWFwPFN0cmluZywgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+Pj4gcmVzb3VyY2VUeXBlTWFwIDogdGhpcy5kZXRhaWxzUGFnZXMudmFsdWVzKCkpIHsKLQkJCWZvciAoTWFwPFN0cmluZywgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+PiBkZXRhaWxzUGFnZU1hcCA6IHJlc291cmNlVHlwZU1hcC52YWx1ZXMoKSkgewotCQkJCWZvciAoSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGRldGFpbHNQYWdlIDogZGV0YWlsc1BhZ2VNYXAudmFsdWVzKCkpIHsKLQkJCQkJZGV0YWlsc1BhZ2UuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0aGlzLmRldGFpbHNQYWdlcy5jbGVhcigpOwotCi0JCXRoaXMuY3VycmVudFNlbGVjdGlvbiA9IEpwYVNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjsKLQkJdGhpcy5jdXJyZW50UGFnZSA9IG51bGw7Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9zdHJ1Y3R1cmUvSnBhU3RydWN0dXJlUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3Mvc3RydWN0dXJlL0pwYVN0cnVjdHVyZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdmNzgyMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9zdHJ1Y3R1cmUvSnBhU3RydWN0dXJlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzLnN0cnVjdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkRlZmF1bHRKcGFTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2VTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZTsKLQotcHVibGljIGNsYXNzIEpwYVN0cnVjdHVyZVBhZ2UgCi0JZXh0ZW5kcyBQYWdlCi0JaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIKLXsKLQlwcml2YXRlIGZpbmFsIEpwYVN0cnVjdHVyZVZpZXcganBhU3RydWN0dXJlVmlldzsKLQkKLQlKcGFGaWxlIGpwYUZpbGU7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBJRmlsZSBmaWxlOwotCQotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCQotCXByaXZhdGUgZmluYWwgSnBhU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXI7Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29udHJvbDsKLQkKLQlwcml2YXRlIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLQkKLQlUcmVlVmlld2VyIHZpZXdlcjsKLQkKLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdCBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJMaXN0OwotCQotCXByaXZhdGUgZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB0cmVlU2VsZWN0aW9uTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHRyZWVQb3N0U2VsZWN0aW9uTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgcHJvamVjdHNMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBqcGFGaWxlc0xpc3RlbmVyOwotCQotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVQYWdlKAotCQkJSnBhU3RydWN0dXJlVmlldyBqcGFTdHJ1Y3R1cmVWaWV3LCBKcGFGaWxlIGpwYUZpbGUsIEpwYVN0cnVjdHVyZVByb3ZpZGVyIHN0cnVjdHVyZVByb3ZpZGVyKSB7Ci0JCQotCQl0aGlzLmpwYVN0cnVjdHVyZVZpZXcgPSBqcGFTdHJ1Y3R1cmVWaWV3OwotCQl0aGlzLmpwYUZpbGUgPSBqcGFGaWxlOwotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFGaWxlLmdldEpwYVByb2plY3QoKTsKLQkJdGhpcy5maWxlID0ganBhRmlsZS5nZXRGaWxlKCk7Ci0JCXRoaXMuc3RydWN0dXJlUHJvdmlkZXIgPSBzdHJ1Y3R1cmVQcm92aWRlcjsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQl0aGlzLnRyZWVTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBUcmVlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCk7Ci0JCXRoaXMudHJlZVBvc3RTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBUcmVlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpOwotCQl0aGlzLnByb2plY3RzTGlzdGVuZXIgPSBidWlsZFByb2plY3RzTGlzdGVuZXIoKTsKLQkJdGhpcy5qcGFGaWxlc0xpc3RlbmVyID0gYnVpbGRKcGFGaWxlc0xpc3RlbmVyKCk7Ci0JfQotCQotCQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvamVjdHNMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKXsKLQkJCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSnBhU3RydWN0dXJlUGFnZS50aGlzLnByb2plY3RzUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMucHJvamVjdHNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMucHJvamVjdHNDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMucHJvamVjdHNDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQl2b2lkIHByb2plY3RzUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChKcGFQcm9qZWN0IGl0ZW0gOiAoSXRlcmFibGU8SnBhUHJvamVjdD4pIGV2ZW50LmdldEl0ZW1zKCkpIHsKLQkJCWlmIChpdGVtLmdldFByb2plY3QoKSA9PSBKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMuZmlsZS5nZXRQcm9qZWN0KCkpIHsKLQkJCQlzZXRKcGFQcm9qZWN0KG51bGwpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0Jdm9pZCBwcm9qZWN0c0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlmb3IgKEpwYVByb2plY3QgaXRlbSA6IChJdGVyYWJsZTxKcGFQcm9qZWN0PikgZXZlbnQuZ2V0SXRlbXMoKSkgewotCQkJaWYgKGl0ZW0uZ2V0UHJvamVjdCgpID09IEpwYVN0cnVjdHVyZVBhZ2UudGhpcy5maWxlLmdldFByb2plY3QoKSkgewotCQkJCXNldEpwYVByb2plY3QoaXRlbSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHByb2plY3RzQ2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJc2V0SnBhUHJvamVjdChudWxsKTsKLQl9Ci0JCi0Jdm9pZCBwcm9qZWN0c0NoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlzZXRKcGFQcm9qZWN0KEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0aGlzLmZpbGUuZ2V0UHJvamVjdCgpKSk7Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkSnBhRmlsZXNMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKXsKLQkJCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSnBhU3RydWN0dXJlUGFnZS50aGlzLmpwYUZpbGVzUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMuanBhRmlsZXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMuanBhRmlsZXNDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMuanBhRmlsZXNDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0Jdm9pZCBqcGFGaWxlc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoSnBhRmlsZSBpdGVtIDogKEl0ZXJhYmxlPEpwYUZpbGU+KSBldmVudC5nZXRJdGVtcygpKSB7Ci0JCQlpZiAoaXRlbSA9PSBKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMuanBhRmlsZSkgewotCQkJCXNldEpwYUZpbGUobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQl2b2lkIGpwYUZpbGVzQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoSnBhRmlsZSBpdGVtIDogKEl0ZXJhYmxlPEpwYUZpbGU+KSBldmVudC5nZXRJdGVtcygpKSB7Ci0JCQlpZiAoaXRlbS5nZXRGaWxlKCkgIT0gbnVsbCAmJiBpdGVtLmdldEZpbGUoKS5lcXVhbHMoSnBhU3RydWN0dXJlUGFnZS50aGlzLmZpbGUpKSB7Ci0JCQkJc2V0SnBhRmlsZShpdGVtKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQganBhRmlsZXNDbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlzZXRKcGFGaWxlKG51bGwpOwotCX0KLQotCXZvaWQganBhRmlsZXNDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc2V0SnBhRmlsZSh0aGlzLmpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmZpbGUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0SnBhUHJvamVjdChKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJaWYgKHRoaXMuanBhUHJvamVjdCA9PSBqcGFQcm9qZWN0KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMuanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmpwYVByb2plY3QucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKEpwYVByb2plY3QuSlBBX0ZJTEVTX0NPTExFQ1RJT04sIHRoaXMuanBhRmlsZXNMaXN0ZW5lcik7Ci0JCX0KLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJaWYgKHRoaXMuanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmpwYVByb2plY3QuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKEpwYVByb2plY3QuSlBBX0ZJTEVTX0NPTExFQ1RJT04sIHRoaXMuanBhRmlsZXNMaXN0ZW5lcik7Ci0JCQlzZXRKcGFGaWxlKHRoaXMuanBhUHJvamVjdC5nZXRKcGFGaWxlKEpwYVN0cnVjdHVyZVBhZ2UudGhpcy5maWxlKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRKcGFGaWxlKG51bGwpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRKcGFGaWxlKEpwYUZpbGUganBhRmlsZSkgewotCQlpZiAodGhpcy5qcGFGaWxlID09IGpwYUZpbGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmpwYUZpbGUgPSBqcGFGaWxlOwotCQlTV1RVdGlsLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsJCQkJCQkKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMudmlld2VyLnNldElucHV0KEpwYVN0cnVjdHVyZVBhZ2UudGhpcy5qcGFGaWxlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoSVBhZ2VTaXRlIHBhZ2VTaXRlKSB7Ci0JCXN1cGVyLmluaXQocGFnZVNpdGUpOwotCQlwYWdlU2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb250cm9sLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsJCQotCQl2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihjb250cm9sLCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQl2aWV3ZXIuc2V0QXV0b0V4cGFuZExldmVsKDIpOwotCQlEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHByb3ZpZGVyCi0JCQk9IG5ldyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKAotCQkJCXN0cnVjdHVyZVByb3ZpZGVyLmdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpLAotCQkJCXN0cnVjdHVyZVByb3ZpZGVyLmdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpKTsKLQkJdGhpcy5jb250ZW50QW5kTGFiZWxQcm92aWRlciA9IHByb3ZpZGVyOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJLy8gVE9ETyBVc2UgcHJvYmxlbSBkZWNvcmF0b3IKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIocHJvdmlkZXIpOwotCQl0aGlzLnZpZXdlci5zZXRJbnB1dCh0aGlzLmpwYUZpbGUpOwotCQllbmdhZ2VMaXN0ZW5lcnMoKTsKLQkJaW5pdENvbnRleHRNZW51KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJdGhpcy52aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMudHJlZVNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdGhpcy52aWV3ZXIuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzLnRyZWVQb3N0U2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLmpwYVByb2plY3QuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKEpwYVByb2plY3QuSlBBX0ZJTEVTX0NPTExFQ1RJT04sIHRoaXMuanBhRmlsZXNMaXN0ZW5lcik7Ci0JCUpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhUHJvamVjdE1hbmFnZXIuSlBBX1BST0pFQ1RTX0NPTExFQ1RJT04sIHRoaXMucHJvamVjdHNMaXN0ZW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpc2VuZ2FnZUxpc3RlbmVycygpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0TWFuYWdlcigpLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihKcGFQcm9qZWN0TWFuYWdlci5KUEFfUFJPSkVDVFNfQ09MTEVDVElPTiwgdGhpcy5wcm9qZWN0c0xpc3RlbmVyKTsKLQkJaWYgKHRoaXMuanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmpwYVByb2plY3QucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKEpwYVByb2plY3QuSlBBX0ZJTEVTX0NPTExFQ1RJT04sIHRoaXMuanBhRmlsZXNMaXN0ZW5lcik7Ci0JCX0KLQkJdGhpcy52aWV3ZXIucmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzLnRyZWVQb3N0U2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLnZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcy50cmVlU2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGV4dE1lbnUoKSB7Ci0gICAgICAgIC8vIENyZWF0ZSBkeW5hbWljIG1lbnUgbWdyLiAgRHluYW1pYyBpcyBjdXJyZW50bHkgcmVxdWlyZWQgdG8KLSAgICAgICAgLy8gc3VwcG9ydCBhY3Rpb24gY29udHJpYnV0aW9ucy4KLSAgICAgICAgTWVudU1hbmFnZXIgbWdyID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIG1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0gICAgICAgIG1nci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0gICAgICAgICAgICAgICAgSnBhU3RydWN0dXJlUGFnZS50aGlzLmZpbGxDb250ZXh0TWVudShtZW51TWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBNZW51IG1lbnUgPSBtZ3IuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0gICAgICAgIHZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLSAgICAgICAgdGhpcy5qcGFTdHJ1Y3R1cmVWaWV3LmdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KG1nciwgdmlld2VyKTsKLSAgICB9CQotCQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250ZXh0IG1lbnUgaXMgYWJvdXQgdG8gb3Blbi4KLSAgICAgKiBEZWxlZ2F0ZXMgdG8gdGhlIGFjdGlvbiBncm91cCB1c2luZyB0aGUgdmlld2VyJ3Mgc2VsZWN0aW9uIGFzIHRoZSBhY3Rpb24gY29udGV4dC4KLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLSAgICB9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQljb250cm9sLnNldEZvY3VzKCk7Ci0JfQotCQotCQotCQotCXZvaWQgc2VsZWN0KEpwYVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbi5nZXRTZWxlY3RlZE5vZGUoKSksIHRydWUpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSVNlbGVjdGlvblByb3ZpZGVyIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIElUcmVlU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIChJVHJlZVNlbGVjdGlvbikgdmlld2VyLmdldFNlbGVjdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgSnBhU2VsZWN0aW9uIGdldEpwYVNlbGVjdGlvbigpIHsKLQkJSVRyZWVTZWxlY3Rpb24gdmlld2VyU2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCQotCQlpZiAodmlld2VyU2VsZWN0aW9uLmlzRW1wdHkoKSB8fCB2aWV3ZXJTZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJcmV0dXJuIEpwYVNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjsKLQkJfQotCQlyZXR1cm4gbmV3IERlZmF1bHRKcGFTZWxlY3Rpb24oKEpwYVN0cnVjdHVyZU5vZGUpIHZpZXdlclNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIHJlbGF5cyB0cmVlIHNlbGVjdGlvbiBldmVudCB0byBsaXN0ZW5lcnMgb2YgdGhpcyBwYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gY3JlYXRlIGFuIGV2ZW50Ci0JCWZpbmFsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IAotCQkJCW5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKTsKLQkJCi0JCS8vIGZpcmUgdGhlIGV2ZW50Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGwgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotCQkJU2FmZVJ1bm5lci5ydW4oCi0JCQkJCW5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJbC5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzQmFyKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGdldFNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJaWYgKCEgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJaWYgKHNzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShOTFMuYmluZChKcHRVaU1lc3NhZ2VzLkpwYVN0cnVjdHVyZVZpZXdfbnVtSXRlbXNTZWxlY3RlZCwgc3NlbGVjdGlvbi5zaXplKCkpKTsKLQkJfQotCQllbHNlIHsKLQkJCU9iamVjdCBzZWxPYmogPSBzc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZSgKLQkJCQl0aGlzLmNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmdldEltYWdlKHNlbE9iaiksIAotCQkJCXRoaXMuY29udGVudEFuZExhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oc2VsT2JqKSk7Ci0JCX0KLQl9Ci0JCi0JCi0JY2xhc3MgVHJlZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotCQlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLQl7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMuZmlyZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCQotCQotCWNsYXNzIFRyZWVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0JCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotCXsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCUpwYVN0cnVjdHVyZVBhZ2UudGhpcy51cGRhdGVTdGF0dXNCYXIoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ZpZXdzL3N0cnVjdHVyZS9KcGFTdHJ1Y3R1cmVWaWV3LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9zdHJ1Y3R1cmUvSnBhU3RydWN0dXJlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2VkNDEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ZpZXdzL3N0cnVjdHVyZS9KcGFTdHJ1Y3R1cmVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3Muc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uSnBhU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uSnBhU2VsZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NZXNzYWdlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2tWaWV3OwotCi1wdWJsaWMgY2xhc3MgSnBhU3RydWN0dXJlVmlldwotCWV4dGVuZHMgUGFnZUJvb2tWaWV3Ci17Ci0JcHVibGljIEpwYVN0cnVjdHVyZVZpZXcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlUGFydENvbnRyb2wocGFyZW50KTsKLQkJCi0JCUpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciA9Ci0JCQlTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeS5nZXRTZWxlY3Rpb25NYW5hZ2VyKHRoaXMuZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0JCQotCQlzZWxlY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKHRoaXMpOwotCQl0aGlzLnNlbGVjdChzZWxlY3Rpb25NYW5hZ2VyLmdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkvLyBkbyBzYW1lIHRoaW5nIGFzIHBhcnRBY3RpdmF0ZWQsIHdoaWNoIHdpbGwgY2hlY2sgdG8gc2VlIGlmIHRoZSAKLQkJLy8gcGFydCBpcyBhbiBlZGl0b3IsIGluIHdoaWNoIGNhc2UsIHdlIHdhbnQgdG8gc2hvdyB0aGUgcmlnaHQgcGFnZQotCQlwYXJ0QWN0aXZhdGVkKHBhcnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ltcG9ydGFudChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXJldHVybiBwYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQ7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJV29ya2JlbmNoUGFydCBnZXRCb290c3RyYXBQYXJ0KCkgewotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gdGhpcy5nZXRTaXRlKCkuZ2V0UGFnZSgpOwotICAgICAgICByZXR1cm4gKHBhZ2UgPT0gbnVsbCkgPyBudWxsIDogcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElQYWdlIGNyZWF0ZURlZmF1bHRQYWdlKFBhZ2VCb29rIGJvb2spIHsKLQkJTWVzc2FnZVBhZ2UgcGFnZSA9IG5ldyBNZXNzYWdlUGFnZSgpOwotICAgICAgICB0aGlzLmluaXRQYWdlKHBhZ2UpOwotICAgICAgICBwYWdlLmNyZWF0ZUNvbnRyb2woYm9vayk7Ci0gICAgICAgIHBhZ2Uuc2V0TWVzc2FnZShKcHRVaU1lc3NhZ2VzLkpwYVN0cnVjdHVyZVZpZXdfc3RydWN0dXJlTm90QXZhaWxhYmxlKTsKLSAgICAgICAgcmV0dXJuIHBhZ2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQYWdlUmVjIGRvQ3JlYXRlUGFnZShJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCS8vIHVzZSB0aGUgcGxhdGZvcm0gYWRhcHRlciBzZXJ2aWNlIHNvIHRoZSBzdHJ1Y3R1cmUgdmlldyBjYW4gYmUKLQkJLy8gYXNzb2NpYXRlZCB3aXRoIGFueSBJRWRpdG9yUGFydCB0aGF0IGhhcyBhbiBhc3NvY2lhdGVkIGFkYXB0ZXIKLQkJLy8gZmFjdG9yeSB0aGF0IGNhbiBnaXZlIHVzIHRoZSBKUEEgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVkaXRvciBwYXJ0Ci0JCS8vIEBzZWUgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkVkaXRvclBhcnRBZGFwdGVyRmFjdG9yeQotCQlKcGFGaWxlIGpwYUZpbGUgPSAoSnBhRmlsZSkgcGFydC5nZXRBZGFwdGVyKEpwYUZpbGUuY2xhc3MpOwotCQlpZiAoanBhRmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUpwYVN0cnVjdHVyZVByb3ZpZGVyIHN0cnVjdHVyZVByb3ZpZGVyID0gdGhpcy5nZXRTdHJ1Y3R1cmVQcm92aWRlcihqcGFGaWxlKTsKLQkJaWYgKHN0cnVjdHVyZVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSnBhU3RydWN0dXJlUGFnZSBwYWdlID0gbmV3IEpwYVN0cnVjdHVyZVBhZ2UodGhpcywganBhRmlsZSwgc3RydWN0dXJlUHJvdmlkZXIpOwotCQl0aGlzLmluaXRQYWdlKHBhZ2UpOwotCQlwYWdlLmNyZWF0ZUNvbnRyb2wodGhpcy5nZXRQYWdlQm9vaygpKTsKLQkJcmV0dXJuIG5ldyBQYWdlUmVjKHBhcnQsIHBhZ2UpOwotCX0KLQkKLQlwcml2YXRlIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKEpwYUZpbGUganBhRmlsZSkgewotCQlyZXR1cm4gdGhpcy5nZXRQbGF0Zm9ybVVpKGpwYUZpbGUpLmdldFN0cnVjdHVyZVByb3ZpZGVyKGpwYUZpbGUpOwotCX0KLQkKLQlwcml2YXRlIEpwYVBsYXRmb3JtVWkgZ2V0UGxhdGZvcm1VaShKcGFGaWxlIGpwYUZpbGUpIHsKLQkJcmV0dXJuIEpwdFVpUGx1Z2luLmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1VaShqcGFGaWxlLmdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9EZXN0cm95UGFnZShJV29ya2JlbmNoUGFydCBwYXJ0LCBQYWdlUmVjIHBhZ2VSZWNvcmQpIHsKLQkJSnBhU3RydWN0dXJlUGFnZSBwYWdlID0gKEpwYVN0cnVjdHVyZVBhZ2UpIHBhZ2VSZWNvcmQucGFnZTsKLSAgICAgICAgcGFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIHBhZ2VSZWNvcmQuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgSnBhU2VsZWN0aW9uIGdldEpwYVNlbGVjdGlvbigpIHsKLQkJaWYgKHRoaXMuZ2V0Q3VycmVudFBhZ2UoKSAhPSB0aGlzLmdldERlZmF1bHRQYWdlKCkpIHsKLQkJCXJldHVybiAoKEpwYVN0cnVjdHVyZVBhZ2UpIHRoaXMuZ2V0Q3VycmVudFBhZ2UoKSkuZ2V0SnBhU2VsZWN0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIEpwYVNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0KEpwYVNlbGVjdGlvbiBuZXdTZWxlY3Rpb24pIHsKLQkJLy8gY29ycmVjdCBwYWdlIHNob3VsZCBiZSBzaG93bgotCQlpZiAodGhpcy5nZXRDdXJyZW50UGFnZSgpICE9IHRoaXMuZ2V0RGVmYXVsdFBhZ2UoKSkgewotCQkJKChKcGFTdHJ1Y3R1cmVQYWdlKSB0aGlzLmdldEN1cnJlbnRQYWdlKCkpLnNlbGVjdChuZXdTZWxlY3Rpb24pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldFNlbGVjdGlvblByb3ZpZGVyKCkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlTGlzdFBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlTGlzdFBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwNjljNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZUxpc3RQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4gdXNlcyBhIDxjb2RlPlRhYmxlPC9jb2RlPgotICogYXMgaXRzIG1haW4gd2lkZ2V0LCBhIDxjb2RlPkxpc3Q8L2NvZGU+IGNhbid0IGJlIHVzZWQgYmVjYXVzZSBpdCBkb2Vzbid0Ci0gKiBzdXBwb3J0IHNob3dpbmcgaW1hZ2VzLiBIb3dldmVyLCB0aGUgdGFibGUgaXMgZGlzcGxheWVkIGxpa2UgYSBsaXN0LgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLSB8Ci0gKiB8IHwgSXRlbSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBBZGQuLi4gIHwgfAotICogfCB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0tLS0tLS0tLS0tIHwKLSAqIHwgfCBJdGVtIG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBFZGl0Li4uIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBSZW1vdmUgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBZGRSZW1vdmVMaXN0UGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQWRkUmVtb3ZlUGFuZTxUPgotewotCi0JLyoqCi0JICogVGhlIG1haW4gd2lkZ2V0IG9mIHRoaXMgYWRkL3JlbW92ZSBwYW5lLgotCSAqLwotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZUxpc3RQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSB0YWJsZSBob2xkZXIncyBpdGVtcwotCSAqLwotCXB1YmxpYyBBZGRSZW1vdmVMaXN0UGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZUxpc3RQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSB0YWJsZSBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQotCSAqLwotCXB1YmxpYyBBZGRSZW1vdmVMaXN0UGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyLAotCQkgICAgICBoZWxwSWQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlTGlzdFBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIHRhYmxlIGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICogQHBhcmFtIHBhcmVudE1hbmFnZVBhbmUgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaGF2ZSB0aGUgcGFyZW50IHBhbmUgbWFuYWdlCi0JICogdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhpcyBwYW5lCi0JICovCi0JcHVibGljIEFkZFJlbW92ZUxpc3RQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBhcmVudE1hbmFnZVBhbmUpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLAotCQkgICAgICBwYXJlbnQsCi0JCSAgICAgIGFkYXB0ZXIsCi0JCSAgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgbGFiZWxQcm92aWRlciwKLQkJICAgICAgaGVscElkLAotCQkgICAgICBwYXJlbnRNYW5hZ2VQYW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZUxpc3RQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgdGFibGUgaG9sZGVyJ3MgaXRlbXMKLQkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlTGlzdFBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwKLQkJICAgICAgc3ViamVjdEhvbGRlciwKLQkJICAgICAgcGFyZW50LAotCQkgICAgICBhZGFwdGVyLAotCQkgICAgICBsaXN0SG9sZGVyLAotCQkgICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgIGxhYmVsUHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlTGlzdFBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSB0YWJsZSBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQotCSAqLwotCXB1YmxpYyBBZGRSZW1vdmVMaXN0UGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLAotCQkgICAgICBzdWJqZWN0SG9sZGVyLAotCQkgICAgICBwYXJlbnQsCi0JCSAgICAgIGFkYXB0ZXIsCi0JCSAgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgbGFiZWxQcm92aWRlciwKLQkJICAgICAgaGVscElkKTsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkFkYXB0ZXI8T2JqZWN0PiBidWlsZENvbHVtbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sdW1uQWRhcHRlcjxPYmplY3Q+KCkgewotCQkJcHVibGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gY2VsbE1vZGVscyhPYmplY3Qgc3ViamVjdCkgewotCQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gdmFsdWVIb2xkZXJzID0gbmV3IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+WzFdOwotCQkJCXZhbHVlSG9sZGVyc1swXSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PihzdWJqZWN0KTsKLQkJCQlyZXR1cm4gdmFsdWVIb2xkZXJzOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGNvbHVtbkNvdW50KCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGNvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJcmV0dXJuICIiOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJc3VwZXIuaXRlbXNBZGRlZChlKTsKLQkJcmV2YWxpZGF0ZUxheW91dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCXN1cGVyLml0ZW1zTW92ZWQoZSk7Ci0JCXJldmFsaWRhdGVMYXlvdXQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJc3VwZXIuaXRlbXNSZW1vdmVkKGUpOwotCQlyZXZhbGlkYXRlTGF5b3V0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJc3VwZXIuaXRlbXNSZXBsYWNlZChlKTsKLQkJcmV2YWxpZGF0ZUxheW91dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCXN1cGVyLmxpc3RDaGFuZ2VkKGUpOwotCQlyZXZhbGlkYXRlTGF5b3V0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQlzdXBlci5saXN0Q2xlYXJlZChlKTsKLQkJcmV2YWxpZGF0ZUxheW91dCgpOwotCX0KLQotCS8qKgotCSAqIFJldmFsaWRhdGVzIHRoZSB0YWJsZSBsYXlvdXQgYWZ0ZXIgdGhlIGxpc3Qgb2YgaXRlbXMgaGFzIGNoYW5nZWQuIFRoZQotCSAqIGxheW91dCBoYXMgdG8gYmUgZG9uZSBpbiBhIG5ldyBVSSB0aHJlYWQgYmVjYXVzZSBvdXIgbGlzdGVuZXIgbWlnaHQgYmUKLQkgKiBub3RpZmllZCBiZWZvcmUgdGhlIHRhYmxlIGhhcyBiZWVuIHVwZGF0ZWQgKHRhYmxlIGNvbHVtbiBhZGRlZCBvciByZW1vdmVkKS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmV2YWxpZGF0ZUxheW91dCgpIHsKLQkJU1dUVXRpbC5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoIXRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJCXRhYmxlLmdldFBhcmVudCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJdGFibGUuZ2V0UGFyZW50KCkubGF5b3V0KCk7Ci0JCQl9Ci0JCX19KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKAotCQkJYnVpbGRTZWxlY3RlZEl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZ2V0U2VsZWN0aW9uTW9kZWwoKS5zZXRTZWxlY3RlZFZhbHVlKGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJdXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8T2JqZWN0PiBidWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPE9iamVjdD4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50PE9iamVjdD4gZSkgewotCQkJCUFkZFJlbW92ZUxpc3RQYW5lLnRoaXMuc2VsZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGFkZFRhYmxlQ29udGFpbmVyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBhZGRQYW5lKGNvbnRhaW5lciwgYnVpbGRUYWJsZUNvbnRhaW5lckxheW91dCgpKTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgTGF5b3V0IGJ1aWxkVGFibGVDb250YWluZXJMYXlvdXQoKSB7Ci0JCXJldHVybiBuZXcgTGF5b3V0KCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGhIaW50LAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHRIaW50LAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCi0JCQkJVGFibGUgdGFibGUgPSAoVGFibGUpIGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpWzBdOwotCQkJCVRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKDApOwotCQkJCWludCBjb2x1bW5XaWR0aCA9IHRhYmxlQ29sdW1uLmdldFdpZHRoKCk7Ci0JCQkJcGFja0NvbHVtbih0YWJsZSk7Ci0KLQkJCQkvLyBDYWxjdWxhdGUgdGhlIHRhYmxlIHNpemUgYW5kIGFkanVzdCBpdCB3aXRoIHRoZSBoaW50cwotCQkJCVBvaW50IHNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCQkJaWYgKHdpZHRoSGludCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQlzaXplLnggPSB3aWR0aEhpbnQ7Ci0JCQkJfQotCi0JCQkJaWYgKGhlaWdodEhpbnQgIT0gU1dULkRFRkFVTFQpIHsKLQkJCQkJc2l6ZS55ID0gaGVpZ2h0SGludDsKLQkJCQl9Ci0KLQkJCQkvLyBSZXZlcnQgdGhlIGNvbHVtbidzIHdpZHRoIHRvIGl0cyBjdXJyZW50IHZhbHVlCi0JCQkJdGFibGUuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQl0YWJsZS5zZXRMYXlvdXREZWZlcnJlZCh0cnVlKTsKLQkJCQl0YWJsZUNvbHVtbi5zZXRXaWR0aChjb2x1bW5XaWR0aCk7Ci0JCQkJdGFibGUuc2V0TGF5b3V0RGVmZXJyZWQoZmFsc2UpOwotCQkJCXRhYmxlLnNldFJlZHJhdyh0cnVlKTsKLQotCQkJCXJldHVybiBzaXplOwotCQkJfQotCi0JCQlwcml2YXRlIGJvb2xlYW4gaXNWZXJ0aWNhbFNjcm9sbGJhckJhclZpc2libGUoVGFibGUgdGFibGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGNsaWVudEFyZWEpIHsKLQotCQkJCS8vIEdldCB0aGUgaGVpZ2h0IG9mIGFsbCB0aGUgcm93cwotCQkJCWludCBoZWlnaHQgPSB0YWJsZS5nZXRJdGVtQ291bnQoKSAqIHRhYmxlLmdldEl0ZW1IZWlnaHQoKTsKLQotCQkJCS8vIFJlbW92ZSB0aGUgYm9yZGVyIGZyb20gdGhlIGhlaWdodAotCQkJCWhlaWdodCArPSAodGFibGUuZ2V0Qm9yZGVyV2lkdGgoKSAqIDIpOwotCi0JCQkJcmV0dXJuIChjbGllbnRBcmVhLmhlaWdodCA8IGhlaWdodCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCi0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0KLQkJCQlpZiAoYm91bmRzLndpZHRoID4gMCkgewotCi0JCQkJCVRhYmxlIHRhYmxlID0gKFRhYmxlKSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKVswXTsKLQkJCQkJdGFibGUuc2V0Qm91bmRzKDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0KLQkJCQkJdXBkYXRlVGFibGVDb2x1bW5XaWR0aCgKLQkJCQkJCXRhYmxlLAotCQkJCQkJYm91bmRzLndpZHRoLAotCQkJCQkJaXNWZXJ0aWNhbFNjcm9sbGJhckJhclZpc2libGUodGFibGUsIGJvdW5kcykKLQkJCQkJKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByaXZhdGUgdm9pZCBwYWNrQ29sdW1uKFRhYmxlIHRhYmxlKSB7Ci0KLQkJCQlUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IHRhYmxlLmdldENvbHVtbigwKTsKLQotCQkJCXRhYmxlLnNldFJlZHJhdyhmYWxzZSk7Ci0JCQkJdGFibGUuc2V0TGF5b3V0RGVmZXJyZWQodHJ1ZSk7Ci0JCQkJdGFibGVDb2x1bW4ucGFjaygpOwotCQkJCXRhYmxlLnNldExheW91dERlZmVycmVkKGZhbHNlKTsKLQkJCQl0YWJsZS5zZXRSZWRyYXcodHJ1ZSk7Ci0KLQkJCQkvLyBDYWNoZSB0aGUgY29sdW1uIHdpZHRoIHNvIGl0IGNhbiBiZSB1c2VkIGluCi0JCQkJLy8gdXBkYXRlVGFibGVDb2x1bW5XaWR0aCgpIHdoZW4gZGV0ZXJtaW5lIHdoaWNoIHdpZHRoIHRvIHVzZQotCQkJCXRhYmxlLnNldERhdGEoCi0JCQkJCSJjb2x1bW4ud2lkdGgiLAotCQkJCQlJbnRlZ2VyLnZhbHVlT2YodGFibGVDb2x1bW4uZ2V0V2lkdGgoKSkKLQkJCQkpOwotCQkJfQotCi0JCQlwcml2YXRlIHZvaWQgdXBkYXRlVGFibGVDb2x1bW5XaWR0aChUYWJsZSB0YWJsZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdmVydGljYWxTY3JvbGxiYXJCYXJWaXNpYmxlKSB7Ci0KLQkJCQkvLyBSZW1vdmUgdGhlIGJvcmRlciBmcm9tIHRoZSB3aWR0aAotCQkJCXdpZHRoIC09ICh0YWJsZS5nZXRCb3JkZXJXaWR0aCgpICogMik7Ci0KLQkJCQkvLyBSZW1vdmUgdGhlIHNjcm9sbGJhciBmcm9tIHRoZSB3aWR0aCBpZiBpdCBpcyBzaG93bgotCQkJCWlmICh2ZXJ0aWNhbFNjcm9sbGJhckJhclZpc2libGUpIHsKLQkJCQkJd2lkdGggLT0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCkueDsKLQkJCQl9Ci0KLQkJCQlUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IHRhYmxlLmdldENvbHVtbigwKTsKLQotCQkJCS8vIFJldHJpZXZlIHRoZSBjYWNoZWQgY29sdW1uIHdpZHRoLCB3aGljaCBpcyByZXF1aXJlZCBmb3IKLQkJCQkvLyBkZXRlcm1pbmluZyB3aGljaCB3aWR0aCB0byB1c2UgKHRoZSBjb2x1bW4gd2lkdGggb3IgdGhlCi0JCQkJLy8gY2FsY3VsYXRlZCB3aWR0aCkKLQkJCQlJbnRlZ2VyIGNvbHVtbldpdGRoID0gKEludGVnZXIpIHRhYmxlLmdldERhdGEoImNvbHVtbi53aWR0aCIpOwotCi0JCQkJLy8gVXNlIHRoZSBjYWxjdWxhdGVkIHdpZHRoIGlmIHRoZSBjb2x1bW4gaXMgc21hbGxlciwgb3RoZXJ3aXNlCi0JCQkJLy8gdXNlIHRoZSBjb2x1bW4gd2lkdGggYW5kIGEgaG9yaXpvbnRhbCBzY3JvbGwgYmFyIHdpbGwgc2hvdyB1cAotCQkJCXdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGNvbHVtbldpdGRoKTsKLQotCQkJCS8vIEFkanVzdCB0aGUgY29sdW1uIHdpZHRoCi0JCQkJdGFibGVDb2x1bW4uc2V0V2lkdGgod2lkdGgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSVRhYmxlTGFiZWxQcm92aWRlciBidWlsZFRhYmxlTGFiZWxQcm92aWRlcihJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlyZXR1cm4gbmV3IFRhYmxlTGFiZWxQcm92aWRlcigoSUxhYmVsUHJvdmlkZXIpIGxhYmVsUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXRNYWluQ29udHJvbCgpIHsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYWluQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQl0YWJsZSA9IGFkZFVubWFuYWdlZFRhYmxlKAotCQkJYWRkVGFibGVDb250YWluZXIoY29udGFpbmVyKSwKLQkJCVNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSwKLQkJCWhlbHBJZAotCQkpOwotCi0KLQkJVGFibGVNb2RlbEFkYXB0ZXIgbW9kZWwgPSBUYWJsZU1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCShMaXN0VmFsdWVNb2RlbDxPYmplY3Q+KSBsaXN0SG9sZGVyLAotCQkJZ2V0U2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRUYWJsZUxhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcikKLQkJKTsKLQotCQltb2RlbC5hZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihidWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0JCXNlbGVjdGVkSXRlbUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJYnVpbGRTZWxlY3RlZEl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkKLQkJKTsKLQotCQlpbml0aWFsaXplVGFibGUodGFibGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBnaXZlbiB0YWJsZSwgd2hpY2ggYWN0cyBsaWtlIGEgbGlzdCBpbiBvdXIgY2FzZS4KLQkgKgotCSAqIEBwYXJhbSB0YWJsZSBUaGUgbWFpbiB3aWRnZXQgb2YgdGhpcyBwYW5lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlKFRhYmxlIHRhYmxlKSB7Ci0KLQkJdGFibGUuc2V0RGF0YSgiY29sdW1uLndpZHRoIiwgbmV3IEludGVnZXIoMCkpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLCB1cGRhdGUgKDEpIHRoZSBzZWxlY3RlZCBpdGVtIGhvbGRlciwgKDIpIHRoZQotCSAqIHNlbGVjdGlvbiBtb2RlbCBhbmQgKDMpIHRoZSBidXR0b25zLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKCkgewotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGdldFNlbGVjdGVkSXRlbUhvbGRlcigpOwotCQlPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgc2VsZWN0aW9uTW9kZWwgPSBnZXRTZWxlY3Rpb25Nb2RlbCgpOwotCQlpbnQgc2VsZWN0aW9uQ291bnQgPSB0aGlzLnRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCk7Ci0KLQkJaWYgKHNlbGVjdGlvbkNvdW50ID09IDApIHsKLQkJCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJCXNlbGVjdGlvbk1vZGVsLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0aW9uQ291bnQgIT0gMSkgewotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkJc2VsZWN0aW9uTW9kZWwuY2xlYXJTZWxlY3Rpb24oKTsKLQotCQkJZm9yIChpbnQgaW5kZXggOiB0aGlzLnRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSkgewotCQkJCXNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGlvbkludGVydmFsKGluZGV4LCBpbmRleCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgc2VsZWN0ZWRJbmRleCA9IHRoaXMudGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCU9iamVjdCBzZWxlY3RlZEl0ZW0gPSBnZXRMaXN0SG9sZGVyKCkuZ2V0KHNlbGVjdGVkSW5kZXgpOwotCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUoc2VsZWN0ZWRJdGVtKTsKLQkJCXNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoc2VsZWN0ZWRJdGVtKTsKLQkJfQotCi0JCXVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGxhYmVsIHByb3ZpZGVyIHNpbXBseSBkZWxlZ2F0ZXMgdGhlIHJlbmRlcmluZyB0byB0aGUgcHJvdmlkZWQKLQkgKiA8Y29kZT5JTGFiZWxQcm92aWRlcjwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQkJVGFibGVMYWJlbFByb3ZpZGVyKElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBsYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBsYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwMjJmYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiBhIHBhbmUgdGhhdCBoYXMgYnV0dG9ucyBmb3IgYWRkaW5nLCByZW1vdmluZyBhbmQKLSAqIHBvc3NpYmx5IGVkaXRpbmcgdGhlIGl0ZW1zLgotICoKLSAqIEBzZWUgQWRkUmVtb3ZlTGlzdFBhbmUKLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFkZFJlbW92ZVBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIFBhbmU8VD4KLXsKLQlwcml2YXRlIEFkYXB0ZXIgYWRhcHRlcjsKLQlwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247Ci0JcHJpdmF0ZSBDb21wb3NpdGUgY29udGFpbmVyOwotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkOwotCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyOwotCXByaXZhdGUgQnV0dG9uIG9wdGlvbmFsQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0ZWRJdGVtSG9sZGVyOwotCXByaXZhdGUgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIHNlbGVjdGlvbk1vZGVsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyIFRoaXMgPGNvZGU+QWRhcHRlcjwvY29kZT4gaXMgdXNlZCB0byBkaWN0YWN0ZSB0aGUgYmVoYXZpb3IKLQkgKiBvZiB0aGlzIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IGFuZCBieSBkZWxlZ2F0aW5nIHRvIGl0IHNvbWUgb2YgdGhlCi0JICogYmVoYXZpb3IKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKi8KLQlwcm90ZWN0ZWQgQWRkUmVtb3ZlUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJdGhpcyhwYXJlbnRQYW5lLAotCQkgICAgIHBhcmVudCwKLQkJICAgICBhZGFwdGVyLAotCQkgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyIFRoaXMgPGNvZGU+QWRhcHRlcjwvY29kZT4gaXMgdXNlZCB0byBkaWN0YWN0ZSB0aGUgYmVoYXZpb3IKLQkgKiBvZiB0aGlzIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IGFuZCBieSBkZWxlZ2F0aW5nIHRvIGl0IHNvbWUgb2YgdGhlCi0JICogYmVoYXZpb3IKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKLQkgKi8KLQlwcm90ZWN0ZWQgQWRkUmVtb3ZlUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQl0aGlzKHBhcmVudFBhbmUsCi0JCSAgICAgcGFyZW50LAotCQkgICAgIGFkYXB0ZXIsCi0JCSAgICAgbGlzdEhvbGRlciwKLQkJICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgbGFiZWxQcm92aWRlciwKLQkJICAgICBoZWxwSWQsCi0JCSAgICAgdHJ1ZSk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQotCSAqIGJlaGF2aW9yCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICogQHBhcmFtIHBhcmVudE1hbmFnZVBhbmUgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaGF2ZSB0aGUgcGFyZW50IHBhbmUgbWFuYWdlCi0JICogdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhpcyBwYW5lCi0JICovCi0JcHJvdGVjdGVkIEFkZFJlbW92ZVBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBhcmVudE1hbmFnZVBhbmUpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIHRydWUsIHBhcmVudE1hbmFnZVBhbmUpOwotCi0JCWluaXRpYWxpemUoCi0JCQlhZGFwdGVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWxhYmVsUHJvdmlkZXIKLQkJKTsKLQotCQlpbml0aWFsaXplTGF5b3V0KAotCQkJYWRhcHRlciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlsYWJlbFByb3ZpZGVyLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqIEBwYXJhbSBhZGFwdGVyIFRoaXMgPGNvZGU+QWRhcHRlcjwvY29kZT4gaXMgdXNlZCB0byBkaWN0YWN0ZSB0aGUgYmVoYXZpb3IKLQkgKiBvZiB0aGlzIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IGFuZCBieSBkZWxlZ2F0aW5nIHRvIGl0IHNvbWUgb2YgdGhlCi0JICogYmVoYXZpb3IKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICovCi0JcHJvdGVjdGVkIEFkZFJlbW92ZVBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCXRoaXMocGFyZW50UGFuZSwKLQkJICAgICBzdWJqZWN0SG9sZGVyLAotCQkgICAgIHBhcmVudCwKLQkJICAgICBhZGFwdGVyLAotCQkgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqIEBwYXJhbSBhZGFwdGVyIFRoaXMgPGNvZGU+QWRhcHRlcjwvY29kZT4gaXMgdXNlZCB0byBkaWN0YWN0ZSB0aGUgYmVoYXZpb3IKLQkgKiBvZiB0aGlzIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IGFuZCBieSBkZWxlZ2F0aW5nIHRvIGl0IHNvbWUgb2YgdGhlCi0JICogYmVoYXZpb3IKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICovCi0JcHJvdGVjdGVkIEFkZFJlbW92ZVBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQotCQlpbml0aWFsaXplKAotCQkJYWRhcHRlciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlsYWJlbFByb3ZpZGVyCi0JCSk7Ci0KLQkJaW5pdGlhbGl6ZUxheW91dCgKLQkJCWFkYXB0ZXIsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJbGFiZWxQcm92aWRlciwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIEdpdmVzIHRoZSBwb3NzaWJpbGl0eSB0byBhZGQgYnV0dG9ucyBhZnRlciB0aGUgQWRkIGJ1dHRvbiBhbmQgYmVmb3JlIHRoZQotCSAqIG9wdGlvbmFsIGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgYnV0dG9ucwotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEN1c3RvbUJ1dHRvbkFmdGVyQWRkQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCX0KLQotCS8qKgotCSAqIEdpdmVzIHRoZSBwb3NzaWJpbGl0eSB0byBhZGQgYnV0dG9ucyBhZnRlciB0aGUgb3B0aW9uYWwgYnV0dG9uIGFuZCBiZWZvcmUKLQkgKiB0aGUgUmVtb3ZlIGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgYnV0dG9ucwotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEN1c3RvbUJ1dHRvbkFmdGVyT3B0aW9uYWxCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgQWRkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbSgpIHsKLQkJYWRhcHRlci5hZGROZXdJdGVtKHNlbGVjdGlvbk1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgSW5pdGlhbGl6ZQotCSAqLwotCXByb3RlY3RlZCBBZGFwdGVyIGJ1aWxkQWRhcHRlcigpIHsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IEFkZAotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gYWRkQWRkQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGFkZFVubWFuYWdlZEJ1dHRvbigKLQkJCXBhcmVudCwKLQkJCWFkYXB0ZXIuYWRkQnV0dG9uVGV4dCgpLAotCQkJYnVpbGRBZGRJdGVtQWN0aW9uKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgQWRkCi0JICovCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEFkZEl0ZW1BY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLmFkZEl0ZW0oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLml0ZW1zQWRkZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLml0ZW1zTW92ZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5pdGVtc1JlbW92ZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLml0ZW1zUmVwbGFjZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLmxpc3RDaGFuZ2VkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLmxpc3RDbGVhcmVkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJT2JqZWN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyLmdldFZhbHVlKCk7Ci0KLQkJaWYgKHNlbGVjdGVkSXRlbSA9PSBudWxsKSB7Ci0JCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGUuZ2V0SXRlbXMoKSwgc2VsZWN0ZWRJdGVtKSkgewotCQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQl1cGRhdGVCdXR0b25zKCk7Ci0JCX0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQGNhdGVnb3J5IE9wdGlvbgotCSAqLwotCXByaXZhdGUgUnVubmFibGUgYnVpbGRPcHRpb25hbEFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBZGRSZW1vdmVQYW5lLnRoaXMuZWRpdEl0ZW0oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgT3B0aW9uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBhZGRPcHRpb25hbEJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBhZGRVbm1hbmFnZWRCdXR0b24oCi0JCQljb250YWluZXIsCi0JCQlhZGFwdGVyLm9wdGlvbmFsQnV0dG9uVGV4dCgpLAotCQkJYnVpbGRPcHRpb25hbEFjdGlvbigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IEFkZAotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gYWRkUmVtb3ZlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGFkZFVubWFuYWdlZEJ1dHRvbigKLQkJCXBhcmVudCwKLQkJCWFkYXB0ZXIucmVtb3ZlQnV0dG9uVGV4dCgpLAotCQkJYnVpbGRSZW1vdmVJdGVtc0FjdGlvbigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IFJlbW92ZQotCSAqLwotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSZW1vdmVJdGVtc0FjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBZGRSZW1vdmVQYW5lLnRoaXMucmVtb3ZlSXRlbXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGJ1aWxkUm93U2VsZWN0aW9uTW9kZWwoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdE1vZGVsKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsKG5ldyBMaXN0TW9kZWxBZGFwdGVyKGxpc3RNb2RlbCkpOwotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBPcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0SXRlbSgpIHsKLQkJdGhpcy5hZGFwdGVyLm9wdGlvbk9uU2VsZWN0aW9uKGdldFNlbGVjdGlvbk1vZGVsKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0KLQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQotCQlpZiAoIXRoaXMuZ2V0TWFpbkNvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuZ2V0TWFpbkNvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0KLQkJdGhpcy51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIElCYXNlTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8Pz4gZ2V0TGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIGxpc3RIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucwotCSAqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBDb21wb3NpdGUgZ2V0TWFpbkNvbnRyb2woKTsKLQotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGdldFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJcmV0dXJuIHNlbGVjdGVkSXRlbUhvbGRlcjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGdldFNlbGVjdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBhZGQvcmVtb3ZlIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQotCSAqIGJlaGF2aW9yCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICoKLQkgKiBAY2F0ZWdvcnkgSW5pdGlhbGl6YXRpb24KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikKLQl7Ci0JCXRoaXMubGlzdEhvbGRlciAgICAgICAgID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5sYWJlbFByb3ZpZGVyICAgICAgPSBsYWJlbFByb3ZpZGVyOwotCQl0aGlzLmFkYXB0ZXIgICAgICAgICAgICA9IChhZGFwdGVyID09IG51bGwpID8gYnVpbGRBZGFwdGVyKCkgOiBhZGFwdGVyOwotCQl0aGlzLnNlbGVjdGVkSXRlbUhvbGRlciA9IChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KSBzZWxlY3RlZEl0ZW1Ib2xkZXI7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwgICAgID0gbmV3IE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbChuZXcgTGlzdE1vZGVsQWRhcHRlcihsaXN0SG9sZGVyKSk7Ci0KLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcigKLQkJCUxpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLAotCQkJYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKQotCQkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIGJ1dHRvbnMgKEFkZCwgb3B0aW9uYWwgKGlmIHJlcXVpcmVkKQotCSAqIGFuZCBSZW1vdmUpLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBidXR0b25zCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJ1dHRvblBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIGhlbHBJZCkgewotCi0JCWNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY29udGFpbmVyKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ICAgICAgID0gU1dULlRPUDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIEFkZCBidXR0b24KLQkJdGhpcy5hZGRCdXR0b24gPSBhZGRBZGRCdXR0b24oY29udGFpbmVyKTsKLQkJYWRkQWxpZ25SaWdodCh0aGlzLmFkZEJ1dHRvbik7Ci0KLQkJLy8gQ3VzdG9tIGJ1dHRvbgotCQlhZGRDdXN0b21CdXR0b25BZnRlckFkZEJ1dHRvbihjb250YWluZXIsIGhlbHBJZCk7Ci0KLQkJLy8gT3B0aW9uYWwgYnV0dG9uCi0JCWlmICh0aGlzLmFkYXB0ZXIuaGFzT3B0aW9uYWxCdXR0b24oKSkgewotCQkJdGhpcy5vcHRpb25hbEJ1dHRvbiA9IGFkZE9wdGlvbmFsQnV0dG9uKGNvbnRhaW5lcik7Ci0JCQlhZGRBbGlnblJpZ2h0KHRoaXMub3B0aW9uYWxCdXR0b24pOwotCQl9Ci0KLQkJLy8gQ3VzdG9tIGJ1dHRvbgotCQlhZGRDdXN0b21CdXR0b25BZnRlck9wdGlvbmFsQnV0dG9uKGNvbnRhaW5lciwgaGVscElkKTsKLQotCQkvLyBSZW1vdmUgYnV0dG9uCi0JCXJlbW92ZUJ1dHRvbiA9IGFkZFJlbW92ZUJ1dHRvbihjb250YWluZXIpOwotCQlhZGRBbGlnblJpZ2h0KHJlbW92ZUJ1dHRvbik7Ci0KLQkJLy8gVXBkYXRlIHRoZSBoZWxwIHRvcGljIElECi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYWRkQnV0dG9uLCBoZWxwSWQpOwotCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmVtb3ZlQnV0dG9uLCBoZWxwSWQpOwotCi0JCQlpZiAob3B0aW9uYWxCdXR0b24gIT0gbnVsbCkgewotCQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG9wdGlvbmFsQnV0dG9uLCBoZWxwSWQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBhZGQvcmVtb3ZlIHBhbmUgYnkgY3JlYXRpbmcgdGhlIHdpZGdldHMuIFRoZSBzdWJjbGFzcyBpcwotCSAqIHJlcXVpcmVkIHRvIGJ1aWxkIHRoZSBtYWluIHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBhZGFwdGVyIFRoaXMgPGNvZGU+QWRhcHRlcjwvY29kZT4gaXMgdXNlZCB0byBkaWN0YWN0ZSB0aGUgYmVoYXZpb3IKLQkgKiBvZiB0aGlzIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IGFuZCBieSBkZWxlZ2F0aW5nIHRvIGl0IHNvbWUgb2YgdGhlCi0JICogYmVoYXZpb3IKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KEFkYXB0ZXIgYWRhcHRlciwKLSAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0gICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlhZGFwdGVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWxhYmVsUHJvdmlkZXIsCi0JCQloZWxwSWQpOwotCi0JCWluaXRpYWxpemVCdXR0b25QYW5lKGNvbnRhaW5lciwgaGVscElkKTsKLQkJZW5hYmxlV2lkZ2V0cyhnZXRTdWJqZWN0KCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY29udGFpbmVyLCAyLCAwLCAwLCAwLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgbWFpbiB3aWRnZXQgb2YgdGhpcyBhZGQvcmVtb3ZlIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGFkYXB0ZXIgVGhpcyA8Y29kZT5BZGFwdGVyPC9jb2RlPiBpcyB1c2VkIHRvIGRpY3RhY3RlIHRoZSBiZWhhdmlvcgotCSAqIG9mIHRoaXMgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4gYW5kIGJ5IGRlbGVnYXRpbmcgdG8gaXQgc29tZSBvZiB0aGUKLQkgKiBiZWhhdmlvcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgbGlzdCBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IHdhcyBub3Qgc3BlY2lmaWVkCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKTsKLQotCS8qKgotCSAqIEBjYXRlZ29yeSBSZW1vdmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtcygpIHsKLQotCQkvLyBLZWVwIHRyYWNrIG9mIHRoZSBzZWxlY3RlZCBpbmRpY2VzIHNvIHdlIGNhbiBzZWxlY3QgYW4gaXRlbQotCQkvLyBiZWZvcmUgdGhlIGxvd2VzdCBpbmRleAotCQlpbnRbXSBpbmRpY2VzID0gc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRJbmRpY2VzKCk7Ci0JCUFycmF5cy5zb3J0KGluZGljZXMpOwotCi0JCS8vIE5vdGlmeSB0aGUgYWRhcHRlciB0byByZW1vdmUgdGhlIHNlbGVjdGVkIGl0ZW1zCi0JCWFkYXB0ZXIucmVtb3ZlU2VsZWN0ZWRJdGVtcyhzZWxlY3Rpb25Nb2RlbCk7Ci0KLQkJLy8gU2VsZWN0IGEgbmV3IGl0ZW0KLQkJaWYgKGdldExpc3RIb2xkZXIoKS5zaXplKCkgPiAwKSB7Ci0JCQlpbnQgaW5kZXggPSBNYXRoLm1pbihpbmRpY2VzWzBdLCBnZXRMaXN0SG9sZGVyKCkuc2l6ZSgpIC0gMSk7Ci0JCQlPYmplY3QgaXRlbSA9IGdldExpc3RIb2xkZXIoKS5nZXQoaW5kZXgpOwotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKGl0ZW0pOwotCQl9Ci0JCS8vIFRoZSBsaXN0IGlzIGVtcHR5LCBjbGVhciB0aGUgdmFsdWUKLQkJZWxzZSB7Ci0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3RzIHRoZSBnaXZlbiB2YWx1ZSwgd2hpY2ggY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgc2VsZWN0ZWQgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEl0ZW0oT2JqZWN0IHZhbHVlKSB7Ci0JCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IFVwZGF0ZUJ1dHRvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBZGRCdXR0b24oQnV0dG9uIGFkZEJ1dHRvbikgewotCQlhZGRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgVXBkYXRlQnV0dG9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbnMoKSB7Ci0JCWlmICghY29udGFpbmVyLmlzRGlzcG9zZWQoKSkgewotCQkJdXBkYXRlQWRkQnV0dG9uKGFkZEJ1dHRvbik7Ci0JCQl1cGRhdGVSZW1vdmVCdXR0b24ocmVtb3ZlQnV0dG9uKTsKLQkJCXVwZGF0ZU9wdGlvbmFsQnV0dG9uKG9wdGlvbmFsQnV0dG9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBVcGRhdGVCdXR0b25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlT3B0aW9uYWxCdXR0b24oQnV0dG9uIG9wdGlvbmFsQnV0dG9uKSB7Ci0JCWlmIChvcHRpb25hbEJ1dHRvbiAhPSBudWxsKSB7Ci0JCQlvcHRpb25hbEJ1dHRvbi5zZXRFbmFibGVkKAotCQkJCWVuYWJsZWQgJiYKLQkJCQlhZGFwdGVyLmVuYWJsZU9wdGlvbk9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGlvbk1vZGVsKQotCQkJKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBVcGRhdGVCdXR0b25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVtb3ZlQnV0dG9uKEJ1dHRvbiByZW1vdmVCdXR0b24pIHsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoCi0JCQllbmFibGVkICYmCi0JCQlhZGFwdGVyLmVuYWJsZVJlbW92ZU9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGlvbk1vZGVsKQotCQkpOwotCX0KLQotCS8qKgotCSAqIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkFkYXB0ZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBZGFwdGVyIGltcGxlbWVudHMgQWRhcHRlciB7Ci0KLQkJLyoqCi0JCSAqIFRoZSB0ZXh0IG9mIHRoZSBhZGQgYnV0dG9uLgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgYWRkQnV0dG9uVGV4dDsKLQotCQkvKioKLQkJICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBvcHRpb25hbCBidXR0b24gc2hvdWxkIGJlIHNob3duIG9yIG5vdC4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbjsKLQotCQkvKioKLQkJICogVGhlIHRleHQgb2YgdGhlIG9wdGlvbmFsIGJ1dHRvbiwgaWYgdXNlZC4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dDsKLQotCQkvKioKLQkJICogVGhlIHRleHQgb2YgdGhlIHJlbW92ZSBidXR0b24uCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyByZW1vdmVCdXR0b25UZXh0OwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0QWRhcHRlcjwvY29kZT4gd2l0aCBkZWZhdWx0IHRleHQgZm9yIHRoZQotCQkgKiBhZGQgYW5kIHJlbW92ZSBidXR0b25zLgotCQkgKi8KLQkJcHVibGljIEFic3RyYWN0QWRhcHRlcigpIHsKLQkJCXRoaXMoSnB0VWlNZXNzYWdlcy5BZGRSZW1vdmVQYW5lX0FkZEJ1dHRvblRleHQsCi0JCQkgICAgIEpwdFVpTWVzc2FnZXMuQWRkUmVtb3ZlUGFuZV9SZW1vdmVCdXR0b25UZXh0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0QWRhcHRlcjwvY29kZT4gd2l0aCBkZWZhdWx0IHRleHQgZm9yIHRoZQotCQkgKiBhZGQgYW5kIHJlbW92ZSBidXR0b25zLgotCQkgKgotCQkgKiBAcGFyYW0gaGFzT3B0aW9uYWxCdXR0b24gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gc2hvdyBhbiBvcHRpb25hbCBidXR0b24KLQkJICogYW5kIHRvIHVzZSB0aGUgYmVoYXZpb3IgcmVsYXRlZCB0byB0aGUgb3B0aW9uYWwgYnV0dG9uOwotCQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IHVzZSBpdAotCQkgKi8KLQkJcHVibGljIEFic3RyYWN0QWRhcHRlcihib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKSB7Ci0JCQl0aGlzKCk7Ci0JCQl0aGlzLnNldEhhc09wdGlvbmFsQnV0dG9uKGhhc09wdGlvbmFsQnV0dG9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0QWRhcHRlcjwvY29kZT4gd2l0aCBkZWZhdWx0IHRleHQgZm9yIHRoZQotCQkgKiBhZGQgYW5kIHJlbW92ZSBidXR0b25zLgotCQkgKgotCQkgKiBAcGFyYW0gb3B0aW9uYWxCdXR0b25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBvcHRpb25hbCBidXR0b24sIHdoaWNoIG1lYW5zCi0JCSAqIHRoZSBvcHRpb25hbCBidXR0b24gd2lsbCBiZSBzaG93bgotCQkgKi8KLQkJcHVibGljIEFic3RyYWN0QWRhcHRlcihTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KSB7Ci0JCQl0aGlzKHRydWUpOwotCQkJdGhpcy5zZXRPcHRpb25hbEJ1dHRvblRleHQob3B0aW9uYWxCdXR0b25UZXh0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0QWRhcHRlcjwvY29kZT4uCi0JCSAqCi0JCSAqIEBwYXJhbSBhZGRCdXR0b25UZXh0IFRoZSBhZGQgYnV0dG9uJ3MgdGV4dAotCQkgKiBAcGFyYW0gcmVtb3ZlQnV0dG9uVGV4dCBUaGUgcmVtb3ZlIGJ1dHRvbidzIHRleHQKLQkJICovCi0JCXB1YmxpYyBBYnN0cmFjdEFkYXB0ZXIoU3RyaW5nIGFkZEJ1dHRvblRleHQsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbW92ZUJ1dHRvblRleHQpIHsKLQotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYWRkQnV0dG9uVGV4dCAgICA9IGFkZEJ1dHRvblRleHQ7Ci0JCQl0aGlzLnJlbW92ZUJ1dHRvblRleHQgPSByZW1vdmVCdXR0b25UZXh0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RBZGFwdGVyPC9jb2RlPi4KLQkJICoKLQkJICogQHBhcmFtIGFkZEJ1dHRvblRleHQgVGhlIGFkZCBidXR0b24ncyB0ZXh0Ci0JCSAqIEBwYXJhbSByZW1vdmVCdXR0b25UZXh0IFRoZSByZW1vdmUgYnV0dG9uJ3MgdGV4dAotCQkgKiBAcGFyYW0gb3B0aW9uYWxCdXR0b25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBvcHRpb25hbCBidXR0b24sIHdoaWNoIG1lYW5zCi0JCSAqIHRoZSBvcHRpb25hbCBidXR0b24gd2lsbCBiZSBzaG93bgotCQkgKi8KLQkJcHVibGljIEFic3RyYWN0QWRhcHRlcihTdHJpbmcgYWRkQnV0dG9uVGV4dCwKLQkJICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVtb3ZlQnV0dG9uVGV4dCwKLQkJICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KSB7Ci0KLQkJCXRoaXMob3B0aW9uYWxCdXR0b25UZXh0KTsKLQkJCXRoaXMuc2V0QWRkQnV0dG9uVGV4dChhZGRCdXR0b25UZXh0KTsKLQkJCXRoaXMuc2V0UmVtb3ZlQnV0dG9uVGV4dChyZW1vdmVCdXR0b25UZXh0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgYWRkQnV0dG9uVGV4dCgpIHsKLQkJCXJldHVybiBhZGRCdXR0b25UZXh0OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gZW5hYmxlT3B0aW9uT25TZWxlY3Rpb25DaGFuZ2UoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJcmV0dXJuIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlc1NpemUoKSA9PSAxOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZW5hYmxlUmVtb3ZlT25TZWxlY3Rpb25DaGFuZ2UoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJcmV0dXJuIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCkgIT0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCkgewotCQkJcmV0dXJuIGhhc09wdGlvbmFsQnV0dG9uOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQoKSB7Ci0JCQlyZXR1cm4gb3B0aW9uYWxCdXR0b25UZXh0OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIHZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyByZW1vdmVCdXR0b25UZXh0KCkgewotCQkJcmV0dXJuIHJlbW92ZUJ1dHRvblRleHQ7Ci0JCX0KLQotCQkvKioKLQkJICogQ2hhbmdlcyB0aGUgdGV4dCBvZiB0aGUgYWRkIGJ1dHRvbi4gVGhpcyBtZXRob2QgaGFzIHRvIGJlIGNhbGxlZCBiZWZvcmUKLQkJICogdGhlIDxjb2RlPkFkZFJlbW92ZUxpc3RQYW5lPC9jb2RlPiBpcyBpbml0aWFsaXplZC4KLQkJICoKLQkJICogQHBhcmFtIGFkZEJ1dHRvblRleHQgVGhlIGFkZCBidXR0b24ncyB0ZXh0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRBZGRCdXR0b25UZXh0KFN0cmluZyBhZGRCdXR0b25UZXh0KSB7Ci0JCQl0aGlzLmFkZEJ1dHRvblRleHQgPSBhZGRCdXR0b25UZXh0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENoYW5nZXMgdGhlIHN0YXRlIG9mIHRoZSBvcHRpb25hbCBidXR0b24sIG1lYW5pbmcgaWYgaXQgc2hvdWxkIGJlIHNob3duCi0JCSAqIGJldHdlZW4gdGhlIGFkZCBhbmQgcmVtb3ZlIGJ1dHRvbnMgb3Igbm90LgotCQkgKgotCQkgKiBAcGFyYW0gaGFzT3B0aW9uYWxCdXR0b24gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gc2hvdyBhbiBvcHRpb25hbCBidXR0b24KLQkJICogYW5kIHRvIHVzZSB0aGUgYmVoYXZpb3IgcmVsYXRlZCB0byB0aGUgb3B0aW9uYWwgYnV0dG9uOwotCQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IHVzZSBpdAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0SGFzT3B0aW9uYWxCdXR0b24oYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbikgewotCQkJdGhpcy5oYXNPcHRpb25hbEJ1dHRvbiA9IGhhc09wdGlvbmFsQnV0dG9uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENoYW5nZXMgdGhlIHRleHQgb2YgdGhlIG9wdGlvbmFsIGJ1dHRvbi4gVGhpcyBtZXRob2QgaGFzIHRvIGJlIGNhbGxlZAotCQkgKiBiZWZvcmUgdGhlIDxjb2RlPkFkZFJlbW92ZUxpc3RQYW5lPC9jb2RlPiBpcyBpbml0aWFsaXplZC4gVGhpcyBkb2VzIG5vdAotCQkgKiBtYWtlIHRoZSBvcHRpb25hbCBidXR0b24gdmlzaWJsZS4KLQkJICoKLQkJICogQHBhcmFtIG9wdGlvbmFsQnV0dG9uVGV4dCBUaGUgb3B0aW9uYWwgYnV0dG9uJ3MgdGV4dAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0T3B0aW9uYWxCdXR0b25UZXh0KFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQpIHsKLQkJCXRoaXMub3B0aW9uYWxCdXR0b25UZXh0ID0gb3B0aW9uYWxCdXR0b25UZXh0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENoYW5nZXMgdGhlIHRleHQgb2YgdGhlIHJlbW92ZSBidXR0b24uIFRoaXMgbWV0aG9kIGhhcyB0byBiZSBjYWxsZWQKLQkJICogYmVmb3JlIHRoZSA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4gaXMgaW5pdGlhbGl6ZWQuCi0JCSAqCi0JCSAqIEBwYXJhbSByZW1vdmVCdXR0b25UZXh0IFRoZSByZW1vdmUgYnV0dG9uJ3MgdGV4dAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UmVtb3ZlQnV0dG9uVGV4dChTdHJpbmcgcmVtb3ZlQnV0dG9uVGV4dCkgewotCQkJdGhpcy5yZW1vdmVCdXR0b25UZXh0ID0gcmVtb3ZlQnV0dG9uVGV4dDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRhcHRlciBpcyB1c2VkIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBhY3Rpb24gd2hlbiBhZGRpbmcgYSBuZXcgaXRlbQotCSAqIG9yIHJlbW92aW5nIHRoZSBzZWxlY3RlZCBpdGVtcy4gSXQgaXMgcG9zc2libGUgdG8gYWRkIGFuIG9wdGlvbmFsIGJ1dHRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBBZGFwdGVyIHsKLQotCQkvKioKLQkJICogVGhlIGFkZCBidXR0b24ncyB0ZXh0LgotCQkgKgotCQkgKiBAcmV0dXJuIFRoZSB0ZXh0IHNob3duIG9uIHRoZSBhZGQgYnV0dG9uCi0JCSAqLwotCQlTdHJpbmcgYWRkQnV0dG9uVGV4dCgpOwotCi0JCS8qKgotCQkgKiBJbnZva2VkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyB0aGUgQWRkIGJ1dHRvbi4KLQkJICovCi0JCXZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKTsKLQotCQkvKioKLQkJICogSW52b2tlZCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzLiBJbXBsZW1lbnRhdGlvbiBkaWN0YXRlcyB3aGV0aGVyIGJ1dHRvbgotCQkgKiBzaG91bGQgYmUgZW5hYmxlZC4KLQkJICovCi0JCWJvb2xlYW4gZW5hYmxlT3B0aW9uT25TZWxlY3Rpb25DaGFuZ2UoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0KLQkJLyoqCi0JCSAqIEludm9rZWQgd2hlbiBzZWxlY3Rpb24gY2hhbmdlcy4gSW1wbGVtZW50YXRpb24gZGljdGF0ZXMgd2hldGhlciByZW1vdmUgYnV0dG9uCi0JCSAqIHNob3VsZCBiZSBlbmFibGVkLgotCQkgKi8KLQkJYm9vbGVhbiBlbmFibGVSZW1vdmVPblNlbGVjdGlvbkNoYW5nZShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKTsKLQotCQkvKioKLQkJICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIG9wdGlvbmFsIGJ1dHRvbiBzaG91bGQgYmUgYWRkZWQgYmV0d2VlbiB0aGUgYWRkCi0JCSAqIGFuZCByZW1vdmUgYnV0dG9ucy4KLQkJICoKLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0byBzaG93IGFuIG9wdGlvbmFsIGJ1dHRvbiBhbmQgdG8gdXNlIHRoZQotCQkgKiBiZWhhdmlvciByZWxhdGVkIHRvIHRoZSBvcHRpb25hbCBidXR0b247IDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgdXNlCi0JCSAqIGl0Ci0JCSAqLwotCQlib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJlc291cmNlIHN0cmluZyBrZXkgZm9yIHRoZSBvcHRpb25hbCBidXR0b24uCi0JCSAqLwotCQlTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIEludm9rZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIHRoZSBvcHRpb25hbCBidXR0b24KLQkJICovCi0JCXZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSByZW1vdmUgYnV0dG9uJ3MgdGV4dC4KLQkJICoKLQkJICogQHJldHVybiBUaGUgdGV4dCBzaG93biBvbiB0aGUgcmVtb3ZlIGJ1dHRvbgotCQkgKi8KLQkJU3RyaW5nIHJlbW92ZUJ1dHRvblRleHQoKTsKLQotCQkvKioKLQkJICogSW52b2tlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhlIFJlbW92ZSBidXR0b24uCi0JCSAqLwotCQl2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlVGFibGVQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVRhYmxlUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTUwM2M5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlVGFibGVQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IHVzZXMgYSA8Y29kZT5UYWJsZTwvY29kZT4KLSAqIGFzIGl0cyBtYWluIHdpZGdldC4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3Qgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0gfAotICogfCB8IENvbHVtbiAxIHwgQ29sdW1uIDIgfCAuLi4gICB8IENvbHVtbiBpIHwgLi4uICAgfCBDb2x1bm0gbiB8IHwgQWRkLi4uICB8IHwKLSAqIHwgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgIHwgLS0tLS0tLS0tLS0gfAotICogfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgRWRpdC4uLiB8IHwKLSAqIHwgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICB8IHwgUmVtb3ZlICB8IHwKLSAqIHwgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFkZFJlbW92ZVRhYmxlUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQWRkUmVtb3ZlUGFuZTxUPgotewotCS8qKgotCSAqIEZsYWcgdXNlZCB0byBwcmV2ZW50IGNpcmN1bGFyCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGxvY2tlZDsKLQotCS8qKgotCSAqIFRoZSBtYWluIHdpZGdldCBvZiB0aGlzIGFkZC9yZW1vdmUgcGFuZS4KLQkgKi8KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVUYWJsZVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlVGFibGVQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyKTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlVGFibGVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICovCi0JcHVibGljIEFkZFJlbW92ZVRhYmxlUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwKLQkJICAgICAgcGFyZW50LAotCQkgICAgICBhZGFwdGVyLAotCQkgICAgICBsaXN0SG9sZGVyLAotCQkgICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgIGhlbHBJZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVUYWJsZVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICovCi0JcHVibGljIEFkZFJlbW92ZVRhYmxlUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHN1YmplY3RIb2xkZXIsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZVRhYmxlUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKLQkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlVGFibGVQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHN1YmplY3RIb2xkZXIsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyLAotCQkgICAgICBoZWxwSWQpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb2x1bW5BZGFwdGVyPD8+IGJ1aWxkQ29sdW1uQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigKLQkJCWJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKHRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKCFsb2NrZWQpIHsKLQkJCQkJbG9ja2VkID0gdHJ1ZTsKLQotCQkJCQl0cnkgewotCQkJCQkJT2JqZWN0IHZhbHVlID0gZS5nZXROZXdWYWx1ZSgpOwotCQkJCQkJZ2V0U2VsZWN0aW9uTW9kZWwoKS5zZXRTZWxlY3RlZFZhbHVlKGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQlpbnQgaW5kZXggPSAtMTsKLQotCQkJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQlpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGdldExpc3RIb2xkZXIoKS5pdGVyYXRvcigpLCB2YWx1ZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXRhYmxlLnNlbGVjdChpbmRleCk7Ci0JCQkJCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlsb2NrZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPE9iamVjdD4gYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxPYmplY3Q+KCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxPYmplY3Q+IGUpIHsKLQkJCQlBZGRSZW1vdmVUYWJsZVBhbmUudGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldE1haW5Db250cm9sKCkgewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkKLQl7Ci0JCXRhYmxlID0gYWRkVW5tYW5hZ2VkVGFibGUoY29udGFpbmVyLCBoZWxwSWQpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlTW9kZWxBZGFwdGVyPE9iamVjdD4gdGFibGVNb2RlbCA9IFRhYmxlTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJKExpc3RWYWx1ZU1vZGVsPE9iamVjdD4pIGxpc3RIb2xkZXIsCi0JCQlidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJdGFibGUsCi0JCQkoQ29sdW1uQWRhcHRlcjxPYmplY3Q+KSBidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCShJVGFibGVMYWJlbFByb3ZpZGVyKSBsYWJlbFByb3ZpZGVyCi0JCSk7Ci0KLQkJdGFibGVNb2RlbC5hZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihidWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0JCXNlbGVjdGVkSXRlbUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJYnVpbGRTZWxlY3RlZEl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLCB1cGRhdGUgKDEpIHRoZSBzZWxlY3RlZCBpdGVtIGhvbGRlciwgKDIpIHRoZQotCSAqIHNlbGVjdGlvbiBtb2RlbCBhbmQgKDMpIHRoZSBidXR0b25zLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKCkgewotCi0JCWlmIChsb2NrZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWxvY2tlZCA9IHRydWU7Ci0KLQkJdHJ5IHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gZ2V0U2VsZWN0ZWRJdGVtSG9sZGVyKCk7Ci0JCQlPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgc2VsZWN0aW9uTW9kZWwgPSBnZXRTZWxlY3Rpb25Nb2RlbCgpOwotCQkJaW50IHNlbGVjdGlvbkNvdW50ID0gdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQotCQkJaWYgKHNlbGVjdGlvbkNvdW50ID09IDApIHsKLQkJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQkJc2VsZWN0aW9uTW9kZWwuY2xlYXJTZWxlY3Rpb24oKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHNlbGVjdGlvbkNvdW50ICE9IDEpIHsKLQkJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQkJc2VsZWN0aW9uTW9kZWwuY2xlYXJTZWxlY3Rpb24oKTsKLQotCQkJCWZvciAoaW50IGluZGV4IDogdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKSB7Ci0JCQkJCXNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGlvbkludGVydmFsKGluZGV4LCBpbmRleCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IHNlbGVjdGVkSW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCU9iamVjdCBzZWxlY3RlZEl0ZW0gPSBnZXRMaXN0SG9sZGVyKCkuZ2V0KHNlbGVjdGVkSW5kZXgpOwotCi0JCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKHNlbGVjdGVkSXRlbSk7Ci0JCQkJc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShzZWxlY3RlZEl0ZW0pOwotCQkJfQotCi0JCQl1cGRhdGVCdXR0b25zKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlsb2NrZWQgPSBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQ2hvb3NlclBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQ2hvb3NlclBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyNGM0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Nob29zZXJQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIEEgY2hvb3NlciBpcyBzaW1wbHkgYSBwYW5lIHdpdGggdGhyZWUgd2lkZ2V0cywgdGhlIGxhYmVsIG9uIHRoZSBsZWZ0LCBhIG1haW4KLSAqIHdpZGdldCwgdXN1YWxseSBhIHRleHQgZmllbGQsIGFuZCBhIHJpZ2h0IHdpZGdldCB3aGljaCBpcyB1c3VhbGx5IGEgYnJvd3NlCi0gKiBidXR0b24uCi0gKgotICogQHNlZSBDbGFzc0Nob29zZXJQYW5lCi0gKiBAc2VlIFBhY2thZ2VDaG9vc2VyUGFuZQotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2hvb3NlclBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBUaGUgY29udHJvbCBzaG93biBhZnRlciB0aGUgbGFiZWwgKGxlZnQgY29udHJvbCkuCi0JICovCi0JcHJpdmF0ZSBDb250cm9sIG1haW5Db250cm9sOwotCi0JLyoqCi0JICogVGhlIGNvbnRyb2wgc2hvd24gYWZ0ZXIgdGhlIG1haW4gY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2wgcmlnaHRDb250cm9sOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENob29zZXJQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2hvb3NlclBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLm1haW5Db250cm9sICA9IGFkZE1haW5Db250cm9sKGNvbnRhaW5lcik7Ci0JCXRoaXMucmlnaHRDb250cm9sID0gYWRkUmlnaHRDb250cm9sKGNvbnRhaW5lcik7Ci0KLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWFkZExlZnRDb250cm9sKGNvbnRhaW5lciksCi0JCQl0aGlzLm1haW5Db250cm9sLAotCQkJdGhpcy5yaWdodENvbnRyb2wsCi0JCQlnZXRIZWxwSWQoKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxlZnQgY29udHJvbC4gQnkgZGVmYXVsdCBhIGxhYmVsIGlzIGNyZWF0ZWQgYW5kIGl0cyB0ZXh0IGlzCi0JICogcmV0cmlldmVkIGJ5IHtAbGluayAjZ2V0TGFiZWxUZXh0KCl9LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgbGVmdCBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgYWRkTGVmdENvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gYWRkTGFiZWwoY29udGFpbmVyLCBnZXRMYWJlbFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHRleHQgb2YgdGhlIGxhYmVsLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKLQkgKiB7QGxpbmsgI2J1aWxkTGVmdENvbnRyb2woQ29tcG9zaXRlKX0uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgdGV4dCBvZiB0aGUgbGVmdCBjb250cm9sICh3aGljaCBpcyBhIGxhYmVsIGJ5Ci0JICogZGVmYXVsdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldExhYmVsVGV4dCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWFpbiBjb250cm9sIG9mIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIG1haW4gY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBDb250cm9sIGFkZE1haW5Db250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgcmlnaHQgY29udHJvbC4gQnkgZGVmYXVsdCBhIGJyb3dzZSBidXR0b24gaXMgY3JlYXRlZCBhbmQgaXRzCi0JICogYWN0aW9uIGlzIHBlcmZvcm1lZCBieSB7QGxpbmsgI2J1aWxkQnJvd3NlQWN0aW9uKCl9IGFuZCBpdHMgdGV4dCBpcwotCSAqIHJldHJpZXZlZCBieSB7QGxpbmsgI2dldEJyb3dzZUJ1dHRvblRleHQoKX0uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCByaWdodCBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgYWRkUmlnaHRDb250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIGFkZEJ1dHRvbigKLQkJCWNvbnRhaW5lciwKLQkJCWdldEJyb3dzZUJ1dHRvblRleHQoKSwKLQkJCWJ1aWxkQnJvd3NlQWN0aW9uKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBicm93c2UgYnV0dG9uLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKLQkgKiB7QGxpbmsgI2J1aWxkUmlnaHRDb250cm9sKENvbXBvc2l0ZSl9LgotCSAqCi0JICogQHJldHVybiAiQnJvd3NlLi4uIgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QnJvd3NlQnV0dG9uVGV4dCgpIHsKLQkJcmV0dXJuIEpwdFVpTWVzc2FnZXMuQ2hvb3NlclBhbmVfYnJvd3NlQnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGFjdGlvbiByZXNwb25zaWJsZSB0byBwZXJmb3JtIHRoZSBhY3Rpb24gd2hlbiB0aGUgQnJvd3NlIGlzCi0JICogY2xpY2tlZC4KLQkgKgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+UnVubmFibGU8L2NvZGU+IHBlcmZvcm1pbmcgdGhlIGFjdHVhbCBhY3Rpb24gb2YgdGhlCi0JICogYnV0dG9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFJ1bm5hYmxlIGJ1aWxkQnJvd3NlQWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoZWxwIHRvcGljIElEIGZvciB0aGUgY29udHJvbHMgb2YgdGhpcyBwYW5lLgotCSAqCi0JICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZCBvdGhlcndpc2UgdGhlIHN1YmNsYXNzIGNhbiByZXR1cm4gYW4gSUQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKLQotCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCi0JCWlmICghdGhpcy5tYWluQ29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubWFpbkNvbnRyb2wuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCi0JCWlmICghdGhpcy5yaWdodENvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnJpZ2h0Q29udHJvbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9DbGFzc0Nob29zZXJDb21ib1BhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQ2xhc3NDaG9vc2VyQ29tYm9QYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWI5NzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9DbGFzc0Nob29zZXJDb21ib1BhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZy5jb250ZW50YXNzaXN0LkNvbnRyb2xDb250ZW50QXNzaXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogVGhpcyBjaG9vc2VyIGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSB0eXBlIHdoZW4gYnJvd3NpbmcgYW5kIGl0IGFkZHMgY29kZQotICogY29tcGxldGlvbiBzdXBwb3J0IHRvIHRoZSB0ZXh0IGZpZWxkLCB3aGljaCBpcyB0aGUgbWFpbiBjb21wb25lbnQuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IExhYmVsOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICB8IHwgQnJvd3NlLi4uIHwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc0Nob29zZXJDb21ib1BhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIENsYXNzQ2hvb3NlclBhbmU8VD4KLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2xhc3NDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENsYXNzQ2hvb3NlckNvbWJvUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2xhc3NDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2xhc3NDaG9vc2VyQ29tYm9QYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYWRkTWFpbkNvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21wb3NpdGUgc3ViUGFuZSA9IGFkZFN1YlBhbmUoY29udGFpbmVyKTsKLSAgICAJQ29tYm8gY29tYm8gPSB0aGlzLmFkZENsYXNzQ29tYm8oc3ViUGFuZSk7Ci0KLQkJQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXIuY3JlYXRlQ29tYm9Db250ZW50QXNzaXN0YW50KAotCQkJY29tYm8sCi0JCQlqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IKLQkJKTsKLQotCQlyZXR1cm4gc3ViUGFuZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbWJvIGFkZENsYXNzQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gdGhpcy5hZGRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJdGhpcy5idWlsZENsYXNzTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFRleHRIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRDbGFzc0NvbnZlcnRlcigpCi0JCSk7Ci0gCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENsYXNzTGlzdEhvbGRlcigpOwotCQotCXByb3RlY3RlZCBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZENsYXNzQ29udmVydGVyKCkgewotCQlyZXR1cm4gU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuaW5zdGFuY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9DbGFzc0Nob29zZXJQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0NsYXNzQ2hvb3NlclBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFiYTg5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0NsYXNzQ2hvb3NlclBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZy5jb250ZW50YXNzaXN0LkNvbnRyb2xDb250ZW50QXNzaXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZy5jb250ZW50YXNzaXN0LkphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5OZXdDbGFzc0NyZWF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdDbGFzc1dpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkh5cGVybGluazsKLQotLyoqCi0gKiBUaGlzIGNob29zZXIgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIHR5cGUgd2hlbiBicm93c2luZyBhbmQgaXQgYWRkcyBjb2RlCi0gKiBjb21wbGV0aW9uIHN1cHBvcnQgdG8gdGhlIHRleHQgZmllbGQsIHdoaWNoIGlzIHRoZSBtYWluIGNvbXBvbmVudC4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIHwgTGFiZWw6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCcm93c2UuLi4gfCB8Ci0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NDaG9vc2VyUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQ2hvb3NlclBhbmU8VD4KLXsKLQkvKioKLQkgKiBUaGUgY29kZSBjb21wbGV0aW9uIG1hbmFnZXIuCi0JICovCi0JcHJvdGVjdGVkIEphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvciBqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc3ViamVjdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DbGFzc0Nob29zZXJQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2xhc3NDaG9vc2VyUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2xhc3NDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2xhc3NDaG9vc2VyUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQotCQkvLyBUT0RPIGJ1ZyAxNTYxODUgLSB3aGVuIHRoaXMgaXMgZml4ZWQgdGhlcmUgc2hvdWxkIGJlIGFwaSBmb3IgdGhpcwotCQl0aGlzLmphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvciA9IG5ldyBKYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IoZmFsc2UsIGZhbHNlKTsKLQotCQl0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmNsYXNzQ2hvb3NlclN1YmplY3RDaGFuZ2VkKGdldFN1YmplY3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNsYXNzQ2hvb3NlclBhbmUudGhpcy5jbGFzc0Nob29zZXJTdWJqZWN0Q2hhbmdlZCgoVCkgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGFzc0Nob29zZXJTdWJqZWN0Q2hhbmdlZChUIG5ld1N1YmplY3QpIHsKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSBudWxsOwotCQlpZiAobmV3U3ViamVjdCAhPSBudWxsKSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOwotCQkJaWYgKHJvb3QgIT0gbnVsbCkgewotCQkJCXBhY2thZ2VGcmFnbWVudCA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCIiKTsKLQkJCX0KLQkJfQotCQl0aGlzLmphdmFUeXBlQ29tcGxldGlvblByb2Nlc3Nvci5zZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZUZyYWdtZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBhZGRMZWZ0Q29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWlmKCAhIHRoaXMuYWxsb3dUeXBlQ3JlYXRpb24oKSkgewotCQkJcmV0dXJuIHN1cGVyLmFkZExlZnRDb250cm9sKGNvbnRhaW5lcik7Ci0JCX0KLQkJSHlwZXJsaW5rIGxhYmVsTGluayA9IHRoaXMuYWRkSHlwZXJsaW5rKGNvbnRhaW5lciwKLQkJCXRoaXMuZ2V0TGFiZWxUZXh0KCksCi0JCQl0aGlzLmJ1aWxkSHlwZXJMaW5rQWN0aW9uKCkKLQkJKTsKLQkJcmV0dXJuIGxhYmVsTGluazsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSHlwZXJMaW5rQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUNsYXNzQ2hvb3NlclBhbmUudGhpcy5oeXBlckxpbmtTZWxlY3RlZCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGh5cGVyTGlua1NlbGVjdGVkKCkgewotCQlJVHlwZSB0eXBlID0gZ2V0VHlwZSgpOwotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlvcGVuSW5FZGl0b3IodHlwZSk7CQotCQl9Ci0JCWVsc2UgaWYgKGFsbG93VHlwZUNyZWF0aW9uKCkpewotCQkJY3JlYXRlVHlwZSgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBJVHlwZSBnZXRUeXBlKCkgewotCQlpZiAoZ2V0Q2xhc3NOYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0eXBlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoZ2V0Q2xhc3NOYW1lKCkucmVwbGFjZSgnJCcsICcuJykpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUeXBlKCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCi0JCU5ld0NsYXNzV2l6YXJkUGFnZSBuZXdDbGFzc1dpemFyZFBhZ2UgPSBuZXcgTmV3Q2xhc3NXaXphcmRQYWdlKCk7Ci0JCW5ld0NsYXNzV2l6YXJkUGFnZS5pbml0KHNlbGVjdGlvbik7Ci0JCW5ld0NsYXNzV2l6YXJkUGFnZS5zZXRTdXBlckNsYXNzKGdldFN1cGVyY2xhc3NOYW1lKCksIHRydWUpOwotCQluZXdDbGFzc1dpemFyZFBhZ2Uuc2V0U3VwZXJJbnRlcmZhY2VzKGdldFN1cGVySW50ZXJmYWNlTmFtZXMoKSwgdHJ1ZSk7Ci0JCWlmICghU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRDbGFzc05hbWUoKSkpIHsKLQkJCW5ld0NsYXNzV2l6YXJkUGFnZS5zZXRUeXBlTmFtZShDbGFzc05hbWUuZ2V0U2ltcGxlTmFtZShnZXRDbGFzc05hbWUoKSksIHRydWUpOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gQ2xhc3NOYW1lLmdldFBhY2thZ2VOYW1lKGdldENsYXNzTmFtZSgpKTsKLQkJCW5ld0NsYXNzV2l6YXJkUGFnZS5zZXRQYWNrYWdlRnJhZ21lbnQoZ2V0Rmlyc3RKYXZhU291cmNlRm9sZGVyKCkuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKSwgdHJ1ZSk7Ci0JCX0KLQkJTmV3Q2xhc3NDcmVhdGlvbldpemFyZCB3aXphcmQgPSBuZXcgTmV3Q2xhc3NDcmVhdGlvbldpemFyZChuZXdDbGFzc1dpemFyZFBhZ2UsIGZhbHNlKTsKLQkJd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uKTsKLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWludCBkUmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGRSZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gKG5ld0NsYXNzV2l6YXJkUGFnZS5nZXRDcmVhdGVkVHlwZSgpKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpKTsKLQkJCXNldENsYXNzTmFtZShjbGFzc05hbWUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKTsKLQkKLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIGNoYW5nZSB0aGUgZW5jbG9zaW5nIHR5cGUgc2VwYXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJcmV0dXJuICckJzsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyB0byBzZXQgYSBzdXBlcmNsYXNzIGluIHRoZSBOZXcgQ2xhc3Mgd2l6YXJkLiAgSWYgbm8gY2xhc3MgaXMgY2hvc2VuLCAKLQkgKiBjbGlja2luZyB0aGUgaHlwZXJsaW5rIGxhYmVsIHdpbGwgb3BlbiB0aGUgbmV3IGNsYXNzIHdpemFyZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN1cGVyY2xhc3NOYW1lKCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gc2V0IGEgc3VwZXIgaW50ZXJmYWNlIGluIHRoZSBOZXcgQ2xhc3Mgd2l6YXJkLiAgSWYgbm8gY2xhc3MgaXMgY2hvc2VuLCAKLQkgKiBjbGlja2luZyB0aGUgaHlwZXJsaW5rIGxhYmVsIHdpbGwgb3BlbiB0aGUgbmV3IGNsYXNzIHdpemFyZC4KLQkgKiBAc2VlIGdldFN1cGVySW50ZXJmYWNlTmFtZQotCSAqLwotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpIHsKLQkJcmV0dXJuIGdldFN1cGVySW50ZXJmYWNlTmFtZSgpICE9IG51bGwgPyBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGdldFN1cGVySW50ZXJmYWNlTmFtZSgpKSA6IENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gc2V0IGEgc3VwZXIgaW50ZXJmYWNlIGluIHRoZSBOZXcgQ2xhc3Mgd2l6YXJkLiAgSWYgbm8gY2xhc3MgaXMgY2hvc2VuLCAKLQkgKiBjbGlja2luZyB0aGUgaHlwZXJsaW5rIGxhYmVsIHdpbGwgb3BlbiB0aGUgbmV3IGNsYXNzIHdpemFyZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN1cGVySW50ZXJmYWNlTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgaWYgaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBhbGxvdyB0aGUgdXNlciB0byBjcmVhdGUgYSBuZXcgdHlwZS4KLQkgKiBUaGlzIHdpbGwgZGV0ZXJtaW5lIHdoZXRoZXIgY2xpY2tpbmcgdGhlIGh5cGVybGluayBvcGVucyB0aGUgTmV3IENsYXNzIHdpemFyZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd1R5cGVDcmVhdGlvbigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG9wZW5JbkVkaXRvcihJVHlwZSB0eXBlKSB7Ci0JCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IHR5cGUuZ2V0UGFyZW50KCk7Ci0JCXRyeSB7Ci0JCQlKYXZhVUkub3BlbkluRWRpdG9yKGphdmFFbGVtZW50LCB0cnVlLCB0cnVlKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJfQotCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpOwotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBSdW5uYWJsZSBidWlsZEJyb3dzZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwcm9tcHRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYWRkTWFpbkNvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21wb3NpdGUgc3ViUGFuZSA9IGFkZFN1YlBhbmUoY29udGFpbmVyKTsKLQkJVGV4dCB0ZXh0ID0gYWRkVGV4dChzdWJQYW5lLCBidWlsZFRleHRIb2xkZXIoKSk7Ci0KLQkJQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXIuY3JlYXRlVGV4dENvbnRlbnRBc3Npc3RhbnQoCi0JCQl0ZXh0LAotCQkJamF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yCi0JCSk7Ci0KLQkJcmV0dXJuIHN1YlBhbmU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmFsdWUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0J3MgcHJvcGVydHkuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBob2xkZXIgb2YgdGhlIGNsYXNzIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKTsKLQotCS8qKgotCSAqIFByb21wdHMgdGhlIHVzZXIgdGhlIE9wZW4gVHlwZSBkaWFsb2cuCi0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciB0aGUgc2VsZWN0ZWQgdHlwZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdXNlcgotCSAqIGNhbmNlbGxlZCB0aGUgZGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIElUeXBlIGNob29zZVR5cGUoKSB7Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtdIHsgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkgfTsKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQlTZWxlY3Rpb25EaWFsb2cgdHlwZVNlbGVjdGlvbkRpYWxvZzsKLQotCQl0cnkgewotCQkJdHlwZVNlbGVjdGlvbkRpYWxvZyA9IEphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKAotCQkJCWdldFNoZWxsKCksCi0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKSwKLQkJCQlzY29wZSwKLQkJCQlnZXRUeXBlRGlhbG9nU3R5bGUoKSwKLQkJCQlmYWxzZSwKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdldENsYXNzTmFtZSgpKSA/ICIiIDogQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoZ2V0Q2xhc3NOYW1lKCkpCi0JCQkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKEpwdFVpTWVzc2FnZXMuQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZSk7Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShKcHRVaU1lc3NhZ2VzLkNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZSk7Ci0KLQkJaWYgKHR5cGVTZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIChJVHlwZSkgdHlwZVNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VHlwZURpYWxvZ1N0eWxlKCkgewotCQlyZXR1cm4gSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsYXNzIG5hbWUgZnJvbSBpdHMgc3ViamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGNsYXNzIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBkZWZpbmVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDbGFzc05hbWUoKTsKLQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRGaXJzdEphdmFTb3VyY2VGb2xkZXIoKSB7Ci0JCUl0ZXJhdG9yPElQYWNrYWdlRnJhZ21lbnRSb290PiBpID0gSkRUVG9vbHMuZ2V0SmF2YVNvdXJjZUZvbGRlcnMoZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkpLml0ZXJhdG9yKCk7Ci0JCXJldHVybiBpLmhhc05leHQoKSA/IGkubmV4dCgpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYnJvd3NlIGJ1dHRvbiB3YXMgY2xpY2tlZCwgaXRzIGFjdGlvbiBpbnZva2VzIHRoaXMgYWN0aW9uIHdoaWNoIHNob3VsZAotCSAqIHByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBjbGFzcyBhbmQgc2V0IGl0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb21wdFR5cGUoKSB7Ci0JCUlUeXBlIHR5cGUgPSB0aGlzLmNob29zZVR5cGUoKTsKLQotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpKTsKLQkJCXNldENsYXNzTmFtZShjbGFzc05hbWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCXJldHVybiBKRFRUb29scy5nZXRDb2RlQ29tcGxldGlvbkNvbnRleHRSb290KGdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQ29tYm9QYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0NvbWJvUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODI0NTk1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQ29tYm9QYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFBhbmUgd2l0aCBjb21ibyBib3ggc3VwcG9ydCBmb3IgYXV0b21hdGljIHVwZGF0aW5nIG9mOgotICogIC0gc2VsZWN0ZWQgdmFsdWUKLSAqICAtIGRlZmF1bHQgdmFsdWUKLSAqICAtIHZhbHVlIGNob2ljZXMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbWJvUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIFRoZSBtYWluIChvbmx5KSB3aWRnZXQgb2YgdGhpcyBwYW5lLgotCSAqLwotCXByb3RlY3RlZCBDb21ibyBjb21ib0JveDsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgQ29tYm9QYW5lKAotCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tYm9QYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tYm9QYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBlbmFibGVkTW9kZWwpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5jb21ib0JveCA9IHRoaXMuYWRkRWRpdGFibGVDb21ibyhjb250YWluZXIpOwotCQl0aGlzLmNvbWJvQm94LmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMuYnVpbGRNb2RpZnlMaXN0ZW5lcigpKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKHRoaXMuY29tYm9Cb3gpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgYnVpbGRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCUNvbWJvUGFuZS50aGlzLmNvbWJvQm94TW9kaWZpZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB0eXBpY2FsIG92ZXJyaWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwb3NzaWJsZSB2YWx1ZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbWJvIGR1cmluZwotCSAqIHBvcHVsYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhYmxlPFN0cmluZz4gZ2V0VmFsdWVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbWJvIGlzIHRvIGFkZCBhIGRlZmF1bHQgdmFsdWUgdG8gdGhlIGNob2ljZXMKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VzRGVmYXVsdFZhbHVlKCkgewotCQkvLyBkZWZhdWx0IHJlc3BvbnNlIGlzICd0cnVlJwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBkZWZhdWx0IGlzCi0JICogc3BlY2lmaWVkLiBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzdWJqZWN0IGlzIG5vbi1udWxsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlIHN1YmplY3QuCi0JICogVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgd2hlbiB0aGUgc3ViamVjdCBpcyBub24tbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUgYXMgdGhlIG5ldyB2YWx1ZSBvbiB0aGUgc3ViamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCQl0aGlzLnVwZGF0ZVNlbGVjdGVkSXRlbSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXRoaXMucG9wdWxhdGVDb21ib0JveCgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHBvcHVsYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBQb3B1bGF0ZSB0aGUgY29tYm8tYm94IGxpc3QgYnkgY2xlYXJpbmcgaXQsIHRoZW4gYWRkaW5nIGZpcnN0IHRoZSBkZWZhdWx0Ci0JICogdmFsdWUsIGlmIGF2YWlsYWJsZSwgYW5kIHRoZW4gdGhlIHBvc3NpYmxlIGNob2ljZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVDb21ib0JveCgpIHsKLQkJdGhpcy5jb21ib0JveC5yZW1vdmVBbGwoKTsKLQkJCi0JCWlmICh1c2VzRGVmYXVsdFZhbHVlKCkpIHsKLQkJCXRoaXMuY29tYm9Cb3guYWRkKHRoaXMuYnVpbGREZWZhdWx0VmFsdWVFbnRyeSgpKTsKLQkJfQotCQkJCi0JCWZvciAoU3RyaW5nIHZhbHVlIDogdGhpcy5nZXRWYWx1ZXMoKSkgewotCQkJdGhpcy5jb21ib0JveC5hZGQodmFsdWUpOwotCQl9Ci0JCQotCQl0aGlzLnVwZGF0ZVNlbGVjdGVkSXRlbV8oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRWYWx1ZUVudHJ5KCkgewotCQlpZiAoZ2V0U3ViamVjdCgpID09IG51bGwpIHsKLQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Ob25lU2VsZWN0ZWQ7Ci0JCX0KLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCXJldHVybiAoZGVmYXVsdFZhbHVlID09IG51bGwpID8gdGhpcy5idWlsZE51bGxEZWZhdWx0VmFsdWVFbnRyeSgpIDogdGhpcy5idWlsZE5vbk51bGxEZWZhdWx0VmFsdWVFbnRyeShkZWZhdWx0VmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTnVsbERlZmF1bHRWYWx1ZUVudHJ5KCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdEVtcHR5OwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTm9uTnVsbERlZmF1bHRWYWx1ZUVudHJ5KFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0ZWRJdGVtKCkgewotCQkvLyBtYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgdXAgdG8gZGF0ZSAoPz8/IH5ianYpCi0JCWlmICh1c2VzRGVmYXVsdFZhbHVlKCkpIHsKLQkJCVN0cmluZyBkZWZhdWx0VmFsdWVFbnRyeSA9IHRoaXMuYnVpbGREZWZhdWx0VmFsdWVFbnRyeSgpOwotCQkJaWYgKCAhIHRoaXMuY29tYm9Cb3guZ2V0SXRlbSgwKS5lcXVhbHMoZGVmYXVsdFZhbHVlRW50cnkpKSB7Ci0JCQkJdGhpcy5jb21ib0JveC5yZW1vdmUoMCk7Ci0JCQkJdGhpcy5jb21ib0JveC5hZGQoZGVmYXVsdFZhbHVlRW50cnksIDApOwotCQkJfQotCQl9Ci0JCQotCQl0aGlzLnVwZGF0ZVNlbGVjdGVkSXRlbV8oKTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc2VsZWN0ZWQgaXRlbSBieSBzZWxlY3RpbmcgdGhlIGN1cnJlbnQgdmFsdWUsIGlmIG5vdAotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCBvciBzZWxlY3QgdGhlIGRlZmF1bHQgdmFsdWUgaWYgb25lIGlzIGF2YWlsYWJsZSwKLQkgKiBvdGhlcndpc2UgcmVtb3ZlIHRoZSBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0ZWRJdGVtXygpIHsKLQkJU3RyaW5nIHZhbHVlID0gKHRoaXMuZ2V0U3ViamVjdCgpID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0VmFsdWUoKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWlmICh1c2VzRGVmYXVsdFZhbHVlKCkpIHsKLQkJCQkvLyBzZWxlY3QgdGhlIGRlZmF1bHQgdmFsdWUKLQkJCQl0aGlzLmNvbWJvQm94LnNlbGVjdCgwKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuY29tYm9Cb3guc2V0VGV4dCgiIik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzZWxlY3QgdGhlIG5ldyB2YWx1ZQotCQkJaWYgKCAhIHZhbHVlLmVxdWFscyh0aGlzLmNvbWJvQm94LmdldFRleHQoKSkpIHsKLQkJCQkvLyBUaGlzIHByZXZlbnRzIHRoZSBjdXJzb3IgZnJvbSBiZWluZyBzZXQgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIChidWcgMjM0NDE4KS4KLQkJCQkvLyBUaGUgcmVhc29uIHdlIGFyZSBoaXR0aW5nIHRoaXMgbWV0aG9kIGF0IGFsbCBpcyBiZWNhdXNlIHRoZQotCQkJCS8vIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwgaW4gYSB3YXkKLQkJCQkvLyB0aGF0IGNhdXNlcyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byBiZSBmaXJlZCAodGhlIGFubm90YXRpb24KLQkJCQkvLyBpcyBhZGRlZCB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoYW5nZSBub3RpZmljYXRpb24gb2NjdXJzCi0JCQkJLy8gb24gdGhlIHVwZGF0ZSB0aHJlYWQsIGFuZCB0aGVuIHRoZSBuYW1lIGlzIHNldCwgdGhlc2UgMgotCQkJCS8vIHRocmVhZHMgY2FuIGdldCBpbiB0aGUgd3Jvbmcgb3JkZXIpLgotCQkJCS8vIFRoZSAjdmFsdWVDaGFuZ2VkKCkgbWV0aG9kIHNldHMgdGhlIHBvcHVsYXRpbmcgZmxhZyB0byB0cnVlLAotCQkJCS8vIGJ1dCBpbiB0aGlzIGNhc2UgaXQgaXMgYWxyZWFkeSBzZXQgYmFjayB0byBmYWxzZSB3aGVuIHdlCi0JCQkJLy8gcmVjZWl2ZSBub3RpZmljYXRpb24gYmFjayBmcm9tIHRoZSBtb2RlbCBiZWNhdXNlIGl0IGhhcwotCQkJCS8vIG1vdmVkIHRvIHRoZSB1cGRhdGUgdGhyZWFkIGFuZCB0aGVuIGp1bXBzIGJhY2sgb24gdGhlIFVJIHRocmVhZC4KLQkJCQl0aGlzLmNvbWJvQm94LnNldFRleHQodmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlcG9wdWxhdGVDb21ib0JveCgpIHsKLQkJaWYgKCAhIHRoaXMuY29tYm9Cb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnJlcG9wdWxhdGUoKTsKLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNvbWJvLWJveCBsaXN0ZW5lciBjYWxsYmFjayAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb21ib0JveE1vZGlmaWVkKCkgewotCQlpZiAoICEgdGhpcy5pc1BvcHVsYXRpbmcoKSkgewotCQkJdGhpcy52YWx1ZUNoYW5nZWQodGhpcy5jb21ib0JveC5nZXRUZXh0KCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoZSBjb21iby1ib3ggc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLCB1cGRhdGUgdGhlIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKiBJZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgYW5kIHRoZSBzdWJqZWN0IGlzIG51bGwsIHdlIGNhbiBidWlsZCBhIHN1YmplY3QKLQkgKiBiZWZvcmUgc2V0dGluZyB0aGUgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlUIHN1YmplY3QgPSB0aGlzLmdldFN1YmplY3QoKTsKLQkJU3RyaW5nIG9sZFZhbHVlOwotCQlpZiAoc3ViamVjdCA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5udWxsU3ViamVjdElzTm90QWxsb3dlZCgpKSB7Ci0JCQkJcmV0dXJuOyAgLy8gbm8gc3ViamVjdCB0byBzZXQgdGhlIHZhbHVlIG9uCi0JCQl9Ci0JCQlvbGRWYWx1ZSA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJfQotCQkKLQkJLy8gY29udmVydCBlbXB0eSBzdHJpbmcgb3IgZGVmYXVsdCB0byBudWxsCi0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KG5ld1ZhbHVlKSB8fCB0aGlzLnZhbHVlSXNEZWZhdWx0KG5ld1ZhbHVlKSkgewotCQkJbmV3VmFsdWUgPSBudWxsOwotCQl9Ci0JCQotCQkvLyBzZXQgdGhlIG5ldyB2YWx1ZSBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIHZhbHVlCi0JCWlmIChUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQob2xkVmFsdWUsIG5ld1ZhbHVlKSkgewotCQkJdGhpcy5zZXRQb3B1bGF0aW5nKHRydWUpOwotCQkJCi0JCQl0cnkgewotCQkJCXRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl0aGlzLnNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHdlIGNhbiBzZXQgdGhlIHZhbHVlIHdoZW4gdGhlIHN1YmplY3QgaXMgbnVsbAotCSAqIChpLmUuICNzZXRWYWx1ZShTdHJpbmcpIHdpbGwgY29uc3RydWN0IHRoZSBzdWJqZWN0IGlmIG5lY2Vzc2FyeSkuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbnVsbFN1YmplY3RJc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbnVsbFN1YmplY3RJc05vdEFsbG93ZWQoKSB7Ci0JCXJldHVybiAhIHRoaXMubnVsbFN1YmplY3RJc0FsbG93ZWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdmFsdWUgaXMgbm90IG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWx1ZUlzRGVmYXVsdChTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKCEgdXNlc0RlZmF1bHRWYWx1ZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLmNvbWJvQm94LmdldEl0ZW1Db3VudCgpID4gMCkKLQkJCQkmJiB2YWx1ZS5lcXVhbHModGhpcy5jb21ib0JveC5nZXRJdGVtKDApKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0RlZmF1bHRXaWRnZXRGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0RlZmF1bHRXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OTk2MWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9EZWZhdWx0V2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRhdGVUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0vKioKLSAqIFRoaXMgPGNvZGU+V2lkZ2V0RmFjdG9yeTwvY29kZT4gc2ltcGx5IGNyZWF0ZXMgcGxhaW4gU1dUIHdpZGdldHMuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0V2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIFdpZGdldEZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPklXaWRnZXRGYWN0b3J5PC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFdpZGdldEZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdFdpZGdldEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGVmYXVsdFdpZGdldEZhY3Rvcnk8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgRGVmYXVsdFdpZGdldEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+SVdpZGdldEZhY3Rvcnk8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+SVdpZGdldEZhY3Rvcnk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBXaWRnZXRGYWN0b3J5IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIHRleHQsIFNXVC5OVUxMKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgdG8gYXBwbHkgdG8gdGhlIGJ1dHRvbiwgd2hpY2ggZGV0ZXJtaW5lcyBpdHMgdHlwZToKLQkgKiB0b2dnbGUsIHB1c2gsIGNoZWNrIGJveCwgcmFkaW8KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIHN0eWxlKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIENDb21ibyBjcmVhdGVDQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuQ0hFQ0spOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCX0KLQkKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIERhdGVUaW1lIGNyZWF0ZURhdGVUaW1lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlyZXR1cm4gbmV3IERhdGVUaW1lKHBhcmVudCwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBDQ29tYm8gY3JlYXRlRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQ29tYm8gY3JlYXRlRWRpdGFibGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0aXRsZSkgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJZ3JvdXAuc2V0VGV4dCh0aXRsZSk7Ci0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJSHlwZXJsaW5rIGh5cGVybGluayA9IG5ldyBIeXBlcmxpbmsocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWh5cGVybGluay5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gaHlwZXJsaW5rOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChsYWJlbFRleHQpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBMaXN0IGNyZWF0ZUxpc3QoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiBuZXcgTGlzdChwYXJlbnQsIFNXVC5CT1JERVIgfCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBGb3JtVGV4dCBjcmVhdGVNdWx0aUxpbmVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgICA9IDE7Ci0JCWxheW91dC5ib3R0b21NYXJnaW4gPSAwOwotCQlsYXlvdXQubGVmdE1hcmdpbiAgID0gMDsKLQkJbGF5b3V0LnJpZ2h0TWFyZ2luICA9IDA7Ci0JCWxheW91dC50b3BNYXJnaW4gICAgPSAwOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJRm9ybVRvb2xraXQgd2lkZ2V0RmFjdG9yeSA9IG5ldyBGb3JtVG9vbGtpdChwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLQkJRm9ybVRleHQgdGV4dCA9IHdpZGdldEZhY3RvcnkuY3JlYXRlRm9ybVRleHQoY29udGFpbmVyLCB0cnVlKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCXRleHQuc2V0VGV4dChsYWJlbFRleHQsIGZhbHNlLCBmYWxzZSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZU11bHRpTGluZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFRleHQgY3JlYXRlUGFzc3dvcmRUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5QQVNTV09SRCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuUFVTSCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULlJBRElPKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFNlY3Rpb24gY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIG5ldyBTZWN0aW9uKHBhcmVudCwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU3Bpbm5lciBjcmVhdGVTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBTcGlubmVyKHBhcmVudCwgU1dULk5VTEwpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGFibGUgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiBuZXcgVGFibGUocGFyZW50LCBTV1QuQk9SREVSIHwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlVHJpU3RhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlUcmlTdGF0ZUNoZWNrQm94IGNoZWNrQm94ID0gbmV3IFRyaVN0YXRlQ2hlY2tCb3gocGFyZW50LCB0ZXh0LCB0aGlzKTsKLQkJcmV0dXJuIGNoZWNrQm94LmdldENoZWNrQm94KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzZhOGU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBkaWFsb2cgdXNpbmcgYSAic3RhdGUgb2JqZWN0IiAobW9kZWwgb2JqZWN0KQotICogZm9yIGJlaGF2aW9yLgotICogPHA+Ci0gKiBUaGUgbWFpbiBwYW5lIG9mIHRoaXMgZGlhbG9nIHNob3VsZCBiZSBleHRlbmRpbmcgPGNvZGU+RGlhbG9nUGFuZTwvY29kZT4KLSAqIGZvciBjcmVhdGluZyB0aGUgcmlnaHQgdHlwZSBvZiB3aWRnZXRzIGFuZCBpdCBoYXMgdGhlICJzdGF0ZSBvYmplY3QiIChzdWJqZWN0KQotICogYmVoYXZpb3IgYnVpbHQtaW4uCi0gKgotICogQHNlZSBOb2RlCi0gKiBAc2VlIERpYWxvZ1BhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhbG9nPFQgZXh0ZW5kcyBOb2RlPiBleHRlbmRzIFRpdGxlQXJlYURpYWxvZwotewotCS8qKgotCSAqIFRoZSBtYWluIGNvbnRlbnQgcGFuZSBvZiB0aGlzIGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIERpYWxvZ1BhbmU8Pz4gcGFuZTsKLQotCS8qKgotCSAqIFRoZSBob2xkZXIgb2YgdGhlICJzdGF0ZSBvYmplY3QiIHVzZWQgYnkgdGhpcyBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyOwotCi0JLyoqCi0JICogQ2FjaGVzIHRoZSB0aXRsZSB0ZXh0IHVudGlsIHRoZSBkaWFsb2cgaXMgY3JlYXRlZCBhbmQgdGhlIGRpYWxvZydzIHNoZWxsCi0JICogbmVlZHMgdG8gYmUgY29uZmlndXJlZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqLwotCXByb3RlY3RlZCBEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXRoaXMocGFyZW50LCAiIik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIHRpdGxlIFRoZSBkaWFsb2cncyB0aXRsZQotCSAqLwotCXByb3RlY3RlZCBEaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIG1haW4gcGFuZSBvZiB0aGlzIGRpYWxvZy4gVGhpcyBtZXRob2QgaXMgaW52b2tlZCBvbmx5Ci0JICogd2hlbiB0aGUgZGlhbG9nIGlzIHJlcXVlc3RlZCB0byBzaG93IG9uIHNjcmVlbiBhbmQgbm90IGR1cmluZwotCSAqIGluaXRpYWxpemF0aW9uLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIHRvIHdoaWNoIHRoZSB3aWRnZXRzIHNob3VsZCBiZSBhZGRlZCB0bywKLQkgKiB0aGUgbGF5b3V0IGlzIGFscmVhZHkgc2V0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IERpYWxvZ1BhbmU8Pz4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzdGF0ZSBvYmplY3QgKG1vZGVsIG9iamVjdCkgdGhhdCB3aWxsIGJlIHVzZWQgdG8ga2VlcCB0cmFjawotCSAqIG9mIHRoZSBpbmZvcm1hdGlvbiBlbnRlcmVkIGluIHRoaXMgZGlhbG9nLiBUaGUgc3RhdGUgb2JqZWN0IHdpbGwgYmUgc3RvcmVkCi0JICogaW4gdGhlIHN1YmplY3QgaG9sZGVyIGFuZCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHtAbGluayAjc3ViamVjdCgpfS4KLQkgKgotCSAqIEByZXR1cm4gQSBuZXcgc3RhdGUgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIFQgYnVpbGRTdGF0ZU9iamVjdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgPGNvZGU+VmFsaWRhdG9yPC9jb2RlPiB0aGF0IHdpbGwgYmUgbm90aWZpZWQgd2hlbiBjaGFuZ2VzIGFyZQotCSAqIG1hZGUgdG8gdGhlIHN0YXRlIG9iamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgc2V0IG9uIHRoZSBzdGF0ZSBvYmplY3QKLQkgKi8KLQlOb2RlLlZhbGlkYXRvciBidWlsZFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIE5vZGUuTlVMTF9WQUxJREFUT1I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0KLQkJLy8gRGlzcG9zZSB0aGUgcGFuZSBpbiBvcmRlciB0byByZW1vdmUgYW55IGxpc3RlbmVycyB0aGF0IGNvdWxkCi0JCS8vIGhhdmUgYmVlbiBpbnN0YWxsZWQgb3V0c2lkZSB0aGUgc2Nyb3BlIG9mIHRoZSBzdGF0ZSBvYmplY3QKLQkJaWYgKHBhbmUgIT0gbnVsbCkgewotCQkJcGFuZS5kaXNwb3NlKCk7Ci0JCQlwYW5lID0gbnVsbDsKLQkJfQotCi0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQoZ2V0VGl0bGUoKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JCWluc3RhbGxTdWJqZWN0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoaGFzVGl0bGVBcmVhKCkpIHsKLQkJCXJldHVybiBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRDb250ZW50KHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBtYWluIGNvbnRhaW5lciBvZiB0aGlzIGRpYWxvZyB3aGVuIHRoZSB0aXRsZSBhcmVhIGlzCi0JICogbm90IHJlcXVpcmVkLiBUaGUgdG9wIHBhcnQgaXMgdGhlIGRpYWxvZyBhcmVhIHBvcHVsYXRlZCBieSB0aGUgc3ViY2xhc3MKLQkgKiBhbmQgdGhlIGxvd2VyIHBhcnQgaXMgdGhlIGJ1dHRvbiBwYW5lIGhhdmluZyB0aGUgT0sgYW5kIENhbmNlbCBidXR0b25zLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlRGVmYXVsdENvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ICAgICAgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgICAgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggICAgID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoY29tcG9zaXRlKTsKLQkJZGlhbG9nQXJlYSA9IGNyZWF0ZURpYWxvZ0FyZWEoY29tcG9zaXRlKTsKLQkJYnV0dG9uQmFyICA9IGNyZWF0ZUJ1dHRvbkJhcihjb21wb3NpdGUpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBJZiB0aGUgdGl0bGUgYXJlYSBuZWVkcyB0byBiZSBzaG93biwgdGhlbiBsZWF2ZSB0aGUgc3VwZXJjbGFzcyB0bwotCQkvLyBjcmVhdGUgdGhlIG5lY2Vzc2FyeSB3aWRnZXRzCi0JCWlmIChoYXNUaXRsZUFyZWEoKSkgewotCQkJcGFyZW50ID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBtYWluIGFyZWEncyBjb250YWluZXIKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgICAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSAgID0gdHJ1ZTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIEluaXRpYWxpemUgdGhlIGNvbnRlbnQgcGFuZQotCQlwYW5lID0gYnVpbGRMYXlvdXQoY29udGFpbmVyKTsKLQotCQkvLyBJbml0aWFsaXplIHRoZSBVSSBwYXJ0LCB3aGljaCByZXF1aXJlcyB0aGUgd2lkZ2V0cyBiZWluZyBjcmVhdGVkCi0JCWluaXRpYWxpemVVSSgpOwotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZXNjcmlwdGlvbiBhcmVhICh3aGVyZSBhIHRpdGxlLCBkZXNjcmlwdGlvbiBhbmQKLQkgKiBpbWFnZSkgc2hvdWxkIGJlIHZpc2libGUgb3IgaGlkZGVuLiA8Y29kZT5WYWxpZGF0aW5nRGlhbG9nPC9jb2RlPgotCSAqIGF1dG9tYXRpY2FsbHkgc2hvdyB0aGUgZGVzY3JpcHRpb24gYXJlYSBpbiBvcmRlciB0byBzaG93IHByb2JsZW1zLgotCSAqCi0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gYnkgZGVmYXVsdCwgd2hpY2ggbWVhbnMgdGhlIG1ldGhvZHMgdXNlZCB0bwotCSAqIHVwZGF0ZSB0aGUgdGl0bGUsIGRlc2NyaXB0aW9uIGFuZCBpbWFnZSBzaG91bGRuJ3QgYmUgY2FsbGVkOyA8Y29kZT50cnVlPC9jb2RlPgotCSAqIHRvIG1ha2UgdGhlIGRlc2NyaXB0aW9uIHBhbmUgdmlzaWJsZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc1RpdGxlQXJlYSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhlbHBzIHN5c3RlbS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHBsYXRmb3JtJ3MgaGVscCBzeXN0ZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBIZWxwZXIKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gZ2V0SGVscFN5c3RlbSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgZGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuc3ViamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4oKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgVUkgcGFydCBvZiB0aGlzIGRpYWxvZywgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHdpZGdldHMKLQkgKiBoYXZlIGJlZW4gY3JlYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVUkoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgc3RhdGUgb2JqZWN0LCBpZiBvbmUgaXMgbmVlZGVkIGFuZCBpbnN0YWxsIGEgPGNvZGU+VmFsaWRhdG9yPC9jb2RlPgotCSAqIGluIG9yZGVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMgZG9uZSB0byB0aGF0IHN0YXRlIG9iamVjdC4gVGhlCi0JICogc3ViamVjdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHN1YmplY3QgaG9sZGVyLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnN0YWxsU3ViamVjdCgpIHsKLQotCQlUIHN1YmplY3QgPSBidWlsZFN0YXRlT2JqZWN0KCk7Ci0KLQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJc3ViamVjdC5zZXRWYWxpZGF0b3IoYnVpbGRWYWxpZGF0b3IoKSk7Ci0JCX0KLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKHN1YmplY3QpOwotCX0KLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IGxhdW5jaGVzIHRoaXMgZGlhbG9nIGluIHRoZSBVSSB0aHJlYWQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgb3BlbkRpYWxvZygpIHsKLQkJU1dUVXRpbC5zZXRVc2VySW50ZXJmYWNlQWN0aXZlKGZhbHNlKTsKLQkJU1dUVXRpbC5zaG93KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IGxhdW5jaGVzIHRoaXMgZGlhbG9nIGluIHRoZSBVSSB0aHJlYWQgYW5kIGludm9rZSB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5Qb3N0RXhlY3V0aW9uPC9jb2RlPiB0byBwZXJmb3JtIGFueSBwb3N0LXRhc2suCi0JICoKLQkgKiBAcGFyYW0gcG9zdEV4ZWN1dGlvbiBUaGlzIGludGVyZmFjZSBsZXQgdGhlIGNhbGxlciB0byBpbnZva2UgYSBwaWVjZSBvZgotCSAqIGNvZGUgb25jZSB0aGUgZGlhbG9nIGlzIGRpc3Bvc2VkCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgb3BlbkRpYWxvZyhQb3N0RXhlY3V0aW9uPD8gZXh0ZW5kcyBEaWFsb2c8VD4+IGV4ZWN1dGlvbikgewotCQlTV1RVdGlsLnNldFVzZXJJbnRlcmZhY2VBY3RpdmUoZmFsc2UpOwotCQlTV1RVdGlsLnNob3codGhpcywgZXhlY3V0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlcyBhY2Nlc3MgdG8gdGhlIGRpYWxvZydzIG1haW4gcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHBhbmUgc2hvd2luZyB0aGUgY3VzdG9tIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhbG9nUGFuZTw/PiBnZXRQYW5lKCkgewotCQlyZXR1cm4gcGFuZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWJqZWN0IG9mIHRoaXMgZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBUaGUgc3ViamVjdCBvZiB0aGlzIGRpYWxvZyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWJqZWN0IHdhcwotCSAqIHVzZWQKLQkgKi8KLQlwdWJsaWMgVCBnZXRTdWJqZWN0KCkgewotCQlyZXR1cm4gc3ViamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHN1YmplY3QgaG9sZGVyIHVzZWQgdG8gYmUgcGFzc2VkIHRvIHRoZSBkaWFsb2cgcGFuZSwgd2hpY2ggaXMKLQkgKiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5EaWFsb2dQYW5lPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gZ2V0U3ViamVjdEhvbGRlcigpIHsKLQkJcmV0dXJuIHN1YmplY3RIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkaWFsb2cncyB0aXRsZS4gVGhlIHRpdGxlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igd2lsbCBiZQotCSAqIHJldHVybmVkIGJ5IGRlZmF1bHQgYnV0IGlmIGl0IHdhc24ndCBzcGVjaWZpZWQsIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkCi0JICogdG8gcmV0dXJuIGl0LgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgdGhlIHRpdGxlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igb3IgYSBkaWZmZXJlbnQgdGl0bGUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkaWFsb2cgd2FzIGNhbmNlbGxlZCBvciBub3QuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkaWFsb2cgd2FzIGNhbmNlbGxlZDsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgaXQgd2FzIGNvbmZpcm1lZAotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIHdhc0NhbmNlbGxlZCgpIHsKLQkJcmV0dXJuIGdldFJldHVybkNvZGUoKSA9PSBDQU5DRUw7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkaWFsb2cgd2FzIGNvbmZpcm1lZCBvciBub3QuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkaWFsb2cgd2FzIGNvbmZpcm1lZDsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgaXQgd2FzIGNhbmNlbGxlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIHdhc0NvbmZpcm1lZCgpIHsKLQkJcmV0dXJuIGdldFJldHVybkNvZGUoKSA9PSBPSzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9EaWFsb2dQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0RpYWxvZ1BhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4OTA4Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0RpYWxvZ1BhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgcGFuZSB0byB1c2Ugd2hlbiB0aGUgcGFuZSBpcyBzaG93biBpbiBhbiA8Y29kZT5EaWFsb2c8L2NvZGU+LgotICoKLSAqIEBzZWUgRGlhbG9nCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFsb2dQYW5lPFQgZXh0ZW5kcyBOb2RlPiBleHRlbmRzIFBhbmU8VD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWFsb2dQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udHJvbGxlciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEaWFsb2dQYW5lKERpYWxvZ1BhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpYWxvZ1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBjb250cm9sbGVyOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmUoRGlhbG9nUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlhbG9nUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEaWFsb2dQYW5lKERpYWxvZ1BhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlhbG9nUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCi0JICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IGNvbnRyb2xsZXI7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhbG9nUGFuZShEaWFsb2dQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpYWxvZ1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgRGVmYXVsdFdpZGdldEZhY3RvcnkuaW5zdGFuY2UoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRW51bUNvbWJvVmlld2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1Db21ib1ZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODEwMjM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRW51bUNvbWJvVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcGFuZSBzaW1wbHkgc2hvd3MgYSBjb21ibyB3aGVyZSBpdHMgZGF0YSBpcyBwb3B1bGF0aW5nIHRocm91Z2gKLSAqIHtAbGluayAjY2hvaWNlcygpfSBhbmQgYSBkZWZhdWx0IHZhbHVlIGNhbiBhbHNvIGJlIGFkZGVkLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWFic3RyYWN0IGNsYXNzIEVudW1Db21ib1ZpZXdlcjxUIGV4dGVuZHMgTW9kZWwsIFY+IGV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIFRoZSBtYWluIHdpZGdldCBvZiB0aGlzIHBhbmUuCi0JICovCi0JcHJpdmF0ZSBDb21ib1ZpZXdlciBjb21ib1ZpZXdlcjsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgdXNlZCB0byByZXByZXNlbnQgdGhlIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfVkFMVUUgPSAibnVsbCI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudW1Db21ib1ZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKi8KLQlFbnVtQ29tYm9WaWV3ZXIoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudW1Db21ib1ZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKi8KLQlFbnVtQ29tYm9WaWV3ZXIoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudW1Db21ib1ZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICovCi0JRW51bUNvbWJvVmlld2VyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGlzdCBvZiBjaG9pY2VzIGFuZCBhZGQgYW4gZXh0cmEgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlCi0JICogZGVmYXVsdCB2YWx1ZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGNvbWJvJ3MgY2hvaWNlcyBpbmNsdWRpbmcgdGhlIGRlZmF1bHQgdmFsdWUKLQkgKi8KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkQ2hvaWNlcygpIHsKLQkJVltdIGNob2ljZXMgPSBnZXRDaG9pY2VzKCk7Ci0JCWlmIChzb3J0Q2hvaWNlcygpKSB7Ci0JCQlBcnJheXMuc29ydChjaG9pY2VzLCBidWlsZENvbXBhcmF0b3IoKSk7Ci0JCX0KLQotCQlPYmplY3RbXSBleHRlbmRlZENob2ljZXMgPSBuZXcgT2JqZWN0W2Nob2ljZXMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY2hvaWNlcywgMCwgZXh0ZW5kZWRDaG9pY2VzLCAxLCBjaG9pY2VzLmxlbmd0aCk7Ci0JCWV4dGVuZGVkQ2hvaWNlc1swXSA9IE5VTExfVkFMVUU7Ci0KLQkJcmV0dXJuIGV4dGVuZGVkQ2hvaWNlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSB0byBzb3J0IHRoZSBjaG9pY2VzIGluIGFscGhhYmV0aWNhbCBvcmRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiB3aXRoIHRoZSByaWdodCBjb21ibyB3aWRnZXRzLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBjb21ibwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIHJpZ2h0IGNvbWJvIHdpZGdldAotCSAqLwotCXByb3RlY3RlZCBDb21ib1ZpZXdlciBhZGRDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBhZGRDb21ib1ZpZXdlcihjb250YWluZXIsIGJ1aWxkTGFiZWxQcm92aWRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8T2JqZWN0PiBidWlsZENvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxPYmplY3Q+KCkgewotCQkJZmluYWwgTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gYnVpbGRMYWJlbFByb3ZpZGVyKCk7Ci0KLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcxID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KHZhbHVlMSk7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcyID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KHZhbHVlMik7Ci0JCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShkaXNwbGF5U3RyaW5nMSwgZGlzcGxheVN0cmluZzIpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgbG9jYWxpemVkIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBOTFMgY2xhc3MgYnkgY3JlYXRpbmcgdGhlCi0JICoga2V5LiBUaGF0IGtleSBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgY29tcG9zaXRlJ3Mgc2hvcnQgY2xhc3MgbmFtZQotCSAqIHdpdGggdGhlIHRvU3RyaW5nKCkgb2YgdGhlIGdpdmVuIHZhbHVlIHNlcGFyYXRlZCBieSBhbiB1bmRlcnNjb3JlLgotCSAqCi0JICogQHBhcmFtIG5sc0NsYXNzIFRoZSBOTFMgY2xhc3MgdXNlZCB0byByZXRyaWV2ZSB0aGUgbG9jYWxpemVkIHRleHQKLQkgKiBAcGFyYW0gY29tcG9zaXRlQ2xhc3MgVGhlIGNsYXNzIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBrZXksIGl0cyBzaG9ydCBjbGFzcwotCSAqIG5hbWUgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB1c2VkIHRvIGFwcGVuZCBpdHMgdG9TdHJpbmcoKSB0byB0aGUgZ2VuZXJhdGVkIGtleQotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGJ1aWxkRGlzcGxheVN0cmluZyhDbGFzczw/PiBubHNDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiBjb21wb3NpdGVDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKLQotCQlyZXR1cm4gU1dUVXRpbC5idWlsZERpc3BsYXlTdHJpbmcobmxzQ2xhc3MsIGNvbXBvc2l0ZUNsYXNzLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGZyb20gdGhlIGdpdmVuIE5MUyBjbGFzcyBieSBjcmVhdGluZyB0aGUKLQkgKiBrZXkuIFRoYXQga2V5IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBjb21wb3NpdGUncyBzaG9ydCBjbGFzcyBuYW1lCi0JICogd2l0aCB0aGUgdG9TdHJpbmcoKSBvZiB0aGUgZ2l2ZW4gdmFsdWUgc2VwYXJhdGVkIGJ5IGFuIHVuZGVyc2NvcmUuCi0JICoKLQkgKiBAcGFyYW0gbmxzQ2xhc3MgVGhlIE5MUyBjbGFzcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBsb2NhbGl6ZWQgdGV4dAotCSAqIEBwYXJhbSBjb21wb3NpdGUgVGhlIG9iamVjdCB1c2VkIHRvIHJldHJpZXZlIHRoZSBzaG9ydCBjbGFzcyBuYW1lIHRoYXQgaXMKLQkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHVzZWQgdG8gYXBwZW5kIGl0cyB0b1N0cmluZygpIHRvIHRoZSBnZW5lcmF0ZWQga2V5Ci0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgYnVpbGREaXNwbGF5U3RyaW5nKENsYXNzPD8+IG5sc0NsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7Ci0KLQkJcmV0dXJuIFNXVFV0aWwuYnVpbGREaXNwbGF5U3RyaW5nKG5sc0NsYXNzLCBjb21wb3NpdGUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaXNwbGF5IHN0cmluZyBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IGlzIHRoZQotCSAqIHZpcnR1YWwgPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUgdGhlbiBpdHMgZGlzcGxheSBzdHJpbmcgd2lsbCBiZSAiRGVmYXVsdCIKLQkgKiBhcHBlbmRlZCBieSB0aGUgYWN0dWFsIGRlZmF1bHQgdmFsdWUsIGlmIGl0IGV4aXN0cy4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydCBpbnRvIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nCi0JICogQHJldHVybiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBlbGVtZW50Ci0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREaXNwbGF5U3RyaW5nKE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gTlVMTF9WQUxVRSkgewotCQkJViBkZWZhdWx0VmFsdWUgPSAoZ2V0U3ViamVjdCgpICE9IG51bGwpID8gZ2V0RGVmYXVsdFZhbHVlKCkgOiBudWxsOwotCi0JCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9IGRpc3BsYXlTdHJpbmcoZGVmYXVsdFZhbHVlKTsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNZXNzYWdlcy5FbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdFdpdGhEZWZhdWx0LCBkaXNwbGF5U3RyaW5nKTsKLQkJCX0KLQkJCXJldHVybiBudWxsRGlzcGxheVN0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIGRpc3BsYXlTdHJpbmcoKFYpIHZhbHVlKTsKLQl9Ci0KLQlmaW5hbCBMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSVNlbGVjdGlvbiBidWlsZFNlbGVjdGlvbigpIHsKLQkJT2JqZWN0IHZhbHVlID0gKGdldFN1YmplY3QoKSAhPSBudWxsKSA/IGdldFZhbHVlKCkgOiBudWxsOwotCi0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl2YWx1ZSA9IE5VTExfVkFMVUU7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odmFsdWUpOwotCX0KLQotCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBidWlsZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCWlmICghaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJdmFsdWVDaGFuZ2VkKHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvc3NpYmxlIGNob2ljZXMgdG8gc2hvdyBpbiB0aGUgdmlld2VyLgotCSAqCi0JICogQHJldHVybiBUaGUgaXRlbXMgdG8gc2hvdyBpbiB0aGUgY29tYm9zCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFZbXSBnZXRDaG9pY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlLCB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGlmIHRoZSBzdWJqZWN0IGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSB0aGF0IGlzIGRlY2xhcmVkIGFzIGJlaW5nIHRoZSBkZWZhdWx0IHdoZW4gaXQgaXMgbm90Ci0JICogZGVmaW5lZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFYgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHJhbnNsYXRlIGludG8gYSBodW1hbiByZWFkYWJsZSBzdHJpbmcKLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgdGV4dCByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkaXNwbGF5U3RyaW5nKFYgdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIHN0cmluZyBmb3IgYSBudWxsIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbnVsbERpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBudWxsOyAvL0kgd291bGQgcmF0aGVyIGRpc3BsYXkgbm90aGluZyB0aGFuICJEZWZhdWx0KCkiCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCQl0aGlzLnBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zCi0JICoKLQkgKiBAcmV0dXJuCi0JICovCi0JZmluYWwgQ29tYm9WaWV3ZXIgZ2V0Q29tYm9WaWV3ZXIoKSB7Ci0JCXJldHVybiBjb21ib1ZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHN1YmplY3QncyB2YWx1ZS4gVGhlIHN1YmplY3QgaXMgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzdWJqZWN0JyB2YWx1ZSwgd2hpY2ggY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFYgZ2V0VmFsdWUoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuY29tYm9WaWV3ZXIgPSB0aGlzLmFkZENvbWJvVmlld2VyKGNvbnRhaW5lcik7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGJ1aWxkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgY29tYm8gYnkgcmUtYWRkaW5nIGFsbCB0aGUgaXRlbXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm8oKSB7Ci0KLQkJcmVtb3ZlQWxsKCk7Ci0JCWNvbWJvVmlld2VyLmFkZChidWlsZENob2ljZXMoKSk7Ci0JCXVwZGF0ZVNlbGVjdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCQl0aGlzLnBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCB0aGUgaXRlbXMgZnJvbSB0aGUgY29tYm8uCi0JICovCi0JYWJzdHJhY3Qgdm9pZCByZW1vdmVBbGwoKTsKLQotCS8qKgotCSAqIFJlcXVlc3RzIHRoZSBnaXZlbiBuZXcgdmFsdWUgYmUgc2V0IG9uIHRoZSBzdWJqZWN0LgotCSAqCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgdG8gYmUgc2V0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0VmFsdWUoViB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjdXJzb3IsIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHNob3cgdGhlIGVudGlyZSBzZWxlY3RlZCBpdGVtCi0JICogd2l0aGluIHRoZSBjb21ibydzIGFyZWEuCi0JICovCi0JYWJzdHJhY3Qgdm9pZCB1cGRhdGVDdXJzb3IoKTsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGNvbWJvJ3Mgc2VsZWN0ZWQgaXRlbS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0aW9uKCkgewotCQljb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24oYnVpbGRTZWxlY3Rpb24oKSk7Ci0JCXVwZGF0ZUN1cnNvcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzZWxlY3Rpb24gY2hhbmdlcywgbm90aWZ5IHRoZSBzdWJjbGFzcyB0byBzZXQgdGhlIHZhbHVlLgotCSAqCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgc2VsZWN0ZWQgaXRlbQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgdm9pZCB2YWx1ZUNoYW5nZWQoT2JqZWN0IHZhbHVlKSB7Ci0KLQkJLy8gQ29udmVydCB0aGUgZGVmYXVsdCAibnVsbCIgdmFsdWUgdG8gYSByZWFsIG51bGwKLQkJaWYgKHZhbHVlID09IE5VTExfVkFMVUUpIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJfQotCi0JCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0KLQkJdHJ5IHsKLQkJCXNldFZhbHVlKChWKSB2YWx1ZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRW51bURpYWxvZ0NvbWJvVmlld2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1EaWFsb2dDb21ib1ZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTFhMzJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRW51bURpYWxvZ0NvbWJvVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIDxjb2RlPkVudW1Db21ib1ZpZXdlcjwvY29kZT4gc2hvdWxkIGJlIHVzZWQgd2l0aGluIGEgZGlhbG9nIHBhbmUuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbnVtRGlhbG9nQ29tYm9WaWV3ZXI8VCBleHRlbmRzIE1vZGVsLCBWPgotCWV4dGVuZHMgRW51bUNvbWJvVmlld2VyPFQsIFY+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtRGlhbG9nQ29tYm9WaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIEVudW1EaWFsb2dDb21ib1ZpZXdlcihEaWFsb2dQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudAotCSkgewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW51bURpYWxvZ0NvbWJvVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBFbnVtRGlhbG9nQ29tYm9WaWV3ZXIoRGlhbG9nUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudAotCSkgewotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0KLQkJQ29tYm8gY29tYm8gPSBnZXRDb21ibygpOwotCQlpZiAoICEgY29tYm8uaXNEaXNwb3NlZCgpKSB7Ci0JCQljb21iby5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvIGdldENvbWJvKCkgewotCQlyZXR1cm4gZ2V0Q29tYm9WaWV3ZXIoKS5nZXRDb21ibygpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgcmVtb3ZlQWxsKCkgewotCQlnZXRDb21ibygpLnJlbW92ZUFsbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdXBkYXRlQ3Vyc29yKCkgewotCQlnZXRDb21ibygpLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgMCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRW51bUZvcm1Db21ib1ZpZXdlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtRm9ybUNvbWJvVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZDdhNDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtRm9ybUNvbWJvVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIDxjb2RlPkVudW1Db21ib1ZpZXdlcjwvY29kZT4gc2hvdWxkIGJlIHVzZWQgd2l0aGluIGEgZm9ybSBwYW5lLgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW51bUZvcm1Db21ib1ZpZXdlcjxUIGV4dGVuZHMgTW9kZWwsIFY+Ci0JZXh0ZW5kcyBFbnVtQ29tYm9WaWV3ZXI8VCwgVj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudW1Gb3JtQ29tYm9WaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIEVudW1Gb3JtQ29tYm9WaWV3ZXIoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50Ci0JKSB7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtRm9ybUNvbWJvVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBFbnVtRm9ybUNvbWJvVmlld2VyKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudAotCSkgewotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0KLQkJQ29tYm8gY29tYm8gPSBnZXRDb21ibygpOwotCQlpZiAoICEgY29tYm8uaXNEaXNwb3NlZCgpKSB7Ci0JCQljb21iby5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvIGdldENvbWJvKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb21ib1ZpZXdlcigpLmdldENvbWJvKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCByZW1vdmVBbGwoKSB7Ci0JCWdldENvbWJvKCkucmVtb3ZlQWxsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB1cGRhdGVDdXJzb3IoKSB7Ci0JCWdldENvbWJvKCkuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCAwKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9GaWxlQ2hvb3NlckNvbWJvUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9GaWxlQ2hvb3NlckNvbWJvUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTk5ZWM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRmlsZUNob29zZXJDb21ib1BhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBUaGlzIGNob29zZXIgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIGZpbGUgd2hlbiBicm93c2luZy4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIHwgTGFiZWw6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwgfCBCcm93c2UuLi4gfCB8Ci0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbGVDaG9vc2VyQ29tYm9QYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBGaWxlQ2hvb3NlclBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZpbGVDaG9vc2VyQ29tYm9QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRmlsZUNob29zZXJDb21ib1BhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RmlsZUNob29zZXJDb21ib1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZpbGVDaG9vc2VyQ29tYm9QYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGFkZE1haW5Db250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCXJldHVybiBhZGRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJdGhpcy5idWlsZExpc3RIb2xkZXIoKSwKLQkJCXRoaXMuZ2V0VGV4dEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFN0cmluZ0NvbnZlcnRlcigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGlzdCBob2xkZXIgb2YgdGhlIGNvbWJvIGJveC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0TGlzdCgpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBsaXN0IG9mIHRoZSBjb21ibyBib3guCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBidWlsZERlZmF1bHRMaXN0KCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0aGlzLmdldERlZmF1bHRTdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29tYm8gYm94LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZygpOwotCQotCS8qKgotCSAqIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggY29tYm8gYm94IGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkU3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFN0cmluZz5pbnN0YW5jZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRmlsZUNob29zZXJQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0ZpbGVDaG9vc2VyUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDRmMDVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRmlsZUNob29zZXJQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2hvb3NlciBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgZmlsZSB3aGVuIGJyb3dzaW5nLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogfCBMYWJlbDogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJyb3dzZS4uLiB8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWxlQ2hvb3NlclBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIENob29zZXJQYW5lPFQ+Ci17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZpbGVDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZpbGVDaG9vc2VyUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5GaWxlQ2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZpbGVDaG9vc2VyUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgUnVubmFibGUgYnVpbGRCcm93c2VBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcHJvbXB0RmlsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIDxjb2RlPlZpZXdlckZpbHRlcjwvY29kZT4gdGhhdCB3aWxsIGZpbHRlciB0aGUgY29udGVudCBvZiB0aGUKLQkgKiBkaWFsb2cgYW5kIG9ubHkgZGlzcGxheXMgd2hhdCBpcyB2YWxpZC4KLQkgKgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Vmlld2VyRmlsdGVyPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBWaWV3ZXJGaWx0ZXIgYnVpbGRGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwKLQkJCSAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcGFyZW50RWxlbWVudCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCkgewotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYWRkTWFpbkNvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gdGhpcy5hZGRUZXh0KGNvbnRhaW5lciwgdGhpcy50ZXh0SG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB2YWx1ZSBob2xkZXIgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0eS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGhvbGRlciBvZiB0aGUgY2xhc3MgbmFtZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmFsaWRhdG9yIHRoYXQgd2lsbCBzaG93IGEgc3RhdHVzIG1lc3NhZ2UgYmFzZWQgb24gd2hhdCBpcwotCSAqIHNlbGVjdGVkIGluIHRoZSBzZWxlY3Rpb24gZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IoKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsKLQotCQkJCWlmIChzZWxlY3Rpb24ubGVuZ3RoICE9IDEpIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0VWlQbHVnaW4uUExVR0lOX0lELCAiIik7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSnB0VWlQbHVnaW4uUExVR0lOX0lELCAiIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0aW9uIGRpYWxvZydzIHRpdGxlLgotCSAqCi0JICogQHJldHVybiBBIG5vbi08Y29kZT5udWxsPC9jb2RlPiBzdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERpYWxvZ1RpdGxlKCk7Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHByb2plY3QgcGF0aCB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgc2VsZWN0aW9uIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHByb2plY3QgcGF0aCB1c2VkIHRvIGRpc3BsYXkgaXRzIGNvbnRlbnQgaW4gYSBzZWxlY3Rpb24gZGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9qZWN0UGF0aCgpOwotCi0JcHJvdGVjdGVkICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGdldFRleHRIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnRleHRIb2xkZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLnRleHRIb2xkZXIgPSB0aGlzLmJ1aWxkVGV4dEhvbGRlcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBicm93c2UgYnV0dG9uIHdhcyBjbGlja2VkLCBpdHMgYWN0aW9uIGludm9rZXMgdGhpcyBhY3Rpb24gd2hpY2ggc2hvdWxkCi0JICogcHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhIGZpbGUgYW5kIHNldCBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRGaWxlKCkgewotCQlTdHJpbmcgcHJvamVjdFBhdGg9IHRoaXMuZ2V0UHJvamVjdFBhdGgoKTsKLQotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGdldFNoZWxsKCkpOwotCQlkaWFsb2cuc2V0VGV4dCh0aGlzLmdldERpYWxvZ1RpdGxlKCkpOwotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChwcm9qZWN0UGF0aCk7Ci0JCVN0cmluZyBmaWxlUGF0aCA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0JCQlGaWxlQ2hvb3NlclBhbmUudGhpcy50ZXh0SG9sZGVyLnNldFZhbHVlKGZpbGVQYXRoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRm9sZGVyQ2hvb3NlckNvbWJvUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb2xkZXJDaG9vc2VyQ29tYm9QYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MDU4NjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb2xkZXJDaG9vc2VyQ29tYm9QYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLQotLyoqCi0gKiBUaGlzIGNob29zZXIgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIGZvbGRlciB3aGVuIGJyb3dzaW5nLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogfCBMYWJlbDogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfCB8IEJyb3dzZS4uLiB8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9sZGVyQ2hvb3NlckNvbWJvUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgRm9sZGVyQ2hvb3NlclBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZvbGRlckNob29zZXJDb21ib1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBGb2xkZXJDaG9vc2VyQ29tYm9QYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Rm9sZGVyQ2hvb3NlckNvbWJvUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRm9sZGVyQ2hvb3NlckNvbWJvUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYWRkTWFpbkNvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJcmV0dXJuIGFkZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQl0aGlzLmJ1aWxkTGlzdEhvbGRlcigpLAotCQkJdGhpcy5nZXRUZXh0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU3RyaW5nQ29udmVydGVyKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsaXN0IGhvbGRlciBvZiB0aGUgY29tYm8gYm94LgotCSAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJdGhpcy5idWlsZERlZmF1bHRMaXN0KCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGxpc3Qgb2YgdGhlIGNvbWJvIGJveC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGJ1aWxkRGVmYXVsdExpc3QoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRoaXMuZ2V0RGVmYXVsdFN0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb21ibyBib3guCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0U3RyaW5nKCk7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBjb21ibyBib3ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0ZvbGRlckNob29zZXJQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0ZvbGRlckNob29zZXJQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMWI3MGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb2xkZXJDaG9vc2VyUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotCi0vKioKLSAqIFRoaXMgY2hvb3NlciBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgZm9sZGVyIHdoZW4gYnJvd3NpbmcuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IExhYmVsOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQnJvd3NlLi4uIHwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb2xkZXJDaG9vc2VyUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQ2hvb3NlclBhbmU8VD4KLXsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Rm9sZGVyQ2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBGb2xkZXJDaG9vc2VyUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZvbGRlckNob29zZXJQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBGb2xkZXJDaG9vc2VyUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIFJ1bm5hYmxlIGJ1aWxkQnJvd3NlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXByb21wdEZvbGRlcigpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGFkZE1haW5Db250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIHRoaXMuYWRkVGV4dChjb250YWluZXIsIHRoaXMudGV4dEhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmFsdWUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0J3MgcHJvcGVydHkuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBob2xkZXIgb2YgdGhlIGNsYXNzIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lc3NhZ2UgdG8gYmUgc2hvd24gaW4gdGhlIHNlbGVjdGlvbiBkaWFsb2cuCi0JICoKLQkgKiBAcmV0dXJuIEEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IHN0cmluZyBzaG93biBhYm92ZSB0aGUgdGV4dCBmaWVsZCBvZiB0aGUKLQkgKiBzZWxlY3Rpb24gZGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREaWFsb2dNZXNzYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gZGlhbG9nJ3MgdGl0bGUuCi0JICoKLQkgKiBAcmV0dXJuIEEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IHN0cmluZwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlhbG9nVGl0bGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggdGhhdCB0aGUgZGlhbG9nIHdpbGwgdXNlIHRvIGZpbHRlciB0aGUgZGlyZWN0b3JpZXMgaXQKLQkgKiBzaG93cyB0byB0aGUgYXJndW1lbnQsIHdoaWNoIG1heSBiZSBudWxsLiBJZiB0aGUgc3RyaW5nIGlzIG51bGwsIHRoZW4gdGhlCi0JICogb3BlcmF0aW5nIHN5c3RlbSdzIGRlZmF1bHQgZmlsdGVyIHBhdGggd2lsbCBiZSB1c2VkLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGUgcGF0aCBzdHJpbmcgaXMgcGxhdGZvcm0gZGVwZW5kZW50LiBGb3IgY29udmVuaWVuY2UsIGVpdGhlcgotCSAqICcvJyBvciAnXCcgY2FuIGJlIHVzZWQgYXMgYSBwYXRoIHNlcGFyYXRvci4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIFRoZSBmaWx0ZXIgcGF0aAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmlsdGVyUGF0aCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGdldFRleHRIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnRleHRIb2xkZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLnRleHRIb2xkZXIgPSB0aGlzLmJ1aWxkVGV4dEhvbGRlcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBicm93c2UgYnV0dG9uIHdhcyBjbGlja2VkLCBpdHMgYWN0aW9uIGludm9rZXMgdGhpcyBhY3Rpb24gd2hpY2ggc2hvdWxkCi0JICogcHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhIGZvbGRlciBhbmQgc2V0IGl0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb21wdEZvbGRlcigpIHsKLQotCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhnZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UodGhpcy5nZXREaWFsb2dNZXNzYWdlKCkpOwotCQlkaWFsb2cuc2V0VGV4dCh0aGlzLmdldERpYWxvZ1RpdGxlKCkpOwotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aCh0aGlzLmZpbHRlclBhdGgoKSk7Ci0JCVN0cmluZyBkaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCi0JCWlmIChkaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJdGhpcy50ZXh0SG9sZGVyLnNldFZhbHVlKGRpcmVjdG9yeSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Zvcm1XaWRnZXRGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Zvcm1XaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjRiM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb3JtV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRhdGVUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0vKioKLSAqIFRoaXMgPGNvZGU+V2lkZ2V0RmFjdG9yeTwvY29kZT4gaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0gKiB1c2luZyB0aGUgPGNvZGU+Rm9ybVRvb2xraXQ8L2NvZGU+IGluIG9yZGVyIHVzZSB0aGUgZm9ybSBzdHlsZSAoZmxhdC1zdHlsZSkKLSAqIGxvb2sgYW5kIGZlZWwuCi0gKgotICogQHNlZSBGb3JtVG9vbGtpdAotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBGb3JtV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIFdpZGdldEZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIGFjdHVhbCBmYWN0b3J5IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgbmV3IHdpZGdldHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBGb3JtVG9vbGtpdCB3aWRnZXRGYWN0b3J5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Gb3JtV2lkZ2V0RmFjdG9yeTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgYWN0dWFsIGZhY3RvcnkgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBuZXcKLQkgKiB3aWRnZXRzCi0JICovCi0JcHVibGljIEZvcm1XaWRnZXRGYWN0b3J5KEZvcm1Ub29sa2l0IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKHdpZGdldEZhY3RvcnksICJUaGUgd2lkZ2V0IGZhY3RvcnkgY2Fubm90IGJlIG51bGwiKTsKLQkJdGhpcy53aWRnZXRGYWN0b3J5ID0gd2lkZ2V0RmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwcyB0aGUgZ2l2ZW4gPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBpbnRvIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4KLQkgKiBpbiBvcmRlciB0byBoYXZlIHRoZSB3aWRnZXRzJyBib3JkZXIgcGFpbnRlZC4gRXhjZXB0IGZvciA8Y29kZT5DQ29tYm88L2NvZGU+LAotCSAqIHRoZSB0b3AgYW5kIGJvdHRvbSBtYXJnaW5zIGhhdmUgdG8gYmUgMiBwaXhlbCBhbmQgdGhlIGxlZnQgYW5kIHJpZ2h0Ci0JICogbWFyZ2lucyBoYXZlIHRvIGJlIDEgcGl4ZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgb2YgdGhlIHN1Yi1wYW5lCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHRoYXQgaGFzIHRoZSBuZWNlc3Nhcnkgc3BhY2UgdG8gcGFpbnQKLQkgKiB0aGUgYm9yZGVyCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVCb3JkZXJDb250YWluZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gY3JlYXRlQm9yZGVyQ29udGFpbmVyKGNvbnRhaW5lciwgMiwgMSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQm9yZGVyQ29udGFpbmVyKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBtYXJnaW5IZWlnaHQsIGludCBtYXJnaW5XaWR0aCkgewotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWFyZ2luSGVpZ2h0OwotCQlsYXlvdXQubWFyZ2luV2lkdGggID0gbWFyZ2luV2lkdGg7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCi0JCWNvbnRhaW5lciA9IHdpZGdldEZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGNvbnRhaW5lcik7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULk5VTEwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYnV0dG9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBhcHBseSB0byB0aGUgYnV0dG9uLCB3aGljaCBkZXRlcm1pbmVzIGl0cyB0eXBlOgotCSAqIHRvZ2dsZSwgcHVzaCwgY2hlY2sgYm94LCByYWRpbwotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULkZMQVQgfCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIENDb21ibyBjcmVhdGVDQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlQ0NvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb21iby4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIHRvIGFwcGx5IHRvIHRoZSBjb21ibywgdXN1YWxseSByZWFkLW9ubHksIGZsYXQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgQ0NvbWJvIGNyZWF0ZUNDb21ibyhDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcGFyZW50ID0gY3JlYXRlQm9yZGVyQ29udGFpbmVyKHBhcmVudCwgMSwgMSk7Ci0KLQkJQ0NvbWJvIGNvbWJvID0gbmV3IENDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQkJd2lkZ2V0RmFjdG9yeS5hZGFwdChjb21ibywgdHJ1ZSwgZmFsc2UpOwotCi0JCS8vIEJ1Z3ppbGxhIDE0NTgzNyAtIHdvcmthcm91bmQgZm9yIG5vIGJvcmRlcnMgb24gV2luZG93cyBYUAotCQlpZiAod2lkZ2V0RmFjdG9yeS5nZXRCb3JkZXJTdHlsZSgpID09IFNXVC5CT1JERVIpIHsKLQkJCWNvbWJvLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLCBGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCX0KLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIHRleHQsIFNXVC5DSEVDSyk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULkZMQVQpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JfQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgRGF0ZVRpbWUgY3JlYXRlRGF0ZVRpbWUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXBhcmVudCA9IGNyZWF0ZUJvcmRlckNvbnRhaW5lcihwYXJlbnQpOwotCi0JCURhdGVUaW1lIGRhdGVUaW1lID0gbmV3IERhdGVUaW1lKHBhcmVudCwgc3R5bGUgfCBTV1QuRkxBVCk7Ci0JCWRhdGVUaW1lLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLCBGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCXRoaXMud2lkZ2V0RmFjdG9yeS5hZGFwdChkYXRlVGltZSwgdHJ1ZSwgZmFsc2UpOwotCi0JCXJldHVybiBkYXRlVGltZTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgQ0NvbWJvIGNyZWF0ZUVkaXRhYmxlQ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZUNDb21ibyhwYXJlbnQsIFNXVC5OVUxMKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIENvbWJvIGNyZWF0ZUVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5GTEFUKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCQlncm91cC5zZXRUZXh0KHRpdGxlKTsKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVIeXBlcmxpbmsocGFyZW50LCB0ZXh0LCBTV1QuRkxBVCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCXJldHVybiB3aWRnZXRGYWN0b3J5LmNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgbGFiZWxUZXh0LCBTV1QuV1JBUCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBMaXN0IGNyZWF0ZUxpc3QoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHN0eWxlKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBMaXN0KGNvbnRhaW5lciwgU1dULkZMQVQgfCBzdHlsZSk7Ci0JCWxpc3Quc2V0RGF0YShGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIsIEZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBGb3JtVGV4dCBjcmVhdGVNdWx0aUxpbmVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHdpZGdldEZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zICAgPSAxOwotCQlsYXlvdXQuYm90dG9tTWFyZ2luID0gMDsKLQkJbGF5b3V0LmxlZnRNYXJnaW4gICA9IDA7Ci0JCWxheW91dC5yaWdodE1hcmdpbiAgPSAwOwotCQlsYXlvdXQudG9wTWFyZ2luICAgID0gMDsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCi0JCUZvcm1UZXh0IHRleHQgPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUZvcm1UZXh0KGNvbnRhaW5lciwgdHJ1ZSk7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQl0ZXh0LnNldFRleHQobGFiZWxUZXh0LCBmYWxzZSwgZmFsc2UpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZVRleHQocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVQYXNzd29yZFRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlVGV4dChwYXJlbnQsIFNXVC5QQVNTV09SRCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULlBVU0gpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuUkFESU8pOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU1dULkZMQVQgfCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTcGlubmVyIGNyZWF0ZVNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlwYXJlbnQgPSBjcmVhdGVCb3JkZXJDb250YWluZXIocGFyZW50KTsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihwYXJlbnQsIFNXVC5GTEFUKTsKLQkJc3Bpbm5lci5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwgRm9ybVRvb2xraXQuVEVYVF9CT1JERVIpOwotCQl3aWRnZXRGYWN0b3J5LmFkYXB0KHNwaW5uZXIsIHRydWUsIGZhbHNlKTsKLQotCQlyZXR1cm4gc3Bpbm5lcjsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFRhYmxlIGNyZWF0ZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlUYWJsZSB0YWJsZSA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVUYWJsZShwYXJlbnQsIFNXVC5CT1JERVIgfCBzdHlsZSk7Ci0JCXRhYmxlLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLCBGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0KHBhcmVudCwgU1dULk5PTkUpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiB3aWRnZXRGYWN0b3J5LmNyZWF0ZVRleHQocGFyZW50LCBudWxsLCBTV1QuQk9SREVSIHwgU1dULkZMQVQgfCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlVHJpU3RhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlUcmlTdGF0ZUNoZWNrQm94IGNoZWNrQm94ID0gbmV3IFRyaVN0YXRlQ2hlY2tCb3gocGFyZW50LCB0ZXh0LCB0aGlzKTsKLQkJcmV0dXJuIGNoZWNrQm94LmdldENoZWNrQm94KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0dWFsIGZhY3RvcnkgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBuZXcgd2lkZ2V0cy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhlIHdpZGdldHMgd2l0aCB0aGUgZm9ybSBzdHlsZSAoZmxhdC1zdHlsZSkKLQkgKi8KLQlwdWJsaWMgRm9ybVRvb2xraXQgZ2V0V2lkZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3Rvcnk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvSW50ZWdlckNvbWJvLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0ludGVnZXJDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWMxM2E4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvSW50ZWdlckNvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGlzIGEgcmVwbGFjZW1lbnQgZm9yIGEgU3Bpbm5lci4gIEl0IGlzIGEgY29tYm8gdGhhdCBvbmx5IGFjY2VwdHMgaW50ZWdlcnMuCi0gKiBJdCBhbHNvIGluY2x1ZGVzIGEgRGVmYXVsdCBvcHRpb24gaW4gdGhlIGNvbWJvLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW50ZWdlckNvbWJvPFQgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFBhbmU8VD4KLXsKLQotCS8qKgotCSAqIFRoZSBtYWluIChvbmx5KSB3aWRnZXQgb2YgdGhpcyBwYW5lLgotCSAqLwotCXByaXZhdGUgQ29tYm8gY29tYm9Cb3g7Ci0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGVmYXVsdFZhbHVlSG9sZGVyOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBJbnRlZ2VyQ29tYm8oCi0JCQkJCQlQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCQkJCQkJQ29tcG9zaXRlIHBhcmVudAotCSkgewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBJbnRlZ2VyQ29tYm8oCi0JCQkJCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJCQlDb21wb3NpdGUgcGFyZW50Ci0JKSB7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JcHVibGljIENvbWJvIGdldENvbWJvKCkgewotCQlyZXR1cm4gdGhpcy5jb21ib0JveDsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5kZWZhdWx0VmFsdWVIb2xkZXIgPSBidWlsZERlZmF1bHRTdHJpbmdIb2xkZXIoKTsKLQkJdGhpcy5jb21ib0JveCA9IHRoaXMuYWRkSW50ZWdlckNvbWJvKGNvbnRhaW5lcik7Ci0KLQkJaW50IG1hcmdpbiA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRNYXhpbXVtRGVjb3JhdGlvbldpZHRoKCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUw7Ci0JCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSBtYXJnaW47Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJdGhpcy5jb21ib0JveC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXRoaXMuY29tYm9Cb3guYWRkVmVyaWZ5TGlzdGVuZXIodGhpcy5idWlsZFZlcmlmeUxpc3RlbmVyKCkpOwotCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIodGhpcy5jb21ib0JveCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb21ibyBhZGRJbnRlZ2VyQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCQljb250YWluZXIsCi0JCQkJZ2V0TGFiZWxUZXh0KCksCi0JCQkJYnVpbGREZWZhdWx0TGlzdEhvbGRlcigpLAotCQkJCWJ1aWxkU2VsZWN0ZWRJdGVtU3RyaW5nSG9sZGVyKCksCi0JCQkJZ2V0SGVscElkKCkKLQkJCQkpOwotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIFZlcmlmeUxpc3RlbmVyIGJ1aWxkVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGUpIHsKLQkJCQlJbnRlZ2VyQ29tYm8udGhpcy52ZXJpZnlDb21ib0JveChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy5kZWZhdWx0VmFsdWVIb2xkZXIpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEludGVnZXIgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTm9uZVNlbGVjdGVkOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIudHJhbnNmb3JtKHZhbHVlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm1fKEludGVnZXIgdmFsdWUpIHsKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKEludGVnZXIgZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCWRlZmF1bHRWYWx1ZQotCQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWVIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNlbGVjdGVkSXRlbVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXIsIFN0cmluZz4oYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlID09IG51bGwgPyAKLQkJCQkJCWdldERlZmF1bHRWYWx1ZVN0cmluZygpCi0JCQkJCTogCi0JCQkJCQl2YWx1ZS50b1N0cmluZygpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIHJldmVyc2VUcmFuc2Zvcm1fKFN0cmluZyB2YWx1ZSkgewotCQkJCWludCBpbnRMZW5ndGg7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50TGVuZ3RoID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCQkJfQotCQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkvL2lmIHRoZSBkZWZhdWx0IGlzIHNlbGVjdGVkIGZyb20gdGhlIGNvbWJvLCBzZXQgbGVuZ3RoIHRvIG51bGwKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YoaW50TGVuZ3RoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGFic3RyYWN0IG1ldGhvZHMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRIZWxwSWQoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCk7Ci0KLQkvLyAqKioqKioqKioqIGNvbWJvLWJveCB2ZXJpZnkgbGlzdGVuZXIgY2FsbGJhY2sgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5Q29tYm9Cb3goVmVyaWZ5RXZlbnQgZSkgewotCQlpZiAoZS5jaGFyYWN0ZXIgPT0gJ1xiJykgewotCQkJLy9pZ25vcmUgYmFja3NwYWNlCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGUudGV4dC5lcXVhbHMoIiIpIC8vRGVmYXVsdFZhbHVlSGFuZGxlciBzZXRzIHRoZSB0ZXh0IHRvICIiIC8vJE5PTi1OTFMtMSQKLQkJCQl8fCBlLnRleHQuZXF1YWxzKHRoaXMuZGVmYXVsdFZhbHVlSG9sZGVyLmdldFZhbHVlKCkpKSB7IAotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlJbnRlZ2VyLnBhcnNlSW50KGUudGV4dCk7Ci0JCX0KLQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmI4M2Y4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIGRpYWxvZyB1c2VkIHRvIHJlcXVlc3RzIGEgbmFtZSBmcm9tIHRoZSB1c2VyLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3TmFtZURpYWxvZyBleHRlbmRzIFZhbGlkYXRpbmdEaWFsb2c8TmV3TmFtZVN0YXRlT2JqZWN0PgotewotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgSW1hZ2UgZGVzY3JpcHRpb25JbWFnZTsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvblRpdGxlOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsVGV4dDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OZXdOYW1lRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvblRpdGxlCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uSW1hZ2UKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gbmFtZXMKLQkgKi8KLQlOZXdOYW1lRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLAotCSAgICAgICAgICAgICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotCSAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uVGl0bGUsCi0JICAgICAgICAgICAgICBJbWFnZSBkZXNjcmlwdGlvbkltYWdlLAotCSAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLAotCSAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAotCSAgICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzKQotCXsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlKTsKLQotCQl0aGlzLm5hbWUgICAgICAgICAgICAgPSBuYW1lOwotCQl0aGlzLm5hbWVzICAgICAgICAgICAgPSBuYW1lczsKLQkJdGhpcy5sYWJlbFRleHQgICAgICAgID0gbGFiZWxUZXh0OwotCQl0aGlzLmRlc2NyaXB0aW9uICAgICAgPSBkZXNjcmlwdGlvbjsKLQkJdGhpcy5kZXNjcmlwdGlvbkltYWdlID0gZGVzY3JpcHRpb25JbWFnZTsKLQkJdGhpcy5kZXNjcmlwdGlvblRpdGxlID0gZGVzY3JpcHRpb25UaXRsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGlhbG9nUGFuZTxOZXdOYW1lU3RhdGVPYmplY3Q+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBOZXdOYW1lRGlhbG9nUGFuZShjb250YWluZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOZXdOYW1lU3RhdGVPYmplY3QgYnVpbGRTdGF0ZU9iamVjdCgpIHsKLQkJcmV0dXJuIG5ldyBOZXdOYW1lU3RhdGVPYmplY3QobmFtZSwgbmFtZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0KLQkJTmV3TmFtZURpYWxvZ1BhbmUgcGFuZSA9IChOZXdOYW1lRGlhbG9nUGFuZSkgZ2V0UGFuZSgpOwotCQlwYW5lLnNlbGVjdEFsbCgpOwotCi0JCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJbWFnZSBnZXREZXNjcmlwdGlvbkltYWdlKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb25JbWFnZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvblRpdGxlKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb25UaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQsIHdoaWNoIGlzIHRoZSBuZXcgbmFtZSB0aGUgdXNlciBlbnRlcmVkLgotCSAqCi0JICogQHJldHVybiBUaGUgbmFtZSB0aGUgdXNlciBlbnRlcmVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldE5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIE5ld05hbWVEaWFsb2dQYW5lIGV4dGVuZHMgRGlhbG9nUGFuZTxOZXdOYW1lU3RhdGVPYmplY3Q+IHsKLQotCQlwcml2YXRlIFRleHQgdGV4dDsKLQotCQlOZXdOYW1lRGlhbG9nUGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihOZXdOYW1lRGlhbG9nLnRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBwYXJlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE5ld05hbWVTdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIE5ld05hbWVTdGF0ZU9iamVjdC5OQU1FX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCQl0ZXh0ID0gYWRkTGFiZWxlZFRleHQoCi0JCQkJY29udGFpbmVyLAotCQkJCWxhYmVsVGV4dCwKLQkJCQlidWlsZE5hbWVIb2xkZXIoKQotCQkJKTsKLQkJfQotCi0JCXZvaWQgc2VsZWN0QWxsKCkgewotCQkJdGV4dC5zZWxlY3RBbGwoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZURpYWxvZ0J1aWxkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZURpYWxvZ0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0MDI0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVEaWFsb2dCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhpcyBidWlsZGVyIGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSBhIGZ1bGx5IGluaXRpYWxpemVkCi0gKiA8Y29kZT5OZXdOYW1lRGlhbG9nPC9jb2RlPiBvbmNlIGFsbCB0aGUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2V0LgotICoKLSAqIEBzZWUgTmV3TmFtZURpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBOZXdOYW1lRGlhbG9nQnVpbGRlciB7Ci0KLQkvKioKLQkgKiBUaGUgbWVzc2FnZSB0byBzaG93IGluIHRoZSBkZXNjcmlwdGlvbiBhcmVhLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogVGhlIGltYWdlIG9mIHRoZSBkZXNjcmlwdGlvbiBhcmVhLgotCSAqLwotCXByaXZhdGUgSW1hZ2UgZGVzY3JpcHRpb25JbWFnZTsKLQotCS8qKgotCSAqIFRoZSB0aXRsZSB0byBzaG93IGluIHRoZSBkZXNjcmlwdGlvbiBhcmVhLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uVGl0bGU7Ci0KLQkvKioKLQkgKiBUaGUgdGl0bGUgb2YgdGhlIG5ldyBuYW1lIGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkaWFsb2dUaXRsZTsKLQotCS8qKgotCSAqIFRoZSB0ZXh0IGZpZWxkJ3MgbGFiZWwuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWxUZXh0OwotCi0JLyoqCi0JICogVGhlIGluaXRpYWwgaW5wdXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaW5pdGlhbCB2YWx1ZSBjYW4gYmUKLQkgKiBzcGVjaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIG5hbWVzIHRoYXQgY2FuJ3QgYmUgdXNlZCBvciBhbiBlbXB0eSBjb2xsZWN0aW9uIGlmIG5vbmUKLQkgKiBhcmUgYXZhaWxhYmxlLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzOwotCi0JLyoqCi0JICogVGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgbmV3IG5hbWUgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgU2hlbGwgcGFyZW50U2hlbGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5ld05hbWVEaWFsb2dCdWlsZGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBUaGUgcGFyZW50IHNoZWxsIG9mIHRoZSBuZXcgbmFtZSBkaWFsb2cKLQkgKi8KLQlwdWJsaWMgTmV3TmFtZURpYWxvZ0J1aWxkZXIoU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZShwYXJlbnRTaGVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJlcXVlc3QgYSBuZXcgbmFtZSBmcm9tIHRoZSB1c2VyLgotCSAqCi0JICogQHJldHVybiBUaGUgaW5pdGlhbGl6ZWQgZGlhbG9nCi0JICovCi0JcHVibGljIE5ld05hbWVEaWFsb2cgYnVpbGREaWFsb2coKSB7Ci0JCXJldHVybiBuZXcgTmV3TmFtZURpYWxvZygKLQkJCXBhcmVudFNoZWxsLAotCQkJZGlhbG9nVGl0bGUsCi0JCQlkZXNjcmlwdGlvblRpdGxlLAotCQkJZGVzY3JpcHRpb25JbWFnZSwKLQkJCWRlc2NyaXB0aW9uLAotCQkJbGFiZWxUZXh0LAotCQkJbmFtZSwKLQkJCW5hbWVzCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBidWlsZGVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudFNoZWxsIFRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIG5ldyBuYW1lIGRpYWxvZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoU2hlbGwgcGFyZW50U2hlbGwpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKHBhcmVudFNoZWxsLCAiVGhlIHBhcmVudCBzaGVsbCBjYW5ub3QgYmUgbnVsbCIpOwotCi0JCXRoaXMucGFyZW50U2hlbGwgPSBwYXJlbnRTaGVsbDsKLQkJdGhpcy5uYW1lcyAgICAgICA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlc2NyaXB0aW9uIHRvIGJlIHNob3duIGluIHRoZSBkZXNjcmlwdGlvbiBhcmVhIHVuZGVyIHRoZSB0aXRsZS4KLQkgKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgbWVzc2FnZSB0byBzaG93IGluIHRoZSBkZXNjcmlwdGlvbiBhcmVhCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbWFnZSB0byBiZSBzaG93biB0byB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgZGVzY3JpcHRpb24gYXJlYS4KLQkgKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbkltYWdlIFRoZSBpbWFnZSBvZiB0aGUgZGVzY3JpcHRpb24gYXJlYQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uSW1hZ2UoSW1hZ2UgZGVzY3JpcHRpb25JbWFnZSkgewotCQl0aGlzLmRlc2NyaXB0aW9uSW1hZ2UgPSBkZXNjcmlwdGlvbkltYWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRpdGxlIHRvIGJlIHNob3duIGluIHRoZSBkZXNjcmlwdGlvbiBhcmVhLgotCSAqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uVGl0bGUgVGhlIHRpdGxlIHRvIHNob3cgaW4gdGhlIGRlc2NyaXB0aW9uIGFyZWEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvblRpdGxlKFN0cmluZyBkZXNjcmlwdGlvblRpdGxlKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb25UaXRsZSA9IGRlc2NyaXB0aW9uVGl0bGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlhbG9nJ3MgdGl0bGUuCi0JICoKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUgVGhlIHRpdGxlIG9mIHRoZSBuZXcgbmFtZSBkaWFsb2cKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaWFsb2dUaXRsZShTdHJpbmcgZGlhbG9nVGl0bGUpIHsKLQkJdGhpcy5kaWFsb2dUaXRsZSA9IGRpYWxvZ1RpdGxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4aXN0aW5nIG5hbWVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSB0ZXh0IGZpZWxkJ3MKLQkgKiBpbnB1dCBhbmQgcHJldmVudCB0aGUgdXNlciBmcm9tIHVzaW5nIGl0LgotCSAqCi0JICogQHBhcmFtIG5hbWVzIFRoZSBjb2xsZWN0aW9uIG9mIG5hbWVzIHRoYXQgY2FuJ3QgYmUgdXNlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4aXN0aW5nTmFtZXMoSXRlcmF0b3I8U3RyaW5nPiBuYW1lcykgewotCQl0aGlzLm5hbWVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obmFtZXMpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRleHQgdG8gbGFiZWwgdGhlIHRleHQgZmllbGQuCi0JICoKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGZpZWxkJ3MgbGFiZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsVGV4dCkgewotCQl0aGlzLmxhYmVsVGV4dCA9IGxhYmVsVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbml0aWFsIG5hbWUgaWYgb25lIGV4aXN0cy4gSXQgaXMgdmFsaWQgdG8gbGVhdmUgdGhpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gdGhlIHVzZXIgaGFzIHRvIGVudGVyIHNvbWV0aGluZy4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIFRoZSBpbml0aWFsIGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZVN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVTdGF0ZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODI1MjU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZVN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5BYnN0cmFjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuUHJvYmxlbTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBzdGF0ZSBvYmplY3QgdXNlZCBieSB0aGUgPGNvZGU+TmV3TmFtZURpYWxvZzwvY29kZT4sIHdoaWNoIHN0b3JlcwotICogdGhlIGN1cnJlbnQgbmFtZSBhbmQgdmFsaWRhdGVzIGl0IHdoZW4gaXQgaXMgbW9kaWZpZWQuCi0gKgotICogQHNlZSBOZXdOYW1lRGlhbG9nCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotZmluYWwgY2xhc3MgTmV3TmFtZVN0YXRlT2JqZWN0IGV4dGVuZHMgQWJzdHJhY3ROb2RlCi17Ci0JLyoqCi0JICogVGhlIGluaXRpYWwgaW5wdXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaW5pdGlhbCB2YWx1ZSBjYW4gYmUKLQkgKiBzcGVjaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIG5hbWVzIHRoYXQgY2FuJ3QgYmUgdXNlZCBvciBhbiBlbXB0eSBjb2xsZWN0aW9uIGlmIG5vbmUKLQkgKiBhcmUgYXZhaWxhYmxlLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzOwotCi0JLyoqCi0JICogVGhlIDxjb2RlPlZhbGlkYXRvcjwvY29kZT4gdXNlZCB0byB2YWxpZGF0ZSB0aGlzIHN0YXRlIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgbmFtZSBwcm9wZXJ0eS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5ld05hbWVTdGF0ZU9iamVjdDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBUaGUgaW5pdGlhbCBpbnB1dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpbml0aWFsIHZhbHVlIGNhbgotCSAqIGJlIHNwZWNpZmllZAotCSAqIEBwYXJhbSBuYW1lcyBUaGUgY29sbGVjdGlvbiBvZiBuYW1lcyB0aGF0IGNhbid0IGJlIHVzZWQgb3IgYW4gZW1wdHkKLQkgKiBjb2xsZWN0aW9uIGlmIG5vbmUgYXJlIGF2YWlsYWJsZQotCSAqLwotCU5ld05hbWVTdGF0ZU9iamVjdChTdHJpbmcgbmFtZSwgQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzKSB7Ci0JCXN1cGVyKG51bGwpOwotCi0JCXRoaXMubmFtZSAgPSBuYW1lOwotCQl0aGlzLm5hbWVzID0gbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBuYW1lIHByb3BlcnR5LgotCSAqCi0JICogQHBhcmFtIGN1cnJlbnRQcm9ibGVtcyBUaGUgbGlzdCB0byB3aGljaCA8Y29kZT5Qcm9ibGVtPC9jb2RlPnMgY2FuIGJlCi0JICogYWRkZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTmFtZVByb2JsZW1zKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0KLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkobmFtZSkpIHsKLQkJCWN1cnJlbnRQcm9ibGVtcy5hZGQoYnVpbGRQcm9ibGVtKEpwdFVpRGV0YWlsc01lc3NhZ2VzLk5ld05hbWVTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkKSk7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZXMuY29udGFpbnMobmFtZS50cmltKCkpKSB7Ci0JCQljdXJyZW50UHJvYmxlbXMuYWRkKGJ1aWxkUHJvYmxlbShKcHRVaURldGFpbHNNZXNzYWdlcy5OZXdOYW1lU3RhdGVPYmplY3RfbmFtZUFscmVhZHlFeGlzdHMpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpCi0JewotCQlzdXBlci5hZGRQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JCWFkZE5hbWVQcm9ibGVtcyhjdXJyZW50UHJvYmxlbXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNoZWNrUGFyZW50KE5vZGUgcGFyZW50Tm9kZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBuYW1lIHN0b3JlZCBpbiB0aGlzIHN0YXRlIG9iamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCVN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IG5hbWUgc3RvcmVkIGluIHRoaXMgc3RhdGUgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogY2xlYXIgaXQuCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvTnVsbFBvc3RFeGVjdXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvTnVsbFBvc3RFeGVjdXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1ZWRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL051bGxQb3N0RXhlY3V0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLQotLyoqCi0gKiBBIDxjb2RlPm51bGw8L2NvZGU+IGluc3RhbmNlIG9mIDxjb2RlPlBvc3RFeGVjdXRpb248L2NvZGU+LgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFBvc3RFeGVjdXRpb24gaW1wbGVtZW50cyBQb3N0RXhlY3V0aW9uPERpYWxvZz4gewotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPk51bGxQb3N0RXhlY3V0aW9uPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBQb3N0RXhlY3V0aW9uPERpYWxvZz4gSU5TVEFOQ0U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk51bGxQb3N0RXhlY3V0aW9uPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIE51bGxQb3N0RXhlY3V0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPk51bGxQb3N0RXhlY3V0aW9uPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSA8VD4gVGhlIGRpYWxvZyB3aGVyZSB0aGlzIDxjb2RlPlBvc3RFeGVjdXRpb248L2NvZGU+IHdpbGwgYmUgdXNlZAotCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSB3aXRoIHRoZSBwcm9wZXIgdHlwZQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIDxUIGV4dGVuZHMgRGlhbG9nPiBQb3N0RXhlY3V0aW9uPFQ+IGluc3RhbmNlKCkgewotCi0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBOdWxsUG9zdEV4ZWN1dGlvbigpOwotCQl9Ci0KLQkJcmV0dXJuIChQb3N0RXhlY3V0aW9uPFQ+KSBJTlNUQU5DRTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKERpYWxvZyBkaWFsb2cpIHsKLQkJLy8gTm90aGluZyB0byBkbwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvUGFja2FnZUNob29zZXJQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1BhY2thZ2VDaG9vc2VyUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjY5NjZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvUGFja2FnZUNob29zZXJQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuSmF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5GaWVsZERlY29yYXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIFRoaXMgY2hvb3NlciBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgcGFja2FnZSB3aGVuIGJyb3dzaW5nIGFuZCBpdCBhZGRzCi0gKiBjb2RlIGNvbXBsZXRpb24gc3VwcG9ydCB0byB0aGUgdGV4dCBmaWVsZCwgd2hpY2ggaXMgdGhlIG1haW4gY29tcG9uZW50LgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogfCBMYWJlbDogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJyb3dzZS4uLiB8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFja2FnZUNob29zZXJQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBDaG9vc2VyUGFuZTxUPgotewotCS8qKgotCSAqIFRoZSBjb2RlIGNvbXBsZXRpb24gbWFuYWdlci4KLQkgKi8KLQlwcml2YXRlIEphdmFQYWNrYWdlQ29tcGxldGlvblByb2Nlc3NvciBqYXZhUGFja2FnZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc3ViamVjdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYWNrYWdlQ2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBQYWNrYWdlQ2hvb3NlclBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFja2FnZUNob29zZXJQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBQYWNrYWdlQ2hvb3NlclBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCi0JCS8vIFRPRE8gYnVnIDE1NjE4NSAtIHdoZW4gdGhpcyBpcyBmaXhlZCB0aGVyZSBzaG91bGQgYmUgYXBpIGZvciB0aGlzCi0JCXRoaXMuamF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yID0gbmV3IEphdmFQYWNrYWdlQ29tcGxldGlvblByb2Nlc3NvcigKLQkJCW5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfUk9PVCkKLQkJKTsKLQkJdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMucGFja2FnZUNob29zZXJTdWJqZWN0Q2hhbmdlZChnZXRTdWJqZWN0KCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlQYWNrYWdlQ2hvb3NlclBhbmUudGhpcy5wYWNrYWdlQ2hvb3NlclN1YmplY3RDaGFuZ2VkKChUKSBlLmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhY2thZ2VDaG9vc2VyU3ViamVjdENoYW5nZWQoVCBuZXdTdWJqZWN0KSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBudWxsOwotCQlpZiAobmV3U3ViamVjdCAhPSBudWxsKSB7Ci0JCQlyb290ID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOwotCQl9Ci0JCXRoaXMuamF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yLnNldFBhY2thZ2VGcmFnbWVudFJvb3Qocm9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIFJ1bm5hYmxlIGJ1aWxkQnJvd3NlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXByb21wdFBhY2thZ2UoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBhZGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbXBvc2l0ZSBzdWJQYW5lID0gYWRkU3ViUGFuZShjb250YWluZXIpOwotCi0JCVRleHQgdGV4dCA9IGFkZFRleHQoc3ViUGFuZSwgYnVpbGRUZXh0SG9sZGVyKCkpOwotCi0JCUltYWdlIGltYWdlID0gRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuZ2V0RGVmYXVsdCgpLmdldEZpZWxkRGVjb3JhdGlvbihGaWVsZERlY29yYXRpb25SZWdpc3RyeS5ERUNfQ09OVEVOVF9QUk9QT1NBTCkuZ2V0SW1hZ2UoKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSBpbWFnZS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUNvbnRyb2xDb250ZW50QXNzaXN0SGVscGVyLmNyZWF0ZVRleHRDb250ZW50QXNzaXN0YW50KAotCQkJdGV4dCwKLQkJCWphdmFQYWNrYWdlQ29tcGxldGlvblByb2Nlc3NvcgotCQkpOwotCi0JCXJldHVybiBzdWJQYW5lOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHZhbHVlIGhvbGRlciBvZiB0aGUgc3ViamVjdCdzIHByb3BlcnR5LgotCSAqCi0JICogQHJldHVybiBUaGUgaG9sZGVyIG9mIHRoZSBwYWNrYWdlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKTsKLQotCS8qKgotCSAqIFByb21wdHMgdGhlIHVzZXIgdGhlIE9wZW4gUGFja2FnZSBkaWFsb2cuCi0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciB0aGUgc2VsZWN0ZWQgcGFja2FnZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdXNlcgotCSAqIGNhbmNlbGxlZCB0aGUgZGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnQgY2hvb3NlUGFja2FnZSgpIHsKLQotCQlTZWxlY3Rpb25EaWFsb2cgc2VsZWN0aW9uRGlhbG9nOwotCi0JCXRyeSB7Ci0JCQlzZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlUGFja2FnZURpYWxvZygKLQkJCQlnZXRTaGVsbCgpLAotCQkJCWdldFBhY2thZ2VGcmFnbWVudFJvb3QoKQotCQkJKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJc2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKEpwdFVpTWVzc2FnZXMuUGFja2FnZUNob29zZXJQYW5lX2RpYWxvZ1RpdGxlKTsKLQkJc2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UoSnB0VWlNZXNzYWdlcy5QYWNrYWdlQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZSk7Ci0KLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrID0gZ2V0UGFja2FnZUZyYWdtZW50KCk7Ci0KLQkJaWYgKHBhY2sgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uRGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb25zKG5ldyBPYmplY3RbXSB7IHBhY2sgfSk7Ci0JCX0KLQotCQlpZiAoc2VsZWN0aW9uRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudCkgc2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBuYW1lIGZyb20gaXRzIHN1YmplY3QuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwYWNrYWdlIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBkZWZpbmVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpOwotCi0JLyoqCi0JICogVGhlIGJyb3dzZSBidXR0b24gd2FzIGNsaWNrZWQsIGl0cyBhY3Rpb24gaW52b2tlcyB0aGlzIGFjdGlvbiB3aGljaCBzaG91bGQKLQkgKiBwcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcGFja2FnZSBhbmQgc2V0IGl0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb21wdFBhY2thZ2UoKSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gY2hvb3NlUGFja2FnZSgpOwotCi0JCWlmIChwYWNrYWdlRnJhZ21lbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JCQl0aGlzLnNldFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRQYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpOwotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudCgpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZU5hbWUoKTsKLQotCQlpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpLmdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCXJldHVybiBKRFRUb29scy5nZXRDb2RlQ29tcGxldGlvbkNvbnRleHRSb290KGdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1BhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlZDljNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1BhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5GaWVsZERlY29yYXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkNvbWJvTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuRGF0ZVRpbWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5TcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sQWxpZ25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRDb250cm9sVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Ob25OdWxsQm9vbGVhblRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiBhIHBhbmUgd2hpY2ggaG9sZHMgb250byBhIDxjb2RlPlByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4KLSAqIHRoYXQgY29udGFpbnMgdGhlIHN1YmplY3Qgb2YgdGhpcyBwYW5lLgotICogPHA+Ci0gKiBJdCBhbHNvIGNvbnRhaW5zIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGJ1aWxkaW5nIGJ1dHRvbnMsIGxhYmVscywgY2hlY2sKLSAqIGJveGVzLCBhbmQgcmFkaW8gYnV0dG9ucywgZXRjLgotICogPHA+Ci0gKiBJdCBpcyBwb3NzaWJsZSB0byBlYXNpbHkgbGlzdGVuIHRvIGFueSBwcm9wZXJ0eSBjaGFuZ2VzIGNvbWluZyBmcm9tIHRoZQotICogc3ViamVjdCwge0BsaW5rICNhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb24pfSBpcyBzcGVjaWZ5IHdoaWNoIHByb3BlcnRpZXMKLSAqIGFyZSBvZiBpbnRlcmVzdCBhbmQge0BsaW5rICNwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nKX0gaXMgdXNlZCB0byBub3RpZnkgdGhlCi0gKiBwYW5lIHdoZW4gdGhlIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotICoKLSAqIEBzZWUgRm9ybVBhbmUKLSAqIEBzZWUgRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYW5lPFQgZXh0ZW5kcyBNb2RlbD4KLXsKLQkvKioKLQkgKiBUaGUgbGlzdGVuZXIgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzdWJqZWN0IGluIG9yZGVyIHRvIGJlIG5vdGlmaWVkIHdoZW4gYQotCSAqIHByb3BlcnR5IGhhcyBjaGFuZ2VkLCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIGRldGVybWluZWQgYnkKLQkgKiB7QGxpbmsgI3Byb3BlcnR5TmFtZXMoKX0uCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGFzcGVjdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIGNvbnRhaW5lciBvZiB0aGlzIGNvbXBvc2l0ZS4KLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250YWluZXI7Ci0KLQkvKioKLQkgKiBUaGUgYWxpZ25lciByZXNwb25zaWJsZSB0byBhbGlnbiB0aGUgbGVmdCBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2xBbGlnbmVyIGxlZnRDb250cm9sQWxpZ25lcjsKLQotCS8qKgotCSAqIEZsYWcgdXNlZCB0byBzdG9wIHRoZSBjaXJjdWxhciBwb3B1bGF0aW9uIG9mIHdpZGdldHMuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHBvcHVsYXRpbmc7Ci0KLQkvKioKLQkgKiBUaGUgYWxpZ25lciByZXNwb25zaWJsZSB0byBhbGlnbiB0aGUgbGVmdCBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2xBbGlnbmVyIHJpZ2h0Q29udHJvbEFsaWduZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3ViamVjdCBob2xkZXIgaW4gb3JkZXIgdG8KLQkgKiBhdXRvbWF0aWNhbGx5IHJlcG9wdWxhdGUgdGhpcyBwYW5lIHdpdGggdGhlIG5ldyBzdWJqZWN0LgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzdWJqZWN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBvZiB0aGlzIHBhbmUuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlcjsKLQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIHJlZ2lzdGVyZWQgc3ViLXBhbmVzIHdpbGwgYmUgYXV0b21hdGljYWxseSBub3RpZmllZAotCSAqIHdoZW4gbGlzdGVuZXJzIG5lZWQgdG8gYmUgZW5nYWdlZCBvciBkaXNlbmdhZ2VkIG9yIHdoZW4gdG8gcG9wdWxhdGUgaXRzCi0JICogd2lkZ2V0cy4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248UGFuZTw/Pj4gc3ViUGFuZXM7Ci0KLQkvKioKLQkgKiBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzLgotCSAqLwotCXByaXZhdGUgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5OwotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbDwvY29kZT5zIHRoYXQgYXJlIGRpc3BsYXllZCBpbiB0aGlzIHBhbmUsCi0JICogd2hpY2ggd2lsbCBoYXZlIHRoZWlyIGVuYWJsZW1lbnQgc3RhdGUgdXBkYXRlZCB3aGVuCi0JICoge0BsaW5rICNlbmFibGVXaWRnZXRzKGJvb2xlYW4pfSBpcyBjYWxsZWQuCi0JICovCi0JcHJpdmF0ZSBBcnJheUxpc3Q8Q29udHJvbD4gbWFuYWdlZFdpZGdldHM7Ci0JCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+UGFuZTwvY29kZT5zIHRoYXQgYXJlIGRpc3BsYXllZCBpbiB0aGlzIHBhbmUsCi0JICogd2hpY2ggd2lsbCBoYXZlIHRoZWlyIGVuYWJsZW1lbnQgc3RhdGUgdXBkYXRlZCB3aGVuCi0JICoge0BsaW5rICNlbmFibGVXaWRnZXRzKGJvb2xlYW4pfSBpcyBjYWxsZWQuCi0JICovCi0JcHJpdmF0ZSBBcnJheUxpc3Q8UGFuZTw/Pj4gbWFuYWdlZFN1YlBhbmVzOwotCQotCS8qKgotCSAqIFRoaXMgZW5hYmxlZCBtb2RlbCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBwYW5lJ3MgYmFzZSBlbmFibGVtZW50IHN0YXRlLgotCSAqIElmIEFQSSBpcyBjYWxsZWQgdG8gc2V0IHRoZSBwYW5lIGVuYWJsZWQsIHRoaXMgbW9kZWwgZ2V0cyB1cGRhdGVkLiAgSWYgdGhlIHBhbmUgaXMgdGhlcmVieQotCSAqIGZ1bGx5IGVuYWJsZWQgKGNvbnRyb2xsZXIgZW5hYmxlZCBtb2RlbCBpcyBhbHNvIGluIGFncmVlbWVudCkgdGhlIHBhbmUncyB3aWRnZXRzIGFyZSBzZXQKLQkgKiBlbmFibGVkLgotCSAqIEBzZWUgI2dldENvbWJpbmVkRW5hYmxlZE1vZGVsKCkKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJhc2VFbmFibGVkTW9kZWwgCi0JCQk9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKTsKLQkKLQkvKioKLQkgKiBUaGlzIGVuYWJsZWQgbW9kZWwgaXMgdXNlZCB0byBkZWZpbmUgdGhlIHBhbmUncyBlbmFibGVtZW50IGFzIGNvbnRyb2xsZWQgYnkgb3RoZXIgd2lkZ2V0cywKLQkgKiB0ZXN0cywgZXRjLiAoZm9yIGV4YW1wbGUgYSByYWRpbyBidXR0b24pCi0JICogSWYgdGhpcyBtb2RlbCBpcyBjaGFuZ2VkLCBhbmQgdGhlIHBhbmUgaXMgdGhlcmVieSBmdWxseSBlbmFibGVkIChiYXNlIGVuYWJsZWQgbW9kZWwgaXMgYWxzbyAKLQkgKiBpbiBhZ3JlZW1lbnQpIHRoZSBwYW5lJ3Mgd2lkZ2V0cyBhcmUgc2V0IGVuYWJsZWQuCi0JICogQHNlZSAjZ2V0Q29tYmluZWRFbmFibGVkTW9kZWwoKQotCSAqLwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGNvbnRyb2xsZXJFbmFibGVkTW9kZWw7Ci0JCi0JLyoqCi0JICogVGhlICJhbmQiIGNvbWJpbmF0aW9uIG9mIHtAbGluayAjYmFzZUVuYWJsZWRNb2RlbH0gYW5kIHtAbGluayAjY29udHJvbGxlckVuYWJsZWRNb2RlbH0KLQkgKi8KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBjb21iaW5lZEVuYWJsZWRNb2RlbDsKLQkKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY29tYmluZWRFbmFibGVkTW9kZWxMaXN0ZW5lcjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmU8L2NvZGU+LgotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSBQYW5lKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgUGFuZSgKLQkJCVBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQl0aGlzKHBhcmVudFBhbmUsIHBhcmVudCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgcGFuZTsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBQYW5lKAotCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQkJCi0JCXRoaXMoCi0JCQlwYXJlbnRQYW5lLAotCQkJcGFyZW50UGFuZS5nZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlwYXJlbnQsCi0JCQlhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBwYW5lOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFBhbmUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywKLQkgICAgICAgIGJvb2xlYW4gcGFyZW50TWFuYWdlUGFuZSkgewotCQkKLQkJdGhpcygKLQkJCXBhcmVudFBhbmUsCi0JCQlwYXJlbnRQYW5lLmdldFN1YmplY3RIb2xkZXIoKSwKLQkJCXBhcmVudCwKLQkJCWF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsCi0JCQlwYXJlbnRNYW5hZ2VQYW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgUGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXRoaXMocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCB0cnVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGVuYWJsZWRNb2RlbCkgewotCQkKLQkJdGhpcyhwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHRydWUsIGVuYWJsZWRNb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgcGFuZTsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCWJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cykgewotCQkKLQkJdGhpcyhwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsIHRydWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZW5hYmxlZE1vZGVsKSB7Ci0JCQotCQl0aGlzKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywgdHJ1ZSwgZW5hYmxlZE1vZGVsKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgcGFuZTsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKiBAcGFyYW0gcGFyZW50TWFuYWdlUGFuZSA8Y29kZT50cnVlPC9jb2RlPiB0byBoYXZlIHRoZSBwYXJlbnQgcGFuZSBtYW5hZ2UKLQkgKiB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGlzIHBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCWJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywgCi0JCQlib29sZWFuIHBhcmVudE1hbmFnZVBhbmUpIHsKLQkJCi0JCXRoaXMoc3ViamVjdEhvbGRlciwgcGFyZW50LCBwYXJlbnRQYW5lLmdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShwYXJlbnRQYW5lLCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzLCBwYXJlbnRNYW5hZ2VQYW5lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzLCAKLQkJCWJvb2xlYW4gcGFyZW50TWFuYWdlUGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQkJCi0JCXRoaXMoc3ViamVjdEhvbGRlciwgcGFyZW50LCBwYXJlbnRQYW5lLmdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShwYXJlbnRQYW5lLCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzLCBwYXJlbnRNYW5hZ2VQYW5lKTsKLQkJdGhpcy5pbml0aWFsaXplRW5hYmxlZE1vZGVsKGVuYWJsZWRNb2RlbCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFBhbmUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcigpOwotCQl0aGlzLmluaXRpYWxpemUoc3ViamVjdEhvbGRlciwgd2lkZ2V0RmFjdG9yeSk7Ci0JCXRoaXMuY29udGFpbmVyID0gdGhpcy5hZGRDb250YWluZXIocGFyZW50KTsKLQkJdGhpcy5pbml0aWFsaXplTGF5b3V0KHRoaXMuY29udGFpbmVyKTsKLQkJdGhpcy5lbmdhZ2VTdWJqZWN0SG9sZGVyKCk7Ci0JCXRoaXMuZW5nYWdlTGlzdGVuZXJzKGdldFN1YmplY3QoKSk7Ci0JCXRoaXMucG9wdWxhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCUFzc2VydC5pc05vdE51bGwoc3ViamVjdEhvbGRlciwgIlRoZSBzdWJqZWN0IGhvbGRlciBjYW5ub3QgYmUgbnVsbCIpOwotCi0JCXRoaXMuc3ViamVjdEhvbGRlciAgICAgICAgID0gKFByb3BlcnR5VmFsdWVNb2RlbDxUPikgc3ViamVjdEhvbGRlcjsKLQkJdGhpcy53aWRnZXRGYWN0b3J5ICAgICAgICAgPSB3aWRnZXRGYWN0b3J5OwotCQl0aGlzLnN1YlBhbmVzICAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8UGFuZTw/Pj4oKTsKLQkJdGhpcy5tYW5hZ2VkV2lkZ2V0cyAgICAgICAgPSBuZXcgQXJyYXlMaXN0PENvbnRyb2w+KCk7Ci0JCXRoaXMubWFuYWdlZFN1YlBhbmVzICAgICAgID0gbmV3IEFycmF5TGlzdDxQYW5lPD8+PigpOwotCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lciAgICA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCQl0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIgICA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCQl0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VMaXN0ZW5lciAgPSB0aGlzLmJ1aWxkQXNwZWN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCi0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGlzIHBhbmUgd2l0aCB0aGUgcGFyZW50IHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUKLQkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCi0JICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IHBhbmU7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCi0JICogQHBhcmFtIHBhcmVudE1hbmFnZVBhbmUgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaGF2ZSB0aGUgcGFyZW50IHBhbmUgbWFuYWdlCi0JICogdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhpcyBwYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgSW5pdGlhbGl6YXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCWJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywKLQkgICAgICAgIGJvb2xlYW4gcGFyZW50TWFuYWdlUGFuZSkgewotCQkKLQkJLy8gUmVnaXN0ZXIgdGhpcyBwYW5lIHdpdGggdGhlIHBhcmVudCBwYW5lLCBpdCB3aWxsIGNhbGwgdGhlIG1ldGhvZHMKLQkJLy8gYXV0b21hdGljYWxseSAoZW5nYWdlTGlzdGVuZXJzKCksIGRpc2VuZ2FnZUxpc3RlbmVycygpLCBwb3B1bGF0ZSgpLAotCQkvLyBkaXNwb3NlKCksIGV0YykKLQkJcGFyZW50UGFuZS5yZWdpc3RlclN1YlBhbmUodGhpcyk7Ci0JCQotCQlpZiAocGFyZW50TWFuYWdlUGFuZSkgewotCQkJcGFyZW50UGFuZS5tYW5hZ2VTdWJQYW5lKHRoaXMpOwotCQl9Ci0JCQotCQkvLyBBbGlnbiB0aGUgbGVmdCBhbmQgcmlnaHQgY29udHJvbHMgd2l0aCB0aGUgY29udHJvbHMgZnJvbSB0aGUgcGFyZW50Ci0JCS8vIHBhbmUKLQkJaWYgKGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQkJCXBhcmVudFBhbmUuYWRkQWxpZ25MZWZ0KHRoaXMpOwotCQkJcGFyZW50UGFuZS5hZGRBbGlnblJpZ2h0KHRoaXMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRW5hYmxlZE1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQkJdGhpcy5jb250cm9sbGVyRW5hYmxlZE1vZGVsID0gZW5hYmxlZE1vZGVsOwotCQl0aGlzLmNvbWJpbmVkRW5hYmxlZE1vZGVsID0gCi0JCQkJQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbC5hbmQodGhpcy5iYXNlRW5hYmxlZE1vZGVsLCB0aGlzLmNvbnRyb2xsZXJFbmFibGVkTW9kZWwpOwotCQl0aGlzLmNvbWJpbmVkRW5hYmxlZE1vZGVsTGlzdGVuZXIgPSBidWlsZENvbWJpbmVkRW5hYmxlZE1vZGVsTGlzdGVuZXIoKTsKLQkJdGhpcy5jb21iaW5lZEVuYWJsZWRNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jb21iaW5lZEVuYWJsZWRNb2RlbExpc3RlbmVyKTsKLQkJZW5hYmxlV2lkZ2V0c18oZ2V0Q29tYmluZWRFbmFibGVtZW50KCkpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDb21iaW5lZEVuYWJsZWRNb2RlbExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKGJ1aWxkQ29udHJvbGxlckVuYWJsZWRNb2RlbExpc3RlbmVyXygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29udHJvbGxlckVuYWJsZWRNb2RlbExpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUGFuZS50aGlzLmNvbnRyb2xsZXJFbmFibGVtZW50Q2hhbmdlZCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpOwotCi0JcHJpdmF0ZSB2b2lkIG1hbmFnZVdpZGdldChDb250cm9sIGNvbnRyb2wpIHsKLQkJaWYgKHRoaXMubWFuYWdlZFdpZGdldHMuY29udGFpbnMoY29udHJvbCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm1hbmFnZWRXaWRnZXRzLmFkZChjb250cm9sKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG1hbmFnZVN1YlBhbmUoUGFuZTw/PiBzdWJQYW5lKSB7Ci0JCWlmICh0aGlzLm1hbmFnZWRTdWJQYW5lcy5jb250YWlucyhzdWJQYW5lKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubWFuYWdlZFN1YlBhbmVzLmFkZChzdWJQYW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBwYW5lJ3Mgd2lkZ2V0cyAodGhvc2UgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgd2l0aCBpdHMKLQkgKiBsZWZ0IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPikgdG8gdGhpcyBwYW5lJ3MgbGVmdAotCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBzbyB0aGF0IHRoZWlyIHdpZHRoIGNhbiBiZSBhZGp1c3RlZCB0byBoYXZlCi0JICogdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3Qgd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgY29udGFpbmluZyB0aGUgd2lkZ2V0cyB0byBhZGQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRBbGlnbkxlZnQoUGFuZTw/PiBjb250YWluZXIpIHsKLQkJdGhpcy5sZWZ0Q29udHJvbEFsaWduZXIuYWRkKGNvbnRhaW5lci5sZWZ0Q29udHJvbEFsaWduZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbnRyb2wgdG8gdGhlIGNvbGxlY3Rpb24gb2Ygd2lkZ2V0cyB0aGF0IGhhdmUgdGhlaXIgd2lkdGgKLQkgKiBhZGp1c3Qgd2l0aCB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB3aWRnZXQuIFRoZSBsZWZ0IGFsaWdubWVudCBpcyB1c3VhbGx5Ci0JICogdXNlZCBmb3IgbGFiZWxzLgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgdG8gYWRkCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkQWxpZ25MZWZ0KENvbnRyb2wgY29udHJvbCkgewotCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lci5hZGQoY29udHJvbCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gcGFuZSdzIHdpZGdldHMgKHRob3NlIHRoYXQgd2VyZSByZWdpc3RlcmVkIHdpdGggaXRzCi0JICogcmlnaHQgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+KSB0byB0aGlzIHBhbmUncyByaWdodAotCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBzbyB0aGF0IHRoZWlyIHdpZHRoIGNhbiBiZSBhZGp1c3RlZCB0byBoYXZlCi0JICogdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3Qgd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgY29udGFpbmluZyB0aGUgd2lkZ2V0cyB0byBhZGQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRBbGlnblJpZ2h0KFBhbmU8Pz4gY29udGFpbmVyKSB7Ci0JCXRoaXMucmlnaHRDb250cm9sQWxpZ25lci5hZGQoY29udGFpbmVyLnJpZ2h0Q29udHJvbEFsaWduZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbnRyb2wgdG8gdGhlIGNvbGxlY3Rpb24gb2Ygd2lkZ2V0cyB0aGF0IGhhdmUgdGhlaXIgd2lkdGgKLQkgKiBhZGp1c3Qgd2l0aCB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB3aWRnZXQuIFRoZSBsZWZ0IGFsaWdubWVudCBpcyB1c3VhbGx5Ci0JICogdXNlZCBmb3IgYnV0dG9ucy4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHRvIGFkZAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZEFsaWduUmlnaHQoQ29udHJvbCBjb250cm9sKSB7Ci0JCXRoaXMucmlnaHRDb250cm9sQWxpZ25lci5hZGQoY29udHJvbCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gcGFuZSdzIGNvbnRyb2xzICh0aG9zZSB0aGF0IHdlcmUgcmVnaXN0ZXJlZCBmb3IKLQkgKiBhbGlnbm1lbnQpIGZyb20gdGhpcyBwYW5lLgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgY29udGFpbmluZyB0aGUgd2lkZ2V0cyB0byBhZGQgZm9yCi0JICogYWxpZ25tZW50Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkUGFuZUZvckFsaWdubWVudChQYW5lPD8+IGNvbnRhaW5lcikgewotCQlhZGRBbGlnbkxlZnQoY29udGFpbmVyKTsKLQkJYWRkQWxpZ25SaWdodChjb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYW55IHByb3BlcnR5IG5hbWVzIHRvIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGluIG9yZGVyIHRvIGJlIG5vdGlmaWVkCi0JICogd2hlbiB0aGUgYWN0dWFsIHByb3BlcnR5IGNoYW5nZXMgaW4gdGhlIHN1YmplY3QuCi0JICoKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lcyBUaGUgY29sbGVjdGlvbiBvZiBwcm9wZXJ0eSBuYW1lcyB0byByZWdpc3RlciB3aXRoIHRoZQotCSAqIHN1YmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQXNwZWN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoYnVpbGRBc3BlY3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQXNwZWN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJLy9zdWJqZWN0KCkgY291bGQgaGF2ZSBjaGFuZ2VkIG9yIGlzIG51bGwgYmVjYXVzZSBvZiB0aGUgcG9zc2liaWxpdHkgb2YKLQkJCQkvLyJqdW1waW5nIiBvbiB0aGUgVUkgdGhyZWFkIGhlcmUgYW5kIGEgc2VsZWN0aW9uIGNoYW5nZSBvY2N1cmluZwotCQkJCWlmIChlLmdldFNvdXJjZSgpID09IGdldFN1YmplY3QoKSkgewotCQkJCQl1cGRhdGVQYW5lKGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGJ1dHRvbiB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYnV0dG9uQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYWRkQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGJ1dHRvbkFjdGlvbikgewotCi0JCXJldHVybiB0aGlzLmFkZEJ1dHRvbihjb250YWluZXIsIHRleHQsIG51bGwsIGJ1dHRvbkFjdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIDxjb2RlPkJ1dHRvbjwvY29kZT4gd2lkZ2V0LiAgVW5tYW5hZ2VkIG1lYW5zIAotCSAqIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgCi0JICogVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJ1dHRvbkFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGFkZFVubWFuYWdlZEJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBidXR0b25BY3Rpb24pIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRVbm1hbmFnZWRCdXR0b24oY29udGFpbmVyLCB0ZXh0LCBudWxsLCBidXR0b25BY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYnV0dG9uIHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBjaGVjayBib3gKLQkgKiBAcGFyYW0gYnV0dG9uQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYWRkQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBidXR0b25BY3Rpb24pIHsKLQotCQlCdXR0b24gYnV0dG9uID0gYWRkVW5tYW5hZ2VkQnV0dG9uKGNvbnRhaW5lciwgdGV4dCwgaGVscElkLCBidXR0b25BY3Rpb24pOwotCQl0aGlzLm1hbmFnZVdpZGdldChidXR0b24pOwotCi0JCXJldHVybiBidXR0b247Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIDxjb2RlPkJ1dHRvbjwvY29kZT4gd2lkZ2V0LiAgVW5tYW5hZ2VkIG1lYW5zIAotCSAqIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgCi0JICogVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGNoZWNrIGJveAotCSAqIEBwYXJhbSBidXR0b25BY3Rpb24gVGhlIGFjdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGJ1dHRvbiBpcyBwcmVzc2VkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBCdXR0b24gYWRkVW5tYW5hZ2VkQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBidXR0b25BY3Rpb24pIHsKLQotCQlCdXR0b24gYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUJ1dHRvbihjb250YWluZXIsIHRleHQpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTV1RVdGlsLmFzeW5jRXhlYyhidXR0b25BY3Rpb24pOwotCQkJfQotCQl9KTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGJ1dHRvbiwgaGVscElkKTsKLQkJfQotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbGF5b3V0IHdpbGwgbGVhdmUgc3BhY2UgZm9yIGRlY29yYXRpb25zIG9uIHdpZGdldHMuCi0JICogV2hldGhlciBkZWNvcmF0ZWQgb3Igbm90LCBhbGwgb2YgdGhlIHdpZGdldHMgbmVlZCB0aGUgc2FtZSBpbmRlbnQKLSAJICogc28gdGhhdCB0aGV5IGFsaWduIHByb3Blcmx5LgotCSAqLwotCXByb3RlY3RlZCBHcmlkRGF0YSBnZXRGaWVsZEdyaWREYXRhKCkgewotCQlpbnQgbWFyZ2luID0gRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuZ2V0RGVmYXVsdCgpCi0JCQkJLmdldE1heGltdW1EZWNvcmF0aW9uV2lkdGgoKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZGF0YS53aWR0aEhpbnQgPSBJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIICsgbWFyZ2luOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSBtYXJnaW47Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hlY2sgYm94IHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBjaGVjayBib3gKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGFkZENoZWNrQm94KAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAotCSAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQkJCi0JCXJldHVybiB0aGlzLmFkZFRvZ2dsZUJ1dHRvbigKLQkJCXBhcmVudCwKLQkJCWJ1dHRvblRleHQsCi0JCQlib29sZWFuSG9sZGVyLAotCQkJaGVscElkLAotCQkJU1dULkNIRUNLKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEJ1dHRvbiBhZGRDaGVja0JveCgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgYnV0dG9uVGV4dCwKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JCQlTdHJpbmcgaGVscElkLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGVuYWJsZWRNb2RlbCkgewotCQkKLQkJQnV0dG9uIGJ1dHRvbiA9IHRoaXMuYWRkVW5tYW5hZ2VkVG9nZ2xlQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCwgYm9vbGVhbkhvbGRlciwgaGVscElkLCBTV1QuQ0hFQ0spOwotCQl0aGlzLmNvbnRyb2xFbmFibGVkU3RhdGUoZW5hYmxlZE1vZGVsLCBidXR0b24pOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+IHRoYXQgY2FuIGJlIGNvbGxhcHNlZC4gQSBzdWItcGFuZSBpcwotCSAqIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMgaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCkgewotCQkKLQkJcmV0dXJuIHRoaXMuYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJCWNvbnRhaW5lciwKLQkJCQlzZWN0aW9uVGV4dCwKLQkJCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPiB0aGF0IGNhbiBiZSBjb2xsYXBzZWQuIEEgc3ViLXBhbmUgaXMKLQkgKiBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgc2VjdGlvbidzIGRlc2NyaXB0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbikgewotCi0JCXJldHVybiB0aGlzLmFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJZGVzY3JpcHRpb24sCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2Ygc2VjdGlvbiB0byBjcmVhdGUKLQkgKiBAcGFyYW0gZXhwYW5kZWRTdGF0ZUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHRoYXQgd2lsbCBkaWN0YXRlCi0JICogd2hlbiB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgYWRkQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBleHBhbmRlZFN0YXRlSG9sZGVyKSB7Ci0JCQotCQlyZXR1cm4gYWRkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lciwgc2VjdGlvblRleHQsIG51bGwsIHR5cGUsIGV4cGFuZGVkU3RhdGVIb2xkZXIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKLQkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIHNlY3Rpb24ncyBkZXNjcmlwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogd2FzIHByb3ZpZGVkCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2Ygc2VjdGlvbiB0byBjcmVhdGUKLQkgKiBAcGFyYW0gZXhwYW5kZWRTdGF0ZUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHRoYXQgd2lsbCBkaWN0YXRlCi0JICogd2hlbiB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgYWRkQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZXhwYW5kZWRTdGF0ZUhvbGRlcikgewotCi0JCUNvbXBvc2l0ZSBzdWJQYW5lID0gdGhpcy5hZGRTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJc2VjdGlvblRleHQsCi0JCQlkZXNjcmlwdGlvbiwKLQkJCUV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IHR5cGUKLQkJKTsKLQotCQlTZWN0aW9uIHNlY3Rpb24gPSAoU2VjdGlvbikgc3ViUGFuZS5nZXRQYXJlbnQoKTsKLQotCQlleHBhbmRlZFN0YXRlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQlidWlsZEV4cGFuZGVkU3RhdGVDaGFuZ2VMaXN0ZW5lcihzZWN0aW9uKQotCQkpOwotCi0JCXNlY3Rpb24uc2V0RXhwYW5kZWQoCi0JCQlleHBhbmRlZFN0YXRlSG9sZGVyLmdldFZhbHVlKCkgIT0gbnVsbCA/IGV4cGFuZGVkU3RhdGVIb2xkZXIuZ2V0VmFsdWUoKSA6IHRydWUKLQkJKTsKLQotCQlyZXR1cm4gc3ViUGFuZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKLQkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcGFyYW0gZXhwYW5kZWRTdGF0ZUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHRoYXQgd2lsbCBkaWN0YXRlCi0JICogd2hlbiB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBleHBhbmRlZFN0YXRlSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJc2VjdGlvblRleHQsCi0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSwKLQkJCWV4cGFuZGVkU3RhdGVIb2xkZXIKLQkJKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBzZWN0aW9uJ3MgZGVzY3JpcHRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBleHBhbmRlZFN0YXRlSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdGhhdCB3aWxsIGRpY3RhdGUKLQkgKiB3aGVuIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGV4cGFuZGVkU3RhdGVIb2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlzZWN0aW9uVGV4dCwKLQkJCWRlc2NyaXB0aW9uLAotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUsCi0JCQlleHBhbmRlZFN0YXRlSG9sZGVyCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCB3aGljaCBjYW4gYmUgdHlwZWQgY2FzdCBkaXJlY3RseSBhcyBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkQ29sbGFwc2libGVTdWJTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBleHBhbmRlZFN0YXRlSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJc2VjdGlvblRleHQsCi0JCQlTV1QuTlVMTCwKLQkJCWV4cGFuZGVkU3RhdGVIb2xkZXIKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gYWRkQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkVW5tYW5hZ2VkQ29tYm8oY29udGFpbmVyKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQoY29tYm8pOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBDb21ibyBhZGRVbm1hbmFnZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbWJvIGNvbWJvID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUNvbWJvKGNvbnRhaW5lcik7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2V0RmllbGRHcmlkRGF0YSgpKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbm9uLWVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCi0JICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBhZGRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkQ29tYm8oY29udGFpbmVyKTsKLQotCQlDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQljb21ibywKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgPFY+IENvbWJvIGFkZFVubWFuYWdlZENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlcikgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5hZGRVbm1hbmFnZWRDb21ibyhjb250YWluZXIpOwotCi0JCUNvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWNvbWJvLAotCQkJc3RyaW5nQ29udmVydGVyCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYWRkQ29tYm8oCi0JCQlDb21wb3NpdGUgY29udGFpbmVyLAotCQkJTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZW5hYmxlZE1vZGVsKSB7Ci0JCQotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkVW5tYW5hZ2VkQ29tYm8oY29udGFpbmVyLCBsaXN0SG9sZGVyLCBzZWxlY3RlZEl0ZW1Ib2xkZXIsIHN0cmluZ0NvbnZlcnRlcik7Ci0JCXRoaXMuY29udHJvbEVuYWJsZWRTdGF0ZShlbmFibGVkTW9kZWwsIGNvbWJvKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+IHVzaW5nIGEgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSBwcm92aWRlciByZXNwb25zaWJsZSB0byBjb252ZXJ0IHRoZSBjb21ibydzIGl0ZW1zCi0JICogaW50byBodW1hbiByZWFkYWJsZSBzdHJpbmdzCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ib1ZpZXdlcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm9WaWV3ZXIgYWRkQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5hZGRDb21ibyhjb250YWluZXIpOwotCQlDb21ib1ZpZXdlciB2aWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tYm8pOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtYWluIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUuIFRoZSBsYXlvdXQgYW5kIGxheW91dCBkYXRhIGFyZQotCSAqIGF1dG9tYXRpY2FsbHkgc2V0LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB0aGF0IHdpbGwgaG9sZHMgYWxsIHRoZQotCSAqIHdpZGdldHMgY3JlYXRlZCBieSB0aGlzIHBhbmUgdGhyb3VnaCB7QGxpbmsgI2luaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlKX0KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiB0aGlzLmFkZFN1YlBhbmUocGFyZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBhZGRFZGl0YWJsZUNvbWJvKAotCQkJQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJCUxpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGVuYWJsZWRNb2RlbCkgewotCQkKLQkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZFVubWFuYWdlZEVkaXRhYmxlQ29tYm8oY29udGFpbmVyLCBsaXN0SG9sZGVyLCBzZWxlY3RlZEl0ZW1Ib2xkZXIsIHN0cmluZ0NvbnZlcnRlcik7Ci0JCXRoaXMuY29udHJvbEVuYWJsZWRTdGF0ZShlbmFibGVkTW9kZWwsIGNvbWJvKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gYWRkRWRpdGFibGVDb21ibygKLQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCUNvbWJvIGNvbWJvID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZXRGaWVsZEdyaWREYXRhKCkpOwotCQl0aGlzLm1hbmFnZVdpZGdldChjb21ibyk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYWRkRWRpdGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkRWRpdGFibGVDb21ibyhjb250YWluZXIpOwotCi0JCUNvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWNvbWJvLAotCQkJc3RyaW5nQ29udmVydGVyCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+IHVzaW5nIGEgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSBwcm92aWRlciByZXNwb25zaWJsZSB0byBjb252ZXJ0IHRoZSBjb21ibydzIGl0ZW1zCi0JICogaW50byBodW1hbiByZWFkYWJsZSBzdHJpbmdzCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ib1ZpZXdlcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm9WaWV3ZXIgYWRkRWRpdGFibGVDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkRWRpdGFibGVDb21ibyhjb250YWluZXIpOwotCQlDb21ib1ZpZXdlciB2aWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tYm8pOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRFeHBhbmRlZFN0YXRlQ2hhbmdlTGlzdGVuZXIoZmluYWwgU2VjdGlvbiBzZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoYnVpbGRFeHBhbmRlZFN0YXRlQ2hhbmdlTGlzdGVuZXJfKHNlY3Rpb24pKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRFeHBhbmRlZFN0YXRlQ2hhbmdlTGlzdGVuZXJfKGZpbmFsIFNlY3Rpb24gc2VjdGlvbikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoZmluYWwgUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQm9vbGVhbiB2YWx1ZSA9IChCb29sZWFuKSBlLmdldE5ld1ZhbHVlKCk7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSBCb29sZWFuLlRSVUU7Ci0JCQkJfQotCQkJCXNlY3Rpb24uc2V0RXhwYW5kZWQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SHlwZXJsaW5rPC9jb2RlPiB0aGF0IHdpbGwgaW52b2tlZCB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5SdW5uYWJsZTwvY29kZT4gd2hlbiBzZWxlY3RlZC4gVGhlIGdpdmVuIGFjdGlvbiBpcyBhbHdheXMgaW52b2tlZAotCSAqIGZyb20gdGhlIFVJIHRocmVhZC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgaHlwZXJsaW5rJ3MgdGV4dAotCSAqIEBwYXJhbSBoeXBlckxpbmtBY3Rpb24gVGhlIGFjdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGxpbmsgd2FzIHNlbGVjdGVkCi0JICogcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkh5cGVybGluazwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSHlwZXJsaW5rIGFkZEh5cGVybGluayhDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBoeXBlckxpbmtBY3Rpb24pIHsKLQotCQlIeXBlcmxpbmsgbGluayA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVIeXBlcmxpbmsocGFyZW50LCB0ZXh0KTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQobGluayk7Ci0KLQkJbGluay5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0KLQkJCQlIeXBlcmxpbmsgaHlwZXJMaW5rID0gKEh5cGVybGluaykgZS53aWRnZXQ7Ci0KLQkJCQlpZiAoaHlwZXJMaW5rLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCVNXVFV0aWwuYXN5bmNFeGVjKGh5cGVyTGlua0FjdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxhYmVsIHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGFiZWwgYWRkTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IGFkZFVubWFuYWdlZExhYmVsKGNvbnRhaW5lciwgbGFiZWxUZXh0KTsKLQkJbWFuYWdlV2lkZ2V0KGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBMYWJlbCBhZGRMYWJlbCgKLQkJCUNvbXBvc2l0ZSBjb250YWluZXIsCi0JCQlTdHJpbmcgbGFiZWxUZXh0LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGVuYWJsZWRNb2RlbAotCSkgewotCQlMYWJlbCBsYWJlbCA9IHRoaXMuYWRkVW5tYW5hZ2VkTGFiZWwoY29udGFpbmVyLCBsYWJlbFRleHQpOwotCQl0aGlzLmNvbnRyb2xFbmFibGVkU3RhdGUoZW5hYmxlZE1vZGVsLCBsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCA8Y29kZT5MYWJlbDwvY29kZT4gd2lkZ2V0LiAgVW5tYW5hZ2VkIG1lYW5zIAotCSAqIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgCi0JICogVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIGxhYmVsJ3MgdGV4dAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgTGFiZWwgYWRkVW5tYW5hZ2VkTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0KLQkJcmV0dXJuIHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChjb250YWluZXIsIGxhYmVsVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSBub24tZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoCi0JICogdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZExhYmVsZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZENvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCShjb21iby5nZXRQYXJlbnQoKSAhPSBjb250YWluZXIpID8gY29tYm8uZ2V0UGFyZW50KCkgOiBjb21ibywKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIG5vbi1lZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGgKLQkgKiB0aGUgZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYWRkTGFiZWxlZENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZENvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXN0cmluZ0NvbnZlcnRlciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsZWZ0Q29udHJvbCBUaGUgd2lkZ2V0IHNob3duIHRvIHRoZSBsZWZ0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJCQkJCQkJCQkJCQlDb250cm9sIGxlZnRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY2VudGVyQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJLy8gQ29udGFpbmVyIGZvciB0aGUgbGFiZWwgYW5kIG1haW4gY29tcG9zaXRlCi0JCWNvbnRhaW5lciA9IHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDMsIDAsIDAsIDAsIDApOwotCi0JCS8vIExlZnQgY29udHJvbAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWxlZnRDb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIFJlLXBhcmVudCB0aGUgbGVmdCBjb250cm9sIHRvIHRoZSBuZXcgc3ViIHBhbmUKLQkJbGVmdENvbnRyb2wuc2V0UGFyZW50KGNvbnRhaW5lcik7Ci0JCXRoaXMuYWRkQWxpZ25MZWZ0KGxlZnRDb250cm9sKTsKLQotCi0JCS8vIFJlLXBhcmVudCB0aGUgY2VudGVyIGNvbnRyb2wgdG8gdGhlIG5ldyBzdWIgcGFuZQotCQljZW50ZXJDb250cm9sLnNldFBhcmVudChjb250YWluZXIpOwotCi0JCS8vIFJlZ2lzdGVyIHRoZSBoZWxwIGlkIGZvciB0aGUgY2VudGVyIGNvbnRyb2wKLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjZW50ZXJDb250cm9sLCBoZWxwSWQpOwotCQl9Ci0KLQkJLy8gUmlnaHQgY29udHJvbAotCQlpZiAocmlnaHRDb250cm9sID09IG51bGwpIHsKLQkJCUNvbXBvc2l0ZSBzcGFjZXIgPSB0aGlzLmFkZFBhbmUoY29udGFpbmVyKTsKLQkJCXNwYWNlci5zZXRMYXlvdXQodGhpcy5idWlsZFNwYWNlckxheW91dCgpKTsKLQkJCXJpZ2h0Q29udHJvbCA9IHNwYWNlcjsKLQkJfQotCQllbHNlIHsKLQkJCXJpZ2h0Q29udHJvbC5zZXRQYXJlbnQoY29udGFpbmVyKTsKLQotCQkJLy8gUmVnaXN0ZXIgdGhlIGhlbHAgaWQgZm9yIHRoZSByaWdodCBjb250cm9sCi0JCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyaWdodENvbnRyb2wsIGhlbHBJZCk7Ci0JCQl9Ci0JCX0KLQotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLQkJcmlnaHRDb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl0aGlzLmFkZEFsaWduUmlnaHQocmlnaHRDb250cm9sKTsKLQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdXNlZCB0byBkZXNjcmliZSB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb250cm9sCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRMYWJlbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JCQkJCQkJCQkJCQkJQ29udHJvbCBsYWJlbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGNlbnRlckNvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbCwKLQkJCWNlbnRlckNvbnRyb2wsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb21wb3NpdGUgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCB0byBsYWJlbCB0aGUgbWFpbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY2VudGVyUGFuZSBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRMYWJlbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lPD8+IGNlbnRlclBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQljZW50ZXJQYW5lLmdldENvbnRyb2woKSwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29tcG9zaXRlIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbCB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgdG8gbGFiZWwgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRMYWJlbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGNlbnRlckNvbnRyb2wpIHsKLQotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQljZW50ZXJDb250cm9sLAotCQkJbnVsbCwKLQkJCW51bGwKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbXBvc2l0ZSBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IHRvIGxhYmVsIHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY2VudGVyQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCXRoaXMuYWRkTGFiZWwoY29udGFpbmVyLCBsYWJlbFRleHQpLAotCQkJY2VudGVyQ29udHJvbCwKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29tcG9zaXRlIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbCB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgdG8gbGFiZWwgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjZW50ZXJDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlMYWJlbCBsYWJlbCA9IHRoaXMuYWRkTGFiZWwoY29udGFpbmVyLCBsYWJlbFRleHQpOwotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbCwKLQkJCWNlbnRlckNvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsZWZ0Q29udHJvbCBUaGUgd2lkZ2V0IHNob3duIHRvIHRoZSBsZWZ0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZEVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoY29tYm9MaXN0ZW5lcik7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJKGNvbWJvLmdldFBhcmVudCgpICE9IGNvbnRhaW5lcikgPyBjb21iby5nZXRQYXJlbnQoKSA6IGNvbWJvLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGFuIGVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGNvbWJvTGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBzZWxlY3Rpb24KLQkgKiBjaGFuZ2VzCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21ibyBhZGRMYWJlbGVkRWRpdGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQljb21ib0xpc3RlbmVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxlZnRDb250cm9sIFRoZSB3aWRnZXQgc2hvd24gdG8gdGhlIGxlZnQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHByb3ZpZGVyIHJlc3BvbnNpYmxlIHRvIGNvbnZlcnQgdGhlIGNvbWJvJ3MgaXRlbXMKLQkgKiBpbnRvIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvIGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvVmlld2VyKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZ5TGlzdGVuZXIgY29tYm9MaXN0ZW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlDb21ib1ZpZXdlciBjb21ib1ZpZXdlciA9IHRoaXMuYWRkRWRpdGFibGVDb21ib1ZpZXdlcigKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsUHJvdmlkZXIKLQkJKTsKLQotCQlDb21ibyBjb21ibyA9IGNvbWJvVmlld2VyLmdldENvbWJvKCk7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGNvbWJvTGlzdGVuZXIpOwotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCShjb21iby5nZXRQYXJlbnQoKSAhPSBjb250YWluZXIpID8gY29tYm8uZ2V0UGFyZW50KCkgOiBjb21ibywKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhbiBlZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBjb21ib0xpc3RlbmVyIFRoZSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgc2VsZWN0aW9uCi0JICogY2hhbmdlcwotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSBwcm92aWRlciByZXNwb25zaWJsZSB0byBjb252ZXJ0IHRoZSBjb21ibydzIGl0ZW1zCi0JICogaW50byBodW1hbiByZWFkYWJsZSBzdHJpbmdzCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21ibyBhZGRMYWJlbGVkRWRpdGFibGVDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRFZGl0YWJsZUNvbWJvVmlld2VyKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJY29tYm9MaXN0ZW5lciwKLQkJCWxhYmVsUHJvdmlkZXIsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGFuIGVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFY+aW5zdGFuY2UoKSwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlzdHJpbmdDb252ZXJ0ZXIKLQkJKTsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQkoY29tYm8uZ2V0UGFyZW50KCkgIT0gY29udGFpbmVyKSA/IGNvbWJvLmdldFBhcmVudCgpIDogY29tYm8sCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYW4gZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoIHRoZQotCSAqIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCi0JICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJc3RyaW5nQ29udmVydGVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgYXJlYSdzIGxhYmVsCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGxpbmVDb3VudCBUaGUgbnVtYmVyIG9mIGxpbmVzIHRoZSB0ZXh0IGFyZWEgc2hvdWxkIGRpc3BsYXkKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZE11bHRpTGluZVRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyLCBsaW5lQ291bnQpOwotCi0JCWNvbnRhaW5lciA9IHRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCXRleHQsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlpbnQgdGV4dEhlaWdodCA9IHRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55OwotCi0JCS8vIFNwZWNpZnkgdGhlIG51bWJlciBvZiBsaW5lcyB0aGUgdGV4dCBhcmVhIHNob3VsZCBkaXNwbGF5Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSB0ZXh0LmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IHRleHQuZ2V0TGluZUhlaWdodCgpICogbGluZUNvdW50OwotCi0JCS8vIE1vdmUgdGhlIGxhYmVsIHRvIHRoZSB0b3Agb2YgaXRzIGNlbGwKLQkJQ29udHJvbCBsYWJlbCA9IGNvbnRhaW5lci5nZXRDaGlsZHJlbigpWzBdOwotCQlpbnQgbGFiZWxIZWlnaHQgPSBsYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnk7Ci0KLQkJZ3JpZERhdGEgPSAoR3JpZERhdGEpIGxhYmVsLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCAgICs9IChNYXRoLmFicyh0ZXh0SGVpZ2h0IC0gbGFiZWxIZWlnaHQpIC8gMik7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRQYXNzd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZFBhc3N3b3JkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCXRleHRIb2xkZXIsCi0JCQludWxsCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBmaWVsZCdzIGxhYmVsCi0JICogQHBhcmFtIHJpZ2h0Q29tcG9uZW50IFRoZSBjb21wb25lbnQgdG8gYmUgcGxhY2VkIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dAotCSAqIGZpZWxkCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkUGFzc3dvcmRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZFBhc3N3b3JkVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIpOwotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCXRleHQsCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRQYXNzd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZFBhc3N3b3JkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCXRleHRIb2xkZXIsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzcGlubmVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIGxhYmVsJ3MgdGV4dAotCSAqIEBwYXJhbSBudW1iZXJIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHNob3duIHdoZW4gdGhlIGhvbGRlciBoYXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbWluaW11bVZhbHVlIFRoZSBtaW5pbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdwotCSAqIEBwYXJhbSBtYXhpbXVtVmFsdWUgVGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgd2lkZ2V0IHRvIGJlIHBsYWNlZCB0byB0aGUgcmlnaHQgb2Ygc3Bpbm5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHNwaW5uZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlNwaW5uZXI8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNwaW5uZXIgYWRkTGFiZWxlZFNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbmltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhpbXVtVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSB0aGlzLmFkZFNwaW5uZXIoCi0JCQlwYXJlbnQsCi0JCQludW1iZXJIb2xkZXIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQltaW5pbXVtVmFsdWUsCi0JCQltYXhpbXVtVmFsdWUsCi0JCQloZWxwSWQKLQkJKTsKLQkJTGFiZWwgbGFiZWwgPSBhZGRMYWJlbChwYXJlbnQsIGxhYmVsVGV4dCk7Ci0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQlwYXJlbnQsCi0JCQlsYWJlbCwKLQkJCShzcGlubmVyLmdldFBhcmVudCgpICE9IHBhcmVudCkgPyBzcGlubmVyLmdldFBhcmVudCgpIDogc3Bpbm5lciwKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBzcGlubmVyLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQotCQlyZXR1cm4gc3Bpbm5lcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1hbmFnZWQgc3Bpbm5lci4gTWFuYWdlZCBtZWFucyB0aGF0IHRoaXMgUGFuZSB3aWxsCi0JICogaGFuZGxlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldCBpZiBhIFBhbmVFbmFibGVyIGlzIHVzZWQuICAKLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbnVtYmVySG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGludGVnZXIgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSBzaG93biB3aGVuIHRoZSBob2xkZXIgaGFzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIG1pbmltdW1WYWx1ZSBUaGUgbWluaW11bSB2YWx1ZSB0aGF0IHRoZSBzcGlubmVyIHdpbGwgYWxsb3cKLQkgKiBAcGFyYW0gbWF4aW11bVZhbHVlIFRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlNwaW5uZXI8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNwaW5uZXIgYWRkU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5pbXVtVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhpbXVtVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBhZGRVbm1hbmFnZWRTcGlubmVyKHBhcmVudCwgbnVtYmVySG9sZGVyLCBkZWZhdWx0VmFsdWUsIG1pbmltdW1WYWx1ZSwgbWF4aW11bVZhbHVlLCBoZWxwSWQpOwotCQl0aGlzLm1hbmFnZVdpZGdldChzcGlubmVyKTsKLQkJcmV0dXJuIHNwaW5uZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgc3Bpbm5lci4gIFVubWFuYWdlZCBtZWFucyB0aGF0IHRoaXMgUGFuZSB3aWxsCi0JICogbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUKLQkgKiBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIG51bWJlckhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgc2hvd24gd2hlbiB0aGUgaG9sZGVyIGhhcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBtaW5pbXVtVmFsdWUgVGhlIG1pbmltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHBhcmFtIG1heGltdW1WYWx1ZSBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSBzcGlubmVyIHdpbGwgYWxsb3cKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgYnV0dG9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5TcGlubmVyPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgU3Bpbm5lciBhZGRVbm1hbmFnZWRTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbmltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heGltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVTcGlubmVyKHBhcmVudCk7Ci0JCXNwaW5uZXIuc2V0TWluaW11bShtaW5pbXVtVmFsdWUpOwotCQlzcGlubmVyLnNldE1heGltdW0obWF4aW11bVZhbHVlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBnZXRGaWVsZEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJc3Bpbm5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KG51bWJlckhvbGRlciwgc3Bpbm5lciwgZGVmYXVsdFZhbHVlKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNwaW5uZXIsIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gc3Bpbm5lcjsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtYW5hZ2VkIERhdGVUaW1lIG9mIHR5cGUgU1dULlRJTUUuICBNYW5hZ2VkIG1lYW5zIHRoYXQgdGhpcyBQYW5lIHdpbGwKLQkgKiBoYW5kbGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0IGlmIGEgUGFuZUVuYWJsZXIgaXMgdXNlZC4gIAotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBob3Vyc0hvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBob3VycyBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIG1pbnV0ZXNIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWludXRlcyBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIHNlY29uZHNIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2Vjb25kcyBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGRhdGVUaW1lCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5EYXRlVGltZTwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGF0ZVRpbWUgYWRkRGF0ZVRpbWUoQ29tcG9zaXRlIHBhcmVudCwKLQkJCQkJCQkJCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gaG91cnNIb2xkZXIsCi0JCQkJCQkJCQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG1pbnV0ZXNIb2xkZXIsCi0JCQkJCQkJCQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHNlY29uZHNIb2xkZXIsCi0JCQkJCQkJCQkJCVN0cmluZyBoZWxwSWQpIHsKLQkJCi0JCURhdGVUaW1lIGRhdGVUaW1lID0gdGhpcy5hZGRVbm1hbmFnZWREYXRlVGltZShwYXJlbnQsIGhvdXJzSG9sZGVyLCBtaW51dGVzSG9sZGVyLCBzZWNvbmRzSG9sZGVyLCBoZWxwSWQpOwotCQl0aGlzLm1hbmFnZVdpZGdldChkYXRlVGltZSk7Ci0KLQkJcmV0dXJuIGRhdGVUaW1lOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBEYXRlVGltZSBhZGREYXRlVGltZSgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBob3Vyc0hvbGRlciwKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG1pbnV0ZXNIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBzZWNvbmRzSG9sZGVyLAotCQkJU3RyaW5nIGhlbHBJZCwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwKLQkpIHsKLQkJRGF0ZVRpbWUgZGF0ZVRpbWUgPSB0aGlzLmFkZFVubWFuYWdlZERhdGVUaW1lKHBhcmVudCwgaG91cnNIb2xkZXIsIG1pbnV0ZXNIb2xkZXIsIHNlY29uZHNIb2xkZXIsIGhlbHBJZCk7Ci0JCXRoaXMuY29udHJvbEVuYWJsZWRTdGF0ZShlbmFibGVkTW9kZWwsIGRhdGVUaW1lKTsKLQkJcmV0dXJuIGRhdGVUaW1lOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIERhdGVUaW1lIG9mIHR5cGUgU1dULlRJTUUuICBVbm1hbmFnZWQgbWVhbnMgdGhhdCB0aGlzIFBhbmUgd2lsbAotCSAqIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4gIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlCi0JICogaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBob3Vyc0hvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBob3VycyBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIG1pbnV0ZXNIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWludXRlcyBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIHNlY29uZHNIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2Vjb25kcyBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGRhdGVUaW1lCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5EYXRlVGltZTwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIERhdGVUaW1lIGFkZFVubWFuYWdlZERhdGVUaW1lKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJCQkJCQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGhvdXJzSG9sZGVyLAotCQkJCQkJCQkJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBtaW51dGVzSG9sZGVyLAotCQkJCQkJCQkJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBzZWNvbmRzSG9sZGVyLAotCQkJCQkJCQkJCQlTdHJpbmcgaGVscElkKSB7Ci0JCQotCQlEYXRlVGltZSBkYXRlVGltZSA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVEYXRlVGltZShwYXJlbnQsIFNXVC5USU1FKTsKLQkJCi0JCURhdGVUaW1lTW9kZWxBZGFwdGVyLmFkYXB0KGhvdXJzSG9sZGVyLCBtaW51dGVzSG9sZGVyLCBzZWNvbmRzSG9sZGVyLCBkYXRlVGltZSk7Ci0JCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGF0ZVRpbWUsIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gZGF0ZVRpbWU7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSA8Vj4gQ29tYm8gYWRkVW5tYW5hZ2VkRWRpdGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IGFkZFVubWFuYWdlZEVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQotCQlDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQljb21ibywKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIENvbWJvIGFkZFVubWFuYWdlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZXRGaWVsZEdyaWREYXRhKCkpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZFRleHQoY29udGFpbmVyLCBsYWJlbFRleHQsIHRleHRIb2xkZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgZmllbGQncyBsYWJlbAotCSAqIEBwYXJhbSByaWdodENvbXBvbmVudCBUaGUgY29tcG9uZW50IHRvIGJlIHBsYWNlZCB0byB0aGUgcmlnaHQgb2YgdGhlIHRleHQKLQkgKiBmaWVsZAotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHRleHQgZmllbGQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTGFiZWxlZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29tcG9uZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRleHQgdGV4dCA9IHRoaXMuYWRkVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIpOwotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCXRleHQsCi0JCQlyaWdodENvbXBvbmVudCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQkvKioKLQkgKiAKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGZpZWxkJ3MgbGFiZWwKLQkgKiBAcGFyYW0gcmlnaHRDb21wb25lbnQgVGhlIGNvbXBvbmVudCB0byBiZSBwbGFjZWQgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0ZXh0Ci0JICogZmllbGQKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCBsYWJlbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb21wb25lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRUZXh0KGNvbnRhaW5lciwgdGV4dEhvbGRlcik7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWwsCi0JCQl0ZXh0LAotCQkJcmlnaHRDb21wb25lbnQsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJdGV4dEhvbGRlciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCBsYWJlbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsLAotCQkJdGV4dEhvbGRlciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxpc3QgYW5kIG5vdGlmeSB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhvbGRlciB3aGVuIHRoZQotCSAqIHNlbGVjdGlvbiBjaGFuZ2VzLiBJZiB0aGUgc2VsZWN0aW9uIGNvdW50IGlzIGRpZmZlcmVudCB0aGFuIG9uZSB0aGFuIHRoZQotCSAqIGhvbGRlciB3aWxsIHJlY2VpdmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHJhZGlvIGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+TGlzdDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdCBhZGRMaXN0KENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMaXN0KAotCQkJY29udGFpbmVyLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCksCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxpc3QgYW5kIG5vdGlmeSB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhvbGRlciB3aGVuIHRoZQotCSAqIHNlbGVjdGlvbiBjaGFuZ2VzLiBJZiB0aGUgc2VsZWN0aW9uIGNvdW50IGlzIGRpZmZlcmVudCB0aGFuIG9uZSB0aGFuIHRoZQotCSAqIGhvbGRlciB3aWxsIHJlY2VpdmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHNlbGVjdGlvbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB1bmlxdWUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyByYWRpbyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkxpc3Q8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgYWRkTGlzdChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHNlbGVjdGlvbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUxpc3QgbGlzdCA9IHRoaXMuYWRkVW5tYW5hZ2VkTGlzdChjb250YWluZXIsIHNlbGVjdGlvbkhvbGRlciwgaGVscElkKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQobGlzdCk7Ci0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIGxpc3QgYW5kIG5vdGlmeSB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhvbGRlciB3aGVuIHRoZQotCSAqIHNlbGVjdGlvbiBjaGFuZ2VzLiBJZiB0aGUgc2VsZWN0aW9uIGNvdW50IGlzIGRpZmZlcmVudCB0aGFuIG9uZSB0aGFuIHRoZQotCSAqIGhvbGRlciB3aWxsIHJlY2VpdmUgPGNvZGU+bnVsbDwvY29kZT4uIAotCSAqIFVubWFuYWdlZCBtZWFucyB0aGF0IHRoaXMgUGFuZSB3aWxsIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4gIAotCSAqIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc2VsZWN0aW9uSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHVuaXF1ZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHJhZGlvIGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+TGlzdDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIExpc3QgYWRkVW5tYW5hZ2VkTGlzdChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHNlbGVjdGlvbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUxpc3QgbGlzdCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVMaXN0KAotCQkJY29udGFpbmVyLAotCQkJU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5NVUxUSQotCQkpOwotCi0JCWxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIoYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25Ib2xkZXIpKTsKLQkJbGlzdC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGxpc3QsIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxhYmxlIGV4cGFuZGluZyBvbiBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRm9ybVRleHQgYWRkTXVsdGlMaW5lTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQpIHsKLQotCQlGb3JtVGV4dCBsYWJlbCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVNdWx0aUxpbmVMYWJlbChjb250YWluZXIsIGxhYmVsVGV4dCk7Ci0JCW1hbmFnZVdpZGdldChsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldCB0aGF0IGhhcyBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZU11bHRpTGluZVRleHQoY29udGFpbmVyKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdldEZpZWxkR3JpZERhdGEoKSk7Ci0JCXRoaXMubWFuYWdlV2lkZ2V0KHRleHQpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldCB0aGF0IGhhcyBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGluZUNvdW50IFRoZSBudW1iZXIgb2YgbGluZXMgdGhlIHRleHQgYXJlYSBzaG91bGQgZGlzcGxheQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lQ291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZE11bHRpTGluZVRleHQoY29udGFpbmVyKTsKLQkJCi0JCUdyaWREYXRhIGdyaWREYXRhICAgPSBnZXRGaWVsZEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIGxpbmVDb3VudDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRleHQsIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldCB0aGF0IGhhcyBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gbGluZUNvdW50IFRoZSBudW1iZXIgb2YgbGluZXMgdGhlIHRleHQgYXJlYSBzaG91bGQgZGlzcGxheQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lQ291bnQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgdGV4dEhvbGRlciwgbGluZUNvdW50LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldCB0aGF0IGhhcyBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGV4dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lQ291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZE11bHRpTGluZVRleHQoY29udGFpbmVyLCBsaW5lQ291bnQsIGhlbHBJZCk7Ci0JCVNXVFRvb2xzLmJpbmQodGV4dEhvbGRlciwgdGV4dCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFnZUJvb2s8L2NvZGU+IGFuZCBzZXQgdGhlIHByb3BlciBsYXlvdXQgYW5kIGxheW91dAotCSAqIGRhdGEuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5QYWdlQm9vazwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUGFnZUJvb2sgYWRkUGFnZUJvb2soQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVBhZ2VCb29rIHBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmV0dXJuIHBhZ2VCb29rOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHdpdGhvdXQgc3BlY2lmeWluZyBhbnkgbGF5b3V0IG1hbmFnZXIuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgb2YgdGhlIG5ldyBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZFBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHVzaW5nIHRoZSBnaXZlbiBsYXlvdXQgbWFuYWdlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBvZiB0aGUgbmV3IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYXlvdXQgVGhlIGxheW91dCBtYW5hZ2VyIG9mIHRoZSBuZXcgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgTGF5b3V0IGxheW91dCkgewotCi0JCWNvbnRhaW5lciA9IHRoaXMuYWRkUGFuZShjb250YWluZXIpOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZFBhc3N3b3JkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcikgewotCi0JCVRleHQgdGV4dCA9IHRoaXMuYWRkUGFzc3dvcmRUZXh0KGNvbnRhaW5lcik7Ci0JCVNXVFRvb2xzLmJpbmQodGV4dEhvbGRlciwgdGV4dCk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkUGFzc3dvcmRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlUGFzc3dvcmRUZXh0KGNvbnRhaW5lcik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZXRGaWVsZEdyaWREYXRhKCkpOwotCi0JCXRoaXMubWFuYWdlV2lkZ2V0KHRleHQpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHB1c2ggYnV0dG9uIHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBidXR0b25BY3Rpb24gVGhlIGFjdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGJ1dHRvbiBpcyBwcmVzc2VkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJ1dHRvbiBhZGRQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgYnV0dG9uQWN0aW9uKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkUHVzaEJ1dHRvbihwYXJlbnQsIGJ1dHRvblRleHQsIG51bGwsIGJ1dHRvbkFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBwdXNoIGJ1dHRvbiB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYnV0dG9uQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyByYWRpbyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGFkZFB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGJ1dHRvbkFjdGlvbikgewotCi0JCUJ1dHRvbiBidXR0b24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlUHVzaEJ1dHRvbihwYXJlbnQsIGJ1dHRvblRleHQpOwotCQltYW5hZ2VXaWRnZXQoYnV0dG9uKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU1dUVXRpbC5hc3luY0V4ZWMoYnV0dG9uQWN0aW9uKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYnV0dG9uLCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoZWNrIGJveCB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3Rpb24gc3RhdGUKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgcmFkaW8gYnV0dG9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJ1dHRvbiBhZGRSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZFRvZ2dsZUJ1dHRvbigKLQkJCXBhcmVudCwKLQkJCWJ1dHRvblRleHQsCi0JCQlib29sZWFuSG9sZGVyLAotCQkJaGVscElkLAotCQkJU1dULlJBRElPCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCkgewotCi0JCXJldHVybiB0aGlzLmFkZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlzZWN0aW9uVGV4dCwKLQkJCUV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2Ygc2VjdGlvbiB0byBjcmVhdGUKLQkgKiBAcGFyYW0gZXhwYW5kZWRTdGF0ZUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHRoYXQgd2lsbCBkaWN0YXRlCi0JICogd2hlbiB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgYWRkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkU2VjdGlvbihjb250YWluZXIsIHNlY3Rpb25UZXh0LCBudWxsLCB0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKLQkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIHNlY3Rpb24ncyBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJZGVzY3JpcHRpb24sCi0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUgotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcwotCSAqIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgc2VjdGlvbidzIGRlc2NyaXB0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiB3YXMgcHJvdmlkZXIKLQkgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBzZWN0aW9uIHRvIGNyZWF0ZQotCSAqIEBwYXJhbSBleHBhbmRlZFN0YXRlSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdGhhdCB3aWxsIGRpY3RhdGUKLQkgKiB3aGVuIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBhZGRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSkgewotCi0JCVNlY3Rpb24gc2VjdGlvbiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVTZWN0aW9uKGNvbnRhaW5lciwgdHlwZSB8ICgoZGVzY3JpcHRpb24gIT0gbnVsbCkgPyBTZWN0aW9uLkRFU0NSSVBUSU9OIDogU1dULk5VTEwpKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc2VjdGlvbi5zZXRUZXh0KHNlY3Rpb25UZXh0KTsKLQkJc2VjdGlvbi5tYXJnaW5XaWR0aCAgPSAwOwotCQlzZWN0aW9uLm1hcmdpbkhlaWdodCA9IDA7Ci0JCQotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCX0KLQotCQlDb21wb3NpdGUgc3ViUGFuZSA9IHRoaXMuYWRkU3ViUGFuZShzZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoc3ViUGFuZSk7Ci0KLQkJcmV0dXJuIHN1YlBhbmU7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFNlbGVjdGlvbkxpc3RlbmVyKGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc2VsZWN0aW9uSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBlLndpZGdldDsKLQkJCQlTdHJpbmdbXSBzZWxlY3RlZEl0ZW1zID0gbGlzdC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKHNlbGVjdGVkSXRlbXMgPT0gbnVsbCkgfHwgKHNlbGVjdGVkSXRlbXMubGVuZ3RoICE9IDEpKSB7Ci0JCQkJCXNlbGVjdGlvbkhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNlbGVjdGlvbkhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZEl0ZW1zWzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGF5b3V0IHJlc3BvbnNpYmxlIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHNwYWNlciBjcmVhdGVkCi0JICogZm9yIHRoZSByaWdodCBjb250cm9sIHdoZW4gbm9uZSB3YXMgZ2l2ZW4uIFRoZSBzcGFjZXIgaGVscHMgdG8gYWxpZ24gYWxsCi0JICogdGhlIHJpZ2h0IGNvbnRyb2xzLgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgTGF5b3V0IGJ1aWxkU3BhY2VyTGF5b3V0KCkgewotCQlyZXR1cm4gbmV3IExheW91dCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoSGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0SGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQotCQkJCXJldHVybiBuZXcgUG9pbnQod2lkdGhIaW50LCBoZWlnaHRIaW50KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29tcG9zaXRlLmdldExheW91dERhdGEoKTsKLQkJCQljb21wb3NpdGUuc2V0Qm91bmRzKDAsIDAsIGRhdGEud2lkdGhIaW50LCBkYXRhLmhlaWdodEhpbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlQYW5lLnRoaXMuc3ViamVjdENoYW5nZWQoKFQpIGUuZ2V0T2xkVmFsdWUoKSwgKFQpIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRTdWJQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRvcE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgYXQgdGhlIHRvcCBvZiB0aGUgcGFuZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZFN1YlBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHRvcE1hcmdpbikgewotCQlyZXR1cm4gdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgdG9wTWFyZ2luLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0b3BNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIGF0IHRoZSB0b3Agb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gbGVmdE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgdG8gdGhlIGxlZnQgb2YgdGhlIHBhbmUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRTdWJQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcE1hcmdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdE1hcmdpbikgewotCi0JCXJldHVybiB0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCB0b3BNYXJnaW4sIGxlZnRNYXJnaW4sIDAsIDApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUsIHRoZSBuZXcgd2lkZ2V0Ci0JICogd2lsbCBoYXZlIGl0cyBsYXlvdXQgYW5kIGxheW91dCBkYXRhIGFscmVhZHkgaW5pdGlhbGl6ZWQsIHRoZSBsYXlvdXQgd2lsbAotCSAqIGJlIGEgPGNvZGU+R3JpZExheW91dDwvY29kZT4gd2l0aCAxIGNvbHVtbi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdG9wTWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCBhdCB0aGUgdG9wIG9mIHRoZSBwYW5lCi0JICogQHBhcmFtIGxlZnRNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIHRvIHRoZSBsZWZ0IG9mIHRoZSBwYW5lCi0JICogQHBhcmFtIGJvdHRvbU1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFuZQotCSAqIEBwYXJhbSByaWdodE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgdG8gdGhlIHJpZ2h0IG9mIHRoZSBwYW5lCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkU3ViUGFuZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3BNYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRNYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdHRvbU1hcmdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmlnaHRNYXJnaW4pIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRTdWJQYW5lKAotCQkJY29udGFpbmVyLAotCQkJMSwKLQkJCXRvcE1hcmdpbiwKLQkJCWxlZnRNYXJnaW4sCi0JCQlib3R0b21NYXJnaW4sCi0JCQlyaWdodE1hcmdpbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZSwgdGhlIG5ldyB3aWRnZXQKLQkgKiB3aWxsIGhhdmUgaXRzIGxheW91dCBhbmQgbGF5b3V0IGRhdGEgYWxyZWFkeSBpbml0aWFsaXplZCwgdGhlIGxheW91dCB3aWxsCi0JICogYmUgYSA8Y29kZT5HcmlkTGF5b3V0PC9jb2RlPiB3aXRoIDEgY29sdW1uLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0b3BNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIGF0IHRoZSB0b3Agb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gbGVmdE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgdG8gdGhlIGxlZnQgb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gYm90dG9tTWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYW5lCi0JICogQHBhcmFtIHJpZ2h0TWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCB0byB0aGUgcmlnaHQgb2YgdGhlIHBhbmUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRTdWJQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbkNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3BNYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRNYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdHRvbU1hcmdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmlnaHRNYXJnaW4pIHsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KGNvbHVtbkNvdW50LCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCAgICA9IHRvcE1hcmdpbjsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgICA9IGxlZnRNYXJnaW47Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSBib3R0b21NYXJnaW47Ci0JCWxheW91dC5tYXJnaW5SaWdodCAgPSByaWdodE1hcmdpbjsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBsYXlvdXQpOwotCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCB3aGljaCBjYW4gYmUgdHlwZWQgY2FzdCBkaXJlY3RseSBhcyBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkU3ViU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCkgewotCi0JCXJldHVybiB0aGlzLmFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0YWJsZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIHRvIGFwcGx5IHRvIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0YWJsZSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGhlbHAgSUQgaXMgcmVxdWlyZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRhYmxlPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUYWJsZSBhZGRUYWJsZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBhZGRVbm1hbmFnZWRUYWJsZShjb250YWluZXIsIHN0eWxlLCBoZWxwSWQpOwotCQl0aGlzLm1hbmFnZVdpZGdldCh0YWJsZSk7Ci0KLQkJcmV0dXJuIHRhYmxlOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCB0YWJsZS4gIFVubWFuYWdlZCBtZWFucyB0aGF0IHRoaXMgUGFuZSB3aWxsCi0JICogbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUKLQkgKiBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBhcHBseSB0byB0aGUgdGFibGUKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGFibGUgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBoZWxwIElEIGlzIHJlcXVpcmVkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UYWJsZTwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGFibGUgYWRkVW5tYW5hZ2VkVGFibGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVRhYmxlKGNvbnRhaW5lciwgc3R5bGUpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgICA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gdGFibGUuZ2V0SXRlbUhlaWdodCgpICogNDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0YWJsZSwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRhYmxlLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0YWJsZSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGhlbHAgSUQgaXMgcmVxdWlyZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRhYmxlPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUYWJsZSBhZGRUYWJsZShDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkVGFibGUoCi0JCQljb250YWluZXIsCi0JCQlTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEksCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgdGFibGUuICBVbm1hbmFnZWQgbWVhbnMgdGhhdCB0aGlzIFBhbmUgd2lsbAotCSAqIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4gIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlCi0JICogaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0YWJsZSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGhlbHAgSUQgaXMgcmVxdWlyZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRhYmxlPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUYWJsZSBhZGRVbm1hbmFnZWRUYWJsZShDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkVW5tYW5hZ2VkVGFibGUoCi0JCQljb250YWluZXIsCi0JCQlTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEksCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1hbmFnZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkVGV4dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCVRleHQgdGV4dCA9IHRoaXMuYWRkVW5tYW5hZ2VkVGV4dChjb250YWluZXIpOwotCQl0aGlzLm1hbmFnZVdpZGdldCh0ZXh0KTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4gIFVubWFuYWdlZCBtZWFucyAKLQkgKiB0aGF0IHRoaXMgUGFuZSB3aWxsIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4gIAotCSAqIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgVGV4dCBhZGRVbm1hbmFnZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJVGV4dCB0ZXh0ID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVRleHQoY29udGFpbmVyKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdldEZpZWxkR3JpZERhdGEoKSk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZFRleHQoY29udGFpbmVyKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRleHQsIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LiAgVW5tYW5hZ2VkIG1lYW5zIAotCSAqIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgCi0JICogVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIFRleHQgYWRkVW5tYW5hZ2VkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRVbm1hbmFnZWRUZXh0KGNvbnRhaW5lcik7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0ZXh0LCBoZWxwSWQpOwotCQl9Ci0JCQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmFkZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGV4dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZFRleHQoY29udGFpbmVyLCBoZWxwSWQpOwotCQlTV1RUb29scy5iaW5kKHRleHRIb2xkZXIsIHRleHQpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRUZXh0KAotCQkJQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkJCVN0cmluZyBoZWxwSWQsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZW5hYmxlZE1vZGVsCi0JKSB7Ci0JCVRleHQgdGV4dCA9IHRoaXMuYWRkVW5tYW5hZ2VkVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIsIGhlbHBJZCk7Ci0JCXRoaXMuY29udHJvbEVuYWJsZWRTdGF0ZShlbmFibGVkTW9kZWwsIHRleHQpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuICBVbm1hbmFnZWQgbWVhbnMgCi0JICogdGhhdCB0aGlzIFBhbmUgd2lsbCBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQuICAKLQkgKiBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZSBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRleHQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgVGV4dCBhZGRVbm1hbmFnZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRleHQgdGV4dCA9IHRoaXMuYWRkVW5tYW5hZ2VkVGV4dChjb250YWluZXIsIGhlbHBJZCk7Ci0JCVNXVFRvb2xzLmJpbmQodGV4dEhvbGRlciwgdGV4dCk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgd2l0aCBhIHRpdGxlZCBib3JkZXIuCi0JICoKLQkgKiBAcGFyYW0gdGl0bGUgVGhlIHRleHQgb2YgdGhlIHRpdGxlZCBib3JkZXIKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHdpdGggYSB0aXRsZWQgYm9yZGVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEdyb3VwIGFkZFRpdGxlZEdyb3VwKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyB0aXRsZSkgewotCQlyZXR1cm4gdGhpcy5hZGRUaXRsZWRHcm91cChjb250YWluZXIsIHRpdGxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB3aXRoIGEgdGl0bGVkIGJvcmRlci4KLQkgKgotCSAqIEBwYXJhbSB0aXRsZSBUaGUgdGV4dCBvZiB0aGUgdGl0bGVkIGJvcmRlcgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgZ3JvdXAKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gd2l0aCBhIHRpdGxlZCBib3JkZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgR3JvdXAgYWRkVGl0bGVkR3JvdXAoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gYWRkVGl0bGVkR3JvdXAoY29udGFpbmVyLCB0aXRsZSwgMSwgaGVscElkKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgd2l0aCBhIHRpdGxlZCBib3JkZXIuCi0JICoKLQkgKiBAcGFyYW0gdGl0bGUgVGhlIHRleHQgb2YgdGhlIHRpdGxlZCBib3JkZXIKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGdyb3VwCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHdpdGggYSB0aXRsZWQgYm9yZGVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEdyb3VwIGFkZFRpdGxlZEdyb3VwKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uQ291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJR3JvdXAgZ3JvdXAgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlR3JvdXAoY29udGFpbmVyLCB0aXRsZSk7Ci0JCS8vbWFuYWdlV2lkZ2V0KGdyb3VwKTsgVE9ETyB1bnN1cmUgaWYgSSB3YW50IHRvIG1hbmFnZSBncm91cHMsIAotCQkvL2Fsc28gc2hvdWxkIHByb2JhYmx5IHJlbmFtZSB0aGlzIGFkZFVubWFuYWdlZFRpdGxlZFBhbmUKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dChjb2x1bW5Db3VudCwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoICA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgICAgPSA1OwotCQlsYXlvdXQubWFyZ2luTGVmdCAgID0gNTsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDU7Ci0JCWxheW91dC5tYXJnaW5SaWdodCAgPSA1OwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIG5ldyB0b2dnbGUgYnV0dG9uIChyYWRpbyBidXR0b24gb3IgY2hlY2sgYm94KS4gIAotCSAqIFVubWFuYWdlZCBtZWFucyAgdGhhdCB0aGlzIFBhbmUgd2lsbCBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcgCi0JICogb2YgdGhpcyB3aWRnZXQuIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciAKLQkgKiBvciBDb250cm9sRW5hYmxlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBhZGRVbm1hbmFnZWRUb2dnbGVCdXR0b24oCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQsCi0JICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgU3RyaW5nIGhlbHBJZCwKLQkgICAgICAgIGludCB0b2dnbGVCdXR0b25UeXBlKSB7Ci0JCQotCQlCdXR0b24gYnV0dG9uOwotCQkKLQkJaWYgKHRvZ2dsZUJ1dHRvblR5cGUgPT0gU1dULlBVU0gpIHsKLQkJCWJ1dHRvbiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVQdXNoQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCk7Ci0JCX0KLQkJZWxzZSBpZiAodG9nZ2xlQnV0dG9uVHlwZSA9PSBTV1QuUkFESU8pIHsKLQkJCWJ1dHRvbiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVSYWRpb0J1dHRvbihwYXJlbnQsIGJ1dHRvblRleHQpOwotCQl9Ci0JCWVsc2UgaWYgKHRvZ2dsZUJ1dHRvblR5cGUgPT0gU1dULkNIRUNLKSB7Ci0JCQlidXR0b24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlQ2hlY2tCb3gocGFyZW50LCBidXR0b25UZXh0KTsKLQkJfQotCQllbHNlIHsKLQkJCWJ1dHRvbiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVCdXR0b24ocGFyZW50LCBidXR0b25UZXh0KTsKLQkJfQotCQkKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlTV1RUb29scy5iaW5kKGJvb2xlYW5Ib2xkZXIsIGJ1dHRvbik7Ci0JCQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGJ1dHRvbiwgaGVscElkKTsKLQkJfQotCQkKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0b2dnbGUgYnV0dG9uIChyYWRpbyBidXR0b24gb3IgY2hlY2sgYm94KSB1c2luZyB0aGUgZ2l2ZW4KLQkgKiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBhZGRUb2dnbGVCdXR0b24oCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQsCi0JICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgU3RyaW5nIGhlbHBJZCwKLQkgICAgICAgIGludCB0b2dnbGVCdXR0b25UeXBlKSB7Ci0JCQotCQlCdXR0b24gYnV0dG9uID0gYWRkVW5tYW5hZ2VkVG9nZ2xlQnV0dG9uKAotCQkJCXBhcmVudCwgCi0JCQkJYnV0dG9uVGV4dCwgCi0JCQkJYm9vbGVhbkhvbGRlciwgCi0JCQkJaGVscElkLCAKLQkJCQl0b2dnbGVCdXR0b25UeXBlKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQoYnV0dG9uKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoZWNrIGJveCB0aGF0IGNhbiBoYXZlIDMgc2VsZWN0aW9uIHN0YXRlcyAoc2VsZWN0ZWQsCi0JICogdW5zZWxlY3RlZCBhbmQgcGFydGlhbGx5IHNlbGVjdGVkLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB2YWx1ZSB3aGVyZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIG1lYW5zIHBhcnRpYWxseSBzZWxlY3RlZAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBjaGVjayBib3gKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRyaVN0YXRlQ2hlY2tCb3g8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyaVN0YXRlQ2hlY2tCb3ggYWRkVHJpU3RhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveCgKLQkJCXBhcmVudCwKLQkJCXRleHQsCi0JCQl0aGlzLmdldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCi0JCXRoaXMubWFuYWdlV2lkZ2V0KGNoZWNrQm94LmdldENoZWNrQm94KCkpOwotCi0JCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlib29sZWFuSG9sZGVyLAotCQkJY2hlY2tCb3gKLQkJKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNoZWNrQm94LmdldENoZWNrQm94KCksIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGVjayBib3ggdGhhdCBjYW4gaGF2ZSAzIHNlbGVjdGlvbiBzdGF0ZXMgKHNlbGVjdGVkLAotCSAqIHVuc2VsZWN0ZWQgYW5kIHBhcnRpYWxseSBzZWxlY3RlZC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdmFsdWUgd2hlcmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBtZWFucyBwYXJ0aWFsbHkgc2VsZWN0ZWQKLQkgKiBAcGFyYW0gc3RyaW5nSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN0cmluZyB0byBwdXQgaW4gcGFyZW50aGVzaXMgYWZ0ZXIKLQkgKiB0aGUgY2hlY2sgYm94J3MgdGV4dCB3aGVuIGl0IGlzIHBhcnRpYWxseSBzZWxlY3RlZAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBjaGVjayBib3gKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRyaVN0YXRlQ2hlY2tCb3g8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyaVN0YXRlQ2hlY2tCb3ggYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSB0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3goCi0JCQlwYXJlbnQsCi0JCQl0ZXh0LAotCQkJYm9vbGVhbkhvbGRlciwKLQkJCWhlbHBJZAotCQkpOwotCi0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIoCi0JCQluZXcgTGFiZWxlZEJ1dHRvbihjaGVja0JveC5nZXRDaGVja0JveCgpKSwKLQkJCXN0cmluZ0hvbGRlcgotCQkpOwotCi0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0cyB0aGlzIHBhbmUgdG8gcG9wdWxhdGUgaXRzIHdpZGdldHMgd2l0aCB0aGUgc3ViamVjdCdzIHZhbHVlcy4KLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAiICAgLT5kb1BvcHVsYXRlKCkiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbnRyb2xFbmFibGVkU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29udHJvbC4uLiBjb250cm9scykgewotCQl0aGlzLmNvbnRyb2xFbmFibGVkU3RhdGVfKHRoaXMud3JhcEVuYWJsZWRNb2RlbChib29sZWFuTW9kZWwpLCBjb250cm9scyk7Ci0JfQotCi0JLyoqCi0JICogQXNzdW1lIHRoZSAiZW5hYmxlZCIgbW9kZWxzIGNhbiByZXR1cm4gbnVsbCAod2hpY2ggaXMgdHlwaWNhbCB3aXRoIGFzcGVjdAotCSAqIGFkYXB0ZXJzIGV0Yy4pLgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHdyYXBFbmFibGVkTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIEJvb2xlYW4+KGJvb2xlYW5Nb2RlbCwgTm9uTnVsbEJvb2xlYW5UcmFuc2Zvcm1lci5GQUxTRSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjb250cm9sRW5hYmxlZFN0YXRlXyhQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb250cm9sLi4uIGNvbnRyb2xzKSB7Ci0JCVNXVFRvb2xzLmNvbnRyb2xFbmFibGVkU3RhdGUodGhpcy5hbmRFbmFibGVkTW9kZWwoYm9vbGVhbk1vZGVsKSwgY29udHJvbHMpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBnZXRDb21iaW5lZEVuYWJsZWRNb2RlbCgpIHsKLQkJcmV0dXJuICh0aGlzLmNvbWJpbmVkRW5hYmxlZE1vZGVsICE9IG51bGwpID8gdGhpcy5jb21iaW5lZEVuYWJsZWRNb2RlbCA6IHRoaXMuYmFzZUVuYWJsZWRNb2RlbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGdldENvbWJpbmVkRW5hYmxlbWVudCgpIHsKLQkJQm9vbGVhbiBlbmFibGVkID0gZ2V0Q29tYmluZWRFbmFibGVkTW9kZWwoKS5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gKGVuYWJsZWQgPT0gbnVsbCkgPyB0cnVlIDogZW5hYmxlZC5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYW5kRW5hYmxlZE1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwpIHsKLQkJcmV0dXJuIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwuYW5kKGdldENvbWJpbmVkRW5hYmxlZE1vZGVsKCksIGJvb2xlYW5Nb2RlbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvbnRyb2xsZXJFbmFibGVtZW50Q2hhbmdlZCgpIHsKLQkJZW5hYmxlV2lkZ2V0c18oZ2V0Q29tYmluZWRFbmFibGVtZW50KCkpOwotCX0KLQkKLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBlbmFibGVtZW50IHN0YXRlIG9mIHRoZSB3aWRnZXRzIG9mIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBlbmFibGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGVuYWJsZSB0aGUgd2lkZ2V0cyBvciA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiB0byBkaXNhYmxlIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLmJhc2VFbmFibGVkTW9kZWwuc2V0VmFsdWUoQm9vbGVhbi52YWx1ZU9mKGVuYWJsZWQpKTsKLQkJZW5hYmxlV2lkZ2V0c18oZ2V0Q29tYmluZWRFbmFibGVtZW50KCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZW5hYmxlV2lkZ2V0c18oYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWlmICghIHRoaXMuY29udGFpbmVyLmlzRGlzcG9zZWQoKSkgewotCQkJZm9yIChDb250cm9sIGNvbnRyb2wgOiB0aGlzLm1hbmFnZWRXaWRnZXRzKSB7Ci0JCQkJY29udHJvbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJfQotCQkJCi0JCQlmb3IgKFBhbmU8Pz4gc3ViUGFuZSA6IHRoaXMubWFuYWdlZFN1YlBhbmVzKSB7Ci0JCQkJc3ViUGFuZS5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlbmdhZ2VTdWJqZWN0SG9sZGVyKCkgewotCQl0aGlzLnN1YmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogZW5nYWdlIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycyhUIHN1YmplY3QpIHsKLQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJdGhpcy5lbmdhZ2VMaXN0ZW5lcnNfKHN1YmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc3BlY2lmaWVkIHN1YmplY3QgaXMgbm90IG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnNfKFQgc3ViamVjdCkgewotCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgIiAgIC0+ZW5nYWdlTGlzdGVuZXJzXygiICsgc3ViamVjdCArICcpJyk7Ci0KLQkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5nZXRQcm9wZXJ0eU5hbWVzKCkpIHsKLQkJCXN1YmplY3QuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMuYXNwZWN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZGlzZW5nYWdlIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycyhUIHN1YmplY3QpIHsKLQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJdGhpcy5kaXNlbmdhZ2VMaXN0ZW5lcnNfKHN1YmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc3BlY2lmaWVkIHN1YmplY3QgaXMgbm90IG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnNfKFQgc3ViamVjdCkgewotCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgIiAgIC0+ZGlzZW5nYWdlTGlzdGVuZXJzXygiICsgc3ViamVjdCArICcpJyk7Ci0KLQkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5nZXRQcm9wZXJ0eU5hbWVzKCkpIHsKLQkJCXN1YmplY3QucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMuYXNwZWN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc2VuZ2FnZVN1YmplY3RIb2xkZXIoKSB7Ci0JCXRoaXMuc3ViamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1haW4gPGNvZGU+Q29udHJvbDwvY29kZT4gb2YgdGhpcyBwYW5lLgotCSAqCi0JICogQHJldHVybiBUaGUgbWFpbiBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWJqZWN0IGhvbGRlciB1c2VkIGJ5IHRoaXMgcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxUPiBnZXRTdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy5zdWJqZWN0SG9sZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSB3aWRnZXRzLgotCSAqCi0JICogQHJldHVybiBUaGUgZmFjdG9yeSB1c2VkIGJ5IHRoaXMgcGFuZSB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgV2lkZ2V0RmFjdG9yeSBnZXRXaWRnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy53aWRnZXRGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcmdpbiB0YWtlbiBieSBhIGdyb3VwIGJveCwgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBwaXhlbCB0aGUKLQkgKiBncm91cCBib3ggYm9yZGVyIGFuZCBpdHMgbWFyZ2luIHRha2VzIGJlZm9yZSBkaXNwbGF5aW5nIGl0cyB3aWRnZXRzIHBsdXMKLQkgKiA1IHBpeGVscyBzaW5jZSB0aGUgd2lkZ2V0cyBpbnNpZGUgb2YgdGhlIGdyb3VwIGJveCBhbmQgdGhlIGJvcmRlciBzaG91bGQKLQkgKiBoYXZlIHRoYXQgZXh0cmEgNSBwaXhlbHMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB3aWR0aCB0YWtlbiBieSB0aGUgZ3JvdXAgYm94IGJvcmRlciB3aXRoIGl0cyBtYXJnaW4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgaW50IGdldEdyb3VwQm94TWFyZ2luKCkgewotCQlHcm91cCBncm91cCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVHcm91cChTV1RVdGlsLmdldFNoZWxsKCksICIiKTsKLQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBncm91cC5nZXRDbGllbnRBcmVhKCk7Ci0JCWdyb3VwLmRpc3Bvc2UoKTsKLQkJcmV0dXJuIGNsaWVudEFyZWEueCArIDU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGVscHMgc3lzdGVtLgotCSAqCi0JICogQHJldHVybiBUaGUgcGxhdGZvcm0ncyBoZWxwIHN5c3RlbQotCSAqCi0JICogQGNhdGVnb3J5IEhlbHBlcgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIKLQkgKgotCSAqIEByZXR1cm4KLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzUG9wdWxhdGluZygpIHsKLQkJcmV0dXJuIHRoaXMucG9wdWxhdGluZzsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBtZXNzYWdlIGlmIHRoZSA8Y29kZT5UcmFjaW5nLkRFQlVHX0xBWU9VVDwvY29kZT4gaXMgZW5hYmxlZC4KLQkgKgotCSAqIEBwYXJhbSBmbGFnCi0JICogQHBhcmFtIG1lc3NhZ2UgVGhlIGxvZ2dpbmcgbWVzc2FnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgZmxhZywgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKGZsYWcuZXF1YWxzKFRyYWNpbmcuVUlfTEFZT1VUKSAmJiBUcmFjaW5nLmJvb2xlYW5EZWJ1Z09wdGlvbihUcmFjaW5nLlVJX0xBWU9VVCkpIHsKLQkJCXRoaXMubG9nKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCUNsYXNzPD8+IHRoaXNDbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHRoaXNDbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0KLQkJaWYgKHRoaXNDbGFzcy5pc0Fub255bW91c0NsYXNzKCkpIHsKLQkJCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmluZGV4T2YoJyQnKSk7Ci0JCQljbGFzc05hbWUgKz0gIi0+IiArIHRoaXNDbGFzcy5nZXRTdXBlcmNsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCQl9Ci0KLQkJVHJhY2luZy5sb2coY2xhc3NOYW1lICsgIjogIiArIG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgcGFuZSB0byBwb3B1bGF0ZSBpdHNlbGYgdXNpbmcgdGhlIHN1YmplY3QncyBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZSgpIHsKLQkJaWYgKCF0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAicG9wdWxhdGUoKSIpOwotCQkJdGhpcy5yZXBvcHVsYXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgc3ViamVjdCdzIHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZQotCSAqIGhhcyBjaGFuZ2VkLgotCSAqCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgcHJvcGVydHkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IGNoYW5nZQotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIG5hbWVzIHRvIGxpc3RlbiBmb3IgcHJvcGVydGllcyBjaGFuZ2luZyBmcm9tIHRoZQotCSAqIHN1YmplY3QuCi0JICoKLQkgKiBAcmV0dXJuIEEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMKLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gcHJvcGVydHlOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBwYW5lJ3Mgd2lkZ2V0cyAodGhvc2UgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgd2l0aAotCSAqIGl0cyBsZWZ0IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPikgZnJvbSB0aGlzIHBhbmUncyBsZWZ0Ci0JICogPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+IHNvIHRoYXQgdGhlaXIgd2lkdGggd2lsbCBubyBsb25nZXIgYmUgYWRqdXN0ZWQKLQkgKiB3aXRoIHRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIHdpZGdldHMgdG8gcmVtb3ZlCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVtb3ZlQWxpZ25MZWZ0KFBhbmU8Pz4gcGFuZSkgewotCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lci5yZW1vdmUocGFuZS5sZWZ0Q29udHJvbEFsaWduZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbnRyb2wgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiB3aWRnZXRzIHRoYXQgYXJlIGFsaWduZWQKLQkgKiB0byBoYXZlIHRoZSBzYW1lIHdpZHRoIHdoZW4gdGhleSBhcmUgc2hvd24gdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgMwotCSAqIHdpZGdldCBjb2x1bXMuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB0byByZW1vdmUsIGl0cyB3aWR0aCB3aWxsIG5vIGxvbmdlciBiZQotCSAqIGFqdXN0ZWQgdG8gYmUgdGhlIHdpZHRoIG9mIHRoZSBsb25nZXN0IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbW92ZUFsaWduTGVmdChDb250cm9sIGNvbnRyb2wpIHsKLQkJdGhpcy5sZWZ0Q29udHJvbEFsaWduZXIucmVtb3ZlKGNvbnRyb2wpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHBhbmUncyB3aWRnZXRzICh0aG9zZSB0aGF0IHdlcmUgcmVnaXN0ZXJlZCB3aXRoCi0JICogaXRzIHJpZ2h0IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPikgZnJvbSB0aGlzIHBhbmUncyByaWdodAotCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBzbyB0aGF0IHRoZWlyIHdpZHRoIHdpbGwgbm8gbG9uZ2VyIGJlIGFkanVzdGVkCi0JICogd2l0aCB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSBjb250YWluaW5nIHRoZSB3aWRnZXRzIHRvIHJlbW92ZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbW92ZUFsaWduUmlnaHQoUGFuZTw/PiBwYW5lKSB7Ci0JCXRoaXMucmlnaHRDb250cm9sQWxpZ25lci5yZW1vdmUocGFuZS5yaWdodENvbnRyb2xBbGlnbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb250cm9sIGZyb20gdGhlIGNvbGxlY3Rpb24gb2Ygd2lkZ2V0cyB0aGF0IGFyZSBhbGlnbmVkCi0JICogdG8gaGF2ZSB0aGUgc2FtZSB3aWR0aCB3aGVuIHRoZXkgYXJlIHNob3duIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSAzCi0JICogd2lkZ2V0IGNvbHVtcy4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHRvIHJlbW92ZSwgaXRzIHdpZHRoIHdpbGwgbm8gbG9uZ2VyIGJlCi0JICogYWp1c3RlZCB0byBiZSB0aGUgd2lkdGggb2YgdGhlIGxvbmdlc3Qgd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVtb3ZlQWxpZ25SaWdodChDb250cm9sIGNvbnRyb2wpIHsKLQkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLnJlbW92ZShjb250cm9sKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBwYW5lJ3MgY29udHJvbHMgKHRob3NlIHRoYXQgd2VyZSByZWdpc3RlcmVkIGZvcgotCSAqIGFsaWdubWVudCkgZnJvbSB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSBjb250YWluaW5nIHRoZSB3aWRnZXRzIHRoYXQgbm8gbG9uZ2VyCi0JICogcmVxdWlyZXMgdGhlaXIgd2lkdGggYWRqdXN0ZWQgd2l0aCB0aGUgd2lkdGggb2YgdGhlIGxvbmdlc3Qgd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVtb3ZlUGFuZUZvckFsaWdubWVudChQYW5lPD8+IHBhbmUpIHsKLQkJcmVtb3ZlQWxpZ25MZWZ0KHBhbmUpOwotCQlyZW1vdmVBbGlnblJpZ2h0KHBhbmUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCAocGVyaGFwcyBpbnRlcm5hbGx5KSB3aGVuIHRoaXMgbmVlZHMgdG8gcmVwb3B1bGF0ZQotCSAqIGJ1dCB0aGUgb2JqZWN0IG9mIGludGVyZXN0IGhhcyBub3QgY2hhbmdlZC4KLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlcG9wdWxhdGUoKSB7Ci0KLQkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICIgICAtPnJlcG9wdWxhdGUoKSIpOwotCi0JCS8vIFBvcHVsYXRlIHRoaXMgcGFuZQotCQl0cnkgewotCQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKLQkJCWRvUG9wdWxhdGUoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0KLQkJLy8gQXNrIHRoZSBzdWItcGFuZXMgdG8gcmVwb3B1bGF0ZSB0aGVtc2VsdmVzCi0JCWZvciAoUGFuZTw/PiBzdWJQYW5lIDogdGhpcy5zdWJQYW5lcykgewotCQkJc3ViUGFuZS5yZXBvcHVsYXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbnRlcm5hbCBmbGFnIHRoYXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgcGFuZSBpcyBiZWluZwotCSAqIHBvcHVsYXRlZCBvciBub3QuIER1cmluZyBwb3B1bGF0aW9uLCBpdCBpcyByZXF1aXJlZCB0byBub3QgdXBkYXRlIHRoZQotCSAqIHdpZGdldHMgd2hlbiB0aGUgbW9kZWwgaXMgdXBkYXRlZCBub3IgdG8gdXBkYXRlIHRoZSBtb2RlbCB3aGVuIHRoZSB3aWRnZXRzCi0JICogYXJlIGJlaW5nIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCdzIHZhbHVlcy4KLQkgKgotCSAqIEBwYXJhbSBwb3B1bGF0aW5nCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRQb3B1bGF0aW5nKGJvb2xlYW4gcG9wdWxhdGluZykgewotCQl0aGlzLnBvcHVsYXRpbmcgPSBwb3B1bGF0aW5nOwotCX0KLQotCS8qKgotCSAqIEVpdGhlciBzaG93IG9yIGhpZGVzIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSB2aXNpYmxlIFRoZSBuZXcgdmlzaWJpbGl0eSBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCWlmICghdGhpcy5jb250YWluZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmNvbnRhaW5lci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmVhcmVzdCA8Y29kZT5TaGVsbDwvY29kZT4gZGlzcGxheWluZyB0aGUgbWFpbiB3aWRnZXQgb2YgdGhpcwotCSAqIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBuZWFyZXN0IHdpbmRvdyBkaXNwbGF5aW5nIHRoaXMgcGFuZQotCSAqLwotCXB1YmxpYyBmaW5hbCBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGFpbmVyLmdldFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3ViamVjdCBvZiB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzdWJqZWN0IGlmIHRoaXMgcGFuZSB3YXMgbm90IGRpc3Bvc2VkOyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIGl0IHdhcwotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHVibGljIFQgZ2V0U3ViamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuc3ViamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGhhcyBjaGFuZ2VkLCBkaXNjb25uZWN0cyBhbnkgbGlzdGVuZXJzIGZyb20gdGhlIG9sZCBzdWJqZWN0Ci0JICogYW5kIGNvbm5lY3RzIHRob3NlIGxpc3RlbmVycyBvbnRvIHRoZSBuZXcgc3ViamVjdC4KLQkgKgotCSAqIEBwYXJhbSBvbGRzdWJqZWN0IFRoZSBvbGQgc3ViamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIHdhcyBzZXQKLQkgKiBAcGFyYW0gbmV3U3ViamVjdCBUaGUgbmV3IHN1YmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBuZWVkcyB0byBiZQotCSAqIHNldAotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc3ViamVjdENoYW5nZWQoVCBvbGRTdWJqZWN0LCBUIG5ld1N1YmplY3QpIHsKLQkJaWYgKCF0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQotCQkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICJzdWJqZWN0Q2hhbmdlZCgpIik7Ci0JCQl0aGlzLmRpc2VuZ2FnZUxpc3RlbmVycyhvbGRTdWJqZWN0KTsKLQotCQkJdGhpcy5yZXBvcHVsYXRlKCk7Ci0KLQkJCXRoaXMuZW5nYWdlTGlzdGVuZXJzKG5ld1N1YmplY3QpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYW5vdGhlciA8Y29kZT5QYW5lPC9jb2RlPiB3aXRoIHRoaXMgb25lIHNvIGl0IGNhbgotCSAqIGJlIGF1dG9tYXRpY2FsbHkgbm90aWZpZWQgYWJvdXQgY2VydGFpbiBldmVudHMgc3VjaCBhcyBlbmdhZ2luZyBvcgotCSAqIGRpc2VuZ2FnaW5nIHRoZSBsaXN0ZW5lcnMsIGV0Yy4KLQkgKgotCSAqIEBwYXJhbSBzdWJQYW5lIFRoZSBzdWItcGFuZSB0byByZWdpc3RlcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnRyb2xsZXIKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWdpc3RlclN1YlBhbmUoUGFuZTw/PiBzdWJQYW5lKSB7Ci0JCXRoaXMuc3ViUGFuZXMuYWRkKHN1YlBhbmUpOwotCX0KLQotCS8qKgotCSAqIFVucmVnaXN0ZXJzIHRoZSBnaXZlbiA8Y29kZT5QYW5lPC9jb2RlPiBmcm9tIHRoaXMgb25lIHNvIGl0Ci0JICogY2FuIG5vIGxvbmdlciBiZSBhdXRvbWF0aWNhbGx5IG5vdGlmaWVkIGFib3V0IGNlcnRhaW4gZXZlbnRzIHN1Y2ggYXMKLQkgKiBlbmdhZ2luZyBvciBkaXNlbmdhZ2luZyB0aGUgbGlzdGVuZXJzLCBldGMuCi0JICoKLQkgKiBAcGFyYW0gc3ViUGFuZSBUaGUgc3ViLXBhbmUgdG8gdW5yZWdpc3RlcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnRyb2xsZXIKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCB1bnJlZ2lzdGVyU3ViUGFuZShQYW5lPD8+IHN1YlBhbmUpIHsKLQkJdGhpcy5zdWJQYW5lcy5yZW1vdmUoc3ViUGFuZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhbmUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoIWlzUG9wdWxhdGluZygpICYmICF0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMucG9wdWxhdGluZyA9IHRydWU7Ci0KLQkJCXRyeSB7Ci0JCQkJcHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQl0aGlzLnBvcHVsYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgImRpc3Bvc2UoKSIpOwotCi0JCS8vIERpc3Bvc2UgdGhpcyBwYW5lCi0JCXRoaXMuZGlzZW5nYWdlTGlzdGVuZXJzKGdldFN1YmplY3QoKSk7Ci0JCXRoaXMuZGlzZW5nYWdlU3ViamVjdEhvbGRlcigpOwotCQkKLQkJaWYgKHRoaXMuY29tYmluZWRFbmFibGVkTW9kZWwgIT0gbnVsbCAmJiB0aGlzLmNvbWJpbmVkRW5hYmxlZE1vZGVsTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJdGhpcy5jb21iaW5lZEVuYWJsZWRNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jb21iaW5lZEVuYWJsZWRNb2RlbExpc3RlbmVyKTsKLQkJfQotCQkKLQkJdGhpcy5sZWZ0Q29udHJvbEFsaWduZXIuZGlzcG9zZSgpOwotCQl0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIuZGlzcG9zZSgpOwotCi0JCS8vIEFzayB0aGUgc3ViLXBhbmVzIHRvIGRpc3Bvc2UgdGhlbXNlbHZlcwotCQlmb3IgKFBhbmU8Pz4gc3ViUGFuZSA6IHRoaXMuc3ViUGFuZXMpIHsKLQkJCXN1YlBhbmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Qb3N0RXhlY3V0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1Bvc3RFeGVjdXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI2YjkyMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1Bvc3RFeGVjdXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotCi0vKioKLSAqIFRoaXMgPGNvZGU+UG9zdEV4ZWN1dGlvbjwvY29kZT4gaXMgdXNlZCB0byBwb3N0IGV4ZWN1dGUgYSBwb3J0aW9uIG9mIGNvZGUKLSAqIG9uY2UgYSBkaWFsb2csIHRoYXQgd2FzIGxhdW5jaGVkIGludG8gYSBkaWZmZXJlbnQgVUkgdGhyZWFkLCBoYXMgYmVlbgotICogZGlzcG9zZWQuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9zdEV4ZWN1dGlvbjxUIGV4dGVuZHMgRGlhbG9nPiB7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIHBvc3QgZXhlY3Rpb24gdGhlIGRpYWxvZyB0aGF0IHdhcyBsYXVuY2hlZCBpbnRvIGEgZGlmZmVyZW50Ci0JICogVUkgdGhyZWFkIGhhcyBiZWVuIGRpc3Bvc2VkLgotCSAqCi0JICogQHBhcmFtIGRpYWxvZyBUaGUgZGlhbG9nIHRoYXQgd2FzIGxhdW5jaGVkIGludG8gYSBkaWZmZXJlbnQgdGhyZWFkCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShUIGRpYWxvZyk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1Byb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1Byb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMzIwYTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Qcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgPGNvZGU+V2lkZ2V0RmFjdG9yeTwvY29kZT4gaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSB3aWRnZXRzIHVzaW5nCi0gKiA8Y29kZT5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTwvY29kZT4gaW4gb3JkZXIgdXNlIHRoZSBmb3JtIHN0eWxlCi0gKiAoZmxhdC1zdHlsZSkgbG9vayBhbmQgZmVlbC4KLSAqCi0gKiBAc2VlIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBleHRlbmRzIEZvcm1XaWRnZXRGYWN0b3J5IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGFjdHVhbCBmYWN0b3J5IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgbmV3Ci0JICogd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeShUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGl0bGUpIHsKLQkJcmV0dXJuIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVHcm91cChwYXJlbnQsIHRpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpIHN1cGVyLmdldFdpZGdldEZhY3RvcnkoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9UcmlTdGF0ZUNoZWNrQm94LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1RyaVN0YXRlQ2hlY2tCb3guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmNGM3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1RyaVN0YXRlQ2hlY2tCb3guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgPGNvZGU+VHJpU3RhdGVDaGVja0JveDwvY29kZT4gY2FuIGRpc3BsYXkgb25lIG9mIHRocmVlIHN0YXRlczoKLSAqIHVuY2hlY2tlZCwgY2hlY2tlZCwgb3IgcGFydGlhbGx5IGNoZWNrZWQuIEl0IGNhbiBiZSBtb2RpZmllZCB2aWEgYSBtb3VzZQotICogc2VsZWN0aW9uLCB2aWEgYSBrZXlib2FyZCBzZWxlY3Rpb24sIG9yIHByb2dyYW1tYXRpY2FsbHkuIFRoZSBzZWxlY3Rpb24gc3RhdGUgaXMKLSAqIHJlcHJlc2VudGVkIGJ5IGEgPGNvZGU+Qm9vbGVhbjwvY29kZT4gdmFsdWUgd2hlcmUgYSA8Y29kZT5udWxsPC9jb2RlPgotICogdmFsdWUgbWVhbnMgcGFydGlhbGx5IGNoZWNrZWQuCi0gKiA8cD4KLSAqIFRoZSBvcmRlciBvZiBzdGF0ZSBjaGFuZ2VzIGlzOiB1bmNoZWNrZWQgLT4gcGFydGlhbGx5IGNoZWNrZWQgLT4gY2hlY2tlZC4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJpU3RhdGVDaGVja0JveAotewotCS8qKgotCSAqIEEgY2hlY2sgYm94IGJ1dHRvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBidXR0b247Ci0KLQkvKioKLQkgKiBUaGUgY3VycmVudCBzZWxlY3Rpb24gc3RhdGUuCi0JICovCi0JcHJpdmF0ZSBUcmlTdGF0ZSBzdGF0ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VHJpU3RhdGVDaGVja0JveDwvY29kZT4gd2l0aCBubyB0ZXh0LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSBjaGVjayBib3gKLQkgKi8KLQlwdWJsaWMgVHJpU3RhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJdGhpcyhwYXJlbnQsIG51bGwsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VHJpU3RhdGVDaGVja0JveDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQgVGhlIGNoZWNrIGJveCdzIHRleHQKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgY2hlY2sgYm94Ci0JICovCi0JcHVibGljIFRyaVN0YXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGF0ZSA9IFRyaVN0YXRlLlVOQ0hFQ0tFRDsKLQkJdGhpcy5idXR0b24gPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUNoZWNrQm94KHBhcmVudCwgdGV4dCk7Ci0JCXRoaXMuYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2Q6IEFkZHMgYSBkaXNwb3NlIGxpc3RlbmVyIHRvIHRoZSBjaGVjayBib3guCi0JICogVGhlIHNvdXJjZSBvZiBhbnkgZXZlbnRzIHNlbnQgdG8gdGhlIGxpc3RlbmVyIHdpbGwgYmUgdGhlIGNoZWNrIGJveCB3aWRnZXQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBkaXNwb3NlTGlzdGVuZXIpIHsKLQkJdGhpcy5idXR0b24uYWRkRGlzcG9zZUxpc3RlbmVyKGRpc3Bvc2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kOiBBZGRzIGEgc2VsZWN0aW9uIGxpc3RlbmVyIHRvIHRoZSBjaGVjayBib3guCi0JICogVGhlIHNvdXJjZSBvZiBhbnkgZXZlbnRzIHNlbnQgdG8gdGhlIGxpc3RlbmVyIHdpbGwgYmUgdGhlIGNoZWNrIGJveCB3aWRnZXQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIpIHsKLQkJdGhpcy5idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveC50aGlzLmNoZWNrQm94Q2xpY2tlZCgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFRoZSBjaGVjayBib3ggd2FzIGNsaWNrZWQsIGNoYW5nZSB0aGUgdHJpLXN0YXRlIHRvIHRoZSBuZXh0IHZhbHVlIGFuZAotCSAqIHVwZGF0ZSB0aGUgY2hlY2sgYm94J3Mgc3RhdGUuCi0JICovCi0Jdm9pZCBjaGVja0JveENsaWNrZWQoKSB7Ci0JCXRoaXMuc3RhdGUgPSB0aGlzLm5leHRTdGF0ZSgpOwotCQl0aGlzLnVwZGF0ZUNoZWNrQm94KCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlIGNoZWNrIGJveCB3aWRnZXQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5idXR0b24uZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkJ1dHRvbjwvY29kZT4gdXNlZCB0byBzaG93IGEgdHJpLXN0YXRlIGNoZWNrIGJveC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPkJ1dHRvbjwvY29kZT4gdXNlZCB0byBzaG93IGEgdHJpLXN0YXRlIGNoZWNrIGJveAotCSAqLwotCXB1YmxpYyBCdXR0b24gZ2V0Q2hlY2tCb3goKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGVjayBib3gncyBpbWFnZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGNoZWNrIGJveCdzIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnV0dG9uLmdldEltYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hlY2sgYm94J3Mgc2VsZWN0aW9uIHN0YXRlLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgPGNvZGU+dHJ1ZTwvY29kZT4gb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBjaGVja2VkIG9yCi0JICogdW5jaGVja2VkOyBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgcGFydGlhbGx5IHNlbGVjdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gKHRoaXMuc3RhdGUgPT0gVHJpU3RhdGUuUEFSVElBTExZX0NIRUNLRUQpID8gbnVsbCA6IEJvb2xlYW4udmFsdWVPZih0aGlzLnN0YXRlID09IFRyaVN0YXRlLkNIRUNLRUQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoZWNrIGJveCdzIHRleHQuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB0ZXh0IG9mIHRoZSBjaGVjayBib3gKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbi5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjaGVjayBib3ggaXMgZGlzcG9zZWQuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBib3ggaXMgZGlzcG9zZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjaGVjayBib3ggaXMgZW5hYmxlZC4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIGJveCBpcyBlbmFibGVkOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbi5pc0VuYWJsZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IHN0YXRlOgotCSAqICAgICBVTkNIRUNLRUQgLT4gUEFSVElBTExZX0NIRUNLRUQKLQkgKiAgICAgUEFSVElBTExZX0NIRUNLRUQgLT4gQ0hFQ0tFRAotCSAqICAgICBDSEVDS0VEIC0+IFVOQ0hFQ0tFRAotCSAqLwotCXByaXZhdGUgVHJpU3RhdGUgbmV4dFN0YXRlKCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUpIHsKLQkJCWNhc2UgVU5DSEVDS0VEOgotCQkJCXJldHVybiBUcmlTdGF0ZS5QQVJUSUFMTFlfQ0hFQ0tFRDsKLQkJCWNhc2UgUEFSVElBTExZX0NIRUNLRUQ6Ci0JCQkJcmV0dXJuIFRyaVN0YXRlLkNIRUNLRUQ7Ci0JCQljYXNlIENIRUNLRUQ6Ci0JCQkJcmV0dXJuIFRyaVN0YXRlLlVOQ0hFQ0tFRDsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBzdGF0ZTogIiArIHRoaXMuc3RhdGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kOiBSZW1vdmVzIGEgZGlzcG9zZSBsaXN0ZW5lciBmcm9tIHRoZSBjaGVjayBib3guCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBkaXNwb3NlTGlzdGVuZXIpIHsKLQkJdGhpcy5idXR0b24ucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKGRpc3Bvc2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kOiBSZW1vdmVzIGEgc2VsZWN0aW9uIGxpc3RlbmVyIGZyb20gdGhlIGNoZWNrIGJveC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcikgewotCQl0aGlzLmJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgY2hlY2sgYm94J3MgZW5hYmxlbWVudCBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBlbmFibGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGVuYWJsZSB0aGUgY2hlY2sgYm94IG9yIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIHRvIGRpc2FibGUgaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLmJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNoZWNrIGJveCdzIGltYWdlLgotCSAqCi0JICogQHBhcmFtIGltYWdlIFRoZSBuZXcgaW1hZ2Ugb2YgdGhlIGNoZWNrIGJveAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCXRoaXMuYnV0dG9uLnNldEltYWdlKGltYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBjaGVjayBib3gncyBzZWxlY3Rpb24gc3RhdGUuCi0JICoKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIEVpdGhlciA8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4gZm9yCi0JICogY2hlY2tlZCBhbmQgdW5jaGVja2VkOyBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgcGFydGlhbGx5IHNlbGVjdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKEJvb2xlYW4gc2VsZWN0aW9uKSB7Ci0JCVRyaVN0YXRlIG9sZCA9IHRoaXMuc3RhdGU7Ci0JCXRoaXMuc3RhdGUgPSB0aGlzLnN0YXRlRm9yQm9vbGVhbihzZWxlY3Rpb24pOwotCQlpZiAob2xkICE9IHRoaXMuc3RhdGUpIHsKLQkJCXRoaXMudXBkYXRlQ2hlY2tCb3goKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNoZWNrIGJveCdzIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gdGV4dCBUaGUgbmV3IHRleHQgb2YgdGhlIGNoZWNrIGJveAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy5idXR0b24uc2V0VGV4dCh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0cmktc3RhdGUgY29ycmVzcG9uZGluZyB0byB0aGUgYm9vbGVhbi4KLQkgKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24gVGhlIGJvb2xlYW4gdG8gYmUgY29udmVydGVkIHRvIGEgdHJpLXN0YXRlCi0JICovCi0JcHJpdmF0ZSBUcmlTdGF0ZSBzdGF0ZUZvckJvb2xlYW4oQm9vbGVhbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIChzZWxlY3Rpb24gPT0gbnVsbCkgPyBUcmlTdGF0ZS5QQVJUSUFMTFlfQ0hFQ0tFRCA6Ci0JCQlzZWxlY3Rpb24uYm9vbGVhblZhbHVlKCkgPyBUcmlTdGF0ZS5DSEVDS0VEIDogVHJpU3RhdGUuVU5DSEVDS0VEOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGUgb2YgdGhlIGNoZWNrIGJveCBiYXNlZCBvbiB0aGUgdHJpLXN0YXRlCi0JICogdmFsdWUuCi0JICovCi0Jdm9pZCB1cGRhdGVDaGVja0JveCgpIHsKLQkJc3dpdGNoICh0aGlzLnN0YXRlKSB7Ci0JCQljYXNlIFVOQ0hFQ0tFRDoKLQkJCQl0aGlzLmJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCXRoaXMuYnV0dG9uLnNldEdyYXllZChmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBBUlRJQUxMWV9DSEVDS0VEOgotCQkJCXRoaXMuYnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl0aGlzLmJ1dHRvbi5zZXRHcmF5ZWQodHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENIRUNLRUQ6Ci0JCQkJdGhpcy5idXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCXRoaXMuYnV0dG9uLnNldEdyYXllZChmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gc3RhdGU6ICIgKyB0aGlzLnN0YXRlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFuIGVudW0gY29udGFpbmluZyB0aGUgcG9zc2libGUgc2VsZWN0aW9ucy4KLQkgKi8KLQllbnVtIFRyaVN0YXRlIHsKLQkJQ0hFQ0tFRCwKLQkJUEFSVElBTExZX0NIRUNLRUQsCi0JCVVOQ0hFQ0tFRAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9WYWxpZGF0aW5nRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1ZhbGlkYXRpbmdEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlNmRhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1ZhbGlkYXRpbmdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Qcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoaXMgZGlhbG9nIGlzIHNpbWlsYXIgdG8gaXQgc3VwZXJjbGFzcywgPGNvZGU+RGlhbG9nPC9jb2RlPiwgd2l0aAotICogdGhlIGFkZGVkIHZhbHVlIG9mIGFuIGVycm9yIG1lc3NhZ2UgbGFiZWwgYmVsb3cgdGhlIG1haW4gcGFuZWwuIEEgc3ViY2xhc3MKLSAqIGNhbiBzZXQgdGhpcyBlcnJvciBtZXNzYWdlIGFzIG5lZWRlZCBzbyB0aGF0IGl0IGNhbiBpbmZvcm0gdGhlIHVzZXIgc29tZXRoaW5nCi0gKiBpbmNvcnJlY3QgaGFzIGJlZW4gZW50ZXJlZC4KLSAqIDxwPgotICogSWYgdGhlcmUgaXMgYW4gZXJyb3IgbWVzc2FnZSwgaXQgd2lsbCBiZSBzaG93bi4gSWYgdGhlcmUgaXMgYSB3YXJuaW5nCi0gKiBtZXNzYWdlLCBpdCB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gV2FybmluZyBtZXNzYWdlcwotICogaGF2ZSBhIGRpZmZlcmVudCBpY29uIHRoYW4gZXJyb3IgbWVzc2FnZXMuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWxpZGF0aW5nRGlhbG9nPFQgZXh0ZW5kcyBOb2RlPiBleHRlbmRzIERpYWxvZzxUPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlZhbGlkYXRpbmdEaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICovCi0JcHVibGljIFZhbGlkYXRpbmdEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WYWxpZGF0aW5nRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSB0aXRsZSBUaGUgZGlhbG9nJ3MgdGl0bGUKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGluZ0RpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihwYXJlbnQsIHRpdGxlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlmaW5hbCBOb2RlLlZhbGlkYXRvciBidWlsZFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBOb2RlLlZhbGlkYXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhdXNlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZXN1bWUoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotCQkJCVZhbGlkYXRpbmdEaWFsb2cudGhpcy52YWxpZGF0ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBkZXNjcmlwdGlvbiBwYW5lLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGNsZWFyRXJyb3JNZXNzYWdlKCkgewotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gc2hvd24gaW4gdGhlIGRlc2NyaXB0aW9uIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdGlvbiB1bmRlciB0aGUgZGVzY3JpcHRpb24ncyB0aXRsZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIHNob3duIGluIHRoZSBkZXNjcmlwdGlvbiBwYW5lLgotCSAqCi0JICogQHJldHVybiBUaGUgaW1hZ2Ugb2YgdGhlIGRlc2NyaXB0aW9uIHBhbmUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcwotCSAqIHJlcXVpcmVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldERlc2NyaXB0aW9uSW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpdGxlIG9mIHRoZSBkZXNjcmlwdGlvbiBwYW5lLgotCSAqCi0JICogQHJldHVybiBUaGUgdGl0bGUgc2hvd24gaW4gdGhlIGRlc2NyaXB0aW9uIHBhbmUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsU2l6ZSgpIHsKLQkJUG9pbnQgcmVzdWx0ID0gZ2V0U2hlbGwoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlQb2ludCBwYW5lU2l6ZSA9IGdldFBhbmUoKS5nZXRDb250cm9sKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJaW50IHdpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoNDAwKTsKLQkJcmVzdWx0LnggPSBNYXRoLm1heCh3aWR0aCwgcGFuZVNpemUueCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzVGl0bGVBcmVhKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVUkoKSB7Ci0KLQkJc3VwZXIuaW5pdGlhbGl6ZVVJKCk7Ci0KLQkJLy8gVXBkYXRlIHRoZSBkZXNjcmlwdGlvbiB0aXRsZQotCQlTdHJpbmcgZGVzY3JpcHRpb25UaXRsZSA9IGdldERlc2NyaXB0aW9uVGl0bGUoKTsKLQotCQlpZiAoZGVzY3JpcHRpb25UaXRsZSAhPSBudWxsKSB7Ci0JCQlzZXRUaXRsZShkZXNjcmlwdGlvblRpdGxlKTsKLQkJfQotCi0JCS8vIFVwZGF0ZSB0aGUgZGVzY3JpcHRpb24gdGl0bGUKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZ2V0RGVzY3JpcHRpb24oKTsKLQotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJc2V0TWVzc2FnZShkZXNjcmlwdGlvbik7Ci0JCX0KLQotCQkvLyBVcGRhdGUgdGhlIGRlc2NyaXB0aW9uIGltYWdlCi0JCUltYWdlIGltYWdlID0gZ2V0RGVzY3JpcHRpb25JbWFnZSgpOwotCi0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlzZXRUaXRsZUltYWdlKGltYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGRlc2NyaXB0aW9uIHBhbmUgYnkgc2hvd2luZyB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZSBhbmQgZm9ybWF0Ci0JICogdGhlIHRleHQgd2l0aCB0aGUgZ2l2ZW4gbGlzdCBvZiBhcmd1bWVudHMgaWYgYW55IGV4aXN0cy4KLQkgKgotCSAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGVzY3JpcHRpb24gcGFuZQotCSAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGxpc3Qgb2YgYXJndW1lbnRzIHVzZWQgdG8gZm9ybWF0IHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvck1lc3NhZ2UsIE9iamVjdC4uLiBhcmd1bWVudHMpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKGVycm9yTWVzc2FnZSwgYXJndW1lbnRzKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZXJyb3IgbWVzc2FnZSwgZWl0aGVyIHNob3dzIHRoZSBmaXJzdCBlcnJvciBwcm9ibGVtIG9yIGhpZGVzCi0JICogdGhlIGVycm9yIHBhbmUuIElmIHRoZSBwcm9ncmVzcyBiYXIgaXMgc2hvd24sIHRoZW4gdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbAotCSAqIG5vdCBiZSBzaG93bi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkgewotCQlpZiAoZ2V0U3ViamVjdCgpLmhhc0JyYW5jaFByb2JsZW1zKCkpIHsKLQkJCVByb2JsZW0gcHJvYmxlbSA9IGdldFN1YmplY3QoKS5icmFuY2hQcm9ibGVtcygpLm5leHQoKTsKLQkJCXNldEVycm9yTWVzc2FnZShwcm9ibGVtLm1lc3NhZ2VLZXkoKSwgcHJvYmxlbS5tZXNzYWdlQXJndW1lbnRzKCkpOwotCQl9Ci0JCS8vIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gYWRkIHdhcm5pbmdzIHRvIHRoZSBtb2RlbAotLy8JCWVsc2UgaWYgKHRoaXMuc3ViamVjdCgpLmhhc0JyYW5jaFdhcm5pbmdzKCkpIHsKLS8vCQkJUHJvYmxlbSBwcm9ibGVtID0gdGhpcy5zdWJqZWN0KCkuYnJhbmNoV2FybmluZ3MoKS5uZXh0KCk7Ci0vLwkJCXRoaXMuc2V0V2FybmluZ01lc3NhZ2VLZXkocHJvYmxlbS5nZXRNZXNzYWdlS2V5KCksIHByb2JsZW0uZ2V0TWVzc2FnZUFyZ3VtZW50cygpKTsKLS8vCQl9Ci0JCWVsc2UgewotCQkJY2xlYXJFcnJvck1lc3NhZ2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgc3RhdGUgb2JqZWN0IGFuZCBiYXNlZCBvbiBpdHMgc3RhdHVzLCB1cGRhdGUgdGhlIGRlc2NyaXB0aW9uCi0JICogcGFuZSB0byBzaG93IHRoZSBmaXJzdCBlcnJvciBpZiBhbnkgZXhpc3RzIGFuZCB1cGRhdGUgdGhlIGVuYWJsZW1lbnQgb2YKLQkgKiB0aGUgT0sgYnV0dG9uLgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJZ2V0U3ViamVjdCgpLnZhbGlkYXRlQnJhbmNoKCk7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoIWdldFN1YmplY3QoKS5oYXNCcmFuY2hQcm9ibGVtcygpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNDk0YTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJvcGVydGllcy5KcGFQcm9qZWN0UHJvcGVydGllc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLQotLyoqCi0gKiBNb3N0IG9mIHRoZSBiZWhhdmlvciBpcyBpbiBEYXRhYmFzZUdyb3VwLi4uLgotICogCi0gKiBXZSBvcGVuIHRoZSB3aXphcmQgcGFnZSB3aXRoIHRoZSBKUEEgcHJvamVjdCdzIGNvbm5lY3Rpb24gcHJvZmlsZSBhbmQKLSAqIGRlZmF1bHQgc2NoZW1hIHNlbGVjdGVkIChpZiBwb3NzaWJsZSksIGJ1dCB0aGVuIHRoZSBzZWxlY3Rpb25zIGFyZSBkcml2ZW4KLSAqIGJ5IHRoZSB1c2VyLiBJZiB0aGUgdXNlciByZS1zZWxlY3RzIHRoZSBKUEEgcHJvamVjdCdzIGNvbm5lY3Rpb24gcHJvZmlsZSwKLSAqIHdlIHdpbGwgcHJlLXNlbGVjdCB0aGUgcHJvamVjdCdzIGRlZmF1bHQgc2NoZW1hIGlmIHBvc3NpYmxlLgotICovCi1wdWJsaWMgY2xhc3MgRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQlmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0KLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCi0JcHJpdmF0ZSBEYXRhYmFzZUdyb3VwIGRhdGFiYXNlR3JvdXA7Ci0KLQotCXB1YmxpYyBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXN1cGVyKCJEYXRhYmFzZSBTY2hlbWEiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoanBhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQl0aGlzLnNldFRpdGxlKEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3RpdGxlKTsKLQkJdGhpcy5zZXRNZXNzYWdlKEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2Rlc2MpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCXRoaXMuc2V0Q29udHJvbCh0aGlzLmJ1aWxkVG9wTGV2ZWxDb250cm9sKHBhcmVudCkpOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRvcExldmVsQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl0aGlzLmRhdGFiYXNlR3JvdXAgPSBuZXcgRGF0YWJhc2VHcm91cChjb21wb3NpdGUpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5QUk9QRVJUSUVTX0pBVkFfUEVSU0lTVEVOQ0VfQ09OTkVDVElPTik7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIGdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCX0KLQkKLQlwdWJsaWMgU2NoZW1hIGdldFNlbGVjdGVkU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZUdyb3VwLmdldFNlbGVjdGVkU2NoZW1hKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5kYXRhYmFzZUdyb3VwLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXZvaWQgZmlyZVNjaGVtYUNoYW5nZWQoU2NoZW1hIHNjaGVtYSkgewotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShzY2hlbWEgIT0gbnVsbCk7Ci0JCWZvciAoTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJbGlzdGVuZXIuc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKHNjaGVtYSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXIgaW50ZXJmYWNlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbG93cyBjbGllbnRzIHRvIGxpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlCi0JICogYW5kIHNjaGVtYS4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0JCXZvaWQgc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKFNjaGVtYSBzY2hlbWEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkYXRhYmFzZSBncm91cCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzY2hlbWEgY29tYm8tYm94Ci0JICogYWRkIHByb2plY3QgY29ubmVjdGlvbiBsaW5rCi0JICogcmVjb25uZWN0IGxpbmsKLQkgKi8KLQljbGFzcyBEYXRhYmFzZUdyb3VwIHsKLQotCQkvLyB0aGVzZSBhcmUga2VwdCBpbiBzeW5jaCB3aXRoIHRoZSBzZWxlY3Rpb24KLQkJcHJpdmF0ZSBTY2hlbWEgc2VsZWN0ZWRTY2hlbWE7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBzY2hlbWFDb21ib0JveDsKLQotCQlwcml2YXRlIGZpbmFsIExpbmsgcmVjb25uZWN0TGluazsKLQotCQlwcml2YXRlIExpbmsgYWRkSnBhUHJvamVjdENvbm5lY3Rpb25MaW5rOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCi0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JCURhdGFiYXNlR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJc3VwZXIoKTsKLQotCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsgIC8vIGZhbHNlID0gZG8gbm90IG1ha2UgY29sdW1ucyBlcXVhbCB3aWR0aAotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlncm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3NjaGVtYVNldHRpbmdzKTsKLQkJCS8vIFRPRE8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLmdyb3VwLCBKcGFIZWxwQ29udGV4dElkcy5YWFgpOwotCi0JCQkvLyBzY2hlbWEgY29tYm8tYm94Ci0JCQl0aGlzLmJ1aWxkTGFiZWwoZ3JvdXAsIDEsIEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3NjaGVtYSk7Ci0JCQl0aGlzLnNjaGVtYUNvbWJvQm94ID0gdGhpcy5idWlsZENvbWJvQm94KGdyb3VwLCB0aGlzLmJ1aWxkU2NoZW1hQ29tYm9Cb3hTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCQotCQkJU3RyaW5nIG1lc3NhZ2UgPSAodGhpcy5wcm9qZWN0SGFzQUNvbm5lY3Rpb24oKSkgPwotCQkJCUpwdFVpTWVzc2FnZXMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3NjaGVtYUluZm8gOgotCQkJCUpwdFVpTWVzc2FnZXMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2Nvbm5lY3Rpb25JbmZvOwotCQkJCi0JCQl0aGlzLmJ1aWxkTGFiZWwoZ3JvdXAsIDIsIG1lc3NhZ2UpOwotCi0JCQkvLyBhZGQgcHJvamVjdCdzIGNvbm5lY3Rpb24gbGluawotCQkJaWYoICEgdGhpcy5wcm9qZWN0SGFzQUNvbm5lY3Rpb24oKSkgewotCQkJCXRoaXMuYWRkSnBhUHJvamVjdENvbm5lY3Rpb25MaW5rID0gdGhpcy5idWlsZExpbmsoZ3JvdXAsIAotCQkJCQkJCUpwdFVpTWVzc2FnZXMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2FkZENvbm5lY3Rpb25Ub1Byb2plY3QsIAotCQkJCQkJCXRoaXMuYnVpbGRBZGRKcGFQcm9qZWN0Q29ubmVjdGlvbkxpbmtMaXN0ZW5lcigpKTsKLQkJCX0KLQotCQkJLy8gcmVjb25uZWN0IGxpbmsKLQkJCXRoaXMucmVjb25uZWN0TGluayA9IHRoaXMuYnVpbGRMaW5rKGdyb3VwLCBKcHRVaU1lc3NhZ2VzLkRhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV9jb25uZWN0TGluaywgdGhpcy5idWlsZFJlY29ubmVjdExpbmtTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCXRoaXMucmVjb25uZWN0TGluay5zZXRFbmFibGVkKHRydWUpOwotCi0JCQl0aGlzLnNlbGVjdGVkU2NoZW1hID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJCWlmICh0aGlzLnNlbGVjdGVkU2NoZW1hICE9IG51bGwpIHsKLQkJCQlEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UudGhpcy5maXJlU2NoZW1hQ2hhbmdlZCh0aGlzLnNlbGVjdGVkU2NoZW1hKTsKLQkJCX0KLQotCQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCQl0aGlzLmFkZEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQotCQkJdGhpcy51cGRhdGVTY2hlbWFDb21ib0JveCgpOwotCQkJdGhpcy51cGRhdGVSZWNvbm5lY3RMaW5rKCk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JCVNjaGVtYSBnZXRTZWxlY3RlZFNjaGVtYSgpIHsKLQkJCXJldHVybiB0aGlzLnNlbGVjdGVkU2NoZW1hOwotCQl9Ci0KLQkJdm9pZCBkaXNwb3NlKCkgewotCQkJaWYodGhpcy5wcm9qZWN0SGFzQUNvbm5lY3Rpb24oKSkgewotCQkJCXRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCQl2b2lkIGFkZEpwYVByb2plY3RDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQl0aGlzLmFkZEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCQkKLQkJCi0JCXByaXZhdGUgdm9pZCBhZGRKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCWlmKHRoaXMucHJvamVjdEhhc0FDb25uZWN0aW9uKCkpIHsKLQkJCQl0aGlzLmdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gcHJvamVjdEhhc0FDb25uZWN0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgIT0gbnVsbDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIHRoaXMgY2FuIHJldHVybiBudWxsOwotCQkgKiBjYWxsZWQgYXQgc3RhcnQtdXAgYW5kIHdoZW4gdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gcHJvZmlsZSBjaGFuZ2VzCi0JCSAqLwotCQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJCXJldHVybiBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UudGhpcy5qcGFQcm9qZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogdGhpcyBjYW4gcmV0dXJuIG51bGw7Ci0JCSAqIGNhbGxlZCBhdCBzdGFydC11cCBhbmQgd2hlbiB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlIGNoYW5nZXMKLQkJICovCi0JCXByaXZhdGUgU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCQlyZXR1cm4gRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlLnRoaXMuanBhUHJvamVjdC5nZXREZWZhdWx0RGJTY2hlbWEoKTsKLQkJfQotCi0JCXByaXZhdGUgU2NoZW1hQ29udGFpbmVyIGdldERlZmF1bHRTY2hlbWFDb250YWluZXIoKSB7Ci0JCQlyZXR1cm4gRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlLnRoaXMuanBhUHJvamVjdC5nZXREZWZhdWx0RGJTY2hlbWFDb250YWluZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBjYWxsZWQgYXQgc3RhcnQtdXAgYW5kIHdoZW4gdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gcHJvZmlsZSBjaGFuZ2VzCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgdXBkYXRlUmVjb25uZWN0TGluaygpIHsKLQkJCXRoaXMucmVjb25uZWN0TGluay5zZXRFbmFibGVkKHRoaXMucmVjb25uZWN0TGlua0NhbkJlRW5hYmxlZCgpKTsKLQkJfQotCi0JCXZvaWQgdXBkYXRlQWRkSnBhUHJvamVjdENvbm5lY3Rpb25MaW5rKCkgewotCQkJdGhpcy5hZGRKcGFQcm9qZWN0Q29ubmVjdGlvbkxpbmsuc2V0RW5hYmxlZCh0aGlzLmFkZEpwYVByb2plY3RDb25uZWN0aW9uTGlua0NhbkJlRW5hYmxlZCgpKTsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiByZWNvbm5lY3RMaW5rQ2FuQmVFbmFibGVkKCkgewotCQkJaWYodGhpcy5wcm9qZWN0SGFzQUNvbm5lY3Rpb24oKSkgewotCQkJCXJldHVybiB0aGlzLmdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpLmlzSW5hY3RpdmUoKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBhZGRKcGFQcm9qZWN0Q29ubmVjdGlvbkxpbmtDYW5CZUVuYWJsZWQoKSB7Ci0JCQlyZXR1cm4gISB0aGlzLnByb2plY3RIYXNBQ29ubmVjdGlvbigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHRoZSBzY2hlbWEgY29tYm8tYm94IGlzIHVwZGF0ZWQgYXQgc3RhcnQtdXAgYW5kCi0JCSAqIHdoZW4gdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gcHJvZmlsZSBjaGFuZ2VzCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgdXBkYXRlU2NoZW1hQ29tYm9Cb3goKSB7Ci0JCQl0aGlzLnNjaGVtYUNvbWJvQm94LnJlbW92ZUFsbCgpOwotCQkJZm9yIChTdHJpbmcgbmFtZSA6IHRoaXMuZ2V0U2NoZW1hTmFtZXMoKSkgewotCQkJCXRoaXMuc2NoZW1hQ29tYm9Cb3guYWRkKG5hbWUpOwotCQkJfQotCQkJLy8gdGhlIGN1cnJlbnQgc2NoZW1hICpzaG91bGQqIGJlIGluIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gcHJvZmlsZQotCQkJaWYgKHRoaXMuc2VsZWN0ZWRTY2hlbWEgIT0gbnVsbCkgewotCQkJCXRoaXMuc2NoZW1hQ29tYm9Cb3guc2VsZWN0KHRoaXMuc2NoZW1hQ29tYm9Cb3guaW5kZXhPZih0aGlzLnNlbGVjdGVkU2NoZW1hLmdldE5hbWUoKSkpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGdldFNjaGVtYU5hbWVzKCkgewotCQkJU2NoZW1hQ29udGFpbmVyIHNjID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hQ29udGFpbmVyKCk7Ci0JCQkvLyB1c2Ugc2NoZW1hICpuYW1lcyogc2luY2UgdGhlIGNvbWJvLWJveCBpcyByZWFkLW9ubHkKLQkJCXJldHVybiAoc2MgIT0gbnVsbCkgPyBzYy5nZXRTb3J0ZWRTY2hlbWFOYW1lcygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGxpc3RlbmVyIGNhbGxiYWNrcyAqKioqKioqKioqCi0KLQkJdm9pZCBzZWxlY3RlZFNjaGVtYUNoYW5nZWQoKSB7Ci0JCQlTY2hlbWEgb2xkID0gdGhpcy5zZWxlY3RlZFNjaGVtYTsKLQkJCXRoaXMuc2VsZWN0ZWRTY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWFDb250YWluZXIoKS5nZXRTY2hlbWFOYW1lZCh0aGlzLnNjaGVtYUNvbWJvQm94LmdldFRleHQoKSk7Ci0JCQlpZiAodGhpcy5zZWxlY3RlZFNjaGVtYSAhPSBvbGQpIHsKLQkJCQlEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UudGhpcy5maXJlU2NoZW1hQ2hhbmdlZCh0aGlzLnNlbGVjdGVkU2NoZW1hKTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgcmVjb25uZWN0KCkgewotCQkJdGhpcy5nZXRKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKS5jb25uZWN0KCk7Ci0JCQkvLyBldmVyeXRoaW5nIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQgd2hlbiB3ZSBnZXQgdGhlIHJlc3VsdGluZyBvcGVuIGV2ZW50Ci0JCX0KLQotCQkvKioKLQkJICogY2FsbGVkIHdoZW4KLQkJICogICAgIC0gYSBjb25uZWN0aW9uIGlzIHNldCB0byB0aGUgSnBhIHByb2plY3QKLQkJICogICAgIC0gdGhlIGNvbm5lY3Rpb24gd2FzIG9wZW5lZAotCQkgKiAgICAgLSB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIChuZXZlciBoYXBwZW5zPykKLQkJICogd2UgbmVlZCB0byB1cGRhdGUgdGhlIHNjaGVtYSBzdHVmZiBhbmQgdGhlIHJlY29ubmVjdCBsaW5rCi0JCSAqLwotCQl2b2lkIGNvbm5lY3Rpb25DaGFuZ2VkKCkgewotCQkJU2NoZW1hIG9sZCA9IHRoaXMuc2VsZWN0ZWRTY2hlbWE7Ci0JCQl0aGlzLnNlbGVjdGVkU2NoZW1hID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCQlpZiAodGhpcy5zZWxlY3RlZFNjaGVtYSAhPSBvbGQpIHsKLQkJCQlEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UudGhpcy5maXJlU2NoZW1hQ2hhbmdlZCh0aGlzLnNlbGVjdGVkU2NoZW1hKTsKLQkJCX0KLQkJCXRoaXMudXBkYXRlU2NoZW1hQ29tYm9Cb3goKTsKLQkJCXRoaXMudXBkYXRlUmVjb25uZWN0TGluaygpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFNjaGVtYUNvbWJvQm94U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQkvLyBub3RoaW5nIHNwZWNpYWwgZm9yICJkZWZhdWx0IiAoZG91YmxlLWNsaWNrPykKLQkJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCURhdGFiYXNlR3JvdXAudGhpcy5zZWxlY3RlZFNjaGVtYUNoYW5nZWQoKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQkJcmV0dXJuICJEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2Ugc2NoZW1hIGNvbWJvLWJveCBzZWxlY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRSZWNvbm5lY3RMaW5rU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJRGF0YWJhc2VHcm91cC50aGlzLnJlY29ubmVjdCgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gIkRhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZSByZWNvbm5lY3QgbGluayBzZWxlY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKLQkJCQkJdGhpcy5jb25uZWN0aW9uQ2hhbmdlZCgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUgIC8vIHRoaXMgcHJvYmFibHkgd29uJ3QgZXZlciBnZXQgY2FsbGVkLi4uCi0JCQkJcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb25Qcm9maWxlIGNwKSB7Ci0JCQkJCXRoaXMuY29ubmVjdGlvbkNoYW5nZWQoKTsKLQkJCQl9Ci0JCQkJcHJpdmF0ZSB2b2lkIGNvbm5lY3Rpb25DaGFuZ2VkKCkgewotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlEYXRhYmFzZUdyb3VwLnRoaXMuY29ubmVjdGlvbkNoYW5nZWQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCSk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlIGNvbm5lY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRBZGRKcGFQcm9qZWN0Q29ubmVjdGlvbkxpbmtMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCURhdGFiYXNlR3JvdXAudGhpcy5wcm9tcHRUb0NvbmZpZ0pwYVByb2plY3RDb25uZWN0aW9uKCk7Ci0JCQkJCQotCQkJCQlEYXRhYmFzZUdyb3VwLnRoaXMuYWRkSnBhUHJvamVjdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQkJCQlEYXRhYmFzZUdyb3VwLnRoaXMudXBkYXRlQWRkSnBhUHJvamVjdENvbm5lY3Rpb25MaW5rKCk7Ci0JCQkJCURhdGFiYXNlR3JvdXAudGhpcy5jb25uZWN0aW9uQ2hhbmdlZCgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gIkRhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZSBBZGRQcm9qZWN0Q29ubmVjdGlvbiBsaW5rIHNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJdm9pZCBwcm9tcHRUb0NvbmZpZ0pwYVByb2plY3RDb25uZWN0aW9uKCkgewotCQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPQotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcm9wZXJ0eURpYWxvZ09uKAotCQkJCQlnZXRTaGVsbCgpLCBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UudGhpcy5qcGFQcm9qZWN0LmdldFByb2plY3QoKSwKLQkJCQkJSnBhUHJvamVjdFByb3BlcnRpZXNQYWdlLlBST1BfSUQsCi0JCQkJCW51bGwsCi0JCQkJCW51bGwpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBsYWJlbAotCQkgKi8KLQkJcHJpdmF0ZSBMYWJlbCBidWlsZExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzcGFuLCBTdHJpbmcgdGV4dCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBjb21iby1ib3gKLQkJICovCi0JCXByaXZhdGUgQ29tYm8gYnVpbGRDb21ib0JveChDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXJldHVybiBjb21ibzsKLQkJfQotCi0JCS8qKgotCQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgbGluawotCQkgKi8KLQkJcHJpdmF0ZSBMaW5rIGJ1aWxkTGluayhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCUxpbmsgbGluayA9IG5ldyBMaW5rKHBhcmVudCwgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJbGluay5zZXRUZXh0KHRleHQpOwotCQkJbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlyZXR1cm4gbGluazsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0pwYUZhY2V0QWN0aW9uUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFGYWNldEFjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhNWJmNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0pwYUZhY2V0QWN0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5MaWJyYXJ5SW5zdGFsbERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5saWJwcm92LkxpYnJhcnlQcm92aWRlckZyYW1ld29ya1VpOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLkRhdGFNb2RlbEZhY2V0SW5zdGFsbFBhZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKcGFGYWNldEFjdGlvblBhZ2UKLQlleHRlbmRzIERhdGFNb2RlbEZhY2V0SW5zdGFsbFBhZ2UKLQlpbXBsZW1lbnRzIEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcwotewotCXByb3RlY3RlZCBKcGFGYWNldEFjdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kZXNjcmlwdGlvbik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKcHRVaVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoSnB0VWlJY29ucy5KUEFfV0laX0JBTk5FUikpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJYWRkU3ViQ29tcG9zaXRlcyhjb21wb3NpdGUpOwotCQkKLQkJc2V0VXBSdW50aW1lTGlzdGVuZXIoKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIEpwYUhlbHBDb250ZXh0SWRzLkRJQUxPR19KUEFfRkFDRVQpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgIGFkZFN1YkNvbXBvc2l0ZXMoQ29tcG9zaXRlIGNvbXBvc2l0ZSk7Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFVwUnVudGltZUxpc3RlbmVyKCkgewotCSAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSB3YyA9ICggKE1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkKSBnZXRXaXphcmQoKSApLmdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKTsKLQkJLy8gbXVzdCBkbyBpdCBtYW51YWxseSB0aGUgZmlyc3QgdGltZQotCQltb2RlbC5zZXRQcm9wZXJ0eShSVU5USU1FLCB3Yy5nZXRQcmltYXJ5UnVudGltZSgpKTsKLQkJd2MuYWRkTGlzdGVuZXIoCi0JCQluZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkgewotCQkJCQltb2RlbC5zZXRQcm9wZXJ0eShSVU5USU1FLCB3Yy5nZXRQcmltYXJ5UnVudGltZSgpKTsKLQkJCQl9Ci0JCQl9LAotCQkJSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUklNQVJZX1JVTlRJTUVfQ0hBTkdFRAotCQkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5OT05FIHwgc3R5bGUpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCQotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgYm9vbGVhbiBmaWxsSG9yaXpvbnRhbCkgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkOwotCQlpZiAoZmlsbEhvcml6b250YWwpIHsKLQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQl9Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKLQkJCVBMQVRGT1JNLAotCQkJQ09OTkVDVElPTiwKLQkJCVVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HLAotCQkJVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0csCi0JCQlVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLAotCQkJVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwKLQkJCURJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLAotCQkJTElCUkFSWV9QUk9WSURFUl9ERUxFR0FURQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKCEgc3VwZXIuaXNQYWdlQ29tcGxldGUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBtb2RlbC52YWxpZGF0ZSgpOyAKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX07Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hIZWxwU3lzdGVtIGdldEhlbHBTeXN0ZW0oKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGZpbmFsIGNsYXNzIFBsYXRmb3JtR3JvdXAKLQl7Ci0JCXByaXZhdGUgZmluYWwgQ29tYm8gcGxhdGZvcm1Db21ibzsKLQkJCi0JCQotCQlwdWJsaWMgUGxhdGZvcm1Hcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfcGxhdGZvcm1MYWJlbCk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLkRJQUxPR19KUEFfUExBVEZPUk0pOwotCi0JCQlwbGF0Zm9ybUNvbWJvID0gY3JlYXRlQ29tYm8oZ3JvdXAsIDEsIHRydWUpOwotCQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhwbGF0Zm9ybUNvbWJvLCBQTEFURk9STSwgbnVsbCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGZpbmFsIGNsYXNzIENsYXNzcGF0aENvbmZpZ0dyb3VwCi0JewotCQlwdWJsaWMgQ2xhc3NwYXRoQ29uZmlnR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJCi0JCQlmaW5hbCBMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGxpYnJhcmllc0luc3RhbGxEZWxlZ2F0ZQotCQkJCT0gKExpYnJhcnlJbnN0YWxsRGVsZWdhdGUpIGdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KExJQlJBUllfUFJPVklERVJfREVMRUdBVEUpOwotCQkJCi0JCQlmaW5hbCBDb21wb3NpdGUgbGlicmFyaWVzQ29tcG9zaXRlIAotCQkJCT0gKENvbXBvc2l0ZSkgTGlicmFyeVByb3ZpZGVyRnJhbWV3b3JrVWkuY3JlYXRlSW5zdGFsbExpYnJhcnlQYW5lbCgKLQkJCQkJY29tcG9zaXRlLCBsaWJyYXJpZXNJbnN0YWxsRGVsZWdhdGUsIAotCQkJCQlKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9qcGFJbXBsZW1lbnRhdGlvbkxhYmVsICk7Ci0JCQlsaWJyYXJpZXNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGxpYnJhcmllc0NvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9DTEFTU1BBVEgpOwkJCQotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBmaW5hbCBjbGFzcyBQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAKLQl7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGRpc2NvdmVyQ2xhc3Nlc0J1dHRvbjsKLQkJCi0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGxpc3RDbGFzc2VzQnV0dG9uOwotCQkKLQkJCi0JCXB1YmxpYyBQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlncm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3BlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRMYWJlbCk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfQ0xBU1NQQVRIKTsKLQkJCQotCQkJZGlzY292ZXJDbGFzc2VzQnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kaXNjb3ZlckNsYXNzZXNCdXR0b24sIFNXVC5SQURJTyk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGRpc2NvdmVyQ2xhc3Nlc0J1dHRvbiwgRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIG51bGwpOwotCQkJCi0JCQlsaXN0Q2xhc3Nlc0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihncm91cCwgMSwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfbGlzdENsYXNzZXNCdXR0b24sIFNXVC5SQURJTyk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGxpc3RDbGFzc2VzQnV0dG9uLCBMSVNUX0FOTk9UQVRFRF9DTEFTU0VTLCBudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvSnBhRmFjZXRJbnN0YWxsUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFGYWNldEluc3RhbGxQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MGU0NzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFGYWNldEluc3RhbGxQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi51aS5pbnRlcm5hbC5EVFBVaVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1wdWJsaWMgY2xhc3MgSnBhRmFjZXRJbnN0YWxsUGFnZQotCWV4dGVuZHMgSnBhRmFjZXRBY3Rpb25QYWdlCi0JaW1wbGVtZW50cyBKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzCi17Ci0JcHVibGljIEpwYUZhY2V0SW5zdGFsbFBhZ2UoKSB7Ci0JCXN1cGVyKCJqcHQuanBhLmZhY2V0Lmluc3RhbGwucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9KUEFfRkFDRVQpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdWJDb21wb3NpdGVzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJbmV3IFBsYXRmb3JtR3JvdXAoY29tcG9zaXRlKTsKLQkJbmV3IENsYXNzcGF0aENvbmZpZ0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCW5ldyBDb25uZWN0aW9uR3JvdXAoY29tcG9zaXRlKTsKLQkJbmV3IFBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cChjb21wb3NpdGUpOwotCQluZXcgT3JtWG1sR3JvdXAoY29tcG9zaXRlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlTdHJpbmdbXSB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCk7Ci0JCXJldHVybiBBcnJheVRvb2xzLmFkZEFsbCgKLQkJCQl2YWxpZGF0aW9uUHJvcGVydHlOYW1lcywKLQkJCQlVU0VSX1dBTlRTX1RPX0FERF9EQl9EUklWRVJfSkFSU19UT19DTEFTU1BBVEgsCi0JCQkJREJfRFJJVkVSX05BTUUpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgZmluYWwgY2xhc3MgQ29ubmVjdGlvbkdyb3VwCi0JewotCQlwcml2YXRlIGZpbmFsIENvbWJvIGNvbm5lY3Rpb25Db21ibzsKLQkJCi0JCXByaXZhdGUgTGluayBjb25uZWN0aW9uTGluazsKLQkJCi0JCXByaXZhdGUgTGluayBjb25uZWN0TGluazsKLQkJCi0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGFkZERyaXZlckxpYnJhcnlCdXR0b247Ci0JCQotCQlwcml2YXRlIGZpbmFsIExhYmVsIGRyaXZlckxpYnJhcnlMYWJlbDsKLQkJCi0JCXByaXZhdGUgZmluYWwgQ29tYm8gZHJpdmVyTGlicmFyeUNvbWJvOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0J1dHRvbjsKLQkJCi0JCXByaXZhdGUgZmluYWwgTGFiZWwgZGVmYXVsdENhdGFsb2dMYWJlbDsKLQkJCi0JCXByaXZhdGUgZmluYWwgQ29tYm8gZGVmYXVsdENhdGFsb2dDb21ibzsKLQkJCi0JCXByaXZhdGUgZmluYWwgQnV0dG9uIG92ZXJyaWRlRGVmYXVsdFNjaGVtYUJ1dHRvbjsKLQkJCi0JCXByaXZhdGUgZmluYWwgTGFiZWwgZGVmYXVsdFNjaGVtYUxhYmVsOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBkZWZhdWx0U2NoZW1hQ29tYm87Ci0JCQotCQkKLQkJcHVibGljIENvbm5lY3Rpb25Hcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxhYmVsKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBKcGFIZWxwQ29udGV4dElkcy5ORVdfSlBBX1BST0pFQ1RfQ09OVEVOVF9QQUdFX0RBVEFCQVNFKTsKLQkJCQotCQkJY29ubmVjdGlvbkNvbWJvID0gY3JlYXRlQ29tYm8oZ3JvdXAsIDMsIHRydWUpOwotCQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhjb25uZWN0aW9uQ29tYm8sIENPTk5FQ1RJT04sIG51bGwpOwotCQkJY29ubmVjdGlvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJdXBkYXRlQ29ubmVjdGlvblN0YXR1cygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkKLQkJCWNvbm5lY3Rpb25MaW5rID0gbmV3IExpbmsoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWNvbm5lY3Rpb25MaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQljb25uZWN0aW9uTGluay5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MaW5rKTsKLQkJCWNvbm5lY3Rpb25MaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJb3Blbk5ld0Nvbm5lY3Rpb25XaXphcmQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCQkKLQkJCWNvbm5lY3RMaW5rID0gbmV3IExpbmsoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWNvbm5lY3RMaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQljb25uZWN0TGluay5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3RMaW5rKTsKLQkJCWNvbm5lY3RMaW5rLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY29ubmVjdExpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlvcGVuQ29ubmVjdGlvblByb2ZpbGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCi0JCQlhZGREcml2ZXJMaWJyYXJ5QnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAzLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9hZGREcml2ZXJMaWJyYXJ5TGFiZWwsIFNXVC5DSEVDSyk7Ci0JCQlhZGREcml2ZXJMaWJyYXJ5QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGFkZERyaXZlckxpYnJhcnlCdXR0b24sIFVTRVJfV0FOVFNfVE9fQUREX0RCX0RSSVZFUl9KQVJTX1RPX0NMQVNTUEFUSCwgbnVsbCk7Ci0JCQkKLQkJCWRyaXZlckxpYnJhcnlMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULkxFRlQpOwotCQkJZHJpdmVyTGlicmFyeUxhYmVsLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfZHJpdmVyTGlicmFyeUxhYmVsKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlkcml2ZXJMaWJyYXJ5TGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkKLQkJCWRyaXZlckxpYnJhcnlDb21ibyA9IGNyZWF0ZUNvbWJvKGdyb3VwLCAxLCB0cnVlKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oCi0JCQkJZHJpdmVyTGlicmFyeUNvbWJvLCBEQl9EUklWRVJfTkFNRSwgCi0JCQkJbmV3IENvbnRyb2xbXSB7ZHJpdmVyTGlicmFyeUxhYmVsfSk7Ci0JCQkKLQkJCW92ZXJyaWRlRGVmYXVsdENhdGFsb2dCdXR0b24gPSBjcmVhdGVCdXR0b24oZ3JvdXAsIDMsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX292ZXJyaWRlRGVmYXVsdENhdGFsb2dMYWJlbCwgU1dULkNIRUNLKTsKLQkJCW92ZXJyaWRlRGVmYXVsdENhdGFsb2dCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3gob3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0J1dHRvbiwgVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX0NBVEFMT0csIG51bGwpOwotCQkJCi0JCQlkZWZhdWx0Q2F0YWxvZ0xhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTEVGVCk7Ci0JCQlkZWZhdWx0Q2F0YWxvZ0xhYmVsLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfZGVmYXVsdENhdGFsb2dMYWJlbCk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJZGVmYXVsdENhdGFsb2dMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQotCQkJZGVmYXVsdENhdGFsb2dDb21ibyA9IGNyZWF0ZUNvbWJvKGdyb3VwLCAxLCB0cnVlKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oCi0JCQkJZGVmYXVsdENhdGFsb2dDb21ibywgVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0csIAotCQkJCW5ldyBDb250cm9sW10ge2RlZmF1bHRDYXRhbG9nTGFiZWx9KTsKLQkJCQotCQkJb3ZlcnJpZGVEZWZhdWx0U2NoZW1hQnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAzLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9vdmVycmlkZURlZmF1bHRTY2hlbWFMYWJlbCwgU1dULkNIRUNLKTsKLQkJCW92ZXJyaWRlRGVmYXVsdFNjaGVtYUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChvdmVycmlkZURlZmF1bHRTY2hlbWFCdXR0b24sIFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIG51bGwpOwotCQkJCi0JCQlkZWZhdWx0U2NoZW1hTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5MRUZUKTsKLQkJCWRlZmF1bHRTY2hlbWFMYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2RlZmF1bHRTY2hlbWFMYWJlbCk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJZGVmYXVsdFNjaGVtYUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJCi0JCQlkZWZhdWx0U2NoZW1hQ29tYm8gPSBjcmVhdGVDb21ibyhncm91cCwgMSwgdHJ1ZSk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKAotCQkJCWRlZmF1bHRTY2hlbWFDb21ibywgVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgCi0JCQkJbmV3IENvbnRyb2xbXSB7ZGVmYXVsdFNjaGVtYUxhYmVsfSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBvcGVuTmV3Q29ubmVjdGlvbldpemFyZCgpIHsKLQkJCVN0cmluZyBjb25uZWN0aW9uTmFtZSA9IERUUFVpVG9vbHMuY3JlYXRlTmV3Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJCWlmIChjb25uZWN0aW9uTmFtZSAhPSBudWxsKSB7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoQ09OTkVDVElPTiwgY29ubmVjdGlvbk5hbWUpOwotCQkJCXVwZGF0ZUNvbm5lY3Rpb25TdGF0dXMoKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIG9wZW5Db25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJCWlmIChjcCAhPSBudWxsKSB7Ci0JCQkJY3AuY29ubmVjdCgpOwotCQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShDT05ORUNUSU9OX0FDVElWRSwgY3AuaXNBY3RpdmUoKSk7Ci0JCQkJdXBkYXRlQ29ubmVjdGlvblN0YXR1cygpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgdXBkYXRlQ29ubmVjdGlvblN0YXR1cygpIHsKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCQkJdXBkYXRlQ29ubmVjdExpbmsoY3ApOwotCQkJYWRkRHJpdmVyTGlicmFyeUJ1dHRvbi5zZXRFbmFibGVkKGNwICE9IG51bGwpOwotCQl9Ci0JCQotCQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQkJLy8gd2UganVzdCB1c2UgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSB0byBsb2cgaW4sIHNvIGdvIHRvIHRoZSB0aGUgZGIgcGx1Zy1pbgotCQkJcmV0dXJuIEpwdERiUGx1Z2luLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoQ09OTkVDVElPTikpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgdXBkYXRlQ29ubmVjdExpbmsoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKLQkJCWNvbm5lY3RMaW5rLnNldEVuYWJsZWQoKGNwICE9IG51bGwpICYmIGNwLmlzRGlzY29ubmVjdGVkKCkpOwotCQkJaWYgKGNwICE9IG51bGwgJiYgY3AuaXNDb25uZWN0ZWQoKSkgewotCQkJCXVwZGF0ZUNvbm5lY3RMaW5rVGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0ZWRUZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXVwZGF0ZUNvbm5lY3RMaW5rVGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0TGluayk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVDb25uZWN0TGlua1RleHQoU3RyaW5nIHRleHQpIHsKLQkJCWNvbm5lY3RMaW5rLnNldFRleHQodGV4dCk7Ci0JCQlTV1RVdGlsLnJlZmxvdyhjb25uZWN0TGluay5nZXRQYXJlbnQoKSk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGZpbmFsIGNsYXNzIE9ybVhtbEdyb3VwCi0JewotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBjcmVhdGVPcm1YbWxCdXR0b247Ci0KLQotCQlwdWJsaWMgT3JtWG1sR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSnBhSGVscENvbnRleHRJZHMuRElBTE9HX0NSRUFURV9PUk0pOwotCi0JCQljcmVhdGVPcm1YbWxCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQkJY3JlYXRlT3JtWG1sQnV0dG9uLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfY3JlYXRlT3JtWG1sQnV0dG9uKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goY3JlYXRlT3JtWG1sQnV0dG9uLCBDUkVBVEVfT1JNX1hNTCwgbnVsbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0pwYUZhY2V0VmVyc2lvbkNoYW5nZVBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvSnBhRmFjZXRWZXJzaW9uQ2hhbmdlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmUwY2UwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvSnBhRmFjZXRWZXJzaW9uQ2hhbmdlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcGFGYWNldFZlcnNpb25DaGFuZ2VQYWdlCi0JZXh0ZW5kcyBKcGFGYWNldEFjdGlvblBhZ2UKLXsKLQlwdWJsaWMgSnBhRmFjZXRWZXJzaW9uQ2hhbmdlUGFnZSgpIHsKLQkJc3VwZXIoImpwdC5qcGEuZmFjZXQudmVyc2lvbi1jaGFuZ2UucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQkJLy8gVE9ETwotCQkvL3RoaXMuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5ORVdfSlBBX1BST0pFQ1RfSlBBX0ZBQ0VUKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3ViQ29tcG9zaXRlcyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCW5ldyBQbGF0Zm9ybUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCW5ldyBDbGFzc3BhdGhDb25maWdHcm91cChjb21wb3NpdGUpOwotCQkvL25ldyBDb25uZWN0aW9uR3JvdXAoY29tcG9zaXRlKTsKLQkJLy9uZXcgUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwKGNvbXBvc2l0ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJLy8gbm90aGluZyBuZXcgaGVyZSAqanVzdCogeWV0Ci0JCXJldHVybiBzdXBlci5nZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvSnBhTWFrZVBlcnNpc3RlbnRXaXphcmQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvSnBhTWFrZVBlcnNpc3RlbnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmNTA5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0pwYU1ha2VQZXJzaXN0ZW50V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Mb2NhbFJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsJCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVMUF9DT05URVhUX0lEID0gSnB0VWlQbHVnaW4uUExVR0lOX0lEICsgIi5HZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQotCi0JZmluYWwgTGlzdDxJVHlwZT4gc2VsZWN0ZWRUeXBlczsKLQotCXByaXZhdGUgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlIG1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZTsJCi0JCi0JcHJvdGVjdGVkIGZpbmFsIFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXI7Ci0JCi0JcHVibGljIEpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkKExpc3Q8SVR5cGU+IHNlbGVjdGVkVHlwZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZWxlY3RlZFR5cGVzID0gc2VsZWN0ZWRUeXBlczsKLQkJdGhpcy5yZXNvdXJjZU1hbmFnZXIgPSBuZXcgTG9jYWxSZXNvdXJjZU1hbmFnZXIoSkZhY2VSZXNvdXJjZXMuZ2V0UmVzb3VyY2VzKCkpOwotCQl0aGlzLnNldFdpbmRvd1RpdGxlKEpwdFVpTWVzc2FnZXMuSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX3RpdGxlKTsKLQkJdGhpcy5zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKcHRVaVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoSnB0VWlJY29ucy5FTlRJVFlfV0laX0JBTk5FUikpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCi0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0aGlzLnNlbGVjdGVkVHlwZXMuZ2V0KDApLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpKTsKLQkJdGhpcy5tYWtlUGVyc2lzdGVudFdpemFyZFBhZ2UgPSBuZXcgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlKGpwYVByb2plY3QsIHRoaXMuc2VsZWN0ZWRUeXBlcywgSEVMUF9DT05URVhUX0lEKTsKLQkJdGhpcy5hZGRQYWdlKHRoaXMubWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXRoaXMubWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlLnBlcmZvcm1GaW5pc2goKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQlpZiAocGVyc2lzdGVuY2VYbWwgIT0gbnVsbCkgewotCQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZVhtbC5nZXRQZXJzaXN0ZW5jZSgpOwotCQkJaWYgKHBlcnNpc3RlbmNlICE9IG51bGwgJiYgcGVyc2lzdGVuY2UucGVyc2lzdGVuY2VVbml0c1NpemUoKSA+IDApIHsKLQkJCQlyZXR1cm4gcGVyc2lzdGVuY2UucGVyc2lzdGVuY2VVbml0cygpLm5leHQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLnJlc291cmNlTWFuYWdlci5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0pwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JhNzU3OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0pwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudENvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hWaWV3ZXJDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRWRpdGluZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLlhtbE1hcHBpbmdGaWxlVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybVVpUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5FbnRpdHlXaXphcmRNc2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMub3JtLk1hcHBpbmdGaWxlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8vIHNpemluZyBjb25zdGFudHMKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVEFCTEVfSEVJR0hUID0gMjUwOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBUQUJMRV9XSURUSCA9IDMwMDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNQUtFX1BFUlNJU1RFTlRfUEFHRV9OQU1FID0gIk1ha2VQZXJzaXN0ZW50IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgVGFibGVWaWV3ZXIgY2xhc3NUYWJsZVZpZXdlcjsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBoZWxwQ29udGV4dElkOwotCi0JcHJpdmF0ZSBmaW5hbCBUeXBlW10gc2VsZWN0ZWRUeXBlczsKLQotCXByaXZhdGUgZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCXByaXZhdGUgSnBhUmVzb3VyY2VUeXBlIGpwYVJlc291cmNlVHlwZTsKLQkKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGFubm90YXRlSW5KYXZhTW9kZWw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNGaXJzdENoZWNrID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbWFwcGluZ0ZpbGVNb2RlbDsKLQkKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGxpc3RJblBlcnNpc3RlbmNlWG1sTW9kZWw7Ci0KLQlwcm90ZWN0ZWQgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlKGZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdCwgZmluYWwgTGlzdDxJVHlwZT4gc2VsZWN0ZWRUeXBlcywgZmluYWwgU3RyaW5nIGhlbHBDb250ZXh0SWQpIHsKLQkJc3VwZXIoTUFLRV9QRVJTSVNURU5UX1BBR0VfTkFNRSk7Ci0JCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7Ci0KLQkJdGhpcy5zZWxlY3RlZFR5cGVzID0gdGhpcy5idWlsZFR5cGVzKHNlbGVjdGVkVHlwZXMpOwotCQl0aGlzLmpwYVJlc291cmNlVHlwZSA9IEpwdENvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfUkVTT1VSQ0VfVFlQRTsKLQkJdGhpcy5oZWxwQ29udGV4dElkID0gaGVscENvbnRleHRJZDsKLQkJdGhpcy5hbm5vdGF0ZUluSmF2YU1vZGVsID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLm1hcHBpbmdGaWxlTW9kZWwgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5saXN0SW5QZXJzaXN0ZW5jZVhtbE1vZGVsID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLnZhbHVlT2YoIXRoaXMuanBhUHJvamVjdC5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKCkpKTsKLQkJdGhpcy5zZXRUaXRsZShKcHRVaU1lc3NhZ2VzLkpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV90aXRsZSk7Ci0JCXRoaXMuc2V0TWVzc2FnZShKcHRVaU1lc3NhZ2VzLkpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHlwZVtdIGJ1aWxkVHlwZXMoZmluYWwgTGlzdDxJVHlwZT4gc2VsZWN0ZWRUeXBlcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3QoCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJVHlwZSwgVHlwZT4obm9uUGVyc2lzdGVudFR5cGVzKHNlbGVjdGVkVHlwZXMpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFR5cGUgdHJhbnNmb3JtKElUeXBlIGpkdFR5cGUpIHsKLQkJCQkJcmV0dXJuIG5ldyBUeXBlKGpkdFR5cGUpOwotCQkJCX0KLQkJCX0pLnRvQXJyYXkobmV3IFR5cGVbXSB7fSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBJVHlwZXMgdGhhdCBhcmUgbm90IGFscmVhZHkgcGVyc2lzdGVudC4KLQkgKiBBbnkgcm9vdCBzdHJ1Y3R1cmUgbm9kZXMgbWVhbnMgdGhlIHR5cGUgaXMgYWxyZWFkeSBhbm5vdGF0ZWQsIAotCSAqIGxpc3RlZCBpbiBwZXJzaXN0ZW5jZS54bWwsIG9yIGxpc3RlZCBpbiBhIG1hcHBpbmcgZmlsZQotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxJVHlwZT4gbm9uUGVyc2lzdGVudFR5cGVzKGZpbmFsIExpc3Q8SVR5cGU+IHNlbGVjdGVkVHlwZXMpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxJVHlwZT4oc2VsZWN0ZWRUeXBlcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSVR5cGUgamR0VHlwZSkgewotCQkJCXJldHVybiBnZXRKcGFQcm9qZWN0KCkuZ2V0SnBhRmlsZSgoSUZpbGUpIGpkdFR5cGUuZ2V0UmVzb3VyY2UoKSkucm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpID09IDA7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1VaSBnZXRKcGFQbGF0Zm9ybVVpKCkgewotCQlTdHJpbmcgcGxhdGZvcm1JZCA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0SWQoKTsKLQkJcmV0dXJuIEpwYVBsYXRmb3JtVWlSZWdpc3RyeS5pbnN0YW5jZSgpLmdldEpwYVBsYXRmb3JtVWkocGxhdGZvcm1JZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlpbnQgbkNvbHVtbnM9IDE7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBuQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlCdXR0b24gamF2YUFubm90YXRpb25CdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJamF2YUFubm90YXRpb25CdXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9hbm5vdGF0ZUluSmF2YVJhZGlvQnV0dG9uKTsKLQkJamF2YUFubm90YXRpb25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZS50aGlzLmFubm90YXRlSW5KYXZhTW9kZWwuc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJCQlKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2UudGhpcy5qcGFSZXNvdXJjZVR5cGUgPSBKcHRDb3JlUGx1Z2luLkpBVkFfU09VUkNFX1JFU09VUkNFX1RZUEU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdGhpcy53aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gbWFwcGluZ0ZpbGVCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJbWFwcGluZ0ZpbGVCdXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tYXBwaW5nRmlsZVJhZGlvQnV0dG9uKTsKLQkJQ29tcG9zaXRlIG1hcHBpbmdGaWxlQ29tcG9zaXRlID0gdGhpcy5jcmVhdGVNYXBwaW5nRmlsZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQltYXBwaW5nRmlsZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW1hcHBpbmdGaWxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2UudGhpcy5hbm5vdGF0ZUluSmF2YU1vZGVsLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQkJCWlmIChKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2UudGhpcy5pc0ZpcnN0Q2hlY2spIHsKLQkJCQkJSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlLnRoaXMubWFwcGluZ0ZpbGVNb2RlbC5zZXRWYWx1ZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCQkJCUpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZS50aGlzLmlzRmlyc3RDaGVjayA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQotCi0JCXRoaXMuY2xhc3NUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQl0aGlzLmNsYXNzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXRoaXMuY2xhc3NUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRoaXMuY2xhc3NUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFR5cGVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRoaXMuY2xhc3NUYWJsZVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBUeXBlQ29tcGFyYXRvcigpKTsKLQkJdGhpcy5jcmVhdGVUeXBlVGFibGVDb2x1bW4oKTsKLQkJdGhpcy5jcmVhdGVNYXBwaW5nVGFibGVDb2x1bW4oKTsKLQkJdGhpcy5jbGFzc1RhYmxlVmlld2VyLnNldElucHV0KHRoaXMuc2VsZWN0ZWRUeXBlcyk7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBUQUJMRV9IRUlHSFQ7Ci0JCWRhdGEud2lkdGhIaW50ID0gVEFCTEVfV0lEVEg7Ci0JCXRoaXMuY2xhc3NUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JCWZpbmFsIEJ1dHRvbiBwZXJzaXN0ZW5jZVhtbENoZWNrQm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCXBlcnNpc3RlbmNlWG1sQ2hlY2tCb3guc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9saXN0SW5QZXJzaXN0ZW5jZVhtbENoZWNrQm94KTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLmxpc3RJblBlcnNpc3RlbmNlWG1sTW9kZWwsIHBlcnNpc3RlbmNlWG1sQ2hlY2tCb3gpOwotCQlTV1RUb29scy5jb250cm9sVmlzaWJsZVN0YXRlKHRoaXMuYW5ub3RhdGVJbkphdmFNb2RlbCwgcGVyc2lzdGVuY2VYbWxDaGVja0JveCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCQotCQl0aGlzLnZhbGlkYXRlKCk7Ci0JfQotCQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZU1hcHBpbmdGaWxlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAxMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCUxpbmsgbWFwcGluZ0ZpbGVMaW5rID0gbmV3IExpbmsoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCW1hcHBpbmdGaWxlTGluay5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21hcHBpbmdGaWxlTGluayk7Ci0JCW1hcHBpbmdGaWxlTGluay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQltYXBwaW5nRmlsZUxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCW9wZW5OZXdNYXBwaW5nRmlsZVdpemFyZCgpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJCi0JCVRleHQgbWFwcGluZ0ZpbGVUZXh0ID0gdGhpcy5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgMSk7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5tYXBwaW5nRmlsZU1vZGVsLCBtYXBwaW5nRmlsZVRleHQpOwotCQl0aGlzLm1hcHBpbmdGaWxlTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlKcGFYbWxSZXNvdXJjZSBvcm1YbWxSZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKCk7Ci0JCQkJaWYgKG9ybVhtbFJlc291cmNlID09IG51bGwpIHsKLQkJCQkJanBhUmVzb3VyY2VUeXBlID0gSnB0Q29yZVBsdWdpbi5PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFOyAvL2p1c3QgZGVmYXVsdCB0byAxLjAgb3JtIHJlc291cmNlIHR5cGUKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWpwYVJlc291cmNlVHlwZSA9IG9ybVhtbFJlc291cmNlLmdldFJlc291cmNlVHlwZSgpOwotCQkJCX0KLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tYXBwaW5nRmlsZUJyb3dzZUJ1dHRvbik7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbWFwcGluZ0ZpbGVCcm93c2VCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gRG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKG5ldyBMaXN0SW5Pcm1NYXBwaW5nRmlsZU1vZGVsKHRoaXMuYW5ub3RhdGVJbkphdmFNb2RlbCksIG1hcHBpbmdGaWxlTGluaywgbWFwcGluZ0ZpbGVUZXh0LCBicm93c2VCdXR0b24pOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1hcHBpbmdGaWxlQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsJCQotCQlWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gYnVpbGRNYXBwaW5nRmlsZURpYWxvZ1ZpZXdlckZpbHRlcigpOwotCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCk7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpOwotCQlTZWxlY3RKcGFPcm1NYXBwaW5nRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0SnBhT3JtTWFwcGluZ0ZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgdGhpcy5qcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbGFiZWxQcm92aWRlciwgY29udGVudFByb3ZpZGVyKTsKLQkJZGlhbG9nLnNldFRpdGxlKEVudGl0eVdpemFyZE1zZy5NQVBQSU5HX1hNTF9USVRMRSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKEVudGl0eVdpemFyZE1zZy5DSE9PU0VfTUFQUElOR19YTUxfTUVTU0FHRSk7Ci0JCWRpYWxvZy5hZGRGaWx0ZXIoZmlsdGVyKTsKLQkJCQotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuanBhUHJvamVjdC5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKGdldE1hcHBpbmdGaWxlTG9jYXRpb24oKSkpOwotCQlJRmlsZSBpbml0aWFsU2VsZWN0aW9uID0gKHJlc291cmNlICE9IG51bGwpID8gcmVzb3VyY2UuZ2V0RmlsZSgpIDogbnVsbDsKLQkJZGlhbG9nLnNldElucHV0KHRoaXMuanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCi0JCWlmIChpbml0aWFsU2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCWRpYWxvZy5zZXRJbml0aWFsU2VsZWN0aW9uKGluaXRpYWxTZWxlY3Rpb24pOwotCQl9Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJdGhpcy5tYXBwaW5nRmlsZU1vZGVsLnNldFZhbHVlKGRpYWxvZy5nZXRDaG9zZW5OYW1lKCkpOwotCQkJLy9oYXZlIHRvIHZhbGlkYXRlIGluIGNhc2UgdGhlIGZpbGUgbmFtZSBkaWQgbm90IGFjdHVhbGx5IGNoYW5nZSwgYnV0IHRoZSB4bWwgZmlsZSB3YXMgY3JlYXRlZAotCQkJdmFsaWRhdGUoKTsKLQkJfQkJCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY3JlYXRlIGZpbHRlciBmb3IgdGhlIGJyb3dzZS9hZGQgYWx0ZXJuYXRpdmUgbWFwcGluZyBYTUwgCi0JICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2Ygdmlld2VyIGZpbHRlciBmb3IgdGhlIFNlbGVjdE1hcHBpbmdYTUxEaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgVmlld2VyRmlsdGVyIGJ1aWxkTWFwcGluZ0ZpbGVEaWFsb2dWaWV3ZXJGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgWG1sTWFwcGluZ0ZpbGVWaWV3ZXJGaWx0ZXIodGhpcy5qcGFQcm9qZWN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3Blbk5ld01hcHBpbmdGaWxlV2l6YXJkKCkgewotCQlJUGF0aCBwYXRoID0gTWFwcGluZ0ZpbGVXaXphcmQuY3JlYXRlTmV3TWFwcGluZ0ZpbGUoCi0JCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoaXMuanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpLCAKLQkJCQkJZ2V0TWFwcGluZ0ZpbGVOYW1lKCkpOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQl0aGlzLm1hcHBpbmdGaWxlTW9kZWwuc2V0VmFsdWUocGF0aC50b1N0cmluZygpKTsKLQkJCS8vaGF2ZSB0byB2YWxpZGF0ZSBpbiBjYXNlIHRoZSBmaWxlIG5hbWUgZGlkIG5vdCBhY3R1YWxseSBjaGFuZ2UsIGJ1dCB0aGUgeG1sIGZpbGUgd2FzIGNyZWF0ZWQKLQkJCXRoaXMudmFsaWRhdGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVR5cGVUYWJsZUNvbHVtbigpIHsKLQkJVGFibGVWaWV3ZXJDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKHRoaXMuY2xhc3NUYWJsZVZpZXdlciwgU1dULk5PTkUpOwotCQljb2x1bW4uZ2V0Q29sdW1uKCkuc2V0V2lkdGgoMjAwKTsKLQkJY29sdW1uLmdldENvbHVtbigpLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfdHlwZVRhYmxlQ29sdW1uKTsKLQkJY29sdW1uLnNldExhYmVsUHJvdmlkZXIodGhpcy5idWlsZFR5cGVDb2x1bW5MYWJlbFByb3ZpZGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb2x1bW5MYWJlbFByb3ZpZGVyIGJ1aWxkVHlwZUNvbHVtbkxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHlwZUNvbHVtbkxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNYXBwaW5nVGFibGVDb2x1bW4oKSB7Ci0JCVRhYmxlVmlld2VyQ29sdW1uIGNvbHVtbjsKLQkJY29sdW1uID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKHRoaXMuY2xhc3NUYWJsZVZpZXdlciwgU1dULk5PTkUpOwotCQljb2x1bW4uZ2V0Q29sdW1uKCkuc2V0V2lkdGgoMjAwKTsKLQkJY29sdW1uLmdldENvbHVtbigpLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfbWFwcGluZ1RhYmxlQ29sdW1uKTsKLQotCQljb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IEVkaXRpbmdTdXBwb3J0KHRoaXMuY2xhc3NUYWJsZVZpZXdlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldE1hcHBpbmdVaURlZmluaXRpb24oKChUeXBlKSBlbGVtZW50KS5tYXBwaW5nS2V5KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJKChUeXBlKSBlbGVtZW50KS5zZXRNYXBwaW5nS2V5KCgoTWFwcGluZ1VpRGVmaW5pdGlvbjw/LCA/PikgdmFsdWUpLmdldEtleSgpKTsKLQkJCQlnZXRWaWV3ZXIoKS51cGRhdGUoZWxlbWVudCwgbnVsbCk7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJZmluYWwgQ29tYm9Cb3hWaWV3ZXJDZWxsRWRpdG9yIGNvbWJvQ2VsbEVkaXRvciA9Ci0JCQkJCW5ldyBDb21ib0JveFZpZXdlckNlbGxFZGl0b3IoKENvbXBvc2l0ZSkgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlLnRoaXMuY2xhc3NUYWJsZVZpZXdlci5nZXRDb250cm9sKCkpOwotCi0JCQkJY29tYm9DZWxsRWRpdG9yLnNldExhYmVsUHJvdmlkZXIoYnVpbGRNYXBwaW5nQ29tYm9DZWxsRWRpdG9yTGFiZWxQcm92aWRlcigpKTsKLQkJCQljb21ib0NlbGxFZGl0b3Iuc2V0Q29udGVudFByb3ZpZGVyKGJ1aWxkTWFwcGluZ0NvbWJvQ2VsbEVkaXRvckNvbnRlbnRQcm92aWRlcigpKTsKLQkJCQljb21ib0NlbGxFZGl0b3Iuc2V0SW5wdXQoZWxlbWVudCk7Ci0JCQkJcmV0dXJuIGNvbWJvQ2VsbEVkaXRvcjsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FZGl0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY29sdW1uLnNldExhYmVsUHJvdmlkZXIoYnVpbGRNYXBwaW5nQ29sdW1uTGFiZWxQcm92aWRlcigpKTsKLQl9Ci0KLQkvL1RoZSBDb21ib0JveFZpZXdlckNlbGxFZGl0b3IgZG9lcyBub3Qgc3VwcG9ydCB0aGUgaW1hZ2UsIHNvIG5vIHJlYXNvbiB0byBpbXBsZW1lbnQgZ2V0SW1hZ2UoT2JqZWN0KQotCXByb3RlY3RlZCBDb2x1bW5MYWJlbFByb3ZpZGVyIGJ1aWxkTWFwcGluZ0NvbWJvQ2VsbEVkaXRvckxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoTWFwcGluZ1VpRGVmaW5pdGlvbjw/LCA/PikgZWxlbWVudCkuZ2V0TGFiZWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgYnVpbGRNYXBwaW5nQ29tYm9DZWxsRWRpdG9yQ29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oKChUeXBlKSBpbnB1dEVsZW1lbnQpLnR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpKS50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBDb2x1bW5MYWJlbFByb3ZpZGVyIGJ1aWxkTWFwcGluZ0NvbHVtbkxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGUsID8+IG1hcHBpbmdVaURlZmluaXRpb24gPSBnZXRNYXBwaW5nVWlEZWZpbml0aW9uKCgoVHlwZSkgZWxlbWVudCkubWFwcGluZ0tleSk7Ci0JCQkJcmV0dXJuIG1hcHBpbmdVaURlZmluaXRpb24uZ2V0TGFiZWwoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZSwgPz4gbWFwcGluZ1VpRGVmaW5pdGlvbiA9IGdldE1hcHBpbmdVaURlZmluaXRpb24oKChUeXBlKSBlbGVtZW50KS5tYXBwaW5nS2V5KTsKLQkJCQlyZXR1cm4gbWFwcGluZ1VpRGVmaW5pdGlvbi5nZXRJbWFnZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZSwgPz4gZ2V0TWFwcGluZ1VpRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSkgewotCQlmb3IgKE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFBlcnNpc3RlbnRUeXBlLCA/PiBwcm92aWRlciA6IHR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucyh0aGlzLmpwYVJlc291cmNlVHlwZSkpIHsKLQkJCWlmIChwcm92aWRlci5nZXRLZXkoKSA9PSBtYXBwaW5nS2V5KSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsJCi0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gdHlwZU1hcHBpbmdLZXlzKEl0ZXJhYmxlPD8gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZSwgPz4+IG1hcHBpbmdVaURlZmluaXRpb25zKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZSwgPz4sIFN0cmluZz4obWFwcGluZ1VpRGVmaW5pdGlvbnMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGUsID8+IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5nZXRLZXkoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8PyBleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFBlcnNpc3RlbnRUeXBlLCA/Pj4gdHlwZU1hcHBpbmdVaURlZmluaXRpb25zKEpwYVJlc291cmNlVHlwZSBqcGFSZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShnZXRKcGFQbGF0Zm9ybVVpKCkudHlwZU1hcHBpbmdVaURlZmluaXRpb25zKGpwYVJlc291cmNlVHlwZSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJaWYgKHRoaXMuc2VsZWN0ZWRUeXBlcy5sZW5ndGggPT0gMCkgewotCQkJZXJyb3JNZXNzYWdlID0gSnB0VWlNZXNzYWdlcy5KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2Vfc2VsZWN0ZWRUeXBlc1BlcnNpc3RlbnRFcnJvcjsKLQkJfQotCQllbHNlIGlmICh0aGlzLmlzQWRkVG9Pcm1NYXBwaW5nRmlsZSgpKSB7Ci0JCQlKcGFYbWxSZXNvdXJjZSBvcm1YbWxSZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKCk7Ci0JCQlpZiAob3JtWG1sUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCWVycm9yTWVzc2FnZSA9IEpwdFVpTWVzc2FnZXMuSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21hcHBpbmdGaWxlRG9lc05vdEV4aXN0RXJyb3I7Ci0JCQl9Ci0JCQllbHNlIGlmIChnZXRKcGFQcm9qZWN0KCkuZ2V0SnBhRmlsZShvcm1YbWxSZXNvdXJjZS5nZXRGaWxlKCkpLnJvb3RTdHJ1Y3R1cmVOb2Rlc1NpemUoKSA9PSAwKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gSnB0VWlNZXNzYWdlcy5KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfbWFwcGluZ0ZpbGVOb3RMaXN0ZWRJblBlcnNpc3RlbmNlWG1sRXJyb3I7Ci0JCQl9Ci0JCX0KLQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCXNldFBhZ2VDb21wbGV0ZShlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHZvaWQgcGVyZm9ybUhlbHAoKSB7Ci0JICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLmRpc3BsYXlIZWxwKCB0aGlzLmhlbHBDb250ZXh0SWQgKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiBtb2RpZmllZFBlcnNpc3RlbmNlWG1sID0gZmFsc2U7Ci0JCWZvciAoVHlwZSB0eXBlIDogdGhpcy5zZWxlY3RlZFR5cGVzKSB7Ci0JCQltb2RpZmllZFBlcnNpc3RlbmNlWG1sIHw9IHR5cGUubWFrZVBlcnNpc3RlbnQoKTsJCQkKLQkJfQotCQlpZiAobW9kaWZpZWRQZXJzaXN0ZW5jZVhtbCkgewotCQkJdHJ5IHsKLQkJCQl0aGlzLmdldEpwYVByb2plY3QoKS5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9pZ25vcmUsIGZpbGUganVzdCB3b24ndCBnZXQgc2F2ZWQKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBnZXRPcm1YbWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKGdldE1hcHBpbmdGaWxlTG9jYXRpb24oKSkpOwotCX0KLQotCXByb3RlY3RlZCBFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKLQkJSnBhWG1sUmVzb3VyY2UgeG1sUmVzb3VyY2UgPSBnZXRPcm1YbWxSZXNvdXJjZSgpOwotCQlyZXR1cm4gKEVudGl0eU1hcHBpbmdzKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SnBhRmlsZSh4bWxSZXNvdXJjZS5nZXRGaWxlKCkpLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMaXN0SW5QZXJzaXN0ZW5jZVhtbCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEluUGVyc2lzdGVuY2VYbWxNb2RlbC5nZXRWYWx1ZSgpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGVJbkphdmFNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGVJbkphdmFNb2RlbC5nZXRWYWx1ZSgpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQWRkVG9Pcm1NYXBwaW5nRmlsZSgpIHsKLQkJcmV0dXJuICFpc0Fubm90YXRlSW5KYXZhTW9kZWwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXBwaW5nRmlsZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5tYXBwaW5nRmlsZU1vZGVsLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXBwaW5nRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBuZXcgRmlsZShnZXRNYXBwaW5nRmlsZUxvY2F0aW9uKCkpLmdldE5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFR5cGUgewotCi0JCXByaXZhdGUgZmluYWwgSVR5cGUgamR0VHlwZTsKLQotCQlwcml2YXRlIFN0cmluZyBtYXBwaW5nS2V5OwotCi0JCXByb3RlY3RlZCBUeXBlKElUeXBlIGpkdFR5cGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmpkdFR5cGUgPSBqZHRUeXBlOwotCQkJdGhpcy5tYXBwaW5nS2V5ID0gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwaW5nS2V5KFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCQl0aGlzLm1hcHBpbmdLZXkgPSBtYXBwaW5nS2V5OwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBtYWtlUGVyc2lzdGVudCgpIHsKLQkJCWlmIChKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2UudGhpcy5pc0Fubm90YXRlSW5KYXZhTW9kZWwoKSkgewotCQkJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKLQkJCQlwZXJzaXN0ZW50VHlwZS5hZGRBbm5vdGF0aW9uKGdldEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24odGhpcy5tYXBwaW5nS2V5KS5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJCQlpZiAoSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlLnRoaXMuaXNMaXN0SW5QZXJzaXN0ZW5jZVhtbCgpKSB7Ci0JCQkJCWlmIChwZXJzaXN0ZW5jZVVuaXQgIT0gbnVsbCkgewotCQkJCQkJcGVyc2lzdGVuY2VVbml0LmFkZFNwZWNpZmllZENsYXNzUmVmKHBlcnNpc3RlbnRUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUpwYVhtbFJlc291cmNlIG9ybVhtbFJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKTsKLQkJCQlmaW5hbCBFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCQkJb3JtWG1sUmVzb3VyY2UubW9kaWZ5KG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZW50aXR5TWFwcGluZ3MuYWRkUGVyc2lzdGVudFR5cGUoVHlwZS50aGlzLm1hcHBpbmdLZXksIFR5cGUudGhpcy5qZHRUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHJvdGVjdGVkIEl0ZXJhYmxlPD8gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZSwgPz4+IHR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoZ2V0SnBhUGxhdGZvcm1VaSgpLnR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucyhqcGFSZXNvdXJjZVR5cGUpKTsKLQkJfQotCi0JCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGdldEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24oU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJCXJldHVybiBnZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uKG1hcHBpbmdLZXkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkgewotCQkJcmV0dXJuIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSh0aGlzLmpkdFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0KLQotCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJCVBlcnNpc3RlbmNlIHAgPSB0aGlzLmdldFBlcnNpc3RlbmNlKCk7Ci0JCQlpZiAocCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlJdGVyYXRvcjxQZXJzaXN0ZW5jZVVuaXQ+IHVuaXRzID0gcC5wZXJzaXN0ZW5jZVVuaXRzKCk7Ci0JCQlyZXR1cm4gdW5pdHMuaGFzTmV4dCgpID8gdW5pdHMubmV4dCgpIDogbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBQZXJzaXN0ZW5jZSBnZXRQZXJzaXN0ZW5jZSgpIHsKLQkJCVBlcnNpc3RlbmNlWG1sIHB4bWwgPSB0aGlzLmdldFBlcnNpc3RlbmNlWG1sKCk7Ci0JCQlyZXR1cm4gKHB4bWwgPT0gbnVsbCkgPyBudWxsIDogcHhtbC5nZXRQZXJzaXN0ZW5jZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sIGdldFBlcnNpc3RlbmNlWG1sKCkgewotCQkJSnBhUm9vdENvbnRleHROb2RlIHJjbiA9IGdldEpwYVByb2plY3QoKS5nZXRSb290Q29udGV4dE5vZGUoKTsKLQkJCXJldHVybiAocmNuID09IG51bGwpID8gbnVsbCA6IHJjbi5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgVHlwZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0JewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCl7Ci0JCQlyZXR1cm4gKFR5cGVbXSkgaW5wdXRFbGVtZW50OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpe30KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpe30KLQkJCi0JfQotCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBUeXBlQ29sdW1uTGFiZWxQcm92aWRlciBleHRlbmRzIENvbHVtbkxhYmVsUHJvdmlkZXIKLQl7Ci0JCXByaXZhdGUgZmluYWwgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyIGphdmFFbGVtZW50TGFiZWxQcm92aWRlciA9IAotCQkJbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcihKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuU0hPV19QT1NUX1FVQUxJRklFRAotCQkJCQkJCQkJCXwgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfU01BTExfSUNPTlMKLQkJCQkJCQkJCQl8IEphdmFFbGVtZW50TGFiZWxQcm92aWRlci5TSE9XX09WRVJMQVlfSUNPTlMpOwotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiB0aGlzLmphdmFFbGVtZW50TGFiZWxQcm92aWRlci5nZXRUZXh0KCgoVHlwZSkgZWxlbWVudCkuamR0VHlwZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoKChUeXBlKSBlbGVtZW50KS5qZHRUeXBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgY2xhc3MgVHlwZUNvbXBhcmF0b3IgZXh0ZW5kcyBWaWV3ZXJDb21wYXJhdG9yIHsKLQkJcHJpdmF0ZSBmaW5hbCBKYXZhRWxlbWVudENvbXBhcmF0b3IgamF2YUVsZW1lbnRDb21wYXJhdG9yID0gbmV3IEphdmFFbGVtZW50Q29tcGFyYXRvcigpOwotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCXJldHVybiB0aGlzLmphdmFFbGVtZW50Q29tcGFyYXRvci5jb21wYXJlKHZpZXdlciwgKChUeXBlKSBlMSkuamR0VHlwZSwgICgoVHlwZSkgZTIpLmpkdFR5cGUpOwotCQl9Ci0JfQotCQotCXN0YXRpYyBjbGFzcyBMaXN0SW5Pcm1NYXBwaW5nRmlsZU1vZGVsCi0JCWV4dGVuZHMgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuLCBCb29sZWFuPgotCXsKLQkJTGlzdEluT3JtTWFwcGluZ0ZpbGVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYW5ub3RhdGVJbkphdmFNb2RlbCkgewotCQkJc3VwZXIoYW5ub3RhdGVJbkphdmFNb2RlbCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCF0aGlzLnN1YmplY3QuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgey8qbm90aGluZyovfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Lypub3RoaW5nKi99Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL05ld0VudGl0eURyb3BEb3duQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL05ld0VudGl0eURyb3BEb3duQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExODVmYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdFbnRpdHlEcm9wRG93bkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBPcmFjbGUgLSBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gTmV3SmF2YUVFRHJvcERvd25BY3Rpb24gYW5kIE5ld1R5cGVEcm9wRG93bkFjdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuUGl4ZWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLkFic3RyYWN0T3BlbldpemFyZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudXRpbC5Db3JlVXRpbGl0eTsKLQotCi0vKioKLSAqIEEgdHlwZSB3aXphcmQgaXMgYWRkZWQgdG8gdGhlIHR5cGUgZHJvcCBkb3duIGlmIGl0IGhhcyBhIHBhcmFtYXRlciAnamF2YXR5cGUnOgotICogICAgIDx3aXphcmQKLSAqICAgICAgICAgbmFtZT0iTXkgSlBUIFdpemFyZCIKLSAqICAgICAgICAgaWNvbj0iaWNvbnMvd2l6LmdpZiIKLSAqICAgICAgICAgY2F0ZWdvcnk9Im15Y2F0ZWdvcnkiCi0gKiAgICAgICAgIGlkPSJ4eC5NeVdpemFyZCI+Ci0gKiAgICAgICAgIDxjbGFzcyBjbGFzcz0ib3JnLnh4Lk15V2l6YXJkIj4KLSAqICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ianB0YXJ0aWZhY3QiIHZhbHVlPSJ0cnVlIi8+Ci0gKiAgICAgICAgIDwvY2xhc3M+IAotICogICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gKiAgICAgICAgICAgICBNeSBKUFQgV2l6YXJkCi0gKiAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gKiAgICAgIDwvd2l6YXJkPgotICovCi1wdWJsaWMgY2xhc3MgTmV3RW50aXR5RHJvcERvd25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJTWVudUNyZWF0b3IsIElXb3JrYmVuY2hXaW5kb3dQdWxsZG93bkRlbGVnYXRlMiB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE9wZW5KcHRXaXphcmRBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZW5XaXphcmRBY3Rpb24gaW1wbGVtZW50cyBDb21wYXJhYmxlPE9iamVjdD4gIHsKLQotCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7Ly8kTk9OLU5MUy0xJAotCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSUNPTiA9ICJpY29uIjsvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwkvLyROT04tTkxTLTEkCi0JCQotCQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBmQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JCXByaXZhdGUgaW50IG1lbnVJbmRleDsKLQotCQlwdWJsaWMgT3BlbkpwdFdpemFyZEFjdGlvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJdGhpcy5mQ29uZmlndXJhdGlvbkVsZW1lbnQ9IGVsZW1lbnQ7Ci0JCQlzZXRUZXh0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FKSk7Ci0JCQkKLQkJCVN0cmluZyBkZXNjcmlwdGlvbj0gZ2V0RGVzY3JpcHRpb25Gcm9tQ29uZmlnKHRoaXMuZkNvbmZpZ3VyYXRpb25FbGVtZW50KTsKLQkJCXNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJCXNldFRvb2xUaXBUZXh0KGRlc2NyaXB0aW9uKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihnZXRJY29uRnJvbUNvbmZpZyh0aGlzLmZDb25maWd1cmF0aW9uRWxlbWVudCkpOwotCQkJc2V0TWVudUluZGV4KGdldE1lbnVJbmRleEZyb21Db25maWcodGhpcy5mQ29uZmlndXJhdGlvbkVsZW1lbnQpKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0RGVzY3JpcHRpb25Gcm9tQ29uZmlnKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbihUQUdfREVTQ1JJUFRJT04pOwotCQkJaWYgKGNoaWxkcmVuLmxlbmd0aD49MSkgewotCQkJCXJldHVybiBjaGlsZHJlblswXS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBnZXRJY29uRnJvbUNvbmZpZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnKSB7Ci0JCQlTdHJpbmcgaWNvbk5hbWUgPSBjb25maWcuZ2V0QXR0cmlidXRlKEFUVF9JQ09OKTsKLQkJCWlmIChpY29uTmFtZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksIGljb25OYW1lKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwcml2YXRlIGludCBnZXRNZW51SW5kZXhGcm9tQ29uZmlnKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNsYXNzRWxlbWVudHMgPSBjb25maWcuZ2V0Q2hpbGRyZW4oVEFHX0NMQVNTKTsKLQkJCWlmIChjbGFzc0VsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjbGFzc0VsZW1lbnQgOiBjbGFzc0VsZW1lbnRzKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHBhcmFtRWxlbWVudHMgPSBjbGFzc0VsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX1BBUkFNRVRFUik7Ci0JCQkJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IHBhcmFtRWxlbWVudCA6IHBhcmFtRWxlbWVudHMpIHsKLQkJCQkJCWlmIChBVFRfTUVOVUlOREVYLmVxdWFscyhwYXJhbUVsZW1lbnQuZ2V0QXR0cmlidXRlKFRBR19OQU1FKSkpIHsKLQkJCQkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChwYXJhbUVsZW1lbnQuZ2V0QXR0cmlidXRlKFRBR19WQUxVRSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQkJdHJ5IHsKLQkJCQlJTmV3V2l6YXJkIHdpemFyZCA9IGNyZWF0ZVdpemFyZCgpOwotCQkJCXdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIGdldFNlbGVjdGlvbigpKTsKLQkJCQkKLQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJCQlQaXhlbENvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgUGl4ZWxDb252ZXJ0ZXIoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJCQlkaWFsb2cuc2V0TWluaW11bVBhZ2VTaXplKGNvbnZlcnRlci5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNzApLCBjb252ZXJ0ZXIuY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygyMCkpOwotCQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCQlpbnQgcmVzID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkKLQkJCQlub3RpZnlSZXN1bHQocmVzID09IFdpbmRvdy5PSyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElOZXdXaXphcmQgY3JlYXRlV2l6YXJkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJcmV0dXJuIChJTmV3V2l6YXJkKSBDb3JlVXRpbGl0eS5jcmVhdGVFeHRlbnNpb24oZkNvbmZpZ3VyYXRpb25FbGVtZW50LCBBVFRfQ0xBU1MpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNZW51SW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZW51SW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRNZW51SW5kZXgoaW50IG1lbnVJbmRleCkgewotCQkJdGhpcy5tZW51SW5kZXggPSBtZW51SW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgewotCQkJT3BlbkpwdFdpemFyZEFjdGlvbiBhY3Rpb24gPSAoT3BlbkpwdFdpemFyZEFjdGlvbikgbzsKLQkJCXJldHVybiBnZXRNZW51SW5kZXgoKSAtIGFjdGlvbi5nZXRNZW51SW5kZXgoKTsKLQkJfQotCi0JfQotCQotCQotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUdfV0laQVJEID0gIndpemFyZCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSlBUQVJUSUZBQ1QgPSAianB0YXJ0aWZhY3QiOy8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHX1BBUkFNRVRFUiA9ICJwYXJhbWV0ZXIiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHX05BTUUgPSAibmFtZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUdfVkFMVUUgPSAidmFsdWUiOy8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfTUVOVUlOREVYID0gIm1lbnVJbmRleCI7Ly8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTF9ORVcgPSAibmV3V2l6YXJkcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgTWVudSBmTWVudTsKLQkKLQlwcml2YXRlIFNoZWxsIGZXaXphcmRTaGVsbDsKLQkKLQlwdWJsaWMgTmV3RW50aXR5RHJvcERvd25BY3Rpb24oKSB7Ci0JCXRoaXMuZk1lbnU9IG51bGw7Ci0JCXNldE1lbnVDcmVhdG9yKHRoaXMpOwotCQkvL1BsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgSUphdmFIZWxwQ29udGV4dElkcy5PUEVOX0NMQVNTX1dJWkFSRF9BQ1RJT04pOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh0aGlzLmZNZW51ICE9IG51bGwpIHsKLQkJCXRoaXMuZk1lbnUuZGlzcG9zZSgpOwotCQkJdGhpcy5mTWVudT0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBNZW51IGdldE1lbnUoTWVudSBwYXJlbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE1lbnUgZ2V0TWVudShDb250cm9sIHBhcmVudCkgewotCQlpZiAodGhpcy5mTWVudSA9PSBudWxsKSB7Ci0JCQl0aGlzLmZNZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLQkJCU9wZW5KcHRXaXphcmRBY3Rpb25bXSBhY3Rpb25zID0gZ2V0QWN0aW9uRnJvbURlc2NyaXB0b3JzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlPcGVuSnB0V2l6YXJkQWN0aW9uIGN1cnIgPSBhY3Rpb25zW2ldOwotCQkJCWN1cnIuc2V0U2hlbGwodGhpcy5mV2l6YXJkU2hlbGwpOwotCQkJCUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGN1cnIpOwotCQkJCWl0ZW0uZmlsbCh0aGlzLmZNZW51LCAtMSk7CQkJCQotCQkJfQkJCQotCQkKLQkJfQotCQlyZXR1cm4gdGhpcy5mTWVudTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlnZXREZWZhdWx0QWN0aW9uKCkucnVuKCk7Ci0JfQotCQotCXB1YmxpYyBBY3Rpb24gZ2V0RGVmYXVsdEFjdGlvbigpIHsKLQkJQWN0aW9uW10gYWN0aW9ucyA9IGdldEFjdGlvbkZyb21EZXNjcmlwdG9ycygpOwotCQlpZiAoYWN0aW9ucy5sZW5ndGggPiAwKQotCQkJcmV0dXJuIGFjdGlvbnNbMF07Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE9wZW5KcHRXaXphcmRBY3Rpb25bXSBnZXRBY3Rpb25Gcm9tRGVzY3JpcHRvcnMoKSB7Ci0JCUFycmF5TGlzdDxPcGVuSnB0V2l6YXJkQWN0aW9uPiBjb250YWluZXJzPSBuZXcgQXJyYXlMaXN0PE9wZW5KcHRXaXphcmRBY3Rpb24+KCk7Ci0JCQotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFBsYXRmb3JtVUkuUExVR0lOX0lELCBQTF9ORVcpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb25Qb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudD0gZWxlbWVudHNbaV07Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfV0laQVJEKSAmJiBpc0pwdEFydGlmYWN0V2l6YXJkKGVsZW1lbnQpKSB7Ci0JCQkJCWNvbnRhaW5lcnMuYWRkKG5ldyBPcGVuSnB0V2l6YXJkQWN0aW9uKGVsZW1lbnQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJT3BlbkpwdFdpemFyZEFjdGlvbltdIGFjdGlvbnMgPSBjb250YWluZXJzLnRvQXJyYXkobmV3IE9wZW5KcHRXaXphcmRBY3Rpb25bY29udGFpbmVycy5zaXplKCldKTsKLQkJQXJyYXlzLnNvcnQoYWN0aW9ucyk7Ci0JCXJldHVybiBhY3Rpb25zOwotCX0KLQkJCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0pwdEFydGlmYWN0V2l6YXJkKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNsYXNzRWxlbWVudHM9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX0NMQVNTKTsKLQkJaWYgKGNsYXNzRWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGNsYXNzRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBwYXJhbUVsZW1lbnRzPSBjbGFzc0VsZW1lbnRzW2ldLmdldENoaWxkcmVuKFRBR19QQVJBTUVURVIpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcGFyYW1FbGVtZW50cy5sZW5ndGg7IGsrKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY3Vycj0gcGFyYW1FbGVtZW50c1trXTsKLQkJCQkJaWYgKEFUVF9KUFRBUlRJRkFDVC5lcXVhbHMoY3Vyci5nZXRBdHRyaWJ1dGUoVEFHX05BTUUpKSkgewotCQkJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjdXJyLmdldEF0dHJpYnV0ZShUQUdfVkFMVUUpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCWZXaXphcmRTaGVsbD0gd2luZG93LmdldFNoZWxsKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlydW4oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvU2VsZWN0SnBhT3JtTWFwcGluZ0ZpbGVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvU2VsZWN0SnBhT3JtTWFwcGluZ0ZpbGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkYjMyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL1NlbGVjdEpwYU9ybU1hcHBpbmdGaWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMub3JtLk1hcHBpbmdGaWxlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLQotcHVibGljIGNsYXNzIFNlbGVjdEpwYU9ybU1hcHBpbmdGaWxlRGlhbG9nIGV4dGVuZHMgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9JTkYgPSAiTUVUQS1JTkYiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSAiIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTTEFTSCA9ICcvJzsKLQotCXByaXZhdGUgU3RyaW5nIHhtbE5hbWUgPSBFTVBUWTsKLQotCXByaXZhdGUgZmluYWwgSVByb2plY3QgcHJvamVjdDsKLQkKLQlwcml2YXRlIExhYmVsIG1lc3NhZ2VMYWJlbDsKLQlwcml2YXRlIFRyZWUgdHJlZVdpZGdldDsKLQotCXB1YmxpYyBTZWxlY3RKcGFPcm1NYXBwaW5nRmlsZURpYWxvZyhTaGVsbCBwYXJlbnQsIElQcm9qZWN0IHByb2plY3QsIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQlzdXBlcihwYXJlbnQsIGxhYmVsUHJvdmlkZXIsIGNvbnRlbnRQcm92aWRlcik7Ci0JCXNldEFsbG93TXVsdGlwbGUoZmFsc2UpOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlCdXR0b24gbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJbmV3QnV0dG9uLnNldFRleHQoSnB0VWlNZXNzYWdlcy5TZWxlY3RKcGFPcm1NYXBwaW5nRmlsZURpYWxvZ19uZXdCdXR0b24pOwotCQlHcmlkRGF0YSBicm93c2VCdXR0b25EYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJbmV3QnV0dG9uLnNldExheW91dERhdGEoYnJvd3NlQnV0dG9uRGF0YSk7CQkKLQkJbmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvcGVuTmV3TWFwcGluZ0ZpbGVXaXphcmQoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZU1lc3NhZ2VBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJdGhpcy5tZXNzYWdlTGFiZWwgPSBzdXBlci5jcmVhdGVNZXNzYWdlQXJlYShjb21wb3NpdGUpOwotCQlyZXR1cm4gdGhpcy5tZXNzYWdlTGFiZWw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRyZWVWaWV3ZXIgY3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IHN1cGVyLmNyZWF0ZVRyZWVWaWV3ZXIocGFyZW50KTsKLSAgICAgICAgdGhpcy50cmVlV2lkZ2V0ID0gdHJlZVZpZXdlci5nZXRUcmVlKCk7Ci0gICAgICAgIHJldHVybiB0cmVlVmlld2VyOwotCX0KLQkvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhbHRlcm5hdGl2ZSBtYXBwaW5nIFhNTAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hvc2VuTmFtZSgpIHsKLSAgICAJU3RyaW5nIHJlc3VsdCA9IEVNUFRZOwotCQlPYmplY3QgZWxlbWVudCA9IGdldEZpcnN0UmVzdWx0KCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgZWxlbWVudDsKLQkJCXJlc3VsdCA9IGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyB0aGlzLnhtbE5hbWU7CQkJCQkKLQkJfSBlbHNlIHsKLQkJCUlGaWxlIGYgPSAoSUZpbGUpIGVsZW1lbnQ7Ci0JCQlyZXN1bHQgPSBmLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpOwotCQl9Ci0JCXJlc3VsdCA9IHJlbW92ZVJlZHVuZGFudFNlZ21lbnRGcm9tTmFtZShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotICAgIH0KLQotCUBPdmVycmlkZQotICAgIC8qCi0gICAgICogQHNlZSBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyN1cGRhdGVPS1N0YXR1cyhDb21wb3NpdGUpCi0gICAgICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlT0tTdGF0dXMoKSB7Ci0JCXN1cGVyLnVwZGF0ZU9LU3RhdHVzKCk7Ci0JCVRyZWVTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFRyZWVTZWxlY3Rpb24pZ2V0VHJlZVZpZXdlcigpLmdldFNlbGVjdGlvbigpOwotCQlJUmVzb3VyY2Ugc2VsZWN0ZWRSZXNvdXJjZSA9IChJUmVzb3VyY2UpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKHNlbGVjdGVkUmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJdXBkYXRlU3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSnB0VWlQbHVnaW4uUExVR0lOX0lELCAiIikpOwotCQl9Ci0JCWVsc2UgewotCQkJdXBkYXRlU3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0VWlQbHVnaW4uUExVR0lOX0lELCAiIikpOwotCQl9Ci0JfQotCQotCS8qKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgcHVycG9zZXMgb25seQotCSAqIEBwYXJhbSBpbnB1dCBub24gZm9ybWF0ZWQgcGF0aCB0byB0aGUgbWFwcGluZyBYTUwKLQkgKiBAcmV0dXJuIHRoZSBmb3JtYXRlZCBwYXRoIHRvIHRoZSBtYXBwaW5nIFhNTAotCSAqLwotCXByaXZhdGUgU3RyaW5nIHJlbW92ZVJlZHVuZGFudFNlZ21lbnRGcm9tTmFtZShTdHJpbmcgaW5wdXQpIHsKLQkJU3RyaW5nIG91dHB1dCA9IGlucHV0LnN1YnN0cmluZyhpbnB1dC5pbmRleE9mKE1FVEFfSU5GKSk7CQkJIAotCQlvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsIFNMQVNIKTsKLQkJcmV0dXJuIG91dHB1dDsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBvcGVuTmV3TWFwcGluZ0ZpbGVXaXphcmQoKSB7Ci0JCUlQYXRoIHBhdGggPSBNYXBwaW5nRmlsZVdpemFyZC5jcmVhdGVOZXdNYXBwaW5nRmlsZShuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0aGlzLnByb2plY3QpLCBudWxsKTsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJLy90aGVzZSBhcmUgZGlzYWJsZWQgaWYgdGhlIHRyZWUgaXMgZW1wdHkgd2hlbiB0aGUgZGlhbG9nIGlzIGNyZWF0ZWQuCi0JCQl0aGlzLm1lc3NhZ2VMYWJlbC5zZXRFbmFibGVkKHRydWUpOwotCQkJdGhpcy50cmVlV2lkZ2V0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlJRmlsZSBmaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRQbGF0Zm9ybUZpbGUodGhpcy5wcm9qZWN0LCBwYXRoKTsKLQkJCWdldFRyZWVWaWV3ZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsZSksIHRydWUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0Fubm90YXRlZEVudGl0eVRlbXBsYXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9Bbm5vdGF0ZWRFbnRpdHlUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGZkMDkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0Fubm90YXRlZEVudGl0eVRlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGVkRW50aXR5VGVtcGxhdGUKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbmw7Ci0gIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEFubm90YXRlZEVudGl0eVRlbXBsYXRlIGNyZWF0ZShTdHJpbmcgbGluZVNlcGFyYXRvcikKLSAgewotICAgIG5sID0gbGluZVNlcGFyYXRvcjsKLSAgICBBbm5vdGF0ZWRFbnRpdHlUZW1wbGF0ZSByZXN1bHQgPSBuZXcgQW5ub3RhdGVkRW50aXR5VGVtcGxhdGUoKTsKLSAgICBubCA9IG51bGw7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgTkwgPSBubCA9PSBudWxsID8gKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpIDogbmw7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xID0gInBhY2thZ2UgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIgPSAiOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zID0gTkw7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80ID0gTkwgKyAiaW1wb3J0ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81ID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNiA9IE5MICsgTkwgKyAiLyoqIiArIE5MICsgIiAqIEVudGl0eSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgRW50aXR5OiAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNyA9IE5MICsgIiAqIiArIE5MICsgIiAqLyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF84ID0gTkw7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85ID0gIihuYW1lPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEwID0gIlwiKSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMSA9IE5MICsgIkBUYWJsZShuYW1lPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEyID0gIlwiKSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMyA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTQgPSBOTCArICJASWRDbGFzcygiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTUgPSAiLmNsYXNzKSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNiA9IE5MICsgInB1YmxpYyBjbGFzcyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTcgPSAiIGV4dGVuZHMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE4ID0gIiBpbXBsZW1lbnRzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xOSA9ICIsICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMCA9ICIgeyIgKyBOTCArICIiICsgTkwgKyAiXHQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjEgPSAiICAgIiArIE5MICsgIlx0QElkIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIyID0gTkwgKyAiXHRwcml2YXRlICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMyA9ICIgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI0ID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjUgPSBOTCArICJcdHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOyIgKyBOTCArICIiICsgTkwgKyAiXHRwdWJsaWMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI2ID0gIigpIHsiICsgTkwgKyAiXHRcdHN1cGVyKCk7IiArIE5MICsgIlx0fSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNyA9ICIgICAiICsgTkwgKyAiXHRASWQgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI4ID0gIiAgICIgKyBOTCArICJcdHB1YmxpYyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjkgPSAiIGdldCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMCA9ICIoKSB7IiArIE5MICsgIlx0XHRyZXR1cm4gdGhpcy4iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzEgPSAiOyIgKyBOTCArICJcdH0iICsgTkwgKyAiIiArIE5MICsgIlx0cHVibGljIHZvaWQgc2V0IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMyID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzMgPSAiICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNCA9ICIpIHsiICsgTkwgKyAiXHRcdHRoaXMuIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM1ID0gIiA9ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNiA9ICI7IiArIE5MICsgIlx0fSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNyA9IE5MICsgIiAgICIgKyBOTCArICJ9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM4ID0gTkw7Ci0KLSAgcHVibGljIFN0cmluZyBnZW5lcmF0ZShPYmplY3QgYXJndW1lbnQpCi0gIHsKLSAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsID0gKENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwpIGFyZ3VtZW50OyAKLWlmIChtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9bnVsbCAmJiBtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9IiIpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yKTsKLSAgICB9Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMpOwotICAgICBDb2xsZWN0aW9uPFN0cmluZz4gaW1wb3J0cyA9IG1vZGVsLmdldEltcG9ydHMoZmFsc2UpOwotZm9yIChTdHJpbmcgYW5JbXBvcnQgOiBpbXBvcnRzKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGFuSW1wb3J0KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNSk7Ci0gICAgIH0gCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0RW50aXR5TmFtZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzgpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0QXJ0aWZhY3RUeXBlKCkpOwotICAgIFN0cmluZyBFTlRJVFlfTkFNRSA9IG1vZGVsLmdldEVudGl0eU5hbWUoKTsKLWlmIChtb2RlbC5pc0VudGl0eU5hbWVTZXQoKSkgewotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF85KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEVOVElUWV9OQU1FKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTApOwotICAgIH0KLSAgICBpZiAobW9kZWwuaXNUYWJsZU5hbWVTZXQoKSkgewotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChtb2RlbC5nZXRUYWJsZU5hbWUoKSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEyKTsKLSAgICB9Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEzKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0gICAgaWYgKG1vZGVsLmlzQ29tcG9zaXRlUEsoKSkgewotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChtb2RlbC5nZXRJZENsYXNzTmFtZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTUpOwotICAgIH0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTYpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0Q2xhc3NOYW1lKCkpOwotICAgIFN0cmluZyBzdXBlckNsYXNzID0gbW9kZWwuZ2V0U3VwZXJjbGFzc05hbWUoKTsKLQlpZiAoISAiIi5lcXVhbHMoc3VwZXJDbGFzcykpIHsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoc3VwZXJDbGFzcyk7Ci0gICAgfQotICAgIAotCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gbW9kZWwuZ2V0SW50ZXJmYWNlcygpOyAKLQlpZiAoaW50ZXJmYWNlcy5zaXplKCk+MCkgewotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xOCk7Ci0gICAgIH0KLQlmb3IgKGludCBpPTA7IGk8aW50ZXJmYWNlcy5zaXplKCk7IGkrKykgewotIAkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOwotCQlpZiAoaT4wKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xOSk7Ci0gICAgfQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoSU5URVJGQUNFKTsKLSAgICB9Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIwKTsKLSAgICAgTGlzdDxFbnRpdHlSb3c+IGZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOwotCUxpc3Q8U3RyaW5nPiBwa0ZpZWxkcyA9IG1vZGVsLmdldFBLRmllbGRzKCk7IAotIAlmb3IgKEVudGl0eVJvdyBlbnRpdHkgOiBmaWVsZHMpIHsKLQkJU3RyaW5nIE5BTUUgPSBlbnRpdHkuZ2V0TmFtZSgpOwotCQlpZiAocGtGaWVsZHMuY29udGFpbnMoTkFNRSkgJiYgbW9kZWwuaXNGaWVsZEFjY2VzcygpKSB7Ci0gICAgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIxKTsKLSAgICB9Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIyKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGVudGl0eS5nZXRUeXBlKCkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChlbnRpdHkuZ2V0TmFtZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjQpOwotICAgIH0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0Q2xhc3NOYW1lKCkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNik7Ci0gICAgCi0JZmllbGRzID0gbW9kZWwuZ2V0RW50aXR5RmllbGRzKCk7Ci0JaWYgKGZpZWxkcyAhPSBudWxsKSBmb3IgKGludCBpPTA7IGk8ZmllbGRzLnNpemUoKTsgaSsrKSB7Ci0JCUVudGl0eVJvdyBmaWVsZCA9IChFbnRpdHlSb3cpIGZpZWxkcy5nZXQoaSk7Ci0JCVN0cmluZyBUWVBFID0gZmllbGQuZ2V0VHlwZSgpOwotCQlTdHJpbmcgTkFNRSA9IGZpZWxkLmdldE5hbWUoKTsKLQkJU3RyaW5nIE1FVEhPRCA9IE5BTUUuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIE5BTUUuc3Vic3RyaW5nKDEpOwotCWlmIChwa0ZpZWxkcy5jb250YWlucyhOQU1FKSAmJiAhbW9kZWwuaXNGaWVsZEFjY2VzcygpKSB7Ci0gICAgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI3KTsKLSAgICB9Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI4KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRZUEUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yOSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChNRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChOQU1FKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzEpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTUVUSE9EKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzIpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVFlQRSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMzKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE5BTUUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChOQU1FKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTkFNRSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM2KTsKLSAgICB9Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM3KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzgpOwotICAgIHJldHVybiBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5Q2xhc3NXaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlDbGFzc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzYjQ4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlDbGFzc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERpbWl0ZXIgRGltaXRyb3YsIGQuZGltaXRyb3ZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLlhtbE1hcHBpbmdGaWxlVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLlNlbGVjdEpwYU9ybU1hcHBpbmdGaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLklFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLm9ybS5NYXBwaW5nRmlsZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuTmV3SmF2YUNsYXNzV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlDbGFzc1dpemFyZFBhZ2UKLQkJZXh0ZW5kcyBOZXdKYXZhQ2xhc3NXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfVEFCTEUgPSAiU0lOR0xFX1RBQkxFIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX1BFUl9DTEFTUyA9ICJUQUJMRV9QRVJfQ0xBU1MiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTkVEID0gIkpPSU5FRCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElOSEVSSVRBTkNFX1NUUkFURUdJRVMgPSAKLQkJCW5ldyBTdHJpbmdbXSB7RU1QVFksIFNJTkdMRV9UQUJMRSwgVEFCTEVfUEVSX0NMQVNTLCBKT0lORUQgfTsKLQlwcml2YXRlIENvbWJvIGluaGVyaXRhbmNlU3RyYXRlZ3lDb21ibzsKLQlwcml2YXRlIEJ1dHRvbiBlbnRpdHlCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gbWFwZWRBc1N1cGVyY2xhc3NCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gaW5oZXJpdGFuY2VCdXR0b247Ci0JcHJpdmF0ZSBMaW5rIGRpc3BsYXlOYW1lTGluazsKLQlwcml2YXRlIEJ1dHRvbiB4bWxTdXBwb3J0QnV0dG9uOwkKLQlwcml2YXRlIGJvb2xlYW4gaXNGaXJzdENoZWNrID0gdHJ1ZTsKLQlwcml2YXRlIFRleHQgb3JtWG1sTmFtZTsKLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247CQotCQotCQotCXB1YmxpYyBFbnRpdHlDbGFzc1dpemFyZFBhZ2UoCi0JCQlJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyBwYWdlRGVzYywgU3RyaW5nIHBhZ2VUaXRsZSkgewotCQkKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lLCBwYWdlRGVzYywgcGFnZVRpdGxlLCBudWxsKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gQXJyYXlUb29scy5hZGRBbGwoCi0JCQkJc3VwZXIuZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSwgCi0JCQkJbmV3IFN0cmluZ1tdIHtJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5YTUxfTkFNRSwgSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuWE1MX1NVUFBPUlR9KTsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiAoSVByb2plY3QpIGdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1QpOwotCX0KLQotCS8qIENyZWF0ZSB0b3AgbGV2ZWwgY29tcG9zaXRlIChjbGFzcyBwcm9wZXJ0aWVzKSBhbmQgYWRkIHRoZSBlbnRpdHkncyBzcGVjaWZpYyBpbmhlcml0YW5jZSBncm91cAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLk5ld0phdmFDbGFzc1dpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfRU5USVRZX0VOVElUWV9DTEFTUyk7Ci0JCQotCQljcmVhdGVJbmhlcml0YW5jZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJdGhpcy5pbmhlcml0YW5jZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gaXNDaGVja2VkID0gaW5oZXJpdGFuY2VCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGlzQ2hlY2tlZCkgewotCQkJCQllbnRpdHlCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQltYXBlZEFzU3VwZXJjbGFzc0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCX0KLQkJCQlpbmhlcml0YW5jZVN0cmF0ZWd5Q29tYm8uc2V0RW5hYmxlZChpc0NoZWNrZWQpOwotCQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFksIHRydWUpOwotCQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5NQVBQRURfQVNfU1VQRVJDTEFTUywgZmFsc2UpOwkJCQkKLQkJCQllbnRpdHlCdXR0b24uc2V0RW5hYmxlZCghaXNDaGVja2VkKTsKLQkJCQltYXBlZEFzU3VwZXJjbGFzc0J1dHRvbi5zZXRFbmFibGVkKCFpc0NoZWNrZWQpOwkJCQkKLQkJCX0KLQkJfSk7CQkKLQkJY3JlYXRlWE1Mc3RvcmFnZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJdGhpcy54bWxTdXBwb3J0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYm9vbGVhbiBpc0NoZWNrZWQgPSB4bWxTdXBwb3J0QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJCWVuYWJsZU1hcHBpbmdYTUxDaG9vc2VHcm91cChpc0NoZWNrZWQpOwotCQkJCWlmIChpc0ZpcnN0Q2hlY2spIHsKLQkJCQkJb3JtWG1sTmFtZS5zZXRUZXh0KEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJCQkJaXNGaXJzdENoZWNrID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9KTsJCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciBnZXRDb250YWluZXJEaWFsb2dTZWxlY3Rpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb25bMF0gIT0gbnVsbCkgewotCQkJCQlpZiAoc2VsZWN0aW9uWzBdIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHNlbGVjdGlvblswXTsKLQkJCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQkJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IEpEVFRvb2xzLmdldEphdmFTb3VyY2VGb2xkZXJzKGphdmFQcm9qZWN0KSkgewotCQkJCQkJCWlmIChwcm9qZWN0LmVxdWFscyhyb290LmdldFJlc291cmNlKCkpKSB7Ci0JCQkJCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoSjJFRVVJTWVzc2FnZXMuQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVkFMSURBVE9SX01FU0cpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVmlld2VyRmlsdGVyIGdldENvbnRhaW5lckRpYWxvZ1ZpZXdlckZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IChTdHJpbmcpIG1vZGVsLmdldFByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBlbGVtZW50OwotCQkJCQlyZXR1cm4gcHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHByb2plY3ROYW1lKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcikgZWxlbWVudDsKLQkJCQkJLy8gb25seSBzaG93IHNvdXJjZSBmb2xkZXJzCi0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IEpEVFRvb2xzLmdldEphdmFTb3VyY2VGb2xkZXJzKGphdmFQcm9qZWN0KSkgewotCQkJCQkJaWYgKGZvbGRlci5lcXVhbHMocm9vdC5nZXRSZXNvdXJjZSgpKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgaW5oZXJpdGFuY2UgZ3JvdXAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVJbmhlcml0YW5jZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgRW50aXR5V2l6YXJkTXNnLklOSEVSSVRBTkNFX0dST1VQKTsKLQkJdGhpcy5lbnRpdHlCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihncm91cCwgRW50aXR5V2l6YXJkTXNnLkVOVElUWSwgSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRU5USVRZKTsKLQkJdGhpcy5tYXBlZEFzU3VwZXJjbGFzc0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGdyb3VwLCBFbnRpdHlXaXphcmRNc2cuTUFQUEVEX0FTX1NVUEVSQ0xBU1MsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLk1BUFBFRF9BU19TVVBFUkNMQVNTKTsKLQkJdGhpcy5pbmhlcml0YW5jZUJ1dHRvbiA9IGNyZWF0ZUNoZWNrQnV0dG9uKGdyb3VwLCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwsIDEvKmhvcml6b250YWwgc3BhbiovLCBFbnRpdHlXaXphcmRNc2cuSU5IRVJJVEFOQ0VfQ0hFQ0tfQk9YLCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5JTkhFUklUQU5DRSk7Ci0JCWNyZWF0ZUNvbWJvQm94KGdyb3VwLCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5JTkhFUklUQU5DRV9TVFJBVEVHWSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZ3JvdXAsIHdoaWNoIG1hbmFnZSBlbnRpdHkgbWFwcGluZyByZWdpc3RyYXRpb24KLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVYTUxzdG9yYWdlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCBFbnRpdHlXaXphcmRNc2cuWE1MX1NUT1JBR0VfR1JPVVApOwotCQl0aGlzLnhtbFN1cHBvcnRCdXR0b24gPSBjcmVhdGVDaGVja0J1dHRvbihncm91cCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCAzLypob3Jpem9udGFsIHNwYW4qLywgRW50aXR5V2l6YXJkTXNnLlhNTF9TVVBQT1JULCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5YTUxfU1VQUE9SVCk7CQkJCQotCQljcmVhdGVCcm93c2VHcm91cChncm91cCwgRW50aXR5V2l6YXJkTXNnLkNIT09TRV9YTUwsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlhNTF9OQU1FKTsKLQkJdGhpcy5vcm1YbWxOYW1lLnNldEVuYWJsZWQoZmFsc2UpOwkJCi0JCXRoaXMuYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwkJCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQgdGhlIG5hbWUvdGl0bGUgb2YgdGhlIGdyb3VwCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBncm91cAotCSAqLwotCXByaXZhdGUgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7CQkKLQkJR3JpZERhdGEgZ3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncm91cEdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShncm91cEdyaWREYXRhKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWdyb3VwLnNldFRleHQodGV4dCk7CQkKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgcmFkaW8gYnV0dG9uCi0JICogQHBhcmFtIHBhcmVudCB0aGUgbWFpbiBjb21wb3NpdGUgLSBpbmhlcml0YW5jZSBncm91cAotCSAqIEBwYXJhbSB0ZXh0IHRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSByZWxhdGVkIHByb3BlcnR5IHRvIHdoaWNoIHRoaXMgYnV0dG9uIHdpbGwgYmUgc3luY2hyb25pemVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBidXR0b24KLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsJCQotCQlHcmlkRGF0YSBncm91cEdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyb3VwR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShncm91cEdyaWREYXRhKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCXRoaXMuc3luY2hIZWxwZXIuc3luY2hSYWRpbyhidXR0b24sIHByb3BlcnR5LCAvKmRlcGVuZGVudENvbnRyb2xzKi8gbnVsbCk7CQkKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGNoZWNrIGJ1dHRvbgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIG1haW4gY29tcG9zaXRlIC0gaW5oZXJpdGFuY2UgZ3JvdXAKLQkgKiBAcGFyYW0gdGV4dCB0aGUgbGFiZWwgb2YgdGhlIGJ1dHRvbgotCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcmVsYXRlZCBwcm9wZXJ0eSB0byB3aGljaCB0aGlzIGJ1dHRvbiB3aWxsIGJlIHN5bmNocm9uaXplZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgYnV0dG9uCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQ2hlY2tCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgaW50IGZpbGxTdHJhdGVneSwgaW50IGhvcml6b250YWxTcGFuLCBTdHJpbmcgdGV4dCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsJCQotCQlHcmlkRGF0YSBncm91cEdyaWREYXRhID0gbmV3IEdyaWREYXRhKGZpbGxTdHJhdGVneSk7Ci0JCWdyb3VwR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ3JvdXBHcmlkRGF0YSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwkJCi0JCXRoaXMuc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChidXR0b24sIHByb3BlcnR5LCAvKmRlcGVuZGVudENvbnRyb2xzKi8gbnVsbCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGNvbWJvIGJveCwgd2hpY2ggcHJlc2VudHMgdGhlIHNldCBvZiBwb3NzaWJsZSBpbmhlcml0YW5jZSBzdHJhdGVnaWVzCi0JICogQHBhcmFtIHBhcmVudCB0aGUgbWFpbiBjb21wb3NpdGUgLSBpbmhlcml0YW5jZSBncm91cAotCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcmVsYXRlZCBwcm9wZXJ0eSB0byB3aGljaCB0aGlzIGJ1dHRvbiB3aWxsIGJlIHN5bmNocm9uaXplZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENvbWJvIGNyZWF0ZUNvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQl0aGlzLmluaGVyaXRhbmNlU3RyYXRlZ3lDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZ3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwkJCi0JCWdyb3VwR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLmluaGVyaXRhbmNlU3RyYXRlZ3lDb21iby5zZXRMYXlvdXREYXRhKGdyb3VwR3JpZERhdGEpOwotCQl0aGlzLmluaGVyaXRhbmNlU3RyYXRlZ3lDb21iby5zZXRJdGVtcyhJTkhFUklUQU5DRV9TVFJBVEVHSUVTKTsJCQotCQl0aGlzLnN5bmNoSGVscGVyLnN5bmNoQ29tYm8odGhpcy5pbmhlcml0YW5jZVN0cmF0ZWd5Q29tYm8sIHByb3BlcnR5LCAvKmRlcGVuZGVudENvbnRyb2xzKi8gbnVsbCk7Ci0JCXRoaXMuaW5oZXJpdGFuY2VTdHJhdGVneUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXR1cm4gdGhpcy5pbmhlcml0YW5jZVN0cmF0ZWd5Q29tYm87CQkKLQkJCi0JfQkKLQkKLQkvKioKLQkgKiBDcmVhdGUgWE1MIGdyb3VwCi0JICogQHBhcmFtIHBhcmVudCB0aGUgbWFpbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gbGFiZWwgdGhlIG5hbWUgb2YgdGhlIGdyb3VwCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSByZWxhdGVkIHByb3BlcnR5IHRvIHdoaWNoIHRoaXMgZ3JvdXAgd2lsbCBiZSBzeW5jaHJvbml6ZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGdyb3VwCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJyb3dzZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsJCi0KLQkJdGhpcy5kaXNwbGF5TmFtZUxpbmsgPSBuZXcgTGluayhjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJdGhpcy5kaXNwbGF5TmFtZUxpbmsuc2V0VGV4dChsYWJlbCk7Ci0JCXRoaXMuZGlzcGxheU5hbWVMaW5rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCXRoaXMuZGlzcGxheU5hbWVMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlvcGVuTmV3TWFwcGluZ0ZpbGVXaXphcmQoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0KLQkJdGhpcy5vcm1YbWxOYW1lID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXRoaXMub3JtWG1sTmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdGhpcy5icm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQl0aGlzLmJyb3dzZUJ1dHRvbi5zZXRUZXh0KEVudGl0eVdpemFyZE1zZy5CUk9XU0VfQlVUVE9OX0xBQkVMKTsKLQkJR3JpZERhdGEgYnJvd3NlQnV0dG9uRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlicm93c2VCdXR0b25EYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJdGhpcy5icm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShicm93c2VCdXR0b25EYXRhKTsJCQotCQl0aGlzLmJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQ2hvb3NlWG1sQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJdGhpcy5zeW5jaEhlbHBlci5zeW5jaFRleHQodGhpcy5vcm1YbWxOYW1lLCBwcm9wZXJ0eSwgLypkZXBlbmRlbnRDb250cm9scyovbnVsbCk7Ci0JCQotCQllbmFibGVNYXBwaW5nWE1MQ2hvb3NlR3JvdXAoZmFsc2UpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5OZXdNYXBwaW5nRmlsZVdpemFyZCgpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJSVBhdGggcGF0aCA9IE1hcHBpbmdGaWxlV2l6YXJkLmNyZWF0ZU5ld01hcHBpbmdGaWxlKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHByb2plY3QpLCBnZXRNYXBwaW5nRmlsZU5hbWUoKSk7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCXRoaXMubW9kZWwuc2V0UHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuWE1MX05BTUUsIHBhdGgudG9TdHJpbmcoKSk7Ci0JCQkvL2hhdmUgdG8gdmFsaWRhdGUgaW4gY2FzZSB0aGUgZmlsZSBuYW1lIGRpZCBub3QgYWN0dWFsbHkgY2hhbmdlLCBidXQgdGhlIHhtbCBmaWxlIHdhcyBjcmVhdGVkCi0JCQl2YWxpZGF0ZVBhZ2UoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBpbmdGaWxlTmFtZSgpIHsKLQkJU3RyaW5nIG1hcHBpbmdGaWxlTG9jYXRpb24gPSB0aGlzLm1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlhNTF9OQU1FKTsKLQkJcmV0dXJuIG5ldyBGaWxlKG1hcHBpbmdGaWxlTG9jYXRpb24pLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIGJyb3dzaW5nIHdoZW4gdGhlIEJyb3dzZS4uLiBidXR0b24gaGF2ZSBiZWVuIHByZXNzZWQuIEFsbG93IGNob29zaW5nIG9mIAotCSAqIFhNTCBmb3IgZW50aXR5IG1hcHBpbmcgcmVnaXN0cmF0aW9uCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVDaG9vc2VYbWxCdXR0b25QcmVzc2VkKCkgewkJCi0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCVZpZXdlckZpbHRlciBmaWx0ZXIgPSBnZXREaWFsb2dWaWV3ZXJGaWx0ZXIoanBhUHJvamVjdCk7Ci0JCUlUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCk7Ci0JCVNlbGVjdEpwYU9ybU1hcHBpbmdGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RKcGFPcm1NYXBwaW5nRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBwcm9qZWN0LCBsYWJlbFByb3ZpZGVyLCBjb250ZW50UHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0VGl0bGUoRW50aXR5V2l6YXJkTXNnLk1BUFBJTkdfWE1MX1RJVExFKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoRW50aXR5V2l6YXJkTXNnLkNIT09TRV9NQVBQSU5HX1hNTF9NRVNTQUdFKTsKLQkJZGlhbG9nLmFkZEZpbHRlcihmaWx0ZXIpOwotCQkJCi0JCVN0cmluZyBvcm1GaWxlTmFtZSA9IHRoaXMub3JtWG1sTmFtZS5nZXRUZXh0KCk7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0ganBhUHJvamVjdC5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKG9ybUZpbGVOYW1lKSk7Ci0JCUlGaWxlIGluaXRpYWxTZWxlY3Rpb24gPSAocmVzb3VyY2UgIT0gbnVsbCkgPyByZXNvdXJjZS5nZXRGaWxlKCkgOiBudWxsOwotCQlkaWFsb2cuc2V0SW5wdXQocHJvamVjdCk7Ci0KLQkJaWYgKGluaXRpYWxTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb24oaW5pdGlhbFNlbGVjdGlvbik7Ci0JCX0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQl0aGlzLm1vZGVsLnNldFByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlhNTF9OQU1FLCBkaWFsb2cuZ2V0Q2hvc2VuTmFtZSgpKTsKLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNyZWF0ZSBmaWx0ZXIgZm9yIHRoZSBicm93c2UvYWRkIGFsdGVybmF0aXZlIG1hcHBpbmcgWE1MIAotCSAqIEByZXR1cm4gbmV3IGluc3RhbmNlIG9mIHZpZXdlciBmaWx0ZXIgZm9yIHRoZSBTZWxlY3RNYXBwaW5nWE1MRGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIFZpZXdlckZpbHRlciBnZXREaWFsb2dWaWV3ZXJGaWx0ZXIoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgWG1sTWFwcGluZ0ZpbGVWaWV3ZXJGaWx0ZXIoanBhUHJvamVjdCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlbmFibGVNYXBwaW5nWE1MQ2hvb3NlR3JvdXAoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuZGlzcGxheU5hbWVMaW5rLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMub3JtWG1sTmFtZS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl0aGlzLmJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBwcm9qZWN0IGxpc3QgaW5pdGlhbGl6ZXIuIFRoZSBtZXRob2QgY2hlY2tzIAotCSAqIGlmIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBpcyB2YWxpZCB0byBpbmNsdWRlIGl0IGluIHRoZSBwcm9qZWN0IGxpc3QuCi0JICogCi0JICogPHA+U3ViY2xhc3NlcyBvZiB0aGlzIHdpemFyZCBwYWdlIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byAKLQkgKiBhZGp1c3QgZmlsdGVyaW5nIG9mIHRoZSBwcm9qZWN0cyB0byB0aGVpciBuZWVkcy4gPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHJlZmVyZW5jZSB0byB0aGUgcHJvamVjdCB0byBiZSBjaGVja2VkCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvamVjdCBpcyB2YWxpZCB0byBiZSBpbmNsdWRlZCBpbiAKLQkgKiAJCSAgIHRoZSBwcm9qZWN0IGxpc3QsIDxjb2RlPmZhbHNlPC9jb2RlPiAtIG90aGVyd2lzZS4gCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQcm9qZWN0VmFsaWQoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkgJiYgSnBhRmFjZXQuaXNJbnN0YWxsZWQocHJvamVjdCkpOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hIZWxwU3lzdGVtIGdldEhlbHBTeXN0ZW0oKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlGaWVsZHNXaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlGaWVsZHNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YzBmZjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5RmllbGRzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGltaXRlciBEaW1pdHJvdiwgZC5kaW1pdHJvdkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC5JRW50aXR5RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlGaWVsZHNXaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIFRleHQgZW50aXR5TmFtZVRleHQ7Ci0JcHJpdmF0ZSBUZXh0IHRhYmxlTmFtZVRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gdGFibGVOYW1lQ2hlY2tCdXR0b247CQotCXByaXZhdGUgQnV0dG9uIGZpZWxkQWNjZXNzQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHByb3BlcnR5QWNjZXNzQnV0dG9uOwotCXByaXZhdGUgYm9vbGVhbiBpc05vbkVudGl0eSA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGlzQnV0dG9uc0NyZWF0ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBFbnRpdHlGaWVsZHNXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQl0aGlzLnNldFRpdGxlKEVudGl0eVdpemFyZE1zZy5FTlRJVFlfUFJPUEVSVElFU19USVRMRSk7Ci0JCXRoaXMuc2V0RGVzY3JpcHRpb24oRW50aXR5V2l6YXJkTXNnLkVOVElUWV9QUk9QRVJUSUVTX0RFU0NSSVBUSU9OKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRU5USVRZX0ZJRUxEUywgCi0JCQkJCQkJSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuUEtfRklFTERTfTsKLQl9Ci0JCi0JLyogQ3JlYXRlIHRoZSBtYWluIGNvbXBvc2l0ZSBhbmQgYWRkIHRvIGl0IHRoZSBlbnRpdHkgcHJvcGVydGllcwotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXRoaXMuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5ORVdfSlBBX0VOVElUWV9FTlRJVFlfUFJPUEVSVElFUyk7Ci0JCQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQlkYXRhLmhlaWdodEhpbnQgPSA0NTA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljb21wb3NpdGUucGFjaygpOwotCQkJCQotCQllbnRpdHlOYW1lVGV4dCA9IGNyZWF0ZU5hbWVHcm91cChjb21wb3NpdGUsIEVudGl0eVdpemFyZE1zZy5FTlRJVFlfTkFNRSwgSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRU5USVRZX05BTUUpOwkJCi0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAoY29tcG9zaXRlLCBFbnRpdHlXaXphcmRNc2cuVEFCTEVfTkFNRV9HUk9VUCk7Ci0JCXRhYmxlTmFtZUNoZWNrQnV0dG9uPSBjcmVhdGVDaGVja0J1dHRvbihncm91cCwgRW50aXR5V2l6YXJkTXNnLlVTRV9ERUZBVUxULCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5UQUJMRV9OQU1FX0RFRkFVTFQpOwkJCi0JCXRhYmxlTmFtZVRleHQgPSBjcmVhdGVOYW1lR3JvdXAoZ3JvdXAsIEVudGl0eVdpemFyZE1zZy5UQUJMRV9OQU1FLCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5UQUJMRV9OQU1FKTsKLQkJdGFibGVOYW1lVGV4dC5zZXRFbmFibGVkKCF0YWJsZU5hbWVDaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCWlzQnV0dG9uc0NyZWF0ZWQgPSB0cnVlOwotCQlpbml0TmFtZUdyb3VwKCk7Ci0JCWNyZWF0ZUVudGl0eUZpZWxkc0dyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJR3JvdXAgYWNjZXNzVHlwZUdyb3VwID0gY3JlYXRlR3JvdXAoY29tcG9zaXRlLCBFbnRpdHlXaXphcmRNc2cuQUNDRVNTX1RZUEUpOwotCQlmaWVsZEFjY2Vzc0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGFjY2Vzc1R5cGVHcm91cCwgRW50aXR5V2l6YXJkTXNnLkZJRUxEX0JBU0VELCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5GSUVMRF9BQ0NFU1NfVFlQRSk7Ci0JCXByb3BlcnR5QWNjZXNzQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oYWNjZXNzVHlwZUdyb3VwLCBFbnRpdHlXaXphcmRNc2cuUFJPUEVSVFlfQkFTRUQsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST1BFUlRZX0FDQ0VTU19UWVBFKTsKLQkJCi0JCQotCQlJU3RhdHVzIHByb2plY3RTdGF0dXMgPSB2YWxpZGF0ZVByb2plY3ROYW1lKCk7Ci0JCWlmICghcHJvamVjdFN0YXR1cy5pc09LKCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShwcm9qZWN0U3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQljb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgcHJvamVjdCBuYW1lIGNvcnJlY3RuZXNzCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVQcm9qZWN0TmFtZSgpIHsKLQkJLy8gY2hlY2sgZm9yIGVtcHR5Ci0JCWlmIChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpID09IG51bGwgfHwgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhFbnRpdHlXaXphcmRNc2cuTk9fSlBBX1BST0pFQ1RTKTsKLQkJfQotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRW50aXR5RmllbGRzR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsJCQotCQlHcmlkRGF0YSBncm91cEdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdyb3VwR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGdyb3VwR3JpZERhdGEpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJZ3JvdXAuc2V0VGV4dChFbnRpdHlXaXphcmRNc2cuRU5USVRZX0ZJRUxEU19HUk9VUCk7Ci0JCW5ldyBFbnRpdHlSb3dUYWJsZVdpemFyZFNlY3Rpb24oZ3JvdXAsIG1vZGVsLCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFlfRklFTERTKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIG5hbWVkIGdyb3VwCi0JICogQHBhcmFtIHBhcmVudCB0aGUgbWFpbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gbGFiZWwgdGhlIG5hbWUgb2YgdGhlIGdyb3VwCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSByZWxhdGVkIHByb3BlcnR5IHRvIHdoaWNoIHRoaXMgZ3JvdXAgd2lsbCBiZSBzeW5jaHJvbml6ZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGdyb3VwCi0JICovCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlTmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsJCi0JCUxhYmVsIGRpc3BsYXlOYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWRpc3BsYXlOYW1lTGFiZWwuc2V0VGV4dChsYWJlbCk7Ci0JCWRpc3BsYXlOYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJVGV4dCBuYW1lVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQluYW1lVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KG5hbWVUZXh0LCBwcm9wZXJ0eSwgLypkZXBlbmRlbnRDb250cm9scyovbnVsbCk7CQkKLQkJcmV0dXJuIG5hbWVUZXh0OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgZ3JvdXAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0IHRoZSBuYW1lIG9mIHRoZSBncm91cAkgCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBncm91cAotCSAqLwkKLQlwcml2YXRlIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwkJCi0JCUdyaWREYXRhIGdyb3VwR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JvdXBHcmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZ3JvdXBHcmlkRGF0YSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlncm91cC5zZXRUZXh0KHRleHQpOwkJCi0JCXJldHVybiBncm91cDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGNoZWNrIGJ1dHRvbgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIG1haW4gY29tcG9zaXRlIC0gaW5oZXJpdGFuY2UgZ3JvdXAKLQkgKiBAcGFyYW0gdGV4dCB0aGUgbGFiZWwgb2YgdGhlIGJ1dHRvbgotCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcmVsYXRlZCBwcm9wZXJ0eSB0byB3aGljaCB0aGlzIGJ1dHRvbiB3aWxsIGJlIHN5bmNocm9uaXplZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgYnV0dG9uCi0JICovCQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUNoZWNrQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlHcmlkRGF0YSBncm91cEdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyb3VwR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShncm91cEdyaWREYXRhKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gaXNDaGVja2VkID0gYnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJCWlmICh0YWJsZU5hbWVUZXh0ICE9IG51bGwpIHsKLQkJCQkJdGFibGVOYW1lVGV4dC5zZXRFbmFibGVkKCFpc0NoZWNrZWQpOwotCQkJCX0KLQkJCX0KLQkJfSk7CQkKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChidXR0b24sIHByb3BlcnR5LCAvKmRlcGVuZGVudENvbnRyb2xzKi8gbnVsbCk7CQkKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9CQkKLQkKLQkvKioKLQkgKiBDcmVhdGUgcmFkaW8gYnV0dG9uCi0JICogQHBhcmFtIHBhcmVudCB0aGUgbWFpbiBjb21wb3NpdGUgLSBpbmhlcml0YW5jZSBncm91cAotCSAqIEBwYXJhbSB0ZXh0IHRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSByZWxhdGVkIHByb3BlcnR5IHRvIHdoaWNoIHRoaXMgYnV0dG9uIHdpbGwgYmUgc3luY2hyb25pemVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBidXR0b24KLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsJCQotCQlHcmlkRGF0YSBncm91cEdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyb3VwR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShncm91cEdyaWREYXRhKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoUmFkaW8oYnV0dG9uLCBwcm9wZXJ0eSwgLypkZXBlbmRlbnRDb250cm9scyovIG51bGwpOwkJCi0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoKLQkgKiBJZiBhIHByb3BlcnR5IGNoYW5nZXMgdGhhdCB3ZSB3YW50IHRvIHZhbGlkYXRlLCBmb3JjZSB2YWxpZGF0aW9uIG9uIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uV1RQT3BlcmF0aW9uRGF0YU1vZGVsTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2VkKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCWlmIChJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5NQVBQRURfQVNfU1VQRVJDTEFTUy5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJaW5pdE5hbWVHcm91cCgpOwotCQl9CQkKLQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIG1ldGhvZHMgaXMgZm9yIHRoZSBpbnRlcm5hbCB1c2Ugb25seS4gSXQgd2lsbCBzZXQgdGhlIGVudGl0eSBhbmQgdGFibGUgbmFtZQotCSAqIGdyb3VwIHRvIGJlIGRpc2FibGVkIGlmIHRoZSBjcmVhdGVkIGFydGlmYWN0IGlzIG5vdCBlbnRpdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdE5hbWVHcm91cCgpIHsJCQotCQlpc05vbkVudGl0eSA9IG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5NQVBQRURfQVNfU1VQRVJDTEFTUyk7CQkKLQkJaWYgKGlzQnV0dG9uc0NyZWF0ZWQpIHsKLQkJCWVudGl0eU5hbWVUZXh0LnNldEVuYWJsZWQoIWlzTm9uRW50aXR5KTsKLQkJCXRhYmxlTmFtZUNoZWNrQnV0dG9uLnNldEVuYWJsZWQoIWlzTm9uRW50aXR5KTsKLQkJCXRhYmxlTmFtZVRleHQuc2V0RW5hYmxlZCghdGFibGVOYW1lQ2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQl9CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hIZWxwU3lzdGVtIGdldEhlbHBTeXN0ZW0oKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5Um93VGFibGVXaXphcmRTZWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlSb3dUYWJsZVdpemFyZFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViMTJmMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlSb3dUYWJsZVdpemFyZFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERpbWl0ZXIgRGltaXRyb3YsIGQuZGltaXRyb3ZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTdHJva2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuQ29udGVudFByb3Bvc2FsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5JQ29udGVudFByb3Bvc2FsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuU2ltcGxlQ29udGVudFByb3Bvc2FsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuVGV4dENvbnRlbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC5FbnRpdHlSb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5UeXBlU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIFRoZSBjbGFzcyBwcmVzZW50cyB0aGUgdGFibGUgd2l0aCBlbnRpdHkgZmllbGRzLiBJbiB0aGUgamF2YSBmaWxlIGFyZSBpbmNsdWRlZCBhbHNvIGNvbnRlbnQKLSAqIGFuZCBsYWJlbCBwcm92aWRlciwgYWRkIGFuZCBlZGl0IGVudGl0eSBkaWFsb2dzIGFzIHdlbGwgYXMgaGVscCBpbnRlcm5hbCBvYmplY3RzIC0gbGlzdGVuZXIgCi0gKiBhbmQgY2FsbGJhY2sgZnJvbSB0aGUgZGlhbG9nIHRvIHRoZSBtYWluIGNvbXBvc2l0ZSAodGFibGUpLiAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlSb3dUYWJsZVdpemFyZFNlY3Rpb24gZXh0ZW5kcyBDb21wb3NpdGUgewotCQotCS8qKgotCSAqIFRoZSBwb3NzaWJsZSBlbnRpdHkgdHlwZXMsIG1lbnRpb25lZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiAoQ2hhcHRlciAyLjEuMSBQZXJzaXN0ZW50IEZpZWxkcyBhbmQgUHJvcGVydGllcyBwLjIwKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nW10gVkFMSURfVFlQRVMgPSB7ImludCIsIAotCQkJCQkJCQkJCQkJICAgImxvbmciLCAKLQkJCQkJCQkJCQkJCSAgICJzaG9ydCIsIAotCQkJCQkJCQkJCQkJICAgImNoYXIiLCAKLQkJCQkJCQkJCQkJCSAgICJib29sZWFuIiwgCi0JCQkJCQkJCQkJCQkgICAiYnl0ZSIsIAotCQkJCQkJCQkJCQkJICAgImRvdWJsZSIsIAotCQkJCQkJCQkJCQkJICAgImZsb2F0IiwgCi0JCQkJCQkJCQkJCQkgICAiamF2YS5sYW5nLlN0cmluZyIsIAotCQkJCQkJCQkJCQkJICAgImphdmEubGFuZy5JbnRlZ2VyIiwgCi0JCQkJCQkJCQkJCQkgICAiamF2YS5sYW5nLkxvbmciLCAKLQkJCQkJCQkJCQkJCSAgICJqYXZhLmxhbmcuU2hvcnQiLAotCQkJCQkJCQkJCQkJICAgImphdmEubGFuZy5DaGFyYWN0ZXIiLCAKLQkJCQkJCQkJCQkJCSAgICJqYXZhLmxhbmcuQm9vbGVhbiIsIAotCQkJCQkJCQkJCQkJICAgImphdmEubGFuZy5CeXRlIiwgCi0JCQkJCQkJCQkJCQkgICAiamF2YS5sYW5nLkRvdWJsZSIsIAotCQkJCQkJCQkJCQkJICAgImphdmEubGFuZy5GbG9hdCIsIAotCQkJCQkJCQkJCQkJICAgImphdmEubWF0aC5CaWdEZWNpbWFsIiwgCi0JCQkJCQkJCQkJCQkgICAiamF2YS5tYXRoLkJpZ0ludGVnZXIiLCAKLQkJCQkJCQkJCQkJCSAgICJqYXZhLnV0aWwuRGF0ZSIsIAotCQkJCQkJCQkJCQkJICAgImphdmEudXRpbC5DYWxlbmRhciIsCi0JCQkJCQkJCQkJCQkgICAiamF2YS5zcWwuRGF0ZSIsIAotCQkJCQkJCQkJCQkJICAgImphdmEuc3FsLlRpbWUiLCAKLQkJCQkJCQkJCQkJCSAgICJqYXZhLnNxbC5UaW1lc3RhbXAiLAotCQkJCQkJCQkJCQkJICAgIlN0cmluZyIsIAotCQkJCQkJCQkJCQkJICAgIkludGVnZXIiLCAKLQkJCQkJCQkJCQkJCSAgICJMb25nIiwgCi0JCQkJCQkJCQkJCQkgICAiU2hvcnQiLAotCQkJCQkJCQkJCQkJICAgIkNoYXJhY3RlciIsIAotCQkJCQkJCQkJCQkJICAgIkJvb2xlYW4iLCAKLQkJCQkJCQkJCQkJCSAgICJCeXRlIiwgCi0JCQkJCQkJCQkJCQkgICAiRG91YmxlIiwgCi0JCQkJCQkJCQkJCQkgICAiRmxvYXQiIH07CQotCQotCSAgcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIG1UYWJsZVZpZXdlciA9IG51bGw7Ci0JICBwcml2YXRlIFRhYmxlIG1UYWJsZVdpZGdldCA9IG51bGw7Ci0JICBwcml2YXRlIGZpbmFsIGludCBOQU1FX0NPTFVNTiA9IDE7Ci0JICBwcml2YXRlIGZpbmFsIGludCBUWVBFX0NPTFVNTiA9IDI7Ci0JCi0JICAKLQotCQotCXByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBlZGl0QnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIFN0cmluZyB0aXRsZSA9IEVudGl0eVdpemFyZE1zZy5FTlRJVFlfRklFTERTX0RJQUxPR19USVRMRTsKLQlwcml2YXRlIFN0cmluZ1tdIHR5cGVQcm9wb3NhbHMgPSBWQUxJRF9UWVBFUzsKLQlwcml2YXRlIFN0cmluZ1tdIGxhYmVsc0ZvclRleHQgPSBuZXcgU3RyaW5nW117RW50aXR5V2l6YXJkTXNnLlRZUEVfVEVYVF9GSUVMRCwgRW50aXR5V2l6YXJkTXNnLk5BTUVfVEVYVF9GSUVMRH07Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIG1vZGVsOwotCXByaXZhdGUgU3RyaW5nIHByb3BlcnR5TmFtZTsKLQlwcml2YXRlIEltYWdlIGxhYmVsUHJvdmlkZXJJbWFnZSA9IG51bGw7Ci0JcHJpdmF0ZSBEaWFsb2dDYWxsYmFjayBjYWxsYmFjazsJCi0JcHJpdmF0ZSBzdGF0aWMgS2V5U3Ryb2tlIGtzID0gbnVsbDsKLQlzdGF0aWMgewotCQl0cnkgewotCQkJa3MgPSBLZXlTdHJva2UuZ2V0SW5zdGFuY2UoIkN0cmwrU3BhY2UiKTsJCQkKLQkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZTEpIHsKLQkJCUpwdFVpUGx1Z2luLmxvZyhlMSk7Ci0JCX0gCi0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZSAtIEVudGl0eSBmaWVsZHMgcGFnZQotCSAqIEBwYXJhbSBtb2RlbCB0aGUgZGF0YSBtb2RlbCByZXByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgZGF0YSBwcm9wZXJ0eSBuYW1lCi0JICovCi0JcHVibGljIEVudGl0eVJvd1RhYmxlV2l6YXJkU2VjdGlvbihDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwkKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsJCQotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJdGhpcy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGhpcy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQltVGFibGVXaWRnZXQgPSBuZXcgVGFibGUodGhpcywgU1dULkNIRUNLIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIG1UYWJsZVdpZGdldC5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBtVGFibGVXaWRnZXQuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIG1UYWJsZVZpZXdlciA9IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKG1UYWJsZVdpZGdldCk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZGF0YS52ZXJ0aWNhbFNwYW4gPSAyOwotCQltVGFibGVXaWRnZXQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbVRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRW50aXR5Um93Q29udGVudFByb3ZpZGVyKCkpOwotCQltVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRW50aXR5Um93TGFiZWxQcm92aWRlcigpKTsKLQkJCi0JCWZpbmFsIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGlvbiA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5VTEwpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJYnV0dG9uQ29tcG9zaXRpb24uc2V0TGF5b3V0KGxheW91dCk7Ci0JCWJ1dHRvbkNvbXBvc2l0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQlhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0aW9uLCBTV1QuUFVTSCk7Ci0JCWFkZEJ1dHRvbi5zZXRUZXh0KEVudGl0eVdpemFyZE1zZy5BRERfQlVUVE9OX0xBQkVMKTsgCi0JCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCS8vRG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQllZGl0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGlvbiwgU1dULlBVU0gpOwotCQllZGl0QnV0dG9uLnNldFRleHQoRW50aXR5V2l6YXJkTXNnLkVESVRfQlVUVE9OX0xBQkVMKTsKLQkJZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWhhbmRsZUVkaXRCdXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJLy9EbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQltVGFibGVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlRWRpdEJ1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRpb24sIFNXVC5QVVNIKTsKLQkJcmVtb3ZlQnV0dG9uLnNldFRleHQoRW50aXR5V2l6YXJkTXNnLlJFTU9WRV9CVVRUT05fTEFCRUwpOwotCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvL0RvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQltVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChlZGl0QnV0dG9uICE9IG51bGwpIHsKLQkJCQkJYm9vbGVhbiBlbmFibGVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCkgPT0gMTsKLQkJCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJCX0KLQkJCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCghc2VsZWN0aW9uLmlzRW1wdHkoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJCi0JCWZpbmFsIFRhYmxlQ29sdW1uIHBrQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1UYWJsZVdpZGdldCwgU1dULkNIRUNLKTsKLSAgICAgICAgcGtDb2x1bW4uc2V0VGV4dChFbnRpdHlXaXphcmRNc2cuS0VZKTsKLQkJcGtDb2x1bW4ucGFjaygpOwotCQlwa0NvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIG5hbWVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obVRhYmxlV2lkZ2V0LCBTV1QuTk9ORSk7Ci0gICAgICAgIG5hbWVDb2x1bW4uc2V0VGV4dChFbnRpdHlXaXphcmRNc2cuTkFNRV9DT0xVTU4pOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIHR5cGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obVRhYmxlV2lkZ2V0LCBTV1QuTk9ORSk7Ci0gICAgICAgIHR5cGVDb2x1bW4uc2V0VGV4dChFbnRpdHlXaXphcmRNc2cuVFlQRV9DT0xVTU4pOwotCi0gICAgICAgIHRoaXMuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgCQlUYWJsZSB0YWJsZSA9IG1UYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICAgICAgICAgICAgICBUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCQkJUG9pbnQgYnV0dG9uQXJlYSA9IGJ1dHRvbkNvbXBvc2l0aW9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSB0YWJsZS5nZXRQYXJlbnQoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IG1UYWJsZVZpZXdlci5nZXRUYWJsZSgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpLSBidXR0b25BcmVhLnggLSBjb2x1bW5zLmxlbmd0aCAqIDIgLSBwa0NvbHVtbi5nZXRXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCArIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKSB7Ci0JCQkJCS8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uIHdpZHRoCi0JCQkJCS8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLQkJCQkJUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLQkJCQkJd2lkdGggLT0gdkJhclNpemUueDsKLQkJCQl9Ci0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpbnQgY29uc3VtZVdpZHRoID0gMDsKLQkJCQlpbnQgY29sID0gY29sdW1ucy5sZW5ndGggLSAxOwotCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAob2xkU2l6ZS54ID4gYXJlYS53aWR0aCkgewotCQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCQkJLy8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCQljb25zdW1lV2lkdGggPSBzZXRDb2x1bW50V2lkdGgod2lkdGgsIGNvbHVtbnMsIGNvbnN1bWVXaWR0aCwgaSk7Ci0JCQkJCQl0YWJsZS5zZXRTaXplKGFyZWEud2lkdGggLSBidXR0b25BcmVhLngJLSAoY29sICogMiArIHBrQ29sdW1uLmdldFdpZHRoKCkpLCBhcmVhLmhlaWdodCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIGJpZ2dlciBzbyBtYWtlIHRoZSB0YWJsZQotCQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJCS8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQkJY29uc3VtZVdpZHRoID0gc2V0Q29sdW1udFdpZHRoKHdpZHRoLCBjb2x1bW5zLCAJY29uc3VtZVdpZHRoLCBpKTsKLQkJCQkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCAtIGJ1dHRvbkFyZWEueCAtIChjb2wgKiAyICsgcGtDb2x1bW4uZ2V0V2lkdGgoKSksIGFyZWEuaGVpZ2h0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSBpbnQgc2V0Q29sdW1udFdpZHRoKGludCB3aWR0aCwgVGFibGVDb2x1bW5bXSBjb2x1bW5zLAotCQkJCQlpbnQgY29uc3VtZVdpZHRoLCBpbnQgaSkgewotCQkJCWlmIChpIDwgY29sdW1ucy5sZW5ndGggLSAxKSB7Ci0JCQkJCWNvbHVtbnNbaV0uc2V0V2lkdGgod2lkdGggLyAoY29sdW1ucy5sZW5ndGggLSAxKSk7Ci0JCQkJCWNvbnN1bWVXaWR0aCArPSBjb2x1bW5zW2ldLmdldFdpZHRoKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29sdW1uc1tpXS5zZXRXaWR0aCh3aWR0aCAtIGNvbnN1bWVXaWR0aCk7Ci0JCQkJfQotCQkJCXJldHVybiBjb25zdW1lV2lkdGg7Ci0JCQl9Ci0JCX0pOwotICAgICAgICAKLQkJbVRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgUEtGaWVsZENoZWNrU3RhdGVMaXN0ZW5lcigpKTsKLQkJY2FsbGJhY2sgPSBuZXcgRmllbGREaWFsb2dDYWxsYmFjaygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHByb2Nlc3MgdGhlIEFkZC4uLiBidXR0b24gcHJlc3NlZCBldmVudC4gSXQgb3BlbnMgZGlhbG9nIHRvCi0JICogYWRkIG5ldyBlbnRpdHkgZmllbGQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCUFkZEZpZWxkRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRGaWVsZERpYWxvZyhnZXRTaGVsbCgpLCB0aXRsZSwgdHlwZVByb3Bvc2FscywgbGFiZWxzRm9yVGV4dCk7Ci0JCWludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQlpZiAocmVzdWx0ID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbnRpdHlSb3cgZW50aXR5Um93ID0gZGlhbG9nLmdldEVudGl0eVJvdygpOwotCQlhZGRFbnRpdHlSb3coZW50aXR5Um93KTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIG5ldyBlbnRpdHkgdG8gdGhlIHRhYmxlIGlucHV0Ci0JICogCi0JICogQHBhcmFtIGVudGl0eQotCSAqICAgICAgICAgICAgdGhlIGVudGl0eSB3aGljaCBoYXZlIHRvIGJlIGFkZGVkIHRvIHRoZSB0YWJsZQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRFbnRpdHlSb3coRW50aXR5Um93IGVudGl0eSkgewotCQlpZiAoZW50aXR5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUxpc3Q8RW50aXR5Um93PiB2YWx1ZUxpc3QgPSAoQXJyYXlMaXN0PEVudGl0eVJvdz4pIG1UYWJsZVZpZXdlci5nZXRJbnB1dCgpOwkJCi0JCWlmICh2YWx1ZUxpc3QgPT0gbnVsbCkKLQkJCXZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8RW50aXR5Um93PigpOwkJCi0JCXZhbHVlTGlzdC5hZGQoZW50aXR5KTsKLQkJc2V0SW5wdXQodmFsdWVMaXN0KTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcHJvY2VzcyB0aGUgRWRpdC4uLiBidXR0b24gcHJlc3NlZCBldmVudC4gSXQgb3BlbnMgZGlhbG9nIHRvIGVkaXQgY2hvc2VuIGVudGl0eSBmaWVsZAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVFZGl0QnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCUlTZWxlY3Rpb24gcyA9IG1UYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCEocyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuOwotCQkKLQkJT2JqZWN0IHNlbGVjdGVkT2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlFbnRpdHlSb3cgZW50aXR5Rm9yRWRpdCA9IChFbnRpdHlSb3cpIHNlbGVjdGVkT2JqOwotCQlpbnQgaW5kZXggPSBtVGFibGVXaWRnZXQuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJYm9vbGVhbiBpc0NoZWNrZWQgPSBtVGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZChlbnRpdHlGb3JFZGl0KTsKLQkJCi0JCUVkaXRGaWVsZERpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdEZpZWxkRGlhbG9nKGdldFNoZWxsKCksIHRpdGxlLCB0eXBlUHJvcG9zYWxzLCBsYWJlbHNGb3JUZXh0LCBlbnRpdHlGb3JFZGl0KTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJRW50aXR5Um93IGVudGl0eVJvdyA9IGRpYWxvZy5nZXRFbnRpdHlSb3coKTsKLQkJaWYgKGVudGl0eVJvdyAhPSBudWxsKSB7CQkJCi0JCQllZGl0RW50aXR5Um93KGluZGV4LCBlbnRpdHlSb3cpOwotCQkJbVRhYmxlVmlld2VyLnNldENoZWNrZWQoZW50aXR5Um93LCBpc0NoZWNrZWQpOwotCQkJbVRhYmxlVmlld2VyLnNldEdyYXllZChlbnRpdHlSb3csIGZhbHNlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFZGl0IGNob3NlbiBlbnRpdHkgZnJvbSB0aGUgdGFibGUKLQkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBlbnRpdHkgaW4gdGhlIHRhYmxlCi0JICogQHBhcmFtIG5ld0VudGl0eSB0aGUgZWRpdGVkIGVudGl0eSBmaWVsZAotCSAqLwotCXByaXZhdGUgdm9pZCBlZGl0RW50aXR5Um93KGludCBpbmRleCwgRW50aXR5Um93IG5ld0VudGl0eSkgewotCQlpZiAobmV3RW50aXR5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlMaXN0PEVudGl0eVJvdz4gdmFsdWVMaXN0ID0gKEFycmF5TGlzdDxFbnRpdHlSb3c+KSBtVGFibGVWaWV3ZXIuZ2V0SW5wdXQoKTsJCQotCQlpZiAodmFsdWVMaXN0ID09IG51bGwpIHsKLQkJCXZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQkJCQotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXZhbHVlTGlzdC5hZGQobmV3RW50aXR5KTsKLQkJfSBlbHNlIHsKLQkJCXZhbHVlTGlzdC5zZXQoaW5kZXgsIG5ld0VudGl0eSk7Ci0JCX0KLQkJCi0JCXNldElucHV0KHZhbHVlTGlzdCk7CQkKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBwcm9jZXNzIHRoZSBSZW1vdmUgYnV0dG9uIHByZXNzZWQgZXZlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG1UYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkgfHwgIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm47Ci0JCUxpc3Qgc2VsZWN0ZWRPYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpOwotCQlyZW1vdmVFbnRpdHlSb3coc2VsZWN0ZWRPYmplY3QpOwkJCi0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHNlbGVjdGVkIGVudGl0aWVzIGZyb20gdGhlIHRhYmxlIAotCSAqIEBwYXJhbSBlbnRpdGllcyBsaXN0IHdpdGggZW50aXRpZXMsIHdoaWNoIHNob3VsZCBiZSByZW1vdmVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudGl0eVJvdyhDb2xsZWN0aW9uIGVudGl0aWVzKSB7Ci0JCUxpc3Q8RW50aXR5Um93PiB2YWx1ZUxpc3QgPSAoQXJyYXlMaXN0PEVudGl0eVJvdz4pIG1UYWJsZVZpZXdlci5nZXRJbnB1dCgpOwotCQl2YWx1ZUxpc3QucmVtb3ZlQWxsKGVudGl0aWVzKTsKLQkJc2V0SW5wdXQodmFsdWVMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGlucHV0IG9mIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBpbnB1dCB0aGUgbGlzdCB3aXRoIGVudGl0aWVzIHdoaWNoIGhhdmUgdG8gYmUgcHJlc2VudGVkIGluIHRoZSB0YWJsZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRJbnB1dChMaXN0IGlucHV0KSB7Ci0JCW1UYWJsZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JCS8vIENyZWF0ZSBhIG5ldyBsaXN0IHRvIHRyaWdnZXIgcHJvcGVydHkgY2hhbmdlCi0JCUFycmF5TGlzdDxFbnRpdHlSb3c+IG5ld0lucHV0ID0gbmV3IEFycmF5TGlzdDxFbnRpdHlSb3c+KCk7Ci0JCW5ld0lucHV0LmFkZEFsbChpbnB1dCk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbmV3SW5wdXQpOwkJCi0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgVGFibGVWaWV3ZXIgb2YgdGhlIHRhYmxlCi0JICovCi0JcHVibGljIFRhYmxlVmlld2VyIGdldFRhYmxlVmlld2VyKCkgewotCQlyZXR1cm4gbVRhYmxlVmlld2VyOwotCX0KLQkKLQkvLyBQUk9WSURFUlMgRk9SIFRIRSBGSUVMRCBUQUJMRQotCQotCS8qKgotCSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgdGFibGUgaXRlbXMKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRW50aXR5Um93Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlzdCkgewotCQkJCXJldHVybiAoKExpc3QpIGVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYVZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCS8vRGVmYXVsdCBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCS8vRGVmYXVsdCBub3RoaW5nCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgdGFibGUgaXRlbXMKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRW50aXR5Um93TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJICAgIGlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCSAgICAgICAgcmV0dXJuIGxhYmVsUHJvdmlkZXJJbWFnZTsgICAgICAgCi0JCSAgICB9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUVudGl0eVJvdyBlbnRpdHkgPSAoRW50aXR5Um93KSBlbGVtZW50OwotCQkJaWYgKGNvbHVtbkluZGV4ID09IE5BTUVfQ09MVU1OKSB7Ci0JCQkJcmV0dXJuIGVudGl0eS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gVFlQRV9DT0xVTU4pIHsKLQkJCQlyZXR1cm4gZW50aXR5LmdldEZxblR5cGVOYW1lKCk7Ci0JCQl9CQkKLQkJCW1UYWJsZVZpZXdlci5zZXRDaGVja2VkKGVudGl0eSwgZW50aXR5LmlzS2V5KCkpOwotCQkJcmV0dXJuICIiOwotCQl9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIGxhYmVsUHJvdmlkZXJJbWFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCVN0cmluZ1tdIGFycmF5ID0gKFN0cmluZ1tdKSBlbGVtZW50OwotCQkJaWYgKGFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCQlyZXR1cm4gYXJyYXlbMF07Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQkKLQkvLyBFTkQgLSBQUk9WSURFUlMgRk9SIFRIRSBGSUVMRCBUQUJMRQkKLQotCS8qKgotCSAqIExpc3RlbmVyIGZvciB0aGUgUHJpbWFyeSBLZXkgY2hlY2sgYm94IGluIHRoZSB0YWJsZSBpdGVtCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQS0ZpZWxkQ2hlY2tTdGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSUNoZWNrU3RhdGVMaXN0ZW5lciB7Ci0KLQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJTGlzdDxTdHJpbmc+IHBrRmllbGRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JICAgICAgICBUYWJsZUl0ZW1bXSBjaGlsZHJlbiA9IG1UYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0JICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBjaGlsZHJlbltpXTsKLQkgICAgICAgICAgICBFbnRpdHlSb3cgZW50aXR5Um93ID0gKEVudGl0eVJvdylpdGVtLmdldERhdGEoKTsgCi0JICAgICAgICAgICAgZW50aXR5Um93LnNldEtleShpdGVtLmdldENoZWNrZWQoKSk7Ci0JCQkJaWYgKGl0ZW0uZ2V0Q2hlY2tlZCgpKQotCQkJCQlwa0ZpZWxkcy5hZGQoZW50aXR5Um93LmdldE5hbWUoKSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBtb2RlbC5zZXRQcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5QS19GSUVMRFMsIHBrRmllbGRzKTsKLQkJfQotCQkKLQl9Ci0JCi0JLy8gQ0FMTEJBQ0sgTUVDSEFOSVNNCi0JLyoqCi0JICogQ2FsbGJhY2sgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIEFkZC9FZGl0LUZpZWxkRGlhbG9nIGNsYXNzZXMuIAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgRGlhbG9nQ2FsbGJhY2sgewotCQkKLQkJLyoqCQotCQkgKiBWYWxpZGF0ZXMgdGhlIHRleHQgZmllbGRzLiAKLQkJICogPHA+VXNlZCB0byBkZWNpZGUgd2hldGhlciB0byBlbmFibGUgdGhlIE9LIGJ1dHRvbiBvZiB0aGUgZGlhbG9nLiAKLQkJICogSWYgdGhlIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IHRoZSBPSyBidXR0b24gaXMgZW5hYmxlZCwgCi0JCSAqIG90aGVyd2lzZSB0aGUgT0sgYnV0dG9uIGlzIGRpc2FibGVkLjwvcD4gCi0JCSAqIEBwYXJhbSBjb21ibyBjb250YWlucyB0aGUgcHJlZGVmaW5lZCB0eXBlcwotCQkgKiBAcGFyYW0gdGV4dHMJdGhlIG5hbWUgb2YgdGhlIGVudGl0eSBmaWVsZAkKLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWVzIGluIHRoZSB0ZXh0IGZpZWxkcyBhcmUgCi0JCSAqICAgICAgICAgdmFsaWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCSAKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKFRleHQgdHlwZSwgVGV4dFtdIHRleHRzKTsKLQkJCi0JCS8qKgotCQkgKiBSZXRyaWV2ZXMgdGhlIGVudGl0eSBwcmVzZW50YXRpb24gb2JqZWN0IGZyb20gdGhlIGZpZWxkcyBvZiB0aGUgZGlhbG9nLiAKLQkJICogPHA+SW1wbGVtZW50ZXJzIG9mIHRoZSBjYWxsYmFjayBjYW4gdXNlIHRoZXNlIG1ldGhvZCB0byBkbyBzb21lIAotCQkgKiBwcmVwcm9jZXNzaW5nIChsaWtlIHRyaW1taW5nKSBvZiB0aGUgZGF0YSBpbiB0aGUgdGV4dCBmaWVsZHMgYmVmb3JlIAotCQkgKiB1c2luZyBpdC4gVGhlIHJldHVybmVkIHZhbHVlcyB3aWxsIGJlIHRoZSBhY3R1YWwgZGF0YSB0aGF0IHdpbGwgYmUgCi0JCSAqIHB1dCBpbiB0aGUgdGFibGUgdmlld2VyLjwvcD4gCi0JCSAqIEBwYXJhbSBjb21ibyBjb250YWlucyB0aGUgcHJlZGVmaW5lZCB0eXBlcwotCQkgKiBAcGFyYW0gdGV4dHMJdGhlIG5hbWUgb2YgdGhlIGVudGl0eSBmaWVsZAkKLQkJICogQHJldHVybiB0aGUgZW50aXR5IHByZXNlbnRhdGlvbiBvYmplY3QgcmV0cmlldmVkIGZyb20gdGhlIGRpYWxvZwotCQkgKi8KLQkJcHVibGljIEVudGl0eVJvdyByZXRyaWV2ZVJlc3VsdFN0cmluZ3MoVGV4dCB0eXBlLCBUZXh0W10gdGV4dHMpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogSW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPkZpZWxkRGlhbG9nQ2FsbGJhY2s8L2NvZGU+IGludGVyZmFjZSBmb3IgCi0JICogYm90aCAiTmFtZSIgYW5kICJUeXBlcyIgdGFibGUgY29sdW1ucy4gCi0JICovCi0JcHVibGljIGNsYXNzIEZpZWxkRGlhbG9nQ2FsbGJhY2sgaW1wbGVtZW50cyBEaWFsb2dDYWxsYmFjayB7Ci0KLQkJLyoqCi0JCSAqIFRoZSBmaXJzdCB0ZXh0IGZpZWxkIHNob3VsZCBub3QgYmUgZW1wdHkuIAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoVGV4dCB0eXBlLCBUZXh0W10gdGV4dHMpIHsKLQkJCWlmICh0ZXh0cy5sZW5ndGggPiAwKSB7Ci0JCQkJSVN0YXR1cyB2YWxpZGF0ZUZpZWxkTmFtZVN0YXR1cyA9IEphdmFDb252ZW50aW9ucwotCQkJCQkJLnZhbGlkYXRlRmllbGROYW1lKHRleHRzWzBdLmdldFRleHQoKSwKLQkJCQkJCQkJSmF2YUNvcmUuVkVSU0lPTl8xXzUsCi0JCQkJCQkJCUphdmFDb3JlLlZFUlNJT05fMV81KTsKLQkJCQlpZiAoIXZhbGlkYXRlRmllbGROYW1lU3RhdHVzLmlzT0soKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHR5cGUuZ2V0VGV4dCgpLmVxdWFscygiIikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEp1c3QgcmV0cmlldmVzIHRoZSB1bm1vZGlmaWVkIHZhbHVlcyBvZiB0aGUgdGV4dCBmaWVsZHMgYXMgYSAKLQkJICogZW50aXR5IGZpZWxkIHByZXNlbnRhdGlvbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLkVudGl0eVJvdwotCQkgKi8KLQkJcHVibGljIEVudGl0eVJvdyByZXRyaWV2ZVJlc3VsdFN0cmluZ3MoVGV4dCB0eXBlLCBUZXh0W10gdGV4dHMpIHsKLQkJCUVudGl0eVJvdyBlbnRpdHkgPSBuZXcgRW50aXR5Um93KCk7CQkJCi0JCQllbnRpdHkuc2V0RnFuVHlwZU5hbWUodHlwZS5nZXRUZXh0KCkpOwotCQkJZW50aXR5LnNldE5hbWUodGV4dHNbMF0uZ2V0VGV4dCgpKTsKLQkJCXJldHVybiBlbnRpdHk7Ci0JCX0KLQl9Ci0JCi0JLy8gVEhFIERJQUxPR1MgVVNFRCBGT1IgQUREL0VESVQgT0YgRU5USVRZIEZJRUxEUyAtIEJFR0lOCi0JCi0JLyoqCi0JICogVGhlIGRpYWxvZyB3aGljaCBjb2xsZWN0IHRoZSBpbmZvcm1hdGlvbiAobmFtZSBhbmQgdHlwZSkgZm9yIHRoZSBuZXcgZW50aXR5IGZpZWxkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBBZGRGaWVsZERpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyLCBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXByb3RlY3RlZCBTdHJpbmcgd2luZG93VGl0bGU7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSB0eXBlUHJvcG9zYWxzOwotCQlwcm90ZWN0ZWQgU3RyaW5nW10gbGFiZWxzRm9yVGV4dDsKLQkJcHJvdGVjdGVkIFRleHRbXSB0ZXh0czsJCQotCQlwcm90ZWN0ZWQgRW50aXR5Um93IGVudGl0eVJvdzsKLQkJcHJvdGVjdGVkIFRleHQgYXR0cmlidXRlVHlwZTsKLQkJcHJvdGVjdGVkIENvbnRlbnRQcm9wb3NhbEFkYXB0ZXIgY29udGVudFByb3Bvc2FsQWRhcHRlcjsgCQkKLQkJCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIEFkZEZpZWxkRGlhbG9nCi0JCSAqIEBwYXJhbSBzaGVsbAotCQkgKiBAcGFyYW0gd2luZG93VGl0bGUgZGlhbG9nIGxhYmVsCi0JCSAqIEBwYXJhbSB0eXBlUHJvcG9zYWxzIHRoZSBlbGVtZW50cyBmb3IgdGhlIGNvbWJvCi0JCSAqIEBwYXJhbSBsYWJlbHNGb3JUZXh0IG5hbWUgdGV4dAotCQkgKi8KLQkJcHVibGljIEFkZEZpZWxkRGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgd2luZG93VGl0bGUsIFN0cmluZ1tdIHR5cGVQcm9wb3NhbHMsIFN0cmluZ1tdIGxhYmVsc0ZvclRleHQpIHsKLQkJCXN1cGVyKHNoZWxsKTsKLQkJCXRoaXMud2luZG93VGl0bGUgPSB3aW5kb3dUaXRsZTsKLQkJCXRoaXMudHlwZVByb3Bvc2FscyA9IHR5cGVQcm9wb3NhbHM7Ci0JCQl0aGlzLmxhYmVsc0ZvclRleHQgID0gbGFiZWxzRm9yVGV4dDsKLQkJfQotCQkKLQkJLyogQ3JlYXRlIHRoZSBhcmVhIG9mIGRpYWxvZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJZ2V0U2hlbGwoKS5zZXRUZXh0KHdpbmRvd1RpdGxlKTsKLQotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCQlsYWJlbC5zZXRUZXh0KGxhYmVsc0ZvclRleHRbMF0pOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJCQotCQkJCi0JCQlhdHRyaWJ1dGVUeXBlID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ly8gfCBTV1QuUkVBRF9PTkxZKTsJCQotCQkJLy9jb21iby5zZXRJdGVtcyhsYWJlbHNGb3JDb21ibyk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsJCQkKLQkJCWF0dHJpYnV0ZVR5cGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCQlicm93c2VCdXR0b24uc2V0VGV4dChFbnRpdHlXaXphcmRNc2cuQlJPV1NFX0JVVFRPTl9MQUJFTCk7Ci0JCQlHcmlkRGF0YSBicm93c2VCdXR0b25EYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCQlicm93c2VCdXR0b25EYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJyb3dzZUJ1dHRvbkRhdGEpOwotCQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWhhbmRsZUNob29zZUVudGl0eVR5cGVCdXR0b25QcmVzc2VkKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJLy8gRG8gbm90aGluZwotCQkJCX0KLQkJCX0pOwotCi0JCQlpbnQgbiA9IGxhYmVsc0ZvclRleHQubGVuZ3RoOwotCQkJdGV4dHMgPSBuZXcgVGV4dFtuLTFdOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpKyspIHsKLQkJCQlMYWJlbCBsYWJlbEkgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCQkJbGFiZWxJLnNldFRleHQobGFiZWxzRm9yVGV4dFtpXSk7Ci0JCQkJbGFiZWxJLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCQkJdGV4dHNbaS0xXSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsJCQotCQkJCXRleHRzW2ktMV0uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCX0KLQotCQkJYXR0cmlidXRlVHlwZS5zZXRGb2N1cygpOwotCQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQkJY3JlYXRlQ29udGVudFByb3Bvc2FsUHJvdmlkZXIoKTsJCQkKLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCX0KLQkJCi0JCXByaXZhdGUgSUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyIGNyZWF0ZUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyKCkgewotCQkJU2ltcGxlQ29udGVudFByb3Bvc2FsUHJvdmlkZXIgY29udFByb3ZpZGVyID0gbmV3IFNpbXBsZUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyKHR5cGVQcm9wb3NhbHMpOwotCQkJY29udFByb3ZpZGVyLnNldEZpbHRlcmluZyh0cnVlKTsKLQkJCQotCQkJY29udGVudFByb3Bvc2FsQWRhcHRlciA9IG5ldyBDb250ZW50UHJvcG9zYWxBZGFwdGVyKAotCQkJCQlhdHRyaWJ1dGVUeXBlLAotCQkJCQluZXcgVGV4dENvbnRlbnRBZGFwdGVyKCksIAotCQkJCQljb250UHJvdmlkZXIsCi0JCQkJCWtzLAotCQkJCQluZXcgY2hhcltdIHsnYicsICdjJywgJ2QnLCAnaScsICdmJywgJ2wnLCAncycsICdqJywgJ0InLCAnQycsICdEJywgJ0YnLCAnUycsICdMJywgJ0knfSk7Ci0JCQljb250ZW50UHJvcG9zYWxBZGFwdGVyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQljb250ZW50UHJvcG9zYWxBZGFwdGVyLnNldFByb3Bvc2FsQWNjZXB0YW5jZVN0eWxlKENvbnRlbnRQcm9wb3NhbEFkYXB0ZXIuUFJPUE9TQUxfUkVQTEFDRSk7Ci0JCQlyZXR1cm4gY29udFByb3ZpZGVyOwotCQl9Ci0JCQotCi0JCS8qKgotCQkgKiBQcm9jZXNzIGJyb3dzaW5nIHdoZW4gdGhlIEJyb3dzZS4uLiBidXR0b24gaGF2ZSBiZWVuIHByZXNzZWQuIEFsbG93IGFkZGluZyBvZiBlbnRpdHkgZmllbGQKLQkJICogd2l0aCBhcmJpdHJhcnkgdHlwZS4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVDaG9vc2VFbnRpdHlUeXBlQnV0dG9uUHJlc3NlZCgpIHsKLQkJCS8vZ2V0Q29udHJvbCgpLnNldEN1cnNvcihuZXcgQ3Vyc29yKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX1dBSVQpKTsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2tSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBtb2RlbC5nZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BBQ0tBR0VfRlJBR01FTlRfUk9PVCk7Ci0JCQlpZiAocGFja1Jvb3QgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gdGhpcyBlbGltaW5hdGVzIHRoZSBub24tZXhwb3J0ZWQgY2xhc3NwYXRoIGVudHJpZXMKLQkJCWZpbmFsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBUeXBlU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZUZvckFQcm9qZWN0KHBhY2tSb290LmdldEphdmFQcm9qZWN0KCksIHRydWUsIHRydWUpOyAKLQkJCQotCQkJLy8gVGhpcyBpbmNsdWRlcyBhbGwgZW50cmllcyBvbiB0aGUgY2xhc3NwYXRoLgotCQkJU2VsZWN0aW9uRGlhbG9nIGRpYWxvZz1udWxsOwotCQkJdHJ5ewotCQkJCWRpYWxvZyA9IEphdmFVSQotCQkJCQkJLmNyZWF0ZVR5cGVEaWFsb2coCi0JCQkJCQkJCWdldFNoZWxsKCksCi0JCQkJCQkJCW51bGwsCi0JCQkJCQkJCXNjb3BlLAotCQkJCQkJCQlJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQUxMX1RZUEVTLAotCQkJCQkJCQlmYWxzZSk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUpwdFVpUGx1Z2luLmluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJZGlhbG9nLnNldFRpdGxlKEVudGl0eVdpemFyZE1zZy5UWVBFX0RJQUxPR19USVRMRSk7Ci0JCQlkaWFsb2cuc2V0TWVzc2FnZShFbnRpdHlXaXphcmRNc2cuVFlQRV9ESUFMT0dfREVTQ1JJUFRJT04pOwotCi0JCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlJVHlwZSB0eXBlOwotCQkJCU9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCA9PSAwKSB7Ci0JCSAgICAgICAgCXR5cGUgPSBudWxsOwotCQkJCX0KLQkJICAgICAgICBlbHNlIHR5cGUgPSAoSVR5cGUpIHJlc3VsdFswXTsKLQkJCQlTdHJpbmcgc3VwZXJjbGFzc0Z1bGxQYXRoID0gSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRU1QVFlfU1RSSU5HOwotCQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQkJc3VwZXJjbGFzc0Z1bGxQYXRoID0gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCQl9Ci0JCQkJYXR0cmlidXRlVHlwZS5zZXRUZXh0KHN1cGVyY2xhc3NGdWxsUGF0aCk7Ci0JCQkJLy9nZXRDb250cm9sKCkuc2V0Q3Vyc29yKG51bGwpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vZ2V0Q29udHJvbCgpLnNldEN1cnNvcihudWxsKTsKLQkJfQotCQkKLQkJCi0JCS8qIENyZWF0ZSB0aGUgY29udGVudCBvZiB0aGUgZGlhbG9nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQkJCi0JCQlhdHRyaWJ1dGVUeXBlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJYXR0cmlidXRlVHlwZS5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCQl0ZXh0c1tpXS5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJCQotCQkJdXBkYXRlT0tCdXR0b24oKTsKLQkJCQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCi0JCS8qIFByb2Nlc3NlcyBPSyBidXR0b24gcHJlc3NlZCBldmVudC4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJCWVudGl0eVJvdyA9IGNhbGxiYWNrLnJldHJpZXZlUmVzdWx0U3RyaW5ncyhhdHRyaWJ1dGVUeXBlLCB0ZXh0cyk7Ci0JCQlzdXBlci5va1ByZXNzZWQoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSBlbnRpdHkgcmVwcmVzZW50YXRpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGhlIGRpYWxvZwotCQkgKi8KLQkJcHVibGljIEVudGl0eVJvdyBnZXRFbnRpdHlSb3coKSB7Ci0JCQlyZXR1cm4gZW50aXR5Um93OwotCQl9Ci0JCQotCQkvKiBQcm9jZXNzZXMgdGV4dCBtb2RpZnlpbmcgZXZlbnQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJdXBkYXRlT0tCdXR0b24oKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFNldHMgc3RhdGUgb2YgdGhlIE9LIGJ1dHRvbiBpbiBhY2NvcmRhbmNlIHdpdGggdmFsaWRhdGUgbWV0aG9kIG9mIHRoZSBjYWxsYmFjayBvYmplY3QKLQkJICogQHNlZSBEaWFsb2dDYWxsYmFjawotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZU9LQnV0dG9uKCkgewotCQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoY2FsbGJhY2sudmFsaWRhdGUoYXR0cmlidXRlVHlwZSwgdGV4dHMpKTsKLQkJfQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQkKLQkJfQotCQkvKiBVcGRhdGUgT0sgYnV0dG9uIHdoZW4gdGhlIGFwcHJvcHJpYXRlIGV2ZW50IG9jY3VycwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXVwZGF0ZU9LQnV0dG9uKCk7CQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBFZGl0RmllbGREaWFsb2cKLQkgKi8KLQlwcml2YXRlIGNsYXNzIEVkaXRGaWVsZERpYWxvZyBleHRlbmRzIEFkZEZpZWxkRGlhbG9nIHsKLQkJcHJvdGVjdGVkIEVudGl0eVJvdyBlbnRpdHlSb3c7Ci0JCS8qKgotCQkgKiBFZGl0RmllbGREaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkJICovCi0JCXB1YmxpYyBFZGl0RmllbGREaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyB3aW5kb3dUaXRsZSwgU3RyaW5nW10gbGFiZWxzRm9yQ29tYm8sIFN0cmluZ1tdIGxhYmVsc0ZvclRleHQsIEVudGl0eVJvdyBlbnRpdHkpIHsKLQkJCXN1cGVyKHNoZWxsLCB3aW5kb3dUaXRsZSwgbGFiZWxzRm9yQ29tYm8sIGxhYmVsc0ZvclRleHQpOwotCQkJdGhpcy5lbnRpdHlSb3cgPSBlbnRpdHk7CQkKLQkJfQotCi0JCS8qIENyZWF0ZSB0aGUgYXJlYSBvZiB0aGUgZGlhbG9nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LkVudGl0eVJvd1RhYmxlV2l6YXJkU2VjdGlvbi5BZGRGaWVsZERpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQkJYXR0cmlidXRlVHlwZS5zZXRUZXh0KGVudGl0eVJvdy5nZXRGcW5UeXBlTmFtZSgpKTsKLQkJCXRleHRzWzBdLnNldFRleHQoZW50aXR5Um93LmdldE5hbWUoKSk7Ci0JCQkKLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCX0KLQl9CQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlUZW1wbGF0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5VGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUzMDljNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIEVudGl0eVRlbXBsYXRlCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIG5sOwotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBFbnRpdHlUZW1wbGF0ZSBjcmVhdGUoU3RyaW5nIGxpbmVTZXBhcmF0b3IpCi0gIHsKLSAgICBubCA9IGxpbmVTZXBhcmF0b3I7Ci0gICAgRW50aXR5VGVtcGxhdGUgcmVzdWx0ID0gbmV3IEVudGl0eVRlbXBsYXRlKCk7Ci0gICAgbmwgPSBudWxsOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIE5MID0gbmwgPT0gbnVsbCA/IChTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKSA6IG5sOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMSA9ICJwYWNrYWdlICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMyA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNCA9IE5MICsgImltcG9ydCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNSA9ICI7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzYgPSBOTCArIE5MICsgIi8qKiIgKyBOTCArICIgKiBFbnRpdHkgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIEVudGl0eTogIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzcgPSBOTCArICIgKiIgKyBOTCArICIgKi8iICsgTkwgKyAicHVibGljIGNsYXNzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF84ID0gIiBleHRlbmRzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85ID0gIiBpbXBsZW1lbnRzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMCA9ICIsICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMSA9ICIgeyIgKyBOTCArICIiICsgTkwgKyAiXHQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTIgPSAiICIgKyBOTCArICJcdHByaXZhdGUgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEzID0gIiAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTQgPSAiOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNSA9IE5MICsgIlx0cHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7XHQiICsgTkwgKyAiXHRwdWJsaWMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE2ID0gIigpIHsiICsgTkwgKyAiXHRcdHN1cGVyKCk7IiArIE5MICsgIlx0fSAiICsgTkwgKyAiXHQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTcgPSAiICAgIiArIE5MICsgIlx0cHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xOCA9ICIgZ2V0IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE5ID0gIigpIHsiICsgTkwgKyAiIFx0XHRyZXR1cm4gdGhpcy4iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjAgPSAiOyIgKyBOTCArICJcdH0iICsgTkwgKyAiIiArIE5MICsgIlx0cHVibGljIHZvaWQgc2V0IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIxID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjIgPSAiICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMyA9ICIpIHsiICsgTkwgKyAiXHRcdHRoaXMuIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI0ID0gIiA9ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNSA9ICI7IiArIE5MICsgIlx0fSIgKyBOTCArICJcdCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNiA9IE5MICsgIiAgICIgKyBOTCArICJ9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI3ID0gTkw7Ci0KLSAgcHVibGljIFN0cmluZyBnZW5lcmF0ZShPYmplY3QgYXJndW1lbnQpCi0gIHsKLSAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsID0gKENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwpIGFyZ3VtZW50OyAKLWlmIChtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9bnVsbCAmJiBtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9IiIpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yKTsKLSAgICB9Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMpOwotICAgICBDb2xsZWN0aW9uPFN0cmluZz4gaW1wb3J0cyA9IG1vZGVsLmdldEltcG9ydHMoZmFsc2UpOwotZm9yIChTdHJpbmcgYW5JbXBvcnQgOiBpbXBvcnRzKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGFuSW1wb3J0KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNSk7Ci0gICAgIH0gCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0RW50aXR5TmFtZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChtb2RlbC5nZXRDbGFzc05hbWUoKSk7Ci0gICAgU3RyaW5nIHN1cGVyQ2xhc3MgPSBtb2RlbC5nZXRTdXBlcmNsYXNzTmFtZSgpOwotCWlmICghICIiLmVxdWFscyhzdXBlckNsYXNzKSkgewotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKHN1cGVyQ2xhc3MpOwotICAgIH0KLSAgICAKLQlMaXN0PFN0cmluZz4gaW50ZXJmYWNlcyA9IG1vZGVsLmdldEludGVyZmFjZXMoKTsgCi0JaWYgKGludGVyZmFjZXMuc2l6ZSgpPjApIHsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOSk7Ci0gICAgIH0KLQlmb3IgKGludCBpPTA7IGk8aW50ZXJmYWNlcy5zaXplKCk7IGkrKykgewotCQlTdHJpbmcgSU5URVJGQUNFID0gKFN0cmluZykgaW50ZXJmYWNlcy5nZXQoaSk7Ci0JCWlmIChpPjApIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEwKTsKLSAgICB9Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChJTlRFUkZBQ0UpOwotICAgIH0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTEpOwotICAgICBMaXN0PEVudGl0eVJvdz4gZmllbGRzID0gbW9kZWwuZ2V0RW50aXR5RmllbGRzKCk7IAotCWZvciAoRW50aXR5Um93IGVudGl0eSA6IGZpZWxkcykgeyAgICAgCi0JCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEyKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGVudGl0eS5nZXRUeXBlKCkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChlbnRpdHkuZ2V0TmFtZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTQpOwotICAgIH0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0Q2xhc3NOYW1lKCkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNik7Ci0gICAgCi0JZmllbGRzID0gbW9kZWwuZ2V0RW50aXR5RmllbGRzKCk7Ci0JaWYgKGZpZWxkcyAhPSBudWxsKSBmb3IgKGludCBpPTA7IGk8ZmllbGRzLnNpemUoKTsgaSsrKSB7Ci0JCUVudGl0eVJvdyBmaWVsZCA9IChFbnRpdHlSb3cpIGZpZWxkcy5nZXQoaSk7Ci0JCVN0cmluZyBUWVBFID0gZmllbGQuZ2V0VHlwZSgpOwotCQlTdHJpbmcgTkFNRSA9IGZpZWxkLmdldE5hbWUoKTsKLQkJU3RyaW5nIE1FVEhPRCA9IE5BTUUuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIE5BTUUuc3Vic3RyaW5nKDEpOwotCQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChUWVBFKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTgpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTUVUSE9EKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTkFNRSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIwKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE1FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIxKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRZUEUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChOQU1FKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjMpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTkFNRSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI0KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE5BTUUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNSk7Ci0gICAgfQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI3KTsKLSAgICByZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eVdpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMWIzNTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEaW1pdGVyIERpbWl0cm92LCBkLmRpbWl0cm92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuRW50aXR5RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVFZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5V2l6YXJkCi0JCWV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkCi0JCWltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBpbml0aWFsUHJvamVjdE5hbWU7Ci0JCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgdGhlIEVudGl0eSB3aXphcmQKLSAgICAgKiBAcGFyYW0gbW9kZWwgdGhlIGRhdGEgbW9kZWwKLSAgICAgKi8KLSAgICBwdWJsaWMgRW50aXR5V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotICAgICAgICBzZXRXaW5kb3dUaXRsZShFbnRpdHlXaXphcmRNc2cuRU5USVRZX1dJWkFSRF9USVRMRSk7Ci0gICAgICAgIHNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEpwdFVpUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihKcHRVaUljb25zLkVOVElUWV9XSVpfQkFOTkVSKSk7ICAgICAgICAKLQl9ICAgIAotIAotCS8qKgotCSAqIEVtcHR5IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEVudGl0eVdpemFyZCgpewotICAgIAl0aGlzKG51bGwpOwotICAgIH0KLQkKLQkvKiBBZGRzIHRoZSB0d28gcGFnZXMgb2YgdGhlIGVudGl0eSB3aXphcmQgCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZCNkb0FkZFBhZ2VzKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlFbnRpdHlDbGFzc1dpemFyZFBhZ2UgcGFnZTEgPSBuZXcgRW50aXR5Q2xhc3NXaXphcmRQYWdlKAotCQkgICAgICAgIGdldERhdGFNb2RlbCgpLAotCQkgICAgICAgICJwYWdlT25lIiwKLQkJICAgICAgICBFbnRpdHlXaXphcmRNc2cuRU5USVRZX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OLAotCQkgICAgICAgIEVudGl0eVdpemFyZE1zZy5FTlRJVFlfV0laQVJEX1BBR0VfVElUTEUpOwotCQlwYWdlMS5zZXRQcm9qZWN0TmFtZSh0aGlzLmluaXRpYWxQcm9qZWN0TmFtZSk7Ci0JCWFkZFBhZ2UocGFnZTEpOwotCQlFbnRpdHlGaWVsZHNXaXphcmRQYWdlIHBhZ2UyID0gbmV3IEVudGl0eUZpZWxkc1dpemFyZFBhZ2UoZ2V0RGF0YU1vZGVsKCksICJwYWdlVHdvIik7Ci0JCWFkZFBhZ2UocGFnZTIpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdGlvbjsKLQl9Ci0KLQkvKiBSZXR1cm4gdGhlIGRlZmF1bHQgZGF0YSBtb2RlbCBwcm92aWRlciAoRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIgaW4gb3VyIGNhc2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZCNnZXREZWZhdWx0UHJvdmlkZXIoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEVudGl0eURhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCi0JLyogQ2hlY2sgd2hldGhlciB0aGUgbWFuZGF0b3J5IGluZm9ybWF0aW9uIGlzIHNldCBhbmQgd2l6YXJkIGNvdWxkIGZpbmlzaAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCSByZXR1cm4gZ2V0RGF0YU1vZGVsKCkuaXNWYWxpZCgpOwotCX0KLQkKLQkvKiAKLQkgKiBPdmVycmlkZSB0aGUgcGFyZW50IG1ldGhvZCBpbiBvcmRlciB0byBvcGVuIHRoZSBnZW5lcmF0ZWQgZW50aXR5IGNsYXNzIGluIGphdmEgZWRpdG9yCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZCNwb3N0UGVyZm9ybUZpbmlzaCgpCi0JICovCi0JQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9zdFBlcmZvcm1GaW5pc2goKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7ICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoUVVBTElGSUVEX0NMQVNTX05BTUUpOwotICAgICAgICAgICAgSVByb2plY3QgcCA9IChJUHJvamVjdCkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoUFJPSkVDVCk7Ci0gICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKMkVFRWRpdG9yVXRpbGl0eS5nZXRKYXZhUHJvamVjdChwKTsKLSAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIGphdmFQcm9qZWN0LmZpbmRUeXBlKGNsYXNzTmFtZSkuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgIG9wZW5FZGl0b3IoZmlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBjYW50T3BlbikgewotICAgICAgICAJSnB0VWlQbHVnaW4ubG9nKGNhbnRPcGVuKTsKLSAgICAgICAgfSAKLSAgICB9Ci0JCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCB3aWxsIG9wZW4gdGhlIGZpbGUsIHNlbnQgYXMgcGFyYW1ldGVyCi0gICAgICogaW4gaXRzIG93biBqYXZhIGVkaXRvcgotICAgICAqIEBwYXJhbSBmaWxlIHdobyBzaG91bGQgYmUgb3BlbmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgZmlsZSkgewotICAgIAlpZiAoZ2V0RGF0YU1vZGVsKCkuZ2V0Qm9vbGVhblByb3BlcnR5KE9QRU5fSU5fRURJVE9SKSkgewotICAgIAkJaWYgKGZpbGUgIT0gbnVsbCkgewotICAgIAkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAJCQkJCXRyeSB7Ci0gICAgCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotICAgIAkJCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotICAgIAkJCQkJfQotICAgIAkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAJCQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0gICAgCQkJCQl9Ci0gICAgCQkJCX0KLSAgICAJCQl9KTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLSAgICAKLSAgICAvKiBJbXBsZW1lbnQgdGhlIGFic3RyYWN0IG1ldGhvZCBmcm9tIElXb3JrYmVuY2hXaXphcmQKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgIAl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICAJdGhpcy5pbml0aWFsUHJvamVjdE5hbWUgPSBleHRyYWN0UHJvamVjdE5hbWUoc2VsZWN0aW9uKTsKLQkJZ2V0RGF0YU1vZGVsKCk7Ci0JfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdFByb2plY3ROYW1lKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgIAlPYmplY3Qgc2VsZWN0ZWRPYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChzZWxlY3RlZE9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJcmV0dXJuICgoSVJlc291cmNlKSBzZWxlY3RlZE9iaikuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJfQotCQlpZiAoc2VsZWN0ZWRPYmogaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpIHsKLQkJCXJldHVybiAoKElKYXZhRWxlbWVudCkgc2VsZWN0ZWRPYmopLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJfQotCQlpZiAoc2VsZWN0ZWRPYmogaW5zdGFuY2VvZiBKcGFDb250ZXh0Tm9kZSkgewotCQkJcmV0dXJuICgoSnBhQ29udGV4dE5vZGUpIHNlbGVjdGVkT2JqKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJfQotCQkKLQkJaWYgKHNlbGVjdGVkT2JqIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBzZWxlY3RlZE9iaikuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzb3VyY2UuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCX0KLQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IChJSmF2YUVsZW1lbnQpICgoSUFkYXB0YWJsZSkgc2VsZWN0ZWRPYmopLmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKTsKLQkJCWlmIChqYXZhRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGphdmFFbGVtZW50LmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCX0KLQkJCUpwYUNvbnRleHROb2RlIG5vZGUgPSAoSnBhQ29udGV4dE5vZGUpICgoSUFkYXB0YWJsZSkgc2VsZWN0ZWRPYmopLmdldEFkYXB0ZXIoSnBhQ29udGV4dE5vZGUuY2xhc3MpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBub2RlLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eVdpemFyZE1zZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5V2l6YXJkTXNnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNWE0NWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5V2l6YXJkTXNnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEaW1pdGVyIERpbWl0cm92LCBkLmRpbWl0cm92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHk7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEVudGl0eVdpemFyZE1zZyBleHRlbmRzIE5MUyB7CQotCQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfdWlfZW50aXR5X3dpemFyZCI7Ly8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX1dJWkFSRF9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfV0laQVJEX1BBR0VfVElUTEU7ICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9XSVpBUkRfUEFHRV9ERVNDUklQVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX1BBQ0tBR0VfV0FSTklORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfUFJPUEVSVElFU19USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfUFJPUEVSVElFU19ERVNDUklQVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQUEVEX0FTX1NVUEVSQ0xBU1M7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5IRVJJVEFOQ0VfR1JPVVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5IRVJJVEFOQ0VfQ0hFQ0tfQk9YOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9TVE9SQUdFX0dST1VQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9TVVBQT1JUOyAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDSE9PU0VfWE1MOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUFBJTkdfWE1MX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9OQU1FX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfWE1MX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQUElOR19GSUxFX05PVF9MSVNURURfRVJST1I7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ0hPT1NFX01BUFBJTkdfWE1MX01FU1NBR0U7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9ESUFMT0dfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9ESUFMT0dfREVTQ1JJUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVEFCTEVfTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBUQUJMRV9OQU1FX0dST1VQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVTRV9ERUZBVUxUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9GSUVMRFNfRElBTE9HX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9GSUVMRFNfR1JPVVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5BTUVfQ09MVU1OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfQ09MVU1OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5BTUVfVEVYVF9GSUVMRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX1RFWFRfRklFTEQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQlJPV1NFX0JVVFRPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfQlVUVE9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVESVRfQlVUVE9OX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eURhdGFNb2RlbFByb3ZpZGVyX3R5cGVOb3RJblByb2plY3RDbGFzc3BhdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5RGF0YU1vZGVsUHJvdmlkZXJfaW52YWxpZFBLVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlEYXRhTW9kZWxQcm92aWRlcl9pbnZhbGlkQXJndW1lbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX0JVVFRPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEVVBMSUNBVEVEX0VOVElUWV9OQU1FU19NRVNTQUdFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFDQ0VTU19UWVBFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJRUxEX0JBU0VEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1BFUlRZX0JBU0VEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PX0pQQV9QUk9KRUNUUzsgICAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBUFBMWV9DSEFOR0VTX1RPX1BFUlNJU1RFTkNFX1hNTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfTUFQUEVEX1NVUEVSQ0xBU1NfVE9fWE1MOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9FTlRJVFlfVE9fWE1MOwotICAgIHByaXZhdGUgRW50aXR5V2l6YXJkTXNnKCkgewotICAgICAgICAvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24gb2YgY2xhc3MKLSAgICB9ICAgIAotICAgIAotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEVudGl0eVdpemFyZE1zZy5jbGFzcyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGRvZXMgbm90aGluZyAtIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgYW5kIGdldFN0cmluZyhTdHJpbmcpIHdpbGwgcmV0dXJuIAotICAgICAgICAJLy8gdGhlIGtleSBpdCB3YXMgY2FsbGVkIHdpdGgKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBleHRlcm5hbGl6ZWQgc3RyaW5nLCBtYXBwZWQgdG8gdGhpcyBrZXkKLSAgICAgKiBAcGFyYW0ga2V5IAotICAgICAqIEByZXR1cm4gdGhlIHRleHQgbWFwcGVkIHRvIHRoZSBrZXkgcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAJLy9leGNlcHRpb24gZHVyaW5nIHN0cmluZyBvYnRhaW5pbmcKLSAgICAgICAgICAgICAgICByZXR1cm4gIi0iICsga2V5ICsgIi0iOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9yZXR1cm4ga2V5LCBiZWNhdXNlIHRoZSByZWxldmFudCBzdHJpbmcgbWlzc2luZyBpbiB0aGUgYnVuZGxlCi0gICAgICAgIHJldHVybiAiKyIgKyBrZXkgKyAiKyI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmb3JtYXRlZCBzdHJpbmcsIG1hcHBlZCB0byB0aGlzIGtleQotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiBAcGFyYW0gYXJndW1lbnRzCi0gICAgICogQHJldHVybiB0aGUgZm9ybWF0ZWQgdGV4dCwgbWFwcGVkIHRvIHRoaXMga2V5LCB3aXRoIHN1YnN0aXR1dGVkIGFyZ3VtZW50cyAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3VtZW50cyk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0gICAgICAgIH0KLSAgICB9IAotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvSWRDbGFzc1RlbXBsYXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9JZENsYXNzVGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhMzNmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9JZENsYXNzVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBJZENsYXNzVGVtcGxhdGUKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbmw7Ci0gIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIElkQ2xhc3NUZW1wbGF0ZSBjcmVhdGUoU3RyaW5nIGxpbmVTZXBhcmF0b3IpCi0gIHsKLSAgICBubCA9IGxpbmVTZXBhcmF0b3I7Ci0gICAgSWRDbGFzc1RlbXBsYXRlIHJlc3VsdCA9IG5ldyBJZENsYXNzVGVtcGxhdGUoKTsKLSAgICBubCA9IG51bGw7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgTkwgPSBubCA9PSBudWxsID8gKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpIDogbmw7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xID0gInBhY2thZ2UgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIgPSAiOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zID0gTkw7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80ID0gTkwgKyAiaW1wb3J0ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81ID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNiA9IE5MICsgTkwgKyAiLyoqIiArIE5MICsgIiAqIElEIGNsYXNzIGZvciBlbnRpdHk6ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83ID0gTkwgKyAiICoiICsgTkwgKyAiICovICIgKyBOTCArICJwdWJsaWMgY2xhc3MgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzggPSAiICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85ID0gIiBpbXBsZW1lbnRzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMCA9ICIsICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMSA9ICIgeyAgICIgKyBOTCArICIgICAiICsgTkwgKyAiXHQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTIgPSAiICAgICAgICAgIiArIE5MICsgIlx0cHJpdmF0ZSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTMgPSAiICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNCA9ICI7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE1ID0gTkwgKyAiXHRwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsiICsgTkwgKyAiIiArIE5MICsgIlx0cHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNiA9ICIoKSB7fSIgKyBOTCArICIiICsgTkwgKyAiXHQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTcgPSBOTCArIE5MICsgIlx0cHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xOCA9ICIgZ2V0IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE5ID0gIigpIHsiICsgTkwgKyAiXHRcdHJldHVybiB0aGlzLiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMCA9ICI7IiArIE5MICsgIlx0fSIgKyBOTCArICIiICsgTkwgKyAiXHRwdWJsaWMgdm9pZCBzZXQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjEgPSAiKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMiA9ICIgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIzID0gIikgeyIgKyBOTCArICJcdFx0dGhpcy4iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjQgPSAiID0gIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI1ID0gIjsiICsgTkwgKyAiXHR9IiArIE5MICsgIlx0IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI2ID0gTkwgKyAiICAgIiArIE5MICsgIlx0LyoiICsgTkwgKyAiXHQgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKE9iamVjdCkiICsgTkwgKyAiXHQgKi9cdCIgKyBOTCArICJcdHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeyIgKyBOTCArICJcdFx0aWYgKG8gPT0gdGhpcykgeyIgKyBOTCArICJcdFx0XHRyZXR1cm4gdHJ1ZTsiICsgTkwgKyAiXHRcdH0iICsgTkwgKyAiXHRcdGlmICghKG8gaW5zdGFuY2VvZiAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjcgPSAiKSkgeyIgKyBOTCArICJcdFx0XHRyZXR1cm4gZmFsc2U7IiArIE5MICsgIlx0XHR9IiArIE5MICsgIlx0XHQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjggPSAiIG90aGVyID0gKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yOSA9ICIpIG87IiArIE5MICsgIlx0XHRyZXR1cm4gdHJ1ZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMCA9IE5MICsgIlx0XHRcdCYmICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMSA9ICIoKSA9PSBvdGhlci4iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzIgPSAiKCkiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzMgPSBOTCArICJcdFx0XHQmJiAoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM0ID0gIigpKSA9PSBEb3VibGUuZG91YmxlVG9Mb25nQml0cyhvdGhlci4iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzUgPSAiKCkpKSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNiA9IE5MICsgIlx0XHRcdCYmIChGbG9hdC5mbG9hdFRvSW50Qml0cygiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzcgPSAiKCkpID09IEZsb2F0LmZsb2F0VG9JbnRCaXRzKG90aGVyLiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zOCA9ICIoKSkpIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM5ID0gTkwgKyAiXHRcdFx0JiYgKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MCA9ICIoKSA9PSBudWxsID8gb3RoZXIuIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQxID0gIigpID09IG51bGwgOiAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDIgPSAiKCkuZXF1YWxzKG90aGVyLiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MyA9ICIoKSkpIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ0ID0gIjsiICsgTkwgKyAiXHR9IiArIE5MICsgIlx0IiArIE5MICsgIlx0LypcdCAiICsgTkwgKyAiXHQgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKSIgKyBOTCArICJcdCAqL1x0IiArIE5MICsgIlx0cHVibGljIGludCBoYXNoQ29kZSgpIHsiICsgTkwgKyAiXHRcdGZpbmFsIGludCBwcmltZSA9IDMxOyIgKyBOTCArICJcdFx0aW50IHJlc3VsdCA9IDE7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ1ID0gTkwgKyAiXHRcdHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80NiA9ICIoKSA/IDEgOiAwKTsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDcgPSBOTCArICJcdFx0cmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDggPSAiKCk7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ5ID0gTkwgKyAiXHRcdHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChpbnQpICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81MCA9ICIoKSk7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUxID0gTkwgKyAiXHRcdHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChpbnQpICgiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTIgPSAiKCkgXiAoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUzID0gIigpID4+PiAzMikpKTsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTQgPSBOTCArICJcdFx0cmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGludCkgKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NSA9ICIoKSApIF4gKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NiA9ICIoKSkgPj4+IDMyKSkpOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NyA9IE5MICsgIlx0XHRyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIEZsb2F0LmZsb2F0VG9JbnRCaXRzKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81OCA9ICIoKSk7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU5ID0gTkwgKyAiXHRcdHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MCA9ICIoKSA9PSBudWxsID8gMCA6ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MSA9ICIoKS5oYXNoQ29kZSgpKTsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNjIgPSBOTCArICJcdFx0cmV0dXJuIHJlc3VsdDsiICsgTkwgKyAiXHR9IiArIE5MICsgIiAgICIgKyBOTCArICIgICAiICsgTkwgKyAifSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MyA9IE5MOwotCi0gIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGUoT2JqZWN0IGFyZ3VtZW50KQotICB7Ci0gICAgZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBtb2RlbCA9IChDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsKSBhcmd1bWVudDsgCi1pZiAobW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPW51bGwgJiYgbW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPSIiKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMik7Ci0gICAgfQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zKTsKLSAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGltcG9ydHMgPSBtb2RlbC5nZXRJbXBvcnRzKHRydWUpOwotZm9yIChTdHJpbmcgYW5JbXBvcnQgOiBpbXBvcnRzKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGFuSW1wb3J0KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNSk7Ci0gICAgIH0gCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0Q2xhc3NOYW1lKCkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF83KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldElkQ2xhc3NOYW1lKCkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84KTsKLSAgICAgTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBtb2RlbC5nZXRJbnRlcmZhY2VzKCk7IAotCWlmIChpbnRlcmZhY2VzLnNpemUoKT4wKSB7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzkpOwotICAgICB9Ci0JZm9yIChpbnQgaT0wOyBpPGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLQkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOwotCQlpZiAoaT4wKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMCk7Ci0gICAgfQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoSU5URVJGQUNFKTsKLSAgICB9Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzExKTsKLSAgICAgTGlzdDxFbnRpdHlSb3c+IGZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOwotCUxpc3Q8U3RyaW5nPiBwa0ZpZWxkcyA9IG1vZGVsLmdldFBLRmllbGRzKCk7IAotCWZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJRW50aXR5Um93IGVudGl0eSA9IChFbnRpdHlSb3cpIGZpZWxkcy5nZXQoaSk7Ci0JCWlmICghcGtGaWVsZHMuY29udGFpbnMoZW50aXR5LmdldE5hbWUoKSkpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEyKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGVudGl0eS5nZXRUeXBlKCkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChlbnRpdHkuZ2V0TmFtZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTQpOwotICAgIH0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0SWRDbGFzc05hbWUoKSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE2KTsKLSAgICAKLQlmaWVsZHMgPSBtb2RlbC5nZXRFbnRpdHlGaWVsZHMoKTsKLQlpZiAoZmllbGRzICE9IG51bGwpIGZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJRW50aXR5Um93IGZpZWxkID0gKEVudGl0eVJvdykgZmllbGRzLmdldChpKTsKLQkJU3RyaW5nIFRZUEUgPSBmaWVsZC5nZXRUeXBlKCk7Ci0JCVN0cmluZyBOQU1FID0gZmllbGQuZ2V0TmFtZSgpOwotCQlpZiAoIXBrRmllbGRzLmNvbnRhaW5zKE5BTUUpKSB7Ci0JCQljb250aW51ZTsKLQkJfSAJCQotCQlTdHJpbmcgTUVUSE9EID0gTkFNRS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgTkFNRS5zdWJzdHJpbmcoMSk7ICAgICAgICAKLQkKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVFlQRSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE4KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE1FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE5KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE5BTUUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChNRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChUWVBFKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjIpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTkFNRSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIzKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE5BTUUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChOQU1FKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjUpOwotICAgIH0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjYpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0SWRDbGFzc05hbWUoKSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI3KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldElkQ2xhc3NOYW1lKCkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yOCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChtb2RlbC5nZXRJZENsYXNzTmFtZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjkpOwotICAgICBpZiAoZmllbGRzICE9IG51bGwpIGZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQlFbnRpdHlSb3cgZmllbGQgPSAoRW50aXR5Um93KSBmaWVsZHMuZ2V0KGkpOyAKLQlTdHJpbmcgTkFNRSA9IGZpZWxkLmdldE5hbWUoKTsKLQlpZiAoIXBrRmllbGRzLmNvbnRhaW5zKE5BTUUpKSB7Ci0gICAgICAgCWNvbnRpbnVlOwotICAgIH0KLSAgICAgCVN0cmluZyBUWVBFID0gZmllbGQuZ2V0VHlwZSgpOyAKLQlTdHJpbmcgR0VUX01FVEhPRCA9ICJnZXQiICsgTkFNRS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgTkFNRS5zdWJzdHJpbmcoMSk7IAotICAgIAlpZiAoVFlQRS5lcXVhbHMoImJvb2xlYW4iKSB8fCBUWVBFLmVxdWFscygiYnl0ZSIpIHx8IFRZUEUuZXF1YWxzKCJjaGFyIikgfHwgVFlQRS5lcXVhbHMoInNob3J0IikgfHwgVFlQRS5lcXVhbHMoImludCIpIHx8IFRZUEUuZXF1YWxzKCJsb25nIikpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMwKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzIpOwotICAgICAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygiZG91YmxlIikpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMzKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzUpOwotICAgICAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygiZmxvYXQiKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzYpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM3KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zOCk7Ci0gICAgIAl9IGVsc2UgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQwKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80MSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDIpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQzKTsKLSAgICAgCX0gCi0gICAgIH0gCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ0KTsKLSAgICAgaWYgKGZpZWxkcyAhPSBudWxsKSBmb3IgKGludCBpPTA7IGk8ZmllbGRzLnNpemUoKTsgaSsrKSB7IAotCUVudGl0eVJvdyBmaWVsZCA9IChFbnRpdHlSb3cpIGZpZWxkcy5nZXQoaSk7Ci0JU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JaWYgKCFwa0ZpZWxkcy5jb250YWlucyhOQU1FKSkgewotICAgICAgIAljb250aW51ZTsKLSAgICB9Ci0gICAgIAlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsgCi0JU3RyaW5nIEdFVF9NRVRIT0QgPSAiZ2V0IiArIE5BTUUuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIE5BTUUuc3Vic3RyaW5nKDEpOyAKLSAgICAJaWYgKFRZUEUuZXF1YWxzKCJib29sZWFuIikpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ1KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80Nik7Ci0gICAgIAl9IGVsc2UgaWYgKFRZUEUuZXF1YWxzKCJpbnQiKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ4KTsKLSAgICAgCX0gZWxzZSBpZiAoVFlQRS5lcXVhbHMoImJ5dGUiKSB8fCBUWVBFLmVxdWFscygiY2hhciIpIHx8IFRZUEUuZXF1YWxzKCJzaG9ydCIpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80OSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTApOwotICAgICAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygibG9uZyIpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81MSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTIpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUzKTsKLSAgICAgCX0gZWxzZSBpZiAoVFlQRS5lcXVhbHMoImRvdWJsZSIpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81NCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU2KTsKLSAgICAgCX0gZWxzZSBpZiAoVFlQRS5lcXVhbHMoImZsb2F0IikpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU3KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81OCk7Ci0gICAgIAl9IGVsc2UgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYwKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82MSk7Ci0gICAgIAl9IAotICAgICB9IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82Mik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYzKTsKLSAgICByZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9DcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzN2ZlOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9DcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEaW1pdGVyIERpbWl0cm92LCBkLmRpbWl0cm92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgewotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UID0gIi4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJSQUNLRVQgPSAiWyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtfU1VGRklYID0gIlBLIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfU0VSSUFMSVpBQkxFID0gImphdmEuaW8uU2VyaWFsaXphYmxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9QQUNLQUdFID0gImphdmF4LnBlcnNpc3RlbmNlLioiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9BTk5PVEFUSU9OID0gIkBFbnRpdHkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9BU19TVVBFUkNMQVNTX1RZUEUgPSAiQE1hcHBlZFN1cGVyY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOSEVSSVRBTkNFX1RZUEUgPSAiQEluaGVyaXRhbmNlIjsgLy8kTk9OLU5MUy0xJAkKLQkJCi0JLyoqCi0JICogQ29uc3RydWN0cyBlbnRpdHkgbW9kZWwgYXMgZXhwYW5zaW9uIG9mIHRoZSBkYXRhIG1vZGVsCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXRoaXMuZGF0YU1vZGVsID0gZGF0YU1vZGVsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZWNlc3NhcnkgaW1wb3J0cyBvbiBkZXBlbmRzIG9mIGVudGl0eSAocHJpbWFyeSBrZXlzKSBmaWVsZHMuIEl0IGlzIHVzZWQgZnJvbSAKLQkgKiBKRVQgZW1taXRlciB3aGVuIGl0IGdlbmVyYXRlcyBlbnRpdHkgKElkQ2xhc3MpCi0JICogQHBhcmFtIGlzSWRDbGFzcyBmbGFnLCB3aGljaCBpbmRpY2F0ZXMgdGhlIGNhc2UuIFdoZW4gaXQgaXMgZmFsc2UsIHRoZSByZXN1bHQgaXMgCi0JICogdGhlIGltcG9ydCBsaXN0IGZvciB0aGUgZW50aXR5IGNsYXNzLCBpbiBvdGhlciBjYXNlIHRoZSByZXN1bHRzIGlzIHRoZSBzZXQgZm9yIHRoZSBJZENsYXNzIAotCSAqIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSBpbXBvcnRzIGNvbGxlY3Rpb24gd2l0aCB0aGUgaW1wb3J0cyBmb3IgdGhlIGdlbmVyYXRlZCBqYXZhIGNsYXNzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbXBvcnRzKGJvb2xlYW4gaXNJZENsYXNzKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQkKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZSgpOwotCQlTdHJpbmcgc3VwZXJjbGFzc05hbWUgPSBnZXRRdWFsaWZpZWRTdXBlcmNsYXNzTmFtZSgpOwotCi0JCWlmIChzdXBlcmNsYXNzTmFtZSAhPSBudWxsICYmIHN1cGVyY2xhc3NOYW1lLmxlbmd0aCgpID4gMCAmJiAKLQkJCQkhZXF1YWxTaW1wbGVOYW1lcyhjbGFzc05hbWUsIHN1cGVyY2xhc3NOYW1lKSkgewotCQkJY29sbGVjdGlvbi5hZGQoc3VwZXJjbGFzc05hbWUpOwotCQl9Ci0JCQotCQlMaXN0IGludGVyZmFjZXMgPSBnZXRRdWFsaWZpZWRJbnRlcmZhY2VzKCk7Ci0JCWlmIChpbnRlcmZhY2VzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gaW50ZXJmYWNlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBpZmFjZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoIWVxdWFsU2ltcGxlTmFtZXMoZ2V0Q2xhc3NOYW1lKCksIGlmYWNlKSkgewotCQkJCQljb2xsZWN0aW9uLmFkZChpZmFjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChpc0lkQ2xhc3MpIHsKLQkJCWNvbGxlY3Rpb24uYWRkQWxsKGdldElkQ2xhc3NJbXBvcnRMaXN0KCkpOwotCQl9IGVsc2UgewkJCQotCQkJY29sbGVjdGlvbi5hZGQoUEVSU0lTVEVOQ0VfUEFDS0FHRSk7Ci0JCQljb2xsZWN0aW9uLmFkZEFsbChnZXRGaWVsZEltcG9ydExpc3QoKSk7Ci0JCQkKLQkJfQotCQlyZXR1cm4gY29sbGVjdGlvbjsKLQl9CQotCi0JLyoqCi0JICogQHJldHVybiBjbGFzcyBuYW1lIG9mIHRoZSBlbnRpdHkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUUpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHBhY2thZ2UgbmFtZSB3aGVuIHRoZSBlbnRpdHkgd2lsbCBiZSBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFQYWNrYWdlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfUEFDS0FHRSkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gZnVsbHkgcXVhbGlmaWVkIGphdmEgY2xhc3MgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpIHsKLQkJaWYgKCFnZXRKYXZhUGFja2FnZU5hbWUoKS5lcXVhbHMoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRU1QVFlfU1RSSU5HKSkgewotCQkJcmV0dXJuIGdldEphdmFQYWNrYWdlTmFtZSgpICsgRE9UICsgZ2V0Q2xhc3NOYW1lKCk7Ci0JCX0gCi0JCXJldHVybiBnZXRDbGFzc05hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3VwZXJjbGFzc05hbWUoKSB7Ci0JCVN0cmluZyBxdWFsaWZpZWQgPSBnZXRRdWFsaWZpZWRTdXBlcmNsYXNzTmFtZSgpOwotCQlpZiAoZXF1YWxTaW1wbGVOYW1lcyhnZXRDbGFzc05hbWUoKSwgcXVhbGlmaWVkKSkgewotCQkJcmV0dXJuIHF1YWxpZmllZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShxdWFsaWZpZWQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGl0eSdzIHN1cGVyIGNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRTdXBlcmNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNVUEVSQ0xBU1MpLnRyaW0oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBsaXN0IHdpdGggdGhlIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgZnJvbSBlbnRpdHkgY2xhc3MgCi0JICovCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJbnRlcmZhY2VzKCkgewotCQlMaXN0IHF1YWxpZmllZEludGVyZmFjZXMgPSBnZXRRdWFsaWZpZWRJbnRlcmZhY2VzKCk7Ci0JCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHF1YWxpZmllZEludGVyZmFjZXMuc2l6ZSgpKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXIgPSBxdWFsaWZpZWRJbnRlcmZhY2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHF1YWxpZmllZCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVxdWFsU2ltcGxlTmFtZXMoZ2V0Q2xhc3NOYW1lKCksIHF1YWxpZmllZCkpIHsKLQkJCQlpbnRlcmZhY2VzLmFkZChxdWFsaWZpZWQpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnRlcmZhY2VzLmFkZChTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShxdWFsaWZpZWQpKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGludGVyZmFjZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBsaXN0IHdpdGggdGhlIGludGVyZmFjZXMgKGZ1bGx5IHF1YWxpZmllZCBuYW1lZCkgaW1wbGVtZW50ZWQgZnJvbSBlbnRpdHkgY2xhc3MKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRRdWFsaWZpZWRJbnRlcmZhY2VzKCkgewotCQlMaXN0IGludGVyZmFjZXMgPSAoTGlzdCkgdGhpcy5kYXRhTW9kZWwuZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUyk7CQkKLQkJaWYgKGludGVyZmFjZXMgPT0gbnVsbCl7Ci0JCQlpbnRlcmZhY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9IAotCQlpbnRlcmZhY2VzLmFkZChRVUFMSUZJRURfU0VSSUFMSVpBQkxFKTsKLQkJcmV0dXJuIGludGVyZmFjZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcgcHJvcGVydHkKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHJldHVybiBzdHJpbmcgdmFsdWUgb2YgdGVoIHNwZWNpZmllZCBwcm9wZXJ0Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2RzIGlzIHVzZWQgZm9yIHRoZSBjb21wYXJpc29uIG9mIGZ1bGx5IHF1YWxpZmllZCB0eXBlcyAKLQkgKiBAcGFyYW0gbmFtZTEgZmlyc3QgdHlwZSBuYW1lCi0JICogQHBhcmFtIG5hbWUyIHNlY29uZCB0eXBlIG5hbWUKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHNpbXBsZSBuYW1lcyBvZiB0aGUgdHlwZXMgYXJlIGVxdWFsCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxTaW1wbGVOYW1lcyhTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQlTdHJpbmcgc2ltcGxlTmFtZTEgPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShuYW1lMSk7Ci0JCVN0cmluZyBzaW1wbGVOYW1lMiA9IFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKG5hbWUyKTsKLQkJcmV0dXJuIHNpbXBsZU5hbWUxLmVxdWFscyhzaW1wbGVOYW1lMik7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGFydGlmYWN0IC0gRW50aXR5IG9yIE1hcHBlZCBzdXBlcmNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdFR5cGUoKSB7Ci0JCWlmKGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuTUFQUEVEX0FTX1NVUEVSQ0xBU1MpKSB7Ci0JCQlyZXR1cm4gTUFQUEVEX0FTX1NVUEVSQ0xBU1NfVFlQRTsKLQkJfSAKLQkJcmV0dXJuIEVOVElUWV9BTk5PVEFUSU9OOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciBlbnRpdHkgc2V0IGluaGVyaXRhbmNlIHN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbmhlcml0YW5jZVNldCgpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuSU5IRVJJVEFOQ0UpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBpbmhlcml0YW5jZSBzdHJhdGVneSwgYXMgaXQgaXMgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWNhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5oZXJpdGFuY2VTdHJhdGVneU5hbWUoKSB7CQkKLQkJcmV0dXJuIGdldFByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSEVSSVRBTkNFX1NUUkFURUdZKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgY29uc3RydWN0ZWQgQEluaGVyaXRhbmNlIGFubm90YXRpb24gd2l0aCB0aGUgcmVsZXZhbnQgc3RyYXRlZ3kKLQkgKiBpZiBpdCBpcyBjaG9zZW4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTVBUWV9TVFJJTkc7Ci0JCWlmIChpc0luaGVyaXRhbmNlU2V0KCkpIHsJCi0JCQlyZXN1bHQgPSBJTkhFUklUQU5DRV9UWVBFOwotCQkJaWYgKCFnZXRQcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5JTkhFUklUQU5DRV9TVFJBVEVHWSkuZXF1YWxzKElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVNUFRZX1NUUklORykpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCArPSAiKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS4iICsgZ2V0UHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuSU5IRVJJVEFOQ0VfU1RSQVRFR1kpICsgIikiOyAvLyROT04tTkxTLTEkICROT04tTkxTLTIkCi0JCQkKLQkJCX0JCQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQkKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGdlbmVyYXRlZCBhcnRpZmFjdCBpcyBub3QgZW50aXR5IAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm9uRW50aXR5U3VwZXJjbGFzcygpIHsKLQkJcmV0dXJuICFkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVOVElUWSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIHRoZSBjcmVhdGVkIGFydGlmYWN0IHdpbGwgYmUgYW5ub3RhdGVkCi0JICogQHJldHVybiBmYWxzZSB0aGUgZW50aXR5IG1hcHBpbmdzIHdpbGwgYmUgcmVnaXN0ZXJlZCBpbiBYTUwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FydGlmYWN0c0Fubm90YXRlZCgpIHsKLQkJcmV0dXJuICFkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlhNTF9TVVBQT1JUKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNNYXBwaW5nWE1MRGVmYXVsdCgpIHsKLQkJaWYgKGdldE1hcHBpbmdYTUxOYW1lKCkuZXF1YWxzKElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVNUFRZX1NUUklORykpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBnZXRNYXBwaW5nWE1MTmFtZSgpLmVxdWFscyhKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ1hNTE5hbWUoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuWE1MX05BTUUpLnRyaW0oKTsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGdldE1hcHBpbmdYbWxGaWxlKCkgewotCQlJRmlsZSBvcm1GaWxlID0gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBzb3VyY2VGcmFnbWVudHMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRTb3VyY2VDb250YWluZXJzKHByb2plY3QpOwotCQlmb3IgKElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgOiBzb3VyY2VGcmFnbWVudHMpIHsKLQkJCW9ybUZpbGUgPSBwcm9qZWN0LmdldEZpbGUocGFja2FnZUZyYWdtZW50Um9vdC5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKSArIEZpbGUuc2VwYXJhdG9yICsgZ2V0TWFwcGluZ1hNTE5hbWUoKSk7Ci0JCQlpZiAob3JtRmlsZS5leGlzdHMoKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIG9ybUZpbGU7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGVudGl0eSBuYW1lIChjb3VsZCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgY2xhc3MgbmFtZSkKLQkgKiBTZWUgPGNvZGU+aXNFbnRpdHlOYW1lU2V0KCk8Y29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVudGl0eU5hbWUoKSB7Ci0JCXJldHVybiBnZXRQcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFlfTkFNRSkudHJpbSgpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSBuYW1lIGlzIGRpZmZlcmVudCB0aGFuIGNsYXNzIG5hbWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VudGl0eU5hbWVTZXQoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmICghZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKGdldEVudGl0eU5hbWUoKSkpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSB0YWJsZSBuYW1lIGlzIHNwZWNpZmllZCBleHBsaWNpdGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUYWJsZU5hbWVTZXQoKSB7Ci0JCXJldHVybiAhZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5UQUJMRV9OQU1FX0RFRkFVTFQpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0YWJsZSBuYW1lIChpZiBpdCBpcyBzcGVjaWZpZWQpCi0JICogU2VlIDxjb2RlPmlzVGFibGVOYW1lU2V0KCk8Y29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBQkxFX05BTUUpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGxpc3Qgd2l0aCB0aGUgZW50aXR5IGZpZWxkcwotCSAqLwotCXB1YmxpYyBMaXN0PEVudGl0eVJvdz4gZ2V0RW50aXR5RmllbGRzKCkgewotCQlBcnJheUxpc3Q8RW50aXR5Um93PiBmaWVsZHMgPSAoQXJyYXlMaXN0PEVudGl0eVJvdz4pIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFlfRklFTERTKTsKLQkJaWYgKGZpZWxkcyA9PSBudWxsKXsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0PEVudGl0eVJvdz4oKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmllbGRzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbGlzdCB3aXRoIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhlIGVudGl0eSAoYmFzZWQgb24gaXRzIGZpZWxkcykKLQkgKi8KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEZpZWxkSW1wb3J0TGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGltcG9ydHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJTGlzdDxFbnRpdHlSb3c+IGVudGl0aWVzID0gZ2V0RW50aXR5RmllbGRzKCk7Ci0JCWZvciAoRW50aXR5Um93IGVudGl0eVJvdyA6IGVudGl0aWVzKSB7Ci0JCQlpZiAoIWltcG9ydHMuY29udGFpbnMoZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCkpICYmICFlbnRpdHlSb3cuZ2V0VHlwZSgpLmVxdWFscyhlbnRpdHlSb3cuZ2V0RnFuVHlwZU5hbWUoKSkpIHsKLQkJCQlTdHJpbmcgZnFuVHlwZU5hbWUgPSBlbnRpdHlSb3cuZ2V0RnFuVHlwZU5hbWUoKTsKLQkJCQkvL3JlbW92ZSB0aGUgYXJyYXkgYnJhY2tldHMgW10gZm9yIHRoZSBqYXZhLmxhbmcuQnl0ZVtdICYgamF2YS5sYW5nLkNoYXJhY3RlcltdCi0JCQkJaWYgKGZxblR5cGVOYW1lLmluZGV4T2YoQlJBQ0tFVCkgIT0gLTEpIHsKLQkJCQkJZnFuVHlwZU5hbWUgPSBmcW5UeXBlTmFtZS5zdWJzdHJpbmcoMCwgZnFuVHlwZU5hbWUuaW5kZXhPZigiWyIpKTsKLQkJCQl9Ci0JCQkJaW1wb3J0cy5hZGQoZnFuVHlwZU5hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbXBvcnRzOwkJCi0JfQotCS8qKgotCSAqIEByZXR1cm4gbGlzdCB3aXRoIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhlIGlkIGNsYXNzIChiYXNlZCBvbiBpdHMgZmllbGRzIC0gcHJpbWFyeSBrZXlzIG9mIHRoZSBlbnRpdHkpCi0JICovCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJZENsYXNzSW1wb3J0TGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGltcG9ydHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJTGlzdDxFbnRpdHlSb3c+IGVudGl0aWVzID0gZ2V0RW50aXR5RmllbGRzKCk7Ci0JCUxpc3Q8U3RyaW5nPiBwa0ZpZWxkcyA9IGdldFBLRmllbGRzKCk7Ci0JCWZvciAoRW50aXR5Um93IGVudGl0eVJvdyA6IGVudGl0aWVzKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGVudGl0eVJvdy5nZXROYW1lKCk7Ci0JCQlpZiAocGtGaWVsZHMuY29udGFpbnMobmFtZSkpIHsJCQkKLQkJCQlpZiAoIWltcG9ydHMuY29udGFpbnMoZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCkpICYmICFlbnRpdHlSb3cuZ2V0VHlwZSgpLmVxdWFscyhlbnRpdHlSb3cuZ2V0RnFuVHlwZU5hbWUoKSkpIHsKLQkJCQkJaW1wb3J0cy5hZGQoZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1wb3J0czsJCQotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGFjY2VzcyB0eXBlIGlzIGZpZWxkIGJhc2VkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaWVsZEFjY2VzcygpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRklFTERfQUNDRVNTX1RZUEUpOwotCX0JCi0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgcHJpbWFyeSBrZXkgaXMgY29tcG9zaXRlIChtb3JlIHRoYW4gb25lIGFubm90YXRlZCBhcyBwcmltYXJ5IGtleSBmaWVsZCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBvc2l0ZVBLKCkgewotCQlyZXR1cm4gZ2V0UEtGaWVsZHMoKS5zaXplKCkgPiAxOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbGlzdCB3aXRoIHByaW1hcnkga2V5IG5hbWUocykKLQkgKi8KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFBLRmllbGRzKCkgewotCQlyZXR1cm4gKEFycmF5TGlzdDxTdHJpbmc+KWRhdGFNb2RlbC5nZXRQcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5QS19GSUVMRFMpOwotCX0JCi0JCi0JLyoqCi0JICogQHJldHVybiBjb25zdHJ1Y3RlZCBuYW1lIG9mIHRoZSBpZCBjbGFzcyAoZW50aXR5IG5hbWUgKyBQSyBhcyBzdWZmaXgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGdldENsYXNzTmFtZSgpICsgUEtfU1VGRklYOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIElQcm9qZWN0IHByZXNlbnRhdGlvbiBvZiBKUEEgcHJvamVjdAotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKTsKLQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JfQkKLQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9FbnRpdHlEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9FbnRpdHlEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDczY2Y4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERpbWl0ZXIgRGltaXRyb3YsIGQuZGltaXRyb3ZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5FbnRpdHlXaXphcmRNc2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEub3BlcmF0aW9uLk5ld0VudGl0eUNsYXNzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFQ29tbW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXN7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IE5ld0VudGl0eUNsYXNzT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogRXh0ZW5kczogPGNvZGU+SURhdGFNb2RlbFByb3ZpZGVyI2dldFByb3BlcnR5TmFtZXMoKTwvY29kZT4KLQkgKiBhbmQgYWRkIG93biBkYXRhIG1vZGVsJ3MgcHJvcGVydGllcyBzcGVjaWZpYyBmb3IgdGhlIGVudGl0eSBtb2RlbAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0UHJvcGVydHlOYW1lcygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewkJCi0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChJTkhFUklUQU5DRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEVOVElUWSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE1BUFBFRF9BU19TVVBFUkNMQVNTKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoSU5IRVJJVEFOQ0VfU1RSQVRFR1kpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChYTUxfU1VQUE9SVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFhNTF9OQU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRU5USVRZX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChUQUJMRV9OQU1FX0RFRkFVTFQpOwkJCi0JCXByb3BlcnR5TmFtZXMuYWRkKFRBQkxFX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChFTlRJVFlfRklFTERTKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUEtfRklFTERTKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRklFTERfQUNDRVNTX1RZUEUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9QRVJUWV9BQ0NFU1NfVFlQRSk7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgKHdoaWNoIHNob3VsZCBwcmVzZW50IGEgdmFsaWQgZGF0YSBtb2RlbCBwcm9wZXJ0eSkuICAKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4gSXQgbWF5IHJldHVybiBudWxsLiAKLQkgKiAKLQkgKiBAc2VlIE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyI2dldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcpCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHJldHVybiBPYmplY3QgZGVmYXVsdCB2YWx1ZSBvZiBwcm9wZXJ0eQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJLy8gb3ZlcnJpZGRlbgotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTT1VSQ0VfRk9MREVSKSkgewotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBnZXREZWZhdWx0SmF2YVNvdXJjZUNvbnRhaW5lcigpOwotCQkJcmV0dXJuIChjb250YWluZXIgPT0gbnVsbCkgPyBudWxsIDogY29udGFpbmVyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJfQotCQkKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJTkhFUklUQU5DRSkpIHsKLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRU5USVRZKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE1BUFBFRF9BU19TVVBFUkNMQVNTKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhYTUxfU1VQUE9SVCkpIHsKLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoWE1MX05BTUUpKSB7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwkJCQotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRU5USVRZX05BTUUpKSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nUHJvcGVydHkoQ0xBU1NfTkFNRSk7CQkJCi0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhUQUJMRV9OQU1FX0RFRkFVTFQpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVEFCTEVfTkFNRSkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmdQcm9wZXJ0eShDTEFTU19OQU1FKTsJCQkKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElOSEVSSVRBTkNFX1NUUkFURUdZKSkgewotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsgCi0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTVVBFUkNMQVNTKSkgewotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVOVElUWV9GSUVMRFMpKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxFbnRpdHlSb3c+KCk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQS19GSUVMRFMpKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhGSUVMRF9BQ0NFU1NfVFlQRSkpIHsKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9BQ0NFU1NfVFlQRSkpIHsKLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwkJCQotCQl9IAotCQkvLyBPdGhlcndpc2UgY2hlY2sgc3VwZXIgZm9yIGRlZmF1bHQgdmFsdWUgZm9yIHByb3BlcnR5Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElGb2xkZXIgZ2V0RGVmYXVsdEphdmFTb3VyY2VGb2xkZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbnRhaW5lciBnZXREZWZhdWx0SmF2YVNvdXJjZUNvbnRhaW5lcigpIHsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gZ2V0VGFyZ2V0SnBhUHJvamVjdCgpOwotCQlpZiAoanBhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBqcGFQcm9qZWN0LmdldEphdmFQcm9qZWN0KCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKElQYWNrYWdlRnJhZ21lbnRSb290IHBmciA6IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkpIHsKLQkJCQlpZiAocGZyLmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgewotCQkJCQlyZXR1cm4gKElDb250YWluZXIpIHBmci5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCS8vIGZhbGwgdGhyb3VnaAotCQkJSnB0VWlQbHVnaW4ubG9nKGptZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQlpZiAob2spIHsKLQkJCWlmIChDT01QT05FTlRfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBQUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFNPVVJDRV9GT0xERVIsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJfQotCQkJaWYgKFBST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBYTUxfU1VQUE9SVC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoWE1MX05BTUUsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9rOwotCX0KLQotCS8qIEFkZHMgYWRkaXRpb25hbCBjaGVjayB0byB0aGUgbW9kZWwgdmFsaWRhdGlvbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSkFWQV9QQUNLQUdFKSkgewotCQkJcmV0dXJuIHZhbGlkYXRlSmF2YVBhY2thZ2UoZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydHlOYW1lKSk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU1VQRVJDTEFTUykgJiYgRU1QVFlfU1RSSU5HLmVxdWFscyhnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSkgewotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoWE1MX05BTUUpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVYbWxOYW1lKGdldFN0cmluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSkpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVOVElUWV9GSUVMRFMpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVGaWVsZHNMaXN0KChBcnJheUxpc3Q8RW50aXR5Um93PikgZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsJCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUphdmFTb3VyY2VGb2xkZXIoU3RyaW5nIGNvbnRhaW5lckZ1bGxQYXRoKSB7Ci0JCS8vIEVuc3VyZSB0aGF0IHRoZSBzb3VyY2UgZm9sZGVyIHBhdGggaXMgbm90IGVtcHR5Ci0JCWlmIChjb250YWluZXJGdWxsUGF0aCA9PSBudWxsIHx8IGNvbnRhaW5lckZ1bGxQYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCVN0cmluZyBtc2cgPSBKMkVFQ29tbW9uTWVzc2FnZXMuRVJSX0pBVkFfQ0xBU1NfRk9MREVSX05BTUVfRU1QVFk7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCX0KLQkJLy8gRW5zdXJlIHRoYXQgdGhlIHNvdXJjZSBmb2xkZXIgcGF0aCBpcyBhYnNvbHV0ZQotCQllbHNlIGlmICghbmV3IFBhdGgoY29udGFpbmVyRnVsbFBhdGgpLmlzQWJzb2x1dGUoKSkgewotCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5FUlJfSkFWQV9DTEFTU19GT0xERVJfTk9UX0FCU09MVVRFOwotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQl9Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRUYXJnZXRQcm9qZWN0KCk7Ci0JCS8vIEVuc3VyZSBwcm9qZWN0IGlzIG5vdCBjbG9zZWQKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5FUlJfSkFWQV9DTEFTU19GT0xERVJfTk9UX0VYSVNUOwotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQl9Ci0JCS8vIEVuc3VyZSBwcm9qZWN0IGlzIGFjY2Vzc2libGUuCi0JCWlmICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5FUlJfSkFWQV9DTEFTU19GT0xERVJfTk9UX0VYSVNUOwotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQl9Ci0JCS8vIEVuc3VyZSB0aGUgcHJvamVjdCBpcyBhIGphdmEgcHJvamVjdC4KLQkJdHJ5IHsKLQkJCWlmICghcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotCQkJCVN0cmluZyBtc2cgPSBKMkVFQ29tbW9uTWVzc2FnZXMuRVJSX0pBVkFfQ0xBU1NfTk9UX0pBVkFfUFJPSkVDVDsKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfQotCQkvLyBFbnN1cmUgdGhlIHNlbGVjdGVkIGZvbGRlciBpcyBhIHZhbGlkIGphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIGNvbXBvbmVudAotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldEphdmFTb3VyY2VDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsIHx8ICghIGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpLmVxdWFscyhuZXcgUGF0aChjb250YWluZXJGdWxsUGF0aCkpKSkgewotCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFQ29tbW9uTWVzc2FnZXMuRVJSX0pBVkFfQ0xBU1NfRk9MREVSX05PVF9TT1VSQ0UsIG5ldyBTdHJpbmdbXXtjb250YWluZXJGdWxsUGF0aH0pOwotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQl9Ci0JCS8vIFZhbGlkIHNvdXJjZSBpcyBzZWxlY3RlZAotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCB3aWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvcnJlY3RuZXNzIG9mIGVudGl0eSBwYWNrYWdlCi0JICogaW4gYWNjb3JkYW5jZSB3aXRoIEphdmEgY29udmVudGlvbiByZXF1aXJlbWVudHMuIFRoaXMgbWV0aG9kIHdpbGwgYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIuIAotCSAqIAotCSAqIEBzZWUgTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShTdHJpbmcpCi0JICogCi0JICogQHBhcmFtIHBhY2tOYW1lCi0JICogQHJldHVybiBJU3RhdHVzIGlzIHRoZSBwYWNrYWdlIG5hbWUgc2F0aXNmaWVzIEphdmEgY29udmVudGlvbiByZXF1aXJlbWVudHMKLQkgKi8KLQkKLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVKYXZhUGFja2FnZShTdHJpbmcgcGFja05hbWUpIHsJCQotCQlpZiAocGFja05hbWUgPT0gbnVsbCB8fCBwYWNrTmFtZS5lcXVhbHMoRU1QVFlfU1RSSU5HKSkgewotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVXYXJuaW5nU3RhdHVzKEVudGl0eVdpemFyZE1zZy5ERUZBVUxUX1BBQ0tBR0VfV0FSTklORyk7Ci0JCX0JCQkKLQkJLy8gVXNlIHN0YW5kYXJkIGphdmEgY29udmVudGlvbnMgdG8gdmFsaWRhdGUgdGhlIHBhY2thZ2UgbmFtZQotCQlJU3RhdHVzIGphdmFTdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVQYWNrYWdlTmFtZShwYWNrTmFtZSwgSmF2YUNvcmUuVkVSU0lPTl8xXzUsIEphdmFDb3JlLlZFUlNJT05fMV81KTsKLQkJaWYgKGphdmFTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQlTdHJpbmcgbXNnID0gSjJFRUNvbW1vbk1lc3NhZ2VzLkVSUl9KQVZBX1BBQ0FLR0VfTkFNRV9JTlZBTElEICsgamF2YVN0YXR1cy5nZXRNZXNzYWdlKCk7CQkJCQotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQl9IGVsc2UgaWYgKGphdmFTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCVN0cmluZyBtc2cgPSBKMkVFQ29tbW9uTWVzc2FnZXMuRVJSX0pBVkFfUEFDS0FHRV9OQU1FX1dBUk5JTkcgKyBqYXZhU3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlV2FybmluZ1N0YXR1cyhtc2cpOwotCQl9CQkKLQkJLy8gamF2YSBwYWNrYWdlIG5hbWUgaXMgdmFsaWQKLQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gIEl0IHdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZSAKLQkgKiB0aGUgY29ycmVjdG5lc3Mgb2YgeG1sIGZpbGUgbG9jYXRpb24uIAotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIuIAotCSAqIAotCSAqIEBzZWUgTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShTdHJpbmcpCi0JICogCi0JICogQHBhcmFtIHhtbE5hbWUKLQkgKiBAcmV0dXJuIElTdGF0dXMgaXMgdGhlIHBhY2thZ2UgbmFtZSBzYXRpc2ZpZXMgSmF2YSBjb252ZW50aW9uIHJlcXVpcmVtZW50cwotCSAqLwotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVhtbE5hbWUoU3RyaW5nIHhtbE5hbWUpIHsKLQkJaWYgKGdldEJvb2xlYW5Qcm9wZXJ0eShYTUxfU1VQUE9SVCkpIHsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IHRoaXMubW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoeG1sTmFtZSkpIHsKLQkJCQlKcGFYbWxSZXNvdXJjZSBvcm1YbWxSZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKHhtbE5hbWUpOwotCQkJCWlmIChvcm1YbWxSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQlFbnRpdHlXaXphcmRNc2cuSU5WQUxJRF9YTUxfTkFNRSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGdldFRhcmdldEpwYVByb2plY3QoKS5nZXRKcGFGaWxlKG9ybVhtbFJlc291cmNlLmdldEZpbGUoKSkucm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpID09IDApIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQlFbnRpdHlXaXphcmRNc2cuTUFQUElOR19GSUxFX05PVF9MSVNURURfRVJST1IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZ2V0T3JtWG1sUmVzb3VyY2UoU3RyaW5nIHhtbE5hbWUpIHsKLQkJcmV0dXJuIGdldFRhcmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKHhtbE5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCB3aWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGVudGl0eSBmaWVsZHMKLQkgKiBsaXN0IHRvIGVuc3VyZSB0aGVyZSBhcmUgbm90IGFueSBkdXBsaWNhdGVzLiBUaGlzIG1ldGhvZCB3aWxsIGFjY2VwdCBhIG51bGwgcGFyYW1ldGVyLiAKLQkgKiAKLQkgKiBAc2VlIE5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBlbnRpdGllcwotCSAqIEByZXR1cm4gSVN0YXR1cyBpcyB0aGUgZmllbGRzIG5hbWVzIGFyZSB1bmlxdWUKLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVGaWVsZHNMaXN0KEFycmF5TGlzdDxFbnRpdHlSb3c+IGVudGl0aWVzKSB7Ci0JCWlmIChlbnRpdGllcyAhPSBudWxsICYmICFlbnRpdGllcy5pc0VtcHR5KCkpIHsKLQkJCS8vIEVuc3VyZSB0aGVyZSBhcmUgbm90IGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSBsaXN0Ci0JCQlib29sZWFuIGR1cCA9IGhhc0R1cGxpY2F0ZXNJbkVudGl0eUZpZWxkcyhlbnRpdGllcyk7Ci0JCQlpZiAoZHVwKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IEVudGl0eVdpemFyZE1zZy5EVVBMSUNBVEVEX0VOVElUWV9OQU1FU19NRVNTQUdFOwkJCQkKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCQl9Ci0JCQkvLyBFbnN1cmUgdGhhdCB0aGUgZW50cmllcyBpbiB0aGUgbGlzdCBhcmUgdmFsaWQKLQkJCVN0cmluZyBlcnJvck1zZyA9IGNoZWNrSW5wdXRFbGVtZW50c1R5cGVWYWxpZGF0aW9uKGVudGl0aWVzKTsKLQkJCWlmIChlcnJvck1zZyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1zZyk7Ci0JCQl9Ci0JCQlTdHJpbmcgd2FybmluZ01zZyA9IGNoZWNrSW5wdXRFbGVtZW50c1R5cGVFeGlzdGVuY2UoZW50aXRpZXMpOwotCQkJaWYgKHdhcm5pbmdNc2cgIT0gbnVsbCkgewotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlV2FybmluZ1N0YXR1cyh3YXJuaW5nTXNnKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY2hlY2tJbnB1dEVsZW1lbnRzVHlwZVZhbGlkYXRpb24oTGlzdDxFbnRpdHlSb3c+IGlucHV0RWxlbWVudHMpIHsKLQkJSVN0YXR1cyB2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWZvciAoRW50aXR5Um93IGVudGl0eVJvdzogaW5wdXRFbGVtZW50cykgewotCQkJaWYgKGVudGl0eVJvdy5pc0tleSgpICYmICFlbnRpdHlSb3cuY291bGRCZUtleSgpKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUVudGl0eVdpemFyZE1zZy5FbnRpdHlEYXRhTW9kZWxQcm92aWRlcl9pbnZhbGlkUEtUeXBlLCBuZXcgT2JqZWN0W117ZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCl9KTsKLQkJCQl2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCUpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQkJYnJlYWs7CQkJCQotCQkJfQkJCQotCQkJU3RyaW5nIHNpZyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNpZyA9IFNpZ25hdHVyZS5jcmVhdGVUeXBlU2lnbmF0dXJlKGVudGl0eVJvdy5nZXRGcW5UeXBlTmFtZSgpLCB0cnVlKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChFbnRpdHlXaXphcmRNc2cuRW50aXR5RGF0YU1vZGVsUHJvdmlkZXJfaW52YWxpZEFyZ3VtZW50LCBuZXcgT2JqZWN0W117ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KTsKLQkJCQl2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0VWlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChzaWcgPT0gbnVsbCl7Ci0JCQkJdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVKYXZhVHlwZU5hbWUoZW50aXR5Um93LmdldFR5cGUoKSwgSmF2YUNvcmUuVkVSU0lPTl8xXzUsIEphdmFDb3JlLlZFUlNJT05fMV81KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWludCBzaWdUeXBlID0gU2lnbmF0dXJlLmdldFR5cGVTaWduYXR1cmVLaW5kKHNpZyk7Ci0JCQlpZiAoc2lnVHlwZSA9PSBTaWduYXR1cmUuQkFTRV9UWVBFX1NJR05BVFVSRSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSBpZiAoc2lnVHlwZSA9PSBTaWduYXR1cmUuQVJSQVlfVFlQRV9TSUdOQVRVUkUpIHsKLQkJCQlTdHJpbmcgZWxlbWVudFNpZ25hdHVyZSA9IFNpZ25hdHVyZS5nZXRFbGVtZW50VHlwZShzaWcpOwotCQkJCWlmIChTaWduYXR1cmUuZ2V0VHlwZVNpZ25hdHVyZUtpbmQoZWxlbWVudFNpZ25hdHVyZSkgPT0gU2lnbmF0dXJlLkJBU0VfVFlQRV9TSUdOQVRVUkUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBjaGVja0lucHV0RWxlbWVudHNUeXBlRXhpc3RlbmNlKExpc3Q8RW50aXR5Um93PiBpbnB1dEVsZW1lbnRzKSB7Ci0JCUlTdGF0dXMgdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXM9U3RhdHVzLk9LX1NUQVRVUzsKLQkJZm9yIChFbnRpdHlSb3cgZW50aXR5Um93OiBpbnB1dEVsZW1lbnRzKSB7Ci0JCQlTdHJpbmcgc2lnID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUoZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCkgLHRydWUpOwotCQkJaWYgKHNpZyA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUVudGl0eVdpemFyZE1zZy5FbnRpdHlEYXRhTW9kZWxQcm92aWRlcl90eXBlTm90SW5Qcm9qZWN0Q2xhc3NwYXRoLCBuZXcgT2JqZWN0W117ZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCl9KTsKLQkJCQl2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCUpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpbnQgc2lnVHlwZSA9IFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZChzaWcpOwotCQkJaWYgKHNpZ1R5cGUgPT0gU2lnbmF0dXJlLkJBU0VfVFlQRV9TSUdOQVRVUkUpewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSBpZiAoc2lnVHlwZSA9PSBTaWduYXR1cmUuQVJSQVlfVFlQRV9TSUdOQVRVUkUpIHsKLQkJCQlTdHJpbmcgZWxlbWVudFNpZ25hdHVyZSA9IFNpZ25hdHVyZS5nZXRFbGVtZW50VHlwZShzaWcpOwotCQkJCWlmKFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZChlbGVtZW50U2lnbmF0dXJlKSA9PSBTaWduYXR1cmUuQkFTRV9UWVBFX1NJR05BVFVSRSl7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyhlbGVtZW50U2lnbmF0dXJlKTsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBnZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUKTsKLQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJdHlwZSA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKHF1YWxpZmllZE5hbWUpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlFbnRpdHlXaXphcmRNc2cuRW50aXR5RGF0YU1vZGVsUHJvdmlkZXJfdHlwZU5vdEluUHJvamVjdENsYXNzcGF0aCwgbmV3IE9iamVjdFtde2VudGl0eVJvdy5nZXRGcW5UeXBlTmFtZSgpfSk7Ci0JCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1QpOwotCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQlJVHlwZSB0eXBlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQl0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUoZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCkpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlFbnRpdHlXaXphcmRNc2cuRW50aXR5RGF0YU1vZGVsUHJvdmlkZXJfdHlwZU5vdEluUHJvamVjdENsYXNzcGF0aCwgbmV3IE9iamVjdFtde2VudGl0eVJvdy5nZXRGcW5UeXBlTmFtZSgpfSk7Ci0JCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZighdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkJCQotCQkJCi0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCBwcm92aWRlcyBhIHNpbXBsZSBhbGdvcml0aG0gZm9yIGRldGVjdGluZwotCSAqIGlmIHRoZXJlIGFyZSBkdXBsaWNhdGUgZW50cmllcyBpbiBhIGxpc3QuIEl0IHdpbGwgYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIuIEl0IHdpbGwgcmV0dXJuCi0JICogYm9vbGVhbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcmV0dXJuIGJvb2xlYW4gYXJlIHRoZXJlIGR1cGxpY2F0aW9ucyBpbiB0aGUgbGlzdAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNEdXBsaWNhdGVzSW5FbnRpdHlGaWVsZHMoQXJyYXlMaXN0PEVudGl0eVJvdz4gaW5wdXQpIHsKLQkJaWYgKGlucHV0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgbiA9IGlucHV0LnNpemUoKTsKLQkJLy8gbmVzdGVkIGZvciBsb29wcyB0byBjaGVjayBlYWNoIGVsZW1lbnQgdG8gc2VlIGlmIG90aGVyIGVsZW1lbnRzIGFyZSB0aGUgc2FtZQotCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJRW50aXR5Um93IGVudGl0eSA9IGlucHV0LmdldChpKTsKLQkJCWZvciAoaW50IGogPSBpICsgMTsgaiA8IG47IGorKykgewotCQkJCUVudGl0eVJvdyBpbnRFbnRpdHkgPSBpbnB1dC5nZXQoaik7Ci0JCQkJaWYgKGludEVudGl0eS5nZXROYW1lKCkuZXF1YWxzKGVudGl0eS5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0VGFyZ2V0SnBhUHJvamVjdCgpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFRhcmdldFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBKcGFGYWNldC5pc0luc3RhbGxlZChwcm9qZWN0KSkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb250YWluZXIgZ2V0SmF2YVNvdXJjZUNvbnRhaW5lcigpIHsKLQkJU3RyaW5nIGNvbnRhaW5lckZ1bGxQYXRoID0gZ2V0U3RyaW5nUHJvcGVydHkoU09VUkNFX0ZPTERFUik7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IGdldFRhcmdldEpwYVByb2plY3QoKTsKLQkJaWYgKGpwYVByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0ganBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpOwotCQl0cnkgewotCQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIgOiBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpKSB7Ci0JCQkJaWYgKHBmci5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKLQkJCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcGZyLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkJCQlpZiAoY29udGFpbmVyLmdldEZ1bGxQYXRoKCkuZXF1YWxzKG5ldyBQYXRoKGNvbnRhaW5lckZ1bGxQYXRoKSkpIHsKLQkJCQkJCXJldHVybiBjb250YWluZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCS8vIGZhbGwgdGhyb3VnaAotCQkJSnB0VWlQbHVnaW4ubG9nKGptZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRKYXZhUGFja2FnZUZyYWdtZW50Um9vdCgpIHsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gZ2V0VGFyZ2V0SnBhUHJvamVjdCgpOwotCQlpZiAoanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBqcGFQcm9qZWN0LmdldEphdmFQcm9qZWN0KCk7Ci0JCQkvLyBSZXR1cm4gdGhlIHNvdXJjZSBmb2xkZXIgZm9yIHRoZSBqYXZhIHByb2plY3Qgb2YgdGhlIHNlbGVjdGVkIHByb2plY3QKLQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSUNvbnRhaW5lciBzb3VyY2VDb250YWluZXIgPSBnZXRKYXZhU291cmNlQ29udGFpbmVyKCk7Ci0JCQkJaWYgKHNvdXJjZUNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHNvdXJjZUNvbnRhaW5lcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvRW50aXR5Um93LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9kYXRhL21vZGVsL0VudGl0eVJvdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmFkNWNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvRW50aXR5Um93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEaW1pdGVyIERpbWl0cm92LCBkLmRpbWl0cm92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRW50aXR5Um93IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET1QgPSAiLiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBCUkFDS0VUX1NRVUFSRSA9ICdbJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEJSQUNLRVRfQU5HVUxBUiA9ICc8JzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9KQVZBX0xBTkcgPSAiamF2YS5sYW5nLiI7Ci0JcHJpdmF0ZSBib29sZWFuIGtleSA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSAiIjsKLQlwcml2YXRlIFN0cmluZyB0eXBlID0gIiI7Ci0JcHJpdmF0ZSBTdHJpbmcgZnFuVHlwZU5hbWUgPSAiIjsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIFBLX1RZUEVTID0geyJpbnQiLCAibG9uZyIsICJzaG9ydCIsICJjaGFyIiwgImJvb2xlYW4iLCAiYnl0ZSIsICJkb3VibGUiLCAiZmxvYXQiLCAKLQkJImphdmEubGFuZy5TdHJpbmciLCAiamF2YS5zcWwuRGF0ZSIsICJqYXZhLnV0aWwuRGF0ZSIsICJqYXZhLmxhbmcuSW50ZWdlciIsICJqYXZhLmxhbmcuTG9uZyIsICJqYXZhLmxhbmcuU2hvcnQiLAotCQkiamF2YS5sYW5nLkNoYXJhY3RlciIsICJqYXZhLmxhbmcuQm9vbGVhbiIsICJqYXZhLmxhbmcuQnl0ZSIsICJqYXZhLmxhbmcuRG91YmxlIiwgImphdmEubGFuZy5GbG9hdCJ9OwotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIFBLX1RZUEVTX1NIT1JUID0geyAiU3RyaW5nIiwgIkludGVnZXIiLCAiTG9uZyIsICJTaG9ydCIsICJDaGFyYWN0ZXIiLCAiQm9vbGVhbiIsIAotCQkgIkJ5dGUiLCAiRG91YmxlIiwgIkZsb2F0IiB9OwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTGlzdDxTdHJpbmc+IFZBTElEX1BLX1RZUEVTID0gQXJyYXlzLmFzTGlzdChQS19UWVBFUyk7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTGlzdDxTdHJpbmc+IFZBTElEX1BLX1RZUEVTX1NIT1JUID0gQXJyYXlzLmFzTGlzdChQS19UWVBFU19TSE9SVCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBwcmVzZW50ZWQgZW50aXR5IGZpZWxkIGlzIHByaW1hcnkga2V5IG9yIHBhcnQgb2YgY29tcG9zaXRlIHByaW1hcnkga2V5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNLZXkoKSB7Ci0JCXJldHVybiBrZXk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJlc2VudGVkIGVudGl0eSBmaWVsZCB0byBiZSBwcmltYXJ5IGtleSAob3IgcGFydCBvZiBjb21wb3NpdGUgcHJpbWFyaSBrZXkpCi0JICogCi0JICogQHBhcmFtIGtleSAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZXkoYm9vbGVhbiBrZXkpIHsKLQkJdGhpcy5rZXkgPSBrZXk7Ci0JfQotCQkKLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZSB0eXBlIG9mIHRoZSBlbnRpdHkgaXMgYWxsb3dlZCB0byBiZSBwcmltYXJ5IGtleS4KLQkgKiBUaGUgbGltaXRhdGlvbiBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyB0aGF0IEVtYmVkZGVkIFBLIGFyZSBub3QgY2hlY2tlZAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdHlwZSBvZiBmaWVsZCBjb3VsZCBiZSB1c2VkIGFzIHByaW1hcnkga2V5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY291bGRCZUtleSgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmVzdWx0ID0gVkFMSURfUEtfVFlQRVMuY29udGFpbnMoZ2V0RnFuVHlwZU5hbWUoKSk7CQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkgZmllbGQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHByZXNlbnRlZCBlbnRpdHkgZmllbGQKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIChhcyBhIHNpbXBsZSBuYW1lKSBvZiB0aGUgZW50aXR5IGZpZWxkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0eXBlIChhcyBhIHNpbXBsZSBuYW1lKSBvZiB0aGUgZW50aXR5IGZpZWxkCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgdHlwZSAoYXMgZnVsbHkgcXVhbGlmaWVkIG5hbWUpIG9mIHRoZSBlbnRpdHkgZmllbGQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZxblR5cGVOYW1lKCkgewotCQlyZXR1cm4gZnFuVHlwZU5hbWU7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIHJlbW92ZVNwYWNlcyhTdHJpbmcgc3RyKSB7Ci0JCXN0ciA9IHN0ci50cmltKCk7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjID0gc3RyLmNoYXJBdChpKTsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgCi0JCQkJc2IuYXBwZW5kKGMpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRCYXNpY0ZRTihTdHJpbmcgZnFuKSB7Ci0JCVN0cmluZyByZXM7Ci0JCWludCBic0luZGV4ID0gZnFuLmluZGV4T2YoQlJBQ0tFVF9TUVVBUkUpOwotCQlpbnQgYmFJbmRleCA9IGZxbi5pbmRleE9mKEJSQUNLRVRfQU5HVUxBUik7Ci0JCWlmIChic0luZGV4ID09IC0xKSB7Ci0JCQlpZiAoYmFJbmRleCA9PSAtMSkgcmVzID0gZnFuOwotCQkJZWxzZSByZXMgPSBmcW4uc3Vic3RyaW5nKDAsIGJhSW5kZXgpOwotCQl9IGVsc2UgewotCQkJaWYgKGJhSW5kZXggPT0gLTEpIHJlcyA9IGZxbi5zdWJzdHJpbmcoMCwgYnNJbmRleCk7Ci0JCQllbHNlIHJlcyA9IGZxbi5zdWJzdHJpbmcoMCwgTWF0aC5tYXgoYnNJbmRleCwgYmFJbmRleCkpOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZSBvZiB0aGUgZW50aXR5IGZpZWxkCi0JICogCi0JICogQHBhcmFtIGZxblR5cGVOYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0RnFuVHlwZU5hbWUoU3RyaW5nIGZxblR5cGVOYW1lKSB7Ci0JCWZxblR5cGVOYW1lID0gcmVtb3ZlU3BhY2VzKGZxblR5cGVOYW1lKTsKLQkJU3RyaW5nIGZxbkJhc2ljVHlwZU5hbWUgPSBnZXRCYXNpY0ZRTihmcW5UeXBlTmFtZSk7Ci0JCWlmIChmcW5CYXNpY1R5cGVOYW1lLmluZGV4T2YoRE9UKSA9PSAtMSkgewotCQkJaWYgKFZBTElEX1BLX1RZUEVTX1NIT1JULmNvbnRhaW5zKGZxbkJhc2ljVHlwZU5hbWUpKSB7Ci0JCQkJdGhpcy5mcW5UeXBlTmFtZSA9IFBBQ0tBR0VfSkFWQV9MQU5HICsgZnFuVHlwZU5hbWU7Ci0JCQkJc2V0VHlwZShmcW5UeXBlTmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuZnFuVHlwZU5hbWUgPSBmcW5UeXBlTmFtZTsKLQkJCQlzZXRUeXBlKGZxblR5cGVOYW1lKTsKLQkJCX0JCQkKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZnFuVHlwZU5hbWUgPSBmcW5UeXBlTmFtZTsKLQkJCXNldFR5cGUoZ2V0U2ltcGxlTmFtZShmcW5UeXBlTmFtZSkpOwotCQl9CQkKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgb2YgdGhlIGVudGl0eSBmaWVsZCBpcyBib29sZWFuLiBUaGUgaW5mb3JtYXRpb24gY291bGQgYmUgdXNlZCAKLQkgKiB3aGVuIHRoZSBuYW1lIG9mIGdldHRlciBzaG91bGQgYmUgY29uc3RydWN0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Jvb2xlYW4oKSB7Ci0JCXJldHVybiAiYm9vbGVhbiIuZXF1YWxzKGdldFR5cGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIEZvciBpbnRlcm5hbCBwdXJwb3NlIG9ubHkKLQkgKiBDb252ZXJ0IGZ1bGx5IHF1YWxpZmllZCBuYW1lIHRvIHRoZSBzaW1wbGUgb25lCi0JICogQHBhcmFtIGZ1bGx5TmFtZQotCSAqIEByZXR1cm4gdGhlIHNpbXBsZSBuYW1lIGZvcm0gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIHBhcmFtZXRlcihsYXN0IHNlZ21lbnQpCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U2ltcGxlTmFtZShTdHJpbmcgZnVsbHlOYW1lKSB7Ci0JCXJldHVybiBmdWxseU5hbWUuc3Vic3RyaW5nKGZ1bGx5TmFtZS5sYXN0SW5kZXhPZihET1QpICsgMSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJZmluYWwgaW50IHByaW1lID0gMzE7Ci0JCWludCByZXN1bHQgPSAxOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdAotCQkJCSsgKChmcW5UeXBlTmFtZSA9PSBudWxsKSA/IDAgOiBmcW5UeXBlTmFtZS5oYXNoQ29kZSgpKTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG5hbWUgPT0gbnVsbCkgPyAwIDogbmFtZS5oYXNoQ29kZSgpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEltcGxlbWVudCBlcXVhbHMsIGRlcGVuZGluZyBmcm9tIG5hbWUgb2YgdGhlIGVudGl0eSBmaWVsZCBhbmQgaXRzIHR5cGUuCi0JICogVGhlIHR5cGUgaXMgcHJlc2VudGVkIGZyb20gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmaW5hbCBFbnRpdHlSb3cgb3RoZXIgPSAoRW50aXR5Um93KSBvYmo7Ci0JCWlmIChmcW5UeXBlTmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIuZnFuVHlwZU5hbWUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIWZxblR5cGVOYW1lLmVxdWFscyhvdGhlci5mcW5UeXBlTmFtZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCWlmIChvdGhlci5uYW1lICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKCFuYW1lLmVxdWFscyhvdGhlci5uYW1lKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9JRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9JRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTAzZGFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGltaXRlciBEaW1pdHJvdiwgZC5kaW1pdHJvdkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLCBJQW5ub3RhdGlvbnNEYXRhTW9kZWwgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9ICJJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX0FTX1NVUEVSQ0xBU1MgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuTUFQUEVEX0FTX1NVUEVSQ0xBU1MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5IRVJJVEFOQ0UgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuSU5IRVJJVEFOQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5IRVJJVEFOQ0VfU1RSQVRFR1kgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuSU5IRVJJVEFOQ0VfU1RSQVRFR1kiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NVUFBPUlQgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuWE1MX1NVUFBPUlQiOyAvLyROT04tTkxTLTEkWE1MX1NVUFBPUlQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX05BTUUgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuWE1MX05BTUUiOyAvLyROT04tTkxTLTEkWE1MX1NVUFBPUlQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfTkFNRSA9ICJJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFlfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FX0RFRkFVTFQgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuVEFCTEVfTkFNRV9ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuVEFCTEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfRklFTERTID0gIklFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVOVElUWV9GSUVMRFMiOyAvLyROT04tTkxTLTEkCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBLX0ZJRUxEUyA9ICJJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5QS19GSUVMRFMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfQUNDRVNTX1RZUEUgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRklFTERfQUNDRVNTX1RZUEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQUNDRVNTX1RZUEUgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuUFJPUEVSVFlfQUNDRVNTX1RZUEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQJCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9kYXRhL29wZXJhdGlvbi9OZXdFbnRpdHlDbGFzc09wZXJhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9vcGVyYXRpb24vTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3MmFkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9kYXRhL29wZXJhdGlvbi9OZXdFbnRpdHlDbGFzc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGltaXRlciBEaW1pdHJvdiwgZC5kaW1pdHJvdkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uamV0LkpFVEVtaXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uamV0LkpFVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LlBsYXRmb3JtVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuQW5ub3RhdGVkRW50aXR5VGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LkVudGl0eVRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5FbnRpdHlXaXphcmRNc2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LklkQ2xhc3NUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC5DcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlci5Bbm5vdGF0aW9uc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb250cm9sbGVyLkFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5XVFBKRVRFbWl0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aS5XRlRXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIFRoZSBOZXdFbnRpdHlDbGFzc09wZXJhdGlvbiBpcyBJRGF0YU1vZGVsT3BlcmF0aW9uIGZvbGxvd2luZyB0aGUKLSAqIElEYXRhTW9kZWwgd2l6YXJkIGFuZCBvcGVyYXRpb24gZnJhbWV3b3JrLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyB1c2VkIHRvIGdlbmVyYXRlIGphdmEgY2xhc3NlcyBmb3IgdGhlIG5ldyBKUEEgZW50aXR5LiBJdCB1c2VzIAotICogRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIgdG8gc3RvcmUgdGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhlIG5ldyBlbnRpdHkuIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbEVudGl0eURhdGFNb2RlbFByb3ZpZGVyCi0gKiAKLSAqIEEgV1RQSmV0RW1pdHRlciBlbnRpdHkgdGVtcGxhdGUgaXMgdXNlZCB0byBjcmVhdGUgdGhlIGNsYXNzIHdpdGggdGhlIGVudGl0eSB0ZW1wbGF0ZS4gCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuV1RQSkVURW1pdHRlcgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC5DcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gc3Vic3RhbnRpYWwgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIE5ld0VudGl0eUNsYXNzT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9KQVZBID0gIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1IgPSAiLyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1NUUklORyA9ICIxLjAiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTEQgPSAiRklFTEQiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFkgPSAiUFJPUEVSVFkiOy8vJE5PTi1OTFMtMSQJCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1RQX0NVU1RPTUlaQVRJT05fUExVR0lOID0gIldUUF9DVVNUT01JWkFUSU9OX1BMVUdJTiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFURURfRU5USVRZX1RFTVBMQVRFX0ZJTEUgPSAiL3RlbXBsYXRlcy9hbm5vdGF0ZWRfZW50aXR5LmphdmFqZXQiOyAvLyROT04tTkxTLTEkCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9URU1QTEFURV9GSUxFID0gIi90ZW1wbGF0ZXMvZW50aXR5LmphdmFqZXQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURDTEFTU19URU1QTEFURV9GSUxFID0gIi90ZW1wbGF0ZXMvaWRDbGFzcy5qYXZhamV0IjsgLy8kTk9OLU5MUy0xJAkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMREVSX0lEID0gImJ1aWxkZXJJZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfVEFCTEUgPSAiU0lOR0xFX1RBQkxFIjsvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogTWV0aG9kIG5hbWUgb2YgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy4gCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfTUVUSE9EID0gImdlbmVyYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY29uc3RydWN0b3Igd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIE5ld0VudGl0eUNsYXNzT3BlcmF0aW9uLiAKLQkgKiBBbiBpbnN0YW5jZSBvZiB0aGUgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBzaG91bGQgYmUgcGFzc2VkIGluLiBUaGlzIGRvZXMgbm90IGFjY2VwdAotCSAqIG51bGwgcGFyYW1ldGVyLiBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIEFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uI0FydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uKElEYXRhTW9kZWwpCi0JICogQHNlZSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsCi0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqIEByZXR1cm4gTmV3RmlsdGVyQ2xhc3NPcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGV4ZWN1dGUgbWV0aG9kIGRyaXZlcyB0aGUgcnVubmluZyBvZiB0aGUgb3BlcmF0aW9uLiAKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHdpbGwgY3JlYXRlIHRoZSBqYXZhIHNvdXJjZSBmb2xkZXIsIGNyZWF0ZSB0aGUgamF2YSBwYWNrYWdlLCBhbmQgdGhlbiAKLQkgKiB0aGUgZW50aXR5IChvciBtYXBwZWQgYXMgc3VwZXJjbGFzcykgYW5kIElEIGNsYXNzIGZpbGVzIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0ZW1wbGF0ZXMuIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5XVFBPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKiBAc2VlIE5ld0VudGl0eUNsYXNzT3BlcmF0aW9uI2dlbmVyYXRlVXNpbmdUZW1wbGF0ZXMoSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIElQYWNrYWdlRnJhZ21lbnQpCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gQ3JlYXRlIHNvdXJjZSBmb2xkZXIgaWYgaXQgZG9lcyBub3QgZXhpc3QKLQkJY3JlYXRlSmF2YVNvdXJjZUNvbnRhaW5lcigpOwotCQkvLyBDcmVhdGUgamF2YSBwYWNrYWdlIGlmIGl0IGRvZXMgbm90IGV4aXN0Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGFjayA9IGNyZWF0ZUphdmFQYWNrYWdlKCk7Ci0JCS8vIEdlbmVyYXRlIGZpbHRlciBjbGFzcyB1c2luZyB0ZW1wbGF0ZXMKLQkJdHJ5IHsKLQkJCWdlbmVyYXRlVXNpbmdUZW1wbGF0ZXMobW9uaXRvciwgcGFjayk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgamF2YSBwYWNrYWdlIGFzIHNwZWNpZmllZCBieSB0aGUgbmV3IGphdmEKLQkgKiBjbGFzcyBkYXRhIG1vZGVsLiBJZiB0aGUgcGFja2FnZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBjcmVhdGUgdGhlCi0JICogcGFja2FnZS4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzI0pBVkFfUEFDS0FHRQotCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QjY3JlYXRlUGFja2FnZUZyYWdtZW50KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBib29sZWFuLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKiAKLQkgKiBAcmV0dXJuIElQYWNrYWdlRnJhZ21lbnQgdGhlIGphdmEgcGFja2FnZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJUGFja2FnZUZyYWdtZW50IGNyZWF0ZUphdmFQYWNrYWdlKCkgewotCQkvLyBSZXRyaWV2ZSB0aGUgcGFja2FnZSBuYW1lIGZyb20gdGhlIGphdmEgY2xhc3MgZGF0YSBtb2RlbAotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BBQ0tBR0UpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrUm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgbW9kZWwKLQkJCQkuZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpOwotCQlJUGFja2FnZUZyYWdtZW50IHBhY2sgPSBwYWNrUm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpOwotCQkvLyBIYW5kbGUgZGVmYXVsdCBwYWNrYWdlCi0JCWlmIChwYWNrID09IG51bGwpIHsKLQkJCXBhY2sgPSBwYWNrUm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0JCQotCQkKLQkJLy8gQ3JlYXRlIHRoZSBwYWNrYWdlIGZyYWdtZW50IGlmIGl0IGRvZXMgbm90IGV4aXN0Ci0JCWlmICghcGFjay5leGlzdHMoKSkgewotCQkJU3RyaW5nIHBhY2tOYW1lID0gcGFjay5nZXRFbGVtZW50TmFtZSgpOwotCQkJdHJ5IHsKLQkJCQlwYWNrID0gcGFja1Jvb3QuY3JlYXRlUGFja2FnZUZyYWdtZW50KHBhY2tOYW1lLCB0cnVlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JCS8vIFJldHVybiB0aGUgcGFja2FnZQotCQlyZXR1cm4gcGFjazsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIGNyZWF0aW9uIG9mIGEgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBhbmQgdGhlIFdUUEpFVEVtaXR0ZXIKLQkgKiB0byBjcmVhdGUgdGhlIGphdmEgY2xhc3Mgd2l0aCB0aGUgYW5ub3RhdGVkIHRhZ3MuIFRoaXMgbWV0aG9kIGFjY2VwdHMgbnVsbCBmb3IgbW9uaXRvciwgaXQgZG9lcyBub3QgYWNjZXB0IG51bGwgCi0JICogZm9yIGZyYWdtZW50LiBJZiBhbm5vdGF0aW9ucyBhcmUgbm90IGJlaW5nIHVzZWQgdGhlIHRhZ3Mgd2lsbCBiZSBvbWl0dGVkIGZyb20gdGhlIGNsYXNzLgotCSAqIAotCSAqIEBzZWUgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbAotCSAqIEBzZWUgTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24jZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZShDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsLAotCSAqICAgICAgSVByb2dyZXNzTW9uaXRvcikKLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEBwYXJhbSBmcmFnbWVudAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgV0ZUV3JhcHBlZEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlVXNpbmdUZW1wbGF0ZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUGFja2FnZUZyYWdtZW50IGZyYWdtZW50KSB0aHJvd3MgV0ZUV3JhcHBlZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JICAgIC8vIENyZWF0ZSB0aGUgZW50aXR5IHRlbXBsYXRlIG1vZGVsCi0JICAgIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgdGVtcE1vZGVsID0gY3JlYXRlVGVtcGxhdGVNb2RlbCgpOwotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0VGFyZ2V0UHJvamVjdCgpOwotICAgICAgICBTdHJpbmcgZW50aXR5Q2xhc3NTb3VyY2UgPSBudWxsOwotICAgICAgICBTdHJpbmcgaWRDbGFzc1NvdXJjZSA9IG51bGw7Ci0gICAgICAgIC8vIEdlbmVyYXRlIHRoZSBqYXZhIHNvdXJjZSBiYXNlZCBvbiB0aGUgZW50aXR5IHRlbXBsYXRlIG1vZGVscwotICAgICAgICB0cnkgewotICAgICAgICAJaWYgKHRlbXBNb2RlbC5pc0FydGlmYWN0c0Fubm90YXRlZCgpKSB7Ci0gICAgICAgIAkJQW5ub3RhdGVkRW50aXR5VGVtcGxhdGUgdGVtcEltcGwgPSBBbm5vdGF0ZWRFbnRpdHlUZW1wbGF0ZS5jcmVhdGUobnVsbCk7Ci0gICAgICAgIAkJZW50aXR5Q2xhc3NTb3VyY2UgPSBnZW5lcmF0ZVRlbXBsYXRlU291cmNlKHRlbXBNb2RlbCwgQU5OT1RBVEVEX0VOVElUWV9URU1QTEFURV9GSUxFLCB0ZW1wSW1wbCwgbW9uaXRvcik7Ci0gICAgICAgIAl9IGVsc2UgewotICAgICAgICAJCUVudGl0eVRlbXBsYXRlIHRlbXBJbXBsID0gRW50aXR5VGVtcGxhdGUuY3JlYXRlKG51bGwpOwotICAgICAgICAJCWVudGl0eUNsYXNzU291cmNlID0gZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZSh0ZW1wTW9kZWwsIEVOVElUWV9URU1QTEFURV9GSUxFLCB0ZW1wSW1wbCwgbW9uaXRvcik7Ci0gICAgICAgIAl9Ci0gICAgICAgICAgICBpZiAodGVtcE1vZGVsLmlzQ29tcG9zaXRlUEsoKSkgewotICAgICAgICAgICAgCUlkQ2xhc3NUZW1wbGF0ZSB0ZW1wSW1wbCA9IElkQ2xhc3NUZW1wbGF0ZS5jcmVhdGUobnVsbCk7Ci0gICAgICAgICAgICAJaWRDbGFzc1NvdXJjZSA9IGdlbmVyYXRlVGVtcGxhdGVTb3VyY2UodGVtcE1vZGVsLCBJRENMQVNTX1RFTVBMQVRFX0ZJTEUsIHRlbXBJbXBsLCBtb25pdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXRlRXcmFwcGVkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmcmFnbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGphdmEgZmlsZQotICAgICAgICAgICAgU3RyaW5nIGphdmFGaWxlTmFtZSA9IHRlbXBNb2RlbC5nZXRDbGFzc05hbWUoKSArIERPVF9KQVZBOwotICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGZyYWdtZW50LmdldENvbXBpbGF0aW9uVW5pdChqYXZhRmlsZU5hbWUpOwotICAgICAgICAgICAgLy8gQWRkIHRoZSBjb21waWxhdGlvbiB1bml0IHRvIHRoZSBqYXZhIGZpbGUKLSAgICAgICAgICAgIGlmIChjdSA9PSBudWxsIHx8ICFjdS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGN1ID0gZnJhZ21lbnQuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGphdmFGaWxlTmFtZSwgZW50aXR5Q2xhc3NTb3VyY2UsIHRydWUsIG1vbml0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSUZpbGUgYUZpbGUgPSAoSUZpbGUpIGN1LmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICAvLyBMZXQgdGhlIGFubm90YXRpb25zIGNvbnRyb2xsZXIgcHJvY2VzcyB0aGUgYW5ub3RhdGVkIHJlc291cmNlCi0gICAgICAgICAgICBpZiAodGVtcE1vZGVsLmlzQXJ0aWZhY3RzQW5ub3RhdGVkKCkpIHsKLSAgICAgICAgICAgIAlBbm5vdGF0aW9uc0NvbnRyb2xsZXIgY29udHJvbGxlciA9IEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0QW5ub3RhdGlvbnNDb250cm9sbGVyKHByb2plY3QpOwotICAgICAgICAgICAgCWlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIAkJY29udHJvbGxlci5wcm9jZXNzKGFGaWxlKTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0NyZWF0ZSBJZENsYXNzIGlmIHRoZSBwcmltYXJ5IGtleSBpcyBjb21wbGV4Ci0gICAgICAgICAgICBpZiAoaWRDbGFzc1NvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVudGl0eVBLTmFtZSA9IHRlbXBNb2RlbC5nZXRJZENsYXNzTmFtZSgpICsgRE9UX0pBVkE7Ci0gICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBmcmFnbWVudC5nZXRDb21waWxhdGlvblVuaXQoZW50aXR5UEtOYW1lKTsKLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdG8gdGhlIGphdmEgZmlsZQotICAgICAgICAgICAgICAgIGlmIChjdTEgPT0gbnVsbCB8fCAhY3UxLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1MSA9IGZyYWdtZW50LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChlbnRpdHlQS05hbWUsIGlkQ2xhc3NTb3VyY2UsIHRydWUsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgIAkKLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKCF0ZW1wTW9kZWwuaXNBcnRpZmFjdHNBbm5vdGF0ZWQoKSkgewotICAgICAgICAJaWYgKHRlbXBNb2RlbC5pc05vbkVudGl0eVN1cGVyY2xhc3MoKSkgeyAKLSAgICAgICAgCQlhZGRNYXBwZWRTdXBlcmNsYXNzVG9YTUwodGVtcE1vZGVsLCBwcm9qZWN0KS5zY2hlZHVsZSgpOwotICAgICAgICAJfSBlbHNlIHsKLSAgICAgICAgCQlhZGRFbnRpdHlUb1hNTCh0ZW1wTW9kZWwsIHByb2plY3QpLnNjaGVkdWxlKCk7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRlbXBNb2RlbC5pc0FydGlmYWN0c0Fubm90YXRlZCgpICYmICFKcHRDb3JlUGx1Z2luLmRpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlcyhwcm9qZWN0KSkgewotICAgICAgICAJcmVnaXN0ZXJDbGFzc0luUGVyc2lzdGVuY2VYbWwodGVtcE1vZGVsLCBwcm9qZWN0KS5zY2hlZHVsZSgpOwotICAgICAgICB9Ci0JfQotCi0JLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBUaGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBhbgotICAgICAqIGluc3RhbmNlIG9mIHRoZSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24KLSAgICAgKiB3aXRoIHRoZSBXVFBKRVRFbWl0dGVyLiBUaGlzIG1ldGhvZCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwKLSAgICAgKiBAc2VlIE5ld0VudGl0eUNsYXNzT3BlcmF0aW9uI2dlbmVyYXRlVXNpbmdUZW1wbGF0ZXMoSVByb2dyZXNzTW9uaXRvciwKLSAgICAgKiAgICAgIElQYWNrYWdlRnJhZ21lbnQpCi0gICAgICogCi0gICAgICogQHJldHVybiBDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsCi0gICAgICovCi0gICAgcHJpdmF0ZSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIGNyZWF0ZVRlbXBsYXRlTW9kZWwoKSB7Ci0gICAgICAgIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgdGVtcGxhdGVNb2RlbCA9IG5ldyBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsKG1vZGVsKTsKLSAgICAgICAgcmV0dXJuIHRlbXBsYXRlTW9kZWw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gVGhpcyB3aWxsIHVzZSB0aGUKLSAgICAgKiBXVFBKRVRFbWl0dGVyIHRvIGNyZWF0ZSBhbiBhbm5vdGF0ZWQgamF2YSBmaWxlIGJhc2VkIG9uIHRoZSBwYXNzZWQgdGVtcGxhdGUgbW9kZWwuIAotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlcnMuIEl0IHdpbGwgbm90IHJldHVybiBudWxsLiAKLSAgICAgKiBJZiBhbm5vdGF0aW9ucyBhcmUgbm90IHVzZWQsIGl0IHdpbGwgdXNlIHRoZSBub24gYW5ub3RhdGVkIHRlbXBsYXRlIHRvIG9taXQgdGhlIGFubm90YXRlZCB0YWdzLgotICAgICAqIAotICAgICAqIEBzZWUgTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24jZ2VuZXJhdGVVc2luZ1RlbXBsYXRlcyhJUHJvZ3Jlc3NNb25pdG9yLAotICAgICAqICAgICAgSVBhY2thZ2VGcmFnbWVudCkKLSAgICAgKiBAc2VlIEpFVEVtaXR0ZXIjZ2VuZXJhdGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0gICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0W10pCi0gICAgICogQHNlZSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsCi0gICAgICogCi0gICAgICogQHBhcmFtIHRlbXBsYXRlTW9kZWwKLSAgICAgKiBAcGFyYW0gbW9uaXRvcgotICAgICAqIEBwYXJhbSB0ZW1wbGF0ZV9maWxlIAotICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBzb3VyY2UgZm9yIHRoZSBqYXZhIGZpbGUKLSAgICAgKiBAdGhyb3dzIEpFVEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIAotICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZShDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIHRlbXBsYXRlTW9kZWwsIFN0cmluZyB0ZW1wbGF0ZUZpbGUsIE9iamVjdCB0ZW1wbGF0ZUltcGwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgCi0gICAgCQl0aHJvd3MgSkVURXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICAJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlib29sZWFuIGR5bmFtaWNUcmFuc2xhdGlvbiA9IHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSjJFRVBsdWdpbi5EWU5BTUlDX1RSQU5TTEFUSU9OX09GX0pFVF9URU1QTEFURVNfUFJFRl9LRVkpOwotCQlpZiAoZHluYW1pY1RyYW5zbGF0aW9uKSB7Ci0JICAgICAgICBVUkwgdGVtcGxhdGVVUkwgPSBGaWxlTG9jYXRvci5maW5kKEpwdFVpUGx1Z2luLmluc3RhbmNlKCkuZ2V0QnVuZGxlKCksIG5ldyBQYXRoKHRlbXBsYXRlRmlsZSksIG51bGwpOwotCSAgICAgICAgY2xlYW5VcE9sZEVtaXR0ZXJQcm9qZWN0KCk7Ci0JICAgICAgICBXVFBKRVRFbWl0dGVyIGVtaXR0ZXIgPSBuZXcgV1RQSkVURW1pdHRlcih0ZW1wbGF0ZVVSTC50b1N0cmluZygpLCB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JICAgICAgICBlbWl0dGVyLnNldEludGVsbGlnZW50TGlua2luZ0VuYWJsZWQodHJ1ZSk7Ci0JICAgICAgICBlbWl0dGVyLmFkZFZhcmlhYmxlKFdUUF9DVVNUT01JWkFUSU9OX1BMVUdJTiwgSnB0VWlQbHVnaW4uUExVR0lOX0lEKTsKLQkgICAgICAgIHJldHVybiBlbWl0dGVyLmdlbmVyYXRlKG1vbml0b3IsIG5ldyBPYmplY3RbXSB7IHRlbXBsYXRlTW9kZWwgfSk7Ci0JCX0gZWxzZSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gdGVtcGxhdGVJbXBsLmdldENsYXNzKCkuZ2V0TWV0aG9kKEdFTkVSQVRFX01FVEhPRCwgbmV3IENsYXNzW10geyBPYmplY3QuY2xhc3MgfSk7Ci0JCQlyZXR1cm4gKFN0cmluZykgbWV0aG9kLmludm9rZSh0ZW1wbGF0ZUltcGwsIHRlbXBsYXRlTW9kZWwpOwotCQl9Ci0gICAgfQotICAgIAotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gSXQgd2lsbCBjbGVhbiB1cCB0aGUgb2xkIGVtbWl0ZXIgcHJvamVjdCAKLQkgKiBpbiBvcmRlciB0byBwcmV2ZW50IGdlbmVyYXRpb24gaXNzdWVzIAotCSAqLwotCXByaXZhdGUgdm9pZCBjbGVhblVwT2xkRW1pdHRlclByb2plY3QoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoV1RQSkVURW1pdHRlci5QUk9KRUNUX05BTUUpOwotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBwcm9qZWN0LmZpbmRNYXJrZXJzKElKYXZhTW9kZWxNYXJrZXIuQlVJTERQQVRIX1BST0JMRU1fTUFSS0VSLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJZm9yIChpbnQgaSA9IDAsIGwgPSBtYXJrZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewotCQkJCWlmICgoKEludGVnZXIpIG1hcmtlcnNbaV0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKS5pbnRWYWx1ZSgpID09IElNYXJrZXIuU0VWRVJJVFlfRVJST1IpIHsKLQkJCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgamF2YSBzb3VyY2UgY29udGFpbmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgamF2YQotCSAqIGNsYXNzIGRhdGEgbW9kZWwuIEl0IHdpbGwgY3JlYXRlIHRoZSBqYXZhIHNvdXJjZSBmb2xkZXIgaWYgaXQgZG9lcyBub3QKLQkgKiBleGlzdC4gVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMjU09VUkNFX0ZPTERFUgotCSAqIEBzZWUgSUZvbGRlciNjcmVhdGUoYm9vbGVhbiwgYm9vbGVhbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqIAotCSAqIEByZXR1cm4gSUZvbGRlciB0aGUgamF2YSBzb3VyY2UgZm9sZGVyCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElDb250YWluZXIgY3JlYXRlSmF2YVNvdXJjZUNvbnRhaW5lcigpIHsKLQkJLy8gR2V0IHRoZSBzb3VyY2UgZm9sZGVyIG5hbWUgZnJvbSB0aGUgZGF0YSBtb2RlbAotCQlTdHJpbmcgY29udGFpbmVyRnVsbFBhdGggPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSKTsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gUGxhdGZvcm1Ub29scy5nZXRDb250YWluZXIobmV3IFBhdGgoY29udGFpbmVyRnVsbFBhdGgpKTsKLQkJLy8gSWYgY29udGFpbmVyIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgdGhlIGZvbGRlciB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aAotCQlpZiAoISBjb250YWluZXIuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJKChJRm9sZGVyKSBjb250YWluZXIpLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCQkvLyBSZXR1cm4gdGhlIHNvdXJjZSBmb2xkZXIKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRvRXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0JCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCX0JCi0JCQotCS8qKgotCSAqIEFkZHMgZW50aXR5IHRvIE9STSBYTUwgaW4gc2VwYXJhdGUgam9iCi0JICogQHBhcmFtIG1vZGVsIGVudGl0eSBkYXRhIG1vZGVsCi0JICogQHBhcmFtIHByb2plY3QgSlBBIHByb2plY3QgaW4gd2hpY2ggdGhlIGVudGl0eSB3aWxsIGJlIGNyZWF0ZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBKb2IgYWRkRW50aXR5VG9YTUwoZmluYWwgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBtb2RlbCwgZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQlKb2Igam9iID0gbmV3IEpvYihFbnRpdHlXaXphcmRNc2cuQUREX0VOVElUWV9UT19YTUwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWZpbmFsIEpwYVhtbFJlc291cmNlIHhtbFJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UobW9kZWwsIHByb2plY3QpOwotCQkJCUVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gKEVudGl0eU1hcHBpbmdzKSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCkuZ2V0SnBhRmlsZSh4bWxSZXNvdXJjZS5nZXRGaWxlKCkpLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKTsKLQkJCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBtb2RlbC5nZXRRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkpOwotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQkJaWYgKG1vZGVsLmlzSW5oZXJpdGFuY2VTZXQoKSkgewotCQkJCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShnZXRNb2RlbEluaGVyaXRhbmNlVHlwZShtb2RlbCkpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAobW9kZWwuaXNFbnRpdHlOYW1lU2V0KCkpIHsKLQkJCQkJZW50aXR5LnNldFNwZWNpZmllZE5hbWUobW9kZWwuZ2V0RW50aXR5TmFtZSgpKTsKLQkJCQl9Ci0JCQkJaWYgKG1vZGVsLmlzVGFibGVOYW1lU2V0KCkpIHsKLQkJCQkJZW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZShtb2RlbC5nZXRUYWJsZU5hbWUoKSk7Ci0JCQkJfQotCQkJCWlmIChtb2RlbC5pc0NvbXBvc2l0ZVBLKCkpIHsKLQkJCQkJZW50aXR5LmdldElkQ2xhc3NSZWZlcmVuY2UoKS5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZShtb2RlbC5nZXRJZENsYXNzTmFtZSgpKTsKLQkJCQl9Ci0JCQkJZm9yIChTdHJpbmcgZmllbGROYW1lIDogbW9kZWwuZ2V0UEtGaWVsZHMoKSkgewotCQkJCQlwZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBmaWVsZE5hbWUpOwotCQkJCX0KLQotCQkJCXBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhnZXRNb2RlbEFjY2Vzc1R5cGUobW9kZWwpKTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQl4bWxSZXNvdXJjZS5zYXZlSWZOZWNlc3NhcnkoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBqb2I7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIGdldE9ybVhtbFJlc291cmNlKENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgbW9kZWwsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKG1vZGVsLmlzTWFwcGluZ1hNTERlZmF1bHQoKSkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UobmV3IFBhdGgobW9kZWwuZ2V0TWFwcGluZ1hNTE5hbWUoKSkpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIG1hcHBlZCBzdXBlcmNsYXNzIHRvIE9STSBYTUwgaW4gc2VwYXJhdGUgam9iCi0JICogCi0JICogQHBhcmFtIG1vZGVsIGVudGl0eSBkYXRhIG1vZGVsCi0JICogQHBhcmFtIHByb2plY3QgSlBBIHByb2plY3QgaW4gd2hpY2ggdGhlIGVudGl0eSB3aWxsIGJlIGNyZWF0ZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGpvYgotCSAqLwotCXByaXZhdGUgSm9iIGFkZE1hcHBlZFN1cGVyY2xhc3NUb1hNTChmaW5hbCBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUpvYiBqb2IgPSBuZXcgSm9iKEVudGl0eVdpemFyZE1zZy5BRERfTUFQUEVEX1NVUEVSQ0xBU1NfVE9fWE1MKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlmaW5hbCBKcGFYbWxSZXNvdXJjZSB4bWxSZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKG1vZGVsLCBwcm9qZWN0KTsKLQkJCQlFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IChFbnRpdHlNYXBwaW5ncykgSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpLmdldEpwYUZpbGUoeG1sUmVzb3VyY2UuZ2V0RmlsZSgpKS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCk7Ci0JCQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncy5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBtb2RlbC5nZXRRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkpOwotCQkJCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQkJCi0JCQkJaWYgKG1vZGVsLmlzQ29tcG9zaXRlUEsoKSkgewotCQkJCQltYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZShtb2RlbC5nZXRJZENsYXNzTmFtZSgpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJZm9yIChTdHJpbmcgZmllbGROYW1lIDogbW9kZWwuZ2V0UEtGaWVsZHMoKSkgewotCQkJCQlwZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBmaWVsZE5hbWUpOwotCQkJCX0KLQotCQkJCXBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhnZXRNb2RlbEFjY2Vzc1R5cGUobW9kZWwpKTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQl4bWxSZXNvdXJjZS5zYXZlSWZOZWNlc3NhcnkoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBqb2I7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZ2V0TW9kZWxBY2Nlc3NUeXBlKENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgbW9kZWwpIHsKLQkJU3RyaW5nIGFjY2Vzc1R5cGVTdHJpbmcgPSBGSUVMRDsKLQkJaWYgKCFtb2RlbC5pc0ZpZWxkQWNjZXNzKCkpIHsKLQkJCWFjY2Vzc1R5cGVTdHJpbmcgPSBQUk9QRVJUWTsKLQkJfQotCQlyZXR1cm4gQWNjZXNzVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY2Nlc3NUeXBlRnJvbVN0cmluZyhudWxsLCBhY2Nlc3NUeXBlU3RyaW5nKSk7Ly8gVE9ETwotCX0KLQotCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgZ2V0TW9kZWxJbmhlcml0YW5jZVR5cGUoQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBtb2RlbCkgewotCQlTdHJpbmcgaW5oZXJpdGFuY2VTdHJhdGVneSA9IG1vZGVsLmdldEluaGVyaXRhbmNlU3RyYXRlZ3lOYW1lKCk7Ci0JCWlmIChpbmhlcml0YW5jZVN0cmF0ZWd5LmVxdWFscyhFTVBUWV9TVFJJTkcpKSB7Ci0JCQlpbmhlcml0YW5jZVN0cmF0ZWd5ID0gU0lOR0xFX1RBQkxFOwotCQl9Ci0JCXJldHVybiBJbmhlcml0YW5jZVR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5oZXJpdGFuY2VUeXBlRnJvbVN0cmluZyhudWxsLCBpbmhlcml0YW5jZVN0cmF0ZWd5KSk7Ly9UT0RPCi0JfQotCi0JLyoqCi0JICogUmVnaXN0IHRoZSBjbGFzcyBpbiB0aGUgcGVyc2lzdGVuY2UueG1sCi0JICogCi0JICogQHBhcmFtIG1vZGVsIGVudGl0eSBkYXRhIG1vZGVsCi0JICogQHBhcmFtIHByb2plY3QgSlBBIHByb2plY3QgaW4gd2hpY2ggdGhlIGVudGl0eSB3aWxsIGJlIGNyZWF0ZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGpvYgotCSAqLwotCXByaXZhdGUgSm9iIHJlZ2lzdGVyQ2xhc3NJblBlcnNpc3RlbmNlWG1sKGZpbmFsIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgbW9kZWwsIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJSm9iIGpvYiA9IG5ldyBKb2IoRW50aXR5V2l6YXJkTXNnLkFQUExZX0NIQU5HRVNfVE9fUEVSU0lTVEVOQ0VfWE1MKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCQkJZmluYWwgSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSBqcGFQcm9qZWN0LmdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKLQkJCQlyZXNvdXJjZS5tb2RpZnkobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCVhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlID0gKFhtbFBlcnNpc3RlbmNlKSByZXNvdXJjZS5nZXRSb290T2JqZWN0KCk7Ci0JCQkJCQkJRUxpc3Q8WG1sUGVyc2lzdGVuY2VVbml0PiBwZXJzaXN0ZW5jZVVuaXRzID0geG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpOwotCQkJCQkJCVhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXRzLmdldCgwKTsvLyBNdWx0aXBseSBwZXJzaXN0ZW5jZSB1bml0IHN1cHBvcnQKLQkJCQkJCQkKLQkJCQkJCQlpZiAoIW1vZGVsLmlzTm9uRW50aXR5U3VwZXJjbGFzcygpKSB7Ci0JCQkJCQkJCVhtbEphdmFDbGFzc1JlZiBjbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCQkJCQkJCWNsYXNzUmVmLnNldEphdmFDbGFzcyhtb2RlbC5nZXRRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkpOwotCQkJCQkJCQlwZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZChjbGFzc1JlZik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGpvYjsKLQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIG5hbWUgb2YgbWFwcGluZyBYTUwgZnJvbSB0aGUgY2xhc3Mgd2l6YXJkIHBhZ2UuIEl0IGlzIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgc291cmNlIGZvbGRlcgotCSAqIGFuZCBpbmNsdWRlcyBNRVRBLUlORiBmb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWFwcGluZyBYTUwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRMYXN0U2VnbWVudChTdHJpbmcgaW5wdXQpIHsKLQkJU3RyaW5nIG91dHB1dCA9IGlucHV0OwotCQlpZiAoaW5wdXQuaW5kZXhPZihTRVBBUkFUT1IpICE9IC0xKSB7Ci0JCQlvdXRwdXQgPSBpbnB1dC5zdWJzdHJpbmcoaW5wdXQubGFzdEluZGV4T2YoU0VQQVJBVE9SKSArIDEpOwotCQl9Ci0JCXJldHVybiBvdXRwdXQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQXNzb2NpYXRpb25GaWd1cmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0Fzc29jaWF0aW9uRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNTE4ZGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQXNzb2NpYXRpb25GaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ2hvcGJveEFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25FbmRwb2ludExvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWdvbkRlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5Bc3NvY2lhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLQotCi1jbGFzcyBBc3NvY2lhdGlvbkZpZ3VyZSBleHRlbmRzIEJ1dHRvbiB7Ci0JCi0JQ29sb3IgZW5hYmxlZENvbG9yID0gbmV3IENvbG9yKCBudWxsLCAxNCw2NiwxMTUpOwotCUNvbG9yIGRpc2FibGVkTGluZUNvbG9yID0gbmV3IENvbG9yKCBudWxsLCAxOTIsMjE1LDIzMSk7Ci0JQ29sb3Igc2VsZWN0ZWRDb2xvciA9IG5ldyBDb2xvciggbnVsbCwgMjMyLDIzMiwyMzIgKTsKLQotCUNvbG9yIHNlbGVjdGVkQm9yZGVyQ29sb3IgPSBuZXcgQ29sb3IoIG51bGwsIDE0LDY2LDExNSApOwotCUxpbmVCb3JkZXIgc2VsZWN0ZWRCb3JkZXIgPSBuZXcgTGluZUJvcmRlciggc2VsZWN0ZWRCb3JkZXJDb2xvciwgMiApOwotCUxpbmVCb3JkZXIgdW5zZWxlY3RlZEJvcmRlciA9IG5ldyBMaW5lQm9yZGVyKCBDb2xvckNvbnN0YW50cy5saWdodEdyYXksIDEgKTsKLQlGb250IGRlc2NyaXB0aW9uRm9udCA9IG5ldyBGb250KG51bGwsICJBcmlhbCIsIDgsIFNXVC5OT05FKTsKLQkKLQkvKioKLQkgKiBUaGUgbW9kZWwgYmVoaW5kIHRoZSB0aGUgdmlldyBvYmplY3QKLQkgKi8KLQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbjsKLQlUYWJsZUZpZ3VyZSB0YWJsZUZpZzE7Ci0JVGFibGVGaWd1cmUgdGFibGVGaWcyOwotCVBvbHlsaW5lQ29ubmVjdGlvbiBjb25uZWN0aW9uIDsKLQkKLQlQb2x5Z29uRGVjb3JhdGlvbiByZWZlcnJlckRlY29yYXRpb24gOwkKLQlQb2x5Z29uRGVjb3JhdGlvbiByZWZlcmVuY2VkRGVjb3JhdGlvbiA7Ci0KLQlMYWJlbCByZWZlcmVuY2VkTGFiZWwgOwotCUxhYmVsIHJlZmVycmVyTGFiZWwgOwotCUxhYmVsIGRlc2NyaXB0aW9uTGFiZWwgOwotCQotCUFzc29jaWF0aW9uRmlndXJlKEFzc29jaWF0aW9uIGFzc29jaWF0aW9uLCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXRoaXMuYXNzb2NpYXRpb24gPSBhc3NvY2lhdGlvbjsKLQkJCi0JCVhZTGF5b3V0IGNvbnRlbnRzTGF5b3V0ID0gbmV3IFhZTGF5b3V0KCk7Ci0JCXNldExheW91dE1hbmFnZXIoY29udGVudHNMYXlvdXQpOwotCQlzZXRCb3JkZXIoIHVuc2VsZWN0ZWRCb3JkZXIgKTsKLQotCQkvL0NyZWF0ZSB0aGUgZmlndXJlcyBmb3IgcmVmZXJyZXIgdGFibGUgYW5kIHJlZmVyZW5jZWQgdGFibGUKLQkJdGFibGVGaWcxID0gbmV3IFRhYmxlRmlndXJlKCBhc3NvY2lhdGlvbi5nZXRSZWZlcnJlclRhYmxlKCkuZ2V0TmFtZSgpLCByZXNvdXJjZU1hbmFnZXIpOyAKLQkJdGFibGVGaWcyID0gbmV3IFRhYmxlRmlndXJlKCBhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXROYW1lKCksIHJlc291cmNlTWFuYWdlcik7IAotCQkKLQkJY29udGVudHNMYXlvdXQuc2V0Q29uc3RyYWludCh0YWJsZUZpZzEsIG5ldyBSZWN0YW5nbGUoMTAsMTAsMTUwLDIwKSk7Ci0JCWNvbnRlbnRzTGF5b3V0LnNldENvbnN0cmFpbnQodGFibGVGaWcyLCBuZXcgUmVjdGFuZ2xlKDI4MCwgMTAsIDE1MCwgMjApKTsKLQotCQljb25uZWN0aW9uID0gZHJhd0Nvbm5lY3Rpb24odGFibGVGaWcxLCB0YWJsZUZpZzIpOwotCi0JCWFkZCh0YWJsZUZpZzEpOwotCQlhZGQodGFibGVGaWcyKTsKLQkJYWRkKGNvbm5lY3Rpb24pOwotCQkKLQotCQlkZXNjcmlwdGlvbkxhYmVsID0gbmV3IExhYmVsKCIiKTsKLQkJY29udGVudHNMYXlvdXQuc2V0Q29uc3RyYWludChkZXNjcmlwdGlvbkxhYmVsLCBuZXcgUmVjdGFuZ2xlKDEwLDMwLC0xLC0xKSk7Ci0JCWRlc2NyaXB0aW9uTGFiZWwuc2V0Rm9udCggZGVzY3JpcHRpb25Gb250ICk7IAotCQlhZGQoZGVzY3JpcHRpb25MYWJlbCk7Ci0KLQkJLy9zZXQgd2hpdGUgYmFja2dyb3VuZAotCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCQotCQl1cGRhdGUoKTsKLQkJCi0JfQotCi0JcHJpdmF0ZSBQb2x5bGluZUNvbm5lY3Rpb24gZHJhd0Nvbm5lY3Rpb24oVGFibGVGaWd1cmUgdGFibGVGaWcxLAotCQkJVGFibGVGaWd1cmUgdGFibGVGaWcyKSB7Ci0JCS8qIENyZWF0aW5nIHRoZSBjb25uZWN0aW9uICovCi0JCVBvbHlsaW5lQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbmV3IFBvbHlsaW5lQ29ubmVjdGlvbigpOwotCQlDaG9wYm94QW5jaG9yIHNvdXJjZUFuY2hvciA9IG5ldyBDaG9wYm94QW5jaG9yKHRhYmxlRmlnMSk7Ci0JCUNob3Bib3hBbmNob3IgdGFyZ2V0QW5jaG9yID0gbmV3IENob3Bib3hBbmNob3IodGFibGVGaWcyKTsKLQkJY29ubmVjdGlvbi5zZXRTb3VyY2VBbmNob3Ioc291cmNlQW5jaG9yKTsKLQkJY29ubmVjdGlvbi5zZXRUYXJnZXRBbmNob3IodGFyZ2V0QW5jaG9yKTsKLQkJCi0JCS8qIENyZWF0aW5nIHRoZSBkZWNvcmF0aW9uICovCi0JCXJlZmVycmVyRGVjb3JhdGlvbiA9IG5ldyBTbW9vdGhQb2x5Z29uRGVjb3JhdGlvbigpOwotCQljb25uZWN0aW9uLnNldFNvdXJjZURlY29yYXRpb24ocmVmZXJyZXJEZWNvcmF0aW9uKTsKLQotCQlyZWZlcmVuY2VkRGVjb3JhdGlvbiA9IG5ldyBTbW9vdGhQb2x5Z29uRGVjb3JhdGlvbigpOwotCQljb25uZWN0aW9uLnNldFRhcmdldERlY29yYXRpb24ocmVmZXJlbmNlZERlY29yYXRpb24pOwotCQkKLQkJCi0JCS8qIEFkZGluZyBsYWJlbHMgdG8gdGhlIGNvbm5lY3Rpb24gKi8KLQkJQ29ubmVjdGlvbkVuZHBvaW50TG9jYXRvciBzb3VyY2VFbmRwb2ludExvY2F0b3IgPSAKLQkJCW5ldyBDb25uZWN0aW9uRW5kcG9pbnRMb2NhdG9yKGNvbm5lY3Rpb24sIGZhbHNlKTsKLQkJc291cmNlRW5kcG9pbnRMb2NhdG9yLnNldFZEaXN0YW5jZSgtNSk7Ci0JCXJlZmVycmVyTGFiZWwgPSBuZXcgTGFiZWwoIiIpOwotCQljb25uZWN0aW9uLmFkZChyZWZlcnJlckxhYmVsLCBzb3VyY2VFbmRwb2ludExvY2F0b3IpOwotCi0JCUNvbm5lY3Rpb25FbmRwb2ludExvY2F0b3IgdGFyZ2V0RW5kcG9pbnRMb2NhdG9yID0gCi0JCSAgICAgICAgbmV3IENvbm5lY3Rpb25FbmRwb2ludExvY2F0b3IoY29ubmVjdGlvbiwgdHJ1ZSk7Ci0JCXRhcmdldEVuZHBvaW50TG9jYXRvci5zZXRWRGlzdGFuY2UoLTUpOwotCQlyZWZlcmVuY2VkTGFiZWwgPSBuZXcgTGFiZWwoIiIpOwotCQljb25uZWN0aW9uLmFkZChyZWZlcmVuY2VkTGFiZWwsIHRhcmdldEVuZHBvaW50TG9jYXRvcik7Ci0KLQkJQ29ubmVjdGlvbkVuZHBvaW50TG9jYXRvciByZWxhdGlvbnNoaXBMb2NhdG9yID0gCi0JCQluZXcgQ29ubmVjdGlvbkVuZHBvaW50TG9jYXRvcihjb25uZWN0aW9uLHRydWUpOwotCQlyZWxhdGlvbnNoaXBMb2NhdG9yLnNldFVEaXN0YW5jZSgxMCk7Ci0JCXJlbGF0aW9uc2hpcExvY2F0b3Iuc2V0VkRpc3RhbmNlKC0yMCk7Ci0JCUxhYmVsIHJlbGF0aW9uc2hpcExhYmVsID0gbmV3IExhYmVsKCJjb250YWlucyIpOwotCQljb25uZWN0aW9uLmFkZChyZWxhdGlvbnNoaXBMYWJlbCxyZWxhdGlvbnNoaXBMb2NhdG9yKTsKLQkJcmV0dXJuIGNvbm5lY3Rpb247Ci0JfQotCi0JcHVibGljIEFzc29jaWF0aW9uIGdldEFzc29jaWF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbjsKLQl9IAotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkICggYm9vbGVhbiBpc1NlbGVjdGVkICl7Ci0JCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKCBpc1NlbGVjdGVkID8gc2VsZWN0ZWRDb2xvciA6IENvbG9yQ29uc3RhbnRzLndoaXRlICk7Ci0JCXRoaXMuc2V0Qm9yZGVyKGlzU2VsZWN0ZWQ/IHNlbGVjdGVkQm9yZGVyIDogdW5zZWxlY3RlZEJvcmRlcik7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgdmlldyB3aXRoIHRoZSBjaGFuZ2VzIHVzZXIgbWFkZSBvbiB0aGUgbW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKXsKLQkJYm9vbGVhbiBpc0dlbmVyYXRlZCA9IGFzc29jaWF0aW9uLmlzR2VuZXJhdGVkKCk7Ci0JCQotCQljb25uZWN0aW9uLnNldEZvcmVncm91bmRDb2xvciggaXNHZW5lcmF0ZWQ/IGVuYWJsZWRDb2xvcjogZGlzYWJsZWRMaW5lQ29sb3IgKTsKLQkJCi0JCXRhYmxlRmlnMS5zZXRFbmFibGVkKGlzR2VuZXJhdGVkKTsKLQkJdGFibGVGaWcyLnNldEVuYWJsZWQoaXNHZW5lcmF0ZWQpOwotCQlkZXNjcmlwdGlvbkxhYmVsLnNldEZvcmVncm91bmRDb2xvcihpc0dlbmVyYXRlZD8gZW5hYmxlZENvbG9yOiBkaXNhYmxlZExpbmVDb2xvcik7Ci0KLQkJLy9wYWludERpcmVjdGlvbmFsaXR5QW5kQ2FyZGluYWxpdHkgCi0JCVN0cmluZyBjYXJkaW5hbGl0eVN0cjsKLQkJU3RyaW5nIGRpcmVjdGlvbmFsaXR5ID0gYXNzb2NpYXRpb24uZ2V0RGlyZWN0aW9uYWxpdHkoKTsKLQkJU3RyaW5nIGNhcmRpbmFsaXR5ID0gYXNzb2NpYXRpb24uZ2V0Q2FyZGluYWxpdHkoKTsKLQkJLy9EcmF3IHJlZmVycmVyUm9sZQotCQlpZiAoY2FyZGluYWxpdHkuZXF1YWxzKEFzc29jaWF0aW9uLk1BTllfVE9fT05FKSB8fCBjYXJkaW5hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uTUFOWV9UT19NQU5ZKSkgewotCQkJY2FyZGluYWxpdHlTdHIgPSAiKiI7Ci0JCX0gZWxzZSB7Ci0JCQljYXJkaW5hbGl0eVN0ciA9ICIxIjsKLQkJfQotCQlpZiAoZGlyZWN0aW9uYWxpdHkuZXF1YWxzKEFzc29jaWF0aW9uLkJJX0RJKSB8fCBkaXJlY3Rpb25hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uT1BQT1NJVEVfREkpKSB7Ci0JCQljb25uZWN0aW9uLnNldFNvdXJjZURlY29yYXRpb24odGhpcy5yZWZlcnJlckRlY29yYXRpb24pOwotCQl9ZWxzZXsKLQkJCWNvbm5lY3Rpb24uc2V0U291cmNlRGVjb3JhdGlvbihudWxsKTsKLQkJfQotCQkKLQkJdGhpcy5yZWZlcnJlckxhYmVsLnNldFRleHQoIGNhcmRpbmFsaXR5U3RyICk7Ci0JCQkKLQkJLy9EcmF3IHJlZmVyZW5jZWRSb2xlCi0JCWlmIChjYXJkaW5hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uTUFOWV9UT19PTkUpIHx8IGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5PTkVfVE9fT05FKSkgewotCQkJY2FyZGluYWxpdHlTdHIgPSAiMSI7Ci0JCX0gZWxzZSB7Ci0JCQljYXJkaW5hbGl0eVN0ciA9ICIqIjsKLQkJfQotCQlpZiAoZGlyZWN0aW9uYWxpdHkuZXF1YWxzKEFzc29jaWF0aW9uLkJJX0RJKSB8fCBkaXJlY3Rpb25hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uTk9STUFMX0RJKSkgewotCQkJY29ubmVjdGlvbi5zZXRUYXJnZXREZWNvcmF0aW9uKHRoaXMucmVmZXJlbmNlZERlY29yYXRpb24pOwotCQl9ZWxzZXsKLQkJCWNvbm5lY3Rpb24uc2V0VGFyZ2V0RGVjb3JhdGlvbihudWxsKTsKLQkJfQotCQl0aGlzLnJlZmVyZW5jZWRMYWJlbC5zZXRUZXh0KGNhcmRpbmFsaXR5U3RyKTsKLQkJCi0JCVN0cmluZyB0ZXh0ID0gIiI7Ci0JCVN0cmluZyByZWZlcnJlclRhYmxlTmFtZSA9IGFzc29jaWF0aW9uLmdldFJlZmVycmVyVGFibGVOYW1lKCk7Ci0JCVN0cmluZyByZWZlcmVuY2VkVGFibGUgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCk7Ci0JCWlmKCBjYXJkaW5hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uTUFOWV9UT19PTkUgKSApewotCQkJdGV4dCA9IFN0cmluZy5mb3JtYXQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMubWFueVRvT25lRGVzYywgcmVmZXJlbmNlZFRhYmxlICwgcmVmZXJyZXJUYWJsZU5hbWUgKTsgCi0JCX1lbHNlIGlmKCBjYXJkaW5hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uT05FX1RPX09ORSApICl7Ci0JCQl0ZXh0ID0gU3RyaW5nLmZvcm1hdCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5vbmVUb09uZURlc2MsIHJlZmVycmVyVGFibGVOYW1lLCByZWZlcmVuY2VkVGFibGUgKTsKLQkJfWVsc2UgaWYoIGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5NQU5ZX1RPX01BTlkpICl7Ci0JCQl0ZXh0ID0gU3RyaW5nLmZvcm1hdCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5tYW55VG9NYW55RGVzYywgcmVmZXJyZXJUYWJsZU5hbWUsIHJlZmVyZW5jZWRUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCByZWZlcnJlclRhYmxlTmFtZSApOwkJCQotCQl9Ci0JCQotCQlpZiggYXNzb2NpYXRpb24uaXNDdXN0b20oKSApewotCQkJY29ubmVjdGlvbi5zZXRMaW5lU3R5bGUoIFNXVC5MSU5FX0RPVCk7Ci0JCX0KLQkJCi0JCXRoaXMuZGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KHRleHQpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmRlc2NyaXB0aW9uRm9udC5kaXNwb3NlKCk7Ci0JCXRoaXMuc2VsZWN0ZWRCb3JkZXJDb2xvci5kaXNwb3NlKCk7Ci0JCXRoaXMuc2VsZWN0ZWRDb2xvci5kaXNwb3NlKCk7Ci0JCXRoaXMuZGlzYWJsZWRMaW5lQ29sb3IuZGlzcG9zZSgpOwotCQl0aGlzLmVuYWJsZWRDb2xvci5kaXNwb3NlKCk7Ci0JCXRoaXMudGFibGVGaWcxLmRpc3Bvc2UoKTsKLQkJdGhpcy50YWJsZUZpZzIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBTbW9vdGhQb2x5Z29uRGVjb3JhdGlvbiBleHRlbmRzIFBvbHlnb25EZWNvcmF0aW9uCi0JewotCQlwdWJsaWMgU21vb3RoUG9seWdvbkRlY29yYXRpb24oKQotCQl7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpCi0JCXsKLQkJCWludCBzYXZlZEFudGlhbGlhcyA9IGdyYXBoaWNzLmdldEFudGlhbGlhcygpOwotCQkJZ3JhcGhpY3Muc2V0QW50aWFsaWFzKFNXVC5PTik7Ci0JCQlzdXBlci5wYWludEZpZ3VyZShncmFwaGljcyk7Ci0JCQlncmFwaGljcy5zZXRBbnRpYWxpYXMoc2F2ZWRBbnRpYWxpYXMpOwotCQl9Ci0JfQotfSAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0Fzc29jaWF0aW9uVGFibGVzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQXNzb2NpYXRpb25UYWJsZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYWY2YWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQXNzb2NpYXRpb25UYWJsZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uU1dUVXRpbC5jcmVhdGVCdXR0b247Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbi5TV1RVdGlsLmNyZWF0ZUxhYmVsOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uU1dUVXRpbC5jcmVhdGVUZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuQXNzb2NpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5PUk1HZW5DdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JbWFnZVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLQotcHVibGljIGNsYXNzIEFzc29jaWF0aW9uVGFibGVzUGFnZSBleHRlbmRzIE5ld0Fzc29jaWF0aW9uV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBzaW1wbGVBc3NvQnRuOwotCXByaXZhdGUgQnV0dG9uIG10bUFzc29CdG47IAotCXByaXZhdGUgVGV4dCB0YWJsZTFUZXh0RmllbGQgOwotCXByaXZhdGUgVGV4dCB0YWJsZTJUZXh0RmllbGQgOwotCXByaXZhdGUgVGV4dCBqb2luVGFibGVUZXh0RmllbGQ7IAotCXByaXZhdGUgQnV0dG9uIGpvaW5UYWJsZUJyb3dzZTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcjsKLQkKLQlwdWJsaWMgQXNzb2NpYXRpb25UYWJsZXNQYWdlKE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlzdXBlcihjdXN0b21pemVyLCAgIkFzc29jaWF0aW9uVGFibGVzUGFnZSIpOwotCQl0aGlzLnJlc291cmNlTWFuYWdlciA9IHJlc291cmNlTWFuYWdlcjsKLQkJc2V0VGl0bGUoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfZGVzYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wb3NpdGUpOwotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgxLCB0cnVlKSk7Ci0JCQotCQlHcm91cCBhc3NvY0tpbmRHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJaW50IG5Db2x1bW5zPSAzIDsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG5Db2x1bW5zOwotCQlhc3NvY0tpbmRHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJYXNzb2NLaW5kR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRoaXMuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5HRU5FUkFURV9FTlRJVElFU19XSVpBUkRfQVNTT0NJQVRJT05fVEFCTEVTKTsKLQkJYXNzb2NLaW5kR3JvdXAuc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfYXNzb2NLaW5kKTsKLQotCQlzaW1wbGVBc3NvQnRuID0gY3JlYXRlQnV0dG9uKGFzc29jS2luZEdyb3VwLCAzLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9zaW1wbGVBc3NvYywgU1dULlJBRElPKTsKLQkJbXRtQXNzb0J0biA9IGNyZWF0ZUJ1dHRvbihhc3NvY0tpbmRHcm91cCwgMywgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfbTJtQXNzb2MsIFNXVC5SQURJTyk7Ci0KLQkJCi0JCUdyb3VwIGFzc29jVGFibGVzR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCW5Db2x1bW5zPSAzIDsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBuQ29sdW1uczsKLQkJYXNzb2NUYWJsZXNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJYXNzb2NUYWJsZXNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCQotCQlhc3NvY1RhYmxlc0dyb3VwLnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2Fzc29jVGFibGVzICk7Ci0JCQotCQljcmVhdGVMYWJlbChhc3NvY1RhYmxlc0dyb3VwLCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV90YWJsZTEpOwotCQl0YWJsZTFUZXh0RmllbGQgPSBjcmVhdGVUZXh0KGFzc29jVGFibGVzR3JvdXAsIDEpOwotCQkKLQkJQnV0dG9uIGJyb3dzZXIxID0gY3JlYXRlQnV0dG9uKGFzc29jVGFibGVzR3JvdXAsIDEsICIiLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIxLnNldEltYWdlKCBJbWFnZVJlcG9zaXRvcnkuZ2V0QnJvd3NlQnV0dG9uSW1hZ2UodGhpcy5yZXNvdXJjZU1hbmFnZXIpKTsgCi0KLQkJYnJvd3NlcjEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTZWxlY3RUYWJsZURpYWxvZyBkbGcgPSBuZXcgU2VsZWN0VGFibGVEaWFsb2coRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgcmVzb3VyY2VNYW5hZ2VyLCBjdXN0b21pemVyLmdldFRhYmxlTmFtZXMoKSk7Ci0JCQkJaWYoIGRsZy5vcGVuKCkgPT1EaWFsb2cuT0sgKXsKLQkJCQkJdGFibGUxVGV4dEZpZWxkLnNldFRleHQoIGRsZy5nZXRTZWxlY3RlZFRhYmxlKCkgKTsKLQkJCQkJZ2V0V2l6YXJkRGF0YU1vZGVsKCkucHV0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9SRUZFUlJFUl9UQUJMRSwgdGFibGUxVGV4dEZpZWxkLmdldFRleHQoKSk7Ci0JCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQkJKChOZXdBc3NvY2lhdGlvbldpemFyZClnZXRXaXphcmQoKSkudXBkYXRlVGFibGVOYW1lcygpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3JlYXRlTGFiZWwoYXNzb2NUYWJsZXNHcm91cCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfdGFibGUyKTsKLQkJdGFibGUyVGV4dEZpZWxkID0gY3JlYXRlVGV4dChhc3NvY1RhYmxlc0dyb3VwLCAxKTsKLQkJCi0JCUJ1dHRvbiBicm93c2VyMiA9IGNyZWF0ZUJ1dHRvbihhc3NvY1RhYmxlc0dyb3VwLCAxLCAiIiwgU1dULk5PTkUpOwotCQlicm93c2VyMi5zZXRJbWFnZSggSW1hZ2VSZXBvc2l0b3J5LmdldEJyb3dzZUJ1dHRvbkltYWdlKHRoaXMucmVzb3VyY2VNYW5hZ2VyKSk7IAotCi0JCWJyb3dzZXIyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU2VsZWN0VGFibGVEaWFsb2cgZGxnID0gbmV3IFNlbGVjdFRhYmxlRGlhbG9nKCBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCByZXNvdXJjZU1hbmFnZXIsIGN1c3RvbWl6ZXIuZ2V0U2NoZW1hKCkgKTsKLQkJCQlpZiggZGxnLm9wZW4oKSA9PSBEaWFsb2cuT0spewotCQkJCQl0YWJsZTJUZXh0RmllbGQuc2V0VGV4dCggZGxnLmdldFNlbGVjdGVkVGFibGUoKSApOwotCQkJCQlnZXRXaXphcmREYXRhTW9kZWwoKS5wdXQoIE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX1JFRkVSRU5DRURfVEFCTEUsIHRhYmxlMlRleHRGaWVsZC5nZXRUZXh0KCkpOwotCQkJCQkoKE5ld0Fzc29jaWF0aW9uV2l6YXJkKWdldFdpemFyZCgpKS51cGRhdGVUYWJsZU5hbWVzKCk7Ci0JCQkJfQotCQkJCXVwZGF0ZVBhZ2VDb21wbGV0ZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWNyZWF0ZUxhYmVsKGFzc29jVGFibGVzR3JvdXAsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2ludGVybWVkaWF0ZVRhYmxlICk7Ci0JCWpvaW5UYWJsZVRleHRGaWVsZCA9IGNyZWF0ZVRleHQoYXNzb2NUYWJsZXNHcm91cCwgMSk7Ci0JCWpvaW5UYWJsZVRleHRGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlqb2luVGFibGVCcm93c2UgPSBjcmVhdGVCdXR0b24oYXNzb2NUYWJsZXNHcm91cCwgMSwgIiIsIFNXVC5OT05FKTsKLQkJam9pblRhYmxlQnJvd3NlLnNldEltYWdlKCBJbWFnZVJlcG9zaXRvcnkuZ2V0QnJvd3NlQnV0dG9uSW1hZ2UodGhpcy5yZXNvdXJjZU1hbmFnZXIpKTsgCi0JCWpvaW5UYWJsZUJyb3dzZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWpvaW5UYWJsZUJyb3dzZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU2VsZWN0VGFibGVEaWFsb2cgZGxnID0gbmV3IFNlbGVjdFRhYmxlRGlhbG9nKCBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCByZXNvdXJjZU1hbmFnZXIsIGN1c3RvbWl6ZXIuZ2V0U2NoZW1hKCkgKTsKLQkJCQlpZiggZGxnLm9wZW4oKSA9PSBEaWFsb2cuT0spewotCQkJCQlqb2luVGFibGVUZXh0RmllbGQuc2V0VGV4dCggZGxnLmdldFNlbGVjdGVkVGFibGUoKSApOwotCQkJCQlnZXRXaXphcmREYXRhTW9kZWwoKS5wdXQoIE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fVEFCTEUsIGpvaW5UYWJsZVRleHRGaWVsZC5nZXRUZXh0KCkgKTsKLQkJCQkJKChOZXdBc3NvY2lhdGlvbldpemFyZClnZXRXaXphcmQoKSkudXBkYXRlVGFibGVOYW1lcygpOwotCQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQkJfQotCQkJCXVwZGF0ZVBhZ2VDb21wbGV0ZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXNldENvbnRyb2wocGFyZW50KTsKLQotCQlzaW1wbGVBc3NvQnRuLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJam9pblRhYmxlVGV4dEZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWpvaW5UYWJsZVRleHRGaWVsZC5jbGVhclNlbGVjdGlvbigpOwotCQkJCWpvaW5UYWJsZVRleHRGaWVsZC5zZXRUZXh0KCIiKTsKLQkJCQlqb2luVGFibGVCcm93c2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJZ2V0V2l6YXJkRGF0YU1vZGVsKCkucHV0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9DQURJTkFMSVRZLCBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORSk7Ci0JCQkJZ2V0V2l6YXJkRGF0YU1vZGVsKCkucmVtb3ZlKCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX1RBQkxFICk7Ci0JCQkJKChOZXdBc3NvY2lhdGlvbldpemFyZClnZXRXaXphcmQoKSkudXBkYXRlVGFibGVOYW1lcygpOwotCQkJCXVwZGF0ZVBhZ2VDb21wbGV0ZSgpOwotCQkJfQotCQkJCi0JCX0pOwotCi0JCW10bUFzc29CdG4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlqb2luVGFibGVUZXh0RmllbGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlqb2luVGFibGVCcm93c2Uuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlnZXRXaXphcmREYXRhTW9kZWwoKS5wdXQoIE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0NBRElOQUxJVFksIEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWSk7Ci0JCQkJKChOZXdBc3NvY2lhdGlvbldpemFyZClnZXRXaXphcmQoKSkudXBkYXRlVGFibGVOYW1lcygpOwotCQkJCXVwZGF0ZVBhZ2VDb21wbGV0ZSgpOwotCQkJfQotCQl9KTsJCQotCQkKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoIGZhbHNlKTsKLQkJdGFibGUxVGV4dEZpZWxkLnNldEZvY3VzKCk7IAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQlyZXR1cm4gaXNQYWdlQ29tcGxldGUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlUGFnZUNvbXBsZXRlKCkgewotCQlpZiggdGhpcy50YWJsZTFUZXh0RmllbGQuZ2V0VGV4dCgpLmxlbmd0aCgpIDw9IDApewotCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiggbXRtQXNzb0J0bi5nZXRTZWxlY3Rpb24oKSApewotCQkJaWYoIHRoaXMuam9pblRhYmxlVGV4dEZpZWxkLmdldFRleHQoKS5sZW5ndGgoKSA8PSAwICl7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0Fzc29jaWF0aW9uc0xpc3RDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0Fzc29jaWF0aW9uc0xpc3RDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2MmJmMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Bc3NvY2lhdGlvbnNMaXN0Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuQXNzb2NpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEEgRHJhdzJkIGZpZ3VyZSByZXByZXNlbnRpbmcgbGlzdCBvZiBhc3NvY2lhdGlvbnMgYmV0d2VlbiB0d28gZGF0YWJhc2UgdGFibGVzCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25zTGlzdENvbXBvc2l0ZSBleHRlbmRzIEZpZ3VyZUNhbnZhcyB7Ci0KLQlMaXN0PEFzc29jaWF0aW9uPiBhc3NvY2lhdGlvbnM7ICAKLQlBc3NvY2lhdGlvblRvZ2dsZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDsKLQlUYWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UgdGFibGVBc3NvY2lhdGlvbnNXaXphcmRQYWdlOyAvL3RoZSBwYXJlbnQgd2l6YXJkIHBhZ2UKLQlBc3NvY2lhdGlvbkZpZ3VyZSBzZWxlY3RlZEFzc29jaWF0aW9uRmlndXJlIDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcjsKLQkKLQlwdWJsaWMgQXNzb2NpYXRpb25zTGlzdENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBUYWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UgdGFibGVBc3NvY2lhdGlvbnNXaXphcmRQYWdlLCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKXsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy50YWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UgPSB0YWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2U7Ci0JCXRoaXMucmVzb3VyY2VNYW5hZ2VyID0gcmVzb3VyY2VNYW5hZ2VyOwotCQkKLQkJc2V0Qm91bmRzKDEwLCAxMCAsIDUwMCwgMjAwKTsKLQkJQ29sb3IgYmFja2dyb3VuZENvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCAyNTUsMjU1LDI1NSk7Ci0JCXNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQkJYmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCi0JCUZpZ3VyZSBmaWd1cmUgPSBuZXcgRmlndXJlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KCkpOwotCQlmaWd1cmUuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKDEpKTsKLQkJdGhpcy5saXN0ZW5lciA9IG5ldyBBc3NvY2lhdGlvblRvZ2dsZVNlbGVjdGlvbkxpc3RlbmVyKCk7IAotCQkKLQkJdGhpcy5zZXRDb250ZW50cyhmaWd1cmUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUFzc29jaWF0aW9ucyhMaXN0PEFzc29jaWF0aW9uPiBhc3NvY2lhdGlvbnMpewotCQlGaWd1cmUgZmlndXJlID0gKEZpZ3VyZSl0aGlzLmdldENvbnRlbnRzKCk7Ci0JCXRoaXMuZGlzcG9zZUZpZ3VyZShmaWd1cmUpOwotCQkKLQkJdGhpcy5hc3NvY2lhdGlvbnMgPSBhc3NvY2lhdGlvbnM7Ci0JCWlmKCBhc3NvY2lhdGlvbnMgIT0gbnVsbCApewotCQkJZm9yKCBpbnQgaSA9IDA7IGkgPGFzc29jaWF0aW9ucy5zaXplKCk7IGkgKysgKXsKLQkJCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA9IGFzc29jaWF0aW9ucy5nZXQoaSk7Ci0JCQkJQXNzb2NpYXRpb25GaWd1cmUgYXNzb2NGaWd1cmUgPSBuZXcgQXNzb2NpYXRpb25GaWd1cmUoYXNzb2NpYXRpb24sIHRoaXMucmVzb3VyY2VNYW5hZ2VyKTsKLQkJCQlhc3NvY0ZpZ3VyZS5hZGRBY3Rpb25MaXN0ZW5lciggbGlzdGVuZXIgKTsKLQkJCQlmaWd1cmUuYWRkKGFzc29jRmlndXJlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgQXNzb2NpYXRpb24gZ2V0U2VsZWN0ZWRBc3NvY2lhdGlvbigpewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZEFzc29jaWF0aW9uRmlndXJlLmdldEFzc29jaWF0aW9uKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgdXBkYXRlU2VsZWN0ZWRBc3NvY2lhdGlvbigpewotCQlGaWd1cmUgZmlndXJlID0gKEZpZ3VyZSl0aGlzLmdldENvbnRlbnRzKCk7Ci0JCUxpc3Q8QXNzb2NpYXRpb25GaWd1cmU+IGFzc29jaWF0aW9uRmlndXJlcyA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotCQlmb3IoQXNzb2NpYXRpb25GaWd1cmUgYXNzb2NGaWcgOiBhc3NvY2lhdGlvbkZpZ3VyZXMpewotCQkJaWYoIGFzc29jRmlnID09IHRoaXMuc2VsZWN0ZWRBc3NvY2lhdGlvbkZpZ3VyZSl7Ci0JCQkJYXNzb2NGaWcudXBkYXRlKCk7IAotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgYXNzb2NpYXRpb24ganVzdCBiZWZvcmUgdGhlIHNlbGVjdGVkIG9uZSBpbiBVSQotCSAqIEByZXR1cm4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQXNzb2NpYXRpb24gZ2V0UHJldmlvdXNBc3NvY2lhdGlvbigpewotCQlGaWd1cmUgZmlndXJlID0gKEZpZ3VyZSl0aGlzLmdldENvbnRlbnRzKCk7Ci0JCUxpc3Q8QXNzb2NpYXRpb25GaWd1cmU+IGFzc29jaWF0aW9uRmlndXJlcyA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotCQlBc3NvY2lhdGlvbkZpZ3VyZSByZXQgPSBudWxsOwotCQlmb3IoQXNzb2NpYXRpb25GaWd1cmUgYXNzb2NGaWcgOiBhc3NvY2lhdGlvbkZpZ3VyZXMpewotCQkJaWYoIGFzc29jRmlnLmlzU2VsZWN0ZWQoKSApewotCQkJCWJyZWFrOyAKLQkJCX0KLQkJCXJldCA9IGFzc29jRmlnOwotCQl9Ci0JCXJldHVybiByZXQ9PW51bGw/bnVsbDpyZXQuZ2V0QXNzb2NpYXRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5kaXNwb3NlRmlndXJlKChGaWd1cmUpIGdldENvbnRlbnRzKCkpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUZpZ3VyZShGaWd1cmUgZmlndXJlKSB7Ci0JCWZvciAoQXNzb2NpYXRpb25GaWd1cmUgYXNzb2NpYXRpb25GaWd1cmUgOiAoTGlzdDxBc3NvY2lhdGlvbkZpZ3VyZT4pIGZpZ3VyZS5nZXRDaGlsZHJlbigpKSB7Ci0JCQlhc3NvY2lhdGlvbkZpZ3VyZS5yZW1vdmVBY3Rpb25MaXN0ZW5lcih0aGlzLmxpc3RlbmVyKTsKLQkJCWFzc29jaWF0aW9uRmlndXJlLmRpc3Bvc2UoKTsKLQkJfQotCQlmaWd1cmUucmVtb3ZlQWxsKCk7Ci0JCXRoaXMuc2VsZWN0ZWRBc3NvY2lhdGlvbkZpZ3VyZSA9IG51bGw7Ci0JfQotCi0JY2xhc3MgQXNzb2NpYXRpb25Ub2dnbGVTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlBc3NvY2lhdGlvbkZpZ3VyZSBmaWd1cmUgPSAoQXNzb2NpYXRpb25GaWd1cmUgKWV2ZW50LmdldFNvdXJjZSgpIDsKLQkJCWZpZ3VyZS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gZmlndXJlLmdldEFzc29jaWF0aW9uKCk7Ci0JCQl0YWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UudXBkYXRlQXNzb2NpYXRpb25FZGl0UGFuZWwoYXNzb2NpYXRpb24pOwotCQkJLy91bi1zZWxlY3QgdGhlIHByZXZpb3VzIHNlbGVjdGVkCi0JCQlpZiggc2VsZWN0ZWRBc3NvY2lhdGlvbkZpZ3VyZSAhPSBudWxsICAmJiBzZWxlY3RlZEFzc29jaWF0aW9uRmlndXJlIT0gZmlndXJlICl7Ci0JCQkJc2VsZWN0ZWRBc3NvY2lhdGlvbkZpZ3VyZS5zZXRTZWxlY3RlZCggZmFsc2UgKTsKLQkJCX0KLQkJCS8vSGlnaGxpZ2h0IG5ldyBzZWxlY3Rpb24KLQkJCXNlbGVjdGVkQXNzb2NpYXRpb25GaWd1cmUgPSBmaWd1cmU7Ci0JCQlzZWxlY3RlZEFzc29jaWF0aW9uRmlndXJlLnNldFNlbGVjdGVkKCB0cnVlICk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9DYXJkaW5hbGl0eVBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0NhcmRpbmFsaXR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWM5YWFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0NhcmRpbmFsaXR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLkFzc29jaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuT1JNR2VuQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotCi1wdWJsaWMgY2xhc3MgQ2FyZGluYWxpdHlQYWdlIGV4dGVuZHMgTmV3QXNzb2NpYXRpb25XaXphcmRQYWdlIHsKLQotCXByaXZhdGUgTGFiZWwgbXRvRGVzY0xhYmVsOwotCXByaXZhdGUgTGFiZWwgb3RtRGVzY0xhYmVsOwotCXByaXZhdGUgTGFiZWwgb3RvRGVzY0xhYmVsOwotCXByaXZhdGUgTGFiZWwgbXRtRGVzY0xhYmVsOwotCQotCXByaXZhdGUgQnV0dG9uW10gY2FyZGluYWxpdHlCdXR0b25zID0gbmV3IEJ1dHRvbls0XTsKLQkKLQlwcm90ZWN0ZWQgQ2FyZGluYWxpdHlQYWdlKE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplcikgewotCQlzdXBlciggY3VzdG9taXplciAsICJDYXJkaW5hbGl0eVBhZ2UiICk7Ci0JCXNldFRpdGxlKEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jYXJkaW5hbGl0eVBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbiggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX2NhcmRpbmFsaXR5UGFnZV9kZXNjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJaW50IG5Db2x1bW5zPSAxIDsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG5Db2x1bW5zOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRoaXMuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5HRU5FUkFURV9FTlRJVElFU19XSVpBUkRfQVNTT0NJQVRJT05fQ0FSRElOQUxJVFkpOwotCi0JCUNhcmRpbmFsaXR5U2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgQ2FyZGluYWxpdHlTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQljYXJkaW5hbGl0eUJ1dHRvbnNbMF0gPSBjcmVhdGVSYWRpb0J1dHRvbiggY29tcG9zaXRlLCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm1hbnlUb09uZSk7Ci0JCWNhcmRpbmFsaXR5QnV0dG9uc1swXS5hZGRTZWxlY3Rpb25MaXN0ZW5lciggc2VsZWN0aW9uTGlzdGVuZXIgKTsKLQkJLy9EZWZhdWx0IGNhcmRpbmFsaXR5IGlzIE1UTwotCQljYXJkaW5hbGl0eUJ1dHRvbnNbMF0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlnZXRXaXphcmREYXRhTW9kZWwoKS5wdXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fQ0FESU5BTElUWSwgQXNzb2NpYXRpb24uTUFOWV9UT19PTkUpOwkJCi0KLQkJbXRvRGVzY0xhYmVsID0gY3JlYXRlTGFiZWwoY29tcG9zaXRlLDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMubWFueVRvT25lRGVzYyk7Ci0JCQotCQljYXJkaW5hbGl0eUJ1dHRvbnNbMV0gPSBjcmVhdGVSYWRpb0J1dHRvbiggY29tcG9zaXRlLCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm9uZVRvTWFueSk7Ci0JCWNhcmRpbmFsaXR5QnV0dG9uc1sxXS5hZGRTZWxlY3Rpb25MaXN0ZW5lciggc2VsZWN0aW9uTGlzdGVuZXIgKTsKLQkJCi0JCW90bURlc2NMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm1hbnlUb09uZURlc2MpOwotCi0JCWNhcmRpbmFsaXR5QnV0dG9uc1syXSA9IGNyZWF0ZVJhZGlvQnV0dG9uKCBjb21wb3NpdGUsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMub25lVG9PbmUpOwotCQljYXJkaW5hbGl0eUJ1dHRvbnNbMl0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIHNlbGVjdGlvbkxpc3RlbmVyICk7Ci0KLQkJb3RvRGVzY0xhYmVsID0gY3JlYXRlTGFiZWwoY29tcG9zaXRlLDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMub25lVG9PbmVEZXNjKTsKLQotCQljYXJkaW5hbGl0eUJ1dHRvbnNbM10gPSBjcmVhdGVSYWRpb0J1dHRvbiggY29tcG9zaXRlLCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm1hbnlUb01hbnkpOwotCQltdG1EZXNjTGFiZWw9IGNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm1hbnlUb01hbnlEZXNjKTsKLQkJCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoIHRydWUgKTsKLQotCQljYXJkaW5hbGl0eUJ1dHRvbnNbMF0uc2V0Rm9jdXMoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZVdpdGhOZXdUYWJsZXMoKSB7Ci0JCVN0cmluZyBzMSA9IGdldFJlZmVycmVyVGFibGVOYW1lKCkgOwotCQlTdHJpbmcgczIgPSBnZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkgOwotCQlTdHJpbmcgam9pblRhYmxlTmFtZSA9IGdldEpvaW5UYWJsZU5hbWUoKTsKLQkJaWYoIHMxID09IG51bGwgfHwgczIgPT0gbnVsbCApCi0JCQlyZXR1cm4gOwotCQkKLQkJdXBkYXRlRGVzY3JpcHRpb25UZXh0KHMxLCBzMik7Ci0JCWlmKCBqb2luVGFibGVOYW1lID09IG51bGwgKXsKLQkJCWNhcmRpbmFsaXR5QnV0dG9uc1swXS5zZXRFbmFibGVkKHRydWUpOwotCQkJY2FyZGluYWxpdHlCdXR0b25zWzFdLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQljYXJkaW5hbGl0eUJ1dHRvbnNbMl0uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWNhcmRpbmFsaXR5QnV0dG9uc1szXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCW10bURlc2NMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfWVsc2V7Ci0JCQljYXJkaW5hbGl0eUJ1dHRvbnNbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQljYXJkaW5hbGl0eUJ1dHRvbnNbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQljYXJkaW5hbGl0eUJ1dHRvbnNbMl0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQljYXJkaW5hbGl0eUJ1dHRvbnNbM10uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWNhcmRpbmFsaXR5QnV0dG9uc1szXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQltdG1EZXNjTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCQkoKENvbXBvc2l0ZSl0aGlzLmdldENvbnRyb2woKSkubGF5b3V0KCkgOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVEZXNjcmlwdGlvblRleHQoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJLy9NVE8KLQkJU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5tYW55VG9PbmVEZXNjLCBzMiwgczEpOwotCQltdG9EZXNjTGFiZWwuc2V0VGV4dCggbXNnICk7Ci0JCS8vT1RNCi0JCW1zZyA9IFN0cmluZy5mb3JtYXQoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5tYW55VG9PbmVEZXNjLCBzMSwgczIpOwotCQlvdG1EZXNjTGFiZWwuc2V0VGV4dCggbXNnICk7Ci0JCW1zZyA9IFN0cmluZy5mb3JtYXQoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5vbmVUb09uZURlc2MsIHMxLCBzMik7Ci0JCW90b0Rlc2NMYWJlbC5zZXRUZXh0KCBtc2cgKTsKLQkJbXNnID0gU3RyaW5nLmZvcm1hdChKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm1hbnlUb01hbnlEZXNjLCBzMSwgczIsIHMyLCBzMSk7Ci0JCW10bURlc2NMYWJlbC5zZXRUZXh0KCBtc2cgKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuLCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gMzA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuLCBTdHJpbmcgdGV4dCApIHsKLQkJQnV0dG9uIGJ0biA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuUkFESU8gKTsKLQkJYnRuLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJYnRuLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gYnRuOwotCX0KLQkKLQotCXByaXZhdGUgY2xhc3MgQ2FyZGluYWxpdHlTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmKCBlLmdldFNvdXJjZSgpID09IGNhcmRpbmFsaXR5QnV0dG9uc1swXSl7Ci0JCQkJZ2V0V2l6YXJkRGF0YU1vZGVsKCkucHV0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0NBRElOQUxJVFksIEFzc29jaWF0aW9uLk1BTllfVE9fT05FKTsKLQkJCX1lbHNlIGlmKCBlLmdldFNvdXJjZSgpID09IGNhcmRpbmFsaXR5QnV0dG9uc1sxXSl7Ci0JCQkJZ2V0V2l6YXJkRGF0YU1vZGVsKCkucHV0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0NBRElOQUxJVFksIEFzc29jaWF0aW9uLk9ORV9UT19NQU5ZICk7Ci0JCQl9ZWxzZSBpZiggZS5nZXRTb3VyY2UoKSA9PSBjYXJkaW5hbGl0eUJ1dHRvbnNbMl0pewotCQkJCWdldFdpemFyZERhdGFNb2RlbCgpLnB1dChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9DQURJTkFMSVRZLCBBc3NvY2lhdGlvbi5PTkVfVE9fT05FKTsKLQkJCX1lbHNlewotCQkJCWdldFdpemFyZERhdGFNb2RlbCgpLnB1dChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9DQURJTkFMSVRZLCBBc3NvY2lhdGlvbi5NQU5ZX1RPX01BTlkpOwotCQkJfQotCQkJQ2FyZGluYWxpdHlQYWdlLnRoaXMuc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQkJCi0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9DYXNjYWRlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9DYXNjYWRlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YjZhMWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQ2FzY2FkZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UcmF5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuQXNzb2NpYXRpb25Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5TdHJpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0KLS8qKgotICogU2ltcGxlIGRpYWxvZyBhbGxvd3MgdXNlciB0byBzZXQgdGhlIGNhc2NhZGUgcHJvcGVydHkgb2YgYW4gYXNzb2NpYXRpb25Sb2xlLgotICogVGhlIHZhbHVlIG9mIGNhc2NhZGUgY2FuIGJlICJhbGwiLCBvciBhbnkgY29tYmluYXRpb24gb2Ygb3RoZXIgc2VsZWN0aW9ucy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ2FzY2FkZURpYWxvZyBleHRlbmRzIFRyYXlEaWFsb2cgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gQUxMX0NBU0NBREVTID0gbmV3IFN0cmluZ1tdIHtUYWdOYW1lcy5BTExfQ0FTQ0FERSwgVGFnTmFtZXMuUEVSU0lTVF9DQVNDQURFLCBUYWdOYW1lcy5NRVJHRV9DQVNDQURFCi0JCQksIFRhZ05hbWVzLlJFTU9WRV9DQVNDQURFLCBUYWdOYW1lcy5SRUZSRVNIX0NBU0NBREV9OwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gQUxMX0NBU0NBREVTX0xBQkVMUyAKLQkJPSBuZXcgU3RyaW5nW10geyAiJmFsbCIsIAkJLy8kTk9OLU5MUy0xJAotCQkJCQkJIiZwZXJzaXN0IiwJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCSImbWVyZ2UiLAkJLy8kTk9OLU5MUy0xJAotCQkJCQkJIiZyZW1vdmUiLAkJLy8kTk9OLU5MUy0xJAotCQkJCQkJInImZWZyZXNoIn07CS8vJE5PTi1OTFMtMSQKLQotCQotCXByaXZhdGUgQnV0dG9uW10gYWxsQnV0dG9ucyA9IG5ldyBCdXR0b25bQUxMX0NBU0NBREVTLmxlbmd0aF07Ci0KLQlwcml2YXRlIEFzc29jaWF0aW9uUm9sZSBhc3NvY2lhdGlvblJvbGU7Ci0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gY2FzY2FkZXM7Ci0JCi0JcHJvdGVjdGVkIENhc2NhZGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ2FzY2FkZURpYWxvZyBjcmVhdGUoQXNzb2NpYXRpb25Sb2xlIHJvbGUpIHsKLQkJQ2FzY2FkZURpYWxvZyBkbGcgPSBuZXcgQ2FzY2FkZURpYWxvZyhEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpICk7Ci0JCWRsZy5zZXRBc3NvY2lhdGlvblJvbGUocm9sZSk7Ci0JCXJldHVybiBkbGc7Ci0JfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBXaW5kb3cuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLSAgICAgICAgc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotICAgICAgICBuZXdTaGVsbC5zZXRUZXh0KEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuc2VsZWN0Q2FzY2FkZURsZ1RpdGxlKTsKLQkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuZXdTaGVsbCwgSnBhSGVscENvbnRleHRJZHMuR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX1NFTEVDVF9DQVNDQURFKTsKLSAgICB9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEFzc29jaWF0aW9uUm9sZShBc3NvY2lhdGlvblJvbGUgcm9sZSkgewotCQl0aGlzLmFzc29jaWF0aW9uUm9sZSA9IHJvbGU7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gU3RyaW5nVXRpbC5zdHJUb0xpc3QoYXNzb2NpYXRpb25Sb2xlLmdldENhc2NhZGUoKSwgJywnLCB0cnVlLyp0cmltKi8pOyAvL3JvbGUuZ2V0Q2FzY2FkZSgpIGNvbnRhaW5zIHRoZSBjb21tYSBzZXBhcmVkIGNhc2NhZGVzIChzZWUgYmVsb3cpCi0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQljYXNjYWRlcyA9IGxpc3Q7Ci0JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQljcmVhdGVDYXNjYWRlVHlwZXNHcm91cChjb250YWluZXIpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbnRhaW5lcik7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNhc2NhZGVUeXBlc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMjc1OwotCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZ3JvdXAuc2V0VGV4dChKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLmNhc2NhZGUpOwotCi0JCWZvciggaW50IGk9MDsgaTwgQUxMX0NBU0NBREVTLmxlbmd0aDsgaSArKyApewotCQkJQnV0dG9uIGNoZWNrYm94ID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCWNoZWNrYm94LnNldFRleHQoIEFMTF9DQVNDQURFU19MQUJFTFNbaV0gKTsKLQkJCWNoZWNrYm94LnNldFNlbGVjdGlvbiggaXNJbkxpc3QoQUxMX0NBU0NBREVTW2ldKSApOyAvLyROT04tTkxTLTEkCi0JCQljaGVja2JveC5zZXREYXRhKEFMTF9DQVNDQURFU1tpXSk7Ci0JCQlhbGxCdXR0b25zW2ldID0gY2hlY2tib3g7Ci0JCQkvKmlmIDxjb2RlPmFsbDwvY29kZT4gaXMgc2VsZWN0ZWQgdGhlbiBkZXNlbGVjdCBhbGwgb3RoZXJzKi8KLQkJCWNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLmdldFNvdXJjZSgpOwotCQkJCQlpZiggYi5nZXRTZWxlY3Rpb24oKSApewotCQkJCQkJaWYoIGIgPT0gYWxsQnV0dG9uc1swXSApewotCQkJCQkJCWZvciggQnV0dG9uIGJ0biA6IGFsbEJ1dHRvbnMgKXsKLQkJCQkJCQkJaWYoIGJ0biAhPSBlLmdldFNvdXJjZSgpICkgYnRuLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfWVsc2V7Ci0JCQkJCQkJYWxsQnV0dG9uc1swXS5zZXRTZWxlY3Rpb24oZmFsc2UpOyAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlmb3IoIEJ1dHRvbiBiIDogYWxsQnV0dG9ucyApewotCQkJaWYoIGIuZ2V0U2VsZWN0aW9uKCkgKXsKLQkJCQlpZiggYnVpbGRlci5sZW5ndGgoKT4wICl7Ci0JCQkJCWJ1aWxkZXIuYXBwZW5kKCAnLCcpOwotCQkJCX0KLQkJCQlidWlsZGVyLmFwcGVuZCggYi5nZXREYXRhKCkgKTsKLQkJCX0KLQkJfQotCQl0aGlzLmFzc29jaWF0aW9uUm9sZS5zZXRDYXNjYWRlKCBidWlsZGVyLnRvU3RyaW5nKCkgKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQkKLQotCXByaXZhdGUgYm9vbGVhbiBpc0luTGlzdChTdHJpbmcgY2FzY2FkZSkgewotCQlmb3IoIFN0cmluZyBzIDogY2FzY2FkZXMgKXsKLQkJCWlmKCBzLmVxdWFscyhjYXNjYWRlICkpewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hIZWxwU3lzdGVtIGdldEhlbHBTeXN0ZW0oKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQl9Ci0KLX0KLQotY2xhc3MgVGFnTmFtZXMKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQ19UQUcgPSAiYmFzaWMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0NBREVfVEFHID0gImNhc2NhZGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9UQUcgPSAiY29sdW1uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERFRF9UQUcgPSAiZW1iZWRkZWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEREVEX0lEX1RBRyA9ICJlbWJlZGRlZC1pZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVEX1ZBTFVFX1RBRyA9ICJnZW5lcmF0ZWQtdmFsdWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1RBRyA9ICJpZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQ0xBU1NfVEFHID0gImlkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX0NPTFVNTl9UQUcgPSAiam9pbi1jb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkVSU0VfSk9JTl9DT0xVTU5fVEFHID0gImludmVyc2Utam9pbi1jb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQl9UQUcgPSAibG9iIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5ZX1RPX01BTllfVEFHID0gIm1hbnktdG8tbWFueSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOWV9UT19PTkVfVEFHID0gIm1hbnktdG8tb25lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfQllfVEFHID0gIm1hcHBlZC1ieSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1RPX01BTllfVEFHID0gIm9uZS10by1tYW55IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfVE9fT05FX1RBRyA9ICJvbmUtdG8tb25lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQS19KT0lOX0NPTFVNTl9UQUcgPSAicHJpbWFyeS1rZXktam9pbi1jb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX1RBRyA9ICJ0YWJsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9UQUcgPSAidmVyc2lvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9UQUJMRV9UQUcgPSAiam9pbi10YWJsZSI7Ci0KLQkvKmNhc2NhZGUgdGFncyovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX0NBU0NBREUgPSAiYWxsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNUX0NBU0NBREUgPSAicGVyc2lzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVSR0VfQ0FTQ0FERSA9ICJtZXJnZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX0NBU0NBREUgPSAicmVtb3ZlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIX0NBU0NBREUgPSAicmVmcmVzaCI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Db2x1bW5HZW5QYW5lbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQ29sdW1uR2VuUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiNzBmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Db2x1bW5HZW5QYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5PUk1HZW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5PUk1HZW5DdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIHBhbmVsIHVzZWQgaW4gdGhlIDxjb2RlPlRhYmxlc0FuZENvbHVtbnNQYWdlPC9jb2RlPiB3aXphcmQgcGFnZSAKLSAqIHRvIGVkaXQgdGhlIGNvbHVtbiBnZW5lcmF0aW9uIHByb3BlcnRpZXMuCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGNyZWF0ZWQgYnkgdGhlIDxjb2RlPk9STUdlbldpemFyZDwvY29kZT4gCi0gKiBpbXBsZW1lbnRhdGlvbi4KLQotICovCi1wdWJsaWMgY2xhc3MgQ29sdW1uR2VuUGFuZWwgCi17Ci0JV2l6YXJkUGFnZSB3aXphcmRQYWdlIDsgCi0JQ29tcG9zaXRlIHBhcmVudDsJLy9wYXJlbnQgY29udHJvbCB3aXRoIGdyaWQgbGF5b3V0Ci0JaW50IGNvbHVtbnM7IAkJLy90b3RhbCBjb2x1bW5zIGluIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JCi0JT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyOwotCQotCXByaXZhdGUgT1JNR2VuQ29sdW1uIG1Db2x1bW47Ci0JcHJpdmF0ZSBib29sZWFuIG1QYW5lbEluaXRlZDsKLQlwcml2YXRlIGJvb2xlYW4gbUlzVXBkYXRpbmdDb250cm9sczsKLQkKLQlwcml2YXRlIEdyb3VwIGNvbHVtbk1hcHBpbmdHcm91cDsKLQlwcml2YXRlIEJ1dHRvbiBtR2VuZXJhdGVkQ2hlY2tib3g7Ci0JcHJpdmF0ZSBUZXh0IG1Qcm9wTmFtZUZpZWxkOwotCXByaXZhdGUgQ29tYm8gbU1hcHBpbmdLaW5kQ29tYm87Ci0JcHJpdmF0ZSBDb21ibyBtUHJvcFR5cGVDb21ibzsKLQlwcml2YXRlIEJ1dHRvbiBtVXBkYXRlYWJsZUNoZWNrQm94OwotCXByaXZhdGUgQnV0dG9uIG1JbnNlcnRhYmxlQ2hlY2tCb3g7Ci0JCi0JcHJpdmF0ZSBHcm91cCBkb21haW5DbGFzc0dyb3VwIDsKLQlwcml2YXRlIFNjb3BlUGFuZWwgbVByb3BHZXRTY29wZVBhbmVsOwotCXByaXZhdGUgU2NvcGVQYW5lbCBtUHJvcFNldFNjb3BlUGFuZWw7Ci0JCi0JcHVibGljIENvbHVtbkdlblBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW5zLCBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIsIFdpemFyZFBhZ2Ugd2l6YXJkUGFnZSApIHsKLQkJdGhpcy53aXphcmRQYWdlID0gd2l6YXJkUGFnZTsKLQkJdGhpcy5jdXN0b21pemVyID0gY3VzdG9taXplcjsKLQkJdGhpcy5wYXJlbnQgPXBhcmVudDsKLQkJdGhpcy5jb2x1bW5zID0gY29sdW1uczsKLQkJCi0JCWluaXRQYW5lbCgpOwotCX0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSB0YWJsZSBlZGl0ZWQgYnkgdGhlIHBhbmVsLgotCSAqIFRoaXMgaXMgc3VwcG9zZWQgdG8gdXBkYXRlIHRoZSBwYW5lbCBlZGl0aW5nIGNvbnRyb2xzIAotCSAqIHVzaW5nIHRoZSBjb2x1bW4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbihPUk1HZW5Db2x1bW4gY29sdW1uKSB7Ci0JCW1Db2x1bW4gPSBjb2x1bW47Ci0JCQotCQkvKmxhenkgaW5pdCBwYW5lbCBiZWNhdXNlIGl0IHVzZXMgbUNvbHVtbiovCi0JCWlmICghbVBhbmVsSW5pdGVkKSB7Ci0JCQlpbml0UGFuZWwoKTsKLQkJCW1QYW5lbEluaXRlZCA9IHRydWU7Ci0JCX0KLQkJCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JfQotCXByaXZhdGUgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJaWYgKG1Jc1VwZGF0aW5nQ29udHJvbHMpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJbUlzVXBkYXRpbmdDb250cm9scyA9IHRydWU7Ci0JCWJvb2xlYW4gaXNHZW5lcmF0ZWQgPSBtQ29sdW1uLmlzR2VuZXJhdGVkKCk7Ci0JCW1HZW5lcmF0ZWRDaGVja2JveC5zZXRTZWxlY3Rpb24oIGlzR2VuZXJhdGVkKTsKLQkJbUdlbmVyYXRlZENoZWNrYm94LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWVuYWJsZUNvbnRyb2xzKGlzR2VuZXJhdGVkKTsKLQkJdHJ5IHsKLQkJCW1Qcm9wTmFtZUZpZWxkLnNldFRleHQobUNvbHVtbi5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0KLQkJCW1Qcm9wVHlwZUNvbWJvLnNldFRleHQoIG1Db2x1bW4uZ2V0UHJvcGVydHlUeXBlKCkpOwotCQkJCi0JCQltTWFwcGluZ0tpbmRDb21iby5zZXRUZXh0KCBtQ29sdW1uLmdldE1hcHBpbmdLaW5kKCkpOwotCQkJCi0JCQltVXBkYXRlYWJsZUNoZWNrQm94LnNldFNlbGVjdGlvbiggbUNvbHVtbi5pc1VwZGF0ZWFibGUoKSk7Ci0JCQkKLQkJCW1JbnNlcnRhYmxlQ2hlY2tCb3guc2V0U2VsZWN0aW9uKG1Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQkJCi0JCQltUHJvcEdldFNjb3BlUGFuZWwuZW5hYmxlQ29tcG9uZW50cyhpc0dlbmVyYXRlZCk7Ci0JCQltUHJvcEdldFNjb3BlUGFuZWwuc2V0U2NvcGUobUNvbHVtbi5nZXRQcm9wZXJ0eUdldFNjb3BlKCkpOwotCQkJCi0JCQltUHJvcFNldFNjb3BlUGFuZWwuZW5hYmxlQ29tcG9uZW50cyggaXNHZW5lcmF0ZWQgKTsKLQkJCW1Qcm9wU2V0U2NvcGVQYW5lbC5zZXRTY29wZShtQ29sdW1uLmdldFByb3BlcnR5U2V0U2NvcGUoKSk7Ci0KLQkJCWlmKCBtQ29sdW1uLmlzUGFydE9mQ29tcG9zaXRlUHJpbWFyeUtleSgpKXsKLQkJCQllbmFibGVDb250cm9scyhmYWxzZSk7Ci0JCQkJbVByb3BOYW1lRmllbGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQltR2VuZXJhdGVkQ2hlY2tib3guc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJfQotCi0JCW1Jc1VwZGF0aW5nQ29udHJvbHMgPSBmYWxzZTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGVuYWJsZUNvbnRyb2xzKGJvb2xlYW4gaXNHZW5lcmF0ZWQpIHsKLQkJQ29udHJvbFtdIGNvbnRyb2xzID0gdGhpcy5kb21haW5DbGFzc0dyb3VwLmdldENoaWxkcmVuKCk7Ci0JCWZvciggQ29udHJvbCBjOiBjb250cm9scyl7Ci0JCQljLnNldEVuYWJsZWQoIGlzR2VuZXJhdGVkICk7Ci0JCX0KLQotCQljb250cm9scyA9IHRoaXMuY29sdW1uTWFwcGluZ0dyb3VwLmdldENoaWxkcmVuKCk7Ci0JCWZvciggQ29udHJvbCBjOiBjb250cm9scyl7Ci0JCQljLnNldEVuYWJsZWQoIGlzR2VuZXJhdGVkICk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHBhbmVsIGJ5IGFkZGluZyB0aGUgZWRpdGluZyBjb250cm9scy4KLQkgKiBAcGFyYW0gY29sdW1ucyAKLQkgKiBAcGFyYW0gcGFyZW50IAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQYW5lbCgpIHsKLQkJY3JlYXRlQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKLQkJdGhpcy5tUGFuZWxJbml0ZWQgPSB0cnVlOwotCX0KLQkKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy0tLS0tIFNjb3BlUGFuZWwgY2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBBIHBhbmVsIGNvbnRhaW5pbmcgMyByYWRpb3MgKHB1YmxpYywgcHJvdGVjdGVkLCBwcml2YXRlKQotCSAqLwotCXByaXZhdGUgY2xhc3MgU2NvcGVQYW5lbCAKLQl7Ci0JCXByaXZhdGUgQnV0dG9uIG1QdWJsaWNSYWRpbzsKLQkJcHJpdmF0ZSBCdXR0b24gbVByb3RlY3RlZFJhZGlvOwotCQlwcml2YXRlIEJ1dHRvbiBtUHJpdmF0ZVJhZGlvOwotCQkKLQkJcHVibGljIFNjb3BlUGFuZWwoQ29tcG9zaXRlIGNvbXAsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkvL3N1cGVyKDMsIDIwLypoc3BhY2luZyovLCAwLyp2c3BhY2luZyovKTsKLQkJCQotCQkJQ29tcG9zaXRlIHJhZGlvR3JvdXAgPSBuZXcgQ29tcG9zaXRlKCBjb21wLCBTV1QuTk9ORSk7Ci0JCQlyYWRpb0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCB0cnVlKSk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJcmFkaW9Hcm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQotCQkJLypzdHJpbmcgbm90IGxvY2FsaXplZCBpbnRlbnRpb25hbGx5LCB0aGV5IGFyZSB1c2VkIGFzIHRoZSBhY3R1YWwgCi0JCQkgKiBzY29wZSB2YWx1ZSAoc2VlIGdldFRleHQoKSB1c2FnZSkqLwotCQkJbVB1YmxpY1JhZGlvID0gbmV3IEJ1dHRvbiggcmFkaW9Hcm91cCwgU1dULlJBRElPICk7Ci0JCQltUHVibGljUmFkaW8uc2V0VGV4dCggInB1YmxpYyIpOwotCQkJbVB1YmxpY1JhZGlvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJbVByb3RlY3RlZFJhZGlvID0gbmV3IEJ1dHRvbiggcmFkaW9Hcm91cCwgU1dULlJBRElPICk7Ci0JCQltUHJvdGVjdGVkUmFkaW8uc2V0VGV4dCgicHJvdGVjdGVkIik7Ci0JCQltUHJvdGVjdGVkUmFkaW8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQltUHJpdmF0ZVJhZGlvID0gbmV3IEJ1dHRvbihyYWRpb0dyb3VwLCBTV1QuUkFESU8gKTsKLQkJCW1Qcml2YXRlUmFkaW8uc2V0VGV4dCggInByaXZhdGUiKTsKLQkJCW1Qcml2YXRlUmFkaW8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQkKLQkJCW1QdWJsaWNSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQltUHJvdGVjdGVkUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJbVByaXZhdGVSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQkJCi0JCX0KLQkJcHVibGljIHZvaWQgZW5hYmxlQ29tcG9uZW50cyhib29sZWFuIGIpIHsKLQkJCW1QdWJsaWNSYWRpby5zZXRFbmFibGVkKGIpOwotCQkJbVByb3RlY3RlZFJhZGlvLnNldEVuYWJsZWQoYik7Ci0JCQltUHJpdmF0ZVJhZGlvLnNldEVuYWJsZWQoYik7Ci0JCX0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzY29wZS4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKSB7Ci0JCQlCdXR0b24gcmFkaW8gPSBudWxsOwotCQkJaWYgKG1QdWJsaWNSYWRpby5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXJhZGlvID0gbVB1YmxpY1JhZGlvOwotCQkJfSBlbHNlIGlmIChtUHJvdGVjdGVkUmFkaW8uZ2V0U2VsZWN0aW9uKCkgKSB7Ci0JCQkJcmFkaW8gPSBtUHJvdGVjdGVkUmFkaW87Ci0JCQl9IGVsc2UgaWYgKG1Qcml2YXRlUmFkaW8uZ2V0U2VsZWN0aW9uKCkgKSB7Ci0JCQkJcmFkaW8gPSBtUHJpdmF0ZVJhZGlvOwotCQkJfQotCQkJcmV0dXJuIHJhZGlvICE9IG51bGwgPyByYWRpby5nZXRUZXh0KCkgOiBudWxsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBzY29wZSkgewotCQkJbVB1YmxpY1JhZGlvLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQltUHJvdGVjdGVkUmFkaW8uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCW1Qcml2YXRlUmFkaW8uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWlmKCBzY29wZSA9PSBudWxsICkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoc2NvcGUuZXF1YWxzKE9STUdlbkNvbHVtbi5QVUJMSUNfU0NPUEUpKSB7Ci0JCQkJbVB1YmxpY1JhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCX0gZWxzZSBpZiAoc2NvcGUuZXF1YWxzKE9STUdlbkNvbHVtbi5QUk9URUNURURfU0NPUEUpKSB7Ci0JCQkJbVByb3RlY3RlZFJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCX0gZWxzZSBpZiAoc2NvcGUuZXF1YWxzKE9STUdlbkNvbHVtbi5QUklWQVRFX1NDT1BFKSkgewotCQkJCW1Qcml2YXRlUmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vLS0tLS0gcHJpdmF0ZSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1ucykgewotCQltR2VuZXJhdGVkQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJbUdlbmVyYXRlZENoZWNrYm94LnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9nZW5Qcm9wKTsKLQkJbUdlbmVyYXRlZENoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICghbUlzVXBkYXRpbmdDb250cm9scykgewotCQkJCQltQ29sdW1uLnNldEdlbmVyYXRlZChtR2VuZXJhdGVkQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkgKTsKLQkJCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCQl9Ci0JCQl9fSk7Ci0JCVNXVFV0aWwuZmlsbENvbHVtbnMobUdlbmVyYXRlZENoZWNrYm94LCBjb2x1bW5zKTsKLQkJCi0JCWNvbHVtbk1hcHBpbmdHcm91cCA9IG5ldyBHcm91cCggY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbk1hcHBpbmdHcm91cC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfY29sTWFwcGluZyk7Ci0JCWNvbHVtbk1hcHBpbmdHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoY29sdW1ucywgZmFsc2UpKTsKLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxTcGFuID0gY29sdW1uczsKLQkJbGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMCA7Ci0JCWNvbHVtbk1hcHBpbmdHcm91cC5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQkKLQkJU1dUVXRpbC5jcmVhdGVMYWJlbChjb2x1bW5NYXBwaW5nR3JvdXAsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9wcm9wTmFtZSApOwotCQltUHJvcE5hbWVGaWVsZCA9IG5ldyBUZXh0KGNvbHVtbk1hcHBpbmdHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgKTsKLQkJbVByb3BOYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKCFtSXNVcGRhdGluZ0NvbnRyb2xzKSB7Ci0JCQkJCVN0cmluZyBmbGROYW1lID0gbVByb3BOYW1lRmllbGQuZ2V0VGV4dCgpOwotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUlkZW50aWZpZXIoIGZsZE5hbWUsIAotCQkJCQkJSmF2YUNvcmUuVkVSU0lPTl8xXzMsIEphdmFDb3JlLlZFUlNJT05fMV8zICk7Ci0JCQkJCWlmKCAhc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpewotCQkJCQkJbUNvbHVtbi5zZXRQcm9wZXJ0eU5hbWUoZmxkTmFtZSk7Ci0JCQkJCQl3aXphcmRQYWdlLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQkJfWVsc2V7Ci0JCQkJCQl3aXphcmRQYWdlLnNldEVycm9yTWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkKLQkJfSk7Ci0JCVNXVFV0aWwuZmlsbENvbHVtbnMobVByb3BOYW1lRmllbGQgLDMpOwotCQkKLQkJU1dUVXRpbC5jcmVhdGVMYWJlbChjb2x1bW5NYXBwaW5nR3JvdXAsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9wcm9wVHlwZSApOwotCQltUHJvcFR5cGVDb21ibyA9IG5ldyBDb21ibyhjb2x1bW5NYXBwaW5nR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJbVByb3BUeXBlQ29tYm8uc2V0SXRlbXMoIHRoaXMuY3VzdG9taXplci5nZXRBbGxQcm9wZXJ0eVR5cGVzKCkpOwotCQltUHJvcFR5cGVDb21iby5hZGRNb2RpZnlMaXN0ZW5lciggbmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoIW1Jc1VwZGF0aW5nQ29udHJvbHMpIHsKLQkJCQkJbUNvbHVtbi5zZXRQcm9wZXJ0eVR5cGUobVByb3BUeXBlQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlTV1RVdGlsLmZpbGxDb2x1bW5zKG1Qcm9wVHlwZUNvbWJvLDMpOwotCQkKLQkJU1dUVXRpbC5jcmVhdGVMYWJlbChjb2x1bW5NYXBwaW5nR3JvdXAsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9tYXBLaW5kICk7Ci0JCW1NYXBwaW5nS2luZENvbWJvID0gbmV3IENvbWJvKGNvbHVtbk1hcHBpbmdHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQltTWFwcGluZ0tpbmRDb21iby5zZXRJdGVtcyggdGhpcy5jdXN0b21pemVyLmdldEFsbE1hcHBpbmdLaW5kcygpKTsKLQkJbU1hcHBpbmdLaW5kQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCFtSXNVcGRhdGluZ0NvbnRyb2xzKSB7Ci0JCQkJCW1Db2x1bW4uc2V0TWFwcGluZ0tpbmQoKFN0cmluZyltTWFwcGluZ0tpbmRDb21iby5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCQkKLQkJCX19KTsKLQkJU1dUVXRpbC5maWxsQ29sdW1ucyhtTWFwcGluZ0tpbmRDb21ibyAsMyk7Ci0JCQotCQltVXBkYXRlYWJsZUNoZWNrQm94ID0gbmV3IEJ1dHRvbihjb2x1bW5NYXBwaW5nR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1VcGRhdGVhYmxlQ2hlY2tCb3guc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX2NvbFVwZGF0ZWFibGUpOwotCQltVXBkYXRlYWJsZUNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICghbUlzVXBkYXRpbmdDb250cm9scykgewotCQkJCQltQ29sdW1uLnNldFVwZGF0ZWFibGUobVVwZGF0ZWFibGVDaGVja0JveC5nZXRTZWxlY3Rpb24oKSApOwotCQkJCX0KLQkJCX19KTsKLQkJU1dUVXRpbC5maWxsQ29sdW1ucyhtVXBkYXRlYWJsZUNoZWNrQm94ICw0KTsKLQkJCi0JCW1JbnNlcnRhYmxlQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNvbHVtbk1hcHBpbmdHcm91cCwgU1dULkNIRUNLKTsKLQkJbUluc2VydGFibGVDaGVja0JveC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfY29sSW5zZXJ0YWJsZSk7Ci0JCW1JbnNlcnRhYmxlQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCFtSXNVcGRhdGluZ0NvbnRyb2xzKSB7Ci0JCQkJCW1Db2x1bW4uc2V0SW5zZXJ0YWJsZShtSW5zZXJ0YWJsZUNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9fSk7Ci0JCVNXVFV0aWwuZmlsbENvbHVtbnMobUluc2VydGFibGVDaGVja0JveCAsNCk7Ci0JCQotCQlTV1RVdGlsLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgNCwiIik7IAotCQkKLQkJY3JlYXRlSmF2YUJlYW5Qcm9wZXJ0eUNvbnRyb2xzKGNvbXBvc2l0ZSwgY29sdW1ucyk7Ci0JfQotCQotCXZvaWQgY3JlYXRlSmF2YUJlYW5Qcm9wZXJ0eUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5zKXsKLQkJLy9KYXZhIGNsYXNzIGdlbmVyYXRpb24gcHJvcGVydGllcyAKLQkJZG9tYWluQ2xhc3NHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZG9tYWluQ2xhc3NHcm91cC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfYmVhblByb3AgKTsKLQkJZG9tYWluQ2xhc3NHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoY29sdW1ucywgZmFsc2UpKTsKLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxTcGFuID0gY29sdW1uczsKLQkJbGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJZG9tYWluQ2xhc3NHcm91cC5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCi0JCVNXVFV0aWwuY3JlYXRlTGFiZWwoZG9tYWluQ2xhc3NHcm91cCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX2dldHRlclNjb3BlICk7Ci0JCW1Qcm9wR2V0U2NvcGVQYW5lbCA9IG5ldyBTY29wZVBhbmVsKGRvbWFpbkNsYXNzR3JvdXAsIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCFtSXNVcGRhdGluZ0NvbnRyb2xzKSB7Ci0JCQkJCWlmKCAoKEJ1dHRvbillLmdldFNvdXJjZSgpKS5nZXRTZWxlY3Rpb24oKSApCi0JCQkJCQltQ29sdW1uLnNldFByb3BlcnR5R2V0U2NvcGUobVByb3BHZXRTY29wZVBhbmVsLmdldFNjb3BlKCkpOwotCQkJCX0KLQkJCQkKLQkJCX19KTsKLQkJCi0JCVNXVFV0aWwuY3JlYXRlTGFiZWwoZG9tYWluQ2xhc3NHcm91cCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX3NldHRlclNjb3BlICk7Ci0JCW1Qcm9wU2V0U2NvcGVQYW5lbCA9IG5ldyBTY29wZVBhbmVsKGRvbWFpbkNsYXNzR3JvdXAsIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCFtSXNVcGRhdGluZ0NvbnRyb2xzKSB7Ci0JCQkJCWlmKCAoKEJ1dHRvbillLmdldFNvdXJjZSgpKS5nZXRTZWxlY3Rpb24oKSApCi0JCQkJCQltQ29sdW1uLnNldFByb3BlcnR5U2V0U2NvcGUobVByb3BTZXRTY29wZVBhbmVsLmdldFNjb3BlKCkpOwotCQkJCX0KLQkJCX19KTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vRGF0YWJhc2VHcm91cC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vRGF0YWJhc2VHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTk5MmM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0RhdGFiYXNlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIudWkuaW50ZXJuYWwuRFRQVWlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkltYWdlUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBBIGNvbXBvc2l0ZSB1c2VkIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2UsIGluY2x1ZGVzIGZvbGxvd2luZyBVSSBjb250cm9sczoKLSAqIC0gY29ubmVjdGlvbiBjb21iby1ib3gKLSAqIC0gc2NoZW1hIGNvbWJvLWJveAotICogLSBhZGQgY29ubmVjdGlvbiBidXR0b24KLSAqIC0gcmVjb25uZWN0IGJ1dHRvbgotICovCi1wdWJsaWMgY2xhc3MgRGF0YWJhc2VHcm91cAotewotCXByaXZhdGUgZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCXByaXZhdGUgZmluYWwgU2V0PExpc3RlbmVyPiBsaXN0ZW5lcnMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQobmV3IEhhc2hTZXQ8TGlzdGVuZXI+KCkpOwotCi0JLy8gdGhlc2UgYXJlIGtlcHQgaW4gc3luY2ggd2l0aCB0aGUgc2VsZWN0aW9uCi0JQ29ubmVjdGlvblByb2ZpbGUgc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZTsKLQlwcml2YXRlIFNjaGVtYSBzZWxlY3RlZFNjaGVtYTsKLQotCXByaXZhdGUgZmluYWwgQ29tYm8gY29ubmVjdGlvbkNvbWJvQm94OwotCi0JcHJpdmF0ZSBmaW5hbCBDb21ibyBzY2hlbWFDb21ib0JveDsKLQotCXByaXZhdGUgZmluYWwgQnV0dG9uIHJlY29ubmVjdEJ1dHRvbjsKLQotCXByaXZhdGUgZmluYWwgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKLQotCXByaXZhdGUgSVdpemFyZENvbnRhaW5lciB3aXphcmRDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCURhdGFiYXNlR3JvdXAoSVdpemFyZENvbnRhaW5lciB3aXphcmRDb250YWluZXIsIEpwYVByb2plY3QganBhUHJvamVjdCwgQ29tcG9zaXRlIHBhcmVudCwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlciwgaW50IHdpZHRoSGludCkgewotCQlzdXBlcigpOwotCQl0aGlzLndpemFyZENvbnRhaW5lciA9IHdpemFyZENvbnRhaW5lcjsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5yZXNvdXJjZU1hbmFnZXIgPSByZXNvdXJjZU1hbmFnZXI7Ci0KLQkJLy8gY29ubmVjdGlvbiBjb21iby1ib3gKLQkJdGhpcy5idWlsZExhYmVsKHBhcmVudCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5jb25uZWN0aW9uKTsKLQkJdGhpcy5jb25uZWN0aW9uQ29tYm9Cb3ggPSB0aGlzLmJ1aWxkQ29tYm9Cb3gocGFyZW50LCB3aWR0aEhpbnQsIHRoaXMuYnVpbGRDb25uZWN0aW9uQ29tYm9Cb3hTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotCQkvLyBhZGQgY29ubmVjdGlvbiBidXR0b24KLQkJQnV0dG9uIGFkZENvbm5lY3Rpb25CdXR0b24gPSB0aGlzLmJ1aWxkQnV0dG9uKHBhcmVudCwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5hZGRDb25uZWN0aW9uTGluaywgSW1hZ2VSZXBvc2l0b3J5LmdldEFkZENvbm5lY3Rpb25CdXR0b25JbWFnZSh0aGlzLnJlc291cmNlTWFuYWdlciksIHRoaXMuYnVpbGRBZGRDb25uZWN0aW9uTGlua1NlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWFkZENvbm5lY3Rpb25CdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCi0JCS8vIEEgY29tcG9zaXRlIGhvbGRzIHRoZSByZWNvbm5lY3QgYnV0dG9uICYgdGV4dAotCQl0aGlzLmJ1aWxkTGFiZWwocGFyZW50LCAxLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQgLCBTV1QuTk9ORSApOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZSA7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJY29tcC5zZXRMYXlvdXREYXRhKCBnZCApOwotCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQkvLyBNYWtlIHRoZSByZWNvbm5lY3QgYnV0dG9uIHRvIGJlIGNsb3NlciB0byB0aGUgY29ubmVjdGlvbiBjb21iby4KLQkJZ2wubWFyZ2luVG9wID0gLTU7Ci0JCWNvbXAuc2V0TGF5b3V0KGdsKTsKLQkJdGhpcy5yZWNvbm5lY3RCdXR0b24gPSB0aGlzLmJ1aWxkQnV0dG9uKGNvbXAsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuY29ubmVjdExpbmssIEltYWdlUmVwb3NpdG9yeS5nZXRSZWNvbm5lY3RCdXR0b25JbWFnZSh0aGlzLnJlc291cmNlTWFuYWdlciksICB0aGlzLmJ1aWxkUmVjb25uZWN0TGlua1NlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQl0aGlzLmJ1aWxkTGFiZWwoY29tcCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5zY2hlbWFJbmZvKTsKLQotCQkvLyBzY2hlbWEgY29tYm8tYm94Ci0JCXRoaXMuYnVpbGRMYWJlbChwYXJlbnQsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuc2NoZW1hKTsKLQkJdGhpcy5zY2hlbWFDb21ib0JveCA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZSA7Ci0JCXRoaXMuc2NoZW1hQ29tYm9Cb3guc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGhpcy5zY2hlbWFDb21ib0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkU2NoZW1hQ29tYm9Cb3hTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJLy8gZmlsbGVyCi0JCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGluaXQoKQotCXsKLQkJLy8gaW5pdGlhbGl6ZSBzdGF0ZSwgYmFzZWQgb24gSlBBIHByb2plY3QKLQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlID0gdGhpcy5nZXRKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJdGhpcy5zZWxlY3RlZFNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCi0JCWlmICh0aGlzLnNlbGVjdGVkU2NoZW1hICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZVNjaGVtYUNoYW5nZWQodGhpcy5zZWxlY3RlZFNjaGVtYSk7Ci0JCX0KLQkJaWYgKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJCXRoaXMuZmlyZUNvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZCh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUpOwotCQl9Ci0KLQkJdGhpcy51cGRhdGVDb25uZWN0aW9uQ29tYm9Cb3goKTsKLQkJdGhpcy51cGRhdGVTY2hlbWFDb21ib0JveCgpOwotCQl0aGlzLnVwZGF0ZVJlY29ubmVjdExpbmsoKTsKLQotCX0KLQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQotCVNjaGVtYSBnZXRTZWxlY3RlZFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWRTY2hlbWE7Ci0JfQotCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpIHsKLQkJCXRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogdGhpcyBjYW4gcmV0dXJuIG51bGw7Ci0JICogY2FsbGVkIGF0IHN0YXJ0LXVwIGFuZCB3aGVuIHRoZSBzZWxlY3RlZCBjb25uZWN0aW9uIHByb2ZpbGUgY2hhbmdlcwotCSAqLwotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCi0JLyoqCi0JICogdGhpcyBjYW4gcmV0dXJuIG51bGw7Ci0JICogY2FsbGVkIGF0IHN0YXJ0LXVwIGFuZCB3aGVuIHRoZSBzZWxlY3RlZCBjb25uZWN0aW9uIHByb2ZpbGUgY2hhbmdlcwotCSAqLwotCXByaXZhdGUgU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiAodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlID09IHRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkpID8KLQkJCQkJCWpwYVByb2plY3QuZ2V0RGVmYXVsdERiU2NoZW1hKCkJOiBudWxsOwotCX0KLQotCS8qKgotCSAqIHRoZSBjb25uZWN0aW9uIGNvbWJvLWJveCBpcyB1cGRhdGVkIGF0IHN0YXJ0LXVwIGFuZCB3aGVuIHRoZSB1c2VyCi0JICogYWRkcyBhIGNvbm5lY3Rpb24gcHJvZmlsZQotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVDb25uZWN0aW9uQ29tYm9Cb3goKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkNvbWJvQm94LnJlbW92ZUFsbCgpOwotCQlmb3IgKFN0cmluZyBjcE5hbWUgOiB0aGlzLmJ1aWxkU29ydGVkQ29ubmVjdGlvblByb2ZpbGVOYW1lcygpKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Db21ib0JveC5hZGQoY3BOYW1lKTsKLQkJfQotCQlpZiAodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpIHsKLQkJCXRoaXMuY29ubmVjdGlvbkNvbWJvQm94LnNlbGVjdCh0aGlzLmNvbm5lY3Rpb25Db21ib0JveC5pbmRleE9mKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZS5nZXROYW1lKCkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU29ydGVkU2V0PFN0cmluZz4gYnVpbGRTb3J0ZWRDb25uZWN0aW9uUHJvZmlsZU5hbWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldChKcHREYlBsdWdpbi5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWVzKCkpOwotCX0KLQotCS8qKgotCSAqIGNhbGxlZCBhdCBzdGFydC11cCBhbmQgd2hlbiB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlIGNoYW5nZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlUmVjb25uZWN0TGluaygpIHsKLQkJdGhpcy5yZWNvbm5lY3RCdXR0b24uc2V0RW5hYmxlZCh0aGlzLnJlY29ubmVjdExpbmtDYW5CZUVuYWJsZWQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHJlY29ubmVjdExpbmtDYW5CZUVuYWJsZWQoKSB7Ci0JCXJldHVybiAodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpICYmICEodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLmlzQWN0aXZlKCkpOwotCX0KLQotCS8qKgotCSAqIHRoZSBzY2hlbWEgY29tYm8tYm94IGlzIHVwZGF0ZWQgYXQgc3RhcnQtdXAgYW5kCi0JICogd2hlbiB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlIGNoYW5nZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlU2NoZW1hQ29tYm9Cb3goKSB7Ci0JCXRoaXMuc2NoZW1hQ29tYm9Cb3gucmVtb3ZlQWxsKCk7Ci0JCWZvciAoU3RyaW5nIG5hbWUgOiB0aGlzLmdldFNjaGVtYU5hbWVzKCkpIHsKLQkJCXRoaXMuc2NoZW1hQ29tYm9Cb3guYWRkKG5hbWUpOwotCQl9Ci0JCS8vIHRoZSBjdXJyZW50IHNjaGVtYSAqc2hvdWxkKiBiZSBpbiB0aGUgY3VycmVudCBjb25uZWN0aW9uIHByb2ZpbGUKLQkJaWYgKHRoaXMuc2VsZWN0ZWRTY2hlbWEgIT0gbnVsbCkgewotCQkJdGhpcy5zY2hlbWFDb21ib0JveC5zZWxlY3QodGhpcy5zY2hlbWFDb21ib0JveC5pbmRleE9mKHRoaXMuc2VsZWN0ZWRTY2hlbWEuZ2V0TmFtZSgpKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U2NoZW1hTmFtZXMoKSB7Ci0JCVNjaGVtYUNvbnRhaW5lciBzYyA9IHRoaXMuanBhUHJvamVjdC5nZXREZWZhdWx0RGJTY2hlbWFDb250YWluZXIoKTsKLQkJLy8gdXNlIHNjaGVtYSAqbmFtZXMqIHNpbmNlIHRoZSBjb21iby1ib3ggaXMgcmVhZC1vbmx5Ci0JCXJldHVybiAoc2MgIT0gbnVsbCkgPyBzYy5nZXRTb3J0ZWRTY2hlbWFOYW1lcygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCBuYW1lIG1hdGNoZXMgdGhlIG5hbWUgb2YgdGhlIEpQQSBwcm9qZWN0J3MKLQkgKiBjb25uZWN0aW9uIHByb2ZpbGUsIHJldHVybiBpdDsgb3RoZXJ3aXNlLCBidWlsZCBhIG5ldyBjb25uZWN0aW9uCi0JICogcHJvZmlsZS4KLQkgKi8KLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGNoZWNrSnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKFN0cmluZyBjcE5hbWUpIHsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpOwotCQlpZiAoKGNwICE9IG51bGwpICYmIGNwLmdldE5hbWUoKS5lcXVhbHMoY3BOYW1lKSkgewotCQkJcmV0dXJuIGNwOwotCQl9Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoY3BOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIEpwdERiUGx1Z2luLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUobmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyIGNhbGxiYWNrcyAqKioqKioqKioqCi0KLQl2b2lkIHNlbGVjdGVkQ29ubmVjdGlvbkNoYW5nZWQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gdGhpcy5jb25uZWN0aW9uQ29tYm9Cb3guZ2V0VGV4dCgpOwotCQlpZiAodGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlID09IG51bGwpIHsKLQkJCQlyZXR1cm47ICAvLyBubyBjaGFuZ2UKLQkJCX0KLQkJCXRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUgPT0gbnVsbCkgewotCQkJCXRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMuY2hlY2tKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUodGV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh0ZXh0LmVxdWFscyh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm47ICAvLyBubyBjaGFuZ2UKLQkJCQl9Ci0JCQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlID0gdGhpcy5jaGVja0pwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSh0ZXh0KTsKLQkJCX0KLQkJCXRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JCXRoaXMuZmlyZUNvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZCh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUpOwotCQl0aGlzLmNvbm5lY3Rpb25DaGFuZ2VkKCk7Ci0JfQotCi0Jdm9pZCBzZWxlY3RlZFNjaGVtYUNoYW5nZWQoKSB7Ci0JCVNjaGVtYSBvbGQgPSB0aGlzLnNlbGVjdGVkU2NoZW1hOwotCQl0aGlzLnNlbGVjdGVkU2NoZW1hID0gdGhpcy5qcGFQcm9qZWN0LmdldERlZmF1bHREYlNjaGVtYUNvbnRhaW5lcigpLmdldFNjaGVtYU5hbWVkKHRoaXMuc2NoZW1hQ29tYm9Cb3guZ2V0VGV4dCgpKTsKLQkJaWYgKHRoaXMuc2VsZWN0ZWRTY2hlbWEgIT0gb2xkKSB7Ci0JCQlmaXJlU2NoZW1hQ2hhbmdlZCh0aGlzLnNlbGVjdGVkU2NoZW1hKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW4gdGhlIERUUCBOZXcgQ29ubmVjdGlvbiBQcm9maWxlIHdpemFyZC4KLQkgKiBJZiB0aGUgdXNlciBjcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24gcHJvZmlsZSwgc3RhcnQgdXNpbmcgaXQgYW5kCi0JICogY29ubmVjdCBpdAotCSAqLwotCXZvaWQgYWRkQ29ubmVjdGlvbigpIHsKLQkJU3RyaW5nIGFkZGVkUHJvZmlsZU5hbWUgPSBEVFBVaVRvb2xzLmNyZWF0ZU5ld0Nvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCWlmIChhZGRlZFByb2ZpbGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybjsgIC8vIHVzZXIgcHJlc3NlZCAiQ2FuY2VsIgotCQl9Ci0JCWlmICh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUgIT0gbnVsbCkgewotCQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlID0gdGhpcy5idWlsZENvbm5lY3Rpb25Qcm9maWxlKGFkZGVkUHJvZmlsZU5hbWUpOwotCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJdGhpcy51cGRhdGVDb25uZWN0aW9uQ29tYm9Cb3goKTsKLQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJLy8gZXZlcnl0aGluZyBlbHNlIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQgd2hlbiB3ZSBnZXQgdGhlIHJlc3VsdGluZyBvcGVuIGV2ZW50Ci0JCXRoaXMuZmlyZUNvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZCh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUpOwotCQl0aGlzLnVwZGF0ZVNjaGVtYUNvbWJvQm94KCk7Ci0JfQotCi0Jdm9pZCByZWNvbm5lY3QoKSB7Ci0JCXRyeSB7Ci0JCQl3aXphcmRDb250YWluZXIucnVuKHRydWUsIHRydWUsIG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKXsKLQkJCQlwdWJsaWMgdm9pZCBydW4oIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotCQkJICAgIAl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkJCSAgICB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuY29ubmVjdGluZ1RvRGF0YWJhc2UsIDEwKTsKLQkJCQkJZmluYWwgU3luY2hyb25pemVkQm9vbGVhbiBmaW5pc2hlZCA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKGZhbHNlKTsKLQkJCQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCl7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlEYXRhYmFzZUdyb3VwLnRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCUpwdFVpUGx1Z2luLmxvZyhleCk7Ci0JCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJZmluaXNoZWQuc2V0VHJ1ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0JCQkJCQkKLQkJCQkJfTsKLQkJCQkJdC5zdGFydCgpOwotCQkJCQl3aGlsZSAoZmluaXNoZWQuaXNGYWxzZSgpKXsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQl9Ci0JCQkgICAgICAgIC8vIGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIHN5bmNocm9uaXplZCB3aGVuIHdlIGdldCB0aGUgcmVzdWx0aW5nIG9wZW4gZXZlbnQKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkgICAgfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJd2l6YXJkQ29udGFpbmVyLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBjYWxsZWQgd2hlbgotCSAqICAgICAtIHRoZSB1c2VyIHNlbGVjdHMgYSBuZXcgY29ubmVjdGlvbgotCSAqICAgICAtIHRoZSBjb25uZWN0aW9uIHdhcyBvcGVuZWQKLQkgKiAgICAgLSB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIChuZXZlciBoYXBwZW5zPykKLQkgKiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc2NoZW1hIHN0dWZmIGFuZCB0aGUgcmVjb25uZWN0IGxpbmsKLQkgKi8KLQl2b2lkIGNvbm5lY3Rpb25DaGFuZ2VkKCkgewotCQlTY2hlbWEgb2xkID0gdGhpcy5zZWxlY3RlZFNjaGVtYTsKLQkJdGhpcy5zZWxlY3RlZFNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlpZiAodGhpcy5zZWxlY3RlZFNjaGVtYSAhPSBvbGQpIHsKLQkJCXRoaXMuZmlyZVNjaGVtYUNoYW5nZWQodGhpcy5zZWxlY3RlZFNjaGVtYSk7Ci0JCX0KLQkJdGhpcy51cGRhdGVTY2hlbWFDb21ib0JveCgpOwotCQl0aGlzLnVwZGF0ZVJlY29ubmVjdExpbmsoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uQ29tYm9Cb3hTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCS8vIG5vdGhpbmcgc3BlY2lhbCBmb3IgImRlZmF1bHQiIChkb3VibGUtY2xpY2s/KQotCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEYXRhYmFzZUdyb3VwLnRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiRGF0YWJhc2VDb25uZWN0aW9uV2l6YXJkUGFnZSBjb25uZWN0aW9uIGNvbWJvLWJveCBzZWxlY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFNjaGVtYUNvbWJvQm94U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBub3RoaW5nIHNwZWNpYWwgZm9yICJkZWZhdWx0IiAoZG91YmxlLWNsaWNrPykKLQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRGF0YWJhc2VHcm91cC50aGlzLnNlbGVjdGVkU2NoZW1hQ2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiRGF0YWJhc2VDb25uZWN0aW9uV2l6YXJkUGFnZSBzY2hlbWEgY29tYm8tYm94IHNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkQWRkQ29ubmVjdGlvbkxpbmtTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCURhdGFiYXNlR3JvdXAudGhpcy5hZGRDb25uZWN0aW9uKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJEYXRhYmFzZUNvbm5lY3Rpb25XaXphcmRQYWdlIGFkZCBjb25uZWN0aW9uIGxpbmsgc2VsZWN0aW9uIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRSZWNvbm5lY3RMaW5rU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEYXRhYmFzZUdyb3VwLnRoaXMucmVjb25uZWN0KCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJEYXRhYmFzZUNvbm5lY3Rpb25XaXphcmRQYWdlIHJlY29ubmVjdCBsaW5rIHNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIGNwKSB7Ci0JCQkJdGhpcy5jb25uZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlICAvLyB0aGlzIHByb2JhYmx5IHdvbid0IGV2ZXIgZ2V0IGNhbGxlZC4uLgotCQkJcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb25Qcm9maWxlIGNwKSB7Ci0JCQkJdGhpcy5jb25uZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQkJcHJpdmF0ZSB2b2lkIGNvbm5lY3Rpb25DaGFuZ2VkKCkgewotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCURhdGFiYXNlR3JvdXAudGhpcy5jb25uZWN0aW9uQ2hhbmdlZCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkRhdGFiYXNlQ29ubmVjdGlvbldpemFyZFBhZ2UgY29ubmVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICggISB0aGlzLmxpc3RlbmVycy5hZGQobGlzdGVuZXIpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkdXBsaWNhdGUgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICggISB0aGlzLmxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtaXNzaW5nIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPExpc3RlbmVyPiBsaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxMaXN0ZW5lcj4odGhpcy5saXN0ZW5lcnMpOwotCX0KLQotCXZvaWQgZmlyZUNvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSkgewotCQlmb3IgKEl0ZXJhdG9yPExpc3RlbmVyPiBzdHJlYW0gPSB0aGlzLmxpc3RlbmVycygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXN0cmVhbS5uZXh0KCkuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZUNoYW5nZWQoY29ubmVjdGlvblByb2ZpbGUpOwotCQl9Ci0JfQotCi0Jdm9pZCBmaXJlU2NoZW1hQ2hhbmdlZChTY2hlbWEgc2NoZW1hKSB7Ci0JCWZvciAoSXRlcmF0b3I8TGlzdGVuZXI+IHN0cmVhbSA9IHRoaXMubGlzdGVuZXJzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc3RyZWFtLm5leHQoKS5zZWxlY3RlZFNjaGVtYUNoYW5nZWQoc2NoZW1hKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgbGFiZWwKLQkgKi8KLQlwcml2YXRlIExhYmVsIGJ1aWxkTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYW5kIHJldHVybiBhIGNvbWJvLWJveAotCSAqLwotCXByaXZhdGUgQ29tYm8gYnVpbGRDb21ib0JveChDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGhIaW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0JCS8vZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZSA7Ci0JCWRhdGEud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYW5kIHJldHVybiBhIGxpbmsKLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBidWlsZEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdG9vbFRpcFRleHQsIEltYWdlIGltYWdlLCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlidXR0b24uc2V0SW1hZ2UoIGltYWdlICk7Ci0JCWJ1dHRvbi5zZXRUb29sVGlwVGV4dCggdG9vbFRpcFRleHQpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXIgaW50ZXJmYWNlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbG93cyBjbGllbnRzIHRvIGxpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlCi0JICogYW5kIHNjaGVtYS4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcgotCXsKLQkJdm9pZCBzZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSk7Ci0JCXZvaWQgc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKFNjaGVtYSBzY2hlbWEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vRGVmYXVsdFRhYmxlR2VuZXJhdGlvbldpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0RlZmF1bHRUYWJsZUdlbmVyYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5M2JlYzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vRGVmYXVsdFRhYmxlR2VuZXJhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuTmV3V2l6YXJkTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLlR5cGVkVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudENvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdUeXBlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuT1JNR2VuQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLk9STUdlblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSBhbGxvd2luZyB0aGUgZW50cnkgb2YgdGhlIGRlZmF1bHQgdGFibGUgZ2VuZXJhdGlvbiAKLSAqIHByb3BlcnRpZXMgKEphdmEgY2xhc3NlcyBwYWNrYWdlLCBiYXNlIGNsYXNzLCBldGMpLgotICogVGhlc2UgcHJvcGVydGllcyBhcHBseSB0byBhbGwgdGFibGVzIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4gKGluIHRoZSB0YWJsZSBnZW5lcmF0aW9uIHBhZ2UpLgotICogCi0gKiBAYXV0aG9yIERhbm55IEp1Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFRhYmxlR2VuZXJhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBOZXdUeXBlV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCS8qdGhlIGluc3RhbmNlIHVzZWQgdG8gZ2V0L3NldCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzLiovCi0JcHJpdmF0ZSBPUk1HZW5UYWJsZSBkZWZhdWx0c1RhYmxlOwotCi0JcHJpdmF0ZSBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXI7Ci0JCi0JcHJpdmF0ZSBUYWJsZUdlblBhbmVsIGRlZmF1bHRUYWJsZUdlblBhbmVsIDsKLQotCXByb3RlY3RlZCBEZWZhdWx0VGFibGVHZW5lcmF0aW9uV2l6YXJkUGFnZShKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIodHJ1ZSwgIkRlZmF1bHRUYWJsZUdlbmVyYXRpb25XaXphcmRQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJc2V0VGl0bGUoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbiggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfZGVzYyk7Ci0JfQotCQotCQotCS8vIC0tLS0tLS0tIEluaXRpYWxpemF0aW9uIC0tLS0tLS0tLQotCS8qKgotCSAqIFRoZSB3aXphcmQgb3duaW5nIHRoaXMgcGFnZSBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIHRoZQotCSAqIGN1cnJlbnQgc2VsZWN0aW9uLiBUaGUgc2VsZWN0aW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGRzIG9mIHRoZSB3aXphcmQgCi0JICogcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGRzCi0JICovCi0Jdm9pZCBpbml0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJSmF2YUVsZW1lbnQgamVsZW0gPSBudWxsOwotCQlpZiAoIHNlbGVjdGlvbiE9bnVsbCAmJiBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQgKSB7Ci0JCQlqZWxlbSA9IChJSmF2YUVsZW1lbnQpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfWVsc2V7Ci0JCQlqZWxlbSA9IHRoaXMuanBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpOwkJCQotCQl9Ci0JCWlmKCBqZWxlbSAhPW51bGwgKXsKLQkJCWluaXRDb250YWluZXJQYWdlKGplbGVtKTsKLQkJCWluaXRUeXBlUGFnZShqZWxlbSk7Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWludCBuQ29sdW1ucz0gNAkJOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbkNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLkdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9DVVNUT01JWkVfREVGQVVMVF9FTlRJVFlfR0VORVJBVElPTik7Ci0KLQkJLy9DcmVhdGUgZW50aXR5IGFjY2VzcywgY29sbGVjdGlvbiB0eXBlLCBldGMgCi0JCWRlZmF1bHRUYWJsZUdlblBhbmVsID0gbmV3IFRhYmxlR2VuUGFuZWwoY29tcG9zaXRlLCA0LCB0cnVlLCB0aGlzKTsKLQkJCi0JCWNyZWF0ZURvbWFpbkphdmFDbGFzc2VzUHJvcGVydGllc0dyb3VwKGNvbXBvc2l0ZSwgNCk7Ci0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQkKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoIHRydWUgKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyID0gZ2V0Q3VzdG9taXplcigpOwotCQkJLy9JZiB1c2VyIGNoYW5nZWQgdGhlIGNvbm5lY3Rpb24gb3Igc2NoZW1hCi0JCQlpZiAoIHRoaXMuY3VzdG9taXplciAhPSBjdXN0b21pemVyICkgewotCQkJCXRoaXMuY3VzdG9taXplciA9IGN1c3RvbWl6ZXI7IAotCQkJCWRlZmF1bHRzVGFibGU9Y3VzdG9taXplci5jcmVhdGVHZW5UYWJsZShudWxsKTsKLQkJCQlkZWZhdWx0VGFibGVHZW5QYW5lbC5zZXRPUk1HZW5UYWJsZShkZWZhdWx0c1RhYmxlKTsKLQkJCQkvL3NldCB0aGUgc3VwZXIgY2xhc3MgYW5kIGltcGxlbWVudGVkIGludGVyZmFjZXMgdmFsdWUKLQkJCQlTdHJpbmcgYmFzZUNsYXNzID0gZGVmYXVsdHNUYWJsZS5nZXRFeHRlbmRzKCkgPT0gbnVsbCA/IiIgOiBkZWZhdWx0c1RhYmxlLmdldEV4dGVuZHMoKTsKLQkJCQlzZXRTdXBlckNsYXNzKGJhc2VDbGFzcywgdHJ1ZSk7Ci0JCQkJc2V0U3VwZXJJbnRlcmZhY2VzKGRlZmF1bHRzVGFibGUuZ2V0SW1wbGVtZW50cygpLCB0cnVlKTsKLQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0U291cmNlRm9sZGVyKCBkZWZhdWx0c1RhYmxlLmdldFNvdXJjZUZvbGRlcigpKTsKLQkJCQlTdHJpbmcgaW5pdFBhY2thZ2VOYW1lID0gdGhpcy5nZXRQYWNrYWdlVGV4dCgpOwotCQkJCWlmKCBpbml0UGFja2FnZU5hbWUubGVuZ3RoKCk9PTAgKXsKLQkJCQkJc2V0UGFja2FnZU5hbWUoIHJvb3QsIGRlZmF1bHRzVGFibGUuZ2V0UGFja2FnZSgpICk7Ci0JCQkJfQotCQkJCXNldFBhY2thZ2VGcmFnbWVudFJvb3Qocm9vdCwgdHJ1ZS8qY2FuQmVNb2RpZmllZCovKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvL3NlYXJjaCBmb3IgdGhlIHNvdXJjZSBmb2xkZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciByZXR1cm4gdGhlIGZpcnN0Ci0JLy9zb3VyY2UgZm9sZGVyIGlmIG5vdCBmb3VuZC4KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFNvdXJjZUZvbGRlcihTdHJpbmcgc3JjRm9sZGVyKSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSBudWxsOwotCQlzcmNGb2xkZXIgPSAnLycgKyBzcmNGb2xkZXI7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IHRoaXMuanBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpOwotCi0JCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IEpEVFRvb2xzLmdldEphdmFTb3VyY2VGb2xkZXJzKGphdmFQcm9qZWN0KSkgewotCQkJLy9TYXZlIHRoZSBmaXJzdCBzb3VyY2Ugcm9vdCBpbiBjYXNlIHdlIGRvbid0IGZpbmQgb25lIHRoYXQgbWF0Y2hlcyB0aGUgc2F2ZWQgdmFsdWUKLQkJCWlmIChwYWNrYWdlRnJhZ21lbnRSb290ID09IG51bGwpIHsKLQkJCQlwYWNrYWdlRnJhZ21lbnRSb290ID0gcm9vdDsKLQkJCX0KLQkJCS8vY2hlY2sgZm9yIGFsdGVybmF0aXZlIHNvdXJjZSByb290IHRoYXQgbWF0Y2hlcyB0aGUgc2F2ZWQgdmFsdWUKLQkJCWlmIChyb290LmdldFBhdGgoKS50b1N0cmluZygpLmVxdWFscyhzcmNGb2xkZXIpKXsKLQkJCQlwYWNrYWdlRnJhZ21lbnRSb290ID0gcm9vdDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50Um9vdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFBhY2thZ2VOYW1lKElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QsIFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQlpZiggcGFja2FnZU5hbWUgPT0gbnVsbCB8fCBwYWNrYWdlTmFtZS5sZW5ndGgoKSA9PSAwIHx8IHBhY2thZ2VGcmFnbWVudFJvb3Q9PW51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKTsKLQkJc2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VGcmFnbWVudCwgdHJ1ZS8qY2FuQmVNb2RpZmllZCovKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvbWFpbkphdmFDbGFzc2VzUHJvcGVydGllc0dyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5zKSB7Ci0JCUdyb3VwIHBhcmVudCA9IG5ldyBHcm91cCggY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9kb21haW5KYXZhQ2xhc3MpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCBjb2x1bW5zLCBmYWxzZSkpOwotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5zOwotCQlsYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJcGFyZW50LnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCQotCQkvL2RlZmF1bHQgSmF2YSBwYWNrYWdlIG5hbWUgb25seSBhdmFpbGFibGUgZm9yIGRlZmF1bHQgdGFibGUgZ2VuZXJhdGlvbgotCQljcmVhdGVDb250YWluZXJDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOwotCQljcmVhdGVQYWNrYWdlQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKLQkJY3JlYXRlU3VwZXJDbGFzc0NvbnRyb2xzKHBhcmVudCwgY29sdW1ucyk7Ci0JCWNyZWF0ZVN1cGVySW50ZXJmYWNlc0NvbnRyb2xzKHBhcmVudCwgY29sdW1ucyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJU3RhdHVzIHBhY2thZ2VDaGFuZ2VkKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnBhY2thZ2VDaGFuZ2VkKCk7IAotCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IGdldFBhY2thZ2VGcmFnbWVudCgpOwotCQkvL1N0cmluZyBzcmNGb2xkZXIgPSBwYWNrYWdlRnJhZ21lbnQuZ2V0UGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKTsKLQkJaWYgKGRlZmF1bHRzVGFibGUgIT0gbnVsbCAmJiAhc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsKLQkJCWRlZmF1bHRzVGFibGUuc2V0UGFja2FnZShwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9CQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElTdGF0dXMgc3VwZXJDbGFzc0NoYW5nZWQoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIuc3VwZXJDbGFzc0NoYW5nZWQoKTsKLQkJU3RyaW5nIGJhc2VDbGFzcyA9IGdldFN1cGVyQ2xhc3MoKTsKLQkJaWYgKGJhc2VDbGFzcyAhPSBudWxsICYmIGRlZmF1bHRzVGFibGUgIT0gbnVsbCAmJiAhc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsKLQkJCVN0cmluZyBvbGRCYXNlQ2xhc3MgPSBkZWZhdWx0c1RhYmxlLmdldEV4dGVuZHMoKTsKLQkJCWlmICggIWJhc2VDbGFzcy5lcXVhbHMob2xkQmFzZUNsYXNzKSkgewotCQkJCWRlZmF1bHRzVGFibGUuc2V0RXh0ZW5kcyhiYXNlQ2xhc3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7IAotCX0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElTdGF0dXMgY29udGFpbmVyQ2hhbmdlZCgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci5jb250YWluZXJDaGFuZ2VkKCk7Ci0JCVN0cmluZyBzcmNGb2xkZXIgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290VGV4dCgpOwotCQlpZiggIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpICl7Ci0JCQlpZiAoZGVmYXVsdHNUYWJsZSAhPSBudWxsICkgewotCQkJCWRlZmF1bHRzVGFibGUuc2V0U291cmNlRm9sZGVyKCBzcmNGb2xkZXIgKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKiBPdmVycmlkZSB0byBhbGxvdyBzZWxlY3Qgc291cmNlIGZvbGRlciBpbiBjdXJyZW50IHByb2plY3Qgb25seQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3Q29udGFpbmVyV2l6YXJkUGFnZSNjaG9vc2VDb250YWluZXIoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBjaG9vc2VDb250YWluZXIoKSB7Ci0JCUNsYXNzPD8+W10gYWNjZXB0ZWRDbGFzc2VzID0gbmV3IENsYXNzW10geyBJUGFja2FnZUZyYWdtZW50Um9vdC5jbGFzcywgSUphdmFQcm9qZWN0LmNsYXNzIH07Ci0JCVR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvciB2YWxpZGF0b3I9IG5ldyBUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IoYWNjZXB0ZWRDbGFzc2VzLCBmYWxzZSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkVmFsaWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJCQkJSUphdmFQcm9qZWN0IGpwcm9qZWN0PSAoSUphdmFQcm9qZWN0KWVsZW1lbnQ7Ci0JCQkJCQlJUGF0aCBwYXRoPSBqcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCXJldHVybiAoanByb2plY3QuZmluZFBhY2thZ2VGcmFnbWVudFJvb3QocGF0aCkgIT0gbnVsbCk7Ci0JCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJCQlyZXR1cm4gSkRUVG9vbHMucGFja2FnZUZyYWdtZW50Um9vdElzU291cmNlRm9sZGVyKChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJSnB0VWlQbHVnaW4ubG9nKGUpOyAvLyBqdXN0IGxvZywgbm8gVUkgaW4gdmFsaWRhdGlvbgotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0KLQkJYWNjZXB0ZWRDbGFzc2VzPSBuZXcgQ2xhc3NbXSB7IElKYXZhTW9kZWwuY2xhc3MsIElQYWNrYWdlRnJhZ21lbnRSb290LmNsYXNzLCBJSmF2YVByb2plY3QuY2xhc3MgfTsKLQkJVmlld2VyRmlsdGVyIGZpbHRlcj0gbmV3IFR5cGVkVmlld2VyRmlsdGVyKGFjY2VwdGVkQ2xhc3NlcykgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJCXJldHVybiBKRFRUb29scy5wYWNrYWdlRnJhZ21lbnRSb290SXNTb3VyY2VGb2xkZXIoKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLnNlbGVjdCh2aWV3ZXIsIHBhcmVudCwgZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0KLQkJU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlciBwcm92aWRlcj0gbmV3IFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIoKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcj0gbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcihKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuU0hPV19ERUZBVUxUKTsKLQkJRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgbGFiZWxQcm92aWRlciwgcHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0VmFsaWRhdG9yKHZhbGlkYXRvcik7Ci0JCWRpYWxvZy5zZXRDb21wYXJhdG9yKG5ldyBKYXZhRWxlbWVudENvbXBhcmF0b3IoKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShOZXdXaXphcmRNZXNzYWdlcy5OZXdDb250YWluZXJXaXphcmRQYWdlX0Nob29zZVNvdXJjZUNvbnRhaW5lckRpYWxvZ190aXRsZSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKE5ld1dpemFyZE1lc3NhZ2VzLk5ld0NvbnRhaW5lcldpemFyZFBhZ2VfQ2hvb3NlU291cmNlQ29udGFpbmVyRGlhbG9nX2Rlc2NyaXB0aW9uKTsKLQkJZGlhbG9nLmFkZEZpbHRlcihmaWx0ZXIpOwotCQlkaWFsb2cuc2V0SW5wdXQoanBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpKTsKLQkJZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb24oZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpKTsKLQkJZGlhbG9nLnNldEhlbHBBdmFpbGFibGUoZmFsc2UpOwotCi0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJT2JqZWN0IGVsZW1lbnQ9IGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKLQkJCQlJSmF2YVByb2plY3QganByb2plY3Q9IChJSmF2YVByb2plY3QpZWxlbWVudDsKLQkJCQlyZXR1cm4ganByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChqcHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCQlyZXR1cm4gKElQYWNrYWdlRnJhZ21lbnRSb290KWVsZW1lbnQ7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRmllbGRDaGFuZ2VkKFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJc3VwZXIuaGFuZGxlRmllbGRDaGFuZ2VkKGZpZWxkTmFtZSk7Ci0JCWlmICh0aGlzLmZDb250YWluZXJTdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotCQkJdXBkYXRlU3RhdHVzKGZDb250YWluZXJTdGF0dXMpOwotCQl9ZWxzZSBpZiggISB0aGlzLmZQYWNrYWdlU3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5PSykgKSB7Ci0JCQl1cGRhdGVTdGF0dXMoZlBhY2thZ2VTdGF0dXMpOwotCQl9IGVsc2UgaWYgKHRoaXMuZlN1cGVyQ2xhc3NTdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotCQkJdXBkYXRlU3RhdHVzKGZTdXBlckNsYXNzU3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCXVwZGF0ZVN0YXR1cyhTdGF0dXMuT0tfU1RBVFVTKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAicmF3dHlwZXMiIH0pCi0JcHJvdGVjdGVkIElTdGF0dXMgc3VwZXJJbnRlcmZhY2VzQ2hhbmdlZCgpIHsKLQkJSVN0YXR1cyByZXQgPSBzdXBlci5zdXBlckludGVyZmFjZXNDaGFuZ2VkKCk7Ci0JCWlmICggcmV0LmlzT0soKSApIHsKLQkJCUxpc3QgaW50ZXJmYWNlcyA9IGdldFN1cGVySW50ZXJmYWNlcygpOwotCQkJaWYoZGVmYXVsdHNUYWJsZSE9bnVsbCkKLQkJCQlkZWZhdWx0c1RhYmxlLnNldEltcGxlbWVudHMoaW50ZXJmYWNlcyk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9CQotCi0JcHJpdmF0ZSBPUk1HZW5DdXN0b21pemVyIGdldEN1c3RvbWl6ZXIoKSB7Ci0JCUdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkIHdpemFyZCA9IChHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCkgdGhpcy5nZXRXaXphcmQoKTsKLQkJcmV0dXJuIHdpemFyZC5nZXRDdXN0b21pemVyKCk7Ci0JfQkKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHBlcmZvcm1IZWxwKCkgewotICAgICAgICB0aGlzLmdldEhlbHBTeXN0ZW0oKS5kaXNwbGF5SGVscCggR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQuSEVMUF9DT05URVhUX0lEICk7Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9HZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzNTJjMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9HZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VSdWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkxvY2FsUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuQmFzZUVudGl0eUdlbkN1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5EYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLk9STUdlbkN1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5PUk1HZW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLlBhY2thZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQgZXh0ZW5kcyBXaXphcmQgCi0JaW1wbGVtZW50cyBJTmV3V2l6YXJkICB7CQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFTFBfQ09OVEVYVF9JRCA9IEpwdFVpUGx1Z2luLlBMVUdJTl9JRCArICIuR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9OVF9TSE9XX09WRVJXUklURV9XQVJOSU5HX0RJQUxPRyA9ICJET05UX1NIT1dfT1ZFUldSSVRFX1dBUk5JTkdfRElBTE9HIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyID0gbnVsbDsJCi0KLQlwcml2YXRlIFByb21wdEpQQVByb2plY3RXaXphcmRQYWdlIHByb2plY3RQYWdlOwkKLQotCXByaXZhdGUgVGFibGVzU2VsZWN0b3JXaXphcmRQYWdlIHRhYmxlc1NlbGVjdG9yUGFnZTsKLQotCXByaXZhdGUgVGFibGVBc3NvY2lhdGlvbnNXaXphcmRQYWdlIHRhYmxlQXNzb2NpYXRpb25zUGFnZTsKLQkKLQlwcml2YXRlIERlZmF1bHRUYWJsZUdlbmVyYXRpb25XaXphcmRQYWdlIGRlZmF1bHRUYWJsZUdlbmVyYXRpb25QYWdlOwotCQotCXByaXZhdGUgVGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25XaXphcmRQYWdlIHRhYmxlc0FuZENvbHVtbnNDdXN0b21pemF0aW9uUGFnZTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcjsKLQkKLQlwdWJsaWMgR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQoKSB7Ci0JCXRoaXMucmVzb3VyY2VNYW5hZ2VyID0gbmV3IExvY2FsUmVzb3VyY2VNYW5hZ2VyKEpGYWNlUmVzb3VyY2VzLmdldFJlc291cmNlcygpKTsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZSggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2dlbmVyYXRlRW50aXRpZXMpOwotCX0KLQkKLQlwdWJsaWMgR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQoIEpwYVByb2plY3QganBhUHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQl0aGlzLnJlc291cmNlTWFuYWdlciA9IG5ldyBMb2NhbFJlc291cmNlTWFuYWdlcihKRmFjZVJlc291cmNlcy5nZXRSZXNvdXJjZXMoKSk7Ci0JCXRoaXMuc2V0V2luZG93VGl0bGUoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9nZW5lcmF0ZUVudGl0aWVzKTsKLQkJdGhpcy5zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKcHRVaVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoSnB0VWlJY29ucy5FTlRJVFlfV0laX0JBTk5FUikpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCQkKLQkJLy9JZiB0aGlzLmpwYVByb2plY3QgaXMgbm90IGluaXRpYWxpemVkIGJlY2F1c2UgdXNlciBkaWRuJ3Qgc2VsZWN0IGEgSlBBIHByb2plY3QKLQkJaWYoIHRoaXMuanBhUHJvamVjdCA9PSBudWxsICl7Ci0JCQl0aGlzLnByb2plY3RQYWdlID0gbmV3IFByb21wdEpQQVByb2plY3RXaXphcmRQYWdlKEhFTFBfQ09OVEVYVF9JRCk7Ci0JCQl0aGlzLmFkZFBhZ2UodGhpcy5wcm9qZWN0UGFnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYWRkTWFpblBhZ2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE1haW5QYWdlcygpIHsKLQkJdGhpcy50YWJsZXNTZWxlY3RvclBhZ2UgPSBuZXcgVGFibGVzU2VsZWN0b3JXaXphcmRQYWdlKHRoaXMuanBhUHJvamVjdCwgdGhpcy5yZXNvdXJjZU1hbmFnZXIpOwotCQl0aGlzLmFkZFBhZ2UodGhpcy50YWJsZXNTZWxlY3RvclBhZ2UpOwotCQkKLQkJdGhpcy50YWJsZUFzc29jaWF0aW9uc1BhZ2UgPSBuZXcgVGFibGVBc3NvY2lhdGlvbnNXaXphcmRQYWdlKHRoaXMuanBhUHJvamVjdCwgdGhpcy5yZXNvdXJjZU1hbmFnZXIpOwotCQl0aGlzLmFkZFBhZ2UodGhpcy50YWJsZUFzc29jaWF0aW9uc1BhZ2UpOwotCi0JCXRoaXMuZGVmYXVsdFRhYmxlR2VuZXJhdGlvblBhZ2UgPSBuZXcgRGVmYXVsdFRhYmxlR2VuZXJhdGlvbldpemFyZFBhZ2UodGhpcy5qcGFQcm9qZWN0KTsKLQkJdGhpcy5hZGRQYWdlKHRoaXMuZGVmYXVsdFRhYmxlR2VuZXJhdGlvblBhZ2UpOwotCQl0aGlzLmRlZmF1bHRUYWJsZUdlbmVyYXRpb25QYWdlLmluaXQodGhpcy5zZWxlY3Rpb24pOwotCQkKLQkJdGhpcy50YWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvblBhZ2UgPSBuZXcgVGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25XaXphcmRQYWdlKHRoaXMuanBhUHJvamVjdCwgdGhpcy5yZXNvdXJjZU1hbmFnZXIpOwotCQl0aGlzLmFkZFBhZ2UodGhpcy50YWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvblBhZ2UpOwotCQl0aGlzLnRhYmxlc0FuZENvbHVtbnNDdXN0b21pemF0aW9uUGFnZS5pbml0KHRoaXMuc2VsZWN0aW9uKTsJCQotCX0KLQkKLQlwdWJsaWMgT1JNR2VuQ3VzdG9taXplciBnZXRPUk1HZW5DdXN0b21pemVyKCl7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBPUk1HZW5DdXN0b21pemVyIHdoZW4gdXNlciBzZWxlY3RzIGEgbmV3IGNvbm5lY3Rpb24gcHJvZmlsZSBhbmQgc2NoZW1hIAotCSAqIAotCSAqIEpwYVBsYXRmb3JtIGltcGxlbWVudG9yIGNhbiBwcm92aWRlIGEgY3VzdG9tIE9STUdlbkN1c3RvbWl6ZXIgc3BlY2lmaWMgdG8gYSBwbGF0Zm9ybQotCSAqIHdpdGggQWRhcHRlckZhY3RvcnkgdGhyb3VnaCBFY2xpcHNlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyBleHRlbnNpb24gcG9pbnQ6Ci0JICogPHByZT4gCi0JICogIAotCSAqPGV4dGVuc2lvbgotICAgICAqICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAqIDxmYWN0b3J5Ci0gICAgICogICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtQbGF0Zm9ybSIKLSAgICAgKiAgICAgICBjbGFzcz0ib3JhY2xlLmVjbGlwc2UudG9vbHMub3JtLmludGVybmFsLkVjbGlwc2VMaW5rT1JNR2VuQ3VzdG9taXplckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgKiAgICA8YWRhcHRlcgotICAgICAqICAgICAgICAgIHR5cGU9Im9yYWNsZS5lY2xpcHNlLnRvb2xzLm9ybS5pbnRlcm5hbC5PUk1HZW5DdXN0b21pemVyIj4KLSAgICAgKiAgICA8L2FkYXB0ZXI+Ci0gICAgICogPC9mYWN0b3J5PgotICAgICAqPC9leHRlbnNpb24+Ci0JICo8L3ByZT4gCi0JICogCi0JICogQHBhcmFtIHNjaGVtYSAKLQkgKi8KLQlwdWJsaWMgT1JNR2VuQ3VzdG9taXplciBjcmVhdGVPUk1HZW5DdXN0b21pemVyKFNjaGVtYSBzY2hlbWEpewotCQlKcGFQbGF0Zm9ybSBqcGFQbGF0Zm9ybSA9IHRoaXMuanBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpOwotCQlPYmplY3Qgb2JqID0gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKCBqcGFQbGF0Zm9ybSwgT1JNR2VuQ3VzdG9taXplci5jbGFzcyApOwotCQlpZiAob2JqICE9IG51bGwgICYmIG9iaiBpbnN0YW5jZW9mIE9STUdlbkN1c3RvbWl6ZXIpIHsKLQkJCXRoaXMuY3VzdG9taXplciA9IChPUk1HZW5DdXN0b21pemVyKSBvYmo7IAotCQkJdGhpcy5jdXN0b21pemVyLmluaXQoZ2V0Q3VzdG9taXphdGlvbkZpbGUoKSwgc2NoZW1hKTsgIAotCQl9IGVsc2V7Ci0JCQl0aGlzLmN1c3RvbWl6ZXIgPSBuZXcgQmFzZUVudGl0eUdlbkN1c3RvbWl6ZXIoICk7Ci0JCQl0aGlzLmN1c3RvbWl6ZXIuaW5pdChnZXRDdXN0b21pemF0aW9uRmlsZSgpLCBzY2hlbWEpOyAgCi0JCX0KLQotCQlPUk1HZW5UYWJsZSBuZXdEZWZhdWx0VGFibGUgPSBnZXRDdXN0b21pemVyKCkuY3JlYXRlR2VuVGFibGUobnVsbCk7Ci0JCWlmICggc2VsZWN0aW9uIT1udWxsICYmIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQgKSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnID0gKElQYWNrYWdlRnJhZ21lbnQpc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJbmV3RGVmYXVsdFRhYmxlLnNldFBhY2thZ2UoIHBhY2thZ2VGcmFnLmdldEVsZW1lbnROYW1lKCkgKTsKLQkJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IEpEVFRvb2xzLmdldEphdmFTb3VyY2VGb2xkZXJzKHRoaXMuanBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpKSkgewotCQkJCVN0cmluZyBzcmNGb2xkZXIgPSByb290LmdldFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0JCQkJaWYoIHBhY2thZ2VGcmFnLmdldFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCkuc3RhcnRzV2l0aCggc3JjRm9sZGVyICsnLycgKSl7Ci0JCQkJCW5ld0RlZmF1bHRUYWJsZS5zZXRTb3VyY2VGb2xkZXIoc3JjRm9sZGVyLnN1YnN0cmluZygxKSk7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKLQl9IAotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9taXphdGlvbkZpbGVOYW1lKCkgewotCQlDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlID0gZ2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCVN0cmluZyBjb25uZWN0aW9uID0gcHJvZmlsZSA9PSBudWxsID8gIiIgOiBwcm9maWxlLmdldE5hbWUoKTsKLQkJU3RyaW5nIG5hbWUgPSAib3JnLmVjbGlwc2UuanB0LmVudGl0eWdlbi4iICsgKGNvbm5lY3Rpb24gPT0gbnVsbCA/ICIiIDpjb25uZWN0aW9uLnJlcGxhY2UoJyAnLCAnLScpKTsgIC8vJE5PTi1OTFMtMSQKLQkJU2NoZW1hIHNjaGVtYSA9IGdldERlZmF1bHRTY2hlbWEoKTsKLQkJaWYgKCBzY2hlbWEhPSBudWxsICApIHsKLQkJCW5hbWUgKz0gIi4iICsgc2NoZW1hLmdldE5hbWUoKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbm9kZXMgc3RhdGUgZmlsZS4gCi0JICovCi0JcHJpdmF0ZSBGaWxlIGdldEN1c3RvbWl6YXRpb25GaWxlKCkgewotCQlTdHJpbmcgcHJvamVjdFBhdGggPSB0aGlzLmpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9Qb3J0YWJsZVN0cmluZygpOwotCQlGaWxlIGdlbkRpciA9IG5ldyBGaWxlKHByb2plY3RQYXRoICsgIi8uc2V0dGluZ3MiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGdlbkRpci5ta2RpcnMoKTsKLQkJcmV0dXJuIG5ldyBGaWxlKGdlbkRpciwgZ2V0Q3VzdG9taXphdGlvbkZpbGVOYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWlmICh0aGlzLmpwYVByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJdHJ5IHsKLQkJCXRoaXMuY3VzdG9taXplci5zZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciggYnVpbGREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpICk7Ci0JCQl0aGlzLmN1c3RvbWl6ZXIuc2F2ZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lciA9IG51bGw7Ci0JCWlmIChzaG91bGRTaG93T3ZlcndyaXRlV2FybmluZygpKSB7Ci0JCQlvdmVyd3JpdGVDb25maXJtZXIgPSBuZXcgT3ZlcndyaXRlQ29uZmlybWVyKCk7Ci0JCX0KLQkJCi0JCVdvcmtzcGFjZUpvYiBnZW5FbnRpdGllc0pvYiA9IG5ldyBHZW5lcmF0ZUVudGl0aWVzSm9iKHRoaXMuanBhUHJvamVjdCwgZ2V0Q3VzdG9taXplcigpLCBvdmVyd3JpdGVDb25maXJtZXIpOwotCQlnZW5FbnRpdGllc0pvYi5zY2hlZHVsZSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBnZW5lcmF0ZSBlbnRpdGllcyBqb2IgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIEdlbmVyYXRlRW50aXRpZXNKb2IgZXh0ZW5kcyBXb3Jrc3BhY2VKb2IgewotCQlmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0JCWZpbmFsIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplcjsKLQkJZmluYWwgT3ZlcndyaXRlQ29uZmlybWVyIGNvbmZpcm1lcjsKLQkJR2VuZXJhdGVFbnRpdGllc0pvYihKcGFQcm9qZWN0IGpwYVByb2plY3QsIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgT3ZlcndyaXRlQ29uZmlybWVyIGNvbmZpcm1lcikgewotCQkJc3VwZXIoSnB0VWlNZXNzYWdlcy5FbnRpdGllc0dlbmVyYXRvcl9qb2JOYW1lKTsKLQkJCXRoaXMuY3VzdG9taXplciA9IGN1c3RvbWl6ZXI7Ci0JCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQkJdGhpcy5jb25maXJtZXIgPSBjb25maXJtZXI7Ci0JCQlJUmVzb3VyY2VSdWxlRmFjdG9yeSBydWxlRmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOwotCQkJdGhpcy5zZXRSdWxlKHJ1bGVGYWN0b3J5Lm1vZGlmeVJ1bGUoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCVBhY2thZ2VHZW5lcmF0b3IuZ2VuZXJhdGUodGhpcy5qcGFQcm9qZWN0LHRoaXMuY3VzdG9taXplciwgdGhpcy5jb25maXJtZXIsIG1vbml0b3IpOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkU2hvd092ZXJ3cml0ZVdhcm5pbmcoKXsKLSAgICAJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmID0gbmV3IEluc3RhbmNlU2NvcGUoKS5nZXROb2RlKEpwdFVpUGx1Z2luLlBMVUdJTl9JRCk7IAotICAgIAlib29sZWFuIHJldCA9ICEgcHJlZi5nZXRCb29sZWFuKCBET05UX1NIT1dfT1ZFUldSSVRFX1dBUk5JTkdfRElBTE9HLCBmYWxzZSkgOwotICAgIAlyZXR1cm4gcmV0OwotICAgIH0KLSAgICAKLSAgICAvLyAqKioqKioqKioqIG92ZXJ3cml0ZSBjb25maXJtZXIgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIE92ZXJ3cml0ZUNvbmZpcm1lciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuT3ZlcndyaXRlQ29uZmlybWVyIHsKLQkJcHJpdmF0ZSBib29sZWFuIG92ZXJ3cml0ZUFsbCA9IGZhbHNlOwotCQlwcml2YXRlIGJvb2xlYW4gc2tpcEFsbCA9IGZhbHNlOwotCi0JCU92ZXJ3cml0ZUNvbmZpcm1lcigpIHsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG92ZXJ3cml0ZShmaW5hbCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQlpZiAodGhpcy5vdmVyd3JpdGVBbGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmICh0aGlzLnNraXBBbGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5wcm9tcHRVc2VyKGNsYXNzTmFtZSk7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gcHJvbXB0VXNlcihmaW5hbCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQkvLyBnZXQgb24gdGhlIFVJIHRocmVhZCBzeW5jaHJvbm91c2x5LCBuZWVkIGZlZWRiYWNrIGJlZm9yZSBjb250aW51aW5nCi0JCQlmaW5hbCBib29sZWFuIHJldFtdPW5ldyBib29sZWFuWzFdOwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZmluYWwgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nIGRpYWxvZyA9IG5ldyBPdmVyd3JpdGVDb25maXJtZXJEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgY2xhc3NOYW1lKTsKLQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJCQkJLy90aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQkJCXNraXBBbGwgPSB0cnVlOwotCQkJCQkJcmV0WzBdID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKGRpYWxvZy55ZXMoKSkgewotCQkJCQkJcmV0WzBdID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlpZiAoZGlhbG9nLnllc1RvQWxsKCkpIHsKLQkJCQkJCW92ZXJ3cml0ZUFsbCA9IHRydWU7Ci0JCQkJCQlyZXRbMF0gPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmIChkaWFsb2cubm8oKSkgewotCQkJCQkJcmV0WzBdID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJaWYgKGRpYWxvZy5ub1RvQWxsKCkpIHsKLQkJCQkJCXNraXBBbGwgPSB0cnVlOwotCQkJCQkJcmV0WzBdID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCXJldHVybiByZXRbMF07Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVyd3JpdGUgZGlhbG9nICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBPdmVyd3JpdGVDb25maXJtZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBjbGFzc05hbWU7Ci0JCXByaXZhdGUgYm9vbGVhbiB5ZXMgPSBmYWxzZTsKLQkJcHJpdmF0ZSBib29sZWFuIHllc1RvQWxsID0gZmFsc2U7Ci0JCXByaXZhdGUgYm9vbGVhbiBubyA9IGZhbHNlOwotCQlwcml2YXRlIGJvb2xlYW4gbm9Ub0FsbCA9IGZhbHNlOwotCi0JCU92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCXN1cGVyKHBhcmVudCk7Ci0JCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQkJc2hlbGwuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLk92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZ190aXRsZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0KLQkJCUxhYmVsIHRleHQgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCQl0ZXh0LnNldFRleHQoTkxTLmJpbmQoSnB0VWlNZXNzYWdlcy5PdmVyd3JpdGVDb25maXJtZXJEaWFsb2dfdGV4dCwgdGhpcy5jbGFzc05hbWUpKTsKLQkJCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQkKLQkJCWNyZWF0ZURvbnRTaG93Q29udHJvbChjb21wb3NpdGUpOwotCQkJCi0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0JICAgIAotCSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEb250U2hvd0NvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCSAgICAJZmluYWwgQnV0dG9uIGNoZWNrYm94ID0gbmV3IEJ1dHRvbiggY29tcG9zaXRlLCBTV1QuQ0hFQ0sgKTsKLQkgICAgCWNoZWNrYm94LnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kb05vdFNob3dXYXJuaW5nICk7Ci0JICAgIAljaGVja2JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCSAgICAJZmluYWwgSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmID0gbmV3IEluc3RhbmNlU2NvcGUoKS5nZXROb2RlKCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQpOyAKLQkgICAgCWNoZWNrYm94LnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpICk7Ci0JICAgIAljaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIgKCl7Ci0JICAgIAkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlib29sZWFuIGIgPSBjaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQkgICAgICAgICAgICAgICAgcHJlZi5wdXRCb29sZWFuKCBET05UX1NIT1dfT1ZFUldSSVRFX1dBUk5JTkdfRElBTE9HLCBiKTsKLQkJCQl9Ci0JICAgIAl9KTsKLQkgICAgCXJldHVybiBjaGVja2JveDsKLQkgICAgfQotCSAgICAKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIGZhbHNlKTsKLQkJCXRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lELCBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfTEFCRUwsIGZhbHNlKTsKLQkJCXRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5OT19JRCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwgdHJ1ZSk7Ci0JCQl0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuTk9fVE9fQUxMX0lELCBJRGlhbG9nQ29uc3RhbnRzLk5PX1RPX0FMTF9MQUJFTCwgZmFsc2UpOwotCQkJdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQkJc3dpdGNoIChidXR0b25JZCkgewotCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQgOgotCQkJCQl0aGlzLnllc1ByZXNzZWQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQgOgotCQkJCQl0aGlzLnllc1RvQWxsUHJlc3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuTk9fSUQgOgotCQkJCQl0aGlzLm5vUHJlc3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuTk9fVE9fQUxMX0lEIDoKLQkJCQkJdGhpcy5ub1RvQWxsUHJlc3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEIDoKLQkJCQkJdGhpcy5jYW5jZWxQcmVzc2VkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCB5ZXNQcmVzc2VkKCkgewotCQkJdGhpcy55ZXMgPSB0cnVlOwotCQkJdGhpcy5zZXRSZXR1cm5Db2RlKE9LKTsKLQkJCXRoaXMuY2xvc2UoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB5ZXNUb0FsbFByZXNzZWQoKSB7Ci0JCQl0aGlzLnllc1RvQWxsID0gdHJ1ZTsKLQkJCXRoaXMuc2V0UmV0dXJuQ29kZShPSyk7Ci0JCQl0aGlzLmNsb3NlKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgbm9QcmVzc2VkKCkgewotCQkJdGhpcy5ubyA9IHRydWU7Ci0JCQl0aGlzLnNldFJldHVybkNvZGUoT0spOwotCQkJdGhpcy5jbG9zZSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIG5vVG9BbGxQcmVzc2VkKCkgewotCQkJdGhpcy5ub1RvQWxsID0gdHJ1ZTsKLQkJCXRoaXMuc2V0UmV0dXJuQ29kZShPSyk7Ci0JCQl0aGlzLmNsb3NlKCk7Ci0JCX0KLQotCQlib29sZWFuIHllcygpIHsKLQkJCXJldHVybiB0aGlzLnllczsKLQkJfQotCi0JCWJvb2xlYW4geWVzVG9BbGwoKSB7Ci0JCQlyZXR1cm4gdGhpcy55ZXNUb0FsbDsKLQkJfQotCi0JCWJvb2xlYW4gbm8oKSB7Ci0JCQlyZXR1cm4gdGhpcy5ubzsKLQkJfQotCi0JCWJvb2xlYW4gbm9Ub0FsbCgpIHsKLQkJCXJldHVybiB0aGlzLm5vVG9BbGw7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgYnVpbGREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKHRoaXMuanBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpLmdldEVudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogbmFtZSBidWlsZGVyIGFkYXB0ZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogYWRhcHQgdGhlIEpQQSBwbGF0Zm9ybS1zdXBwbGllZCBidWlsZGVyIHRvIHRoZSBidWlsZGVyIGludGVyZmFjZQotCSAqIGV4cGVjdGVkIGJ5IHRoZSBlbnRpdHkgZ2VuZXJhdG9yCi0JICovCi0Jc3RhdGljIGNsYXNzIExvY2FsRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgaW1wbGVtZW50cyBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciB7Ci0JCXByaXZhdGUgRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgYnVpbGRlcjsKLQkJTG9jYWxEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcihFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBidWlsZGVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5idWlsZGVyID0gYnVpbGRlcjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGJ1aWxkVGFibGVBbm5vdGF0aW9uTmFtZShTdHJpbmcgZW50aXR5TmFtZSwgVGFibGUgdGFibGUpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkZXIuYnVpbGRUYWJsZUFubm90YXRpb25OYW1lKGVudGl0eU5hbWUsIHRhYmxlKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGJ1aWxkQ29sdW1uQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkZXIuYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShhdHRyaWJ1dGVOYW1lLCBjb2x1bW4pOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShhdHRyaWJ1dGVOYW1lLCBmb3JlaWduS2V5KTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkZXIuYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoY29sdW1uKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbk5hbWUoVGFibGUgdGFibGUpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkZXIuYnVpbGRKb2luVGFibGVBbm5vdGF0aW9uTmFtZSh0YWJsZSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldFN0YXJ0aW5nUGFnZSgpIHsKLQkJaWYgKHRoaXMucHJvamVjdFBhZ2UgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMudGFibGVzU2VsZWN0b3JQYWdlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhpcy50YWJsZXNTZWxlY3RvclBhZ2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5wcm9qZWN0UGFnZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U3RhcnRpbmdQYWdlKCk7Ci0gICAgfQotCQotCXB1YmxpYyBPUk1HZW5DdXN0b21pemVyIGdldEN1c3RvbWl6ZXIgKCl7Ci0JCXJldHVybiBjdXN0b21pemVyOwotCX0gCi0vLwlDb2xsZWN0aW9uPFRhYmxlPiBnZXRQb3NzaWJsZVRhYmxlcygpIHsKLS8vCQlpZiAoIHRoaXMudGFibGVzU2VsZWN0b3JQYWdlICE9IG51bGwpIHsKLS8vCQkJcmV0dXJuIHRoaXMudGFibGVzU2VsZWN0b3JQYWdlLmdldFRhYmxlcygpOwotLy8JCX0KLS8vCQlyZXR1cm4gKCB0aGlzLnByb2plY3REZWZhdWx0U2NoZW1hRXhpc3RzKCkpID8gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oIHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLnRhYmxlcygpKSA6IENvbGxlY3Rpb25zLjxUYWJsZT5lbXB0eUxpc3QoKTsKLS8vCX0KLQkKLQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgZ2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCQotCXB1YmxpYyBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKXsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SnBhUHJvamVjdChKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJaWYgKHRoaXMuanBhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQkJSVdpemFyZFBhZ2UgY3VycmVudFBhZ2UgPSBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpOwotCQkJaWYgKHRoaXMucHJvamVjdFBhZ2UgIT0gbnVsbCAmJiBjdXJyZW50UGFnZS5lcXVhbHModGhpcy5wcm9qZWN0UGFnZSkpIHsKLQkJCQlhZGRNYWluUGFnZXMoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTY2hlbWEgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIGdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RGJTY2hlbWEoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IHNlbCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKCBzZWwgaW5zdGFuY2VvZiBJUmVzb3VyY2UgKSB7Ci0JCQlJUHJvamVjdCBwcm9qID0gKChJUmVzb3VyY2UpIHNlbCkuZ2V0UHJvamVjdCgpOwotCQkJSnBhUHJvamVjdCBqcGFQcm9qID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2opOwotCQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvajsKLQkJfSBlbHNlIGlmKCBzZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdCApIHsKLQkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAob3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3QpIHNlbDsKLQkJCUlQcm9qZWN0IHByb2ogPSByb290LmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQkJSnBhUHJvamVjdCBqcGFQcm9qID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2opOwotCQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvajsKLQkJfSBlbHNlIGlmKCBzZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50KSB7Ci0JCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50IGZyYWcgPSAob3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCkgc2VsOwotCQkJSVByb2plY3QgcHJvaiA9IGZyYWcuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCQlKcGFQcm9qZWN0IGpwYVByb2ogPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvaik7Ci0JCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qOwotCQl9Ci0JCQotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZShKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZ2VuZXJhdGVFbnRpdGllcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5yZXNvdXJjZU1hbmFnZXIuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vSm9pbkNvbHVtbnNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Kb2luQ29sdW1uc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzY2UzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Kb2luQ29sdW1uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSVBhZ2VDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5QYWdlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuQXNzb2NpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5PUk1HZW5DdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlRhYmxlTGF5b3V0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi0KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uc1BhZ2UgZXh0ZW5kcyBOZXdBc3NvY2lhdGlvbldpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBMYWJlbCBqb2luQ29sdW1uc0Rlc2NMYWJlbDE7Ci0JLyp0aGUgdGFibGUgY29udGFpbmluZyB0aGUgYXNzb2NpYXRpb24gY29sdW1ucyBiZXR3ZWVuIHRhYmxlMSBhbmQgdGFibGUyCi0JICogLCBvciB0YWJsZTEgYW5kIGpvaW4gdGFibGUgaWYgbWFueSB0byBtYW55Ki8KLQlwcml2YXRlIFRhYmxlVmlld2VyIGpvaW5Db2x1bW5zVGFibGUxOwotCXByaXZhdGUgQXJyYXlMaXN0PFNpbXBsZUpvaW4+IHRhYmxlRGF0YU1vZGVsMSA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlSm9pbj4oKTsgIAotCXByaXZhdGUgQ29tcG9zaXRlIHRhYmxlc0dyb3VwMTsKLQkKLQlwcml2YXRlIExhYmVsIGpvaW5Db2x1bW5zRGVzY0xhYmVsMjsKLQkvKnRoZSB0YWJsZSBjb250YWluaW5nIHRoZSBhc3NvY2lhdGlvbiBjb2x1bW5zIGJldHdlZW4gam9pbiB0YWJsZSBhbmQgdGFibGUyCi0JICogaWYgbWFueSB0byBtYW55Ki8KLQlwcml2YXRlIFRhYmxlVmlld2VyIGpvaW5Db2x1bW5zVGFibGUyOwotCXByaXZhdGUgQXJyYXlMaXN0PFNpbXBsZUpvaW4+IHRhYmxlRGF0YU1vZGVsMiA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlSm9pbj4oKTsgIAotCXByaXZhdGUgQ29tcG9zaXRlIHRhYmxlc0dyb3VwMjsKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gSk9JTkNPTFVNTlNfVEFCTEVfQ09MVU1OX1BST1BFUlRJRVMgPSB7ICJyZWZlcnJlckNvbHVtbiIsICJyZWZlcmVuY2VkQ29sdW1uIiB9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKT0lOQ09MVU1OMV9DT0xVTU5fSU5ERVggPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKT0lOQ09MVU1OMl9DT0xVTU5fSU5ERVggPSAxOwotCi0JcHJvdGVjdGVkIEpvaW5Db2x1bW5zUGFnZShPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIgKSB7Ci0JCXN1cGVyKGN1c3RvbWl6ZXIsICJKb2luQ29sdW1uc1BhZ2UiKTsKLQkJc2V0VGl0bGUoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV9kZXNjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLkdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9KT0lOX0NPTFVNTlMpOwotCi0JCXRhYmxlc0dyb3VwMSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7Ci0JCXRhYmxlc0dyb3VwMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJdGFibGVzR3JvdXAxLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQljcmVhdGVKb2luQ29sdW1uc1RhYmxlQ29udHJvbDEodGFibGVzR3JvdXAxKTsKLQotCQkvL2NyZWF0ZU10bUpvaW5Db2x1bW5zVGFibGUyKGNvbXBvc2l0ZSk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKCBmYWxzZSk7Ci0JCQotCQkoKFdpemFyZERpYWxvZylnZXRDb250YWluZXIoKSkuYWRkUGFnZUNoYW5nZWRMaXN0ZW5lcihuZXcgSVBhZ2VDaGFuZ2VkTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHBhZ2VDaGFuZ2VkKFBhZ2VDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiggZXZlbnQuZ2V0U2VsZWN0ZWRQYWdlKCkgPT0gSm9pbkNvbHVtbnNQYWdlLnRoaXMgKXsKLQkJCQkJKChDb21wb3NpdGUpSm9pbkNvbHVtbnNQYWdlLnRoaXMuZ2V0Q29udHJvbCgpKS5nZXRQYXJlbnQoKS5sYXlvdXQoKSA7CQkKLQkJCQkJCi0JCQkJfQotCQkJfQkJCQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTXRtSm9pbkNvbHVtbnNUYWJsZTIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQl0YWJsZXNHcm91cDIgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULlNIQURPV19FVENIRURfSU4pOwotCQl0YWJsZXNHcm91cDIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCXRhYmxlc0dyb3VwMi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJY3JlYXRlSm9pbkNvbHVtbnNUYWJsZUNvbnRyb2wyKHRhYmxlc0dyb3VwMik7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHdpemFyZCBwYWdlIFVJIHdpdGggbmV3IHRhYmxlIG5hbWVzCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlV2l0aE5ld1RhYmxlcygpIHsKLQkJU3RyaW5nIGNhcmRpbmFsaXR5ID0gdGhpcy5nZXRDYXJkaW5hbGl0eSgpIDsKLQkJaWYoIEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWS5lcXVhbHMoIGNhcmRpbmFsaXR5ICkgKXsKLQkJCXVwZGF0ZVdpdGhNdG1UYWJsZXMoKTsKLQkJfWVsc2V7Ci0JCQl1cGRhdGVXaXRoT3RtVGFibGVzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgV2l6YXJkIFVJIHdpdGggYSBzaW5nbGUgVGFibGVWaWV3ZXIgd2l0aCBjb2x1bW5zIGZyb20gdGhlIHR3byBhc3NvY2lhdGVkIGRhdGFiYXNlIHRhYmxlcwotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVdpdGhPdG1UYWJsZXMoKSB7Ci0JCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IGpvaW5Db2x1bW5zVGFibGUxLmdldFRhYmxlKCkuZ2V0Q29sdW1ucygpOwotCQlTdHJpbmcgdGFibGUxTmFtZSA9IHRoaXMuZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKSA7Ci0JCVN0cmluZyB0YWJsZTJOYW1lID0gdGhpcy5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkgOwotCQkKLQkJaWYoIHRhYmxlMU5hbWUgPT1udWxsIHx8IHRhYmxlMk5hbWUgPT0gbnVsbCApCi0JCQlyZXR1cm47Ci0JCQotCQljb2x1bW5zWzBdLnNldFRleHQoIHRhYmxlMU5hbWUgKTsKLQkJY29sdW1uc1sxXS5zZXRUZXh0KCB0YWJsZTJOYW1lICk7Ci0KLQkJLy9IaWRlIHRoZSBKb2luIGNvbHVtbiB0YWJsZSAyCi0JCWlmKCB0YWJsZXNHcm91cDIgIT1udWxsICkKLQkJCXRhYmxlc0dyb3VwMi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCi0JCXRhYmxlRGF0YU1vZGVsMS5jbGVhcigpOwotCQlqb2luQ29sdW1uc1RhYmxlMS5yZWZyZXNoKCk7Ci0JCQotCQlTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdChKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfbGFiZWwsIHRhYmxlMU5hbWUsIHRhYmxlMk5hbWUpOyAKLQkJam9pbkNvbHVtbnNEZXNjTGFiZWwxLnNldFRleHQobXNnKTsKLQkJam9pbkNvbHVtbnNEZXNjTGFiZWwxLnNldFRvb2xUaXBUZXh0KCBtc2cgKTsKLQkJdGFibGVzR3JvdXAxLmxheW91dCgpOwotCQkKLQkJU3RyaW5nW10gcmVmZXJyZXJDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnModGFibGUxTmFtZSk7Ci0JCVN0cmluZ1tdIHJlZmVyZW5jZWRDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnModGFibGUyTmFtZSk7Ci0JCQotCQl1cGRhdGVDZWxsRWRpdG9ycyhqb2luQ29sdW1uc1RhYmxlMSwgcmVmZXJyZXJDb2x1bW5WYWx1ZXMsIHJlZmVyZW5jZWRDb2x1bW5WYWx1ZXMpOwkJCi0KLQkJCi0JCSgoQ29tcG9zaXRlKXRoaXMuZ2V0Q29udHJvbCgpKS5sYXlvdXQoKSA7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIFdpemFyZCBVSSB3aXRoIGEgdHdvIFRhYmxlVmlld2VycyB3aXRoIHRoZSBmaXJzdCB3aXRoIGNvbHVtbnMgZnJvbSB0YWJsZTEgdG8gdGhlIE1UTSBqb2luIHRhYmxlCi0JICogYW5kIHRoZSBzZWNvbmQgb25lIHdpdGggY29sdW1ucyBmcm9tIHRoZSBNVE0gam9pbiB0YWJsZSB0byB0YWJsZTIKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVXaXRoTXRtVGFibGVzKCkgewotCQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSBqb2luQ29sdW1uc1RhYmxlMS5nZXRUYWJsZSgpLmdldENvbHVtbnMoKTsKLQkJU3RyaW5nIHRhYmxlMU5hbWUgPSB0aGlzLmdldFJlZmVycmVyVGFibGVOYW1lKCkgOwotCQlTdHJpbmcgdGFibGUyTmFtZSA9IHRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpIDsKLQkJU3RyaW5nIGpvaW5UYWJsZU5hbWUgPSB0aGlzLmdldEpvaW5UYWJsZU5hbWUoKSA7Ci0JCWlmKCB0YWJsZTFOYW1lPT1udWxsIHx8IHRhYmxlMk5hbWU9PW51bGwgfHwgam9pblRhYmxlTmFtZT09bnVsbCApewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmKCB0YWJsZXNHcm91cDIgPT0gbnVsbCApewotCQkJY3JlYXRlTXRtSm9pbkNvbHVtbnNUYWJsZTIoIHRhYmxlc0dyb3VwMS5nZXRQYXJlbnQoKSk7Ci0JCX0gCi0KLQkJY29sdW1uc1swXS5zZXRUZXh0KCB0YWJsZTFOYW1lPT1udWxsPyIiOnRhYmxlMU5hbWUgKTsKLQkJY29sdW1uc1sxXS5zZXRUZXh0KCB0YWJsZTJOYW1lPT1udWxsPyIiOmpvaW5UYWJsZU5hbWUgKTsKLQkJCi0JCS8vVXBkYXRlIGpvaW4gY29sdW1uIFRhYmxlVmlld2VyIDEKLQkJdGFibGVEYXRhTW9kZWwxLmNsZWFyKCk7Ci0JCWpvaW5Db2x1bW5zVGFibGUxLnJlZnJlc2goKTsKLQkJCi0JCVN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV9sYWJlbCwgdGFibGUxTmFtZSwgam9pblRhYmxlTmFtZSk7IAotCQlqb2luQ29sdW1uc0Rlc2NMYWJlbDEuc2V0VGV4dChtc2cpOwotCQlqb2luQ29sdW1uc0Rlc2NMYWJlbDEuc2V0VG9vbFRpcFRleHQoIG1zZyApOwotCQlTdHJpbmdbXSByZWZlcnJlckNvbHVtblZhbHVlcyA9IGdldFRhYmxlQ29sdW1ucyh0YWJsZTFOYW1lKTsKLQkJU3RyaW5nW10gcmVmZXJlbmNlZENvbHVtblZhbHVlcyA9IGdldFRhYmxlQ29sdW1ucyhqb2luVGFibGVOYW1lKTsKLQkJCi0JCXVwZGF0ZUNlbGxFZGl0b3JzKGpvaW5Db2x1bW5zVGFibGUxLCByZWZlcnJlckNvbHVtblZhbHVlcywgcmVmZXJlbmNlZENvbHVtblZhbHVlcyApOwotCi0JCS8vVXBkYXRlIGpvaW4gY29sdW1uIFRhYmxlVmlld2VyIDIKLQkJY29sdW1ucyA9IGpvaW5Db2x1bW5zVGFibGUyLmdldFRhYmxlKCkuZ2V0Q29sdW1ucygpOwotCQljb2x1bW5zWzBdLnNldFRleHQoIGpvaW5UYWJsZU5hbWU9PW51bGw/IiI6am9pblRhYmxlTmFtZSApOwotCQljb2x1bW5zWzFdLnNldFRleHQoIHRhYmxlMk5hbWU9PW51bGw/IiI6dGFibGUyTmFtZSApOwotCQl0YWJsZXNHcm91cDEubGF5b3V0KCk7Ci0KLQkJdGFibGVEYXRhTW9kZWwyLmNsZWFyKCk7Ci0JCWpvaW5Db2x1bW5zVGFibGUyLnJlZnJlc2goKTsKLQkJbXNnID0gU3RyaW5nLmZvcm1hdChKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfbGFiZWwsIGpvaW5UYWJsZU5hbWUsIHRhYmxlMk5hbWUpOyAKLQkJam9pbkNvbHVtbnNEZXNjTGFiZWwyLnNldFRleHQobXNnKTsKLQkJam9pbkNvbHVtbnNEZXNjTGFiZWwyLnNldFRvb2xUaXBUZXh0KCBtc2cgKTsKLQkJcmVmZXJyZXJDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnMoam9pblRhYmxlTmFtZSk7Ci0JCXJlZmVyZW5jZWRDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnModGFibGUyTmFtZSk7Ci0JCXVwZGF0ZUNlbGxFZGl0b3JzKGpvaW5Db2x1bW5zVGFibGUyLCByZWZlcnJlckNvbHVtblZhbHVlcywgcmVmZXJlbmNlZENvbHVtblZhbHVlcyApOwotCQkKLQkJdGFibGVzR3JvdXAyLmxheW91dCgpOwotCi0JCS8vU2hvdyB0aGUgSm9pbiBjb2x1bW4gVGFibGVWaWV3ZXIgMgotCQl0YWJsZXNHcm91cDIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCi0JCQotCQkoKENvbXBvc2l0ZSl0aGlzLmdldENvbnRyb2woKSkubGF5b3V0KG5ldyBDb250cm9sW117dGhpcy50YWJsZXNHcm91cDEsIHRoaXMudGFibGVzR3JvdXAyfSk7CQkKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFkZFJlbW92ZUJ1dHRvbkNvbXBvc2l0ZShDb21wb3NpdGUgdGFibGVzR3JvdXAsIGZpbmFsIFRhYmxlVmlld2VyIGpvaW5Db2x1bW5zVGFibGUsICBmaW5hbCBBcnJheUxpc3Q8U2ltcGxlSm9pbj4gdGFibGVEYXRhTW9kZWwpIHsKLQkJLy9BZGQgYW5kIFJlbW92ZSBKb2luQ29sdW1ucyBidXR0b25zCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYmxlc0dyb3VwLCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgYnV0dG9uTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbkxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJQnV0dG9uIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWFkZEJ1dHRvbi5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLmFkZCApOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQotCQkJCVNpbXBsZUpvaW4gam9pbiA9IGdldERlZmF1bHROZXdKb2luKGpvaW5Db2x1bW5zVGFibGUpOwotCQkJCXRhYmxlRGF0YU1vZGVsLmFkZChqb2luKTsKLQkJCQlqb2luQ29sdW1uc1RhYmxlLnJlZnJlc2goKTsKLQkJCQkKLQkJCQkvL1VwZGF0ZSBXaXphcmQgbW9kZWwKLQkJCQlUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBqb2lucyA9IG51bGw7Ci0JCQkJaWYoIGpvaW5Db2x1bW5zVGFibGUgPT0gam9pbkNvbHVtbnNUYWJsZTEgKXsKLQkJCQkJam9pbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZ2V0V2l6YXJkRGF0YU1vZGVsKCkuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzEgKTsKLQkJCQl9ZWxzZXsKLQkJCQkJam9pbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZ2V0V2l6YXJkRGF0YU1vZGVsKCkuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzIgKTsKLQkJCQl9Ci0JCQkJam9pbnMucHV0KCBqb2luLmZvcmVpZ25LZXksIGpvaW4ucHJpbWFyeUtleSk7Ci0JCQkJCi0JCQkJdXBkYXRlUGFnZUNvbXBsZXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQnV0dG9uIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLnJlbW92ZSApOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pam9pbkNvbHVtbnNUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiggc2VsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuOwotCQkJCVNpbXBsZUpvaW4gam9pbiA9IChTaW1wbGVKb2luKXNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkJCS8vVXBkYXRlIFRhYmxlVmlld2VyIG1vZGVsCi0JCQkJdGFibGVEYXRhTW9kZWwucmVtb3ZlKCBqb2luICk7Ci0JCQkJLy9VcGRhdGUgV2l6YXJkIG1vZGVsCi0JCQkJCi0JCQkJVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gam9pbnMgPSBudWxsOwotCQkJCWlmKCBqb2luQ29sdW1uc1RhYmxlID09IGpvaW5Db2x1bW5zVGFibGUxICl7Ci0JCQkJCWpvaW5zID0gKFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KWdldFdpemFyZERhdGFNb2RlbCgpLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMxICk7Ci0JCQkJfWVsc2V7Ci0JCQkJCWpvaW5zID0gKFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KWdldFdpemFyZERhdGFNb2RlbCgpLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMyICk7Ci0JCQkJfQotCQkJCWpvaW5zLnJlbW92ZShqb2luLmZvcmVpZ25LZXkpOwotCi0JCQkJam9pbkNvbHVtbnNUYWJsZS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYWRkQnV0dG9uLnNldEZvY3VzKCk7Ci0JCQotCX0KLQotCXByb3RlY3RlZCBTaW1wbGVKb2luIGdldERlZmF1bHROZXdKb2luKFRhYmxlVmlld2VyIGpvaW5Db2x1bW5zVGFibGUpIHsKLQkJU3RyaW5nIHRhYmxlMU5hbWUgPSAiIjsKLQkJU3RyaW5nIHRhYmxlMk5hbWUgPSAiIjsKLQotCQlUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBleGlzdGluZ0pvaW5zID0gbnVsbDsKLQkJaWYoIGpvaW5Db2x1bW5zVGFibGUgPT0gdGhpcy5qb2luQ29sdW1uc1RhYmxlMSApewotCQkJZXhpc3RpbmdKb2lucyA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPilnZXRXaXphcmREYXRhTW9kZWwoKS5nZXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fSk9JTl9DT0xVTU5TMSApOwotCQkJaWYoIHRoaXMuZ2V0Sm9pblRhYmxlTmFtZSgpID09IG51bGwpIHsKLQkJCQl0YWJsZTFOYW1lID0gdGhpcy5nZXRSZWZlcnJlclRhYmxlTmFtZSgpOwotCQkJCXRhYmxlMk5hbWUgPSB0aGlzLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSA7Ci0JCQl9ZWxzZXsKLQkJCQl0YWJsZTFOYW1lID0gdGhpcy5nZXRSZWZlcnJlclRhYmxlTmFtZSgpOwotCQkJCXRhYmxlMk5hbWUgPSB0aGlzLmdldEpvaW5UYWJsZU5hbWUoKSAgOwotCQkJfQotCQl9ZWxzZXsKLQkJCWV4aXN0aW5nSm9pbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZ2V0V2l6YXJkRGF0YU1vZGVsKCkuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzIgKTsKLQkJCXRhYmxlMU5hbWUgPSB0aGlzLmdldEpvaW5UYWJsZU5hbWUoKTsKLQkJCXRhYmxlMk5hbWUgPSB0aGlzLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSA7Ci0JCX0KLQkJLy9maW5kIG5leHQgYXZhaWxhYmxlIGNvbHVtbgotCQlTdHJpbmdbXSB0YWJsZTFDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnModGFibGUxTmFtZSk7Ci0JCVN0cmluZyBuZXh0Q29sMSA9ICIiOwotCQlmb3IoIFN0cmluZyBzOiB0YWJsZTFDb2x1bW5WYWx1ZXMgKXsKLQkJCWlmKCAhZXhpc3RpbmdKb2lucy5rZXlTZXQoKS5jb250YWlucyhzKSl7Ci0JCQkJbmV4dENvbDEgPSBzOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlTdHJpbmdbXSB0YWJsZTJDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnModGFibGUyTmFtZSk7Ci0JCVN0cmluZyBuZXh0Q29sMiA9ICIiOwotCQlmb3IoIFN0cmluZyBzOiB0YWJsZTJDb2x1bW5WYWx1ZXMgKXsKLQkJCWlmKCAhZXhpc3RpbmdKb2lucy52YWx1ZXMoKS5jb250YWlucyhzKSl7Ci0JCQkJbmV4dENvbDIgPSBzOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU2ltcGxlSm9pbiggbmV4dENvbDEsIG5leHRDb2wyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZVBhZ2VDb21wbGV0ZSgpIHsKLQkJYm9vbGVhbiByZXQgPSB0YWJsZURhdGFNb2RlbDEuc2l6ZSgpPiAwIDsKLQkJc2V0UGFnZUNvbXBsZXRlKCByZXQgKTsKLQl9CQotCQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvaW5Db2x1bW5zVGFibGVDb250cm9sMShDb21wb3NpdGUgdGFibGVzR3JvdXApIHsKLQkJam9pbkNvbHVtbnNEZXNjTGFiZWwxID0gY3JlYXRlTGFiZWwodGFibGVzR3JvdXAsIDIsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV9sYWJlbCApOwotCQlqb2luQ29sdW1uc1RhYmxlMSA9IGNyZWF0ZUpvaW5Db2x1bW5zVGFibGVDb250cm9sKHRhYmxlc0dyb3VwLCB0aGlzLnRhYmxlRGF0YU1vZGVsMSk7Ci0JCWNyZWF0ZUFkZFJlbW92ZUJ1dHRvbkNvbXBvc2l0ZSh0YWJsZXNHcm91cCwgam9pbkNvbHVtbnNUYWJsZTEsIHRhYmxlRGF0YU1vZGVsMSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVKb2luQ29sdW1uc1RhYmxlQ29udHJvbDIoQ29tcG9zaXRlIHRhYmxlc0dyb3VwKSB7Ci0JCWpvaW5Db2x1bW5zRGVzY0xhYmVsMiA9IGNyZWF0ZUxhYmVsKHRhYmxlc0dyb3VwLCAyLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfbGFiZWwgKTsKLQkJam9pbkNvbHVtbnNUYWJsZTIgPSBjcmVhdGVKb2luQ29sdW1uc1RhYmxlQ29udHJvbCh0YWJsZXNHcm91cCwgdGhpcy50YWJsZURhdGFNb2RlbDIpOwotCQljcmVhdGVBZGRSZW1vdmVCdXR0b25Db21wb3NpdGUodGFibGVzR3JvdXAsIGpvaW5Db2x1bW5zVGFibGUyLCB0YWJsZURhdGFNb2RlbDIpOwotCX0KLQkKLQlwcml2YXRlIFRhYmxlVmlld2VyIGNyZWF0ZUpvaW5Db2x1bW5zVGFibGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIEFycmF5TGlzdDxTaW1wbGVKb2luPiB0YWJsZURhdGFNb2RlbCApewkKLQkKLQkJVGFibGVMYXlvdXRDb21wb3NpdGUgbGF5b3V0PSBuZXcgVGFibGVMYXlvdXRDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWFkZENvbHVtbkxheW91dERhdGEobGF5b3V0KTsKLQkJCi0JCWZpbmFsIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlIHRhYmxlID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlKGxheW91dCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIgKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQkKLQkJVGFibGVDb2x1bW4gcmVmZXJyZXJDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCBKT0lOQ09MVU1OMV9DT0xVTU5fSU5ERVgpOwotCQlyZWZlcnJlckNvbHVtbi5zZXRUZXh0KCIldGFibGUxIik7Ci0JCXJlZmVycmVyQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQlUYWJsZUNvbHVtbiByZWZlcmVuY2VkQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgSk9JTkNPTFVNTjJfQ09MVU1OX0lOREVYKTsKLQkJcmVmZXJlbmNlZENvbHVtbi5zZXRUZXh0KCIldGFibGUyIik7Ci0JCXJlZmVyZW5jZWRDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCQkKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5oZWlnaHRIaW50PSBTV1RVdGlsLmdldFRhYmxlSGVpZ2h0SGludCh0YWJsZSwgMyk7Ci0JCWdkLndpZHRoSGludCA9IDMwMDsKLQkJbGF5b3V0LnNldExheW91dERhdGEoZ2QpOwotCi0JCVRhYmxlVmlld2VyIG5ld0pvaW5Db2x1bW5zVGFibGUgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQluZXdKb2luQ29sdW1uc1RhYmxlLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCW5ld0pvaW5Db2x1bW5zVGFibGUuc2V0TGFiZWxQcm92aWRlcih0aGlzLmJ1aWxkVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCW5ld0pvaW5Db2x1bW5zVGFibGUuc2V0Q29udGVudFByb3ZpZGVyKHRoaXMuYnVpbGRUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyKCkpOwotCQluZXdKb2luQ29sdW1uc1RhYmxlLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCQlyZXR1cm4gKChTaW1wbGVKb2luKSBlMSkuZm9yZWlnbktleS5jb21wYXJlVG8oKChTaW1wbGVKb2luKSBlMikuZm9yZWlnbktleSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbmV3Sm9pbkNvbHVtbnNUYWJsZS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkvL2hhbmRsZVRhYmxlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXBvcHVsYXRlVGFibGVEYXRhTW9kZWwoKTsKLQkJbmV3Sm9pbkNvbHVtbnNUYWJsZS5zZXRJbnB1dCggdGFibGVEYXRhTW9kZWwgKTsKLQkJcmV0dXJuIG5ld0pvaW5Db2x1bW5zVGFibGU7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgcG9wdWxhdGVUYWJsZURhdGFNb2RlbCgpewotCQlIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhTW9kZWwgPSBnZXRXaXphcmREYXRhTW9kZWwoKTsKLQkJVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gam9pbkNvbHVtbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZGF0YU1vZGVsLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMxKTsKLQkJaWYoIGpvaW5Db2x1bW5zIT0gbnVsbCApewotCQkJZm9yKCBTdHJpbmcgcmVmZXJyZXJDb2x1bW4gOiBqb2luQ29sdW1ucy5rZXlTZXQoKSApewotCQkJCXRhYmxlRGF0YU1vZGVsMS5hZGQobmV3IFNpbXBsZUpvaW4ocmVmZXJyZXJDb2x1bW4sIGpvaW5Db2x1bW5zLmdldChyZWZlcnJlckNvbHVtbikgKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCVRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+IGpvaW5Db2x1bW5zMiA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPilkYXRhTW9kZWwuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzIpOwotCQlpZiggam9pbkNvbHVtbnMyIT0gbnVsbCApewotCQkJZm9yKCBTdHJpbmcgcmVmZXJyZXJDb2x1bW4gOiBqb2luQ29sdW1uczIua2V5U2V0KCkgKXsKLQkJCQl0YWJsZURhdGFNb2RlbDIuYWRkKG5ldyBTaW1wbGVKb2luKHJlZmVycmVyQ29sdW1uLCBqb2luQ29sdW1uczIuZ2V0KHJlZmVycmVyQ29sdW1uKSApKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGJ1aWxkVGFibGVUYWJsZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uc0NvbnRlbnRQcm92aWRlcigpOwotCX0KLQotCQotCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGJ1aWxkVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbnNUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZENvbHVtbkxheW91dERhdGEoVGFibGVMYXlvdXRDb21wb3NpdGUgbGF5b3V0KSB7Ci0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCB0cnVlKSk7Ci0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCB0cnVlKSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVDZWxsRWRpdG9ycyhUYWJsZVZpZXdlciBqb2luQ29sdW1uc1RhYmxlLCBTdHJpbmdbXSByZWZlcnJlckNvbHVtblZhbHVlcywgU3RyaW5nW10gcmVmZXJlbmNlZENvbHVtblZhbHVlcyApewotCQlqb2luQ29sdW1uc1RhYmxlLnNldENvbHVtblByb3BlcnRpZXMoSk9JTkNPTFVNTlNfVEFCTEVfQ09MVU1OX1BST1BFUlRJRVMpOwotCQlDb21ib0JveENlbGxFZGl0b3JbXSBlZGl0b3JzID0gbmV3IENvbWJvQm94Q2VsbEVkaXRvcltKT0lOQ09MVU1OU19UQUJMRV9DT0xVTU5fUFJPUEVSVElFUy5sZW5ndGhdOwotCi0JCWVkaXRvcnNbSk9JTkNPTFVNTjFfQ09MVU1OX0lOREVYXT0gbmV3IENvbWJvQm94Q2VsbEVkaXRvcihqb2luQ29sdW1uc1RhYmxlLmdldFRhYmxlKCksIHJlZmVycmVyQ29sdW1uVmFsdWVzLCBTV1QuU0lOR0xFKTsKLQkJZWRpdG9yc1tKT0lOQ09MVU1OMl9DT0xVTU5fSU5ERVhdPSBuZXcgQ29tYm9Cb3hDZWxsRWRpdG9yKGpvaW5Db2x1bW5zVGFibGUuZ2V0VGFibGUoKSwgcmVmZXJlbmNlZENvbHVtblZhbHVlcywgU1dULlNJTkdMRSk7Ci0JCQotCQlqb2luQ29sdW1uc1RhYmxlLnNldENlbGxFZGl0b3JzKGVkaXRvcnMpOwotCQlqb2luQ29sdW1uc1RhYmxlLnNldENlbGxNb2RpZmllcih0aGlzLmJ1aWxkVGFibGVUYWJsZUNlbGxNb2RpZmllcihqb2luQ29sdW1uc1RhYmxlLCByZWZlcnJlckNvbHVtblZhbHVlcywgcmVmZXJlbmNlZENvbHVtblZhbHVlcyApKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VGFibGVDb2x1bW5zKFN0cmluZyB0YWJsZU5hbWUpewotCQlTY2hlbWEgc2NoZW1hID0gKFNjaGVtYSlnZXRXaXphcmREYXRhTW9kZWwoKS5nZXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fU0NIRU1BKTsKLQkJVGFibGUgdGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCh0YWJsZU5hbWUpOwotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKENvbHVtbiBjb2x1bW4gOiB0YWJsZS5nZXRDb2x1bW5zKCkpIHsKLQkJCWxpc3QuYWRkKGNvbHVtbi5nZXROYW1lKCkpOwotCQl9Ci0JCVN0cmluZ1tdIHJldCA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ2VsbE1vZGlmaWVyIGJ1aWxkVGFibGVUYWJsZUNlbGxNb2RpZmllcihUYWJsZVZpZXdlciBqb2luQ29sdW1uc1RhYmxlLCBTdHJpbmdbXSByZWZlcnJlckNvbHVtblZhbHVlcywgU3RyaW5nW10gcmVmZXJlbmNlZENvbHVtblZhbHVlcykgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5zQ2VsbE1vZGlmaWVyKGpvaW5Db2x1bW5zVGFibGUsIHJlZmVycmVyQ29sdW1uVmFsdWVzLCByZWZlcmVuY2VkQ29sdW1uVmFsdWVzKTsKLQl9CQotCQotCS8qKgotCSAqIEEgQ29udGVudFByb3ZpZGVyIHRyYW5zbGF0ZXMgdGhlIFNpbXBsZUpvaW4gbGlzdCBpbnRvIGEgQ29sbGVjdGlvbiBmb3IgZGlzcGxheSAKLQkgKgotCSAqLwotCXByaXZhdGUgY2xhc3MgSm9pbkNvbHVtbnNDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQkJSm9pbkNvbHVtbnNDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7fQkKLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uPD8+KSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTaW1wbGUgdmFsdWUgb2JqZWN0IHVzZWQgYXMgbW9kZWwgYmFja2luZyB0aGUgSkZhY2UgdGFibGUgCi0JICoKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFNpbXBsZUpvaW4gewotCQlwdWJsaWMgU2ltcGxlSm9pbihTdHJpbmcgZm9yZWlnbktleSwgU3RyaW5nIHByaW1hcnlLZXkpIHsKLQkJCXRoaXMuZm9yZWlnbktleSA9IGZvcmVpZ25LZXk7Ci0JCQl0aGlzLnByaW1hcnlLZXkgPSBwcmltYXJ5S2V5OyAKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGZvcmVpZ25LZXk7Ci0JCXB1YmxpYyBTdHJpbmcgcHJpbWFyeUtleTsKLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JCQlyZXR1cm4gIlsiKyB0aGlzLmZvcmVpZ25LZXkgKyAiID0gIiArIHRoaXMucHJpbWFyeUtleSArICJdIjsKLQkJfQotCX0KLQkKLQkvKioKLQkgKglBIENlbGxNb2RpZmllciB0byB1cGRhdGUgdGhlIGpvaW4gY29sdW1ucyBpbiB0aGUgd2l6YXJkIGRhdGEgbW9kZWwKLQkgKi8KLQlwcml2YXRlIGNsYXNzIEpvaW5Db2x1bW5zQ2VsbE1vZGlmaWVyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllciB7Ci0JCXByaXZhdGUgVGFibGVWaWV3ZXIgam9pbkNvbHVtbnNUYWJsZTsKLQkJcHJpdmF0ZSBTdHJpbmdbXSByZWZlcnJlckNvbHVtblZhbHVlczsKLQkJcHJpdmF0ZSBTdHJpbmdbXSByZWZlcmVuY2VkQ29sdW1uVmFsdWVzOwotCQlKb2luQ29sdW1uc0NlbGxNb2RpZmllcihUYWJsZVZpZXdlciBqb2luQ29sdW1uc1RhYmxlLCBTdHJpbmdbXSByZWZlcnJlckNvbHVtblZhbHVlcywgU3RyaW5nW10gcmVmZXJlbmNlZENvbHVtblZhbHVlcykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuam9pbkNvbHVtbnNUYWJsZSA9IGpvaW5Db2x1bW5zVGFibGU7Ci0JCQl0aGlzLnJlZmVycmVyQ29sdW1uVmFsdWVzID0gcmVmZXJyZXJDb2x1bW5WYWx1ZXM7Ci0JCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5WYWx1ZXMgPSByZWZlcmVuY2VkQ29sdW1uVmFsdWVzOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotLy8JCQlTaW1wbGVKb2luIGpvaW4gPSAoU2ltcGxlSm9pbikgZWxlbWVudDsKLS8vCQkJaWYgKHByb3BlcnR5LmVxdWFscyhKT0lOQ09MVU1OU19UQUJMRV9DT0xVTU5fUFJPUEVSVElFU1tKT0lOQ09MVU1OMl9DT0xVTU5fSU5ERVhdKSkgewotLy8JCQkJcmV0dXJuIGpvaW4ucHJpbWFyeUtleTsKLS8vCQkJfQotLy8JCQlyZXR1cm4gam9pbi5mb3JlaWduS2V5OwotCQkJLy8gcmV0dXJudCB0aGUgaW5kZXggb2YgdGhlIHZhbHVlIGluIHRoZSBDb21ib3hDZWxsRWRpdG9yCi0JCQlBcnJheUxpc3Q8U2ltcGxlSm9pbj4gdGFibGVEYXRhTW9kZWwgPSAoQXJyYXlMaXN0PFNpbXBsZUpvaW4+KSBqb2luQ29sdW1uc1RhYmxlLmdldElucHV0KCk7Ci0JCQlmb3IoaW50IGk9MDsgaTwgdGFibGVEYXRhTW9kZWwuc2l6ZSgpOyBpICsrICl7Ci0JCQkJaWYoIHRhYmxlRGF0YU1vZGVsLmdldChpKSA9PSBlbGVtZW50ICkKLQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGkpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKDApOwotCQkJCi0JCX0KLQotCQkvKiogCi0JCSAqIGVsZW1lbnQgaXMgdGhlIHNlbGVjdGVkIFRhYmxlSXRlbQotCQkgKiB2YWx1ZSBpcyB0aGUgc2VsZWN0ZWQgaXRlbSBpbmRleCBpbiB0aGUgY29tYm9DZWxsRWRpdG9yIAotCQkgKi8KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQkJCWlmICggISAoZWxlbWVudCBpbnN0YW5jZW9mIFRhYmxlSXRlbSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJbnRlZ2VyIGluZGV4ID0gKEludGVnZXIpdmFsdWU7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZWxlbWVudDsKLQkJCWJvb2xlYW4gdW5jaGFuZ2VkID0gZmFsc2U7Ci0JCQlTaW1wbGVKb2luIGpvaW4gPSAoU2ltcGxlSm9pbikgaXRlbS5nZXREYXRhKCk7Ci0JCQlpZiAocHJvcGVydHkuZXF1YWxzKEpPSU5DT0xVTU5TX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTW0pPSU5DT0xVTU4xX0NPTFVNTl9JTkRFWF0pKSB7Ci0JCQkJdW5jaGFuZ2VkID0gam9pbi5mb3JlaWduS2V5LmVxdWFscyggcmVmZXJyZXJDb2x1bW5WYWx1ZXNbIGluZGV4LmludFZhbHVlKCkgXSApOwotCQkJCWlmICghIHVuY2hhbmdlZCkgewotCQkJCQkKLQkJCQkJLy91cGRhdGUgdGhlIHdpemFyZCBkYXRhbW9kZWwKLQkJCQkJVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gam9pbnMgPSBudWxsOwotCQkJCQlpZiggam9pbkNvbHVtbnNUYWJsZSA9PSBqb2luQ29sdW1uc1RhYmxlMSApewotCQkJCQkJam9pbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZ2V0V2l6YXJkRGF0YU1vZGVsKCkuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzEgKTsKLQkJCQkJfWVsc2V7Ci0JCQkJCQlqb2lucyA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPilnZXRXaXphcmREYXRhTW9kZWwoKS5nZXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fSk9JTl9DT0xVTU5TMiApOwotCQkJCQl9Ci0JCQkJCWpvaW5zLnJlbW92ZShqb2luLmZvcmVpZ25LZXkpOwotCQkJCQlqb2lucy5wdXQocmVmZXJyZXJDb2x1bW5WYWx1ZXNbIGluZGV4LmludFZhbHVlKCkgXSwgam9pbi5wcmltYXJ5S2V5KTsKLQotCQkJCQkvL1VwZGF0ZSB0aGUgVGFibGVWaWV3ZXIgbW9kZWwKLQkJCQkJam9pbi5mb3JlaWduS2V5ID0gcmVmZXJyZXJDb2x1bW5WYWx1ZXNbIGluZGV4LmludFZhbHVlKCldOwotCQkJCQlqb2luQ29sdW1uc1RhYmxlLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlpZiAocHJvcGVydHkuZXF1YWxzKEpPSU5DT0xVTU5TX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTW0pPSU5DT0xVTU4yX0NPTFVNTl9JTkRFWF0pKSB7Ci0JCQkJdW5jaGFuZ2VkID0gam9pbi5wcmltYXJ5S2V5LmVxdWFscyggcmVmZXJlbmNlZENvbHVtblZhbHVlc1sgaW5kZXguaW50VmFsdWUoKV0gKSA7Ci0JCQkJaWYgKCEgdW5jaGFuZ2VkKSB7Ci0JCQkJCS8vVXBkYXRlIHRoZSBUYWJsZVZpZXdlciBtb2RlbAotCQkJCQlqb2luLnByaW1hcnlLZXkgPSByZWZlcmVuY2VkQ29sdW1uVmFsdWVzWyBpbmRleC5pbnRWYWx1ZSgpXSA7Ci0JCQkJCQotCQkJCQkvL1VwZGF0ZSB3aXphcmQgZGF0YSBtb2RlbAotCQkJCQlUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBqb2lucyA9IG51bGw7Ci0JCQkJCWlmKCBqb2luQ29sdW1uc1RhYmxlID09IGpvaW5Db2x1bW5zVGFibGUxICl7Ci0JCQkJCQlqb2lucyA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPilnZXRXaXphcmREYXRhTW9kZWwoKS5nZXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fSk9JTl9DT0xVTU5TMSApOwotCQkJCQl9ZWxzZXsKLQkJCQkJCWpvaW5zID0gKFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KWdldFdpemFyZERhdGFNb2RlbCgpLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMyICk7Ci0JCQkJCX0KLQkJCQkJam9pbnMucHV0KGpvaW4uZm9yZWlnbktleSwgam9pbi5wcmltYXJ5S2V5KTsKLQotCQkJCQlqb2luQ29sdW1uc1RhYmxlLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBBIHRhYmxlIGxhYmVsIHByb3ZpZGVyIHRvIHJldHVybiB0aGUgam9pbiBjb2x1bW4gbmFtZXMgZm9yIGRpc3BsYXkKLQkgKgotCSAqLwotCXByaXZhdGUgZmluYWwgY2xhc3MgSm9pbkNvbHVtbnNUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJaWYoICEoZWxlbWVudCBpbnN0YW5jZW9mIFNpbXBsZUpvaW4pICkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkgICAgICAgICAgICBjYXNlIDA6Ci0JICAgICAgICAgICAgCXJldHVybiAoKFNpbXBsZUpvaW4pZWxlbWVudCkuZm9yZWlnbktleTsKLQkgICAgICAgICAgICBjYXNlIDE6Ci0JICAgICAgICAgICAgCXJldHVybiAoKFNpbXBsZUpvaW4pZWxlbWVudCkucHJpbWFyeUtleTsKLQkgICAgICAgICAgICBkZWZhdWx0OgotCSAgICAgICAgICAgIAlBc3NlcnQuaXNUcnVlKGZhbHNlKTsKLQkgICAgICAgICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkgICAgcmV0dXJuIGdldENvbHVtblRleHQoZWxlbWVudCwgMCk7IC8vIG5lZWRlZCB0byBtYWtlIHRoZSBzb3J0ZXIgd29yawotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzEwM2Y3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0pwdFVpRW50aXR5R2VuTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBVSS4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfdWlfZW50aXR5X2dlbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLmNsYXNzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX1Jlc3RvcmVfRGVmYXVsdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9nZW5lcmF0ZUVudGl0aWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfZG9Ob3RTaG93V2FybmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3NlbGVjdEpQQVByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9zZWxlY3RKUEFQcm9qZWN0X21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9zZWxlY3RUYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9jaG9vc2VFbnRpdHlUYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV91cGRhdGVQZXJzaXN0ZW5jZVhtbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV90YWJsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfdGFibGVDb2x1bW47Ci0JLy9EYXRhYmFzZSBjb25uZWN0aW9uIGdyb3VwCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29ubmVjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRDb25uZWN0aW9uTGluazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25uZWN0TGluazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzY2hlbWFJbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNjaGVtYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25uZWN0aW5nVG9EYXRhYmFzZTsKLQkKLQkvL0RlZmF1bHQgdGFibGUgZ2VuIHByb3BlcnRpZXMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2RvbWFpbkphdmFDbGFzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfdGFibGVNYXBwaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVQYW5lbF9jbGFzc05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2ZldGNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9jb2xsVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2Vfc2VxdWVuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX3NlcXVlbmNlTm90ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfYWNjZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9rZXlHZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2dlbk9wdGlvbmFsQW5ub3RhdGlvbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2dlbk9wdGlvbmFsQW5ub3RhdGlvbnNfZGVzYzsKLQkKLQkvL0Fzc28gZmlndXJlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFueVRvT25lRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvbmVUb09uZURlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFueVRvTWFueURlc2M7Ci0JLy90YWJsZSBhc3NvY2lhdGlvbiB3aXphcmQgcGFnZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY1BhZ2VfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY1BhZ2VfbmV3QXNzb2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY1BhZ2VfZGVsQXNzb2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9nZW5Bc3NvYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX2VudGl0eVJlZjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9wZXJ0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXNjYWRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3Jfc2V0UmVmOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3Jfam9pbmVkV2hlbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX3RhYmxlSm9pbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXJkaW5hbGl0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDYXNjYWRlRGxnVGl0bGU7Ci0JLy9uZXcgYXNzb2NpYXRpb24gd2l6YXJkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2Fzc29jS2luZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2Vfc2ltcGxlQXNzb2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX20ybUFzc29jOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9hc3NvY1RhYmxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfdGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV90YWJsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2ludGVybWVkaWF0ZVRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX2NhcmRpbmFsaXR5UGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX2NhcmRpbmFsaXR5UGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hbnlUb09uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvbmVUb01hbnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb25lVG9PbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFueVRvTWFueTsKLQkvL3NlbGVjdCB0YWJsZSBkaWFsb2cKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RUYWJsZURsZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFRhYmxlRGxnRGVzYzsKLQkvL2luZGl2aWR1YWwgdGFibGUgYW5kIGNvbHVtbiBnZW4gcHJvcGVydGllcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVzQW5kQ29sdW1uc1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZXNBbmRDb2x1bW5zUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVzQW5kQ29sdW1uc1BhZ2VfbGFiZWxUYWJsZUFuZENvbHVtbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9nZW5Qcm9wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfY29sTWFwcGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX3Byb3BOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfcHJvcFR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9tYXBLaW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfY29sVXBkYXRlYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX2NvbEluc2VydGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9iZWFuUHJvcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX2dldHRlclNjb3BlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfc2V0dGVyU2NvcGU7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vTmV3QXNzb2NpYXRpb25XaXphcmQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL05ld0Fzc29jaWF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MTQzM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vTmV3QXNzb2NpYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuQXNzb2NpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5PUk1HZW5DdXN0b21pemVyOwotCi0KLXB1YmxpYyBjbGFzcyBOZXdBc3NvY2lhdGlvbldpemFyZCBleHRlbmRzIFdpemFyZCB7CQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVNTT0NJQVRJT05fU0NIRU1BID0gIkFTU09DSUFUSU9OX1NDSEVNQSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBU1NPQ0lBVElPTl9SRUZFUlJFUl9UQUJMRSA9ICJBU1NPQ0lBVElPTl9SRUZFUlJFUl9UQUJMRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBU1NPQ0lBVElPTl9SRUZFUkVOQ0VEX1RBQkxFID0gIkFTU09DSUFUSU9OX1JFRkVSRU5DRURfVEFCTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVNTT0NJQVRJT05fSk9JTl9DT0xVTU5TMSA9ICJBU1NPQ0lBVElPTl9SRUZFUlJFUl9DT0xVTU5TMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMyID0gIkFTU09DSUFUSU9OX1JFRkVSUkVSX0NPTFVNTlMyIjsgLy91c2VkIGluIE1UTSBhc3NvY2lhdGlvbnMgb25seSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVNTT0NJQVRJT05fSk9JTl9UQUJMRSA9ICJBU1NPQ0lBVElPTl9KT0lOX1RBQkxFIjsgLy8gVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFTU09DSUFUSU9OX0NBRElOQUxJVFkgPSAiQVNTT0NJQVRJT05fQ0FESU5BTElUWSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKLQlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGFzc29jaWF0aW9uRGF0YU1vZGVsID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLQlwcml2YXRlIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciA9IG51bGw7CQotCQotCXByaXZhdGUgQXNzb2NpYXRpb25UYWJsZXNQYWdlIGFzc29jaWF0aW9uVGFibGVzUGFnZTsKLQlwcml2YXRlIEpvaW5Db2x1bW5zUGFnZSBqb2luQ29sdW1uc1BhZ2U7Ci0JcHJpdmF0ZSBDYXJkaW5hbGl0eVBhZ2UgY2FyZGluYWxpdHlQYWdlOwotCQotCXByb3RlY3RlZCBmaW5hbCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyOwotCi0JcHVibGljIE5ld0Fzc29jaWF0aW9uV2l6YXJkKCBKcGFQcm9qZWN0IGpwYVByb2plY3QsIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQl0aGlzLmN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQl0aGlzLnJlc291cmNlTWFuYWdlciA9IHJlc291cmNlTWFuYWdlcjsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZSggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RpdGxlKTsKLQkJCi0JCXRoaXMuYXNzb2NpYXRpb25EYXRhTW9kZWwucHV0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9TQ0hFTUEsIHRoaXMuY3VzdG9taXplci5nZXRTY2hlbWEoKSk7Ci0JCXRoaXMuYXNzb2NpYXRpb25EYXRhTW9kZWwucHV0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMxLCBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0JCXRoaXMuYXNzb2NpYXRpb25EYXRhTW9kZWwucHV0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMyLCBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXN1cGVyLmFkZFBhZ2VzKCk7Ci0JCXRoaXMuYXNzb2NpYXRpb25UYWJsZXNQYWdlID0gbmV3IEFzc29jaWF0aW9uVGFibGVzUGFnZSggY3VzdG9taXplciwgdGhpcy5yZXNvdXJjZU1hbmFnZXIpOwotCQlhZGRQYWdlKHRoaXMuYXNzb2NpYXRpb25UYWJsZXNQYWdlKTsKLQkJCi0JCXRoaXMuam9pbkNvbHVtbnNQYWdlID0gbmV3IEpvaW5Db2x1bW5zUGFnZShjdXN0b21pemVyKTsKLQkJYWRkUGFnZSh0aGlzLmpvaW5Db2x1bW5zUGFnZSk7Ci0JCQotCQl0aGlzLmNhcmRpbmFsaXR5UGFnZSA9IG5ldyBDYXJkaW5hbGl0eVBhZ2UoY3VzdG9taXplcik7Ci0JCWFkZFBhZ2UodGhpcy5jYXJkaW5hbGl0eVBhZ2UpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgT1JNR2VuQ3VzdG9taXplciBnZXRDdXN0b21pemVyICgpewotCQlyZXR1cm4gY3VzdG9taXplcjsKLQl9IAotCQotCXB1YmxpYyBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKXsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdDsKLQl9Ci0KLS8vCXB1YmxpYyBTY2hlbWEgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLS8vCQlyZXR1cm4gZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHREYlNjaGVtYSgpOwotLy8JfQotLy8KLS8vCXByaXZhdGUgYm9vbGVhbiBwcm9qZWN0RGVmYXVsdFNjaGVtYUV4aXN0cygpIHsKLS8vCQlyZXR1cm4gKCB0aGlzLmdldERlZmF1bHRTY2hlbWEoKSAhPSBudWxsKTsKLS8vCX0KLQotCXB1YmxpYyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBnZXREYXRhTW9kZWwoKXsKLQkJcmV0dXJuIHRoaXMuYXNzb2NpYXRpb25EYXRhTW9kZWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZVRhYmxlTmFtZXMoKXsKLQkJSVdpemFyZFBhZ2VbXSBwYWdlcyA9IHRoaXMuZ2V0UGFnZXMoKTsKLQkJZm9yKCBJV2l6YXJkUGFnZSBwYWdlIDogcGFnZXMpewotCQkJKChOZXdBc3NvY2lhdGlvbldpemFyZFBhZ2UpcGFnZSkudXBkYXRlV2l0aE5ld1RhYmxlcygpOwotCQl9Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBBc3NvY2lhdGlvbiBnZXROZXdBc3NvY2lhdGlvbigpewotCQlTdHJpbmcgcmVmZXJyZXJUYWJsZU5hbWUgPWdldFJlZmVycmVyVGFibGVOYW1lKCk7IAotCQlTdHJpbmcgcmVmZXJlbmNlZFRhYmxlTmFtZSA9IGdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKTsKLQkJTGlzdDxTdHJpbmc+IHJlZmVycmVyQ29sTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJTGlzdDxTdHJpbmc+IHJlZmVyZW5jZWRDb2xOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkKLQkJU3RyaW5nIGNhcmRpbmFsaXR5ID0gKFN0cmluZylhc3NvY2lhdGlvbkRhdGFNb2RlbC5nZXQoIE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0NBRElOQUxJVFkgKTsKLQkJaWYoIGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5NQU5ZX1RPX01BTlkpICl7Ci0JCQlyZXR1cm4gY3JlYXRlTWFueVRvTWFueUFzc29jaWF0aW9uKCk7Ci0JCX0KLQkJCi0JCU9iamVjdCB2YWx1ZSA9IGFzc29jaWF0aW9uRGF0YU1vZGVsLmdldCggTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fSk9JTl9DT0xVTU5TMSk7Ci0JCWlmKHZhbHVlIT1udWxsKXsKLQkJCVRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+IGpvaW5Db2x1bW5zID0gKFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KXZhbHVlOwkJCi0JCQlmb3IoIFN0cmluZyBwayA6IGpvaW5Db2x1bW5zLmtleVNldCgpKXsKLQkJCQlyZWZlcnJlckNvbE5hbWVzLmFkZChwayk7Ci0JCQkJcmVmZXJlbmNlZENvbE5hbWVzLmFkZCggam9pbkNvbHVtbnMuZ2V0KHBrKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKmlmIG9uZS10by1tYW55IHRoZW4gY29udmVydCBpdCB0byBtYW55LXRvLW9uZSB0byBiZSBjb25zaXN0ZW50IAotCQkgKiB3aXRoIHRoZSBhc3NvY2lhdGlvbnMgY29tcHV0ZWQgZnJvbSB0aGUgZGIgZm9yZWlnbiBrZXlzLgotCQkgKiBEb24ndCBzZWUgYXQgdGhpcyBwb2ludCBob3cgb25lLXRvLW1hbnkgd291bGQgCi0JCSAqIGFmZmVjdCB0aGUgZ2VuZXJhdGlvbi4qLwotCQlpZiggY2FyZGluYWxpdHkuZXF1YWxzKEFzc29jaWF0aW9uLk9ORV9UT19NQU5ZKSApewotCQkJY2FyZGluYWxpdHkgPSBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORTsKLQkJCQotCQkJU3RyaW5nIHRlbXAxID0gcmVmZXJyZXJUYWJsZU5hbWU7Ci0JCQlyZWZlcnJlclRhYmxlTmFtZSA9IHJlZmVyZW5jZWRUYWJsZU5hbWU7Ci0JCQlyZWZlcmVuY2VkVGFibGVOYW1lID0gdGVtcDE7Ci0JCQkKLQkJCUxpc3Q8U3RyaW5nPiB0ZW1wMiA9IHJlZmVycmVyQ29sTmFtZXM7Ci0JCQlyZWZlcnJlckNvbE5hbWVzID0gcmVmZXJlbmNlZENvbE5hbWVzOwotCQkJcmVmZXJlbmNlZENvbE5hbWVzID0gdGVtcDI7Ci0JCX0KLQkJCi0JCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gbnVsbDsKLQkJYXNzb2NpYXRpb24gPSBuZXcgQXNzb2NpYXRpb24odGhpcy5jdXN0b21pemVyLCByZWZlcnJlclRhYmxlTmFtZSwgcmVmZXJyZXJDb2xOYW1lcwksIHJlZmVyZW5jZWRUYWJsZU5hbWUsIHJlZmVyZW5jZWRDb2xOYW1lcyk7Ci0JCWFzc29jaWF0aW9uLnNldENhcmRpbmFsaXR5KCBjYXJkaW5hbGl0eSApOwotCQlhc3NvY2lhdGlvbi5zZXRDdXN0b20odHJ1ZSk7Ci0JCXJldHVybiBhc3NvY2lhdGlvbjsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBBc3NvY2lhdGlvbiBjcmVhdGVNYW55VG9NYW55QXNzb2NpYXRpb24oKSB7Ci0JCVN0cmluZyByZWZlcnJlclRhYmxlTmFtZSA9Z2V0UmVmZXJyZXJUYWJsZU5hbWUoKTsgCi0JCVN0cmluZyBqb2luVGFibGUgPSBnZXRKb2luVGFibGVOYW1lKCk7Ci0JCVN0cmluZyByZWZlcmVuY2VkVGFibGVOYW1lID0gZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpOwotCi0JCUxpc3Q8U3RyaW5nPiByZWZlcnJlckNvbE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUxpc3Q8U3RyaW5nPiByZWZlcnJlckpvaW5Db2xOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlPYmplY3QgdmFsdWUgPSBhc3NvY2lhdGlvbkRhdGFNb2RlbC5nZXQoIE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzEpOwotCQlpZih2YWx1ZSE9bnVsbCl7Ci0JCQlUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBqb2luQ29sdW1ucyA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPil2YWx1ZTsJCQotCQkJZm9yKCBTdHJpbmcgcGsgOiBqb2luQ29sdW1ucy5rZXlTZXQoKSl7Ci0JCQkJcmVmZXJyZXJDb2xOYW1lcy5hZGQocGspOwotCQkJCXJlZmVycmVySm9pbkNvbE5hbWVzLmFkZCggam9pbkNvbHVtbnMuZ2V0KHBrKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXZhbHVlID0gYXNzb2NpYXRpb25EYXRhTW9kZWwuZ2V0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMyKTsKLQkJTGlzdDxTdHJpbmc+IHJlZmVyZW5jZWRDb2xOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlMaXN0PFN0cmluZz4gcmVmZXJlbmNlZEpvaW5Db2xOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpZih2YWx1ZSE9bnVsbCl7Ci0JCQlUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBqb2luQ29sdW1ucyA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPil2YWx1ZTsJCQotCQkJZm9yKCBTdHJpbmcgcGsgOiBqb2luQ29sdW1ucy5rZXlTZXQoKSl7Ci0JCQkJcmVmZXJlbmNlZEpvaW5Db2xOYW1lcy5hZGQocGspOwotCQkJCXJlZmVyZW5jZWRDb2xOYW1lcy5hZGQoIGpvaW5Db2x1bW5zLmdldChwaykpOwotCQkJfQotCQl9Ci0KLQkJCi0JCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gbnVsbDsKLQkJYXNzb2NpYXRpb24gPSBuZXcgQXNzb2NpYXRpb24odGhpcy5jdXN0b21pemVyLCByZWZlcnJlclRhYmxlTmFtZSwgcmVmZXJyZXJDb2xOYW1lcywgCi0JCQkJcmVmZXJlbmNlZFRhYmxlTmFtZSwgcmVmZXJlbmNlZENvbE5hbWVzLCBqb2luVGFibGUsIHJlZmVycmVySm9pbkNvbE5hbWVzLCByZWZlcmVuY2VkSm9pbkNvbE5hbWVzKTsKLQkJcmV0dXJuIGFzc29jaWF0aW9uOwotCX0KLQotCVN0cmluZyBnZXRSZWZlcnJlclRhYmxlTmFtZSgpewotCQlyZXR1cm4gKFN0cmluZylhc3NvY2lhdGlvbkRhdGFNb2RlbC5nZXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fUkVGRVJSRVJfVEFCTEUpOwotCX0KLQotCVN0cmluZyBnZXRSZWZlcmVuY2VkVGFibGVOYW1lKCl7Ci0JCXJldHVybiAoU3RyaW5nKWFzc29jaWF0aW9uRGF0YU1vZGVsLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9SRUZFUkVOQ0VEX1RBQkxFKTsKLQl9Ci0JCi0JU3RyaW5nIGdldEpvaW5UYWJsZU5hbWUoKXsKLQkJcmV0dXJuIChTdHJpbmcpYXNzb2NpYXRpb25EYXRhTW9kZWwuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fVEFCTEUgKTsKLQl9Ci0JCi0JU3RyaW5nIGdldENhcmRpbmFsaXR5KCl7Ci0JCXJldHVybiAoU3RyaW5nKWFzc29jaWF0aW9uRGF0YU1vZGVsLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9DQURJTkFMSVRZICk7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL05ld0Fzc29jaWF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vTmV3QXNzb2NpYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzMyOGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vTmV3QXNzb2NpYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLk9STUdlbkN1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXdBc3NvY2lhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCXByb3RlY3RlZCBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXI7Ci0JCi0JcHVibGljIE5ld0Fzc29jaWF0aW9uV2l6YXJkUGFnZShPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQl0aGlzLmN1c3RvbWl6ZXIgPSBjdXN0b21pemVyIDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFdpemFyZERhdGFNb2RlbCgpewotCQlyZXR1cm4gKChOZXdBc3NvY2lhdGlvbldpemFyZCl0aGlzLmdldFdpemFyZCgpKS5nZXREYXRhTW9kZWwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZWZlcnJlclRhYmxlTmFtZSgpewotCQlyZXR1cm4gKChOZXdBc3NvY2lhdGlvbldpemFyZClnZXRXaXphcmQoKSkuZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKXsKLQkJcmV0dXJuICgoTmV3QXNzb2NpYXRpb25XaXphcmQpZ2V0V2l6YXJkKCkpLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEpvaW5UYWJsZU5hbWUoKXsKLQkJcmV0dXJuICgoTmV3QXNzb2NpYXRpb25XaXphcmQpZ2V0V2l6YXJkKCkpLmdldEpvaW5UYWJsZU5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENhcmRpbmFsaXR5KCl7Ci0JCXJldHVybiAoKE5ld0Fzc29jaWF0aW9uV2l6YXJkKWdldFdpemFyZCgpKS5nZXRDYXJkaW5hbGl0eSgpIDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlV2l0aE5ld1RhYmxlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoZWxwcyBzeXN0ZW0uCi0JICogQHJldHVybiBUaGUgcGxhdGZvcm0ncyBoZWxwIHN5c3RlbQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vUHJvbXB0SlBBUHJvamVjdFdpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1Byb21wdEpQQVByb2plY3RXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOWM1M2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vUHJvbXB0SlBBUHJvamVjdFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1wdWJsaWMgY2xhc3MgUHJvbXB0SlBBUHJvamVjdFdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBTRUxFQ1RfUFJPSkVDVF9QQUdFX05BTUUgPSAiU2VsZWN0SlBBUHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFRhYmxlIHByb2pUYWJsZTsKLQlwcml2YXRlIFRhYmxlVmlld2VyIHByb2pUYWJsZVZpZXdlcjsKLQlwcml2YXRlIHN0YXRpYyBpbnQgUFJPSkVDVF9OQU1FX0NPTFVNTl9JTkRFWCA9IDA7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaGVscENvbnRleHRJZDsKLQkKLQlwcm90ZWN0ZWQgUHJvbXB0SlBBUHJvamVjdFdpemFyZFBhZ2UoIGZpbmFsIFN0cmluZyBoZWxwQ29udGV4dElkICkgewotCQlzdXBlcihTRUxFQ1RfUFJPSkVDVF9QQUdFX05BTUUpOwotCQlzZXRUaXRsZSggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3NlbGVjdEpQQVByb2plY3QgKTsKLQkJc2V0TWVzc2FnZSggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3NlbGVjdEpQQVByb2plY3RfbXNnICk7Ci0JCXRoaXMuaGVscENvbnRleHRJZCA9IGhlbHBDb250ZXh0SWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlpbnQgbkNvbHVtbnM9IDE7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBuQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwkJCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCggY29tcG9zaXRlLCBTV1QuTk9ORSApOwotCQlsYWJlbC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfc2VsZWN0SlBBUHJvamVjdCApOwotCQkKLQkJcHJvalRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuVklSVFVBTCk7CQkKLQkJcHJvalRhYmxlID0gcHJvalRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCBTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUgKTsKLQkJcHJvalRhYmxlLnNldExheW91dERhdGEoZ2QpOwotCQkJCQotCQlwcm9qVGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlSnBhUHJvamVjdFNlbGVjdGlvbigpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQkJCi0JCX0pOwotCQkKLQkJcHJvalRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHByb2pUYWJsZSk7Ci0JCXByb2pUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBQcm9qZWN0VGFibGVMYWJlbFByb3ZpZGVyKCkpOwotCQlwcm9qVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBQcm9qZWN0VGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWZpbGxKcGFQcm9qZWN0TGlzdCgpOwotCQlzZXRDb250cm9sKCBjb21wb3NpdGUgKTsKLQkJdmFsaWRhdGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUpwYVByb2plY3RTZWxlY3Rpb24oKSB7Ci0JCWlmIChwcm9qVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSAhPSAtMSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAgcHJvalRhYmxlLmdldEl0ZW0ocHJvalRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJU3RyaW5nIHByb2pOYW1lID0gaXRlbS5nZXRUZXh0KDApOwotCQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qTmFtZSk7Ci0JCQlKcGFQcm9qZWN0IGpwYVByb2ogPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QoIHByb2plY3QgKTsKLQkJCSgoR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQpZ2V0V2l6YXJkKCkpLnNldEpwYVByb2plY3QoanBhUHJvaik7Ci0JCQl2YWxpZGF0ZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmaWxsSnBhUHJvamVjdExpc3QoKSB7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCUxpc3Q8U3RyaW5nPiBwcm9qTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yICggSVByb2plY3QgcHJvamVjdCA6IHByb2plY3RzICkKLQkJewotCQkJSnBhUHJvamVjdCBqcGFQcm9qID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KCBwcm9qZWN0ICk7Ci0JCQlpZiAoIGpwYVByb2ogIT0gbnVsbCApIHsKLQkJCQlwcm9qTmFtZXMuYWRkKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlwcm9qVGFibGVWaWV3ZXIuc2V0SW5wdXQocHJvak5hbWVzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgewotCQlpZiAocHJvalRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgIT0gLTEpCi0JCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCWVsc2UKLQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCB2b2lkIHBlcmZvcm1IZWxwKCkgCi0JewotCSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5kaXNwbGF5SGVscCggdGhpcy5oZWxwQ29udGV4dElkICk7Ci0JfQotCi0JLy8gaW5uZXIgY2xhc3NlcwotCXByaXZhdGUgZmluYWwgY2xhc3MgUHJvamVjdFRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JCXsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSBQUk9KRUNUX05BTUVfQ09MVU1OX0lOREVYKQotCQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKG9yZy5lY2xpcHNlLnVpLmlkZS5JREUuU2hhcmVkSW1hZ2VzLklNR19PQkpfUFJPSkVDVCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCQl7Ci0JCQlhc3NlcnQgZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZzsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IChTdHJpbmcpZWxlbWVudDsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSBQUk9KRUNUX05BTUVfQ09MVU1OX0lOREVYKQotCQkJCXJldHVybiBwcm9qZWN0TmFtZTsKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQl9Ci0JCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm9qZWN0VGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotCXsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpewotCQkJcmV0dXJuICgoQ29sbGVjdGlvbjw/PikgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCl7fQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCl7fQotCQkKLQl9Ci19CQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vU1dUVXRpbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTE3MGQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NXVFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIHV0aWxpdHkgbWV0aG9kcyB0byBjcmVhdGUgU1dUIFVJCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU1dUVXRpbCB7Ci0JLyoqCi0JICogU2V0IHRoZSBsYXlvdXREYXRhIG9mIHRoZSBpbnB1dCBjb250cm9sIHRvIG9jY3VweSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbHVtbnMKLQkgKiBAcGFyYW0gYwotCSAqIEBwYXJhbSBjb2x1bW5zCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpbGxDb2x1bW5zKENvbnRyb2wgYywgaW50IGNvbHVtbnMpewotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5zOwotCQlsYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7Ci0JCWMuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJcmV0dXJuIDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZmlsbENvbHVtbnNXaXRoSW5kZW50KENvbnRyb2wgYywgaW50IGNvbHVtbnMsIGludCBpbmRlbnQpewotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5zOwotCQlsYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbEluZGVudCA9IGluZGVudCA7Ci0JCWMuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJcmV0dXJuIDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbGFiZWwgd2hpY2ggb2NjdXBpZXMgb25lIGdyaWQgY29sdW1uCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBuZXdMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCggcGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoIHRleHQgKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbGFiZWwgd2hpY2ggb2NjdXBpZXMgb25lIGdyaWQgY29sdW1uCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBuZXdMYWJlbFdpdGhJbmRlbnQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBpbmRlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoIHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCB0ZXh0ICk7Ci0JCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJbGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJbGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1AgOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxJbmRlbnQgPSBpbmRlbnQgOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBzZXBhcmF0b3IgbGluZS4gRXhwZWN0cyBhIDxjb2RlPkdyaWRMYXlvdXQ8L2NvZGU+IHdpdGggYXQgbGVhc3QgMSBjb2x1bW4uCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZSB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBuQ29sdW1ucyBudW1iZXIgb2YgY29sdW1ucyB0byBzcGFuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlU2VwYXJhdG9yKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBuQ29sdW1ucykgewotCQkobmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmRpYWxvZ2ZpZWxkcy5TZXBhcmF0b3IoCi0JCQkJU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKSkuZG9GaWxsSW50b0dyaWQoY29tcG9zaXRlLCBuQ29sdW1ucywgNSk7CQkKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLQkJQnV0dG9uIGJ0biA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBzdHlsZSk7Ci0JCWJ0bi5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWJ0bi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGJ0bjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiApIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oY29udGFpbmVyLCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT10cnVlOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4gKSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT10cnVlOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdFRhYmxlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9TZWxlY3RUYWJsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDZkNjQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdFRhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSW1hZ2VSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIEEgZGF0YWJhc2UgdGFibGUgc2VsZWN0aW9uIGRpYWxvZyB3aGljaCBhbGxvd3MgdXNlciB0byBmaWx0ZXIgdGFibGVzIGJ5IG5hbWUKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFRhYmxlRGlhbG9nIGV4dGVuZHMgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgewotCQotCXB1YmxpYyBTZWxlY3RUYWJsZURpYWxvZyhTaGVsbCBzaGVsbCwgZmluYWwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcil7Ci0JCXN1cGVyKHNoZWxsLCBuZXcgSUxhYmVsUHJvdmlkZXIoKXsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBJbWFnZVJlcG9zaXRvcnkuZ2V0VGFibGVJbWFnZShyZXNvdXJjZU1hbmFnZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJfQotCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikge30KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikge30KLQotCQl9KTsKLQkJdGhpcy5zZXRUaXRsZSggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5zZWxlY3RUYWJsZURsZ1RpdGxlICk7Ly8KLQkJdGhpcy5zZXRNZXNzYWdlKCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLnNlbGVjdFRhYmxlRGxnRGVzYyk7Ly8KLQl9Ci0JCi0JcHVibGljIFNlbGVjdFRhYmxlRGlhbG9nKFNoZWxsIHNoZWxsLCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyLCBTY2hlbWEgc2NoZW1hKXsKLQkJdGhpcyhzaGVsbCwgcmVzb3VyY2VNYW5hZ2VyKTsKLQkJCi0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChUYWJsZSB0YWJsZSA6IHNjaGVtYS5nZXRUYWJsZXMoKSkgewotCQkJbGlzdC5hZGQodGFibGUuZ2V0TmFtZSgpKTsKLQkJfQotCQl0aGlzLnNldEVsZW1lbnRzKCBsaXN0LnRvQXJyYXkoKSApOwotCQkKLQl9Ci0JCi0JcHVibGljIFNlbGVjdFRhYmxlRGlhbG9nKFNoZWxsIHNoZWxsLCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyLCBMaXN0PFN0cmluZz4gdGFibGVOYW1lcyl7Ci0JCXRoaXMoc2hlbGwsIHJlc291cmNlTWFuYWdlcik7Ci0JCXRoaXMuc2V0RWxlbWVudHMoIHRhYmxlTmFtZXMudG9BcnJheSgpICk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRUYWJsZSgpIHsKLQkJU3RyaW5nIHRhYmxlTmFtZSA9IChTdHJpbmcpdGhpcy5nZXRGaXJzdFJlc3VsdCgpOwotCQlyZXR1cm4gdGFibGVOYW1lIDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1RhYmxlQXNzb2NpYXRpb25zV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzBhNGMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1RhYmxlQXNzb2NpYXRpb25zV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uU1dUVXRpbC5maWxsQ29sdW1uczsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuLlNXVFV0aWwubmV3TGFiZWw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbi5TV1RVdGlsLm5ld0xhYmVsV2l0aEluZGVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmRpYWxvZ3MuU3RhdHVzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5kaWFsb2dmaWVsZHMuRGlhbG9nRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuZGlhbG9nZmllbGRzLklTdHJpbmdCdXR0b25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmRpYWxvZ2ZpZWxkcy5MYXlvdXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmRpYWxvZ2ZpZWxkcy5TdHJpbmdCdXR0b25EaWFsb2dGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5Bc3NvY2lhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLkFzc29jaWF0aW9uUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLk9STUdlbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLk9STUdlbkN1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkltYWdlUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0KLXB1YmxpYyBjbGFzcyBUYWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyIDsKLQkKLQlwcml2YXRlIEFzc29jaWF0aW9uc0xpc3RDb21wb3NpdGUgYXNzb2NpYXRpb25MaXN0OyAKLQlwcml2YXRlIEFzc29jaWF0aW9uIHNlbGVjdGVkQXNzb2NpYXRpb247Ci0JcHJpdmF0ZSBCdXR0b24gZGVsZXRlQXNzb2NpYXRpb25MaW5rIDsKLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVBc3NvY2lhdGlvbkxpbmsgOwotCQotCS8vQ29udHJvbHMgaW4gQXNzb2NpYXRpb24gRWRpdCBQYW5lbAotCXByaXZhdGUgQ29tcG9zaXRlIGFzc29jaWF0aW9uc0VkaXRQYW5lbCA7Ci0JcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVBc3NvY2lhdGlvbkNoZWNrQm94OyAKLQlwcml2YXRlIExhYmVsIGNhcmRpbmFsaXR5TGFiZWwgOwotCXByaXZhdGUgQ29tYm8gY2FyZGluYWxpdHlDb21ibyA7Ci0JLyp3aGV0aGVyIHRvIGdlbmVyYXRlIHRoZSByZWZlcnJlci0tPnJlZmVyZW5jZWQgcm9sZS4qLwotCXByaXZhdGUgQnV0dG9uIHJlZmVycmVyUm9sZUNoZWNrQm94OyAKLQkvKnRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgcmVmZXJyZXItLT5yZWZlcmVuY2VkIHJvbGUuKi8KLQlwcml2YXRlIExhYmVsIHJlZmVycmVyUm9sZVByb3BlcnR5TGFiZWw7Ci0JcHJpdmF0ZSBUZXh0IHJlZmVycmVyUm9sZVByb3BlcnR5RmllbGQgOwotCS8qdGhlIGNhc2NhZGUgaW4gdGhlIHJlZmVycmVyLS0+cmVmZXJlbmNlZCByb2xlLiovCi0JQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLQlwcml2YXRlIFN0cmluZ0J1dHRvbkRpYWxvZ0ZpZWxkIHJlZmVycmVyUm9sZUNhc2NhZGVGaWVsZDsKLQkvKndoZXRoZXIgdG8gZ2VuZXJhdGUgdGhlIHJlZmVyZW5jZWQtPnJlZmVycmVyIHJvbGUuKi8KLQlwcml2YXRlIEJ1dHRvbiByZWZlcmVuY2VkUm9sZUNoZWNrQm94OwotCS8qdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHRoZSByZWZlcmVuY2VkLT5yZWZlcnJlciByb2xlLiovCi0JcHJpdmF0ZSBMYWJlbCByZWZlcmVuY2VkUm9sZVByb3BlcnR5TGFiZWw7Ci0JcHJpdmF0ZSBUZXh0IHJlZmVyZW5jZWRSb2xlUHJvcGVydHlGaWVsZCA7Ci0JLyp0aGUgY2FzY2FkZSBpbiB0aGUgcmVmZXJlbmNlZC0+cmVmZXJyZXIgcm9sZS4qLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi0JcHJpdmF0ZSBTdHJpbmdCdXR0b25EaWFsb2dGaWVsZCByZWZlcmVuY2VkUm9sZUNhc2NhZGVGaWVsZDsKLQlwcml2YXRlIExhYmVsIGpvaW5Db25kaXRpb25MYWJlbDsKLQlwcml2YXRlIFRleHQgam9pbkNvbmRpdGlvblRleHQ7IAotCQotCXByaXZhdGUgQ29tcG9zaXRlIGRldGFpbFBhbmVsOwotCXByaXZhdGUgU3RhY2tMYXlvdXQgZGV0YWlsUGFuZWxTdGF0Y2tMYXlvdXQ7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgZW1wdHlQYW5lbDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcjsKLQotCXByb3RlY3RlZCBUYWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXN1cGVyKCJUYWJsZSBBc3NvY2lhdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQl0aGlzLnJlc291cmNlTWFuYWdlciA9IHJlc291cmNlTWFuYWdlcjsKLQkJc2V0VGl0bGUoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV90aXRsZSk7Ci0JCXNldE1lc3NhZ2UoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV9kZXNjKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWludCBuQ29sdW1ucz0gMiA7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBuQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQl0aGlzLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX1RBQkxFX0FTU09DSUFUSU9OUyk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY1BhZ2VfbGFiZWwgKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKCBnZCApOwotCQkKLQkJY3JlYXRlQXNzb2NpYXRpb25zTGlzdFBhbmVsKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUFkZERlbGV0ZUJ1dHRvbnMoY29tcG9zaXRlLCBuQ29sdW1ucyk7Ci0JCVNXVFV0aWwuY3JlYXRlU2VwYXJhdG9yKGNvbXBvc2l0ZSwgbkNvbHVtbnMpOwotCQkKLQkJY3JlYXRlRGV0YWlsUGFuZWwoY29tcG9zaXRlKTsKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCQkKLQkJY29tcG9zaXRlLmxheW91dCh0cnVlKTsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoIHRydWUpOwotCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQWRkRGVsZXRlQnV0dG9ucyhDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1ucykgewotCQkKLQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKCBjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZmlsbENvbHVtbnMoYywgMSk7Ci0JCWMuc2V0TGF5b3V0KCBuZXcgR3JpZExheW91dCgxLHRydWUpICk7Ci0JCQotCQljcmVhdGVBc3NvY2lhdGlvbkxpbmsgPSBuZXcgQnV0dG9uKGMsIFNXVC5OT05FKTsKLQkJY3JlYXRlQXNzb2NpYXRpb25MaW5rLnNldFRvb2xUaXBUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX25ld0Fzc29jICk7Ci0JCWNyZWF0ZUFzc29jaWF0aW9uTGluay5zZXRJbWFnZSggSW1hZ2VSZXBvc2l0b3J5LmdldEFkZEJ1dHRvbkltYWdlKHRoaXMucmVzb3VyY2VNYW5hZ2VyKSApOwotCQljcmVhdGVBc3NvY2lhdGlvbkxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30JCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbGF1bmNoTmV3QXNzb2NpYXRpb25zV2l6YXJkKCk7Ci0JCQl9CQotCQkJCi0JCX0pOwotCQkKLQkJZGVsZXRlQXNzb2NpYXRpb25MaW5rID0gbmV3IEJ1dHRvbihjLCBTV1QuTk9ORSk7Ci0JCUNvbG9yIGZvcmVncm91bmQgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXREZWZhdWx0KCksIDAsMCwyNTUpOwotCQlkZWxldGVBc3NvY2lhdGlvbkxpbmsuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQkJZm9yZWdyb3VuZC5kaXNwb3NlKCk7Ci0JCWRlbGV0ZUFzc29jaWF0aW9uTGluay5zZXRJbWFnZSggSW1hZ2VSZXBvc2l0b3J5LmdldERlbGV0ZUJ1dHRvbkltYWdlKHRoaXMucmVzb3VyY2VNYW5hZ2VyKSk7Ci0JCWRlbGV0ZUFzc29jaWF0aW9uTGluay5zZXRUb29sVGlwVGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV9kZWxBc3NvYyApOwotCQlkZWxldGVBc3NvY2lhdGlvbkxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30JCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb24gPSBhc3NvY2lhdGlvbkxpc3QuZ2V0U2VsZWN0ZWRBc3NvY2lhdGlvbigpOwotCQkJCWlmKCBhc3NvY2lhdGlvbiAhPSBudWxsICl7Ci0JCQkJCU9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciA9IGdldEN1c3RvbWl6ZXIoKTsKLQkJCQkJY3VzdG9taXplci5kZWxldGVBc3NvY2lhdGlvbihhc3NvY2lhdGlvbik7Ci0JCQkJCUxpc3Q8QXNzb2NpYXRpb24+IGFzc29jaWF0aW9ucyA9IGN1c3RvbWl6ZXIuZ2V0QXNzb2NpYXRpb25zKCk7Ci0JCQkJCWFzc29jaWF0aW9uTGlzdC51cGRhdGVBc3NvY2lhdGlvbnMoYXNzb2NpYXRpb25zKTsKLQkJCQkJaWYoIGFzc29jaWF0aW9ucy5zaXplKCk9PTAgKXsKLQkJCQkJCWhpZGVBc3NvY2lhdGlvbkRldGFpbCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQkKLQkJfSk7Ci0JCWRlbGV0ZUFzc29jaWF0aW9uTGluay5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdlbmVyYXRlQXNzb2NpYXRpb25DaGVja2JveChDb21wb3NpdGUgY29tcG9zaXRlLCAgaW50IGNvbHVtbnMpIHsKLQkJZ2VuZXJhdGVBc3NvY2lhdGlvbkNoZWNrQm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWdlbmVyYXRlQXNzb2NpYXRpb25DaGVja0JveC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3JfZ2VuQXNzb2MpOwotCQlnZW5lcmF0ZUFzc29jaWF0aW9uQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gYXNzb2NpYXRpb25MaXN0LmdldFNlbGVjdGVkQXNzb2NpYXRpb24oKTsKLQkJCQlpZiggYXNzb2NpYXRpb24gPT0gbnVsbCApCi0JCQkJCXJldHVybjsKLQkJCQlhc3NvY2lhdGlvbi5zZXRHZW5lcmF0ZWQoZ2VuZXJhdGVBc3NvY2lhdGlvbkNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQkKLQkJCQl1cGRhdGVBc3NvY2lhdGlvbkVkaXRQYW5lbChhc3NvY2lhdGlvbik7Ci0JCQkJYXNzb2NpYXRpb25MaXN0LnVwZGF0ZVNlbGVjdGVkQXNzb2NpYXRpb24oKTsKLQkJCX0KLQotCQl9KTsKLQotCQlmaWxsQ29sdW1ucyhnZW5lcmF0ZUFzc29jaWF0aW9uQ2hlY2tCb3gsIGNvbHVtbnMtMSk7Ci0JCW5ld0xhYmVsKGNvbXBvc2l0ZSwgIiIpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdlbmVyYXRlUmVmZXJyZXJSb2xlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgIGludCBjb2x1bW5zKSB7Ci0JCXJlZmVycmVyUm9sZUNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCXJlZmVycmVyUm9sZUNoZWNrQm94LnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9lbnRpdHlSZWYgKTsKLQkJcmVmZXJyZXJSb2xlQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gZ2VuZXJhdGUgPSByZWZlcnJlclJvbGVDaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkvL3JlZmVycmVyUm9sZVByb3BlcnR5RmllbGQuc2V0RWRpdGFibGUoIGdlbmVyYXRlICk7Ci0JCQkJcmVmZXJyZXJSb2xlUHJvcGVydHlMYWJlbC5zZXRFbmFibGVkKCBnZW5lcmF0ZSApOwotCQkJCXJlZmVycmVyUm9sZVByb3BlcnR5RmllbGQuc2V0RW5hYmxlZCggZ2VuZXJhdGUgKTsKLQkJCQlyZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuc2V0RW5hYmxlZChnZW5lcmF0ZSk7Ci0JCQkJCi0JCQkJLy9JZiBib3RoIHJlZmVyZW5jZWRSb2xlQ2hlY2tCb3ggYW5kIHJlZmVyZW5jZWRSb2xlQ2hlY2tCb3ggdW5jaGVja2VkLCAKLQkJCQkvL3RoZSBhc3NvY2lhdGlvbiBpdHNlbGYgc2hvdWxkbid0IGJlIGdlbmVyYXRlZCAKLQkJCQlpZiggIWdlbmVyYXRlICYmICFyZWZlcmVuY2VkUm9sZUNoZWNrQm94LmdldFNlbGVjdGlvbigpKXsKLQkJCQkJZ2VuZXJhdGVBc3NvY2lhdGlvbkNoZWNrQm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCWNhcmRpbmFsaXR5TGFiZWwuc2V0RW5hYmxlZCggZmFsc2UgKTsKLQkJCQkJY2FyZGluYWxpdHlDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmVmZXJyZXJSb2xlQ2hlY2tCb3guc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJlZmVyZW5jZWRSb2xlQ2hlY2tCb3guc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCQotCQkJCWRpcmVjdGlvbmFsaXR5Q2hlY2tCb3hDaGFuZ2VkKCApOwkJCQotCQkJCQotCQkJCWlmKCBnZW5lcmF0ZSApewotCQkJCQlBc3NvY2lhdGlvblJvbGUgcm9sZSA9IHNlbGVjdGVkQXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJSb2xlKCk7Ci0JCQkJCXJlZmVycmVyUm9sZVByb3BlcnR5RmllbGQuc2V0VGV4dCggcm9sZS5nZXRQcm9wZXJ0eU5hbWUoKSApOwotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQotCQlTV1RVdGlsLmZpbGxDb2x1bW5zV2l0aEluZGVudChyZWZlcnJlclJvbGVDaGVja0JveCAsIGNvbHVtbnMtMSwgMjAgKTsKLQkJbmV3TGFiZWwocGFyZW50LCAiIik7Ly8kTk9OLU5MUy0xJAotCQkKLQkJcmVmZXJyZXJSb2xlUHJvcGVydHlMYWJlbCA9IG5ld0xhYmVsV2l0aEluZGVudCggcGFyZW50LCAgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5wcm9wZXJ0eSwgNDAgKTsKLQkJcmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZCA9IG5ldyBUZXh0KCBwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlmaWxsQ29sdW1ucyhyZWZlcnJlclJvbGVQcm9wZXJ0eUZpZWxkLCAyKTsKLQkJcmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiggc2VsZWN0ZWRBc3NvY2lhdGlvbi5nZXRSZWZlcnJlclJvbGUoKSA9PSBudWxsICkKLQkJCQkJcmV0dXJuOwotCQkJCVN0cmluZyBmaWVsZE5hbWUgPSByZWZlcnJlclJvbGVQcm9wZXJ0eUZpZWxkLmdldFRleHQoKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUZpZWxkTmFtZSggZmllbGROYW1lICk7Ci0JCQkJaWYoICFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSApewotCQkJCQlzZWxlY3RlZEFzc29jaWF0aW9uLmdldFJlZmVycmVyUm9sZSgpLnNldFByb3BlcnR5TmFtZShmaWVsZE5hbWUpOwotCQkJCX0KLQkJCQl1cGRhdGVTdGF0dXMoc3RhdHVzKTsKLQkJCX0JCQkKLQkJfSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoIHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCAiIiApOy8vJE5PTi1OTFMtMSQKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCQotCQlyZWZlcnJlclJvbGVDYXNjYWRlRmllbGQgPSBuZXcgU3RyaW5nQnV0dG9uRGlhbG9nRmllbGQoIG5ldyBJU3RyaW5nQnV0dG9uQWRhcHRlcigpewotCQkJcHVibGljIHZvaWQgY2hhbmdlQ29udHJvbFByZXNzZWQoRGlhbG9nRmllbGQgZmllbGQpIHsKLQkJCQlpZiggZWRpdENhc2NhZGUoIHNlbGVjdGVkQXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJSb2xlKCkgKSl7Ci0JCQkJCXJlZmVycmVyUm9sZUNhc2NhZGVGaWVsZC5zZXRUZXh0KHNlbGVjdGVkQXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJSb2xlKCkuZ2V0Q2FzY2FkZSgpKTsKLQkJCQl9Ci0JCQl9CQotCQl9KSA7Ci0JCXJlZmVycmVyUm9sZUNhc2NhZGVGaWVsZC5zZXRMYWJlbFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuY2FzY2FkZSApOwotCQlyZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuc2V0QnV0dG9uTGFiZWwoIiIpOyAvLyROT04tTkxTLTEkCi0JCXJlZmVycmVyUm9sZUNhc2NhZGVGaWVsZC5kb0ZpbGxJbnRvR3JpZChwYXJlbnQsIDMpOwotCQlyZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuZ2V0VGV4dENvbnRyb2wocGFyZW50KS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWludCBtYXhGaWVsZFdpZHRoID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDQwKTsKLQkJTGF5b3V0VXRpbC5zZXRXaWR0aEhpbnQocmVmZXJyZXJSb2xlQ2FzY2FkZUZpZWxkLmdldFRleHRDb250cm9sKG51bGwpLCBtYXhGaWVsZFdpZHRoICk7Ci0JCUJ1dHRvbiBidG4gPSByZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuZ2V0Q2hhbmdlQ29udHJvbChudWxsKTsKLQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSlidG4uZ2V0TGF5b3V0RGF0YSgpOwotCQlidG4uc2V0SW1hZ2UoIEltYWdlUmVwb3NpdG9yeS5nZXRCcm93c2VCdXR0b25JbWFnZSh0aGlzLnJlc291cmNlTWFuYWdlcikgKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDsKLQkJYnRuLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlMYWJlbCBsYWJlbEN0cmwgID0gcmVmZXJyZXJSb2xlQ2FzY2FkZUZpZWxkLmdldExhYmVsQ29udHJvbChwYXJlbnQpOwotCQlkYXRhID0gKEdyaWREYXRhKWxhYmVsQ3RybC5nZXRMYXlvdXREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDQwIDsKLQkJbGFiZWxDdHJsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwoIHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCAiIiApOy8vJE5PTi1OTFMtMSQKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCQotCX0JCi0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYoIHZpc2libGUgKXsKLQkJCWhpZGVBc3NvY2lhdGlvbkRldGFpbCgpOwotCQkJdXBkYXRlQXNzb2NpYXRpb25zTGlzdFBhbmVsKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGlkZUFzc29jaWF0aW9uRGV0YWlsKCApewotCQl0aGlzLmRldGFpbFBhbmVsU3RhdGNrTGF5b3V0LnRvcENvbnRyb2wgPSBlbXB0eVBhbmVsOwotCQl0aGlzLmRldGFpbFBhbmVsLmxheW91dCgpOwotCQl0aGlzLmRldGFpbFBhbmVsLmdldFBhcmVudCgpLmxheW91dCgpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzdGF0dXMgbGluZSBhbmQgdGhlIE9LIGJ1dHRvbiBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHN0YXR1cwotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMgc3RhdHVzIHRvIGFwcGx5Ci0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKCFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSk7Ci0JCQotCQlTdGF0dXNVdGlsLmFwcGx5VG9TdGF0dXNMaW5lKHRoaXMsIHN0YXR1cyk7Ci0JCWlmKCBzdGF0dXMuZ2V0Q29kZSgpID09IFN0YXR1cy5PSyApewotCQkJc2V0TWVzc2FnZShKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX2Rlc2MpOwotCQl9Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdlbmVyYXRlUmVmZXJlbmNlZFJvbGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCAgaW50IGNvbHVtbnMpIHsKLQkJcmVmZXJlbmNlZFJvbGVDaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlyZWZlcmVuY2VkUm9sZUNoZWNrQm94LnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9zZXRSZWYgKTsKLQkJcmVmZXJlbmNlZFJvbGVDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYm9vbGVhbiBnZW5lcmF0ZSA9IHJlZmVyZW5jZWRSb2xlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJcmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUxhYmVsLnNldEVuYWJsZWQoIGdlbmVyYXRlKTsKLQkJCQlyZWZlcmVuY2VkUm9sZVByb3BlcnR5RmllbGQuc2V0RW5hYmxlZCggZ2VuZXJhdGUpOwotCQkJCXJlZmVyZW5jZWRSb2xlQ2FzY2FkZUZpZWxkLnNldEVuYWJsZWQoZ2VuZXJhdGUpOwotCQkJCQotCQkJCWlmKCAhZ2VuZXJhdGUgJiYgIXJlZmVycmVyUm9sZUNoZWNrQm94LmdldFNlbGVjdGlvbigpKXsKLQkJCQkJZ2VuZXJhdGVBc3NvY2lhdGlvbkNoZWNrQm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCWNhcmRpbmFsaXR5Q29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJlZmVycmVyUm9sZUNoZWNrQm94LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZWZlcmVuY2VkUm9sZUNoZWNrQm94LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlkaXJlY3Rpb25hbGl0eUNoZWNrQm94Q2hhbmdlZCgpOwotCQkJCWlmKCBnZW5lcmF0ZSApewotCQkJCQlBc3NvY2lhdGlvblJvbGUgcm9sZSA9IHNlbGVjdGVkQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFJvbGUoKTsKLQkJCQkJcmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLnNldFRleHQoIHJvbGUuZ2V0UHJvcGVydHlOYW1lKCkgKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJU1dUVXRpbC5maWxsQ29sdW1uc1dpdGhJbmRlbnQoIHJlZmVyZW5jZWRSb2xlQ2hlY2tCb3ggLCBjb2x1bW5zLTEsIDIwICk7Ci0JCW5ld0xhYmVsKHBhcmVudCwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJCi0JCXJlZmVyZW5jZWRSb2xlUHJvcGVydHlMYWJlbCA9IFNXVFV0aWwubmV3TGFiZWxXaXRoSW5kZW50KHBhcmVudCwgIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMucHJvcGVydHksIDQwICk7Ci0JCQotCQlyZWZlcmVuY2VkUm9sZVByb3BlcnR5RmllbGQgPSBuZXcgVGV4dCggcGFyZW50LCBTV1QuQk9SREVSKTsKLQkJZmlsbENvbHVtbnMocmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLCAyKTsKLQkJcmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYoIHNlbGVjdGVkQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFJvbGUoKSA9PSBudWxsICkKLQkJCQkJcmV0dXJuIDsKLQkJCQkKLQkJCQlTdHJpbmcgZmllbGROYW1lID0gcmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLmdldFRleHQoKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUlkZW50aWZpZXIoZmllbGROYW1lLAotCQkJCQkJSmF2YUNvcmUuVkVSU0lPTl8xXzMsIEphdmFDb3JlLlZFUlNJT05fMV8zKTsKLQkJCQlpZiggIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpICl7Ci0JCQkJCWlmKCAhZmllbGROYW1lLmVxdWFscyhzZWxlY3RlZEFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRSb2xlKCkuZ2V0UHJvcGVydHlOYW1lKCkpICkKLQkJCQkJCXNlbGVjdGVkQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFJvbGUoKS5zZXRQcm9wZXJ0eU5hbWUoZmllbGROYW1lKTsKLQkJCQl9Ci0JCQkJdXBkYXRlU3RhdHVzKHN0YXR1cyk7Ci0JCQl9CQkJCi0JCX0pOwotCQkKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCggcGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoICIiICk7Ly8kTk9OLU5MUy0xJAotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJCi0JCQotCQlyZWZlcmVuY2VkUm9sZUNhc2NhZGVGaWVsZCA9IG5ldyBTdHJpbmdCdXR0b25EaWFsb2dGaWVsZCggbmV3IElTdHJpbmdCdXR0b25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VDb250cm9sUHJlc3NlZChEaWFsb2dGaWVsZCBmaWVsZCkgewotCQkJCWlmKCBlZGl0Q2FzY2FkZSggc2VsZWN0ZWRBc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkUm9sZSgpICkgKXsKLQkJCQkJcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuc2V0VGV4dCggc2VsZWN0ZWRBc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkUm9sZSgpLmdldENhc2NhZGUoKSApOwotCQkJCX0KLQkJCX0JCi0JCX0pIDsKLQkJcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuc2V0TGFiZWxUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLmNhc2NhZGUgKTsKLQkJcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuc2V0QnV0dG9uTGFiZWwoIiIpOyAvLyROT04tTkxTLTEkCi0JCXJlZmVyZW5jZWRSb2xlQ2FzY2FkZUZpZWxkLmRvRmlsbEludG9HcmlkKHBhcmVudCwgMyk7Ci0JCXJlZmVyZW5jZWRSb2xlQ2FzY2FkZUZpZWxkLmdldFRleHRDb250cm9sKHBhcmVudCkuc2V0RWRpdGFibGUoIGZhbHNlKTsKLQkJaW50IG1heEZpZWxkV2lkdGggPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNDApOwotCQlMYXlvdXRVdGlsLnNldFdpZHRoSGludChyZWZlcmVuY2VkUm9sZUNhc2NhZGVGaWVsZC5nZXRUZXh0Q29udHJvbChudWxsKSwgbWF4RmllbGRXaWR0aCApOwotCQlCdXR0b24gYnRuID0gcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuZ2V0Q2hhbmdlQ29udHJvbChudWxsKTsKLQkJYnRuLnNldEltYWdlKCBJbWFnZVJlcG9zaXRvcnkuZ2V0QnJvd3NlQnV0dG9uSW1hZ2UodGhpcy5yZXNvdXJjZU1hbmFnZXIpICk7Ci0JCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpYnRuLmdldExheW91dERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDsKLQkJYnRuLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlMYWJlbCBsYWJlbEN0cmwgID0gcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuZ2V0TGFiZWxDb250cm9sKHBhcmVudCk7Ci0JCWRhdGEgPSAoR3JpZERhdGEpbGFiZWxDdHJsLmdldExheW91dERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNDAgOwotCQlsYWJlbEN0cmwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKCBwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCggIiIgKTsvLyROT04tTkxTLTEkCi0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQkKLQl9CQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZXRhaWxQYW5lbChDb21wb3NpdGUgY29tcG9zaXRlICkgewotCQkKLQkJdGhpcy5kZXRhaWxQYW5lbCA9IG5ldyBDb21wb3NpdGUoIGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotCQl0aGlzLmRldGFpbFBhbmVsLnNldExheW91dERhdGEoZ2QpOwotCQl0aGlzLmRldGFpbFBhbmVsU3RhdGNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0JCXRoaXMuZGV0YWlsUGFuZWwuc2V0TGF5b3V0KCB0aGlzLmRldGFpbFBhbmVsU3RhdGNrTGF5b3V0ICk7Ci0JCQotCQllbXB0eVBhbmVsID0gbmV3IENvbXBvc2l0ZSggZGV0YWlsUGFuZWwsIFNXVC5OT05FKTsKLQkJZW1wdHlQYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsgCi0JCWRldGFpbFBhbmVsU3RhdGNrTGF5b3V0LnRvcENvbnRyb2wgPSBlbXB0eVBhbmVsOwotCQlkZXRhaWxQYW5lbC5sYXlvdXQoKTsKLQkJCi0JCWNvbXBvc2l0ZS5sYXlvdXQoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQXNzb2NpYXRpb25zRWRpdFBhbmVsKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKCBjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZmlsbENvbHVtbnMocGFyZW50LCA0KTsKLQotCQljcmVhdGVHZW5lcmF0ZUFzc29jaWF0aW9uQ2hlY2tib3gocGFyZW50LGNvbHVtbnMpOwotCQlpbnQgbkNvbHVtbnM9IDQgOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbkNvbHVtbnM7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvL0NhcmRpbmFsaXR5Ci0JCWNhcmRpbmFsaXR5TGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNhcmRpbmFsaXR5TGFiZWwuc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5jYXJkaW5hbGl0eSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJY2FyZGluYWxpdHlMYWJlbC5zZXRMYXlvdXREYXRhKCBnZCApOwotCQkKLQkJY2FyZGluYWxpdHlDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZICk7Ci0JCQotCQlmaWxsQ29sdW1ucyhjYXJkaW5hbGl0eUNvbWJvLCAxKTsKLQkJCi0JCWNhcmRpbmFsaXR5Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RlZEFzc29jaWF0aW9uLnNldENhcmRpbmFsaXR5KCBjYXJkaW5hbGl0eUNvbWJvLmdldFRleHQoKSk7Ci0JCQkJYXNzb2NpYXRpb25MaXN0LnVwZGF0ZVNlbGVjdGVkQXNzb2NpYXRpb24oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvL0FkZGluZyBhIGZpbGxlciBjb2x1bW4KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoIHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCAiIik7Ly8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJCi0JCS8vVGFibGUgam9pbiBjb25kaXRpb24KLQkJam9pbkNvbmRpdGlvbkxhYmVsID0gbmV3TGFiZWxXaXRoSW5kZW50KHBhcmVudCwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX3RhYmxlSm9pbiwgMjAgKTsKLQkJCi0JCWpvaW5Db25kaXRpb25UZXh0ID0gbmV3IFRleHQoIHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiApOwotCQlqb2luQ29uZGl0aW9uVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWpvaW5Db25kaXRpb25UZXh0LnNldFRleHQoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX2pvaW5lZFdoZW4pOwotCQlsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQkJbGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWxheW91dERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWxheW91dERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKLQkJbGF5b3V0RGF0YS5oZWlnaHRIaW50ID0gNTA7Ci0JCWpvaW5Db25kaXRpb25UZXh0LnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCW5ld0xhYmVsKHBhcmVudCwgIiIpOy8vJE5PTi1OTFMtMSQKLQotCQkvL0dlbmVyYXRlIFVJIGNvbnRyb2xzIGZvciBSZWZlcnJlclJvbGUKLQkJY3JlYXRlR2VuZXJhdGVSZWZlcnJlclJvbGVDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOwotCi0JCS8vR2VuZXJhdGUgVUkgY29udHJvbHMgZm9yIFJlZmVyZW5jZWRSb2xlCi0JCWNyZWF0ZUdlbmVyYXRlUmVmZXJlbmNlZFJvbGVDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOwotCQkKLQkJCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZWRpdENhc2NhZGUoQXNzb2NpYXRpb25Sb2xlIHJvbGUpIHsKLQkJQ2FzY2FkZURpYWxvZyBkbGcgPSBDYXNjYWRlRGlhbG9nLmNyZWF0ZShyb2xlKTsKLQkJaWYgKGRsZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQkKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBc3NvY2lhdGlvbnNMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSggcGFyZW50LCBTV1QuTlVMTCApOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KCBuZXcgRmlsbExheW91dCgpKTsKLQkJQ29sb3IgYmFja2dyb3VuZENvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLDI1NSwgMCwwKTsKLQkJY29tcG9zaXRlLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQkJYmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJbGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWxheW91dERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlsYXlvdXREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJbGF5b3V0RGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJCi0JCWFzc29jaWF0aW9uTGlzdCA9IG5ldyBBc3NvY2lhdGlvbnNMaXN0Q29tcG9zaXRlKGNvbXBvc2l0ZSwgdGhpcywgdGhpcy5yZXNvdXJjZU1hbmFnZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbGF1bmNoTmV3QXNzb2NpYXRpb25zV2l6YXJkKCkgewotCQlPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBnZXRDdXN0b21pemVyKCk7Ci0JCU5ld0Fzc29jaWF0aW9uV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdBc3NvY2lhdGlvbldpemFyZCh0aGlzLmpwYVByb2plY3QsIGN1c3RvbWl6ZXIsIHRoaXMucmVzb3VyY2VNYW5hZ2VyKTsKLQkJCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKCB0aGlzLmdldFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJaW50IHJldHVybkNvZGUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAocmV0dXJuQ29kZSA9PSBXaW5kb3cuT0spIHsKLQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gd2l6YXJkLmdldE5ld0Fzc29jaWF0aW9uKCk7Ci0JCQlpZiggYXNzb2NpYXRpb24gIT1udWxsICl7Ci0JCQkJY3VzdG9taXplci5hZGRBc3NvY2lhdGlvbihhc3NvY2lhdGlvbik7Ci0JCQkJdXBkYXRlRm9yZWlnbktleUNvbHVtbkdlblByb3BlcnR5KGFzc29jaWF0aW9uKTsKLQkJCQl1cGRhdGVBc3NvY2lhdGlvbnNMaXN0UGFuZWwoKTsKLQkJCX0KLQkJfQkJCi0JfQotCS8qKgotCSAqIEZvciB1c2VyIGNyZWF0ZWQgYXNzb2NpYXRpb246Ci0JICogSWYgYXNzb2NpYXRpb24gaXMgdG8gYmUgZ2VuZXJhdGVkLCBubyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBnZXR0ZXIvc2V0dGVyIGZvciB0aGUgY29sdW1uIGl0c2VsZgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVGb3JlaWduS2V5Q29sdW1uR2VuUHJvcGVydHkoQXNzb2NpYXRpb24gYXNzb2NpYXRpb24pIHsKLQkJLy9OZWVkIHRvIHByb2Nlc3MgTUFOWV9UT19PTkUgb25seSBzaW5jZSB0aGUgdGhlIGFzc29jaWF0aW9ucyBsaXN0IGFyZSBvcHRpbWl6ZWQgdG8gaGF2ZSBNQU5ZX1RPX09ORQotCQlpZiggYXNzb2NpYXRpb24uaXNDdXN0b20oKSAmJiBhc3NvY2lhdGlvbi5nZXRDYXJkaW5hbGl0eSgpLmVxdWFscyggQXNzb2NpYXRpb24uTUFOWV9UT19PTkUgKSApewotCQkJYm9vbGVhbiBnZW5lcmF0ZUNvbHVtbiA9ICAhYXNzb2NpYXRpb24uaXNHZW5lcmF0ZWQoKTsKLQkJCS8vVGhlICJNQU5ZIiBzaWRlIERCIHRhYmxlCi0JCQkvL09STUdlblRhYmxlIHRhYmxlMSA9IGFzc29jaWF0aW9uLmdldFJlZmVycmVyVGFibGUoKTsKLQkJCS8vVGhlICJPTkUiIHNpZGUgREIgdGFibGUKLQkJCS8vT1JNR2VuVGFibGUgdGFibGUyID0gYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCQkvL1RoZSBsaXN0IG9mIGZvcmVpZ24ga2V5IGNvbHVtbnMgaW4gdGhlIE1BTlkgc2lkZSwgc2hvdWxkIG5vdCBiZSBnZW5lcmF0ZWQKLQkJCS8vVGhlIGxpc3Qgb2YgcHJpbWFyeSBrZXlzIGluIHRoZSBPTkUgc2lkZSwgd2lsbCBiZSBnZW5lcmF0ZWQKLQkJCS8vTGlzdDxPUk1HZW5Db2x1bW4+IGxpc3QyID0gYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZENvbHVtbnMoKTsJCi0JCQlMaXN0PE9STUdlbkNvbHVtbj4gbGlzdDEgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcnJlckNvbHVtbnMoKTsJCi0JCQlmb3IoT1JNR2VuQ29sdW1uIGMgOiBsaXN0MSApewotCQkJCWlmKCBjLmlzR2VuZXJhdGVkKCkgIT0gZ2VuZXJhdGVDb2x1bW4pewotCQkJCQlpZiggIWdlbmVyYXRlQ29sdW1uICYmIGMuZ2V0RGJDb2x1bW4oKS5pc1BhcnRPZlByaW1hcnlLZXkoKSApewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYy5zZXRHZW5lcmF0ZWQoZ2VuZXJhdGVDb2x1bW4pOwotCQkJCQljLnNldEluc2VydGFibGUoZ2VuZXJhdGVDb2x1bW4pOwotCQkJCQljLnNldFVwZGF0ZWFibGUoZ2VuZXJhdGVDb2x1bW4pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVBc3NvY2lhdGlvbnNMaXN0UGFuZWwoKSB7Ci0JCQlPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBnZXRDdXN0b21pemVyKCk7Ci0JCQkvL0lmIHVzZXIgY2hhbmdlZCB0aGUgY29ubmVjdGlvbiBvciBzY2hlbWEKLQkJCWlmKCB0aGlzLmN1c3RvbWl6ZXIgIT0gY3VzdG9taXplciApewotCQkJCXRoaXMuY3VzdG9taXplciA9IGN1c3RvbWl6ZXI7IAotCQkJfQotCQkJTGlzdDxBc3NvY2lhdGlvbj4gYXNzb2NpYXRpb25zID0gY3VzdG9taXplci5nZXRBc3NvY2lhdGlvbnMoKTsKLQkJCXRoaXMuYXNzb2NpYXRpb25MaXN0LnVwZGF0ZUFzc29jaWF0aW9ucyggYXNzb2NpYXRpb25zICk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLQlwdWJsaWMgdm9pZCB1cGRhdGVBc3NvY2lhdGlvbkVkaXRQYW5lbChBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbikgewotCQl0aGlzLnNlbGVjdGVkQXNzb2NpYXRpb24gPSBhc3NvY2lhdGlvbjsKLQotCQlib29sZWFuIGVuYWJsZWQgPSBhc3NvY2lhdGlvbi5pc0N1c3RvbSgpOwotCQl0aGlzLmRlbGV0ZUFzc29jaWF0aW9uTGluay5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkKLQkJLy9DcmVhdGUgYW5kIGRpc3BsYXkgdGhlIGFzc29jaWF0aW9uc0VkaXRQYW5lbCBpZiBpdCB3YXMgaGlkZGVuIGJlZm9yZQotCQlpZiggYXNzb2NpYXRpb25zRWRpdFBhbmVsID09IG51bGwgKXsKLQkJCWFzc29jaWF0aW9uc0VkaXRQYW5lbCA9IHRoaXMuY3JlYXRlQXNzb2NpYXRpb25zRWRpdFBhbmVsKHRoaXMuZGV0YWlsUGFuZWwsIDQpOwotCQl9Ci0JCXRoaXMuZGV0YWlsUGFuZWxTdGF0Y2tMYXlvdXQudG9wQ29udHJvbCA9IGFzc29jaWF0aW9uc0VkaXRQYW5lbDsKLQkJdGhpcy5kZXRhaWxQYW5lbC5sYXlvdXQoKTsKLQkJdGhpcy5kZXRhaWxQYW5lbC5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQotCQkvL1VwZGF0ZSB0aGUgVUkgY29udHJvbHMgZnJvbSB0aGUgbW9kZWwKLQkJU3RyaW5nIHRhYmxlMU5hbWUgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcnJlclRhYmxlTmFtZSgpOwotCQlTdHJpbmcgdGFibGUyTmFtZSA9IGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKTsKLQkJU3RyaW5nIGpvaW5UYWJsZU5hbWUgPSBhc3NvY2lhdGlvbi5nZXRKb2luVGFibGVOYW1lKCk7Ci0JCQotCQlib29sZWFuIGlzR2VuZXJhdGVkID0gYXNzb2NpYXRpb24uaXNHZW5lcmF0ZWQoKTsKLQkJdGhpcy5nZW5lcmF0ZUFzc29jaWF0aW9uQ2hlY2tCb3guc2V0U2VsZWN0aW9uKGlzR2VuZXJhdGVkKTsKLQkJdGhpcy5yZWZlcnJlclJvbGVQcm9wZXJ0eUxhYmVsLnNldEVuYWJsZWQoIGlzR2VuZXJhdGVkICk7Ci0JCXRoaXMucmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZC5zZXRFbmFibGVkKCBpc0dlbmVyYXRlZCApOwotCQl0aGlzLnJlZmVycmVyUm9sZUNoZWNrQm94LnNldEVuYWJsZWQoIGlzR2VuZXJhdGVkICk7Ci0JCXRoaXMucmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUxhYmVsLnNldEVuYWJsZWQoIGlzR2VuZXJhdGVkICk7Ci0JCXRoaXMucmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLnNldEVuYWJsZWQoIGlzR2VuZXJhdGVkICk7Ci0JCXRoaXMucmVmZXJlbmNlZFJvbGVDaGVja0JveC5zZXRFbmFibGVkKCBpc0dlbmVyYXRlZCApOwotCQl0aGlzLmNhcmRpbmFsaXR5TGFiZWwuc2V0RW5hYmxlZChpc0dlbmVyYXRlZCk7Ci0JCXRoaXMuY2FyZGluYWxpdHlDb21iby5zZXRFbmFibGVkKGlzR2VuZXJhdGVkKTsKLQkJdGhpcy5qb2luQ29uZGl0aW9uTGFiZWwuc2V0RW5hYmxlZCggaXNHZW5lcmF0ZWQgKTsKLQkJdGhpcy5qb2luQ29uZGl0aW9uVGV4dC5zZXRFbmFibGVkKCBpc0dlbmVyYXRlZCApOwotCQkKLQkJU3RyaW5nIGNhcmRpbmFsaXR5ID0gYXNzb2NpYXRpb24uZ2V0Q2FyZGluYWxpdHkoKTsKLQkJaWYoIEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWS5lcXVhbHMoIGNhcmRpbmFsaXR5ICkgKXsKLQkJCWNhcmRpbmFsaXR5Q29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQljYXJkaW5hbGl0eUNvbWJvLmFkZCggQXNzb2NpYXRpb24uTUFOWV9UT19NQU5ZKTsKLQkJfWVsc2V7Ci0JCQljYXJkaW5hbGl0eUNvbWJvLnJlbW92ZUFsbCgpOwotCQkJY2FyZGluYWxpdHlDb21iby5hZGQoIEFzc29jaWF0aW9uLk1BTllfVE9fT05FKTsKLQkJCWNhcmRpbmFsaXR5Q29tYm8uYWRkKCBBc3NvY2lhdGlvbi5PTkVfVE9fT05FKTsKLQkJfQotCQkKLQkJY2FyZGluYWxpdHlDb21iby5zZXRUZXh0KGNhcmRpbmFsaXR5KTsKLQkJY2FyZGluYWxpdHlDb21iby5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQkvL2lmIE1UTQotCQlpZiggQXNzb2NpYXRpb24uTUFOWV9UT19NQU5ZLmVxdWFscyggY2FyZGluYWxpdHkgKSApewotCQkJdGV4dCA9IFN0cmluZy5mb3JtYXQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9zZXRSZWYsIHRhYmxlMk5hbWUsIHRhYmxlMU5hbWUpOwotCQl9ZWxzZXsKLQkJCXRleHQgPSBTdHJpbmcuZm9ybWF0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3JfZW50aXR5UmVmLCB0YWJsZTJOYW1lLCB0YWJsZTFOYW1lKTsKLQkJfQotCQl0aGlzLnJlZmVycmVyUm9sZUNoZWNrQm94LnNldFRleHQodGV4dCk7Ci0KLQkJLy9pZiBPVE8KLQkJaWYoIEFzc29jaWF0aW9uLk9ORV9UT19PTkUuZXF1YWxzKCBjYXJkaW5hbGl0eSApICl7Ci0JCQl0ZXh0ID0gU3RyaW5nLmZvcm1hdCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX2VudGl0eVJlZiwgdGFibGUxTmFtZSwgdGFibGUyTmFtZSk7Ci0JCX1lbHNlewotCQkJdGV4dCA9IFN0cmluZy5mb3JtYXQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9zZXRSZWYsIHRhYmxlMU5hbWUsIHRhYmxlMk5hbWUpOwotCQl9Ci0JCXRoaXMucmVmZXJlbmNlZFJvbGVDaGVja0JveC5zZXRUZXh0KHRleHQpOwotCi0JCS8vQXNzb2NpYXRpb25Sb2xlIHByb3BlcnRpZXMKLQkJQXNzb2NpYXRpb25Sb2xlIHJlZmVycmVyUm9sZSA9IGFzc29jaWF0aW9uLmdldFJlZmVycmVyUm9sZSgpOwotCQlpZiggcmVmZXJyZXJSb2xlICE9IG51bGwpewotCQkJdGhpcy5yZWZlcnJlclJvbGVDaGVja0JveC5zZXRTZWxlY3Rpb24oIHRydWUgKTsKLQkJCXRoaXMucmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZC5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCXRoaXMucmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZC5zZXRUZXh0KHJlZmVycmVyUm9sZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCQl0aGlzLnJlZmVycmVyUm9sZUNhc2NhZGVGaWVsZC5zZXRFbmFibGVkKHRydWUpOwotCQkJU3RyaW5nIGNhc2NhZGUgPSByZWZlcnJlclJvbGUuZ2V0Q2FzY2FkZSgpOwotCQkJaWYoIGNhc2NhZGUhPW51bGwgKSAKLQkJCQl0aGlzLnJlZmVycmVyUm9sZUNhc2NhZGVGaWVsZC5zZXRUZXh0KCBjYXNjYWRlICk7Ci0JCQkKLQkJCS8vaWYgTVRPOiAKLQkJCWlmKCBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORS5lcXVhbHMoIGNhcmRpbmFsaXR5ICkgKXsKLQkJCQl0aGlzLnJlZmVycmVyUm9sZUNoZWNrQm94LnNldEVuYWJsZWQoIGZhbHNlICk7Ci0JCQl9Ci0JCX1lbHNlewotCQkJdGhpcy5yZWZlcnJlclJvbGVDaGVja0JveC5zZXRTZWxlY3Rpb24oIGZhbHNlICk7Ci0JCQl0aGlzLnJlZmVycmVyUm9sZVByb3BlcnR5TGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl0aGlzLnJlZmVycmVyUm9sZVByb3BlcnR5RmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJdGhpcy5yZWZlcnJlclJvbGVQcm9wZXJ0eUZpZWxkLnNldFRleHQoIiIpOwotCQkJdGhpcy5yZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkJCi0JCUFzc29jaWF0aW9uUm9sZSByZWZlcmVuY2VkUm9sZSA9IGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRSb2xlKCk7Ci0JCWlmKCByZWZlcmVuY2VkUm9sZSAhPSBudWxsKXsKLQkJCXRoaXMucmVmZXJlbmNlZFJvbGVDaGVja0JveC5zZXRTZWxlY3Rpb24oIHRydWUgKTsKLQkJCXRoaXMucmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUxhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl0aGlzLnJlZmVyZW5jZWRSb2xlUHJvcGVydHlGaWVsZC5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCXRoaXMucmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLnNldFRleHQocmVmZXJlbmNlZFJvbGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJdGhpcy5yZWZlcmVuY2VkUm9sZUNhc2NhZGVGaWVsZC5zZXRFbmFibGVkKHRydWUpOwotCQkJU3RyaW5nIGNhc2NhZGUgPSByZWZlcmVuY2VkUm9sZS5nZXRDYXNjYWRlKCk7Ci0JCQlpZiggY2FzY2FkZSE9bnVsbCApIAotCQkJCXRoaXMucmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuc2V0VGV4dChjYXNjYWRlKTsKLQkJfWVsc2V7Ci0JCQl0aGlzLnJlZmVyZW5jZWRSb2xlQ2hlY2tCb3guc2V0U2VsZWN0aW9uKCBmYWxzZSApOwotCQkJdGhpcy5yZWZlcmVuY2VkUm9sZVByb3BlcnR5TGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl0aGlzLnJlZmVyZW5jZWRSb2xlUHJvcGVydHlGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQl0aGlzLnJlZmVyZW5jZWRSb2xlUHJvcGVydHlGaWVsZC5zZXRUZXh0KCIiKTsKLQkJCXRoaXMucmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkJCi0JCS8vSm9pbiBjb25kaXRpb25zCi0JCXVwZGF0ZUpvaW5Db25kaXRpb25zKGFzc29jaWF0aW9uLCB0YWJsZTFOYW1lLCB0YWJsZTJOYW1lLCBqb2luVGFibGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSm9pbkNvbmRpdGlvbnMoQXNzb2NpYXRpb24gYXNzb2NpYXRpb24sCi0JCQlTdHJpbmcgdGFibGUxTmFtZSwgU3RyaW5nIHRhYmxlMk5hbWUsIFN0cmluZyBqb2luVGFibGVOYW1lKSB7Ci0JCVN0cmluZyB0ZXh0ID0gIiVzIjsKLQkJaWYoIGpvaW5UYWJsZU5hbWUgPT0gbnVsbCApewotCQkJU3RyaW5nQnVpbGRlciBzdHJUZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCS8vdGV4dCA9IEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9qb2luZWRXaGVuOwotCQkJTGlzdDxTdHJpbmc+IGNvbHVtbkxpc3QxID0gYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpIDsKLQkJCUxpc3Q8U3RyaW5nPiBjb2x1bW5MaXN0MiA9IGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpOwotCQkJZm9yKCBpbnQgaT0wOyBpIDwgY29sdW1uTGlzdDEuc2l6ZSgpOyBpKyspewotCQkJCXN0clRleHQuYXBwZW5kKCB0YWJsZTFOYW1lICsgIi4iICsgY29sdW1uTGlzdDEuZ2V0KGkpICk7Ly8kTk9OLU5MUy0xJAotCQkJCXN0clRleHQuYXBwZW5kKCAiPSIgKTsvLyROT04tTkxTLTEkCi0JCQkJc3RyVGV4dC5hcHBlbmQoIHRhYmxlMk5hbWUgKyAiLiIgKyBjb2x1bW5MaXN0Mi5nZXQoaSkgKTsvLyROT04tTkxTLTEkCi0JCQkJaWYoIGkgPCBjb2x1bW5MaXN0MS5zaXplKCktMSApCi0JCQkJCXN0clRleHQuYXBwZW5kKCAiXG4gQU5EICIgKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlqb2luQ29uZGl0aW9uVGV4dC5zZXRUZXh0KCBTdHJpbmcuZm9ybWF0KCB0ZXh0ICwgc3RyVGV4dC50b1N0cmluZygpKSApOyAKLQkJfWVsc2V7Ci0JCQlTdHJpbmdCdWlsZGVyIHN0clRleHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJLy90ZXh0ID0gSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX2pvaW5lZFdoZW47Ci0JCQlMaXN0PFN0cmluZz4gY29sdW1uTGlzdDEgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkgOwotCQkJTGlzdDxTdHJpbmc+IGpvaW5Db2x1bW5MaXN0MSA9IGFzc29jaWF0aW9uLmdldFJlZmVycmVySm9pbkNvbHVtbk5hbWVzKCkgIDsKLQkJCWZvciggaW50IGk9MDsgaSA8IGNvbHVtbkxpc3QxLnNpemUoKTsgaSsrKXsKLQkJCQlzdHJUZXh0LmFwcGVuZCggdGFibGUxTmFtZSArICIuIiArIGNvbHVtbkxpc3QxLmdldChpKSApOy8vJE5PTi1OTFMtMSQKLQkJCQlzdHJUZXh0LmFwcGVuZCggIj0iICk7Ly8kTk9OLU5MUy0xJAotCQkJCXN0clRleHQuYXBwZW5kKCBqb2luVGFibGVOYW1lICsgIi4iICsgam9pbkNvbHVtbkxpc3QxLmdldChpKSApOwotCQkJCXN0clRleHQuYXBwZW5kKCAiXG4gQU5EICIgKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCUxpc3Q8U3RyaW5nPiBqb2luVGFibGVDb2x1bW5MaXN0MiA9IGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRKb2luQ29sdW1uTmFtZXMoKTsKLQkJCUxpc3Q8U3RyaW5nPiBjb2x1bW5MaXN0MiA9IGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpOwotCQkJZm9yKCBpbnQgaT0wOyBpIDwgam9pblRhYmxlQ29sdW1uTGlzdDIuc2l6ZSgpOyBpKyspewotCQkJCXN0clRleHQuYXBwZW5kKCBqb2luVGFibGVOYW1lICsgIi4iICsgam9pblRhYmxlQ29sdW1uTGlzdDIuZ2V0KGkpICk7Ci0JCQkJc3RyVGV4dC5hcHBlbmQoICI9IiApOy8vJE5PTi1OTFMtMSQKLQkJCQlzdHJUZXh0LmFwcGVuZCggdGFibGUyTmFtZSArICIuIiArIGNvbHVtbkxpc3QyLmdldChpKSApOy8vJE5PTi1OTFMtMSQKLQkJCQlpZiggaSA8IGpvaW5UYWJsZUNvbHVtbkxpc3QyLnNpemUoKS0xICkKLQkJCQkJc3RyVGV4dC5hcHBlbmQoICJcbiBBTkQgIiApOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJam9pbkNvbmRpdGlvblRleHQuc2V0VGV4dCggU3RyaW5nLmZvcm1hdCggdGV4dCAsIHN0clRleHQudG9TdHJpbmcoKSkgKTsgCi0JCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIG9uZSBvZiByZWZlcnJlclJvbGVDaGVja0JveCBvciByZWZlcmVuY2VkUm9sZUNoZWNrQm94IAotCSAqIGNoYW5nZXMgdmFsdWUuIAotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpcmVjdGlvbmFsaXR5Q2hlY2tCb3hDaGFuZ2VkKCkgewotCQlTdHJpbmcgZGlyOwotCQlpZiAocmVmZXJyZXJSb2xlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWRpciA9IHJlZmVyZW5jZWRSb2xlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkgPyBBc3NvY2lhdGlvbi5CSV9ESSA6IEFzc29jaWF0aW9uLk5PUk1BTF9ESTsKLQkJfSBlbHNlIHsKLQkJCWlmIChyZWZlcmVuY2VkUm9sZUNoZWNrQm94LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZGlyID0gQXNzb2NpYXRpb24uT1BQT1NJVEVfREk7Ci0JCQl9IGVsc2UgewotCQkJCWRpciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRpciAhPSBudWxsKSB7Ci0JCQlzZWxlY3RlZEFzc29jaWF0aW9uLnNldERpcmVjdGlvbmFsaXR5KGRpcik7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3RlZEFzc29jaWF0aW9uLnNldEdlbmVyYXRlZChmYWxzZSk7Ci0JCX0KLQkJCi0JCXRoaXMuYXNzb2NpYXRpb25MaXN0LnVwZGF0ZVNlbGVjdGVkQXNzb2NpYXRpb24oKTsKLQl9CQotCQotCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCl7Ci0JCUdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkIHdpemFyZCA9IChHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCkgdGhpcy5nZXRXaXphcmQoKTsKLQkJcmV0dXJuIHdpemFyZC5nZXRDdXN0b21pemVyKCk7Ci0JfQotCQotCQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHBlcmZvcm1IZWxwKCkgCi0gICAgewotICAgICAgICB0aGlzLmdldEhlbHBTeXN0ZW0oKS5kaXNwbGF5SGVscCggR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQuSEVMUF9DT05URVhUX0lEICk7Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vd2hlbiB0aGUgSlBBIHByb2plY3Qgd2l6YXJkIHBhZ2UgaXMgc2hvd24gZmlyc3QsIHRoZSBvdGhlciB3aXphcmQgcGFnZXMgYXJlIGxhemlseSBidWlsdCwgdGh1cwotCQkvL2Fzc29jaWF0aW9uTGlzdCBjYW4gYmUgbnVsbCAtIGJ1ZyAzMDc4OTQKLQkJaWYgKHRoaXMuYXNzb2NpYXRpb25MaXN0ICE9IG51bGwpIHsKLQkJCXRoaXMuYXNzb2NpYXRpb25MaXN0LmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vVGFibGVGaWd1cmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1RhYmxlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMTlmMDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vVGFibGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5Lkluc2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSW1hZ2VSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotCi0vKioKLSAqIEEgZHJhdzJEIGZpZ3VyZSByZXByZXNlbnRpbmcgYSBkYXRhYmFzZSB0YWJsZQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZQotewotCXByaXZhdGUgQ29sb3IgdGFibGVDb2xvciA9IG5ldyBDb2xvcihudWxsLCAyMjAsIDIzMiwgMjQxKTsKLQotCXByaXZhdGUgRm9udCB0YWJsZUZvbnQgPSBuZXcgRm9udChudWxsLCAiQXJpYWwiLCA4LCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ29sb3IgYm9yZGVyQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgMTQsIDY2LCAxMTUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUTElORV9DT1JORVJfUkFESVVTID0gNjsKLQotCXByb3RlY3RlZCBmaW5hbCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyOwotCi0JcHVibGljIFRhYmxlRmlndXJlKFN0cmluZyBuYW1lLCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXRoaXMucmVzb3VyY2VNYW5hZ2VyID0gcmVzb3VyY2VNYW5hZ2VyOwotCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ2wubWFyZ2luSGVpZ2h0ID0gMjsKLQkJZ2wubWFyZ2luV2lkdGggPSAxMDsKLQkJc2V0TGF5b3V0TWFuYWdlcihnbCk7Ci0JCXNldEJvcmRlcihuZXcgTGluZUJvcmRlcih0aGlzLnRhYmxlQ29sb3IsIDApKTsKLQkJc2V0QmFja2dyb3VuZENvbG9yKHRoaXMudGFibGVDb2xvcik7Ci0JCXNldE9wYXF1ZSh0cnVlKTsKLQkJc2V0U2l6ZSgxNTAsIDIwKTsKLQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKCIiLCBJbWFnZVJlcG9zaXRvcnkuZ2V0VGFibGVPYmpJbWFnZSh0aGlzLnJlc291cmNlTWFuYWdlcikpOwotCQluYW1lTGFiZWwuc2V0Rm9udCh0aGlzLnRhYmxlRm9udCk7Ci0JCW5hbWVMYWJlbC5zZXRUZXh0KG5hbWUpOwotCQluYW1lTGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKHRoaXMuYm9yZGVyQ29sb3IpOwotCQluYW1lTGFiZWwuc2V0TGFiZWxBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKTsKLQkJYWRkKG5hbWVMYWJlbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRDbGllbnRBcmVhKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCXN1cGVyLnBhaW50Q2xpZW50QXJlYShncmFwaGljcyk7Ci0JCWdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotCQlSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJZ3JhcGhpY3MuZHJhd1JvdW5kUmVjdGFuZ2xlKHIuZXhwYW5kKG5ldyBJbnNldHMoLTEsIC0xLCAtMiwgLTIpKSwgT1VUTElORV9DT1JORVJfUkFESVVTLCBPVVRMSU5FX0NPUk5FUl9SQURJVVMpOwotCQlncmFwaGljcy5wb3BTdGF0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWlmIChlbmFibGVkKSB7Ci0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IodGhpcy50YWJsZUNvbG9yKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmJvcmRlckNvbG9yLmRpc3Bvc2UoKTsKLQkJdGhpcy50YWJsZUZvbnQuZGlzcG9zZSgpOwotCQl0aGlzLnRhYmxlQ29sb3IuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZUdlblBhbmVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZUdlblBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MzM2NzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vVGFibGVHZW5QYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5PUk1HZW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGUgVUkgcGFuZWwgZm9yIHNldHRpbmcgdGhlIGRlZmF1bHQgYW5kIHNwZWNpZmljIAotICogdGFibGUgZW50aXR5IGdlbmVyYXRpb24gcHJvcGVydGllcy4KLSAqIAotICovCi1jbGFzcyBUYWJsZUdlblBhbmVsCi17Ci0JV2l6YXJkUGFnZSB3aXphcmRQYWdlIDsgCi0JCi0JcHJpdmF0ZSBUZXh0IGNsYXNzTmFtZUZpZWxkOyAvLyB1c2VkIGluIHNldHRpbmcgaW5kaXZpZHVhbCB0YWJsZS9lbnRpdHkgZ2VuZXJhdGlvbiBvbmx5Ci0JCi0JcHJpdmF0ZSBDb21ibyBpZEdlbmVyYXRvckNvbWJvOwotCXByaXZhdGUgVGV4dCBzZXF1ZW5jZU5hbWVGaWVsZDsKLQkKLQlwcml2YXRlIEJ1dHRvbiBlbnRpdHlBY2Nlc3NGaWVsZDsKLQlwcml2YXRlIEJ1dHRvbiBlbnRpdHlBY2Nlc3NQcm9wZXJ0eTsKLQlwcml2YXRlIEJ1dHRvbiBhc3NvY2lhdGlvbkZldGNoRGVmYXVsdDsKLQlwcml2YXRlIEJ1dHRvbiBhc3NvY2lhdGlvbkZldGNoRWFnZXI7Ci0JcHJpdmF0ZSBCdXR0b24gYXNzb2NpYXRpb25GZXRjaExhenk7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gY29sbGVjdGlvblR5cGVTZXQ7Ci0JcHJpdmF0ZSBCdXR0b24gY29sbGVjdGlvblR5cGVMaXN0OwotCQotCXByaXZhdGUgQnV0dG9uIGdlbmVyYXRlT3B0aW9uYWxBbm5vdGF0aW9uczsKLQkKLQlwcml2YXRlIExhYmVsIHNlcXVlbmNlTmFtZU5vdGVMYWJlbDsgCi0JCi0JcHJpdmF0ZSBib29sZWFuIGlzVXBkYXRpbmdDb250cm9sczsKLQkKLQlwcml2YXRlIE9STUdlblRhYmxlIG1UYWJsZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0VGFibGUgPSBmYWxzZTsKLQkKLQlwdWJsaWMgVGFibGVHZW5QYW5lbChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1ucyAsIGJvb2xlYW4gaXNEZWZhdWx0VGFibGUsIFdpemFyZFBhZ2Ugd2l6YXJkUGFnZSAgICl7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMud2l6YXJkUGFnZSA9IHdpemFyZFBhZ2U7Ci0JCXRoaXMuaXNEZWZhdWx0VGFibGUgPSBpc0RlZmF1bHRUYWJsZTsKLQkJY3JlYXRlVGFibGVNYXBwaW5nUHJvcGVydGllc0dyb3VwKHBhcmVudCwgY29sdW1ucyk7Ci0JCVNXVFV0aWwuY3JlYXRlTGFiZWwocGFyZW50LCA0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGVNYXBwaW5nUHJvcGVydGllc0dyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5zKSB7Ci0JCUdyb3VwIHBhcmVudCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FICk7Ci0JCXBhcmVudC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV90YWJsZU1hcHBpbmcpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KGNvbHVtbnMsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJbGF5b3V0RGF0YS5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbnM7Ci0JCWxheW91dERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWxheW91dERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWxheW91dERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKLQkJcGFyZW50LnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCQotCQljcmVhdGVDbGFzc05hbWVDb250cm9sKHBhcmVudCwgY29sdW1ucyk7Ci0JCQotCQljcmVhdGVJZEdlbmVyYXRvckNvbnRyb2xzKHBhcmVudCwgY29sdW1ucyk7Ci0JCWNyZWF0ZUVudGl0eUFjY2Vzc0NvbnRyb2xzKHBhcmVudCwgY29sdW1ucyk7Ci0JCQotCQkvL0Fzc29jaWF0aW9uRmV0Y2ggYW5kIENvbGxlY3Rpb25UeXBlIG9ubHkgYXZhaWxhYmxlIGZvciBkZWZhdWx0IHRhYmxlIGdlbmVyYXRpb24KLQkJaWYgKCBpc0RlZmF1bHRUYWJsZSApIHsKLQkJCWNyZWF0ZUFzc29jaWF0aW9uRmV0Y2hDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOwotCQkJY3JlYXRlQ29sbGVjdGlvblR5cGVDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOwotCQkJY3JlYXRlR2VuZXJhdGVPcHRpb25hbEFubm90YXRpb25Db250cm9scyhwYXJlbnQsIGNvbHVtbnMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVHZW5lcmF0ZU9wdGlvbmFsQW5ub3RhdGlvbkNvbnRyb2xzKEdyb3VwIHBhcmVudCwgaW50IGNvbHVtbnMpIHsKLQkJZ2VuZXJhdGVPcHRpb25hbEFubm90YXRpb25zID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyApOwotCQlnZW5lcmF0ZU9wdGlvbmFsQW5ub3RhdGlvbnMuc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfZ2VuT3B0aW9uYWxBbm5vdGF0aW9ucyk7Ci0JCWdlbmVyYXRlT3B0aW9uYWxBbm5vdGF0aW9ucy5zZXRUb29sVGlwVGV4dChKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9nZW5PcHRpb25hbEFubm90YXRpb25zX2Rlc2MpOwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uczsKLQkJZ2VuZXJhdGVPcHRpb25hbEFubm90YXRpb25zLnNldExheW91dERhdGEoZ2QpOwotCQlnZW5lcmF0ZU9wdGlvbmFsQW5ub3RhdGlvbnMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlib29sZWFuIHNlbGVjdGVkID0gZ2VuZXJhdGVPcHRpb25hbEFubm90YXRpb25zLmdldFNlbGVjdGlvbigpOwotCQkJCW1UYWJsZS5zZXRHZW5lcmF0ZURETEFubm90YXRpb25zKHNlbGVjdGVkKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNsYXNzTmFtZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbnMpIHsKLQkJLy9DdXN0b21pemUgY2xhc3MgbmFtZSBmb3Igc3BlY2lmaWMgdGFibGUgb25seQotCQlpZiAoICFpc0RlZmF1bHRUYWJsZSApIHsKLQkJCVNXVFV0aWwuY3JlYXRlTGFiZWwoIHBhcmVudCwgMSAsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVBhbmVsX2NsYXNzTmFtZSApOwotCQkJCi0JCQljbGFzc05hbWVGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgKTsKLQkJCS8vbVBhY2thZ2VOYW1lRmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJU1dUVXRpbC5maWxsQ29sdW1ucyhjbGFzc05hbWVGaWVsZCwzKTsKLQkJCWNsYXNzTmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKHsgICJkZXByZWNhdGlvbiIgfSkKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gbnVsbCB8fCAhaXNVcGRhdGluZ0NvbnRyb2xzKSB7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NOYW1lRmllbGQuZ2V0VGV4dCgpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVKYXZhVHlwZU5hbWUoIGNsYXNzTmFtZSApOwotCQkJCQkJaWYoICFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSApewotCQkJCQkJCW1UYWJsZS5zZXRDbGFzc05hbWUoICBjbGFzc05hbWUgKTsKLQkJCQkJCQl3aXphcmRQYWdlLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQkJCX1lbHNlewotCQkJCQkJCXdpemFyZFBhZ2Uuc2V0RXJyb3JNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQkJCQotCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgQXNzb2NpYXRpb25GZXRjaExpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXJ7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpZiAoIWlzVXBkYXRpbmdDb250cm9scykgewotCQkJCUJ1dHRvbiByYWRpb0J0biA9IChCdXR0b24pZS5nZXRTb3VyY2UoKTsKLQkJCQltVGFibGUuc2V0RGVmYXVsdEZldGNoKCByYWRpb0J0bi5nZXREYXRhKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQXNzb2NpYXRpb25GZXRjaENvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5zKSB7Ci0JCVNXVFV0aWwuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9mZXRjaCApOwotCQkKLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoIGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCVNXVFV0aWwuZmlsbENvbHVtbnMoIHBhcmVudCAsIDMpOwotCQlhc3NvY2lhdGlvbkZldGNoRGVmYXVsdAk9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULlJBRElPICk7Ci0JCWFzc29jaWF0aW9uRmV0Y2hEZWZhdWx0LnNldFRleHQoICJEZWZhdWx0Iik7Ci0JCWFzc29jaWF0aW9uRmV0Y2hEZWZhdWx0LnNldERhdGEoIE9STUdlblRhYmxlLkRFRkFVTFRfRkVUQ0ggKTsJCi0JCQotCQlhc3NvY2lhdGlvbkZldGNoRWFnZXIgPSBuZXcgQnV0dG9uKCBwYXJlbnQsIFNXVC5SQURJTyApOwotCQlhc3NvY2lhdGlvbkZldGNoRWFnZXIuc2V0VGV4dCggIiZFYWdlciIpOwotCQlhc3NvY2lhdGlvbkZldGNoRWFnZXIuc2V0RGF0YSggT1JNR2VuVGFibGUuRUFHRVJfRkVUQ0ggKTsKLQotCQlhc3NvY2lhdGlvbkZldGNoTGF6eSA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULlJBRElPICk7Ci0JCWFzc29jaWF0aW9uRmV0Y2hMYXp5LnNldFRleHQoICJMYSZ6eSIpOwotCQlhc3NvY2lhdGlvbkZldGNoTGF6eS5zZXREYXRhKCBPUk1HZW5UYWJsZS5MQVpZX0ZFVENIICk7Ci0JCQotCQlBc3NvY2lhdGlvbkZldGNoTGlzdGVuZXIgYXNzb2NpYXRpb25GZXRjaExpc3RlbmVyID0gbmV3IEFzc29jaWF0aW9uRmV0Y2hMaXN0ZW5lcigpOwotCQlhc3NvY2lhdGlvbkZldGNoRGVmYXVsdC5hZGRTZWxlY3Rpb25MaXN0ZW5lciggYXNzb2NpYXRpb25GZXRjaExpc3RlbmVyICk7Ci0JCWFzc29jaWF0aW9uRmV0Y2hMYXp5LmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBhc3NvY2lhdGlvbkZldGNoTGlzdGVuZXIgKTsKLQkJYXNzb2NpYXRpb25GZXRjaEVhZ2VyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBhc3NvY2lhdGlvbkZldGNoTGlzdGVuZXIgKTsKLQl9Ci0KLQljbGFzcyBDb2xsZWN0aW9uVHlwZUxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKCFpc1VwZGF0aW5nQ29udHJvbHMpIHsKLQkJCQlCdXR0b24gcmFkaW9CdG4gPSAoQnV0dG9uKWUuZ2V0U291cmNlKCk7Ci0JCQkJbVRhYmxlLnNldERlZmF1bHRDb2xsZWN0aW9uVHlwZSggcmFkaW9CdG4uZ2V0RGF0YSgpLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29sbGVjdGlvblR5cGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1ucykgewotCQlTV1RVdGlsLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfY29sbFR5cGUgKTsKLQkJCi0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKCBjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlTV1RVdGlsLmZpbGxDb2x1bW5zKCBwYXJlbnQgLCAzKTsKLQkJCi0JCXRoaXMuY29sbGVjdGlvblR5cGVTZXQgPSBuZXcgQnV0dG9uKCBwYXJlbnQsIFNXVC5SQURJTyk7Ci0JCXRoaXMuY29sbGVjdGlvblR5cGVTZXQuc2V0VGV4dCggImphdmEudXRpbC5TZSZ0Iik7Ci0JCXRoaXMuY29sbGVjdGlvblR5cGVTZXQuc2V0RGF0YSggT1JNR2VuVGFibGUuU0VUX0NPTExFQ1RJT05fVFlQRSApOwotCQl0aGlzLmNvbGxlY3Rpb25UeXBlTGlzdCA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULlJBRElPKTsKLQkJdGhpcy5jb2xsZWN0aW9uVHlwZUxpc3Quc2V0VGV4dCgiamF2YS51dGlsLiZMaXN0Iik7Ci0JCXRoaXMuY29sbGVjdGlvblR5cGVMaXN0LnNldERhdGEoT1JNR2VuVGFibGUuTElTVF9DT0xMRUNUSU9OX1RZUEUpOyAKLQkJCi0JCUNvbGxlY3Rpb25UeXBlTGlzdGVuZXIgY29sbGVjdGlvblR5cGVMaXN0ZW5lciA9IG5ldyBDb2xsZWN0aW9uVHlwZUxpc3RlbmVyKCk7Ci0JCWNvbGxlY3Rpb25UeXBlTGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lciggY29sbGVjdGlvblR5cGVMaXN0ZW5lciApOwotCQljb2xsZWN0aW9uVHlwZVNldC5hZGRTZWxlY3Rpb25MaXN0ZW5lciggY29sbGVjdGlvblR5cGVMaXN0ZW5lciApOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0T1JNR2VuVGFibGUoT1JNR2VuVGFibGUgdGFibGUpIHsKLQkJbVRhYmxlID0gdGFibGU7Ci0JCQotCQlpc1VwZGF0aW5nQ29udHJvbHMgPSB0cnVlOwotCQkJCQotCQl0cnkgewotCQkJLy9DbGFzc05hbWVGaWVsZCBpcyBub3QgYXZhaWxhYmxlIGZvciBkZWZhdWx0IHRhYmxlCi0JCQlpZihjbGFzc05hbWVGaWVsZCE9IG51bGwgKQotCQkJCWNsYXNzTmFtZUZpZWxkLnNldFRleHQoIG1UYWJsZS5nZXRDbGFzc05hbWUoKSApOwotCQkJCi0JCQlmaW5hbCBMaXN0PFN0cmluZz4gc2NoZW1lcyA9IHRoaXMubVRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRBbGxJZEdlbmVyYXRvcnMoKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbc2NoZW1lcy5zaXplKCldOwotCQkJc2NoZW1lcy50b0FycmF5KHZhbHVlcyk7Ci0JCQlpZEdlbmVyYXRvckNvbWJvLnNldEl0ZW1zKCB2YWx1ZXMgKTsKLQkJCVN0cmluZyBpZEdlbmVyYXRvciA9IG1UYWJsZS5nZXRJZEdlbmVyYXRvcigpOwotCQkJaWRHZW5lcmF0b3JDb21iby5zZXRUZXh0KCBpZEdlbmVyYXRvcik7Ci0JCQkKLQkJCWJvb2xlYW4gaXNTZXF1ZW5jZSA9IHRoaXMubVRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRTZXF1ZW5jZUlkR2VuZXJhdG9ycygpLmNvbnRhaW5zKGlkR2VuZXJhdG9yKTsJCQotCQkJU3RyaW5nIHNlcXVlbmNlTmFtZSA9IG1UYWJsZS5pc0RlZmF1bHRzVGFibGUoKSA/IG1UYWJsZS5nZXRTZXF1ZW5jZSgpIDogbVRhYmxlLmdldEZvcm1hdHRlZFNlcXVlbmNlKCk7Ci0JCQlzZXF1ZW5jZU5hbWUgID0gKCBzZXF1ZW5jZU5hbWUgPT0gbnVsbCA/ICIiIDogc2VxdWVuY2VOYW1lICk7IAotCQkJc2VxdWVuY2VOYW1lRmllbGQuc2V0VGV4dCggc2VxdWVuY2VOYW1lICk7Ci0JCQlpZiAoIGlzU2VxdWVuY2UgKSB7Ci0JCQkJc2VxdWVuY2VOYW1lRmllbGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlzZXF1ZW5jZU5hbWVOb3RlTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VxdWVuY2VOYW1lRmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJc2VxdWVuY2VOYW1lTm90ZUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJCi0JCQlTdHJpbmcgYWNjZXNzID0gbVRhYmxlLmdldEFjY2VzcygpIDsKLQkJCWlmICggIE9STUdlblRhYmxlLkZJRUxEX0FDQ0VTUy5lcXVhbHMoIGFjY2VzcyApICkgewotCQkJCXRoaXMuZW50aXR5QWNjZXNzRmllbGQuc2V0U2VsZWN0aW9uKCB0cnVlICk7Ci0JCQkJdGhpcy5lbnRpdHlBY2Nlc3NQcm9wZXJ0eS5zZXRTZWxlY3Rpb24oIGZhbHNlICk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuZW50aXR5QWNjZXNzUHJvcGVydHkuc2V0U2VsZWN0aW9uKCB0cnVlICk7Ci0JCQkJdGhpcy5lbnRpdHlBY2Nlc3NGaWVsZC5zZXRTZWxlY3Rpb24oIGZhbHNlICk7Ci0JCQl9Ci0JCi0JCQlpZiAoYXNzb2NpYXRpb25GZXRjaExhenkgIT0gbnVsbCAmJiBhc3NvY2lhdGlvbkZldGNoRWFnZXIgIT0gbnVsbCApIHsKLQkJCQlTdHJpbmcgZGVmYXVsdEZldGNoID0gbVRhYmxlLmdldERlZmF1bHRGZXRjaCgpOwotCQkJCS8vcmVzZXQgYWxsIHRocmVlIGJ1dHRvbnMKLQkJCQlhc3NvY2lhdGlvbkZldGNoRGVmYXVsdC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCWFzc29jaWF0aW9uRmV0Y2hFYWdlci5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCWFzc29jaWF0aW9uRmV0Y2hMYXp5LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJaWYoIE9STUdlblRhYmxlLkRFRkFVTFRfRkVUQ0guZXF1YWxzKCBkZWZhdWx0RmV0Y2ggKSApCi0JCQkJCWFzc29jaWF0aW9uRmV0Y2hEZWZhdWx0LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQllbHNlIGlmKCBPUk1HZW5UYWJsZS5FQUdFUl9GRVRDSC5lcXVhbHMoIGRlZmF1bHRGZXRjaCApICkKLQkJCQkJYXNzb2NpYXRpb25GZXRjaEVhZ2VyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQllbHNlCi0JCQkJCWFzc29jaWF0aW9uRmV0Y2hMYXp5LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCX0KLQkJCQotCQkJLy9EZWZhdWx0VGFibGUgb25seQotCQkJaWYgKGNvbGxlY3Rpb25UeXBlTGlzdCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGNUeXBlID0gbVRhYmxlLmdldERlZmF1bHRDb2xsZWN0aW9uVHlwZSgpOwotCQkJCWlmICggT1JNR2VuVGFibGUuTElTVF9DT0xMRUNUSU9OX1RZUEUuZXF1YWxzKCBjVHlwZSApICkgewotCQkJCQl0aGlzLmNvbGxlY3Rpb25UeXBlTGlzdC5zZXRTZWxlY3Rpb24oIHRydWUgKTsKLQkJCQkJdGhpcy5jb2xsZWN0aW9uVHlwZVNldC5zZXRTZWxlY3Rpb24oIGZhbHNlICk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhpcy5jb2xsZWN0aW9uVHlwZVNldC5zZXRTZWxlY3Rpb24oIHRydWUgKTsKLQkJCQkJdGhpcy5jb2xsZWN0aW9uVHlwZUxpc3Quc2V0U2VsZWN0aW9uKCBmYWxzZSApOwotCQkJCX0KLQkJCQkKLQkJCQl0aGlzLmdlbmVyYXRlT3B0aW9uYWxBbm5vdGF0aW9ucy5zZXRTZWxlY3Rpb24oIG1UYWJsZS5pc0dlbmVyYXRlRERMQW5ub3RhdGlvbnMoKSk7Ci0JCQl9Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJfQotCQkKLQkJaXNVcGRhdGluZ0NvbnRyb2xzID0gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkR2VuZXJhdG9yQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbnMpIHsKLQkJU1dUVXRpbC5jcmVhdGVMYWJlbChwYXJlbnQsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2tleUdlbiApOwotCi0JCWlkR2VuZXJhdG9yQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJU1dUVXRpbC5maWxsQ29sdW1ucyhpZEdlbmVyYXRvckNvbWJvLCAzKTsKLQkJCi0JCWlkR2VuZXJhdG9yQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGlzVXBkYXRpbmdDb250cm9scykgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCWlkR2VuQ2hhbmdlZCgpOwotCQkJfX0pOwotCi0JCVNXVFV0aWwuY3JlYXRlTGFiZWwocGFyZW50LCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9zZXF1ZW5jZSApOwotCQlzZXF1ZW5jZU5hbWVGaWVsZCA9IG5ldyBUZXh0KCBwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSICk7Ci0JCQotCQlTV1RVdGlsLmZpbGxDb2x1bW5zKHNlcXVlbmNlTmFtZUZpZWxkLCAzKTsKLQkJc2VxdWVuY2VOYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5nZXRTb3VyY2UoKSA9PSBudWxsIHx8ICFpc1VwZGF0aW5nQ29udHJvbHMpIHsKLQotCQkJCQlpZiAoIGlkR2VuZXJhdG9yQ29tYm8uZ2V0VGV4dCgpLmVxdWFscygic2VxdWVuY2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgc2VxdWVuY2VOYW1lID0gc2VxdWVuY2VOYW1lRmllbGQuZ2V0VGV4dCgpOwotCQkJCQkJaWYgKCBzZXF1ZW5jZU5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIkdGFibGUiKSA+PSAwIHx8ICAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXNlcXVlbmNlTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIiRwayIpID49IDAgKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlzZXF1ZW5jZU5hbWUgPSBjb252ZXJ0VmFyVG9Mb3dlckNhc2UoIiR0YWJsZSIsIHNlcXVlbmNlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlzZXF1ZW5jZU5hbWUgPSBjb252ZXJ0VmFyVG9Mb3dlckNhc2UoIiRwayIsIHNlcXVlbmNlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWlmICggc2VxdWVuY2VOYW1lLnRyaW0oKS5sZW5ndGgoKSAhPSAwICkgewotCQkJCQkJCW1UYWJsZS5zZXRTZXF1ZW5jZSggc2VxdWVuY2VOYW1lICk7Ci0JCQkJCQl9IGVsc2V7Ci0JCQkJCQkJbVRhYmxlLnNldFNlcXVlbmNlKCAiIiApOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXByaXZhdGUgU3RyaW5nIGNvbnZlcnRWYXJUb0xvd2VyQ2FzZShTdHJpbmcgdmFyLCBTdHJpbmcgc2VxdWVuY2VOYW1lKSB7Ci0JCQkJaW50IG4gPSBzZXF1ZW5jZU5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCB2YXIgKTsKLQkJCQlpZiggbj09MCApIHsKLQkJCQkJcmV0dXJuIHZhciArIHNlcXVlbmNlTmFtZS5zdWJzdHJpbmcoIHZhci5sZW5ndGgoKSk7Ci0JCQkJfSBlbHNlIGlmKCBuID4wICkgewotCQkJCQlyZXR1cm4gc2VxdWVuY2VOYW1lLnN1YnN0cmluZygwLG4pICsgdmFyICsgc2VxdWVuY2VOYW1lLnN1YnN0cmluZyggbiArIHZhci5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJCXJldHVybiBzZXF1ZW5jZU5hbWU7Ci0JCQl9CQkJCi0JCX0pOwotCQkKLQkJU1dUVXRpbC5uZXdMYWJlbChwYXJlbnQsICIiKTsvLyROT04tTkxTLTEkCi0JCXNlcXVlbmNlTmFtZU5vdGVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJU3RyaW5nIHRleHQgPVN0cmluZy5mb3JtYXQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX3NlcXVlbmNlTm90ZSwgCi0JCQkJT1JNR2VuVGFibGUuVEFCTEVfU0VRX1BBVFRFUk4sIE9STUdlblRhYmxlLlBLX1NFUV9QQVRURVJOKTsKLQkJc2VxdWVuY2VOYW1lTm90ZUxhYmVsLnNldFRleHQoIHRleHQgKSA7Ci0JCXNlcXVlbmNlTmFtZU5vdGVMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJU1dUVXRpbC5maWxsQ29sdW1ucyggc2VxdWVuY2VOYW1lTm90ZUxhYmVsLCAzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaWRHZW5DaGFuZ2VkKCkgewotCQlTdHJpbmcgc2NoZW1lID0gaWRHZW5lcmF0b3JDb21iby5nZXRUZXh0KCk7Ci0JCW1UYWJsZS5zZXRJZEdlbmVyYXRvcihzY2hlbWUpOwotCQkKLQkJYm9vbGVhbiBpc1NlcXVlbmNlID0gdGhpcy5tVGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNlcXVlbmNlSWRHZW5lcmF0b3JzKCkuY29udGFpbnMoc2NoZW1lKTsJCQotCQlpZiAoIWlzU2VxdWVuY2UpIHsKLQkJCXNlcXVlbmNlTmFtZUZpZWxkLnNldFRleHQoIiIpOwotCQkJc2VxdWVuY2VOYW1lRmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQltVGFibGUuc2V0U2VxdWVuY2UobnVsbCk7Ci0JCQlzZXF1ZW5jZU5hbWVOb3RlTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXF1ZW5jZU5hbWVGaWVsZC5zZXRFbmFibGVkKHRydWUpOwotCQkJQ29sb3IgTk9URV9MQUJFTF9DT0xPUiA9IG5ldyBDb2xvciggRGlzcGxheS5nZXREZWZhdWx0KCksIDEwMiwxMDIsMTAyKTsKLQkJCXNlcXVlbmNlTmFtZU5vdGVMYWJlbC5zZXRGb3JlZ3JvdW5kKCBOT1RFX0xBQkVMX0NPTE9SICk7Ci0JCQlOT1RFX0xBQkVMX0NPTE9SLmRpc3Bvc2UoKTsKLQkJCXNlcXVlbmNlTmFtZU5vdGVMYWJlbC5zZXRFbmFibGVkKHRydWUpOwotCQkJaWYgKCBzZXF1ZW5jZU5hbWVGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCk9PTAgKSB7Ci0JCQkJU3RyaW5nIG5ld01lc3NhZ2UgPSAiUGxlYXNlIHNwZWNpZnkgYSBzZXF1ZW5jZSBuYW1lIjsKLQkJCQl0aGlzLndpemFyZFBhZ2Uuc2V0TWVzc2FnZShuZXdNZXNzYWdlKTsKLQkJCQl0aGlzLndpemFyZFBhZ2Uuc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLndpemFyZFBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCXRoaXMud2l6YXJkUGFnZS5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgRW50aXR5QWNjZXNzRmV0Y2hMaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyewotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKCFpc1VwZGF0aW5nQ29udHJvbHMpIHsKLQkJCQlCdXR0b24gcmFkaW9CdG4gPSAoQnV0dG9uKWUuZ2V0U291cmNlKCk7Ci0JCQkJbVRhYmxlLnNldEFjY2VzcyggcmFkaW9CdG4uZ2V0RGF0YSgpLnRvU3RyaW5nKCkgKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QWNjZXNzQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGNvbHVtbnMpIHsKLQkJU1dUVXRpbC5jcmVhdGVMYWJlbChjb21wb3NpdGUsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2FjY2VzcyApOwotCQkKLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoIGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlTV1RVdGlsLmZpbGxDb2x1bW5zKCBwYXJlbnQgLCAzKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCi0JCWVudGl0eUFjY2Vzc0ZpZWxkID0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuUkFESU8gKTsKLQkJZW50aXR5QWNjZXNzRmllbGQuc2V0VGV4dCggIiZGaWVsZCIgKTsgLy8kTk9OLU5MUzEkCi0JCWVudGl0eUFjY2Vzc0ZpZWxkLnNldERhdGEoIE9STUdlblRhYmxlLkZJRUxEX0FDQ0VTUyk7Ci0KLQkJZW50aXR5QWNjZXNzUHJvcGVydHkgPSBuZXcgQnV0dG9uKCBwYXJlbnQsIFNXVC5SQURJTyApOwotCQllbnRpdHlBY2Nlc3NQcm9wZXJ0eS5zZXRUZXh0KCAgIiZQcm9wZXJ0eSIgKTsvLyROT04tTkxTMSQKLQkJZW50aXR5QWNjZXNzUHJvcGVydHkuc2V0RGF0YSggT1JNR2VuVGFibGUuUFJPUEVSVFlfQUNDRVNTICk7Ci0JCQotCQlFbnRpdHlBY2Nlc3NGZXRjaExpc3RlbmVyIGVudGl0eUFjY2Vzc0ZldGNoTGlzdGVuZXIgPSBuZXcgRW50aXR5QWNjZXNzRmV0Y2hMaXN0ZW5lcigpOwotCQllbnRpdHlBY2Nlc3NGaWVsZC5hZGRTZWxlY3Rpb25MaXN0ZW5lciggZW50aXR5QWNjZXNzRmV0Y2hMaXN0ZW5lciApOwotCQllbnRpdHlBY2Nlc3NQcm9wZXJ0eS5hZGRTZWxlY3Rpb25MaXN0ZW5lciggZW50aXR5QWNjZXNzRmV0Y2hMaXN0ZW5lciApOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1RhYmxlc0FuZENvbHVtbnNDdXN0b21pemF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vVGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MWYyODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vVGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuZGlhbG9nZmllbGRzLkxheW91dFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3VHlwZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuT1JNR2VuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuT1JNR2VuQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLk9STUdlblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JbWFnZVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0KLXB1YmxpYyBjbGFzcyBUYWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBOZXdUeXBlV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCXByaXZhdGUgVHJlZVZpZXdlciB0YWJsZUNvbHVtblRyZWVWaWV3ZXI7Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgZGV0YWlsUGFuZWwgOwotCXByaXZhdGUgU3RhY2tMYXlvdXQgZGV0YWlsUGFuZWxTdGF0Y2tMYXlvdXQ7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgdGFibGVHZW5EZXRhdGlsR3JvdXA7Ci0JcHJpdmF0ZSBDb2x1bW5HZW5QYW5lbCBjb2x1bW5HZW5QYW5lbDsKLQlwcml2YXRlIENvbXBvc2l0ZSBjb2x1bW5HZW5EZXRhdGlsR3JvdXA7Ci0JcHJpdmF0ZSBUYWJsZUdlblBhbmVsIHRhYmxlR2VuUGFuZWw7Ci0JcHJpdmF0ZSBPUk1HZW5UYWJsZSBzZWxlY3RlZFRhYmxlOwotCQotCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXI7Ci0JCi0JcHJvdGVjdGVkIFRhYmxlc0FuZENvbHVtbnNDdXN0b21pemF0aW9uV2l6YXJkUGFnZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJc3VwZXIodHJ1ZSwgIlRhYmxlc0FuZENvbHVtbnNDdXN0b21pemF0aW9uV2l6YXJkUGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7Ci0JCXRoaXMucmVzb3VyY2VNYW5hZ2VyID0gcmVzb3VyY2VNYW5hZ2VyOwotCQlzZXRUaXRsZSggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlc0FuZENvbHVtbnNQYWdlX3RpdGxlICk7Ci0JCXNldE1lc3NhZ2UoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZXNBbmRDb2x1bW5zUGFnZV9kZXNjKTsKLQl9Ci0KLQkvLyAtLS0tLS0tLSBJbml0aWFsaXphdGlvbiAtLS0tLS0tLS0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIG93bmluZyB0aGlzIHBhZ2UgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aCB0aGUKLQkgKiBjdXJyZW50IHNlbGVjdGlvbi4gVGhlIHNlbGVjdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkcyBvZiB0aGUgd2l6YXJkIAotCSAqIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbiB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkcwotCSAqLwotCXZvaWQgaW5pdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKCBqcGFQcm9qZWN0ICE9IG51bGwgKSB7Ci0JCQlJSmF2YUVsZW1lbnQgamVsZW0gPSB0aGlzLmpwYVByb2plY3QuZ2V0SmF2YVByb2plY3QoKTsKLQkJCWluaXRDb250YWluZXJQYWdlKGplbGVtKTsKLQkJCWluaXRUeXBlUGFnZShqZWxlbSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJaW50IG5Db2x1bW5zPSAxCTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG5Db2x1bW5zOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRoaXMuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5HRU5FUkFURV9FTlRJVElFU19XSVpBUkRfQ1VTVE9NSVpFX0lORElWSURVQUxfRU5USVRJRVMpOwotCi0JCWNyZWF0ZVRhYmxlQW5kQ29sdW1uc0xpc3RQYW5lbChjb21wb3NpdGUsIDEpOwotCQkKLQkJU1dUVXRpbC5jcmVhdGVMYWJlbCggY29tcG9zaXRlLCAxLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlTV1RVdGlsLmNyZWF0ZVNlcGFyYXRvcihjb21wb3NpdGUsIDEpOwotCQkKLQkJY3JlYXRlR2VuZXJhdGVEZXRhaWxHcm91cChjb21wb3NpdGUsIDEpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoIHRydWUgKTsKLQl9Ci0JCi0JLyoqCi0JICogQSBwYW5lbCB3aXRoIEpGYWNlIFRyZWVWaWV3ZXIgc2hvd2luZyB0YWJsZXMgYW5kIGNvbHVtbnMgdG8gYmUgZ2VuZXJhdGVkIGludG8gSlBBIGVudGl0aWVzCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBjb2x1bW5zCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlQW5kQ29sdW1uc0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1ucykgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIGNvbHVtbnMgKTsKLQkJbGFiZWwuc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlc0FuZENvbHVtbnNQYWdlX2xhYmVsVGFibGVBbmRDb2x1bW5zICk7Ci0JCVNXVFV0aWwuZmlsbENvbHVtbnMoIGxhYmVsICwgY29sdW1ucyk7Ci0JCQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5zOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLmhlaWdodEhpbnQgPSAyMDA7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQkKLQkJdGFibGVDb2x1bW5UcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50KTsKLQkJdGFibGVDb2x1bW5UcmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKCBkYXRhKTsJCQotCQl0YWJsZUNvbHVtblRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUYWJsZUNvbHVtblRyZWVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRhYmxlQ29sdW1uVHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUYWJsZUNvbHVtblRyZWVMYWJlbFByb3ZpZGVyKCkpOwotCQkKLQkJdGFibGVDb2x1bW5UcmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciggbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlRGV0YWlsUGFuZWwoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmKHZpc2libGUpewotCQkJT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyID0gZ2V0Q3VzdG9taXplcigpOwotCQkJLy9JZiB1c2VyIGNoYW5nZWQgdGhlIGNvbm5lY3Rpb24gb3Igc2NoZW1hCi0JCQlpZiggdGhpcy5jdXN0b21pemVyICE9IGN1c3RvbWl6ZXIgKXsKLQkJCQl0aGlzLmN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOyAKLQkJCQl0YWJsZUNvbHVtblRyZWVWaWV3ZXIuc2V0SW5wdXQoIGN1c3RvbWl6ZXIgKTsKLQkJCX1lbHNlewotCQkJCXRhYmxlQ29sdW1uVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCQlMaXN0PFN0cmluZz4gdGFibGVOYW1lcyA9IHRoaXMuY3VzdG9taXplci5nZXRUYWJsZU5hbWVzKCk7Ci0JCQkKLQkJCS8vU2VsZWN0IHRoZSBmaXJzdCB0YWJsZQotCQkJT1JNR2VuVGFibGUgb3JtR2VuVGFibGUgPSB0aGlzLmN1c3RvbWl6ZXIuZ2V0VGFibGUodGFibGVOYW1lcy5nZXQoMCkpOwotCQkJdXBkYXRlVGFiZWxHZW5EZXRhaWwoIG9ybUdlblRhYmxlICk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVEZXRhaWxQYW5lbChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlUcmVlU2VsZWN0aW9uIHRzID0gKFRyZWVTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSB0cy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYoIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgT1JNR2VuVGFibGUgKXsKLQkJCXVwZGF0ZVRhYmVsR2VuRGV0YWlsKCAoT1JNR2VuVGFibGUpc2VsZWN0ZWRPYmplY3QgKTsKLQkJfWVsc2UgaWYoIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgT1JNR2VuQ29sdW1uICl7Ci0JCQl1cGRhdGVDb2x1bW5HZW5EZXRhaWwoIChPUk1HZW5Db2x1bW4pc2VsZWN0ZWRPYmplY3QgKTsKLQkJfQotCX0JCQkKLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ29sdW1uR2VuRGV0YWlsKE9STUdlbkNvbHVtbiBjb2x1bW4pIHsKLQkJaWYoY29sdW1uR2VuRGV0YXRpbEdyb3VwPT1udWxsKXsKLQkJCWNvbHVtbkdlbkRldGF0aWxHcm91cCA9IG5ldyBDb21wb3NpdGUoZGV0YWlsUGFuZWwsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQkJY29sdW1uR2VuRGV0YXRpbEdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJCXRoaXMuY29sdW1uR2VuUGFuZWwgPSBuZXcgQ29sdW1uR2VuUGFuZWwoY29sdW1uR2VuRGV0YXRpbEdyb3VwLCA0LCBnZXRDdXN0b21pemVyKCkgLCB0aGlzICk7Ci0JCX0KLQkJY29sdW1uR2VuUGFuZWwuc2V0Q29sdW1uKGNvbHVtbik7Ci0JCXRoaXMuZGV0YWlsUGFuZWxTdGF0Y2tMYXlvdXQudG9wQ29udHJvbCA9IGNvbHVtbkdlbkRldGF0aWxHcm91cDsKLQkJdGhpcy5kZXRhaWxQYW5lbC5sYXlvdXQoKTsJCQotCQlkZXRhaWxQYW5lbC5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlVGFiZWxHZW5EZXRhaWwoT1JNR2VuVGFibGUgdGFibGUpIHsKLQkJdGhpcy5zZWxlY3RlZFRhYmxlID0gdGFibGU7Ci0JCWlmKHRhYmxlR2VuRGV0YXRpbEdyb3VwPT1udWxsKXsKLQkJCXRhYmxlR2VuRGV0YXRpbEdyb3VwID0gbmV3IENvbXBvc2l0ZShkZXRhaWxQYW5lbCwgU1dULk5PTkUpOwotCQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCQl0YWJsZUdlbkRldGF0aWxHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCQkKLQkJCXRoaXMudGFibGVHZW5QYW5lbCA9IG5ldyBUYWJsZUdlblBhbmVsKHRhYmxlR2VuRGV0YXRpbEdyb3VwLCA0ICwgZmFsc2UsIHRoaXMgKTsKLQkJCWNyZWF0ZURvbWFpbkphdmFDbGFzc2VzUHJvcGVydGllc0dyb3VwKHRhYmxlR2VuRGV0YXRpbEdyb3VwLCA0ICk7Ci0JCX0KLQkJdGFibGVHZW5QYW5lbC5zZXRPUk1HZW5UYWJsZSh0YWJsZSk7Ci0JCQotCQl0aGlzLmRldGFpbFBhbmVsU3RhdGNrTGF5b3V0LnRvcENvbnRyb2wgPSB0YWJsZUdlbkRldGF0aWxHcm91cDsKLQkJdGhpcy5kZXRhaWxQYW5lbC5sYXlvdXQoKTsJCQotCi0JCVN0cmluZyBiYXNlQ2xhc3MgPSB0YWJsZS5nZXRFeHRlbmRzKCk7Ci0JCWlmKCBiYXNlQ2xhc3MhPSBudWxsICkKLQkJCXNldFN1cGVyQ2xhc3MoYmFzZUNsYXNzLCB0cnVlKTsKLQkJCi0JCXNldFN1cGVySW50ZXJmYWNlcyggdGFibGUuZ2V0SW1wbGVtZW50cygpLCB0cnVlKTsKLQkJCi0JCWRldGFpbFBhbmVsLmdldFBhcmVudCgpLmxheW91dCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb21haW5KYXZhQ2xhc3Nlc1Byb3BlcnRpZXNHcm91cChDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1ucykgewotCQlHcm91cCBwYXJlbnQgPSBuZXcgR3JvdXAoIGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfZG9tYWluSmF2YUNsYXNzICk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoY29sdW1ucywgZmFsc2UpKTsKLQkJU1dUVXRpbC5maWxsQ29sdW1ucyggcGFyZW50LCBjb2x1bW5zKTsKLQotCQljcmVhdGVTdXBlckNsYXNzQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKLQkJY3JlYXRlU3VwZXJJbnRlcmZhY2VzQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKLQotCQkvL1Jlc2l6ZSBzdXBwZXIgY2xhc3MgdGV4dCB3aWR0aCB0byBmaWxsIHRoZSBwYXJlbnQgZ3JvdXAuCi0JCS8vSGF2ZSB0byBkbyBpdCBpbmRpcmVjdGx5IHNpbmNlIGZTdXBlckNsYXNzRGlhbG9nRmllbGQgaXMgcHJpdmF0ZSBpbiBzdXBlciBjbGFzcy4KLQkJQ29udHJvbFtdIGNvbnRyb2xzID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0JCWlmKCBjb250cm9scy5sZW5ndGg+MSAmJiBjb250cm9sc1sxXSBpbnN0YW5jZW9mIFRleHQgKXsKLQkJCVRleHQgdGV4dCA9IChUZXh0KShwYXJlbnQuZ2V0Q2hpbGRyZW4oKVsxXSk7Ci0JCQlMYXlvdXRVdGlsLnNldFdpZHRoSGludCh0ZXh0LCBnZXRNYXhGaWVsZFdpZHRoKCkpOwotCQkJTGF5b3V0VXRpbC5zZXRIb3Jpem9udGFsR3JhYmJpbmcodGV4dCk7Ci0JCX0JCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdUeXBlV2l6YXJkUGFnZSNzdXBlckNsYXNzQ2hhbmdlZCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElTdGF0dXMgc3VwZXJDbGFzc0NoYW5nZWQoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIuc3VwZXJDbGFzc0NoYW5nZWQoKTsKLQkJU3RyaW5nIGJhc2VDbGFzcyA9IGdldFN1cGVyQ2xhc3MoKTsKLQkJaWYoYmFzZUNsYXNzIT1udWxsICYmIHRoaXMuc2VsZWN0ZWRUYWJsZSE9bnVsbCApewotCQkJU3RyaW5nIG9sZEJhc2VDbGFzcyA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5nZXRFeHRlbmRzKCk7Ci0JCQlpZiggIW9sZEJhc2VDbGFzcy5lcXVhbHMoYmFzZUNsYXNzICkpCi0JCQkJdGhpcy5zZWxlY3RlZFRhYmxlLnNldEV4dGVuZHMoYmFzZUNsYXNzKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOyAKLQl9CQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld1R5cGVXaXphcmRQYWdlI2FkZFN1cGVySW50ZXJmYWNlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGJvb2xlYW4gYWRkU3VwZXJJbnRlcmZhY2UoU3RyaW5nIHN1cGVySW50ZXJmYWNlKSB7Ci0JCXN1cGVyLmFkZFN1cGVySW50ZXJmYWNlKHN1cGVySW50ZXJmYWNlKTsKLQkJTGlzdCBpbnRlcmZhY2VzID0gZ2V0U3VwZXJJbnRlcmZhY2VzKCk7Ci0JCWlmKHRoaXMuc2VsZWN0ZWRUYWJsZSE9bnVsbCkKLQkJCXRoaXMuc2VsZWN0ZWRUYWJsZS5zZXRJbXBsZW1lbnRzKGludGVyZmFjZXMpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRmllbGRDaGFuZ2VkKFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJc3VwZXIuaGFuZGxlRmllbGRDaGFuZ2VkKGZpZWxkTmFtZSk7Ci0JCWlmKCB0aGlzLmZTdXBlckNsYXNzU3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpewotCQkJdXBkYXRlU3RhdHVzKGZTdXBlckNsYXNzU3RhdHVzKTsKLQkJfWVsc2V7Ci0JCQlzZXRNZXNzYWdlKCIiLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQl9Ci0JCQotCX0JCi0JCi0JcHJpdmF0ZSBPUk1HZW5DdXN0b21pemVyIGdldEN1c3RvbWl6ZXIoKXsKLQkJR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQgd2l6YXJkID0gKEdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkKSB0aGlzLmdldFdpemFyZCgpOwotCQlyZXR1cm4gd2l6YXJkLmdldEN1c3RvbWl6ZXIoKTsKLQl9Ci0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciwgYW5kIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgREIgVGFibGUvQ29sdW1uIFRyZWVWaWV3ZXIKLQkgKgotCSAqLwotCWNsYXNzIFRhYmxlQ29sdW1uVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCWlmKCBpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBPUk1HZW5DdXN0b21pemVyICl7Ci0JCQkJT1JNR2VuQ3VzdG9taXplciBpbnB1dCA9IChPUk1HZW5DdXN0b21pemVyIClpbnB1dEVsZW1lbnQ7Ci0JCQkJTGlzdDxTdHJpbmc+IHRhYmxlTmFtZUxpc3QgPSBpbnB1dC5nZXRHZW5UYWJsZU5hbWVzKCk7Ci0JCQkJTGlzdDxPUk1HZW5UYWJsZT4gcmV0ID0gbmV3IEFycmF5TGlzdDxPUk1HZW5UYWJsZT4oKTsKLQkJCQlmb3IoU3RyaW5nIHQgOiB0YWJsZU5hbWVMaXN0KXsKLQkJCQkJT1JNR2VuVGFibGUgb3JtR2VuVGFibGUgPSBnZXRDdXN0b21pemVyKCkuZ2V0VGFibGUoIHQgKTsKLQkJCQkJcmV0LmFkZCggb3JtR2VuVGFibGUgKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJldC50b0FycmF5KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtde307Ci0JCX0KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQlpZiggcGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE9STUdlblRhYmxlICl7Ci0JCQkJT1JNR2VuVGFibGUgdGFibGUgPSAoT1JNR2VuVGFibGUpIHBhcmVudEVsZW1lbnQ7Ci0JCQkJTGlzdDxPUk1HZW5Db2x1bW4+IGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCQkJTGlzdDxPUk1HZW5Db2x1bW4+IHJldCA9IG5ldyBBcnJheUxpc3Q8T1JNR2VuQ29sdW1uPigpOwotCQkJCWZvciggT1JNR2VuQ29sdW1uIGNvbCA6IGNvbHVtbnMpewotCQkJCQlpZiggY29sLmlzRm9yZWlnbktleSgpICkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiggY29sLmlzUHJpbWFyeUtleSgpICl7Ci0JCQkJCQlyZXQuYWRkKDAsY29sICk7Ci0JCQkJCX1lbHNlewotCQkJCQkJcmV0LmFkZChjb2wpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiByZXQudG9BcnJheSgpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXXt9OwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7IAotCQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBPUk1HZW5Db2x1bW4pewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiggZWxlbWVudCBpbnN0YW5jZW9mIE9STUdlblRhYmxlICk7Ci0JCX0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7fQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KLQl9Ci0KLQljbGFzcyBUYWJsZUNvbHVtblRyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcnsKLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiggZWxlbWVudCBpbnN0YW5jZW9mIE9STUdlblRhYmxlICl7Ci0JCQkJcmV0dXJuIEltYWdlUmVwb3NpdG9yeS5nZXRUYWJsZUltYWdlKHJlc291cmNlTWFuYWdlcik7Ci0JCQl9ZWxzZSAJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBPUk1HZW5Db2x1bW4gKXsKLQkJCQlPUk1HZW5Db2x1bW4gY29sID0gKCBPUk1HZW5Db2x1bW4pZWxlbWVudDsKLQkJCQlyZXR1cm4gY29sLmlzUHJpbWFyeUtleSgpID8KLQkJCQkJCUltYWdlUmVwb3NpdG9yeS5nZXRLZXlDb2x1bW5JbWFnZShyZXNvdXJjZU1hbmFnZXIpIDoKLQkJCQkJCUltYWdlUmVwb3NpdG9yeS5nZXRDb2x1bW5JbWFnZShyZXNvdXJjZU1hbmFnZXIpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBPUk1HZW5UYWJsZSApewotCQkJCXJldHVybiAoKE9STUdlblRhYmxlKWVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCX1lbHNlIAkJCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgT1JNR2VuQ29sdW1uICl7Ci0JCQkJcmV0dXJuICgoT1JNR2VuQ29sdW1uKWVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQl9CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdlbmVyYXRlRGV0YWlsR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbnMpIHsKLQkJZGV0YWlsUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlTV1RVdGlsLmZpbGxDb2x1bW5zKCBkZXRhaWxQYW5lbCwgY29sdW1ucyk7Ci0JCSAgCi0JCWRldGFpbFBhbmVsU3RhdGNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0JCWRldGFpbFBhbmVsLnNldExheW91dChkZXRhaWxQYW5lbFN0YXRja0xheW91dCk7Ci0JCSAgCi0JCUNvbXBvc2l0ZSBlbXB0eVBhbmVsID0gbmV3IENvbXBvc2l0ZShkZXRhaWxQYW5lbCwgU1dULk5PTkUpOwotCQllbXB0eVBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCWRldGFpbFBhbmVsU3RhdGNrTGF5b3V0LnRvcENvbnRyb2wgPSBlbXB0eVBhbmVsOwotCQlkZXRhaWxQYW5lbC5sYXlvdXQoKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBwZXJmb3JtSGVscCgpIAotICAgIHsKLSAgICAgICAgdGhpcy5nZXRIZWxwU3lzdGVtKCkuZGlzcGxheUhlbHAoIEdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkLkhFTFBfQ09OVEVYVF9JRCApOwotICAgIH0KLQotCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vVGFibGVzU2VsZWN0b3JXaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZXNTZWxlY3RvcldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFiMzJjMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZXNTZWxlY3RvcldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuT1JNR2VuQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkltYWdlUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5UYWJsZUxheW91dENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotCi1jbGFzcyBUYWJsZXNTZWxlY3RvcldpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQkxFX0NPTFVNTl9JTkRFWCA9IDA7Ci0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0JcHJpdmF0ZSBTY2hlbWEgc2NoZW1hID0gbnVsbDsKLQlwcml2YXRlIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHVwZGF0ZVBlcnNpc3RlbmNlWG1sID0gdHJ1ZTsKLQotCXByaXZhdGUgRGF0YWJhc2VHcm91cCBkYXRhYmFzZUdyb3VwOwotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciB0YWJsZVRhYmxlOwotCXByaXZhdGUgQnV0dG9uIHVwZGF0ZVBlcnNpc3RlbmNlWG1sQ2hlY2tCb3g7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcjsKLQkKLQlUYWJsZXNTZWxlY3RvcldpemFyZFBhZ2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXN1cGVyKCJUYWJsZXNTZWxlY3RvcldpemFyZFBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQl0aGlzLnJlc291cmNlTWFuYWdlciA9IHJlc291cmNlTWFuYWdlcjsKLQkJdGhpcy5zY2hlbWEgPSBqcGFQcm9qZWN0LmdldERlZmF1bHREYlNjaGVtYSgpOwotCQlzZXRUaXRsZShKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX3NlbGVjdFRhYmxlICk7Ci0JCXNldE1lc3NhZ2UoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9jaG9vc2VFbnRpdHlUYWJsZSApOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWRvU3RhdHVzVXBkYXRlKCk7Ci0JfQotCi0JLy8gLS0tLS0tLS0gUHJvdmlkZSBhY2Nlc3MgdG8gd3JhcHBlZCBEVFAgY29ubmVjdGlvbiByZWxhdGVkIGNsYXNzZXMgLS0tLS0tLS0tCi0JQ29ubmVjdGlvblByb2ZpbGUgZ2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlTdHJpbmcgcHJvZmlsZU5hbWUgPSB0aGlzLmpwYVByb2plY3QuZ2V0RGF0YVNvdXJjZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpOwotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZU5hbWVkKHByb2ZpbGVOYW1lKTsKLQl9Ci0KLQlDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZU5hbWVkKFN0cmluZyBwcm9maWxlTmFtZSkgewotCQlyZXR1cm4gSnB0RGJQbHVnaW4uZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShwcm9maWxlTmFtZSk7Ci0JfQotCi0JU2NoZW1hIGdldFNjaGVtYSgpewotCQlyZXR1cm4gdGhpcy5zY2hlbWE7Ci0JfQotCi0Jdm9pZCBzZXRTY2hlbWEoU2NoZW1hIHMpewotCQl0aGlzLnNjaGVtYSA9IHM7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFRhYmxlPiBwb3NzaWJsZVRhYmxlcygpIHsKLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hKCk7Ci0JCWlmIChzY2hlbWEgIT0gbnVsbCAmJiBzY2hlbWEuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzY2hlbWEuZ2V0VGFibGVzKCkpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy48VGFibGU+IGVtcHR5TGlzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJaW50IG5Db2x1bW5zPSAzOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbkNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLkdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9TRUxFQ1RfVEFCTEVTKTsKLQotCQl0aGlzLmRhdGFiYXNlR3JvdXAgPSBjcmVhdGVEYXRhYmFzZUdyb3VwKGNvbXBvc2l0ZSwgNDAwKTsKLQotCQljcmVhdGVUYWJsZXNTZWxlY3Rpb25Db250cm9sKGNvbXBvc2l0ZSwgbkNvbHVtbnMpOwotCi0JCQotCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbmNlWG1sQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJdGhpcy51cGRhdGVQZXJzaXN0ZW5jZVhtbENoZWNrQm94LnNldFRleHQoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV91cGRhdGVQZXJzaXN0ZW5jZVhtbCApOwotCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbmNlWG1sQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHNob3VsZFVwZGF0ZVBlcnNpc3RlbmNlWG1sKCkpOwotCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbmNlWG1sQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRTaG91bGRVcGRhdGVQZXJzaXN0ZW5jZVhtbCh1cGRhdGVQZXJzaXN0ZW5jZVhtbENoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQotCQl9KTsKLQkJZmlsbENvbHVtbnMoIHRoaXMudXBkYXRlUGVyc2lzdGVuY2VYbWxDaGVja0JveCwgMyk7Ci0KLQotCQkvL0ZpbGxlciBjb2x1bW4KLQkJbmV3IExhYmVsKCBjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJLy9SZXN0b3JlIGRlZmF1bHQgYnV0dG9uCi0JCWZpbmFsIEJ1dHRvbiByZXN0b3JlQnRuID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIICk7Ci0JCXJlc3RvcmVCdG4uc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9SZXN0b3JlX0RlZmF1bHRzICk7Ci0JCXJlc3RvcmVCdG4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYoIGN1c3RvbWl6ZXIhPW51bGwgJiYgY3VzdG9taXplci5nZXRGaWxlKCkhPW51bGwgKXsKLQkJCQkJaWYoIGN1c3RvbWl6ZXIuZ2V0RmlsZSgpLmV4aXN0cygpICl7Ci0JCQkJCQljdXN0b21pemVyLmdldEZpbGUoKS5kZWxldGUoKTsKLQkJCQkJfQotCQkJCQlkZXNlbGVjdEFsbFRhYmxlcygpOwotCQkJCQlyZXN0b3JlVXBkYXRlUGVyc2lzdGVuY2VYbWxEZWZhdWx0KCk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkVORDsKLQkJcmVzdG9yZUJ0bi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXRoaXMudXBkYXRlU2VsZWN0aW9uU3RhdGUoZGF0YWJhc2VHcm91cC5nZXRTZWxlY3RlZFNjaGVtYSgpKTsKLQkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLnRhYmxlVGFibGUuZ2V0Q29udHJvbCgpLCBKcGFIZWxwQ29udGV4dElkcy5ESUFMT0dfR0VORVJBVEVfRU5USVRJRVNfVEFCTEVTKTsKLQkJdGhpcy5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZXN0b3JlVXBkYXRlUGVyc2lzdGVuY2VYbWxEZWZhdWx0KCl7Ci0JCXVwZGF0ZVBlcnNpc3RlbmNlWG1sQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQlzZXRTaG91bGRVcGRhdGVQZXJzaXN0ZW5jZVhtbCh0cnVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodGhpcy5kYXRhYmFzZUdyb3VwICE9IG51bGwpCi0JCQl0aGlzLmRhdGFiYXNlR3JvdXAuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElXaXphcmRQYWdlIGdldFByZXZpb3VzUGFnZSgpIHsKLQkJSVdpemFyZFBhZ2UgcHJldlBhZ2UgPSBzdXBlci5nZXRQcmV2aW91c1BhZ2UoKTsKLQkJaWYgKHByZXZQYWdlIGluc3RhbmNlb2YgUHJvbXB0SlBBUHJvamVjdFdpemFyZFBhZ2UpCi0JCQkvL1ByZXZlbnQgZ29pbmcgYmFjayB0byB0aGUgUHJvbXB0SlBBUHJvamVjdFdpemFyZFBhZ2UKLQkJCS8vaWYgSlBBIHByb2plY3QgYWxyZWFkeSBzZWxlY3RlZAotCQkJcmV0dXJuIHByZXZQYWdlLmdldFByZXZpb3VzUGFnZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gcHJldlBhZ2U7Ci0JfQotCi0JcHJpdmF0ZSBEYXRhYmFzZUdyb3VwIGNyZWF0ZURhdGFiYXNlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoSGludCkgewotCQlEYXRhYmFzZUdyb3VwIGRiR3JvdXAgPSBuZXcgRGF0YWJhc2VHcm91cCh0aGlzLmdldENvbnRhaW5lcigpLCBqcGFQcm9qZWN0LCBwYXJlbnQsIHJlc291cmNlTWFuYWdlciwgd2lkdGhIaW50KTsKLQkJLyoqCi0JCSAqIGxpc3RlbiBmb3Igd2hlbiB0aGUgRGF0YWJhc2UgQ29ubmVjdGlvbiBjaGFuZ2VzIGl0cyBzZWxlY3RlZCBzY2hlbWEKLQkJICogc28gd2UgY2FuIGtlZXAgdGhlIHBhZ2UgaW4gc3luY2gKLQkJICovCi0JCWNsYXNzIERhdGFiYXNlUGFnZUxpc3RlbmVyIGltcGxlbWVudHMgRGF0YWJhc2VHcm91cC5MaXN0ZW5lciB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSkgewotCQkJCWpwYVByb2plY3QuZ2V0RGF0YVNvdXJjZSgpLnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShjb25uZWN0aW9uUHJvZmlsZS5nZXROYW1lKCkpOwotCQkJfQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3RlZFNjaGVtYUNoYW5nZWQoU2NoZW1hIHNjaGVtYSkgewotCQkJCWlmIChzY2hlbWE9PW51bGwpIHsKLQkJCQkJdXBkYXRlVGFibGVzTGlzdFZpZXdlcihDb2xsZWN0aW9ucy5FTVBUWV9MSVNUICk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gc3RvcmUgdGhlICppZGVudGlmaWVyKiBpbiB0aGUgSlBBIHByb2plY3QsIHNpbmNlIGl0IGdldHMgcHV0IGluIEphdmEgYW5ub3RhdGlvbnMKLQkJCQkJanBhUHJvamVjdC5zZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKHNjaGVtYS5nZXRJZGVudGlmaWVyKCkpOwotCQkJCQlzZXRTY2hlbWEoIHNjaGVtYSApOwotCQkJCQl1cGRhdGVTZWxlY3Rpb25TdGF0ZShzY2hlbWEpOwotCQkJCX0KLQkJCQlkb1N0YXR1c1VwZGF0ZSgpOwotCQkJfQotCQl9Ci0JCWRiR3JvdXAuYWRkTGlzdGVuZXIobmV3IERhdGFiYXNlUGFnZUxpc3RlbmVyKCkpOwotCQlkYkdyb3VwLmluaXQoKTsKLQkJcmV0dXJuIGRiR3JvdXA7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFVwZGF0ZVBlcnNpc3RlbmNlWG1sKCkgewotCQlyZXR1cm4gdGhpcy51cGRhdGVQZXJzaXN0ZW5jZVhtbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2hvdWxkVXBkYXRlUGVyc2lzdGVuY2VYbWwoYm9vbGVhbiB1cGRhdGVQZXJzaXN0ZW5jZVhtbCl7Ci0JCXRoaXMudXBkYXRlUGVyc2lzdGVuY2VYbWwgPSB1cGRhdGVQZXJzaXN0ZW5jZVhtbDsKLQkJZG9TdGF0dXNVcGRhdGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0QWxsVGFibGVzKCl7Ci0JCXRoaXMudGFibGVUYWJsZS5zZXRBbGxDaGVja2VkKHRydWUpOwotCQlkb1N0YXR1c1VwZGF0ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZXNlbGVjdEFsbFRhYmxlcygpewotCQl0aGlzLnRhYmxlVGFibGUuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCWRvU3RhdHVzVXBkYXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRUYWJsZXNTZWxlY3Rpb25Db250cm9sKENvbGxlY3Rpb248VGFibGU+IHBvc3NpYmxlVGFibGVzKSB7Ci0JCXRoaXMudGFibGVUYWJsZS5zZXRJbnB1dChwb3NzaWJsZVRhYmxlcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlc1NlbGVjdGlvbkNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbnMpIHsKLQkJTGFiZWwgdGFibGVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCXRhYmxlTGFiZWwuc2V0TGF5b3V0RGF0YSggZ2QgKTsKLQkJdGFibGVMYWJlbC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX3RhYmxlcyApOwotCQkKLQkJVGFibGVMYXlvdXRDb21wb3NpdGUgbGF5b3V0PSBuZXcgVGFibGVMYXlvdXRDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWFkZENvbHVtbkxheW91dERhdGEobGF5b3V0KTsKLQotCQlmaW5hbCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZSB0YWJsZSA9IG5ldyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZShsYXlvdXQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSIHwgU1dULkNIRUNLKTsKLQotCQlUYWJsZUNvbHVtbiB0YWJsZU5hbWVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCBUQUJMRV9DT0xVTU5fSU5ERVgpOwotCQl0YWJsZU5hbWVDb2x1bW4uc2V0VGV4dChKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX3RhYmxlQ29sdW1uICk7Ci0JCXRhYmxlTmFtZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5oZWlnaHRIaW50PSBTV1RVdGlsLmdldFRhYmxlSGVpZ2h0SGludCh0YWJsZSwgMjApOwotCQlnZC53aWR0aEhpbnQgPSAyNTA7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWUgOwotCQlsYXlvdXQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUNvbG9yIGJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvciggRGlzcGxheS5nZXREZWZhdWx0KCksIDI1NSwgMCwwKTsKLQkJbGF5b3V0LnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQkJYmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQotCQl0aGlzLnRhYmxlVGFibGUgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXRoaXMudGFibGVUYWJsZS5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCQl0aGlzLnRhYmxlVGFibGUuc2V0TGFiZWxQcm92aWRlcih0aGlzLmJ1aWxkVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRoaXMudGFibGVUYWJsZS5zZXRDb250ZW50UHJvdmlkZXIodGhpcy5idWlsZFRhYmxlVGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRoaXMudGFibGVUYWJsZS5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCQkJcmV0dXJuICgoVGFibGUpIGUxKS5nZXROYW1lKCkuY29tcGFyZVRvKCgoVGFibGUpIGUyKS5nZXROYW1lKCkpOwotCQkJfQotCQl9KTsKLQotCQl0aGlzLnRhYmxlVGFibGUuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlVGFibGVzTGlzdFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQotCQl0YWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuRjIgJiYgZS5zdGF0ZU1hc2sgPT0gU1dULk5PTkUpIHsKLQkJCQkJZWRpdEVudGl0eU5hbWVJZlBvc3NpYmxlKCk7Ci0JCQkJCWUuZG9pdD0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljcmVhdGVCdXR0b25Db21wb3NpdGUocGFyZW50KTsKLQkJaW5pdFRhYmxlc1NlbGVjdGlvbkNvbnRyb2wocG9zc2libGVUYWJsZXMoKSk7CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQnV0dG9uQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpewotCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGJ1dHRvbkxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJYnV0dG9uTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWJ1dHRvbkxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbkxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUJ1dHRvbiBzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0VG9vbFRpcFRleHQoSnB0VWlNZXNzYWdlcy5HZW5lcmFsX3NlbGVjdEFsbCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRJbWFnZSggSW1hZ2VSZXBvc2l0b3J5LmdldFNlbGVjdEFsbEJ1dHRvbkltYWdlKHRoaXMucmVzb3VyY2VNYW5hZ2VyKSAgKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdEFsbFRhYmxlcygpOwotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gZGVzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRUb29sVGlwVGV4dChKcHRVaU1lc3NhZ2VzLkdlbmVyYWxfZGVzZWxlY3RBbGwpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRJbWFnZSggSW1hZ2VSZXBvc2l0b3J5LmdldERlc2VsZWN0QWxsQnV0dG9uSW1hZ2UodGhpcy5yZXNvdXJjZU1hbmFnZXIpICk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZGVzZWxlY3RBbGxUYWJsZXMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgYWRkQ29sdW1uTGF5b3V0RGF0YShUYWJsZUxheW91dENvbXBvc2l0ZSBsYXlvdXQpIHsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQl9Ci0KLQl2b2lkIGVkaXRFbnRpdHlOYW1lSWZQb3NzaWJsZSgpewotCQlPYmplY3RbXSBzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMudGFibGVUYWJsZS5nZXRTZWxlY3Rpb24oKSkudG9BcnJheSgpOwotCQlpZiAoc2VsZWN0ZWQubGVuZ3RoICE9IDEpIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXZvaWQgaGFuZGxlVGFibGVzTGlzdFNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWRvU3RhdHVzVXBkYXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJQmFzZUxhYmVsUHJvdmlkZXIgYnVpbGRUYWJsZVRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZVRhYmxlTGFiZWxQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBidWlsZFRhYmxlVGFibGVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVUYWJsZUNvbnRlbnRQcm92aWRlcigpOwotCX0KLQkKLQlwdWJsaWMgU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmpwYVByb2plY3QuZ2V0RGVmYXVsdERiU2NoZW1hKCkgOwotCX0KLQkKLQlDb2xsZWN0aW9uPFRhYmxlPiBnZXRTZWxlY3RlZFRhYmxlcygpIHsKLQkJQXJyYXlMaXN0PFRhYmxlPiBzZWxlY3RlZFRhYmxlcyA9IG5ldyBBcnJheUxpc3Q8VGFibGU+KCk7Ci0JCWZvciAoT2JqZWN0IHNlbGVjdGVkVGFibGUgOiB0aGlzLnRhYmxlVGFibGUuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpCi0JCQlzZWxlY3RlZFRhYmxlcy5hZGQoKFRhYmxlKSBzZWxlY3RlZFRhYmxlKTsKLQkJcmV0dXJuIHNlbGVjdGVkVGFibGVzOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNUYWJsZXNTZWxlY3RlZCgpIHsKLQkJcmV0dXJuICh0aGlzLnRhYmxlVGFibGUgIT0gbnVsbCkgPyAodGhpcy5nZXRTZWxlY3RlZFRhYmxlcygpLnNpemUoKSA+IDApIDogZmFsc2U7Ci0JfQotCi0Jdm9pZCB1cGRhdGVUYWJsZXNMaXN0Vmlld2VyKENvbGxlY3Rpb248VGFibGU+IHBvc3NpYmxlVGFibGVzKSB7Ci0JCWlmICh0aGlzLnRhYmxlVGFibGUgIT0gbnVsbCkgewotCQkJdGhpcy5pbml0VGFibGVzU2VsZWN0aW9uQ29udHJvbChwb3NzaWJsZVRhYmxlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHN0YXR1cyBsaW5lIGFuZCB0aGUgT0sgYnV0dG9uIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc3RhdHVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TdGF0dXNVcGRhdGUoKSB7Ci0JCWlmICggISB0aGlzLmhhc1RhYmxlc1NlbGVjdGVkKCkpIHsKLQkJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJfWVsc2V7Ci0JCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCQl0cnl7Ci0JCQkJZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCBmYWxzZSwgbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpewotCQkJCQlwdWJsaWMgdm9pZCBydW4oIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotCQkJCSAgICAJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0JCQkJICAgIHsKLQkJCQkJCW1vbml0b3IuYmVnaW5UYXNrKCJVcGRhdGluZyIsIDEwKTsKLQkJCQkKLQkJCQkJCUNvbGxlY3Rpb248VGFibGU+IHJldCA9IGdldFNlbGVjdGVkVGFibGVzKCk7Ci0JCQkJCQlBcnJheUxpc3Q8U3RyaW5nPiB0YWJsZU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQkJCQlmb3IoIFRhYmxlIHQgOiByZXQgKXsKLQkJCQkJCQl0YWJsZU5hbWVzLmFkZCh0LmdldE5hbWUoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlTY2hlbWEgc2NoZW1hID0gZ2V0U2NoZW1hKCk7Ci0JCQkJCQlpZiggc2NoZW1hID09IG51bGwgKXsKLQkJCQkJCQlyZXR1cm4gOwotCQkJCQkJfQotCQkJCQkJY3VzdG9taXplci5zZXRTY2hlbWEoc2NoZW1hKTsKLQkJCQkJCWN1c3RvbWl6ZXIuc2V0VGFibGVOYW1lcyh0YWJsZU5hbWVzKTsKLQkJCQkJCWN1c3RvbWl6ZXIuc2V0U2hvdWxkVXBkYXRlUGVyc2lzdGVuY2VYbWwodXBkYXRlUGVyc2lzdGVuY2VYbWwpOwotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJICAgIH0KLQkJCQl9KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQkJCQotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQlwcml2YXRlIGNsYXNzIFRhYmxlVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCVRhYmxlVGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiAoKFRhYmxlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgVEFCTEVfQ09MVU1OX0lOREVYOgotCQkJCQlyZXR1cm4gKChUYWJsZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCi0JCQl9Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGNvbHVtbiBpbmRleDogIiArIGNvbHVtbkluZGV4KTsvLyAkTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGFibGVUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCQlUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKENvbGxlY3Rpb248Pz4pIGlucHV0RWxlbWVudCkudG9BcnJheSgpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0aW9uU3RhdGUoZmluYWwgU2NoZW1hIHNjaGVtYSkgewotCQlpZihzY2hlbWEgPT1udWxsKQotCQkJcmV0dXJuOwotCQl0aGlzLmpwYVByb2plY3Quc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSggc2NoZW1hLmdldElkZW50aWZpZXIoKSk7Ci0JCQotCQl1cGRhdGVUYWJsZXNMaXN0Vmlld2VyKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHNjaGVtYS5nZXRUYWJsZXMoKSkpOwotCi0JCS8vQ3JlYXRlIHRoZSBPUk1HZW5DdXN0b21pemVyCi0JCUdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkIHdpemFyZCA9IChHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCWN1c3RvbWl6ZXIgPSB3aXphcmQuY3JlYXRlT1JNR2VuQ3VzdG9taXplciggc2NoZW1hICk7Ci0KLQkJaWYoIHRoaXMudGFibGVUYWJsZSE9bnVsbCAmJiB0aGlzLnVwZGF0ZVBlcnNpc3RlbmNlWG1sQ2hlY2tCb3ghPW51bGwgJiYgY3VzdG9taXplciAhPSBudWxsICApewotCQkJcmVzdG9yZVdpemFyZFN0YXRlKCk7Ci0JCX0KLSAgICAgICAgZG9TdGF0dXNVcGRhdGUoKTsKLQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiByZXN0b3JlV2l6YXJkU3RhdGUoKXsKLQkJYm9vbGVhbiBwYWdlQ29tcGxldGUgPSBmYWxzZTsKLQkJdGhpcy51cGRhdGVQZXJzaXN0ZW5jZVhtbENoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLmN1c3RvbWl6ZXIuc2hvdWxkVXBkYXRlUGVyc2lzdGVuY2VYbWwoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBwcmVTZWxlY3RlZFRhYmxlTmFtZXMgPSB0aGlzLmN1c3RvbWl6ZXIuZ2V0VGFibGVOYW1lcygpOwotCQlpZihwcmVTZWxlY3RlZFRhYmxlTmFtZXMhPW51bGwgJiYgcHJlU2VsZWN0ZWRUYWJsZU5hbWVzLnNpemUoKT4wKSB7Ci0JCQlTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCQlmb3IoU3RyaW5nIHMgOiBwcmVTZWxlY3RlZFRhYmxlTmFtZXMgKXsKLQkJCQlzZXQuYWRkKHMpOwotCQkJfQotCSAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSB0aGlzLnRhYmxlVGFibGUuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkgewotCSAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JICAgICAgICAgICAgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGVsZW1lbnQgPSAob3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlKWl0ZW0uZ2V0RGF0YSgpOwotCSAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgYm9vbGVhbiBjaGVjayA9IHNldC5jb250YWlucyhlbGVtZW50LmdldE5hbWUoKSk7Ci0JICAgICAgICAgICAgICAgIC8vIG9ubHkgc2V0IGlmIGRpZmZlcmVudCwgdG8gYXZvaWQgZmxpY2tlcgotCSAgICAgICAgICAgICAgICBpZiAoaXRlbS5nZXRDaGVja2VkKCkgIT0gY2hlY2spIHsKLQkgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0Q2hlY2tlZChjaGVjayk7Ci0JICAgICAgICAgICAgICAgICAgICBwYWdlQ29tcGxldGUgPSB0cnVlOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotCQl9Ci0JCXJldHVybiBwYWdlQ29tcGxldGU7Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgdGhlIGxheW91dERhdGEgb2YgdGhlIGlucHV0IGNvbnRyb2wgdG8gb2NjdXB5IHNwZWNpZmllZCBudW1iZXIgb2YgY29sdW1ucwotCSAqIEBwYXJhbSBjCi0JICogQHBhcmFtIGNvbHVtbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlsbENvbHVtbnMoQ29udHJvbCBjLCBpbnQgY29sdW1ucyl7Ci0JCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJbGF5b3V0RGF0YS5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbnM7Ci0JCWxheW91dERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWxheW91dERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWxheW91dERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKLQkJYy5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQlyZXR1cm4gOwotCX0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHBlcmZvcm1IZWxwKCkgCi0gICAgewotICAgIAl0aGlzLmdldEhlbHBTeXN0ZW0oKS5kaXNwbGF5SGVscCggR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQuSEVMUF9DT05URVhUX0lEICk7Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9vcm0vTWFwcGluZ0ZpbGVOZXdGaWxlV2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9vcm0vTWFwcGluZ0ZpbGVOZXdGaWxlV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODQwMGRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvb3JtL01hcHBpbmdGaWxlTmV3RmlsZVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMub3JtOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBNYXBwaW5nRmlsZU5ld0ZpbGVXaXphcmRQYWdlCi0JCWV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7Ci0JCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZGF0YU1vZGVsOwotCQotCQotCXB1YmxpYyBNYXBwaW5nRmlsZU5ld0ZpbGVXaXphcmRQYWdlKAotCQkJU3RyaW5nIHBhZ2VOYW1lLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIElEYXRhTW9kZWwgZGF0YU1vZGVsLAotCQkJU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCi0JCXN1cGVyKHBhZ2VOYW1lLCBzZWxlY3Rpb24pOwotCQlpbml0KGRhdGFNb2RlbCk7Ci0JCXNldFRpdGxlKHRpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXRoaXMuZGF0YU1vZGVsID0gZGF0YU1vZGVsOwotCQlJUGF0aCBjb250YWluZXJQYXRoID0gKElQYXRoKSB0aGlzLmRhdGFNb2RlbC5nZXRQcm9wZXJ0eShDT05UQUlORVJfUEFUSCk7Ci0JCWlmIChjb250YWluZXJQYXRoICE9IG51bGwpIHsKLQkJCXNldENvbnRhaW5lckZ1bGxQYXRoKGNvbnRhaW5lclBhdGgpOwotCQl9Ci0JCVN0cmluZyBmaWxlTmFtZSA9IChTdHJpbmcpIHRoaXMuZGF0YU1vZGVsLmdldFByb3BlcnR5KEZJTEVfTkFNRSk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQlzZXRGaWxlTmFtZShmaWxlTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQl0aGlzLmRhdGFNb2RlbC5zZXRQcm9wZXJ0eShDT05UQUlORVJfUEFUSCwgZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSk7Ci0JCXRoaXMuZGF0YU1vZGVsLnNldFByb3BlcnR5KEZJTEVfTkFNRSwgZ2V0RmlsZU5hbWUoKSk7Ci0JCQotCQlib29sZWFuIHZhbGlkID0gc3VwZXIudmFsaWRhdGVQYWdlKCk7Ci0JCWlmICghIHZhbGlkKSB7Ci0JCQlyZXR1cm4gdmFsaWQ7Ci0JCX0KLQkJCi0JCUlTdGF0dXMgdmFsaWRhdGlvblN0YXR1cyA9IHRoaXMuZGF0YU1vZGVsLnZhbGlkYXRlUHJvcGVydHkoQ09OVEFJTkVSX1BBVEgpOwotCQlpZiAodmFsaWRhdGlvblN0YXR1cy5pc09LKCkpIHsKLQkJCXZhbGlkYXRpb25TdGF0dXMgPSB0aGlzLmRhdGFNb2RlbC52YWxpZGF0ZVByb3BlcnR5KEZJTEVfTkFNRSk7Ci0JCX0KLQkJaWYgKHZhbGlkYXRpb25TdGF0dXMuaXNPSygpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmICh2YWxpZGF0aW9uU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRNZXNzYWdlKHZhbGlkYXRpb25TdGF0dXMuZ2V0TWVzc2FnZSgpLCBJU3RhdHVzLldBUk5JTkcpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UodmFsaWRhdGlvblN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9vcm0vTWFwcGluZ0ZpbGVPcHRpb25zV2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9vcm0vTWFwcGluZ0ZpbGVPcHRpb25zV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzM4OTBiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvb3JtL01hcHBpbmdGaWxlT3B0aW9uc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLm9ybTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuKjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBNYXBwaW5nRmlsZU9wdGlvbnNXaXphcmRQYWdlCi0JCWV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0JCi0JcHJpdmF0ZSBMYWJlbCBhY2Nlc3NMYWJlbDsKLQkKLQlwcml2YXRlIENvbWJvIGFjY2Vzc0NvbWJvOwotCQotCXByaXZhdGUgQnV0dG9uIGFkZFRvUGVyc2lzdGVuY2VVbml0QnV0dG9uOwotCQotCXByaXZhdGUgTGFiZWwgcGVyc2lzdGVuY2VVbml0TGFiZWw7Ci0JCi0JcHJpdmF0ZSBDb21ibyBwZXJzaXN0ZW5jZVVuaXRDb21ibzsKLQkKLQkKLQlwdWJsaWMgTWFwcGluZ0ZpbGVPcHRpb25zV2l6YXJkUGFnZSgKLQkJCVN0cmluZyBwYWdlTmFtZSwgSURhdGFNb2RlbCBkYXRhTW9kZWwsCi0JCQlTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkKLQkJc3VwZXIoZGF0YU1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKHRpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10gewotCQkJQ09OVEFJTkVSX1BBVEgsCi0JCQlGSUxFX05BTUUsCi0JCQlERUZBVUxUX0FDQ0VTUywKLQkJCUFERF9UT19QRVJTSVNURU5DRV9VTklULAotCQkJUEVSU0lTVEVOQ0VfVU5JVAotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJdGhpcy5hY2Nlc3NMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGhpcy5hY2Nlc3NMYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2FjY2Vzc0xhYmVsKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQl0aGlzLmFjY2Vzc0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQl0aGlzLmFjY2Vzc0NvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmFjY2Vzc0NvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRoaXMuc3luY2hIZWxwZXIuc3luY2hDb21ibyh0aGlzLmFjY2Vzc0NvbWJvLCBERUZBVUxUX0FDQ0VTUywgbnVsbCk7Ci0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCi0JCXRoaXMuYWRkVG9QZXJzaXN0ZW5jZVVuaXRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLIHwgU1dULkJFR0lOTklORyk7Ci0JCXRoaXMuYWRkVG9QZXJzaXN0ZW5jZVVuaXRCdXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9hZGRUb1BlcnNpc3RlbmNlVW5pdEJ1dHRvbik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWRhdGEudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJdGhpcy5hZGRUb1BlcnNpc3RlbmNlVW5pdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0aGlzLnN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3godGhpcy5hZGRUb1BlcnNpc3RlbmNlVW5pdEJ1dHRvbiwgQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQsIG51bGwpOwotCQkKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRMYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3BlcnNpc3RlbmNlVW5pdExhYmVsKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl0aGlzLmFkZFRvUGVyc2lzdGVuY2VVbml0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwZXJzaXN0ZW5jZVVuaXRMYWJlbC5zZXRFbmFibGVkKGFkZFRvUGVyc2lzdGVuY2VVbml0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Lypub3QgY2FsbGVkKi99Ci0JCX0pOwotCQkKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0aGlzLnN5bmNoSGVscGVyLnN5bmNoQ29tYm8odGhpcy5wZXJzaXN0ZW5jZVVuaXRDb21ibywgUEVSU0lTVEVOQ0VfVU5JVCwgbnVsbCk7Ci0JCQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQotLy8JCWNsYXNzVGV4dC5zZXRGb2N1cygpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgZ2V0SW5mb3BvcElEKCkpOwotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9vcm0vTWFwcGluZ0ZpbGVXaXphcmQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvb3JtL01hcHBpbmdGaWxlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNGUzYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9vcm0vTWFwcGluZ0ZpbGVXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5vcm07Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLio7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5QbGF0Zm9ybVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLklEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpLldhcm5pbmdEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBDb21tb25VSVJlc291cmNlSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIE1hcHBpbmdGaWxlV2l6YXJkIGV4dGVuZHMgV2l6YXJkCi0JaW1wbGVtZW50cyBJTmV3V2l6YXJkIAotewotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQkKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbjsKLQkKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gbXVuZ2VkU2VsZWN0aW9uOwotCQotCXByaXZhdGUgSVdpemFyZFBhZ2UgZmlyc3RQYWdlOwotCQotCXByaXZhdGUgSVdpemFyZFBhZ2Ugc2Vjb25kUGFnZTsKLQkKLQkKLQlwdWJsaWMgTWFwcGluZ0ZpbGVXaXphcmQoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCQotCXB1YmxpYyBNYXBwaW5nRmlsZVdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLmRhdGFNb2RlbCA9IGRhdGFNb2RlbDsKLQkJc2V0V2luZG93VGl0bGUoSnB0VWlNZXNzYWdlcy5NYXBwaW5nRmlsZVdpemFyZF90aXRsZSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEpwdFVpUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihKcHRVaUljb25zLkpQQV9GSUxFX1dJWl9CQU5ORVIpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuaW5pdGlhbFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJdGhpcy5tdW5nZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCQotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewkKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJT2JqZWN0IGZpcnN0U2VsZWN0aW9uID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0IHBVbml0ID0gZXh0cmFjdFBlcnNpc3RlbmNlVW5pdChmaXJzdFNlbGVjdGlvbik7Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gZXh0cmFjdENvbnRhaW5lcihwVW5pdCwgZmlyc3RTZWxlY3Rpb24pOwotCQkKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQl0aGlzLm11bmdlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbnRhaW5lcik7Ci0JCX0KLQkJCi0JCWlmIChwVW5pdCAhPSBudWxsKSB7Ci0JCQlnZXREYXRhTW9kZWwoKS5zZXRCb29sZWFuUHJvcGVydHkoQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQsIHRydWUpOwotCQkJZ2V0RGF0YU1vZGVsKCkuc2V0U3RyaW5nUHJvcGVydHkoUEVSU0lTVEVOQ0VfVU5JVCwgcFVuaXQuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBleHRyYWN0UGVyc2lzdGVuY2VVbml0KE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIEpwYUNvbnRleHROb2RlKSB7Ci0JCQkvLyBtYXkgYmUgbnVsbCBpZiBub2RlIGlzIGFib3ZlIGxldmVsIG9mIHBlcnNpc3RlbmNlIHVuaXQsIGJ1dCBpbiB0aG9zZSBjYXNlcwotCQkJLy8gbnVsbCBpcyB0aGUgZXhwZWN0ZWQgcmVzdWx0Ci0JCQl0cnkgewotCQkJCXJldHVybiAoKEpwYUNvbnRleHROb2RlKSBzZWxlY3Rpb24pLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IC8qIGRvIG5vdGhpbmcsIGp1c3QgY29udGludWUgKi8gfQotCQl9Ci0JCQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJSnBhQ29udGV4dE5vZGUgbm9kZSA9IChKcGFDb250ZXh0Tm9kZSkgKChJQWRhcHRhYmxlKSBzZWxlY3Rpb24pLmdldEFkYXB0ZXIoSnBhQ29udGV4dE5vZGUuY2xhc3MpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBub2RlLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElDb250YWluZXIgZXh0cmFjdENvbnRhaW5lcihQZXJzaXN0ZW5jZVVuaXQgcFVuaXQsIE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJaWYgKHBVbml0ICE9IG51bGwpIHsKLQkJCXJldHVybiBwVW5pdC5nZXRSZXNvdXJjZSgpLmdldFBhcmVudCgpOwotCQl9Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJcmV0dXJuIGdldERlZmF1bHRDb250YWluZXIoKElQcm9qZWN0KSBzZWxlY3Rpb24pOwotCQl9Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQlyZXR1cm4gKElDb250YWluZXIpIHNlbGVjdGlvbjsKLQkJfQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSnBhQ29udGV4dE5vZGUpIHsKLQkJCXJldHVybiBnZXREZWZhdWx0Q29udGFpbmVyKCgoSnBhQ29udGV4dE5vZGUpIHNlbGVjdGlvbikuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCX0KLQkJCi0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSAoKElBZGFwdGFibGUpIHNlbGVjdGlvbikuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQlyZXR1cm4gZ2V0RGVmYXVsdENvbnRhaW5lcigoSVByb2plY3QpIHJlc291cmNlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCXJldHVybiAoSUNvbnRhaW5lcikgcmVzb3VyY2U7Ci0JCQkJfQotCQkJfQotCQkJSnBhQ29udGV4dE5vZGUgbm9kZSA9IChKcGFDb250ZXh0Tm9kZSkgKChJQWRhcHRhYmxlKSBzZWxlY3Rpb24pLmdldEFkYXB0ZXIoSnBhQ29udGV4dE5vZGUuY2xhc3MpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXREZWZhdWx0Q29udGFpbmVyKG5vZGUuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSUNvbnRhaW5lciBnZXREZWZhdWx0Q29udGFpbmVyKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKEpwYUZhY2V0LmlzSW5zdGFsbGVkKHByb2plY3QpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXRSZXNvdXJjZUxvY2F0b3IocHJvamVjdCkuZ2V0RGVmYXVsdFJlc291cmNlTG9jYXRpb24ocHJvamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlzdXBlci5hZGRQYWdlcygpOwotCQl0aGlzLmZpcnN0UGFnZSA9IGJ1aWxkTWFwcGluZ0ZpbGVOZXdGaWxlV2l6YXJkUGFnZSgpOwotCQl0aGlzLnNlY29uZFBhZ2UgPSBidWlsZE1hcHBpbmdGaWxlT3B0aW9uc1dpemFyZFBhZ2UoKTsKLQkJYWRkUGFnZSh0aGlzLmZpcnN0UGFnZSk7Ci0JCWFkZFBhZ2UodGhpcy5zZWNvbmRQYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcHBpbmdGaWxlTmV3RmlsZVdpemFyZFBhZ2UgYnVpbGRNYXBwaW5nRmlsZU5ld0ZpbGVXaXphcmRQYWdlKCkgewotCQlyZXR1cm4gbmV3IE1hcHBpbmdGaWxlTmV3RmlsZVdpemFyZFBhZ2UoCi0JCQkJIlBhZ2VfMSIsIHRoaXMubXVuZ2VkU2VsZWN0aW9uLCBnZXREYXRhTW9kZWwoKSwKLQkJCQlKcHRVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9uZXdGaWxlX3RpdGxlLCAKLQkJCQlKcHRVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9uZXdGaWxlX2Rlc2MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVPcHRpb25zV2l6YXJkUGFnZSBidWlsZE1hcHBpbmdGaWxlT3B0aW9uc1dpemFyZFBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgTWFwcGluZ0ZpbGVPcHRpb25zV2l6YXJkUGFnZSgKLQkJCQkiUGFnZV8yIiwgZ2V0RGF0YU1vZGVsKCksCi0JCQkJSnB0VWlNZXNzYWdlcy5NYXBwaW5nRmlsZVdpemFyZFBhZ2Vfb3B0aW9uc190aXRsZSwgCi0JCQkJSnB0VWlNZXNzYWdlcy5NYXBwaW5nRmlsZVdpemFyZFBhZ2Vfb3B0aW9uc19kZXNjKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQkvLyBvdmVycmlkZSBzbyB0aGF0IHZpc2l0IHRvIHNlY29uZCBwYWdlIGlzIG5vdCBuZWNlc3NhcnkKLQkJcmV0dXJuIHRoaXMuZmlyc3RQYWdlLmlzUGFnZUNvbXBsZXRlKCkgJiYgZ2V0RGF0YU1vZGVsKCkuaXNWYWxpZCgpOwotCX0KLQkKLQlwdWJsaWMgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCWlmICh0aGlzLmRhdGFNb2RlbCA9PSBudWxsKSB7Ci0JCQl0aGlzLmRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKGdldERlZmF1bHRQcm92aWRlcigpKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5kYXRhTW9kZWw7Ci0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24gZ2V0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbikgZ2V0RGF0YU1vZGVsKCkuZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQl0cnkgewotCQkJZmluYWwgSVN0YXR1cyBzdCA9IHJ1bk9wZXJhdGlvbnMoKTsKLQkJCQotCQkJaWYgKHN0LmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCUpwdFVpUGx1Z2luLmxvZyhzdCk7Ci0JCQkJVGhyb3dhYmxlIHQgPSBzdC5nZXRFeGNlcHRpb24oKSA9PSBudWxsID8gbmV3IENvcmVFeGNlcHRpb24oc3QpIDogc3QuZ2V0RXhjZXB0aW9uKCk7Ci0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCQkJZ2V0U2hlbGwoKSwgCi0JCQkJCQlXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV1RQV2l6YXJkX1VJXzAsIG5ldyBPYmplY3RbXXtnZXRXaW5kb3dUaXRsZSgpfSksIAotCQkJCQkJV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldUUFdpemFyZF9VSV8xLCBuZXcgT2JqZWN0W117Z2V0V2luZG93VGl0bGUoKX0pLCAKLQkJCQkJCXQsIDAsIGZhbHNlKTsKLQkJCX0gCi0JCQllbHNlIGlmKHN0LmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKXsKLQkJCQlXYXJuaW5nRGlhbG9nLm9wZW5XYXJuaW5nKAotCQkJCQkJZ2V0U2hlbGwoKSwgCi0JCQkJCQlXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV1RQV2l6YXJkX1VJXzIsIG5ldyBPYmplY3RbXXtnZXRXaW5kb3dUaXRsZSgpfSksIAotCQkJCQkJc3QuZ2V0TWVzc2FnZSgpLCAKLQkJCQkJCXN0LCBJU3RhdHVzLldBUk5JTkcpOwotCQkJfQotCQkJCi0JCQlwb3N0UGVyZm9ybUZpbmlzaCgpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCQlnZXRTaGVsbCgpLCAKLQkJCQkJV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldUUFdpemFyZF9VSV8wLCBuZXcgT2JqZWN0W117Z2V0V2luZG93VGl0bGUoKX0pLCAKLQkJCQkJV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldUUFdpemFyZF9VSV8xLCBuZXcgT2JqZWN0W117Z2V0V2luZG93VGl0bGUoKX0pLCAKLQkJCQkJZSwgMCwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIElTdGF0dXMgcnVuT3BlcmF0aW9ucygpIHsKLQkJCi0JCWNsYXNzIENhdGNoVGhyb3dhYmxlUnVubmFibGVXaXRoUHJvZ3Jlc3MKLQkJCQlpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JCQkKLQkJCXB1YmxpYyBJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCQlwdWJsaWMgVGhyb3dhYmxlIGNhdWdodCA9IG51bGw7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RhdHVzID0gZ2V0T3BlcmF0aW9uKCkuZXhlY3V0ZShwbSwgbnVsbCk7Ci0JCQkJfSAKLQkJCQljYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkJY2F1Z2h0ID0gZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCUNhdGNoVGhyb3dhYmxlUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgQ2F0Y2hUaHJvd2FibGVSdW5uYWJsZVdpdGhQcm9ncmVzcygpOwotCQkKLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgcnVubmFibGUpOwotCQl9IAotCQljYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCXJ1bm5hYmxlLmNhdWdodCA9IGU7Ci0JCX0KLQkJCi0JCWlmIChydW5uYWJsZS5jYXVnaHQgPT0gbnVsbCkgewotCQkJcmV0dXJuIHJ1bm5hYmxlLnN0YXR1czsKLQkJfQotCQllbHNlIHsKLQkJCUpwdFVpUGx1Z2luLmxvZyhydW5uYWJsZS5jYXVnaHQpOwotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCQlnZXRTaGVsbCgpLCAKLQkJCQkJV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldUUFdpemFyZF9VSV8wLCBuZXcgT2JqZWN0W117Z2V0V2luZG93VGl0bGUoKX0pLCAKLQkJCQkJV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldUUFdpemFyZF9VSV8xLCBuZXcgT2JqZWN0W117Z2V0V2luZG93VGl0bGUoKX0pLCAKLQkJCQkJcnVubmFibGUuY2F1Z2h0LCAwLCBmYWxzZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBydW5uYWJsZS5jYXVnaHQuZ2V0TWVzc2FnZSgpLCBydW5uYWJsZS5jYXVnaHQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9zdFBlcmZvcm1GaW5pc2goKQotCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geyAgICAgIAotCQkKLQkJdHJ5IHsKLQkJCUlQYXRoIGNvbnRhaW5lclBhdGggPSAoSVBhdGgpIGdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KENPTlRBSU5FUl9QQVRIKTsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IGdldERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KEZJTEVfTkFNRSk7Ci0JCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IFBsYXRmb3JtVG9vbHMuZ2V0Q29udGFpbmVyKGNvbnRhaW5lclBhdGgpOwotCQkJSUZpbGUgZmlsZSA9IGNvbnRhaW5lci5nZXRGaWxlKG5ldyBQYXRoKGZpbGVOYW1lKSk7Ci0JCQlvcGVuRWRpdG9yKGZpbGUpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gY2FudE9wZW4pIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGNhbnRPcGVuKTsKLQkJfSAKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgZmlsZSkgewotICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIAlKcHRVaVBsdWdpbi5sb2coZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWdldERhdGFNb2RlbCgpLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUGF0aCBjcmVhdGVOZXdNYXBwaW5nRmlsZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIFN0cmluZyB4bWxGaWxlTmFtZSkgewotCQlNYXBwaW5nRmlsZVdpemFyZCB3aXphcmQgPSBuZXcgTWFwcGluZ0ZpbGVXaXphcmQoRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpKTsKLQkJd2l6YXJkLmdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KEZJTEVfTkFNRSwgeG1sRmlsZU5hbWUpOwotCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb24pOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRDdXJyZW50U2hlbGwoKSwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCUlQYXRoIGNvbnRhaW5lclBhdGggPSAoSVBhdGgpIHdpemFyZC5nZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShDT05UQUlORVJfUEFUSCk7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSB3aXphcmQuZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoRklMRV9OQU1FKTsKLQkJCUlDb250YWluZXIgY29udGFpbmVyID0gUGxhdGZvcm1Ub29scy5nZXRDb250YWluZXIoY29udGFpbmVyUGF0aCk7Ci0JCQlJUGF0aCBmaWxlUGF0aCA9IGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpLmFwcGVuZChmaWxlTmFtZSk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gY29udGFpbmVyLmdldFByb2plY3QoKTsKLQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gSnB0Q29yZVBsdWdpbi5nZXRSZXNvdXJjZUxvY2F0b3IocHJvamVjdCkuZ2V0UnVudGltZVBhdGgocHJvamVjdCwgZmlsZVBhdGgpOwotCQkJCi0JCQlyZXR1cm4gcnVudGltZVBhdGg7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU2hlbGwgZ2V0Q3VycmVudFNoZWxsKCkgewotCSAgICByZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9wcm9qL0FkZFRvRWFyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovQWRkVG9FYXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmYTFlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovQWRkVG9FYXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLnByb2o7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMucHJvai5tb2RlbC5KcGFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLio7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5FYXJQcm9qZWN0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFN5bmNoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRUb0VhckNvbXBvc2l0ZSB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBCdXR0b24gYWRkVG9FYXI7Ci0JcHJpdmF0ZSBmaW5hbCBDb21ibyBjb21ibzsKLQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBuZXdCdXR0b247Ci0JcHJpdmF0ZSBmaW5hbCBMYWJlbCBsYWJlbDsKLQkKLQlwcml2YXRlIGZpbmFsIElEYXRhTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBEYXRhTW9kZWxTeW5jaEhlbHBlciBzeW5jaGhlbHBlcjsKLQkKLQlwdWJsaWMgQWRkVG9FYXJDb21wb3NpdGUoSURhdGFNb2RlbCBtb2RlbCwgQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMuc3luY2hoZWxwZXIgPSBuZXcgRGF0YU1vZGVsU3luY2hIZWxwZXIobW9kZWwpOwotCQkKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5BZGRUb0VhckNvbXBvc2l0ZV9lYXJNZW1iZXJTaGlwKTsKLQkJCi0JCXRoaXMuYWRkVG9FYXIgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQl0aGlzLmFkZFRvRWFyLnNldFRleHQoSnB0VWlNZXNzYWdlcy5BZGRUb0VhckNvbXBvc2l0ZV9hZGRUb0VhckxhYmVsKTsKLQkJR3JpZERhdGFGYWN0b3J5LmRlZmF1bHRzRm9yKHRoaXMuYWRkVG9FYXIpLnNwYW4oMywgMSkuYXBwbHlUbyh0aGlzLmFkZFRvRWFyKTsKLQkJdGhpcy5zeW5jaGhlbHBlci5zeW5jaENoZWNrYm94KGFkZFRvRWFyLCBBRERfVE9fRUFSLCBudWxsKTsKLQkJCi0JCXRoaXMubGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OVUxMKTsKLQkJdGhpcy5sYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuQWRkVG9FYXJDb21wb3NpdGVfZWFyUHJvamVjdExhYmVsKTsKLQkJdGhpcy5jb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULk5PTkUpOwotCQl0aGlzLmNvbWJvLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQkJCi0JCXRoaXMubmV3QnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQl0aGlzLm5ld0J1dHRvbi5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuQWRkVG9FYXJDb21wb3NpdGVfbmV3QnV0dG9uTGFiZWwpOwotCQlHcmlkRGF0YUZhY3RvcnkuZGVmYXVsdHNGb3IodGhpcy5uZXdCdXR0b24pLmFwcGx5VG8odGhpcy5uZXdCdXR0b24pOwotCQkKLQkJdGhpcy5uZXdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQloYW5kbGVBZGRCdXR0b24oKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCi0JCXRoaXMuc3luY2hoZWxwZXIuc3luY2hDb21ibyhjb21ibywgRUFSX1BST0pFQ1RfTkFNRSwgbmV3IENvbnRyb2xbXXtsYWJlbCwgbmV3QnV0dG9ufSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUFkZEJ1dHRvbigpIHsKLQkJRWFyUHJvamVjdFdpemFyZCB3aXphcmQgPSBuZXcgRWFyUHJvamVjdFdpemFyZCgpOwotCQkKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2cobmV3QnV0dG9uLmdldFNoZWxsKCksIHdpemFyZCk7Ci0JCQotCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSB0aGlzLm1vZGVsLmdldFByb3BlcnR5KEZBQ0VUX1JVTlRJTUUpOwotCQl3aXphcmQuc2V0UnVudGltZUluRGF0YU1vZGVsKHJ1bnRpbWUpOwotCQkKLQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93LkNBTkNFTCkgewotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShFQVJfUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQkJU3RyaW5nIGVhcnByb2ogPSB3aXphcmQuZ2V0UHJvamVjdE5hbWUoKTsKLQkJCXRoaXMubW9kZWwuc2V0UHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSwgZWFycHJvaik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgR3JpZERhdGEgZ2RoZmlsbCgpIHsKLQkJcmV0dXJuIG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEdyaWREYXRhIGdkaHNwYW4oR3JpZERhdGEgZ2QsIGludCBzcGFuKSB7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJcmV0dXJuIGdkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodGhpcy5zeW5jaGhlbHBlciAhPSBudWxsKXsKLQkJCXRoaXMuc3luY2hoZWxwZXIuZGlzcG9zZSgpOwotCQkJdGhpcy5zeW5jaGhlbHBlciA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDb21ib1RleHQoKXsKLQkJcmV0dXJuIHRoaXMuY29tYm8uZ2V0VGV4dCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvcHJvai9KcGFQcm9qZWN0V2l6YXJkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovSnBhUHJvamVjdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmU3NGNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvcHJvai9KcGFQcm9qZWN0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLnByb2o7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5wcm9qLm1vZGVsLkpwYVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLk5ld1Byb2plY3REYXRhTW9kZWxGYWNldFdpemFyZDsKLQotcHVibGljIGNsYXNzIEpwYVByb2plY3RXaXphcmQKLQkJZXh0ZW5kcyBOZXdQcm9qZWN0RGF0YU1vZGVsRmFjZXRXaXphcmQgewotCQotCXB1YmxpYyBKcGFQcm9qZWN0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShKcHRVaU1lc3NhZ2VzLkpwYVByb2plY3RXaXphcmRfdGl0bGUpOwotCX0KLQkKLQlwdWJsaWMgSnBhUHJvamVjdFdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCQlzZXRXaW5kb3dUaXRsZShKcHRVaU1lc3NhZ2VzLkpwYVByb2plY3RXaXphcmRfdGl0bGUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdFVpSWNvbnMuSlBBX1dJWl9CQU5ORVIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVdpemFyZFBhZ2UgY3JlYXRlRmlyc3RQYWdlKCkgewotCQlyZXR1cm4gbmV3IEpwYVByb2plY3RXaXphcmRGaXJzdFBhZ2UobW9kZWwsICJmaXJzdC5wYWdlIik7IC8vJE5PTi1OTFMtMSQgCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKcGFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUoImpwdC5qcGEudGVtcGxhdGUiKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuanB0LnVpLmpwYVBlcnNwZWN0aXZlIjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovSnBhUHJvamVjdFdpemFyZEZpcnN0UGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9wcm9qL0pwYVByb2plY3RXaXphcmRGaXJzdFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlNGVlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovSnBhUHJvamVjdFdpemFyZEZpcnN0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5wcm9qOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkZhY2V0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLnByb2oubW9kZWwuSnBhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5EYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZTsKLQotcHVibGljIGNsYXNzIEpwYVByb2plY3RXaXphcmRGaXJzdFBhZ2UKLQkJZXh0ZW5kcyBEYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZSAgewotCQotCXByaXZhdGUgQWRkVG9FYXJDb21wb3NpdGUgYWRkVG9FYXJDb21wb3NpdGU7Ci0JCi0JcHVibGljIEpwYVByb2plY3RXaXphcmRGaXJzdFBhZ2UoSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihkYXRhTW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5OZXdKcGFQcm9qZWN0V2l6YXJkX2ZpcnN0UGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEpwdFVpTWVzc2FnZXMuTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfZGVzY3JpcHRpb24pOwotCQlzZXRJbmZvcG9wSUQoSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSB0b3AgPSBzdXBlci5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCQljcmVhdGVFYXJDb21wb3NpdGUodG9wKTsKLQkJY3JlYXRlV29ya2luZ1NldEdyb3VwUGFuZWwodG9wLCBuZXcgU3RyaW5nW10geyBSRVNPVVJDRV9XT1JLSU5HX1NFVCwgSkFWQV9XT1JLSU5HX1NFVCB9KTsKLQkJcmV0dXJuIHRvcDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVhckNvbXBvc2l0ZShDb21wb3NpdGUgdG9wKSB7Ci0JCXRoaXMuYWRkVG9FYXJDb21wb3NpdGUgPSBuZXcgQWRkVG9FYXJDb21wb3NpdGUoZ2V0RGF0YU1vZGVsKCksIHRvcCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGludGVybmFsTGF1bmNoTmV3UnVudGltZVdpemFyZChTaGVsbCBzaGVsbCwgSURhdGFNb2RlbCBtb2RlbCkgewotCQlJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcHdjID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSBtb2RlbC5nZXRQcm9wZXJ0eShGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZKTsKLQkJSVByb2plY3RGYWNldFZlcnNpb24gbW9kdWxlRmFjZXQgPSBGYWNldFRvb2xzLmdldE1vZHVsZUZhY2V0KGZwd2MpOwotCQlpZiAobW9kdWxlRmFjZXQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGxhdW5jaE5ld1J1bnRpbWVXaXphcmQoc2hlbGwsIG1vZGVsLCBtb2R1bGVGYWNldC5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBsYXVuY2hOZXdSdW50aW1lV2l6YXJkKHNoZWxsLCBtb2RlbCk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVUeXBlSUQoKSB7Ci0JCXJldHVybiBKcGFGYWNldC5JRDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQl0aGlzLmFkZFRvRWFyQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQl9Ci0JCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0gICAgCXN1cGVyLnN0b3JlRGVmYXVsdFNldHRpbmdzKCk7Ci0gICAgCS8vIFRPRE8KLS8vICAgIAlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotLy8gICAgCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0vLyAgICAJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCltb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0vLyAgICAJCVN0cmluZyBmYWNldElEID0gZ2V0TW9kdWxlRmFjZXRJRCgpOwotLy8gICAgCQlJRGF0YU1vZGVsIGoyZWVNb2RlbCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChmYWNldElEKTsKLS8vICAgIAkJaWYoajJlZU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUikpewotLy8gICAgCQkJU3RyaW5nIGxhc3RFQVJOYW1lID0gajJlZU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FKTsKLS8vICAgIAkJCXNldHRpbmdzLnB1dChTVE9SRV9MQUJFTCwgbGFzdEVBUk5hbWUpOwotLy8gICAgCQl9Ci0vLyAgICAJfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotICAgIAlzdXBlci5yZXN0b3JlRGVmYXVsdFNldHRpbmdzKCk7Ci0gICAgICAgIC8vIFRPRE8KLS8vICAgIAlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotLy8gICAgCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0vLyAgICAJCVN0cmluZyBsYXN0RUFSTmFtZSA9IHNldHRpbmdzLmdldChTVE9SRV9MQUJFTCk7Ci0vLyAgICAJCWlmIChsYXN0RUFSTmFtZSAhPSBudWxsKXsKLS8vICAgIAkJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCltb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0vLyAgICAJCQlTdHJpbmcgZmFjZXRJRCA9IGdldE1vZHVsZUZhY2V0SUQoKTsKLS8vICAgIAkJCUlEYXRhTW9kZWwgajJlZU1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKGZhY2V0SUQpOwotLy8gICAgCQkJajJlZU1vZGVsLnNldFByb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5MQVNUX0VBUl9OQU1FLCBsYXN0RUFSTmFtZSk7Ci0vLyAgICAJCX0KLS8vICAgIAl9Ci0gICAgfQotICAgIAotLy8gICAgQE92ZXJyaWRlCi0vLyAgICBwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotLy8gICAgCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0vLyAgICB9Ci0gICAgCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlTdHJpbmdbXSBzdXBlclByb3BlcnRpZXMgPSBzdXBlci5nZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpOwotCQlMaXN0IGxpc3QgPSBBcnJheXMuYXNMaXN0KHN1cGVyUHJvcGVydGllcyk7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhcnJheUxpc3QuYWRkQWxsKGxpc3QpOwotCQlhcnJheUxpc3QuYWRkKEpwYVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSk7Ci0JCWFycmF5TGlzdC5hZGQoSnBhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSICk7Ci0JCXJldHVybiBhcnJheUxpc3QudG9BcnJheSggbmV3IFN0cmluZ1swXSApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvcHJvai9tb2RlbC9KcGFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovbW9kZWwvSnBhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzhiYmZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvcHJvai9tb2RlbC9KcGFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLnByb2oubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBKcGFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzCi0JCWV4dGVuZHMgSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0ZBQ0VUX0RBVEFfTU9ERUwgCi0JCQk9ICJKcGFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRFVMRV9GQUNFVF9EQVRBX01PREVMIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEREVEX1VUSUxJVFlfRkFDRVQKLQkJCT0gIkpwYVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQURERURfVVRJTElUWV9GQUNFVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVE9fRUFSIAotCQkJPSAiSnBhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9QUk9KRUNUX05BTUUgCi0JCQk9ICJKcGFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovbW9kZWwvSnBhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvcHJvai9tb2RlbC9KcGFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjQxYjUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvcHJvai9tb2RlbC9KcGFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMucHJvai5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkZhY2V0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXJOZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgSnBhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLQkJZXh0ZW5kcyBGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIAotCQlpbXBsZW1lbnRzIEpwYVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgewotCQotCXByaXZhdGUgSURhdGFNb2RlbExpc3RlbmVyIG1vZHVsZUZhY2V0RGF0YU1vZGVsTGlzdGVuZXI7Ci0JCi0JCi0JcHVibGljIEpwYVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLm1vZHVsZUZhY2V0RGF0YU1vZGVsTGlzdGVuZXIgCi0JCQk9IG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCQlpZiAoaXNQcm9wZXJ0eVNldChFQVJfUFJPSkVDVF9OQU1FKSkgewotCQkJCQkJCXNldFByb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUsIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRUFSX1BST0pFQ1RfTkFNRSwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQkJc2V0UHJvcGVydHkoQUREX1RPX0VBUiwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBuYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJbmFtZXMuYWRkKE1PRFVMRV9GQUNFVF9EQVRBX01PREVMKTsKLQkJbmFtZXMuYWRkKEFEREVEX1VUSUxJVFlfRkFDRVQpOwotCQluYW1lcy5hZGQoRUFSX1BST0pFQ1RfTkFNRSk7Ci0JCW5hbWVzLmFkZChBRERfVE9fRUFSKTsKLQkJcmV0dXJuIG5hbWVzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCQotCQlDb2xsZWN0aW9uPElQcm9qZWN0RmFjZXQ+IHJlcXVpcmVkRmFjZXRzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdEZhY2V0PigpOwotCQlyZXF1aXJlZEZhY2V0cy5hZGQoSmF2YUZhY2V0LkZBQ0VUKTsKLQkJcmVxdWlyZWRGYWNldHMuYWRkKEpwYUZhY2V0LkZBQ0VUKTsKLQkJc2V0UHJvcGVydHkoUkVRVUlSRURfRkFDRVRTX0NPTExFQ1RJT04sIHJlcXVpcmVkRmFjZXRzKTsKLQkJCi0JCWdldERhdGFNb2RlbCgpLmFkZExpc3RlbmVyKAotCQkJCW5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQkJCQkJaWYgKEZBQ0VUX0FDVElPTl9NQVAuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQkJCXVwZGF0ZU1vZHVsZUZhY2V0RGF0YU1vZGVsKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoRkFDRVRfUlVOVElNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJaWYgKGlzQWRkVG9FYXIoKSkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVFQVIobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSkpOwotCQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCUlQcm9qZWN0IGVhclByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZ2V0U3RyaW5nUHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSkpOwotCQkJCQlpZiAoZWFyUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZEVhclByb2plY3Q7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWZhY2V0ZWRFYXJQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKGVhclByb2plY3QpOwotCQkJCQkJCWlmIChmYWNldGVkRWFyUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoRUFSX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIGlzQWRkVG9FYXIoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEFEREVEX1VUSUxJVFlfRkFDRVQuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCWVsc2UgaWYgKEFERF9UT19FQVIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCUlEYXRhTW9kZWwgbW9kdWxlRmFjZXREYXRhTW9kZWwgPSBnZXRNb2R1bGVGYWNldERhdGFNb2RlbCgpOwotCQkJaWYgKG1vZHVsZUZhY2V0RGF0YU1vZGVsICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbW9kdWxlRmFjZXREYXRhTW9kZWwuZ2V0RGVmYXVsdFByb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChFQVJfUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlJRGF0YU1vZGVsIG1vZHVsZUZhY2V0RGF0YU1vZGVsID0gZ2V0TW9kdWxlRmFjZXREYXRhTW9kZWwoKTsKLQkJCWlmIChtb2R1bGVGYWNldERhdGFNb2RlbCAhPW51bGwpIHsKLQkJCQlyZXR1cm4gbW9kdWxlRmFjZXREYXRhTW9kZWwuZ2V0RGVmYXVsdFByb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEZBQ0VUX1JVTlRJTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkgJiYgaXNBZGRUb0VhcigpKSB7Ci0JCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHN1cGVyLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUlSdW50aW1lIHJ0ID0gKElSdW50aW1lKSBkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eVZhbHVlKCk7Ci0JCQkJaWYgKHJ0ID09IG51bGwgfHwgcnQuc3VwcG9ydHMoSUoyRUVGYWNldENvbnN0YW50cy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OX0ZBQ0VUKSkgewotCQkJCQlsaXN0LmFkZChkZXNjcmlwdG9yc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJZGVzY3JpcHRvcnMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlkZXNjcmlwdG9yc1tpXSA9IChEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IpIGxpc3QuZ2V0KGkpOwotCQkJfQotCQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCQl9Ci0JCWVsc2UgaWYgKEVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCUlEYXRhTW9kZWwgbW9kdWxlRmFjZXREYXRhTW9kZWwgPSBnZXRNb2R1bGVGYWNldERhdGFNb2RlbCgpOwotCQkJaWYgKG1vZHVsZUZhY2V0RGF0YU1vZGVsICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbW9kdWxlRmFjZXREYXRhTW9kZWwuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKAotCQkJCQkJSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbMF07Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJaWYgKEVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgQUREX1RPX0VBUi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJSURhdGFNb2RlbCBtb2R1bGVGYWNldERhdGFNb2RlbCA9IGdldE1vZHVsZUZhY2V0RGF0YU1vZGVsKCk7Ci0JCQlpZiAobW9kdWxlRmFjZXREYXRhTW9kZWwgIT0gbnVsbCl7Ci0JCQkJaWYgKEVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCQkJbW9kdWxlRmFjZXREYXRhTW9kZWwuc2V0UHJvcGVydHkoCi0JCQkJCQkJSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUsIHByb3BlcnR5VmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbW9kdWxlRmFjZXREYXRhTW9kZWwuc2V0UHJvcGVydHkoCi0JCQkJCQkJSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsIHByb3BlcnR5VmFsdWUpOwkKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNBZGRUb0VhcigpKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUVBUihtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShFQVJfUFJPSkVDVF9OQU1FKSk7Ci0JCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCQkJSVByb2plY3QgZWFyUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChnZXRTdHJpbmdQcm9wZXJ0eShFQVJfUFJPSkVDVF9OQU1FKSk7Ci0JCQkJCWlmIChlYXJQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkRWFyUHJvamVjdDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZmFjZXRlZEVhclByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoZWFyUHJvamVjdCk7Ci0JCQkJCQkJaWYgKGZhY2V0ZWRFYXJQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCQkJc2V0UHJvcGVydHkoRkFDRVRfUlVOVElNRSwgZmFjZXRlZEVhclByb2plY3QuZ2V0UHJpbWFyeVJ1bnRpbWUoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoQUREX1RPX0VBUi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRkFDRVRfUlVOVElNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBtb2R1bGVGYWNldCA9IGZpbmRNb2R1bGVGYWNldCgpOwotCQkJCWlmIChpc0FkZFRvRWFyKCkpIHsKLQkJCQkJaWYgKG1vZHVsZUZhY2V0ID09IG51bGwpIHsKLQkJCQkJCWdldEZhY2V0ZWRQcm9qZWN0KCkuYWRkUHJvamVjdEZhY2V0KElKMkVFRmFjZXRDb25zdGFudHMuVVRJTElUWV9GQUNFVF8xMCk7Ci0JCQkJCQlzZXRCb29sZWFuUHJvcGVydHkoQURERURfVVRJTElUWV9GQUNFVCwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChtb2R1bGVGYWNldCAhPSBudWxsICYmIGlzQWRkZWRVdGlsaXR5RmFjZXQoKSkgewotCQkJCQkJaWYgKG1vZHVsZUZhY2V0LmVxdWFscyhJSjJFRUZhY2V0Q29uc3RhbnRzLlVUSUxJVFlfRkFDRVRfMTApKSB7Ci0JCQkJCQkJZ2V0RmFjZXRlZFByb2plY3QoKS5yZW1vdmVQcm9qZWN0RmFjZXQoSUoyRUVGYWNldENvbnN0YW50cy5VVElMSVRZX0ZBQ0VUXzEwKTsKLQkJCQkJCX0KLQkJCQkJCXNldEJvb2xlYW5Qcm9wZXJ0eShBRERFRF9VVElMSVRZX0ZBQ0VULCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShFQVJfUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRUFSX1BST0pFQ1RfTkFNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEVBUl9QUk9KRUNUX05BTUUsIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJCX0KLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRkFDRVRfUlVOVElNRSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCQkKLQkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCQotCQlpZiAoISBzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCQotCQlpZiAoQUREX1RPX0VBUi5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBFQVJfUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IEZBQ0VUX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShBRERfVE9fRUFSKSkgewotCQkJCXN0YXR1cyA9IHZhbGlkYXRlRUFSKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUpKTsKLQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCQlpZiAoZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKS5lcXVhbHMoZ2V0U3RyaW5nUHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSkpKSB7Ci0JCQkJCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLlNBTUVfTU9EVUxFX0FORF9FQVJfTkFNRSwgbmV3IE9iamVjdFtde2dldFN0cmluZ1Byb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUpfSk7Ci0JCQkJCQlzdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoZXJyb3JNZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUVBUihTdHJpbmcgZWFyTmFtZSkgewotCQlpZiAoZWFyTmFtZS5pbmRleE9mKCIjIikgIT0gLTEgfHwgZWFyTmFtZS5pbmRleE9mKCIvIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLkVSUl9JTlZBTElEX0NIQVJTKTsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoZXJyb3JNZXNzYWdlKTsKLQkJfSAKLQkJZWxzZSBpZiAoZWFyTmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuRVJSX0VNUFRZX01PRFVMRV9OQU1FKTsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoZXJyb3JNZXNzYWdlKTsKLQkJfQotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlck5ldy52YWxpZGF0ZVByb2plY3ROYW1lKGVhck5hbWUpOwotCQkvL2NoZWNrIGZvciB0aGUgZGVsZXRlZCBjYXNlLCB0aGUgcHJvamVjdCBpcyBkZWxldGVkIGZyb20gdGhlIHdvcmtzcGFjZSBidXQgc3RpbGwgZXhpc3RzIGluIHRoZQotCQkvL2ZpbGUgc3lzdGVtLgotCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJSVByb2plY3QgZWFyUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChnZXRTdHJpbmdQcm9wZXJ0eShFQVJfUFJPSkVDVF9OQU1FKSk7Ci0JCQlpZiAoISBlYXJQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJSVBhdGggcGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJCQlwYXRoID0gcGF0aC5hcHBlbmQoZWFyTmFtZSk7Ci0JCQkJc3RhdHVzID0gUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXJOZXcudmFsaWRhdGVFeGlzdGluZyhlYXJOYW1lLCBwYXRoLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1vZHVsZUZhY2V0RGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIG5ld01vZHVsZUZhY2V0RGF0YU1vZGVsID0gZmluZE1vZHVsZUZhY2V0RGF0YU1vZGVsKCk7Ci0JCUlEYXRhTW9kZWwgb2xkTW9kdWxlRmFjZXREYXRhTW9kZWwgPSBnZXRNb2R1bGVGYWNldERhdGFNb2RlbCgpOwotCQkKLQkJaWYgKG9sZE1vZHVsZUZhY2V0RGF0YU1vZGVsICE9IG5ld01vZHVsZUZhY2V0RGF0YU1vZGVsKSB7Ci0JCQlpZiAob2xkTW9kdWxlRmFjZXREYXRhTW9kZWwgIT0gbnVsbCkgewotCQkJCW9sZE1vZHVsZUZhY2V0RGF0YU1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMubW9kdWxlRmFjZXREYXRhTW9kZWxMaXN0ZW5lcik7Ci0JCQl9Ci0JCQlpZiAobmV3TW9kdWxlRmFjZXREYXRhTW9kZWwgIT0gbnVsbCkgewotCQkJCW5ld01vZHVsZUZhY2V0RGF0YU1vZGVsLnNldFByb3BlcnR5KAotCQkJCQkJSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsCi0JCQkJCQlnZXRQcm9wZXJ0eShBRERfVE9fRUFSKSk7Ci0JCQkJbmV3TW9kdWxlRmFjZXREYXRhTW9kZWwuc2V0UHJvcGVydHkoCi0JCQkJCQlJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSwKLQkJCQkJCWdldFByb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUpKTsKLQkJCQluZXdNb2R1bGVGYWNldERhdGFNb2RlbC5hZGRMaXN0ZW5lcih0aGlzLm1vZHVsZUZhY2V0RGF0YU1vZGVsTGlzdGVuZXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5tb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoQUREX1RPX0VBUiwgZmFsc2UpOwotCQkJCXRoaXMubW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEFEREVEX1VUSUxJVFlfRkFDRVQsIGZhbHNlKTsKLQkJCX0KLQkJCXNldFByb3BlcnR5KE1PRFVMRV9GQUNFVF9EQVRBX01PREVMLCBuZXdNb2R1bGVGYWNldERhdGFNb2RlbCk7Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEFERF9UT19FQVIsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShFQVJfUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRUFSX1BST0pFQ1RfTkFNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJfQkKLQl9Ci0JCi0JcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGdldEZhY2V0ZWRQcm9qZWN0KCkgewotCQlyZXR1cm4gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSB0aGlzLm1vZGVsLmdldFByb3BlcnR5KEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBnZXRNb2R1bGVGYWNldERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIChJRGF0YU1vZGVsKSBnZXRQcm9wZXJ0eShNT0RVTEVfRkFDRVRfREFUQV9NT0RFTCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzQWRkZWRVdGlsaXR5RmFjZXQoKSB7Ci0JCXJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoQURERURfVVRJTElUWV9GQUNFVCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzQWRkVG9FYXIoKSB7Ci0JCXJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoQUREX1RPX0VBUik7Ci0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGZpbmRNb2R1bGVGYWNldERhdGFNb2RlbCgpIHsKLQkJRmFjZXRBY3Rpb25NYXAgbWFwID0gKEZhY2V0QWN0aW9uTWFwKSBnZXRQcm9wZXJ0eShGQUNFVF9BQ1RJT05fTUFQKTsKLQkJSVByb2plY3RGYWNldFZlcnNpb24gbW9kdWxlRmFjZXQgPSBmaW5kTW9kdWxlRmFjZXQoKTsKLQkJaWYgKG1vZHVsZUZhY2V0ICE9IG51bGwpIHsKLQkJCUlGYWNldGVkUHJvamVjdC5BY3Rpb24gYWN0aW9uID0gbWFwLmdldEFjdGlvbihtb2R1bGVGYWNldC5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpKTsKLQkJCXJldHVybiAoYWN0aW9uID09IG51bGwpID8gbnVsbCA6IChJRGF0YU1vZGVsKSBhY3Rpb24uZ2V0Q29uZmlnKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmaW5kTW9kdWxlRmFjZXQoKSB7Ci0JCXJldHVybiBGYWNldFRvb2xzLmdldE1vZHVsZUZhY2V0KGdldEZhY2V0ZWRQcm9qZWN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL0RlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YzE5NDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5CYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklEZXNjcmlwdGlvblByb3ZpZGVyOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcn0gYW5kIHtAbGluayBJTGFiZWxQcm92aWRlcn0gdGhhdCAKLSAqIG1haW50YWlucyBhIGNvbGxlY3Rpb24gKE1hcCwgYWN0dWFsbHkpIG9mIHtAbGluayBJdGVtQ29udGVudFByb3ZpZGVyfSAKLSAqIGRlbGVnYXRlcyB0aGF0IHBlcmZvcm0gdGhlIGZ1bmN0aW9uIG9mIHByb3ZpZGluZyBjb250ZW50IGFuZCBsYWJlbCBpbmZvcm1hdGlvbgotICogZm9yIGVhY2ggcmVwcmVzZW50ZWQgaXRlbQotICogCi0gKiBOQjogVGhpcyBjbGFzcywgaWYgdXNlZCBhcyBhIGxhYmVsIHByb3ZpZGVyICpNVVNUKiBiZSB1c2VkIGFzIGEgY29udGVudCBwcm92aWRlcgotICogZm9yIHRoZSBzYW1lIHZpZXdlci4gIEl0IG1heSBiZSB1c2VkIGFzIGEgY29udGVudCBwcm92aWRlciB3aXRoIGEgZGlmZmVyZW50Ci0gKiBsYWJlbCBwcm92aWRlciwgaG93ZXZlci4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciAKLQlleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyCi0JaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwgSUxhYmVsUHJvdmlkZXIsIElEZXNjcmlwdGlvblByb3ZpZGVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBpdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLQkKLQlwcml2YXRlIGZpbmFsIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBpdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBNYXA8T2JqZWN0LCBJdGVtQ29udGVudFByb3ZpZGVyPiBpdGVtQ29udGVudFByb3ZpZGVyczsKLQkKLQlwcml2YXRlIGZpbmFsIE1hcDxPYmplY3QsIEl0ZW1MYWJlbFByb3ZpZGVyPiBpdGVtTGFiZWxQcm92aWRlcnM7Ci0JCi0JU3RydWN0dXJlZFZpZXdlciB2aWV3ZXI7Ci0JCi0JCi0JcHJvdGVjdGVkIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcigKLQkJCUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KSB7Ci0JCXRoaXMoaXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnksIG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKAotCQkJSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgaXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnksCi0JCQlJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgaXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgPSBpdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLQkJdGhpcy5pdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgPSBpdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci0JCXRoaXMuaXRlbUNvbnRlbnRQcm92aWRlcnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIEl0ZW1Db250ZW50UHJvdmlkZXI+KCk7Ci0JCXRoaXMuaXRlbUxhYmVsUHJvdmlkZXJzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBJdGVtTGFiZWxQcm92aWRlcj4oKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIEl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbUNvbnRlbnRQcm92aWRlcihPYmplY3QgaXRlbSkgewotCQlJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Db250ZW50UHJvdmlkZXIgPSBpdGVtQ29udGVudFByb3ZpZGVycy5nZXQoaXRlbSk7Ci0JCWlmIChpdGVtQ29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBpdGVtQ29udGVudFByb3ZpZGVyOwotCQl9Ci0JCWl0ZW1Db250ZW50UHJvdmlkZXIgPSBpdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5idWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoaXRlbSwgdGhpcyk7Ci0JCWlmIChpdGVtQ29udGVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWl0ZW1Db250ZW50UHJvdmlkZXJzLnB1dChpdGVtLCBpdGVtQ29udGVudFByb3ZpZGVyKTsKLQkJcmV0dXJuIGl0ZW1Db250ZW50UHJvdmlkZXI7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVtTGFiZWxQcm92aWRlciBpdGVtTGFiZWxQcm92aWRlcihPYmplY3QgaXRlbSkgewotCQlpZiAodmlld2VyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0JCQkJCSJUaGlzIHByb3ZpZGVyIG11c3QgYmUgdXNlZCBhcyBhIGNvbnRlbnQiICsKLQkJCQkJInByb3ZpZGVyICphcyB3ZWxsIGFzKiBhIGxhYmVsIHByb3ZpZGVyLiIpOwotCQl9Ci0JCUl0ZW1MYWJlbFByb3ZpZGVyIGl0ZW1MYWJlbFByb3ZpZGVyID0gaXRlbUxhYmVsUHJvdmlkZXJzLmdldChpdGVtKTsKLQkJaWYgKGl0ZW1MYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBpdGVtTGFiZWxQcm92aWRlcjsKLQkJfQotCQlpdGVtTGFiZWxQcm92aWRlciA9IGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5idWlsZEl0ZW1MYWJlbFByb3ZpZGVyKGl0ZW0sIHRoaXMpOwotCQlpZiAoaXRlbUxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaXRlbUxhYmVsUHJvdmlkZXJzLnB1dChpdGVtLCBpdGVtTGFiZWxQcm92aWRlcik7Ci0JCXJldHVybiBpdGVtTGFiZWxQcm92aWRlcjsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIGl0ZW1Db250ZW50UHJvdmlkZXIoaW5wdXRFbGVtZW50KS5nZXRFbGVtZW50cygpOwotCX0KLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSXRlbUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSBpdGVtTGFiZWxQcm92aWRlcihlbGVtZW50KTsKLQkJcmV0dXJuIChwcm92aWRlciA9PSBudWxsKSA/IG51bGwgOnByb3ZpZGVyLmdldEltYWdlKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlJdGVtTGFiZWxQcm92aWRlciBwcm92aWRlciA9IGl0ZW1MYWJlbFByb3ZpZGVyKGVsZW1lbnQpOwotCQlyZXR1cm4gKHByb3ZpZGVyID09IG51bGwpID8gbnVsbCA6IHByb3ZpZGVyLmdldFRleHQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihPYmplY3QgZWxlbWVudCkgewotCQlJdGVtTGFiZWxQcm92aWRlciBwcm92aWRlciA9IGl0ZW1MYWJlbFByb3ZpZGVyKGVsZW1lbnQpOwotCQlyZXR1cm4gKHByb3ZpZGVyID09IG51bGwpID8gbnVsbCA6IHByb3ZpZGVyLmdldERlc2NyaXB0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCBpdGVtcwotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpc3Bvc2VQcm92aWRlcnMoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VQcm92aWRlcnMoKSB7Ci0JCS8vIGNvZGVkIHRoaXMgd2F5IHRvIGFsbG93IHNvbWUgaXRlbSBwcm92aWRlcnMgdG8gZGlzcG9zZSBvZiB0aGVpciBjaGlsZCAKLQkJLy8gZWxlbWVudHMgd2l0aG91dCBkaXNydXB0aW5nIHRoZSBlbnRpcmUgcHJvY2VzcwotCQl3aGlsZSAoISBpdGVtQ29udGVudFByb3ZpZGVycy5pc0VtcHR5KCkpIHsKLQkJCWRpc3Bvc2UoaXRlbUNvbnRlbnRQcm92aWRlcnMua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JCS8vIHRoaXMgY2F0Y2hlcyBhbnkgaXRlbXMgdGhhdCB3ZXJlbid0IGRpc3Bvc2VkIGZyb20gdGhlIGNvbnRlbnQgcHJvdmlkZXJzLAotCQkvLyB0aG91Z2ggdGhlcmUgbW9zdCBsaWtlbHkgd29uJ3QgYmUgYW55IGl0ZW1zIHJlcHJlc2VudGVkIGhlcmUgdGhhdCAKLQkJLy8gaGF2ZW4ndCBhbHJlYWR5IGJlZW4gZGlzcG9zZWQKLQkJd2hpbGUgKCEgaXRlbUxhYmVsUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJZGlzcG9zZShpdGVtTGFiZWxQcm92aWRlcnMua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKE9iamVjdCBpdGVtKSB7Ci0JCWlmIChpdGVtQ29udGVudFByb3ZpZGVycy5jb250YWluc0tleShpdGVtKSkgewotCQkJaXRlbUNvbnRlbnRQcm92aWRlcnMuZ2V0KGl0ZW0pLmRpc3Bvc2UoKTsKLQkJCWl0ZW1Db250ZW50UHJvdmlkZXJzLnJlbW92ZShpdGVtKTsKLQkJfQotCQlpZiAoaXRlbUxhYmVsUHJvdmlkZXJzLmNvbnRhaW5zS2V5KGl0ZW0pKSB7Ci0JCQlpdGVtTGFiZWxQcm92aWRlcnMuZ2V0KGl0ZW0pLmRpc3Bvc2UoKTsKLQkJCWl0ZW1MYWJlbFByb3ZpZGVycy5yZW1vdmUoaXRlbSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBzdHJ1Y3R1cmVkVmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAob2xkSW5wdXQgIT0gbmV3SW5wdXQpIHsKLQkJCWRpc3Bvc2VQcm92aWRlcnMoKTsKLQkJfQotCQl0aGlzLnZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBzdHJ1Y3R1cmVkVmlld2VyOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdGhlIGNvbnRlbnQgZm9yIHRoZSBnaXZlbiBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQ29udGVudChmaW5hbCBPYmplY3QgaXRlbSkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsICYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQl2aWV3ZXIucmVmcmVzaChpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWlmICghdmlld2VySXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCX0KLQl9Ci0JCi0JLy8gb3BlbiB1cCB2aXNpYmlsaXR5IGEgYml0IGZvciBpbm5lciBjbGFzc2VzCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSBsYWJlbCBmb3IgdGhlIGdpdmVuIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVMYWJlbChmaW5hbCBPYmplY3QgaXRlbSkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsICYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQlmaXJlTGFiZWxQcm92aWRlckNoYW5nZWQobmV3IExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQoRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLnRoaXMsIGl0ZW0pKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWlmICghdmlld2VySXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmlld2VySXNEaXNwb3NlZCgpIHsKLQkJcmV0dXJuIHRoaXMudmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9JdGVtQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9JdGVtQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMmY3MTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZTsKLQotLyoqCi0gKiBNYXJrZXIgaW50ZXJmYWNlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBEZWxlZ2F0aW5nQ29udGVudFByb3ZpZGVyIHRvIHJldHVybiAKLSAqIGNvbnRlbnQgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBpdGVtLgotICogQHNlZSBEZWxlZ2F0aW5nQ29udGVudFByb3ZpZGVyCi0gKiBAc2VlIEl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZW1Db250ZW50UHJvdmlkZXIKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSByZXByZXNlbnRlZCBpdGVtLgotCSAqIE5vdGUgdGhhdCB3aGVuIHRoaXMgaXMgY2FsbGVkLCB0aGUgcmVwcmVzZW50ZWQgaXRlbSBpcyBhbiBpbnB1dCBlbGVtZW50LgotCSAqLwotCU9iamVjdFtdIGdldEVsZW1lbnRzKCk7Ci0JCi0JLyoqCi0JICogRGlzcG9zZSBvZiB0aGlzIGNvbnRlbnQgcHJvdmlkZXIsIGNsZWFuaW5nIHVwIGFsbCByZWZlcmVuY2VzLCBsaXN0ZW5lcnMsIGV0Yy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL0l0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9JdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJkZDA5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL0l0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlOwotCi0vKioKLSAqIEZhY3RvcnkgaW50ZXJmYWNlIHVzZWQgdG8gZGVzY3JpYmUgaG93IHRvIGJ1aWxkIHtAbGluayBJdGVtQ29udGVudFByb3ZpZGVyfXMKLSAqIGZvciBhIHtAbGluayBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXJ9Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci17Ci0JSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoT2JqZWN0IGl0ZW0sIAotCQkJRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9JdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWFjYTAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXIgdG8gcmV0dXJuIAotICogbGFiZWwgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBpdGVtLgotICogQHNlZSBEZWxlZ2F0aW5nTGFiZWxQcm92aWRlcgotICogQHNlZSBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlbUxhYmVsUHJvdmlkZXIKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIGZvciB0aGUgaXRlbQotCSAqLwotCUltYWdlIGdldEltYWdlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IGZvciB0aGUgaXRlbQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBpdGVtCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCQotCS8qKgotCSAqIERpc3Bvc2Ugb2YgdGhpcyBsYWJlbCBwcm92aWRlciwgY2xlYW5pbmcgdXAgYWxsIHJlZmVyZW5jZXMsIGxpc3RlbmVycywgZXRjLgotCSAqLwotCXZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg0MmEyMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2U7Ci0KLS8qKgotICogRmFjdG9yeSBpbnRlcmZhY2UgdXNlZCB0byBkZXNjcmliZSBob3cgdG8gYnVpbGQgSUl0ZW1MYWJlbFByb3ZpZGVycwotICogZm9yIGEgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotewotCUl0ZW1MYWJlbFByb3ZpZGVyIGJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoT2JqZWN0IGl0ZW0sIAotCQkJRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL1RyZWVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9UcmVlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTE4NTA1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL1RyZWVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXIgdG8gcmV0dXJuIAotICogdHJlZSBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGl0ZW0uCi0gKiBAc2VlIERlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyCi0gKiBAc2VlIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEl0ZW1Db250ZW50UHJvdmlkZXIKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhcmVudCBvZiB0aGUgcmVwcmVzZW50ZWQgaXRlbQotCSAqLwotCU9iamVjdCBnZXRQYXJlbnQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcmVwcmVzZW50ZWQgaXRlbSBoYXMgY2hpbGRyZW4KLQkgKi8KLQlib29sZWFuIGhhc0NoaWxkcmVuKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGlsZHJlbiBvZiB0aGUgcmVwcmVzZW50ZWQgaXRlbQotCSAqLwotCU9iamVjdFtdIGdldENoaWxkcmVuKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL1RyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2M1ZWI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL1RyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZTsKLQotLyoqCi0gKiBFeHRlbnNpb24gb2Yge0BsaW5rIEl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5fSB0aGF0IGV4dGVuZHMgZnVuY3Rpb25hbGl0eQotICogZm9yIHRyZWUgY29udGVudAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZXh0ZW5kcyBJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotewotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoT2JqZWN0IGl0ZW0sIAotCQkJRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pwYTIvZGV0YWlscy9qYXZhL0phdmFVaUZhY3RvcnkyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pwYTIvZGV0YWlscy9qYXZhL0phdmFVaUZhY3RvcnkyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE3MjEwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qcGEyL2RldGFpbHMvamF2YS9KYXZhVWlGYWN0b3J5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmpwYTIuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVXNlIHtAbGluayBKYXZhVWlGYWN0b3J5Ml8wfSB0byBjcmVhdGUgYW55IGphdmEgSlBBIGNvbXBvc2l0ZXMKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LgotICogSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcKLSAqIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0Ci0gKiBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFVaUZhY3RvcnkyXzAKLQlleHRlbmRzIEphdmFVaUZhY3RvcnkKLXsJCi0KLQlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qcGEyL2RldGFpbHMvb3JtL09ybVhtbFVpRmFjdG9yeTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvanBhMi9kZXRhaWxzL29ybS9Pcm1YbWxVaUZhY3RvcnkyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlOTIyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qcGEyL2RldGFpbHMvb3JtL09ybVhtbFVpRmFjdG9yeTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5qcGEyLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBVc2Uge0BsaW5rIE9ybVhtbFVpRmFjdG9yeTJfMH0gdG8gY3JlYXRlIGFueSBPUk0gSlBBIGNvbXBvc2l0ZXMKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LgotICogSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcKLSAqIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0Ci0gKiBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuQmFzZUpwYVVpRmFjdG9yeQotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVhtbFVpRmFjdG9yeTJfMCBleHRlbmRzIE9ybVhtbFVpRmFjdG9yeQotewotCQotCUpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTkzZTk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSB0aGUgUHJvamVjdCBOYXZpZ2F0b3IgdmlldyBjb250ZW50cyBhbmQgCi0gKiBsYWJlbHMgZm9yIGEgZ2l2ZW4gSlBBIHByb2plY3QuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYU5hdmlnYXRvclByb3ZpZGVyCi17Ci0JLyoqCi0JICogQnVpbGQgYW4gZmFjdG9yeSB0byBjcmVhdGUge0BsaW5rIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyfXMKLQkgKi8KLQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7Ci0JCi0JLyoqCi0JICogQnVpbGQgYSBmYWN0b3J5IHRvIGNyZWF0ZSB7QGxpbmsgSXRlbUxhYmVsUHJvdmlkZXJ9cwotCSAqLwotCUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBnZXRJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKTsKLQkKLQl2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3N0cnVjdHVyZS9KcGFTdHJ1Y3R1cmVQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvc3RydWN0dXJlL0pwYVN0cnVjdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGIyNTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvc3RydWN0dXJlL0pwYVN0cnVjdHVyZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnN0cnVjdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcgY29udGVudHMgYW5kIAotICogbGFiZWxzIGZvciBhIGdpdmVuIEpQQSByZXNvdXJjZS4KLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjAKLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFTdHJ1Y3R1cmVQcm92aWRlciAKLXsKLQkvKioKLQkgKiBCdWlsZCBhbiBmYWN0b3J5IHRvIGNyZWF0ZSB7QGxpbmsgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJ9cwotCSAqLwotCVRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBnZXRUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKTsKLQkKLQkvKioKLQkgKiBCdWlsZCBhIGZhY3RvcnkgdG8gY3JlYXRlIHtAbGluayBJdGVtTGFiZWxQcm92aWRlcn1zCi0JICovCi0JSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3RlbXBsYXRlcy9hbm5vdGF0ZWRfZW50aXR5LmphdmFqZXQgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2Fubm90YXRlZF9lbnRpdHkuamF2YWpldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjN2QxZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2Fubm90YXRlZF9lbnRpdHkuamF2YWpldAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTwlQCBqZXQgcGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5IiAKLQlpbXBvcnRzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC4qIGphdmEudXRpbC4qICIgCi0JY2xhc3M9IkFubm90YXRlZEVudGl0eVRlbXBsYXRlIiAKLSU+Ci08JSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsID0gKENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwpIGFyZ3VtZW50OyAKLWlmIChtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9bnVsbCAmJiBtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9IiIpIHsgJT5wYWNrYWdlIDwlPW1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpJT47PCV9JT4KLQotPCUgQ29sbGVjdGlvbjxTdHJpbmc+IGltcG9ydHMgPSBtb2RlbC5nZXRJbXBvcnRzKGZhbHNlKTsKLWZvciAoU3RyaW5nIGFuSW1wb3J0IDogaW1wb3J0cykgeyAlPgotaW1wb3J0IDwlPWFuSW1wb3J0JT47Ci08JSB9ICU+Ci0KLS8qKgotICogRW50aXR5IGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBFbnRpdHk6IDwlPW1vZGVsLmdldEVudGl0eU5hbWUoKSU+Ci0gKgotICovCi08JT1tb2RlbC5nZXRBcnRpZmFjdFR5cGUoKSU+PCVTdHJpbmcgRU5USVRZX05BTUUgPSBtb2RlbC5nZXRFbnRpdHlOYW1lKCk7Ci1pZiAobW9kZWwuaXNFbnRpdHlOYW1lU2V0KCkpIHslPihuYW1lPSI8JT1FTlRJVFlfTkFNRSU+Iik8JX0lPgotPCVpZiAobW9kZWwuaXNUYWJsZU5hbWVTZXQoKSkgeyU+Ci1AVGFibGUobmFtZT0iPCU9bW9kZWwuZ2V0VGFibGVOYW1lKCklPiIpPCV9JT4KLTwlPW1vZGVsLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSU+Ci08JWlmIChtb2RlbC5pc0NvbXBvc2l0ZVBLKCkpIHslPgotQElkQ2xhc3MoPCU9bW9kZWwuZ2V0SWRDbGFzc05hbWUoKSU+LmNsYXNzKTwlfSU+Ci1wdWJsaWMgY2xhc3MgPCU9bW9kZWwuZ2V0Q2xhc3NOYW1lKCklPjwlU3RyaW5nIHN1cGVyQ2xhc3MgPSBtb2RlbC5nZXRTdXBlcmNsYXNzTmFtZSgpOwotCWlmICghICIiLmVxdWFscyhzdXBlckNsYXNzKSkgeyU+IGV4dGVuZHMgPCU9c3VwZXJDbGFzcyU+PCV9JT48JQotCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gbW9kZWwuZ2V0SW50ZXJmYWNlcygpOyAKLQlpZiAoaW50ZXJmYWNlcy5zaXplKCk+MCkgeyU+IGltcGxlbWVudHMgPCUgfQotCWZvciAoaW50IGk9MDsgaTxpbnRlcmZhY2VzLnNpemUoKTsgaSsrKSB7Ci0gCQlTdHJpbmcgSU5URVJGQUNFID0gKFN0cmluZykgaW50ZXJmYWNlcy5nZXQoaSk7Ci0JCWlmIChpPjApIHsgJT4sIDwlfSU+PCU9SU5URVJGQUNFJT48JX0lPiB7Ci0KLQk8JSBMaXN0PEVudGl0eVJvdz4gZmllbGRzID0gbW9kZWwuZ2V0RW50aXR5RmllbGRzKCk7Ci0JTGlzdDxTdHJpbmc+IHBrRmllbGRzID0gbW9kZWwuZ2V0UEtGaWVsZHMoKTsgCi0gCWZvciAoRW50aXR5Um93IGVudGl0eSA6IGZpZWxkcykgewotCQlTdHJpbmcgTkFNRSA9IGVudGl0eS5nZXROYW1lKCk7Ci0JCWlmIChwa0ZpZWxkcy5jb250YWlucyhOQU1FKSAmJiBtb2RlbC5pc0ZpZWxkQWNjZXNzKCkpIHsKLSAgICAlPiAgIAotCUBJZDwlfSU+Ci0JcHJpdmF0ZSA8JT1lbnRpdHkuZ2V0VHlwZSgpJT4gPCU9ZW50aXR5LmdldE5hbWUoKSU+OzwlfSU+Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwdWJsaWMgPCU9bW9kZWwuZ2V0Q2xhc3NOYW1lKCklPigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0gICA8JQotCWZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOwotCWlmIChmaWVsZHMgIT0gbnVsbCkgZm9yIChpbnQgaT0wOyBpPGZpZWxkcy5zaXplKCk7IGkrKykgewotCQlFbnRpdHlSb3cgZmllbGQgPSAoRW50aXR5Um93KSBmaWVsZHMuZ2V0KGkpOwotCQlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsKLQkJU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCVN0cmluZyBNRVRIT0QgPSBOQU1FLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBOQU1FLnN1YnN0cmluZygxKTsKLQlpZiAocGtGaWVsZHMuY29udGFpbnMoTkFNRSkgJiYgIW1vZGVsLmlzRmllbGRBY2Nlc3MoKSkgewotICAgICU+ICAgCi0JQElkIDwlfSU+ICAgCi0JcHVibGljIDwlPVRZUEUlPiBnZXQ8JT1NRVRIT0QlPigpIHsKLQkJcmV0dXJuIHRoaXMuPCU9TkFNRSU+OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldDwlPU1FVEhPRCU+KDwlPVRZUEUlPiA8JT1OQU1FJT4pIHsKLQkJdGhpcy48JT1OQU1FJT4gPSA8JT1OQU1FJT47Ci0JfQotICAgPCV9JT4KLSAgIAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3RlbXBsYXRlcy9lbnRpdHkuamF2YWpldCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS90ZW1wbGF0ZXMvZW50aXR5LmphdmFqZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODIzMWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3RlbXBsYXRlcy9lbnRpdHkuamF2YWpldAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwlQCBqZXQgcGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5IiAKLQlpbXBvcnRzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC4qIGphdmEudXRpbC4qICIgCi0JY2xhc3M9IkVudGl0eVRlbXBsYXRlIiAKLSU+Ci08JSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsID0gKENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwpIGFyZ3VtZW50OyAKLWlmIChtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9bnVsbCAmJiBtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9IiIpIHsgJT5wYWNrYWdlIDwlPW1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpJT47PCV9JT4KLQotPCUgQ29sbGVjdGlvbjxTdHJpbmc+IGltcG9ydHMgPSBtb2RlbC5nZXRJbXBvcnRzKGZhbHNlKTsKLWZvciAoU3RyaW5nIGFuSW1wb3J0IDogaW1wb3J0cykgeyAlPgotaW1wb3J0IDwlPWFuSW1wb3J0JT47Ci08JSB9ICU+Ci0KLS8qKgotICogRW50aXR5IGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBFbnRpdHk6IDwlPW1vZGVsLmdldEVudGl0eU5hbWUoKSU+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgPCU9bW9kZWwuZ2V0Q2xhc3NOYW1lKCklPjwlU3RyaW5nIHN1cGVyQ2xhc3MgPSBtb2RlbC5nZXRTdXBlcmNsYXNzTmFtZSgpOwotCWlmICghICIiLmVxdWFscyhzdXBlckNsYXNzKSkgeyU+IGV4dGVuZHMgPCU9c3VwZXJDbGFzcyU+PCV9JT48JQotCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gbW9kZWwuZ2V0SW50ZXJmYWNlcygpOyAKLQlpZiAoaW50ZXJmYWNlcy5zaXplKCk+MCkgeyU+IGltcGxlbWVudHMgPCUgfQotCWZvciAoaW50IGk9MDsgaTxpbnRlcmZhY2VzLnNpemUoKTsgaSsrKSB7Ci0JCVN0cmluZyBJTlRFUkZBQ0UgPSAoU3RyaW5nKSBpbnRlcmZhY2VzLmdldChpKTsKLQkJaWYgKGk+MCkgeyAlPiwgPCV9JT48JT1JTlRFUkZBQ0UlPjwlfSU+IHsKLQotCTwlIExpc3Q8RW50aXR5Um93PiBmaWVsZHMgPSBtb2RlbC5nZXRFbnRpdHlGaWVsZHMoKTsgCi0JZm9yIChFbnRpdHlSb3cgZW50aXR5IDogZmllbGRzKSB7ICAgICAKLQklPiAKLQlwcml2YXRlIDwlPWVudGl0eS5nZXRUeXBlKCklPiA8JT1lbnRpdHkuZ2V0TmFtZSgpJT47PCV9JT4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsJCi0JcHVibGljIDwlPW1vZGVsLmdldENsYXNzTmFtZSgpJT4oKSB7Ci0JCXN1cGVyKCk7Ci0JfSAKLQk8JQotCWZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOwotCWlmIChmaWVsZHMgIT0gbnVsbCkgZm9yIChpbnQgaT0wOyBpPGZpZWxkcy5zaXplKCk7IGkrKykgewotCQlFbnRpdHlSb3cgZmllbGQgPSAoRW50aXR5Um93KSBmaWVsZHMuZ2V0KGkpOwotCQlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsKLQkJU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCVN0cmluZyBNRVRIT0QgPSBOQU1FLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBOQU1FLnN1YnN0cmluZygxKTsKLQklPiAgIAotCXB1YmxpYyA8JT1UWVBFJT4gZ2V0PCU9TUVUSE9EJT4oKSB7Ci0gCQlyZXR1cm4gdGhpcy48JT1OQU1FJT47Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0PCU9TUVUSE9EJT4oPCU9VFlQRSU+IDwlPU5BTUUlPikgewotCQl0aGlzLjwlPU5BTUUlPiA9IDwlPU5BTUUlPjsKLQl9Ci0JPCV9JT4KLSAgIAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3RlbXBsYXRlcy9pZENsYXNzLmphdmFqZXQgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2lkQ2xhc3MuamF2YWpldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5NzM0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2lkQ2xhc3MuamF2YWpldAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi08JUAgamV0CXBhY2thZ2U9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eSIgCi0JaW1wb3J0cz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuKiBqYXZhLnV0aWwuKiAiIAotCWNsYXNzPSJJZENsYXNzVGVtcGxhdGUiIAotJT4KLTwlIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgbW9kZWwgPSAoQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCkgYXJndW1lbnQ7IAotaWYgKG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpIT1udWxsICYmIG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpIT0iIikgeyAlPnBhY2thZ2UgPCU9bW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCklPjs8JX0lPgotCi08JSBDb2xsZWN0aW9uPFN0cmluZz4gaW1wb3J0cyA9IG1vZGVsLmdldEltcG9ydHModHJ1ZSk7Ci1mb3IgKFN0cmluZyBhbkltcG9ydCA6IGltcG9ydHMpIHsgJT4KLWltcG9ydCA8JT1hbkltcG9ydCU+OwotPCUgfSAlPgotCi0vKioKLSAqIElEIGNsYXNzIGZvciBlbnRpdHk6IDwlPW1vZGVsLmdldENsYXNzTmFtZSgpJT4KLSAqCi0gKi8gCi1wdWJsaWMgY2xhc3MgPCU9bW9kZWwuZ2V0SWRDbGFzc05hbWUoKSU+IAotPCUgTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBtb2RlbC5nZXRJbnRlcmZhY2VzKCk7IAotCWlmIChpbnRlcmZhY2VzLnNpemUoKT4wKSB7JT4gaW1wbGVtZW50cyA8JSB9Ci0JZm9yIChpbnQgaT0wOyBpPGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLQkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOwotCQlpZiAoaT4wKSB7ICU+LCA8JX0lPjwlPUlOVEVSRkFDRSU+PCV9JT4geyAgIAotICAgCi0JPCUgTGlzdDxFbnRpdHlSb3c+IGZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOwotCUxpc3Q8U3RyaW5nPiBwa0ZpZWxkcyA9IG1vZGVsLmdldFBLRmllbGRzKCk7IAotCWZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJRW50aXR5Um93IGVudGl0eSA9IChFbnRpdHlSb3cpIGZpZWxkcy5nZXQoaSk7Ci0JCWlmICghcGtGaWVsZHMuY29udGFpbnMoZW50aXR5LmdldE5hbWUoKSkpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JJT4gICAgICAgICAKLQlwcml2YXRlIDwlPWVudGl0eS5nZXRUeXBlKCklPiA8JT1lbnRpdHkuZ2V0TmFtZSgpJT47PCV9JT4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCXB1YmxpYyA8JT1tb2RlbC5nZXRJZENsYXNzTmFtZSgpJT4oKSB7fQotCi0JPCUKLQlmaWVsZHMgPSBtb2RlbC5nZXRFbnRpdHlGaWVsZHMoKTsKLQlpZiAoZmllbGRzICE9IG51bGwpIGZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJRW50aXR5Um93IGZpZWxkID0gKEVudGl0eVJvdykgZmllbGRzLmdldChpKTsKLQkJU3RyaW5nIFRZUEUgPSBmaWVsZC5nZXRUeXBlKCk7Ci0JCVN0cmluZyBOQU1FID0gZmllbGQuZ2V0TmFtZSgpOwotCQlpZiAoIXBrRmllbGRzLmNvbnRhaW5zKE5BTUUpKSB7Ci0JCQljb250aW51ZTsKLQkJfSAJCQotCQlTdHJpbmcgTUVUSE9EID0gTkFNRS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgTkFNRS5zdWJzdHJpbmcoMSk7ICAgICAgICAKLQklPgotCi0JcHVibGljIDwlPVRZUEUlPiBnZXQ8JT1NRVRIT0QlPigpIHsKLQkJcmV0dXJuIHRoaXMuPCU9TkFNRSU+OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldDwlPU1FVEhPRCU+KDwlPVRZUEUlPiA8JT1OQU1FJT4pIHsKLQkJdGhpcy48JT1OQU1FJT4gPSA8JT1OQU1FJT47Ci0JfQotCTwlfSU+Ci0gICAKLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCEobyBpbnN0YW5jZW9mIDwlPW1vZGVsLmdldElkQ2xhc3NOYW1lKCklPikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQk8JT1tb2RlbC5nZXRJZENsYXNzTmFtZSgpJT4gb3RoZXIgPSAoPCU9bW9kZWwuZ2V0SWRDbGFzc05hbWUoKSU+KSBvOwotCQlyZXR1cm4gdHJ1ZQotPCUgaWYgKGZpZWxkcyAhPSBudWxsKSBmb3IgKGludCBpPTA7IGk8ZmllbGRzLnNpemUoKTsgaSsrKSB7Ci0JRW50aXR5Um93IGZpZWxkID0gKEVudGl0eVJvdykgZmllbGRzLmdldChpKTsgCi0JU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JaWYgKCFwa0ZpZWxkcy5jb250YWlucyhOQU1FKSkgewotICAgICAgIAljb250aW51ZTsKLSAgICB9JT4KLTwlIAlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsgCi0JU3RyaW5nIEdFVF9NRVRIT0QgPSAiZ2V0IiArIE5BTUUuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIE5BTUUuc3Vic3RyaW5nKDEpOyAlPgotPCUJaWYgKFRZUEUuZXF1YWxzKCJib29sZWFuIikgfHwgVFlQRS5lcXVhbHMoImJ5dGUiKSB8fCBUWVBFLmVxdWFscygiY2hhciIpIHx8IFRZUEUuZXF1YWxzKCJzaG9ydCIpIHx8IFRZUEUuZXF1YWxzKCJpbnQiKSB8fCBUWVBFLmVxdWFscygibG9uZyIpKSB7ICU+Ci0JCQkmJiA8JT1HRVRfTUVUSE9EJT4oKSA9PSBvdGhlci48JT1HRVRfTUVUSE9EJT4oKQotPCUgCX0gZWxzZSBpZiAoVFlQRS5lcXVhbHMoImRvdWJsZSIpKSB7ICU+Ci0JCQkmJiAoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoPCU9R0VUX01FVEhPRCU+KCkpID09IERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKG90aGVyLjwlPUdFVF9NRVRIT0QlPigpKSkKLTwlIAl9IGVsc2UgaWYgKFRZUEUuZXF1YWxzKCJmbG9hdCIpKSB7ICU+Ci0JCQkmJiAoRmxvYXQuZmxvYXRUb0ludEJpdHMoPCU9R0VUX01FVEhPRCU+KCkpID09IEZsb2F0LmZsb2F0VG9JbnRCaXRzKG90aGVyLjwlPUdFVF9NRVRIT0QlPigpKSkKLTwlIAl9IGVsc2UgeyAlPgotCQkJJiYgKDwlPUdFVF9NRVRIT0QlPigpID09IG51bGwgPyBvdGhlci48JT1HRVRfTUVUSE9EJT4oKSA9PSBudWxsIDogPCU9R0VUX01FVEhPRCU+KCkuZXF1YWxzKG90aGVyLjwlPUdFVF9NRVRIT0QlPigpKSkKLTwlIAl9ICU+Ci08JSB9ICU+OwotCX0KLQkKLQkvKgkgCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8JCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJZmluYWwgaW50IHByaW1lID0gMzE7Ci0JCWludCByZXN1bHQgPSAxOwotPCUgaWYgKGZpZWxkcyAhPSBudWxsKSBmb3IgKGludCBpPTA7IGk8ZmllbGRzLnNpemUoKTsgaSsrKSB7IAotCUVudGl0eVJvdyBmaWVsZCA9IChFbnRpdHlSb3cpIGZpZWxkcy5nZXQoaSk7Ci0JU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JaWYgKCFwa0ZpZWxkcy5jb250YWlucyhOQU1FKSkgewotICAgICAgIAljb250aW51ZTsKLSAgICB9JT4KLTwlIAlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsgCi0JU3RyaW5nIEdFVF9NRVRIT0QgPSAiZ2V0IiArIE5BTUUuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIE5BTUUuc3Vic3RyaW5nKDEpOyAlPgotPCUJaWYgKFRZUEUuZXF1YWxzKCJib29sZWFuIikpIHsgJT4KLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoPCU9R0VUX01FVEhPRCU+KCkgPyAxIDogMCk7Ci08JSAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygiaW50IikpIHsgJT4KLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyA8JT1HRVRfTUVUSE9EJT4oKTsKLTwlIAl9IGVsc2UgaWYgKFRZUEUuZXF1YWxzKCJieXRlIikgfHwgVFlQRS5lcXVhbHMoImNoYXIiKSB8fCBUWVBFLmVxdWFscygic2hvcnQiKSkgeyAlPgotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoaW50KSA8JT1HRVRfTUVUSE9EJT4oKSk7Ci08JSAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygibG9uZyIpKSB7ICU+Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChpbnQpICg8JT1HRVRfTUVUSE9EJT4oKSBeICg8JT1HRVRfTUVUSE9EJT4oKSA+Pj4gMzIpKSk7Ci08JSAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygiZG91YmxlIikpIHsgJT4KLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGludCkgKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKDwlPUdFVF9NRVRIT0QlPigpICkgXiAoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoPCU9R0VUX01FVEhPRCU+KCkpID4+PiAzMikpKTsKLTwlIAl9IGVsc2UgaWYgKFRZUEUuZXF1YWxzKCJmbG9hdCIpKSB7ICU+Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgRmxvYXQuZmxvYXRUb0ludEJpdHMoPCU9R0VUX01FVEhPRCU+KCkpOwotPCUgCX0gZWxzZSB7ICU+Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKDwlPUdFVF9NRVRIT0QlPigpID09IG51bGwgPyAwIDogPCU9R0VUX01FVEhPRCU+KCkuaGFzaENvZGUoKSk7Ci08JSAJfSAlPgotPCUgfSAlPgotCQlyZXR1cm4gcmVzdWx0OwotCX0KLSAgIAotICAgCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTI4NjA1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotQGRvdAotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YjM4OWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudXRpbGl0eTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNWIyYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEphbiAxNSAxMToxMjoyMiBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MzgyNjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIE1heSAyNyAxNDo1NTozNyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjY0MWYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ci1CdW5kbGUtVmVyc2lvbjogMS42LjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLmVudW1lcmF0aW9uczsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVyczsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbCwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudCwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lciwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhYjhkNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZT0xLjUKLWphdmFjVGFyZ2V0PTEuNQotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2NvbXBvbmVudC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjRiNWM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotICBDb250cmlidXRvcnM6Ci0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSI+PGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LnV0aWxpdHkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTllZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIFV0aWxpdHkKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9Db21tYW5kLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDE5NDFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogU2ltcGxlIGludGVyZmFjZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBHT0YgQ29tbWFuZCBkZXNpZ24gcGF0dGVybiwKLSAqIGFuZCBpdCBkb2Vzbid0IGNhcnJ5IHRoZSBiYWdnYWdlIG9mIHtAbGluayBqYXZhLmxhbmcuUnVubmFibGV9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tYW5kIHsKLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGNvbW1hbmQKLQkgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4KLQkgKi8KLQl2b2lkIGV4ZWN1dGUoKTsKLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBpbnRlcmZhY2UgdGhhdCB3aWxsIGRvIG5vdGhpbmcKLQkgKiB3aGVuIGV4ZWN1dGVkLgotCSAqLwotCWZpbmFsIGNsYXNzIE51bGwgaW1wbGVtZW50cyBDb21tYW5kLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmQgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlwdWJsaWMgc3RhdGljIENvbW1hbmQgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkNvbW1hbmQuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21tYW5kIGludGVyZmFjZSB0aGF0IHdpbGwgdGhyb3cgYW4KLQkgKiBleGNlcHRpb24gd2hlbiBleGVjdXRlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZCBpbXBsZW1lbnRzIENvbW1hbmQsIFNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tbWFuZCBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlwdWJsaWMgc3RhdGljIENvbW1hbmQgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJDb21tYW5kLkRpc2FibGVkIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9Db21tYW5kRXhlY3V0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9Db21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0MjdjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGNsaWVudHMgdG8gY29udHJvbCBob3cgYSBjb21tYW5kIGlzIGV4ZWN1dGVkLgotICogVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgc2VydmVyIHByb3ZpZGVzIHRoZSBjb21tYW5kIGJ1dCB0aGUgY2xpZW50IHByb3ZpZGVzCi0gKiB0aGUgY29udGV4dCAoZS5nLiB0aGUgY2xpZW50IHdvdWxkIGxpa2UgdG8gZGlzcGF0Y2ggdGhlIGNvbW1hbmQgdG8gdGhlIFVJCi0gKiB0aHJlYWQpLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tYW5kRXhlY3V0b3IgewotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuCi0JICovCi0Jdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCk7Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBleGVjdXRvciBpbnRlcmZhY2UKLQkgKiB0aGF0IHNpbXBseSBleGVjdXRlcyB0aGUgY29tbWFuZCB3aXRob3V0IGFueSBzb3J0IG9mIGVuaGFuY2VtZW50LgotCSAqLwotCWZpbmFsIGNsYXNzIERlZmF1bHQgaW1wbGVtZW50cyBDb21tYW5kRXhlY3V0b3IsIFNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tbWFuZEV4ZWN1dG9yIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJcHVibGljIHN0YXRpYyBDb21tYW5kRXhlY3V0b3IgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERlZmF1bHQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L0ZpbHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGYzM2Y5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVXNlZCBieSB2YXJpb3VzICJwbHVnZ2FibGUiIGNsYXNzZXMgdG8gZmlsdGVyIG9iamVjdHMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIG9iamVjdHMgdG8gYmUgZmlsdGVyZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGaWx0ZXI8VD4gewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgImFjY2VwdGVkIiBieSB0aGUKLQkgKiBmaWx0ZXIuIFRoZSBzZW1hbnRpY3Mgb2YgImFjY2VwdCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JYm9vbGVhbiBhY2NlcHQoVCBvKTsKLQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWV0YXRpb24gb2YgdGhlIGZpbHRlciBpbnRlcmZhY2UgdGhhdCBhY2NlcHRzIGFsbCB0aGUKLQkgKiBvYmplY3RzIChpLmUuIGl0IGRvZXMgbm8gZmlsdGVyaW5nKS4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgRmlsdGVyPFM+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbHRlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBGaWx0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIG5vdGhpbmcgaXMgZmlsdGVyZWQgLSBldmVyeXRoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG8pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJGaWx0ZXIuTnVsbCI7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1ldGF0aW9uIG9mIHRoZSBmaWx0ZXIgaW50ZXJmYWNlIHRoYXQgYWNjZXB0cyBub25lIG9mIHRoZQotCSAqIG9iamVjdHMgKGkuZS4gaXQgZmlsdGVycyBvdXQgYWxsIHRoZSBvYmplY3RzKS4KLQkgKi8KLQlmaW5hbCBjbGFzcyBPcGFxdWU8Uz4gaW1wbGVtZW50cyBGaWx0ZXI8Uz4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsdGVyIElOU1RBTkNFID0gbmV3IE9wYXF1ZSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gRmlsdGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBPcGFxdWUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIGV2ZXJ5dGhpbmcgaXMgZmlsdGVyZWQgLSBub3RoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG8pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiRmlsdGVyLk9wYXF1ZSI7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1ldGF0aW9uIG9mIHRoZSBmaWx0ZXIgaW50ZXJmYWNlIHRoYXQgdGhyb3dzIGFuIGV4Y2VwdGlvbgotCSAqIGlmIGNhbGxlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIEZpbHRlcjxTPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBGaWx0ZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IEZpbHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUyBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiRmlsdGVyLkRpc2FibGVkIjsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvSW5kZW50aW5nUHJpbnRXcml0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9JbmRlbnRpbmdQcmludFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWZhNzBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9JbmRlbnRpbmdQcmludFdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgUHJpbnRXcml0ZXJ9IHRvIGF1dG9tYXRpY2FsbHkgaW5kZW50IG5ldyBsaW5lcy4KLSAqLwotcHVibGljIGNsYXNzIEluZGVudGluZ1ByaW50V3JpdGVyCi0JZXh0ZW5kcyBQcmludFdyaXRlcgotewotCXByaXZhdGUgZmluYWwgU3RyaW5nIGluZGVudDsKLQlwcml2YXRlIGludCBpbmRlbnRMZXZlbDsKLQlwcml2YXRlIGJvb2xlYW4gbmVlZHNJbmRlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX0lOREVOVCA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgd3JpdGVyIHRoYXQgaW5kZW50cyB3aXRoIHRhYnMuCi0JICovCi0JcHVibGljIEluZGVudGluZ1ByaW50V3JpdGVyKFdyaXRlciBvdXQpIHsKLQkJdGhpcyhvdXQsIERFRkFVTFRfSU5ERU5UKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0ZXIgdGhhdCBpbmRlbnRzIHdpdGggdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICovCi0JcHVibGljIEluZGVudGluZ1ByaW50V3JpdGVyKFdyaXRlciBvdXQsIFN0cmluZyBpbmRlbnQpIHsKLQkJc3VwZXIob3V0KTsKLQkJdGhpcy5pbmRlbnQgPSBpbmRlbnQ7Ci0JCXRoaXMuaW5kZW50TGV2ZWwgPSAwOwotCQl0aGlzLm5lZWRzSW5kZW50ID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZmxhZyBzbyBmb2xsb3dpbmcgbGluZSBpcyBpbmRlbnRlZC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcmludGxuKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJc3VwZXIucHJpbnRsbigpOwotCQkJdGhpcy5uZWVkc0luZGVudCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgYXBwcm9wcmlhdGUgaW5kZW50LgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludEluZGVudCgpIHsKLQkJaWYgKHRoaXMubmVlZHNJbmRlbnQpIHsKLQkJCXRoaXMubmVlZHNJbmRlbnQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSB0aGlzLmluZGVudExldmVsOyBpLS0gPiAwOyApIHsKLQkJCQl0aGlzLnByaW50KHRoaXMuaW5kZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFdyaXRlIGEgcG9ydGlvbiBvZiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgYnVmW10sIGludCBvZmYsIGludCBsZW4pIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMucHJpbnRJbmRlbnQoKTsKLQkJCXN1cGVyLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGludCBjKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7Ci0JCQl0aGlzLnByaW50SW5kZW50KCk7Ci0JCQlzdXBlci53cml0ZShjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdyaXRlIGEgcG9ydGlvbiBvZiBhIHN0cmluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgcywgaW50IG9mZiwgaW50IGxlbikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5wcmludEluZGVudCgpOwotCQkJc3VwZXIud3JpdGUocywgb2ZmLCBsZW4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnVtcCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIGluZGVudCgpIHsKLQkJdGhpcy5pbmNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCX0KLQotCS8qKgotCSAqIERlY3JlbWVudCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZGVudCgpIHsKLQkJdGhpcy5kZWNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCX0KLQotCS8qKgotCSAqIEJ1bXAgdGhlIGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmNyZW1lbnRJbmRlbnRMZXZlbCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMuaW5kZW50TGV2ZWwrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlY3JlbWVudCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlY3JlbWVudEluZGVudExldmVsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5pbmRlbnRMZXZlbC0tOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGVudExldmVsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJcmV0dXJuIHRoaXMuaW5kZW50TGV2ZWw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbGxvdyB0aGUgaW5kZW50IGxldmVsIHRvIGJlIHNldCBkaXJlY3RseS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgaW50IHNldEluZGVudExldmVsKGludCBpbmRlbnRMZXZlbCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJaW50IG9sZCA9IHRoaXMuaW5kZW50TGV2ZWw7Ci0JCQl0aGlzLmluZGVudExldmVsID0gaW5kZW50TGV2ZWw7Ci0JCQlyZXR1cm4gb2xkOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvSmF2YVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9KYXZhVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjc2OWNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9KYXZhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlc2NyaWJlcyBhIEphdmEgdHlwZTsgaS5lLiBpdHMgImVsZW1lbnQgdHlwZSIKLSAqIGFuZCBpdHMgImFycmF5IGRlcHRoIi4gVGhlIGVsZW1lbnQgdHlwZSBpcyByZWZlcmVuY2VkIGJ5IG5hbWUsCi0gKiBhbGxvd2luZyB1cyB0byByZWZlcmVuY2UgY2xhc3NlcyB0aGF0IGFyZSBub3QgKG9yIGNhbm5vdCBiZSkgbG9hZGVkLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVR5cGUgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB0eXBlJ3MgImVsZW1lbnQgdHlwZSIuCi0JICogQSBtZW1iZXIgdHlwZSB3aWxsIGhhdmUgb25lIG9yIG1vcmUgPGNvZGU+JyQnPC9jb2RlPiBjaGFyYWN0ZXJzIGluIGl0cyBuYW1lLgotCSAqLwotCVN0cmluZyBnZXRFbGVtZW50VHlwZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSdzICJhcnJheSBkZXB0aCIuCi0JICovCi0JaW50IGdldEFycmF5RGVwdGgoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGFuIGFycmF5IChpLmUuIGl0cyAiYXJyYXkgZGVwdGgiIGlzIGdyZWF0ZXIKLQkgKiB0aGFuIHplcm8pLgotCSAqLwotCWJvb2xlYW4gaXNBcnJheSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgaXMgYSAicHJpbWl0aXZlIiAoZS5nLiA8Y29kZT5pbnQ8L2NvZGU+LCA8Y29kZT5mbG9hdDwvY29kZT4pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqLwotCWJvb2xlYW4gaXNQcmltaXRpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGEgInByaW1pdGl2ZSB3cmFwcGVyIiAoZS5nLiB7QGxpbmsgamF2YS5sYW5nLkludGVnZXJ9LAotCSAqIHtAbGluayBqYXZhLmxhbmcuRmxvYXR9KS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiA8Y29kZT52b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZTwvY29kZT4KLQkgKi8KLQlib29sZWFuIGlzUHJpbWl0aXZlV3JhcHBlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgaXMgYSAidmFyaWFibGUgcHJpbWl0aXZlIiAoZS5nLiA8Y29kZT5pbnQ8L2NvZGU+LCA8Y29kZT5mbG9hdDwvY29kZT4sCi0JICogYnV0IG5vdCA8Y29kZT52b2lkPC9jb2RlPikuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gdmFyaWFibGVzIGNhbm5vdCBiZSBkZWNsYXJlZCA8Y29kZT52b2lkPC9jb2RlPgotCSAqLwotCWJvb2xlYW4gaXNWYXJpYWJsZVByaW1pdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgaXMgYSAidmFyaWFibGUgcHJpbWl0aXZlIHdyYXBwZXIiIChlLmcuCi0JICoge0BsaW5rIGphdmEubGFuZy5JbnRlZ2VyfSwge0BsaW5rIGphdmEubGFuZy5GbG9hdH0sCi0JICogYnV0IG5vdCB7QGxpbmsgamF2YS5sYW5nLlZvaWR9KS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiB2YXJpYWJsZXMgY2Fubm90IGJlIGRlY2xhcmVkIDxjb2RlPnZvaWQ8L2NvZGU+Ci0JICovCi0JYm9vbGVhbiBpc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlJ3MgZWxlbWVudCB0eXBlIGFuZCBhcnJheSBkZXB0aC4KLQkgKi8KLQlDbGFzczw/PiBnZXRKYXZhQ2xhc3MoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgdHlwZSdzIG5hbWUgdGhhdCBtYXRjaGVzIHRoYXQKLQkgKiByZXR1cm5lZCBieSB7QGxpbmsgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKX0KLQkgKiAoZS5nLiA8Y29kZT4iW1tKIjwvY29kZT4sIDxjb2RlPiJbTGphdmEubGFuZy5PYmplY3Q7IjwvY29kZT4sCi0JICogPGNvZGU+ImphdmEudXRpbC5NYXAkRW50cnkiPC9jb2RlPikuCi0JICovCi0JU3RyaW5nIGdldEphdmFDbGFzc05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhTdHJpbmcgb3RoZXJFbGVtZW50VHlwZU5hbWUsIGludCBvdGhlckFycmF5RGVwdGgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgZGVzY3JpYmVzIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKi8KLQlib29sZWFuIGRlc2NyaWJlcyhTdHJpbmcgY2xhc3NOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGRlc2NyaWJlcyB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICovCi0JYm9vbGVhbiBkZXNjcmliZXMoQ2xhc3M8Pz4gamF2YUNsYXNzKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhKYXZhVHlwZSBvdGhlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUncyBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgaW4gc291cmNlIGNvZGU6PHVsPgotCSAqIDxsaT48Y29kZT4iW1tKIjwvY29kZT4gPT4gPGNvZGU+ImxvbmdbXVtdIjwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImphdmEudXRpbC5NYXAkRW50cnkiPC9jb2RlPiA9PiA8Y29kZT4iamF2YS51dGlsLk1hcC5FbnRyeSI8L2NvZGU+Ci0JICogPC91bD4KLQkgKi8KLQlTdHJpbmcgZGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgdmVyc2lvbiBvZiB0aGUgdHlwZSdzIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiBzb3VyY2UgY29kZTo8dWw+Ci0JICogPGxpPjxjb2RlPiJbW0oiPC9jb2RlPiA9PiA8Y29kZT4ibG9uZ1tdW10iPC9jb2RlPgotCSAqIDxsaT48Y29kZT4iamF2YS51dGlsLk1hcCRFbnRyeSI8L2NvZGU+ID0+IDxjb2RlPiJqYXZhLnV0aWwuTWFwLkVudHJ5IjwvY29kZT4KLQkgKiA8L3VsPgotCSAqLwotCXZvaWQgYXBwZW5kRGVjbGFyYXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQotCS8qKgotCSAqIFByaW50IHRoZSB2ZXJzaW9uIG9mIHRoZSB0eXBlJ3MgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGluIHNvdXJjZSBjb2RlOjx1bD4KLQkgKiA8bGk+PGNvZGU+IltbSiI8L2NvZGU+ID0+IDxjb2RlPiJsb25nW11bXSI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPiJqYXZhLnV0aWwuTWFwJEVudHJ5IjwvY29kZT4gPT4gPGNvZGU+ImphdmEudXRpbC5NYXAuRW50cnkiPC9jb2RlPgotCSAqIDwvdWw+Ci0JICovCi0Jdm9pZCBwcmludERlY2xhcmF0aW9uT24oUHJpbnRXcml0ZXIgcHcpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvTWV0aG9kU2lnbmF0dXJlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvTWV0aG9kU2lnbmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMzNjN2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L01ldGhvZFNpZ25hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlc2NyaWJlcyBhIEphdmEgbWV0aG9kIHNpZ25hdHVyZTsgaS5lLiBpdHMgIm5hbWUiCi0gKiBhbmQgaXRzICJwYXJhbWV0ZXIgdHlwZXMiLiBUaGUgcGFyYW1ldGVyIHR5cGVzIGFyZSByZWZlcmVuY2VkIGJ5IG5hbWUsCi0gKiBhbGxvd2luZyB1cyB0byByZWZlcmVuY2UgY2xhc3NlcyB0aGF0IGFyZSBub3QgKG9yIGNhbm5vdCBiZSkgbG9hZGVkLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kU2lnbmF0dXJlIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kJ3MgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QncyBwYXJhbWV0ZXIgdHlwZXMuCi0JICovCi0JSmF2YVR5cGVbXSBnZXRQYXJhbWV0ZXJUeXBlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1ldGhvZCBzaWduYXR1cmUgZGVzY3JpYmVzIHRoZSBzcGVjaWZpZWQgbWV0aG9kLgotCSAqLwotCWJvb2xlYW4gZGVzY3JpYmVzKE1ldGhvZCBtZXRob2QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1ldGhvZCBzaWduYXR1cmUgZXF1YWxzIHRoZSBzcGVjaWZpZWQgc2lnbmF0dXJlLgotCSAqLwotCWJvb2xlYW4gZXF1YWxzKFN0cmluZyBvdGhlck5hbWUsIEphdmFUeXBlW10gb3RoZXJQYXJhbWV0ZXJUeXBlcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWV0aG9kIHNpZ25hdHVyZSBlcXVhbHMgdGhlIHNwZWNpZmllZCBzaWduYXR1cmUuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoTWV0aG9kU2lnbmF0dXJlIG90aGVyKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kJ3Mgc2lnbmF0dXJlOjxwPgotCSAqIDxjb2RlPiJmb28oaW50LCBqYXZhLmxhbmcuU3RyaW5nKSI8L2NvZGU+Ci0JICovCi0JU3RyaW5nIGdldFNpZ25hdHVyZSgpOwotCi0JLyoqCi0JICogQXBwZW5kIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRob2QncyBzaWduYXR1cmU6PHA+Ci0JICogPGNvZGU+ImZvbyhpbnQsIGphdmEubGFuZy5TdHJpbmcpIjwvY29kZT4KLQkgKi8KLQl2b2lkIGFwcGVuZFNpZ25hdHVyZVRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCi0JLyoqCi0JICogUHJpbnQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZCdzIHNpZ25hdHVyZTo8cD4KLQkgKiA8Y29kZT4iZm9vKGludCwgamF2YS5sYW5nLlN0cmluZykiPC9jb2RlPgotCSAqLwotCXZvaWQgcHJpbnRTaWduYXR1cmVPbihQcmludFdyaXRlciBwdyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9BYnN0cmFjdEFzc29jaWF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQWJzdHJhY3RBc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGNhNzE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9BYnN0cmFjdEFzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEltcGxlbWVudCBzb21lIG9mIHRoZSBtZXRob2RzIGluIHtAbGluayBBc3NvY2lhdGlvbn0gdGhhdCBjYW4KLSAqIGJlIGRlZmluZWQgaW4gdGVybXMgb2YgdGhlIG90aGVyIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFzc29jaWF0aW9uPEssIFY+Ci0JaW1wbGVtZW50cyBBc3NvY2lhdGlvbjxLLCBWPgotewotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RBc3NvY2lhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIEFzc29jaWF0aW9uPD8sID8+KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUFzc29jaWF0aW9uPD8sID8+IG90aGVyID0gKEFzc29jaWF0aW9uPD8sID8+KSBvOwotCQlyZXR1cm4gKHRoaXMua2V5KCkgPT0gbnVsbCA/Ci0JCQkJCW90aGVyLmtleSgpID09IG51bGwgOiB0aGlzLmtleSgpLmVxdWFscyhvdGhlci5rZXkoKSkpCi0JCQkmJiAodGhpcy52YWx1ZSgpID09IG51bGwgPwotCQkJCQlvdGhlci52YWx1ZSgpID09IG51bGwgOiB0aGlzLnZhbHVlKCkuZXF1YWxzKG90aGVyLnZhbHVlKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuICh0aGlzLmtleSgpID09IG51bGwgPyAwIDogdGhpcy5rZXkoKS5oYXNoQ29kZSgpKQotCQkJXiAodGhpcy52YWx1ZSgpID09IG51bGwgPyAwIDogdGhpcy52YWx1ZSgpLmhhc2hDb2RlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5rZXkoKSArICIgPT4gIiArIHRoaXMudmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0FycmF5VG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9BcnJheVRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZDM3ZDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0FycmF5VG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotLyoqCi0gKiBBcnJheS1yZWxhdGVkIHV0aWxpdHkgbWV0aG9kcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFycmF5VG9vbHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfT0JKRUNUX0FSUkFZID0gbmV3IE9iamVjdFswXTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBFTVBUWV9DSEFSX0FSUkFZID0gbmV3IGNoYXJbMF07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBFTVBUWV9JTlRfQVJSQVkgPSBuZXcgaW50WzBdOwotCi0JLy8gKioqKioqKioqKiBpbnN0YW50aWF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB3aXRoIHRoZSBzYW1lIGxlbmd0aAotCSAqIGFuZCB0aGUgc2FtZSBjb21wb25lbnQgdHlwZSBhcyB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5uZXdBcnJheShPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIG5ld0FycmF5KEVbXSBhcnJheSkgewotCQlyZXR1cm4gbmV3QXJyYXkoYXJyYXksIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBsZW5ndGgKLQkgKiBhbmQgdGhlIHNhbWUgY29tcG9uZW50IHR5cGUgYXMgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubmV3QXJyYXkoT2JqZWN0W10gYXJyYXksIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBuZXdBcnJheShFW10gYXJyYXksIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIG5ld0FycmF5KGNvbXBvbmVudFR5cGUoYXJyYXkpLCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGFycmF5J3MgY29tcG9uZW50IHR5cGUsIHdpdGggYXBwcm9wcmlhdGUgc3VwcG9ydAotCSAqIGZvciBnZW5lcmljcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBDbGFzczw/IGV4dGVuZHMgRT4gY29tcG9uZW50VHlwZShFW10gYXJyYXkpIHsKLQkJQ2xhc3M8Pz4gcmF3Q29tcG9uZW50VHlwZSA9IGFycmF5LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQ2xhc3M8PyBleHRlbmRzIEU+IGNvbXBvbmVudFR5cGUgPSAoQ2xhc3M8PyBleHRlbmRzIEU+KSByYXdDb21wb25lbnRUeXBlOwotCQlyZXR1cm4gY29tcG9uZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCB0eXBlIGFuZCBsZW5ndGgsCi0JICogd2l0aCBhcHByb3ByaWF0ZSBzdXBwb3J0IGZvciBnZW5lcmljcy4gVGhlIGNvbXBvbmVudCB0eXBlIGNhbm5vdCBiZSBhCi0JICogcHJpbWl0aXZlIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIG5ld0FycmF5KENsYXNzPD8gZXh0ZW5kcyBFPiBjb21wb25lbnRUeXBlLCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChjb21wb25lbnRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFycmF5IGNsYXNzIGNhbm5vdCBiZSBwcmltaXRpdmU6ICIgKyBjb21wb25lbnRUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBuZXdBcnJheV8oY29tcG9uZW50VHlwZSwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIGNvbXBvbmVudCB0eXBlIGlzIG5vdCBhIHByaW1pdGl2ZSBjbGFzcwotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gbmV3QXJyYXlfKENsYXNzPD8gZXh0ZW5kcyBFPiBjb21wb25lbnRUeXBlLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiAoRVtdKSAoKGNvbXBvbmVudFR5cGUgPT0gT0JKRUNUX0NMQVNTKSA/Ci0JCQkJbmV3IE9iamVjdFtsZW5ndGhdIDoKLQkJCQlBcnJheS5uZXdJbnN0YW5jZShjb21wb25lbnRUeXBlLCBsZW5ndGgpKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8T2JqZWN0PiBPQkpFQ1RfQ0xBU1MgPSBPYmplY3QuY2xhc3M7Ci0KLQotCS8vICoqKioqKioqKiogY29udmVyc2lvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnRvQXJyYXkoKTwvY29kZT4KLQkgKiBAc2VlIENvbGxlY3Rpb24jdG9BcnJheSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBhcnJheShJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYXJyYXkoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnRvQXJyYXkoKTwvY29kZT4KLQkgKiBAc2VlIENvbGxlY3Rpb24jdG9BcnJheSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBhcnJheShJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gYXJyYXkoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlOwotCSAqIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlIHJldHVybmVkIGFycmF5IGlzIHRoYXQgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBJZiB0aGUgaXRlcmFibGUgZml0cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LCBpdCBpcyByZXR1cm5lZCB0aGVyZWluLgotCSAqIE90aGVyd2lzZSwgYSBuZXcgYXJyYXkgaXMgYWxsb2NhdGVkIHdpdGggdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYW5kIHRoZSBzaXplIG9mIHRoZSBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS50b0FycmF5KE9iamVjdFtdKTwvY29kZT4KLQkgKiBAc2VlIENvbGxlY3Rpb24jdG9BcnJheShPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYXJyYXkoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBFW10gYXJyYXkpIHsKLQkJcmV0dXJuIGFycmF5KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlOwotCSAqIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlIHJldHVybmVkIGFycmF5IGlzIHRoYXQgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBJZiB0aGUgaXRlcmFibGUgZml0cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LCBpdCBpcyByZXR1cm5lZCB0aGVyZWluLgotCSAqIE90aGVyd2lzZSwgYSBuZXcgYXJyYXkgaXMgYWxsb2NhdGVkIHdpdGggdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYW5kIHRoZSBzaXplIG9mIHRoZSBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnRvQXJyYXkoT2JqZWN0W10pPC9jb2RlPgotCSAqIEBzZWUgQ29sbGVjdGlvbiN0b0FycmF5KE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhcnJheShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUsIEVbXSBhcnJheSkgewotCQlyZXR1cm4gYXJyYXkoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci50b0FycmF5KCk8L2NvZGU+Ci0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gYXJyYXkoSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/Ci0JCQkJQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlcmF0b3IpLnRvQXJyYXkoKSA6Ci0JCQkJRU1QVFlfT0JKRUNUX0FSUkFZOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci50b0FycmF5KCk8L2NvZGU+Ci0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gYXJyYXkoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/Ci0JCQkJQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkudG9BcnJheSgpIDoKLQkJCQlFTVBUWV9PQkpFQ1RfQVJSQVk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvcjsKLQkgKiB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGF0IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogSWYgdGhlIGl0ZXJhdG9yIGZpdHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwgaXQgaXMgcmV0dXJuZWQgdGhlcmVpbi4KLQkgKiBPdGhlcndpc2UsIGEgbmV3IGFycmF5IGlzIGFsbG9jYXRlZCB3aXRoIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGFuZCB0aGUgc2l6ZSBvZiB0aGUgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IudG9BcnJheShPYmplY3RbXSk8L2NvZGU+Ci0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFycmF5KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgRVtdIGFycmF5KSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPwotCQkJCUNvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhdG9yKS50b0FycmF5KGFycmF5KSA6Ci0JCQkJZW1wdHlBcnJheShhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvcjsKLQkgKiB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGF0IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogSWYgdGhlIGl0ZXJhdG9yIGZpdHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwgaXQgaXMgcmV0dXJuZWQgdGhlcmVpbi4KLQkgKiBPdGhlcndpc2UsIGEgbmV3IGFycmF5IGlzIGFsbG9jYXRlZCB3aXRoIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGFuZCB0aGUgc2l6ZSBvZiB0aGUgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci50b0FycmF5KE9iamVjdFtdKTwvY29kZT4KLQkgKiBAc2VlIENvbGxlY3Rpb24jdG9BcnJheShPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYXJyYXkoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplLCBFW10gYXJyYXkpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/Ci0JCQkJQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkudG9BcnJheShhcnJheSkgOgotCQkJCWVtcHR5QXJyYXkoYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBzcGVjaWZpZWQgYXJyYXkgaXMgZW1wdHksIHJldHVybiBpdDsKLQkgKiBvdGhlcndpc2UsIHNldCBpdHMgZmlyc3QgZWxlbWVudCB0byBudWxsLgotCSAqIEBzZWUgQ29sbGVjdGlvbiN0b0FycmF5KE9iamVjdFtdKQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gZW1wdHlBcnJheShFW10gYXJyYXkpIHsKLQkJcmV0dXJuIChhcnJheS5sZW5ndGggPT0gMCkgPyBhcnJheSA6IGNsZWFyRmlyc3QoYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGFycmF5J3MgZmlyc3QgZWxlbWVudCB0byBudWxsIGFuZCBhbmQgcmV0dXJuIHRoZSBhcnJheS4KLQkgKiBBc3N1bWUgdGhlIGFycmF5IGxlbmd0aCA+IDAuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBjbGVhckZpcnN0KEVbXSBhcnJheSkgewotCQlhcnJheVswXSA9IG51bGw7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gYmUgYWRkZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZChPYmplY3RbXSBhcnJheSwgT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGQoRVtdIGFycmF5LCBFIHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgbGVuICsgMSk7Ci0JCWlmIChsZW4gPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGxlbik7Ci0JCX0KLQkJcmVzdWx0W2xlbl0gPSB2YWx1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkKEVbXSBhcnJheSwgaW50IGluZGV4LCBFIHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgbGVuICsgMSk7Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQl9Ci0JCXJlc3VsdFtpbmRleF0gPSB2YWx1ZTsKLQkJaWYgKGluZGV4IDwgbGVuKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCwgcmVzdWx0LCBpbmRleCArIDEsIGxlbiAtIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBiZSBhZGRlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gYWRkKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuICsgMV07Ci0JCWlmIChsZW4gPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGxlbik7Ci0JCX0KLQkJcmVzdWx0W2xlbl0gPSB2YWx1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGQoY2hhcltdIGFycmF5LCBpbnQgaW5kZXgsIGNoYXIgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGFkZChjaGFyW10gYXJyYXksIGludCBpbmRleCwgY2hhciB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuICsgMV07Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQl9Ci0JCXJlc3VsdFtpbmRleF0gPSB2YWx1ZTsKLQkJaWYgKGluZGV4IDwgbGVuKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCwgcmVzdWx0LCBpbmRleCArIDEsIGxlbiAtIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBiZSBhZGRlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkKGludFtdIGFycmF5LCBpbnQgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gYWRkKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtsZW4gKyAxXTsKLQkJaWYgKGxlbiA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgbGVuKTsKLQkJfQotCQlyZXN1bHRbbGVuXSA9IHZhbHVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFkZGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZChpbnRbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gYWRkKGludFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2xlbiArIDFdOwotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJfQotCQlyZXN1bHRbaW5kZXhdID0gdmFsdWU7Ci0JCWlmIChpbmRleCA8IGxlbikgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyAxLCBsZW4gLSBpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkIGFsbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKjxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIENvbGxlY3Rpb24gY29sbGVjdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbi5zaXplKCkpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGNvbGxlY3Rpb24gc2l6ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCXJldHVybiAoY29sbGVjdGlvblNpemUgPT0gMCkgPyBhcnJheSA6IGFkZEFsbF8oYXJyYXksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gYWRkQWxsXyhhcnJheSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbi5zaXplKCkpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBjb2xsZWN0aW9uIHNpemUgPiB6ZXJvCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5Lmxlbmd0aCwgY29sbGVjdGlvblNpemUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBjb2xsZWN0aW9uIHNpemUgPiB6ZXJvOyBjaGVjayBhcnJheSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIGludCBhcnJheUxlbmd0aCwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPwotCQkJCWNvbGxlY3Rpb24udG9BcnJheShuZXdBcnJheShhcnJheSwgY29sbGVjdGlvblNpemUpKSA6Ci0JCQkJYWRkQWxsXyhhcnJheSwgY29sbGVjdGlvbiwgYXJyYXlMZW5ndGgsIGNvbGxlY3Rpb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgbGVuZ3RoIGFuZCBjb2xsZWN0aW9uIHNpemUgPiB6ZXJvCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGFycmF5TGVuZ3RoLCBpbnQgY29sbGVjdGlvblNpemUpIHsKLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBhcnJheUxlbmd0aCArIGNvbGxlY3Rpb25TaXplKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBhcnJheUxlbmd0aCk7Ci0JCWludCBpID0gYXJyYXlMZW5ndGg7Ci0JCWZvciAoRSBlbGVtZW50IDogY29sbGVjdGlvbikgewotCQkJcmVzdWx0W2krK10gPSBlbGVtZW50OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBhZGRBbGxfKGFycmF5LCBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVyYXRvcikpIDogYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGFkZEFsbF8oYXJyYXksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpKSA6IGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgMSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXkxLCBFLi4uIGFycmF5MikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTIubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBhcnJheSAyIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheTEsIEVbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5MSwgRVtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTEubGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDA7IGNoZWNrIGFycmF5IDEgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5MSwgRVtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MiA6IGFkZEFsbF8oYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYm90aCBhcnJheSBsZW5ndGhzID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXkxLCBFW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheTEsIGFycmF5MUxlbmd0aCArIGFycmF5Mkxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGFycmF5MUxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogZmlyc3Qgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG9iamVjdHMgaW4gdGhlIHNlY29uZAotCSAqIHNwZWNpZmllZCBhcnJheSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXkxLCBpbnQgaW5kZXgsIE9iamVjdFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXkxLCBpbnQgaW5kZXgsIEUuLi4gYXJyYXkyKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTIubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBhcnJheSAyIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheTEsIGludCBpbmRleCwgRVtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbF8oYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5MSwgaW50IGluZGV4LCBFW10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTEubGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDA7IGNoZWNrIGFycmF5IDEgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5MSwgaW50IGluZGV4LCBFW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8KLQkJCQkJYXJyYXkyIDoKLQkJCQkJKGluZGV4ID09IGFycmF5MUxlbmd0aCkgPyAgLy8gJ2FycmF5MicgYWRkZWQgdG8gZW5kIG9mICdhcnJheTEnCi0JCQkJCQlhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCkgOgotCQkJCQkJYWRkQWxsXyhhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYm90aCBhcnJheSBsZW5ndGhzID4gMCBhbmQgaW5kZXggIT0gYXJyYXkgMSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5MSwgaW50IGluZGV4LCBFW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheTEsIGFycmF5MUxlbmd0aCArIGFycmF5Mkxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgaW5kZXgsIGFycmF5Mkxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCBpbmRleCwgcmVzdWx0LCBpbmRleCArIGFycmF5Mkxlbmd0aCwgYXJyYXkxTGVuZ3RoIC0gaW5kZXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIENvbGxlY3Rpb24gYyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBpbmRleCwgY29sbGVjdGlvbiwgY29sbGVjdGlvbi5zaXplKCkpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGNvbGxlY3Rpb24gc2l6ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBpbnQgY29sbGVjdGlvblNpemUpIHsKLQkJcmV0dXJuIChjb2xsZWN0aW9uU2l6ZSA9PSAwKSA/IGFycmF5IDogYWRkQWxsXyhhcnJheSwgaW5kZXgsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBzaXplID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXksIGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGluZGV4LCBjb2xsZWN0aW9uLCBhcnJheS5sZW5ndGgsIGNvbGxlY3Rpb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBzaXplID4gMDsgY2hlY2sgYXJyYXkgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIGludCBhcnJheUxlbmd0aCwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCWlmIChhcnJheUxlbmd0aCA9PSAwKSB7Ci0JCQlpZiAoaW5kZXggPT0gMCkgewotCQkJCXJldHVybiBjb2xsZWN0aW9uLnRvQXJyYXkobmV3QXJyYXkoYXJyYXksIGNvbGxlY3Rpb25TaXplKSk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6IDAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIChpbmRleCA9PSBhcnJheUxlbmd0aCkgPyAgLy8gJ2NvbGxlY3Rpb24nIGFkZGVkIHRvIGVuZCBvZiAnYXJyYXknCi0JCQkJYWRkQWxsXyhhcnJheSwgY29sbGVjdGlvbiwgYXJyYXlMZW5ndGgsIGNvbGxlY3Rpb25TaXplKSA6Ci0JCQkJYWRkQWxsXyhhcnJheSwgaW5kZXgsIGNvbGxlY3Rpb24sIGFycmF5TGVuZ3RoLCBjb2xsZWN0aW9uU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IGxlbmd0aCBhbmQgY29sbGVjdGlvbiBzaXplID4gMCBhbmQgaW5kZXggIT0gYXJyYXkgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheSwgaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgsIGludCBjb2xsZWN0aW9uU2l6ZSkgewotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGFycmF5TGVuZ3RoICsgY29sbGVjdGlvblNpemUpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJaW50IGkgPSBpbmRleDsKLQkJZm9yIChFIGl0ZW0gOiBjb2xsZWN0aW9uKSB7Ci0JCQlyZXN1bHRbaSsrXSA9IGl0ZW07Ci0JCX0KLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyBjb2xsZWN0aW9uU2l6ZSwgYXJyYXlMZW5ndGggLSBpbmRleCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheSwgaW5kZXgsIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGluZGV4LCBpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBhZGRBbGxfKGFycmF5LCBpbmRleCwgQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlcmF0b3IpKSA6IGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGFkZEFsbF8oYXJyYXksIGluZGV4LCBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBpcyBub24tZW1wdHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5LCBpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGFkZEFsbF8oYXJyYXksIGluZGV4LCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uLnNpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSAxIGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgMi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGFkZEFsbChjaGFyW10gYXJyYXkxLCBjaGFyLi4uIGFycmF5MikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTIubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBhcnJheSAyIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBhZGRBbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbF8oYXJyYXkxLCBhcnJheTIsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBhZGRBbGxfKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwOyBjaGVjayBhcnJheSAxIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBhZGRBbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MiA6IGFkZEFsbF8oYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYm90aCBhcnJheSBsZW5ndGhzID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBhZGRBbGxfKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2FycmF5MUxlbmd0aCArIGFycmF5Mkxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGFycmF5MUxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogZmlyc3Qgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG9iamVjdHMgaW4gdGhlIHNlY29uZAotCSAqIHNwZWNpZmllZCBhcnJheSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGQoY2hhcltdIGFycmF5MSwgaW50IGluZGV4LCBjaGFyW10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBhZGRBbGwoY2hhcltdIGFycmF5MSwgaW50IGluZGV4LCBjaGFyLi4uIGFycmF5MikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgMiBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGludCBpbmRleCwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbF8oYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsXyhjaGFyW10gYXJyYXkxLCBpbnQgaW5kZXgsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5MS5sZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMDsgY2hlY2sgYXJyYXkgMSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGludCBpbmRleCwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/Ci0JCQkJCWFycmF5MiA6Ci0JCQkJCShpbmRleCA9PSBhcnJheTFMZW5ndGgpID8gIC8vICdhcnJheTInIGFkZGVkIHRvIGVuZCBvZiAnYXJyYXkxJwotCQkJCQkJYWRkQWxsXyhhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpIDoKLQkJCQkJCWFkZEFsbF8oYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAgYW5kIGluZGV4ICE9IGFycmF5IDEgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbF8oY2hhcltdIGFycmF5MSwgaW50IGluZGV4LCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhclthcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGluZGV4LCBhcnJheTJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyBhcnJheTJMZW5ndGgsIGFycmF5MUxlbmd0aCAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IDEgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gYWRkQWxsKGludFtdIGFycmF5MSwgaW50Li4uIGFycmF5MikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTIubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBhcnJheSAyIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbF8oYXJyYXkxLCBhcnJheTIsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbF8oaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwOyBjaGVjayBhcnJheSAxIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MiA6IGFkZEFsbF8oYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYm90aCBhcnJheSBsZW5ndGhzID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbF8oaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFthcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBhcnJheTFMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIGZpcnN0IHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBvYmplY3RzIGluIHRoZSBzZWNvbmQKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkKGludFtdIGFycmF5MSwgaW50IGluZGV4LCBpbnRbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gYWRkQWxsKGludFtdIGFycmF5MSwgaW50IGluZGV4LCBpbnQuLi4gYXJyYXkyKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTIubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBhcnJheSAyIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludCBpbmRleCwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkyTGVuZ3RoID09IDApID8gYXJyYXkxIDogYWRkQWxsXyhhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbF8oaW50W10gYXJyYXkxLCBpbnQgaW5kZXgsIGludFtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwOyBjaGVjayBhcnJheSAxIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludCBpbmRleCwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8KLQkJCQkJYXJyYXkyIDoKLQkJCQkJKGluZGV4ID09IGFycmF5MUxlbmd0aCkgPyAgLy8gJ2FycmF5MicgYWRkZWQgdG8gZW5kIG9mICdhcnJheTEnCi0JCQkJCQlhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCkgOgotCQkJCQkJYWRkQWxsXyhhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYm90aCBhcnJheSBsZW5ndGhzID4gMCBhbmQgaW5kZXggIT0gYXJyYXkgMSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGxfKGludFtdIGFycmF5MSwgaW50IGluZGV4LCBpbnRbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFthcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGluZGV4LCBhcnJheTJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyBhcnJheTJMZW5ndGgsIGFycmF5MUxlbmd0aCAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xlYXIgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGVtcHR5IGFycmF5IHdpdGggdGhlIHNhbWUgY29tcG9uZW50IHR5cGUgYXMgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY2xlYXIoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBjbGVhcihFW10gYXJyYXkpIHsKLQkJcmV0dXJuIChhcnJheS5sZW5ndGggPT0gMCkgPyBhcnJheSA6IG5ld0FycmF5KGFycmF5LCAwKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uY2F0ZW5hdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBlbGVtZW50cyBpbiBhbGwgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5cywgY29uY2F0ZW5hdGVkIGluIHRoZSBzcGVjaWZpZWQgb3JkZXIuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGJ1aWxkaW5nIGNvbnN0YW50IGFycmF5cyBvdXQgb2Ygb3RoZXIgY29uc3RhbnQgYXJyYXlzLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb25jYXRlbmF0ZShPYmplY3RbXS4uLiBhcnJheXMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBjb25jYXRlbmF0ZShFW10uLi4gYXJyYXlzKSB7Ci0JCWludCBsZW4gPSAwOwotCQlmb3IgKEVbXSBhcnJheSA6IGFycmF5cykgewotCQkJbGVuICs9IGFycmF5Lmxlbmd0aDsKLQkJfQotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXlzWzBdLCBsZW4pOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaW50IGN1cnJlbnQgPSAwOwotCQlmb3IgKEVbXSBhcnJheSA6IGFycmF5cykgewotCQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQkJaWYgKGFycmF5TGVuZ3RoID4gMCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgY3VycmVudCwgYXJyYXlMZW5ndGgpOwotCQkJCWN1cnJlbnQgKz0gYXJyYXlMZW5ndGg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzIGluICBhbGwgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5cywgY29uY2F0ZW5hdGVkIGluIHRoZSBzcGVjaWZpZWQgb3JkZXIuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGJ1aWxkaW5nIGNvbnN0YW50IGFycmF5cyBvdXQgb3RoZXIgY29uc3RhbnQgYXJyYXlzLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb25jYXRlbmF0ZShjaGFyW10uLi4gYXJyYXlzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb25jYXRlbmF0ZShjaGFyW10uLi4gYXJyYXlzKSB7Ci0JCWludCBsZW4gPSAwOwotCQlmb3IgKGNoYXJbXSBhcnJheSA6IGFycmF5cykgewotCQkJbGVuICs9IGFycmF5Lmxlbmd0aDsKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9DSEFSX0FSUkFZOwotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5dOwotCQlpbnQgY3VycmVudCA9IDA7Ci0JCWZvciAoY2hhcltdIGFycmF5IDogYXJyYXlzKSB7Ci0JCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCQlpZiAoYXJyYXlMZW5ndGggIT0gMCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgY3VycmVudCwgYXJyYXlMZW5ndGgpOwotCQkJCWN1cnJlbnQgKz0gYXJyYXlMZW5ndGg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzIGluICBhbGwgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5cywgY29uY2F0ZW5hdGVkIGluIHRoZSBzcGVjaWZpZWQgb3JkZXIuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGJ1aWxkaW5nIGNvbnN0YW50IGFycmF5cyBvdXQgb3RoZXIgY29uc3RhbnQgYXJyYXlzLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb25jYXRlbmF0ZShpbnRbXS4uLiBhcnJheXMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gY29uY2F0ZW5hdGUoaW50W10uLi4gYXJyYXlzKSB7Ci0JCWludCBsZW4gPSAwOwotCQlmb3IgKGludFtdIGFycmF5IDogYXJyYXlzKSB7Ci0JCQlsZW4gKz0gYXJyYXkubGVuZ3RoOwotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX0lOVF9BUlJBWTsKLQkJfQotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2xlbl07Ci0JCWludCBjdXJyZW50ID0gMDsKLQkJZm9yIChpbnRbXSBhcnJheSA6IGFycmF5cykgewotCQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQkJaWYgKGFycmF5TGVuZ3RoICE9IDApIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIGN1cnJlbnQsIGFycmF5TGVuZ3RoKTsKLQkJCQljdXJyZW50ICs9IGFycmF5TGVuZ3RoOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zKE9iamVjdFtdIGFycmF5LCBPYmplY3Qgbyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zKGFycmF5LCB2YWx1ZSwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBhcnJheSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUsIGludCBhcnJheUxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gZmFsc2UgOiBjb250YWluc18oYXJyYXksIHZhbHVlLCBhcnJheUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IGxlbmd0aCA+IDAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNfKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUsIGludCBhcnJheUxlbmd0aCkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IGFycmF5TGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoYXJyYXlbaV0gPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29udGFpbnMoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7Ci0JCXJldHVybiBjb250YWlucyhhcnJheSwgdmFsdWUsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUsIGludCBhcnJheUxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gZmFsc2UgOiBjb250YWluc18oYXJyYXksIHZhbHVlLCBhcnJheUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zXyhjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUsIGludCBhcnJheUxlbmd0aCkgewotCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zKGludFtdIGFycmF5LCBpbnQgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCXJldHVybiBjb250YWlucyhhcnJheSwgdmFsdWUsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhpbnRbXSBhcnJheSwgaW50IHZhbHVlLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGZhbHNlIDogY29udGFpbnNfKGFycmF5LCB2YWx1ZSwgYXJyYXlMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc18oaW50W10gYXJyYXksIGludCB2YWx1ZSwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheUxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5zIGFsbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChhcnJheSwgY29sbGVjdGlvbi5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGFycmF5LCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJLy8gdXNlIGhhc2hlZCBsb29rdXAKLQkJSGFzaFNldDxPYmplY3Q+IHNldCA9IENvbGxlY3Rpb25Ub29scy5zZXQoYXJyYXkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoICEgc2V0LmNvbnRhaW5zKGl0ZXJhdG9yLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3QuLi4gYXJyYXkyKSB7Ci0JCS8vIHVzZSBoYXNoZWQgbG9va3VwCi0JCUhhc2hTZXQ8T2JqZWN0PiBzZXQgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KGFycmF5MSk7Ci0JCWZvciAoaW50IGkgPSBhcnJheTIubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBzZXQuY29udGFpbnMoYXJyYXkyW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgMi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29udGFpbnNBbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKGNoYXJbXSBhcnJheTEsIGNoYXIuLi4gYXJyYXkyKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheTIubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb250YWlucyhhcnJheTEsIGFycmF5MltpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoaW50W10gYXJyYXkxLCBpbnQuLi4gYXJyYXkyKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheTIubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb250YWlucyhhcnJheTEsIGFycmF5MltpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpZmYgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQsIGJlZ2lubmluZyBhdCB0aGUgZW5kLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIC0xLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGRpZmZlcmVudCBzaXplcywgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUKLQkgKiBsYXN0IGVsZW1lbnQgaW4gdGhlIGxvbmdlciBhcnJheS4KLQkgKiBVc2UgdGhlIGVsZW1lbnRzJyB7QGxpbmsgT2JqZWN0I2VxdWFscygpfSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBkaWZmRW5kKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWludCBsZW4xID0gYXJyYXkxLmxlbmd0aDsKLQkJaW50IGxlbjIgPSBhcnJheTIubGVuZ3RoOwotCQlpZiAobGVuMSAhPSBsZW4yKSB7Ci0JCQlyZXR1cm4gTWF0aC5tYXgobGVuMSwgbGVuMikgLSAxOwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW4xIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCU9iamVjdCBvID0gYXJyYXkxW2ldOwotCQkJaWYgKG8gPT0gbnVsbCkgewotCQkJCWlmIChhcnJheTJbaV0gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICggISBvLmVxdWFscyhhcnJheTJbaV0pKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByYW5nZSBvZiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiBbc2l6ZSwgLTFdLgotCSAqIFVzZSB0aGUgZWxlbWVudHMnIHtAbGluayBPYmplY3QjZXF1YWxzKCl9IG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqIEBzZWUgI2RpZmZTdGFydChPYmplY3RbXSwgT2JqZWN0W10pCi0JICogQHNlZSAjZGlmZkVuZChPYmplY3RbXSwgT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyBSYW5nZSBkaWZmUmFuZ2UoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaW50IGVuZCA9IGRpZmZFbmQoYXJyYXkxLCBhcnJheTIpOwotCQlpZiAoZW5kID09IC0xKSB7Ci0JCQkvLyB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgdGhlIHN0YXJ0IGlzIHRoZSBzaXplIG9mIHRoZSB0d28gbGlzdHMKLQkJCXJldHVybiBuZXcgUmFuZ2UoYXJyYXkxLmxlbmd0aCwgZW5kKTsKLQkJfQotCQkvLyB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCwgY2FsY3VsYXRlIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UKLQkJcmV0dXJuIG5ldyBSYW5nZShkaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpLCBlbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybgotCSAqIHRoZSBzaXplIG9mIHRoZSB0d28gYXJyYXlzIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4KS4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2hvcnRlciBhcnJheSBtYXRjaCB0aGVpciBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluCi0JICogdGhlIGxvbmdlciBhcnJheSwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzaG9ydGVyIGFycmF5Ci0JICogKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNob3J0ZXIgYXJyYXkpLgotCSAqIFVzZSB0aGUgZWxlbWVudHMnIHtAbGluayBPYmplY3QjZXF1YWxzKCl9IG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZTdGFydChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlpbnQgZW5kID0gTWF0aC5taW4oYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW5kOyBpKyspIHsKLQkJCU9iamVjdCBvID0gYXJyYXkxW2ldOwotCQkJaWYgKG8gPT0gbnVsbCkgewotCQkJCWlmIChhcnJheTJbaV0gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICggISBvLmVxdWFscyhhcnJheTJbaV0pKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZW5kOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpZGVudGl0eSBkaWZmICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LCBiZWdpbm5pbmcgYXQgdGhlIGVuZC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiAtMS4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBkaWZmZXJlbnQgc2l6ZXMsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlCi0JICogbGFzdCBlbGVtZW50IGluIHRoZSBsb25nZXIgYXJyYXkuCi0JICogVXNlIG9iamVjdCBpZGVudGl0eSB0byBjb21wYXJlIHRoZSBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpZGVudGl0eURpZmZFbmQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaW50IGxlbjEgPSBhcnJheTEubGVuZ3RoOwotCQlpbnQgbGVuMiA9IGFycmF5Mi5sZW5ndGg7Ci0JCWlmIChsZW4xICE9IGxlbjIpIHsKLQkJCXJldHVybiBNYXRoLm1heChsZW4xLCBsZW4yKSAtIDE7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjEgLSAxOyBpID4gLTE7IGktLSkgewotCQkJaWYgKGFycmF5MVtpXSAhPSBhcnJheTJbaV0pIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByYW5nZSBvZiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiBbc2l6ZSwgLTFdLgotCSAqIFVzZSBvYmplY3QgaWRlbnRpdHkgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMuCi0JICogQHNlZSAjaWRlbnRpdHlEaWZmU3RhcnQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqIEBzZWUgI2lkZW50aXR5RGlmZkVuZChPYmplY3RbXSwgT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyBSYW5nZSBpZGVudGl0eURpZmZSYW5nZShPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlpbnQgZW5kID0gaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKTsKLQkJaWYgKGVuZCA9PSAtMSkgewotCQkJLy8gdGhlIGxpc3RzIGFyZSBpZGVudGljYWwsIHRoZSBzdGFydCBpcyB0aGUgc2l6ZSBvZiB0aGUgdHdvIGxpc3RzCi0JCQlyZXR1cm4gbmV3IFJhbmdlKGFycmF5MS5sZW5ndGgsIGVuZCk7Ci0JCX0KLQkJLy8gdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQsIGNhbGN1bGF0ZSB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlCi0JCXJldHVybiBuZXcgUmFuZ2UoaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpLCBlbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybgotCSAqIHRoZSBzaXplIG9mIHRoZSB0d28gYXJyYXlzIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4KS4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2hvcnRlciBhcnJheSBtYXRjaCB0aGVpciBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluCi0JICogdGhlIGxvbmdlciBhcnJheSwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzaG9ydGVyIGFycmF5Ci0JICogKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNob3J0ZXIgYXJyYXkpLgotCSAqIFVzZSBvYmplY3QgaWRlbnRpdHkgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaWRlbnRpdHlEaWZmU3RhcnQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaW50IGVuZCA9IE1hdGgubWluKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlpZiAoYXJyYXkxW2ldICE9IGFycmF5MltpXSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVsZW1lbnRzIGFyZSBpZGVudGljYWwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheXMgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuaWRlbnRpY2FsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudHNBcmVJZGVudGljYWwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaWYgKGFycmF5MSA9PSBhcnJheTIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhcnJheTEgPT0gbnVsbCB8fCBhcnJheTIgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBsZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlpZiAoYXJyYXkyLmxlbmd0aCAhPSBsZW5ndGgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheTFbaV0gIT0gYXJyYXkyW2ldKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRleCBvZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmluZGV4T2YoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQlpZiAoYXJyYXlbaV0gPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhhcnJheVtpXSkpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmlkZW50aXR5SW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGlkZW50aXR5SW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmluZGV4T2YoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5pbmRleE9mKGludFtdIGFycmF5LCBpbnQgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoaW50W10gYXJyYXksIGludCB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGlvbiBpbmRleCBvZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1heGltdW0gaW5kZXggb2Ygd2hlcmUgdGhlIHNwZWNpZmllZCBjb21wYXJhYmxlIG9iamVjdAotCSAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgc29ydGVkIGFycmF5IGFuZCBzdGlsbCBrZWVwCi0JICogdGhlIGFycmF5IHNvcnRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBpbnQgaW5zZXJ0aW9uSW5kZXhPZihFW10gc29ydGVkQXJyYXksIENvbXBhcmFibGU8RT4gdmFsdWUpIHsKLQkJaW50IGxlbiA9IHNvcnRlZEFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKHZhbHVlLmNvbXBhcmVUbyhzb3J0ZWRBcnJheVtpXSkgPCAwKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1heGltdW0gaW5kZXggb2Ygd2hlcmUgdGhlIHNwZWNpZmllZCBjb21wYXJhYmxlIG9iamVjdAotCSAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgc29ydGVkIGFycmF5IGFuZCBzdGlsbCBrZWVwCi0JICogdGhlIGFycmF5IHNvcnRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBpbnQgaW5zZXJ0aW9uSW5kZXhPZihFW10gc29ydGVkQXJyYXksIEUgdmFsdWUsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCWludCBsZW4gPSBzb3J0ZWRBcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChjb21wYXJhdG9yLmNvbXBhcmUodmFsdWUsIHNvcnRlZEFycmF5W2ldKSA8IDApIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsYXN0IGluZGV4IG9mICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5OwotCSAqIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5sYXN0SW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJCWlmIChhcnJheVtpXSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmxhc3RJbmRleE9mKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5sYXN0SW5kZXhPZihpbnRbXSBhcnJheSwgaW50IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaW4vbWF4ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2hhcmFjdGVyIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBtaW5pbXVtIHZhbHVlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5taW4oY2hhcltdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXIgbWluKGNoYXIuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JCWludCBsYXN0ID0gbGVuIC0gMTsKLQkJY2hhciBtaW4gPSBhcnJheVtsYXN0XTsKLQkJZm9yIChpbnQgaSA9IGxhc3Q7IGktLSA+IDA7ICkgewotCQkJY2hhciBjID0gYXJyYXlbaV07Ci0JCQlpZiAoYyA8IG1pbikgewotCQkJCW1pbiA9IGM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1pbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGludGVnZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG1pbmltdW0gdmFsdWUuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLm1pbihpbnRbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbWluKGludC4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaW50IGxhc3QgPSBsZW4gLSAxOwotCQlpbnQgbWluID0gYXJyYXlbbGFzdF07Ci0JCWZvciAoaW50IGkgPSBsYXN0OyBpLS0gPiAwOyApIHsKLQkJCWludCB4ID0gYXJyYXlbaV07Ci0JCQlpZiAoeCA8IG1pbikgewotCQkJCW1pbiA9IHg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1pbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbWF4aW11bSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubWF4KGNoYXJbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIG1heChjaGFyLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCQlpbnQgbGFzdCA9IGxlbiAtIDE7Ci0JCWNoYXIgbWF4ID0gYXJyYXlbbGFzdF07Ci0JCWZvciAoaW50IGkgPSBsYXN0OyBpLS0gPiAwOyApIHsKLQkJCWNoYXIgYyA9IGFycmF5W2ldOwotCQkJaWYgKGMgPiBtYXgpIHsKLQkJCQltYXggPSBjOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbnRlZ2VyIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBtYXhpbXVtIHZhbHVlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5tYXgoaW50W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IG1heChpbnQuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JCWludCBsYXN0ID0gbGVuIC0gMTsKLQkJaW50IG1heCA9IGFycmF5W2xhc3RdOwotCQlmb3IgKGludCBpID0gbGFzdDsgaS0tID4gMDsgKSB7Ci0JCQlpbnQgeCA9IGFycmF5W2ldOwotCQkJaWYgKHggPiBtYXgpIHsKLQkJCQltYXggPSB4OwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1vdmUgKioqKioqKioqKgotCi0JLyoqCi0JICogTW92ZSBhbiBlbGVtZW50IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5tb3ZlKE9iamVjdFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIG1vdmUoRVtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlyZXR1cm4gKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSA/IGFycmF5IDogbW92ZV8oYXJyYXksIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRhcmdldCBpbmRleCAhPSBzb3VyY2UgaW5kZXgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIG1vdmVfKEVbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJRSB0ZW1wID0gYXJyYXlbc291cmNlSW5kZXhdOwotCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgdGFyZ2V0SW5kZXgsIGFycmF5LCB0YXJnZXRJbmRleCArIDEsIHNvdXJjZUluZGV4IC0gdGFyZ2V0SW5kZXgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXggKyAxLCBhcnJheSwgc291cmNlSW5kZXgsIHRhcmdldEluZGV4IC0gc291cmNlSW5kZXgpOwotCQl9Ci0JCWFycmF5W3RhcmdldEluZGV4XSA9IHRlbXA7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5tb3ZlKE9iamVjdFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIG1vdmUoRVtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlpZiAoKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSB8fCAobGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaWYgKGxlbmd0aCA9PSAxKSB7Ci0JCQlyZXR1cm4gbW92ZV8oYXJyYXksIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJRVtdIHRlbXAgPSBuZXdBcnJheShhcnJheSwgbGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXgsIHRlbXAsIDAsIGxlbmd0aCk7Ci0JCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCB0YXJnZXRJbmRleCwgYXJyYXksIHRhcmdldEluZGV4ICsgbGVuZ3RoLCBzb3VyY2VJbmRleCAtIHRhcmdldEluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4ICsgbGVuZ3RoLCBhcnJheSwgc291cmNlSW5kZXgsIHRhcmdldEluZGV4IC0gc291cmNlSW5kZXgpOwotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgYXJyYXksIHRhcmdldEluZGV4LCBsZW5ndGgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBhbiBlbGVtZW50IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5tb3ZlKGludFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBtb3ZlKGludFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlyZXR1cm4gKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSA/IGFycmF5IDogbW92ZV8oYXJyYXksIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRhcmdldEluZGV4ICE9IHNvdXJjZUluZGV4Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gbW92ZV8oaW50W10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCWludCB0ZW1wID0gYXJyYXlbc291cmNlSW5kZXhdOwotCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgdGFyZ2V0SW5kZXgsIGFycmF5LCB0YXJnZXRJbmRleCArIDEsIHNvdXJjZUluZGV4IC0gdGFyZ2V0SW5kZXgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXggKyAxLCBhcnJheSwgc291cmNlSW5kZXgsIHRhcmdldEluZGV4IC0gc291cmNlSW5kZXgpOwotCQl9Ci0JCWFycmF5W3RhcmdldEluZGV4XSA9IHRlbXA7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5tb3ZlKGludFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBtb3ZlKGludFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlpZiAoKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSB8fCAobGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaWYgKGxlbmd0aCA9PSAxKSB7Ci0JCQlyZXR1cm4gbW92ZV8oYXJyYXksIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJaW50W10gdGVtcCA9IG5ldyBpbnRbbGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXgsIHRlbXAsIDAsIGxlbmd0aCk7Ci0JCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCB0YXJnZXRJbmRleCwgYXJyYXksIHRhcmdldEluZGV4ICsgbGVuZ3RoLCBzb3VyY2VJbmRleCAtIHRhcmdldEluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4ICsgbGVuZ3RoLCBhcnJheSwgc291cmNlSW5kZXgsIHRhcmdldEluZGV4IC0gc291cmNlSW5kZXgpOwotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgYXJyYXksIHRhcmdldEluZGV4LCBsZW5ndGgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBhbiBlbGVtZW50IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5tb3ZlKGNoYXJbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIG1vdmUoY2hhcltdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlyZXR1cm4gKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSA/IGFycmF5IDogbW92ZV8oYXJyYXksIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRhcmdldEluZGV4ICE9IHNvdXJjZUluZGV4Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIG1vdmVfKGNoYXJbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJY2hhciB0ZW1wID0gYXJyYXlbc291cmNlSW5kZXhdOwotCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgdGFyZ2V0SW5kZXgsIGFycmF5LCB0YXJnZXRJbmRleCArIDEsIHNvdXJjZUluZGV4IC0gdGFyZ2V0SW5kZXgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXggKyAxLCBhcnJheSwgc291cmNlSW5kZXgsIHRhcmdldEluZGV4IC0gc291cmNlSW5kZXgpOwotCQl9Ci0JCWFycmF5W3RhcmdldEluZGV4XSA9IHRlbXA7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5tb3ZlKGNoYXJbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIG1vdmUoY2hhcltdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlpZiAoKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSB8fCAobGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaWYgKGxlbmd0aCA9PSAxKSB7Ci0JCQlyZXR1cm4gbW92ZV8oYXJyYXksIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJY2hhcltdIHRlbXAgPSBuZXcgY2hhcltsZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCwgdGVtcCwgMCwgbGVuZ3RoKTsKLQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHRhcmdldEluZGV4LCBhcnJheSwgdGFyZ2V0SW5kZXggKyBsZW5ndGgsIHNvdXJjZUluZGV4IC0gdGFyZ2V0SW5kZXgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXggKyBsZW5ndGgsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBhcnJheSwgdGFyZ2V0SW5kZXgsIGxlbmd0aCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmUoRVtdIGFycmF5LCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRBdEluZGV4KGFycmF5LCBpbmRleE9mKGFycmF5LCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIGluZGV4T2YoYXJyYXksIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmUoaW50W10gYXJyYXksIGludCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZW1vdmUoaW50W10gYXJyYXksIGludCB2YWx1ZSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIGluZGV4T2YoYXJyYXksIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUZpcnN0KE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlRmlyc3QoRVtdIGFycmF5KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUZpcnN0KGNoYXJbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlRmlyc3QoY2hhcltdIGFycmF5KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUZpcnN0KGludFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZUZpcnN0KGludFtdIGFycmF5KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBsYXN0IGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlTGFzdChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUxhc3QoRVtdIGFycmF5KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgYXJyYXkubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBsYXN0IGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlTGFzdChjaGFyW10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUxhc3QoY2hhcltdIGFycmF5KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgYXJyYXkubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBsYXN0IGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlTGFzdChpbnRbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZW1vdmVMYXN0KGludFtdIGFycmF5KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgYXJyYXkubGVuZ3RoIC0gMSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBhbGwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUFsbChPYmplY3RbXSBhcnJheSwgSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5LCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gcmVtb3ZlQWxsKGFycmF5LCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsKEVbXSBhcnJheSwgSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbChhcnJheSwgaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCS8vIGNvbnZlcnQgdG8gYSBzZXQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgaGFzaGVkIGxvb2stdXAKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IHJlbW92ZUFsbF8oYXJyYXksIENvbGxlY3Rpb25Ub29scy5zZXQoaXRlcmF0b3IpKSA6IGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUFsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQkvLyBjb252ZXJ0IHRvIGEgc2V0IHRvIHRha2UgYWR2YW50YWdlIG9mIGhhc2hlZCBsb29rLXVwCi0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyByZW1vdmVBbGxfKGFycmF5LCBDb2xsZWN0aW9uVG9vbHMuc2V0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpKSA6IGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUFsbChPYmplY3RbXSBhcnJheSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBjb2xsZWN0aW9uLmlzRW1wdHkoKSA/IGFycmF5IDogcmVtb3ZlQWxsXyhhcnJheSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGxfKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiByZW1vdmVBbGwoYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5OyBjaGVjayBhcnJheSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBhcnJheSA6IHJlbW92ZUFsbF8oYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5TGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBpcyBub24tZW1wdHkgYW5kIGFycmF5IGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbF8oRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIGludCBhcnJheUxlbmd0aCkgewotCQkvLyBidWlsZCB0aGUgaW5kaWNlcyBvZiB0aGUgZWxlbWVudHMgdGhhdCBhcmUgdG8gcmVtYWluCi0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5TGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHsKLQkJCWlmICggISBjb2xsZWN0aW9uLmNvbnRhaW5zKGFycmF5W2ldKSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXlMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTsgIC8vIG5vdGhpbmcgd2FzIHJlbW92ZWQKLQkJfQotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGopOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXlbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgZmlyc3Qgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2Vjb25kIHNwZWNpZmllZCBhcnJheSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUFsbChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXkxLCBPYmplY3QuLi4gYXJyYXkyKSB7Ci0JCS8vIGNvbnZlcnQgdG8gYSBzZXQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgaGFzaGVkIGxvb2stdXAKLQkJcmV0dXJuIChhcnJheTIubGVuZ3RoID09IDApID8gYXJyYXkxIDogcmVtb3ZlQWxsXyhhcnJheTEsIENvbGxlY3Rpb25Ub29scy5zZXQoYXJyYXkyKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cyNyZW1vdmVBbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsKGNoYXJbXSBhcnJheTEsIGNoYXIuLi4gYXJyYXkyKSB7Ci0JCWlmIChhcnJheTIubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTE7Ci0JCX0KLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCWlmIChhcnJheTFMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5MTsKLQkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheTFMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkxTGVuZ3RoOyBpKyspIHsKLQkJCWlmICggISBjb250YWlucyhhcnJheTIsIGFycmF5MVtpXSkpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5MUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5MTsgIC8vIG5vdGhpbmcgd2FzIHJlbW92ZWQKLQkJfQotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbal07Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheTFbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgZmlyc3Qgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2Vjb25kIHNwZWNpZmllZCBhcnJheSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzI3JlbW92ZUFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZW1vdmVBbGwoaW50W10gYXJyYXkxLCBpbnQuLi4gYXJyYXkyKSB7Ci0JCWlmIChhcnJheTIubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTE7Ci0JCX0KLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCWlmIChhcnJheTFMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5MTsKLQkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheTFMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkxTGVuZ3RoOyBpKyspIHsKLQkJCWlmICggISBjb250YWlucyhhcnJheTIsIGFycmF5MVtpXSkpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5MUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5MTsgIC8vIG5vdGhpbmcgd2FzIHJlbW92ZWQKLQkJfQotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2pdOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXkxW2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgb2NjdXJyZW5jZXMgb2YKLQkgKiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsT2NjdXJyZW5jZXMoRVtdIGFycmF5LCBPYmplY3QgdmFsdWUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoYXJyYXlMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5TGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IGFycmF5TGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoYXJyYXlbaV0gIT0gbnVsbCkgewotCQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmICggISB2YWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5TGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXk7ICAvLyBub3RoaW5nIHdhcyByZW1vdmVkCi0JCX0KLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBqKTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5W2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgb2NjdXJyZW5jZXMgb2YKLQkgKiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUFsbE9jY3VycmVuY2VzKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChhcnJheUxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXlMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSBhcnJheUxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gIT0gdmFsdWUpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5TGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXk7ICAvLyBub3RoaW5nIHdhcyByZW1vdmVkCi0JCX0KLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2pdOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXlbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCBvY2N1cnJlbmNlcyBvZgotCSAqIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGludFtdIGFycmF5LCBpbnQgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlQWxsT2NjdXJyZW5jZXMoaW50W10gYXJyYXksIGludCB2YWx1ZSkgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChhcnJheUxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXlMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSBhcnJheUxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gIT0gdmFsdWUpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5TGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXk7ICAvLyBub3RoaW5nIHdhcyByZW1vdmVkCi0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5W2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBkdXBsaWNhdGUgZWxlbWVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIGFueSBkdXBsaWNhdGUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHdoaWxlIG1haW50YWluaW5nIHRoZSBvcmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlRHVwbGljYXRlRWxlbWVudHMoRS4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJQXJyYXlMaXN0PEU+IHRlbXAgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChhcnJheSk7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHModGVtcCwgbGVuKSA/Ci0JCQkJCXRlbXAudG9BcnJheShuZXdBcnJheShhcnJheSwgdGVtcC5zaXplKCkpKSA6Ci0JCQkJCWFycmF5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZWxlbWVudCBhdCBpbmRleCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUVsZW1lbnRBdEluZGV4KE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVFbGVtZW50QXRJbmRleChFW10gYXJyYXksIGludCBpbmRleCkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudHNBdEluZGV4KGFycmF5LCBpbmRleCwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVFbGVtZW50QXRJbmRleChjaGFyW10gYXJyYXksIGludCBpbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlRWxlbWVudEF0SW5kZXgoY2hhcltdIGFycmF5LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRzQXRJbmRleChhcnJheSwgaW5kZXgsIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlRWxlbWVudEF0SW5kZXgoaW50W10gYXJyYXksIGludCBpbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZW1vdmVFbGVtZW50QXRJbmRleChpbnRbXSBhcnJheSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50c0F0SW5kZXgoYXJyYXksIGluZGV4LCAxKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnRzIGF0IGluZGV4ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlRWxlbWVudHNBdEluZGV4KEVbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJaW50IG5ld0xlbmd0aCA9IGFycmF5TGVuZ3RoIC0gbGVuZ3RoOwotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIG5ld0xlbmd0aCk7Ci0JCWlmICgobmV3TGVuZ3RoID09IDApICYmIChpbmRleCA9PSAwKSkgewotCQkJcmV0dXJuIHJlc3VsdDsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJaWYgKGluZGV4ICE9IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQl9Ci0JCWludCBsZW5ndGgyID0gbmV3TGVuZ3RoIC0gaW5kZXg7Ci0JCWlmIChsZW5ndGgyICE9IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4ICsgbGVuZ3RoLCByZXN1bHQsIGluZGV4LCBsZW5ndGgyKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChjaGFyW10gYXJyYXksIGludCBpbmRleCwgaW50IGxlbmd0aCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVFbGVtZW50c0F0SW5kZXgoY2hhcltdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpbnQgbmV3TGVuZ3RoID0gYXJyYXlMZW5ndGggLSBsZW5ndGg7Ci0JCWlmICgobmV3TGVuZ3RoID09IDApICYmIChpbmRleCA9PSAwKSkgewotCQkJcmV0dXJuIEVNUFRZX0NIQVJfQVJSQVk7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltuZXdMZW5ndGhdOwotCQlpZiAoaW5kZXggIT0gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCX0KLQkJaW50IGxlbmd0aDIgPSBuZXdMZW5ndGggLSBpbmRleDsKLQkJaWYgKGxlbmd0aDIgIT0gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXggKyBsZW5ndGgsIHJlc3VsdCwgaW5kZXgsIGxlbmd0aDIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGludFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZW1vdmVFbGVtZW50c0F0SW5kZXgoaW50W10gYXJyYXksIGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCWludCBuZXdMZW5ndGggPSBhcnJheUxlbmd0aCAtIGxlbmd0aDsKLQkJaWYgKChuZXdMZW5ndGggPT0gMCkgJiYgKGluZGV4ID09IDApKSB7Ci0JCQlyZXR1cm4gRU1QVFlfSU5UX0FSUkFZOyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJfQotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W25ld0xlbmd0aF07Ci0JCWlmIChpbmRleCAhPSAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJfQotCQlpbnQgbGVuZ3RoMiA9IG5ld0xlbmd0aCAtIGluZGV4OwotCQlpZiAobGVuZ3RoMiAhPSAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCArIGxlbmd0aCwgcmVzdWx0LCBpbmRleCwgbGVuZ3RoMik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVwbGFjZSBhbGwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBvbGQgdmFsdWUgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlLiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlcGxhY2VBbGwoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVwbGFjZUFsbChFW10gYXJyYXksIE9iamVjdCBvbGRWYWx1ZSwgRSBuZXdWYWx1ZSkgewotCQlpZiAob2xkVmFsdWUgPT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGFycmF5W2ldID09IG51bGwpIHsKLQkJCQkJYXJyYXlbaV0gPSBuZXdWYWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAob2xkVmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCQlhcnJheVtpXSA9IG5ld1ZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBvbGQgdmFsdWUgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlLiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICo8cD4KLQkgKiA8Y29kZT4gQXJyYXlzLnJlcGxhY2VBbGwoaW50W10gYXJyYXksIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlcGxhY2VBbGwoaW50W10gYXJyYXksIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IG9sZFZhbHVlKSB7Ci0JCQkJYXJyYXlbaV0gPSBuZXdWYWx1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBvbGQgdmFsdWUgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlLiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlcGxhY2VBbGwoY2hhcltdIGFycmF5LCBjaGFyIG9sZFZhbHVlLCBjaGFyIG5ld1ZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZXBsYWNlQWxsKGNoYXJbXSBhcnJheSwgY2hhciBvbGRWYWx1ZSwgY2hhciBuZXdWYWx1ZSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSBvbGRWYWx1ZSkgewotCQkJCWFycmF5W2ldID0gbmV3VmFsdWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXRhaW4gYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldGFpbiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV0YWluQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbChFW10gYXJyYXksIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGFycmF5IDogcmV0YWluQWxsKGFycmF5LCBhcnJheUxlbmd0aCwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldGFpbkFsbChPYmplY3RbXSBhcnJheSwgSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBhcnJheSA6IHJldGFpbkFsbChhcnJheSwgYXJyYXlMZW5ndGgsIGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZXRhaW5BbGwoYXJyYXksIGFycmF5TGVuZ3RoLCBpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldGFpbkFsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBhcnJheSA6IHJldGFpbkFsbChhcnJheSwgYXJyYXlMZW5ndGgsIGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBpbnQgYXJyYXlMZW5ndGgsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPwotCQkJCXJldGFpbkFsbF8oYXJyYXksIENvbGxlY3Rpb25Ub29scy5zZXQoaXRlcmF0b3IpLCBhcnJheUxlbmd0aCkgOgotCQkJCW5ld0FycmF5KGFycmF5LCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgaW50IGFycmF5TGVuZ3RoLCBJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8KLQkJCQlyZXRhaW5BbGxfKGFycmF5LCBDb2xsZWN0aW9uVG9vbHMuc2V0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLCBhcnJheUxlbmd0aCkgOgotCQkJCW5ld0FycmF5KGFycmF5LCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV0YWluQWxsKE9iamVjdFtdIGFycmF5LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZXRhaW5BbGwoYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5TGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJcmV0dXJuIGNvbGxlY3Rpb24uaXNFbXB0eSgpID8KLQkJCQluZXdBcnJheShhcnJheSwgMCkgOgotCQkJCXJldGFpbkFsbF8oYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5TGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBpcyBub24tZW1wdHkgYW5kIGFycmF5IGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbF8oRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIGludCBhcnJheUxlbmd0aCkgewotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29sbGVjdGlvbi5jb250YWlucyhhcnJheVtpXSkpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5TGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXk7ICAvLyBldmVyeXRoaW5nIHdhcyByZXRhaW5lZAotCQl9Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgaik7Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV0YWluQWxsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlpbnQgYXJyYXkxTGVuZ3RoID0gYXJyYXkxLmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPwotCQkJCWFycmF5MSA6Ci0JCQkJKGFycmF5Mi5sZW5ndGggPT0gMCkgPwotCQkJCQluZXdBcnJheShhcnJheTEsIDApIDoKLQkJCQkJcmV0YWluQWxsKGFycmF5MSwgQ29sbGVjdGlvblRvb2xzLnNldChhcnJheTIpLCBhcnJheTFMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV0YWluQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJldGFpbkFsbChjaGFyW10gYXJyYXkxLCBjaGFyLi4uIGFycmF5MikgewotCQlpbnQgYXJyYXkxTGVuZ3RoID0gYXJyYXkxLmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPyBhcnJheTEgOiByZXRhaW5BbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDEgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSByZXRhaW5BbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCkgewotCQlpbnQgYXJyYXkyTGVuZ3RoID0gYXJyYXkyLmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBFTVBUWV9DSEFSX0FSUkFZIDogcmV0YWluQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gcmV0YWluQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5MUxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29udGFpbnNfKGFycmF5MiwgYXJyYXkxW2ldLCBhcnJheTJMZW5ndGgpKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheTFMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTE7ICAvLyBldmVyeXRoaW5nIHdhcyByZXRhaW5lZAotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5MVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV0YWluQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJldGFpbkFsbChpbnRbXSBhcnJheTEsIGludC4uLiBhcnJheTIpIHsKLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8gYXJyYXkxIDogcmV0YWluQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAxIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSByZXRhaW5BbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgpIHsKLQkJaW50IGFycmF5Mkxlbmd0aCA9IGFycmF5Mi5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkyTGVuZ3RoID09IDApID8gRU1QVFlfSU5UX0FSUkFZIDogcmV0YWluQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSByZXRhaW5BbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5MUxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29udGFpbnNfKGFycmF5MiwgYXJyYXkxW2ldLCBhcnJheTJMZW5ndGgpKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheTFMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTE7ICAvLyBldmVyeXRoaW5nIHdhcyByZXRhaW5lZAotCQl9Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbal07Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheTFbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmV2ZXJzZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5LCByZXZlcnNlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV2ZXJzZShPYmplY3QuLi4gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXZlcnNlKEUuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGkgPSAwLCBtaWQgPSBsZW4gPj4gMSwgaiA9IGxlbiAtIDE7IGkgPCBtaWQ7IGkrKywgai0tKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCBqKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSwgcmV2ZXJzZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldmVyc2UoY2hhci4uLiBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmV2ZXJzZShjaGFyLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBpID0gMCwgbWlkID0gbGVuID4+IDEsIGogPSBsZW4gLSAxOyBpIDwgbWlkOyBpKyssIGotLSkgewotCQkJc3dhcChhcnJheSwgaSwgaik7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXksIHJldmVyc2VkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXZlcnNlKGludC4uLiBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZXZlcnNlKGludC4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDAsIG1pZCA9IGxlbiA+PiAxLCBqID0gbGVuIC0gMTsgaSA8IG1pZDsgaSsrLCBqLS0pIHsKLQkJCXN3YXAoYXJyYXksIGksIGopOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcm90YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCBvbmUgcG9zaXRpb24uCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJvdGF0ZShPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJvdGF0ZShFLi4uIGFycmF5KSB7Ci0JCXJldHVybiByb3RhdGUoYXJyYXksIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCB0aGUgc3BlY2lmaWVkIGRpc3RhbmNlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yb3RhdGUoT2JqZWN0W10gYXJyYXksIGludCBkaXN0YW5jZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJvdGF0ZShFW10gYXJyYXksIGludCBkaXN0YW5jZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZGlzdGFuY2UgPSBkaXN0YW5jZSAlIGxlbjsKLQkJaWYgKGRpc3RhbmNlIDwgMCkgewotCQkJZGlzdGFuY2UgKz0gbGVuOwotCQl9Ci0JCWlmIChkaXN0YW5jZSA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgY3ljbGVTdGFydCA9IDAsIG5Nb3ZlZCA9IDA7IG5Nb3ZlZCAhPSBsZW47IGN5Y2xlU3RhcnQrKykgewotCQkJRSBkaXNwbGFjZWQgPSBhcnJheVtjeWNsZVN0YXJ0XTsKLQkJCWludCBpID0gY3ljbGVTdGFydDsKLQkJCWRvIHsKLQkJCQlpICs9IGRpc3RhbmNlOwotCQkJCWlmIChpID49IGxlbikgewotCQkJCQlpIC09IGxlbjsKLQkJCQl9Ci0JCQkJRSB0ZW1wID0gYXJyYXlbaV07Ci0JCQkJYXJyYXlbaV0gPSBkaXNwbGFjZWQ7Ci0JCQkJZGlzcGxhY2VkID0gdGVtcDsKLQkJCQluTW92ZWQgKys7Ci0JCQl9IHdoaWxlIChpICE9IGN5Y2xlU3RhcnQpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvdGF0ZWQgYXJyYXkgYWZ0ZXIgcm90YXRpbmcgaXQgb25lIHBvc2l0aW9uLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yb3RhdGUoY2hhcltdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByb3RhdGUoY2hhci4uLiBhcnJheSkgewotCQlyZXR1cm4gcm90YXRlKGFycmF5LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvdGF0ZWQgYXJyYXkgYWZ0ZXIgcm90YXRpbmcgaXQgdGhlIHNwZWNpZmllZCBkaXN0YW5jZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucm90YXRlKGNoYXJbXSBhcnJheSwgaW50IGRpc3RhbmNlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByb3RhdGUoY2hhcltdIGFycmF5LCBpbnQgZGlzdGFuY2UpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWRpc3RhbmNlID0gZGlzdGFuY2UgJSBsZW47Ci0JCWlmIChkaXN0YW5jZSA8IDApIHsKLQkJCWRpc3RhbmNlICs9IGxlbjsKLQkJfQotCQlpZiAoZGlzdGFuY2UgPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGN5Y2xlU3RhcnQgPSAwLCBuTW92ZWQgPSAwOyBuTW92ZWQgIT0gbGVuOyBjeWNsZVN0YXJ0KyspIHsKLQkJCWNoYXIgZGlzcGxhY2VkID0gYXJyYXlbY3ljbGVTdGFydF07Ci0JCQlpbnQgaSA9IGN5Y2xlU3RhcnQ7Ci0JCQlkbyB7Ci0JCQkJaSArPSBkaXN0YW5jZTsKLQkJCQlpZiAoaSA+PSBsZW4pIHsKLQkJCQkJaSAtPSBsZW47Ci0JCQkJfQotCQkJCWNoYXIgdGVtcCA9IGFycmF5W2ldOwotCQkJCWFycmF5W2ldID0gZGlzcGxhY2VkOwotCQkJCWRpc3BsYWNlZCA9IHRlbXA7Ci0JCQkJbk1vdmVkICsrOwotCQkJfSB3aGlsZSAoaSAhPSBjeWNsZVN0YXJ0KTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb3RhdGVkIGFycmF5IGFmdGVyIHJvdGF0aW5nIGl0IG9uZSBwb3NpdGlvbi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucm90YXRlKGludFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJvdGF0ZShpbnQuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHJvdGF0ZShhcnJheSwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb3RhdGVkIGFycmF5IGFmdGVyIHJvdGF0aW5nIGl0IHRoZSBzcGVjaWZpZWQgZGlzdGFuY2UuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJvdGF0ZShpbnRbXSBhcnJheSwgaW50IGRpc3RhbmNlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJvdGF0ZShpbnRbXSBhcnJheSwgaW50IGRpc3RhbmNlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlkaXN0YW5jZSA9IGRpc3RhbmNlICUgbGVuOwotCQlpZiAoZGlzdGFuY2UgPCAwKSB7Ci0JCQlkaXN0YW5jZSArPSBsZW47Ci0JCX0KLQkJaWYgKGRpc3RhbmNlID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBjeWNsZVN0YXJ0ID0gMCwgbk1vdmVkID0gMDsgbk1vdmVkICE9IGxlbjsgY3ljbGVTdGFydCsrKSB7Ci0JCQlpbnQgZGlzcGxhY2VkID0gYXJyYXlbY3ljbGVTdGFydF07Ci0JCQlpbnQgaSA9IGN5Y2xlU3RhcnQ7Ci0JCQlkbyB7Ci0JCQkJaSArPSBkaXN0YW5jZTsKLQkJCQlpZiAoaSA+PSBsZW4pIHsKLQkJCQkJaSAtPSBsZW47Ci0JCQkJfQotCQkJCWludCB0ZW1wID0gYXJyYXlbaV07Ci0JCQkJYXJyYXlbaV0gPSBkaXNwbGFjZWQ7Ci0JCQkJZGlzcGxhY2VkID0gdGVtcDsKLQkJCQluTW92ZWQgKys7Ci0JCQl9IHdoaWxlIChpICE9IGN5Y2xlU3RhcnQpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2h1ZmZsZSAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSYW5kb20gUkFORE9NID0gbmV3IFJhbmRvbSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc2h1ZmZsZShPYmplY3QuLi4gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzaHVmZmxlKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHNodWZmbGUoYXJyYXksIFJBTkRPTSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc2h1ZmZsZShPYmplY3RbXSBhcnJheSwgUmFuZG9tIHIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzaHVmZmxlKEVbXSBhcnJheSwgUmFuZG9tIHJhbmRvbSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCByYW5kb20ubmV4dEludChsZW4pKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc2h1ZmZsZShjaGFyLi4uIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzaHVmZmxlKGNoYXIuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHNodWZmbGUoYXJyYXksIFJBTkRPTSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc2h1ZmZsZShjaGFyW10gYXJyYXksIFJhbmRvbSByKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzaHVmZmxlKGNoYXJbXSBhcnJheSwgUmFuZG9tIHJhbmRvbSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCByYW5kb20ubmV4dEludChsZW4pKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc2h1ZmZsZShpbnQuLi4gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gc2h1ZmZsZShpbnQuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHNodWZmbGUoYXJyYXksIFJBTkRPTSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc2h1ZmZsZShpbnRbXSBhcnJheSwgUmFuZG9tIHIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gc2h1ZmZsZShpbnRbXSBhcnJheSwgUmFuZG9tIHJhbmRvbSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCByYW5kb20ubmV4dEludChsZW4pKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN1Yi1hcnJheSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIGVsZW1lbnRzIGNvcGllZCBmcm9tCi0JICogdGhlIHNwZWNpZmllZCByYW5nZS4gVGhlICJmcm9tIiBpbmRleCBpcyBpbmNsdXNpdmU7IHRoZSAidG8iIGluZGV4IGlzIGV4Y2x1c2l2ZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc3ViQXJyYXkoRVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHN1YkFycmF5KEVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJaW50IGxlbiA9IHRvSW5kZXggLSBmcm9tSW5kZXg7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgbGVuKTsKLQkJaWYgKGxlbiA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGZyb21JbmRleCwgcmVzdWx0LCAwLCBsZW4pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLWFycmF5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCBlbGVtZW50cyBjb3BpZWQgZnJvbQotCSAqIHRoZSBzcGVjaWZpZWQgcmFuZ2UuIFRoZSAiZnJvbSIgaW5kZXggaXMgaW5jbHVzaXZlOyB0aGUgInRvIiBpbmRleCBpcyBleGNsdXNpdmUuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnN1YkFycmF5KGludFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzdWJBcnJheShpbnRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJaW50IGxlbiA9IHRvSW5kZXggLSBmcm9tSW5kZXg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX0lOVF9BUlJBWTsKLQkJfQotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2xlbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGZyb21JbmRleCwgcmVzdWx0LCAwLCBsZW4pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1hcnJheSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggZWxlbWVudHMgY29waWVkIGZyb20KLQkgKiB0aGUgc3BlY2lmaWVkIHJhbmdlLiBUaGUgImZyb20iIGluZGV4IGlzIGluY2x1c2l2ZTsgdGhlICJ0byIgaW5kZXggaXMgZXhjbHVzaXZlLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIEFycmF5cy5zdWJBcnJheShjaGFyW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KTwvY29kZT4KLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc3ViQXJyYXkoY2hhcltdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlpbnQgbGVuID0gdG9JbmRleCAtIGZyb21JbmRleDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfQ0hBUl9BUlJBWTsKLQkJfQotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgZnJvbUluZGV4LCByZXN1bHQsIDAsIGxlbik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN3YXAgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGhhdmUgYmVlbiAic3dhcHBlZCIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnN3YXAoT2JqZWN0W10gYXJyYXksIGludCBpLCBpbnQgaik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHN3YXAoRVtdIGFycmF5LCBpbnQgaSwgaW50IGopIHsKLQkJcmV0dXJuIChpID09IGopID8gYXJyYXkgOiBzd2FwXyhhcnJheSwgaSwgaik7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBpbmRpY2VzIGFyZSBkaWZmZXJlbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIHN3YXBfKEVbXSBhcnJheSwgaW50IGksIGludCBqKSB7Ci0JCUUgdGVtcCA9IGFycmF5W2ldOwotCQlhcnJheVtpXSA9IGFycmF5W2pdOwotCQlhcnJheVtqXSA9IHRlbXA7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgaGF2ZSBiZWVuICJzd2FwcGVkIi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc3dhcChjaGFyW10gYXJyYXksIGludCBpLCBpbnQgaik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc3dhcChjaGFyW10gYXJyYXksIGludCBpLCBpbnQgaikgewotCQlyZXR1cm4gKGkgPT0gaikgPyBhcnJheSA6IHN3YXBfKGFycmF5LCBpLCBqKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIGluZGljZXMgYXJlIGRpZmZlcmVudAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBzd2FwXyhjaGFyW10gYXJyYXksIGludCBpLCBpbnQgaikgewotCQljaGFyIHRlbXAgPSBhcnJheVtpXTsKLQkJYXJyYXlbaV0gPSBhcnJheVtqXTsKLQkJYXJyYXlbal0gPSB0ZW1wOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGhhdmUgYmVlbiAic3dhcHBlZCIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnN3YXAoaW50W10gYXJyYXksIGludCBpLCBpbnQgaik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzd2FwKGludFtdIGFycmF5LCBpbnQgaSwgaW50IGopIHsKLQkJcmV0dXJuIChpID09IGopID8gYXJyYXkgOiBzd2FwXyhhcnJheSwgaSwgaik7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBpbmRpY2VzIGFyZSBkaWZmZXJlbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBzd2FwXyhpbnRbXSBhcnJheSwgaW50IGksIGludCBqKSB7Ci0JCWludCB0ZW1wID0gYXJyYXlbaV07Ci0JCWFycmF5W2ldID0gYXJyYXlbal07Ci0JCWFycmF5W2pdID0gdGVtcDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBcnJheXMgZW5oYW5jZW1lbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChib29sZWFuW10sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuW10gZmlsbChib29sZWFuW10gYXJyYXksIGJvb2xlYW4gdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChib29sZWFuW10sIGludCwgaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbltdIGZpbGwoYm9vbGVhbltdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgYm9vbGVhbiB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoYnl0ZVtdLCBieXRlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGZpbGwoYnl0ZVtdIGFycmF5LCBieXRlIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoYnl0ZVtdLCBpbnQsIGludCwgYnl0ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBmaWxsKGJ5dGVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIGJ5dGUgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGNoYXJbXSwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBmaWxsKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGNoYXJbXSwgaW50LCBpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gZmlsbChjaGFyW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBjaGFyIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChkb3VibGVbXSwgZG91YmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZG91YmxlW10gZmlsbChkb3VibGVbXSBhcnJheSwgZG91YmxlIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoZG91YmxlW10sIGludCwgaW50LCBkb3VibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBkb3VibGVbXSBmaWxsKGRvdWJsZVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChmbG9hdFtdLCBmbG9hdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZsb2F0W10gZmlsbChmbG9hdFtdIGFycmF5LCBmbG9hdCB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGZsb2F0W10sIGludCwgaW50LCBmbG9hdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZsb2F0W10gZmlsbChmbG9hdFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgZmxvYXQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGludFtdLCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBmaWxsKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChpbnRbXSwgaW50LCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGZpbGwoaW50W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBpbnQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKE9iamVjdFtdLCBPYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGZpbGwoRVtdIGFycmF5LCBFIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoT2JqZWN0W10sIGludCwgaW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGZpbGwoRVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgRSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwobG9uZ1tdLCBsb25nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgbG9uZ1tdIGZpbGwobG9uZ1tdIGFycmF5LCBsb25nIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwobG9uZ1tdLCBpbnQsIGludCwgbG9uZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmdbXSBmaWxsKGxvbmdbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIGxvbmcgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKHNob3J0W10sIHNob3J0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc2hvcnRbXSBmaWxsKHNob3J0W10gYXJyYXksIHNob3J0IHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoc2hvcnRbXSwgaW50LCBpbnQsIHNob3J0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc2hvcnRbXSBmaWxsKHNob3J0W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBzaG9ydCB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoYnl0ZVtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIHNvcnQoYnl0ZS4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoYnl0ZVtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBzb3J0KGJ5dGVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoY2hhcltdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHNvcnQoY2hhci4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzb3J0KGNoYXJbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoZG91YmxlW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBkb3VibGVbXSBzb3J0KGRvdWJsZS4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoZG91YmxlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZG91YmxlW10gc29ydChkb3VibGVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoZmxvYXRbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZsb2F0W10gc29ydChmbG9hdC4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoZmxvYXRbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmbG9hdFtdIHNvcnQoZmxvYXRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoaW50W10pCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzb3J0KGludC4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoaW50W10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gc29ydChpbnRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHNvcnQoRS4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoT2JqZWN0W10sIENvbXBhcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHNvcnQoRVtdIGFycmF5LCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlBcnJheXMuc29ydChhcnJheSwgY29tcGFyYXRvcik7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoT2JqZWN0W10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzb3J0KEVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoT2JqZWN0W10sIGludCwgaW50LCBDb21wYXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzb3J0KEVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIGNvbXBhcmF0b3IpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGxvbmdbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmdbXSBzb3J0KGxvbmcuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGxvbmdbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBsb25nW10gc29ydChsb25nW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KHNob3J0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyBzaG9ydFtdIHNvcnQoc2hvcnQuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KHNob3J0W10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc2hvcnRbXSBzb3J0KHNob3J0W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBBcnJheVRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Bc3NvY2lhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0Fzc29jaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMTMwZTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0Fzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBkZWZpbml0aW9uIG9mIGFuIG9iamVjdCBwYWlyaW5nLgotICogVGhlIGtleSBpcyBpbW11dGFibGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzb2NpYXRpb248SywgVj4gewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhc3NvY2lhdGlvbidzIGtleS4KLQkgKi8KLQlLIGtleSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhc3NvY2lhdGlvbidzIHZhbHVlLgotCSAqLwotCVYgdmFsdWUoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgYXNzb2NpYXRpb24ncyB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCVYgc2V0VmFsdWUoViB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBib3RoIHRoZSBhc3NvY2lhdGlvbnMnIGtleXMgYW5kIHZhbHVlcwotCSAqIGFyZSBlcXVhbC4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhPYmplY3Qgbyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBoYXNoIGNvZGUgYmFzZWQgb24gdGhlIGFzc29jaWF0aW9uJ3MKLQkgKiBrZXkgYW5kIHZhbHVlLgotCSAqLwotCWludCBoYXNoQ29kZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZjRmNDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0FzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgZXhlY3V0b3Igd2lsbCBkaXNwYXRjaCBjb21tYW5kcyB0byBiZSBleGVjdXRlZCBpbiBhIHNlcGFyYXRlCi0gKiB0aHJlYWQsIGFsbG93aW5nIGNhbGxzIHRvIHtAbGluayBDb21tYW5kRXhlY3V0b3IjZXhlY3V0ZShDb21tYW5kKX0gdG8gcmV0dXJuCi0gKiBpbW1lZGlhdGVseS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIGNsaWVudC1zdXBwbGllZCBjb21tYW5kcyBzaG91bGQgaGFuZGxlIGFueQotICogZXhjZXB0aW9uIGFwcHJvcHJpYXRlbHkgKGUuZy4gbG9nIHRoZSBleGNlcHRpb24gYW5kIHJldHVybiBncmFjZWZ1bGx5KSBzbwotICogdGhlIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZCBjYW4gY29udGludWUgZXhlY3V0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yCi0JaW1wbGVtZW50cyBTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcgotewotCS8qKgotCSAqIFRoaXMgY29tbWFuZCBxdWV1ZSBpcyBzaGFyZWQgd2l0aCB0aGUgY29tbWFuZCBleGVjdXRpb24vY29uc3VtZXIgdGhyZWFkLgotCSAqIEFkZGluZyBhIGNvbW1hbmQgdG8gaXQgd2lsbCB0cmlnZ2VyIHRoZSBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoZQotCSAqIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZCBvciwgaWYgYW5vdGhlciBjb21tYW5kIGlzIGN1cnJlbnRseSBleGVjdXRpbmcsCi0JICogdG8gZXhlY3V0ZSB0aGUgbmV3IGNvbW1hbmQgb25jZSB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBjb21tYW5kIGhhcwotCSAqIGZpbmlzaGVkIGV4ZWN1dGluZy4KLQkgKi8KLQlmaW5hbCBTeW5jaHJvbml6ZWRRdWV1ZTxDb21tYW5kPiBjb21tYW5kcyA9IG5ldyBTeW5jaHJvbml6ZWRRdWV1ZTxDb21tYW5kPigpOwotCi0JLyoqCi0JICogTW9zdCBvZiB0aGUgdGhyZWFkLXJlbGF0ZWQgYmVoYXZpb3IgaXMgZGVsZWdhdGVkIHRvIHRoaXMgY29vcmRpbmF0b3IuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yIGNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3I7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3luY2hyb25vdXMgY29tbWFuZCBleGVjdXRvci4KLQkgKiBVc2Ugc2ltcGxlIEpESyB0aHJlYWQocykgZm9yIHRoZSBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQocykuCi0JICogQWxsb3cgdGhlIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZChzKSB0byBiZSBhc3NpZ25lZCBKREstZ2VuZXJhdGVkIG5hbWVzLgotCSAqLwotCXB1YmxpYyBBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXRoaXMoU2ltcGxlVGhyZWFkRmFjdG9yeS5pbnN0YW5jZSgpLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIGNvbW1hbmQgZXhlY3V0b3IuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgdGhyZWFkIGZhY3RvcnkgdG8gY29uc3RydWN0IHRoZSBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQocykuCi0JICogQWxsb3cgdGhlIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZChzKSB0byBiZSBhc3NpZ25lZCBKREstZ2VuZXJhdGVkIG5hbWVzLgotCSAqLwotCXB1YmxpYyBBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IoVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5KSB7Ci0JCXRoaXModGhyZWFkRmFjdG9yeSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzeW5jaHJvbm91cyBjb21tYW5kIGV4ZWN1dG9yLgotCSAqIFVzZSBzaW1wbGUgSkRLIHRocmVhZChzKSBmb3IgdGhlIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZChzKS4KLQkgKiBBc3NpZ24gdGhlIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZChzKSB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvcihTdHJpbmcgdGhyZWFkTmFtZSkgewotCQl0aGlzKFNpbXBsZVRocmVhZEZhY3RvcnkuaW5zdGFuY2UoKSwgdGhyZWFkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzeW5jaHJvbm91cyBjb21tYW5kIGV4ZWN1dG9yLgotCSAqIEFzc2lnbiB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkKHMpIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yKFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSwgU3RyaW5nIHRocmVhZE5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb25zdW1lclRocmVhZENvb3JkaW5hdG9yID0gdGhpcy5idWlsZENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IodGhyZWFkRmFjdG9yeSwgdGhyZWFkTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yIGJ1aWxkQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcihUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnksIFN0cmluZyB0aHJlYWROYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcih0aGlzLmJ1aWxkQ29uc3VtZXIoKSwgdGhyZWFkRmFjdG9yeSwgdGhyZWFkTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yLkNvbnN1bWVyIGJ1aWxkQ29uc3VtZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29uc3VtZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ2FsbGJhY2tTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhbmQgc3RhcnQgdGhlIGNvbW1hbmQgZXhlY3V0aW9uL2NvbnN1bWVyIHRocmVhZC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBXZSBkb24ndCBjbGVhciB0aGUgY29tbWFuZCBxdWV1ZSBoZXJlOyBzbyBpZiBhIGNvbW1hbmQgaGFzIGJlZW4KLQkgKiBhZGRlZCB0byB0aGUgcXVldWUgPGVtPmJlZm9yZTwvZW0+IGdldHRpbmcgaGVyZSwgdGhlIGZpcnN0IGNvbW1hbmQgd2lsbAotCSAqIGJlIGV4ZWN1dGVkIHByb21wdGx5IChhbGJlaXQsIGFzeW5jaHJvbm91c2x5KS4KLQkgKiBUaGUgY29tbWFuZCBxdWV1ZSB3aWxsIGJlIG5vbi1lbXB0eSBpZjo8dWw+Ci0JICogPGxpPntAbGluayAjZXhlY3V0ZShDb21tYW5kKX0gd2FzIGNhbGxlZCBhZnRlciB0aGUgY29tbWFuZCBleGVjdXRvciB3YXMKLQkgKiAgICAgY29uc3RydWN0ZWQgYnV0IGJlZm9yZSB7QGxpbmsgI3N0YXJ0KCl9IHdhcyBjYWxsZWQ7IG9yCi0JICogPGxpPntAbGluayAjZXhlY3V0ZShDb21tYW5kKX0gd2FzIGNhbGxlZCBhZnRlciB7QGxpbmsgI3N0b3AoKX0gd2FzIGNhbGxlZAotCSAqICAgICBidXQgYmVmb3JlIHtAbGluayAjc3RhcnQoKX0gd2FzIGNhbGxlZCAodG8gcmVzdGFydCB0aGUgY29tbWFuZCBleGVjdXRvcik7IG9yCi0JICogPGxpPntAbGluayAjc3RvcCgpfSB3YXMgY2FsbGVkIHdoZW4gdGhlcmUgd2VyZSBzdGlsbCBvdXRzdGFuZGluZyBjb21tYW5kcwotCSAqICAgICByZW1haW5pbmcgaW4gdGhlIGNvbW1hbmQgcXVldWUKLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQl0aGlzLmNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3Iuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQdXQgdGhlIHNwZWNpZmllZCBjb21tYW5kIG9uIHRoZSBjb21tYW5kIHF1ZXVlLCB0byBiZSBjb25zdW1lZCBieSB0aGUKLQkgKiBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJdGhpcy5jb21tYW5kcy5lbnF1ZXVlKGNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIEludGVycnVwdCB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkIHNvIHRoYXQgaXQgc3RvcHMgZXhlY3V0aW5nIGF0IHRoZQotCSAqIGVuZCBvZiB0aGUgY3VycmVudCBjb21tYW5kLiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbAotCSAqIHRoZSBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQgaXMgZmluaXNoZWQgZXhlY3V0aW5nLiBJZiBhbnkgdW5jYXVnaHQKLQkgKiBleGNlcHRpb25zIHdlcmUgdGhyb3duIHdoaWxlIHRoZSBleGVjdXRpb24gdGhyZWFkIHdhcyBleGVjdXRpbmcsCi0JICogd3JhcCB0aGVtIGluIGEgY29tcG9zaXRlIGV4Y2VwdGlvbiBhbmQgdGhyb3cgdGhlIGNvbXBvc2l0ZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJdGhpcy5jb25zdW1lclRocmVhZENvb3JkaW5hdG9yLnN0b3AoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3VtZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5Db25zdW1lcn0KLQkgKiB3aWxsIGV4ZWN1dGUgdGhlIGNvbW1hbmRzIGVucXVldWVkIGJ5IHRoZSBhc3luY2hyb25vdXMgY29tbWFuZCBleGVjdXRvci4KLQkgKiBJdCB3aWxsIHdhaXQgdW50aWwgdGhlIHNoYXJlZCBjb21tYW5kIHF1ZXVlIGlzIG5vbi1lbXB0eSB0byBiZWdpbiBleGVjdXRpbmcgdGhlCi0JICogY29tbWFuZHMgaW4gdGhlIHF1ZXVlLiBPbmNlIGEgY29tYW5kIGlzIGV4ZWN1dGVkLCB0aGUgdGhyZWFkIHdpbGwgcXVpZXNjZSB1bnRpbAotCSAqIGFub3RoZXIgY29tbWFuZCBpcyBwbGFjZWQgaW4gdGhlIGNvbW1hbmQgcXVldWUuIElmIGEgbmV3IGNvbW1hbmQgaXMKLQkgKiBlbnF1ZXVlZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBhbm90aGVyIGNvbW1hbmQgKGVpdGhlciByZWN1cnNpdmVseSBieQotCSAqIHRoZSBjb21tYW5kIGl0c2VsZiBvciBieSBhbm90aGVyIHRocmVhZCksCi0JICogdGhlIG5ldyBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGN1cnJlbnRseQotCSAqIGV4ZWN1dGluZyBjb21tYW5kIGlzIGZpbmlzaGVkLgotCSAqIFN0b3AgdGhlIHRocmVhZCBieSBjYWxsaW5nIHtAbGluayBUaHJlYWQjaW50ZXJydXB0KCl9LgotCSAqLwotCWNsYXNzIENvbnN1bWVyCi0JCWltcGxlbWVudHMgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5Db25zdW1lcgotCXsKLQkJQ29uc3VtZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFdhaXQgdW50aWwgYSBjb21tYW5kIGhhcyBiZWVuIHBsYWNlZCBpbiB0aGUgcXVldWUuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3YWl0Rm9yUHJvZHVjZXIoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yLnRoaXMuY29tbWFuZHMud2FpdFVudGlsTm90RW1wdHkoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBFeGVjdXRlIHRoZSBmaXJzdCBjb21tYW5kIGluIHRoZSBxdWV1ZSBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yLnRoaXMuY29tbWFuZHMuZGVxdWV1ZSgpLmV4ZWN1dGUoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmFnLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjM2ViM2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLQotLyoqCi0gKiBBIGNvbGxlY3Rpb24gdGhhdCBhbGxvd3MgZHVwbGljYXRlIGVsZW1lbnRzLgotICogPHA+Ci0gKiBUaGUgPGNvZGU+QmFnPC9jb2RlPiBpbnRlcmZhY2UgcGxhY2VzIGFkZGl0aW9uYWwgc3RpcHVsYXRpb25zLAotICogYmV5b25kIHRob3NlIGluaGVyaXRlZCBmcm9tIHRoZSB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb259IGludGVyZmFjZSwKLSAqIG9uIHRoZSBjb250cmFjdHMgb2YgdGhlIHtAbGluayAjZXF1YWxzKE9iamVjdCl9IGFuZCB7QGxpbmsgI2hhc2hDb2RlKCl9IG1ldGhvZHMuCi0gKiAKLSAqIEBzZWUgSGFzaEJhZwotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgQmFnPEU+IGV4dGVuZHMgamF2YS51dGlsLkNvbGxlY3Rpb248RT4gewotCi0JLyoqCi0JICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIGJhZyBmb3IgZXF1YWxpdHkuIFJldHVybnMKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhbHNvIGEgYmFnLCB0aGUgdHdvIGJhZ3MKLQkgKiBoYXZlIHRoZSBzYW1lIHNpemUsIGFuZCBldmVyeSBtZW1iZXIgb2YgdGhlIHNwZWNpZmllZCBiYWcgaXMKLQkgKiBjb250YWluZWQgaW4gdGhpcyBiYWcgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgKG9yIGVxdWl2YWxlbnRseSwKLQkgKiBldmVyeSBtZW1iZXIgb2YgdGhpcyBiYWcgaXMgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgYmFnIHdpdGggdGhlIHNhbWUKLQkgKiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMpLiBUaGlzIGRlZmluaXRpb24gZW5zdXJlcyB0aGF0IHRoZQotCSAqIGVxdWFscyBtZXRob2Qgd29ya3MgcHJvcGVybHkgYWNyb3NzIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCi0JICogYmFnIGludGVyZmFjZS4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhPYmplY3Qgbyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgYmFnLiBUaGUgaGFzaCBjb2RlIG9mIGEgYmFnIGlzCi0JICogZGVmaW5lZCB0byBiZSB0aGUgc3VtIG9mIHRoZSBoYXNoIGNvZGVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgYmFnLAotCSAqIHdoZXJlIHRoZSBoYXNoY29kZSBvZiBhIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnQgaXMgZGVmaW5lZCB0byBiZSB6ZXJvLgotCSAqIFRoaXMgZW5zdXJlcyB0aGF0IDxjb2RlPmIxLmVxdWFscyhiMik8L2NvZGU+IGltcGxpZXMgdGhhdAotCSAqIDxjb2RlPmIxLmhhc2hDb2RlKCkgPT0gYjIuaGFzaENvZGUoKTwvY29kZT4gZm9yIGFueSB0d28gYmFncwotCSAqIDxjb2RlPmIxPC9jb2RlPiBhbmQgPGNvZGU+YjI8L2NvZGU+LCBhcyByZXF1aXJlZCBieSB0aGUgZ2VuZXJhbAotCSAqIGNvbnRyYWN0IG9mIHRoZSB7QGxpbmsgT2JqZWN0I2hhc2hDb2RlKCl9IG1ldGhvZC4KLQkgKi8KLQlpbnQgaGFzaENvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IG9jY3VycyBpbiB0aGUgYmFnLgotCSAqLwotCWludCBjb3VudChPYmplY3Qgbyk7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMgdG8gdGhlIGJhZy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYmFnIGNoYW5nZWQuCi0JICovCi0JYm9vbGVhbiBhZGQoRSBvLCBpbnQgY291bnQpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0JICogZnJvbSB0aGUgYmFnLiBSZXR1cm4gd2hldGhlciB0aGUgYmFnIGNoYW5nZWQuCi0JICovCi0JYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8sIGludCBjb3VudCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIGVhY2ggaXRlbSBpbiB0aGUgYmFnCi0JICogb25jZSBhbmQgb25seSBvbmNlLCBpcnJlc3BlY3RpdmUgb2YgaG93IG1hbnkgdGltZXMKLQkgKiB0aGUgaXRlbSB3YXMgYWRkZWQgdG8gdGhlIGJhZy4KLQkgKi8KLQlqYXZhLnV0aWwuSXRlcmF0b3I8RT4gdW5pcXVlSXRlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBpdGVtcyBpbiB0aGUgYmFnLgotCSAqLwotCWludCB1bmlxdWVDb3VudCgpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBhbiBlbnRyeSBmb3IgZWFjaCBpdGVtIGluIHRoZSBiYWcKLQkgKiBvbmNlIGFuZCBvbmx5IG9uY2UsIGlycmVzcGVjdGl2ZSBvZiBob3cgbWFueSB0aW1lcwotCSAqIHRoZSBpdGVtIHdhcyBhZGRlZCB0byB0aGUgYmFnLiBUaGUgZW50cnkgd2lsbCBpbmRpY2F0ZSB0aGUgaXRlbSdzCi0JICogY291bnQuCi0JICovCi0JamF2YS51dGlsLkl0ZXJhdG9yPEVudHJ5PEU+PiBlbnRyaWVzKCk7Ci0KLQotCS8qKgotCSAqIEEgYmFnIGVudHJ5IChlbGVtZW50LWNvdW50IHBhaXIpLgotCSAqIFRoZSB7QGxpbmsgQmFnI2VudHJpZXMoKX0gbWV0aG9kIHJldHVybnMgYW4gaXRlcmF0b3Igd2hvc2UKLQkgKiBlbGVtZW50cyBhcmUgb2YgdGhpcyBjbGFzcy4gVGhlIDxlbT5vbmx5PC9lbT4gd2F5IHRvIG9idGFpbiBhIHJlZmVyZW5jZQotCSAqIHRvIGEgYmFnIGVudHJ5IGlzIGZyb20gdGhlIGl0ZXJhdG9yIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kLiBUaGVzZQotCSAqIDxjb2RlPkJhZy5FbnRyeTwvY29kZT4gb2JqZWN0cyBhcmUgdmFsaWQgPGVtPm9ubHk8L2VtPiBmb3IgdGhlIGR1cmF0aW9uCi0JICogb2YgdGhlIGl0ZXJhdGlvbjsgbW9yZSBmb3JtYWxseSwgdGhlIGJlaGF2aW9yIG9mIGEgYmFnIGVudHJ5IGlzCi0JICogdW5kZWZpbmVkIGlmIHRoZSBiYWNraW5nIGJhZyBoYXMgYmVlbiBtb2RpZmllZCBhZnRlciB0aGUgZW50cnkgd2FzCi0JICogcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yLCBleGNlcHQgdGhyb3VnaCB0aGUge0BsaW5rICNzZXRDb3VudChpbnQpfQotCSAqIG9wZXJhdGlvbiBvbiB0aGUgYmFnIGVudHJ5LgotCSAqLwotCWludGVyZmFjZSBFbnRyeTxFPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgZW50cnkncyBlbGVtZW50LgotCQkgKi8KLQkJRSBnZXRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBlbnRyeSdzIGNvdW50OyBpLmUuIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGVudHJ5J3MgZWxlbWVudAotCQkgKiBvY2N1cnMgaW4gdGhlIGJhZy4KLQkJICogQHNlZSBCYWcjY291bnQoT2JqZWN0KQotCQkgKi8KLQkJaW50IGdldENvdW50KCk7Ci0KLQkJLyoqCi0JCSAqIFNldCB0aGUgZW50cnkncyBjb3VudDsgaS5lLiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBlbnRyeSdzIGVsZW1lbnQKLQkJICogb2NjdXJzIGluIHRoZSBiYWcuIFRoZSBuZXcgY291bnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlci4KLQkJICogUmV0dXJuIHRoZSBwcmV2aW91cyBjb3VudCBvZiB0aGUgZW50cnkncyBlbGVtZW50LgotCQkgKiBOQjogVXNlIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gdG8gc2V0IHRoZQotCQkgKiBjb3VudCB0byB6ZXJvLgotCQkgKi8KLQkJaW50IHNldENvdW50KGludCBjb3VudCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRyeSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdDsKLQkJICogaS5lLiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIDxjb2RlPkJhZy5FbnRyeTwvY29kZT4gYW5kIGl0cwotCQkgKiBlbGVtZW50IGFuZCBjb3VudCBhcmUgdGhlIHNhbWUgYXMgdGhlIGVudHJ5J3MuCi0JCSAqLwotCQlib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBlbnRyeSdzIGhhc2ggY29kZS4KLQkJICovCi0JCWludCBoYXNoQ29kZSgpOwotCi0JfQotCi0KLQlmaW5hbCBjbGFzcyBFbXB0eTxFPiBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbjxFPiBpbXBsZW1lbnRzIEJhZzxFPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCYWcgSU5TVEFOQ0UgPSBuZXcgRW1wdHkoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFQ+IEJhZzxUPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRW1wdHkoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gdW5pcXVlSXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCXB1YmxpYyBpbnQgdW5pcXVlQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgaW50IGNvdW50KE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8QmFnLkVudHJ5PEU+PiBlbnRyaWVzKCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8sIGludCBjb3VudCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGFkZChFIG8sIGludCBjb3VudCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gPT0gdGhpcykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKCAhIChvIGluc3RhbmNlb2YgQmFnPD8+KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiAoKEJhZzw/Pikgbykuc2l6ZSgpID09IDA7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmlkaUZpbHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JpZGlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk5MTc1My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmlkaUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLQotLyoqCi0gKiBVc2VkIGJ5IHZhcmlvdXMgInBsdWdnYWJsZSIgY2xhc3NlcyB0byBmaWx0ZXIgb2JqZWN0cwotICogaW4gYm90aCBkaXJlY3Rpb25zLgotICogCi0gKiBJZiBhbnlvbmUgY2FuIGNvbWUgdXAgd2l0aCBhIGJldHRlciBjbGFzcyBuYW1lCi0gKiBhbmQvb3IgbWV0aG9kIG5hbWUsIEkgd291bGQgbG92ZSB0byBoZWFyIGl0LiAgfmJqdgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJpZGlGaWx0ZXI8VD4gZXh0ZW5kcyBGaWx0ZXI8VD4gewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgImFjY2VwdGVkIiBieSB0aGUKLQkgKiAicmV2ZXJzZSIgZmlsdGVyLiBXaGF0IHRoYXQgbWVhbnMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY2xpZW50LgotCSAqLwotCWJvb2xlYW4gcmV2ZXJzZUFjY2VwdChUIG8pOwotCi0KLQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgQmlkaUZpbHRlcjxTPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpRmlsdGVyIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IEJpZGlGaWx0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIG5vdGhpbmcgaXMgZmlsdGVyZWQgLSBldmVyeXRoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG8pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIG5vdGhpbmcgaXMgInJldmVyc2UtZmlsdGVyZWQiIC0gZXZlcnl0aGluZyBpcyBhY2NlcHRlZAotCQlwdWJsaWMgYm9vbGVhbiByZXZlcnNlQWNjZXB0KFMgbykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlGaWx0ZXIuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgT3BhcXVlPFM+IGltcGxlbWVudHMgQmlkaUZpbHRlcjxTPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpRmlsdGVyIElOU1RBTkNFID0gbmV3IE9wYXF1ZSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gQmlkaUZpbHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgT3BhcXVlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBldmVyeXRoaW5nIGlzIGZpbHRlcmVkIC0gbm90aGluZyBpcyBhY2NlcHRlZAotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUyBvKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gZXZlcnl0aGluZyBpcyAicmV2ZXJzZS1maWx0ZXJlZCIgLSBub3RoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIHJldmVyc2VBY2NlcHQoUyBvKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlGaWx0ZXIuT3BhcXVlIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIEJpZGlGaWx0ZXI8Uz4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaUZpbHRlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gQmlkaUZpbHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUyBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIGJvb2xlYW4gcmV2ZXJzZUFjY2VwdChTIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCaWRpRmlsdGVyLkRpc2FibGVkIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmlkaVN0cmluZ0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTFkMjQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIHRyYW5zZm9ybSBvYmplY3RzCi0gKiBpbnRvIHN0cmluZ3MgYW5kIHZpY2UgdmVyc2EuCi0gKiAKLSAqIElmIGFueW9uZSBjYW4gY29tZSB1cCB3aXRoIGEgYmV0dGVyIGNsYXNzIG5hbWUKLSAqIGFuZC9vciBtZXRob2QgbmFtZSwgSSB3b3VsZCBsb3ZlIHRvIGhlYXIgaXQuICB+Ymp2Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmlkaVN0cmluZ0NvbnZlcnRlcjxUPiBleHRlbmRzIFN0cmluZ0NvbnZlcnRlcjxUPiB7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIGludG8gYW4gb2JqZWN0LgotCSAqIFRoZSBzZW1hbnRpY3Mgb2YgImNvbnZlcnQgdG8gb2JqZWN0IiBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotCSAqIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLQkgKiBUeXBpY2FsbHksIGlmIHRoZSBzdHJpbmcgaXMgbnVsbCwgbnVsbCBpcyByZXR1cm5lZC4KLQkgKi8KLQlUIGNvbnZlcnRUb09iamVjdChTdHJpbmcgcyk7Ci0KLQotCWZpbmFsIGNsYXNzIERlZmF1bHQ8Uz4gaW1wbGVtZW50cyBCaWRpU3RyaW5nQ29udmVydGVyPFM+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlTdHJpbmdDb252ZXJ0ZXIgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gQmlkaVN0cmluZ0NvbnZlcnRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gc2ltcGx5IHJldHVybiB0aGUgb2JqZWN0J3MgI3RvU3RyaW5nKCkgcmVzdWx0Ci0JCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFMgbykgewotCQkJcmV0dXJuIChvID09IG51bGwpID8gbnVsbCA6IG8udG9TdHJpbmcoKTsKLQkJfQotCQkvLyBzaW1wbHkgcmV0dXJuIHRoZSBzdHJpbmcKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBTIGNvbnZlcnRUb09iamVjdChTdHJpbmcgcykgewotCQkJcmV0dXJuIChTKSBzOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCaWRpU3RyaW5nQ29udmVydGVyLkRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCWZpbmFsIGNsYXNzIERpc2FibGVkPFM+IGltcGxlbWVudHMgQmlkaVN0cmluZ0NvbnZlcnRlcjxTPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpU3RyaW5nQ29udmVydGVyIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBCaWRpU3RyaW5nQ29udmVydGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFMgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTIGNvbnZlcnRUb09iamVjdChTdHJpbmcgcykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCWZpbmFsIGNsYXNzIEJvb2xlYW5Db252ZXJ0ZXIgaW1wbGVtZW50cyBCaWRpU3RyaW5nQ29udmVydGVyPEJvb2xlYW4+LCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8Qm9vbGVhbj4gSU5TVEFOQ0UgPSBuZXcgQm9vbGVhbkNvbnZlcnRlcigpOwotCQlwdWJsaWMgc3RhdGljIEJpZGlTdHJpbmdDb252ZXJ0ZXI8Qm9vbGVhbj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEJvb2xlYW5Db252ZXJ0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8qKiBSZXR1cm4gInRydWUiIGlmIHRoZSBCb29sZWFuIGlzIHRydWUsIG90aGVyd2lzZSByZXR1cm4gImZhbHNlIi4gKi8KLQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoQm9vbGVhbiBiKSB7Ci0JCQlyZXR1cm4gKGIgPT0gbnVsbCkgPyBudWxsIDogYi50b1N0cmluZygpOwotCQl9Ci0JCS8qKiBSZXR1cm4gQm9vbGVhbi5UUlVFIGlmIHRoZSBzdHJpbmcgaXMgInRydWUiIChjYXNlLWluc2Vuc2l0aXZlKSwgb3RoZXJ3aXNlIHJldHVybiBCb29sZWFuLkZBTFNFLiAqLwotCQlwdWJsaWMgQm9vbGVhbiBjb252ZXJ0VG9PYmplY3QoU3RyaW5nIHMpIHsKLQkJCXJldHVybiAocyA9PSBudWxsKSA/IG51bGwgOiBCb29sZWFuLnZhbHVlT2Yocyk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgSW50ZWdlckNvbnZlcnRlciBpbXBsZW1lbnRzIEJpZGlTdHJpbmdDb252ZXJ0ZXI8SW50ZWdlcj4sIFNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVN0cmluZ0NvbnZlcnRlcjxJbnRlZ2VyPiBJTlNUQU5DRSA9IG5ldyBJbnRlZ2VyQ29udmVydGVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQmlkaVN0cmluZ0NvbnZlcnRlcjxJbnRlZ2VyPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgSW50ZWdlckNvbnZlcnRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLyoqIEludGVnZXIncyAjdG9TdHJpbmcoKSB3b3JrcyB3ZWxsLiAqLwotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhJbnRlZ2VyIGludGVnZXIpIHsKLQkJCXJldHVybiAoaW50ZWdlciA9PSBudWxsKSA/IG51bGwgOiBpbnRlZ2VyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLyoqIENvbnZlcnQgdGhlIHN0cmluZyB0byBhbiBJbnRlZ2VyLCBpZiBwb3NzaWJsZS4gKi8KLQkJcHVibGljIEludGVnZXIgY29udmVydFRvT2JqZWN0KFN0cmluZyBzKSB7Ci0JCQlyZXR1cm4gKHMgPT0gbnVsbCkgPyBudWxsIDogSW50ZWdlci52YWx1ZU9mKHMpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JpZGlUcmFuc2Zvcm1lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JpZGlUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2VjYTk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaWRpVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBVc2VkIGJ5IHZhcmlvdXMgInBsdWdnYWJsZSIgY2xhc3NlcyB0byB0cmFuc2Zvcm0gb2JqZWN0cwotICogaW4gYm90aCBkaXJlY3Rpb25zLgotICogCi0gKiBJZiBhbnlvbmUgY2FuIGNvbWUgdXAgd2l0aCBhIGJldHRlciBjbGFzcyBuYW1lCi0gKiBhbmQvb3IgbWV0aG9kIG5hbWUsIEkgd291bGQgbG92ZSB0byBoZWFyIGl0LiAgfmJqdgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJpZGlUcmFuc2Zvcm1lcjxUMSwgVDI+IGV4dGVuZHMgVHJhbnNmb3JtZXI8VDEsIFQyPiB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJyZXZlcnNlLXRyYW5zZm9ybWVkIiBvYmplY3QuCi0JICogVGhlIHNlbWFudGljcyBvZiAicmV2ZXJzZS10cmFuc2Zvcm0iIGlzIGRldGVybWluZWQgYnkgdGhlCi0JICogY29udHJhY3QgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLgotCSAqLwotCVQxIHJldmVyc2VUcmFuc2Zvcm0oVDIgbyk7Ci0KLQotCWZpbmFsIGNsYXNzIE51bGw8UzEsIFMyPiBpbXBsZW1lbnRzIEJpZGlUcmFuc2Zvcm1lcjxTMSwgUzI+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlUcmFuc2Zvcm1lciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSMSwgUjI+IEJpZGlUcmFuc2Zvcm1lcjxSMSwgUjI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgcmV0dXJuIHRoZSBvYmplY3QsIHVuY2hhbmdlZAotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIFMyIHRyYW5zZm9ybShTMSBvKSB7Ci0JCQlyZXR1cm4gKFMyKSBvOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIG9iamVjdCwgdW5jaGFuZ2VkCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgUzEgcmV2ZXJzZVRyYW5zZm9ybShTMiBvKSB7Ci0JCQlyZXR1cm4gKFMxKSBvOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCaWRpVHJhbnNmb3JtZXIuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQ8UzEsIFMyPiBpbXBsZW1lbnRzIEJpZGlUcmFuc2Zvcm1lcjxTMSwgUzI+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlUcmFuc2Zvcm1lciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8UjEsIFIyPiBCaWRpVHJhbnNmb3JtZXI8UjEsIFIyPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgUzIgdHJhbnNmb3JtKFMxIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgUzEgcmV2ZXJzZVRyYW5zZm9ybShTMiBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQmlkaVRyYW5zZm9ybWVyLkRpc2FibGVkIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaXRUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JpdFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZTAwZWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JpdFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBBc3NvcnRlZCBiaXQgdG9vbHMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpdFRvb2xzIHsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmbGFnSXNTZXQoaW50IGZsYWdzLCBpbnQgZmxhZ1RvQ2hlY2spIHsKLQkJcmV0dXJuIGFsbEZsYWdzQXJlU2V0KGZsYWdzLCBmbGFnVG9DaGVjayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmbGFnSXNPZmYoaW50IGZsYWdzLCBpbnQgZmxhZ1RvQ2hlY2spIHsKLQkJcmV0dXJuIGFsbEZsYWdzQXJlT2ZmKGZsYWdzLCBmbGFnVG9DaGVjayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBPTkxZIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seUZsYWdJc1NldChpbnQgZmxhZ3MsIGludCBmbGFnVG9DaGVjaykgewotCQlyZXR1cm4gb25seUZsYWdzQXJlU2V0KGZsYWdzLCBmbGFnVG9DaGVjayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBPTkxZIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9ubHlGbGFnSXNPZmYoaW50IGZsYWdzLCBpbnQgZmxhZ1RvQ2hlY2spIHsKLQkJcmV0dXJuIG9ubHlGbGFnc0FyZU9mZihmbGFncywgZmxhZ1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYWxsIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFsbEZsYWdzQXJlU2V0KGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gKGZsYWdzICYgZmxhZ3NUb0NoZWNrKSA9PSBmbGFnc1RvQ2hlY2s7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbGwgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFsbEZsYWdzQXJlT2ZmKGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gKGZsYWdzICYgZmxhZ3NUb0NoZWNrKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5RmxhZ3NBcmVTZXQoaW50IGZsYWdzLCBpbnQgZmxhZ3NUb0NoZWNrKSB7Ci0JCXJldHVybiBhbGxGbGFnc0FyZVNldChmbGFncywgZmxhZ3NUb0NoZWNrKSAmJiBhbGxGbGFnc0FyZU9mZihmbGFncywgfmZsYWdzVG9DaGVjayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBPTkxZIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5RmxhZ3NBcmVPZmYoaW50IGZsYWdzLCBpbnQgZmxhZ3NUb0NoZWNrKSB7Ci0JCXJldHVybiBhbGxGbGFnc0FyZU9mZihmbGFncywgZmxhZ3NUb0NoZWNrKSAmJiBhbGxGbGFnc0FyZVNldChmbGFncywgfmZsYWdzVG9DaGVjayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbnkgb25lIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFueUZsYWdzQXJlU2V0KGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gKGZsYWdzICYgZmxhZ3NUb0NoZWNrKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYW55IG9uZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYW55RmxhZ3NBcmVPZmYoaW50IGZsYWdzLCBpbnQgZmxhZ3NUb0NoZWNrKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBmbGFnc1RvQ2hlY2spICE9IGZsYWdzVG9DaGVjazsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFsbCB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbGxGbGFnc0FyZVNldChpbnQgZmxhZ3MsIGludC4uLiBmbGFnc1RvQ2hlY2spIHsKLQkJZm9yIChpbnQgaSA9IGZsYWdzVG9DaGVjay5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGFsbEZsYWdzQXJlU2V0KGZsYWdzLCBmbGFnc1RvQ2hlY2tbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYWxsIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbGxGbGFnc0FyZU9mZihpbnQgZmxhZ3MsIGludC4uLiBmbGFnc1RvQ2hlY2spIHsKLQkJZm9yIChpbnQgaSA9IGZsYWdzVG9DaGVjay5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGFsbEZsYWdzQXJlT2ZmKGZsYWdzLCBmbGFnc1RvQ2hlY2tbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5RmxhZ3NBcmVTZXQoaW50IGZsYWdzLCBpbnQuLi4gZmxhZ3NUb0NoZWNrKSB7Ci0JCWludCBjb21iaW5lZEZsYWdzID0gb3JGbGFncyhmbGFnc1RvQ2hlY2spOwotCQlyZXR1cm4gYWxsRmxhZ3NBcmVTZXQoZmxhZ3MsIGNvbWJpbmVkRmxhZ3MpICYmIGFsbEZsYWdzQXJlT2ZmKGZsYWdzLCB+Y29tYmluZWRGbGFncyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBPTkxZIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5RmxhZ3NBcmVPZmYoaW50IGZsYWdzLCBpbnQuLi4gZmxhZ3NUb0NoZWNrKSB7Ci0JCWludCBjb21iaW5lZEZsYWdzID0gb3JGbGFncyhmbGFnc1RvQ2hlY2spOwotCQlyZXR1cm4gYWxsRmxhZ3NBcmVPZmYoZmxhZ3MsIGNvbWJpbmVkRmxhZ3MpICYmIGFsbEZsYWdzQXJlU2V0KGZsYWdzLCB+Y29tYmluZWRGbGFncyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbnkgb25lIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFueUZsYWdzQXJlU2V0KGludCBmbGFncywgaW50Li4uIGZsYWdzVG9DaGVjaykgewotCQlmb3IgKGludCBpID0gZmxhZ3NUb0NoZWNrLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYW55RmxhZ3NBcmVTZXQoZmxhZ3MsIGZsYWdzVG9DaGVja1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbnkgb25lIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbnlGbGFnc0FyZU9mZihpbnQgZmxhZ3MsIGludC4uLiBmbGFnc1RvQ2hlY2spIHsKLQkJZm9yIChpbnQgaSA9IGZsYWdzVG9DaGVjay5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFueUZsYWdzQXJlT2ZmKGZsYWdzLCBmbGFnc1RvQ2hlY2tbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE9SIGFsbCB0aGUgc3BlY2lmaWVkICdmbGFncycgdG9nZXRoZXIgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IG9yRmxhZ3MoaW50Li4uIGZsYWdzKSB7Ci0JCWludCBsYXN0ID0gZmxhZ3MubGVuZ3RoIC0gMTsKLQkJaW50IHJlc3VsdCA9IGZsYWdzW2xhc3RdOwotCQlmb3IgKGludCBpID0gbGFzdDsgaS0tID4gMDsgKSB7Ci0JCQlyZXN1bHQgfD0gZmxhZ3NbaV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBTkQgYWxsIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyB0b2dldGhlciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYW5kRmxhZ3MoaW50Li4uIGZsYWdzKSB7Ci0JCWludCBsYXN0ID0gZmxhZ3MubGVuZ3RoIC0gMTsKLQkJaW50IHJlc3VsdCA9IGZsYWdzW2xhc3RdOwotCQlmb3IgKGludCBpID0gbGFzdDsgaS0tID4gMDsgKSB7Ci0JCQlyZXN1bHQgJj0gZmxhZ3NbaV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBYT1IgYWxsIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyB0b2dldGhlciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgeG9yRmxhZ3MoaW50Li4uIGZsYWdzKSB7Ci0JCWludCBsYXN0ID0gZmxhZ3MubGVuZ3RoIC0gMTsKLQkJaW50IHJlc3VsdCA9IGZsYWdzW2xhc3RdOwotCQlmb3IgKGludCBpID0gbGFzdDsgaS0tID4gMDsgKSB7Ci0JCQlyZXN1bHQgXj0gZmxhZ3NbaV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEJpdFRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Cb29sZWFuUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQm9vbGVhblJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVmNTY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Cb29sZWFuUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFByb3ZpZGUgYSBjb250YWluZXIgZm9yIHBhc3NpbmcgYSBmbGFnIHRoYXQgY2FuIGJlIGNoYW5nZWQgYnkgdGhlIHJlY2lwaWVudC4KLSAqIAotICogQHNlZSBTeW5jaHJvbml6ZWRCb29sZWFuCi0gKi8KLXB1YmxpYyBjbGFzcyBCb29sZWFuUmVmZXJlbmNlCi0JaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIDxjb2RlPmJvb2xlYW48L2NvZGU+LiAqLwotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiB2YWx1ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIEJvb2xlYW5SZWZlcmVuY2UoYm9vbGVhbiB2YWx1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gcmVmZXJlbmNlIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQm9vbGVhblJlZmVyZW5jZSgpIHsKLQkJdGhpcyhmYWxzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpcyhib29sZWFuIHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPT0gdjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBub3QgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm90KGJvb2xlYW4gdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSAhPSB2OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUcnVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhbHNlKCkgewotCQlyZXR1cm4gISB0aGlzLnZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZXRWYWx1ZShib29sZWFuIHZhbHVlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQlyZXR1cm4gb2xkOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgdG8gdGhlIE5PVCBvZiBpdHMgY3VycmVudCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmbGlwKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA9ICEgdGhpcy52YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIHRvIHRoZSBOT1Qgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNldE5vdChib29sZWFuIHYpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUoICEgdik7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSB0byA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNldFRydWUoKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0RmFsc2UoKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKGZhbHNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCXJldHVybiAobyBpbnN0YW5jZW9mIEJvb2xlYW5SZWZlcmVuY2UpICYmCi0JCQkodGhpcy52YWx1ZSA9PSAoKEJvb2xlYW5SZWZlcmVuY2UpIG8pLnZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA/IDEgOiAwOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAnWycgKyBTdHJpbmcudmFsdWVPZih0aGlzLnZhbHVlKSArICddJzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Cb29sZWFuVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Cb29sZWFuVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjMmE3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQm9vbGVhblRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBBc3NvcnRlZCAiQ2FwaXRhbC1CIEJvb2xlYW4iIG9wZXJhdGlvbnMuCi0gKi8KLSAvLyBjb21tZW50ZWQgY29kZSBpcyBqdXN0IHBsYXlpbmcgYXJvdW5kIHdpdGggYnVpbGRpbmcgKmV2ZXJ5dGhpbmcqIGZyb20gTkFORAotcHVibGljIGZpbmFsIGNsYXNzIEJvb2xlYW5Ub29scyB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkIEJvb2xlYW4uCi0JICogQm9vbGVhbiNub3QoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiBub3QoQm9vbGVhbiBiKSB7Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YoICEgYi5ib29sZWFuVmFsdWUoKSk7Ci0vLwkJcmV0dXJuIG5hbmQoYiwgYik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBBTkQgb2YgdGhlIHNwZWNpZmllZCBCb29sZWFucy4KLQkgKiBCb29sZWFuI2FuZChCb29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiBhbmQoQm9vbGVhbiBiMSwgQm9vbGVhbiBiMikgewotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGIxLmJvb2xlYW5WYWx1ZSgpICYmIGIyLmJvb2xlYW5WYWx1ZSgpKTsKLS8vCQlCb29sZWFuIG5hbmQgPSBuYW5kKGIxLCBiMik7Ci0vLwkJcmV0dXJuIG5hbmQobmFuZCwgbmFuZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBPUiBvZiB0aGUgc3BlY2lmaWVkIEJvb2xlYW5zLgotCSAqIEJvb2xlYW4jb3IoQm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW4gb3IoQm9vbGVhbiBiMSwgQm9vbGVhbiBiMikgewotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGIxLmJvb2xlYW5WYWx1ZSgpIHx8IGIyLmJvb2xlYW5WYWx1ZSgpKTsKLS8vCQlCb29sZWFuIG5hbmQgPSBuYW5kKGIxLCBiMik7Ci0vLwkJQm9vbGVhbiB4b3IgPSBuYW5kKG5hbmQoYjEsIG5hbmQpLCBuYW5kKGIyLCBuYW5kKSk7Ci0vLwkJQm9vbGVhbiBhbmQgPSBuYW5kKG5hbmQsIG5hbmQpOwotLy8JCUJvb2xlYW4gbmFuZDIgPSBuYW5kKHhvciwgYW5kKTsKLS8vCQlyZXR1cm4gbmFuZChuYW5kKHhvciwgbmFuZDIpLCBuYW5kKGFuZCwgbmFuZDIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFhPUiBvZiB0aGUgc3BlY2lmaWVkIEJvb2xlYW5zLgotCSAqIEJvb2xlYW4jeG9yKEJvb2xlYW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuIHhvcihCb29sZWFuIGIxLCBCb29sZWFuIGIyKSB7Ci0JCXJldHVybiBhbmQob3IoYjEsIGIyKSwgbmFuZChiMSwgYjIpKTsKLS8vCQlCb29sZWFuIG5hbmQgPSBuYW5kKGIxLCBiMik7Ci0vLwkJcmV0dXJuIG5hbmQobmFuZChiMSwgbmFuZCksIG5hbmQoYjIsIG5hbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIE5BTkQgb2YgdGhlIHNwZWNpZmllZCBCb29sZWFucy4KLQkgKiBCb29sZWFuI25hbmQoQm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW4gbmFuZChCb29sZWFuIGIxLCBCb29sZWFuIGIyKSB7Ci0JCXJldHVybiBub3QoYW5kKGIxLCBiMikpOwotLy8JCXJldHVybiBCb29sZWFuLnZhbHVlT2YoICEgKGIxLmJvb2xlYW5WYWx1ZSgpICYmIGIyLmJvb2xlYW5WYWx1ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBOT1Igb2YgdGhlIHNwZWNpZmllZCBCb29sZWFucy4KLQkgKiBCb29sZWFuI25vcihCb29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiBub3IoQm9vbGVhbiBiMSwgQm9vbGVhbiBiMikgewotCQlyZXR1cm4gbm90KG9yKGIxLCBiMikpOwotLy8JCUJvb2xlYW4gbmFuZCA9IG5hbmQoYjEsIGIyKTsKLS8vCQlCb29sZWFuIHhvciA9IG5hbmQobmFuZChiMSwgbmFuZCksIG5hbmQoYjIsIG5hbmQpKTsKLS8vCQlCb29sZWFuIGFuZCA9IG5hbmQobmFuZCwgbmFuZCk7Ci0vLwkJQm9vbGVhbiBuYW5kMiA9IG5hbmQoeG9yLCBhbmQpOwotLy8JCUJvb2xlYW4gbmFuZDMgPSBuYW5kKG5hbmQoeG9yLCBuYW5kMiksIG5hbmQoYW5kLCBuYW5kMikpOwotLy8JCXJldHVybiBuYW5kKG5hbmQzLCBuYW5kMyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBYTk9SIG9mIHRoZSBzcGVjaWZpZWQgQm9vbGVhbnMuCi0JICogQm9vbGVhbiN4bm9yKEJvb2xlYW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuIHhub3IoQm9vbGVhbiBiMSwgQm9vbGVhbiBiMikgewotCQlyZXR1cm4gbm90KHhvcihiMSwgYjIpKTsKLS8vCQlCb29sZWFuIG5hbmQgPSBuYW5kKGIxLCBiMik7Ci0vLwkJQm9vbGVhbiB4b3IgPSBuYW5kKG5hbmQoYjEsIG5hbmQpLCBuYW5kKGIyLCBuYW5kKSk7Ci0vLwkJcmV0dXJuIG5hbmQoeG9yLCB4b3IpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQm9vbGVhblRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9DbGFzc05hbWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9DbGFzc05hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlZjA0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIENvbnZlbmllbmNlIG1ldGhvZHMgcmVsYXRlZCB0byBKYXZhIGNsYXNzIG5hbWVzIGFzIHJldHVybmVkIGJ5Ci0gKiB7QGxpbmsgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKX0uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc05hbWUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9DTEFTU19OQU1FID0gUmVmbGVjdGlvblRvb2xzLlZPSURfQ0xBU1MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZPSURfV1JBUFBFUl9DTEFTU19OQU1FID0gUmVmbGVjdGlvblRvb2xzLlZPSURfV1JBUFBFUl9DTEFTUy5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUkVGRVJFTkNFX0NMQVNTX0NPREUgPSAnTCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUiA9ICc7JzsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYW4gYXJyYXkgdHlwZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcnJheShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUuY2hhckF0KDApID09ICdbJzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJlbGVtZW50IHR5cGUiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkgdHlwZS4KLQkgKiBOb24tYXJyYXkgdHlwZXMgc2ltcGx5IHJldHVybiB0aGVtc2VsdmVzLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRUeXBlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBkZXB0aCA9IGdldEFycmF5RGVwdGgoY2xhc3NOYW1lKTsKLQkJaWYgKGRlcHRoID09IDApIHsKLQkJCS8vIHRoZSBuYW1lIGlzIGluIHRoZSBmb3JtOiAiamF2YS5sYW5nLk9iamVjdCIgb3IgImludCIKLQkJCXJldHVybiBjbGFzc05hbWU7Ci0JCX0KLQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlTmFtZV8oY2xhc3NOYW1lLCBkZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogYXJyYXkgZGVwdGggaXMgbm90IHplcm8KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lXyhTdHJpbmcgY2xhc3NOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQlpbnQgbGFzdCA9IGNsYXNzTmFtZS5sZW5ndGgoKSAtIDE7Ci0JCWlmIChjbGFzc05hbWUuY2hhckF0KGFycmF5RGVwdGgpID09IFJFRkVSRU5DRV9DTEFTU19DT0RFKSB7Ci0JCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogIltbW0xqYXZhLmxhbmcuT2JqZWN0OyIKLQkJCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGFycmF5RGVwdGggKyAxLCBsYXN0KTsJLy8gZHJvcCB0aGUgdHJhaWxpbmcgJzsnCi0JCX0KLQkJLy8gdGhlIG5hbWUgaXMgaW4gdGhlIGZvcm06ICJbW1tJIgotCQlyZXR1cm4gZm9yQ29kZShjbGFzc05hbWUuY2hhckF0KGxhc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRBcnJheURlcHRoKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGRlcHRoID0gMDsKLQkJd2hpbGUgKGNsYXNzTmFtZS5jaGFyQXQoZGVwdGgpID09ICdbJykgewotCQkJZGVwdGgrKzsKLQkJfQotCQlyZXR1cm4gZGVwdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY2xhc3MncyBjb21wb25lbnQgdHlwZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBub3QgYW4gYXJyYXkgdHlwZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21wb25lbnRUeXBlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXN3aXRjaCAoZ2V0QXJyYXlEZXB0aChjbGFzc05hbWUpKSB7Ci0JCQljYXNlIDA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQljYXNlIDE6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlTmFtZV8oY2xhc3NOYW1lLCAxKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjbGFzcydzIHNpbXBsZSBuYW1lLgotCSAqIFJldHVybiBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhbm9ueW1vdXMuCi0JICogPHA+Ci0JICogVGhlIHNpbXBsZSBuYW1lIG9mIGFuIGFycmF5IHR5cGUgaXMgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZQotCSAqIGNvbXBvbmVudCB0eXBlIHdpdGggPGNvZGU+IltdIjwvY29kZT4gYXBwZW5kZWQuIEluIHBhcnRpY3VsYXIsCi0JICogdGhlIHNpbXBsZSBuYW1lIG9mIGFuIGFycmF5IHR5cGUgd2hvc2UgY29tcG9uZW50IHR5cGUgaXMKLQkgKiBhbm9ueW1vdXMgaXMgc2ltcGx5IDxjb2RlPiJbXSI8L2NvZGU+LgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldFNpbXBsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gaXNBcnJheShjbGFzc05hbWUpID8KLQkJCQlnZXRTaW1wbGVOYW1lKGdldENvbXBvbmVudFR5cGVOYW1lKGNsYXNzTmFtZSkpICsgIltdIiA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTaW1wbGVOYW1lXyhjbGFzc05hbWUpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHNwZWNpZmllZCBjbGFzcyBpcyBub3QgYW4gYXJyYXkgdHlwZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVOYW1lXyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBpbmRleCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignJCcpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsgIC8vICJ0b3AtbGV2ZWwiIGNsYXNzIC0gc3RyaXAgcGFja2FnZSBuYW1lCi0JCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCQl9Ci0KLQkJaW50IGxlbiA9IGNsYXNzTmFtZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9ICsraW5kZXg7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKCAhIGNoYXJJc0FzY2lpRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhpKTsgIC8vICJtZW1iZXIiIG9yICJsb2NhbCIgY2xhc3MKLQkJCX0KLQkJfQotCQkvLyBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUgJyQnIGFyZSBBU0NJSSBkaWdpdHMgKCJhbm9ueW1vdXMiIGNsYXNzKQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjbGFzcydzIHBhY2thZ2UgbmFtZSAoZS5nLgotCSAqIDxjb2RlPiJqYXZhLmxhbmcuT2JqZWN0IjwvY29kZT4gcmV0dXJucwotCSAqIDxjb2RlPiJqYXZhLmxhbmciPC9jb2RlPikuCi0JICogUmV0dXJuIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzOjx1bD4KLQkgKiA8bGk+aW4gdGhlICJkZWZhdWx0IiBwYWNrYWdlCi0JICogPGxpPmFuIGFycmF5IGNsYXNzCi0JICogPGxpPmEgcHJpbXRpdmUgY2xhc3MKLQkgKiA8L3VsPgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldFBhY2thZ2UoKQotCSAqIEBzZWUgamF2YS5sYW5nLlBhY2thZ2UjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoaXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpbnQgbGFzdFBlcmlvZCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlyZXR1cm4gKGxhc3RQZXJpb2QgPT0gLTEpID8gIiIgOiBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGxhc3RQZXJpb2QpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAibWVtYmVyIiwgImxvY2FsIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIEpESyBuYW1pbmcgY29udmVudGlvbnMgKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBkb2VzIE5PVCBjb250YWluIGEgPGNvZGU+JyQnPC9jb2RlPikuCi0JICogQSAidG9wLWxldmVsIiBjbGFzcyBjYW4gYmUgZWl0aGVyIHRoZSAicHJpbWFyeSIgKHB1YmxpYykgY2xhc3MgZGVmaW5lZAotCSAqIGluIGEgZmlsZS9jb21waWxhdGlvbiB1bml0IChpLmUuIHRoZSBjbGFzcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgaXRzCi0JICogZmlsZSdzIHNpbXBsZSBiYXNlIG5hbWUpIG9yIGEgIm5vbi1wcmltYXJ5IiAocGFja2FnZSB2aXNpYmxlKSBjbGFzcwotCSAqIChpLmUuIHRoZSBvdGhlciB0b3AtbGV2ZWwgY2xhc3NlcyBkZWZpbmVkIGluIGEgZmlsZSkuCi0JICogQSAidG9wLWxldmVsIiBjbGFzcyBjYW4gY29udGFpbiBhbnkgb2YgdGhlIG90aGVyIHR5cGVzIG9mIGNsYXNzZXMuIAotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RvcExldmVsKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGlzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWUubGFzdEluZGV4T2YoJyQnKSA9PSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgIm1lbWJlciIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJ0b3AtbGV2ZWwiLCAibG9jYWwiLCBvciAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgSkRLIG5hbWluZyBjb252ZW50aW9uIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgZW5kcyB3aXRoIGEgPGNvZGU+JyQnPC9jb2RlPiBmb2xsb3dlZCBieSBhIGxlZ2FsIGNsYXNzIG5hbWU7IGUuZy4KLQkgKiA8Y29kZT4iVG9wTGV2ZWxDbGFzcyQxTG9jYWxDbGFzcyRNZW1iZXJDbGFzcyI8L2NvZGU+KS4KLQkgKiBBICJtZW1iZXIiIGNsYXNzIGNhbiBiZSBlaXRoZXIgIm5lc3RlZCIgKHN0YXRpYykgb3IgImlubmVyIjsKLQkgKiBidXQgdGhlcmUgaXMgbm8gd2F5IHRvIGRldGVybWluZSB3aGljaCBmcm9tIHRoZSBjbGFzcydzIG5hbWUuCi0JICogQSAibWVtYmVyIiBjbGFzcyBjYW4gY29udGFpbiAibG9jYWwiLCAiYW5vbnltb3VzIiwgb3Igb3RoZXIKLQkgKiAibWVtYmVyIiBjbGFzc2VzOyBhbmQgdmljZS12ZXJzYS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZW1iZXIoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoaXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCckJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwkvLyAidG9wLWxldmVsIiBjbGFzcwotCQl9Ci0JCS8vIHRoZSBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGRvbGxhciBzaWduIGNhbm5vdCBiZSBhbiBBU0NJSSBkaWdpdAotCQlyZXR1cm4gISBjaGFySXNBc2NpaURpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoKytpbmRleCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAibG9jYWwiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAidG9wLWxldmVsIiwgIm1lbWJlciIsIG9yICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBKREsgbmFtaW5nIGNvbnZlbnRpb24gKGkuZS4gdGhlIGNsYXNzIG5hbWUKLQkgKiBlbmRzIHdpdGggPGNvZGU+IiRubm5YWFgiPC9jb2RlPiwKLQkgKiB3aGVyZSB0aGUgPGNvZGU+JyQnPC9jb2RlPiBpcwotCSAqIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIG51bWVyaWMgZGlnaXRzIHdoaWNoIGFyZSBmb2xsb3dlZCBieSB0aGUKLQkgKiBsb2NhbCBjbGFzcyBuYW1lOyBlLmcuIDxjb2RlPiJUb3BMZXZlbENsYXNzJDFMb2NhbENsYXNzIjwvY29kZT4pLgotCSAqIEEgImxvY2FsIiBjbGFzcyBjYW4gY29udGFpbiAibWVtYmVyIiwgImFub255bW91cyIsIG9yIG90aGVyCi0JICogImxvY2FsIiBjbGFzc2VzOyBhbmQgdmljZS12ZXJzYS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NhbChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChpc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgaW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJyQnKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CS8vICJ0b3AtbGV2ZWwiIGNsYXNzCi0JCX0KLQkJaWYgKCAhIGNoYXJJc0FzY2lpRGlnaXQoY2xhc3NOYW1lLmNoYXJBdCgrK2luZGV4KSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vICJtZW1iZXIiIGNsYXNzCi0JCX0KLQkJaW50IGxlbiA9IGNsYXNzTmFtZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9ICsraW5kZXg7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKCAhIGNoYXJJc0FzY2lpRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUgJyQnIGFyZSBBU0NJSSBkaWdpdHMgKCJhbm9ueW1vdXMiIGNsYXNzKQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhbiAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJtZW1iZXIiLCBvciAibG9jYWwiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBKREsgbmFtaW5nIGNvbnZlbnRpb24gKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBlbmRzIHdpdGggPGNvZGU+IiRubm4iPC9jb2RlPiB3aGVyZSBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUKLQkgKiBsYXN0IDxjb2RlPickJzwvY29kZT4gYXJlIEFTQ0lJIG51bWVyaWMgZGlnaXRzOwotCSAqIGUuZy4gPGNvZGU+IlRvcExldmVsQ2xhc3MkMSI8L2NvZGU+KS4KLQkgKiBBbiAiYW5vbnltb3VzIiBjbGFzcyBjYW4gY29udGFpbiAibWVtYmVyIiwgImxvY2FsIiwgb3Igb3RoZXIKLQkgKiAiYW5vbnltb3VzIiBjbGFzc2VzOyBhbmQgdmljZS12ZXJzYS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbm9ueW1vdXMoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoaXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCckJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwkvLyAidG9wLWxldmVsIiBjbGFzcwotCQl9Ci0JCWlmICggISBjaGFySXNBc2NpaURpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoKytpbmRleCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyAibWVtYmVyIiBjbGFzcwotCQl9Ci0JCWludCBsZW4gPSBjbGFzc05hbWUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSArK2luZGV4OyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICggISBjaGFySXNBc2NpaURpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoaSkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOyAgLy8gImxvY2FsIiBjbGFzcwotCQkJfQotCQl9Ci0JCS8vIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZSAnJCcgYXJlIEFTQ0lJIGRpZ2l0cyAoImFub255bW91cyIgY2xhc3MpCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBDaGFyYWN0ZXIjaXNEaWdpdChjaGFyKX0gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBmb3Igc29tZSBub24tQVNDSUkKLQkgKiBkaWdpdHMuIFRoaXMgbWV0aG9kIGRvZXMgbm90LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hhcklzQXNjaWlEaWdpdChjaGFyIGMpIHsKLQkJcmV0dXJuICgnMCcgPD0gYykgJiYgKGMgPD0gJzknKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInJlZmVyZW5jZSIKLQkgKiBjbGFzcyAoaS5lLiBuZWl0aGVyIDxjb2RlPnZvaWQ8L2NvZGU+IG5vciBvbmUgb2YgdGhlIHByaW1pdGl2ZSB2YXJpYWJsZSBjbGFzc2VzLAotCSAqIDxjb2RlPmJvb2xlYW48L2NvZGU+LCA8Y29kZT5pbnQ8L2NvZGU+LCA8Y29kZT5mbG9hdDwvY29kZT4sIGV0Yy4pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZmVyZW5jZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiAhIGlzUHJpbWl0aXZlKGNsYXNzTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuIDxjb2RlPnZvaWQ8L2NvZGU+IG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIGNsYXNzZXMsCi0JICogPGNvZGU+Ym9vbGVhbjwvY29kZT4sIDxjb2RlPmludDwvY29kZT4sIDxjb2RlPmZsb2F0PC9jb2RlPiwgZXRjLikuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGlzQXJyYXkoY2xhc3NOYW1lKSB8fCAoY2xhc3NOYW1lLmxlbmd0aCgpID4gUmVmbGVjdGlvblRvb2xzLk1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWZvciAoUmVmbGVjdGlvblRvb2xzLlByaW1pdGl2ZSBwcmltaXRpdmUgOiBSZWZsZWN0aW9uVG9vbHMuUFJJTUlUSVZFUykgewotCQkJaWYgKGNsYXNzTmFtZS5lcXVhbHMocHJpbWl0aXZlLmphdmFDbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwcmltaXRpdmUgd3JhcHBlcgotCSAqIGNsYXNzIChpLmUuIDxjb2RlPmphdmEubGFuZy5Wb2lkPC9jb2RlPiBvciBvbmUgb2YgdGhlIHByaW1pdGl2ZQotCSAqIHZhcmlhYmxlIHdyYXBwZXIgY2xhc3NlcywgPGNvZGU+amF2YS5sYW5nLkJvb2xlYW48L2NvZGU+LAotCSAqIDxjb2RlPmphdmEubGFuZy5JbnRlZ2VyPC9jb2RlPiwgPGNvZGU+amF2YS5sYW5nLkZsb2F0PC9jb2RlPiwgZXRjLikuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlV3JhcHBlcihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChpc0FycmF5KGNsYXNzTmFtZSkgfHwgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IFJlZmxlY3Rpb25Ub29scy5NQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWZvciAoUmVmbGVjdGlvblRvb2xzLlByaW1pdGl2ZSBwcmltaXRpdmUgOiBSZWZsZWN0aW9uVG9vbHMuUFJJTUlUSVZFUykgewotCQkJaWYgKGNsYXNzTmFtZS5lcXVhbHMocHJpbWl0aXZlLndyYXBwZXJDbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuIDxjb2RlPmJvb2xlYW48L2NvZGU+LCA8Y29kZT5pbnQ8L2NvZGU+LCA8Y29kZT5mbG9hdDwvY29kZT4sIGV0Yy4sCi0JICogYnV0IG5vdCA8Y29kZT52b2lkPC9jb2RlPikuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFyaWFibGVQcmltaXRpdmUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gaXNQcmltaXRpdmUoY2xhc3NOYW1lKQotCQkJJiYgKCAhIGNsYXNzTmFtZS5lcXVhbHMoVk9JRF9DTEFTU19OQU1FKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlIHdyYXBwZXIKLQkgKiBjbGFzcyAoaS5lLiA8Y29kZT5qYXZhLmxhbmcuQm9vbGVhbjwvY29kZT4sCi0JICogPGNvZGU+amF2YS5sYW5nLkludGVnZXI8L2NvZGU+LCA8Y29kZT5qYXZhLmxhbmcuRmxvYXQ8L2NvZGU+LCBldGMuLAotCSAqIGJ1dCBub3QgPGNvZGU+amF2YS5sYW5nLlZvaWQ8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiA8Y29kZT52b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gaXNQcmltaXRpdmVXcmFwcGVyKGNsYXNzTmFtZSkKLQkJCSYmICggISBjbGFzc05hbWUuZXF1YWxzKFZPSURfV1JBUFBFUl9DTEFTU19OQU1FKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcmltaXRpdmUgd3JhcHBlciBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBwcmltaXRpdmUgY2xhc3MuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIG5vdCBhIHByaW1pdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXcmFwcGVyQ2xhc3NOYW1lKFN0cmluZyBwcmltaXRpdmVDbGFzc05hbWUpIHsKLQkJZm9yIChSZWZsZWN0aW9uVG9vbHMuUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFJlZmxlY3Rpb25Ub29scy5QUklNSVRJVkVTKSB7Ci0JCQlpZiAocHJpbWl0aXZlLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKHByaW1pdGl2ZUNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gcHJpbWl0aXZlLndyYXBwZXJDbGFzcy5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcmltaXRpdmUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkCi0JICogcHJpbWl0aXZlIHdyYXBwZXIgY2xhc3MuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogaXMgbm90IGEgcHJpbWl0aXZlIHdyYXBwZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJpbWl0aXZlQ2xhc3NOYW1lKFN0cmluZyBwcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lKSB7Ci0JCWZvciAoUmVmbGVjdGlvblRvb2xzLlByaW1pdGl2ZSBwcmltaXRpdmUgOiBSZWZsZWN0aW9uVG9vbHMuUFJJTUlUSVZFUykgewotCQkJaWYgKHByaW1pdGl2ZS53cmFwcGVyQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhwcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lKSkgewotCQkJCXJldHVybiBwcmltaXRpdmUuamF2YUNsYXNzLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR3byBjbGFzcyBuYW1lcyBhcmUgZXF1aXZhbGVudCwgZ2l2ZW4gYXV0b2JveGluZy4KLQkgKiAoZS5nLiAiamF2YS5sYW5nLkludGVnZXIiIGFuZCAiaW50IiBzaG91bGQgYmUgZXF1aXZhbGVudCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXJlQXV0b2JveEVxdWl2YWxlbnRzKFN0cmluZyBjbGFzc05hbWUxLCBTdHJpbmcgY2xhc3NOYW1lMikgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwoY2xhc3NOYW1lMSwgY2xhc3NOYW1lMikKLQkJCXx8IFRvb2xzLnZhbHVlc0FyZUVxdWFsKGdldFByaW1pdGl2ZUNsYXNzTmFtZShjbGFzc05hbWUxKSwgY2xhc3NOYW1lMikKLQkJCXx8IFRvb2xzLnZhbHVlc0FyZUVxdWFsKGdldFdyYXBwZXJDbGFzc05hbWUoY2xhc3NOYW1lMSksIGNsYXNzTmFtZTIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmltaXRpdmUgY29kZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmltaXRpdmUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgY2xhc3MgY29kZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjb2RlCi0JICogaXMgbm90IGEgcHJpbWl0aXZlIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9yQ29kZShpbnQgY2xhc3NDb2RlKSB7Ci0JCXJldHVybiBmb3JDb2RlKChjaGFyKSBjbGFzc0NvZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgcHJpbWl0aXZlIGNsYXNzIGNvZGUuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY29kZQotCSAqIGlzIG5vdCBhIHByaW1pdGl2ZSBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvckNvZGUoY2hhciBjbGFzc0NvZGUpIHsKLQkJQ2xhc3M8Pz4gcHJpbWl0aXZlQ2xhc3MgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NGb3JDb2RlKGNsYXNzQ29kZSk7Ci0JCXJldHVybiAocHJpbWl0aXZlQ2xhc3MgPT0gbnVsbCkgPyBudWxsIDogcHJpbWl0aXZlQ2xhc3MuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgY2xhc3MuCi0JICogUmV0dXJuIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBpcyBub3QgYSBwcmltaXRpdmUgY2xhc3MuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIGdldENvZGVGb3JDbGFzc05hbWUoU3RyaW5nIHByaW1pdGl2ZUNsYXNzTmFtZSkgewotCQlpZiAoKCAhIGlzQXJyYXkocHJpbWl0aXZlQ2xhc3NOYW1lKSkgJiYgKHByaW1pdGl2ZUNsYXNzTmFtZS5sZW5ndGgoKSA8PSBSZWZsZWN0aW9uVG9vbHMuTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCkpIHsKLQkJCWZvciAoUmVmbGVjdGlvblRvb2xzLlByaW1pdGl2ZSBwcmltaXRpdmUgOiBSZWZsZWN0aW9uVG9vbHMuUFJJTUlUSVZFUykgewotCQkJCWlmIChwcmltaXRpdmUuamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMocHJpbWl0aXZlQ2xhc3NOYW1lKSkgewotCQkJCQlyZXR1cm4gcHJpbWl0aXZlLmNvZGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXN0YXRpYyB2b2lkIGFwcGVuZChTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfQ09ERSk7Ci0JCXNiLmFwcGVuZChjbGFzc05hbWUpOwotCQlzYi5hcHBlbmQoUkVGRVJFTkNFX0NMQVNTX05BTUVfREVMSU1JVEVSKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3VwcHJlc3NlZCBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQ2xhc3NOYW1lKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9DbGFzc3BhdGguamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9DbGFzc3BhdGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxYWU4MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NwYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqIDxjb2RlPkNsYXNzcGF0aDwvY29kZT4gbW9kZWxzIGEgSmF2YSBjbGFzc3BhdGgsIHdoaWNoIGNvbnNpc3RzIG9mIGEgbGlzdCBvZgotICoge0BsaW5rIEVudHJ5fXMsIGVhY2ggb2Ygd2hpY2ggY29udGFpbiBKYXZhIGNsYXNzZXMuIFRoZSBjbGFzc3BhdGggY2FuIHJldHVybgotICogdGhlIG5hbWVzIG9mIGNsYXNzZXMgZm91bmQgaW4gaXQgZXRjLiBUaGVyZSBhcmUgYSBudW1iZXIgb2Ygc3RhdGljCi0gKiBjb252ZW5pZW5jZSBtZXRob2RzIHRoYXQgY2FuIGJlIHVzZSB0byBjb25zdHJ1Y3QgPGNvZGU+Q2xhc3NwYXRoPC9jb2RlPnMKLSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEphdmEgY2xhc3NwYXRoIGV0Yy4KLSAqLwotcHVibGljIGNsYXNzIENsYXNzcGF0aAotCWltcGxlbWVudHMgU2VyaWFsaXphYmxlCi17Ci0JLyoqIFRoZSBlbnRyaWVzIGluIHRoZSBjbGFzc3BhdGggKi8KLQlwcml2YXRlIGZpbmFsIEVudHJ5W10gZW50cmllczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8vICoqKioqIGZhY3RvcnkgbWV0aG9kcyBmb3IgInN0YW5kYXJkIiBjbGFzc3BhdGhzICoqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgImJvb3QiIGNsYXNzcGF0aC4gVGhpcyBpbmNsdWRlcyA8Y29kZT5ydC5qYXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoIGJvb3RDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NwYXRoKFN5c3RlbS5nZXRQcm9wZXJ0eSgic3VuLmJvb3QuY2xhc3MucGF0aCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSAidmlydHVhbCBjbGFzc3BhdGgiIHRoYXQgY29udGFpbnMgYWxsIHRoZSBqYXJzCi0JICogdGhhdCB3b3VsZCBiZSB1c2VkIGJ5IHRoZSBKYXZhIEV4dGVuc2lvbiBNZWNoYW5pc20uCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGggamF2YUV4dGVuc2lvbkNsYXNzcGF0aCgpIHsKLQkJRmlsZVtdIGRpcnMgPSBqYXZhRXh0ZW5zaW9uRGlyZWN0b3JpZXMoKTsKLQkJTGlzdDxTdHJpbmc+IGphckZpbGVOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKEZpbGUgZGlyIDogZGlycykgewotCQkJaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJYWRkSmFyRmlsZU5hbWVzVG8oZGlyLCBqYXJGaWxlTmFtZXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgQ2xhc3NwYXRoKGphckZpbGVOYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhICJzeXN0ZW0iIGNsYXNzcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzcGF0aCBqYXZhQ2xhc3NwYXRoKCkgewotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdW5yZXRvdWNoZWQgImNvbXBsZXRlIiBjbGFzc3BhdGguCi0JICogVGhpcyBpbmNsdWRlcyB0aGUgYm9vdCBjbGFzc3BhdGgsIHRoZSBKYXZhIEV4dGVuc2lvbgotCSAqIE1lY2hhbmlzbSBjbGFzc3BhdGgsIGFuZCB0aGUgbm9ybWFsICJzeXN0ZW0iIGNsYXNzcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzcGF0aCBjb21wbGV0ZUNsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgobmV3IENsYXNzcGF0aFtdIHsKLQkJCQlib290Q2xhc3NwYXRoKCksCi0JCQkJamF2YUV4dGVuc2lvbkNsYXNzcGF0aCgpLAotCQkJCWphdmFDbGFzc3BhdGgoKQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjbGFzc3BhdGggdGhhdCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzcGF0aCBjbGFzc3BhdGhGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NwYXRoKGxvY2F0aW9uRm9yKGphdmFDbGFzcykpOwotCX0KLQotCi0JLy8gKioqKiogZmlsZSA9PiBjbGFzcyAqKioqKgotCi0JLyoqCi0JICogQ29udmVydCBhIHJlbGF0aXZlIGZpbGUgbmFtZSB0byBhIGNsYXNzIG5hbWU7IHRoaXMgd2lsbCB3b3JrIGZvcgotCSAqIGFueSBmaWxlIHRoYXQgaGFzIGEgc2luZ2xlIGV4dGVuc2lvbiBiZXlvbmQgdGhlIGJhc2UKLQkgKiBjbGFzcyBuYW1lOjx1bD4KLQkgKiA8bGk+PGNvZGU+ImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8gPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPgotCSAqIDxsaT48Y29kZT4iamF2YS9sYW5nL1N0cmluZy5qYXZhIjwvY29kZT4gaXMgY29udmVydGVkIHRvIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0NsYXNzTmFtZShTdHJpbmcgY2xhc3NGaWxlTmFtZSkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gRmlsZVRvb2xzLnN0cmlwRXh0ZW5zaW9uKGNsYXNzRmlsZU5hbWUpOwotCQkvLyBkbyB0aGlzIGZvciBhcmNoaXZlIGVudHJ5IG5hbWVzCi0JCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCcvJywgJy4nKTsKLQkJLy8gZG8gdGhpcyBmb3IgTy9TLXNwZWNpZmljIGZpbGUgbmFtZXMKLQkJaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciAhPSAnLycpIHsKLQkJCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKTsKLQkJfQotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSBmaWxlIHRvIGEgY2xhc3MgbmFtZTsKLQkgKiBlLmcuIDxjb2RlPkZpbGUoamF2YS9sYW5nL1N0cmluZy5jbGFzcyk8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQ2xhc3NOYW1lKEZpbGUgY2xhc3NGaWxlKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9DbGFzc05hbWUoY2xhc3NGaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIHJlbGF0aXZlIGZpbGUgbmFtZSB0byBhIGNsYXNzOwotCSAqIGUuZy4gPGNvZGU+ImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLmNsYXNzPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNvbnZlcnRUb0NsYXNzKFN0cmluZyBjbGFzc0ZpbGVOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBDbGFzcy5mb3JOYW1lKGNvbnZlcnRUb0NsYXNzTmFtZShjbGFzc0ZpbGVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIHJlbGF0aXZlIGZpbGUgdG8gYSBjbGFzczsKLQkgKiBlLmcuIDxjb2RlPkZpbGUoamF2YS9sYW5nL1N0cmluZy5jbGFzcyk8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPmphdmEubGFuZy5TdHJpbmcuY2xhc3M8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY29udmVydFRvQ2xhc3MoRmlsZSBjbGFzc0ZpbGUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0NsYXNzKGNsYXNzRmlsZS5nZXRQYXRoKCkpOwotCX0KLQotCi0JLy8gKioqKiogY2xhc3MgPT4gSkFSIGVudHJ5ICoqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhbiBhcmNoaXZlIGVudHJ5IG5hbWUgYmFzZTsKLQkgKiBlLmcuIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEvbGFuZy9TdHJpbmciPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9BcmNoaXZlRW50cnlOYW1lQmFzZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUucmVwbGFjZSgnLicsICcvJyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhbiBhcmNoaXZlIGVudHJ5IG5hbWUgYmFzZTsKLQkgKiBlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmcuY2xhc3M8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPiJqYXZhL2xhbmcvU3RyaW5nIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQXJjaGl2ZUVudHJ5TmFtZUJhc2UoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9BcmNoaXZlRW50cnlOYW1lQmFzZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYW4gYXJjaGl2ZSBjbGFzcyBmaWxlIGVudHJ5IG5hbWU7Ci0JICogZS5nLiA8Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPiJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9BcmNoaXZlRW50cnlOYW1lQmFzZShjbGFzc05hbWUpICsgIi5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGFuIGFyY2hpdmUgY2xhc3MgZmlsZSBlbnRyeSBuYW1lOwotCSAqIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0KLQkvLyAqKioqKiBjbGFzcyA9PiBmaWxlICguY2xhc3Mgb3IgLmphdmEpICoqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGZpbGUgbmFtZSBiYXNlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiA8Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPiJqYXZhL2xhbmcvU3RyaW5nIjwvY29kZT4gb24gVW5peCBhbmQKLQkgKiA8Y29kZT4iamF2YVxcbGFuZ1xcU3RyaW5nIjwvY29kZT4gb24gV2luZG93cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9GaWxlTmFtZUJhc2UoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSBmaWxlIG5hbWUgYmFzZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEvbGFuZy9TdHJpbmciPC9jb2RlPiBvbiBVbml4IGFuZAotCSAqIDxjb2RlPiJqYXZhXFxsYW5nXFxTdHJpbmciPC9jb2RlPiBvbiBXaW5kb3dzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0ZpbGVOYW1lQmFzZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0ZpbGVOYW1lQmFzZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYSBjbGFzcyBmaWxlIG5hbWUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiPC9jb2RlPiBvbiBVbml4IGFuZAotCSAqIDxjb2RlPiJqYXZhXFxsYW5nXFxTdHJpbmcuY2xhc3MiPC9jb2RlPiBvbiBXaW5kb3dzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY29udmVydFRvRmlsZU5hbWVCYXNlKGNsYXNzTmFtZSkgKyAiLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSBjbGFzcyBmaWxlIG5hbWUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmcuY2xhc3M8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPiJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIjwvY29kZT4gb24gVW5peCBhbmQKLQkgKiA8Y29kZT4iamF2YVxcbGFuZ1xcU3RyaW5nLmNsYXNzIjwvY29kZT4gb24gV2luZG93cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYSBjbGFzcyBmaWxlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiA8Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPkZpbGUoamF2YS9sYW5nL1N0cmluZy5jbGFzcyk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjb252ZXJ0VG9DbGFzc0ZpbGUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gbmV3IEZpbGUoY29udmVydFRvQ2xhc3NGaWxlTmFtZShjbGFzc05hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGEgY2xhc3MgZmlsZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+RmlsZShqYXZhL2xhbmcvU3RyaW5nLmNsYXNzKTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0NsYXNzRmlsZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0NsYXNzRmlsZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYSBqYXZhIGZpbGUgbmFtZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZy5qYXZhIjwvY29kZT4gb24gVW5peGwgYW5kCi0JICogPGNvZGU+ImphdmFcXGxhbmdcXFN0cmluZy5qYXZhIjwvY29kZT4gb24gV2luZG93cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9KYXZhRmlsZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY29udmVydFRvRmlsZU5hbWVCYXNlKGNsYXNzTmFtZSkgKyAiLmphdmEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGEgamF2YSBmaWxlIG5hbWUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmcuY2xhc3M8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPiJqYXZhL2xhbmcvU3RyaW5nLmphdmEiPC9jb2RlPiBvbiBVbml4IGFuZAotCSAqIDxjb2RlPiJqYXZhXFxsYW5nXFxTdHJpbmcuamF2YSI8L2NvZGU+IG9uIFdpbmRvd3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSmF2YUZpbGVOYW1lKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvSmF2YUZpbGVOYW1lKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGEgamF2YSBmaWxlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiA8Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPkZpbGUoamF2YS9sYW5nL1N0cmluZy5qYXZhKTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0phdmFGaWxlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKGNvbnZlcnRUb0phdmFGaWxlTmFtZShjbGFzc05hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSBqYXZhIGZpbGUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmcuY2xhc3M8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPkZpbGUoamF2YS9sYW5nL1N0cmluZy5qYXZhKTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0phdmFGaWxlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvSmF2YUZpbGUoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKiBjbGFzcyA9PiByZXNvdXJjZSAqKioqKgotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGEgcmVzb3VyY2UgbmFtZTsKLQkgKiBlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmcuY2xhc3M8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPiIvamF2YS9sYW5nL1N0cmluZy5jbGFzcyI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1Jlc291cmNlTmFtZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuICcvJyArIGNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoamF2YUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSByZXNvdXJjZTsKLQkgKiBlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmcuY2xhc3M8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPlVSTChqYXI6ZmlsZTovQzovamRrLzEuNC4yXzA0L2pyZS9saWIvcnQuamFyIS9qYXZhL2xhbmcvU3RyaW5nLmNsYXNzKTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgY29udmVydFRvUmVzb3VyY2UoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBqYXZhQ2xhc3MuZ2V0UmVzb3VyY2UoY29udmVydFRvUmVzb3VyY2VOYW1lKGphdmFDbGFzcykpOwotCX0KLQotCi0JLy8gKioqKiogdXRpbGl0aWVzICoqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgaXMgYW4gYXJjaGl2ZSBmaWxlOwotCSAqIGkuZS4gaXRzIG5hbWUgZW5kcyB3aXRoIDxjb2RlPiIuemlwIjwvY29kZT4gb3IgPGNvZGU+Ii5qYXIiPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZU5hbWVJc0FyY2hpdmUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCVN0cmluZyBleHQgPSBGaWxlVG9vbHMuZXh0ZW5zaW9uKGZpbGVOYW1lKS50b0xvd2VyQ2FzZSgpOwotCQlyZXR1cm4gZXh0LmVxdWFscygiLmphciIpIHx8IGV4dC5lcXVhbHMoIi56aXAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBpcyBhbiBhcmNoaXZlIGZpbGU7Ci0JICogaS5lLiBpdHMgbmFtZSBlbmRzIHdpdGggPGNvZGU+Ii56aXAiPC9jb2RlPiBvciA8Y29kZT4iLmphciI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaWxlSXNBcmNoaXZlKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZmlsZU5hbWVJc0FyY2hpdmUoZmlsZS5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hhdCBzaG91bGQgYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBmaWxlIG5hbWUKLQkgKiBmb3IgdGhlIEpSRSBydW50aW1lIEpBUjsKLQkgKiBlLmcuIDxjb2RlPiJDOlxqZGsxLjQuMl8wNFxqcmVcbGliXHJ0LmphciI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ0SmFyTmFtZSgpIHsKLQkJcmV0dXJuIGxvY2F0aW9uRm9yKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIGZyb20gd2hlcmUgdGhlIHNwZWNpZmllZCBjbGFzcyB3YXMgbG9hZGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvY2F0aW9uRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlVUkwgdXJsID0gY29udmVydFRvUmVzb3VyY2UoamF2YUNsYXNzKTsKLQkJU3RyaW5nIHBhdGg7Ci0JCXRyeSB7Ci0JCQlwYXRoID0gRmlsZVRvb2xzLmJ1aWxkRmlsZSh1cmwpLmdldFBhdGgoKTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQkJU3RyaW5nIHByb3RvY29sID0gdXJsLmdldFByb3RvY29sKCkudG9Mb3dlckNhc2UoKTsKLQkJaWYgKHByb3RvY29sLmVxdWFscygiamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gaWYgdGhlIGNsYXNzIGlzIGluIGEgSkFSLCB0aGUgVVJMIHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgotCQkJLy8gICAgIGphcjpmaWxlOi9DOi9qZGsvMS40LjJfMDQvanJlL2xpYi9ydC5qYXIhL2phdmEvbGFuZy9TdHJpbmcuY2xhc3MKLQkJCXJldHVybiBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmluZGV4T2YoJyEnKSk7Ci0JCX0gZWxzZSBpZiAocHJvdG9jb2wuZXF1YWxzKCJmaWxlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gaWYgdGhlIGNsYXNzIGlzIGluIGEgZGlyZWN0b3J5LCB0aGUgVVJMIHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgotCQkJLy8gICAgIGZpbGU6L0M6L2Rldi9tYWluL213ZGV2L2NsYXNzL29yZy9lY2xpcHNlL2RhbGkvdXRpbGl0eS9DbGFzc3BhdGguY2xhc3MKLQkJCXJldHVybiBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhQ2xhc3MpLmxlbmd0aCgpIC0gMSk7Ci0JCX0gZWxzZSBpZiAocHJvdG9jb2wuZXF1YWxzKCJidW5kbGVyZXNvdXJjZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIGlmIHRoZSBjbGFzcyBpcyBpbiBhIGJ1bmRsZSByZXNvdXJjZSAoRWNsaXBzZT8pLCB0aGUgVVJMIHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgotCQkJLy8gICAgIGJ1bmRsZXJlc291cmNlOi8vNDMvb3JnL2VjbGlwc2UvZGFsaS91dGlsaXR5L0NsYXNzcGF0aC5jbGFzcwotCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGphdmFDbGFzcykubGVuZ3RoKCkgLSAxKTsKLQkJfQotCi0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24odXJsLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRpcmVjdG9yaWVzIHVzZWQgYnkgdGhlIEphdmEgRXh0ZW5zaW9uIE1lY2hhbmlzbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGVbXSBqYXZhRXh0ZW5zaW9uRGlyZWN0b3JpZXMoKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9GaWxlcyhqYXZhRXh0ZW5zaW9uRGlyZWN0b3J5TmFtZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkaXJlY3RvcnkgbmFtZXMgdXNlZCBieSB0aGUgSmF2YSBFeHRlbnNpb24gTWVjaGFuaXNtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gamF2YUV4dGVuc2lvbkRpcmVjdG9yeU5hbWVzKCkgewotCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmV4dC5kaXJzIikuc3BsaXQoRmlsZS5wYXRoU2VwYXJhdG9yKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKiogaW50ZXJuYWwgKioqKioKLQotCXByaXZhdGUgc3RhdGljIEZpbGVbXSBjb252ZXJ0VG9GaWxlcyhTdHJpbmdbXSBmaWxlTmFtZXMpIHsKLQkJRmlsZVtdIGZpbGVzID0gbmV3IEZpbGVbZmlsZU5hbWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSBmaWxlTmFtZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWZpbGVzW2ldID0gbmV3IEZpbGUoZmlsZU5hbWVzW2ldKTsKLQkJfQotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKYXJGaWxlTmFtZXNUbyhGaWxlIGRpciwgTGlzdDxTdHJpbmc+IGphckZpbGVOYW1lcykgewotCQlGaWxlW10gamFyRmlsZXMgPSBqYXJGaWxlc0luKGRpcik7Ci0JCWZvciAoRmlsZSBqYXJGaWxlIDogamFyRmlsZXMpIHsKLQkJCWphckZpbGVOYW1lcy5hZGQoRmlsZVRvb2xzLmNhbm9uaWNhbEZpbGUoamFyRmlsZSkuZ2V0UGF0aCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEZpbGVbXSBqYXJGaWxlc0luKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCXJldHVybiBkaXJlY3RvcnkubGlzdEZpbGVzKGphckZpbGVGaWx0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZUZpbHRlciBqYXJGaWxlRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKSB7Ci0JCQkJcmV0dXJuIEZpbGVUb29scy5leHRlbnNpb24oZmlsZS5nZXROYW1lKCkpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCIuamFyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNsYXNzcGF0aCB3aXRoIHRoZSBzcGVjaWZpZWQgZW50cmllcy4KLQkgKi8KLQlwcml2YXRlIENsYXNzcGF0aChFbnRyeVtdIGVudHJpZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbnRyaWVzID0gZW50cmllczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjbGFzc3BhdGggd2l0aCB0aGUgc3BlY2lmaWVkIGVudHJpZXMuCi0JICovCi0JcHVibGljIENsYXNzcGF0aChTdHJpbmcuLi4gZmlsZU5hbWVzKSB7Ci0JCXRoaXMoYnVpbGRFbnRyaWVzKGZpbGVOYW1lcykpOwotCX0KLQotCS8qKgotCSAqIFNraXAgZW1wdHkgZmlsZSBuYW1lcyBiZWNhdXNlIHRoZXkgd2lsbCBlbmQgdXAgZXhwYW5kaW5nIHRvIHRoZSBjdXJyZW50Ci0JICogd29ya2luZyBkaXJlY3RvcnksIHdoaWNoIGlzIG5vdCB3aGF0IHdlIHdhbnQuIEVtcHR5IGZpbGUgbmFtZXMgYWN0dWFsbHkKLQkgKiBvY2N1ciB3aXRoIHNvbWUgZnJlcXVlbmN5OyBzdWNoIGFzIHdoZW4gdGhlIGNsYXNzcGF0aCBoYXMgYmVlbiBidWlsdCB1cAotCSAqIGR5bmFtaWNhbGx5IHdpdGggdG9vIG1hbnkgc2VwYXJhdG9ycy4gRm9yIGV4YW1wbGU6PHByZT4KLQkgKiAgICAgIkM6XGRldlxmb28uamFyOztDOlxkZXZcYmFyLmphciIKLQkgKiA8L3ByZT53aWxsIGJlIHBhcnNlZCBpbnRvIHRocmVlIGZpbGUgbmFtZXM6PHByZT4KLQkgKiAgICAgeyAiQzpcZGV2XGZvby5qYXIiLCAiIiwgIkM6XGRldlxiYXIuamFyIiB9Ci0JICogPC9wcmU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRW50cnlbXSBidWlsZEVudHJpZXMoU3RyaW5nW10gZmlsZU5hbWVzKSB7Ci0JCUxpc3Q8RW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PEVudHJ5PigpOwotCQlmb3IgKFN0cmluZyBmaWxlTmFtZSA6IGZpbGVOYW1lcykgewotCQkJaWYgKChmaWxlTmFtZSAhPSBudWxsKSAmJiAoZmlsZU5hbWUubGVuZ3RoKCkgIT0gMCkpIHsKLQkJCQllbnRyaWVzLmFkZChuZXcgRW50cnkoZmlsZU5hbWUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW50cmllcy50b0FycmF5KG5ldyBFbnRyeVtlbnRyaWVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNsYXNzcGF0aCB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aC4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoKFN0cmluZyBwYXRoKSB7Ci0JCXRoaXMocGF0aC5zcGxpdChGaWxlLnBhdGhTZXBhcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjbGFzc3BhdGggd2l0aCB0aGUgc3BlY2lmaWVkIGVudHJpZXMuCi0JICovCi0JcHVibGljIENsYXNzcGF0aChJdGVyYWJsZTxTdHJpbmc+IGZpbGVOYW1lcykgewotCQl0aGlzKEFycmF5VG9vbHMuYXJyYXkoZmlsZU5hbWVzLCBFTVBUWV9TVFJJTkdfQVJSQVkpKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLQotCS8qKgotCSAqIENvbnNvbGlkYXRlIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRocyBpbnRvIGEgc2luZ2xlIGNsYXNzcGF0aC4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoKENsYXNzcGF0aC4uLiBjbGFzc3BhdGhzKSB7Ci0JCXRoaXMoY29uc29saWRhdGVFbnRyaWVzKGNsYXNzcGF0aHMpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFbnRyeVtdIGNvbnNvbGlkYXRlRW50cmllcyhDbGFzc3BhdGhbXSBjbGFzc3BhdGhzKSB7Ci0JCUxpc3Q8RW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PEVudHJ5PigpOwotCQlmb3IgKENsYXNzcGF0aCBjbGFzc3BhdGggOiBjbGFzc3BhdGhzKSB7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGVudHJpZXMsIGNsYXNzcGF0aC5nZXRFbnRyaWVzKCkpOwotCQl9Ci0JCXJldHVybiBlbnRyaWVzLnRvQXJyYXkobmV3IEVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzc3BhdGgncyBlbnRyaWVzLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxFbnRyeT4gZ2V0RW50cmllcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPEVudHJ5Pih0aGlzLmVudHJpZXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3NwYXRoJ3MgcGF0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCWludCBtYXggPSB0aGlzLmVudHJpZXMubGVuZ3RoIC0gMTsKLQkJaWYgKG1heCA9PSAtMSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMDApOwotCQkvLyBzdG9wIG9uZSBzaG9ydCBvZiB0aGUgZW5kIG9mIHRoZSBhcnJheQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5lbnRyaWVzW2ldLmdldEZpbGVOYW1lKCkpOwotCQkJc2IuYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvckNoYXIpOwotCQl9Ci0JCXNiLmFwcGVuZCh0aGlzLmVudHJpZXNbbWF4XS5nZXRGaWxlTmFtZSgpKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoIHRoZSBjbGFzc3BhdGggZm9yIHRoZSBzcGVjaWZpZWQgKHVucXVhbGlmaWVkKSBmaWxlCi0JICogYW5kIHJldHVybiBpdHMgZW50cnkuIFJldHVybiBudWxsIGlmIGFuIGVudHJ5IGlzIG5vdCBmb3VuZC4KLQkgKiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHVzZSB0aGlzIG1ldGhvZCB0byBmaW5kIHRoZSBlbnRyeQotCSAqIGZvciA8Y29kZT4icnQuamFyIjwvY29kZT4gb3IgPGNvZGU+InRvcGxpbmsuamFyIjwvY29kZT4uCi0JICovCi0JcHVibGljIEVudHJ5IGdldEVudHJ5Rm9yRmlsZU5hbWVkKFN0cmluZyBzaG9ydEZpbGVOYW1lKSB7Ci0JCWZvciAoRW50cnkgZW50cnkgOiB0aGlzLmVudHJpZXMpIHsKLQkJCWlmIChlbnRyeS5nZXRGaWxlKCkuZ2V0TmFtZSgpLmVxdWFscyhzaG9ydEZpbGVOYW1lKSkgewotCQkJCXJldHVybiBlbnRyeTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGVudHJ5IGZpbGUgaW4gdGhlIGNsYXNzcGF0aAotCSAqIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBSZXR1cm4gbnVsbCBpZiBhbiBlbnRyeSBpcyBub3QgZm91bmQuCi0JICovCi0JcHVibGljIEVudHJ5IGdldEVudHJ5Rm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCVN0cmluZyByZWxhdGl2ZUNsYXNzRmlsZU5hbWUgPSBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGNsYXNzTmFtZSk7Ci0JCVN0cmluZyBhcmNoaXZlRW50cnlOYW1lID0gY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShjbGFzc05hbWUpOwotCQlmb3IgKEVudHJ5IGVudHJ5IDogdGhpcy5lbnRyaWVzKSB7Ci0JCQlpZiAoZW50cnkuY29udGFpbnMocmVsYXRpdmVDbGFzc0ZpbGVOYW1lLCBhcmNoaXZlRW50cnlOYW1lKSkgewotCQkJCXJldHVybiBlbnRyeTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGgsCi0JICogd2l0aCBkdXBsaWNhdGVzIHJlbW92ZWQuCi0JICogQHNlZSAjY2xhc3NOYW1lcygpCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2xhc3NOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3NOYW1lcyhGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIGFuZCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlciwgd2l0aCBkdXBsaWNhdGVzIHJlbW92ZWQuCi0JICogQHNlZSAjY2xhc3NOYW1lcyhGaWx0ZXIpCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2xhc3NOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KDEwMDAwKTsKLQkJdGhpcy5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgZmlsdGVyKTsKLQkJcmV0dXJuIGNsYXNzTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENsYXNzTmFtZXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcykgewotCQl0aGlzLmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzLCBGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIGFuZCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlciB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2xhc3NOYW1lc1RvKENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJZm9yIChFbnRyeSBlbnRyeSA6IHRoaXMuZW50cmllcykgewotCQkJZW50cnkuYWRkQ2xhc3NOYW1lc1RvKGNsYXNzTmFtZXMsIGZpbHRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGguCi0JICogSnVzdCBhIGJpdCBtb3JlIHBlcmZvcm1hbnQgdGhhbiB7QGxpbmsgI2dldENsYXNzTmFtZXMoKX0uCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lcyhGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIHRoYXQgYXJlIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyLgotCSAqIEp1c3QgYSBiaXQgbW9yZSBwZXJmb3JtYW50IHRoYW4ge0BsaW5rICNnZXRDbGFzc05hbWVzKEZpbHRlcil9LgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPih0aGlzLmVudHJ5Q2xhc3NOYW1lc0l0ZXJhdG9ycyhmaWx0ZXIpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGVudHJ5Q2xhc3NOYW1lc0l0ZXJhdG9ycyhmaW5hbCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEVudHJ5LCBJdGVyYXRvcjxTdHJpbmc+PihuZXcgQXJyYXlJdGVyYXRvcjxFbnRyeT4odGhpcy5lbnRyaWVzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB0cmFuc2Zvcm0oRW50cnkgZW50cnkpIHsKLQkJCQlyZXR1cm4gZW50cnkuY2xhc3NOYW1lcyhmaWx0ZXIpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhICJjb21wcmVzc2VkIiB2ZXJzaW9uIG9mIHRoZSBjbGFzc3BhdGggd2l0aCBpdHMKLQkgKiBkdXBsaWNhdGUgZW50cmllcyBlbGltaW5hdGVkLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGggY29tcHJlc3NlZCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgoQXJyYXlUb29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyh0aGlzLmVudHJpZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBjbGFzc3BhdGggdG8gYW4gYXJyYXkgb2YgVVJMcwotCSAqICh0aGF0IGNhbiBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGEge0BsaW5rIGphdmEubmV0LlVSTENsYXNzTG9hZGVyfSkuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPFVSTD4gZ2V0VVJMcygpIHsKLQkJaW50IGxlbiA9IHRoaXMuZW50cmllcy5sZW5ndGg7Ci0JCVVSTFtdIHVybHMgPSBuZXcgVVJMW2xlbl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXVybHNbaV0gPSB0aGlzLmVudHJpZXNbaV0uZ2V0VVJMKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPFVSTD4odXJscyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5nZXRQYXRoKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiA8Y29kZT5FbnRyeTwvY29kZT4gbW9kZWxzIGEgSmF2YSBjbGFzc3BhdGggZW50cnksIHdoaWNoIGNhbiBiZSBlaXRoZXIgYQotCSAqIGRpcmVjdG9yeSBjb250YWluaW5nIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgb3IgYSBKQVIgZmlsZSAob3IsCi0JICogc2ltaWxhcmx5LCBhIDxjb2RlPi56aXA8L2NvZGU+IGZpbGUpLiBUaGUgZW50cnkgY2FuIHJldHVybiB0aGUgbmFtZXMgb2YKLQkgKiBjbGFzc2VzIGZvdW5kIGluIGl0IGV0Yy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVudHJ5IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZU5hbWU7Ci0JCXByaXZhdGUgZmluYWwgRmlsZSBmaWxlOwotCQlwcml2YXRlIGZpbmFsIEZpbGUgY2Fub25pY2FsRmlsZTsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlFbnRyeShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAoKGZpbGVOYW1lID09IG51bGwpIHx8IChmaWxlTmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidmaWxlTmFtZScgbXVzdCBiZSBub24tZW1wdHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotCQkJdGhpcy5maWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQkJdGhpcy5jYW5vbmljYWxGaWxlID0gRmlsZVRvb2xzLmNhbm9uaWNhbEZpbGUodGhpcy5maWxlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5maWxlTmFtZTsKLQkJfQotCi0JCXB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5maWxlOwotCQl9Ci0KLQkJcHVibGljIEZpbGUgZ2V0Q2Fub25pY2FsRmlsZSgpIHsKLQkJCXJldHVybiB0aGlzLmNhbm9uaWNhbEZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENhbm9uaWNhbEZpbGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuY2Fub25pY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmICggISAobyBpbnN0YW5jZW9mIEVudHJ5KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiAoKEVudHJ5KSBvKS5jYW5vbmljYWxGaWxlLmVxdWFscyh0aGlzLmNhbm9uaWNhbEZpbGUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jYW5vbmljYWxGaWxlLmhhc2hDb2RlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBlbnRyeSdzICJjYW5vbmljYWwiIFVSTC4KLQkJICovCi0JCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gdGhpcy5jYW5vbmljYWxGaWxlLnRvVVJJKCkudG9VUkwoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRyeSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb250YWlucyhqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50cnkgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCXJldHVybiB0aGlzLmNvbnRhaW5zKGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoY2xhc3NOYW1lKSwgY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShjbGFzc05hbWUpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50cnkgY29udGFpbnMgZWl0aGVyIHRoZSBzcGVjaWZpZWQgcmVsYXRpdmUKLQkJICogY2xhc3MgZmlsZSBvciB0aGUgc3BlY2lmaWVkIGFyY2hpdmUgZW50cnkuCi0JCSAqIE5vdCB0aGUgcHJldHRpZXN0IHNpZ25hdHVyZSwgYnV0IGl0J3MgaW50ZXJuYWwuLi4uCi0JCSAqLwotCQlib29sZWFuIGNvbnRhaW5zKFN0cmluZyByZWxhdGl2ZUNsYXNzRmlsZU5hbWUsIFN0cmluZyBhcmNoaXZlRW50cnlOYW1lKSB7Ci0JCQlpZiAoICEgdGhpcy5jYW5vbmljYWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKHRoaXMuY2Fub25pY2FsRmlsZS5pc0RpcmVjdG9yeSgpICYmIChuZXcgRmlsZSh0aGlzLmNhbm9uaWNhbEZpbGUsIHJlbGF0aXZlQ2xhc3NGaWxlTmFtZSkpLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gKGZpbGVJc0FyY2hpdmUodGhpcy5jYW5vbmljYWxGaWxlKSAmJiB0aGlzLmFyY2hpdmVDb250YWluc0VudHJ5KGFyY2hpdmVFbnRyeU5hbWUpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50cnkncyBhcmNoaXZlIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZW50cnkuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gYXJjaGl2ZUNvbnRhaW5zRW50cnkoU3RyaW5nIHppcEVudHJ5TmFtZSkgewotCQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKLQkJCVppcEVudHJ5IHppcEVudHJ5ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHRoaXMuY2Fub25pY2FsRmlsZSk7Ci0JCQkJemlwRW50cnkgPSB6aXBGaWxlLmdldEVudHJ5KHppcEVudHJ5TmFtZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNvbWV0aGluZyBpcyB3cm9uZywgbGVhdmUgdGhlIGVudHJ5IG51bGwKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHppcEZpbGUgIT0gbnVsbCkgewotCQkJCQkJemlwRmlsZS5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJemlwRW50cnkgPSBudWxsOwkvLyBzb21ldGhpbmcgaXMgd3JvbmcsIGNsZWFyIG91dCB0aGUgZW50cnkKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gemlwRW50cnkgIT0gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIGluIHRoZSBlbnRyeS4KLQkJICogQHNlZSAjY2xhc3NOYW1lcygpCi0JCSAqLwotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDbGFzc05hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3NOYW1lcyhGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgaW4gdGhlIGVudHJ5Ci0JCSAqIGFuZCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlci4KLQkJICogQHNlZSAjY2xhc3NOYW1lcyhGaWx0ZXIpCi0JCSAqLwotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDbGFzc05hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMjAwMCk7Ci0JCQl0aGlzLmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzLCBmaWx0ZXIpOwotCQkJcmV0dXJuIGNsYXNzTmFtZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBpbiB0aGUgZW50cnkKLQkJICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkQ2xhc3NOYW1lc1RvKENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzKSB7Ci0JCQl0aGlzLmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzLCBGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgaW4gdGhlIGVudHJ5Ci0JCSAqIGFuZCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlciB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRDbGFzc05hbWVzVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJaWYgKHRoaXMuY2Fub25pY2FsRmlsZS5leGlzdHMoKSkgewotCQkJCWlmICh0aGlzLmNhbm9uaWNhbEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCQl0aGlzLmFkZENsYXNzTmFtZXNGb3JEaXJlY3RvcnlUbyhjbGFzc05hbWVzLCBmaWx0ZXIpOwotCQkJCX0gZWxzZSBpZiAoZmlsZUlzQXJjaGl2ZSh0aGlzLmNhbm9uaWNhbEZpbGUpKSB7Ci0JCQkJCXRoaXMuYWRkQ2xhc3NOYW1lc0ZvckFyY2hpdmVUbyhjbGFzc05hbWVzLCBmaWx0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkCi0JCSAqIHVuZGVyIHRoZSBlbnRyeSdzIGRpcmVjdG9yeSBhbmQgYWNjZXB0ZWQgYnkKLQkJICogdGhlIHNwZWNpZmllZCBmaWx0ZXIgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGFkZENsYXNzTmFtZXNGb3JEaXJlY3RvcnlUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlpbnQgc3RhcnQgPSB0aGlzLmNhbm9uaWNhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkubGVuZ3RoKCkgKyAxOwotCQkJZm9yIChJdGVyYXRvcjxGaWxlPiBzdHJlYW0gPSB0aGlzLmNsYXNzRmlsZXNGb3JEaXJlY3RvcnkoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbnZlcnRUb0NsYXNzTmFtZShzdHJlYW0ubmV4dCgpLmdldEFic29sdXRlUGF0aCgpLnN1YnN0cmluZyhzdGFydCkpOwotCQkJCWlmIChmaWx0ZXIuYWNjZXB0KGNsYXNzTmFtZSkpIHsKLQkJCQkJY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgY2xhc3MgZmlsZXMgZGlzY292ZXJlZAotCQkgKiB1bmRlciB0aGUgZW50cnkncyBkaXJlY3RvcnkuCi0JCSAqLwotCQlwcml2YXRlIEl0ZXJhdG9yPEZpbGU+IGNsYXNzRmlsZXNGb3JEaXJlY3RvcnkoKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEZpbGU+KEZpbGVUb29scy5maWxlc0luVHJlZSh0aGlzLmNhbm9uaWNhbEZpbGUpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEZpbGUgbmV4dCkgewotCQkJCQlyZXR1cm4gRW50cnkudGhpcy5maWxlTmFtZU1pZ2h0QmVGb3JDbGFzc0ZpbGUobmV4dC5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZAotCQkgKiBpbiB0aGUgZW50cnkncyBhcmNoaXZlIGZpbGUgYW5kIGFjY2VwdGVkIGJ5IHRoZQotCQkgKiBzcGVjaWZpZWQgZmlsdGVyIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBhZGRDbGFzc05hbWVzRm9yQXJjaGl2ZVRvKENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZSh0aGlzLmNhbm9uaWNhbEZpbGUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQlmb3IgKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBaaXBFbnRyeT4gc3RyZWFtID0gemlwRmlsZS5lbnRyaWVzKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0JCQkJWmlwRW50cnkgemlwRW50cnkgPSBzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgemlwRW50cnlOYW1lID0gemlwRW50cnkuZ2V0TmFtZSgpOwotCQkJCWlmICh0aGlzLmZpbGVOYW1lTWlnaHRCZUZvckNsYXNzRmlsZSh6aXBFbnRyeU5hbWUpKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb252ZXJ0VG9DbGFzc05hbWUoemlwRW50cnlOYW1lKTsKLQkJCQkJaWYgKGZpbHRlci5hY2NlcHQoY2xhc3NOYW1lKSkgewotCQkJCQkJY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXRyeSB7Ci0JCQkJemlwRmlsZS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG1pZ2h0IGJlIGEgSmF2YSBjbGFzcyBmaWxlLgotCQkgKiBUaGUgZmlsZSBuYW1lIG11c3QgYXQgbGVhc3QgZW5kIHdpdGggPGNvZGU+Ii5jbGFzcyI8L2NvZGU+IGFuZCBjb250YWluIG5vIHNwYWNlcy4KLQkJICogKE5laXRoZXIgY2xhc3MgbmFtZXMgbm9yIHBhY2thZ2UgbmFtZXMgbWF5IGNvbnRhaW4gc3BhY2VzLikKLQkJICogV2hldGhlciBpdCBhY3R1YWxseSBpcyBhIGNsYXNzIGZpbGUgd2lsbCBuZWVkIHRvIGJlIGRldGVybWluZWQgYnkKLQkJICogYSBjbGFzcyBsb2FkZXIuCi0JCSAqLwotCQlib29sZWFuIGZpbGVOYW1lTWlnaHRCZUZvckNsYXNzRmlsZShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIEZpbGVUb29scy5leHRlbnNpb24obmFtZSkudG9Mb3dlckNhc2UoKS5lcXVhbHMoIi5jbGFzcyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJJiYgKG5hbWUuaW5kZXhPZignICcpID09IC0xKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGguCi0JCSAqIEp1c3QgYSBiaXQgbW9yZSBwZXJmb3JtYW50IHRoYW4ge0BsaW5rICNnZXRDbGFzc05hbWVzKCl9LgotCQkgKi8KLQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lcygpIHsKLQkJCXJldHVybiB0aGlzLmNsYXNzTmFtZXMoRmlsdGVyLk51bGwuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGgKLQkJICogdGhhdCBhcmUgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIuCi0JCSAqIEp1c3QgYSBiaXQgbW9yZSBwZXJmb3JtYW50IHRoYW4ge0BsaW5rICNnZXRDbGFzc05hbWVzKEZpbHRlcil9LgotCQkgKi8KLQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCWlmICh0aGlzLmNhbm9uaWNhbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAodGhpcy5jYW5vbmljYWxGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lc0ZvckRpcmVjdG9yeShmaWx0ZXIpOwotCQkJCX0KLQkJCQlpZiAoZmlsZUlzQXJjaGl2ZSh0aGlzLmNhbm9uaWNhbEZpbGUpKSB7Ci0JCQkJCXJldHVybiB0aGlzLmNsYXNzTmFtZXNGb3JBcmNoaXZlKGZpbHRlcik7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkCi0JCSAqIHVuZGVyIHRoZSBlbnRyeSdzIGRpcmVjdG9yeSBhbmQgYWNjZXB0ZWQgYnkKLQkJICogdGhlIHNwZWNpZmllZCBmaWx0ZXIuCi0JCSAqLwotCQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lc0ZvckRpcmVjdG9yeShGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nPih0aGlzLmNsYXNzTmFtZXNGb3JEaXJlY3RvcnkoKSwgZmlsdGVyKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUcmFuc2Zvcm0gdGhlIGNsYXNzIGZpbGVzIHRvIGNsYXNzIG5hbWVzLgotCQkgKi8KLQkJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXNGb3JEaXJlY3RvcnkoKSB7Ci0JCQlmaW5hbCBpbnQgc3RhcnQgPSB0aGlzLmNhbm9uaWNhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkubGVuZ3RoKCkgKyAxOwotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEZpbGUsIFN0cmluZz4odGhpcy5jbGFzc0ZpbGVzRm9yRGlyZWN0b3J5KCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShGaWxlIGYpIHsKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0NsYXNzTmFtZShmLmdldEFic29sdXRlUGF0aCgpLnN1YnN0cmluZyhzdGFydCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZAotCQkgKiBpbiB0aGUgZW50cnkncyBhcmNoaXZlIGZpbGUgYW5kIGFjY2VwdGVkIGJ5IHRoZQotCQkgKiBzcGVjaWZpZWQgZmlsdGVyLgotCQkgKi8KLQkJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXNGb3JBcmNoaXZlKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJLy8gd2UgY2FuJ3Qgc2ltcGx5IHdyYXAgaXRlcmF0b3JzIGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBhcmNoaXZlIGZpbGUuLi4KLQkJCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZSh0aGlzLmNhbm9uaWNhbEZpbGUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQkJfQotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KHppcEZpbGUuc2l6ZSgpKTsKLQkJCWZvciAoRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiBzdHJlYW0gPSB6aXBGaWxlLmVudHJpZXMoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCQlaaXBFbnRyeSB6aXBFbnRyeSA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyB6aXBFbnRyeU5hbWUgPSB6aXBFbnRyeS5nZXROYW1lKCk7Ci0JCQkJaWYgKHRoaXMuZmlsZU5hbWVNaWdodEJlRm9yQ2xhc3NGaWxlKHppcEVudHJ5TmFtZSkpIHsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbnZlcnRUb0NsYXNzTmFtZSh6aXBFbnRyeU5hbWUpOwotCQkJCQlpZiAoZmlsdGVyLmFjY2VwdChjbGFzc05hbWUpKSB7Ci0JCQkJCQljbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2xhc3NOYW1lcy5pdGVyYXRvcigpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db2xsZWN0aW9uVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db2xsZWN0aW9uVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM0NzFlYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb21BY2Nlc3M7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TdXBlckl0ZXJhdG9yV3JhcHBlcjsKLQotLyoqCi0gKiB7QGxpbmsgQ29sbGVjdGlvbn0tcmVsYXRlZCB1dGlsaXR5IG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2xsZWN0aW9uVG9vbHMgewotCi0JLy8gKioqKioqKioqKiBhZGQgYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLmFkZEFsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IHN1cGVyIEU+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYWRkQWxsKGNvbGxlY3Rpb24sIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLmFkZEFsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IHN1cGVyIEU+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIGFkZEFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5hZGRBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGFkZEFsbF8oY29sbGVjdGlvbiwgaXRlcmF0b3IpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBpdGVyYXRvciBpcyBub3QgZW1wdHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGxfKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQltb2RpZmllZCB8PSBjb2xsZWN0aW9uLmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5hZGRBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBjb2xsZWN0aW9uLmFkZEFsbChsaXN0KGl0ZXJhdG9yLCBzaXplKSkgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5hZGRBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBFLi4uIGFycmF5KSB7Ci0JCXJldHVybiAoYXJyYXkubGVuZ3RoID09IDApID8gZmFsc2UgOiBhZGRBbGxfKGNvbGxlY3Rpb24sIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIGFycmF5IGlzIG5vdCBlbXB0eQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbF8oQ29sbGVjdGlvbjw/IHN1cGVyIEU+IGNvbGxlY3Rpb24sIEUuLi4gYXJyYXkpIHsKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQlmb3IgKEUgZWxlbWVudCA6IGFycmF5KSB7Ci0JCQltb2RpZmllZCB8PSBjb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+TGlzdC5hZGRBbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKExpc3Q8PyBzdXBlciBFPiBsaXN0LCBpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBhZGRBbGwobGlzdCwgaW5kZXgsIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QuYWRkQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgaW50IGluZGV4LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIGFkZEFsbChsaXN0LCBpbmRleCwgaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+TGlzdC5hZGRBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKExpc3Q8PyBzdXBlciBFPiBsaXN0LCBpbnQgaW5kZXgsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gbGlzdC5hZGRBbGwoaW5kZXgsIGxpc3QoaXRlcmF0b3IpKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QuYWRkQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBsaXN0LmFkZEFsbChpbmRleCwgbGlzdChpdGVyYXRvciwgc2l6ZSkpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+TGlzdC5hZGRBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKExpc3Q8PyBzdXBlciBFPiBsaXN0LCBpbnQgaW5kZXgsIEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIChhcnJheS5sZW5ndGggPT0gMCkgPyBmYWxzZSA6IGxpc3QuYWRkQWxsKGluZGV4LCBBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJhZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uLgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoRW51bWVyYXRpb24gZW51bWVyYXRpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFPiBlbnVtZXJhdGlvbikgewotCQlyZXR1cm4gYmFnKGVudW1lcmF0aW9uLCBuZXcgSGFzaEJhZzxFPigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uLgotCSAqIFRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24gc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaEJhZyhFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBiYWcoRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uLCBpbnQgZW51bWVyYXRpb25TaXplKSB7Ci0JCXJldHVybiBiYWcoZW51bWVyYXRpb24sIG5ldyBIYXNoQmFnPEU+KGVudW1lcmF0aW9uU2l6ZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGJhZyhFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24sIEhhc2hCYWc8RT4gYmFnKSB7Ci0JCXdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJYmFnLmFkZChlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpKTsKLQkJfQotCQlyZXR1cm4gYmFnOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaEJhZyhJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBiYWcoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBiYWcoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gYmFnKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoQmFnKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGJhZyhJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGJhZyhpdGVyYXRvciwgbmV3IEhhc2hCYWc8RT4oKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gYmFnKGl0ZXJhdG9yLCBuZXcgSGFzaEJhZzxFPihpdGVyYXRvclNpemUpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBiYWcoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBIYXNoQmFnPEU+IGJhZykgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQliYWcuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEUuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJSGFzaEJhZzxFPiBiYWcgPSBuZXcgSGFzaEJhZzxFPihsZW4pOwotCQlmb3IgKEUgaXRlbSA6IGFycmF5KSB7Ci0JCQliYWcuYWRkKGl0ZW0pOwotCQl9Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBjb2xsZWN0aW9uKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFPiBlbnVtZXJhdGlvbikgewotCQlyZXR1cm4gYmFnKGVudW1lcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKiBUaGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gY29sbGVjdGlvbihFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24sIGludCBlbnVtZXJhdGlvblNpemUpIHsKLQkJcmV0dXJuIGJhZyhlbnVtZXJhdGlvbiwgZW51bWVyYXRpb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGNvbGxlY3Rpb24oSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBjb2xsZWN0aW9uKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBjb2xsZWN0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gY29sbGVjdGlvbihpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gY29sbGVjdGlvbihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGJhZyhpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGNvbGxlY3Rpb24oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBiYWcoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBjb2xsZWN0aW9uKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGJhZyhhcnJheSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24gY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+RW51bWVyYXRpb24uY29udGFpbnMoT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhFbnVtZXJhdGlvbjw/PiBlbnVtZXJhdGlvbiwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlpZiAoZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zKE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoSXRlcmFibGU8Pz4gaXRlcmFibGUsIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gY29udGFpbnMoaXRlcmFibGUuaXRlcmF0b3IoKSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuY29udGFpbnMoT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKGl0ZXJhdG9yLm5leHQoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGl0ZXJhdG9yLm5leHQoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbnMgYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLmNvbnRhaW5zQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24uY29udGFpbnNBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWlmICggISBjb2xsZWN0aW9uLmNvbnRhaW5zKGl0ZXJhdG9yLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24uY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIE9iamVjdC4uLiBhcnJheSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb2xsZWN0aW9uLmNvbnRhaW5zKGFycmF5W2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgMi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWluc0FsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgSXRlcmFibGU8Pz4gaXRlcmFibGUyKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChpdGVyYWJsZTEuaXRlcmF0b3IoKSwgaXRlcmFibGUyLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZSAyLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgMSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWluc0FsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgaW50IGl0ZXJhYmxlMVNpemUsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUxLml0ZXJhdG9yKCksIGl0ZXJhYmxlMVNpemUsIGl0ZXJhYmxlMi5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUsIGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIE9iamVjdC4uLiBhcnJheSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWluc0FsbChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5jb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBzZXQoaXRlcmF0b3IpLmNvbnRhaW5zQWxsKGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIHNldChpdGVyYXRvciwgaXRlcmF0b3JTaXplKS5jb250YWluc0FsbChjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChzZXQoaXRlcmF0b3IpLCBpdGVyYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChzZXQoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSksIGl0ZXJhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgMi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5jb250YWluc0FsbChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChzZXQoaXRlcmF0b3IxKSwgaXRlcmF0b3IyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgMi4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDEgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuY29udGFpbnNBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIGludCBpdGVyYXRvcjFTaXplLCBJdGVyYXRvcjw/PiBpdGVyYXRvcjIpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKHNldChpdGVyYXRvcjEsIGl0ZXJhdG9yMVNpemUpLCBpdGVyYXRvcjIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0Li4uIGFycmF5KSB7Ci0JCXJldHVybiBjb250YWluc0FsbChzZXQoaXRlcmF0b3IpLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUsIE9iamVjdC4uLiBhcnJheSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoc2V0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLCBhcnJheSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpZmYgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGxpc3RzIHRoYXQgYXJlIGRpZmZlcmVudCwgYmVnaW5uaW5nIGF0IHRoZSBlbmQuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBpZGVudGljYWwsIHJldHVybiAtMS4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCBzaXplcywgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUKLQkgKiBsYXN0IGVsZW1lbnQgaW4gdGhlIGxvbmdlciBsaXN0LgotCSAqIFVzZSB0aGUgZWxlbWVudHMnIHtAbGluayBPYmplY3QjZXF1YWxzKCl9IG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb25zLmRpZmZFbmQoTGlzdCBsaXN0MSwgTGlzdCBsaXN0Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZGlmZkVuZChMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmRpZmZFbmQobGlzdDEudG9BcnJheSgpLCBsaXN0Mi50b0FycmF5KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gW3NpemUsIC0xXS4KLQkgKiBVc2UgdGhlIGVsZW1lbnRzJyB7QGxpbmsgT2JqZWN0I2VxdWFscygpfSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9ucy5kaWZmUmFuZ2UoTGlzdCBsaXN0MSwgTGlzdCBsaXN0Mik8L2NvZGU+Ci0JICogQHNlZSAjZGlmZlN0YXJ0KExpc3QsIExpc3QpCi0JICogQHNlZSAjZGlmZkVuZChMaXN0LCBMaXN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2UgZGlmZlJhbmdlKExpc3Q8Pz4gbGlzdDEsIExpc3Q8Pz4gbGlzdDIpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuZGlmZlJhbmdlKGxpc3QxLnRvQXJyYXkoKSwgbGlzdDIudG9BcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogbGlzdHMgdGhhdCBhcmUgZGlmZmVyZW50LiBJZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBsaXN0cyAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCkuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2hvcnRlciBsaXN0IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGxpc3QsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc2hvcnRlciBsaXN0Ci0JICogKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNob3J0ZXIgbGlzdCkuCi0JICogVXNlIHRoZSBlbGVtZW50cycge0BsaW5rIE9iamVjdCNlcXVhbHMoKX0gbWV0aG9kIHRvIGNvbXBhcmUgdGhlCi0JICogZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbnMuZGlmZlN0YXJ0KExpc3QgbGlzdDEsIExpc3QgbGlzdDIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZTdGFydChMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmRpZmZTdGFydChsaXN0MS50b0FycmF5KCksIGxpc3QyLnRvQXJyYXkoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlkZW50aXR5IGRpZmYgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGxpc3RzIHRoYXQgYXJlIGRpZmZlcmVudCwgYmVnaW5uaW5nIGF0IHRoZSBlbmQuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBpZGVudGljYWwsIHJldHVybiAtMS4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCBzaXplcywgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUKLQkgKiBsYXN0IGVsZW1lbnQgaW4gdGhlIGxvbmdlciBsaXN0LgotCSAqIFVzZSBvYmplY3QgaWRlbnRpdHkgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbnMuaWRlbnRpdHlEaWZmRW5kKExpc3QgbGlzdDEsIExpc3QgbGlzdDIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGlkZW50aXR5RGlmZkVuZChMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChsaXN0MS50b0FycmF5KCksIGxpc3QyLnRvQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByYW5nZSBvZiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiBbc2l6ZSwgLTFdLgotCSAqIFVzZSBvYmplY3QgaWRlbnRpdHkgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbnMuaWRlbnRpdHlEaWZmU3RhcnQoTGlzdCBsaXN0MSwgTGlzdCBsaXN0Mik8L2NvZGU+Ci0JICogQHNlZSAjaWRlbnRpdHlEaWZmU3RhcnQoTGlzdCwgTGlzdCkKLQkgKiBAc2VlICNpZGVudGl0eURpZmZFbmQoTGlzdCwgTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlIGlkZW50aXR5RGlmZlJhbmdlKExpc3Q8Pz4gbGlzdDEsIExpc3Q8Pz4gbGlzdDIpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UobGlzdDEudG9BcnJheSgpLCBsaXN0Mi50b0FycmF5KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBsaXN0cyB0aGF0IGFyZSBkaWZmZXJlbnQuIElmIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4KLQkgKiB0aGUgc2l6ZSBvZiB0aGUgdHdvIGxpc3RzIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4KS4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCBzaXplcyBhbmQgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzaG9ydGVyIGxpc3QgbWF0Y2ggdGhlaXIgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbgotCSAqIHRoZSBsb25nZXIgbGlzdCwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzaG9ydGVyIGxpc3QKLQkgKiAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc2hvcnRlciBsaXN0KS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb25zLmlkZW50aXR5RGlmZlN0YXJ0KExpc3QgbGlzdDEsIExpc3QgbGlzdDIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGlkZW50aXR5RGlmZlN0YXJ0KExpc3Q8Pz4gbGlzdDEsIExpc3Q8Pz4gbGlzdDIpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQobGlzdDEudG9BcnJheSgpLCBsaXN0Mi50b0FycmF5KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlbGVtZW50cyBhcmUgZXF1YWwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZXMgZG8gbm90IHJldHVybiB0aGUgc2FtZSBlbGVtZW50cwotCSAqIGluIHRoZSBzYW1lIG9yZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZURpZmZlcmVudChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gZWxlbWVudHNBcmVEaWZmZXJlbnQoaXRlcmFibGUxLml0ZXJhdG9yKCksIGl0ZXJhYmxlMi5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9ycyBkbyBub3QgcmV0dXJuIHRoZSBzYW1lIGVsZW1lbnRzCi0JICogaW4gdGhlIHNhbWUgb3JkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVsZW1lbnRzQXJlRGlmZmVyZW50KEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXJldHVybiAhIGVsZW1lbnRzQXJlRXF1YWwoaXRlcmF0b3IxLCBpdGVyYXRvcjIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGVzIHJldHVybiBlcXVhbCBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5lbGVtZW50c0FyZUVxdWFsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudHNBcmVFcXVhbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gZWxlbWVudHNBcmVFcXVhbChpdGVyYWJsZTEuaXRlcmF0b3IoKSwgaXRlcmFibGUyLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3JzIHJldHVybiBlcXVhbCBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5lbGVtZW50c0FyZUVxdWFsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudHNBcmVFcXVhbChJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMikgewotCQl3aGlsZSAoaXRlcmF0b3IxLmhhc05leHQoKSAmJiBpdGVyYXRvcjIuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KGl0ZXJhdG9yMS5uZXh0KCksIGl0ZXJhdG9yMi5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiAhIChpdGVyYXRvcjEuaGFzTmV4dCgpIHx8IGl0ZXJhdG9yMi5oYXNOZXh0KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlbGVtZW50cyBhcmUgaWRlbnRpY2FsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGVzIHJldHVybiB0aGUgc2FtZSBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5pZGVudGljYWwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZUlkZW50aWNhbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gZWxlbWVudHNBcmVJZGVudGljYWwoaXRlcmFibGUxLml0ZXJhdG9yKCksIGl0ZXJhYmxlMi5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9ycyByZXR1cm4gdGhlIHNhbWUgZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuaWRlbnRpY2FsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudHNBcmVJZGVudGljYWwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IxLCBJdGVyYXRvcjw/PiBpdGVyYXRvcjIpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yMS5oYXNOZXh0KCkgJiYgaXRlcmF0b3IyLmhhc05leHQoKSkgewotCQkJaWYgKGl0ZXJhdG9yMS5uZXh0KCkgIT0gaXRlcmF0b3IyLm5leHQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gISAoaXRlcmF0b3IxLmhhc05leHQoKSB8fCBpdGVyYXRvcjIuaGFzTmV4dCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2V0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXgKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmdldChpbnQgaW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEUgZ2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBnZXQoaXRlcmFibGUuaXRlcmF0b3IoKSwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXgKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmdldChpbnQgaW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEUgZ2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGluZGV4KSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRSBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGkrKyA9PSBpbmRleCkgewotCQkJCXJldHVybiBuZXh0OwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKGluZGV4KSArICc6JyArIFN0cmluZy52YWx1ZU9mKGkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaGFzaCBjb2RlICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCWlmIChpdGVyYWJsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpbnQgaGFzaCA9IDE7Ci0JCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBpdGVyYWJsZSkgewotCQkJaGFzaCA9IDMxICogaGFzaCArIChlbGVtZW50ID09IG51bGwgPyAwIDogZWxlbWVudC5oYXNoQ29kZSgpKTsKLQkJfQotCQlyZXR1cm4gaGFzaDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5kZXggb2YgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlOwotCSAqIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmluZGV4T2YoT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoSXRlcmFibGU8Pz4gaXRlcmFibGUsIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gaW5kZXhPZihpdGVyYWJsZS5pdGVyYXRvcigpLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yOwotCSAqIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmluZGV4T2YoT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGl0ZXJhdG9yLmhhc05leHQoKTsgaSsrKSB7Ci0JCQkJaWYgKGl0ZXJhdG9yLm5leHQoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpdGVyYXRvci5oYXNOZXh0KCk7IGkrKykgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoaXRlcmF0b3IubmV4dCgpKSkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnNlcnRpb24gaW5kZXggb2YgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXhpbXVtIGluZGV4IG9mIHdoZXJlIHRoZSBzcGVjaWZpZWQgY29tcGFyYWJsZSBvYmplY3QKLQkgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byB0aGUgc3BlY2lmaWVkIHNvcnRlZCBsaXN0IGFuZCBzdGlsbCBrZWVwCi0JICogdGhlIGxpc3Qgc29ydGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IGludCBpbnNlcnRpb25JbmRleE9mKExpc3Q8RT4gc29ydGVkTGlzdCwgQ29tcGFyYWJsZTxFPiB2YWx1ZSkgewotCQlpbnQgbGVuID0gc29ydGVkTGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICh2YWx1ZS5jb21wYXJlVG8oc29ydGVkTGlzdC5nZXQoaSkpIDwgMCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXhpbXVtIGluZGV4IG9mIHdoZXJlIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0JICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCBzb3J0ZWQgbGlzdCBhbmQgc3RpbGwga2VlcAotCSAqIHRoZSBsaXN0IHNvcnRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBpbnQgaW5zZXJ0aW9uSW5kZXhPZihMaXN0PEU+IHNvcnRlZExpc3QsIEUgdmFsdWUsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCWludCBsZW4gPSBzb3J0ZWRMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGNvbXBhcmF0b3IuY29tcGFyZSh2YWx1ZSwgc29ydGVkTGlzdC5nZXQoaSkpIDwgMCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsZW47Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGl0ZXJhYmxlL2l0ZXJhdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYWJsZSBvbiB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuaXRlcmFibGUoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPEU+KGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLml0ZXJhdG9yKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYXRvcjxFPiBpdGVyYXRvcihFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxFPihhcnJheSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxhc3QgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUncyBsYXN0IGVsZW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUubGFzdCgpPC9jb2RlPgotCSAqIAotICAgICAqIEBleGNlcHRpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpdGVyYWJsZSBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFIGxhc3QoSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGxhc3QoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IncyBsYXN0IGVsZW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IubGFzdCgpPC9jb2RlPgotCSAqIAotICAgICAqIEBleGNlcHRpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpdGVyYXRvciBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFIGxhc3QoSXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJRSBsYXN0OwotCQlkbyB7Ci0JCQlsYXN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQl9IHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpOwotCQlyZXR1cm4gbGFzdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGFzdCBpbmRleCBvZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZTsKLQkgKiByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5sYXN0SW5kZXhPZihPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihJdGVyYWJsZTw/PiBpdGVyYWJsZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBsYXN0SW5kZXhPZihpdGVyYWJsZS5pdGVyYXRvcigpLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGU7Ci0JICogcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5sYXN0SW5kZXhPZihPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBsYXN0SW5kZXhPZihpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcjsKLQkgKiByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5sYXN0SW5kZXhPZihPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBsaXN0KGl0ZXJhdG9yKS5sYXN0SW5kZXhPZih2YWx1ZSkgOiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcjsKLQkgKiByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmxhc3RJbmRleE9mKE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGxpc3QoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkubGFzdEluZGV4T2YodmFsdWUpIDogLTE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUudG9MaXN0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBsaXN0KGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUudG9MaXN0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBsaXN0KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IudG9MaXN0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBsaXN0KGl0ZXJhdG9yLCBuZXcgQXJyYXlMaXN0PEU+KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IudG9MaXN0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBsaXN0KGl0ZXJhdG9yLCBuZXcgQXJyYXlMaXN0PEU+KGl0ZXJhdG9yU2l6ZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gbGlzdChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIEFycmF5TGlzdDxFPiBsaXN0KSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWxpc3QuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVW5saWtlIHtAbGluayBBcnJheXMjYXNMaXN0KE9iamVjdFtdKX0sIHRoZSBsaXN0Ci0JICogaXMgbW9kaWZpYWJsZSBhbmQgaXMgbm90IGJhY2tlZCBieSB0aGUgYXJyYXkuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoRS4uLiBhcnJheSkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxFPihBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubGlzdEl0ZXJhdG9yKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGxpc3RJdGVyYXRvcihhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5saXN0SXRlcmF0b3IoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcihFW10gYXJyYXksIGludCBzdGFydCkgewotCQlyZXR1cm4gbGlzdEl0ZXJhdG9yKGFycmF5LCBzdGFydCwgYXJyYXkubGVuZ3RoIC0gc3RhcnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoZSBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubGlzdEl0ZXJhdG9yKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoRVtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxFPihhcnJheSwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1vdmUgKioqKioqKioqKgotCi0JLyoqCi0JICogTW92ZSBhbiBlbGVtZW50IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGxpc3QuCi0JICogPHA+Ci0JICogPGNvZGU+TGlzdC5tb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IG1vdmUoTGlzdDxFPiBsaXN0LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlyZXR1cm4gKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSA/IGxpc3QgOiBtb3ZlXyhsaXN0LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0YXJnZXRJbmRleCAhPSBzb3VyY2VJbmRleAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBMaXN0PEU+IG1vdmVfKExpc3Q8RT4gbGlzdCwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJaWYgKGxpc3QgaW5zdGFuY2VvZiBSYW5kb21BY2Nlc3MpIHsKLQkJCS8vIG1vdmUgZWxlbWVudHMsIGxlYXZpbmcgdGhlIGxpc3QgaW4gcGxhY2UKLQkJCUUgdGVtcCA9IGxpc3QuZ2V0KHNvdXJjZUluZGV4KTsKLQkJCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQkJZm9yIChpbnQgaSA9IHNvdXJjZUluZGV4OyBpLS0gPiB0YXJnZXRJbmRleDsgKSB7Ci0JCQkJCWxpc3Quc2V0KGkgKyAxLCBsaXN0LmdldChpKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gc291cmNlSW5kZXg7IGkgPCB0YXJnZXRJbmRleDsgaSsrKSB7Ci0JCQkJCWxpc3Quc2V0KGksIGxpc3QuZ2V0KGkgKyAxKSk7Ci0JCQkJfQotCQkJfQotCQkJbGlzdC5zZXQodGFyZ2V0SW5kZXgsIHRlbXApOwotCQl9IGVsc2UgewotCQkJLy8gcmVtb3ZlIHRoZSBlbGVtZW50IGFuZCByZS1hZGQgaXQgYXQgdGhlIHRhcmdldCBpbmRleAotCQkJbGlzdC5hZGQodGFyZ2V0SW5kZXgsIGxpc3QucmVtb3ZlKHNvdXJjZUluZGV4KSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBlbGVtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBsaXN0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QubW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBtb3ZlKExpc3Q8RT4gbGlzdCwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaWYgKCh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgfHwgKGxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGxpc3Q7Ci0JCX0KLQkJaWYgKGxlbmd0aCA9PSAxKSB7Ci0JCQlyZXR1cm4gbW92ZV8obGlzdCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQlpZiAobGlzdCBpbnN0YW5jZW9mIFJhbmRvbUFjY2VzcykgewotCQkJLy8gbW92ZSBlbGVtZW50cywgbGVhdmluZyB0aGUgbGlzdCBpbiBwbGFjZQotCQkJQXJyYXlMaXN0PEU+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PEU+KGxpc3Quc3ViTGlzdChzb3VyY2VJbmRleCwgc291cmNlSW5kZXggKyBsZW5ndGgpKTsKLQkJCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQkJZm9yIChpbnQgaSA9IHNvdXJjZUluZGV4OyBpLS0gPiB0YXJnZXRJbmRleDsgKSB7Ci0JCQkJCWxpc3Quc2V0KGkgKyBsZW5ndGgsIGxpc3QuZ2V0KGkpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGkgPSBzb3VyY2VJbmRleDsgaSA8IHRhcmdldEluZGV4OyBpKyspIHsKLQkJCQkJbGlzdC5zZXQoaSwgbGlzdC5nZXQoaSArIGxlbmd0aCkpOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlsaXN0LnNldCh0YXJnZXRJbmRleCArIGksIHRlbXAuZ2V0KGkpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIHJlbW92ZSB0aGUgZWxlbWVudHMgYW5kIHJlLWFkZCB0aGVtIGF0IHRoZSB0YXJnZXQgaW5kZXgKLQkJCWxpc3QuYWRkQWxsKHRhcmdldEluZGV4LCByZW1vdmVFbGVtZW50c0F0SW5kZXgobGlzdCwgc291cmNlSW5kZXgsIGxlbmd0aCkpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmVtb3ZlQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmVtb3ZlQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmVtb3ZlQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGNvbGxlY3Rpb24ucmVtb3ZlQWxsKHNldChpdGVyYXRvcikpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLnJlbW92ZUFsbChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBjb2xsZWN0aW9uLnJlbW92ZUFsbChzZXQoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZW1vdmVBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIChhcnJheS5sZW5ndGggPT0gMCkgPyBmYWxzZSA6IGNvbGxlY3Rpb24ucmVtb3ZlQWxsKHNldChhcnJheSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgYWxsIG9jY3VycmVuY2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLnJlbW92ZUFsbE9jY3VycmVuY2VzKE9iamVjdCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbE9jY3VycmVuY2VzKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgT2JqZWN0IHZhbHVlKSB7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8Pz4gc3RyZWFtID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoc3RyZWFtLm5leHQoKSA9PSBudWxsKSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZWxlbWVudHMgYXQgaW5kZXggKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5MaXN0LnJlbW92ZShpbnQgaW5kZXgsIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEFycmF5TGlzdDxFPiByZW1vdmVFbGVtZW50c0F0SW5kZXgoTGlzdDxFPiBsaXN0LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJTGlzdDxFPiBzdWJMaXN0ID0gbGlzdC5zdWJMaXN0KGluZGV4LCBpbmRleCArIGxlbmd0aCk7Ci0JCUFycmF5TGlzdDxFPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEU+KHN1Ykxpc3QpOwotCQlzdWJMaXN0LmNsZWFyKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBkdXBsaWNhdGUgZWxlbWVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIGFueSBkdXBsaWNhdGUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGxpc3QsCi0JICogd2hpbGUgbWFpbnRhaW5pbmcgdGhlIG9yZGVyLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiByZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhMaXN0PEU+IGxpc3QpIHsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJaWYgKChzaXplID09IDApIHx8IChzaXplID09IDEpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QsIHNpemUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBsaXN0IGlzIG5vbi1lbXB0eQotCSAqLwotCXN0YXRpYyA8RT4gYm9vbGVhbiByZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhMaXN0PEU+IGxpc3QsIGludCBzaXplKSB7Ci0JCUxpbmtlZEhhc2hTZXQ8RT4gdGVtcCA9IG5ldyBMaW5rZWRIYXNoU2V0PEU+KHNpemUpOwkJLy8gdGFrZSBhZHZhbnRhZ2Ugb2YgaGFzaGVkIGxvb2stdXAKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQlmb3IgKEUgaXRlbSA6IGxpc3QpIHsKLQkJCWlmICggISB0ZW1wLmFkZChpdGVtKSkgewotCQkJCW1vZGlmaWVkID0gdHJ1ZTsgIC8vIGR1cGxpY2F0ZSBpdGVtCi0JCQl9Ci0JCX0KLQkJaWYgKG1vZGlmaWVkKSB7Ci0JCQlpbnQgaSA9IDA7Ci0JCQlmb3IgKEUgZSA6IHRlbXApIHsKLQkJCQlsaXN0LnNldChpLCBlKTsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlpbnQgdGVtcFNpemUgPSB0ZW1wLnNpemUoKTsKLQkJCWZvciAoaSA9IGxpc3Quc2l6ZSgpOyBpLS0gPiB0ZW1wU2l6ZTsgKSB7Ci0JCQkJbGlzdC5yZW1vdmUoaSk7ICAvLyBwdWxsIG9mZiB0aGUgZW5kCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXRhaW4gYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldGFpbiBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZXRhaW5BbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gcmV0YWluQWxsKGNvbGxlY3Rpb24sIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLnJldGFpbkFsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiByZXRhaW5BbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmV0YWluQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmV0dXJuIGNvbGxlY3Rpb24ucmV0YWluQWxsKHNldChpdGVyYXRvcikpOwotCQl9Ci0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNvbGxlY3Rpb24uY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIG9ubHkgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmV0YWluQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmV0dXJuIGNvbGxlY3Rpb24ucmV0YWluQWxsKHNldChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSk7Ci0JCX0KLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY29sbGVjdGlvbi5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmV0YWluQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgT2JqZWN0Li4uIGFycmF5KSB7Ci0JCWlmIChhcnJheS5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gY29sbGVjdGlvbi5yZXRhaW5BbGwoc2V0KGFycmF5KSk7Ci0JCX0KLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY29sbGVjdGlvbi5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmV2ZXJzZSBsaXN0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgd2l0aCBlbnRyaWVzIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB0aG9zZQotCSAqIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUucmV2ZXJzZUxpc3QoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJldmVyc2VMaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gcmV2ZXJzZUxpc3QoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCB3aXRoIGVudHJpZXMgaW4gcmV2ZXJzZSBvcmRlciBmcm9tIHRob3NlCi0JICogcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnJldmVyc2VMaXN0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiByZXZlcnNlTGlzdChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIHJldmVyc2VMaXN0KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCB3aXRoIGVudHJpZXMgaW4gcmV2ZXJzZSBvcmRlciBmcm9tIHRob3NlCi0JICogcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5yZXZlcnNlTGlzdCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcmV2ZXJzZUxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiByZXZlcnNlKGxpc3QoaXRlcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHdpdGggZW50cmllcyBpbiByZXZlcnNlIG9yZGVyIGZyb20gdGhvc2UKLQkgKiByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IucmV2ZXJzZUxpc3QoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJldmVyc2VMaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJcmV0dXJuIHJldmVyc2UobGlzdChpdGVyYXRvciwgc2l6ZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByb3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJyb3RhdGVkIiBieSBvbmUgcG9zaXRpb24uCi0JICogPHA+Ci0JICogPGNvZGU+TGlzdC5yb3RhdGUoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJvdGF0ZShMaXN0PEU+IGxpc3QpIHsKLQkJcmV0dXJuIHJvdGF0ZShsaXN0LCAxKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2V0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaFNldChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaFNldDxFPiBzZXQoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBzZXQoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hTZXQoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hTZXQ8RT4gc2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gc2V0KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoU2V0KEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoU2V0PEU+IHNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIHNldChpdGVyYXRvciwgbmV3IEhhc2hTZXQ8RT4oKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hTZXQoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hTZXQ8RT4gc2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gc2V0KGl0ZXJhdG9yLCBuZXcgSGFzaFNldDxFPihpdGVyYXRvclNpemUpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyA8RT4gSGFzaFNldDxFPiBzZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBIYXNoU2V0PEU+IHNldCkgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlzZXQuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHNldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hTZXQoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hTZXQ8RT4gc2V0KEUuLi4gYXJyYXkpIHsKLQkJSGFzaFNldDxFPiBzZXQgPSBuZXcgSGFzaFNldDxFPihhcnJheS5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJc2V0LmFkZChhcnJheVtpXSk7Ci0JCX0KLQkJcmV0dXJuIHNldDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2luZ2xldG9uIGl0ZXJhdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgb25seSB0aGUgc2luZ2xlLAotCSAqIHNwZWNpZmllZCBvYmplY3QuCi0JICogPHA+Ci0JICogPGNvZGU+T2JqZWN0LnRvSXRlcmF0b3IoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYXRvcjxFPiBzaW5nbGV0b25JdGVyYXRvcihFIHZhbHVlKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBvbmx5IHRoZSBzaW5nbGUsCi0JICogc3BlY2lmaWVkIG9iamVjdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QudG9MaXN0SXRlcmF0b3IoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0SXRlcmF0b3I8RT4gc2luZ2xldG9uTGlzdEl0ZXJhdG9yKEUgdmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEU+KHZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2l6ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnNpemUoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBzaXplKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBzaXplKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3Iuc2l6ZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNpemUoSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJaW50IHNpemUgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlzaXplKys7Ci0JCX0KLQkJcmV0dXJuIHNpemU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgaXMgZW1wdHkKLQkgKiAoU2hvcnRjdXRzIHRoZSBpdGVyYXRvciByYXRoZXIgdGhhbiBjYWxjdWxhdGluZyB0aGUgZW50aXJlIHNpemUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW1wdHkoSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGlzRW1wdHkoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgaXMgZW1wdHkKLQkgKiAoU2hvcnRjdXRzIHRoZSBpdGVyYXRvciByYXRoZXIgdGhhbiBjYWxjdWxhdGluZyB0aGUgZW50aXJlIHNpemUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW1wdHkoSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuICEgaXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHNvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBlbGVtZW50cyBvZiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnNvcnQoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBJdGVyYWJsZTxFPiBzb3J0KEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBzb3J0KGl0ZXJhYmxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgc29ydGVkIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5zb3J0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gSXRlcmFibGU8RT4gc29ydChJdGVyYWJsZTxFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gc29ydChpdGVyYWJsZSwgbnVsbCwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgc29ydGVkIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuc29ydChDb21wYXJhdG9yIGNvbXBhcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhYmxlPEU+IHNvcnQoSXRlcmFibGU8RT4gaXRlcmFibGUsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCXJldHVybiBzb3J0KGxpc3QoaXRlcmFibGUpLCBjb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgc29ydGVkIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5zb3J0KENvbXBhcmF0b3IgY29tcGFyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSXRlcmFibGU8RT4gc29ydChJdGVyYWJsZTxFPiBpdGVyYWJsZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIHNvcnQobGlzdChpdGVyYWJsZSwgaXRlcmFibGVTaXplKSwgY29tcGFyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVyYXRvciBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5zb3J0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gTGlzdEl0ZXJhdG9yPEU+IHNvcnQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBzb3J0KGl0ZXJhdG9yLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3Iuc29ydCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IExpc3RJdGVyYXRvcjxFPiBzb3J0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gc29ydChpdGVyYXRvciwgbnVsbCwgaXRlcmF0b3JTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLnNvcnQoQ29tcGFyYXRvciBjb21wYXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0SXRlcmF0b3I8RT4gc29ydChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCXJldHVybiBzb3J0KGxpc3QoaXRlcmF0b3IpLCBjb21wYXJhdG9yKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3Iuc29ydChDb21wYXJhdG9yIGNvbXBhcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3RJdGVyYXRvcjxFPiBzb3J0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIHNvcnQobGlzdChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSwgY29tcGFyYXRvcikubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNvcnRlZCBzZXQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gVHJlZVNldDxFPiBzb3J0ZWRTZXQoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogYW5kIGNvbXBhcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChJdGVyYWJsZSBpdGVyYWJsZSwgQ29tcGFyYXRvciBjKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoaXRlcmFibGUuaXRlcmF0b3IoKSwgY29tcGFyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBhbmQgY29tcGFyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPlRyZWVTZXQoSXRlcmFibGUgaXRlcmFibGUsIENvbXBhcmF0b3IgYyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVHJlZVNldDxFPiBzb3J0ZWRTZXQoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvciwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gc29ydGVkU2V0KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGNvbXBhcmF0b3IsIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gVHJlZVNldDxFPiBzb3J0ZWRTZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoaXRlcmF0b3IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gVHJlZVNldDxFPiBzb3J0ZWRTZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoaXRlcmF0b3IsIG51bGwsIGl0ZXJhdG9yU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiBhbmQgY29tcGFyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhdG9yIGl0ZXJhdG9yLCBDb21wYXJhdG9yIGMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChsaXN0KGl0ZXJhdG9yKSwgY29tcGFyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiBhbmQgY29tcGFyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPlRyZWVTZXQoSXRlcmF0b3IgaXRlcmF0b3IsIENvbXBhcmF0b3IgYyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVHJlZVNldDxFPiBzb3J0ZWRTZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gc29ydGVkU2V0KGxpc3QoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSksIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIDxFPiBUcmVlU2V0PEU+IHNvcnRlZFNldChMaXN0PEU+IGxpc3QsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCVRyZWVTZXQ8RT4gc29ydGVkU2V0ID0gbmV3IFRyZWVTZXQ8RT4oY29tcGFyYXRvcik7Ci0JCXNvcnRlZFNldC5hZGRBbGwobGlzdCk7Ci0JCXJldHVybiBzb3J0ZWRTZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gVHJlZVNldDxFPiBzb3J0ZWRTZXQoRS4uLiBhcnJheSkgewotCQlyZXR1cm4gc29ydGVkU2V0KGFycmF5LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPlRyZWVTZXQoT2JqZWN0W10gYXJyYXksIENvbXBhcmF0b3IgYyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVHJlZVNldDxFPiBzb3J0ZWRTZXQoRVtdIGFycmF5LCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlUcmVlU2V0PEU+IHNvcnRlZFNldCA9IG5ldyBUcmVlU2V0PEU+KGNvbXBhcmF0b3IpOwotCQlzb3J0ZWRTZXQuYWRkQWxsKEFycmF5cy5hc0xpc3QoYXJyYXkpKTsKLQkJcmV0dXJuIHNvcnRlZFNldDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2xkIFNjaG9vbCBWZWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgdmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbGVnYWN5IGNvZGUgdGhhdCByZXF1aXJlcyBhIHtAbGluayBWZWN0b3J9LgotCSAqIDxwPgotCSAqIDxjb2RlPlZlY3RvcihJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVmVjdG9yPEU+IHZlY3RvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHZlY3RvcihpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsZWdhY3kgY29kZSB0aGF0IHJlcXVpcmVzIGEge0BsaW5rIFZlY3Rvcn0uCi0JICogPHA+Ci0JICogPGNvZGU+VmVjdG9yKEl0ZXJhYmxlIGl0ZXJhYmxlLCBpbnQgc2l6ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVmVjdG9yPEU+IHZlY3RvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBzaXplKSB7Ci0JCXJldHVybiB2ZWN0b3IoaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbGVnYWN5IGNvZGUgdGhhdCByZXF1aXJlcyBhIHtAbGluayBWZWN0b3J9LgotCSAqIDxwPgotCSAqIDxjb2RlPlZlY3RvcihJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVmVjdG9yPEU+IHZlY3RvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIHZlY3RvcihpdGVyYXRvciwgbmV3IFZlY3RvcjxFPigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsZWdhY3kgY29kZSB0aGF0IHJlcXVpcmVzIGEge0BsaW5rIFZlY3Rvcn0uCi0JICogPHA+Ci0JICogPGNvZGU+VmVjdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yLCBpbnQgc2l6ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVmVjdG9yPEU+IHZlY3RvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiB2ZWN0b3IoaXRlcmF0b3IsIG5ldyBWZWN0b3I8RT4oc2l6ZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgVmVjdG9yPEU+IHYpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdi5hZGRFbGVtZW50KGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbGVnYWN5IGNvZGUgdGhhdCByZXF1aXJlcyBhIHtAbGluayBWZWN0b3J9LgotCSAqIDxwPgotCSAqIDxjb2RlPlZlY3RvcihPYmplY3QuLi4gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFZlY3RvcjxFPiB2ZWN0b3IoRS4uLiBhcnJheSkgewotCQlWZWN0b3I8RT4gdiA9IG5ldyBWZWN0b3I8RT4oYXJyYXkubGVuZ3RoKTsKLQkJZm9yIChFIGl0ZW0gOiBhcnJheSkgewotCQkJdi5hZGRFbGVtZW50KGl0ZW0pOwotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaW5nbGUtdXNlIEl0ZXJhYmxlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIG9uZS11c2Uge0BsaW5rIEl0ZXJhYmxlfSBmb3IgdGhlIHNwZWNpZmllZCB7QGxpbmsgSXRlcmF0b3J9LgotCSAqIFRocm93IGFuIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGlmIHtAbGluayBJdGVyYWJsZSNpdGVyYXRvcigpfQotCSAqIGlzIGNhbGxlZCBtb3JlIHRoYW4gb25jZS4KLQkgKiBBcyBzdWNoLCB0aGlzIHV0aWxpdHkgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBvbmUtdXNlIHNpdHVhdGlvbnMsIHN1Y2ggYXMKLQkgKiBhIGZvcmVhY2ggbG9vcC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYWJsZTxFPiBpdGVyYWJsZShJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVVc2VJdGVyYWJsZTxFPihpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIG9uZS10aW1lIHVzZSBpdGVyYWJsZSB0aGF0IGNhbiByZXR1cm4gYSBzaW5nbGUgaXRlcmF0b3IuCi0JICogT25jZSB0aGUgaXRlcmF0b3IgaXMgcmV0dXJuZWQgdGhlIGl0ZXJhYmxlIGlzIG5vIGxvbmdlciB2YWxpZC4KLQkgKiBBcyBzdWNoLCB0aGlzIHV0aWxpdHkgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBvbmUtdGltZSB1c2Ugc2l0dWF0aW9ucywKLQkgKiBzdWNoIGFzIGEgJ2Zvci1lYWNoJyBsb29wLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xlVXNlSXRlcmFibGU8RT4gaW1wbGVtZW50cyBJdGVyYWJsZTxFPiB7Ci0JCXByaXZhdGUgSXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0KLQkJcHVibGljIFNpbmdsZVVzZUl0ZXJhYmxlKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCWlmIChpdGVyYXRvciA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLml0ZXJhdG9yID0gbmV3IFN1cGVySXRlcmF0b3JXcmFwcGVyPEU+KGl0ZXJhdG9yKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJCWlmICh0aGlzLml0ZXJhdG9yID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJSXRlcmF0b3I8RT4gcmVzdWx0ID0gdGhpcy5pdGVyYXRvcjsKLQkJCXRoaXMuaXRlcmF0b3IgPSBudWxsOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMgZW5oYW5jZW1lbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVzdGluYXRpb24gbGlzdCBhZnRlciB0aGUgc291cmNlIGxpc3QgaGFzIGJlZW4gY29waWVkIGludG8gaXQuCi0JICogQHNlZSBDb2xsZWN0aW9ucyNjb3B5KExpc3QsIExpc3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBjb3B5KExpc3Q8RT4gZGVzdCwgTGlzdDw/IGV4dGVuZHMgRT4gc3JjKSB7Ci0JCUNvbGxlY3Rpb25zLmNvcHkoZGVzdCwgc3JjKTsKLQkJcmV0dXJuIGRlc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQ29sbGVjdGlvbnMjZmlsbChMaXN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBmaWxsKExpc3Q8RT4gbGlzdCwgRSB2YWx1ZSkgewotCQlDb2xsZWN0aW9ucy5maWxsKGxpc3QsIHZhbHVlKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJyZXZlcnNlZCIuCi0JICogQHNlZSBDb2xsZWN0aW9ucyNyZXZlcnNlKExpc3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiByZXZlcnNlKExpc3Q8RT4gbGlzdCkgewotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInJvdGF0ZWQiLgotCSAqIEBzZWUgQ29sbGVjdGlvbnMjcm90YXRlKExpc3QsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJvdGF0ZShMaXN0PEU+IGxpc3QsIGludCBkaXN0YW5jZSkgewotCQlDb2xsZWN0aW9ucy5yb3RhdGUobGlzdCwgZGlzdGFuY2UpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInNodWZmbGVkIi4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI3NodWZmbGUoTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHNodWZmbGUoTGlzdDxFPiBsaXN0KSB7Ci0JCUNvbGxlY3Rpb25zLnNodWZmbGUobGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAic2h1ZmZsZWQiLgotCSAqIEBzZWUgQ29sbGVjdGlvbnMjc2h1ZmZsZShMaXN0LCBSYW5kb20pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBzaHVmZmxlKExpc3Q8RT4gbGlzdCwgUmFuZG9tIHJhbmRvbSkgewotCQlDb2xsZWN0aW9ucy5zaHVmZmxlKGxpc3QsIHJhbmRvbSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBOQjogVGhlIGxpc3QgaXMgc29ydGVkIGluIHBsYWNlIGFzIGEgc2lkZS1lZmZlY3QuCi0JICogQHNlZSBDb2xsZWN0aW9ucyNzb3J0KExpc3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gTGlzdDxFPiBzb3J0KExpc3Q8RT4gbGlzdCkgewotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogTkI6IFRoZSBsaXN0IGlzIHNvcnRlZCBpbiBwbGFjZSBhcyBhIHNpZGUtZWZmZWN0LgotCSAqIEBzZWUgQ29sbGVjdGlvbnMjc29ydChMaXN0LCBDb21wYXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gc29ydChMaXN0PEU+IGxpc3QsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgY29tcGFyYXRvcik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGhhdmUgYmVlbiAic3dhcHBlZCIuCi0JICogQHNlZSBDb2xsZWN0aW9ucyNzd2FwKExpc3QsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gc3dhcChMaXN0PEU+IGxpc3QsIGludCBpLCBpbnQgaikgewotCQlDb2xsZWN0aW9ucy5zd2FwKGxpc3QsIGksIGopOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb25Ub29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ29tbWFuZFJ1bm5hYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ29tbWFuZFJ1bm5hYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmQ0ZTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvbW1hbmRSdW5uYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogV3JhcCBhIENvbW1hbmQgc28gaXQgY2FuIGJlIHVzZWQgYXMgYSBSdW5uYWJsZS4KLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQlwcm90ZWN0ZWQgZmluYWwgQ29tbWFuZCBjb21tYW5kOwotCi0JcHVibGljIENvbW1hbmRSdW5uYWJsZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRoaXMuY29tbWFuZC5leGVjdXRlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJSdW5uYWJsZVsiICsgdGhpcy5jb21tYW5kLnRvU3RyaW5nKCkgKyddJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvbXBvc2l0ZUNvbW1hbmQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db21wb3NpdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZWE0ZDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvbXBvc2l0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotCi0vKioKLSAqIDxjb2RlPkNvbXBvc2l0ZUNvbW1hbmQ8L2NvZGU+IHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRyZWF0aW5nIGEgY29sbGVjdGlvbiBvZgotICoge0BsaW5rIENvbW1hbmR9cyBhcyBhIHNpbmdsZSBjb21tYW5kLgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlQ29tbWFuZAotCWltcGxlbWVudHMgQ29tbWFuZAotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8Q29tbWFuZD4gY29tbWFuZHM7Ci0KLQlwdWJsaWMgQ29tcG9zaXRlQ29tbWFuZChDb21tYW5kLi4uIGNvbW1hbmRzKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmFibGU8Q29tbWFuZD4oY29tbWFuZHMpKTsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9zaXRlQ29tbWFuZChJdGVyYWJsZTxDb21tYW5kPiBjb21tYW5kcykgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbW1hbmRzID0gY29tbWFuZHM7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJZm9yIChDb21tYW5kIGNvbW1hbmQgOiB0aGlzLmNvbW1hbmRzKSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY29tbWFuZHMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvbXBvc2l0ZUV4Y2VwdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvbXBvc2l0ZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDA3OTk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db21wb3NpdGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlIGEgd2F5IGZvciBtdWx0aXBsZSBleGNlcHRpb25zIHRvIGJlIHBhY2thZ2VkIGFuZCByZXBvcnRlZC4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUV4Y2VwdGlvbgotCWV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgotewotCXByaXZhdGUgZmluYWwgVGhyb3dhYmxlW10gZXhjZXB0aW9uczsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBleGNlcHRpb25zIGxpc3QgbXVzdCBub3QgYmUgZW1wdHkuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUV4Y2VwdGlvbihDb2xsZWN0aW9uPFRocm93YWJsZT4gZXhjZXB0aW9ucykgewotCQl0aGlzKGV4Y2VwdGlvbnMudG9BcnJheShuZXcgVGhyb3dhYmxlW2V4Y2VwdGlvbnMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgZXhjZXB0aW9ucyBsaXN0IG11c3Qgbm90IGJlIGVtcHR5LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVFeGNlcHRpb24oVGhyb3dhYmxlW10gZXhjZXB0aW9ucykgewotCQkvLyBncmFiIHRoZSBmaXJzdCBleGNlcHRpb24gYW5kIG1ha2UgaXQgdGhlICJjYXVzZSIKLQkJc3VwZXIoZXhjZXB0aW9uc1swXSk7Ci0JCXRoaXMuZXhjZXB0aW9ucyA9IGV4Y2VwdGlvbnM7Ci0JfQotCi0JcHVibGljIFRocm93YWJsZVtdIGdldEV4Y2VwdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmV4Y2VwdGlvbnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmZTg3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7Ci0KLS8qKgotICogQSA8Y29kZT5Db25zdW1lclRocmVhZENvb3JkaW5hdG9yPC9jb2RlPiBjb250cm9scyB0aGUgY3JlYXRpb24sCi0gKiBzdGFydGluZywgYW5kIHN0b3BwaW5nIG9mIGEgZ2VuZXJhbCBwdXJwb3NlICJjb25zdW1lciIgdGhyZWFkLiBDb25zdHJ1Y3QKLSAqIHRoZSBjb29yZGluYXRvciB3aXRoIGEge0BsaW5rIENvbnN1bWVyfSB0aGF0IGJvdGggd2FpdHMgZm9yIHRoZSBwcm9kdWNlcgotICogdG8gInByb2R1Y2UiIHNvbWV0aGluZyB0byAiY29uc3VtZSIgYW5kLCBvbmNlIHRoZSB3YWl0IGlzIG92ZXIsCi0gKiAiY29uc3VtZXMiIHdoYXRldmVyIGlzIGF2YWlsYWJsZS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIGNsaWVudC1zdXBwbGllZCBjb25zdW1lciBzaG91bGQgaGFuZGxlIGFueQotICogZXhjZXB0aW9uIGFwcHJvcHJpYXRlbHkgKGUuZy4gbG9nIHRoZSBleGNlcHRpb24gYW5kIHJldHVybiBncmFjZWZ1bGx5KSBzbwotICogdGhlIHRocmVhZCBjYW4gY29udGludWUgZXhlY3V0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvciB7Ci0JLyoqCi0JICogVGhlIHJ1bm5hYmxlIHBhc3NlZCB0byB0aGUgY29uc3VtZXIgdGhyZWFkIGVhY2ggdGltZSBpdCBpcyBidWlsdC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlOwotCi0JLyoqCi0JICogQ2xpZW50LXN1cHBsaWVkIHRocmVhZCBmYWN0b3J5LiBEZWZhdWx0cyB0byBhIHN0cmFpZ2h0Zm9yd2FyZAotCSAqIGltcGxlbWVudGF0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5OwotCi0JLyoqCi0JICogT3B0aW9uYWwsIGNsaWVudC1zdXBwbGllZCBuYW1lIGZvciB0aGUgY29uc3VtZXIgdGhyZWFkLgotCSAqIElmIG51bGwsIHRoZSBKREsgYXNzaWducyBhIG5hbWUuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGhyZWFkTmFtZTsKLQotCS8qKgotCSAqIFRoZSBjb25zdW1lciBpcyBleGVjdXRlZCBvbiB0aGlzIHRocmVhZC4gQSBuZXcgdGhyZWFkIGlzIGJ1aWx0Ci0JICogZm9yIGV2ZXJ5IHN0YXJ0L3N0b3AgY3ljbGUgKHNpbmNlIGEgdGhyZWFkIGNhbm5vdCBiZSBzdGFydGVkIG1vcmUgdGhhbgotCSAqIG9uY2UpLgotCSAqLwotCXByaXZhdGUgdm9sYXRpbGUgVGhyZWFkIHRocmVhZDsKLQotCS8qKgotCSAqIEEgbGlzdCBvZiB0aGUgdW5jYXVnaHQgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbnN1bWVyCi0JICogZHVyaW5nIHRoZSBjdXJyZW50IHN0YXJ0L3N0b3AgY3ljbGUuCi0JICovCi0JZmluYWwgVmVjdG9yPFRocm93YWJsZT4gZXhjZXB0aW9ucyA9IG5ldyBWZWN0b3I8VGhyb3dhYmxlPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb25zdW1lciB0aHJlYWQgY29vcmRpbmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY29uc3VtZXIuCi0JICogVXNlIHNpbXBsZSBKREsgdGhyZWFkKHMpIGZvciB0aGUgY29uc3VtZXIgdGhyZWFkKHMpLgotCSAqIEFsbG93IHRoZSBjb25zdW1lciB0aHJlYWQocykgdG8gYmUgYXNzaWduZWQgSkRLLWdlbmVyYXRlZCBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcihDb25zdW1lciBjb25zdW1lcikgewotCQl0aGlzKGNvbnN1bWVyLCBTaW1wbGVUaHJlYWRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbnN1bWVyIHRocmVhZCBjb29yZGluYXRvciBmb3IgdGhlIHNwZWNpZmllZCBjb25zdW1lci4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCB0aHJlYWQgZmFjdG9yeSB0byBjb25zdHJ1Y3QgdGhlIGNvbnN1bWVyIHRocmVhZChzKS4KLQkgKiBBbGxvdyB0aGUgY29uc3VtZXIgdGhyZWFkKHMpIHRvIGJlIGFzc2lnbmVkIEpESy1nZW5lcmF0ZWQgbmFtZXMuCi0JICovCi0JcHVibGljIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IoQ29uc3VtZXIgY29uc3VtZXIsIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSkgewotCQl0aGlzKGNvbnN1bWVyLCB0aHJlYWRGYWN0b3J5LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb25zdW1lciB0aHJlYWQgY29vcmRpbmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY29uc3VtZXIuCi0JICogQXNzaWduIHRoZSBjb25zdW1lciB0aHJlYWQocykgdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIFVzZSBzaW1wbGUgSkRLIHRocmVhZChzKSBmb3IgdGhlIGNvbnN1bWVyIHRocmVhZChzKS4KLQkgKi8KLQlwdWJsaWMgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcihDb25zdW1lciBjb25zdW1lciwgU3RyaW5nIHRocmVhZE5hbWUpIHsKLQkJdGhpcyhjb25zdW1lciwgU2ltcGxlVGhyZWFkRmFjdG9yeS5pbnN0YW5jZSgpLCB0aHJlYWROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb25zdW1lciB0aHJlYWQgY29vcmRpbmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY29uc3VtZXIuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgdGhyZWFkIGZhY3RvcnkgdG8gY29uc3RydWN0IHRoZSBjb25zdW1lciB0aHJlYWQocykuCi0JICogQXNzaWduIHRoZSBjb25zdW1lciB0aHJlYWQocykgdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqLwotCXB1YmxpYyBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKENvbnN1bWVyIGNvbnN1bWVyLCBUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnksIFN0cmluZyB0aHJlYWROYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucnVubmFibGUgPSB0aGlzLmJ1aWxkUnVubmFibGUoY29uc3VtZXIpOwotCQl0aGlzLnRocmVhZEZhY3RvcnkgPSB0aHJlYWRGYWN0b3J5OwotCQl0aGlzLnRocmVhZE5hbWUgPSB0aHJlYWROYW1lOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShDb25zdW1lciBjb25zdW1lcikgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlQ29uc3VtZXIoY29uc3VtZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaWZlY3ljbGUgc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhbmQgc3RhcnQgdGhlIGNvbnN1bWVyIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB7Ci0JCWlmICh0aGlzLnRocmVhZCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3Qgc3RvcHBlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMudGhyZWFkID0gdGhpcy5idWlsZFRocmVhZCgpOwotCQl0aGlzLnRocmVhZC5zdGFydCgpOwotCX0KLQotCXByaXZhdGUgVGhyZWFkIGJ1aWxkVGhyZWFkKCkgewotCQlUaHJlYWQgdCA9IHRoaXMudGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQodGhpcy5ydW5uYWJsZSk7Ci0JCWlmICh0aGlzLnRocmVhZE5hbWUgIT0gbnVsbCkgewotCQkJdC5zZXROYW1lKHRoaXMudGhyZWFkTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHQ7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJydXB0IHRoZSBjb25zdW1lciB0aHJlYWQgc28gdGhhdCBpdCBzdG9wcyBleGVjdXRpbmcgYXQgdGhlCi0JICogZW5kIG9mIGl0cyBjdXJyZW50IGl0ZXJhdGlvbi4gU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwKLQkgKiB0aGUgY29uc3VtZXIgdGhyZWFkIGlzIGZpbmlzaGVkIGV4ZWN1dGluZy4gSWYgYW55IHVuY2F1Z2h0Ci0JICogZXhjZXB0aW9ucyB3ZXJlIHRocm93biB3aGlsZSB0aGUgY29uc3VtZXIgdGhyZWFkIHdhcyBleGVjdXRpbmcsCi0JICogd3JhcCB0aGVtIGluIGEgY29tcG9zaXRlIGV4Y2VwdGlvbiBhbmQgdGhyb3cgdGhlIGNvbXBvc2l0ZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7Ci0JCWlmICh0aGlzLnRocmVhZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3Qgc3RhcnRlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMudGhyZWFkLmludGVycnVwdCgpOwotCQl0cnkgewotCQkJdGhpcy50aHJlYWQuam9pbigpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhlIHRocmVhZCB0aGF0IGNhbGxlZCAjc3RvcCgpIHdhcyBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIHRvCi0JCQkvLyBqb2luIHRoZSBjb25zdW1lciB0aHJlYWQgLSBpZ25vcmU7Ci0JCQkvLyAndGhyZWFkJyBpcyBzdGlsbCAiaW50ZXJydXB0ZWQiLCBzbyBpdHMgI3J1bigpIGxvb3Agd2lsbCBzdGlsbCBzdG9wCi0JCQkvLyBhZnRlciBpdHMgY3VycmVudCBleGVjdXRpb24gLSB3ZSBqdXN0IHdvbid0IHdhaXQgYXJvdW5kIGZvciBpdC4uLgotCQl9Ci0JCXRoaXMudGhyZWFkID0gbnVsbDsKLQotCQlpZiAodGhpcy5leGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCVRocm93YWJsZVtdIHRlbXAgPSB0aGlzLmV4Y2VwdGlvbnMudG9BcnJheShuZXcgVGhyb3dhYmxlW3RoaXMuZXhjZXB0aW9ucy5zaXplKCldKTsKLQkJCXRoaXMuZXhjZXB0aW9ucy5jbGVhcigpOwotCQkJdGhyb3cgbmV3IENvbXBvc2l0ZUV4Y2VwdGlvbih0ZW1wKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudGhyZWFkKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3VtZXIgdGhyZWFkIHJ1bm5hYmxlICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFJ1bm5hYmxlfSBpcyBhIGxvbmctcnVubmluZyBjb25zdW1lciB0aGF0Ci0JICogd2lsbCByZXBlYXRlZGx5IGV4ZWN1dGUgdGhlIGNvbnN1bWVyIHtAbGluayBDb25zdW1lciNleGVjdXRlKCl9IG1ldGhvZC4KLQkgKiBXaXRoIGVhY2ggaXRlcmF0aW9uLCB0aGUgY29uc3VtZXIgdGhyZWFkIHdpbGwgd2FpdAotCSAqIHVudGlsIHRoZSBvdGhlciBjb25zdW1lciBtZXRob2QsIHtAbGluayBDb25zdW1lciN3YWl0Rm9yUHJvZHVjZXIoKX0sIGFsbG93cyB0aGUKLQkgKiBjb25zdW1lciB0aHJlYWQgdG8gcHJvY2VlZCAoaS5lLiB0aGVyZSBpcyBzb21ldGhpbmcgZm9yIHRoZSBjb25zdW1lciB0bwotCSAqIGNvbnN1bWUpLiBPbmNlIHtAbGluayBDb25zdW1lciNleGVjdXRlKCl9IGlzIGZpbmlzaGVkLCB0aGUgdGhyZWFkIHdpbGwgcXVpZXNjZQotCSAqIHVudGlsIHtAbGluayBDb25zdW1lciN3YWl0Rm9yUHJvZHVjZXIoKX0gcmV0dXJucyBhZ2Fpbi4KLQkgKiBTdG9wIHRoZSB0aHJlYWQgYnkgY2FsbGluZyB7QGxpbmsgVGhyZWFkI2ludGVycnVwdCgpfS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJ1bm5hYmxlQ29uc3VtZXIKLQkJaW1wbGVtZW50cyBSdW5uYWJsZQotCXsKLQkJLyoqCi0JCSAqIENsaWVudC1zdXBwbGllZCBjb25zdW1lciB0aGF0IGNvbnRyb2xzIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBjb25zdW1lCi0JCSAqIGFuZCB0aGUgY29uc3VtaW5nIGl0c2VsZi4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgQ29uc3VtZXIgY29uc3VtZXI7Ci0KLQkJUnVubmFibGVDb25zdW1lcihDb25zdW1lciBjb25zdW1lcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29uc3VtZXIgPSBjb25zdW1lcjsKLQkJfQotCi0JCS8qKgotCQkgKiBMb29wIHdoaWxlIHRoaXMgdGhyZWFkIGhhcyBub3QgYmVlbiBpbnRlcnJ1cHRlZCBieSBhbm90aGVyIHRocmVhZC4KLQkJICogSW4gZWFjaCBsb29wOiBQYXVzZSBleGVjdXRpb24gdW50aWwge0BsaW5rIENvbnN1bWVyI3dhaXRGb3JQcm9kdWNlcigpfQotCQkgKiBhbGxvd3MgdXMgdG8gcHJvY2VlZC4KLQkJICogPHA+Ci0JCSAqIElmIHRoaXMgdGhyZWFkIGlzIGludGVycnVwdGVkIDxlbT5kdXJpbmc8L2VtPiB7QGxpbmsgQ29uc3VtZXIjZXhlY3V0ZSgpfSwKLQkJICogdGhlIGNhbGwgdG8ge0BsaW5rIFRocmVhZCNpbnRlcnJ1cHRlZCgpfSB3aWxsIHN0b3AgdGhlIGxvb3AuIElmIHRoaXMgdGhyZWFkIGlzCi0JCSAqIGludGVycnVwdGVkIGR1cmluZyB0aGUgY2FsbCB0byB7QGxpbmsgQ29uc3VtZXIjd2FpdEZvclByb2R1Y2VyKCl9LAotCQkgKiB3ZSB3aWxsIGNhdGNoIHRoZSB7QGxpbmsgSW50ZXJydXB0ZWRFeGNlcHRpb259IGFuZCBzdG9wIHRoZSBsb29wIGFsc28uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl3aGlsZSAoICEgVGhyZWFkLmludGVycnVwdGVkKCkpIHsKLQkJCQl0cnkgewotCQkJCQl0aGlzLmNvbnN1bWVyLndhaXRGb3JQcm9kdWNlcigpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIHdlIHdlcmUgaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZywgbXVzdCBiZSBRdWl0dGluJyBUaW1lCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdGhpcy5leGVjdXRlKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogRXhlY3V0ZSB0aGUgY29uc3VtZXIge0BsaW5rIENvbnN1bWVyI2V4ZWN1dGUoKX0gbWV0aG9kLgotCQkgKiBEbyBub3QgYWxsb3cgYW55IHVuaGFuZGxlZCBleGNlcHRpb25zIHRvIGtpbGwgdGhlIHRocmVhZC4KLQkJICogU3RvcmUgdGhlbSB1cCBmb3IgbGF0ZXIgcGFpbi4KLQkJICogQHNlZSBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yI3N0b3AoKQotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0cnkgewotCQkJCXRoaXMuZXhlY3V0ZV8oKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotCQkJCUNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IudGhpcy5leGNlcHRpb25zLmFkZChleCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogU3ViY2xhc3MtaW1wbGVtZW50ZWQgYmVoYXZpb3I6IGNvbnN1bWUgc3R1ZmYuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgZXhlY3V0ZV8oKSB7Ci0JCQl0aGlzLmNvbnN1bWVyLmV4ZWN1dGUoKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN1bWVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgY2xpZW50cyB0aGF0IGNvbnRyb2xzOjx1bD4KLQkgKiA8bGk+d2hlbiB0aGUgY29uc3VtZXIgdGhyZWFkIHN1c3BlbmRzLCB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gY29uc3VtZQotCSAqIDxsaT50aGUgY29uc3VtaW5nIG9mIHdoYXRldmVyIGlzIGJlaW5nIHByb2R1Y2VkCi0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIENvbnN1bWVyIHsKLQkJLyoqCi0JCSAqIFdhaXQgZm9yIHNvbWV0aGluZyB0byBjb25zdW1lLgotCQkgKiBUaHJvdyBhbiB7QGxpbmsgSW50ZXJydXB0ZWRFeGNlcHRpb259IGlmIHRoZSB0aHJlYWQgaXMgaW50ZXJydXB0ZWQuCi0JCSAqLwotCQl2b2lkIHdhaXRGb3JQcm9kdWNlcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQotCQkvKioKLQkJICogQ29uc3VtZSB3aGF0ZXZlciBpcyBjdXJyZW50bHkgYXZhaWxhYmxlLgotCQkgKi8KLQkJdm9pZCBleGVjdXRlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvRXhjZXB0aW9uSGFuZGxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0V4Y2VwdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiZGExMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvRXhjZXB0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFNpbXBsZSBpbnRlcmZhY2UgZm9yIGFsbG93aW5nIGNsaWVudHMgdG8gcGFzcyBhbiBleGNlcHRpb24gaGFuZGxlciB0byBhCi0gKiBzZXJ2aWNlIChlLmcuIHRvIGxvZyB0aGUgZXhjZXB0aW9uKS4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgaGVscGZ1bCBpZiB0aGUKLSAqIHNlcnZpY2UgZXhlY3V0ZXMgb24gYW5vdGhlciwgcG9zc2libHkgaW5hY2Nlc3NpYmxlLCB0aHJlYWQuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4Y2VwdGlvbkhhbmRsZXIgewotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBleGNlcHRpb24gd2FzIHRocm93bi4gSGFuZGxlIGl0IGFwcHJvcHJpYXRlbHkuCi0JICovCi0Jdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIHQpOwotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBleGNlcHRpb24gaGFuZGxlciBpbnRlcmZhY2UgdGhhdCBkb2VzCi0JICogbm90aGluZyB3aXRoIHRoZSBleGNlcHRpb24uCi0JICovCi0JZmluYWwgY2xhc3MgTnVsbCBpbXBsZW1lbnRzIEV4Y2VwdGlvbkhhbmRsZXIsIFNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRXhjZXB0aW9uSGFuZGxlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgRXhjZXB0aW9uSGFuZGxlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkV4Y2VwdGlvbkhhbmRsZXIuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBleGNlcHRpb24gaGFuZGxlciBpbnRlcmZhY2UgdGhhdAotCSAqIHdyYXBzIHRoZSBleGNlcHRpb24gaW4gYSBydW50aW1lIGV4Y2VwdGlvbiBhbmQgdGhyb3dzIGl0LgotCSAqLwotCWZpbmFsIGNsYXNzIFJ1bnRpbWUgaW1wbGVtZW50cyBFeGNlcHRpb25IYW5kbGVyLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEV4Y2VwdGlvbkhhbmRsZXIgSU5TVEFOQ0UgPSBuZXcgUnVudGltZSgpOwotCQlwdWJsaWMgc3RhdGljIEV4Y2VwdGlvbkhhbmRsZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIFJ1bnRpbWUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgdCkgewotCQkJLy8gcmUtdGhyb3cgdGhlIGV4Y2VwdGlvbiB1bmNoZWNrZWQKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJFeGNlcHRpb25IYW5kbGVyLlJ1bnRpbWUiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0ZpbGVUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0ZpbGVUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODhiYzBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9GaWxlVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqIEFzc29ydGVkIGZpbGUgdG9vbHM6Ci0gKiAtIGRlbGV0ZSBlbnRpcmUgdHJlZXMgb2YgZGlyZWN0b3JpZXMgYW5kIGZpbGVzCi0gKiAtIGJ1aWxkIGl0ZXJhdG9ycyBvbiBlbnRpcmUgdHJlZXMgb2YgZGlyZWN0b3JpZXMgYW5kIGZpbGVzCi0gKiAtIGJ1aWxkIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeQotICogLSAiY2Fub25pemUiIGZpbGVzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGaWxlVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9IT01FX0RJUkVDVE9SWV9OQU1FID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfVEVNUE9SQVJZX0RJUkVDVE9SWV9OQU1FID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9URU1QT1JBUllfRElSRUNUT1JZX05BTUUgPSAidG1wZGlyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfV09SS0lOR19ESVJFQ1RPUllfTkFNRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIEEgbGlzdCBvZiBzb21lIGludmFsaWQgZmlsZSBuYW1lIGNoYXJhY3RlcnMuCi0JCQkJOiBpcyB0aGUgZmlsZW5hbWUgc2VwYXJhdG9yIGluIE1hY09TIGFuZCB0aGUgZHJpdmUgaW5kaWNhdG9yIGluIERPUwotCQkJCSogaXMgYSBET1Mgd2lsZGNhcmQgY2hhcmFjdGVyCi0JCQkJfCBpcyBhIERPUyByZWRpcmVjdGlvbiBjaGFyYWN0ZXIKLQkJCQkmIGlzIG91ciBvd24gZXNjYXBlIGNoYXJhY3RlcgotCQkJCS8gaXMgdGhlIGZpbGVuYW1lIHNlcGFyYXRvciBpbiBVbml4IGFuZCB0aGUgY29tbWFuZCBvcHRpb24gdGFnIGluIERPUwotCQkJCVwgaXMgdGhlIGZpbGVuYW1lIHNlcGFyYXRvciBpbiBET1MvV2luZG93cyBhbmQgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgaW4gVW5peAotCQkJCTsgaXMgPz8/Ci0JCQkJPyBpcyBhIERPUyB3aWxkY2FyZCBjaGFyYWN0ZXIKLQkJCQlbIGlzID8/PwotCQkJCV0gaXMgPz8/Ci0JCQkJPSBpcyA/Pz8KLQkJCQkrIGlzID8/PwotCQkJCTwgaXMgYSBET1MgcmVkaXJlY3Rpb24gY2hhcmFjdGVyCi0JCQkJPiBpcyBhIERPUyByZWRpcmVjdGlvbiBjaGFyYWN0ZXIKLQkJCQkiIGlzIHVzZWQgYnkgRE9TIHRvIGRlbGltaXQgZmlsZSBuYW1lcyB3aXRoIHNwYWNlcwotCQkJCSwgaXMgPz8/Ci0gICAgICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTID0geyAnOicsICcqJywgJ3wnLCAnJicsICcvJywgJ1xcJywgJzsnLCAnPycsICdbJywgJ10nLCAnPScsICcrJywgJzwnLCAnPicsICciJywgJywnIH07Ci0KLQkvKiogVGhpcyBlbmNvZGVyIHdpbGwgY29udmVydCBzdHJpbmdzIGludG8gdmFsaWQgZmlsZSBuYW1lcy4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFN0cmluZ0VuY29kZXIgRklMRV9OQU1FX0VOQ09ERVIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihJTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JLyoqIFdpbmRvd3MgZmlsZXMgdGhhdCBhcmUgcmVkaXJlY3RlZCB0byBkZXZpY2VzIGV0Yy4gKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBXSU5ET1dTX1JFU0VSVkVEX0ZJTEVfTkFNRVMgPSB7Ci0JCSJjb24iLAotCQkiYXV4IiwKLQkJImNvbTEiLCAiY29tMiIsICJjb20zIiwgImNvbTQiLCAiY29tNSIsICJjb202IiwgImNvbTciLCAiY29tOCIsICJjb205IiwKLQkJImxwdDEiLCAibHB0MiIsICJscHQzIiwgImxwdDQiLCAibHB0NSIsICJscHQ2IiwgImxwdDciLCAibHB0OCIsICJscHQ5IiwKLQkJInBybiIsCi0JCSJudWwiCi0JfTsKLQotCS8qKiBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBzaG9ydGVuZWQgZmlsZSBuYW1lLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEggPSA2MDsKLQotCi0JLy8gKioqKioqKioqKiBkZWxldGluZyBkaXJlY3RvcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEZWxldGUgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudHMuCi0JICogPGVtPlVTRSBXSVRIIENBUkUuPC9lbT4KLQkgKiBGaWxlI2RlbGV0ZUFsbCgpPwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJZGVsZXRlRGlyZWN0b3J5KG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVsZXRlIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnRzLgotCSAqIDxlbT5VU0UgV0lUSCBDQVJFLjwvZW0+Ci0JICogRmlsZSNkZWxldGVBbGwoKT8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KSB7Ci0JCWRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKGRpcmVjdG9yeSk7Ci0JCWlmICggISBkaXJlY3RvcnkuZGVsZXRlKCkpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ1bmFibGUgdG8gZGVsZXRlIGRpcmVjdG9yeTogIiArIGRpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Ci0JICogKGJ1dCBub3QgdGhlIGRpcmVjdG9yeSBpdHNlbGYpLgotCSAqIDxlbT5VU0UgV0lUSCBDQVJFLjwvZW0+Ci0JICogRmlsZSNkZWxldGVGaWxlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCWRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQotCSAqIChidXQgbm90IHRoZSBkaXJlY3RvcnkgaXRzZWxmKS4KLQkgKiA8ZW0+VVNFIFdJVEggQ0FSRS48L2VtPgotCSAqIEZpbGUjZGVsZXRlRmlsZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcnlDb250ZW50cyhGaWxlIGRpcmVjdG9yeSkgewotCQlmb3IgKEZpbGUgZmlsZSA6IGRpcmVjdG9yeS5saXN0RmlsZXMoKSkgewotCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWRlbGV0ZURpcmVjdG9yeShmaWxlKTsJLy8gcmVjdXJzZSB0aHJvdWdoIHN1YmRpcmVjdG9yaWVzCi0JCQl9IGVsc2UgewotCQkJCWlmICggISBmaWxlLmRlbGV0ZSgpKSB7Ci0JCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ1bmFibGUgdG8gZGVsZXRlIGZpbGU6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQotCS8vICoqKioqKioqKiogY29weWluZyBmaWxlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLgotCSAqIEZpbGUjY29weShGaWxlIGRlc3RpbmF0aW9uRmlsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weVRvRmlsZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdGluYXRpb25GaWxlKQotCQl0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCUZpbGVDaGFubmVsIHNvdXJjZUNoYW5uZWwgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZUZpbGUpLmdldENoYW5uZWwoKTsKLQkJRmlsZUNoYW5uZWwgZGVzdGluYXRpb25DaGFubmVsID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdGluYXRpb25GaWxlKS5nZXRDaGFubmVsKCk7Ci0JCXRyeSB7Ci0JCQlkZXN0aW5hdGlvbkNoYW5uZWwudHJhbnNmZXJGcm9tKHNvdXJjZUNoYW5uZWwsIDAsIHNvdXJjZUNoYW5uZWwuc2l6ZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNvdXJjZUNoYW5uZWwuY2xvc2UoKTsKLQkJCWRlc3RpbmF0aW9uQ2hhbm5lbC5jbG9zZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvcGllcyB0aGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGUgdG8gYSBmaWxlIGJ5Ci0JICogdGhlIHNhbWUgbmFtZSBpbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgotCSAqIEZpbGUjY29weVRvRGlyZWN0b3J5KEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnkpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlUb0RpcmVjdG9yeShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnkpCi0JCXRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJRmlsZSBkZXN0aW5hdGlvbkZpbGUgPSBuZXcgRmlsZShkZXN0aW5hdGlvbkRpcmVjdG9yeSwgc291cmNlRmlsZS5nZXROYW1lKCkpOwotCQlpZiAoICEgZGVzdGluYXRpb25GaWxlLmV4aXN0cygpICYmICEgZGVzdGluYXRpb25GaWxlLmNyZWF0ZU5ld0ZpbGUoKSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNyZWF0ZU5ld0ZpbGUoKSBmYWlsZWQ6ICIgKyBkZXN0aW5hdGlvbkZpbGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY29weVRvRmlsZShzb3VyY2VGaWxlLCBkZXN0aW5hdGlvbkZpbGUpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogaXRlcmF0b3Jpbmcgb3ZlciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogVGhlIGl0ZXJhdG9yIHdpbGwgc2tpcCBvdmVyIHN1YmRpcmVjdG9yaWVzLgotCSAqIEZpbGUjZmlsZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJbihTdHJpbmcgZGlyZWN0b3J5TmFtZSkgewotCQlyZXR1cm4gZmlsZXNJbihuZXcgRmlsZShkaXJlY3RvcnlOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqIFRoZSBpdGVyYXRvciB3aWxsIHNraXAgb3ZlciBzdWJkaXJlY3Rvcmllcy4KLQkgKiBGaWxlI2ZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGZpbGVzSW4oRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGZpbGVzSW4oZGlyZWN0b3J5Lmxpc3RGaWxlcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJbihGaWxlW10gZmlsZXMpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxGaWxlPihuZXcgQXJyYXlJdGVyYXRvcjxGaWxlPihmaWxlcykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmlzRmlsZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBzdWJkaXJlY3RvcmllcwotCSAqIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqIEZpbGUjc3ViRGlyZWN0b3JpZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJbihTdHJpbmcgZGlyZWN0b3J5TmFtZSkgewotCQlyZXR1cm4gZGlyZWN0b3JpZXNJbihuZXcgRmlsZShkaXJlY3RvcnlOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzCi0JICogaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogRmlsZSNzdWJEaXJlY3RvcmllcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBkaXJlY3Rvcmllc0luKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCXJldHVybiBkaXJlY3Rvcmllc0luKGRpcmVjdG9yeS5saXN0RmlsZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW4oRmlsZVtdIGZpbGVzKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8RmlsZT4obmV3IEFycmF5SXRlcmF0b3I8RmlsZT4oZmlsZXMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChGaWxlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5pc0RpcmVjdG9yeSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBmaWxlcyB1bmRlciB0aGUgc3BlY2lmaWVkCi0JICogZGlyZWN0b3J5LCByZWN1cnNpbmcgaW50byBzdWJkaXJlY3Rvcmllcy4KLQkgKiBUaGUgaXRlcmF0b3Igd2lsbCBza2lwIG92ZXIgdGhlIHN1YmRpcmVjdG9yaWVzIHRoZW1zZWx2ZXMuCi0JICogRmlsZSNmaWxlc1JlY3Vyc2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJblRyZWUoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJcmV0dXJuIGZpbGVzSW5UcmVlKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZmlsZXMgdW5kZXIgdGhlIHNwZWNpZmllZAotCSAqIGRpcmVjdG9yeSwgcmVjdXJzaW5nIGludG8gc3ViZGlyZWN0b3JpZXMuCi0JICogVGhlIGl0ZXJhdG9yIHdpbGwgc2tpcCBvdmVyIHRoZSBzdWJkaXJlY3RvcmllcyB0aGVtc2VsdmVzLgotCSAqIEZpbGUjZmlsZXNSZWN1cnNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGZpbGVzSW5UcmVlKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCXJldHVybiBmaWxlc0luVHJlZUFzU2V0KGRpcmVjdG9yeSkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTZXQ8RmlsZT4gZmlsZXNJblRyZWVBc1NldChGaWxlIGRpcmVjdG9yeSkgewotCQlTZXQ8RmlsZT4gZmlsZXMgPSBuZXcgSGFzaFNldDxGaWxlPigxMDAwMCk7Ci0JCWFkZEZpbGVzSW5UcmVlVG8oZGlyZWN0b3J5LCBmaWxlcyk7Ci0JCXJldHVybiBmaWxlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEZpbGVzSW5UcmVlVG8oRmlsZSBkaXJlY3RvcnksIENvbGxlY3Rpb248RmlsZT4gYWxsRmlsZXMpIHsKLQkJZm9yIChGaWxlIGZpbGUgOiBkaXJlY3RvcnkubGlzdEZpbGVzKCkpIHsKLQkJCWlmIChmaWxlLmlzRmlsZSgpKSB7Ci0JCQkJYWxsRmlsZXMuYWRkKGZpbGUpOwotCQkJfSBlbHNlIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlhZGRGaWxlc0luVHJlZVRvKGZpbGUsIGFsbEZpbGVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGRpcmVjdG9yaWVzIHVuZGVyIHRoZSBzcGVjaWZpZWQKLQkgKiBkaXJlY3RvcnksIHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzLgotCSAqIEZpbGUjc3ViRGlyZWN0b3JpZXNSZWN1cnNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW5UcmVlKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCXJldHVybiBkaXJlY3Rvcmllc0luVHJlZShuZXcgRmlsZShkaXJlY3RvcnlOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGRpcmVjdG9yaWVzIHVuZGVyIHRoZSBzcGVjaWZpZWQKLQkgKiBkaXJlY3RvcnksIHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzLgotCSAqIEZpbGUjc3ViRGlyZWN0b3JpZXNSZWN1cnNlKCkKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW5UcmVlKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCUZpbGVbXSBmaWxlcyA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxGaWxlPihkaXJlY3Rvcmllc0luKGZpbGVzKSwgZGlyZWN0b3JpZXNJblRyZWVzKGRpcmVjdG9yaWVzSW4oZmlsZXMpKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW5UcmVlcyhJdGVyYXRvcjxGaWxlPiBkaXJlY3RvcmllcykgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEZpbGU+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RmlsZSwgSXRlcmF0b3I8RmlsZT4+KGRpcmVjdG9yaWVzKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPEZpbGU+IHRyYW5zZm9ybShGaWxlIG5leHQpIHsKLQkJCQkJcmV0dXJuIEZpbGVUb29scy5kaXJlY3Rvcmllc0luVHJlZShuZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBzaG9ydCBmaWxlIG5hbWUgbWFuaXB1bGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmlwIHRoZSBleHRlbnNpb24gZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZQotCSAqIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gSWYgdGhlIGZpbGUgbmFtZSBoYXMgbm8KLQkgKiBleHRlbnNpb24sIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZAotCSAqIEZpbGUjYmFzZVBhdGgoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwRXh0ZW5zaW9uKFN0cmluZyBmaWxlTmFtZSkgewotCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBmaWxlTmFtZTsKLQkJfQotCQlyZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQl9Ci0JCi0JLyoqCi0JICogU3RyaXAgdGhlIGV4dGVuc2lvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSdzIG5hbWUKLQkgKiBhbmQgcmV0dXJuIHRoZSByZXN1bHQuIElmIHRoZSBmaWxlJ3MgbmFtZSBoYXMgbm8KLQkgKiBleHRlbnNpb24sIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZAotCSAqIEZpbGUjYmFzZVBhdGgoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwRXh0ZW5zaW9uKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gc3RyaXBFeHRlbnNpb24oZmlsZS5nZXRQYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXh0ZW5zaW9uLCBpbmNsdWRpbmcgdGhlIGRvdCwgb2YgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUuCi0JICogSWYgdGhlIGZpbGUgbmFtZSBoYXMgbm8gZXh0ZW5zaW9uLCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgotCSAqIEZpbGUjZXh0ZW5zaW9uKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbnNpb24oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZyhpbmRleCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZXh0ZW5zaW9uLCBpbmNsdWRpbmcgdGhlIGRvdCwgb2YgdGhlIHNwZWNpZmllZCBmaWxlJ3MgbmFtZS4KLQkgKiBJZiB0aGUgZmlsZSdzIG5hbWUgaGFzIG5vIGV4dGVuc2lvbiwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KLQkgKiBGaWxlI2V4dGVuc2lvbigpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5zaW9uKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZXh0ZW5zaW9uKGZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVtcG9yYXJ5IGRpcmVjdG9yaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYW4gZW1wdHkgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGNsZWFyZWQgb3V0LgotCSAqIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIEphdmEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwKLQkgKiBhcyBpbmRpY2F0ZWQgYnkgdGhlIFN5c3RlbSBwcm9wZXJ0eSAiamF2YS5pby50bXBkaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBlbXB0eVRlbXBvcmFyeURpcmVjdG9yeShTdHJpbmcgbmFtZSkgewotCQlGaWxlIGRpciA9IG5ldyBGaWxlKHVzZXJUZW1wb3JhcnlEaXJlY3RvcnkoKSwgbmFtZSk7Ci0JCWlmIChkaXIuZXhpc3RzKCkpIHsKLQkJCWRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKGRpcik7Ci0JCX0gZWxzZSB7Ci0JCQlta2RpcnMoZGlyKTsKLQkJfQotCQlyZXR1cm4gZGlyOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWtkaXJzKEZpbGUgZGlyKSB7Ci0JCWlmICggISBkaXIubWtkaXJzKCkpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJta2RpcnMoKSBmYWlsZWQ6ICIgKyBkaXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhbiBlbXB0eSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggYQotCSAqIG5hbWUgb2YgInRtcGRpciIuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgY2xlYXJlZCBvdXQuCi0JICogVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LAotCSAqIGFzIGluZGljYXRlZCBieSB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGVtcHR5VGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZW1wdHlUZW1wb3JhcnlEaXJlY3RvcnkoREVGQVVMVF9URU1QT1JBUllfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGxlZnQgdW5jaGFuZ2VkOwotCSAqIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4KLQkgKiBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksCi0JICogYXMgaW5kaWNhdGVkIGJ5IHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgdGVtcG9yYXJ5RGlyZWN0b3J5KFN0cmluZyBuYW1lKSB7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUodXNlclRlbXBvcmFyeURpcmVjdG9yeSgpLCBuYW1lKTsKLQkJaWYgKCAhIGRpci5leGlzdHMoKSkgewotCQkJbWtkaXJzKGRpcik7Ci0JCX0KLQkJcmV0dXJuIGRpcjsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIHRlbXBvcmFyeSBkaXJlY3Rvcnkgd2l0aCBhIG5hbWUgb2YKLQkgKiAidG1wZGlyIi4gSWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBsZWZ0IHVuY2hhbmdlZDsKLQkgKiBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuCi0JICogVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LAotCSAqIGFzIGluZGljYXRlZCBieSB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIHRlbXBvcmFyeURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHRlbXBvcmFyeURpcmVjdG9yeShERUZBVUxUX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSAqbmV3KiB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggdGhlIHNwZWNpZmllZAotCSAqIHByZWZpeC4gVGhlIHByZWZpeCB3aWxsIGJlIGFwcGVuZGVkIHdpdGggYSBudW1iZXIgdGhhdAotCSAqIGlzIGluY3JlbWVudGVkLCBzdGFydGluZyB3aXRoIDEsIHVudGlsIGEgbm9uLXByZS1leGlzdGluZyBkaXJlY3RvcnkKLQkgKiBpcyBmb3VuZCBhbmQgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYQotCSAqIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBhcyBpbmRpY2F0ZWQgYnkKLQkgKiB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIG5ld1RlbXBvcmFyeURpcmVjdG9yeShTdHJpbmcgcHJlZml4KSB7Ci0JCWlmICggISBwcmVmaXguZW5kc1dpdGgoIi4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcmVmaXggPSBwcmVmaXggKyAnLic7Ci0JCX0KLQkJRmlsZSBkaXI7Ci0JCWludCBpID0gMDsKLQkJZG8gewotCQkJaSsrOwotCQkJZGlyID0gbmV3IEZpbGUodXNlclRlbXBvcmFyeURpcmVjdG9yeSgpLCBwcmVmaXggKyBpKTsKLQkJfSB3aGlsZSAoICEgZGlyLm1rZGlycygpKTsKLQkJcmV0dXJuIGRpcjsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhICpuZXcqIHRlbXBvcmFyeSBkaXJlY3Rvcnkgd2l0aCBhCi0JICogcHJlZml4IG9mICJ0bXBkaXIiLiBUaGlzIHByZWZpeCB3aWxsIGJlIGFwcGVuZGVkIHdpdGggYSBudW1iZXIgdGhhdAotCSAqIGlzIGluY3JlbWVudGVkLCBzdGFydGluZyB3aXRoIDEsIHVudGlsIGEgbm9uLXByZS1leGlzdGluZyBkaXJlY3RvcnkKLQkgKiBpcyBmb3VuZCBhbmQgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYQotCSAqIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBhcyBpbmRpY2F0ZWQgYnkKLQkgKiB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIG5ld1RlbXBvcmFyeURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIG5ld1RlbXBvcmFyeURpcmVjdG9yeShERUZBVUxUX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBmaWxlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KLQkgKiBUaGUgcmVzb3VyY2UgbmFtZSBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZCwgaS5lLiBpdCBjYW5ub3QgYmUgcmVsYXRpdmUKLQkgKiB0byB0aGUgcGFja2FnZSBuYW1lL2RpcmVjdG9yeS4KLQkgKiBOQjogVGhlcmUgaXMgYSBidWcgaW4gamRrMS40LnggdGhlIHByZXZlbnRzIHVzIGZyb20gZ2V0dGluZwotCSAqIGEgcmVzb3VyY2UgdGhhdCBoYXMgc3BhY2VzIChvciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMpIGluCi0JICogaXRzIG5hbWUuLi4uIChzZWUgU3VuJ3MgSmF2YSBidWcgNDQ2NjQ4NSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgcmVzb3VyY2VGaWxlKFN0cmluZyByZXNvdXJjZU5hbWUpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlpZiAoICEgcmVzb3VyY2VOYW1lLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHJlc291cmNlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIEZpbGVUb29scy5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgotCSAqIE5COiBUaGVyZSBpcyBhIGJ1ZyBpbiBqZGsxLjQueCB0aGUgcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nCi0JICogYSByZXNvdXJjZSB0aGF0IGhhcyBzcGFjZXMgKG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycykgaW4KLQkgKiBpdHMgbmFtZS4uLi4gKHNlZSBTdW4ncyBKYXZhIGJ1ZyA0NDY2NDg1KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSByZXNvdXJjZUZpbGUoU3RyaW5nIHJlc291cmNlTmFtZSwgQ2xhc3M8Pz4gamF2YUNsYXNzKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IGphdmFDbGFzcy5nZXRSZXNvdXJjZShyZXNvdXJjZU5hbWUpOwotCQlyZXR1cm4gYnVpbGRGaWxlKHVybCk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIFVSTC4KLQkgKiBOQjogVGhlcmUgaXMgYSBidWcgaW4gamRrMS40LnggdGhlIHByZXZlbnRzIHVzIGZyb20gZ2V0dGluZwotCSAqIGEgcmVzb3VyY2UgdGhhdCBoYXMgc3BhY2VzIChvciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMpIGluCi0JICogaXRzIG5hbWUuLi4uIChzZWUgU3VuJ3MgSmF2YSBidWcgNDQ2NjQ4NSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgYnVpbGRGaWxlKFVSTCB1cmwpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlyZXR1cm4gYnVpbGRGaWxlKHVybC5nZXRGaWxlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUuCi0JICogTkI6IFRoZXJlIGlzIGEgYnVnIGluIGpkazEuNC54IHRoZSBwcmV2ZW50cyB1cyBmcm9tIGdldHRpbmcKLQkgKiBhIHJlc291cmNlIHRoYXQgaGFzIHNwYWNlcyAob3Igb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzKSBpbgotCSAqIGl0cyBuYW1lLi4uLiAoc2VlIFN1bidzIEphdmEgYnVnIDQ0NjY0ODUpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGJ1aWxkRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlVUkkgdXJpID0gbmV3IFVSSShmaWxlTmFtZSk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVyaS5nZXRQYXRoKCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqICJjYW5vbmljYWwiIGZpbGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlIGludG8gYSAiY2Fub25pY2FsIiBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjYW5vbmljYWxGaWxlKEZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2V4Y2VwdGlvbikgewotCQkJLy8gc2V0dGxlIGZvciB0aGUgYWJzb2x1dGUgZmlsZQotCQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVGaWxlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW4gaXRlcmF0b3IgdGhhdCB3aWxsIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlcwotCSAqIGludG8gImNhbm9uaWNhbCIgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBjYW5vbmljYWxGaWxlcyhJdGVyYXRvcjxGaWxlPiBmaWxlcykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RmlsZSwgRmlsZT4oZmlsZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEZpbGUgdHJhbnNmb3JtKEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBjYW5vbmljYWxGaWxlKG5leHQpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBpdGVyYXRvciB0aGF0IHdpbGwgY29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGVzCi0JICogaW50byAiY2Fub25pY2FsIiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGNhbm9uaWNhbEZpbGVzKENvbGxlY3Rpb248RmlsZT4gZmlsZXMpIHsKLQkJcmV0dXJuIGNhbm9uaWNhbEZpbGVzKGZpbGVzLml0ZXJhdG9yKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lIGludG8gYSAiY2Fub25pY2FsIiBmaWxlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fub25pY2FsRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlKG5ldyBGaWxlKGZpbGVOYW1lKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuIGl0ZXJhdG9yIHRoYXQgd2lsbCBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lcwotCSAqIGludG8gImNhbm9uaWNhbCIgZmlsZSBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gY2Fub25pY2FsRmlsZU5hbWVzKEl0ZXJhdG9yPFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4oZmlsZU5hbWVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIGNhbm9uaWNhbEZpbGVOYW1lKG5leHQpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBpdGVyYXRvciB0aGF0IHdpbGwgY29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZXMKLQkgKiBpbnRvICJjYW5vbmljYWwiIGZpbGUgbmFtZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IGNhbm9uaWNhbEZpbGVOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlTmFtZXMoZmlsZU5hbWVzLml0ZXJhdG9yKCkpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogZmlsZSBuYW1lIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaXMgaW52YWxpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZU5hbWVJc0ludmFsaWQoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCXJldHVybiAhIGZpbGVOYW1lSXNWYWxpZChmaWxlbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaXMgdmFsaWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVOYW1lSXNWYWxpZChTdHJpbmcgZmlsZW5hbWUpIHsKLQkJaW50IGxlbiA9IGZpbGVuYW1lLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGZpbGVuYW1lQ2hhciA9IGZpbGVuYW1lLmNoYXJBdChpKTsKLQkJCWlmIChBcnJheVRvb2xzLmNvbnRhaW5zKElOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUywgZmlsZW5hbWVDaGFyKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBpbGxlZ2FsIGNoYXJhY3RlcnMgaW4gdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvVmFsaWRGaWxlTmFtZShTdHJpbmcgZmlsZW5hbWUsIGNoYXIgcmVwbGFjZW1lbnRDaGFyKSB7Ci0JCWludCBsZW4gPSBmaWxlbmFtZS5sZW5ndGgoKTsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgZmlsZW5hbWVDaGFyID0gZmlsZW5hbWUuY2hhckF0KGkpOwotCQkJaWYgKEFycmF5VG9vbHMuY29udGFpbnMoSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTLCBmaWxlbmFtZUNoYXIpKSB7Ci0JCQkJc2IuYXBwZW5kKHJlcGxhY2VtZW50Q2hhcik7Ci0JCQl9IGVsc2UgewotCQkJCXNiLmFwcGVuZChmaWxlbmFtZUNoYXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGlsbGVnYWwgY2hhcmFjdGVycyBpbiB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZSB0bwotCSAqIHBlcmlvZHMgKCcuJykgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1ZhbGlkRmlsZU5hbWUoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9WYWxpZEZpbGVOYW1lKGZpbGVuYW1lLCAnLicpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lIGlzICJyZXNlcnZlZCIKLQkgKiAoaS5lLiBpdCBjYW5ub3QgYmUgdXNlZCBmb3IgInVzZXIiIGZpbGVzKS4gV2luZG93cyByZXNlcnZlcwotCSAqIGEgbnVtYmVyIG9mIGZpbGUgbmFtZXMgKGUuZy4gQ09OLCBBVVgsIFBSTikuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVOYW1lSXNSZXNlcnZlZChTdHJpbmcgZmlsZU5hbWUpIHsKLQkJLy8gVW5peC9MaW51eCBkb2VzIG5vdCBoYXZlIGFueSAicmVzZXJ2ZWQiIGZpbGUgbmFtZXMgKEkgdGhpbmsuLi4pCi0JCXJldHVybiBUb29scy5vc0lzV2luZG93cygpICYmIEFycmF5VG9vbHMuY29udGFpbnMoV0lORE9XU19SRVNFUlZFRF9GSUxFX05BTUVTLCBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgY29udGFpbnMgYW55ICJyZXNlcnZlZCIKLQkgKiBjb21wb25lbnRzLgotCSAqIFdpbmRvd3MgcmVzZXJ2ZXMgYSBudW1iZXIgb2YgZmlsZSBuYW1lcyAoZS5nLiBDT04sIEFVWCwgUFJOKTsKLQkgKiBhbmQgdGhlc2UgZmlsZSBuYW1lcyBjYW5ub3QgYmUgdXNlZCBmb3IgZWl0aGVyIHRoZSBuYW1lcyBvZgotCSAqIGZpbGVzIG9yIGRpcmVjdG9yaWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKEZpbGUgZmlsZSkgewotCQlGaWxlIHRlbXAgPSBmaWxlOwotCQl3aGlsZSAodGVtcCAhPSBudWxsKSB7Ci0JCQlpZiAoZmlsZU5hbWVJc1Jlc2VydmVkKHRlbXAuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2hvcnRlbmVkIGZpbGUgbmFtZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgc2hvcnRlciB2ZXJzaW9uIG9mIHRoZSBhYnNvbHV0ZSBmaWxlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiBUaGUgc2hvcnRlciB2ZXJzaW9uIHdpbGwgbm90IGJlIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aC4KLQkgKiBUaGUgZmlyc3QgZGlyZWN0b3J5ICh1c3VhbGx5IHRoZSBkcml2ZSBsZXR0ZXIpIGFuZCB0aGUgZmlsZSBuYW1lIG9yIHRoZQotCSAqIGxhc3QgZGlyZWN0b3J5IHdpbGwgYWx3YXlzIGJlIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgc3RyaW5nIHJlZ2FyZGxlc3Mgb2YKLQkgKiB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydGVuRmlsZU5hbWUoVVJMIHVybCkgewotCQlyZXR1cm4gc2hvcnRlbkZpbGVOYW1lKHVybCwgTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2hvcnRlciB2ZXJzaW9uIG9mIHRoZSBhYnNvbHV0ZSBmaWxlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiBUaGUgc2hvcnRlciB2ZXJzaW9uIHdpbGwgbm90IGJlIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aC4KLQkgKiBUaGUgZmlyc3QgZGlyZWN0b3J5ICh1c3VhbGx5IHRoZSBkcml2ZSBsZXR0ZXIpIGFuZCB0aGUgZmlsZSBuYW1lIG9yIHRoZQotCSAqIGxhc3QgZGlyZWN0b3J5IHdpbGwgYWx3YXlzIGJlIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgc3RyaW5nIHJlZ2FyZGxlc3Mgb2YKLQkgKiB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydGVuRmlsZU5hbWUoVVJMIHVybCwgaW50IG1heExlbmd0aCkgewotCQlGaWxlIGZpbGU7Ci0JCXRyeSB7Ci0JCQlmaWxlID0gYnVpbGRGaWxlKHVybCk7Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCX0KLQkJcmV0dXJuIHNob3J0ZW5GaWxlTmFtZShmaWxlLCBtYXhMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNob3J0ZXIgdmVyc2lvbiBvZiB0aGUgYWJzb2x1dGUgZmlsZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICogVGhlIHNob3J0ZXIgdmVyc2lvbiB3aWxsIG5vdCBiZSBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGguCi0JICogVGhlIGZpcnN0IGRpcmVjdG9yeSAodXN1YWxseSB0aGUgZHJpdmUgbGV0dGVyKSBhbmQgdGhlIGZpbGUgbmFtZSBvciB0aGUKLQkgKiBsYXN0IGRpcmVjdG9yeSB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIHN0cmluZyByZWdhcmRsZXNzIG9mCi0JICogdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnRlbkZpbGVOYW1lKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gc2hvcnRlbkZpbGVOYW1lKGZpbGUsIE1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNob3J0ZXIgdmVyc2lvbiBvZiB0aGUgYWJzb2x1dGUgZmlsZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICogVGhlIHNob3J0ZXIgdmVyc2lvbiB3aWxsIG5vdCBiZSBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGguCi0JICogVGhlIGZpcnN0IGRpcmVjdG9yeSAodXN1YWxseSB0aGUgZHJpdmUgbGV0dGVyKSBhbmQgdGhlIGZpbGUgbmFtZSBvciB0aGUKLQkgKiBsYXN0IGRpcmVjdG9yeSB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIHN0cmluZyByZWdhcmRsZXNzIG9mCi0JICogdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnRlbkZpbGVOYW1lKEZpbGUgZmlsZSwgaW50IG1heExlbmd0aCkgewotCQlTdHJpbmcgYWJzb2x1dGVGaWxlTmFtZSA9IGNhbm9uaWNhbEZpbGUoZmlsZSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWlmIChhYnNvbHV0ZUZpbGVOYW1lLmxlbmd0aCgpIDw9IG1heExlbmd0aCkgewotCQkJLy8gbm8gbmVlZCB0byBzaG9ydGVuCi0JCQlyZXR1cm4gYWJzb2x1dGVGaWxlTmFtZTsKLQkJfQotCi0JCS8vIGJyZWFrIGRvd24gdGhlIHBhdGggaW50byBpdHMgY29tcG9uZW50cwotCQlTdHJpbmcgZnMgPSBGaWxlLnNlcGFyYXRvcjsKLQkJU3RyaW5nW10gcGF0aHMgPSBhYnNvbHV0ZUZpbGVOYW1lLnNwbGl0KCdcXCcgKyBmcyk7Ci0KLQkJaWYgKHBhdGhzLmxlbmd0aCA8PSAxKSB7Ci0JCQkvLyBlLmcuICJDOlwiCi0JCQlyZXR1cm4gcGF0aHNbMF07Ci0JCX0KLQotCQlpZiAocGF0aHMubGVuZ3RoID09IDIpIHsKLQkJCS8vIGUuZy4gIkM6XE15UmVhbGx5TG9uZ0ZpbGVOYW1lLmV4dCIgb3IgIkM6XE15UmVhbGx5TG9uZ0RpcmVjdG9yeU5hbWUiCi0JCQkvLyByZXR1cm4gdGhlIGNvbXBsZXRlIGZpbGUgbmFtZSBzaW5jZSB0aGlzIGlzIGEgbWluaW11bSByZXF1aXJlbWVudCwKLQkJCS8vIHJlZ2FyZGxlc3Mgb2YgdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93ZWQKLQkJCXJldHVybiBhYnNvbHV0ZUZpbGVOYW1lOwotCQl9Ci0KLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZChwYXRoc1swXSk7CQkvLyBhbHdheXMgYWRkIHRoZSBmaXJzdCBkaXJlY3RvcnksIHdoaWNoIGlzIHVzdWFsbHkgdGhlIGRyaXZlIGxldHRlcgotCi0JCS8vIEtlZXAgdGhlIGluZGV4IG9mIGluc2VydGlvbiBpbnRvIHRoZSBzdHJpbmcgYnVmZmVyCi0JCWludCBpbnNlcnRJbmRleCA9IHNiLmxlbmd0aCgpOwotCi0JCXNiLmFwcGVuZChmcyk7Ci0JCXNiLmFwcGVuZChwYXRoc1twYXRocy5sZW5ndGggLSAxXSk7CQkvLyBhcHBlbmQgdGhlIGZpbGUgbmFtZSBvciB0aGUgbGFzdCBkaXJlY3RvcnkKLQotCQltYXhMZW5ndGggLT0gNDsgICAgICAgICAgICAgICAgICAgICAgLy8gLTQgZm9yICIvLi4uIgotCi0JCWludCBjdXJyZW50TGVuZ3RoID0gc2IubGVuZ3RoKCkgLSA0OyAvLyAtNCBmb3IgIi8uLi4iCi0JCWludCBsZWZ0SW5kZXggPSAxOyAgICAgICAgICAgICAgICAgICAvLyAgMSB0byBza2lwIHRoZSByb290IGRpcmVjdG9yeQotCQlpbnQgcmlnaHRJbmRleCA9IHBhdGhzLmxlbmd0aCAtIDI7ICAgLy8gLTEgZm9yIHRoZSBmaWxlIG5hbWUgb3IgdGhlIGxhc3QgZGlyZWN0b3J5Ci0KLQkJYm9vbGVhbiBjYW5BZGRGcm9tTGVmdCA9IHRydWU7Ci0JCWJvb2xlYW4gY2FuQWRkRnJvbVJpZ2h0ID0gdHJ1ZTsKLQotCQkvLyBBZGQgZWFjaCBkaXJlY3RvcnksIHRoZSBpbnNlcnRpb24gaXMgZ29pbmcgaW4gYm90aCBkaXJlY3Rpb246IGxlZnQgYW5kCi0JCS8vIHJpZ2h0LCBvbmNlIGEgc2lkZSBjYW4ndCBiZSBhZGRlZCwgdGhlIG90aGVyIHNpZGUgaXMgc3RpbGwgY29udGludWluZwotCQkvLyB1bnRpbCBib3RoIGNhbid0IGFkZCBhbnltb3JlCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoIWNhbkFkZEZyb21MZWZ0ICYmICFjYW5BZGRGcm9tUmlnaHQpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmIChjYW5BZGRGcm9tUmlnaHQpIHsKLQkJCQlTdHJpbmcgcmlnaHREaXJlY3RvcnkgPSBwYXRoc1tyaWdodEluZGV4XTsKLQkJCQlpbnQgcmlnaHRMZW5ndGggPSByaWdodERpcmVjdG9yeS5sZW5ndGgoKTsKLQotCQkJCS8vIEFkZCB0aGUgZGlyZWN0b3J5IG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBsb29wCi0JCQkJaWYgKGN1cnJlbnRMZW5ndGggKyByaWdodExlbmd0aCArIDEgPD0gbWF4TGVuZ3RoKSB7Ci0JCQkJCXNiLmluc2VydChpbnNlcnRJbmRleCwgICAgIGZzKTsKLQkJCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4ICsgMSwgcmlnaHREaXJlY3RvcnkpOwotCi0JCQkJCWN1cnJlbnRMZW5ndGggKz0gcmlnaHRMZW5ndGggKyAxOwotCQkJCQlyaWdodEluZGV4LS07Ci0KLQkJCQkJLy8gVGhlIHJpZ2h0IHNpZGUgaXMgbm93IG92ZXJsYXBwaW5nIHRoZSBsZWZ0IHNpZGUsIHRoYXQgbWVhbnMKLQkJCQkJLy8gd2UgY2FuJ3QgYWRkIGZyb20gdGhlIHJpZ2h0IHNpZGUgYW55bW9yZQotCQkJCQlpZiAobGVmdEluZGV4ID49IHJpZ2h0SW5kZXgpIHsKLQkJCQkJCWNhbkFkZEZyb21SaWdodCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2FuQWRkRnJvbVJpZ2h0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY2FuQWRkRnJvbUxlZnQpIHsKLQkJCQlTdHJpbmcgbGVmdERpcmVjdG9yeSA9IHBhdGhzW2xlZnRJbmRleF07Ci0JCQkJaW50IGxlZnRMZW5ndGggPSBsZWZ0RGlyZWN0b3J5Lmxlbmd0aCgpOwotCi0JCQkJLy8gQWRkIHRoZSBkaXJlY3Rvcnkgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgbG9vcAotCQkJCWlmIChjdXJyZW50TGVuZ3RoICsgbGVmdExlbmd0aCArIDEgPD0gbWF4TGVuZ3RoKSB7Ci0JCQkJCXNiLmluc2VydChpbnNlcnRJbmRleCwgICAgIGZzKTsKLQkJCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4ICsgMSwgbGVmdERpcmVjdG9yeSk7Ci0KLQkJCQkJaW5zZXJ0SW5kZXggKz0gbGVmdExlbmd0aCArIDE7Ci0JCQkJCWN1cnJlbnRMZW5ndGggKz0gbGVmdExlbmd0aCArIDE7Ci0JCQkJCWxlZnRJbmRleCsrOwotCi0JCQkJCS8vIFRoZSBsZWZ0IHNpZGUgaXMgbm93IG92ZXJsYXBwaW5nIHRoZSByaWdodCBzaWRlLCB0aGF0IG1lYW5zCi0JCQkJCS8vIHdlIGNhbid0IGFkZCBmcm9tIHRoZSBsZWZ0IHNpZGUgYW55bW9yZQotCQkJCQlpZiAobGVmdEluZGV4ID49IHJpZ2h0SW5kZXgpIHsKLQkJCQkJCWNhbkFkZEZyb21MZWZ0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQljYW5BZGRGcm9tTGVmdCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChsZWZ0SW5kZXggPD0gcmlnaHRJbmRleCkgewotCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4LCBmcyk7Ci0JCQlzYi5pbnNlcnQoaW5zZXJ0SW5kZXggKyAxLCAiLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeXN0ZW0gcHJvcGVydGllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHJlcHJlc2VudGluZyB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSB1c2VySG9tZURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKFVTRVJfSE9NRV9ESVJFQ1RPUllfTkFNRSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgcmVwcmVzZW50aW5nIHRoZSB1c2VyJ3MgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgdXNlclRlbXBvcmFyeURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKFVTRVJfVEVNUE9SQVJZX0RJUkVDVE9SWV9OQU1FKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGN1cnJlbnRXb3JraW5nRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEZpbGUoQ1VSUkVOVF9XT1JLSU5HX0RJUkVDVE9SWV9OQU1FKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIG1pc2NlbGxhbmVvdXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIG9ubHkgdGhlIGZpbGVzIHRoYXQgZml0IHRoZSBmaWx0ZXIuCi0JICogRmlsZSNmaWxlcyhGaWxlRmlsdGVyIGZpbGVGaWx0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWx0ZXIoSXRlcmF0b3I8RmlsZT4gZmlsZXMsIGZpbmFsIEZpbGVGaWx0ZXIgZmlsZUZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEZpbGU+KGZpbGVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChGaWxlIG5leHQpIHsKLQkJCQlyZXR1cm4gZmlsZUZpbHRlci5hY2NlcHQobmV4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSB0aGF0IGlzIGEgcmUtc3BlY2lmaWNhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCi0JICogZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogICAgIExpbnV4L1VuaXgvTWFjOgotCSAqICAgICAgICAgY29udmVydFRvUmVsYXRpdmVGaWxlKC9mb28vYmFyL2Jhei5qYXZhLCAvZm9vKQotCSAqICAgICAgICAgICAgID0+IGJhci9iYXouamF2YQotCSAqICAgICBXaW5kb3dzOgotCSAqICAgICAgICAgY29udmVydFRvUmVsYXRpdmVGaWxlKEM6XGZvb1xiYXJcYmF6LmphdmEsIEM6XGZvbykKLQkgKiAgICAgICAgICAgICA9PiBiYXIvYmF6LmphdmEKLQkgKiBUaGUgZmlsZSBjYW4gYmUgZWl0aGVyIGEgZmlsZSBvciBhIGRpcmVjdG9yeTsgdGhlIGRpcmVjdG9yeQotCSAqICpzaG91bGQqIGJlIGEgZGlyZWN0b3J5LgotCSAqIElmIHRoZSBmaWxlIGlzIGFscmVhZHkgcmVsYXRpdmUgb3IgaXQgY2Fubm90IGJlIG1hZGUgcmVsYXRpdmUKLQkgKiB0byB0aGUgZGlyZWN0b3J5LCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiAKLQkgKiBOQjogVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4LAotCSAqIGJ1dCBub3QgTWFjIChidXQgdGhlIE1hYyBpcyBVbml4LWJhc2VkIHRoZXNlIGRheXMsIHNvCi0JICogaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLikuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIEZpbGUgZGlyKSB7Ci0JCS8vIGNoZWNrIHdoZXRoZXIgdGhlIGZpbGUgaXMgYWxyZWFkeSByZWxhdGl2ZQotCQlpZiAoICEgZmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCXJldHVybiBmaWxlOwkJLy8gcmV0dXJuIHVuY2hhbmdlZAotCQl9Ci0KLQkJRmlsZSBjRmlsZSA9IGNhbm9uaWNhbEZpbGUoZmlsZSk7Ci0JCUZpbGUgY0RpciA9IGNhbm9uaWNhbEZpbGUoZGlyKTsKLQotCQkvLyB0aGUgdHdvIGFyZSB0aGUgc2FtZSBkaXJlY3RvcnkKLQkJaWYgKGNGaWxlLmVxdWFscyhjRGlyKSkgewotCQkJcmV0dXJuIG5ldyBGaWxlKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUZpbGVbXSBmaWxlUGF0aEZpbGVzID0gcGF0aEZpbGVzKGNGaWxlKTsKLQkJRmlsZVtdIGRpclBhdGhGaWxlcyA9IHBhdGhGaWxlcyhjRGlyKTsKLQotCQkvLyBXaW5kb3dzIG9ubHkgKD8pOiB0aGUgcm9vdHMgYXJlIGRpZmZlcmVudCAtIGUuZy4gRDpcIHZzLiBDOlwKLQkJaWYgKCAhIGRpclBhdGhGaWxlc1swXS5lcXVhbHMoZmlsZVBhdGhGaWxlc1swXSkpIHsKLQkJCXJldHVybiBmaWxlOwkJLy8gcmV0dXJuIHVuY2hhbmdlZAotCQl9Ci0KLQkJLy8gYXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZSByb290IGlzIHRoZSBzYW1lLCBub3cgZmluZCBob3cgbXVjaCBpcyBpbiBjb21tb24KLQkJaW50IGkgPSAwOwkJLy8gdGhpcyB3aWxsIHBvaW50IGF0IHRoZSBmaXJzdCBtaXNjb21wYXJlCi0JCXdoaWxlICgoaSA8IGRpclBhdGhGaWxlcy5sZW5ndGgpICYmIChpIDwgZmlsZVBhdGhGaWxlcy5sZW5ndGgpKSB7Ci0JCQlpZiAoZGlyUGF0aEZpbGVzW2ldLmVxdWFscyhmaWxlUGF0aEZpbGVzW2ldKSkgewotCQkJCWkrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gc2F2ZSBvdXIgY3VycmVudCBwb3NpdGlvbgotCQlpbnQgZmlyc3RNaXNtYXRjaCA9IGk7Ci0KLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBBQk9WRSB0aGUgZGlyZWN0b3J5OiAuLi8uLgotCQlpZiAoZmlyc3RNaXNtYXRjaCA9PSBmaWxlUGF0aEZpbGVzLmxlbmd0aCkgewotCQkJcmV0dXJuIHJlbGF0aXZlUGFyZW50RmlsZShkaXJQYXRoRmlsZXMubGVuZ3RoIC0gZmlyc3RNaXNtYXRjaCk7Ci0JCX0KLQotCQkvLyBidWlsZCBhIG5ldyBmaWxlIGZyb20gdGhlIHBhdGggYmV5b25kIHRoZSBtYXRjaGluZyBwb3J0aW9ucwotCQlGaWxlIGRpZmYgPSBuZXcgRmlsZShmaWxlUGF0aEZpbGVzW2ldLmdldE5hbWUoKSk7Ci0JCXdoaWxlICgrK2kgPCBmaWxlUGF0aEZpbGVzLmxlbmd0aCkgewotCQkJZGlmZiA9IG5ldyBGaWxlKGRpZmYsIGZpbGVQYXRoRmlsZXNbaV0uZ2V0TmFtZSgpKTsKLQkJfQotCi0JCS8vIGNoZWNrIHdoZXRoZXIgdGhlIGZpbGUgaXMgQkVMT1cgdGhlIGRpcmVjdG9yeTogc3ViZGlyMS9zdWJkaXIyL2ZpbGUuZXh0Ci0JCWlmIChmaXJzdE1pc21hdGNoID09IGRpclBhdGhGaWxlcy5sZW5ndGgpIHsKLQkJCXJldHVybiBkaWZmOwotCQl9Ci0KLQkJLy8gdGhlIGZpbGUgbXVzdCBiZSBhIFBFRVIgb2YgdGhlIGRpcmVjdG9yeTogLi4vLi4vc3ViZGlyMS9zdWJkaXIyL2ZpbGUuZXh0Ci0JCXJldHVybiBuZXcgRmlsZShyZWxhdGl2ZVBhcmVudEZpbGUoZGlyUGF0aEZpbGVzLmxlbmd0aCAtIGZpcnN0TWlzbWF0Y2gpLCBkaWZmLmdldFBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSB0aGF0IGlzIGEgcmUtc3BlY2lmaWNhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCi0JICogZmlsZSwgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi0JICogICAgIExpbnV4L1VuaXgvTWFjIChDV0QgPSAvZm9vKToKLQkgKiAgICAgICAgIGNvbnZlcnRUb1JlbGF0aXZlRmlsZSgvZm9vL2Jhci9iYXouamF2YSkKLQkgKiAgICAgICAgICAgICA9PiBiYXIvYmF6LmphdmEKLQkgKiAgICAgV2luZG93cyAoQ1dEID0gQzpcZm9vKToKLQkgKiAgICAgICAgIGNvbnZlcnRUb1JlbGF0aXZlRmlsZShDOlxmb29cYmFyXGJhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IGJhci9iYXouamF2YQotCSAqIFRoZSBmaWxlIGNhbiBiZSBlaXRoZXIgYSBmaWxlIG9yIGEgZGlyZWN0b3J5LgotCSAqIElmIHRoZSBmaWxlIGlzIGFscmVhZHkgcmVsYXRpdmUgb3IgaXQgY2Fubm90IGJlIG1hZGUgcmVsYXRpdmUKLQkgKiB0byB0aGUgZGlyZWN0b3J5LCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiAKLQkgKiBOQjogVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4LAotCSAqIGJ1dCBub3QgTWFjIChidXQgdGhlIE1hYyBpcyBVbml4LWJhc2VkIHRoZXNlIGRheXMsIHNvCi0JICogaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLikuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaW5hbCBGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBjdXJyZW50V29ya2luZ0RpcmVjdG9yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZmlsZXMgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLiBGb3IgZXhhbXBsZToKLQkgKiAgICAgQzovZm9vL2Jhci9iYXoudHh0ID0+Ci0JICogICAgIHsgQzovLCBDOi9mb28sIEM6L2Zvby9iYXIsIEM6L2Zvby9iYXIvYmF6LnR4dCB9Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZVtdIHBhdGhGaWxlcyhGaWxlIGZpbGUpIHsKLQkJTGlzdDxGaWxlPiBwYXRoID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotCQlmb3IgKEZpbGUgZiA9IGZpbGU7IGYgIT0gbnVsbDsgZiA9IGYuZ2V0UGFyZW50RmlsZSgpKSB7Ci0JCQlwYXRoLmFkZChmKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHBhdGgpOwotCQlyZXR1cm4gcGF0aC50b0FycmF5KG5ldyBGaWxlW3BhdGguc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgKG5vbi16ZXJvKSBudW1iZXIgb2YgcmVsYXRpdmUKLQkgKiBmaWxlIG5hbWVzLCBlLmcuIHh4eCgzKSA9PiAuLi8uLi8uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEZpbGUgcmVsYXRpdmVQYXJlbnRGaWxlKGludCBsZW4pIHsKLQkJaWYgKGxlbiA8PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybzogIiArIGxlbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKCIuLiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSBsZW4gLSAxOyBpLS0gPiAwOyApIHsKLQkJCXJlc3VsdCA9IG5ldyBGaWxlKHJlc3VsdCwgIi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgdGhhdCBpcyBhIHJlLXNwZWNpZmljYXRpb24gb2YgdGhlIHNwZWNpZmllZAotCSAqIGZpbGUsIGFic29sdXRlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqICAgICBMaW51eC9Vbml4L01hYzoKLQkgKiAgICAgICAgIGNvbnZlcnRUb0Fic29sdXRlRmlsZShiYXIvYmF6LmphdmEsIC9mb28pCi0JICogICAgICAgICAgICAgPT4gL2Zvby9iYXIvYmF6LmphdmEKLQkgKiAgICAgV2luZG93czoKLQkgKiAgICAgICAgIGNvbnZlcnRUb0Fic29sdXRlRmlsZShiYXIvYmF6LmphdmEsIEM6XGZvbykKLQkgKiAgICAgICAgICAgICA9PiBDOlxmb29cYmFyXGJhei5qYXZhCi0JICogVGhlIGZpbGUgY2FuIGJlIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3Rvcnk7IHRoZSBkaXJlY3RvcnkKLQkgKiAqc2hvdWxkKiBiZSBhIGRpcmVjdG9yeS4KLQkgKiBJZiB0aGUgZmlsZSBpcyBhbHJlYWR5IGFic29sdXRlLCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiAKLQkgKiBOQjogVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4LAotCSAqIGJ1dCBub3QgTWFjIChidXQgdGhlIE1hYyBpcyBVbml4LWJhc2VkIHRoZXNlIGRheXMsIHNvCi0JICogaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLikuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0Fic29sdXRlRmlsZShmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIEZpbGUgZGlyKSB7Ci0JCS8vIGNoZWNrIHdoZXRoZXIgdGhlIGZpbGUgaXMgYWxyZWFkeSBhYnNvbHV0ZQotCQlpZiAoZmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCXJldHVybiBmaWxlOwkJLy8gcmV0dXJuIHVuY2hhbmdlZAotCQl9Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlKG5ldyBGaWxlKGRpciwgZmlsZS5nZXRQYXRoKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHRoYXQgaXMgYSByZS1zcGVjaWZpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLCBhYnNvbHV0ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLQkgKiAgICAgTGludXgvVW5peC9NYWMgKENXRCA9IC9mb28pOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSkKLQkgKiAgICAgICAgICAgICA9PiAvZm9vL2Jhci9iYXouamF2YQotCSAqICAgICBXaW5kb3dzIChDV0QgPSBDOlxmb28pOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSkKLQkgKiAgICAgICAgICAgICA9PiBDOlxmb29cYmFyXGJhei5qYXZhCi0JICogVGhlIGZpbGUgY2FuIGJlIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuCi0JICogSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSBhYnNvbHV0ZSwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogCi0JICogTkI6IFRoaXMgbWV0aG9kIGhhcyBiZWVuIHRlc3RlZCBvbiBXaW5kb3dzIGFuZCBMaW51eCwKLQkgKiBidXQgbm90IE1hYyAoYnV0IHRoZSBNYWMgaXMgVW5peC1iYXNlZCB0aGVzZSBkYXlzLCBzbwotCSAqIGl0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0uLi4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmluYWwgRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgY3VycmVudFdvcmtpbmdEaXJlY3RvcnkoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBGaWxlVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0hhc2hCYWcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9IYXNoQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZTYxNDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0hhc2hCYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgQmFnfSBpbnRlcmZhY2UsIGJhY2tlZCBieSBhCi0gKiBoYXNoIHRhYmxlLiBJdCBtYWtlcyBubyBndWFyYW50ZWVzIGFzIHRvIHRoZSBpdGVyYXRpb24gb3JkZXIgb2YKLSAqIHRoZSBiYWcncyBlbGVtZW50czsgaW4gcGFydGljdWxhciwgaXQgZG9lcyBub3QgZ3VhcmFudGVlIHRoZSBvcmRlcgotICogd2lsbCByZW1haW4gY29uc3RhbnQgb3ZlciB0aW1lLiBUaGlzIGNsYXNzIHBlcm1pdHMgdGhlIDxjb2RlPm51bGw8L2NvZGU+Ci0gKiBlbGVtZW50LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG9mZmVycyBjb25zdGFudCB0aW1lIHBlcmZvcm1hbmNlIGZvciB0aGUgYmFzaWMgb3BlcmF0aW9ucwotICogKDxjb2RlPmFkZDwvY29kZT4sIDxjb2RlPnJlbW92ZTwvY29kZT4sIDxjb2RlPmNvbnRhaW5zPC9jb2RlPiBhbmQKLSAqIDxjb2RlPnNpemU8L2NvZGU+KSwgYXNzdW1pbmcgdGhlIGhhc2ggZnVuY3Rpb24gZGlzcGVyc2VzIHRoZSBlbGVtZW50cwotICogcHJvcGVybHkgYW1vbmcgdGhlIGJ1Y2tldHMuIEl0ZXJhdGluZyBvdmVyIHRoaXMgYmFnIHJlcXVpcmVzIHRpbWUKLSAqIHByb3BvcnRpb25hbCB0byB0aGUgc3VtIG9mIHRoZSBiYWcncyBzaXplICh0aGUgbnVtYmVyIG9mIGVsZW1lbnRzKSBwbHVzIHRoZQotICogImNhcGFjaXR5IiBvZiB0aGUgYmFja2luZyBoYXNoIHRhYmxlICh0aGUgbnVtYmVyIG9mIGJ1Y2tldHMpLiBUaHVzLCBpdCBpcwotICogaW1wb3J0YW50IG5vdCB0byBzZXQgdGhlIGluaXRpYWwgY2FwYWNpdHkgdG9vIGhpZ2ggKG9yIHRoZSBsb2FkIGZhY3RvciB0b28KLSAqIGxvdykgaWYgaXRlcmF0aW9uIHBlcmZvcm1hbmNlIGlzIGltcG9ydGFudC4KLSAqIDxwPgotICogPHN0cm9uZz5Ob3RlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3Qgc3luY2hyb25pemVkLjwvc3Ryb25nPiBJZiBtdWx0aXBsZQotICogdGhyZWFkcyBhY2Nlc3MgYSBiYWcgY29uY3VycmVudGx5LCBhbmQgYXQgbGVhc3Qgb25lIG9mIHRoZSB0aHJlYWRzIG1vZGlmaWVzCi0gKiB0aGUgYmFnLCBpdCA8ZW0+bXVzdDwvZW0+IGJlIHN5bmNocm9uaXplZCBleHRlcm5hbGx5LiBUaGlzIGlzIHR5cGljYWxseQotICogYWNjb21wbGlzaGVkIGJ5IHN5bmNocm9uaXppbmcgb24gc29tZSBvYmplY3QgdGhhdCBuYXR1cmFsbHkgZW5jYXBzdWxhdGVzCi0gKiB0aGUgYmFnLiBJZiBubyBzdWNoIG9iamVjdCBleGlzdHMsIHRoZSBiYWcgc2hvdWxkIGJlICJ3cmFwcGVkIiB1c2luZyB0aGUKLSAqIDxjb2RlPkNvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb248L2NvZGU+IG1ldGhvZC4gVGhpcyBpcwotICogYmVzdCBkb25lIGF0IGNyZWF0aW9uIHRpbWUsIHRvIHByZXZlbnQgYWNjaWRlbnRhbCB1bnN5bmNocm9uaXplZCBhY2Nlc3MKLSAqIHRvIHRoZSBiYWc6Ci0gKiA8cHJlPgotICogQ29sbGVjdGlvbiBjID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkQ29sbGVjdGlvbihuZXcgSGFzaEJhZyguLi4pKTsKLSAqIDwvcHJlPgotICogPHA+Ci0gKiBUaGUgaXRlcmF0b3JzIHJldHVybmVkIGJ5IHRoaXMgY2xhc3MncyA8Y29kZT5pdGVyYXRvcjwvY29kZT4gbWV0aG9kIGFyZQotICogPGVtPmZhaWwtZmFzdDwvZW0+OiBpZiB0aGUgYmFnIGlzIG1vZGlmaWVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBpdGVyYXRvciBpcwotICogY3JlYXRlZCwgaW4gYW55IHdheSBleGNlcHQgdGhyb3VnaCB0aGUgaXRlcmF0b3IncyBvd24gPGNvZGU+cmVtb3ZlPC9jb2RlPgotICogbWV0aG9kLCB0aGUgaXRlcmF0b3IgdGhyb3dzIGEge0BsaW5rIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb259LgotICogVGh1cywgaW4gdGhlIGZhY2Ugb2YgY29uY3VycmVudCBtb2RpZmljYXRpb24sIHRoZSBpdGVyYXRvciBmYWlscyBxdWlja2x5Ci0gKiBhbmQgY2xlYW5seSwgcmF0aGVyIHRoYW4gcmlza2luZyBhcmJpdHJhcnksIG5vbi1kZXRlcm1pbmlzdGljIGJlaGF2aW9yIGF0Ci0gKiBhbiB1bmRldGVybWluZWQgdGltZSBpbiB0aGUgZnV0dXJlLgotICogPHA+Ci0gKiBOb3RlIHRoYXQgdGhlIGZhaWwtZmFzdCBiZWhhdmlvciBvZiBhbiBpdGVyYXRvciBjYW5ub3QgYmUgZ3VhcmFudGVlZAotICogYXMgaXQgaXMsIGdlbmVyYWxseSBzcGVha2luZywgaW1wb3NzaWJsZSB0byBtYWtlIGFueSBoYXJkIGd1YXJhbnRlZXMgaW4gdGhlCi0gKiBwcmVzZW5jZSBvZiB1bnN5bmNocm9uaXplZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbi4gRmFpbC1mYXN0IGl0ZXJhdG9ycwotICogdGhyb3cgPGNvZGU+Q29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjwvY29kZT4gb24gYSBiZXN0LWVmZm9ydCBiYXNpcy4KLSAqIFRoZXJlZm9yZSwgaXQgd291bGQgYmUgd3JvbmcgdG8gd3JpdGUgYSBwcm9ncmFtIHRoYXQgZGVwZW5kZWQgb24gdGhpcwotICogZXhjZXB0aW9uIGZvciBpdHMgY29ycmVjdG5lc3M6IDxlbT50aGUgZmFpbC1mYXN0IGJlaGF2aW9yIG9mIGl0ZXJhdG9ycwotICogc2hvdWxkIGJlIHVzZWQgb25seSB0byBkZXRlY3QgYnVncy48L2VtPgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIG1haW50YWluZWQgYnkgdGhlIGJhZwotICogCi0gKiBAc2VlIENvbGxlY3Rpb24KLSAqIEBzZWUgQmFnCi0gKiBAc2VlIFN5bmNocm9uaXplZEJhZwotICogQHNlZQlDb2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRDb2xsZWN0aW9uKENvbGxlY3Rpb24pCi0gKiBAc2VlIElkZW50aXR5SGFzaEJhZwotICovCi1wdWJsaWMgY2xhc3MgSGFzaEJhZzxFPgotCWV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uPEU+Ci0JaW1wbGVtZW50cyBCYWc8RT4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIFRoZSBoYXNoIHRhYmxlLiBSZXNpemVkIGFzIG5lY2Vzc2FyeS4gTGVuZ3RoIE1VU1QgQWx3YXlzIGJlIGEgcG93ZXIgb2YgdHdvLiAqLwotCXRyYW5zaWVudCBFbnRyeTxFPltdIHRhYmxlOwotCi0JLyoqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgYmFnLiAqLwotCXRyYW5zaWVudCBpbnQgc2l6ZSA9IDA7Ci0KLQkvKiogVGhlIG51bWJlciBvZiBVTklRVUUgZW50cmllcyBpbiB0aGUgYmFnLiAqLwotCXRyYW5zaWVudCBpbnQgdW5pcXVlQ291bnQgPSAwOwotCi0JLyoqCi0JICogVGhlIGhhc2ggdGFibGUgaXMgcmVoYXNoZWQgd2hlbiBpdHMgc2l6ZSBleGNlZWRzIHRoaXMgdGhyZXNob2xkLiAoVGhlCi0JICogdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyA8Y29kZT4oaW50KSAoY2FwYWNpdHkgKiBsb2FkRmFjdG9yKTwvY29kZT4uKQotCSAqCi0JICogQHNlcmlhbAotCSAqLwotCXByaXZhdGUgaW50IHRocmVzaG9sZDsKLQotCS8qKgotCSAqIFRoZSBsb2FkIGZhY3RvciBmb3IgdGhlIGhhc2ggdGFibGUuCi0JICoKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBmbG9hdCBsb2FkRmFjdG9yOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGJhZyBoYXMgYmVlbiBzdHJ1Y3R1cmFsbHkgbW9kaWZpZWQuCi0JICogU3RydWN0dXJhbCBtb2RpZmljYXRpb25zIGFyZSB0aG9zZSB0aGF0IGNoYW5nZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KLQkgKiB0aGUgYmFnIG9yIG90aGVyd2lzZSBtb2RpZnkgaXRzIGludGVybmFsIHN0cnVjdHVyZSAoZS5nLiByZWhhc2gpLgotCSAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBtYWtlIGl0ZXJhdG9ycyBvbiB0aGlzIGJhZyBmYWlsLWZhc3QuCi0JICoKLQkgKiBAc2VlIGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JICovCi0JdHJhbnNpZW50IGludCBtb2RDb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpbml0aWFsIGNhcGFjaXR5IC0gTVVTVCBiZSBhIHBvd2VyIG9mIHR3by4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTklUSUFMX0NBUEFDSVRZID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgbWF4aW11bSBjYXBhY2l0eSwgdXNlZCBpZiBhIGhpZ2hlciB2YWx1ZSBpcyBpbXBsaWNpdGx5IHNwZWNpZmllZAotCSAqIGJ5IGVpdGhlciBvZiB0aGUgY29uc3RydWN0b3JzIHdpdGggYXJndW1lbnRzLgotCSAqIE1VU1QgYmUgYSBwb3dlciBvZiB0d28gPD0gKDEgPDwgMzApLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX0NBUEFDSVRZID0gMSA8PCAzMDsKLQotCS8qKgotCSAqIFRoZSBsb2FkIGZhY3RvciB1c2VkIHdoZW4gbm9uZSBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9MT0FEX0ZBQ1RPUiA9IDAuNzVmOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBiYWcgd2l0aCB0aGUKLQkgKiBkZWZhdWx0IGNhcGFjaXR5LCB3aGljaCBpcyAxNiwgYW5kIGxvYWQgZmFjdG9yLCB3aGljaCBpcyAwLjc1LgotCSAqLwotCXB1YmxpYyBIYXNoQmFnKCkgewotCQl0aGlzKERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBiYWcgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkKLQkgKiBhbmQgdGhlIGRlZmF1bHQgbG9hZCBmYWN0b3IsIHdoaWNoIGlzIDAuNzUuCi0JICoKLQkgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcwotCSAqICAgICB0aGFuIHplcm8KLQkgKi8KLQlwdWJsaWMgSGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCXRoaXMoaW5pdGlhbENhcGFjaXR5LCBERUZBVUxUX0xPQURfRkFDVE9SLCBmYWxzZSk7ICAvLyBmYWxzZSA9IGRvIG5vdCB2YWxpZGF0ZSBwYXJtcwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgYmFnIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLgotCSAqCi0JICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eQotCSAqIEBwYXJhbSBsb2FkRmFjdG9yIHRoZSBsb2FkIGZhY3RvcgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIGxlc3MKLQkgKiAgICAgdGhhbiB6ZXJvIG9yIGlmIHRoZSBsb2FkIGZhY3RvciBpcyBub24tcG9zaXRpdmUKLQkgKi8KLQlwdWJsaWMgSGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7Ci0JCXRoaXMoaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yLCB0cnVlKTsgIC8vIHRydWUgPSB2YWxpZGF0ZSBwYXJtcwotCX0KLQotCXByaXZhdGUgSGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yLCBib29sZWFuIHZhbGlkYXRlUGFybXMpIHsKLQkJc3VwZXIoKTsKLQkJaW50IGNhcGFjaXR5ID0gaW5pdGlhbENhcGFjaXR5OwotCQlpZiAodmFsaWRhdGVQYXJtcykgewotCQkJaWYgKGNhcGFjaXR5IDwgMCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgSW5pdGlhbCBDYXBhY2l0eTogIiArIGNhcGFjaXR5KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGNhcGFjaXR5ID4gTUFYSU1VTV9DQVBBQ0lUWSkgewotCQkJCWNhcGFjaXR5ID0gTUFYSU1VTV9DQVBBQ0lUWTsKLQkJCX0KLQkJCWlmIChsb2FkRmFjdG9yIDw9IDAgfHwgRmxvYXQuaXNOYU4obG9hZEZhY3RvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIExvYWQgZmFjdG9yOiAiICsgbG9hZEZhY3Rvcik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkKLQkJCS8vIGZpbmQgYSBwb3dlciBvZiAyID49ICdpbml0aWFsQ2FwYWNpdHknCi0JCQljYXBhY2l0eSA9IDE7Ci0JCQl3aGlsZSAoY2FwYWNpdHkgPCBpbml0aWFsQ2FwYWNpdHkpIHsKLQkJCQljYXBhY2l0eSA8PD0gMTsKLQkJCX0KLQkJfQotCi0JCXRoaXMubG9hZEZhY3RvciA9IGxvYWRGYWN0b3I7Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUoY2FwYWNpdHkpOwotCQl0aGlzLnRocmVzaG9sZCA9IChpbnQpIChjYXBhY2l0eSAqIGxvYWRGYWN0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBiYWcgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGNvbGxlY3Rpb24uIFRoZSBiYWcncyBsb2FkIGZhY3RvciB3aWxsIGJlIHRoZSBkZWZhdWx0LCB3aGljaCBpcyAwLjc1LAotCSAqIGFuZCBpdHMgaW5pdGlhbCBjYXBhY2l0eSB3aWxsIGJlIHN1ZmZpY2llbnQgdG8gaG9sZCBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjIHRoZSBjb2xsZWN0aW9uIHdob3NlIGVsZW1lbnRzIGFyZSB0byBiZSBwbGFjZWQgaW50byB0aGlzIGJhZy4KLQkgKi8KLQlwdWJsaWMgSGFzaEJhZyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXRoaXMoTWF0aC5tYXgoKGludCkgKGMuc2l6ZSgpIC8gREVGQVVMVF9MT0FEX0ZBQ1RPUikgKyAxLCBERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFkpLCBERUZBVUxUX0xPQURfRkFDVE9SKTsKLQkJdGhpcy5hZGRBbGxfKGMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGhhc2ggZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgaW50IGhhc2goT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChvID09IG51bGwpID8gMCA6IHRoaXMudHdlYWtIYXNoKG8uaGFzaENvZGUoKSk7Ci0JfQotCi0JLyoqCi0JICogVHdlYWsgdGhlIHNwZWNpZmllZCBoYXNoLCB0byBkZWZlbmQgYWdhaW5zdCBwb29yIGltcGxlbWVudGF0aW9ucwotCSAqIG9mIHtAbGluayBPYmplY3QjaGFzaENvZGUoKX0uCi0JICovCi0JcHJpdmF0ZSBpbnQgdHdlYWtIYXNoKGludCBoKSB7Ci0JCWggXj0gKGggPj4+IDIwKSBeIChoID4+PiAxMik7Ci0JCXJldHVybiBoIF4gKGggPj4+IDcpIF4gKGggPj4+IDQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgaGFzaC4KLQkgKi8KLQlwcml2YXRlIGludCBpbmRleChpbnQgaGFzaCkgewotCQlyZXR1cm4gdGhpcy5pbmRleChoYXNoLCB0aGlzLnRhYmxlLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBmb3IgdGhlIHNwZWNpZmllZCBoYXNoCi0JICogd2l0aGluIGEgdGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlpbnQgaW5kZXgoaW50IGhhc2gsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGhhc2ggJiAobGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwge0BsaW5rICNhZGRBbGwoQ29sbGVjdGlvbil9IGZvciBjb25zdHJ1Y3Rpb24gYW5kIGNsb25pbmcuCi0JICogKE5vIGNoZWNrIGZvciByZS1oYXNoOyBubyBjaGFuZ2UgdG8gbW9kIGNvdW50OyBubyByZXR1cm4gdmFsdWUuKQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRBbGxfKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCWZvciAoRSBlIDogYykgewotCQkJdGhpcy5hZGRfKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwge0BsaW5rICNhZGQoT2JqZWN0KX0gZm9yIGNvbnN0cnVjdGlvbiBhbmQgY2xvbmluZy4KLQkgKiAoTm8gY2hlY2sgZm9yIHJlLWhhc2g7IG5vIGNoYW5nZSB0byBtb2QgY291bnQ7IG5vIHJldHVybiB2YWx1ZS4pCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZF8oRSBvKSB7Ci0JCXRoaXMuYWRkXyhvLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCB7QGxpbmsgI2FkZChPYmplY3QsIGludCl9IGZvciBjb25zdHJ1Y3Rpb24sIGNsb25pbmcsIGFuZCBzZXJpYWxpemF0aW9uLgotCSAqIChObyBjaGVjayBmb3IgcmUtaGFzaDsgbm8gY2hhbmdlIHRvIG1vZCBjb3VudDsgbm8gcmV0dXJuIHZhbHVlLikKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkXyhFIG8sIGludCBjbnQpIHsKLQkJaW50IGhhc2ggPSB0aGlzLmhhc2gobyk7Ci0JCWludCBpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7Ci0JCWZvciAoRW50cnk8RT4gZSA9IHRoaXMudGFibGVbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCU9iamVjdCBlbzsKLQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmICgoKGVvID0gZS5vYmplY3QpID09IG8pIHx8ICgobyAhPSBudWxsKSAmJiBvLmVxdWFscyhlbykpKSkgewotCQkJCWUuY291bnQgKz0gY250OwotCQkJCXRoaXMuc2l6ZSArPSBjbnQ7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIHRoZSBuZXcgZW50cnkgYW5kIHB1dCBpdCBpbiB0aGUgdGFibGUKLQkJRW50cnk8RT4gZSA9IHRoaXMuYnVpbGRFbnRyeShoYXNoLCBvLCBjbnQsIHRoaXMudGFibGVbaW5kZXhdKTsKLQkJdGhpcy50YWJsZVtpbmRleF0gPSBlOwotCQl0aGlzLnNpemUgKz0gY250OwotCQl0aGlzLnVuaXF1ZUNvdW50Kys7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUgbWFpbnRhaW5lZCBzaXplLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSBjb21wYXJlcyB0aGUgbWFpbnRhaW5lZCBzaXplIHRvIHplcm8uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFNlYXJjaCBmb3IgdGhlIG9iamVjdCdzIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHJpdmF0ZSBFbnRyeTxFPiBnZXRFbnRyeShPYmplY3QgbykgewotCQlpbnQgaGFzaCA9IHRoaXMuaGFzaChvKTsKLQkJZm9yIChFbnRyeTxFPiBlID0gdGhpcy50YWJsZVt0aGlzLmluZGV4KGhhc2gpXTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQlPYmplY3QgZW87Ci0JCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiAoKChlbyA9IGUub2JqZWN0KSA9PSBvKSB8fCAoKG8gIT0gbnVsbCkgJiYgby5lcXVhbHMoZW8pKSkpIHsKLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRyeShvKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgY291bnQoT2JqZWN0IG8pIHsKLQkJRW50cnk8RT4gZSA9IHRoaXMuZ2V0RW50cnkobyk7Ci0JCXJldHVybiAoZSA9PSBudWxsKSA/IDAgOiBlLmNvdW50OwotCX0KLQotCS8qKgotCSAqIFJlaGFzaCB0aGUgY29udGVudHMgb2YgdGhlIGJhZyBpbnRvIGEgbmV3IGhhc2ggdGFibGUKLQkgKiB3aXRoIGEgbGFyZ2VyIGNhcGFjaXR5LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUKLQkgKiBudW1iZXIgb2YgZGlmZmVyZW50IGVsZW1lbnRzIGluIHRoZSBiYWcgZXhjZWVkcyBpdHMKLQkgKiBjYXBhY2l0eSBhbmQgbG9hZCBmYWN0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKLQkJRW50cnk8RT5bXSBvbGRUYWJsZSA9IHRoaXMudGFibGU7Ci0JCWludCBvbGRDYXBhY2l0eSA9IG9sZFRhYmxlLmxlbmd0aDsKLQotCQlpZiAob2xkQ2FwYWNpdHkgPT0gTUFYSU1VTV9DQVBBQ0lUWSkgewotCQkJdGhpcy50aHJlc2hvbGQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBuZXdDYXBhY2l0eSA9IDIgKiBvbGRDYXBhY2l0eTsKLQkJRW50cnk8RT5bXSBuZXdUYWJsZSA9IHRoaXMuYnVpbGRUYWJsZShuZXdDYXBhY2l0eSk7Ci0KLQkJZm9yIChpbnQgaSA9IG9sZENhcGFjaXR5OyBpLS0gPiAwOyApIHsKLQkJCWZvciAoRW50cnk8RT4gb2xkID0gb2xkVGFibGVbaV07IG9sZCAhPSBudWxsOyApIHsKLQkJCQlFbnRyeTxFPiBlID0gb2xkOwotCQkJCW9sZCA9IG9sZC5uZXh0OwotCi0JCQkJaW50IGluZGV4ID0gdGhpcy5pbmRleChlLmhhc2gsIG5ld0NhcGFjaXR5KTsKLQkJCQllLm5leHQgPSBuZXdUYWJsZVtpbmRleF07Ci0JCQkJbmV3VGFibGVbaW5kZXhdID0gZTsKLQkJCX0KLQkJfQotCi0JCXRoaXMudGFibGUgPSBuZXdUYWJsZTsKLQkJdGhpcy50aHJlc2hvbGQgPSAoaW50KSAobmV3Q2FwYWNpdHkgKiB0aGlzLmxvYWRGYWN0b3IpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEVudHJ5PEU+W10gYnVpbGRUYWJsZShpbnQgY2FwYWNpdHkpIHsKLQkJcmV0dXJuIG5ldyBFbnRyeVtjYXBhY2l0eV07Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIHRoaXMuYWRkKG8sIDEpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvLCBpbnQgY250KSB7Ci0JCWlmIChjbnQgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRoaXMubW9kQ291bnQrKzsKLQkJaW50IGhhc2ggPSB0aGlzLmhhc2gobyk7Ci0JCWludCBpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7Ci0KLQkJLy8gaWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGluIHRoZSBiYWcsIHNpbXBseSBidW1wIGl0cyBjb3VudAotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQlPYmplY3QgZW87Ci0JCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiAoKChlbyA9IGUub2JqZWN0KSA9PSBvKSB8fCAoKG8gIT0gbnVsbCkgJiYgby5lcXVhbHMoZW8pKSkpIHsKLQkJCQllLmNvdW50ICs9IGNudDsKLQkJCQl0aGlzLnNpemUgKz0gY250OwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVoYXNoIHRoZSB0YWJsZSBpZiB3ZSBhcmUgZ29pbmcgdG8gZXhjZWVkIHRoZSB0aHJlc2hvbGQKLQkJaWYgKHRoaXMudW5pcXVlQ291bnQgPj0gdGhpcy50aHJlc2hvbGQpIHsKLQkJCXRoaXMucmVoYXNoKCk7Ci0JCQlpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7ICAvLyBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGUgaW5kZXgKLQkJfQotCi0JCS8vIGNyZWF0ZSB0aGUgbmV3IGVudHJ5IGFuZCBwdXQgaXQgaW4gdGhlIHRhYmxlCi0JCUVudHJ5PEU+IGUgPSB0aGlzLmJ1aWxkRW50cnkoaGFzaCwgbywgY250LCB0aGlzLnRhYmxlW2luZGV4XSk7Ci0JCXRoaXMudGFibGVbaW5kZXhdID0gZTsKLQkJdGhpcy5zaXplICs9IGNudDsKLQkJdGhpcy51bmlxdWVDb3VudCsrOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9ICkKLQlwcml2YXRlIEVudHJ5PEU+IGJ1aWxkRW50cnkoaW50IGhhc2gsIE9iamVjdCBvLCBpbnQgY250LCBFbnRyeSBuZXh0KSB7Ci0JCXJldHVybiBuZXcgRW50cnk8RT4oaGFzaCwgKEUpIG8sIGNudCwgKEVudHJ5PEU+KSBuZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZShvLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvLCBpbnQgY250KSB7Ci0JCWlmIChjbnQgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBoYXNoID0gdGhpcy5oYXNoKG8pOwotCQlpbnQgaW5kZXggPSB0aGlzLmluZGV4KGhhc2gpOwotCi0JCWZvciAoRW50cnk8RT4gZSA9IHRoaXMudGFibGVbaW5kZXhdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJT2JqZWN0IGVvOwotCQkJaWYgKChlLmhhc2ggPT0gaGFzaCkgJiYgKCgoZW8gPSBlLm9iamVjdCkgPT0gbykgfHwgKChvICE9IG51bGwpICYmIG8uZXF1YWxzKGVvKSkpKSB7Ci0JCQkJdGhpcy5tb2RDb3VudCsrOwotCQkJCWNudCA9IChjbnQgPCBlLmNvdW50KSA/IGNudCA6IGUuY291bnQ7Ci0JCQkJZS5jb3VudCAtPSBjbnQ7Ci0JCQkJLy8gaWYgd2UgYXJlIHJlbW92aW5nIHRoZSBsYXN0IGVsZW1lbnQocyksIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCXRoaXMudGFibGVbaW5kZXhdID0gZS5uZXh0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQl9Ci0JCQkJCXRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQl9Ci0JCQkJdGhpcy5zaXplIC09IGNudDsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSBjbGVhcnMgb3V0IGFsbCBvZiB0aGUgaGFzaCB0YWJsZSBidWNrZXRzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCXRoaXMubW9kQ291bnQrKzsKLQkJZm9yIChpbnQgaSA9IHRhYi5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJdGFiW2ldID0gbnVsbDsKLQkJfQotCQl0aGlzLnNpemUgPSAwOwotCQl0aGlzLnVuaXF1ZUNvdW50ID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgYmFnOiB0aGUgZWxlbWVudHMKLQkgKiB0aGVtc2VsdmVzIGFyZSBub3QgY2xvbmVkLgotCSAqCi0JICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIGJhZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSGFzaEJhZzxFPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJSGFzaEJhZzxFPiBjbG9uZSA9IChIYXNoQmFnPEU+KSBzdXBlci5jbG9uZSgpOwotCQkJY2xvbmUudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUodGhpcy50YWJsZS5sZW5ndGgpOwotCQkJY2xvbmUuc2l6ZSA9IDA7Ci0JCQljbG9uZS51bmlxdWVDb3VudCA9IDA7Ci0JCQljbG9uZS5tb2RDb3VudCA9IDA7Ci0JCQljbG9uZS5hZGRBbGxfKHRoaXMpOwotCQkJcmV0dXJuIGNsb25lOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBIYXNoIHRhYmxlIGNvbGxpc2lvbiBsaXN0IGVudHJ5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVudHJ5PEU+IGltcGxlbWVudHMgQmFnLkVudHJ5PEU+IHsKLQkJZmluYWwgaW50IGhhc2g7Ci0JCWZpbmFsIEUgb2JqZWN0OwotCQlpbnQgY291bnQ7Ci0JCUVudHJ5PEU+IG5leHQ7Ci0KLQkJRW50cnkoaW50IGhhc2gsIEUgb2JqZWN0LCBpbnQgY291bnQsIEVudHJ5PEU+IG5leHQpIHsKLQkJCXRoaXMuaGFzaCA9IGhhc2g7Ci0JCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJCXRoaXMubmV4dCA9IG5leHQ7Ci0JCX0KLQotCQkvLyAqKioqKiBCYWcuRW50cnkgaW1wbGVtZW50YXRpb24KLQkJcHVibGljIEUgZ2V0RWxlbWVudCgpIHsKLQkJCXJldHVybiB0aGlzLm9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb3VudDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgc2V0Q291bnQoaW50IGNvdW50KSB7Ci0JCQlpZiAoY291bnQgPD0gMCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm86ICIgKyBjb3VudCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBvbGQgPSB0aGlzLmNvdW50OwotCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQkJcmV0dXJuIG9sZDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmICggISAobyBpbnN0YW5jZW9mIEJhZy5FbnRyeTw/PikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJQmFnLkVudHJ5IGUgPSAoQmFnLkVudHJ5KSBvOwotCQkJcmV0dXJuICh0aGlzLmNvdW50ID09IGUuZ2V0Q291bnQoKSkgJiYKLQkJCQkJVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5vYmplY3QsIGUuZ2V0RWxlbWVudCgpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJRSBvID0gdGhpcy5vYmplY3Q7Ci0JCQlyZXR1cm4gKG8gPT0gbnVsbCkgPyAwIDogKHRoaXMuY291bnQgKiBvLmhhc2hDb2RlKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5vYmplY3QgKyAiPT4iICsgdGhpcy5jb3VudDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy5zaXplID09IDApID8gRU1QVFlfSVRFUkFUT1IgOiBuZXcgSGFzaEl0ZXJhdG9yKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEU+IHVuaXF1ZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc2l6ZSA9PSAwKSA/IEVNUFRZX0lURVJBVE9SIDogbmV3IFVuaXF1ZUl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCB1bmlxdWVDb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ291bnQ7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEJhZy5FbnRyeTxFPj4gZW50cmllcygpIHsKLQkJcmV0dXJuICh0aGlzLnNpemUgPT0gMCkgPyBFTVBUWV9JVEVSQVRPUiA6IG5ldyBFbnRyeUl0ZXJhdG9yKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBFbXB0eSBpdGVyYXRvciB0aGF0IGRvZXMganVzdCBhYm91dCBub3RoaW5nLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmF0b3IgRU1QVFlfSVRFUkFUT1IgPSBuZXcgRW1wdHlJdGVyYXRvcigpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFbXB0eUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCi0JCUVtcHR5SXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgSGFzaEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewotCQlwcml2YXRlIGludCBpbmRleCA9IEhhc2hCYWcudGhpcy50YWJsZS5sZW5ndGg7CS8vIHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlCi0JCXByaXZhdGUgRW50cnk8RT4gbmV4dEVudHJ5ID0gbnVsbDsKLQkJcHJpdmF0ZSBpbnQgbmV4dEVudHJ5Q291bnQgPSAwOwotCQlwcml2YXRlIEVudHJ5PEU+IGxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIG1vZENvdW50IHZhbHVlIHRoYXQgdGhlIGl0ZXJhdG9yIGJlbGlldmVzIHRoYXQgdGhlIGJhY2tpbmcKLQkJICogYmFnIHNob3VsZCBoYXZlLiBJZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHZpb2xhdGVkLCB0aGUgaXRlcmF0b3IKLQkJICogaGFzIGRldGVjdGVkIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24uCi0JCSAqLwotCQlwcml2YXRlIGludCBleHBlY3RlZE1vZENvdW50ID0gSGFzaEJhZy50aGlzLm1vZENvdW50OwotCi0JCUhhc2hJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJRW50cnk8RT4gZSA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSBIYXNoQmFnLnRoaXMudGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZSA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZSA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZTsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJcmV0dXJuIGUgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBFIG5leHQoKSB7Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBldCA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSBIYXNoQmFnLnRoaXMudGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZXQgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWV0ID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBldDsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJaWYgKGV0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZSA9IHRoaXMubGFzdFJldHVybmVkRW50cnkgPSB0aGlzLm5leHRFbnRyeTsKLQkJCXRoaXMubmV4dEVudHJ5Q291bnQrKzsKLQkJCWlmICh0aGlzLm5leHRFbnRyeUNvdW50ID09IGUuY291bnQpIHsKLQkJCQl0aGlzLm5leHRFbnRyeSA9IGUubmV4dDsKLQkJCQl0aGlzLm5leHRFbnRyeUNvdW50ID0gMDsKLQkJCX0KLQkJCXJldHVybiBlLm9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCWlmICh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpbnQgc2xvdCA9IEhhc2hCYWcudGhpcy5pbmRleCh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5Lmhhc2gsIEhhc2hCYWcudGhpcy50YWJsZS5sZW5ndGgpOwotCQkJZm9yIChFbnRyeTxFPiBlID0gSGFzaEJhZy50aGlzLnRhYmxlW3Nsb3RdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJCWlmIChlID09IHRoaXMubGFzdFJldHVybmVkRW50cnkpIHsKLQkJCQkJSGFzaEJhZy50aGlzLm1vZENvdW50Kys7Ci0JCQkJCXRoaXMuZXhwZWN0ZWRNb2RDb3VudCsrOwotCQkJCQllLmNvdW50LS07Ci0JCQkJCWlmIChlLmNvdW50ID09IDApIHsKLQkJCQkJCS8vIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgbGFzdCBvbmUsIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCQlIYXNoQmFnLnRoaXMudGFibGVbc2xvdF0gPSBlLm5leHQ7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJCX0KLQkJCQkJCUhhc2hCYWcudGhpcy51bmlxdWVDb3VudC0tOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gc2xpZGUgYmFjayB0aGUgY291bnQgdG8gYWNjb3VudCBmb3IgdGhlIGp1c3QtcmVtb3ZlZCBlbGVtZW50Ci0JCQkJCQl0aGlzLm5leHRFbnRyeUNvdW50LS07Ci0JCQkJCX0KLQkJCQkJSGFzaEJhZy50aGlzLnNpemUtLTsKLQkJCQkJdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7CS8vIGl0IGNhbm5vdCBiZSByZW1vdmVkIGFnYWluCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgRW50cnlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEVudHJ5PEU+PiB7Ci0JCXByaXZhdGUgaW50IGluZGV4ID0gSGFzaEJhZy50aGlzLnRhYmxlLmxlbmd0aDsJLy8gc3RhcnQgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUKLQkJcHJpdmF0ZSBFbnRyeTxFPiBuZXh0RW50cnkgPSBudWxsOwotCQlwcml2YXRlIEVudHJ5PEU+IGxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIG1vZENvdW50IHZhbHVlIHRoYXQgdGhlIGl0ZXJhdG9yIGJlbGlldmVzIHRoYXQgdGhlIGJhY2tpbmcKLQkJICogYmFnIHNob3VsZCBoYXZlLiBJZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHZpb2xhdGVkLCB0aGUgaXRlcmF0b3IKLQkJICogaGFzIGRldGVjdGVkIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24uCi0JCSAqLwotCQlwcml2YXRlIGludCBleHBlY3RlZE1vZENvdW50ID0gSGFzaEJhZy50aGlzLm1vZENvdW50OwotCi0JCUVudHJ5SXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCUVudHJ5PEU+IGUgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gSGFzaEJhZy50aGlzLnRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGUgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWUgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGU7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCXJldHVybiBlICE9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgRW50cnk8RT4gbmV4dCgpIHsKLQkJCWlmIChIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGV0ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IEhhc2hCYWcudGhpcy50YWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChldCA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZXQgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGV0OwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlpZiAoZXQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IHRoaXMubmV4dEVudHJ5OwotCQkJdGhpcy5uZXh0RW50cnkgPSBlLm5leHQ7Ci0JCQlyZXR1cm4gZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCWlmICh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpbnQgc2xvdCA9IEhhc2hCYWcudGhpcy5pbmRleCh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5Lmhhc2gsIEhhc2hCYWcudGhpcy50YWJsZS5sZW5ndGgpOwotCQkJZm9yIChFbnRyeTxFPiBlID0gSGFzaEJhZy50aGlzLnRhYmxlW3Nsb3RdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJCWlmIChlID09IHRoaXMubGFzdFJldHVybmVkRW50cnkpIHsKLQkJCQkJSGFzaEJhZy50aGlzLm1vZENvdW50Kys7Ci0JCQkJCXRoaXMuZXhwZWN0ZWRNb2RDb3VudCsrOwotCQkJCQkvLyByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCUhhc2hCYWcudGhpcy50YWJsZVtzbG90XSA9IGUubmV4dDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJfQotCQkJCQlIYXNoQmFnLnRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJSGFzaEJhZy50aGlzLnNpemUgLT0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeS5jb3VudDsKLQkJCQkJdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7CS8vIGl0IGNhbm5vdCBiZSByZW1vdmVkIGFnYWluCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVW5pcXVlSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7Ci0JCXByaXZhdGUgRW50cnlJdGVyYXRvciBlbnRyeUl0ZXJhdG9yID0gbmV3IEVudHJ5SXRlcmF0b3IoKTsKLQkJCi0JCVVuaXF1ZUl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRyeUl0ZXJhdG9yLmhhc05leHQoKTsKLQkJfQotCi0JCXB1YmxpYyBFIG5leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRyeUl0ZXJhdG9yLm5leHQoKS5vYmplY3Q7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aGlzLmVudHJ5SXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0KLQotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIEJhZzw/PikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQmFnPEU+IGIgPSAoQmFnPEU+KSBvOwotCQlpZiAoYi5zaXplKCkgIT0gdGhpcy5zaXplKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoYi51bmlxdWVDb3VudCgpICE9IHRoaXMudW5pcXVlQ291bnQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8QmFnLkVudHJ5PEU+PiBzdHJlYW0gPSBiLmVudHJpZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlCYWcuRW50cnk8RT4gZW50cnkgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKGVudHJ5LmdldENvdW50KCkgIT0gdGhpcy5jb3VudChlbnRyeS5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCBoID0gMDsKLQkJZm9yIChFIG8gOiB0aGlzKSB7Ci0JCQlpZiAobyAhPSBudWxsKSB7Ci0JCQkJaCArPSBvLmhhc2hDb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGg7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgc3RhdGUgb2YgdGhpcyBiYWcgdG8gYSBzdHJlYW0gKGkuZS4gc2VyaWFsaXplIGl0KS4KLQkgKgotCSAqIEBzZXJpYWxEYXRhIEVtaXQgdGhlIGNhcGFjaXR5IG9mIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IHRoZSBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzIGluIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IGFsbCBvZiB0aGUgYmFnJ3MgZWxlbWVudHMgKGVhY2ggYW4gT2JqZWN0KSBhbmQKLQkgKiAgICAgdGhlaXIgY291bnRzIChlYWNoIGFuIGludCksIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQkvLyB3cml0ZSBvdXQgdGhlIHRocmVzaG9sZCwgbG9hZCBmYWN0b3IsIGFuZCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0KLQkJLy8gd3JpdGUgb3V0IG51bWJlciBvZiBidWNrZXRzCi0JCXMud3JpdGVJbnQodGhpcy50YWJsZS5sZW5ndGgpOwotCi0JCS8vIHdyaXRlIG91dCBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzCi0JCXMud3JpdGVJbnQodGhpcy51bmlxdWVDb3VudCk7Ci0KLQkJLy8gd3JpdGUgb3V0IGVsZW1lbnRzIGFuZCBjb3VudHMgKGFsdGVybmF0aW5nKQotCQlpZiAodGhpcy51bmlxdWVDb3VudCA+IDApIHsKLQkJCWZvciAoRW50cnk8RT4gZW50cnkgOiB0aGlzLnRhYmxlKSB7Ci0JCQkJd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJcy53cml0ZU9iamVjdChlbnRyeS5vYmplY3QpOwotCQkJCQlzLndyaXRlSW50KGVudHJ5LmNvdW50KTsKLQkJCQkJZW50cnkgPSBlbnRyeS5uZXh0OwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogUmVjb25zdGl0dXRlIHRoZSBiYWcgZnJvbSBhIHN0cmVhbSAoaS5lLiBkZXNlcmlhbGl6ZSBpdCkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJLy8gcmVhZCBpbiB0aGUgdGhyZXNob2xkLCBsb2FkZmFjdG9yLCBhbmQgYW55IGhpZGRlbiBzdHVmZgotCQlzLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0KLQkJLy8gcmVhZCBpbiBudW1iZXIgb2YgYnVja2V0cyBhbmQgYWxsb2NhdGUgdGhlIGJ1Y2tldCBhcnJheQotCQl0aGlzLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKHMucmVhZEludCgpKTsKLQotCQkvLyByZWFkIGluIG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMKLQkJaW50IHVuaXF1ZSA9IHMucmVhZEludCgpOwotCi0JCS8vIHJlYWQgdGhlIGVsZW1lbnRzIGFuZCBjb3VudHMsIGFuZCBwdXQgdGhlIGVsZW1lbnRzIGluIHRoZSBiYWcKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bmlxdWU7IGkrKykgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlFIGVsZW1lbnQgPSAoRSkgcy5yZWFkT2JqZWN0KCk7Ci0JCQlpbnQgZWxlbWVudENvdW50ID0gcy5yZWFkSW50KCk7Ci0JCQl0aGlzLmFkZF8oZWxlbWVudCwgZWxlbWVudENvdW50KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0lkZW50aXR5SGFzaEJhZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0lkZW50aXR5SGFzaEJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTEwY2FhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9JZGVudGl0eUhhc2hCYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgQmFnfSBpbnRlcmZhY2Ugd2l0aCBhCi0gKiBoYXNoIHRhYmxlLCB1c2luZyBvYmplY3QtaWRlbnRpdHkgaW4gcGxhY2Ugb2Ygb2JqZWN0LWVxdWFsaXR5IHdoZW4KLSAqIGNvbXBhcmluZyBlbGVtZW50cy4gSW4gb3RoZXIgd29yZHMsIGluIGFuIDxjb2RlPklkZW50aXR5SGFzaEJhZzwvY29kZT4sCi0gKiB0d28gb2JqZWN0cyA8Y29kZT5vMTwvY29kZT4gYW5kIDxjb2RlPm8yPC9jb2RlPiBhcmUgY29uc2lkZXJlZAotICogZXF1YWwgaWYgYW5kIG9ubHkgaWYgPGNvZGU+KG8xID09IG8yKTwvY29kZT4uIChJbiBub3JtYWwge0BsaW5rIEJhZ30KLSAqIGltcGxlbWVudGF0aW9ucyAobGlrZSB7QGxpbmsgSGFzaEJhZ30pIHR3byBvYmplY3RzIDxjb2RlPm8xPC9jb2RlPgotICogYW5kIDxjb2RlPm8yPC9jb2RlPiBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiBhbmQgb25seSBpZgotICogPGNvZGU+KG8xID09IG51bGwgPyBvMiA9PSBudWxsIDogbzEuZXF1YWxzKG8yKSk8L2NvZGU+LikKLSAqIDxwPgotICogPHN0cm9uZz4KLSAqIFRoaXMgY2xhc3MgaXMgPGVtPm5vdDwvZW0+IGEgZ2VuZXJhbC1wdXJwb3NlIHtAbGluayBCYWd9Ci0gKiBpbXBsZW1lbnRhdGlvbiEgV2hpbGUgdGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgQmFnfSBpbnRlcmZhY2UsIGl0Ci0gKiBpbnRlbnRpb25hbGx5IHZpb2xhdGVzIHtAbGluayBCYWd9J3MgZ2VuZXJhbCBjb250cmFjdCwgd2hpY2ggbWFuZGF0ZXMgdGhlCi0gKiB1c2Ugb2YgdGhlIDxjb2RlPmVxdWFsczwvY29kZT4gbWV0aG9kIHdoZW4gY29tcGFyaW5nIG9iamVjdHMuIFRoaXMgY2xhc3MgaXMKLSAqIGRlc2lnbmVkIGZvciB1c2Ugb25seSBpbiB0aGUgcmFyZSBjYXNlcyB3aGVyZWluIG9iamVjdC1pZGVudGl0eQotICogc2VtYW50aWNzIGFyZSByZXF1aXJlZC4KLSAqIDwvc3Ryb25nPgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1ha2VzIG5vIGd1YXJhbnRlZXMgYXMgdG8gdGhlIGl0ZXJhdGlvbiBvcmRlciBvZgotICogdGhlIGJhZydzIGVsZW1lbnRzOyBpbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUgb3JkZXIKLSAqIHdpbGwgcmVtYWluIGNvbnN0YW50IG92ZXIgdGltZS4gVGhpcyBjbGFzcyBwZXJtaXRzIHRoZSA8Y29kZT5udWxsPC9jb2RlPgotICogZWxlbWVudC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBvZmZlcnMgY29uc3RhbnQgdGltZSBwZXJmb3JtYW5jZSBmb3IgdGhlIGJhc2ljIG9wZXJhdGlvbnMKLSAqICg8Y29kZT5hZGQ8L2NvZGU+LCA8Y29kZT5yZW1vdmU8L2NvZGU+LCA8Y29kZT5jb250YWluczwvY29kZT4gYW5kCi0gKiA8Y29kZT5zaXplPC9jb2RlPiksIGFzc3VtaW5nIHRoZSBzeXN0ZW0gaWRlbnRpdHkgaGFzaCBmdW5jdGlvbgotICogKHtAbGluayBTeXN0ZW0jaWRlbnRpdHlIYXNoQ29kZShPYmplY3QpfSkgZGlzcGVyc2VzIGVsZW1lbnRzIHByb3Blcmx5Ci0gKiBhbW9uZyB0aGUgYnVja2V0cy4gSXRlcmF0aW5nIG92ZXIgdGhpcyBiYWcgcmVxdWlyZXMgdGltZQotICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzdW0gb2YgdGhlIGJhZydzIHNpemUgKHRoZSBudW1iZXIgb2YgZWxlbWVudHMpIHBsdXMgdGhlCi0gKiAiY2FwYWNpdHkiIG9mIHRoZSBiYWNraW5nIGhhc2ggdGFibGUgKHRoZSBudW1iZXIgb2YgYnVja2V0cykuIFRodXMsIGl0IGlzCi0gKiBpbXBvcnRhbnQgbm90IHRvIHNldCB0aGUgaW5pdGlhbCBjYXBhY2l0eSB0b28gaGlnaCAob3IgdGhlIGxvYWQgZmFjdG9yIHRvbwotICogbG93KSBpZiBpdGVyYXRpb24gcGVyZm9ybWFuY2UgaXMgaW1wb3J0YW50LgotICogPHA+Ci0gKiA8c3Ryb25nPk5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzeW5jaHJvbml6ZWQuPC9zdHJvbmc+IElmIG11bHRpcGxlCi0gKiB0aHJlYWRzIGFjY2VzcyBhIGJhZyBjb25jdXJyZW50bHksIGFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlIHRocmVhZHMgbW9kaWZpZXMKLSAqIHRoZSBiYWcsIGl0IDxlbT5tdXN0PC9lbT4gYmUgc3luY2hyb25pemVkIGV4dGVybmFsbHkuIFRoaXMgaXMgdHlwaWNhbGx5Ci0gKiBhY2NvbXBsaXNoZWQgYnkgc3luY2hyb25pemluZyBvbiBzb21lIG9iamVjdCB0aGF0IG5hdHVyYWxseSBlbmNhcHN1bGF0ZXMKLSAqIHRoZSBiYWcuIElmIG5vIHN1Y2ggb2JqZWN0IGV4aXN0cywgdGhlIGJhZyBzaG91bGQgYmUgIndyYXBwZWQiIHVzaW5nIHRoZQotICogPGNvZGU+Q29sbGVjdGlvbnMuc3luY2hyb25pemVkQ29sbGVjdGlvbjwvY29kZT4gbWV0aG9kLiBUaGlzIGlzCi0gKiBiZXN0IGRvbmUgYXQgY3JlYXRpb24gdGltZSwgdG8gcHJldmVudCBhY2NpZGVudGFsIHVuc3luY2hyb25pemVkIGFjY2VzcwotICogdG8gdGhlIGJhZzoKLSAqIDxwcmU+Ci0gKiBDb2xsZWN0aW9uIGMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRDb2xsZWN0aW9uKG5ldyBJZGVudGl0eUhhc2hCYWcoLi4uKSk7Ci0gKiA8L3ByZT4KLSAqIDxwPgotICogVGhlIGl0ZXJhdG9ycyByZXR1cm5lZCBieSB0aGlzIGNsYXNzJ3MgPGNvZGU+aXRlcmF0b3I8L2NvZGU+IG1ldGhvZCBhcmUKLSAqIDxlbT5mYWlsLWZhc3Q8L2VtPjogaWYgdGhlIGJhZyBpcyBtb2RpZmllZCBhdCBhbnkgdGltZSBhZnRlciB0aGUgaXRlcmF0b3IgaXMKLSAqIGNyZWF0ZWQsIGluIGFueSB3YXkgZXhjZXB0IHRocm91Z2ggdGhlIGl0ZXJhdG9yJ3Mgb3duIDxjb2RlPnJlbW92ZTwvY29kZT4KLSAqIG1ldGhvZCwgdGhlIGl0ZXJhdG9yIHRocm93cyBhIHtAbGluayBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9ufS4KLSAqIFRodXMsIGluIHRoZSBmYWNlIG9mIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLCB0aGUgaXRlcmF0b3IgZmFpbHMgcXVpY2tseQotICogYW5kIGNsZWFubHksIHJhdGhlciB0aGFuIHJpc2tpbmcgYXJiaXRyYXJ5LCBub24tZGV0ZXJtaW5pc3RpYyBiZWhhdmlvciBhdAotICogYW4gdW5kZXRlcm1pbmVkIHRpbWUgaW4gdGhlIGZ1dHVyZS4KLSAqIDxwPgotICogTm90ZSB0aGF0IHRoZSBmYWlsLWZhc3QgYmVoYXZpb3Igb2YgYW4gaXRlcmF0b3IgY2Fubm90IGJlIGd1YXJhbnRlZWQKLSAqIGFzIGl0IGlzLCBnZW5lcmFsbHkgc3BlYWtpbmcsIGltcG9zc2libGUgdG8gbWFrZSBhbnkgaGFyZCBndWFyYW50ZWVzIGluIHRoZQotICogcHJlc2VuY2Ugb2YgdW5zeW5jaHJvbml6ZWQgY29uY3VycmVudCBtb2RpZmljYXRpb24uIEZhaWwtZmFzdCBpdGVyYXRvcnMKLSAqIHRocm93IDxjb2RlPkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb248L2NvZGU+IG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMuCi0gKiBUaGVyZWZvcmUsIGl0IHdvdWxkIGJlIHdyb25nIHRvIHdyaXRlIGEgcHJvZ3JhbSB0aGF0IGRlcGVuZGVkIG9uIHRoaXMKLSAqIGV4Y2VwdGlvbiBmb3IgaXRzIGNvcnJlY3RuZXNzOiA8ZW0+dGhlIGZhaWwtZmFzdCBiZWhhdmlvciBvZiBpdGVyYXRvcnMKLSAqIHNob3VsZCBiZSB1c2VkIG9ubHkgdG8gZGV0ZWN0IGJ1Z3MuPC9lbT4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyBtYWludGFpbmVkIGJ5IHRoZSBiYWcKLSAqIAotICogQHNlZSBDb2xsZWN0aW9uCi0gKiBAc2VlIEJhZwotICogQHNlZSBTeW5jaHJvbml6ZWRCYWcKLSAqIEBzZWUJQ29sbGVjdGlvbnMjc3luY2hyb25pemVkQ29sbGVjdGlvbihDb2xsZWN0aW9uKQotICogQHNlZSBIYXNoQmFnCi0gKi8KLXB1YmxpYyBjbGFzcyBJZGVudGl0eUhhc2hCYWc8RT4KLQlleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbjxFPgotCWltcGxlbWVudHMgQmFnPEU+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBUaGUgaGFzaCB0YWJsZS4gUmVzaXplZCBhcyBuZWNlc3NhcnkuIExlbmd0aCBNVVNUIEFsd2F5cyBiZSBhIHBvd2VyIG9mIHR3by4gKi8KLQl0cmFuc2llbnQgRW50cnk8RT5bXSB0YWJsZTsKLQotCS8qKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGJhZy4gKi8KLQl0cmFuc2llbnQgaW50IHNpemUgPSAwOwotCi0JLyoqIFRoZSBudW1iZXIgb2YgVU5JUVVFIGVudHJpZXMgaW4gdGhlIGJhZy4gKi8KLQl0cmFuc2llbnQgaW50IHVuaXF1ZUNvdW50ID0gMDsKLQotCS8qKgotCSAqIFRoZSBoYXNoIHRhYmxlIGlzIHJlaGFzaGVkIHdoZW4gaXRzIHNpemUgZXhjZWVkcyB0aGlzIHRocmVzaG9sZC4gKFRoZQotCSAqIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgPGNvZGU+KGludCkgKGNhcGFjaXR5ICogbG9hZEZhY3Rvcik8L2NvZGU+LikKLQkgKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIGludCB0aHJlc2hvbGQ7Ci0KLQkvKioKLQkgKiBUaGUgbG9hZCBmYWN0b3IgZm9yIHRoZSBoYXNoIHRhYmxlLgotCSAqCi0JICogQHNlcmlhbAotCSAqLwotCXByaXZhdGUgZmluYWwgZmxvYXQgbG9hZEZhY3RvcjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBiYWcgaGFzIGJlZW4gc3RydWN0dXJhbGx5IG1vZGlmaWVkLgotCSAqIFN0cnVjdHVyYWwgbW9kaWZpY2F0aW9ucyBhcmUgdGhvc2UgdGhhdCBjaGFuZ2UgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluCi0JICogdGhlIGJhZyBvciBvdGhlcndpc2UgbW9kaWZ5IGl0cyBpbnRlcm5hbCBzdHJ1Y3R1cmUgKGUuZy4gcmVoYXNoKS4KLQkgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gbWFrZSBpdGVyYXRvcnMgb24gdGhpcyBiYWcgZmFpbC1mYXN0LgotCSAqCi0JICogQHNlZSBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbgotCSAqLwotCXRyYW5zaWVudCBpbnQgbW9kQ291bnQgPSAwOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaW5pdGlhbCBjYXBhY2l0eSAtIE1VU1QgYmUgYSBwb3dlciBvZiB0d28uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSA9IDE2OwotCi0JLyoqCi0JICogVGhlIG1heGltdW0gY2FwYWNpdHksIHVzZWQgaWYgYSBoaWdoZXIgdmFsdWUgaXMgaW1wbGljaXRseSBzcGVjaWZpZWQKLQkgKiBieSBlaXRoZXIgb2YgdGhlIGNvbnN0cnVjdG9ycyB3aXRoIGFyZ3VtZW50cy4KLQkgKiBNVVNUIGJlIGEgcG93ZXIgb2YgdHdvIDw9ICgxIDw8IDMwKS4KLQkJICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fQ0FQQUNJVFkgPSAxIDw8IDMwOwotCi0JLyoqCi0JICogVGhlIGxvYWQgZmFjdG9yIHVzZWQgd2hlbiBub25lIHNwZWNpZmllZCBpbiBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX0xPQURfRkFDVE9SID0gMC43NWY7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcsIGVtcHR5IGJhZyB3aXRoIHRoZQotCSAqIGRlZmF1bHQgY2FwYWNpdHksIHdoaWNoIGlzIDE2LCBhbmQgbG9hZCBmYWN0b3IsIHdoaWNoIGlzIDAuNzUuCi0JICovCi0JcHVibGljIElkZW50aXR5SGFzaEJhZygpIHsKLQkJdGhpcyhERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgYmFnIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5Ci0JICogYW5kIHRoZSBkZWZhdWx0IGxvYWQgZmFjdG9yLCB3aGljaCBpcyAwLjc1LgotCSAqCi0JICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIGxlc3MKLQkgKiAgICAgdGhhbiB6ZXJvCi0JICovCi0JcHVibGljIElkZW50aXR5SGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCXRoaXMoaW5pdGlhbENhcGFjaXR5LCBERUZBVUxUX0xPQURfRkFDVE9SLCBmYWxzZSk7ICAvLyBmYWxzZSA9IGRvIG5vdCB2YWxpZGF0ZSBwYXJtcwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgYmFnIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLgotCSAqCi0JICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eQotCSAqIEBwYXJhbSBsb2FkRmFjdG9yIHRoZSBsb2FkIGZhY3RvcgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIGxlc3MKLQkgKiAgICAgdGhhbiB6ZXJvIG9yIGlmIHRoZSBsb2FkIGZhY3RvciBpcyBub24tcG9zaXRpdmUKLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsKLQkJdGhpcyhpbml0aWFsQ2FwYWNpdHksIGxvYWRGYWN0b3IsIHRydWUpOyAgLy8gdHJ1ZSA9IHZhbGlkYXRlIHBhcm1zCi0JfQotCi0JcHJpdmF0ZSBJZGVudGl0eUhhc2hCYWcoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvciwgYm9vbGVhbiB2YWxpZGF0ZVBhcm1zKSB7Ci0JCXN1cGVyKCk7Ci0JCWludCBjYXBhY2l0eSA9IGluaXRpYWxDYXBhY2l0eTsKLQkJaWYgKHZhbGlkYXRlUGFybXMpIHsKLQkJCWlmIChjYXBhY2l0eSA8IDApIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIEluaXRpYWwgQ2FwYWNpdHk6ICIgKyBjYXBhY2l0eSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChjYXBhY2l0eSA+IE1BWElNVU1fQ0FQQUNJVFkpIHsKLQkJCQljYXBhY2l0eSA9IE1BWElNVU1fQ0FQQUNJVFk7Ci0JCQl9Ci0JCQlpZiAobG9hZEZhY3RvciA8PSAwIHx8IEZsb2F0LmlzTmFOKGxvYWRGYWN0b3IpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBMb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3IpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCi0JCQkvLyBmaW5kIGEgcG93ZXIgb2YgMiA+PSAnaW5pdGlhbENhcGFjaXR5JwotCQkJY2FwYWNpdHkgPSAxOwotCQkJd2hpbGUgKGNhcGFjaXR5IDwgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCQkJY2FwYWNpdHkgPDw9IDE7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLmxvYWRGYWN0b3IgPSBsb2FkRmFjdG9yOwotCQl0aGlzLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKGNhcGFjaXR5KTsKLQkJdGhpcy50aHJlc2hvbGQgPSAoaW50KSAoY2FwYWNpdHkgKiBsb2FkRmFjdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgYmFnIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBjb2xsZWN0aW9uLiBUaGUgYmFnJ3MgbG9hZCBmYWN0b3Igd2lsbCBiZSB0aGUgZGVmYXVsdCwgd2hpY2ggaXMgMC43NSwKLQkgKiBhbmQgaXRzIGluaXRpYWwgY2FwYWNpdHkgd2lsbCBiZSBzdWZmaWNpZW50IHRvIGhvbGQgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYyB0aGUgY29sbGVjdGlvbiB3aG9zZSBlbGVtZW50cyBhcmUgdG8gYmUgcGxhY2VkIGludG8gdGhpcyBiYWcuCi0JICovCi0JcHVibGljIElkZW50aXR5SGFzaEJhZyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXRoaXMoTWF0aC5tYXgoKGludCkgKGMuc2l6ZSgpIC8gREVGQVVMVF9MT0FEX0ZBQ1RPUikgKyAxLCBERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFkpLCBERUZBVUxUX0xPQURfRkFDVE9SKTsKLQkJdGhpcy5hZGRBbGxfKGMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGluZGV4IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIGludCBpbmRleChPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5pbmRleCh0aGlzLmhhc2gobykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGhhc2ggZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgaW50IGhhc2goT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChvID09IG51bGwpID8gMCA6IHRoaXMudHdlYWtIYXNoKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG8pKTsKLQl9Ci0KLQkvKioKLQkgKiBUd2VhayB0aGUgc3BlY2lmaWVkIGhhc2guCi0JICovCi0JcHJpdmF0ZSBpbnQgdHdlYWtIYXNoKGludCBoKSB7Ci0JCXJldHVybiBoOwotLy8JCWggXj0gKGggPj4+IDIwKSBeIChoID4+PiAxMik7Ci0vLwkJcmV0dXJuIGggXiAoaCA+Pj4gNykgXiAoaCA+Pj4gNCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBmb3IgdGhlIHNwZWNpZmllZCBoYXNoLgotCSAqLwotCXByaXZhdGUgaW50IGluZGV4KGludCBoYXNoKSB7Ci0JCXJldHVybiB0aGlzLmluZGV4KGhhc2gsIHRoaXMudGFibGUubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGZvciB0aGUgc3BlY2lmaWVkIGhhc2gKLQkgKiB3aXRoaW4gYSB0YWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCWludCBpbmRleChpbnQgaGFzaCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gaGFzaCAmIChsZW5ndGggLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCB7QGxpbmsgI2FkZEFsbChDb2xsZWN0aW9uKX0gZm9yIGNvbnN0cnVjdGlvbiBhbmQgY2xvbmluZy4KLQkgKiAoTm8gY2hlY2sgZm9yIHJlLWhhc2g7IG5vIGNoYW5nZSB0byBtb2QgY291bnQ7IG5vIHJldHVybiB2YWx1ZS4pCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEFsbF8oSXRlcmFibGU8PyBleHRlbmRzIEU+IGMpIHsKLQkJZm9yIChFIGUgOiBjKSB7Ci0JCQl0aGlzLmFkZF8oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCB7QGxpbmsgI2FkZChPYmplY3QpfSBmb3IgY29uc3RydWN0aW9uIGFuZCBjbG9uaW5nLgotCSAqIChObyBjaGVjayBmb3IgcmUtaGFzaDsgbm8gY2hhbmdlIHRvIG1vZCBjb3VudDsgbm8gcmV0dXJuIHZhbHVlLikKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkXyhFIG8pIHsKLQkJdGhpcy5hZGRfKG8sIDEpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIHtAbGluayAjYWRkKE9iamVjdCwgaW50KX0gZm9yIGNvbnN0cnVjdGlvbiwgY2xvbmluZywgYW5kIHNlcmlhbGl6YXRpb24uCi0JICogKE5vIGNoZWNrIGZvciByZS1oYXNoOyBubyBjaGFuZ2UgdG8gbW9kIGNvdW50OyBubyByZXR1cm4gdmFsdWUuKQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRfKEUgbywgaW50IGNudCkgewotCQlpbnQgaGFzaCA9IHRoaXMuaGFzaChvKTsKLQkJaW50IGluZGV4ID0gdGhpcy5pbmRleChoYXNoKTsKLQkJZm9yIChFbnRyeTxFPiBlID0gdGhpcy50YWJsZVtpbmRleF07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewotCQkJaWYgKGUub2JqZWN0ID09IG8pIHsKLQkJCQllLmNvdW50ICs9IGNudDsKLQkJCQl0aGlzLnNpemUgKz0gY250OwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIGNyZWF0ZSB0aGUgbmV3IGVudHJ5IGFuZCBwdXQgaXQgaW4gdGhlIHRhYmxlCi0JCUVudHJ5PEU+IGUgPSB0aGlzLmJ1aWxkRW50cnkoaGFzaCwgbywgY250LCB0aGlzLnRhYmxlW2luZGV4XSk7Ci0JCXRoaXMudGFibGVbaW5kZXhdID0gZTsKLQkJdGhpcy5zaXplICs9IGNudDsKLQkJdGhpcy51bmlxdWVDb3VudCsrOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2ltcGx5IHJldHVybnMgdGhlIG1haW50YWluZWQgc2l6ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNpemU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY29tcGFyZXMgdGhlIG1haW50YWluZWQgc2l6ZSB0byB6ZXJvLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLnNpemUgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2ggZm9yIHRoZSBvYmplY3QncyBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBpZGVudGl0eSBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCXByaXZhdGUgRW50cnk8RT4gZ2V0RW50cnkoT2JqZWN0IG8pIHsKLQkJZm9yIChFbnRyeTxFPiBlID0gdGhpcy50YWJsZVt0aGlzLmluZGV4KG8pXTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQlpZiAoZS5vYmplY3QgPT0gbykgewotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudHJ5KG8pICE9IG51bGw7Ci0JfQotCi0JcHVibGljIGludCBjb3VudChPYmplY3QgbykgewotCQlFbnRyeTxFPiBlID0gdGhpcy5nZXRFbnRyeShvKTsKLQkJcmV0dXJuIChlID09IG51bGwpID8gMCA6IGUuY291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmVoYXNoIHRoZSBjb250ZW50cyBvZiB0aGUgYmFnIGludG8gYSBuZXcgaGFzaCB0YWJsZQotCSAqIHdpdGggYSBsYXJnZXIgY2FwYWNpdHkuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZQotCSAqIG51bWJlciBvZiBkaWZmZXJlbnQgZWxlbWVudHMgaW4gdGhlIGJhZyBleGNlZWRzIGl0cwotCSAqIGNhcGFjaXR5IGFuZCBsb2FkIGZhY3Rvci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVoYXNoKCkgewotCQlFbnRyeTxFPltdIG9sZFRhYmxlID0gdGhpcy50YWJsZTsKLQkJaW50IG9sZENhcGFjaXR5ID0gb2xkVGFibGUubGVuZ3RoOwotCi0JCWlmIChvbGRDYXBhY2l0eSA9PSBNQVhJTVVNX0NBUEFDSVRZKSB7Ci0JCQl0aGlzLnRocmVzaG9sZCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG5ld0NhcGFjaXR5ID0gMiAqIG9sZENhcGFjaXR5OwotCQlFbnRyeTxFPltdIG5ld1RhYmxlID0gdGhpcy5idWlsZFRhYmxlKG5ld0NhcGFjaXR5KTsKLQotCQlmb3IgKGludCBpID0gb2xkQ2FwYWNpdHk7IGktLSA+IDA7ICkgewotCQkJZm9yIChFbnRyeTxFPiBvbGQgPSBvbGRUYWJsZVtpXTsgb2xkICE9IG51bGw7ICkgewotCQkJCUVudHJ5PEU+IGUgPSBvbGQ7Ci0JCQkJb2xkID0gb2xkLm5leHQ7Ci0KLQkJCQlpbnQgaW5kZXggPSB0aGlzLmluZGV4KGUuaGFzaCwgbmV3Q2FwYWNpdHkpOwotCQkJCWUubmV4dCA9IG5ld1RhYmxlW2luZGV4XTsKLQkJCQluZXdUYWJsZVtpbmRleF0gPSBlOwotCQkJfQotCQl9Ci0KLQkJdGhpcy50YWJsZSA9IG5ld1RhYmxlOwotCQl0aGlzLnRocmVzaG9sZCA9IChpbnQpIChuZXdDYXBhY2l0eSAqIHRoaXMubG9hZEZhY3Rvcik7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRW50cnk8RT5bXSBidWlsZFRhYmxlKGludCBjYXBhY2l0eSkgewotCQlyZXR1cm4gbmV3IEVudHJ5W2NhcGFjaXR5XTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQlyZXR1cm4gdGhpcy5hZGQobywgMSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBpZGVudGl0eSBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZChFIG8sIGludCBjbnQpIHsKLQkJaWYgKGNudCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdGhpcy5tb2RDb3VudCsrOwotCQlpbnQgaGFzaCA9IHRoaXMuaGFzaChvKTsKLQkJaW50IGluZGV4ID0gdGhpcy5pbmRleChoYXNoKTsKLQotCQkvLyBpZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkgaW4gdGhlIGJhZywgc2ltcGx5IGJ1bXAgaXRzIGNvdW50Ci0JCWZvciAoRW50cnk8RT4gZSA9IHRoaXMudGFibGVbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCWlmIChlLm9iamVjdCA9PSBvKSB7Ci0JCQkJZS5jb3VudCArPSBjbnQ7Ci0JCQkJdGhpcy5zaXplICs9IGNudDsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlaGFzaCB0aGUgdGFibGUgaWYgd2UgYXJlIGdvaW5nIHRvIGV4Y2VlZCB0aGUgdGhyZXNob2xkCi0JCWlmICh0aGlzLnVuaXF1ZUNvdW50ID49IHRoaXMudGhyZXNob2xkKSB7Ci0JCQl0aGlzLnJlaGFzaCgpOwotCQkJaW5kZXggPSB0aGlzLmluZGV4KGhhc2gpOyAgLy8gbmVlZCB0byByZS1jYWxjdWxhdGUgdGhlIGluZGV4Ci0JCX0KLQotCQkvLyBjcmVhdGUgdGhlIG5ldyBlbnRyeSBhbmQgcHV0IGl0IGluIHRoZSB0YWJsZQotCQlFbnRyeTxFPiBlID0gdGhpcy5idWlsZEVudHJ5KGhhc2gsIG8sIGNudCwgdGhpcy50YWJsZVtpbmRleF0pOwotCQl0aGlzLnRhYmxlW2luZGV4XSA9IGU7Ci0JCXRoaXMuc2l6ZSArPSBjbnQ7Ci0JCXRoaXMudW5pcXVlQ291bnQrKzsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKLQlwcml2YXRlIEVudHJ5PEU+IGJ1aWxkRW50cnkoaW50IGhhc2gsIE9iamVjdCBvLCBpbnQgY250LCBFbnRyeSBuZXh0KSB7Ci0JCXJldHVybiBuZXcgRW50cnk8RT4oaGFzaCwgKEUpIG8sIGNudCwgKEVudHJ5PEU+KSBuZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZShvLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvLCBpbnQgY250KSB7Ci0JCWlmIChjbnQgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBpbmRleCA9IHRoaXMuaW5kZXgobyk7Ci0KLQkJZm9yIChFbnRyeTxFPiBlID0gdGhpcy50YWJsZVtpbmRleF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0KSB7Ci0JCQlpZiAoZS5vYmplY3QgPT0gbykgewotCQkJCXRoaXMubW9kQ291bnQrKzsKLQkJCQljbnQgPSAoY250IDwgZS5jb3VudCkgPyBjbnQgOiBlLmNvdW50OwotCQkJCWUuY291bnQgLT0gY250OwotCQkJCS8vIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgbGFzdCBlbGVtZW50KHMpLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJaWYgKGUuY291bnQgPT0gMCkgewotCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQl0aGlzLnRhYmxlW2luZGV4XSA9IGUubmV4dDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJfQotCQkJCQl0aGlzLnVuaXF1ZUNvdW50LS07Ci0JCQkJfQotCQkJCXRoaXMuc2l6ZSAtPSBjbnQ7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIG9iamVjdC1pZGVudGl0eSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUKLQkgKiBzcGVjaWZpZWQgY29sbGVjdGlvbiBjb250YWlucyBhIHBhcnRpY3VsYXIgZWxlbWVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiBzdXBlci5yZW1vdmVBbGwobmV3IElkZW50aXR5SGFzaEJhZzxPYmplY3Q+KGMpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgb2JqZWN0LWlkZW50aXR5IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQotCSAqIHNwZWNpZmllZCBjb2xsZWN0aW9uIGNvbnRhaW5zIGEgcGFydGljdWxhciBlbGVtZW50LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHN1cGVyLnJldGFpbkFsbChuZXcgSWRlbnRpdHlIYXNoQmFnPE9iamVjdD4oYykpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNsZWFycyBvdXQgYWxsIG9mIHRoZSBoYXNoIHRhYmxlIGJ1Y2tldHMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJdGhpcy5tb2RDb3VudCsrOwotCQlmb3IgKGludCBpID0gdGFiLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQl0YWJbaV0gPSBudWxsOwotCQl9Ci0JCXRoaXMuc2l6ZSA9IDA7Ci0JCXRoaXMudW5pcXVlQ291bnQgPSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBiYWc6IHRoZSBlbGVtZW50cwotCSAqIHRoZW1zZWx2ZXMgYXJlIG5vdCBjbG9uZWQuCi0JICoKLQkgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgYmFnLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJZGVudGl0eUhhc2hCYWc8RT4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUlkZW50aXR5SGFzaEJhZzxFPiBjbG9uZSA9IChJZGVudGl0eUhhc2hCYWc8RT4pIHN1cGVyLmNsb25lKCk7Ci0JCQljbG9uZS50YWJsZSA9IHRoaXMuYnVpbGRUYWJsZSh0aGlzLnRhYmxlLmxlbmd0aCk7Ci0JCQljbG9uZS5zaXplID0gMDsKLQkJCWNsb25lLnVuaXF1ZUNvdW50ID0gMDsKLQkJCWNsb25lLm1vZENvdW50ID0gMDsKLQkJCWNsb25lLmFkZEFsbF8odGhpcyk7Ci0JCQlyZXR1cm4gY2xvbmU7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEhhc2ggdGFibGUgY29sbGlzaW9uIGxpc3QgZW50cnkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50cnk8RT4gaW1wbGVtZW50cyBCYWcuRW50cnk8RT4gewotCQlmaW5hbCBpbnQgaGFzaDsgIC8vIGNhY2hlIHRoZSBoYXNoIGZvciByZS1oYXNoZXMKLQkJZmluYWwgRSBvYmplY3Q7Ci0JCWludCBjb3VudDsKLQkJRW50cnk8RT4gbmV4dDsKLQotCQlFbnRyeShpbnQgaGFzaCwgRSBvYmplY3QsIGludCBjb3VudCwgRW50cnk8RT4gbmV4dCkgewotCQkJdGhpcy5oYXNoID0gaGFzaDsKLQkJCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQkJdGhpcy5uZXh0ID0gbmV4dDsKLQkJfQotCi0JCS8vICoqKioqIEJhZy5FbnRyeSBpbXBsZW1lbnRhdGlvbgotCQlwdWJsaWMgRSBnZXRFbGVtZW50KCkgewotCQkJcmV0dXJuIHRoaXMub2JqZWN0OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmNvdW50OwotCQl9Ci0KLQkJcHVibGljIGludCBzZXRDb3VudChpbnQgY291bnQpIHsKLQkJCWlmIChjb3VudCA8PSAwKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybzogIiArIGNvdW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IG9sZCA9IHRoaXMuY291bnQ7Ci0JCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCQlyZXR1cm4gb2xkOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKCAhIChvIGluc3RhbmNlb2YgQmFnLkVudHJ5PD8+KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlCYWcuRW50cnkgZSA9IChCYWcuRW50cnkpIG87Ci0JCQlyZXR1cm4gKHRoaXMub2JqZWN0ID09IGUuZ2V0RWxlbWVudCgpKQotCQkJCQkmJiAodGhpcy5jb3VudCA9PSBlLmdldENvdW50KCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlFIG8gPSB0aGlzLm9iamVjdDsKLQkJCXJldHVybiAobyA9PSBudWxsKSA/IDAgOiAodGhpcy5jb3VudCAqIG8uaGFzaENvZGUoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm9iamVjdCArICI9PiIgKyB0aGlzLmNvdW50OyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLnNpemUgPT0gMCkgPyBFTVBUWV9JVEVSQVRPUiA6IG5ldyBIYXNoSXRlcmF0b3IoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8RT4gdW5pcXVlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy5zaXplID09IDApID8gRU1QVFlfSVRFUkFUT1IgOiBuZXcgVW5pcXVlSXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHVuaXF1ZUNvdW50KCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb3VudDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8QmFnLkVudHJ5PEU+PiBlbnRyaWVzKCkgewotCQlyZXR1cm4gKHRoaXMuc2l6ZSA9PSAwKSA/IEVNUFRZX0lURVJBVE9SIDogbmV3IEVudHJ5SXRlcmF0b3IoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEVtcHR5IGl0ZXJhdG9yIHRoYXQgZG9lcyBqdXN0IGFib3V0IG5vdGhpbmcuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYXRvciBFTVBUWV9JVEVSQVRPUiA9IG5ldyBFbXB0eUl0ZXJhdG9yKCk7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVtcHR5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0KLQkJRW1wdHlJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBIYXNoSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7Ci0JCXByaXZhdGUgaW50IGluZGV4ID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGUubGVuZ3RoOwkvLyBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZQotCQlwcml2YXRlIEVudHJ5PEU+IG5leHRFbnRyeSA9IG51bGw7Ci0JCXByaXZhdGUgaW50IG5leHRFbnRyeUNvdW50ID0gMDsKLQkJcHJpdmF0ZSBFbnRyeTxFPiBsYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtb2RDb3VudCB2YWx1ZSB0aGF0IHRoZSBpdGVyYXRvciBiZWxpZXZlcyB0aGF0IHRoZSBiYWNraW5nCi0JCSAqIGJhZyBzaG91bGQgaGF2ZS4gSWYgdGhpcyBleHBlY3RhdGlvbiBpcyB2aW9sYXRlZCwgdGhlIGl0ZXJhdG9yCi0JCSAqIGhhcyBkZXRlY3RlZCBhIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgZXhwZWN0ZWRNb2RDb3VudCA9IElkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50OwotCi0JCUhhc2hJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJRW50cnk8RT4gZSA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChlID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQllID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBlOwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlyZXR1cm4gZSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIEUgbmV4dCgpIHsKLQkJCWlmIChJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZXQgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZXQgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWV0ID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBldDsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJaWYgKGV0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZSA9IHRoaXMubGFzdFJldHVybmVkRW50cnkgPSB0aGlzLm5leHRFbnRyeTsKLQkJCXRoaXMubmV4dEVudHJ5Q291bnQrKzsKLQkJCWlmICh0aGlzLm5leHRFbnRyeUNvdW50ID09IGUuY291bnQpIHsKLQkJCQl0aGlzLm5leHRFbnRyeSA9IGUubmV4dDsKLQkJCQl0aGlzLm5leHRFbnRyeUNvdW50ID0gMDsKLQkJCX0KLQkJCXJldHVybiBlLm9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCWlmICh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCWludCBzbG90ID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMuaW5kZXgodGhpcy5sYXN0UmV0dXJuZWRFbnRyeS5oYXNoLCBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZS5sZW5ndGgpOwotCQkJZm9yIChFbnRyeTxFPiBlID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGVbc2xvdF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKGUgPT0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSkgewotCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCsrOwotCQkJCQl0aGlzLmV4cGVjdGVkTW9kQ291bnQrKzsKLQkJCQkJZS5jb3VudC0tOwotCQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCQkvLyBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3Qgb25lLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGVbc2xvdF0gPSBlLm5leHQ7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJCX0KLQkJCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLnVuaXF1ZUNvdW50LS07Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBzbGlkZSBiYWNrIHRoZSBjb3VudCB0byBhY2NvdW50IGZvciB0aGUganVzdC1yZW1vdmVkIGVsZW1lbnQKLQkJCQkJCXRoaXMubmV4dEVudHJ5Q291bnQtLTsKLQkJCQkJfQotCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy5zaXplLS07Ci0JCQkJCXRoaXMubGFzdFJldHVybmVkRW50cnkgPSBudWxsOwkvLyBpdCBjYW5ub3QgYmUgcmVtb3ZlZCBhZ2FpbgotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JfQotCi0KLQlwcml2YXRlIGNsYXNzIEVudHJ5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxFbnRyeTxFPj4gewotCQlwcml2YXRlIGludCBpbmRleCA9IElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlLmxlbmd0aDsJLy8gc3RhcnQgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUKLQkJcHJpdmF0ZSBFbnRyeTxFPiBuZXh0RW50cnkgPSBudWxsOwotCQlwcml2YXRlIEVudHJ5PEU+IGxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIG1vZENvdW50IHZhbHVlIHRoYXQgdGhlIGl0ZXJhdG9yIGJlbGlldmVzIHRoYXQgdGhlIGJhY2tpbmcKLQkJICogYmFnIHNob3VsZCBoYXZlLiBJZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHZpb2xhdGVkLCB0aGUgaXRlcmF0b3IKLQkJICogaGFzIGRldGVjdGVkIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24uCi0JCSAqLwotCQlwcml2YXRlIGludCBleHBlY3RlZE1vZENvdW50ID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQ7Ci0KLQkJRW50cnlJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJRW50cnk8RT4gZSA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChlID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQllID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBlOwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlyZXR1cm4gZSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIEVudHJ5PEU+IG5leHQoKSB7Ci0JCQlpZiAoSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGV0ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGV0ID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQlldCA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZXQ7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCWlmIChldCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGUgPSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGUubmV4dDsKLQkJCXJldHVybiBlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJaWYgKHRoaXMubGFzdFJldHVybmVkRW50cnkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmIChJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJaW50IHNsb3QgPSBJZGVudGl0eUhhc2hCYWcudGhpcy5pbmRleCh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5Lmhhc2gsIElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlLmxlbmd0aCk7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZVtzbG90XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZSA9PSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5KSB7Ci0JCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50Kys7Ci0JCQkJCXRoaXMuZXhwZWN0ZWRNb2RDb3VudCsrOwotCQkJCQkvLyByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlW3Nsb3RdID0gZS5uZXh0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQl9Ci0JCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLnVuaXF1ZUNvdW50LS07Ci0JCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLnNpemUgLT0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeS5jb3VudDsKLQkJCQkJdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7CS8vIGl0IGNhbm5vdCBiZSByZW1vdmVkIGFnYWluCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVW5pcXVlSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7Ci0JCXByaXZhdGUgRW50cnlJdGVyYXRvciBlbnRyeUl0ZXJhdG9yID0gbmV3IEVudHJ5SXRlcmF0b3IoKTsKLQkJCi0JCVVuaXF1ZUl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRyeUl0ZXJhdG9yLmhhc05leHQoKTsKLQkJfQotCi0JCXB1YmxpYyBFIG5leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRyeUl0ZXJhdG9yLm5leHQoKS5vYmplY3Q7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aGlzLmVudHJ5SXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0KLQotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJZGVudGl0eUhhc2hCYWc8Pz4pIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJSWRlbnRpdHlIYXNoQmFnPEU+IGIgPSAoSWRlbnRpdHlIYXNoQmFnPEU+KSBvOwotCQkJaWYgKGIuc2l6ZSgpICE9IHRoaXMuc2l6ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKGIudW5pcXVlQ291bnQoKSAhPSB0aGlzLnVuaXF1ZUNvdW50KCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yPEJhZy5FbnRyeTxFPj4gc3RyZWFtID0gYi5lbnRyaWVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCUJhZy5FbnRyeTxFPiBlbnRyeSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJaWYgKGVudHJ5LmdldENvdW50KCkgIT0gdGhpcy5jb3VudChlbnRyeS5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0aGlzLmVxdWFsc18obyk7Ci0JCX0KLS8vCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBCYWc8Pz4pIHsKLS8vCQkJLy8gaG1tbS4uLgotLy8JCQlyZXR1cm4gbmV3IEhhc2hCYWc8T2JqZWN0Pih0aGlzKS5lcXVhbHMobyk7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXF1YWxzXyhPYmplY3QgbykgewotCQkvLyBobW1tLi4uCi0JCXJldHVybiAobyBpbnN0YW5jZW9mIEJhZzw/PikgJiYgCi0JCQkJbmV3IEhhc2hCYWc8T2JqZWN0Pih0aGlzKS5lcXVhbHMobyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IGggPSAwOwotCQlmb3IgKEUgbyA6IHRoaXMpIHsKLQkJCWggKz0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobyk7Ci0JCX0KLQkJcmV0dXJuIGg7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgc3RhdGUgb2YgdGhpcyBiYWcgdG8gYSBzdHJlYW0gKGkuZS4gc2VyaWFsaXplIGl0KS4KLQkgKgotCSAqIEBzZXJpYWxEYXRhIEVtaXQgdGhlIGNhcGFjaXR5IG9mIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IHRoZSBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzIGluIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IGFsbCBvZiB0aGUgYmFnJ3MgZWxlbWVudHMgKGVhY2ggYW4gT2JqZWN0KSBhbmQKLQkgKiAgICAgdGhlaXIgY291bnRzIChlYWNoIGFuIGludCksIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQkvLyB3cml0ZSBvdXQgdGhlIHRocmVzaG9sZCwgbG9hZCBmYWN0b3IsIGFuZCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0KLQkJLy8gd3JpdGUgb3V0IG51bWJlciBvZiBidWNrZXRzCi0JCXMud3JpdGVJbnQodGhpcy50YWJsZS5sZW5ndGgpOwotCi0JCS8vIHdyaXRlIG91dCBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzCi0JCXMud3JpdGVJbnQodGhpcy51bmlxdWVDb3VudCk7Ci0KLQkJLy8gd3JpdGUgb3V0IGVsZW1lbnRzIGFuZCBjb3VudHMgKGFsdGVybmF0aW5nKQotCQlpZiAodGhpcy51bmlxdWVDb3VudCA+IDApIHsKLQkJCWZvciAoRW50cnk8RT4gZW50cnkgOiB0aGlzLnRhYmxlKSB7Ci0JCQkJd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJcy53cml0ZU9iamVjdChlbnRyeS5vYmplY3QpOwotCQkJCQlzLndyaXRlSW50KGVudHJ5LmNvdW50KTsKLQkJCQkJZW50cnkgPSBlbnRyeS5uZXh0OwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogUmVjb25zdGl0dXRlIHRoZSBiYWcgZnJvbSBhIHN0cmVhbSAoaS5lLiBkZXNlcmlhbGl6ZSBpdCkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJLy8gcmVhZCBpbiB0aGUgdGhyZXNob2xkLCBsb2FkZmFjdG9yLCBhbmQgYW55IGhpZGRlbiBzdHVmZgotCQlzLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0KLQkJLy8gcmVhZCBpbiBudW1iZXIgb2YgYnVja2V0cyBhbmQgYWxsb2NhdGUgdGhlIGJ1Y2tldCBhcnJheQotCQl0aGlzLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKHMucmVhZEludCgpKTsKLQotCQkvLyByZWFkIGluIG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMKLQkJaW50IHVuaXF1ZSA9IHMucmVhZEludCgpOwotCi0JCS8vIHJlYWQgdGhlIGVsZW1lbnRzIGFuZCBjb3VudHMsIGFuZCBwdXQgdGhlIGVsZW1lbnRzIGluIHRoZSBiYWcKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bmlxdWU7IGkrKykgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlFIGVsZW1lbnQgPSAoRSkgcy5yZWFkT2JqZWN0KCk7Ci0JCQlpbnQgZWxlbWVudENvdW50ID0gcy5yZWFkSW50KCk7Ci0JCQl0aGlzLmFkZF8oZWxlbWVudCwgZWxlbWVudENvdW50KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0ludFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0ludFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JmOWRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9JbnRSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB3aGVyZXZlciBhIG11dGFibGUgaW50ZWdlciBvYmplY3QgaXMgbmVlZGVkLgotICogSXQgaXMgYSBjcm9zcyBiZXR3ZWVuIGFuIDxjb2RlPmludDwvY29kZT4gYW5kIGFuIHtAbGluayBJbnRlZ2VyfS4KLSAqIEl0IGNhbiBiZSBzdG9yZWQgaW4gYSBzdGFuZGFyZCBjb250YWluZXIgKGUuZy4ge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ufSkKLSAqIGJ1dCBjYW4gYmUgbW9kaWZpZWQuIEl0IGlzIGFsc28gdXNlZnVsIHBhc3NpbmcgYSB2YWx1ZSB0aGF0IGNhbiBiZSBjaGFuZ2VkCi0gKiBieSB0aGUgcmVjaXBpZW50LgotICogCi0gKiBAc2VlIFN5bmNocm9uaXplZEludAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSW50UmVmZXJlbmNlCi0JaW1wbGVtZW50cyBDb21wYXJhYmxlPEludFJlZmVyZW5jZT4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgPGNvZGU+aW50PC9jb2RlPi4gKi8KLQlwcml2YXRlIHZvbGF0aWxlIGludCB2YWx1ZSA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgPGNvZGU+aW50PC9jb2RlPiByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIEludFJlZmVyZW5jZShpbnQgY291bnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IGNvdW50OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIDxjb2RlPmludDwvY29kZT4gcmVmZXJlbmNlIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiB6ZXJvLgotCSAqLwotCXB1YmxpYyBJbnRSZWZlcmVuY2UoKSB7Ci0JCXRoaXMoMCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID09IHY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90IGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbm90RXF1YWxzKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlICE9IHY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgemVyby4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1plcm8oKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90IHplcm8uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb3RaZXJvKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZSAhPSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR3JlYXRlclRoYW4oaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPiB2OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHcmVhdGVyVGhhbk9yRXF1YWwoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPj0gdjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xlc3NUaGFuKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlIDwgdjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGVzc1RoYW5PckVxdWFsKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlIDw9IHY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgcG9zaXRpdmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQb3NpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNHcmVhdGVyVGhhbigwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBub3QgcG9zaXRpdmUKLQkgKiAoaS5lLiBuZWdhdGl2ZSBvciB6ZXJvKS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vdFBvc2l0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0xlc3NUaGFuT3JFcXVhbCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBuZWdhdGl2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05lZ2F0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0xlc3NUaGFuKDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIG5vdCBuZWdhdGl2ZQotCSAqIChpLmUuIHplcm8gb3IgcG9zaXRpdmUpLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm90TmVnYXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzR3JlYXRlclRoYW5PckVxdWFsKDApOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUuIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZwotCSAqIHRocmVhZHMgYXJlIG5vdGlmaWVkLiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgc2V0VmFsdWUoaW50IHZhbHVlKSB7Ci0JCWludCBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBhYnMoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID0gTWF0aC5hYnModGhpcy52YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgbmVnYXRpdmUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBuZWcoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID0gLXRoaXMudmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB6ZXJvLiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcKLQkgKiB0aHJlYWRzIGFyZSBub3RpZmllZC4gUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHNldFplcm8oKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKDApOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgcGx1cyB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgYWRkKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlICs9IHY7Ci0JfQotCi0JLyoqCi0JICogSW5jcmVtZW50IGFuZCByZXR1cm4gdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgaW5jcmVtZW50KCkgewotCQlyZXR1cm4gKyt0aGlzLnZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgbWludXMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHN1YnRyYWN0KGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlIC09IHY7Ci0JfQotCi0JLyoqCi0JICogRGVjcmVtZW50IGFuZCByZXR1cm4gdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgZGVjcmVtZW50KCkgewotCQlyZXR1cm4gLS10aGlzLnZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgdGltZXMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IG11bHRpcGx5KGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlICo9IHY7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgY3VycmVudCB2YWx1ZSBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBkaXZpZGUoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgLz0gdjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIHRoZSByZW1haW5kZXIgb2YgdGhlIGN1cnJlbnQgdmFsdWUgZGl2aWRlZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCByZW1haW5kZXIoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgJT0gdjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIHRoZSBtaW5pbXVtIG9mIHRoZSBjdXJyZW50IHZhbHVlIGFuZCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgbWluKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID0gTWF0aC5taW4odGhpcy52YWx1ZSwgdik7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgbWF4aW11bSBvZiB0aGUgY3VycmVudCB2YWx1ZSBhbmQgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IG1heChpbnQgdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA9IE1hdGgubWF4KHRoaXMudmFsdWUsIHYpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgcmFpc2VkIHRvIHRoZSBwb3dlciBvZiB0aGUnCi0JICogc3BlY2lmaWVkIHZhbHVlLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgcG93KGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID0gKGludCkgTWF0aC5wb3codGhpcy52YWx1ZSwgdik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbXBhcmFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBjb21wYXJlVG8oSW50UmVmZXJlbmNlIGlyKSB7Ci0JCWludCB2ID0gaXIuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPCB2ID8gLTEgOiAodGhpcy52YWx1ZSA9PSB2ID8gMCA6IDEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChvIGluc3RhbmNlb2YgSW50UmVmZXJlbmNlKSAmJgotCQkJKHRoaXMudmFsdWUgPT0gKChJbnRSZWZlcmVuY2UpIG8pLnZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gJ1snICsgU3RyaW5nLnZhbHVlT2YodGhpcy52YWx1ZSkgKyAnXSc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZTkyYWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0pEQkNUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnNxbC5UeXBlczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5KYXZhVHlwZTsKLQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRoIHRoZSBKREJDIEFQSS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpEQkNUb29scyB7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKREJDVHlwZSBqZGJjVHlwZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlKYXZhVG9KREJDVHlwZU1hcHBpbmcgbWFwcGluZyA9IGphdmFUb0pEQkNUeXBlTWFwcGluZyhjbGFzc05hbWUpOwotCQlyZXR1cm4gKG1hcHBpbmcgPT0gbnVsbCkgPyBERUZBVUxUX0pEQkNfVFlQRSA6IG1hcHBpbmcuZ2V0SkRCQ1R5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpEQkMgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkRCQ1R5cGUgamRiY1R5cGVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBqZGJjVHlwZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKREJDIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIGpkYmNUeXBlRm9yKEphdmFUeXBlIGphdmFUeXBlKSB7Ci0JCXJldHVybiBqZGJjVHlwZUZvckNsYXNzTmFtZWQoamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgSkRCQyB0eXBlLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlIGphdmFUeXBlRm9ySkRCQ1R5cGVOYW1lZChTdHJpbmcgamRiY1R5cGVOYW1lKSB7Ci0JCUpEQkNUb0phdmFUeXBlTWFwcGluZyBtYXBwaW5nID0gamRiY1RvSmF2YVR5cGVNYXBwaW5nKGpkYmNUeXBlTmFtZSk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IERFRkFVTFRfSkFWQV9UWVBFIDogbWFwcGluZy5nZXRKYXZhVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKREJDIHR5cGUuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGUgamF2YVR5cGVGb3IoSkRCQ1R5cGUgamRiY1R5cGUpIHsKLQkJcmV0dXJuIGphdmFUeXBlRm9ySkRCQ1R5cGVOYW1lZChqZGJjVHlwZS5uYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKREJDIHR5cGUuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGUgamF2YVR5cGVGb3JKREJDVHlwZUNvZGUoaW50IGpkYmNUeXBlQ29kZSkgewotCQlyZXR1cm4gamF2YVR5cGVGb3IoSkRCQ1R5cGUudHlwZShqZGJjVHlwZUNvZGUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgc3R1ZmYgKioqKioqKioqKgotCi0KLQkvLyAqKioqKioqKioqIEpEQkMgPT4gSmF2YSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBKREJDID0+IEphdmEgdHlwZSBtYXBwaW5ncywga2V5ZWQgYnkgSkRCQyB0eXBlIG5hbWUgKGUuZy4gIlZBUkNIQVIiKQotCSAqLwotCXByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IEpEQkNfVE9fSkFWQV9UWVBFX01BUFBJTkdTOyAgLy8gcHNldWRvICdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgREVGQVVMVF9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7ICAvLyBUT0RPIE9iamVjdCBpcyB0aGUgZGVmYXVsdD8KLQotCi0JcHJpdmF0ZSBzdGF0aWMgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nIGpkYmNUb0phdmFUeXBlTWFwcGluZyhTdHJpbmcgamRiY1R5cGVOYW1lKSB7Ci0JCXJldHVybiBqZGJjVG9KYXZhVHlwZU1hcHBpbmdzKCkuZ2V0KGpkYmNUeXBlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IGpkYmNUb0phdmFUeXBlTWFwcGluZ3MoKSB7Ci0JCWlmIChKREJDX1RPX0pBVkFfVFlQRV9NQVBQSU5HUyA9PSBudWxsKSB7Ci0JCQlKREJDX1RPX0pBVkFfVFlQRV9NQVBQSU5HUyA9IGJ1aWxkSkRCQ1RvSmF2YVR5cGVNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBKREJDX1RPX0pBVkFfVFlQRV9NQVBQSU5HUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nPiBidWlsZEpEQkNUb0phdmFUeXBlTWFwcGluZ3MoKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IG1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+KCk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ3NUbyhtYXBwaW5ncyk7Ci0JCXJldHVybiBtYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBoYXJkIGNvZGUgdGhlIGRlZmF1bHQgbWFwcGluZ3MgZnJvbSB0aGUgSkRCQyB0eXBlcyB0byB0aGUKLQkgKiBhcHByb3ByaWF0ZSBKYXZhIHR5cGVzCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqIHNlZSAiSkRCQyAzLjAgU3BlY2lmaWNhdGlvbiIgQXBwZW5kaXggQgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nc1RvKEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkFSUkFZLCBqYXZhLnNxbC5BcnJheS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5CSUdJTlQsIGxvbmcuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQklOQVJZLCBieXRlW10uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQklULCBib29sZWFuLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkJMT0IsIGphdmEuc3FsLkJsb2IuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQk9PTEVBTiwgYm9vbGVhbi5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5DSEFSLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkNMT0IsIGphdmEuc3FsLkNsb2IuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuREFUQUxJTkssIGphdmEubmV0LlVSTC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5EQVRFLCBqYXZhLnNxbC5EYXRlLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkRFQ0lNQUwsIGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkRJU1RJTkNULCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBtYXBwaW5ncyk7ICAvLyA/Pz8KLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuRE9VQkxFLCBkb3VibGUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuRkxPQVQsIGRvdWJsZS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5JTlRFR0VSLCBpbnQuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuSkFWQV9PQkpFQ1QsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsgIC8vID8/PwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5MT05HVkFSQklOQVJZLCBieXRlW10uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuTE9OR1ZBUkNIQVIsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIG1hcHBpbmdzKTsKLQkJLy8gbm90IHN1cmUgd2h5IHRoaXMgaXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcwotLy8JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLk5VTEwsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuTlVNRVJJQywgamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuT1RIRVIsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsJLy8gPz8/Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlJFQUwsIGZsb2F0LmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlJFRiwgamF2YS5zcWwuUmVmLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlNNQUxMSU5ULCBzaG9ydC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5TVFJVQ1QsIGphdmEuc3FsLlN0cnVjdC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5USU1FLCBqYXZhLnNxbC5UaW1lLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlRJTUVTVEFNUCwgamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlRJTllJTlQsIGJ5dGUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVkFSQklOQVJZLCBieXRlW10uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVkFSQ0hBUiwgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgbWFwcGluZ3MpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oaW50IGpkYmNUeXBlQ29kZSwgQ2xhc3M8Pz4gamF2YUNsYXNzLCBIYXNoTWFwPFN0cmluZywgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nPiBtYXBwaW5ncykgewotCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlcwotCQlKREJDVHlwZSBqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoamRiY1R5cGVDb2RlKTsKLQkJT2JqZWN0IHByZXYgPSBtYXBwaW5ncy5wdXQoamRiY1R5cGUubmFtZSgpLCBidWlsZEpEQkNUb0phdmFUeXBlTWFwcGluZyhqZGJjVHlwZSwgamF2YUNsYXNzKSk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBKREJDIHR5cGU6ICIgKyBqZGJjVHlwZS5uYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBKREJDVG9KYXZhVHlwZU1hcHBpbmcgYnVpbGRKREJDVG9KYXZhVHlwZU1hcHBpbmcoSkRCQ1R5cGUgamRiY1R5cGUsIENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmV3IEpEQkNUb0phdmFUeXBlTWFwcGluZyhqZGJjVHlwZSwgbmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhID0+IEpEQkMgKioqKioqKioqKgotCi0JLyoqCi0JICogSmF2YSA9PiBKREJDIHR5cGUgbWFwcGluZ3MsIGtleWVkIGJ5IEphdmEgY2xhc3MgbmFtZSAoZS5nLiAiamF2YS5sYW5nLk9iamVjdCIpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEphdmFUb0pEQkNUeXBlTWFwcGluZz4gSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1M7ICAvLyBwc2V1ZG8gJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKREJDVHlwZSBERUZBVUxUX0pEQkNfVFlQRSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuVkFSQ0hBUik7ICAvLyBUT0RPIFZBUkNIQVIgaXMgdGhlIGRlZmF1bHQ/Ci0KLQotCXByaXZhdGUgc3RhdGljIEphdmFUb0pEQkNUeXBlTWFwcGluZyBqYXZhVG9KREJDVHlwZU1hcHBpbmcoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gamF2YVRvSkRCQ1R5cGVNYXBwaW5ncygpLmdldChjbGFzc05hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBqYXZhVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlpZiAoSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1MgPT0gbnVsbCkgewotCQkJSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1MgPSBidWlsZEphdmFUb0pEQkNUeXBlTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1M7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEphdmFUb0pEQkNUeXBlTWFwcGluZz4gYnVpbGRKYXZhVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPigpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdzVG8obWFwcGluZ3MpOwotCQlyZXR1cm4gbWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogaGFyZCBjb2RlIHRoZSBkZWZhdWx0IG1hcHBpbmdzIGZyb20gdGhlIEphdmEgdHlwZXMgdG8gdGhlCi0JICogYXBwcm9wcmlhdGUgSkRCQyB0eXBlcwotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKiBzZWUgIkpEQkMgMy4wIFNwZWNpZmljYXRpb24iIEFwcGVuZGl4IEIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ3NUbyhIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncykgewotCQkvLyBwcmltaXRpdmVzCi0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGJvb2xlYW4uY2xhc3MsIFR5cGVzLkJJVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhieXRlLmNsYXNzLCBUeXBlcy5USU5ZSU5ULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGRvdWJsZS5jbGFzcywgVHlwZXMuRE9VQkxFLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGZsb2F0LmNsYXNzLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGludC5jbGFzcywgVHlwZXMuSU5URUdFUiwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhsb25nLmNsYXNzLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oc2hvcnQuY2xhc3MsIFR5cGVzLlNNQUxMSU5ULCBtYXBwaW5ncyk7Ci0KLQkJLy8gcmVmZXJlbmNlIGNsYXNzZXMKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MsIFR5cGVzLkJJVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuQnl0ZS5jbGFzcywgVHlwZXMuVElOWUlOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuRG91YmxlLmNsYXNzLCBUeXBlcy5ET1VCTEUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkZsb2F0LmNsYXNzLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLCBUeXBlcy5JTlRFR0VSLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5Mb25nLmNsYXNzLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLlNob3J0LmNsYXNzLCBUeXBlcy5TTUFMTElOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBUeXBlcy5WQVJDSEFSLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBUeXBlcy5OVU1FUklDLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubmV0LlVSTC5jbGFzcywgVHlwZXMuREFUQUxJTkssIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuQXJyYXkuY2xhc3MsIFR5cGVzLkFSUkFZLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLkJsb2IuY2xhc3MsIFR5cGVzLkJMT0IsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuQ2xvYi5jbGFzcywgVHlwZXMuQ0xPQiwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLnNxbC5EYXRlLmNsYXNzLCBUeXBlcy5EQVRFLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlJlZi5jbGFzcywgVHlwZXMuUkVGLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlN0cnVjdC5jbGFzcywgVHlwZXMuU1RSVUNULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlRpbWUuY2xhc3MsIFR5cGVzLlRJTUUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLCBUeXBlcy5USU1FU1RBTVAsIG1hcHBpbmdzKTsKLQotCQkvLyBhcnJheXMKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oYnl0ZVtdLmNsYXNzLCBUeXBlcy5WQVJCSU5BUlksIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkJ5dGVbXS5jbGFzcywgVHlwZXMuVkFSQklOQVJZLCBtYXBwaW5ncyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhDbGFzczw/PiBqYXZhQ2xhc3MsIGludCBqZGJjVHlwZUNvZGUsIEhhc2hNYXA8U3RyaW5nLCBKYXZhVG9KREJDVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCS8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCU9iamVjdCBwcmV2ID0gbWFwcGluZ3MucHV0KGphdmFDbGFzcy5nZXROYW1lKCksIGJ1aWxkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nKGphdmFDbGFzcywgamRiY1R5cGVDb2RlKSk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBKYXZhIGNsYXNzOiAiICsgKChKYXZhVG9KREJDVHlwZU1hcHBpbmcpIHByZXYpLmdldEphdmFUeXBlKCkuZGVjbGFyYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEphdmFUb0pEQkNUeXBlTWFwcGluZyBidWlsZEphdmFUb0pEQkNUeXBlTWFwcGluZyhDbGFzczw/PiBqYXZhQ2xhc3MsIGludCBqZGJjVHlwZUNvZGUpIHsKLQkJcmV0dXJuIG5ldyBKYXZhVG9KREJDVHlwZU1hcHBpbmcobmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcyksIEpEQkNUeXBlLnR5cGUoamRiY1R5cGVDb2RlKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKREJDVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBKREJDID0+IEphdmEKLQkgKi8KLQlzdGF0aWMgY2xhc3MgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nIHsKLQkJcHJpdmF0ZSBmaW5hbCBKREJDVHlwZSBqZGJjVHlwZTsKLQkJcHJpdmF0ZSBmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZTsKLQotCQlKREJDVG9KYXZhVHlwZU1hcHBpbmcoSkRCQ1R5cGUgamRiY1R5cGUsIEphdmFUeXBlIGphdmFUeXBlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5qZGJjVHlwZSA9IGpkYmNUeXBlOwotCQkJdGhpcy5qYXZhVHlwZSA9IGphdmFUeXBlOwotCQl9Ci0KLQkJcHVibGljIEpEQkNUeXBlIGdldEpEQkNUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YVR5cGUgZ2V0SmF2YVR5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoaW50IGpkYmNUeXBlQ29kZSkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGUuY29kZSgpID09IGpkYmNUeXBlQ29kZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoU3RyaW5nIGpkYmNUeXBlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGUubmFtZSgpLmVxdWFscyhqZGJjVHlwZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhKREJDVHlwZSB0eXBlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZSA9PSB0eXBlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCXRoaXMuYXBwZW5kVG8oc2IpOwotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQl0aGlzLmpkYmNUeXBlLmFwcGVuZFRvKHNiKTsKLQkJCXNiLmFwcGVuZCgiID0+ICIpOyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLmphdmFUeXBlLmFwcGVuZERlY2xhcmF0aW9uVG8oc2IpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBKYXZhID0+IEpEQkMKLQkgKi8KLQlzdGF0aWMgY2xhc3MgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nIHsKLQkJcHJpdmF0ZSBmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZTsKLQkJcHJpdmF0ZSBmaW5hbCBKREJDVHlwZSBqZGJjVHlwZTsKLQotCQlKYXZhVG9KREJDVHlwZU1hcHBpbmcoSmF2YVR5cGUgamF2YVR5cGUsIEpEQkNUeXBlIGpkYmNUeXBlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5qYXZhVHlwZSA9IGphdmFUeXBlOwotCQkJdGhpcy5qZGJjVHlwZSA9IGpkYmNUeXBlOwotCQl9Ci0KLQkJcHVibGljIEphdmFUeXBlIGdldEphdmFUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuamF2YVR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSkRCQ1R5cGUgZ2V0SkRCQ1R5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoSmF2YVR5cGUganQpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlLmVxdWFscyhqdCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXBzKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoU3RyaW5nIGphdmFDbGFzc05hbWUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlLmRlc2NyaWJlcyhqYXZhQ2xhc3NOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZS5kZXNjcmliZXMoamF2YUNsYXNzKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQl0aGlzLmFwcGVuZFRvKHNiKTsKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJdGhpcy5qYXZhVHlwZS5hcHBlbmREZWNsYXJhdGlvblRvKHNiKTsKLQkJCXNiLmFwcGVuZCgiID0+ICIpOyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLmpkYmNUeXBlLmFwcGVuZFRvKHNiKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1R5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9KREJDVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTE1NjUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9KREJDVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnNxbC5UeXBlczsKLQotLyoqCi0gKiBBc3NvY2lhdGUgdGhlIEphdmEgY29uc3RhbnQgYW5kIHRoZSBKREJDIHR5cGUgbmFtZS4KLSAqIFRoZXNlIGFyZSBkZXJpdmVkIGZyb20gamF2YS5zcWwuVHlwZXMuCi0gKiAKLSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpEQkNUeXBlCi0JaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCi0JLyoqCi0JICogdGhlIGNvbnN0YW50IG5hbWUgKGUuZy4gVkFSQ0hBUikKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogdGhlIEpEQkMgY29kZSB1c2VkIGJ5IEpEQkMgZHJpdmVycwotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IGNvZGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgSkRCQyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCB0eXBlIGNvZGUuCi0JICogVGhpcyBpcyBwcml2YXRlIGJlY2F1c2UgYWxsIHRoZSBwb3NzaWJsZSBKREJDIHR5cGVzIGFyZSBidWlsdCBhbmQKLQkgKiBzdG9yZWQgaW4gdGhlIHN0YXRpYyBhcnJheSBUWVBFUy4KLQkgKiBAc2VlICN0eXBlcygpCi0JICovCi0JcHJpdmF0ZSBKREJDVHlwZShTdHJpbmcgbmFtZSwgaW50IGNvZGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5jb2RlID0gY29kZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSwgYXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIG5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgY29kZSwgYXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcy4KLQkgKi8KLQlwdWJsaWMgaW50IGNvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvZGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW50aW5nIGFuZCBkaXNwbGF5aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCXRoaXMuYXBwZW5kVG8oc2IpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpEQkNUeXBlIGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChKREJDVHlwZSkgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIHN0dWZmICoqKioqKioqKioKLQotCS8qKgotCSAqIGFsbCB0aGUgSkRCQyB0eXBlIGRlZmluZWQgaW4gamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBKREJDVHlwZVtdIFRZUEVTOwkJLy8gcHNldWRvICdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEpEQkNUeXBlW10gdHlwZXMoKSB7Ci0JCWlmIChUWVBFUyA9PSBudWxsKSB7Ci0JCQlUWVBFUyA9IGJ1aWxkVHlwZXMoKTsKLQkJfQotCQlyZXR1cm4gVFlQRVM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKREJDIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZSBjb2RlIChlLmcuIFR5cGVzLlZBUkNIQVIpLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIHR5cGUoaW50IGNvZGUpIHsKLQkJSkRCQ1R5cGVbXSB0eXBlcyA9IHR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSB0eXBlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKHR5cGVzW2ldLmNvZGUoKSA9PSBjb2RlKSB7Ci0JCQkJcmV0dXJuIHR5cGVzW2ldOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgSkRCQyB0eXBlIGNvZGU6ICIgKyBjb2RlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZSAoZS5nLiAiVkFSQ0hBUiIpLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIHR5cGUoU3RyaW5nIG5hbWUpIHsKLQkJSkRCQ1R5cGVbXSB0eXBlcyA9IHR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSB0eXBlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKHR5cGVzW2ldLm5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gdHlwZXNbaV07Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBKREJDIHR5cGUgbmFtZTogIiArIG5hbWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogYnVpbGQgdXAgdGhlIEpEQkMgdHlwZXMgdmlhIHJlZmxlY3Rpb24KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSkRCQ1R5cGVbXSBidWlsZFR5cGVzKCkgewotCQlGaWVsZFtdIGZpZWxkcyA9IFR5cGVzLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCWludCBsZW4gPSBmaWVsZHMubGVuZ3RoOwotCQlKREJDVHlwZVtdIHR5cGVzID0gbmV3IEpEQkNUeXBlW2xlbl07Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJU3RyaW5nIG5hbWUgPSBmaWVsZHNbaV0uZ2V0TmFtZSgpOwotCQkJaW50IGNvZGU7Ci0JCQl0cnkgewotCQkJCWNvZGUgPSAoKEludGVnZXIpIGZpZWxkc1tpXS5nZXQobnVsbCkpLmludFZhbHVlKCk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwkvLyBzaG91bGRuJ3QgaGFwcGVuLi4uCi0JCQl9Ci0JCQl0eXBlc1tpXSA9IG5ldyBKREJDVHlwZShuYW1lLCBjb2RlKTsKLQkJfQotCQlyZXR1cm4gdHlwZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvS2V5ZWRTZXQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9LZXllZFNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQyOTUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9LZXllZFNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFpbnRhaW5zIGEge0BsaW5rIFNldH0gb2YgaXRlbXMsIGFuZCBhIHtAbGluayBNYXB9IG9mIGtleXMgdG8gdGhvc2UgaXRlbXMuCi0gKiBBbiBpdGVtIG1heSBoYXZlIG11bHRpcGxlIGtleXMsIGJ1dCBhbiBpdGVtIG1heSBoYXZlIG5vIGtleXMgYW5kIHJlbWFpbiBpbiB0aGUgc2V0LiAgT25jZSBhbiAKLSAqIGl0ZW0ncyBsYXN0IGtleSBpcyByZW1vdmVkLCB0aGUgaXRlbSBpcyBhbHNvIHJlbW92ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBLZXllZFNldDxLLCBWPiB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBTZXQ8Vj4gaXRlbVNldDsKLQlwcml2YXRlIGZpbmFsIFNldDxWPiB1bm1vZGlmaWFibGVJdGVtU2V0OwotCXByaXZhdGUgZmluYWwgTWFwPEssVj4gbWFwOwotCQotCQotCXB1YmxpYyBLZXllZFNldCgpIHsKLQkJdGhpcy5pdGVtU2V0ID0gbmV3IEhhc2hTZXQ8Vj4oKTsKLQkJdGhpcy51bm1vZGlmaWFibGVJdGVtU2V0ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHRoaXMuaXRlbVNldCk7Ci0JCXRoaXMubWFwID0gbmV3IEhhc2hNYXA8SyxWPigpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gdW5tb2RpZmlhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZXQgb2YgaXRlbXMuCi0JICovCi0JcHVibGljIFNldDxWPiBnZXRJdGVtU2V0KCkgewotCQlyZXR1cm4gdGhpcy51bm1vZGlmaWFibGVJdGVtU2V0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW0gc3RvcmVkIHVuZGVyIHRoZSBnaXZlbiBrZXkuCi0JICovCi0JcHVibGljIFYgZ2V0SXRlbShLIGtleSkgewotCQlyZXR1cm4gdGhpcy5tYXAuZ2V0KGtleSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFuIGl0ZW0gaXMgc3RvcmVkIHVuZGVyIHRoZSBnaXZlbiBrZXkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoSyBrZXkpIHsKLQkJcmV0dXJuIHRoaXMubWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBpdGVtIGlzIHN0b3JlZCB1bmRlciAqYW55KiBrZXkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNJdGVtKFYgaXRlbSkgewotCQlyZXR1cm4gdGhpcy5pdGVtU2V0LmNvbnRhaW5zKGl0ZW0pOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYW4gaXRlbSB0byBiZSBzdG9yZWQgdW5kZXIgdGhlIGdpdmVuIGtleS4gIAotCSAqIFRoZSBpdGVtIG11c3Qgbm90IGFscmVhZHkgYmUgc3RvcmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEl0ZW0oSyBrZXksIFYgaXRlbSkgewotCQlhZGRJdGVtKGl0ZW0pOwotCQlhZGRLZXkoa2V5LCBpdGVtKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEl0ZW0oViBpdGVtKSB7Ci0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLml0ZW1TZXQuYWRkKGl0ZW0pOwotCX0KLQkKLQkvKiogCi0JICogQWRkIGFuIGFkZGl0aW9uYWwga2V5IHRvIGFuIGl0ZW0gYWxyZWFkeSBzdG9yZWQgdW5kZXIgYW4gYWx0ZXJuYXRlIGtleS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRLZXkoSyBrZXksIFYgaXRlbSkgewotCQlpZiAoa2V5ID09IG51bGwgfHwgaXRlbSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYgKCEgdGhpcy5pdGVtU2V0LmNvbnRhaW5zKGl0ZW0pKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5tYXAucHV0KGtleSwgaXRlbSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZ2l2ZW4gaXRlbSBhbmQgcmVtb3ZlIGFueSBrZXktdG8taXRlbSBtYXBwaW5nIGl0IG1heSBoYXZlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW0oViBpdGVtKSB7Ci0JCWlmICh0aGlzLml0ZW1TZXQucmVtb3ZlKGl0ZW0pKSB7Ci0JCQlmb3IgKE1hcC5FbnRyeTxLLFY+IGVudHJ5IDogQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5tYXAuZW50cnlTZXQoKSkpIHsKLQkJCQlpZiAoZW50cnkuZ2V0VmFsdWUoKSA9PSBpdGVtKSB7Ci0JCQkJCW1hcC5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBrZXktdG8taXRlbSBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4ga2V5LgotCSAqIElmIGl0IGlzIHRoZSBsYXN0IGtleSB0byB0aGUgaXRlbSwgYWxzbyByZW1vdmUgdGhlIGl0ZW0uCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlS2V5KEsga2V5KSB7Ci0JCWZpbmFsIFYgaXRlbSA9IHRoaXMubWFwLmdldChrZXkpOwotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQl0aGlzLm1hcC5yZW1vdmUoa2V5KTsKLQkJCWJvb2xlYW4gb3RoZXJLZXkgPSBmYWxzZTsKLQkJCWZvciAoTWFwLkVudHJ5PEssVj4gZW50cnkgOiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLm1hcC5lbnRyeVNldCgpKSkgewotCQkJCWlmIChvdGhlcktleSB8IGVudHJ5LmdldFZhbHVlKCkgPT0gaXRlbSkgewotCQkJCQlvdGhlcktleSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCEgb3RoZXJLZXkpIHsKLQkJCQlyZW1vdmVJdGVtKGl0ZW0pOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9MaXN0ZW5lckxpc3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9MaXN0ZW5lckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkzYjc4Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvTGlzdGVuZXJMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci0KLS8qKgotICogTWFpbnRhaW4gYSB0aHJlYWQtc2FmZSBsaXN0IG9mIGxpc3RlbmVycyB0aGF0IGRvZXMgbm90IGFsbG93IGFkZGluZwotICogZHVwbGljYXRlIGxpc3RlbmVycyBvciByZW1vdmluZyBub24tbGlzdGVuZXJzLgotICovCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJMaXN0PEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPgotCWltcGxlbWVudHMgU2VyaWFsaXphYmxlCi17Ci0JLyoqCi0JICogV2UgY2FuIG1hcmsgdGhpcyB2b2xhdGlsZSBhbmQgbm90IHN5bmNocm9uaXplIHRoZSByZWFkIG1ldGhvZHMgYmVjYXVzZQotCSAqIHdlIG5ldmVyIGNoYW5nZSB0aGUgPGVtPmNvbnRlbnRzPC9lbT4gb2YgdGhlIGFycmF5LgotCSAqLwotCXByaXZhdGUgdHJhbnNpZW50IHZvbGF0aWxlIExbXSBsaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdGVuZXIgbGlzdCBmb3IgbGlzdGVuZXJzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXJMaXN0KENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0ZW5lcnMgPSB0aGlzLmJ1aWxkTGlzdGVuZXJBcnJheShsaXN0ZW5lckNsYXNzLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0ZW5lciBsaXN0IGZvciBsaXN0ZW5lcnMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIHRvIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBMaXN0ZW5lckxpc3QoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgTCBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lcnMgPSB0aGlzLmJ1aWxkTGlzdGVuZXJBcnJheShsaXN0ZW5lckNsYXNzLCAxKTsKLQkJdGhpcy5saXN0ZW5lcnNbMF0gPSBsaXN0ZW5lcjsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExbXSBidWlsZExpc3RlbmVyQXJyYXkoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gKExbXSkgQXJyYXkubmV3SW5zdGFuY2UobGlzdGVuZXJDbGFzcywgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8TD4gZ2V0TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8TD4odGhpcy5saXN0ZW5lcnMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RlbmVycy5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3RlbmVyIGxpc3QgaGFzIG5vIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lcnMubGVuZ3RoID09IDA7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgdG8gdGhlIGxpc3RlbmVyIGxpc3QuCi0JICogRHVwbGljYXRlIGxpc3RlbmVycyBhcmUgbm90IGFsbG93ZWQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChMIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoQXJyYXlUb29scy5jb250YWlucyh0aGlzLmxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkdXBsaWNhdGUgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmxpc3RlbmVycyA9IEFycmF5VG9vbHMuYWRkKHRoaXMubGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdC4KLQkgKiBSZW1vdmluZyBhIGxpc3RlbmVyIHRoYXQgaXMgbm90IG9uIHRoZSBsaXN0IGlzIG5vdCBhbGxvd2VkLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmUoTCBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaW50IGluZGV4ID0gQXJyYXlUb29scy5pbmRleE9mKHRoaXMubGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5yZWdpc3RlcmVkIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5saXN0ZW5lcnMgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRBdEluZGV4KHRoaXMubGlzdGVuZXJzLCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIGxpc3RlbmVyIGxpc3QuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewotCQl0aGlzLmxpc3RlbmVycyA9IEFycmF5VG9vbHMuY2xlYXIodGhpcy5saXN0ZW5lcnMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBvZiBsaXN0ZW5lcnMgaGVsZCBieSB0aGUgbGlzdGVuZXIgbGlzdC4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ2xhc3M8TD4gZ2V0TGlzdGVuZXJUeXBlKCkgewotCQlyZXR1cm4gKENsYXNzPEw+KSB0aGlzLmxpc3RlbmVycy5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gQXJyYXlzLnRvU3RyaW5nKHRoaXMubGlzdGVuZXJzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VyaWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTaWxlbnRseSBkcm9wIGFueSBub24tc2VyaWFsaXphYmxlIGxpc3RlbmVycy4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyB3cml0ZSBvdXQgYW55IGhpZGRlbiBzdHVmZgotCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlDbGFzczxMPiBsaXN0ZW5lckNsYXNzID0gKENsYXNzPEw+KSB0aGlzLmxpc3RlbmVycy5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKLQkJcy53cml0ZU9iamVjdChsaXN0ZW5lckNsYXNzKTsKLQotCQkvLyBvbmx5IHdyaXRlIG91dCBzZXJpYWxpemFibGUgbGlzdGVuZXJzCi0JCWZvciAoTCBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJzKSB7Ci0JCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBTZXJpYWxpemFibGUpIHsKLQkJCQlzLndyaXRlT2JqZWN0KGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCXMud3JpdGVPYmplY3QobnVsbCk7Ci0gICAgfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gcmVhZCBpbiBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQotCQlDbGFzczxMPiBsaXN0ZW5lckNsYXNzID0gKENsYXNzPEw+KSBzLnJlYWRPYmplY3QoKTsKLQkJdGhpcy5saXN0ZW5lcnMgPSB0aGlzLmJ1aWxkTGlzdGVuZXJBcnJheShsaXN0ZW5lckNsYXNzLCAwKTsKLQkJT2JqZWN0IG87Ci0JCXdoaWxlICgobyA9IHMucmVhZE9iamVjdCgpKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmxpc3RlbmVycyA9IEFycmF5VG9vbHMuYWRkKHRoaXMubGlzdGVuZXJzLCAoTCkgbyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9OYW1lVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9OYW1lVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YxYTdjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvTmFtZVRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotLyoqCi0gKiBWYXJpb3VzIGhlbHBlciBtZXRob2RzIGZvciBnZW5lcmF0aW5nIG5hbWVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmFtZVRvb2xzIHsKLQotCS8qKgotCSAqIEdpdmVuIGEgInJvb3QiIG5hbWUgYW5kIGEgc2V0IG9mIGV4aXN0aW5nIG5hbWVzLCBnZW5lcmF0ZSBhIHVuaXF1ZQotCSAqIG5hbWUgdGhhdCBpcyBlaXRoZXIgdGhlICJyb290IiBuYW1lIG9yIHNvbWUgdmFyaWF0aW9uIG9uIHRoZSAicm9vdCIKLQkgKiBuYW1lIChlLmcuICJyb290MiIsICJyb290MyIsLi4uKS4gVGhlIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZQotCSAqIChpLmUuICJSb290IiBhbmQgInJvb3QiIGFyZSBib3RoIGFsbG93ZWQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZU5hbWVGb3IoU3RyaW5nIHJvb3ROYW1lLCBJdGVyYXRvcjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMpIHsKLQkJcmV0dXJuIHVuaXF1ZU5hbWVGb3Iocm9vdE5hbWUsIENvbGxlY3Rpb25Ub29scy5zZXQoZXhpc3RpbmdOYW1lcykpOwotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiBhICJyb290IiBuYW1lIGFuZCBhIHNldCBvZiBleGlzdGluZyBuYW1lcywgZ2VuZXJhdGUgYSB1bmlxdWUKLQkgKiBuYW1lIHRoYXQgaXMgZWl0aGVyIHRoZSAicm9vdCIgbmFtZSBvciBzb21lIHZhcmlhdGlvbiBvbiB0aGUgInJvb3QiCi0JICogbmFtZSAoZS5nLiAicm9vdDIiLCAicm9vdDMiLC4uLikuIFRoZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUKLQkgKiAoaS5lLiAiUm9vdCIgYW5kICJyb290IiBhcmUgYm90aCBhbGxvd2VkKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVOYW1lRm9yKFN0cmluZyByb290TmFtZSwgQ29sbGVjdGlvbjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMpIHsKLQkJcmV0dXJuIHVuaXF1ZU5hbWVGb3Iocm9vdE5hbWUsIGV4aXN0aW5nTmFtZXMsIHJvb3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhICJyb290IiBuYW1lIGFuZCBhIHNldCBvZiBleGlzdGluZyBuYW1lcywgZ2VuZXJhdGUgYSB1bmlxdWUKLQkgKiBuYW1lIHRoYXQgaXMgZWl0aGVyIHRoZSAicm9vdCIgbmFtZSBvciBzb21lIHZhcmlhdGlvbiBvbiB0aGUgInJvb3QiCi0JICogbmFtZSAoZS5nLiAicm9vdDIiLCAicm9vdDMiLC4uLikuIFRoZSBuYW1lcyBhcmUgTk9UIGNhc2Utc2Vuc2l0aXZlCi0JICogKGkuZS4gIlJvb3QiIGFuZCAicm9vdCIgYXJlIE5PVCBib3RoIGFsbG93ZWQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKFN0cmluZyByb290TmFtZSwgSXRlcmF0b3I8U3RyaW5nPiBleGlzdGluZ05hbWVzKSB7Ci0JCXJldHVybiB1bmlxdWVOYW1lRm9ySWdub3JlQ2FzZShyb290TmFtZSwgQ29sbGVjdGlvblRvb2xzLnNldChleGlzdGluZ05hbWVzKSk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSAicm9vdCIgbmFtZSBhbmQgYSBzZXQgb2YgZXhpc3RpbmcgbmFtZXMsIGdlbmVyYXRlIGEgdW5pcXVlCi0JICogbmFtZSB0aGF0IGlzIGVpdGhlciB0aGUgInJvb3QiIG5hbWUgb3Igc29tZSB2YXJpYXRpb24gb24gdGhlICJyb290IgotCSAqIG5hbWUgKGUuZy4gInJvb3QyIiwgInJvb3QzIiwuLi4pLiBUaGUgbmFtZXMgYXJlIE5PVCBjYXNlLXNlbnNpdGl2ZQotCSAqIChpLmUuICJSb290IiBhbmQgInJvb3QiIGFyZSBOT1QgYm90aCBhbGxvd2VkKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVOYW1lRm9ySWdub3JlQ2FzZShTdHJpbmcgcm9vdE5hbWUsIENvbGxlY3Rpb248U3RyaW5nPiBleGlzdGluZ05hbWVzKSB7Ci0JCXJldHVybiB1bmlxdWVOYW1lRm9yKHJvb3ROYW1lLCBjb252ZXJ0VG9Mb3dlckNhc2UoZXhpc3RpbmdOYW1lcyksIHJvb3ROYW1lLnRvTG93ZXJDYXNlKCkpOwotCX0KLQotCS8qKgotCSAqIHVzZSB0aGUgc3VmZml4ZWQgInRlbXBsYXRlIiBuYW1lIHRvIHBlcmZvcm0gdGhlIGNvbXBhcmlzb25zLCBidXQgUkVUVVJOCi0JICogdGhlIHN1ZmZpeGVkICJyb290IiBuYW1lOyB0aGlzIGFsbG93cyBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb25zCi0JICogKGkuZS4gdGhlICJ0ZW1wbGF0ZSIgbmFtZSBoYXMgYmVlbiBtb3JwaGVkIHRvIHRoZSBzYW1lIGNhc2UgYXMKLQkgKiB0aGUgImV4aXN0aW5nIiBuYW1lcywgd2hpbGUgdGhlICJyb290IiBuYW1lIGhhcyBub3QsIGJ1dCB0aGUgInJvb3QiIG5hbWUKLQkgKiBpcyB3aGF0IHRoZSBjbGllbnQgd2FudHMgbW9ycGhlZCB0byBiZSB1bmlxdWUpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVuaXF1ZU5hbWVGb3IoU3RyaW5nIHJvb3ROYW1lLCBDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdOYW1lcywgU3RyaW5nIHRlbXBsYXRlTmFtZSkgewotCQlpZiAoICEgZXhpc3RpbmdOYW1lcy5jb250YWlucyh0ZW1wbGF0ZU5hbWUpKSB7Ci0JCQlyZXR1cm4gcm9vdE5hbWU7Ci0JCX0KLQkJU3RyaW5nIHVuaXF1ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7Ci0JCWZvciAoaW50IHN1ZmZpeCA9IDI7IHRydWU7IHN1ZmZpeCsrKSB7Ci0JCQlpZiAoICEgZXhpc3RpbmdOYW1lcy5jb250YWlucyh1bmlxdWVOYW1lICsgc3VmZml4KSkgewotCQkJCXJldHVybiByb290TmFtZS5jb25jYXQoU3RyaW5nLnZhbHVlT2Yoc3VmZml4KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiBzdHJpbmdzIHRvIGEgY29sbGVjdGlvbiBvZiB0aGUgc2FtZQotCSAqIHN0cmluZ3MgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaFNldDxTdHJpbmc+IGNvbnZlcnRUb0xvd2VyQ2FzZShDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncykgewotCQlIYXNoU2V0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihzdHJpbmdzLnNpemUoKSk7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IHN0cmluZ3MpIHsKLQkJCXJlc3VsdC5hZGQoc3RyaW5nLnRvTG93ZXJDYXNlKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBmdWxseS1xdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBkYXRhYmFzZSBvYmplY3QuCi0JICogVmFyaWF0aW9uczoKLQkgKiAgICAgY2F0YWxvZy5zY2hlbWEubmFtZQotCSAqICAgICBjYXRhbG9nLi5uYW1lCi0JICogICAgIHNjaGVtYS5uYW1lCi0JICogICAgIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZShTdHJpbmcgY2F0YWxvZywgU3RyaW5nIHNjaGVtYSwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKChjYXRhbG9nID09IG51bGwpICYmIChzY2hlbWEgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0KLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7Ci0JCWlmIChjYXRhbG9nICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZChjYXRhbG9nKTsKLQkJCXNiLmFwcGVuZCgnLicpOwotCQl9Ci0JCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKHNjaGVtYSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCcuJyk7Ci0JCXNiLmFwcGVuZChuYW1lKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNldCBvZiByZXNlcnZlZCB3b3JkcyBpbiB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZS4KLQkgKiBUaGVzZSB3b3JkcyBjYW5ub3QgYmUgdXNlZCBhcyBpZGVudGlmaWVycyAoaS5lLiBuYW1lcykuCi0JICogaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3R1dG9yaWFsL2phdmEvbnV0c2FuZGJvbHRzL19rZXl3b3Jkcy5odG1sCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKQVZBX1JFU0VSVkVEX1dPUkRTID0gbmV3IFN0cmluZ1tdIHsKLQkJCQkiYWJzdHJhY3QiLAotCQkJCSJhc3NlcnQiLCAgLy8gamRrIDEuNAotCQkJCSJib29sZWFuIiwKLQkJCQkiYnJlYWsiLAotCQkJCSJieXRlIiwKLQkJCQkiY2FzZSIsCi0JCQkJImNhdGNoIiwKLQkJCQkiY2hhciIsCi0JCQkJImNsYXNzIiwKLQkJCQkiY29uc3QiLCAgLy8gdW51c2VkCi0JCQkJImNvbnRpbnVlIiwKLQkJCQkiZGVmYXVsdCIsCi0JCQkJImRvIiwKLQkJCQkiZG91YmxlIiwKLQkJCQkiZWxzZSIsCi0JCQkJImVudW0iLCAgLy8gamRrIDEuNQotCQkJCSJleHRlbmRzIiwKLQkJCQkiZmFsc2UiLAotCQkJCSJmaW5hbCIsCi0JCQkJImZpbmFsbHkiLAotCQkJCSJmbG9hdCIsCi0JCQkJImZvciIsCi0JCQkJImdvdG8iLCAgLy8gdW51c2VkCi0JCQkJImlmIiwKLQkJCQkiaW1wbGVtZW50cyIsCi0JCQkJImltcG9ydCIsCi0JCQkJImluc3RhbmNlb2YiLAotCQkJCSJpbnQiLAotCQkJCSJpbnRlcmZhY2UiLAotCQkJCSJsb25nIiwKLQkJCQkibmF0aXZlIiwKLQkJCQkibmV3IiwKLQkJCQkibnVsbCIsCi0JCQkJInBhY2thZ2UiLAotCQkJCSJwcml2YXRlIiwKLQkJCQkicHJvdGVjdGVkIiwKLQkJCQkicHVibGljIiwKLQkJCQkicmV0dXJuIiwKLQkJCQkic2hvcnQiLAotCQkJCSJzdGF0aWMiLAotCQkJCSJzdHJpY3RmcCIsICAvLyBqZGsgMS4yCi0JCQkJInN1cGVyIiwKLQkJCQkic3dpdGNoIiwKLQkJCQkic3luY2hyb25pemVkIiwKLQkJCQkidGhpcyIsCi0JCQkJInRocm93IiwKLQkJCQkidGhyb3dzIiwKLQkJCQkidHJhbnNpZW50IiwKLQkJCQkidHJ1ZSIsCi0JCQkJInRyeSIsCi0JCQkJInZvaWQiLAotCQkJCSJ2b2xhdGlsZSIsCi0JCQkJIndoaWxlIgotCQkJfTsKLQotCS8qKgotCSAqIFRoZSBzZXQgb2YgcmVzZXJ2ZWQgd29yZHMgaW4gdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCi0JICogVGhlc2Ugd29yZHMgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllcnMgKGkuZS4gbmFtZXMpLgotCSAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy90dXRvcmlhbC9qYXZhL251dHNhbmRib2x0cy9fa2V5d29yZHMuaHRtbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU29ydGVkU2V0PFN0cmluZz4gSkFWQV9SRVNFUlZFRF9XT1JEU19TRVQgPSAKLQkJQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU29ydGVkU2V0KENvbGxlY3Rpb25Ub29scy5zb3J0ZWRTZXQoSkFWQV9SRVNFUlZFRF9XT1JEUykpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXQgb2YgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSByZXNlcnZlZCB3b3Jkcy4KLQkgKiBUaGVzZSB3b3JkcyBjYW5ub3QgYmUgdXNlZCBhcyBpZGVudGlmaWVycyAoaS5lLiBuYW1lcykuCi0JICogaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3R1dG9yaWFsL2phdmEvbnV0c2FuZGJvbHRzL19rZXl3b3Jkcy5odG1sCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFSZXNlcnZlZFdvcmRzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVZBX1JFU0VSVkVEX1dPUkRTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb25zaXN0cyBvZiBKYXZhIGlkZW50aWZpZXIKLQkgKiBjaGFyYWN0ZXJzIChidXQgbWF5IGJlIGEgcmVzZXJ2ZWQgd29yZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnMoU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nQ29uc2lzdHNPZkphdmFJZGVudGlmaWVyQ2hhcmFjdGVyc18oc3RyaW5nLnRvQ2hhckFycmF5KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnNpc3RzIG9mIEphdmEgaWRlbnRpZmllcgotCSAqIGNoYXJhY3RlcnMgKGJ1dCBtYXkgYmUgYSByZXNlcnZlZCB3b3JkKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nQ29uc2lzdHNPZkphdmFJZGVudGlmaWVyQ2hhcmFjdGVycyhjaGFyW10gc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nQ29uc2lzdHNPZkphdmFJZGVudGlmaWVyQ2hhcmFjdGVyc18oc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIHN0cmluZyBtdXN0IG5vdCBiZSBlbXB0eS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnNfKGNoYXJbXSBzdHJpbmcpIHsKLQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoc3RyaW5nWzBdKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSBzdHJpbmcubGVuZ3RoOyBpLS0gPiAxOyApIHsgIC8vIE5COiBlbmQgd2l0aCAxCi0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHN0cmluZ1tpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzTGVnYWxKYXZhSWRlbnRpZmllcihTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdDb25zaXN0c09mSmF2YUlkZW50aWZpZXJDaGFyYWN0ZXJzKHN0cmluZykKLQkJCQkmJiAhIEpBVkFfUkVTRVJWRURfV09SRFNfU0VULmNvbnRhaW5zKHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzTGVnYWxKYXZhSWRlbnRpZmllcihjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdDb25zaXN0c09mSmF2YUlkZW50aWZpZXJDaGFyYWN0ZXJzKHN0cmluZykKLQkJCQkmJiAhIEpBVkFfUkVTRVJWRURfV09SRFNfU0VULmNvbnRhaW5zKG5ldyBTdHJpbmcoc3RyaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgotCSAqIGJ5IHN1YnN0aXR1dGluZyBhbiB1bmRlcnNjb3JlICdfJyBmb3IgYW55IGludmFsaWQgY2hhcmFjdGVycwotCSAqIGluIHRoZSBzdHJpbmcgYW5kIGFwcGVuZGluZyBhbiB1bmRlcnNjb3JlICdfJyB0byB0aGUgc3RyaW5nIGlmCi0JICogaXQgaXMgYSBKYXZhIHJlc2VydmVkIHdvcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSmF2YUlkZW50aWZpZXIoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gY29udmVydFRvSmF2YUlkZW50aWZpZXIoc3RyaW5nLCAnXycpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIKLQkgKiBieSBzdWJzdGl0dXRpbmcgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgZm9yIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMKLQkgKiBpbiB0aGUgc3RyaW5nIGFuZCwgaWYgbmVjZXNzYXJ5LCBhcHBlbmRpbmcgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiB0byB0aGUgc3RyaW5nIHVudGlsIGl0IGlzIG5vdCBhIEphdmEgcmVzZXJ2ZWQgd29yZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihTdHJpbmcgc3RyaW5nLCBjaGFyIGMpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWlmIChKQVZBX1JFU0VSVkVEX1dPUkRTX1NFVC5jb250YWlucyhzdHJpbmcpKSB7Ci0JCQkvLyBhIHJlc2VydmVkIHdvcmQgaXMgYSB2YWxpZCBpZGVudGlmaWVyLCB3ZSBqdXN0IG5lZWQgdG8gdHdlYWsgaXQgYSBiaXQKLQkJCWNoZWNrQ2hhcklzSmF2YUlkZW50aWZpZXJQYXJ0KGMpOwotCQkJcmV0dXJuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKHN0cmluZyArIGMsIGMpOwotCQl9Ci0JCWNoYXJbXSBhcnJheSA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlyZXR1cm4gY29udmVydFRvSmF2YUlkZW50aWZpZXJfKGFycmF5LCBjKSA/IG5ldyBTdHJpbmcoYXJyYXkpIDogc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIKLQkgKiBieSBzdWJzdGl0dXRpbmcgYW4gdW5kZXJzY29yZSAnXycgZm9yIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMKLQkgKiBpbiB0aGUgc3RyaW5nIGFuZCBhcHBlbmRpbmcgYW4gdW5kZXJzY29yZSAnXycgdG8gdGhlIHN0cmluZyBpZgotCSAqIGl0IGlzIGEgSmF2YSByZXNlcnZlZCB3b3JkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKHN0cmluZywgJ18nKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCi0JICogYnkgc3Vic3RpdHV0aW5nIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGZvciBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzCi0JICogaW4gdGhlIHN0cmluZyBhbmQsIGlmIG5lY2Vzc2FyeSwgYXBwZW5kaW5nIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogdG8gdGhlIHN0cmluZyB1bnRpbCBpdCBpcyBub3QgYSBKYXZhIHJlc2VydmVkIHdvcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFRvSmF2YUlkZW50aWZpZXIoY2hhcltdIHN0cmluZywgY2hhciBjKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKEpBVkFfUkVTRVJWRURfV09SRFNfU0VULmNvbnRhaW5zKG5ldyBTdHJpbmcoc3RyaW5nKSkpIHsKLQkJCS8vIGEgcmVzZXJ2ZWQgd29yZCBpcyBhIHZhbGlkIGlkZW50aWZpZXIsIHdlIGp1c3QgbmVlZCB0byB0d2VhayBpdCBhIGJpdAotCQkJY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclBhcnQoYyk7Ci0JCQlyZXR1cm4gY29udmVydFRvSmF2YUlkZW50aWZpZXIoQXJyYXlUb29scy5hZGQoc3RyaW5nLCBjKSwgYyk7Ci0JCX0KLQkJY29udmVydFRvSmF2YUlkZW50aWZpZXJfKHN0cmluZywgYyk7Ci0JCXJldHVybiBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBzdHJpbmcgbXVzdCBub3QgYmUgZW1wdHkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHN0cmluZyB3YXMgbW9kaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcl8oY2hhcltdIHN0cmluZywgY2hhciBjKSB7Ci0JCWJvb2xlYW4gbW9kID0gZmFsc2U7Ci0JCWlmICggISBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KHN0cmluZ1swXSkpIHsKLQkJCWNoZWNrQ2hhcklzSmF2YUlkZW50aWZpZXJTdGFydChjKTsKLQkJCXN0cmluZ1swXSA9IGM7Ci0JCQltb2QgPSB0cnVlOwotCQl9Ci0JCWNoZWNrQ2hhcklzSmF2YUlkZW50aWZpZXJQYXJ0KGMpOwotCQlmb3IgKGludCBpID0gc3RyaW5nLmxlbmd0aDsgaS0tID4gMTsgKSB7ICAvLyBOQjogZW5kIHdpdGggMQotCQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChzdHJpbmdbaV0pKSB7Ci0JCQkJc3RyaW5nW2ldID0gYzsKLQkJCQltb2QgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NoYXJJc0phdmFJZGVudGlmaWVyU3RhcnQoY2hhciBjKSB7Ci0JCWlmICggISBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGMpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIEphdmEgaWRlbnRpZmllciBzdGFydCBjaGFyOiAnIiArIGMgKyAnXCcnKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclBhcnQoY2hhciBjKSB7Ci0JCWlmICggISBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgSmF2YSBpZGVudGlmaWVyIHBhcnQgY2hhcjogJyIgKyBjICsgJ1wnJyk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgbWV0aG9kIG5hbWUgdG8gYSBwcm9wZXJ0eSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRHZXR0ZXJNZXRob2ROYW1lVG9Qcm9wZXJ0eU5hbWUoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJaW50IGJlZ2luSW5kZXggPSAwOwotCQlpZiAobWV0aG9kTmFtZS5zdGFydHNXaXRoKCJnZXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQliZWdpbkluZGV4ID0gMzsKLQkJfSBlbHNlIGlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImlzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJYmVnaW5JbmRleCA9IDI7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbWV0aG9kTmFtZTsgIC8vIHJldHVybiBtZXRob2QgbmFtZSB1bmNoYW5nZWQ/Ci0JCX0KLQkJcmV0dXJuIEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUobWV0aG9kTmFtZS5zdWJzdHJpbmcoYmVnaW5JbmRleCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgTmFtZVRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Ob25OdWxsQm9vbGVhblRyYW5zZm9ybWVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvTm9uTnVsbEJvb2xlYW5UcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2I1OWI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Ob25OdWxsQm9vbGVhblRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEEgPGNvZGU+Tm9uTnVsbEJvb2xlYW5UcmFuc2Zvcm1lcjwvY29kZT4gd2lsbCB0cmFuc2Zvcm0gYSBwb3NzaWJseS1udWxsCi0gKiB7QGxpbmsgQm9vbGVhbn0gdG8gYSBub24tbnVsbCB7QGxpbmsgQm9vbGVhbn06PHVsPgotICogPGxpPldoZW4gdGhlIG9yaWdpbmFsIHtAbGluayBCb29sZWFufSBpcyA8ZW0+bm90PC9lbT4gPGNvZGU+bnVsbDwvY29kZT4sCi0gKiB0aGUgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4gaXQgdW5jaGFuZ2VkLgotICogPGxpPldoZW4gdGhlIG9yaWdpbmFsIHtAbGluayBCb29sZWFufSBpcyA8Y29kZT5udWxsPC9jb2RlPiwKLSAqIHRoZSB0cmFuc2Zvcm1lciB3aWxsIHJldHVybiBpdHMgY2xpZW50LXNwZWNpZmllZCAibnVsbCB2YWx1ZSIKLSAqICh7QGxpbmsgQm9vbGVhbiNUUlVFfSBvciB7QGxpbmsgQm9vbGVhbiNGQUxTRX0pLgotICogPC91bD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5vbk51bGxCb29sZWFuVHJhbnNmb3JtZXIKLQlpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPEJvb2xlYW4sIEJvb2xlYW4+Ci17Ci0JLy8gbm90IG51bGwKLQlwcml2YXRlIGZpbmFsIEJvb2xlYW4gbnVsbFZhbHVlOwotCi0JLyoqCi0JICogQSB7QGxpbmsgVHJhbnNmb3JtZXJ9IHRoYXQgd2lsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHtAbGluayBCb29sZWFufSB3aGVuCi0JICogaXQgaXMgbm9uLTxjb2RlPm51bGw8L2NvZGU+OyBvdGhlcndpc2UgdGhlIHtAbGluayBUcmFuc2Zvcm1lcn0gd2lsbCByZXR1cm4KLQkgKiB7QGxpbmsgQm9vbGVhbiNUUlVFfS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zZm9ybWVyPEJvb2xlYW4sIEJvb2xlYW4+IFRSVUUgPSBuZXcgTm9uTnVsbEJvb2xlYW5UcmFuc2Zvcm1lcihCb29sZWFuLlRSVUUpOwotCi0JLyoqCi0JICogQSB7QGxpbmsgVHJhbnNmb3JtZXJ9IHRoYXQgd2lsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHtAbGluayBCb29sZWFufSB3aGVuCi0JICogaXQgaXMgbm9uLTxjb2RlPm51bGw8L2NvZGU+OyBvdGhlcndpc2UgdGhlIHtAbGluayBUcmFuc2Zvcm1lcn0gd2lsbCByZXR1cm4KLQkgKiB7QGxpbmsgQm9vbGVhbiNGQUxTRX0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lcjxCb29sZWFuLCBCb29sZWFuPiBGQUxTRSA9IG5ldyBOb25OdWxsQm9vbGVhblRyYW5zZm9ybWVyKEJvb2xlYW4uRkFMU0UpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgdHJhbnNmb3JtZXIgdGhhdCB3aWxsIHJldHVybiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlmIHRoZSBvcmlnaW5hbAotCSAqIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LiBUaHJvdyBhIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0gaWYgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1lcjxCb29sZWFuLCBCb29sZWFuPiB2YWx1ZU9mKEJvb2xlYW4gYikgewotCQlyZXR1cm4gdmFsdWVPZihiLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB0cmFuc2Zvcm1lciB0aGF0IHdpbGwgcmV0dXJuIHRoZSB7QGxpbmsgQm9vbGVhbn0gY29ycmVzcG9uZGluZwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgaWYgdGhlIG9yaWdpbmFsIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1lcjxCb29sZWFuLCBCb29sZWFuPiB2YWx1ZU9mKGJvb2xlYW4gYikgewotCQlyZXR1cm4gYiA/IFRSVUUgOiBGQUxTRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgb25seSAyIGNvbnN0YW50IHZlcnNpb25zLgotCSAqLwotCXByaXZhdGUgTm9uTnVsbEJvb2xlYW5UcmFuc2Zvcm1lcihCb29sZWFuIG51bGxWYWx1ZSkgewotCQlzdXBlcigpOwotCQlpZiAobnVsbFZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubnVsbFZhbHVlID0gbnVsbFZhbHVlOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIHRyYW5zZm9ybShCb29sZWFuIGIpIHsKLQkJcmV0dXJuIChiICE9IG51bGwpID8gYiA6IHRoaXMubnVsbFZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubnVsbFZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Ob3RCb29sZWFuVHJhbnNmb3JtZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Ob3RCb29sZWFuVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk4ZjIyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvTm90Qm9vbGVhblRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEEgPGNvZGU+Tm90Qm9vbGVhblRyYW5zZm9ybWVyPC9jb2RlPiB3aWxsIHRyYW5zZm9ybSBhCi0gKiB7QGxpbmsgQm9vbGVhbn0gdG8gaXRzIE5PVCB2YWx1ZTo8dWw+Ci0gKiA8bGk+SWYgdGhlIG9yaWdpbmFsIHtAbGluayBCb29sZWFufSBpcyB7QGxpbmsgQm9vbGVhbiNUUlVFfSwKLSAqIHRoZSB0cmFuc2Zvcm1lciB3aWxsIHJldHVybiB7QGxpbmsgQm9vbGVhbiNGQUxTRX0uCi0gKiA8bGk+SWYgdGhlIG9yaWdpbmFsIHtAbGluayBCb29sZWFufSBpcyB7QGxpbmsgQm9vbGVhbiNGQUxTRX0sCi0gKiB0aGUgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4ge0BsaW5rIEJvb2xlYW4jVFJVRX0uCi0gKiA8bGk+SWYgdGhlIG9yaWdpbmFsIHtAbGluayBCb29sZWFufSBpcyA8Y29kZT5udWxsPC9jb2RlPiwKLSAqIHRoZSB0cmFuc2Zvcm1lciB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOb3RCb29sZWFuVHJhbnNmb3JtZXIKLQlpbXBsZW1lbnRzIEJpZGlUcmFuc2Zvcm1lcjxCb29sZWFuLCBCb29sZWFuPgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVRyYW5zZm9ybWVyPEJvb2xlYW4sIEJvb2xlYW4+IElOU1RBTkNFID0gbmV3IE5vdEJvb2xlYW5UcmFuc2Zvcm1lcigpOwotCi0JcHVibGljIHN0YXRpYyBCaWRpVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQm9vbGVhbj4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JcHJpdmF0ZSBOb3RCb29sZWFuVHJhbnNmb3JtZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gdHJhbnNmb3JtKEJvb2xlYW4gYikgewotCQlyZXR1cm4gKGIgPT0gbnVsbCkgPyBudWxsIDogQm9vbGVhblRvb2xzLm5vdChiKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiByZXZlcnNlVHJhbnNmb3JtKEJvb2xlYW4gYikgewotCQlyZXR1cm4gKGIgPT0gbnVsbCkgPyBudWxsIDogQm9vbGVhblRvb2xzLm5vdChiKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL05vdE51bGxGaWx0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Ob3ROdWxsRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NjMyNWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL05vdE51bGxGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLQotLyoqCi0gKiBUaGlzIGZpbHRlciBhY2NlcHRzIG9ubHkgbm9uLW51bGwgb2JqZWN0cy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5vdE51bGxGaWx0ZXI8VD4KLQlpbXBsZW1lbnRzIEZpbHRlcjxUPiwgU2VyaWFsaXphYmxlCi17Ci0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbHRlciBJTlNUQU5DRSA9IG5ldyBOb3ROdWxsRmlsdGVyKCk7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxSPiBGaWx0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JcHJpdmF0ZSBOb3ROdWxsRmlsdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vIGFjY2VwdCBvbmx5IG5vbi1udWxsIG9iamVjdHMKLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoVCBvKSB7Ci0JCXJldHVybiBvICE9IG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9OdWxsTGlzdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL051bGxMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NzQ4NWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL051bGxMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBICJudWxsIiBsaXN0IGlzIGEgYml0IGRpZmZlcmVudCBmcm9tIGFuICJlbXB0eSIgbGlzdDogaXQgYWxsb3dzIGNsaWVudHMgdG8KLSAqIGFkZC9yZW1vdmUgZWxlbWVudHMgdG8vZnJvbSBpdCBidXQgbmV2ZXIgY2hhbmdlcy4gVGhpcyBpcyB1c2VmdWwKLSAqIGZvciBwYXNzaW5nIHRvIG1ldGhvZHMgdGhhdCByZXF1aXJlIGEgImNvbGxlY3RpbmcgcGFyYW1ldGVyIiBidXQgdGhlCi0gKiBjbGllbnQgd2lsbCBpZ25vcmUgdGhlIHJlc3VsdGluZyAiY29sbGVjdGlvbiIuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsTGlzdDxFPgotCWltcGxlbWVudHMgTGlzdDxFPiwgU2VyaWFsaXphYmxlCi17Ci0KLQkvLyBzaW5nbGV0b24KLQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bGxMaXN0IElOU1RBTkNFID0gbmV3IE51bGxMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxMaXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJLy8gaWdub3JlCi0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiBmYWxzZTsgIC8vIHRoZSBsaXN0IGRpZCBub3QgY2hhbmdlCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCS8vIGlnbm9yZQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIGMuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiBmYWxzZTsgIC8vIHRoZSBsaXN0IGRpZCBub3QgY2hhbmdlCi0JfQotCi0JcHVibGljIEUgcmVtb3ZlKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6IDAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgbGlzdCBkaWQgbm90IGNoYW5nZQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgRSBzZXQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIExpc3Q8RT4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gRU1QVFlfT0JKRUNUX0FSUkFZOwotCX0KLQotCXB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGEpIHsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9PYmplY3RSZWZlcmVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9PYmplY3RSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI5NGNjMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvT2JqZWN0UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFByb3ZpZGUgYSBjb250YWluZXIgZm9yIHBhc3NpbmcgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIGNoYW5nZWQgYnkgdGhlIHJlY2lwaWVudC4KLSAqIAotICogQHNlZSBTeW5jaHJvbml6ZWRPYmplY3QKLSAqLwotcHVibGljIGNsYXNzIE9iamVjdFJlZmVyZW5jZTxWPgotCWltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyB2YWx1ZS4gKi8KLQlwcml2YXRlIHZvbGF0aWxlIFYgdmFsdWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGFuIG9iamVjdCByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIE9iamVjdFJlZmVyZW5jZShWIHZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gb2JqZWN0IHJlZmVyZW5jZSB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0UmVmZXJlbmNlKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlLgotCSAqLwotCXB1YmxpYyBWIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbHVlRXF1YWxzKFYgdikgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy52YWx1ZSwgdik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90IGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsdWVOb3RFcXVhbChWIHYpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnZhbHVlLCB2KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc051bGwoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm90TnVsbCgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlLgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgc2V0VmFsdWUoViB2YWx1ZSkgewotCQlWIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgc2V0TnVsbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdFJlZmVyZW5jZTxWPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJT2JqZWN0UmVmZXJlbmNlPFY+IGNsb25lID0gKE9iamVjdFJlZmVyZW5jZTxWPikgc3VwZXIuY2xvbmUoKTsKLQkJCXJldHVybiBjbG9uZTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIE9iamVjdFJlZmVyZW5jZTw/PikgJiYKLQkJCVRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMudmFsdWUsICgoT2JqZWN0UmVmZXJlbmNlPD8+KSBvYmopLnZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyAwIDogdGhpcy52YWx1ZS5oYXNoQ29kZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAnWycgKyBTdHJpbmcudmFsdWVPZih0aGlzLnZhbHVlKSArICddJzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9RdWV1ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1F1ZXVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZGM1NDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1F1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogSW50ZXJmYWNlIGRlZmluaW5nIHRoZSBjbGFzc2ljIHF1ZXVlIGJlaGF2aW9yLAotICogd2l0aG91dCB0aGUgYmFja2Rvb3JzIGFsbG93ZWQgYnkge0BsaW5rIGphdmEudXRpbC5RdWV1ZX0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgY29udGFpbmVkIGJ5IHRoZSBxdWV1ZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFF1ZXVlPEU+IHsKLQotCS8qKgotCSAqICJFbnF1ZXVlIiB0aGUgc3BlY2lmaWVkIGl0ZW0gdG8gdGhlIHRhaWwgb2YgdGhlIHF1ZXVlLgotCSAqLwotCXZvaWQgZW5xdWV1ZShFIG8pOwotCi0JLyoqCi0JICogIkRlcXVldWUiIGFuIGl0ZW0gZnJvbSB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCi0JICovCi0JRSBkZXF1ZXVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW0gb24gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlCi0JICogd2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRoZSBxdWV1ZS4KLQkgKi8KLQlFIHBlZWsoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBxdWV1ZSBpcyBlbXB0eS4KLQkgKi8KLQlib29sZWFuIGlzRW1wdHkoKTsKLQotCi0JZmluYWwgY2xhc3MgRW1wdHk8RT4gaW1wbGVtZW50cyBRdWV1ZTxFPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBRdWV1ZSBJTlNUQU5DRSA9IG5ldyBFbXB0eSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8VD4gUXVldWU8VD4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEVtcHR5KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbnF1ZXVlKEUgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIEUgZGVxdWV1ZSgpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIEUgcGVlaygpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SYW5nZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNzNhZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVGhpcyBzaW1wbGUgY29udGFpbmVyIGNsYXNzIHNpbXBseSBwdXRzIGEgYml0IG9mIHNlbWFudGljcwotICogYXJvdW5kIGEgcGFpciBvZiBudW1iZXJzLgotICovCi1wdWJsaWMgY2xhc3MgUmFuZ2UKLQlpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIFRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgcmFuZ2UuICovCi0JcHVibGljIGZpbmFsIGludCBzdGFydDsKLQotCS8qKiBUaGUgZW5kaW5nIGluZGV4IG9mIHRoZSByYW5nZS4gKi8KLQlwdWJsaWMgZmluYWwgaW50IGVuZDsKLQotCS8qKgotCSAqIFRoZSBzaXplIGNhbiBiZSBuZWdhdGl2ZSBpZiB0aGUgZW5kaW5nIGluZGV4Ci0JICogaXMgbGVzcyB0aGFuIHRoZSBzdGFydGluZyBpbmRleC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgaW50IHNpemU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggdGhlIHNwZWNpZmllZCBzdGFydCBhbmQgZW5kLAotCSAqIGJvdGggb2Ygd2hpY2ggYXJlIGltbXV0YWJsZS4KLQkgKi8KLQlwdWJsaWMgUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhcnQgPSBzdGFydDsKLQkJdGhpcy5lbmQgPSBlbmQ7Ci0JCXRoaXMuc2l6ZSA9IGVuZCAtIHN0YXJ0ICsgMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcmFuZ2UgaW5jbHVkZXMgdGhlIHNwZWNpZmllZAotCSAqIGluZGV4LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVzKGludCBpbmRleCkgewotCQlyZXR1cm4gKHRoaXMuc3RhcnQgPD0gaW5kZXgpICYmIChpbmRleCA8PSB0aGlzLmVuZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICh0aGlzID09IG8pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIFJhbmdlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVJhbmdlIG90aGVyUmFuZ2UgPSAoUmFuZ2UpIG87Ci0JCXJldHVybiAodGhpcy5zdGFydCA9PSBvdGhlclJhbmdlLnN0YXJ0KQotCQkJJiYgKHRoaXMuZW5kID09IG90aGVyUmFuZ2UuZW5kKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5zdGFydCBeIHRoaXMuZW5kOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBSYW5nZSBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoUmFuZ2UpIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICdbJyArIHRoaXMuc3RhcnQgKyAiLCAiICsgdGhpcy5lbmQgKyAnXSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SZWZsZWN0aW9uVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SZWZsZWN0aW9uVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiYjUzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvUmVmbGVjdGlvblRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBtZXRob2RzIHJlbGF0ZWQgdG8gdGhlIDxjb2RlPmphdmEubGFuZy5yZWZsZWN0PC9jb2RlPiBwYWNrYWdlLgotICogVGhlc2UgbWV0aG9kcyBwcm92aWRlIHNob3J0Y3V0cyBmb3IgbWFuaXB1bGF0aW5nIG9iamVjdHMgdmlhCi0gKiByZWZsZWN0aW9uOyBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggZmllbGRzIGFuZC9vciBtZXRob2RzIHRoYXQKLSAqIGFyZSBub3QgcHVibGljbHkgYWNjZXNzaWJsZSBvciBhcmUgaW5oZXJpdGVkLgotICogPHA+Ci0gKiBJbiBtb3N0IGNhc2VzLCBhbGwgZXhjZXB0aW9ucyBhcmUgaGFuZGxlZCBhbmQgd3JhcHBlZCBpbgotICoge0BsaW5rIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9ufXM7IHNvIHRoZXNlIG1ldGhvZHMgc2hvdWxkCi0gKiBiZSB1c2VkIHdoZW4gdGhlcmUgc2hvdWxkIGJlIG5vIHByb2JsZW1zIHVzaW5nIHJlZmxlY3Rpb24gKGkuZS4KLSAqIHRoZSByZWZlcmVuY2VkIG1lbWJlcnMgYXJlIHByZXN1bWFibHkgcHJlc2VudCBldGMuKS4KLSAqIDxwPgotICogVGhlcmUgYXJlIGFsc28gYSBudW1iZXIgb2YgbWV0aG9kcyB3aG9zZSBuYW1lcwotICogZW5kIHdpdGggYW4gdW5kZXJzY29yZS4gVGhlc2UgbWV0aG9kcyBkZWNsYXJlIHRoZSBleHBlY3RlZCBjaGVja2VkCi0gKiBleGNlcHRpb25zIChlLmcuIHtAbGluayBOb1N1Y2hNZXRob2RFeGNlcHRpb259LCB7QGxpbmsgTm9TdWNoRmllbGRFeGNlcHRpb259KS4KLSAqIFRoZXNlIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gcHJvYmUKLSAqIGZvciBtZXRob2RzLCBmaWVsZHMsIGV0Yy4gdGhhdCBzaG91bGQgYmUgcHJlc2VudCBidXQgbWlnaHQgbm90IGJlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVmbGVjdGlvblRvb2xzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBaRVJPX1BBUkFNRVRFUl9UWVBFUyA9IG5ldyBDbGFzc1swXTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdFtdIFpFUk9fQVJHVU1FTlRTID0gbmV3IE9iamVjdFswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTdHJpbmdUb29scy5DUjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gVk9JRF9DTEFTUyA9IHZvaWQuY2xhc3M7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczxqYXZhLmxhbmcuVm9pZD4gVk9JRF9XUkFQUEVSX0NMQVNTID0gamF2YS5sYW5nLlZvaWQuY2xhc3M7Ci0KLQotCS8vICoqKioqKioqKiogZmllbGRzICoqKioqKioqKioKLQotCS8qKgotCSAqIEdldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZ2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRGaWVsZFZhbHVlXyhvYmplY3QsIGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIGV4KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogPHA+Ci0JICogPGNvZGU+T2JqZWN0LmdldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZV8oT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkKLQkJdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0RmllbGRfKG9iamVjdCwgZmllbGROYW1lKS5nZXQob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIGNsYXNzIGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldFN0YXRpY0ZpZWxkVmFsdWVfKGphdmFDbGFzcywgZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgZXgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgY2xhc3MgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFN0YXRpY0ZpZWxkVmFsdWVfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkKLQkJdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0RmllbGRfKGphdmFDbGFzcywgZmllbGROYW1lKS5nZXQobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCwgZmllbGQgbmFtZSwgYW5kIG5ldyB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5zZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlzZXRGaWVsZFZhbHVlXyhvYmplY3QsIGZpZWxkTmFtZSwgdmFsdWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBleCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCwgZmllbGQgbmFtZSwgYW5kIG5ldyB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5zZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZpZWxkVmFsdWVfKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCB2YWx1ZSkKLQkJdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0JewotCQlnZXRGaWVsZF8ob2JqZWN0LCBmaWVsZE5hbWUpLnNldChvYmplY3QsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIGNsYXNzLCBmaWVsZCBuYW1lLCBhbmQgbmV3IHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3Muc2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlzZXRTdGF0aWNGaWVsZFZhbHVlXyhqYXZhQ2xhc3MsIGZpZWxkTmFtZSwgdmFsdWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBleCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBjbGFzcywgZmllbGQgbmFtZSwgYW5kIG5ldyB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLnNldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdGljRmllbGRWYWx1ZV8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgdmFsdWUpCi0JCXRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotCXsKLQkJZ2V0RmllbGRfKGphdmFDbGFzcywgZmllbGROYW1lKS5zZXQobnVsbCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBmaWVsZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogZGVmaW5lIHRoZSBmaWVsZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGQgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZ2V0RmllbGQoU3RyaW5nIGZpZWxkTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBnZXRGaWVsZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RmllbGRfKG9iamVjdCwgZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBkZWZpbmUgdGhlIGZpZWxkLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZCBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5nZXRGaWVsZChTdHJpbmcgZmllbGROYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkIGdldEZpZWxkXyhPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKQotCQl0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRGaWVsZF8ob2JqZWN0LmdldENsYXNzKCksIGZpZWxkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgYW5kIGZpZWxkIG5hbWUuCi0JICogSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogZGVmaW5lIHRoZSBmaWVsZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGQgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkIGdldEZpZWxkKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldEZpZWxkXyhqYXZhQ2xhc3MsIGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGFuZCBmaWVsZCBuYW1lLgotCSAqIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGRlZmluZSB0aGUgZmllbGQsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGZpZWxkIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBnZXRGaWVsZF8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKQotCQl0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQl7Ci0JCUZpZWxkIGZpZWxkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpZWxkID0gamF2YUNsYXNzLmdldERlY2xhcmVkRmllbGQoZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCUNsYXNzPD8+IHN1cGVyY2xhc3MgPSBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewotCQkJCXRocm93IGV4OwotCQkJfQotCQkJcmV0dXJuIGdldEZpZWxkXyhzdXBlcmNsYXNzLCBmaWVsZE5hbWUpOyAgLy8gcmVjdXJzZQotCQl9Ci0JCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBmaWVsZHMgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBjbGFzcywgaW5jbHVkaW5nIGluaGVyaXRlZCBmaWVsZHMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRBbGxGaWVsZHMoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPEZpZWxkPiBnZXRBbGxGaWVsZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCUFycmF5TGlzdDxGaWVsZD4gZmllbGRzID0gbmV3IEFycmF5TGlzdDxGaWVsZD4oKTsKLQkJZm9yIChDbGFzczw/PiB0ZW1wQ2xhc3MgPSBqYXZhQ2xhc3M7IHRlbXBDbGFzcyAhPSBudWxsOyB0ZW1wQ2xhc3MgPSB0ZW1wQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKSB7Ci0JCQlhZGREZWNsYXJlZEZpZWxkc1RvKHRlbXBDbGFzcywgZmllbGRzKTsKLQkJfQotCQlyZXR1cm4gZmllbGRzOwotCX0KLQotCS8qCi0JICogQWRkIHRoZSBkZWNsYXJlZCBmaWVsZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGREZWNsYXJlZEZpZWxkc1RvKENsYXNzPD8+IGphdmFDbGFzcywgQXJyYXlMaXN0PEZpZWxkPiBmaWVsZHMpIHsKLQkJZm9yIChGaWVsZCBmaWVsZCA6IGdldERlY2xhcmVkRmllbGRzKGphdmFDbGFzcykpIHsKLQkJCWZpZWxkcy5hZGQoZmllbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBmaWVsZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRBY2Nlc3NpYmxlRGVjbGFyZWRGaWVsZHMoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPEZpZWxkPiBnZXREZWNsYXJlZEZpZWxkcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJRmllbGRbXSBmaWVsZHMgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQkJZm9yIChGaWVsZCBmaWVsZCA6IGZpZWxkcykgewotCQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJfQotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RmllbGQ+KGZpZWxkcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5leGVjdXRlKFN0cmluZyBtZXRob2ROYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX0FSR1VNRU5UUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBvbmUtYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgYXJndW1lbnQuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCkgewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge2FyZ3VtZW50fSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBhcmd1bWVudHMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cykgewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChnZXRNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgcmVjZWl2ZXIsIGFyZ3VtZW50cyk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBhcmd1bWVudHMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBjYWNoZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE1ldGhvZCBtZXRob2QsIE9iamVjdCByZWNlaXZlciwgT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWV0aG9kLmludm9rZShyZWNlaXZlciwgYXJndW1lbnRzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIG1ldGhvZCwgZXgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXRob2QgKyBDUiArIGV4LmdldFRhcmdldEV4Y2VwdGlvbigpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGRlZmluZWQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZF8oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSkKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2RfKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgYXJndW1lbnQuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGRlZmluZWQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kXyhPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kXyhyZWNlaXZlciwgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge2FyZ3VtZW50fSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBhcmd1bWVudHMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGRlZmluZWQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kXyhPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRNZXRob2RfKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcykuaW52b2tlKHJlY2VpdmVyLCBhcmd1bWVudHMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBzdGF0aWMgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSBjbGFzcyBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5leGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIGFyZ3VtZW50LgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCkgewotCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHthcmd1bWVudH0pOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIGFyZ3VtZW50cy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmV4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kXyhqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBhcmd1bWVudHMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBleCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBleCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGJ1aWxkRnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcykgKyBDUiArIGV4LmdldFRhcmdldEV4Y2VwdGlvbigpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgc3RhdGljIG1ldGhvZCwKLQkgKiBnaXZlbiB0aGUgY2xhc3MgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZF8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fQVJHVU1FTlRTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBhcmd1bWVudC4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmV4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZF8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZF8oamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7YXJndW1lbnR9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBhcmd1bWVudHMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5leGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2RfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cykKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldFN0YXRpY01ldGhvZF8oamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcykuaW52b2tlKG51bGwsIGFyZ3VtZW50cyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGdldE1ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgewotCQlyZXR1cm4gZ2V0TWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9KTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kXyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0TWV0aG9kXyhqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kXyhqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZF8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCXsKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltZXRob2QgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCUNsYXNzPD8+IHN1cGVyY2xhc3MgPSBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewotCQkJCXRocm93IGV4OwotCQkJfQotCQkJLy8gcmVjdXJzZQotCQkJcmV0dXJuIGdldE1ldGhvZF8oc3VwZXJjbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9Ci0JCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlyZXR1cm4gbWV0aG9kOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGdldE1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdAotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZF8oT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRNZXRob2RfKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCwgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGdldE1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZF8oT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRNZXRob2RfKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHsKLQkJcmV0dXJuIGdldE1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RfKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0TWV0aG9kXyhvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgc3RhdGljIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldFN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBnZXRTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGdldFN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlc30pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0U3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRTdGF0aWNNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0U3RhdGljTWV0aG9kXyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0U3RhdGljTWV0aG9kXyhqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgc3RhdGljIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldFN0YXRpY01ldGhvZF8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZXMpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRTdGF0aWNNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGVzfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RhdGljIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRTdGF0aWNNZXRob2RfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCU1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMobWV0aG9kLmdldE1vZGlmaWVycygpKSkgewotCQkJcmV0dXJuIG1ldGhvZDsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKGJ1aWxkRnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIG1ldGhvZHMgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBjbGFzcywgaW5jbHVkaW5nIGluaGVyaXRlZCBtZXRob2RzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcyBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldEFsbE1ldGhvZHMoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPE1ldGhvZD4gZ2V0QWxsTWV0aG9kcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJQXJyYXlMaXN0PE1ldGhvZD4gbWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kPigpOwotCQlmb3IgKENsYXNzPD8+IHRlbXBDbGFzcyA9IGphdmFDbGFzczsgdGVtcENsYXNzICE9IG51bGw7IHRlbXBDbGFzcyA9IHRlbXBDbGFzcy5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCWFkZERlY2xhcmVkTWV0aG9kc1RvKHRlbXBDbGFzcywgbWV0aG9kcyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZHM7Ci0JfQotCi0JLyoKLQkgKiBBZGQgdGhlIGRlY2xhcmVkIG1ldGhvZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGREZWNsYXJlZE1ldGhvZHNUbyhDbGFzczw/PiBqYXZhQ2xhc3MsIEFycmF5TGlzdDxNZXRob2Q+IG1ldGhvZHMpIHsKLQkJZm9yIChNZXRob2QgbWV0aG9kIDogZ2V0RGVjbGFyZWRNZXRob2RzKGphdmFDbGFzcykpIHsKLQkJCW1ldGhvZHMuYWRkKG1ldGhvZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIG1ldGhvZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0QWNjZXNzaWJsZURlY2xhcmVkTWV0aG9kcygpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8TWV0aG9kPiBnZXREZWNsYXJlZE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCWZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLQkJCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQl9Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxNZXRob2Q+KG1ldGhvZHMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3RvcgotCSAqIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3IgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXREZWZhdWx0Q29uc3RydWN0b3IoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBnZXREZWZhdWx0Q29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBnZXRDb25zdHJ1Y3RvcihqYXZhQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvciBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldENvbnN0cnVjdG9yKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZ2V0Q29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBnZXRDb25zdHJ1Y3RvcihqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvciBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldENvbnN0cnVjdG9yKENsYXNzPD8+IHBhcmFtZXRlclR5cGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGdldENvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgewotCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3IoamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9yIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0Q29uc3RydWN0b3IoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZ2V0Q29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3JfKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcyksIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IKLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9yIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0RGVmYXVsdENvbnN0cnVjdG9yKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZ2V0RGVmYXVsdENvbnN0cnVjdG9yXyhDbGFzczxUPiBqYXZhQ2xhc3MpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRDb25zdHJ1Y3Rvcl8oamF2YUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3RvcgotCSAqIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3IgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRDb25zdHJ1Y3RvcigpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGdldENvbnN0cnVjdG9yXyhDbGFzczxUPiBqYXZhQ2xhc3MpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRDb25zdHJ1Y3Rvcl8oamF2YUNsYXNzLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3IgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRDb25zdHJ1Y3RvcihDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBnZXRDb25zdHJ1Y3Rvcl8oQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3JfKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvciBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldENvbnN0cnVjdG9yKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGdldENvbnN0cnVjdG9yXyhDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCUNvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yID0gamF2YUNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IocGFyYW1ldGVyVHlwZXMpOwotCQljb25zdHJ1Y3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlyZXR1cm4gY29uc3RydWN0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBjb25zdHJ1Y3RvcnMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcnMgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRBY2Nlc3NpYmxlRGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBJdGVyYWJsZTxDb25zdHJ1Y3RvcjxUPj4gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoQ2xhc3M8VD4gamF2YUNsYXNzKSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlDb25zdHJ1Y3RvcjxUPltdIGNvbnN0cnVjdG9ycyA9IChDb25zdHJ1Y3RvcjxUPltdKSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTsKLQkJZm9yIChDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvciA6IGNvbnN0cnVjdG9ycykgewotCQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJfQotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8Q29uc3RydWN0b3I8VD4+KGNvbnN0cnVjdG9ycyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNsYXNzICh3aXRob3V0IHRoZSBjaGVja2VkIGV4Y2VwdGlvbikuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oY2xhc3NOYW1lLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY2xhc3MgKHdpdGhvdXQgdGhlIGNoZWNrZWQgZXhjZXB0aW9uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lLCBib29sZWFuIGluaXRpYWxpemUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemUsIGNsYXNzTG9hZGVyKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oY2xhc3NOYW1lLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRBcnJheURlcHRoKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0QXJyYXlEZXB0aChDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaW50IGRlcHRoID0gMDsKLQkJd2hpbGUgKGphdmFDbGFzcy5pc0FycmF5KCkpIHsKLQkJCWRlcHRoKys7Ci0JCQlqYXZhQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJlbGVtZW50IHR5cGUiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkgdHlwZS4KLQkgKiBBIG5vbi1hcnJheSB0eXBlIHNpbXBseSByZXR1cm5zIGl0c2VsZi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRFbGVtZW50VHlwZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0RWxlbWVudFR5cGUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXdoaWxlIChqYXZhQ2xhc3MuaXNBcnJheSgpKSB7Ci0JCQlqYXZhQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBqYXZhQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB3cmFwcGVyIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZAotCSAqIHByaW1pdGl2ZSBjbGFzcy4gUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBpcyBub3QgYSBwcmltaXRpdmUgY2xhc3MuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0V3JhcHBlckNsYXNzKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRXcmFwcGVyQ2xhc3MoQ2xhc3M8Pz4gcHJpbWl0aXZlQ2xhc3MpIHsKLQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJaWYgKHByaW1pdGl2ZS5qYXZhQ2xhc3MgPT0gcHJpbWl0aXZlQ2xhc3MpIHsKLQkJCQlyZXR1cm4gcHJpbWl0aXZlLndyYXBwZXJDbGFzczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlIHdyYXBwZXIKLQkgKiBjbGFzcyAoaS5lLiA8Y29kZT5qYXZhLmxhbmcuVm9pZDwvY29kZT4gb3Igb25lIG9mIHRoZSBwcmltaXRpdmUKLQkgKiB2YXJpYWJsZSB3cmFwcGVyIGNsYXNzZXMsIDxjb2RlPmphdmEubGFuZy5Cb29sZWFuPC9jb2RlPiwKLQkgKiA8Y29kZT5qYXZhLmxhbmcuSW50ZWdlcjwvY29kZT4sIDxjb2RlPmphdmEubGFuZy5GbG9hdDwvY29kZT4sIGV0Yy4pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmlzUHJpbWl0aXZlV3JhcHBlcigpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc0lzUHJpbWl0aXZlV3JhcHBlcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaWYgKGphdmFDbGFzcy5pc0FycmF5KCkgfHwgKGphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCkgPiBNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWZvciAoUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFBSSU1JVElWRVMpIHsKLQkJCWlmIChqYXZhQ2xhc3MgPT0gcHJpbWl0aXZlLndyYXBwZXJDbGFzcykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUgd3JhcHBlcgotCSAqIGNsYXNzIChpLmUuIDxjb2RlPmphdmEubGFuZy5Cb29sZWFuPC9jb2RlPiwKLQkgKiA8Y29kZT5qYXZhLmxhbmcuSW50ZWdlcjwvY29kZT4sIDxjb2RlPmphdmEubGFuZy5GbG9hdDwvY29kZT4sIGV0Yy4sCi0JICogYnV0IG5vdCA8Y29kZT5qYXZhLmxhbmcuVm9pZDwvY29kZT4pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjbGFzc0lzUHJpbWl0aXZlV3JhcHBlcihqYXZhQ2xhc3MpCi0JCQkmJiAoamF2YUNsYXNzICE9IFZPSURfV1JBUFBFUl9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gPGNvZGU+Ym9vbGVhbjwvY29kZT4sIDxjb2RlPmludDwvY29kZT4sCi0JICogPGNvZGU+ZmxvYXQ8L2NvZGU+LCBldGMuLCBidXQgbm90IDxjb2RlPnZvaWQ8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiA8Y29kZT52b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZTwvY29kZT4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5pc1ZhcmlhYmxlUHJpbWl0aXZlKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGphdmFDbGFzcy5pc1ByaW1pdGl2ZSgpICYmIChqYXZhQ2xhc3MgIT0gVk9JRF9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmltaXRpdmUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgcHJpbWl0aXZlIGNsYXNzIGNvZGUuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY29kZQotCSAqIGlzIG5vdCBhIHByaW1pdGl2ZSBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0Q2xhc3NGb3JDb2RlKGludCBjbGFzc0NvZGUpIHsKLQkJcmV0dXJuIGdldENsYXNzRm9yQ29kZSgoY2hhcikgY2xhc3NDb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByaW1pdGl2ZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgY2xhc3MgY29kZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjb2RlCi0JICogaXMgbm90IGEgcHJpbWl0aXZlIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzc0ZvckNvZGUoY2hhciBjbGFzc0NvZGUpIHsKLQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJaWYgKHByaW1pdGl2ZS5jb2RlID09IGNsYXNzQ29kZSkgewotCQkJCXJldHVybiBwcmltaXRpdmUuamF2YUNsYXNzOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgY2xhc3MuCi0JICogUmV0dXJuIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBpcyBub3QgYSBwcmltaXRpdmUgY2xhc3MuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIGdldENvZGVGb3JDbGFzcyhDbGFzczw/PiBwcmltaXRpdmVDbGFzcykgewotCQlpZiAoKCAhIHByaW1pdGl2ZUNsYXNzLmlzQXJyYXkoKSkgJiYgKHByaW1pdGl2ZUNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKSA8PSBNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIKSkgewotCQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJCWlmIChwcmltaXRpdmUuamF2YUNsYXNzID09IHByaW1pdGl2ZUNsYXNzKSB7Ci0JCQkJCXJldHVybiBwcmltaXRpdmUuY29kZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc3RhbnRpYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIGFyZ3VtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc05hbWUsIHBhcmFtZXRlclR5cGUsIGFyZ3VtZW50LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBhcmd1bWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGFyZ3VtZW50cywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlciB0byBsb2FkIHRoZSBjbGFzcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc0Zvck5hbWUoY2xhc3NOYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIGFyZ3VtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50LCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NGb3JOYW1lKGNsYXNzTmFtZSwgZmFsc2UsIGNsYXNzTG9hZGVyKSwgcGFyYW1ldGVyVHlwZSwgYXJndW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIGFyZ3VtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cywgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzRm9yTmFtZShjbGFzc05hbWUsIGZhbHNlLCBjbGFzc0xvYWRlciksIHBhcmFtZXRlclR5cGVzLCBhcmd1bWVudHMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX0FSR1VNRU5UUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgYXJndW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHthcmd1bWVudH0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIGFyZ3VtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXdJbnN0YW5jZV8oamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcywgYXJndW1lbnRzKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgZXgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBleCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGJ1aWxkRnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSArIENSICsgZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGV4KTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlXyhDbGFzczxUPiBqYXZhQ2xhc3MpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBuZXdJbnN0YW5jZV8oamF2YUNsYXNzLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIGFyZ3VtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBuZXdJbnN0YW5jZV8oQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBuZXdJbnN0YW5jZV8oamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7YXJndW1lbnR9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBhcmd1bWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlXyhDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cykKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldENvbnN0cnVjdG9yXyhqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKS5uZXdJbnN0YW5jZShhcmd1bWVudHMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0eXBlIGRlY2xhcmF0aW9ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikKLQkJdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8odHlwZURlY2xhcmF0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIiwKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IGJ1aWxkVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXJldHVybiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbih0ZC5lbGVtZW50VHlwZU5hbWUsIHRkLmFycmF5RGVwdGgsIGNsYXNzTG9hZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIiwKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uXyhTdHJpbmcgdHlwZURlY2xhcmF0aW9uLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLQkJdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLQl7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IGJ1aWxkVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXJldHVybiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8odGQuZWxlbWVudFR5cGVOYW1lLCB0ZC5hcnJheURlcHRoLCBjbGFzc0xvYWRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHlwZURlY2xhcmF0aW9uIGJ1aWxkVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJdHlwZURlY2xhcmF0aW9uID0gU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pOwotCQlpbnQgYXJyYXlEZXB0aCA9IGdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKHR5cGVEZWNsYXJhdGlvbik7Ci0JCVN0cmluZyBlbGVtZW50VHlwZU5hbWUgPSBnZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb25fKHR5cGVEZWNsYXJhdGlvbiwgYXJyYXlEZXB0aCk7Ci0JCXJldHVybiBuZXcgVHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBkZXB0aCBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiI7IGUuZy48dWw+Ci0JICogPGxpPjxjb2RlPiJpbnRbXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+MTwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5TdHJpbmdbXVtdW10iPC9jb2RlPiByZXR1cm5zIDxjb2RlPjM8L2NvZGU+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRBcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2UodHlwZURlY2xhcmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogbm8gd2hpdGVzcGFjZSBpbiB0aGUgdHlwZSBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlpbnQgbGFzdCA9IHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSAtIDE7Ci0JCWludCBkZXB0aCA9IDA7Ci0JCWludCBjbG9zZSA9IGxhc3Q7Ci0JCXdoaWxlICh0eXBlRGVjbGFyYXRpb24uY2hhckF0KGNsb3NlKSA9PSAnXScpIHsKLQkJCWlmICh0eXBlRGVjbGFyYXRpb24uY2hhckF0KGNsb3NlIC0gMSkgPT0gJ1snKSB7Ci0JCQkJZGVwdGgrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCB0eXBlIGRlY2xhcmF0aW9uOiAiICsgdHlwZURlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2xvc2UgPSBsYXN0IC0gKGRlcHRoICogMik7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCB0eXBlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iOyBlLmcuPHVsPgotCSAqIDxsaT48Y29kZT4iaW50W10iPC9jb2RlPiByZXR1cm5zIDxjb2RlPiJpbnQiPC9jb2RlPgotCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLlN0cmluZ1tdW11bXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJdHlwZURlY2xhcmF0aW9uID0gU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pOwotCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uXyh0eXBlRGVjbGFyYXRpb24sIGdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKHR5cGVEZWNsYXJhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCB0eXBlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iOyBlLmcuPHVsPgotCSAqIDxsaT48Y29kZT4iaW50W10iPC9jb2RlPiByZXR1cm5zIDxjb2RlPiJpbnQiPC9jb2RlPgotCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLlN0cmluZ1tdW11bXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPgotCSAqIDwvdWw+Ci0JICogVXNlZnVsIGZvciBjbGllbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IHF1ZXJpZWQgdGhlIHR5cGUgZGVjbGFyYXRpb24ncyBhcnJheSBkZXB0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgaW50IGFycmF5RGVwdGgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pLCBhcnJheURlcHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBubyB3aGl0ZXNwYWNlIGluIHRoZSB0eXBlIGRlY2xhcmF0aW9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIGludCBhcnJheURlcHRoKSB7Ci0JCXJldHVybiB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKDAsIHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSAtIChhcnJheURlcHRoICogMikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJcmV0dXJuIGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpCi0JCXRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb25fKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIsCi0JICogdXNpbmcgdGhlIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8oZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoLCBjbGFzc0xvYWRlcik7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLAotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgotCSAqLwotCS8vIHNlZSB0aGUgIkV2YWx1YXRpb24iIG9mIEpESyBidWcgNjQ0NjYyNyBmb3IgYSBkaXNjdXNzaW9uIG9mIGxvYWRpbmcgY2xhc3NlcwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLQkJdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLQl7Ci0JCS8vIHByaW1pdGl2ZXMgY2Fubm90IGJlIGxvYWRlZCB2aWEgQ2xhc3MuZm9yTmFtZSgpLAotCQkvLyBzbyBjaGVjayBmb3IgYSBwcmltaXRpdmUgY2xhc3MgbmFtZSBmaXJzdAotCQlQcmltaXRpdmUgcGNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA8PSBNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIKSB7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJCWlmIChwcmltaXRpdmUuamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lKSkgewotCQkJCQlwY2MgPSBwcmltaXRpdmU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIG5vbi1hcnJheQotCQlpZiAoYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gKHBjYyA9PSBudWxsKSA/IENsYXNzLmZvck5hbWUoZWxlbWVudFR5cGVOYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpIDogcGNjLmphdmFDbGFzczsKLQkJfQotCi0JCS8vIGFycmF5Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOwotCQlmb3IgKGludCBpID0gYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlzYi5hcHBlbmQoJ1snKTsKLQkJfQotCQlpZiAocGNjID09IG51bGwpIHsKLQkJCUNsYXNzTmFtZS5hcHBlbmQoZWxlbWVudFR5cGVOYW1lLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQocGNjLmNvZGUpOwotCQl9Ci0JCXJldHVybiBDbGFzcy5mb3JOYW1lKHNiLnRvU3RyaW5nKCksIGZhbHNlLCBjbGFzc0xvYWRlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIjsgZS5nLjx1bD4KLQkgKiA8bGk+PGNvZGU+ImludCI8L2NvZGU+IHJldHVybnMgPGNvZGU+ImludCI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPiJpbnRbXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+IltJIjwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPiByZXR1cm5zIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5TdHJpbmdbXVtdW10iPC9jb2RlPiByZXR1cm5zIDxjb2RlPiJbW1tMamF2YS5sYW5nLlN0cmluZzsiPC9jb2RlPgotCSAqIDwvdWw+Ci0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJVHlwZURlY2xhcmF0aW9uIHRkID0gYnVpbGRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIGdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbih0ZC5lbGVtZW50VHlwZU5hbWUsIHRkLmFycmF5RGVwdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCS8vIG5vbi1hcnJheQotCQlpZiAoYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZWxlbWVudFR5cGVOYW1lOwotCQl9Ci0KLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5lcXVhbHMoQ2xhc3NOYW1lLlZPSURfQ0xBU1NfTkFNRSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oJ1wnJyArIENsYXNzTmFtZS5WT0lEX0NMQVNTX05BTUUgKyAiJyBtdXN0IGhhdmUgYW4gYXJyYXkgZGVwdGggb2YgemVybzogIiArIGFycmF5RGVwdGggKyAnLicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gYXJyYXkKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7Ci0JCWZvciAoaW50IGkgPSBhcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXNiLmFwcGVuZCgnWycpOwotCQl9Ci0KLQkJLy8gbG9vayBmb3IgYSBwcmltaXRpdmUgZmlyc3QKLQkJUHJpbWl0aXZlIHBjYyA9IG51bGw7Ci0JCWlmIChlbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgPD0gTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCkgeyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJCWZvciAoUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFBSSU1JVElWRVMpIHsKLQkJCQlpZiAocHJpbWl0aXZlLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnRUeXBlTmFtZSkpIHsKLQkJCQkJcGNjID0gcHJpbWl0aXZlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocGNjID09IG51bGwpIHsKLQkJCUNsYXNzTmFtZS5hcHBlbmQoZWxlbWVudFR5cGVOYW1lLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQocGNjLmNvZGUpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4Y2VwdGlvbiBtZXNzYWdlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKENsYXNzPD8+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gYnVpbGRGdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG51bGwsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJc2IuYXBwZW5kKCcuJyk7Ci0JCXNiLmFwcGVuZChmaWVsZE5hbWUpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXJldHVybiBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdC5nZXRDbGFzcygpLCBmaWVsZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JCS8vIHRoaXMgY2hlY2sgYWxsb3dzIHVzIHRvIHVzZSB0aGlzIGNvZGUgZm9yIGNvbnN0cnVjdG9ycywgd2hlcmUgdGhlIG1ldGhvZE5hbWUgaXMgbnVsbAotCQlpZiAobWV0aG9kTmFtZSAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoJy4nKTsKLQkJCXNiLmFwcGVuZChtZXRob2ROYW1lKTsKLQkJfQotCQlzYi5hcHBlbmQoJygnKTsKLQkJaW50IG1heCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aCAtIDE7Ci0JCWlmIChtYXggIT0gLTEpIHsKLQkJCS8vIHN0b3Agb25lIHNob3J0IG9mIHRoZSBlbmQgb2YgdGhlIGFycmF5Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJc2IuYXBwZW5kKHBhcmFtZXRlclR5cGVzW2ldLmdldE5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzYi5hcHBlbmQocGFyYW1ldGVyVHlwZXNbbWF4XS5nZXROYW1lKCkpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpbWl0aXZlIGNvbnN0YW50cyAqKioqKioqKioqCi0KLQlzdGF0aWMgZmluYWwgSXRlcmFibGU8UHJpbWl0aXZlPiBQUklNSVRJVkVTID0gYnVpbGRQcmltaXRpdmVzKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQllURV9DT0RFID0gJ0InOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDSEFSX0NPREUgPSAnQyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9DT0RFID0gJ0QnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBGTE9BVF9DT0RFID0gJ0YnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBJTlRfQ09ERSA9ICdJJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTE9OR19DT0RFID0gJ0onOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTSE9SVF9DT0RFID0gJ1MnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBCT09MRUFOX0NPREUgPSAnWic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFZPSURfQ09ERSA9ICdWJzsKLQotCXN0YXRpYyBmaW5hbCBpbnQgTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCA9IGNhbGN1bGF0ZU1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpOwotCXN0YXRpYyBmaW5hbCBpbnQgTUFYX1BSSU1JVElWRV9XUkFQUEVSX0NMQVNTX05BTUVfTEVOR1RIID0gY2FsY3VsYXRlTWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNhbGN1bGF0ZU1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaW50IG1heCA9IC0xOwotCQlmb3IgKFByaW1pdGl2ZSBwcmltaXRpdmUgOiBQUklNSVRJVkVTKSB7Ci0JCQlpbnQgbGVuID0gcHJpbWl0aXZlLmphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQlpZiAobGVuID4gbWF4KSB7Ci0JCQkJbWF4ID0gbGVuOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNhbGN1bGF0ZU1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKSB7Ci0JCWludCBtYXggPSAtMTsKLQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJaW50IGxlbiA9IHByaW1pdGl2ZS53cmFwcGVyQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJaWYgKGxlbiA+IG1heCkgewotCQkJCW1heCA9IGxlbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCS8qKgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIEl0ZXJhYmxlPFByaW1pdGl2ZT4gYnVpbGRQcmltaXRpdmVzKCkgewotCQlQcmltaXRpdmVbXSBhcnJheSA9IG5ldyBQcmltaXRpdmVbOV07Ci0JCWFycmF5WzBdID0gbmV3IFByaW1pdGl2ZShCWVRFX0NPREUsIGphdmEubGFuZy5CeXRlLmNsYXNzKTsKLQkJYXJyYXlbMV0gPSBuZXcgUHJpbWl0aXZlKENIQVJfQ09ERSwgamF2YS5sYW5nLkNoYXJhY3Rlci5jbGFzcyk7Ci0JCWFycmF5WzJdID0gbmV3IFByaW1pdGl2ZShET1VCTEVfQ09ERSwgamF2YS5sYW5nLkRvdWJsZS5jbGFzcyk7Ci0JCWFycmF5WzNdID0gbmV3IFByaW1pdGl2ZShGTE9BVF9DT0RFLCBqYXZhLmxhbmcuRmxvYXQuY2xhc3MpOwotCQlhcnJheVs0XSA9IG5ldyBQcmltaXRpdmUoSU5UX0NPREUsIGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzKTsKLQkJYXJyYXlbNV0gPSBuZXcgUHJpbWl0aXZlKExPTkdfQ09ERSwgamF2YS5sYW5nLkxvbmcuY2xhc3MpOwotCQlhcnJheVs2XSA9IG5ldyBQcmltaXRpdmUoU0hPUlRfQ09ERSwgamF2YS5sYW5nLlNob3J0LmNsYXNzKTsKLQkJYXJyYXlbN10gPSBuZXcgUHJpbWl0aXZlKEJPT0xFQU5fQ09ERSwgamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MpOwotCQlhcnJheVs4XSA9IG5ldyBQcmltaXRpdmUoVk9JRF9DT0RFLCBqYXZhLmxhbmcuVm9pZC5jbGFzcyk7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxQcmltaXRpdmU+KGFycmF5KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIFByaW1pdGl2ZSB7Ci0JCWZpbmFsIGNoYXIgY29kZTsKLQkJZmluYWwgQ2xhc3M8Pz4gamF2YUNsYXNzOwotCQlmaW5hbCBDbGFzczw/PiB3cmFwcGVyQ2xhc3M7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUEVSX0NMQVNTX1RZUEVfRklFTERfTkFNRSA9ICJUWVBFIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBlLmcuIGphdmEubGFuZy5Cb29sZWFuLlRZUEUgPT4gYm9vbGVhbi5jbGFzcwotCQlQcmltaXRpdmUoY2hhciBjb2RlLCBDbGFzczw/PiB3cmFwcGVyQ2xhc3MpIHsKLQkJCXRoaXMuY29kZSA9IGNvZGU7Ci0JCQl0aGlzLndyYXBwZXJDbGFzcyA9IHdyYXBwZXJDbGFzczsKLQkJCXRoaXMuamF2YUNsYXNzID0gKENsYXNzPD8+KSBnZXRTdGF0aWNGaWVsZFZhbHVlKHdyYXBwZXJDbGFzcywgV1JBUFBFUl9DTEFTU19UWVBFX0ZJRUxEX05BTUUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZURlY2xhcmF0aW9uIHsKLQkJZmluYWwgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZTsKLQkJZmluYWwgaW50IGFycmF5RGVwdGg7Ci0JCVR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQkJdGhpcy5lbGVtZW50VHlwZU5hbWUgPSBlbGVtZW50VHlwZU5hbWU7Ci0JCQl0aGlzLmFycmF5RGVwdGggPSBhcnJheURlcHRoOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN1cHByZXNzZWQgY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIFJlZmxlY3Rpb25Ub29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGMwMWY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIFRoaXMgY29tcGFyYXRvciB3aWxsIHJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KLSAqIElmIHRoZSBjb21wYXJhdG9yIGlzIG51bGwsIHRoZSBuYXR1cmFsIG9yZGVyaW5nIG9mIHRoZSBvYmplY3RzIHdpbGwgYmUgdXNlZC4KLSAqLwotcHVibGljIGNsYXNzIFJldmVyc2VDb21wYXJhdG9yPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+Ci0JaW1wbGVtZW50cyBDb21wYXJhdG9yPEU+LCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIGZpbmFsIENvbXBhcmF0b3I8RT4gY29tcGFyYXRvcjsKLQotCXB1YmxpYyBSZXZlcnNlQ29tcGFyYXRvcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgUmV2ZXJzZUNvbXBhcmF0b3IoQ29tcGFyYXRvcjxFPiBjb21wYXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlKEUgZTEsIEUgZTIpIHsKLQkJcmV0dXJuICh0aGlzLmNvbXBhcmF0b3IgPT0gbnVsbCkgPwotCQkJZTIuY29tcGFyZVRvKGUxKQotCQk6Ci0JCQl0aGlzLmNvbXBhcmF0b3IuY29tcGFyZShlMiwgZTEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1J1bm5hYmxlQ29tbWFuZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1J1bm5hYmxlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjE1ZWUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SdW5uYWJsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFdyYXAgYSBSdW5uYWJsZSBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhIENvbW1hbmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5uYWJsZUNvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQlwcm90ZWN0ZWQgZmluYWwgUnVubmFibGUgcnVubmFibGU7Ci0KLQlwdWJsaWMgUnVubmFibGVDb21tYW5kKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChydW5uYWJsZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnJ1bm5hYmxlID0gcnVubmFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdGhpcy5ydW5uYWJsZS5ydW4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkNvbW1hbmRbIiArIHRoaXMucnVubmFibGUudG9TdHJpbmcoKSArJ10nOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlQXNzb2NpYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVBc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTA1MTAzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVBc3NvY2lhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB7QCBsaW5rIEFzc29jaWF0aW9ufS4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUFzc29jaWF0aW9uPEssIFY+Ci0JZXh0ZW5kcyBBYnN0cmFjdEFzc29jaWF0aW9uPEssIFY+Ci0JaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgZmluYWwgSyBrZXk7Ci0JcHJpdmF0ZSBWIHZhbHVlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3NvY2lhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQga2V5Ci0JICogYW5kIGEgbnVsbCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlQXNzb2NpYXRpb24oSyBrZXkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5rZXkgPSBrZXk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzc29jaWF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgYW5kIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVBc3NvY2lhdGlvbihLIGtleSwgViB2YWx1ZSkgewotCQl0aGlzKGtleSk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQotCXB1YmxpYyBLIGtleSgpIHsKLQkJcmV0dXJuIHRoaXMua2V5OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgViB2YWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBWIHNldFZhbHVlKFYgdmFsdWUpIHsKLQkJViBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN5bmNocm9uaXplZCBTaW1wbGVBc3NvY2lhdGlvbjxLLCBWPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU2ltcGxlQXNzb2NpYXRpb248SywgVj4pIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYzYwMGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZUNvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcn0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVDb21tYW5kRXhlY3V0b3IKLQlpbXBsZW1lbnRzIFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yCi17Ci0JcHJpdmF0ZSBib29sZWFuIGFjdGl2ZSA9IGZhbHNlOwotCi0JcHVibGljIFNpbXBsZUNvbW1hbmRFeGVjdXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJaWYgKHRoaXMuYWN0aXZlKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3Qgc3RvcHBlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuYWN0aXZlID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQlpZiAodGhpcy5hY3RpdmUpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJaWYgKCAhIHRoaXMuYWN0aXZlKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3Qgc3RhcnRlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuYWN0aXZlID0gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlRmlsdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NzdjMGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci0KLS8qKgotICogU2ltcGxlLCBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0gKiB0aGF0IGhvbGRzIG9uIHRvIGEgY3JpdGVyaW9uIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZQotICogPGNvZGU+YWNjZXB0KE9iamVjdCk8L2NvZGU+IG9yIDxjb2RlPnJlamVjdChPYmplY3QpPC9jb2RlPgotICogbWV0aG9kcy4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgZWl0aGVyIG9mIHRoZXNlIG1ldGhvZHMsCi0gKiBkZXBlbmRpbmcgb24gd2hpY2ggaXMgZWFzaWVyIHRvIGltcGxlbWVudC4gTm90ZSB0aGF0IGF0IGxlYXN0Ci0gKiBvbmUgb2YgdGhlc2UgbWV0aG9kcyA8ZW0+bXVzdDwvZW0+IGJlIG92ZXJyaWRkZW4gb3IKLSAqIGFuIGluZmluaXRlIGxvb3Agd2lsbCBvY2N1ci4gSWYgYm90aCBvZiB0aGVtIGFyZSBvdmVycmlkZGVuLAotICogb25seSB0aGUgPGNvZGU+YWNjZXB0KE9iamVjdCk8L2NvZGU+IG1ldGhvZCB3aWxsIGJlIHVzZWQuCi0gKiA8cD4KLSAqIFNpbXBsaWZpZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHN0cmFpZ2h0Zm9yd2FyZCBpbm5lciBjbGFzc2VzLgotICogSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgZmlsdGVyIHRoYXQgY2FuIGJlIHVzZWQgYnkgYQotICogPGNvZGU+RmlsdGVyaW5nSXRlcmF0b3I8L2NvZGU+IHRvIHJldHVybiBvbmx5IHRob3NlIHN0cmluZ3MKLSAqIGluIHRoZSBuZXN0ZWQgaXRlcmF0b3Igc3RhcnQgd2l0aCAicHJlZml4IjoKLSAqIDxwcmU+Ci0gKglGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBuZXcgU2ltcGxlRmlsdGVyPFN0cmluZz4oInByZWZpeCIpIHsKLSAqCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIG8pIHsKLSAqCQkJcmV0dXJuIG8uc3RhcnRzV2l0aCgoU3RyaW5nKSBjcml0ZXJpb24pOwotICoJCX0KLSAqCX07Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbXBsZUZpbHRlcjxULCBTPgotCWltcGxlbWVudHMgRmlsdGVyPFQ+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCXByb3RlY3RlZCBmaW5hbCBTIGNyaXRlcmlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBNb3JlIHVzZWZ1bCBjb25zdHJ1Y3Rvci4gVGhlIHNwZWNpZmllZCBjcml0ZXJpb24gY2FuCi0JICogYmUgdXNlZCBieSBhIHN1YmNsYXNzIHRvICJhY2NlcHQiIG9yICJyZWplY3QiIG9iamVjdHMuCi0JICovCi0JcHJvdGVjdGVkIFNpbXBsZUZpbHRlcihTIGNyaXRlcmlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmNyaXRlcmlvbiA9IGNyaXRlcmlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzaW1wbGUgZmlsdGVyIHdpdGggYSBudWxsIGNyaXRlcmlvbgotCSAqLwotCXByb3RlY3RlZCBTaW1wbGVGaWx0ZXIoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHNob3VsZCBiZSAicmVqZWN0ZWQiLgotCSAqIFRoZSBzZW1hbnRpY3Mgb2YgInJlamVjdGVkIiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjbGllbnQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVqZWN0KFQgbykgewotCQlyZXR1cm4gISB0aGlzLmFjY2VwdChvKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGhlIHNwZWNpZmllZCBvYmplY3Qgc2hvdWxkIGJlICJhY2NlcHRlZCIuCi0JICogVGhlIHNlbWFudGljcyBvZiAiYWNjZXB0ZWQiIGlzIGRldGVybWluZWQgYnkgdGhlIGNsaWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoVCBvKSB7Ci0JCXJldHVybiAhIHRoaXMucmVqZWN0KG8pOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBTaW1wbGVGaWx0ZXI8VCwgUz4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFNpbXBsZUZpbHRlcjxULCBTPikgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgU2ltcGxlRmlsdGVyPD8sID8+KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVNpbXBsZUZpbHRlcjw/LCA/PiBvdGhlciA9IChTaW1wbGVGaWx0ZXI8PywgPz4pIG87Ci0JCXJldHVybiAodGhpcy5jcml0ZXJpb24gPT0gbnVsbCkgPwotCQkJKG90aGVyLmNyaXRlcmlvbiA9PSBudWxsKSA6IHRoaXMuY3JpdGVyaW9uLmVxdWFscyhvdGhlci5jcml0ZXJpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAodGhpcy5jcml0ZXJpb24gPT0gbnVsbCkgPyAwIDogdGhpcy5jcml0ZXJpb24uaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmNyaXRlcmlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlSmF2YVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVKYXZhVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTk0YWNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVKYXZhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuSmF2YVR5cGU7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgSmF2YVR5cGV9IGludGVyZmFjZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNpbXBsZUphdmFUeXBlCi0JaW1wbGVtZW50cyBKYXZhVHlwZSwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQotCS8qKgotCSAqIHN0b3JlIHRoZSB0eXBlIGFzIGEgbmFtZSwgc28gd2UgY2FuIHJlZmVyZW5jZSBjbGFzc2VzCi0JICogdGhhdCBhcmUgbm90IGxvYWRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZTsKLQotCS8qKgotCSAqIG5vbi1hcnJheSB0eXBlcyBoYXZlIGFuIGFycmF5IGRlcHRoIG9mIHplcm8KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBhcnJheURlcHRoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJSQUNLRVRTID0gIltdIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBKYXZhIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdHlwZSBhbmQgYXJyYXkgZGVwdGguCi0JICovCi0JcHVibGljIFNpbXBsZUphdmFUeXBlKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgoZWxlbWVudFR5cGVOYW1lID09IG51bGwpIHx8IChlbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBlbGVtZW50IHR5cGUgbmFtZSBpcyByZXF1aXJlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChDbGFzc05hbWUuZ2V0QXJyYXlEZXB0aChlbGVtZW50VHlwZU5hbWUpICE9IDApIHsJCS8vIGUuZy4gIltMamF2YS5sYW5nLk9iamVjdDsiCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZWxlbWVudCB0eXBlIG11c3Qgbm90IGJlIGFuIGFycmF5OiAiICsgZWxlbWVudFR5cGVOYW1lICsgJy4nKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChhcnJheURlcHRoIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGFycmF5IGRlcHRoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm86ICIgKyBhcnJheURlcHRoICsgJy4nKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChlbGVtZW50VHlwZU5hbWUuZXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSAmJiAoYXJyYXlEZXB0aCAhPSAwKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJ3ZvaWQnIG11c3QgaGF2ZSBhbiBhcnJheSBkZXB0aCBvZiB6ZXJvOiAiICsgYXJyYXlEZXB0aCArICcuJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmVsZW1lbnRUeXBlTmFtZSA9IGVsZW1lbnRUeXBlTmFtZTsKLQkJdGhpcy5hcnJheURlcHRoID0gYXJyYXlEZXB0aDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBKYXZhIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGNsYXNzIG5hbWUgY2FuIGJlIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOjx1bD48Y29kZT4KLQkgKiA8bGk+amF2YS5sYW5nLk9iamVjdAotCSAqIDxsaT5pbnQKLQkgKiA8bGk+amF2YS51dGlsLk1hcCRFbnRyeQotCSAqIDxsaT5bTGphdmEubGFuZy5PYmplY3Q7Ci0JICogPGxpPltJCi0JICogPGxpPltMamF2YS51dGlsLk1hcCRFbnRyeTsKLQkgKiA8L2NvZGU+PC91bD4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlSmF2YVR5cGUoU3RyaW5nIGphdmFDbGFzc05hbWUpIHsKLQkJdGhpcyhDbGFzc05hbWUuZ2V0RWxlbWVudFR5cGVOYW1lKGphdmFDbGFzc05hbWUpLCBDbGFzc05hbWUuZ2V0QXJyYXlEZXB0aChqYXZhQ2xhc3NOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgSmF2YSB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBTaW1wbGVKYXZhVHlwZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJdGhpcyhqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VHlwZU5hbWU7Ci0JfQotCi0JcHVibGljIGludCBnZXRBcnJheURlcHRoKCkgewotCQlyZXR1cm4gdGhpcy5hcnJheURlcHRoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmFycmF5RGVwdGggPiAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gKHRoaXMuYXJyYXlEZXB0aCA9PSAwKSAmJiBDbGFzc05hbWUuaXNQcmltaXRpdmUodGhpcy5lbGVtZW50VHlwZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlV3JhcHBlcigpIHsKLQkJcmV0dXJuICh0aGlzLmFycmF5RGVwdGggPT0gMCkgJiYgQ2xhc3NOYW1lLmlzUHJpbWl0aXZlV3JhcHBlcih0aGlzLmVsZW1lbnRUeXBlTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWYXJpYWJsZVByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmFycmF5RGVwdGggPT0gMCkgJiYgQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUodGhpcy5lbGVtZW50VHlwZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKCkgewotCQlyZXR1cm4gKHRoaXMuYXJyYXlEZXB0aCA9PSAwKSAmJiBDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIodGhpcy5lbGVtZW50VHlwZU5hbWUpOwotCX0KLQotCXB1YmxpYyBDbGFzczw/PiBnZXRKYXZhQ2xhc3MoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odGhpcy5lbGVtZW50VHlwZU5hbWUsIHRoaXMuYXJyYXlEZXB0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbih0aGlzLmVsZW1lbnRUeXBlTmFtZSwgdGhpcy5hcnJheURlcHRoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29tcGFyaXNvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoU3RyaW5nIG90aGVyRWxlbWVudFR5cGVOYW1lLCBpbnQgb3RoZXJBcnJheURlcHRoKSB7Ci0JCXJldHVybiAodGhpcy5hcnJheURlcHRoID09IG90aGVyQXJyYXlEZXB0aCkKLQkJCSYmIHRoaXMuZWxlbWVudFR5cGVOYW1lLmVxdWFscyhvdGhlckVsZW1lbnRUeXBlTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZGVzY3JpYmVzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZXF1YWxzKENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUoY2xhc3NOYW1lKSwgQ2xhc3NOYW1lLmdldEFycmF5RGVwdGgoY2xhc3NOYW1lKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZGVzY3JpYmVzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gdGhpcy5kZXNjcmliZXMoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKEphdmFUeXBlIG90aGVyKSB7Ci0JCXJldHVybiB0aGlzLmVxdWFscyhvdGhlci5nZXRFbGVtZW50VHlwZU5hbWUoKSwgb3RoZXIuZ2V0QXJyYXlEZXB0aCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuICh0aGlzID09IG8pID8gdHJ1ZSA6IChvIGluc3RhbmNlb2YgSmF2YVR5cGUpID8gdGhpcy5lcXVhbHMoKEphdmFUeXBlKSBvKSA6IGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUeXBlTmFtZS5oYXNoQ29kZSgpIF4gdGhpcy5hcnJheURlcHRoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmludGluZyBhbmQgZGlzcGxheWluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGRlY2xhcmF0aW9uKCkgewotCQlpZiAodGhpcy5hcnJheURlcHRoID09IDApIHsKLQkJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUeXBlTmFtZURlY2xhcmF0aW9uKCk7Ci0JCX0KLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHRoaXMuZWxlbWVudFR5cGVOYW1lLmxlbmd0aCgpICsgKDIgKiB0aGlzLmFycmF5RGVwdGgpKTsKLQkJdGhpcy5hcHBlbmREZWNsYXJhdGlvblRvKHNiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwZW5kRGVjbGFyYXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldEVsZW1lbnRUeXBlTmFtZURlY2xhcmF0aW9uKCkpOwotCQlmb3IgKGludCBpID0gdGhpcy5hcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXNiLmFwcGVuZChCUkFDS0VUUyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludERlY2xhcmF0aW9uT24oUHJpbnRXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQodGhpcy5nZXRFbGVtZW50VHlwZU5hbWVEZWNsYXJhdGlvbigpKTsKLQkJZm9yIChpbnQgaSA9IHRoaXMuYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlwdy5wcmludChCUkFDS0VUUyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+JyQnPC9jb2RlPiB2ZXJzaW9uIG9mIHRoZSBuYW1lIGlzIHVzZWQgaW4ge0BsaW5rIENsYXNzI2Zvck5hbWUoU3RyaW5nKX0sCi0JICogYnV0IHRoZSA8Y29kZT4nLic8L2NvZGU+IHZlcnNpb24gb2YgdGhlIG5hbWUgaXMgdXNlZCBpbiBzb3VyY2UgY29kZS4KLQkgKiBWZXJ5IGlycml0YXRpbmcuLi4uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lRGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUeXBlTmFtZS5yZXBsYWNlKCckJywgJy4nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJdGhpcy5hcHBlbmREZWNsYXJhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVNZXRob2RTaWduYXR1cmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVNZXRob2RTaWduYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0NWY0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlTWV0aG9kU2lnbmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5KYXZhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNZXRob2RTaWduYXR1cmUgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2ltcGxlTWV0aG9kU2lnbmF0dXJlCi0JaW1wbGVtZW50cyBNZXRob2RTaWduYXR1cmUsIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIHN0b3JlIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXMgbmFtZXMsIHNvIHdlIGNhbiByZWZlcmVuY2UgY2xhc3NlcwotCSAqIHRoYXQgYXJlIG5vdCBsb2FkZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIEphdmFUeXBlW10gcGFyYW1ldGVyVHlwZXM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFUeXBlW10gRU1QVFlfUEFSQU1FVEVSX1RZUEVTID0gbmV3IEphdmFUeXBlWzBdOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9TRVBBUkFUT1IgPSAiLCAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG1ldGhvZCBzaWduYXR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kCi0JICogbm8gcGFyYW1ldGVyIHR5cGVzLgotCSAqLwotCXB1YmxpYyBTaW1wbGVNZXRob2RTaWduYXR1cmUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcyhuYW1lLCBFTVBUWV9QQVJBTUVURVJfVFlQRVMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG1ldGhvZCBzaWduYXR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHBhcmFtZXRlcgotCSAqIHR5cGVzLgotCSAqLwotCXB1YmxpYyBTaW1wbGVNZXRob2RTaWduYXR1cmUoU3RyaW5nIG5hbWUsIEphdmFUeXBlLi4uIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgobmFtZSA9PSBudWxsKSB8fCAobmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIG5hbWUgaXMgcmVxdWlyZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAocGFyYW1ldGVyVHlwZXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmFtZXRlciB0eXBlcyBhcmUgcmVxdWlyZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljaGVja1BhcmFtZXRlclR5cGVzKHBhcmFtZXRlclR5cGVzKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wYXJhbWV0ZXJUeXBlcyA9IHBhcmFtZXRlclR5cGVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tQYXJhbWV0ZXJUeXBlcyhKYXZhVHlwZVtdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwYXJhbWV0ZXJUeXBlc1tpXSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWlzc2luZyBwYXJhbWV0ZXIgdHlwZTogIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAocGFyYW1ldGVyVHlwZXNbaV0uZ2V0RWxlbWVudFR5cGVOYW1lKCkuZXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgcGFyYW1ldGVyIHR5cGUgb2YgJ3ZvaWQnIGlzIG5vdCBhbGxvd2VkOiAiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG1ldGhvZCBzaWduYXR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHBhcmFtZXRlcgotCSAqIHR5cGVzLgotCSAqLwotCXB1YmxpYyBTaW1wbGVNZXRob2RTaWduYXR1cmUoU3RyaW5nIG5hbWUsIFN0cmluZy4uLiBwYXJhbWV0ZXJUeXBlTmFtZXMpIHsKLQkJdGhpcyhuYW1lLCBidWlsZFBhcmFtZXRlclR5cGVzKHBhcmFtZXRlclR5cGVOYW1lcykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEphdmFUeXBlW10gYnVpbGRQYXJhbWV0ZXJUeXBlcyhTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlTmFtZXMpIHsKLQkJaWYgKHBhcmFtZXRlclR5cGVOYW1lcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIHR5cGUgbmFtZXMgYXJlIHJlcXVpcmVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSmF2YVR5cGVbXSBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBKYXZhVHlwZVtwYXJhbWV0ZXJUeXBlTmFtZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwYXJhbWV0ZXJUeXBlTmFtZXNbaV0gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1pc3NpbmcgcGFyYW1ldGVyIHR5cGUgbmFtZTogIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwYXJhbWV0ZXJUeXBlc1tpXSA9IG5ldyBTaW1wbGVKYXZhVHlwZShwYXJhbWV0ZXJUeXBlTmFtZXNbaV0pOwotCQl9Ci0JCXJldHVybiBwYXJhbWV0ZXJUeXBlczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBtZXRob2Qgc2lnbmF0dXJlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBwYXJhbWV0ZXIKLQkgKiB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKFN0cmluZyBuYW1lLCBDbGFzczw/Pi4uLiBwYXJhbWV0ZXJKYXZhQ2xhc3NlcykgewotCQl0aGlzKG5hbWUsIGJ1aWxkUGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlckphdmFDbGFzc2VzKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gYnVpbGRQYXJhbWV0ZXJUeXBlTmFtZXMoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJKYXZhQ2xhc3NlcykgewotCQlpZiAocGFyYW1ldGVySmF2YUNsYXNzZXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmFtZXRlciBKYXZhIGNsYXNzZXMgYXJlIHJlcXVpcmVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nW10gcGFyYW1ldGVyVHlwZU5hbWVzID0gbmV3IFN0cmluZ1twYXJhbWV0ZXJKYXZhQ2xhc3Nlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckphdmFDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocGFyYW1ldGVySmF2YUNsYXNzZXNbaV0gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1pc3NpbmcgcGFyYW1ldGVyIEphdmEgY2xhc3M6ICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcGFyYW1ldGVyVHlwZU5hbWVzW2ldID0gcGFyYW1ldGVySmF2YUNsYXNzZXNbaV0uZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBwYXJhbWV0ZXJUeXBlTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbWV0aG9kIHNpZ25hdHVyZSBmb3IgdGhlIHNwZWNpZmllZCBKYXZhIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKE1ldGhvZCBtZXRob2QpIHsKLQkJdGhpcyhtZXRob2QuZ2V0TmFtZSgpLCBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIEphdmFUeXBlW10gZ2V0UGFyYW1ldGVyVHlwZXMoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmFtZXRlclR5cGVzOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb21wYXJpc29uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGRlc2NyaWJlcyhNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiB0aGlzLm5hbWUuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpCi0JCQkJJiYgdGhpcy5wYXJhbWV0ZXJUeXBlc0Rlc2NyaWJlKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcGFyYW1ldGVyVHlwZXNEZXNjcmliZShDbGFzczw/PltdIG90aGVyUGFyYW1ldGVyVHlwZXMpIHsKLQkJSmF2YVR5cGVbXSBsb2NhbFBhcmFtZXRlclR5cGVzID0gdGhpcy5wYXJhbWV0ZXJUeXBlczsKLQkJaW50IGxlbiA9IGxvY2FsUGFyYW1ldGVyVHlwZXMubGVuZ3RoOwotCQlpZiAob3RoZXJQYXJhbWV0ZXJUeXBlcy5sZW5ndGggIT0gbGVuKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgbG9jYWxQYXJhbWV0ZXJUeXBlc1tpXS5kZXNjcmliZXMob3RoZXJQYXJhbWV0ZXJUeXBlc1tpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKFN0cmluZyBvdGhlck5hbWUsIEphdmFUeXBlW10gb3RoZXJQYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gdGhpcy5uYW1lLmVxdWFscyhvdGhlck5hbWUpCi0JCQkJJiYgQXJyYXlzLmVxdWFscyh0aGlzLnBhcmFtZXRlclR5cGVzLCBvdGhlclBhcmFtZXRlclR5cGVzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoTWV0aG9kU2lnbmF0dXJlIG90aGVyKSB7Ci0JCXJldHVybiB0aGlzLmVxdWFscyhvdGhlci5nZXROYW1lKCksIG90aGVyLmdldFBhcmFtZXRlclR5cGVzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gKHRoaXMgPT0gbykgPyB0cnVlIDogKG8gaW5zdGFuY2VvZiBNZXRob2RTaWduYXR1cmUpID8gdGhpcy5lcXVhbHMoKE1ldGhvZFNpZ25hdHVyZSkgbykgOiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lLmhhc2hDb2RlKCkgXiBBcnJheXMuaGFzaENvZGUodGhpcy5wYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW50aW5nIGFuZCBkaXNwbGF5aW5nICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJdGhpcy5hcHBlbmRTaWduYXR1cmVUbyhzYik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGVuZFNpZ25hdHVyZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlKYXZhVHlwZVtdIGxvY2FsUGFyYW1ldGVyVHlwZXMgPSB0aGlzLnBhcmFtZXRlclR5cGVzOwotCQlpbnQgbGVuID0gbG9jYWxQYXJhbWV0ZXJUeXBlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChpICE9IDApIHsKLQkJCQlzYi5hcHBlbmQoUEFSQU1FVEVSX1NFUEFSQVRPUik7Ci0JCQl9Ci0JCQlsb2NhbFBhcmFtZXRlclR5cGVzW2ldLmFwcGVuZERlY2xhcmF0aW9uVG8oc2IpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKScpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50U2lnbmF0dXJlT24oUHJpbnRXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQodGhpcy5uYW1lKTsKLQkJcHcucHJpbnQoJygnKTsKLQkJSmF2YVR5cGVbXSBsb2NhbFBhcmFtZXRlclR5cGVzID0gdGhpcy5wYXJhbWV0ZXJUeXBlczsKLQkJaW50IGxlbiA9IGxvY2FsUGFyYW1ldGVyVHlwZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKSB7Ci0JCQkJcHcucHJpbnQoUEFSQU1FVEVSX1NFUEFSQVRPUik7Ci0JCQl9Ci0JCQlsb2NhbFBhcmFtZXRlclR5cGVzW2ldLnByaW50RGVjbGFyYXRpb25Pbihwdyk7Ci0JCX0KLQkJcHcucHJpbnQoJyknKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJdGhpcy5hcHBlbmRTaWduYXR1cmVUbyhzYik7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlUXVldWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVRdWV1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWE3M2UxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVRdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFF1ZXVlfSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVRdWV1ZTxFPgotCWltcGxlbWVudHMgUXVldWU8RT4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBMaW5rZWRMaXN0PEU+IGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbXB0eSBxdWV1ZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlUXVldWUoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDxFPigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHF1ZXVlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBjb2xsZWN0aW9uLiBUaGUgcXVldWUgd2lsbCBkZXF1ZXVlIGl0cyBlbGVtZW50cyBpbiB0aGUgc2FtZQotCSAqIG9yZGVyIHRoZXkgYXJlIHJldHVybmVkIGJ5IHRoZSBjb2xsZWN0aW9uJ3MgaXRlcmF0b3IgKGkuZS4gdGhlCi0JICogZmlyc3QgZWxlbWVudCByZXR1cm5lZCBieSB0aGUgY29sbGVjdGlvbidzIGl0ZXJhdG9yIHdpbGwgYmUgdGhlCi0JICogZmlyc3QgZWxlbWVudCByZXR1cm5lZCBieSB7QGxpbmsgI2RlcXVldWUoKX0pLgotCSAqLwotCXB1YmxpYyBTaW1wbGVRdWV1ZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDxFPihjKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUXVldWUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgZW5xdWV1ZShFIG8pIHsKLQkJdGhpcy5lbGVtZW50cy5hZGRMYXN0KG8pOwotCX0KLQotCXB1YmxpYyBFIGRlcXVldWUoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRzLnJlbW92ZUZpcnN0KCk7Ci0JfQotCi0JcHVibGljIEUgcGVlaygpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudHMuZ2V0Rmlyc3QoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5pc0VtcHR5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENsb25lYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2ltcGxlUXVldWU8RT4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCVNpbXBsZVF1ZXVlPEU+IGNsb25lID0gKFNpbXBsZVF1ZXVlPEU+KSBzdXBlci5jbG9uZSgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlMaW5rZWRMaXN0PEU+IGxsID0gKExpbmtlZExpc3Q8RT4pIHRoaXMuZWxlbWVudHMuY2xvbmUoKTsKLQkJCWNsb25lLmVsZW1lbnRzID0gbGw7Ci0JCQlyZXR1cm4gY2xvbmU7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5wZWVrKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZVN0YWNrLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZkZWEwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgU3RhY2t9IGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVN0YWNrPEU+Ci0JaW1wbGVtZW50cyBTdGFjazxFPiwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIExpbmtlZExpc3Q8RT4gZWxlbWVudHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVtcHR5IHN0YWNrLgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdGFjaygpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0PEU+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhY2sgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZAotCSAqIGNvbGxlY3Rpb24uIFRoZSBzdGFjayB3aWxsIHBvcCBpdHMgZWxlbWVudHMgaW4gcmV2ZXJzZSBvZiB0aGUKLQkgKiBvcmRlciB0aGV5IGFyZSByZXR1cm5lZCBieSB0aGUgY29sbGVjdGlvbidzIGl0ZXJhdG9yIChpLmUuIHRoZQotCSAqIGxhc3QgZWxlbWVudCByZXR1cm5lZCBieSB0aGUgY29sbGVjdGlvbidzIGl0ZXJhdG9yIHdpbGwgYmUgdGhlCi0JICogZmlyc3QgZWxlbWVudCByZXR1cm5lZCBieSB7QGxpbmsgI3BvcCgpfSkuCi0JICovCi0JcHVibGljIFNpbXBsZVN0YWNrKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0PEU+KGNvbGxlY3Rpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTdGFjayBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBwdXNoKEUgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnRzLmFkZExhc3QoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEUgcG9wKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZWxlbWVudHMucmVtb3ZlTGFzdCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JcHVibGljIEUgcGVlaygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmVsZW1lbnRzLmdldExhc3QoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRzLmlzRW1wdHkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2ltcGxlU3RhY2s8RT4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCVNpbXBsZVN0YWNrPEU+IGNsb25lID0gKFNpbXBsZVN0YWNrPEU+KSBzdXBlci5jbG9uZSgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlMaW5rZWRMaXN0PEU+IGxsID0gKExpbmtlZExpc3Q8RT4pIHRoaXMuZWxlbWVudHMuY2xvbmUoKTsKLQkJCWNsb25lLmVsZW1lbnRzID0gbGw7Ci0JCQlyZXR1cm4gY2xvbmU7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5wZWVrKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZVN0cmluZ01hdGNoZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVTdHJpbmdNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OTIzODcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZVN0cmluZ01hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotCi0vLyBUT0RPIHRoZSByZWdleCBjb2RlIGlzIG5vdCB2ZXJ5IGZhc3QgLSB3ZSBjb3VsZCBwcm9iYWJseSBkbyBiZXR0ZXIsCi0vLyBoYW5kLWNvZGluZyB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIChlY2xpcHNlIFN0cmluZ01hdGNoZXI/KQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzaW1wbGUgc3RyaW5nLW1hdGNoaW5nIGFsZ29yaXRobSB0aGF0IGlzIGEgbGl0dGxlCi0gKiBtb3JlIHVzZXItZnJpZW5kbHkgdGhhbiBzdGFuZGFyZCByZWd1bGFyIGV4cHJlc3Npb25zLiBJbnN0YW50aWF0ZSBhCi0gKiBzdHJpbmcgbWF0Y2hlciB3aXRoIGEgZmlsdGVyIHBhdHRlcm4gYW5kIHRoZW4geW91IGNhbiB1c2UgdGhlIG1hdGNoZXIKLSAqIHRvIGRldGVybWluZSB3aGV0aGVyIGFub3RoZXIgc3RyaW5nIChvciBvYmplY3QpIG1hdGNoZXMgdGhlIHBhdHRlcm4uCi0gKiBZb3UgY2FuIGFsc28gc3BlY2lmeSB3aGV0aGVyIHRoZSBtYXRjaGluZyBzaG91bGQgYmUgY2FzZS1zZW5zaXRpdmUuCi0gKiAKLSAqIFRoZSBwYXR0ZXJuIGNhbiBjb250YWluIHR3byAibWV0YS1jaGFyYWN0ZXJzIjoKLSAqIAknKicgd2lsbCBtYXRjaCBhbnkgc2V0IG9mIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzCi0gKiAJJz8nIHdpbGwgbWF0Y2ggYW55IHNpbmdsZSBjaGFyYWN0ZXIKLSAqIAotICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgI3ByZWZpeCgpIGFuZC9vciAjc3VmZml4KCkgdG8gY2hhbmdlIHdoYXQKLSAqIHN0cmluZ3MgYXJlIHByZXBlbmRlZCBvciBhcHBlbmRlZCB0byB0aGUgb3JpZ2luYWwgcGF0dGVybiBzdHJpbmcuCi0gKiBUaGlzIGNhbiBvZmZlciBhIHNsaWdodCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvdmVyIGNvbmNhdGVuYXRpbmcKLSAqIHN0cmluZ3MgYmVmb3JlIGNhbGxpbmcgI3NldFBhdHRlcm5TdHJpbmcoU3RyaW5nKS4KLSAqIEJ5IGRlZmF1bHQsIGEgJyonIGlzIGFwcGVuZGVkIHRvIGV2ZXJ5IHN0cmluZy4KLSAqIAotICogVGhpcyBjbGFzcyBhbHNvIHVzZXMgdGhlIHN0cmluZy1tYXRjaGluZyBhbGdvcml0aG0gdG8gImZpbHRlciIgb2JqZWN0cwotICogKGFuZCwgYXMgYSByZXN1bHQsIGFsc28gaW1wbGVtZW50cyB0aGUgRmlsdGVyIGludGVyZmFjZSkuCi0gKiBBIHN0cmluZyBjb252ZXJ0ZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBzdHJpbmcgYXNwZWN0IG9mIHRoZQotICogb2JqZWN0IGlzIGNvbXBhcmVkIHRvIHRoZSBwYXR0ZXJuLiBCeSBkZWZhdWx0IHRoZSBzdHJpbmcgcmV0dXJuZWQKLSAqIGJ5IHRoZSBvYmplY3QncyAjdG9TdHJpbmcoKSBtZXRob2QgaXMgcGFzc2VkIHRvIHRoZSBwYXR0ZXJuIG1hdGNoZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTdHJpbmdNYXRjaGVyPFQ+Ci0JaW1wbGVtZW50cyBTdHJpbmdNYXRjaGVyLCBGaWx0ZXI8VD4sIFNlcmlhbGl6YWJsZQotewotCi0JLyoqIEFuIGFkYXB0ZXIgdGhhdCBjb252ZXJ0cyB0aGUgb2JqZWN0cyBpbnRvIHN0cmluZ3MgdG8gYmUgbWF0Y2hlZCB3aXRoIHRoZSBwYXR0ZXJuLiAqLwotCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcjsKLQotCS8qKiBUaGUgc3RyaW5nIHVzZWQgdG8gY29uc3RydWN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4gKi8KLQlwcml2YXRlIFN0cmluZyBwYXR0ZXJuU3RyaW5nOwotCi0JLyoqIFdoZXRoZXIgdGhlIG1hdGNoZXIgaWdub3JlcyBjYXNlIC0gdGhlIGRlZmF1bHQgaXMgdHJ1ZS4gKi8KLQlwcml2YXRlIGJvb2xlYW4gaWdub3Jlc0Nhc2U7Ci0KLQkvKiogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIGJ1aWx0IGZyb20gdGhlIHBhdHRlcm4gc3RyaW5nLiAqLwotCXByaXZhdGUgUGF0dGVybiBwYXR0ZXJuOwotCi0JLyoqIEEgbGlzdCBvZiB0aGUgbWV0YS1jaGFyYWN0ZXJzIHdlIG5lZWQgdG8gZXNjYXBlIGlmIGZvdW5kIGluIHRoZSBwYXR0ZXJuIHN0cmluZy4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBSRUdfRVhfTUVUQV9DSEFSUyA9IHsgJygnLCAnWycsICd7JywgJ1xcJywgJ14nLCAnJCcsICd8JywgJyknLCAnPycsICcqJywgJysnLCAnLicgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdHJpbmcgbWF0Y2hlciB3aXRoIGFuIHBhdHRlcm4gdGhhdCB3aWxsIG1hdGNoCi0JICogYW55IHN0cmluZyBhbmQgaWdub3JlIGNhc2UuCi0JICovCi0JcHVibGljIFNpbXBsZVN0cmluZ01hdGNoZXIoKSB7Ci0JCXRoaXMoIioiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0cmluZyBtYXRjaGVyIHdpdGggdGhlIHNwZWNpZmllZCBwYXR0ZXJuCi0JICogdGhhdCB3aWxsIGlnbm9yZSBjYXNlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdHJpbmdNYXRjaGVyKFN0cmluZyBwYXR0ZXJuU3RyaW5nKSB7Ci0JCXRoaXMocGF0dGVyblN0cmluZywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RyaW5nIG1hdGNoZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gdGhhdCB3aWxsCi0JICogaWdub3JlIGNhc2UgYXMgc3BlY2lmaWVkLgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdHJpbmdNYXRjaGVyKFN0cmluZyBwYXR0ZXJuU3RyaW5nLCBib29sZWFuIGlnbm9yZXNDYXNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGF0dGVyblN0cmluZyA9IHBhdHRlcm5TdHJpbmc7Ci0JCXRoaXMuaWdub3Jlc0Nhc2UgPSBpZ25vcmVzQ2FzZTsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyID0gU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuaW5zdGFuY2UoKTsKLQkJdGhpcy5yZWJ1aWxkUGF0dGVybigpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBjdXJyZW50IHBhdHRlcm4gc3RyaW5nIGFuZCBjYXNlLXNlbnNpdGl2aXR5IHNldHRpbmcsCi0JICogcmUtYnVpbGQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCByZWJ1aWxkUGF0dGVybigpIHsKLQkJdGhpcy5wYXR0ZXJuID0gdGhpcy5idWlsZFBhdHRlcm4oKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgY3VycmVudCBwYXR0ZXJuIHN0cmluZyBhbmQgY2FzZS1zZW5zaXRpdml0eSBzZXR0aW5nLAotCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0aGF0IGNhbiBiZSB1c2VkCi0JICogdG8gbWF0Y2ggc3RyaW5ncy4KLQkgKi8KLQlwcm90ZWN0ZWQgUGF0dGVybiBidWlsZFBhdHRlcm4oKSB7Ci0JCWludCBwYXR0ZXJuRmxhZ3MgPSAweDA7Ci0JCWlmICh0aGlzLmlnbm9yZXNDYXNlKSB7Ci0JCQlwYXR0ZXJuRmxhZ3MgPSBQYXR0ZXJuLlVOSUNPREVfQ0FTRSB8IFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRTsKLQkJfQotCQlyZXR1cm4gUGF0dGVybi5jb21waWxlKHRoaXMuY29udmVydFRvUmVnRXgodGhpcy5wYXR0ZXJuU3RyaW5nKSwgcGF0dGVybkZsYWdzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3RyaW5nTWF0Y2hlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UGF0dGVyblN0cmluZyhTdHJpbmcgcGF0dGVyblN0cmluZykgewotCQl0aGlzLnBhdHRlcm5TdHJpbmcgPSBwYXR0ZXJuU3RyaW5nOwotCQl0aGlzLnJlYnVpbGRQYXR0ZXJuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgbWF0Y2hlcyB0aGUgcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiB0aGlzLnBhdHRlcm4ubWF0Y2hlcihzdHJpbmcpLm1hdGNoZXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRmlsdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhY2NlcHQoVCBvKSB7Ci0JCXJldHVybiB0aGlzLm1hdGNoZXModGhpcy5zdHJpbmdDb252ZXJ0ZXIuY29udmVydFRvU3RyaW5nKG8pKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RyaW5nIGNvbnZlcnRlciB1c2VkIHRvIGNvbnZlcnQgdGhlIG9iamVjdHMKLQkgKiBwYXNzZWQgdG8gdGhlIG1hdGNoZXIgaW50byBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMuc3RyaW5nQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3RyaW5nIGNvbnZlcnRlciB1c2VkIHRvIGNvbnZlcnQgdGhlIG9iamVjdHMKLQkgKiBwYXNzZWQgdG8gdGhlIG1hdGNoZXIgaW50byBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTdHJpbmdDb252ZXJ0ZXIoU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcikgewotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciA9IHN0cmluZ0NvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9yaWdpbmFsIHBhdHRlcm4gc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHBhdHRlcm5TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnBhdHRlcm5TdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1hdGNoZXIgaWdub3JlcyBjYXNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpZ25vcmVzQ2FzZSgpIHsKLQkJcmV0dXJuIHRoaXMuaWdub3Jlc0Nhc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgdGhlIG1hdGNoZXIgaWdub3JlcyBjYXNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRJZ25vcmVzQ2FzZShib29sZWFuIGlnbm9yZXNDYXNlKSB7Ci0JCXRoaXMuaWdub3Jlc0Nhc2UgPSBpZ25vcmVzQ2FzZTsKLQkJdGhpcy5yZWJ1aWxkUGF0dGVybigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBQYXR0ZXJuIHBhdHRlcm4oKSB7Ci0JCXJldHVybiB0aGlzLnBhdHRlcm47Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG90aGVyIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0bwotCSAqIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyByZWd1bGFyRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydFRvUmVnRXgodGhpcy5wYXR0ZXJuU3RyaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvUmVnRXgoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHN0cmluZy5sZW5ndGgoKSArIDEwKTsKLQkJdGhpcy5jb252ZXJ0VG9SZWdFeE9uKHRoaXMucHJlZml4KCksIHNiKTsKLQkJdGhpcy5jb252ZXJ0VG9SZWdFeE9uKHN0cmluZywgc2IpOwotCQl0aGlzLmNvbnZlcnRUb1JlZ0V4T24odGhpcy5zdWZmaXgoKSwgc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW55IHByZWZpeCB0aGF0IHNob3VsZCBiZSBwcmVwZW5kZWQgdG8gdGhlIG9yaWdpbmFsCi0JICogc3RyaW5nLiBCeSBkZWZhdWx0LCB0aGVyZSBpcyBubyBwcmVmaXguCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXgoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbnkgc3VmZml4IHRoYXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSBvcmlnaW5hbAotCSAqIHN0cmluZy4gU2luY2UgdGhpcyBjbGFzcyBpcyB0eXBpY2FsbHkgdXNlZCBpbiBVSSBzaXR1YXRpb24gd2hlcmUKLQkgKiB0aGUgdXNlciBpcyB0eXBpbmcgaW4gYSBwYXR0ZXJuIHVzZWQgdG8gZmlsdGVyIGEgbGlzdCwgdGhlIGRlZmF1bHQKLQkgKiBzdWZmaXggaXMgYSB3aWxkY2FyZCBjaGFyYWN0ZXIuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdWZmaXgoKSB7Ci0JCXJldHVybiAiKiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbnZlcnRUb1JlZ0V4T24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXJbXSBjaGFyQXJyYXkgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGxlbmd0aCA9IGNoYXJBcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgYyA9IGNoYXJBcnJheVtpXTsKLQkJCS8vIGNvbnZlcnQgdXNlci1mcmllbmRseSBtZXRhLWNoYXJzIGludG8gcmVnZXggbWV0YS1jaGFycwotCQkJaWYgKGMgPT0gJyonKSB7Ci0JCQkJc2IuYXBwZW5kKCIuKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoYyA9PSAnPycpIHsKLQkJCQlzYi5hcHBlbmQoJy4nKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIGVzY2FwZSByZWdleCBtZXRhLWNoYXJzCi0JCQlpZiAoQXJyYXlUb29scy5jb250YWlucyhSRUdfRVhfTUVUQV9DSEFSUywgYykpIHsKLQkJCQlzYi5hcHBlbmQoJ1xcJyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVUaHJlYWRGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlVGhyZWFkRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTM2MDBmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVUaHJlYWRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLQotLyoqCi0gKiBBIDxjb2RlPlNpbXBsZVRocmVhZEZhY3Rvcnk8L2NvZGU+IGlzIGEgc3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mCi0gKiB0aGUgSkRLIHtAbGluayBUaHJlYWRGYWN0b3J5fS4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVRocmVhZEZhY3RvcnkKLQlpbXBsZW1lbnRzIFRocmVhZEZhY3RvcnkKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVUaHJlYWRGYWN0b3J5IElOU1RBTkNFID0gbmV3IFNpbXBsZVRocmVhZEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGhyZWFkRmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBTaW1wbGVUaHJlYWRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHIpIHsKLQkJcmV0dXJuIG5ldyBUaHJlYWQocik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdGFjay5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NWMxMGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLS8qKgotICogSW50ZXJmYWNlIGRlZmluaW5nIHRoZSBjbGFzc2ljIHN0YWNrIGJlaGF2aW9yLAotICogd2l0aG91dCB0aGUgYmFja2Rvb3JzIGFsbG93ZWQgYnkge0BsaW5rIGphdmEudXRpbC5TdGFja30uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgY29udGFpbmVkIGJ5IHRoZSBzdGFjawotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YWNrPEU+IHsKLQotCS8qKgotCSAqICJQdXNoIiB0aGUgc3BlY2lmaWVkIGl0ZW0gb24gdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0JICovCi0Jdm9pZCBwdXNoKEUgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiAiUG9wIiBhbiBpdGVtIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0JICovCi0JRSBwb3AoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIHdpdGhvdXQgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgc3RhY2suCi0JICovCi0JRSBwZWVrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3RhY2sgaXMgZW1wdHkuCi0JICovCi0JYm9vbGVhbiBpc0VtcHR5KCk7Ci0KLQotCWZpbmFsIGNsYXNzIEVtcHR5PEU+IGltcGxlbWVudHMgU3RhY2s8RT4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RhY2sgSU5TVEFOQ0UgPSBuZXcgRW1wdHkoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFQ+IFN0YWNrPFQ+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBFbXB0eSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcHVzaChFIGVsZW1lbnQpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCXB1YmxpYyBFIHBvcCgpIHsKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIEUgcGVlaygpIHsKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdGF0ZWZ1bENvbW1hbmRFeGVjdXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZmQzN2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBjbGllbnRzIHRvIGNvbnRyb2wgaG93IGEgY29tbWFuZCBpcyBleGVjdXRlZC4KLSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHNlcnZlciBwcm92aWRlcyB0aGUgY29tbWFuZCBidXQgdGhlIGNsaWVudCBwcm92aWRlcwotICogdGhlIGNvbnRleHQgKGUuZy4gdGhlIGNsaWVudCB3b3VsZCBsaWtlIHRvIGRpc3BhdGNoIHRoZSBjb21tYW5kIHRvIHRoZSBVSQotICogdGhyZWFkKS4KLSAqLwotcHVibGljIGludGVyZmFjZSBTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcgotCWV4dGVuZHMgQ29tbWFuZEV4ZWN1dG9yCi17Ci0JLyoqCi0JICogU3RhcnQgdGhlIGNvbW1hbmQgZXhlY3V0b3IuCi0JICovCi0Jdm9pZCBzdGFydCgpOwotCi0JLyoqCi0JICogU3RvcCB0aGUgY29tbWFuZCBleGVjdXRvci4KLQkgKi8KLQl2b2lkIHN0b3AoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0cmluZ0NvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0cmluZ0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTk4MWEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBVc2VkIGJ5IHZhcmlvdXMgInBsdWdnYWJsZSIgY2xhc3NlcyB0byB0cmFuc2Zvcm0gb2JqZWN0cwotICogaW50byBzdHJpbmdzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0cmluZ0NvbnZlcnRlcjxUPiB7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gYSBzdHJpbmcuCi0JICogVGhlIHNlbWFudGljcyBvZiAiY29udmVydCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhUIG8pOwotCi0KLQlmaW5hbCBjbGFzcyBEZWZhdWx0PFM+IGltcGxlbWVudHMgU3RyaW5nQ29udmVydGVyPFM+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ0NvbnZlcnRlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0KCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBTdHJpbmdDb252ZXJ0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERlZmF1bHQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIG9iamVjdCdzICN0b1N0cmluZygpIHJlc3VsdAotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTIG8pIHsKLQkJCXJldHVybiAobyA9PSBudWxsKSA/IG51bGwgOiBvLnRvU3RyaW5nKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlN0cmluZ0NvbnZlcnRlci5EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIFN0cmluZ0NvbnZlcnRlcjxTPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdDb252ZXJ0ZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IFN0cmluZ0NvbnZlcnRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0cmluZ01hdGNoZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTI5MDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0cmluZ01hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgc2ltcGxlIEFQSSBmb3IgYWxsb3dpbmcgInBsdWdnYWJsZSIKLSAqIHN0cmluZyBtYXRjaGVycyB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHdpdGggYSBwYXR0ZXJuIHN0cmluZwotICogdGhlbiB1c2VkIHRvIGRldGVybWluZSB3aGF0IHN0cmluZ3MgbWF0Y2ggdGhlIHBhdHRlcm4uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RyaW5nTWF0Y2hlciB7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHBhdHRlcm4gc3RyaW5nIHVzZWQgdG8gZGV0ZXJtaW5lIGZ1dHVyZQotCSAqIG1hdGNoZXMuIFRoZSBmb3JtYXQgYW5kIHNlbWFudGljcyBvZiB0aGUgcGF0dGVybgotCSAqIHN0cmluZyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUKLQkgKiBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0Jdm9pZCBzZXRQYXR0ZXJuU3RyaW5nKFN0cmluZyBwYXR0ZXJuU3RyaW5nKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIG1hdGNoZXMgdGhlCi0JICogZXN0YWJsaXNoZWQgcGF0dGVybiBzdHJpbmcuIFRoZSBzZW1hbnRpY3Mgb2YgYSBtYXRjaAotCSAqIGlzIGRldGVybWluZWQgYnkgdGhlIGNvbnRyYWN0IGJldHdlZW4gdGhlCi0JICogY2xpZW50IGFuZCB0aGUgc2VydmVyLgotCSAqLwotCWJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgc3RyaW5nKTsKLQotCi0JZmluYWwgY2xhc3MgTnVsbCBpbXBsZW1lbnRzIFN0cmluZ01hdGNoZXIsIFNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nTWF0Y2hlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nTWF0Y2hlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0UGF0dGVyblN0cmluZyhTdHJpbmcgcGF0dGVyblN0cmluZykgewotCQkJLy8gaWdub3JlIHRoZSBwYXR0ZXJuIHN0cmluZwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHN0cmluZykgewotCQkJLy8gZXZlcnl0aGluZyBpcyBhIG1hdGNoCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiU3RyaW5nTWF0Y2hlci5OdWxsIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0cmluZ1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYmViNDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0cmluZ1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqIENvbnZlbmllbmNlIG1ldGhvZHMgcmVsYXRlZCB0byB0aGUgamF2YS5sYW5nLlN0cmluZyBjbGFzcy4KLSAqIAotICogQXMgb2YgamRrIDEuNSwgaXQncyB0ZW1wdGluZyB0byBjb252ZXJ0IGFsbCBvZiB0aGVzZSBtZXRob2RzIHRvIHVzZQotICogamF2YS5sYW5nLkFwcGVuZGFibGUgKGluc3RlYWQgb2YgU3RyaW5nQnVmZmVyLCBTdHJpbmdCdWlsZGVyLCBhbmQgV3JpdGVyKTsKLSAqIGJ1dCBhbGwgdGhlIEFwcGVuZGFibGUgbWV0aG9kcyB0aHJvdyBqYXZhLmlvLklPRXhjZXB0aW9uICh5ZWNoKSBhbmQgd2UKLSAqIFttaWdodD9dIGdldCBhIGJpdCBiZXR0ZXIgcGVyZm9ybWFuY2UgaW52b2tpbmcgbWV0aG9kcyBvbiBjbGFzc2VzIHRoYW4KLSAqIHdlIGdldCBvbiBpbnRlcmZhY2VzLiA6LSkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0cmluZ1Rvb2xzIHsKLQotCS8qKiBjYXJyaWFnZSByZXR1cm4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgIC8vJE5PTi1OTFMtMSQKLQotCS8qKiBkb3VibGUgcXVvdGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUVVPVEUgPSAnIic7Ci0KLQkvKiogcGFyZW50aGVzaXMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT1BFTl9QQVJFTlRIRVNJUyA9ICcoJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0xPU0VfUEFSRU5USEVTSVMgPSAnKSc7Ci0KLQkvKiogYnJhY2tldHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT1BFTl9CUkFDS0VUID0gJ1snOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDTE9TRV9CUkFDS0VUID0gJ10nOwotCi0JLyoqIGJyYWNrZXRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9QRU5fQlJBQ0UgPSAneyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENMT1NFX0JSQUNFID0gJ30nOwotCi0JLyoqIGJyYWNrZXRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9QRU5fQ0hFVlJPTiA9ICc8JzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0xPU0VfQ0hFVlJPTiA9ICc+JzsKLQotCS8qKiBlbXB0eSBzdHJpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIGVtcHR5IGNoYXIgYXJyYXkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBFTVBUWV9DSEFSX0FSUkFZID0gbmV3IGNoYXJbMF07Ci0KLQotCi0JLy8gKioqKioqKioqKiBwYWRkaW5nL3RydW5jYXRpbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZChpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHBhZChzdHJpbmcsIGxlbmd0aCwgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJcGFkT24oc3RyaW5nLCBsZW5ndGgsICcgJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlwYWRPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlwYWRPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWQoaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZChTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBwYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZChpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcGFkKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHBhZChzdHJpbmcsIGxlbmd0aCwgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCB3cml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJcGFkT24oc3RyaW5nLCBsZW5ndGgsICcgJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlwYWRPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlwYWRPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWQoaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHBhZChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gcGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGUoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZE9yVHJ1bmNhdGUoU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gcGFkT3JUcnVuY2F0ZShzdHJpbmcsIGxlbmd0aCwgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlwYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGUoaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZE9yVHJ1bmNhdGUoU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDAsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIHBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcuc3Vic3RyaW5nKDAsIGxlbmd0aCksIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcuc3Vic3RyaW5nKDAsIGxlbmd0aCkpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBwYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHBhZE9yVHJ1bmNhdGUoc3RyaW5nLCBsZW5ndGgsICcgJyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlwYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcgJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGUoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGUoaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHBhZE9yVHJ1bmNhdGUoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIDAsIGxlbmd0aCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBwYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgbGVuZ3RoLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFkXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcocGFkXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuZ3RoLCBjKSk7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhZE9uXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlmaWxsXyhzdHJpbmcubGVuZ3RoKCksIGxlbmd0aCwgYywgd3JpdGVyKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHdyaXRlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJZmlsbF8oc3RyaW5nLmxlbmd0aCwgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKGludCBzdHJpbmdMZW5ndGgsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKEFycmF5VG9vbHMuZmlsbChuZXcgY2hhcltsZW5ndGggLSBzdHJpbmdMZW5ndGhdLCBjKSwgd3JpdGVyKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmaWxsXyhzdHJpbmcubGVuZ3RoKCksIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmaWxsXyhzdHJpbmcubGVuZ3RoLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oaW50IHN0cmluZ0xlbmd0aCwgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKEFycmF5VG9vbHMuZmlsbChuZXcgY2hhcltsZW5ndGggLSBzdHJpbmdMZW5ndGhdLCBjKSk7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhZE9uXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLmxlbmd0aCgpLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlmaWxsXyhzdHJpbmcubGVuZ3RoLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKGludCBzdHJpbmdMZW5ndGgsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoQXJyYXlUb29scy5maWxsKG5ldyBjaGFyW2xlbmd0aCAtIHN0cmluZ0xlbmd0aF0sIGMpKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBwYWRfKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIDAsIHN0cmluZ0xlbmd0aCk7Ci0JCUFycmF5cy5maWxsKHJlc3VsdCwgc3RyaW5nTGVuZ3RoLCBsZW5ndGgsIGMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYWRPbl8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25fKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYWRPbl8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZChpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgemVyb1BhZChTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmcm9udFBhZChzdHJpbmcsIGxlbmd0aCwgJzAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPbihpbnQsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZyb250UGFkT24oc3RyaW5nLCBsZW5ndGgsICcwJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9uKGludCwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmcm9udFBhZChTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBmcm9udFBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWQoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHplcm9QYWQoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gZnJvbnRQYWQoc3RyaW5nLCBsZW5ndGgsICcwJyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT24oaW50LCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZyb250UGFkT24oc3RyaW5nLCBsZW5ndGgsICcwJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmcm9udFBhZE9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWZyb250UGFkT24oc3RyaW5nLCBsZW5ndGgsICcwJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZChpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gZnJvbnRQYWQoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGZyb250UGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPclRydW5jYXRlKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB6ZXJvUGFkT3JUcnVuY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmcm9udFBhZE9yVHJ1bmNhdGUoc3RyaW5nLCBsZW5ndGgsICcwJyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGVPbihpbnQsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZyb250UGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcwJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcwJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPclRydW5jYXRlKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmcm9udFBhZE9yVHJ1bmNhdGUoU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmcuc3Vic3RyaW5nKHN0cmluZ0xlbmd0aCAtIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIGZyb250UGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLnN1YnN0cmluZyhzdHJpbmdMZW5ndGggLSBsZW5ndGgpLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLnN1YnN0cmluZyhzdHJpbmdMZW5ndGggLSBsZW5ndGgpKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcuc3Vic3RyaW5nKHN0cmluZ0xlbmd0aCAtIGxlbmd0aCkpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPclRydW5jYXRlKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSB6ZXJvUGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmcm9udFBhZE9yVHJ1bmNhdGUoc3RyaW5nLCBsZW5ndGgsICcwJyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGVPbihpbnQsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZyb250UGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcwJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcwJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUgCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZShpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gZnJvbnRQYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoLCByZXN1bHQsIDAsIGxlbmd0aCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBmcm9udFBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUgCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCBzdHJpbmdMZW5ndGggLSBsZW5ndGgsIGxlbmd0aCwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZSAKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCBzdHJpbmdMZW5ndGggLSBsZW5ndGgsIGxlbmd0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZSAKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcsIHN0cmluZ0xlbmd0aCAtIGxlbmd0aCwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEZyb250LXBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmcm9udFBhZF8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGZyb250UGFkXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuZ3RoLCBjKSk7Ci0JfQotCi0JLyoKLQkgKiBaZXJvLXBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBmcm9udFBhZF8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOwotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaW50IHBhZExlbmd0aCA9IGxlbmd0aCAtIHN0cmluZ0xlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDAsIHJlc3VsdCwgcGFkTGVuZ3RoLCBzdHJpbmdMZW5ndGgpOwotCQlBcnJheXMuZmlsbChyZXN1bHQsIDAsIHBhZExlbmd0aCwgYyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZyb250UGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZyb250UGFkT25fKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZyb250UGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmcm9udFBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbl8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmcm9udFBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlbGltaXRpbmcvcXVvdGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHF1b3RlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIGRlbGltaXQoc3RyaW5nLCBRVU9URSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcXVvdGVPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWRlbGltaXRPbihzdHJpbmcsIFFVT1RFLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWRlbGltaXRPbihzdHJpbmcsIFFVT1RFLCBzYik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcXVvdGVPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWRlbGltaXRPbihzdHJpbmcsIFFVT1RFLCBzYik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiBhIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IHF1b3RlKEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncykgewotCQlyZXR1cm4gZGVsaW1pdChzdHJpbmdzLCBRVU9URSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGltaXQoU3RyaW5nIHN0cmluZywgY2hhciBkZWxpbWl0ZXIpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoZGVsaW1pdChzdHJpbmcudG9DaGFyQXJyYXkoKSwgZGVsaW1pdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oU3RyaW5nIHN0cmluZywgY2hhciBkZWxpbWl0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBkZWxpbWl0ZXIsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oU3RyaW5nIHN0cmluZywgY2hhciBkZWxpbWl0ZXIsIFN0cmluZ0J1ZmZlciBzYikgewotCQlkZWxpbWl0T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGRlbGltaXRlciwgc2IpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIGNoYXIgZGVsaW1pdGVyLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWRlbGltaXRPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgZGVsaW1pdGVyLCBzYik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gYSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPFN0cmluZz4gZGVsaW1pdChJdGVyYWJsZTxTdHJpbmc+IHN0cmluZ3MsIGNoYXIgZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIFN0cmluZz4oc3RyaW5ncywgbmV3IENoYXJTdHJpbmdEZWxpbWl0ZXIoZGVsaW1pdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gYSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gZGVsaW1pdChJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MsIGNoYXIgZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4oc3RyaW5ncywgbmV3IENoYXJTdHJpbmdEZWxpbWl0ZXIoZGVsaW1pdGVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hhclN0cmluZ0RlbGltaXRlciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPFN0cmluZywgU3RyaW5nPiB7Ci0JCXByaXZhdGUgY2hhciBkZWxpbWl0ZXI7Ci0JCUNoYXJTdHJpbmdEZWxpbWl0ZXIoY2hhciBkZWxpbWl0ZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlbGltaXRlciA9IGRlbGltaXRlcjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgc3RyaW5nKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuZGVsaW1pdChzdHJpbmcsIHRoaXMuZGVsaW1pdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGltaXQoU3RyaW5nIHN0cmluZywgU3RyaW5nIGRlbGltaXRlcikgewotCQlpZiAoZGVsaW1pdGVyLmxlbmd0aCgpID09IDEpIHsKLQkJCXJldHVybiBkZWxpbWl0KHN0cmluZywgZGVsaW1pdGVyLmNoYXJBdCgwKSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoZGVsaW1pdChzdHJpbmcudG9DaGFyQXJyYXkoKSwgZGVsaW1pdGVyLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGgoKSA9PSAxKSB7Ci0JCQlkZWxpbWl0T24oc3RyaW5nLCBkZWxpbWl0ZXIuY2hhckF0KDApLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBkZWxpbWl0ZXIudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oU3RyaW5nIHN0cmluZywgU3RyaW5nIGRlbGltaXRlciwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmIChkZWxpbWl0ZXIubGVuZ3RoKCkgPT0gMSkgewotCQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyLmNoYXJBdCgwKSwgc2IpOwotCQl9IGVsc2UgewotCQkJZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBkZWxpbWl0ZXIudG9DaGFyQXJyYXkoKSwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWlmIChkZWxpbWl0ZXIubGVuZ3RoKCkgPT0gMSkgewotCQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyLmNoYXJBdCgwKSwgc2IpOwotCQl9IGVsc2UgewotCQkJZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBkZWxpbWl0ZXIudG9DaGFyQXJyYXkoKSwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gYSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8U3RyaW5nPiBkZWxpbWl0KEl0ZXJhYmxlPFN0cmluZz4gc3RyaW5ncywgU3RyaW5nIGRlbGltaXRlcikgewotCQlyZXR1cm4gKGRlbGltaXRlci5sZW5ndGgoKSA9PSAxKSA/Ci0JCQkJZGVsaW1pdChzdHJpbmdzLCBkZWxpbWl0ZXIuY2hhckF0KDApKSA6Ci0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MsIG5ldyBTdHJpbmdTdHJpbmdEZWxpbWl0ZXIoZGVsaW1pdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gYSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiBkZWxpbWl0KEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncywgU3RyaW5nIGRlbGltaXRlcikgewotCQlyZXR1cm4gKGRlbGltaXRlci5sZW5ndGgoKSA9PSAxKSA/Ci0JCQkJZGVsaW1pdChzdHJpbmdzLCBkZWxpbWl0ZXIuY2hhckF0KDApKSA6Ci0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MsIG5ldyBTdHJpbmdTdHJpbmdEZWxpbWl0ZXIoZGVsaW1pdGVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RyaW5nU3RyaW5nRGVsaW1pdGVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+IHsKLQkJcHJpdmF0ZSBTdHJpbmcgZGVsaW1pdGVyOwotCQlTdHJpbmdTdHJpbmdEZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGVsaW1pdGVyID0gZGVsaW1pdGVyOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzdHJpbmcpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5kZWxpbWl0KHN0cmluZywgdGhpcy5kZWxpbWl0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBxdW90ZShjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBkZWxpbWl0KHN0cmluZywgUVVPVEUpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlkZWxpbWl0T24oc3RyaW5nLCBRVU9URSwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBxdW90ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlkZWxpbWl0T24oc3RyaW5nLCBRVU9URSwgc2IpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlkZWxpbWl0T24oc3RyaW5nLCBRVU9URSwgc2IpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gYSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCS8vIGNhbm5vdCBuYW1lIG1ldGhvZCBzaW1wbHkgJ3F1b3RlJyBiZWNhdXNlIG9mIHR5cGUtZXJhc3VyZS4uLgotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8Y2hhcltdPiBxdW90ZUNoYXJBcnJheXMoSXRlcmF0b3I8Y2hhcltdPiBzdHJpbmdzKSB7Ci0JCXJldHVybiBkZWxpbWl0Q2hhckFycmF5cyhzdHJpbmdzLCBRVU9URSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGRlbGltaXQoY2hhcltdIHN0cmluZywgY2hhciBkZWxpbWl0ZXIpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0cmluZy5sZW5ndGggKyAyKTsKLQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyLCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgZGVsaW1pdGVyLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlQ2hhck9uKGRlbGltaXRlciwgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIGRlbGltaXRlciwgd3JpdGVyKTsKLQkJd3JpdGVDaGFyT24oZGVsaW1pdGVyLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgZGVsaW1pdGVyLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlpZiAoYyA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCX0KLQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oY2hhcltdIHN0cmluZywgY2hhciBkZWxpbWl0ZXIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlpZiAoYyA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCX0KLQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gYSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQkvLyBjYW5ub3QgbmFtZSBtZXRob2Qgc2ltcGx5ICdkZWxpbWl0JyBiZWNhdXNlIG9mIHR5cGUtZXJhc3VyZS4uLgotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Y2hhcltdPiBkZWxpbWl0Q2hhckFycmF5cyhJdGVyYWJsZTxjaGFyW10+IHN0cmluZ3MsIGNoYXIgZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncywgbmV3IENoYXJDaGFyQXJyYXlEZWxpbWl0ZXIoZGVsaW1pdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gYSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQkvLyBjYW5ub3QgbmFtZSBtZXRob2Qgc2ltcGx5ICdkZWxpbWl0JyBiZWNhdXNlIG9mIHR5cGUtZXJhc3VyZS4uLgotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8Y2hhcltdPiBkZWxpbWl0Q2hhckFycmF5cyhJdGVyYXRvcjxjaGFyW10+IHN0cmluZ3MsIGNoYXIgZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncywgbmV3IENoYXJDaGFyQXJyYXlEZWxpbWl0ZXIoZGVsaW1pdGVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hhckNoYXJBcnJheURlbGltaXRlciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPGNoYXJbXSwgY2hhcltdPiB7Ci0JCXByaXZhdGUgY2hhciBkZWxpbWl0ZXI7Ci0JCUNoYXJDaGFyQXJyYXlEZWxpbWl0ZXIoY2hhciBkZWxpbWl0ZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlbGltaXRlciA9IGRlbGltaXRlcjsKLQkJfQotCQlwdWJsaWMgY2hhcltdIHRyYW5zZm9ybShjaGFyW10gc3RyaW5nKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuZGVsaW1pdChzdHJpbmcsIHRoaXMuZGVsaW1pdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGRlbGltaXQoY2hhcltdIHN0cmluZywgY2hhcltdIGRlbGltaXRlcikgewotCQlpbnQgZGVsaW1pdGVyTGVuZ3RoID0gZGVsaW1pdGVyLmxlbmd0aDsKLQkJaWYgKGRlbGltaXRlckxlbmd0aCA9PSAxKSB7Ci0JCQlyZXR1cm4gZGVsaW1pdChzdHJpbmcsIGRlbGltaXRlclswXSk7Ci0JCX0KLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltzdHJpbmdMZW5ndGgrKDIqZGVsaW1pdGVyTGVuZ3RoKV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoZGVsaW1pdGVyLCAwLCByZXN1bHQsIDAsIGRlbGltaXRlckxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIGRlbGltaXRlckxlbmd0aCwgc3RyaW5nTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShkZWxpbWl0ZXIsIDAsIHJlc3VsdCwgc3RyaW5nTGVuZ3RoK2RlbGltaXRlckxlbmd0aCwgZGVsaW1pdGVyTGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGNoYXJbXSBkZWxpbWl0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGggPT0gMSkgewotCQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyWzBdLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJd3JpdGVTdHJpbmdPbihkZWxpbWl0ZXIsIHdyaXRlcik7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJCXdyaXRlU3RyaW5nT24oZGVsaW1pdGVyLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBjaGFyW10gZGVsaW1pdGVyLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGggPT0gMSkgewotCQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyWzBdLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGNoYXJbXSBkZWxpbWl0ZXIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGggPT0gMSkgewotCQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyWzBdLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiBhIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JLy8gY2Fubm90IG5hbWUgbWV0aG9kIHNpbXBseSAnZGVsaW1pdCcgYmVjYXVzZSBvZiB0eXBlLWVyYXN1cmUuLi4KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPGNoYXJbXT4gZGVsaW1pdENoYXJBcnJheXMoSXRlcmFibGU8Y2hhcltdPiBzdHJpbmdzLCBjaGFyW10gZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncywgbmV3IENoYXJBcnJheUNoYXJBcnJheURlbGltaXRlcihkZWxpbWl0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiBhIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JLy8gY2Fubm90IG5hbWUgbWV0aG9kIHNpbXBseSAnZGVsaW1pdCcgYmVjYXVzZSBvZiB0eXBlLWVyYXN1cmUuLi4KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPGNoYXJbXT4gZGVsaW1pdENoYXJBcnJheXMoSXRlcmF0b3I8Y2hhcltdPiBzdHJpbmdzLCBjaGFyW10gZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncywgbmV3IENoYXJBcnJheUNoYXJBcnJheURlbGltaXRlcihkZWxpbWl0ZXIpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDaGFyQXJyYXlDaGFyQXJyYXlEZWxpbWl0ZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxjaGFyW10sIGNoYXJbXT4gewotCQlwcml2YXRlIGNoYXJbXSBkZWxpbWl0ZXI7Ci0JCUNoYXJBcnJheUNoYXJBcnJheURlbGltaXRlcihjaGFyW10gZGVsaW1pdGVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kZWxpbWl0ZXIgPSBkZWxpbWl0ZXI7Ci0JCX0KLQkJcHVibGljIGNoYXJbXSB0cmFuc2Zvcm0oY2hhcltdIHN0cmluZykgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmRlbGltaXQoc3RyaW5nLCB0aGlzLmRlbGltaXRlcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVsaW1pdGluZyBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHF1b3RlZDogIlwiZm9vXCIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc1F1b3RlZChTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIFFVT1RFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBwYXJlbnRoZXRpY2FsOiAiKGZvbykiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc1BhcmVudGhldGljYWwoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX1BBUkVOVEhFU0lTLCBDTE9TRV9QQVJFTlRIRVNJUyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYnJhY2tldGVkOiAiW2Zvb10iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0JyYWNrZXRlZChTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fQlJBQ0tFVCwgQ0xPU0VfQlJBQ0tFVCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYnJhY2VkOiAie2Zvb30iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0JyYWNlZChTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fQlJBQ0UsIENMT1NFX0JSQUNFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBjaGV2cm9uZWQ6ICI8Zm9vPiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzQ2hldnJvbmVkKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9DSEVWUk9OLCBDTE9TRV9DSEVWUk9OKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNwZWNpZmllZAotCSAqIGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNEZWxpbWl0ZWQoU3RyaW5nIHN0cmluZywgY2hhciBjKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIGMsIGMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGRlbGltaXRlZCBieSB0aGUgc3BlY2lmaWVkCi0JICogY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNEZWxpbWl0ZWQoU3RyaW5nIHN0cmluZywgY2hhciBzdGFydCwgY2hhciBlbmQpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA8IDIpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLnRvQ2hhckFycmF5KCksIHN0YXJ0LCBlbmQsIGxlbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgcXVvdGVkOiAiXCJmb29cIiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzUXVvdGVkKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgUVVPVEUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHBhcmVudGhldGljYWw6ICIoZm9vKSIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzUGFyZW50aGV0aWNhbChjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fUEFSRU5USEVTSVMsIENMT1NFX1BBUkVOVEhFU0lTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBicmFja2V0ZWQ6ICJbZm9vXSIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzQnJhY2tldGVkKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9CUkFDS0VULCBDTE9TRV9CUkFDS0VUKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBicmFjZWQ6ICJ7Zm9vfSIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzQnJhY2VkKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9CUkFDRSwgQ0xPU0VfQlJBQ0UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGNoZXZyb25lZDogIjxmb28+Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNDaGV2cm9uZWQoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX0NIRVZST04sIENMT1NFX0NIRVZST04pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGRlbGltaXRlZCBieSB0aGUgc3BlY2lmaWVkCi0JICogY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0RlbGltaXRlZChjaGFyW10gc3RyaW5nLCBjaGFyIGMpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgYywgYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgZGVsaW1pdGVkIGJ5IHRoZSBzcGVjaWZpZWQKLQkgKiBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0RlbGltaXRlZChjaGFyW10gc3RyaW5nLCBjaGFyIHN0YXJ0LCBjaGFyIGVuZCkgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA8IDIpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBzdGFydCwgZW5kLCBsZW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNEZWxpbWl0ZWQoY2hhcltdIHMsIGNoYXIgc3RhcnQsIGNoYXIgZW5kLCBpbnQgbGVuKSB7Ci0JCXJldHVybiAoc1swXSA9PSBzdGFydCkgJiYgKHNbbGVuIC0gMV0gPT0gZW5kKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdW5kZWxpbWl0aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZGVsaW1pdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZW1vdmluZyBhbnkgZXNjYXBlCi0JICogY2hhcmFjdGVycy4gVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0Ci0JICogdG8gdW5kZWxpbWl0IChpLmUuIGxlbmd0aCA8IDIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZGVsaW1pdChTdHJpbmcgc3RyaW5nKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCkgLSAyOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIHN0cmluZyArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcodW5kZWxpbWl0XyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjb3VudCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW5kZWxpbWl0ZWQsIHRocm93IGFuCi0JICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byB1bmRlbGltaXQgc3RyaW5ncyB0aGF0IGRvIG5vdCBlc2NhcGUgZW1iZWRkZWQKLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZGVsaW1pdChTdHJpbmcgc3RyaW5nLCBpbnQgY291bnQpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKSAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIHN0cmluZyArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcodW5kZWxpbWl0KHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4sIGNvdW50KSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBkZWxpbWl0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcsIHJlbW92aW5nIGFueSBlc2NhcGUKLQkgKiBjaGFyYWN0ZXJzLiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQKLQkgKiB0byB1bmRlbGltaXQgKGkuZS4gbGVuZ3RoIDwgMikuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gdW5kZWxpbWl0KGNoYXJbXSBzdHJpbmcpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGggLSAyOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIG5ldyBTdHJpbmcoc3RyaW5nKSArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9DSEFSX0FSUkFZOwotCQl9Ci0JCXJldHVybiB1bmRlbGltaXRfKHN0cmluZywgbGVuKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gdW5kZWxpbWl0XyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW5ndGgpOwotCQl1bmRlbGltaXRPbl8oc3RyaW5nLCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3QgYW5kIGxhc3QgY291bnQgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0IHRvIGJlIHVuZGVsaW1pdGVkLCB0aHJvdyBhbgotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gdW5kZWxpbWl0IHN0cmluZ3MgdGhhdCBkbyBub3QgZXNjYXBlIGVtYmVkZGVkCi0JICogZGVsaW1pdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSB1bmRlbGltaXQoY2hhcltdIHN0cmluZywgaW50IGNvdW50KSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gKDIgKiBjb3VudCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX0NIQVJfQVJSQVk7Ci0JCX0KLQkJcmV0dXJuIHVuZGVsaW1pdChzdHJpbmcsIGxlbiwgY291bnQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSB1bmRlbGltaXQoY2hhcltdIHN0cmluZywgaW50IGxlbiwgaW50IGNvdW50KSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgY291bnQsIHJlc3VsdCwgMCwgbGVuKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGRlbGltaXRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmVtb3ZpbmcgYW55IGVzY2FwZQotCSAqIGNoYXJhY3RlcnMuIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydAotCSAqIHRvIHVuZGVsaW1pdCAoaS5lLiBsZW5ndGggPCAyKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl1bmRlbGltaXRPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IGFuZCBsYXN0IGNvdW50IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydCB0byBiZSB1bmRlbGltaXRlZCwgdGhyb3cgYW4KLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIHVuZGVsaW1pdCBzdHJpbmdzIHRoYXQgZG8gbm90IGVzY2FwZSBlbWJlZGRlZAotCSAqIGRlbGltaXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIGludCBjb3VudCwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpIC0gKDIgKiBjb3VudCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgc3RyaW5nICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCBjb3VudCwgbGVuLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZGVsaW1pdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZW1vdmluZyBhbnkgZXNjYXBlCi0JICogY2hhcmFjdGVycy4gVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0Ci0JICogdG8gdW5kZWxpbWl0IChpLmUuIGxlbmd0aCA8IDIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJdW5kZWxpbWl0T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IGFuZCBsYXN0IGNvdW50IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydCB0byBiZSB1bmRlbGltaXRlZCwgdGhyb3cgYW4KLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIHVuZGVsaW1pdCBzdHJpbmdzIHRoYXQgZG8gbm90IGVzY2FwZSBlbWJlZGRlZAotCSAqIGRlbGltaXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIGludCBjb3VudCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCkgLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBzdHJpbmcgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2IuYXBwZW5kKHN0cmluZywgY291bnQsIGNvdW50ICsgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGRlbGltaXRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmVtb3ZpbmcgYW55IGVzY2FwZQotCSAqIGNoYXJhY3RlcnMuIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydAotCSAqIHRvIHVuZGVsaW1pdCAoaS5lLiBsZW5ndGggPCAyKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQl1bmRlbGltaXRPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3QgYW5kIGxhc3QgY291bnQgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0IHRvIGJlIHVuZGVsaW1pdGVkLCB0aHJvdyBhbgotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gdW5kZWxpbWl0IHN0cmluZ3MgdGhhdCBkbyBub3QgZXNjYXBlIGVtYmVkZGVkCi0JICogZGVsaW1pdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oU3RyaW5nIHN0cmluZywgaW50IGNvdW50LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCkgLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBzdHJpbmcgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2IuYXBwZW5kKHN0cmluZywgY291bnQsIGNvdW50ICsgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGRlbGltaXRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmVtb3ZpbmcgYW55IGVzY2FwZQotCSAqIGNoYXJhY3RlcnMuIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydAotCSAqIHRvIHVuZGVsaW1pdCAoaS5lLiBsZW5ndGggPCAyKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtIDI7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXVuZGVsaW1pdE9uXyhzdHJpbmcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogc3RyaW5nIGlzIGF0IGxlYXN0IDMgY2hhcmFjdGVycyBsb25nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbl8oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQljaGFyIGRlbGltaXRlciA9IHN0cmluZ1swXTsgIC8vIHRoZSBmaXJzdCBjaGFyIGlzIHRoZSBkZWxpbWl0ZXIKLQkJY2hhciBjID0gc3RyaW5nWzBdOwotCQljaGFyIG5leHQgPSBzdHJpbmdbMV07Ci0JCWludCBpID0gMTsKLQkJaW50IGxhc3QgPSBzdHJpbmcubGVuZ3RoIC0gMTsKLQkJZG8gewotCQkJYyA9IG5leHQ7Ci0JCQl3cml0ZUNoYXJPbihjLCB3cml0ZXIpOwotCQkJaSsrOwotCQkJbmV4dCA9IHN0cmluZ1tpXTsKLQkJCWlmIChjID09IGRlbGltaXRlcikgewotCQkJCWlmICgobmV4dCAhPSBkZWxpbWl0ZXIpIHx8IChpID09IGxhc3QpKSB7Ci0JCQkJCS8vIGFuIGVtYmVkZGVkIGRlbGltaXRlciBtdXN0IGJlIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGVsaW1pdGVyCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaSsrOwotCQkJCW5leHQgPSBzdHJpbmdbaV07Ci0JCQl9Ci0JCX0gd2hpbGUgKGkgIT0gbGFzdCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjb3VudCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW5kZWxpbWl0ZWQsIHRocm93IGFuCi0JICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byB1bmRlbGltaXQgc3RyaW5ncyB0aGF0IGRvIG5vdCBlc2NhcGUgZW1iZWRkZWQKLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBpbnQgY291bnQsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGggLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBuZXcgU3RyaW5nKHN0cmluZykgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIGNvdW50LCBsZW4sIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBkZWxpbWl0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcsIHJlbW92aW5nIGFueSBlc2NhcGUKLQkgKiBjaGFyYWN0ZXJzLiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQKLQkgKiB0byB1bmRlbGltaXQgKGkuZS4gbGVuZ3RoIDwgMikuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtIDI7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXVuZGVsaW1pdE9uXyhzdHJpbmcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBzdHJpbmcgaXMgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzIGxvbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY2hhciBkZWxpbWl0ZXIgPSBzdHJpbmdbMF07ICAvLyB0aGUgZmlyc3QgY2hhciBpcyB0aGUgZGVsaW1pdGVyCi0JCWNoYXIgYyA9IHN0cmluZ1swXTsKLQkJY2hhciBuZXh0ID0gc3RyaW5nWzFdOwotCQlpbnQgaSA9IDE7Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWRvIHsKLQkJCWMgPSBuZXh0OwotCQkJc2IuYXBwZW5kKGMpOwotCQkJaSsrOwotCQkJbmV4dCA9IHN0cmluZ1tpXTsKLQkJCWlmIChjID09IGRlbGltaXRlcikgewotCQkJCWlmICgobmV4dCAhPSBkZWxpbWl0ZXIpIHx8IChpID09IGxhc3QpKSB7Ci0JCQkJCS8vIGFuIGVtYmVkZGVkIGRlbGltaXRlciBtdXN0IGJlIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGVsaW1pdGVyCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaSsrOwotCQkJCW5leHQgPSBzdHJpbmdbaV07Ci0JCQl9Ci0JCX0gd2hpbGUgKGkgIT0gbGFzdCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjb3VudCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW5kZWxpbWl0ZWQsIHRocm93IGFuCi0JICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byB1bmRlbGltaXQgc3RyaW5ncyB0aGF0IGRvIG5vdCBlc2NhcGUgZW1iZWRkZWQKLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBpbnQgY291bnQsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIG5ldyBTdHJpbmcoc3RyaW5nKSArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlzYi5hcHBlbmQoc3RyaW5nLCBjb3VudCwgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGRlbGltaXRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmVtb3ZpbmcgYW55IGVzY2FwZQotCSAqIGNoYXJhY3RlcnMuIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydAotCSAqIHRvIHVuZGVsaW1pdCAoaS5lLiBsZW5ndGggPCAyKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtIDI7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXVuZGVsaW1pdE9uXyhzdHJpbmcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBzdHJpbmcgaXMgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzIGxvbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWNoYXIgZGVsaW1pdGVyID0gc3RyaW5nWzBdOyAgLy8gdGhlIGZpcnN0IGNoYXIgaXMgdGhlIGRlbGltaXRlcgotCQljaGFyIGMgPSBzdHJpbmdbMF07Ci0JCWNoYXIgbmV4dCA9IHN0cmluZ1sxXTsKLQkJaW50IGkgPSAxOwotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQlkbyB7Ci0JCQljID0gbmV4dDsKLQkJCXNiLmFwcGVuZChjKTsKLQkJCWkrKzsKLQkJCW5leHQgPSBzdHJpbmdbaV07Ci0JCQlpZiAoYyA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlpZiAoKG5leHQgIT0gZGVsaW1pdGVyKSB8fCAoaSA9PSBsYXN0KSkgewotCQkJCQkvLyBhbiBlbWJlZGRlZCBkZWxpbWl0ZXIgbXVzdCBiZSBmb2xsb3dlZCBieSBhbm90aGVyIGRlbGltaXRlcgotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWkrKzsKLQkJCQluZXh0ID0gc3RyaW5nW2ldOwotCQkJfQotCQl9IHdoaWxlIChpICE9IGxhc3QpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3QgYW5kIGxhc3QgY291bnQgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0IHRvIGJlIHVuZGVsaW1pdGVkLCB0aHJvdyBhbgotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gdW5kZWxpbWl0IHN0cmluZ3MgdGhhdCBkbyBub3QgZXNjYXBlIGVtYmVkZGVkCi0JICogZGVsaW1pdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oY2hhcltdIHN0cmluZywgaW50IGNvdW50LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gKDIgKiBjb3VudCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNiLmFwcGVuZChzdHJpbmcsIGNvdW50LCBsZW4pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmluZyBjaGFyYWN0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVGaXJzdE9jY3VycmVuY2UoY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVGaXJzdE9jY3VycmVuY2UoU3RyaW5nIHN0cmluZywgY2hhciBjKSB7Ci0JCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCS8vIGNoYXJhY3RlciBub3QgZm91bmQKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZnJvbnQgb2Ygc3RyaW5nCi0JCQlyZXR1cm4gc3RyaW5nLnN1YnN0cmluZygxKTsKLQkJfQotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGgoKSAtIDE7Ci0JCWlmIChpbmRleCA9PSBsYXN0KSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiBzdHJpbmcKLQkJCXJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDAsIGxhc3QpOwotCQl9Ci0JCS8vIGNoYXJhY3RlciBmb3VuZCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nCi0JCXJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KS5jb25jYXQoc3RyaW5nLnN1YnN0cmluZyhpbmRleCArIDEpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUNoYXJBdEluZGV4T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGluZGV4LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcHJpbnQgdGhlIHJlc3VsdCBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBTdHJpbmcjcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGaXJzdE9jY3VycmVuY2VPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUNoYXJBdEluZGV4T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGluZGV4LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGaXJzdE9jY3VycmVuY2VPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVDaGFyQXRJbmRleE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBpbmRleCwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZShjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUZpcnN0T2NjdXJyZW5jZShjaGFyW10gc3RyaW5nLCBjaGFyIGMpIHsKLQkJaW50IGluZGV4ID0gQXJyYXlUb29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJLy8gY2hhcmFjdGVyIG5vdCBmb3VuZAotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGFzdF07Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGZyb250IG9mIHN0cmluZwotCQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDEsIHJlc3VsdCwgMCwgbGFzdCk7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPT0gbGFzdCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCi0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCAwLCBsYXN0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nCi0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgaW5kZXggKyAxLCByZXN1bHQsIGluZGV4LCBsYXN0IC0gaW5kZXgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcHJpbnQgdGhlIHJlc3VsdCBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBTdHJpbmcjcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyW10gc3RyaW5nLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGluZGV4ID0gQXJyYXlUb29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVDaGFyQXRJbmRleE9uKHN0cmluZywgaW5kZXgsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUNoYXJBdEluZGV4T24oY2hhcltdIHN0cmluZywgaW50IGluZGV4LCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGZyb250IG9mIHN0cmluZwotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDEsIGxhc3QsIHdyaXRlcik7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPT0gbGFzdCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCi0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgbGFzdCwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nCi0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgaW5kZXgsIHdyaXRlcik7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgaW5kZXggKyAxLCBsYXN0IC0gaW5kZXgsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBpbmRleCA9IEFycmF5VG9vbHMuaW5kZXhPZihzdHJpbmcsIGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQ2hhckF0SW5kZXhPbihzdHJpbmcsIGluZGV4LCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUNoYXJBdEluZGV4T24oY2hhcltdIHN0cmluZywgaW50IGluZGV4LCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxhc3QgPSBzdHJpbmcubGVuZ3RoIC0gMTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZnJvbnQgb2Ygc3RyaW5nCi0JCQlzYi5hcHBlbmQoc3RyaW5nLCAxLCBsYXN0KTsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSBsYXN0KSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiBzdHJpbmcKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDAsIGxhc3QpOwotCQl9IGVsc2UgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdHJpbmcKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDAsIGluZGV4KTsKLQkJCXNiLmFwcGVuZChzdHJpbmcsIGluZGV4ICsgMSwgbGFzdCAtIGluZGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHByaW50IHRoZSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgaW5kZXggPSBBcnJheVRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUNoYXJBdEluZGV4T24oc3RyaW5nLCBpbmRleCwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVDaGFyQXRJbmRleE9uKGNoYXJbXSBzdHJpbmcsIGludCBpbmRleCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBmcm9udCBvZiBzdHJpbmcKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDEsIGxhc3QpOwotCQl9IGVsc2UgaWYgKGluZGV4ID09IGxhc3QpIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgbGFzdCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgaW5kZXgpOwotCQkJc2IuYXBwZW5kKHN0cmluZywgaW5kZXggKyAxLCBsYXN0IC0gaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFsbE9jY3VycmVuY2VzKFN0cmluZyBzdHJpbmcsIGNoYXIgYykgewotCQlpbnQgZmlyc3QgPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJcmV0dXJuIChmaXJzdCA9PSAtMSkgPyBzdHJpbmcgOiBuZXcgU3RyaW5nKHJlbW92ZUFsbE9jY3VycmVuY2VzXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgYywgZmlyc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBmaXJzdCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGMsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGMsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgZmlyc3QgPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBjLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUFsbE9jY3VycmVuY2VzKGNoYXJbXSBzdHJpbmcsIGNoYXIgYykgewotCQlpbnQgZmlyc3QgPSBBcnJheVRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJcmV0dXJuIChmaXJzdCA9PSAtMSkgPyBzdHJpbmcgOiByZW1vdmVBbGxPY2N1cnJlbmNlc18oc3RyaW5nLCBjLCBmaXJzdCk7Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHJlbW92ZUFsbE9jY3VycmVuY2VzXyhjaGFyW10gc3RyaW5nLCBjaGFyIGMsIGludCBmaXJzdCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyaW5nLmxlbmd0aCk7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZywgYywgZmlyc3QsIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHdyaXRlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBmaXJzdCA9IEFycmF5VG9vbHMuaW5kZXhPZihzdHJpbmcsIGMpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLCBjLCBmaXJzdCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaGluZyBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oY2hhcltdIHN0cmluZywgY2hhciBjLCBpbnQgZmlyc3QsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDAsIGZpcnN0LCB3cml0ZXIpOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgZCA9IHN0cmluZ1tpXTsKLQkJCWlmIChkICE9IGMpIHsKLQkJCQl3cml0ZUNoYXJPbihkLCB3cml0ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyW10gc3RyaW5nLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgZmlyc3QgPSBBcnJheVRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZywgYywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaGluZyBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oY2hhcltdIHN0cmluZywgY2hhciBjLCBpbnQgZmlyc3QsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBmaXJzdCk7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBkID0gc3RyaW5nW2ldOwotCQkJaWYgKGQgIT0gYykgewotCQkJCXNiLmFwcGVuZChkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyW10gc3RyaW5nLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gQXJyYXlUb29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcsIGMsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT25fKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgaW50IGZpcnN0LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGQgPSBzdHJpbmdbaV07Ci0JCQlpZiAoZCAhPSBjKSB7Ci0JCQkJc2IuYXBwZW5kKGQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVBbGxTcGFjZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFsbFNwYWNlcyhTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiByZW1vdmVBbGxPY2N1cnJlbmNlcyhzdHJpbmcsICcgJyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkIHdyaXRlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsU3BhY2VzT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxTcGFjZXNPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkCi0JICogc3RyaW5nIGJ1ZmZlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsU3BhY2VzT24oU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxTcGFjZXNPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHNwYWNlcwotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlIHNwZWNpZmllZAotCSAqIHN0cmluZyBidWlsZGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxTcGFjZXNPbihTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxTcGFjZXNPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsU3BhY2VzKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbE9jY3VycmVuY2VzKHN0cmluZywgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCB3cml0ZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlc09uKFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsU3BhY2VzT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uKHN0cmluZywgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHNwYWNlcwotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxTcGFjZXNPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uKHN0cmluZywgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxTcGFjZXNPbihTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxTcGFjZXNPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVBbGxXaGl0ZXNwYWNlKFN0cmluZyBzdHJpbmcpIHsKLQkJY2hhcltdIHN0cmluZzIgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZzIpOwotCQlyZXR1cm4gKGZpcnN0ID09IC0xKSA/IHN0cmluZyA6IG5ldyBTdHJpbmcocmVtb3ZlQWxsV2hpdGVzcGFjZV8oc3RyaW5nMiwgZmlyc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB3aGl0ZXNwYWNlCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHdyaXRlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJY2hhcltdIHN0cmluZzIgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZzIpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhzdHJpbmcyLCBmaXJzdCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZzIsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB3aGl0ZXNwYWNlCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJY2hhcltdIHN0cmluZzIgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZzIpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhzdHJpbmcyLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZSBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsV2hpdGVzcGFjZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsV2hpdGVzcGFjZShjaGFyW10gc3RyaW5nKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlyZXR1cm4gKGZpcnN0ID09IC0xKSA/IHN0cmluZyA6IHJlbW92ZUFsbFdoaXRlc3BhY2VfKHN0cmluZywgZmlyc3QpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBpbmRleE9mV2hpdGVzcGFjZV8oY2hhcltdIHN0cmluZykgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc3RyaW5nW2ldKSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsV2hpdGVzcGFjZV8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0KSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHJpbmcubGVuZ3RoKTsKLQkJcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oc3RyaW5nLCBmaXJzdCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT25fKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCwgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgZmlyc3QsIHdyaXRlcik7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gc3RyaW5nW2ldOwotCQkJaWYgKCAhIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQl3cml0ZUNoYXJPbihjLCB3cml0ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhjaGFyW10gc3RyaW5nLCBpbnQgZmlyc3QsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBmaXJzdCk7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gc3RyaW5nW2ldOwotCQkJaWYgKCAhIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB3aGl0ZXNwYWNlCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT25fKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBmaXJzdCk7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gc3RyaW5nW2ldOwotCQkJaWYgKCAhIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvKioKLQkgKiBDb21wcmVzcyB0aGUgd2hpdGVzcGFjZSBpbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogVGhlIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBieSByZXBsYWNpbmcgYW55IG9jY3VycmVuY2Ugb2Ygb25lIG9yIG1vcmUKLQkgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS4KLQkgKiBTdHJpbmcjY29tcHJlc3NXaGl0ZXNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wcmVzc1doaXRlc3BhY2UoU3RyaW5nIHN0cmluZykgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogbmV3IFN0cmluZyhjb21wcmVzc1doaXRlc3BhY2VfKHN0cmluZzIsIGZpcnN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29tcHJlc3MgdGhlIHdoaXRlc3BhY2UKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHdyaXRlci4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIFN0cmluZyNjb21wcmVzc1doaXRlc3BhY2VPbihXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbXByZXNzV2hpdGVzcGFjZU9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJY2hhcltdIHN0cmluZzIgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZzIpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJY29tcHJlc3NXaGl0ZXNwYWNlT25fKHN0cmluZzIsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcHJlc3MgdGhlIHdoaXRlc3BhY2UKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCi0JICogVGhlIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBieSByZXBsYWNpbmcgYW55IG9jY3VycmVuY2Ugb2Ygb25lIG9yIG1vcmUKLQkgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS4KLQkgKiBTdHJpbmcjY29tcHJlc3NXaGl0ZXNwYWNlT24oU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY2hhcltdIHN0cmluZzIgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZzIpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJY29tcHJlc3NXaGl0ZXNwYWNlT25fKHN0cmluZzIsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wcmVzcyB0aGUgd2hpdGVzcGFjZQotCSAqIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogVGhlIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBieSByZXBsYWNpbmcgYW55IG9jY3VycmVuY2Ugb2Ygb25lIG9yIG1vcmUKLQkgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS4KLQkgKiBTdHJpbmcjY29tcHJlc3NXaGl0ZXNwYWNlT24oU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29tcHJlc3NXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljb21wcmVzc1doaXRlc3BhY2VPbl8oc3RyaW5nMiwgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIFN0cmluZyNjb21wcmVzc1doaXRlc3BhY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbXByZXNzV2hpdGVzcGFjZShjaGFyW10gc3RyaW5nKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlyZXR1cm4gKGZpcnN0ID09IC0xKSA/IHN0cmluZyA6IGNvbXByZXNzV2hpdGVzcGFjZV8oc3RyaW5nLCBmaXJzdCk7Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gY29tcHJlc3NXaGl0ZXNwYWNlXyhjaGFyW10gc3RyaW5nLCBpbnQgZmlyc3QpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0cmluZy5sZW5ndGgpOwotCQljb21wcmVzc1doaXRlc3BhY2VPbl8oc3RyaW5nLCBmaXJzdCwgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wcmVzcyB0aGUgd2hpdGVzcGFjZQotCSAqIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIFRoZSB3aGl0ZXNwYWNlIGlzIGNvbXByZXNzZWQgYnkgcmVwbGFjaW5nIGFueSBvY2N1cnJlbmNlIG9mIG9uZSBvciBtb3JlCi0JICogd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHdpdGggYSBzaW5nbGUgc3BhY2UuCi0JICogU3RyaW5nI2NvbXByZXNzV2hpdGVzcGFjZU9uKFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29tcHJlc3NXaGl0ZXNwYWNlT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWNvbXByZXNzV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXByZXNzV2hpdGVzcGFjZU9uXyhjaGFyW10gc3RyaW5nLCBpbnQgZmlyc3QsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDAsIGZpcnN0LCB3cml0ZXIpOwotCQlib29sZWFuIHNwYWNlV3JpdHRlbiA9IGZhbHNlOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHN0cmluZ1tpXTsKLQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7Ci0JCQkJaWYgKHNwYWNlV3JpdHRlbikgewotCQkJCQkvLyBza2lwIHN1YnNlcXVlbnQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gcmVwbGFjZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciB3aXRoIGEgc3BhY2UKLQkJCQkJc3BhY2VXcml0dGVuID0gdHJ1ZTsKLQkJCQkJd3JpdGVDaGFyT24oJyAnLCB3cml0ZXIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc3BhY2VXcml0dGVuID0gZmFsc2U7Ci0JCQkJd3JpdGVDaGFyT24oYywgd3JpdGVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlCi0JICogaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgotCSAqIFRoZSB3aGl0ZXNwYWNlIGlzIGNvbXByZXNzZWQgYnkgcmVwbGFjaW5nIGFueSBvY2N1cnJlbmNlIG9mIG9uZSBvciBtb3JlCi0JICogd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHdpdGggYSBzaW5nbGUgc3BhY2UuCi0JICogU3RyaW5nI2NvbXByZXNzV2hpdGVzcGFjZU9uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29tcHJlc3NXaGl0ZXNwYWNlT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJY29tcHJlc3NXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbl8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0LCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZywgMCwgZmlyc3QpOwotCQlib29sZWFuIHNwYWNlV3JpdHRlbiA9IGZhbHNlOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHN0cmluZ1tpXTsKLQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7Ci0JCQkJaWYgKHNwYWNlV3JpdHRlbikgewotCQkJCQkvLyBza2lwIHN1YnNlcXVlbnQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gcmVwbGFjZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciB3aXRoIGEgc3BhY2UKLQkJCQkJc3BhY2VXcml0dGVuID0gdHJ1ZTsKLQkJCQkJc2IuYXBwZW5kKCcgJyk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzcGFjZVdyaXR0ZW4gPSBmYWxzZTsKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wcmVzcyB0aGUgd2hpdGVzcGFjZQotCSAqIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogVGhlIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBieSByZXBsYWNpbmcgYW55IG9jY3VycmVuY2Ugb2Ygb25lIG9yIG1vcmUKLQkgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS4KLQkgKiBTdHJpbmcjY29tcHJlc3NXaGl0ZXNwYWNlT24oU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29tcHJlc3NXaGl0ZXNwYWNlT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNvbXByZXNzV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29tcHJlc3NXaGl0ZXNwYWNlT25fKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBmaXJzdCk7Ci0JCWJvb2xlYW4gc3BhY2VXcml0dGVuID0gZmFsc2U7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gc3RyaW5nW2ldOwotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQlpZiAoc3BhY2VXcml0dGVuKSB7Ci0JCQkJCS8vIHNraXAgc3Vic2VxdWVudCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKLQkJCQl9IGVsc2UgewotCQkJCQkvLyByZXBsYWNlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIHdpdGggYSBzcGFjZQotCQkJCQlzcGFjZVdyaXR0ZW4gPSB0cnVlOwotCQkJCQlzYi5hcHBlbmQoJyAnKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNwYWNlV3JpdHRlbiA9IGZhbHNlOwotCQkJCXNiLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb21tb24gcHJlZml4ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tb24gcHJlZml4IHNoYXJlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmluZ3MuCi0JICogU3RyaW5nI2NvbW1vblByZWZpeExlbmd0aChTdHJpbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29tbW9uUHJlZml4TGVuZ3RoKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCXJldHVybiBjb21tb25QcmVmaXhMZW5ndGgoczEudG9DaGFyQXJyYXkoKSwgczIudG9DaGFyQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggc2hhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGgoY2hhcltdIHMxLCBjaGFyW10gczIpIHsKLQkJcmV0dXJuIGNvbW1vblByZWZpeExlbmd0aF8oczEsIHMyLCBNYXRoLm1pbihzMS5sZW5ndGgsIHMyLmxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tb24gcHJlZml4IHNoYXJlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmluZ3M7Ci0JICogYnV0IGxpbWl0IHRoZSBsZW5ndGggdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtLgotCSAqIFN0cmluZyNjb21tb25QcmVmaXhMZW5ndGgoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29tbW9uUHJlZml4TGVuZ3RoKFN0cmluZyBzMSwgU3RyaW5nIHMyLCBpbnQgbWF4KSB7Ci0JCXJldHVybiBjb21tb25QcmVmaXhMZW5ndGgoczEudG9DaGFyQXJyYXkoKSwgczIudG9DaGFyQXJyYXkoKSwgbWF4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHByZWZpeCBzaGFyZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJpbmdzOwotCSAqIGJ1dCBsaW1pdCB0aGUgbGVuZ3RoIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGgoY2hhcltdIHMxLCBjaGFyW10gczIsIGludCBtYXgpIHsKLQkJcmV0dXJuIGNvbW1vblByZWZpeExlbmd0aF8oczEsIHMyLCBNYXRoLm1pbihtYXgsIE1hdGgubWluKHMxLmxlbmd0aCwgczIubGVuZ3RoKSkpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggc2hhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyaW5nczsKLQkgKiBidXQgbGltaXQgdGhlIGxlbmd0aCB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0uIEFzc3VtZSB0aGUgc3BlY2lmaWVkCi0JICogbWF4aW11bSBpcyBsZXNzIHRoYW4gdGhlIGxlbmd0aHMgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGhfKGNoYXJbXSBzMSwgY2hhcltdIHMyLCBpbnQgbWF4KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCWlmIChzMVtpXSAhPSBzMltpXSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7CS8vIGFsbCB0aGUgY2hhcmFjdGVycyB1cCB0byAnbWF4JyBhcmUgdGhlIHNhbWUKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2FwaXRhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciBsb3dlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGNhcGl0YWxpemVfKGNoYXJbXSBzdHJpbmcpIHsKLQkJc3RyaW5nWzBdID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0cmluZ1swXSk7Ci0JCXJldHVybiBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IGFuZCByZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aAotCSAqIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY2FwaXRhbGl6ZShjaGFyW10gc3RyaW5nKSB7Ci0JCWlmICgoc3RyaW5nLmxlbmd0aCA9PSAwKSB8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzBdKSkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gY2FwaXRhbGl6ZV8oc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqIFN0cmluZyNjYXBpdGFsaXplKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBpdGFsaXplKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGNhcGl0YWxpemVfKHN0cmluZy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzLCBjYXBpdGFsaXppbmcgdGhlIGZpcnN0IGxldHRlciBvZgotCSAqIGVhY2guCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxTdHJpbmc+IGNhcGl0YWxpemUoSXRlcmFibGU8U3RyaW5nPiBzdHJpbmdzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIFN0cmluZz4oc3RyaW5ncywgU1RSSU5HX0NBUElUQUxJWkVSKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MsIGNhcGl0YWxpemluZyB0aGUgZmlyc3QgbGV0dGVyIG9mCi0JICogZWFjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gY2FwaXRhbGl6ZShJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihzdHJpbmdzLCBTVFJJTkdfQ0FQSVRBTElaRVIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zZm9ybWVyPFN0cmluZywgU3RyaW5nPiBTVFJJTkdfQ0FQSVRBTElaRVIgPSBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+KCkgewotCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgc3RyaW5nKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShzdHJpbmcpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIE1vZGlmeSBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncywgY2FwaXRhbGl6aW5nIHRoZSBmaXJzdCBsZXR0ZXIgb2YKLQkgKiBlYWNoLgotCSAqLwotCS8vIGNhbm5vdCBuYW1lIG1ldGhvZCBzaW1wbHkgJ2NhcGl0YWxpemUnIGJlY2F1c2Ugb2YgdHlwZS1lcmFzdXJlLi4uCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxjaGFyW10+IGNhcGl0YWxpemVDaGFyQXJyYXlzKEl0ZXJhYmxlPGNoYXJbXT4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8Y2hhcltdLCBjaGFyW10+KHN0cmluZ3MsIENIQVJfQVJSQVlfQ0FQSVRBTElaRVIpOwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncywgY2FwaXRhbGl6aW5nIHRoZSBmaXJzdCBsZXR0ZXIgb2YKLQkgKiBlYWNoLgotCSAqLwotCS8vIGNhbm5vdCBuYW1lIG1ldGhvZCBzaW1wbHkgJ2NhcGl0YWxpemUnIGJlY2F1c2Ugb2YgdHlwZS1lcmFzdXJlLi4uCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxjaGFyW10+IGNhcGl0YWxpemVDaGFyQXJyYXlzKEl0ZXJhdG9yPGNoYXJbXT4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8Y2hhcltdLCBjaGFyW10+KHN0cmluZ3MsIENIQVJfQVJSQVlfQ0FQSVRBTElaRVIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zZm9ybWVyPGNoYXJbXSwgY2hhcltdPiBDSEFSX0FSUkFZX0NBUElUQUxJWkVSID0gbmV3IFRyYW5zZm9ybWVyPGNoYXJbXSwgY2hhcltdPigpIHsKLQkJcHVibGljIGNoYXJbXSB0cmFuc2Zvcm0oY2hhcltdIHN0cmluZykgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUoc3RyaW5nKTsKLQkJfQotCX07Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIHVwcGVyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbl8oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3RyaW5nWzBdKSk7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDEsIHN0cmluZy5sZW5ndGggLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZ1swXSkpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJY2FwaXRhbGl6ZU9uXyhzdHJpbmcsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICogU3RyaW5nI2NhcGl0YWxpemVPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmcuY2hhckF0KDApKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIHVwcGVyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbl8oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0cmluZ1swXSkpOwotCQlzYi5hcHBlbmQoc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZ1swXSkpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJY2FwaXRhbGl6ZU9uXyhzdHJpbmcsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqIFN0cmluZyNjYXBpdGFsaXplT24oU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgdXBwZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdHJpbmdbMF0pLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzBdKSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICogU3RyaW5nI2NhcGl0YWxpemVPbihXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nLmNoYXJBdCgwKSkpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJY2FwaXRhbGl6ZU9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgbG93ZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSB1bmNhcGl0YWxpemVfKGNoYXJbXSBzdHJpbmcpIHsKLQkJc3RyaW5nWzBdID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHN0cmluZ1swXSk7Ci0JCXJldHVybiBzdHJpbmc7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhjaGFyW10gc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2Uoc3RyaW5nWzBdKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gaWYgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBjaGFyYWN0ZXJzIGFyZSBjYXBpdGFsaXplZCwKLQkJLy8gcmV0dXJuIHRoZSBzdHJpbmcgdW5jaGFuZ2VkCi0JCWlmICgoc3RyaW5nLmxlbmd0aCA+IDEpCi0JCQkJJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZ1sxXSkKLQkJCQkmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzBdKSl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IGFuZCByZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBpdHMKLQkgKiBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gdW5jYXBpdGFsaXplKGNoYXJbXSBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIHVuY2FwaXRhbGl6ZV8oc3RyaW5nKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBpZiBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGNoYXJhY3RlcnMgYXJlIGNhcGl0YWxpemVkLAotCQkvLyByZXR1cm4gdGhlIHN0cmluZyB1bmNoYW5nZWQKLQkJaWYgKChzdHJpbmcubGVuZ3RoKCkgPiAxKQotCQkJCSYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmcuY2hhckF0KDEpKQotCQkJCSYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmcuY2hhckF0KDApKSl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKiBTdHJpbmcjdW5jYXBpdGFsaXplKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmNhcGl0YWxpemUoU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyh1bmNhcGl0YWxpemVfKHN0cmluZy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciBsb3dlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbl8oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc3RyaW5nWzBdKSk7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDEsIHN0cmluZy5sZW5ndGggLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25fKHN0cmluZywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKiBTdHJpbmcjdW5jYXBpdGFsaXplT24oU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIGxvd2VyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc3RyaW5nWzBdKSk7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDEsIHN0cmluZy5sZW5ndGggLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQl1bmNhcGl0YWxpemVPbl8oc3RyaW5nLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKiBTdHJpbmcjdW5jYXBpdGFsaXplT24oU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXVuY2FwaXRhbGl6ZU9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciB1cHBlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbl8oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc3RyaW5nWzBdKSwgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDEsIHN0cmluZy5sZW5ndGggLSAxLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25fKHN0cmluZywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICogU3RyaW5nI3VuY2FwaXRhbGl6ZU9uKFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQl1bmNhcGl0YWxpemVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogI3RvU3RyaW5nKCkgaGVscGVyIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQnVpbGQgYSAic3RhbmRhcmQiICN0b1N0cmluZygpIHJlc3VsdCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QKLQkgKiBhbmQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbjoKLQkgKiAJQ2xhc3NOYW1lWzAwRjNFRTQyXSAoYWRkJ2wgaW5mbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFRvU3RyaW5nRm9yKE9iamVjdCBvLCBPYmplY3QgYWRkaXRpb25hbEluZm8pIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWJ1aWxkU2ltcGxlVG9TdHJpbmdPbihvLCBzYik7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlzYi5hcHBlbmQoYWRkaXRpb25hbEluZm8pOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSAic3RhbmRhcmQiIHNpbXBsZSAjdG9TdHJpbmcoKSByZXN1bHQgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0OgotCSAqIAlDbGFzc05hbWVbMDBGM0VFNDJdCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRUb1N0cmluZ0ZvcihPYmplY3QgbykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJYnVpbGRTaW1wbGVUb1N0cmluZ09uKG8sIHNiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIGEgInN0YW5kYXJkIiBzaW1wbGUgI3RvU3RyaW5nKCkgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvCi0JICogdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyOgotCSAqIAlDbGFzc05hbWVbMDBGM0VFNDJdCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGJ1aWxkU2ltcGxlVG9TdHJpbmdPbihPYmplY3QgbywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChidWlsZFRvU3RyaW5nQ2xhc3NOYW1lKG8uZ2V0Q2xhc3MoKSkpOwotCQlzYi5hcHBlbmQoJ1snKTsKLQkJLy8gdXNlIFN5c3RlbSNpZGVudGl0eUhhc2hDb2RlKE9iamVjdCksIHNpbmNlIE9iamVjdCNoYXNoQ29kZSgpIG1heSBiZSBvdmVycmlkZGVuCi0JCXNiLmFwcGVuZCh6ZXJvUGFkKEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobykpLnRvVXBwZXJDYXNlKCksIDgpKTsKLQkJc2IuYXBwZW5kKCddJyk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIGEgInN0YW5kYXJkIiBzaW1wbGUgI3RvU3RyaW5nKCkgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvCi0JICogdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlcjoKLQkgKiAJQ2xhc3NOYW1lWzAwRjNFRTQyXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBidWlsZFNpbXBsZVRvU3RyaW5nT24oT2JqZWN0IG8sIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKGJ1aWxkVG9TdHJpbmdDbGFzc05hbWUoby5nZXRDbGFzcygpKSk7Ci0JCXNiLmFwcGVuZCgnWycpOwotCQkvLyB1c2UgU3lzdGVtI2lkZW50aXR5SGFzaENvZGUoT2JqZWN0KSwgc2luY2UgT2JqZWN0I2hhc2hDb2RlKCkgbWF5IGJlIG92ZXJyaWRkZW4KLQkJc2IuYXBwZW5kKHplcm9QYWQoSW50ZWdlci50b0hleFN0cmluZyhTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvKSkudG9VcHBlckNhc2UoKSwgOCkpOwotCQlzYi5hcHBlbmQoJ10nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuYW1lIHN1aXRhYmxlIGZvciBhIDxjb2RlPiN0b1N0cmluZygpPC9jb2RlPiBpbXBsZW1lbnRhdGlvbi4KLQkgKiB7QGxpbmsgQ2xhc3MjZ2V0U2ltcGxlTmFtZSgpfSBpc24ndCBxdWl0ZSBnb29kIGVub3VnaCBmb3IgYW5vbnltb3VzCi0JICogY2xhc3Nlczsgc2luY2UgaXQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZQotCSAqIG5hbWUgb2YgdGhlIGFub255bW91cyBjbGFzcydzIHN1cGVyIGNsYXNzLCB3aGljaCBpcyBhIGJpdCBtb3JlIGhlbHBmdWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRUb1N0cmluZ0NsYXNzTmFtZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJU3RyaW5nIHNpbXBsZU5hbWUgPSBqYXZhQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCQlyZXR1cm4gc2ltcGxlTmFtZS5lcXVhbHMoIiIpID8gLy8kTk9OLU5MUy0xJAotCQkJCWJ1aWxkVG9TdHJpbmdDbGFzc05hbWUoamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKSkgOiAgLy8gcmVjdXJzZQotCQkJCXNpbXBsZU5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyA8VD4gU3RyaW5nIGFwcGVuZChTdHJpbmdCdWlsZGVyIHNiLCBUW10gYXJyYXkpIHsKLQkJcmV0dXJuIGFwcGVuZChzYiwgbmV3IEFycmF5TGlzdEl0ZXJhdG9yPFQ+KGFycmF5KSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyA8VD4gU3RyaW5nIGFwcGVuZChTdHJpbmdCdWlsZGVyIHNiLCBJdGVyYWJsZTxUPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYXBwZW5kKHNiLCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIDxUPiBTdHJpbmcgYXBwZW5kKFN0cmluZ0J1aWxkZXIgc2IsIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKSB7Ci0JCXNiLmFwcGVuZCgnWycpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlzYi5hcHBlbmQoaXRlcmF0b3IubmV4dCgpKTsKLQkJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlzYi5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlzYi5hcHBlbmQoJ10nKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbnVsbCwgZW1wdHksIG9yIGNvbnRhaW5zCi0JICogb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRW1wdHkoU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0lzRW1wdHlfKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIG51bGwsIGVtcHR5LCBvciBjb250YWlucwotCSAqIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0VtcHR5KGNoYXJbXSBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nSXNFbXB0eV8oc3RyaW5nLCBsZW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNFbXB0eV8oY2hhcltdIHMsIGludCBsZW4pIHsKLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBub24tbnVsbCwgbm9uLWVtcHR5LCBhbmQgZG9lcwotCSAqIG5vdCBjb250YWluIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc05vdEVtcHR5KFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuICEgc3RyaW5nSXNFbXB0eShzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIG5vbi1udWxsLCBub24tZW1wdHksIGFuZCBkb2VzCi0JICogbm90IGNvbnRhaW4gb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzTm90RW1wdHkoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gISBzdHJpbmdJc0VtcHR5KHN0cmluZyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBhcmUgZXF1YWwuCi0JICogQ2hlY2sgZm9yIG51bGxzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdzQXJlRXF1YWwoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJaWYgKChzMSA9PSBudWxsKSAmJiAoczIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiB0cnVlOyAgLy8gYm90aCBhcmUgbnVsbAotCQl9Ci0JCWlmICgoczEgPT0gbnVsbCkgfHwgKHMyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBvbmUgaXMgbnVsbCBidXQgdGhlIG90aGVyIGlzIG5vdAotCQl9Ci0JCXJldHVybiBzMS5lcXVhbHMoczIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgYXJlIGVxdWFsLgotCSAqIENoZWNrIGZvciBudWxscy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nc0FyZUVxdWFsKGNoYXJbXSBzMSwgY2hhcltdIHMyKSB7Ci0JCWlmICgoczEgPT0gbnVsbCkgJiYgKHMyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGJvdGggYXJlIG51bGwKLQkJfQotCQlpZiAoKHMxID09IG51bGwpIHx8IChzMiA9PSBudWxsKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gb25lIGlzIG51bGwgYnV0IHRoZSBvdGhlciBpcyBub3QKLQkJfQotCQlpbnQgbGVuID0gczEubGVuZ3RoOwotCQlpZiAobGVuICE9IHMyLmxlbmd0aCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJaWYgKHMxW2ldICE9IHMyW2ldKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgYXJlIGVxdWFsLCBpZ25vcmluZyBjYXNlLgotCSAqIENoZWNrIGZvciBudWxscy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZShTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQlpZiAoKHMxID09IG51bGwpICYmIChzMiA9PSBudWxsKSkgewotCQkJcmV0dXJuIHRydWU7ICAvLyBib3RoIGFyZSBudWxsCi0JCX0KLQkJaWYgKChzMSA9PSBudWxsKSB8fCAoczIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIG9uZSBpcyBudWxsIGJ1dCB0aGUgb3RoZXIgaXMgbm90Ci0JCX0KLQkJcmV0dXJuIHMxLmVxdWFsc0lnbm9yZUNhc2UoczIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgYXJlIGVxdWFsLCBpZ25vcmluZyBjYXNlLgotCSAqIENoZWNrIGZvciBudWxscy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZShjaGFyW10gczEsIGNoYXJbXSBzMikgewotCQlpZiAoKHMxID09IG51bGwpICYmIChzMiA9PSBudWxsKSkgewotCQkJcmV0dXJuIHRydWU7ICAvLyBib3RoIGFyZSBudWxsCi0JCX0KLQkJaWYgKChzMSA9PSBudWxsKSB8fCAoczIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIG9uZSBpcyBudWxsIGJ1dCB0aGUgb3RoZXIgaXMgbm90Ci0JCX0KLQkJaW50IGxlbiA9IHMxLmxlbmd0aDsKLQkJaWYgKGxlbiAhPSBzMi5sZW5ndGgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKHMxW2ldLCBzMltpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsCi0JICogaWdub3JpbmcgY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoY2hhcltdIHN0cmluZywgY2hhcltdIHByZWZpeCkgewotCQlpbnQgcHJlZml4TGVuZ3RoID0gcHJlZml4Lmxlbmd0aDsKLQkJaWYgKHN0cmluZy5sZW5ndGggPCBwcmVmaXhMZW5ndGgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gcHJlZml4TGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKHN0cmluZ1tpXSwgcHJlZml4W2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsCi0JICogaWdub3JpbmcgY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoU3RyaW5nIHN0cmluZywgU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gc3RyaW5nLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgcHJlZml4LCAwLCBwcmVmaXgubGVuZ3RoKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycyBhcmUgYXJlIGVxdWFsLCBpZ25vcmluZyBjYXNlLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZyNyZWdpb25NYXRjaGVzKGJvb2xlYW4sIGludCwgU3RyaW5nLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZShjaGFyIGMxLCBjaGFyIGMyKSB7Ci0JCS8vICBzb21ldGhpbmcgYWJvdXQgdGhlIEdlb3JnaWFuIGFscGhhYmV0IHJlcXVpcmVzIHVzIHRvIGNoZWNrIGxvd2VyIGNhc2UgYWxzbwotCQlyZXR1cm4gKGMxID09IGMyKQotCQkJCXx8IChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYzEpID09IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjMikpCi0JCQkJfHwgKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjMSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgdXBwZXJjYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc1VwcGVyY2FzZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiAoc3RyaW5nLmxlbmd0aCgpID09IDApID8gZmFsc2UgOiBzdHJpbmdJc1VwcGVyY2FzZV8oc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyB1cHBlcmNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzVXBwZXJjYXNlKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIChzdHJpbmcubGVuZ3RoID09IDApID8gZmFsc2UgOiBzdHJpbmdJc1VwcGVyY2FzZV8obmV3IFN0cmluZyhzdHJpbmcpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzVXBwZXJjYXNlXyhTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcuZXF1YWxzKHN0cmluZy50b1VwcGVyQ2FzZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBsb3dlcmNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzTG93ZXJjYXNlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgPyBmYWxzZSA6IHN0cmluZ0lzTG93ZXJjYXNlXyhzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGxvd2VyY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNMb3dlcmNhc2UoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gKHN0cmluZy5sZW5ndGggPT0gMCkgPyBmYWxzZSA6IHN0cmluZ0lzTG93ZXJjYXNlXyhuZXcgU3RyaW5nKHN0cmluZykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNMb3dlcmNhc2VfKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZy5lcXVhbHMoc3RyaW5nLnRvTG93ZXJDYXNlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0IGNhbWVsIGNhc2UgdG8gYWxsIGNhcHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcyhTdHJpbmcgY2FtZWxDYXNlU3RyaW5nKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIGNhbWVsQ2FzZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBjYW1lbENhc2VTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNfKGNhbWVsQ2FzZVN0cmluZywgbGVuKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc18oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IGxlbikgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuICogMik7Ci0JCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBsZW4sIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihTdHJpbmcgY2FtZWxDYXNlU3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbGVuLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJc2IuYXBwZW5kKCdfJyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihTdHJpbmcgY2FtZWxDYXNlU3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBsZW4sIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJc2IuYXBwZW5kKCdfJyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihTdHJpbmcgY2FtZWxDYXNlU3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IGxlbiwgV3JpdGVyIHdyaXRlcikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHsJLy8gTkI6IHN0YXJ0IGF0IDEgYW5kIGVuZCBhdCBsZW4hCi0JCQljID0gbmV4dDsKLQkJCW5leHQgPSAoKGkgPT0gbGVuKSA/IDAgOiBjYW1lbENhc2VTdHJpbmdbaV0pOwotCQkJaWYgKGNhbWVsQ2FzZVdvcmRCcmVha18ocHJldiwgYywgbmV4dCkpIHsKLQkJCQl3cml0ZUNoYXJPbignXycsIHdyaXRlcik7Ci0JCQl9Ci0JCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9VcHBlckNhc2UoYyksIHdyaXRlcik7Ci0JCQlwcmV2ID0gYzsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqIExpbWl0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcyhTdHJpbmcgY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmICgobGVuID09IDApIHx8IChtYXhMZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBjYW1lbENhc2VTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc18oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIG1heExlbmd0aCwgbGVuKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChtYXhMZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBjYW1lbENhc2VTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNfKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBpbnQgbGVuKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihtYXhMZW5ndGgpOwotCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4sIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBtYXhMZW5ndGgsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKChsZW4gIT0gMCkgJiYgKG1heExlbmd0aCAhPSAwKSkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIG1heExlbmd0aCwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgaW50IGxlbiwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXIgcHJldiA9IDA7CS8vIGFzc3VtZSAwIGlzIG5vdCBhIHZhbGlkIGNoYXIKLQkJY2hhciBjID0gMDsKLQkJY2hhciBuZXh0ID0gY2FtZWxDYXNlU3RyaW5nWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrXyhwcmV2LCBjLCBuZXh0KSkgewotCQkJCXNiLmFwcGVuZCgnXycpOwotCQkJCWlmIChzYi5sZW5ndGgoKSA9PSBtYXhMZW5ndGgpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJaWYgKHNiLmxlbmd0aCgpID09IG1heExlbmd0aCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKChsZW4gIT0gMCkgJiYgKG1heExlbmd0aCAhPSAwKSkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbWF4TGVuZ3RoLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqIExpbWl0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBpbnQgbGVuLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWNoYXIgcHJldiA9IDA7CS8vIGFzc3VtZSAwIGlzIG5vdCBhIHZhbGlkIGNoYXIKLQkJY2hhciBjID0gMDsKLQkJY2hhciBuZXh0ID0gY2FtZWxDYXNlU3RyaW5nWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrXyhwcmV2LCBjLCBuZXh0KSkgewotCQkJCXNiLmFwcGVuZCgnXycpOwotCQkJCWlmIChzYi5sZW5ndGgoKSA9PSBtYXhMZW5ndGgpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJaWYgKHNiLmxlbmd0aCgpID09IG1heExlbmd0aCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKChsZW4gIT0gMCkgJiYgKG1heExlbmd0aCAhPSAwKSkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbWF4TGVuZ3RoLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKChsZW4gIT0gMCkgJiYgKG1heExlbmd0aCAhPSAwKSkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIG1heExlbmd0aCwgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIGludCBsZW4sIFdyaXRlciB3cml0ZXIpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWludCB3cml0ZXJMZW5ndGggPSAwOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrXyhwcmV2LCBjLCBuZXh0KSkgewotCQkJCXdyaXRlQ2hhck9uKCdfJywgd3JpdGVyKTsKLQkJCQlpZiAoKyt3cml0ZXJMZW5ndGggPT0gbWF4TGVuZ3RoKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9VcHBlckNhc2UoYyksIHdyaXRlcik7Ci0JCQlpZiAoKyt3cml0ZXJMZW5ndGggPT0gbWF4TGVuZ3RoKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc2VyaWVzIG9mIGNoYXJhY3RlcnMgb2NjdXIgYXQKLQkgKiBhICJjYW1lbCBjYXNlIiB3b3JrIGJyZWFrOgotCSAqICAgICAiKmFhIiAtPiBmYWxzZQotCSAqICAgICAiKkFBIiAtPiBmYWxzZQotCSAqICAgICAiKkFhIiAtPiBmYWxzZQotCSAqICAgICAiQWFBIiAtPiBmYWxzZQotCSAqICAgICAiQUFBIiAtPiBmYWxzZQotCSAqICAgICAiYWEqIiAtPiBmYWxzZQotCSAqICAgICAiQWFBIiAtPiBmYWxzZQotCSAqICAgICAiYUFhIiAtPiB0cnVlCi0JICogICAgICJBQSoiIC0+IGZhbHNlCi0JICogICAgICJBQWEiIC0+IHRydWUKLQkgKiB3aGVyZSAnKicgPT0gYW55IGNoYXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhbWVsQ2FzZVdvcmRCcmVha18oY2hhciBwcmV2LCBjaGFyIGMsIGNoYXIgbmV4dCkgewotCQlpZiAocHJldiA9PSAwKSB7CS8vIHN0YXJ0IG9mIHN0cmluZwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoYykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHByZXYpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAobmV4dCA9PSAwKSB7CS8vIGVuZCBvZiBzdHJpbmcKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKG5leHQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0IHVuZGVyc2NvcmVzIHRvIGNhbWVsIGNhc2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAiTGFyZ2VQcm9qZWN0IgotCSAqIENhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZShTdHJpbmcgdW5kZXJzY29yZVN0cmluZykgewotCQlyZXR1cm4gY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UodW5kZXJzY29yZVN0cmluZywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAiTGFyZ2VQcm9qZWN0IgotCSAqIENhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjaGFyW10gdW5kZXJzY29yZVN0cmluZykgewotCQlyZXR1cm4gY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UodW5kZXJzY29yZVN0cmluZywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKFN0cmluZyB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlcikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdW5kZXJzY29yZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZV8odW5kZXJzY29yZVN0cmluZy50b0NoYXJBcnJheSgpLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbikpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiB1bmRlcnNjb3JlU3RyaW5nOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZV8odW5kZXJzY29yZVN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZV8oY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBpbnQgbGVuKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4pOwotCQljb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyh1bmRlcnNjb3JlU3RyaW5nLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbiwgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oU3RyaW5nIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbl8odW5kZXJzY29yZVN0cmluZy50b0NoYXJBcnJheSgpLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyh1bmRlcnNjb3JlU3RyaW5nLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyhjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGludCBsZW4sIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyIHByZXYgPSAwOwotCQljaGFyIGMgPSAwOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJcHJldiA9IGM7Ci0JCQljID0gdW5kZXJzY29yZVN0cmluZ1tpXTsKLQkJCWlmIChjID09ICdfJykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlzYi5hcHBlbmQoY2FwaXRhbGl6ZUZpcnN0TGV0dGVyID8gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpIDogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKChwcmV2ID09ICdfJykgPyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykgOiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKFN0cmluZyB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyh1bmRlcnNjb3JlU3RyaW5nLnRvQ2hhckFycmF5KCksIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyh1bmRlcnNjb3JlU3RyaW5nLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyhjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGludCBsZW4sIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsKLQkJY2hhciBjID0gMDsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXByZXYgPSBjOwotCQkJYyA9IHVuZGVyc2NvcmVTdHJpbmdbaV07Ci0JCQlpZiAoYyA9PSAnXycpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChmaXJzdCkgewotCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJc2IuYXBwZW5kKGNhcGl0YWxpemVGaXJzdExldHRlciA/IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSA6IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjKSk7Ci0JCQl9IGVsc2UgewotCQkJCXNiLmFwcGVuZCgocHJldiA9PSAnXycpID8gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpIDogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihTdHJpbmcgdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbl8odW5kZXJzY29yZVN0cmluZy50b0NoYXJBcnJheSgpLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbiwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyhjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGludCBsZW4sIFdyaXRlciB3cml0ZXIpIHsKLQkJY2hhciBwcmV2ID0gMDsKLQkJY2hhciBjID0gMDsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXByZXYgPSBjOwotCQkJYyA9IHVuZGVyc2NvcmVTdHJpbmdbaV07Ci0JCQlpZiAoYyA9PSAnXycpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChmaXJzdCkgewotCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJd3JpdGVDaGFyT24oY2FwaXRhbGl6ZUZpcnN0TGV0dGVyID8gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpIDogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpLCB3cml0ZXIpOwotCQkJfSBlbHNlIHsKLQkJCQl3cml0ZUNoYXJPbigocHJldiA9PSAnXycpID8gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpIDogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpLCB3cml0ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnQgdG8gSmF2YSBzdHJpbmcgbGl0ZXJhbCAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMID0gIlwiXCIiOyAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUxfQ0hBUl9BUlJBWSA9IEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwudG9DaGFyQXJyYXkoKTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKFN0cmluZyBzdHJpbmcpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTDsKLQkJfQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuICsgNSk7Ci0JCWNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYiwgbGVuKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoY2hhcltdIHN0cmluZykgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTF9DSEFSX0FSUkFZOwotCQl9Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4gKyA1KTsKLQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLCBzYiwgbGVuKTsKLQkJbGVuID0gc2IubGVuZ3RoKCk7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5dOwotCQlzYi5nZXRDaGFycygwLCBsZW4sIHJlc3VsdCwgMCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxTdHJpbmc+IGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyhJdGVyYWJsZTxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgU3RyaW5nPihzdHJpbmdzLCBTVFJJTkdfVE9fSkFWQV9TVFJJTkdfTElURVJBTF9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyhJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihzdHJpbmdzLCBTVFJJTkdfVE9fSkFWQV9TVFJJTkdfTElURVJBTF9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+IFNUUklOR19UT19KQVZBX1NUUklOR19MSVRFUkFMX1RSQU5TRk9STUVSID0gbmV3IFRyYW5zZm9ybWVyPFN0cmluZywgU3RyaW5nPigpIHsKLQkJcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHN0cmluZykgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKHN0cmluZyk7Ci0JCX0KLQl9OwotCi0JLy8gY2Fubm90IG5hbWUgbWV0aG9kIHNpbXBseSAnY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzJyBiZWNhdXNlIG9mIHR5cGUtZXJhc3VyZS4uLgotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Y2hhcltdPiBjb252ZXJ0VG9KYXZhQ2hhckFycmF5TGl0ZXJhbHMoSXRlcmFibGU8Y2hhcltdPiBzdHJpbmdzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncywgQ0hBUl9BUlJBWV9UT19KQVZBX1NUUklOR19MSVRFUkFMX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQkvLyBjYW5ub3QgbmFtZSBtZXRob2Qgc2ltcGx5ICdjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHMnIGJlY2F1c2Ugb2YgdHlwZS1lcmFzdXJlLi4uCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxjaGFyW10+IGNvbnZlcnRUb0phdmFDaGFyQXJyYXlMaXRlcmFscyhJdGVyYXRvcjxjaGFyW10+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPGNoYXJbXSwgY2hhcltdPihzdHJpbmdzLCBDSEFSX0FSUkFZX1RPX0pBVkFfU1RSSU5HX0xJVEVSQUxfVFJBTlNGT1JNRVIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zZm9ybWVyPGNoYXJbXSwgY2hhcltdPiBDSEFSX0FSUkFZX1RPX0pBVkFfU1RSSU5HX0xJVEVSQUxfVFJBTlNGT1JNRVIgPSBuZXcgVHJhbnNmb3JtZXI8Y2hhcltdLCBjaGFyW10+KCkgewotCQlwdWJsaWMgY2hhcltdIHRyYW5zZm9ybShjaGFyW10gc3RyaW5nKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoc3RyaW5nKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlzYi5hcHBlbmQoRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTCk7Ci0JCX0gZWxzZSB7Ci0JCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IsIGxlbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJc2IuYXBwZW5kKEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwpOwotCQl9IGVsc2UgewotCQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLCBzYiwgbGVuKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gbGVuZ3RoIGNoZWNrcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiLCBpbnQgbGVuKSB7Ci0JCXNiLmVuc3VyZUNhcGFjaXR5KHNiLmxlbmd0aCgpICsgbGVuICsgNSk7Ci0JCXNiLmFwcGVuZChRVU9URSk7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICdcYic6ICAvLyBiYWNrc3BhY2UKLQkJCQkJc2IuYXBwZW5kKCJcXGIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXHQnOiAgLy8gaG9yaXpvbnRhbCB0YWIKLQkJCQkJc2IuYXBwZW5kKCJcXHQiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXG4nOiAgLy8gbGluZS1mZWVkIExGCi0JCQkJCXNiLmFwcGVuZCgiXFxuIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xmJzogIC8vIGZvcm0tZmVlZCBGRgotCQkJCQlzYi5hcHBlbmQoIlxcZiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdccic6ICAvLyBjYXJyaWFnZS1yZXR1cm4gQ1IKLQkJCQkJc2IuYXBwZW5kKCJcXHIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnIic6ICAvLyBkb3VibGUtcXVvdGUKLQkJCQkJc2IuYXBwZW5kKCJcXFwiIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotLy8JCQkJY2FzZSAnXCcnOiAgLy8gc2luZ2xlLXF1b3RlCi0vLwkJCQkJc2IuYXBwZW5kKCJcXCciKTsgIC8vJE5PTi1OTFMtMSQKLS8vCQkJCQlicmVhazsKLQkJCQljYXNlICdcXCc6ICAvLyBiYWNrc2xhc2gKLQkJCQkJc2IuYXBwZW5kKCJcXFxcIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXNiLmFwcGVuZChjKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJc2IuYXBwZW5kKFFVT1RFKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJc2IuYXBwZW5kKEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwpOwotCQl9IGVsc2UgewotCQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiLCBsZW4pOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlzYi5hcHBlbmQoRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTCk7Ci0JCX0gZWxzZSB7Ci0JCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcsIHNiLCBsZW4pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyBsZW5ndGggY2hlY2tzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiLCBpbnQgbGVuKSB7Ci0JCXNiLmVuc3VyZUNhcGFjaXR5KHNiLmxlbmd0aCgpICsgbGVuICsgNSk7Ci0JCXNiLmFwcGVuZChRVU9URSk7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICdcYic6ICAvLyBiYWNrc3BhY2UKLQkJCQkJc2IuYXBwZW5kKCJcXGIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXHQnOiAgLy8gaG9yaXpvbnRhbCB0YWIKLQkJCQkJc2IuYXBwZW5kKCJcXHQiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXG4nOiAgLy8gbGluZS1mZWVkIExGCi0JCQkJCXNiLmFwcGVuZCgiXFxuIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xmJzogIC8vIGZvcm0tZmVlZCBGRgotCQkJCQlzYi5hcHBlbmQoIlxcZiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdccic6ICAvLyBjYXJyaWFnZS1yZXR1cm4gQ1IKLQkJCQkJc2IuYXBwZW5kKCJcXHIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnIic6ICAvLyBkb3VibGUtcXVvdGUKLQkJCQkJc2IuYXBwZW5kKCJcXFwiIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotLy8JCQkJY2FzZSAnXCcnOiAgLy8gc2luZ2xlLXF1b3RlCi0vLwkJCQkJc2IuYXBwZW5kKCJcXCciKTsgIC8vJE5PTi1OTFMtMSQKLS8vCQkJCQlicmVhazsKLQkJCQljYXNlICdcXCc6ICAvLyBiYWNrc2xhc2gKLQkJCQkJc2IuYXBwZW5kKCJcXFxcIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXNiLmFwcGVuZChjKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJc2IuYXBwZW5kKFFVT1RFKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJd3JpdGVTdHJpbmdPbihFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoID09IDApIHsKLQkJCXdyaXRlU3RyaW5nT24oRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTCwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKHN0cmluZywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gbGVuZ3RoIGNoZWNrcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZUNoYXJPbihRVU9URSwgd3JpdGVyKTsKLQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJ1xiJzogIC8vIGJhY2tzcGFjZQotCQkJCQl3cml0ZVN0cmluZ09uKCJcXGIiLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcdCc6ICAvLyBob3Jpem9udGFsIHRhYgotCQkJCQl3cml0ZVN0cmluZ09uKCJcXHQiLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcbic6ICAvLyBsaW5lLWZlZWQgTEYKLQkJCQkJd3JpdGVTdHJpbmdPbigiXFxuIiwgd3JpdGVyKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXGYnOiAgLy8gZm9ybS1mZWVkIEZGCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcZiIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xyJzogIC8vIGNhcnJpYWdlLXJldHVybiBDUgotCQkJCQl3cml0ZVN0cmluZ09uKCJcXHIiLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICciJzogIC8vIGRvdWJsZS1xdW90ZQotCQkJCQl3cml0ZVN0cmluZ09uKCJcXFwiIiwgd3JpdGVyKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0vLwkJCQljYXNlICdcJyc6ICAvLyBzaW5nbGUtcXVvdGUKLS8vCQkJCQl3cml0ZVN0cmluZ09uKCJcXCciLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotLy8JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xcJzogIC8vIGJhY2tzbGFzaAotCQkJCQl3cml0ZVN0cmluZ09uKCJcXFxcIiwgd3JpdGVyKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJd3JpdGVDaGFyT24oYywgd3JpdGVyKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJd3JpdGVDaGFyT24oUVVPVEUsIHdyaXRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRUb0NoYXJBcnJheShTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHNiLmxlbmd0aCgpOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXTsKLQkJc2IuZ2V0Q2hhcnMoMCwgbGVuLCByZXN1bHQsIDApOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRUb0NoYXJBcnJheShTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBzYi5sZW5ndGgoKTsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbl07Ci0JCXNiLmdldENoYXJzKDAsIGxlbiwgcmVzdWx0LCAwKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKHN0cmluZyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nT24oY2hhcltdIHN0cmluZywgY2hhciBlc2NhcGUsIFdyaXRlciB3cml0ZXIpIHsKLQkJdHJ5IHsKLQkJCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQkJaWYgKGMgPT0gZXNjYXBlKSB7Ci0JCQkJCXdyaXRlci53cml0ZShjKTsKLQkJCQl9Ci0JCQkJd3JpdGVyLndyaXRlKGMpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVN0cmluZ09uKGNoYXJbXSBzdHJpbmcsIGludCBvZmYsIGludCBsZW4sIFdyaXRlciB3cml0ZXIpIHsKLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZShzdHJpbmcsIG9mZiwgbGVuKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTdHJpbmdPbihTdHJpbmcgc3RyaW5nLCBpbnQgb2ZmLCBpbnQgbGVuLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoc3RyaW5nLCBvZmYsIGxlbik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKHN0cmluZyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlQ2hhck9uKGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKGMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1Rvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRCYWcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5ZThhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBUaHJlYWQtc2FmZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIEJhZ30gaW50ZXJmYWNlLgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkQmFnPEU+Ci0JaW1wbGVtZW50cyBCYWc8RT4sIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIGJhZy4gKi8KLQlwcml2YXRlIGZpbmFsIEJhZzxFPiBiYWc7Ci0KLQkvKiogT2JqZWN0IHRvIHN5bmNocm9uaXplIG9uLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG11dGV4OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBiYWcgdGhhdCB3cmFwcyB0aGUKLQkgKiBzcGVjaWZpZWQgYmFnIGFuZCBsb2NrcyBvbiB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRCYWcoQmFnPEU+IGJhZywgT2JqZWN0IG11dGV4KSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChiYWcgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5iYWcgPSBiYWc7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzeW5jaHJvbml6ZWQgYmFnIHRoYXQgd3JhcHMgdGhlCi0JICogc3BlY2lmaWVkIGJhZyBhbmQgbG9ja3Mgb24gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRCYWcoQmFnPEU+IGJhZykgewotCQlzdXBlcigpOwotCQlpZiAoYmFnID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuYmFnID0gYmFnOwotCQl0aGlzLm11dGV4ID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzeW5jaHJvbml6ZWQgYmFnIHRoYXQgbG9ja3Mgb24gdGhlIHNwZWNpZmllZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQmFnKE9iamVjdCBtdXRleCkgewotCQl0aGlzKG5ldyBIYXNoQmFnPEU+KCksIG11dGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzeW5jaHJvbml6ZWQgYmFnIHRoYXQgbG9ja3Mgb24gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRCYWcoKSB7Ci0JCXRoaXMobmV3IEhhc2hCYWc8RT4oKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJhZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvLCBpbnQgY291bnQpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcuYWRkKG8sIGNvdW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgY291bnQoT2JqZWN0IG8pIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcuY291bnQobyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8QmFnLkVudHJ5PEU+PiBlbnRyaWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5lbnRyaWVzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8sIGludCBjb3VudCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5yZW1vdmUobywgY291bnQpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCB1bmlxdWVDb3VudCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcudW5pcXVlQ291bnQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiB1bmlxdWVJdGVyYXRvcigpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGFkZChFIGUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcuYWRkKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcuYWRkQWxsKGMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLmNvbnRhaW5zKG8pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLmNvbnRhaW5zQWxsKGMpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcuaXNFbXB0eSgpOwotCQl9Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5pdGVyYXRvcigpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnJlbW92ZShvKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcucmVtb3ZlQWxsKGMpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5yZXRhaW5BbGwoYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnNpemUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy50b0FycmF5KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnRvQXJyYXkoYSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkaXRpb25hbCBwdWJsaWMgcHJvdG9jb2wgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhlIHN0YWNrIGxvY2tzIG9uIHdoaWxlIHBlcmZvcm1pbmcKLQkgKiBpdHMgb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE11dGV4KCkgewotCQlyZXR1cm4gdGhpcy5tdXRleDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEJvb2xlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk2MmI1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3luY2hyb25pemVkIGFjY2VzcyB0byBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgotICogSXQgYWxzbyBwcm92aWRlcyBwcm90b2NvbCBmb3Igc3VzcGVuZGluZyBhIHRocmVhZCB1bnRpbCB0aGUKLSAqIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4sCi0gKiB3aXRoIG9wdGlvbmFsIHRpbWUtb3V0cy4KLSAqIAotICogQHNlZSBCb29sZWFuUmVmZXJlbmNlCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRCb29sZWFuCi0JaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIDxjb2RlPmJvb2xlYW48L2NvZGU+LiAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWx1ZTsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIDxjb2RlPmJvb2xlYW48L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZAotCSAqIGluaXRpYWwgdmFsdWUgYW5kIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRCb29sZWFuKGJvb2xlYW4gdmFsdWUsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZS4KLQkgKiBUaGUgc3luY2hyb25pemVkIDxjb2RlPmJvb2xlYW48L2NvZGU+IGl0c2VsZiB3aWxsIGJlIHRoZSBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQm9vbGVhbihib29sZWFuIHZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIDxjb2RlPmJvb2xlYW48L2NvZGU+Ci0JICogd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGFuZCBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJvb2xlYW4oT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMoZmFsc2UsIG11dGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgPGNvZGU+Ym9vbGVhbjwvY29kZT4KLQkgKiB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIFRoZSBzeW5jaHJvbml6ZWQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaXRzZWxmIHdpbGwgYmUgdGhlIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRCb29sZWFuKCkgewotCQl0aGlzKGZhbHNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmJvb2xlYW48L2NvZGU+Ci0JICogdmFsdWUgaXMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpcyhib29sZWFuIHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSB2OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+Ym9vbGVhbjwvY29kZT4KLQkgKiB2YWx1ZSBpcyB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm90KGJvb2xlYW4gdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlICE9IHY7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5ib29sZWFuPC9jb2RlPgotCSAqIHZhbHVlIGlzIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVHJ1ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmJvb2xlYW48L2NvZGU+Ci0JICogdmFsdWUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFsc2UoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuICEgdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCi0JICogSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGJvb2xlYW4gdmFsdWUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLnNldFZhbHVlXyh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKGJvb2xlYW4gdikgewotCQlpZiAodGhpcy52YWx1ZSAhPSB2KSB7Ci0JCQl0aGlzLnZhbHVlID0gdjsKLQkJCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIHRvIHRoZSBOT1Qgb2YgaXRzIGN1cnJlbnQgdmFsdWUuCi0JICogSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqIFJldHVybiB0aGUgcmVzdWx0aW5nIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZsaXAoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiB2ID0gISB0aGlzLnZhbHVlOwotCQkJdGhpcy5zZXRWYWx1ZV8odik7Ci0JCQlyZXR1cm4gdjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdChib29sZWFuIHYpIHsKLQkJdGhpcy5zZXRWYWx1ZSggISB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIHRvIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZyB0aHJlYWRzIGFyZSBub3RpZmllZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcnVlKCkgewotCQl0aGlzLnNldFZhbHVlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZyB0aHJlYWRzIGFyZSBub3RpZmllZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGYWxzZSgpIHsKLQkJdGhpcy5zZXRWYWx1ZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhpcyBvYmplY3QgbG9ja3Mgb24gd2hpbGUgcGVyZm9ybWluZwotCSAqIGl0cyBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TXV0ZXgoKSB7Ci0JCXJldHVybiB0aGlzLm11dGV4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRlZmluaXRlIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsVmFsdWVJcyhib29sZWFuIHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzXyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxWYWx1ZUlzXyhib29sZWFuIHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlICh0aGlzLnZhbHVlICE9IHYpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0JICogY2hhbmdlcyB0byB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxWYWx1ZUlzTm90KGJvb2xlYW4gdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzKCAhIHYpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQotCSAqIGNoYW5nZXMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbFRydWUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbFZhbHVlSXModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0JICogY2hhbmdlcyB0byA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+ZmFsc2U8L2NvZGU+LAotCSAqIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxGYWxzZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsVmFsdWVJcyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMgdG8KLQkgKiA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgdGhlbiBjaGFuZ2UgaXQgYmFjayB0byB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkKLQkgKiA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlCi0JICogaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvU2V0VmFsdWUoYm9vbGVhbiB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJc18oICEgdik7Ci0JCQl0aGlzLnNldFZhbHVlXyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQotCSAqIGNoYW5nZXMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LAotCSAqIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT5mYWxzZTwvY29kZT4sCi0JICogc2V0IHRoZSB2YWx1ZSB0byA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VG9TZXRUcnVlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VG9TZXRWYWx1ZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKLQkgKiBjaGFuZ2VzIHRvIDxjb2RlPnRydWU8L2NvZGU+LAotCSAqIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogc2V0IHRoZSB2YWx1ZSB0byA8Y29kZT5mYWxzZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvU2V0RmFsc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRUb1NldFZhbHVlKGZhbHNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGltZWQgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsKLQkgKiByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCB2YWx1ZSwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXMoYm9vbGVhbiB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJc18odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsVmFsdWVJc18oYm9vbGVhbiB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNfKHYpOwkvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7CS8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnZhbHVlICE9IHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKLQkgKiBjaGFuZ2VzIHRvIHRoZSBOT1Qgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsKLQkgKiByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsVmFsdWVJc05vdChib29sZWFuIHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzKCAhIHYsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gPGNvZGU+dHJ1ZTwvY29kZT4gb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IHdhcyBhY2hpZXZlZDsKLQkgKiByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxUcnVlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJcyh0cnVlLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgY2hhbmdlcwotCSAqIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHdhcyBhY2hpZXZlZDsKLQkgKiByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxGYWxzZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXMoZmFsc2UsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gPGVtPm5vdDwvZW0+IHRoZSBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBkb2VzIG5vdAotCSAqIGNoYW5nZSB0byA8Y29kZT5mYWxzZTwvY29kZT4gYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlCi0JICogZXhlY3V0aW5nIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZhbHVlLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgd2FzIHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkKLQkgKiA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlCi0JICogaW1tZWRpYXRlbHkgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU2V0VmFsdWUoYm9vbGVhbiB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxWYWx1ZUlzXyggISB2LCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJdGhpcy5zZXRWYWx1ZV8odik7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIDxjb2RlPnRydWU8L2NvZGU+IGFuZAotCSAqIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0bwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUgZXhlY3V0aW5nIHdpdGhvdXQKLQkgKiBjaGFuZ2luZyB0aGUgdmFsdWUuIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4KLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgd2FzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPjsKLQkgKiByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZQotCSAqIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+ZmFsc2U8L2NvZGU+LCBzZXQgdGhlCi0JICogdmFsdWUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU2V0VHJ1ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRUb1NldFZhbHVlKHRydWUsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGFuZAotCSAqIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0bwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcgd2l0aG91dAotCSAqIGNoYW5naW5nIHRoZSB2YWx1ZS4gVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPjsKLQkgKiByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZQotCSAqIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+dHJ1ZTwvY29kZT4sIHNldCB0aGUKLQkgKiB2YWx1ZSB0byA8Y29kZT5mYWxzZTwvY29kZT4gaW1tZWRpYXRlbHkgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU2V0RmFsc2UobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VG9TZXRWYWx1ZShmYWxzZSwgdGltZW91dCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplZCBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGludGVycnVwdGVkLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCAKLQkgKiB3aXRoIHRoZSBtdXRleCBsb2NrZWQuIFRoaXMgaXMgdXNlZnVsIGZvciBpbml0aWFsaXppbmcgdGhlIHZhbHVlIGZyb20gYW5vdGhlcgotCSAqIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJfQotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN5bmNocm9uaXplZEJvb2xlYW4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCQlyZXR1cm4gKFN5bmNocm9uaXplZEJvb2xlYW4pIHN1cGVyLmNsb25lKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCXJldHVybiAobyBpbnN0YW5jZW9mIFN5bmNocm9uaXplZEJvb2xlYW4pICYmCi0JCQkodGhpcy5nZXRWYWx1ZSgpID09ICgoU3luY2hyb25pemVkQm9vbGVhbikgbykuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKSA/IDEgOiAwOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAnWycgKyBTdHJpbmcudmFsdWVPZih0aGlzLmdldFZhbHVlKCkpICsgJ10nOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2I5MDJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRJbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN5bmNocm9uaXplZCBhY2Nlc3MgdG8gYW4gPGNvZGU+aW50PC9jb2RlPi4KLSAqIEl0IGFsc28gcHJvdmlkZXMgcHJvdG9jb2wgZm9yIHN1c3BlbmRpbmcgYSB0aHJlYWQgdW50aWwgdGhlCi0gKiB2YWx1ZSBpcyBzZXQgdG8gYSBzcGVjaWZpZWQgdmFsdWUsIHdpdGggb3B0aW9uYWwgdGltZS1vdXRzLgotICogCi0gKiBAc2VlIEludFJlZmVyZW5jZQotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkSW50Ci0JaW1wbGVtZW50cyBDb21wYXJhYmxlPFN5bmNocm9uaXplZEludD4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgPGNvZGU+aW50PC9jb2RlPi4gKi8KLQlwcml2YXRlIGludCB2YWx1ZTsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIGludGVnZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgdmFsdWUKLQkgKiBhbmQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEludChpbnQgdmFsdWUsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgaW50ZWdlciB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZS4KLQkgKiBUaGUgc3luY2hyb25pemVkIGludGVnZXIgaXRzZWxmIHdpbGwgYmUgdGhlIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRJbnQoaW50IHZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIGludGVnZXIgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIHplcm8KLQkgKiBhbmQgdGhlIHNwZWNpZmllZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkSW50KE9iamVjdCBtdXRleCkgewotCQl0aGlzKDAsIG11dGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgb2JqZWN0IHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiB6ZXJvLgotCSAqIFRoZSBzeW5jaHJvbml6ZWQgaW50ZWdlciBpdHNlbGYgd2lsbCBiZSB0aGUgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEludCgpIHsKLQkJdGhpcygwKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgPT0gdjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIG5vdCBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIG5vdEVxdWFscyhpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlICE9IHY7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyB6ZXJvLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzWmVybygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSAwOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90IHplcm8uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb3RaZXJvKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlICE9IDA7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dyZWF0ZXJUaGFuKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgPiB2OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dyZWF0ZXJUaGFuT3JFcXVhbChpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlID49IHY7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xlc3NUaGFuKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgPCB2OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xlc3NUaGFuT3JFcXVhbChpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlIDw9IHY7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBwb3NpdGl2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Bvc2l0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0dyZWF0ZXJUaGFuKDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIG5vdCBwb3NpdGl2ZQotCSAqIChpLmUuIG5lZ2F0aXZlIG9yIHplcm8pLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm90UG9zaXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzTGVzc1RoYW5PckVxdWFsKDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIG5lZ2F0aXZlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmVnYXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzTGVzc1RoYW4oMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90IG5lZ2F0aXZlCi0JICogKGkuZS4gemVybyBvciBwb3NpdGl2ZSkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb3ROZWdhdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNHcmVhdGVyVGhhbk9yRXF1YWwoMCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZS4gSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nCi0JICogdGhyZWFkcyBhcmUgbm90aWZpZWQuIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBzZXRWYWx1ZShpbnQgdmFsdWUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZV8odmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSA8ZW0+b2xkPC9lbT4gdmFsdWUuCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBpbnQgc2V0VmFsdWVfKGludCB2KSB7Ci0JCWludCBvbGQgPSB0aGlzLnZhbHVlOwotCQlpZiAodGhpcy52YWx1ZSAhPSB2KSB7Ci0JCQl0aGlzLnZhbHVlID0gdjsKLQkJCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JCX0KLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIDxlbT5uZXc8L2VtPiB2YWx1ZS4KLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGludCBzZXROZXdWYWx1ZV8oaW50IHYpIHsKLQkJaWYgKHRoaXMudmFsdWUgIT0gdikgewotCQkJdGhpcy52YWx1ZSA9IHY7Ci0JCQl0aGlzLm11dGV4Lm5vdGlmeUFsbCgpOwotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHZhbHVlLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgYWJzKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnNldE5ld1ZhbHVlXyhNYXRoLmFicyh0aGlzLnZhbHVlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIHRoZSBuZWdhdGl2ZSB2YWx1ZSBvZiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IG5lZygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXROZXdWYWx1ZV8oLXRoaXMudmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB6ZXJvLiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcKLQkgKiB0aHJlYWRzIGFyZSBub3RpZmllZC4gUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHNldFplcm8oKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKDApOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgcGx1cyB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgYWRkKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc2V0TmV3VmFsdWVfKHRoaXMudmFsdWUgKyB2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluY3JlbWVudCB0aGUgdmFsdWUgYnkgb25lLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgaW5jcmVtZW50KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMudmFsdWUrKzsKLQkJCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgbWludXMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHN1YnRyYWN0KGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc2V0TmV3VmFsdWVfKHRoaXMudmFsdWUgLSB2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlY3JlbWVudCB0aGUgdmFsdWUgYnkgb25lLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgZGVjcmVtZW50KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMudmFsdWUtLTsKLQkJCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgdGltZXMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IG11bHRpcGx5KGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc2V0TmV3VmFsdWVfKHRoaXMudmFsdWUgKiB2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgZGl2aWRlZCBieSB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgZGl2aWRlKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc2V0TmV3VmFsdWVfKHRoaXMudmFsdWUgLyB2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIHJlbWFpbmRlciBvZiB0aGUgY3VycmVudCB2YWx1ZSBkaXZpZGVkIGJ5IHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHJlbWFpbmRlcihpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnNldE5ld1ZhbHVlXyh0aGlzLnZhbHVlICUgdik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIHRoZSBtaW5pbXVtIG9mIHRoZSBjdXJyZW50IHZhbHVlIGFuZCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgbWluKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc2V0TmV3VmFsdWVfKE1hdGgubWluKHRoaXMudmFsdWUsIHYpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIG1heGltdW0gb2YgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBtYXgoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXROZXdWYWx1ZV8oTWF0aC5tYXgodGhpcy52YWx1ZSwgdikpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgY3VycmVudCB2YWx1ZSByYWlzZWQgdG8gdGhlIHBvd2VyIG9mIHRoZScKLQkgKiBzcGVjaWZpZWQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBwb3coaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXROZXdWYWx1ZV8oKGludCkgTWF0aC5wb3codGhpcy52YWx1ZSwgdikpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwgc2V0IGl0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBuZXcgdmFsdWUuIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBjb21wYXJlQW5kU3dhcChpbnQgZXhwZWN0ZWRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuY29tcGFyZUFuZFN3YXBfKGV4cGVjdGVkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgaW50IGNvbXBhcmVBbmRTd2FwXyhpbnQgZXhwZWN0ZWRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBleHBlY3RlZFZhbHVlKSA/IHRoaXMuc2V0VmFsdWVfKG5ld1ZhbHVlKSA6IHRoaXMudmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhlIHN5bmNocm9uaXplZCBpbnRlZ2VyIGxvY2tzIG9uIHdoaWxlIHBlcmZvcm1pbmcKLQkgKiBpdHMgb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE11dGV4KCkgewotCQlyZXR1cm4gdGhpcy5tdXRleDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5kZWZpbml0ZSB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVxdWFsKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRXF1YWxfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbEVxdWFsXyhpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMudmFsdWUgIT0gdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZQotCSAqIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdEVxdWFsKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsTm90RXF1YWxfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbE5vdEVxdWFsXyhpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMudmFsdWUgPT0gdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byB6ZXJvLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHplcm8sIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxaZXJvKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxFcXVhbCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHplcm8uCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHplcm8sCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdFplcm8oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbE5vdEVxdWFsKDApOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkKLQkgKiBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEdyZWF0ZXJUaGFuKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsR3JlYXRlclRoYW5fKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbEdyZWF0ZXJUaGFuXyhpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMudmFsdWUgPD0gdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5Ci0JICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWwoaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWxfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbF8oaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlICh0aGlzLnZhbHVlIDwgdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIGEgdmFsdWUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5Ci0JICogbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxMZXNzVGhhbihpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbExlc3NUaGFuXyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxMZXNzVGhhbl8oaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlICh0aGlzLnZhbHVlID49IHYpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byBhIHZhbHVlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeQotCSAqIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTGVzc1RoYW5PckVxdWFsKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsTGVzc1RoYW5PckVxdWFsXyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxMZXNzVGhhbk9yRXF1YWxfKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAodGhpcy52YWx1ZSA+IHYpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIHBvc2l0aXZlLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHBvc2l0aXZlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsUG9zaXRpdmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuKDApOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBpcyBub3QgcG9zaXRpdmUKLQkgKiAoaS5lLiBuZWdhdGl2ZSBvciB6ZXJvKS4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gcG9zaXRpdmUsCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdFBvc2l0aXZlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxMZXNzVGhhbk9yRXF1YWwoMCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IG5lZ2F0aXZlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTmVnYXRpdmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbExlc3NUaGFuKDApOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBpcyBub3QgbmVnYXRpdmUKLQkgKiAoaS5lLiB6ZXJvIG9yIHBvc2l0aXZlKS4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gbmVnYXRpdmUsCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdE5lZ2F0aXZlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWwoMCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB0aGVuIGNoYW5nZQotCSAqIGl0IGJhY2sgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiB0aGUgc3BlY2lmaWVkIHZhbHVlLCBzZXQKLQkgKiB0aGUgdmFsdWUgaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHdhaXRUb1NldFZhbHVlKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsTm90RXF1YWxfKHYpOwotCQkJcmV0dXJuIHRoaXMuc2V0VmFsdWVfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiB6ZXJvLCB0aGVuIGNoYW5nZSBpdAotCSAqIGJhY2sgdG8gemVybyBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiB6ZXJvLAotCSAqIHNldCB0aGUgdmFsdWUgdG8gemVybyBpbW1lZGlhdGVseS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgd2FpdFRvU2V0WmVybygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRUb1NldFZhbHVlKDApOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwgdGhlbiBjaGFuZ2UgaXQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUsCi0JICogc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBpbW1lZGlhdGVseS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgd2FpdFRvU3dhcChpbnQgZXhwZWN0ZWRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRXF1YWxfKGV4cGVjdGVkVmFsdWUpOwotCQkJcmV0dXJuIHRoaXMuc2V0VmFsdWVfKG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB0aW1lZCB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gdHJ1ZSBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsRXF1YWwoaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy53YWl0VW50aWxFcXVhbF8odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsRXF1YWxfKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVxdWFsXyh2KTsgIC8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnZhbHVlICE9IHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBzb21ldGhpbmcKLQkgKiBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIHJlbW92ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYQotCSAqIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlLCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE5vdEVxdWFsKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsTm90RXF1YWxfKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbE5vdEVxdWFsXyhpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxOb3RFcXVhbF8odik7CS8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsJLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoKHRoaXMudmFsdWUgPT0gdikgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnZhbHVlICE9IHYpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gemVybyBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIGlzIG5vdyB6ZXJvOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgemVybywKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFplcm8obG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxFcXVhbCgwLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHplcm8gb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSBpcyBub3cgbm90IHplcm87IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4KLQkgKiB6ZXJvLCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE5vdFplcm8obG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxOb3RFcXVhbCgwLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBhIHZhbHVlIGdyZWF0ZXIKLQkgKiB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxHcmVhdGVyVGhhbihpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuXyh2LCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxHcmVhdGVyVGhhbl8oaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsR3JlYXRlclRoYW5fKHYpOyAgLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOyAgLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoKHRoaXMudmFsdWUgPD0gdikgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnZhbHVlID4gdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gYSB2YWx1ZSBncmVhdGVyCi0JICogdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWwoaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWxfKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbF8oaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsR3JlYXRlclRoYW5PckVxdWFsXyh2KTsgIC8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnZhbHVlIDwgdikgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnZhbHVlID49IHYpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvIGEgdmFsdWUgbGVzcwotCSAqIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbExlc3NUaGFuKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsTGVzc1RoYW5fKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbExlc3NUaGFuXyhpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxMZXNzVGhhbl8odik7ICAvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7ICAvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlICgodGhpcy52YWx1ZSA+PSB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMudmFsdWUgPCB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBhIHZhbHVlIGxlc3MKLQkgKiB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSwKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbExlc3NUaGFuT3JFcXVhbChpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbExlc3NUaGFuT3JFcXVhbF8odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsTGVzc1RoYW5PckVxdWFsXyhpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxMZXNzVGhhbk9yRXF1YWxfKHYpOyAgLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOyAgLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoKHRoaXMudmFsdWUgPiB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMudmFsdWUgPD0gdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIHBvc2l0aXZlCi0JICogb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSBpcyBub3cgcG9zaXRpdmU7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBwb3NpdGl2ZSwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFBvc2l0aXZlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsR3JlYXRlclRoYW4oMCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIG5vdCBwb3NpdGl2ZQotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgaXMgbm93IG5vdCBwb3NpdGl2ZTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IG5vdCBwb3NpdGl2ZSwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE5vdFBvc2l0aXZlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsTGVzc1RoYW5PckVxdWFsKDAsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZQotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgaXMgbm93IG5lZ2F0aXZlOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgbmVnYXRpdmUsCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxOZWdhdGl2ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbExlc3NUaGFuKDAsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBpcyBub3QgbmVnYXRpdmUKLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIGlzIG5vdyBub3QgbmVnYXRpdmU7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBub3QgbmVnYXRpdmUsCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxOb3ROZWdhdGl2ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbCgwLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlCi0JICogaXQgYmFjayB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUgYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlIGV4ZWN1dGluZwotCSAqIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZhbHVlLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgd2FzIHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCBzZXQKLQkgKiB0aGUgdmFsdWUgaW1tZWRpYXRlbHkgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU2V0VmFsdWUoaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbE5vdEVxdWFsXyh2LCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJdGhpcy5zZXRWYWx1ZV8odik7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvIHNvbWV0aGluZwotCSAqIG90aGVyIHRoYW4gemVybywgdGhlbiBjaGFuZ2UgaXQgYmFjayB0byB6ZXJvCi0JICogYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0byBzb21ldGhpbmcKLQkgKiBvdGhlciB0aGFuIHplcm8gYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlCi0JICogZXhlY3V0aW5nIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZhbHVlLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgd2FzIHNldCB0byB6ZXJvOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBzb21ldGhpbmcgb3RoZXIgdGhhbiB6ZXJvLCBzZXQKLQkgKiB0aGUgdmFsdWUgdG8gemVybyBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXRaZXJvKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFRvU2V0VmFsdWUoMCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLCB0aGVuIGNoYW5nZSBpdAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0byB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlCi0JICogYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlIGV4ZWN1dGluZyB3aXRob3V0IGNoYW5naW5nCi0JICogdGhlIHZhbHVlLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgd2FzIHNldCB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZTsgcmV0dXJuCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwKLQkgKiBzZXQgdGhlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGltbWVkaWF0ZWx5LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1N3YXAoaW50IGV4cGVjdGVkVmFsdWUsIGludCBuZXdWYWx1ZSwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsRXF1YWxfKGV4cGVjdGVkVmFsdWUsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLnNldFZhbHVlXyhuZXdWYWx1ZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZWQgYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgY3VycmVudCB0aHJlYWQgaXMgbm90IGludGVycnVwdGVkLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCAKLQkgKiB3aXRoIHRoZSBtdXRleCBsb2NrZWQuIFRoaXMgaXMgdXNlZnVsIGZvciBpbml0aWFsaXppbmcgdGhlIHZhbHVlIGZyb20gYW5vdGhlcgotCSAqIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJfQotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbXBhcmFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBjb21wYXJlVG8oU3luY2hyb25pemVkSW50IHNpKSB7Ci0JCWludCB0aGlzVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCWludCBvdGhlclZhbHVlID0gc2kuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuIHRoaXNWYWx1ZSA8IG90aGVyVmFsdWUgPyAtMSA6ICh0aGlzVmFsdWUgPT0gb3RoZXJWYWx1ZSA/IDAgOiAxKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3luY2hyb25pemVkSW50IGNsb25lKCkgewotCQl0cnkgewotCQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQkJcmV0dXJuIChTeW5jaHJvbml6ZWRJbnQpIHN1cGVyLmNsb25lKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBTeW5jaHJvbml6ZWRJbnQpICYmCi0JCQkJKHRoaXMuZ2V0VmFsdWUoKSA9PSAoKFN5bmNocm9uaXplZEludCkgb2JqKS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAnWycgKyBTdHJpbmcudmFsdWVPZih0aGlzLmdldFZhbHVlKCkpICsgJ10nOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjU1NGU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN5bmNocm9uaXplZCBhY2Nlc3MgdG8gYW4gb2JqZWN0IG9mIHR5cGUgPGNvZGU+VjwvY29kZT4uCi0gKiBJdCBhbHNvIHByb3ZpZGVzIHByb3RvY29sIGZvciBzdXNwZW5kaW5nIGEgdGhyZWFkIHVudGlsIHRoZQotICogdmFsdWUgaXMgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+IG9yIGEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IHZhbHVlLAotICogd2l0aCBvcHRpb25hbCB0aW1lLW91dHMuCi0gKiAKLSAqIEBwYXJtIFYgdGhlIHR5cGUgb2YgdGhlIHN5bmNocm9uaXplZCBvYmplY3QncyB2YWx1ZQotICogQHNlZSBPYmplY3RSZWZlcmVuY2UKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZE9iamVjdDxWPgotCWltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyB2YWx1ZS4gKi8KLQlwcml2YXRlIFYgdmFsdWU7Ci0KLQkvKiogT2JqZWN0IHRvIHN5bmNocm9uaXplIG9uLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG11dGV4OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgdmFsdWUKLQkgKiBhbmQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZE9iamVjdChWIHZhbHVlLCBPYmplY3QgbXV0ZXgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm11dGV4ID0gbXV0ZXg7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZS4KLQkgKiBUaGUgc3luY2hyb25pemVkIG9iamVjdCBpdHNlbGYgd2lsbCBiZSB0aGUgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZE9iamVjdChWIHZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIG9iamVjdCB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogVGhlIHN5bmNocm9uaXplZCBvYmplY3QgaXRzZWxmIHdpbGwgYmUgdGhlIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRPYmplY3QoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUuCi0JICovCi0JcHVibGljIFYgZ2V0VmFsdWUoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbHVlRXF1YWxzKFYgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLnZhbHVlLCB2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIG5vdCBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbHVlTm90RXF1YWwoViB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnZhbHVlLCB2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTnVsbCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm90TnVsbCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSAhPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZS4gSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nCi0JICogdGhyZWFkcyBhcmUgbm90aWZpZWQuIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgc2V0VmFsdWUoViB2YWx1ZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnNldFZhbHVlXyh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIFYgc2V0VmFsdWVfKFYgdikgewotCQlWIG9sZCA9IHRoaXMudmFsdWU7Ci0JCWlmICh0aGlzLnZhbHVlICE9IHYpIHsKLQkJCXRoaXMudmFsdWUgPSB2OwotCQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJfQotCQlyZXR1cm4gb2xkOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZwotCSAqIHRocmVhZHMgYXJlIG5vdGlmaWVkLiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBWIHNldE51bGwoKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKG51bGwpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBjdXJyZW50IHZhbHVlIGlzIHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUsIHNldCBpdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgbmV3IHZhbHVlLiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBWIGNvbXBhcmVBbmRTd2FwKFYgZXhwZWN0ZWRWYWx1ZSwgViBuZXdWYWx1ZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmNvbXBhcmVBbmRTd2FwXyhleHBlY3RlZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIFYgY29tcGFyZUFuZFN3YXBfKFYgZXhwZWN0ZWRWYWx1ZSwgViBuZXdWYWx1ZSkgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy52YWx1ZSwgZXhwZWN0ZWRWYWx1ZSkgPyB0aGlzLnNldFZhbHVlXyhuZXdWYWx1ZSkgOiB0aGlzLnZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2JqZWN0IHRoZSBzeW5jaHJvbml6ZWQgb2JqZWN0IGxvY2tzIG9uIHdoaWxlIHBlcmZvcm1pbmcKLQkgKiBpdHMgb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE11dGV4KCkgewotCQlyZXR1cm4gdGhpcy5tdXRleDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5kZWZpbml0ZSB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbFZhbHVlSXMoViB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJc18odik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsVmFsdWVJc18oViB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAoVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMudmFsdWUsIHYpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlCi0JICogdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZCB2YWx1ZSwKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsVmFsdWVJc05vdChWIHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzTm90Xyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxWYWx1ZUlzTm90XyhWIHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLnZhbHVlLCB2KSkgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT5udWxsPC9jb2RlPiwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE51bGwoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbFZhbHVlSXMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gPGNvZGU+bnVsbDwvY29kZT4sCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdE51bGwoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3QobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB0aGVuIGNoYW5nZQotCSAqIGl0IGJhY2sgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiB0aGUgc3BlY2lmaWVkIHZhbHVlLCBzZXQKLQkgKiB0aGUgdmFsdWUgaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgViB3YWl0VG9TZXRWYWx1ZShWIHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzTm90Xyh2KTsKLQkJCXJldHVybiB0aGlzLnNldFZhbHVlXyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogc29tZXRoaW5nIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gY2hhbmdlIGl0Ci0JICogYmFjayB0byA8Y29kZT5udWxsPC9jb2RlPiBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiA8Y29kZT5udWxsPC9jb2RlPiwKLQkgKiBzZXQgdGhlIHZhbHVlIHRvIDxjb2RlPm51bGw8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgd2FpdFRvU2V0TnVsbCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRUb1NldFZhbHVlKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwgdGhlbiBjaGFuZ2UgaXQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUsCi0JICogc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBpbW1lZGlhdGVseS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBWIHdhaXRUb1N3YXAoViBleHBlY3RlZFZhbHVlLCBWIG5ld1ZhbHVlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJc18oZXhwZWN0ZWRWYWx1ZSk7Ci0JCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZV8obmV3VmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRpbWVkIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiB0cnVlIGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxWYWx1ZUlzKFYgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXNfKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXNfKFYgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzXyh2KTsgIC8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnZhbHVlLCB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gc29tZXRoaW5nCi0JICogb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyByZW1vdmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEKLQkgKiB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSwgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxWYWx1ZUlzTm90KFYgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3RfKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXNOb3RfKFYgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzTm90Xyh2KTsJLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOwkvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlIChUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLnZhbHVlLCB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMudmFsdWUgIT0gdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT5udWxsPC9jb2RlPiwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE51bGwobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxWYWx1ZUlzKG51bGwsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+Ci0JICogPGNvZGU+bnVsbDwvY29kZT4sIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTm90TnVsbChsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3QobnVsbCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB0aGVuIGNoYW5nZQotCSAqIGl0IGJhY2sgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlIGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcKLQkgKiB3aXRob3V0IGNoYW5naW5nIHRoZSB2YWx1ZS4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0Ci0JICogdGhlIHZhbHVlIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1NldFZhbHVlKFYgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsVmFsdWVJc05vdF8odiwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXRoaXMuc2V0VmFsdWVfKHYpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBzb21ldGhpbmcKLQkgKiBvdGhlciB0aGFuIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0byBzb21ldGhpbmcKLQkgKiBvdGhlciB0aGFuIDxjb2RlPm51bGw8L2NvZGU+IGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZQotCSAqIGV4ZWN1dGluZyB3aXRob3V0IGNoYW5naW5nIHRoZSB2YWx1ZS4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT47IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBvdGhlciB0aGFuIDxjb2RlPm51bGw8L2NvZGU+LCBzZXQKLQkgKiB0aGUgdmFsdWUgdG8gPGNvZGU+bnVsbDwvY29kZT4gaW1tZWRpYXRlbHkgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU2V0TnVsbChsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRUb1NldFZhbHVlKG51bGwsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwgdGhlbiBjaGFuZ2UgaXQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgdG8gdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZQotCSAqIGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcgd2l0aG91dCBjaGFuZ2luZwotCSAqIHRoZSB2YWx1ZS4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWU7IHJldHVybgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUsCi0JICogc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBpbW1lZGlhdGVseS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9Td2FwKFYgZXhwZWN0ZWRWYWx1ZSwgViBuZXdWYWx1ZSwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsVmFsdWVJc18oZXhwZWN0ZWRWYWx1ZSwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXRoaXMuc2V0VmFsdWVfKG5ld1ZhbHVlKTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplZCBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiBjdXJyZW50IHRocmVhZCBpcyBub3QgaW50ZXJydXB0ZWQsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIAotCSAqIHdpdGggdGhlIG11dGV4IGxvY2tlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGluaXRpYWxpemluZyB0aGUgdmFsdWUgZnJvbSBhbm90aGVyCi0JICogdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAoVGhyZWFkLmludGVycnVwdGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3luY2hyb25pemVkT2JqZWN0PFY+IGNsb25lKCkgewotCQl0cnkgewotCQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQkJU3luY2hyb25pemVkT2JqZWN0PFY+IGNsb25lID0gKFN5bmNocm9uaXplZE9iamVjdDxWPikgc3VwZXIuY2xvbmUoKTsKLQkJCQlyZXR1cm4gY2xvbmU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBTeW5jaHJvbml6ZWRPYmplY3Q8Pz4pICYmCi0JCQlUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLmdldFZhbHVlKCksICgoU3luY2hyb25pemVkT2JqZWN0PD8+KSBvYmopLmdldFZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCU9iamVjdCB2ID0gdGhpcy5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gKHYgPT0gbnVsbCkgPyAwIDogdi5oYXNoQ29kZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAnWycgKyBTdHJpbmcudmFsdWVPZih0aGlzLmdldFZhbHVlKCkpICsgJ10nOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZFF1ZXVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkUXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1YTRhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkUXVldWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFRocmVhZC1zYWZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgUXVldWV9IGludGVyZmFjZS4KLSAqIFRoaXMgYWxzbyBwcm92aWRlcyBwcm90b2NvbCBmb3Igc3VzcGVuZGluZyBhIHRocmVhZCB1bnRpbCB0aGUKLSAqIHF1ZXVlIGlzIGVtcHR5IG9yIG5vdCBlbXB0eSwgd2l0aCBvcHRpb25hbCB0aW1lLW91dHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRRdWV1ZTxFPgotCWltcGxlbWVudHMgUXVldWU8RT4sIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIHF1ZXVlLiAqLwotCXByaXZhdGUgZmluYWwgUXVldWU8RT4gcXVldWU7Ci0KLQkvKiogT2JqZWN0IHRvIHN5bmNocm9uaXplIG9uLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG11dGV4OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBxdWV1ZSB0aGF0IHdyYXBzIHRoZQotCSAqIHNwZWNpZmllZCBxdWV1ZSBhbmQgbG9ja3Mgb24gdGhlIHNwZWNpZmllZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkUXVldWUoUXVldWU8RT4gcXVldWUsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQlpZiAocXVldWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5xdWV1ZSA9IHF1ZXVlOwotCQl0aGlzLm11dGV4ID0gbXV0ZXg7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIHF1ZXVlIHRoYXQgd3JhcHMgdGhlCi0JICogc3BlY2lmaWVkIHF1ZXVlIGFuZCBsb2NrcyBvbiBpdHNlbGYuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFF1ZXVlKFF1ZXVlPEU+IHF1ZXVlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChxdWV1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnF1ZXVlID0gcXVldWU7Ci0JCXRoaXMubXV0ZXggPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbXB0eSBzeW5jaHJvbml6ZWQgcXVldWUgdGhhdCBsb2NrcyBvbiB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRRdWV1ZShPYmplY3QgbXV0ZXgpIHsKLQkJdGhpcyhuZXcgU2ltcGxlUXVldWU8RT4oKSwgbXV0ZXgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbXB0eSBzeW5jaHJvbml6ZWQgcXVldWUgdGhhdCBsb2NrcyBvbiBpdHNlbGYuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFF1ZXVlKCkgewotCQl0aGlzKG5ldyBTaW1wbGVRdWV1ZTxFPigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUXVldWUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgZW5xdWV1ZShFIGVsZW1lbnQpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLmVucXVldWVfKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVucXVldWVfKEUgZWxlbWVudCkgewotCQl0aGlzLnF1ZXVlLmVucXVldWUoZWxlbWVudCk7Ci0JCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JfQotCi0JcHVibGljIEUgZGVxdWV1ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5kZXF1ZXVlXygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBFIGRlcXVldWVfKCkgewotCQlFIGVsZW1lbnQgPSB0aGlzLnF1ZXVlLmRlcXVldWUoKTsKLQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIEUgcGVlaygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5xdWV1ZS5wZWVrKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnF1ZXVlLmlzRW1wdHkoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRlZmluaXRlIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBxdWV1ZSdzIGVtcHR5IHN0YXR1cyBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxFbXB0eUlzKGJvb2xlYW4gZW1wdHkpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxFbXB0eUlzXyhlbXB0eSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsRW1wdHlJc18oYm9vbGVhbiBlbXB0eSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMucXVldWUuaXNFbXB0eSgpICE9IGVtcHR5KSB7Ci0JCQl0aGlzLm11dGV4LndhaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBxdWV1ZSBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxFbXB0eSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsRW1wdHlJcyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUgaGFzIHNvbWV0aGluZyBvbiBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxOb3RFbXB0eSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsRW1wdHlJcyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlIGlzIGVtcHR5LAotCSAqIHRoZW4gImVucXVldWUiIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgdGFpbCBvZiB0aGUgcXVldWUKLQkgKiBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRUb0VucXVldWUoRSBlbGVtZW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJc18odHJ1ZSk7Ci0JCQl0aGlzLmVucXVldWVfKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlIGhhcyBzb21ldGhpbmcgb24gaXQsCi0JICogdGhlbiAiZGVxdWV1ZSIgYW4gaXRlbSBmcm9tIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBhbmQgcmV0dXJuIGl0LgotCSAqLwotCXB1YmxpYyBPYmplY3Qgd2FpdFRvRGVxdWV1ZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxFbXB0eUlzXyhmYWxzZSk7Ci0JCQlyZXR1cm4gdGhpcy5kZXF1ZXVlXygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRpbWVkIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBxdWV1ZSdzIGVtcHR5IHN0YXR1cyBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQKLQkgKiBlbXB0eSBzdGF0dXMgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHF1ZXVlJ3MgZW1wdHkgc3RhdHVzIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCB2YWx1ZSwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbEVtcHR5SXMoYm9vbGVhbiBlbXB0eSwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGVtcHR5LCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxFbXB0eUlzXyhib29sZWFuIGVtcHR5LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGVtcHR5KTsJLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOwkvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlICgodGhpcy5xdWV1ZS5pc0VtcHR5KCkgIT0gZW1wdHkpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy5xdWV1ZS5pc0VtcHR5KCkgPT0gZW1wdHkpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBxdWV1ZSBpcyBlbXB0eQotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiB0aGUgcXVldWUgaXMgZW1wdHk7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgcXVldWUgaXMgYWxyZWFkeSBlbXB0eSwgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxFbXB0eShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbEVtcHR5SXModHJ1ZSwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlIGhhcyBzb21ldGhpbmcgb24gaXQuCi0JICogb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBxdWV1ZSBpcyBub3QgZW1wdHk7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgcXVldWUgYWxyZWFkeSBoYXMgc29tZXRoaW5nIG9uIGl0LCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE5vdEVtcHR5KGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRW1wdHlJcyhmYWxzZSwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlIGlzIGVtcHR5LAotCSAqIHRoZW4gImVucXVldWUiIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgdGFpbCBvZiB0aGUgcXVldWUKLQkgKiBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgcXVldWUgaXMgbm90IGVtcHRpZWQgb3V0Ci0JICogYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlIGV4ZWN1dGluZyB3aXRob3V0Ci0JICogImVucXVldWVpbmciIHRoZSBpdGVtLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlCi0JICogaXRlbSB3YXMgZW5xdWV1ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgcXVldWUgaXMgYWxyZWFkeSBlbXB0eSwgImVucXVldWUiIHRoZSBzcGVjaWZpZWQgaXRlbSBhbmQKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb0VucXVldWUoRSBlbGVtZW50LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxFbXB0eUlzXyh0cnVlLCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJdGhpcy5lbnF1ZXVlXyhlbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlIGhhcyBzb21ldGhpbmcgb24gaXQsCi0JICogdGhlbiAiZGVxdWV1ZSIgYW4gaXRlbSBmcm9tIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBhbmQgcmV0dXJuIGl0LgotCSAqIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSBhbmQgbm90aGluZyBpcyAiZW5xdWV1ZWQiIG9uIHRvIGl0IGJlZm9yZSB0aGUKLQkgKiB0aW1lLW91dCwgdGhyb3cgYSBubyBzdWNoIGVsZW1lbnQgZXhjZXB0aW9uLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLgotCSAqIElmIHRoZSBxdWV1ZSBpcyBub3QgZW1wdHksICJkZXF1ZXVlIiBhbiBpdGVtIGFuZAotCSAqIHJldHVybiBpdCBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIE9iamVjdCB3YWl0VG9EZXF1ZXVlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGZhbHNlLCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZGVxdWV1ZV8oKTsKLQkJCX0KLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemVkIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgaW50ZXJydXB0ZWQsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIAotCSAqIHdpdGggdGhlIG11dGV4IGxvY2tlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGluaXRpYWxpemluZyB0aGUgcXVldWUgaW4gYW5vdGhlcgotCSAqIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJfQotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZGl0aW9uYWwgcHVibGljIHByb3RvY29sICoqKioqKioqKioKLQotCS8qKgotCSAqICJEcmFpbiIgYWxsIHRoZSBjdXJyZW50IGl0ZW1zIGZyb20gdGhlIHF1ZXVlIGludG8gc3BlY2lmaWVkIHF1ZXVlLgotCSAqLwotCXB1YmxpYyB2b2lkIGRyYWluVG8oUXVldWU8RT4gcSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMuZHJhaW5Ub18ocSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgZHJhaW5Ub18oUXVldWU8RT4gcSkgewotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJd2hpbGUgKCAhIHRoaXMucXVldWUuaXNFbXB0eSgpKSB7Ci0JCQlxLmVucXVldWUodGhpcy5xdWV1ZS5kZXF1ZXVlKCkpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQkJaWYgKGNoYW5nZWQpIHsKLQkJCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGUgcXVldWUgbG9ja3Mgb24gd2hpbGUgcGVyZm9ybWluZwotCSAqIGl0cyBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TXV0ZXgoKSB7Ci0JCXJldHVybiB0aGlzLm11dGV4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuICdbJyArIHRoaXMucXVldWUudG9TdHJpbmcoKSArICddJzsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZFN0YWNrLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkU3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMwYTRkYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkU3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFRocmVhZC1zYWZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgU3RhY2t9IGludGVyZmFjZS4KLSAqIFRoaXMgYWxzbyBwcm92aWRlcyBwcm90b2NvbCBmb3Igc3VzcGVuZGluZyBhIHRocmVhZCB1bnRpbCB0aGUKLSAqIHN0YWNrIGlzIGVtcHR5IG9yIG5vdCBlbXB0eSwgd2l0aCBvcHRpb25hbCB0aW1lLW91dHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRTdGFjazxFPgotCWltcGxlbWVudHMgU3RhY2s8RT4sIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIHN0YWNrLiAqLwotCXByaXZhdGUgZmluYWwgU3RhY2s8RT4gc3RhY2s7Ci0KLQkvKiogT2JqZWN0IHRvIHN5bmNocm9uaXplIG9uLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG11dGV4OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBzdGFjayB0aGF0IHdyYXBzIHRoZQotCSAqIHNwZWNpZmllZCBzdGFjayBhbmQgbG9ja3Mgb24gdGhlIHNwZWNpZmllZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkU3RhY2soU3RhY2s8RT4gc3RhY2ssIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQlpZiAoc3RhY2sgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zdGFjayA9IHN0YWNrOwotCQl0aGlzLm11dGV4ID0gbXV0ZXg7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIHN0YWNrIHRoYXQgd3JhcHMgdGhlCi0JICogc3BlY2lmaWVkIHN0YWNrIGFuZCBsb2NrcyBvbiBpdHNlbGYuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFN0YWNrKFN0YWNrPEU+IHN0YWNrKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzdGFjayA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnN0YWNrID0gc3RhY2s7Ci0JCXRoaXMubXV0ZXggPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbXB0eSBzeW5jaHJvbml6ZWQgc3RhY2sgdGhhdCBsb2NrcyBvbiB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRTdGFjayhPYmplY3QgbXV0ZXgpIHsKLQkJdGhpcyhuZXcgU2ltcGxlU3RhY2s8RT4oKSwgbXV0ZXgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbXB0eSBzeW5jaHJvbml6ZWQgc3RhY2sgdGhhdCBsb2NrcyBvbiBpdHNlbGYuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFN0YWNrKCkgewotCQl0aGlzKG5ldyBTaW1wbGVTdGFjazxFPigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3RhY2sgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcHVzaChFIGVsZW1lbnQpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLnB1c2hfKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHB1c2hfKEUgZWxlbWVudCkgewotCQl0aGlzLnN0YWNrLnB1c2goZWxlbWVudCk7Ci0JCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JfQotCi0JcHVibGljIEUgcG9wKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnBvcF8oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgRSBwb3BfKCkgewotCQlFIG8gPSB0aGlzLnN0YWNrLnBvcCgpOwotCQl0aGlzLm11dGV4Lm5vdGlmeUFsbCgpOwotCQlyZXR1cm4gbzsKLQl9Ci0KLQlwdWJsaWMgRSBwZWVrKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnN0YWNrLnBlZWsoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc3RhY2suaXNFbXB0eSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGVmaW5pdGUgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrJ3MgZW1wdHkgc3RhdHVzIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVtcHR5SXMoYm9vbGVhbiBlbXB0eSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGVtcHR5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxFbXB0eUlzXyhib29sZWFuIGVtcHR5KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAodGhpcy5zdGFjay5pc0VtcHR5KCkgIT0gZW1wdHkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVtcHR5KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxFbXB0eUlzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBoYXMgc29tZXRoaW5nIG9uIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdEVtcHR5KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxFbXB0eUlzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHksCi0JICogdGhlbiAicHVzaCIgdGhlIHNwZWNpZmllZCBpdGVtIG9uIHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VG9QdXNoKEUgZWxlbWVudCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXNfKHRydWUpOwotCQkJdGhpcy5wdXNoXyhlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBoYXMgc29tZXRoaW5nIG9uIGl0LAotCSAqIHRoZW4gInBvcCIgYW4gaXRlbSBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGFuZCByZXR1cm4gaXQuCi0JICovCi0JcHVibGljIE9iamVjdCB3YWl0VG9Qb3AoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJc18oZmFsc2UpOwotCQkJcmV0dXJuIHRoaXMucG9wXygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRpbWVkIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjaydzIGVtcHR5IHN0YXR1cyBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQKLQkgKiBlbXB0eSBzdGF0dXMgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHN0YWNrJ3MgZW1wdHkgc3RhdHVzIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCB2YWx1ZSwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbEVtcHR5SXMoYm9vbGVhbiBlbXB0eSwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGVtcHR5LCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxFbXB0eUlzXyhib29sZWFuIGVtcHR5LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGVtcHR5KTsJLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOwkvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlICgodGhpcy5zdGFjay5pc0VtcHR5KCkgIT0gZW1wdHkpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy5zdGFjay5pc0VtcHR5KCkgPT0gZW1wdHkpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eQotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiB0aGUgc3RhY2sgaXMgZW1wdHk7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgc3RhY2sgaXMgYWxyZWFkeSBlbXB0eSwgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxFbXB0eShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbEVtcHR5SXModHJ1ZSwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGhhcyBzb21ldGhpbmcgb24gaXQuCi0JICogb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBzdGFjayBpcyBub3QgZW1wdHk7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgc3RhY2sgYWxyZWFkeSBoYXMgc29tZXRoaW5nIG9uIGl0LCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE5vdEVtcHR5KGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRW1wdHlJcyhmYWxzZSwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5LAotCSAqIHRoZW4gInB1c2giIHRoZSBzcGVjaWZpZWQgaXRlbSBvbiB0byB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIGFuZCBjb250aW51ZSBleGVjdXRpbmcuIElmIHRoZSBzdGFjayBpcyBub3QgZW1wdGllZCBvdXQKLQkgKiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUgZXhlY3V0aW5nIHdpdGhvdXQKLQkgKiAicHVzaGluZyIgdGhlIGl0ZW0uCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUKLQkgKiBpdGVtIHdhcyBwdXNoZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgc3RhY2sgaXMgYWxyZWFkeSBlbXB0eSwgInB1c2giIHRoZSBzcGVjaWZpZWQgaXRlbSBhbmQKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1B1c2goRSBlbGVtZW50LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxFbXB0eUlzXyh0cnVlLCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJdGhpcy5wdXNoXyhlbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGhhcyBzb21ldGhpbmcgb24gaXQsCi0JICogdGhlbiAicG9wIiBhbiBpdGVtIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIHJldHVybiBpdC4KLQkgKiBJZiB0aGUgc3RhY2sgaXMgZW1wdHkgYW5kIG5vdGhpbmcgaXMgInB1c2hlZCIgb24gdG8gaXQgYmVmb3JlIHRoZQotCSAqIHRpbWUtb3V0LCB0aHJvdyBhbiBlbXB0eSBzdGFjayBleGNlcHRpb24uCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuCi0JICogSWYgdGhlIHN0YWNrIGlzIG5vdCBlbXB0eSwgInBvcCIgYW4gaXRlbSBhbmQKLQkgKiByZXR1cm4gaXQgaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBPYmplY3Qgd2FpdFRvUG9wKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGZhbHNlLCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJcmV0dXJuIHRoaXMucG9wXygpOwotCQkJfQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZWQgYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBpbnRlcnJ1cHRlZCwgZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgCi0JICogd2l0aCB0aGUgbXV0ZXggbG9ja2VkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW5pdGlhbGl6aW5nIHRoZSBzdGFjayBpbiBhbm90aGVyCi0JICogdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAoVGhyZWFkLmludGVycnVwdGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkaXRpb25hbCBwdWJsaWMgcHJvdG9jb2wgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhlIHN0YWNrIGxvY2tzIG9uIHdoaWxlIHBlcmZvcm1pbmcKLQkgKiBpdHMgb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE11dGV4KCkgewotCQlyZXR1cm4gdGhpcy5tdXRleDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiAnWycgKyB0aGlzLnN0YWNrLnRvU3RyaW5nKCkgKyAnXSc7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9UaHJlYWRMb2NhbENvbW1hbmQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9UaHJlYWRMb2NhbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyMDM4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvVGhyZWFkTG9jYWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21tYW5kIGludGVyZmFjZSBhbGxvd3MgdGhlIGNsaWVudCB0bwotICogc3BlY2lmeSBhIGRpZmZlcmVudCBDb21tYW5kIGZvciBlYWNoIHRocmVhZC4KLSAqLwotcHVibGljIGNsYXNzIFRocmVhZExvY2FsQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCXByb3RlY3RlZCBmaW5hbCBUaHJlYWRMb2NhbDxDb21tYW5kPiB0aHJlYWRMb2NhbDsKLQlwcm90ZWN0ZWQgZmluYWwgQ29tbWFuZCBkZWZhdWx0Q29tbWFuZDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGNvbW1hbmQgZG9lcyBub3RoaW5nLgotCSAqLwotCXB1YmxpYyBUaHJlYWRMb2NhbENvbW1hbmQoKSB7Ci0JCXRoaXMoQ29tbWFuZC5OdWxsLmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBUaHJlYWRMb2NhbENvbW1hbmQoQ29tbWFuZCBkZWZhdWx0Q29tbWFuZCkgewotCQlzdXBlcigpOwotCQl0aGlzLmRlZmF1bHRDb21tYW5kID0gZGVmYXVsdENvbW1hbmQ7Ci0JCXRoaXMudGhyZWFkTG9jYWwgPSB0aGlzLmJ1aWxkVGhyZWFkTG9jYWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGhyZWFkTG9jYWw8Q29tbWFuZD4gYnVpbGRUaHJlYWRMb2NhbCgpIHsKLQkJcmV0dXJuIG5ldyBUaHJlYWRMb2NhbDxDb21tYW5kPigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXRoaXMuZ2V0KCkuZXhlY3V0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldCgpIHsKLQkJQ29tbWFuZCBjb21tYW5kID0gdGhpcy50aHJlYWRMb2NhbC5nZXQoKTsKLQkJcmV0dXJuIChjb21tYW5kICE9IG51bGwpID8gY29tbWFuZCA6IHRoaXMuZGVmYXVsdENvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjdXJyZW50IHRocmVhZCdzIGNvbW1hbmQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMudGhyZWFkTG9jYWwuc2V0KGNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHRocmVhZCdzIGNvbW1hbmQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0KCkudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9UaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1RocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZGZhMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1RocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ29tbWFuZEV4ZWN1dG9yIGludGVyZmFjZSBhbGxvd3MgdGhlIGNsaWVudCB0bwotICogc3BlY2lmeSBhIGRpZmZlcmVudCBDb21tYW5kIEV4ZWN1dG9yIGZvciBlYWNoIHRocmVhZC4KLSAqLwotcHVibGljIGNsYXNzIFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yIGltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yIHsKLQlwcm90ZWN0ZWQgZmluYWwgVGhyZWFkTG9jYWw8Q29tbWFuZEV4ZWN1dG9yPiB0aHJlYWRMb2NhbDsKLQlwcm90ZWN0ZWQgZmluYWwgQ29tbWFuZEV4ZWN1dG9yIGRlZmF1bHRDb21tYW5kRXhlY3V0b3I7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBjb21tYW5kIGV4ZWN1dG9yIHNpbXBseSBleGVjdXRlcyB0aGUgY29tbWFuZCBkaXJlY3RseS4KLQkgKi8KLQlwdWJsaWMgVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXRoaXMoQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHVibGljIFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKENvbW1hbmRFeGVjdXRvciBkZWZhdWx0Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGVmYXVsdENvbW1hbmRFeGVjdXRvciA9IGRlZmF1bHRDb21tYW5kRXhlY3V0b3I7Ci0JCXRoaXMudGhyZWFkTG9jYWwgPSB0aGlzLmJ1aWxkVGhyZWFkTG9jYWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGhyZWFkTG9jYWw8Q29tbWFuZEV4ZWN1dG9yPiBidWlsZFRocmVhZExvY2FsKCkgewotCQlyZXR1cm4gbmV3IFRocmVhZExvY2FsPENvbW1hbmRFeGVjdXRvcj4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQl0aGlzLmdldFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKCkuZXhlY3V0ZShjb21tYW5kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZEV4ZWN1dG9yIGdldFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKCkgewotCQlDb21tYW5kRXhlY3V0b3IgY2UgPSB0aGlzLnRocmVhZExvY2FsLmdldCgpOwotCQlyZXR1cm4gKGNlICE9IG51bGwpID8gY2UgOiB0aGlzLmRlZmF1bHRDb21tYW5kRXhlY3V0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjdXJyZW50IHRocmVhZCdzIGNvbW1hbmQgZXhlY3V0b3IgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcikgewotCQl0aGlzLnRocmVhZExvY2FsLnNldChjb21tYW5kRXhlY3V0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHRocmVhZCdzIGNvbW1hbmQKLQkgKiBleGVjdXRvci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Ub29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTM3OGRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBWYXJpb3VzIHV0aWxpdHkgbWV0aG9kcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgVG9vbHMgewotCi0JLy8gKioqKioqKioqKiBvYmplY3QgY29tcGFyaXNvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHZhbHVlcyBhcmUgZXF1YWwsIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bGwgY2hlY2tzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWx1ZXNBcmVFcXVhbChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCXJldHVybiAodmFsdWUxID09IG51bGwpID8KLQkJCQkodmFsdWUyID09IG51bGwpIDoKLQkJCQkoKHZhbHVlMiAhPSBudWxsKSAmJiB2YWx1ZTEuZXF1YWxzKHZhbHVlMikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWVzIGFyZSBkaWZmZXJlbnQsIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bGwgY2hlY2tzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlyZXR1cm4gISB2YWx1ZXNBcmVFcXVhbCh2YWx1ZTEsIHZhbHVlMik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN5c3RlbSBwcm9wZXJ0aWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IEpWTSBpcyBTdW4ncy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4ganZtSXNTdW4oKSB7Ci0JCXJldHVybiBqdm1JcygiU3VuIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgSlZNIGlzIElCTSdzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBqdm1Jc0lCTSgpIHsKLQkJcmV0dXJuIGp2bUlzKCJJQk0iKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGp2bUlzKFN0cmluZyBqdm1WZW5kb3JOYW1lKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVuZG9yIikuc3RhcnRzV2l0aChqdm1WZW5kb3JOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIE1pY3Jvc29mdCBXaW5kb3dzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvc0lzV2luZG93cygpIHsKLQkJcmV0dXJuIG9zSXMoIldpbmRvd3MiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIExpbnV4LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvc0lzTGludXgoKSB7Ci0JCXJldHVybiBvc0lzKCJMaW51eCIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gb3NJcyhTdHJpbmcgb3NOYW1lKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5pbmRleE9mKG9zTmFtZSkgIT0gLTE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvVHJhbnNmb3JtZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9UcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzM4NDRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9UcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIHRyYW5zZm9ybSBvYmplY3RzLgotICogVHJhbnNmb3JtIGFuIG9iamVjdCBvZiB0eXBlIFQxIHRvIGFuIG9iamVjdCBvZiB0eXBlIFQyLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyYW5zZm9ybWVyPFQxLCBUMj4gewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCBvYmplY3QuCi0JICogVGhlIHNlbWFudGljcyBvZiAidHJhbnNmb3JtIiBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotCSAqIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLQkgKi8KLQlUMiB0cmFuc2Zvcm0oVDEgbyk7Ci0KLQotCS8qKgotCSAqIEEgIm51bGwiIHRyYW5zZm9ybWVyIHdpbGwgcGVyZm9ybSBubyB0cmFuc2Zvcm1hdGlvbiBhdCBhbGw7Ci0JICogaXQgd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBvYmplY3QgInVudHJhbnNmb3JtZWQiLgotCSAqLwotCWZpbmFsIGNsYXNzIE51bGw8UzEsIFMyPiBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPFMxLCBTMj4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8UjEsIFIyPiBUcmFuc2Zvcm1lcjxSMSwgUjI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgcmV0dXJuIHRoZSBvYmplY3QsIHVuY2hhbmdlZAotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIFMyIHRyYW5zZm9ybShTMSBvKSB7Ci0JCQlyZXR1cm4gKFMyKSBvOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUcmFuc2Zvcm1lci5OdWxsIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBICJkaXNhYmxlZCIgdHJhbnNmb3JtZXIgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBpcyBjYWxsZWQuIFRoaXMgaXMgdXNlZnVsIGluIHNpdHVhdGlvbnMKLQkgKiB3aGVyZSBhIHRyYW5zZm9ybWVyIGlzIG9wdGlvbmFsIGFuZCB0aGUgZGVmYXVsdCB0cmFuc2Zvcm1lciBzaG91bGQKLQkgKiBub3QgYmUgdXNlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTMSwgUzI+IGltcGxlbWVudHMgVHJhbnNmb3JtZXI8UzEsIFMyPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8UjEsIFIyPiBUcmFuc2Zvcm1lcjxSMSwgUjI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTMiB0cmFuc2Zvcm0oUzEgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRyYW5zZm9ybWVyLkRpc2FibGVkIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvWE1MU3RyaW5nRW5jb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmIzY2Q0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLS8qKgotICogVGhpcyBlbmNvZGVyIHdpbGwgcmVwbGFjZSBhbnkgb2YgYSBzcGVjaWZpZWQgc2V0IG9mIGNoYXJhY3RlcnMgd2l0aCBhbiBYTUwKLSAqICJjaGFyYWN0ZXIgcmVmZXJlbmNlIjogJy8nID0+ICImI3gyZjsiCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxTdHJpbmdFbmNvZGVyIHsKLQotCS8qKiBUaGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmUgY29udmVydGVkIGludG8gWE1MIGNoYXJhY3RlciByZWZlcmVuY2VzLiAqLwotCXByaXZhdGUgZmluYWwgY2hhcltdIGNoYXJzOwotCi0JLyoqIENhY2hlIHRoZSB2YWx1ZSBvZiB0aGUgaGlnaGVzdCBjaGFyYWN0ZXIgaW4gdGhlIHNldCBhYm92ZS4gKi8KLQlwcml2YXRlIGZpbmFsIGNoYXIgbWF4Q2hhcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVuY29kZXIgdGhhdCBjb252ZXJ0cyB0aGUgc3BlY2lmaWVkIHNldCBvZiBjaGFyYWN0ZXJzCi0JICogaW50byBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIFhNTFN0cmluZ0VuY29kZXIoY2hhcltdIGNoYXJzKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjaGFycyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQkvLyB0aGUgYW1wZXJzYW5kIG11c3QgYmUgaW5jbHVkZWQgc2luY2UgaXQgaXMgdGhlIGVzY2FwZSBjaGFyYWN0ZXIKLQkJaWYgKEFycmF5VG9vbHMuY29udGFpbnMoY2hhcnMsICcmJykpIHsKLQkJCXRoaXMuY2hhcnMgPSBjaGFyczsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuY2hhcnMgPSBBcnJheVRvb2xzLmFkZChjaGFycywgJyYnKTsKLQkJfQotCQl0aGlzLm1heENoYXIgPSB0aGlzLmNhbGN1bGF0ZU1heEludmFsaWRGaWxlTmFtZUNoYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlIGNvbnZlcnRlZAotCSAqIGludG8gWE1MIGNoYXJhY3RlciByZWZlcmVuY2VzLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBzaG9ydC1jaXJjdWl0IHRoZQotCSAqIHNlYXJjaCBmb3IgYSBjaGFyYWN0ZXIgaW4gdGhlIHNldC4KLQkgKiBAc2VlICNjaGFySXNUb0JlRW5jb2RlZChjaGFyKQotCSAqLwotCXByaXZhdGUgY2hhciBjYWxjdWxhdGVNYXhJbnZhbGlkRmlsZU5hbWVDaGFyKCkgewotCQljaGFyW10gbG9jYWxDaGFycyA9IHRoaXMuY2hhcnM7Ci0JCWNoYXIgbWF4ID0gMDsKLQkJZm9yIChpbnQgaSA9IGxvY2FsQ2hhcnMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWNoYXIgYyA9IGxvY2FsQ2hhcnNbaV07Ci0JCQlpZiAobWF4IDwgYykgewotCQkJCW1heCA9IGM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1heDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGFueSBjaGFyYWN0ZXJzIGluIHRoZSBzZXQKLQkgKiByZXBsYWNlZCB3aXRoIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcykgewotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJLy8gYWxsb3cgZm9yIGEgZmV3IGVuY29kZWQgY2hhcmFjdGVycwotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuICsgMjApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQl0aGlzLmFwcGVuZENoYXJhY3RlclRvKHMuY2hhckF0KGkpLCBzYik7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggYW55IFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcwotCSAqIHJlcGxhY2VkIGJ5IHRoZSBjaGFyYWN0ZXJzIHRoZW1zZWx2ZXMuCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHMubGVuZ3RoKCkpOwotCQlTdHJpbmdCdWlsZGVyIHRlbXAgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwkvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl0aGlzLmRlY29kZVRvKG5ldyBTdHJpbmdSZWFkZXIocyksIHNiLCB0ZW1wKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHRvIHRoZSBzdHJpbmcgYnVmZmVyLAotCSAqIGNvbnZlcnRpbmcgaXQgdG8gYW4gWE1MIGNoYXJhY3RlciByZWZlcmVuY2UgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRDaGFyYWN0ZXJUbyhjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHRoaXMuY2hhcklzVG9CZUVuY29kZWQoYykpIHsKLQkJCXRoaXMuYXBwZW5kQ2hhcmFjdGVyUmVmZXJlbmNlVG8oYywgc2IpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKGMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgb25lIG9mIHRoZSBjaGFyYWN0ZXJzCi0JICogdG8gYmUgY29udmVydGVkIHRvIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hhcklzVG9CZUVuY29kZWQoY2hhciBjKSB7Ci0JCXJldHVybiAoYyA8PSB0aGlzLm1heENoYXIpICYmIEFycmF5VG9vbHMuY29udGFpbnModGhpcy5jaGFycywgYyk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyJ3MgWE1MIGNoYXJhY3RlciByZWZlcmVuY2UgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIgKGUuZy4gJy8nID0+ICImI3gyZjsiKS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQ2hhcmFjdGVyUmVmZXJlbmNlVG8oY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCgiJiN4Iik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoYywgMTYpKTsKLQkJc2IuYXBwZW5kKCc7Jyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlY29kZVRvKFJlYWRlciByZWFkZXIsIFN0cmluZ0J1aWxkZXIgc2IsIFN0cmluZ0J1aWxkZXIgdGVtcCkgewotCQl0cnkgewotCQkJdGhpcy5kZWNvZGVUb18ocmVhZGVyLCBzYiwgdGVtcCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVjb2RlVG9fKFJlYWRlciByZWFkZXIsIFN0cmluZ0J1aWxkZXIgc2IsIFN0cmluZ0J1aWxkZXIgdGVtcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGMgPSByZWFkZXIucmVhZCgpOwotCQl3aGlsZSAoYyAhPSAtMSkgewotCQkJaWYgKGMgPT0gJyYnKSB7Ci0JCQkJdGhpcy5kZWNvZGVDaGFyYWN0ZXJSZWZlcmVuY2VUbyhyZWFkZXIsIHNiLCB0ZW1wKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKChjaGFyKSBjKTsKLQkJCX0KLQkJCWMgPSByZWFkZXIucmVhZCgpOwotCQl9Ci0JCXJlYWRlci5jbG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWNvZGVDaGFyYWN0ZXJSZWZlcmVuY2VUbyhSZWFkZXIgcmVhZGVyLCBTdHJpbmdCdWlsZGVyIHNiLCBTdHJpbmdCdWlsZGVyIHRlbXApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjID0gcmVhZGVyLnJlYWQoKTsKLQkJdGhpcy5jaGVja0NoYXIoYywgJyMnKTsKLQkJYyA9IHJlYWRlci5yZWFkKCk7Ci0JCXRoaXMuY2hlY2tDaGFyKGMsICd4Jyk7Ci0KLQkJdGVtcC5zZXRMZW5ndGgoMCk7ICAvLyByZS11c2UgdGVtcAotCQljID0gcmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGMgIT0gJzsnKSB7Ci0JCQl0aGlzLmNoZWNrRW5kT2ZTdHJlYW0oYyk7Ci0JCQl0ZW1wLmFwcGVuZCgoY2hhcikgYyk7Ci0JCQljID0gcmVhZGVyLnJlYWQoKTsKLQkJfQotCQlTdHJpbmcgY2hhclZhbHVlID0gdGVtcC50b1N0cmluZygpOwotCQlpZiAoY2hhclZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1pc3NpbmcgbnVtZXJpYyBzdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNiLmFwcGVuZCgoY2hhcikgSW50ZWdlci5wYXJzZUludChjaGFyVmFsdWUsIDE2KSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ2hhcihpbnQgYywgaW50IGV4cGVjdGVkKSB7Ci0JCXRoaXMuY2hlY2tFbmRPZlN0cmVhbShjKTsKLQkJaWYgKGMgIT0gZXhwZWN0ZWQpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImV4cGVjdGVkICciICsgKGNoYXIpIGV4cGVjdGVkICsgIicsIGJ1dCBlbmNvdW50ZXJlZCAnIiArIChjaGFyKSBjICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0VuZE9mU3RyZWFtKGludCBjKSB7Ci0JCWlmIChjID09IC0xKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGVuZCBvZiBzdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvZW51bWVyYXRpb25zL0VtcHR5RW51bWVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvRW1wdHlFbnVtZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjhmNWZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvRW1wdHlFbnVtZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5lbnVtZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogQW4gPGNvZGU+RW1wdHlFbnVtZXJhdGlvbjwvY29kZT4gaXMganVzdCB0aGF0LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBlbnVtZXJhdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlFbnVtZXJhdGlvbjxFPgotCWltcGxlbWVudHMgRW51bWVyYXRpb248RT4KLXsKLQotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW1wdHlFbnVtZXJhdGlvbiBJTlNUQU5DRSA9IG5ldyBFbXB0eUVudW1lcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxUPiBFbnVtZXJhdGlvbjxUPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFbXB0eUVudW1lcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBFIG5leHRFbGVtZW50KCkgewotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvZW51bWVyYXRpb25zL0l0ZXJhdG9yRW51bWVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvSXRlcmF0b3JFbnVtZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTEzZGZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvSXRlcmF0b3JFbnVtZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5lbnVtZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEFuIDxjb2RlPkl0ZXJhdG9yRW51bWVyYXRpb248L2NvZGU+IHdyYXBzIGFuCi0gKiB7QGxpbmsgSXRlcmF0b3J9IHNvIHRoYXQgaXQgY2FuIGJlIHRyZWF0ZWQgbGlrZSBhbgotICoge0BsaW5rIEVudW1lcmF0aW9ufS4KLSAqIEhvcGVmdWxseSB3ZSBkb24ndCBoYXZlIG11Y2ggbmVlZCBmb3IgdGhpcy4uLi4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgZW51bWVyYXRpb24KLSAqLwotcHVibGljIGNsYXNzIEl0ZXJhdG9yRW51bWVyYXRpb248RT4KLQlpbXBsZW1lbnRzIEVudW1lcmF0aW9uPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3I7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZW51bWVyYXRpb24gdGhhdCB3cmFwcyB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvckVudW1lcmF0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbnVtZXJhdGlvbiB0aGF0IHdyYXBzIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yRW51bWVyYXRpb24oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlJdGVyYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9BcnJheUl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTY5OTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9BcnJheUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLS8qKgotICogQW4gPGNvZGU+QXJyYXlJdGVyYWJsZTwvY29kZT4gcHJvdmlkZXMgYW4ge0BsaW5rIEl0ZXJhYmxlfQotICogZm9yIGFuIGFycmF5IG9mIG9iamVjdHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPi4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIEFycmF5SXRlcmF0b3IKLSAqIEBzZWUgQXJyYXlMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIEFycmF5SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JZmluYWwgRVtdIGFycmF5OwotCWZpbmFsIGludCBzdGFydDsKLQlmaW5hbCBpbnQgbGVuZ3RoOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqLwotCXB1YmxpYyBBcnJheUl0ZXJhYmxlKEUuLi4gYXJyYXkpIHsKLQkJdGhpcyhhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBzdGFydCBpbmRleCBhbmQgY29udGludWluZyBmb3IKLQkgKiB0aGUgcmVzdCBvZiB0aGUgYXJyYXkuCi0JICovCi0JcHVibGljIEFycmF5SXRlcmFibGUoRVtdIGFycmF5LCBpbnQgc3RhcnQpIHsKLQkJdGhpcyhhcnJheSwgc3RhcnQsIGFycmF5Lmxlbmd0aCAtIHN0YXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBzdGFydCBpbmRleCBhbmQgY29udGludWluZyBmb3IKLQkgKiB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgQXJyYXlJdGVyYWJsZShFW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlzdXBlcigpOwotCQlpZiAoKHN0YXJ0IDwgMCkgfHwgKHN0YXJ0ID4gYXJyYXkubGVuZ3RoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3RhcnQ6ICIgKyBzdGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKGxlbmd0aCA8IDApIHx8IChsZW5ndGggPiBhcnJheS5sZW5ndGggLSBzdGFydCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxlbmd0aDogIiArIGxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmFycmF5ID0gYXJyYXk7Ci0JCXRoaXMuc3RhcnQgPSBzdGFydDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8RT4odGhpcy5hcnJheSwgdGhpcy5zdGFydCwgdGhpcy5sZW5ndGgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIEFycmF5cy50b1N0cmluZyh0aGlzLmFycmF5KSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5TGlzdEl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5TGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYTdhYjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9BcnJheUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEFuIDxjb2RlPkFycmF5TGlzdEl0ZXJhYmxlPC9jb2RlPiBwcm92aWRlcyBhIHtAbGluayBMaXN0SXRlcmFibGV9Ci0gKiBmb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIEFycmF5SXRlcmFibGUKLSAqIEBzZWUgQXJyYXlMaXN0SXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEFycmF5TGlzdEl0ZXJhYmxlPEU+Ci0JZXh0ZW5kcyBBcnJheUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4KLXsKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqLwotCXB1YmxpYyBBcnJheUxpc3RJdGVyYWJsZShFLi4uIGFycmF5KSB7Ci0JCXRoaXMoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSByZXN0IG9mIHRoZSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmFibGUoRVtdIGFycmF5LCBpbnQgc3RhcnQpIHsKLQkJdGhpcyhhcnJheSwgc3RhcnQsIGFycmF5Lmxlbmd0aCAtIHN0YXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnQgaW5kZXggYW5kIGNvbnRpbnVpbmcgZm9yCi0JICogdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhYmxlKEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPEU+KHRoaXMuYXJyYXksIHRoaXMuc3RhcnQsIHRoaXMubGVuZ3RoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ2hhaW5JdGVyYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9DaGFpbkl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZDlmY2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9DaGFpbkl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DaGFpbkl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+Q2hhaW5JdGVyYWJsZTwvY29kZT4gcHJvdmlkZXMgYSBwbHVnZ2FibGUge0BsaW5rIEl0ZXJhYmxlfQotICogdGhhdCBsb29wcyBvdmVyIGEgY2hhaW4gb2YgYXJiaXRyYXJpbHkgbGlua2VkIG9iamVjdHMuIFRoZSBjaGFpbgotICogc2hvdWxkIGJlIG51bGwtdGVybWluYXRlZCAoaS5lLiBhIGNhbGwgdG8gdGhlIHtAbGluayAjbmV4dExpbmsoT2JqZWN0KX0KLSAqIG1ldGhvZCBzaG91bGQgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gaXQgaXMgcGFzc2VkIHRoZSBsYXN0Ci0gKiBsaW5rIG9mIHRoZSBjaGFpbikuCi0gKiBUbyB1c2UsIHN1cHBseSBhIHN0YXJ0aW5nIGxpbmsgYW5kIHN1cHBseSBhIHtAbGluayBDaGFpbkl0ZXJhdG9yLkxpbmtlcn0gb3IKLSAqIHN1YmNsYXNzIDxjb2RlPkNoYWluSXRlcmFibGU8L2NvZGU+IGFuZCBvdmVycmlkZSB0aGUKLSAqIHtAbGluayAjbmV4dExpbmsoT2JqZWN0KX0gbWV0aG9kLgotICogVGhlIHN0YXJ0aW5nIGxpbmsgd2lsbCBiZSB0aGUgZmlyc3Qgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yLgotICogSWYgdGhlIHN0YXJ0aW5nIGxpbmsgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSBpdGVyYWJsZSB3aWxsIGJlIGVtcHR5LgotICogTm90ZSB0aGlzIGl0ZXJhYmxlIGRvZXMgbm90IHN1cHBvcnQgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudHMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBDaGFpbkl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFpbkl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgRSBzdGFydExpbms7Ci0JcHJpdmF0ZSBmaW5hbCBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxFPiBsaW5rZXI7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnRpbmcgbGluawotCSAqIGFuZCBhIGRlZmF1bHQgbGlua2VyIHRoYXQgY2FsbHMgYmFjayB0byB0aGUgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZXh0TGluayhPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIENoYWluSXRlcmF0b3IuTGlua2VyfS4KLQkgKi8KLQlwdWJsaWMgQ2hhaW5JdGVyYWJsZShFIHN0YXJ0TGluaykgewotCQlzdXBlcigpOwotCQl0aGlzLnN0YXJ0TGluayA9IHN0YXJ0TGluazsKLQkJdGhpcy5saW5rZXIgPSB0aGlzLmJ1aWxkRGVmYXVsdExpbmtlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnRpbmcgbGluawotCSAqIGFuZCBsaW5rZXIuCi0JICovCi0JcHVibGljIENoYWluSXRlcmFibGUoRSBzdGFydExpbmssIENoYWluSXRlcmF0b3IuTGlua2VyPEU+IGxpbmtlcikgewotCQlzdXBlcigpOwotCQl0aGlzLnN0YXJ0TGluayA9IHN0YXJ0TGluazsKLQkJdGhpcy5saW5rZXIgPSBsaW5rZXI7Ci0JfQotCi0JcHJvdGVjdGVkIENoYWluSXRlcmF0b3IuTGlua2VyPEU+IGJ1aWxkRGVmYXVsdExpbmtlcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0TGlua2VyKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENoYWluSXRlcmF0b3I8RT4odGhpcy5zdGFydExpbmssIHRoaXMubGlua2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5leHQgbGluayBpbiB0aGUgY2hhaW47IG51bGwgaWYgdGhlcmUgYXJlIG5vIG1vcmUgbGlua3MuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbiBhbHRlcm5hdGl2ZSB0bwotCSAqIGJ1aWxkaW5nIGEge0BsaW5rIENoYWluSXRlcmF0b3IuTGlua2VyfS4KLQkgKi8KLQlwcm90ZWN0ZWQgRSBuZXh0TGluayhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRSBjdXJyZW50TGluaykgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zdGFydExpbmspOwotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgbGlua2VyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0TGlua2VyIGltcGxlbWVudHMgQ2hhaW5JdGVyYXRvci5MaW5rZXI8RT4gewotCQlwdWJsaWMgRSBuZXh0TGluayhFIGN1cnJlbnRMaW5rKSB7Ci0JCQlyZXR1cm4gQ2hhaW5JdGVyYWJsZS50aGlzLm5leHRMaW5rKGN1cnJlbnRMaW5rKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9DbG9uZUl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0Nsb25lSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyYWFkZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0Nsb25lSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci0KLS8qKgotICogUHVsbCB0b2dldGhlciByZW1vdmVyIHN0YXRlIGFuZCBiZWhhdmlvciBmb3Igc3ViY2xhc3Nlcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFNuYXBzaG90Q2xvbmVJdGVyYWJsZQotICogQHNlZSBMaXZlQ2xvbmVJdGVyYWJsZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xvbmVJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4KLXsKLQlmaW5hbCBDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8RT4gcmVtb3ZlcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENsb25lSXRlcmFibGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucmVtb3ZlciA9IHRoaXMuYnVpbGREZWZhdWx0UmVtb3ZlcigpOwotCX0KLQotCXByb3RlY3RlZCBDbG9uZUl0ZXJhYmxlKENsb25lSXRlcmF0b3IuUmVtb3ZlcjxFPiByZW1vdmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucmVtb3ZlciA9IHJlbW92ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIENsb25lSXRlcmF0b3IuUmVtb3ZlcjxFPiBidWlsZERlZmF1bHRSZW1vdmVyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRSZW1vdmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgcmVtb3ZhbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIENsb25lSXRlcmF0b3IuUmVtb3Zlcn0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFIGVsZW1lbnQpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgbXV0YXRvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdFJlbW92ZXIgaW1wbGVtZW50cyBDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8RT4gewotCQlwdWJsaWMgdm9pZCByZW1vdmUoRSBlbGVtZW50KSB7Ci0JCQlDbG9uZUl0ZXJhYmxlLnRoaXMucmVtb3ZlKGVsZW1lbnQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0Nsb25lTGlzdEl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0Nsb25lTGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNzQ4ZjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9DbG9uZUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogUHVsbCB0b2dldGhlciBtdXRhdG9yIHN0YXRlIGFuZCBiZWhhdmlvciBmb3Igc3ViY2xhc3Nlcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IKLSAqIAotICogQHNlZSBTbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlCi0gKiBAc2VlIExpdmVDbG9uZUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xvbmVMaXN0SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYWJsZTxFPgotewotCWZpbmFsIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8RT4gbXV0YXRvcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENsb25lTGlzdEl0ZXJhYmxlKCkgewotCQlzdXBlcigpOwotCQl0aGlzLm11dGF0b3IgPSB0aGlzLmJ1aWxkRGVmYXVsdE11dGF0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xvbmVMaXN0SXRlcmFibGUoQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxFPiBtdXRhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubXV0YXRvciA9IG11dGF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8RT4gYnVpbGREZWZhdWx0TXV0YXRvcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0TXV0YXRvcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IG11dGF0aW9ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBhZGQgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBpbmRleCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUgZWxlbWVudCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcn0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIHNldCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3J9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGluZGV4LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRSBlbGVtZW50KSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vKioqKioqKioqKiBkZWZhdWx0IG11dGF0b3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIERlZmF1bHRNdXRhdG9yIGltcGxlbWVudHMgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxFPiB7Ci0JCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQkJQ2xvbmVMaXN0SXRlcmFibGUudGhpcy5hZGQoaW5kZXgsIGVsZW1lbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCUNsb25lTGlzdEl0ZXJhYmxlLnRoaXMucmVtb3ZlKGluZGV4KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJCUNsb25lTGlzdEl0ZXJhYmxlLnRoaXMuc2V0KGluZGV4LCBlbGVtZW50KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVJdGVyYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGNkNDZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+Q29tcG9zaXRlSXRlcmFibGU8L2NvZGU+IHdyYXBzIGFuIHtAbGluayBJdGVyYWJsZX0KLSAqIG9mIHtAbGluayBJdGVyYWJsZX1zIGFuZCBtYWtlcyB0aGVtIGFwcGVhciB0byBiZSBhIHNpbmdsZQotICoge0BsaW5rIEl0ZXJhYmxlfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIENvbXBvc2l0ZUl0ZXJhdG9yCi0gKiBAc2VlIENvbXBvc2l0ZUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgSXRlcmFibGU8PyBleHRlbmRzIEU+PiBpdGVyYWJsZXM7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBJdGVyYWJsZTw/IGV4dGVuZHMgRT4+IGl0ZXJhYmxlcykgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlcyA9IGl0ZXJhYmxlczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDb21wb3NpdGVJdGVyYWJsZShFIG9iamVjdCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxFPihvYmplY3QpLCBpdGVyYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDb21wb3NpdGVJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIEUgb2JqZWN0KSB7Ci0JCXRoaXMoaXRlcmFibGUsIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPi4uLiBpdGVyYWJsZXMpIHsKLQkJdGhpcyhuZXcgQXJyYXlJdGVyYWJsZTxJdGVyYWJsZTw/IGV4dGVuZHMgRT4+KGl0ZXJhYmxlcykpOwotCX0KLQotCS8qKgotCSAqIGNvbWJpbmVkIGl0ZXJhdG9ycwotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxFPih0aGlzLml0ZXJhdG9ycygpKTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRvciBvZiBpdGVyYXRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8SXRlcmFibGU8PyBleHRlbmRzIEU+LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KHRoaXMuaXRlcmFibGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiB0cmFuc2Zvcm0oSXRlcmFibGU8PyBleHRlbmRzIEU+IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5pdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGl0ZXJhdG9yIG9mIGl0ZXJhYmxlcwotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgSXRlcmFibGU8PyBleHRlbmRzIEU+PiBpdGVyYWJsZXMoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhYmxlcy5pdGVyYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGVzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlTGlzdEl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUxpc3RJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDM4ZTM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlTGlzdEl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVMaXN0SXRlcmFibGU8L2NvZGU+IHdyYXBzIGEge0BsaW5rIExpc3RJdGVyYWJsZX0KLSAqIG9mIHtAbGluayBMaXN0SXRlcmFibGV9cyBhbmQgbWFrZXMgdGhlbSBhcHBlYXIgdG8gYmUgYSBzaW5nbGUKLSAqIHtAbGluayBMaXN0SXRlcmFibGV9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIENvbXBvc2l0ZUxpc3RJdGVyYXRvcgotICogQHNlZSBDb21wb3NpdGVJdGVyYWJsZQotICogQHNlZSBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPEU+PiBpdGVyYWJsZXM7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgbGlzdCBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYWJsZShMaXN0PExpc3RJdGVyYWJsZTxFPj4gaXRlcmFibGVzKSB7Ci0JCXRoaXMobmV3IExpc3RMaXN0SXRlcmFibGU8TGlzdEl0ZXJhYmxlPEU+PihpdGVyYWJsZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGxpc3QgaXRlcmFibGVzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBMaXN0SXRlcmFibGU8RT4+IGl0ZXJhYmxlcykgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlcyA9IGl0ZXJhYmxlczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmFibGUoRSBvYmplY3QsIExpc3Q8RT4gbGlzdCkgewotCQl0aGlzKG9iamVjdCwgbmV3IExpc3RMaXN0SXRlcmFibGU8RT4obGlzdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgaXRlcmFibGUuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYWJsZShFIG9iamVjdCwgTGlzdEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8RT4ob2JqZWN0KSwgaXRlcmFibGUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlKExpc3Q8RT4gbGlzdCwgRSBvYmplY3QpIHsKLQkJdGhpcyhuZXcgTGlzdExpc3RJdGVyYWJsZTxFPihsaXN0KSwgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgaXRlcmFibGUuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYWJsZShMaXN0SXRlcmFibGU8RT4gaXRlcmFibGUsIEUgb2JqZWN0KSB7Ci0JCXRoaXMoaXRlcmFibGUsIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlPEU+KG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3QgaXRlcmFibGVzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdEl0ZXJhYmxlPEU+Li4uIGl0ZXJhYmxlcykgewotCQl0aGlzKG5ldyBBcnJheUxpc3RJdGVyYWJsZTxMaXN0SXRlcmFibGU8RT4+KGl0ZXJhYmxlcykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3RzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdDxFPi4uLiBsaXN0cykgewotCQl0aGlzKG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTxMaXN0PEU+LCBMaXN0SXRlcmFibGU8RT4+KG5ldyBBcnJheUxpc3RJdGVyYWJsZTxMaXN0PEU+PihsaXN0cykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxFPiB0cmFuc2Zvcm0oTGlzdDxFPiBsaXN0KSB7Ci0JCQkJcmV0dXJuIG5ldyBMaXN0TGlzdEl0ZXJhYmxlPEU+KGxpc3QpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBjb21iaW5lZCBsaXN0IGl0ZXJhdG9ycwotCSAqLwotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+KHRoaXMuaXRlcmF0b3JzKCkpOwotCX0KLQotCS8qKgotCSAqIGxpc3QgaXRlcmF0b3Igb2YgbGlzdCBpdGVyYXRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8RT4+IGl0ZXJhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxMaXN0SXRlcmFibGU8RT4sIExpc3RJdGVyYXRvcjxFPj4odGhpcy5pdGVyYWJsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEU+IHRyYW5zZm9ybShMaXN0SXRlcmFibGU8RT4gbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogbGlzdCBpdGVyYXRvciBvZiBsaXN0IGl0ZXJhYmxlcwotCSAqLwotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIExpc3RJdGVyYWJsZTxFPj4gaXRlcmFibGVzKCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYWJsZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0VtcHR5SXRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDJmMzk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbXB0eUl0ZXJhYmxlPC9jb2RlPiBpcyBqdXN0IHRoYXQuCi0gKiBNYXliZSBqdXN0IGEgdG91Y2ggYmV0dGVyLXBlcmZvcm1pbmcgdGhhbiB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI0VNUFRZX1NFVH0KLSAqIHNpbmNlIHdlIGRvbid0IGNyZWF0ZSBhIG5ldyB7QGxpbmsgSXRlcmF0b3J9IGV2ZXJ5IHRpbWUge0BsaW5rICNpdGVyYXRvcigpfSBpcyBjYWxsZWQuCi0gKiAoTm90IHN1cmUgd2h5IHRoZXkgZG8gdGhhdC4uLi4pCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBFbXB0eUl0ZXJhdG9yCi0gKiBAc2VlIEVtcHR5TGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbXB0eUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPiwgU2VyaWFsaXphYmxlCi17Ci0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZSBJTlNUQU5DRSA9IG5ldyBFbXB0eUl0ZXJhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxUPiBJdGVyYWJsZTxUPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFbXB0eUl0ZXJhYmxlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUxpc3RJdGVyYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUxpc3RJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWIwNTljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlMaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbXB0eUxpc3RJdGVyYWJsZTwvY29kZT4gaXMganVzdCB0aGF0LgotICogTWF5YmUganVzdCBhIHRvdWNoIGJldHRlci1wZXJmb3JtaW5nIHRoYW4ge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNFTVBUWV9MSVNUfQotICogc2luY2Ugd2UgZG9uJ3QgY3JlYXRlIGEgbmV3IHtAbGluayBJdGVyYXRvcn0gZXZlcnkgdGltZSB7QGxpbmsgI2l0ZXJhdG9yKCl9IGlzIGNhbGxlZC4KLSAqIChOb3Qgc3VyZSB3aHkgdGhleSBkbyB0aGF0Li4uLikKLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IKLSAqIAotICogQHNlZSBFbXB0eUxpc3RJdGVyYXRvcgotICogQHNlZSBFbXB0eUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbXB0eUxpc3RJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhYmxlPEU+LCBTZXJpYWxpemFibGUKLXsKLQkvLyBzaW5nbGV0b24KLQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3RJdGVyYWJsZSBJTlNUQU5DRSA9IG5ldyBFbXB0eUxpc3RJdGVyYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8VD4gTGlzdEl0ZXJhYmxlPFQ+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtcHR5TGlzdEl0ZXJhYmxlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0ZpbHRlcmluZ0l0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0ZpbHRlcmluZ0l0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExODQxOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9GaWx0ZXJpbmdJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+RmlsdGVyaW5nSXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhYmxlfQotICogYW5kIHVzZXMgYSB7QGxpbmsgRmlsdGVyfSB0byBkZXRlcm1pbmUgd2hpY2ggZWxlbWVudHMgaW4gdGhlCi0gKiBuZXN0ZWQgaXRlcmFibGUgYXJlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yLgotICogPHA+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBGaWx0ZXJ9LCBhIHN1YmNsYXNzCi0gKiBvZiA8Y29kZT5GaWx0ZXJpbmdJdGVyYWJsZTwvY29kZT4gY2FuIG92ZXJyaWRlIHRoZQotICoge0BsaW5rICNhY2NlcHQoT2JqZWN0KX0gbWV0aG9kLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHRvIGJlIGZpbHRlcmVkCi0gKiAKLSAqIEBzZWUgRmlsdGVyaW5nSXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ0l0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlOwotCXByaXZhdGUgZmluYWwgRmlsdGVyPEU+IGZpbHRlcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBpdGVyYWJsZSBhbmQgYSBkZWZhdWx0IGZpbHRlciB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjYWNjZXB0KE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgRmlsdGVyfS4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQkJdGhpcy5maWx0ZXIgPSB0aGlzLmJ1aWxkRGVmYXVsdEZpbHRlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogaXRlcmFibGUgYW5kIGZpbHRlci4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbHRlcjxFPiBidWlsZERlZmF1bHRGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdEZpbHRlcigpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxFPih0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCksIHRoaXMuZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotCSAqIHNob3VsZCByZXR1cm4gdGhlIHNwZWNpZmllZCBuZXh0IGVsZW1lbnQgZnJvbSBhIGNhbGwgdG8gdGhlCi0JICoge0BsaW5rIEl0ZXJhdG9yI25leHQoKX0gbWV0aG9kLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBGaWx0ZXJ9LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRSBvKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBkZWZhdWx0IGZpbHRlciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdEZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcjxFPiB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChFIG8pIHsKLQkJCXJldHVybiBGaWx0ZXJpbmdJdGVyYWJsZS50aGlzLmFjY2VwdChvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9HcmFwaEl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0dyYXBoSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJiNTg0Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0dyYXBoSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkdyYXBoSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5HcmFwaEl0ZXJhYmxlPC9jb2RlPiBpcyBzaW1pbGFyIHRvIGEge0BsaW5rIFRyZWVJdGVyYWJsZX0KLSAqIGV4Y2VwdCB0aGF0IGl0IGNhbm5vdCBiZSBhc3N1bWVkIHRoYXQgYWxsIG5vZGVzIGFzc3VtZSBhIHN0cmljdCB0cmVlCi0gKiBzdHJ1Y3R1cmUuIEZvciBpbnN0YW5jZSwgaW4gYSB0cmVlLCBhIG5vZGUgY2Fubm90IGJlIGEgZGVzY2VuZGVudCBvZgotICogaXRzZWxmLCBidXQgYSBncmFwaCBtYXkgaGF2ZSBhIGN5Y2xpY2FsIHN0cnVjdHVyZS4KLSAqIAotICogQSA8Y29kZT5HcmFwaEl0ZXJhYmxlPC9jb2RlPiBzaW1wbGlmaWVzIHRoZSB0cmF2ZXJzYWwgb2YgYQotICogZ3JhcGggb2Ygb2JqZWN0cywgd2hlcmUgdGhlIG9iamVjdHMnIHByb3RvY29sKHMpIHByb3ZpZGVzCi0gKiBhIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgbmV4dCBjb2xsZWN0aW9uIG9mIG5vZGVzIGluIHRoZSBncmFwaCwKLSAqIChvciA8ZW0+bmVpZ2hib3JzPC9lbT4pLCBidXQgZG9lcyBub3QgcHJvdmlkZSBhIG1ldGhvZCBmb3IKLSAqIGdldHRpbmcgPGVtPmFsbDwvZW0+IG9mIHRoZSBub2RlcyBpbiB0aGUgZ3JhcGguCi0gKiAoZS5nLiBhIG5laWdoYm9yIGNhbiByZXR1cm4gaGlzIG5laWdoYm9ycywgYW5kIHRob3NlIG5laWdoYm9ycwotICogY2FuIHJldHVybiB0aGVpciBuZWlnaGJvcnMsIHdoaWNoIG1pZ2h0IGFsc28gaW5jbHVkZSB0aGUgb3JpZ2luYWwKLSAqIG5laWdoYm9yLCBidXQgeW91IG9ubHkgd2FudCB0byB2aXNpdCB0aGUgb3JpZ2luYWwgbmVpZ2hib3Igb25jZS4pCi0gKiA8cD4KLSAqIElmIGEgbmVpZ2hib3IgaGFzIGFscmVhZHkgYmVlbiB2aXNpdGVkIChkZXRlcm1pbmVkIGJ5IHVzaW5nIAotICoge0BsaW5rICNlcXVhbHMoT2JqZWN0KX0pLCB0aGF0IG5laWdoYm9yIGlzIG5vdCB2aXNpdGVkIGFnYWluLAotICogbm9yIGFyZSB0aGUgbmVpZ2hib3JzIG9mIHRoYXQgb2JqZWN0LgotICogPHA+Ci0gKiBJdCBpcyB1cCB0byB0aGUgdXNlciBvZiB0aGlzIGNsYXNzIHRvIGVuc3VyZSBhIDxlbT5jb21wbGV0ZTwvZW0+IGdyYXBoLgotICogPHA+Ci0gKiBUbyB1c2UsIHN1cHBseTo8dWw+Ci0gKiA8bGk+IGVpdGhlciB0aGUgaW5pdGlhbCBub2RlIG9mIHRoZSBncmFwaCBvciBhbiB7QGxpbmsgSXRlcmFibGV9Ci0gKiBvZiB0aGUgaW5pdGlhbCBjb2xsZWN0aW9uIG9mIGdyYXBoIG5vZGVzCi0gKiA8bGk+IGEge0BsaW5rIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzfSB0aGF0IHRlbGxzIHdobyB0aGUgbmVpZ2hib3JzIGFyZQotICogb2YgZWFjaCBub2RlCi0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+R3JhcGhJdGVyYWJsZTwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kKQotICogPC91bD4KLSAqIFRoZSB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9IG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGlzIGJlaGF2aW9yLCBpZiAKLSAqIGRlc2lyZWQsIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIHVzZXIgb2YgdGhpcyBjbGFzcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIEdyYXBoSXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHM7Ci0JcHJpdmF0ZSBmaW5hbCBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnM7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIGdyYXBoIHdpdGggdGhlIHNwZWNpZmllZCByb290Ci0JICogYW5kIGEgZGVmYXVsdCBNci4gUm9nZXJzIHRoYXQgY2FsbHMgYmFjayB0byB0aGUgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2Vyc30uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoRSByb290KSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxFPihyb290KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgZ3JhcGggCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoRSByb290LCBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+KHJvb3QpLCBtaXN0ZXJSb2dlcnMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIGdyYXBoIAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgZGVmYXVsdCBNci4gUm9nZXJzIHRoYXQgY2FsbHMgYmFjayB0byB0aGUgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2Vyc30uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoRS4uLiByb290cykgewotCQl0aGlzKEFycmF5cy5hc0xpc3Qocm9vdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSBncmFwaCAKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoRVtdIHJvb3RzLCBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KHJvb3RzKSwgbWlzdGVyUm9nZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSBncmFwaCAKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRlZmF1bHQgTXIuIFJvZ2VycyB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjbmVpZ2hib3JzKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnN9LgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiByb290cykgewotCQlzdXBlcigpOwotCQl0aGlzLnJvb3RzID0gcm9vdHM7Ci0JCXRoaXMubWlzdGVyUm9nZXJzID0gdGhpcy5idWlsZERlZmF1bHRNaXN0ZXJSb2dlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSBncmFwaCAKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzLCBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yb290cyA9IHJvb3RzOwotCQl0aGlzLm1pc3RlclJvZ2VycyA9IG1pc3RlclJvZ2VyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnM8RT4gYnVpbGREZWZhdWx0TWlzdGVyUm9nZXJzKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRNaXN0ZXJSb2dlcnMoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYXRvcjxFPih0aGlzLnJvb3RzLCB0aGlzLm1pc3RlclJvZ2Vycyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbW1lZGlhdGUgbmVpZ2hib3JzIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2Vyc30uCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZWlnaGJvcnMoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUgbmV4dCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5yb290cyk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogZGVmYXVsdCBNci4gUm9nZXJzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0TWlzdGVyUm9nZXJzIGltcGxlbWVudHMgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnM8RT4gewotCQlwdWJsaWMgSXRlcmF0b3I8PyBleHRlbmRzIEU+IG5laWdoYm9ycyhFIG5vZGUpIHsKLQkJCXJldHVybiBHcmFwaEl0ZXJhYmxlLnRoaXMubmVpZ2hib3JzKG5vZGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpc3RJdGVyYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRkYTgyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+TGlzdEl0ZXJhYmxlPC9jb2RlPiBzaW1wbHkgZXh0ZW5kcyB7QGxpbmsgSXRlcmFibGV9Ci0gKiB0byByZXR1cm4gYSB7QGxpbmsgTGlzdEl0ZXJhdG9yfSBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9ycwotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpc3RJdGVyYWJsZTxFPgotCWV4dGVuZHMgSXRlcmFibGU8RT4KLXsKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG92ZXIgYSBzZXQgb2YgZWxlbWVudHMgb2YgdHlwZSBFLgotCSAqLwotCUxpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXN0TGlzdEl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpc3RMaXN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5ZmFlOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpc3RMaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPkxpc3RMaXN0SXRlcmFibGU8L2NvZGU+IGFkYXB0cyBhIHtAbGluayBMaXN0fQotICogdG8gdGhlIHtAbGluayBMaXN0SXRlcmFibGV9IGludGVyZmFjZS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcnMKLSAqLwotcHVibGljIGNsYXNzIExpc3RMaXN0SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdDxFPiBsaXN0OwotCi0JcHVibGljIExpc3RMaXN0SXRlcmFibGUoTGlzdDxFPiBsaXN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdCA9IGxpc3Q7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lSXRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlZjhmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+TGl2ZUNsb25lSXRlcmFibGU8L2NvZGU+IHJldHVybnMgYW4gaXRlcmF0b3Igb24gYSBjdXJyZW50IGNvcHkgb2YgYQotICogY29sbGVjdGlvbiwgYWxsb3dpbmcgZm9yIGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLiBBCi0gKiBjb3B5IG9mIHRoZSBjb2xsZWN0aW9uIGlzIGNyZWF0ZWQgZXZlcnkgdGltZSB7QGxpbmsgI2l0ZXJhdG9yKCl9IGlzCi0gKiBjYWxsZWQuIEFzIGEgcmVzdWx0LCB0aGUgY29udGVudHMgb2YgdGhlIGNvbGxlY3Rpb24gY2FuIGJlIGRpZmZlcmVudCB3aXRoCi0gKiBlYWNoIGNhbGwgdG8ge0BsaW5rICNpdGVyYXRvcigpfSAoaS5lLiBpdCBpcyAibGl2ZSIpLgotICogPHA+Ci0gKiBUaGUgb3JpZ2luYWwgY29sbGVjdGlvbiBwYXNzZWQgdG8gdGhlIDxjb2RlPkxpdmVDbG9uZUl0ZXJhYmxlPC9jb2RlPidzCi0gKiBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdGhyZWFkLXNhZmUgKGUuZy4ge0BsaW5rIGphdmEudXRpbC5WZWN0b3J9KTsKLSAqIG90aGVyd2lzZSB5b3UgcnVuIHRoZSByaXNrIG9mIGEgY29ycnVwdGVkIGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIEJ5IGRlZmF1bHQsIHRoZSBpdGVyYXRvciByZXR1cm5lZCBieSBhIDxjb2RlPkxpdmVDbG9uZUl0ZXJhYmxlPC9jb2RlPiBkb2VzIG5vdAotICogc3VwcG9ydCB0aGUge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSBvcGVyYXRpb247IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdAotICogaGF2ZSBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uIEJ1dCBpZiB0aGUgPGNvZGU+TGl2ZUNsb25lSXRlcmFibGU8L2NvZGU+Ci0gKiBpcyBzdXBwbGllZCB3aXRoIGFuIHtAbGluayBDbG9uZUl0ZXJhdG9yLlJlbW92ZXJ9IGl0IHdpbGwgZGVsZWdhdGUgdGhlCi0gKiB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9IG9wZXJhdGlvbiB0byB0aGUgPGNvZGU+UmVtb3ZlcjwvY29kZT4uCi0gKiBBbHRlcm5hdGl2ZWx5LCBhIHN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGUgaXRlcmFibGUncyB7QGxpbmsgI3JlbW92ZShPYmplY3QpfQotICogbWV0aG9kLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgQ2xvbmVJdGVyYXRvcgotICogQHNlZSBTbmFwc2hvdENsb25lSXRlcmFibGUKLSAqIEBzZWUgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXZlQ2xvbmVJdGVyYWJsZTxFPgotCWV4dGVuZHMgQ2xvbmVJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgImxpdmUiIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogVGhlIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gb3BlcmF0aW9uIHdpbGwgbm90IGJlIHN1cHBvcnRlZAotCSAqIGJ5IHRoZSBpdGVyYXRvciByZXR1cm5lZCBieSB7QGxpbmsgI2l0ZXJhdG9yKCl9Ci0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSBpdGVyYWJsZSdzIHtAbGluayAjcmVtb3ZlKE9iamVjdCl9Ci0JICogbWV0aG9kLgotCSAqLwotCXB1YmxpYyBMaXZlQ2xvbmVJdGVyYWJsZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgImxpdmUiIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogVGhlIHNwZWNpZmllZCByZW1vdmVyIHdpbGwgYmUgdXNlZCBieSBhbnkgZ2VuZXJhdGVkIGl0ZXJhdG9ycyB0bwotCSAqIHJlbW92ZSBvYmplY3RzIGZyb20gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIExpdmVDbG9uZUl0ZXJhYmxlKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIENsb25lSXRlcmF0b3IuUmVtb3ZlcjxFPiByZW1vdmVyKSB7Ci0JCXN1cGVyKHJlbW92ZXIpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJdGVyYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxFPih0aGlzLmNvbGxlY3Rpb24sIHRoaXMucmVtb3Zlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5jb2xsZWN0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lTGlzdEl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUxpc3RJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2UzMTU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lTGlzdEl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5MaXZlQ2xvbmVMaXN0SXRlcmFibGU8L2NvZGU+IHJldHVybnMgYSBsaXN0IGl0ZXJhdG9yIG9uIGEgY3VycmVudAotICogY29weSBvZiBhIGxpc3QsIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgbGlzdC4gQQotICogY29weSBvZiB0aGUgbGlzdCBpcyBjcmVhdGVkIGV2ZXJ5IHRpbWUge0BsaW5rICNpdGVyYXRvcigpfSBpcwotICogY2FsbGVkLiBBcyBhIHJlc3VsdCwgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0IGNhbiBiZSBkaWZmZXJlbnQgd2l0aAotICogZWFjaCBjYWxsIHRvIHtAbGluayAjaXRlcmF0b3IoKX0gKGkuZS4gaXQgaXMgImxpdmUiKS4KLSAqIDxwPgotICogVGhlIG9yaWdpbmFsIGxpc3QgcGFzc2VkIHRvIHRoZSA8Y29kZT5MaXZlQ2xvbmVMaXN0SXRlcmFibGU8L2NvZGU+J3MKLSAqIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB0aHJlYWQtc2FmZSAoZS5nLiB7QGxpbmsgamF2YS51dGlsLlZlY3Rvcn0pOwotICogb3RoZXJ3aXNlIHlvdSBydW4gdGhlIHJpc2sgb2YgYSBjb3JydXB0ZWQgbGlzdC4KLSAqIDxwPgotICogQnkgZGVmYXVsdCwgdGhlIGxpc3QgaXRlcmF0b3IgcmV0dXJuZWQgYnkgYSA8Y29kZT5MaXZlQ2xvbmVMaXN0SXRlcmFibGU8L2NvZGU+Ci0gKiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBtb2RpZnkgb3BlcmF0aW9uczsgdGhpcyBpcyBiZWNhdXNlIGl0IGRvZXMgbm90Ci0gKiBoYXZlIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgbGlzdC4gQnV0IGlmIHRoZSA8Y29kZT5MaXZlQ2xvbmVMaXN0SXRlcmFibGU8L2NvZGU+Ci0gKiBpcyBzdXBwbGllZCB3aXRoIGFuIHtAbGluayBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yfSBpdCB3aWxsIGRlbGVnYXRlIHRoZQotICogbW9kaWZ5IG9wZXJhdGlvbnMgdG8gdGhlIDxjb2RlPk11dGF0b3I8L2NvZGU+LgotICogQWx0ZXJuYXRpdmVseSwgYSBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhlIGxpc3QgaXRlcmFibGUncyBtdXRhdGlvbgotICogbWV0aG9kcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IKLSAqIAotICogQHNlZSBDbG9uZUxpc3RJdGVyYXRvcgotICogQHNlZSBTbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlCi0gKiBAc2VlIExpdmVDbG9uZUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8RT4KLQlleHRlbmRzIENsb25lTGlzdEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSAibGl2ZSIgbGlzdCBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIFRoZSB7QGxpbmsgTGlzdEl0ZXJhdG9yfSBtdXRhdGlvbiBvcGVyYXRpb25zIHdpbGwgbm90IGJlIHN1cHBvcnRlZAotCSAqIGJ5IHRoZSBsaXN0IGl0ZXJhdG9yIHJldHVybmVkIGJ5IHtAbGluayAjaXRlcmF0b3IoKX0KLQkgKiB1bmxlc3MgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhlIGl0ZXJhYmxlJ3MgbXV0YXRpb24KLQkgKiBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBMaXZlQ2xvbmVMaXN0SXRlcmFibGUoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3QgPSBsaXN0OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJsaXZlIiBsaXN0IGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICogVGhlIHNwZWNpZmllZCBtdXRhdG9yIHdpbGwgYmUgdXNlZCBieSBhbnkgZ2VuZXJhdGVkIGxpc3QgaXRlcmF0b3JzIHRvCi0JICogbW9kaWZ5IHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqLwotCXB1YmxpYyBMaXZlQ2xvbmVMaXN0SXRlcmFibGUoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCwgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxFPiBtdXRhdG9yKSB7Ci0JCXN1cGVyKG11dGF0b3IpOwotCQl0aGlzLmxpc3QgPSBsaXN0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0SXRlcmFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3QsIHRoaXMubXV0YXRvcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUGVla2FibGVJdGVyYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9QZWVrYWJsZUl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OWVmZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9QZWVrYWJsZUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5QZWVrYWJsZUl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+UGVla2FibGVJdGVyYWJsZTwvY29kZT4gd3JhcHMgYW5vdGhlciB7QGxpbmsgSXRlcmFibGV9Ci0gKiBhbmQgcmV0dXJucyBhbiB7QGxpbmsgUGVla2FibGVJdGVyYXRvcn0gdGhhdCBhbGxvd3MgYQotICoge0BsaW5rIFBlZWthYmxlSXRlcmF0b3IjcGVlaygpIHBlZWt9IGF0IHRoZSBuZXh0IGVsZW1lbnQgdG8gYmUgCi0gKiByZXR1cm5lZCBieSB7QGxpbmsgSXRlcmF0b3IjbmV4dCgpfS4KLSAqIDxwPgotICogT25lLCBwb3NzaWJseSB1bmRlc2lyYWJsZSwgc2lkZS1lZmZlY3Qgb2YgdXNpbmcgdGhpcyBpdGVyYXRvciBpcyB0aGF0Ci0gKiB0aGUgbmVzdGVkIGl0ZXJhdG9yJ3MgPGNvZGU+bmV4dCgpPC9jb2RlPiBtZXRob2Qgd2lsbCBiZSBpbnZva2VkCi0gKiA8ZW0+YmVmb3JlPC9lbT4gdGhlIHBlZWthYmxlIGl0ZXJhdG9yJ3Mge0BsaW5rIEl0ZXJhdG9yI25leHQoKX0KLSAqIG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzIGlzIGJlY2F1c2UgdGhlICJuZXh0IiBlbGVtZW50IG11c3QgYmUKLSAqIHByZS1sb2FkZWQgZm9yIHRoZSB7QGxpbmsgUGVla2FibGVJdGVyYXRvciNwZWVrKCl9IG1ldGhvZC4KLSAqIFRoaXMgYWxzbyBwcmV2ZW50cyBhIHBlZWthYmxlIGl0ZXJhdG9yIGZyb20gc3VwcG9ydGluZyB0aGUgb3B0aW9uYWwKLSAqIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gbWV0aG9kLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgUGVla2FibGVJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUGVla2FibGVJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHBlZWthYmxlIGl0ZXJhYmxlIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZAotCSAqIGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBQZWVrYWJsZUl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIFBlZWthYmxlSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUGVla2FibGVJdGVyYXRvcjxFPih0aGlzLml0ZXJhYmxlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUXVldWVJdGVyYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9RdWV1ZUl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwODE5ZjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9RdWV1ZUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5RdWV1ZUl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+UXVldWVJdGVyYWJsZTwvY29kZT4gcHJvdmlkZXMgYW4ge0BsaW5rIEl0ZXJhYmxlfQotICogZm9yIGEge0BsaW5rIFF1ZXVlfSBvZiBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoZSBxdWV1ZSdzIGVsZW1lbnRzCi0gKiBhcmUge0BsaW5rIFF1ZXVlI2RlcXVldWUoKSBkZXF1ZXVlfWQiIGFzIHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yIHJldHVybnMKLSAqIHRoZW0gd2l0aCBjYWxscyB0byB7QGxpbmsgSXRlcmF0b3IjbmV4dCgpfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFF1ZXVlCi0gKiBAc2VlIFF1ZXVlSXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFF1ZXVlSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBRdWV1ZTxFPiBxdWV1ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBxdWV1ZS4KLQkgKi8KLQlwdWJsaWMgUXVldWVJdGVyYWJsZShRdWV1ZTxFPiBxdWV1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnF1ZXVlID0gcXVldWU7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFF1ZXVlSXRlcmF0b3I8RT4odGhpcy5xdWV1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5xdWV1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NGU5OTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTwvY29kZT4gd3JhcHMgYSB7QGxpbmsgTGlzdEl0ZXJhYmxlfQotICogb2Yge0BsaW5rIExpc3RJdGVyYWJsZX1zIGFuZCBtYWtlcyB0aGVtIGFwcGVhciB0byBiZSBhIHNpbmdsZQotICogcmVhZC1vbmx5IHtAbGluayBMaXN0SXRlcmFibGV9LiBBIHJlYWQtb25seSBjb21wb3NpdGUgbGlzdAotICogaXRlcmFibGUgaXMgbW9yZSBmbGV4aWJsZSB0aGFuIGEgbm9ybWFsIGNvbXBvc2l0ZSBsaXN0IGl0ZXJhYmxlIHdoZW4gaXQKLSAqIGNvbWVzIHRvIHRoZSBlbGVtZW50IHR5cGVzIG9mIHRoZSBuZXN0ZWQgbGlzdCBpdGVyYWJsZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGxpc3QgaXRlcmFibGUncyBsaXN0IGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IKLSAqIEBzZWUgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmFibGU8PyBleHRlbmRzIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4+IGl0ZXJhYmxlczsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBsaXN0IGl0ZXJhYmxlcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+PiBpdGVyYWJsZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZXMgPSBpdGVyYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYWJsZS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGUoRSBvYmplY3QsIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxFPihvYmplY3QpLCBpdGVyYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhYmxlLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZShMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBFIG9iamVjdCkgewotCQl0aGlzKGl0ZXJhYmxlLCBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxFPihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhYmxlcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPi4uLiBpdGVyYWJsZXMpIHsKLQkJdGhpcyhuZXcgQXJyYXlMaXN0SXRlcmFibGU8TGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPj4oaXRlcmFibGVzKSk7Ci0JfQotCi0JLyoqCi0JICogY29tYmluZWQgbGlzdCBpdGVyYXRvcnMKLQkgKi8KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+KHRoaXMuaXRlcmF0b3JzKCkpOwotCX0KLQotCS8qKgotCSAqIGxpc3QgaXRlcmF0b3Igb2YgbGlzdCBpdGVyYXRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8TGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4odGhpcy5pdGVyYWJsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiB0cmFuc2Zvcm0oTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuaXRlcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBsaXN0IGl0ZXJhdG9yIG9mIGxpc3QgaXRlcmFibGVzCi0JICovCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPj4gaXRlcmFibGVzKCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYWJsZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5SXRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTBhY2U3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlJlYWRPbmx5SXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhYmxlfQotICogYW5kIHJldHVybnMgYSByZWFkLW9ubHkge0BsaW5rIEl0ZXJhdG9yfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFJlYWRPbmx5SXRlcmF0b3IKLSAqIEBzZWUgUmVhZE9ubHlMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSB0aGUgcmV0dXJucyBhIHJlYWQtb25seSBpdGVyYXRvciBvbiB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5pdGVyYWJsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5TGlzdEl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5TGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNjU1MzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+UmVhZE9ubHlMaXN0SXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIExpc3RJdGVyYWJsZX0KLSAqIGFuZCByZXR1cm5zIGEgcmVhZC1vbmx5IHtAbGluayBMaXN0SXRlcmF0b3J9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIFJlYWRPbmx5TGlzdEl0ZXJhdG9yCi0gKiBAc2VlIFJlYWRPbmx5SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5TGlzdEl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbGlzdEl0ZXJhYmxlOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHRoZSByZXR1cm5zIGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYWJsZShMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdEl0ZXJhYmxlID0gaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3RJdGVyYWJsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SXRlcmFibGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50SXRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU2luZ2xlRWxlbWVudEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YjUwNGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRJdGVyYWJsZTwvY29kZT4gcmV0dXJucyBhbiB7QGxpbmsgSXRlcmF0b3J9Ci0gKiB0aGF0IGhvbGRzIGEgc2luZ2xlIGVsZW1lbnQKLSAqIGFuZCByZXR1cm5zIGl0IHdpdGggdGhlIGZpcnN0IGNhbGwgdG8ge0BsaW5rIEl0ZXJhdG9yI25leHQoKX0sIGF0Ci0gKiB3aGljaCBwb2ludCBpdCB3aWxsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gYW55IHN1YnNlcXVlbnQKLSAqIGNhbGwgdG8ge0BsaW5rIEl0ZXJhdG9yI2hhc05leHQoKX0uCi0gKiA8cD4KLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudEl0ZXJhYmxlPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIHRoZQotICoge0BsaW5rIEl0ZXJhYmxlfSByZXR1cm5lZCBieToKLSAqIAl7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3NpbmdsZXRvbihPYmplY3QpfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFNpbmdsZUVsZW1lbnRJdGVyYXRvcgotICogQHNlZSBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBFIGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgdGhhdCBjb250YWlucyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU2luZ2xlRWxlbWVudEl0ZXJhYmxlKEUgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4odGhpcy5lbGVtZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3NzRlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTwvY29kZT4gcmV0dXJucyBhIHtAbGluayBMaXN0SXRlcmF0b3J9Ci0gKiB0aGF0IGhvbGRzIGEgc2luZ2xlIGVsZW1lbnQKLSAqIGFuZCByZXR1cm5zIGl0IHdpdGggdGhlIGZpcnN0IGNhbGwgdG8ge0BsaW5rIExpc3RJdGVyYXRvciNuZXh0KCl9LCBhdAotICogd2hpY2ggcG9pbnQgaXQgd2lsbCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGFueSBzdWJzZXF1ZW50Ci0gKiBjYWxsIHRvIHtAbGluayBMaXN0SXRlcmF0b3IjaGFzTmV4dCgpfS4gTGlrZXdpc2UsIGl0IHdpbGwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotICogdG8gYSBjYWxsIHRvIHtAbGluayBMaXN0SXRlcmF0b3IjaGFzUHJldmlvdXMoKX0gdW50aWwgYSBjYWxsIHRvIHtAbGluayBMaXN0SXRlcmF0b3IjbmV4dCgpfSwKLSAqIGF0IHdoaWNoIHBvaW50IGEgY2FsbCB0byB7QGxpbmsgTGlzdEl0ZXJhdG9yI3ByZXZpb3VzKCl9IHdpbGwgcmV0dXJuIHRoZQotICogc2luZ2xlIGVsZW1lbnQuCi0gKiA8cD4KLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTwvY29kZT4gaXMgZXF1aXZhbGVudCB0byB0aGUKLSAqIHtAbGluayBJdGVyYWJsZX0gcmV0dXJuZWQgYnk6Ci0gKiAJe0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzaW5nbGV0b25MaXN0KE9iamVjdCl9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IKLSAqIEBzZWUgU2luZ2xlRWxlbWVudEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEUgZWxlbWVudDsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgdGhhdCBjb250YWlucyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZShFIGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4odGhpcy5lbGVtZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TbmFwc2hvdENsb25lSXRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYTZiODIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TbmFwc2hvdENsb25lSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5TbmFwc2hvdENsb25lSXRlcmFibGU8L2NvZGU+IHJldHVybnMgYW4gaXRlcmF0b3Igb24gYSAic25hcHNob3QiIG9mIGEKLSAqIGNvbGxlY3Rpb24sIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4gQQotICogY29weSBvZiB0aGUgY29sbGVjdGlvbiBpcyBjcmVhdGVkIHdoZW4gdGhlIGl0ZXJhYmxlIGlzIGNvbnN0cnVjdGVkLgotICogQXMgYSByZXN1bHQsIHRoZSBjb250ZW50cyBvZiB0aGUgY29sbGVjdGlvbiB3aWxsIGJlIHRoZSBzYW1lIHdpdGgKLSAqIGV2ZXJ5IGNhbGwgdG8ge0BsaW5rICNpdGVyYXRvcigpfS4KLSAqIDxwPgotICogVGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gcGFzc2VkIHRvIHRoZSA8Y29kZT5TbmFwc2hvdENsb25lSXRlcmFibGU8L2NvZGU+J3MKLSAqIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB0aHJlYWQtc2FmZSAoZS5nLiB7QGxpbmsgamF2YS51dGlsLlZlY3Rvcn0pOwotICogb3RoZXJ3aXNlIHlvdSBydW4gdGhlIHJpc2sgb2YgYSBjb3JydXB0ZWQgY29sbGVjdGlvbi4KLSAqIDxwPgotICogQnkgZGVmYXVsdCwgdGhlIGl0ZXJhdG9yIHJldHVybmVkIGJ5IGEgPGNvZGU+U25hcHNob3RDbG9uZUl0ZXJhYmxlPC9jb2RlPiBkb2VzIG5vdAotICogc3VwcG9ydCB0aGUge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSBvcGVyYXRpb247IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdAotICogaGF2ZSBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uIEJ1dCBpZiB0aGUgPGNvZGU+U25hcHNob3RDbG9uZUl0ZXJhYmxlPC9jb2RlPgotICogaXMgc3VwcGxpZWQgd2l0aCBhIHtAbGluayBDbG9uZUl0ZXJhdG9yLlJlbW92ZXJ9IGl0IHdpbGwgZGVsZWdhdGUgdGhlCi0gKiB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9IG9wZXJhdGlvbiB0byB0aGUgPGNvZGU+UmVtb3ZlcjwvY29kZT4uCi0gKiBBbHRlcm5hdGl2ZWx5LCBhIHN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGUgaXRlcmFibGUncyB7QGxpbmsgI3JlbW92ZShPYmplY3QpfQotICogbWV0aG9kLgotICogPHA+Ci0gKiBUaGlzIGl0ZXJhYmxlIGlzIHVzZWZ1bCBmb3IgbXVsdGlwbGUgcGFzc2VzIG92ZXIgYSBjb2xsZWN0aW9uIHRoYXQgc2hvdWxkIG5vdAotICogYmUgY2hhbmdlZCAoZS5nLiBieSBhbm90aGVyIHRocmVhZCkgYmV0d2VlbiBwYXNzZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBDbG9uZUl0ZXJhdG9yCi0gKiBAc2VlIExpdmVDbG9uZUl0ZXJhYmxlCi0gKiBAc2VlIFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxFPgotCWV4dGVuZHMgQ2xvbmVJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gYXJyYXk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJzbmFwc2hvdCIgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSBvcGVyYXRpb24gd2lsbCBub3QgYmUgc3VwcG9ydGVkCi0JICogYnkgdGhlIGl0ZXJhdG9yIHJldHVybmVkIGJ5IHtAbGluayAjaXRlcmF0b3IoKX0KLQkgKiB1bmxlc3MgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhlIGl0ZXJhYmxlJ3Mge0BsaW5rICNyZW1vdmUoT2JqZWN0KX0KLQkgKiBtZXRob2QuCi0JICovCi0JcHVibGljIFNuYXBzaG90Q2xvbmVJdGVyYWJsZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYXJyYXkgPSBjb2xsZWN0aW9uLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSAic25hcHNob3QiIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogVGhlIHNwZWNpZmllZCByZW1vdmVyIHdpbGwgYmUgdXNlZCBieSBhbnkgZ2VuZXJhdGVkIGl0ZXJhdG9ycyB0bwotCSAqIHJlbW92ZSBvYmplY3RzIGZyb20gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIFNuYXBzaG90Q2xvbmVJdGVyYWJsZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8RT4gcmVtb3ZlcikgewotCQlzdXBlcihyZW1vdmVyKTsKLQkJdGhpcy5hcnJheSA9IGNvbGxlY3Rpb24udG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJdGVyYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDbG9uZUl0ZXJhdG9yPEU+KHRoaXMucmVtb3ZlciwgdGhpcy5hcnJheSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgQXJyYXlzLnRvU3RyaW5nKHRoaXMuYXJyYXkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmUgaXRlcmF0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogcHJvdmlkZSBhY2Nlc3MgdG8gImludGVybmFsIiBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTG9jYWxDbG9uZUl0ZXJhdG9yPEU+IGV4dGVuZHMgQ2xvbmVJdGVyYXRvcjxFPiB7Ci0JCXByb3RlY3RlZCBMb2NhbENsb25lSXRlcmF0b3IoUmVtb3ZlcjxFPiByZW1vdmVyLCBPYmplY3RbXSBhcnJheSkgewotCQkJc3VwZXIocmVtb3ZlciwgYXJyYXkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTFjMDVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+U25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZTwvY29kZT4gcmV0dXJucyBhIGxpc3QgaXRlcmF0b3Igb24gYQotICogInNuYXBzaG90IiBvZiBhIGxpc3QsIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgbGlzdC4KLSAqIEEgY29weSBvZiB0aGUgbGlzdCBpcyBjcmVhdGVkIHdoZW4gdGhlIGxpc3QgaXRlcmFibGUgaXMgY29uc3RydWN0ZWQuCi0gKiBBcyBhIHJlc3VsdCwgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0IHdpbGwgYmUgdGhlIHNhbWUgd2l0aAotICogZXZlcnkgY2FsbCB0byB7QGxpbmsgI2l0ZXJhdG9yKCl9LCBldmVuIGlmIHRoZSBvcmlnaW5hbCBsaXN0IGlzIG1vZGlmaWVkIHZpYQotICogdGhlIGxpc3QgaXRlcmF0b3IncyBtdXRhdGlvbiBtZXRob2RzLgotICogPHA+Ci0gKiBUaGUgb3JpZ2luYWwgbGlzdCBwYXNzZWQgdG8gdGhlIDxjb2RlPlNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGU8L2NvZGU+J3MKLSAqIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB0aHJlYWQtc2FmZSAoZS5nLiB7QGxpbmsgamF2YS51dGlsLlZlY3Rvcn0pOwotICogb3RoZXJ3aXNlIHlvdSBydW4gdGhlIHJpc2sgb2YgYSBjb3JydXB0ZWQgbGlzdC4KLSAqIDxwPgotICogQnkgZGVmYXVsdCwgdGhlIGxpc3QgaXRlcmF0b3IgcmV0dXJuZWQgYnkgYSA8Y29kZT5TbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlPC9jb2RlPiBkb2VzIG5vdAotICogc3VwcG9ydCB0aGUge0BsaW5rIExpc3RJdGVyYXRvcn0gbXV0YXRpb24gb3BlcmF0aW9uczsgdGhpcyBpcyBiZWNhdXNlIGl0IGRvZXMgbm90Ci0gKiBoYXZlIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgbGlzdC4gQnV0IGlmIHRoZSA8Y29kZT5TbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlPC9jb2RlPgotICogaXMgc3VwcGxpZWQgd2l0aCBhIHtAbGluayBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yfSBpdCB3aWxsIGRlbGVnYXRlIHRoZQotICoge0BsaW5rIExpc3RJdGVyYXRvcn0gbXV0YXRpb24gb3BlcmF0aW9ucyB0byB0aGUgPGNvZGU+TXV0YXRvcjwvY29kZT4uCi0gKiBBbHRlcm5hdGl2ZWx5LCBhIHN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGUgbGlzdCBpdGVyYWJsZSdzIG11dGF0aW9uCi0gKiBtZXRob2RzLgotICogPHA+Ci0gKiBUaGlzIGxpc3QgaXRlcmFibGUgaXMgdXNlZnVsIGZvciBtdWx0aXBsZSBwYXNzZXMgb3ZlciBhIGxpc3QgdGhhdCBzaG91bGQgbm90Ci0gKiBiZSBjaGFuZ2VkIChlLmcuIGJ5IGFub3RoZXIgdGhyZWFkKSBiZXR3ZWVuIHBhc3Nlcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IKLSAqIAotICogQHNlZSBDbG9uZUxpc3RJdGVyYXRvcgotICogQHNlZSBMaXZlQ2xvbmVMaXN0SXRlcmFibGUKLSAqIEBzZWUgU25hcHNob3RDbG9uZUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlPEU+Ci0JZXh0ZW5kcyBDbG9uZUxpc3RJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gYXJyYXk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJzbmFwc2hvdCIgbGlzdCBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIFRoZSB7QGxpbmsgTGlzdEl0ZXJhdG9yfSBtb2RpZnkgb3BlcmF0aW9ucyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKiBieSB0aGUgbGlzdCBpdGVyYXRvciByZXR1cm5lZCBieSB7QGxpbmsgI2l0ZXJhdG9yKCl9Ci0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbW9kaWZ5Ci0JICogbWV0aG9kLgotCSAqLwotCXB1YmxpYyBTbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hcnJheSA9IGxpc3QudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJzbmFwc2hvdCIgbGlzdCBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIFRoZSBzcGVjaWZpZWQgbXV0YXRvciB3aWxsIGJlIHVzZWQgYnkgYW55IGdlbmVyYXRlZCBsaXN0IGl0ZXJhdG9ycyB0bwotCSAqIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZShMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0LCBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yPEU+IG11dGF0b3IpIHsKLQkJc3VwZXIobXV0YXRvcik7Ci0JCXRoaXMuYXJyYXkgPSBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdEl0ZXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDbG9uZUxpc3RJdGVyYXRvcjxFPih0aGlzLm11dGF0b3IsIHRoaXMuYXJyYXkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIEFycmF5cy50b1N0cmluZyh0aGlzLmFycmF5KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25lIGl0ZXJhdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIHByb3ZpZGUgYWNjZXNzIHRvICJpbnRlcm5hbCIgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIExvY2FsQ2xvbmVMaXN0SXRlcmF0b3I8RT4gZXh0ZW5kcyBDbG9uZUxpc3RJdGVyYXRvcjxFPiB7Ci0JCXByb3RlY3RlZCBMb2NhbENsb25lTGlzdEl0ZXJhdG9yKE11dGF0b3I8RT4gbXV0YXRvciwgT2JqZWN0W10gYXJyYXkpIHsKLQkJCXN1cGVyKG11dGF0b3IsIGFycmF5KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdGFja0l0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N0YWNrSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxNDc0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N0YWNrSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlN0YWNrSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5TdGFja0l0ZXJhYmxlPC9jb2RlPiBwcm92aWRlcyBhbiB7QGxpbmsgSXRlcmFibGV9Ci0gKiBmb3IgYSB7QGxpbmsgU3RhY2t9IG9mIG9iamVjdHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPi4gVGhlIHN0YWNrJ3MgZWxlbWVudHMKLSAqIGFyZSB7QGxpbmsgU3RhY2sjcG9wKCkgInBvcHBlZCJ9IGFzIHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yIHJldHVybnMKLSAqIHRoZW0gd2l0aCBjYWxscyB0byB7QGxpbmsgSXRlcmF0b3IjbmV4dCgpfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFN0YWNrCi0gKiBAc2VlIFN0YWNrSXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFN0YWNrSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBTdGFjazxFPiBzdGFjazsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBzdGFjay4KLQkgKi8KLQlwdWJsaWMgU3RhY2tJdGVyYWJsZShTdGFjazxFPiBzdGFjaykgewotCQlzdXBlcigpOwotCQl0aGlzLnN0YWNrID0gc3RhY2s7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFN0YWNrSXRlcmF0b3I8RT4odGhpcy5zdGFjayk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zdGFjayk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N1Ykl0ZXJhYmxlV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdWJJdGVyYWJsZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU5MWQ0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N1Ykl0ZXJhYmxlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3ViSXRlcmF0b3JXcmFwcGVyOwotCi0vKioKLSAqIFdyYXAgYW4gaXRlcmFibGUgb2YgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMTwvY29kZT4sIGNvbnZlcnRpbmcgaXQgaW50byBhbgotICogaXRlcmFibGUgb2YgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIEFzc3VtZSB0aGUgd3JhcHBlZCBpdGVyYWJsZQotICogY29udGFpbnMgb25seSBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4KLSAqIAotICogQHBhcmFtIDxFMT4gaW5wdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBieSB0aGUgd3JhcHBlZCBpdGVyYWJsZQotICogQHBhcmFtIDxFMj4gb3V0cHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TdWJJdGVyYXRvcldyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFN1Ykl0ZXJhYmxlV3JhcHBlcjxFMSwgRTI+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPEUxPiBpdGVyYWJsZTsKLQotCi0JcHVibGljIFN1Ykl0ZXJhYmxlV3JhcHBlcihJdGVyYWJsZTxFMT4gaXRlcmFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU3ViSXRlcmF0b3JXcmFwcGVyPEUxLCBFMj4odGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3ViTGlzdEl0ZXJhYmxlV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdWJMaXN0SXRlcmFibGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MDMzMjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdWJMaXN0SXRlcmFibGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3ViTGlzdEl0ZXJhdG9yV3JhcHBlcjsKLQotLyoqCi0gKiBXcmFwIGEgbGlzdCBpdGVyYWJsZSBvZiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvCi0gKiBhIGxpc3QgaXRlcmFibGUgb2YgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIEFzc3VtZSB0aGUgd3JhcHBlZAotICogaXRlcmFibGUgY29udGFpbnMgb25seSBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4KLSAqIAotICogQHBhcmFtIDxFMT4gaW5wdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBieSB0aGUgd3JhcHBlZCBsaXN0IGl0ZXJhYmxlCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3ViTGlzdEl0ZXJhdG9yV3JhcHBlcgotICovCi1wdWJsaWMgY2xhc3MgU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjxFMSwgRTI+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RTI+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmFibGU8RTE+IGl0ZXJhYmxlOwotCi0KLQlwdWJsaWMgU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcihMaXN0PEUxPiBsaXN0KSB7Ci0JCXRoaXMobmV3IExpc3RMaXN0SXRlcmFibGU8RTE+KGxpc3QpKTsKLQl9Ci0KLQlwdWJsaWMgU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcihMaXN0SXRlcmFibGU8RTE+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmF0b3JXcmFwcGVyPEUxLCBFMj4odGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3VwZXJJdGVyYWJsZVdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3VwZXJJdGVyYWJsZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYxZTA2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N1cGVySXRlcmFibGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFdyYXAgYW4gaXRlcmFibGUgb2YgZWxlbWVudHMgb2YgYW55IHN1Yi10eXBlIG9mIDxjb2RlPkU8L2NvZGU+LCBjb252ZXJ0aW5nIGl0IGludG8gYW4KLSAqIGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSBzaW5jZSB0aGVyZQotICogaXMgbm8gd2F5IHRvIGFkZCBpbnZhbGlkIGVsZW1lbnRzIHRvIHRoZSBpdGVyYWJsZS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TdXBlckl0ZXJhdG9yV3JhcHBlcgotICovCi1wdWJsaWMgY2xhc3MgU3VwZXJJdGVyYWJsZVdyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxFPiBpdGVyYWJsZTsKLQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFN1cGVySXRlcmFibGVXcmFwcGVyKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlzdXBlcigpOwotCQkvLyB0aGlzIHNob3VsZCBiZSBhIHNhZmUgY2FzdCAtIHRoZSBpdGVyYXRvciB3aWxsIG9ubHkgZXZlcgotCQkvLyByZXR1cm4gRSAob3IgYSBzdWItdHlwZSkgZnJvbSAjbmV4dCgpCi0JCXRoaXMuaXRlcmFibGUgPSAoSXRlcmFibGU8RT4pIGl0ZXJhYmxlOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjQ0YjE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3VwZXJMaXN0SXRlcmF0b3JXcmFwcGVyOwotCi0vKioKLSAqIFdyYXAgYSBsaXN0IGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIGFueSBzdWItdHlwZSBvZiA8Y29kZT5FPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvIGEKLSAqIGxpc3QgaXRlcmFibGUgb2YgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPi4gVGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtIHNpbmNlIHRoZQotICogcmVzdWx0aW5nIGxpc3QgaXRlcmFibGUncyBsaXN0IGl0ZXJhdG9yIGRpc2FibGVzIHRoZSBtZXRob2RzIHRoYXQgd291bGQgcHV0IGludmFsaWQgZWxlbWVudHMKLSAqIGluIHRoZSBsaXN0IGl0ZXJhdG9yJ3MgYmFja2luZyBsaXN0IChpLmUuIHtAbGluayAjc2V0KEUpfSBhbmQge0BsaW5rICNhZGQoRSl9KS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcnMKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3VwZXJMaXN0SXRlcmF0b3JXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZTsKLQotCi0JcHVibGljIDxUIGV4dGVuZHMgRT4gU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyKExpc3Q8VD4gbGlzdCkgewotCQl0aGlzKG5ldyBMaXN0TGlzdEl0ZXJhYmxlPFQ+KGxpc3QpKTsKLQl9Ci0KLQlwdWJsaWMgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmF0b3JXcmFwcGVyPEU+KHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1RyYW5zZm9ybWF0aW9uSXRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25JdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWQ0MmIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25JdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhYmxlfQotICogYW5kIHRyYW5zZm9ybXMgaXRzIGVsZW1lbnRzIGZvciBjbGllbnQgY29uc3VtcHRpb24uIFRvIHVzZSwgc3VwcGx5IGEgCi0gKiB7QGxpbmsgVHJhbnNmb3JtZXJ9IG9yIHN1YmNsYXNzIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmFibGU8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZC4KLSAqIE9iamVjdHMgb2YgdHlwZSA8Y29kZT5FMTwvY29kZT4gYXJlIHRyYW5zZm9ybWVkIGludG8gb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPjsKLSAqIGkuZS4gdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IgcmV0dXJucyBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgdHJhbnNmb3JtZWQKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yCi0gKiBAc2VlIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEUxLCBFMj4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEUyPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEUxPiBpdGVyYWJsZTsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYWJsZQotCSAqIGFuZCBhIGRlZmF1bHQgdHJhbnNmb3JtZXIgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRoaXMuYnVpbGREZWZhdWx0VHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYWJsZQotCSAqIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gYnVpbGREZWZhdWx0VHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEUxLCBFMj4odGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpLCB0aGlzLnRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm0oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUxIG8pIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgbGlua2VyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxFMSwgRTI+IHsKLQkJcHVibGljIEUyIHRyYW5zZm9ybShFMSBvKSB7Ci0JCQlyZXR1cm4gVHJhbnNmb3JtYXRpb25JdGVyYWJsZS50aGlzLnRyYW5zZm9ybShvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmQyNzE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTwvY29kZT4gd3JhcHMgYW5vdGhlciB7QGxpbmsgTGlzdEl0ZXJhYmxlfQotICogYW5kIHRyYW5zZm9ybXMgaXRzIGVsZW1lbnRzIGZvciBjbGllbnQgY29uc3VtcHRpb24uIFRvIHVzZSwgc3VwcGx5IGEgCi0gKiB7QGxpbmsgVHJhbnNmb3JtZXJ9IG9yIHN1YmNsYXNzIDxjb2RlPlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlPC9jb2RlPgotICogYW5kIG92ZXJyaWRlIHRoZSB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBtZXRob2QuCi0gKiBPYmplY3RzIG9mIHR5cGUgPGNvZGU+RTE8L2NvZGU+IGFyZSB0cmFuc2Zvcm1lZCBpbnRvIG9iamVjdHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT47Ci0gKiBpLmUuIHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvciByZXR1cm5zIG9iamVjdHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uCi0gKiAKLSAqIEBwYXJhbSA8RTE+IGlucHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyB0byBiZSB0cmFuc2Zvcm1lZAotICogQHBhcmFtIDxFMj4gb3V0cHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yCi0gKiBAc2VlIFRyYW5zZm9ybWF0aW9uSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlPEUxLCBFMj4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYWJsZTxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlOwotCXByaXZhdGUgZmluYWwgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gdHJhbnNmb3JtZXI7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBsaXN0Ci0JICogYW5kIGEgZGVmYXVsdCB0cmFuc2Zvcm1lciB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGxpc3QgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlKExpc3Q8RTE+IGxpc3QpIHsKLQkJdGhpcyhuZXcgTGlzdExpc3RJdGVyYWJsZTxFMT4obGlzdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBsaXN0IGl0ZXJhYmxlCi0JICogYW5kIGEgZGVmYXVsdCB0cmFuc2Zvcm1lciB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGxpc3QgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRoaXMuYnVpbGREZWZhdWx0VHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgbGlzdAotCSAqIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUoTGlzdDxFMT4gbGlzdCwgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgTGlzdExpc3RJdGVyYWJsZTxFMT4obGlzdCksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgbGlzdCBpdGVyYWJsZQotCSAqIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gaXRlcmFibGUsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiBidWlsZERlZmF1bHRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0VHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxFMSwgRTI+KHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKSwgdGhpcy50cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgRTIgdHJhbnNmb3JtKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFMSBvKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBkZWZhdWx0IGxpbmtlciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdFRyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXI8RTEsIEUyPiB7Ci0JCXB1YmxpYyBFMiB0cmFuc2Zvcm0oRTEgbykgewotCQkJcmV0dXJuIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlLnRoaXMudHJhbnNmb3JtKG8pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1RyZWVJdGVyYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9UcmVlSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyMjdjZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1RyZWVJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJlZUl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+VHJlZUl0ZXJhYmxlPC9jb2RlPiBzaW1wbGlmaWVzIHRoZSB0cmF2ZXJzYWwgb2YgYQotICogdHJlZSBvZiBvYmplY3RzLCB3aGVyZSB0aGUgb2JqZWN0cycgcHJvdG9jb2wocykgcHJvdmlkZXMKLSAqIGEgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuCi0gKiBub2RlIGJ1dCBkb2VzIG5vdCBwcm92aWRlIGEgbWV0aG9kIGZvciBnZXR0aW5nIGFsbCB0aGUKLSAqIGRlc2NlbmRhbnRzIChjaGlsZHJlbiwgZ3JhbmRjaGlsZHJlbiwgZXRjLikgb2YgdGhlIGdpdmVuIG5vZGUuCi0gKiA8cD4KLSAqIFRvIHVzZSwgc3VwcGx5Ojx1bD4KLSAqIDxsaT4gZWl0aGVyIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIHRyZWUgb3IsIGlmIHRoZSB0cmVlIGhhcwotICogbXVsdGlwbGUgcm9vdHMsIGFuIHtAbGluayBJdGVyYWJsZX0gb2YgdGhlIHNldCBvZiByb290cwotICogPGxpPiBhIHtAbGluayBUcmVlSXRlcmF0b3IuTWlkd2lmZX0gdGhhdCBkZWxpdmVycyB0aGUgY2hpbGRyZW4gb2YgZWFjaCBjaGlsZAotICogKGFsdGVybmF0aXZlbHksIHN1YmNsYXNzIDxjb2RlPlRyZWVJdGVyYWJsZTwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICNjaGlsZHJlbihPYmplY3QpfSBtZXRob2QpCi0gKiA8L3VsPgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgVHJlZUl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHM7Ci0JcHJpdmF0ZSBmaW5hbCBUcmVlSXRlcmF0b3IuTWlkd2lmZTxFPiBtaWR3aWZlOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSB0cmVlIHdpdGggdGhlIHNwZWNpZmllZCByb290Ci0JICogYW5kIGEgZGVmYXVsdCBtaWR3aWZlIHRoYXQgY2FsbHMgYmFjayB0byB0aGUgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNjaGlsZHJlbihPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIFRyZWVJdGVyYXRvci5NaWR3aWZlfS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhYmxlKEUgcm9vdCkgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RT4ocm9vdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIHRyZWUgd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QKLQkgKiBhbmQgbWlkd2lmZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhYmxlKEUgcm9vdCwgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RT4ocm9vdCksIG1pZHdpZmUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIHRyZWUgd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3RzCi0JICogYW5kIGEgZGVmYXVsdCBtaWR3aWZlIHRoYXQgY2FsbHMgYmFjayB0byB0aGUgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNjaGlsZHJlbihPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIFRyZWVJdGVyYXRvci5NaWR3aWZlfS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhYmxlKEUuLi4gcm9vdHMpIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KHJvb3RzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgdHJlZSB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMKLQkgKiBhbmQgbWlkd2lmZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhYmxlKEVbXSByb290cywgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQl0aGlzKEFycmF5cy5hc0xpc3Qocm9vdHMpLCBtaWR3aWZlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSB0cmVlIHdpdGggdGhlIHNwZWNpZmllZCByb290cwotCSAqIGFuZCBhIGRlZmF1bHQgbWlkd2lmZSB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmVlSXRlcmF0b3IuTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yb290cyA9IHJvb3RzOwotCQl0aGlzLm1pZHdpZmUgPSB0aGlzLmJ1aWxkRGVmYXVsdE1pZHdpZmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSB0cmVlIHdpdGggdGhlIHNwZWNpZmllZCByb290cwotCSAqIGFuZCBtaWR3aWZlLgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzLCBUcmVlSXRlcmF0b3IuTWlkd2lmZTxFPiBtaWR3aWZlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucm9vdHMgPSByb290czsKLQkJdGhpcy5taWR3aWZlID0gbWlkd2lmZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8RT4gYnVpbGREZWZhdWx0TWlkd2lmZSgpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0TWlkd2lmZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3I8RT4odGhpcy5yb290cywgdGhpcy5taWR3aWZlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgVHJlZUl0ZXJhdG9yLk1pZHdpZmV9LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY2hpbGRyZW4oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUgbmV4dCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5yb290cyk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogZGVmYXVsdCBtaWR3aWZlICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0TWlkd2lmZSBpbXBsZW1lbnRzIFRyZWVJdGVyYXRvci5NaWR3aWZlPEU+IHsKLQkJcHVibGljIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBjaGlsZHJlbihFIG5vZGUpIHsKLQkJCXJldHVybiBUcmVlSXRlcmFibGUudGhpcy5jaGlsZHJlbihub2RlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM5NmEzYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5BcnJheUl0ZXJhdG9yPC9jb2RlPiBwcm92aWRlcyBhbiB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBmb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCWZpbmFsIEVbXSBhcnJheTsJLy8gcHJpdmF0ZS1wcm90ZWN0ZWQKLQlpbnQgY3Vyc29yOwkJLy8gcHJpdmF0ZS1wcm90ZWN0ZWQKLQlwcml2YXRlIGZpbmFsIGludCBtYXg7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlJdGVyYXRvcihFLi4uIGFycmF5KSB7Ci0JCXRoaXMoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnQgaW5kZXggYW5kIGNvbnRpbnVpbmcgZm9yCi0JICogdGhlIHJlc3Qgb2YgdGhlIGFycmF5LgotCSAqLwotCXB1YmxpYyBBcnJheUl0ZXJhdG9yKEVbXSBhcnJheSwgaW50IHN0YXJ0KSB7Ci0JCXRoaXMoYXJyYXksIHN0YXJ0LCBhcnJheS5sZW5ndGggLSBzdGFydCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnQgaW5kZXggYW5kIGNvbnRpbnVpbmcgZm9yCi0JICogdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHVibGljIEFycmF5SXRlcmF0b3IoRVtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChzdGFydCA8IDApIHx8IChzdGFydCA+IGFycmF5Lmxlbmd0aCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXJ0OiAiICsgc3RhcnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKChsZW5ndGggPCAwKSB8fCAobGVuZ3RoID4gYXJyYXkubGVuZ3RoIC0gc3RhcnQpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsZW5ndGg6ICIgKyBsZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5hcnJheSA9IGFycmF5OwotCQl0aGlzLmN1cnNvciA9IHN0YXJ0OwotCQl0aGlzLm1heCA9IHN0YXJ0ICsgbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLmN1cnNvciAhPSB0aGlzLm1heDsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiB0aGlzLmFycmF5W3RoaXMuY3Vyc29yKytdOwotCQl9Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBBcnJheXMudG9TdHJpbmcodGhpcy5hcnJheSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUxpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVhZmE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbiA8Y29kZT5BcnJheUxpc3RJdGVyYXRvcjwvY29kZT4gcHJvdmlkZXMgYSB7QGxpbmsgTGlzdEl0ZXJhdG9yfQotICogZm9yIGFuIGFycmF5IG9mIG9iamVjdHMuCi0gKiA8cD4KLSAqIFRoZSBuYW1lIG1pZ2h0IGJlIGEgYml0IGNvbmZ1c2luZzoKLSAqIFRoaXMgaXMgYSB7QGxpbmsgTGlzdEl0ZXJhdG9yfSBmb3IgYW4gPGNvZGU+QXJyYXk8L2NvZGU+OwotICogPGVtPm5vdDwvZW0+IGFuIHtAbGluayBJdGVyYXRvcn0gZm9yIGEge0BsaW5rIGphdmEudXRpbC5BcnJheUxpc3R9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlMaXN0SXRlcmF0b3I8RT4KLQlleHRlbmRzIEFycmF5SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgaW50IG1pbjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmF0b3IoRS4uLiBhcnJheSkgewotCQl0aGlzKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnQgaW5kZXggYW5kIGNvbnRpbnVpbmcgZm9yCi0JICogdGhlIHJlc3Qgb2YgdGhlIGFycmF5LgotCSAqLwotCXB1YmxpYyBBcnJheUxpc3RJdGVyYXRvcihFW10gYXJyYXksIGludCBzdGFydCkgewotCQl0aGlzKGFycmF5LCBzdGFydCwgYXJyYXkubGVuZ3RoIC0gc3RhcnQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBzdGFydCBpbmRleCBhbmQgY29udGludWluZyBmb3IKLQkgKiB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmF0b3IoRVtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoYXJyYXksIHN0YXJ0LCBsZW5ndGgpOwotCQl0aGlzLm1pbiA9IHN0YXJ0OwotCX0KLQkKLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuY3Vyc29yOwotCX0KLQkKLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmN1cnNvciAtIDE7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQlyZXR1cm4gdGhpcy5jdXJzb3IgIT0gdGhpcy5taW47Ci0JfQotCQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQlpZiAodGhpcy5oYXNQcmV2aW91cygpKSB7Ci0JCQlyZXR1cm4gdGhpcy5hcnJheVstLXRoaXMuY3Vyc29yXTsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2hhaW5JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDU0ODE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2hhaW5JdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+Q2hhaW5JdGVyYXRvcjwvY29kZT4gcHJvdmlkZXMgYSBwbHVnZ2FibGUge0BsaW5rIEl0ZXJhdG9yfQotICogdGhhdCBsb29wcyBvdmVyIGEgY2hhaW4gb2YgYXJiaXRyYXJpbHkgbGlua2VkIG9iamVjdHMuIFRoZSBjaGFpbgotICogc2hvdWxkIGJlIG51bGwtdGVybWluYXRlZCAoaS5lLiBhIGNhbGwgdG8gdGhlIHtAbGluayAjbmV4dExpbmsoT2JqZWN0KX0KLSAqIG1ldGhvZCBzaG91bGQgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gaXQgaXMgcGFzc2VkIHRoZSBsYXN0Ci0gKiBsaW5rIG9mIHRoZSBjaGFpbikuCi0gKiBUbyB1c2UsIHN1cHBseSBhIHN0YXJ0aW5nIGxpbmsgYW5kIHN1cHBseSBhIHtAbGluayBMaW5rZXJ9IG9yIAotICogc3ViY2xhc3MgPGNvZGU+Q2hhaW5JdGVyYXRvcjwvY29kZT4gYW5kIG92ZXJyaWRlIHRoZQotICoge0BsaW5rICNuZXh0TGluayhPYmplY3QpfSBtZXRob2QuCi0gKiBUaGUgc3RhcnRpbmcgbGluayB3aWxsIGJlIHRoZSBmaXJzdCBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yLgotICogSWYgdGhlIHN0YXJ0aW5nIGxpbmsgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSBpdGVyYXRvciB3aWxsIGJlIGVtcHR5LgotICogTm90ZSB0aGlzIGl0ZXJhdG9yIGRvZXMgbm90IHN1cHBvcnQgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudHMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNoYWluSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIENoYWluSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBFIG5leHRMaW5rOwotCXByaXZhdGUgZmluYWwgTGlua2VyPEU+IGxpbmtlcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBzdGFydGluZyBsaW5rCi0JICogYW5kIGEgZGlzYWJsZWQgbGlua2VyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjbmV4dExpbmsoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBMaW5rZXJ9LgotCSAqLwotCXB1YmxpYyBDaGFpbkl0ZXJhdG9yKEUgc3RhcnRMaW5rKSB7Ci0JCXRoaXMoc3RhcnRMaW5rLCBMaW5rZXIuRGlzYWJsZWQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBzdGFydGluZyBsaW5rCi0JICogYW5kIGxpbmtlci4KLQkgKi8KLQlwdWJsaWMgQ2hhaW5JdGVyYXRvcihFIHN0YXJ0TGluaywgTGlua2VyPEU+IGxpbmtlcikgewotCQlzdXBlcigpOwotCQl0aGlzLm5leHRMaW5rID0gc3RhcnRMaW5rOwotCQl0aGlzLmxpbmtlciA9IGxpbmtlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5uZXh0TGluayAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLm5leHRMaW5rID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRSByZXN1bHQgPSB0aGlzLm5leHRMaW5rOwotCQl0aGlzLm5leHRMaW5rID0gdGhpcy5uZXh0TGluayh0aGlzLm5leHRMaW5rKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmV4dCBsaW5rIGluIHRoZSBjaGFpbjsgbnVsbCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBsaW5rcy4KLQkgKi8KLQlwcm90ZWN0ZWQgRSBuZXh0TGluayhFIGN1cnJlbnRMaW5rKSB7Ci0JCXJldHVybiB0aGlzLmxpbmtlci5uZXh0TGluayhjdXJyZW50TGluayk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5uZXh0TGluayk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogbWVtYmVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2VkIGJ5IHtAbGluayBDaGFpbkl0ZXJhdG9yfSB0byBsaW5rCi0JICogdGhlIGVsZW1lbnRzIGluIHRoZSBjaGFpbi4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpbmtlcjxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmV4dCBsaW5rIGluIHRoZSBjaGFpbjsgbnVsbCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBsaW5rcy4KLQkJICovCi0JCVQgbmV4dExpbmsoVCBjdXJyZW50TGluayk7Ci0KLQotCQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgTGlua2VyPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIExpbmtlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IExpbmtlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIE51bGwoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHNpbXBseSByZXR1cm4gbnVsbCwgaW5kaWNhdGluZyB0aGUgY2hhaW4gaXMgZW5kZWQKLQkJCXB1YmxpYyBTIG5leHRMaW5rKFMgY3VycmVudExpbmspIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkNoYWluSXRlcmF0b3IuTGlua2VyLk51bGwiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQl9Ci0KLQkJZmluYWwgY2xhc3MgRGlzYWJsZWQ8Uz4gaW1wbGVtZW50cyBMaW5rZXI8Uz4gewotCQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlua2VyIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IExpbmtlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJCXB1YmxpYyBTIG5leHRMaW5rKFMgY3VycmVudExpbmspIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgIC8vIENoYWluSXRlcmF0b3IubmV4dExpbmsoT2JqZWN0KSB3YXMgbm90IGltcGxlbWVudGVkCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJDaGFpbkl0ZXJhdG9yLkxpbmtlci5EaXNhYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkZDlmMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkNsb25lSXRlcmF0b3I8L2NvZGU+IGl0ZXJhdGVzIG92ZXIgYSBjb3B5IG9mIGEgY29sbGVjdGlvbiwKLSAqIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLSAqIDxwPgotICogVGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gcGFzc2VkIHRvIHRoZSA8Y29kZT5DbG9uZUl0ZXJhdG9yPC9jb2RlPidzCi0gKiBjb25zdHJ1Y3RvciBzaG91bGQgYmUgc3luY2hyb25pemVkIChlLmcuIHtAbGluayBqYXZhLnV0aWwuVmVjdG9yfSk7Ci0gKiBvdGhlcndpc2UgeW91IHJ1biB0aGUgcmlzayBvZiBhIGNvcnJ1cHRlZCBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCBhIDxjb2RlPkNsb25lSXRlcmF0b3I8L2NvZGU+IGRvZXMgbm90IHN1cHBvcnQgdGhlCi0gKiB7QGxpbmsgI3JlbW92ZSgpfSBvcGVyYXRpb247IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlCi0gKiBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uIEJ1dCBpZiB0aGUgPGNvZGU+Q2xvbmVJdGVyYXRvcjwvY29kZT4KLSAqIGlzIHN1cHBsaWVkIHdpdGggYW4ge0BsaW5rIFJlbW92ZXJ9IGl0IHdpbGwgZGVsZWdhdGUgdGhlCi0gKiB7QGxpbmsgI3JlbW92ZSgpfSBvcGVyYXRpb24gdG8gdGhlIHtAbGluayBSZW1vdmVyfS4KLSAqIEFsdGVybmF0aXZlbHksIGEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoZSB7QGxpbmsgI3JlbW92ZShPYmplY3QpfQotICogbWV0aG9kLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZQotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU25hcHNob3RDbG9uZUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBDbG9uZUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8T2JqZWN0PiBpdGVyYXRvcjsKLQlwcml2YXRlIEUgY3VycmVudDsKLQlwcml2YXRlIGZpbmFsIFJlbW92ZXI8RT4gcmVtb3ZlcjsKLQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlQWxsb3dlZDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogVGhlIHtAbGluayAjcmVtb3ZlKCl9IG1ldGhvZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQsCi0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSB7QGxpbmsgI3JlbW92ZShPYmplY3QpfS4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVJdGVyYXRvcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMoY29sbGVjdGlvbiwgUmVtb3Zlci5SZWFkT25seS48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVGhlIHtAbGluayAjcmVtb3ZlKCl9IG1ldGhvZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQsCi0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSB7QGxpbmsgI3JlbW92ZShPYmplY3QpfS4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVJdGVyYXRvcihFW10gYXJyYXkpIHsKLQkJdGhpcyhhcnJheSwgUmVtb3Zlci5SZWFkT25seS48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCByZW1vdmVyIHRvIHJlbW92ZSBvYmplY3RzIGZyb20gdGhlCi0JICogb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVJdGVyYXRvcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBSZW1vdmVyPEU+IHJlbW92ZXIpIHsKLQkJdGhpcyhyZW1vdmVyLCBjb2xsZWN0aW9uLnRvQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHJlbW92ZXIgdG8gcmVtb3ZlIG9iamVjdHMgZnJvbSB0aGUKLQkgKiBvcmlnaW5hbCBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVJdGVyYXRvcihFW10gYXJyYXksIFJlbW92ZXI8RT4gcmVtb3ZlcikgewotCQl0aGlzKHJlbW92ZXIsIGFycmF5LmNsb25lKCkpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIGNvbnN0cnVjdG9yIHVzZWQgYnkgc3ViY2xhc3Nlcy4KLQkgKiBTd2FwIG9yZGVyIG9mIGFyZ3VtZW50cyB0byBwcmV2ZW50IGNvbGxpc2lvbiB3aXRoIG90aGVyIGNvbnN0cnVjdG9yLgotCSAqIFRoZSBwYXNzZWQgaW4gYXJyYXkgd2lsbCAqbm90KiBiZSBjbG9uZWQuCi0JICovCi0JcHJvdGVjdGVkIENsb25lSXRlcmF0b3IoUmVtb3ZlcjxFPiByZW1vdmVyLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oYXJyYXkpOwotCQl0aGlzLmN1cnJlbnQgPSBudWxsOwotCQl0aGlzLnJlbW92ZXIgPSByZW1vdmVyOwotCQl0aGlzLnJlbW92ZUFsbG93ZWQgPSBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRoaXMuY3VycmVudCA9IHRoaXMubmVzdGVkTmV4dCgpOwotCQl0aGlzLnJlbW92ZUFsbG93ZWQgPSB0cnVlOwotCQlyZXR1cm4gdGhpcy5jdXJyZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJaWYgKCAhIHRoaXMucmVtb3ZlQWxsb3dlZCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucmVtb3ZlKHRoaXMuY3VycmVudCk7Ci0JCXRoaXMucmVtb3ZlQWxsb3dlZCA9IGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIHBhc3NlZCBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGhlbGQgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPiwKLQkgKiBzbyB0aGlzIGNhc3QgaXMgbm90IGEgcHJvYmxlbS4gV2UgbmVlZCB0aGlzIGNhc3QgYmVjYXVzZQotCSAqIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gd2VyZSBjb3BpZWQgaW50bwotCSAqIGFuIG9iamVjdCBhcnJheSAoPGNvZGU+T2JqZWN0W108L2NvZGU+KS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgRSBuZXN0ZWROZXh0KCkgewotCQlyZXR1cm4gKEUpIHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZnJvbSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgUmVtb3Zlcn0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEUgZSkgewotCQl0aGlzLnJlbW92ZXIucmVtb3ZlKGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotCi0JLy8qKioqKioqKioqIG1lbWJlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSB7QGxpbmsgQ2xvbmVJdGVyYXRvcn0gdG8gcmVtb3ZlCi0JICogZWxlbWVudHMgZnJvbSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbjsgc2luY2UgdGhlIGl0ZXJhdG9yCi0JICogZG9lcyBub3QgaGF2ZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgUmVtb3ZlcjxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG9iamVjdCBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCQkgKi8KLQkJdm9pZCByZW1vdmUoVCBlbGVtZW50KTsKLQotCi0JCWZpbmFsIGNsYXNzIFJlYWRPbmx5PFM+IGltcGxlbWVudHMgUmVtb3ZlcjxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBSZW1vdmVyIElOU1RBTkNFID0gbmV3IFJlYWRPbmx5KCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IFJlbW92ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBSZWFkT25seSgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJLy8gcmVtb3ZlIGlzIG5vdCBzdXBwb3J0ZWQKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3QgZWxlbWVudCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiQ2xvbmVJdGVyYXRvci5SZW1vdmVyLlJlYWRPbmx5IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OTNlMGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5DbG9uZUxpc3RJdGVyYXRvcjwvY29kZT4gaXRlcmF0ZXMgb3ZlciBhIGNvcHkgb2YgYSBsaXN0LAotICogYWxsb3dpbmcgZm9yIGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBsaXN0LgotICogPHA+Ci0gKiBUaGUgb3JpZ2luYWwgbGlzdCBwYXNzZWQgdG8gdGhlIDxjb2RlPkNsb25lTGlzdEl0ZXJhdG9yPC9jb2RlPidzCi0gKiBjb25zdHJ1Y3RvciBzaG91bGQgYmUgc3luY2hyb25pemVkOyBvdGhlcndpc2UgeW91IHJ1biB0aGUgcmlzayBvZgotICogYSBjb3JydXB0ZWQgbGlzdCAoZS5nLiB7QGxpbmsgamF2YS51dGlsLlZlY3Rvcn0uCi0gKiA8cD4KLSAqIEJ5IGRlZmF1bHQsIGEgPGNvZGU+Q2xvbmVMaXN0SXRlcmF0b3I8L2NvZGU+IGRvZXMgbm90IHN1cHBvcnQgdGhlCi0gKiBtb2RpZmljYXRpb24gb3BlcmF0aW9uczsgdGhpcyBpcyBiZWNhdXNlIGl0IGRvZXMgbm90IGhhdmUKLSAqIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgbGlzdC4gQnV0IGlmIHRoZSA8Y29kZT5DbG9uZUxpc3RJdGVyYXRvcjwvY29kZT4KLSAqIGlzIHN1cHBsaWVkIHdpdGggYSB7QGxpbmsgTXV0YXRvcn0gaXQgd2lsbCBkZWxlZ2F0ZSB0aGUKLSAqIG1vZGlmaWNhdGlvbiBvcGVyYXRpb25zIHRvIHRoZSB7QGxpbmsgTXV0YXRvcn0uCi0gKiBBbHRlcm5hdGl2ZWx5LCBhIHN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGUgbW9kaWZpY2F0aW9uIG1ldGhvZHMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZQotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgQ2xvbmVMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPE9iamVjdD4gbGlzdEl0ZXJhdG9yOwotCXByaXZhdGUgaW50IGN1cnNvcjsKLQlwcml2YXRlIFN0YXRlIHN0YXRlOwotCXByaXZhdGUgZmluYWwgTXV0YXRvcjxFPiBtdXRhdG9yOwotCi0JcHJpdmF0ZSBlbnVtIFN0YXRlIHsKLQkJVU5LTk9XTiwKLQkJUFJFVklPVVMsCi0JCU5FWFQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBUaGUgbW9kaWZpY2F0aW9uIG1ldGhvZHMgd2lsbCBub3QgYmUgc3VwcG9ydGVkLAotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGVtLgotCSAqLwotCXB1YmxpYyBDbG9uZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0KSB7Ci0JCXRoaXMobGlzdCwgTXV0YXRvci5SZWFkT25seS48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIFRoZSBtb2RpZmljYXRpb24gbWV0aG9kcyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQsCi0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZW0uCi0JICovCi0JcHVibGljIENsb25lTGlzdEl0ZXJhdG9yKEVbXSBhcnJheSkgewotCQl0aGlzKGFycmF5LCBNdXRhdG9yLlJlYWRPbmx5LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBsaXN0IG11dGF0b3IgdG8gbW9kaWZ5IHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqLwotCXB1YmxpYyBDbG9uZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0LCBNdXRhdG9yPEU+IG11dGF0b3IpIHsKLQkJdGhpcyhtdXRhdG9yLCBsaXN0LnRvQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBsaXN0IG11dGF0b3IgdG8gbW9kaWZ5IHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqLwotCXB1YmxpYyBDbG9uZUxpc3RJdGVyYXRvcihFW10gYXJyYXksIE11dGF0b3I8RT4gbXV0YXRvcikgewotCQl0aGlzKG11dGF0b3IsIGFycmF5LmNsb25lKCkpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIGNvbnN0cnVjdG9yIHVzZWQgYnkgc3ViY2xhc3Nlcy4KLQkgKiBTd2FwIG9yZGVyIG9mIGFyZ3VtZW50cyB0byBwcmV2ZW50IGNvbGxpc2lvbiB3aXRoIG90aGVyIGNvbnN0cnVjdG9yLgotCSAqIFRoZSBwYXNzZWQgaW4gYXJyYXkgd2lsbCAqbm90KiBiZSBjbG9uZWQuCi0JICovCi0JcHJvdGVjdGVkIENsb25lTGlzdEl0ZXJhdG9yKE11dGF0b3I8RT4gbXV0YXRvciwgT2JqZWN0Li4uIGFycmF5KSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIGJ1aWxkIGEgY29weSBvZiB0aGUgbGlzdCBhbmQga2VlcCBpdCBpbiBzeW5jaCB3aXRoIG9yaWdpbmFsIChpZiB0aGUgbXV0YXRvciBhbGxvd3MgY2hhbmdlcykKLQkJLy8gdGhhdCB3YXkgdGhlIG5lc3RlZCBsaXN0IGl0ZXJhdG9yIHdpbGwgbWFpbnRhaW4gc29tZSBvZiBvdXIgc3RhdGUKLQkJdGhpcy5saXN0SXRlcmF0b3IgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChhcnJheSkubGlzdEl0ZXJhdG9yKCk7Ci0JCXRoaXMubXV0YXRvciA9IG11dGF0b3I7Ci0JCXRoaXMuY3Vyc29yID0gMDsKLQkJdGhpcy5zdGF0ZSA9IFN0YXRlLlVOS05PV047Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RJdGVyYXRvciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCS8vIGFsbG93IHRoZSBuZXN0ZWQgaXRlcmF0b3IgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGJlZm9yZSB3ZSBtb2RpZnkgdGhlIGluZGV4Ci0JCUUgbmV4dCA9IHRoaXMubmVzdGVkTmV4dCgpOwotCQl0aGlzLmN1cnNvcisrOwotCQl0aGlzLnN0YXRlID0gU3RhdGUuTkVYVDsKLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBhbGxvdyB0aGUgbmVzdGVkIGl0ZXJhdG9yIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBiZWZvcmUgd2UgbW9kaWZ5IHRoZSBvcmlnaW5hbCBsaXN0Ci0JCXRoaXMubGlzdEl0ZXJhdG9yLnJlbW92ZSgpOwotCQlpZiAodGhpcy5zdGF0ZSA9PSBTdGF0ZS5QUkVWSU9VUykgewotCQkJdGhpcy5yZW1vdmUodGhpcy5jdXJzb3IpOwotCQl9IGVsc2UgewotCQkJdGhpcy5jdXJzb3ItLTsKLQkJCXRoaXMucmVtb3ZlKHRoaXMuY3Vyc29yKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJLy8gYWxsb3cgdGhlIG5lc3RlZCBpdGVyYXRvciB0byB0aHJvdyBhbiBleGNlcHRpb24gYmVmb3JlIHdlIG1vZGlmeSB0aGUgaW5kZXgKLQkJRSBwcmV2aW91cyA9IHRoaXMubmVzdGVkUHJldmlvdXMoKTsKLQkJdGhpcy5jdXJzb3ItLTsKLQkJdGhpcy5zdGF0ZSA9IFN0YXRlLlBSRVZJT1VTOwotCQlyZXR1cm4gcHJldmlvdXM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQkvLyBhbGxvdyB0aGUgbmVzdGVkIGl0ZXJhdG9yIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBiZWZvcmUgd2UgbW9kaWZ5IHRoZSBvcmlnaW5hbCBsaXN0Ci0JCXRoaXMubGlzdEl0ZXJhdG9yLmFkZChvKTsKLQkJdGhpcy5hZGQodGhpcy5jdXJzb3IsIG8pOwotCQl0aGlzLmN1cnNvcisrOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIG8pIHsKLQkJLy8gYWxsb3cgdGhlIG5lc3RlZCBpdGVyYXRvciB0byB0aHJvdyBhbiBleGNlcHRpb24gYmVmb3JlIHdlIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdAotCQl0aGlzLmxpc3RJdGVyYXRvci5zZXQobyk7Ci0JCWlmICh0aGlzLnN0YXRlID09IFN0YXRlLlBSRVZJT1VTKSB7Ci0JCQl0aGlzLnNldCh0aGlzLmN1cnNvciwgbyk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldCh0aGlzLmN1cnNvciAtIDEsIG8pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGxpc3QgcGFzc2VkIGluIGR1cmluZyBjb25zdHJ1Y3Rpb24gaGVsZCBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LAotCSAqIHNvIHRoaXMgY2FzdCBpcyBub3QgYSBwcm9ibGVtLiBXZSBuZWVkIHRoaXMgY2FzdCBiZWNhdXNlCi0JICogYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbiB3ZXJlIGNvcGllZCBpbnRvCi0JICogYW4gb2JqZWN0IGFycmF5ICg8Y29kZT5PYmplY3RbXTwvY29kZT4pLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBFIG5lc3RlZE5leHQoKSB7Ci0JCXJldHVybiAoRSkgdGhpcy5saXN0SXRlcmF0b3IubmV4dCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBsaXN0IHBhc3NlZCBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGhlbGQgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPiwKLQkgKiBzbyB0aGlzIGNhc3QgaXMgbm90IGEgcHJvYmxlbS4gV2UgbmVlZCB0aGlzIGNhc3QgYmVjYXVzZQotCSAqIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gd2VyZSBjb3BpZWQgaW50bwotCSAqIGFuIG9iamVjdCBhcnJheSAoPGNvZGU+T2JqZWN0W108L2NvZGU+KS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgRSBuZXN0ZWRQcmV2aW91cygpIHsKLQkJcmV0dXJuIChFKSB0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIE11dGF0b3J9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZChpbnQgaW5kZXgsIEUgbykgewotCQl0aGlzLm11dGF0b3IuYWRkKGluZGV4LCBvKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIE11dGF0b3J9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJdGhpcy5tdXRhdG9yLnJlbW92ZShpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgTXV0YXRvcn0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0KGludCBpbmRleCwgRSBvKSB7Ci0JCXRoaXMubXV0YXRvci5zZXQoaW5kZXgsIG8pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogbWVtYmVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2VkIGJ5IHtAbGluayBDbG9uZUxpc3RJdGVyYXRvcn0gdG8gcmVtb3ZlCi0JICogZWxlbWVudHMgZnJvbSB0aGUgb3JpZ2luYWwgbGlzdDsgc2luY2UgdGhlIGxpc3QgaXRlcmF0b3IKLQkgKiBkb2VzIG5vdCBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBNdXRhdG9yPFQ+IHsKLQotCQkvKioKLQkJICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSBvcmlnaW5hbCBsaXN0LgotCQkgKi8KLQkJdm9pZCBhZGQoaW50IGluZGV4LCBUIG8pOwotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkJICovCi0JCXZvaWQgcmVtb3ZlKGludCBpbmRleCk7Ci0KLQkJLyoqCi0JCSAqIFNldCB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbiB0aGUgb3JpZ2luYWwgbGlzdC4KLQkJICovCi0JCXZvaWQgc2V0KGludCBpbmRleCwgVCBvKTsKLQotCi0JCWZpbmFsIGNsYXNzIFJlYWRPbmx5PFM+IGltcGxlbWVudHMgTXV0YXRvcjxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBNdXRhdG9yIElOU1RBTkNFID0gbmV3IFJlYWRPbmx5KCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE11dGF0b3I8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBSZWFkT25seSgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJLy8gYWRkIGlzIG5vdCBzdXBwb3J0ZWQKLQkJCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBvKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkvLyByZW1vdmUgaXMgbm90IHN1cHBvcnRlZAotCQkJcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJLy8gc2V0IGlzIG5vdCBzdXBwb3J0ZWQKLQkJCXB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIE9iamVjdCBvKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yLlJlYWRPbmx5IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMTI3YTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVJdGVyYXRvcjwvY29kZT4gd3JhcHMgYSBjb2xsZWN0aW9uCi0gKiBvZiB7QGxpbmsgSXRlcmF0b3J9cyBhbmQgbWFrZXMgdGhlbSBhcHBlYXIgdG8gYmUgYSBzaW5nbGUKLSAqIHtAbGluayBJdGVyYXRvcn0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IGl0ZXJhdG9yczsKLQlwcml2YXRlIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBjdXJyZW50SXRlcmF0b3I7Ci0JcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbGFzdEl0ZXJhdG9yVG9SZXR1cm5OZXh0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIGFsbCB0aGUgZWxlbWVudHMgaGVsZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgaXRlcmFibGVzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgSXRlcmFibGU8PyBleHRlbmRzIEU+PiBpdGVyYWJsZXMpIHsKLQkJdGhpcygKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiwgSXRlcmF0b3I8PyBleHRlbmRzIEU+PihpdGVyYWJsZXMuaXRlcmF0b3IoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gdHJhbnNmb3JtKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQkJCQlyZXR1cm4gaXRlcmFibGUuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3JzID0gaXRlcmF0b3JzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yKEUgb2JqZWN0LCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJdGhpcyhvYmplY3QsIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yKEUgb2JqZWN0LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KG9iamVjdCksIGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBFIG9iamVjdCkgewotCQl0aGlzKGl0ZXJhdG9yLCBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgaXRlcmFibGVzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4uLi4gaXRlcmFibGVzKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmFibGU8SXRlcmFibGU8PyBleHRlbmRzIEU+PihpdGVyYWJsZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+Li4uIGl0ZXJhdG9ycykgewotCQl0aGlzKG5ldyBBcnJheUl0ZXJhdG9yPEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4oaXRlcmF0b3JzKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEl0ZXJhdG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxvYWRDdXJyZW50SXRlcmF0b3IoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG5vIGl0ZXJhdG9ycyBhdCBhbGwKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRoaXMubG9hZEN1cnJlbnRJdGVyYXRvcigpOwotCQlFIHJlc3VsdCA9IHRoaXMuY3VycmVudEl0ZXJhdG9yLm5leHQoKTsKLQotCQkvLyB0aGUgc3RhdGVtZW50IGFib3ZlIHdpbGwgdGhyb3cgYSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0JCS8vIGlmIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmU7Ci0JCS8vIHNvIGlmIHdlIGdldCBoZXJlLCB3ZSBjYW4gc2V0ICdsYXN0SXRlcmF0b3JUb1JldHVybk5leHQnCi0JCXRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5OZXh0ID0gdGhpcy5jdXJyZW50SXRlcmF0b3I7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCWlmICh0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuTmV4dCA9PSBudWxsKSB7Ci0JCQkvLyBDb21wb3NpdGVJdGVyYXRvciNuZXh0KCkgaGFzIG5ldmVyIGJlZW4gY2FsbGVkCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybk5leHQucmVtb3ZlKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB7QGxpbmsgY3VycmVudEl0ZXJhdG9yfSB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IHtAbGluayBJdGVyYXRvciNoYXNOZXh0KCl9Ci0JICogb3IgdGhlIGZpbmFsIGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkQ3VycmVudEl0ZXJhdG9yKCkgewotCQlpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKCggISB0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCkpICYmIHRoaXMuaXRlcmF0b3JzLmhhc05leHQoKSkgewotCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3JzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWQzYzdhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUxpc3RJdGVyYXRvcjwvY29kZT4gd3JhcHMgYSBsaXN0Ci0gKiBvZiB7QGxpbmsgTGlzdEl0ZXJhdG9yfXMgYW5kIG1ha2VzIHRoZW0gYXBwZWFyIHRvIGJlIGEgc2luZ2xlCi0gKiB7QGxpbmsgTGlzdEl0ZXJhdG9yfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlTGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8RT4+IGl0ZXJhdG9yczsKLQlwcml2YXRlIExpc3RJdGVyYXRvcjxFPiBuZXh0SXRlcmF0b3I7Ci0JcHJpdmF0ZSBpbnQgbmV4dEluZGV4OwotIAkvKioKLSAJICogdHJ1ZSBpZiAibmV4dCIgd2FzIGxhc3QgcmV0dXJuZWQ7IGZhbHNlIGlmICJwcmV2aW91cyIgd2FzIGxhc3QgcmV0dXJuZWQ7Ci0gCSAqIHRoaXMgZGV0ZXJtaW5lcyB0aGUgZWZmZWN0IG9mIHtAbGluayAjcmVtb3ZlKE9iamVjdCl9IG9uIHtAbGluayAjbmV4dEluZGV4fQotIAkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbmV4dFJldHVybmVkOwotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEU+IGxhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBsaXN0IG9mIGxpc3RzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgTGlzdDxFPj4gbGlzdHMpIHsKLQkJdGhpcygKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxMaXN0PEU+LCBMaXN0SXRlcmF0b3I8RT4+KGxpc3RzLmxpc3RJdGVyYXRvcigpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiB0cmFuc2Zvcm0oTGlzdDxFPiBsaXN0KSB7Ci0JCQkJCXJldHVybiBsaXN0Lmxpc3RJdGVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgbGlzdHMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmFibGU8PyBleHRlbmRzIExpc3RJdGVyYWJsZTxFPj4gbGlzdEl0ZXJhYmxlcykgewotCQl0aGlzKAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPExpc3RJdGVyYWJsZTxFPiwgTGlzdEl0ZXJhdG9yPEU+PihsaXN0SXRlcmFibGVzLml0ZXJhdG9yKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEU+IHRyYW5zZm9ybShMaXN0SXRlcmFibGU8RT4gbGlzdCkgewotCQkJCQlyZXR1cm4gbGlzdC5pdGVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGxpc3QgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8RT4+IGl0ZXJhdG9ycykgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9ycyA9IGl0ZXJhdG9yczsKLQkJdGhpcy5uZXh0SW5kZXggPSAwOwotCQl0aGlzLm5leHRSZXR1cm5lZCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihFIG9iamVjdCwgTGlzdDxFPiBsaXN0KSB7Ci0JCXRoaXMob2JqZWN0LCBsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoRSBvYmplY3QsIExpc3RJdGVyYWJsZTxFPiBsaXN0SXRlcmFibGUpIHsKLQkJdGhpcyhvYmplY3QsIGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKEUgb2JqZWN0LCBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxFPihvYmplY3QpLCBpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdDxFPiBsaXN0LCBFIG9iamVjdCkgewotCQl0aGlzKGxpc3QubGlzdEl0ZXJhdG9yKCksIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPEU+IGxpc3RJdGVyYWJsZSwgRSBvYmplY3QpIHsKLQkJdGhpcyhsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSwgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yLCBFIG9iamVjdCkgewotCQl0aGlzKGl0ZXJhdG9yLCBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxFPihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3Q8RT4uLi4gbGlzdHMpIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KGxpc3RzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdHMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmFibGU8RT4uLi4gbGlzdEl0ZXJhYmxlcykgewotCQl0aGlzKG5ldyBBcnJheUxpc3RJdGVyYWJsZTxMaXN0SXRlcmFibGU8RT4+KGxpc3RJdGVyYWJsZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxFPi4uLiBpdGVyYXRvcnMpIHsKLQkJdGhpcyhuZXcgQXJyYXlMaXN0SXRlcmF0b3I8TGlzdEl0ZXJhdG9yPEU+PihpdGVyYXRvcnMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoRSBvKSB7Ci0JCXRoaXMuY2hlY2tOZXh0SXRlcmF0b3IoKTsKLQkJdGhpcy5uZXh0SXRlcmF0b3IuYWRkKG8pOwotCQl0aGlzLm5leHRJbmRleCsrOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxvYWROZXh0SXRlcmF0b3IoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG5vIGl0ZXJhdG9ycyBhdCBhbGwKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0SXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQl0cnkgewotCQkJdGhpcy5sb2FkUHJldmlvdXNJdGVyYXRvcigpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGlzIG9jY3VycyBpZiB0aGVyZSBhcmUgbm8gaXRlcmF0b3JzIGF0IGFsbAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLm5leHRJdGVyYXRvci5oYXNQcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRoaXMubG9hZE5leHRJdGVyYXRvcigpOwotCQlFIHJlc3VsdCA9IHRoaXMubmV4dEl0ZXJhdG9yLm5leHQoKTsKLQotCQkvLyB0aGUgc3RhdGVtZW50IGFib3ZlIHdpbGwgdGhyb3cgYSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0JCS8vIGlmIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmU7Ci0JCS8vIHNvIGlmIHdlIGdldCBoZXJlLCB3ZSBjYW4gc2V0IHRoZSAnbGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50JwotCQl0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCA9IHRoaXMubmV4dEl0ZXJhdG9yOwotCQl0aGlzLm5leHRJbmRleCsrOwotCQl0aGlzLm5leHRSZXR1cm5lZCA9IHRydWU7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4OwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQl0aGlzLmxvYWRQcmV2aW91c0l0ZXJhdG9yKCk7Ci0JCUUgcmVzdWx0ID0gdGhpcy5uZXh0SXRlcmF0b3IucHJldmlvdXMoKTsKLQotCQkvLyB0aGUgc3RhdGVtZW50IGFib3ZlIHdpbGwgdGhyb3cgYSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0JCS8vIGlmIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmU7Ci0JCS8vIHNvIGlmIHdlIGdldCBoZXJlLCB3ZSBjYW4gc2V0IHRoZSAnbGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50JwotCQl0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCA9IHRoaXMubmV4dEl0ZXJhdG9yOwotCQl0aGlzLm5leHRJbmRleC0tOwotCQl0aGlzLm5leHRSZXR1cm5lZCA9IGZhbHNlOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5uZXh0SW5kZXggIC0gMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCWlmICh0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQucmVtb3ZlKCk7Ci0JCWlmICh0aGlzLm5leHRSZXR1cm5lZCkgewotCQkJLy8gZGVjcmVtZW50IHRoZSBpbmRleCBiZWNhdXNlIHRoZSAibmV4dCIgZWxlbWVudCBoYXMgbW92ZWQgZm9yd2FyZCBpbiB0aGUgbGlzdAotCQkJdGhpcy5uZXh0SW5kZXgtLTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJaWYgKHRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudC5zZXQoZSk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCAnbmV4dEl0ZXJhdG9yJyB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IDxjb2RlPmhhc05leHQoKTwvY29kZT4KLQkgKiBvciB0aGUgZmluYWwgaXRlcmF0b3IgaWYgYWxsIHRoZSBlbGVtZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0SXRlcmF0b3IoKSB7Ci0JCXRoaXMuY2hlY2tOZXh0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKCggISB0aGlzLm5leHRJdGVyYXRvci5oYXNOZXh0KCkpICYmIHRoaXMuaXRlcmF0b3JzLmhhc05leHQoKSkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkICduZXh0SXRlcmF0b3InIHdpdGggdGhlIGZpcnN0IGl0ZXJhdG9yIHRoYXQgPGNvZGU+aGFzUHJldmlvdXMoKTwvY29kZT4KLQkgKiBvciB0aGUgZmlyc3QgaXRlcmF0b3IgaWYgYWxsIHRoZSBlbGVtZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmV2aW91c0l0ZXJhdG9yKCkgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXdoaWxlICgoICEgdGhpcy5uZXh0SXRlcmF0b3IuaGFzUHJldmlvdXMoKSkgJiYgdGhpcy5pdGVyYXRvcnMuaGFzUHJldmlvdXMoKSkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5wcmV2aW91cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgJ25leHRJdGVyYXRvcicgaXMgbnVsbCwgbG9hZCBpdCB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tOZXh0SXRlcmF0b3IoKSB7Ci0JCWlmICh0aGlzLm5leHRJdGVyYXRvciA9PSBudWxsKSB7Ci0JCQl0aGlzLm5leHRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLm5leHQoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3JzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYTRkNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbXB0eUl0ZXJhdG9yPC9jb2RlPiBpcyBqdXN0IHRoYXQuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgKG5vdCkgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVtcHR5SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVtcHR5SXRlcmF0b3IgSU5TVEFOQ0UgPSBuZXcgRW1wdHlJdGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8VD4gSXRlcmF0b3I8VD4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRW1wdHlJdGVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZDE0MmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEFuIDxjb2RlPkVtcHR5TGlzdEl0ZXJhdG9yPC9jb2RlPiBpcyBqdXN0IHRoYXQuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgKG5vdCkgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbXB0eUxpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVtcHR5TGlzdEl0ZXJhdG9yIElOU1RBTkNFID0gbmV3IEVtcHR5TGlzdEl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxUPiBMaXN0SXRlcmF0b3I8VD4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRW1wdHlMaXN0SXRlcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5ZWJmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbnVtZXJhdGlvbkl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbgotICoge0BsaW5rIEVudW1lcmF0aW9ufSBzbyB0aGF0IGl0IGNhbiBiZSB0cmVhdGVkIGxpa2UgYW4KLSAqIHtAbGluayBJdGVyYXRvcn0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnVtZXJhdGlvbkl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb25JdGVyYXRvcihFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24pIHsKLQkJdGhpcy5lbnVtZXJhdGlvbiA9IGVudW1lcmF0aW9uOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5lbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbnVtZXJhdGlvbik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9GaWx0ZXJpbmdJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9GaWx0ZXJpbmdJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDJiNGEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBhbmQgdXNlcyBhIHtAbGluayBGaWx0ZXJ9IHRvIGRldGVybWluZSB3aGljaCBlbGVtZW50cyBpbiB0aGUKLSAqIG5lc3RlZCBpdGVyYXRvciBhcmUgdG8gYmUgcmV0dXJuZWQgYnkgY2FsbHMgdG8ge0BsaW5rICNuZXh0KCl9LgotICogPHA+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBGaWx0ZXI8L2NvZGU+LCBhIHN1YmNsYXNzCi0gKiBvZiA8Y29kZT5GaWx0ZXJpbmdJdGVyYXRvcjwvY29kZT4gY2FuIG92ZXJyaWRlIHRoZQotICoge0BsaW5rICNhY2NlcHQoT2JqZWN0KX0gbWV0aG9kLgotICogPHA+Ci0gKiBPbmUsIHBvc3NpYmx5IHVuZGVzaXJhYmxlLCBzaWRlLWVmZmVjdCBvZiB1c2luZyB0aGlzIGl0ZXJhdG9yIGlzIHRoYXQKLSAqIHRoZSBuZXN0ZWQgaXRlcmF0b3IncyA8Y29kZT5uZXh0KCk8L2NvZGU+IG1ldGhvZCB3aWxsIGJlIGludm9rZWQKLSAqIDxlbT5iZWZvcmU8L2VtPiB0aGUgZmlsdGVyZWQgaXRlcmF0b3IncyB7QGxpbmsgI25leHQoKX0KLSAqIG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzIGlzIGJlY2F1c2UgdGhlICJuZXh0IiBlbGVtZW50IG11c3QgYmUKLSAqIGNoZWNrZWQgZm9yIHdoZXRoZXIgaXQgaXMgdG8gYmUgYWNjZXB0ZWQgYmVmb3JlIHRoZSBmaWx0ZXJlZCBpdGVyYXRvcgotICogY2FuIGRldGVybWluZSB3aGV0aGVyIGl0IGhhcyBhICJuZXh0IiBlbGVtZW50IChpLmUuIHRoYXQgdGhlCi0gKiB7QGxpbmsgI2hhc05leHQoKX0gbWV0aG9kIHNob3VsZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4pLgotICogVGhpcyBhbHNvIHByZXZlbnRzIGEgZmlsdGVyZWQgaXRlcmF0b3IgZnJvbSBzdXBwb3J0aW5nIHRoZSBvcHRpb25hbAotICogPGNvZGU+cmVtb3ZlKCk8L2NvZGU+IG1ldGhvZC4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyB0byBiZSBmaWx0ZXJlZAotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3I7Ci0JcHJpdmF0ZSBmaW5hbCBGaWx0ZXI8RT4gZmlsdGVyOwotCXByaXZhdGUgRSBuZXh0OwotCXByaXZhdGUgYm9vbGVhbiBkb25lOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogaXRlcmFibGUgYW5kIGEgZGlzYWJsZWQgZmlsdGVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjYWNjZXB0KE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgRmlsdGVyfS4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBpdGVyYXRvciBhbmQgYSBkaXNhYmxlZCBmaWx0ZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNhY2NlcHQoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBGaWx0ZXJ9LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJdGhpcyhpdGVyYXRvciwgRmlsdGVyLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBpdGVyYWJsZSBhbmQgZmlsdGVyLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIEZpbHRlcjxFPiBmaWx0ZXIpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpLCBmaWx0ZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogaXRlcmF0b3IgYW5kIGZpbHRlci4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMubG9hZE5leHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gISB0aGlzLmRvbmU7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlFIHJlc3VsdCA9IHRoaXMubmV4dDsKLQkJdGhpcy5sb2FkTmV4dCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEJlY2F1c2Ugd2UgbmVlZCB0byBwcmUtbG9hZCB0aGUgbmV4dCBlbGVtZW50Ci0JICogdG8gYmUgcmV0dXJuZWQsIHdlIGNhbm5vdCBzdXBwb3J0IHRoZSA8Y29kZT5yZW1vdmUoKTwvY29kZT4KLQkgKiBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIG5leHQgd2l0aCB0aGUgbmV4dCB2YWxpZCBlbnRyeSBmcm9tIHRoZSBuZXN0ZWQKLQkgKiBpdGVyYXRvci4gSWYgdGhlcmUgYXJlIG5vbmUsIG5leHQgaXMgc2V0IHRvIDxjb2RlPkVORDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0KCkgewotCQl0aGlzLmRvbmUgPSB0cnVlOwotCQl3aGlsZSAodGhpcy5pdGVyYXRvci5oYXNOZXh0KCkgJiYgKHRoaXMuZG9uZSkpIHsKLQkJCUUgdGVtcCA9IHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHRoaXMuYWNjZXB0KHRlbXApKSB7Ci0JCQkJLy8gYXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdCB3YXMgYWNjZXB0ZWQgaXQgaXMgb2YgdHlwZSBFCi0JCQkJdGhpcy5uZXh0ID0gdGVtcDsKLQkJCQl0aGlzLmRvbmUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5uZXh0ID0gbnVsbDsKLQkJCQl0aGlzLmRvbmUgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHtAbGluayBGaWx0ZXJpbmdJdGVyYXRvcn0KLQkgKiBzaG91bGQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgbmV4dCBlbGVtZW50IGZyb20gYSBjYWxsIHRvIHRoZQotCSAqIHtAbGluayAjbmV4dCgpfSBtZXRob2QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEZpbHRlcn0uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEUgbykgewotCQlyZXR1cm4gdGhpcy5maWx0ZXIuYWNjZXB0KG8pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0dyYXBoSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2NTczZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0dyYXBoSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+R3JhcGhJdGVyYXRvcjwvY29kZT4gaXMgc2ltaWxhciB0byBhIHtAbGluayBUcmVlSXRlcmF0b3J9Ci0gKiBleGNlcHQgdGhhdCBpdCBjYW5ub3QgYmUgYXNzdW1lZCB0aGF0IGFsbCBub2RlcyBhc3N1bWUgYSBzdHJpY3QgdHJlZQotICogc3RydWN0dXJlLiBGb3IgaW5zdGFuY2UsIGluIGEgdHJlZSwgYSBub2RlIGNhbm5vdCBiZSBhIGRlc2NlbmRlbnQgb2YKLSAqIGl0c2VsZiwgYnV0IGEgZ3JhcGggbWF5IGhhdmUgYSBjeWNsaWNhbCBzdHJ1Y3R1cmUuCi0gKiAKLSAqIEEgPGNvZGU+R3JhcGhJdGVyYXRvcjwvY29kZT4gc2ltcGxpZmllcyB0aGUgdHJhdmVyc2FsIG9mIGEKLSAqIGdyYXBoIG9mIG9iamVjdHMsIHdoZXJlIHRoZSBvYmplY3RzJyBwcm90b2NvbChzKSBwcm92aWRlcwotICogYSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIG5leHQgY29sbGVjdGlvbiBvZiBub2RlcyBpbiB0aGUgZ3JhcGgsCi0gKiAob3IgPGVtPm5laWdoYm9yczwvZW0+KSwgYnV0IGRvZXMgbm90IHByb3ZpZGUgYSBtZXRob2QgZm9yCi0gKiBnZXR0aW5nIDxlbT5hbGw8L2VtPiBvZiB0aGUgbm9kZXMgaW4gdGhlIGdyYXBoLgotICogKGUuZy4gYSBuZWlnaGJvciBjYW4gcmV0dXJuIGhpcyBuZWlnaGJvcnMsIGFuZCB0aG9zZSBuZWlnaGJvcnMKLSAqIGNhbiByZXR1cm4gdGhlaXIgbmVpZ2hib3JzLCB3aGljaCBtaWdodCBhbHNvIGluY2x1ZGUgdGhlIG9yaWdpbmFsCi0gKiBuZWlnaGJvciwgYnV0IHlvdSBvbmx5IHdhbnQgdG8gdmlzaXQgdGhlIG9yaWdpbmFsIG5laWdoYm9yIG9uY2UuKQotICogPHA+Ci0gKiBJZiBhIG5laWdoYm9yIGhhcyBhbHJlYWR5IGJlZW4gdmlzaXRlZCAoZGV0ZXJtaW5lZCBieSB1c2luZyAKLSAqIHtAbGluayAjZXF1YWxzKE9iamVjdCl9KSwgdGhhdCBuZWlnaGJvciBpcyBub3QgdmlzaXRlZCBhZ2FpbiwKLSAqIG5vciBhcmUgdGhlIG5laWdoYm9ycyBvZiB0aGF0IG9iamVjdC4KLSAqIDxwPgotICogSXQgaXMgdXAgdG8gdGhlIHVzZXIgb2YgdGhpcyBjbGFzcyB0byBlbnN1cmUgYSA8ZW0+Y29tcGxldGU8L2VtPiBncmFwaC4KLSAqIDxwPgotICogVG8gdXNlLCBzdXBwbHk6PHVsPgotICogPGxpPiBlaXRoZXIgdGhlIGluaXRpYWwgbm9kZSBvZiB0aGUgZ3JhcGggb3IgYW4ge0BsaW5rIEl0ZXJhdG9yfQotICogb3ZlciBhbiBpbml0aWFsIGNvbGxlY3Rpb24gb2YgZ3JhcGggbm9kZXMKLSAqIDxsaT4gYSB7QGxpbmsgTWlzdGVyUm9nZXJzXSB0aGF0IHRlbGxzIHdobyB0aGUgbmVpZ2hib3JzIGFyZQotICogb2YgZWFjaCBub2RlCi0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+R3JhcGhJdGVyYXRvcjwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kKQotICogPC91bD4KLSAqIHtAbGluayAjcmVtb3ZlKCl9IGlzIG5vdCBzdXBwb3J0ZWQuIFRoaXMgYmVoYXZpb3IsIGlmIAotICogZGVzaXJlZCwgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgdXNlciBvZiB0aGlzIGNsYXNzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5HcmFwaEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCS8vIHVzZSBhIExpbmtlZExpc3Qgc2luY2Ugd2Ugd2lsbCBiZSBwdWxsaW5nIG9mZiB0aGUgZnJvbnQgYW5kIGFkZGluZyB0byB0aGUgZW5kCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0PEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzID0gbmV3IExpbmtlZExpc3Q8SXRlcmF0b3I8PyBleHRlbmRzIEU+PigpOwotCXByaXZhdGUgZmluYWwgSGFzaFNldDxFPiB2aXNpdGVkTmVpZ2hib3JzID0gbmV3IEhhc2hTZXQ8RT4oKTsKLQlwcml2YXRlIGZpbmFsIE1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnM7Ci0JCi0JcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY3VycmVudEl0ZXJhdG9yOwotCQotCXByaXZhdGUgRSBuZXh0TmVpZ2hib3I7Ci0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRpc2FibGVkIE1yLiBSb2dlcnMuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBNaXN0ZXJSb2dlcnN9LgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEUuLi4gcm9vdHMpIHsKLQkJdGhpcyhuZXcgQXJyYXlJdGVyYXRvcjxFPihyb290cykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRpc2FibGVkIE1yLiBSb2dlcnMuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBNaXN0ZXJSb2dlcnN9LgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiByb290cykgewotCQl0aGlzKHJvb3RzLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRpc2FibGVkIE1yLiBSb2dlcnMuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBNaXN0ZXJSb2dlcnN9LgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiByb290cykgewotCQl0aGlzKHJvb3RzLCBNaXN0ZXJSb2dlcnMuRGlzYWJsZWQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSBncmFwaAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290Ci0JICogYW5kIGEgZGlzYWJsZWQgTXIuIFJvZ2Vycy4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiA8Y29kZT5uZWlnaGJvcnMoT2JqZWN0KTwvY29kZT4gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIDxjb2RlPk1pc3RlclJvZ2VyczwvY29kZT4uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoRSByb290KSB7Ci0JCXRoaXMocm9vdCwgTWlzdGVyUm9nZXJzLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdCBhbmQgTXIuIFJvZ2Vycy4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihFIHJvb3QsIE1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KHJvb3QpLCBtaXN0ZXJSb2dlcnMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cyBhbmQgTXIuIFJvZ2Vycy4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihFW10gcm9vdHMsIE1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJdGhpcyhuZXcgQXJyYXlJdGVyYXRvcjxFPihyb290cyksIG1pc3RlclJvZ2Vycyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSBncmFwaAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290cyBhbmQgTXIuIFJvZ2Vycy4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHMsIE1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJdGhpcyhyb290cy5pdGVyYXRvcigpLCBtaXN0ZXJSb2dlcnMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IHJvb3RzLCBNaXN0ZXJSb2dlcnM8RT4gbWlzdGVyUm9nZXJzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY3VycmVudEl0ZXJhdG9yID0gcm9vdHM7Ci0JCXRoaXMubWlzdGVyUm9nZXJzID0gbWlzdGVyUm9nZXJzOwotCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIG5leHQgbmVpZ2hib3Igd2l0aCB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSBjdXJyZW50IGl0ZXJhdG9yLgotCSAqIElmIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGhhcyBub25lLCBsb2FkIHRoZSBuZXh0IGl0ZXJhdG9yLgotCSAqIElmIHRoZXJlIGFyZSBubyBtb3JlLCB0aGUge0BsaW5rIGRvbmV9IGZsYWcgaXMgc2V0LgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dE5laWdoYm9yKCkgewotCQlpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IgPT0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSB7Ci0JCQl0aGlzLmRvbmUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRSBuZXh0UG9zc2libGVOZWlnaGJvciA9IHRoaXMuY3VycmVudEl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh0aGlzLnZpc2l0ZWROZWlnaGJvcnMuY29udGFpbnMobmV4dFBvc3NpYmxlTmVpZ2hib3IpKSB7Ci0JCQkJdGhpcy5sb2FkTmV4dE5laWdoYm9yKCk7ICAvLyByZWN1cnNlCi0JCQl9IGVsc2UgewotCQkJCXRoaXMubmV4dE5laWdoYm9yID0gbmV4dFBvc3NpYmxlTmVpZ2hib3I7Ci0JCQkJdGhpcy52aXNpdGVkTmVpZ2hib3JzLmFkZChuZXh0UG9zc2libGVOZWlnaGJvcik7Ci0JCQkJdGhpcy5pdGVyYXRvcnMuYWRkKHRoaXMubmVpZ2hib3JzKG5leHRQb3NzaWJsZU5laWdoYm9yKSk7Ci0JCQl9Ci0JCX0gCi0JCWVsc2UgewotCQkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgSXRlcmF0b3I8PyBleHRlbmRzIEU+PiBzdHJlYW0gPSB0aGlzLml0ZXJhdG9ycy5pdGVyYXRvcigpOyAhIHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSAmJiBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQkJaWYgKCAhIHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCXRoaXMuY3VycmVudEl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQkJfQotCQkJdGhpcy5sb2FkTmV4dE5laWdoYm9yKCk7ICAvLyByZWN1cnNlCi0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gISB0aGlzLmRvbmU7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlFIG5leHQgPSB0aGlzLm5leHROZWlnaGJvcjsKLQkJdGhpcy5sb2FkTmV4dE5laWdoYm9yKCk7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbW1lZGlhdGUgbmVpZ2hib3JzIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbmVpZ2hib3JzKEUgbmV4dCkgewotCQlyZXR1cm4gdGhpcy5taXN0ZXJSb2dlcnMubmVpZ2hib3JzKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY3VycmVudEl0ZXJhdG9yKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCQotCS8qKgotCSAqIFVzZWQgYnkge0BsaW5rIEdyYXBoSXRlcmF0b3J9IHRvIHJldHJpZXZlCi0JICogdGhlIGltbWVkaWF0ZSBuZWlnaGJvcnMgb2YgYSBub2RlIGluIHRoZSBncmFwaC4KLQkgKiAiVGhlc2UgYXJlIHRoZSBwZW9wbGUgaW4geW91ciBuZWlnaGJvcmhvb2QuLi4iCi0JICovCi0JcHVibGljIGludGVyZmFjZSBNaXN0ZXJSb2dlcnM8VD4gewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZSBuZWlnaGJvcnMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JCSAqLwotCQlJdGVyYXRvcjw/IGV4dGVuZHMgVD4gbmVpZ2hib3JzKFQgbmV4dCk7Ci0JCQotCQkKLQkJZmluYWwgY2xhc3MgTnVsbDxTPiBpbXBsZW1lbnRzIE1pc3RlclJvZ2VyczxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBNaXN0ZXJSb2dlcnMgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBNaXN0ZXJSb2dlcnM8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyByZXR1cm4gbm8gbmVpZ2hib3JzCi0JCQlwdWJsaWMgSXRlcmF0b3I8Uz4gbmVpZ2hib3JzKFMgbmV4dCkgewotCQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2Vycy5OdWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJfQotCi0JCS8qKiBUaGUgTXIuIFJvZ2VycyB1c2VkIHdoZW4gdGhlIHtAbGluayBHcmFwaEl0ZXJhdG9yI25laWdoYm9ycyhPYmplY3QpfSBtZXRob2QgaXMgb3ZlcnJpZGRlbi4gKi8KLQkJZmluYWwgY2xhc3MgRGlzYWJsZWQ8Uz4gaW1wbGVtZW50cyBNaXN0ZXJSb2dlcnM8Uz4gewotCQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTWlzdGVyUm9nZXJzIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE1pc3RlclJvZ2VyczxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBuZWlnaGJvcnMoUyBuZXh0KSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7ICAvLyBHcmFwaEl0ZXJhdG9yLm5laWdoYm9ycyhPYmplY3QpIHdhcyBub3QgaW1wbGVtZW50ZWQKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzLkRpc2FibGVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUGVla2FibGVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGExMzRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUGVla2FibGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UGVla2FibGVJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBhbmQgYWxsb3dzIGEge0BsaW5rICNwZWVrKCl9IGF0IHRoZSBuZXh0IGVsZW1lbnQgdG8gYmUgCi0gKiByZXR1cm5lZCBieSB7QGxpbmsgI25leHQoKX0uCi0gKiA8cD4KLSAqIE9uZSwgcG9zc2libHkgdW5kZXNpcmFibGUsIHNpZGUtZWZmZWN0IG9mIHVzaW5nIHRoaXMgaXRlcmF0b3IgaXMgdGhhdAotICogdGhlIG5lc3RlZCBpdGVyYXRvcidzIDxjb2RlPm5leHQoKTwvY29kZT4gbWV0aG9kIHdpbGwgYmUgaW52b2tlZAotICogPGVtPmJlZm9yZTwvZW0+IHRoZSBwZWVrYWJsZSBpdGVyYXRvcidzIHtAbGluayAjbmV4dCgpfQotICogbWV0aG9kIGlzIGludm9rZWQuIFRoaXMgaXMgYmVjYXVzZSB0aGUgIm5leHQiIGVsZW1lbnQgbXVzdCBiZQotICogcHJlLWxvYWRlZCBmb3IgdGhlIHtAbGluayAjcGVlaygpfSBtZXRob2QuCi0gKiBUaGlzIGFsc28gcHJldmVudHMgYSBwZWVrYWJsZSBpdGVyYXRvciBmcm9tIHN1cHBvcnRpbmcgdGhlIG9wdGlvbmFsCi0gKiB7QGxpbmsgI3JlbW92ZSgpfSBtZXRob2QuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlBlZWthYmxlSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFBlZWthYmxlSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3I7Ci0JcHJpdmF0ZSBFIG5leHQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHBlZWthYmxlIGl0ZXJhdG9yIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZAotCSAqIGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBQZWVrYWJsZUl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHBlZWthYmxlIGl0ZXJhdG9yIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBpdGVyYXRvci4KLQkgKi8KLQlwdWJsaWMgUGVla2FibGVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl0aGlzLmRvbmUgPSBmYWxzZTsKLQkJdGhpcy5sb2FkTmV4dCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUUgcmVzdWx0ID0gdGhpcy5uZXh0OwotCQl0aGlzLmxvYWROZXh0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB0aGUgbmV4dCBjYWxsIHRvIHRoZQotCSAqIHtAbGluayAjbmV4dCgpfSBtZXRob2QsIHdpdGhvdXQgYWR2YW5jaW5nIHBhc3QgaXQuCi0JICovCi0JcHVibGljIEUgcGVlaygpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0OwotCX0KLQotCS8qKgotCSAqIEJlY2F1c2Ugd2UgbmVlZCB0byBwcmUtbG9hZCB0aGUgbmV4dCBlbGVtZW50Ci0JICogdG8gYmUgcmV0dXJuZWQsIHdlIGNhbm5vdCBzdXBwb3J0IHRoZSB7QGxpbmsgI3JlbW92ZSgpfQotCSAqIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIExvYWQgbmV4dCB3aXRoIHRoZSBuZXh0IGVudHJ5IGZyb20gdGhlIG5lc3RlZAotCSAqIGl0ZXJhdG9yLiBJZiB0aGVyZSBhcmUgbm9uZSwge0BsaW5rICNuZXh0fSBpcyBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBhbmQge0BsaW5rICNkb25lfSBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0KCkgewotCQlpZiAodGhpcy5pdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmV4dCA9IHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCQl9IGVsc2UgewotCQkJdGhpcy5uZXh0ID0gbnVsbDsKLQkJCXRoaXMuZG9uZSA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUXVldWVJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9RdWV1ZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZDZiNmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9RdWV1ZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UXVldWVJdGVyYXRvcjwvY29kZT4gcHJvdmlkZXMgYW4ge0BsaW5rIEl0ZXJhdG9yfQotICogZm9yIGEge0BsaW5rIFF1ZXVlfSBvZiBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoZSBxdWV1ZSdzIGVsZW1lbnRzCi0gKiBhcmUge0BsaW5rIFF1ZXVlI2RlcXVldWUoKSBkZXF1ZXVlfWQiIGFzIHRoZSBpdGVyYXRvciByZXR1cm5zIHRoZW0gd2l0aAotICogY2FsbHMgdG8ge0BsaW5rICNuZXh0KCl9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIFF1ZXVlCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5RdWV1ZUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWV1ZUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgUXVldWU8RT4gcXVldWU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBxdWV1ZS4KLQkgKi8KLQlwdWJsaWMgUXVldWVJdGVyYXRvcihRdWV1ZTxFPiBxdWV1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnF1ZXVlID0gcXVldWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuICEgdGhpcy5xdWV1ZS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMucXVldWUuZGVxdWV1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5xdWV1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDc5ZmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogQSA8Y29kZT5SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjwvY29kZT4gd3JhcHMgYSBsaXN0Ci0gKiBvZiB7QGxpbmsgTGlzdEl0ZXJhdG9yfXMgYW5kIG1ha2VzIHRoZW0gYXBwZWFyIHRvIGJlIGEgc2luZ2xlCi0gKiByZWFkLW9ubHkge0BsaW5rIExpc3RJdGVyYXRvcn0uIEEgcmVhZC1vbmx5IGNvbXBvc2l0ZSBsaXN0Ci0gKiBpdGVyYXRvciBpcyBtb3JlIGZsZXhpYmxlIHRoYW4gYSBub3JtYWwgY29tcG9zaXRlIGxpc3QgaXRlcmF0b3Igd2hlbiBpdAotICogY29tZXMgdG8gdGhlIGVsZW1lbnQgdHlwZXMgb2YgdGhlIG5lc3RlZCBpdGVyYXRvcnMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IGl0ZXJhdG9yczsKLQlwcml2YXRlIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbmV4dEl0ZXJhdG9yOwotCXByaXZhdGUgaW50IG5leHRJbmRleDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgbGlzdHMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3Q8PyBleHRlbmRzIExpc3Q8PyBleHRlbmRzIEU+PiBsaXN0cykgewotCQl0aGlzKAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPExpc3Q8PyBleHRlbmRzIEU+LCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+PihsaXN0cy5saXN0SXRlcmF0b3IoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IHRyYW5zZm9ybShMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0KSB7Ci0JCQkJCXJldHVybiBsaXN0Lmxpc3RJdGVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+PiBsaXN0SXRlcmFibGVzKSB7Ci0JCXRoaXMoCi0JCQluZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8TGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4obGlzdEl0ZXJhYmxlcy5pdGVyYXRvcigpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4gdHJhbnNmb3JtKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbGlzdEl0ZXJhYmxlKSB7Ci0JCQkJCXJldHVybiBsaXN0SXRlcmFibGUuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YKLQkgKiBsaXN0IGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvcnMgPSBpdGVyYXRvcnM7Ci0JCXRoaXMubmV4dEluZGV4ID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoRSBvYmplY3QsIExpc3Q8PyBleHRlbmRzIEU+IGxpc3QpIHsKLQkJdGhpcyhvYmplY3QsIGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihFIG9iamVjdCwgTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBsaXN0SXRlcmFibGUpIHsKLQkJdGhpcyhvYmplY3QsIGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKEUgb2JqZWN0LCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4ob2JqZWN0KSwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QsIEUgb2JqZWN0KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSwgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGxpc3RJdGVyYWJsZSwgRSBvYmplY3QpIHsKLQkJdGhpcyhsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSwgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYXRvciwgbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3RzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFPi4uLiBsaXN0cykgewotCQl0aGlzKEFycmF5cy5hc0xpc3QobGlzdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdHMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4uLi4gbGlzdEl0ZXJhYmxlcykgewotCQl0aGlzKG5ldyBBcnJheUxpc3RJdGVyYWJsZTxMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+PihsaXN0SXRlcmFibGVzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3QgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+Li4uIGl0ZXJhdG9ycykgewotCQl0aGlzKG5ldyBBcnJheUxpc3RJdGVyYXRvcjxMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+PihpdGVyYXRvcnMpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQl0cnkgewotCQkJdGhpcy5sb2FkTmV4dEl0ZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHRoaXMgb2NjdXJzIGlmIHRoZXJlIGFyZSBubyBpdGVyYXRvcnMgYXQgYWxsCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9hZFByZXZpb3VzSXRlcmF0b3IoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG5vIGl0ZXJhdG9ycyBhdCBhbGwKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQl0aGlzLmxvYWROZXh0SXRlcmF0b3IoKTsKLQkJRSByZXN1bHQgPSB0aGlzLm5leHRJdGVyYXRvci5uZXh0KCk7Ci0JCi0JCS8vIHRoZSBzdGF0ZW1lbnQgYWJvdmUgd2lsbCB0aHJvdyBhIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLQkJLy8gaWYgdGhlIGN1cnJlbnQgaXRlcmF0b3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZTsKLQkJLy8gc28gaWYgd2UgZ2V0IGhlcmUsIHdlIGNhbiBpbmNyZW1lbnQgJ25leHRJbmRleCcKLQkJdGhpcy5uZXh0SW5kZXgrKzsKLQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4OwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQl0aGlzLmxvYWRQcmV2aW91c0l0ZXJhdG9yKCk7Ci0JCUUgcmVzdWx0ID0gdGhpcy5uZXh0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkKLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIGRlY3JlbWVudCAnbmV4dEluZGV4JwotCQl0aGlzLm5leHRJbmRleC0tOwotCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4ICAtIDE7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQkvLyB0aGUgbGlzdCBpdGVyYXRvciBpcyByZWFkLW9ubHkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyB0aGUgbGlzdCBpdGVyYXRvciBpcyByZWFkLW9ubHkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQkvLyB0aGUgbGlzdCBpdGVyYXRvciBpcyByZWFkLW9ubHkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB7QGxpbmsgI25leHRJdGVyYXRvcn0gd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IgdGhhdCB7QGxpbmsgI2hhc05leHQoKX0KLQkgKiBvciB0aGUgZmluYWwgaXRlcmF0b3IgaWYgYWxsIHRoZSBlbGVtZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0SXRlcmF0b3IoKSB7Ci0JCXRoaXMuY2hlY2tOZXh0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKCggISB0aGlzLm5leHRJdGVyYXRvci5oYXNOZXh0KCkpICYmIHRoaXMuaXRlcmF0b3JzLmhhc05leHQoKSkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHtAbGluayAjbmV4dEl0ZXJhdG9yfSB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IHtAbGluayAjaGFzUHJldmlvdXMoKX0KLQkgKiBvciB0aGUgZmlyc3QgaXRlcmF0b3IgaWYgYWxsIHRoZSBlbGVtZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmV2aW91c0l0ZXJhdG9yKCkgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXdoaWxlICgoICEgdGhpcy5uZXh0SXRlcmF0b3IuaGFzUHJldmlvdXMoKSkgJiYgdGhpcy5pdGVyYXRvcnMuaGFzUHJldmlvdXMoKSkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5wcmV2aW91cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYge0BsaW5rICNuZXh0SXRlcmF0b3J9IGlzIG51bGwsIGxvYWQgaXQgd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTmV4dEl0ZXJhdG9yKCkgewotCQlpZiAodGhpcy5uZXh0SXRlcmF0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9ycyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGJlZjYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlJlYWRPbmx5SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhdG9yfQotICogYW5kIHJlbW92ZXMgc3VwcG9ydCBmb3Ige0BsaW5rICNyZW1vdmUoKX0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlJlYWRPbmx5SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3I7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHRoYXQKLQkgKiBkaXNhbGxvd3MgcmVtb3Zlcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gYykgewotCQl0aGlzKGMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgaXRlcmF0b3IKLQkgKiBhbmQgZGlzYWxsb3cgcmVtb3Zlcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUxpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njg4NGZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIEEgPGNvZGU+UmVhZE9ubHlMaXN0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBMaXN0SXRlcmF0b3J9IGFuZCByZW1vdmVzIHN1cHBvcnQgZm9yOjx1bD4KLSAqIDxsaT57QGxpbmsgI3JlbW92ZSgpfQotICogCTxsaT57QGxpbmsgI3NldChPYmplY3QpfQotICogCTxsaT57QGxpbmsgI2FkZChPYmplY3QpfQotICogPC91bD4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5SZWFkT25seUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBsaXN0SXRlcmF0b3I7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCBsaXN0IHRoYXQKLQkgKiBkaXNhbGxvd3MgcmVtb3Zlcywgc2V0cywgYW5kIGFkZHMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5TGlzdEl0ZXJhdG9yKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgbGlzdCB0aGF0Ci0JICogZGlzYWxsb3dzIHJlbW92ZXMsIHNldHMsIGFuZCBhZGRzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYXRvcihMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGxpc3RJdGVyYWJsZSkgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYXRvciB0aGF0Ci0JICogZGlzYWxsb3dzIHJlbW92ZXMsIHNldHMsIGFuZCBhZGRzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IGxpc3RJdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RJdGVyYXRvciA9IGxpc3RJdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNQcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIG8pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RJdGVyYXRvcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZXN1bHRTZXRJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZXN1bHRTZXRJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2Q1OTdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVzdWx0U2V0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UmVzdWx0U2V0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFuIFNRTCB7QGxpbmsgUmVzdWx0U2V0fQotICogYW5kIHRyYW5zZm9ybXMgaXRzIHJvd3MgZm9yIGNsaWVudCBjb25zdW1wdGlvbi4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKLSAqIHtAbGluayAjYnVpbGROZXh0KFJlc3VsdFNldCl9IHRvIGJ1aWxkIHRoZSBleHBlY3RlZCBvYmplY3QgZnJvbQotICogdGhlIGN1cnJlbnQgcm93IG9mIHRoZSByZXN1bHQgc2V0LgotICogPHA+Ci0gKiBUbyB1c2UsIHN1cHBseTo8dWw+Ci0gKiA8bGk+IGEge0BsaW5rIFJlc3VsdFNldH0KLSAqIDxsaT4gYW4ge0BsaW5rIEFkYXB0ZXJ9IHRoYXQgY29udmVydHMgYSByb3cgaW4gdGhlIHtAbGluayBSZXN1bHRTZXR9Ci0gKiBpbnRvIHRoZSBkZXNpcmVkIG9iamVjdAotICogKGFsdGVybmF0aXZlbHksIHN1YmNsYXNzIDxjb2RlPlJlc3VsdFNldEl0ZXJhdG9yPC9jb2RlPgotICogYW5kIG92ZXJyaWRlIHRoZSB7QGxpbmsgI2J1aWxkTmV4dChSZXN1bHRTZXQpfSBtZXRob2QpCi0gKiA8L3VsPgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIGphdmEuc3FsLlJlc3VsdFNldAotICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0U2V0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBSZXN1bHRTZXQgcmVzdWx0U2V0OwotCXByaXZhdGUgZmluYWwgQWRhcHRlcjxFPiBhZGFwdGVyOwotCXByaXZhdGUgRSBuZXh0OwotCXByaXZhdGUgYm9vbGVhbiBkb25lOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCByZXN1bHQgc2V0IHRoYXQgcmV0dXJucwotCSAqIHRoZSBvYmplY3RzIHByb2R1Y2VkIGJ5IHRoZSBzcGVjaWZpZWQgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgUmVzdWx0U2V0SXRlcmF0b3IoUmVzdWx0U2V0IHJlc3VsdFNldCwgQWRhcHRlcjxFPiBhZGFwdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucmVzdWx0U2V0ID0gcmVzdWx0U2V0OwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCQl0aGlzLmRvbmUgPSBmYWxzZTsKLQkJdGhpcy5uZXh0ID0gdGhpcy5idWlsZE5leHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCByZXN1bHQgc2V0IHRoYXQgcmV0dXJucwotCSAqIHRoZSBmaXJzdCBvYmplY3QgaW4gZWFjaCByb3cgb2YgdGhlIHJlc3VsdCBzZXQuCi0JICovCi0JcHVibGljIFJlc3VsdFNldEl0ZXJhdG9yKFJlc3VsdFNldCByZXN1bHRTZXQpIHsKLQkJdGhpcyhyZXN1bHRTZXQsIEFkYXB0ZXIuRGVmYXVsdC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgbmV4dCBvYmplY3QgZm9yIHRoZSBpdGVyYXRvciB0byByZXR1cm4uCi0JICogQ2xvc2UgdGhlIHJlc3VsdCBzZXQgd2hlbiB3ZSByZWFjaCB0aGUgZW5kLgotCSAqLwotCXByaXZhdGUgRSBidWlsZE5leHQoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodGhpcy5yZXN1bHRTZXQubmV4dCgpKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGROZXh0KHRoaXMucmVzdWx0U2V0KTsKLQkJCX0KLQkJCXRoaXMucmVzdWx0U2V0LmNsb3NlKCk7Ci0JCQl0aGlzLmRvbmUgPSB0cnVlOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgcmV0dXJuIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIGN1cnJlbnQgcm93Ci0JICogb2YgdGhlIHJlc3VsdCBzZXQuIEFueSB7QGxpbmsgU1FMRXhjZXB0aW9ufXMgd2lsbAotCSAqIGJlIGNhdWdodCBhbmQgd3JhcHBlZCBpbiBhIHtAbGluayBSdW50aW1lRXhjZXB0aW9ufS4KLQkgKi8KLQlwcm90ZWN0ZWQgRSBidWlsZE5leHQoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5idWlsZE5leHQocnMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUUgdGVtcCA9IHRoaXMubmV4dDsKLQkJdGhpcy5uZXh0ID0gdGhpcy5idWlsZE5leHQoKTsKLQkJcmV0dXJuIHRlbXA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnJlc3VsdFNldCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2VkIGJ5IHtAbGluayBSZXN1bHRTZXRJdGVyYXRvcn0gdG8gY29udmVydCBhCi0JICoge0BsaW5rIFJlc3VsdFNldH0ncyBjdXJyZW50IHJvdyBpbnRvIHRoZSBuZXh0IG9iamVjdAotCSAqIHRvIGJlIHJldHVybmVkIGJ5IHRoZSB7QGxpbmsgSXRlcmF0b3J9LgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgQWRhcHRlcjxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhbiBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgcmVzdWx0IHNldCdzCi0JCSAqICJjdXJyZW50IiByb3cuIEFueSB7QGxpbmsgU1FMRXhjZXB0aW9ufXMgd2lsbAotCQkgKiBiZSBjYXVnaHQgYW5kIHdyYXBwZWQgaW4gYSB7QGxpbmsgUnVudGltZUV4Y2VwdGlvbn0uCi0JCSAqIEBzZWUgamF2YS5zcWwuUmVzdWx0U2V0Ci0JCSAqLwotCQlUIGJ1aWxkTmV4dChSZXN1bHRTZXQgcnMpIHRocm93cyBTUUxFeGNlcHRpb247Ci0KLQotCQlmaW5hbCBjbGFzcyBEZWZhdWx0PFM+IGltcGxlbWVudHMgQWRhcHRlcjxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBBZGFwdGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gQWRhcHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIERlZmF1bHQoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHJldHVybiB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBjdXJyZW50IHJvdyBvZiB0aGUgcmVzdWx0IHNldAotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgUyBidWlsZE5leHQoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJCQkvLyByZXN1bHQgc2V0IGNvbHVtbnMgYXJlIGluZGV4ZWQgc3RhcnRpbmcgd2l0aCAxCi0JCQkJcmV0dXJuIChTKSBycy5nZXRPYmplY3QoMSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJSZXN1bHRTZXRJdGVyYXRvci5BZGFwdGVyLkRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWU4OWNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRJdGVyYXRvcjwvY29kZT4gaG9sZHMgYSBzaW5nbGUgZWxlbWVudAotICogYW5kIHJldHVybnMgaXQgd2l0aCB0aGUgZmlyc3QgY2FsbCB0byB7QGxpbmsgbmV4dCgpfSwgYXQKLSAqIHdoaWNoIHBvaW50IGl0IHdpbGwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBhbnkgc3Vic2VxdWVudAotICogY2FsbCB0byB7QGxpbmsgI2hhc05leHQoKX0uCi0gKiA8cD4KLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudEl0ZXJhdG9yPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIHRoZQotICoge0BsaW5rIEl0ZXJhdG9yfSByZXR1cm5lZCBieToKLSAqIAl7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3NpbmdsZXRvbihlbGVtZW50KX08Y29kZT4uaXRlcmF0b3IoKTwvY29kZT4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBFIGVsZW1lbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgb25seSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCi0JICovCi0JcHVibGljIFNpbmdsZUVsZW1lbnRJdGVyYXRvcihFIGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5kb25lID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuICEgdGhpcy5kb25lOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmRvbmUpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDA3NjY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjwvY29kZT4gaG9sZHMgYSBzaW5nbGUgZWxlbWVudAotICogYW5kIHJldHVybnMgaXQgd2l0aCB0aGUgZmlyc3QgY2FsbCB0byB7QGxpbmsgbmV4dCgpfSwgYXQKLSAqIHdoaWNoIHBvaW50IGl0IHdpbGwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBhbnkgc3Vic2VxdWVudAotICogY2FsbCB0byB7QGxpbmsgI2hhc05leHQoKX0uIExpa2V3aXNlLCBpdCB3aWxsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLSAqIHRvIGEgY2FsbCB0byB7QGxpbmsgI2hhc1ByZXZpb3VzKCl9IHVudGlsIGEgY2FsbCB0byB7QGxpbmsgI25leHQoKX0sCi0gKiBhdCB3aGljaCBwb2ludCBhIGNhbGwgdG8ge0BsaW5rICNwcmV2aW91cygpfSB3aWxsIHJldHVybiB0aGUKLSAqIHNpbmdsZSBlbGVtZW50LgotICogPHA+Ci0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8gdGhlCi0gKiB7QGxpbmsgSXRlcmF0b3J9IHJldHVybmVkIGJ5OgotICogCXtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc2luZ2xldG9uTGlzdChlbGVtZW50KX08Y29kZT4ubGlzdEl0ZXJhdG9yKCk8L2NvZGU+Ci0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgRSBlbGVtZW50OwotCXByaXZhdGUgYm9vbGVhbiBoYXNOZXh0OwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcihFIGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5oYXNOZXh0ID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5oYXNOZXh0OwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmhhc05leHQpIHsKLQkJCXRoaXMuaGFzTmV4dCA9IGZhbHNlOwotCQkJcmV0dXJuIHRoaXMuZWxlbWVudDsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5oYXNOZXh0ID8gMCA6IDE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTmV4dDsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJaWYgKHRoaXMuaGFzTmV4dCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmhhc05leHQgPSB0cnVlOwotCQlyZXR1cm4gdGhpcy5lbGVtZW50OwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzTmV4dCA/IC0xIDogMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdGFja0l0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N0YWNrSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0M2ZhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N0YWNrSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5TdGFja0l0ZXJhdG9yPC9jb2RlPiBwcm92aWRlcyBhbiB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBmb3IgYSB7QGxpbmsgU3RhY2t9IG9mIG9iamVjdHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPi4gVGhlIHN0YWNrJ3MgZWxlbWVudHMKLSAqIGFyZSB7QGxpbmsgU3RhY2sjcG9wKCkgcG9wfXBlZCIgYXMgdGhlIGl0ZXJhdG9yIHJldHVybnMgdGhlbSB3aXRoCi0gKiBjYWxscyB0byB7QGxpbmsgI25leHQoKX0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgU3RhY2sKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN0YWNrSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFN0YWNrSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBTdGFjazxFPiBzdGFjazsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIHN0YWNrLgotCSAqLwotCXB1YmxpYyBTdGFja0l0ZXJhdG9yKFN0YWNrPEU+IHN0YWNrKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhY2sgPSBzdGFjazsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gISB0aGlzLnN0YWNrLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlyZXR1cm4gdGhpcy5zdGFjay5wb3AoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc3RhY2spOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdWJJdGVyYXRvcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3ViSXRlcmF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmNmY2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdWJJdGVyYXRvcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogV3JhcCBhbiBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvIGFuCi0gKiBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4gQXNzdW1lIHRoZSB3cmFwcGVkIGl0ZXJhdG9yCi0gKiByZXR1cm5zIG9ubHkgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uCi0gKiAKLSAqIEBwYXJhbSA8RTE+IGlucHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgd3JhcHBlZCBpdGVyYXRvcgotICogQHBhcmFtIDxFMj4gb3V0cHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViSXRlcmFibGVXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJJdGVyYXRvcldyYXBwZXI8RTEsIEUyPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RTI+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxFMT4gaXRlcmF0b3I7Ci0KLQotCXB1YmxpYyBTdWJJdGVyYXRvcldyYXBwZXIoSXRlcmFibGU8RTE+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIFN1Ykl0ZXJhdG9yV3JhcHBlcihJdGVyYXRvcjxFMT4gaXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgRTIgbmV4dCgpIHsKLQkJcmV0dXJuIChFMikgdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aGlzLml0ZXJhdG9yLnJlbW92ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdWJMaXN0SXRlcmF0b3JXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1Ykxpc3RJdGVyYXRvcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzllNWRiNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1Ykxpc3RJdGVyYXRvcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogV3JhcCBhIGxpc3QgaXRlcmF0b3Igb24gZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMTwvY29kZT4sIGNvbnZlcnRpbmcgaXQgaW50bwotICogYSBsaXN0IGl0ZXJhdG9yIG9uIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LiBBc3N1bWUgdGhlIHdyYXBwZWQKLSAqIGxpc3QgaXRlcmF0b3IgcmV0dXJucyBvbmx5IGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHdyYXBwZWQgbGlzdCBpdGVyYXRvcgotICogQHBhcmFtIDxFMj4gb3V0cHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJMaXN0SXRlcmFibGVXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJMaXN0SXRlcmF0b3JXcmFwcGVyPEUxLCBFMj4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjxFMT4gbGlzdEl0ZXJhdG9yOwotCi0KLQlwdWJsaWMgU3ViTGlzdEl0ZXJhdG9yV3JhcHBlcihMaXN0PEUxPiBsaXN0KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIFN1Ykxpc3RJdGVyYXRvcldyYXBwZXIoTGlzdEl0ZXJhYmxlPEUxPiBsaXN0SXRlcmFibGUpIHsKLQkJdGhpcyhsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIFN1Ykxpc3RJdGVyYXRvcldyYXBwZXIoTGlzdEl0ZXJhdG9yPEUxPiBpdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RJdGVyYXRvciA9IGl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEUyIG5leHQoKSB7Ci0JCXJldHVybiAoRTIpIHRoaXMubGlzdEl0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgRTIgcHJldmlvdXMoKSB7Ci0JCXJldHVybiAoRTIpIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhpcy5saXN0SXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUyIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChFMiBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubGlzdEl0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3VwZXJJdGVyYXRvcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3VwZXJJdGVyYXRvcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJmZDVmNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1cGVySXRlcmF0b3JXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBXcmFwIGFuIGl0ZXJhdG9yIG9uIGVsZW1lbnRzIG9mIGFueSBzdWItdHlwZSBvZiA8Y29kZT5FPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvIGFuCi0gKiBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LiBUaGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gc2luY2UgdGhlcmUKLSAqIGlzIG5vIHdheSB0byBhZGQgaW52YWxpZCBlbGVtZW50cyB0byB0aGUgaXRlcmF0b3IncyBiYWNraW5nIGNvbGxlY3Rpb24uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1cGVySXRlcmFibGVXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXBlckl0ZXJhdG9yV3JhcHBlcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcjsKLQotCi0JcHVibGljIFN1cGVySXRlcmF0b3JXcmFwcGVyKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBTdXBlckl0ZXJhdG9yV3JhcHBlcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aGlzLml0ZXJhdG9yLnJlbW92ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdXBlckxpc3RJdGVyYXRvcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3VwZXJMaXN0SXRlcmF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzODE3YWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdXBlckxpc3RJdGVyYXRvcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogV3JhcCBhIGxpc3QgaXRlcmF0b3Igb24gZWxlbWVudHMgb2YgYW55IHN1Yi10eXBlIG9mIDxjb2RlPkU8L2NvZGU+LCBjb252ZXJ0aW5nIGl0IGludG8gYQotICogbGlzdCBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LiBUaGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gc2luY2UgdGhlCi0gKiByZXN1bHRpbmcgbGlzdCBpdGVyYXRvciBkaXNhYmxlcyB0aGUgbWV0aG9kcyB0aGF0IHdvdWxkIHB1dCBpbnZhbGlkIGVsZW1lbnRzCi0gKiBpbiB0aGUgaXRlcmF0b3IncyBiYWNraW5nIGxpc3QgKGkuZS4ge0BsaW5rICNzZXQoRSl9IGFuZCB7QGxpbmsgI2FkZChFKX0pLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdXBlckxpc3RJdGVyYWJsZVdyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IGxpc3RJdGVyYXRvcjsKLQotCi0JcHVibGljIFN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlcihMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIFN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlcihMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGxpc3RJdGVyYWJsZSkgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU3VwZXJMaXN0SXRlcmF0b3JXcmFwcGVyKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbGlzdEl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdEl0ZXJhdG9yID0gbGlzdEl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhpcy5saXN0SXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RJdGVyYXRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZDVhZTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TeW5jaHJvbml6ZWRJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBXcmFwIGFuIGl0ZXJhdG9yIGFuZCBzeW5jaHJvbml6ZSBhbGwgaXRzIG1ldGhvZHMgc28gaXQgY2FuIGJlIHNhZmVseSBzaGFyZWQKLSAqIGFtb25nIG11bHRpcGxlIHRocmVhZHMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcjsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBPYmplY3QgbXV0ZXgpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpLCBtdXRleCk7Ci0JfQotCi0JcHVibGljIFN5bmNocm9uaXplZEl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCXRoaXMubXV0ZXggPSB0aGlzOwotCX0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIEUgbmV4dCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMuaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZExpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNmZmM5NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZExpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogV3JhcCBhIGxpc3QgaXRlcmF0b3IgYW5kIHN5bmNocm9uaXplIGFsbCBpdHMgbWV0aG9kcyBzbyBpdCBjYW4gYmUgc2FmZWx5IHNoYXJlZAotICogYW1vbmcgbXVsdGlwbGUgdGhyZWFkcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZExpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yOwotCi0JLyoqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBtdXRleDsKLQotCi0JcHVibGljIFN5bmNocm9uaXplZExpc3RJdGVyYXRvcihMaXN0PEU+IGxpc3QpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yKExpc3Q8RT4gbGlzdCwgT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSwgbXV0ZXgpOwotCX0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPEU+IGxpc3RJdGVyYWJsZSkgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yKExpc3RJdGVyYWJsZTxFPiBsaXN0SXRlcmFibGUsIE9iamVjdCBtdXRleCkgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpLCBtdXRleCk7Ci0JfQotCi0JcHVibGljIFN5bmNocm9uaXplZExpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdEl0ZXJhdG9yID0gbGlzdEl0ZXJhdG9yOwotCQl0aGlzLm11dGV4ID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RJdGVyYXRvciA9IGxpc3RJdGVyYXRvcjsKLQkJdGhpcy5tdXRleCA9IG11dGV4OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIEUgbmV4dCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgbmV4dEluZGV4KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRSBwcmV2aW91cygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmUoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy5saXN0SXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKEUgZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMubGlzdEl0ZXJhdG9yLmFkZChlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXQoRSBlKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy5saXN0SXRlcmF0b3Iuc2V0KGUpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RJdGVyYXRvcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODVkOTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci0KLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhdG9yfQotICogYW5kIHRyYW5zZm9ybXMgaXRzIHJlc3VsdHMgZm9yIGNsaWVudCBjb25zdW1wdGlvbi4gVG8gdXNlLCBzdXBwbHkgYSAKLSAqIHtAbGluayBUcmFuc2Zvcm1lcn0gb3Igc3ViY2xhc3MgPGNvZGU+VHJhbnNmb3JtYXRpb25JdGVyYXRvcjwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kLgotICogT2JqZWN0cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiBhcmUgdHJhbnNmb3JtZWQgaW50byBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+OwotICogaS5lLiB0aGUgaXRlcmF0b3IgcmV0dXJucyBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgdHJhbnNmb3JtZWQKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RTEsIEUyPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RTI+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IGl0ZXJhdG9yOwotCXByaXZhdGUgZmluYWwgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gdHJhbnNmb3JtZXI7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBhbmQgYSBkaXNhYmxlZCB0cmFuc2Zvcm1lci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgaXRlcmF0b3IKLQkgKiBhbmQgYSBkaXNhYmxlZCB0cmFuc2Zvcm1lci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IGl0ZXJhdG9yKSB7Ci0JCXRoaXMoaXRlcmF0b3IsIFRyYW5zZm9ybWVyLkRpc2FibGVkLjxFMSwgRTI+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEUxPiBpdGVyYWJsZSwgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgaXRlcmF0b3IKLQkgKiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEUxPiBpdGVyYXRvciwgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gdHJhbnNmb3JtZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl0aGlzLnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUyIG5leHQoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBuZXN0ZWQgaXRlcmF0b3IgYmVmb3JlIHJldHVybmluZyBpdAotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy5pdGVyYXRvci5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQl0aGlzLml0ZXJhdG9yLnJlbW92ZSgpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHJvdGVjdGVkIEUyIHRyYW5zZm9ybShFMSBuZXh0KSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXh0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4Y2Y2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbm90aGVyIHtAbGluayBMaXN0SXRlcmF0b3J9Ci0gKiBhbmQgdHJhbnNmb3JtcyBpdHMgcmVzdWx0cyBmb3IgY2xpZW50IGNvbnN1bXB0aW9uLiBUbyB1c2UsIHN1cHBseSBhIAotICoge0BsaW5rIFRyYW5zZm9ybWVyfSBvciBzdWJjbGFzcyA8Y29kZT5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPC9jb2RlPgotICogYW5kIG92ZXJyaWRlIHRoZSB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBtZXRob2QuCi0gKiA8cD4KLSAqIFRoZSBtZXRob2RzIHtAbGluayAjc2V0KE9iamVjdCl9IGFuZCB7QGxpbmsgI2FkZChPYmplY3QpfQotICogYXJlIGxlZnQgdW5zdXBwb3J0ZWQgaW4gdGhpcyBjbGFzcy4KLSAqIAotICogQHBhcmFtIDxFMT4gaW5wdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHRvIGJlIHRyYW5zZm9ybWVkCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8RTEsIEUyPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEUyPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbGlzdEl0ZXJhdG9yOwotCXByaXZhdGUgZmluYWwgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gdHJhbnNmb3JtZXI7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdAotCSAqIGFuZCBhIGRpc2FibGVkIHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFMT4gbGlzdCkgewotCQl0aGlzKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkIGxpc3RlZCBpdGVyYXRvcgotCSAqIGFuZCBhIGRpc2FibGVkIHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEUxPiBsaXN0SXRlcmF0b3IpIHsKLQkJdGhpcyhsaXN0SXRlcmF0b3IsIFRyYW5zZm9ybWVyLkRpc2FibGVkLjxFMSwgRTI+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0Ci0JICogYW5kIGEgZGlzYWJsZWQgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGxpc3RJdGVyYWJsZSkgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3QgYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFMT4gbGlzdCwgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gbGlzdEl0ZXJhYmxlLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgaXRlcmF0b3IKLQkgKiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IGxpc3RJdGVyYXRvciwgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gdHJhbnNmb3JtZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0SXRlcmF0b3IgPSBsaXN0SXRlcmF0b3I7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUyIG5leHQoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBuZXN0ZWQgaXRlcmF0b3IgYmVmb3JlIHJldHVybmluZyBpdAotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy5saXN0SXRlcmF0b3IubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIEUyIHByZXZpb3VzKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgbmVzdGVkIGl0ZXJhdG9yIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChFMiBvKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFMiBvKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQl0aGlzLmxpc3RJdGVyYXRvci5yZW1vdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm0oRTEgbmV4dCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJlZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OTQ5MDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlRyZWVJdGVyYXRvcjwvY29kZT4gc2ltcGxpZmllcyB0aGUgdHJhdmVyc2FsIG9mIGEKLSAqIHRyZWUgb2Ygb2JqZWN0cywgd2hlcmUgdGhlIG9iamVjdHMnIHByb3RvY29sKHMpIHByb3ZpZGVzCi0gKiBhIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbgotICogbm9kZSBidXQgZG9lcyBub3QgcHJvdmlkZSBhIG1ldGhvZCBmb3IgZ2V0dGluZyBhbGwgdGhlCi0gKiBkZXNjZW5kYW50cyAoY2hpbGRyZW4sIGdyYW5kY2hpbGRyZW4sIGV0Yy4pIG9mIHRoZSBnaXZlbiBub2RlLgotICogPHA+Ci0gKiBUbyB1c2UsIHN1cHBseTo8dWw+Ci0gKiA8bGk+IGVpdGhlciB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSB0cmVlIG9yLCBpZiB0aGUgdHJlZSBoYXMKLSAqIG11bHRpcGxlIHJvb3RzLCBhbiB7QGxpbmsgSXRlcmF0b3J9IG92ZXIgdGhlIHNldCBvZiByb290cwotICogPGxpPiBhIHtAbGluayBNaWR3aWZlfSB0aGF0IGRlbGl2ZXJzIHRoZSBjaGlsZHJlbgotICogb2YgZWFjaCBjaGlsZAotICogKGFsdGVybmF0aXZlbHksIHN1YmNsYXNzIDxjb2RlPlRyZWVJdGVyYXRvcjwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICNjaGlsZHJlbihPYmplY3QpfSBtZXRob2QpCi0gKiA8L3VsPgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmVlSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFRyZWVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnM7Ci0JcHJpdmF0ZSBmaW5hbCBNaWR3aWZlPEU+IG1pZHdpZmU7Ci0JcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY3VycmVudEl0ZXJhdG9yOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIHRyZWUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRpc2FibGVkIG1pZHdpZmUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNjaGlsZHJlbihPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIE1pZHdpZmV9LgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmF0b3IoRS4uLiByb290cykgewotCQl0aGlzKG5ldyBBcnJheUl0ZXJhdG9yPEU+KHJvb3RzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSB0cmVlCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBkaXNhYmxlZCBtaWR3aWZlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBNaWR3aWZlfS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiByb290cykgewotCQl0aGlzKHJvb3RzLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgdHJlZQotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgZGlzYWJsZWQgbWlkd2lmZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI2NoaWxkcmVuKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gcm9vdHMpIHsKLQkJdGhpcyhyb290cywgTWlkd2lmZS5EaXNhYmxlZC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIHRyZWUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdCBhbmQgYSBkaXNhYmxlZCBtaWR3aWZlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBNaWR3aWZlfS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEUgcm9vdCkgewotCQl0aGlzKHJvb3QsIE1pZHdpZmUuRGlzYWJsZWQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSB0cmVlCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QgYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihFIHJvb3QsIE1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4ocm9vdCksIG1pZHdpZmUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgdHJlZQotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290cyBhbmQgbWlkd2lmZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEVbXSByb290cywgTWlkd2lmZTxFPiBtaWR3aWZlKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmF0b3I8RT4ocm9vdHMpLCBtaWR3aWZlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIHRyZWUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHMsIE1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQl0aGlzKHJvb3RzLml0ZXJhdG9yKCksIG1pZHdpZmUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgdHJlZQotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290cyBhbmQgbWlkd2lmZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiByb290cywgTWlkd2lmZTxFPiBtaWR3aWZlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY3VycmVudEl0ZXJhdG9yID0gcm9vdHM7Ci0JCS8vIHVzZSBhIExpbmtlZExpc3Qgc2luY2Ugd2Ugd2lsbCBiZSBwdWxsaW5nIG9mZiB0aGUgZnJvbnQgYW5kIGFkZGluZyB0byB0aGUgZW5kCi0JCXRoaXMuaXRlcmF0b3JzID0gbmV3IExpbmtlZExpc3Q8SXRlcmF0b3I8PyBleHRlbmRzIEU+PigpOwotCQl0aGlzLm1pZHdpZmUgPSBtaWR3aWZlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yIDogdGhpcy5pdGVyYXRvcnMpIHsKLQkJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRoaXMubmV4dEludGVybmFsKCk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjxJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IHN0cmVhbSA9IHRoaXMuaXRlcmF0b3JzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJc3RyZWFtLnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLm5leHRJbnRlcm5hbCgpOwotCX0KLQotCS8qKgotCSAqIEZldGNoIHRoZSBjaGlsZHJlbiBvZiB0aGUgbmV4dCBub2RlIGJlZm9yZSByZXR1cm5pbmcgaXQuCi0JICovCi0JcHJpdmF0ZSBFIG5leHRJbnRlcm5hbCgpIHsKLQkJRSBuZXh0ID0gdGhpcy5jdXJyZW50SXRlcmF0b3IubmV4dCgpOwotCQl0aGlzLml0ZXJhdG9ycy5hZGQodGhpcy5jaGlsZHJlbihuZXh0KSk7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhpcy5jdXJyZW50SXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIE1pZHdpZmV9LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY2hpbGRyZW4oRSBuZXh0KSB7Ci0JCXJldHVybiB0aGlzLm1pZHdpZmUuY2hpbGRyZW4obmV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5jdXJyZW50SXRlcmF0b3IpOwotCX0KLQotCi0JLy8qKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSB7QGxpbmsgVHJlZUl0ZXJhdG9yfSB0byByZXRyaWV2ZQotCSAqIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgYSBub2RlIGluIHRoZSB0cmVlLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTWlkd2lmZTxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCQkgKi8KLQkJSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGNoaWxkcmVuKFQgbyk7Ci0KLQotCQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgTWlkd2lmZTxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBNaWR3aWZlIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gTWlkd2lmZTxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIE51bGwoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHJldHVybiBubyBuZWlnaGJvcnMKLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBjaGlsZHJlbihTIG5leHQpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVHJlZUl0ZXJhdG9yLk1pZHdpZmUuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIG1pZHdpZmUgdXNlZCB3aGVuIHRoZSB7QGxpbmsgVHJlZUl0ZXJhdG9yI2NoaWxkcmVuKE9iamVjdCl9Ci0JCSAqIG1ldGhvZCBpcyBvdmVycmlkZGVuLgotCQkgKi8KLQkJZmluYWwgY2xhc3MgRGlzYWJsZWQ8Uz4gaW1wbGVtZW50cyBNaWR3aWZlPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1pZHdpZmUgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gTWlkd2lmZTxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBjaGlsZHJlbihTIG5leHQpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgIC8vIFRyZWVJdGVyYXRvci5jaGlsZHJlbihPYmplY3QpIHdhcyBub3QgaW1wbGVtZW50ZWQKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlRyZWVJdGVyYXRvci5NaWR3aWZlLkRpc2FibGVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL0Fic3RyYWN0TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkMzFmYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBSZWFzb25hYmxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgTW9kZWx9IHByb3RvY29sCi0gKiB3aXRoIG51bWVyb3VzIGNvbnZlbmllbmNlIG1ldGhvZHMuCi0gKiAKLSAqIEBzZWUgQ2hhbmdlU3VwcG9ydAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgTW9kZWwKLXsKLQkvKioKLQkgKiBEZWxlZ2F0ZSBzdGF0ZS9wcm9wZXJ0eS9jb2xsZWN0aW9uL2xpc3QvdHJlZSBjaGFuZ2Ugc3VwcG9ydCB0byB0aGlzCi0JICogaGVscGVyIG9iamVjdC4gVGhlIGNoYW5nZSBzdXBwb3J0IG9iamVjdCBpcyAibGF6aWx5LWluaXRpYWxpemVkIjsKLQkgKiBzbyBpdCBtYXkgYmUgbnVsbC4gVGhlIG1ldGhvZCB7QGxpbmsgI2dldENoYW5nZVN1cHBvcnQoKX0gd2lsbCBpbml0aWFsaXplIHRoaXMKLQkgKiBmaWVsZCBpZiBpdCBpcyBudWxsLgotCSAqIAotCSAqIE5COiBXZSBpbnN0YW50aWF0ZSB0aGlzIHdoZW4gd2UgZmlyZSBldmVudHMsIGV2ZW4gd2hlbiB3ZSBkbyBub3QgaGF2ZQotCSAqIGFueSBsaXN0ZW5lcnMgKHdoaWNoIGlzIGJlIGltcGxpZWQgaWYgdGhpcyBpcyBudWxsKS4KLQkgKiBUaGlzIGFsbG93cyB0aGUgY2hhbmdlIHN1cHBvcnQgdG8gaGF2ZSBiZWhhdmlvciB0aWVkIHRvIGV2ZW50cyBldmVuIHdoZW4KLQkgKiB3ZSBoYXZlIG5vIGxpc3RlbmVycy4KLQkgKiBAc2VlIENhbGxiYWNrQ2hhbmdlU3VwcG9ydCNhc3BlY3RDaGFuZ2VkKFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBjaGFuZ2VTdXBwb3J0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdE1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWNjZXNzb3Igd2lsbCBidWlsZCB0aGUgY2hhbmdlIHN1cHBvcnQgd2hlbiByZXF1aXJlZC4KLQkgKiBUaGlzIG9ubHkgaGVscHMgcmVkdWNlIHRoZSBmb290cHJpbnQgb2YgYSBtb2RlbCB0aGF0IG5laXRoZXIgaGFzIGFueQotCSAqIGxpc3RlbmVycyBhZGRlZCB0byBpdCBub3IgZXZlciBjaGFuZ2VzIChmaXJlcyBhbnkgZXZlbnRzKS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIENoYW5nZVN1cHBvcnQgZ2V0Q2hhbmdlU3VwcG9ydCgpIHsKLQkJaWYgKHRoaXMuY2hhbmdlU3VwcG9ydCA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoYW5nZVN1cHBvcnQgPSB0aGlzLmJ1aWxkQ2hhbmdlU3VwcG9ydCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoYW5nZVN1cHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogQWxsb3cgc3ViY2xhc3NlcyB0byB0d2VhayB0aGUgY2hhbmdlIHN1cHBvcnQgdXNlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlU3VwcG9ydCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIGFueSBjaGFuZ2UgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuICh0aGlzLmNoYW5nZVN1cHBvcnQgIT0gbnVsbCkgJiYgdGhpcy5jaGFuZ2VTdXBwb3J0Lmhhc0FueUNoYW5nZUxpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgbm8gY2hhbmdlIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOb0NoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlDaGFuZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIGFueSBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gKHRoaXMuY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiB0aGlzLmNoYW5nZVN1cHBvcnQuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIHN0YXRlIGNoYW5nZSBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9TdGF0ZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgYW55IHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuICh0aGlzLmNoYW5nZVN1cHBvcnQgIT0gbnVsbCkgJiYgdGhpcy5jaGFuZ2VTdXBwb3J0Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIGltcGxpZWQgPGNvZGU+bnVsbDwvY29kZT4gIm9sZCIgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBudWxsLCBuZXdWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIGFueSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuICh0aGlzLmNoYW5nZVN1cHBvcnQgIT0gbnVsbCkgJiYgdGhpcy5jaGFuZ2VTdXBwb3J0Lmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgbm8gY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBhZGRlZEl0ZW1zKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc0FkZGVkKGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW1zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IGFkZGVkSXRlbSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbUFkZGVkKGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW0pOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IHJlbW92ZWRJdGVtcykgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtUmVtb3ZlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCByZW1vdmVkSXRlbSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbVJlbW92ZWQoY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlQ29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlQ29sbGVjdGlvbkNsZWFyZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlQ29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlQ29sbGVjdGlvbkNoYW5nZWQoY29sbGVjdGlvbk5hbWUsIGNvbGxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtVG9Db2xsZWN0aW9uKEUgaXRlbSwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oaXRlbSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbihFW10gaXRlbXMsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtc1RvQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKE9iamVjdCBpdGVtLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKGl0ZW0sIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKE9iamVjdFtdIGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oQ29sbGVjdGlvbjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKEl0ZXJhYmxlPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oSXRlcmF0b3I8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oT2JqZWN0W10gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKENvbGxlY3Rpb248Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKEl0ZXJhYmxlPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luQ29sbGVjdGlvbihJdGVyYXRvcjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2xlYXJDb2xsZWN0aW9uKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5jbGVhckNvbGxlY3Rpb24oY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxFPiBuZXdDb2xsZWN0aW9uLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuc3luY2hyb25pemVDb2xsZWN0aW9uKG5ld0NvbGxlY3Rpb24sIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uKEl0ZXJhdG9yPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZExpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBhbnkgbGlzdCBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCBsaXN0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiAodGhpcy5jaGFuZ2VTdXBwb3J0ICE9IG51bGwpICYmIHRoaXMuY2hhbmdlU3VwcG9ydC5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIGxpc3QgY2hhbmdlIGxpc3RlbmVycyB0aGF0IHdpbGwKLQkgKiBiZSBub3RpZmllZCB3aGVuIHRoZSBzcGVjaWZpZWQgbGlzdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc0FkZGVkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbXNBZGRlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBhZGRlZEl0ZW1zKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1BZGRlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IGFkZGVkSXRlbSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IHJlbW92ZWRJdGVtcykgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCByZW1vdmVkSXRlbSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbVJlbW92ZWQobGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZXBsYWNlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIDxFPiB2b2lkIGZpcmVJdGVtc1JlcGxhY2VkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8gZXh0ZW5kcyBFPiBuZXdJdGVtcywgTGlzdDxFPiByZXBsYWNlZEl0ZW1zKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc1JlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIHJlcGxhY2VkSXRlbXMpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBuZXdJdGVtLCBPYmplY3QgcmVwbGFjZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtUmVwbGFjZWQobGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtLCByZXBsYWNlZEl0ZW0pOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCA8RT4gdm9pZCBmaXJlSXRlbXNNb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc01vdmVkKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1Nb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtTW92ZWQobGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVMaXN0Q2xlYXJlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUxpc3RDbGVhcmVkKFN0cmluZyBsaXN0TmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTGlzdENsZWFyZWQobGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVMaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUxpc3RDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTGlzdENoYW5nZWQoU3RyaW5nIGxpc3ROYW1lLCBMaXN0PD8+IGxpc3QpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUxpc3RDaGFuZ2VkKGxpc3ROYW1lLCBsaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IHZvaWQgYWRkSXRlbVRvTGlzdChpbnQgaW5kZXgsIEUgaXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbVRvTGlzdChpbmRleCwgaXRlbSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtVG9MaXN0KEUgaXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1Ub0xpc3QoaXRlbSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIEVbXSBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCBpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0xpc3QoaW5kZXgsIGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0xpc3QoaW5kZXgsIGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0xpc3QoaW5kZXgsIGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEVbXSBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0xpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0xpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0xpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IEUgcmVtb3ZlSXRlbUZyb21MaXN0KGludCBpbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1Gcm9tTGlzdChPYmplY3QgaXRlbSwgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1Gcm9tTGlzdChpdGVtLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFPiBMaXN0PEU+IHJlbW92ZUl0ZW1zRnJvbUxpc3QoaW50IGluZGV4LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tTGlzdChpbmRleCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gTGlzdDxFPiByZW1vdmVJdGVtc0Zyb21MaXN0KGludCBpbmRleCwgaW50IGxlbmd0aCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUxpc3QoaW5kZXgsIGxlbmd0aCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUxpc3QoT2JqZWN0W10gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtc0Zyb21MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChDb2xsZWN0aW9uPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tTGlzdChpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUxpc3QoSXRlcmFibGU8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtc0Zyb21MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUxpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChPYmplY3RbXSBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJldGFpbkl0ZW1zSW5MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3QoQ29sbGVjdGlvbjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJldGFpbkl0ZW1zSW5MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3QoSXRlcmFibGU8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXRhaW5JdGVtc0luTGlzdChpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbkl0ZW1zSW5MaXN0KEl0ZXJhdG9yPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmV0YWluSXRlbXNJbkxpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IEUgc2V0SXRlbUluTGlzdChpbnQgaW5kZXgsIEUgaXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnNldEl0ZW1Jbkxpc3QoaW5kZXgsIGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IGludCByZXBsYWNlSXRlbUluTGlzdChFIG9sZEl0ZW0sIEUgbmV3SXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlcGxhY2VJdGVtSW5MaXN0KG9sZEl0ZW0sIG5ld0l0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8RT4gc2V0SXRlbXNJbkxpc3QoaW50IGluZGV4LCBFW10gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zZXRJdGVtc0luTGlzdChpbmRleCwgaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8RT4gc2V0SXRlbXNJbkxpc3QoaW50IGluZGV4LCBMaXN0PD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnNldEl0ZW1zSW5MaXN0KGluZGV4LCBpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gdm9pZCBtb3ZlSXRlbXNJbkxpc3QoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLm1vdmVJdGVtc0luTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gdm9pZCBtb3ZlSXRlbUluTGlzdChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2xlYXJMaXN0KExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5jbGVhckxpc3QobGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUxpc3QoTGlzdDxFPiBuZXdMaXN0LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuc3luY2hyb25pemVMaXN0KG5ld0xpc3QsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gc3luY2hyb25pemVMaXN0KEl0ZXJhdG9yPEU+IG5ld0xpc3QsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zeW5jaHJvbml6ZUxpc3QobmV3TGlzdCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmVlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgdHJlZU5hbWUsIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHRyZWVOYW1lLCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBhbnkgdHJlZSBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCB0cmVlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXJldHVybiAodGhpcy5jaGFuZ2VTdXBwb3J0ICE9IG51bGwpICYmIHRoaXMuY2hhbmdlU3VwcG9ydC5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIHRyZWUgY2hhbmdlIGxpc3RlbmVycyB0aGF0IHdpbGwKLQkgKiBiZSBub3RpZmllZCB3aGVuIHRoZSBzcGVjaWZpZWQgdHJlZSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOb1RyZWVDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZU5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZU5vZGVBZGRlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZU5vZGVBZGRlZChTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTm9kZUFkZGVkKHRyZWVOYW1lLCBwYXRoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlUmVtb3ZlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVUcmVlQ2xlYXJlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVRyZWVDbGVhcmVkKFN0cmluZyB0cmVlTmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlVHJlZUNsZWFyZWQodHJlZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVUcmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVRyZWVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlVHJlZUNoYW5nZWQoU3RyaW5nIHRyZWVOYW1lLCBDb2xsZWN0aW9uPD8+IG5vZGVzKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVUcmVlQ2hhbmdlZCh0cmVlTmFtZSwgbm9kZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWVzIGFyZSBlcXVhbCwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgPGNvZGU+bnVsbDwvY29kZT4gY2hlY2tzLgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBhdHRyaWJ1dGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICogPHA+Ci0JICogPGVtPkRvIG5vdDwvZW0+IHVzZSB0aGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGZpcmUgYSBjaGFuZ2Ugbm90aWZpY2F0aW9uLAotCSAqIHtAbGluayBDaGFuZ2VTdXBwb3J0fSBhbHJlYWR5IGRvZXMgdGhhdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB2YWx1ZXNBcmVFcXVhbChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS52YWx1ZXNBcmVFcXVhbCh2YWx1ZTEsIHZhbHVlMik7Ci0JfQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gdGhpcy52YWx1ZXNBcmVFcXVhbChvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgPGNvZGU+bnVsbDwvY29kZT4gY2hlY2tzLgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBhdHRyaWJ1dGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICogPHA+Ci0JICogPGVtPkRvIG5vdDwvZW0+IHVzZSB0aGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGZpcmUgYSBjaGFuZ2Ugbm90aWZpY2F0aW9uLAotCSAqIHtAbGluayBDaGFuZ2VTdXBwb3J0fSBhbHJlYWR5IGRvZXMgdGhhdC4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSwgYWZ0ZXIgZmlyaW5nIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uLCB5b3UgY2FuIHVzZSB0aGlzIG1ldGhvZAotCSAqIHRvIGRlY2lkZSBpZiBzb21lIG90aGVyLCByZWxhdGVkLCBwaWVjZSBvZiBzdGF0ZSBuZWVkcyB0byBiZSBzeW5jaHJvbml6ZWQKLQkgKiB3aXRoIHRoZSBzdGF0ZSB0aGF0IGp1c3QgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB2YWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkudmFsdWVzQXJlRGlmZmVyZW50KHZhbHVlMSwgdmFsdWUyKTsKLQl9Ci0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlc0FyZURpZmZlcmVudChvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsdGhvdWdoIGNsb25pbmcgbW9kZWxzIGlzIHVzdWFsbHkgbm90IGEgR29vZCBJZGVhLAotCSAqIHdlIHNob3VsZCBhdCBsZWFzdCBzdXBwb3J0IGl0IHByb3Blcmx5LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdE1vZGVsIGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RNb2RlbCBjbG9uZSA9IChBYnN0cmFjdE1vZGVsKSBzdXBlci5jbG9uZSgpOwotCQkvLyBjbGVhciBvdXQgY2hhbmdlIHN1cHBvcnQgLSBtb2RlbHMgZG8gbm90IHNoYXJlIGxpc3RlbmVycwotCQljbG9uZS5jaGFuZ2VTdXBwb3J0ID0gbnVsbDsKLQkJcmV0dXJuIGNsb25lOwotCX0KLQotCS8qKgotCSAqIGUuZy4gPGNvZGU+IkNsYXNzTmFtZVswMEYzRUU0Ml0oYWRkJ2wgaW5mbykiPC9jb2RlPgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5idWlsZFNpbXBsZVRvU3RyaW5nT24odGhpcywgc2IpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJaW50IGxlbiA9IHNiLmxlbmd0aCgpOwotCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJaWYgKHNiLmxlbmd0aCgpID09IGxlbikgewotCQkJc2IuZGVsZXRlQ2hhckF0KGxlbiAtIDEpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgcHVibGljIHNvIG9uZSBtb2RlbCBjYW4gY2FsbCBhIG5lc3RlZCBtb2RlbCdzCi0JICogPGNvZGU+I3RvU3RyaW5nKFN0cmluZ0J1aWxkZXIpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nQnVpbGRlciBzYikgewotCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGRvIHNvbWV0aGluZyBhIGJpdCBtb3JlIGhlbHBmdWwKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9DYWxsYmFja0NoYW5nZVN1cHBvcnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9DYWxsYmFja0NoYW5nZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkOWI0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogVGhpcyBjaGFuZ2Ugc3VwcG9ydCBjbGFzcyB3aWxsIG5vdGlmeSBsaXN0ZW5lcnMgd2hlbmV2ZXIgb25lIG9mIHRoZSBzb3VyY2UncwotICogYXNwZWN0cyBoYXMgY2hhbmdlZC4gT25seSB0aGUgYXNwZWN0IG5hbWUgaXMgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lcjsgbm8KLSAqIGV2ZW50IGlzIGdlbmVyYXRlZC4gVGhpcyBhbGxvd3MgdGhlIGxpc3RlbmVycyB0byBkZWxlZ2F0ZSB0byB0aGUgY2hhbmdlCi0gKiBzdXBwb3J0IG9iamVjdCB2ZXJpZmljYXRpb24gdGhhdCBhbiBhc3BlY3QgYXMgYWN0dWFsbHkgY2hhbmdlZC4gVGhpcyBpcwotICogdXNlZnVsIGZvciBzaW1wbGUgdGhpbmdzIGxpa2Ugc2V0dGluZyBkaXJ0eSBmbGFncywgYmxhbmtldCB2YWxpZGF0aW9uLCBhbmQKLSAqIGJsYW5rZXQgc3ljaHJvbml6YXRpb247IGkuZS4gdGhpbmdzIHRoYXQgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiB0aGUgPGVtPm5hbWU8L2VtPgotICogb2YgdGhlIGFzcGVjdCB0aGF0IGNoYW5nZWQgYnV0IG5vdCBzbyBtdWNoIDxlbT5ob3c8L2VtPiB0aGUgYXNwZWN0IGNoYW5nZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWxsYmFja0NoYW5nZVN1cHBvcnQKLQlleHRlbmRzIENoYW5nZVN1cHBvcnQKLXsKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCXB1YmxpYyBDYWxsYmFja0NoYW5nZVN1cHBvcnQoTW9kZWwgc291cmNlLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzKHNvdXJjZSk7Ci0JCXRoaXMuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBDYWxsYmFja0NoYW5nZVN1cHBvcnQoTW9kZWwgc291cmNlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlmb3IgKExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCWxpc3RlbmVyLmFzcGVjdENoYW5nZWQoYXNwZWN0TmFtZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBMaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgb2YgYW55IGFzcGVjdCBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQotCQkvKioKLQkJICogVGhlIHNwZWNpZmllZCBhc3BlY3QgY2hhbmdlZC4KLQkJICovCi0JCXZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSk7Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVTdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLQkJc3VwZXIuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRfKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRfKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWRfKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZF8oU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZF8ocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkXyhTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWRfKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zQWRkZWRfKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlSXRlbXNBZGRlZF8oZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zQWRkZWRfKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBhZGRlZEl0ZW1zKSB7Ci0JCXN1cGVyLmZpcmVJdGVtc0FkZGVkXyhjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1BZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLQkJc3VwZXIuZmlyZUl0ZW1BZGRlZChjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZW1vdmVkXyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZF8oU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IHJlbW92ZWRJdGVtcykgewotCQlzdXBlci5maXJlSXRlbXNSZW1vdmVkXyhjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW1zKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgcmVtb3ZlZEl0ZW0pIHsKLQkJc3VwZXIuZmlyZUl0ZW1SZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNsZWFyZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXN1cGVyLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChjb2xsZWN0aW9uTmFtZSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSwgY29sbGVjdGlvbik7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zQWRkZWRfKExpc3RBZGRFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlSXRlbXNBZGRlZF8oZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zQWRkZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGFkZGVkSXRlbXMpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zQWRkZWRfKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1BZGRlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IGFkZGVkSXRlbSkgewotCQlzdXBlci5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZW1vdmVkXyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlbW92ZWRfKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCByZW1vdmVkSXRlbSkgewotCQlzdXBlci5maXJlSXRlbVJlbW92ZWQobGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVwbGFjZWRfKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldExpc3ROYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlcGxhY2VkXyhTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBuZXdJdGVtcywgTGlzdDw/PiByZXBsYWNlZEl0ZW1zKSB7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlcGxhY2VkXyhsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW1zLCByZXBsYWNlZEl0ZW1zKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbVJlcGxhY2VkXyhTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IG5ld0l0ZW0sIE9iamVjdCByZXBsYWNlZEl0ZW0pIHsKLQkJc3VwZXIuZmlyZUl0ZW1SZXBsYWNlZF8obGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtLCByZXBsYWNlZEl0ZW0pOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc01vdmVkXyhMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVJdGVtc01vdmVkXyhldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNNb3ZlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlzdXBlci5maXJlSXRlbXNNb3ZlZF8obGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldExpc3ROYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2xlYXJlZChTdHJpbmcgbGlzdE5hbWUpIHsKLQkJc3VwZXIuZmlyZUxpc3RDbGVhcmVkKGxpc3ROYW1lKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVMaXN0Q2hhbmdlZChldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENoYW5nZWQoU3RyaW5nIGxpc3ROYW1lLCBMaXN0PD8+IGxpc3QpIHsKLQkJc3VwZXIuZmlyZUxpc3RDaGFuZ2VkKGxpc3ROYW1lLCBsaXN0KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJlZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlTm9kZUFkZGVkKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlQWRkZWQoU3RyaW5nIHRyZWVOYW1lLCBMaXN0PD8+IHBhdGgpIHsKLQkJc3VwZXIuZmlyZU5vZGVBZGRlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZCh0cmVlTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlTm9kZVJlbW92ZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0JCXN1cGVyLmZpcmVOb2RlUmVtb3ZlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZCh0cmVlTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVUcmVlQ2xlYXJlZChldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRUcmVlTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNsZWFyZWQoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXN1cGVyLmZpcmVUcmVlQ2xlYXJlZCh0cmVlTmFtZSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZCh0cmVlTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlVHJlZUNoYW5nZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFN0cmluZyB0cmVlTmFtZSwgQ29sbGVjdGlvbjw/PiBub2RlcykgewotCQlzdXBlci5maXJlVHJlZUNoYW5nZWQodHJlZU5hbWUsIG5vZGVzKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKHRyZWVOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9DaGFuZ2VTdXBwb3J0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWNmYWMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9DaGFuZ2VTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFN1cHBvcnQgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYnkgaW1wbGVtZW50b3JzIG9mIHRoZSB7QGxpbmsgTW9kZWx9IGludGVyZmFjZS4KLSAqIEl0IHByb3ZpZGVzIGZvciBzdGF0ZSwgcHJvcGVydHksIGNvbGxlY3Rpb24sIGxpc3QsIGFuZCB0cmVlIGNoYW5nZSBub3RpZmljYXRpb25zIHRvCi0gKiBsaXN0ZW5lcnMuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkIxOjwvc3Ryb25nPiBUaGVyZSBpcyBsb3RzIG9mIGNvcHktbi1wYXN0ZSBjb2RlIGluIHRoaXMgY2xhc3MuIE5lYXJseSBhbGwgb2YgdGhpcyBkdXBsaWNhdGlvbgotICogaXMgYW4gZWZmb3J0IHRvIHByZXZlbnQgdGhlIHVubmVjZXNzYXJ5IGNyZWF0aW9uIG9mIG5ldyBvYmplY3RzICh0eXBpY2FsbHkgZXZlbnQKLSAqIG9iamVjdHMpLiBTaW5jZSBtYW55IGV2ZW50cyBhcmUgZmlyZWQgd2hlbiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzLCB3ZSBwb3N0cG9uZQotICogdGhlIGNyZWF0aW9uIG9mIGV2ZW50IG9iamVjdHMgdW50aWwgd2Uga25vdyB3ZSBoYXZlIGludGVyZXN0ZWQgbGlzdGVuZXJzLgotICogTW9zdCBtZXRob2RzIGhhdmUgdGhlICJub24tZHVwbGljYXRlZCIgdmVyc2lvbiBvZiB0aGUgbWV0aG9kIGJvZHkgY29tbWVudGVkCi0gKiBvdXQgYXQgdGhlIHRvcCBvZiB0aGUgY3VycmVudCBtZXRob2QgYm9keS4KLSAqIFRoZSBob3BlIHdhcyB0aGF0IHRoaXMgY2xhc3Mgd291bGQgcHJvdmUgdG8gYmUgZmFpcmx5IHN0YXRpYyBhbmQgdGhlIGR1cGxpY2F0ZWQKLSAqIGNvZGUgd291bGQgbm90IHByb3ZlIG9uZXJvdXM7IGJ1dCB0aGF0IGhhcyBub3QgcHJvdmVuIHRvIGJlCi0gKiB0aGUgY2FzZSwgYXMgd2UgaGF2ZSBhZGRlZCBzdXBwb3J0IGZvciAic3RhdGUiIGNoYW5nZXMsICJkaXJ0eSIgbm90aWZpY2F0aW9uLAotICogYW5kIGN1c3RvbSAibm90aWZpZXJzIiwgd2l0aCBtb3JlIHRvIGNvbWUsIEknbSBzdXJlLi4uLiAgfmJqdgotICogPHA+Ci0gKiA8c3Ryb25nPk5CMjo8L3N0cm9uZz4gVGhpcyBjbGFzcyB3aWxsIGNoZWNrIHRvIHNlZSBpZiwgZHVyaW5nIHRoZSBmaXJpbmcgb2YgZXZlbnRzLCBhIGxpc3RlbmVyCi0gKiBvbiB0aGUgb3JpZ2luYWwsIGNsb25lZCwgbGlzdCBvZiBsaXN0ZW5lcnMgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtYXN0ZXIKLSAqIGxpc3Qgb2YgbGlzdGVuZXJzIDxlbT5iZWZvcmU8L2VtPiBpdCBpcyBub3RpZmllZC4gSWYgdGhlIGxpc3RlbmVyIGhhcyBiZWVuIHJlbW92ZWQKLSAqICJjb25jdXJyZW50bHkiIGl0IHdpbGwgPGVtPm5vdDwvZW0+IGJlIG5vdGlmaWVkLgotICogPHA+Ci0gKiA8c3Ryb25nPk5CMzo8L3N0cm9uZz4gQW55IGxpc3RlbmVyIHRoYXQgaXMgYWRkZWQgZHVyaW5nIHRoZSBmaXJpbmcgb2YgZXZlbnRzIHdpbGwgPGVtPm5vdDwvZW0+IGJlCi0gKiBhbHNvIG5vdGlmaWVkLiBUaGlzIGlzIGEgYml0IGluY29uc2lzdGVudCB3aXRoIE5CMiwgYnV0IHNlZW1zIHJlYXNvbmFibGUKLSAqIHNpbmNlIGFueSBhZGRlZCBsaXN0ZW5lciBzaG91bGQgYWxyZWFkeSBiZSBpbiBzeW5jaCB3aXRoIHRoZSBtb2RlbC4KLSAqIDxwPgotICogPHN0cm9uZz5OQjQ6PC9zdHJvbmc+IFRoaXMgY2xhc3MgaXMgc2VyaWFsaXphYmxlLCBidXQgaXQgd2lsbCBvbmx5IHdyaXRlIG91dCBsaXN0ZW5lcnMgdGhhdAotICogYXJlIGFsc28gc2VyaWFsaXphYmxlIHdoaWxlIHNpbGVudGx5IGxlYXZpbmcgYmVoaW5kIGxpc3RlbmVycyB0aGF0IGFyZSBub3QuCi0gKiAKLSAqIEBzZWUgTW9kZWwKLSAqIEBzZWUgQWJzdHJhY3RNb2RlbAotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlU3VwcG9ydAotCWltcGxlbWVudHMgU2VyaWFsaXphYmxlCi17Ci0JLyoqIFRoZSBvYmplY3QgdG8gYmUgcHJvdmlkZWQgYXMgdGhlICJzb3VyY2UiIGZvciBhbnkgZ2VuZXJhdGVkIGV2ZW50cy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTW9kZWwgc291cmNlOwotCi0JLyoqIEFzc29jaWF0ZSBhc3BlY3QgbmFtZXMgdG8gY2xhc3Mtc3BlY2lmaWMgbGlzdGVuZXIgbGlzdHMuICovCi0JcHJpdmF0ZSBBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPD8+W10gYXNwZWN0TGlzdGVuZXJMaXN0UGFpcnMgPSBFTVBUWV9BU1BFQ1RfTElTVEVORVJfTElTVF9QQUlSX0FSUkFZOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPD8+W10gRU1QVFlfQVNQRUNUX0xJU1RFTkVSX0xJU1RfUEFJUl9BUlJBWSA9IG5ldyBBc3BlY3RMaXN0ZW5lckxpc3RQYWlyWzBdOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IHN1cHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgc291cmNlIG9mIGNoYW5nZSBldmVudHMuCi0JICogVGhlIHNvdXJjZSBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgQ2hhbmdlU3VwcG9ydChNb2RlbCBzb3VyY2UpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgZXZlbnRzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQKLQkgKiBjYXJyeWluZyB0aGUgc3BlY2lmaWVkIGFzcGVjdCBuYW1lLgotCSAqIE5laXRoZXIgdGhlIGFzcGVjdCBuYW1lIG5vciB0aGUgbGlzdGVuZXIgY2FuIGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgYWRkTGlzdGVuZXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUsIEwgbGlzdGVuZXIpIHsKLQkJTGlzdGVuZXJMaXN0PEw+IGFzcGVjdExpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0TGlzdGVuZXJMaXN0KGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCQlpZiAoYXNwZWN0TGlzdGVuZXJMaXN0ID09IG51bGwpIHsKLQkJCXRoaXMuYXNwZWN0TGlzdGVuZXJMaXN0UGFpcnMgPSBBcnJheVRvb2xzLmFkZCh0aGlzLmFzcGVjdExpc3RlbmVyTGlzdFBhaXJzLCBuZXcgU2ltcGxlQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjxMPihsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lLCBsaXN0ZW5lcikpOwotCQl9IGVsc2UgewotCQkJYXNwZWN0TGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBldmVudHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBMIGxpc3RlbmVyKSB7Ci0JCUxpc3RlbmVyTGlzdDxMPiBsaXN0ZW5lckxpc3QgPSB0aGlzLmdldExpc3RlbmVyTGlzdChsaXN0ZW5lckNsYXNzKTsKLQkJaWYgKGxpc3RlbmVyTGlzdCA9PSBudWxsKSB7Ci0JCQl0aGlzLmFzcGVjdExpc3RlbmVyTGlzdFBhaXJzID0gQXJyYXlUb29scy5hZGQodGhpcy5hc3BlY3RMaXN0ZW5lckxpc3RQYWlycywgbmV3IE51bGxBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPEw+KGxpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyKSk7Ci0JCX0gZWxzZSB7Ci0JCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCBmb3IgYWxsIHRoZQotCSAqIGV2ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIGNhcnJ5aW5nIHRoZSBzcGVjaWZpZWQgYXNwZWN0IG5hbWUuCi0JICogTmVpdGhlciB0aGUgYXNwZWN0IG5hbWUgbm9yIHRoZSBsaXN0ZW5lciBjYW4gYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCByZW1vdmVMaXN0ZW5lcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSwgTCBsaXN0ZW5lcikgewotCQlMaXN0ZW5lckxpc3Q8TD4gYXNwZWN0TGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JCWlmIChhc3BlY3RMaXN0ZW5lckxpc3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5yZWdpc3RlcmVkIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNwZWN0TGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7ICAvLyBsZWF2ZSB0aGUgcGFpciwgZXZlbiBpZiB0aGUgbGlzdGVuZXIgbGlzdCBpcyBlbXB0eT8KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgZm9yIGFsbCB0aGUgZXZlbnRzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgTCBsaXN0ZW5lcikgewotCQlMaXN0ZW5lckxpc3Q8TD4gbGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcyk7Ci0JCWlmIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5yZWdpc3RlcmVkIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7ICAvLyBsZWF2ZSB0aGUgcGFpciwgZXZlbiBpZiB0aGUgbGlzdGVuZXIgbGlzdCBpcyBlbXB0eT8KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3RlbmVyIGxpc3QgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgY2xhc3MgYW5kIGFzcGVjdCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBsaXN0ZW5lciBsaXN0IGlzIG5vdCBwcmVzZW50LgotCSAqIFRoZSBhc3BlY3QgbmFtZSBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBMaXN0ZW5lckxpc3Q8TD4gZ2V0TGlzdGVuZXJMaXN0KENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCS8vIHB1dCBpbiBhIG51bGwgY2hlY2sgdG8gc2ltcGxpZnkgY2FsbGluZyBjb2RlCi0JCWlmIChhc3BlY3ROYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdF8obGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0ZW5lciBsaXN0IGZvciB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIGNsYXNzLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBsaXN0ZW5lciBsaXN0IGlzIG5vdCBwcmVzZW50LgotCSAqLwotCXByb3RlY3RlZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IExpc3RlbmVyTGlzdDxMPiBnZXRMaXN0ZW5lckxpc3QoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcykgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3RfKGxpc3RlbmVyQ2xhc3MsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdGVuZXIgbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcyBhbmQgYXNwZWN0IG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGxpc3RlbmVyIGxpc3QgaXMgbm90IHByZXNlbnQuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IExpc3RlbmVyTGlzdDxMPiBnZXRMaXN0ZW5lckxpc3RfKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCWZvciAoQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjw/PiBwYWlyIDogdGhpcy5hc3BlY3RMaXN0ZW5lckxpc3RQYWlycykgewotCQkJaWYgKHBhaXIubWF0Y2hlcyhsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKSkgewotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBMaXN0ZW5lckxpc3Q8TD4gYXNwZWN0TGlzdGVuZXJMaXN0ID0gKExpc3RlbmVyTGlzdDxMPikgcGFpci5saXN0ZW5lckxpc3Q7Ci0JCQkJcmV0dXJuIGFzcGVjdExpc3RlbmVyTGlzdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGxpc3RlbmVycyBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcwotCSAqIGFuZCBhc3BlY3QgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBib29sZWFuIGhhc0FueUxpc3RlbmVycyhDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlMaXN0ZW5lckxpc3Q8TD4gYXNwZWN0TGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JCWlmICgoYXNwZWN0TGlzdGVuZXJMaXN0ICE9IG51bGwpICYmICEgYXNwZWN0TGlzdGVuZXJMaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuaGFzQW55Q2hhbmdlTGlzdGVuZXJzKCk7ICAvLyBjaGVjayBmb3IgYW55IGdlbmVyYWwgcHVycG9zZSBsaXN0ZW5lcnMKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIGNsYXNzCi0JICogYW5kIGFzcGVjdCBuYW1lLgotCSAqLwotCXByb3RlY3RlZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlMaXN0ZW5lcnMobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBsaXN0ZW5lcnMgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgY2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gYm9vbGVhbiBoYXNBbnlMaXN0ZW5lcnMoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcykgewotCQlMaXN0ZW5lckxpc3Q8TD4gYXNwZWN0TGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcyk7Ci0JCWlmICgoYXNwZWN0TGlzdGVuZXJMaXN0ICE9IG51bGwpICYmICEgYXNwZWN0TGlzdGVuZXJMaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gY2hlY2sgZm9yIGFueSBnZW5lcmFsIHB1cnBvc2UgbGlzdGVuZXJzICh1bmxlc3MgdGhhdCdzIHdoYXQgd2UncmUgYWxyZWFkeSBkb2luZykKLQkJcmV0dXJuIChsaXN0ZW5lckNsYXNzID09IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJDbGFzcygpKSA/IGZhbHNlIDogdGhpcy5oYXNBbnlDaGFuZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcykgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueUxpc3RlbmVycyhsaXN0ZW5lckNsYXNzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2VuZXJhbCBwdXJwb3NlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgdGhhdCBhZGQgb3RoZXIgdHlwZXMgb2YgbGlzdGVuZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZAotCSAqIHRvIHJldHVybiB0aGUgZXh0ZW5zaW9uIHRvIENoYW5nZUxpc3RlbmVyIHRoYXQgYWxzbyBleHRlbmRzIHdoYXRldmVyIG5ldwotCSAqIGxpc3RlbmVyIHR5cGVzIGFyZSBzdXBwb3J0ZWQuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IENsYXNzPEw+IGdldENoYW5nZUxpc3RlbmVyQ2xhc3MoKSB7Ci0JCS8vIG5vdCBzdXJlIHdoeSBJIG5lZWQgdG8gY2FzdCBoZXJlLi4uCi0JCXJldHVybiAoQ2xhc3M8TD4pIENIQU5HRV9MSVNURU5FUl9DTEFTUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENoYW5nZUxpc3RlbmVyPiBDSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQotCS8qKgotCSAqIEFkZCBhIGdlbmVyYWwgcHVycG9zZSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGV2ZW50cywKLQkgKiByZWdhcmRsZXNzIG9mIHRoZSBhc3BlY3QgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBldmVudC4KLQkgKiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcih0aGlzLmdldENoYW5nZUxpc3RlbmVyQ2xhc3MoKSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGdlbmVyYWwgcHVycG9zZSBsaXN0ZW5lci4KLQkgKiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZW1vdmVMaXN0ZW5lcih0aGlzLmdldENoYW5nZUxpc3RlbmVyQ2xhc3MoKSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgZ2VuZXJhbCBwdXJwb3NlIGxpc3RlbmVycyB0aGF0IHdpbGwgYmUKLQkgKiBub3RpZmllZCBvZiBhbnkgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyh0aGlzLmdldENoYW5nZUxpc3RlbmVyQ2xhc3MoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8Q2hhbmdlTGlzdGVuZXI+IGdldENoYW5nZUxpc3RlbmVyTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0KENIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gZ2V0Q2hhbmdlTGlzdGVuZXJzKCkgewotCQlMaXN0ZW5lckxpc3Q8Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJMaXN0KCk7Ci0JCXJldHVybiAobGlzdGVuZXJMaXN0ID09IG51bGwpID8gbnVsbCA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLCBsaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4gU1RBVEVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTID0gU3RhdGVDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQotCS8qKgotCSAqIEFkZCBhIHN0YXRlIGNoYW5nZSBsaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcihTVEFURV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIoU1RBVEVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoU1RBVEVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RlbmVyTGlzdDxTdGF0ZUNoYW5nZUxpc3RlbmVyPiBnZXRTdGF0ZUNoYW5nZUxpc3RlbmVyTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0KFNUQVRFX0NIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdGF0ZUNoYW5nZUxpc3RlbmVyPiBnZXRTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJTGlzdGVuZXJMaXN0PFN0YXRlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0U3RhdGVDaGFuZ2VMaXN0ZW5lckxpc3QoKTsKLQkJcmV0dXJuIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgPyBudWxsIDogbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldFN0YXRlQ2hhbmdlTGlzdGVuZXJzKCksIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIHRoZSBzcGVjaWZpZWQgc3RhdGUgY2hhbmdlIGV2ZW50IHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJSXRlcmFibGU8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRTdGF0ZUNoYW5nZUxpc3RlbmVycygpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1N0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGdlbmVyaWMgc3RhdGUgY2hhbmdlIGV2ZW50IHRvIGFueSByZWdpc3RlcmVkIHN0YXRlIGNoYW5nZQotCSAqIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKCkgewotLy8JCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZChuZXcgU3RhdGVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSkpOwotCQlTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRTdGF0ZUNoYW5nZUxpc3RlbmVycygpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1N0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBTdGF0ZUNoYW5nZUV2ZW50KHRoaXMuc291cmNlKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFN0YXRlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTID0gUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQotCS8qKgotCSAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4gVGhlIGxpc3RlbmVyCi0JICogd2lsbCBiZSBub3RpZmllZCBvbmx5IGZvciBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIoUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCBmb3IgYSBzcGVjaWZpYyBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZW1vdmVMaXN0ZW5lcihQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyB0aGF0IHdpbGwKLQkgKiBiZSBub3RpZmllZCB3aGVuIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJMaXN0KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0KFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJTGlzdGVuZXJMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lckxpc3QocHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgPyBudWxsIDogbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSksIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgY2hhbmdlIGV2ZW50IHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBObyBldmVudCBpcyBmaXJlZCBpZiB0aGUgZ2l2ZW4gZXZlbnQncyBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHRoZSBzYW1lOwotCSAqIHRoaXMgaW5jbHVkZXMgd2hlbiBib3RoIHZhbHVlcyBhcmUgbnVsbC4gVXNlIGEgc3RhdGUgY2hhbmdlIGV2ZW50Ci0JICogZm9yIGdlbmVyYWwgcHVycG9zZSBub3RpZmljYXRpb24gb2YgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KGV2ZW50LmdldE9sZFZhbHVlKCksIGV2ZW50LmdldE5ld1ZhbHVlKCkpKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgZXZlbnQncyBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGRpZmZlcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRfKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQlJdGVyYWJsZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBwcm9wZXJ0eSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycy4KLQkgKiBObyBldmVudCBpcyBmaXJlZCBpZiB0aGUgZ2l2ZW4gb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB0aGUgc2FtZTsKLQkgKiB0aGlzIGluY2x1ZGVzIHdoZW4gYm90aCB2YWx1ZXMgYXJlIG51bGwuIFVzZSBhIHN0YXRlIGNoYW5nZSBldmVudAotCSAqIGZvciBnZW5lcmFsIHB1cnBvc2Ugbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotLy8JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpKTsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZF8ocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGRpZmZlcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRfKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGFuIGludCBib3VuZCBwcm9wZXJ0eSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIE5vIGV2ZW50IGlzIGZpcmVkIGlmIG9sZCBhbmQgbmV3IGFyZSBlcXVhbC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG1lcmVseSBhIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBtb3JlIGdlbmVyYWwKLQkgKiBmaXJlUHJvcGVydHlDaGFuZ2UgbWV0aG9kIHRoYXQgdGFrZXMgT2JqZWN0IHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0vLwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgSW50ZWdlci52YWx1ZU9mKG9sZFZhbHVlKSwgSW50ZWdlci52YWx1ZU9mKG5ld1ZhbHVlKSk7Ci0JCWlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkXyhwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgZGlmZmVyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZF8oU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBwcm9wZXJ0eU5hbWUsIEludGVnZXIudmFsdWVPZihvbGRWYWx1ZSksIEludGVnZXIudmFsdWVPZihuZXdWYWx1ZSkpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBJbnRlZ2VyLnZhbHVlT2Yob2xkVmFsdWUpLCBJbnRlZ2VyLnZhbHVlT2YobmV3VmFsdWUpKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvb2xlYW4gYm91bmQgcHJvcGVydHkgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBObyBldmVudCBpcyBmaXJlZCBpZiBvbGQgYW5kIG5ldyBhcmUgZXF1YWwuCi0JICogPHA+Ci0JICogVGhpcyBpcyBtZXJlbHkgYSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbW9yZSBnZW5lcmFsCi0JICogZmlyZVByb3BlcnR5Q2hhbmdlIG1ldGhvZCB0aGF0IHRha2VzIE9iamVjdCB2YWx1ZXMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0vLwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgQm9vbGVhbi52YWx1ZU9mKG9sZFZhbHVlKSwgQm9vbGVhbi52YWx1ZU9mKG5ld1ZhbHVlKSk7Ci0JCWlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkXyhwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgZGlmZmVyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZF8oU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHByb3BlcnR5TmFtZSwgQm9vbGVhbi52YWx1ZU9mKG9sZFZhbHVlKSwgQm9vbGVhbi52YWx1ZU9mKG5ld1ZhbHVlKSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBwcm9wZXJ0eU5hbWUsIEJvb2xlYW4udmFsdWVPZihvbGRWYWx1ZSksIEJvb2xlYW4udmFsdWVPZihuZXdWYWx1ZSkpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTID0gQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCi0JLyoqCi0JICogQWRkIGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gVGhlIGxpc3RlbmVyCi0JICogd2lsbCBiZSBub3RpZmllZCBvbmx5IGZvciBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcihDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciBhIHNwZWNpZmljIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIoQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBnZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0KFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3QoQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJTGlzdGVuZXJMaXN0PENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0KGNvbGxlY3Rpb25OYW1lKTsKLQkJcmV0dXJuIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgPyBudWxsIDogbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0SXRlbXNTaXplKCkgIT0gMCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogaXRlbXMgd2VyZSBhZGRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc0FkZGVkXyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGNvbGxlY3Rpb25OYW1lID0gZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKTsKLQkJSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGFkZGVkSXRlbXMpIHsKLS8vCQl0aGlzLmZpcmVJdGVtc0FkZGVkKG5ldyBDb2xsZWN0aW9uQWRkRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW1zKSk7Ci0JCWlmICggISBhZGRlZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZF8oY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogaXRlbXMgd2VyZSBhZGRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc0FkZGVkXyhTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gYWRkZWRJdGVtcykgewotCQlDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkFkZEV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkFkZEV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNBZGRlZChjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKGFkZGVkSXRlbSkpOwotCi0JCUNvbGxlY3Rpb25BZGRFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQWRkRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25BZGRFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRJdGVtc1NpemUoKSAhPSAwKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IGl0ZW1zIHdlcmUgcmVtb3ZlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlbW92ZWRfKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlTdHJpbmcgY29sbGVjdGlvbk5hbWUgPSBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKG5ldyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpKTsKLQkJaWYgKCAhIHJlbW92ZWRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZF8oY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBpdGVtcyB3ZXJlIHJlbW92ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZW1vdmVkXyhTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCUNvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvblJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgcmVtb3ZlZEl0ZW0pIHsKLS8vCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihyZW1vdmVkSXRlbSkpOwotCi0JCUNvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBjb2xsZWN0aW9uTmFtZSA9IGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCk7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotLy8JCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKG5ldyBDb2xsZWN0aW9uQ2xlYXJFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUpKTsKLQotCQlDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQ2xlYXJFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQ2xlYXJFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgY29sbGVjdGlvbk5hbWUgPSBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotLy8JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBjb2xsZWN0aW9uKSk7Ci0KLQkJQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGNvbGxlY3Rpb24pOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBjb2xsZWN0aW9uKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNhZGQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtVG9Db2xsZWN0aW9uKEUgaXRlbSwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKGNvbGxlY3Rpb24uYWRkKGl0ZW0pKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoY29sbGVjdGlvbk5hbWUsIGl0ZW0pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbihFW10gaXRlbXMsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiAoaXRlbXMubGVuZ3RoICE9IDApCi0JCQkJJiYgdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbl8obmV3IEFycmF5SXRlcmF0b3I8RT4oaXRlbXMpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNhZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gKCAhIGl0ZW1zLmlzRW1wdHkoKSkKLQkJCQkmJiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uXyhpdGVtcy5pdGVyYXRvcigpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNhZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlbXMsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiBpdGVtcy5oYXNOZXh0KCkKLQkJCQkmJiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uXyhpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uXyhJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlbXMsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCUNvbGxlY3Rpb248RT4gYWRkZWRJdGVtcyA9IG51bGw7Ci0JCXdoaWxlIChpdGVtcy5oYXNOZXh0KCkpIHsKLQkJCUUgaXRlbSA9IGl0ZW1zLm5leHQoKTsKLQkJCWlmIChjb2xsZWN0aW9uLmFkZChpdGVtKSkgewotCQkJCWlmIChhZGRlZEl0ZW1zID09IG51bGwpIHsKLQkJCQkJYWRkZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKLQkJCQl9Ci0JCQkJYWRkZWRJdGVtcy5hZGQoaXRlbSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFkZGVkSXRlbXMgIT0gbnVsbCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbSBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3JlbW92ZShPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKE9iamVjdCBpdGVtLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAoY29sbGVjdGlvbi5yZW1vdmUoaXRlbSkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCBpdGVtKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3JlbW92ZUFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKE9iamVjdFtdIGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gKGl0ZW1zLmxlbmd0aCAhPSAwKQotCQkJCSYmICggISBjb2xsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCQkmJiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25fKG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oaXRlbXMpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gKCAhIGl0ZW1zLmlzRW1wdHkoKSkKLQkJCQkmJiAoICEgY29sbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uXyhpdGVtcy5pdGVyYXRvcigpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihJdGVyYWJsZTw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihpdGVtcy5pdGVyYXRvcigpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihJdGVyYXRvcjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGl0ZW1zLmhhc05leHQoKQotCQkJCSYmICggISBjb2xsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCQkmJiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25fKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2tzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbl8oSXRlcmF0b3I8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCUhhc2hCYWc8Pz4gcmVtb3ZlZEl0ZW1zID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oaXRlbXMpOwotCQlyZW1vdmVkSXRlbXMucmV0YWluQWxsKGNvbGxlY3Rpb24pOwotCQlib29sZWFuIGNoYW5nZWQgPSBjb2xsZWN0aW9uLnJlbW92ZUFsbChyZW1vdmVkSXRlbXMpOwotCi0JCWlmICggISByZW1vdmVkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcyk7Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jcmV0YWluQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKE9iamVjdFtdIGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyQ29sbGVjdGlvbl8oY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uXyhuZXcgQXJyYXlJdGVyYXRvcjxPYmplY3Q+KGl0ZW1zKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckNvbGxlY3Rpb25fKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbl8oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luQ29sbGVjdGlvbihJdGVyYWJsZTw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luQ29sbGVjdGlvbihJdGVyYXRvcjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCAhIGl0ZW1zLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uXyhjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkNvbGxlY3Rpb25fKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2tzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb25fKEl0ZXJhdG9yPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlIYXNoQmFnPD8+IHJldGFpbmVkSXRlbXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihpdGVtcyk7Ci0JCUhhc2hCYWc8Pz4gcmVtb3ZlZEl0ZW1zID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oY29sbGVjdGlvbik7Ci0JCXJlbW92ZWRJdGVtcy5yZW1vdmVBbGwocmV0YWluZWRJdGVtcyk7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGNvbGxlY3Rpb24ucmV0YWluQWxsKHJldGFpbmVkSXRlbXMpOwotCi0JCWlmICggISByZW1vdmVkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcyk7Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIGVudGlyZSBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jY2xlYXIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNsZWFyQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jbGVhckNvbGxlY3Rpb25fKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVjawotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNsZWFyQ29sbGVjdGlvbl8oQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJY29sbGVjdGlvbi5jbGVhcigpOwotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChjb2xsZWN0aW9uTmFtZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBjb2xsZWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuZXcgY29sbGVjdGlvbiwKLQkgKiBtYWtpbmcgYSBtaW5pbXVtIG51bWJlciBvZiByZW1vdmVzIGFuZCBhZGRzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIHN5bmNocm9uaXplQ29sbGVjdGlvbihDb2xsZWN0aW9uPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmIChuZXdDb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb25fKG5ld0NvbGxlY3Rpb24uaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMuc3luY2hyb25pemVDb2xsZWN0aW9uXyhuZXdDb2xsZWN0aW9uLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU3luY2hyb25pemUgdGhlIGNvbGxlY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5ldyBjb2xsZWN0aW9uLAotCSAqIG1ha2luZyBhIG1pbmltdW0gbnVtYmVyIG9mIHJlbW92ZXMgYW5kIGFkZHMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uKEl0ZXJhdG9yPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmICggISBuZXdDb2xsZWN0aW9uLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb25fKG5ld0NvbGxlY3Rpb24sIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCXJldHVybiB0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbl8oQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVja3MKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uXyhDb2xsZWN0aW9uPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQlDb2xsZWN0aW9uPEU+IHJlbW92ZUl0ZW1zID0gbmV3IEhhc2hCYWc8RT4oY29sbGVjdGlvbik7Ci0JCXJlbW92ZUl0ZW1zLnJlbW92ZUFsbChuZXdDb2xsZWN0aW9uKTsKLQkJY2hhbmdlZCB8PSB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocmVtb3ZlSXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQotCQlDb2xsZWN0aW9uPEU+IGFkZEl0ZW1zID0gbmV3IEhhc2hCYWc8RT4obmV3Q29sbGVjdGlvbik7Ci0JCWFkZEl0ZW1zLnJlbW92ZUFsbChjb2xsZWN0aW9uKTsKLQkJY2hhbmdlZCB8PSB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGFkZEl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0KLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0Q2hhbmdlTGlzdGVuZXI+IExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTID0gTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzOwotCi0JLyoqCi0JICogQWRkIGEgbGlzdCBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdC4gVGhlIGxpc3RlbmVyCi0JICogd2lsbCBiZSBub3RpZmllZCBvbmx5IGZvciBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcihMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciBhIHNwZWNpZmljIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIoTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBsaXN0IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGxpc3QgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8TGlzdENoYW5nZUxpc3RlbmVyPiBnZXRMaXN0Q2hhbmdlTGlzdGVuZXJMaXN0KFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3QoTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhTdHJpbmcgbGlzdE5hbWUpIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJMaXN0KGxpc3ROYW1lKTsKLQkJcmV0dXJuIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgPyBudWxsIDogbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0SXRlbXNTaXplKCkgIT0gMCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogaXRlbXMgd2VyZSBhZGRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc0FkZGVkXyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGxpc3ROYW1lID0gZXZlbnQuZ2V0TGlzdE5hbWUoKTsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gYWRkZWRJdGVtcykgewotLy8JCXRoaXMuZmlyZUl0ZW1zQWRkZWQobmV3IExpc3RBZGRFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKSk7Ci0JCWlmICggISBhZGRlZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZF8obGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IGl0ZW1zIHdlcmUgYWRkZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNBZGRlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gYWRkZWRJdGVtcykgewotCQlMaXN0QWRkRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdEFkZEV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RBZGRFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1BZGRlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IGFkZGVkSXRlbSkgewotLy8JCXRoaXMuZmlyZUl0ZW1zQWRkZWQobGlzdE5hbWUsIGluZGV4LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGFkZGVkSXRlbSkpOwotCi0JCUxpc3RBZGRFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0QWRkRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0QWRkRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldEl0ZW1zU2l6ZSgpICE9IDApIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogaXRlbXMgd2VyZSByZW1vdmVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZF8oTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IHJlbW92ZWRJdGVtcykgewotLy8JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChuZXcgTGlzdFJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtcykpOwotCQlpZiAoICEgcmVtb3ZlZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkXyhsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBpdGVtcyB3ZXJlIHJlbW92ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZW1vdmVkXyhTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiByZW1vdmVkSXRlbXMpIHsKLQkJTGlzdFJlbW92ZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RSZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdFJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgcmVtb3ZlZEl0ZW0pIHsKLS8vCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobGlzdE5hbWUsIGluZGV4LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlbW92ZWRJdGVtKSk7Ci0KLQkJTGlzdFJlbW92ZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RSZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0UmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKChldmVudC5nZXRJdGVtc1NpemUoKSAhPSAwKSAmJiB0aGlzLmVsZW1lbnRzQXJlRGlmZmVyZW50KGV2ZW50LmdldE5ld0l0ZW1zKCksIGV2ZW50LmdldE9sZEl0ZW1zKCkpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBpdGVtcyB3ZXJlIHJlcGxhY2VkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVwbGFjZWRfKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGxpc3ROYW1lID0gZXZlbnQuZ2V0TGlzdE5hbWUoKTsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gbmV3SXRlbXMsIExpc3Q8Pz4gb2xkSXRlbXMpIHsKLS8vCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKG5ldyBMaXN0UmVwbGFjZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW1zLCBvbGRJdGVtcykpOwotCQlpZiAoKCAhIG5ld0l0ZW1zLmlzRW1wdHkoKSkgJiYgdGhpcy5lbGVtZW50c0FyZURpZmZlcmVudChuZXdJdGVtcywgb2xkSXRlbXMpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkXyhsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW1zLCBvbGRJdGVtcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBpdGVtcyB3ZXJlIHJlcGxhY2VkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVwbGFjZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IG5ld0l0ZW1zLCBMaXN0PD8+IG9sZEl0ZW1zKSB7Ci0JCUxpc3RSZXBsYWNlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdFJlcGxhY2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgb2xkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RSZXBsYWNlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIG9sZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZXBsYWNlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IG5ld0l0ZW0sIE9iamVjdCBvbGRJdGVtKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3SXRlbSksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob2xkSXRlbSkpOwotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQobmV3SXRlbSwgb2xkSXRlbSkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZF8obGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtLCBvbGRJdGVtKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IGl0ZW1zIHdlcmUgcmVwbGFjZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbVJlcGxhY2VkXyhTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IG5ld0l0ZW0sIE9iamVjdCBvbGRJdGVtKSB7Ci0JCUxpc3RSZXBsYWNlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdFJlcGxhY2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtLCBvbGRJdGVtKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0UmVwbGFjZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW0sIG9sZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRUYXJnZXRJbmRleCgpICE9IGV2ZW50LmdldFNvdXJjZUluZGV4KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJfQotCQkvLyBpdCdzIHVubGlrZWx5IGJ1dCBwb3NzaWJsZSB0aGUgbGlzdCBpcyB1bmNoYW5nZWQgYnkgdGhlIG1vdmUuLi4gKGUuZy4gYW55IG1vdmVzIHdpdGhpbiBbImZvbyIsICJmb28iLCAiZm9vIl0uLi4pCi0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogaXRlbXMgd2VyZSBtb3ZlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc01vdmVkXyhMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc01vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLS8vCQl0aGlzLmZpcmVJdGVtc01vdmVkKG5ldyBMaXN0TW92ZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpKTsKLQkJaWYgKHRhcmdldEluZGV4ICE9IHNvdXJjZUluZGV4KSB7Ci0JCQl0aGlzLmZpcmVJdGVtc01vdmVkXyhsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCQl9Ci0JCS8vIGl0J3MgdW5saWtlbHkgYnV0IHBvc3NpYmxlIHRoZSBsaXN0IGlzIHVuY2hhbmdlZCBieSB0aGUgbW92ZS4uLiAoZS5nLiBhbnkgbW92ZXMgd2l0aGluIFsiZm9vIiwgImZvbyIsICJmb28iXS4uLikKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBpdGVtcyB3ZXJlIG1vdmVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zTW92ZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJTGlzdE1vdmVFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0TW92ZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RNb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtTW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLmZpcmVJdGVtc01vdmVkKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIDEpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGxpc3ROYW1lID0gZXZlbnQuZ2V0TGlzdE5hbWUoKTsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENsZWFyZWQoU3RyaW5nIGxpc3ROYW1lKSB7Ci0vLwkJdGhpcy5maXJlTGlzdENsZWFyZWQobmV3IExpc3RDbGVhckV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSkpOwotCi0JCUxpc3RDbGVhckV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RDbGVhckV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RDbGVhckV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKFN0cmluZyBsaXN0TmFtZSwgTGlzdDw/PiBsaXN0KSB7Ci0vLwkJdGhpcy5maXJlTGlzdENoYW5nZWQobmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUpKTsKLQotCQlMaXN0Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdENoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgbGlzdCk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGxpc3QpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50LgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjYWRkKGludCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyA8RT4gdm9pZCBhZGRJdGVtVG9MaXN0KGludCBpbmRleCwgRSBpdGVtLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlsaXN0LmFkZChpbmRleCwgaXRlbSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW0pOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW0gdG8gdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZCAoaS5lLiAndHJ1ZScpLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjYWRkKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbVRvTGlzdChFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChsaXN0LmFkZChpdGVtKSkgewotCQkJdGhpcy5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBsaXN0LnNpemUoKSAtIDEsIGl0ZW0pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOyAgLy8gTGlzdCNhZGQoT2JqZWN0KSBzaG91bGQgYWx3YXlzIHJldHVybiAndHJ1ZScsIHNvIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4uLgotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjYWRkQWxsKGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgRVtdIGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKGl0ZW1zLmxlbmd0aCAhPSAwKQotCQkJCSYmIHRoaXMuYWRkSXRlbXNUb0xpc3RfKGluZGV4LCBBcnJheXMuYXNMaXN0KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjYWRkQWxsKGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiAoICEgaXRlbXMuaXNFbXB0eSgpKQotCQkJCSYmIHRoaXMuYWRkSXRlbXNUb0xpc3RfKGluZGV4LCB0aGlzLmNvbnZlcnRUb0xpc3QoaXRlbXMpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3RfKGludCBpbmRleCwgTGlzdDw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChsaXN0LmFkZEFsbChpbmRleCwgaXRlbXMpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgaXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOyAgLy8gICdpdGVtcycgc2hvdWxkIG5vdCBiZSBlbXB0eSwgc28gd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLi4uCi0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjYWRkQWxsKGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdChpbmRleCwgaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I2FkZEFsbChpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKCAhIGl0ZW1zLmhhc05leHQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJQXJyYXlMaXN0PEU+IGFkZGVkSXRlbXMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVtcyk7Ci0JCWlmIChsaXN0LmFkZEFsbChpbmRleCwgYWRkZWRJdGVtcykpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQobGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsgIC8vICAnaXRlbXMnIHNob3VsZCBub3QgYmUgZW1wdHksIHNvIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4uLgotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBlbmQgb2YgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChFW10gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiAoaXRlbXMubGVuZ3RoICE9IDApCi0JCQkJJiYgdGhpcy5hZGRJdGVtc1RvTGlzdF8oQXJyYXlzLmFzTGlzdChpdGVtcyksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I2FkZEFsbChpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuICggISBpdGVtcy5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5hZGRJdGVtc1RvTGlzdF8odGhpcy5jb252ZXJ0VG9MaXN0KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gTGlzdDw/IGV4dGVuZHMgRT4gY29udmVydFRvTGlzdChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIExpc3Q8Pz4pID8gKExpc3Q8PyBleHRlbmRzIEU+KSBjb2xsZWN0aW9uIDogbmV3IEFycmF5TGlzdDxFPihjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVjawotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdF8oTGlzdDw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWludCBpbmRleCA9IGxpc3Quc2l6ZSgpOwotCQlpZiAobGlzdC5hZGRBbGwoaXRlbXMpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgaXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOyAgLy8gICdpdGVtcycgc2hvdWxkIG5vdCBiZSBlbXB0eSwgc28gd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLi4uCi0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIGVuZCBvZiB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNhZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3QoaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBlbmQgb2YgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmICggISBpdGVtcy5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdF8oaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVjawotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdF8oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlBcnJheUxpc3Q8RT4gYWRkZWRJdGVtcyA9IENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZW1zKTsKLQkJaW50IGluZGV4ID0gbGlzdC5zaXplKCk7Ci0JCWlmIChsaXN0LmFkZEFsbChhZGRlZEl0ZW1zKSkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOyAgLy8gICdpdGVtcycgc2hvdWxkIG5vdCBiZSBlbXB0eSwgc28gd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLi4uCi0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbSBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZW1vdmVkIGl0ZW0uCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZW1vdmUoaW50KQotCSAqLwotCXB1YmxpYyA8RT4gRSByZW1vdmVJdGVtRnJvbUxpc3QoaW50IGluZGV4LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlFIGl0ZW0gPSBsaXN0LnJlbW92ZShpbmRleCk7Ci0JCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgaXRlbSk7Ci0JCXJldHVybiBpdGVtOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW0gZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZW1vdmUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1Gcm9tTGlzdChPYmplY3QgaXRlbSwgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKGl0ZW0pOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlsaXN0LnJlbW92ZShpbmRleCk7Ci0JCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgaXRlbSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGluZGV4IG9uCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBpdGVtcy4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3JlbW92ZShpbnQpCi0JICovCi0JcHVibGljIDxFPiBMaXN0PEU+IHJlbW92ZUl0ZW1zRnJvbUxpc3QoaW50IGluZGV4LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KGluZGV4LCBsaXN0LnNpemUoKSAtIGluZGV4LCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBpdGVtcy4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3JlbW92ZShpbnQpCi0JICovCi0JcHVibGljIDxFPiBMaXN0PEU+IHJlbW92ZUl0ZW1zRnJvbUxpc3QoaW50IGluZGV4LCBpbnQgbGVuZ3RoLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0XyhpbmRleCwgbGVuZ3RoLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8RT4gcmVtb3ZlSXRlbXNGcm9tTGlzdF8oaW50IGluZGV4LCBpbnQgbGVuZ3RoLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlMaXN0PEU+IHN1Ykxpc3QgPSBsaXN0LnN1Ykxpc3QoaW5kZXgsIGluZGV4ICsgbGVuZ3RoKTsKLQkJTGlzdDxFPiByZW1vdmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEU+KHN1Ykxpc3QpOwotCQlzdWJMaXN0LmNsZWFyKCk7Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtcyk7Ci0JCXJldHVybiByZW1vdmVkSXRlbXM7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQocykgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChPYmplY3RbXSBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIChpdGVtcy5sZW5ndGggIT0gMCkKLQkJCQkmJiAoICEgbGlzdC5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0XyhuZXcgQXJyYXlJdGVyYXRvcjxPYmplY3Q+KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50KHMpIGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjcmVtb3ZlQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUxpc3QoQ29sbGVjdGlvbjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuICggISBpdGVtcy5pc0VtcHR5KCkpCi0JCQkJJiYgKCAhIGxpc3QuaXNFbXB0eSgpKQotCQkJCSYmIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdF8oaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50KHMpIGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjcmVtb3ZlQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUxpc3QoSXRlcmFibGU8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QoaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50KHMpIGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjcmVtb3ZlQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUxpc3QoSXRlcmF0b3I8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiAoaXRlbXMuaGFzTmV4dCgpKQotCQkJCSYmICggISBsaXN0LmlzRW1wdHkoKSkKLQkJCQkmJiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3RfKGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2tzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdF8oSXRlcmF0b3I8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQl3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7Ci0JCQljaGFuZ2VkIHw9IHRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGl0ZW1zLm5leHQoKSwgbGlzdCwgbGlzdE5hbWUpOwotCQl9Ci0JCXJldHVybiBjaGFuZ2VkOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudChzKSBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChPYmplY3RbXSBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckxpc3RfKGxpc3QsIGxpc3ROYW1lKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luTGlzdF8obmV3IEFycmF5SXRlcmF0b3I8T2JqZWN0PihpdGVtcyksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQocykgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZXRhaW5BbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3QoQ29sbGVjdGlvbjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGl0ZW1zLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJMaXN0XyhsaXN0LCBsaXN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkxpc3RfKGl0ZW1zLml0ZXJhdG9yKCksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQocykgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZXRhaW5BbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3QoSXRlcmFibGU8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5MaXN0KGl0ZW1zLml0ZXJhdG9yKCksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQocykgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZXRhaW5BbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3QoSXRlcmF0b3I8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICggISBpdGVtcy5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyTGlzdF8obGlzdCwgbGlzdE5hbWUpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5MaXN0XyhpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbkl0ZW1zSW5MaXN0XyhJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJSGFzaEJhZzw/PiByZXRhaW5lZEl0ZW1zID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oaXRlbXMpOwotCQlIYXNoQmFnPD8+IHJlbW92ZWRJdGVtcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGxpc3QpOwotCQlyZW1vdmVkSXRlbXMucmVtb3ZlQWxsKHJldGFpbmVkSXRlbXMpOwotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KHJlbW92ZWRJdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGl0ZW0gaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIHJlcGxhY2VkIGl0ZW0uCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNzZXQoaW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIDxFPiBFIHNldEl0ZW1Jbkxpc3QoaW50IGluZGV4LCBFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCUUgb2xkSXRlbSA9IGxpc3Quc2V0KGluZGV4LCBpdGVtKTsKLQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgaXRlbSwgb2xkSXRlbSk7Ci0JCXJldHVybiBvbGRJdGVtOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBpdGVtCi0JICogaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSByZXBsYWNlZCBpdGVtLgotCSAqIFJldHVybiAtMSBpZiB0aGUgaXRlbSB3YXMgbm90IGZvdW5kIGluIHRoZSBsaXN0LgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3Qjc2V0KGludCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyA8RT4gaW50IHJlcGxhY2VJdGVtSW5MaXN0KEUgb2xkSXRlbSwgRSBuZXdJdGVtLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihvbGRJdGVtKTsKLQkJaWYgKChpbmRleCAhPSAtMSkgJiYgdGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQob2xkSXRlbSwgbmV3SXRlbSkpIHsKLQkJCWxpc3Quc2V0KGluZGV4LCBuZXdJdGVtKTsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZF8obGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtLCBvbGRJdGVtKTsKLQkJfQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIHJlcGxhY2VkIGl0ZW1zLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3Qjc2V0KGludCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyA8RT4gTGlzdDxFPiBzZXRJdGVtc0luTGlzdChpbnQgaW5kZXgsIEVbXSBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc2V0SXRlbXNJbkxpc3RfKGluZGV4LCBBcnJheXMuYXNMaXN0KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZXBsYWNlZCBpdGVtcy4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3NldChpbnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgPEU+IExpc3Q8RT4gc2V0SXRlbXNJbkxpc3QoaW50IGluZGV4LCBMaXN0PD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKGl0ZW1zLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnNldEl0ZW1zSW5MaXN0XyhpbmRleCwgaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVjawotCSAqLwotCXByb3RlY3RlZCA8RT4gTGlzdDxFPiBzZXRJdGVtc0luTGlzdF8oaW50IGluZGV4LCBMaXN0PD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJTGlzdDxFPiBzdWJMaXN0ID0gbGlzdC5zdWJMaXN0KGluZGV4LCBpbmRleCArIGl0ZW1zLnNpemUoKSk7Ci0JCUxpc3Q8RT4gb2xkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEU+KHN1Ykxpc3QpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQlFIG5ld0l0ZW0gPSBpdGVtcy5nZXQoaSk7Ci0JCQlFIG9sZEl0ZW0gPSBzdWJMaXN0LnNldChpLCBuZXdJdGVtKTsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChsaXN0TmFtZSwgaW5kZXggKyBpLCBuZXdJdGVtLCBvbGRJdGVtKTsKLQkJfQotCQlyZXR1cm4gb2xkSXRlbXM7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGxpc3QgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgdGFyZ2V0IGluZGV4IGZvciB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBtb3ZlSXRlbXNJbkxpc3QoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmICgodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHx8IChsZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBpdCdzIHVubGlrZWx5IGJ1dCBwb3NzaWJsZSB0aGUgbGlzdCBpcyB1bmNoYW5nZWQgYnkgdGhlIG1vdmUuLi4gKGUuZy4gYW55IG1vdmVzIHdpdGhpbiBbImZvbyIsICJmb28iLCAiZm9vIl0uLi4pCi0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQkJdGhpcy5maXJlSXRlbXNNb3ZlZChsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGFuIGl0ZW0gaW4gdGhlIHNwZWNpZmllZCBsaXN0IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlCi0JICogc3BlY2lmaWVkIHRhcmdldCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBtb3ZlSXRlbUluTGlzdChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gaXQncyB1bmxpa2VseSBidXQgcG9zc2libGUgdGhlIGxpc3QgaXMgdW5jaGFuZ2VkIGJ5IHRoZSBtb3ZlLi4uIChlLmcuIGFueSBtb3ZlcyB3aXRoaW4gWyJmb28iLCAiZm9vIiwgImZvbyJdLi4uKQotCQlDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmZpcmVJdGVtTW92ZWQobGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENsZWFyIHRoZSBlbnRpcmUgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbGVhckxpc3QoTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2xlYXJMaXN0XyhsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGVhckxpc3RfKExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWxpc3QuY2xlYXIoKTsKLQkJdGhpcy5maXJlTGlzdENsZWFyZWQobGlzdE5hbWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgbGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmV3IGxpc3QsCi0JICogbWFraW5nIGEgbWluaW11bSBudW1iZXIgb2Ygc2V0cywgcmVtb3ZlcywgYW5kL29yIGFkZHMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gc3luY2hyb25pemVMaXN0KExpc3Q8RT4gbmV3TGlzdCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKG5ld0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckxpc3QobGlzdCwgbGlzdE5hbWUpOwotCQl9Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3RfKG5ld0xpc3QsIGxpc3QsIGxpc3ROYW1lKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zeW5jaHJvbml6ZUxpc3RfKG5ld0xpc3QsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgbGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmV3IGxpc3QsCi0JICogbWFraW5nIGEgbWluaW11bSBudW1iZXIgb2Ygc2V0cywgcmVtb3ZlcywgYW5kL29yIGFkZHMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gc3luY2hyb25pemVMaXN0KEl0ZXJhdG9yPEU+IG5ld0xpc3QsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmICggISBuZXdMaXN0Lmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJMaXN0KGxpc3QsIGxpc3ROYW1lKTsKLQkJfQotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9MaXN0XyhuZXdMaXN0LCBsaXN0LCBsaXN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc3luY2hyb25pemVMaXN0XyhDb2xsZWN0aW9uVG9vbHMubGlzdChuZXdMaXN0KSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrcwotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUxpc3RfKExpc3Q8RT4gbmV3TGlzdCwgTGlzdDxFPiBvbGRMaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaW50IG5ld1NpemUgPSBuZXdMaXN0LnNpemUoKTsKLQkJaW50IG9sZFNpemUgPSBvbGRMaXN0LnNpemUoKTsKLQotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJaW50IG1pbiA9IE1hdGgubWluKG5ld1NpemUsIG9sZFNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1pbjsgaSsrKSB7Ci0JCQlFIG5ld0l0ZW0gPSBuZXdMaXN0LmdldChpKTsKLQkJCUUgb2xkSXRlbSA9IG9sZExpc3Quc2V0KGksIG5ld0l0ZW0pOwotCQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG5ld0l0ZW0sIG9sZEl0ZW0pKSB7Ci0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkXyhsaXN0TmFtZSwgaSwgbmV3SXRlbSwgb2xkSXRlbSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmV3U2l6ZSA9PSBvbGRTaXplKSB7Ci0JCQlyZXR1cm4gY2hhbmdlZDsKLQkJfQotCi0JCWlmIChuZXdTaXplIDwgb2xkU2l6ZSkgewotCQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0XyhuZXdTaXplLCBvbGRTaXplIC0gbmV3U2l6ZSwgb2xkTGlzdCwgbGlzdE5hbWUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBuZXdTaXplID4gb2xkU2l6ZQotCQl0aGlzLmFkZEl0ZW1zVG9MaXN0XyhuZXdMaXN0LnN1Ykxpc3Qob2xkU2l6ZSwgbmV3U2l6ZSksIG9sZExpc3QsIGxpc3ROYW1lKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyZWUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlQ2hhbmdlTGlzdGVuZXI+IFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTID0gVHJlZUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCi0JLyoqCi0JICogQWRkIGEgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgdHJlZS4gVGhlIGxpc3RlbmVyCi0JICogd2lsbCBiZSBub3RpZmllZCBvbmx5IGZvciBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgdHJlZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHRyZWVOYW1lLCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcihUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSB0cmVlIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciBhIHNwZWNpZmljIHRyZWUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIoVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSB0cmVlIGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHRyZWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgdHJlZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCB0cmVlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8VHJlZUNoYW5nZUxpc3RlbmVyPiBnZXRUcmVlQ2hhbmdlTGlzdGVuZXJMaXN0KFN0cmluZyB0cmVlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3QoVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gZ2V0VHJlZUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgdHJlZU5hbWUpIHsKLQkJTGlzdGVuZXJMaXN0PFRyZWVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJMaXN0KHRyZWVOYW1lKTsKLQkJcmV0dXJuIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgPyBudWxsIDogbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHRyZWVOYW1lLCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyB0cmVlTmFtZSA9IGV2ZW50LmdldFRyZWVOYW1lKCk7Ci0JCUl0ZXJhYmxlPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1RyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5ub2RlQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm9kZUFkZGVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0vLwkJdGhpcy5maXJlTm9kZUFkZGVkKG5ldyBUcmVlQWRkRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKSk7Ci0JCVRyZWVBZGRFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1RyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBUcmVlQWRkRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5ub2RlQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVBZGRFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHRyZWVOYW1lID0gZXZlbnQuZ2V0VHJlZU5hbWUoKTsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm9kZVJlbW92ZWQoU3RyaW5nIHRyZWVOYW1lLCBMaXN0PD8+IHBhdGgpIHsKLS8vCQl0aGlzLmZpcmVOb2RlUmVtb3ZlZChuZXcgVHJlZVJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgcGF0aCkpOwotCi0JCVRyZWVSZW1vdmVFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1RyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBUcmVlUmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5ub2RlUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgVHJlZVJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgcGF0aCk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHRyZWVOYW1lID0gZXZlbnQuZ2V0VHJlZU5hbWUoKTsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNsZWFyZWQoU3RyaW5nIHRyZWVOYW1lKSB7Ci0vLwkJdGhpcy5maXJlVHJlZUNsZWFyZWQobmV3IFRyZWVDbGVhckV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSkpOwotCi0JCVRyZWVDbGVhckV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVDbGVhckV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVDbGVhckV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyB0cmVlTmFtZSA9IGV2ZW50LmdldFRyZWVOYW1lKCk7Ci0JCUl0ZXJhYmxlPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1RyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFN0cmluZyB0cmVlTmFtZSwgQ29sbGVjdGlvbjw/PiBub2RlcykgewotLy8JCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKG5ldyBUcmVlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBub2RlcykpOwotCi0JCVRyZWVDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1RyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBUcmVlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBub2Rlcyk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIudHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIG5vZGVzKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci50cmVlQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZXMgYXJlIGVxdWFsLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBudWxsIGNoZWNrcy4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gYXR0cmlidXRlIHZhbHVlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbHVlc0FyZUVxdWFsKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHZhbHVlMSwgdmFsdWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBudWxsIGNoZWNrcy4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gYXR0cmlidXRlIHZhbHVlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbHVlc0FyZURpZmZlcmVudChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQodmFsdWUxLCB2YWx1ZTIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGVzIHJldHVybiB0aGUgc2FtZSBlbGVtZW50cwotCSAqIGluIHRoZSBzYW1lIG9yZGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVsZW1lbnRzQXJlRXF1YWwoSXRlcmFibGU8Pz4gaXRlcmFibGUxLCBJdGVyYWJsZTw/PiBpdGVyYWJsZTIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGl0ZXJhYmxlMSwgaXRlcmFibGUyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlcyBkbyBub3QgcmV0dXJuIHRoZSBzYW1lIGVsZW1lbnRzCi0JICogaW4gdGhlIHNhbWUgb3JkZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZWxlbWVudHNBcmVEaWZmZXJlbnQoSXRlcmFibGU8Pz4gaXRlcmFibGUxLCBJdGVyYWJsZTw/PiBpdGVyYWJsZTIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZURpZmZlcmVudChpdGVyYWJsZTEsIGl0ZXJhYmxlMik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zb3VyY2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBQYWlyIGFuIGFzcGVjdCBuYW1lIHdpdGggaXRzIGFzc29jaWF0ZWQgbGlzdGVuZXJzLgotCSAqLwotCXN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPgotCQlpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQotCXsKLQkJZmluYWwgTGlzdGVuZXJMaXN0PEw+IGxpc3RlbmVyTGlzdDsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlBc3BlY3RMaXN0ZW5lckxpc3RQYWlyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIEwgbGlzdGVuZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TD4obGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCQl9Ci0KLQkJYm9vbGVhbiBtYXRjaGVzKENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lckNsYXNzLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJCXJldHVybiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lclR5cGUoKSA9PSBsaXN0ZW5lckNsYXNzOwotCQl9Ci0KLQkJYm9vbGVhbiBtYXRjaGVzKENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lckNsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYXRjaGVzKGxpc3RlbmVyQ2xhc3MsIG51bGwpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmdldEFzcGVjdE5hbWUoKSk7Ci0JCX0KLQotCQlhYnN0cmFjdCBTdHJpbmcgZ2V0QXNwZWN0TmFtZSgpOwotCi0JfQotCi0JLyoqCi0JICogUGFpciBhbiBhc3BlY3QgbmFtZSB3aXRoIGl0cyBhc3NvY2lhdGVkIGxpc3RlbmVycy4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgU2ltcGxlQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4KLQkJZXh0ZW5kcyBBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPEw+Ci0JewotCQlmaW5hbCBTdHJpbmcgYXNwZWN0TmFtZTsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlTaW1wbGVBc3BlY3RMaXN0ZW5lckxpc3RQYWlyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lLCBMIGxpc3RlbmVyKSB7Ci0JCQlzdXBlcihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7Ci0JCQlpZiAoYXNwZWN0TmFtZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmFzcGVjdE5hbWUgPSBhc3BlY3ROYW1lOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWJvb2xlYW4gbWF0Y2hlcyhDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcywgQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5hc3BlY3ROYW1lLmVxdWFscyhhc3BlY3ROYW1lKQotCQkJCQkmJiBzdXBlci5tYXRjaGVzKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCVN0cmluZyBnZXRBc3BlY3ROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuYXNwZWN0TmFtZTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUGFpciBhIG51bGwgYXNwZWN0IG5hbWUgd2l0aCBpdHMgYXNzb2NpYXRlZCBsaXN0ZW5lcnMuCi0JICovCi0Jc3RhdGljIGNsYXNzIE51bGxBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPgotCQlleHRlbmRzIEFzcGVjdExpc3RlbmVyTGlzdFBhaXI8TD4KLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCU51bGxBc3BlY3RMaXN0ZW5lckxpc3RQYWlyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIEwgbGlzdGVuZXIpIHsKLQkJCXN1cGVyKGxpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlib29sZWFuIG1hdGNoZXMoQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCQlyZXR1cm4gKGFzcGVjdE5hbWUgPT0gbnVsbCkKLQkJCQkJJiYgc3VwZXIubWF0Y2hlcyhsaXN0ZW5lckNsYXNzLCBudWxsKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlTdHJpbmcgZ2V0QXNwZWN0TmFtZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTU4ODMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLQotLyoqCi0gKiBUaGlzIGNoYW5nZSBzdXBwb3J0IGNsYXNzIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBzdGFuZGFyZAotICogY2hhbmdlIHN1cHBvcnQgaW4gc2V2ZXJhbCB3YXlzOjx1bD4KLSAqIDxsaT5BbGwgZXZlbnRzIGZpcmVkIGJ5IHRoZSBzb3VyY2UgbXVzdCBzcGVjaWZ5IHRoZSBzaW5nbGUgYXNwZWN0LgotICogPGxpPkxpc3RlbmVycyBhcmUgcmVxdWlyZWQgdG8gYmUgZWl0aGVyICJnZW5lcmFsIHB1cnBvc2UiIGxpc3RlbmVycyBvcgotICogCSAgICBsaXN0ZW5lcnMgb2YgdGhlIHNpbmdsZSBhc3BlY3QuCi0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydAotCWV4dGVuZHMgQ2hhbmdlU3VwcG9ydAotewotCXByb3RlY3RlZCBmaW5hbCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdmFsaWRMaXN0ZW5lckNsYXNzOwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgdmFsaWRBc3BlY3ROYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQoTW9kZWwgc291cmNlLCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdmFsaWRMaXN0ZW5lckNsYXNzLCBTdHJpbmcgdmFsaWRBc3BlY3ROYW1lKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCWlmICggISB2YWxpZExpc3RlbmVyQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0aGlzLmdldENoYW5nZUxpc3RlbmVyQ2xhc3MoKSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjaGFuZ2Ugc3VwcG9ydCdzIGNoYW5nZSBsaXN0ZW5lciBjbGFzcyAoIiArIHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJDbGFzcygpLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJIikgZG9lcyBub3QgZXh0ZW5kIHRoZSB2YWxpZCBsaXN0ZW5lciBjbGFzczogIiArIHZhbGlkTGlzdGVuZXJDbGFzcy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy52YWxpZExpc3RlbmVyQ2xhc3MgPSB2YWxpZExpc3RlbmVyQ2xhc3M7Ci0JCXRoaXMudmFsaWRBc3BlY3ROYW1lID0gdmFsaWRBc3BlY3ROYW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGJ1aWxkVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCXJldHVybiBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0JCQkJIlRoaXMgTW9kZWwgc3VwcG9ydHMgb25seSBjaGFuZ2VzIGZvciB0aGUgbGlzdGVuZXIgdHlwZSBcIiIgKyB0aGlzLnZhbGlkTGlzdGVuZXJDbGFzcy5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCSsgIlwiIGFuZCB0aGUgYXNwZWN0IFwiIiArIHRoaXMudmFsaWRBc3BlY3ROYW1lICsgJyInIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGxpc3RlbmVyIGNhbiBiZSBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgdGhlIHZhbGlkIGxpc3RlbmVyIGNsYXNzIG9yCi0JICogdGhlICJnZW5lcmFsLXB1cnBvc2UiIGNoYW5nZSBsaXN0ZW5lciBjbGFzcyAod2hpY2ggc2hvdWxkIGV4dGVuZCB0aGUKLQkgKiB0aGUgdmFsaWQgbGlzdGVuZXIgY2xhc3MpLgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVjayhDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcykgewotCQlpZiAoKGxpc3RlbmVyQ2xhc3MgIT0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lckNsYXNzKCkpICYmIChsaXN0ZW5lckNsYXNzICE9IHRoaXMudmFsaWRMaXN0ZW5lckNsYXNzKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoaXMgTW9kZWwgc3VwcG9ydHMgb25seSBjaGFuZ2VzIGZvciB0aGUgbGlzdGVuZXIgdHlwZSBcIiIgKyB0aGlzLnZhbGlkTGlzdGVuZXJDbGFzcy5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkrICJcIiA6IFwiIiArIGxpc3RlbmVyQ2xhc3MuZ2V0TmFtZSgpICsgJyInIC8vJE5PTi1OTFMtMSQKLQkJCQkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrKENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQl0aGlzLmNoZWNrKGxpc3RlbmVyQ2xhc3MpOwotCQlpZiAoICEgYXNwZWN0TmFtZS5lcXVhbHModGhpcy52YWxpZEFzcGVjdE5hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVGhpcyBNb2RlbCBzdXBwb3J0cyBvbmx5IGNoYW5nZXMgZm9yIHRoZSBhc3BlY3QgXCIiICsgdGhpcy52YWxpZEFzcGVjdE5hbWUgLy8kTk9OLU5MUy0xJAotCQkJCQkrICJcIiA6IFwiIiArIGFzcGVjdE5hbWUgKyAnIicgLy8kTk9OLU5MUy0xJAotCQkJCSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSwgTCBsaXN0ZW5lcikgewotCQl0aGlzLmNoZWNrKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCQlzdXBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgYWRkTGlzdGVuZXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgTCBsaXN0ZW5lcikgewotCQl0aGlzLmNoZWNrKGxpc3RlbmVyQ2xhc3MpOwotCQlzdXBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUsIEwgbGlzdGVuZXIpIHsKLQkJdGhpcy5jaGVjayhsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIHJlbW92ZUxpc3RlbmVyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIEwgbGlzdGVuZXIpIHsKLQkJdGhpcy5jaGVjayhsaXN0ZW5lckNsYXNzKTsKLQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGJvb2xlYW4gaGFzQW55TGlzdGVuZXJzKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXRoaXMuY2hlY2sobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JCXJldHVybiBzdXBlci5oYXNBbnlMaXN0ZW5lcnMobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gYm9vbGVhbiBoYXNBbnlMaXN0ZW5lcnMoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcykgewotCQl0aGlzLmNoZWNrKGxpc3RlbmVyQ2xhc3MpOwotCQlyZXR1cm4gc3VwZXIuaGFzQW55TGlzdGVuZXJzKGxpc3RlbmVyQ2xhc3MpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhyb3cgdGhpcy5idWlsZFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLQkJdGhyb3cgdGhpcy5idWlsZFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuY2hlY2soUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBwcm9wZXJ0eU5hbWUpOwotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuY2hlY2soUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBwcm9wZXJ0eU5hbWUpOwotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJdGhpcy5jaGVjayhQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHByb3BlcnR5TmFtZSk7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJc3VwZXIuZmlyZUl0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBhZGRlZEl0ZW1zKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1zQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1BZGRlZChjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW1zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgcmVtb3ZlZEl0ZW0pIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCQlzdXBlci5maXJlSXRlbVJlbW92ZWQoY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXN1cGVyLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNoYW5nZWQoY29sbGVjdGlvbk5hbWUsIGNvbGxlY3Rpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJc3VwZXIuZmlyZUl0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGFkZGVkSXRlbXMpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiByZW1vdmVkSXRlbXMpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlSXRlbXNSZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCByZW1vdmVkSXRlbSkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlzdXBlci5maXJlSXRlbXNSZXBsYWNlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gbmV3SXRlbXMsIExpc3Q8Pz4gcmVwbGFjZWRJdGVtcykgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIHJlcGxhY2VkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBuZXdJdGVtLCBPYmplY3QgcmVwbGFjZWRJdGVtKSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1SZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW0sIHJlcGxhY2VkSXRlbSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJc3VwZXIuZmlyZUl0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc01vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlSXRlbXNNb3ZlZChsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJc3VwZXIuZmlyZUxpc3RDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENsZWFyZWQoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJc3VwZXIuZmlyZUxpc3RDbGVhcmVkKGxpc3ROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlzdXBlci5maXJlTGlzdENoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2hhbmdlZChTdHJpbmcgbGlzdE5hbWUsIExpc3Q8Pz4gbGlzdCkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXN1cGVyLmZpcmVMaXN0Q2hhbmdlZChsaXN0TmFtZSwgbGlzdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyZWUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVOb2RlQWRkZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlQWRkZWQoU3RyaW5nIHRyZWVOYW1lLCBMaXN0PD8+IHBhdGgpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUpOwotCQlzdXBlci5maXJlTm9kZUFkZGVkKHRyZWVOYW1lLCBwYXRoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCQlzdXBlci5maXJlTm9kZVJlbW92ZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlUmVtb3ZlZChTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCB0cmVlTmFtZSk7Ci0JCXN1cGVyLmZpcmVOb2RlUmVtb3ZlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCQlzdXBlci5maXJlVHJlZUNsZWFyZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChTdHJpbmcgdHJlZU5hbWUpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUpOwotCQlzdXBlci5maXJlVHJlZUNsZWFyZWQodHJlZU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVUcmVlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFN0cmluZyB0cmVlTmFtZSwgQ29sbGVjdGlvbjw/PiBub2RlcykgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCB0cmVlTmFtZSk7Ci0JCXN1cGVyLmZpcmVUcmVlQ2hhbmdlZCh0cmVlTmFtZSwgbm9kZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZmUzZTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dDsKLQotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBBV1QKLSAqIGV2ZW50IHF1ZXVlLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFXVENoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0KLQlwdWJsaWMgQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuc3RhdGVDaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZFN0YXRlQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNBZGRlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkQ29sbGVjdGlvbkNsZWFyZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNBZGRlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNNb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNSZXBsYWNlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc1JlcGxhY2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLmxpc3RDbGVhcmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZExpc3RDbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5saXN0Q2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRMaXN0Q2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLm5vZGVBZGRlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGROb2RlQWRkZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLm5vZGVSZW1vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZE5vZGVSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnRyZWVDbGVhcmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZFRyZWVDbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy50cmVlQ2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRUcmVlQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkU3RhdGVDaGFuZ2VkUnVubmFibGUoZmluYWwgU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnN0YXRlQ2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRQcm9wZXJ0eUNoYW5nZWRSdW5uYWJsZShmaW5hbCBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMucHJvcGVydHlDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyBhZGRlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZW1vdmVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRDb2xsZWN0aW9uQ2xlYXJlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2xlYXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZmluYWwgTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgcmVtb3ZlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNNb3ZlZFJ1bm5hYmxlKGZpbmFsIExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc01vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyBtb3ZlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNSZXBsYWNlZFJ1bm5hYmxlKGZpbmFsIExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZXBsYWNlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTGlzdENsZWFyZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmxpc3RDbGVhcmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGNsZWFyZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZExpc3RDaGFuZ2VkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubGlzdENoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgY2hhbmdlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTm9kZUFkZGVkUnVubmFibGUoZmluYWwgVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubm9kZUFkZGVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIGFkZGVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGROb2RlUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLm5vZGVSZW1vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHJlbW92ZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRyZWVDbGVhcmVkUnVubmFibGUoZmluYWwgVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy50cmVlQ2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJlZSBjbGVhcmVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRUcmVlQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnRyZWVDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNoYW5nZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25VSVRocmVhZCgpIHsKLQkJcmV0dXJuIEV2ZW50UXVldWUuaXNEaXNwYXRjaFRocmVhZCgpOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBFdmVudFF1ZXVlI2ludm9rZUxhdGVyKFJ1bm5hYmxlKX0gc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlQW5kV2FpdChSdW5uYWJsZSl9IGNhbiBzb21ldGltZXMgbWFrZQotCSAqIHRoaW5ncyBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPbkV2ZW50UXVldWUoUnVubmFibGUgcikgewotCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKHIpOwotLy8JCXRyeSB7Ci0vLwkJCUV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChyKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfQotCX0KLQotCXZvaWQgc3RhdGVDaGFuZ2VkXyhTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIHByb3BlcnR5Q2hhbmdlZF8oUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc0FkZGVkXyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zUmVtb3ZlZF8oQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGNvbGxlY3Rpb25DbGVhcmVkXyhDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkXyhDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc0FkZGVkXyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zUmVtb3ZlZF8oTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zTW92ZWRfKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc01vdmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zUmVwbGFjZWRfKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGxpc3RDbGVhcmVkXyhMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGxpc3RDaGFuZ2VkXyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5saXN0Q2hhbmdlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBub2RlQWRkZWRfKFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBub2RlUmVtb3ZlZF8oVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNsZWFyZWRfKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNoYW5nZWRfKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODdmNTRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBBV1QKLSAqIGV2ZW50IHF1ZXVlLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIEFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2xlYXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkgewotCQlyZXR1cm4gRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkKCk7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKX0gY2FuIHNvbWV0aW1lcyBtYWtlCi0JICogdGhpbmdzIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBpdGVtc0FkZGVkXyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zUmVtb3ZlZF8oQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGNvbGxlY3Rpb25DbGVhcmVkXyhDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkXyhDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkNmZlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dDsKLQotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBsaXN0IGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIEFXVAotICogZXZlbnQgcXVldWUsIGFzeW5jaHJvbm91c2x5IGlmIG5lY2Vzc2FyeS4gSWYgdGhlIGV2ZW50IGFycml2ZWQgb24gdGhlIFVJCi0gKiB0aHJlYWQgdGhhdCBpcyBwcm9iYWJseSBiZWNhdXNlIGl0IHdhcyBpbml0aWF0ZWQgYnkgYSBVSSB3aWRnZXQ7IGFzIGEKLSAqIHJlc3VsdCwgd2Ugd2FudCB0byBsb29wIGJhY2sgc3luY2hyb25vdXNseSBzbyB0aGUgZXZlbnRzIGNhbiBiZQotICogc2hvcnQtY2lyY3VpdGVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc01vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZXBsYWNlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRMaXN0Q2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubGlzdENoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTGlzdENoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIG1vdmVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlcGxhY2VkUnVubmFibGUoZmluYWwgTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZXBsYWNlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTGlzdENsZWFyZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjbGVhcmVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRMaXN0Q2hhbmdlZFJ1bm5hYmxlKGZpbmFsIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSB7Ci0JCXJldHVybiBFdmVudFF1ZXVlLmlzRGlzcGF0Y2hUaHJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VMYXRlcihSdW5uYWJsZSl9IHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nIHtAbGluayBFdmVudFF1ZXVlI2ludm9rZUFuZFdhaXQoUnVubmFibGUpfSBjYW4gc29tZXRpbWVzIG1ha2UKLQkgKiB0aGluZ3MgbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25FdmVudFF1ZXVlKFJ1bm5hYmxlIHIpIHsKLQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihyKTsKLS8vCQl0cnkgewotLy8JCQlFdmVudFF1ZXVlLmludm9rZUFuZFdhaXQocik7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0KLQl9Ci0KLQl2b2lkIGl0ZW1zQWRkZWRfKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZW1vdmVkXyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZXBsYWNlZF8oTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENsZWFyZWRfKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENoYW5nZWRfKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYTI1MmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3Q7Ci0KLWltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBBV1QKLSAqIGV2ZW50IHF1ZXVlLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0KLQlwdWJsaWMgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFByb3BlcnR5Q2hhbmdlZFJ1bm5hYmxlKGZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSB7Ci0JCXJldHVybiBFdmVudFF1ZXVlLmlzRGlzcGF0Y2hUaHJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VMYXRlcihSdW5uYWJsZSl9IHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nIHtAbGluayBFdmVudFF1ZXVlI2ludm9rZUFuZFdhaXQoUnVubmFibGUpfSBjYW4gc29tZXRpbWVzIG1ha2UKLQkgKiB0aGluZ3MgbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25FdmVudFF1ZXVlKFJ1bm5hYmxlIHIpIHsKLQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihyKTsKLS8vCQl0cnkgewotLy8JCQlFdmVudFF1ZXVlLmludm9rZUFuZFdhaXQocik7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0KLQl9Ci0KLQl2b2lkIHByb3BlcnR5Q2hhbmdlZF8oUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWVmMjM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgc3RhdGUgY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgQVdUCi0gKiBldmVudCBxdWV1ZSwgYXN5bmNocm9ub3VzbHkgaWYgbmVjZXNzYXJ5LiBJZiB0aGUgZXZlbnQgYXJyaXZlZCBvbiB0aGUgVUkKLSAqIHRocmVhZCB0aGF0IGlzIHByb2JhYmx5IGJlY2F1c2UgaXQgd2FzIGluaXRpYXRlZCBieSBhIFVJIHdpZGdldDsgYXMgYQotICogcmVzdWx0LCB3ZSB3YW50IHRvIGxvb3AgYmFjayBzeW5jaHJvbm91c2x5IHNvIHRoZSBldmVudHMgY2FuIGJlCi0gKiBzaG9ydC1jaXJjdWl0ZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgU3RhdGVDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBBV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuc3RhdGVDaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZFN0YXRlQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkU3RhdGVDaGFuZ2VkUnVubmFibGUoZmluYWwgU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuc3RhdGVDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25VSVRocmVhZCgpIHsKLQkJcmV0dXJuIEV2ZW50UXVldWUuaXNEaXNwYXRjaFRocmVhZCgpOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBFdmVudFF1ZXVlI2ludm9rZUxhdGVyKFJ1bm5hYmxlKX0gc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlQW5kV2FpdChSdW5uYWJsZSl9IGNhbiBzb21ldGltZXMgbWFrZQotCSAqIHRoaW5ncyBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPbkV2ZW50UXVldWUoUnVubmFibGUgcikgewotCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKHIpOwotLy8JCXRyeSB7Ci0vLwkJCUV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChyKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfQotCX0KLQotCXZvaWQgc3RhdGVDaGFuZ2VkXyhTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWUzYTUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBBV1QKLSAqIGV2ZW50IHF1ZXVlLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIFRyZWVDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIEFXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5ub2RlQWRkZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTm9kZUFkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5ub2RlUmVtb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGROb2RlUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy50cmVlQ2xlYXJlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRUcmVlQ2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMudHJlZUNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVBZGRlZFJ1bm5hYmxlKGZpbmFsIFRyZWVBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5ub2RlQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgYWRkZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVSZW1vdmVkUnVubmFibGUoZmluYWwgVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLm5vZGVSZW1vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHJlbW92ZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRyZWVDbGVhcmVkUnVubmFibGUoZmluYWwgVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2xlYXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2hhbmdlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkgewotCQlyZXR1cm4gRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkKCk7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKX0gY2FuIHNvbWV0aW1lcyBtYWtlCi0JICogdGhpbmdzIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBub2RlQWRkZWRfKFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBub2RlUmVtb3ZlZF8oVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNsZWFyZWRfKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNoYW5nZWRfKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczN2VlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgZm9yICJsYXppbHkiIGFkZGluZyBsaXN0ZW5lcnMKLSAqIHRvIGFuIHVuZGVybHlpbmcgbW9kZWwgYXMgbmVjZXNzYXJ5LiBTdWJjbGFzc2VzIHdpbGwgbmVlZCB0byBlbmdhZ2UgYW5kCi0gKiBkaXNlZ2FnZSB0aGUgdW5kZXJseWluZyBtb2RlbCBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgY29sbGVjdGlvbiBjaGFuZ2UKLSAqIGV2ZW50cy4gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfS4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlTW9kZWwoKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgdW5kZXJseWluZyBtb2RlbAotICogPGxpPntAbGluayAjZGlzZW5nYWdlTW9kZWwoKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbAotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuY2xhc3MsIENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4dGVuZCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoY29sbGVjdGlvbk5hbWUuZXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykgJiYgdGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKTsKLQkJaWYgKGNvbGxlY3Rpb25OYW1lLmVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBjb2xsZWN0aW9uIHZhbHVlIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIGFueSBjb2xsZWN0aW9uIHZhbHVlIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogRW5nYWdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZU1vZGVsKCk7Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RMaXN0VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0TGlzdFZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzllZTI1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgZm9yICJsYXppbHkiIGFkZGluZyBsaXN0ZW5lcnMKLSAqIHRvIGFuIHVuZGVybHlpbmcgbW9kZWwgYXMgbmVjZXNzYXJ5LiBTdWJjbGFzc2VzIHdpbGwgbmVlZCB0byBlbmdhZ2UgYW5kCi0gKiBkaXNlZ2FnZSB0aGUgdW5kZXJseWluZyBtb2RlbCBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgbGlzdCBjaGFuZ2UKLSAqIGV2ZW50cy4gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUge0BsaW5rIExpc3RWYWx1ZU1vZGVsfS4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlTW9kZWwoKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgdW5kZXJseWluZyBtb2RlbAotICogPGxpPntAbGluayAjZGlzZW5nYWdlTW9kZWwoKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMaXN0VmFsdWVNb2RlbAotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RMaXN0VmFsdWVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3MsIExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZW5kIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0TmFtZS5lcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKTsKLQkJaWYgKGxpc3ROYW1lLmVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykgJiYgdGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIGNvbGxlY3Rpb24gdmFsdWUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc0xpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgYW55IGNvbGxlY3Rpb24gdmFsdWUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEVuZ2FnZSB0aGUgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VNb2RlbCgpOwotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzZW5nYWdlTW9kZWwoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1ZWZlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgZm9yICJsYXppbHkiIGFkZGluZyBsaXN0ZW5lcnMKLSAqIHRvIGFuIHVuZGVybHlpbmcgbW9kZWwgYXMgbmVjZXNzYXJ5LiBTdWJjbGFzc2VzIHdpbGwgbmVlZCB0byBlbmdhZ2UgYW5kCi0gKiBkaXNlZ2FnZSB0aGUgdW5kZXJseWluZyBtb2RlbCBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgcHJvcGVydHkgY2hhbmdlCi0gKiBldmVudHMuIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9LgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczo8dWw+Ci0gKiA8bGk+e0BsaW5rICNlbmdhZ2VNb2RlbCgpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0gKiA8bGk+e0BsaW5rICNkaXNlbmdhZ2VNb2RlbCgpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZW1vdmUgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIGZyb20gdGhlIHVuZGVybHlpbmcgbW9kZWwKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbAotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5jbGFzcywgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZW5kIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkgJiYgdGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIHByb3BlcnR5IHZhbHVlIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIGFueSBwcm9wZXJ0eSB2YWx1ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFbmdhZ2UgdGhlIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5nYWdlTW9kZWwoKTsKLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxNDU2ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgY29udmVydAotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gcHJvcGVydHkgdmFsdWUgbW9kZWwgY2hhbmdlCi0gKiBub3RpZmljYXRpb25zLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Ojx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWUoKX08cD4KLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjdXJyZW50IG1vZGVsCi0gKiA8bGk+e0BsaW5rICNlbmdhZ2VNb2RlbF8oKX08cD4KLSAqICAgICB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGFkYXB0ZWQgbW9kZWwKLSAqIDxsaT57QGxpbmsgI2Rpc2VuZ2FnZU1vZGVsXygpfTxwPgotICogICAgIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBhZGFwdGVkIG1vZGVsCi0gKiA8L3VsPgotICogU3ViY2xhc3NlcyBjYW4gY2FsbCB7QGxpbmsgI3Byb3BlcnR5Q2hhbmdlZCgpfSB3aGVuZXZlciB0aGUgY2FsY3VsYXRlZAotICogdmFsdWUgb2YgdGhlIHByb3BlcnR5IGNoYW5nZXMgKGFzIGRldGVybWluZWQgYnkgdGhlIHN1YmNsYXNzKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxWPgotCWV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwKLQlpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWVNb2RlbDxWPgotewotCS8qKgotCSAqIENhY2hlIHRoZSBjdXJyZW50IHZhbHVlIHNvIHdlIGNhbiBwYXNzIGFuICJvbGQgdmFsdWUiIHdoZW4KLQkgKiB3ZSBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqIFdlIG5lZWQgdGhpcyBiZWNhdXNlIHRoZSB2YWx1ZSBtYXkgYmUgY2FsY3VsYXRlZCBhbmQgd2UgbWF5Ci0JICogbm90IGFibGUgdG8gZGVyaXZlIHRoZSAib2xkIHZhbHVlIiBmcm9tIGFueSBmaXJlZCBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIFYgdmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQkJLy8gb3VyIHZhbHVlIGlzIG51bGwgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgbW9kZWwKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNhY2hlZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgViBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbW9kZWwgYW5kIGJ1aWxkIHRoZSB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5lbmdhZ2VNb2RlbF8oKTsKLQkJLy8gc3luY2ggb3VyIHZhbHVlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbCwKLQkJLy8gc2luY2UgdGhlIG1vZGVsJ3MgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VNb2RlbF8oKTsKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLQkgKiBjdXJyZW50IHN0YXRlIG9mIHRoZSB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBWIGJ1aWxkVmFsdWUoKTsKLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbCBhbmQgY2xlYXIgdGhlIHZhbHVlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmRpc2VuZ2FnZU1vZGVsXygpOwotCQkvLyBjbGVhciBvdXQgb3VyIHZhbHVlIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsCi0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VNb2RlbF8oKTsKLQotCS8qKgotCSAqIFRoZSB1bmRlcmx5aW5nIG1vZGVsIGNoYW5nZWQgaW4gc29tZSBmYXNoaW9uLgotCSAqIFJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgbm90aWZ5IGFueSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKCkgewotCQlPYmplY3Qgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGQsIHRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDZjMmUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DaGFpbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVOb2RlVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBTdWJjbGFzc2VzIG5lZWQgb25seSBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICogCi0gKiAjdmFsdWUoKQotICoJICAgIHJldHVybiB0aGUgdXNlci1kZXRlcm1pbmVkICJ2YWx1ZSIgb2YgdGhlIG5vZGUsCi0gKiAgICAgaS5lLiB0aGUgb2JqZWN0ICJ3cmFwcGVkIiBieSB0aGUgbm9kZQotICogCi0gKiAjc2V0VmFsdWUoT2JqZWN0KQotICogICAgIHNldCB0aGUgdXNlci1kZXRlcm1pbmVkICJ2YWx1ZSIgb2YgdGhlIG5vZGUsCi0gKiAgICAgaS5lLiB0aGUgb2JqZWN0ICJ3cmFwcGVkIiBieSB0aGUgbm9kZTsKLSAqICAgICB0eXBpY2FsbHkgb25seSBvdmVycmlkZGVuIGZvciBub2RlcyB3aXRoICJwcmltaXRpdmUiIHZhbHVlcwotICogCi0gKiAjcGFyZW50KCkKLSAqICAgICByZXR1cm4gdGhlIHBhcmVudCBvZiB0aGUgbm9kZSwgd2hpY2ggc2hvdWxkIGJlIGFub3RoZXIKLSAqICAgICBUcmVlTm9kZVZhbHVlTW9kZWwKLSAqIAotICogI2NoaWxkcmVuTW9kZWwoKQotICogICAgIHJldHVybiBhIExpc3RWYWx1ZU1vZGVsIGZvciB0aGUgbm9kZSdzIGNoaWxkcmVuCi0gKiAKLSAqICNlbmdhZ2VWYWx1ZSgpIGFuZCAjZGlzZW5nYWdlVmFsdWUoKQotICogICAgIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgdG8gbGlzdGVuIHRvIHRoZSBub2RlJ3MgdmFsdWUgaWYKLSAqICAgICBpdCBjYW4gY2hhbmdlIGluIGEgd2F5IHRoYXQgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiB0aGUgdHJlZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIFRyZWVOb2RlVmFsdWVNb2RlbDxUPgotewotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJLy8gdGhpcyBtb2RlbCBmaXJlcyAqYm90aCogInZhbHVlIHByb3BlcnR5IGNoYW5nZSIgYW5kICJzdGF0ZSBjaGFuZ2UiIGV2ZW50cy4uLgotLy8JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlyZXR1cm4gc3VwZXIuYnVpbGRDaGFuZ2VTdXBwb3J0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4dGVuZCBBYnN0cmFjdE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENsaWVudHMgc2hvdWxkIGJlIGFkZGluZyBib3RoICJzdGF0ZSBjaGFuZ2UiIGFuZCAidmFsdWUgcHJvcGVydHkgY2hhbmdlIgotCSAqIGxpc3RlbmVycy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuaGFzTm9TdGF0ZUNoYW5nZUxpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZVZhbHVlKCk7Ci0JCX0KLQkJc3VwZXIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQmVnaW4gbGlzdGVuaW5nIHRvIHRoZSBub2RlJ3MgdmFsdWUncyBzdGF0ZS4gSWYgdGhlIHN0YXRlIG9mIHRoZSBub2RlIGNoYW5nZXMKLQkgKiBpbiBhIHdheSB0aGF0IHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gdGhlIHRyZWUsIGZpcmUgYSAic3RhdGUgY2hhbmdlIiBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VWYWx1ZSgpOwotCi0JLyoqCi0JICogQHNlZSAjYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9TdGF0ZUNoYW5nZUxpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVZhbHVlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbm9kZSdzIHZhbHVlLgotCSAqIEBzZWUgI2VuZ2FnZVZhbHVlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VWYWx1ZSgpOwotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlTm9kZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXRoKCkgewotCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gcGF0aCA9IENvbGxlY3Rpb25Ub29scy5yZXZlcnNlTGlzdCh0aGlzLmJhY2tQYXRoKCkpOwotCQlyZXR1cm4gcGF0aC50b0FycmF5KG5ldyBUcmVlTm9kZVZhbHVlTW9kZWxbcGF0aC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCBjbGltYnMgdXAgdGhlIG5vZGUncyBwYXRoLAotCSAqIHN0YXJ0aW5nIHdpdGgsIGFuZCBpbmNsdWRpbmcsIHRoZSBub2RlCi0JICogYW5kIHVwIHRvLCBhbmQgaW5jbHVkaW5nLCB0aGUgcm9vdCBub2RlLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGJhY2tQYXRoKCkgewotCQlyZXR1cm4gbmV3IENoYWluSXRlcmF0b3I8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+Pih0aGlzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gbmV4dExpbmsoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIGN1cnJlbnRMaW5rLnBhcmVudCgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gY2hpbGQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuTW9kZWwoKS5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgY2hpbGRyZW5TaXplKCkgewotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsKCkuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZkNoaWxkKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBjaGlsZCkgewotCQlMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbk1vZGVsKCk7Ci0JCWludCBzaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGNoaWxkcmVuLmdldChpKSA9PSBjaGlsZCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xlYWYoKSB7Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuTW9kZWwoKS5zaXplKCkgPT0gMDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXZSBpbXBsZW1lbnQgI2VxdWFscyhPYmplY3QpIHNvIHRoYXQgVHJlZVBhdGhzIGNvbnRhaW5pbmcgdGhlc2Ugbm9kZXMKLQkgKiB3aWxsIHJlc29sdmUgcHJvcGVybHkgd2hlbiB0aGUgbm9kZXMgY29udGFpbiB0aGUgc2FtZSB2YWx1ZXMuIFRoaXMgaXMKLQkgKiBuZWNlc3NhcnkgYmVjYXVzZSBub2RlcyBhcmUgZHJvcHBlZCBhbmQgcmVidWlsdCB3aWxseS1uaWxseSB3aGVuIGRlYWxpbmcKLQkgKiB3aXRoIGEgc29ydGVkIGxpc3Qgb2YgY2hpbGRyZW47IGFuZCB0aGlzIGFsbG93cyB1cyB0byBzYXZlIGFuZCByZXN0b3JlCi0JICogYSB0cmVlJ3MgZXhwYW5kZWQgcGF0aHMuIFRoZSBub2RlcyBpbiB0aGUgZXhwYW5kZWQgcGF0aHMgdGhhdCBhcmUKLQkgKiBzYXZlZCBiZWZvcmUgYW55IG1vZGlmaWNhdGlvbiAoZS5nLiByZW5hbWluZyBhIG5vZGUpIHdpbGwgYmUgZGlmZmVyZW50Ci0JICogZnJvbSB0aGUgbm9kZXMgaW4gdGhlIHRyZWUncyBwYXRocyBhZnRlciB0aGUgbW9kaWZpY2F0aW9uLCBpZiB0aGUgbW9kaWZpY2F0aW9uCi0JICogcmVzdWx0cyBpbiBhIHBvc3NpYmxlIGNoYW5nZSBpbiB0aGUgbm9kZSBzb3J0IG9yZGVyLiAgfmJqdgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG8uZ2V0Q2xhc3MoKSAhPSB0aGlzLmdldENsYXNzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWw8VD4gb3RoZXIgPSAoQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIG87Ci0JCXJldHVybiB0aGlzLmdldFZhbHVlKCkuZXF1YWxzKG90aGVyLmdldFZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbHVlKCkuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldFZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMTBiMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgZXh0ZW5zaW9uIG9mIHtAbGluayBBYnN0cmFjdE1vZGVsfSBwcm92aWRlcyBhIGJhc2UgZm9yIGFkZGluZyAKLSAqIGNoYW5nZSBsaXN0ZW5lcnMgKHByb3BlcnR5IGNoYW5nZSwgY29sbGVjdGlvbiBjaGFuZ2UsIGxpc3QgY2hhbmdlLCB0cmVlIGNoYW5nZSkKLSAqIHRvIGEgc3ViamVjdCBhbmQgY29udmVydGluZyB0aGUgc3ViamVjdCdzIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gYSBzaW5nbGUKLSAqIHNldCBvZiBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBmb3IgYSBjb21tb24gYXNwZWN0IChlLmcuIDxjb2RlPlZBTFVFPC9jb2RlPikuCi0gKiA8cD4KLSAqIFRoZSBhZGFwdGVyIHdpbGwgb25seSBsaXN0ZW4gdG8gdGhlIHN1YmplY3QgKGFuZCBzdWJqZWN0IGhvbGRlcikgd2hlbiB0aGUKLSAqIGFkYXB0ZXIgaXRzZWxmIGFjdHVhbGx5IGhhcyBsaXN0ZW5lcnMuIFRoaXMgd2lsbCBhbGxvdyB0aGUgYWRhcHRlciB0byBiZQotICogZ2FyYmFnZSBjb2xsZWN0ZWQgd2hlbiBhcHByb3ByaWF0ZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNwZWN0QWRhcHRlcjxTPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotewotCS8qKgotCSAqIFRoZSBzdWJqZWN0IHRoYXQgaG9sZHMgdGhlIGFzcGVjdCBhbmQgZmlyZXMKLQkgKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIHdoZW4gdGhlIGFzcGVjdCBjaGFuZ2VzLgotCSAqIFdlIG5lZWQgdG8gaG9sZCBvbiB0byB0aGlzIGRpcmVjdGx5IHNvIHdlIGNhbgotCSAqIGRpc2VuZ2FnZSBpdCB3aGVuIGl0IGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIFMgc3ViamVjdDsKLQotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgdGhhdCBob2xkcyB0aGUgc3ViamVjdAotCSAqIHRoYXQgaG9sZHMgdGhlIGFzcGVjdCBhbmQgcHJvdmlkZXMgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLQkgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZXJlIGFyZSBhIG51bWJlciBvZiBhc3BlY3QgYWRhcHRlcnMKLQkgKiB0aGF0IGhhdmUgdGhlIHNhbWUgc3ViamVjdCBhbmQgdGhhdCBzdWJqZWN0IGNhbiBjaGFuZ2UuCi0JICogQWxsIHRoZSBhc3BlY3QgYWRhcHRlcnMgc2hvdWxkIHNoYXJlIHRoZSBzYW1lIHN1YmplY3QgaG9sZGVyLgotCSAqIEZvciBub3csIHRoaXMgaXMgY2FuIG9ubHkgYmUgc2V0IHVwb24gY29uc3RydWN0aW9uIGFuZCBpcwotCSAqIGltbXV0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBrZWVwcyB1cyBpbiBzeW5jaCB3aXRoIHRoZSBzdWJqZWN0IGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzdWJqZWN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCBBc3BlY3RBZGFwdGVyKFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4oc3ViamVjdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlci4KLQkgKiBUaGUgc3ViamVjdCBob2xkZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzdWJqZWN0SG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc3ViamVjdEhvbGRlciA9IHN1YmplY3RIb2xkZXI7Ci0JCXRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyB0aGUgc3ViamVjdCBpcyBudWxsIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gaXQKLQkJLy8gdGhpcyB3aWxsIHR5cGljYWxseSByZXN1bHQgaW4gb3VyIHZhbHVlIGJlaW5nIG51bGwKLQkJdGhpcy5zdWJqZWN0ID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IExvY2FsQ2hhbmdlU3VwcG9ydCh0aGlzLCB0aGlzLmdldExpc3RlbmVyQ2xhc3MoKSwgdGhpcy5nZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaG9sZGVyJ3MgdmFsdWUgaGFzIGNoYW5nZWQsIGtlZXAgb3VyIHN1YmplY3QgaW4gc3luY2guCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQXNwZWN0QWRhcHRlci50aGlzLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzdWJqZWN0IGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaGFzIGNoYW5nZWQuIE5vdGlmeSBsaXN0ZW5lcnMgdGhhdCB0aGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCWJvb2xlYW4gaGFzTGlzdGVuZXJzID0gdGhpcy5oYXNMaXN0ZW5lcnMoKTsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5kaXNlbmdhZ2VTdWJqZWN0KCk7Ci0JCX0KLQkJdGhpcy5zdWJqZWN0ID0gdGhpcy5zdWJqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWlmIChoYXNMaXN0ZW5lcnMpIHsKLQkJCXRoaXMuZW5nYWdlU3ViamVjdCgpOwotCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlZChvbGRWYWx1ZSwgdGhpcy5nZXRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNwZWN0J3MgY3VycmVudCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG9mIGxpc3RlbmVyIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB0aGUgYXNwZWN0IGFkYXB0ZXIncwotCSAqIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGFzcGVjdCBhZGFwdGVyJ3MgYXNwZWN0IChlLmcuIFZBTFVFKS4KLQkgKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhc3BlY3QgYWRhcHRlcidzIHNpbmdsZSBhc3BlY3QsIG5vdCB0aGUKLQkgKiBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgYXNwZWN0IHRoZSBhc3BlY3QgYWRhcHRlciBpcyBhZGFwdGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBsaXN0ZW5lcnMgZm9yIHRoZSBhc3BlY3QuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFzTGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzIGZvciB0aGUgYXNwZWN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc0xpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFRoZSBhc3BlY3QgaGFzIGNoYW5nZWQsIG5vdGlmeSBsaXN0ZW5lcnMgYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0KCkgewotCQkvLyBjaGVjayBmb3Igbm90aGluZyB0byBsaXN0ZW4gdG8KLQkJaWYgKHRoaXMuc3ViamVjdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmVuZ2FnZVN1YmplY3RfKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBpcyBub3QgbnVsbCAtIGFkZCBvdXIgbGlzdGVuZXIuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5nYWdlU3ViamVjdF8oKTsKLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3QoKSB7Ci0JCS8vIGNoZWNrIGZvciBub3RoaW5nIHRvIGxpc3RlbiB0bwotCQlpZiAodGhpcy5zdWJqZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuZGlzZW5nYWdlU3ViamVjdF8oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGlzIG5vdCBudWxsIC0gcmVtb3ZlIG91ciBsaXN0ZW5lci4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpOwotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdEhvbGRlcigpIHsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIHN5bmNoIG91ciBzdWJqZWN0ICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0IGhvbGRlciwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5zdWJqZWN0ID0gdGhpcy5zdWJqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdEhvbGRlcigpIHsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgc3ViamVjdCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIGl0cyBob2xkZXIKLQkJdGhpcy5zdWJqZWN0ID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbHMoKSB7Ci0JCXRoaXMuZW5nYWdlU3ViamVjdEhvbGRlcigpOwotCQl0aGlzLmVuZ2FnZVN1YmplY3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbHMoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlU3ViamVjdCgpOwotCQl0aGlzLmRpc2VuZ2FnZVN1YmplY3RIb2xkZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbG9jYWwgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIGNoYW5nZSBzdXBwb3J0IHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgYXNwZWN0IGFkYXB0ZXIncwotCSAqIG1vZGVscyAodGhlIHN1YmplY3QgaG9sZGVyIGFuZCB0aGUgc3ViamVjdCBpdHNlbGYpIHdoZW4gdGhlIGZpcnN0Ci0JICogcmVsZXZhbnQgbGlzdGVuZXIgaXMgYWRkZWQuCi0JICogQ29udmVyc2VseSwgc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGFzcGVjdCBhZGFwdGVyJ3MgbW9kZWxzIHdoZW4gdGhlCi0JICogbGFzdCByZWxldmFudCBsaXN0ZW5lciBpcyByZW1vdmVkLgotCSAqIEEgcmVsZXZhbnQgbGlzdGVuZXIgaXMgYSBsaXN0ZW5lciBvZiB0aGUgcmVsZXZhbnQgdHlwZSBhbmQgYXNwZWN0IG9yIGEKLQkgKiBnZW5lcmFsLXB1cnBvc2UgbGlzdGVuZXIuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIExvY2FsQ2hhbmdlU3VwcG9ydCBleHRlbmRzIFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgTG9jYWxDaGFuZ2VTdXBwb3J0KEFzcGVjdEFkYXB0ZXI8Uz4gc291cmNlLCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdmFsaWRMaXN0ZW5lckNsYXNzLCBTdHJpbmcgdmFsaWRBc3BlY3ROYW1lKSB7Ci0JCQlzdXBlcihzb3VyY2UsIHZhbGlkTGlzdGVuZXJDbGFzcywgdmFsaWRBc3BlY3ROYW1lKTsKLQkJfQotCi0JCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuaGFzTm9MaXN0ZW5lcnModGhpcy52YWxpZExpc3RlbmVyQ2xhc3MsIHRoaXMudmFsaWRBc3BlY3ROYW1lKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxUIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihDbGFzczxUPiBsaXN0ZW5lckNsYXNzLCBUIGxpc3RlbmVyKSB7Ci0JCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQkJQXNwZWN0QWRhcHRlci50aGlzLmVuZ2FnZU1vZGVscygpOwotCQkJfQotCQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPFQgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIGFkZExpc3RlbmVyKENsYXNzPFQ+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lLCBUIGxpc3RlbmVyKSB7Ci0JCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQkJQXNwZWN0QWRhcHRlci50aGlzLmVuZ2FnZU1vZGVscygpOwotCQkJfQotCQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSwgbGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPFQgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIHJlbW92ZUxpc3RlbmVyKENsYXNzPFQ+IGxpc3RlbmVyQ2xhc3MsIFQgbGlzdGVuZXIpIHsKLQkJCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyKTsKLQkJCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCQlBc3BlY3RBZGFwdGVyLnRoaXMuZGlzZW5nYWdlTW9kZWxzKCk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8VCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8VD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUsIFQgbGlzdGVuZXIpIHsKLQkJCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUsIGxpc3RlbmVyKTsKLQkJCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCQlBc3BlY3RBZGFwdGVyLnRoaXMuZGlzZW5nYWdlTW9kZWxzKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTc2YTU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyB7QGxpbmsgQXNwZWN0QWRhcHRlcn0gcHJvdmlkZXMgYmFzaWMgY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYW4gImFzcGVjdCIgKGFzIGRlZmluZWQgYnkgc3ViY2xhc3NlcykgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNWQUxVRVN9IGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzOjx1bD4KLSAqIDxsaT57QGxpbmsgI2VuZ2FnZVN1YmplY3RfKCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFkZCB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIgdG8gdGhlIHN1YmplY3QKLSAqIDxsaT57QGxpbmsgI2Rpc2VuZ2FnZVN1YmplY3RfKCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJlbW92ZSB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIgZnJvbSB0aGUgc3ViamVjdAotICogPGxpPntAbGluayAjZ2V0SXRlcmFibGUoKX08cD4KLSAqICAgICBhdCB0aGUgdmVyeSBtaW5pbXVtLCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUKLSAqICAgICBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3Q7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZiBlaXRoZXIKLSAqICAgICB7QGxpbmsgI2l0ZXJhdG9yXygpfSBvciB7QGxpbmsgI2l0ZXJhdG9yKCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNzaXplXygpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcHJvdmUgcGVyZm9ybWFuY2U7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZgotICogICAgIHtAbGluayAjc2l6ZSgpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjaXRlcmF0b3JfKCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGFuIGl0ZXJhdG9yIG9uIHRoZQotICogICAgIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdCBpZiBpdCBpcyBub3QgcG9zc2libGUgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0SXRlcmFibGUoKX07Ci0gKiAgICAgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBvdmVycmlkZGVuIGlmCi0gKiAgICAge0BsaW5rICNpdGVyYXRvcigpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjaXRlcmF0b3IoKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHJldHVybmluZyBhbiBlbXB0eSBpdGVyYXRvciB3aGVuIHRoZQotICogICAgIHN1YmplY3QgaXMgbnVsbCBpcyB1bmFjY2VwdGFibGUKLSAqIDxsaT57QGxpbmsgI3NpemUoKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHJldHVybmluZyBhIHplcm8gd2hlbiB0aGUKLSAqICAgICBzdWJqZWN0IGlzIG51bGwgaXMgdW5hY2NlcHRhYmxlCi0gKiA8L3VsPgotICogVG8gbm90aWZ5IGxpc3RlbmVycywgc3ViY2xhc3NlcyBjYW4gY2FsbCB7QGxpbmsgI2NvbGxlY3Rpb25DaGFuZ2VkKCl9Ci0gKiB3aGVuZXZlciB0aGUgYXNwZWN0IGhhcyBjaGFuZ2VkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNwZWN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFMsIEU+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFM+Ci0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhZGFwdGVyIGZvciBhbiBhc3BlY3Qgb2YgdGhlCi0JICogc3BlY2lmaWVkIHN1YmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEFzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy5zdWJqZWN0ID09IG51bGwpID8gRW1wdHlJdGVyYXRvci48RT5pbnN0YW5jZSgpIDogdGhpcy5pdGVyYXRvcl8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNpdGVyYXRvcigpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yXygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SXRlcmFibGUoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI2l0ZXJhdG9yXygpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZXJhYmxlKCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IDAgOiB0aGlzLnNpemVfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNzaXplKCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5pdGVyYXRvcigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZhbHVlQ29sbGVjdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIFZBTFVFUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgQ29sbGVjdGlvbjxFPiBuZXdDb2xsZWN0aW9uID0gKENvbGxlY3Rpb248RT4pIG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIG5ld0NvbGxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKCkgewotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIHRoaXMuYnVpbGRWYWx1ZUNvbGxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RT4gYnVpbGRWYWx1ZUNvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLml0ZXJhdG9yKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuYnVpbGRWYWx1ZUNvbGxlY3Rpb24oKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NDhjZWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIHtAbGluayBBc3BlY3RBZGFwdGVyfSBwcm92aWRlcyBiYXNpYyBsaXN0IGNoYW5nZSBzdXBwb3J0LgotICogVGhpcyBjb252ZXJ0cyBhbiAiYXNwZWN0IiAoYXMgZGVmaW5lZCBieSBzdWJjbGFzc2VzKSBpbnRvCi0gKiBhIHNpbmdsZSB7QGxpbmsgI0xJU1RfVkFMVUVTfSBsaXN0LgotICogPHA+Ci0gKiBUaGUgdHlwaWNhbCBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczo8dWw+Ci0gKiA8bGk+e0BsaW5rICNlbmdhZ2VTdWJqZWN0XygpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIHRvIHRoZSBzdWJqZWN0Ci0gKiA8bGk+e0BsaW5rICNkaXNlbmdhZ2VTdWJqZWN0XygpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZW1vdmUgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIGZyb20gdGhlIHN1YmplY3QKLSAqIDxsaT57QGxpbmsgI2dldExpc3RJdGVyYWJsZSgpfTxwPgotICogICAgIGF0IHRoZSB2ZXJ5IG1pbmltdW0sIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiBhIGxpc3QgaXRlcmFibGUgY29udGFpbmluZyB0aGUKLSAqICAgICBzdWJqZWN0J3MgbGlzdCBhc3BlY3Q7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZiBlaXRoZXIKLSAqICAgICB7QGxpbmsgI2xpc3RJdGVyYXRvcl8oKX0gb3Ige0BsaW5rICNsaXN0SXRlcmF0b3IoKX0gaXMgb3ZlcnJpZGRlbiBhbmQgaXRzIGJlaGF2aW9yIGNoYW5nZWQKLSAqIDxsaT57QGxpbmsgI2dldChpbnQpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKLSAqIDxsaT57QGxpbmsgI3NpemVfKCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZTsgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBvdmVycmlkZGVuIGlmCi0gKiAgICAge0BsaW5rICNzaXplKCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICN0b0FycmF5XygpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcHJvdmUgcGVyZm9ybWFuY2U7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZgotICogICAgIHtAbGluayAjdG9BcnJheSgpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjbGlzdEl0ZXJhdG9yXygpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiBhIGxpc3QgaXRlcmF0b3Igb24gdGhlIHN1YmplY3QncyBsaXN0Ci0gKiAgICAgYXNwZWN0IGlmIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRMaXN0SXRlcmFibGUoKX07Ci0gKiAgICAgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBvdmVycmlkZGVuIGlmCi0gKiAgICAge0BsaW5rICNsaXN0SXRlcmF0b3IoKX0gaXMgb3ZlcnJpZGRlbiBhbmQgaXRzIGJlaGF2aW9yIGNoYW5nZWQKLSAqIDxsaT57QGxpbmsgI2xpc3RJdGVyYXRvcigpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGFuIGVtcHR5IGxpc3QgaXRlcmF0b3Igd2hlbiB0aGUKLSAqICAgICBzdWJqZWN0IGlzIG51bGwgaXMgdW5hY2NlcHRhYmxlCi0gKiA8bGk+e0BsaW5rICNzaXplKCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb25seSBpZiByZXR1cm5pbmcgYSB6ZXJvIHdoZW4gdGhlCi0gKiAgICAgc3ViamVjdCBpcyBudWxsIGlzIHVuYWNjZXB0YWJsZQotICogPGxpPntAbGluayAjdG9BcnJheSgpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlCi0gKiAgICAgc3ViamVjdCBpcyBudWxsIGlzIHVuYWNjZXB0YWJsZQotICogPC91bD4KLSAqIFRvIG5vdGlmeSBsaXN0ZW5lcnMsIHN1YmNsYXNzZXMgY2FuIGNhbGwge0BsaW5rICNsaXN0Q2hhbmdlZCgpfQotICogd2hlbmV2ZXIgdGhlIGFzcGVjdCBoYXMgY2hhbmdlZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTLCBFPgotCWV4dGVuZHMgQXNwZWN0QWRhcHRlcjxTPgotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgYWRhcHRlciBmb3IgYW4gYXNwZWN0IG9mIHRoZQotCSAqIHNwZWNpZmllZCBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCBBc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEVtcHR5TGlzdEl0ZXJhdG9yLjxFPmluc3RhbmNlKCkgOiB0aGlzLmxpc3RJdGVyYXRvcl8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNsaXN0SXRlcmF0b3IoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdEl0ZXJhYmxlKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNsaXN0SXRlcmF0b3JfKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEU+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmdldCh0aGlzLmxpc3RJdGVyYXRvcigpLCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5zdWJqZWN0ID09IG51bGwgPyAwIDogdGhpcy5zaXplXygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICogQHNlZSAjc2l6ZSgpCi0JICovCi0JcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBtYW5pZmVzdGF0aW9uIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLnN1YmplY3QgPT0gbnVsbCA/IEVNUFRZX0FSUkFZIDogdGhpcy50b0FycmF5XygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBtYW5pZmVzdGF0aW9uIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICN0b0FycmF5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gdG9BcnJheV8oKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmFycmF5KHRoaXMubGlzdEl0ZXJhdG9yKCksIHRoaXMuc2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdDxFPiBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRWYWx1ZUxpc3QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGdldExpc3RlbmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiBMSVNUX1ZBTFVFUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9WQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVBc3BlY3RDaGFuZ2VkKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBMaXN0PEU+IG5ld0xpc3QgPSAoTGlzdDxFPikgbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCBuZXdMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZCgpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRWYWx1ZUxpc3QoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8RT4gYnVpbGRWYWx1ZUxpc3QoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLml0ZXJhdG9yKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuYnVpbGRWYWx1ZUxpc3QoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBjMDUzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMge0BsaW5rIEFzcGVjdEFkYXB0ZXJ9IHByb3ZpZGVzIGJhc2ljIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0LgotICogVGhpcyBjb252ZXJ0cyBhbiAiYXNwZWN0IiAoYXMgZGVmaW5lZCBieSBzdWJjbGFzc2VzKSBpbnRvCi0gKiBhIHNpbmdsZSB7QGxpbmsgI1ZBTFVFfSBwcm9wZXJ0eS4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgc3ViamVjdAotICogPGxpPntAbGluayAjZGlzZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSBzdWJqZWN0Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlXygpfTxwPgotICogICAgIGF0IHRoZSB2ZXJ5IG1pbmltdW0sIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCi0gKiAgICAgc3ViamVjdCdzIGFzcGVjdCAob3IgInZpcnR1YWwiIGFzcGVjdCk7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUKLSAqICAgICBvdmVycmlkZGVuIGlmIHtAbGluayAjYnVpbGRWYWx1ZSgpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjc2V0VmFsdWVfKE9iamVjdCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhlIGNsaWVudCBjb2RlIG5lZWRzIHRvIDxlbT5zZXQ8L2VtPiB0aGUgdmFsdWUgb2YKLSAqICAgICB0aGUgc3ViamVjdCdzIGFzcGVjdDsgb2Z0ZW50aW1lcywgdGhvdWdoLCB0aGUgY2xpZW50IGNvZGUgKGUuZy4gVUkpCi0gKiAgICAgd2lsbCBuZWVkIG9ubHkgdG8gPGVtPmdldDwvZW0+IHRoZSB2YWx1ZTsgaXQgZG9lcyBub3QgbmVlZCB0byBiZQotICogICAgIG92ZXJyaWRkZW4gaWYge0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGEgPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUgd2hlbgotICogICAgIHRoZSBzdWJqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+IGlzIHVuYWNjZXB0YWJsZQotICogPGxpPntAbGluayAjc2V0VmFsdWUoT2JqZWN0KX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHNvbWV0aGluZyBtdXN0IGJlIGRvbmUgd2hlbiB0aGUgc3ViamVjdAotICogICAgIGlzIDxjb2RlPm51bGw8L2NvZGU+IChlLmcuIHRocm93IGFuIGV4Y2VwdGlvbikKLSAqIDwvdWw+Ci0gKiBUbyBub3RpZnkgbGlzdGVuZXJzLCBzdWJjbGFzc2VzIGNhbiBjYWxsIHtAbGluayAjcHJvcGVydHlDaGFuZ2VkKCl9Ci0gKiB3aGVuZXZlciB0aGUgYXNwZWN0IGhhcyBjaGFuZ2VkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxTLCBWPgotCWV4dGVuZHMgQXNwZWN0QWRhcHRlcjxTPgotCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4KLXsKLQkvKioKLQkgKiBDYWNoZSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYXNwZWN0IHNvIHdlCi0JICogY2FuIHBhc3MgYW4gIm9sZCB2YWx1ZSIgd2hlbiB3ZSBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqIFdlIG5lZWQgdGhpcyBiZWNhdXNlIHRoZSB2YWx1ZSBtYXkgYmUgY2FsY3VsYXRlZCBhbmQgbWF5Ci0JICogbm90IGJlIGluIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgZmlyZWQgYnkgdGhlIHN1YmplY3QsCi0JICogZXNwZWNpYWxseSB3aGVuIGRlYWxpbmcgd2l0aCBtdWx0aXBsZSBhc3BlY3RzLgotCSAqLwotCXByb3RlY3RlZCBWIHZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhZGFwdGVyIGZvciBhbiBhc3BlY3Qgb2YgdGhlCi0JICogc3BlY2lmaWVkIHN1YmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCQkvLyBvdXIgdmFsdWUgaXMgbnVsbCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0Ci0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3ViamVjdCdzIGFzcGVjdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgViBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHN1YmplY3QncyBhc3BlY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoViB2YWx1ZSkgewotCQlpZiAodGhpcy5zdWJqZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0VmFsdWVfKHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHN1YmplY3QncyBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNzZXRWYWx1ZShPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBWIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGdldExpc3RlbmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gVkFMVUU7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhWQUxVRSk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFzcGVjdENoYW5nZWQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3QoKSB7Ci0JCXN1cGVyLmVuZ2FnZVN1YmplY3QoKTsKLQkJLy8gc3luY2ggb3VyIHZhbHVlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0LAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlU3ViamVjdCgpOwotCQkvLyBjbGVhciBvdXQgb3VyIHZhbHVlIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIHN1YmplY3QKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNwZWN0J3MgdmFsdWUuCi0JICogQXQgdGhpcyBwb2ludCB0aGUgc3ViamVjdCBtYXkgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgViBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkVmFsdWVfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3ViamVjdCdzIGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI2J1aWxkVmFsdWUoKQotCSAqLwotCXByb3RlY3RlZCBWIGJ1aWxkVmFsdWVfKCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBieSBzdWJjbGFzc2VzIHdoZW5ldmVyIHRoZSBzdWJqZWN0J3MgYXNwZWN0Ci0JICogaGFzIGNoYW5nZWQ7IGxpc3RlbmVycyB3aWxsIGJlIG5vdGlmaWVkIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKCkgewotCQlWIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlZChvbGQsIHRoaXMudmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdFRyZWVWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdFRyZWVWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTVhYTFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RUcmVlVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyB7QGxpbmsgQXNwZWN0QWRhcHRlcn0gcHJvdmlkZXMgYmFzaWMgdHJlZSBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYW4gImFzcGVjdCIgKGFzIGRlZmluZWQgYnkgc3ViY2xhc3NlcykgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNOT0RFU30gdHJlZS4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgc3ViamVjdAotICogPGxpPntAbGluayAjZGlzZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSBzdWJqZWN0Ci0gKiA8bGk+e0BsaW5rICNub2Rlc18oKX08cD4KLSAqICAgICBhdCB0aGUgdmVyeSBtaW5pbXVtLCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gYW4gaXRlcmF0b3IKLSAqICAgICBvbiB0aGUgc3ViamVjdCdzIHRyZWUgYXNwZWN0OyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICB7QGxpbmsgI25vZGVzKCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNub2RlcygpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGFuIGVtcHR5IGl0ZXJhdG9yIHdoZW4gdGhlCi0gKiAgICAgc3ViamVjdCBpcyBudWxsIGlzIHVuYWNjZXB0YWJsZQotICogPC91bD4KLSAqIFRvIG5vdGlmeSBsaXN0ZW5lcnMsIHN1YmNsYXNzZXMgY2FuIGNhbGwge0BsaW5rICN0cmVlQ2hhbmdlZCgpfQotICogd2hlbmV2ZXIgdGhlIGFzcGVjdCBoYXMgY2hhbmdlZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFzcGVjdFRyZWVWYWx1ZU1vZGVsQWRhcHRlcjxTLCBFPgotCWV4dGVuZHMgQXNwZWN0QWRhcHRlcjxTPgotCWltcGxlbWVudHMgVHJlZVZhbHVlTW9kZWw8RT4KLXsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgdmFsdWUgbW9kZWwgYWRhcHRlciBmb3IgYW4gYXNwZWN0IG9mIHRoZQotCSAqIHNwZWNpZmllZCBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCBBc3BlY3RUcmVlVmFsdWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGVzIG9mIHRoZSBzdWJqZWN0J3MgdHJlZSBhc3BlY3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPEU+IG5vZGVzKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPEU+aW5zdGFuY2UoKSA6IHRoaXMubm9kZXNfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBub2RlcyBvZiB0aGUgc3ViamVjdCdzIHRyZWUgYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICogQHNlZSAjbm9kZXMoKQotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjxFPiBub2Rlc18oKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZhbHVlQ29sbGVjdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIFRyZWVDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIE5PREVTOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhOT0RFUyk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFzcGVjdENoYW5nZWQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIENvbGxlY3Rpb248RT4gbmV3Tm9kZXMgPSAoQ29sbGVjdGlvbjxFPikgbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKE5PREVTLCBuZXdOb2Rlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNoYW5nZWQoKSB7Ci0JCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKE5PREVTLCB0aGlzLmJ1aWxkVmFsdWVDb2xsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPEU+IGJ1aWxkVmFsdWVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5ub2RlcygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmJ1aWxkVmFsdWVDb2xsZWN0aW9uKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NzdmYTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGlzIHVzZWQgdG8gaG9sZCBhIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSB2YWx1ZQotICogaW4gYW5vdGhlciBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCAodGhlICJ3cmFwcGVkIiB2YWx1ZSBob2xkZXIpLiBUaGUgYXBwbGljYXRpb24KLSAqIGNhbiBtb2RpZnkgdGhpcyB0ZW1wb3JhcnkgY29weSwgYWQgbmF1c2VhbTsgYnV0IHRoZSB0ZW1wb3JhcnkgY29weSBpcyBvbmx5Ci0gKiBwYXNzZWQgdGhyb3VnaCB0byB0aGUgIndyYXBwZWQiIHZhbHVlIGhvbGRlciB3aGVuIHRoZSB0cmlnZ2VyICJhY2NlcHRzIiB0aGUKLSAqIGJ1ZmZlcmVkIHZhbHVlLiBBbHRlcm5hdGl2ZWx5LCB0aGUgYXBwbGljYXRpb24gY2FuICJyZXNldCIgdGhlIGJ1ZmZlcmVkIHZhbHVlCi0gKiB0byB0aGUgb3JpZ2luYWwsICJ3cmFwcGVkIiB2YWx1ZS4KLSAqIDxwPgotICogVGhlIHRyaWdnZXIgaXMgYW5vdGhlciB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSB0aGF0IGhvbGRzIGEge0BsaW5rIEJvb2xlYW59Ci0gKiBhbmQgdGhlIGFwcGxpY2F0aW9uIGNoYW5nZXMgdGhlIHRyaWdnZXIncyB2YWx1ZSB0byB0cnVlIG9uICJhY2NlcHQiLCBmYWxzZSBvbiAicmVzZXQiLgotICogVHlwaWNhbGx5LCBpbiBhIGRpYWxvZzo8dWw+Ci0gKiA8bGk+cHJlc3NpbmcgdGhlICJPSyIgYnV0dG9uIHdpbGwgdHJpZ2dlciBhbiAiYWNjZXB0IiBhbmQgY2xvc2UgdGhlIGRpYWxvZwotICogPGxpPnByZXNzaW5nIHRoZSAiQ2FuY2VsIiBidXR0b24gd2lsbCBzaW1wbHkgY2xvc2UgdGhlIGRpYWxvZywKLSAqICAgZHJvcHBpbmcgdGhlICJidWZmZXJlZCIgdmFsdWVzIGludG8gdGhlIGJpdCBidWNrZXQKLSAqIDxsaT5wcmVzc2luZyB0aGUgIkFwcGx5IiBidXR0b24gd2lsbCB0cmlnZ2VyIGFuICJhY2NlcHQiIGFuZCBsZWF2ZSB0aGUgZGlhbG9nIG9wZW4KLSAqIDxsaT5wcmVzc2luZyB0aGUgIlJlc3RvcmUiIGJ1dHRvbiB3aWxsIHRyaWdnZXIgYSAicmVzZXQiIGFuZCBsZWF2ZSB0aGUgZGlhbG9nIG9wZW4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIEEgbnVtYmVyIG9mIGJ1ZmZlcmVkIHByb3BlcnR5IHZhbHVlIG1vZGVscyBjYW4gd3JhcCBhbm90aGVyIHNldCBvZgotICogcHJvcGVydHkgYXNwZWN0IGFkYXB0ZXJzIHRoYXQgYWRhcHQgdGhlIHZhcmlvdXMgYXNwZWN0cyBvZiBhIHNpbmdsZQotICogZG9tYWluIG1vZGVsLiBBbGwgdGhlIGJ1ZmZlcmQgcHJvcGVydHkgdmFsdWUgbW9kZWxzIGNhbiBiZSBob29rZWQgdG8gdGhlCi0gKiBzYW1lIHRyaWdnZXIsIGFuZCB0aGF0IHRyaWdnZXIgaXMgY29udHJvbGxlZCBieSB0aGUgYXBwbGljYXRpb24sIHR5cGljYWxseQotICogdmlhIHRoZSBPSyBidXR0b24gaW4gYSBkaWFsb2cuCi0gKiAKLSAqIEBzZWUgUHJvcGVydHlBc3BlY3RBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFQ+Ci0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCi0JLyoqCi0JICogV2UgY2FjaGUgdGhlIHZhbHVlIGhlcmUgdW50aWwgaXQgaXMgYWNjZXB0ZWQgYW5kIHBhc3NlZAotCSAqIHRocm91Z2ggdG8gdGhlIHdyYXBwZWQgdmFsdWUgaG9sZGVyLgotCSAqLwotCXByb3RlY3RlZCBUIGJ1ZmZlcmVkVmFsdWU7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNldCB0byB0cnVlIHdoZW4gd2UgYXJlICJhY2NlcHRpbmciIHRoZSBidWZmZXJlZCB2YWx1ZQotCSAqIGFuZCBwYXNzaW5nIGl0IHRocm91Z2ggdG8gdGhlIHdyYXBwZWQgdmFsdWUgaG9sZGVyLiBUaGlzIGFsbG93cwotCSAqIHVzIHRvIGlnbm9yZSB0aGUgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGZpcmVkIGJ5IHRoZSB3cmFwcGVkCi0JICogdmFsdWUgaG9sZGVyLgotCSAqIChXZSBjYW4ndCBzdG9wIGxpc3RlbmluZyB0byB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIsIGJlY2F1c2UKLQkgKiBpZiB3ZSBhcmUgdGhlIG9ubHkgbGlzdGVuZXIgdGhhdCBjb3VsZCAiZGVhY3RpdmF0ZSIgdGhlIHdyYXBwZWQKLQkgKiB2YWx1ZSBob2xkZXIuKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdGluZzsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIHRyaWdnZXIgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYnVmZmVyZWQgdmFsdWUKLQkgKiBzaG91bGQgYmUgYWNjZXB0ZWQgb3IgcmVzZXQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB0cmlnZ2VySG9sZGVyOwotCi0JLyoqIFRoaXMgbGlzdGVucyB0byB0aGUgdHJpZ2dlciBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdHJpZ2dlckNoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhpcyBmbGFnIGluZGljYXRlcyB3aGV0aGVyIG91ciBidWZmZXJlZCB2YWx1ZSBoYXMgYmVlbiBhc3NpZ25lZAotCSAqIGEgdmFsdWUgYW5kIGlzIHBvc3NpYmx5IG91dCBvZiBzeW5jaCB3aXRoIHRoZSB3cmFwcGVkIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJ1ZmZlcmluZzsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYnVmZmVyZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdHJpZ2dlciBob2xkZXIuCi0JICovCi0JcHVibGljIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB0cmlnZ2VySG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJaWYgKHRyaWdnZXJIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy50cmlnZ2VySG9sZGVyID0gdHJpZ2dlckhvbGRlcjsKLQkJdGhpcy5idWZmZXJlZFZhbHVlID0gbnVsbDsKLQkJdGhpcy5idWZmZXJpbmcgPSBmYWxzZTsKLQkJdGhpcy5hY2NlcHRpbmcgPSBmYWxzZTsKLQkJdGhpcy50cmlnZ2VyQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJpZ2dlckNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJpZ2dlckNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwudGhpcy50cmlnZ2VyQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmlnZ2VyIGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB3ZSBhcmUgY3VycmVudGx5ICJidWZmZXJpbmciIGEgdmFsdWUsIHJldHVybiB0aGF0OwotCSAqIG90aGVyd2lzZSwgcmV0dXJuIHRoZSB3cmFwcGVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5idWZmZXJpbmcgPyB0aGlzLmJ1ZmZlcmVkVmFsdWUgOiB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogQXNzaWduIHRoZSBuZXcgdmFsdWUgdG8gb3VyICJidWZmZXJlZCIgdmFsdWUuCi0JICogSXQgd2lsbCBiZSBwdXNoZWQgdG8gdGhlIHdyYXBwZWQgdmFsdWUgaG9sZGVyCi0JICogd2hlbiB0aGUgdHJpZ2dlciBpcyAiYWNjZXB0ZWQiLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYnVmZmVyaW5nKSB7Ci0JCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbCh2YWx1ZSwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKSkgewotCQkJCS8vIHRoZSBidWZmZXJlZCB2YWx1ZSBpcyBiZWluZyBzZXQgYmFjayB0byB0aGUgb3JpZ2luYWwgdmFsdWUKLQkJCQl0aGlzLnJlc2V0KCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHRoZSBidWZmZXJlZCB2YWx1ZSBpcyBiZWluZyBjaGFuZ2VkCi0JCQkJT2JqZWN0IG9sZCA9IHRoaXMuYnVmZmVyZWRWYWx1ZTsKLQkJCQl0aGlzLmJ1ZmZlcmVkVmFsdWUgPSB2YWx1ZTsKLQkJCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdmFsdWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwodmFsdWUsIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSkpIHsKLQkJCQkvLyB0aGUgYnVmZmVyZWQgdmFsdWUgaXMgYmVpbmcgc2V0IHRvIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBvcmlnaW5hbCB2YWx1ZSAtIGlnbm9yZQotCQkJfSBlbHNlIHsKLQkJCQkvLyB0aGUgYnVmZmVyZWQgdmFsdWUgaXMgYmVpbmcgc2V0IGZvciB0aGUgZmlyc3QgdGltZQotCQkJCU9iamVjdCBvbGQgPSB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JCQkJdGhpcy5idWZmZXJlZFZhbHVlID0gdmFsdWU7Ci0JCQkJdGhpcy5idWZmZXJpbmcgPSB0cnVlOwotCQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlciBleHRlbnNpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIGV4dGVuZCB0byBlbmdhZ2UgdGhlIHRyaWdnZXIgaG9sZGVyIGFsc28KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJdGhpcy50cmlnZ2VySG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMudHJpZ2dlckNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBleHRlbmQgdG8gZGlzZW5nYWdlIHRoZSB0cmlnZ2VyIGhvbGRlciBhbHNvCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMudHJpZ2dlckhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFZBTFVFLCB0aGlzLnRyaWdnZXJDaGFuZ2VMaXN0ZW5lcik7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHdlIGFyZSBjdXJyZW50bHkgImFjY2VwdGluZyIgdGhlIHZhbHVlIChpLmUgcGFzc2luZyBpdCBvbiB0byB0aGUKLQkgKiAid3JhcHBlZCIgbW9kZWwpLCBpZ25vcmUgY2hhbmdlIG5vdGlmaWNhdGlvbnMsIHNpbmNlIHdlIGNhdXNlZAotCSAqIHRoZW0gYW5kIG91ciBvd24gbGlzdGVuZXJzIGFyZSBhbHJlYWR5IGF3YXJlIG9mIHRoZSBjaGFuZ2UuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMuYWNjZXB0aW5nKSB7Ci0JCQl0aGlzLnZhbHVlQ2hhbmdlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgaGF2ZSBhICJidWZmZXJlZCIgdmFsdWUsIGNoZWNrIHdoZXRoZXIgdGhlICJ3cmFwcGVkIiB2YWx1ZSBoYXMKLQkgKiBjaGFuZ2VkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSAiYnVmZmVyZWQiIHZhbHVlLiBJZiBpdCBoYXMsIHN0b3AgImJ1ZmZlcmluZyI7Ci0JICogaWYgbm90LCBkbyBub3RoaW5nLgotCSAqIElmIHdlIGRvIG5vdCB5ZXQgaGF2ZSBhICJidWZmZXJlZCIgdmFsdWUsIHNpbXBseSBwcm9wYWdhdGUgdGhlCi0JICogY2hhbmdlIG5vdGlmaWNhdGlvbiB3aXRoIHRoZSBidWZmZXJlZCBtb2RlbCBhcyB0aGUgc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZF8oUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5idWZmZXJpbmcpIHsKLQkJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGV2ZW50LmdldE5ld1ZhbHVlKCksIHRoaXMuYnVmZmVyZWRWYWx1ZSkpIHsKLQkJCQkvLyB0aGUgYnVmZmVyZWQgdmFsdWUgaXMgYmVpbmcgc2V0IGJhY2sgdG8gdGhlIG9yaWdpbmFsIHZhbHVlCi0JCQkJdGhpcy5yZXNldCgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmhhbmRsZUNoYW5nZUNvbmZsaWN0KGV2ZW50KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5jbG9uZSh0aGlzKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCBpZiB3ZSBoYXZlIGEgImJ1ZmZlcmVkIiB2YWx1ZSBhbmQgdGhlICJ3cmFwcGVkIiB2YWx1ZSBjaGFuZ2VzLAotCSAqIHdlIHNpbXBseSBpZ25vcmUgdGhlIG5ldyAid3JhcHBlZCIgdmFsdWUgYW5kIHNpbXBseSBvdmVybGF5IGl0IHdpdGggdGhlCi0JICogImJ1ZmZlcmVkIiB2YWx1ZSBpZiBpdCBpcyAiYWNjZXB0ZWQiLiAoIkxhc3QgT25lIEluIFdpbnMiIGNvbmN1cnJlbmN5IG1vZGVsKQotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNoYW5nZSB0aGF0IGJlaGF2aW9yIHdpdGggYQotCSAqIGRpZmZlcmVudCBjb25jdXJyZW5jeSBtb2RlbC4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBkcm9wIHRoZSAiYnVmZmVyZWQiIHZhbHVlCi0JICogYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgbmV3ICJ3cmFwcGVkIiB2YWx1ZSwgb3IgeW91IGNvdWxkIHRocm93IGFuCi0JICogZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZUNvbmZsaWN0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHJpZ2dlciBjaGFuZ2VkOjx1bD4KLQkgKiA8bGk+SWYgaXQgaXMgbm93IHRydWUsICJhY2NlcHQiIHRoZSBidWZmZXJlZCB2YWx1ZSBhbmQgcHVzaAotCSAqIGl0IHRvIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlci4KLQkgKiA8bGk+SWYgaXQgaXMgbm93IGZhbHNlLCAicmVzZXQiIHRoZSBidWZmZXJlZCB2YWx1ZSB0byBpdHMgb3JpZ2luYWwgdmFsdWUuCi0JICogPC91bD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmlnZ2VyQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGlmIG5vdGhpbmcgaGFzIGJlZW4gImJ1ZmZlcmVkIiwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZzoKLQkJLy8gbm90aGluZyBuZWVkcyB0byBiZSBwYXNzZWQgdGhyb3VnaDsgbm90aGluZyBuZWVkcyB0byBiZSByZXNldDsKLQkJaWYgKHRoaXMuYnVmZmVyaW5nKSB7Ci0JCQlpZiAoKChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCXRoaXMuYWNjZXB0KCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMucmVzZXQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjY2VwdCgpIHsKLQkJLy8gc2V0IHRoZSBhY2NlcHRpbmcgZmxhZyBzbyB3ZSBpZ25vcmUgYW55IGV2ZW50cwotCQkvLyBmaXJlZCBieSB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIKLQkJdGhpcy5hY2NlcHRpbmcgPSB0cnVlOwotCQl0cnkgewotCQkJdGhpcy5nZXRWYWx1ZUhvbGRlcigpLnNldFZhbHVlKHRoaXMuYnVmZmVyZWRWYWx1ZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0aGlzLmJ1ZmZlcmVkVmFsdWUgPSBudWxsOwotCQkJdGhpcy5idWZmZXJpbmcgPSBmYWxzZTsKLQkJCS8vIGNsZWFyIHRoZSBmbGFnIG9uY2UgdGhlICJhY2NlcHQiIGlzIGNvbXBsZXRlCi0JCQl0aGlzLmFjY2VwdGluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7Ci0JCS8vIG5vdGlmeSBvdXIgbGlzdGVuZXJzIHRoYXQgb3VyIHZhbHVlIGhhcyBiZWVuIHJlc2V0Ci0JCU9iamVjdCBvbGQgPSB0aGlzLmJ1ZmZlcmVkVmFsdWU7Ci0JCXRoaXMuYnVmZmVyZWRWYWx1ZSA9IG51bGw7Ci0JCXRoaXMuYnVmZmVyaW5nID0gZmFsc2U7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGJ1ZmZlcmVkIG1vZGVsIGlzIGN1cnJlbnRseSAiYnVmZmVyaW5nIgotCSAqIGEgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCdWZmZXJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmJ1ZmZlcmluZzsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGEge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfXtAY29kZTxUPn0uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IGdldFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+KSB0aGlzLnZhbHVlSG9sZGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiA8Y29kZT5UcmlnZ2VyPC9jb2RlPiBpcyBhIHNwZWNpYWwgcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBvbmx5IG1haW50YWlucyBpdHMKLQkgKiB2YWx1ZSAob2YgPGNvZGU+dHJ1ZTwvY29kZT4gb3IgPGNvZGU+ZmFsc2U8L2NvZGU+KSBkdXJpbmcgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gY2F1c2VkIGJ5Ci0JICoge0BsaW5rICNzZXRWYWx1ZShUKX0uIEluIG90aGVyIHdvcmRzLCBhIDxjb2RlPlRyaWdnZXI8L2NvZGU+Ci0JICogb25seSBoYXMgYSB2YWxpZCB2YWx1ZSB3aGVuIGl0IGlzIGJlaW5nIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRyaWdnZXIgZXh0ZW5kcyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gewotCi0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdCBhIHRyaWdnZXIgd2l0aCBhIG51bGwgdmFsdWUuCi0JCSAqLwotCQlwdWJsaWMgVHJpZ2dlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIEV4dGVuZCBzbyB0aGF0IHRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGludm9rZWQgZHVyaW5nCi0JCSAqIGNoYW5nZSBub3RpZmljYXRpb24gdHJpZ2dlcmVkIGJ5IHtAbGluayAjc2V0VmFsdWUoT2JqZWN0KX0uCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0JCQlpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIG1ldGhvZCBUcmlnZ2VyLmdldFZhbHVlKCkgbWF5IG9ubHkgYmUgY2FsbGVkIGR1cmluZyBjaGFuZ2Ugbm90aWZpY2F0aW9uLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBFeHRlbmQgdG8gcmVzZXQgdGhlIHZhbHVlIHRvIDxjb2RlPm51bGw8L2NvZGU+IG9uY2UgYWxsIHRoZQotCQkgKiBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJCXN1cGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJCXRoaXMudmFsdWUgPSBudWxsOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JCS8qKgotCQkgKiBTZXQgdGhlIHRyaWdnZXIncyB2YWx1ZTo8dWw+Ci0JCSAqIAk8bGk+PGNvZGU+dHJ1ZTwvY29kZT4gaW5kaWNhdGVzICJhY2NlcHQiCi0JCSAqIAk8bGk+PGNvZGU+ZmFsc2U8L2NvZGU+IGluZGljYXRlcyAicmVzZXQiCi0JCSAqIDwvdWw+Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShib29sZWFuIHZhbHVlKSB7Ci0JCQl0aGlzLnNldFZhbHVlKEJvb2xlYW4udmFsdWVPZih2YWx1ZSkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgdHJpZ2dlcidzIHZhbHVlOjx1bD4KLQkJICogCTxsaT48Y29kZT50cnVlPC9jb2RlPiBpbmRpY2F0ZXMgImFjY2VwdCIKLQkJICogCTxsaT48Y29kZT5mYWxzZTwvY29kZT4gaW5kaWNhdGVzICJyZXNldCIKLQkJICogPC91bD4KLQkJICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgaW52b2tlZCBkdXJpbmcgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKLQkJCXJldHVybiB0aGlzLmdldFZhbHVlKCkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQWNjZXB0IHRoZSB0cmlnZ2VyIChpLmUuIHNldCBpdHMgdmFsdWUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4pLgotCQkgKi8KLQkJcHVibGljIHZvaWQgYWNjZXB0KCkgewotCQkJdGhpcy5zZXRWYWx1ZSh0cnVlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHJpZ2dlciBoYXMgYmVlbiBhY2NlcHRlZAotCQkgKiAoaS5lLiBpdHMgdmFsdWUgd2FzIGNoYW5nZWQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4pLgotCQkgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBpbnZva2VkIGR1cmluZyBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNBY2NlcHRlZCgpIHsKLQkJCXJldHVybiB0aGlzLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlc2V0IHRoZSB0cmlnZ2VyIChpLmUuIHNldCBpdHMgdmFsdWUgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+KS4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkJdGhpcy5zZXRWYWx1ZShmYWxzZSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIHRyaWdnZXIgaGFzIGJlZW4gcmVzZXQKLQkJICogKGkuZS4gaXRzIHZhbHVlIHdhcyBjaGFuZ2VkIHRvIDxjb2RlPmZhbHNlPC9jb2RlPikuCi0JCSAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGludm9rZWQgZHVyaW5nIGNoYW5nZSBub3RpZmljYXRpb24uCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1Jlc2V0KCkgewotCQkJcmV0dXJuICEgdGhpcy5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTkzMGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IGFuZCB1c2VzIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotICogdG8gdHJhbnNmb3JtIHRoZSB3cmFwcGVkIHZhbHVlIGJlZm9yZSBpdCBpcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFZhbHVlKCl9LgotICogVGhlIHRyYW5zZm9ybWVkIHZhbHVlIGlzIGNhbGN1bGF0ZWQgYW5kIGNhY2hlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIGV2ZXJ5Ci0gKiB0aW1lIHRoZSB3cmFwcGVkIHZhbHVlIGNoYW5nZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHRoZSBvbGQgdmFsdWUKLSAqIHBhc3NlZCBpbiB0byB7QGxpbmsgI3ZhbHVlQ2hhbmdlZChvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KX0KLSAqIGNhbiBubyBsb25nZXIgYmUgInRyYW5zZm9ybWVkIiBiZWNhdXNlIGl0cyBzdGF0ZSBpcyBubyBsb25nZXIgdmFsaWQuCi0gKiBUaGlzIGNhY2hpbmcgY2FuIGFsc28gaW1wcm92ZSB0aW1lIHBlcmZvcm1hbmNlIGluIHNvbWUgc2l0dWF0aW9ucy4KLSAqIDxwPgotICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LAotICogYSBzdWJjbGFzcyBvZiA8Y29kZT5DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGNhbgotICogZWl0aGVyIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtXyhPYmplY3QpfSBvciwKLSAqIGlmIHNvbWV0aGluZyBvdGhlciB0aGFuIG51bGwgc2hvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUKLSAqIGlzIG51bGwsIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9LgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQxLCBUMj4KLQlleHRlbmRzIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQxLCBUMj4KLXsKLQkvKioKLQkgKiBDYWNoZSB0aGUgdHJhbnNmb3JtZWQgdmFsdWUgc28gdGhhdCBkdXJpbmcgcHJvcGVydHkgY2hhbmdlIGV2ZW50IG5vdGlmaWNhdGlvbgotCSAqIHdlIGRvIG5vdCBoYXZlIHRvIHRyYW5zZm9ybSB0aGUgb2xkIHZhbHVlLiBUaGUgb2xkIHZhbHVlIGNvdWxkIG5vIGxvbmdlciBiZSB2YWxpZCBpbgotCSAqIHRoZSBtb2RlbDsgYXMgYSByZXN1bHQsIHRyYW5zZm9ybWluZyBpdCB3b3VsZCBub3QgYmUgdmFsaWQuCi0JICovCi0JcHJvdGVjdGVkIFQyIGNhY2hlZFZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRoZSBkZWZhdWx0IHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlCi0JICoge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IG9yIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9Ci0JICogaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQxPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQxPiB2YWx1ZUhvbGRlciwgVHJhbnNmb3JtZXI8VDEsIFQyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcih2YWx1ZUhvbGRlciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXZSBoYXZlIGxpc3RlbmVycywgdHJhbnNmb3JtIHRoZSBuZXN0ZWQgdmFsdWUgYW5kIGNhY2hlIHRoZSByZXN1bHQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCXRoaXMuY2FjaGVkVmFsdWUgPSB0aGlzLnRyYW5zZm9ybSh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIFdlIGhhdmUgbm8gbW9yZSBsaXN0ZW5lcnMsIGNsZWFyIHRoZSBjYWNoZWQgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuY2FjaGVkVmFsdWUgPSBudWxsOwotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIE5vIG5lZWQgdG8gdHJhbnNmb3JtIHRoZSBuZXN0ZWQgdmFsdWUsIHNpbXBseSByZXR1cm4gdGhlIGNhY2hlZCB2YWx1ZSwKLQkgKiB3aGljaCBpcyBhbHJlYWR5IHRyYW5zZm9ybWVkLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUMiBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlLCBjYWNoaW5nIGl0IGJlZm9yZSByZXR1cm5pbmcgaXQuCi0JICogQSBiaXQgb2YgYSBzaWRlLWVmZmVjdCwgYnV0IGl0IHNlZW1zIHJlYXNvbmFibGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFQyIHRyYW5zZm9ybU5ldyhUMSB2YWx1ZSkgewotCQl0aGlzLmNhY2hlZFZhbHVlID0gc3VwZXIudHJhbnNmb3JtTmV3KHZhbHVlKTsKLQkJcmV0dXJuIHRoaXMuY2FjaGVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogTm8gbmVlZCB0byB0cmFuc2Zvcm0gdGhlIG9sZCB2YWx1ZSwgc2ltcGx5IHJldHVybiB0aGUgY2FjaGVkIHZhbHVlLAotCSAqIHdoaWNoIGlzIGFscmVhZHkgdHJhbnNmb3JtZWQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFQyIHRyYW5zZm9ybU9sZChUMSB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5jYWNoZWRWYWx1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YzdmMTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpZGlUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPGNvZGU+IGF1Z21lbnRzIHRoZQotICogYmVoYXZpb3Igb2YgYSB7QGxpbmsgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gYnkgY2FjaGluZwotICogdGhlIHRyYW5zZm9ybWVkIHZhbHVlLgotICogVGhlIHRyYW5zZm9ybWVkIHZhbHVlIGlzIGNhbGN1bGF0ZWQgYW5kIGNhY2hlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIGV2ZXJ5Ci0gKiB0aW1lIHRoZSB3cmFwcGVkIHZhbHVlIGNoYW5nZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHRoZSBvbGQgdmFsdWUKLSAqIHBhc3NlZCBpbiB0byB7QGxpbmsgI3ZhbHVlQ2hhbmdlZChvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KX0KLSAqIGNhbiBubyBsb25nZXIgYmUgInRyYW5zZm9ybWVkIiBiZWNhdXNlIGl0cyBzdGF0ZSBpcyBubyBsb25nZXIgdmFsaWQuCi0gKiBUaGlzIGNhY2hpbmcgY2FuIGFsc28gaW1wcm92ZSB0aW1lIHBlcmZvcm1hbmNlIGluIHNvbWUgc2l0dWF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIENhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxLCBUMj4KLQlleHRlbmRzIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDEsIFQyPgotewotCS8qKgotCSAqIENhY2hlIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSBzbyB0aGF0IGR1cmluZyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgbm90aWZpY2F0aW9uCi0JICogd2UgZG8gbm90IGhhdmUgdG8gdHJhbnNmb3JtIHRoZSBvbGQgdmFsdWUuIFRoZSBvbGQgdmFsdWUgY291bGQgbm8gbG9uZ2VyIGJlIHZhbGlkIGluCi0JICogdGhlIG1vZGVsOyBhcyBhIHJlc3VsdCwgdHJhbnNmb3JtaW5nIGl0IHdvdWxkIG5vdCBiZSB2YWxpZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVDIgY2FjaGVkVmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdGhlIGRlZmF1bHQgYmlkaSB0cmFuc2Zvcm1lci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZQotCSAqIHtAbGluayAjdHJhbnNmb3JtXyhPYmplY3QpfSBhbmQge0BsaW5rIHJldmVyc2VUcmFuc2Zvcm1fKE9iamVjdCl9Ci0JICogKG9yIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IGFuZCB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm0oT2JqZWN0KX0pCi0JICogbWV0aG9kcyBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIEJpZGlUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIENhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCBiaWRpIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUMT4gdmFsdWVIb2xkZXIsIEJpZGlUcmFuc2Zvcm1lcjxUMSwgVDI+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFdlIGhhdmUgbGlzdGVuZXJzLCB0cmFuc2Zvcm0gdGhlIG5lc3RlZCB2YWx1ZSBhbmQgY2FjaGUgdGhlIHJlc3VsdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJdGhpcy5jYWNoZWRWYWx1ZSA9IHRoaXMudHJhbnNmb3JtKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogV2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycywgY2xlYXIgdGhlIGNhY2hlZCB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5jYWNoZWRWYWx1ZSA9IG51bGw7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogTm8gbmVlZCB0byB0cmFuc2Zvcm0gdGhlIG5lc3RlZCB2YWx1ZSwgc2ltcGx5IHJldHVybiB0aGUgY2FjaGVkIHZhbHVlLAotCSAqIHdoaWNoIGlzIGFscmVhZHkgdHJhbnNmb3JtZWQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFQyIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUsIGNhY2hpbmcgaXQgYmVmb3JlIHJldHVybmluZyBpdC4KLQkgKiBBIGJpdCBvZiBhIHNpZGUtZWZmZWN0LCBidXQgaXQgc2VlbXMgcmVhc29uYWJsZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVDIgdHJhbnNmb3JtTmV3KFQxIHZhbHVlKSB7Ci0JCXRoaXMuY2FjaGVkVmFsdWUgPSBzdXBlci50cmFuc2Zvcm1OZXcodmFsdWUpOwotCQlyZXR1cm4gdGhpcy5jYWNoZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBObyBuZWVkIHRvIHRyYW5zZm9ybSB0aGUgb2xkIHZhbHVlLCBzaW1wbHkgcmV0dXJuIHRoZSBjYWNoZWQgdmFsdWUsCi0JICogd2hpY2ggaXMgYWxyZWFkeSB0cmFuc2Zvcm1lZC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVDIgdHJhbnNmb3JtT2xkKFQxIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlZFZhbHVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NoYW5nZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DaGFuZ2VQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NmQ2ZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NoYW5nZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TaW1wbGVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgY29udmVydAotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gcHJvcGVydHkgdmFsdWUgbW9kZWwgY2hhbmdlCi0gKiBub3RpZmljYXRpb25zLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGU6PHVsPgotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIHRvIHJldHVybiB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotICogICAgIGN1cnJlbnQgbW9kZWwKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNtb2RlbENoYW5nZWQoQ2hhbmdlRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjYnVpbGRDaGFuZ2VMaXN0ZW5lcigpfQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENoYW5nZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotewotCS8qKiBUaGUgd3JhcHBlZCBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTW9kZWwgbW9kZWw7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBDaGFuZ2VQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyKE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDaGFuZ2VQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNoYW5nZSBsaXN0ZW5lciBjb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5tb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLm1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbW9kZWwgaGFzIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uQXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGNmNGI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uQXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGV4dGVuc2lvbiBvZiB7QGxpbmsgQXNwZWN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyfSBwcm92aWRlcwotICogYmFzaWMgY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYSBzZXQgb2Ygb25lIG9yIG1vcmUgY29sbGVjdGlvbnMgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNWQUxVRVN9IGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzIChzZWUgdGhlIGRlc2NyaXB0aW9ucwotICogaW4ge0BsaW5rIEFzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcn0pOjx1bD4KLSAqIDxsaT57QGxpbmsgI2dldEl0ZXJhYmxlKCl9Ci0gKiA8bGk+e0BsaW5rICNzaXplXygpfQotICogPGxpPntAbGluayAjaXRlcmF0b3JfKCl9Ci0gKiA8bGk+e0BsaW5rICNpdGVyYXRvcigpfQotICogPGxpPntAbGluayAjc2l6ZSgpfQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPFMgZXh0ZW5kcyBNb2RlbCwgRT4KLQlleHRlbmRzIEFzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxTLCBFPgotewotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbnMgdGhhdCB3ZSB1c2UgZm9yIHRoZSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gY29sbGVjdGlvbk5hbWVzOwotCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX0NPTExFQ1RJT05fTkFNRVMgPSBuZXcgU3RyaW5nWzBdOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3RzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiBhbmQgY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RyaW5nW10ge2NvbGxlY3Rpb25OYW1lfSwgc3ViamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIGNvbGxlY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihTdHJpbmdbXSBjb2xsZWN0aW9uTmFtZXMsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4oc3ViamVjdCksIGNvbGxlY3Rpb25OYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBjb2xsZWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBTdHJpbmcuLi4gY29sbGVjdGlvbk5hbWVzKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCQl0aGlzLmNvbGxlY3Rpb25OYW1lcyA9IGNvbGxlY3Rpb25OYW1lczsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBjb2xsZWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbk5hbWVzKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgY29sbGVjdGlvbk5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tjb2xsZWN0aW9uTmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gYXNwZWN0IGFkYXB0ZXIgZm9yIGFuICJ1bmNoYW5naW5nIiBjb2xsZWN0aW9uIGluCi0JICogdGhlIHNwZWNpZmllZCBzdWJqZWN0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYSBjb2xsZWN0aW9uIGFzcGVjdCB0aGF0IGRvZXMgbm90Ci0JICogY2hhbmdlIGZvciBhIHBhcnRpY3VsYXIgc3ViamVjdDsgYnV0IHRoZSBzdWJqZWN0IHdpbGwgY2hhbmdlLCByZXN1bHRpbmcgaW4KLQkgKiBhIG5ldyBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBFTVBUWV9DT0xMRUNUSU9OX05BTUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUVTIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0gICAgCWZvciAoU3RyaW5nIGNvbGxlY3Rpb25OYW1lIDogdGhpcy5jb2xsZWN0aW9uTmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGV2ZW50LmNsb25lKHRoaXMsIFZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGV2ZW50LmNsb25lKHRoaXMsIFZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50LmNsb25lKHRoaXMsIFZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChldmVudC5jbG9uZSh0aGlzLCBWQUxVRVMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTBkMjM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0gYmVoYXZlIGxpa2UKLSAqIGEgcmVhZC1vbmx5IHtAbGluayBMaXN0VmFsdWVNb2RlbH0sIHNvcnRhLgotICogPHA+Ci0gKiBUbyBtYWludGFpbiBhIHJlYXNvbmFibHkgY29uc2lzdGVudCBhcHBlYXJhbmNlIHRvIGNsaWVudCBjb2RlLCB3ZQotICoga2VlcCBhbiBpbnRlcm5hbCBsaXN0IHNvbWV3aGF0IGluIHN5bmNoIHdpdGggdGhlIHdyYXBwZWQgY29sbGVjdGlvbi4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZAotICogY29sbGVjdGlvbiB3aGlsZSB3ZSBhcmUgbGlzdGVuaW5nIHRvIGl0LCByZXN1bHRzIHRvIHZhcmlvdXMgbWV0aG9kcwotICogKGUuZy4ge0BsaW5rICNzaXplKCl9LCB7QGxpbmsgI2dldChpbnQpfSkgd2lsbCBiZSB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50cyB3aWxsIGFsc28gYmUgbGlzdGVuZXJzLgotICovCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgQWJzdHJhY3RMaXN0VmFsdWVNb2RlbAotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGZvcndhcmRzIGFueSBldmVudHMgZmlyZWQgYnkgdGhlIGNvbGxlY3Rpb24gaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogT3VyIGludGVybmFsIGxpc3QsIHdoaWNoIGhvbGRzIHRoZSBzYW1lIGVsZW1lbnRzIGFzCi0JICogdGhlIHdyYXBwZWQgY29sbGVjdGlvbiwgYnV0IGtlZXBzIHRoZW0gaW4gb3JkZXIuCi0JICovCi0JLy8gd2UgZGVjbGFyZSB0aGlzIGFuIEFycmF5TGlzdCBzbyB3ZSBjYW4gdXNlICNjbG9uZSgpIGFuZCAjZW5zdXJlQ2FwYWNpdHkoaW50KQotCXByb3RlY3RlZCBmaW5hbCBBcnJheUxpc3Q8RT4gbGlzdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNvbGxlY3Rpb25Ib2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyID0gY29sbGVjdGlvbkhvbGRlcjsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMubGlzdCA9IG5ldyBBcnJheUxpc3Q8RT4oY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCQkvLyBwb3N0cG9uZSBidWlsZGluZyB0aGUgbGlzdCBhbmQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24KLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaGFzIGNoYW5nZWQsIGZvcndhcmQgYW4gZXF1aXZhbGVudAotCSAqIGxpc3QgY2hhbmdlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3QpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QudG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIGxpc3QgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLmJ1aWxkTGlzdCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCQkvLyBjbGVhciBvdXQgdGhlIGxpc3Qgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIKLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRMaXN0KCkgewotCQkvLyBpZiB0aGUgbmV3IGNvbGxlY3Rpb24gaXMgZW1wdHksIGRvIG5vdGhpbmcKLQkJaW50IHNpemUgPSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpOwotCQlpZiAoc2l6ZSAhPSAwKSB7Ci0JCQl0aGlzLmJ1aWxkTGlzdChzaXplKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkTGlzdChpbnQgc2l6ZSkgewotCQl0aGlzLmxpc3QuZW5zdXJlQ2FwYWNpdHkoc2l6ZSk7Ci0JCWZvciAoRSBlYWNoIDogdGhpcy5jb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCQl0aGlzLmxpc3QuYWRkKGVhY2gpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5hZGRJdGVtc1RvTGlzdCh0aGlzLmluZGV4VG9BZGRJdGVtcygpLCB0aGlzLmdldEl0ZW1zKGV2ZW50KSwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgaW5kZXhUb0FkZEl0ZW1zKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNpemUoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KHRoaXMuZ2V0SXRlbXMoZXZlbnQpLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmNsZWFyTGlzdCh0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0JCi0JLyoqCi0JICogc3luY2hyb25pemUgb3VyIGludGVybmFsIGxpc3Qgd2l0aCB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHNpemUgPSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpOwotCQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCQlpZiAodGhpcy5saXN0LmlzRW1wdHkoKSkgewotCQkJCS8vIG5vIGNoYW5nZQotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmNsZWFyTGlzdCh0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLmxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJdGhpcy5idWlsZExpc3Qoc2l6ZSk7Ci0JCQkJdGhpcy5maXJlSXRlbXNBZGRlZChMSVNUX1ZBTFVFUywgMCwgdGhpcy5saXN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JCQkJdGhpcy5idWlsZExpc3Qoc2l6ZSk7Ci0JCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMubGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmxpc3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzZWQ2OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIGNvbnZlcnQKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBpbnRvIHByb3BlcnR5IHZhbHVlIG1vZGVsIGNoYW5nZQotICogbm90aWZpY2F0aW9ucy4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlOjx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWUoKX08cD4KLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjdXJyZW50IGNvbGxlY3Rpb24gdmFsdWUKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI2NvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI2NvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Vj4KLQlleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxWPgotewotCS8qKiBUaGUgd3JhcHBlZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PiBjb2xsZWN0aW9uTW9kZWw7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb2xsZWN0aW9uTW9kZWwgPSBjb2xsZWN0aW9uTW9kZWw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQkJCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Nb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5jb2xsZWN0aW9uTW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyIHdhcyBjbGVhcmVkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyIGhhcyBjaGFuZ2VkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGQ0MzIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhbm90aGVyIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIHByb3BhZ2F0ZQotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zLiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBhcHByb3ByaWF0ZQotICoge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbAotewotCS8qKiBUaGUgd3JhcHBlZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNoIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBjb2xsZWN0aW9uSG9sZGVyOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyIHdhcyBjbGVhcmVkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmNWQyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGFkYXB0cyBhCi0gKiB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IGhvbGRpbmcgYm9vbGVhbiB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfXMKLSAqIHRvIGEgc2luZ2xlIGJvb2xlYW4ge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0uIFRoZSBjb21wb3NpdGUgdmFsdWUgaXMKLSAqIGRldGVybWluZWQgYnkgdGhlIHtAbGluayBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsLkFkYXB0ZXJ9IHByb3ZpZGVkCi0gKiBhdCBjb25zdHJ1Y3Rpb24uIFR5cGljYWxseSB0aGUgY29tcG9zaXRlIHdpbGwgYmUgZWl0aGVyIGFuIEFORCBvciBhbiBPUiBvZgotICogYWxsIHRoZSBib29sZWFuIHZhbHVlcy4KLSAqIDxwPgotICogSWYgdGhlcmUgYXJlIDxlbT5ubzwvZW0+IGJvb2xlYW4ge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH1zLCB0aGUgY29tcG9zaXRlCi0gKiB3aWxsIHJldHVybiBpdHMgZGVmYXVsdCB2YWx1ZTsgd2hpY2gsIGJ5IGRlZmF1bHQsIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBOb25lIG9mIHRoZSB3cmFwcGVkIGJvb2xlYW4gbW9kZWxzIGNhbiByZXR1cm4gYQotICogPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUgb3IgdGhpcyBjbGFzcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4gVGhlIGFzc3VtcHRpb24KLSAqIGlzIHRoYXQgYWxsIHRoZSB3cmFwcGVkIGJvb2xlYW4gbW9kZWxzIGFyZSBjb25maWd1cmVkIHdpdGggImRlZmF1bHQiIHZhbHVlcwotICogdGhhdCBkZXRlcm1pbmUgdGhlIG1vZGVsJ3MgdmFsdWUgKFRSVUUgb3IgRkFMU0UpIHdoZW4gPGNvZGU+bnVsbDwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsCi0JZXh0ZW5kcyBDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4KLXsKLQkvKioKLQkgKiBDYWxjdWxhdGlvbiBvZiB0aGUgbW9kZWwncyB2YWx1ZSBpcyBkZWxlZ2F0ZWQgdG8gdGhpcyBhZGFwdGVyLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBBZGFwdGVyIGFkYXB0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgY29tcG9zaXRlIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWw7Ci0JICogZm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbiBtb2RlbCBpcyBlbXB0eS4KLQkgKiBUaGUgZGVmYXVsdCBbZGVmYXVsdCB2YWx1ZV0gaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBCb29sZWFuIGRlZmF1bHRWYWx1ZTsKLQotCi0JLy8gKioqKioqKioqKiBBTkQgZmFjdG9yeSBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBBTkQgb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIHRydWUKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIHRydWUsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgZmFsc2UuCi0JICogVGhlIG1vZGVsJ3MgZGVmYXVsdCB2YWx1ZSwgd2hlbiBpdCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbCBhbmQoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Li4uIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBTkRfQURBUFRFUiwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBBTkQgb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIHRydWUKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIHRydWUsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgZmFsc2UuCi0JICogV2hlbiB0aGUgbW9kZWwgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXRzIHZhbHVlIHdpbGwgYmUgdGhlCi0JICogc3BlY2lmaWVkIGRlZmF1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsIGFuZChCb29sZWFuIGRlZmF1bHRWYWx1ZSwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Li4uIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBTkRfQURBUFRFUiwgZGVmYXVsdFZhbHVlLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIEFORCBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgdHJ1ZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgdHJ1ZSwgb3RoZXJ3aXNlIGl0cyB2YWx1ZSBpcyBmYWxzZS4KLQkgKiBUaGUgbW9kZWwncyBkZWZhdWx0IHZhbHVlLCB3aGVuIGl0IGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbCBhbmQoQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBTkRfQURBUFRFUiwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIEFORCBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgdHJ1ZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgdHJ1ZSwgb3RoZXJ3aXNlIGl0cyB2YWx1ZSBpcyBmYWxzZS4KLQkgKiBXaGVuIHRoZSBtb2RlbCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpdHMgdmFsdWUgd2lsbCBiZSB0aGUKLQkgKiBzcGVjaWZpZWQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsIGFuZChCb29sZWFuIGRlZmF1bHRWYWx1ZSwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBTkRfQURBUFRFUiwgZGVmYXVsdFZhbHVlLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgQU5EIG9mIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsczsgaS5lLiB0aGUgbW9kZWwncyB2YWx1ZSBpcyB0cnVlCi0JICogaWYgYWxsIHRoZSBjb250YWluZWQgbW9kZWxzIGFyZSB0cnVlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIGZhbHNlLgotCSAqIFRoZSBtb2RlbCdzIGRlZmF1bHQgdmFsdWUsIHdoZW4gaXQgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgYW5kKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IGNvbGxlY3Rpb25Nb2RlbCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQU5EX0FEQVBURVIsIGNvbGxlY3Rpb25Nb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIEFORCBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgdHJ1ZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgdHJ1ZSwgb3RoZXJ3aXNlIGl0cyB2YWx1ZSBpcyBmYWxzZS4KLQkgKiBXaGVuIHRoZSBtb2RlbCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpdHMgdmFsdWUgd2lsbCBiZSB0aGUKLQkgKiBzcGVjaWZpZWQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgYW5kKEJvb2xlYW4gZGVmYXVsdFZhbHVlLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFORF9BREFQVEVSLCBkZWZhdWx0VmFsdWUsIGNvbGxlY3Rpb25Nb2RlbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9SIGZhY3RvcnkgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgT1Igb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIGZhbHNlCi0JICogaWYgYWxsIHRoZSBjb250YWluZWQgbW9kZWxzIGFyZSBmYWxzZSwgb3RoZXJ3aXNlIGl0cyB2YWx1ZSBpcyB0cnVlLgotCSAqIFRoZSBtb2RlbCdzIGRlZmF1bHQgdmFsdWUsIHdoZW4gaXQgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgb3IoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Li4uIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChPUl9BREFQVEVSLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIE9SIG9mIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsczsgaS5lLiB0aGUgbW9kZWwncyB2YWx1ZSBpcyBmYWxzZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgZmFsc2UsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgdHJ1ZS4KLQkgKiBXaGVuIHRoZSBtb2RlbCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpdHMgdmFsdWUgd2lsbCBiZSB0aGUKLQkgKiBzcGVjaWZpZWQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgb3IoQm9vbGVhbiBkZWZhdWx0VmFsdWUsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPi4uLiBhcnJheSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoT1JfQURBUFRFUiwgZGVmYXVsdFZhbHVlLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIE9SIG9mIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsczsgaS5lLiB0aGUgbW9kZWwncyB2YWx1ZSBpcyBmYWxzZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgZmFsc2UsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgdHJ1ZS4KLQkgKiBUaGUgbW9kZWwncyBkZWZhdWx0IHZhbHVlLCB3aGVuIGl0IGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbCBvcihDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKE9SX0FEQVBURVIsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBPUiBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgZmFsc2UKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIGZhbHNlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIHRydWUuCi0JICogV2hlbiB0aGUgbW9kZWwgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXRzIHZhbHVlIHdpbGwgYmUgdGhlCi0JICogc3BlY2lmaWVkIGRlZmF1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbCBvcihCb29sZWFuIGRlZmF1bHRWYWx1ZSwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChPUl9BREFQVEVSLCBkZWZhdWx0VmFsdWUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBPUiBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgZmFsc2UKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIGZhbHNlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIHRydWUuCi0JICogVGhlIG1vZGVsJ3MgZGVmYXVsdCB2YWx1ZSwgd2hlbiBpdCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbCBvcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKE9SX0FEQVBURVIsIGNvbGxlY3Rpb25Nb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIE9SIG9mIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsczsgaS5lLiB0aGUgbW9kZWwncyB2YWx1ZSBpcyBmYWxzZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgZmFsc2UsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgdHJ1ZS4KLQkgKiBXaGVuIHRoZSBtb2RlbCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpdHMgdmFsdWUgd2lsbCBiZSB0aGUKLQkgKiBzcGVjaWZpZWQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgb3IoQm9vbGVhbiBkZWZhdWx0VmFsdWUsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IGNvbGxlY3Rpb25Nb2RlbCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoT1JfQURBUFRFUiwgZGVmYXVsdFZhbHVlLCBjb2xsZWN0aW9uTW9kZWwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVscywgYXMgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIuCi0JICogVGhlIG1vZGVsJ3MgZGVmYXVsdCB2YWx1ZSwgd2hlbiBpdCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFkYXB0ZXIgYWRhcHRlciwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Li4uIGFycmF5KSB7Ci0JCXRoaXMoYWRhcHRlciwgbnVsbCwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMsIGFzIGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZCBhZGFwdGVyLgotCSAqIFdoZW4gdGhlIG1vZGVsIGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGl0cyB2YWx1ZSB3aWxsIGJlIHRoZQotCSAqIHNwZWNpZmllZCBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFkYXB0ZXIgYWRhcHRlciwgQm9vbGVhbiBkZWZhdWx0VmFsdWUsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPi4uLiBhcnJheSkgewotCQlzdXBlcihhcnJheSk7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMsIGFzIGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZCBhZGFwdGVyLgotCSAqIFRoZSBtb2RlbCdzIGRlZmF1bHQgdmFsdWUsIHdoZW4gaXQgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgPEUgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQWRhcHRlciBhZGFwdGVyLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24pIHsKLQkJdGhpcyhhZGFwdGVyLCBudWxsLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHNwZWNpZmllZAotCSAqIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzLCBhcyBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgYWRhcHRlci4KLQkgKiBXaGVuIHRoZSBtb2RlbCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpdHMgdmFsdWUgd2lsbCBiZSB0aGUKLQkgKiBzcGVjaWZpZWQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgPEUgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQWRhcHRlciBhZGFwdGVyLCBCb29sZWFuIGRlZmF1bHRWYWx1ZSwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb24pOwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHNwZWNpZmllZAotCSAqIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzLCBhcyBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgYWRhcHRlci4KLQkgKiBUaGUgbW9kZWwncyBkZWZhdWx0IHZhbHVlLCB3aGVuIGl0IGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQWRhcHRlciBhZGFwdGVyLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJdGhpcyhhZGFwdGVyLCBudWxsLCBjb2xsZWN0aW9uTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMsIGFzIGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZCBhZGFwdGVyLgotCSAqIFdoZW4gdGhlIG1vZGVsIGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGl0cyB2YWx1ZSB3aWxsIGJlIHRoZQotCSAqIHNwZWNpZmllZCBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFkYXB0ZXIgYWRhcHRlciwgQm9vbGVhbiBkZWZhdWx0VmFsdWUsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IGNvbGxlY3Rpb25Nb2RlbCkgewotCQlzdXBlcihjb2xsZWN0aW9uTW9kZWwpOwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWxsIHRoZSBjb250YWluZWQgYm9vbGVhbnMgYXJlIHRydWU7IG90aGVyd2lzZSByZXR1cm4KLQkgKiBmYWxzZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuY29sbGVjdGlvbk1vZGVsLnNpemUoKSA9PSAwKSA/IHRoaXMuZGVmYXVsdFZhbHVlIDogdGhpcy5idWlsZFZhbHVlXygpOwotCX0KLQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmJ1aWxkVmFsdWUodGhpcy5nZXRCb29sZWFucygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8Qm9vbGVhbj4gZ2V0Qm9vbGVhbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4sIEJvb2xlYW4+KHRoaXMuZ2V0Q29sbGVjdGlvbk1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwpIHsKLQkJCQlyZXR1cm4gYm9vbGVhbk1vZGVsLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IGdldENvbGxlY3Rpb25Nb2RlbCgpIHsKLQkJcmV0dXJuIChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Pikgc3VwZXIuZ2V0Q29sbGVjdGlvbk1vZGVsKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBhZGFwdGVyIGFsbG93cyB0aGUge0BsaW5rIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWx9IHRvIGJlCi0JICogcGx1Z2dhYmxlLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgQWRhcHRlciB7Ci0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGNvbXBvc2l0ZSBib29sZWFuIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbgotCQkgKiBvZiBib29sZWFuIG1vZGVscy4KLQkJICovCi0JCUJvb2xlYW4gYnVpbGRWYWx1ZShJdGVyYWJsZTxCb29sZWFuPiBib29sZWFucyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWxsIHRoZSBib29sZWFucyBhcmUgdHJ1ZTsgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFkYXB0ZXIgQU5EX0FEQVBURVIgPSBuZXcgQWRhcHRlcigpIHsKLQkJcHVibGljIEJvb2xlYW4gYnVpbGRWYWx1ZShJdGVyYWJsZTxCb29sZWFuPiBib29sZWFucykgewotCQkJZm9yIChCb29sZWFuIGIgOiBib29sZWFucykgewotCQkJCWlmICggISBiLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkFORF9BREFQVEVSIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfTsKLQotCS8qKgotCSAqIFJldHVybiBmYWxzZSBpZiBhbGwgdGhlIGJvb2xlYW5zIGFyZSBmYWxzZTsgb3RoZXJ3aXNlIHJldHVybiB0cnVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQWRhcHRlciBPUl9BREFQVEVSID0gbmV3IEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyBCb29sZWFuIGJ1aWxkVmFsdWUoSXRlcmFibGU8Qm9vbGVhbj4gYm9vbGVhbnMpIHsKLQkJCWZvciAoQm9vbGVhbiBiIDogYm9vbGVhbnMpIHsKLQkJCQlpZiAoYi5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJPUl9BREFQVEVSIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4ODFkZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5OdWxsTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IGFuZCB1c2VzIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotICogdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB0byB5ZXQgYW5vdGhlcgotICoge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfS4gVGhpcyBjb21wb3NpdGUgY29sbGVjdGlvbiBjb250YWlucwotICogdGhlIGNvbWJpbmVkIGl0ZW1zIGZyb20gYWxsIHRoZXNlIGNvbXBvbmVudCBjb2xsZWN0aW9ucy4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIHdyYXBwZWQgY29sbGVjdGlvbiBtdXN0IGJlIGFuICJpZGVudGl0eSBzZXQiIHRoYXQgZG9lcyBub3QKLSAqIGNvbnRhaW4gdGhlIHNhbWUgaXRlbSB0d2ljZSBvciB0aGlzIGNsYXNzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICogPHA+Ci0gKiBUZXJtaW5vbG9neTo8dWw+Ci0gKiA8bGk+PGVtPnNvdXJjZXM8L2VtPiAtIHRoZSBpdGVtcyBpbiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsOyB0aGVzZQotICogICAgYXJlIGNvbnZlcnRlZCBpbnRvIGNvbXBvbmVudCBDVk1zIGJ5IHRoZSB0cmFuc2Zvcm1lcgotICogPGxpPjxlbT5jb21wb25lbnQgQ1ZNczwvZW0+IC0gdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscyB0aGF0IGFyZSBjb21iaW5lZAotICogICAgYnkgdGhpcyBjb21wb3NpdGUgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbAotICogPGxpPjxlbT5pdGVtczwvZW0+IC0gdGhlIGl0ZW1zIGhlbGQgYnkgdGhlIGNvbXBvbmVudCBDVk1zCi0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8RTEsIEUyPgotCWV4dGVuZHMgQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyPEUxPgotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+Ci17Ci0JLyoqCi0JICogVGhpcyBpcyB0aGUgKG9wdGlvbmFsKSB1c2VyLXN1cHBsaWVkIG9iamVjdCB0aGF0IHRyYW5zZm9ybXMKLQkgKiB0aGUgaXRlbXMgaW4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB0byBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4+IHRyYW5zZm9ybWVyOwotCi0JLyoqCi0JICogQ2FjaGUgb2YgdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscyB0aGF0Ci0JICogd2VyZSBnZW5lcmF0ZWQgYnkgdGhlIHRyYW5zZm9ybWVyOyBrZXllZCBieSB0aGUgaXRlbQotCSAqIGluIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdGhhdCB3YXMgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIElkZW50aXR5SGFzaE1hcDxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiBjb21wb25lbnRDVk1zID0KLQkJCW5ldyBJZGVudGl0eUhhc2hNYXA8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4oKTsKLQotCS8qKgotCSAqIENhY2hlIG9mIHRoZSBjb2xsZWN0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb21wb25lbnQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscyBhYm92ZTsga2V5ZWQgYnkgdGhlIGNvbXBvbmVudAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzLgotCSAqIFVzZSB7QGxpbmsgQXJyYXlMaXN0fXMgc28gd2UgY2FuIHVzZSB7QGxpbmsgQXJyYXlMaXN0fS1zcGVjaWZpYyBtZXRob2RzCi0JICogKGUuZy4ge0BsaW5rIEFycmF5TGlzdCNjbG9uZSgpfSBhbmQge0BsaW5rIEFycmF5TGlzdCNlbnN1cmVDYXBhY2l0eShpbnQpfSkuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBJZGVudGl0eUhhc2hNYXA8Q29sbGVjdGlvblZhbHVlTW9kZWw8RTI+LCBBcnJheUxpc3Q8RTI+PiBjb2xsZWN0aW9ucyA9Ci0JCQluZXcgSWRlbnRpdHlIYXNoTWFwPENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiwgQXJyYXlMaXN0PEUyPj4oKTsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBjb21wb25lbnQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMuICovCi0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY29tcG9uZW50Q1ZNTGlzdGVuZXI7Ci0KLQkvKiogQ2FjaGUgdGhlIHNpemUgb2YgdGhlIGNvbXBvc2l0ZSBjb2xsZWN0aW9uLiAqLwotCXByaXZhdGUgaW50IHNpemU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMoY29sbGVjdGlvbkhvbGRlciwgVHJhbnNmb3JtZXIuTnVsbC48RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gY29sbGVjdGlvbkhvbGRlciwgVHJhbnNmb3JtZXI8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJc3VwZXIoY29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQkJdGhpcy5jb21wb25lbnRDVk1MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb21wb25lbnRMaXN0ZW5lcigpOwotCQl0aGlzLnNpemUgPSAwOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMobmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RTE+KGxpc3RIb2xkZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlciwgVHJhbnNmb3JtZXI8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFMT4obGlzdEhvbGRlciksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCwgdW5jaGFuZ2luZywgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24uIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmPHVsPgotCSAqIDxsaT4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbHJlYWR5IGNvbnRhaW5zIG90aGVyCi0JICogICAgICAgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMsIG9yCi0JICogPGxpPiB5b3Ugd2FudCB0byBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybShFMSl9Ci0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFMT4gY29sbGVjdGlvbikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMT4oY29sbGVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb248PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uLCBUcmFuc2Zvcm1lcjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMT4oY29sbGVjdGlvbiksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCwgdW5jaGFuZ2luZywgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24uIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmPHVsPgotCSAqIDxsaT4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbHJlYWR5IGNvbnRhaW5zIG90aGVyCi0JICogICAgICAgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMsIG9yCi0JICogPGxpPiB5b3Ugd2FudCB0byBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybShFMSl9Ci0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChFMS4uLiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMobmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEUxPihjb2xsZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQsIHVuY2hhbmdpbmcsIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoRTFbXSBjb2xsZWN0aW9uLCBUcmFuc2Zvcm1lcjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMT4oY29sbGVjdGlvbiksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbXBvbmVudExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0JCQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50SXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRDb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudENvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbXBvbmVudCBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxFMj4odGhpcy5idWlsZENvbGxlY3Rpb25zSXRlcmF0b3JzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxJdGVyYXRvcjxFMj4+IGJ1aWxkQ29sbGVjdGlvbnNJdGVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxBcnJheUxpc3Q8RTI+LCBJdGVyYXRvcjxFMj4+KHRoaXMuY29sbGVjdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8RTI+IHRyYW5zZm9ybShBcnJheUxpc3Q8RTI+IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5pdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyIG92ZXJyaWRlcy9pbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3luY2ggb3VyIGNhY2hlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24sCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMuYWRkQWxsQ29tcG9uZW50U291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSBhbGwgdGhlIHNvdXJjZXMgdG8gY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMKLQkgKiBhbmQgYWRkIHRoZWlyIGl0ZW1zIHRvIG91ciBjYWNoZSwgd2l0aCBubyBldmVudCBub3RpZmljYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWxsQ29tcG9uZW50U291cmNlcygpIHsKLQkJZm9yIChFMSBzb3VyY2UgOiB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJCXRoaXMuYWRkQ29tcG9uZW50U291cmNlKHNvdXJjZSwgTnVsbExpc3QuPEUyPmluc3RhbmNlKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBjb21wb25lbnRzLi4uCi0JCWZvciAoQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudENWTSA6IHRoaXMuY29tcG9uZW50Q1ZNcy52YWx1ZXMoKSkgewotCQkJY29tcG9uZW50Q1ZNLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihWQUxVRVMsIHRoaXMuY29tcG9uZW50Q1ZNTGlzdGVuZXIpOwotCQl9Ci0JCS8vIC4uLmFuZCBjbGVhciB0aGUgY2FjaGUKLQkJdGhpcy5jb21wb25lbnRDVk1zLmNsZWFyKCk7Ci0JCXRoaXMuY29sbGVjdGlvbnMuY2xlYXIoKTsKLQkJdGhpcy5zaXplID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBTb21lIGNvbXBvbmVudCBzb3VyY2VzIHdlcmUgYWRkZWQ7Ci0JICogYWRkIHRoZWlyIGNvcnJlc3BvbmRpbmcgaXRlbXMgdG8gb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCUFycmF5TGlzdDxFMj4gYWRkZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KCk7Ci0JCWZvciAoRTEgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7Ci0JCQl0aGlzLmFkZENvbXBvbmVudFNvdXJjZShpdGVtLCBhZGRlZEl0ZW1zKTsKLQkJfQotCQl0aGlzLmZpcmVJdGVtc0FkZGVkKFZBTFVFUywgYWRkZWRJdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgc291cmNlIHRvIGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbAotCSAqIGFuZCBhZGQgaXRzIGl0ZW1zIHRvIG91ciBjYWNoZSBhbmQgdGhlICJjb2xsZWN0aW5nIHBhcmFtZXRlciIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tcG9uZW50U291cmNlKEUxIHNvdXJjZSwgTGlzdDxFMj4gYWRkZWRJdGVtcykgewotCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNID0gdGhpcy50cmFuc2Zvcm0oc291cmNlKTsKLQkJaWYgKHRoaXMuY29tcG9uZW50Q1ZNcy5wdXQoc291cmNlLCBjb21wb25lbnRDVk0pICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImR1cGxpY2F0ZSBjb21wb25lbnQ6ICIgKyBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY29tcG9uZW50Q1ZNLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihWQUxVRVMsIHRoaXMuY29tcG9uZW50Q1ZNTGlzdGVuZXIpOwotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PEUyPihjb21wb25lbnRDVk0uc2l6ZSgpKTsKLQkJaWYgKHRoaXMuY29sbGVjdGlvbnMucHV0KGNvbXBvbmVudENWTSwgY29tcG9uZW50Q29sbGVjdGlvbikgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZHVwbGljYXRlIGNvbGxlY3Rpb246ICIgKyBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5hZGRDb21wb25lbnRJdGVtcyhjb21wb25lbnRDVk0sIGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQlhZGRlZEl0ZW1zLmFkZEFsbChjb21wb25lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IENWTSB0byB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudAotCSAqIGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tcG9uZW50SXRlbXMoQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudENWTSwgQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uKSB7Ci0JCWludCBpdGVtc1NpemUgPSBjb21wb25lbnRDVk0uc2l6ZSgpOwotCQl0aGlzLnNpemUgKz0gaXRlbXNTaXplOwotCQljb21wb25lbnRDb2xsZWN0aW9uLmVuc3VyZUNhcGFjaXR5KGNvbXBvbmVudENvbGxlY3Rpb24uc2l6ZSgpICsgaXRlbXNTaXplKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChjb21wb25lbnRDb2xsZWN0aW9uLCBjb21wb25lbnRDVk0pOwotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSByZW1vdmVkOwotCSAqIHJlbW92ZSB0aGVpciBjb3JyZXNwb25kaW5nIGl0ZW1zIGZyb20gb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJQXJyYXlMaXN0PEUyPiByZW1vdmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPigpOwotCQlmb3IgKEUxIGl0ZW0gOiB0aGlzLmdldEl0ZW1zKGV2ZW50KSkgewotCQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2UoaXRlbSwgcmVtb3ZlZEl0ZW1zKTsKLQkJfQotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoVkFMVUVTLCByZW1vdmVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgaXRlbXMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIGZyb20gb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbXBvbmVudFNvdXJjZShFMSBzb3VyY2UsIExpc3Q8RTI+IHJlbW92ZWRJdGVtcykgewotCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNID0gdGhpcy5jb21wb25lbnRDVk1zLnJlbW92ZShzb3VyY2UpOwotCQlpZiAoY29tcG9uZW50Q1ZNID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1pc3NpbmcgY29tcG9uZW50OiAiICsgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNvbXBvbmVudENWTS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVkFMVUVTLCB0aGlzLmNvbXBvbmVudENWTUxpc3RlbmVyKTsKLQkJQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9ucy5yZW1vdmUoY29tcG9uZW50Q1ZNKTsKLQkJaWYgKGNvbXBvbmVudENvbGxlY3Rpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWlzc2luZyBjb2xsZWN0aW9uOiAiICsgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJlbW92ZWRJdGVtcy5hZGRBbGwoY29tcG9uZW50Q29sbGVjdGlvbik7Ci0JCXRoaXMucmVtb3ZlQ29tcG9uZW50SXRlbXMoY29tcG9uZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIG91ciBzaXplIGFuZCBjb2xsZWN0aW9uIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbXBvbmVudEl0ZW1zKEFycmF5TGlzdDxFMj4gY29tcG9uZW50Q29sbGVjdGlvbikgewotCQl0aGlzLnNpemUgLT0gY29tcG9uZW50Q29sbGVjdGlvbi5zaXplKCk7Ci0JCWNvbXBvbmVudENvbGxlY3Rpb24uY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29tcG9uZW50IHNvdXJjZXMgY2xlYXJlZDsKLQkgKiBjbGVhciBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVBbGxDb21wb25lbnRTb3VyY2VzKCk7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKFZBTFVFUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWxsQ29tcG9uZW50U291cmNlcygpIHsKLQkJLy8gY29weSB0aGUga2V5cyBzbyB3ZSBkb24ndCBlYXQgb3VyIG93biB0YWlsCi0JCUFycmF5TGlzdDxFMT4gY29weSA9IG5ldyBBcnJheUxpc3Q8RTE+KHRoaXMuY29tcG9uZW50Q1ZNcy5rZXlTZXQoKSk7Ci0JCWZvciAoRTEgc291cmNlIDogY29weSkgewotCQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2Uoc291cmNlLCBOdWxsTGlzdC48RTI+aW5zdGFuY2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29tcG9uZW50IHNvdXJjZXMgY2hhbmdlZDsKLQkgKiByZWJ1aWxkIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVBbGxDb21wb25lbnRTb3VyY2VzKCk7Ci0JCXRoaXMuYWRkQWxsQ29tcG9uZW50U291cmNlcygpOwotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuaXRlcmF0b3IoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbnRvIGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gdHJhbnNmb3JtKEUxIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyLnRyYW5zZm9ybSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBjb21wb25lbnQgY29sbGVjdGlvbnMgaGFkIGl0ZW1zIGFkZGVkOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50SXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJaW50IGl0ZW1zU2l6ZSA9IGV2ZW50LmdldEl0ZW1zU2l6ZSgpOwotCQl0aGlzLnNpemUgKz0gaXRlbXNTaXplOwotCi0JCUFycmF5TGlzdDxFMj4gY29tcG9uZW50Q29sbGVjdGlvbiA9IHRoaXMuY29sbGVjdGlvbnMuZ2V0KHRoaXMuY29tcG9uZW50Q1ZNKGV2ZW50KSk7Ci0JCWNvbXBvbmVudENvbGxlY3Rpb24uZW5zdXJlQ2FwYWNpdHkoY29tcG9uZW50Q29sbGVjdGlvbi5zaXplKCkgKyBpdGVtc1NpemUpOwotCi0JCXRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24odGhpcy5nZXRDb21wb25lbnRJdGVtcyhldmVudCksIGNvbXBvbmVudENvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBjb21wb25lbnQgY29sbGVjdGlvbnMgaGFkIGl0ZW1zIHJlbW92ZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc2l6ZSAtPSBldmVudC5nZXRJdGVtc1NpemUoKTsKLQkJQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9ucy5nZXQodGhpcy5jb21wb25lbnRDVk0oZXZlbnQpKTsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHRoaXMuZ2V0Q29tcG9uZW50SXRlbXMoZXZlbnQpLCBjb21wb25lbnRDb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb25zIHdhcyBjbGVhcmVkOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZXMgYnkgY2xlYXJpbmcgb3V0IHRoZSBhcHByb3ByaWF0ZQotCSAqIGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50Q29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9ucy5nZXQodGhpcy5jb21wb25lbnRDVk0oZXZlbnQpKTsKLQkJQXJyYXlMaXN0PEUyPiByZW1vdmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPihjb21wb25lbnRDb2xsZWN0aW9uKTsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRJdGVtcyhjb21wb25lbnRDb2xsZWN0aW9uKTsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKFZBTFVFUywgcmVtb3ZlZEl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9ucyBjaGFuZ2VkOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZXMgYnkgY2xlYXJpbmcgb3V0IHRoZSBhcHByb3ByaWF0ZQotCSAqIGNvbGxlY3Rpb24gYW5kIHRoZW4gcmVidWlsZGluZyBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRDb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudENWTSA9IHRoaXMuY29tcG9uZW50Q1ZNKGV2ZW50KTsKLQkJQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9ucy5nZXQoY29tcG9uZW50Q1ZNKTsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRJdGVtcyhjb21wb25lbnRDb2xsZWN0aW9uKTsKLQkJdGhpcy5hZGRDb21wb25lbnRJdGVtcyhjb21wb25lbnRDVk0sIGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuaXRlcmF0b3IoKSkpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RTI+IGdldENvbXBvbmVudEl0ZW1zKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEUyPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEUyPiBnZXRDb21wb25lbnRJdGVtcyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFMj4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNKENvbGxlY3Rpb25FdmVudCBldmVudCkgewotCQlyZXR1cm4gKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPikgZXZlbnQuZ2V0U291cmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ1NGEwMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IGFuZCB1c2VzIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotICogdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCB0byB5ZXQgYW5vdGhlcgotICoge0BsaW5rIExpc3RWYWx1ZU1vZGVsfS4gVGhpcyBjb21wb3NpdGUgbGlzdCBjb250YWlucwotICogdGhlIGNvbWJpbmVkIGl0ZW1zIGZyb20gYWxsIHRoZXNlIGNvbXBvbmVudCBsaXN0cy4KLSAqIDxwPgotICogVGVybWlub2xvZ3k6PHVsPgotICogPGxpPjxlbT5zb3VyY2VzPC9lbT4gLSB0aGUgaXRlbXMgaW4gdGhlIHdyYXBwZWQgbGlzdCB2YWx1ZSBtb2RlbDsgdGhlc2UKLSAqICAgIGFyZSBjb252ZXJ0ZWQgaW50byBjb21wb25lbnQgTFZNcyBieSB0aGUgdHJhbnNmb3JtZXIKLSAqIDxsaT48ZW0+Y29tcG9uZW50IExWTXM8L2VtPiAtIHRoZSBjb21wb25lbnQgbGlzdCB2YWx1ZSBtb2RlbHMgdGhhdCBhcmUgY29tYmluZWQKLSAqICAgIGJ5IHRoaXMgY29tcG9zaXRlIGxpc3QgdmFsdWUgbW9kZWwKLSAqIDxsaT48ZW0+aXRlbXM8L2VtPiAtIHRoZSBpdGVtcyBoZWxkIGJ5IHRoZSBjb21wb25lbnQgTFZNcwotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPEUxLCBFMj4KLQlleHRlbmRzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFMT4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEUyPgotewotCS8qKgotCSAqIFRoaXMgaXMgdGhlIChvcHRpb25hbCkgdXNlci1zdXBwbGllZCBvYmplY3QgdGhhdCB0cmFuc2Zvcm1zCi0JICogdGhlIGl0ZW1zIGluIHRoZSB3cmFwcGVkIGxpc3QgdG8gbGlzdCB2YWx1ZSBtb2RlbHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBUcmFuc2Zvcm1lcjxFMSwgTGlzdFZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcjsKLQotCS8qKgotCSAqIENhY2hlIG9mIHRoZSBzb3VyY2VzLCBjb21wb25lbnQgTFZNcywgbGlzdHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW5mbz4gaW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0PEluZm8+KCk7Ci0JcHJvdGVjdGVkIGNsYXNzIEluZm8gewotCQkvLyB0aGUgb2JqZWN0IHBhc3NlZCB0byB0aGUgdHJhbnNmb3JtZXIKLQkJZmluYWwgRTEgc291cmNlOwotCQkvLyB0aGUgbGlzdCB2YWx1ZSBtb2RlbCBnZW5lcmF0ZWQgYnkgdGhlIHRyYW5zZm9ybWVyCi0JCWZpbmFsIExpc3RWYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRMVk07Ci0JCS8vIGNhY2hlIG9mIHRoZSBpdGVtcyBoZWxkIGJ5IHRoZSBjb21wb25lbnQgTFZNCi0JCWZpbmFsIEFycmF5TGlzdDxFMj4gaXRlbXM7Ci0JCS8vIHRoZSBjb21wb25lbnQgTFZNJ3MgYmVnaW5uaW5nIGluZGV4IHdpdGhpbiB0aGUgY29tcG9zaXRlIExWTQotCQlpbnQgYmVnaW47Ci0JCXByb3RlY3RlZCBJbmZvKEUxIHNvdXJjZSwgTGlzdFZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudExWTSwgQXJyYXlMaXN0PEUyPiBpdGVtcywgaW50IGJlZ2luKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLmNvbXBvbmVudExWTSA9IGNvbXBvbmVudExWTTsKLQkJCXRoaXMuaXRlbXMgPSBpdGVtczsKLQkJCXRoaXMuYmVnaW4gPSBiZWdpbjsKLQkJfQotCX0KLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBjb21wb25lbnQgbGlzdCB2YWx1ZSBtb2RlbHMuICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgY29tcG9uZW50TFZNTGlzdGVuZXI7Ci0KLQkvKiogQ2FjaGUgdGhlIHNpemUgb2YgdGhlIGNvbXBvc2l0ZSBsaXN0LiAqLwotCXByaXZhdGUgaW50IHNpemU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGxpc3QgdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMobGlzdEhvbGRlciwgVHJhbnNmb3JtZXIuTnVsbC48RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlciwgVHJhbnNmb3JtZXI8RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQkJdGhpcy5jb21wb25lbnRMVk1MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb21wb25lbnRMVk1MaXN0ZW5lcigpOwotCQl0aGlzLnNpemUgPSAwOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogbGlzdC4gVXNlIHRoaXMgY29uc3RydWN0b3IgaWY8dWw+Ci0JICogPGxpPiB0aGUgd3JhcHBlZCBsaXN0IHZhbHVlIG1vZGVsIGFscmVhZHkgY29udGFpbnMgb3RoZXIKLQkgKiAgICAgICBsaXN0IHZhbHVlIG1vZGVscywgb3IKLQkgKiA8bGk+IHlvdSB3YW50IHRvIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtKEUxKX0KLQkgKiAgICAgICBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsKExpc3Q8PyBleHRlbmRzIEUxPiBsaXN0KSB7Ci0JCXRoaXMobmV3IFN0YXRpY0xpc3RWYWx1ZU1vZGVsPEUxPihsaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQsIHVuY2hhbmdpbmcsIHdyYXBwZWQKLQkgKiBsaXN0IGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwoTGlzdDw/IGV4dGVuZHMgRTE+IGxpc3QsIFRyYW5zZm9ybWVyPEUxLCBMaXN0VmFsdWVNb2RlbDxFMj4+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobmV3IFN0YXRpY0xpc3RWYWx1ZU1vZGVsPEUxPihsaXN0KSwgdHJhbnNmb3JtZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogbGlzdC4gVXNlIHRoaXMgY29uc3RydWN0b3IgaWY8dWw+Ci0JICogPGxpPiB0aGUgd3JhcHBlZCBsaXN0IHZhbHVlIG1vZGVsIGFscmVhZHkgY29udGFpbnMgb3RoZXIKLQkgKiAgICAgICBsaXN0IHZhbHVlIG1vZGVscywgb3IKLQkgKiA8bGk+IHlvdSB3YW50IHRvIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtKEUxKX0KLQkgKiAgICAgICBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsKEUxLi4uIGxpc3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8RTE+KGxpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCwgdW5jaGFuZ2luZywgd3JhcHBlZAotCSAqIGxpc3QgYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbChFMVtdIGxpc3QsIFRyYW5zZm9ybWVyPEUxLCBMaXN0VmFsdWVNb2RlbDxFMj4+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobmV3IFN0YXRpY0xpc3RWYWx1ZU1vZGVsPEUxPihsaXN0KSwgdHJhbnNmb3JtZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkQ29tcG9uZW50TFZNTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVMaXN0VmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudEl0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQkJCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50SXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50TGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRMaXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb21wb25lbnQgTFZNIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgRTIgZ2V0KGludCBpbmRleCkgewotCQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IHRoaXMuc2l6ZSkpIHsKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogIiArIHRoaXMuc2l6ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIGluZm8gbGlzdAotCQlmb3IgKGludCBpID0gdGhpcy5pbmZvTGlzdC5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoaSk7Ci0JCQlpZiAoaW5kZXggPj0gaW5mby5iZWdpbikgewotCQkJCXJldHVybiBpbmZvLml0ZW1zLmdldChpbmRleCAtIGluZm8uYmVnaW4pOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsgIC8vIHNvbWV0aGluZyBpcyB3YWNrCi0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFMj4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPEUyPih0aGlzLmJ1aWxkTGlzdHNJdGVyYXRvcnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxMaXN0SXRlcmF0b3I8RTI+PiBidWlsZExpc3RzSXRlcmF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPEluZm8sIExpc3RJdGVyYXRvcjxFMj4+KHRoaXMuaW5mb0xpc3QubGlzdEl0ZXJhdG9yKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFMj4gdHJhbnNmb3JtKEluZm8gaW5mbykgewotCQkJCXJldHVybiBpbmZvLml0ZW1zLmxpc3RJdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuYXJyYXkodGhpcy5saXN0SXRlcmF0b3IoKSwgdGhpcy5zaXplKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWxXcmFwcGVyIG92ZXJyaWRlcy9pbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3luY2ggb3VyIGNhY2hlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB3cmFwcGVkIGxpc3QsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMuYWRkQ29tcG9uZW50U291cmNlcygwLCB0aGlzLmxpc3RIb2xkZXIsIHRoaXMubGlzdEhvbGRlci5zaXplKCksIGZhbHNlKTsgIC8vIGZhbHNlID0gZG8gbm90IGZpcmUgZXZlbnQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvbXBvbmVudCBMVk1zLi4uCi0JCWZvciAoSW5mbyBpbmZvIDogdGhpcy5pbmZvTGlzdCkgewotCQkJaW5mby5jb21wb25lbnRMVk0ucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfVkFMVUVTLCB0aGlzLmNvbXBvbmVudExWTUxpc3RlbmVyKTsKLQkJfQotCQkvLyAuLi5hbmQgY2xlYXIgdGhlIGNhY2hlCi0JCXRoaXMuaW5mb0xpc3QuY2xlYXIoKTsKLQkJdGhpcy5zaXplID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBTb21lIGNvbXBvbmVudCBzb3VyY2VzIHdlcmUgYWRkZWQ7IHVwZGF0ZSBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2VzKGV2ZW50LmdldEluZGV4KCksIHRoaXMuZ2V0SXRlbXMoZXZlbnQpLCBldmVudC5nZXRJdGVtc1NpemUoKSwgdHJ1ZSk7ICAvLyB0cnVlID0gZmlyZSBldmVudAotCX0KLQotCS8qKgotCSAqIEFkZCBpbmZvcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgc291cmNlcyB0byBvdXIgY2FjaGUuCi0JICogRmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgcmVxdWVzdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbXBvbmVudFNvdXJjZXMoaW50IGFkZGVkU291cmNlc0luZGV4LCBJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGFkZGVkU291cmNlcywgaW50IGFkZGVkU291cmNlc1NpemUsIGJvb2xlYW4gZmlyZUV2ZW50KSB7Ci0JCUFycmF5TGlzdDxJbmZvPiBuZXdJbmZvTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW5mbz4oYWRkZWRTb3VyY2VzU2l6ZSk7Ci0JCS8vIHRoZSAnaXRlbXMnIGFyZSBlaXRoZXIgdGFja2VkIG9uIHRvIHRoZSBlbmQgb3IKLQkJLy8gYXQgdGhlICdiZWdpbicgaW5kZXggb2YgdGhlIGZpcnN0ICdpbmZvJyB0aGF0IGlzIGJlaW5nIHB1c2hlZCBiYWNrCi0JCWludCBuZXdJdGVtc0luZGV4ID0gKGFkZGVkU291cmNlc0luZGV4ID09IHRoaXMuaW5mb0xpc3Quc2l6ZSgpKSA/IHRoaXMuc2l6ZSA6IHRoaXMuaW5mb0xpc3QuZ2V0KGFkZGVkU291cmNlc0luZGV4KS5iZWdpbjsKLQotCQlpbnQgYmVnaW4gPSBuZXdJdGVtc0luZGV4OwotCQlmb3IgKEUxIHNvdXJjZSA6IGFkZGVkU291cmNlcykgewotCQkJTGlzdFZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudExWTSA9IHRoaXMudHJhbnNmb3JtKHNvdXJjZSk7Ci0JCQljb21wb25lbnRMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfVkFMVUVTLCB0aGlzLmNvbXBvbmVudExWTUxpc3RlbmVyKTsKLQkJCUFycmF5TGlzdDxFMj4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPihjb21wb25lbnRMVk0uc2l6ZSgpKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoaXRlbXMsIGNvbXBvbmVudExWTS5saXN0SXRlcmF0b3IoKSk7Ci0JCQluZXdJbmZvTGlzdC5hZGQobmV3IEluZm8oc291cmNlLCBjb21wb25lbnRMVk0sIGl0ZW1zLCBiZWdpbikpOwotCQkJYmVnaW4gKz0gaXRlbXMuc2l6ZSgpOwotCQl9Ci0JCXRoaXMuaW5mb0xpc3QuYWRkQWxsKGFkZGVkU291cmNlc0luZGV4LCBuZXdJbmZvTGlzdCk7Ci0JCWludCBuZXdJdGVtc1NpemUgPSBiZWdpbiAtIG5ld0l0ZW1zSW5kZXg7Ci0JCXRoaXMuc2l6ZSArPSBuZXdJdGVtc1NpemU7Ci0KLQkJLy8gYnVtcCB0aGUgJ2JlZ2luJyBpbmRleCBmb3IgYWxsIHRoZSBpbmZvcyB0aGF0IHdlcmUgcHVzaGVkIGJhY2sgYnkgdGhlIGluc2VydAotCQlpbnQgbW92ZWRJbmZvc0luZGV4ID0gYWRkZWRTb3VyY2VzSW5kZXggKyBhZGRlZFNvdXJjZXNTaXplOwotCQlmb3IgKGludCBpID0gbW92ZWRJbmZvc0luZGV4OyBpIDwgdGhpcy5pbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJdGhpcy5pbmZvTGlzdC5nZXQoaSkuYmVnaW4gKz0gbmV3SXRlbXNTaXplOwotCQl9Ci0KLQkJaWYgKGZpcmVFdmVudCkgewotCQkJQXJyYXlMaXN0PEUyPiBuZXdJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KG5ld0l0ZW1zU2l6ZSk7Ci0JCQlmb3IgKGludCBpID0gYWRkZWRTb3VyY2VzSW5kZXg7IGkgPCBtb3ZlZEluZm9zSW5kZXg7IGkrKykgewotCQkJCW5ld0l0ZW1zLmFkZEFsbCh0aGlzLmluZm9MaXN0LmdldChpKS5pdGVtcyk7Ci0JCQl9Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKExJU1RfVkFMVUVTLCBuZXdJdGVtc0luZGV4LCBuZXdJdGVtcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTb21lIGNvbXBvbmVudCBzb3VyY2VzIHdlcmUgcmVtb3ZlZDsgdXBkYXRlIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlQ29tcG9uZW50U291cmNlcyhldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJdGVtc1NpemUoKSwgdHJ1ZSk7ICAvLyB0cnVlID0gZmlyZSBldmVudAotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgaW5mb3MgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHNvdXJjZXMgZnJvbSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29tcG9uZW50U291cmNlcyhpbnQgcmVtb3ZlZFNvdXJjZXNJbmRleCwgaW50IHJlbW92ZWRTb3VyY2VzU2l6ZSwgYm9vbGVhbiBmaXJlRXZlbnQpIHsKLQkJaW50IHJlbW92ZWRJdGVtc0luZGV4ID0gdGhpcy5pbmZvTGlzdC5nZXQocmVtb3ZlZFNvdXJjZXNJbmRleCkuYmVnaW47Ci0JCWludCBtb3ZlZFNvdXJjZXNJbmRleCA9IHJlbW92ZWRTb3VyY2VzSW5kZXggKyByZW1vdmVkU291cmNlc1NpemU7Ci0JCWludCBtb3ZlZEl0ZW1zSW5kZXggPSAobW92ZWRTb3VyY2VzSW5kZXggPT0gdGhpcy5pbmZvTGlzdC5zaXplKCkpID8gdGhpcy5zaXplIDogdGhpcy5pbmZvTGlzdC5nZXQobW92ZWRTb3VyY2VzSW5kZXgpLmJlZ2luOwotCQlpbnQgcmVtb3ZlZEl0ZW1zU2l6ZSA9IG1vdmVkSXRlbXNJbmRleCAtIHJlbW92ZWRJdGVtc0luZGV4OwotCQl0aGlzLnNpemUgLT0gcmVtb3ZlZEl0ZW1zU2l6ZTsKLQotCQlMaXN0PEluZm8+IHN1Ykxpc3QgPSB0aGlzLmluZm9MaXN0LnN1Ykxpc3QocmVtb3ZlZFNvdXJjZXNJbmRleCwgcmVtb3ZlZFNvdXJjZXNJbmRleCArIHJlbW92ZWRTb3VyY2VzU2l6ZSk7Ci0JCUFycmF5TGlzdDxJbmZvPiByZW1vdmVkSW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0PEluZm8+KHN1Ykxpc3QpOyAgLy8gbWFrZSBhIGNvcHkKLQkJc3ViTGlzdC5jbGVhcigpOwotCi0JCS8vIGRlY3JlbWVudCB0aGUgJ2JlZ2luJyBpbmRleCBmb3IgYWxsIHRoZSBpbmZvcyB0aGF0IHdlcmUgbW92ZWQgZm9yd2FyZCBieSB0aGUgZGVsZXRlcwotCQlmb3IgKGludCBpID0gcmVtb3ZlZFNvdXJjZXNJbmRleDsgaSA8IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuaW5mb0xpc3QuZ2V0KGkpLmJlZ2luIC09IHJlbW92ZWRJdGVtc1NpemU7Ci0JCX0KLQotCQlmb3IgKEluZm8gcmVtb3ZlZEluZm8gOiByZW1vdmVkSW5mb0xpc3QpIHsKLQkJCXJlbW92ZWRJbmZvLmNvbXBvbmVudExWTS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9WQUxVRVMsIHRoaXMuY29tcG9uZW50TFZNTGlzdGVuZXIpOwotCQl9Ci0KLQkJaWYgKGZpcmVFdmVudCkgewotCQkJQXJyYXlMaXN0PEUyPiByZW1vdmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPihyZW1vdmVkSXRlbXNTaXplKTsKLQkJCWZvciAoSW5mbyByZW1vdmVkSW5mbyA6IHJlbW92ZWRJbmZvTGlzdCkgewotCQkJCXJlbW92ZWRJdGVtcy5hZGRBbGwocmVtb3ZlZEluZm8uaXRlbXMpOwotCQkJfQotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKExJU1RfVkFMVUVTLCByZW1vdmVkSXRlbXNJbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSByZXBsYWNlZDsgdXBkYXRlIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZXBsYWNlQ29tcG9uZW50U291cmNlcyhldmVudC5nZXRJbmRleCgpLCB0aGlzLmdldE5ld0l0ZW1zKGV2ZW50KSwgZXZlbnQuZ2V0SXRlbXNTaXplKCksIHRydWUpOyAgLy8gdHJ1ZSA9IGZpcmUgZXZlbnQKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlZCBjb21wb25lbnQgc291cmNlcyB3aWxsIG5vdCAodHlwaWNhbGx5KSBtYXAgdG8gYSBzZXQgb2YgcmVwbGFjZWQKLQkgKiBpdGVtcywgc28gd2UgcmVtb3ZlIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgbGlzdHMgb2YgaXRlbXMsIHJlc3VsdGluZyBpbgotCSAqIHR3byBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZUNvbXBvbmVudFNvdXJjZXMoaW50IHJlcGxhY2VkU291cmNlc0luZGV4LCBJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IG5ld1NvdXJjZXMsIGludCByZXBsYWNlZFNvdXJjZXNTaXplLCBib29sZWFuIGZpcmVFdmVudCkgewotCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZXMocmVwbGFjZWRTb3VyY2VzSW5kZXgsIHJlcGxhY2VkU291cmNlc1NpemUsIGZpcmVFdmVudCk7Ci0JCXRoaXMuYWRkQ29tcG9uZW50U291cmNlcyhyZXBsYWNlZFNvdXJjZXNJbmRleCwgbmV3U291cmNlcywgcmVwbGFjZWRTb3VyY2VzU2l6ZSwgZmlyZUV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBTb21lIGNvbXBvbmVudCBzb3VyY2VzIHdlcmUgbW92ZWQ7IHVwZGF0ZSBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW92ZUNvbXBvbmVudFNvdXJjZXMoZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0U291cmNlSW5kZXgoKSwgZXZlbnQuZ2V0TGVuZ3RoKCksIHRydWUpOyAgLy8gdHJ1ZSA9IGZpcmUgZXZlbnQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlQ29tcG9uZW50U291cmNlcyhpbnQgdGFyZ2V0U291cmNlc0luZGV4LCBpbnQgc291cmNlU291cmNlc0luZGV4LCBpbnQgbW92ZWRTb3VyY2VzTGVuZ3RoLCBib29sZWFuIGZpcmVFdmVudCkgewotCQlpbnQgc291cmNlSXRlbXNJbmRleCA9IHRoaXMuaW5mb0xpc3QuZ2V0KHNvdXJjZVNvdXJjZXNJbmRleCkuYmVnaW47Ci0KLQkJaW50IG5leHRTb3VyY2VTb3VyY2VJbmRleCA9IHNvdXJjZVNvdXJjZXNJbmRleCArIG1vdmVkU291cmNlc0xlbmd0aDsKLQkJaW50IG5leHRTb3VyY2VJdGVtSW5kZXggPSAobmV4dFNvdXJjZVNvdXJjZUluZGV4ID09IHRoaXMuaW5mb0xpc3Quc2l6ZSgpKSA/IHRoaXMuc2l6ZSA6IHRoaXMuaW5mb0xpc3QuZ2V0KG5leHRTb3VyY2VTb3VyY2VJbmRleCkuYmVnaW47Ci0JCWludCBtb3ZlSXRlbXNMZW5ndGggPSBuZXh0U291cmNlSXRlbUluZGV4IC0gc291cmNlSXRlbXNJbmRleDsKLQotCQlpbnQgdGFyZ2V0SXRlbXNJbmRleCA9IC0xOwotCQlpZiAoc291cmNlU291cmNlc0luZGV4ID4gdGFyZ2V0U291cmNlc0luZGV4KSB7Ci0JCQkvLyBtb3ZlIGZyb20gaGlnaCB0byBsb3cgaW5kZXgKLQkJCXRhcmdldEl0ZW1zSW5kZXggPSB0aGlzLmluZm9MaXN0LmdldCh0YXJnZXRTb3VyY2VzSW5kZXgpLmJlZ2luOwotCQl9IGVsc2UgewotCQkJLy8gbW92ZSBmcm9tIGxvdyB0byBoaWdoIGluZGV4IChoaWdoZXIgaXRlbXMgbW92ZSBkb3duIGR1cmluZyBtb3ZlKQotCQkJaW50IG5leHRUYXJnZXRTb3VyY2VJbmRleCA9IHRhcmdldFNvdXJjZXNJbmRleCArIG1vdmVkU291cmNlc0xlbmd0aDsKLQkJCXRhcmdldEl0ZW1zSW5kZXggPSAobmV4dFRhcmdldFNvdXJjZUluZGV4ID09IHRoaXMuaW5mb0xpc3Quc2l6ZSgpKSA/IHRoaXMuc2l6ZSA6IHRoaXMuaW5mb0xpc3QuZ2V0KG5leHRUYXJnZXRTb3VyY2VJbmRleCkuYmVnaW47Ci0JCQl0YXJnZXRJdGVtc0luZGV4ID0gdGFyZ2V0SXRlbXNJbmRleCAtIG1vdmVJdGVtc0xlbmd0aDsKLQkJfQotCi0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuaW5mb0xpc3QsIHRhcmdldFNvdXJjZXNJbmRleCwgc291cmNlU291cmNlc0luZGV4LCBtb3ZlZFNvdXJjZXNMZW5ndGgpOwotCi0JCS8vIHVwZGF0ZSB0aGUgJ2JlZ2luJyBpbmRleGVzIG9mIGFsbCB0aGUgYWZmZWN0ZWQgJ2luZm9zJwotCQlpbnQgbWluID0gTWF0aC5taW4odGFyZ2V0U291cmNlc0luZGV4LCBzb3VyY2VTb3VyY2VzSW5kZXgpOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgodGFyZ2V0U291cmNlc0luZGV4LCBzb3VyY2VTb3VyY2VzSW5kZXgpICsgbW92ZWRTb3VyY2VzTGVuZ3RoOwotCQlpbnQgYmVnaW4gPSBNYXRoLm1pbih0YXJnZXRJdGVtc0luZGV4LCBzb3VyY2VJdGVtc0luZGV4KTsKLQkJZm9yIChpbnQgaSA9IG1pbjsgaSA8IG1heDsgaSsrKSB7Ci0JCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChpKTsKLQkJCWluZm8uYmVnaW4gPSBiZWdpbjsKLQkJCWJlZ2luICs9IGluZm8uY29tcG9uZW50TFZNLnNpemUoKTsKLQkJfQotCi0JCWlmIChmaXJlRXZlbnQpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zTW92ZWQoTElTVF9WQUxVRVMsIHRhcmdldEl0ZW1zSW5kZXgsIHNvdXJjZUl0ZW1zSW5kZXgsIG1vdmVJdGVtc0xlbmd0aCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSBjbGVhcmVkOyBjbGVhciBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jbGVhckNvbXBvbmVudFNvdXJjZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckNvbXBvbmVudFNvdXJjZXMoKSB7Ci0JCXRoaXMucmVtb3ZlQ29tcG9uZW50U291cmNlcygwLCB0aGlzLmluZm9MaXN0LnNpemUoKSwgZmFsc2UpOyAgLy8gZmFsc2UgPSBkbyBub3QgZmlyZSBldmVudAotCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbXBvbmVudCBzb3VyY2VzIGNoYW5nZWQ7IHJlYnVpbGQgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQgbmV3U2l6ZSA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWlmIChuZXdTaXplID09IDApIHsKLQkJCXRoaXMuY2xlYXJDb21wb25lbnRTb3VyY2VzKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2xkU2l6ZSA9IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOwotCQlpZiAob2xkU2l6ZSA9PSAwKSB7Ci0JCQl0aGlzLmFkZENvbXBvbmVudFNvdXJjZXMoMCwgdGhpcy5saXN0SG9sZGVyLCBuZXdTaXplLCB0cnVlKTsgIC8vIHRydWUgPSBmaXJlIGV2ZW50Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgbWluID0gTWF0aC5taW4obmV3U2l6ZSwgb2xkU2l6ZSk7Ci0JCS8vIGhhbmRsZSByZXBsYWNlZCBzb3VyY2VzIGluZGl2aWR1YWxseSBzbyB3ZSBkb24ndCBmaXJlIGV2ZW50cyBmb3IgdW5jaGFuZ2VkIHNvdXJjZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaW47IGkrKykgewotCQkJRTEgbmV3U291cmNlID0gdGhpcy5saXN0SG9sZGVyLmdldChpKTsKLQkJCUUxIG9sZFNvdXJjZSA9IHRoaXMuaW5mb0xpc3QuZ2V0KGkpLnNvdXJjZTsKLQkJCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChuZXdTb3VyY2UsIG9sZFNvdXJjZSkpIHsKLQkJCQl0aGlzLnJlcGxhY2VDb21wb25lbnRTb3VyY2VzKGksIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RTE+KG5ld1NvdXJjZSksIDEsIHRydWUpOyAgLy8gdHJ1ZSA9IGZpcmUgZXZlbnQKLQkJCX0KLQkJfQotCi0JCWlmIChuZXdTaXplID09IG9sZFNpemUpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChuZXdTaXplIDwgb2xkU2l6ZSkgewotCQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2VzKG1pbiwgb2xkU2l6ZSAtIG5ld1NpemUsIHRydWUpOyAgLy8gdHJ1ZSA9IGZpcmUgZXZlbnQKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG5ld1NpemUgPiBvbGRTaXplCi0JCXRoaXMuYWRkQ29tcG9uZW50U291cmNlcyhtaW4sIHRoaXMuYnVpbGRTdWJMaXN0SG9sZGVyKG1pbiksIG5ld1NpemUgLSBvbGRTaXplLCB0cnVlKTsgIC8vIHRydWUgPSBmaXJlIGV2ZW50Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gYnVpbGRTdWJMaXN0SG9sZGVyKGludCBmcm9tSW5kZXgpIHsKLQkJaW50IGxpc3RIb2xkZXJTaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlciwgbGlzdEhvbGRlclNpemUpLnN1Ykxpc3QoZnJvbUluZGV4LCBsaXN0SG9sZGVyU2l6ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gYnVpbGRTdWJMaXN0SG9sZGVyKGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCWludCBsaXN0SG9sZGVyU2l6ZSA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCXJldHVybiAoKGZyb21JbmRleCA9PSAwKSAmJiAodG9JbmRleCA9PSBsaXN0SG9sZGVyU2l6ZSkpID8KLQkJCQl0aGlzLmxpc3RIb2xkZXIgOgotCQkJCUNvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlciwgbGlzdEhvbGRlclNpemUpLnN1Ykxpc3QoZnJvbUluZGV4LCB0b0luZGV4KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gYSBsaXN0IHZhbHVlIG1vZGVsLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPEUyPiB0cmFuc2Zvcm0oRTEgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IExWTS4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGluZGV4T2YoTGlzdFZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudExWTSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWlmICh0aGlzLmluZm9MaXN0LmdldChpKS5jb21wb25lbnRMVk0gPT0gY29tcG9uZW50TFZNKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBjb21wb25lbnQgTFZNOiAiICsgY29tcG9uZW50TFZNKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBldmVudCdzIGNvbXBvbmVudCBMVk0uCi0JICovCi0JcHJvdGVjdGVkIGludCBpbmRleEZvcihMaXN0RXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXhPZih0aGlzLmdldENvbXBvbmVudExWTShldmVudCkpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gb25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHM7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCWludCBjb21wb25lbnRMVk1JbmRleCA9IHRoaXMuaW5kZXhGb3IoZXZlbnQpOwotCQl0aGlzLmFkZENvbXBvbmVudEl0ZW1zKGNvbXBvbmVudExWTUluZGV4LCB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCksIGV2ZW50LmdldEluZGV4KCksIHRoaXMuZ2V0Q29tcG9uZW50SXRlbXMoZXZlbnQpLCBldmVudC5nZXRJdGVtc1NpemUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tcG9uZW50SXRlbXMoaW50IGNvbXBvbmVudExWTUluZGV4LCBJbmZvIGluZm8sIGludCBhZGRlZEl0ZW1zSW5kZXgsIEl0ZXJhYmxlPEUyPiBhZGRlZEl0ZW1zLCBpbnQgYWRkZWRJdGVtc1NpemUpIHsKLQkJLy8gdXBkYXRlIHRoZSBhZmZlY3RlZCAnYmVnaW4nIGluZGljZXMKLQkJZm9yIChpbnQgaSA9IGNvbXBvbmVudExWTUluZGV4ICsgMTsgaSA8IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuaW5mb0xpc3QuZ2V0KGkpLmJlZ2luICs9IGFkZGVkSXRlbXNTaXplOwotCQl9Ci0JCXRoaXMuc2l6ZSArPSBhZGRlZEl0ZW1zU2l6ZTsKLQotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY2FjaGVkIGxpc3QKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChpbmZvLml0ZW1zLCBhZGRlZEl0ZW1zSW5kZXgsIGFkZGVkSXRlbXMsIGFkZGVkSXRlbXNTaXplKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoTElTVF9WQUxVRVMsIGluZm8uYmVnaW4gKyBhZGRlZEl0ZW1zSW5kZXgsIGluZm8uaXRlbXMuc3ViTGlzdChhZGRlZEl0ZW1zSW5kZXgsIGFkZGVkSXRlbXNJbmRleCArIGFkZGVkSXRlbXNTaXplKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gb25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHM7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdXBkYXRlIHRoZSBhZmZlY3RlZCAnYmVnaW4nIGluZGljZXMKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCWludCByZW1vdmVkSXRlbXNTaXplID0gZXZlbnQuZ2V0SXRlbXNTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBjb21wb25lbnRMVk1JbmRleCArIDE7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiAtPSByZW1vdmVkSXRlbXNTaXplOwotCQl9Ci0JCXRoaXMuc2l6ZSAtPSByZW1vdmVkSXRlbXNTaXplOwotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCk7Ci0JCWludCBpdGVtSW5kZXggPSBldmVudC5nZXRJbmRleCgpOwotCQlpbmZvLml0ZW1zLnN1Ykxpc3QoaXRlbUluZGV4LCBpdGVtSW5kZXggKyBldmVudC5nZXRJdGVtc1NpemUoKSkuY2xlYXIoKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUywgaW5mby5iZWdpbikpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gb25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHM7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkvLyBubyBjaGFuZ2VzIHRvIHRoZSAnYmVnaW4nIGluZGljZXMgb3Igc2l6ZQotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlpbnQgY29tcG9uZW50TFZNSW5kZXggPSB0aGlzLmluZGV4Rm9yKGV2ZW50KTsKLQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoY29tcG9uZW50TFZNSW5kZXgpOwotCQlpbnQgaSA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWZvciAoRTIgaXRlbSA6IHRoaXMuZ2V0Q29tcG9uZW50SXRlbXMoZXZlbnQpKSB7Ci0JCQlpbmZvLml0ZW1zLnNldChpKyssIGl0ZW0pOwotCQl9Ci0KLQkJLy8gdHJhbnNsYXRlIHRoZSBldmVudAotCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiBvbmUgb2YgdGhlIGNvbXBvbmVudCBsaXN0czsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50SXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIG5vIGNoYW5nZXMgdG8gdGhlICdiZWdpbicgaW5kaWNlcyBvciBzaXplCi0KLQkJLy8gc3luY2hyb25pemUgdGhlIGNhY2hlZCBsaXN0Ci0JCWludCBjb21wb25lbnRMVk1JbmRleCA9IHRoaXMuaW5kZXhGb3IoZXZlbnQpOwotCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKGluZm8uaXRlbXMsIGV2ZW50LmdldFRhcmdldEluZGV4KCksIGV2ZW50LmdldFNvdXJjZUluZGV4KCksIGV2ZW50LmdldExlbmd0aCgpKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMsIGluZm8uYmVnaW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIGNvbXBvbmVudCBsaXN0cyB3YXMgY2xlYXJlZDsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50TGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCXRoaXMuY2xlYXJDb21wb25lbnRMaXN0KGNvbXBvbmVudExWTUluZGV4LCB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyQ29tcG9uZW50TGlzdChpbnQgY29tcG9uZW50TFZNSW5kZXgsIEluZm8gaW5mbykgewotCQkvLyB1cGRhdGUgdGhlIGFmZmVjdGVkICdiZWdpbicgaW5kaWNlcwotCQlpbnQgcmVtb3ZlZEl0ZW1zU2l6ZSA9IGluZm8uaXRlbXMuc2l6ZSgpOwotCQlpZiAocmVtb3ZlZEl0ZW1zU2l6ZSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKGludCBpID0gY29tcG9uZW50TFZNSW5kZXggKyAxOyBpIDwgdGhpcy5pbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJdGhpcy5pbmZvTGlzdC5nZXQoaSkuYmVnaW4gLT0gcmVtb3ZlZEl0ZW1zU2l6ZTsKLQkJfQotCQl0aGlzLnNpemUgLT0gcmVtb3ZlZEl0ZW1zU2l6ZTsKLQotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY2FjaGVkIGxpc3QKLQkJQXJyYXlMaXN0PEUyPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KGluZm8uaXRlbXMpOyAgLy8gbWFrZSBhIGNvcHkKLQkJaW5mby5pdGVtcy5jbGVhcigpOwotCi0JCS8vIHRyYW5zbGF0ZSB0aGUgZXZlbnQKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luLCBpdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHMgY2hhbmdlZDsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGUgYnkgc3luY2hyb25pemluZyB0aGUgYXBwcm9wcmlhdGUKLQkgKiBsaXN0IGFuZCBmaXJpbmcgdGhlIGFwcHJvcHJpYXRlIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRMaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCUluZm8gaW5mbyA9IHRoaXMuaW5mb0xpc3QuZ2V0KGNvbXBvbmVudExWTUluZGV4KTsKLQotCQlpbnQgbmV3SXRlbXNTaXplID0gaW5mby5jb21wb25lbnRMVk0uc2l6ZSgpOwotCQlpZiAobmV3SXRlbXNTaXplID09IDApIHsKLQkJCXRoaXMuY2xlYXJDb21wb25lbnRMaXN0KGNvbXBvbmVudExWTUluZGV4LCBpbmZvKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvbGRJdGVtc1NpemUgPSBpbmZvLml0ZW1zLnNpemUoKTsKLQkJaWYgKG9sZEl0ZW1zU2l6ZSA9PSAwKSB7Ci0JCQl0aGlzLmFkZENvbXBvbmVudEl0ZW1zKGNvbXBvbmVudExWTUluZGV4LCBpbmZvLCAwLCBpbmZvLmNvbXBvbmVudExWTSwgbmV3SXRlbXNTaXplKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBtaW4gPSBNYXRoLm1pbihuZXdJdGVtc1NpemUsIG9sZEl0ZW1zU2l6ZSk7Ci0JCS8vIGhhbmRsZSByZXBsYWNlZCBpdGVtcyBpbmRpdmlkdWFsbHkgc28gd2UgZG9uJ3QgZmlyZSBldmVudHMgZm9yIHVuY2hhbmdlZCBpdGVtcwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1pbjsgaSsrKSB7Ci0JCQlFMiBuZXdJdGVtID0gaW5mby5jb21wb25lbnRMVk0uZ2V0KGkpOwotCQkJRTIgb2xkSXRlbSA9IGluZm8uaXRlbXMuc2V0KGksIG5ld0l0ZW0pOwotCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkKExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luICsgaSwgbmV3SXRlbSwgb2xkSXRlbSk7Ci0JCX0KLQotCQlpbnQgZGVsdGEgPSBuZXdJdGVtc1NpemUgLSBvbGRJdGVtc1NpemU7Ci0JCWlmIChkZWx0YSA9PSAwKSB7ICAvLyBuZXdJdGVtc1NpemUgPT0gb2xkSXRlbXNTaXplCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKGludCBpID0gY29tcG9uZW50TFZNSW5kZXggKyAxOyBpIDwgdGhpcy5pbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJdGhpcy5pbmZvTGlzdC5nZXQoaSkuYmVnaW4gKz0gZGVsdGE7Ci0JCX0KLQkJdGhpcy5zaXplICs9IGRlbHRhOwotCi0JCWlmIChkZWx0YSA8IDApIHsgIC8vIG5ld0l0ZW1zU2l6ZSA8IG9sZEl0ZW1zU2l6ZQotCQkJTGlzdDxFMj4gc3ViTGlzdCA9IGluZm8uaXRlbXMuc3ViTGlzdChuZXdJdGVtc1NpemUsIG9sZEl0ZW1zU2l6ZSk7Ci0JCQlBcnJheUxpc3Q8RTI+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KHN1Ykxpc3QpOyAgLy8gbWFrZSBhIGNvcHkKLQkJCXN1Ykxpc3QuY2xlYXIoKTsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChMSVNUX1ZBTFVFUywgaW5mby5iZWdpbiArIG5ld0l0ZW1zU2l6ZSwgcmVtb3ZlZEl0ZW1zKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG5ld0l0ZW1zU2l6ZSA+IG9sZEl0ZW1zU2l6ZQotCQlBcnJheUxpc3Q8RTI+IGFkZGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPihkZWx0YSk7Ci0JCWZvciAoaW50IGkgPSBvbGRJdGVtc1NpemU7IGkgPCBuZXdJdGVtc1NpemU7IGkrKykgewotCQkJYWRkZWRJdGVtcy5hZGQoaW5mby5jb21wb25lbnRMVk0uZ2V0KGkpKTsKLQkJfQotCQlpbmZvLml0ZW1zLmFkZEFsbChhZGRlZEl0ZW1zKTsKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChMSVNUX1ZBTFVFUywgaW5mby5iZWdpbiArIG9sZEl0ZW1zU2l6ZSwgYWRkZWRJdGVtcyk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFMj4gZ2V0Q29tcG9uZW50SXRlbXMoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RTI+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RTI+IGdldENvbXBvbmVudEl0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFMj4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxFMj4gZ2V0Q29tcG9uZW50TFZNKExpc3RFdmVudCBldmVudCkgewotCQlyZXR1cm4gKExpc3RWYWx1ZU1vZGVsPEUyPikgZXZlbnQuZ2V0U291cmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0OTUwMGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5JZGVudGl0eUhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gYWRhcHRzIGEKLSAqIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0gaG9sZGluZyBvdGhlciB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfXMKLSAqIHRvIGEgc2luZ2xlIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9LgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Ojx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWUoKX08cD4KLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjb21wb25lbnQgdmFsdWVzCi0gKiA8L3VsPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIHdyYXBwZWQgY29sbGVjdGlvbiBtdXN0IG5vdCBjb250YWluIGFueSBkdXBsaWNhdGVzCi0gKiBvciB0aGlzIGNsYXNzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci0JZXh0ZW5kcyBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxWPgotewotCS8qKgotCSAqIENhY2hlIHRoZSBjb21wb25lbnQgcHJvcGVydHkgdmFsdWUgbW9kZWxzIHNvIHdlIGNhbiBzdG9wIGxpc3RlbmluZyB0bwotCSAqIHRoZW0gd2hlbiB0aGV5IGFyZSByZW1vdmVkIGZyb20gdGhlIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElkZW50aXR5SGFzaEJhZzxQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+IGNvbXBvbmVudFBWTXMgPSAKLQkJCW5ldyBJZGVudGl0eUhhc2hCYWc8UHJvcGVydHlWYWx1ZU1vZGVsPD8+PigpOwotCi0JLyoqCi0JICogTGlzdGVuIHRvIGV2ZXJ5IHByb3BlcnR5IHZhbHVlIG1vZGVsIGluIHRoZSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqIElmIG9uZSBjaGFuZ2VzLCB3ZSBuZWVkIHRvIHJlLWNhbGN1bGF0ZSBvdXIgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWxzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8+Li4uIGNvbGxlY3Rpb24pIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KGNvbGxlY3Rpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMuCi0JICovCi0JcHVibGljIDxFIGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PiBDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWwoQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMobmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+KGNvbGxlY3Rpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJc3VwZXIoY29sbGVjdGlvbk1vZGVsKTsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbC50aGlzLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZSBldmVudCBjYW4gYmUgdXNlZCB0byBpbXByb3ZlCi0JICogdGhlIHBlcmZvcm1hbmNlIG9mIGJ1aWxkaW5nIGEgbmV3IHZhbHVlIChlLmcuIHNvbWUgcHJvcGVydHkgY2hhbmdlcyBtYXkKLQkgKiBub3QgbmVjZXNzaXRhdGUgdGhlIHJlLWNhbGN1bGF0aW9uIG9mIHRoZSB2YWx1ZSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbF8oKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsXygpOwotCQl0aGlzLmFkZENvbXBvbmVudFBWTXModGhpcy5nZXRDb2xsZWN0aW9uTW9kZWwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFIGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PiB2b2lkIGFkZENvbXBvbmVudFBWTXMoSXRlcmFibGU8RT4gcHZtcykgewotCQlmb3IgKFByb3BlcnR5VmFsdWVNb2RlbDw/PiBlYWNoIDogcHZtcykgewotCQkJdGhpcy5jb21wb25lbnRQVk1zLmFkZChlYWNoKTsKLQkJCWVhY2guYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihWQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRQVk1zKHRoaXMuZ2V0Q29sbGVjdGlvbk1vZGVsKCkpOwotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbF8oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEUgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+IHZvaWQgcmVtb3ZlQ29tcG9uZW50UFZNcyhJdGVyYWJsZTxFPiBwdm1zKSB7Ci0JCWZvciAoUHJvcGVydHlWYWx1ZU1vZGVsPD8+IGVhY2ggOiBwdm1zKSB7Ci0JCQllYWNoLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl0aGlzLmNvbXBvbmVudFBWTXMucmVtb3ZlKGVhY2gpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5hZGRDb21wb25lbnRQVk1zKHRoaXMuZ2V0SXRlbXMoZXZlbnQpKTsKLQkJc3VwZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUNvbXBvbmVudFBWTXModGhpcy5nZXRJdGVtcyhldmVudCkpOwotCQlzdXBlci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlQWxsQ29tcG9uZW50UFZNcygpOwotCQlzdXBlci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWxsQ29tcG9uZW50UFZNcygpIHsKLQkJLy8gY29weSB0aGUgbGlzdCBzbyB3ZSBkb24ndCBlYXQgb3VyIG93biB0YWlsCi0JCUFycmF5TGlzdDxQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+IGNvcHkgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5VmFsdWVNb2RlbDw/Pj4odGhpcy5jb21wb25lbnRQVk1zKTsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRQVk1zKGNvcHkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUFsbENvbXBvbmVudFBWTXMoKTsKLQkJdGhpcy5hZGRDb21wb25lbnRQVk1zKHRoaXMuZ2V0Q29sbGVjdGlvbk1vZGVsKCkpOwotCQlzdXBlci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9yIGFjY2VwdHMgb25seSBhIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH17QGNvZGU8PyBleHRlbmRzIH17QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfXtAY29kZTw/Pj59LgotCSAqLwotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDw/Pj4gZ2V0Q29sbGVjdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+KSB0aGlzLmNvbGxlY3Rpb25Nb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGEge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfXtAY29kZTw/IGV4dGVuZHMgfXtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9e0Bjb2RlPD8+Pn0uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+IGdldEl0ZW1zKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvciBhY2NlcHRzIG9ubHkgYSB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9e0Bjb2RlPD8gZXh0ZW5kcyB9e0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH17QGNvZGU8Pz4+fS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDw/Pj4gZ2V0SXRlbXMoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDw/Pj4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzA4MTQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIHdyYXBwZXIgZXh0ZW5kcyBhIHtAbGluayBMaXN0VmFsdWVNb2RlbH0gKG9yIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0pCi0gKiB3aXRoIGZpeGVkIGNvbGxlY3Rpb25zIG9mIGl0ZW1zIG9uIGVpdGhlciBlbmQuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IEJlIGNhcmVmdWwgdXNpbmcgb3Igd3JhcHBpbmcgdGhpcyBsaXN0IHZhbHVlIG1vZGVsLCBzaW5jZSB0aGUKLSAqICJleHRlbmRlZCIgaXRlbXMgbWF5IGJlIHVuZXhwZWN0ZWQgYnkgdGhlIGNsaWVudCBjb2RlIG9yIHdyYXBwZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWV4dGVuZHMgTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKiB0aGUgaXRlbXMgInByZXBlbmRlZCIgdG8gdGhlIHdyYXBwZWQgbGlzdCAqLwotCXByb3RlY3RlZCBMaXN0PEU+IHByZWZpeDsKLQotCS8qKiB0aGUgaXRlbXMgImFwcGVuZGVkIiB0byB0aGUgd3JhcHBlZCBsaXN0ICovCi0JcHJvdGVjdGVkIExpc3Q8RT4gc3VmZml4OwotCi0KLQkvLyAqKioqKioqKioqIGxvdHMgbycgY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHByZWZpeCBhbmQgc3VmZml4LgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0PD8gZXh0ZW5kcyBFPiBwcmVmaXgsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBMaXN0PD8gZXh0ZW5kcyBFPiBzdWZmaXgpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gbmV3IEFycmF5TGlzdDxFPihwcmVmaXgpOwotCQl0aGlzLnN1ZmZpeCA9IG5ldyBBcnJheUxpc3Q8RT4oc3VmZml4KTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdGhlIHNwZWNpZmllZCBsaXN0IHdpdGggYSBwcmVmaXggYW5kIHN1ZmZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoRSBwcmVmaXgsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBFIHN1ZmZpeCkgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHByZWZpeCk7Ci0JCXRoaXMuc3VmZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzdWZmaXgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdDw/IGV4dGVuZHMgRT4gcHJlZml4LCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBuZXcgQXJyYXlMaXN0PEU+KHByZWZpeCk7Ci0JCXRoaXMuc3VmZml4ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRoZSBzcGVjaWZpZWQgbGlzdCB3aXRoIGEgcHJlZml4LgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihFIHByZWZpeCwgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwcmVmaXgpOwotCQl0aGlzLnN1ZmZpeCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHN1ZmZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIsIExpc3Q8PyBleHRlbmRzIEU+IHN1ZmZpeCkgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJdGhpcy5zdWZmaXggPSBuZXcgQXJyYXlMaXN0PEU+KHN1ZmZpeCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRoZSBzcGVjaWZpZWQgbGlzdCB3aXRoIGEgc3VmZml4LgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlciwgRSBzdWZmaXgpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCXRoaXMuc3VmZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzdWZmaXgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHByZWZpeCBjb250YWluaW5nIGEgc2luZ2xlIG51bGwgaXRlbS4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChudWxsKTsKLQkJdGhpcy5zdWZmaXggPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3RJdGVyYXRvcl8oKSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3JfKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+KAotCQkJdGhpcy5wcmVmaXgubGlzdEl0ZXJhdG9yKCksCi0JCQl0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCksCi0JCQl0aGlzLnN1ZmZpeC5saXN0SXRlcmF0b3IoKQotCQkpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJaW50IHByZWZpeFNpemUgPSB0aGlzLnByZWZpeC5zaXplKCk7Ci0JCWlmIChpbmRleCA8IHByZWZpeFNpemUpIHsKLQkJCXJldHVybiB0aGlzLnByZWZpeC5nZXQoaW5kZXgpOwotCQl9IGVsc2UgaWYgKGluZGV4ID49IHByZWZpeFNpemUgKyB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWZmaXguZ2V0KGluZGV4IC0gKHByZWZpeFNpemUgKyB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmdldChpbmRleCAtIHByZWZpeFNpemUpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5wcmVmaXguc2l6ZSgpICsgdGhpcy5saXN0SG9sZGVyLnNpemUoKSArIHRoaXMuc3VmZml4LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJQXJyYXlMaXN0PEU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEU+KHRoaXMuc2l6ZSgpKTsKLQkJbGlzdC5hZGRBbGwodGhpcy5wcmVmaXgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLQkJbGlzdC5hZGRBbGwodGhpcy5zdWZmaXgpOwotCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsV3JhcHBlciBpbXBsZW1lbnRhdGlvbi9vdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUywgdGhpcy5wcmVmaXguc2l6ZSgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMsIHRoaXMucHJlZml4LnNpemUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTLCB0aGlzLnByZWZpeC5zaXplKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNNb3ZlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUywgdGhpcy5wcmVmaXguc2l6ZSgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0KCkpOyAgLy8gbm90ICJjbGVhcmVkIgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldFByZWZpeChMaXN0PEU+IHByZWZpeCkgewotCQl0aGlzLnByZWZpeCA9IHByZWZpeDsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN1ZmZpeChMaXN0PEU+IHN1ZmZpeCkgewotCQl0aGlzLnN1ZmZpeCA9IHN1ZmZpeDsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxFPiBidWlsZExpc3QoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RJdGVyYXRvcl8oKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2EyODg0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+RmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgRmlsdGVyfQotICogdG8gZGV0ZXJtaW5lIHdoaWNoIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uIGFyZSByZXR1cm5lZCBieSBjYWxscwotICogdG8ge0BsaW5rICNpdGVyYXRvcigpfS4KLSAqIDxwPgotICogVGhlIGZpbHRlciBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZTsgYWxsb3dpbmcgdGhlIHNhbWUKLSAqIGFkYXB0ZXIgdG8gYmUgdXNlZCB3aXRoIGRpZmZlcmVudCBmaWx0ZXIgY3JpdGVyaWEgKGUuZy4gd2hlbiB0aGUgdXNlcgotICogd2FudHMgdG8gdmlldyBhIGxpc3Qgb2YgPGNvZGU+LmphdmE8L2NvZGU+IGZpbGVzKS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gSWYgdGhlIG9iamVjdHMgaW4gdGhlICJmaWx0ZXJlZCIgY29sbGVjdGlvbiBjYW4gY2hhbmdlIGluIHN1Y2ggYSB3YXkKLSAqIHRoYXQgdGhleSBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSAiZmlsdGVyZWQiIGNvbGxlY3Rpb24sIHlvdSB3aWxsCi0gKiBuZWVkIHRvIHdyYXAgdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gaW4gYW4ge0BsaW5rIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9LgotICogRm9yIGV4YW1wbGUsIGlmIHRoZSBmaWx0ZXIgb25seSAiYWNjZXB0cyIgaXRlbXMgd2hvc2UgbmFtZXMgYmVnaW4KLSAqIHdpdGggIlgiIGFuZCB0aGUgbmFtZXMgb2YgdGhlIGl0ZW1zIGNhbiBjaGFuZ2UsIHlvdSB3aWxsIG5lZWQgdG8KLSAqIHdyYXAgdGhlIG9yaWdpbmFsIGxpc3Qgb2YgdW5maWx0ZXJlZCBpdGVtcyB3aXRoIGFuCi0gKiB7QGxpbmsgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSB0aGF0IGxpc3RlbnMgZm9yIGNoYW5nZXMgdG8gZWFjaAotICogaXRlbSdzIG5hbWUgYW5kIGZpcmVzIHRoZSBhcHByb3ByaWF0ZSBldmVudCB3aGVuZXZlciBhbiBpdGVtJ3MgbmFtZQotICogY2hhbmdlcy4gVGhlIGV2ZW50IHdpbGwgY2F1c2UgdGhpcyB3cmFwcGVyIHRvIHJlLWZpbHRlciB0aGUgY2hhbmdlZAotICogaXRlbSBhbmQgYWRkIG9yIHJlbW92ZSBpdCBmcm9tIHRoZSAiZmlsdGVyZWQiIGNvbGxlY3Rpb24gYXMgYXBwcm9wcmlhdGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGlzIGZpbHRlcnMgdGhlIGl0ZW1zIGluIHRoZSBuZXN0ZWQgY29sbGVjdGlvbi4gKi8KLQlwcml2YXRlIEZpbHRlcjxFPiBmaWx0ZXI7Ci0KLQkvKiogQ2FjaGUgdGhlIGl0ZW1zIHRoYXQgd2VyZSBhY2NlcHRlZCBieSB0aGUgZmlsdGVyICovCi0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPEU+IGZpbHRlcmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEU+KCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCBhIGZpbHRlciB0aGF0IHNpbXBseSBhY2NlcHRzIGV2ZXJ5IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcyhjb2xsZWN0aW9uSG9sZGVyLCBGaWx0ZXIuTnVsbC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgZmlsdGVyLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlciwgRmlsdGVyPEU+IGZpbHRlcikgewotCQlzdXBlcihjb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGxpc3QgdmFsdWUgbW9kZWwgYW5kIGEgZmlsdGVyIHRoYXQgc2ltcGx5IGFjY2VwdHMgZXZlcnkgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMobmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4obGlzdEhvbGRlcikpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCBmaWx0ZXIuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsIEZpbHRlcjxFPiBmaWx0ZXIpIHsKLQkJdGhpcyhuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFPihsaXN0SG9sZGVyKSwgZmlsdGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5maWx0ZXJlZEl0ZW1zKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmZpbHRlcmVkSXRlbXMuc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXIgb3ZlcnJpZGVzL2ltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jaCBvdXIgY2FjaGUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG5lc3RlZCBjb2xsZWN0aW9uLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuZmlsdGVyZWRJdGVtcywgdGhpcy5maWx0ZXIodGhpcy5jb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCS8vIGNsZWFyIG91dCB0aGUgY2FjaGUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgbmVzdGVkIGNvbGxlY3Rpb24KLQkJdGhpcy5maWx0ZXJlZEl0ZW1zLmNsZWFyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gZmlsdGVyIHRoZSB2YWx1ZXMgYmVmb3JlIHByb3BhZ2F0aW5nIHRoZSBjaGFuZ2UgZXZlbnQKLQkJdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbih0aGlzLmZpbHRlcih0aGlzLmdldEl0ZW1zKGV2ZW50KSksIHRoaXMuZmlsdGVyZWRJdGVtcywgVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvICpub3QqIGZpbHRlciB0aGUgdmFsdWVzLCBiZWNhdXNlIHRoZXkgbWF5IG5vIGxvbmdlciBiZQotCQkvLyAiYWNjZXB0ZWQiIGFuZCB0aGF0IG1pZ2h0IGJlIHdoeSB0aGV5IHdlcmUgcmVtb3ZlZCBpbiB0aGUgZmlyc3QgcGxhY2U7Ci0JCS8vIGFueXdheSwgYW55IGV4dHJhbmVvdXMgaXRlbXMgYXJlIGhhcm1sZXNzCi0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihldmVudC5nZXRJdGVtcygpLCB0aGlzLmZpbHRlcmVkSXRlbXMsIFZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5maWx0ZXJlZEl0ZW1zLCBWQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnJlYnVpbGRGaWx0ZXJlZEl0ZW1zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2NlbGxhbmVvdXMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ2hhbmdlIHRoZSBmaWx0ZXIgYW5kIHJlYnVpbGQgdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKEZpbHRlcjxFPiBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMucmVidWlsZEZpbHRlcmVkSXRlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmFibGUgdGhhdCBmaWx0ZXJzIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGZpbHRlcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlbXMpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxFPihpdGVtcywgdGhpcy5maWx0ZXIpOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIG91ciBjYWNoZSB3aXRoIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVidWlsZEZpbHRlcmVkSXRlbXMoKSB7Ci0JCXRoaXMuZmlsdGVyZWRJdGVtcy5jbGVhcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuZmlsdGVyZWRJdGVtcywgdGhpcy5maWx0ZXIodGhpcy5jb2xsZWN0aW9uSG9sZGVyKSk7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgdGhpcy5maWx0ZXJlZEl0ZW1zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmZpbHRlcmVkSXRlbXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTIwMWQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+RmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSBhbmQgdXNlcyBhIHtAbGluayBGaWx0ZXJ9Ci0gKiB0byBkZXRlcm1pbmUgd2hlbiB0aGUgd3JhcHBlZCB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZCBieSBjYWxscwotICogdG8ge0BsaW5rICNnZXRWYWx1ZSgpfS4KLSAqIDxwPgotICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgRmlsdGVyfSwgYSBzdWJjbGFzcwotICogY2FuIG92ZXJyaWRlIHtAbGluayAjYWNjZXB0KFQpfS4KLSAqIDxwPgotICogT25lLCBwb3NzaWJseSB1bmRlc2lyYWJsZSwgc2lkZS1lZmZlY3Qgb2YgdXNpbmcgdGhpcyB2YWx1ZSBtb2RlbCBpcyB0aGF0Ci0gKiBpdCBtdXN0IHJldHVybiAqc29tZXRoaW5nKiBhcyB0aGUgdmFsdWUuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzCi0gKiB0byByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gd2hlbmV2ZXIgdGhlIHdyYXBwZWQgdmFsdWUgaXMgbm90ICJhY2NlcHRlZCIsCi0gKiB3aGljaCBjYW4gYmUgY29uZmlndXJlZCBhbmQvb3Igb3ZlcnJpZGRlbiAoe0BsaW5rICNnZXREZWZhdWx0VmFsdWUoKX0pLgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFQ+Ci0JaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLXsKLQlwcm90ZWN0ZWQgZmluYWwgRmlsdGVyPFQ+IGZpbHRlcjsKLQlwcm90ZWN0ZWQgZmluYWwgVCBkZWZhdWx0VmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGZpbHRlcmluZyBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIGEgZGlzYWJsZWQgZmlsdGVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHtAbGluayAjYWNjZXB0KFQpfQotCSAqIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgRmlsdGVyfS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiB2YWx1ZUhvbGRlcikgewotCQl0aGlzKHZhbHVlSG9sZGVyLCBGaWx0ZXIuRGlzYWJsZWQuPFQ+aW5zdGFuY2UoKSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgZmlsdGVyaW5nIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCwgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUsIGFuZCBhIGRpc2FibGVkIGZpbHRlci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB7QGxpbmsgI2FjY2VwdChUKX0KLQkgKiBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIEZpbHRlcn0KLQkgKiA8ZW0+YW5kPC9lbT4geW91IG5lZWQgdG8gc3BlY2lmeQotCSAqIGEgZGVmYXVsdCB2YWx1ZSBvdGhlciB0aGFuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiB2YWx1ZUhvbGRlciwgVCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgRmlsdGVyLkRpc2FibGVkLjxUPmluc3RhbmNlKCksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgZmlsdGVyaW5nIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgZmlsdGVyLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHZhbHVlSG9sZGVyLCBGaWx0ZXI8VD4gZmlsdGVyKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIGZpbHRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgZmlsdGVyaW5nIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCwgZmlsdGVyLCBhbmQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gdmFsdWVIb2xkZXIsIEZpbHRlcjxUPiBmaWx0ZXIsIFQgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmZpbHRlclZhbHVlKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZmlsdGVyIHRoZSB2YWx1ZXMgYmVmb3JlIHByb3BhZ2F0aW5nIHRoZSBjaGFuZ2UgZXZlbnQKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCVQgZXZlbnRPbGRWYWx1ZSA9IChUKSBldmVudC5nZXRPbGRWYWx1ZSgpOwotCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmZpbHRlclZhbHVlKGV2ZW50T2xkVmFsdWUpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJVCBldmVudE5ld1ZhbHVlID0gKFQpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZmlsdGVyVmFsdWUoZXZlbnROZXdWYWx1ZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzICJhY2NlcHRlZCIgc2ltcGx5IHJldHVybiBpdCwKLQkgKiBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBUIGZpbHRlclZhbHVlKFQgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuYWNjZXB0KHZhbHVlKSA/IHZhbHVlIDogdGhpcy5nZXREZWZhdWx0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZmlsdGVyaW5nIHByb3BlcnR5IHZhbHVlIG1vZGVsIHNob3VsZAotCSAqIHJldHVybiB0aGUgc3BlY2lmaWVkIHZhbHVlIGZyb20gYSBjYWxsIHRvCi0JICoge0BsaW5rICNnZXRWYWx1ZSgpfTsgdGhlIHZhbHVlIGNhbWUKLQkgKiBmcm9tIHRoZSBuZXN0ZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgRmlsdGVyfS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoVCB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXIuYWNjZXB0KHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBpZgotCSAqIHRoZSBuZXN0ZWQgdmFsdWUgd2FzIHJlamVjdGVkIGJ5IHRoZSBmaWx0ZXIuCi0JICogVGhlIGRlZmF1bHQgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIFQgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NWM4NmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpZGlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICoge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfSBhbmQgdXNlcyBhIHtAbGluayBCaWRpRmlsdGVyfQotICogdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQgYnkgY2FsbHMKLSAqIHRvIHtAbGluayBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwjZ2V0VmFsdWUoKSBnZXRWYWx1ZSgpfSBhbmQgbW9kaWZpZWQgYnkgY2FsbHMgdG8KLSAqIHtAbGluayAjc2V0VmFsdWUoVCl9LgotICogPHA+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBCaWRpRmlsdGVyfSwgYSBzdWJjbGFzcwotICogY2FuIG92ZXJyaWRlIHtAbGluayBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwjYWNjZXB0KFQpIGFjY2VwdChUKX0gYW5kIHtAbGluayAjcmV2ZXJzZUFjY2VwdChUKX0uCi0gKiA8cD4KLSAqIE9uZSwgcG9zc2libHkgdW5kZXNpcmFibGUsIHNpZGUtZWZmZWN0IG9mIHVzaW5nIHRoaXMgdmFsdWUgbW9kZWwgaXMgdGhhdAotICogaXQgbXVzdCByZXR1cm4gKnNvbWV0aGluZyogYXMgdGhlIHZhbHVlLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcwotICogdG8gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHdoZW5ldmVyIHRoZSB3cmFwcGVkIHZhbHVlIGlzIG5vdCAiYWNjZXB0ZWQiLAotICogd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQgYW5kL29yIG92ZXJyaWRkZW4gKHtAbGluayBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwjZ2V0RGVmYXVsdFZhbHVlKCkgZ2V0RGVmYXVsdFZhbHVlKCl9KS4KLSAqIDxwPgotICogU2ltaWxhcmx5LCBpZiBhbiBpbmNvbWluZyB2YWx1ZSBpcyBub3QgInJldmVyc2UgYWNjZXB0ZWQiLCA8ZW0+bm90aGluZzwvZW0+Ci0gKiB3aWxsIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlciwgbm90IGV2ZW4gPGNvZGU+bnVsbDwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBmaWx0ZXJpbmcgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCBhIGRpc2FibGVkIGZpbHRlci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZQotCSAqIHtAbGluayAjYWNjZXB0KFQpfSBhbmQge0BsaW5rICNyZXZlcnNlQWNjZXB0KFQpfQotCSAqIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgQmlkaUZpbHRlcn0uCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgQmlkaUZpbHRlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBmaWx0ZXJpbmcgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsLCBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSwgYW5kIGEgZGlzYWJsZWQgZmlsdGVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlCi0JICoge0BsaW5rICNhY2NlcHQoVCl9IGFuZCB7QGxpbmsgI3JldmVyc2VBY2NlcHQoVCl9Ci0JICogaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBCaWRpRmlsdGVyfS4KLQkgKiA8ZW0+YW5kPC9lbT4geW91IG5lZWQgdG8gc3BlY2lmeQotCSAqIGEgZGVmYXVsdCB2YWx1ZSBvdGhlciB0aGFuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgVCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgQmlkaUZpbHRlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIGZpbHRlci4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgQmlkaUZpbHRlcjxUPiBmaWx0ZXIpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgZmlsdGVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsLCBmaWx0ZXIsIGFuZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgQmlkaUZpbHRlcjxUPiBmaWx0ZXIsIFQgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyLCBmaWx0ZXIsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsKLQkJaWYgKHRoaXMucmV2ZXJzZUFjY2VwdCh2YWx1ZSkpIHsKLQkJCXRoaXMuZ2V0VmFsdWVIb2xkZXIoKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZmlsdGVyaW5nIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsCi0JICogc2hvdWxkIHBhc3MgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIHRoZSBuZXN0ZWQKLQkgKiB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBpbiBhIGNhbGwgdG8KLQkgKiB7QGxpbmsgI3NldFZhbHVlKFQpfS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgQmlkaUZpbHRlcn0uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV2ZXJzZUFjY2VwdChUIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmdldEZpbHRlcigpLnJldmVyc2VBY2NlcHQodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvciBhY2NlcHRzIG9ubHkgYSB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9e0Bjb2RlPFQ+fS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gZ2V0VmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiAoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9ycyBhY2NlcHQgb25seSBhIGJpZGlyZWN0aW9uYWwgZmlsdGVyLgotCSAqLwotCXByb3RlY3RlZCBCaWRpRmlsdGVyPFQ+IGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIChCaWRpRmlsdGVyPFQ+KSB0aGlzLmZpbHRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmE2ZGE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQWJzdHJhY3QgbGlzdCB2YWx1ZSBtb2RlbCB0aGF0IHByb3ZpZGVzIGJlaGF2aW9yIGZvciB3cmFwcGluZyBhIHtAbGluayBMaXN0VmFsdWVNb2RlbH0KLSAqIChvciB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9KSBhbmQgbGlzdGVuaW5nIGZvciBjaGFuZ2VzIHRvIGFzcGVjdHMgb2YgdGhlCi0gKiA8ZW0+aXRlbXM8L2VtPiBoZWxkIGJ5IHRoZSBsaXN0IChvciBjb2xsZWN0aW9uKS4gQ2hhbmdlcyB0byB0aGUgYWN0dWFsIGxpc3QKLSAqIChvciBjb2xsZWN0aW9uKSBhcmUgYWxzbyBtb25pdG9yZWQuCi0gKiAKLSAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGEgY29sbGVjdGlvbiBvZiBpdGVtcyB0aGF0IGNhbiBiZSBtb2RpZmllZCBieSBhZGRpbmcKLSAqIG9yIHJlbW92aW5nIGl0ZW1zIG9yIHRoZSBpdGVtcyB0aGVtc2VsdmVzIG1pZ2h0IGNoYW5nZSBpbiBhIGZhc2hpb24gdGhhdAotICogbWlnaHQgY2hhbmdlIHRoZSBsaXN0IG9yIGNvbGxlY3Rpb24ncyBleHRlcm5hbCBhcHBlYXJhbmNlLgotICogCi0gKiBTdWJjbGFzc2VzIG5lZWQgdG8gb3ZlcnJpZGUgdHdvIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlSXRlbV8oTW9kZWwpfTxwPgotICogICAgIGJlZ2luIGxpc3RlbmluZyB0byB0aGUgYXBwcm9wcmlhdGUgYXNwZWN0IG9mIHRoZSBzcGVjaWZpZWQgaXRlbSBhbmQgY2FsbAotICogICAgIHtAbGluayAjaXRlbUFzcGVjdENoYW5nZWQoRXZlbnRPYmplY3QpfSB3aGVuZXZlciB0aGUgYXNwZWN0IGNoYW5nZXMKLSAqIDxsaT57QGxpbmsgI2Rpc2VuZ2FnZUl0ZW1fKE1vZGVsKX08cD4KLSAqICAgICBzdG9wIGxpc3RlbmluZyB0byB0aGUgYXBwcm9wcmlhdGUgYXNwZWN0IG9mIHRoZSBzcGVjaWZpZWQgaXRlbQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQotCS8qKgotCSAqIE1haW50YWluIGEgY291bnRlciBmb3IgZWFjaCBvZiB0aGUgaXRlbXMgaW4gdGhlCi0JICogd3JhcHBlZCBsaXN0IGhvbGRlciB3ZSBhcmUgbGlzdGVuaW5nIHRvLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJZGVudGl0eUhhc2hNYXA8RSwgSW50UmVmZXJlbmNlPiBjb3VudGVyczsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMuY291bnRlcnMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPEUsIEludFJlZmVyZW5jZT4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBjb2xsZWN0aW9uIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIudG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyIGFuZCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCXRoaXMuZW5nYWdlQWxsSXRlbXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VBbGxJdGVtcygpIHsKLQkJdGhpcy5lbmdhZ2VJdGVtcyh0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW1zKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcykgewotCQlmb3IgKEUgaXRlbSA6IGl0ZW1zKSB7Ci0JCQl0aGlzLmVuZ2FnZUl0ZW0oaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VJdGVtKEUgaXRlbSkgewotCQkvLyBsaXN0ZW4gdG8gZWFjaCBpdGVtIG9ubHkgb25jZQotCQlJbnRSZWZlcmVuY2UgY291bnRlciA9IHRoaXMuY291bnRlcnMuZ2V0KGl0ZW0pOwotCQlpZiAoY291bnRlciA9PSBudWxsKSB7Ci0JCQljb3VudGVyID0gbmV3IEludFJlZmVyZW5jZSgpOwotCQkJdGhpcy5jb3VudGVycy5wdXQoaXRlbSwgY291bnRlcik7Ci0JCQl0aGlzLmVuZ2FnZUl0ZW1fKChNb2RlbCkgaXRlbSk7Ci0JCX0KLQkJY291bnRlci5pbmNyZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVtLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pOwotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyIGFuZCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlQWxsSXRlbXMoKTsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VBbGxJdGVtcygpIHsKLQkJdGhpcy5kaXNlbmdhZ2VJdGVtcyh0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUl0ZW1zKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcykgewotCQlmb3IgKEUgaXRlbSA6IGl0ZW1zKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZUl0ZW0oaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtKEUgaXRlbSkgewotCQkvLyBzdG9wIGxpc3RlbmluZyB0byBlYWNoIGl0ZW0gb25seSBvbmNlCi0JCUludFJlZmVyZW5jZSBjb3VudGVyID0gdGhpcy5jb3VudGVycy5nZXQoaXRlbSk7Ci0JCWlmIChjb3VudGVyID09IG51bGwpIHsKLQkJCS8vIHNvbWV0aGluZyBpcyB3cm9uZyBpZiB0aGlzIGhhcHBlbnMuLi4gIH5ianYKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1pc3NpbmcgY291bnRlcjogIiArIGl0ZW0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGNvdW50ZXIuZGVjcmVtZW50KCkgPT0gMCkgewotCQkJdGhpcy5jb3VudGVycy5yZW1vdmUoaXRlbSk7Ci0JCQl0aGlzLmRpc2VuZ2FnZUl0ZW1fKChNb2RlbCkgaXRlbSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZW0uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSk7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBGb3J3YXJkIHRoZSBldmVudCBhbmQgYmVnaW4gbGlzdGVuaW5nIHRvIHRoZSBhZGRlZCBpdGVtcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuZW5nYWdlSXRlbXModGhpcy5nZXRJdGVtcyhldmVudCkpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSByZW1vdmVkIGl0ZW1zIGFuZCBmb3J3YXJkIHRoZSBldmVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZGlzZW5nYWdlSXRlbXModGhpcy5nZXRJdGVtcyhldmVudCkpOwotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSByZW1vdmVkIGl0ZW1zLCBmb3J3YXJkIHRoZSBldmVudCwKLQkgKiBhbmQgYmVnaW4gbGlzdGVuaW5nIHRvIHRoZSBhZGRlZCBpdGVtcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5kaXNlbmdhZ2VJdGVtcyh0aGlzLmdldE9sZEl0ZW1zKGV2ZW50KSk7Ci0JCS8vIHJlLWZpcmUgZXZlbnQgd2l0aCB0aGUgd3JhcHBlciBhcyB0aGUgc291cmNlCi0JCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5lbmdhZ2VJdGVtcyh0aGlzLmdldE5ld0l0ZW1zKGV2ZW50KSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBObyBuZWVkIHRvIGNoYW5nZSBhbnkgbGlzdGVuZXJzOyBqdXN0IGZvcndhcmQgdGhlIGV2ZW50LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVJdGVtc01vdmVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCBob2xkZXIgd2FzIGNsZWFyZWQuCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHJlbW92ZWQgaXRlbXMgYW5kIGZvcndhcmQgdGhlIGV2ZW50LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIHdlIHNob3VsZCBvbmx5IG5lZWQgdG8gZGlzZW5nYWdlIGVhY2ggaXRlbSBvbmNlLi4uCi0JCS8vIG1ha2UgYSBjb3B5IHRvIHByZXZlbnQgYSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JCUNvbGxlY3Rpb248RT4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8RT4odGhpcy5jb3VudGVycy5rZXlTZXQoKSk7Ci0JCXRoaXMuZGlzZW5nYWdlSXRlbXMoa2V5cyk7Ci0JCXRoaXMuY291bnRlcnMuY2xlYXIoKTsKLQkJLy8gcmUtZmlyZSBldmVudCB3aXRoIHRoZSB3cmFwcGVyIGFzIHRoZSBzb3VyY2UKLQkJdGhpcy5maXJlTGlzdENsZWFyZWQoTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIGhhcyBjaGFuZ2VkIGluIHNvbWUgZHJhbWF0aWMgZmFzaGlvbi4KLQkgKiBSZWNvbmZpZ3VyZSBvdXIgbGlzdGVuZXJzIGFuZCBmb3J3YXJkIHRoZSBldmVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2Ugc2hvdWxkIG9ubHkgbmVlZCB0byBkaXNlbmdhZ2UgZWFjaCBpdGVtIG9uY2UuLi4KLQkJLy8gbWFrZSBhIGNvcHkgdG8gcHJldmVudCBhIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLQkJQ29sbGVjdGlvbjxFPiBrZXlzID0gbmV3IEFycmF5TGlzdDxFPih0aGlzLmNvdW50ZXJzLmtleVNldCgpKTsKLQkJdGhpcy5kaXNlbmdhZ2VJdGVtcyhrZXlzKTsKLQkJdGhpcy5jb3VudGVycy5jbGVhcigpOwotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChldmVudC5jbG9uZSh0aGlzKSk7Ci0JCXRoaXMuZW5nYWdlQWxsSXRlbXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaXRlbSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZW0gaGFzIGEgYm91bmQgcHJvcGVydHkgdGhhdCBoYXMgY2hhbmdlZC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2UuIFRoZSBsaXN0ZW5lcnMgd2lsbCBoYXZlIHRvIGRldGVybWluZQotCSAqIHdoZXRoZXIgdGhlIGl0ZW0gYXNwZWN0IGNoYW5nZSBpcyBzaWduaWZpY2FudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtQXNwZWN0Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRXZlbnRPYmplY3QgZXZlbnQpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlciwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1DaGFuZ2VMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQ2hhbmdlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZGE5NjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1DaGFuZ2VMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TaW1wbGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byBhbGwgb2YgdGhlIGNoYW5nZXMKLSAqIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbUNoYW5nZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotewotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ2hhbmdlTGlzdGVuZXIgaXRlbUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgSXRlbUNoYW5nZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLml0ZW1DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRJdGVtQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENoYW5nZUxpc3RlbmVyIGJ1aWxkSXRlbUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtQ2hhbmdlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJaXRlbS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLml0ZW1DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlpdGVtLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuaXRlbUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OGJmOTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgY29sbGVjdGlvbgotICogYXNwZWN0cyBvZiBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSBpdGVtcycgY29sbGVjdGlvbnMgdGhhdCB3ZSBsaXN0ZW4gdG8uICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIGNvbGxlY3Rpb25OYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGl0ZW1Db2xsZWN0aW9uTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gQ29sbGVjdGlvbnMuCi0JICovCi0JcHVibGljIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsIFN0cmluZy4uLiBjb2xsZWN0aW9uTmFtZXMpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMuY29sbGVjdGlvbk5hbWVzID0gY29sbGVjdGlvbk5hbWVzOwotCQl0aGlzLml0ZW1Db2xsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbUNvbGxlY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gQ29sbGVjdGlvbnMuCi0JICovCi0JcHVibGljIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNvbGxlY3Rpb25Ib2xkZXIsIFN0cmluZy4uLiBjb2xsZWN0aW9uTmFtZXMpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjb2xsZWN0aW9uSG9sZGVyKSwgY29sbGVjdGlvbk5hbWVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsIHdlIHJlYWxseSBjYXJlIGFib3V0IGlzIHRoZSBmYWN0IHRoYXQgYSBDb2xsZWN0aW9uIGFzcGVjdCBoYXMgCi0JICogY2hhbmdlZC4gIERvIHRoZSBzYW1lIHRoaW5nIG5vIG1hdHRlciB3aGljaCBldmVudCBvY2N1cnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZEl0ZW1Db2xsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW0gY29sbGVjdGlvbiBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJaXRlbS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMuaXRlbUNvbGxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIGNvbGxlY3Rpb25OYW1lIDogdGhpcy5jb2xsZWN0aW9uTmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCB0aGlzLml0ZW1Db2xsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNThhNjA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZSBsaXN0Ci0gKiBhc3BlY3RzIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLXsKLQotCS8qKiBUaGUgbmFtZXMgb2YgdGhlIHN1YmplY3QncyBsaXN0cyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gbGlzdE5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgaXRlbUxpc3RMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBMaXN0IGFzcGVjdHMuCi0JICovCi0JcHVibGljIEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsIFN0cmluZy4uLiBsaXN0TmFtZXMpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMubGlzdE5hbWVzID0gbGlzdE5hbWVzOwotCQl0aGlzLml0ZW1MaXN0TGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbUxpc3RMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gTGlzdCBhc3BlY3RzLgotCSAqLwotCXB1YmxpYyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBjb2xsZWN0aW9uSG9sZGVyLCBTdHJpbmcuLi4gbGlzdE5hbWVzKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4oY29sbGVjdGlvbkhvbGRlciksIGxpc3ROYW1lcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbCB3ZSByZWFsbHkgY2FyZSBhYm91dCBpcyB0aGUgZmFjdCB0aGF0IHRoZSBMaXN0IGFzcGVjdCBoYXMgCi0JICogY2hhbmdlZC4gIERvIHRoZSBzYW1lIHRoaW5nIG5vIG1hdHRlciB3aGljaCBldmVudCBvY2N1cnMuCi0JICovCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZEl0ZW1MaXN0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtIGxpc3QgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubGlzdE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQkKLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBsaXN0TmFtZSA6IHRoaXMubGlzdE5hbWVzKSB7Ci0JCQlpdGVtLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgdGhpcy5pdGVtTGlzdExpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgbGlzdE5hbWUgOiB0aGlzLmxpc3ROYW1lcykgewotCQkJaXRlbS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIHRoaXMuaXRlbUxpc3RMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRiZDk5My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUKLSAqIHByb3BlcnRpZXMgb2YgZWFjaCBpdGVtIGluIHRoZSB3cmFwcGVkIGxpc3QgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLXsKLQotCS8qKiBUaGUgbmFtZXMgb2YgdGhlIGl0ZW1zJyBwcm9wZXJ0aWVzIHRoYXQgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGl0ZW1Qcm9wZXJ0eUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIHByb3BlcnRpZXMuCi0JICovCi0JcHVibGljIEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBTdHJpbmcuLi4gcHJvcGVydHlOYW1lcykgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcm9wZXJ0eU5hbWVzID0gcHJvcGVydHlOYW1lczsKLQkJdGhpcy5pdGVtUHJvcGVydHlMaXN0ZW5lciA9IHRoaXMuYnVpbGRJdGVtUHJvcGVydHlMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gcHJvcGVydGllcy4KLQkgKi8KLQlwdWJsaWMgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNvbGxlY3Rpb25Ib2xkZXIsIFN0cmluZy4uLiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4oY29sbGVjdGlvbkhvbGRlciksIHByb3BlcnR5TmFtZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEl0ZW1Qcm9wZXJ0eUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW0gcHJvcGVydHkgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLnByb3BlcnR5TmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHRoaXMucHJvcGVydHlOYW1lcykgewotCQkJaXRlbS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgdGhpcy5pdGVtUHJvcGVydHlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHRoaXMucHJvcGVydHlOYW1lcykgewotCQkJaXRlbS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgdGhpcy5pdGVtUHJvcGVydHlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmMzAyMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcn0gdG8gbGlzdGVuIHRvIHRoZQotICogInN0YXRlIiBvZiBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotewotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RhdGVDaGFuZ2VMaXN0ZW5lciBpdGVtU3RhdGVMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBpdGVtIHN0YXRlLgotCSAqLwotCXB1YmxpYyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5pdGVtU3RhdGVMaXN0ZW5lciA9IHRoaXMuYnVpbGRJdGVtU3RhdGVMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgaXRlbSBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkSXRlbVN0YXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbSBzdGF0ZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJaXRlbS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuaXRlbVN0YXRlTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJaXRlbS5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuaXRlbVN0YXRlTGlzdGVuZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1NWI1ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZSB0cmVlCi0gKiBhc3BlY3RzIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLXsKLQotCS8qKiBUaGUgbmFtZXMgb2YgdGhlIGl0ZW1zJyB0cmVlIHRoYXQgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSB0cmVlTmFtZXM7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciBpdGVtVHJlZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIHRyZWVzLgotCSAqLwotCXB1YmxpYyBJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBTdHJpbmcuLi4gdHJlZU5hbWVzKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnRyZWVOYW1lcyA9IHRyZWVOYW1lczsKLQkJdGhpcy5pdGVtVHJlZUxpc3RlbmVyID0gdGhpcy5idWlsZEl0ZW1UcmVlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIHRyZWVzLgotCSAqLwotCXB1YmxpYyBJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBjb2xsZWN0aW9uSG9sZGVyLCBTdHJpbmcuLi4gdHJlZU5hbWVzKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4oY29sbGVjdGlvbkhvbGRlciksIHRyZWVOYW1lcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbCB3ZSByZWFsbHkgY2FyZSBhYm91dCBpcyB0aGUgZmFjdCB0aGF0IGEgdHJlZSBhc3BlY3QgaGFzIAotCSAqIGNoYW5nZWQuICBEbyB0aGUgc2FtZSB0aGluZyBubyBtYXR0ZXIgd2hpY2ggZXZlbnQgb2NjdXJzLgotCSAqLwotCXByb3RlY3RlZCBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtVHJlZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyZWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQkJCUl0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbSB0cmVlIGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLnRyZWVOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyB0cmVlTmFtZSA6IHRoaXMudHJlZU5hbWVzKSB7Ci0JCQlpdGVtLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgdGhpcy5pdGVtVHJlZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgdHJlZU5hbWUgOiB0aGlzLnRyZWVOYW1lcykgewotCQkJaXRlbS5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIHRoaXMuaXRlbVRyZWVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RBc3BlY3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmOGRmYTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RBc3BlY3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGV4dGVuc2lvbiBvZiB7QGxpbmsgQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSBwcm92aWRlcwotICogYmFzaWMgbGlzdCBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYSBzZXQgb2Ygb25lIG9yIG1vcmUgbGlzdHMgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNMSVNUX1ZBTFVFU30gbGlzdC4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgKHNlZSB0aGUgZGVzY3JpcHRpb25zCi0gKiBpbiB7QGxpbmsgQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSk6PHVsPgotICogPGxpPntAbGluayAjbGlzdEl0ZXJhdG9yXygpfQotICogPGxpPntAbGluayAjZ2V0KGludCl9Ci0gKiA8bGk+e0BsaW5rICNzaXplXygpfQotICogPGxpPntAbGluayAjdG9BcnJheV8oKX0KLSAqIDxsaT57QGxpbmsgI2xpc3RJdGVyYXRvcigpfQotICogPGxpPntAbGluayAjc2l6ZSgpfQotICogPGxpPntAbGluayAjdG9BcnJheSgpfQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExpc3RBc3BlY3RBZGFwdGVyPFMgZXh0ZW5kcyBNb2RlbCwgRT4KLQlleHRlbmRzIEFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTLCBFPgotewotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgbGlzdHMgdGhhdCB3ZSB1c2UgZm9yIHRoZSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gbGlzdE5hbWVzOwotCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX0xJU1RfTkFNRVMgPSBuZXcgU3RyaW5nWzBdOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3RzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiBhbmQgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoU3RyaW5nIGxpc3ROYW1lLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RyaW5nW10ge2xpc3ROYW1lfSwgc3ViamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIGxpc3RzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0QXNwZWN0QWRhcHRlcihTdHJpbmdbXSBsaXN0TmFtZXMsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4oc3ViamVjdCksIGxpc3ROYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBsaXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBTdHJpbmcuLi4gbGlzdE5hbWVzKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCQl0aGlzLmxpc3ROYW1lcyA9IGxpc3ROYW1lczsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBsaXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBDb2xsZWN0aW9uPFN0cmluZz4gbGlzdE5hbWVzKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgbGlzdE5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0TmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgYXNwZWN0IGFkYXB0ZXIgZm9yIGFuICJ1bmNoYW5naW5nIiBsaXN0IGluCi0JICogdGhlIHNwZWNpZmllZCBzdWJqZWN0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYSBsaXN0IGFzcGVjdCB0aGF0IGRvZXMgbm90Ci0JICogY2hhbmdlIGZvciBhIHBhcnRpY3VsYXIgc3ViamVjdDsgYnV0IHRoZSBzdWJqZWN0IHdpbGwgY2hhbmdlLCByZXN1bHRpbmcgaW4KLQkgKiBhIG5ldyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBMaXN0QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBFTVBUWV9MSVNUX05BTUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBzdWJqZWN0J3MgbGlzdCBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUUgbGlzdCBjaGFuZ2UgZXZlbnRzCi0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2UgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KExpc3RBc3BlY3RBZGFwdGVyLnRoaXMubGlzdE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyBsaXN0TmFtZSA6IHRoaXMubGlzdE5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0gICAgCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNNb3ZlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUxpc3RDbGVhcmVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ1MGYxNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQW4gYWRhcHRlciB0aGF0IGFsbG93cyB1cyB0byBtYWtlIGEge0BsaW5rIExpc3RWYWx1ZU1vZGVsfSBiZWhhdmUgbGlrZQotICogYSByZWFkLW9ubHkge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSwgc29ydGEuCi0gKiA8cD4KLSAqIFdlIGtlZXAgYW4gaW50ZXJuYWwgY29sbGVjdGlvbiBzb21ld2hhdCBpbiBzeW5jaCB3aXRoIHRoZSB3cmFwcGVkIGxpc3QuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFNpbmNlIHdlIG9ubHkgbGlzdGVuIHRvIHRoZSB3cmFwcGVkIGxpc3Qgd2hlbiB3ZSBoYXZlCi0gKiBsaXN0ZW5lcnMgb3Vyc2VsdmVzIGFuZCB3ZSBjYW4gb25seSBzdGF5IGluIHN5bmNoIHdpdGggdGhlIHdyYXBwZWQKLSAqIGxpc3Qgd2hpbGUgd2UgYXJlIGxpc3RlbmluZyB0byBpdCwgcmVzdWx0cyB0byB2YXJpb3VzIG1ldGhvZHMKLSAqIChlLmcuIHtAbGluayAjc2l6ZSgpfSwge0BsaW5rIGl0ZXJhdG9yKCl9KSB3aWxsIGJlIHVucHJlZGljdGFibGUgd2hlbmV2ZXIKLSAqIHdlIGRvIG5vdCBoYXZlIGFueSBsaXN0ZW5lcnMuIFRoaXMgc2hvdWxkIG5vdCBiZSB0b28gcGFpbmZ1bCBzaW5jZSwKLSAqIG1vc3QgbGlrZWx5LCBjbGllbnQgb2JqZWN0cyB3aWxsIGFsc28gYmUgbGlzdGVuZXJzLgotICovCi1wdWJsaWMgY2xhc3MgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbAotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhlIHdyYXBwZWQgbGlzdCB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGZvcndhcmRzIGFueSBldmVudHMgZmlyZWQgYnkgdGhlIGxpc3QgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogT3VyIGludGVybmFsIGNvbGxlY3Rpb24sIHdoaWNoIGhvbGRzIHRoZSBzYW1lIGVsZW1lbnRzIGFzCi0JICogdGhlIHdyYXBwZWQgbGlzdC4KLQkgKi8KLQkvLyB3ZSBkZWNsYXJlIHRoaXMgYW4gQXJyYXlMaXN0IHNvIHdlIGNhbiB1c2UgI2Nsb25lKCkgYW5kICNlbnN1cmVDYXBhY2l0eShpbnQpCi0JcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxFPiBjb2xsZWN0aW9uOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgbGlzdCB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RIb2xkZXIgPSBsaXN0SG9sZGVyOwotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5jb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxFPigpOwotCQkvLyBwb3N0cG9uZSBidWlsZGluZyB0aGUgY29sbGVjdGlvbiBhbmQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGxpc3QKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaGFzIGNoYW5nZWQsIGZvcndhcmQgYW4gZXF1aXZhbGVudAotCSAqIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQkvLyB0cnkgdG8gcHJldmVudCBiYWNrZG9vciBtb2RpZmljYXRpb24gb2YgdGhlIGxpc3QKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPEU+KHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLnNpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQkvLyBzeW5jaCBvdXIgY29sbGVjdGlvbiAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSBjb2xsZWN0aW9uIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyCi0JCXRoaXMuY29sbGVjdGlvbi5jbGVhcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKHRoaXMuZ2V0SXRlbXMoZXZlbnQpLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24odGhpcy5nZXRJdGVtcyhldmVudCksIHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHRoaXMuZ2V0T2xkSXRlbXMoZXZlbnQpLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JCXRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24odGhpcy5nZXROZXdJdGVtcyhldmVudCksIHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRPbGRJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldE9sZEl0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0TmV3SXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXROZXdJdGVtcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZz8gbW92aW5nIGl0ZW1zIGluIGEgbGlzdCBoYXMgbm8gbmV0IGVmZmVjdCBvbiBhIGNvbGxlY3Rpb24uLi4KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJLy8gcHV0IGluIGVtcHR5IGNoZWNrIHNvIHdlIGRvbid0IGZpcmUgZXZlbnRzIHVubmVjZXNzYXJpbHkKLQkJaWYgKCAhIHRoaXMuY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuY29sbGVjdGlvbi5jbGVhcigpOwotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNsZWFyZWQoVkFMVUVTKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHN5bmNocm9uaXplIG91ciBpbnRlcm5hbCBjb2xsZWN0aW9uIHdpdGggdGhlIHdyYXBwZWQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpID09IDApIHsKLQkJCWlmICh0aGlzLmNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJLy8gbm8gY2hhbmdlCi0JCQl9IGVsc2UgewotCQkJCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLmNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJCQl0aGlzLmZpcmVJdGVtc0FkZGVkKFZBTFVFUywgdGhpcy5jb2xsZWN0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5jb2xsZWN0aW9uLmNsZWFyKCk7Ci0JCQkJdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIHRoaXMuY29sbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCS8vIGlmIHRoZSBuZXcgbGlzdCBpcyBlbXB0eSwgZG8gbm90aGluZwotCQlpbnQgc2l6ZSA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWlmIChzaXplICE9IDApIHsKLQkJCXRoaXMuYnVpbGRDb2xsZWN0aW9uKHNpemUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRDb2xsZWN0aW9uKGludCBzaXplKSB7Ci0JCXRoaXMuY29sbGVjdGlvbi5lbnN1cmVDYXBhY2l0eShzaXplKTsKLQkJZm9yIChFIGVhY2ggOiB0aGlzLmxpc3RIb2xkZXIpIHsKLQkJCXRoaXMuY29sbGVjdGlvbi5hZGQoZWFjaCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmNvbGxlY3Rpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEN1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQzMmJiYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEN1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBleHRlbnNpb24gb2Yge0BsaW5rIEFzcGVjdEFkYXB0ZXJ9IHByb3ZpZGVzIGxpc3QgY2hhbmdlIHN1cHBvcnQKLSAqIGJ5IGFkYXB0aW5nIGEgc3ViamVjdCdzIHN0YXRlIGNoYW5nZSBldmVudHMgdG8gYSBtaW5pbXVtIHNldAotICogb2YgbGlzdCBjaGFuZ2UgZXZlbnRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGlzdEN1cmF0b3I8UyBleHRlbmRzIE1vZGVsLCBFPgotCWV4dGVuZHMgQXNwZWN0QWRhcHRlcjxTPgotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQkvKiogSG93IHRoZSBsaXN0IGxvb2tlZCBiZWZvcmUgdGhlIGxhc3Qgc3RhdGUgY2hhbmdlICovCi0JcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8RT4gcmVjb3JkOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIGZvciB0aGUgc3ViamVjdCdzIHN0YXRlIHRvIGNoYW5nZSAqLwotCXByaXZhdGUgZmluYWwgU3RhdGVDaGFuZ2VMaXN0ZW5lciBzdGF0ZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjdXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QuCi0JICovCi0JcHJvdGVjdGVkIExpc3RDdXJhdG9yKFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4oc3ViamVjdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGN1cmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdCBob2xkZXIuCi0JICogVGhlIHN1YmplY3QgaG9sZGVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q3VyYXRvcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JCXRoaXMucmVjb3JkID0gbmV3IEFycmF5TGlzdDxFPigpOwotCQl0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCdzIHN0YXRlIGhhcyBjaGFuZ2VkLCBkbyBpbnZlbnRvcnkgYW5kIHJlcG9ydCB0byBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RDdXJhdG9yLnRoaXMuc3VibWl0SW52ZW50b3J5UmVwb3J0KCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPEU+KHRoaXMucmVjb3JkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMucmVjb3JkLmdldChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5yZWNvcmQuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBtYW5pZmVzdGF0aW9uIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLnJlY29yZC50b0FycmF5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGdldExpc3RlbmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiBMSVNUX1ZBTFVFUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBhc3BlY3QgaGFzIGNoYW5nZWQsIG5vdGlmeSBsaXN0ZW5lcnMgYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5yZWNvcmQpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGlzIG5vdCBudWxsIC0gYWRkIG91ciBsaXN0ZW5lci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIHN5bmNoIG91ciBsaXN0ICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0LAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMucmVjb3JkLCB0aGlzLml0ZXJhdG9yRm9yUmVjb3JkKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGlzIG5vdCBudWxsIC0gcmVtb3ZlIG91ciBsaXN0ZW5lci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgbGlzdCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0Ci0JCXRoaXMucmVjb3JkLmNsZWFyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RDdXJhdG9yIHByb3RvY29sICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgZGlmZmVyZW50IGZyb20ge0BsaW5rIExpc3RWYWx1ZU1vZGVsI2l0ZXJhdG9yKCl9LgotCSAqIEl0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb25seSB3aGVuIHRoZSBzdWJqZWN0IGNoYW5nZXMgb3IgdGhlCi0JICogc3ViamVjdCdzICJzdGF0ZSIgY2hhbmdlcyAoYXMgc2lnbmlmaWVkIGJ5IGEgc3RhdGUgY2hhbmdlIGV2ZW50KS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmF0b3I8RT4gaXRlcmF0b3JGb3JSZWNvcmQoKTsKLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQl2b2lkIHN1Ym1pdEludmVudG9yeVJlcG9ydCgpIHsKLQkJTGlzdDxFPiBuZXdSZWNvcmQgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLml0ZXJhdG9yRm9yUmVjb3JkKCkpOwotCQlpbnQgcmVjb3JkSW5kZXggPSAwOwotCi0JCS8vIGFkZCBpdGVtcyBmcm9tIHRoZSBuZXcgcmVjb3JkCi0JCWZvciAoRSBuZXdJdGVtIDogbmV3UmVjb3JkKSB7Ci0JCQl0aGlzLmludmVudG9yeU5ld0l0ZW0ocmVjb3JkSW5kZXgsIG5ld0l0ZW0pOwotCQkJcmVjb3JkSW5kZXgrKzsKLQkJfQotCi0JCS8vIGNsZWFuIG91dCBpdGVtcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIG5ldyByZWNvcmQKLQkJZm9yIChyZWNvcmRJbmRleCA9IDA7IHJlY29yZEluZGV4IDwgdGhpcy5yZWNvcmQuc2l6ZSgpOyApIHsKLQkJCUUgaXRlbSA9IHRoaXMucmVjb3JkLmdldChyZWNvcmRJbmRleCk7Ci0KLQkJCWlmIChuZXdSZWNvcmQuY29udGFpbnMoaXRlbSkpIHsKLQkJCQlyZWNvcmRJbmRleCsrOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tSW52ZW50b3J5KHJlY29yZEluZGV4LCBpdGVtKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbnZlbnRvcnlOZXdJdGVtKGludCByZWNvcmRJbmRleCwgRSBuZXdJdGVtKSB7Ci0JCUxpc3Q8RT4gcmVjID0gbmV3IEFycmF5TGlzdDxFPih0aGlzLnJlY29yZCk7Ci0KLQkJaWYgKChyZWNvcmRJbmRleCA8IHJlYy5zaXplKCkpICYmIHJlYy5nZXQocmVjb3JkSW5kZXgpLmVxdWFscyhuZXdJdGVtKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChyZWMuY29udGFpbnMobmV3SXRlbSkpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21JbnZlbnRvcnkocmVjb3JkSW5kZXgsIHJlYy5nZXQocmVjb3JkSW5kZXgpKTsKLQkJCXRoaXMuaW52ZW50b3J5TmV3SXRlbShyZWNvcmRJbmRleCwgbmV3SXRlbSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0ludmVudG9yeShyZWNvcmRJbmRleCwgbmV3SXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSXRlbVRvSW52ZW50b3J5KGludCBpbmRleCwgRSBpdGVtKSB7Ci0JCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgaXRlbSwgdGhpcy5yZWNvcmQsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlSXRlbUZyb21JbnZlbnRvcnkoaW50IGluZGV4LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRSBpdGVtKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLnJlY29yZCwgTElTVF9WQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMucmVjb3JkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjhmOWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIHRvIHdyYXAKLSAqIGEgbGlzdCB2YWx1ZSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgY29udmVydAotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gcHJvcGVydHkgdmFsdWUgbW9kZWwgY2hhbmdlCi0gKiBub3RpZmljYXRpb25zLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGU6PHVsPgotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIHRvIHJldHVybiB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotICogICAgIGN1cnJlbnQgbGlzdCB2YWx1ZQotICogPC91bD4KLSAqIFN1YmNsYXNzZXMgbWlnaHQgd2FudCB0byBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMKLSAqIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgKGJ5IG5vdCByZWNhbGN1bGF0aW5nIHRoZSB2YWx1ZSwgaWYgcG9zc2libGUpOjx1bD4KLSAqIDxsaT57QGxpbmsgI2l0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI2l0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI2l0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpfQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLXsKLQkvKiogVGhlIHdyYXBwZWQgbGlzdCB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNoIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGxpc3QgdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIExpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9CQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbF8oKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgbW92ZWQgaW4gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCBob2xkZXIgd2FzIGNsZWFyZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIgaGFzIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdFZhbHVlTW9kZWxXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdFZhbHVlTW9kZWxXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMzQxMDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhbm90aGVyIGxpc3QgdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIHByb3BhZ2F0ZQotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zLiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBhcHByb3ByaWF0ZQotICoge0BsaW5rIExpc3RWYWx1ZU1vZGVsfS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWV4dGVuZHMgQWJzdHJhY3RMaXN0VmFsdWVNb2RlbAotewotCS8qKiBUaGUgd3JhcHBlZCBsaXN0IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNoIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGxpc3QgdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RIb2xkZXIgPSBsaXN0SG9sZGVyOwotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCUxpc3RWYWx1ZU1vZGVsV3JhcHBlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RWYWx1ZU1vZGVsV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RWYWx1ZU1vZGVsV3JhcHBlci50aGlzLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldE5ld0l0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0TmV3SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRPbGRJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldE9sZEl0ZW1zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgbW92ZWQgaW4gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIHdhcyBjbGVhcmVkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYzQ5MzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSByZWFkLW9ubHkgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBmb3Igd2hlbiB5b3UKLSAqIGRvbid0IG5lZWQgdG8gc3VwcG9ydCBhIGNvbGxlY3Rpb24uIEluIHBhcnRpY3VsYXIsIHRoaXMKLSAqIGlzIHVzZWZ1bCBmb3IgdGhlIGxlYWYgbm9kZXMgb2YgYSB0cmVlIHRoYXQgbmV2ZXIgaGF2ZQotICogY2hpbGRyZW4uCi0gKiA8cD4KLSAqIFdlIGRvbid0IHVzZSBhIHNpbmdsZXRvbiBiZWNhdXNlIHdlIGhvbGQgb24gdG8gbGlzdGVuZXJzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbExpc3RWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbExpc3RWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YTQ2YjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQW4gZW1wdHkgbGlzdCB2YWx1ZSBtb2RlbCBmb3Igd2hlbiB5b3UgZG9uJ3QKLSAqIG5lZWQgdG8gc3VwcG9ydCBhIGxpc3QuCi0gKiA8cD4KLSAqIFdlIGRvbid0IHVzZSBhIHNpbmdsZXRvbiBiZWNhdXNlIHdlIGhvbGQgb24gdG8gbGlzdGVuZXJzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbExpc3RWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSUkFZID0gbmV3IE9iamVjdFswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE51bGxMaXN0VmFsdWVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gRU1QVFlfQVJSQVk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwZjE3Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgcHJvcGVydHkgdmFsdWUgbW9kZWwgZm9yIHdoZW4geW91Ci0gKiBkb24ndCBuZWVkIHRvIHN1cHBvcnQgYSB2YWx1ZS4KLSAqIDxwPgotICogV2UgZG9uJ3QgdXNlIGEgc2luZ2xldG9uIGJlY2F1c2Ugd2UgaG9sZCBvbiB0byBsaXN0ZW5lcnMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE51bGxQcm9wZXJ0eVZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxUcmVlVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxUcmVlVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmNjOGIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsVHJlZVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgdHJlZSB2YWx1ZSBtb2RlbCBmb3Igd2hlbiB5b3UKLSAqIGRvbid0IG5lZWQgdG8gc3VwcG9ydCBhbnkgbm9kZXMuCi0gKiA8cD4KLSAqIFdlIGRvbid0IHVzZSBhIHNpbmdsZXRvbiBiZWNhdXNlIHdlIGhvbGQgb24gdG8gbGlzdGVuZXJzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFRyZWVWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBUcmVlVmFsdWVNb2RlbDxFPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTnVsbFRyZWVWYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogVHJlZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IG5vZGVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5QXNwZWN0QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5QXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Y3Yjc3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyB7QGxpbmsgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcn0gcHJvdmlkZXMgYmFzaWMgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQuCi0gKiBUaGlzIGNvbnZlcnRzIGEgc2V0IG9mIG9uZSBvciBtb3JlIHN0YW5kYXJkIHByb3BlcnRpZXMgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNWQUxVRX0gcHJvcGVydHkuCi0gKiA8cD4KLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzIChzZWUgdGhlIGRlc2NyaXB0aW9ucwotICogaW4ge0BsaW5rIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJ9KTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlXygpfQotICogPGxpPntAbGluayAjc2V0VmFsdWVfKE9iamVjdCl9Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlKCl9Ci0gKiA8bGk+e0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTIGV4dGVuZHMgTW9kZWwsIFY+Ci0JZXh0ZW5kcyBBc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFMsIFY+Ci17Ci0JLyoqIFRoZSBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgcHJvcGVydGllcyB0aGF0IHdlIHVzZSBmb3IgdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzOwotCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1BST1BFUlRZX05BTUVTID0gbmV3IFN0cmluZ1swXTsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgYXBwcm9wcmlhdGUgcHJvcGVydGllcyBvZiB0aGUgc3ViamVjdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIHByb3BlcnR5LgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0cmluZ1tdIHtwcm9wZXJ0eU5hbWV9LCBzdWJqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIHByb3BlcnRpZXMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5QXNwZWN0QWRhcHRlcihTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFM+KHN1YmplY3QpLCBwcm9wZXJ0eU5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBTdHJpbmcuLi4gcHJvcGVydHlOYW1lcykgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyKTsKLQkJdGhpcy5wcm9wZXJ0eU5hbWVzID0gcHJvcGVydHlOYW1lczsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQl0aGlzKHN1YmplY3RIb2xkZXIsIHByb3BlcnR5TmFtZXMudG9BcnJheShuZXcgU3RyaW5nW3Byb3BlcnR5TmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IGFzcGVjdCBhZGFwdGVyIGZvciBhbiAidW5jaGFuZ2luZyIgcHJvcGVydHkgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIHN1YmplY3QuIFRoaXMgaXMgdXNlZnVsIGZvciBhIHByb3BlcnR5IGFzcGVjdCB0aGF0IGRvZXMgbm90Ci0JICogY2hhbmdlIGZvciBhIHBhcnRpY3VsYXIgc3ViamVjdDsgYnV0IHRoZSBzdWJqZWN0IHdpbGwgY2hhbmdlLCByZXN1bHRpbmcgaW4KLQkgKiBhIG5ldyBwcm9wZXJ0eS4gKEEge0BsaW5rIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsfSBjb3VsZCBhbHNvIGJlCi0JICogdXNlZCBpbiB0aGlzIHNpdHVhdGlvbi4pCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBFTVBUWV9QUk9QRVJUWV9OQU1FUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBzdWJqZWN0J3MgcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBpbnRvIFZBTFVFIHByb3BlcnR5IGNoYW5nZSBldmVudHMKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIudGhpcy5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIudGhpcy5wcm9wZXJ0eU5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWQyODBlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IGJlaGF2ZSBsaWtlCi0gKiBhIHJlYWQtb25seSwgc2luZ2xlLWVsZW1lbnQge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSwgc29ydGEuCi0gKiA8cD4KLSAqIElmIHRoZSBwcm9wZXJ0eSdzIHZhbHVlIGlzIG51bGwsIGFuIGVtcHR5IGl0ZXJhdG9yIGlzIHJldHVybmVkCi0gKiAoaS5lLiB5b3UgY2FuJ3QgaGF2ZSBhIGNvbGxlY3Rpb24gd2l0aCBhIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnQpLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIHByb3BlcnR5IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IHZhbHVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBhbnkgZXZlbnRzIGZpcmVkIGJ5IHRoZSB2YWx1ZSBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKiBDYWNoZSB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIEUgdmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0byBhIGNvbGxlY3Rpb24KLQkgKiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAodmFsdWVIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52YWx1ZUhvbGRlciA9IHZhbHVlSG9sZGVyOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQkJLy8gcG9zdHBvbmUgYnVpbGRpbmcgdGhlIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgdmFsdWUgaGFzIGNoYW5nZWQsIGZvcndhcmQgYW4gZXF1aXZhbGVudAotCSAqIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJCUUgZXZlbnROZXdWYWx1ZSA9IChFKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMudmFsdWVDaGFuZ2VkKGV2ZW50TmV3VmFsdWUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPEU+aW5zdGFuY2UoKSA6IHRoaXMuaXRlcmF0b3JfKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yXygpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4odGhpcy52YWx1ZSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIHZhbHVlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBob2xkZXIsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudmFsdWUgPSB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgdmFsdWUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyCi0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzeW5jaHJvbml6ZSBvdXIgaW50ZXJuYWwgdmFsdWUgd2l0aCB0aGUgd3JhcHBlZCB2YWx1ZQotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoRSBuZXdWYWx1ZSkgewotCQlFIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAob2xkVmFsdWUgPT0gbnVsbCkgewotCQkJLy8gd2Ugd291bGRuJ3QgZ2V0IHRoZSBldmVudCBpZiB0aGUgbmV3IHZhbHVlIHdlcmUgbnVsbCB0b28KLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChWQUxVRVMsIG5ld1ZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVkFMVUVTLCBvbGRWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIHdvdWxkbid0IGdldCB0aGUgZXZlbnQgaWYgdGhlIG5ldyB2YWx1ZSB3YXMgdGhlIHNhbWUgYXMgdGhlIG9sZAotCQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgQ29sbGVjdGlvbnMuc2luZ2xldG9uKG5ld1ZhbHVlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2M1YjE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IGJlaGF2ZSBsaWtlCi0gKiBhIHJlYWQtb25seSwgc2luZ2xlLWVsZW1lbnQge0BsaW5rIExpc3RWYWx1ZU1vZGVsfSwgc29ydGEuCi0gKiA8cD4KLSAqIElmIHRoZSBwcm9wZXJ0eSdzIHZhbHVlIGlzIG51bGwsIGFuIGVtcHR5IGl0ZXJhdG9yIGlzIHJldHVybmVkCi0gKiAoaS5lLiB5b3UgY2FuJ3QgaGF2ZSBhIGNvbGxlY3Rpb24gd2l0aCBhIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnQpLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0TGlzdFZhbHVlTW9kZWwKLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIHByb3BlcnR5IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IHZhbHVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBhbnkgZXZlbnRzIGZpcmVkIGJ5IHRoZSB2YWx1ZSBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKiBDYWNoZSB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIEUgdmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0byBhIGxpc3QKLQkgKiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAodmFsdWVIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52YWx1ZUhvbGRlciA9IHZhbHVlSG9sZGVyOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBwb3N0cG9uZSBidWlsZGluZyB0aGUgdmFsdWUgYW5kIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZQotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCB2YWx1ZSBoYXMgY2hhbmdlZCwgZm9yd2FyZCBhbiBlcXVpdmFsZW50Ci0JICogbGlzdCBjaGFuZ2UgZXZlbnQgdG8gb3VyIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQkJRSBldmVudE5ld1ZhbHVlID0gKEUpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy52YWx1ZUNoYW5nZWQoZXZlbnROZXdWYWx1ZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/Ci0JCQkJCUVtcHR5TGlzdEl0ZXJhdG9yLjxFPmluc3RhbmNlKCkKLQkJCQk6Ci0JCQkJCW5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEU+KHRoaXMudmFsdWUpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8gMCA6IDE7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyB0aGlzLmJ1aWxkSU9PQkUoaW5kZXgsIDApOwotCQl9Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCXRocm93IHRoaXMuYnVpbGRJT09CRShpbmRleCwgMSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyBFTVBUWV9PQkpFQ1RfQVJSQVkgOiBuZXcgT2JqZWN0W10ge3RoaXMudmFsdWV9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBidWlsZElPT0JFKGludCBpbmRleCwgaW50IHNpemUpIHsKLQkJcmV0dXJuIG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogIiArIHNpemUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIHZhbHVlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBob2xkZXIsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudmFsdWUgPSB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgdmFsdWUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyCi0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHN5bmNocm9uaXplIG91ciBpbnRlcm5hbCB2YWx1ZSB3aXRoIHRoZSB3cmFwcGVkIHZhbHVlCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChFIG5ld1ZhbHVlKSB7Ci0JCUUgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChvbGRWYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoTElTVF9WQUxVRVMsIDAsIG5ld1ZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoTElTVF9WQUxVRVMsIDAsIG9sZFZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkKExJU1RfVkFMVUVTLCAwLCBuZXdWYWx1ZSwgb2xkVmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YTJmNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhbm90aGVyIHByb3BlcnR5IHZhbHVlIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBwcm9wYWdhdGUKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucy4gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUKLSAqIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9LgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczo8dWw+Ci0gKiA8bGk+e0BsaW5rICN2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHByb3BhZ2F0ZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbgotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8Vj4KLQlleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsCi17Ci0JLyoqIFRoZSB3cmFwcGVkIHByb3BlcnR5IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFY+IHZhbHVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB2YWx1ZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsLiBUaGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVj4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZhbHVlSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSB2YWx1ZUhvbGRlcjsKLQkJdGhpcy52YWx1ZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIudGhpcy52YWx1ZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQkKLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCS8qKgotCSAqIEJlZ2luIGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9SZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1JlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMzg3MmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1JlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfSB0aGF0IGFjdHVhbGx5Ci0gKiAuLi4gPGVtPmlzbid0PC9lbT4gLi4uIHdyaXRhYmxlLiAgSXQgY2FuIGhvd2V2ZXIgYmUgdXNlZCBpbiBwbGFjZXMgdGhhdCByZXF1aXJlIGEgCi0gKiB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9IGFuZCB3aGVyZSB0aGUgZGV2ZWxvcGVyIGlzIHN1cmUgdGhhdCBubyAKLSAqIGF0dGVtcHQgd2lsbCBiZSBtYWRlIHRvIHdyaXRlIHRvIGl0LgotICovCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8VD4KLQlleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8VD4KLQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0JcHVibGljIFJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCX0KLQotCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuY2xvbmUodGhpcykpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2V0Q29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TZXRDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTYyYjVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TZXRDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+U2V0Q29sbGVjdGlvblZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0gYW5kIHJldHVybnMgdGhlIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uCi0gKiBvbmx5IG9uY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCXByaXZhdGUgZmluYWwgSGFzaEJhZzxFPiBiYWcgPSBuZXcgSGFzaEJhZzxFPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgYSBmaWx0ZXIgdGhhdCBzaW1wbHkgYWNjZXB0cyBldmVyeSBvYmplY3QuCi0JICovCi0JcHVibGljIFNldENvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCBhIGZpbHRlciB0aGF0IHNpbXBseSBhY2NlcHRzIGV2ZXJ5IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcikgewotCQl0aGlzKG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+KGxpc3RIb2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5iYWcudW5pcXVlQ291bnQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyIG92ZXJyaWRlcy9pbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3luY2ggb3VyIGNhY2hlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgY29sbGVjdGlvbiwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmJhZywgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSBjYWNoZSB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgY29sbGVjdGlvbgotCQl0aGlzLmJhZy5jbGVhcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCUFycmF5TGlzdDxFPiBhZGRlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFPihldmVudC5nZXRJdGVtc1NpemUoKSk7Ci0JCWludCB1bmlxdWVDb3VudCA9IHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKLQkJCXRoaXMuYmFnLmFkZChpdGVtKTsKLQkJCWlmICh0aGlzLmJhZy51bmlxdWVDb3VudCgpID4gdW5pcXVlQ291bnQpIHsKLQkJCQl1bmlxdWVDb3VudCA9IHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JCQkJYWRkZWRJdGVtcy5hZGQoaXRlbSk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5maXJlSXRlbXNBZGRlZChWQUxVRVMsIGFkZGVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJQXJyYXlMaXN0PEU+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oZXZlbnQuZ2V0SXRlbXNTaXplKCkpOwotCQlpbnQgdW5pcXVlQ291bnQgPSB0aGlzLmJhZy51bmlxdWVDb3VudCgpOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7Ci0JCQlpZiAodGhpcy5iYWcucmVtb3ZlKGl0ZW0pKSB7Ci0JCQkJaWYgKHRoaXMuYmFnLnVuaXF1ZUNvdW50KCkgPCB1bmlxdWVDb3VudCkgewotCQkJCQl1bmlxdWVDb3VudCA9IHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JCQkJCXJlbW92ZWRJdGVtcy5hZGQoaXRlbSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtaXNzaW5nIGl0ZW06ICIgKyBpdGVtKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChWQUxVRVMsIHJlbW92ZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5iYWcsIFZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5iYWcsIHRoaXMuY29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgbmV3IEhhc2hTZXQ8RT4odGhpcy5iYWcpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2NhYjhlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWx9IGFuZCB7QGxpbmsgQ29sbGVjdGlvbn0KLSAqIHRoYXQgc2ltcGx5IGhvbGRzIGEgY29sbGVjdGlvbiBhbmQgbm90aWZpZXMgbGlzdGVuZXJzIG9mIGFueSBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4sIENvbGxlY3Rpb248RT4KLXsKLQkvKiogVGhlIGNvbGxlY3Rpb24uICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggYW4gZW1wdHkgaW5pdGlhbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbCgpIHsKLQkJdGhpcyhuZXcgSGFzaEJhZzxFPigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuY2xhc3MsIFZBTFVFUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbEl0ZXJhdG9yPEU+KHRoaXMuY29sbGVjdGlvbi5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbG93IHRoZSBjb2xsZWN0aW9uJ3MgZWxlbWVudHMgdG8gYmUgcmVwbGFjZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVzKEl0ZXJhYmxlPEU+IHZhbHVlcykgewotCQlpZiAodmFsdWVzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29sbGVjdGlvbi5jbGVhcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuY29sbGVjdGlvbiwgdmFsdWVzKTsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uY29udGFpbnMobyk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24udG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyA8VCBleHRlbmRzIE9iamVjdD4gVFtdIHRvQXJyYXkoVFtdIGEpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi50b0FycmF5KGEpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihvLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihvLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uY29udGFpbnNBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24oYywgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihjLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihjLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKChvIGluc3RhbmNlb2YgQ29sbGVjdGlvbjw/PikgJiYgKG8gaW5zdGFuY2VvZiBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PikpIHsKLQkJCUNvbGxlY3Rpb248RT4gYzEgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmNvbGxlY3Rpb24pOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlDb2xsZWN0aW9uPEU+IGMyID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oKChDb2xsZWN0aW9uPEU+KSBvKS5pdGVyYXRvcigpKTsKLQkJCXJldHVybiBjMS5lcXVhbHMoYzIpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5jb2xsZWN0aW9uKS5oYXNoQ29kZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGl0ZXJhdG9yICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgTG9jYWxJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+IHsKLQkJcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxUPiBpdGVyYXRvcjsKLQkJcHJpdmF0ZSBUIG5leHQ7Ci0KLQkJTG9jYWxJdGVyYXRvcihJdGVyYXRvcjxUPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgVCBuZXh0KCkgewotCQkJcmV0dXJuIHRoaXMubmV4dCA9IHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnJlbW92ZSgpOwotCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5maXJlSXRlbVJlbW92ZWQoVkFMVUVTLCB0aGlzLm5leHQpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUxpc3RWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOTEwOTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUxpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIExpc3RWYWx1ZU1vZGVsfSBhbmQge0BsaW5rIExpc3R9IHRoYXQgc2ltcGx5IGhvbGRzIGEKLSAqIGxpc3QgYW5kIG5vdGlmaWVzIGxpc3RlbmVycyBvZiBhbnkgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBXcml0YWJsZUxpc3RWYWx1ZU1vZGVsPEU+LCBMaXN0PEU+Ci17Ci0JLyoqIFRoZSBsaXN0LiAqLwotCXByb3RlY3RlZCBMaXN0PEU+IGxpc3Q7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTGlzdFZhbHVlTW9kZWwoTGlzdDxFPiBsaXN0KSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdCA9IGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIGFuIGVtcHR5IGluaXRpYWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTGlzdFZhbHVlTW9kZWwoKSB7Ci0JCXRoaXMobmV3IEFycmF5TGlzdDxFPigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3MsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IExvY2FsSXRlcmF0b3I8RT4odGhpcy5saXN0Lml0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IExvY2FsTGlzdEl0ZXJhdG9yPEU+KHRoaXMubGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuZ2V0KGluZGV4KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGxvdyB0aGUgbGlzdCdzIGVsZW1lbnRzIHRvIGJlIHJlcGxhY2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RWYWx1ZXMoSXRlcmFibGU8RT4gbGlzdCkgewotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3QuY2xlYXIoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmxpc3QsIGxpc3QpOwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5saXN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmNvbnRhaW5zKG8pOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgPFQgZXh0ZW5kcyBPYmplY3Q+IFRbXSB0b0FycmF5KFRbXSBhKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QudG9BcnJheShhKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1Ub0xpc3QobywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChvLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5jb250YWluc0FsbChjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdChjLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCBjLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QoYywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luTGlzdChjLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdGhpcy5jbGVhckxpc3QodGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgobyBpbnN0YW5jZW9mIExpc3Q8Pz4pICYmIChvIGluc3RhbmNlb2YgTGlzdFZhbHVlTW9kZWw8Pz4pKSB7Ci0JCQlMaXN0PEU+IGwxID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0KTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJTGlzdDxFPiBsMiA9IENvbGxlY3Rpb25Ub29scy5saXN0KCgoTGlzdDxFPikgbykuaXRlcmF0b3IoKSk7Ci0JCQlyZXR1cm4gbDEuZXF1YWxzKGwyKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5oYXNoQ29kZSgpOwotCX0KLQotCXB1YmxpYyBFIHNldChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQlyZXR1cm4gdGhpcy5zZXRJdGVtSW5MaXN0KGluZGV4LCBlbGVtZW50LCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJdGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBlbGVtZW50LCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgRSByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuaW5kZXhPZihvKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QubGFzdEluZGV4T2Yobyk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTG9jYWxMaXN0SXRlcmF0b3I8RT4odGhpcy5saXN0Lmxpc3RJdGVyYXRvcihpbmRleCkpOwotCX0KLQotCXB1YmxpYyBMaXN0PEU+IHN1Ykxpc3QoaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJLy8gVE9ETyBobW1tICB+Ymp2Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGRpdGlvbmFsIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIE1vdmUgYSBzaW5nbGUgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGEgc3ViLWxpc3Qgb2YgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHZvaWQgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQl0aGlzLm1vdmVJdGVtc0luTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgcmFuZ2Ugb2YgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QoaW5kZXgsIGxlbmd0aCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgcmFuZ2Ugb2YgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KGludCBpbmRleCwgTGlzdDxFPiBlbGVtZW50cykgewotCQl0aGlzLnNldEl0ZW1zSW5MaXN0KGluZGV4LCBlbGVtZW50cywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5saXN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaXRlcmF0b3JzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgTG9jYWxJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+IHsKLQkJcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxUPiBpdGVyYXRvcjsKLQkJcHJpdmF0ZSBpbnQgaW5kZXggPSAtMTsKLQkJcHJpdmF0ZSBUIG5leHQ7Ci0KLQkJTG9jYWxJdGVyYXRvcihJdGVyYXRvcjxUPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgVCBuZXh0KCkgewotCQkJdGhpcy5uZXh0ID0gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JCQl0aGlzLmluZGV4Kys7Ci0JCQlyZXR1cm4gdGhpcy5uZXh0OwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnJlbW92ZSgpOwotCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWwudGhpcy5maXJlSXRlbVJlbW92ZWQoTElTVF9WQUxVRVMsIHRoaXMuaW5kZXgsIHRoaXMubmV4dCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgTG9jYWxMaXN0SXRlcmF0b3I8VD4gaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8VD4gewotCQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjxUPiBpdGVyYXRvcjsKLQkJcHJpdmF0ZSBpbnQgbGFzdCA9IC0xOwotCQlwcml2YXRlIGludCBuZXh0ID0gMDsKLQkJcHJpdmF0ZSBUIGN1cnJlbnQ7Ci0KLQkJTG9jYWxMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQkJfQotCi0JCXB1YmxpYyBUIG5leHQoKSB7Ci0JCQl0aGlzLmN1cnJlbnQgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJCXRoaXMubGFzdCA9IHRoaXMubmV4dCsrOwotCQkJcmV0dXJuIHRoaXMuY3VycmVudDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JCX0KLQotCQlwdWJsaWMgVCBwcmV2aW91cygpIHsKLQkJCXRoaXMuY3VycmVudCA9IHRoaXMuaXRlcmF0b3IucHJldmlvdXMoKTsKLQkJCXRoaXMubGFzdCA9IC0tdGhpcy5uZXh0OwotCQkJcmV0dXJuIHRoaXMuY3VycmVudDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLml0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKLQkJcHVibGljIHZvaWQgc2V0KFQgbykgewotCQkJdGhpcy5pdGVyYXRvci5zZXQobyk7Ci0JCQlTaW1wbGVMaXN0VmFsdWVNb2RlbC50aGlzLmZpcmVJdGVtUmVwbGFjZWQoTElTVF9WQUxVRVMsIHRoaXMubGFzdCwgbywgdGhpcy5jdXJyZW50KTsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKLQkJcHVibGljIHZvaWQgYWRkKFQgbykgewotCQkJdGhpcy5pdGVyYXRvci5hZGQobyk7Ci0JCQlTaW1wbGVMaXN0VmFsdWVNb2RlbC50aGlzLmZpcmVJdGVtQWRkZWQoTElTVF9WQUxVRVMsIHRoaXMubmV4dCwgbyk7Ci0JCX0KLQotCQlAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRoaXMuaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQlTaW1wbGVMaXN0VmFsdWVNb2RlbC50aGlzLmZpcmVJdGVtUmVtb3ZlZChMSVNUX1ZBTFVFUywgdGhpcy5sYXN0LCB0aGlzLmN1cnJlbnQpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlMTZkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9IHRoYXQgc2ltcGx5IGhvbGRzIG9uIHRvIGFuCi0gKiBvYmplY3QgYW5kIHVzZXMgaXQgYXMgdGhlIHZhbHVlLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCS8qKiBUaGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIFQgdmFsdWU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWwoVCB2YWx1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCBhIHN0YXJ0aW5nIHZhbHVlIG9mIG51bGwuCi0JICovCi0JcHVibGljIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbCgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzLCBWQUxVRSk7Ci0JfQotCi0KLQlwdWJsaWMgVCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQlUIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0OTNhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9Ci0gKiAob3Ige0BsaW5rIExpc3RWYWx1ZU1vZGVsfSkgYmVoYXZlIGxpa2UgYSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9Ci0gKiB0aGF0IGtlZXBzIGl0cyBjb250ZW50cyBzb3J0ZWQgYW5kIG5vdGlmaWVzIGxpc3RlbmVycyBhcHByb3ByaWF0ZWx5LgotICogPHA+Ci0gKiBUaGUge0BsaW5rIENvbXBhcmF0b3J9IGNhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lOyBhbGxvd2luZyB0aGUgc2FtZQotICogYWRhcHRlciB0byBiZSB1c2VkIHdpdGggZGlmZmVyZW50IHNvcnQgY3JpdGVyaWEgKGUuZy4gd2hlbiB0aGUgdXNlcgotICogd2FudHMgdG8gc29ydCBhIGxpc3Qgb2YgZmlsZXMgZmlyc3QgYnkgbmFtZSwgdGhlbiBieSBkYXRlLCB0aGVuIGJ5IHNpemUpLgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBTaW5jZSB3ZSBvbmx5IGxpc3RlbiB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHdoZW4gd2UgaGF2ZQotICogbGlzdGVuZXJzIG91cnNlbHZlcyBhbmQgd2UgY2FuIG9ubHkgc3RheSBpbiBzeW5jaCB3aXRoIHRoZSB3cmFwcGVkCi0gKiBjb2xsZWN0aW9uIHdoaWxlIHdlIGFyZSBsaXN0ZW5pbmcgdG8gaXQsIHJlc3VsdHMgdG8gdmFyaW91cyBtZXRob2RzCi0gKiAoZS5nLiB7QGxpbmsgI3NpemUoKX0sIHtAbGluayAjZ2V0KGludCl9KSB3aWxsIGJlCi0gKiB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50IG9iamVjdHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqIAotICogQHNlZSBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotewotCS8qKgotCSAqIEEgY29tcGFyYXRvciB1c2VkIGZvciBzb3J0aW5nIHRoZSBlbGVtZW50czsKLQkgKiBpZiBpdCBpcyBudWxsLCB3ZSB1c2UgIm5hdHVyYWwgb3JkZXJpbmciLgotCSAqLwotCXByb3RlY3RlZCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3I7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCBzb3J0IGl0cyBjb250ZW50cwotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyLCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3IpIHsKLQkJc3VwZXIoY29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYW5kIHNvcnQgaXRzIGNvbnRlbnRzCi0JICogYmFzZWQgb24gdGhlIGVsZW1lbnRzJyAibmF0dXJhbCBvcmRlcmluZyIuCi0JICovCi0JcHVibGljIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKGNvbGxlY3Rpb25Ib2xkZXIsIG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0Q29tcGFyYXRvcihDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3IpIHsKLQkJdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKLQkJdGhpcy5zb3J0TGlzdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTb3J0IHRoZSBpbnRlcm5hbCBsaXN0IGJlZm9yZSB0aGUgc3VwZXJjbGFzcwotCSAqIHNlbmRzIG91dCBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkTGlzdChpbnQgc2l6ZSkgewotCQlzdXBlci5idWlsZExpc3Qoc2l6ZSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQodGhpcy5saXN0LCB0aGlzLmNvbXBhcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIHRoZSBsaXN0IHdpbGwgbmVlZCB0byBiZSBzb3J0ZWQgYWZ0ZXIgdGhlIGl0ZW0gaXMgYWRkZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkvLyBmaXJzdCBhZGQgdGhlIGl0ZW1zIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4uLgotCQlzdXBlci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJLy8gLi4udGhlbiBzb3J0IHRoZSBsaXN0Ci0JCXRoaXMuc29ydExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBzb3J0IHRoZSBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycywgaWYgbmVjZXNzYXJ5OwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNvcnRMaXN0KCkgewotCQkvLyBzYXZlIHRoZSB1bnNvcnRlZCBzdGF0ZSBvZiB0aGUgc29ydGVkIGxpc3Qgc28gd2UgY2FuIG1pbmltaXplIHRoZSBudW1iZXIgb2YgInJlcGxhY2VkIiBpdGVtcwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQXJyYXlMaXN0PEU+IHVuc29ydGVkTGlzdCA9IChBcnJheUxpc3Q8RT4pIHRoaXMubGlzdC5jbG9uZSgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHRoaXMubGlzdCwgdGhpcy5jb21wYXJhdG9yKTsKLQkJUmFuZ2UgZGlmZlJhbmdlID0gQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKHVuc29ydGVkTGlzdCwgdGhpcy5saXN0KTsKLQkJaWYgKGRpZmZSYW5nZS5zaXplID4gMCkgewotCQkJTGlzdDxFPiB1bnNvcnRlZEl0ZW1zID0gdW5zb3J0ZWRMaXN0LnN1Ykxpc3QoZGlmZlJhbmdlLnN0YXJ0LCBkaWZmUmFuZ2UuZW5kICsgMSk7Ci0JCQlMaXN0PEU+IHNvcnRlZEl0ZW1zID0gdGhpcy5saXN0LnN1Ykxpc3QoZGlmZlJhbmdlLnN0YXJ0LCBkaWZmUmFuZ2UuZW5kICsgMSk7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKExJU1RfVkFMVUVTLCBkaWZmUmFuZ2Uuc3RhcnQsIHNvcnRlZEl0ZW1zLCB1bnNvcnRlZEl0ZW1zKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTM5NTYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIHdyYXBwZXIgdGhhdCBrZWVwcyB0aGUgY29udGVudHMgb2YgYSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IHNvcnRlZAotICogYW5kIG5vdGlmaWVzIGxpc3RlbmVycyBhcHByb3ByaWF0ZWx5LgotICogPHA+Ci0gKiBUaGUge0BsaW5rIENvbXBhcmF0b3J9IGNhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lOyBhbGxvd2luZyB0aGUgc2FtZQotICogYWRhcHRlciB0byBiZSB1c2VkIHdpdGggZGlmZmVyZW50IHNvcnQgY3JpdGVyaWEgKGUuZy4gd2hlbiB0aGUgdXNlcgotICogd2FudHMgdG8gc29ydCBhIGxpc3Qgb2YgZmlsZXMgZmlyc3QgYnkgbmFtZSwgdGhlbiBieSBkYXRlLCB0aGVuIGJ5IHNpemUpLgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBTaW5jZSB3ZSBvbmx5IGxpc3RlbiB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHdoZW4gd2UgaGF2ZQotICogbGlzdGVuZXJzIG91cnNlbHZlcyBhbmQgd2UgY2FuIG9ubHkgc3RheSBpbiBzeW5jaCB3aXRoIHRoZSB3cmFwcGVkCi0gKiBjb2xsZWN0aW9uIHdoaWxlIHdlIGFyZSBsaXN0ZW5pbmcgdG8gaXQsIHJlc3VsdHMgdG8gdmFyaW91cyBtZXRob2RzCi0gKiAoZS5nLiB7QGxpbmsgI3NpemUoKX0sIHtAbGluayAjZ2V0KGludCl9KSB3aWxsIGJlIHVucHJlZGljdGFibGUgd2hlbmV2ZXIKLSAqIHdlIGRvIG5vdCBoYXZlIGFueSBsaXN0ZW5lcnMuIFRoaXMgc2hvdWxkIG5vdCBiZSB0b28gcGFpbmZ1bCBzaW5jZSwKLSAqIG1vc3QgbGlrZWx5LCBjbGllbnQgb2JqZWN0cyB3aWxsIGFsc28gYmUgbGlzdGVuZXJzLgotICogCi0gKiBAc2VlIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JZXh0ZW5kcyBMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqCi0JICogQSBjb21wYXJhdG9yIHVzZWQgZm9yIHNvcnRpbmcgdGhlIGVsZW1lbnRzOwotCSAqIGlmIGl0IGlzIG51bGwsIHdlIHVzZSAibmF0dXJhbCBvcmRlcmluZyIuCi0JICovCi0JcHJvdGVjdGVkIENvbXBhcmF0b3I8RT4gY29tcGFyYXRvcjsKLQotCS8qKgotCSAqIE91ciBpbnRlcm5hbCBsaXN0LCB3aGljaCBob2xkcyB0aGUgc2FtZSBlbGVtZW50cyBhcwotCSAqIHRoZSB3cmFwcGVkIGxpc3QsIGJ1dCBrZWVwcyB0aGVtIHNvcnRlZC4KLQkgKi8KLQkvLyB3ZSBkZWNsYXJlIHRoaXMgYW4gQXJyYXlMaXN0IHNvIHdlIGNhbiB1c2UgI2Nsb25lKCkgYW5kICNlbnN1cmVDYXBhY2l0eShpbnQpCi0JcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxFPiBzb3J0ZWRMaXN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgbGlzdCB2YWx1ZSBtb2RlbCBhbmQgc29ydCBpdHMgY29udGVudHMKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IuCi0JICovCi0JcHVibGljIFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlciwgQ29tcGFyYXRvcjxFPiBjb21wYXJhdG9yKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwotCQl0aGlzLnNvcnRlZExpc3QgPSBuZXcgQXJyYXlMaXN0PEU+KGxpc3RIb2xkZXIuc2l6ZSgpKTsKLQkJLy8gcG9zdHBvbmUgYnVpbGRpbmcgdGhlIHNvcnRlZCBsaXN0IGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgbGlzdAotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgbGlzdCB2YWx1ZSBtb2RlbCBhbmQgc29ydCBpdHMgY29udGVudHMKLQkgKiBiYXNlZCBvbiB0aGUgZWxlbWVudHMnICJuYXR1cmFsIG9yZGVyaW5nIi4KLQkgKi8KLQlwdWJsaWMgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMobGlzdEhvbGRlciwgbnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8RT4odGhpcy5zb3J0ZWRMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnNvcnRlZExpc3QuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNvcnRlZExpc3Quc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5zb3J0ZWRMaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldENvbXBhcmF0b3IoQ29tcGFyYXRvcjxFPiBjb21wYXJhdG9yKSB7Ci0JCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JCXRoaXMuc29ydExpc3QoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN5bmNoIHRoZSBzb3J0ZWQgbGlzdCAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlciwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5idWlsZFNvcnRlZExpc3QoKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSBzb3J0ZWQgbGlzdCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyCi0JCXRoaXMuc29ydGVkTGlzdC5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkU29ydGVkTGlzdCgpIHsKLQkJLy8gaWYgdGhlIG5ldyBsaXN0IGlzIGVtcHR5LCBkbyBub3RoaW5nCi0JCWludCBzaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJaWYgKHNpemUgIT0gMCkgewotCQkJdGhpcy5idWlsZFNvcnRlZExpc3Qoc2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFNvcnRlZExpc3QoaW50IHNpemUpIHsKLQkJdGhpcy5zb3J0ZWRMaXN0LmVuc3VyZUNhcGFjaXR5KHNpemUpOwotCQlmb3IgKEUgZWFjaCA6IHRoaXMubGlzdEhvbGRlcikgewotCQkJdGhpcy5zb3J0ZWRMaXN0LmFkZChlYWNoKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KHRoaXMuc29ydGVkTGlzdCwgdGhpcy5jb21wYXJhdG9yKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3QuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gZmlyc3QgYWRkIHRoZSBpdGVtcyBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuLi4KLQkJdGhpcy5hZGRJdGVtc1RvTGlzdCh0aGlzLmdldEl0ZW1zKGV2ZW50KSwgdGhpcy5zb3J0ZWRMaXN0LCBMSVNUX1ZBTFVFUyk7Ci0JCS8vIC4uLnRoZW4gc29ydCB0aGUgbGlzdCBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMKLQkJdGhpcy5zb3J0TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QodGhpcy5nZXRJdGVtcyhldmVudCksIHRoaXMuc29ydGVkTGlzdCwgTElTVF9WQUxVRVMpOwotCQkvLyBubyBzb3J0aW5nIG5lZWRlZAotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gdGhlIHdyYXBwZWQgbGlzdC4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZmlyc3QgcmVtb3ZlIHRoZSBvbGQgaXRlbXMgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLi4uCi0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdCh0aGlzLmdldE9sZEl0ZW1zKGV2ZW50KSwgdGhpcy5zb3J0ZWRMaXN0LCBMSVNUX1ZBTFVFUyk7Ci0JCS8vIHRoZW4gYWRkIHRoZSBuZXcgaXRlbXMgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLi4uCi0JCXRoaXMuYWRkSXRlbXNUb0xpc3QodGhpcy5nZXROZXdJdGVtcyhldmVudCksIHRoaXMuc29ydGVkTGlzdCwgTElTVF9WQUxVRVMpOwotCQkvLyAuLi50aGVuIHNvcnQgdGhlIGxpc3QgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMuc29ydExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0gICAgCS8vIGRvIG5vdGhpbmcgLSBzb3J0IG9yZGVyIHNob3VsZCByZW1haW4gdW5jaGFuZ2VkCi0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCB3YXMgY2xlYXJlZC4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotICAgIAl0aGlzLmNsZWFyTGlzdCh0aGlzLnNvcnRlZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhhcyBjaGFuZ2VkIGluIHNvbWUgZHJhbWF0aWMgZmFzaGlvbi4KLQkgKiBSZWJ1aWxkIG91ciBzb3J0ZWQgbGlzdCBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWludCBzaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkgewotCQkJaWYgKHRoaXMuc29ydGVkTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkvLyBubyBjaGFuZ2UKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5jbGVhckxpc3QodGhpcy5zb3J0ZWRMaXN0LCBMSVNUX1ZBTFVFUyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5zb3J0ZWRMaXN0LmlzRW1wdHkoKSkgewotCQkJCXRoaXMuYnVpbGRTb3J0ZWRMaXN0KHNpemUpOwotCQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoTElTVF9WQUxVRVMsIDAsIHRoaXMuc29ydGVkTGlzdCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc29ydGVkTGlzdC5jbGVhcigpOwotCQkJCXRoaXMuYnVpbGRTb3J0ZWRMaXN0KHNpemUpOwotCQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCB0aGlzLnNvcnRlZExpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogc29ydCB0aGUgc29ydGVkIGxpc3QgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLCBpZiBuZWNlc3Nhcnk7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc29ydExpc3QoKSB7Ci0JCS8vIHNhdmUgdGhlIHVuc29ydGVkIHN0YXRlIG9mIHRoZSBzb3J0ZWQgbGlzdCBzbyB3ZSBjYW4gbWluaW1pemUgdGhlIG51bWJlciBvZiAicmVwbGFjZWQiIGl0ZW1zCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlBcnJheUxpc3Q8RT4gdW5zb3J0ZWRMaXN0ID0gKEFycmF5TGlzdDxFPikgdGhpcy5zb3J0ZWRMaXN0LmNsb25lKCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQodGhpcy5zb3J0ZWRMaXN0LCB0aGlzLmNvbXBhcmF0b3IpOwotCQlSYW5nZSBkaWZmUmFuZ2UgPSBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UodW5zb3J0ZWRMaXN0LCB0aGlzLnNvcnRlZExpc3QpOwotCQlpZiAoZGlmZlJhbmdlLnNpemUgPiAwKSB7Ci0JCQlMaXN0PEU+IHVuc29ydGVkSXRlbXMgPSB1bnNvcnRlZExpc3Quc3ViTGlzdChkaWZmUmFuZ2Uuc3RhcnQsIGRpZmZSYW5nZS5lbmQgKyAxKTsKLQkJCUxpc3Q8RT4gc29ydGVkSXRlbXMgPSB0aGlzLnNvcnRlZExpc3Quc3ViTGlzdChkaWZmUmFuZ2Uuc3RhcnQsIGRpZmZSYW5nZS5lbmQgKyAxKTsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoTElTVF9WQUxVRVMsIGRpZmZSYW5nZS5zdGFydCwgc29ydGVkSXRlbXMsIHVuc29ydGVkSXRlbXMpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5zb3J0ZWRMaXN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlZGNmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBjb252ZXJ0Ci0gKiBpdHMgc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgaW50byBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBjaGFuZ2UKLSAqIG5vdGlmaWNhdGlvbnMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6PHVsPgotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIHRvIHJldHVybiB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotICogICAgIGN1cnJlbnQgbW9kZWwKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhdGVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLXsKLQkvKiogVGhlIHdyYXBwZWQgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIE1vZGVsIG1vZGVsOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIHN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIFN0YXRlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcihNb2RlbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVN0YXRlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLm1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLm1vZGVsLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBtb2RlbCdzIHN0YXRlIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RhdGVDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNmQwNjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSB0aGF0IGNhbiBiZSB1c2VkIGZvcgotICogcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG9uIGEgc3RhdGljIGNvbGxlY3Rpb24sIGJ1dCBzdGlsbCBhbGxvd3MgbGlzdGVuZXJzIHRvIGJlIGFkZGVkLgotICogTGlzdGVuZXJzIHdpbGwgPGVtPm5ldmVyPC9lbT4gYmUgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMsIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIG5vbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhlIGVsZW1lbnRzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBPYmplY3RbXSBlbGVtZW50czsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdGF0aWMgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKi8KLQlwdWJsaWMgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWwoRS4uLiBlbGVtZW50cykgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHMuY2xvbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdGF0aWMgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWwoSXRlcmFibGU8PyBleHRlbmRzIEU+IGVsZW1lbnRzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBBcnJheVRvb2xzLmFycmF5KGVsZW1lbnRzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5sZW5ndGg7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQkvLyB3ZSBjYW4gY2FzdCBoZXJlIHNpbmNlIG91ciBjb25zdHJ1Y3RvcnMgcmVxdWlyZSB0aGUgZWxlbWVudHMgdG8gYmUKLQkJLy8gb2YgdHlwZSBFIGFuZCBBcnJheUl0ZXJhdG9yIGlzIHJlYWQtb25seQotCQlyZXR1cm4gKEl0ZXJhdG9yPEU+KSBuZXcgQXJyYXlJdGVyYXRvcjxPYmplY3Q+KHRoaXMuZWxlbWVudHMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKEFycmF5cy50b1N0cmluZyh0aGlzLmVsZW1lbnRzKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljTGlzdFZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTdjNTMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBMaXN0VmFsdWVNb2RlbH0gdGhhdCBjYW4gYmUgdXNlZCBmb3IKLSAqIHJldHVybmluZyBhIGxpc3QgaXRlcmF0b3Igb24gYSBzdGF0aWMgbGlzdCwgYnV0IHN0aWxsIGFsbG93cyBsaXN0ZW5lcnMgdG8gYmUgYWRkZWQuCi0gKiBMaXN0ZW5lcnMgd2lsbCA8ZW0+bmV2ZXI8L2VtPiBiZSBub3RpZmllZCBvZiBhbnkgY2hhbmdlcywgYmVjYXVzZSB0aGVyZSBzaG91bGQgYmUgbm9uZS4KLSAqLwotcHVibGljIGNsYXNzIFN0YXRpY0xpc3RWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGUgZWxlbWVudHMuICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdFtdIGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0YXRpYyBsaXN0IHZhbHVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBTdGF0aWNMaXN0VmFsdWVNb2RlbChFLi4uIGVsZW1lbnRzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50cy5jbG9uZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0YXRpYyBsaXN0IHZhbHVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBTdGF0aWNMaXN0VmFsdWVNb2RlbChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gZWxlbWVudHMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IEFycmF5VG9vbHMuYXJyYXkoZWxlbWVudHMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCS8vIHdlIGNhbiBjYXN0IGhlcmUgc2luY2Ugb3VyIGNvbnN0cnVjdG9ycyByZXF1aXJlIHRoZSBlbGVtZW50cyB0byBiZQotCQkvLyBvZiB0eXBlIEUgYW5kIEFycmF5SXRlcmF0b3IgaXMgcmVhZC1vbmx5Ci0JCXJldHVybiAoSXRlcmF0b3I8RT4pIG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4odGhpcy5lbGVtZW50cyk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCS8vIHdlIGNhbiBjYXN0IGhlcmUgc2luY2Ugb3VyIGNvbnN0cnVjdG9ycyByZXF1aXJlIHRoZSBlbGVtZW50cyB0byBiZQotCQkvLyBvZiB0eXBlIEUgYW5kIEFycmF5TGlzdEl0ZXJhdG9yIGlzIHJlYWQtb25seQotCQlyZXR1cm4gKExpc3RJdGVyYXRvcjxFPikgbmV3IEFycmF5TGlzdEl0ZXJhdG9yPE9iamVjdD4odGhpcy5lbGVtZW50cyk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5sZW5ndGg7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQkvLyB3ZSBjYW4gY2FzdCBoZXJlIHNpbmNlIG91ciBjb25zdHJ1Y3RvcnMgcmVxdWlyZSB0aGUgZWxlbWVudHMgdG8gYmUKLQkJLy8gb2YgdHlwZSBFCi0JCXJldHVybiAoRSkgdGhpcy5lbGVtZW50c1tpbmRleF07Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRzLmNsb25lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoQXJyYXlzLnRvU3RyaW5nKHRoaXMuZWxlbWVudHMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxMDdlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gdGhhdCBjYW4gYmUgdXNlZCBmb3IKLSAqIHJldHVybmluZyBhIHN0YXRpYyB2YWx1ZSwgYnV0IHN0aWxsIGFsbG93cyBsaXN0ZW5lcnMgdG8gYmUgYWRkZWQuCi0gKiBMaXN0ZW5lcnMgd2lsbCA8ZW0+bmV2ZXI8L2VtPiBiZSBub3RpZmllZCBvZiBhbnkgY2hhbmdlcywgYmVjYXVzZSB0aGVyZSBzaG91bGQgYmUgbm9uZS4KLSAqLwotcHVibGljIGNsYXNzIFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0JLyoqIFRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgVCB2YWx1ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdGF0aWMgcHJvcGVydHkgdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbChUIHZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNUcmVlVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1RyZWVWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMzllMmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1RyZWVWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZVZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFRyZWVWYWx1ZU1vZGVsfSB0aGF0IGNhbiBiZSB1c2VkIGZvcgotICogcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG9uIGEgc3RhdGljIHRyZWUsIGJ1dCBzdGlsbCBhbGxvd3MgbGlzdGVuZXJzIHRvIGJlIGFkZGVkLgotICogTGlzdGVuZXJzIHdpbGwgPGVtPm5ldmVyPC9lbT4gYmUgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMsIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIG5vbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNUcmVlVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgVHJlZVZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhlIHRyZWUncyBub2Rlcy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEU+IG5vZGVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSB0cmVlIHZhbHVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIG5vZGVzLgotCSAqLwotCXB1YmxpYyBTdGF0aWNUcmVlVmFsdWVNb2RlbChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbm9kZXMpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKG5vZGVzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubm9kZXMgPSBub2RlczsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFRyZWVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBub2RlcygpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPEU+KHRoaXMubm9kZXMuaXRlcmF0b3IoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5ub2Rlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWEzYzZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIHRyYW5zZm9ybSBhIHtAbGluayBMaXN0VmFsdWVNb2RlbH0KLSAqIChvciB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9KSBpbnRvIGEgcmVhZC1vbmx5IHtAbGluayBMaXN0VmFsdWVNb2RlbH0KLSAqIHdob3NlIGl0ZW1zIGFyZSB0cmFuZm9ybWF0aW9ucyBvZiB0aGUgaXRlbXMgaW4gdGhlIHdyYXBwZWQKLSAqIHtAbGluayBMaXN0VmFsdWVNb2RlbH0uIEl0IHdpbGwga2VlcCBpdHMgY29udGVudHMgaW4gc3luY2ggd2l0aAotICogdGhlIGNvbnRlbnRzIG9mIHRoZSB3cmFwcGVkIHtAbGluayBMaXN0VmFsdWVNb2RlbH0gYW5kIG5vdGlmaWVzIGl0cwotICogbGlzdGVuZXJzIG9mIGFueSBjaGFuZ2VzLgotICogPHA+Ci0gKiBUaGUge0BsaW5rIFRyYW5zZm9ybWVyfSBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZTsgYWxsb3dpbmcgdGhlIHNhbWUKLSAqIGFkYXB0ZXIgdG8gYmUgdXNlZCB3aXRoIGRpZmZlcmVudCB0cmFuc2Zvcm1hdGlvbnMuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFNpbmNlIHdlIG9ubHkgbGlzdGVuIHRvIHRoZSB3cmFwcGVkIGxpc3Qgd2hlbiB3ZSBoYXZlCi0gKiBsaXN0ZW5lcnMgb3Vyc2VsdmVzIGFuZCB3ZSBjYW4gb25seSBzdGF5IGluIHN5bmNoIHdpdGggdGhlIHdyYXBwZWQKLSAqIGxpc3Qgd2hpbGUgd2UgYXJlIGxpc3RlbmluZyB0byBpdCwgcmVzdWx0cyB0byB2YXJpb3VzIG1ldGhvZHMKLSAqIChlLmcuIHtAbGluayAjc2l6ZSgpfSwge0BsaW5rICNnZXQoaW50KX0pIHdpbGwgYmUgdW5wcmVkaWN0YWJsZSB3aGVuZXZlcgotICogd2UgZG8gbm90IGhhdmUgYW55IGxpc3RlbmVycy4gVGhpcyBzaG91bGQgbm90IGJlIHRvbyBwYWluZnVsIHNpbmNlLAotICogbW9zdCBsaWtlbHksIGNsaWVudHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEUxLCBFMj4KLQlleHRlbmRzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFMT4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEUyPgotewotCi0JLyoqIFRoaXMgdHJhbnNmb3JtcyB0aGUgaXRlbXMsIHVubGVzcyB0aGUgc3ViY2xhc3Mgb3ZlcnJpZGVzIHtAbGluayAjdHJhbnNmb3JtSXRlbShPYmplY3QpfSkuICovCi0JcHJvdGVjdGVkIFRyYW5zZm9ybWVyPEUxLCBFMj4gdHJhbnNmb3JtZXI7Ci0KLQkvKiogVGhlIGxpc3Qgb2YgdHJhbnNmb3JtZWQgaXRlbXMuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8RTI+IHRyYW5zZm9ybWVkTGlzdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlciwgVHJhbnNmb3JtZXI8RTEsIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8RTI+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlcikgewotCQl0aGlzKGxpc3RIb2xkZXIsIFRyYW5zZm9ybWVyLk51bGwuPEUxLCBFMj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBjb2xsZWN0aW9uIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uSG9sZGVyLCBUcmFuc2Zvcm1lcjxFMSwgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RTE+KGNvbGxlY3Rpb25Ib2xkZXIpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgY29sbGVjdGlvbiBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEUxPihjb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RTI+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFMj4odGhpcy50cmFuc2Zvcm1lZExpc3QpOwotCX0KLQotCXB1YmxpYyBFMiBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVkTGlzdC5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZWRMaXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZWRMaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jaCB0aGUgdHJhbnNmb3JtZWQgbGlzdCAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0LmFkZEFsbCh0aGlzLnRyYW5zZm9ybUl0ZW1zKHRoaXMubGlzdEhvbGRlcikpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCQkvLyBjbGVhciBvdXQgdGhlIGxpc3Qgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3QuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgbGlzdCB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxFMj4gdHJhbnNmb3JtSXRlbXMoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsdm0pIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXMobHZtLCBsdm0uc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1JdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXModGhpcy5nZXRJdGVtcyhldmVudCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1JdGVtcyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXModGhpcy5nZXRJdGVtcyhldmVudCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIG5ldyBpdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxFMj4gdHJhbnNmb3JtTmV3SXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1JdGVtcyh0aGlzLmdldE5ld0l0ZW1zKGV2ZW50KSwgZXZlbnQuZ2V0SXRlbXNTaXplKCkpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgb2xkIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1PbGRJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybUl0ZW1zKHRoaXMuZ2V0T2xkSXRlbXMoZXZlbnQpLCBldmVudC5nZXRJdGVtc1NpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgaXRlbXMuCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8RTI+IHRyYW5zZm9ybUl0ZW1zKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gaXRlbXMsIGludCBzaXplKSB7Ci0JCUxpc3Q8RTI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RTI+KHNpemUpOwotCQlmb3IgKEUxIGl0ZW0gOiBpdGVtcykgewotCQkJcmVzdWx0LmFkZCh0aGlzLnRyYW5zZm9ybUl0ZW0oaXRlbSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgaXRlbS4KLQkgKi8KLQlwcm90ZWN0ZWQgRTIgdHJhbnNmb3JtSXRlbShFMSBpdGVtKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyLnRyYW5zZm9ybShpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2UgdGhlIHRyYW5zZm9ybWVyIGFuZCByZWJ1aWxkIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zZm9ybWVyKFRyYW5zZm9ybWVyPEUxLCBFMj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCQl0aGlzLnJlYnVpbGRUcmFuc2Zvcm1lZExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSBvdXIgY2FjaGUgd2l0aCB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYnVpbGRUcmFuc2Zvcm1lZExpc3QoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0LmNsZWFyKCk7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0LmFkZEFsbCh0aGlzLnRyYW5zZm9ybUl0ZW1zKHRoaXMubGlzdEhvbGRlcikpOwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy50cmFuc2Zvcm1lZExpc3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudHJhbnNmb3JtZWRMaXN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFRyYW5zZm9ybSB0aGVtLCBhZGQgdGhlbSB0byBvdXIgdHJhbnNmb3JtYXRpb24gbGlzdCwKLQkgKiBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5hZGRJdGVtc1RvTGlzdChldmVudC5nZXRJbmRleCgpLCB0aGlzLnRyYW5zZm9ybUl0ZW1zKGV2ZW50KSwgdGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBSZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbXMgZnJvbSBvdXIgdHJhbnNmb3JtYXRpb24gbGlzdAotCSAqIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJdGVtc1NpemUoKSwgdGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFJlcGxhY2UgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbXMgaW4gb3VyIHRyYW5zZm9ybWF0aW9uIGxpc3QKLQkgKiBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc2V0SXRlbXNJbkxpc3QoZXZlbnQuZ2V0SW5kZXgoKSwgdGhpcy50cmFuc2Zvcm1OZXdJdGVtcyhldmVudCksIHRoaXMudHJhbnNmb3JtZWRMaXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBNb3ZlIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW1zIGluIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0Ci0JICogYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLgotCSAqLwotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotICAgIAl0aGlzLm1vdmVJdGVtc0luTGlzdChldmVudC5nZXRUYXJnZXRJbmRleCgpLCBldmVudC5nZXRTb3VyY2VJbmRleCgpLCBldmVudC5nZXRMZW5ndGgoKSwgdGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhvbGRlciB3YXMgY2xlYXJlZC4KLQkgKiBDbGVhciBvdXIgdHJhbnNmb3JtYXRpb24gbGlzdCBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLSAgICAJdGhpcy5jbGVhckxpc3QodGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhvbGRlciBoYXMgY2hhbmdlZCBpbiBzb21lIGRyYW1hdGljIGZhc2hpb24uCi0JICogUmVidWlsZCBvdXIgdHJhbnNmb3JtYXRpb24gbGlzdCBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVidWlsZFRyYW5zZm9ybWVkTGlzdCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2ZWY3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICoge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0gKiB0byB0cmFuc2Zvcm0gdGhlIHdyYXBwZWQgdmFsdWUgYmVmb3JlIGl0IGlzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VmFsdWUoKX0uCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfSwKLSAqIGEgc3ViY2xhc3Mgb2YgPGNvZGU+VHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGNhbgotICogZWl0aGVyIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtXyhPYmplY3QpfSBvciwKLSAqIGlmIHNvbWV0aGluZyBvdGhlciB0aGFuIG51bGwgc2hvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUKLSAqIGlzIG51bGwsIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9LgotICogCi0gKiBAc2VlIFRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxUMSwgVDI+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFQxPgotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFQyPgotewotCXByb3RlY3RlZCBmaW5hbCBUcmFuc2Zvcm1lcjxUMSwgVDI+IHRyYW5zZm9ybWVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRoZSBkZWZhdWx0IHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlCi0JICoge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IG9yIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9Ci0JICogbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQxPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUMT4gdmFsdWVIb2xkZXIsIFRyYW5zZm9ybWVyPFQxLCBUMj4gdHJhbnNmb3JtZXIpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zZm9ybWVyPFQxLCBUMj4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0VHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUMiBnZXRWYWx1ZSgpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIG5lc3RlZCB2YWx1ZSBtb2RlbCBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgdmFsdWVzIGJlZm9yZSBwcm9wYWdhdGluZyB0aGUgY2hhbmdlIGV2ZW50Ci0JICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCSAgICBUMSBldmVudE9sZFZhbHVlID0gKFQxKSBldmVudC5nZXRPbGRWYWx1ZSgpOwotCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnRyYW5zZm9ybU9sZChldmVudE9sZFZhbHVlKTsKLQkgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JICAgIFQxIGV2ZW50TmV3VmFsdWUgPSAoVDEpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMudHJhbnNmb3JtTmV3KGV2ZW50TmV3VmFsdWUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGlzIGlzIGNhbGxlZCBieQotCSAqIHtAbGluayAjZ2V0VmFsdWUoKX0sCi0JICoge0BsaW5rICN0cmFuc2Zvcm1PbGQoVDEpfSwgYW5kCi0JICoge0BsaW5rICN0cmFuc2Zvcm1OZXcoVDEpfS4KLQkgKi8KLQlwcm90ZWN0ZWQgVDIgdHJhbnNmb3JtKFQxIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyLnRyYW5zZm9ybSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQsIG5vbi1udWxsLCB2YWx1ZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHJvdGVjdGVkIFQyIHRyYW5zZm9ybV8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFQxIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvbGQgdmFsdWUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIEJ5IGRlZmF1bHQsIGNhbGwge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0uCi0JICogVGhpcyBpcyBjYWxsZWQgYnkge0BsaW5rICN2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCl9LgotCSAqLwotCXByb3RlY3RlZCBUMiB0cmFuc2Zvcm1PbGQoVDEgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBCeSBkZWZhdWx0LCBjYWxsIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9LgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHtAbGluayAjdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQpfS4KLQkgKi8KLQlwcm90ZWN0ZWQgVDIgdHJhbnNmb3JtTmV3KFQxIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCB0cmFuc2Zvcm1lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB0cmFuc2Zvcm1lciB3aWxsIHJldHVybiBudWxsIGlmIHRoZSB3cmFwcGVkIHZhbHVlIGlzIG51bGwuCi0JICogSWYgdGhlIHdyYXBwZWQgdmFsdWUgaXMgbm90IG51bGwsIGl0IGlzIHRyYW5zZm9ybWVkIGJ5IGEgc3ViY2xhc3MKLQkgKiBpbXBsZW1lbnRhdGlvbiBvZiAjdHJhbnNmb3JtXyhPYmplY3QpLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxUMSwgVDI+IHsKLQkJcHVibGljIFQyIHRyYW5zZm9ybShUMSB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbC50aGlzLnRyYW5zZm9ybV8odmFsdWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiZjU0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CaWRpVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9IGFuZCB1c2VzIGEge0BsaW5rIEJpZGlUcmFuc2Zvcm1lcn0KLSAqIHRvOjx1bD4KLSAqIDxsaT50cmFuc2Zvcm0gdGhlIHdyYXBwZWQgdmFsdWUgYmVmb3JlIGl0IGlzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VmFsdWUoKX0KLSAqIDxsaT4icmV2ZXJzZS10cmFuc2Zvcm0iIHRoZSBuZXcgdmFsdWUgdGhhdCBjb21lcyBpbiB2aWEKLSAqIHtAbGluayAjc2V0VmFsdWUoT2JqZWN0KX0KLSAqIDwvdWw+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBCaWRpVHJhbnNmb3JtZXJ9LAotICogYSBzdWJjbGFzcyBvZiA8Y29kZT5UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiBjYW4KLSAqIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtXyhPYmplY3QpfSBhbmQge0BsaW5rICNyZXZlcnNlVHJhbnNmb3JtXyhPYmplY3QpfTsKLSAqIG9yLCBpZiBzb21ldGhpbmcgb3RoZXIgdGhhbiBudWxsIHNob3VsZCBiZSByZXR1cm5lZCB3aGVuIHRoZSB3cmFwcGVkIHZhbHVlCi0gKiBpcyBudWxsIG9yIHRoZSBuZXcgdmFsdWUgaXMgbnVsbCwgb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0KLSAqIGFuZCB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm0oT2JqZWN0KX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxLCBUMj4KLQlleHRlbmRzIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQxLCBUMj4KLQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQyPgotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCB0aGUgZGVmYXVsdCBiaWRpIHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtXyhPYmplY3QpfSBhbmQge0BsaW5rICNyZXZlcnNlVHJhbnNmb3JtXyhPYmplY3QpfQotCSAqIChvciB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBhbmQge0BsaW5rICNyZXZlcnNlVHJhbnNmb3JtKE9iamVjdCl9KQotCSAqIG1ldGhvZHMgaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBCaWRpVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCBiaWRpIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxPiB2YWx1ZUhvbGRlciwgQmlkaVRyYW5zZm9ybWVyPFQxLCBUMj4gdHJhbnNmb3JtZXIpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIsIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQmlkaVRyYW5zZm9ybWVyPFQxLCBUMj4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0QmlkaVRyYW5zZm9ybWVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQyIHZhbHVlKSB7Ci0JCS8vICJyZXZlcnNlLXRyYW5zZm9ybSIgdGhlIG9iamVjdCBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgdGhlIG5lc3RlZCB2YWx1ZSBtb2RlbAotCQl0aGlzLmdldFZhbHVlSG9sZGVyKCkuc2V0VmFsdWUodGhpcy5yZXZlcnNlVHJhbnNmb3JtKHZhbHVlKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqICJSZXZlcnNlLXRyYW5zZm9ybSIgdGhlIHNwZWNpZmllZCB2YWx1ZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogVGhpcyBpcyBjYWxsZWQgYnkge0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfS4KLQkgKi8KLQlwcm90ZWN0ZWQgVDEgcmV2ZXJzZVRyYW5zZm9ybShUMiB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnJldmVyc2VUcmFuc2Zvcm0odmFsdWUpOwotCX0KLQotCS8qKgotCSAqICJSZXZlcnNlLXRyYW5zZm9ybSIgdGhlIHNwZWNpZmllZCwgbm9uLTxjb2RlPm51bGw8L2NvZGU+LAotCSAqIHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgVDEgcmV2ZXJzZVRyYW5zZm9ybV8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFQyIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3JzIGFjY2VwdCBvbmx5IGEge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxPn0sCi0JICogc28gdGhpcyBjYXN0IHNob3VsZCBiZSBzYWZlLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUMT4gZ2V0VmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiAoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+KSB0aGlzLnZhbHVlSG9sZGVyOwotCX0KLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvcnMgYWNjZXB0IG9ubHkgYSB7QGxpbmsgQmlkaVRyYW5zZm9ybWVyPFQxLCBUMj59LAotCSAqIHNvIHRoaXMgY2FzdCBzaG91bGQgYmUgc2FmZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQmlkaVRyYW5zZm9ybWVyPFQxLCBUMj4gZ2V0VHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiAoQmlkaVRyYW5zZm9ybWVyPFQxLCBUMj4pIHRoaXMudHJhbnNmb3JtZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgYmlkaSB0cmFuc2Zvcm1lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBiaWRpIHRyYW5zZm9ybWVyIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqIHdyYXBwZWQgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogSWYgdGhlIHdyYXBwZWQgdmFsdWUgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LCBpdCBpcyB0cmFuc2Zvcm1lZCBieSBhIHN1YmNsYXNzCi0JICogaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9LgotCSAqIFRoZSBkZWZhdWx0IGJpZGkgdHJhbnNmb3JtZXIgd2lsbCBhbHNvIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIHRoZSBuZXcgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogSWYgdGhlIG5ldyB2YWx1ZSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4sIGl0IGlzIHJldmVyc2UtdHJhbnNmb3JtZWQKLQkgKiBieSBhIHN1YmNsYXNzIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayAjcmV2ZXJzZVRyYW5zZm9ybV8oT2JqZWN0KX0uCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIERlZmF1bHRCaWRpVHJhbnNmb3JtZXIKLQkJZXh0ZW5kcyBEZWZhdWx0VHJhbnNmb3JtZXIKLQkJaW1wbGVtZW50cyBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPgotCXsKLQkJcHVibGljIFQxIHJldmVyc2VUcmFuc2Zvcm0oVDIgdmFsdWUpIHsKLQkJCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyBudWxsIDogVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC50aGlzLnJldmVyc2VUcmFuc2Zvcm1fKHZhbHVlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyZWVBc3BlY3RBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZUFzcGVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1NjIyZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZUFzcGVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBleHRlbnNpb24gb2Yge0BsaW5rIEFzcGVjdFRyZWVWYWx1ZU1vZGVsQWRhcHRlcn0gcHJvdmlkZXMKLSAqIGJhc2ljIHRyZWUgY2hhbmdlIHN1cHBvcnQuCi0gKiBUaGlzIGNvbnZlcnRzIGEgc2V0IG9mIG9uZSBvciBtb3JlIHRyZWVzIGludG8KLSAqIGEgc2luZ2xlIHtAbGluayAjTk9ERVN9IHRyZWUuCi0gKiA8cD4KLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzIChzZWUgdGhlIGRlc2NyaXB0aW9ucwotICogaW4ge0BsaW5rIEFzcGVjdFRyZWVWYWx1ZU1vZGVsQWRhcHRlcn0pOjx1bD4KLSAqIDxsaT57QGxpbmsgI25vZGVzXygpfQotICogPGxpPntAbGluayAjbm9kZXMoKX0KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmVlQXNwZWN0QWRhcHRlcjxTIGV4dGVuZHMgTW9kZWwsIEU+Ci0JZXh0ZW5kcyBBc3BlY3RUcmVlVmFsdWVNb2RlbEFkYXB0ZXI8UywgRT4KLXsKLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgc3ViamVjdCdzIHRyZWVzIHRoYXQgd2UgdXNlIGZvciB0aGUgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIHRyZWVOYW1lczsKLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9UUkVFX05BTUVTID0gbmV3IFN0cmluZ1swXTsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgc3ViamVjdCdzIHRyZWUgYXNwZWN0cy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgVHJlZUNoYW5nZUxpc3RlbmVyIHRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIHRyZWUuCi0JICovCi0JcHJvdGVjdGVkIFRyZWVBc3BlY3RBZGFwdGVyKFN0cmluZyB0cmVlTmFtZSwgUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0cmluZ1tdIHt0cmVlTmFtZX0sIHN1YmplY3QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCB0cmVlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUFzcGVjdEFkYXB0ZXIoU3RyaW5nW10gdHJlZU5hbWVzLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFM+KHN1YmplY3QpLCB0cmVlTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdCBob2xkZXIKLQkgKiBhbmQgdHJlZXMuCi0JICovCi0JcHJvdGVjdGVkIFRyZWVBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlciwgU3RyaW5nLi4uIHRyZWVOYW1lcykgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyKTsKLQkJdGhpcy50cmVlTmFtZXMgPSB0cmVlTmFtZXM7Ci0JCXRoaXMudHJlZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdCBob2xkZXIKLQkgKiBhbmQgdHJlZXMuCi0JICovCi0JcHJvdGVjdGVkIFRyZWVBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlciwgQ29sbGVjdGlvbjxTdHJpbmc+IHRyZWVOYW1lcykgewotCQl0aGlzKHN1YmplY3RIb2xkZXIsIHRyZWVOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbdHJlZU5hbWVzLnNpemUoKV0pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIGFzcGVjdCBhZGFwdGVyIGZvciBhbiAidW5jaGFuZ2luZyIgdHJlZSBpbgotCSAqIHRoZSBzcGVjaWZpZWQgc3ViamVjdC4gVGhpcyBpcyB1c2VmdWwgZm9yIGEgdHJlZSBhc3BlY3QgdGhhdCBkb2VzIG5vdAotCSAqIGNoYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIHN1YmplY3Q7IGJ1dCB0aGUgc3ViamVjdCB3aWxsIGNoYW5nZSwgcmVzdWx0aW5nIGluCi0JICogYSBuZXcgdHJlZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgRU1QVFlfVFJFRV9OQU1FUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgc3ViamVjdCdzIHRyZWUgY2hhbmdlIGV2ZW50cyBpbnRvIFZBTFVFIHRyZWUgY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IFRyZWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlci50aGlzLm5vZGVBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlci50aGlzLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXIudGhpcy50cmVlQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlci50aGlzLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2hhbmdlIGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChUcmVlQXNwZWN0QWRhcHRlci50aGlzLnRyZWVOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgdHJlZU5hbWUgOiB0aGlzLnRyZWVOYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIHRoaXMudHJlZUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyB0cmVlTmFtZSA6IHRoaXMudHJlZU5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTm9kZUFkZGVkKGV2ZW50LmNsb25lKHRoaXMsIE5PREVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZU5vZGVSZW1vdmVkKGV2ZW50LmNsb25lKHRoaXMsIE5PREVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlVHJlZUNsZWFyZWQoZXZlbnQuY2xvbmUodGhpcywgTk9ERVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoZXZlbnQuY2xvbmUodGhpcywgTk9ERVMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyZWVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MmZlYjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyZWVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYSB0cmVlIHZhbHVlIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBjb252ZXJ0Ci0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMgaW50byBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBjaGFuZ2UKLSAqIG5vdGlmaWNhdGlvbnMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlKCl9PHA+Ci0gKiAgICAgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlLCBhcyBkZXJpdmVkIGZyb20gdGhlCi0gKiAgICAgY3VycmVudCBjb2xsZWN0aW9uIHZhbHVlCi0gKiA8L3VsPgotICogU3ViY2xhc3NlcyBtaWdodCB3YW50IHRvIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcwotICogdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSAoYnkgbm90IHJlY2FsY3VsYXRpbmcgdGhlIHZhbHVlLCBpZiBwb3NzaWJsZSk6PHVsPgotICogPGxpPntAbGluayAjbm9kZUFkZGVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjdHJlZUNsZWFyZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI3RyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJlZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotewotCS8qKiBUaGUgd3JhcHBlZCB0cmVlIHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmVlVmFsdWVNb2RlbDw/PiB0cmVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIHRyZWUgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmVlQ2hhbmdlTGlzdGVuZXIgdHJlZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogdHJlZSB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIoVHJlZVZhbHVlTW9kZWw8Pz4gdHJlZUhvbGRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLnRyZWVIb2xkZXIgPSB0cmVlSG9sZGVyOwotCQl0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyZWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLm5vZGVBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy50cmVlQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHRyZWUgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy50cmVlSG9sZGVyLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSB0cmVlIGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbF8oKSB7Ci0JCXRoaXMudHJlZUhvbGRlci5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVHJlZVZhbHVlTW9kZWwuTk9ERVMsIHRoaXMudHJlZUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnRyZWVIb2xkZXIpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogTm9kZXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCB0cmVlIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub2RlQWRkZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVBZGRFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogTm9kZXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgdHJlZSBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm9kZVJlbW92ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgdHJlZSBob2xkZXIgd2FzIGNsZWFyZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCB0cmVlIGhvbGRlciBjaGFuZ2VkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyZWVDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQXNwZWN0QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWZmY2RiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUFzcGVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgdGhhdCBwcm92aWRlcyBzdXBwb3J0IGZvciB3cmFwcGluZyBhIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0KLSAqIGFuZCBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMgdG8gPGVtPmFzcGVjdHM8L2VtPiBvZiB0aGUgPGVtPnZhbHVlPC9lbT4gY29udGFpbmVkCi0gKiBieSB0aGUge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfS4gQ2hhbmdlcyB0byB0aGUge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfSdzCi0gKiB2YWx1ZSBhcmUgYWxzbyBtb25pdG9yZWQuCi0gKiA8cD4KLSAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGEgdmFsdWUgdGhhdCBtYXkgY2hhbmdlLCBidXQgd2hvc2UgYXNwZWN0cyBjYW4gYWxzbwotICogY2hhbmdlIGluIGEgZmFzaGlvbiB0aGF0IG1pZ2h0IGJlIG9mIGludGVyZXN0IHRvIHRoZSBjbGllbnQuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IENsaWVudHMgd2lsbCBuZWVkIHRvIGxpc3RlbiBmb3IgdHdvIGRpZmZlcmVudCBjaGFuZ2Ugbm90aWZpY2F0aW9uczoKLSAqIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IHdpbGwgYmUgYmUgZmlyZWQgd2hlbiB0aGUgPGVtPnZhbHVlPC9lbT4gY2hhbmdlczsKLSAqIGEgc3RhdGUgY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgd2hlbiBhbiA8ZW0+YXNwZWN0PC9lbT4gb2YgdGhlIHZhbHVlIGNoYW5nZXMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbmVlZCB0byBvdmVycmlkZSB0d28gbWV0aG9kczo8dWw+Ci0gKiA8bGk+e0BsaW5rICNlbmdhZ2VWYWx1ZV8oKX08cD4KLSAqICAgICBiZWdpbiBsaXN0ZW5pbmcgdG8gdGhlIGFwcHJvcHJpYXRlIGFzcGVjdCBvZiB0aGUgdmFsdWUgYW5kIGNhbGwKLSAqICAgICB7QGxpbmsgI3ZhbHVlQXNwZWN0Q2hhbmdlZCgpfSB3aGVuZXZlciB0aGUgYXNwZWN0IGNoYW5nZXMKLSAqICAgICAodGhpcyB3aWxsIGZpcmUgYSBzdGF0ZSBjaGFuZ2UgZXZlbnQpCi0gKiA8bGk+e0BsaW5rICNkaXNlbmdhZ2VWYWx1ZV8oKX08cD4KLSAqICAgICBzdG9wIGxpc3RlbmluZyB0byB0aGUgYXBwcm9wcmlhdGUgYXNwZWN0IG9mIHRoZSB2YWx1ZQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbHVlQXNwZWN0QWRhcHRlcjxWPgotCWV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcjxWPgotCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4KLXsKLQkvKiogQ2FjaGUgdGhlIHZhbHVlIHNvIHdlIGNhbiBkaXNlbmdhZ2UuIE51bGwgdW50aWwgd2UgaGF2ZSBhIGxpc3RlbmVyKi8KLQlwcm90ZWN0ZWQgViB2YWx1ZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBWYWx1ZUFzcGVjdEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBhbGxvdyBib3RoIHByb3BlcnR5IGFuZCBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXJzLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VTdXBwb3J0KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFYgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShWIHZhbHVlKSB7Ci0JCXRoaXMuZ2V0VmFsdWVIb2xkZXIoKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5kaXNlbmdhZ2VWYWx1ZSgpOwotCQl0aGlzLmVuZ2FnZVZhbHVlKCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5jbG9uZSh0aGlzKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4dGVuZCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGNoZWNrIGZvciBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXJzLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB8fCBzdXBlci5oYXNMaXN0ZW5lcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlciBvdmVycmlkZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGVuZ2FnZSBhbiBhc3BlY3Qgb2YgdGhlIHZhbHVlIG1vZGVsJ3MgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCXRoaXMuZW5nYWdlVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gZGlzZW5nYWdlIGFuIGFzcGVjdCBvZiB0aGUgdmFsdWUgbW9kZWwncyB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5kaXNlbmdhZ2VWYWx1ZSgpOwotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gYW4gYXNwZWN0IG9mIHRoZSBjdXJyZW50IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlKCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpOwotCQlpZiAodGhpcy52YWx1ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmVuZ2FnZVZhbHVlXygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHNvbWUgYXNwZWN0IG9mIHRoZSBjdXJyZW50IHZhbHVlLgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHZhbHVlIGlzIG5vdCBudWxsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZVZhbHVlXygpOwotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gYW4gYXNwZWN0IG9mIHRoZSBjdXJyZW50IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlKCkgewotCQlpZiAodGhpcy52YWx1ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVZhbHVlXygpOwotCQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byBhbiBhc3BlY3Qgb2YgdGhlIGN1cnJlbnQgdmFsdWUuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgdmFsdWUgaXMgbm90IG51bGwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzZW5nYWdlVmFsdWVfKCk7Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHdoZW5ldmVyIHRoZSB2YWx1ZSdzIGFzcGVjdCBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbHVlQXNwZWN0Q2hhbmdlZCgpIHsKLQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9yIGFjY2VwdHMgb25seSBhIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH17QGNvZGU8Vj59LgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBnZXRWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPikgdGhpcy52YWx1ZUhvbGRlcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldFZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ2hhbmdlQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ2hhbmdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQ4N2VmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUNoYW5nZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TaW1wbGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIFZhbHVlQXNwZWN0QWRhcHRlcn0gdG8gbGlzdGVuIHRvIGFsbCB0aGUgYXNwZWN0cwotICogb2YgdGhlIHZhbHVlIGluIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVDaGFuZ2VBZGFwdGVyPFYgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFZhbHVlQXNwZWN0QWRhcHRlcjxWPgotewotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDaGFuZ2VMaXN0ZW5lciB2YWx1ZUFzcGVjdExpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjaGFuZ2UgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgVmFsdWVDaGFuZ2VBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy52YWx1ZUFzcGVjdExpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlQXNwZWN0TGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVBc3BlY3RMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVDaGFuZ2VBZGFwdGVyLnRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIFZhbHVlQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCXRoaXMudmFsdWUuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy52YWx1ZUFzcGVjdExpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZV8oKSB7Ci0JCXRoaXMudmFsdWUucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy52YWx1ZUFzcGVjdExpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUFzcGVjdENoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUxMmU3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgVmFsdWVBc3BlY3RBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgY29sbGVjdGlvbgotICogYXNwZWN0cyBvZiB0aGUgdmFsdWUgaW4gdGhlIHdyYXBwZWQgdmFsdWUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyPFYgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFZhbHVlQXNwZWN0QWRhcHRlcjxWPgotewotCS8qKiBUaGUgbmFtZXMgb2YgdGhlIHZhbHVlJ3MgY29sbGVjdGlvbnMgdGhhdCB3ZSBsaXN0ZW4gdG8uICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIGNvbGxlY3Rpb25OYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgdmFsdWVDb2xsZWN0aW9uTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlIGNvbGxlY3Rpb25zLgotCSAqLwotCXB1YmxpYyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlSG9sZGVyLCBTdHJpbmcuLi4gY29sbGVjdGlvbk5hbWVzKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy5jb2xsZWN0aW9uTmFtZXMgPSBjb2xsZWN0aW9uTmFtZXM7Ci0JCXRoaXMudmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVDb2xsZWN0aW9uQWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCVZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVDb2xsZWN0aW9uQWRhcHRlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGNvbGxlY3Rpb24gbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFZhbHVlQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIGNvbGxlY3Rpb25OYW1lIDogdGhpcy5jb2xsZWN0aW9uTmFtZXMpIHsKLQkJCXRoaXMudmFsdWUuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCB0aGlzLnZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJdGhpcy52YWx1ZS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMudmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVMaXN0QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlTGlzdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdiZDAzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVMaXN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIFZhbHVlQXNwZWN0QWRhcHRlcn0gdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlIGxpc3QKLSAqIGFzcGVjdHMgb2YgdGhlIHZhbHVlIGluIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVMaXN0QWRhcHRlcjxWIGV4dGVuZHMgTW9kZWw+Ci0JZXh0ZW5kcyBWYWx1ZUFzcGVjdEFkYXB0ZXI8Vj4KLXsKLQkvKiogVGhlIG5hbWVzIG9mIHRoZSB2YWx1ZSdzIGxpc3RzIHRoYXQgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBsaXN0TmFtZXM7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIHZhbHVlTGlzdExpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgVmFsdWVMaXN0QWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiB2YWx1ZUhvbGRlciwgU3RyaW5nLi4uIGxpc3ROYW1lcykgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMubGlzdE5hbWVzID0gbGlzdE5hbWVzOwotCQl0aGlzLnZhbHVlTGlzdExpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlTGlzdExpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUxpc3RMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCVZhbHVlTGlzdEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUxpc3RBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlTGlzdEFkYXB0ZXIudGhpcy5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCVZhbHVlTGlzdEFkYXB0ZXIudGhpcy5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlTGlzdEFkYXB0ZXIudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSBsaXN0IGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChWYWx1ZUxpc3RBZGFwdGVyLnRoaXMubGlzdE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBWYWx1ZUFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyBsaXN0TmFtZSA6IHRoaXMubGlzdE5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgdGhpcy52YWx1ZUxpc3RMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCXRoaXMudmFsdWUucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLnZhbHVlTGlzdExpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGFuZ2UgZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVByb3BlcnR5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODE0YjY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVByb3BlcnR5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgVmFsdWVBc3BlY3RBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUKLSAqIHByb3BlcnRpZXMgb2YgdGhlIHZhbHVlIGluIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVQcm9wZXJ0eUFkYXB0ZXI8ViBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFY+Ci17Ci0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgdmFsdWUncyBwcm9wZXJ0aWVzIHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHZhbHVlUHJvcGVydHlMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgcHJvcGVydGllcy4KLQkgKi8KLQlwdWJsaWMgVmFsdWVQcm9wZXJ0eUFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gdmFsdWVIb2xkZXIsIFN0cmluZy4uLiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy5wcm9wZXJ0eU5hbWVzID0gcHJvcGVydHlOYW1lczsKLQkJdGhpcy52YWx1ZVByb3BlcnR5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVQcm9wZXJ0eUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlUHJvcGVydHlBZGFwdGVyLnRoaXMucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIHByb3BlcnR5IGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChWYWx1ZVByb3BlcnR5QWRhcHRlci50aGlzLnByb3BlcnR5TmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBWYWx1ZUFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCXRoaXMudmFsdWUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMudmFsdWVQcm9wZXJ0eUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLnZhbHVlUHJvcGVydHlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVN0YXRlQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlU3RhdGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YTRiYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlU3RhdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgVmFsdWVBc3BlY3RBZGFwdGVyfSB0byBsaXN0ZW4gdG8gdGhlCi0gKiAic3RhdGUiIG9mIHRoZSB2YWx1ZSBpbiB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFZhbHVlU3RhdGVBZGFwdGVyPFYgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFZhbHVlQXNwZWN0QWRhcHRlcjxWPgotewotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgdmFsdWVTdGF0ZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHZhbHVlIHN0YXRlLgotCSAqLwotCXB1YmxpYyBWYWx1ZVN0YXRlQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMudmFsdWVTdGF0ZUxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlU3RhdGVMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlU3RhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZVN0YXRlQWRhcHRlci50aGlzLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSBzdGF0ZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVmFsdWVBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlXygpIHsKLQkJdGhpcy52YWx1ZS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMudmFsdWVTdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZV8oKSB7Ci0JCXRoaXMudmFsdWUucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnZhbHVlU3RhdGVMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgc3RhdGVDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVUcmVlQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlVHJlZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEzMTE2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVUcmVlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgVmFsdWVBc3BlY3RBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUKLSAqIHRyZWUgYXNwZWN0cyBvZiB0aGUgdmFsdWUgaW4gdGhlIHdyYXBwZWQgdmFsdWUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZVRyZWVBZGFwdGVyPFYgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFZhbHVlQXNwZWN0QWRhcHRlcjxWPgotewotCS8qKiBUaGUgbmFtZXMgb2YgdGhlIHZhbHVlJ3MgdHJlZXMgdGhhdCB3ZSBsaXN0ZW4gdG8uICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIHRyZWVOYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmVlQ2hhbmdlTGlzdGVuZXIgdmFsdWVUcmVlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlIHRyZWVzLgotCSAqLwotCXB1YmxpYyBWYWx1ZVRyZWVBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlSG9sZGVyLCBTdHJpbmcuLi4gdHJlZU5hbWVzKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy50cmVlTmFtZXMgPSB0cmVlTmFtZXM7Ci0JCXRoaXMudmFsdWVUcmVlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVUcmVlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlVHJlZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyZWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZVRyZWVBZGFwdGVyLnRoaXMubm9kZUFkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQkJCVZhbHVlVHJlZUFkYXB0ZXIudGhpcy5ub2RlUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQkJCVZhbHVlVHJlZUFkYXB0ZXIudGhpcy50cmVlQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZVRyZWVBZGFwdGVyLnRoaXMudHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgdHJlZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoVmFsdWVUcmVlQWRhcHRlci50aGlzLnRyZWVOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVmFsdWVBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgdHJlZU5hbWUgOiB0aGlzLnRyZWVOYW1lcykgewotCQkJdGhpcy52YWx1ZS5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIHRoaXMudmFsdWVUcmVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyB0cmVlTmFtZSA6IHRoaXMudHJlZU5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgdGhpcy52YWx1ZVRyZWVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlQWRkZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vZGVSZW1vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0cmVlQ2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0cmVlQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1dyaXRhYmxlUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxNGI0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQW4gYWRhcHRlciB0aGF0IGFsbG93cyB1cyB0byBtYWtlIGEge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfSBiZWhhdmUgbGlrZQotICogYSBzaW5nbGUtZWxlbWVudCB7QGxpbmsgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbH0sIHNvcnRhLgotICogPHA+Ci0gKiBJZiB0aGUgcHJvcGVydHkncyB2YWx1ZSBpcyBudWxsLCBhbiBlbXB0eSBpdGVyYXRvciBpcyByZXR1cm5lZAotICogKGkuZS4geW91IGNhbid0IGhhdmUgYSBjb2xsZWN0aW9uIHdpdGggYSA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50KS4KLSAqIEFsc28sIG9ubHkgYSBzaW5nbGUtZWxlbWVudCBjb2xsZWN0aW9uIGNhbiBiZSB3cml0dGVuIHRvIHRoZSBhZGFwdGVyLgotICovCi1wdWJsaWMgY2xhc3MgV3JpdGFibGVQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlpbXBsZW1lbnRzIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLXsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRvIGEgd3JpdGFibGUKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBXcml0YWJsZVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoSXRlcmFibGU8RT4gdmFsdWVzKSB7Ci0JCUl0ZXJhdG9yPEU+IHN0cmVhbSA9IHZhbHVlcy5pdGVyYXRvcigpOwotCQlpZiAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJRSBuZXdWYWx1ZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vbi1zaW5nbGV0b24gY29sbGVjdGlvbjogIiArIHZhbHVlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRoaXMuZ2V0VmFsdWVIb2xkZXIoKS5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmdldFZhbHVlSG9sZGVyKCkuc2V0VmFsdWUobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvLyBvdXIgY29uc3RydWN0b3IgdGFrZXMgb25seSB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gZ2V0VmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiAoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1dyaXRhYmxlUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkNTMzOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQW4gYWRhcHRlciB0aGF0IGFsbG93cyB1cyB0byBtYWtlIGEge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfSBiZWhhdmUgbGlrZQotICogYSBzaW5nbGUtZWxlbWVudCB7QGxpbmsgV3JpdGFibGVMaXN0VmFsdWVNb2RlbH0sIHNvcnRhLgotICogPHA+Ci0gKiBJZiB0aGUgcHJvcGVydHkncyB2YWx1ZSBpcyBudWxsLCBhbiBlbXB0eSBpdGVyYXRvciBpcyByZXR1cm5lZAotICogKGkuZS4geW91IGNhbid0IGhhdmUgYSBsaXN0IHdpdGggYSA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50KS4KLSAqIEFsc28sIG9ubHkgYSBzaW5nbGUtZWxlbWVudCBsaXN0IGNhbiBiZSB3cml0dGVuIHRvIHRoZSBhZGFwdGVyLgotICovCi1wdWJsaWMgY2xhc3MgV3JpdGFibGVQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlpbXBsZW1lbnRzIFdyaXRhYmxlTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRvIGEgd3JpdGFibGUKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBXcml0YWJsZVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRMaXN0VmFsdWVzKEl0ZXJhYmxlPEU+IGxpc3RWYWx1ZXMpIHsKLQkJSXRlcmF0b3I8RT4gc3RyZWFtID0gbGlzdFZhbHVlcy5pdGVyYXRvcigpOwotCQlpZiAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJRSBuZXdWYWx1ZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vbi1zaW5nbGV0b24gbGlzdDogIiArIGxpc3RWYWx1ZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLmdldFZhbHVlSG9sZGVyKCkuc2V0VmFsdWUobmV3VmFsdWUpOwotCQl9IGVsc2UgewotCQkJdGhpcy5nZXRWYWx1ZUhvbGRlcigpLnNldFZhbHVlKG51bGwpOwotCQl9Ci0JfQotCi0JLy8gb3VyIGNvbnN0cnVjdG9yIHRha2VzIG9ubHkgd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWxzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IGdldFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+KSB0aGlzLnZhbHVlSG9sZGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMTRiYjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpZGlTdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIHdyYXBzIGEgUHJlZmVyZW5jZSBhbmQgY29udmVydHMgaXQgaW50byBhIFByb3BlcnR5VmFsdWVNb2RlbC4KLSAqIEl0IGxpc3RlbnMgZm9yIHRoZSBhcHByb3ByaWF0ZSAicHJlZmVyZW5jZSIgY2hhbmdlcyBhbmQgY29udmVydHMgdGhlbSBpbnRvCi0gKiBWQUxVRSBwcm9wZXJ0eSBjaGFuZ2VzLiBJdCBhbHNvIGFsbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIGRlZmF1bHQgdmFsdWUKLSAqIGZvciB0aGUgUHJlZmVyZW5jZSwgd2hpY2gsIGJ5IGRlZmF1bHQsIGlzIG51bGwgKGFuZCBpcyBwcm9iYWJseSAqbm90KiBhIHZlcnkKLSAqIGdvb2QgZGVmYXVsdCkuCi0gKiAKLSAqIFlvdSBjYW4gY29uZmlndXJlIHdoZXRoZXIgdGhlIHByZWZlcmVuY2UncyB2YWx1ZSBpcyByZXR1cm5lZCwKLSAqIHVuY2hhbmdlZCwgYXMgYSBzdHJpbmcgb3IgYXMgc29tZSBvdGhlciBvYmplY3QgKGUuZy4gYW4gSW50ZWdlcikgYnkKLSAqIHNldHRpbmcgdGhlIGFkYXB0ZXIncyBjb252ZXJ0ZXIuIEludGVybmFsbHksIHRoZSBwcmVmZXJlbmNlJ3MgdmFsdWUKLSAqIGlzIHN0b3JlZCBhcyB0aGUgY29udmVydGVkIG9iamVjdDsgYW5kIHRoZSBjb252ZXJzaW9ucyB0YWtlIHBsYWNlCi0gKiB3aGVuIHJlYWRpbmcgb3Igd3JpdGluZyBmcm9tIHRoZSBwcmVmZXJlbmNlcyBub2RlIG9yIHJldHJpZXZpbmcgdGhlCi0gKiB2YWx1ZSBmcm9tIGFuIGV2ZW50IGZpcmVkIGJ5IHRoZSBwcmVmZXJlbmNlcyBub2RlLgotICogCi0gKiBUaGlzIGFkYXB0ZXIgaXMgYSBiaXQgZGlmZmVyZW50IGZyb20gbW9zdCBvdGhlciBhZGFwdGVycyBiZWNhdXNlIHRoZQotICogY2hhbmdlIGV2ZW50cyBmaXJlZCBvZmYgYnkgYSBQcmVmZXJlbmNlcyBub2RlIGFyZSBhc3luY2hyb25vdXMgZnJvbQotICogdGhlIGNoYW5nZSBpdHNlbGYuIChBYnN0cmFjdFByZWZlcmVuY2VzIHVzZXMgYW4gZXZlbnQgZGlzcGF0Y2ggZGFlbW9uLikKLSAqIEFzIGEgcmVzdWx0LCBhIGNsaWVudCBjYW4gc2V0IG91ciB2YWx1ZSB3aXRoICNzZXRWYWx1ZShPYmplY3QpIGFuZCB3ZQotICogd2lsbCByZXR1cm4gZnJvbSB0aGF0IG1ldGhvZCBiZWZvcmUgd2UgZXZlciByZWNlaXZlIG5vdGlmaWNhdGlvbiBmcm9tCi0gKiB0aGUgUHJlZmVyZW5jZXMgbm9kZSB0aGF0ICppdCogaGFzIGNoYW5nZWQuIFRoaXMgbWVhbnMgd2UgY2Fubm90Ci0gKiByZWx5IG9uIHRoYXQgZXZlbnQgdG8ga2VlcCBvdXIgaW50ZXJuYWxseSBjYWNoZWQgdmFsdWUgaW4gc3luY2guCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFByZWZlcmVuY2VzPgotCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UD4KLXsKLQkvKiogVGhlIGtleSB0byB0aGUgcHJlZmVyZW5jZSB3ZSB1c2UgZm9yIHRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGtleTsKLQotCS8qKgotCSAqIENhY2hlIHRoZSBjdXJyZW50IChvYmplY3QpIHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHNvIHdlCi0JICogY2FuIHBhc3MgYW4gIm9sZCB2YWx1ZSIgd2hlbiB3ZSBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBQIHZhbHVlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgKG9iamVjdCkgdmFsdWUgcmV0dXJuZWQgaWYgdGhlcmUgaXMgbm8gdmFsdWUKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFAgZGVmYXVsdFZhbHVlOwotCi0JLyoqCi0JICogVGhpcyBjb252ZXJ0ZXIgaXMgdXNlZCB0byBjb252ZXJ0IHRoZSBwcmVmZXJlbmNlJ3MKLQkgKiBzdHJpbmcgdmFsdWUgdG8gYW5kIGZyb20gYW4gb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCaWRpU3RyaW5nQ29udmVydGVyPFA+IGNvbnZlcnRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgYXBwcm9wcmlhdGUgcHJlZmVyZW5jZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIHByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aWxsIGJlIG51bGwuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMsIFN0cmluZyBrZXkpIHsKLQkJdGhpcyhwcmVmZXJlbmNlcywga2V5LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsKFByZWZlcmVuY2VzIHByZWZlcmVuY2VzLCBTdHJpbmcga2V5LCBQIGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKHByZWZlcmVuY2VzLCBrZXksIGRlZmF1bHRWYWx1ZSwgQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxQPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2Ugd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMsIFN0cmluZyBrZXksIFAgZGVmYXVsdFZhbHVlLCBCaWRpU3RyaW5nQ29udmVydGVyPFA+IGNvbnZlcnRlcikgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8UHJlZmVyZW5jZXM+KHByZWZlcmVuY2VzKSwga2V5LCBkZWZhdWx0VmFsdWUsIGNvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZm9yQm9vbGVhbihQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KAotCQkJCXByZWZlcmVuY2VzLAotCQkJCWtleSwKLQkJCQlkZWZhdWx0VmFsdWUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFLAotCQkJCUJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpCi0JCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2Ugd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGZvckludGVnZXIoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMsIFN0cmluZyBrZXksIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KAotCQkJCXByZWZlcmVuY2VzLAotCQkJCWtleSwKLQkJCQlJbnRlZ2VyLnZhbHVlT2YoZGVmYXVsdFZhbHVlKSwKLQkJCQlCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIuaW5zdGFuY2UoKQotCQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpbGwgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFByZWZlcmVuY2VzPiBwcmVmZXJlbmNlc0hvbGRlciwgU3RyaW5nIGtleSkgewotCQl0aGlzKHByZWZlcmVuY2VzSG9sZGVyLCBrZXksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2Ugd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcmVmZXJlbmNlcz4gcHJlZmVyZW5jZXNIb2xkZXIsIFN0cmluZyBrZXksIFAgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXMocHJlZmVyZW5jZXNIb2xkZXIsIGtleSwgZGVmYXVsdFZhbHVlLCBCaWRpU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFA+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFByZWZlcmVuY2VzPiBwcmVmZXJlbmNlc0hvbGRlciwgU3RyaW5nIGtleSwgUCBkZWZhdWx0VmFsdWUsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8UD4gY29udmVydGVyKSB7Ci0JCXN1cGVyKHByZWZlcmVuY2VzSG9sZGVyKTsKLQkJdGhpcy5rZXkgPSBrZXk7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCQl0aGlzLmNvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJdGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIG91ciB2YWx1ZSBpcyBudWxsIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIHByZWZlcmVuY2UKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgcHJlZmVyZW5jZSBoYXMgY2hhbmdlZCwgbm90aWZ5IHRoZSBsaXN0ZW5lcnMgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgcHJlZmVyZW5jZSBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUUgcHJvcGVydHkgY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByZWZlcmVuY2VDaGFuZ2UoUHJlZmVyZW5jZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbC50aGlzLnByZWZlcmVuY2VDaGFuZ2VkKGV2ZW50LmdldEtleSgpLCBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInByZWZlcmVuY2UgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2FjaGVkIChjb252ZXJ0ZWQpIHZhbHVlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgUCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIGNhY2hlZCB2YWx1ZSwgdGhlbiBzZXQgdGhlIGFwcHJvcHJpYXRlIHByZWZlcmVuY2UgdmFsdWUuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFZhbHVlKFAgdmFsdWUpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJcmV0dXJuOwkJLy8gbm8gY2hhbmdlcyBhbGxvd2VkIHdoZW4gd2UgaGF2ZSBubyBsaXN0ZW5lcnMKLQkJfQotCi0JCU9iamVjdCBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZUFzcGVjdENoYW5nZWQob2xkLCB2YWx1ZSk7Ci0KLQkJaWYgKCh0aGlzLnN1YmplY3QgIT0gbnVsbCkgJiYgdGhpcy5zaG91bGRTZXRQcmVmZXJlbmNlKG9sZCwgdmFsdWUpKSB7Ci0JCQl0aGlzLnNldFZhbHVlXyh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGdldExpc3RlbmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gVkFMVUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhWQUxVRSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFzcGVjdENoYW5nZWQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJdGhpcy5zdWJqZWN0LmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnN1YmplY3QucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBmb3Igc29tZSBvZGQgcmVhc29uLCB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gcmVtb3ZlIGEgbGlzdGVuZXIgZnJvbSBhICJkZWFkIgotCQkJLy8gcHJlZmVyZW5jZXMgbm9kZTsgc28gaGFuZGxlIHRoZSBleGNlcHRpb24gdGhhdCBnZXRzIHRocm93biBoZXJlCi0JCQlpZiAoICEgZXguZ2V0TWVzc2FnZSgpLmVxdWFscygiTm9kZSBoYXMgYmVlbiByZW1vdmVkLiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBpZiBpdCBpcyBub3QgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbiwgcmUtdGhyb3cgaXQKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJfQotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmtleSk7Ci0JCXNiLmFwcGVuZCgiID0+ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByZWZlcmVuY2UncyBrZXkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiB0aGlzLmtleTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByZWZlcmVuY2UncyB2YWx1ZS4KLQkgKiBBdCB0aGlzIHBvaW50IHRoZSBzdWJqZWN0IG1heSBiZSBudWxsLgotCSAqLwotCXByb3RlY3RlZCBQIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiAodGhpcy5zdWJqZWN0ID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRWYWx1ZV8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHByZWZlcmVuY2UsIGNvbnZlcnRlZCB0byB0aGUgYXBwcm9wcmlhdGUgb2JqZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgUCBidWlsZFZhbHVlXygpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydFRvT2JqZWN0KHRoaXMuc3ViamVjdC5nZXQodGhpcy5rZXksIHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMuZGVmYXVsdFZhbHVlKSkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgYXBwcm9wcmlhdGUgcHJlZmVyZW5jZSBhZnRlciBjb252ZXJ0aW5nIHRoZSB2YWx1ZSB0byBhIHN0cmluZy4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoYXQgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFAgdmFsdWUpIHsKLQkJdGhpcy5zdWJqZWN0LnB1dCh0aGlzLmtleSwgdGhpcy5jb252ZXJ0VG9TdHJpbmcodmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBzaG91bGQgYmUgcGFzc2VkCi0JICogdGhyb3VnaCB0byB0aGUgcHJlZmVyZW5jZS4gQnkgZGVmYXVsdCwgb25seSBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQsCi0JICogd2lsbCBpdCBiZSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgcHJlZmVyZW5jZS4gVGhpcyBhbHNvIGhhcyB0aGUKLQkgKiBlZmZlY3Qgb2Ygbm90IGNyZWF0aW5nIG5ldyBwcmVmZXJlbmNlcyBpbiB0aGUgImJhY2tpbmcgc3RvcmUiCi0JICogaWYgdGhlIG5ldyB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gdHJ1ZSBpZiB0aGV5Ci0JICogd291bGQgbGlrZSB0byBBTFdBWVMgcGFzcyB0aHJvdWdoIHRoZSBuZXcgdmFsdWUgdG8gdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2V0UHJlZmVyZW5jZShPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQob2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHN0b3JlZCBhcwotCSAqIHRoZSB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhQIG8pIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyLmNvbnZlcnRUb1N0cmluZyhvKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB2YWx1ZSBzdHJpbmcgdG8gYW4KLQkgKiBhcHByb3ByaWF0ZWx5LXR5cGVkIG9iamVjdCB0byBiZSByZXR1cm5lZCB0byB0aGUgY2xpZW50LgotCSAqLwotCXByb3RlY3RlZCBQIGNvbnZlcnRUb09iamVjdChTdHJpbmcgcykgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXIuY29udmVydFRvT2JqZWN0KHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZWZlcmVuY2VDaGFuZ2VkKFN0cmluZyBwcmVmS2V5LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCWlmIChwcmVmS2V5LmVxdWFscyh0aGlzLmtleSkpIHsKLQkJCXRoaXMucHJlZmVyZW5jZUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSB1bmRlcmx5aW5nIHByZWZlcmVuY2UgY2hhbmdlZDsgZWl0aGVyIGJlY2F1c2Ugd2UgY2hhbmdlZCBpdAotCSAqIGluICNzZXRWYWx1ZV8oT2JqZWN0KSBvciBhIHRoaXJkLXBhcnR5IGNoYW5nZWQgaXQuCi0JICogSWYgdGhpcyBpcyBjYWxsZWQgYmVjYXVzZSBvZiBvdXIgb3duIGNoYW5nZSwgdGhlIGV2ZW50IHdpbGwgYmUKLQkgKiBzd2FsbG93ZWQgYmVjYXVzZSB0aGUgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB0aGUgc2FtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcHJlZmVyZW5jZUNoYW5nZWQoKSB7Ci0JCU9iamVjdCBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JCXRoaXMuZmlyZUFzcGVjdENoYW5nZWQob2xkLCB0aGlzLnZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjA4ODE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgd3JhcHMgYSBQcmVmZXJlbmNlcyBub2RlIGFuZCBjb252ZXJ0cyBpdHMgcHJlZmVyZW5jZXMgaW50byBhCi0gKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBvZiBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVscy4gSXQgbGlzdGVucyBmb3IKLSAqICJwcmVmZXJlbmNlIiBjaGFuZ2VzIGFuZCBjb252ZXJ0cyB0aGVtIGludG8gVkFMVUUgY29sbGVjdGlvbiBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbDxQPgotCWV4dGVuZHMgQXNwZWN0QWRhcHRlcjxQcmVmZXJlbmNlcz4KLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4+Ci17Ci0KLQkvKiogQ2FjaGUgdGhlIGN1cnJlbnQgcHJlZmVyZW5jZXMsIHN0b3JlZCBpbiBtb2RlbHMgYW5kIGtleWVkIGJ5IG5hbWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PiBwcmVmZXJlbmNlczsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgcHJlZmVyZW5jZXMgbm9kZSBmb3IgYWRkZWQgb3IgcmVtb3ZlZCBwcmVmZXJlbmNlcy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIHByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZXMgbm9kZS4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbChQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcykgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8UHJlZmVyZW5jZXM+KHByZWZlcmVuY2VzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZXMgbm9kZS4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFByZWZlcmVuY2VzPiBwcmVmZXJlbmNlc0hvbGRlcikgewotCQlzdXBlcihwcmVmZXJlbmNlc0hvbGRlcik7Ci0JCXRoaXMucHJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4+KCk7Ci0JCXRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBIHByZWZlcmVuY2VzIGhhdmUgY2hhbmdlZCwgbm90aWZ5IHRoZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBidWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBwcmVmZXJlbmNlIGNoYW5nZSBldmVudHMgaW50byBWQUxVRSBjb2xsZWN0aW9uIGNoYW5nZSBldmVudHMKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKFByZWZlcmVuY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5wcmVmZXJlbmNlQ2hhbmdlZChldmVudC5nZXRLZXkoKSwgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJwcmVmZXJlbmNlIGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIHRoZSBwcmVmZXJlbmNlIG1vZGVscy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIEl0ZXJhdG9yPFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5wcmVmZXJlbmNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnByZWZlcmVuY2VzLnNpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIFZBTFVFUzsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gaXRlcmF0b3IgPSAoSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4pIG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGl0ZXJhdG9yKSk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0JCXRoaXMuc3ViamVjdC5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCQlmb3IgKEl0ZXJhdG9yPFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4+IHN0cmVhbSA9IHRoaXMucHJlZmVyZW5jZU1vZGVscygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gcHJlZmVyZW5jZU1vZGVsID0gc3RyZWFtLm5leHQoKTsKLQkJCXRoaXMucHJlZmVyZW5jZXMucHV0KHByZWZlcmVuY2VNb2RlbC5nZXRLZXkoKSwgcHJlZmVyZW5jZU1vZGVsKTsKLQkJfQotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotCQl0cnkgewotCQkJdGhpcy5zdWJqZWN0LnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJLy8gZm9yIHNvbWUgb2RkIHJlYXNvbiwgd2UgYXJlIG5vdCBhbGxvd2VkIHRvIHJlbW92ZSBhIGxpc3RlbmVyIGZyb20gYSAiZGVhZCIKLQkJCS8vIHByZWZlcmVuY2VzIG5vZGU7IHNvIGhhbmRsZSB0aGUgZXhjZXB0aW9uIHRoYXQgZ2V0cyB0aHJvd24gaGVyZQotCQkJaWYgKCAhIGV4LmdldE1lc3NhZ2UoKS5lcXVhbHMoIk5vZGUgaGFzIGJlZW4gcmVtb3ZlZC4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gaWYgaXQgaXMgbm90IHRoZSBleHBlY3RlZCBleGNlcHRpb24sIHJlLXRocm93IGl0Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5wcmVmZXJlbmNlcy5jbGVhcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuc3ViamVjdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIHRoZSBwcmVmZXJlbmNlIG1vZGVscy4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoYXQgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4+IHByZWZlcmVuY2VNb2RlbHMoKSB7Ci0JCVN0cmluZ1tdIGtleXM7Ci0JCXRyeSB7Ci0JCQlrZXlzID0gdGhpcy5zdWJqZWN0LmtleXMoKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4obmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihrZXlzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiB0cmFuc2Zvcm0oU3RyaW5nIGtleSkgewotCQkJCXJldHVybiBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMuYnVpbGRQcmVmZXJlbmNlTW9kZWwoa2V5KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byB0d2VhayB0aGUgbW9kZWwgdXNlZCB0byB3cmFwIHRoZQotCSAqIHNwZWNpZmllZCBwcmVmZXJlbmNlIChlLmcuIHRvIGN1c3RvbWl6ZSB0aGUgbW9kZWwncyBjb252ZXJ0ZXIpLgotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+IGJ1aWxkUHJlZmVyZW5jZU1vZGVsKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+KHRoaXMuc3ViamVjdEhvbGRlciwga2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcHJlZmVyZW5jZUNoYW5nZWQoU3RyaW5nIGtleSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkvLyBhIHByZWZlcmVuY2Ugd2FzIHJlbW92ZWQKLQkJCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gcHJlZmVyZW5jZU1vZGVsID0gdGhpcy5wcmVmZXJlbmNlcy5yZW1vdmUoa2V5KTsKLQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFZBTFVFUywgcHJlZmVyZW5jZU1vZGVsKTsKLQkJfSBlbHNlIGlmICggISB0aGlzLnByZWZlcmVuY2VzLmNvbnRhaW5zS2V5KGtleSkpIHsKLQkJCS8vIGEgcHJlZmVyZW5jZSB3YXMgYWRkZWQKLQkJCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gcHJlZmVyZW5jZU1vZGVsID0gdGhpcy5idWlsZFByZWZlcmVuY2VNb2RlbChrZXkpOwotCQkJdGhpcy5wcmVmZXJlbmNlcy5wdXQoa2V5LCBwcmVmZXJlbmNlTW9kZWwpOwotCQkJdGhpcy5maXJlSXRlbUFkZGVkKFZBTFVFUywgcHJlZmVyZW5jZU1vZGVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGEgcHJlZmVyZW5jZSdzIHZhbHVlIGNoYW5nZWQgLSBkbyBub3RoaW5nCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9BYnN0cmFjdFRyZWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0Fic3RyYWN0VHJlZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMmE4M2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0Fic3RyYWN0VHJlZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU1vZGVsOwotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBwcm92aWRlZCBieSB0aGUgSkRLCi0gKiAo4CBsYSBqYXZheC5zd2luZy5BYnN0cmFjdExpc3RNb2RlbCkuIFRoaXMgY2xhc3MgcHJvdmlkZXM6Ci0gKiAtIHN1cHBvcnQgZm9yIGEgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMKLSAqIC0gYSBudW1iZXIgb2YgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmlyaW5nIGV2ZW50cyBmb3IgdGhvc2UgbGlzdGVuZXJzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyZWVNb2RlbAotCWltcGxlbWVudHMgVHJlZU1vZGVsLCBTZXJpYWxpemFibGUKLXsKLQkvKiogT3VyIGxpc3RlbmVycy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdGVuZXJMaXN0ID0gbmV3IEV2ZW50TGlzdGVuZXJMaXN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBhcnRpYWwgVHJlZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZFRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKFRyZWVNb2RlbExpc3RlbmVyLmNsYXNzLCBsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcywgbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtb2RlbCdzIGN1cnJlbnQgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMuCi0JICogKFRoZXJlIHNlZW1zIHRvIGJlIGEgcGF0dGVybiBvZiBtYWtpbmcgdGhpcyB0eXBlIG9mIG1ldGhvZCBwdWJsaWM7Ci0JICogYWx0aG91Z2ggaXQgc2hvdWxkIHByb2JhYmx5IGJlIHByb3RlY3RlZC4uLi4pCi0JICovCi0JcHVibGljIFRyZWVNb2RlbExpc3RlbmVyW10gdHJlZU1vZGVsTGlzdGVuZXJzKCkgewotIAkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycyhUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgbm8gbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vVHJlZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcykgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIG1vZGVsIGhhcyBhbnkgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc1RyZWVNb2RlbExpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNOb1RyZWVNb2RlbExpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEEgc2lnbmlmaWNhbnQgcHJvcGVydHkgb2YgdGhlIG5vZGVzIGNoYW5nZWQsIGJ1dCB0aGUgbm9kZXMgdGhlbXNlbHZlcwotCSAqIGFyZSBzdGlsbCB0aGUgc2FtZSBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVOb2Rlc0NoYW5nZWQoT2JqZWN0W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVOb2Rlc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEEgc2lnbmlmaWNhbnQgcHJvcGVydHkgb2YgdGhlIG5vZGUgY2hhbmdlZCwgYnV0IHRoZSBub2RlIGl0c2VsZiBpcyB0aGUgc2FtZSBvYmplY3QuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVDaGFuZ2VkKE9iamVjdFtdIHBhdGgsIGludCBjaGlsZEluZGV4LCBPYmplY3QgY2hpbGQpIHsKLQkJdGhpcy5maXJlVHJlZU5vZGVzQ2hhbmdlZChwYXRoLCBuZXcgaW50W10ge2NoaWxkSW5kZXh9LCBuZXcgT2JqZWN0W10ge2NoaWxkfSk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBBIHNpZ25pZmljYW50IHByb3BlcnR5IG9mIHRoZSByb290IGNoYW5nZWQsIGJ1dCB0aGUgcm9vdCBpdHNlbGYgaXMgdGhlIHNhbWUgb2JqZWN0LgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVSb290Q2hhbmdlZChPYmplY3Qgcm9vdCkgewotCQl0aGlzLmZpcmVUcmVlTm9kZXNDaGFuZ2VkKG5ldyBPYmplY3RbXSB7cm9vdH0sIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVzSW5zZXJ0ZWQoT2JqZWN0W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVOb2Rlc0luc2VydGVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVJbnNlcnRlZChPYmplY3RbXSBwYXRoLCBpbnQgY2hpbGRJbmRleCwgT2JqZWN0IGNoaWxkKSB7Ci0JCXRoaXMuZmlyZVRyZWVOb2Rlc0luc2VydGVkKHBhdGgsIG5ldyBpbnRbXSB7Y2hpbGRJbmRleH0sIG5ldyBPYmplY3RbXSB7Y2hpbGR9KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVOb2Rlc1JlbW92ZWQoT2JqZWN0W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVOb2Rlc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50Ci0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVUcmVlTm9kZVJlbW92ZWQoT2JqZWN0W10gcGF0aCwgaW50IGNoaWxkSW5kZXgsIE9iamVjdCBjaGlsZCkgewotCQl0aGlzLmZpcmVUcmVlTm9kZXNSZW1vdmVkKHBhdGgsIG5ldyBpbnRbXSB7Y2hpbGRJbmRleH0sIG5ldyBPYmplY3RbXSB7Y2hpbGR9KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKE9iamVjdFtdIHBhdGgpIHsKLQkJLy8gZ3VhcmFudGVlZCB0byByZXR1cm4gYSBub24tbnVsbCBhcnJheQotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKTsKLQkJVHJlZU1vZGVsRXZlbnQgZXZlbnQgPSBudWxsOwotCQkvLyBwcm9jZXNzIHRoZSBsaXN0ZW5lcnMgbGFzdCB0byBmaXJzdCwgbm90aWZ5aW5nCi0JCS8vIHRob3NlIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gdGhpcyBldmVudAotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aC0yOyBpPj0wOyBpLT0yKSB7Ci0JCQlpZiAobGlzdGVuZXJzW2ldPT1UcmVlTW9kZWxMaXN0ZW5lci5jbGFzcykgewotCQkJCS8vIGxhemlseSBjcmVhdGUgdGhlIGV2ZW50Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJZXZlbnQgPSBuZXcgVHJlZU1vZGVsRXZlbnQodGhpcywgcGF0aCk7Ci0JCQkJfQotCQkJCSgoVHJlZU1vZGVsTGlzdGVuZXIpIGxpc3RlbmVyc1tpKzFdKS50cmVlU3RydWN0dXJlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVSb290UmVwbGFjZWQoT2JqZWN0IG5ld1Jvb3QpIHsKLQkJdGhpcy5maXJlVHJlZVN0cnVjdHVyZUNoYW5nZWQobmV3IE9iamVjdFtdIHtuZXdSb290fSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjZjYmZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuQnV0dG9uTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGxpc3RlbmVyCi0gKiAoZS5nLiBhIEpDaGVja0JveCkgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0Ci0gKiBob2xkcyBhIGJvb2xlYW4uCi0gKiAKLSAqIE1heWJlIG5vdCB0aGUgcmljaGVzdCBjbGFzcyBpbiBvdXIgdG9vbGJveCwgYnV0IGl0IHdhcyB0aGUKLSAqIHZpY3RpbSBvZiByZWZhY3RvcmluZy4uLi4gIH5ianYKLSAqLwotcHVibGljIGNsYXNzIENoZWNrQm94TW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBUb2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIKLXsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBDaGVja0JveE1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcihib29sZWFuSG9sZGVyLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0JICovCi0JcHVibGljIENoZWNrQm94TW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIpIHsKLQkJc3VwZXIoYm9vbGVhbkhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29sdW1uQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbHVtbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyYjVkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29sdW1uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0KLS8qKgotICogVGhpcyBhZGFwdGVyIGlzIHVzZWQgYnkgdGhlIHRhYmxlIG1vZGVsIGFkYXB0ZXIgdG8KLSAqIGNvbnZlcnQgYSBtb2RlbCBvYmplY3QgaW50byB0aGUgbW9kZWxzIHVzZWQgZm9yIGVhY2ggb2YKLSAqIHRoZSBjZWxscyBmb3IgdGhlIG9iamVjdCdzIGNvcnJlc3BvbmRpbmcgcm93IGluIHRoZSB0YWJsZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb2x1bW5BZGFwdGVyIHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0YWJsZS4KLQkgKiBUeXBpY2FsbHkgdGhpcyBpcyBzdGF0aWMuCi0JICovCi0JaW50IGNvbHVtbkNvdW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBjb2x1bW4uCi0JICovCi0JU3RyaW5nIGNvbHVtbk5hbWUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCBjb2x1bW4uCi0JICovCi0JQ2xhc3M8Pz4gY29sdW1uQ2xhc3MoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sdW1uIGlzIGVkaXRhYmxlLgotCSAqIFR5cGljYWxseSB0aGlzIGlzIHRoZSBzYW1lIGZvciBldmVyeSByb3cuCi0JICovCi0JYm9vbGVhbiBjb2x1bW5Jc0VkaXRhYmxlKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwgbW9kZWxzIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIHJvdyBpbiB0aGUgdGFibGUuCi0JICovCi0JV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIGNlbGxNb2RlbHMoT2JqZWN0IHN1YmplY3QpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3NWY0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIExpc3REYXRhTGlzdGVuZXIKLSAqIChlLmcuIGEgSkNvbWJvQm94KSBpbiBzeW5jaCB3aXRoIGEgTGlzdFZhbHVlTW9kZWwgKG9yIGEgQ29sbGVjdGlvblZhbHVlTW9kZWwpLgotICogRm9yIGNvbWJvIGJveGVzLCB0aGUgbW9kZWwgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzCi0gKiB0eXBpY2FsbHkgYSBkaWZmZXJlbnQgbW9kZWwgb2JqZWN0IHRoYW4gdGhlIG9uZSB0aGF0IGhvbGRzIHRoZSBjb2xsZWN0aW9uCi0gKiBvZiBjaG9pY2VzLgotICogCi0gKiBGb3IgZXhhbXBsZSwgYSBNV1JlZmVyZW5jZSAodGhlIHNlbGVjdGlvbk93bmVyKSBoYXMgYW4gYXR0cmlidXRlCi0gKiAic291cmNlVGFibGUiICh0aGUgY29sbGVjdGlvbk93bmVyKQotICogd2hpY2ggaG9sZHMgb24gdG8gYSBjb2xsZWN0aW9uIG9mIE1XRGF0YWJhc2VGaWVsZHMuIFdoZW4gdGhlIHNlbGVjdGlvbgotICogaXMgY2hhbmdlZCB0aGlzIG1vZGVsIHdpbGwga2VlcCB0aGUgbGlzdGVuZXJzIGF3YXJlIG9mIHRoZSBjaGFuZ2VzLgotICogVGhlIGluaGVyaXRlZCBsaXN0IG1vZGVsIHdpbGwga2VlcCBpdHMgbGlzdGVuZXJzIGF3YXJlIG9mIGNoYW5nZXMgdG8gdGhlCi0gKiBjb2xsZWN0aW9uIG1vZGVsCi0gKiAKLSAqIEluIGFkZGl0aW9uIHRvIHRoZSBjb2xsZWN0aW9uIGhvbGRlciByZXF1aXJlZCBieSB0aGUgc3VwZXJjbGFzcywKLSAqIGFuIGluc3RhbmNlIG9mIHRoaXMgQ29tYm9Cb3hNb2RlbCBtdXN0IGJlIHN1cHBsaWVkIHdpdGggYQotICogc2VsZWN0aW9uIGhvbGRlciwgd2hpY2ggaXMgYSBQcm9wZXJ0eVZhbHVlTW9kZWwgdGhhdCBwcm92aWRlcyBhY2Nlc3MKLSAqIHRvIHRoZSBzZWxlY3Rpb24gKHR5cGljYWxseSBhIFByb3BlcnR5QXNwZWN0QWRhcHRlcikuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21ib0JveE1vZGVsQWRhcHRlcgotCWV4dGVuZHMgTGlzdE1vZGVsQWRhcHRlcgotCWltcGxlbWVudHMgQ29tYm9Cb3hNb2RlbAotewotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGlvbkhvbGRlcjsKLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIgYW5kIHNlbGVjdGlvbiBob2xkZXIgYXJlIHJlcXVpcmVkOwotCSAqLwotCXB1YmxpYyBDb21ib0JveE1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJaWYgKHNlbGVjdGlvbkhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnNlbGVjdGlvbkhvbGRlciA9IHNlbGVjdGlvbkhvbGRlcjsKLQkJdGhpcy5zZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIGFuZCBzZWxlY3Rpb24gaG9sZGVyIGFyZSByZXF1aXJlZDsKLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8Pz4gY29sbGVjdGlvbkhvbGRlciwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBzZWxlY3Rpb25Ib2xkZXIpIHsKLQkJc3VwZXIoY29sbGVjdGlvbkhvbGRlcik7Ci0JCWlmIChzZWxlY3Rpb25Ib2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zZWxlY3Rpb25Ib2xkZXIgPSBzZWxlY3Rpb25Ib2xkZXI7Ci0JCXRoaXMuc2VsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU2VsZWN0aW9uTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0aW9uTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCS8vIG5vdGlmeSBsaXN0ZW5lcnMgdGhhdCB0aGUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkCi0JCQkJQ29tYm9Cb3hNb2RlbEFkYXB0ZXIudGhpcy5maXJlU2VsZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic2VsZWN0aW9uIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21ib0JveE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0ZWRJdGVtKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3Rpb25Ib2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEl0ZW0oT2JqZWN0IHNlbGVjdGVkSXRlbSkgewotCQl0aGlzLnNlbGVjdGlvbkhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZEl0ZW0pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gZW5nYWdlIHRoZSBzZWxlY3Rpb24gaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQl0aGlzLnNlbGVjdGlvbkhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGRpc2VuZ2FnZSB0aGUgc2VsZWN0aW9uIGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5zZWxlY3Rpb25Ib2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSB0aGUgbGlzdGVuZXJzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJLy8gSSBndWVzcyB0aGlzIHdpbGwgd29yay4uLgotCQl0aGlzLmZpcmVDb250ZW50c0NoYW5nZWQodGhpcywgLTEsIC0xKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnNlbGVjdGlvbkhvbGRlciArICI6IiArIHRoaXMubGlzdEhvbGRlcik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RhdGVTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMDgzNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RhdGVTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyRGF0ZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuU3Bpbm5lckRhdGVNb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgQ2hhbmdlTGlzdGVuZXIKLSAqIChlLmcuIGEgSlNwaW5uZXIpIGluIHN5bmNoIHdpdGggYSBQcm9wZXJ0eVZhbHVlTW9kZWwgdGhhdCBob2xkcyBhIGRhdGUuCi0gKiAKLSAqIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHN1Yi1jbGFzcyBvZiBTcGlubmVyRGF0ZU1vZGVsIGJlY2F1c2Ugb2Ygc29tZQotICogY3JhcHB5IGpkayBjb2RlLi4uLiAgfmJqdgotICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lciNjcmVhdGVFZGl0b3IoamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsKQotICogCi0gKiBJZiB0aGlzIGNsYXNzIG5lZWRzIHRvIGJlIG1vZGlmaWVkLCBpdCB3b3VsZCBiZWhvb3ZlIHVzIHRvIHJldmlldyB0aGUKLSAqIG90aGVyLCBzaW1pbGFyIGNsYXNzZXM6Ci0gKiBAc2VlIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyCi0gKiBAc2VlIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBTcGlubmVyRGF0ZU1vZGVsCi17Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlOyB1c2VkIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgZGF0ZSB2YWx1ZSBpcyBudWxsLgotCSAqIFRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IGRhdGUuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBEYXRlIGRlZmF1bHRWYWx1ZTsKLQotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGRhdGUuICovCi0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGRhdGVIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyBkYXRlLiAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBkYXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGRhdGUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUgaXMgdGhlIGN1cnJlbnQgZGF0ZS4KLQkgKi8KLQlwdWJsaWMgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBkYXRlSG9sZGVyKSB7Ci0JCXRoaXMoZGF0ZUhvbGRlciwgbmV3IERhdGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgZGF0ZSBob2xkZXIgYW5kIGRlZmF1bHQgdmFsdWUgYXJlIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGRhdGVIb2xkZXIsIERhdGUgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXMoZGF0ZUhvbGRlciwgbnVsbCwgbnVsbCwgQ2FsZW5kYXIuREFZX09GX01PTlRILCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGRhdGUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUgaXMgdGhlIGN1cnJlbnQgZGF0ZS4KLQkgKi8KLQlwdWJsaWMgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBkYXRlSG9sZGVyLCBDb21wYXJhYmxlPD8+IHN0YXJ0LCBDb21wYXJhYmxlPD8+IGVuZCwgaW50IGNhbGVuZGFyRmllbGQpIHsKLQkJdGhpcyhkYXRlSG9sZGVyLCBzdGFydCwgZW5kLCBjYWxlbmRhckZpZWxkLCBuZXcgRGF0ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBkYXRlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBkYXRlSG9sZGVyLCBDb21wYXJhYmxlPD8+IHN0YXJ0LCBDb21wYXJhYmxlPD8+IGVuZCwgaW50IGNhbGVuZGFyRmllbGQsIERhdGUgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKGRhdGVIb2xkZXIuZ2V0VmFsdWUoKSA9PSBudWxsID8gZGVmYXVsdFZhbHVlIDogKERhdGUpIGRhdGVIb2xkZXIuZ2V0VmFsdWUoKSwgc3RhcnQsIGVuZCwgY2FsZW5kYXJGaWVsZCk7Ci0JCXRoaXMuZGF0ZUhvbGRlciA9IGRhdGVIb2xkZXI7Ci0JCXRoaXMuZGF0ZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZERhdGVDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgZGF0ZQotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRGF0ZUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlEYXRlU3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLnN5bmNocm9uaXplKGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiZGF0ZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3Bpbm5lck1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBjaGVjayB3aGV0aGVyIHRoaXMgbWV0aG9kIGlzIGJlaW5nIGNhbGxlZCBiZWZvcmUgd2UgCi0JICogaGF2ZSBhbnkgbGlzdGVuZXJzLgotCSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc29tZSBjcmFwcHkgamRrIGNvZGUgZ2V0cyB0aGUgdmFsdWUKLQkgKiBmcm9tIHRoZSBtb2RlbCAqYmVmb3JlKiBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLiAgfmJqdgotCSAqIEBzZWUgamF2YXguc3dpbmcuSlNwaW5uZXIuRGVmYXVsdEVkaXRvcihqYXZheC5zd2luZy5KU3Bpbm5lcikKLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJLy8gc29ycnkgYWJvdXQgdGhpcyAibGF0ZXJhbCIgY2FsbCB0byBzdXBlciAgfmJqdgotCQkJc3VwZXIuc2V0VmFsdWUodGhpcy5zcGlubmVyVmFsdWVPZih0aGlzLmRhdGVIb2xkZXIuZ2V0VmFsdWUoKSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgZGF0ZSBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemUoT2JqZWN0KS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJc3VwZXIuc2V0VmFsdWUodmFsdWUpOwotCQl0aGlzLmRhdGVIb2xkZXIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgZGF0ZSBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMuZGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5kYXRlQ2hhbmdlTGlzdGVuZXIpOwotCQkJdGhpcy5zeW5jaHJvbml6ZSh0aGlzLmRhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBkYXRlIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMuZGF0ZUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5kYXRlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIERhdGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0byBhIG5vbi1udWxsIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3Bpbm5lclZhbHVlT2YoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRWYWx1ZSgpIDogdmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgc3Bpbm5lciB2YWx1ZSBpZiBpdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIHN5bmNocm9uaXplKE9iamVjdCB2YWx1ZSkgewotCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLnNwaW5uZXJWYWx1ZU9mKHZhbHVlKTsKLQkJLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIHNwaW5uZXIgZGF0ZSBoYXMgYWxyZWFkeSBiZWVuIHN5bmNocm9uaXplZAotCQkvLyAodmlhICNzZXRWYWx1ZSgpKQotCQlpZiAoICEgdGhpcy5nZXRWYWx1ZSgpLmVxdWFscyhuZXdWYWx1ZSkpIHsKLQkJCXRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kYXRlSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBkZWMzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRXZlbnRMaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVW5kb2FibGVFZGl0RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVW5kb2FibGVFZGl0TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRvY3VtZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuRWxlbWVudDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LlBsYWluRG9jdW1lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LlNlZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLnRleHQuRG9jdW1lbnQgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIERvY3VtZW50TGlzdGVuZXIKLSAqIChlLmcuIGEgSlRleHRGaWVsZCkgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgc3RyaW5nLgotICogCi0gKiBOQjogVGhpcyBtb2RlbCBzaG91bGQgb25seSBiZSB1c2VkIGZvciAic21hbGwiIGRvY3VtZW50czsKLSAqIGkuZS4gZG9jdW1lbnRzIHVzZWQgYnkgdGV4dCBmaWVsZHMsIG5vdCB0ZXh0IHBhbmVzLgotICogQHNlZSAjc3luY2hyb25pemVEZWxlZ2F0ZShTdHJpbmcpCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEFkYXB0ZXIKLQlpbXBsZW1lbnRzIERvY3VtZW50LCBTZXJpYWxpemFibGUKLXsKLQotCS8qKiBUaGUgZGVsZWdhdGUgZG9jdW1lbnQgd2hvc2UgYmVoYXZpb3Igd2UgImVuaGFuY2UiLiAqLwotCXByb3RlY3RlZCBmaW5hbCBEb2N1bWVudCBkZWxlZ2F0ZTsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIGZvcndhcmQgYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgZGVsZWdhdGUgZG9jdW1lbnQuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJpbmVkTGlzdGVuZXIgZGVsZWdhdGVMaXN0ZW5lcjsKLQotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBzdHJpbmcuICovCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHN0cmluZ0xpc3RlbmVyOwotCi0gICAgLyoqIFRoZSBldmVudCBsaXN0ZW5lciBsaXN0IGZvciB0aGUgZG9jdW1lbnQuICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIEV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBFdmVudExpc3RlbmVyTGlzdCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHN0cmluZyBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBEb2N1bWVudEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdIb2xkZXIsIERvY3VtZW50IGRlbGVnYXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzdHJpbmdIb2xkZXIgPT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnN0cmluZ0hvbGRlciA9IHN0cmluZ0hvbGRlcjsKLQkJLy8gcG9zdHBvbmUgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZwotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQkJdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotCQl0aGlzLnN0cmluZ0xpc3RlbmVyID0gdGhpcy5idWlsZFN0cmluZ0xpc3RlbmVyKCk7Ci0JCXRoaXMuZGVsZWdhdGVMaXN0ZW5lciA9IHRoaXMuYnVpbGREZWxlZ2F0ZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgc3RyaW5nIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBXcmFwIGEgcGxhaW4gZG9jdW1lbnQuCi0JICovCi0JcHVibGljIERvY3VtZW50QWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcikgewotCQl0aGlzKHN0cmluZ0hvbGRlciwgbmV3IFBsYWluRG9jdW1lbnQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RyaW5nTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFN0cmluZ0xpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN0cmluZ0xpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXIudGhpcy5zdHJpbmdDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInN0cmluZyBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYmluZWRMaXN0ZW5lciBidWlsZERlbGVnYXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSW50ZXJuYWxMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEb2N1bWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbHMgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50TGlzdGVuZXIoRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChEb2N1bWVudExpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRlbGVnYXRlLmFkZERvY3VtZW50TGlzdGVuZXIodGhpcy5kZWxlZ2F0ZUxpc3RlbmVyKTsKLQkJCXRoaXMuZW5nYWdlU3RyaW5nSG9sZGVyKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKERvY3VtZW50TGlzdGVuZXIuY2xhc3MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWxzIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50TGlzdGVuZXIoRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5yZW1vdmUoRG9jdW1lbnRMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChEb2N1bWVudExpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVN0cmluZ0hvbGRlcigpOwotCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMuZGVsZWdhdGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBkZWxlZ2F0ZSBkb2N1bWVudCBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVW5kb2FibGVFZGl0TGlzdGVuZXIoVW5kb2FibGVFZGl0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyQ291bnQoVW5kb2FibGVFZGl0TGlzdGVuZXIuY2xhc3MpID09IDApIHsKLQkJCXRoaXMuZGVsZWdhdGUuYWRkVW5kb2FibGVFZGl0TGlzdGVuZXIodGhpcy5kZWxlZ2F0ZUxpc3RlbmVyKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQoVW5kb2FibGVFZGl0TGlzdGVuZXIuY2xhc3MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGRlbGVnYXRlIGRvY3VtZW50IGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVVuZG9hYmxlRWRpdExpc3RlbmVyKFVuZG9hYmxlRWRpdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcykgPT0gMCkgewotCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmVVbmRvYWJsZUVkaXRMaXN0ZW5lcih0aGlzLmRlbGVnYXRlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qga2V5KSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFByb3BlcnR5KGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0UHJvcGVydHkoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXRoaXMuZGVsZWdhdGUucHV0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBtb2RlbCBzdHJpbmcgZGlyZWN0bHkuCi0JICogVGhlIHJlc3VsdGluZyBldmVudCB3aWxsIGJlIGlnbm9yZWQ6IEBzZWUgI3N5bmNocm9uaXplRGVsZWdhdGUoU3RyaW5nKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IG9mZnNldCwgaW50IGxlbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmUob2Zmc2V0LCBsZW4pOwotCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRWYWx1ZSh0aGlzLmRlbGVnYXRlLmdldFRleHQoMCwgdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKSkpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgbW9kZWwgc3RyaW5nIGRpcmVjdGx5LgotCSAqIFRoZSByZXN1bHRpbmcgZXZlbnQgd2lsbCBiZSBpZ25vcmVkOiBAc2VlICNzeW5jaHJvbml6ZURlbGVnYXRlKFN0cmluZykuCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0U3RyaW5nKGludCBvZmZzZXQsIFN0cmluZyBpbnNlcnRlZFN0cmluZywgQXR0cmlidXRlU2V0IGEpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRoaXMuZGVsZWdhdGUuaW5zZXJ0U3RyaW5nKG9mZnNldCwgaW5zZXJ0ZWRTdHJpbmcsIGEpOwotCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRWYWx1ZSh0aGlzLmRlbGVnYXRlLmdldFRleHQoMCwgdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKSkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRUZXh0KG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZXRUZXh0KGludCBvZmZzZXQsIGludCBsZW5ndGgsIFNlZ21lbnQgdHh0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aGlzLmRlbGVnYXRlLmdldFRleHQob2Zmc2V0LCBsZW5ndGgsIHR4dCk7Ci0JfQotCi0JcHVibGljIFBvc2l0aW9uIGdldFN0YXJ0UG9zaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFN0YXJ0UG9zaXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgUG9zaXRpb24gZ2V0RW5kUG9zaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldEVuZFBvc2l0aW9uKCk7Ci0JfQotCi0JcHVibGljIFBvc2l0aW9uIGNyZWF0ZVBvc2l0aW9uKGludCBvZmZzKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVQb3NpdGlvbihvZmZzKTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudFtdIGdldFJvb3RFbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0Um9vdEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgZ2V0RGVmYXVsdFJvb3RFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXREZWZhdWx0Um9vdEVsZW1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW5kZXIoUnVubmFibGUgcikgewotCQl0aGlzLmRlbGVnYXRlLnJlbmRlcihyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgRG9jdW1lbnRMaXN0ZW5lcltdIGRvY3VtZW50TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKERvY3VtZW50TGlzdGVuZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBVbmRvYWJsZUVkaXRMaXN0ZW5lcltdIHVuZG9hYmxlRWRpdExpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycyhVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgdGhpcmQgcGFydHkgaGFzIG1vZGlmaWVkIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZy4KLQkgKiBTeW5jaHJvbml6ZSB0aGUgZGVsZWdhdGUgZG9jdW1lbnQgYWNjb3JkaW5nbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RyaW5nQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZSgoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSBkb2N1bWVudCdzIGVudGlyZSB0ZXh0IHN0cmluZyB3aXRoIHRoZSBuZXcgc3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplRGVsZWdhdGUoU3RyaW5nIHMpIHsKLQkJdHJ5IHsKLQkJCWludCBsZW4gPSB0aGlzLmRlbGVnYXRlLmdldExlbmd0aCgpOwotCQkJLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGRlbGVnYXRlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCQkvLyAodmlhICNpbnNlcnRTdHJpbmcoKSBvciAjcmVtb3ZlKCkpCi0JCQlpZiAoICEgdGhpcy5kZWxlZ2F0ZS5nZXRUZXh0KDAsIGxlbikuZXF1YWxzKHMpKSB7Ci0JCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmUoMCwgbGVuKTsKLQkJCQl0aGlzLmRlbGVnYXRlLmluc2VydFN0cmluZygwLCBzLCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsJLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4uLgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3RyaW5nSG9sZGVyKCkgewotCQl0aGlzLnN0cmluZ0hvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdHJpbmdMaXN0ZW5lcik7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZSh0aGlzLnN0cmluZ0hvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdHJpbmdIb2xkZXIoKSB7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN0cmluZ0xpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxlZ2F0ZUNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBubyBuZWVkIHRvIGxhenktaW5pdGlhbGl6ZSB0aGUgZXZlbnQ7Ci0JCS8vIHdlIHdvdWxkbid0IGdldCBoZXJlIGlmIHdlIGRpZCBub3QgaGF2ZSBsaXN0ZW5lcnMuLi4KLQkJRG9jdW1lbnRFdmVudCBlZSA9IG5ldyBJbnRlcm5hbERvY3VtZW50RXZlbnQodGhpcywgZXZlbnQpOwotCQlEb2N1bWVudExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy5kb2N1bWVudExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlsaXN0ZW5lcnNbaV0uY2hhbmdlZFVwZGF0ZShlZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxlZ2F0ZUluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCS8vIG5vIG5lZWQgdG8gbGF6eS1pbml0aWFsaXplIHRoZSBldmVudDsKLQkJLy8gd2Ugd291bGRuJ3QgZ2V0IGhlcmUgaWYgd2UgZGlkIG5vdCBoYXZlIGxpc3RlbmVycy4uLgotCQlEb2N1bWVudEV2ZW50IGVlID0gbmV3IEludGVybmFsRG9jdW1lbnRFdmVudCh0aGlzLCBldmVudCk7Ci0JCURvY3VtZW50TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSB0aGlzLmRvY3VtZW50TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWxpc3RlbmVyc1tpXS5pbnNlcnRVcGRhdGUoZWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZWdhdGVSZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBubyBuZWVkIHRvIGxhenktaW5pdGlhbGl6ZSB0aGUgZXZlbnQ7Ci0JCS8vIHdlIHdvdWxkbid0IGdldCBoZXJlIGlmIHdlIGRpZCBub3QgaGF2ZSBsaXN0ZW5lcnMuLi4KLQkJRG9jdW1lbnRFdmVudCBlZSA9IG5ldyBJbnRlcm5hbERvY3VtZW50RXZlbnQodGhpcywgZXZlbnQpOwotCQlEb2N1bWVudExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy5kb2N1bWVudExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlsaXN0ZW5lcnNbaV0ucmVtb3ZlVXBkYXRlKGVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGVnYXRlVW5kb2FibGVFZGl0SGFwcGVuZWQoVW5kb2FibGVFZGl0RXZlbnQgZXZlbnQpIHsKLQkJLy8gbm8gbmVlZCB0byBsYXp5LWluaXRpYWxpemUgdGhlIGV2ZW50OwotCQkvLyB3ZSB3b3VsZG4ndCBnZXQgaGVyZSBpZiB3ZSBkaWQgbm90IGhhdmUgbGlzdGVuZXJzLi4uCi0JCVVuZG9hYmxlRWRpdEV2ZW50IGVlID0gbmV3IFVuZG9hYmxlRWRpdEV2ZW50KHRoaXMsIGV2ZW50LmdldEVkaXQoKSk7Ci0JCVVuZG9hYmxlRWRpdExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy51bmRvYWJsZUVkaXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVycy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJbGlzdGVuZXJzW2ldLnVuZG9hYmxlRWRpdEhhcHBlbmVkKGVlKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnN0cmluZ0hvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gcmVhZCBpbiBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQkJdGhpcy5zdHJpbmdMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0ZW5lcigpOwotCX0KLQotCi0vLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBpbnRlcmZhY2UgQ29tYmluZWRMaXN0ZW5lciBleHRlbmRzIERvY3VtZW50TGlzdGVuZXIsIFVuZG9hYmxlRWRpdExpc3RlbmVyLCBTZXJpYWxpemFibGUgewotCQkvLyBqdXN0IGNvbnNvbGlkYXRlIHRoZSB0d28gaW50ZXJmYWNlcwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBJbnRlcm5hbExpc3RlbmVyIGltcGxlbWVudHMgQ29tYmluZWRMaXN0ZW5lciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkVXBkYXRlKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCURvY3VtZW50QWRhcHRlci50aGlzLmRlbGVnYXRlQ2hhbmdlZFVwZGF0ZShldmVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgaW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCURvY3VtZW50QWRhcHRlci50aGlzLmRlbGVnYXRlSW5zZXJ0VXBkYXRlKGV2ZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRG9jdW1lbnRBZGFwdGVyLnRoaXMuZGVsZWdhdGVSZW1vdmVVcGRhdGUoZXZlbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHVuZG9hYmxlRWRpdEhhcHBlbmVkKFVuZG9hYmxlRWRpdEV2ZW50IGV2ZW50KSB7Ci0JCQlEb2N1bWVudEFkYXB0ZXIudGhpcy5kZWxlZ2F0ZVVuZG9hYmxlRWRpdEhhcHBlbmVkKGV2ZW50KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEludGVybmFsRG9jdW1lbnRFdmVudAotCQlleHRlbmRzIEV2ZW50T2JqZWN0Ci0JCWltcGxlbWVudHMgRG9jdW1lbnRFdmVudAotCXsKLQkJcHJvdGVjdGVkIERvY3VtZW50RXZlbnQgZGVsZWdhdGU7Ci0JCi0JCXByb3RlY3RlZCBJbnRlcm5hbERvY3VtZW50RXZlbnQoRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50RXZlbnQgZGVsZWdhdGUpIHsKLQkJCXN1cGVyKGRvY3VtZW50KTsKLQkJCXRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQkJfQotCQlwdWJsaWMgRWxlbWVudENoYW5nZSBnZXRDaGFuZ2UoRWxlbWVudCBlbGVtKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRDaGFuZ2UoZWxlbSk7Ci0JCX0KLQkJcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQkJcmV0dXJuIChEb2N1bWVudCkgdGhpcy5zb3VyY2U7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKTsKLQkJfQotCQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldE9mZnNldCgpOwotCQl9Ci0JCXB1YmxpYyBFdmVudFR5cGUgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFR5cGUoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYTA3OTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RMaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdERhdGFMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLkxpc3RNb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgTGlzdERhdGFMaXN0ZW5lcgotICogKGUuZy4gYSBKTGlzdCkgaW4gc3luY2ggd2l0aCBhIExpc3RWYWx1ZU1vZGVsIChvciBhIENvbGxlY3Rpb25WYWx1ZU1vZGVsKS4KLSAqIAotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBMaXN0TW9kZWwgKm11c3QqIGJlIHN1cHBsaWVkIHdpdGggYSB2YWx1ZSBtb2RlbCwKLSAqIHdoaWNoIGlzIGEgTGlzdFZhbHVlTW9kZWwgb24gdGhlIGJvdW5kIGxpc3Qgb3IgYSBDb2xsZWN0aW9uVmFsdWVNb2RlbAotICogb24gdGhlIGJvdW5kIGNvbGxlY3Rpb24uIFRoaXMgaXMgcmVxdWlyZWQgLSB0aGUgbGlzdCAob3IgY29sbGVjdGlvbikKLSAqIGl0c2VsZiBjYW4gYmUgbnVsbCwgYnV0IHRoZSB2YWx1ZSBtb2RlbCB0aGF0IGhvbGRzIGl0IGNhbm5vdC4KLSAqLwotcHVibGljIGNsYXNzIExpc3RNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0TGlzdE1vZGVsCi17Ci0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcjsKLQotCS8qKgotCSAqIENhY2hlIHRoZSBzaXplIG9mIHRoZSBsaXN0IGZvciAiZHJhbWF0aWMiIGNoYW5nZXMuCi0JICogQHNlZSAjbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50KQotCSAqLwotCXByb3RlY3RlZCBpbnQgbGlzdFNpemU7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBmb3J3YXJkIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yIC0gaW5pdGlhbGl6ZSBzdHVmZi4KLQkgKi8KLQlwcml2YXRlIExpc3RNb2RlbEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdFNpemUgPSAwOwotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTGlzdE1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5zZXRNb2RlbChsaXN0SG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBjb2xsZWN0aW9uIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTGlzdE1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5zZXRNb2RlbChjb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlci50aGlzLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyLnRoaXMubGlzdENsZWFyZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRFbGVtZW50QXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIuZ2V0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZExpc3REYXRhTGlzdGVuZXIoTGlzdERhdGFMaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdERhdGFMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQkJdGhpcy5saXN0U2l6ZSA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCX0KLQkJc3VwZXIuYWRkTGlzdERhdGFMaXN0ZW5lcihsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0RGF0YUxpc3RlbmVyKExpc3REYXRhTGlzdGVuZXIgbCkgewotCQlzdXBlci5yZW1vdmVMaXN0RGF0YUxpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb0xpc3REYXRhTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJCXRoaXMubGlzdFNpemUgPSAwOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHVibGljIExpc3RWYWx1ZU1vZGVsPD8+IG1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIHVuZGVybHlpbmcgbGlzdCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyKSB7Ci0JCWlmIChsaXN0SG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCWJvb2xlYW4gaGFzTGlzdGVuZXJzID0gdGhpcy5oYXNMaXN0RGF0YUxpc3RlbmVycygpOwotCQlpZiAoaGFzTGlzdGVuZXJzKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQkJdGhpcy5saXN0Q2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gbW9kZWwuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoeyAidW5jaGVja2VkIiwgInJhd3R5cGVzIiB9KQotCXB1YmxpYyB2b2lkIHNldE1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcy5zZXRNb2RlbChuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcihjb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgbm8gbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdERhdGFMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldExpc3REYXRhTGlzdGVuZXJzKCkubGVuZ3RoID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgYW55IGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0RGF0YUxpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNOb0xpc3REYXRhTGlzdGVuZXJzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCWludCBzdGFydCA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWludCBlbmQgPSBzdGFydCArIGV2ZW50LmdldEl0ZW1zU2l6ZSgpIC0gMTsKLQkJdGhpcy5maXJlSW50ZXJ2YWxBZGRlZCh0aGlzLCBzdGFydCwgZW5kKTsKLQkJdGhpcy5saXN0U2l6ZSArPSBldmVudC5nZXRJdGVtc1NpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlpbnQgc3RhcnQgPSBldmVudC5nZXRJbmRleCgpOwotCQlpbnQgZW5kID0gc3RhcnQgKyBldmVudC5nZXRJdGVtc1NpemUoKSAtIDE7Ci0JCXRoaXMuZmlyZUludGVydmFsUmVtb3ZlZCh0aGlzLCBzdGFydCwgZW5kKTsKLQkJdGhpcy5saXN0U2l6ZSAtPSBldmVudC5nZXRJdGVtc1NpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHN0YXJ0ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJaW50IGVuZCA9IHN0YXJ0ICsgZXZlbnQuZ2V0SXRlbXNTaXplKCkgLSAxOwotCQl0aGlzLmZpcmVDb250ZW50c0NoYW5nZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWludCBzdGFydCA9IE1hdGgubWluKGV2ZW50LmdldFNvdXJjZUluZGV4KCksIGV2ZW50LmdldFRhcmdldEluZGV4KCkpOwotCQlpbnQgZW5kID0gTWF0aC5tYXgoZXZlbnQuZ2V0U291cmNlSW5kZXgoKSwgZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSkgKyBldmVudC5nZXRMZW5ndGgoKSAtIDE7Ci0JCXRoaXMuZmlyZUNvbnRlbnRzQ2hhbmdlZCh0aGlzLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IHdhcyBjbGVhcmVkLgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoKSB7Ci0JCWlmICh0aGlzLmxpc3RTaXplICE9IDApIHsKLQkJCXRoaXMuZmlyZUludGVydmFsUmVtb3ZlZCh0aGlzLCAwLCB0aGlzLmxpc3RTaXplIC0gMSk7Ci0JCQl0aGlzLmxpc3RTaXplID0gMDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QgaGFzIGNoYW5nZWQgImRyYW1hdGljYWxseSIuCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMubGlzdFNpemUgIT0gMCkgewotCQkJdGhpcy5maXJlSW50ZXJ2YWxSZW1vdmVkKHRoaXMsIDAsIHRoaXMubGlzdFNpemUgLSAxKTsKLQkJfQotCQl0aGlzLmxpc3RTaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJaWYgKHRoaXMubGlzdFNpemUgIT0gMCkgewotCQkJdGhpcy5maXJlSW50ZXJ2YWxBZGRlZCh0aGlzLCAwLCB0aGlzLmxpc3RTaXplIC0gMSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E5MDYxNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuU3Bpbm5lckxpc3RNb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgQ2hhbmdlTGlzdGVuZXIKLSAqIChlLmcuIGEgSlNwaW5uZXIpIGluIHN5bmNoIHdpdGggYSBQcm9wZXJ0eVZhbHVlTW9kZWwgdGhhdCBob2xkcyBhIHZhbHVlCi0gKiBpbiB0aGUgbGlzdC4KLSAqIAotICogVGhpcyBjbGFzcyBtdXN0IGJlIGEgc3ViLWNsYXNzIG9mIFNwaW5uZXJMaXN0TW9kZWwgYmVjYXVzZSBvZiBzb21lCi0gKiBjcmFwcHkgamRrIGNvZGUuLi4uICB+Ymp2Ci0gKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyI2NyZWF0ZUVkaXRvcihqYXZheC5zd2luZy5TcGlubmVyTW9kZWwpCi0gKiAKLSAqIE5COiBUaGlzIG1vZGVsIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHZhbHVlcyB0aGF0IGhhdmUgYSByZWFzb25hYmx5Ci0gKiBpbmV4cGVuc2l2ZSAjZXF1YWxzKCkgaW1wbGVtZW50YXRpb24uCi0gKiBAc2VlICNzeW5jaHJvbml6ZShPYmplY3QpCi0gKiAKLSAqIElmIHRoaXMgY2xhc3MgbmVlZHMgdG8gYmUgbW9kaWZpZWQsIGl0IHdvdWxkIGJlaG9vdmUgdXMgdG8gcmV2aWV3IHRoZQotICogb3RoZXIsIHNpbWlsYXIgY2xhc3NlczoKLSAqIEBzZWUgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqIEBzZWUgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIFNwaW5uZXJMaXN0TW9kZWwKLXsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWU7IHVzZWQgd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCB2YWx1ZSBpcyBudWxsLgotCSAqIFRoZSBkZWZhdWx0IGlzIHRoZSBmaXJzdCBpdGVtIG9uIHRoZSBsaXN0LgotCSAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IGRlZmF1bHRWYWx1ZTsKLQotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIHZhbHVlLiAqLwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGggY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlLiAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB2YWx1ZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBtb2RlbCB2YWx1ZSBpdHNlbGYgYXMgdGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcikgewotCQl0aGlzKHZhbHVlSG9sZGVyLCB2YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgbmV3IE9iamVjdFtdIHtkZWZhdWx0VmFsdWV9LCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBVc2UgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3Qgb2YgdmFsdWVzIGFzIHRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUuCi0JICovCi0JcHVibGljIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdFtdIHZhbHVlcykgewotCQl0aGlzKHZhbHVlSG9sZGVyLCB2YWx1ZXMsIHZhbHVlc1swXSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBPYmplY3RbXSB2YWx1ZXMsIE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgQXJyYXlzLmFzTGlzdCh2YWx1ZXMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBVc2UgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3Qgb2YgdmFsdWVzIGFzIHRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUuCi0JICovCi0JcHVibGljIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIExpc3Q8T2JqZWN0PiB2YWx1ZXMpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgdmFsdWVzLCB2YWx1ZXMuZ2V0KDApKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIExpc3Q8T2JqZWN0PiB2YWx1ZXMsIE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIodmFsdWVzKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IHZhbHVlSG9sZGVyOwotCQl0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIudGhpcy5zeW5jaHJvbml6ZShldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTcGlubmVyTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBtZXRob2QgaXMgYmVpbmcgY2FsbGVkIGJlZm9yZSB3ZSAKLQkgKiBoYXZlIGFueSBsaXN0ZW5lcnMuCi0JICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIGNyYXBweSBqZGsgY29kZSBnZXRzIHRoZSB2YWx1ZQotCSAqIGZyb20gdGhlIG1vZGVsICpiZWZvcmUqIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuICB+Ymp2Ci0JICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lci5EZWZhdWx0RWRpdG9yKGphdmF4LnN3aW5nLkpTcGlubmVyKQotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCWlmICh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBzb3JyeSBhYm91dCB0aGlzICJsYXRlcmFsIiBjYWxsIHRvIHN1cGVyICB+Ymp2Ci0JCQlzdXBlci5zZXRWYWx1ZSh0aGlzLnNwaW5uZXJWYWx1ZU9mKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgdmFsdWUgZGlyZWN0bHkuCi0JICogVGhlIHJlc3VsdGluZyBldmVudCB3aWxsIGJlIGlnbm9yZWQ6IEBzZWUgI3N5bmNocm9uaXplKE9iamVjdCkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCXN1cGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZSBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMudmFsdWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudmFsdWVDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl0aGlzLnN5bmNocm9uaXplKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZSBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRvIGEgbm9uLW51bGwgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzcGlubmVyVmFsdWVPZihPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCkgOiB2YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IHRoZSBzcGlubmVyIHZhbHVlIGlmIGl0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXZvaWQgc3luY2hyb25pemUoT2JqZWN0IHZhbHVlKSB7Ci0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuc3Bpbm5lclZhbHVlT2YodmFsdWUpOwotCQkvLyBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgc3Bpbm5lciB2YWx1ZSBoYXMgYWxyZWFkeSBiZWVuIHN5bmNocm9uaXplZAotCQkvLyAodmlhICNzZXRWYWx1ZSgpKQotCQlpZiAoICEgdGhpcy5nZXRWYWx1ZSgpLmVxdWFscyhuZXdWYWx1ZSkpIHsKLQkJCXRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy52YWx1ZUhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVhZDkyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTnVtYmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5TcGlubmVyTnVtYmVyTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIENoYW5nZUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpTcGlubmVyKSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSBudW1iZXIuCi0gKiAKLSAqIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHN1Yi1jbGFzcyBvZiBTcGlubmVyTnVtYmVyTW9kZWwgYmVjYXVzZSBvZiBzb21lCi0gKiBjcmFwcHkgamRrIGNvZGUuLi4uICB+Ymp2Ci0gKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyI2NyZWF0ZUVkaXRvcihqYXZheC5zd2luZy5TcGlubmVyTW9kZWwpCi0gKiAKLSAqIElmIHRoaXMgY2xhc3MgbmVlZHMgdG8gYmUgbW9kaWZpZWQsIGl0IHdvdWxkIGJlaG9vdmUgdXMgdG8gcmV2aWV3IHRoZQotICogb3RoZXIsIHNpbWlsYXIgY2xhc3NlczoKLSAqIEBzZWUgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqIEBzZWUgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIFNwaW5uZXJOdW1iZXJNb2RlbAotewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZTsgdXNlZCB3aGVuIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwgbnVtYmVyIHZhbHVlIGlzIG51bGwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBOdW1iZXIgZGVmYXVsdFZhbHVlOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbnVtYmVyLiAqLwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGgKLQkgKiBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgbnVtYmVyLgotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBudW1iZXJDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBUaGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlIGlzIHplcm8uCi0JICogVGhlIHN0ZXAgc2l6ZSBpcyBvbmUuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIDApOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIHN0ZXAgc2l6ZSBpcyBvbmUuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIsIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIG51bGwsIG51bGwsIEludGVnZXIudmFsdWVPZigxKSwgSW50ZWdlci52YWx1ZU9mKGRlZmF1bHRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBtaW5pbXVtIHZhbHVlIGFzIHRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIsIGludCBtaW5pbXVtLCBpbnQgbWF4aW11bSwgaW50IHN0ZXBTaXplKSB7Ci0JCXRoaXMobnVtYmVySG9sZGVyLCBtaW5pbXVtLCBtYXhpbXVtLCBzdGVwU2l6ZSwgbWluaW11bSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgaW50IG1pbmltdW0sIGludCBtYXhpbXVtLCBpbnQgc3RlcFNpemUsIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIEludGVnZXIudmFsdWVPZihtaW5pbXVtKSwgSW50ZWdlci52YWx1ZU9mKG1heGltdW0pLCBJbnRlZ2VyLnZhbHVlT2Yoc3RlcFNpemUpLCBJbnRlZ2VyLnZhbHVlT2YoZGVmYXVsdFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBVc2UgdGhlIG1pbmltdW0gdmFsdWUgYXMgdGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgZG91YmxlIG1pbmltdW0sIGRvdWJsZSBtYXhpbXVtLCBkb3VibGUgc3RlcFNpemUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIG1pbmltdW0sIG1heGltdW0sIHN0ZXBTaXplLCBtaW5pbXVtKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBudW1iZXIgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbnVtYmVySG9sZGVyLCBkb3VibGUgbWluaW11bSwgZG91YmxlIG1heGltdW0sIGRvdWJsZSBzdGVwU2l6ZSwgZG91YmxlIGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKG51bWJlckhvbGRlciwgRG91YmxlLnZhbHVlT2YobWluaW11bSksIERvdWJsZS52YWx1ZU9mKG1heGltdW0pLCBEb3VibGUudmFsdWVPZihzdGVwU2l6ZSksIERvdWJsZS52YWx1ZU9mKGRlZmF1bHRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIsIENvbXBhcmFibGU8Pz4gbWluaW11bSwgQ29tcGFyYWJsZTw/PiBtYXhpbXVtLCBOdW1iZXIgc3RlcFNpemUsIE51bWJlciBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIobnVtYmVySG9sZGVyLmdldFZhbHVlKCkgPT0gbnVsbCA/IGRlZmF1bHRWYWx1ZSA6IChOdW1iZXIpIG51bWJlckhvbGRlci5nZXRWYWx1ZSgpLCBtaW5pbXVtLCBtYXhpbXVtLCBzdGVwU2l6ZSk7Ci0JCXRoaXMubnVtYmVySG9sZGVyID0gbnVtYmVySG9sZGVyOwotCQl0aGlzLm51bWJlckNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZE51bWJlckNoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBudW1iZXIKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE51bWJlckNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLnN5bmNocm9uaXplKGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibnVtYmVyIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTcGlubmVyTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBtZXRob2QgaXMgYmVpbmcgY2FsbGVkIGJlZm9yZSB3ZSAKLQkgKiBoYXZlIGFueSBsaXN0ZW5lcnMuCi0JICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIGNyYXBweSBqZGsgY29kZSBnZXRzIHRoZSB2YWx1ZQotCSAqIGZyb20gdGhlIG1vZGVsICpiZWZvcmUqIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuICB+Ymp2Ci0JICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lci5EZWZhdWx0RWRpdG9yKGphdmF4LnN3aW5nLkpTcGlubmVyKQotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCWlmICh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBzb3JyeSBhYm91dCB0aGlzICJsYXRlcmFsIiBjYWxsIHRvIHN1cGVyICB+Ymp2Ci0JCQlzdXBlci5zZXRWYWx1ZSh0aGlzLnNwaW5uZXJWYWx1ZU9mKHRoaXMubnVtYmVySG9sZGVyLmdldFZhbHVlKCkpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gdXBkYXRlIHRoZSB1bmRlcmx5aW5nIG51bWJlciBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemVEZWxlZ2F0ZShPYmplY3QpLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQlzdXBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMubnVtYmVySG9sZGVyLnNldFZhbHVlKChOdW1iZXIpIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG51bWJlciBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMubnVtYmVySG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm51bWJlckNoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuc3luY2hyb25pemUodGhpcy5udW1iZXJIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBudW1iZXIgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy5udW1iZXJIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubnVtYmVyQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIE51bWJlciBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRvIGEgbm9uLW51bGwgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzcGlubmVyVmFsdWVPZihPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCkgOiB2YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IHRoZSBzcGlubmVyIHZhbHVlIGlmIGl0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXZvaWQgc3luY2hyb25pemUoT2JqZWN0IHZhbHVlKSB7Ci0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuc3Bpbm5lclZhbHVlT2YodmFsdWUpOwotCQkvLyBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgZGF0ZSBoYXMgYWxyZWFkeSBiZWVuIHN5bmNocm9uaXplZAotCQkvLyAodmlhICNzZXRWYWx1ZSgpKQotCQlpZiAoICEgdGhpcy5nZXRWYWx1ZSgpLmVxdWFscyhuZXdWYWx1ZSkpIHsKLQkJCXRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5udW1iZXJIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL09iamVjdExpc3RTZWxlY3Rpb25Nb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL09iamVjdExpc3RTZWxlY3Rpb25Nb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWYyNDc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0RGF0YUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3REYXRhTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLQotLyoqCi0gKiBUaGlzIExpc3RTZWxlY3Rpb25Nb2RlbCBpcyBhd2FyZSBvZiB0aGUgTGlzdE1vZGVsIGFuZAotICogcHJvdmlkZXMgY29udmVuaWVuY2UgbWV0aG9kcyB0byBhY2Nlc3MgYW5kIHNldCB0aGUKLSAqIHNlbGVjdGVkICpvYmplY3RzKiwgYXMgb3Bwb3NlZCB0byB0aGUgc2VsZWN0ZWQgKmluZGV4ZXMqLgotICovCi1wdWJsaWMgY2xhc3MgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsCi0JZXh0ZW5kcyBEZWZhdWx0TGlzdFNlbGVjdGlvbk1vZGVsCi17Ci0JLyoqIFRoZSBsaXN0IG1vZGVsIHJlZmVyZW5jZWQgYnkgdGhlIGxpc3Qgc2VsZWN0aW9uIG1vZGVsLiAqLwotCXByaXZhdGUgZmluYWwgTGlzdE1vZGVsIGxpc3RNb2RlbDsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIGNsZWFyIHRoZSBzZWxlY3Rpb24gd2hlbiB0aGUgbGlzdCBtb2RlbCBoYXMgY2hhbmdlZC4gKi8KLQlwcml2YXRlIGZpbmFsIExpc3REYXRhTGlzdGVuZXIgbGlzdERhdGFMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBzZWxlY3Rpb24gbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsKExpc3RNb2RlbCBsaXN0TW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0TW9kZWwgPSBsaXN0TW9kZWw7Ci0JCXRoaXMubGlzdERhdGFMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0RGF0YUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgTGlzdERhdGFMaXN0ZW5lciBidWlsZExpc3REYXRhTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdERhdGFMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGludGVydmFsQWRkZWQoTGlzdERhdGFFdmVudCBldmVudCkgewotCQkJCS8vIHRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBzZWxlY3Rpb24KLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGludGVydmFsUmVtb3ZlZChMaXN0RGF0YUV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gdGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlbGVjdGlvbgotCQkJfQotCQkJcHVibGljIHZvaWQgY29udGVudHNDaGFuZ2VkKExpc3REYXRhRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwudGhpcy5saXN0TW9kZWxDb250ZW50c0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBkYXRhIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFR5cGljYWxseSwgdGhlIHNlbGVjdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIGNsZWFyZWQgd2hlbiB0aGUKLQkgKiBjb250ZW50cyBvZiB0aGUgbGlzdCBoYXZlIGNoYW5nZWQuIE1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBqdXN0Ci0JICogbWVhbnMgYW4gaXRlbSBoYXMgY2hhbmdlZCBpbiBhIHdheSB0aGF0IGFmZmVjdHMgaXRzIGRpc3BsYXkgc3RyaW5nCi0JICogb3IgaWNvbi4gV2UgdHlwaWNhbGx5IG9ubHkgdXNlIHRoZSBjbGFzcyBmb3IgZWRpdHMgaW52b2x2aW5nCi0JICogc2luZ2xlIHNlbGVjdGlvbi4KLQkgKiBBIHN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGUgc2VsZWN0aW9uCi0JICogc2hvdWxkIGJlIGNsZWFyZWQgYmVjYXVzZSBhIGNoYW5nZSBjb3VsZCBtZWFuIHRoZSBzZWxlY3Rpb24gaXMgaW52YWxpZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0TW9kZWxDb250ZW50c0NoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3REYXRhRXZlbnQgZXZlbnQpIHsKLQkJLyoqdGhpcy5jbGVhclNlbGVjdGlvbigpOyovCi0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RTZWxlY3Rpb25Nb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoTGlzdFNlbGVjdGlvbkxpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0U2VsZWN0aW9uTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMubGlzdE1vZGVsLmFkZExpc3REYXRhTGlzdGVuZXIodGhpcy5saXN0RGF0YUxpc3RlbmVyKTsKLQkJfQotCQlzdXBlci5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIobCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdFNlbGVjdGlvbkxpc3RlbmVyKExpc3RTZWxlY3Rpb25MaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3RTZWxlY3Rpb25MaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0U2VsZWN0aW9uTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMubGlzdE1vZGVsLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIodGhpcy5saXN0RGF0YUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIG5vIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3RTZWxlY3Rpb25MaXN0ZW5lcnMoKSB7CS8vIHByaXZhdGUtcHJvdGVjdGVkCi0JCXJldHVybiB0aGlzLmdldExpc3RTZWxlY3Rpb25MaXN0ZW5lcnMoKS5sZW5ndGggPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgbW9kZWwgcmVmZXJlbmNlZCBieSB0aGUgbGlzdCBzZWxlY3Rpb24gbW9kZWwuCi0JICovCi0JcHVibGljIExpc3RNb2RlbCBnZXRMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgaW50IHNlbGVjdGVkVmFsdWVzU2l6ZSgpIHsKLQkJaW50IG1pbiA9IHRoaXMuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKTsKLQkJaW50IG1heCA9IHRoaXMuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKTsKLQotCQlpZiAoKG1pbiA8IDApIHx8IChtYXggPCAwKSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpbnQgbiA9IDA7Ci0JCWludCBjb3VudCA9IHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0U2l6ZSgpOwotCQlmb3IgKGludCBpID0gbWluOyBpIDw9IG1heDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5pc1NlbGVjdGVkSW5kZXgoaSkgJiYgKGkgPCBjb3VudCkpIHsKLQkJCQluKys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBzZWxlY3RlZCB2YWx1ZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBPYmplY3Qgc2VsZWN0ZWRWYWx1ZSgpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5nZXRNaW5TZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICh0aGlzLmdldExpc3RNb2RlbCgpLmdldFNpemUoKSA8PSBpbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHNlbGVjdGVkIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gc2VsZWN0ZWRWYWx1ZXMoKSB7Ci0JCWludCBtaW4gPSB0aGlzLmdldE1pblNlbGVjdGlvbkluZGV4KCk7Ci0JCWludCBtYXggPSB0aGlzLmdldE1heFNlbGVjdGlvbkluZGV4KCk7Ci0KLQkJaWYgKChtaW4gPCAwKSB8fCAobWF4IDwgMCkpIHsKLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJaW50IG1heFNpemUgPSAobWF4IC0gbWluKSArIDE7Ci0JCU9iamVjdFtdIHRlbXAgPSBuZXcgT2JqZWN0W21heFNpemVdOwotCQlpbnQgbiA9IDA7Ci0JCWludCBjb3VudCA9IHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0U2l6ZSgpOwotCQlmb3IgKGludCBpID0gbWluOyBpIDw9IG1heDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5pc1NlbGVjdGVkSW5kZXgoaSkgJiYgKGkgPCBjb3VudCkpIHsKLQkJCQl0ZW1wW24rK10gPSB0aGlzLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpKTsKLQkJCX0KLQkJfQotCQlpZiAobiA9PSBtYXhTaXplKSB7Ci0JCQkvLyBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSB3ZXJlIHNlbGVjdGVkCi0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCQkvLyBvbmx5IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSB3ZXJlIHNlbGVjdGVkCi0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3Rbbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBuKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHNlbGVjdGVkIGluZGljZXMgaW4gb3JkZXIuCi0JICovCi0JcHVibGljIGludFtdIHNlbGVjdGVkSW5kaWNlcygpIHsKLQkJaW50IG1pbiA9IHRoaXMuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKTsKLQkJaW50IG1heCA9IHRoaXMuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKTsKLQotCQlpZiAoKG1pbiA8IDApIHx8IChtYXggPCAwKSkgewotCQkJcmV0dXJuIG5ldyBpbnRbMF07Ci0JCX0KLQotCQlpbnQgbWF4U2l6ZSA9IChtYXggLSBtaW4pICsgMTsKLQkJaW50W10gdGVtcCA9IG5ldyBpbnRbbWF4U2l6ZV07Ci0JCWludCBuID0gMDsKLQkJaW50IGNvdW50ID0gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBtaW47IGkgPD0gbWF4OyBpKyspIHsKLQkJCWlmICh0aGlzLmlzU2VsZWN0ZWRJbmRleChpKSAmJiAoaSA8IGNvdW50KSkgewotCQkJCXRlbXBbbisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG4gPT0gbWF4U2l6ZSkgewotCQkJLy8gYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2Ugd2VyZSBzZWxlY3RlZAotCQkJQXJyYXlzLnNvcnQodGVtcCk7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCQkvLyBvbmx5IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSB3ZXJlIHNlbGVjdGVkCi0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBuKTsKLQkJQXJyYXlzLnNvcnQocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNlbGVjdGVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLnNldFNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMgdG8gdGhlIHNwZWNpZmllZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3NldFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVmFsdWVzKEl0ZXJhdG9yPD8+IG9iamVjdHMpIHsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKHRydWUpOwotCQl0aGlzLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXNJbnRlcm5hbChvYmplY3RzKTsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMgdG8gdGhlIHNwZWNpZmllZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3NldFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb248Pz4gb2JqZWN0cykgewotCQl0aGlzLnNldFNlbGVjdGVkVmFsdWVzKG9iamVjdHMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNzZXRTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFZhbHVlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0JCXRoaXMuc2V0U2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKG9iamVjdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjYWRkU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0ZWRWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG9iamVjdHMgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjYWRkU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0ZWRWYWx1ZXMoSXRlcmF0b3I8Pz4gb2JqZWN0cykgewotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcodHJ1ZSk7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXNJbnRlcm5hbChvYmplY3RzKTsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3RzIHRvIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2FkZFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb248Pz4gb2JqZWN0cykgewotCQl0aGlzLmFkZFNlbGVjdGVkVmFsdWVzKG9iamVjdHMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyB0byB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNhZGRTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3RlZFZhbHVlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKG9iamVjdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNyZW1vdmVTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZFZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJdGhpcy5yZW1vdmVTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uVG9vbHMuc2luZ2xldG9uSXRlcmF0b3Iob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyBmcm9tIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3JlbW92ZVNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkVmFsdWVzKEl0ZXJhdG9yPD8+IG9iamVjdHMpIHsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKHRydWUpOwotCQlMaXN0TW9kZWwgbG0gPSB0aGlzLmdldExpc3RNb2RlbCgpOwotCQlpbnQgbG1TaXplID0gbG0uZ2V0U2l6ZSgpOwotCQl3aGlsZSAob2JqZWN0cy5oYXNOZXh0KCkpIHsKLQkJCWludCBpbmRleCA9IHRoaXMuaW5kZXhPZihvYmplY3RzLm5leHQoKSwgbG0sIGxtU2l6ZSk7Ci0JCQl0aGlzLnJlbW92ZVNlbGVjdGlvbkludGVydmFsKGluZGV4LCBpbmRleCk7Ci0JCX0KLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3RzIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjcmVtb3ZlU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvbjw/PiBvYmplY3RzKSB7Ci0JCXRoaXMucmVtb3ZlU2VsZWN0ZWRWYWx1ZXMob2JqZWN0cy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3RzIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjcmVtb3ZlU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoT2JqZWN0W10gb2JqZWN0cykgewotCQl0aGlzLnJlbW92ZVNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihvYmplY3RzKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjZ2V0QW5jaG9yU2VsZWN0aW9uSW5kZXgoKQotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbmNob3Igc2VsZWN0aW9uIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QW5jaG9yU2VsZWN0ZWRWYWx1ZSgpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5nZXRBbmNob3JTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjc2V0QW5jaG9yU2VsZWN0aW9uSW5kZXgoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFuY2hvclNlbGVjdGVkVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLnNldEFuY2hvclNlbGVjdGlvbkluZGV4KHRoaXMuaW5kZXhPZihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNnZXRMZWFkU2VsZWN0aW9uSW5kZXgoKQotCSAqIFJldHVybiBudWxsIGlmIHRoZSBsZWFkIHNlbGVjdGlvbiBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExlYWRTZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldExlYWRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjc2V0TGVhZFNlbGVjdGlvbkluZGV4KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZWFkU2VsZWN0ZWRWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuc2V0TGVhZFNlbGVjdGlvbkluZGV4KHRoaXMuaW5kZXhPZihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNnZXRNYXhTZWxlY3Rpb25JbmRleCgpCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIG1heCBzZWxlY3Rpb24gaXMgZW1wdHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNYXhTZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldE1heFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNnZXRNaW5TZWxlY3Rpb25JbmRleCgpCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIG1pbiBzZWxlY3Rpb24gaXMgZW1wdHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNaW5TZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldE1pblNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNpc1NlbGVjdGVkSW5kZXgoaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbHVlSXNTZWxlY3RlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0aGlzLmlzU2VsZWN0ZWRJbmRleCh0aGlzLmluZGV4T2Yob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyB0byB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cywKLQkgKiB3aXRob3V0IHdyYXBwaW5nIHRoZSBhY3Rpb25zIGluICJhZGp1c3RpbmciIGV2ZW50cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU2VsZWN0ZWRWYWx1ZXNJbnRlcm5hbChJdGVyYXRvcjw/PiBvYmplY3RzKSB7Ci0JCUxpc3RNb2RlbCBsbSA9IHRoaXMuZ2V0TGlzdE1vZGVsKCk7Ci0JCWludCBsaXN0TW9kZWxTaXplID0gbG0uZ2V0U2l6ZSgpOwotCQl3aGlsZSAob2JqZWN0cy5oYXNOZXh0KCkpIHsKLQkJCWludCBpbmRleCA9IHRoaXMuaW5kZXhPZihvYmplY3RzLm5leHQoKSwgbG0sIGxpc3RNb2RlbFNpemUpOwotCQkJdGhpcy5hZGRTZWxlY3Rpb25JbnRlcnZhbChpbmRleCwgaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBpbiB0aGUgbGlzdCBtb2RlbCBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiBSZXR1cm4gLTEgaWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGxpc3QgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBpbnQgaW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3RNb2RlbCBsbSA9IHRoaXMuZ2V0TGlzdE1vZGVsKCk7Ci0JCXJldHVybiB0aGlzLmluZGV4T2Yob2JqZWN0LCBsbSwgbG0uZ2V0U2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGluIHRoZSBsaXN0IG1vZGVsIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIFJldHVybiAtMSBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUgbGlzdCBtb2RlbC4KLQkgKi8KLQkvLyB3ZSdyZSBqdXN0IGplcmtpbmcgYXJvdW5kIHdpdGggcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyBoZXJlCi0JLy8gKGluIG1lbW9yeSBvZiBQaGlsLi4uKTsKLQkvLyBjYWxsIHRoaXMgbWV0aG9kIGluc2lkZSBsb29wcyB0aGF0IGRvIG5vdCBtb2RpZnkgdGhlIGxpc3RNb2RlbAotCXByaXZhdGUgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCwgTGlzdE1vZGVsIGxtLCBpbnQgbGlzdE1vZGVsU2l6ZSkgewotCQlmb3IgKGludCBpID0gbGlzdE1vZGVsU2l6ZTsgaS0tID4gMDsgKSB7Ci0JCQlpZiAobG0uZ2V0RWxlbWVudEF0KGkpLmVxdWFscyhvYmplY3QpKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1ByaW1pdGl2ZUxpc3RUcmVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9QcmltaXRpdmVMaXN0VHJlZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMTkxMjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1ByaW1pdGl2ZUxpc3RUcmVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRNdXRhYmxlVHJlZU5vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0VHJlZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuTXV0YWJsZVRyZWVOb2RlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU5vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSB0cmVlIHdpdGggYSAibnVsbCIgcm9vdCB0aGF0Ci0gKiBoYXMgYSBzZXQgb2YgInByaW1pdGl2ZSIgY2hpbGRyZW4uIFRoZXNlICJwcmltaXRpdmUiIGNoaWxkcmVuIGRvIG5vdCBoYXZlCi0gKiBjaGlsZHJlbiB0aGVtc2VsdmVzLCBtYWtpbmcgdGhlIHRyZWUgYSBtYXhpbXVtIG9mIDIgbGV2ZWxzIGRlZXAuCi0gKiBUaGlzIG1vZGVsIGF1dG9tYXRpY2FsbHkgc3luY2hyb25pemVzIHRoZSByb290J3MgY2hpbGRyZW4gd2l0aCBhCi0gKiBMaXN0VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgY29sbGVjdGlvbiBvZiBwcmltaXRpdmUgKG5vbi1tb2RlbCkgb2JqZWN0cwotICogKGUuZy4gU3RyaW5ncykuCi0gKiAKLSAqIFRoaXMgaXMgdXNlZnVsIGZvciBwcm92aWRpbmcgYW4gImVkaXRhYmxlIiBsaXN0IG9mIHByaW1pdGl2ZXMuIFNpbmNlIHRoZSBKREsKLSAqIGRvZXMgbm90IHByb3ZpZGUgdXMgd2l0aCBhbiBlZGl0YWJsZSBsaXN0Ym94LCB3ZSBtdXN0IHVzZSBhbiBlZGl0YWJsZSB0cmVlLgotICogV2Ugd3JhcCBldmVyeXRoaW5nIGluIERlZmF1bHRNdXRhYmxlVHJlZU5vZGVzLgotICogCi0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50ICNwcmltaXRpdmVDaGFuZ2VkKGludCwgT2JqZWN0KSBhbmQgdXBkYXRlCi0gKiB0aGUgbW9kZWwgYXBwcm9wcmlhdGVseS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgZWRpdHMgdGhlCi0gKiBsaXN0IGRpcmVjdGx5IGFuZCBwcmVzc2VzIDxFbnRlcj4uCi0gKiAKLSAqIFRoZSBKVHJlZSB1c2luZyB0aGlzIG1vZGVsIG11c3QgYmUgY29uZmlndXJlZCBhcyAiZWRpdGFibGUiOgotICogCXRyZWUuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gKi8KLS8vIFRPRE8gY29udmVydCB0byB1c2UgYW4gYWRhcHRlciBpbnN0ZWFkIG9mIHJlcXVpcmluZyBzdWJjbGFzcwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByaW1pdGl2ZUxpc3RUcmVlTW9kZWwKLQlleHRlbmRzIERlZmF1bHRUcmVlTW9kZWwKLXsKLQkvKiogYSBtb2RlbCBvbiB0aGUgbGlzdCBvZiBwcmltaXRpdmVzICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyOwotCi0JLyoqIGEgbGlzdGVuZXIgdGhhdCBoYW5kbGVzIHRoZSBhZGRpbmcsIHJlbW92aW5nLCBhbmQgcmVwbGFjaW5nIG9mIHRoZSBwcmltaXRpdmVzICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogUHVibGljIGNvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyIGlzIHJlcXVpcmVkCi0JICovCi0JcHVibGljIFByaW1pdGl2ZUxpc3RUcmVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcikgewotCQlzdXBlcihuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShudWxsLCB0cnVlKSk7ICAvLyB0cnVlID0gdGhlIHJvb3QgY2FuIGhhdmUgY2hpbGRyZW4KLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgbW9kZWwgdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzCi0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByaW1pdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byB1cGRhdGUgdGhlIAotCSAqIG1vZGVsIGFwcHJvcHJpYXRlbHkuIFRoZSBwcmltaXRpdmUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB3YXMKLQkgKiBlZGl0ZWQgZGlyZWN0bHkgYnkgdGhlIHVzZXIgYW5kIHRoZSBuZXcgdmFsdWUgaXMgYXMgc3BlY2lmaWVkLgotCSAqIENvbnZlcnQgdGhlIHZhbHVlIGFwcHJvcHJpYXRlbHkgYW5kIHBsYWNlIGl0IGluIHRoZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcmltaXRpdmVDaGFuZ2VkKGludCBpbmRleCwgT2JqZWN0IG5ld1ZhbHVlKTsKLQotCi0JLy8gKioqKioqKioqKiBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGluc3RlYWQgb2YgY2hhbmdpbmcgdGhlIG5vZGUgZGlyZWN0bHkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsdWVGb3JQYXRoQ2hhbmdlZChUcmVlUGF0aCBwYXRoLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJVHJlZU5vZGUgbm9kZSA9IChUcmVlTm9kZSkgcGF0aC5nZXRMYXN0UGF0aENvbXBvbmVudCgpOwotCQlpbnQgaW5kZXggPSAoKFRyZWVOb2RlKSB0aGlzLmdldFJvb3QoKSkuZ2V0SW5kZXgobm9kZSk7Ci0JCXRoaXMucHJpbWl0aXZlQ2hhbmdlZChpbmRleCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuZ2V0VHJlZU1vZGVsTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuc3luY2hyb25pemVMaXN0KCk7Ci0JCX0KLQkJc3VwZXIuYWRkVHJlZU1vZGVsTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZVRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlVHJlZU1vZGVsTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmdldFRyZWVNb2RlbExpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3luY2hyb25pemUgb3VyIGxpc3Qgb2Ygbm9kZXMgd2l0aCB0aGUgbGlzdCBvZiBwcmltaXRpdmVzCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZUxpc3QoKSB7Ci0JCXRoaXMuY2xlYXJMaXN0KCk7Ci0JCXRoaXMuYnVpbGRMaXN0KCk7Ci0JfQotCi0Jdm9pZCBjbGVhckxpc3QoKSB7Ci0JCWludCBjaGlsZGNvdW50ID0gdGhpcy5yb290LmdldENoaWxkQ291bnQoKTsKLQkJZm9yIChpbnQgaSA9IGNoaWxkY291bnQgLSAxOyBpID49IDA7IGktLSkgewotCQkJdGhpcy5yZW1vdmVOb2RlRnJvbVBhcmVudCgoTXV0YWJsZVRyZWVOb2RlKXRoaXMucm9vdC5nZXRDaGlsZEF0KGkpKTsKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTGlzdCgpIHsKLQkJZm9yIChJdGVyYXRvcjw/PiBzdHJlYW0gPSB0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmFkZFByaW1pdGl2ZShzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIHByaW1pdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQcmltaXRpdmUoT2JqZWN0IHByaW1pdGl2ZSkgewotCQl0aGlzLmluc2VydFByaW1pdGl2ZSh0aGlzLnJvb3QuZ2V0Q2hpbGRDb3VudCgpLCBwcmltaXRpdmUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5vZGUgZm9yIHRoZSBzcGVjaWZpZWQgcHJpbWl0aXZlCi0JICogYW5kIGluc2VydCBpdCBhcyBhIGNoaWxkIG9mIHRoZSByb290LgotCSAqLwotCXZvaWQgaW5zZXJ0UHJpbWl0aXZlKGludCBpbmRleCwgT2JqZWN0IHByaW1pdGl2ZSkgewotCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShwcmltaXRpdmUsIGZhbHNlKTsgLy8gZG9uJ3QgYWxsb3cgY2hpbGRyZW4gb24gdGhlIGNoaWxkIG5vZGUKLQkJdGhpcy5pbnNlcnROb2RlSW50byhub2RlLCAoTXV0YWJsZVRyZWVOb2RlKSB0aGlzLnJvb3QsIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgbm9kZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCU11dGFibGVUcmVlTm9kZSByZW1vdmVOb2RlKGludCBpbmRleCkgewotCQlNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IChNdXRhYmxlVHJlZU5vZGUpIHRoaXMucm9vdC5nZXRDaGlsZEF0KGluZGV4KTsKLQkJdGhpcy5yZW1vdmVOb2RlRnJvbVBhcmVudChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSB0aGUgdXNlciBvYmplY3Qgb2YgdGhlIG5vZGUgYXQgY2hpbGRJbmRleC4KLQkgKi8KLQl2b2lkIHJlcGxhY2VQcmltaXRpdmUoaW50IGluZGV4LCBPYmplY3QgcHJpbWl0aXZlKSB7Ci0JCU11dGFibGVUcmVlTm9kZSBub2RlID0gKE11dGFibGVUcmVlTm9kZSkgdGhpcy5yb290LmdldENoaWxkQXQoaW5kZXgpOwotCQlub2RlLnNldFVzZXJPYmplY3QocHJpbWl0aXZlKTsKLQkJdGhpcy5ub2RlQ2hhbmdlZChub2RlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBQcmltaXRpdmVMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlQcmltaXRpdmVMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBldmVudC5nZXRJdGVtcygpKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC50aGlzLmluc2VydFByaW1pdGl2ZShpKyssIGl0ZW0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudC5nZXRJdGVtc1NpemUoKTsgaSsrKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC50aGlzLnJlbW92ZU5vZGUoZXZlbnQuZ2V0SW5kZXgoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBldmVudC5nZXROZXdJdGVtcygpKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC50aGlzLnJlcGxhY2VQcmltaXRpdmUoaSsrLCBpdGVtKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJQXJyYXlMaXN0PE11dGFibGVUcmVlTm9kZT4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8TXV0YWJsZVRyZWVOb2RlPihldmVudC5nZXRMZW5ndGgoKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQl0ZW1wLmFkZChQcmltaXRpdmVMaXN0VHJlZU1vZGVsLnRoaXMucmVtb3ZlTm9kZShldmVudC5nZXRTb3VyY2VJbmRleCgpKSk7Ci0JCQl9Ci0JCQlpbnQgaSA9IGV2ZW50LmdldFRhcmdldEluZGV4KCk7Ci0JCQlmb3IgKE11dGFibGVUcmVlTm9kZSBub2RlIDogdGVtcCkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5pbnNlcnRQcmltaXRpdmUoaSsrLCBub2RlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsLnRoaXMuY2xlYXJMaXN0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5zeW5jaHJvbml6ZUxpc3QoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmE4YTUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CaWRpRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpZGlUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5GaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuQnV0dG9uTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGxpc3RlbmVyCi0gKiAoZS5nLiBhIEpSYWRpb0J1dHRvbikgaW4gc3luY2ggd2l0aCBhICh0eXBpY2FsbHkgc2hhcmVkKQotICogUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgb25lIHZhbHVlIG91dCBvZiBhIHNldCBvZiB2YWx1ZXMuCi0gKiAKLSAqIE5PVEU6IERvICpub3QqIHVzZSB0aGlzIG1vZGVsIHdpdGggYSBCdXR0b25Hcm91cCwgc2luY2UgdGhlCi0gKiBzaGFyZWQgdmFsdWUgaG9sZGVyIGFuZCB0aGUgd3JhcHBlcnMgYnVpbHQgYnkgdGhpcyBhZGFwdGVyIHdpbGwKLSAqIGtlZXAgdGhlIGFwcHJvcHJpYXRlIHJhZGlvIGJ1dHRvbiBjaGVja2VkLiBBbHNvLCB0aGlzIGFsbG93cwotICogdXMgdG8gdW5jaGVjayBhbGwgdGhlIHJhZGlvIGJ1dHRvbnMgaW4gYSBncm91cCB3aGVuIHRoZSBzaGFyZWQKLSAqIHZhbHVlIGlzIG51bGwuCi0gKi8KLXB1YmxpYyBjbGFzcyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcgotCWV4dGVuZHMgVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyCi17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdCBidXR0b25WYWx1ZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIoYnVpbGRCb29sZWFuSG9sZGVyKHZhbHVlSG9sZGVyLCBidXR0b25WYWx1ZSksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0JICovCi0JcHVibGljIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdCBidXR0b25WYWx1ZSkgewotCQlzdXBlcihidWlsZEJvb2xlYW5Ib2xkZXIodmFsdWVIb2xkZXIsIGJ1dHRvblZhbHVlKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIHVwIGEgc2V0IG9mIHdyYXBwZXJzIHRoYXQgd2lsbCBjb252ZXJ0IHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZSBob2xkZXIgYW5kIGJ1dHRvbiB2YWx1ZSB0by9mcm9tIGEgYm9vbGVhbi4KLQkgKiAKLQkgKiBJZiB0aGUgdmFsdWUgaG9sZGVyJ3MgdmFsdWUgbWF0Y2hlcyB0aGUgYnV0dG9uIHZhbHVlLAotCSAqIHRoZSB3cmFwcGVyIHdpbGwgcmV0dXJuIHRydWUuIExpa2V3aXNlLCBpZiB0aGUgdmFsdWUgaG9sZGVyJ3MKLQkgKiB2YWx1ZSBpcyBzZXQgdG8gdHJ1ZSwgdGhlIHdyYXBwZXIgd2lsbCBzZXQgdGhlIHZhbHVlIGhvbGRlcidzCi0JICogdmFsdWUgdG8gdGhlIGJ1dHRvbiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBmaWx0ZXJpbmdQVk0gPSBuZXcgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0Pih2YWx1ZUhvbGRlciwgbmV3IFJhZGlvQnV0dG9uRmlsdGVyKGJ1dHRvblZhbHVlKSk7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3QsIEJvb2xlYW4+KGZpbHRlcmluZ1BWTSwgbmV3IFJhZGlvQnV0dG9uVHJhbnNmb3JtZXIoYnV0dG9uVmFsdWUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSB1c2VyIGNhbm5vdCBkZS1zZWxlY3QgYSByYWRpbyBidXR0b24gLSB0aGUgdXNlcgotCSAqIGNhbiBvbmx5ICpzZWxlY3QqIGEgcmFkaW8gYnV0dG9uLiBPbmx5IHRoZSBtb2RlbCBjYW4KLQkgKiBjYXVzZSBhIHJhZGlvIGJ1dHRvbiB0byBiZSBkZS1zZWxlY3RlZC4gV2UgdXNlIHRoZQotCSAqIEFSTUVEIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSBhcmUgYmVpbmcgZGUtc2VsZWN0ZWQKLQkgKiBieSB0aGUgdXNlci4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIGIpIHsKLQkJLy8gZG8gbm90IGFsbG93IHRoZSB1c2VyIHRvIGRlLXNlbGVjdCBhIHJhZGlvIGJ1dHRvbgotCQkvLyByYWRpbyBidXR0b25zIGNhbgotCQlpZiAoKGIgPT0gZmFsc2UpICYmIHRoaXMuaXNBcm1lZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuc2V0U2VsZWN0ZWQoYik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBmaWx0ZXIgd2lsbCBvbmx5IHBhc3MgdGhyb3VnaCBhIG5ldyB2YWx1ZSB0byB0aGUgd3JhcHBlZAotCSAqIHZhbHVlIGhvbGRlciB3aGVuIGl0IG1hdGNoZXMgdGhlIGNvbmZpZ3VyZWQgYnV0dG9uIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmFkaW9CdXR0b25GaWx0ZXIgaW1wbGVtZW50cyBCaWRpRmlsdGVyPE9iamVjdD4gewotCQlwcml2YXRlIE9iamVjdCBidXR0b25WYWx1ZTsKLQotCQlwdWJsaWMgUmFkaW9CdXR0b25GaWx0ZXIoT2JqZWN0IGJ1dHRvblZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5idXR0b25WYWx1ZSA9IGJ1dHRvblZhbHVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGFsd2F5cyByZXR1cm4gdGhlIHdyYXBwZWQgdmFsdWUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3QgdmFsdWUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHBhc3MgdGhyb3VnaCB0aGUgdmFsdWUgdG8gdGhlIHdyYXBwZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwKLQkJICogKm9ubHkqIHdoZW4gaXQgbWF0Y2hlcyBvdXIgYnV0dG9uIHZhbHVlCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiByZXZlcnNlQWNjZXB0KE9iamVjdCB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZSAhPSBudWxsKSAmJiB2YWx1ZS5lcXVhbHModGhpcy5idXR0b25WYWx1ZSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgdHJhbnNmb3JtZXIgd2lsbCBjb252ZXJ0IHRoZSB3cmFwcGVkIHZhbHVlIHRvIEJvb2xlYW4uVFJVRQotCSAqIHdoZW4gaXQgbWF0Y2hlcyB0aGUgY29uZmlndXJlZCBidXR0b24gdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBSYWRpb0J1dHRvblRyYW5zZm9ybWVyIGltcGxlbWVudHMgQmlkaVRyYW5zZm9ybWVyPE9iamVjdCwgQm9vbGVhbj4gewotCQlwcml2YXRlIE9iamVjdCBidXR0b25WYWx1ZTsKLQotCQlwdWJsaWMgUmFkaW9CdXR0b25UcmFuc2Zvcm1lcihPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJ1dHRvblZhbHVlID0gYnV0dG9uVmFsdWU7Ci0JCX0KLQotCQkvKioKLQkJICogaWYgdGhlIHdyYXBwZWQgdmFsdWUgbWF0Y2hlcyBvdXIgYnV0dG9uIHZhbHVlIHJldHVybiB0cnVlLAotCQkgKiBpZiBpdCBpcyBzb21lIG90aGVyIHZhbHVlIHJldHVybiBmYWxzZTsKLQkJICogYnV0IGlmIGl0IGlzIG51bGwgc2ltcGx5IHBhc3MgaXQgdGhyb3VnaCBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgdGhlCi0JCSAqIGJ1dHRvbiBtb2RlbCdzIGRlZmF1bHQgdmFsdWUgdG8gYmUgdXNlZAotCQkgKi8KLQkJcHVibGljIEJvb2xlYW4gdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBCb29sZWFuLnZhbHVlT2YodmFsdWUuZXF1YWxzKHRoaXMuYnV0dG9uVmFsdWUpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBpZiB0aGUgbmV3IHZhbHVlIGlzIHRydWUsIHBhc3MgdGhyb3VnaCB0aGUgb3VyIGJ1dHRvbiB2YWx1ZTsKLQkJICogb3RoZXJ3aXNlIHBhc3MgdGhyb3VnaCBudWxsCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IHJldmVyc2VUcmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgPyB0aGlzLmJ1dHRvblZhbHVlIDogbnVsbDsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA4OTZlNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdFNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck51bWJlck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBDaGFuZ2VMaXN0ZW5lcgotICogKGUuZy4gYSBKU3Bpbm5lcikgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgdmFsdWUuCi0gKiAKLSAqIE5vdGU6IGl0IGlzIGxpa2VseSB5b3Ugd2FudCB0byB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBpbnN0ZWFkIG9mCi0gKiB0aGlzIG9uZToKLSAqICAgICBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcgotICogICAgIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqICAgICBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcgotICogCi0gKiBOQjogVGhpcyBtb2RlbCBzaG91bGQgb25seSBiZSB1c2VkIGZvciB2YWx1ZXMgdGhhdCBoYXZlIGEgZmFpcmx5Ci0gKiBpbmV4cGVuc2l2ZSAjZXF1YWxzKCkgaW1wbGVtZW50YXRpb24uCi0gKiBAc2VlICNzeW5jaHJvbml6ZURlbGVnYXRlKE9iamVjdCkKLSAqLwotcHVibGljIGNsYXNzIFNwaW5uZXJNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0U3Bpbm5lck1vZGVsCi17Ci0JLyoqIFRoZSBkZWxlZ2F0ZSBzcGlubmVyIG1vZGVsIHdob3NlIGJlaGF2aW9yIHdlICJlbmhhbmNlIi4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lck1vZGVsIGRlbGVnYXRlOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gZm9yd2FyZCBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBkZWxlZ2F0ZSBzcGlubmVyIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDaGFuZ2VMaXN0ZW5lciBkZWxlZ2F0ZUxpc3RlbmVyOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB2YWx1ZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgYW5kIGRlbGVnYXRlIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBTcGlubmVyTW9kZWwgZGVsZWdhdGUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZhbHVlSG9sZGVyID09IG51bGwgfHwgZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52YWx1ZUhvbGRlciA9IHZhbHVlSG9sZGVyOwotCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZQotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQkJdGhpcy52YWx1ZUxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlTGlzdGVuZXIoKTsKLQkJdGhpcy5kZWxlZ2F0ZUxpc3RlbmVyID0gdGhpcy5idWlsZERlbGVnYXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhpcyB3aWxsIHdyYXAgYSBzaW1wbGUgbnVtYmVyIHNwaW5uZXIgbW9kZWwuCi0JICovCi0JcHVibGljIFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcikgewotCQl0aGlzKHZhbHVlSG9sZGVyLCBuZXcgU3Bpbm5lck51bWJlck1vZGVsKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFZhbHVlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLnZhbHVlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBleHBhbmQgYWNjZXNzIGEgYml0IGZvciBpbm5lciBjbGFzcwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoKSB7Ci0JCXN1cGVyLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2hhbmdlTGlzdGVuZXIgYnVpbGREZWxlZ2F0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gZm9yd2FyZCB0aGUgZXZlbnQsIHdpdGggdGhpcyBhcyB0aGUgc291cmNlCi0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImRlbGVnYXRlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTcGlubmVyTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGRpcmVjdGx5LgotCSAqIFRoZSByZXN1bHRpbmcgZXZlbnQgd2lsbCBiZSBpZ25vcmVkOiBAc2VlICNzeW5jaHJvbml6ZURlbGVnYXRlKE9iamVjdCkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCXRoaXMuZGVsZWdhdGUuc2V0VmFsdWUodmFsdWUpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE5leHRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0TmV4dFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcmV2aW91c1ZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRQcmV2aW91c1ZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZSBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyQ291bnQoQ2hhbmdlTGlzdGVuZXIuY2xhc3MpID09IDApIHsKLQkJCXRoaXMuZGVsZWdhdGUuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5kZWxlZ2F0ZUxpc3RlbmVyKTsKLQkJCXRoaXMuZW5nYWdlVmFsdWVIb2xkZXIoKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyQ291bnQoQ2hhbmdlTGlzdGVuZXIuY2xhc3MpID09IDApIHsKLQkJCXRoaXMuZGlzZW5nYWdlVmFsdWVIb2xkZXIoKTsKLQkJCXRoaXMuZGVsZWdhdGUucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5kZWxlZ2F0ZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBIHRoaXJkIHBhcnR5IGhhcyBtb2RpZmllZCB0aGUgdW5kZXJseWluZyB2YWx1ZS4KLQkgKiBTeW5jaHJvbml6ZSB0aGUgZGVsZWdhdGUgbW9kZWwgYWNjb3JkaW5nbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZURlbGVnYXRlKGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZGVsZWdhdGUncyB2YWx1ZSBpZiBpdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZURlbGVnYXRlKE9iamVjdCB2YWx1ZSkgewotCQkvLyBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgZGVsZWdhdGUgaGFzIGFscmVhZHkgYmVlbiBzeW5jaHJvbml6ZWQKLQkJLy8gKHZpYSAjc2V0VmFsdWUoKSkKLQkJaWYgKCAhIHRoaXMuZGVsZWdhdGUuZ2V0VmFsdWUoKS5lcXVhbHModmFsdWUpKSB7Ci0JCQl0aGlzLmRlbGVnYXRlLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlSG9sZGVyKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlTGlzdGVuZXIpOwotCQl0aGlzLnN5bmNocm9uaXplRGVsZWdhdGUodGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZUhvbGRlcigpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy52YWx1ZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnZhbHVlSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RhYmxlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMThjZDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RhYmxlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVGFibGVNb2RlbExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLkFic3RyYWN0VGFibGVNb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIFRhYmxlTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIFRhYmxlTW9kZWxMaXN0ZW5lciAoZS5nLiBhIEpUYWJsZSkKLSAqIGluIHN5bmNoIHdpdGggYSBMaXN0VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgY29sbGVjdGlvbiBvZiBtb2RlbCBvYmplY3RzLAotICogZWFjaCBvZiB3aGljaCBjb3JyZXNwb25kcyB0byBhIHJvdyBpbiB0aGUgdGFibGUuCi0gKiBUeXBpY2FsbHksIGVhY2ggY29sdW1uIG9mIHRoZSB0YWJsZSB3aWxsIGJlIGJvdW5kIHRvIGEgZGlmZmVyZW50IGFzcGVjdAotICogb2YgdGhlIGNvbnRhaW5lZCBtb2RlbCBvYmplY3RzLgotICogCi0gKiBGb3IgZXhhbXBsZSwgYSBNV1RhYmxlIGhhcyBhbiBhdHRyaWJ1dGUgJ2RhdGFiYXNlRmllbGRzJyB0aGF0IGhvbGRzCi0gKiBhIGNvbGxlY3Rpb24gb2YgTVdEYXRhYmFzZUZpZWxkcyB0aGF0IHdvdWxkIGNvcnJlc3BvbmQgdG8gdGhlIHJvd3Mgb2YKLSAqIGEgSlRhYmxlOyBhbmQgZWFjaCBNV0RhdGFiYXNlRmllbGQgaGFzIGEgbnVtYmVyCi0gKiBvZiBhdHRyaWJ1dGVzIChlLmcuIG5hbWUsIHR5cGUsIHNpemUpIHRoYXQgY2FuIGJlIGJvdW5kIHRvIHRoZSBjb2x1bW5zIG9mCi0gKiBhIHJvdyBpbiB0aGUgSlRhYmxlLiBBcyB0aGVzZSBkYXRhYmFzZSBmaWVsZHMgYXJlIGFkZGVkLCByZW1vdmVkLCBhbmQKLSAqIGNoYW5nZWQsIHRoaXMgbW9kZWwgd2lsbCBrZWVwIHRoZSBsaXN0ZW5lcnMgYXdhcmUgb2YgdGhlIGNoYW5nZXMuCi0gKiAKLSAqIEFuIGluc3RhbmNlIG9mIHRoaXMgVGFibGVNb2RlbCBtdXN0IGJlIHN1cHBsaWVkIHdpdGggYQotICogbGlzdCBob2xkZXIgKGUuZy4gdGhlICdkYXRhYmFzZUZpZWxkcycpLCB3aGljaCBpcyBhIHZhbHVlCi0gKiBtb2RlbCBvbiB0aGUgYm91bmQgY29sbGVjdGlvbiBUaGlzIGlzIHJlcXVpcmVkIC0gdGhlCi0gKiBjb2xsZWN0aW9uIGl0c2VsZiBjYW4gYmUgbnVsbCwgYnV0IHRoZSBsaXN0IHZhbHVlIG1vZGVsIHRoYXQKLSAqIGhvbGRzIGl0IGlzIHJlcXVpcmVkLiBUeXBpY2FsbHkgdGhpcyBsaXN0IHdpbGwgYmUgc29ydGVkIChAc2VlCi0gKiBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIpLgotICogCi0gKiBUaGlzIFRhYmxlTW9kZWwgbXVzdCBhbHNvIGJlIHN1cHBsaWVkIHdpdGggYSBDb2x1bW5BZGFwdGVyIHRoYXQKLSAqIHdpbGwgYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGhlYWRlcnMsIHJlbmRlcmVycywgZWRpdG9ycywgYW5kIGNvbnRlbnRzCi0gKiBvZiB0aGUgdmFyaW91cyBjb2x1bW5zLgotICogCi0gKiBEZXNpZ24gZGVjaXNpb246Ci0gKiBDZWxsIGxpc3RlbmVyIG9wdGlvbnMgKGZyb20gbG93IHNwYWNlL2hpZ2ggdGltZSB0byBoaWdoIHNwYWNlL2xvdyB0aW1lKToKLSAqIAktIDEgY2VsbCBsaXN0ZW5lciBsaXN0ZW5pbmcgdG8gZXZlcnkgY2VsbCAodGhpcyBpcyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbikKLSAqIAktIDEgY2VsbCBsaXN0ZW5lciBwZXIgcm93Ci0gKiAJLSAxIGNlbGwgbGlzdGVuZXIgcGVyIGNlbGwKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwKLXsKLQkvKioKLQkgKiBhIGxpc3Qgb2YgdXNlciBvYmplY3RzIHRoYXQgYXJlIGNvbnZlcnRlZCB0bwotCSAqIHJvd3MgdmlhIHRoZSBjb2x1bW4gYWRhcHRlcgotCSAqLwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogZWFjaCByb3cgaXMgYW4gYXJyYXkgb2YgY2VsbCBtb2RlbHMKLQkgKi8KLQkvLyBkZWNsYXJlIGFzIEFycmF5TGlzdCBzbyB3ZSBjYW4gdXNlICNlbnN1cmVDYXBhY2l0eShpbnQpCi0JcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPiByb3dzOwotCi0JLyoqCi0JICogY2xpZW50LXN1cHBsaWVkIGFkYXB0ZXIgdGhhdCBwcm92aWRlcyB3aXRoIHRoZSB2YXJpb3VzIGNvbHVtbgotCSAqIHNldHRpbmdzIGFuZCBjb252ZXJ0cyB0aGUgb2JqZWN0cyBpbiB0aGUgTFZNCi0JICogaW50byBhbiBhcnJheSBvZiBjZWxsIG1vZGVscwotCSAqLwotCXByaXZhdGUgZmluYWwgQ29sdW1uQWRhcHRlciBjb2x1bW5BZGFwdGVyOwotCi0JLyoqCi0JICogdGhlIHNpbmdsZSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gZXZlcnkgY2VsbCdzIG1vZGVsCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNlbGxMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdGFibGUgbW9kZWwgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3RzCi0JICogYW5kIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIFRhYmxlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBDb2x1bW5BZGFwdGVyIGNvbHVtbkFkYXB0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5jb2x1bW5BZGFwdGVyID0gY29sdW1uQWRhcHRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMucm93cyA9IG5ldyBBcnJheUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPigpOwotCQl0aGlzLmNlbGxMaXN0ZW5lciA9IHRoaXMuYnVpbGRDZWxsTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0YWJsZSBtb2RlbCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdHMKLQkgKiBhbmQgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgVGFibGVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXIsIENvbHVtbkFkYXB0ZXIgY29sdW1uQWRhcHRlcikgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCBjb2x1bW5BZGFwdGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5hZGRSb3dzKGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpLCB0aGlzLmdldEl0ZW1zKGV2ZW50KSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5yZW1vdmVSb3dzKGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMucmVwbGFjZVJvd3MoZXZlbnQuZ2V0SW5kZXgoKSwgdGhpcy5nZXROZXdJdGVtcyhldmVudCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5tb3ZlUm93cyhldmVudC5nZXRUYXJnZXRJbmRleCgpLCBldmVudC5nZXRTb3VyY2VJbmRleCgpLCBldmVudC5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMuY2xlYXJUYWJsZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5yZWJ1aWxkVGFibGUoKTsKLQkJCX0KLQkJCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxPYmplY3Q+IGdldEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCXJldHVybiAoSXRlcmFibGU8T2JqZWN0PikgZXZlbnQuZ2V0SXRlbXMoKTsKLQkJCX0KLQkJCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxPYmplY3Q+IGdldE5ld0l0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlyZXR1cm4gKEl0ZXJhYmxlPE9iamVjdD4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDZWxsTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZENlbGxMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDZWxsTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5jZWxsQ2hhbmdlZCgoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgZXZlbnQuZ2V0U291cmNlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY2VsbCBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNvdW50KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMucm93cy5zaXplKCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5OYW1lKGNvbHVtbik7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIENsYXNzPD8+IGdldENvbHVtbkNsYXNzKGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNsYXNzKGNvbHVtbkluZGV4KTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0NlbGxFZGl0YWJsZShpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbklzRWRpdGFibGUoY29sdW1uSW5kZXgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5yb3dzLmdldChyb3dJbmRleCk7Ci0JCXJldHVybiByb3dbY29sdW1uSW5kZXhdLmdldFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmFsdWVBdChPYmplY3QgdmFsdWUsIGludCByb3dJbmRleCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cgPSB0aGlzLnJvd3MuZ2V0KHJvd0luZGV4KTsKLQkJcm93W2NvbHVtbkluZGV4XS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVGFibGVNb2RlbExpc3RlbmVyKFRhYmxlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vVGFibGVNb2RlbExpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFibGVNb2RlbExpc3RlbmVyKFRhYmxlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZVRhYmxlTW9kZWxMaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9UYWJsZU1vZGVsTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcikgewotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlib29sZWFuIGhhc0xpc3RlbmVycyA9IHRoaXMuaGFzVGFibGVNb2RlbExpc3RlbmVycygpOwotCQlpZiAoaGFzTGlzdGVuZXJzKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQkJdGhpcy5maXJlVGFibGVEYXRhQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzLnNldE1vZGVsKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIG1vZGVsIGhhcyBubyBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9UYWJsZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChUYWJsZU1vZGVsTGlzdGVuZXIuY2xhc3MpID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgYW55IGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNUYWJsZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc05vVGFibGVNb2RlbExpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3Qgb2Ygb2JqZWN0cyBhbmQgdGhlIHZhcmlvdXMgYXNwZWN0cwotCSAqIG9mIHRoZSBvYmplY3RzIHRoYXQgbWFrZSB1cCB0aGUgcm93cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5lbmdhZ2VBbGxDZWxscygpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIG9iamVjdHMgaW50byByb3dzIGFuZCBsaXN0ZW4gdG8gdGhlIGNlbGxzLgotCSAqLwotCXByaXZhdGUgdm9pZCBlbmdhZ2VBbGxDZWxscygpIHsKLQkJdGhpcy5yb3dzLmVuc3VyZUNhcGFjaXR5KHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBzdHJlYW0gPSB0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNlbGxNb2RlbHMoc3RyZWFtLm5leHQoKSk7Ci0JCQl0aGlzLmVuZ2FnZVJvdyhyb3cpOwotCQkJdGhpcy5yb3dzLmFkZChyb3cpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSBjZWxscyBpbiB0aGUgc3BlY2lmaWVkIHJvdy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlUm93KFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cpIHsKLQkJZm9yIChpbnQgaSA9IHJvdy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJcm93W2ldLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNlbGxMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlQWxsQ2VsbHMoKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VBbGxDZWxscygpIHsKLQkJZm9yIChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93IDogdGhpcy5yb3dzKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVJvdyhyb3cpOwotCQl9Ci0JCXRoaXMucm93cy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VSb3coV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdykgewotCQlmb3IgKGludCBpID0gcm93Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlyb3dbaV0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2VsbExpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGJydXRlLWZvcmNlIHNlYXJjaCBmb3IgdGhlIGNlbGwocykgdGhhdCBjaGFuZ2VkLi4uCi0JICovCi0Jdm9pZCBjZWxsQ2hhbmdlZChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGNlbGxIb2xkZXIpIHsKLQkJZm9yIChpbnQgaSA9IHRoaXMucm93cy5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdyA9IHRoaXMucm93cy5nZXQoaSk7Ci0JCQlmb3IgKGludCBqID0gcm93Lmxlbmd0aDsgai0tID4gMDsgKSB7Ci0JCQkJaWYgKHJvd1tqXSA9PSBjZWxsSG9sZGVyKSB7Ci0JCQkJCXRoaXMuZmlyZVRhYmxlQ2VsbFVwZGF0ZWQoaSwgaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogY29udmVydCB0aGUgaXRlbXMgdG8gcm93cwotCSAqLwotCXZvaWQgYWRkUm93cyhpbnQgaW5kZXgsIGludCBzaXplLCBJdGVyYWJsZTxPYmplY3Q+IGl0ZW1zKSB7Ci0JCUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPiBuZXdSb3dzID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+KHNpemUpOwotCQlmb3IgKE9iamVjdCBpdGVtIDogaXRlbXMpIHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cgPSB0aGlzLmNvbHVtbkFkYXB0ZXIuY2VsbE1vZGVscyhpdGVtKTsKLQkJCXRoaXMuZW5nYWdlUm93KHJvdyk7Ci0JCQluZXdSb3dzLmFkZChyb3cpOwotCQl9Ci0JCXRoaXMucm93cy5hZGRBbGwoaW5kZXgsIG5ld1Jvd3MpOwotCQl0aGlzLmZpcmVUYWJsZVJvd3NJbnNlcnRlZChpbmRleCwgaW5kZXggKyBzaXplIC0gMSk7Ci0JfQotCi0Jdm9pZCByZW1vdmVSb3dzKGludCBpbmRleCwgaW50IHNpemUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRoaXMuZGlzZW5nYWdlUm93KHRoaXMucm93cy5yZW1vdmUoaW5kZXgpKTsKLQkJfQotCQl0aGlzLmZpcmVUYWJsZVJvd3NEZWxldGVkKGluZGV4LCBpbmRleCArIHNpemUgLSAxKTsKLQl9Ci0KLQl2b2lkIHJlcGxhY2VSb3dzKGludCBpbmRleCwgSXRlcmFibGU8T2JqZWN0PiBpdGVtcykgewotCQlpbnQgaSA9IGluZGV4OwotCQlmb3IgKE9iamVjdCBpdGVtIDogaXRlbXMpIHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cgPSB0aGlzLnJvd3MuZ2V0KGkpOwotCQkJdGhpcy5kaXNlbmdhZ2VSb3cocm93KTsKLQkJCXJvdyA9IHRoaXMuY29sdW1uQWRhcHRlci5jZWxsTW9kZWxzKGl0ZW0pOwotCQkJdGhpcy5lbmdhZ2VSb3cocm93KTsKLQkJCXRoaXMucm93cy5zZXQoaSwgcm93KTsKLQkJCWkrKzsKLQkJfQotCQl0aGlzLmZpcmVUYWJsZVJvd3NVcGRhdGVkKGluZGV4LCBpIC0gMSk7Ci0JfQotCi0Jdm9pZCBtb3ZlUm93cyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlBcnJheUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+KGxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXRlbXAuYWRkKHRoaXMucm93cy5yZW1vdmUoc291cmNlSW5kZXgpKTsKLQkJfQotCQl0aGlzLnJvd3MuYWRkQWxsKHRhcmdldEluZGV4LCB0ZW1wKTsKLQotCQlpbnQgc3RhcnQgPSBNYXRoLm1pbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlpbnQgZW5kID0gTWF0aC5tYXgodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KSArIGxlbmd0aCAtIDE7Ci0JCXRoaXMuZmlyZVRhYmxlUm93c1VwZGF0ZWQoc3RhcnQsIGVuZCk7Ci0JfQotCi0Jdm9pZCBjbGVhclRhYmxlKCkgewotCQl0aGlzLmRpc2VuZ2FnZUFsbENlbGxzKCk7Ci0JCXRoaXMuZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLQl9Ci0KLQl2b2lkIHJlYnVpbGRUYWJsZSgpIHsKLQkJdGhpcy5kaXNlbmdhZ2VBbGxDZWxscygpOwotCQl0aGlzLmVuZ2FnZUFsbENlbGxzKCk7Ci0JCXRoaXMuZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Ub2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Ub2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5YWEzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1MaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5KVG9nZ2xlQnV0dG9uLlRvZ2dsZUJ1dHRvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuQnV0dG9uTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGxpc3RlbmVyCi0gKiAoZS5nLiBhIEpDaGVja0JveCBvciBhIEpSYWRpb0J1dHRvbikgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbAotICogb24gYSBib29sZWFuLgotICovCi1wdWJsaWMgY2xhc3MgVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBUb2dnbGVCdXR0b25Nb2RlbAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHRoZSB0b2dnbGUgYnV0dG9uOyBmb3Igd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcyBudWxsLgotCSAqIFRoZSBkZWZhdWx0IFtkZWZhdWx0IHZhbHVlXSBpcyBmYWxzZSAoaS5lLiB0aGUgdG9nZ2xlIGJ1dHRvbiBpcyB1bmNoZWNrZWQvZW1wdHkpLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGRlZmF1bHRWYWx1ZTsKLQotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGJvb2xlYW4uICovCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGgKLQkgKiBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgYm9vbGVhbi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBib29sZWFuQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBUb2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGJvb2xlYW5Ib2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5ib29sZWFuSG9sZGVyID0gYm9vbGVhbkhvbGRlcjsKLQkJdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbAotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIpIHsKLQkJdGhpcyhib29sZWFuSG9sZGVyLCBmYWxzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUb2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIudGhpcy5ib29sZWFuQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCSAgICBAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJib29sZWFuIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCdXR0b25Nb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gdXBkYXRlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIGIpIHsKLQkJaWYgKHRoaXMuaXNTZWxlY3RlZCgpICE9IGIpIHsJLy8gc3RvcCB0aGUgcmVjdXJzaW9uIQotCQkJc3VwZXIuc2V0U2VsZWN0ZWQoYik7Ly9wdXQgdGhlIHN1cGVyIGNhbGwgZmlyc3QsIG90aGVyd2lzZSB0aGUgZm9sbG93aW5nIGdldHMgY2FsbGVkIHR3aWNlCi0JCQl0aGlzLmJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoQm9vbGVhbi52YWx1ZU9mKGIpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZEFjdGlvbkxpc3RlbmVyKEFjdGlvbkxpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZEFjdGlvbkxpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVBY3Rpb25MaXN0ZW5lcihBY3Rpb25MaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZUFjdGlvbkxpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRJdGVtTGlzdGVuZXIoSXRlbUxpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZEl0ZW1MaXN0ZW5lcihsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlSXRlbUxpc3RlbmVyKEl0ZW1MaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZUl0ZW1MaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHdlIGhhdmUgbm8gbGlzdGVuZXJzIGF0IGFsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyQ291bnQoKSA9PSAwOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogSWYgaXQgaXMgbnVsbCwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlICh3aGljaCBpcyB0eXBpY2FsbHkgZmFsc2UpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNlbGVjdGVkKEJvb2xlYW4gdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXRoaXMuc2V0U2VsZWN0ZWQodGhpcy5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldFNlbGVjdGVkKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSB1bmRlcmx5aW5nIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgYWNjb3JkaW5nbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYm9vbGVhbkNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnNldFNlbGVjdGVkKChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuc2V0U2VsZWN0ZWQodGhpcy5ib29sZWFuSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmJvb2xlYW5Ib2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmJvb2xlYW5Ib2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDg2OGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVOb2RlVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLnRyZWUuVHJlZU1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBUcmVlTW9kZWxMaXN0ZW5lcgotICogKGUuZy4gYSBKVHJlZSkgaW4gc3luY2ggd2l0aCBhIHRyZWUgb2YgVHJlZU5vZGVWYWx1ZU1vZGVsIG9iamVjdHMuIFVubGlrZQotICogamF2YXguc3dpbmcudHJlZS5EZWZhdWx0VHJlZU1vZGVsLCB5b3UgZG8gbm90IGFkZCBhbmQgcmVtb3ZlIG5vZGVzIHdpdGgKLSAqIG1ldGhvZHMgaW1wbGVtZW50ZWQgaGVyZS4gWW91IGNhbiBhZGQgYW5kIHJlbW92ZSBub2RlcyBieSBhZGRpbmcgYW5kCi0gKiByZW1vdmluZyB0aGVtIGRpcmVjdGx5IHRvL2Zyb20gdGhlIG5vZGVzIChvciwgbW9yZSB0eXBpY2FsbHksIHRoZSBkb21haW4KLSAqIG9iamVjdHMgdGhlIG5vZGVzIGFyZSB3cmFwcGluZyBhbmQgbGlzdGVuaW5nIHRvKS4KLSAqIAotICogRHVlIHRvIGxpbWl0YXRpb25zIGluIEpUcmVlLCB0aGUgcm9vdCBvZiB0aGUgdHJlZSBjYW4gbmV2ZXIgYmUgbnVsbCwKLSAqIHdoaWNoLCB0eXBpY2FsbHksIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtLiAoSWYgeW91IHdhbnQgdG8gZGlzcGxheSBhbiBlbXB0eQotICogdHJlZSB5b3UgY2FuIHNldCB0aGUgSlRyZWUncyB0cmVlTW9kZWwgdG8gbnVsbC4pCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlTW9kZWxBZGFwdGVyPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdFRyZWVNb2RlbAotewotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgdHJlZSdzIHJvb3Qgbm9kZSBhbmQgaXRzCi0JICogY29ycmVzcG9uZGluZyBsaXN0ZW5lci4gVGhpcyBhbGxvd3MgY2xpZW50cyB0byBzd2FwIG91dAotCSAqIHRoZSBlbnRpcmUgdHJlZS4gRHVlIHRvIGxpbWl0YXRpb25zIGluIEpUcmVlLCB0aGUgcm9vdCBzaG91bGQKLQkgKiBuZXZlciBiZSBzZXQgdG8gbnVsbCB3aGlsZSB3ZSBoYXZlIGxpc3RlbmVycy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHJvb3RIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHJvb3RMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBub3RpZmllcyB1cyB3aGVuIGEgbm9kZSdzIGludGVybmFsCi0JICogInN0YXRlIiBjaGFuZ2VzIChhcyBvcHBvc2VkIHRvIHRoZSBub2RlJ3MgdmFsdWUgb3IgbGlzdCBvZgotCSAqIGNoaWxkcmVuKSwgYWxsb3dpbmcgdXMgdG8gZm9yd2FyZCBub3RpZmljYXRpb24gdG8gb3VyIGxpc3RlbmVycy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgbm9kZVN0YXRlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgbm90aWZpZXMgdXMgd2hlbiBhIG5vZGUncyAidmFsdWUiCi0JICogY2hhbmdlcyAoYXMgb3Bwb3NlZCB0byB0aGUgbm9kZSdzIHN0YXRlIG9yIGxpc3Qgb2YKLQkgKiBjaGlsZHJlbiksIGFsbG93aW5nIHVzIHRvIGZvcndhcmQgbm90aWZpY2F0aW9uIHRvIG91ciBsaXN0ZW5lcnMuCi0JICogVHlwaWNhbGx5LCB0aGlzIHdpbGwgb25seSBoYXBwZW4gd2l0aCBub2RlcyB0aGF0IGhvbGQKLQkgKiBwcmltaXRpdmUgZGF0YS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbm9kZVZhbHVlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgbm90aWZpZXMgdXMgd2hlbiBhbiB1bmRlcmx5aW5nIG5vZGUncwotCSAqICJsaXN0IiBvZiBjaGlsZHJlbiBjaGFuZ2VzLCBhbGxvd2luZyB1cyB0byBrZWVwIG91cgotCSAqIGludGVybmFsIHRyZWUgaW4gc3luY2ggd2l0aCB0aGUgdW5kZXJseWluZyB0cmVlIG1vZGVsLgotCSAqLwotCXByaXZhdGUgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGNoaWxkcmVuTGlzdGVuZXI7Ci0KLQkvKiB0aGVzZSBhdHRyaWJ1dGVzIG1ha2UgdXAgb3VyIGludGVybmFsIHRyZWUgKi8KLQkvKioKLQkgKiBUaGUgcm9vdCBjYW5ub3QgYmUgbnVsbCB3aGlsZSB3ZSBoYXZlIGxpc3RlbmVycywgd2hpY2ggaXMKLQkgKiBtb3N0IG9mIHRoZSB0aW1lLiBUaGUgcm9vdCBpcyBjYWNoZWQgc28gd2UgY2FuIGRpc2VuZ2FnZQotCSAqIGZyb20gaXQgd2hlbiBpdCBoYXMgYmVlbiBzd2FwcGVkIG91dC4KLQkgKi8KLQlwcml2YXRlIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiByb290OwotCi0JLyoqCi0JICogTWFwIHRoZSBub2RlcyB0byB0aGVpciBsaXN0cyBvZiBjaGlsZHJlbi4KLQkgKiBXZSBjYWNoZSB0aGVzZSBzbyB3ZSBjYW4gc3dhcCBvdXQgdGhlIGVudGlyZSBsaXN0IG9mIGNoaWxkcmVuCi0JICogd2hlbiB3ZSByZWNlaXZlIGEgI2xpc3RDaGFuZ2VkKCkgZXZlbnQgKHdoaWNoIGRvZXMgbm90IGluY2x1ZGUKLQkgKiB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFmZmVjdGVkKS4KLQkgKiBAc2VlIEV2ZW50Q2hhbmdlUG9saWN5I3JlYnVpbGRDaGlsZHJlbigpCi0JICovCi0JZmluYWwgSWRlbnRpdHlIYXNoTWFwPFRyZWVOb2RlVmFsdWVNb2RlbDxUPiwgTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+PiBjaGlsZHJlbkxpc3RzOwotCi0JLyoqCi0JICogTWFwIHRoZSBjaGlsZHJlbiBtb2RlbHMgdG8gdGhlaXIgcGFyZW50cy4KLQkgKiBXZSBjYWNoZSB0aGVzZSBzbyB3ZSBjYW4gZmlndXJlIG91dCB0aGUgInJlYWwiIHNvdXJjZSBvZiB0aGUKLQkgKiBsaXN0IGNoYW5nZSBldmVudHMgKHRoZSBwYXJlbnQpLgotCSAqIEBzZWUgRXZlbnRDaGFuZ2VQb2xpY3kjcGFyZW50KCkKLQkgKi8KLQlmaW5hbCBJZGVudGl0eUhhc2hNYXA8TGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiwgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBwYXJlbnRzOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIHJvb3QuCi0JICovCi0JcHVibGljIFRyZWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gcm9vdEhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAocm9vdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnJvb3RIb2xkZXIgPSByb290SG9sZGVyOwotCQl0aGlzLnJvb3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRSb290TGlzdGVuZXIoKTsKLQkJdGhpcy5ub2RlU3RhdGVMaXN0ZW5lciA9IHRoaXMuYnVpbGROb2RlU3RhdGVMaXN0ZW5lcigpOwotCQl0aGlzLm5vZGVWYWx1ZUxpc3RlbmVyID0gdGhpcy5idWlsZE5vZGVWYWx1ZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY2hpbGRyZW5MaXN0ZW5lciA9IHRoaXMuYnVpbGRDaGlsZHJlbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY2hpbGRyZW5MaXN0cyA9IG5ldyBJZGVudGl0eUhhc2hNYXA8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+LCBMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4+KCk7Ci0JCXRoaXMucGFyZW50cyA9IG5ldyBJZGVudGl0eUhhc2hNYXA8TGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiwgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgcm9vdC4KLQkgKi8KLQlwdWJsaWMgVHJlZU1vZGVsQWRhcHRlcihUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcm9vdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+Pihyb290KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUm9vdExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRSb290TGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUm9vdExpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyLnRoaXMucm9vdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInJvb3QgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROb2RlVmFsdWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTm9kZVZhbHVlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTm9kZVZhbHVlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLm5vZGVDaGFuZ2VkKChUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgdmFsdWUgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGROb2RlU3RhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTm9kZVN0YXRlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkTm9kZVN0YXRlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLm5vZGVDaGFuZ2VkKChUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgc3RhdGUgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZENoaWxkcmVuTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZENoaWxkcmVuTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJbmV3IEFkZEV2ZW50Q2hhbmdlUG9saWN5KGV2ZW50KS5hZGRDaGlsZHJlbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCW5ldyBSZW1vdmVFdmVudENoYW5nZVBvbGljeShldmVudCkucmVtb3ZlQ2hpbGRyZW4oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCW5ldyBSZXBsYWNlRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLnJlcGxhY2VDaGlsZHJlbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJbmV3IE1vdmVFdmVudENoYW5nZVBvbGljeShldmVudCkubW92ZUNoaWxkcmVuKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCW5ldyBDbGVhckV2ZW50Q2hhbmdlUG9saWN5KGV2ZW50KS5jbGVhckNoaWxkcmVuKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgQ2hhbmdlRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLnJlYnVpbGRDaGlsZHJlbigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY2hpbGRyZW4gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRyZWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3Q7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIE9iamVjdCBnZXRDaGlsZChPYmplY3QgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuICgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBwYXJlbnQpLmNoaWxkKGluZGV4KTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoT2JqZWN0IHBhcmVudCkgewotCQlyZXR1cm4gKChUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIHBhcmVudCkuY2hpbGRyZW5TaXplKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGJvb2xlYW4gaXNMZWFmKE9iamVjdCBub2RlKSB7Ci0JCXJldHVybiAoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgbm9kZSkuaXNMZWFmKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgdmFsdWVGb3JQYXRoQ2hhbmdlZChUcmVlUGF0aCBwYXRoLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJKChUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIHBhdGguZ2V0TGFzdFBhdGhDb21wb25lbnQoKSkuc2V0VmFsdWUoKFQpIG5ld1ZhbHVlKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgaW50IGdldEluZGV4T2ZDaGlsZChPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKLQkJcmV0dXJuICgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBwYXJlbnQpLmluZGV4T2ZDaGlsZCgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVHJlZU1vZGVsTGlzdGVuZXIoVHJlZU1vZGVsTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb1RyZWVNb2RlbExpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkVHJlZU1vZGVsTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZVRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlVHJlZU1vZGVsTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmhhc05vVHJlZU1vZGVsTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBMaXN0ZW4gdG8gdGhlIHJvb3QgYW5kIGFsbCB0aGUgb3RoZXIgbm9kZXMKLQkgKiBpbiB0aGUgdW5kZXJseWluZyB0cmVlIG1vZGVsLgotCSAqLwotCXByaXZhdGUgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5yb290SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnJvb3RMaXN0ZW5lcik7Ci0JCXRoaXMucm9vdCA9IHRoaXMucm9vdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlpZiAodGhpcy5yb290ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwkvLyB0aGUgcm9vdCBjYW5ub3QgYmUgbnVsbCB3aGlsZSB3ZSBoYXZlIGxpc3RlbmVycwotCQl9Ci0JCXRoaXMuZW5nYWdlTm9kZSh0aGlzLnJvb3QpOwotCQl0aGlzLmFkZFJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHJvb3QgYW5kIGFsbCBvZiB0aGUgbm9kZXMgdG8gdGhlIHVuZGVybHlpbmcgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUm9vdCgpIHsKLQkJdGhpcy5hZGROb2RlKDAsIHRoaXMucm9vdCk7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHJvb3QgYW5kIGFsbCB0aGUgb3RoZXIKLQkgKiBub2RlcyBpbiB0aGUgdW5kZXJseWluZyB0cmVlIG1vZGVsLgotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5yZW1vdmVSb290KCk7Ci0JCXRoaXMuZGlzZW5nYWdlTm9kZSh0aGlzLnJvb3QpOwotCQl0aGlzLnJvb3QgPSBudWxsOwotCQl0aGlzLnJvb3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucm9vdExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHJvb3QgYW5kIGFsbCBvZiB0aGUgbm9kZXMgZnJvbSB0aGUgdW5kZXJseWluZyB0cmVlLgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVSb290KCkgewotCQl0aGlzLnJlbW92ZU5vZGUoMCwgdGhpcy5yb290KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcm9vdCBoYXMgYmVlbiBzd2FwcGVkLgotCSAqIFRoaXMgbWV0aG9kIGlzIGEgYml0IGduYXJseSBiZWNhdXNlIHRoZSBBUEkgZm9yIG5vdGlmeWluZyBsaXN0ZW5lcnMKLQkgKiB0aGF0IHRoZSByb290IGhhcyBjaGFuZ2VkIGlzIGEgYml0IGluY29uc2lzdGVudCB3aXRoIHRoYXQgdXNlZCBmb3IKLQkgKiBub24tcm9vdCBub2Rlcy4KLQkgKi8KLQl2b2lkIHJvb3RDaGFuZ2VkKCkgewotCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD4gbmV3Um9vdCA9IHRoaXMucm9vdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlpZiAobmV3Um9vdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsJLy8gdGhlIHJvb3QgY2Fubm90IGJlIG51bGwgd2hpbGUgd2UgaGF2ZSBsaXN0ZW5lcnMKLQkJfQotCQkvLyByZW1vdmUgYWxsIHRoZSBjdXJyZW50IHJvb3QncyBjaGlsZHJlbiBmcm9tIHRoZSB0cmVlCi0JCS8vIGFuZCByZW1vdmUgdGhlIGl0IGZyb20gdGhlIGludGVybmFsIHRyZWUKLQkJdGhpcy5yZW1vdmVSb290KCk7IAotCi0JCS8vIHNhdmUgdGhlIG9sZCByb290IGFuZCBzd2FwIGluIHRoZSBuZXcgcm9vdAotCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD4gb2xkUm9vdCA9IHRoaXMucm9vdDsKLQkJdGhpcy5yb290ID0gbmV3Um9vdDsKLQotCQkvLyB3ZSBtdXN0IGJlIGxpc3RlbmluZyB0byBib3RoIHRoZSBvbGQgYW5kIG5ldyByb290cyB3aGVuIHdlIGZpcmUgdGhlIGV2ZW50Ci0JCS8vIGJlY2F1c2UgdGhlaXIgdmFsdWVzIGNhbiBiZSBhZmZlY3RlZCBieSB3aGV0aGVyIHRoZXkgaGF2ZSBsaXN0ZW5lcnMKLQkJdGhpcy5lbmdhZ2VOb2RlKHRoaXMucm9vdCk7Ci0JCXRoaXMuZmlyZVRyZWVSb290UmVwbGFjZWQodGhpcy5yb290KTsKLQkJLy8gbm93IHdlIGNhbiBzdG9wIGxpc3RlbmluZyB0byB0aGUgb2xkIHJvb3QKLQkJdGhpcy5kaXNlbmdhZ2VOb2RlKG9sZFJvb3QpOwotCi0JCS8vIGFkZCB0aGUgbmV3IHJvb3QgdG8gdGhlIGludGVybmFsIHRyZWUgYW5kCi0JCS8vIGFkZCBhbGwgaXRzIGNoaWxkcmVuIHRvIHRoZSB0cmVlIGFsc28KLQkJdGhpcy5hZGRSb290KCk7Ci0JfQotCi0JLyoqCi0JICogRWl0aGVyIHRoZSAidmFsdWUiIG9yIHRoZSAic3RhdGUiIG9mIHRoZSBzcGVjaWZpZWQgbm9kZSBoYXMgY2hhbmdlZCwKLQkgKiBmb3J3YXJkIG5vdGlmaWNhdGlvbiB0byBvdXIgbGlzdGVuZXJzLgotCSAqLwotCXZvaWQgbm9kZUNoYW5nZWQoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUpIHsKLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHBhcmVudCA9IG5vZGUucGFyZW50KCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJdGhpcy5maXJlVHJlZVJvb3RDaGFuZ2VkKG5vZGUpOwotCQl9IGVsc2UgewotCQkJdGhpcy5maXJlVHJlZU5vZGVDaGFuZ2VkKHBhcmVudC5wYXRoKCksIHBhcmVudC5pbmRleE9mQ2hpbGQobm9kZSksIG5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSBub2Rlcywgbm90aWZ5IG91ciBsaXN0ZW5lcnMgdGhhdCB0aGUgbm9kZXMgd2VyZSBhZGRlZCwKLQkgKiBhbmQgdGhlbiBhZGQgdGhlIG5vZGVzIHRvIG91ciBpbnRlcm5hbCB0cmVlLgotCSAqIFdlIG11c3QgbGlzdGVuIHRvIHRoZSBub2RlcyBiZWZvcmUgbm90aWZ5aW5nIGFueWJvZHksIGJlY2F1c2UKLQkgKiBhZGRpbmcgYSBsaXN0ZW5lciBjYW4gY2hhbmdlIHRoZSB2YWx1ZSBvZiBhIG5vZGUuCi0JICovCi0Jdm9pZCBhZGRDaGlsZHJlbihUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXRoLCBpbnRbXSBjaGlsZEluZGljZXMsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGNoaWxkcmVuKSB7Ci0JCWludCBsZW4gPSBjaGlsZEluZGljZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQl0aGlzLmVuZ2FnZU5vZGUoY2hpbGRyZW5baV0pOwotCQl9Ci0JCXRoaXMuZmlyZVRyZWVOb2Rlc0luc2VydGVkKHBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRyZW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQl0aGlzLmFkZE5vZGUoY2hpbGRJbmRpY2VzW2ldLCBjaGlsZHJlbltpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMaXN0ZW4gdG8gdGhlIG5vZGUgYW5kIGl0cyBjaGlsZHJlbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlTm9kZShUcmVlTm9kZVZhbHVlTW9kZWw8VD4gbm9kZSkgewotCQlub2RlLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5ub2RlU3RhdGVMaXN0ZW5lcik7Ci0JCW5vZGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubm9kZVZhbHVlTGlzdGVuZXIpOwotCQlub2RlLmNoaWxkcmVuTW9kZWwoKS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuY2hpbGRyZW5MaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBub2RlIHRvIG91ciBpbnRlcm5hbCB0cmVlOwotCSAqIHRoZW4gcmVjdXJzZSBkb3duIHRocm91Z2ggdGhlIG5vZGUncyBjaGlsZHJlbiwKLQkgKiBhZGRpbmcgdGhlbSB0byB0aGUgaW50ZXJuYWwgdHJlZSBhbHNvLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGROb2RlKGludCBpbmRleCwgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUpIHsKLQkJdGhpcy5hZGROb2RlVG9JbnRlcm5hbFRyZWUobm9kZS5wYXJlbnQoKSwgaW5kZXgsIG5vZGUsIG5vZGUuY2hpbGRyZW5Nb2RlbCgpKTsKLQkJbmV3IE5vZGVDaGFuZ2VQb2xpY3kobm9kZSkuYWRkQ2hpbGRyZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBub2RlIHRvIG91ciBpbnRlcm5hbCB0cmVlLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGROb2RlVG9JbnRlcm5hbFRyZWUoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHBhcmVudCwgaW50IGluZGV4LCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gbm9kZSwgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbk1vZGVsKSB7Ci0JCUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBzaWJsaW5ncyA9IHRoaXMuY2hpbGRyZW5MaXN0cy5nZXQocGFyZW50KTsKLQkJaWYgKHNpYmxpbmdzID09IG51bGwpIHsKLQkJCXNpYmxpbmdzID0gbmV3IEFycmF5TGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KCk7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucHV0KHBhcmVudCwgc2libGluZ3MpOwotCQl9Ci0JCXNpYmxpbmdzLmFkZChpbmRleCwgbm9kZSk7Ci0KLQkJdGhpcy5wYXJlbnRzLnB1dChjaGlsZHJlbk1vZGVsLCBub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgbm9kZXMgZnJvbSBvdXIgaW50ZXJuYWwgdHJlZSwgbm90aWZ5IG91ciBsaXN0ZW5lcnMgdGhhdCB0aGUKLQkgKiBub2RlcyB3ZXJlIHJlbW92ZWQsIHRoZW4gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG5vZGVzLgotCSAqIFdlIG11c3QgbGlzdGVuIHRvIHRoZSBub2RlcyB1bnRpbCBhZnRlciBub3RpZnlpbmcgYW55Ym9keSwgYmVjYXVzZQotCSAqIHJlbW92aW5nIGEgbGlzdGVuZXIgY2FuIGNoYW5nZSB0aGUgdmFsdWUgb2YgYSBub2RlLgotCSAqLwotCXZvaWQgcmVtb3ZlQ2hpbGRyZW4oVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBjaGlsZHJlbikgewotCQlpbnQgbGVuID0gY2hpbGRJbmRpY2VzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJLy8gdGhlIGluZGljZXMgc2xpZGUgZG93biBhIG5vdGNoIGVhY2ggdGltZSB3ZSByZW1vdmUgYSBjaGlsZAotCQkJdGhpcy5yZW1vdmVOb2RlKGNoaWxkSW5kaWNlc1tpXSAtIGksIGNoaWxkcmVuW2ldKTsKLQkJfQotCQl0aGlzLmZpcmVUcmVlTm9kZXNSZW1vdmVkKHBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRyZW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU5vZGUoY2hpbGRyZW5baV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRmlyc3QsIHJlY3Vyc2UgZG93biB0aHJvdWdoIHRoZSBub2RlJ3MgY2hpbGRyZW4sCi0JICogcmVtb3ZpbmcgdGhlbSBmcm9tIG91ciBpbnRlcm5hbCB0cmVlOwotCSAqIHRoZW4gcmVtb3ZlIHRoZSBub2RlIGl0c2VsZiBmcm9tIG91ciBpbnRlcm5hbCB0cmVlLgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVOb2RlKGludCBpbmRleCwgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUpIHsKLQkJbmV3IE5vZGVDaGFuZ2VQb2xpY3kobm9kZSkucmVtb3ZlQ2hpbGRyZW4oKTsKLQkJdGhpcy5yZW1vdmVOb2RlRnJvbUludGVybmFsVHJlZShub2RlLnBhcmVudCgpLCBpbmRleCwgbm9kZS5jaGlsZHJlbk1vZGVsKCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG5vZGUgZnJvbSBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTm9kZUZyb21JbnRlcm5hbFRyZWUoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHBhcmVudCwgaW50IGluZGV4LCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGNoaWxkcmVuTW9kZWwpIHsKLQkJdGhpcy5wYXJlbnRzLnJlbW92ZShjaGlsZHJlbk1vZGVsKTsKLQotCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gc2libGluZ3MgPSB0aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCXNpYmxpbmdzLnJlbW92ZShpbmRleCk7Ci0JCWlmIChzaWJsaW5ncy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5yZW1vdmUocGFyZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBub2RlIGFuZCBpdHMgY2hpbGRyZW4gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc2VuZ2FnZU5vZGUoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUpIHsKLQkJbm9kZS5jaGlsZHJlbk1vZGVsKCkucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmNoaWxkcmVuTGlzdGVuZXIpOwotCQlub2RlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm5vZGVWYWx1ZUxpc3RlbmVyKTsKLQkJbm9kZS5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMubm9kZVN0YXRlTGlzdGVuZXIpOwotCX0KLQotCXZvaWQgbW92ZUNoaWxkcmVuKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbkxpc3QgPSB0aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCUFycmF5TGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4obGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJdGVtcC5hZGQoY2hpbGRyZW5MaXN0LnJlbW92ZShzb3VyY2VJbmRleCkpOwotCQl9Ci0JCWNoaWxkcmVuTGlzdC5hZGRBbGwodGFyZ2V0SW5kZXgsIHRlbXApOwotCi0JCXRoaXMuZmlyZVRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKHBhcmVudC5wYXRoKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMucm9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29hbGVzY2Ugc29tZSBvZiB0aGUgY29tbW9uIGNoYW5nZSBwb2xpY3kgYmVoYXZpb3IuCi0JICovCi0JYWJzdHJhY3QgY2xhc3MgQ2hhbmdlUG9saWN5IHsKLQotCQlDaGFuZ2VQb2xpY3koKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4uCi0JCSAqLwotCQl2b2lkIGFkZENoaWxkcmVuKCkgewotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLmFkZENoaWxkcmVuKHRoaXMucGFyZW50KCkucGF0aCgpLCB0aGlzLmNoaWxkSW5kaWNlcygpLCB0aGlzLmNoaWxkQXJyYXkoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCXZvaWQgcmVtb3ZlQ2hpbGRyZW4oKSB7Ci0JCQlUcmVlTW9kZWxBZGFwdGVyLnRoaXMucmVtb3ZlQ2hpbGRyZW4odGhpcy5wYXJlbnQoKS5wYXRoKCksIHRoaXMuY2hpbGRJbmRpY2VzKCksIHRoaXMuY2hpbGRBcnJheSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGluZGljZXMgb2YgdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLAotCQkgKiB3aGljaCBzaG91bGQgYmUgY29udGlndW91cy4KLQkJICovCi0JCWludFtdIGNoaWxkSW5kaWNlcygpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkSW5kaWNlcyh0aGlzLmNoaWxkcmVuU3RhcnRJbmRleCgpLCB0aGlzLmNoaWxkcmVuU2l6ZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLgotCQkgKi8KLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gY2hpbGRBcnJheSgpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkQXJyYXkodGhpcy5nZXRDaGlsZHJlbigpLCB0aGlzLmNoaWxkcmVuU2l6ZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBCdWlsZCBhbiBhcnJheSB0byBob2xkIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCQkgKiBJZiB0aGV5IGFyZSBkaWZmZXJlbnQgc2l6ZXMsIHNvbWV0aGluZyBpcyBzY3Jld2VkIHVwLi4uCi0JCSAqLwotCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBidWlsZEFycmF5KEl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZWxlbWVudHMsIGludCBzaXplKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGFycmF5ID0gbmV3IFRyZWVOb2RlVmFsdWVNb2RlbFtzaXplXTsKLQkJCWludCBpID0gMDsKLQkJCWZvciAoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGVsZW1lbnQgOiBlbGVtZW50cykgewotCQkJCWFycmF5W2krK10gPSBlbGVtZW50OwotCQkJfQotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhIHNldCBvZiBpbmRpY2VzLCBzdGFydGluZyBhdCB6ZXJvIGFuZAotCQkgKiBjb250aW51aW5nIGZvciB0aGUgc3BlY2lmaWVkIHNpemUuCi0JCSAqLwotCQlpbnRbXSBidWlsZEluZGljZXMoaW50IHNpemUpIHsKLQkJCXJldHVybiBidWlsZEluZGljZXMoMCwgc2l6ZSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGEgc2V0IG9mIGluZGljZXMsIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggYW5kCi0JCSAqIGNvbnRpbnVpbmcgZm9yIHRoZSBzcGVjaWZpZWQgc2l6ZS4KLQkJICovCi0JCWludFtdIGJ1aWxkSW5kaWNlcyhpbnQgc3RhcnQsIGludCBzaXplKSB7Ci0JCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFtzaXplXTsKLQkJCWludCBpbmRleCA9IHN0YXJ0OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpbmRpY2VzW2ldID0gaW5kZXgrKzsKLQkJCX0KLQkJCXJldHVybiBpbmRpY2VzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCWFic3RyYWN0IFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzdGFydGluZyBpbmRleCBmb3IgdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLgotCQkgKi8KLQkJYWJzdHJhY3QgaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLgotCQkgKi8KLQkJYWJzdHJhY3QgaW50IGNoaWxkcmVuU2l6ZSgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLgotCQkgKi8KLQkJYWJzdHJhY3QgSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBnZXRDaGlsZHJlbigpOwotCi0JfQotCi0KLQkvKioKLQkgKiBXcmFwcyBhIExpc3RFdmVudCBmb3IgYWRkaW5nLCByZW1vdmluZywgcmVwbGFjaW5nLAotCSAqIGFuZCBjaGFuZ2luZyBjaGlsZHJlbi4KLQkgKi8KLQlhYnN0cmFjdCBjbGFzcyBFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIENoYW5nZVBvbGljeSB7Ci0JCWZpbmFsIExpc3RFdmVudCBldmVudDsKLQotCQlFdmVudENoYW5nZVBvbGljeShMaXN0RXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogTWFwIHRoZSBMaXN0Q2hhbmdlRXZlbnQncyBzb3VyY2UgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcGFyZW50LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQoKSB7Ci0JCQlyZXR1cm4gVHJlZU1vZGVsQWRhcHRlci50aGlzLnBhcmVudHMuZ2V0KHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdyYXBzIGEgTGlzdEFkZEV2ZW50IGZvciBhZGRpbmcgY2hpbGRyZW4uCi0JICovCi0JY2xhc3MgQWRkRXZlbnRDaGFuZ2VQb2xpY3kgZXh0ZW5kcyBFdmVudENoYW5nZVBvbGljeSB7Ci0KLQkJQWRkRXZlbnRDaGFuZ2VQb2xpY3koTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQlzdXBlcihldmVudCk7Ci0JCX0KLQotCQlwcml2YXRlIExpc3RBZGRFdmVudCBnZXRFdmVudCgpIHsKLQkJCXJldHVybiAoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBMaXN0QWRkRXZlbnQncyBpdGVtIGluZGV4IGlzIHRoZSBjaGlsZHJlbiBzdGFydCBpbmRleC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TdGFydEluZGV4KCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0RXZlbnQoKS5nZXRJbmRleCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBMaXN0QWRkRXZlbnQncyBzaXplIGlzIHRoZSBjaGlsZHJlbiBzaXplLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRFdmVudCgpLmdldEl0ZW1zU2l6ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBMaXN0QWRkRXZlbnQncyBpdGVtcyBhcmUgdGhlIGNoaWxkcmVuLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldENoaWxkcmVuKCkgewotCQkJcmV0dXJuIChJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KSB0aGlzLmdldEV2ZW50KCkuZ2V0SXRlbXMoKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBXcmFwcyBhIExpc3RSZW1vdmVFdmVudCBmb3IgYWRkaW5nIGNoaWxkcmVuLgotCSAqLwotCWNsYXNzIFJlbW92ZUV2ZW50Q2hhbmdlUG9saWN5IGV4dGVuZHMgRXZlbnRDaGFuZ2VQb2xpY3kgewotCi0JCVJlbW92ZUV2ZW50Q2hhbmdlUG9saWN5KExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJc3VwZXIoZXZlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBMaXN0UmVtb3ZlRXZlbnQgZ2V0RXZlbnQoKSB7Ci0JCQlyZXR1cm4gKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdFJlbW92ZUV2ZW50J3MgaXRlbSBpbmRleCBpcyB0aGUgY2hpbGRyZW4gc3RhcnQgaW5kZXguCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLmdldEV2ZW50KCkuZ2V0SW5kZXgoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdFJlbW92ZUV2ZW50J3Mgc2l6ZSBpcyB0aGUgY2hpbGRyZW4gc2l6ZS4KLQkJICovCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0RXZlbnQoKS5nZXRJdGVtc1NpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdFJlbW92ZUV2ZW50J3MgaXRlbXMgYXJlIHRoZSBjaGlsZHJlbi4KLQkJICovCi0JCUBPdmVycmlkZQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBnZXRDaGlsZHJlbigpIHsKLQkJCXJldHVybiAoSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PikgdGhpcy5nZXRFdmVudCgpLmdldEl0ZW1zKCk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogV3JhcHMgYSBMaXN0UmVwbGFjZUV2ZW50IGZvciByZXBsYWNpbmcgY2hpbGRyZW4uCi0JICovCi0JY2xhc3MgUmVwbGFjZUV2ZW50Q2hhbmdlUG9saWN5IGV4dGVuZHMgRXZlbnRDaGFuZ2VQb2xpY3kgewotCi0JCVJlcGxhY2VFdmVudENoYW5nZVBvbGljeShMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQlzdXBlcihldmVudCk7Ci0JCX0KLQotCQlwcml2YXRlIExpc3RSZXBsYWNlRXZlbnQgZ2V0RXZlbnQoKSB7Ci0JCQlyZXR1cm4gKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RSZXBsYWNlRXZlbnQncyBpdGVtIGluZGV4IGlzIHRoZSBjaGlsZHJlbiBzdGFydCBpbmRleC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TdGFydEluZGV4KCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0RXZlbnQoKS5nZXRJbmRleCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBMaXN0UmVwbGFjZUV2ZW50J3Mgc2l6ZSBpcyB0aGUgY2hpbGRyZW4gc2l6ZS4KLQkJICovCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0RXZlbnQoKS5nZXRJdGVtc1NpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdFJlcGxhY2VFdmVudCdzIGl0ZW1zIGFyZSB0aGUgY2hpbGRyZW4uCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZ2V0Q2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gKEl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4pIHRoaXMuZ2V0RXZlbnQoKS5nZXROZXdJdGVtcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgb2xkIG5vZGVzIGFuZCBhZGQgdGhlIG5ldyBvbmVzLgotCQkgKi8KLQkJdm9pZCByZXBsYWNlQ2hpbGRyZW4oKSB7Ci0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXJlbnRQYXRoID0gdGhpcy5wYXJlbnQoKS5wYXRoKCk7Ci0JCQlpbnRbXSBjaGlsZEluZGljZXMgPSB0aGlzLmNoaWxkSW5kaWNlcygpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgdGhpcy5nZXRPbGRDaGlsZHJlbigpKTsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5hZGRDaGlsZHJlbihwYXJlbnRQYXRoLCBjaGlsZEluZGljZXMsIHRoaXMuY2hpbGRBcnJheSgpKTsKLQkJfQotCi0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGdldE9sZENoaWxkcmVuKCkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRBcnJheSh0aGlzLmdldE9sZEl0ZW1zKCksIHRoaXMuZ2V0RXZlbnQoKS5nZXRJdGVtc1NpemUoKSk7Ci0JCX0KLQotCQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZ2V0T2xkSXRlbXMoKSB7Ci0JCQlyZXR1cm4gKEl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4pIHRoaXMuZ2V0RXZlbnQoKS5nZXRPbGRJdGVtcygpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdyYXBzIGEgTGlzdE1vdmVFdmVudCBmb3IgbW92aW5nIGNoaWxkcmVuLgotCSAqLwotCWNsYXNzIE1vdmVFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIEV2ZW50Q2hhbmdlUG9saWN5IHsKLQotCQlNb3ZlRXZlbnRDaGFuZ2VQb2xpY3koTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJc3VwZXIoZXZlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBMaXN0TW92ZUV2ZW50IGdldEV2ZW50KCkgewotCQkJcmV0dXJuIChMaXN0TW92ZUV2ZW50KSB0aGlzLmV2ZW50OwotCQl9Ci0KLQkJdm9pZCBtb3ZlQ2hpbGRyZW4oKSB7Ci0JCQlUcmVlTW9kZWxBZGFwdGVyLnRoaXMubW92ZUNoaWxkcmVuKHRoaXMucGFyZW50KCksIHRoaXMuZ2V0RXZlbnQoKS5nZXRUYXJnZXRJbmRleCgpLCB0aGlzLmdldEV2ZW50KCkuZ2V0U291cmNlSW5kZXgoKSwgdGhpcy5nZXRFdmVudCgpLmdldExlbmd0aCgpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TdGFydEluZGV4KCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCUl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZ2V0Q2hpbGRyZW4oKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBXcmFwcyBhIExpc3RDbGVhckV2ZW50IGZvciBjbGVhcmluZyBjaGlsZHJlbi4KLQkgKi8KLQljbGFzcyBDbGVhckV2ZW50Q2hhbmdlUG9saWN5IGV4dGVuZHMgRXZlbnRDaGFuZ2VQb2xpY3kgewotCi0JCUNsZWFyRXZlbnRDaGFuZ2VQb2xpY3koTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKGV2ZW50KTsKLQkJfQotCi0JCS8qKgotCQkgKiBDbGVhciBhbGwgdGhlIG5vZGVzLgotCQkgKi8KLQkJdm9pZCBjbGVhckNoaWxkcmVuKCkgewotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHBhcmVudCA9IHRoaXMucGFyZW50KCk7Ci0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXJlbnRQYXRoID0gcGFyZW50LnBhdGgoKTsKLQkJCUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbkxpc3QgPSBUcmVlTW9kZWxBZGFwdGVyLnRoaXMuY2hpbGRyZW5MaXN0cy5nZXQocGFyZW50KTsKLQkJCWludFtdIGNoaWxkSW5kaWNlcyA9IHRoaXMuYnVpbGRJbmRpY2VzKGNoaWxkcmVuTGlzdC5zaXplKCkpOwotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gY2hpbGRBcnJheSA9IHRoaXMuYnVpbGRBcnJheShjaGlsZHJlbkxpc3QsIGNoaWxkcmVuTGlzdC5zaXplKCkpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRBcnJheSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblNpemUoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldENoaWxkcmVuKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogV3JhcHMgYSBMaXN0Q2hhbmdlRXZlbnQgZm9yIGNsZWFyaW5nIGNoaWxkcmVuLgotCSAqLwotCWNsYXNzIENoYW5nZUV2ZW50Q2hhbmdlUG9saWN5IGV4dGVuZHMgRXZlbnRDaGFuZ2VQb2xpY3kgewotCi0JCUNoYW5nZUV2ZW50Q2hhbmdlUG9saWN5KExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJc3VwZXIoZXZlbnQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSBhbGwgdGhlIG9sZCBub2RlcyBhbmQgYWRkIGFsbCB0aGUgbmV3IG5vZGVzLgotCQkgKi8KLQkJdm9pZCByZWJ1aWxkQ2hpbGRyZW4oKSB7Ci0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50ID0gdGhpcy5wYXJlbnQoKTsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIHBhcmVudFBhdGggPSBwYXJlbnQucGF0aCgpOwotCQkJTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGNoaWxkcmVuTGlzdCA9IFRyZWVNb2RlbEFkYXB0ZXIudGhpcy5jaGlsZHJlbkxpc3RzLmdldChwYXJlbnQpOwotCQkJaW50W10gY2hpbGRJbmRpY2VzID0gdGhpcy5idWlsZEluZGljZXMoY2hpbGRyZW5MaXN0LnNpemUoKSk7Ci0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBjaGlsZEFycmF5ID0gdGhpcy5idWlsZEFycmF5KGNoaWxkcmVuTGlzdCwgY2hpbGRyZW5MaXN0LnNpemUoKSk7Ci0JCQlUcmVlTW9kZWxBZGFwdGVyLnRoaXMucmVtb3ZlQ2hpbGRyZW4ocGFyZW50UGF0aCwgY2hpbGRJbmRpY2VzLCBjaGlsZEFycmF5KTsKLQotCQkJY2hpbGRJbmRpY2VzID0gdGhpcy5idWlsZEluZGljZXMocGFyZW50LmNoaWxkcmVuTW9kZWwoKS5zaXplKCkpOwotCQkJY2hpbGRBcnJheSA9IHRoaXMuYnVpbGRBcnJheShwYXJlbnQuY2hpbGRyZW5Nb2RlbCgpLCBwYXJlbnQuY2hpbGRyZW5TaXplKCkpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLmFkZENoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRBcnJheSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblNpemUoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldENoaWxkcmVuKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogV3JhcHMgYSBUcmVlTm9kZVZhbHVlTW9kZWwgZm9yIGFkZGluZyBhbmQgcmVtb3ZpbmcgaXRzIGNoaWxkcmVuLgotCSAqLwotCWNsYXNzIE5vZGVDaGFuZ2VQb2xpY3kgZXh0ZW5kcyBDaGFuZ2VQb2xpY3kgewotCQlwcml2YXRlIGZpbmFsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlOwotCi0JCU5vZGVDaGFuZ2VQb2xpY3koVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBub2RlIGl0c2VsZiBpcyB0aGUgcGFyZW50LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNpbmNlIHdlIHdpbGwgYWx3YXlzIGJlIGRlYWxpbmcgd2l0aCBhbGwgb2YgdGhlIG5vZGUncwotCQkgKiBjaGlsZHJlbiwgdGhlIGNoaWxkcmVuIHN0YXJ0IGluZGV4IGlzIGFsd2F5cyB6ZXJvLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblN0YXJ0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB3ZSB3aWxsIGFsd2F5cyBiZSBkZWFsaW5nIHdpdGggYWxsIG9mIHRoZSBub2RlJ3MKLQkJICogY2hpbGRyZW4sIHRoZSBjaGlsZHJlbiBzaXplIGlzIGFsd2F5cyBlcXVhbCB0byB0aGUgc2l6ZQotCQkgKiBvZiB0aGUgY2hpbGRyZW4gbW9kZWwuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLm5vZGUuY2hpbGRyZW5Nb2RlbCgpLnNpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB3ZSB3aWxsIGFsd2F5cyBiZSBkZWFsaW5nIHdpdGggYWxsIG9mIHRoZSBub2RlJ3MKLQkJICogY2hpbGRyZW4sIHRoZSBjaGlsZHJlbiBhcmUgYWxsIHRoZSBvYmplY3RzIGhlbGQgYnkKLQkJICogdGhlIGNoaWxkcmVuIG1vZGVsLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCUl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZ2V0Q2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub2RlLmNoaWxkcmVuTW9kZWwoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0Fic3RyYWN0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQ1NGRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0Fic3RyYWN0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNhbGxiYWNrQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIE5vZGUgY2xhc3Nlcy4KLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgaW5pdGlhbGl6YXRpb24KLSAqICAgICBlbmZvcmNlZCBvYmplY3QgaWRlbnRpdHkgd3J0ICNlcXVhbHMoKS8jaGFzaENvZGUoKQotICogICAgIGNvbnRhaW5tZW50IGhpZXJhcmNoeSAocGFyZW50L2NoaWxkKQotICogICAgIHVzZXIgY29tbWVudAotICogICAgIGRpcnR5IGZsYWcKLSAqICAgICBwcm9ibGVtcwotICogICAgIHNvcnRpbmcKLSAqIAotICogVHlwaWNhbGx5LCBzdWJjbGFzc2VzIHNob3VsZCBjb25zaWRlciBpbXBsZW1lbnRpbmcgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICogICAgIHRoZSBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RvcnMKLSAqICAgICAgICAgKHdpdGggdGhlIGFwcHJvcHJpYXRlbHktcmVzdHJpY3RpdmUgdHlwZSBkZWNsYXJhdGlvbiBmb3IgcGFyZW50KQotICogICAgICNpbml0aWFsaXplKCkKLSAqICAgICAjaW5pdGlhbGl6ZShOb2RlIHBhcmVudE5vZGUpCi0gKiAgICAgI2NoZWNrUGFyZW50KE5vZGUgcGFyZW50Tm9kZSkKLSAqICAgICAjYWRkQ2hpbGRyZW5UbyhMaXN0IGxpc3QpCi0gKiAgICAgI25vZGVSZW1vdmVkKE5vZGUpCi0gKiAgICAgI3ZhbGlkYXRvcigpCi0gKiAgICAgI3RyYW5zaWVudEFzcGVjdE5hbWVzKCkgb3IKLSAqICAgICAgICAgI2FkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0IHRyYW5zaWVudEFzcGVjdE5hbWVzKQotICogICAgICNhZGRQcm9ibGVtc1RvKExpc3QgY3VycmVudFByb2JsZW1zKQotICogICAgICNub25WYWxpZGF0ZWRBc3BlY3ROYW1lcygpCi0gKiAgICAgICAgICNhZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKFNldCBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcykKLSAqICAgICAjZGlzcGxheVN0cmluZygpCi0gKiAgICAgI3RvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vZGUgCi0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBOb2RlCi17Ci0KLQkvKiogQ29udGFpbm1lbnQgaGllcmFyY2h5LiAqLwotCXByaXZhdGUgTm9kZSBwYXJlbnQ7ICAvLyBwc2V1ZG8tZmluYWwKLQotCS8qKiBUcmFjayB3aGV0aGVyIHRoZSBub2RlIGhhcyBjaGFuZ2VkLiAqLwotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBkaXJ0eTsKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gZGlydHlCcmFuY2g7Ci0KLQkvKioKLQkgKiBUaGUgbm9kZSdzIHByb2JsZW1zLCBhcyBjYWxjdWxhdGVkIGR1cmluZyB2YWxpZGF0aW9uLgotCSAqIFRoaXMgbGlzdCBzaG91bGQgb25seSBiZSBtb2RpZmllZCB2aWEgYSBQcm9ibGVtU3luY2hyb25pemVyLAotCSAqIGFsbG93aW5nIGZvciBhc3luY2hyb25vdXMgbW9kaWZpY2F0aW9uIGZyb20gYW5vdGhlciB0aHJlYWQuCi0JICovCi0JcHJpdmF0ZSBWZWN0b3I8UHJvYmxlbT4gcHJvYmxlbXM7CQkvLyBwc2V1ZG8tZmluYWwKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfUFJPQkxFTV9NRVNTQUdFX0FSR1VNRU5UUyA9IG5ldyBPYmplY3RbMF07Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zLCBhcyBjYWxjdWxhdGVkIGR1cmluZyB2YWxpZGF0aW9uLgotCSAqIFRoaXMgbGlzdCBzaG91bGQgb25seSBiZSBtb2RpZmllZCB2aWEgYSBQcm9ibGVtU3luY2hyb25pemVyLAotCSAqIGFsbG93aW5nIGZvciBhc3luY2hyb25vdXMgbW9kaWZpY2F0aW9uIGZyb20gYW5vdGhlciB0aHJlYWQuCi0JICogVGhpcyBtdXN0IGJlIHJlY2FsY3VsYXRlZCBldmVyeSB0aW1lIHRoaXMgbm9kZSBvciBvbmUgb2YgaXRzCi0JICogZGVzY2VuZGFudHMgY2hhbmdlcyBpdCBwcm9ibGVtcy4KLQkgKi8KLQlwcml2YXRlIFZlY3RvcjxQcm9ibGVtPiBicmFuY2hQcm9ibGVtczsJCS8vIHBzZXVkby1maW5hbAotCi0JLyoqIFVzZXIgY29tbWVudC4gKi8KLQlwcml2YXRlIHZvbGF0aWxlIFN0cmluZyBjb21tZW50OwotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBmaWVsZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0cyBvZiB0cmFuc2llbnQgYXNwZWN0IG5hbWVzLCBrZXllZCBieSBjbGFzcy4KLQkgKiBUaGlzIGlzIGJ1aWx0IHVwIGxhemlseSwgYXMgdGhlIG9iamVjdHMgYXJlIG1vZGlmaWVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Tm9kZT4sIEhhc2hTZXQ8U3RyaW5nPj4gdHJhbnNpZW50QXNwZWN0TmFtZVNldHMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3ROb2RlPiwgSGFzaFNldDxTdHJpbmc+PigpOwotCi0JLyoqCi0JICogU2V0cyBvZiBub24tdmFsaWRhdGVkIGFzcGVjdCBuYW1lcywga2V5ZWQgYnkgY2xhc3MuCi0JICogVGhpcyBpcyBidWlsdCB1cCBsYXppbHksIGFzIHRoZSBvYmplY3RzIGFyZSBtb2RpZmllZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdE5vZGU+LCBIYXNoU2V0PFN0cmluZz4+IG5vblZhbGlkYXRlZEFzcGVjdE5hbWVTZXRzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Tm9kZT4sIEhhc2hTZXQ8U3RyaW5nPj4oKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogTW9zdCBvYmplY3RzIG11c3QgaGF2ZSBhIHBhcmVudC4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBuZXcgbm9kZS4KLQkgKiBAc2VlICNpbml0aWFsaXplKE5vZGUpCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0Tm9kZShOb2RlIHBhcmVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQkJdGhpcy5pbml0aWFsaXplKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEluaXRpYWxpemUgYSBuZXdseS1jcmVhdGVkIGluc3RhbmNlLgotCSAqIEBzZWUgI2luaXRpYWxpemUoTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLmNvbW1lbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGEgbmV3IG9iamVjdCBpcyBkaXJ0eSwgYnkgZGVmaW5pdGlvbgotCQl0aGlzLmRpcnR5ID0gdHJ1ZTsKLQkJdGhpcy5kaXJ0eUJyYW5jaCA9IHRydWU7Ci0KLQkJdGhpcy5wcm9ibGVtcyA9IG5ldyBWZWN0b3I8UHJvYmxlbT4oKTsKLQkJdGhpcy5icmFuY2hQcm9ibGVtcyA9IG5ldyBWZWN0b3I8UHJvYmxlbT4oKTsKLQotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5pbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBhIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2UuCi0JICogQHNlZSAjaW5pdGlhbGl6ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShOb2RlIHBhcmVudE5vZGUpIHsKLQkJdGhpcy5jaGVja1BhcmVudChwYXJlbnROb2RlKTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnROb2RlOwotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5pbml0aWFsaXplKHBhcmVudE5vZGUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBDYWxsYmFja0NoYW5nZVN1cHBvcnQodGhpcywgdGhpcy5idWlsZENoYW5nZVN1cHBvcnRMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0Lkxpc3RlbmVyIGJ1aWxkQ2hhbmdlU3VwcG9ydExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENhbGxiYWNrQ2hhbmdlU3VwcG9ydC5MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJCQlBYnN0cmFjdE5vZGUudGhpcy5hc3BlY3RDaGFuZ2VkKGFzcGVjdE5hbWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlcXVhbGl0eSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFbmZvcmNlIG9iamVjdCBpZGVudGl0eSAtIGRvIG5vdCBhbGxvdyBvYmplY3RzIHRvIGJlIGVxdWFsIHVubGVzcwotCSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgLSB3ZSByZWx5IG9uIG9iamVjdCBpZGVudGl0eSBleHRlbnNpdmVseS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMgPT0gbzsKLQl9Ci0KLQkvKioKLQkgKiBFbmZvcmNlIG9iamVjdCBpZGVudGl0eSAtIGRvIG5vdCBhbGxvdyBvYmplY3RzIHRvIGJlIGVxdWFsIHVubGVzcwotCSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgLSB3ZSByZWx5IG9uIG9iamVjdCBpZGVudGl0eSBleHRlbnNpdmVseS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGRyZW4pICoqKioqKioqKioKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBpbiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5LgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcGFyZW50LgotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHBhcmVudCBpcyBub3QgdmFsaWQKLQkgKiBmb3IgdGhlIG5vZGUuCi0JICogQnkgZGVmYXVsdCByZXF1aXJlIGEgbm9uLW51bGwgcGFyZW50LiBPdmVycmlkZSBpZiBvdGhlciByZXN0cmljdGlvbnMgZXhpc3QKLQkgKiBvciB0aGUgcGFyZW50IHNob3VsZCBiZSBudWxsLgotCSAqIE5COiBSb290IG5vZGUgbW9kZWwgaW1wbGVtZW50YXRpb25zIHdpbGwgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChOb2RlIHBhcmVudE5vZGUpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmVudCBub2RlIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIGNoaWxkcmVuLCB3aGljaCBhcmUgYWxzbyBub2Rlcy4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogT3ZlcnJpZGUgI2FkZENoaWxkcmVuVG8oTGlzdCkuCi0JICogQHNlZSAjZ2V0UGFyZW50KCkKLQkgKiBAc2VlICNhZGRDaGlsZHJlblRvKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBmaW5hbCBJdGVyYXRvcjxOb2RlPiBjaGlsZHJlbigpIHsKLQkJTGlzdDxOb2RlPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKLQkJdGhpcy5hZGRDaGlsZHJlblRvKGNoaWxkcmVuKTsKLQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIGNoaWxkcmVuCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlblRvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0PE5vZGU+IGxpc3QpIHsKLQkJLy8gdGhpcyBjbGFzcyBoYXMgbm8gY2hpbGRyZW4sIHN1YmNsYXNzZXMgd2lsbC4uLgotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5hZGRDaGlsZHJlblRvKGxpc3QpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5J3Mgcm9vdCBub2RlLgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcm9vdC4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqIE5COiBBc3N1bWUgdGhlIHJvb3QgaGFzIG5vIHBhcmVudC4KLQkgKi8KLQlwdWJsaWMgTm9kZSByb290KCkgewotCQlOb2RlIHAgPSB0aGlzLnBhcmVudDsKLQkJcmV0dXJuIChwID09IG51bGwpID8gdGhpcyA6IHAucm9vdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCi0JICogQnkgZGVmaW5pdGlvbiwgYSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiBpdHNlbGYuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZXNjZW5kYW50T2YoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAodGhpcyA9PSBub2RlKSB8fCB0aGlzLnBhcmVudElzRGVzY2VuZGFudE9mKG5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHBhcmVudElzRGVzY2VuZGFudE9mKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKHRoaXMucGFyZW50ICE9IG51bGwpICYmIHRoaXMucGFyZW50LmlzRGVzY2VuZGFudE9mKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gaG9sZGluZyBhbGwgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwKLQkgKiB0aGUgbm9kZSdzIGRlc2NlbmRhbnRzJyAicmVmZXJlbmNlcyIuICJSZWZlcmVuY2VzIiBhcmUKLQkgKiBvYmplY3RzIHRoYXQgYXJlICJyZWZlcmVuY2VkIiBieSBhbm90aGVyIG9iamVjdCwgYXMgb3Bwb3NlZAotCSAqIHRvICJvd25lZCIgYnkgYW5vdGhlciBvYmplY3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzKCkgewotCQlDb2xsZWN0aW9uPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxOb2RlLlJlZmVyZW5jZT4oMTAwMCk7CQkvLyBzdGFydCBiaWcKLQkJdGhpcy5hZGRCcmFuY2hSZWZlcmVuY2VzVG8oYnJhbmNoUmVmZXJlbmNlcyk7Ci0JCXJldHVybiBicmFuY2hSZWZlcmVuY2VzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwgdGhlIG5vZGUncyBkZXNjZW5kYW50cycKLQkgKiAicmVmZXJlbmNlcyIsIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gIlJlZmVyZW5jZXMiIGFyZQotCSAqIG9iamVjdHMgdGhhdCBhcmUgInJlZmVyZW5jZWQiIGJ5IGFub3RoZXIgb2JqZWN0LCBhcyBvcHBvc2VkCi0JICogdG8gIm93bmVkIiBieSBhbm90aGVyIG9iamVjdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvZiBwYXJ0aWN1bGFyIGNvbmNlcm4gdG8gSGFuZGxlcywgc2luY2UgbW9zdAotCSAqIChob3BlZnVsbHkgYWxsKSAicmVmZXJlbmNlcyIgYXJlIGhlbGQgYnkgSGFuZGxlcy4KLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCcmFuY2hSZWZlcmVuY2VzVG8oQ29sbGVjdGlvbjxOb2RlLlJlZmVyZW5jZT4gYnJhbmNoUmVmZXJlbmNlcykgewotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJY2hpbGQuYWRkQnJhbmNoUmVmZXJlbmNlc1RvKGJyYW5jaFJlZmVyZW5jZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG9iamVjdCdzIGJyYW5jaCBvZiB0aGUgdHJlZSwKLQkgKiBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLiBUaGUgbm9kZXMgd2lsbCBwcm9iYWJseSByZXR1cm5lZAotCSAqIGluICJkZXB0aC1maXJzdCIgb3JkZXIuCi0JICogT25seSByZWFsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxOb2RlPiBhbGxOb2RlcygpIHsKLQkJQ29sbGVjdGlvbjxOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oMTAwMCk7CQkvLyBzdGFydCBiaWcKLQkJdGhpcy5hZGRBbGxOb2Rlc1RvKG5vZGVzKTsKLQkJcmV0dXJuIG5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEk/Ci0JICogQWRkIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG9iamVjdCdzIGJyYW5jaCBvZiB0aGUgdHJlZSwKLQkgKiBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLCB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogT25seSByZWFsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbE5vZGVzVG8oQ29sbGVjdGlvbjxOb2RlPiBub2RlcykgewotCQlub2Rlcy5hZGQodGhpcyk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5hZGRBbGxOb2Rlc1RvKG5vZGVzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb2RlbCBzeW5jaHJvbml6YXRpb24gc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFRoaXMgaXMgYSBnZW5lcmFsIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBoYXMgYmVlbgotCSAqIHJlbW92ZWQgZnJvbSB0aGUgdHJlZS4gVGhlIG5vZGUgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uCi0JICogc2hvdWxkIHBlcmZvcm0gYW55IG5lY2Vzc2FyeSB1cGRhdGVzIHRvIHJlbWFpbiBpbiBzeW5jaAotCSAqIHdpdGggdGhlIHRyZWUgKGUuZy4gY2xlYXJpbmcgb3V0IG9yIHJlcGxhY2luZyBhbnkgcmVmZXJlbmNlcwotCSAqIHRvIHRoZSByZW1vdmVkIG5vZGUgb3IgYW55IG9mIHRoZSByZW1vdmVkIG5vZGUncyBkZXNjZW5kYW50cykuCi0JICogQHNlZSAjaXNEZXNjZW5kYW50T2YoTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLm5vZGVSZW1vdmVkKG5vZGUpOwotCQl9Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLm5vZGVSZW1vdmVkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqIHJldHVybiB3aGV0aGVyIG5vZGUxIGlzIGEgZGVzY2VuZGFudCBvZiBub2RlMjsKLQkgKiBub2RlMSBjYW4gYmUgbnVsbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5vZGVJc0Rlc2NlbmRhbnRPZihOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB7Ci0JCXJldHVybiAobm9kZTEgIT0gbnVsbCkgJiYgbm9kZTEuaXNEZXNjZW5kYW50T2Yobm9kZTIpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogVGhpcyBpcyBhIGdlbmVyYWwgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHNwZWNpZmllZCBub2RlIGhhcyBiZWVuCi0JICogcmVuYW1lZC4gVGhlIG5vZGUgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uIHNob3VsZCBtYXJrIGl0cwotCSAqIGJyYW5jaCBkaXJ0eSBpZiBuZWNlc3NhcnkgKGkuZS4gaXQgcmVmZXJlbmNlcyB0aGUgcmVuYW1lZCBub2RlCi0JICogb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cykuIFRoaXMgbWV0aG9kIGlzIG9mIHBhcnRpY3VsYXIgY29uY2VybgotCSAqIHRvIEhhbmRsZXMuCi0JICogQHNlZSAjaXNEZXNjZW5kYW50T2YoTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUmVuYW1lZChOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLm5vZGVSZW5hbWVkKG5vZGUpOwotCQl9Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLm5vZGVSZW5hbWVkKG5vZGUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHVzZXIgY29tbWVudCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCdzIHVzZXIgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGNvbW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBvYmplY3QncyB1c2VyIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgewotCQlPYmplY3Qgb2xkID0gdGhpcy5jb21tZW50OwotCQl0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09NTUVOVF9QUk9QRVJUWSwgb2xkLCBjb21tZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogQW4gYXNwZWN0IG9mIHRoZSBub2RlIGhhcyBjaGFuZ2VkOgotCSAqIAktIGlmIGl0IGlzIGEgcGVyc2lzdGVudCBhc3BlY3QsIG1hcmsgdGhlIG9iamVjdCBkaXJ0eQotCSAqIAktIGlmIGl0IGlzIGEgc2lnbmlmaWNhbnQgYXNwZWN0LCB2YWxpZGF0ZSB0aGUgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlpZiAodGhpcy5hc3BlY3RJc1BlcnNpc3RlbnQoYXNwZWN0TmFtZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBkaXJ0eSBjaGFuZ2U6ICIgKyB0aGlzICsgIjogIiArIGFzcGVjdE5hbWUpOwotCQkJdGhpcy5tYXJrRGlydHkoKTsKLQkJfQotCQlpZiAodGhpcy5hc3BlY3RDaGFuZ2VSZXF1aXJlc1ZhbGlkYXRpb24oYXNwZWN0TmFtZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiB2YWxpZGF0aW9uIGNoYW5nZTogIiArIHRoaXMgKyAiOiAiICsgYXNwZWN0TmFtZSk7Ci0JCQl0aGlzLnZhbGlkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJdGhpcy5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogUmV0dXJuIGEgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGEKLQkgKiAidmFsaWRhdGVkIiBhc3BlY3Qgb2YgdGhlIG5vZGUgdHJlZSBjaGFuZ2VzLgotCSAqIFR5cGljYWxseSBvbmx5IHRoZSByb290IG5vZGUgZGlyZWN0bHkgaG9sZHMgYSB2YWxpZGF0b3IuCi0JICogTkI6IFJvb3Qgbm9kZSBtb2RlbCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBOb2RlLlZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIG5vZGUgc2hvdWxkIG5vdCBiZSBmaXJpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgaXRzIGNvbnN0cnVjdGlvbi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0aGlzLnBhcmVudC5nZXRWYWxpZGF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbmV2ZXIgYQotCSAqICJ2YWxpZGF0ZWQiIGFzcGVjdCBvZiB0aGUgbm9kZSB0cmVlIGNoYW5nZXMuCi0JICogVHlwaWNhbGx5IG9ubHkgdGhlIHJvb3Qgbm9kZSBkaXJlY3RseSBob2xkcyBhIHZhbGlkYXRvci4KLQkgKiBOQjogUm9vdCBub2RlIG1vZGVsIGltcGxlbWVudGF0aW9ucyB3aWxsIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKE5vZGUuVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyByb290IG5vZGUgc2hvdWxkIGltcGxlbWVudCAjc2V0VmFsaWRhdG9yKE5vZGUuVmFsaWRhdG9yKS4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiT25seSByb290IG5vZGVzIGltcGxlbWVudCAjc2V0VmFsaWRhdG9yKE5vZGUuVmFsaWRhdG9yKS4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXJ0eSBmbGFnIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IHBlcnNpc3RlbnQgYXNwZWN0cyBvZiB0aGUgb2JqZWN0Ci0JICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBvYmplY3Qgd2FzIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKiBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgY2hhbmdlcyB0byB0aGUgb2JqZWN0J3MgZGVzY2VuZGFudHMuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZGlydHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IHBlcnNpc3RlbnQgYXNwZWN0cyBvZiB0aGUgb2JqZWN0LAotCSAqIG9yIGFueSBvZiBpdHMgZGVzY2VuZGFudHMsIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgb2JqZWN0IGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RpcnR5QnJhbmNoKCkgewotCQlyZXR1cm4gdGhpcy5kaXJ0eUJyYW5jaDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgb2JqZWN0IGlzIHVubW9kaWZpZWQKLQkgKiBzaW5jZSBpdCB3YXMgbGFzdCByZWFkIG9yIHNhdmVkLgotCSAqIFRoaXMgZG9lcyBOT1QgaW5jbHVkZSBjaGFuZ2VzIHRvIHRoZSBvYmplY3QncyBkZXNjZW5kYW50cy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NsZWFuKCkgewotCQlyZXR1cm4gISB0aGlzLmRpcnR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBvYmplY3QgYW5kIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMKLQkgKiBhcmUgdW5tb2RpZmllZCBzaW5jZSB0aGUgb2JqZWN0IGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NsZWFuQnJhbmNoKCkgewotCQlyZXR1cm4gISB0aGlzLmRpcnR5QnJhbmNoOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZGlydHkgYnJhbmNoIGZsYWcgc2V0dGluZy4gVGhpcyBpcyBzZXQgdG8gdHJ1ZQotCSAqIHdoZW4gZWl0aGVyIHRoZSBvYmplY3Qgb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cyBiZWNvbWVzIGRpcnR5LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRJc0RpcnR5QnJhbmNoKGJvb2xlYW4gZGlydHlCcmFuY2gpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRpcnR5QnJhbmNoOwotCQl0aGlzLmRpcnR5QnJhbmNoID0gZGlydHlCcmFuY2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVJUWV9CUkFOQ0hfUFJPUEVSVFksIG9sZCwgZGlydHlCcmFuY2gpOwotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIG9iamVjdCBhcyBkaXJ0eSBhbmQgYXMgYSBkaXJ0eSBicmFuY2guCi0JICogQW4gb2JqZWN0IGlzIG1hcmtlZCBkaXJ0eSB3aGVuIGVpdGhlciBhICJwZXJzaXN0ZW50IiBhdHRyaWJ1dGUKLQkgKiBoYXMgY2hhbmdlZCBvciBpdHMgc2F2ZSBsb2NhdGlvbiBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFya0RpcnR5KCkgewotCQl0aGlzLmRpcnR5ID0gdHJ1ZTsKLQkJdGhpcy5tYXJrQnJhbmNoRGlydHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGl0cyBwYXJlbnQgYXMgZGlydHkgYnJhbmNoZXMuCi0JICogVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgZGlydHkuCi0JICovCi0JcHVibGljIHZvaWQgbWFya0JyYW5jaERpcnR5KCkgewotCQkvLyBzaG9ydC1jaXJjdWl0IGFueSB1bm5lY2Vzc2FyeSBwcm9wYWdhdGlvbgotCQlpZiAodGhpcy5kaXJ0eUJyYW5jaCkgewotCQkJLy8gaWYgdGhpcyBpcyBhbHJlYWR5IGEgZGlydHkgYnJhbmNoLCB0aGUgcGFyZW50IG11c3QgYmUgYWxzbwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGhpcy5zZXRJc0RpcnR5QnJhbmNoKHRydWUpOwotCQl0aGlzLm1hcmtQYXJlbnRCcmFuY2hEaXJ0eSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1hcmtQYXJlbnRCcmFuY2hEaXJ0eSgpIHsKLQkJaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHsKLQkJCXRoaXMucGFyZW50Lm1hcmtCcmFuY2hEaXJ0eSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFyayB0aGUgb2JqZWN0IGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGFzIGRpcnR5LgotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBzYXZlIGxvY2F0aW9uIG9mIHNvbWUKLQkgKiB0b3AtbGV2ZWwgb2JqZWN0IGlzIGNoYW5nZWQgYW5kIHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlIG11c3QgYmUgbWFya2VkIGRpcnR5IHNvIGl0Ci0JICogd2lsbCBiZSB3cml0dGVuIG91dC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBtYXJrRW50aXJlQnJhbmNoRGlydHkoKSB7Ci0JCXRoaXMubWFya0RpcnR5KCk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5tYXJrRW50aXJlQnJhbmNoRGlydHkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIG9iamVjdCBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBhcyBjbGVhbi4KLQkgKiBUaGVuIG5vdGlmeSB0aGUgb2JqZWN0J3MgcGFyZW50IHRoYXQgaXQgKHRoZSBwYXJlbnQpCi0JICogbWlnaHQgbm93IGJlIGEgY2xlYW4gYnJhbmNoIGFsc28uCi0JICogVHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgb2JqZWN0IGhhcyBqdXN0IGJlZW4KLQkgKiByZWFkIGluIG9yIHdyaXR0ZW4gb3V0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG1hcmtFbnRpcmVCcmFuY2hDbGVhbigpIHsKLQkJdGhpcy5jYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCXRoaXMubWFya1BhcmVudEJyYW5jaENsZWFuSWZQb3NzaWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1hcmtQYXJlbnRCcmFuY2hDbGVhbklmUG9zc2libGUoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudC5tYXJrQnJhbmNoQ2xlYW5JZlBvc3NpYmxlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgYXMgY2xlYW4uCi0JICogVHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgbm9kZSBoYXMganVzdCBiZWVuCi0JICogcmVhZCBpbiBvciB3cml0dGVuIG91dC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqIE5vdCB0aGUgYmVzdCBvZiBtZXRob2QgbmFtZXMuLi4uIDotKAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNhc2NhZGVNYXJrRW50aXJlQnJhbmNoQ2xlYW4oKSB7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5jYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCX0KLQkJdGhpcy5kaXJ0eSA9IGZhbHNlOwotCQl0aGlzLnNldElzRGlydHlCcmFuY2goZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQSBjaGlsZCBub2RlJ3MgYnJhbmNoIGhhcyBiZWVuIG1hcmtlZCBjbGVhbi4gSWYgdGhlIG5vZGUKLQkgKiBpdHNlbGYgaXMgY2xlYW4gYW5kIGlmIGFsbCBvZiBpdHMgY2hpbGRyZW4gYXJlIGFsc28gY2xlYW4sIHRoZQotCSAqIG5vZGUncyBicmFuY2ggY2FuIGJlIG1hcmtlZCBjbGVhbi4gVGhlbiwgaWYgdGhlIG5vZGUncwotCSAqIGJyYW5jaCBpcyBjbGVhbiwgdGhlIG5vZGUgd2lsbCBub3RpZnkgaXRzIHBhcmVudCB0aGF0IGl0IG1pZ2h0Ci0JICogYmUgY2xlYW4gYWxzby4gVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgY2xlYW4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbWFya0JyYW5jaENsZWFuSWZQb3NzaWJsZSgpIHsKLQkJLy8gc2hvcnQtY2lyY3VpdCBhbnkgdW5uZWNlc3NhcnkgcHJvcGFnYXRpb24KLQkJaWYgKHRoaXMuZGlydHkpIHsKLQkJCS8vIGlmIHRoZSBvYmplY3QgaXMgImxvY2FsbHkiIGRpcnR5LCBpdCBpcyBzdGlsbCBhIGRpcnR5IGJyYW5jaAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWlmIChjaGlsZC5pc0RpcnR5QnJhbmNoKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNldElzRGlydHlCcmFuY2goZmFsc2UpOwotCQl0aGlzLm1hcmtQYXJlbnRCcmFuY2hDbGVhbklmUG9zc2libGUoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXNwZWN0SXNQZXJzaXN0ZW50KFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuYXNwZWN0SXNUcmFuc2llbnQoYXNwZWN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFzcGVjdElzVHJhbnNpZW50KFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zaWVudEFzcGVjdE5hbWVzKCkuY29udGFpbnMoYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIHRoZSBvYmplY3QncyB0cmFuc2llbnQgYXNwZWN0IG5hbWVzLgotCSAqIFRoZXNlIGFyZSB0aGUgYXNwZWN0cyB0aGF0LCB3aGVuIHRoZXkgY2hhbmdlLCB3aWxsIE5PVCBjYXVzZSB0aGUKLQkgKiBvYmplY3QgdG8gYmUgbWFya2VkIGRpcnR5LgotCSAqIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgdHJhbnNpZW50IGFzcGVjdHMsCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIGNsYXNzLWJhc2VkIGNhbGN1bGF0aW9uIGlzIHN1ZmZpY2llbnQsCi0JICogb3ZlcnJpZGUgI2FkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0KS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2V0PFN0cmluZz4gdHJhbnNpZW50QXNwZWN0TmFtZXMoKSB7Ci0JCXN5bmNocm9uaXplZCAodHJhbnNpZW50QXNwZWN0TmFtZVNldHMpIHsKLQkJCUhhc2hTZXQ8U3RyaW5nPiB0cmFuc2llbnRBc3BlY3ROYW1lcyA9IHRyYW5zaWVudEFzcGVjdE5hbWVTZXRzLmdldCh0aGlzLmdldENsYXNzKCkpOwotCQkJaWYgKHRyYW5zaWVudEFzcGVjdE5hbWVzID09IG51bGwpIHsKLQkJCQl0cmFuc2llbnRBc3BlY3ROYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCQl0aGlzLmFkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8odHJhbnNpZW50QXNwZWN0TmFtZXMpOwotCQkJCXRyYW5zaWVudEFzcGVjdE5hbWVTZXRzLnB1dCh0aGlzLmdldENsYXNzKCksIHRyYW5zaWVudEFzcGVjdE5hbWVzKTsKLQkJCX0KLQkJCXJldHVybiB0cmFuc2llbnRBc3BlY3ROYW1lczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgb2JqZWN0J3MgdHJhbnNpZW50IGFzcGVjdCBuYW1lcyB0byB0aGUgc3BlY2lmaWVkIHNldC4KLQkgKiBUaGVzZSBhcmUgdGhlIGFzcGVjdHMgdGhhdCwgd2hlbiB0aGV5IGNoYW5nZSwgd2lsbCBOT1QgY2F1c2UgdGhlCi0JICogb2JqZWN0IHRvIGJlIG1hcmtlZCBkaXJ0eS4KLQkgKiBJZiBjbGFzcy1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyIHRyYW5zaWVudCBhc3BlY3RzIGlzIHN1ZmZpY2llbnQsCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uLAotCSAqIG92ZXJyaWRlICN0cmFuc2llbnRBc3BlY3ROYW1lcygpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0PFN0cmluZz4gdHJhbnNpZW50QXNwZWN0TmFtZXMpIHsKLQkJdHJhbnNpZW50QXNwZWN0TmFtZXMuYWRkKERJUlRZX0JSQU5DSF9QUk9QRVJUWSk7Ci0JCXRyYW5zaWVudEFzcGVjdE5hbWVzLmFkZChCUkFOQ0hfUFJPQkxFTVNfTElTVCk7Ci0JCXRyYW5zaWVudEFzcGVjdE5hbWVzLmFkZChIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZKTsKLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkVHJhbnNpZW50QXNwZWN0TmFtZXNUbyh0cmFuc2llbnRBc3BlY3ROYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkaXJ0eSBub2RlcyBpbiB0aGUgb2JqZWN0J3MgYnJhbmNoIG9mIHRoZSB0cmVlLAotCSAqIGluY2x1ZGluZyB0aGUgbm9kZSBpdHNlbGYgKGlmIGFwcHJvcHJpYXRlKS4KLQkgKiBPbmx5IHJlYWxseSB1c2VkIGZvciB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcuCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhdG9yPE5vZGU+IGFsbERpcnR5Tm9kZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8Tm9kZT4odGhpcy5hbGxOb2RlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChOb2RlIG5vZGUpIHsKLQkJCQlyZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE5vZGUpICYmICgoQWJzdHJhY3ROb2RlKSBub2RlKS5pc0RpcnR5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb2JsZW1zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbm9kZSdzIHByb2JsZW1zLgotCSAqIFRoaXMgZG9lcyBOT1QgaW5jbHVkZSB0aGUgcHJvYmxlbXMgb2YgdGhlIG5vZGUncyBkZXNjZW5kYW50cy4KLQkgKiBAc2VlICNicmFuY2hQcm9ibGVtcygpCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhdG9yPFByb2JsZW0+IHByb2JsZW1zKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8UHJvYmxlbT4odGhpcy5wcm9ibGVtcyk7CS8vIHJlbW92ZXMgYXJlIG5vdCBhbGxvd2VkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub2RlJ3MgcHJvYmxlbXMuCi0JICogVGhpcyBkb2VzIE5PVCBpbmNsdWRlIHRoZSBwcm9ibGVtcyBvZiB0aGUgbm9kZSdzIGRlc2NlbmRhbnRzLgotCSAqIEBzZWUgI2JyYW5jaFByb2JsZW1zU2l6ZSgpCi0JICovCi0JcHVibGljIGZpbmFsIGludCBwcm9ibGVtc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnByb2JsZW1zLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbm9kZSBoYXMgcHJvYmxlbXMKLQkgKiBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgdGhlIHByb2JsZW1zIG9mIHRoZSBub2RlJ3MgZGVzY2VuZGFudHMuCi0JICogQHNlZSAjaGFzQnJhbmNoUHJvYmxlbXMoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1Byb2JsZW1zKCkgewotCQlyZXR1cm4gISB0aGlzLnByb2JsZW1zLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBub2RlJ3MgcHJvYmxlbXMgYWxvbmcgd2l0aCBhbGwgdGhlCi0JICogbm9kZSdzIGRlc2NlbmRhbnRzJyBwcm9ibGVtcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdEl0ZXJhdG9yPFByb2JsZW0+IGJyYW5jaFByb2JsZW1zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFByb2JsZW0+KHRoaXMuYnJhbmNoUHJvYmxlbXMpOwkvLyByZW1vdmVzIGFyZSBub3QgYWxsb3dlZAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiBhbGwgdGhlIG5vZGUncyBwcm9ibGVtcyBhbG9uZyB3aXRoIGFsbCB0aGUKLQkgKiBub2RlJ3MgZGVzY2VuZGFudHMnIHByb2JsZW1zLgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgYnJhbmNoUHJvYmxlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5icmFuY2hQcm9ibGVtcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cyBoYXZlIHByb2JsZW1zLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0JyYW5jaFByb2JsZW1zKCkgewotCQlyZXR1cm4gISB0aGlzLmJyYW5jaFByb2JsZW1zLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc0JyYW5jaFByb2JsZW0oUHJvYmxlbSBwcm9ibGVtKSB7Ci0JCXJldHVybiB0aGlzLmJyYW5jaFByb2JsZW1zLmNvbnRhaW5zKHByb2JsZW0pOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBQcm9ibGVtIGJ1aWxkUHJvYmxlbShTdHJpbmcgbWVzc2FnZUtleSwgT2JqZWN0Li4uIG1lc3NhZ2VBcmd1bWVudHMpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0UHJvYmxlbSh0aGlzLCBtZXNzYWdlS2V5LCBtZXNzYWdlQXJndW1lbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUHJvYmxlbSBidWlsZFByb2JsZW0oU3RyaW5nIG1lc3NhZ2VLZXkpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQcm9ibGVtKG1lc3NhZ2VLZXksIEVNUFRZX1BST0JMRU1fTUVTU0FHRV9BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBub2RlIGFuZCBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLAotCSAqIGFuZCB1cGRhdGUgdGhlaXIgc2V0cyBvZiAiYnJhbmNoIiBwcm9ibGVtcy4KLQkgKiBJZiB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwKLQkgKiBub3RpZnkgdGhlIG5vZGUncyBwYXJlbnQuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVCcmFuY2goKSB7Ci0JCWlmICh0aGlzLnZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKSkgewotCQkJLy8gaWYgb3VyICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwgdGhlbgotCQkJLy8gb3VyIHBhcmVudCBtdXN0IHJlYnVpbGQgaXRzICJicmFuY2giIHByb2JsZW1zIGFsc28KLQkJCXRoaXMucmVidWlsZFBhcmVudEJyYW5jaFByb2JsZW1zKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWJ1aWxkUGFyZW50QnJhbmNoUHJvYmxlbXMoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudC5yZWJ1aWxkQnJhbmNoUHJvYmxlbXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogVmFsaWRhdGUgdGhlIG5vZGUgYW5kIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMsCi0JICogYW5kIHVwZGF0ZSB0aGVpciBzZXRzIG9mICJicmFuY2giIHByb2JsZW1zLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIG9mICJicmFuY2giIHByb2JsZW1zIGhhcyBjaGFuZ2VkLgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgaXQgaXMgbm90IGZvcgotCSAqIGNsaWVudCB1c2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCcmFuY2hJbnRlcm5hbCgpIHsKLQkJLy8gcmVidWlsZCAiYnJhbmNoIiBwcm9ibGVtcyBpbiBjaGlsZHJlbiBmaXJzdAotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJLy8gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gcmVidWlsZCBvdXIgImJyYW5jaCIKLQkJCS8vIHByb2JsZW1zIG5vIG1hdHRlciB3aGF0LCB0byBzZWUgaWYgdGhleSBoYXZlIGNoYW5nZWQKLQkJCWNoaWxkLnZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKTsKLQkJfQotCi0JCXRoaXMucHJvYmxlbXMuY2xlYXIoKTsKLQkJdGhpcy5hZGRQcm9ibGVtc1RvKHRoaXMucHJvYmxlbXMpOwotCi0JCXJldHVybiB0aGlzLmNoZWNrQnJhbmNoUHJvYmxlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmb3IgYW55IHByb2JsZW1zIGFuZCBhZGQgdGhlbSB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIE9OTFkgYWRkIHByb2JsZW1zIGZvciB0aGlzIHBhcnRpY3VsYXIgbm9kZTsKLQkgKiBpdCBzaG91bGQgTk9UIGFkZCBwcm9ibGVtcyBmb3IgYW55IG9mIHRoaXMgbm9kZSdzIGRlc2NlbmRhbnRzCi0JICogb3IgYW5jZXN0b3JzLiAoQWx0aG91Z2ggdGhlcmUgd2lsbCBiZSB0aW1lcyB3aGVuIGl0IGlzIGRlYmF0YWJsZQotCSAqIGFzIHRvIHdoaWNoIG5vZGUgYSBwcm9ibGVtICJiZWxvbmdzIiB0by4uLi4pCi0JICogCi0JICogTkI6IFRoaXMgbWV0aG9kIHNob3VsZCBOT1QgbW9kaWZ5IEFOWSBwYXJ0IG9mIHRoZSBub2RlJ3Mgc3RhdGUhCi0JICogSXQgaXMgYSBSRUFELU9OTFkgYmVoYXZpb3IuIE9OTFkgdGhlIGxpc3Qgb2YgY3VycmVudCBwcm9ibGVtcwotCSAqIHBhc3NlZCBpbiB0byB0aGUgbWV0aG9kIHNob3VsZCBiZSBtb2RpZmllZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9ibGVtc1RvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgewotCQkvLyBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgotCQkvLyBXaGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCX0KLQotCS8qKgotCSAqIFJlYnVpbGQgdGhlICJicmFuY2giIHByb2JsZW1zIGFuZCByZXR1cm4gd2hldGhlciB0aGV5IGhhdmUKLQkgKiBjaGFuZ2VkLgotCSAqIE5COiBUaGUgZW50aXJlIGNvbGxlY3Rpb24gb2YgImJyYW5jaCIgcHJvYmxlbXMgbXVzdCBiZSByZS1jYWxjdWxhdGVkCi0JICogd2l0aCBFVkVSWSAic2lnbmlmaWNhbnQiIGNoYW5nZSAtIHdlIGNhbm5vdCBrZWVwIGl0IGluIHN5bmNoIHZpYQotCSAqIGNoYW5nZSBub3RpZmljYXRpb25zIGJlY2F1c2UgaWYgYSBkZXNjZW5kYW50IHdpdGggcHJvYmxlbXMgaXMKLQkgKiByZW1vdmVkIG9yIHJlcGxhY2VkIHdlIHdpbGwgbm90IHJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgaXRzCi0JICogcHJvYmxlbXMgd2VyZSByZW1vdmVkIGZyb20gb3VyICJicmFuY2giIHByb2JsZW1zLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja0JyYW5jaFByb2JsZW1zKCkgewotCQlWZWN0b3I8UHJvYmxlbT4gb2xkQnJhbmNoUHJvYmxlbXMgPSBuZXcgVmVjdG9yPFByb2JsZW0+KHRoaXMuYnJhbmNoUHJvYmxlbXMpOwotCQlpbnQgb2xkU2l6ZSA9IHRoaXMuYnJhbmNoUHJvYmxlbXMuc2l6ZSgpOwotCi0JCXRoaXMuYnJhbmNoUHJvYmxlbXMuY2xlYXIoKTsKLQkJdGhpcy5icmFuY2hQcm9ibGVtcy5hZGRBbGwodGhpcy5wcm9ibGVtcyk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5hZGRCcmFuY2hQcm9ibGVtc1RvKHRoaXMuYnJhbmNoUHJvYmxlbXMpOwotCQl9Ci0KLQkJLy8gaWYgdGhlIHNpemUgaGFzIGNoYW5nZWQgdG8gb3IgZnJvbSB6ZXJvLCBvdXIgdmlydHVhbCBmbGFnIGhhcyBjaGFuZ2VkCi0JCWludCBuZXdTaXplID0gdGhpcy5icmFuY2hQcm9ibGVtcy5zaXplKCk7Ci0JCWlmICgob2xkU2l6ZSA9PSAwKSAmJiAobmV3U2l6ZSAhPSAwKSkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhBU19CUkFOQ0hfUFJPQkxFTVNfUFJPUEVSVFksIGZhbHNlLCB0cnVlKTsKLQkJfSBlbHNlIGlmICgob2xkU2l6ZSAhPSAwKSAmJiAobmV3U2l6ZSA9PSAwKSkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhBU19CUkFOQ0hfUFJPQkxFTVNfUFJPUEVSVFksIHRydWUsIGZhbHNlKTsKLQkJfQotCi0JCWlmIChvbGRCcmFuY2hQcm9ibGVtcy5lcXVhbHModGhpcy5icmFuY2hQcm9ibGVtcykpIHsKLQkJCXJldHVybiBmYWxzZTsJCS8vIG91ciAiYnJhbmNoIiBwcm9ibGVtcyBkaWQgbm90IGNoYW5nZQotCQl9Ci0JCS8vIG91ciAiYnJhbmNoIiBwcm9ibGVtcyBjaGFuZ2VkCi0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEJSQU5DSF9QUk9CTEVNU19MSVNULCB0aGlzLmJyYW5jaFByb2JsZW1zKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgYWxsIHRoZSBwcm9ibGVtcyBvZiB0aGUgbm9kZSBhbmQgYWxsCi0JICogdGhlIHByb2JsZW1zIG9mIGl0cyBkZXNjZW5kYW50cyB0byB0aGUKLQkgKiBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRCcmFuY2hQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gbGlzdCkgewotCQlsaXN0LmFkZEFsbCh0aGlzLmJyYW5jaFByb2JsZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEEgY2hpbGQgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGNoYW5nZWQ7Ci0JICogdGhlcmVmb3JlIHRoZSBub2RlJ3MgImJyYW5jaCIgcHJvYmxlbXMgaGF2ZSBjaGFuZ2VkIGFsc28gYW5kCi0JICogbXVzdCBiZSByZWJ1aWx0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlYnVpbGRCcmFuY2hQcm9ibGVtcygpIHsKLQkJaWYgKCAhIHRoaXMuY2hlY2tCcmFuY2hQcm9ibGVtcygpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ3ZSBzaG91bGQgbm90IGdldCBoZXJlIHVubGVzcyBvdXIgXCJicmFuY2hcIiBwcm9ibGVtcyBoYXZlIGNoYW5nZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMucmVidWlsZFBhcmVudEJyYW5jaFByb2JsZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBJZiB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwKLQkgKiBub3RpZnkgdGhlIG5vZGUncyBwYXJlbnQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY2xlYXJBbGxCcmFuY2hQcm9ibGVtcygpIHsKLQkJaWYgKHRoaXMuY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCkpIHsKLQkJCS8vIGlmIG91ciAiYnJhbmNoIiBwcm9ibGVtcyBoYXZlIGNoYW5nZWQsIHRoZW4KLQkJCS8vIG91ciBwYXJlbnQgbXVzdCByZWJ1aWxkIGl0cyAiYnJhbmNoIiBwcm9ibGVtcyBhbHNvCi0JCQl0aGlzLnJlYnVpbGRQYXJlbnRCcmFuY2hQcm9ibGVtcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBDbGVhciB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGFuZCB0aGUgImJyYW5jaCIKLQkgKiBwcm9ibGVtcyBvZiBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIG9mICJicmFuY2giIHByb2JsZW1zIGhhcyBjaGFuZ2VkLgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgaXQgaXMgbm90IGZvcgotCSAqIGNsaWVudCB1c2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCkgewotCQlpZiAodGhpcy5icmFuY2hQcm9ibGVtcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJLy8gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gY2xlYXIgb3VyICJicmFuY2giCi0JCQkvLyBwcm9ibGVtcyBubyBtYXR0ZXIgd2hhdAotCQkJY2hpbGQuY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCk7Ci0JCX0KLQkJdGhpcy5wcm9ibGVtcy5jbGVhcigpOwotCQl0aGlzLmJyYW5jaFByb2JsZW1zLmNsZWFyKCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZLCB0cnVlLCBmYWxzZSk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEJSQU5DSF9QUk9CTEVNU19MSVNULCB0aGlzLmJyYW5jaFByb2JsZW1zKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYSBjaGFuZ2UgdG8gc3BlY2lmaWVkIGFzcGVjdCByZXF1aXJlcyBhIHJlLXZhbGlkYXRpb24KLQkgKiBvZiB0aGUgbm9kZSdzIHRyZWUuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFzcGVjdENoYW5nZVJlcXVpcmVzVmFsaWRhdGlvbihTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmFzcGVjdENoYW5nZURvZXNOb3RSZXF1aXJlVmFsaWRhdGlvbihhc3BlY3ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXNwZWN0Q2hhbmdlRG9lc05vdFJlcXVpcmVWYWxpZGF0aW9uKFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLm5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkuY29udGFpbnMoYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIHRoZSBvYmplY3QncyAibm9uLXZhbGlkYXRlZCIgYXNwZWN0IG5hbWVzLgotCSAqIFRoZXNlIGFyZSB0aGUgYXNwZWN0cyB0aGF0LCB3aGVuIHRoZXkgY2hhbmdlLCB3aWxsIE5PVCBjYXVzZSB0aGUKLQkgKiBvYmplY3QgKG9yIGl0cyBjb250YWluaW5nIHRyZWUpIHRvIGJlIHZhbGlkYXRlZCwgaS5lLiBjaGVja2VkIGZvciBwcm9ibGVtcy4KLQkgKiBJZiB5b3UgbmVlZCBpbnN0YW5jZS1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyICJub24tdmFsaWRhdGVkIiBhc3BlY3RzLAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBJZiBjbGFzcy1iYXNlZCBjYWxjdWxhdGlvbiBpcyBzdWZmaWNpZW50LAotCSAqIG92ZXJyaWRlICNhZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKFNldCkuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNldDxTdHJpbmc+IG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKG5vblZhbGlkYXRlZEFzcGVjdE5hbWVTZXRzKSB7Ci0JCQlIYXNoU2V0PFN0cmluZz4gbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMgPSBub25WYWxpZGF0ZWRBc3BlY3ROYW1lU2V0cy5nZXQodGhpcy5nZXRDbGFzcygpKTsKLQkJCWlmIChub25WYWxpZGF0ZWRBc3BlY3ROYW1lcyA9PSBudWxsKSB7Ci0JCQkJbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCQkJdGhpcy5hZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKTsKLQkJCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lU2V0cy5wdXQodGhpcy5nZXRDbGFzcygpLCBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG9iamVjdCdzICJub24tdmFsaWRhdGVkIiBhc3BlY3QgbmFtZXMgdG8gdGhlIHNwZWNpZmllZCBzZXQuCi0JICogVGhlc2UgYXJlIHRoZSBhc3BlY3RzIHRoYXQsIHdoZW4gdGhleSBjaGFuZ2UsIHdpbGwgTk9UIGNhdXNlIHRoZQotCSAqIG9iamVjdCAob3IgaXRzIGNvbnRhaW5pbmcgdHJlZSkgdG8gYmUgdmFsaWRhdGVkLCBpLmUuIGNoZWNrZWQgZm9yIHByb2JsZW1zLgotCSAqIElmIGNsYXNzLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgIm5vbi12YWxpZGF0ZWQiIGFzcGVjdHMgaXMgc3VmZmljaWVudCwKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4gSWYgeW91IG5lZWQgaW5zdGFuY2UtYmFzZWQgY2FsY3VsYXRpb24sCi0JICogb3ZlcnJpZGUgI25vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9uVmFsaWRhdGVkQXNwZWN0TmFtZXNUbyhTZXQ8U3RyaW5nPiBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcykgewotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoQ09NTUVOVF9QUk9QRVJUWSk7Ci0JCW5vblZhbGlkYXRlZEFzcGVjdE5hbWVzLmFkZChESVJUWV9CUkFOQ0hfUFJPUEVSVFkpOwotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoQlJBTkNIX1BST0JMRU1TX0xJU1QpOwotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoSEFTX0JSQU5DSF9QUk9CTEVNU19QUk9QRVJUWSk7Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLmFkZE5vblZhbGlkYXRlZEFzcGVjdE5hbWVzVG8obm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwbGF5IG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgZGV2ZWxvcGVyLWZyaWVuZGx5IFN0cmluZy4gSWYgeW91IHdhbnQgc29tZXRoaW5nIHVzZWZ1bCBmb3IKLQkgKiBkaXNwbGF5aW5nIGluIGEgdXNlciBpbnRlcmZhY2UsIHVzZSAjZGlzcGxheVN0cmluZygpLgotCSAqIElmIHlvdSB3YW50IHRvIGdpdmUgbW9yZSBpbmZvcm1hdGlvbiBpbiB5b3VyICN0b1N0cmluZygpLAotCSAqIG92ZXJyaWRlICN0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKS4gCi0JICogV2hhdGV2ZXIgeW91IGFkZCB0byB0aGF0IHN0cmluZyBidWZmZXIgd2lsbCBzaG93IHVwIGJldHdlZW4gdGhlIHBhcmVudGhlc2VzLgotCSAqIEBzZWUgQWJzdHJhY3RNb2RlbCN0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKQotCSAqIEBzZWUgI2Rpc3BsYXlTdHJpbmcoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvQXN5bmNocm9ub3VzVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Bc3luY2hyb25vdXNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQyMDU5Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Bc3luY2hyb25vdXNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEJvb2xlYW47Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGx1Z2dhYmxlVmFsaWRhdG9yLkRlbGVnYXRlIGludGVyZmFjZQotICogc2ltcGx5IHNldHMgYSBzaGFyZWQgInZhbGlkYXRlIiBmbGFnIHRvIHRydWUuIFRoaXMgc2hvdWxkIHRyaWdnZXIgYQotICogc2VwYXJhdGUgInZhbGlkYXRpb24iIHRocmVhZCB0byBiZWdpbiB2YWxpZGF0aW5nIHRoZSBhcHByb3ByaWF0ZQotICogYnJhbmNoIG9mIG5vZGVzLgotICovCi1wdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUKLXsKLQlwcml2YXRlIFN5bmNocm9uaXplZEJvb2xlYW4gdmFsaWRhdGVGbGFnOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdmFsaWRhdG9yIGRlbGVnYXRlIHdpdGggdGhlIHNwZWNpZmllZCBzaGFyZWQKLQkgKiAidmFsaWRhdGUiIGZsYWcuIFRoaXMgZmxhZyBzaG91bGQgYmUgc2hhcmVkIHdpdGgKLQkgKiBhbm90aGVyIHRocmVhZCB0aGF0IHdpbGwgcGVyZm9ybSB0aGUgYWN0dWFsIHZhbGlkYXRpb24uCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c1ZhbGlkYXRvcihTeW5jaHJvbml6ZWRCb29sZWFuIHZhbGlkYXRlRmxhZykgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbGlkYXRlRmxhZyA9IHZhbGlkYXRlRmxhZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNoYXJlZCAidmFsaWRhdGUiIGZsYWcgdG8gdHJ1ZSwgdHJpZ2dlcmluZwotCSAqIGFuIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIG9mIHRoZSBhcHByb3ByaWF0ZQotCSAqIGJyYW5jaCBvZiBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJdGhpcy52YWxpZGF0ZUZsYWcuc2V0VHJ1ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudmFsaWRhdGVGbGFnKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0RlZmF1bHRQcm9ibGVtLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9EZWZhdWx0UHJvYmxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzk2OTNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0RlZmF1bHRQcm9ibGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFByb2JsZW0gaW50ZXJmYWNlLgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb2JsZW0KLQlpbXBsZW1lbnRzIFByb2JsZW0KLXsKLQlwcml2YXRlIGZpbmFsIE5vZGUgc291cmNlOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2VLZXk7Ci0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzOwotCi0KLQlEZWZhdWx0UHJvYmxlbShOb2RlIHNvdXJjZSwgU3RyaW5nIG1lc3NhZ2VLZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCXRoaXMubWVzc2FnZUtleSA9IG1lc3NhZ2VLZXk7Ci0JCXRoaXMubWVzc2FnZUFyZ3VtZW50cyA9IG1lc3NhZ2VBcmd1bWVudHM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb2JsZW0gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE5vZGUgc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5zb3VyY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBtZXNzYWdlS2V5KCkgewotCQlyZXR1cm4gdGhpcy5tZXNzYWdlS2V5OwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKCkgewotCQlyZXR1cm4gdGhpcy5tZXNzYWdlQXJndW1lbnRzOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdlIGltcGxlbWVudCAjZXF1YWxzKE9iamVjdCkgYmVjYXVzZSBwcm9ibGVtcyBhcmUgcmVwZWF0ZWRseQotCSAqIHJlLWNhbGN1bGF0ZWQgYW5kIHRoZSByZXN1bHRpbmcgcHJvYmxlbXMgbWVyZ2VkIHdpdGggdGhlIGV4aXN0aW5nCi0JICogc2V0IG9mIHByb2JsZW1zOyBhbmQgd2Ugd2FudCB0byBrZWVwIHRoZSBvcmlnaW5hbCBwcm9ibGVtcyBhbmQKLQkgKiBpZ25vcmUgYW55IGZyZXNobHktZ2VuZXJhdGVkIGR1cGxpY2F0ZXMuCi0JICogQWxzbywgcHJvYmxlbXMgYXJlIG5vdCBzYXZlZCB0byBkaXNrLi4uLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBQcm9ibGVtKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVByb2JsZW0gb3RoZXIgPSAoUHJvYmxlbSkgbzsKLQkJcmV0dXJuIHRoaXMuc291cmNlID09IG90aGVyLnNvdXJjZSgpCi0JCQkJJiYgdGhpcy5tZXNzYWdlS2V5LmVxdWFscyhvdGhlci5tZXNzYWdlS2V5KCkpCi0JCQkJJiYgQXJyYXlzLmVxdWFscyh0aGlzLm1lc3NhZ2VBcmd1bWVudHMsIG90aGVyLm1lc3NhZ2VBcmd1bWVudHMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuc291cmNlLmhhc2hDb2RlKCkgXiB0aGlzLm1lc3NhZ2VLZXkuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm1lc3NhZ2VLZXkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvTm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTNkNzU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgdGhlIG1ldGhvZHMgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkCi0gKiBieSBhbnkgY2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSB0byBiZSBwYXJ0IG9mIGEgY29udGFpbm1lbnQgaGllcmFyY2h5Ci0gKiB0aGF0IHN1cHBvcnRzIGEgImRpcnR5IiBzdGF0ZSBhbmQgdmFsaWRhdGlvbiAicHJvYmxlbXMiLgotICogCi0gKiBOb3RlOiBNZXRob2RzIG1hcmtlZCAiSU5UUkEtVFJFRSBBUEkiIGFyZSB0eXBpY2FsbHkgb25seSB1c2VkIGJ5Ci0gKiB0aGUgbm9kZXMgdGhlbXNlbHZlcywgYXMgb3Bwb3NlZCB0byBjbGllbnRzIG9mIHRoZSBub2Rlcy4gVGhlc2UKLSAqIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBhIG5vZGUgb24gZWl0aGVyIGl0cyBwYXJlbnQgb3IgaXRzIGNoaWxkcmVuLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGUgZXh0ZW5kcyBNb2RlbCB7Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGRyZW4pICoqKioqKioqKioKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBpbiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5LgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcGFyZW50LiBUaGUgcGFyZW50IGlzIGltbXV0YWJsZS4KLQkgKiBAc2VlICNjaGlsZHJlbigpCi0JICovCi0JTm9kZSBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIGNoaWxkcmVuLCB3aGljaCBhcmUgYWxzbyBub2Rlcy4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqLwotCUl0ZXJhdG9yPE5vZGU+IGNoaWxkcmVuKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQST8KLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5tZW50IGhpZXJhcmNoeSdzIHJvb3Qgbm9kZS4KLQkgKiBNb3N0IG5vZGVzIG11c3QgaGF2ZSBhIHJvb3QuCi0JICogQHNlZSAjZ2V0UGFyZW50KCkKLQkgKi8KLQlOb2RlIHJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCi0JICogQnkgZGVmaW5pdGlvbiwgYSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiBpdHNlbGYuCi0JICovCi0JYm9vbGVhbiBpc0Rlc2NlbmRhbnRPZihOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwgdGhlIG5vZGUncyBkZXNjZW5kYW50cycKLQkgKiAicmVmZXJlbmNlcyIsIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gIlJlZmVyZW5jZXMiIGFyZQotCSAqIG9iamVjdHMgdGhhdCBhcmUgInJlZmVyZW5jZWQiIGJ5IGFub3RoZXIgb2JqZWN0LCBhcyBvcHBvc2VkCi0JICogdG8gIm93bmVkIiBieSBhbm90aGVyIG9iamVjdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvZiBwYXJ0aWN1bGFyIGNvbmNlcm4gdG8gSGFuZGxlcywgc2luY2UgbW9zdAotCSAqIChob3BlZnVsbHkgYWxsKSAicmVmZXJlbmNlcyIgYXJlIGhlbGQgYnkgSGFuZGxlcy4KLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQl2b2lkIGFkZEJyYW5jaFJlZmVyZW5jZXNUbyhDb2xsZWN0aW9uPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIEFkZCBhbGwgdGhlIG5vZGVzIGluIHRoZSBvYmplY3QncyBicmFuY2ggb2YgdGhlIHRyZWUsCi0JICogaW5jbHVkaW5nIHRoZSBub2RlIGl0c2VsZiwgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIE9ubHkgcmVhbGx5IHVzZWQgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZy4KLQkgKi8KLQl2b2lkIGFkZEFsbE5vZGVzVG8oQ29sbGVjdGlvbjxOb2RlPiBub2Rlcyk7Ci0KLQotCS8vICoqKioqKioqKiogbW9kZWwgc3luY2hyb25pemF0aW9uIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBUaGlzIGlzIGEgZ2VuZXJhbCBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGJlZW4KLQkgKiByZW1vdmVkIGZyb20gdGhlIHRyZWUuIFRoZSBub2RlIHJlY2VpdmluZyB0aGlzIG5vdGlmaWNhdGlvbgotCSAqIHNob3VsZCBwZXJmb3JtIGFueSBuZWNlc3NhcnkgdXBkYXRlcyB0byByZW1haW4gaW4gc3luY2gKLQkgKiB3aXRoIHRoZSB0cmVlIChlLmcuIGNsZWFyaW5nIG91dCBvciByZXBsYWNpbmcgYW55IHJlZmVyZW5jZXMKLQkgKiB0byB0aGUgcmVtb3ZlZCBub2RlIG9yIGFueSBvZiB0aGUgcmVtb3ZlZCBub2RlJ3MgZGVzY2VuZGFudHMpLgotCSAqIEBzZWUgI2lzRGVzY2VuZGFudE9mKE5vZGUpCi0JICovCi0Jdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBUaGlzIGlzIGEgZ2VuZXJhbCBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGJlZW4KLQkgKiByZW5hbWVkLiBUaGUgbm9kZSByZWNlaXZpbmcgdGhpcyBub3RpZmljYXRpb24gc2hvdWxkIG1hcmsgaXRzCi0JICogYnJhbmNoIGRpcnR5IGlmIG5lY2Vzc2FyeSAoaS5lLiBpdCByZWZlcmVuY2VzIHRoZSByZW5hbWVkIG5vZGUKLQkgKiBvciBvbmUgb2YgaXRzIGRlc2NlbmRhbnRzKS4gVGhpcyBtZXRob2QgaXMgb2YgcGFydGljdWxhciBjb25jZXJuCi0JICogdG8gSGFuZGxlcy4KLQkgKiBAc2VlICNpc0Rlc2NlbmRhbnRPZihOb2RlKQotCSAqLwotCXZvaWQgbm9kZVJlbmFtZWQoTm9kZSBub2RlKTsKLQkKLQotCS8vICoqKioqKioqKiogZGlydHkgZmxhZyBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBwZXJzaXN0ZW50IGFzcGVjdHMgb2YgdGhlIG5vZGUsCi0JICogb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cywgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBub2RlIGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlib29sZWFuIGlzRGlydHlCcmFuY2goKTsKLQkJU3RyaW5nIERJUlRZX0JSQU5DSF9QUk9QRVJUWSA9ICJkaXJ0eUJyYW5jaCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogTWFyayB0aGUgbm9kZSBhbmQgaXRzIHBhcmVudCBhcyBkaXJ0eSBicmFuY2hlcy4KLQkgKiBUaGlzIG1lc3NhZ2UgaXMgcHJvcGFnYXRlZCB1cCB0aGUgY29udGFpbm1lbnQKLQkgKiB0cmVlIHdoZW4gYSBwYXJ0aWN1bGFyIG5vZGUgYmVjb21lcyBkaXJ0eS4KLQkgKi8KLQl2b2lkIG1hcmtCcmFuY2hEaXJ0eSgpOwotCi0JLyoqCi0JICogTWFyayB0aGUgbm9kZSBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBhcyBkaXJ0eS4KLQkgKiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgc2F2ZSBsb2NhdGlvbiBvZiBzb21lCi0JICogdG9wLWxldmVsIG5vZGUgaXMgY2hhbmdlZCBhbmQgdGhlIGVudGlyZQotCSAqIGNvbnRhaW5tZW50IHRyZWUgbXVzdCBiZSBtYXJrZWQgZGlydHkgc28gaXQKLQkgKiB3aWxsIGJlIHdyaXR0ZW4gb3V0LgotCSAqLwotCXZvaWQgbWFya0VudGlyZUJyYW5jaERpcnR5KCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEEgY2hpbGQgbm9kZSdzIGJyYW5jaCBoYXMgYmVlbiBtYXJrZWQgY2xlYW4uIElmIHRoZSBub2RlCi0JICogaXRzZWxmIGlzIGNsZWFuIGFuZCBpZiBhbGwgb2YgaXRzIGNoaWxkcmVuIGFyZSBhbHNvIGNsZWFuLCB0aGUKLQkgKiBub2RlJ3MgYnJhbmNoIGNhbiBiZSBtYXJrZWQgY2xlYW4uIFRoZW4sIGlmIHRoZSBub2RlJ3MKLQkgKiBicmFuY2ggaXMgY2xlYW4sIHRoZSBub2RlIHdpbGwgbm90aWZ5IGl0cyBwYXJlbnQgdGhhdCBpdCBtaWdodAotCSAqIGJlIGNsZWFuIGFsc28uIFRoaXMgbWVzc2FnZSBpcyBwcm9wYWdhdGVkIHVwIHRoZSBjb250YWlubWVudAotCSAqIHRyZWUgd2hlbiBhIHBhcnRpY3VsYXIgbm9kZSBiZWNvbWVzIGNsZWFuLgotCSAqLwotCXZvaWQgbWFya0JyYW5jaENsZWFuSWZQb3NzaWJsZSgpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBNYXJrIHRoZSBub2RlIGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGFzIGNsZWFuLgotCSAqIFR5cGljYWxseSB1c2VkIHdoZW4gdGhlIG5vZGUgaGFzIGp1c3QgYmVlbgotCSAqIHJlYWQgaW4gb3Igd3JpdHRlbiBvdXQuCi0JICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5OyBpdCBpcyBub3QgZm9yCi0JICogY2xpZW50IHVzZS4KLQkgKiBOb3QgdGhlIGJlc3Qgb2YgbWV0aG9kIG5hbWVzLi4uLiA6LSgKLQkgKi8KLQl2b2lkIGNhc2NhZGVNYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQotCi0JLy8gKioqKioqKioqKiBwcm9ibGVtcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFJldHVybiBhIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciBhCi0JICogInZhbGlkYXRlZCIgYXNwZWN0IG9mIHRoZSBub2RlIHRyZWUgY2hhbmdlcy4KLQkgKiBUeXBpY2FsbHkgb25seSB0aGUgcm9vdCBub2RlIGRpcmVjdGx5IGhvbGRzIGEgdmFsaWRhdG9yLgotCSAqLwotCVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKTsKLQotCS8qKgotCSAqIFNldCBhIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciBhCi0JICogInZhbGlkYXRlZCIgYXNwZWN0IG9mIHRoZSBub2RlIHRyZWUgY2hhbmdlcy4KLQkgKiBUeXBpY2FsbHkgb25seSB0aGUgcm9vdCBub2RlIGRpcmVjdGx5IGhvbGRzIGEgdmFsaWRhdG9yLgotCSAqLwotCXZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWxpZGF0b3IpOwotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBUaGlzIGlzIGFuIGV4cGxpY2l0IHJlcXVlc3QgaW52b2tlZCBieSBhIGNsaWVudDsgYW5kIGl0IHdpbGwKLQkgKiB0eXBpY2FsbHkgYmUgZm9sbG93ZWQgYnkgYSBjYWxsIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0JICogCSNicmFuY2hQcm9ibGVtcygpCi0JICogCSNoYXNCcmFuY2hQcm9ibGVtcygpCi0JICogV2hldGhlciB0aGUgbm9kZSBtYWludGFpbnMgaXRzIHByb2JsZW1zIG9uIHRoZSBmbHkKLQkgKiBvciB3YWl0cyB1bnRpbCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKiBAc2VlIFByb2JsZW0KLQkgKi8KLQl2b2lkIHZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFZhbGlkYXRlIHRoZSBub2RlIGFuZCBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLAotCSAqIGFuZCB1cGRhdGUgdGhlaXIgc2V0cyBvZiAiYnJhbmNoIiBwcm9ibGVtcy4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBvZiAiYnJhbmNoIiBwcm9ibGVtcyBoYXMgY2hhbmdlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqLwotCWJvb2xlYW4gdmFsaWRhdGVCcmFuY2hJbnRlcm5hbCgpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbm9kZSdzIHByb2JsZW1zIGFsb25nIHdpdGggYWxsIHRoZQotCSAqIG5vZGUncyBkZXNjZW5kYW50cycgcHJvYmxlbXMuCi0JICovCi0JTGlzdEl0ZXJhdG9yPFByb2JsZW0+IGJyYW5jaFByb2JsZW1zKCk7Ci0JCVN0cmluZyBCUkFOQ0hfUFJPQkxFTVNfTElTVCA9ICJicmFuY2hQcm9ibGVtcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiBhbGwgdGhlIG5vZGUncyBwcm9ibGVtcyBhbG9uZyB3aXRoIGFsbCB0aGUKLQkgKiBub2RlJ3MgZGVzY2VuZGFudHMnIHByb2JsZW1zLgotCSAqLwotCWludCBicmFuY2hQcm9ibGVtc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIG9yIGFueSBvZiBpdHMgZGVzY2VuZGFudHMgaGF2ZSBwcm9ibGVtcy4KLQkgKi8KLQlib29sZWFuIGhhc0JyYW5jaFByb2JsZW1zKCk7Ci0JCVN0cmluZyBIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZID0gImhhc0JyYW5jaFByb2JsZW1zIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBicmFuY2ggcHJvYmxlbS4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zQnJhbmNoUHJvYmxlbShQcm9ibGVtIHByb2JsZW0pOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBTb21ldGhpbmcgY2hhbmdlZCwgcmVidWlsZCB0aGUgbm9kZSdzIGNvbGxlY3Rpb24gb2YgYnJhbmNoIHByb2JsZW1zLgotCSAqLwotCXZvaWQgcmVidWlsZEJyYW5jaFByb2JsZW1zKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEFkZCB0aGUgbm9kZSdzIHByb2JsZW1zLCBhbmQgYWxsIHRoZSBub2RlJ3MgZGVzY2VuZGFudHMnCi0JICogcHJvYmxlbXMsIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBBIGNhbGwgdG8gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltbWVkaWF0ZWx5IHByZWNlZGVkIGJ5IGEgY2FsbCB0bwotCSAqICN2YWxpZGF0ZUJyYW5jaCgpIG9yIGFsbCBvZiB0aGUgcHJvYmxlbXMgbWlnaHQgbm90IGJlCi0JICogYWRkZWQgdG8gdGhlIGxpc3QuCi0JICogQHNlZSBQcm9ibGVtCi0JICovCi0Jdm9pZCBhZGRCcmFuY2hQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gYnJhbmNoUHJvYmxlbXMpOwotCi0JLyoqCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKi8KLQl2b2lkIGNsZWFyQWxsQnJhbmNoUHJvYmxlbXMoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBvZiAiYnJhbmNoIiBwcm9ibGVtcyBoYXMgY2hhbmdlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqLwotCWJvb2xlYW4gY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCk7Ci0KLQotCS8vICoqKioqKioqKiogY29tbWVudCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVzZXIgY29tbWVudCBjb25jZXJuaW5nIHRoZSBub2RlLgotCSAqLwotCVN0cmluZyBjb21tZW50KCk7Ci0JCVN0cmluZyBDT01NRU5UX1BST1BFUlRZID0gImNvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXQgdGhlIHVzZXIgY29tbWVudCBjb25jZXJuaW5nIHRoZSBub2RlLgotCSAqLwotCXZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCk7Ci0KLQotCS8vICoqKioqKioqKiogZGlzcGxheWluZy9zb3J0aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwsIHN1aXRhYmxlIGZvciBzb3J0aW5nLgotCSAqLwotCVN0cmluZyBkaXNwbGF5U3RyaW5nKCk7Ci0KLQotCS8vICoqKioqKioqKiogc3ViLWludGVyZmFjZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogU2ltcGxlIGludGVyZmFjZSBkZWZpbmluZyBhICJyZWZlcmVuY2UiIGJldHdlZW4gdHdvIG5vZGVzLgotCSAqIEBzZWUgTm9kZSNhZGRCcmFuY2hSZWZlcmVuY2VzVG8oamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JaW50ZXJmYWNlIFJlZmVyZW5jZSB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgInNvdXJjZSIgbm9kZSBvZiB0aGUgcmVmZXJlbmNlLCBpLmUuIHRoZSBub2RlIHRoYXQKLQkJICogcmVmZXJlbmNlcyB0aGUgInRhcmdldCIgbm9kZS4KLQkJICovCi0JCU5vZGUgc291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgInRhcmdldCIgbm9kZSBvZiB0aGUgcmVmZXJlbmNlLCBpLmUuIHRoZSBub2RlIHRoYXQKLQkJICogaXMgcmVmZXJlbmNlZCBieSB0aGUgInNvdXJjZSIgbm9kZS4KLQkJICovCi0JCU5vZGUgdGFyZ2V0KCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEEgdmFsaWRhdG9yIHdpbGwgdmFsaWRhdGUgYSBub2RlIGFzIGFwcHJvcHJpYXRlLgotCSAqIFR5cGljYWxseSB0aGUgdmFsaWRhdGlvbiB3aWxsCi0JICogCS0gb2NjdXIgd2hlbmV2ZXIgYSBub2RlIGhhcyBjaGFuZ2VkCi0JICogCS0gZW5jb21wYXNzIHRoZSBlbnRpcmUgdHJlZSBjb250YWluaW5nIHRoZSBub2RlCi0JICogCS0gZXhlY3V0ZSBhc3luY2hyb25vdXNseQotCSAqLwotCWludGVyZmFjZSBWYWxpZGF0b3IgewotCi0JCS8qKgotCQkgKiBBICJzaWduaWZpY2FudCIgYXNwZWN0IGhhcyBjaGFuZ2VkOwotCQkgKiB2YWxpZGF0ZSB0aGUgbm9kZSBhcyBhcHByb3ByaWF0ZQotCQkgKi8KLQkJdm9pZCB2YWxpZGF0ZSgpOwotCi0JCS8qKgotCQkgKiBTdG9wIGFsbCB2YWxpZGF0aW9uIG9mIHRoZSBub2RlIHVudGlsICNyZXN1bWUoKSBpcyBjYWxsZWQuCi0JCSAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgYW55IGxvbmctcnVubmluZwotCQkgKiBhY3Rpb24gdGhhdCB0cmlnZ2VycyBudW1lcm91cyBjaGFuZ2VzIHRvIHRoZSBub2RlLiBCZSBzdXJlIHRvCi0JCSAqIG1hdGNoIGEgY2FsbCB0byB0aGlzIG1ldGhvZCB3aXRoIGEgY29ycmVzcG9uZGluZyBjYWxsIHRvCi0JCSAqICNyZXN1bWUoKS4KLQkJICovCi0JCXZvaWQgcGF1c2UoKTsKLQotCQkvKioKLQkJICogUmVzdW1lIHZhbGlkYXRpb24gb2YgdGhlIG5vZGUuIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlCi0JCSAqIGNhbGxlZCBhZnRlciBhIG1hdGNoaW5nIGNhbGwgdG8gI3BhdXNlKCkuCi0JCSAqLwotCQl2b2lkIHJlc3VtZSgpOwotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGhlbHBlciBpbXBsZW1lbnRhdGlvbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSZWZlcmVuY2UgaW50ZXJmYWNlCi0JICogZGVmaW5lZCBhYm92ZS4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgU2ltcGxlUmVmZXJlbmNlIGltcGxlbWVudHMgUmVmZXJlbmNlIHsKLQkJcHJpdmF0ZSBOb2RlIHNvdXJjZTsKLQkJcHJpdmF0ZSBOb2RlIHRhcmdldDsKLQkJcHVibGljIFNpbXBsZVJlZmVyZW5jZShOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAoc291cmNlID09IG51bGwgfHwgdGFyZ2V0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCX0KLQkJcHVibGljIE5vZGUgc291cmNlKCkgewotCQkJcmV0dXJuIHRoaXMuc291cmNlOwotCQl9Ci0JCXB1YmxpYyBOb2RlIHRhcmdldCgpIHsKLQkJCXJldHVybiB0aGlzLnRhcmdldDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc291cmNlICsgIiA9PiAiICsgdGhpcy50YXJnZXQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgdmFsaWRhdG9yIGRvZXMgbm90aGluZyB0byB2YWxpZGF0ZSB0aGUgbm9kZS4KLQkgKi8KLQlWYWxpZGF0b3IgTlVMTF9WQUxJREFUT1IgPQotCQluZXcgUGx1Z2dhYmxlVmFsaWRhdG9yKFBsdWdnYWJsZVZhbGlkYXRvci5EZWxlZ2F0ZS5OdWxsLmluc3RhbmNlKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIk5vZGUuTlVMTF9WQUxJREFUT1IiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1BsdWdnYWJsZVZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvUGx1Z2dhYmxlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NzM4N2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvUGx1Z2dhYmxlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBWYWxpZGF0b3IgaW50ZXJmYWNlIGltcGxlbWVudHMgdGhlCi0gKiBwYXVzZS9yZXN1bWUgcG9ydGlvbiBvZiB0aGUgcHJvdG9jb2wsIGJ1dCBkZWxlZ2F0ZXMgdGhlIGFjdHVhbAotICogdmFsaWRhdGlvbiB0byBhICJwbHVnZ2FibGUiIGRlbGVnYXRlLgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2dhYmxlVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBOb2RlLlZhbGlkYXRvcgotewotCXByaXZhdGUgYm9vbGVhbiBwYXVzZTsKLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVPblJlc3VtZTsKLQlwcml2YXRlIGZpbmFsIERlbGVnYXRlIGRlbGVnYXRlOwotCi0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBmYWN0b3J5IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUuVmFsaWRhdG9yIGJ1aWxkQXN5bmNocm9ub3VzVmFsaWRhdG9yKFN5bmNocm9uaXplZEJvb2xlYW4gdmFsaWRhdGVGbGFnKSB7Ci0JCXJldHVybiBuZXcgUGx1Z2dhYmxlVmFsaWRhdG9yKG5ldyBBc3luY2hyb25vdXNWYWxpZGF0b3IodmFsaWRhdGVGbGFnKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgZmFjdG9yeSBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlLlZhbGlkYXRvciBidWlsZFN5bmNocm9ub3VzVmFsaWRhdG9yKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbmV3IFBsdWdnYWJsZVZhbGlkYXRvcihuZXcgU3luY2hyb25vdXNWYWxpZGF0b3Iobm9kZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHZhbGlkYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsZWdhdGUuCi0JICovCi0JcHVibGljIFBsdWdnYWJsZVZhbGlkYXRvcihEZWxlZ2F0ZSBkZWxlZ2F0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhdXNlID0gZmFsc2U7Ci0JCXRoaXMudmFsaWRhdGVPblJlc3VtZSA9IGZhbHNlOwotCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHZhbGlkYXRlKCkgewotCQlpZiAodGhpcy5wYXVzZSkgewotCQkJdGhpcy52YWxpZGF0ZU9uUmVzdW1lID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZGVsZWdhdGUudmFsaWRhdGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwYXVzZSgpIHsKLQkJaWYgKHRoaXMucGF1c2UpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFscmVhZHkgcGF1c2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLnBhdXNlID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzdW1lKCkgewotCQlpZiAoICEgdGhpcy5wYXVzZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IHBhdXNlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5wYXVzZSA9IGZhbHNlOwotCQkvLyB2YWxpZGF0ZSBhbnkgY2hhbmdlcyB0aGF0IG9jY3VycmVkIHdoaWxlIHRoZSB2YWxpZGF0aW9uIHdhcyBwYXVzZWQKLQkJaWYgKHRoaXMudmFsaWRhdGVPblJlc3VtZSkgewotCQkJdGhpcy52YWxpZGF0ZU9uUmVzdW1lID0gZmFsc2U7Ci0JCQl0aGlzLmRlbGVnYXRlLnZhbGlkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRlbGVnYXRlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYW55IGRlbGVnYXRlcyBvZiBhIHBsdWdnYWJsZSB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBEZWxlZ2F0ZSB7Ci0KLQkJLyoqCi0JCSAqIFRoZSB2YWxpZGF0b3IgaXMgbm90ICJwYXVzZWQiIC0gcGVyZm9ybSB0aGUgYXBwcm9wcmlhdGUgdmFsaWRhdGlvbi4KLQkJICovCi0JCXZvaWQgdmFsaWRhdGUoKTsKLQotCi0JCS8qKgotCQkgKiBUaGlzIGRlbGVnYXRlIGRvZXMgbm90aGluZy4KLQkJICovCi0JCWZpbmFsIGNsYXNzIE51bGwgaW1wbGVtZW50cyBEZWxlZ2F0ZSB7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIERlbGVnYXRlIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJCXB1YmxpYyBzdGF0aWMgRGVsZWdhdGUgaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Qcm9ibGVtLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Qcm9ibGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOGU3MzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvUHJvYmxlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi0vKioKLSAqIERlZmluZSBhbiBpbnRlcmZhY2UgZGVzY3JpYmluZyB0aGUgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoIGEgbm9kZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9ibGVtIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbm9kZSBtb3N0IGNsb3NlbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9ibGVtLgotCSAqLwotCU5vZGUgc291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBrZXkgdGhhdCBjYW4gYmUgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgcHJvYmxlbSdzIG1lc3NhZ2UuCi0JICovCi0JU3RyaW5nIG1lc3NhZ2VLZXkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJndW1lbnRzIGFzc29jaWF0ZSB3aXRoIHRoZSBwcm9ibGVtJ3MgbWVzc2FnZS4KLQkgKi8KLQlPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvYmxlbSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiBJdCBpcyBlcXVhbCBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIGltcGxlbWVudGF0aW9uIG9mIHRoZQotCSAqIFByb2JsZW0gaW50ZXJmYWNlIGFuZCBpdHMgc291cmNlLCBtZXNzYWdlIGtleSwgYW5kIG1lc3NhZ2UKLQkgKiBhcmd1bWVudHMgYXJlIGFsbCBlcXVhbCB0byB0aGlzIHByb2JsZW0ncy4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhPYmplY3Qgbyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2JsZW0ncyBoYXNoIGNvZGUsIHdoaWNoIHNob3VsZCBjYWxjdWxhdGVkIGFzIGFuCi0JICogWE9SIG9mIHRoZSBzb3VyY2UncyBoYXNoIGNvZGUgYW5kIHRoZSBtZXNzYWdlIGtleSdzIGhhc2ggY29kZS4KLQkgKi8KLQlpbnQgaGFzaENvZGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvU3luY2hyb25vdXNWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1N5bmNocm9ub3VzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZTZiOGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvU3luY2hyb25vdXNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFBsdWdnYWJsZVZhbGlkYXRvci5EZWxlZ2F0ZSBpbnRlcmZhY2UKLSAqIHdpbGwgdmFsaWRhdGUgdGhlIG5vZGUgaW1tZWRpYXRlbHkuCi0gKiAKLSAqIFRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgaW4gYSBzaW5nbGUgdGhyZWFkIG9yIGdlbmVyYXRpbmcKLSAqIHByb2JsZW0gcmVwb3J0cy4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9ub3VzVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUKLXsKLQlwcml2YXRlIGZpbmFsIE5vZGUgbm9kZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHZhbGlkYXRvciB0aGF0IHdpbGwgaW1tZWRpYXRlbHkgdmFsaWRhdGUgdGhlCi0JICogc3BlY2lmaWVkIG5vZGUuCi0JICovCi0JcHVibGljIFN5bmNocm9ub3VzVmFsaWRhdG9yKE5vZGUgbm9kZSkgewotCQlzdXBlcigpOwotCQl0aGlzLm5vZGUgPSBub2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotCQl0aGlzLm5vZGUudmFsaWRhdGVCcmFuY2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5vZGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NhY2hpbmdDb21ib0JveE1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ2FjaGluZ0NvbWJvQm94TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViZTI2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ2FjaGluZ0NvbWJvQm94TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBhIGNsaWVudCB0byBiZXR0ZXIgY29udHJvbCB0aGUgcGVyZm9ybWFuY2Ugb2YKLSAqIGEgY29tYm8gYm94IG1vZGVsIGJ5IGFsbG93aW5nIHRoZSBjbGllbnQgdG8gc3BlY2lmeSB3aGVuIGl0IGlzCi0gKiBhY2NlcHRhYmxlIGZvciB0aGUgbW9kZWwgdG8gImNhY2hlIiBhbmQgInVuY2FjaGUiIGl0cyBsaXN0IG9mIGVsZW1lbnRzLgotICogVGhlIG1vZGVsIG1heSBpZ25vcmUgdGhlc2UgaGludHMgaWYgYXBwcm9wcmlhdGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FjaGluZ0NvbWJvQm94TW9kZWwgZXh0ZW5kcyBDb21ib0JveE1vZGVsIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDYWNoZSB0aGUgY29tYm9Cb3hNb2RlbCBMaXN0LiAgSWYgeW91IGNhbGwgdGhpcywgeW91Ci0gICAgICogbXVzdCBtYWtlIHN1cmUgdG8gY2FsbCB1bmNhY2hlTGlzdCgpIGFzIHdlbGwuICBPdGhlcndpc2UKLSAgICAgKiBzdGFsZSBkYXRhIHdpbGwgYmUgaW4gdGhlIENvbWJvQm94IHVudGlsIGNhY2hlTGlzdCgpIGlzIAotICAgICAqIGNhbGxlZCBhZ2FpbiBvciB1bmNhY2hlTGlzdCgpIGlzIGNhbGxlZC4KLSAgICAgKi8KLSAgICB2b2lkIGNhY2hlTGlzdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIENsZWFyIHRoZSBjYWNoZWQgbGlzdC4gIE5leHQgdGltZSB0aGUgbGlzdCBpcyBuZWVkZWQgaXQgd2lsbAotICAgICAqIGJlIGJ1aWx0IHdoZW4gaXQgaXMgbm90IGNhY2hlZC4KLSAgICAgKi8KLSAgICB2b2lkIHVuY2FjaGVMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIGxpc3QgaXMgYWxyZWFkeSBjYWNoZWQuICBUaGlzIGNhbiBiZSB1c2VkIGZvciAKLSAgICAgKiBNb3VzZUV2ZW50cywgc2luY2UgdGhleSBhcmUgbm90IHRlcnJpYmx5IHByZWRpY3RhYmxlLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNDYWNoZWQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9DaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxY2UxYTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ2hlY2tCb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuSW1tZWRpYXRlRWRpdExpc3RlbmVyOwotCi0vKioKLSAqIE1ha2UgdGhlIGNlbGwgbG9vayBsaWtlIGEgY2hlY2sgYm94LgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlciBpbXBsZW1lbnRzIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgewotCi0JLyoqIHRoZSBjb21wb25lbnQgdXNlZCB0byBwYWludCB0aGUgY2VsbCAqLwotCXByaXZhdGUgZmluYWwgSkNoZWNrQm94IGNoZWNrQm94OwotCQotCS8qKiB0aGUgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgb24gYW4gaW1tZWRpYXRlIGVkaXQgKi8KLQlwcm90ZWN0ZWQgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5JbW1lZGlhdGVFZGl0TGlzdGVuZXIgaW1tZWRpYXRlRWRpdExpc3RlbmVyOwotCi0JLyoqICJub3JtYWwiIGJvcmRlciAtIGFzc3VtZSB0aGUgZGVmYXVsdCB0YWJsZSAiZm9jdXMiIGJvcmRlciBpcyAxIHBpeGVsIHRoaWNrICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9yZGVyIE5PX0ZPQ1VTX0JPUkRFUiA9IEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMSwgMSwgMSwgMSk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgd2l0aCBubyBsYWJlbCBvciBpY29uLgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmNoZWNrQm94ID0gdGhpcy5idWlsZENoZWNrQm94KCk7Ci0JCS8vIGJ5IGRlZmF1bHQsIGNoZWNrIGJveGVzIGRvIG5vdCBwYWludCB0aGVpciBib3JkZXJzCi0JCXRoaXMuY2hlY2tCb3guc2V0Qm9yZGVyUGFpbnRlZCh0cnVlKTsKLQkJLy8gdGhpcyBzZXR0aW5nIGlzIHJlY29tbWVuZGVkIGZvciBjaGVjayBib3hlcyBpbnNpZGUgb2YgdHJlZXMgYW5kIHRhYmxlcwotCQl0aGlzLmNoZWNrQm94LnNldEJvcmRlclBhaW50ZWRGbGF0KHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHQgYW5kIGljb24sCi0JICogZWl0aGVyIG9mIHdoaWNoIG1heSBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKFN0cmluZyB0ZXh0LCBJY29uIGljb24pIHsKLQkJdGhpcygpOwotCQl0aGlzLnNldFRleHQodGV4dCk7Ci0JCXRoaXMuc2V0SWNvbihpY29uKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXModGV4dCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB3aXRoIHRoZSBzcGVjaWZpZWQgaWNvbi4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcihJY29uIGljb24pIHsKLQkJdGhpcyhudWxsLCBpY29uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkNoZWNrQm94IGJ1aWxkQ2hlY2tCb3goKSB7Ci0JCUpDaGVja0JveCBjYiA9IG5ldyBKQ2hlY2tCb3goKTsKLQkJY2IuYWRkQWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZEFjdGlvbkxpc3RlbmVyKCkpOwotCQlyZXR1cm4gY2I7Ci0JfQotCQotCXByaXZhdGUgQWN0aW9uTGlzdGVuZXIgYnVpbGRBY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKENoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIudGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyLmltbWVkaWF0ZUVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkgICAgdGhpcy5jaGVja0JveC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KFN3aW5nQ29uc3RhbnRzLkNFTlRFUik7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Q29tcG9uZW50T3JpZW50YXRpb24odGFibGUuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKSk7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Rm9udCh0YWJsZS5nZXRGb250KCkpOwotCQl0aGlzLmNoZWNrQm94LnNldEVuYWJsZWQodGFibGUuaXNFbmFibGVkKCkpOwotCi0JCXRoaXMuY2hlY2tCb3guc2V0Rm9yZWdyb3VuZCh0aGlzLmZvcmVncm91bmRDb2xvcih0YWJsZSwgdmFsdWUsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQkJdGhpcy5jaGVja0JveC5zZXRCYWNrZ3JvdW5kKHRoaXMuYmFja2dyb3VuZENvbG9yKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCQkvLyBvbmNlIHRoZSBjb2xvcnMgYXJlIHNldCwgY2FsY3VsYXRlIG9wYXF1ZSBzZXR0aW5nCi0JCXRoaXMuY2hlY2tCb3guc2V0T3BhcXVlKHRoaXMuY2VsbElzT3BhcXVlSW4odGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Qm9yZGVyKHRoaXMuYm9yZGVyKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCi0JCXRoaXMuc2V0VmFsdWUodmFsdWUpOwotCQlyZXR1cm4gdGhpcy5jaGVja0JveDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBmb3JlZ3JvdW5kIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2xvciBmb3JlZ3JvdW5kQ29sb3IoSlRhYmxlIHRhYmxlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKGhhc0ZvY3VzICYmIHRhYmxlLmlzQ2VsbEVkaXRhYmxlKHJvdywgY29sdW1uKSkgewotCQkJCXJldHVybiBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlLmZvY3VzQ2VsbEZvcmVncm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkZvcmVncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gdGFibGUuZ2V0Rm9yZWdyb3VuZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJhY2tncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmRDb2xvcihKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuZm9jdXNDZWxsQmFja2dyb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gdGFibGUuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpOwotCQl9Ci0JCXJldHVybiB0YWJsZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYm9yZGVyLgotCSAqLwotCXByb3RlY3RlZCBCb3JkZXIgYm9yZGVyKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IHJvdywgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIGhhc0ZvY3VzID8gIFVJTWFuYWdlci5nZXRCb3JkZXIoIlRhYmxlLmZvY3VzQ2VsbEhpZ2hsaWdodEJvcmRlciIpIDogTk9fRk9DVVNfQk9SREVSOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNlbGwgc2hvdWxkIGJlIG9wYXF1ZSBpbiB0aGUgdGFibGUuCi0JICogSWYgdGhlIGNlbGwncyBiYWNrZ3JvdW5kIGlzIHRoZSBzYW1lIGFzIHRoZSB0YWJsZSdzIGJhY2tncm91bmQKLQkgKiBhbmQgdGFibGUgaXMgb3BhcXVlLCB3ZSBkb24ndCBuZWVkIHRvIHBhaW50IHRoZSBiYWNrZ3JvdW5kIC0KLQkgKiB0aGUgdGFibGUgd2lsbCBkbyBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjZWxsSXNPcGFxdWVJbihKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIHNlbGVjdGVkLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBoYXNGb2N1cywgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCByb3csIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgY29sdW1uKSB7Ci0JCUNvbG9yIGNlbGxCYWNrZ3JvdW5kID0gdGhpcy5jaGVja0JveC5nZXRCYWNrZ3JvdW5kKCk7Ci0JCUNvbG9yIHRhYmxlQmFja2dyb3VuZCA9IHRhYmxlLmdldEJhY2tncm91bmQoKTsKLQkJcmV0dXJuICEgKHRhYmxlLmlzT3BhcXVlKCkgJiYgY2VsbEJhY2tncm91bmQuZXF1YWxzKHRhYmxlQmFja2dyb3VuZCkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY2hlY2sgYm94J3MgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIENSIzM5OTkzMTggLSBUaGlzIG51bGwgY2hlY2sgbmVlZHMgdG8gYmUgcmVtb3ZlZCBvbmNlIEpESyBidWcgaXMgZml4ZWQKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQl0aGlzLmNoZWNrQm94LnNldFNlbGVjdGVkKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuY2hlY2tCb3guaXNTZWxlY3RlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW1tZWRpYXRlRWRpdExpc3RlbmVyKEltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIGNoZWNrIGJveCdzIHRleHQ7IHdoaWNoIGJ5IGRlZmF1bHQgaXMgYmxhbmsuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLmNoZWNrQm94LnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjaGVjayBib3gncyBpY29uOyB3aGljaCBieSBkZWZhdWx0IGlzIG5vdCBwcmVzZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb24oSWNvbiBpY29uKSB7Ci0JCXRoaXMuY2hlY2tCb3guc2V0SWNvbihpY29uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbmRlcmVyJ3MgcHJlZmVycmVkIGhlaWdodC4gVGhpcyBhbGxvd3MgeW91Ci0JICogdG8gc2V0IHRoZSB0YWJsZSdzIHJvdyBoZWlnaHQgdG8gc29tZXRoaW5nIHRoZSBjaGVjayBib3gKLQkgKiB3aWxsIGxvb2sgZ29vZCBpbi4uLi4KLQkgKi8KLQlwdWJsaWMgaW50IHByZWZlcnJlZEhlaWdodCgpIHsKLQkJLy8gYWRkIGluIHNwYWNlIGZvciB0aGUgYm9yZGVyIHRvcCBhbmQgYm90dG9tCi0JCXJldHVybiAoaW50KSB0aGlzLmNoZWNrQm94LmdldFByZWZlcnJlZFNpemUoKS5nZXRIZWlnaHQoKSArIDI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5YjdmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuUG9wdXBNZW51RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuUG9wdXBNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotCi0vKioKLSAqIE1ha2UgdGhlIGNlbGwgbG9vayBsaWtlIGEgY29tYm8tYm94LgotICovCi1wdWJsaWMgY2xhc3MgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlciBpbXBsZW1lbnRzIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgewotCi0JLyogY2FjaGluZyB0aGUgY29tYm8gYm94IGJlY2F1c2Ugd2UgYXJlIGNhY2hpbmcgdGhlIGNvbWJvQm94TW9kZWwuCi0JICogRXZlcnl0aW1lIHdlIHJlYnVpbHQgdGhlIGNvbWJvQm94IHdlIHdvdWxkIHNldCB0aGUgbW9kZWwgb24gaXQgYW5kIG5vdAotCSAqIHJlbW92ZSB0aGUgbW9kZWwgZnJvbSB0aGUgb2xkIGNvbWJvIGJveC4gIFRoaXMgbWVhbnQgdGhhdCBuZXcgbGlzdGVuZXJzCi0JICoga2VwdCBiZWluZyBhZGRlZCB0byB0aGUgY29tYm9Cb3hNb2RlbCBmb3IgZXZlcnkgY29tYm9Cb3ggYnVpbGQuCi0JICogTm90IHN1cmUgaWYgdGhlcmUgaXMgYSB3YXkgdG8gY2xlYXIgb3V0IHRoZSBvbGQgY29tYm8gYm94LCBvciB3aHkKLQkgKiB3ZSB3ZXJlIGJ1aWxkaWcgYSBuZXcgY29tYm8gYm94IGV2ZXJ5IHRpbWUgc28gSSB3ZW50IHdpdGggY2FjaGluZyBpdC4KLQkgKi8KLQlwcml2YXRlIEpDb21ib0JveCBjb21ib0JveDsKLQkKLQkvKiogdGhlIGl0ZW1zIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGNvbWJvIGJveCAqLwotCXByaXZhdGUgQ2FjaGluZ0NvbWJvQm94TW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBMaXN0Q2VsbFJlbmRlcmVyIHJlbmRlcmVyOwotCU9iamVjdCB2YWx1ZTsKLQlwcml2YXRlIHN0YXRpYyBpbnQgaGVpZ2h0ID0gLTE7Ci0JYm9vbGVhbiBmYWtlRm9jdXNGbGFnOwotCi0JLyoqIHRoZSBsaXN0ZW5lciB0byBiZSBub3RpZmllZCBvbiBhbiBpbW1lZGlhdGUgZWRpdCAqLwotCXByb3RlY3RlZCBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLkltbWVkaWF0ZUVkaXRMaXN0ZW5lciBpbW1lZGlhdGVFZGl0TGlzdGVuZXI7Ci0JCi0JLyoqIGhvbGQgdGhlIG9yaWdpbmFsIGNvbG9ycyBvZiB0aGUgY29tYm8tYm94ICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29sb3IgZGVmYXVsdEZvcmVncm91bmQ7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29sb3IgZGVmYXVsdEJhY2tncm91bmQ7Ci0KLQkvKiogIm5vcm1hbCIgYm9yZGVyIC0gYXNzdW1lIHRoZSBkZWZhdWx0IHRhYmxlICJmb2N1cyIgYm9yZGVyIGlzIDEgcGl4ZWwgdGhpY2sgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb3JkZXIgTk9fRk9DVVNfQk9SREVSID0gQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigxLCAxLCAxLCAxKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkIGNvbWJvLWJveCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcihDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMobmV3IE5vbkNhY2hpbmdDb21ib0JveE1vZGVsKG1vZGVsKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgY2FjaGluZyBjb21iby1ib3ggbW9kZWwuCi0JICovCi0JcHVibGljIENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIoQ2FjaGluZ0NvbWJvQm94TW9kZWwgbW9kZWwpIHsKLQkJdGhpcygpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZAotCSAqIGNvbWJvLWJveCBtb2RlbCBhbmQgcmVuZGVyZXIuCi0JICovCi0JcHVibGljIENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIoQ29tYm9Cb3hNb2RlbCBtb2RlbCwgTGlzdENlbGxSZW5kZXJlciByZW5kZXJlcikgewotCQl0aGlzKG5ldyBOb25DYWNoaW5nQ29tYm9Cb3hNb2RlbChtb2RlbCksIHJlbmRlcmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZAotCSAqIGNhY2hpbmcgY29tYm8tYm94IG1vZGVsIGFuZCByZW5kZXJlci4KLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcihDYWNoaW5nQ29tYm9Cb3hNb2RlbCBtb2RlbCwgTGlzdENlbGxSZW5kZXJlciByZW5kZXJlcikgewotCQl0aGlzKG1vZGVsKTsKLQkJdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIHNhdmUgdGhlIG9yaWdpbmFsIGNvbG9ycyBvZiB0aGUgY29tYm8tYm94LCBzbyB3ZQotCQkvLyBjYW4gdXNlIHRoZW0gdG8gcGFpbnQgbm9uLXNlbGVjdGVkIGNlbGxzCi0JCWlmIChoZWlnaHQgPT0gLTEpIHsKLQkJCUpDb21ib0JveCBjYiA9IG5ldyBKQ29tYm9Cb3goKTsKLQkJCWNiLmFkZEl0ZW0oIm0iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBhZGQgaW4gc3BhY2UgZm9yIHRoZSBib3JkZXIgdG9wIGFuZCBib3R0b20KLQkJCWhlaWdodCA9IGNiLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQgKyAyOwotCi0JCQlkZWZhdWx0Rm9yZWdyb3VuZCA9IGNiLmdldEZvcmVncm91bmQoKTsKLQkJCWRlZmF1bHRCYWNrZ3JvdW5kID0gY2IuZ2V0QmFja2dyb3VuZCgpOwotCQl9Ci0JfQotCi0gICAgc3RhdGljIEpMYWJlbCBwcm90b3R5cGVMYWJlbCA9IG5ldyBKTGFiZWwoIlByb3RvdHlwZSIsIG5ldyBFbXB0eUljb24oMTYpLCBTd2luZ0NvbnN0YW50cy5MRUFESU5HKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJvdGVjdGVkIEpDb21ib0JveCBidWlsZENvbWJvQm94KCkgewotCi0JCWZpbmFsIEpDb21ib0JveCByZXN1bHQgPSBuZXcgSkNvbWJvQm94KCkgewotCQkJcHJpdmF0ZSBib29sZWFuIGZha2VGb2N1czsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0JCQkJcmV0dXJuIGZha2VGb2N1cyB8fCBzdXBlci5oYXNGb2N1cygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBnKSB7Ci0JCQkJZmFrZUZvY3VzID0gQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci50aGlzLmZha2VGb2N1c0ZsYWc7Ci0JCQkJc3VwZXIucGFpbnQoZyk7Ci0JCQkJZmFrZUZvY3VzID0gZmFsc2U7Ci0JCQl9Ci0JCQkvL3dyYXAgdGhlIHJlbmRlcmVyIHRvIGRlYWwgd2l0aCB0aGUgcHJvdG90eXBlRGlzcGxheVZhbHVlCi0JCSAgICBAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyKGZpbmFsIExpc3RDZWxsUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCSAgICAgICAgc3VwZXIuc2V0UmVuZGVyZXIobmV3IExpc3RDZWxsUmVuZGVyZXIoKXsKLQkJICAgICAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2LCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJICAgICAgICAgICAgICAgIGlmICh2ID09IHByb3RvdHlwZUxhYmVsKSB7Ci0JCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvdHlwZUxhYmVsOwotCQkgICAgICAgICAgICAgICAgfQotCQkgICAgICAgICAgICAgICAgcmV0dXJuIGFSZW5kZXJlci5nZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KGxpc3QsIHYsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpOwotCQkgICAgICAgICAgICB9Ci0JCSAgICAgICAgfSk7Ci0JCSAgICB9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJbmRleCgpIHsKLQkJICAgICAgICBib29sZWFuIGxpc3ROb3RDYWNoZWQgPSAhbGlzdElzQ2FjaGVkKCk7Ci0JCSAgICAgICAgaWYgKGxpc3ROb3RDYWNoZWQpIHsKLQkJICAgICAgICAgICAgY2FjaGVMaXN0KCk7Ci0JCSAgICAgICAgfQotCQkgICAgICAgIAotCQkJCWludCBpbmRleCA9IHN1cGVyLmdldFNlbGVjdGVkSW5kZXgoKTsKLQotCQkgICAgICAgIGlmIChsaXN0Tm90Q2FjaGVkKSB7Ci0JCSAgICAgICAgICAgIHVuY2FjaGVMaXN0KCk7Ci0JCSAgICAgICAgfQotCQkJCXJldHVybiBpbmRleDsKLQkJICAgfQotCi0JCX07Ci0JCS8vIHN0b2xlIHRoaXMgY29kZSBmcm9tIGphdmF4LnN3aW5nLkRlZmF1bHRDZWxsRWRpdG9yCi0JCXJlc3VsdC5wdXRDbGllbnRQcm9wZXJ0eSgiSkNvbWJvQm94LmlzVGFibGVDZWxsRWRpdG9yIiwgQm9vbGVhbi5UUlVFKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYWRkQWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZEFjdGlvbkxpc3RlbmVyKCkpOwotCQlyZXN1bHQuYWRkUG9wdXBNZW51TGlzdGVuZXIodGhpcy5idWlsZFBvcHVwTWVudUxpc3RlbmVyKCkpOwotCQkKLSAgICAgICAgLy9UaGVzZSBhcmUgdXNlZCB0byB3b3JrYXJvdW5kIHByb2JsZW1zIHdpdGggU3dpbmcgdHJ5aW5nIHRvIAotICAgICAgICAvL2RldGVybWluZSB0aGUgc2l6ZSBvZiBhIGNvbWJvQm94IHdpdGggYSBsYXJnZSBtb2RlbAotICAgICAgICByZXN1bHQuc2V0UHJvdG90eXBlRGlzcGxheVZhbHVlKHByb3RvdHlwZUxhYmVsKTsKLSAgICAgICAgZ2V0TGlzdEJveChyZXN1bHQpLnNldFByb3RvdHlwZUNlbGxWYWx1ZShwcm90b3R5cGVMYWJlbCk7Ci0gICAgICAgIAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLSAgICAKLSAgICBwcml2YXRlIEpMaXN0IGdldExpc3RCb3goSkNvbWJvQm94IHJlc3VsdCkgewotICAgICAgICByZXR1cm4gKEpMaXN0KSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShyZXN1bHQuZ2V0VUkoKSwgImxpc3RCb3giKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotCQotCXByaXZhdGUgQWN0aW9uTGlzdGVuZXIgYnVpbGRBY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJSkNvbWJvQm94IGNiID0gKEpDb21ib0JveCkgZS5nZXRTb3VyY2UoKTsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRJdGVtID0gY2IuZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0KLQkJCQkvLyBPbmx5IHVwZGF0ZSB0aGUgc2VsZWN0ZWQgaXRlbSBhbmQgaW52b2tlIGltbWVkaWF0ZUVkaXQoKSBpZiB0aGUKLQkJCQkvLyBzZWxlY3RlZCBpdGVtIGFjdHVhbGx5IGNoYW5nZWQsIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlCi0JCQkJLy8gZWRpdGluZywgdGhlIG1vZGVsIGNoYW5nZXMgYW5kIGNhdXNlcyB0aGlzIG1ldGhvZCB0byBiZSBpbnZva2VkLAotCQkJCS8vIGl0IGNhdXNlcyBDUiMzOTYzNjc1IHRvIG9jY3VyIGJlY2F1c2UgaW1tZWRpYXRlRWRpdCgpIHN0b3AgdGhlCi0JCQkJLy8gZWRpdGluZywgd2hpY2ggaXMgZG9uZSBhdCB0aGUgd3JvbmcgdGltZQotCQkJCWlmIChDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMudmFsdWUgIT0gc2VsZWN0ZWRJdGVtKSB7Ci0JCQkJCUNvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIudGhpcy52YWx1ZSA9IGNiLmdldFNlbGVjdGVkSXRlbSgpOwotCQkJCQlDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIGltbWVkaWF0ZUVkaXQoKSB7Ci0JCWlmICh0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lci5pbW1lZGlhdGVFZGl0KCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBQb3B1cE1lbnVMaXN0ZW5lciBidWlsZFBvcHVwTWVudUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFBvcHVwTWVudUxpc3RlbmVyKCkgewotCQkKLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudVdpbGxCZWNvbWVWaXNpYmxlKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkJCQlpZiAobGlzdElzQ2FjaGVkKCkpIHsKLQkJCQkJdW5jYWNoZUxpc3QoKTsKLQkJCQl9Ci0JCQkJY2FjaGVMaXN0KCk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgcG9wdXBNZW51V2lsbEJlY29tZUludmlzaWJsZShQb3B1cE1lbnVFdmVudCBlKSB7Ci0JICAgICAgICAgICAgaWYgKGxpc3RJc0NhY2hlZCgpKSB7Ci0JICAgICAgICAgICAgICAgIHVuY2FjaGVMaXN0KCk7Ci0JICAgICAgICAgICAgfQotCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgcG9wdXBNZW51Q2FuY2VsZWQoUG9wdXBNZW51RXZlbnQgZSkgewotCSAgICAgICAgICAgIGlmIChsaXN0SXNDYWNoZWQoKSkgewotCSAgICAgICAgICAgICAgICB1bmNhY2hlTGlzdCgpOwotCSAgICAgICAgICAgIH0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkKLQl2b2lkIGNhY2hlTGlzdCgpIHsKLQkJdGhpcy5tb2RlbC5jYWNoZUxpc3QoKTsKLQl9Ci0JCi0Jdm9pZCB1bmNhY2hlTGlzdCgpIHsKLQkJdGhpcy5tb2RlbC51bmNhY2hlTGlzdCgpOwotCX0JCi0JCi0JYm9vbGVhbiBsaXN0SXNDYWNoZWQoKSB7Ci0JCXJldHVybiB0aGlzLm1vZGVsLmlzQ2FjaGVkKCk7Ci0JfQotCS8vICoqKioqKioqKiogVGFibGVDZWxsUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIENvbXBvbmVudCBnZXRUYWJsZUNlbGxSZW5kZXJlckNvbXBvbmVudChKVGFibGUgdGFibGUsIE9iamVjdCB2YWwsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJdGhpcy5mYWtlRm9jdXNGbGFnID0gc2VsZWN0ZWQgfHwgaGFzRm9jdXM7Ci0JCWlmICh0aGlzLmNvbWJvQm94ID09IG51bGwpIHsKLQkJCXRoaXMuY29tYm9Cb3ggPSB0aGlzLmJ1aWxkQ29tYm9Cb3goKTsKLQkKLQkJCXRoaXMuY29tYm9Cb3guc2V0Q29tcG9uZW50T3JpZW50YXRpb24odGFibGUuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKSk7Ci0JCQl0aGlzLmNvbWJvQm94LnNldE1vZGVsKHRoaXMubW9kZWwpOwotCQkJaWYgKHRoaXMucmVuZGVyZXIgIT0gbnVsbCkgewotCQkJCXRoaXMuY29tYm9Cb3guc2V0UmVuZGVyZXIodGhpcy5yZW5kZXJlcik7Ci0JCQl9Ci0JCQl0aGlzLmNvbWJvQm94LnNldEZvbnQodGFibGUuZ2V0Rm9udCgpKTsKLQkJCXRoaXMuY29tYm9Cb3guc2V0RW5hYmxlZCh0YWJsZS5pc0VuYWJsZWQoKSk7Ci0JCQl0aGlzLmNvbWJvQm94LnNldEJvcmRlcih0aGlzLmJvcmRlcih0YWJsZSwgdmFsLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCX0KLQotCQkvLyBXZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIG1vZGVsIHNpbmNlIEpDb21ib0JveCBtaWdodCBwcmV2ZW50IHVzIGZyb20KLQkJLy8gc2VsZWN0aW5nIHRoZSB2YWx1ZS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIHZhbHVlIGlzIG5vdCBjb250YWluZWQKLQkJLy8gaW4gdGhlIG1vZGVsLCBzZWUgQ1IjMzk1MDA0NCBmb3IgYW4gZXhhbXBsZQotCQl0aGlzLm1vZGVsLnNldFNlbGVjdGVkSXRlbSh2YWwpOwotCi0JCXJldHVybiB0aGlzLmNvbWJvQm94OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGZvcmVncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGZvcmVncm91bmRDb2xvcihKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKGhhc0ZvY3VzICYmIHRhYmxlLmlzQ2VsbEVkaXRhYmxlKHJvdywgY29sdW1uKSkgewotCQkJCXJldHVybiBkZWZhdWx0Rm9yZWdyb3VuZDsKLQkJCX0KLQkJCXJldHVybiB0YWJsZS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRGb3JlZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJhY2tncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmRDb2xvcihKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKGhhc0ZvY3VzICYmIHRhYmxlLmlzQ2VsbEVkaXRhYmxlKHJvdywgY29sdW1uKSkgewotCQkJCXJldHVybiBkZWZhdWx0QmFja2dyb3VuZDsKLQkJCX0KLQkJCXJldHVybiB0YWJsZS5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRCYWNrZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJvcmRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9yZGVyIGJvcmRlcihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSlRhYmxlIHRhYmxlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgcm93LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGNvbHVtbikgewotCQlyZXR1cm4gaGFzRm9jdXMgPwotCQkJVUlNYW5hZ2VyLmdldEJvcmRlcigiVGFibGUuZm9jdXNDZWxsSGlnaGxpZ2h0Qm9yZGVyIikgLy8kTk9OLU5MUy0xJAotCQk6Ci0JCQlOT19GT0NVU19CT1JERVI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEltbWVkaWF0ZUVkaXRMaXN0ZW5lcihUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLkltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVuZGVyZXIncyBwcmVmZXJyZWQgaGVpZ2h0LiBUaGlzIGFsbG93cyB5b3UKLQkgKiB0byBzZXQgdGhlIHJvdyBoZWlnaHQgdG8gc29tZXRoaW5nIHRoZSBjb21iby1ib3ggd2lsbCBsb29rIGdvb2QgaW4uLi4uCi0JICovCi0JcHVibGljIGludCBwcmVmZXJyZWRIZWlnaHQoKSB7Ci0JCXJldHVybiBoZWlnaHQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0Rpc3BsYXlhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRGlzcGxheWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1MjNlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRGlzcGxheWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogVXNlZCBieSBnZW5lcmFsLXB1cnBvc2UgVUkgbW9kZWxzIGFuZCByZW5kZXJlcnMgdG8gY2FzdAotICogYXBwbGljYXRpb24gbW9kZWwgb2JqZWN0cyB0byBzb21ldGhpbmcgZGlzcGxheWFibGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlzcGxheWFibGUKLQlleHRlbmRzIE1vZGVsCi17Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kZWwKLQkgKiBpbiBhIHRleHR1YWwgVUkgc2V0dGluZyAodHlwaWNhbGx5IHRoZSBvYmplY3QncyBuYW1lKS4KLQkgKiBXaGVuIHRoZSBkaXNwbGF5IHN0cmluZyBjaGFuZ2VzLCB0aGUgbW9kZWwgc2hvdWxkIGZpcmUKLQkgKiB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbjoKLQkgKiAgICAgdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBvbGREaXNwbGF5U3RyaW5nLCB0aGlzLmRpc3BsYXlTdHJpbmcoKSk7Ci0JICovCi0JU3RyaW5nIGRpc3BsYXlTdHJpbmcoKTsKLQkJU3RyaW5nIERJU1BMQVlfU1RSSU5HX1BST1BFUlRZID0gImRpc3BsYXlTdHJpbmciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RlbAotCSAqIGluIGEgVUkgY29tcG9uZW50IHRoYXQgc3VwcG9ydHMgaWNvbnMgKHRoZSBpY29uIGNhbiBiZSBudWxsKS4KLQkgKiBXaGVuIHRoZSBpY29uIGNoYW5nZXMsIHRoZSBtb2RlbCBzaG91bGQgZmlyZQotCSAqIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uOgotCSAqICAgICB0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSUNPTl9QUk9QRVJUWSwgb2xkSWNvbiwgdGhpcy5pY29uKCkpOwotCSAqLwotCUljb24gaWNvbigpOwotCQlTdHJpbmcgSUNPTl9QUk9QRVJUWSA9ICJpY29uIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRW1wdHlJY29uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRW1wdHlJY29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NjRlYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0VtcHR5SWNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi0vKioKLSAqIEltcGxlbWVudCB0aGUgSWNvbiBpbnRlcmZhY2Ugd2l0aCBhbiBpY29uIHRoYXQgaGFzIGEgc2l6ZSBidXQKLSAqIGRvZXMgbm90IHBhaW50IGFueXRoaW5nIG9uIHRoZSBncmFwaGljcyBjb250ZXh0LgotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlJY29uCi0JaW1wbGVtZW50cyBJY29uCi17Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgd2lkdGg7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgaGVpZ2h0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbXB0eUljb24gTlVMTF9JTlNUQU5DRSA9IG5ldyBFbXB0eUljb24oMCk7Ci0KLQotCXB1YmxpYyBFbXB0eUljb24oaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQkJdGhpcy5oZWlnaHQgPSBoZWlnaHQ7Ci0JfQotCi0JcHVibGljIEVtcHR5SWNvbihpbnQgc2l6ZSkgewotCQl0aGlzKHNpemUsIHNpemUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJY29uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHBhaW50SWNvbihDb21wb25lbnQgYywgR3JhcGhpY3MgZywgaW50IHgsIGludCB5KSB7Ci0JCS8vIGRvbid0IHBhaW50IGFueXRoaW5nIGZvciBhbiBlbXB0eSBpY29uCi0JfQotCi0JcHVibGljIGludCBnZXRJY29uV2lkdGgoKSB7IAotCQlyZXR1cm4gdGhpcy53aWR0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEljb25IZWlnaHQoKSB7Ci0JCXJldHVybiB0aGlzLmhlaWdodDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9GaWx0ZXJpbmdMaXN0QnJvd3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RCcm93c2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNzUxNjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RCcm93c2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIExvbmdMaXN0Q29tcG9uZW50LkJyb3dzZXIgdXNlcyBhCi0gKiBKT3B0aW9uUGFuZSB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIHRoZSBzZWxlY3Rpb24uIFRoZSBKT1B0aW9uUGFuZQotICogaXMgcGFzc2VkIGEgRmlsdGVyaW5nTGlzdFBhbmVsIHRvIGFzc2lzdCB0aGUgdXNlciBpbiBtYWtpbmcKLSAqIGEgc2VsZWN0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nTGlzdEJyb3dzZXI8VD4gCi0JaW1wbGVtZW50cyBMaXN0Q2hvb3Nlci5MaXN0QnJvd3NlciAKLXsKLQlwcml2YXRlIEZpbHRlcmluZ0xpc3RQYW5lbDxUPiBwYW5lbDsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0xpc3RCcm93c2VyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhbmVsID0gdGhpcy5idWlsZFBhbmVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbHRlcmluZ0xpc3RQYW5lbDxUPiBidWlsZFBhbmVsKCkgewotCQlyZXR1cm4gbmV3IExvY2FsRmlsdGVyaW5nTGlzdFBhbmVsPFQ+KCk7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0IHRoZSB1c2VyIHVzaW5nIGEgSk9wdGlvblBhbmUgd2l0aCBhIGZpbHRlcmluZwotCSAqIGxpc3QgcGFuZWwuCi0JICovCi0JcHVibGljIHZvaWQgYnJvd3NlKExpc3RDaG9vc2VyIGNob29zZXIpIHsJCi0JCXRoaXMuaW5pdGlhbGl6ZUNlbGxSZW5kZXJlcihjaG9vc2VyKTsKLQkJCi0JCWludCBvcHRpb24gPSAKLQkJCUpPcHRpb25QYW5lLnNob3dPcHRpb25EaWFsb2coCi0JCQkJY2hvb3NlciwgCi0JCQkJdGhpcy5tZXNzYWdlKGNob29zZXIpLCAKLQkJCQl0aGlzLnRpdGxlKGNob29zZXIpLCAKLQkJCQl0aGlzLm9wdGlvblR5cGUoY2hvb3NlciksIAotCQkJCXRoaXMubWVzc2FnZVR5cGUoY2hvb3NlciksIAotCQkJCXRoaXMuaWNvbihjaG9vc2VyKSwgCi0JCQkJdGhpcy5zZWxlY3Rpb25WYWx1ZXMoY2hvb3NlciksIAotCQkJCXRoaXMuaW5pdGlhbFNlbGVjdGlvblZhbHVlKGNob29zZXIpCi0JCSk7Ci0JCQotCQlpZiAob3B0aW9uID09IEpPcHRpb25QYW5lLk9LX09QVElPTikgewotCQkJY2hvb3Nlci5nZXRNb2RlbCgpLnNldFNlbGVjdGVkSXRlbSh0aGlzLnBhbmVsLnNlbGVjdGlvbigpKTsKLQkJfQotCQkKLQkJLy8gY2xlYXIgdGhlIHRleHQgZmllbGQgc28gdGhlIGxpc3QgYm94IGlzIHJlLWZpbHRlcmVkCi0JCXRoaXMucGFuZWwudGV4dEZpZWxkKCkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNlbGxSZW5kZXJlcihKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJLy8gZGVmYXVsdCBiZWhhdmlvciBzaG91bGQgYmUgdG8gdXNlIHRoZSBjZWxsIHJlbmRlcmVyIGZyb20gdGhlIGNvbWJvYm94LgotCQl0aGlzLnBhbmVsLmxpc3RCb3goKS5zZXRDZWxsUmVuZGVyZXIoY29tYm9Cb3guZ2V0UmVuZGVyZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogdGhlIG1lc3NhZ2UgY2FuIGJlIGFueXRoaW5nIC0gaGVyZSB3ZSBidWlsZCBhIGNvbXBvbmVudAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbWVzc2FnZShKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJdGhpcy5wYW5lbC5zZXRDb21wbGV0ZUxpc3QodGhpcy5jb252ZXJ0VG9BcnJheShjb21ib0JveC5nZXRNb2RlbCgpKSk7Ci0JCXRoaXMucGFuZWwuc2V0U2VsZWN0aW9uKGNvbWJvQm94LmdldE1vZGVsKCkuZ2V0U2VsZWN0ZWRJdGVtKCkpOwotCQlyZXR1cm4gdGhpcy5wYW5lbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBvcHRpb25UeXBlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIEpPcHRpb25QYW5lLk9LX0NBTkNFTF9PUFRJT047Ci0JfQotCi0JcHJvdGVjdGVkIGludCBtZXNzYWdlVHlwZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBKT3B0aW9uUGFuZS5RVUVTVElPTl9NRVNTQUdFOwotCX0KLQotCXByb3RlY3RlZCBJY29uIGljb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gc2VsZWN0aW9uVmFsdWVzKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBpbml0aWFsU2VsZWN0aW9uVmFsdWUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBsaXN0IG9mIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBsaXN0IG1vZGVsCi0JICogaW50byBhbiBhcnJheS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gY29udmVydFRvQXJyYXkoTGlzdE1vZGVsIG1vZGVsKSB7Ci0JCWludCBzaXplID0gbW9kZWwuZ2V0U2l6ZSgpOwotCQlPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0W3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVzdWx0W2ldID0gbW9kZWwuZ2V0RWxlbWVudEF0KGkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogY3VzdG9tIHBhbmVsICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIExvY2FsRmlsdGVyaW5nTGlzdFBhbmVsPFM+IGV4dGVuZHMgRmlsdGVyaW5nTGlzdFBhbmVsPFM+IHsKLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0KLQkJcHJvdGVjdGVkIExvY2FsRmlsdGVyaW5nTGlzdFBhbmVsKCkgewotCQkJc3VwZXIoRU1QVFlfQVJSQVksIG51bGwpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBEaXNhYmxlIHRoZSBwZXJmb3JtYW5jZSB0d2VhayBiZWNhdXNlIEpPcHRpb25QYW5lCi0JCSAqIHdpbGwgdHJ5IG9wZW4gd2lkZSBlbm91Z2ggdG8gZGlzYWJsZSB0aGUgaG9yaXpvbnRhbCBzY3JvbGwgYmFyOwotCQkgKiBhbmQgaXQgbG9va3MgYSBiaXQgY2x1bXN5LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgcHJvdG90eXBlQ2VsbFZhbHVlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9GaWx0ZXJpbmdMaXN0UGFuZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9GaWx0ZXJpbmdMaXN0UGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2MmFiNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRmlsdGVyaW5nTGlzdFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Gb250OwotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0TGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQm9yZGVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVTdHJpbmdNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdNYXRjaGVyOwotCi0vKioKLSAqIFRoaXMgcGFuZWwgcHJlc2VudHMgYW4gZW50cnkgZmllbGQgYW5kIGEgbGlzdCBib3ggb2YgY2hvaWNlcyB0aGF0Ci0gKiBhbGxvd3MgdGhlIHVzZXIgdG8gZmlsdGVyIHRoZSBlbnRyaWVzIGluIHRoZSBsaXN0IGJveCBieSBlbnRlcmluZwotICogYSBwYXR0ZXJuIGluIHRoZSBlbnRyeSBmaWVsZC4KLSAqIAotICogQnkgZGVmYXVsdCwgdHdvIHdpbGRjYXJkcyBhcmUgYWxsb3dlZCBpbiB0aGUgcGF0dGVybjoKLSAqIAknKicgd2lsbCBtYXRjaCBhbnkgc2V0IG9mIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzCi0gKiAJJz8nIHdpbGwgbWF0Y2ggYW55IHNpbmdsZSBjaGFyYWN0ZXIKLSAqIAotICogVGhlIHBhbmVsIGNvbnNpc3RzIG9mIDQgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBjdXN0b21pemVkOgotICogCS0gMSB0ZXh0IGZpZWxkCi0gKiAJLSAxIGxpc3QgYm94Ci0gKiAJLSAyIGxhYmVscywgb25lIGZvciBlYWNoIG9mIHRoZSBhYm92ZQotICogCi0gKiBPdGhlciBhc3BlY3RzIG9mIHRoZSBwYW5lbCdzIGJlaGF2aW9yIGNhbiBiZSBjaGFuZ2VkOgotICogCS0gdGhlIHN0cmluZyBjb252ZXJ0ZXIgZGV0ZXJtaW5lcyBob3cgdGhlIG9iamVjdHMgaW4gdGhlCi0gKiAJCWxpc3QgYXJlIGNvbnZlcnRlZCB0byBzdHJpbmdzIGFuZCBjb21wYXJlZCB0byB0aGUgcGF0dGVybgotICogCQllbnRlcmVkIGluIHRoZSB0ZXh0IGZpZWxkOyBieSBkZWZhdWx0IHRoZSBjb252ZXJ0ZXIgc2ltcGx5Ci0gKiAJCXVzZXMgdGhlIHJlc3VsdCBvZiB0aGUgb2JqZWN0J3MgI3RvU3RyaW5nKCkgbWV0aG9kCi0gKiAJCShpZiB5b3UgcmVwbGFjZSB0aGUgc3RyaW5nIGNvbnZlcnRlciwgeW91IHdpbGwgcHJvYmFibHkKLSAqIAkJd2FudCB0byByZXBsYWNlIHRoZSBsaXN0IGJveCdzIGNlbGwgcmVuZGVyZXIgYWxzbykKLSAqIAktIHRoZSBzdHJpbmcgbWF0Y2hlciBjYW4gYWxzbyBiZSBjaGFuZ2VkIGlmIHlvdSB3b3VsZAotICogCQlsaWtlIGRpZmZlcmVudCBwYXR0ZXJuIG1hdGNoaW5nIGJlaGF2aW9yIHRoYW4gdGhhdAotICogCQlkZXNjcmliZWQgYWJvdmUKLSAqIAktIHlvdSBjYW4gc3BlY2lmeSB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBsaXN0IC0gdGhpcyBtYXkKLSAqIAkJZm9yY2UgdGhlIHVzZXIgdG8gZW50ZXIgYSBwYXR0ZXJuIHJlc3RyaWN0aXZlIGVub3VnaAotICogCQl0byByZXN1bHQgaW4gYSBsaXN0IHNtYWxsZXIgdGhhbiB0aGUgbWF4aW11bSBzaXplOyB0aGUKLSAqIAkJZGVmYXVsdCBpcyAtMSwgd2hpY2ggZGlzYWJsZXMgdGhlIHJlc3RyaWN0aW9uCi0gKiAKLSAqIFRoaXMgcGFuZWwgaXMgbm90IGEgdHlwaWNhbCBwYW5lbCwgaW4gdGhlIHNlbnNlIHRoYXQgaXQgZG9lcyBub3Qgc2hhcmUKLSAqIGl0cyBtb2RlbCB3aXRoIGNsaWVudHMgdmlhIHZhbHVlIG1vZGVscy4gSW5zdGVhZCwgdGhpcyBwYW5lbCdzIG1vZGVsCi0gKiBpcyBzZXQgYW5kIHF1ZXJpZWQgZGlyZWN0bHkgYmVjYXVzZSBpdCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGluIGEKLSAqIGRpYWxvZyB0aGF0IGRpcmVjdHMgdGhlIHVzZXIncyBiZWhhdmlvciAoYXMgb3Bwb3NlZCB0byBhICJub3JtYWwiCi0gKiB3aW5kb3cpLgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nTGlzdFBhbmVsPFQ+IGV4dGVuZHMgSlBhbmVsIHsKLQotCS8qKgotCSAqIFRoZSBjb21wbGV0ZSBsaXN0IG9mIGF2YWlsYWJsZSBjaG9pY2VzCi0JICogKGFzIG9wcG9zZWQgdG8gdGhlIHBhcnRpYWwgbGlzdCBoZWxkIGJ5IHRoZSBsaXN0IGJveCkuCi0JICovCi0JcHJpdmF0ZSBPYmplY3RbXSBjb21wbGV0ZUxpc3Q7Ci0KLQkvKioKLQkgKiBBbiBhZGFwdGVyIHVzZWQgdG8gY29udmVydCB0aGUgb2JqZWN0cyBpbiB0aGUgbGlzdAotCSAqIHRvIHN0cmluZ3Mgc28gdGhleSBjYW4gYmUgcnVuIHRocm91Z2ggdGhlIG1hdGNoZXIKLQkgKiBhbmQgZGlzcGxheWVkIGluIHRoZSB0ZXh0IGZpZWxkLgotCSAqLwotCVN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXI7Ci0KLQkvKiogVGhlIHRleHQgZmllbGQuICovCi0JcHJpdmF0ZSBKVGV4dEZpZWxkIHRleHRGaWVsZDsKLQlwcml2YXRlIEpMYWJlbCB0ZXh0RmllbGRMYWJlbDsKLQlwcml2YXRlIERvY3VtZW50TGlzdGVuZXIgdGV4dEZpZWxkTGlzdGVuZXI7Ci0KLQkvKiogVGhlIGxpc3QgYm94LiAqLwotCXByaXZhdGUgSkxpc3QgbGlzdEJveDsKLQlwcml2YXRlIEpMYWJlbCBsaXN0Qm94TGFiZWw7Ci0KLQkvKiogVGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgZGlzcGxheWVkIGluIHRoZSBsaXN0IGJveC4gKi8KLQlwcml2YXRlIGludCBtYXhMaXN0U2l6ZTsKLQotCS8qKgotCSAqIFRoZSBtYXRjaGVyIHVzZWQgdG8gZmlsdGVyIHRoZSBsaXN0IGFnYWluc3QKLQkgKiB0aGUgcGF0dGVybiBlbnRlcmVkIGluIHRoZSB0ZXh0IGZpZWxkLiBCeSBkZWZhdWx0LAotCSAqIHRoaXMgYWxsb3dzIHRoZSB0d28gd2lsZGNhcmQgY2hhcmFjdGVycyBkZXNjcmliZWQgaW4KLQkgKiB0aGUgY2xhc3MgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ01hdGNoZXIgc3RyaW5nTWF0Y2hlcjsKLQotCS8qKgotCSAqIFBlcmZvcm1hbmNlIHR3ZWFrOiBXZSB1c2UgdGhpcyBidWZmZXIgaW5zdGVhZCBvZgotCSAqIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGR1cmluZyBmaWx0ZXJpbmcgc28gd2UgZG9uJ3QgaGF2ZQotCSAqIHRvIGtlZXAgcmUtYWxsb2NhdGluZyBpdC4KLQkgKi8KLQlwcml2YXRlIE9iamVjdFtdIGJ1ZmZlcjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvcmRlciBURVhUX0ZJRUxEX0xBQkVMX0JPUkRFUiA9IEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMCwgMCwgNSwgMCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9yZGVyIExJU1RfQk9YX0xBQkVMX0JPUkRFUiA9IEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoNSwgMCwgNSwgMCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEZpbHRlcmluZ0xpc3RQYW5lbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBjaG9pY2VzCi0JICogYW5kIGluaXRpYWwgc2VsZWN0aW9uLiBVc2UgdGhlIGRlZmF1bHQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZQotCSAqIGNob2ljZXMgYW5kIHNlbGVjdGlvbiB0byBzdHJpbmdzICh3aGljaCBzaW1wbHkgY2FsbHMgI3RvU3RyaW5nKCkgb24KLQkgKiB0aGUgb2JqZWN0cykuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0xpc3RQYW5lbChPYmplY3RbXSBjb21wbGV0ZUxpc3QsIE9iamVjdCBpbml0aWFsU2VsZWN0aW9uKSB7Ci0JCXRoaXMoY29tcGxldGVMaXN0LCBpbml0aWFsU2VsZWN0aW9uLCBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48VD5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBGaWx0ZXJpbmdMaXN0UGFuZWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgY2hvaWNlcwotCSAqIGFuZCBpbml0aWFsIHNlbGVjdGlvbi4gVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZQotCSAqIGNob2ljZXMgYW5kIHNlbGVjdGlvbiB0byBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdMaXN0UGFuZWwoT2JqZWN0W10gY29tcGxldGVMaXN0LCBPYmplY3QgaW5pdGlhbFNlbGVjdGlvbiwgU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcikgewotCQlzdXBlcihuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQl0aGlzLmNvbXBsZXRlTGlzdCA9IGNvbXBsZXRlTGlzdDsKLQkJdGhpcy5zdHJpbmdDb252ZXJ0ZXIgPSBzdHJpbmdDb252ZXJ0ZXI7Ci0JCXRoaXMuaW5pdGlhbGl6ZShpbml0aWFsU2VsZWN0aW9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoT2JqZWN0IGluaXRpYWxTZWxlY3Rpb24pIHsKLQkJdGhpcy5tYXhMaXN0U2l6ZSA9IHRoaXMuZGVmYXVsdE1heExpc3RTaXplKCk7Ci0JCXRoaXMuYnVmZmVyID0gdGhpcy5idWlsZEJ1ZmZlcigpOwotCi0JCXRoaXMudGV4dEZpZWxkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGV4dEZpZWxkTGlzdGVuZXIoKTsKLQotCQl0aGlzLnN0cmluZ01hdGNoZXIgPSB0aGlzLmJ1aWxkU3RyaW5nTWF0Y2hlcigpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZUxheW91dChpbml0aWFsU2VsZWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkQnVmZmVyKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFt0aGlzLm1heCgpXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgbWF4IG51bWJlciBvZiBlbnRyaWVzIGFsbG93ZWQgaW4gdGhlIGxpc3QgYm94LgotCSAqLwotCXByaXZhdGUgaW50IG1heCgpIHsKLQkJaWYgKHRoaXMubWF4TGlzdFNpemUgPT0gLTEpIHsKLQkJCXJldHVybiB0aGlzLmNvbXBsZXRlTGlzdC5sZW5ndGg7Ci0JCX0KLQkJcmV0dXJuIE1hdGgubWluKHRoaXMubWF4TGlzdFNpemUsIHRoaXMuY29tcGxldGVMaXN0Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBsaXN0ZW5lciB0aGF0IHdpbGwgbGlzdGVuIHRvIGNoYW5nZXMgaW4gdGhlIHRleHQgZmllbGQKLQkgKiBhbmQgZmlsdGVyIHRoZSBsaXN0IGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJpdmF0ZSBEb2N1bWVudExpc3RlbmVyIGJ1aWxkVGV4dEZpZWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRG9jdW1lbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdMaXN0UGFuZWwudGhpcy5maWx0ZXJMaXN0KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkVXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0xpc3RQYW5lbC50aGlzLmZpbHRlckxpc3QoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdMaXN0UGFuZWwudGhpcy5maWx0ZXJMaXN0KCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0ZXh0IGZpZWxkIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgaW50IGRlZmF1bHRNYXhMaXN0U2l6ZSgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgU3RyaW5nTWF0Y2hlciBidWlsZFN0cmluZ01hdGNoZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RyaW5nTWF0Y2hlcjxUPigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplTGF5b3V0KE9iamVjdCBpbml0aWFsU2VsZWN0aW9uKSB7Ci0JCS8vIHRleHQgZmllbGQKLQkJSlBhbmVsIHRleHRGaWVsZFBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQl0aGlzLnRleHRGaWVsZExhYmVsID0gbmV3IEpMYWJlbCgpOwotCQl0aGlzLnRleHRGaWVsZExhYmVsLnNldEJvcmRlcihURVhUX0ZJRUxEX0xBQkVMX0JPUkRFUik7Ci0JCXRleHRGaWVsZFBhbmVsLmFkZCh0aGlzLnRleHRGaWVsZExhYmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCi0JCXRoaXMudGV4dEZpZWxkID0gbmV3IEpUZXh0RmllbGQoKTsKLQkJdGhpcy50ZXh0RmllbGQuZ2V0RG9jdW1lbnQoKS5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMudGV4dEZpZWxkTGlzdGVuZXIpOwotCQl0aGlzLnRleHRGaWVsZExhYmVsLnNldExhYmVsRm9yKHRoaXMudGV4dEZpZWxkKTsKLQkJdGV4dEZpZWxkUGFuZWwuYWRkKHRoaXMudGV4dEZpZWxkLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotCQl0aGlzLmFkZCh0ZXh0RmllbGRQYW5lbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQotCQkvLyBsaXN0IGJveAotCQlKUGFuZWwgbGlzdEJveFBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQl0aGlzLmxpc3RCb3hMYWJlbCA9IG5ldyBKTGFiZWwoKTsKLQkJdGhpcy5saXN0Qm94TGFiZWwuc2V0Qm9yZGVyKExJU1RfQk9YX0xBQkVMX0JPUkRFUik7Ci0JCWxpc3RCb3hQYW5lbC5hZGQodGhpcy5saXN0Qm94TGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7Ci0KLQkJdGhpcy5saXN0Qm94ID0gbmV3IEpMaXN0KCk7Ci0JCXRoaXMubGlzdEJveC5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJdGhpcy5saXN0Qm94LnNldE1vZGVsKHRoaXMuYnVpbGRQYXJ0aWFsQXJyYXlMaXN0TW9kZWwodGhpcy5jb21wbGV0ZUxpc3QsIHRoaXMubWF4KCkpKTsKLQkJdGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbk1vZGVsKCkuc2V0U2VsZWN0aW9uTW9kZShMaXN0U2VsZWN0aW9uTW9kZWwuU0lOR0xFX1NFTEVDVElPTik7Ci0JCS8vIHBlcmZvcm1hbmNlIHR3ZWFrKD8pCi0JCXRoaXMubGlzdEJveC5zZXRQcm90b3R5cGVDZWxsVmFsdWUodGhpcy5wcm90b3R5cGVDZWxsVmFsdWUoKSk7Ci0JCXRoaXMubGlzdEJveC5zZXRQcm90b3R5cGVDZWxsVmFsdWUobnVsbCk7Ci0JCXRoaXMubGlzdEJveC5zZXRDZWxsUmVuZGVyZXIodGhpcy5idWlsZERlZmF1bHRDZWxsUmVuZGVyZXIoKSk7Ci0JCXRoaXMubGlzdEJveExhYmVsLnNldExhYmVsRm9yKHRoaXMubGlzdEJveCk7Ci0JCS8vIGJ1ZyAyNzc3ODAyIC0gc2Nyb2xsIGJhcnMgc2hvdWxkbid0IGJlIG9uIHRoZSB0YWIgc2VxdWVuY2UKLQkJSlNjcm9sbFBhbmUgbGlzdEJveFNjcm9sbFBhbmUgPSBuZXcgSlNjcm9sbFBhbmUodGhpcy5saXN0Qm94KTsKLQkJbGlzdEJveFNjcm9sbFBhbmUuZ2V0SG9yaXpvbnRhbFNjcm9sbEJhcigpLnNldEZvY3VzYWJsZShmYWxzZSk7Ci0JCWxpc3RCb3hTY3JvbGxQYW5lLmdldFZlcnRpY2FsU2Nyb2xsQmFyKCkuc2V0Rm9jdXNhYmxlKGZhbHNlKTsKLQkJbGlzdEJveFBhbmVsLmFkZChsaXN0Qm94U2Nyb2xsUGFuZSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0KLQkJLy8gaW5pdGlhbGl6ZSB0aGUgd2lkZ2V0cwotCQl0aGlzLmxpc3RCb3guc2V0U2VsZWN0ZWRWYWx1ZShpbml0aWFsU2VsZWN0aW9uLCB0cnVlKTsKLQkJdGhpcy50ZXh0RmllbGQuc2VsZWN0KDAsIHRoaXMudGV4dEZpZWxkLmdldFRleHQoKS5sZW5ndGgoKSk7Ci0KLQkJdGhpcy5hZGQobGlzdEJveFBhbmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IHNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEJveC5nZXRTZWxlY3RlZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJdGhpcy5saXN0Qm94LnNldFNlbGVjdGVkVmFsdWUoc2VsZWN0aW9uLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gY29tcGxldGVMaXN0KCkgewotCQlyZXR1cm4gdGhpcy5jb21wbGV0ZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogcmVidWlsZCB0aGUgZmlsdGVyaW5nIGJ1ZmZlciBhbmQgcmUtYXBwbHkgdGhlIGZpbHRlcgotCSAqIHRvIHRoZSBuZXcgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBsZXRlTGlzdChPYmplY3RbXSBjb21wbGV0ZUxpc3QpIHsKLQkJdGhpcy5jb21wbGV0ZUxpc3QgPSBjb21wbGV0ZUxpc3Q7Ci0JCWlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPCB0aGlzLm1heCgpKSB7Ci0JCQkvLyB0aGUgYnVmZmVyIHdpbGwgbmV2ZXIgc2hyaW5rIC0gbWlnaHQgd2FudCB0byByZS1jb25zaWRlci4uLiAgfmJqdgotCQkJdGhpcy5idWZmZXIgPSB0aGlzLmJ1aWxkQnVmZmVyKCk7Ci0JCX0KLQkJdGhpcy5maWx0ZXJMaXN0KCk7Ci0JfQotCi0JcHVibGljIGludCBtYXhMaXN0U2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubWF4TGlzdFNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWF4TGlzdFNpemUoaW50IG1heExpc3RTaXplKSB7Ci0JCXRoaXMubWF4TGlzdFNpemUgPSBtYXhMaXN0U2l6ZTsKLQkJaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA8IHRoaXMubWF4KCkpIHsKLQkJCS8vIHRoZSBidWZmZXIgd2lsbCBuZXZlciBzaHJpbmsgLSBtaWdodCB3YW50IHRvIHJlLWNvbnNpZGVyLi4uICB+Ymp2Ci0JCQl0aGlzLmJ1ZmZlciA9IHRoaXMuYnVpbGRCdWZmZXIoKTsKLQkJfQotCQl0aGlzLmZpbHRlckxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMuc3RyaW5nQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIGFwcGx5IHRoZSBuZXcgZmlsdGVyIHRvIHRoZSBsaXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nQ29udmVydGVyKFN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQkJdGhpcy5zdHJpbmdDb252ZXJ0ZXIgPSBzdHJpbmdDb252ZXJ0ZXI7Ci0JCXRoaXMuZmlsdGVyTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIGFsbG93IGNsaWVudCBjb2RlIHRvIGFjY2VzcyB0aGUgdGV4dCBmaWVsZAotCSAqIChzbyB3ZSBjYW4gc2V0IHRoZSBmb2N1cykKLQkgKi8KLQlwdWJsaWMgSlRleHRGaWVsZCB0ZXh0RmllbGQoKSB7Ci0JCXJldHVybiB0aGlzLnRleHRGaWVsZDsKLQl9Ci0KLQkvKioKLQkgKiBhbGxvdyBjbGllbnQgY29kZSB0byBhY2Nlc3MgdGhlIHRleHQgZmllbGQgbGFiZWwKLQkgKi8KLQlwdWJsaWMgSkxhYmVsIHRleHRGaWVsZExhYmVsKCkgewotCQlyZXR1cm4gdGhpcy50ZXh0RmllbGRMYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0RmllbGRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy50ZXh0RmllbGRMYWJlbC5zZXRUZXh0KHRleHQpOwotCX0KLQotCS8qKgotCSAqIGFsbG93IGNsaWVudCBjb2RlIHRvIGFjY2VzcyB0aGUgbGlzdCBib3gKLQkgKiAoc28gd2UgY2FuIGFkZCBtb3VzZSBsaXN0ZW5lcnMgZm9yIGRvdWJsZS1jbGlja2luZykKLQkgKi8KLQlwdWJsaWMgSkxpc3QgbGlzdEJveCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEJveDsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0Qm94Q2VsbFJlbmRlcmVyKExpc3RDZWxsUmVuZGVyZXIgcmVuZGVyZXIpIHsKLQkJdGhpcy5saXN0Qm94LnNldENlbGxSZW5kZXJlcihyZW5kZXJlcik7Ci0JfQotCi0JLyoqCi0JICogYWxsb3cgY2xpZW50IGNvZGUgdG8gYWNjZXNzIHRoZSBsaXN0IGJveCBsYWJlbAotCSAqLwotCXB1YmxpYyBKTGFiZWwgbGlzdEJveExhYmVsKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Qm94TGFiZWw7Ci0JfQotCi0JLyoqCi0JICogY29udmVuaWVuY2UgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdEJveExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLmxpc3RCb3hMYWJlbC5zZXRUZXh0KHRleHQpOwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudHNGb250KEZvbnQgZm9udCkgewotCQl0aGlzLnRleHRGaWVsZExhYmVsLnNldEZvbnQoZm9udCk7Ci0JCXRoaXMudGV4dEZpZWxkLnNldEZvbnQoZm9udCk7Ci0JCXRoaXMubGlzdEJveExhYmVsLnNldEZvbnQoZm9udCk7Ci0JCXRoaXMubGlzdEJveC5zZXRGb250KGZvbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdNYXRjaGVyIHN0cmluZ01hdGNoZXIoKSB7Ci0JCXJldHVybiB0aGlzLnN0cmluZ01hdGNoZXI7Ci0JfQotCi0JLyoqCi0JICogcmUtYXBwbHkgdGhlIGZpbHRlciB0byB0aGUgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmluZ01hdGNoZXIoU3RyaW5nTWF0Y2hlciBzdHJpbmdNYXRjaGVyKSB7Ci0JCXRoaXMuc3RyaW5nTWF0Y2hlciA9IHN0cmluZ01hdGNoZXI7Ci0JCXRoaXMuZmlsdGVyTGlzdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbG93IHN1YmNsYXNzZXMgdG8gZGlzYWJsZSBwZXJmb3JtYW5jZSB0d2VhawotCSAqIGJ5IHJldHVybmluZyBudWxsIGhlcmUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm90b3R5cGVDZWxsVmFsdWUoKSB7Ci0JCXJldHVybiAiPT09PT09PT09PT4gQV9TVFJJTkdfVEhBVF9JU19ERUZJTklURUxZX0xPTkdFUl9USEFOX0VWRVJZX1NUUklOR19JTl9USEVfTElTVCA8PT09PT09PT09PSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCB1c2UgdGhlIHN0cmluZyBjb252ZXJ0ZXIgdG8gYnVpbGQgdGhlIHRleHQKLQkgKiB1c2VkIGJ5IHRoZSBsaXN0IGJveCdzIGNlbGwgcmVuZGVyZXIuCi0JICovCi0JcHJvdGVjdGVkIExpc3RDZWxsUmVuZGVyZXIgYnVpbGREZWZhdWx0Q2VsbFJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoT2JqZWN0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEZpbHRlcmluZ0xpc3RQYW5lbC50aGlzLnN0cmluZ0NvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcoKFQpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBTb21ldGhpbmcgaGFzIGNoYW5nZWQgdGhhdCByZXF1aXJlcyB1cyB0byBmaWx0ZXIgdGhlIGxpc3QuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgc3luY2hyb25pemVkIGJlY2F1c2UgYSBmYXN0IHR5cGlzdCBjYW4KLQkgKiBnZW5lcmF0ZSBldmVudHMgcXVpY2tlciB0aGFuIHdlIGNhbiBmaWx0ZXIgdGhlIGxpc3QuICg/ICB+Ymp2KQotCSAqLwotCXN5bmNocm9uaXplZCB2b2lkIGZpbHRlckxpc3QoKSB7Ci0JCS8vIHRlbXBvcmFyaWx5IHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGJveCBzZWxlY3Rpb24sIHNpbmNlIHdlIHdpbGwKLQkJLy8gYmUgY2hhbmdpbmcgdGhlIHNlbGVjdGlvbiBkdXJpbmcgdGhlIGZpbHRlcmluZyBhbmQgZG9uJ3Qgd2FudAotCQkvLyB0aGF0IHRvIGFmZmVjdCB0aGUgdGV4dCBmaWVsZAotCQl0aGlzLmZpbHRlckxpc3QodGhpcy50ZXh0RmllbGQuZ2V0VGV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaWx0ZXIgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0IGJveCB0byBtYXRjaCB0aGUKLQkgKiBzcGVjaWZpZWQgcGF0dGVybi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlsdGVyTGlzdChTdHJpbmcgcGF0dGVybikgewotCQlpZiAocGF0dGVybi5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aGlzLmxpc3RCb3guc2V0TW9kZWwodGhpcy5idWlsZFBhcnRpYWxBcnJheUxpc3RNb2RlbCh0aGlzLmNvbXBsZXRlTGlzdCwgdGhpcy5tYXgoKSkpOwotCQl9IGVsc2UgewotCQkJdGhpcy5zdHJpbmdNYXRjaGVyLnNldFBhdHRlcm5TdHJpbmcocGF0dGVybik7Ci0JCQlpbnQgaiA9IDA7Ci0JCQlpbnQgbGVuID0gdGhpcy5jb21wbGV0ZUxpc3QubGVuZ3RoOwotCQkJaW50IG1heCA9IHRoaXMubWF4KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJaWYgKHRoaXMuc3RyaW5nTWF0Y2hlci5tYXRjaGVzKHRoaXMuc3RyaW5nQ29udmVydGVyLmNvbnZlcnRUb1N0cmluZyh0aGlzLmVudHJ5KGkpKSkpIHsKLQkJCQkJdGhpcy5idWZmZXJbaisrXSA9IHRoaXMuY29tcGxldGVMaXN0W2ldOwotCQkJCX0KLQkJCQlpZiAoaiA9PSBtYXgpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJdGhpcy5saXN0Qm94LnNldE1vZGVsKHRoaXMuYnVpbGRQYXJ0aWFsQXJyYXlMaXN0TW9kZWwodGhpcy5idWZmZXIsIGopKTsKLQkJfQotCi0JCS8vIGFmdGVyIGZpbHRlcmluZyB0aGUgbGlzdCwgZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBzZWxlY3Rpb24KLQkJaWYgKHRoaXMubGlzdEJveC5nZXRNb2RlbCgpLmdldFNpemUoKSA9PSAwKSB7Ci0JCQl0aGlzLmxpc3RCb3guZ2V0U2VsZWN0aW9uTW9kZWwoKS5jbGVhclNlbGVjdGlvbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbk1vZGVsKCkuc2V0QW5jaG9yU2VsZWN0aW9uSW5kZXgoMCk7Ci0JCQl0aGlzLmxpc3RCb3guZ2V0U2VsZWN0aW9uTW9kZWwoKS5zZXRMZWFkU2VsZWN0aW9uSW5kZXgoMCk7Ci0JCQl0aGlzLmxpc3RCb3guZW5zdXJlSW5kZXhJc1Zpc2libGUoMCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBUIGVudHJ5KGludCBpbmRleCkgewotCQlyZXR1cm4gKFQpIHRoaXMuY29tcGxldGVMaXN0W2luZGV4XTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIGxpc3QgbW9kZWwgdGhhdCB3cmFwcyBvbmx5IGEgcG9ydGlvbiBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIFRoZSBtb2RlbCB3aWxsIGluY2x1ZGUgdGhlIGFycmF5IGVudHJpZXMgZnJvbSAwIHRvIChzaXplIC0gMSkuCi0JICovCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRQYXJ0aWFsQXJyYXlMaXN0TW9kZWwoZmluYWwgT2JqZWN0W10gYXJyYXksIGZpbmFsIGludCBzaXplKSB7Ci0JCXJldHVybiBuZXcgQWJzdHJhY3RMaXN0TW9kZWwoKSB7Ci0JCQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCQkJcmV0dXJuIHNpemU7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLQkJCQlyZXR1cm4gYXJyYXlbaW5kZXhdOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9MaXN0Q2hvb3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0xpc3RDaG9vc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMDY1MmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0xpc3RDaG9vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkFXVEV2ZW50OwotaW1wb3J0IGphdmEuYXd0LkFXVEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLWltcG9ydCBqYXZhLmF3dC5Qb2ludDsKLWltcG9ydCBqYXZhLmF3dC5Sb2JvdDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlBvcHVwTWVudUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlBvcHVwTWVudUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuYmFzaWMuQmFzaWNDb21ib0JveFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLQotLyoqCi0gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHdheSB0byBoYW5kbGUgc2VsZWN0aW5nIGFuIGl0ZW0gZnJvbSBhCi0gKiBsaXN0IHRoYXQgbWF5IGdyb3cgdG9vIGxhcmdlIHRvIGJlIGhhbmRsZWQgY29udmVuaWVudGx5IGJ5IGEgY29tYm8tYm94LiAKLSAqIElmIHRoZSBsaXN0J3Mgc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGRlc2lnbmF0ZWQgImxvbmciIGxpc3Qgc2l6ZSwgCi0gKiB0aGUgY2hvaWNlIGxpc3Qgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gYSBub3JtYWwgY29tYm8tYm94IHBvcHVwOyAKLSAqIG90aGVyd2lzZSwgYSBkaWFsb2cgd2lsbCBiZSB1c2VkIHRvIHByb21wdCB0aGUgdXNlciB0byBjaG9vc2UgYSBzZWxlY3Rpb24uCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgYnJvd3NlIG1lY2hhbmlzbSwgc3ViY2xhc3NlcyBtYXkgCi0gKiAJLSBvdmVycmlkZSB0aGUgbWV0aG9kICNidWlsZEJyb3dzZXIoKQotICogIC0gb3ZlcnJpZGUgdGhlIG1ldGhvZCAjYnJvd3NlKCksIGluIHdoaWNoIGNhc2UgdGhlIG1ldGhvZCAKLSAqIAkJI2J1aWxkQnJvd3NlcigpIG1heSBiZSBpZ25vcmVkLgotICovCi1wdWJsaWMgY2xhc3MgTGlzdENob29zZXIgCi0JZXh0ZW5kcyBKQ29tYm9Cb3gKLXsKLQkKLQkvKiogdGhlIHNpemUgb2YgYSAibG9uZyIgbGlzdCAtIGFueXRoaW5nIHNtYWxsZXIgaXMgYSAic2hvcnQiIGxpc3QgKi8KLQlpbnQgbG9uZ0xpc3RTaXplID0gREVGQVVMVF9MT05HX0xJU1RfU0laRTsKLQkKLQkvKiogdGhlIGRlZmF1bHQgc2l6ZSBvZiBhICJsb25nIiBsaXN0LCB3aGljaCBpcyAyMCAodG8gbWF0Y2ggSk9wdGlvblBhbmUncyBiZWhhdmlvcikgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0xPTkdfTElTVF9TSVpFID0gMjA7Ci0JCi0JLyoqIHByb3BlcnR5IGNoYW5nZSBhc3NvY2lhdGVkIHdpdGggbG9uZyBsaXN0IHNpemUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HX0xJU1RfU0laRV9QUk9QRVJUWSA9ICJsb25nTGlzdFNpemUiOyAvLyROT04tTkxTLTEkCi0JCi0gICAgc3RhdGljIEpMYWJlbCBwcm90b3R5cGVMYWJlbCA9IG5ldyBKTGFiZWwoIlByb3RvdHlwZSIsIG5ldyBFbXB0eUljb24oMTcpLCBTd2luZ0NvbnN0YW50cy5MRUFESU5HKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIAotCSAqIHdoZXRoZXIgdGhlIGNob29zZXIgaXMgY2hvb3NhYmxlLiAgaWYgYSBjaG9vc2VyIGlzIG5vdCBjaG9vc2FibGUsCi0JICogaXQgb25seSBzZXJ2ZXMgYXMgYSBkaXNwbGF5IHdpZGdldC4gIGEgdXNlciBtYXkgbm90IGNoYW5nZSBpdHMgCi0JICogc2VsZWN0ZWQgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBjaG9vc2FibGUgPSB0cnVlOwotCQotCS8qKiBwcm9wZXJ0eSBjaGFuZ2UgYXNzb2NpYXRlZCB3aXRoIGNob29zYWJsZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIT09TQUJMRV9QUk9QRVJUWSA9ICJjaG9vc2FibGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHRoZSBicm93c2VyIHVzZWQgdG8gbWFrZSBhIHNlbGVjdGlvbiBmcm9tIHRoZSBsb25nIGxpc3QgLSB0eXBpY2FsbHkgdmlhIGEgZGlhbG9nICovCi0JcHJpdmF0ZSBMaXN0QnJvd3NlciBicm93c2VyOwotCQotICAgIHByaXZhdGUgTm9kZVNlbGVjdG9yIG5vZGVTZWxlY3RvcjsKLSAgICAKLQkvKiogSU5URVJOQUwgLSBUaGUgcG9wdXAgaXMgYmVpbmcgc2hvd24uICBVc2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcC4gKi8KLQlib29sZWFuIHBvcHVwQWxyZWFkeUluUHJvZ3Jlc3M7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBDb25zdHJ1Y3RvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBjaG9vc2VyIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0Q2hvb3NlcihDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMobW9kZWwsIG5ldyBOb2RlU2VsZWN0b3IuRGVmYXVsdE5vZGVTZWxlY3RvcigpKTsKLQl9Ci0JCi0gICAgcHVibGljIExpc3RDaG9vc2VyKENhY2hpbmdDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMobW9kZWwsIG5ldyBOb2RlU2VsZWN0b3IuRGVmYXVsdE5vZGVTZWxlY3RvcigpKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIExpc3RDaG9vc2VyKENvbWJvQm94TW9kZWwgbW9kZWwsIE5vZGVTZWxlY3RvciBub2RlU2VsZWN0b3IpIHsKLSAgICAgICAgdGhpcyhuZXcgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwobW9kZWwpLCBub2RlU2VsZWN0b3IpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdENob29zZXIoQ2FjaGluZ0NvbWJvQm94TW9kZWwgbW9kZWwsIE5vZGVTZWxlY3RvciBub2RlU2VsZWN0b3IpIHsKLSAgICAgICAgc3VwZXIobW9kZWwpOwotICAgICAgICB0aGlzLmluaXRpYWxpemUoKTsKLSAgICAgICAgdGhpcy5ub2RlU2VsZWN0b3IgPSBub2RlU2VsZWN0b3I7Ci0gICAgfQotCS8vICoqKioqKioqKioqKioqKiogSW5pdGlhbGl6YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuYWRkUG9wdXBNZW51TGlzdGVuZXIodGhpcy5idWlsZFBvcHVwTWVudUxpc3RlbmVyKCkpOwotCQl0aGlzLnNldFJlbmRlcmVyKG5ldyBEZWZhdWx0TGlzdENlbGxSZW5kZXJlcigpKTsKLSAgICAgICAgdGhpcy5hZGRLZXlMaXN0ZW5lcihidWlsZEYzS2V5TGlzdGVuZXIoKSk7Ci0gICAgICAgIAotICAgICAgICAvL1RoZXNlIGFyZSB1c2VkIHRvIHdvcmthcm91bmQgcHJvYmxlbXMgd2l0aCBTd2luZyB0cnlpbmcgdG8gCi0gICAgICAgIC8vZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgY29tYm9Cb3ggd2l0aCBhIGxhcmdlIG1vZGVsCi0gICAgICAgIHNldFByb3RvdHlwZURpc3BsYXlWYWx1ZShwcm90b3R5cGVMYWJlbCk7Ci0gICAgICAgIGxpc3RCb3goKS5zZXRQcm90b3R5cGVDZWxsVmFsdWUocHJvdG90eXBlTGFiZWwpOwotCX0KLQkKLSAgICAKLSAgICBwcml2YXRlIEpMaXN0IGxpc3RCb3goKSB7Ci0gICAgICAgIHJldHVybiAoSkxpc3QpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHRoaXMudWksICJsaXN0Qm94Iik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0JLyoqIAotCSAqIFdoZW4gdGhlIHBvcHVwIGlzIGFib3V0IHRvIGJlIHNob3duLCB0aGUgZXZlbnQgaXMgY29uc3VtZWQsIGFuZCAKLQkgKiBQb3B1cEhhbmRsZXIgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHJlc2hvdyB0aGUgcG9wdXAgb3IgdG8gc2hvdwotCSAqIHRoZSBsb25nIGxpc3QgYnJvd3Nlci4KLQkgKi8KLQlwcml2YXRlIFBvcHVwTWVudUxpc3RlbmVyIGJ1aWxkUG9wdXBNZW51TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUG9wdXBNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwb3B1cE1lbnVXaWxsQmVjb21lVmlzaWJsZShQb3B1cE1lbnVFdmVudCBlKSB7Ci0JCQkJTGlzdENob29zZXIudGhpcy5hYm91dFRvU2hvd1BvcHVwKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBwb3B1cE1lbnVXaWxsQmVjb21lSW52aXNpYmxlKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBwb3B1cE1lbnVDYW5jZWxlZChQb3B1cE1lbnVFdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicG9wLXVwIG1lbnUgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIElmIHRoaXMgY29kZSBpcyBiZWluZyByZWFjaGVkIGR1ZSB0byB0aGUgUG9wdXBIYW5kbGVyIGFscmVhZHkgYmVpbmcgaW4gcHJvZ3Jlc3MsCi0JICogdGhlbiBkbyBub3RoaW5nLiAgT3RoZXJ3aXNlLCBzZXQgdGhlIGZsYWcgdG8gdHJ1ZSBhbmQgbGF1bmNoIHRoZSBQb3B1cEhhbmRsZXIuCi0JICovCi0Jdm9pZCBhYm91dFRvU2hvd1BvcHVwKCkgewotCQlpZiAodGhpcy5wb3B1cEFscmVhZHlJblByb2dyZXNzKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRoaXMucG9wdXBBbHJlYWR5SW5Qcm9ncmVzcyA9IHRydWU7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIobmV3IFBvcHVwSGFuZGxlcigpKTsKLQl9Ci0gCi0gICAgCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBidWlsZEYzS2V5TGlzdGVuZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LlZLX0YzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdvVG9TZWxlY3RlZEl0ZW0oKTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiRjMga2V5IGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotICAgICAgICB9OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBnb1RvU2VsZWN0ZWRJdGVtKCkgewotICAgICAgICBpZiAoZ2V0U2VsZWN0ZWRJdGVtKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdENob29zZXIudGhpcy5ub2RlU2VsZWN0b3Iuc2VsZWN0Tm9kZUZvcihnZXRTZWxlY3RlZEl0ZW0oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0JLy8gKioqKioqKioqKioqKioqKiBCcm93c2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqIAotCSAqIExhemlseSBpbml0aWFsaXplIGJlY2F1c2Ugc3ViY2xhc3NlcyBtYXkgaGF2ZSBmdXJ0aGVyIGluaXRpYWxpemF0aW9uIHRvIGRvCi0JICogYmVmb3JlIGJyb3dzZXIgY2FuIGJlIGJ1aWx0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyb3dzZSgpIHsKLQkJaWYgKHRoaXMuYnJvd3NlciA9PSBudWxsKSB7Ci0JCQl0aGlzLmJyb3dzZXIgPSB0aGlzLmJ1aWxkQnJvd3NlcigpOwotCQl9Ci0JCQotCQl0aGlzLmJyb3dzZXIuYnJvd3NlKHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJicm93c2VyIiB1c2VkIHRvIG1ha2UgYSBzZWxlY3Rpb24gZnJvbSB0aGUgbG9uZyBsaXN0LAotCSAqIHR5cGljYWxseSB2aWEgYSBkaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIExpc3RDaG9vc2VyLkxpc3RCcm93c2VyIGJ1aWxkQnJvd3NlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0QnJvd3NlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIENob29zYWJsZSBmdW5jdGlvbmFsaXR5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKiogb3ZlcnJpZGUgYmVoYXZpb3IgLSBjb25zdW1lIHNlbGVjdGlvbiBpZiBjaG9vc2VyIGlzIG5vdCBjaG9vc2FibGUgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEluZGV4KGludCBhbkluZGV4KSB7Ci0JCWlmICh0aGlzLmNob29zYWJsZSkgewotCQkJc3VwZXIuc2V0U2VsZWN0ZWRJbmRleChhbkluZGV4KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQXJyb3dCdXR0b24oKSB7Ci0JCXRyeSB7Ci0JCQlCYXNpY0NvbWJvQm94VUkgY29tYm9Cb3hVaSA9IChCYXNpY0NvbWJvQm94VUkpIExpc3RDaG9vc2VyLnRoaXMuZ2V0VUkoKTsKLQkJCUpCdXR0b24gYXJyb3dCdXR0b24gPSAoSkJ1dHRvbikgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoY29tYm9Cb3hVaSwgImFycm93QnV0dG9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFycm93QnV0dG9uLnNldEVuYWJsZWQodGhpcy5pc0VuYWJsZWQoKSAmJiB0aGlzLmNob29zYWJsZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0aGlzIGlzIGEgaHVnZSBoYWNrIHRvIHRyeSBhbmQgbWFrZSB0aGUgY29tYm8gYm94IGxvb2sgcmlnaHQsCi0JCQkvLyBzbyBpZiBpdCBkb2Vzbid0IHdvcmssIGp1c3Qgc3dhbGxvdyB0aGUgZXhjZXB0aW9uCi0JCX0KLQl9Ci0JCi0JCi0gICAgLy8gKioqKioqKioqKioqKioqKiBMaXN0IENhY2hpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgdm9pZCBjYWNoZUxpc3QoKSB7Ci0gICAgICAgICgoQ2FjaGluZ0NvbWJvQm94TW9kZWwpIGdldE1vZGVsKCkpLmNhY2hlTGlzdCgpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHVuY2FjaGVMaXN0KCkgewotICAgICAgICAoKENhY2hpbmdDb21ib0JveE1vZGVsKSBnZXRNb2RlbCgpKS51bmNhY2hlTGlzdCgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gbGlzdElzQ2FjaGVkKCkgewotICAgICAgICByZXR1cm4gKChDYWNoaW5nQ29tYm9Cb3hNb2RlbCkgZ2V0TW9kZWwoKSkuaXNDYWNoZWQoKTsKLSAgICB9Ci0gICAgCi0JLy8gKioqKioqKioqKioqKioqKiBQdWJsaWMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIGludCBsb25nTGlzdFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxvbmdMaXN0U2l6ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9uZ0xpc3RTaXplKGludCBuZXdMb25nTGlzdFNpemUpIHsKLQkJaW50IG9sZExvbmdMaXN0U2l6ZSA9IHRoaXMubG9uZ0xpc3RTaXplOwotCQl0aGlzLmxvbmdMaXN0U2l6ZSA9IG5ld0xvbmdMaXN0U2l6ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2UoTE9OR19MSVNUX1NJWkVfUFJPUEVSVFksIG9sZExvbmdMaXN0U2l6ZSwgbmV3TG9uZ0xpc3RTaXplKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDaG9vc2FibGUoKSB7Ci0JCXJldHVybiB0aGlzLmNob29zYWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2hvb3NhYmxlKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJYm9vbGVhbiBvbGRWYWx1ZSA9IHRoaXMuY2hvb3NhYmxlOwotCQl0aGlzLmNob29zYWJsZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZShDSE9PU0FCTEVfUFJPUEVSVFksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCXRoaXMudXBkYXRlQXJyb3dCdXR0b24oKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBIYW5kbGUgc2VsZWN0aW5nIG51bGwgYXMgYSB2YWx1ZSAqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwcml2YXRlIGJvb2xlYW4gc2VsZWN0ZWRJbmRleElzTm9uZVNlbGVjdGVkSXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGluZGV4ID09IC0xICYmCi0JCQkJIGdldE1vZGVsKCkuZ2V0U2l6ZSgpID4gMCAmJgotCQkJCSBnZXRNb2RlbCgpLmdldEVsZW1lbnRBdCgwKSA9PSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJbmRleCgpIHsKLSAgICAgICAgYm9vbGVhbiBsaXN0Tm90Q2FjaGVkID0gIWxpc3RJc0NhY2hlZCgpOwotICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotICAgICAgICAgICAgY2FjaGVMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCWludCBpbmRleCA9IHN1cGVyLmdldFNlbGVjdGVkSW5kZXgoKTsKLQotCQkvLyBVc2UgaW5kZXggMCB0byBzaG93IHRoZSA8bm9uZSBzZWxlY3RlZD4gaXRlbSBzaW5jZSB0aGUgYWN0dWFsIHZhbHVlIGlzCi0JCS8vIG51bGwgYW5kIEpDb21ib0JveCBkb2VzIG5vdCBoYW5kbGUgbnVsbCB2YWx1ZXMKLQkJaWYgKHNlbGVjdGVkSW5kZXhJc05vbmVTZWxlY3RlZEl0ZW0oaW5kZXgpKSB7Ci0JCQlpbmRleCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotICAgICAgICAgICAgdW5jYWNoZUxpc3QoKTsKLSAgICAgICAgfQotCQlyZXR1cm4gaW5kZXg7Ci0gICB9Ci0JCi0JLy93cmFwIHRoZSByZW5kZXJlciB0byBkZWFsIHdpdGggdGhlIHByb3RvdHlwZURpc3BsYXlWYWx1ZQotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyKGZpbmFsIExpc3RDZWxsUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0gICAgICAgIHN1cGVyLnNldFJlbmRlcmVyKG5ldyBMaXN0Q2VsbFJlbmRlcmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgQ29tcG9uZW50IGdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQoSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gcHJvdG90eXBlTGFiZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvdHlwZUxhYmVsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYVJlbmRlcmVyLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgCi0gICAgCi0JLy8gKioqKioqKioqKioqKioqKiBNZW1iZXIgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogRGVmaW5lIHRoZSBBUEkgcmVxdWlyZWQgYnkgdGhpcyBMaXN0Q2hvb3NlciB3aGVuIGl0IG11c3QKLQkgKiBwcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGFuIGl0ZW0gZnJvbSB0aGUgImxvbmciIGxpc3QuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXN0QnJvd3NlciAKLQl7Ci0JCS8qKgotCQkgKiBQcm9tcHQgdGhlIHVzZXIgdG8gbWFrZSBhIHNlbGVjdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQKLQkJICogY29tYm8tYm94J3MgbW9kZWwuCi0JCSAqLwotCQl2b2lkIGJyb3dzZShMaXN0Q2hvb3NlciBwYXJlbnRDaG9vc2VyKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUnVubmFibGUgY2xhc3MgdGhhdCBjb25zdW1lcyBwb3B1cCB3aW5kb3cgYW5kIGRldGVybWluZXMgd2hldGhlcgotCSAqIHRvIHJlc2hvdyBwb3B1cCBvciB0byBsYXVuY2ggYnJvd3NlciwgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQb3B1cEhhbmRsZXIKLQkJaW1wbGVtZW50cyBSdW5uYWJsZQotCXsKLQkJLyoqIFRoZSBtb3VzZSBldmVudCAqLwotCQlwcml2YXRlIE1vdXNlRXZlbnQgbGFzdE1vdXNlRXZlbnQ7Ci0JCQotCQkvKiogVGhlIGNvbXBvbmVudCBmcm9tIHdoaWNoIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBKQ29tcG9uZW50IGV2ZW50Q29tcG9uZW50OwotCQkKLQkJLyoqIFRoZSBsb2NhdGlvbiBvZiB0aGUgY29tcG9uZW50IGF0IHRoZSB0aW1lIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBQb2ludCBjb21wb25lbnRMb2NhdGlvbjsKLQkJCi0JCS8qKiBUaGUgbG9jYXRpb24gb2YgdGhlIG1vdXNlIGF0IHRoZSB0aW1lIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBQb2ludCBtb3VzZUxvY2F0aW9uOwotCQkKLQkJCi0JCVBvcHVwSGFuZGxlcigpIHsKLQkJCXRoaXMuaW5pdGlhbGl6ZSgpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCUFXVEV2ZW50IGV2ZW50ID0gRXZlbnRRdWV1ZS5nZXRDdXJyZW50RXZlbnQoKTsKLQkJCQotCQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCkgewotCQkJCXRoaXMubGFzdE1vdXNlRXZlbnQgPSAoTW91c2VFdmVudCkgZXZlbnQ7Ci0JCQkJdGhpcy5ldmVudENvbXBvbmVudCA9IChKQ29tcG9uZW50KSB0aGlzLmxhc3RNb3VzZUV2ZW50LmdldFNvdXJjZSgpOwotCQkJCXRoaXMuY29tcG9uZW50TG9jYXRpb24gPSB0aGlzLmV2ZW50Q29tcG9uZW50LmdldExvY2F0aW9uT25TY3JlZW4oKTsKLQkJCQl0aGlzLm1vdXNlTG9jYXRpb24gPSB0aGlzLmxhc3RNb3VzZUV2ZW50LmdldFBvaW50KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmV2ZW50Q29tcG9uZW50ID0gbnVsbDsKLQkJCQl0aGlzLmNvbXBvbmVudExvY2F0aW9uID0gbnVsbDsKLQkJCQl0aGlzLm1vdXNlTG9jYXRpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlMaXN0Q2hvb3Nlci50aGlzLmhpZGVQb3B1cCgpOwotCQkJCi0gICAgICAgICAgICBjYWNoZUxpc3QoKTsKLQkJCWlmIChMaXN0Q2hvb3Nlci50aGlzLmNob29zYWJsZSA9PSB0cnVlKSB7Ci0JCQkJLy8gSWYgdGhlIGNvbWJvIGJveCBtb2RlbCBpcyBvZiBzdWZmaWNpZW50IGxlbmd0aCwgdGhlIGJyb3dzZXIgd2lsbCBiZSBzaG93bi4KLQkJCQkvLyBBc2tpbmcgdGhlIGNvbWJvIGJveCBtb2RlbCBmb3IgaXRzIHNpemUgc2hvdWxkIGJlIGVub3VnaCB0byBlbnN1cmUgdGhhdCAKLQkJCQkvLyAgaXRzIHNpemUgaXMgcmVjYWxjdWxhdGVkLgotCQkJCWlmIChMaXN0Q2hvb3Nlci50aGlzLmdldE1vZGVsKCkuZ2V0U2l6ZSgpID4gTGlzdENob29zZXIudGhpcy5sb25nTGlzdFNpemUpIHsKLQkJCQkJdGhpcy5jaGVja0NvbWJvQm94QnV0dG9uKCk7Ci0JCQkJCUxpc3RDaG9vc2VyLnRoaXMuYnJvd3NlKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMaXN0Q2hvb3Nlci50aGlzLnNob3dQb3B1cCgpOwotCQkJCQl0aGlzLmNoZWNrTW91c2VQb3NpdGlvbigpOwotCQkJCX0KLQkJCX0KLSAgICAgICAgICAgIGlmIChsaXN0SXNDYWNoZWQoKSkgewotICAgICAgICAgICAgICAgIHVuY2FjaGVMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0JCQkKLQkJCUxpc3RDaG9vc2VyLnRoaXMucG9wdXBBbHJlYWR5SW5Qcm9ncmVzcyA9IGZhbHNlOwotCQl9Ci0JCQotCQkvKiogSWYgdGhpcyBpcyBub3QgZG9uZSwgdGhlIGJ1dHRvbiBuZXZlciBiZWNvbWVzIHVuLXByZXNzZWQgKi8KLQkJcHJpdmF0ZSB2b2lkIGNoZWNrQ29tYm9Cb3hCdXR0b24oKSB7Ci0JCQl0cnkgewotCQkJCUJhc2ljQ29tYm9Cb3hVSSBjb21ib0JveFVpID0gKEJhc2ljQ29tYm9Cb3hVSSkgTGlzdENob29zZXIudGhpcy5nZXRVSSgpOwotCQkJCUpCdXR0b24gYXJyb3dCdXR0b24gPSAoSkJ1dHRvbikgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoY29tYm9Cb3hVaSwgImFycm93QnV0dG9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlhcnJvd0J1dHRvbi5nZXRNb2RlbCgpLnNldFByZXNzZWQoZmFsc2UpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHRoaXMgaXMgYSBodWdlIGhhY2sgdG8gdHJ5IGFuZCBtYWtlIHRoZSBjb21ibyBib3ggbG9vayByaWdodCwKLQkJCQkvLyBzbyBpZiBpdCBkb2Vzbid0IHdvcmssIGp1c3Qgc3dhbGxvdyB0aGUgZXhjZXB0aW9uCi0JCQkJdGhpcy5oYW5kbGVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBkbyBub3RoaW5nIGZvciBub3cKLQkJfQotCQkKLQkJLyoqCi0JCSAqIE1vdmVzIHRoZSBtb3VzZSBiYWNrIHRvIGl0cyBvcmlnaW5hbCBwb3NpdGlvbiBiZWZvcmUgYW55IGppZ2dlcnkgcG9rZXJ5IHRoYXQgd2UndmUgZG9uZS4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBjaGVja01vdXNlUG9zaXRpb24oKSB7Ci0JCQlpZiAodGhpcy5ldmVudENvbXBvbmVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlmaW5hbCBQb2ludCBuZXdDb21wb25lbnRMb2NhdGlvbiA9IHRoaXMuZXZlbnRDb21wb25lbnQuZ2V0TG9jYXRpb25PblNjcmVlbigpOwotCQkJYm9vbGVhbiBjb21wb25lbnRNb3ZlZCA9IAotCQkJCW5ld0NvbXBvbmVudExvY2F0aW9uLnggLSB0aGlzLmNvbXBvbmVudExvY2F0aW9uLnggIT0gMAotCQkJCXx8IG5ld0NvbXBvbmVudExvY2F0aW9uLnkgLSB0aGlzLmNvbXBvbmVudExvY2F0aW9uLnkgIT0gMDsKLQkJCQotCQkJaWYgKGNvbXBvbmVudE1vdmVkKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbmV3IFJvYm90KCkubW91c2VNb3ZlKAotCQkJCQkJbmV3Q29tcG9uZW50TG9jYXRpb24ueCArIHRoaXMubW91c2VMb2NhdGlvbi54LAotCQkJCQkJbmV3Q29tcG9uZW50TG9jYXRpb24ueSArIHRoaXMubW91c2VMb2NhdGlvbi55Ci0JCQkJCSk7Ci0JCQkJfQotCQkJCWNhdGNoIChBV1RFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gbW92ZSBmYWlsZWQgLSBkbyBub3RoaW5nCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL05vZGVTZWxlY3Rvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL05vZGVTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGI0ZDE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob2RlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLS8qKgotICogVGhpcyB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHByZXNzZXMgRjMgb3IgY2hvb3NlcwotICogJ0dvIFRvJyBpbiB0aGUgY29udGV4dCBtZW51Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTm9kZVNlbGVjdG9yIAoteyAgICAgICAKLSAgICAvKioKLSAgICAgKiBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIE5vZGUgaW4gdGhlIHRyZWUgb3IgdGhlIGVkaXRvciBwYW5lbC4KLSAgICAgKi8KLSAgICB2b2lkIHNlbGVjdE5vZGVGb3IoT2JqZWN0IGl0ZW0pOwotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgTm9kZVNlbGVjdG9yIHdpbGwgZG8gbm90aGluZyB3aGVuIHNlbGVjdE5vZGVGb3IoT2JqZWN0KSBpcyBjYWxsZWQKLSAgICAgKi8KLSAgICBjbGFzcyBEZWZhdWx0Tm9kZVNlbGVjdG9yIGltcGxlbWVudHMgTm9kZVNlbGVjdG9yIHsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdE5vZGVGb3IoT2JqZWN0IGl0ZW0pIHsKLSAgICAgICAgICAgIC8vZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL05vbkNhY2hpbmdDb21ib0JveE1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU3MjI2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3REYXRhTGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ2FjaGluZ0NvbWJvQm94TW9kZWwgaW50ZXJmYWNlIGNhbiBiZSB1c2VkCi0gKiB3aGVuZXZlciB0aGVyZSBpcyBubyBuZWVkIGZvciBjYWNoaW5nIChpLmUuIHRoZSBjb250ZW50cyBvZiB0aGUgc2VsZWN0aW9uCi0gKiBsaXN0IGNhbiBiZSBnZW5lcmF0ZWQgd2l0aCBsaXR0bGUgbGF0ZW5jeSkuIEFsbCB0aGUgbm9ybWFsIENvbWJvQm94TW9kZWwKLSAqIGJlaGF2aW9yIGlzIGRlbGVnYXRlZCB0byBhIGNsaWVudC1zdXBwbGllZCBDb21ib0JveE1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwgaW1wbGVtZW50cyBDYWNoaW5nQ29tYm9Cb3hNb2RlbCB7Ci0JcHJpdmF0ZSBDb21ib0JveE1vZGVsIHdyYXBwZWRDb21ib0JveE1vZGVsOwotCi0JcHVibGljIE5vbkNhY2hpbmdDb21ib0JveE1vZGVsKENvbWJvQm94TW9kZWwgd3JhcHBlZENvbWJvQm94TW9kZWwpIHsKLQkJdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbCA9IHdyYXBwZWRDb21ib0JveE1vZGVsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDYWNoaW5nQ29tYm9Cb3hNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBjYWNoZUxpc3QoKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHVuY2FjaGVMaXN0KCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NhY2hlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21ib0JveE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkSXRlbShPYmplY3QgYW5JdGVtKSB7Ci0JCXRoaXMud3JhcHBlZENvbWJvQm94TW9kZWwuc2V0U2VsZWN0ZWRJdGVtKGFuSXRlbSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRTZWxlY3RlZEl0ZW0oKSB7Ci0JCXJldHVybiB0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsLmdldFNlbGVjdGVkSXRlbSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRTaXplKCkgewotCQlyZXR1cm4gdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbC5nZXRTaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRFbGVtZW50QXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdERhdGFMaXN0ZW5lcihMaXN0RGF0YUxpc3RlbmVyIGwpIHsKLQkJdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbC5hZGRMaXN0RGF0YUxpc3RlbmVyKGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3REYXRhTGlzdGVuZXIoTGlzdERhdGFMaXN0ZW5lciBsKSB7Ci0JCXRoaXMud3JhcHBlZENvbWJvQm94TW9kZWwucmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihsKTsKLQl9ICAKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NpbXBsZURpc3BsYXlhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlRGlzcGxheWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBjY2RkNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlRGlzcGxheWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgRGlzcGxheWFibGUgY29udmVydHMgYW55IE9iamVjdAotICogdG8gYSBEaXNwbGF5YWJsZS4gU3ViY2xhc3MgaXQgdG8gb3ZlcnJpZGUgI2Rpc3BsYXlTdHJpbmcoKSBhbmQKLSAqICNpY29uKCkgaWYgbmVjZXNzYXJ5LiBDaGFuZ2Ugbm90aWZpY2F0aW9uIHdpbGwgYmUgZmlyZWQgaWYgdGhlCi0gKiBvYmplY3QgaXMgY2hhbmdlZC4KLSAqIAotICogVGhpcyBjYW4gYmUgdXNlZCBmb3IgU3RyaW5ncyAtIHRoZSBkaXNwbGF5IHN0cmluZwotICogd2lsbCBzaW1wbHkgYmUgdGhlIFN0cmluZyBpdHNlbGYuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVEaXNwbGF5YWJsZQotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgRGlzcGxheWFibGUKLXsKLQkvKiogVGhlIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQgdG8gYSBEaXNwbGF5YWJsZS4gKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IG9iamVjdDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgZGlzcGxheWFibGUgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShib29sZWFuIGIpIHsKLQkJdGhpcyhCb29sZWFuLnZhbHVlT2YoYikpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShjaGFyIGMpIHsKLQkJdGhpcyhDaGFyYWN0ZXIudmFsdWVPZihjKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKGJ5dGUgYikgewotCQl0aGlzKEJ5dGUudmFsdWVPZihiKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKHNob3J0IHMpIHsKLQkJdGhpcyhTaG9ydC52YWx1ZU9mKHMpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoaW50IGkpIHsKLQkJdGhpcyhJbnRlZ2VyLnZhbHVlT2YoaSkpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShsb25nIGwpIHsKLQkJdGhpcyhMb25nLnZhbHVlT2YobCkpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShmbG9hdCBmKSB7Ci0JCXRoaXMoRmxvYXQudmFsdWVPZihmKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKGRvdWJsZSBkKSB7Ci0JCXRoaXMoRG91YmxlLnZhbHVlT2YoZCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEaXNwbGF5YWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBJY29uIGljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgb2xkRGlzcGxheVN0cmluZyA9IHRoaXMuZGlzcGxheVN0cmluZygpOwotCQlJY29uIG9sZEljb24gPSB0aGlzLmljb24oKTsKLQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgb2xkRGlzcGxheVN0cmluZywgdGhpcy5kaXNwbGF5U3RyaW5nKCkpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSUNPTl9QUk9QRVJUWSwgb2xkSWNvbiwgdGhpcy5pY29uKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oKSB7Ci0JCXJldHVybiAoKEJvb2xlYW4pIHRoaXMub2JqZWN0KS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCb29sZWFuKGJvb2xlYW4gYikgewotCQl0aGlzLnNldE9iamVjdChCb29sZWFuLnZhbHVlT2YoYikpOwotCX0KLQotCXB1YmxpYyBjaGFyIGdldENoYXIoKSB7Ci0JCXJldHVybiAoKENoYXJhY3RlcikgdGhpcy5vYmplY3QpLmNoYXJWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoYXIoY2hhciBjKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KENoYXJhY3Rlci52YWx1ZU9mKGMpKTsKLQl9Ci0KLQlwdWJsaWMgYnl0ZSBnZXRCeXRlKCkgewotCQlyZXR1cm4gKChCeXRlKSB0aGlzLm9iamVjdCkuYnl0ZVZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Qnl0ZShieXRlIGIpIHsKLQkJdGhpcy5zZXRPYmplY3QoQnl0ZS52YWx1ZU9mKGIpKTsKLQl9Ci0KLQlwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoKSB7Ci0JCXJldHVybiAoKFNob3J0KSB0aGlzLm9iamVjdCkuc2hvcnRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNob3J0KHNob3J0IHMpIHsKLQkJdGhpcy5zZXRPYmplY3QoU2hvcnQudmFsdWVPZihzKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRJbnQoKSB7Ci0JCXJldHVybiAoKEludGVnZXIpIHRoaXMub2JqZWN0KS5pbnRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEludChpbnQgaSkgewotCQl0aGlzLnNldE9iamVjdChJbnRlZ2VyLnZhbHVlT2YoaSkpOwotCX0KLQotCXB1YmxpYyBsb25nIGdldExvbmcoKSB7Ci0JCXJldHVybiAoKExvbmcpIHRoaXMub2JqZWN0KS5sb25nVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb25nKGxvbmcgbCkgewotCQl0aGlzLnNldE9iamVjdChMb25nLnZhbHVlT2YobCkpOwotCX0KLQotCXB1YmxpYyBmbG9hdCBnZXRGbG9hdCgpIHsKLQkJcmV0dXJuICgoRmxvYXQpIHRoaXMub2JqZWN0KS5mbG9hdFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmxvYXQoZmxvYXQgZikgewotCQl0aGlzLnNldE9iamVjdChGbG9hdC52YWx1ZU9mKGYpKTsKLQl9Ci0KLQlwdWJsaWMgZG91YmxlIGdldERvdWJsZSgpIHsKLQkJcmV0dXJuICgoRG91YmxlKSB0aGlzLm9iamVjdCkuZG91YmxlVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb3VibGUoZG91YmxlIGQpIHsKLQkJdGhpcy5zZXRPYmplY3QoRG91YmxlLnZhbHVlT2YoZCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZSBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMub2JqZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVMaXN0QnJvd3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NpbXBsZUxpc3RCcm93c2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MWM1NTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NpbXBsZUxpc3RCcm93c2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgTGlzdENob29zZXIuQnJvd3NlciB1c2VzIGEKLSAqIEpPcHRpb25QYW5lIHRvIHByb21wdCB0aGUgdXNlciBmb3IgdGhlIHNlbGVjdGlvbi4gU3ViY2xhc3NlcyAKLSAqIGNhbiBjaGFuZ2UgdGhlIGRpYWxvZydzIHRpdGxlLCBtZXNzYWdlLCBhbmQvb3IgaWNvbi4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUxpc3RCcm93c2VyCi0JaW1wbGVtZW50cyBMaXN0Q2hvb3Nlci5MaXN0QnJvd3NlciAKLXsKLQkvKiogRGVmYXVsdCBjb25zdHJ1Y3RvciAqLwotCXByb3RlY3RlZCBTaW1wbGVMaXN0QnJvd3NlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJvbXB0IHRoZSB1c2VyIHVzaW5nIGEgSk9wdGlvblBhbmUuCi0JICovCi0JcHVibGljIHZvaWQgYnJvd3NlKExpc3RDaG9vc2VyIGNob29zZXIpIHsKLQkJT2JqZWN0IHNlbGVjdGlvbiA9IAotCQkJSk9wdGlvblBhbmUuc2hvd0lucHV0RGlhbG9nKAotCQkJCWNob29zZXIsIAotCQkJCXRoaXMubWVzc2FnZShjaG9vc2VyKSwgCi0JCQkJdGhpcy50aXRsZShjaG9vc2VyKSwgCi0JCQkJdGhpcy5tZXNzYWdlVHlwZShjaG9vc2VyKSwgCi0JCQkJdGhpcy5pY29uKGNob29zZXIpLCAKLQkJCQl0aGlzLnNlbGVjdGlvblZhbHVlcyhjaG9vc2VyKSwgCi0JCQkJdGhpcy5pbml0aWFsU2VsZWN0aW9uVmFsdWUoY2hvb3NlcikKLQkJCSk7Ci0JCQotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCWNob29zZXIuZ2V0TW9kZWwoKS5zZXRTZWxlY3RlZEl0ZW0oc2VsZWN0aW9uKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IG1lc3NhZ2UoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IG1lc3NhZ2VUeXBlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIEpPcHRpb25QYW5lLlFVRVNUSU9OX01FU1NBR0U7Ci0JfQotCQotCXByb3RlY3RlZCBJY29uIGljb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdFtdIHNlbGVjdGlvblZhbHVlcyhKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydFRvQXJyYXkoY29tYm9Cb3guZ2V0TW9kZWwoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFNlbGVjdGlvblZhbHVlKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gY29tYm9Cb3guZ2V0TW9kZWwoKS5nZXRTZWxlY3RlZEl0ZW0oKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCB0aGUgbGlzdCBvZiBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBtb2RlbAotCSAqIGludG8gYW4gYXJyYXkuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGNvbnZlcnRUb0FycmF5KExpc3RNb2RlbCBtb2RlbCkgewotCQlpbnQgc2l6ZSA9IG1vZGVsLmdldFNpemUoKTsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IG1vZGVsLmdldEVsZW1lbnRBdChpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVMaXN0Q2VsbFJlbmRlcmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdENlbGxSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmE2MDlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVMaXN0Q2VsbFJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi0vKioKLSAqIFRoaXMgcmVuZGVyZXIgc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZSBhcyB0aGUgRGVmYXVsdExpc3RDZWxsUmVuZGVyZXI7Ci0gKiBidXQgaXQgc2xpZ2h0bHkgcmVmYWN0b3JzIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgaWNvbiBhbmQgdGV4dCBvZiB0aGUgbGlzdAotICogY2VsbCBzbyB0aGF0IHN1YmNsYXNzZXMgY2FuIGVhc2lseSBvdmVycmlkZSB0aGUgbWV0aG9kcyB0aGF0IGJ1aWxkCi0gKiB0aGUgaWNvbiBhbmQgdGV4dC4KLSAqIAotICogSW4gbW9zdCBjYXNlcywgeW91IG5lZWQgb25seSBvdmVycmlkZToKLSAqICAgICAjYnVpbGRJY29uKE9iamVjdCB2YWx1ZSkKLSAqICAgICAjYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIKLQlleHRlbmRzIERlZmF1bHRMaXN0Q2VsbFJlbmRlcmVyCi17Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzaW1wbGUgcmVuZGVyZXIuCi0JICovCi0JcHVibGljIFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCS8vIHN1YnN0aXR1dGUgbnVsbCBmb3IgdGhlIGNlbGwgdmFsdWUgc28gbm90aGluZyBpcyBkcmF3biBpbml0aWFsbHkuLi4KLQkJc3VwZXIuZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChsaXN0LCBudWxsLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKTsKLQkJdGhpcy5zZXRPcGFxdWUodHJ1ZSk7Ci0KLQkJLy8gLi4udGhlbiBzZXQgdGhlIGljb24gYW5kIHRleHQgbWFudWFsbHkKLQkJdGhpcy5zZXRJY29uKHRoaXMuYnVpbGRJY29uKGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKSk7Ci0JCXRoaXMuc2V0VGV4dCh0aGlzLmJ1aWxkVGV4dChsaXN0LCB2YWx1ZSwgaW5kZXgsIGlzU2VsZWN0ZWQsIGNlbGxIYXNGb2N1cykpOwotCi0JCXRoaXMuc2V0VG9vbFRpcFRleHQodGhpcy5idWlsZFRvb2xUaXBUZXh0KGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKSk7Ci0KLQkJLy8gdGhlIGNvbnRleHQgd2lsbCBiZSBpbml0aWFsaXplZCBvbmx5IGlmIGEgcmVhZGVyIGlzIHJ1bm5pbmcKLQkJaWYgKHRoaXMuYWNjZXNzaWJsZUNvbnRleHQgIT0gbnVsbCkgewotCQkJdGhpcy5hY2Nlc3NpYmxlQ29udGV4dC5zZXRBY2Nlc3NpYmxlTmFtZSh0aGlzLmJ1aWxkQWNjZXNzaWJsZU5hbWUobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpKTsKLQkJfQotCi0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaWNvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKLQkgKiB2YWx1ZSBhbmQgb3RoZXIgc2V0dGluZ3MuIChFdmVuIG1vcmUgc2V0dGluZ3MgYXJlCi0JICogYWNjZXNzaWJsZSB2aWEgaW5oZXJpdGVkIGdldHRlcnM6IGhhc0ZvY3VzLCBpc0VuYWJsZWQsIGV0Yy4pCi0JICovCi0JcHJvdGVjdGVkIEljb24gYnVpbGRJY29uKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKTGlzdCBsaXN0LCBPYmplY3QgdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgaW5kZXgsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGlzU2VsZWN0ZWQsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGNlbGxIYXNGb2N1cykgewotCQlyZXR1cm4gdGhpcy5idWlsZEljb24odmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaWNvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKLQkgKiB2YWx1ZS4gVGhlIGRlZmF1bHQgaXMgdG8gZGlzcGxheSBubyBpY29uIGF0IGFsbCB1bmxlc3MgdGhlCi0JICogdmFsdWUgaXRzZWxmIGlzIGFuIGljb24uCi0JICovCi0JcHJvdGVjdGVkIEljb24gYnVpbGRJY29uKE9iamVjdCB2YWx1ZSkgewotCQkvLyByZXBsaWNhdGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IKLQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIEljb24pID8gKEljb24pIHZhbHVlIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjZWxsCi0JICogdmFsdWUgYW5kIG90aGVyIHNldHRpbmdzLiAoRXZlbiBtb3JlIHNldHRpbmdzIGFyZQotCSAqIGFjY2Vzc2libGUgdmlhIGluaGVyaXRlZCBnZXR0ZXJzOiBoYXNGb2N1cywgaXNFbmFibGVkLCBldGMuKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKTGlzdCBsaXN0LCBPYmplY3QgdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgaW5kZXgsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGlzU2VsZWN0ZWQsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGNlbGxIYXNGb2N1cykgewotCQlyZXR1cm4gdGhpcy5idWlsZFRleHQodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKLQkgKiB2YWx1ZS4gVGhlIGRlZmF1bHQgaXMgdG8gZGlzcGxheSB0aGUgb2JqZWN0J3MgZGVmYXVsdCBzdHJpbmcKLQkgKiByZXByZXNlbnRhdGlvbiAoYXMgcmV0dXJuZWQgYnkgI3RvU3RyaW5nKCkpOyB1bmxlc3MgdGhlCi0JICogdmFsdWUgaXRzZWxmIGlzIGFuIGljb24sIGluIHdoaWNoIGNhc2Ugbm8gdGV4dCBpcyBkaXNwbGF5ZWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBJY29uKSA/ICIiIDogKCh2YWx1ZSA9PSBudWxsKSA/ICIiIDogdmFsdWUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCBkaXNwbGF5ZWQgd2hlbiB0aGUgY3Vyc29yIGxpbmdlcnMgb3ZlciB0aGUgc3BlY2lmaWVkIGNlbGwuCi0JICogKEV2ZW4gbW9yZSBzZXR0aW5ncyBhcmUgYWNjZXNzaWJsZSB2aWEgaW5oZXJpdGVkIGdldHRlcnM6IGhhc0ZvY3VzLCBpc0VuYWJsZWQsIGV0Yy4pCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRvb2xUaXBUZXh0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKTGlzdCBsaXN0LCBPYmplY3QgdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgaW5kZXgsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGlzU2VsZWN0ZWQsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGNlbGxIYXNGb2N1cykgewotCQlyZXR1cm4gdGhpcy5idWlsZFRvb2xUaXBUZXh0KHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgZGlzcGxheWVkIHdoZW4gdGhlIGN1cnNvciBsaW5nZXJzIG92ZXIgdGhlIHNwZWNpZmllZCBjZWxsLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUb29sVGlwVGV4dChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWNjZXNzaWJsZSBuYW1lIHRvIGJlIGdpdmVuIHRvIHRoZSBjb21wb25lbnQgdXNlZCB0byByZW5kZXIKLQkgKiB0aGUgZ2l2ZW4gdmFsdWUgYW5kIG90aGVyIHNldHRpbmdzLiAoRXZlbiBtb3JlIHNldHRpbmdzIGFyZSBhY2Nlc3NpYmxlIHZpYQotCSAqIGluaGVyaXRlZCBnZXR0ZXJzOiBoYXNGb2N1cywgaXNFbmFibGVkLCBldGMuKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRBY2Nlc3NpYmxlTmFtZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGluZGV4LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBpc1NlbGVjdGVkLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRBY2Nlc3NpYmxlTmFtZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY2Nlc3NpYmxlIG5hbWUgdG8gYmUgZ2l2ZW4gdG8gdGhlIGNvbXBvbmVudCB1c2VkIHRvIHJlbmRlcgotCSAqIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQWNjZXNzaWJsZU5hbWUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TcGlubmVyVGFibGVDZWxsUmVuZGVyZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TcGlubmVyVGFibGVDZWxsUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNkNWQzOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNwaW5uZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBNYWtlIHRoZSBjZWxsIGxvb2sgbGlrZSBhIHNwaW5uZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIgaW1wbGVtZW50cyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLlJlbmRlcmVyIHsKLQotCS8qKiB0aGUgY29tcG9uZW50IHVzZWQgdG8gcGFpbnQgdGhlIGNlbGwgKi8KLQlwcm90ZWN0ZWQgSlNwaW5uZXIgc3Bpbm5lcjsKLQkKLQkvKiogdGhlIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIG9uIGFuIGltbWVkaWF0ZSBlZGl0ICovCi0JcHJvdGVjdGVkIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuSW1tZWRpYXRlRWRpdExpc3RlbmVyIGltbWVkaWF0ZUVkaXRMaXN0ZW5lcjsKLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHRoYXQgdXNlcyB0aGUgZGVmYXVsdAotCSAqIHNwaW5uZXIgbW9kZWwsIHdoaWNoIGlzIGEgIm51bWJlciIgbW9kZWwuCi0JICovCi0JcHVibGljIFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlcigpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZAotCSAqIHNwaW5uZXIgbW9kZWwsIHdoaWNoIHdpbGwgZGV0ZXJtaW5lIGhvdyB0aGUgdmFsdWVzIGFyZSBkaXNwbGF5ZWQuCi0JICovCi0JcHVibGljIFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlcihTcGlubmVyTW9kZWwgbW9kZWwpIHsKLQkJdGhpcygpOwotCQl0aGlzLnNldE1vZGVsKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLnNwaW5uZXIgPSB0aGlzLmJ1aWxkU3Bpbm5lcigpOwotCX0KLQotCXByb3RlY3RlZCBKU3Bpbm5lciBidWlsZFNwaW5uZXIoKSB7Ci0JCUpTcGlubmVyIHMgPSBuZXcgSlNwaW5uZXIoKTsKLQkJcy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXJldHVybiBzOwotCX0KLQkKLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCWlmIChTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIudGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIudGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIuaW1tZWRpYXRlRWRpdCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVDZWxsUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIENvbXBvbmVudCBnZXRUYWJsZUNlbGxSZW5kZXJlckNvbXBvbmVudChKVGFibGUgdGFibGUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQl0aGlzLnNwaW5uZXIuc2V0Q29tcG9uZW50T3JpZW50YXRpb24odGFibGUuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKSk7Ci0JCXRoaXMuc3Bpbm5lci5zZXRGb250KHRhYmxlLmdldEZvbnQoKSk7Ci0JCXRoaXMuc3Bpbm5lci5zZXRFbmFibGVkKHRhYmxlLmlzRW5hYmxlZCgpKTsKLQotCQlKQ29tcG9uZW50IGVkaXRvciA9IHRoaXMuZWRpdG9yKCk7Ci0JCWVkaXRvci5zZXRGb3JlZ3JvdW5kKHRoaXMuZm9yZWdyb3VuZENvbG9yKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCQllZGl0b3Iuc2V0QmFja2dyb3VuZCh0aGlzLmJhY2tncm91bmRDb2xvcih0YWJsZSwgdmFsdWUsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQkJdGhpcy5zcGlubmVyLnNldEJvcmRlcih0aGlzLmJvcmRlcih0YWJsZSwgdmFsdWUsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQotCQl0aGlzLnNldFZhbHVlKHZhbHVlKTsKLQkJcmV0dXJuIHRoaXMuc3Bpbm5lcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBmb3JlZ3JvdW5kIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2xvciBmb3JlZ3JvdW5kQ29sb3IoSlRhYmxlIHRhYmxlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKGhhc0ZvY3VzICYmIHRhYmxlLmlzQ2VsbEVkaXRhYmxlKHJvdywgY29sdW1uKSkgewotCQkJCXJldHVybiBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlLmZvY3VzQ2VsbEZvcmVncm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkZvcmVncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gdGFibGUuZ2V0Rm9yZWdyb3VuZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJhY2tncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmRDb2xvcihKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuZm9jdXNDZWxsQmFja2dyb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gdGFibGUuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpOwotCQl9Ci0JCXJldHVybiB0YWJsZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYm9yZGVyLgotCSAqLwotCXByb3RlY3RlZCBCb3JkZXIgYm9yZGVyKEpUYWJsZSB0YWJsZSwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCByb3csIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgY29sdW1uKSB7Ci0JCWlmIChoYXNGb2N1cykgewotCQkJcmV0dXJuIFVJTWFuYWdlci5nZXRCb3JkZXIoIlRhYmxlLmZvY3VzQ2VsbEhpZ2hsaWdodEJvcmRlciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlyZXR1cm4gQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKHRhYmxlLmdldFNlbGVjdGlvbkJhY2tncm91bmQoKSwgMSk7Ci0JCX0KLQkJcmV0dXJuIEJvcmRlckZhY3RvcnkuY3JlYXRlTGluZUJvcmRlcih0YWJsZS5nZXRCYWNrZ3JvdW5kKCksIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWRpdG9yIGNvbXBvbmVudCB3aG9zZSBjb2xvcnMgc2hvdWxkIGJlIHNldAotCSAqIGJ5IHRoZSByZW5kZXJlci4KLQkgKi8KLQlwcm90ZWN0ZWQgSkNvbXBvbmVudCBlZGl0b3IoKSB7Ci0JCUpDb21wb25lbnQgZWRpdG9yID0gdGhpcy5zcGlubmVyLmdldEVkaXRvcigpOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSlNwaW5uZXIuRGVmYXVsdEVkaXRvcikgewotCQkJLy8gdHlwaWNhbGx5LCB0aGUgZWRpdG9yIHdpbGwgYmUgdGhlIGRlZmF1bHQgb3Igb25lIG9mIGl0cyBzdWJjbGFzc2VzLi4uCi0JCQllZGl0b3IgPSAoKEpTcGlubmVyLkRlZmF1bHRFZGl0b3IpIGVkaXRvcikuZ2V0VGV4dEZpZWxkKCk7Ci0JCX0KLQkJcmV0dXJuIGVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNwaW5uZXIncyB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQkvLyBDUiMzOTk5MzE4IC0gVGhpcyBudWxsIGNoZWNrIG5lZWRzIHRvIGJlIHJlbW92ZWQgb25jZSBKREsgYnVnIGlzIGZpeGVkCi0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl2YWx1ZSA9IEludGVnZXIudmFsdWVPZigwKTsKLQkJfQotCQl0aGlzLnNwaW5uZXIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLlJlbmRlcmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwaW5uZXIuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW1tZWRpYXRlRWRpdExpc3RlbmVyKFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuSW1tZWRpYXRlRWRpdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IHRoZSBzcGlubmVyJ3MgbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoU3Bpbm5lck1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMuc3Bpbm5lci5zZXRNb2RlbChtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZW5kZXJlcidzIHByZWZlcnJlZCBoZWlnaHQuIFRoaXMgYWxsb3dzIHlvdQotCSAqIHRvIHNldCB0aGUgcm93IGhlaWdodCB0byBzb21ldGhpbmcgdGhlIHNwaW5uZXIgd2lsbCBsb29rIGdvb2QgaW4uLi4uCi0JICovCi0JcHVibGljIGludCBwcmVmZXJyZWRIZWlnaHQoKSB7Ci0JCS8vIGFkZCBpbiBzcGFjZSBmb3IgdGhlIGJvcmRlciB0b3AgYW5kIGJvdHRvbQotCQlyZXR1cm4gKGludCkgdGhpcy5zcGlubmVyLmdldFByZWZlcnJlZFNpemUoKS5nZXRIZWlnaHQoKSArIDI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvVGFibGVDZWxsRWRpdG9yQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1RhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1YjRhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvVGFibGVDZWxsRWRpdG9yQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdENlbGxFZGl0b3I7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ2VsbEVkaXRvcjsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZUNlbGxSZW5kZXJlcjsKLQotLyoqCi0gKiBBIHRhYmxlIGNlbGwgZWRpdG9yIHRoYXQgd3JhcHMgYSB0YWJsZSBjZWxsIHJlbmRlcmVyLgotICovCi1wdWJsaWMgY2xhc3MgVGFibGVDZWxsRWRpdG9yQWRhcHRlciBleHRlbmRzIEFic3RyYWN0Q2VsbEVkaXRvciBpbXBsZW1lbnRzIFRhYmxlQ2VsbEVkaXRvciB7Ci0KLQkvKiogZGVsZWdhdGUgdG8gYSByZW5kZXJlciAqLwotCXByaXZhdGUgUmVuZGVyZXIgcmVuZGVyZXI7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQotCXByaXZhdGUgVGFibGVDZWxsRWRpdG9yQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCBlZGl0b3IgdGhhdCBiZWhhdmVzIGxpa2UgdGhlIHNwZWNpZmllZCByZW5kZXJlci4KLQkgKi8KLQlwdWJsaWMgVGFibGVDZWxsRWRpdG9yQWRhcHRlcihSZW5kZXJlciByZW5kZXJlcikgewotCQl0aGlzKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShyZW5kZXJlcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUmVuZGVyZXIgcikgewotCQl0aGlzLnJlbmRlcmVyID0gcjsKLQkJci5zZXRJbW1lZGlhdGVFZGl0TGlzdGVuZXIodGhpcy5idWlsZEltbWVkaWF0ZUVkaXRMaXN0ZW5lcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbW1lZGlhdGVFZGl0TGlzdGVuZXIgYnVpbGRJbW1lZGlhdGVFZGl0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSW1tZWRpYXRlRWRpdExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaW1tZWRpYXRlRWRpdCgpIHsKLQkJCQlUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLnRoaXMuc3RvcENlbGxFZGl0aW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogQ2VsbEVkaXRvciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIE9iamVjdCBnZXRDZWxsRWRpdG9yVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlbmRlcmVyLmdldFZhbHVlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsRWRpdG9yQ29tcG9uZW50KEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLnJlbmRlcmVyLmdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIHRydWUsIHJvdywgY29sdW1uKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBNZW1iZXIgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgbWV0aG9kcyB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSByZW5kZXJlcgotCSAqIHRoYXQgY2FuIGJlIHdyYXBwZWQgYnkgYSBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXIgZXh0ZW5kcyBUYWJsZUNlbGxSZW5kZXJlciB7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSByZW5kZXJlci4KLQkJICovCi0JCU9iamVjdCBnZXRWYWx1ZSgpOwotCQkKLQkJLyoqCi0JCSAqIFNldCB0aGUgaW1tZWRpYXRlIGVkaXQgbGlzdGVuZXIKLQkJICovCi0JCXZvaWQgc2V0SW1tZWRpYXRlRWRpdExpc3RlbmVyKEltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JfQotCQotCQotCXB1YmxpYyBpbnRlcmZhY2UgSW1tZWRpYXRlRWRpdExpc3RlbmVyIHsKLQkJCi0JCS8qKgotCQkgKiBDYWxsZWQgd2hlbiB0aGUgcmVuZGVyZXIgZG9lcyBhbiAiaW1tZWRpYXRlIGVkaXQiCi0JCSAqLwotCQl2b2lkIGltbWVkaWF0ZUVkaXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9Bc3luY2hyb25vdXNTeW5jaHJvbml6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0FzeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzlhMTFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0FzeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVyczsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLQotLyoqCi0gKiBUaGlzIHN5bmNocm9uaXplciB3aWxsIHBlcmZvcm0gc3luY2hyb25pemF0aW9ucyBpbiBhIHNlcGFyYXRlIHRocmVhZCwKLSAqIGFsbG93aW5nIGNhbGxzIHRvIHtAbGluayBTeW5jaHJvbml6ZXIjc3luY2hyb25pemUoKX0gdG8gcmV0dXJuIGltbWVkaWF0ZWx5LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBUaGUgY2xpZW50LXN1cHBsaWVkIGNvbW1hbmQgc2hvdWxkIGhhbmRsZSBhbnkgZXhjZXB0aW9ucwotICogYXBwcm9wcmlhdGVseSAoZS5nLiBsb2cgdGhlIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIGdyYWNlZnVsbHkgc28gdGhlIHRocmVhZAotICogY2FuIGNvbnRpbnVlIHRoZSBzeW5jaHJvbml6YXRpb24gcHJvY2VzcykuCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIKLQlpbXBsZW1lbnRzIFN5bmNocm9uaXplcgotewotCS8qKgotCSAqIFRoaXMgZmxhZyBpcyBzaGFyZWQgd2l0aCB0aGUgc3luY2hyb25pemF0aW9uL2NvbnN1bWVyIHRocmVhZC4gU2V0dGluZyBpdCB0byB0cnVlCi0JICogd2lsbCB0cmlnZ2VyIHRoZSBzeW5jaHJvbml6YXRpb24gdG8gYmVnaW4gb3IsIGlmIHRoZSBzeW5jaHJvbml6YXRpb24gaXMKLQkgKiBjdXJyZW50bHkgZXhlY3V0aW5nLCB0byBleGVjdXRlIGFnYWluLCBvbmNlIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBpcwotCSAqIGNvbXBsZXRlLgotCSAqLwotCWZpbmFsIFN5bmNocm9uaXplZEJvb2xlYW4gc3luY2hyb25pemVGbGFnID0gbmV3IFN5bmNocm9uaXplZEJvb2xlYW4oZmFsc2UpOwotCi0JLyoqCi0JICogTW9zdCBvZiB0aGUgdGhyZWFkLXJlbGF0ZWQgYmVoYXZpb3IgaXMgZGVsZWdhdGVkIHRvIHRoaXMgY29vcmRpbmF0b3IuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yIGNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3I7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3luY2hyb25vdXMgc3luY2hyb25pemVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgdG8KLQkgKiBwZXJmb3JtIHRoZSBzeW5jaHJvbml6YXRpb24uCi0JICogVXNlIHNpbXBsZSBKREsgdGhyZWFkKHMpIGZvciB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZChzKS4KLQkgKiBBbGxvdyB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZChzKSB0byBiZSBhc3NpZ25lZAotCSAqIEpESy1nZW5lcmF0ZWQgbmFtZXMuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c1N5bmNocm9uaXplcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJdGhpcyhjb21tYW5kLCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIHRvCi0JICogcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHRocmVhZCBmYWN0b3J5IHRvIGNvbnN0cnVjdCB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZChzKS4KLQkgKiBBbGxvdyB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZChzKSB0byBiZSBhc3NpZ25lZAotCSAqIEpESy1nZW5lcmF0ZWQgbmFtZXMuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c1N5bmNocm9uaXplcihDb21tYW5kIGNvbW1hbmQsIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSkgewotCQl0aGlzKGNvbW1hbmQsIHRocmVhZEZhY3RvcnksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3luY2hyb25vdXMgc3luY2hyb25pemVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgdG8KLQkgKiBwZXJmb3JtIHRoZSBzeW5jaHJvbml6YXRpb24uIEFzc2lnbiB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZChzKSB0aGUgc3BlY2lmaWVkCi0JICogbmFtZS4KLQkgKiBVc2Ugc2ltcGxlIEpESyB0aHJlYWQocykgZm9yIHRoZSBzeW5jaHJvbml6YXRpb24gdGhyZWFkKHMpLgotCSAqLwotCXB1YmxpYyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIoQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgdGhyZWFkTmFtZSkgewotCQl0aGlzKGNvbW1hbmQsIG51bGwsIHRocmVhZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3luY2hyb25vdXMgc3luY2hyb25pemVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgdG8KLQkgKiBwZXJmb3JtIHRoZSBzeW5jaHJvbml6YXRpb24uCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgdGhyZWFkIGZhY3RvcnkgdG8gY29uc3RydWN0IHRoZSBzeW5jaHJvbml6YXRpb24gdGhyZWFkKHMpLgotCSAqIEFzc2lnbiB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZChzKSB0aGUgc3BlY2lmaWVkCi0JICogbmFtZS4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzU3luY2hyb25pemVyKENvbW1hbmQgY29tbWFuZCwgVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5LCBTdHJpbmcgdGhyZWFkTmFtZSkgewotCQlzdXBlcigpOwotCQlpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IgPSBuZXcgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcih0aGlzLmJ1aWxkQ29uc3VtZXIoY29tbWFuZCksIHRocmVhZEZhY3RvcnksIHRocmVhZE5hbWUpOwotCX0KLQotCUNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IuQ29uc3VtZXIgYnVpbGRDb25zdW1lcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIG5ldyBDb25zdW1lcihjb21tYW5kKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3luY2hyb25pemVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCBzdGFydCB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZCwgYnV0IHBvc3Rwb25lIHRoZSBmaXJzdAotCSAqIHN5bmNocm9uaXphdGlvbiB1bnRpbCByZXF1ZXN0ZWQsIGkuZS4gdmlhIGEgY2FsbCB0bwotCSAqIHtAbGluayAjc3luY2hyb25pemUoKX0uCi0JICogPHA+Ci0JICogTm90ZTogV2UgZG9uJ3QgY2xlYXIgdGhlICJzeW5jaHJvbml6ZSIgZmxhZyBoZXJlOyBzbyBpZiB0aGUgZmxhZyBoYXMKLQkgKiBiZWVuIHNldCA8ZW0+YmVmb3JlPC9lbT4gZ2V0dGluZyBoZXJlLCB0aGUgZmlyc3Qgc3luY2hyb25pemF0aW9uIHdpbGwKLQkgKiBzdGFydCBwcm9tcHRseSAoYWxiZWl0LCBhc3luY2hyb25vdXNseSkuCi0JICogVGhlICJzeW5jaHJvbml6ZSIgZmxhZyB3aWxsIGJlIHNldCBpZjo8dWw+Ci0JICogPGxpPntAbGluayAjc3luY2hyb25pemUoKX0gd2FzIGNhbGxlZCBhZnRlciB0aGUgc3luY2hyb25pemVyIHdhcwotCSAqICAgICBjb25zdHJ1Y3RlZCBidXQgYmVmb3JlIHtAbGluayAjc3RhcnQoKX0gd2FzIGNhbGxlZDsgb3IKLQkgKiA8bGk+e0BsaW5rICNzeW5jaHJvbml6ZSgpfSB3YXMgY2FsbGVkIGFmdGVyIHtAbGluayAjc3RvcCgpfSB3YXMgY2FsbGVkCi0JICogICAgIGJ1dCBiZWZvcmUge0BsaW5rICNzdGFydCgpfSB3YXMgY2FsbGVkICh0byByZXN0YXJ0IHRoZSBzeW5jaHJvbml6ZXIpOyBvcgotCSAqIDxsaT57QGxpbmsgI3N0b3AoKX0gd2FzIGNhbGxlZCB3aGVuIHRoZXJlIHdhcyBhbiBvdXRzdGFuZGluZyByZXF1ZXN0Ci0JICogICAgIGZvciBhIHN5bmNocm9uaXphdGlvbiAoaS5lLiB0aGUgInN5bmNocm9uaXphdGlvbiIgZmxhZyB3YXMgc2V0IGF0Ci0JICogICAgIHRoZSB0aW1lIHtAbGluayAjc3RvcCgpfSB3YXMgY2FsbGVkKQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCXRoaXMuY29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5zdGFydCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgInN5bmNocm9uaXplIiBmbGFnIHNvIHRoZSBzeW5jaHJvbml6YXRpb24gdGhyZWFkIHdpbGwgZWl0aGVyPHVsPgotCSAqIDxsaT5pZiB0aGUgdGhyZWFkIGlzIHF1aWVzY2VkLCBzdGFydCBhIHN5bmNocm9uaXphdGlvbiBpbW1lZGlhdGVseSwgb3IKLQkgKiA8bGk+aWYgdGhlIHRocmVhZCBpcyBjdXJyZW50bHkgZXhlY3V0aW5nIGEgc3luY2hyb25pemF0aW9uLCBleGVjdXRlIGFub3RoZXIKLQkgKiAgICAgc3luY2hyb25pemF0aW9uIG9uY2UgdGhlIGN1cnJlbnQgc3luY2hyb25pemF0aW9uIGlzIGNvbXBsZXRlCi0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUZsYWcuc2V0VHJ1ZSgpOwotCX0KLQotCS8qKgotCSAqIEludGVycnVwdCB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZCBzbyB0aGF0IGl0IHN0b3BzIGV4ZWN1dGluZyBhdCB0aGUKLQkgKiBlbmQgb2YgdGhlIGN1cnJlbnQgc3luY2hyb25pemF0aW9uLiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbAotCSAqIHRoZSBzeW5jaHJvbml6YXRpb24gdGhyZWFkIGlzIGZpbmlzaGVkIGV4ZWN1dGluZy4gSWYgYW55IHVuY2F1Z2h0Ci0JICogZXhjZXB0aW9ucyB3ZXJlIHRocm93biB3aGlsZSB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZCB3YXMgZXhlY3V0aW5nLAotCSAqIHdyYXAgdGhlbSBpbiBhIGNvbXBvc2l0ZSBleGNlcHRpb24gYW5kIHRocm93IHRoZSBjb21wb3NpdGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCXRoaXMuY29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5zdG9wKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN1bWVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IuQ29uc3VtZXJ9Ci0JICogd2lsbCBleGVjdXRlIHRoZSBjbGllbnQtc3VwcGxpZWQgInN5bmNocm9uaXplIiBjb21tYW5kLgotCSAqIEl0IHdpbGwgd2FpdCB1bnRpbCB0aGUgc2hhcmVkICJzeW5jaHJvbml6ZSIgZmxhZyBpcyBzZXQgdG8gZXhlY3V0ZSB0aGUKLQkgKiBjb21tYW5kLiBPbmNlIHRoZSBjb21hbmQgaXMgZXhlY3V0ZWQsIHRoZSB0aHJlYWQgd2lsbCBxdWllc2NlIHVudGlsCi0JICogdGhlIGZsYWcgaXMgc2V0IGFnYWluLiBJZiB0aGUgZmxhZyB3YXMgc2V0IGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIHRoZQotCSAqIGNvbW1hbmQgKGVpdGhlciByZWN1cnNpdmVseSBieSB0aGUgY29tbWFuZCBpdHNlbGYgb3IgYnkgYW5vdGhlciB0aHJlYWQpLAotCSAqIHRoZSBjb21tYW5kIHdpbGwgYmUgcmUtZXhlY3V0ZWQgaW1tZWRpYXRlbHkuIFN0b3AgdGhlIHRocmVhZCBieSBjYWxsaW5nCi0JICoge0BsaW5rIFRocmVhZCNpbnRlcnJ1cHQoKX0uCi0JICovCi0JY2xhc3MgQ29uc3VtZXIKLQkJaW1wbGVtZW50cyBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yLkNvbnN1bWVyCi0JewotCQkvKioKLQkJICogVGhlIGNsaWVudC1zdXBwbGllZCBjb21tYW5kIHRoYXQgZXhlY3V0ZXMgb24gdGhlCi0JCSAqIHN5bmNocm9uaXphdGlvbi9jb25zdW1lciB0aHJlYWQuCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIENvbW1hbmQgY29tbWFuZDsKLQotCQlDb25zdW1lcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFdhaXQgdW50aWwgdGhlICJzeW5jaHJvbml6ZSIgZmxhZyBpcyBzZXQsCi0JCSAqIHRoZW4gY2xlYXIgaXQgYW5kIGFsbG93IHRoZSAic3luY2hyb25pemUiIGNvbW1hbmQgdG8gZXhlY3V0ZS4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHdhaXRGb3JQcm9kdWNlcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQlBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIudGhpcy5zeW5jaHJvbml6ZUZsYWcud2FpdFRvU2V0RmFsc2UoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBFeGVjdXRlIHRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aGlzLmNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0NhbGxiYWNrQXN5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9DYWxsYmFja0FzeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzMwYTMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0NhbGxiYWNrQXN5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db25zdW1lclRocmVhZENvb3JkaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLQotLyoqCi0gKiBFeHRlbmQgdGhlIGFzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIgdG8gbm90aWZ5IGxpc3RlbmVycwotICogd2hlbiBhIHN5bmNocm9uaXphdGlvbiAiY3ljbGUiIGlzIGNvbXBsZXRlOyBpLmUuIHRoZSBzeW5jaHJvbml6YXRpb24gaGFzLAotICogZm9yIHRoZSBtb21lbnQsIGhhbmRsZWQgZXZlcnkgb3V0c3RhbmRpbmcgInN5bmNocm9uaXplIiByZXF1ZXN0IGFuZCBxdWllc2NlZC4KLSAqIFRoaXMgbm90aWZpY2F0aW9uIGlzIDxlbT5ub3Q8L2VtPiBndWFyYW50ZWVkIHRvIG9jY3VyIHdpdGggPGVtPmV2ZXJ5PC9lbT4KLSAqIHN5bmNocm9uaXphdGlvbiAiY3ljbGUiOyBzaW5jZSBvdGhlciwgdW5yZWxhdGVkLCBzeW5jaHJvbml6YXRpb25zIGNhbiBiZQotICogdHJpZ2dlcmVkIGNvbmN1cnJlbnRseS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gTGlzdGVuZXJzIHNob3VsZCBoYW5kbGUgYW55IGV4Y2VwdGlvbnMKLSAqIGFwcHJvcHJpYXRlbHkgKGUuZy4gbG9nIHRoZSBleGNlcHRpb24gYW5kIHJldHVybiBncmFjZWZ1bGx5IHNvIHRoZSB0aHJlYWQKLSAqIGNhbiBjb250aW51ZSB0aGUgc3luY2hyb25pemF0aW9uIHByb2Nlc3MpLgotICovCi1wdWJsaWMgY2xhc3MgQ2FsbGJhY2tBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIKLQlleHRlbmRzIEFzeW5jaHJvbm91c1N5bmNocm9uaXplcgotCWltcGxlbWVudHMgQ2FsbGJhY2tTeW5jaHJvbml6ZXIKLXsKLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjYWxsYmFjayBhc3luY2hyb25vdXMgc3luY2hyb25pemVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkCi0JICogY29tbWFuZCB0byBwZXJmb3JtIHRoZSBzeW5jaHJvbml6YXRpb24uIEFsbG93IHRoZSBzeW5jaHJvbml6YXRpb24gdGhyZWFkKHMpCi0JICogdG8gYmUgYXNzaWduZWQgSkRLLWdlbmVyYXRlZCBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgQ2FsbGJhY2tBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKGNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNhbGxiYWNrIGFzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQKLQkgKiBjb21tYW5kIHRvIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4gQXNzaWduIHRoZSBzeW5jaHJvbml6YXRpb24gdGhyZWFkKHMpCi0JICogdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqLwotCXB1YmxpYyBDYWxsYmFja0FzeW5jaHJvbm91c1N5bmNocm9uaXplcihDb21tYW5kIGNvbW1hbmQsIFN0cmluZyB0aHJlYWROYW1lKSB7Ci0JCXN1cGVyKGNvbW1hbmQsIHRocmVhZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgY29uc3VtZXIgdGhhdCB3aWxsIGxldCB1cyBrbm93IHdoZW4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMKLQkgKiBxdWllc2NlZC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlDb25zdW1lclRocmVhZENvb3JkaW5hdG9yLkNvbnN1bWVyIGJ1aWxkQ29uc3VtZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBuZXcgQ2FsbGJhY2tDb25zdW1lcihjb21tYW5kKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ2FsbGJhY2tTeW5jaHJvbml6ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBvdXIgbGlzdGVuZXJzLgotCSAqLwotCXZvaWQgc3luY2hyb25pemF0aW9uUXVpZXNjZWQoKSB7Ci0JCWZvciAoTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJbGlzdGVuZXIuc3luY2hyb25pemF0aW9uUXVpZXNjZWQodGhpcyk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemF0aW9uIHRocmVhZCBydW5uYWJsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQge0BsaW5rIEFzeW5jaHJvbm91c1N5bmNocm9uaXplci5Db25zdW1lcn0KLQkgKiB0byBub3RpZnkgdGhlIHN5bmNocm9uaXplciB3aGVuIHRoZSBzeW5jaHJvbml6YXRpb24gaGFzIHF1aWVzY2VkCi0JICogKGkuZS4gdGhlIGNvbW1hbmQgaGFzIGZpbmlzaGVkIGV4ZWN1dGluZyBhbmQgdGhlcmUgYXJlIG5vIGZ1cnRoZXIKLQkgKiByZXF1ZXN0cyBmb3Igc3luY2hyb25pemF0aW9uKS4KLQkgKiBCZWNhdXNlIHN5bmNocm9uaXphdGlvbiBpcyBhc3luY2hyb25vdXMsIG5vIG90aGVyIHRocmVhZCB3aWxsIGJlIGFibGUgdG8KLQkgKiBpbml0aWF0ZSBhbm90aGVyIHN5bmNocm9uaXphdGlvbiB1bnRpbCB0aGUgc3luY2hyb25pemVyJ3MgbGlzdGVuZXJzIGhhdmUgYmVlbgotCSAqIG5vdGlmaWVkLiBOb3RlIGFsc28sIHRoZSBzeW5jaHJvbml6ZXIncyBsaXN0ZW5lcnMgY2FuLCB0aGVtc2VsdmVzLAotCSAqIHRyaWdnZXIgYW5vdGhlciBzeW5jaHJvbml6YXRpb24gKGJ5IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgY2FsbGluZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplciNzeW5jaHJvbml6ZSgpKTsKLQkgKiBidXQgdGhpcyBzeW5jaHJvbml6YXRpb24gd2lsbCBub3Qgb2NjdXIgdW50aWwgPGVtPmFmdGVyPC9lbT4gYWxsIHRoZQotCSAqIGxpc3RlbmVycyBoYXZlIGJlZW4gbm90aWZpZWQuCi0JICovCi0JY2xhc3MgQ2FsbGJhY2tDb25zdW1lcgotCQlleHRlbmRzIENvbnN1bWVyCi0JewotCQlDYWxsYmFja0NvbnN1bWVyKENvbW1hbmQgY29tbWFuZCkgewotCQkJc3VwZXIoY29tbWFuZCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXN1cGVyLmV4ZWN1dGUoKTsKLQkJCS8vIGhtbW0gLSB3ZSB3aWxsIG5vdGlmeSBsaXN0ZW5lcnMgZXZlbiB3aGVuIHdlIG91ciB0aHJlYWQgaXMgImludGVycnVwdGVkIjsKLQkJCS8vIHRoYXQgc2VlbXMgb2suLi4gIH5ianYKLQkJCWlmIChDYWxsYmFja0FzeW5jaHJvbm91c1N5bmNocm9uaXplci50aGlzLnN5bmNocm9uaXplRmxhZy5pc0ZhbHNlKCkpIHsKLQkJCQlDYWxsYmFja0FzeW5jaHJvbm91c1N5bmNocm9uaXplci50aGlzLnN5bmNocm9uaXphdGlvblF1aWVzY2VkKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQ2FsbGJhY2tTeW5jaHJvbml6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0NhbGxiYWNrU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MWEwNmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQ2FsbGJhY2tTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVyczsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgU3luY2hyb25pemVyfSB0byBub3RpZnkgbGlzdGVuZXJzCi0gKiB3aGVuIGEgc3luY2hyb25pemF0aW9uICJjeWNsZSIgaXMgY29tcGxldGU7IGkuZS4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMsCi0gKiBmb3IgdGhlIG1vbWVudCwgcXVpZXNjZWQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FsbGJhY2tTeW5jaHJvbml6ZXIKLQlleHRlbmRzIFN5bmNocm9uaXplcgotewotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIHRoZSBzeW5jaHJvbml6ZXIgaGFzCi0JICogcXVpZXNjZWQuCi0JICogQHNlZSAjcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIpCi0JICovCi0Jdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBsaXN0ZW5lci4KLQkgKiBAc2VlICNhZGRMaXN0ZW5lcihMaXN0ZW5lcikKLQkgKi8KLQl2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgbGlzdGVuZXJzIHRvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIHRoZQotCSAqIHN5bmNocm9uaXplciBoYXMgcXVpZXNjZWQuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXN0ZW5lcgotCQlleHRlbmRzIEV2ZW50TGlzdGVuZXIKLQl7Ci0JCS8qKgotCQkgKiBUaGUgc3BlY2lmaWVkIHN5bmNocm9uaXplciBoYXMgcXVpZXNjZWQuCi0JCSAqLwotCQl2b2lkIHN5bmNocm9uaXphdGlvblF1aWVzY2VkKENhbGxiYWNrU3luY2hyb25pemVyIHN5bmNocm9uaXplcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9DYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9DYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMTAxNTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQ2FsbGJhY2tTeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci0KLS8qKgotICogRXh0ZW5kIHRoZSBzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIgdG8gbm90aWZ5IGxpc3RlbmVycwotICogd2hlbiBhIHN5bmNocm9uaXphdGlvbiAiY3ljbGUiIGlzIGNvbXBsZXRlOyBpLmUuIHRoZSBzeW5jaHJvbml6YXRpb24gaGFzLAotICogZm9yIHRoZSBtb21lbnQsIGhhbmRsZWQgZXZlcnkgInN5bmNocm9uaXplIiByZXF1ZXN0IGFuZCBxdWllc2NlZC4KLSAqIFRoaXMgbm90aWZpY2F0aW9uIGlzIDxlbT5ub3Q8L2VtPiBndWFyYW50ZWVkIHRvIG9jY3VyIHdpdGggPGVtPmV2ZXJ5PC9lbT4KLSAqIHN5bmNocm9uaXphdGlvbiAiY3ljbGUiOwotICogc2luY2Ugb3RoZXIsIHVucmVsYXRlZCwgc3luY2hyb25pemF0aW9ucyBjYW4gYmUgdHJpZ2dlcmVkIGNvbmN1cnJlbnRseS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gSWYgYW5vdGhlciBzeW5jaHJvbml6YXRpb24gaXMgaW5pdGlhdGVkIHdoaWxlIHdlIGFyZQotICogbm90aWZ5aW5nIHRoZSBzeW5jaHJvbml6ZXIncyBsaXN0ZW5lcnMgKGkuZS4gdGhlICdhZ2FpbicgZmxhZyBpcyBzZXQpLCBpdCB3aWxsIG5vdAotICogc3RhcnQgdW50aWwgYWxsIHRoZSBsaXN0ZW5lcnMgYXJlIG5vdGlmaWVkLgotICogTm90ZSBhbHNvLCB0aGUgc3luY2hyb25pemVyJ3MgbGlzdGVuZXJzIGNhbiwgdGhlbXNlbHZlcywKLSAqIHRyaWdnZXIgYW5vdGhlciBzeW5jaHJvbml6YXRpb24gKGJ5IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgY2FsbGluZwotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyI3N5bmNocm9uaXplKCkpOwotICogYnV0IHRoaXMgc3luY2hyb25pemF0aW9uIHdpbGwgbm90IG9jY3VyIHVudGlsIDxlbT5hZnRlcjwvZW0+IGFsbCB0aGUKLSAqIGxpc3RlbmVycyBoYXZlIGJlZW4gbm90aWZpZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyCi0JZXh0ZW5kcyBTeW5jaHJvbm91c1N5bmNocm9uaXplcgotCWltcGxlbWVudHMgQ2FsbGJhY2tTeW5jaHJvbml6ZXIKLXsKLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjYWxsYmFjayBzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQKLQkgKiBjb21tYW5kIHRvIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ2FsbGJhY2tTeW5jaHJvbm91c1N5bmNocm9uaXplcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENhbGxiYWNrU3luY2hyb25pemVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5saXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3luY2hyb25pemF0aW9uUXVpZXNjZWQoKSB7Ci0JCWZvciAoTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJbGlzdGVuZXIuc3luY2hyb25pemF0aW9uUXVpZXNjZWQodGhpcyk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jdm9pZCBleGVjdXRlXygpIHsKLQkJc3VwZXIuZXhlY3V0ZV8oKTsKLQkJaWYgKHRoaXMuc3RhdGUuZ2V0VmFsdWUoKSAhPSBTdGF0ZS5SRVBFQVQpIHsKLQkJCS8vIGhtbW0gLSB3ZSB3aWxsIG5vdGlmeSBsaXN0ZW5lcnMgZXZlbiB3aGVuIHdlIGFyZSAic3RvcHBlZCI7Ci0JCQkvLyB0aGF0IHNlZW1zIG9rLi4uICB+Ymp2Ci0JCQl0aGlzLnN5bmNocm9uaXphdGlvblF1aWVzY2VkKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9uaXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNWE0NTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIHRoZSBwcm90b2NvbCBmb3Igc3RhcnRpbmcsIHN0b3BwaW5nLCBhbmQgZXhlY3V0aW5nIGEKLSAqIGxvbmctcnVubmluZywgcmVwZWF0YWJsZSwgYW5kIHBvc3NpYmx5IHJlY3Vyc2l2ZSAic3luY2hyb25pemF0aW9uIiBwcm9jZXNzLgotICogVGhlIGludGVudCBpcyBmb3IgdGhlIHN5bmNocm9uaXplciB0byBzeW5jaHJvbml6ZSBhICJzZWNvbmRhcnkiIG1vZGVsIHdpdGgKLSAqIGEgInByaW1hcnkiIG1vZGVsLiBBbnkgY2hhbmdlIHRvIHRoZSAicHJpbWFyeSIgbW9kZWwgd2lsbCB0cmlnZ2VyIHRoZQotICogc3luY2hyb25pemF0aW9uLiBUaGUgc3luY2hyb25pemVyIGltcGxlbWVudGF0aW9uIHdpbGwgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCi0gKiAic2Vjb25kYXJ5IiBtb2RlbCByZW1haW5zIGluIHN5bmMgc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseS4KLSAqIDxwPgotICogVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGUge0BsaW5rICNzdGFydCgpfSBhbmQge0BsaW5rICNzdG9wKCl9IG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQgZnJvbQotICogYSBzaW5nbGUgbWFzdGVyIHRocmVhZCB0aGF0IHdvdWxkIGNvbnRyb2wgdGhlIHN5bmNocm9uaXplcidzIGxpZmVjeWNsZSBhbmQKLSAqIHRoZSB7QGxpbmsgI3N5bmNocm9uaXplKCl9IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgcG9zc2libHkgZnJvbQotICogbXVsdGlwbGUgdGhyZWFkcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTeW5jaHJvbml6ZXIgewotCi0JLyoqCi0JICogRW5hYmxlIHRoZSBzeW5jaHJvbml6ZXIgdG8gYWxsb3cgZnV0dXJlIHN5bmNocm9uaXphdGlvbnMgYXMgcmVxdWVzdGVkCi0JICogYnkgY2FsbHMgdG8ge0BsaW5rICNzeW5jaHJvbml6ZSgpfS4KLQkgKi8KLQl2b2lkIHN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgZGVwZW5kZW50IG1vZGVsIHdpdGggdGhlIHByaW1hcnkgbW9kZWwuIERvIG5vdGhpbmcgaWYKLQkgKiB7QGxpbmsgI3N0YXJ0KCl9IGhhcyBub3QgcHJldmlvdXNseSBiZWVuIGNhbGxlZC4gRG8gbm90aGluZyBpZiB7QGxpbmsgI3N0b3B9Ci0JICogaGFzIGJlZW4gY2FsbGVkICh3aXRob3V0IGFueSBpbnRlcm1lZGlhdGUgY2FsbCB0byB7QGxpbmsgI3N0YXJ0KCl9LgotCSAqLwotCXZvaWQgc3luY2hyb25pemUoKTsKLQotCS8qKgotCSAqIFN0b3AgdGhlIHN5bmNocm9uaXplciBpbW1lZGlhdGVseSBvciwgaWYgYSBzeW5jaHJvbml6YXRpb24gaXMgY3VycmVudGx5Ci0JICogaW4gcHJvZ3Jlc3MsIHdoZW4gaXQgY29tcGxldGVzLiBSZXR1cm4gd2hlbiB0aGUgc3luY2hyb25pemVyIGlzIHN0b3BwZWQuCi0JICogTm8gZnVydGhlciBzeW5jaG9uaXphdGlvbnMgd2lsbCBwZXJmb3JtZWQgdW50aWwge0BsaW5rICNzdGFydCgpfSBpcyBjYWxsZWQuCi0JICovCi0Jdm9pZCBzdG9wKCk7Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFN5bmNocm9uaXplcn0gaW50ZXJmYWNlIHRoYXQgd2lsbCBkbwotCSAqIG5vdGhpbmcuCi0JICovCi0JZmluYWwgY2xhc3MgTnVsbCBpbXBsZW1lbnRzIFN5bmNocm9uaXplciwgU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTeW5jaHJvbml6ZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlwdWJsaWMgc3RhdGljIFN5bmNocm9uaXplciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiU3luY2hyb25pemVyLk51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvU3luY2hyb25vdXNTeW5jaHJvbml6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMGM2MDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvU3luY2hyb25vdXNTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db21wb3NpdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkT2JqZWN0OwotCi0vKioKLSAqIFRoaXMgc3luY2hyb25pemVyIHdpbGwgc3luY2hyb25pemUgaW1tZWRpYXRlbHkgYW5kIG5vdCByZXR1cm4gdW50aWwgdGhlCi0gKiBzeW5jaHJvbml6YXRpb24gYW5kIGFueSBuZXN0ZWQgKHJlY3Vyc2l2ZSkgc3luY2hyb25pemF0aW9ucyBhcmUgY29tcGxldGUuCi0gKiBJbiBzb21lIHNpdHVhdGlvbnMgdGhpcyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHksIGFuZCBmb3IgYXMKLSAqIHNob3J0IGEgdGltZSBhcyBwb3NzaWJsZSwgYXMgaXQgaW5jcmVhc2VzIHRoZSBwcm9iYWJpbGl0eSBvZiBkZWFkbG9ja3MuIEEKLSAqIGRlYWRsb2NrIGNhbiBvY2N1ciB3aGVuIHtAbGluayBTeW5jaHJvbml6ZXIjc3luY2hyb25pemUoKX0gaXMgY2FsbGVkIGZyb20gbXVsdGlwbGUKLSAqIHRocmVhZHMgYW5kIG11bHRpcGxlIHJlc291cmNlcyBhcmUgbG9ja2VkIGJ5IHRoZSBzeW5jaHJvbml6YXRpb24gaW4gdmFyeWluZwotICogb3JkZXJzLgotICogPHA+Ci0gKiBBcyBkZWZpbmVkIGluIHRoZSB7QGxpbmsgU3luY2hyb25pemVyfSBpbnRlcmZhY2UsIHtAbGluayBTeW5jaHJvbml6ZXIjc3RhcnQoKX0KLSAqIGFuZCB7QGxpbmsgU3luY2hyb25pemVyI3N0b3AoKX0KLSAqIHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIHNhbWUgdGhyZWFkLCBidXQgaXQgaXMgbm90IHJlcXVpcmVkLgotICoge0BsaW5rIFN5bmNocm9uaXplciNzeW5jaHJvbml6ZSgpfSBzaG91bGQKLSAqIGFsd2F5cyBiZSBjYWxsZWQgaW4gdGhlIHNhbWUgdGhyZWFkIChpLmUuIG9ubHkgcmVjdXJzaXZlbHksIGJleW9uZCB0aGUKLSAqIGluaXRpYWwgY2FsbCk7IGFsdGhvdWdoLCB0aGlzIHRvbyBpcyBub3QgcmVxdWlyZWQuCi0gKiBUaGlzIHRocmVhZCBuZWVkIG5vdCBiZSB0aGUgc2FtZSB0aHJlYWQgdGhhdCBleGVjdXRlcwotICoge0BsaW5rIFN5bmNocm9uaXplciNzdGFydCgpfSBhbmQge0BsaW5rIFN5bmNocm9uaXplciNzdG9wKCl9LgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIKLQlpbXBsZW1lbnRzIFN5bmNocm9uaXplcgotewotCS8qKgotCSAqIFRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZCB0aGF0IHBlcmZvcm1zIHRoZSBzeW5jaHJvbml6YXRpb24uIEl0IG1heQotCSAqIHRyaWdnZXIgZnVydGhlciBjYWxscyB0byB7QGxpbmsgI3N5bmNocm9uaXplKCl9IChpLmUuIHRoZQotCSAqIHN5bmNocm9uaXphdGlvbiBtYXkgcmVjdXJzZSkuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb21tYW5kIGNvbW1hbmQ7Ci0KLQkvKioKLQkgKiBUaGUgc3luY2hyb25pemVyJ3MgY3VycmVudCBzdGF0ZS4KLQkgKi8KLQlmaW5hbCBTeW5jaHJvbml6ZWRPYmplY3Q8U3RhdGU+IHN0YXRlOwotCi0JLyoqCi0JICogVGhlIHN5bmNocm9uaXplcidzIGluaXRpYWwgc3RhdGUgaXMge0BsaW5rICNTVE9QUEVEfS4KLQkgKi8KLQllbnVtIFN0YXRlIHsKLQkJU1RPUFBFRCwKLQkJUkVBRFksCi0JCUVYRUNVVElORywKLQkJUkVQRUFULAotCQlTVE9QUElORwotCX0KLQotCS8qKgotCSAqIEEgbGlzdCBvZiB0aGUgdW5jYXVnaHQgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JZmluYWwgVmVjdG9yPFRocm93YWJsZT4gZXhjZXB0aW9ucyA9IG5ldyBWZWN0b3I8VGhyb3dhYmxlPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgY29tbWFuZCB0bwotCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JCS8vIHVzZSB0aGUgc3luY2hyb25pemVyIGFzIHRoZSBtdXRleCBzbyBpdCBpcyBmcmVlZCB1cCBieSB0aGUgd2FpdCBpbiAjc3RvcCgpCi0JCXRoaXMuc3RhdGUgPSBuZXcgU3luY2hyb25pemVkT2JqZWN0PFN0YXRlPihTdGF0ZS5TVE9QUEVELCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3luY2hyb25pemVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgc3luY2hyb25pemVyJ3Mge0BsaW5rICNzdGF0ZX0gdG8ge0BsaW5rIFN0YXRlI1JFQURZIFJFQURZfQotCSAqIGFuZCBleGVjdXRlIHRoZSBmaXJzdCBzeW5jaHJvbml6YXRpb24uIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUKLQkgKiBzeW5jaHJvbml6ZXIgaXMgbm90IHtAbGluayBTdGF0ZSNTVE9QUEVEIFNUT1BQRUR9LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJc3dpdGNoICh0aGlzLnN0YXRlLmdldFZhbHVlKCkpIHsKLQkJCWNhc2UgU1RPUFBFRDoKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlJFQURZKTsKLQkJCQl0aGlzLnN5bmNocm9uaXplKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFQURZOgotCQkJY2FzZSBFWEVDVVRJTkc6Ci0JCQljYXNlIFJFUEVBVDoKLQkJCWNhc2UgU1RPUFBJTkc6Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IHRoaXMuYnVpbGRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEl0J3MgcG9zc2libGUgdG8gY29tZSBiYWNrIGhlcmUgaWYgdGhlIHN5bmNocm9uaXphdGlvbiBjb21tYW5kIHJlY3Vyc2VzCi0JICogYW5kIHRyaWdnZXJzIGFub3RoZXIgc3luY2hyb25pemF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQlpZiAodGhpcy5iZWdpblN5bmNocm9uaXphdGlvbigpKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplXygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBjbGllbnQgaGFzIHJlcXVlc3RlZCBhIHN5bmNocm9uaXphdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB3ZSBjYW4gYmVnaW4gYSBuZXcgc3luY2hyb25pemF0aW9uLgotCSAqIElmIGEgc3luY2hyb25pemF0aW9uIGlzIGFscmVhZHkgdW5kZXIgd2F5LCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+OwotCSAqIGJ1dCBzZXQgdGhlIHtAbGluayAjc3RhdGV9IHRvIHtAbGluayBTdGF0ZSNSRVBFQVQgUkVQRUFUfQotCSAqIHNvIGFub3RoZXIgc3luY2hyb25pemF0aW9uIHdpbGwgb2NjdXIgb25jZSB0aGUgY3VycmVudAotCSAqIHN5bmNocm9uaXphdGlvbiBpcyBjb21wbGV0ZS4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGJlZ2luU3luY2hyb25pemF0aW9uKCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBTVE9QUEVEOgotCQkJCS8vIHN5bmNocm9uaXphdGlvbiBpcyBub3QgYWxsb3dlZAotCQkJCXJldHVybiBmYWxzZTsKLQkJCWNhc2UgUkVBRFk6Ci0JCQkJLy8gYmVnaW4gYSBuZXcgc3luY2hyb25pemF0aW9uCi0JCQkJdGhpcy5zdGF0ZS5zZXRWYWx1ZShTdGF0ZS5FWEVDVVRJTkcpOwotCQkJCXJldHVybiB0cnVlOwotCQkJY2FzZSBFWEVDVVRJTkc6Ci0JCQkJLy8gc2V0IGZsYWcgc28gYSBuZXcgc3luY2hyb25pemF0aW9uIHdpbGwgb2NjdXIgb25jZSB0aGUgY3VycmVudCBvbmUgaXMgZmluaXNoZWQKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlJFUEVBVCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJY2FzZSBSRVBFQVQ6Ci0JCQkJLy8gdGhlICJyZXBlYXQiIGZsYWcgaXMgYWxyZWFkeSBzZXQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQljYXNlIFNUT1BQSU5HOgotCQkJCS8vIG5vIGZ1cnRoZXIgc3luY2hyb25pemF0aW9ucyBhcmUgYWxsb3dlZAotCQkJCXJldHVybiBmYWxzZTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgdGhpcy5idWlsZElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHNldCBvZiAicmVjdXJzaW5nIgotCSAqIHN5bmNocm9uaXphdGlvbnMuIEFueSByZWN1cnNpdmUgY2FsbCB0byB7QGxpbmsgI3N5bmNocm9uaXplKCl9IHdpbGwKLQkgKiBzaW1wbHkgc2V0IHRoZSB7QGxpbmsgI3N0YXRlfSB0byB7QGxpbmsgU3RhdGUjUkVQRUFUIFJFUEVBVH0sCi0JICogY2F1c2luZyB0aGUgY29tbWFuZCB0byBleGVjdXRlIGFnYWluLgotCSAqLwotCXByaXZhdGUgdm9pZCBzeW5jaHJvbml6ZV8oKSB7Ci0JCWRvIHsKLQkJCXRoaXMuZXhlY3V0ZSgpOwotCQl9IHdoaWxlICh0aGlzLmVuZFN5bmNocm9uaXphdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZC4gRG8gbm90IGFsbG93IGFueSB1bmhhbmRsZWQKLQkgKiBleGNlcHRpb25zIHRvIGtpbGwgdGhlIHRocmVhZC4gU3RvcmUgdGhlbSB1cCBmb3IgbGF0ZXIgcGFpbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuZXhlY3V0ZV8oKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQl0aGlzLmV4Y2VwdGlvbnMuYWRkKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIGp1c3QgZXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQl2b2lkIGV4ZWN1dGVfKCkgewotCQl0aGlzLmNvbW1hbmQuZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjdXJyZW50IHN5bmNocm9uaXphdGlvbiBoYXMgZmluaXNoZWQuCi0JICogUmV0dXJuIHdoZXRoZXIgd2Ugc2hvdWxkIGJlZ2luIGFub3RoZXIgc3luY2hyb25pemF0aW9uLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gZW5kU3luY2hyb25pemF0aW9uKCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBTVE9QUEVEOgotCQkJY2FzZSBSRUFEWToKLQkJCQl0aHJvdyB0aGlzLmJ1aWxkSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQljYXNlIEVYRUNVVElORzoKLQkJCQkvLyBzeW5jaHJvbml6YXRpb24gaGFzIGZpbmlzaGVkIGFuZCB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgcmVxdWVzdHMgZm9yIGFub3RoZXI7IHJldHVybiB0byAicmVhZHkiCi0JCQkJdGhpcy5zdGF0ZS5zZXRWYWx1ZShTdGF0ZS5SRUFEWSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJY2FzZSBSRVBFQVQ6Ci0JCQkJLy8gdGhlICJyZXBlYXQiIGZsYWcgd2FzIHNldDsgY2xlYXIgaXQgYW5kIHN0YXJ0IGFub3RoZXIgc3luY2hyb25pemF0aW9uCi0JCQkJdGhpcy5zdGF0ZS5zZXRWYWx1ZShTdGF0ZS5FWEVDVVRJTkcpOwotCQkJCXJldHVybiB0cnVlOwotCQkJY2FzZSBTVE9QUElORzoKLQkJCQkvLyBhIGNsaWVudCBoYXMgaW5pdGlhdGVkIGEgInN0b3AiOyBtYXJrIHRoZSAic3RvcCIgY29tcGxldGUgYW5kIHBlcmZvcm0gbm8gbW9yZSBzeW5jaHJvbml6YXRpb25zCi0JCQkJdGhpcy5zdGF0ZS5zZXRWYWx1ZShTdGF0ZS5TVE9QUEVEKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IHRoaXMuYnVpbGRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZmxhZ3Mgc28gdGhhdCBubyBmdXJ0aGVyIHN5bmNocm9uaXphdGlvbnMgb2NjdXIuIElmIGFueSB1bmNhdWdodAotCSAqIGV4Y2VwdGlvbnMgd2VyZSB0aHJvd24gd2hpbGUgdGhlIHN5bmNocm9uaXphdGlvbiB3YXMgZXhlY3V0aW5nLAotCSAqIHdyYXAgdGhlbSBpbiBhIGNvbXBvc2l0ZSBleGNlcHRpb24gYW5kIHRocm93IHRoZSBjb21wb3NpdGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBTVE9QUEVEOgotCQkJCXRocm93IHRoaXMuYnVpbGRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCWNhc2UgUkVBRFk6Ci0JCQkJLy8gc2ltcGx5IHJldHVybiB0byAic3RvcHBlZCIgc3RhdGUKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlNUT1BQRUQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFWEVDVVRJTkc6Ci0JCQljYXNlIFJFUEVBVDoKLQkJCQkvLyBzZXQgdGhlICJzdG9wcGluZyIgZmxhZyBhbmQgd2FpdCB1bnRpbCB0aGUgc3luY2hyb25pemF0aW9uIGhhcyBmaW5pc2hlZAotCQkJCXRoaXMuc3RhdGUuc2V0VmFsdWUoU3RhdGUuU1RPUFBJTkcpOwotCQkJCXRoaXMud2FpdFVudGlsU3RvcHBlZCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVE9QUElORzoKLQkJCQl0aHJvdyB0aGlzLmJ1aWxkSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IHRoaXMuYnVpbGRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCi0JCWlmICh0aGlzLmV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJVGhyb3dhYmxlW10gdGVtcCA9IHRoaXMuZXhjZXB0aW9ucy50b0FycmF5KG5ldyBUaHJvd2FibGVbdGhpcy5leGNlcHRpb25zLnNpemUoKV0pOwotCQkJdGhpcy5leGNlcHRpb25zLmNsZWFyKCk7Ci0JCQl0aHJvdyBuZXcgQ29tcG9zaXRlRXhjZXB0aW9uKHRlbXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3YWl0IHdpbGwgZnJlZSB1cCB0aGUgc3luY2hyb25pemVyJ3Mgc3luY2hyb25pemVkIG1ldGhvZHMKLQkgKiAoc2luY2UgdGhlIHN5bmNocm9uaXplciBpcyB0aGUgc3RhdGUncyBtdXRleCkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbFN0b3BwZWQoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnN0YXRlLndhaXRVbnRpbFZhbHVlSXMoU3RhdGUuU1RPUFBFRCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGUgdGhyZWFkIHRoYXQgY2FsbGVkICNzdG9wKCkgd2FzIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcKLQkJCS8vIGZvciB0aGUgc3luY2hyb25pemF0aW9uIHRvIGZpbmlzaCAtIGlnbm9yZTsKLQkJCS8vICdzdGF0ZScgaXMgc3RpbGwgc2V0IHRvICdTVE9QUElORycsIHNvIHRoZSAjc3luY2hyb25pemVfKCkgbG9vcAotCQkJLy8gd2lsbCBzdGlsbCBzdG9wIC0gd2UganVzdCB3b24ndCB3YWl0IGFyb3VuZCBmb3IgaXQuLi4KLQkJfQotCX0KLQotCXByaXZhdGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGJ1aWxkSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic3RhdGU6ICIgKyB0aGlzLnN0YXRlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc3RhdGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL01vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIyNTMyYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBiZSBpbXBsZW1lbnRlZCBieSBtb2RlbHMgdGhhdCBub3RpZnkgbGlzdGVuZXJzIG9mCi0gKiBjaGFuZ2VzIHRvIGJvdW5kIHByb3BlcnRpZXMsIGNvbGxlY3Rpb25zLCBsaXN0cywgYW5kL29yIHRyZWVzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHNlZSBDaGFuZ2VMaXN0ZW5lcgotICogQHNlZSBTdGF0ZUNoYW5nZUxpc3RlbmVyCi0gKiBAc2VlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLSAqIEBzZWUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyCi0gKiBAc2VlIExpc3RDaGFuZ2VMaXN0ZW5lcgotICogQHNlZSBUcmVlQ2hhbmdlTGlzdGVuZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbAotICovCi0vLyBUT0RPIHVzZSBvYmplY3RzIChJRHM/KSBpbnN0ZWFkIG9mIHN0cmluZ3MgdG8gaWRlbnRpZnkgYXNwZWN0cz8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWwgewotCi0JLy8gKioqKioqKioqKiBjaGFuZ2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBjaGFuZ2UgZXZlbnRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2FtZSBsaXN0ZW5lciBpcyBhZGRlZCBtb3JlIHRoYW4gb25jZS4KLQkgKiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0Jdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBjaGFuZ2UgbGlzdGVuZXIuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgc3RhdGUgY2hhbmdlIGV2ZW50cy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgbGlzdGVuZXIgaXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHN0YXRlIGNoYW5nZSBsaXN0ZW5lci4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGxpc3RlbmVyIGlzIG51bGwgb3IgaWYgdGhlIGxpc3RlbmVyIHdhcyBuZXZlciBhZGRlZC4KLQkgKi8KLQl2b2lkIHJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgcHJvcGVydHkgY2hhbmdlIGV2ZW50cyB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2FtZSBsaXN0ZW5lciBpcyBhZGRlZCBtb3JlIHRoYW4gb25jZS4KLQkgKiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0Jdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzLAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cyB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGxpc3RlbmVyIGlzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cywKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBuYW1lLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGxpc3QgY2hhbmdlIGV2ZW50cyB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBsaXN0IG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGxpc3RlbmVyIGlzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZExpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGxpc3QgY2hhbmdlIGV2ZW50cywKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBuYW1lLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiB0cmVlIGNoYW5nZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRyZWUgY2hhbmdlIGV2ZW50cyB3aXRoCi0JICogdGhlIHNwZWNpZmllZCB0cmVlIG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGxpc3RlbmVyIGlzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgdHJlZU5hbWUsIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRyZWUgY2hhbmdlIGV2ZW50cywKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgdHJlZSBuYW1lLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0NoYW5nZUV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwYTliOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgZm9yIGFsbCB0aGUgY2hhbmdlIGV2ZW50cyB0aGF0IGNhbiBiZSBmaXJlZCBieSBtb2RlbHMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDaGFuZ2VFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICovCi0JcHJvdGVjdGVkIENoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSkgewotCQlzdXBlcihzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTW9kZWwgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gKE1vZGVsKSBzdXBlci5nZXRTb3VyY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuYnVpbGRTaW1wbGVUb1N0cmluZ09uKHRoaXMsIHNiKTsKLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCWludCBsZW4gPSBzYi5sZW5ndGgoKTsKLQkJdGhpcy50b1N0cmluZyhzYik7Ci0JCWlmIChzYi5sZW5ndGgoKSA9PSBsZW4pIHsKLQkJCXNiLmRlbGV0ZUNoYXJBdChsZW4gLSAxKTsKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZCgnKScpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCS8vIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgdG8gZG8gc29tZXRoaW5nIGEgYml0IG1vcmUgaGVscGZ1bAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25BZGRFdmVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25BZGRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTY4MTQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQWRkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJjb2xsZWN0aW9uIGFkZCIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBhZGRzIGl0ZW1zIHRvIGEKLSAqICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBjb2xsZWN0aW9uLiBBIDxjb2RlPkNvbGxlY3Rpb25BZGRFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi0vKiAKLSAqIERlc2lnbiBvcHRpb25zOgotICogLSBjcmVhdGUgYSBjb2xsZWN0aW9uIHRvIHdyYXAgYSBzaW5nbGUgYWRkZWQgb3IgcmVtb3ZlZCBpdGVtCi0gKiAJKHRoaXMgaXMgdGhlIG9wdGlvbiB3ZSBpbXBsZW1lbnRlZCBiZWxvdyBhbmQgaW4gY29sbGFib3JhdGluZyBjb2RlKQotICogCXNpbmNlIHRoZXJlIGlzIG5vIHdheSB0byBvcHRpbWl6ZSBkb3duc3RyZWFtIGNvZGUgZm9yCi0gKiAJc2luZ2xlIGl0ZW1zLCB3ZSB0YWtlIGFub3RoZXIgcGVyZm9ybWFuY2UgaGl0IGJ5IGJ1aWxkaW5nCi0gKiAJYSBjb2xsZWN0aW9uIGVhY2ggdGltZSAgKEBzZWUgQ29sbGVjdGlvbnMjc2luZ2xldG9uKE9iamVjdCkpCi0gKiAJYW5kIGZvcmNpbmcgZG93bnN0cmVhbSBjb2RlIHRvIHVzZSBhbiBpdGVyYXRvciBldmVyeSB0aW1lCi0gKiAKLSAqIC0gZmlyZSBhIHNlcGFyYXRlIGV2ZW50IGZvciBlYWNoIGl0ZW0gYWRkZWQgb3IgcmVtb3ZlZAotICogCWVsaW1pbmF0ZXMgYW55IHBvdGVudGlhbCBmb3Igb3B0aW1pemF0aW9ucyB0byBkb3duc3RyZWFtIGNvZGUKLSAqIAotICogLSBhZGQgcHJvdG9jb2wgdG8gc3VwcG9ydCBib3RoIHNpbmdsZSBpdGVtcyBhbmQgY29sbGVjdGlvbnMKLSAqIAlhZGRzIGNvbmRpdGlvbmFsIGxvZ2ljIHRvIGRvd25zdHJlYW0gY29kZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdGlvbkFkZEV2ZW50IGV4dGVuZHMgQ29sbGVjdGlvbkV2ZW50IHsKLQotCS8qKiBUaGUgaXRlbXMgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBpdGVtczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY29sbGVjdGlvbiBhZGQgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25BZGRFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcyhzb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBuZXcgT2JqZWN0W10ge2l0ZW19KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY29sbGVjdGlvbiBhZGQgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGl0ZW1zIFRoZSBpdGVtcyBhZGRlZCB0byB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkFkZEV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGl0ZW1zKSB7Ci0JCXRoaXMoc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgaXRlbXMudG9BcnJheSgpKTsgIC8vIE5QRSBpZiAnaXRlbXMnIGlzIG51bGwKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25BZGRFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0W10gaXRlbXMpIHsKLQkJc3VwZXIoc291cmNlLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXRoaXMuaXRlbXMgPSBpdGVtczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtcyBhZGRlZCB0byB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0SXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMuaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SXRlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5pdGVtcy5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMuaXRlbXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQWRkRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy5jb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQWRkRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3Q29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQWRkRXZlbnQobmV3U291cmNlLCBuZXdDb2xsZWN0aW9uTmFtZSwgdGhpcy5pdGVtcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkNoYW5nZUV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMmY0ZTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25DaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImNvbGxlY3Rpb24gY2hhbmdlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBvciAiY29uc3RyYWluZWQiIGNvbGxlY3Rpb24gaW4gYSBtYW5uZXIgdGhhdCBpcyBub3QgZWFzaWx5IGNoYXJhY3Rlcml6ZWQgYnkKLSAqIHRoZSBvdGhlciBjb2xsZWN0aW9uIGV2ZW50cy4KLSAqIEEgPGNvZGU+Q29sbGVjdGlvbkNoYW5nZUV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcn0uCi0gKiBBIDxjb2RlPkNvbGxlY3Rpb25DaGFuZ2VFdmVudDwvY29kZT4gaXMgYWNjb21wYW5pZWQgYnkgdGhlIGNvbGxlY3Rpb24gbmFtZSBhbmQKLSAqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV4dGVuZHMgQ29sbGVjdGlvbkV2ZW50IHsKLQotCS8qKgotCSAqIFRoZSB0aGUgY29sbGVjdGlvbiBpbiBpdHMgY3VycmVudCBzdGF0ZS4KLQkgKiBDbGllbnRzIHdpbGwgbmVlZCB0byBjYWxjdWxhdGUgdGhlIG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHN5bmNocm9uaXplCi0JICogd2l0aCB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIGNvbGxlY3Rpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQl0aGlzKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGNvbGxlY3Rpb24udG9BcnJheSgpKTsgIC8vIE5QRSBpZiAnY29sbGVjdGlvbicgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3RbXSBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldENvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb2xsZWN0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdDb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudChuZXdTb3VyY2UsIG5ld0NvbGxlY3Rpb25OYW1lLCB0aGlzLmNvbGxlY3Rpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25DbGVhckV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkNsZWFyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4MjYzOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkNsZWFyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJjb2xsZWN0aW9uIGNsZWFyIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNsZWFycwotICogYSAiYm91bmQiIG9yICJjb25zdHJhaW5lZCIgY29sbGVjdGlvbi4gQSA8Y29kZT5Db2xsZWN0aW9uQ2xlYXJFdmVudDwvY29kZT4gaXMgc2VudAotICogYXMgYW4gYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXh0ZW5kcyBDb2xsZWN0aW9uRXZlbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBjb2xsZWN0aW9uIGNsZWFyIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQ2xlYXJFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlzdXBlcihzb3VyY2UsIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkNsZWFyRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy5jb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQ2xlYXJFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdDb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DbGVhckV2ZW50KG5ld1NvdXJjZSwgbmV3Q29sbGVjdGlvbk5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25FdmVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjM5M2IzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLS8vIFRPRE8gYWRkICJpdGVtL29yaWdpbmFsL25lc3RlZCBldmVudCIgZm9yIGl0ZW0gY2hhbmdlZD8KLS8qKgotICogQSAiY29sbGVjdGlvbiIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiBjb2xsZWN0aW9uLiBBIDxjb2RlPkNvbGxlY3Rpb25FdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJ9LgotICogVGhlIGludGVudCBpcyB0aGF0IGFueSBsaXN0ZW5lcgotICogY2FuIGtlZXAgaXRzZWxmIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCdzIGNvbGxlY3Rpb24gdmlhIHRoZSBjb2xsZWN0aW9uCi0gKiBldmVudHMgaXQgcmVjZWl2ZXMgYW5kIG5lZWQgbm90IG1haW50YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbAotICogY29sbGVjdGlvbi4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25FdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKLQotCS8qKiBOYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgY2hhbmdlZC4gKi8KLQlmaW5hbCBTdHJpbmcgY29sbGVjdGlvbk5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25FdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlzdXBlcihzb3VyY2UpOwotCQlpZiAoY29sbGVjdGlvbk5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb2xsZWN0aW9uTmFtZSA9IGNvbGxlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbGxlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uUmVtb3ZlRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uUmVtb3ZlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkODc3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvblJlbW92ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAiY29sbGVjdGlvbiByZW1vdmUiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgcmVtb3ZlcyBpdGVtcwotICogZnJvbSBhICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBjb2xsZWN0aW9uLiBBIDxjb2RlPkNvbGxlY3Rpb25SZW1vdmVFdmVudDwvY29kZT4gaXMgc2VudAotICogYXMgYW4gYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi0vKgotICogU2VlIGRlc2lnbiBkaXNjdXNzaW9uIGluIENvbGxlY3Rpb25BZGRFdmVudAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV4dGVuZHMgQ29sbGVjdGlvbkV2ZW50IHsKLQotCS8qKiBUaGUgaXRlbXMgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gaXRlbXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gcmVtb3ZlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvblJlbW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgaXRlbSkgewotCQl0aGlzKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIG5ldyBPYmplY3RbXSB7aXRlbX0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBjb2xsZWN0aW9uIHJlbW92ZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gaXRlbXMgVGhlIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvblJlbW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGl0ZW1zKSB7Ci0JCXRoaXMoc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgaXRlbXMudG9BcnJheSgpKTsgIC8vIE5QRSBpZiAnaXRlbXMnIGlzIG51bGwKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25SZW1vdmVFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0W10gaXRlbXMpIHsKLQkJc3VwZXIoc291cmNlLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXRoaXMuaXRlbXMgPSBpdGVtczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldEl0ZW1zKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8T2JqZWN0Pih0aGlzLml0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIGludCBnZXRJdGVtc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZW1zLmxlbmd0aDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcy5pdGVtcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25SZW1vdmVFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25SZW1vdmVFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdDb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25SZW1vdmVFdmVudChuZXdTb3VyY2UsIG5ld0NvbGxlY3Rpb25OYW1lLCB0aGlzLml0ZW1zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0QWRkRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0QWRkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczNmM0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdEFkZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAibGlzdCBhZGQiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgYWRkcyBpdGVtcyB0byBhCi0gKiAiYm91bmQiIG9yICJjb25zdHJhaW5lZCIgbGlzdC4gQSA8Y29kZT5MaXN0QWRkRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotLyoKLSAqIFNlZSBkZXNpZ24gZGlzY3Vzc2lvbiBpbiBDb2xsZWN0aW9uQWRkRXZlbnQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIExpc3RBZGRFdmVudCBleHRlbmRzIExpc3RFdmVudCB7Ci0KLQkvKiogVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIGFkZGVkLiAqLwotCXByaXZhdGUgZmluYWwgaW50IGluZGV4OwotCi0JLyoqIFRoZSBpdGVtcyBhZGRlZCB0byB0aGUgbGlzdC4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIGl0ZW1zOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IGFkZCBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBsaXN0TmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIGFkZGVkLgotCSAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIGFkZGVkIHRvIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBMaXN0QWRkRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcyhzb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3IE9iamVjdFtdIHtpdGVtfSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgYWRkIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGxpc3ROYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgbGlzdCB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgYWRkZWQuCi0JICogQHBhcmFtIGl0ZW1zIFRoZSBpdGVtcyBhZGRlZCB0byB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgTGlzdEFkZEV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gaXRlbXMpIHsKLQkJdGhpcyhzb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgaXRlbXMudG9BcnJheSgpKTsgIC8vIE5QRSBpZiAnaXRlbXMnIGlzIG51bGwKLQl9Ci0KLQlwcml2YXRlIExpc3RBZGRFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3RbXSBpdGVtcykgewotCQlzdXBlcihzb3VyY2UsIGxpc3ROYW1lKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQl0aGlzLml0ZW1zID0gaXRlbXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtcyBhZGRlZCB0byB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0SXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMuaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGFkZGVkIHRvIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SXRlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5pdGVtcy5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMuaXRlbXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBMaXN0QWRkRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy5saXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgbGlzdCBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgbGlzdCBuYW1lLgotCSAqLwotCXB1YmxpYyBMaXN0QWRkRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3TGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCBuZXdMaXN0TmFtZSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgbGlzdCBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgbGlzdCBuYW1lIGFuZCBkaXNwbGFjaW5nCi0JICogdGhlIGluZGV4IGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LgotCSAqLwotCXB1YmxpYyBMaXN0QWRkRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3TGlzdE5hbWUsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QWRkRXZlbnQobmV3U291cmNlLCBuZXdMaXN0TmFtZSwgdGhpcy5pbmRleCArIG9mZnNldCwgdGhpcy5pdGVtcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENoYW5nZUV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzY2JiOWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImxpc3QgY2hhbmdlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBvciAiY29uc3RyYWluZWQiIGxpc3QgaW4gYSBtYW5uZXIgdGhhdCBpcyBub3QgZWFzaWx5IGNoYXJhY3Rlcml6ZWQgYnkKLSAqIHRoZSBvdGhlciBsaXN0IGV2ZW50cy4KLSAqIEEgPGNvZGU+TGlzdENoYW5nZUV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBBIDxjb2RlPkxpc3RDaGFuZ2VFdmVudDwvY29kZT4gaXMgYWNjb21wYW5pZWQgYnkgdGhlIGxpc3QgbmFtZSBhbmQKLSAqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBsaXN0LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlzdENoYW5nZUV2ZW50IGV4dGVuZHMgTGlzdEV2ZW50IHsKLQotCS8qKgotCSAqIFRoZSB0aGUgbGlzdCBpbiBpdHMgY3VycmVudCBzdGF0ZS4KLQkgKiBDbGllbnRzIHdpbGwgbmVlZCB0byBjYWxjdWxhdGUgdGhlIG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHN5bmNocm9uaXplCi0JICogd2l0aCB0aGUgbGlzdC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIGxpc3Q7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGxpc3ROYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgbGlzdCB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBMaXN0Q2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIExpc3Q8Pz4gbGlzdCkgewotCQl0aGlzKHNvdXJjZSwgbGlzdE5hbWUsIGxpc3QudG9BcnJheSgpKTsgIC8vIE5QRSBpZiAnbGlzdCcgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBPYmplY3RbXSBsaXN0KSB7Ci0JCXN1cGVyKHNvdXJjZSwgbGlzdE5hbWUpOwotCQl0aGlzLmxpc3QgPSBsaXN0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldExpc3QoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMubGlzdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHVibGljIGludCBnZXRMaXN0U2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMubGlzdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIExpc3RDaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUuCi0JICovCi0JcHVibGljIExpc3RDaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VFdmVudChuZXdTb3VyY2UsIG5ld0xpc3ROYW1lLCB0aGlzLmxpc3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RDbGVhckV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENsZWFyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBjMzJmMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENsZWFyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJsaXN0IGNsZWFyIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNsZWFycwotICogYSAiYm91bmQiIG9yICJjb25zdHJhaW5lZCIgbGlzdC4gQSA8Y29kZT5MaXN0Q2xlYXJFdmVudDwvY29kZT4gaXMgc2VudAotICogYXMgYW4gYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlzdENsZWFyRXZlbnQgZXh0ZW5kcyBMaXN0RXZlbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgY2xlYXIgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIExpc3RDbGVhckV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXN1cGVyKHNvdXJjZSwgbGlzdE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBMaXN0Q2xlYXJFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUuCi0JICovCi0JcHVibGljIExpc3RDbGVhckV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lKSB7Ci0JCXJldHVybiBuZXcgTGlzdENsZWFyRXZlbnQobmV3U291cmNlLCBuZXdMaXN0TmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdEV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhM2QzODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vLyBUT0RPIGFkZCAiaXRlbS9vcmlnaW5hbC9uZXN0ZWQgZXZlbnQiIGZvciBpdGVtIGNoYW5nZWQ/Ci0vKioKLSAqIEEgImxpc3QiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgbGlzdC4gQSA8Y29kZT5MaXN0RXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyfS4KLSAqIFRoZSBpbnRlbnQgaXMgdGhhdCBhbnkgbGlzdGVuZXIKLSAqIGNhbiBrZWVwIGl0c2VsZiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbW9kZWwncyBsaXN0IHZpYSB0aGUgbGlzdAotICogZXZlbnRzIGl0IHJlY2VpdmVzIGFuZCBuZWVkIG5vdCBtYWludGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwKLSAqIGxpc3QuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0RXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQkvKiogTmFtZSBvZiB0aGUgbGlzdCB0aGF0IGNoYW5nZWQuICovCi0JZmluYWwgU3RyaW5nIGxpc3ROYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGxpc3ROYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgbGlzdCB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBMaXN0RXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKGxpc3ROYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdE5hbWUgPSBsaXN0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXN0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdE5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5saXN0TmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdE1vdmVFdmVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RNb3ZlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlNWM3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdE1vdmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJsaXN0IG1vdmUiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgbW92ZXMgdGhlIGVsZW1lbnRzIGluCi0gKiBhICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBsaXN0LiBBIDxjb2RlPkxpc3RNb3ZlRXZlbnQ8L2NvZGU+IGlzIHNlbnQKLSAqIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIExpc3RNb3ZlRXZlbnQgZXh0ZW5kcyBMaXN0RXZlbnQgewotCi0JLyoqIFRoZSBpbmRleCB0byB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4gKi8KLQlwcml2YXRlIGZpbmFsIGludCB0YXJnZXRJbmRleDsKLQotCS8qKiBUaGUgaW5kZXggZnJvbSB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4gKi8KLQlwcml2YXRlIGZpbmFsIGludCBzb3VyY2VJbmRleDsKLQotCS8qKiBUaGUgbnVtYmVyIG9mIGl0ZW1zIG1vdmVkLiAqLwotCXByaXZhdGUgZmluYWwgaW50IGxlbmd0aDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IG1vdmUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIHRhcmdldEluZGV4IFRoZSBpbmRleCB0byB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4KLQkgKiBAcGFyYW0gc291cmNlSW5kZXggVGhlIGluZGV4IGZyb20gd2hpY2ggdGhlIGl0ZW1zIHdlcmUgbW92ZWQuCi0JICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGl0ZW1zIG1vdmVkLgotCSAqLwotCXB1YmxpYyBMaXN0TW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlzdXBlcihzb3VyY2UsIGxpc3ROYW1lKTsKLQkJdGhpcy50YXJnZXRJbmRleCA9IHRhcmdldEluZGV4OwotCQl0aGlzLnNvdXJjZUluZGV4ID0gc291cmNlSW5kZXg7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IHRvIHdoaWNoIHRoZSBpdGVtcyB3ZXJlIG1vdmVkLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFyZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldEluZGV4OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggZnJvbSB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNvdXJjZUluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5zb3VyY2VJbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMuc291cmNlSW5kZXgpOwotCQlzYi5hcHBlbmQoIiA9PiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQodGhpcy50YXJnZXRJbmRleCk7Ci0JCXNiLmFwcGVuZCgiIGxlbmd0aD0iKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQodGhpcy5sZW5ndGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBMaXN0TW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMubGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdE1vdmVFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIG5ld0xpc3ROYW1lLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUgYW5kIGRpc3BsYWNpbmcKLQkgKiB0aGUgaW5kZXggYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuCi0JICovCi0JcHVibGljIExpc3RNb3ZlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3TGlzdE5hbWUsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW92ZUV2ZW50KG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIHRoaXMudGFyZ2V0SW5kZXggKyBvZmZzZXQsIHRoaXMuc291cmNlSW5kZXggKyBvZmZzZXQsIHRoaXMubGVuZ3RoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0UmVtb3ZlRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0UmVtb3ZlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2Njk2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdFJlbW92ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAibGlzdCByZW1vdmUiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgcmVtb3ZlcyBpdGVtcwotICogZnJvbSBhICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBsaXN0LiBBIDxjb2RlPkxpc3RSZW1vdmVFdmVudDwvY29kZT4gaXMgc2VudAotICogYXMgYW4gYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi0vKgotICogU2VlIGRlc2lnbiBkaXNjdXNzaW9uIGluIENvbGxlY3Rpb25BZGRFdmVudAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlzdFJlbW92ZUV2ZW50IGV4dGVuZHMgTGlzdEV2ZW50IHsKLQotCS8qKiBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgcmVtb3ZlZC4gKi8KLQlwcml2YXRlIGZpbmFsIGludCBpbmRleDsKLQotCS8qKiBUaGUgaXRlbXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gaXRlbXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgcmVtb3ZlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgbGlzdCB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgcmVtb3ZlZC4KLQkgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSByZW1vdmVkIGZyb20gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIExpc3RSZW1vdmVFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQl0aGlzKHNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBuZXcgT2JqZWN0W10ge2l0ZW19KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCByZW1vdmUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSByZW1vdmVkLgotCSAqIEBwYXJhbSBpdGVtcyBUaGUgaXRlbXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBMaXN0UmVtb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgQ29sbGVjdGlvbjw/PiBpdGVtcykgewotCQl0aGlzKHNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBpdGVtcy50b0FycmF5KCkpOyAgLy8gTlBFIGlmICdpdGVtcycgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgTGlzdFJlbW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdFtdIGl0ZW1zKSB7Ci0JCXN1cGVyKHNvdXJjZSwgbGlzdE5hbWUpOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCXRoaXMuaXRlbXMgPSBpdGVtczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldEl0ZW1zKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8T2JqZWN0Pih0aGlzLml0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIGludCBnZXRJdGVtc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZW1zLmxlbmd0aDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcy5pdGVtcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIExpc3RSZW1vdmVFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUuCi0JICovCi0JcHVibGljIExpc3RSZW1vdmVFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIG5ld0xpc3ROYW1lLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUgYW5kIGRpc3BsYWNpbmcKLQkgKiB0aGUgaW5kZXggYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuCi0JICovCi0JcHVibGljIExpc3RSZW1vdmVFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gbmV3IExpc3RSZW1vdmVFdmVudChuZXdTb3VyY2UsIG5ld0xpc3ROYW1lLCB0aGlzLmluZGV4ICsgb2Zmc2V0LCB0aGlzLml0ZW1zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0UmVwbGFjZUV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdFJlcGxhY2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDJhYTQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0UmVwbGFjZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAibGlzdCByZXBsYWNlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIHJlcGxhY2VzIGl0ZW1zIGluIGEKLSAqICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBsaXN0LiBBIDxjb2RlPkxpc3RSZXBsYWNlRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIExpc3RSZXBsYWNlRXZlbnQgZXh0ZW5kcyBMaXN0RXZlbnQgewotCi0JLyoqIFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSByZXBsYWNlZC4gKi8KLQlwcml2YXRlIGZpbmFsIGludCBpbmRleDsKLQotCS8qKiBUaGUgbmV3IGl0ZW1zIHRoYXQgcmVwbGFjZWQgdGhlIG9sZCBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIG5ld0l0ZW1zOwotCi0JLyoqIFRoZSBvbGQgaXRlbXMgdGhhdCB3ZXJlIHJlcGxhY2VkIGJ5IHRoZSBuZXcgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBvbGRJdGVtczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCByZXBsYWNlIGV2ZW50IGZvciBhIGxpc3Qgb2YgcmVwbGFjZWQgaXRlbXMuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbSBpbiB0aGUgbGlzdCB3YXMgcmVwbGFjZWQuCi0JICogQHBhcmFtIG5ld0l0ZW0gVGhlIG5ldyBpdGVtIGluIHRoZSBsaXN0LgotCSAqIEBwYXJhbSBvbGRJdGVtIFRoZSBvbGQgaXRlbSBpbiB0aGUgbGlzdCB0aGF0IHdlcmUgcmVwbGFjZWQuCi0JICovCi0JcHVibGljIExpc3RSZXBsYWNlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IG5ld0l0ZW0sIE9iamVjdCBvbGRJdGVtKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ldyBPYmplY3RbXSB7bmV3SXRlbX0sIG5ldyBPYmplY3RbXSB7b2xkSXRlbX0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IHJlcGxhY2UgZXZlbnQgZm9yIGEgbGlzdCBvZiByZXBsYWNlZCBpdGVtcy4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBsaXN0TmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyBpbiB0aGUgbGlzdCB3ZXJlIHJlcGxhY2VkLgotCSAqIEBwYXJhbSBuZXdJdGVtcyBUaGUgbmV3IGl0ZW1zIGluIHRoZSBsaXN0LgotCSAqIEBwYXJhbSBvbGRJdGVtcyBUaGUgb2xkIGl0ZW1zIGluIHRoZSBsaXN0IHRoYXQgd2VyZSByZXBsYWNlZC4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlcGxhY2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IG5ld0l0ZW1zLCBMaXN0PD8+IG9sZEl0ZW1zKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW1zLnRvQXJyYXkoKSwgb2xkSXRlbXMudG9BcnJheSgpKTsgIC8vIE5QRSBpZiBlaXRoZXIgJ25ld0l0ZW1zJyBvciAnb2xkSXRlbXMnIGlzIG51bGwKLQl9Ci0KLQlwcml2YXRlIExpc3RSZXBsYWNlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0W10gbmV3SXRlbXMsIE9iamVjdFtdIG9sZEl0ZW1zKSB7Ci0JCXN1cGVyKHNvdXJjZSwgbGlzdE5hbWUpOwotCQlpZiAobmV3SXRlbXMubGVuZ3RoICE9IG9sZEl0ZW1zLmxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2l6ZXMgbXVzdCBtYXRjaCAtIG5ldyBpdGVtcyBzaXplOiAiICsgbmV3SXRlbXMubGVuZ3RoIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiIG9sZCBpdGVtcyBzaXplOiAiICsgb2xkSXRlbXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJdGhpcy5uZXdJdGVtcyA9IG5ld0l0ZW1zOwotCQl0aGlzLm9sZEl0ZW1zID0gb2xkSXRlbXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXcgaXRlbXMgdGhhdCByZXBsYWNlZCB0aGUgb2xkIGl0ZW1zIGluIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTw/PiBnZXROZXdJdGVtcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5uZXdJdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvbGQgaXRlbXMgdGhhdCB3ZXJlIHJlcGxhY2VkIGJ5IHRoZSBuZXcgaXRlbXMgaW4gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldE9sZEl0ZW1zKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8T2JqZWN0Pih0aGlzLm9sZEl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IHdlcmUgcmVwbGFjZWQuCi0JICovCi0JcHVibGljIGludCBnZXRJdGVtc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLm5ld0l0ZW1zLmxlbmd0aDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcy5vbGRJdGVtcyk7Ci0JCXNiLmFwcGVuZCgiID0+ICIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcy5uZXdJdGVtcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIExpc3RSZXBsYWNlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy5saXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgbGlzdCBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgbGlzdCBuYW1lLgotCSAqLwotCXB1YmxpYyBMaXN0UmVwbGFjZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZSBhbmQgZGlzcGxhY2luZwotCSAqIHRoZSBpbmRleCBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlcGxhY2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gbmV3IExpc3RSZXBsYWNlRXZlbnQobmV3U291cmNlLCBuZXdMaXN0TmFtZSwgdGhpcy5pbmRleCArIG9mZnNldCwgdGhpcy5uZXdJdGVtcywgdGhpcy5vbGRJdGVtcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4Njk1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJwcm9wZXJ0eSBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgcHJvcGVydHkuIEEgPGNvZGU+UHJvcGVydHlDaGFuZ2VFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyfS4KLSAqIEEgPGNvZGU+UHJvcGVydHlDaGFuZ2VFdmVudDwvY29kZT4gaXMgYWNjb21wYW5pZWQgYnkgdGhlIG9sZCBhbmQgbmV3IHZhbHVlcwotICogb2YgdGhlIHByb3BlcnR5LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvcGVydHlDaGFuZ2VFdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKLQotCS8qKiBOYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lOwotCi0JLyoqIFRoZSBwcm9wZXJ0eSdzIG9sZCB2YWx1ZSwgYmVmb3JlIHRoZSBjaGFuZ2UuICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7Ci0KLQkvKiogVGhlIHByb3BlcnR5J3MgbmV3IHZhbHVlLCBhZnRlciB0aGUgY2hhbmdlLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG5ld1ZhbHVlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gb2xkVmFsdWUgVGhlIG9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0JICogQHBhcmFtIG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eUNoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMub2xkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TmV3VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLm5ld1ZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMucHJvcGVydHlOYW1lKTsKLQkJc2IuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLm9sZFZhbHVlKTsKLQkJc2IuYXBwZW5kKCIgPT4gIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMubmV3VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBQcm9wZXJ0eUNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQobmV3U291cmNlLCB0aGlzLnByb3BlcnR5TmFtZSwgdGhpcy5vbGRWYWx1ZSwgdGhpcy5uZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgcHJvcGVydHkgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIHByb3BlcnR5IG5hbWUuCi0JICovCi0JcHVibGljIFByb3BlcnR5Q2hhbmdlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3UHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudChuZXdTb3VyY2UsIG5ld1Byb3BlcnR5TmFtZSwgdGhpcy5vbGRWYWx1ZSwgdGhpcy5uZXdWYWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvU3RhdGVDaGFuZ2VFdmVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L1N0YXRlQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUxNTRkZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvU3RhdGVDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgZ2VuZXJpYyAic3RhdGUgY2hhbmdlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgdG8KLSAqIHN1Y2ggZXh0ZW50IHRoYXQgaXQgY2Fubm90IGJlIGRlbGluZWF0ZWQgYWxsIGFzcGVjdHMgb2YgaXQgdGhhdCBoYXZlIGNoYW5nZWQuCi0gKiBBbnkgbGlzdGVuZXIgY2FuIHN5bmNocm9uaXplIHdpdGggdGhlIG1vZGVsIGFzIG5lY2Vzc2FyeSBzaW5jZSB0aGUgbW9kZWwgaXMKLSAqIGF2YWlsYWJsZSBhcyB0aGUgZXZlbnQncyAnc291cmNlJy4KLSAqIEEgPGNvZGU+U3RhdGVDaGFuZ2VFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbiBhcmd1bWVudCB0byB0aGUKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0YXRlQ2hhbmdlRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IHN0YXRlIGNoYW5nZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqLwotCXB1YmxpYyBTdGF0ZUNoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSkgewotCQlzdXBlcihzb3VyY2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBTdGF0ZUNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlRXZlbnQobmV3U291cmNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQWRkRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQWRkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0MTgyMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUFkZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJ0cmVlIGFkZCIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBhZGRzIGEgbm9kZSB0byBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgdHJlZS4gQSA8Y29kZT5UcmVlQ2hhbmdlRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRyZWVBZGRFdmVudCBleHRlbmRzIFRyZWVFdmVudCB7Ci0KLQkvKioKLSAgICAgKiBQYXRoIHRvIHRoZSBub2RlIGFkZGVkIHRvIHRoZSB0cmVlLgotICAgICAqLwotCXByb3RlY3RlZCBmaW5hbCBPYmplY3RbXSBwYXRoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyB0cmVlIGFkZCBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSB0cmVlTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIHRyZWUgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byB0aGUgcGFydCBvZiB0aGUgdHJlZSB0aGF0IHdhcyBhZGRlZC4KLQkgKi8KLQlwdWJsaWMgVHJlZUFkZEV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHRyZWVOYW1lLCBMaXN0PD8+IHBhdGgpIHsKLQkJdGhpcyhzb3VyY2UsIHRyZWVOYW1lLCBwYXRoLnRvQXJyYXkoKSk7ICAvLyBOUEUgaWYgJ3BhdGgnIGlzIG51bGwKLQl9Ci0KLQlwcml2YXRlIFRyZWVBZGRFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSwgT2JqZWN0W10gcGF0aCkgewotCQlzdXBlcihzb3VyY2UsIHRyZWVOYW1lKTsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBwYXJ0IG9mIHRoZSB0cmVlIHRoYXQgd2FzIGFkZGVkLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTw/PiBnZXRQYXRoKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8T2JqZWN0Pih0aGlzLnBhdGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBUcmVlQWRkRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy50cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgdHJlZSBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgdHJlZSBuYW1lLgotCSAqLwotCXB1YmxpYyBUcmVlQWRkRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3VHJlZU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBUcmVlQWRkRXZlbnQobmV3U291cmNlLCBuZXdUcmVlTmFtZSwgdGhpcy5wYXRoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQ2hhbmdlRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiOWE4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJ0cmVlIGNoYW5nZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiB0cmVlIGluIGEgbWFubmVyIHRoYXQgaXMgbm90IGVhc2lseSBjaGFyYWN0ZXJpemVkIGJ5Ci0gKiB0aGUgb3RoZXIgdHJlZSBldmVudHMuCi0gKiBBIDxjb2RlPlRyZWVDaGFuZ2VFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJlZUNoYW5nZUV2ZW50IGV4dGVuZHMgVHJlZUV2ZW50IHsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IG5vZGVzIGluIHRoZSBjaGFuZ2VkIHRyZWUuCi0gICAgICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdFtdIG5vZGVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IHRyZWUgY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIHRyZWVOYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBub2RlcyBUaGUgY3VycmVudCBub2RlcyBpbiB0aGUgY2hhbmdlZCB0cmVlLgotCSAqLwotCXB1YmxpYyBUcmVlQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgdHJlZU5hbWUsIENvbGxlY3Rpb248Pz4gbm9kZXMpIHsKLQkJdGhpcyhzb3VyY2UsIHRyZWVOYW1lLCBub2Rlcy50b0FycmF5KCkpOyAgLy8gTlBFIGlmICdub2RlcycgaXMgbnVsbAotCX0KLQkKLQlwcml2YXRlIFRyZWVDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSwgT2JqZWN0W10gbm9kZXMpIHsKLQkJc3VwZXIoc291cmNlLCB0cmVlTmFtZSk7Ci0JCXRoaXMubm9kZXMgPSBub2RlczsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBub2RlcyBpbiB0aGUgY2hhbmdlZCB0cmVlLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTw/PiBnZXROb2RlcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5ub2Rlcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IG5vZGVzIGluIHRoZSBjaGFuZ2VkIHRyZWUuCi0JICovCi0JcHVibGljIGludCBnZXROb2Rlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLm5vZGVzLmxlbmd0aDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgVHJlZUNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMudHJlZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIHRyZWUgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIHRyZWUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld1RyZWVOYW1lKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNoYW5nZUV2ZW50KG5ld1NvdXJjZSwgbmV3VHJlZU5hbWUsIHRoaXMubm9kZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVDbGVhckV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUNsZWFyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM4MGRiZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUNsZWFyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJ0cmVlIGNsZWFyIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNsZWFycwotICogYSAiYm91bmQiIG9yICJjb25zdHJhaW5lZCIgdHJlZS4gQSA8Y29kZT5UcmVlQ2xlYXJFdmVudDwvY29kZT4gaXMgc2VudAotICogYXMgYW4gYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJlZUNsZWFyRXZlbnQgZXh0ZW5kcyBUcmVlRXZlbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyB0cmVlIGNsZWFyIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBUcmVlQ2xlYXJFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSkgewotCQlzdXBlcihzb3VyY2UsIHRyZWVOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUNsZWFyRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy50cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBUcmVlQ2xlYXJFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdDb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gbmV3IFRyZWVDbGVhckV2ZW50KG5ld1NvdXJjZSwgbmV3Q29sbGVjdGlvbk5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVFdmVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmU3NjMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJ0cmVlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBvciAiY29uc3RyYWluZWQiIHRyZWUuIEEgPGNvZGU+VHJlZUV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBUaGUgaW50ZW50IGlzIHRoYXQgYW55IGxpc3RlbmVyCi0gKiBjYW4ga2VlcCBpdHNlbGYgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsJ3MgdHJlZSB2aWEgdGhlIHRyZWUgZXZlbnRzCi0gKiBpdCByZWNlaXZlcyBhbmQgbmVlZCBub3QgbWFpbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHRyZWUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmVlRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQkvKiogTmFtZSBvZiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQuICovCi0JZmluYWwgU3RyaW5nIHRyZWVOYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyB0cmVlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIHRyZWVOYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBUcmVlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgdHJlZU5hbWUpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKHRyZWVOYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudHJlZU5hbWUgPSB0cmVlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUcmVlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudHJlZU5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy50cmVlTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZVJlbW92ZUV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZVJlbW92ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNGRhMTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVSZW1vdmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAidHJlZSByZW1vdmUiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgcmVtb3ZlcyBhIG5vZGUgcm9tIGEKLSAqICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiB0cmVlLiBBIDxjb2RlPlRyZWVDaGFuZ2VFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJlZVJlbW92ZUV2ZW50IGV4dGVuZHMgVHJlZUV2ZW50IHsKLQotCS8qKgotICAgICAqIFBhdGggdG8gdGhlIG5vZGUgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlLgotICAgICAqLwotCXByb3RlY3RlZCBmaW5hbCBPYmplY3RbXSBwYXRoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyB0cmVlIHJlbW92ZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSB0cmVlTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIHRyZWUgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byB0aGUgcGFydCBvZiB0aGUgdHJlZSB0aGF0IHdhcyByZW1vdmVkLgotCSAqLwotCXB1YmxpYyBUcmVlUmVtb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQl0aGlzKHNvdXJjZSwgdHJlZU5hbWUsIHBhdGgudG9BcnJheSgpKTsgIC8vIE5QRSBpZiAncGF0aCcgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgVHJlZVJlbW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHRyZWVOYW1lLCBPYmplY3RbXSBwYXRoKSB7Ci0JCXN1cGVyKHNvdXJjZSwgdHJlZU5hbWUpOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIHBhcnQgb2YgdGhlIHRyZWUgdGhhdCB3YXMgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5wYXRoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgVHJlZVJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMudHJlZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIHRyZWUgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIHRyZWUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgVHJlZVJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld1RyZWVOYW1lKSB7Ci0JCXJldHVybiBuZXcgVHJlZVJlbW92ZUV2ZW50KG5ld1NvdXJjZSwgbmV3VHJlZU5hbWUsIHRoaXMucGF0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NoYW5nZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwNjBkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VBZGFwdGVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCi0JLy8gKioqKiogc3RhdGUKLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLy8gKioqKiogcHJvcGVydHkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLy8gKioqKiogY29sbGVjdGlvbgotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvLyAqKioqKiBsaXN0Ci0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvLyAqKioqKiB0cmVlCi0JcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9DaGFuZ2VMaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjU4ZTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi0vKioKLSAqIEdlbmVyYWwgcHVycG9zZSBjaGFuZ2UgbGlzdGVuZXIuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENoYW5nZUxpc3RlbmVyCi0JZXh0ZW5kcyBTdGF0ZUNoYW5nZUxpc3RlbmVyLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIsIExpc3RDaGFuZ2VMaXN0ZW5lciwgVHJlZUNoYW5nZUxpc3RlbmVyCi17Ci0JLy8gY29tYmluZSB0aGUgb3RoZXIgbGlzdGVuZXIgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y3NWI5MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIENvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyIGltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4YjVjNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLQotLyoqCi0gKiBBICJjb2xsZWN0aW9uIGNoYW5nZSIgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBjb2xsZWN0aW9uLiBZb3UgY2FuIHJlZ2lzdGVyIGEgPGNvZGU+Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPC9jb2RlPiB3aXRoIGEgc291cmNlCi0gKiBtb2RlbCBzbyBhcyB0byBiZSBub3RpZmllZCBvZiBhbnkgYm91bmQgY29sbGVjdGlvbiB1cGRhdGVzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHRvIGEgYm91bmQgY29sbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSBjb2xsZWN0aW9uIHRoYXQgY2hhbmdlZCwgYW5kIHRoZSBpdGVtcyB0aGF0IHdlcmUgYWRkZWQuCi0JICovCi0Jdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGl0ZW1zIGFyZSByZW1vdmVkIGZyb20gYSBib3VuZCBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIGNvbGxlY3Rpb24gdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIGl0ZW1zIHRoYXQgd2VyZSByZW1vdmVkLgotCSAqLwotCXZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgYm91bmQgY29sbGVjdGlvbiBpcyBjbGVhcmVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UgCi0JICogYW5kIHRoZSBjb2xsZWN0aW9uIHRoYXQgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBib3VuZCBjb2xsZWN0aW9uIGlzIGNoYW5nZWQgaW4gYSBtYW5uZXIKLQkgKiB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieSB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGlzIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlIAotCSAqIGFuZCB0aGUgY29sbGVjdGlvbiB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29tbWFuZENoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29tbWFuZENoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZGEzNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbW1hbmRDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENoYW5nZUxpc3RlbmVyfS4KLSAqIEFsbCBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBhcmUgZnVubmVsZWQgdGhyb3VnaCBhIHNpbmdsZSBjb21tYW5kLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZENoYW5nZUxpc3RlbmVyCi0JZXh0ZW5kcyBTaW1wbGVDaGFuZ2VMaXN0ZW5lcgotewotCXByb3RlY3RlZCBmaW5hbCBDb21tYW5kIGNvbW1hbmQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCBleGVjdXRlcyB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgd2hlbmV2ZXIKLQkgKiBpdCByZWNlaXZlcyBhbnkgY2hhbmdlIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBtb2RlbCB0byB3aGljaCBpdCBpcyBhZGRlZAotCSAqIGFzIGEgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIENvbW1hbmRDaGFuZ2VMaXN0ZW5lcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoKSB7Ci0JCXRoaXMuY29tbWFuZC5leGVjdXRlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9MaXN0Q2hhbmdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWY4NmZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9MaXN0Q2hhbmdlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTGlzdENoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIExpc3RDaGFuZ2VBZGFwdGVyIGltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIExpc3RDaGFuZ2VBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Mzg3M2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0xpc3RDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotCi0vKioKLSAqIEEgImxpc3QgY2hhbmdlIiBldmVudCBnZXRzIGZpcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIGxpc3QuIFlvdSBjYW4gcmVnaXN0ZXIgYSA8Y29kZT5MaXN0Q2hhbmdlTGlzdGVuZXI8L2NvZGU+IHdpdGggYSBzb3VyY2UKLSAqIG1vZGVsIHNvIGFzIHRvIGJlIG5vdGlmaWVkIG9mIGFueSBib3VuZCBsaXN0IHVwZGF0ZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpc3RDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBpdGVtcyBhcmUgYWRkZWQgdG8gYSBib3VuZCBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIGxpc3QgdGhhdCBjaGFuZ2VkLCB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkLCBhbmQgdGhlIGluZGV4Ci0JICogYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgYWRkZWQuCi0JICovCi0Jdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGl0ZW1zIGFyZSByZW1vdmVkIGZyb20gYSBib3VuZCBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIGxpc3QgdGhhdCBjaGFuZ2VkLCB0aGUgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQsIGFuZCB0aGUgaW5kZXgKLQkgKiBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSByZW1vdmVkLgotCSAqLwotCXZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGl0ZW1zIGluIGEgYm91bmQgbGlzdCBhcmUgcmVwbGFjZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgbGlzdCB0aGF0IGNoYW5nZWQsIHRoZSBpdGVtcyB0aGF0IHdlcmUgYWRkZWQsIHRoZSBpdGVtcyB0aGF0IHdlcmUKLQkgKiByZXBsYWNlZCwgYW5kIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSByZXBsYWNlZC4KLQkgKi8KLQl2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGl0ZW1zIGluIGEgYm91bmQgbGlzdCBhcmUgbW92ZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgbGlzdCB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgaW5kaWNlcyBvZiB3aGVyZSBpdGVtcyB3ZXJlIG1vdmVkCi0JICogZnJvbSBhbmQgdG8uCi0JICovCi0Jdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIGJvdW5kIGxpc3QgaXMgY2xlYXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBMaXN0Q2xlYXJFdmVudCBvYmplY3QgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlIAotCSAqIGFuZCB0aGUgbGlzdCB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgYm91bmQgbGlzdCBpcyBjaGFuZ2VkIGluIGEgbWFubmVyCi0JICogdGhhdCBpcyBub3QgZWFzaWx5IGNoYXJhY3Rlcml6ZWQgYnkgdGhlIG90aGVyIG1ldGhvZHMgaW4gdGhpcyBpbnRlcmZhY2UuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEEgTGlzdENoYW5nZUV2ZW50IG9iamVjdCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UgCi0JICogYW5kIHRoZSBsaXN0IHRoYXQgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9NdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL011bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYmRkOGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL011bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHtAbGluayBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXJ9IHdoZW4gdGhlIHJlcXVlc3RlZCBsaXN0ZW5lcgotICogbmVlZHMgdG8gaW1wbGVtZW50IG11bHRpcGxlIG1ldGhvZHMgKGkuZS4ge0BsaW5rIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcn0sCi0gKiB7QGxpbmsgTGlzdENoYW5nZUxpc3RlbmVyfSwgb3Ige0BsaW5rIFRyZWVDaGFuZ2VMaXN0ZW5lcn0pLgotICovCi1jbGFzcyBNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcgotCWV4dGVuZHMgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyIAotCWltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLCBMaXN0Q2hhbmdlTGlzdGVuZXIsIFRyZWVDaGFuZ2VMaXN0ZW5lcgotewotCS8qKiB0aGUgbWV0aG9kcyB3ZSB3aWxsIGludm9rZSBvbiB0aGUgdGFyZ2V0IG9iamVjdCAqLwotCXByaXZhdGUgZmluYWwgTWV0aG9kIGFkZE1ldGhvZDsKLQlwcml2YXRlIGZpbmFsIE1ldGhvZCByZW1vdmVNZXRob2Q7Ci0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgcmVwbGFjZU1ldGhvZDsJLy8gdGhpcyBjYW4gYmUgbnVsbAotCXByaXZhdGUgZmluYWwgTWV0aG9kIG1vdmVNZXRob2Q7CS8vIHRoaXMgY2FuIGJlIG51bGwKLQlwcml2YXRlIGZpbmFsIE1ldGhvZCBjbGVhck1ldGhvZDsKLQlwcml2YXRlIGZpbmFsIE1ldGhvZCBjaGFuZ2VNZXRob2Q7Ci0KLQotCS8qKgotCSAqIFRoZSAicmVwbGFjZSIgYW5kICJtb3ZlIiBtZXRob2RzIGFyZSBvcHRpb25hbC4KLQkgKi8KLQlNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgYWRkTWV0aG9kLCBNZXRob2QgcmVtb3ZlTWV0aG9kLCBNZXRob2QgcmVwbGFjZU1ldGhvZCwgTWV0aG9kIG1vdmVNZXRob2QsIE1ldGhvZCBjbGVhck1ldGhvZCwgTWV0aG9kIGNoYW5nZU1ldGhvZCkgewotCQlzdXBlcih0YXJnZXQpOwotCQl0aGlzLmFkZE1ldGhvZCA9IGFkZE1ldGhvZDsKLQkJdGhpcy5yZW1vdmVNZXRob2QgPSByZW1vdmVNZXRob2Q7Ci0JCXRoaXMucmVwbGFjZU1ldGhvZCA9IHJlcGxhY2VNZXRob2Q7Ci0JCXRoaXMubW92ZU1ldGhvZCA9IG1vdmVNZXRob2Q7Ci0JCXRoaXMuY2xlYXJNZXRob2QgPSBjbGVhck1ldGhvZDsKLQkJdGhpcy5jaGFuZ2VNZXRob2QgPSBjaGFuZ2VNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogTm8gInJlcGxhY2UiIG9yICJtb3ZlIiBtZXRob2RzLgotCSAqLwotCU11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBhZGRNZXRob2QsIE1ldGhvZCByZW1vdmVNZXRob2QsIE1ldGhvZCBjbGVhck1ldGhvZCwgTWV0aG9kIGNoYW5nZU1ldGhvZCkgewotCQl0aGlzKHRhcmdldCwgYWRkTWV0aG9kLCByZW1vdmVNZXRob2QsIG51bGwsIG51bGwsIGNsZWFyTWV0aG9kLCBjaGFuZ2VNZXRob2QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGludm9rZShNZXRob2QgbWV0aG9kLCBDb2xsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBFTVBUWV9PQkpFQ1RfQVJSQVkpOwotCQl9IGVsc2UgewotCQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobWV0aG9kLCB0aGlzLnRhcmdldCwgbmV3IENvbGxlY3Rpb25FdmVudFtdIHtldmVudH0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5hZGRNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMucmVtb3ZlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jbGVhck1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNoYW5nZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGludm9rZShNZXRob2QgbWV0aG9kLCBMaXN0RXZlbnQgZXZlbnQpIHsKLQkJaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBFTVBUWV9PQkpFQ1RfQVJSQVkpOwotCQl9IGVsc2UgewotCQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobWV0aG9kLCB0aGlzLnRhcmdldCwgbmV3IExpc3RFdmVudFtdIHtldmVudH0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5hZGRNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMucmVtb3ZlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMucmVwbGFjZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLm1vdmVNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNsZWFyTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuY2hhbmdlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRyZWVDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgaW52b2tlKE1ldGhvZCBtZXRob2QsIFRyZWVFdmVudCBldmVudCkgewotCQlpZiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDApIHsKLQkJCVJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKG1ldGhvZCwgdGhpcy50YXJnZXQsIEVNUFRZX09CSkVDVF9BUlJBWSk7Ci0JCX0gZWxzZSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBuZXcgVHJlZUV2ZW50W10ge2V2ZW50fSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuYWRkTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMucmVtb3ZlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jbGVhck1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNoYW5nZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDBiZGY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Qcm9wZXJ0eUNoYW5nZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyfS4KLSAqIFRoaXMgaXMgcHJvYmFibHkgb2YgbGltaXRlZCB1c2UsIHNpbmNlIHRoZXJlIG9ubHkgYSBzaW5nbGUgbWV0aG9kIHRvIGltcGxlbWVudDsKLSAqIG1heWJlIGFzIGEgbnVsbCBpbXBsZW1lbnRhdGlvbi4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhbmdlQWRhcHRlciBpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOWQ0MDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQSAicHJvcGVydHkgY2hhbmdlIiBldmVudCBnZXRzIGZpcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIHByb3BlcnR5LiBZb3UgY2FuIHJlZ2lzdGVyIGEgPGNvZGU+UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjwvY29kZT4gd2l0aCBhIHNvdXJjZQotICogbW9kZWwgc28gYXMgdG8gYmUgbm90aWZpZWQgb2YgYW55IGJvdW5kIHByb3BlcnR5IHVwZGF0ZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBtb2RlbCBoYXMgY2hhbmdlZCBhIGJvdW5kIHByb3BlcnR5LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UKLQkgKiBhbmQgdGhlIHByb3BlcnR5J3Mgb2xkIGFuZCBuZXcgdmFsdWVzLgotCSAqLwotCXZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDBkNTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLQotLyoqCi0gKiBUaGlzIGZhY3RvcnkgYnVpbGRzIGxpc3RlbmVycyB0aGF0IHJlZmxlY3RpdmVseSBmb3J3YXJkIGNoYW5nZSBldmVudHMuCi0gKiBJZiB5b3UgYXJlIHdvcnJpZWQgYWJvdXQgaGF2aW5nIHRvbyBtYW55IGxpdHRsZSBjbGFzc2VzIHRoYXQgaGF2ZSB0byBiZQotICogbG9hZGVkIGFuZCBtYWludGFpbmVkIGJ5IHRoZSBjbGFzcyBsb2FkZXIsIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGVzZS4KLSAqIE9mIGNvdXJzZSwgdGhpcyBjb21lcyB3aXRoIHRoZSBhZGRpdGlvbmFsIG92ZXJoZWFkIG9mIHJlZmxlY3Rpb24uLi4uCi0gKiBBbHNvIG5vdGUgdGhhdCB0aGUgdmFsaWRpdHkgb2YgdGhlIG1ldGhvZCBuYW1lIGlzIG5vdCBjaGVja2VkIGF0IGNvbXBpbGUKLSAqIHRpbWUsIGJ1dCBhdCBydW50aW1lOyBhbHRob3VnaCB3ZSA8ZW0+ZG88L2VtPiBjaGVjayB0aGUgbWV0aG9kIGFzIHNvb24gYXMgdGhlCi0gKiBsaXN0ZW5lciBpcyBpbnN0YW50aWF0ZWQuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqIHRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHdlIHdpbGwgaW52b2tlIHRoZSBtZXRob2QgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IHRhcmdldDsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxTdGF0ZUNoYW5nZUV2ZW50PiBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1MgPSBTdGF0ZUNoYW5nZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8U3RhdGVDaGFuZ2VFdmVudD5bXSBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7U1RBVEVfQ0hBTkdFX0VWRU5UX0NMQVNTfTsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxQcm9wZXJ0eUNoYW5nZUV2ZW50PiBQUk9QRVJUWV9DSEFOR0VfRVZFTlRfQ0xBU1MgPSBQcm9wZXJ0eUNoYW5nZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8UHJvcGVydHlDaGFuZ2VFdmVudD5bXSBQUk9QRVJUWV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7UFJPUEVSVFlfQ0hBTkdFX0VWRU5UX0NMQVNTfTsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uRXZlbnQ+IENPTExFQ1RJT05fRVZFTlRfQ0xBU1MgPSBDb2xsZWN0aW9uRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uRXZlbnQ+W10gQ09MTEVDVElPTl9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtDT0xMRUNUSU9OX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkFkZEV2ZW50PiBDT0xMRUNUSU9OX0FERF9FVkVOVF9DTEFTUyA9IENvbGxlY3Rpb25BZGRFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25BZGRFdmVudD5bXSBDT0xMRUNUSU9OX0FERF9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtDT0xMRUNUSU9OX0FERF9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25SZW1vdmVFdmVudD4gQ09MTEVDVElPTl9SRU1PVkVfRVZFTlRfQ0xBU1MgPSBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uUmVtb3ZlRXZlbnQ+W10gQ09MTEVDVElPTl9SRU1PVkVfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7Q09MTEVDVElPTl9SRU1PVkVfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uQ2xlYXJFdmVudD4gQ09MTEVDVElPTl9DTEVBUl9FVkVOVF9DTEFTUyA9IENvbGxlY3Rpb25DbGVhckV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkNsZWFyRXZlbnQ+W10gQ09MTEVDVElPTl9DTEVBUl9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtDT0xMRUNUSU9OX0NMRUFSX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkNoYW5nZUV2ZW50PiBDT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9DTEFTUyA9IENvbGxlY3Rpb25DaGFuZ2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25DaGFuZ2VFdmVudD5bXSBDT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtDT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9DTEFTU307Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdEV2ZW50PiBMSVNUX0VWRU5UX0NMQVNTID0gTGlzdEV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdEV2ZW50PltdIExJU1RfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7TElTVF9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RBZGRFdmVudD4gTElTVF9BRERfRVZFTlRfQ0xBU1MgPSBMaXN0QWRkRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0QWRkRXZlbnQ+W10gTElTVF9BRERfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7TElTVF9BRERfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0UmVtb3ZlRXZlbnQ+IExJU1RfUkVNT1ZFX0VWRU5UX0NMQVNTID0gTGlzdFJlbW92ZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdFJlbW92ZUV2ZW50PltdIExJU1RfUkVNT1ZFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0xJU1RfUkVNT1ZFX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdFJlcGxhY2VFdmVudD4gTElTVF9SRVBMQUNFX0VWRU5UX0NMQVNTID0gTGlzdFJlcGxhY2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RSZXBsYWNlRXZlbnQ+W10gTElTVF9SRVBMQUNFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0xJU1RfUkVQTEFDRV9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RNb3ZlRXZlbnQ+IExJU1RfTU9WRV9FVkVOVF9DTEFTUyA9IExpc3RNb3ZlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0TW92ZUV2ZW50PltdIExJU1RfTU9WRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtMSVNUX01PVkVfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0Q2xlYXJFdmVudD4gTElTVF9DTEVBUl9FVkVOVF9DTEFTUyA9IExpc3RDbGVhckV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdENsZWFyRXZlbnQ+W10gTElTVF9DTEVBUl9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtMSVNUX0NMRUFSX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdENoYW5nZUV2ZW50PiBMSVNUX0NIQU5HRV9FVkVOVF9DTEFTUyA9IExpc3RDaGFuZ2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RDaGFuZ2VFdmVudD5bXSBMSVNUX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtMSVNUX0NIQU5HRV9FVkVOVF9DTEFTU307Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUV2ZW50PiBUUkVFX0VWRU5UX0NMQVNTID0gVHJlZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUV2ZW50PltdIFRSRUVfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7VFJFRV9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVBZGRFdmVudD4gVFJFRV9BRERfRVZFTlRfQ0xBU1MgPSBUcmVlQWRkRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlQWRkRXZlbnQ+W10gVFJFRV9BRERfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7VFJFRV9BRERfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlUmVtb3ZlRXZlbnQ+IFRSRUVfUkVNT1ZFX0VWRU5UX0NMQVNTID0gVHJlZVJlbW92ZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZVJlbW92ZUV2ZW50PltdIFRSRUVfUkVNT1ZFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge1RSRUVfUkVNT1ZFX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUNsZWFyRXZlbnQ+IFRSRUVfQ0xFQVJfRVZFTlRfQ0xBU1MgPSBUcmVlQ2xlYXJFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVDbGVhckV2ZW50PltdIFRSRUVfQ0xFQVJfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7VFJFRV9DTEVBUl9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVDaGFuZ2VFdmVudD4gVFJFRV9DSEFOR0VfRVZFTlRfQ0xBU1MgPSBUcmVlQ2hhbmdlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlQ2hhbmdlRXZlbnQ+W10gVFJFRV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7VFJFRV9DSEFOR0VfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCi0KLQkvLyAqKioqKioqKioqIGhlbHBlciBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEZpbmQgYW5kIHJldHVybiBhIG1ldGhvZCBpbXBsZW1lbnRlZCBieSB0aGUgdGFyZ2V0IHRoYXQgY2FuIGJlIGludm9rZWQKLQkgKiByZWZsZWN0aXZlbHkgd2hlbiBhIGNoYW5nZSBldmVudCBvY2N1cnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZChPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8PyBleHRlbmRzIENoYW5nZUV2ZW50PltdIGV2ZW50Q2xhc3NBcnJheSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlZmxlY3Rpb25Ub29scy5nZXRNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBldmVudENsYXNzQXJyYXkpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4MSkgewotCQkJcmV0dXJuIFJlZmxlY3Rpb25Ub29scy5nZXRNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtZXRob2QgaXMgc3VpdGFibGUgZm9yIGJlaW5nIGludm9rZWQgd2hlbiBhCi0JICogY2hhbmdlIGV2ZW50IGhhcyBvY2N1cnJlZC4gVGhyb3cgYW4gZXhjZXB0aW9uIGlmIGl0IGlzIG5vdCBzdWl0YWJsZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoTWV0aG9kIG1ldGhvZCwgQ2xhc3M8PyBleHRlbmRzIENoYW5nZUV2ZW50PiBldmVudENsYXNzKSB7Ci0JCUNsYXNzPD8+W10gcGFybVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWludCBwYXJtVHlwZXNMZW5ndGggPSBwYXJtVHlwZXMubGVuZ3RoOwotCQlpZiAocGFybVR5cGVzTGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKHBhcm1UeXBlc0xlbmd0aCA9PSAxKSAmJiBwYXJtVHlwZXNbMF0uaXNBc3NpZ25hYmxlRnJvbShldmVudENsYXNzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obWV0aG9kLnRvU3RyaW5nKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHM6IFN0YXRlQ2hhbmdlTGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpIHsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChtZXRob2QsIFNUQVRFX0NIQU5HRV9FVkVOVF9DTEFTUyk7Ci0JCXJldHVybiBuZXcgU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsgb3RoZXJ3aXNlLAotCSAqIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIFNUQVRFX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHM6IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpIHsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChtZXRob2QsIFBST1BFUlRZX0NIQU5HRV9FVkVOVF9DTEFTUyk7Ci0JCXJldHVybiBuZXcgU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsgb3RoZXJ3aXNlLAotCSAqIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIFBST1BFUlRZX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHM6IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kcwotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBhZGRNZXRob2QsIE1ldGhvZCByZW1vdmVNZXRob2QsIE1ldGhvZCBjbGVhck1ldGhvZCwgTWV0aG9kIGNoYW5nZU1ldGhvZCkgewotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGFkZE1ldGhvZCwgQ09MTEVDVElPTl9BRERfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKHJlbW92ZU1ldGhvZCwgQ09MTEVDVElPTl9SRU1PVkVfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGNsZWFyTWV0aG9kLCBDT0xMRUNUSU9OX0NMRUFSX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjaGFuZ2VNZXRob2QsIENPTExFQ1RJT05fQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJcmV0dXJuIG5ldyBNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGFkZE1ldGhvZCwgcmVtb3ZlTWV0aG9kLCBjbGVhck1ldGhvZCwgY2hhbmdlTWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2RzCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGNoYW5nZSBldmVudHMuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOwotCSAqIG90aGVyd2lzZSwgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIGFkZE1ldGhvZE5hbWUsIFN0cmluZyByZW1vdmVNZXRob2ROYW1lLCBTdHJpbmcgY2xlYXJNZXRob2ROYW1lLCBTdHJpbmcgY2hhbmdlTWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoCi0JCQkJdGFyZ2V0LAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGFkZE1ldGhvZE5hbWUsIENPTExFQ1RJT05fQUREX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCByZW1vdmVNZXRob2ROYW1lLCBDT0xMRUNUSU9OX1JFTU9WRV9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2xlYXJNZXRob2ROYW1lLCBDT0xMRUNUSU9OX0NMRUFSX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjaGFuZ2VNZXRob2ROYW1lLCBDT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOwotCSAqIG90aGVyd2lzZSwgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgbWV0aG9kTmFtZSwgQ09MTEVDVElPTl9FVkVOVF9DTEFTU19BUlJBWSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHM6IExpc3RDaGFuZ2VMaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kcwotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBhZGRNZXRob2QsIE1ldGhvZCByZW1vdmVNZXRob2QsIE1ldGhvZCByZXBsYWNlTWV0aG9kLCBNZXRob2QgbW92ZU1ldGhvZCwgTWV0aG9kIGNsZWFyTWV0aG9kLCBNZXRob2QgY2hhbmdlTWV0aG9kKSB7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoYWRkTWV0aG9kLCBMSVNUX0FERF9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QocmVtb3ZlTWV0aG9kLCBMSVNUX1JFTU9WRV9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QocmVwbGFjZU1ldGhvZCwgTElTVF9SRVBMQUNFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChtb3ZlTWV0aG9kLCBMSVNUX01PVkVfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGNsZWFyTWV0aG9kLCBMSVNUX0NMRUFSX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjaGFuZ2VNZXRob2QsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJcmV0dXJuIG5ldyBNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGFkZE1ldGhvZCwgcmVtb3ZlTWV0aG9kLCByZXBsYWNlTWV0aG9kLCBtb3ZlTWV0aG9kLCBjbGVhck1ldGhvZCwgY2hhbmdlTWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kcwotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBjaGFuZ2UgZXZlbnRzLiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2QKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsKLQkgKiBvdGhlcndpc2UsIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBhZGRNZXRob2ROYW1lLCBTdHJpbmcgcmVtb3ZlTWV0aG9kTmFtZSwgU3RyaW5nIHJlcGxhY2VNZXRob2ROYW1lLCBTdHJpbmcgbW92ZU1ldGhvZE5hbWUsIFN0cmluZyBjbGVhck1ldGhvZE5hbWUsIFN0cmluZyBjaGFuZ2VNZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigKLQkJCQl0YXJnZXQsCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgYWRkTWV0aG9kTmFtZSwgTElTVF9BRERfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIHJlbW92ZU1ldGhvZE5hbWUsIExJU1RfUkVNT1ZFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCByZXBsYWNlTWV0aG9kTmFtZSwgTElTVF9SRVBMQUNFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtb3ZlTWV0aG9kTmFtZSwgTElTVF9NT1ZFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjbGVhck1ldGhvZE5hbWUsIExJU1RfQ0xFQVJfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGNoYW5nZU1ldGhvZE5hbWUsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgYW55IGNoYW5nZSBldmVudC4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7Ci0JICogb3RoZXJ3aXNlLCBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBMSVNUX0VWRU5UX0NMQVNTX0FSUkFZKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgbWV0aG9kczogVHJlZUNoYW5nZUxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2RzCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIGFkZE1ldGhvZCwgTWV0aG9kIHJlbW92ZU1ldGhvZCwgTWV0aG9kIGNsZWFyTWV0aG9kLCBNZXRob2QgY2hhbmdlTWV0aG9kKSB7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoYWRkTWV0aG9kLCBUUkVFX0FERF9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QocmVtb3ZlTWV0aG9kLCBUUkVFX1JFTU9WRV9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoY2xlYXJNZXRob2QsIFRSRUVfQ0xFQVJfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGNoYW5nZU1ldGhvZCwgVFJFRV9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQlyZXR1cm4gbmV3IE11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgYWRkTWV0aG9kLCByZW1vdmVNZXRob2QsIGNsZWFyTWV0aG9kLCBjaGFuZ2VNZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgYW55IGNoYW5nZSBldmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZHMKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgY2hhbmdlIGV2ZW50cy4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7Ci0JICogb3RoZXJ3aXNlLCBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgYWRkTWV0aG9kTmFtZSwgU3RyaW5nIHJlbW92ZU1ldGhvZE5hbWUsIFN0cmluZyBjbGVhck1ldGhvZE5hbWUsIFN0cmluZyBjaGFuZ2VNZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcigKLQkJCQl0YXJnZXQsCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgYWRkTWV0aG9kTmFtZSwgVFJFRV9BRERfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIHJlbW92ZU1ldGhvZE5hbWUsIFRSRUVfUkVNT1ZFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjbGVhck1ldGhvZE5hbWUsIFRSRUVfQ0xFQVJfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGNoYW5nZU1ldGhvZE5hbWUsIFRSRUVfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgYW55IGNoYW5nZSBldmVudC4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7Ci0JICogb3RoZXJ3aXNlLCBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBUUkVFX0VWRU5UX0NMQVNTX0FSUkFZKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU2ltcGxlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TaW1wbGVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjgzZDkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TaW1wbGVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBBbGwgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYXJlIGZ1bm5lbGVkIHRocm91Z2ggYSBzaW5nbGUgbWV0aG9kLgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBieQotICogc3ViY2xhc3NpbmcgaXQgYW5kIG92ZXJyaWRpbmcgZWl0aGVyIHtAbGluayAjbW9kZWxDaGFuZ2VkKENoYW5nZUV2ZW50KX0KLSAqIChpZiBhY2Nlc3MgdG8gdGhlIGV2ZW50IGlzIHJlcXVpcmVkKSBvciB7QGxpbmsgI21vZGVsQ2hhbmdlZCgpfSAoaWYgYWNjZXNzCi0gKiB0byB0aGUgZXZlbnQgaXMgbm90IHJlcXVpcmVkKS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbXBsZUNoYW5nZUxpc3RlbmVyCi0JaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lcgotewotCXB1YmxpYyBTaW1wbGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBub3RpZmllZCB0aGUgbGlzdGVuZXIgb2YgdGhlIGNoYW5nZSBkZXNjcmliZWQgYnkgdGhlCi0JICogc3BlY2lmaWVkIGNoYW5nZSBldmVudC4gQnkgZGVmYXVsdCB0aGUgbGlzdGVuZXIgZXhlY3V0ZXMge0BsaW5rICNtb2RlbENoYW5nZWQoKX0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgbm90aWZpZWQgdGhlIGxpc3RlbmVyIG9mIGEgY2hhbmdlLgotCSAqIEJ5IGRlZmF1bHQgdGhlIGxpc3RlbmVyIHRocm93cyBhbiBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMDg1NDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1NpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSB7QGxpbmsgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyfSB3aGVuIHRoZSByZXF1ZXN0ZWQgbGlzdGVuZXIKLSAqIG5lZWQgb25seSBpbXBsZW1lbnQgYSBzaW5nbGUgbWV0aG9kIChpLmUuIHtAbGluayBTdGF0ZUNoYW5nZUxpc3RlbmVyfSBvcgotICoge0BsaW5rIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJ9KS4KLSAqLwotY2xhc3MgU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyCi0JZXh0ZW5kcyBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIKLQlpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLXsKLQotCS8qKiB0aGUgbWV0aG9kIHdlIHdpbGwgaW52b2tlIG9uIHRoZSB0YXJnZXQgb2JqZWN0ICovCi0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgbWV0aG9kOwotCS8qKiBjYWNoZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBtZXRob2RJc1plcm9Bcmd1bWVudDsKLQotCVNpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JCXRoaXMubWV0aG9kID0gbWV0aG9kOwotCQl0aGlzLm1ldGhvZElzWmVyb0FyZ3VtZW50ID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN0YXRlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMubWV0aG9kSXNaZXJvQXJndW1lbnQpIHsKLQkJCVJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKHRoaXMubWV0aG9kLCB0aGlzLnRhcmdldCwgRU1QVFlfT0JKRUNUX0FSUkFZKTsKLQkJfSBlbHNlIHsKLQkJCVJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKHRoaXMubWV0aG9kLCB0aGlzLnRhcmdldCwgbmV3IFN0YXRlQ2hhbmdlRXZlbnRbXSB7ZXZlbnR9KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLm1ldGhvZElzWmVyb0FyZ3VtZW50KSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZCh0aGlzLm1ldGhvZCwgdGhpcy50YXJnZXQsIEVNUFRZX09CSkVDVF9BUlJBWSk7Ci0JCX0gZWxzZSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZCh0aGlzLm1ldGhvZCwgdGhpcy50YXJnZXQsIG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50W10ge2V2ZW50fSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TdGF0ZUNoYW5nZUFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TdGF0ZUNoYW5nZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiNzg1MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU3RhdGVDaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU3RhdGVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBUaGlzIGlzIHByb2JhYmx5IG9mIGxpbWl0ZWQgdXNlLCBzaW5jZSB0aGVyZSBvbmx5IGEgc2luZ2xlIG1ldGhvZCB0byBpbXBsZW1lbnQ7Ci0gKiBtYXliZSBhcyBhIG51bGwgaW1wbGVtZW50YXRpb24uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0ZUNoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBTdGF0ZUNoYW5nZUxpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TdGF0ZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU3RhdGVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDE4OWNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TdGF0ZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIEEgZ2VuZXJpYyAic3RhdGUgY2hhbmdlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgdG8gCi0gKiBzdWNoIGV4dGVudCB0aGF0IGl0IGNhbm5vdCBiZSBkZWxpbmVhdGVkIGFsbCBhc3BlY3RzIG9mIGl0IHRoYXQgaGF2ZSBjaGFuZ2VkLiAKLSAqIFlvdSBjYW4gcmVnaXN0ZXIgYSA8Y29kZT5TdGF0ZUNoYW5nZUxpc3RlbmVyPC9jb2RlPiB3aXRoIGEgc291cmNlIG1vZGVsIHNvIGFzIHRvIGJlIG5vdGlmaWVkIAotICogb2YgYW55IHN1Y2ggY2hhbmdlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdGVDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIG1vZGVsIGhhcyBjaGFuZ2VkIGluIHNvbWUgZ2VuZXJhbCBmYXNoaW9uLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UuCi0JICovCi0Jdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9UcmVlQ2hhbmdlQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MTMyOGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFRyZWVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlQ2hhbmdlQWRhcHRlciBpbXBsZW1lbnRzIFRyZWVDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBUcmVlQ2hhbmdlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjQwOGFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9UcmVlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotCi0vKioKLSAqIEEgInRyZWUgY2hhbmdlIiBldmVudCBnZXRzIGZpcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIHRyZWUuIFlvdSBjYW4gcmVnaXN0ZXIgYSA8Y29kZT5UcmVlQ2hhbmdlTGlzdGVuZXI8L2NvZGU+IHdpdGggYSBzb3VyY2UKLSAqIG1vZGVsIHNvIGFzIHRvIGJlIG5vdGlmaWVkIG9mIGFueSBib3VuZCB0cmVlIHVwZGF0ZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyZWVDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIG5vZGUgaXMgYWRkZWQgdG8gYSBib3VuZCB0cmVlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIHRyZWUgdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIHBhdGggdG8gdGhlIG5vZGUgdGhhdCB3YXMgYWRkZWQuCi0JICovCi0Jdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBub2RlIGlzIHJlbW92ZWQgZnJvbSBhIGJvdW5kIHRyZWUuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgcGF0aCB0byB0aGUgbm9kZSB0aGF0IHdhcyByZW1vdmVkLgotCSAqLwotCXZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBib3VuZCB0cmVlIGlzIGNsZWFyZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQsIGFuZCBhbiBlbXB0eSBwYXRoLgotCSAqLwotCXZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIHBvcnRpb24gb2YgYSBib3VuZCB0cmVlIGlzIGNoYW5nZWQgaW4KLQkgKiBhIG1hbm5lciB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieSB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGlzCi0JICogaW50ZXJmYWNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIHRyZWUgdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCi0JICogdHJlZSB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDVhZGU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCB0byBhYnN0cmFjdCBjb2xsZWN0aW9uIGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIHZhbHVlcyBoZWxkIGJ5IHRoZSBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBNb2RlbCwgSXRlcmFibGU8RT4KLXsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29sbGVjdGlvbidzIHZhbHVlcy4KLQkgKi8KLQlJdGVyYXRvcjxFPiBpdGVyYXRvcigpOwotCQlTdHJpbmcgVkFMVUVTID0gInZhbHVlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlpbnQgc2l6ZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvTGlzdFZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9MaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjQwMGQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9MaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIGFic3RyYWN0IGxpc3QgYWNjZXNzaW5nIGFuZAotICogY2hhbmdlIG5vdGlmaWNhdGlvbiBhbmQgbWFrZSBpdCBtb3JlIHBsdWdnYWJsZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIGxpc3QgbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgTW9kZWwsIEl0ZXJhYmxlPEU+Ci17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0J3MgdmFsdWVzLgotCSAqLwotCUl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBMSVNUX1ZBTFVFUyA9ICJsaXN0IHZhbHVlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCdzIHZhbHVlcy4KLQkgKi8KLQlMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxpc3QuCi0JICovCi0JaW50IHNpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoZSBsaXN0LgotCSAqLwotCUUgZ2V0KGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QncyB2YWx1ZXMuCi0JICovCi0JT2JqZWN0W10gdG9BcnJheSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzVlOWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIGFic3RyYWN0IHByb3BlcnR5IGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHZhbHVlIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBNb2RlbAotewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLgotCSAqLwotCVQgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0M2UzNGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1RyZWVOb2RlVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfSB0byBiZXR0ZXIgc3VwcG9ydAotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXJ9LgotICogPHA+Ci0gKiBJbXBsZW1lbnRvcnMgb2YgdGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGZpcmUgYSAic3RhdGUgY2hhbmdlIiBldmVudAotICogd2hlbmV2ZXIgdGhlIG5vZGUncyBpbnRlcm5hbCBzdGF0ZSBjaGFuZ2VzIGluIGEgd2F5IHRoYXQgdGhlCi0gKiB0cmVlIGxpc3RlbmVycyBzaG91bGQgYmUgbm90aWZpZWQuCi0gKiA8cD4KLSAqIEltcGxlbWVudG9ycyBvZiB0aGlzIGludGVyZmFjZSBzaG91bGQgYWxzbyBmaXJlIGEgInZhbHVlIHByb3BlcnR5IGNoYW5nZSIKLSAqIGV2ZW50IHdoZW5ldmVyIHRoZSBub2RlJ3MgdmFsdWUgY2hhbmdlcy4gVHlwaWNhbGx5LCBvbmx5IG5vZGVzIHRoYXQKLSAqIGhvbGQgInByaW1pdGl2ZSIgZGF0YSB3aWxsIGZpcmUgdGhpcyBldmVudC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIG1vZGVsCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBUcmVlTm9kZVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGUncyBwYXJlbnQgbm9kZTsgbnVsbCBpZiB0aGUgbm9kZQotCSAqIGlzIHRoZSByb290LgotCSAqLwotCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGF0aCB0byB0aGUgbm9kZS4KLQkgKi8KLQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHZhbHVlIG1vZGVsIG9mIHRoZSBub2RlJ3MgY2hpbGQgbm9kZXMuCi0JICovCi0JTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbk1vZGVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGUncyBjaGlsZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBjaGlsZChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub2RlJ3MgbGlzdCBvZiBjaGlsZHJlbi4KLQkgKi8KLQlpbnQgY2hpbGRyZW5TaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGluIHRoZSBub2RlJ3MgbGlzdCBvZiBjaGlsZHJlbiBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkLgotCSAqLwotCWludCBpbmRleE9mQ2hpbGQoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGNoaWxkKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgbGVhZiAoaS5lLiBpdCBoYXMgbm8gY2hpbGRyZW4pCi0JICovCi0JYm9vbGVhbiBpc0xlYWYoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1RyZWVWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmYTZmYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gYWJzdHJhY3QgdHJlZSBhY2Nlc3NpbmcgYW5kCi0gKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFuZCBtYWtlIGl0IG1vcmUgcGx1Z2dhYmxlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiB2YWx1ZXMgaGVsZCBieSB0aGUgbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBUcmVlVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgTW9kZWwKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRyZWUncyBub2Rlcy4KLQkgKi8KLQlJdGVyYXRvcjxFPiBub2RlcygpOwotCQlTdHJpbmcgTk9ERVMgPSAibm9kZXMiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2VjYjc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IHRvIGFsbG93IHRoZSBzZXR0aW5nIG9mIHRoZQotICogY29sbGVjdGlvbidzIHZhbHVlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLXsKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWVzIGFuZCBmaXJlIGEgY29sbGVjdGlvbiBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqIEBzZWUgQ29sbGVjdGlvblZhbHVlTW9kZWwjVkFMVUVTCi0JICovCi0Jdm9pZCBzZXRWYWx1ZXMoSXRlcmFibGU8RT4gdmFsdWVzKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1dyaXRhYmxlTGlzdFZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZUxpc3RWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOTZmNmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1dyaXRhYmxlTGlzdFZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWU7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBMaXN0VmFsdWVNb2RlbH0gdG8gYWxsb3cgdGhlIHNldHRpbmcgb2YgdGhlCi0gKiBsaXN0cydzIHZhbHVlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3JpdGFibGVMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQotCS8qKgotCSAqIFNldCB0aGUgbGlzdCB2YWx1ZXMgYW5kIGZpcmUgYSBsaXN0IGNoYW5nZSBub3RpZmljYXRpb24uCi0JICogQHNlZSBMaXN0VmFsdWVNb2RlbCNMSVNUX1ZBTFVFUwotCSAqLwotCXZvaWQgc2V0TGlzdFZhbHVlcyhJdGVyYWJsZTxFPiB2YWx1ZXMpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzIzMWQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gdG8gYWxsb3cgdGhlIHNldHRpbmcgb2YgdGhlIHByb3BlcnR5J3MgdmFsdWUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHZhbHVlIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBhbmQgZmlyZSBhIHByb3BlcnR5IGNoYW5nZSBub3RpZmljYXRpb24uCi0JICogQHNlZSBQcm9wZXJ0eVZhbHVlTW9kZWwjVkFMVUUKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFQgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jbGFzc3BhdGggYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NGQ2NDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb3JlLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uY3ZzaWdub3JlIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk2ZGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1qYXZhQ29tcGlsZXIuLi5hcmdzLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2NTYxZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MDQ0YWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDA3IDE0OjI2OjMyIEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOWQ1NDUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gTWF5IDI3IDE0OjU5OjE4IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDVlZGEyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuNC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkV4dGVuc2lvblRlc3RQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQudWksCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LmdlbiwKLSBvcmcuZWNsaXBzZS5qcHQuZGIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHksCi0gb3JnLmVjbGlwc2Uuc3d0LAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cyxvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cyIKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYWJvdXQuaHRtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzNiMjQxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2U9MS41Ci1qYXZhY1RhcmdldD0xLjUKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTU4Nzg5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEV4dGVuc2lvbiBUZXN0cwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnhtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1NzdjYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvRXh0ZW5zaW9uVGVzdFBsdWdpbi5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0V4dGVuc2lvblRlc3RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmZjk5My4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvRXh0ZW5zaW9uVGVzdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uVGVzdFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgRXh0ZW5zaW9uVGVzdFBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEV4dGVuc2lvblRlc3RQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHRlbnNpb25UZXN0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MTQzOWIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEFubm90YXRpb24+Ci17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAidGVzdEF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FUVFJJQlVURV9BTk5PVEFUSU9OX05BTUUgPSAidGVzdC5UZXN0QXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZy5URVNUX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX0FOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjM2ZmOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCW5ldyBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuVEVTVF9BVFRSSUJVVEVfQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKFRlc3RKcGFGYWN0b3J5KSBmYWN0b3J5KS5idWlsZEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDBmOGM4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhVGVzdFR5cGVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RZUEVfTUFQUElOR19LRVkgPSAidGVzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RZUEVfQU5OT1RBVElPTl9OQU1FID0gInRlc3QuVGVzdCI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIEphdmFUZXN0VHlwZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBURVNUX1RZUEVfQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gVEVTVF9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZURiSW5mbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0VHlwZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTM4YWIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0VHlwZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBKYXZhVGVzdFR5cGVNYXBwaW5nLlRFU1RfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0VHlwZU1hcHBpbmcuVEVTVF9UWVBFX0FOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVRlc3RUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKFRlc3RKcGFGYWN0b3J5KSBmYWN0b3J5KS5idWlsZEphdmFUZXN0VHlwZU1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFCYXNpY01hcHBpbmcuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUJhc2ljTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODE2YWY5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUJhc2ljTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFCYXNpY01hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFCYXNpY01hcHBpbmcKLXsKLQlwdWJsaWMgVGVzdEphdmFCYXNpY01hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKYXZhRW50aXR5LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyM2Y5Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKLQotcHVibGljIGNsYXNzIFRlc3RKYXZhRW50aXR5IGV4dGVuZHMgQWJzdHJhY3RKYXZhRW50aXR5Ci17Ci0JcHJvdGVjdGVkIFRlc3RKYXZhRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUNhY2hlYWJsZTJfMCBnZXRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYUZhY3RvcnkuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTA4Y2EzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SnBhRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0SnBhRmFjdG9yeQotewotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRW50aXR5IGJ1aWxkSmF2YUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgVGVzdEphdmFFbnRpdHkocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFCYXNpY01hcHBpbmcgYnVpbGRKYXZhQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFRlc3RKYXZhQmFzaWNNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVGVzdFR5cGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RUeXBlTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YVRlc3RUeXBlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1GYWN0b3J5LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDk2NDNkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm1GYWN0b3J5LlNpbXBsZVZlcnNpb247Ci0KLS8qKgotICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgSlBBIHBsYXRmb3JtIHNob3VsZCBiZSAic3RhdGljIiAoaS5lLiB1bmNoYW5naW5nIG9uY2UKLSAqIGl0IGlzIGluaXRpYWxpemVkKS4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGVzdEpwYVBsYXRmb3JtRmFjdG9yeQotCWltcGxlbWVudHMgSnBhUGxhdGZvcm1GYWN0b3J5Ci17Ci0JLyoqCi0JICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBUZXN0SnBhUGxhdGZvcm1GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhUGxhdGZvcm0gYnVpbGRKcGFQbGF0Zm9ybShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm0oCi0JCQlpZCwKLQkJCWJ1aWxkSnBhVmVyc2lvbigpLAotCQkJbmV3IFRlc3RKcGFGYWN0b3J5KCksIAotCQkJbmV3IEdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIoR2VuZXJpY0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSksIAotCQkJVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCWJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSk7Ci0JfQotCQotCXByaXZhdGUgSnBhUGxhdGZvcm0uVmVyc2lvbiBidWlsZEpwYVZlcnNpb24oKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVmVyc2lvbihKcGFGYWNldC5WRVJTSU9OXzFfMC5nZXRWZXJzaW9uU3RyaW5nKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQkJCXJldHVybiAiQk9PT1lBSCEiOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1WYXJpYXRpb24gYnVpbGRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJCXB1YmxpYyBTdXBwb3J0ZWQgZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpIHsKLQkJCQlyZXR1cm4gU3VwcG9ydGVkLk1BWUJFOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gaXNKb2luVGFibGVPdmVycmlkYWJsZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2YjczZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLlJlc291cmNlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSmF2YVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5Pcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW50aXR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpY1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVByb3ZpZGVyCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiY29yZS50ZXN0SnBhUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1Qcm92aWRlciBJTlNUQU5DRSA9IAotCQkJbmV3IFRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBUZXN0SnBhUGxhdGZvcm1Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBtb2RlbHMgKioqKioqKioqKgotCQotCXB1YmxpYyBKcGFSZXNvdXJjZVR5cGUgZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZShJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRDb3JlUGx1Z2luLkpBVkFfU09VUkNFX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvcmVQbHVnaW4uSkFSX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRDb3JlUGx1Z2luLkpBUl9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMV8wX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjb250ZW50VHlwZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gYnVpbGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCkgewotCQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCi0JCXJldHVybiBuZXcgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gewotCQkJSmF2YVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCl9OwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIEphdmEgdHlwZSBtYXBwaW5ncyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSBidWlsZE5vbk51bGxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKLQkJLy8gb3JkZXIgZGV0ZXJtaW5lZCBieSBhbmFseXppbmcgb3JkZXIgdGhhdCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gKHRvcGxpbmspIHVzZXMKLQkJcmV0dXJuIG5ldyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQkJSmF2YUVudGl0eURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFbWJlZGRhYmxlRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsgIC8vIGFkZGVkCi0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGROb25OdWxsRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCS8vIG9yZGVyIGRldGVybWluZWQgYnkgYW5hbHl6aW5nIG9yZGVyIHRoYXQgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uICh0b3BsaW5rKSB1c2VzCi0JCXJldHVybiBuZXcgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQkJSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGROb25OdWxsU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKLQkJLy8gb3JkZXIgZGV0ZXJtaW5lZCBieSBhbmFseXppbmcgb3JkZXIgdGhhdCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gKHRvcGxpbmspIHVzZXMKLQkJcmV0dXJuIG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCQlKYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsgLy8gYWRkZWQKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBNYXBwaW5nIEZpbGVzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVzb3VyY2VEZWZpbml0aW9uW10gYnVpbGRSZXNvdXJjZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFJlc291cmNlRGVmaW5pdGlvbltdIHsKLQkJCUdlbmVyaWNQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUdlbmVyaWNPcm1YbWxEZWZpbml0aW9uLmluc3RhbmNlKCl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyMGRkMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWNKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWNOYXZpZ2F0b3JQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFRlc3RKcGFQbGF0Zm9ybVVpRmFjdG9yeSBpbXBsZW1lbnRzIEpwYVBsYXRmb3JtVWlGYWN0b3J5Ci17Ci0KLQkvKioKLQkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIFRlc3RKcGFQbGF0Zm9ybVVpRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm1VaSBidWlsZEpwYVBsYXRmb3JtVWkoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYVBsYXRmb3JtVWkoCi0JCQluZXcgR2VuZXJpY05hdmlnYXRvclByb3ZpZGVyKCksCi0JCQlHZW5lcmljSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4ZDkxYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5jdnNpZ25vcmUgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViMDEyNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyM2QwYzcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgSmFuIDE1IDExOjExOjExIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOWQ1NDUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gTWF5IDI3IDE0OjU5OjE4IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTljOGU0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5KcHREYlRlc3RzUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmU7YnVuZGxlLXZlcnNpb249IjEuMC4xIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbDtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuZGI7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3Jtczt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2Fib3V0Lmh0bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI3YWI4Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvZGVyYnkucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL2RlcmJ5LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MmQxNTYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvZGVyYnkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsIGZvciBEZXJieQotdXNlcklEID0gCi1wYXNzd29yZCA9IAotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L2RlcmJ5L2xpYi9kZXJieS5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQgZm9yIERlcmJ5Ci0jIHVybCA9IGpkYmM6ZGVyYnk6QzovZGVyYnkvZGF0YS90ZXN0ZGI7Y3JlYXRlPXRydWUKLXVybCA9IApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvbXlzcWwucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL215c3FsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDA3ZGUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvbXlzcWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSAKLXBhc3N3b3JkID0gCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovbXlzcWwvbXlzcWwtY29ubmVjdG9yLWphdmEtNS4wLjYtYmluLmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyBvcHRpb25hbCBmb3IgTXlTUUwKLSMgdXJsID0gamRiYzpteXNxbDovL2xvY2FsaG9zdDozMzA2CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGUxMGcucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjkxMWI0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29uZmlndXJlIHRoZSB3b3Jrc3BhY2UtIGFuZCBkYXRhYmFzZSBzZXJ2ZXItc3BlY2lmaWMgc2V0dGluZ3MgaGVyZS4KLQotIyB1c2VyIGFuZCBwYXNzd29yZCBhcmUgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KLXVzZXJJRCA9IHNjb3R0Ci1wYXNzd29yZCA9IHRpZ2VyCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovb3JhY2xlL2pkYmMvbGliL29qZGJjNS5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQKLSMgdXJsID0gamRiYzpvcmFjbGU6dGhpbjpAbG9jYWxob3N0OjE1MjE6dGVzdGRiCi11cmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZ1hFLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGUxMGdYRS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjdjMDFhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZ1hFLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gc2NvdHQKLXBhc3N3b3JkID0gdGlnZXIKLQotIyB0aGUgSkRCQyBkcml2ZXIgSkFSKHMpIG11c3QgYmUgc3BlY2lmaWVkOwotIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgSkFScywgc2VwYXJhdGUgdGhlIG5hbWVzIHdpdGggY29tbWFzCi0jIGphcnMgPSBDOi9vcmFjbGUvamRiYy9saWIvb2pkYmM1LmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZAotIyB1cmwgPSBqZGJjOm9yYWNsZTp0aGluOkBsb2NhbGhvc3Q6MTUyMTpYRQotdXJsID0gCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGU5aS5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlOWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI5MTFiNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGU5aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29uZmlndXJlIHRoZSB3b3Jrc3BhY2UtIGFuZCBkYXRhYmFzZSBzZXJ2ZXItc3BlY2lmaWMgc2V0dGluZ3MgaGVyZS4KLQotIyB1c2VyIGFuZCBwYXNzd29yZCBhcmUgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KLXVzZXJJRCA9IHNjb3R0Ci1wYXNzd29yZCA9IHRpZ2VyCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovb3JhY2xlL2pkYmMvbGliL29qZGJjNS5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQKLSMgdXJsID0gamRiYzpvcmFjbGU6dGhpbjpAbG9jYWxob3N0OjE1MjE6dGVzdGRiCi11cmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3Bvc3RncmVzcWwucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3Bvc3RncmVzcWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJmYWZlNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9wb3N0Z3Jlc3FsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gCi1wYXNzd29yZCA9IAotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L3Bvc3RncmVzcWwvamRiYy9wb3N0Z3Jlc3FsLTguMi01MDUuamRiYzMuamFyCi1qYXJzID0gCi0KLSMgdGhlIEpEQkMgVVJMIGlzIG9wdGlvbmFsIGZvciBQb3N0Z3JlU1FMCi0jIHVybCA9IGpkYmM6cG9zdGdyZXNxbApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvc3Fsc2VydmVyLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9zcWxzZXJ2ZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyYjY0NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9zcWxzZXJ2ZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSAKLXBhc3N3b3JkID0gCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovc3Fsc2VydmVyL2xpYi9zcWxqZGJjLmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZAotIyB1cmwgPSBqZGJjOnNxbHNlcnZlcjovL2xvY2FsaG9zdDoxNDMzCi11cmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3N5YmFzZS5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvc3liYXNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5M2Q1ZDQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvc3liYXNlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gCi1wYXNzd29yZCA9IAotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L3N5YmFzZS9saWIvamNvbm4zLmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZAotIyB1cmwgPSBqZGJjOnN5YmFzZTpUZHM6bG9jYWxob3N0OjUwMDAKLXVybCA9IApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOTg3NzkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSlBBIERCIFRlc3RzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSkRCQ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSkRCQ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDVkNzYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pEQkNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5Ecml2ZXJNYW5hZ2VyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFRoZXNlIGFyZW4ndCB0ZXN0cy4gVGhleSBhcmUganVzdCBhbiBlYXN5IHdheSB0byBkdW1wIEpEQkMgbWV0YWRhdGEgdG8gdGhlCi0gKiBjb25zb2xlLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKREJDVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSkRCQ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZXJieSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmR1bXBNZXRhRGF0YShERVJCWSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE15U1FMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZHVtcE1ldGFEYXRhKE1ZU1FMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JhY2xlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZHVtcE1ldGFEYXRhKE9SQUNMRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBvc3RncmVTUUwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5kdW1wTWV0YURhdGEoUE9TVEdSRVNRTCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5YmFzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmR1bXBNZXRhRGF0YShTWUJBU0UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBNZXRhRGF0YShDb25uZWN0aW9uQ29uZmlnIGNvbmZpZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKiogUExBVEZPUk06ICIgKyBjb25maWcucGxhdGZvcm1OYW1lICsgIiAqKioqKiIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJQ2xhc3MuZm9yTmFtZShjb25maWcuZHJpdmVyQ2xhc3NOYW1lKTsKLQkJQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gRHJpdmVyTWFuYWdlci5nZXRDb25uZWN0aW9uKHRoaXMuYnVpbGRVUkwoY29uZmlnKSwgY29uZmlnLnVzZXIsIGNvbmZpZy5wYXNzd29yZCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQ0FUQUxPR1M6Iik7Ci0JCUpEQkNUb29scy5kdW1wKGNvbm5lY3Rpb24uZ2V0TWV0YURhdGEoKS5nZXRDYXRhbG9ncygpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiU0NIRU1BVEE6Iik7Ci0JCUpEQkNUb29scy5kdW1wKGNvbm5lY3Rpb24uZ2V0TWV0YURhdGEoKS5nZXRTY2hlbWFzKCkpOwotCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRVUkwoQ29ubmVjdGlvbkNvbmZpZyBjb25maWcpIHsKLQkJcmV0dXJuICJqZGJjOiIgKyBjb25maWcuZGF0YWJhc2VVUkw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb25uZWN0aW9uQ29uZmlnIERFUkJZID0KLQkJbmV3IENvbm5lY3Rpb25Db25maWcoCi0JCQkiRGVyYnkiLAotCQkJIm9yZy5hcGFjaGUuZGVyYnkuamRiYy5FbWJlZGRlZERyaXZlciIsCi0JCQkiZGVyYnk6QzovZGVyYnkvZGF0YS90ZXN0IiwKLQkJCW51bGwsCi0JCQludWxsCi0JCSk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbm5lY3Rpb25Db25maWcgTVlTUUwgPQotCQluZXcgQ29ubmVjdGlvbkNvbmZpZygKLQkJCSJNeVNRTCIsCi0JCQkiY29tLm15c3FsLmpkYmMuRHJpdmVyIiwKLQkJCSJteXNxbDovL2xvY2FsaG9zdDozMzA2IiwKLQkJCSJyb290IiwKLQkJCSJvcmFjbGUiCi0JCSk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbm5lY3Rpb25Db25maWcgT1JBQ0xFID0KLQkJbmV3IENvbm5lY3Rpb25Db25maWcoCi0JCQkiT3JhY2xlIiwKLQkJCSJvcmFjbGUuamRiYy5PcmFjbGVEcml2ZXIiLAotCQkJIm9yYWNsZTp0aGluOkBsb2NhbGhvc3Q6MTUyMTpvcmNsIiwKLQkJCSJzY290dCIsCi0JCQkidGlnZXIiCi0JCSk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbm5lY3Rpb25Db25maWcgUE9TVEdSRVNRTCA9Ci0JCW5ldyBDb25uZWN0aW9uQ29uZmlnKAotCQkJIlBvc3RncmVTUUwiLAotCQkJIm9yZy5wb3N0Z3Jlc3FsLkRyaXZlciIsCi0JCQkicG9zdGdyZXNxbDpwb3N0Z3JlcyIsCi0JCQkicG9zdGdyZXMiLAotCQkJIm9yYWNsZSIKLQkJKTsKLQotCS8vIHRoZSBTeWJhc2Ugc2VydmVyIG11c3QgYmUgY29uZmlndXJlZCBleHBsaWNpdGx5IHRvICJsb2NhbGhvc3QiCi0JLy8gaW4gdGhlIGNvbmZpZyBmaWxlIFtTWUJBU0VdL2luaS9zcWwuaW5pCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb25uZWN0aW9uQ29uZmlnIFNZQkFTRSA9Ci0JCW5ldyBDb25uZWN0aW9uQ29uZmlnKAotCQkJIlN5YmFzZSIsCi0JCQkiY29tLnN5YmFzZS5qZGJjMy5qZGJjLlN5YkRyaXZlciIsCi0JCQkic3liYXNlOlRkczpsb2NhbGhvc3Q6NTAwMCIsCi0JCQkic2EiLAotCQkJIm9yYWNsZSIKLQkJKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQ29ubmVjdGlvbkNvbmZpZyB7Ci0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgcGxhdGZvcm1OYW1lOwotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGRyaXZlckNsYXNzTmFtZTsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBkYXRhYmFzZVVSTDsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyB1c2VyOwotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHBhc3N3b3JkOwotCQlwcm90ZWN0ZWQgQ29ubmVjdGlvbkNvbmZpZygKLQkJCQlTdHJpbmcgcGxhdGZvcm1OYW1lLAotCQkJCVN0cmluZyBkcml2ZXJDbGFzc05hbWUsCi0JCQkJU3RyaW5nIGRhdGFiYXNlVVJMLAotCQkJCVN0cmluZyB1c2VyLAotCQkJCVN0cmluZyBwYXNzd29yZAotCQkpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnBsYXRmb3JtTmFtZSA9IHBsYXRmb3JtTmFtZTsKLQkJCXRoaXMuZHJpdmVyQ2xhc3NOYW1lID0gZHJpdmVyQ2xhc3NOYW1lOwotCQkJdGhpcy5kYXRhYmFzZVVSTCA9IGRhdGFiYXNlVVJMOwotCQkJdGhpcy51c2VyID0gdXNlcjsKLQkJCXRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pEQkNUb29scy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pEQkNUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2M5OGZlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KREJDVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlc3VsdFNldEl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKREJDVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGR1bXAoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJZHVtcChleGVjdXRlKGNvbm5lY3Rpb24sIHNxbCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKFJlc3VsdFNldCByZXN1bHRTZXQpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsKLQkJLy8gc3luY2hyb25pemUgdGhlIGNvbnNvbGUgc28gZXZlcnl0aGluZyBpcyBjb250aWd1b3VzCi0JCXN5bmNocm9uaXplZCAoU3lzdGVtLm91dCkgewotCQkJZHVtcE9uKHJlc3VsdFNldCwgcHcpOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGR1bXBPbihSZXN1bHRTZXQgcmVzdWx0U2V0LCBQcmludFdyaXRlciBwdykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUFycmF5TGlzdDxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gbWFwcyA9IGNvbnZlcnRUb01hcHMocmVzdWx0U2V0KTsKLQkJZm9yIChJdGVyYXRvcjxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gbWFwU3RyZWFtID0gbWFwcy5pdGVyYXRvcigpOyBtYXBTdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cnlTdHJlYW0gPSBtYXBTdHJlYW0ubmV4dCgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgZW50cnlTdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gZW50cnlTdHJlYW0ubmV4dCgpOwotCQkJCXB3LnByaW50KGVudHJ5LmdldEtleSgpKTsKLQkJCQlwdy5wcmludCgiID0gIik7Ci0JCQkJcHcucHJpbnQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJfQotCQkJaWYgKG1hcFN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQlwdy5wcmludGxuKCk7Ci0JCQl9Ci0JCX0KLQkJcHcucHJpbnRsbigidG90YWwgcm93czogIiArIG1hcHMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gY29udmVydFRvTWFwcyhDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlyZXR1cm4gY29udmVydFRvTWFwcyhleGVjdXRlKGNvbm5lY3Rpb24sIHNxbCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzdWx0U2V0IGV4ZWN1dGUoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJU3RhdGVtZW50IHN0YXRlbWVudCA9IGNvbm5lY3Rpb24uY3JlYXRlU3RhdGVtZW50KCk7Ci0JCXN0YXRlbWVudC5leGVjdXRlKHNxbCk7Ci0JCVJlc3VsdFNldCByZXN1bHRTZXQgPSBzdGF0ZW1lbnQuZ2V0UmVzdWx0U2V0KCk7Ci0JCXN0YXRlbWVudC5jbG9zZSgpOwotCQlyZXR1cm4gcmVzdWx0U2V0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0PEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiBjb252ZXJ0VG9NYXBzKFJlc3VsdFNldCByZXN1bHRTZXQpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IHJvd3MgPSBuZXcgQXJyYXlMaXN0PEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PigpOwotCQlmb3IgKEl0ZXJhdG9yPEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiBzdHJlYW0gPSBidWlsZE1hcEl0ZXJhdG9yKHJlc3VsdFNldCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJcm93cy5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJvd3M7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gYnVpbGRNYXBJdGVyYXRvcihSZXN1bHRTZXQgcmVzdWx0U2V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBSZXN1bHRTZXRJdGVyYXRvcjxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4ocmVzdWx0U2V0LCBuZXcgTWFwUmVzdWx0U2V0SXRlcmF0b3JBZGFwdGVyKGJ1aWxkQ29sdW1uTmFtZXMocmVzdWx0U2V0KSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gYnVpbGRDb2x1bW5OYW1lcyhSZXN1bHRTZXQgcmVzdWx0U2V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW3Jlc3VsdFNldC5nZXRNZXRhRGF0YSgpLmdldENvbHVtbkNvdW50KCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQluYW1lc1tpXSA9IHJlc3VsdFNldC5nZXRNZXRhRGF0YSgpLmdldENvbHVtbk5hbWUoaSArIDEpOyAgLy8gTkI6IFJlc3VsdFNldCBpbmRleC9zdWJzY3JpcHQgaXMgMS1iYXNlZAotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE1hcFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlciBpbXBsZW1lbnRzIFJlc3VsdFNldEl0ZXJhdG9yLkFkYXB0ZXI8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBjb2x1bW5OYW1lczsKLQkJcHVibGljIE1hcFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlcihTdHJpbmdbXSBjb2x1bW5OYW1lcykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29sdW1uTmFtZXMgPSBjb2x1bW5OYW1lczsKLQkJfQotCQlwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gYnVpbGROZXh0KFJlc3VsdFNldCBycykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCQlIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4odGhpcy5jb2x1bW5OYW1lcy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbk5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbWFwLnB1dCh0aGlzLmNvbHVtbk5hbWVzW2ldLCBycy5nZXRPYmplY3QoaSArIDEpKTsgIC8vIE5COiBSZXN1bHRTZXQgaW5kZXgvc3Vic2NyaXB0IGlzIDEtYmFzZWQKLQkJCX0KLQkJCXJldHVybiBtYXA7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KcHREYlRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSnB0RGJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTM0ZDA4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KcHREYlRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3Jtcy5BbGxQbGF0Zm9ybVRlc3RzOwotCi0vKioKLSAqICBKUFQgREIgVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEpwdERiVGVzdHMgewotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdERiVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoIEFsbFBsYXRmb3JtVGVzdHMuc3VpdGUoKSk7Ci0gICAgCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBKcHREYlRlc3RzKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KcHREYlRlc3RzUGx1Z2luLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSnB0RGJUZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDUxN2I1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KcHREYlRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogIEpwdERiVGVzdHNQbHVnaW4KLSAqLwotcHVibGljIGNsYXNzIEpwdERiVGVzdHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEpwdERiVGVzdHNQbHVnaW4gSU5TVEFOQ0U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfSUQgPSAib3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHREYlRlc3RzUGx1Z2luIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBKcHREYlRlc3RzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSU5TVEFOQ0UgPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvQWxsUGxhdGZvcm1UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9BbGxQbGF0Zm9ybVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZWNlN2UuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9BbGxQbGF0Zm9ybVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQWxsUGxhdGZvcm1UZXN0cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsUGxhdGZvcm1UZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRGVyYnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNeVNRTFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9yYWNsZTEwZ1Rlc3RzLmNsYXNzKTsKLS8vCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JhY2xlMTBnWEVUZXN0cy5jbGFzcyk7Ci0vLwkJc3VpdGUuYWRkVGVzdFN1aXRlKE9yYWNsZTlpVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUG9zdGdyZVNRTFRlc3RzLmNsYXNzKTsKLS8vCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU1FMU2VydmVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3liYXNlVGVzdHMuY2xhc3MpOwotCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFsbFBsYXRmb3JtVGVzdHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9EVFBQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RUUFBsYXRmb3JtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExY2FmNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RUUFBsYXRmb3JtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YTsKLWltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5Db25uZWN0aW9uUHJvZmlsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklDb25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklNYW5hZ2VkQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LlByb2ZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5JRHJpdmVyTWdtdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuSVByb3BlcnR5U2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5Qcm9wZXJ0eVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLlhNTEZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5qZGJjLklKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmludGVybmFsLkNvbm5lY3Rpdml0eVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuSnB0RGJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXkuQ29sdW1uUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwuSnB0RGJUZXN0c1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5JbmRlbnRpbmdQcmludFdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlc3VsdFNldEl0ZXJhdG9yOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIHRlc3RpbmcgRFRQIHdyYXBwZXJzIG9uIHZhcmlvdXMgZGF0YWJhc2VzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEVFBQbGF0Zm9ybVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JLyoqCi0JICogVGhlIHBsYXRmb3JtIHByb3BlcnRpZXMgYXJlIGxvYWRlZCBmcm9tIGEgSmF2YSBwcm9wZXJ0aWVzIGZpbGUgaW4gdGhlCi0JICogJ29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcnIGRpcmVjdG9yeS4gRWFjaCBkYXRhYmFzZSBwbGF0Zm9ybSBoYXMKLQkgKiBpdHMgb3duIHByb3BlcnRpZXMgZmlsZSAoZS5nLiAnZGVyYnkucHJvcGVydGllcycpLgotCSAqLwotCXByaXZhdGUgUHJvcGVydGllcyBwbGF0Zm9ybVByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBEYWxpIGNvbm5lY3Rpb24gcHJvZmlsZSB3cmFwcGVyLgotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdGFudHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX0NPTkZJR19ESVJFQ1RPUlkgPSAiY29uZmlnIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9VU0VSX0lEX1BST1BFUlRZID0gInVzZXJJRCI7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9VU0VSX0lEX0RFRkFVTFQgPSAidXNlciI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfUEFTU1dPUkRfUFJPUEVSVFkgPSAicGFzc3dvcmQiOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfUEFTU1dPUkRfREVGQVVMVCA9ICIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX0RSSVZFUl9KQVJTX1BST1BFUlRZID0gImphcnMiOwotCQkvLyByZXF1aXJlZCAtIG5vIGRlZmF1bHQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9VUkxfUFJPUEVSVFkgPSAidXJsIjsKLQkJLy8gcmVxdWlyZWQgLSBubyBkZWZhdWx0Ci0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRFRQUGxhdGZvcm1UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2V0LXVwL3RlYXItZG93biAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCXRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzID0gdGhpcy5sb2FkUGxhdGZvcm1Qcm9wZXJ0aWVzKCk7Ci0JCXRoaXMuYnVpbGREVFBEcml2ZXJEZWZpbml0aW9uRmlsZSgpOwotCQl0aGlzLmJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGUoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZSh0aGlzLmdldFByb2ZpbGVOYW1lKCksIERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIuRGVmYXVsdC5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID0gbnVsbDsKLQkJdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMgPSBudWxsOwotCi0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JLy8gKioqKiogcGxhdGZvcm0gcHJvcGVydGllcyBmaWxlCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGxvYWRQbGF0Zm9ybVByb3BlcnRpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwotCQlwLmxvYWQodGhpcy5idWlsZFBsYXRmb3JtUHJvcGVydGllc0ZpbGVVUkwoKS5vcGVuU3RyZWFtKCkpOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwcml2YXRlIFVSTCBidWlsZFBsYXRmb3JtUHJvcGVydGllc0ZpbGVVUkwoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRCdW5kbGUodGhpcy5nZXRUZXN0UGx1Z2luQnVuZGxlSUQoKSkuZ2V0RW50cnkodGhpcy5nZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlUGF0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRUZXN0UGx1Z2luQnVuZGxlSUQoKSB7Ci0JCXJldHVybiBKcHREYlRlc3RzUGx1Z2luLkJVTkRMRV9JRDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlUGF0aCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRGlyZWN0b3J5TmFtZSgpICsgJy8nICsgdGhpcy5nZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0RpcmVjdG9yeU5hbWUoKSB7Ci0JCXJldHVybiBQTEFURk9STV9DT05GSUdfRElSRUNUT1JZOwotCX0KLQotCS8qKgotCSAqIEVhY2ggZGF0YWJhc2UgcGxhdGZvcm0gaGFzIGEgc2VwYXJhdGUgcHJvcGVydGllcyBmaWxlIGluIHRoZSAnY29uZmlnJwotCSAqIGRpcmVjdG9yeSB0aGF0IG11c3QgYmUgY3VzdG9taXplZCBieSB3aG9tZXZlciBpcyBleGVjdXRpbmcgdGhlIHRlc3RzLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKTsKLQotCS8vICoqKioqIGRyaXZlciBkZWZpbml0aW9uIGZpbGUKLQlwcml2YXRlIHZvaWQgYnVpbGREVFBEcml2ZXJEZWZpbml0aW9uRmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJWE1MRmlsZU1hbmFnZXIuc2V0U3RvcmFnZUxvY2F0aW9uKHRoaXMuZ2V0RFRQRHJpdmVyRGVmaW5pdGlvbkxvY2F0aW9uKCkpOwotCQlYTUxGaWxlTWFuYWdlci5zZXRGaWxlTmFtZSh0aGlzLmdldERUUERyaXZlckZpbGVOYW1lKCkpOwotCi0JCUlQcm9wZXJ0eVNldFtdIHNldHMgPSBYTUxGaWxlTWFuYWdlci5sb2FkUHJvcGVydHlTZXRzKCk7Ci0JCWZvciAoSVByb3BlcnR5U2V0IHNldCA6IHNldHMpIHsKLQkJCWlmIChzZXQuZ2V0SUQoKS5lcXVhbHModGhpcy5nZXREcml2ZXJEZWZpbml0aW9uSUQoKSkpIHsKLQkJCQlyZXR1cm47ICAvLyBwcm9wZXJ0eSBzZXRzIGxpdmUgYWNyb3NzIHRlc3RzCi0JCQl9Ci0JCX0KLQotCQlYTUxGaWxlTWFuYWdlci5zYXZlTmFtZWRQcm9wZXJ0eVNldCh0aGlzLmJ1aWxkRFRQRHJpdmVyRGVmaW5pdGlvblByb3BlcnR5U2V0cygpKTsKLQotCQkvLyB2ZXJpZnkgdGhlIGZpbGUgd2FzIGNyZWF0ZWQ6Ci0JCUZpbGUgZHJpdmVyRGVmaW5pdGlvbmVGaWxlID0gdGhpcy5nZXREVFBEcml2ZXJEZWZpbml0aW9uTG9jYXRpb24oKS5hcHBlbmQodGhpcy5nZXREVFBEcml2ZXJGaWxlTmFtZSgpKS50b0ZpbGUoKTsKLQkJYXNzZXJ0VHJ1ZShkcml2ZXJEZWZpbml0aW9uZUZpbGUuZXhpc3RzKCkpOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0RFRQRHJpdmVyRGVmaW5pdGlvbkxvY2F0aW9uKCkgewotCQlyZXR1cm4gQ29ubmVjdGl2aXR5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RFRQRHJpdmVyRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBJRHJpdmVyTWdtdENvbnN0YW50cy5EUklWRVJfRklMRTsKLQl9Ci0KLQlwcml2YXRlIElQcm9wZXJ0eVNldFtdIGJ1aWxkRFRQRHJpdmVyRGVmaW5pdGlvblByb3BlcnR5U2V0cygpIHsKLQkJSVByb3BlcnR5U2V0W10gcHJvcGVydHlTZXRzID0gbmV3IElQcm9wZXJ0eVNldFsxXTsKLQkJUHJvcGVydHlTZXRJbXBsIHByb3BlcnR5U2V0ID0gbmV3IFByb3BlcnR5U2V0SW1wbCh0aGlzLmdldERyaXZlck5hbWUoKSwgdGhpcy5nZXREcml2ZXJEZWZpbml0aW9uSUQoKSk7Ci0JCXByb3BlcnR5U2V0LnNldFByb3BlcnRpZXModGhpcy5nZXREcml2ZXJEZWZpbml0aW9uSUQoKSwgdGhpcy5idWlsZERUUERyaXZlckRlZmluaXRpb25Qcm9wZXJ0aWVzKCkpOwotCQlwcm9wZXJ0eVNldHNbMF0gPSBwcm9wZXJ0eVNldDsKLQkJcmV0dXJuIHByb3BlcnR5U2V0czsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERyaXZlck5hbWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCk7Ci0KLQlwcml2YXRlIFByb3BlcnRpZXMgYnVpbGREVFBEcml2ZXJEZWZpbml0aW9uUHJvcGVydGllcygpIHsKLQkJUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJcC5zZXRQcm9wZXJ0eShDb25uZWN0aW9uUHJvZmlsZS5EUklWRVJfREVGSU5JVElPTl9UWVBFX1BST1BfSUQsIHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSk7Ci0JCXAuc2V0UHJvcGVydHkoQ29ubmVjdGlvblByb2ZpbGUuRFJJVkVSX0pBUl9MSVNUX1BST1BfSUQsIHRoaXMuZ2V0SkRCQ0RyaXZlckphckxpc3QoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFTkRPUl9QUk9QX0lELCB0aGlzLmdldERhdGFiYXNlVmVuZG9yKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRVJTSU9OX1BST1BfSUQsIHRoaXMuZ2V0RGF0YWJhc2VWZXJzaW9uKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EUklWRVJfQ0xBU1NfUFJPUF9JRCwgdGhpcy5nZXREcml2ZXJDbGFzcygpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVJMX1BST1BfSUQsIHRoaXMuZ2V0SkRCQ1VSTCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVNFUk5BTUVfUFJPUF9JRCwgdGhpcy5nZXRVc2VySUQoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlBBU1NXT1JEX1BST1BfSUQsIHRoaXMuZ2V0UGFzc3dvcmQoKSk7Ci0JCXJldHVybiBwOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFRoZSBKQVIgbGlzdCBpcyB3b3Jrc3BhY2Utc3BlY2lmaWMgYW5kIGlzIHNldCBpbiB0aGUgcHJvcGVydGllcyBmaWxlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEpEQkNEcml2ZXJKYXJMaXN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZXF1aXJlZFBsYXRmb3JtUHJvcGVydHkoREJfRFJJVkVSX0pBUlNfUFJPUEVSVFkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERyaXZlckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBUaGUgZGF0YWJhc2UgVVJMIGlzIHdvcmtzcGFjZS1zcGVjaWZpYyBhbmQgaXMgc2V0IGluIHRoZSBwcm9wZXJ0aWVzIGZpbGUKLQkgKiBmb3Igc29tZSBkYXRhYmFzZXMuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SkRCQ1VSTCgpIHsKLQkJcmV0dXJuIHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KERCX1VSTF9QUk9QRVJUWSwgdGhpcy5nZXREZWZhdWx0SkRCQ1VSTCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRKREJDVVJMKCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCi0JLyoqCi0JICogVGhlIHVzZXIgSUQgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBzZXQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVzZXJJRCgpIHsKLQkJcmV0dXJuIHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KERCX1VTRVJfSURfUFJPUEVSVFksIERCX1VTRVJfSURfREVGQVVMVCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhc3N3b3JkIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgc2V0IGluIHRoZSBwcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShEQl9QQVNTV09SRF9QUk9QRVJUWSwgREJfUEFTU1dPUkRfREVGQVVMVCk7Ci0JfQotCi0JLy8gKioqKiogRFRQIGNvbm5lY3Rpb24gcHJvZmlsZQotCXByaXZhdGUgdm9pZCBidWlsZERUUENvbm5lY3Rpb25Qcm9maWxlKCkgdGhyb3dzIENvbm5lY3Rpb25Qcm9maWxlRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKS5nZXRQcm9maWxlQnlOYW1lKHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSkgIT0gbnVsbCkgewotCQkJcmV0dXJuOyAgLy8gcHJvZmlsZXMgbGl2ZSBhY3Jvc3MgdGVzdHMKLQkJfQotCQl0aGlzLmNyZWF0ZVByb2ZpbGUodGhpcy5nZXRQcm9maWxlTmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERUUFByb2ZpbGVNYW5hZ2VyKCkuZ2V0UHJvZmlsZUJ5TmFtZSh0aGlzLmdldFByb2ZpbGVOYW1lKCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9maWxlKFN0cmluZyBwcm9maWxlTmFtZSkgdGhyb3dzIENvbm5lY3Rpb25Qcm9maWxlRXhjZXB0aW9uIHsKLQkJdGhpcy5nZXREVFBQcm9maWxlTWFuYWdlcigpLmNyZWF0ZVByb2ZpbGUoCi0JCQkJcHJvZmlsZU5hbWUsCi0JCQkJdGhpcy5nZXRQcm9maWxlRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFByb3ZpZGVySUQoKSwKLQkJCQl0aGlzLmJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0aWVzKCkKLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpOwotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm92aWRlcklEKCkgewotCQlyZXR1cm4gQ29ubmVjdGlvblByb2ZpbGUuQ09OTkVDVElPTl9QUk9GSUxFX1RZUEU7Ci0JfQotCSAKLQlwcm90ZWN0ZWQgUHJvcGVydGllcyBidWlsZERUUENvbm5lY3Rpb25Qcm9maWxlUHJvcGVydGllcygpIHsKLQkJUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVNFUk5BTUVfUFJPUF9JRCwgdGhpcy5nZXRVc2VySUQoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlBBU1NXT1JEX1BST1BfSUQsIHRoaXMuZ2V0UGFzc3dvcmQoKSk7Ci0JCXAuc2V0UHJvcGVydHkoQ29ubmVjdGlvblByb2ZpbGUuRFJJVkVSX0RFRklOSVRJT05fUFJPUF9JRCwgdGhpcy5nZXREcml2ZXJEZWZpbml0aW9uSUQoKSk7Ci0KLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuRFJJVkVSX0NMQVNTX1BST1BfSUQsIHRoaXMuZ2V0RHJpdmVyQ2xhc3MoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVSTF9QUk9QX0lELCB0aGlzLmdldEpEQkNVUkwoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFTkRPUl9QUk9QX0lELCB0aGlzLmdldERhdGFiYXNlVmVuZG9yKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRVJTSU9OX1BST1BfSUQsIHRoaXMuZ2V0RGF0YWJhc2VWZXJzaW9uKCkpOwotCi0JCXAuc2V0UHJvcGVydHkoQ29ubmVjdGlvblByb2ZpbGUuREFUQUJBU0VfU0FWRV9QV0RfUFJPUF9JRCwgdGhpcy5wYXNzd29yZElzU2F2ZWQoKSk7Ci0JCXJldHVybiBwOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHBhc3N3b3JkSXNTYXZlZCgpIHsKLQkJcmV0dXJuICJ0cnVlIjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoKSB0aHJvd3MgQ29ubmVjdGlvblByb2ZpbGVFeGNlcHRpb24gewotCQlUZXN0Q29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmFkZENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCVN0cmluZyBjcE5hbWUxID0gdGhpcy5nZXRQcm9maWxlTmFtZSgpICsgIjEiOwotCQl0aGlzLmNyZWF0ZVByb2ZpbGUoY3BOYW1lMSk7Ci0JCUlDb25uZWN0aW9uUHJvZmlsZSBkdHBDUCA9IHRoaXMuZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKS5nZXRQcm9maWxlQnlOYW1lKGNwTmFtZTEpOwotCQlhc3NlcnROb3ROdWxsKGR0cENQKTsKLQotCQlhc3NlcnRFcXVhbHMoY3BOYW1lMSwgbGlzdGVuZXIuYWRkZWROYW1lKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQlTdHJpbmcgY3BOYW1lMiA9IHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSArICIyIjsKLQkJdGhpcy5nZXREVFBQcm9maWxlTWFuYWdlcigpLm1vZGlmeVByb2ZpbGUoZHRwQ1AsIGNwTmFtZTIsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoY3BOYW1lMSwgbGlzdGVuZXIucmVuYW1lZE9sZE5hbWUpOwotCQlhc3NlcnRFcXVhbHMoY3BOYW1lMiwgbGlzdGVuZXIucmVuYW1lZE5ld05hbWUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKGNwTmFtZTIpOwotCQlhc3NlcnROb3ROdWxsKGNwKTsKLQotCQl0aGlzLmdldERUUFByb2ZpbGVNYW5hZ2VyKCkuZGVsZXRlUHJvZmlsZShkdHBDUCk7Ci0JCWFzc2VydEVxdWFscyhjcE5hbWUyLCBsaXN0ZW5lci5yZW1vdmVkTmFtZSk7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0KLQkJY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoY3BOYW1lMik7Ci0JCWFzc2VydE51bGwoY3ApOwotCi0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkucmVtb3ZlQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hbWUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFByb2ZpbGVOYW1lKCksIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNJbmFjdGl2ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzRGlzY29ubmVjdGVkKCkpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzQWN0aXZlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNDb25uZWN0ZWQoKSk7Ci0KLQkJdGhpcy52ZXJpZnlEYXRhYmFzZVZlcnNpb25OdW1iZXIoKTsKLQkJdGhpcy52ZXJpZnlEYXRhYmFzZVZlbmRvcigpOwotCQl0aGlzLnZlcmlmeURhdGFiYXNlQ29udGVudCgpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNJbmFjdGl2ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzRGlzY29ubmVjdGVkKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlEYXRhYmFzZVZlcnNpb25OdW1iZXIoKSB7Ci0JCURhdGFiYXNlIGRhdGFiYXNlID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpOwotCQlhc3NlcnROb3ROdWxsKGRhdGFiYXNlKTsKLQotCQlTdHJpbmcgYWN0dWFsID0gZGF0YWJhc2UuZ2V0VmVyc2lvbigpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSB0aGlzLmdldERhdGFiYXNlVmVyc2lvbigpOwotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gImV4cGVjdGVkOiAiICsgZXhwZWN0ZWQgKyAiIC0gYWN0dWFsOiAiICsgYWN0dWFsOwotCQkvLyBwYXJ0aWFsIG1hdGNoIGlzIGdvb2QgZW5vdWdoCi0JCWFzc2VydFRydWUoZXJyb3JNZXNzYWdlLCBhY3R1YWwuaW5kZXhPZihleHBlY3RlZCkgIT0gLTEpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlEYXRhYmFzZVZlbmRvcigpIHsKLQkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCk7Ci0JCVN0cmluZyBhY3R1YWwgPSBkYXRhYmFzZS5nZXRWZW5kb3JOYW1lKCk7Ci0JCVN0cmluZyBleHBlY3RlZCA9IHRoaXMuZ2V0RGF0YWJhc2VWZW5kb3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlEYXRhYmFzZUNvbnRlbnQoKSB7Ci0JCURhdGFiYXNlIGRhdGFiYXNlID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpOwotCQlhc3NlcnRUcnVlKGRhdGFiYXNlLmdldFNjaGVtYXRhU2l6ZSgpID49IDApOwotCi0JCVNjaGVtYSBzY2hlbWEgPSBkYXRhYmFzZS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJaWYgKHNjaGVtYS5nZXRUYWJsZXNTaXplKCkgPiAwKSB7Ci0JCQkJVGFibGUgdGFibGUgPSBzY2hlbWEuZ2V0VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRDb2x1bW5zU2l6ZSgpID49IDApOwotCQkJCWFzc2VydFRydWUodGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkgPj0gMCk7Ci0JCQkJYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSA+PSAwKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGV4ZWN1dGVPZmZsaW5lVGVzdHMoKTsKLQotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RPZmZsaW5lKCkgewotCQlpZiAoICEgdGhpcy5leGVjdXRlT2ZmbGluZVRlc3RzKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoICEgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5zdXBwb3J0c1dvcmtPZmZsaW5lTW9kZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0aGlzLnByZXBhcmVGb3JPZmZsaW5lV29yaygpOwotCi0JCUlTdGF0dXMgc3RhdHVzID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS53b3JrT2ZmbGluZSgpOwotCQlhc3NlcnRUcnVlKHN0YXR1cy5pc09LKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNBY3RpdmUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc1dvcmtpbmdPZmZsaW5lKCkpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNJbmFjdGl2ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzRGlzY29ubmVjdGVkKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVGb3JPZmZsaW5lV29yaygpIHsKLQkJaWYgKCAhIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuY2FuV29ya09mZmxpbmUoKSkgewotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGUuc2F2ZVdvcmtPZmZsaW5lRGF0YSgpOwotCQkJYXNzZXJ0VHJ1ZShzdGF0dXMuaXNPSygpKTsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNhbldvcmtPZmZsaW5lKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb25MaXN0ZW5lckNvbm5lY3QoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZUhhc05vTGlzdGVuZXJzKCkpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGVIYXNBbnlMaXN0ZW5lcnMoKSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCWFzc2VydFNhbWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZSwgbGlzdGVuZXIub3BlbmVkUHJvZmlsZSk7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCWFzc2VydFNhbWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZSwgbGlzdGVuZXIub2tUb0Nsb3NlUHJvZmlsZSk7Ci0JCWFzc2VydFNhbWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZSwgbGlzdGVuZXIuYWJvdXRUb0Nsb3NlUHJvZmlsZSk7Ci0JCWFzc2VydFNhbWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZSwgbGlzdGVuZXIuY2xvc2VkUHJvZmlsZSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGVIYXNOb0xpc3RlbmVycygpKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyT2ZmbGluZSgpIHsKLQkJaWYgKCAhIHRoaXMuZXhlY3V0ZU9mZmxpbmVUZXN0cygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLnByZXBhcmVGb3JPZmZsaW5lV29yaygpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUud29ya09mZmxpbmUoKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5vcGVuZWRQcm9maWxlKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5va1RvQ2xvc2VQcm9maWxlKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5hYm91dFRvQ2xvc2VQcm9maWxlKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5jbG9zZWRQcm9maWxlKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb25MaXN0ZW5lckRhdGFiYXNlKCkgewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCksIGxpc3RlbmVyLmNoYW5nZWREYXRhYmFzZSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyQ2F0YWxvZygpIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCWlmICggISB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuc3VwcG9ydHNDYXRhbG9ncygpKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQkJCXJldHVybjsKLQkJfQotCQkJCi0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJLy8gdGFrZSB0aGUgZmlyc3QgY2F0YWxvZwotCQlvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBkdHBDYXRhbG9nID0gdGhpcy5nZXRGaXJzdERUUENhdGFsb2coKTsKLQkJQ2F0YWxvZyBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nTmFtZWQoZHRwQ2F0YWxvZy5nZXROYW1lKCkpOwotCQkoKElDYXRhbG9nT2JqZWN0KSBkdHBDYXRhbG9nKS5yZWZyZXNoKCk7Ci0JCWFzc2VydFNhbWUoY2F0YWxvZywgbGlzdGVuZXIuY2hhbmdlZENhdGFsb2cpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb25MaXN0ZW5lclNjaGVtYSgpIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZz4gZHRwQ2F0YWxvZ3MgPSB0aGlzLmdldERUUENhdGFsb2dzKCk7Ci0JCW9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGR0cENhdGFsb2cgPSBudWxsOwotCQlvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGR0cFNjaGVtYSA9IG51bGw7Ci0JCVNjaGVtYSBzY2hlbWEgPSBudWxsOwotCQlpZiAodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLnN1cHBvcnRzQ2F0YWxvZ3MoKSkgewotCQkJZHRwQ2F0YWxvZyA9IGR0cENhdGFsb2dzLmdldCgwKTsKLQkJCWR0cFNjaGVtYSA9IChvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hKSBkdHBDYXRhbG9nLmdldFNjaGVtYXMoKS5nZXQoMCk7Ci0JCQlzY2hlbWEgPSB0aGlzLmdldENhdGFsb2dOYW1lZChkdHBDYXRhbG9nLmdldE5hbWUoKSkuZ2V0U2NoZW1hTmFtZWQoZHRwU2NoZW1hLmdldE5hbWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZHRwQ2F0YWxvZ3MuaXNFbXB0eSgpKSB7Ci0JCQkJZHRwU2NoZW1hID0gKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKS5nZXRTY2hlbWFzKCkuZ2V0KDApOwotCQkJCXNjaGVtYSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZChkdHBTY2hlbWEuZ2V0TmFtZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZHRwQ2F0YWxvZyA9IGR0cENhdGFsb2dzLmdldCgwKTsgIC8vIHNob3VsZCBiZSB0aGUgInZpcnR1YWwiIGNhdGFsb2cKLQkJCQlhc3NlcnRFcXVhbHMoIiIsIGR0cENhdGFsb2cuZ2V0TmFtZSgpKTsKLQkJCQlkdHBTY2hlbWEgPSAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSkgZHRwQ2F0YWxvZy5nZXRTY2hlbWFzKCkuZ2V0KDApOwotCQkJCS8vIHRoZSBzY2hlbWF0YSBhcmUgaGVsZCBkaXJlY3RseSBieSB0aGUgZGF0YWJhc2UgaW4gdGhpcyBzaXR1YXRpb24KLQkJCQlzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoZHRwU2NoZW1hLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShzY2hlbWEuZ2V0VGFibGVzU2l6ZSgpID49IDApOyAgLy8gZm9yY2UgdGFibGVzIHRvIGJlIGxvYWRlZAotCQkoKElDYXRhbG9nT2JqZWN0KSBkdHBTY2hlbWEpLnJlZnJlc2goKTsKLQkJYXNzZXJ0U2FtZShzY2hlbWEsIGxpc3RlbmVyLmNoYW5nZWRTY2hlbWEpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCWJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncyA9IHRoaXMuc3VwcG9ydHNDYXRhbG9ncygpOwotCQlhc3NlcnRFcXVhbHMoc3VwcG9ydHNDYXRhbG9ncywgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLnN1cHBvcnRzQ2F0YWxvZ3MoKSk7Ci0JCWlmIChzdXBwb3J0c0NhdGFsb2dzKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nc1NpemUoKSA+IDApOwotCQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWF0YVNpemUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dzU2l6ZSgpKTsKLQkJCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmdldFNjaGVtYXRhU2l6ZSgpID4gMCk7Ci0JCX0KLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKTsKLQotLy8JcHVibGljIHZvaWQgdGVzdERFQlVHKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0vLwkJdGhpcy5kdW1wSkRCQ0NhdGFsb2dzKCk7Ci0vLwkJdGhpcy5kdW1wSkRCQ1NjaGVtYXRhKCk7Ci0vLwkJdGhpcy5kdW1wRGF0YWJhc2VDb250YWluZXJzKCk7Ci0vLwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0vLwl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IGdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEpwdERiUGx1Z2luLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIERhdGFiYXNlIGdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpOwotCX0KLQotCXByb3RlY3RlZCBDYXRhbG9nIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5nZXREYXRhYmFzZSgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCi0JLyoqCi0JICogb25seSB2YWxpZCBvbiBkYXRhYmFzZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBjYXRhbG9ncwotCSAqLwotCXByb3RlY3RlZCBTY2hlbWEgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENhdGFsb2cgZ2V0Q2F0YWxvZ05hbWVkKFN0cmluZyBjYXRhbG9nTmFtZSkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZChjYXRhbG9nTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXF1aXJlZFBsYXRmb3JtUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5S2V5KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkocHJvcGVydHlLZXkpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShwcm9wZXJ0eVZhbHVlKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGFiYXNlIHBsYXRmb3JtIHByb3BlcnRpZXMgZmlsZSAnIiArIHRoaXMuZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZVBhdGgoKQotCQkJCQkrICInIGlzIG1pc3NpbmcgYSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5ICciICsgcHJvcGVydHlLZXkgKyAiJy4iKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydHlWYWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUhhc0FueUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb25Qcm9maWxlSGFzQW55TGlzdGVuZXJzKHRoaXMuY29ubmVjdGlvblByb2ZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUhhc0FueUxpc3RlbmVycyhDb25uZWN0aW9uUHJvZmlsZSBjcCkgewotCQlyZXR1cm4gKChCb29sZWFuKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChjcCwgImhhc0FueUxpc3RlbmVycyIpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gY29ubmVjdGlvblByb2ZpbGVIYXNOb0xpc3RlbmVycyh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVIYXNOb0xpc3RlbmVycyhDb25uZWN0aW9uUHJvZmlsZSBjcCkgewotCQlyZXR1cm4gKChCb29sZWFuKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChjcCwgImhhc05vTGlzdGVuZXJzIikpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFAgbW9kZWwgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb2ZpbGVNYW5hZ2VyIGdldERUUFByb2ZpbGVNYW5hZ2VyKCkgewotCQlyZXR1cm4gUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbm5lY3Rpb25Qcm9maWxlIGdldERUUENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gZ2V0RFRQQ29ubmVjdGlvblByb2ZpbGUodGhpcy5jb25uZWN0aW9uUHJvZmlsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJQ29ubmVjdGlvblByb2ZpbGUgZ2V0RFRQQ29ubmVjdGlvblByb2ZpbGUoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKLQkJcmV0dXJuIChJQ29ubmVjdGlvblByb2ZpbGUpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKGNwLCAiZHRwQ29ubmVjdGlvblByb2ZpbGUiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1hbmFnZWRDb25uZWN0aW9uIGdldERUUE1hbmFnZWRDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gKElNYW5hZ2VkQ29ubmVjdGlvbikgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZSwgImR0cE1hbmFnZWRDb25uZWN0aW9uIik7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSBnZXREVFBEYXRhYmFzZSgpIHsKLQkJcmV0dXJuIGdldERUUERhdGFiYXNlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgZ2V0RFRQRGF0YWJhc2UoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJcmV0dXJuIChvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKGRhdGFiYXNlLCAiZHRwRGF0YWJhc2UiKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZz4gZ2V0RFRQQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiB0aGlzLmdldERUUERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ3MoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZ2V0Rmlyc3REVFBDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5nZXREVFBDYXRhbG9ncygpLmdldCgwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZ2V0RFRQQ2F0YWxvZ05hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBnZXREVFBDYXRhbG9nKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQobmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZ2V0RFRQQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpIHsKLQkJcmV0dXJuIChvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZykgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoY2F0YWxvZywgImR0cENhdGFsb2ciKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBnZXREVFBTY2hlbWFOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0RFRQU2NoZW1hKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZChuYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGdldERUUFNjaGVtYShTY2hlbWEgc2NoZW1hKSB7Ci0JCXJldHVybiAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoc2NoZW1hLCAiZHRwU2NoZW1hIik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4ZWN1dGUgU1FMICoqKioqKioqKioKLQotCS8qKgotCSAqIGlnbm9yZSBhbnkgZXJyb3JzICh1c2VmdWwgZm9yIGRyb3BwaW5nIGRhdGFiYXNlIG9iamVjdHMgdGhhdCBtaWdodAotCSAqIG5vdCBiZSB0aGVyZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKFN0cmluZyBzcWwpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZShzcWwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLS8vCQkJU3lzdGVtLmVyci5wcmludGxuKCJTUUw6ICIgKyBzcWwpOwotLy8JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVVcGRhdGUoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCVN0YXRlbWVudCBqZGJjU3RhdGVtZW50ID0gdGhpcy5jcmVhdGVKREJDU3RhdGVtZW50KCk7Ci0JCXRyeSB7Ci0JCQlqZGJjU3RhdGVtZW50LmV4ZWN1dGVVcGRhdGUoc3FsKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWpkYmNTdGF0ZW1lbnQuY2xvc2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXAoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZHVtcChzcWwsIDIwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wKFN0cmluZyBzcWwsIGludCBjb2x1bW5XaWR0aCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUluZGVudGluZ1ByaW50V3JpdGVyIHB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpOwotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY29uc29sZSBzbyBldmVyeXRoaW5nIGlzIGNvbnRpZ3VvdXMKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQl0aGlzLmR1bXBPbihzcWwsIHB3LCBjb2x1bW5XaWR0aCk7Ci0JCX0KLQkJcHcuZmx1c2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wT24oU3RyaW5nIHNxbCwgSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcsIGludCBjb2x1bW5XaWR0aCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXB3LnByaW50bG4oc3FsKTsKLQkJZm9yIChBcnJheUxpc3Q8T2JqZWN0PiByb3cgOiB0aGlzLmV4ZWN1dGUoc3FsKSkgewotCQkJZm9yIChPYmplY3QgY29sdW1uVmFsdWUgOiByb3cpIHsKLQkJCQlTdHJpbmdUb29scy5wYWRPclRydW5jYXRlT24oU3RyaW5nLnZhbHVlT2YoY29sdW1uVmFsdWUpLCBjb2x1bW5XaWR0aCwgcHcpOwotCQkJCXB3LnByaW50KCcgJyk7Ci0JCQl9Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PEFycmF5TGlzdDxPYmplY3Q+PiBleGVjdXRlKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlTdGF0ZW1lbnQgamRiY1N0YXRlbWVudCA9IHRoaXMuY3JlYXRlSkRCQ1N0YXRlbWVudCgpOwotCQlqZGJjU3RhdGVtZW50LmV4ZWN1dGUoc3FsKTsKLQkJQXJyYXlMaXN0PEFycmF5TGlzdDxPYmplY3Q+PiByb3dzID0gdGhpcy5idWlsZFJvd3MoamRiY1N0YXRlbWVudC5nZXRSZXN1bHRTZXQoKSk7Ci0JCWpkYmNTdGF0ZW1lbnQuY2xvc2UoKTsKLQkJcmV0dXJuIHJvd3M7Ci0JfQotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxBcnJheUxpc3Q8T2JqZWN0Pj4gYnVpbGRSb3dzKFJlc3VsdFNldCByZXN1bHRTZXQpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlBcnJheUxpc3Q8QXJyYXlMaXN0PE9iamVjdD4+IHJvd3MgPSBuZXcgQXJyYXlMaXN0PEFycmF5TGlzdDxPYmplY3Q+PigpOwotCQlmb3IgKEl0ZXJhdG9yPEFycmF5TGlzdDxPYmplY3Q+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkQXJyYXlJdGVyYXRvcihyZXN1bHRTZXQpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXJvd3MuYWRkKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiByb3dzOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxBcnJheUxpc3Q8T2JqZWN0Pj4gYnVpbGRBcnJheUl0ZXJhdG9yKFJlc3VsdFNldCByZXN1bHRTZXQpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFJlc3VsdFNldEl0ZXJhdG9yPEFycmF5TGlzdDxPYmplY3Q+PihyZXN1bHRTZXQsIG5ldyBMaXN0UmVzdWx0U2V0SXRlcmF0b3JBZGFwdGVyKHJlc3VsdFNldC5nZXRNZXRhRGF0YSgpLmdldENvbHVtbkNvdW50KCkpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIExpc3RSZXN1bHRTZXRJdGVyYXRvckFkYXB0ZXIgaW1wbGVtZW50cyBSZXN1bHRTZXRJdGVyYXRvci5BZGFwdGVyPEFycmF5TGlzdDxPYmplY3Q+PiB7Ci0JCXByaXZhdGUgZmluYWwgaW50IGNvbHVtbkNvdW50OwotCQlwdWJsaWMgTGlzdFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlcihpbnQgY29sdW1uQ291bnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbHVtbkNvdW50ID0gY29sdW1uQ291bnQ7Ci0JCX0KLQkJcHVibGljIEFycmF5TGlzdDxPYmplY3Q+IGJ1aWxkTmV4dChSZXN1bHRTZXQgcnMpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQkJQXJyYXlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0Pih0aGlzLmNvbHVtbkNvdW50KTsKLQkJCWZvciAoaW50IGkgPSAxOyBpIDw9IHRoaXMuY29sdW1uQ291bnQ7IGkrKykgeyAgLy8gTkI6IFJlc3VsdFNldCBpbmRleC9zdWJzY3JpcHQgaXMgMS1iYXNlZAotCQkJCWxpc3QuYWRkKHJzLmdldE9iamVjdChpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbGlzdDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdGF0ZW1lbnQgY3JlYXRlSkRCQ1N0YXRlbWVudCgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLmNyZWF0ZVN0YXRlbWVudCgpOwotCX0KLQotCXByb3RlY3RlZCBDb25uZWN0aW9uIGdldEpEQkNDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gKChDb25uZWN0aW9uSW5mbykgdGhpcy5nZXREVFBNYW5hZ2VkQ29ubmVjdGlvbigpLmdldENvbm5lY3Rpb24oKS5nZXRSYXdDb25uZWN0aW9uKCkpLmdldFNoYXJlZENvbm5lY3Rpb24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGF0YWJhc2VNZXRhRGF0YSBnZXREYXRhYmFzZU1ldGFEYXRhKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuZ2V0TWV0YURhdGEoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZHVtcCBEVFAgbWV0YWRhdGEgKioqKioqKioqKgotCi0JLyoqCi0JICogZHVtcCBhbGwgdGhlIGRhdGFiYXNlIG1ldGFkYXRhIHRvIHRoZSBjb25zb2xlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZHVtcERhdGFiYXNlKCkgewotCQl0aGlzLmR1bXBEYXRhYmFzZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBkdW1wIHRoZSBkYXRhYmFzZSBjYXRhbG9ncyBhbmQgc2NoZW1hdGEgdG8gdGhlIGNvbnNvbGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wRGF0YWJhc2VDb250YWluZXJzKCkgewotCQl0aGlzLmR1bXBEYXRhYmFzZShmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcERhdGFiYXNlKGJvb2xlYW4gZGVlcCkgewotCQlJbmRlbnRpbmdQcmludFdyaXRlciBwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsKLQkJLy8gc3luY2hyb25pemUgdGhlIGNvbnNvbGUgc28gZXZlcnl0aGluZyBpcyBjb250aWd1b3VzCi0JCXN5bmNocm9uaXplZCAoU3lzdGVtLm91dCkgewotCQkJdGhpcy5kdW1wRGF0YWJhc2VPbihwdywgZGVlcCk7Ci0JCX0KLQkJcHcuZmx1c2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wRGF0YWJhc2VPbihJbmRlbnRpbmdQcmludFdyaXRlciBwdywgYm9vbGVhbiBkZWVwKSB7Ci0JCURhdGFiYXNlIGRhdGFiYXNlID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpOwotCQlwdy5wcmludCgiZGF0YWJhc2U6ICIpOwotCQlwdy5wcmludGxuKGRhdGFiYXNlLmdldE5hbWUoKSk7Ci0JCWlmIChkYXRhYmFzZS5zdXBwb3J0c0NhdGFsb2dzKCkpIHsKLQkJCWZvciAoQ2F0YWxvZyBjYXRhbG9nIDogZGF0YWJhc2UuZ2V0Q2F0YWxvZ3MoKSkgewotCQkJCXRoaXMuZHVtcENhdGFsb2dPbihjYXRhbG9nLCBwdywgZGVlcCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmR1bXBTY2hlbWFDb250YWluZXJPbihkYXRhYmFzZSwgcHcsIGRlZXApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcENhdGFsb2dPbihDYXRhbG9nIGNhdGFsb2csIEluZGVudGluZ1ByaW50V3JpdGVyIHB3LCBib29sZWFuIGRlZXApIHsKLQkJcHcucHJpbnQoImNhdGFsb2c6ICIpOwotCQlwdy5wcmludGxuKGNhdGFsb2cuZ2V0TmFtZSgpKTsKLQkJcHcuaW5kZW50KCk7Ci0JCQl0aGlzLmR1bXBTY2hlbWFDb250YWluZXJPbihjYXRhbG9nLCBwdywgZGVlcCk7Ci0JCXB3LnVuZGVudCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBTY2hlbWFDb250YWluZXJPbihTY2hlbWFDb250YWluZXIgc2NoZW1hQ29udGFpbmVyLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdywgYm9vbGVhbiBkZWVwKSB7Ci0JCWZvciAoU2NoZW1hIHNjaGVtYSA6IHNjaGVtYUNvbnRhaW5lci5nZXRTY2hlbWF0YSgpKSB7Ci0JCQl0aGlzLmR1bXBTY2hlbWFPbihzY2hlbWEsIHB3LCBkZWVwKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBTY2hlbWEoU2NoZW1hIHNjaGVtYSkgewotCQl0aGlzLmR1bXBTY2hlbWEoc2NoZW1hLCB0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wU2NoZW1hKFNjaGVtYSBzY2hlbWEsIGJvb2xlYW4gZGVlcCkgewotCQlJbmRlbnRpbmdQcmludFdyaXRlciBwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsKLQkJLy8gc3luY2hyb25pemUgdGhlIGNvbnNvbGUgc28gZXZlcnl0aGluZyBpcyBjb250aWd1b3VzCi0JCXN5bmNocm9uaXplZCAoU3lzdGVtLm91dCkgewotCQkJdGhpcy5kdW1wU2NoZW1hT24oc2NoZW1hLCBwdywgZGVlcCk7Ci0JCX0KLQkJcHcuZmx1c2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wU2NoZW1hT24oU2NoZW1hIHNjaGVtYSwgSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcsIGJvb2xlYW4gZGVlcCkgewotCQlwdy5wcmludCgic2NoZW1hOiAiKTsKLQkJcHcucHJpbnRsbihzY2hlbWEuZ2V0TmFtZSgpKTsKLQkJaWYgKGRlZXApIHsKLQkJCXB3LmluZGVudCgpOwotCQkJCWZvciAoVGFibGUgdGFibGUgOiBzY2hlbWEuZ2V0VGFibGVzKCkpIHsKLQkJCQkJdGhpcy5kdW1wVGFibGVPbih0YWJsZSwgcHcpOwotCQkJCX0KLQkJCQlmb3IgKFNlcXVlbmNlIHNlcXVlbmNlIDogc2NoZW1hLmdldFNlcXVlbmNlcygpKSB7Ci0JCQkJCXRoaXMuZHVtcFNlcXVlbmNlT24oc2VxdWVuY2UsIHB3KTsKLQkJCQl9Ci0JCQlwdy51bmRlbnQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBUYWJsZU9uKFRhYmxlIHRhYmxlLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCgidGFibGU6ICIpOwotCQlwdy5wcmludGxuKHRhYmxlLmdldE5hbWUoKSk7Ci0JCXB3LmluZGVudCgpOwotCQkJZm9yIChDb2x1bW4gY29sdW1uIDogdGFibGUuZ2V0Q29sdW1ucygpKSB7Ci0JCQkJdGhpcy5kdW1wQ29sdW1uT24oY29sdW1uLCBwdyk7Ci0JCQl9Ci0JCQlmb3IgKEZvcmVpZ25LZXkgZm9yZWlnbktleSA6IHRhYmxlLmdldEZvcmVpZ25LZXlzKCkpIHsKLQkJCQl0aGlzLmR1bXBGb3JlaWduS2V5T24oZm9yZWlnbktleSwgcHcpOwotCQkJfQotCQlwdy51bmRlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wQ29sdW1uT24oQ29sdW1uIGNvbHVtbiwgSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQoImNvbHVtbjogIik7Ci0JCXB3LnByaW50KGNvbHVtbi5nZXROYW1lKCkpOwotCQlwdy5wcmludCgiIDogIik7Ci0JCXB3LnByaW50KGNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWlmIChjb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpIHsKLQkJCXB3LnByaW50KCIgW3ByaW1hcnkga2V5XSIpOwotCQl9Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wRm9yZWlnbktleU9uKEZvcmVpZ25LZXkgZm9yZWlnbktleSwgSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQoImZvcmVpZ24ga2V5OiAiKTsKLQkJcHcucHJpbnQoZm9yZWlnbktleS5nZXROYW1lKCkpOwotCQlwdy5wcmludCgiPT4iKTsKLQkJcHcucHJpbnQoZm9yZWlnbktleS5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXROYW1lKCkpOwotCQlwdy5wcmludCgiICgiKTsKLQkJZm9yIChJdGVyYXRvcjxDb2x1bW5QYWlyPiBzdHJlYW0gPSBmb3JlaWduS2V5LmdldENvbHVtblBhaXJzKCkuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlDb2x1bW5QYWlyIGNwID0gc3RyZWFtLm5leHQoKTsKLQkJCXB3LnByaW50KGNwLmdldEJhc2VDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkJcHcucHJpbnQoIj0+Iik7Ci0JCQlwdy5wcmludChjcC5nZXRSZWZlcmVuY2VkQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJcHcucHJpbnQoIiwgIik7Ci0JCQl9Ci0JCX0KLQkJcHcucHJpbnQoJyknKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBTZXF1ZW5jZU9uKFNlcXVlbmNlIHNlcXVlbmNlLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCgic2VxdWVuY2U6ICIpOwotCQlwdy5wcmludGxuKHNlcXVlbmNlLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGR1bXAgSkRCQyBtZXRhZGF0YSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wSkRCQ0NhdGFsb2dzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUluZGVudGluZ1ByaW50V3JpdGVyIHB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpOwotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY29uc29sZSBzbyBldmVyeXRoaW5nIGlzIGNvbnRpZ3VvdXMKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQl0aGlzLmR1bXBKREJDQ2F0YWxvZ3NPbihwdyk7Ci0JCX0KLQkJcHcuZmx1c2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wSkRCQ0NhdGFsb2dzT24oSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlwdy5wcmludGxuKCJKREJDIGNhdGFsb2dzOiAiKTsKLQkJcHcuaW5kZW50KCk7Ci0JCQlBcnJheUxpc3Q8QXJyYXlMaXN0PE9iamVjdD4+IHJvd3MgPSB0aGlzLmJ1aWxkUm93cyh0aGlzLmdldERhdGFiYXNlTWV0YURhdGEoKS5nZXRDYXRhbG9ncygpKTsKLQkJCWZvciAoSXRlcmF0b3I8QXJyYXlMaXN0PE9iamVjdD4+IHN0cmVhbSA9IHJvd3MuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJcHcucHJpbnRsbihzdHJlYW0ubmV4dCgpLmdldCgwKSk7Ci0JCQl9Ci0JCXB3LnVuZGVudCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBKREJDU2NoZW1hdGEoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KSk7Ci0JCS8vIHN5bmNocm9uaXplIHRoZSBjb25zb2xlIHNvIGV2ZXJ5dGhpbmcgaXMgY29udGlndW91cwotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKLQkJCXRoaXMuZHVtcEpEQkNTY2hlbWF0YU9uKHB3KTsKLQkJfQotCQlwdy5mbHVzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBKREJDU2NoZW1hdGFPbihJbmRlbnRpbmdQcmludFdyaXRlciBwdykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXB3LnByaW50bG4oIkpEQkMgc2NoZW1hdGE6ICIpOwotCQlwdy5pbmRlbnQoKTsKLQkJCUFycmF5TGlzdDxBcnJheUxpc3Q8T2JqZWN0Pj4gcm93cyA9IHRoaXMuYnVpbGRSb3dzKHRoaXMuZ2V0RGF0YWJhc2VNZXRhRGF0YSgpLmdldFNjaGVtYXMoKSk7Ci0JCQlmb3IgKEFycmF5TGlzdDxPYmplY3Q+IHJvdyA6IHJvd3MpIHsKLQkJCQlpZiAocm93LnNpemUoKSA9PSAyKSB7ICAvLyBjYXRhbG9ncyB3ZXJlIGFkZGVkIGluIGpkayAxLjQKLQkJCQkJT2JqZWN0IGNhdGFsb2cgPSByb3cuZ2V0KDEpOwotCQkJCQlwdy5wcmludChjYXRhbG9nKTsKLQkJCQkJcHcucHJpbnQoJy4nKTsKLQkJCQl9Ci0JCQkJT2JqZWN0IHNjaGVtYSA9IHJvdy5nZXQoMCk7Ci0JCQkJcHcucHJpbnRsbihzY2hlbWEpOwotCQkJfQotCQlwdy51bmRlbnQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29ubmVjdGlvbiBwcm9maWxlIGxpc3RlbmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGVzdENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgaW1wbGVtZW50cyBDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIHsKLQkJcHVibGljIFN0cmluZyBhZGRlZE5hbWU7Ci0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlZE5hbWU7Ci0JCXB1YmxpYyBTdHJpbmcgcmVuYW1lZE9sZE5hbWU7Ci0JCXB1YmxpYyBTdHJpbmcgcmVuYW1lZE5ld05hbWU7Ci0KLQkJcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVBZGRlZChTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5hZGRlZE5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVtb3ZlZChTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5yZW1vdmVkTmFtZSA9IG5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW5hbWVkKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgewotCQkJdGhpcy5yZW5hbWVkT2xkTmFtZSA9IG9sZE5hbWU7Ci0JCQl0aGlzLnJlbmFtZWROZXdOYW1lID0gbmV3TmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCXRoaXMuYWRkZWROYW1lID0gbnVsbDsKLQkJCXRoaXMucmVtb3ZlZE5hbWUgPSBudWxsOwotCQkJdGhpcy5yZW5hbWVkT2xkTmFtZSA9IG51bGw7Ci0JCQl0aGlzLnJlbmFtZWROZXdOYW1lID0gbnVsbDsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25uZWN0aW9uIGxpc3RlbmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIENvbm5lY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBvcGVuZWRQcm9maWxlOwotCQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgbW9kaWZpZWRQcm9maWxlOwotCQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgb2tUb0Nsb3NlUHJvZmlsZTsKLQkJcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIGFib3V0VG9DbG9zZVByb2ZpbGU7Ci0JCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBjbG9zZWRQcm9maWxlOwotCQlwdWJsaWMgRGF0YWJhc2UgY2hhbmdlZERhdGFiYXNlOwotCQlwdWJsaWMgQ2F0YWxvZyBjaGFuZ2VkQ2F0YWxvZzsKLQkJcHVibGljIFNjaGVtYSBjaGFuZ2VkU2NoZW1hOwotCQlwdWJsaWMgU2VxdWVuY2UgY2hhbmdlZFNlcXVlbmNlOwotCQlwdWJsaWMgVGFibGUgY2hhbmdlZFRhYmxlOwotCQlwdWJsaWMgQ29sdW1uIGNoYW5nZWRDb2x1bW47Ci0JCXB1YmxpYyBGb3JlaWduS2V5IGNoYW5nZWRGb3JlaWduS2V5OwotCi0JCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQl0aGlzLm9wZW5lZFByb2ZpbGUgPSBwcm9maWxlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1vZGlmaWVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCXRoaXMubW9kaWZpZWRQcm9maWxlID0gcHJvZmlsZTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5va1RvQ2xvc2VQcm9maWxlID0gcHJvZmlsZTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQl0aGlzLmFib3V0VG9DbG9zZVByb2ZpbGUgPSBwcm9maWxlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQl0aGlzLmNsb3NlZFByb2ZpbGUgPSBwcm9maWxlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkJdGhpcy5jaGFuZ2VkRGF0YWJhc2UgPSBkYXRhYmFzZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjYXRhbG9nQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDYXRhbG9nIGNhdGFsb2cpIHsKLQkJCXRoaXMuY2hhbmdlZENhdGFsb2cgPSBjYXRhbG9nOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2NoZW1hIHNjaGVtYSkgewotCQkJdGhpcy5jaGFuZ2VkU2NoZW1hID0gc2NoZW1hOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNlcXVlbmNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTZXF1ZW5jZSBzZXF1ZW5jZSkgewotCQkJdGhpcy5jaGFuZ2VkU2VxdWVuY2UgPSBzZXF1ZW5jZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgVGFibGUgdGFibGUpIHsKLQkJCXRoaXMuY2hhbmdlZFRhYmxlID0gdGFibGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sdW1uQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDb2x1bW4gY29sdW1uKSB7Ci0JCQl0aGlzLmNoYW5nZWRDb2x1bW4gPSBjb2x1bW47Ci0JCX0KLQkJcHVibGljIHZvaWQgZm9yZWlnbktleUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCQl0aGlzLmNoYW5nZWRGb3JlaWduS2V5ID0gZm9yZWlnbktleTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCXRoaXMub3BlbmVkUHJvZmlsZSA9IG51bGw7Ci0JCQl0aGlzLm1vZGlmaWVkUHJvZmlsZSA9IG51bGw7Ci0JCQl0aGlzLm9rVG9DbG9zZVByb2ZpbGUgPSBudWxsOwotCQkJdGhpcy5hYm91dFRvQ2xvc2VQcm9maWxlID0gbnVsbDsKLQkJCXRoaXMuY2xvc2VkUHJvZmlsZSA9IG51bGw7Ci0JCQl0aGlzLmNoYW5nZWREYXRhYmFzZSA9IG51bGw7Ci0JCQl0aGlzLmNoYW5nZWRDYXRhbG9nID0gbnVsbDsKLQkJCXRoaXMuY2hhbmdlZFNjaGVtYSA9IG51bGw7Ci0JCQl0aGlzLmNoYW5nZWRTZXF1ZW5jZSA9IG51bGw7Ci0JCQl0aGlzLmNoYW5nZWRUYWJsZSA9IG51bGw7Ci0JCQl0aGlzLmNoYW5nZWRDb2x1bW4gPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkRm9yZWlnbktleSA9IG51bGw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRGVyYnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9EZXJieVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYzFiYTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9EZXJieVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRGVyYnlUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIERlcmJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiZGVyYnkucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIkRlcmJ5IEVtYmVkZGVkIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLkRlcmJ5IEVtYmVkZGVkIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZGVyYnkxMDEuZ2VuZXJpY0RyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIkRlcmJ5IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxMC4xIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5hcGFjaGUuZGVyYnkuamRiYy5FbWJlZGRlZERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJEZXJieV8xMC4xX0VtYmVkZGVkIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJEZXJieSAxMC4xIEVtYmVkZGVkIEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvdmlkZXJJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmRlcmJ5LmVtYmVkZGVkLmNvbm5lY3Rpb25Qcm9maWxlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QxIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEVTVDEiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRFU1QyIik7Ci0JCVNjaGVtYSBzY2hlbWEyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJURVNUMiIpOwotCQlhc3NlcnROdWxsKHNjaGVtYTIpOyAgLy8gc2hvdWxkIGJlIG51bGwgdW50aWwgcmVmcmVzaAotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuZ2V0RGF0YWJhc2UoKSwgbGlzdGVuZXIuY2hhbmdlZERhdGFiYXNlKTsKLQotCQlzY2hlbWEyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJURVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlhc3NlcnROb3RTYW1lKHNjaGVtYTEsIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiVEVTVDEiKSk7ICAvLyB3ZSBzaG91bGQgaGF2ZSBhIG5ldyBzY2hlbWEgYWZ0ZXIgdGhlIHJlZnJlc2gKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QyIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDEiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIExPT0tVUF9URVNUIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJMT09LVVBfVEVTVCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0IikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX1RFU1QiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgXCJsb29rdXBfVEVTVFwiIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJMT09LVVBfVEVTVCIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0IikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX1RFU1QiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hSWRlbnRpZmllcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIGxvb2t1cF90ZXN0Iik7ICAvLyB0aGlzIGdldHMgZm9sZGVkIHRvIHVwcGVyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgXCJsb29rdXBfVEVTVFwiIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKTsKLQkJYXNzZXJ0RXF1YWxzKCJMT09LVVBfVEVTVCIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxPT0tVUF9URVNUIiwgc2NoZW1hLmdldElkZW50aWZpZXIoIkxvb2t1cFRlc3QiKSk7Ci0JCWFzc2VydE51bGwoc2NoZW1hLmdldElkZW50aWZpZXIoIkxvb2t1cF9UZXN0IikpOwotCi0JCXNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpOwotCQlhc3NlcnRFcXVhbHMoIkxPT0tVUF9URVNUIiwgc2NoZW1hLmdldElkZW50aWZpZXIoKSk7Ci0KLQkJc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwibG9va3VwX1RFU1RcIiIpOwotCQlhc3NlcnRFcXVhbHMoIlwibG9va3VwX1RFU1RcIiIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIlwibG9va3VwX1RFU1RcIiIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCJsb29rdXBfVEVTVCIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PX0JBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBUiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEFCTEVfVEVTVCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlNFVCBTQ0hFTUEgPSBUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhekRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29CYXpEREwoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRBQkxFX1RFU1QiKTsKLQotCQkvLyBGT08KLQkJVGFibGUgZm9vVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiRk9PIik7Ci0JCWFzc2VydEVxdWFscyg0LCBmb29UYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gcGtDb2x1bW4gPSBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBwa0NvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gaWRDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiSUQiKTsKLQkJYXNzZXJ0U2FtZShwa0NvbHVtbiwgaWRDb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoIklOVEVHRVIiLCBpZENvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGlkQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGlkQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIG5hbWVDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMjAsIG5hbWVDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydFRydWUobmFtZUNvbHVtbi5pc051bGxhYmxlKCkpOwotCi0JCUNvbHVtbiBiYXJDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiQkFSX0lEIik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlDb2x1bW4gc2FsYXJ5Q29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoIlNBTEFSWSIpOwotCQlhc3NlcnRFcXVhbHMoIkRFQ0lNQUwiLCBzYWxhcnlDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKHNhbGFyeUNvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHNhbGFyeUNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgc2FsYXJ5Q29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHNhbGFyeUNvbHVtbi5nZXRTY2FsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBzYWxhcnlDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCi0JCUZvcmVpZ25LZXkgYmFyRksgPSBmb29UYWJsZS5nZXRGb3JlaWduS2V5cygpLml0ZXJhdG9yKCkubmV4dCgpOyAgLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBmb3JlaWduIGtleQotCQlhc3NlcnRFcXVhbHMoMSwgYmFyRksuZ2V0Q29sdW1uUGFpcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGJhckZLLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0lEIiwgYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJwcmltYXJ5QmFyIikpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBiYXJGSy5nZXRCYXNlVGFibGUoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoZm9vVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0U2FtZShzY2hlbWEsIGZvb1RhYmxlLmdldFNjaGVtYSgpKTsKLQotCQkvLyBCQVIKLQkJVGFibGUgYmFyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygzLCBiYXJUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGJhclRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJRCIsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShiYXJUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCi0JCUNvbHVtbiBpZDJDb2x1bW4gPSBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiSUQyIik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGlkMkNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0vLwkJYXNzZXJ0VHJ1ZShpZDJDb2x1bW4uaXNQYXJ0T2ZVbmlxdWVDb25zdHJhaW50KCkpOyAgLy8gZG9lc24ndCB3b3JrKD8pCi0JCWFzc2VydEZhbHNlKGlkMkNvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkMkNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpZDJDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOyAgLy8gbm90IHN1cmUgd2hhdCB0byBleHBlY3QgaGVyZS4uLgotCQlhc3NlcnRFcXVhbHMoMCwgaWQyQ29sdW1uLmdldFNjYWxlKCkpOyAgLy8gbm90IHN1cmUgd2hhdCB0byBleHBlY3QgaGVyZSBlaXRoZXIuLi4KLQkJYXNzZXJ0RXF1YWxzKCJCTE9CIiwgYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoIkNIVU5LIikuZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJ5dGVbXSIsIGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJDSFVOSyIpLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCWFzc2VydFRydWUoYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoIkNIVU5LIikuaXNMT0IoKSk7Ci0JCWFzc2VydFNhbWUoYmFyVGFibGUsIGJhckZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQotCQkvLyBCQVoKLQkJVGFibGUgYmF6VGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiQkFaIik7Ci0JCUNvbHVtbiBuaWNrbmFtZUNvbHVtbiA9IGJhelRhYmxlLmdldENvbHVtbk5hbWVkKCJOSUNLTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoMjAsIG5pY2tuYW1lQ29sdW1uLmdldExlbmd0aCgpKTsKLS8vCQlhc3NlcnRUcnVlKG5pY2tuYW1lQ29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpKTsgIC8vIGRvZXNuJ3Qgd29yayg/KQotCi0JCS8vIEZPT19CQVoKLQkJVGFibGUgZm9vX2JhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoIkZPT19CQVoiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGZvb19iYXpUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgiRk9PX0lEIikuaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPT19CQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPTyIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVIiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7ICAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhckRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEJBUiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgSUQgSU5UIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEMiBJTlQgVU5JUVVFIE5PVCBOVUxMLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIENIVU5LIEJMT0IoMTAwSykiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEZPTyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgSUQgSU5UIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIE5BTUUgVkFSQ0hBUigyMCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgU0FMQVJZIERFQ0lNQUwoMTEsIDIpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEJBUl9JRCBJTlQgUkVGRVJFTkNFUyBCQVIoSUQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBCQVogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIElOVCBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBOSUNLTkFNRSBWQVJDSEFSKDIwKSBOT1QgTlVMTCBVTklRVUUiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEZPT19CQVogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEZPT19JRCBJTlQgUkVGRVJFTkNFUyBGT08oSUQpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEJBWl9JRCBJTlQgUkVGRVJFTkNFUyBCQVooSUQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIkNPTFVNTl9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIENPTFVNTl9URVNUIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIFNDSEVNQSA9IENPTFVNTl9URVNUIik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJDT0xVTU5fVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIm5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIkNPTFVNTl9URVNUIiwgInRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSUQgSU5URUdFUiwgTkFNRSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIkNPTFVNTl9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSUQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTkFNRSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIG1peGVkIGNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSWQgSU5URUdFUiwgTmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIkNPTFVNTl9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIGRlbGltaXRlZAotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChcIklkXCIgSU5URUdFUiwgXCJOYW1lXCIgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJDT0xVTU5fVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIlwiSWRcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJcIk5hbWVcIiIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIkNPTFVNTl9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NTY2hlbWFSZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFhSRUZfVEVTVDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgU0NIRU1BID0gWFJFRl9URVNUMSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBPUkcgKElEIElOVEVHRVIgUFJJTUFSWSBLRVksIE5BTUUgVkFSQ0hBUigyMCkpIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFhSRUZfVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgU0NIRU1BID0gWFJFRl9URVNUMiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBFTVAgKElEIElOVEVHRVIgUFJJTUFSWSBLRVksIE5BTUUgVkFSQ0hBUigyMCksICIgKwotCQkJCSJPUkdfSUQgSU5URUdFUiBSRUZFUkVOQ0VTIFhSRUZfVEVTVDEuT1JHKElEKSkiKTsKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlhSRUZfVEVTVDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWExKTsKLQkJVGFibGUgb3JnVGFibGUgPSBzY2hlbWExLmdldFRhYmxlTmFtZWQoIk9SRyIpOwotCQlhc3NlcnROb3ROdWxsKG9yZ1RhYmxlKTsKLQotCQlTY2hlbWEgc2NoZW1hMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiWFJFRl9URVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlUYWJsZSBlbXBUYWJsZSA9IHNjaGVtYTIuZ2V0VGFibGVOYW1lZCgiRU1QIik7Ci0JCWFzc2VydE5vdE51bGwoZW1wVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1wVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlGb3JlaWduS2V5IGZrID0gZW1wVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGUgcmVmVGFibGUgPSBmay5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWZUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygiT1JHIiwgcmVmVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZrLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJRm9yZWlnbktleS5Db2x1bW5QYWlyIGNwID0gZmsuZ2V0Q29sdW1uUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uIGJhc2VDb2x1bW4gPSBjcC5nZXRCYXNlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiT1JHX0lEIiwgYmFzZUNvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gcmVmQ29sdW1uID0gY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgcmVmQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BUYWJsZShTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNjaGVtYSBzY2hlbWE9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKHNjaGVtYU5hbWUpOwotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCWlmIChzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKHRhYmxlTmFtZSkgIT0gbnVsbCkgewotCQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBUQUJMRSAiICsgc2NoZW1hTmFtZSArICcuJyArIHRhYmxlTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOQjogQSBEZXJieSBzY2hlbWEgbXVzdCBiZSBlbXB0eSBiZWZvcmUgaXQgY2FuIGJlIGRyb3BwZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRyb3BTY2hlbWEoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIobmFtZSkgIT0gbnVsbCkgewotCQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFNDSEVNQSAiICsgbmFtZSArICIgUkVTVFJJQ1QiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9NeVNRTFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL015U1FMVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjOTQ0ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL015U1FMVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5qZGJjLklKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotCi0vKioKLSAqIE15U1FMCi0gKiAKLSAqIE5vdGVzOgotICogLSBXZSBjYW4gb25seSBnZXQgZGF0YWJhc2Ugb2JqZWN0cyBmcm9tIHRoZSBkYXRhYmFzZSBhc3NvY2lhdGVkIHdpdGggb3VyCi0gKiAgICAgY29ubmVjdGlvbiBwcm9maWxlLgotICogLSBXZSBjYW4gcmVmZXJlbmNlIG9iamVjdHMgYWNyb3NzIG11bHRpcGxlIGRhdGFiYXNlcywgc28gdGhleSBhcmUgc29ydGEgbGlrZQotICogICAgIHNjaGVtYXMuLi4uCi0gKiAtIEZvcmVpZ24ga2V5cyBtdXN0IGJlIGRlZmluZWQgYXMgdGFibGUtbGV2ZWwgY29uc3RyYWludHM7IHRoZXkgY2Fubm90IGJlCi0gKiAgICAgZGVmaW5lZCBhcyBwYXJ0IG9mIHRoZSBjb2x1bW4gY2xhdXNlLgotICogLSBDYXNlLXNlbnNpdGl2aXR5IGFuZCAtZm9sZGluZyBpcyB3aGFja2VkIG9uIE15U1FMLi4uLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNeVNRTFRlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgTXlTUUxUZXN0cyggU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJteXNxbC5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiTXlTUUwgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uTXlTUUwgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQubXlzcWwuNF8xLmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIk15U3FsIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICI0LjEiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAiY29tLm15c3FsLmpkYmMuRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRKREJDVVJMKCkgewotCQlyZXR1cm4gImpkYmM6bXlzcWw6Ly9sb2NhbGhvc3Q6MzMwNiI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJNeVNRTF80LjEiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIk15U1FMIDQuMSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnRpZXMgYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZVByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcCA9IHN1cGVyLmJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0aWVzKCk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX05BTUVfUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCXJldHVybiBwOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERhdGFiYXNlTmFtZSgpIHsKLQkJcmV0dXJuICJkYWxpdGVzdCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJcmV0dXJuIHRydWU7ICAvLyBzZWVtcyB0byB3b3JrLi4uCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdERhdGFiYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCS8vIERUUDogTXlTUUwgaGFzIGEgc2luZ2xlIHNjaGVtYSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGRhdGFiYXNlCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQodGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmdldERlZmF1bHRTY2hlbWEoKSwgc2NoZW1hKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BEYXRhYmFzZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgREFUQUJBU0UgIiArIHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZyh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiZm9vX2JheiIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJmb28iKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImJhciIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmFyRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0RETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXpEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vQmF6RERMKCkpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJLy8gZm9vCi0JCVRhYmxlIGZvb1RhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgZm9vVGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0KLQkJQ29sdW1uIHBrQ29sdW1uID0gZm9vVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgcGtDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIGlkQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoImlkIik7Ci0JCWFzc2VydFNhbWUocGtDb2x1bW4sIGlkQ29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlQiLCBpZENvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGlkQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGlkQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIG5hbWVDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgibmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlDb2x1bW4gYmFyQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoImJhcl9pZCIpOwotCQlhc3NlcnRFcXVhbHMoIklOVCIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlGb3JlaWduS2V5IGJhckZLID0gZm9vVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsgIC8vIHRoZXJlIHNob3VsZCBvbmx5IGJlIDEgZm9yZWlnbiBrZXkKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhckZLLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBiYXJGSy5nZXRBdHRyaWJ1dGVOYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoImJhcl9pZCIsIGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigicHJpbWFyeUJhciIpKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgYmFyRksuZ2V0QmFzZVRhYmxlKCkpOwotCi0JCWFzc2VydEZhbHNlKGZvb1RhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFNhbWUoc2NoZW1hLCBmb29UYWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJLy8gQkFSCi0JCVRhYmxlIGJhclRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYmFyVGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiYXJUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTE9CIiwgYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoImNodW5rIikuZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJ5dGVbXSIsIGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCWFzc2VydFRydWUoYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoImNodW5rIikuaXNMT0IoKSk7Ci0JCWFzc2VydFNhbWUoYmFyVGFibGUsIGJhckZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQotCQkvLyBGT09fQkFaCi0JCVRhYmxlIGZvb19iYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJmb29fYmF6Iik7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBmb29fYmF6VGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuZ2V0Q29sdW1uTmFtZWQoImZvb19pZCIpLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiZm9vX2JheiIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJmb28iKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImJhciIpOwotCi0JCXRoaXMuZHJvcERhdGFiYXNlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXJEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBiYXIgKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgY2h1bmsgQkxPQiIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRm9vRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgZm9vICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIG5hbWUgVkFSQ0hBUigyMCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgYmFyX2lkIElOVEVHRVIsIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgRk9SRUlHTiBLRVkgKGJhcl9pZCkgUkVGRVJFTkNFUyBiYXIoaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBiYXogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgbmFtZSBWQVJDSEFSKDIwKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRm9vQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgZm9vX2JheiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgZm9vX2lkIElOVCwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBiYXpfaWQgSU5ULCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEZPUkVJR04gS0VZIChmb29faWQpIFJFRkVSRU5DRVMgZm9vKGlkKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBGT1JFSUdOIEtFWSAoYmF6X2lkKSBSRUZFUkVOQ0VTIGJheihpZCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBPbiBXaW5kb3dzLCB0YWJsZSBuYW1lcyBnZXQgZm9sZGVkIHRvIGxvd2VyY2FzZSBieSBkZWZhdWx0OwotCSAqIGV2ZW4gaWYgdGhlIG5hbWUgaXMgZGVsaW1pdGVkIChhcHBhcmVudGx5KS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGVMb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wRGF0YWJhc2UodGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIERBVEFCQVNFICIgKyB0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2codGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgInRlc3QxIik7Ci0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJURVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiYFRFU1QzYCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QxIChpZCBJTlRFR0VSLCBuYW1lIFZBUkNIQVIoMjApKSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBURVNUMiAoaWQgSU5URUdFUiwgbmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgYFRFU1QzYCAoaWQgSU5URUdFUiwgbmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCi0JCVRhYmxlIHRlc3QxVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0MSIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QxVGFibGUpOwotCi0JCS8vIHRoaXMgcHJvYmFibHkgb25seSB3b3JrcyBvbiBXaW5kb3dzCi0JCVRhYmxlIHRlc3QyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0MiIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QyVGFibGUpOwotCi0JCS8vIHRoaXMgcHJvYmFibHkgb25seSB3b3JrcyBvbiBXaW5kb3dzCi0JCVRhYmxlIHRlc3QzVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJgdGVzdDNgIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDNUYWJsZSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgInRlc3QxIik7Ci0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJURVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiYFRFU1QzYCIpOwotCi0JCXRoaXMuZHJvcERhdGFiYXNlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BEYXRhYmFzZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgREFUQUJBU0UgIiArIHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZyh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAidGVzdCIpOwotCi0JCS8vIGxvd2VyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChpZCBJTlRFR0VSLCBuYW1lIFZBUkNIQVIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIm5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgInRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSUQgSU5URUdFUiwgTkFNRSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIklEIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJOQU1FIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJ0ZXN0Iik7Ci0KLQkJLy8gbWl4ZWQgY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChJZCBJTlRFR0VSLCBOYW1lIFZBUkNIQVIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIk5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgInRlc3QiKTsKLQotCQkvLyBkZWxpbWl0ZWQKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoYElkYCBJTlRFR0VSLCBgTmFtZWAgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImBJZGAiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiYE5hbWVgIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJ0ZXN0Iik7Ci0KLQkJdGhpcy5kcm9wRGF0YWJhc2UodGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSBjYW4gb25seSBnZXQgYSBzaW5nbGUgInNjaGVtYSIgcGVyIGNvbm5lY3Rpb24gdmlhIERUUCwKLQkgKiBzbyBjcm9zcy1zY2hlbWEgcmVmZXJlbmNlcyBhcmUgbm90IHZpc2libGUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENyb3NzU2NoZW1hUmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcERhdGFiYXNlKCJ4cmVmX3Rlc3QyIik7Ci0JCXRoaXMuZHJvcERhdGFiYXNlKCJ4cmVmX3Rlc3QxIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgREFUQUJBU0UgeHJlZl90ZXN0MSIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygieHJlZl90ZXN0MSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBvcmcgKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgREFUQUJBU0UgeHJlZl90ZXN0MiIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygieHJlZl90ZXN0MiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBlbXAgKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIG5hbWUgVkFSQ0hBUigyMCksICIgKwotCQkJCSJvcmdfaWQgSU5URUdFUiwgRk9SRUlHTiBLRVkgKG9yZ19pZCkgUkVGRVJFTkNFUyB4cmVmX3Rlc3QxLm9yZyhpZCkpIik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInhyZWZfdGVzdDIiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCVNjaGVtYSBzY2hlbWEyID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMik7Ci0JCVRhYmxlIGVtcFRhYmxlID0gc2NoZW1hMi5nZXRUYWJsZU5hbWVkKCJlbXAiKTsKLQkJYXNzZXJ0Tm90TnVsbChlbXBUYWJsZSk7Ci0JCS8vIG5vIGZvcmVpZ24ga2V5cwotCQlhc3NlcnRFcXVhbHMoMCwgZW1wVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCi0JCXRoaXMuZHJvcERhdGFiYXNlKCJ4cmVmX3Rlc3QyIik7Ci0JCXRoaXMuZHJvcERhdGFiYXNlKCJ4cmVmX3Rlc3QxIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJvcFRhYmxlKFN0cmluZyBkYk5hbWUsIFN0cmluZyB0YWJsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkRST1AgVEFCTEUgSUYgRVhJU1RTICIgKyBkYk5hbWUgKyAnLicgKyB0YWJsZU5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkcm9wRGF0YWJhc2UoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkRST1AgREFUQUJBU0UgSUYgRVhJU1RTICIgKyBuYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwZTM0My4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JhY2xlMTBnVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBPcmFjbGUxMGdUZXN0cyggU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoIG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAib3JhY2xlMTBnLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk9yYWNsZSBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vcmFjbGUuMTAuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiT3JhY2xlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxMCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmFjbGUuamRiYy5PcmFjbGVEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlMTBnXzEwLjEuMC40IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJPcmFjbGUxMGcgKDEwLjEuMC40KSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJLy8gd29ya2luZyBvZmZsaW5lIGlzIHByZXR0eSB1Z2x5Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGF0YWJhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0VXNlck5hbWUoKS50b1VwcGVyQ2FzZSgpLmVxdWFscygiU1lTIikpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2tpcHBlZCB0ZXN0OiAiICsgdGhpcy5nZXRDbGFzcygpICsgJy4nICsgdGhpcy5nZXROYW1lKCkpOwotCQkJcmV0dXJuOyAgLy8gU1lTIGRvZXMgbm90IGhhdmUgYSBzY2hlbWEKLQkJfQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkvLyBPcmFjbGUgc2hvdWxkIGhhdmUgYSBzY2hlbWEgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSB1c2VyCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcih0aGlzLmdldFVzZXJJRCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEpOwotCQlhc3NlcnRTYW1lKHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLCBzY2hlbWEpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJmb29fYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJiYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUoImZvbyIpOwotCQl0aGlzLmRyb3BUYWJsZSgiYmFyIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhekRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29CYXpEREwoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQkvLyBmb28KLQkJVGFibGUgZm9vVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZvb1RhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCi0JCUNvbHVtbiBwa0NvbHVtbiA9IGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJJRCIsIHBrQ29sdW1uLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiBpZENvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImlkIik7Ci0JCWFzc2VydFNhbWUocGtDb2x1bW4sIGlkQ29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKCJOVU1CRVIiLCBpZENvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGlkQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubWF0aC5CaWdEZWNpbWFsIiwgaWRDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQotCQlDb2x1bW4gbmFtZUNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIm5hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJWQVJDSEFSMiIsIG5hbWVDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBuYW1lQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCi0JCUNvbHVtbiBiYXJDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJiYXJfaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJOVU1CRVIiLCBiYXJDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGJhckNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGJhckNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0KLQkJRm9yZWlnbktleSBiYXJGSyA9IGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzKCkuaXRlcmF0b3IoKS5uZXh0KCk7ICAvLyB0aGVyZSBzaG91bGQgb25seSBiZSAxIGZvcmVpZ24ga2V5Ci0JCWFzc2VydEVxdWFscygxLCBiYXJGSy5nZXRDb2x1bW5QYWlyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYmFyRksuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfSUQiLCBiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoInByaW1hcnlCYXIiKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGJhckZLLmdldEJhc2VUYWJsZSgpKTsKLQotCQlhc3NlcnRGYWxzZShmb29UYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgZm9vVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCS8vIEJBUgotCQlUYWJsZSBiYXJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYmFyVGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiYXJUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTE9CIiwgYmFyVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiY2h1bmsiKS5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYnl0ZVtdIiwgYmFyVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiY2h1bmsiKS5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGJhclRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImNodW5rIikuaXNMT0IoKSk7Ci0JCWFzc2VydFNhbWUoYmFyVGFibGUsIGJhckZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQotCQkvLyBGT09fQkFaCi0JCVRhYmxlIGZvb19iYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoImZvb19iYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGZvb19iYXpUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJmb29faWQiKS5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoImZvb19iYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUoImJheiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiZm9vIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJiYXIiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmFyRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgYmFyICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBOVU1CRVIoMTApIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGNodW5rIEJMT0IiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvbyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgTlVNQkVSKDEwKSBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuYW1lIFZBUkNIQVIyKDIwKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBiYXJfaWQgUkVGRVJFTkNFUyBiYXIoaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBiYXogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIE5VTUJFUigxMCkgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgbmFtZSBWQVJDSEFSMigyMCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvb19iYXogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGZvb19pZCBOVU1CRVIoMTApIFJFRkVSRU5DRVMgZm9vKGlkKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBiYXpfaWQgTlVNQkVSKDEwKSBSRUZFUkVOQ0VTIGJheihpZCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGVMb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QxIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJURVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiXCJ0ZXN0M1wiIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdDEgKGlkIE5VTUJFUigxMCksIG5hbWUgVkFSQ0hBUjIoMjApKSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBURVNUMiAoaWQgTlVNQkVSKDEwKSwgbmFtZSBWQVJDSEFSMigyMCkpIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIFwidGVzdDNcIiAoaWQgTlVNQkVSKDEwKSwgbmFtZSBWQVJDSEFSMigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQlUYWJsZSB0ZXN0MVRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdDEiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MVRhYmxlKTsKLQkJdGVzdDFUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoIlRFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDFUYWJsZSk7Ci0KLQkJVGFibGUgdGVzdDJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QyIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDJUYWJsZSk7Ci0JCXRlc3QyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJURVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QyVGFibGUpOwotCi0JCVRhYmxlIHRlc3QzVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJcInRlc3QzXCIiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0M1RhYmxlKTsKLQkJdGVzdDNUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QzIik7Ci0JCWFzc2VydE51bGwodGVzdDNUYWJsZSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QxIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJURVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiXCJ0ZXN0M1wiIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0Iik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGlkIE5VTUJFUigxMCksIG5hbWUgVkFSQ0hBUjIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIm5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSUQgTlVNQkVSKDEwKSwgTkFNRSBWQVJDSEFSMigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSUQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTkFNRSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCS8vIG1peGVkIGNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSWQgTlVNQkVSKDEwKSwgTmFtZSBWQVJDSEFSMigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCS8vIGRlbGltaXRlZAotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChcIklkXCIgTlVNQkVSKDEwKSwgXCJOYW1lXCIgVkFSQ0hBUjIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIlwiSWRcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJcIk5hbWVcIiIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyb3NzU2NoZW1hUmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICggISB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldFVzZXJOYW1lKCkudG9VcHBlckNhc2UoKS5lcXVhbHMoIlNZUyIpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInNraXBwZWQgdGVzdDogIiArIHRoaXMuZ2V0Q2xhc3MoKSArICcuJyArIHRoaXMuZ2V0TmFtZSgpKTsKLQkJCXJldHVybjsgIC8vIFNZUyBkb2VzIG5vdCBoYXZlIGEgc2NoZW1hCi0JCX0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJEUk9QIFVTRVIgWFJFRl9URVNUMiBDQVNDQURFIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiRFJPUCBVU0VSIFhSRUZfVEVTVDEgQ0FTQ0FERSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFVTRVIgWFJFRl9URVNUMSBJREVOVElGSUVEIEJZIGZvbyIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkFMVEVSIFVTRVIgWFJFRl9URVNUMSBRVU9UQSBVTkxJTUlURUQgT04gVVNFUlMiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgWFJFRl9URVNUMS5PUkcgKElEIE5VTUJFUigxMCkgUFJJTUFSWSBLRVksIE5BTUUgVkFSQ0hBUjIoMjApKSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFVTRVIgWFJFRl9URVNUMiBJREVOVElGSUVEIEJZIGZvbyIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkFMVEVSIFVTRVIgWFJFRl9URVNUMiBRVU9UQSBVTkxJTUlURUQgT04gVVNFUlMiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJHUkFOVCBBTEwgT04gWFJFRl9URVNUMS5PUkcgVE8gWFJFRl9URVNUMiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBYUkVGX1RFU1QyLkVNUCAoSUQgTlVNQkVSKDEwKSBQUklNQVJZIEtFWSwgTkFNRSBWQVJDSEFSMigyMCksICIgKwotCQkJCSJPUkdfSUQgTlVNQkVSKDEwKSBSRUZFUkVOQ0VTIFhSRUZfVEVTVDEuT1JHKElEKSkiKTsKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlhSRUZfVEVTVDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWExKTsKLQkJVGFibGUgb3JnVGFibGUgPSBzY2hlbWExLmdldFRhYmxlTmFtZWQoIk9SRyIpOwotCQlhc3NlcnROb3ROdWxsKG9yZ1RhYmxlKTsKLQotCQlTY2hlbWEgc2NoZW1hMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiWFJFRl9URVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlUYWJsZSBlbXBUYWJsZSA9IHNjaGVtYTIuZ2V0VGFibGVOYW1lZCgiRU1QIik7Ci0JCWFzc2VydE5vdE51bGwoZW1wVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1wVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlGb3JlaWduS2V5IGZrID0gZW1wVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGUgcmVmVGFibGUgPSBmay5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWZUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygiT1JHIiwgcmVmVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZrLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJRm9yZWlnbktleS5Db2x1bW5QYWlyIGNwID0gZmsuZ2V0Q29sdW1uUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uIGJhc2VDb2x1bW4gPSBjcC5nZXRCYXNlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiT1JHX0lEIiwgYmFzZUNvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gcmVmQ29sdW1uID0gY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgcmVmQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFVTRVIgWFJFRl9URVNUMiBDQVNDQURFIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBVU0VSIFhSRUZfVEVTVDEgQ0FTQ0FERSIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkcm9wVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiRFJPUCBUQUJMRSAiICsgdGFibGVOYW1lICsgIiBDQVNDQURFIENPTlNUUkFJTlRTIik7Ci0JfQotCi0vLyBuZWVkIE9yYWNsZSBlbmFibGVtZW50IHBsdWctaW4KLS8vCXB1YmxpYyB2b2lkIHRlc3RTZXF1ZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotLy8JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLS8vCi0vLwkJdGhpcy5kcm9wU2VxdWVuY2UoIkZPT19TRVEiKTsKLS8vCi0vLwkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0VRVUVOQ0UgRk9PX1NFUSIpOwotLy8JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotLy8KLS8vCQlTZXF1ZW5jZSBzZXF1ZW5jZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0U2VxdWVuY2VGb3JJZGVudGlmaWVyKCJGT08iKTsKLS8vCQlhc3NlcnROb3ROdWxsKHNlcXVlbmNlKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPT19TRVEiLCBzZXF1ZW5jZS5nZXROYW1lKCkpOwotLy8KLS8vCQl0aGlzLmRyb3BTZXF1ZW5jZSgiRk9PX1NFUSIpOwotLy8KLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0vLwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSB2b2lkIGRyb3BTZXF1ZW5jZShTdHJpbmcgc2VxdWVuY2VOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoIkRST1AgU0VRVUVOQ0UgIiArIHNlcXVlbmNlTmFtZSk7Ci0vLwl9Ci0vLwotCXByb3RlY3RlZCB2b2lkIGR1bXBVc2VyT2JqZWN0cygpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQl0aGlzLmR1bXAoInNlbGVjdCAqIGZyb20gdXNlcl9vYmplY3RzIik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1hFVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnWEVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjMwOWY4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnWEVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi0KLS8qKgotICogIE9yYWNsZSAxMGcgVGhpbiBEcml2ZXIgVGVzdAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcmFjbGUxMGdYRVRlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgT3JhY2xlMTBnWEVUZXN0cyggU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoIG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAib3JhY2xlMTBnWEUucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIk9yYWNsZSAxMGcgVGhpbiBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uT3JhY2xlIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm9yYWNsZS4xMC5kcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJPcmFjbGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gIjEwIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yYWNsZS5qZGJjLk9yYWNsZURyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUxMGdfWEUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIk9yYWNsZTEwZyBYRSBSZWxlYXNlIDIgKDEwLjIpIEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlT2ZmbGluZVRlc3RzKCkgewotCQkvLyB3b3JraW5nIG9mZmxpbmUgaXMgcHJldHR5IHVnbHkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGU5aVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTlpVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQxYzQ3NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTlpVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotCi0vKioKLSAqICBPcmFjbGUgOWkgVGhpbiBEcml2ZXIgVGVzdAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcmFjbGU5aVRlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgT3JhY2xlOWlUZXN0cyggU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoIG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAib3JhY2xlOWkucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIk9yYWNsZSA5aSBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5PcmFjbGUgVGhpbiBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQub3JhY2xlLjkuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiT3JhY2xlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICI5IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yYWNsZS5qZGJjLk9yYWNsZURyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGU5aSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiT3JhY2xlOWkgSkRCQyBQcm9maWxlIFtUZXN0XSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVPZmZsaW5lVGVzdHMoKSB7Ci0JCS8vIHdvcmtpbmcgb2ZmbGluZSBpcyBwcmV0dHkgdWdseQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1Bvc3RncmVTUUxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9Qb3N0Z3JlU1FMVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1NGJiZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1Bvc3RncmVTUUxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFBvc3RncmVTUUxUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIFBvc3RncmVTUUxUZXN0cyggU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoIG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAicG9zdGdyZXNxbC5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiUG9zdGdyZVNRTCBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5Qb3N0Z3JlU1FMIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LnBvc3RncmVzcWwucG9zdGdyZXNxbERyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gInBvc3RncmVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICI4LngiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JnLnBvc3RncmVzcWwuRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRKREJDVVJMKCkgewotCQkvLyB1c2luZyB0aGlzIFVSTCB3aWxsIHJlc3VsdCBpbiB0aGUgRFRQIGRhdGFiYXNlIGNvbnRhaW5pbmcgYSBzaW5nbGUKLQkJLy8gY2F0YWxvZyBuYW1lZCAiIiAtIHdoaWNoLCB1bmZvcnR1bmF0ZWx5LCByZXNlbWJsZXMgdGhlIHBzZXVkby1jYXRhbG9nCi0JCS8vIGdlbmVyYXRlZCBieSBEVFAgZm9yIGRhdGFiYXNlcyB0aGF0IGRvIG5vdCByZXR1cm4gYW55IGNhdGFsb2dzIHZpYQotCQkvLyBKREJDIG1ldGFkYXRhIGNhbGxzLi4uCi0JCXJldHVybiAiamRiYzpwb3N0Z3Jlc3FsIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIlBvc3RncmVTUUwiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIlBvc3RncmVTUUwgOC4yIEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVPZmZsaW5lVGVzdHMoKSB7Ci0JCS8vIERUUCBkb2VzIG5vdCBzdXBwb3J0IFBvc3RncmVTUUwgb2ZmLWxpbmUgLSBzZWUgMjI2NzA0LzI0MTU1OAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QxIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEVTVDEiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEVTVDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWExKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEVTVDIiKTsKLQkJU2NoZW1hIHNjaGVtYTIgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEVTVDIiKTsKLQkJYXNzZXJ0TnVsbChzY2hlbWEyKTsgIC8vIHNob3VsZCBiZSBudWxsIHVudGlsIHJlZnJlc2gKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmdldERhdGFiYXNlKCksIGxpc3RlbmVyLmNoYW5nZWREYXRhYmFzZSk7Ci0KLQkJc2NoZW1hMiA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJURVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlhc3NlcnROb3RTYW1lKHNjaGVtYTEsIHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJURVNUMSIpKTsgIC8vIHdlIHNob3VsZCBoYXZlIGEgbmV3IHNjaGVtYSBhZnRlciB0aGUgcmVmcmVzaAotCi0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDIiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJURVNUMSIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2hlbWFMb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJMT09LVVBfVEVTVCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBMT09LVVBfVEVTVCIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgiTE9PS1VQX1RFU1QiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIkxPT0tVUF9URVNUIikpOwotCi0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfdGVzdCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigibG9va3VwX3Rlc3QiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF9URVNUIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfVEVTVCIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJcImxvb2t1cF90ZXN0XCIiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwibG9va3VwX1RFU1RcIiIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJMT09LVVBfVEVTVFwiIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgXCJsb29rdXBfVEVTVFwiIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJMT09LVVBfVEVTVCIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0IikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX1RFU1QiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hSWRlbnRpZmllcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIGxvb2t1cF90ZXN0Iik7ICAvLyB0aGlzIGdldHMgZm9sZGVkIHRvIGxvd2VyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgXCJsb29rdXBfVEVTVFwiIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb29rdXBfdGVzdCIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoImxvb2t1cF90ZXN0Iiwgc2NoZW1hLmdldElkZW50aWZpZXIoIkxvb2t1cFRlc3QiKSk7Ci0JCWFzc2VydE51bGwoc2NoZW1hLmdldElkZW50aWZpZXIoIkxvb2t1cF9UZXN0IikpOwotCi0JCXNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX3Rlc3QiKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb29rdXBfdGVzdCIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCkpOwotCi0JCXNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJcImxvb2t1cF9URVNUXCIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJcImxvb2t1cF9URVNUXCIiLCBzY2hlbWEuZ2V0SWRlbnRpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJcImxvb2t1cF9URVNUXCIiLCBzY2hlbWEuZ2V0SWRlbnRpZmllcigibG9va3VwX1RFU1QiKSk7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJMT09LVVBfVEVTVCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPT19CQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPTyIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVIiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRBQkxFX1RFU1QiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgc2VhcmNoX3BhdGggVE8gVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmFyRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0RETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXpEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vQmF6RERMKCkpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRBQkxFX1RFU1QiKTsKLQotCQkvLyBGT08KLQkJVGFibGUgZm9vVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZvb1RhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCi0JCUNvbHVtbiBwa0NvbHVtbiA9IGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHBrQ29sdW1uLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiBpZENvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklEIik7Ci0JCWFzc2VydFNhbWUocGtDb2x1bW4sIGlkQ29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlQ0IiwgaWRDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBpZENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZENvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGlkQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGlkQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIG5hbWVDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJOQU1FIik7Ci0JCWFzc2VydEVxdWFscygiVkFSQ0hBUiIsIG5hbWVDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBuYW1lQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCi0JCUNvbHVtbiBiYXJDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJCQVJfSUQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlQ0IiwgYmFyQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiYXJDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRGYWxzZShiYXJDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCi0JCUZvcmVpZ25LZXkgYmFyRksgPSBmb29UYWJsZS5nZXRGb3JlaWduS2V5cygpLml0ZXJhdG9yKCkubmV4dCgpOyAgLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBmb3JlaWduIGtleQotCQlhc3NlcnRFcXVhbHMoMSwgYmFyRksuZ2V0Q29sdW1uUGFpcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGJhckZLLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyX2lkIiwgYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJwcmltYXJ5QmFyIikpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBiYXJGSy5nZXRCYXNlVGFibGUoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoZm9vVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0U2FtZShzY2hlbWEsIGZvb1RhYmxlLmdldFNjaGVtYSgpKTsKLQotCQkvLyBCQVIKLQkJVGFibGUgYmFyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGJhclRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmFyVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhclRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQllURUEiLCBiYXJUYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJDSFVOSyIpLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlW10iLCBiYXJUYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJDSFVOSyIpLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCS8vIGFzc2VydFRydWUoYmFyVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiQ0hVTksiKS5kYXRhVHlwZUlzTE9CKCkpOwotCQlhc3NlcnRTYW1lKGJhclRhYmxlLCBiYXJGSy5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0KLQkJLy8gRk9PX0JBWgotCQlUYWJsZSBmb29fYmF6VGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJGT09fQkFaIik7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBmb29fYmF6VGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiRk9PX0lEIikuaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPT19CQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPTyIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVIiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7ICAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhckRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEJBUiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgSUQgaW50ZWdlciBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBDSFVOSyBieXRlYSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRm9vRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgRk9PICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBJRCBpbnRlZ2VyIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIE5BTUUgdmFyY2hhcigyMCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgQkFSX0lEIGludGVnZXIgUkVGRVJFTkNFUyBCQVIoSUQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBCQVogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIGludGVnZXIgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgTkFNRSB2YXJjaGFyKDIwKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRm9vQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgRk9PX0JBWiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgRk9PX0lEIGludCBSRUZFUkVOQ0VTIEZPTyhJRCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgQkFaX0lEIGludCBSRUZFUkVOQ0VTIEJBWihJRCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgInRlc3QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRBQkxFX1RFU1QiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgc2VhcmNoX3BhdGggVE8gVEFCTEVfVEVTVCIpOwotCi0JCS8vIGxvd2VyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChpZCBpbnQsIG5hbWUgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRBQkxFX1RFU1QiKS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJpZCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJuYW1lIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgInRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSUQgaW50LCBOQU1FIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJUQUJMRV9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSUQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTkFNRSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJ0ZXN0Iik7Ci0KLQkJLy8gbWl4ZWQgY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChJZCBpbnQsIE5hbWUgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRBQkxFX1RFU1QiKS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJJZCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJOYW1lIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgInRlc3QiKTsKLQotCQkvLyBkZWxpbWl0ZWQKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoXCJJZFwiIGludCwgXCJOYW1lXCIgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRBQkxFX1RFU1QiKS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJcIklkXCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiXCJOYW1lXCIiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAidGVzdCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcm9zc1NjaGVtYVJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMiIsICJFTVAiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QyIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJYUkVGX1RFU1QxIiwgIk9SRyIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlhSRUZfVEVTVDEiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgWFJFRl9URVNUMSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlNFVCBzZWFyY2hfcGF0aCBUTyBYUkVGX1RFU1QxIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIE9SRyAoSUQgaW50ZWdlciBQUklNQVJZIEtFWSwgTkFNRSB2YXJjaGFyKDIwKSkiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgWFJFRl9URVNUMiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlNFVCBzZWFyY2hfcGF0aCBUTyBYUkVGX1RFU1QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIEVNUCAoSUQgaW50ZWdlciBQUklNQVJZIEtFWSwgTkFNRSB2YXJjaGFyKDIwKSwgIiArCi0JCQkJIk9SR19JRCBpbnRlZ2VyIFJFRkVSRU5DRVMgWFJFRl9URVNUMS5PUkcoSUQpKSIpOwotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlTY2hlbWEgc2NoZW1hMSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgieHJlZl90ZXN0MSIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTEpOwotCQlUYWJsZSBvcmdUYWJsZSA9IHNjaGVtYTEuZ2V0VGFibGVOYW1lZCgib3JnIik7Ci0JCWFzc2VydE5vdE51bGwob3JnVGFibGUpOwotCi0JCVNjaGVtYSBzY2hlbWEyID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJ4cmVmX3Rlc3QyIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMik7Ci0JCVRhYmxlIGVtcFRhYmxlID0gc2NoZW1hMi5nZXRUYWJsZU5hbWVkKCJlbXAiKTsKLQkJYXNzZXJ0Tm90TnVsbChlbXBUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygxLCBlbXBUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCUZvcmVpZ25LZXkgZmsgPSBlbXBUYWJsZS5nZXRGb3JlaWduS2V5cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZSByZWZUYWJsZSA9IGZrLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlZlRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmciLCByZWZUYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZmsuZ2V0Q29sdW1uUGFpcnNTaXplKCkpOwotCQlGb3JlaWduS2V5LkNvbHVtblBhaXIgY3AgPSBmay5nZXRDb2x1bW5QYWlycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW4gYmFzZUNvbHVtbiA9IGNwLmdldEJhc2VDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmdfaWQiLCBiYXNlQ29sdW1uLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiByZWZDb2x1bW4gPSBjcC5nZXRSZWZlcmVuY2VkQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCByZWZDb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMiIsICJFTVAiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QyIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJYUkVGX1RFU1QxIiwgIk9SRyIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlhSRUZfVEVTVDEiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJvcFRhYmxlKFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgdGFibGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2NoZW1hIHNjaGVtYT0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoc2NoZW1hTmFtZSk7Ci0JCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJaWYgKHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIodGFibGVOYW1lKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFRBQkxFICIgKyBzY2hlbWFOYW1lICsgJy4nICsgdGFibGVOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkcm9wU2NoZW1hKFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKG5hbWUpICE9IG51bGwpIHsKLQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBTQ0hFTUEgIiArIG5hbWUgKyAiIENBU0NBREUiKTsKLQkJfQotCX0KLQotLy8gc2VlIDI0MTU3OC8yNDE1NTcKLS8vCXB1YmxpYyB2b2lkIHRlc3RTZXF1ZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotLy8JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLS8vCi0vLwkJdGhpcy5kcm9wU2VxdWVuY2UoIlNFUVVFTkNFX1RFU1QiLCAiRk9PIik7Ci0vLwkJdGhpcy5kcm9wU2NoZW1hKCJTRVFVRU5DRV9URVNUIik7Ci0vLwotLy8JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBTRVFVRU5DRV9URVNUIik7Ci0vLwkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgc2VhcmNoX3BhdGggVE8gU0VRVUVOQ0VfVEVTVCIpOwotLy8KLS8vCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhckRETCgpKTsKLS8vCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTRVFVRU5DRSBGT08gU1RBUlQgMSIpOwotLy8vLwkJTGlzdDxPYmplY3RbXT4gbGlzdCA9IHRoaXMuZXhlY3V0ZSgiU0VMRUNUIG5leHR2YWwoJ2ZvbycpIik7Ci0vLy8vCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdCk7Ci0vLwkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0vLwotLy8JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoIlNFUVVFTkNFX1RFU1QiKTsKLS8vCQlTZXF1ZW5jZSBzZXF1ZW5jZSA9IHNjaGVtYS5nZXRTZXF1ZW5jZU5hbWVkKCJGT08iKTsKLS8vCQlhc3NlcnROb3ROdWxsKHNlcXVlbmNlKTsKLS8vCQlhc3NlcnRFcXVhbHMoImZvb19zZXEiLCBzZXF1ZW5jZS5nZXROYW1lKCkpOwotLy8KLS8vCQl0aGlzLmRyb3BTZXF1ZW5jZSgiU0VRVUVOQ0VfVEVTVCIsICJGT08iKTsKLS8vCQl0aGlzLmRyb3BTY2hlbWEoIlNFUVVFTkNFX1RFU1QiKTsKLS8vCi0vLwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotLy8JfQotLy8KLS8vCXByaXZhdGUgdm9pZCBkcm9wU2VxdWVuY2UoU3RyaW5nIHNjaGVtYU5hbWUsIFN0cmluZyBzZXF1ZW5jZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotLy8JCVNjaGVtYSBzY2hlbWE9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZChzY2hlbWFOYW1lKTsKLS8vCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLS8vCQkJaWYgKHNjaGVtYS5nZXRTZXF1ZW5jZU5hbWVkKHNlcXVlbmNlTmFtZSkgIT0gbnVsbCkgewotLy8JCQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFNFUVVFTkNFICIgKyBzY2hlbWFOYW1lICsgJy4nICsgc2VxdWVuY2VOYW1lKTsKLS8vCQkJfQotLy8JCX0KLS8vCX0KLS8vCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1NRTFNlcnZlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1NRTFNlcnZlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZGRlNWQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9TUUxTZXJ2ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi0KLS8qKgotICogIFNRTCBTZXJ2ZXIgMjAwNSBEcml2ZXIgVGVzdAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTUUxTZXJ2ZXJUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIFNRTFNlcnZlclRlc3RzKCBTdHJpbmcgbmFtZSkgewotCQlzdXBlciggbmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJzcWxzZXJ2ZXIucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIk1pY3Jvc29mdCBTUUwgU2VydmVyIDIwMDUgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgMjAwNSBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5tc2Z0LnNxbHNlcnZlci4yMDA1LmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIlNRTFNlcnZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiMjAwNSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJjb20ubWljcm9zb2Z0LnNxbHNlcnZlci5qZGJjLlNRTFNlcnZlckRyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJTUUxTZXJ2ZXJfMjAwNSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgMjAwNSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3ZpZGVySUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5nZW5lcmljLmNvbm5lY3Rpb25Qcm9maWxlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlT2ZmbGluZVRlc3RzKCkgewotCQlyZXR1cm4gdHJ1ZTsgIC8vIGhhdmVuJ3QgYWN0dWFsbHkgdHJpZWQgdGhpcyB5ZXQuLi4KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU3liYXNlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU3liYXNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjZWE5OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1N5YmFzZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3liYXNlVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBTeWJhc2VUZXN0cyggU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoIG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAic3liYXNlLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJTeWJhc2UgSkRCQyBEcml2ZXIgZm9yIFN5YmFzZSBBU0UgMTUueCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5TeWJhc2UgSkRCQyBEcml2ZXIgZm9yIFN5YmFzZSBBU0UgMTUueCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLnN5YmFzZS5hc2UuZ2VuZXJpY0RyaXZlclRlbXBsYXRlXzE1IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIlN5YmFzZV9BU0UiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gIjE1LngiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAiY29tLnN5YmFzZS5qZGJjMy5qZGJjLlN5YkRyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJTeWJhc2VfMTUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIlN5YmFzZSBBU0UgMTUgakNvbm5lY3QgSkRCQyBQcm9maWxlIFtUZXN0XSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJLy8gd29ya2luZyBvZmZsaW5lIGlzIHByZXR0eSB1Z2x5Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTeWJhc2UgImRhdGFiYXNlcyIgYmVjb21lIERUUCAiY2F0YWxvZ3MiCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoImRyb3AgZGF0YWJhc2UgdGVzdDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJkcm9wIGRhdGFiYXNlIHRlc3QyIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgZGF0YWJhc2UgdGVzdDEiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJQ2F0YWxvZyBjYXRhbG9nMSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInRlc3QxIik7Ci0JCWFzc2VydE5vdE51bGwoY2F0YWxvZzEpOwotCQlTY2hlbWEgc2NoZW1hMSA9IGNhdGFsb2cxLmdldFNjaGVtYU5hbWVkKCJkYm8iKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWExKTsKLQkJYXNzZXJ0U2FtZShzY2hlbWExLCBjYXRhbG9nMS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIHRlc3QyIik7Ci0JCUNhdGFsb2cgY2F0YWxvZzIgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ0ZXN0MiIpOwotCQlhc3NlcnROdWxsKGNhdGFsb2cyKTsgIC8vIHNob3VsZCBiZSBudWxsIHVudGlsIHJlZnJlc2gKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmdldERhdGFiYXNlKCksIGxpc3RlbmVyLmNoYW5nZWREYXRhYmFzZSk7Ci0KLQkJY2F0YWxvZzIgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ0ZXN0MiIpOwotCQlhc3NlcnROb3ROdWxsKGNhdGFsb2cyKTsKLQkJU2NoZW1hIHNjaGVtYTIgPSBjYXRhbG9nMi5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMik7Ci0KLQkJYXNzZXJ0Tm90U2FtZShjYXRhbG9nMSwgdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgidGVzdDEiKSk7ICAvLyB3ZSBzaG91bGQgaGF2ZSBhIG5ldyBjYXRhbG9nIGFmdGVyIHRoZSByZWZyZXNoCi0JCWFzc2VydE5vdFNhbWUoc2NoZW1hMSwgdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgidGVzdDEiKS5nZXREZWZhdWx0U2NoZW1hKCkpOyAgLy8gd2Ugc2hvdWxkIGhhdmUgYSBuZXcgc2NoZW1hIGFmdGVyIHRoZSByZWZyZXNoCi0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIGRhdGFiYXNlIHRlc3QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCBkYXRhYmFzZSB0ZXN0MSIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiZHJvcCBkYXRhYmFzZSB0YWJsZV90ZXN0Iik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIHRhYmxlX3Rlc3QiKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInRhYmxlX3Rlc3QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhckRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29EREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmF6RERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0JhekRETCgpKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInRhYmxlX3Rlc3QiKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJLy8gZm9vCi0JCVRhYmxlIGZvb1RhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgZm9vVGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0KLQkJQ29sdW1uIHBrQ29sdW1uID0gZm9vVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgcGtDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIGlkQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoImlkIik7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGlkQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHBrQ29sdW1uLCBpZENvbHVtbik7Ci0JCWFzc2VydFRydWUoaWRDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCQlhc3NlcnRGYWxzZShpZENvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydFRydWUoaWRDb2x1bW4uaXNQYXJ0T2ZVbmlxdWVDb25zdHJhaW50KCkpOwotCQlhc3NlcnRGYWxzZShpZENvbHVtbi5pc051bGxhYmxlKCkpOwotCi0JCWFzc2VydEVxdWFscygiSU5UIiwgaWRDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzTnVtZXJpYygpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGlkQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGlkQ29sdW1uLmdldFNjYWxlKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIGlkQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNMT0IoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgaWRDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQotCQlDb2x1bW4gbmFtZUNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJuYW1lIik7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0VHJ1ZShuYW1lQ29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc051bGxhYmxlKCkpOyAgLy8gaW1wbGllZCAiTk9UIE5VTEwiID8KLQotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgbmFtZUNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgbmFtZUNvbHVtbi5nZXRTY2FsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBuYW1lQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc0xPQigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCi0JCUNvbHVtbiBiYXJDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiYmFyX2lkIik7Ci0JCWFzc2VydEVxdWFscygiSU5UIiwgYmFyQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiYXJDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRGYWxzZShiYXJDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCi0JCUZvcmVpZ25LZXkgYmFyRksgPSBmb29UYWJsZS5nZXRGb3JlaWduS2V5cygpLml0ZXJhdG9yKCkubmV4dCgpOyAgLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBmb3JlaWduIGtleQotCQlhc3NlcnRFcXVhbHMoMSwgYmFyRksuZ2V0Q29sdW1uUGFpcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGJhckZLLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyX2lkIiwgYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJwcmltYXJ5QmFyIikpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBiYXJGSy5nZXRCYXNlVGFibGUoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoZm9vVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0U2FtZShzY2hlbWEsIGZvb1RhYmxlLmdldFNjaGVtYSgpKTsKLQotCQkvLyBCQVIKLQkJVGFibGUgYmFyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygyLCBiYXJUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGJhclRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShiYXJUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlDb2x1bW4gY2h1bmtDb2x1bW4gPSBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiY2h1bmsiKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTUFHRSIsIGNodW5rQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2h1bmtDb2x1bW4uaXNOdW1lcmljKCkpOwotCQlhc3NlcnRUcnVlKGNodW5rQ29sdW1uLmlzTE9CKCkpOwotCQlhc3NlcnRFcXVhbHMoImJ5dGVbXSIsIGNodW5rQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCWFzc2VydFNhbWUoYmFyVGFibGUsIGJhckZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQotCQkvLyBCQVoKLQkJVGFibGUgYmF6VGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscyg0LCBiYXpUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhelRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGJhelRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gbmlja25hbWVDb2x1bW4gPSBiYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgibmlja25hbWUiKTsKLQkJYXNzZXJ0VHJ1ZShuaWNrbmFtZUNvbHVtbi5pc051bGxhYmxlKCkpOwotCi0JCUNvbHVtbiBzb25nQ29sdW1uID0gYmF6VGFibGUuZ2V0Q29sdW1uTmFtZWQoInNvbmciKTsKLQkJYXNzZXJ0RmFsc2Uoc29uZ0NvbHVtbi5pc051bGxhYmxlKCkpOwotCi0JCUNvbHVtbiBzYWxhcnlDb2x1bW4gPSBiYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgic2FsYXJ5Iik7Ci0JCWFzc2VydEZhbHNlKHNhbGFyeUNvbHVtbi5pc1BhcnRPZlVuaXF1ZUNvbnN0cmFpbnQoKSk7Ci0JCWFzc2VydEVxdWFscygiREVDSU1BTCIsIHNhbGFyeUNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoc2FsYXJ5Q29sdW1uLmlzTnVtZXJpYygpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzYWxhcnlDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgc2FsYXJ5Q29sdW1uLmdldFNjYWxlKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHNhbGFyeUNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEZhbHNlKHNhbGFyeUNvbHVtbi5pc0xPQigpKTsKLQotCQkvLyBGT09fQkFaCi0JCVRhYmxlIGZvb19iYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJmb29fYmF6Iik7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBmb29fYmF6VGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuZ2V0Q29sdW1uTmFtZWQoImZvb19pZCIpLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgZm9vX2JheiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgYmF6Iik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSBmb28iKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIGJhciIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIGRhdGFiYXNlIHRhYmxlX3Rlc3QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmFyRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJjcmVhdGUgdGFibGUgYmFyICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGNodW5rIGltYWdlIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29EREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoImNyZWF0ZSB0YWJsZSBmb28gKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIGludGVnZXIgcHJpbWFyeSBrZXksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgbmFtZSB2YXJjaGFyKDIwKSB1bmlxdWUsIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgYmFyX2lkIGludGVnZXIgcmVmZXJlbmNlcyBiYXIoaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoImNyZWF0ZSB0YWJsZSBiYXogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIGludGVnZXIgcHJpbWFyeSBrZXksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgbmlja25hbWUgdmFyY2hhcigyMCkgbnVsbCwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBzb25nIHZhcmNoYXIoMjApIG5vdCBudWxsLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHNhbGFyeSBkZWNpbWFsKDEwLCAyKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRm9vQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJjcmVhdGUgdGFibGUgZm9vX2JheiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgZm9vX2lkIGludGVnZXIgcmVmZXJlbmNlcyBmb28oaWQpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGJhel9pZCBpbnRlZ2VyIHJlZmVyZW5jZXMgYmF6KGlkKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZUxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiZHJvcCBkYXRhYmFzZSB0YWJsZV9sb29rdXBfdGVzdCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSBkYXRhYmFzZSB0YWJsZV9sb29rdXBfdGVzdCIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygidGFibGVfbG9va3VwX3Rlc3QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSB0ZXN0MSAoaWQgaW50ZWdlciwgbmFtZSB2YXJjaGFyKDIwKSkiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgVEVTVDIgKGlkIGludGVnZXIsIG5hbWUgdmFyY2hhcigyMCkpIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIFtUZXN0M10gKGlkIGludGVnZXIsIG5hbWUgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ0YWJsZV9sb29rdXBfdGVzdCIpLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQlhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJ0ZXN0MSIpKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0MSIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJURVNUMiIpKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJURVNUMiIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoIltUZXN0M10iKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIFtUZXN0M10iKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIFRFU1QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSB0ZXN0MSIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIGRhdGFiYXNlIHRhYmxlX2xvb2t1cF90ZXN0Iik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJkcm9wIGRhdGFiYXNlIGNvbHVtbl9sb29rdXBfdGVzdCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSBkYXRhYmFzZSBjb2x1bW5fbG9va3VwX3Rlc3QiKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coImNvbHVtbl9sb29rdXBfdGVzdCIpOwotCi0JCS8vIGxvd2VyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSB0ZXN0IChpZCBpbnRlZ2VyLCBuYW1lIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoImNvbHVtbl9sb29rdXBfdGVzdCIpLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJuYW1lIikpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSB0ZXN0Iik7Ci0KLQkJLy8gdXBwZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIHRlc3QgKElEIGludGVnZXIsIE5BTUUgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgiY29sdW1uX2xvb2t1cF90ZXN0IikuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJJRCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJOQU1FIikpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSB0ZXN0Iik7Ci0KLQkJLy8gbWl4ZWQgY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSB0ZXN0IChJZCBpbnRlZ2VyLCBOYW1lIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoImNvbHVtbl9sb29rdXBfdGVzdCIpLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTmFtZSIpKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgdGVzdCIpOwotCi0JCS8vIGRlbGltaXRlZAotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSB0ZXN0IChbSWRdIGludGVnZXIsIFtOYW1lXSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJjb2x1bW5fbG9va3VwX3Rlc3QiKS5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIltJZF0iKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiW05hbWVdIikpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSB0ZXN0Iik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgY29sdW1uX2xvb2t1cF90ZXN0Iik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NTY2hlbWFSZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoImRyb3AgZGF0YWJhc2UgeHJlZl90ZXN0MiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoImRyb3AgZGF0YWJhc2UgeHJlZl90ZXN0MSIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgZGF0YWJhc2UgeHJlZl90ZXN0MSIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygieHJlZl90ZXN0MSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSBvcmcgKGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdmFyY2hhcigyMCkpIik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSBkYXRhYmFzZSB4cmVmX3Rlc3QyIik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ4cmVmX3Rlc3QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIGVtcCAoaWQgaW50ZWdlciBwcmltYXJ5IGtleSwgbmFtZSB2YXJjaGFyKDIwKSwgIiArCi0JCQkJIm9yZ19pZCBpbnRlZ2VyIHJlZmVyZW5jZXMgeHJlZl90ZXN0MS4ub3JnKGlkKSkiKTsKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJQ2F0YWxvZyBjYXRhbG9nMSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInhyZWZfdGVzdDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChjYXRhbG9nMSk7Ci0JCVNjaGVtYSBzY2hlbWExID0gY2F0YWxvZzEuZ2V0U2NoZW1hTmFtZWQoImRibyIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTEpOwotCQlUYWJsZSBvcmdUYWJsZSA9IHNjaGVtYTEuZ2V0VGFibGVOYW1lZCgib3JnIik7Ci0JCWFzc2VydE5vdE51bGwob3JnVGFibGUpOwotCi0JCUNhdGFsb2cgY2F0YWxvZzIgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ4cmVmX3Rlc3QyIik7Ci0JCWFzc2VydE5vdE51bGwoY2F0YWxvZzIpOwotCQlTY2hlbWEgc2NoZW1hMiA9IGNhdGFsb2cyLmdldFNjaGVtYU5hbWVkKCJkYm8iKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQkJVGFibGUgZW1wVGFibGUgPSBzY2hlbWEyLmdldFRhYmxlTmFtZWQoImVtcCIpOwotCQlhc3NlcnROb3ROdWxsKGVtcFRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtcFRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJRm9yZWlnbktleSBmayA9IGVtcFRhYmxlLmdldEZvcmVpZ25LZXlzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlIHJlZlRhYmxlID0gZmsuZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVmVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoIm9yZyIsIHJlZlRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmay5nZXRDb2x1bW5QYWlyc1NpemUoKSk7Ci0JCUZvcmVpZ25LZXkuQ29sdW1uUGFpciBjcCA9IGZrLmdldENvbHVtblBhaXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbiBiYXNlQ29sdW1uID0gY3AuZ2V0QmFzZUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIm9yZ19pZCIsIGJhc2VDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIHJlZkNvbHVtbiA9IGNwLmdldFJlZmVyZW5jZWRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHJlZkNvbHVtbi5nZXROYW1lKCkpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ4cmVmX3Rlc3QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSBlbXAiKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInhyZWZfdGVzdDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIG9yZyIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCBkYXRhYmFzZSB4cmVmX3Rlc3QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCBkYXRhYmFzZSB4cmVmX3Rlc3QxIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLy5jbGFzc3BhdGggYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODJhNmQ5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2dlbi8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNTlmZWIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM2ZGRhNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgSmFuIDE1IDExOjEyOjE0IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJhYjkxMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNNb24gSnVsIDA3IDIwOjEzOjI0IEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYmY2NzAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDIuMC4wCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iMy40LjAiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSIxLjIuMCIsCi0gb3JnLmVjbGlwc2UuanB0LmRiO2J1bmRsZS12ZXJzaW9uPSIxLjEuMSIsCi0gb3JnLmVjbGlwc2UuanB0LmdlbjtidW5kbGUtdmVyc2lvbj0iMS4xLjAiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9hYm91dC5odG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjhkNGJmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlID0gMS41Ci1qYXZhY1RhcmdldCA9IDEuNQotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWE2NzQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZT1KYXZhIFBlcnNpc3RlbmNlIFRvb2xzIEVudGl0eSBHZW5lcmF0aW9uIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL3Rlc3RzL2ludGVybmFsL0VudGl0eUdlblRvb2xzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL3Rlc3RzL2ludGVybmFsL0VudGl0eUdlblRvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0ZTlmNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi90ZXN0cy9pbnRlcm5hbC9FbnRpdHlHZW5Ub29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsLkVudGl0eUdlblRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbnRpdHlHZW5Ub29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVudGl0eUdlblRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZTEoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPT18iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI1b28iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUyKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCW5hbWVzLmFkZCgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI1T08iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUzKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCW5hbWVzLmFkZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI1T08iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWU0KCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGb29CYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb19iYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoImZvb19iYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJfRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT09fQkFSXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PX0JBUl8qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI0Rk9PX0JBUiIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZTUoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJbmFtZXMuYWRkKCJGb29CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGb29CYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb19iYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoImZvb19iYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIl9GT09fQkFSIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT09fQkFSXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PX0JBUl8qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI0Rk9PX0JBUiIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUxKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPTyoiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIl9vbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIjVvbyIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUyKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCW5hbWVzLmFkZCgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoImZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT18iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJfRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiNU9PIiwgbmFtZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZTMoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJbmFtZXMuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiZm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIl9GT08iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb18iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT08qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCI1T08iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lNCgpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZvb0JhciIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vX2JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoImZvb19iYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIl9GT09fQkFSIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT09fQkFSXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVJfKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX2Zvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIjRGT09fQkFSIiwgbmFtZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZTUoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJbmFtZXMuYWRkKCJGb29CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRm9vQmFyIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fYmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiZm9vX2JhciIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJfRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVJfIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXJfIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PX0JBUl8qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiNEZPT19CQVIiLCBuYW1lcykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vdGVzdHMvaW50ZXJuYWwvSnB0R2VuVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL3Rlc3RzL2ludGVybmFsL0pwdEdlblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNzlkN2QuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vdGVzdHMvaW50ZXJuYWwvSnB0R2VuVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy5pbnRlcm5hbC5FbnRpdHlHZW5Ub29sc1Rlc3RzOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSnB0R2VuVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJKUFQgRW50aXR5IEdlbmVyYXRpb24gVGVzdHMiKTsgLy8kTk9OLU5MUy0xJAotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW50aXR5R2VuVG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEdlblRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL3Rlc3QueG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODQyZDkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSAgQ29udHJpYnV0b3JzOgotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotCTwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0JPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLQk8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+Ci0JPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0JPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lIC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMiLz4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLQk8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotCTwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotCQk8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0JPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0JCTxhbnQgdGFyZ2V0PSJnZW4tdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMuaW50ZXJuYWwuSnB0R2VuVGVzdHMiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iIi8+Ci0JCTwvYW50PgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0JPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotCTwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCwgc3VpdGUsIGNsZWFudXAiPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyNjM5ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L3VpLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0MDc3NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNjRhMGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDA3IDE0OjI3OjE2IEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MDljMTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gTWF5IDI3IDE0OjU1OjAxIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIxMTllLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iNC4zLjEiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5qZmFjZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cywKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHksCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjtidW5kbGUtdmVyc2lvbj0iMy40LjAiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSIzLjMuMTAwIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IjMuNC4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5qZmFjZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LnN3dDt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZjBhYTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDkzNjE1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZT1KYXZhIFBlcnNpc3RlbmNlIEFQSSBVSSBUZXN0cwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvSnB0VWlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL0pwdFVpVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwYWJiNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvSnB0VWlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnBsYXRmb3JtLkpwdFVpUGxhdGZvcm1UZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0LkpwdFVpU1dUVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWwuSnB0VWlVdGlsVGVzdHM7Ci0KLS8qKgotICogUnVucyBhbGwgSlBUIFVJIFRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVaVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVaVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFVpUGxhdGZvcm1UZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVaVNXVFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFVpVXRpbFRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVaVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nTGFiZWxQcm92aWRlclVpVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZThmYzIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5CYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUGFsZXR0ZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIERlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0IGV4dGVuZHMgQXBwbGljYXRpb25XaW5kb3cKLXsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZTsKLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFZlaGljbGU+IHNlbGVjdGVkVmVoaWNsZTsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXJVaVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBEZWxlZ2F0aW5nTGFiZWxQcm92aWRlclVpVGVzdChTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnNlbGVjdGVkVmVoaWNsZSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VmVoaWNsZT4oKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCXBhcmVudC5zZXRTaXplKDQwMCwgNDAwKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJYnVpbGRUcmVlUGFuZWwobWFpblBhbmVsKTsKLQkJYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVHJlZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJbGFiZWwuc2V0VGV4dCgiTXkgVmVoaWNsZXMiKTsKLQkJCi0JCXRyZWUgPSBuZXcgVHJlZVZpZXdlcihwYW5lbCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl0cmVlLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCURlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlciA9IAotCQkJbmV3IERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIoCi0JCQkJbmV3IFZlaGljbGVDb250ZW50UHJvdmlkZXJGYWN0b3J5KCksCi0JCQkJbmV3IFZlaGljbGVMYWJlbFByb3ZpZGVyRmFjdG9yeSgpKTsKLQkJdHJlZS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl0cmVlLnNldExhYmVsUHJvdmlkZXIoY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl0cmVlLnNldElucHV0KG5ldyBSb290KCkpOwotCQl0cmVlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihidWlsZFRyZWVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSk7Ci0JfQotCQotCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBidWlsZFRyZWVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2VsZWN0ZWRWZWhpY2xlLnNldFZhbHVlKChWZWhpY2xlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJYnVpbGRVcHBlckNvbnRyb2xQYW5lbChwYW5lbCk7Ci0JCWJ1aWxkTG93ZXJDb250cm9sUGFuZWwocGFuZWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRVcHBlckNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJYnVpbGRWZWhpY2xlQ29tYm8ocGFuZWwpOwotCQlidWlsZENvbG9yQ29tYm8ocGFuZWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRWZWhpY2xlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21ib1ZpZXdlciBjb21ibyA9IG5ldyBDb21ib1ZpZXdlcihwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQljb21iby5nZXRDb21ibygpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJY29tYm8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY29tYm8uc2V0TGFiZWxQcm92aWRlcihuZXcgVmVoaWNsZVR5cGVMYWJlbFByb3ZpZGVyKCkpOwotCQljb21iby5zZXRJbnB1dCgKLQkJCW5ldyBWZWhpY2xlVHlwZVtdIHsKLQkJCQlWZWhpY2xlVHlwZS5CSUNZQ0xFLCBWZWhpY2xlVHlwZS5DQVIsIAotCQkJCVZlaGljbGVUeXBlLlRSVUNLLCBWZWhpY2xlVHlwZS5CT0FUCi0JCQl9KTsKLQkJY29tYm8uZ2V0Q29tYm8oKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY29tYm8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJc2VsZWN0ZWRWZWhpY2xlKCkuc2V0VmVoaWNsZVR5cGUoKFZlaGljbGVUeXBlKSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSk7IAotCQkJCX0KLQkJCX0pOwotCQlzZWxlY3RlZFZlaGljbGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgCi0JCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlWZWhpY2xlIHZlaGljbGUgPSBzZWxlY3RlZFZlaGljbGUoKTsKLQkJCQkJY29tYm8uZ2V0Q29tYm8oKS5zZXRFbmFibGVkKHZlaGljbGUgIT0gbnVsbCk7Ci0JCQkJCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigodmVoaWNsZSA9PSBudWxsKSA/IG51bGwgOiB2ZWhpY2xlLnZlaGljbGVUeXBlKCkpKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29sb3JDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbWJvVmlld2VyIGNvbWJvID0gbmV3IENvbWJvVmlld2VyKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWNvbWJvLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQljb21iby5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQljb21iby5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb2xvckxhYmVsUHJvdmlkZXIoKSk7Ci0JCWNvbWJvLnNldElucHV0KG5ldyBDb2xvcltdIHtDb2xvci5SRUQsIENvbG9yLkJMVUUsIENvbG9yLllFTExPVywgQ29sb3IuR1JFRU59KTsKLQkJY29tYm8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJc2VsZWN0ZWRWZWhpY2xlKCkuc2V0Q29sb3IoKENvbG9yKSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSk7IAotCQkJCX0KLQkJCX0pOwotCQlzZWxlY3RlZFZlaGljbGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgCi0JCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlWZWhpY2xlIHZlaGljbGUgPSBzZWxlY3RlZFZlaGljbGUoKTsKLQkJCQkJY29tYm8uZ2V0Q29tYm8oKS5zZXRFbmFibGVkKHZlaGljbGUgIT0gbnVsbCk7Ci0JCQkJCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigodmVoaWNsZSA9PSBudWxsKSA/IG51bGwgOiB2ZWhpY2xlLmNvbG9yKCkpKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTG93ZXJDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlidWlsZEVmZmVjdHNMYWJlbChwYW5lbCk7Ci0JCWJ1aWxkR3JleWVkQ2hlY2tCb3gocGFuZWwpOwotCQlidWlsZFRyYW5zbHVjZW50Q2hlY2tCb3gocGFuZWwpOwotCQlidWlsZEFjdGlvblBhbmVsKHBhbmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRWZmZWN0c0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoIkNvbG9yIGVmZmVjdHM6ICIpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAzLCAxKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZEdyZXllZENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQlidXR0b24uc2V0VGV4dCgiZ3JleWVkIik7Ci0JCWJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlzZWxlY3RlZFZlaGljbGUoKS5zZXRHcmV5ZWQoYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJc2VsZWN0ZWRWZWhpY2xlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIAotCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJVmVoaWNsZSB2ZWhpY2xlID0gc2VsZWN0ZWRWZWhpY2xlKCk7Ci0JCQkJCWJ1dHRvbi5zZXRFbmFibGVkKHZlaGljbGUgIT0gbnVsbCk7Ci0JCQkJCWJ1dHRvbi5zZXRTZWxlY3Rpb24odmVoaWNsZSAhPSBudWxsICYmIHZlaGljbGUuaXNHcmV5ZWQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFRyYW5zbHVjZW50Q2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJYnV0dG9uLnNldFRleHQoInRyYW5zbHVjZW50Iik7Ci0JCWJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlzZWxlY3RlZFZlaGljbGUoKS5zZXRUcmFuc2x1Y2VudChidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0pOwotCQlzZWxlY3RlZFZlaGljbGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgCi0JCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlWZWhpY2xlIHZlaGljbGUgPSBzZWxlY3RlZFZlaGljbGUoKTsKLQkJCQkJYnV0dG9uLnNldEVuYWJsZWQodmVoaWNsZSAhPSBudWxsKTsKLQkJCQkJYnV0dG9uLnNldFNlbGVjdGlvbih2ZWhpY2xlICE9IG51bGwgJiYgdmVoaWNsZS5pc1RyYW5zbHVjZW50KCkpOwotCQkJCX0KLQkJCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRBY3Rpb25QYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJYnVpbGRSZWZyZXNoVHJlZUFDSSgpLmZpbGwocGFuZWwpOwotCX0KLQkKLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZWZyZXNoVHJlZUFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIlJlZnJlc2ggdHJlZSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJlZnJlc2hUcmVlKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiUmVmcmVzaCB0aGUgdHJlZSdzIGxhYmVscyIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0JCi0Jdm9pZCByZWZyZXNoVHJlZSgpIHsKLQkJdHJlZS5yZWZyZXNoKCk7Ci0JfQotCQotCXByaXZhdGUgVmVoaWNsZSBzZWxlY3RlZFZlaGljbGUoKSB7Ci0JCXJldHVybiBzZWxlY3RlZFZlaGljbGUuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZVR5cGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlcgotCXsKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChWZWhpY2xlVHlwZSkgZWxlbWVudCkuZGVzY3JpcHRpb24oKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb2xvckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyCi0JewotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiAoKENvbG9yKSBlbGVtZW50KS5kZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGVDb250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKE9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgUm9vdCkgewotCQkJCXJldHVybiBuZXcgUm9vdENvbnRlbnRQcm92aWRlcigKLQkJCQkJKFJvb3QpIGl0ZW0sIChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFZlaGljbGVDb250ZW50UHJvdmlkZXIoCi0JCQkJKFZlaGljbGUpIGl0ZW0sIChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm9vdENvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8VmVoaWNsZT4KLQl7Ci0JCXB1YmxpYyBSb290Q29udGVudFByb3ZpZGVyKFJvb3QgaXRlbSwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJc3VwZXIoaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFJvb3QgZ2V0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gKFJvb3QpIHN1cGVyLmdldE1vZGVsKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFZlaGljbGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8VmVoaWNsZT4odGhpcy5nZXRNb2RlbCgpLnZlaGljbGVzKCkpOwotCQl9Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi0JewotCQlwdWJsaWMgVmVoaWNsZUNvbnRlbnRQcm92aWRlcihWZWhpY2xlIGl0ZW0sIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBWZWhpY2xlIGdldE1vZGVsKCkgewotCQkJcmV0dXJuIChWZWhpY2xlKSBzdXBlci5nZXRNb2RlbCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gZ2V0TW9kZWwoKS5wYXJlbnQoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbCBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IE51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbCgpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGVMYWJlbFByb3ZpZGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotCXsKLQkJcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyIGJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoT2JqZWN0IGVsZW1lbnQsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gbmV3IFZlaGljbGVMYWJlbFByb3ZpZGVyKChWZWhpY2xlKSBlbGVtZW50LCBsYWJlbFByb3ZpZGVyKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWZWhpY2xlTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBWZWhpY2xlTGFiZWxQcm92aWRlcihWZWhpY2xlIHZlaGljbGUsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCQlzdXBlcih2ZWhpY2xlLCBsYWJlbFByb3ZpZGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFZlaGljbGUsIEltYWdlPigKLQkJCQkJbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxWZWhpY2xlPigoVmVoaWNsZSkgbW9kZWwoKSksIAotCQkJCQlWZWhpY2xlLkNPTE9SX1BST1BFUlRZLCBWZWhpY2xlLkdSRVlFRF9QUk9QRVJUWSwgVmVoaWNsZS5UUkFOU0xVQ0VOVF9QUk9QRVJUWSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJbWFnZSBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuaW1hZ2UoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VmVoaWNsZSwgU3RyaW5nPigKLQkJCQkJbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxWZWhpY2xlPigoVmVoaWNsZSkgbW9kZWwoKSksIAotCQkJCQlWZWhpY2xlLlZFSElDTEVfVFlQRV9QUk9QRVJUWSwgVmVoaWNsZS5DT0xPUl9QUk9QRVJUWSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmNvbG9yKCkuZGVzY3JpcHRpb24oKSArICcgJyArIHN1YmplY3QudmVoaWNsZVR5cGUoKS5kZXNjcmlwdGlvbigpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgewotCQkJcmV0dXJuIGJ1aWxkVGV4dE1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVHJlZU5vZGUgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JewotCQlwcml2YXRlIFRyZWVOb2RlIHBhcmVudDsKLQkJCi0JCQotCQlwdWJsaWMgVHJlZU5vZGUoVHJlZU5vZGUgcGFyZW50KSB7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBUcmVlTm9kZSBwYXJlbnQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJvb3QgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHJvdGVjdGVkIGZpbmFsIFZlaGljbGVbXSB2ZWhpY2xlczsKLQkJCi0JCQotCQlwdWJsaWMgUm9vdCgpIHsKLQkJCXN1cGVyKG51bGwpOwotCQkJdmVoaWNsZXMgPSBuZXcgVmVoaWNsZVtdIHsKLQkJCQluZXcgVmVoaWNsZSh0aGlzLCBWZWhpY2xlVHlwZS5CSUNZQ0xFLCBDb2xvci5CTFVFKSwKLQkJCQluZXcgVmVoaWNsZSh0aGlzLCBWZWhpY2xlVHlwZS5DQVIsIENvbG9yLllFTExPVyksCi0JCQkJbmV3IFZlaGljbGUodGhpcywgVmVoaWNsZVR5cGUuVFJVQ0ssIENvbG9yLlJFRCksCi0JCQkJbmV3IFZlaGljbGUodGhpcywgVmVoaWNsZVR5cGUuQk9BVCwgQ29sb3IuR1JFRU4pfTsKLQkJfQotCQkKLQkJcHVibGljIFZlaGljbGVbXSB2ZWhpY2xlcygpIHsKLQkJCXJldHVybiB2ZWhpY2xlczsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWZWhpY2xlIGV4dGVuZHMgVHJlZU5vZGUKLQl7Ci0JCXByaXZhdGUgVmVoaWNsZVR5cGUgdmVoaWNsZVR5cGU7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZFSElDTEVfVFlQRV9QUk9QRVJUWSA9ICJ2ZWhpY2xlVHlwZSI7Ci0JCQotCQlwcml2YXRlIENvbG9yIGNvbG9yOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xPUl9QUk9QRVJUWSA9ICJjb2xvciI7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gZ3JleWVkID0gZmFsc2U7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEdSRVlFRF9QUk9QRVJUWSA9ICJncmV5ZWQiOwotCQkKLQkJcHJpdmF0ZSBib29sZWFuIHRyYW5zbHVjZW50ID0gZmFsc2U7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRSQU5TTFVDRU5UX1BST1BFUlRZID0gInRyYW5zbHVjZW50IjsKLQkJCi0JCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0JCQotCQkJCi0JCXB1YmxpYyBWZWhpY2xlKFRyZWVOb2RlIHBhcmVudCwgVmVoaWNsZVR5cGUgdmVoaWNsZVR5cGUsIENvbG9yIGNvbG9yKSB7Ci0JCQlzdXBlcihwYXJlbnQpOwotCQkJdGhpcy52ZWhpY2xlVHlwZSA9IHZlaGljbGVUeXBlOwotCQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCQl9Ci0JCQotCQlwdWJsaWMgVmVoaWNsZVR5cGUgdmVoaWNsZVR5cGUoKSB7Ci0JCQlyZXR1cm4gdmVoaWNsZVR5cGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFZlaGljbGVUeXBlKFZlaGljbGVUeXBlIG5ld1ZlaGljbGVUeXBlKSB7Ci0JCQlWZWhpY2xlVHlwZSBvbGRWZWhpY2xlVHlwZSA9IHZlaGljbGVUeXBlOwotCQkJdmVoaWNsZVR5cGUgPSBuZXdWZWhpY2xlVHlwZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVkVISUNMRV9UWVBFX1BST1BFUlRZLCBvbGRWZWhpY2xlVHlwZSwgbmV3VmVoaWNsZVR5cGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgQ29sb3IgY29sb3IoKSB7Ci0JCQlyZXR1cm4gY29sb3I7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldENvbG9yKENvbG9yIG5ld0NvbG9yKSB7Ci0JCQlDb2xvciBvbGRDb2xvciA9IGNvbG9yOwotCQkJY29sb3IgPSBuZXdDb2xvcjsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MT1JfUFJPUEVSVFksIG9sZENvbG9yLCBuZXdDb2xvcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzR3JleWVkKCkgewotCQkJcmV0dXJuIGdyZXllZDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0R3JleWVkKGJvb2xlYW4gbmV3R3JleWVkKSB7Ci0JCQlib29sZWFuIG9sZEdyZXllZCA9IGdyZXllZDsKLQkJCWdyZXllZCA9IG5ld0dyZXllZDsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR1JFWUVEX1BST1BFUlRZLCBvbGRHcmV5ZWQsIG5ld0dyZXllZCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzVHJhbnNsdWNlbnQoKSB7Ci0JCQlyZXR1cm4gdHJhbnNsdWNlbnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFRyYW5zbHVjZW50KGJvb2xlYW4gbmV3VHJhbnNsdWNlbnQpIHsKLQkJCWJvb2xlYW4gb2xkVHJhbnNsdWNlbnQgPSB0cmFuc2x1Y2VudDsKLQkJCXRyYW5zbHVjZW50ID0gbmV3VHJhbnNsdWNlbnQ7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRSQU5TTFVDRU5UX1BST1BFUlRZLCBvbGRUcmFuc2x1Y2VudCwgbmV3VHJhbnNsdWNlbnQpOwotCQl9Ci0JCQotCQlwdWJsaWMgSW1hZ2UgaW1hZ2UoKSB7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIEltYWdlRmFjdG9yeS5pbWFnZShjb2xvcigpLCBncmV5ZWQsIHRyYW5zbHVjZW50KTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBlbnVtIFZlaGljbGVUeXBlCi0JewotCQlCSUNZQ0xFKCJiaWN5Y2xlIiksCi0JCUNBUigiY2FyIiksCi0JCVRSVUNLKCJ0cnVjayIpLAotCQlCT0FUKCJib2F0Iik7Ci0JCQotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKLQkJCi0JCXByaXZhdGUgVmVoaWNsZVR5cGUoU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZW51bSBDb2xvcgotCXsKLQkJUkVEKCJyZWQiLCBuZXcgUkdCKDI1NSwgMCwgMCkpLAotCQlCTFVFKCJibHVlIiwgbmV3IFJHQigwLCAwLCAyNTUpKSwKLQkJWUVMTE9XKCJ5ZWxsb3ciLCBuZXcgUkdCKDI1NSwgMjU1LCAwKSksCi0JCUdSRUVOKCJncmVlbiIsIG5ldyBSR0IoMCwgMjU1LCAwKSk7Ci0JCQotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKLQkJCi0JCXByaXZhdGUgZmluYWwgUkdCIHJnYjsKLQkJCi0JCXByaXZhdGUgQ29sb3IoU3RyaW5nIGRlc2NyaXB0aW9uLCBSR0IgcmdiKSB7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCQl0aGlzLnJnYiA9IHJnYjsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbjsKLQkJfQotCQkKLQkJcHVibGljIFJHQiByZ2IoKSB7Ci0JCQlyZXR1cm4gcmdiOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEltYWdlRmFjdG9yeQotCXsKLQkJcHJpdmF0ZSBzdGF0aWMgUkdCIHJnYihDb2xvciBjb2xvciwgYm9vbGVhbiBncmV5ZWQsIGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKLQkJCVJHQiByZ2IgPSAoZ3JleWVkKSA/IG5ldyBSR0IoMTI3LCAxMjcsIDEyNykgOiBjb2xvci5yZ2IoKTsKLQkJCWlmICh0cmFuc2x1Y2VudCkgewotCQkJCXJnYiA9IG5ldyBSR0IodHJhbnNsdWNpZnkocmdiLnJlZCksIHRyYW5zbHVjaWZ5KHJnYi5ncmVlbiksIHRyYW5zbHVjaWZ5KHJnYi5ibHVlKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmdiOwotCQl9Ci0JCQotCQlwcml2YXRlIHN0YXRpYyBpbnQgdHJhbnNsdWNpZnkoaW50IGNvbG9yKSB7Ci0JCQlyZXR1cm4gMjU1IC0gKGludCkgKCgyNTUgLSBjb2xvcikgKiAwLjMpOwotCQl9Ci0JCQotCQlwdWJsaWMgc3RhdGljIEltYWdlIGltYWdlKENvbG9yIGNvbG9yLCBib29sZWFuIGdyZXllZCwgYm9vbGVhbiB0cmFuc2x1Y2VudCkgewotCQkJUGFsZXR0ZURhdGEgcGQgPSBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtyZ2IoY29sb3IsIGdyZXllZCwgdHJhbnNsdWNlbnQpfSk7Ci0JCQlJbWFnZURhdGEgaWQgPSBuZXcgSW1hZ2VEYXRhKDIwLCAyMCwgMSwgcGQpOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCAyMDsgeCArKykgewotCQkJCWZvciAoaW50IHkgPSAwOyB5IDwgMjA7IHkgKyspIHsKLQkJCQkJaWQuc2V0UGl4ZWwoeCwgeSwgMCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgaWQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0NjBmNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlclVpVGVzdCBleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBSb290IHJvb3Q7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlPiBzZWxlY3RlZE5vZGU7Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgY29udHJvbFRyZWU7Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgdmlld1RyZWU7Ci0KLQlwcml2YXRlIFRleHQgbm9kZU5hbWVUZXh0OwotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIERlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMucm9vdCA9IG5ldyBSb290KCk7Ci0JCXRoaXMucm9vdC5hZGRDaGlsZCgiUGFyZW50XzEiKTsKLQkJdGhpcy5zZWxlY3RlZE5vZGUgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlPih0aGlzLnJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg4MDAsIDQwMCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWJ1aWxkVHJlZVBhbmVsKG1haW5QYW5lbCk7Ci0JCWJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVHJlZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0JCWJ1aWxkQ29udHJvbFRyZWVQYW5lbChwYW5lbCk7Ci0JCWJ1aWxkVmlld1RyZWVQYW5lbChwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFRyZWVQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbnRyb2xUcmVlID0gYnVpbGRUcmVlUGFuZWwoCi0JCQkJcGFyZW50LCAiQ29udHJvbCB0cmVlIiwKLQkJCQluZXcgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcihuZXcgQ29udHJvbFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpKSwKLQkJCQluZXcgTGFiZWxQcm92aWRlcigpKTsKLQkJY29udHJvbFRyZWUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGJ1aWxkVHJlZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpKTsKLQkJc2VsZWN0ZWROb2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJY29udHJvbFRyZWUuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGV2ZW50LmdldE5ld1ZhbHVlKCkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVmlld1RyZWVQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXZpZXdUcmVlID0gYnVpbGRUcmVlUGFuZWwoCi0JCQkJcGFyZW50LCAiVmlldyB0cmVlIiwKLQkJCQluZXcgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcihuZXcgVmlld1RyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpKSwKLQkJCQluZXcgTGFiZWxQcm92aWRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgYnVpbGRUcmVlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCwgSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQlsYWJlbC5zZXRUZXh0KGxhYmVsVGV4dCk7Ci0KLQkJZmluYWwgVHJlZVZpZXdlciB0cmVlID0gbmV3IFRyZWVWaWV3ZXIocGFuZWwsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJdHJlZS5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0cmVlLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl0cmVlLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRyZWUuc2V0SW5wdXQocm9vdCk7Ci0KLQkJcmV0dXJuIHRyZWU7Ci0JfQotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGJ1aWxkVHJlZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlTm9kZSBzZWxlY3Rpb24gPSAoVHJlZU5vZGUpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlzZWxlY3RlZE5vZGUuc2V0VmFsdWUoKHNlbGVjdGlvbiA9PSBudWxsKSA/IHJvb3QgOiBzZWxlY3Rpb24pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCg2LCBmYWxzZSkpOwotCQlidWlsZE5vZGVOYW1lVGV4dChwYW5lbCk7Ci0JCWJ1aWxkQWRkQ2hpbGRBQ0koKS5maWxsKHBhbmVsKTsKLQkJYnVpbGRBZGROZXN0ZWRDaGlsZEFDSSgpLmZpbGwocGFuZWwpOwotCQlidWlsZFJlbW92ZUFDSSgpLmZpbGwocGFuZWwpOwotCQlidWlsZENsZWFyTW9kZWxBQ0koKS5maWxsKHBhbmVsKTsKLQkJYnVpbGRSZXN0b3JlTW9kZWxBQ0koKS5maWxsKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROb2RlTmFtZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlub2RlTmFtZVRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJbm9kZU5hbWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGRDaGlsZEFDSSgpIHsKLQkJZmluYWwgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIkFkZCBjaGlsZCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWFkZENoaWxkKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiQWRkIGEgY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSIpOwotCQlzZWxlY3RlZE5vZGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlhY3Rpb24uc2V0RW5hYmxlZCgoKFRyZWVOb2RlKSBldmVudC5nZXROZXdWYWx1ZSgpKS5jYW5IYXZlQ2hpbGRyZW4oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGROZXN0ZWRDaGlsZEFDSSgpIHsKLQkJZmluYWwgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIkFkZCBuZXN0ZWQgY2hpbGQiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlhZGROZXN0ZWRDaGlsZCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIkFkZCBhIG5lc3RlZCBjaGlsZCB3aXRoIHRoZSBnaXZlbiBuYW1lIik7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2VsZWN0ZWROb2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoKChUcmVlTm9kZSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuY2FuSGF2ZU5lc3RlZENoaWxkcmVuKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVtb3ZlQUNJKCkgewotCQlmaW5hbCBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiUmVtb3ZlIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmVtb3ZlKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiUmVtb3ZlIHRoZSBzZWxlY3RlZCBub2RlIik7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2VsZWN0ZWROb2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoZXZlbnQuZ2V0TmV3VmFsdWUoKSAhPSByb290KTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJDbGVhciBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJDbGVhciB0aGUgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiUmVzdG9yZSBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIlJlc3RvcmUgdGhlIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgYWRkQ2hpbGQoKSB7Ci0JCVN0cmluZyBub2RlTmFtZSA9IG5vZGVOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCWlmIChub2RlTmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlzZWxlY3RlZE5vZGUuZ2V0VmFsdWUoKS5hZGRDaGlsZChub2RlTmFtZSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGFkZE5lc3RlZENoaWxkKCkgewotCQlTdHJpbmcgbm9kZU5hbWUgPSBub2RlTmFtZVRleHQuZ2V0VGV4dCgpOwotCQlpZiAobm9kZU5hbWUubGVuZ3RoKCkgIT0gMCkgewotCQkJc2VsZWN0ZWROb2RlLmdldFZhbHVlKCkuYWRkTmVzdGVkQ2hpbGQobm9kZU5hbWUpOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmUoKSB7Ci0JCVRyZWVOb2RlIG5vZGUgPSBzZWxlY3RlZE5vZGUuZ2V0VmFsdWUoKTsKLQkJbm9kZS5wYXJlbnQoKS5yZW1vdmVDaGlsZChub2RlKTsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCWNvbnRyb2xUcmVlLnNldElucHV0KG51bGwpOwotCQl2aWV3VHJlZS5zZXRJbnB1dChudWxsKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJY29udHJvbFRyZWUuc2V0SW5wdXQocm9vdCk7Ci0JCXZpZXdUcmVlLnNldElucHV0KHJvb3QpOwotCX0KLQotCi0Jc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJcmV0dXJuIG5ldyBHZW5lcmljVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJKFRyZWVOb2RlKSBpdGVtLCAoRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgQ29udHJvbFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JewotCi0JfQotCi0KLQlzdGF0aWMgY2xhc3MgVmlld1RyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCQlleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQlPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFBhcmVudCkgewotCQkJCXJldHVybiBuZXcgVmlld1RyZWVQYXJlbnRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCQkJKFBhcmVudCkgaXRlbSwgKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5idWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgR2VuZXJpY1RyZWVJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxUcmVlTm9kZT4KLQl7Ci0JCXB1YmxpYyBHZW5lcmljVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJVHJlZU5vZGUgdHJlZU5vZGUsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCQlzdXBlcih0cmVlTm9kZSwgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCi0JCXByb3RlY3RlZCBUcmVlTm9kZSB0cmVlTm9kZSgpIHsKLQkJCXJldHVybiAoVHJlZU5vZGUpIGdldE1vZGVsKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFRyZWVOb2RlIGdldFBhcmVudCgpIHsKLQkJCXJldHVybiB0cmVlTm9kZSgpLnBhcmVudCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxUcmVlTm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFRyZWVOb2RlPigKLQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUcmVlTm9kZSwgVHJlZU5vZGU+KFRyZWVOb2RlLkNISUxEUkVOX0xJU1QsIHRyZWVOb2RlKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFRyZWVOb2RlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCQlyZXR1cm4gdHJlZU5vZGUoKS5jaGlsZHJlbigpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFZpZXdUcmVlUGFyZW50SXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEdlbmVyaWNUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgotCXsKLQkJcHVibGljIFZpZXdUcmVlUGFyZW50SXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQlUcmVlTm9kZSB0cmVlTm9kZSwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKHRyZWVOb2RlLCB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBUcmVlTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCQlUcmVlTm9kZSBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQoKTsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBOZXN0KSB7Ci0JCQkJcGFyZW50ID0gcGFyZW50LnBhcmVudCgpOwotCQkJfQotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8VHJlZU5vZGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRyZWVOb2RlLCBUcmVlTm9kZT4oc3VwZXIuYnVpbGRDaGlsZHJlbk1vZGVsKCkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFRyZWVOb2RlPiB0cmFuc2Zvcm0oVHJlZU5vZGUgdmFsdWUpIHsKLQkJCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBOZXN0KSB7Ci0JCQkJCQkJCWZpbmFsIE5lc3QgbmVzdCA9IChOZXN0KSB2YWx1ZTsKLQkJCQkJCQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFRyZWVOb2RlPigKLQkJCQkJCQkJCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VHJlZU5vZGUsIFRyZWVOb2RlPihUcmVlTm9kZS5DSElMRFJFTl9MSVNULCBuZXN0KSB7Ci0JCQkJCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFRyZWVOb2RlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCQkJCQkJCQkJcmV0dXJuIG5lc3QuY2hpbGRyZW4oKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCSk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8VHJlZU5vZGU+KENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHZhbHVlKSk7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlcgotCXsKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuICgoVHJlZU5vZGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGFic3RyYWN0IGNsYXNzIFRyZWVOb2RlIGV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCXsKLQkJcHJpdmF0ZSBUcmVlTm9kZSBwYXJlbnQ7Ci0KLQkJcHJvdGVjdGVkIGZpbmFsIExpc3Q8VHJlZU5vZGU+IGNoaWxkcmVuOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDSElMRFJFTl9MSVNUID0gImNoaWxkcmVuIjsKLQotCQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQotCQlwdWJsaWMgVHJlZU5vZGUoVHJlZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLmNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxUcmVlTm9kZT4oKTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgVHJlZU5vZGUgcGFyZW50KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxUcmVlTm9kZT4oY2hpbGRyZW4pOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGQoVHJlZU5vZGUgY2hpbGQpIHsKLQkJCWFkZEl0ZW1Ub0xpc3QoY2hpbGQsIGNoaWxkcmVuLCBDSElMRFJFTl9MSVNUKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKFRyZWVOb2RlIGNoaWxkKSB7Ci0JCQlyZW1vdmVJdGVtRnJvbUxpc3QoY2hpbGQsIGNoaWxkcmVuLCBDSElMRFJFTl9MSVNUKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKGludCBpbmRleCkgewotCQkJcmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCBjaGlsZHJlbiwgQ0hJTERSRU5fTElTVCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJCW5hbWUgPSBuZXdOYW1lOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVOZXN0ZWRDaGlsZHJlbigpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZE5lc3RlZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGNsYXNzIFJvb3QgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHVibGljIFJvb3QoKSB7Ci0JCQlzdXBlcihudWxsLCBudWxsKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBjYW5IYXZlQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhZGRDaGlsZChTdHJpbmcgbmFtZSkgewotCQkJYWRkQ2hpbGQobmV3IFBhcmVudCh0aGlzLCBuYW1lKSk7Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBQYXJlbnQgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHVibGljIFBhcmVudChUcmVlTm9kZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihwYXJlbnQsIG5hbWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQlhZGRDaGlsZChuZXcgQ2hpbGQodGhpcywgbmFtZSkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVOZXN0ZWRDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFkZE5lc3RlZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQlUcmVlTm9kZSBuZXN0ID0gbmV3IE5lc3QodGhpcyk7Ci0JCQlhZGRDaGlsZChuZXN0KTsKLQkJCW5lc3QuYWRkQ2hpbGQobmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8Q2hpbGQ+IG5lc3RsZXNzQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPENoaWxkPigKLQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VHJlZU5vZGUsIENoaWxkPihjaGlsZHJlbigpKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBDaGlsZCB0cmFuc2Zvcm0oVHJlZU5vZGUgbmV4dCkgewotCQkJCQkJCWlmIChuZXh0IGluc3RhbmNlb2YgTmVzdCkgewotCQkJCQkJCQlyZXR1cm4gKChOZXN0KSBuZXh0KS5jaGlsZCgpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gKENoaWxkKSBuZXh0OwotCQkJCQkJfQotCQkJCQl9KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KENoaWxkIGMpIHsKLQkJCQkJcmV0dXJuIGMgIT0gbnVsbDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgTmVzdCBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwdWJsaWMgTmVzdChUcmVlTm9kZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCwgIm5lc3QiKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBjYW5IYXZlQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gY2hpbGRyZW4uc2l6ZSgpID09IDA7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgYWRkQ2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJCWFkZENoaWxkKG5ldyBDaGlsZCh0aGlzLCBuYW1lKSk7Ci0JCX0KLQotCQkvKiBjYW4gb25seSBoYXZlIG9uZSBjaGlsZCAqLwotCQlwdWJsaWMgQ2hpbGQgY2hpbGQoKSB7Ci0JCQlyZXR1cm4gKGNoaWxkcmVuLmlzRW1wdHkoKSkgPyBudWxsIDogKENoaWxkKSBjaGlsZHJlbi5nZXQoMCk7Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBDaGlsZCBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwdWJsaWMgQ2hpbGQoVHJlZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIocGFyZW50LCBuYW1lKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3Y2I2ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1VaUV4dGVuc2lvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybU1hbmFnZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5FeHRlbnNpb25UZXN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5UZXN0SnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnBhUGxhdGZvcm1VaUV4dGVuc2lvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgdGVzdFByb2plY3Q7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiRXh0ZW5zaW9uVGVzdFByb2plY3QiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJleHRlbnNpb24udGVzdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMVUdJTl9DTEFTUyA9IEV4dGVuc2lvblRlc3RQbHVnaW4uY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExVR0lOX0lEID0gRXh0ZW5zaW9uVGVzdFBsdWdpbi5QTFVHSU5fSUQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMQVRGT1JNX0lEID0gVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIuSUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9DTEFTUyA9IFRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMQVRGT1JNX0xBQkVMID0gIlRlc3QgSnBhIFBsYXRmb3JtIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVUlfUExBVEZPUk1fSUQgPSBURVNUX1BMQVRGT1JNX0lEOwotCi0JcHVibGljIEpwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnRlc3RQcm9qZWN0ID0gdGhpcy5idWlsZEpwYVByb2plY3QoUFJPSkVDVF9OQU1FLCBmYWxzZSk7ICAvLyBmYWxzZSA9IG5vIGF1dG8tYnVpbGQKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFRlc3RKcGFQcm9qZWN0KHByb2plY3ROYW1lLCBhdXRvQnVpbGQpOyAgLy8gZmFsc2UgPSBubyBhdXRvLWJ1aWxkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQl0aGlzLnRlc3RQcm9qZWN0ID0gbnVsbDsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBqcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy50ZXN0UHJvamVjdC5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEpwYVBsYXRmb3JtKCkgewotCQlhc3NlcnROb3ROdWxsKEpwYVBsYXRmb3JtTWFuYWdlckltcGwuaW5zdGFuY2UoKS5idWlsZEpwYVBsYXRmb3JtSW1wbGVtZW50YXRpb24odGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnB0VWlQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnB0VWlQbGF0Zm9ybVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYmNjOTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwdFVpUGxhdGZvcm1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0VWlQbGF0Zm9ybVRlc3RzCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFVpUGxhdGZvcm1UZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFVpUGxhdGZvcm1UZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmQxMmVhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZURpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXJUZXN0IHsKLQotCXByaXZhdGUgTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4gc2VsZWN0ZWRJdGVtSG9sZGVyOwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4gc3ViamVjdEhvbGRlcjsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRFbXB0eUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPigpOwotCQlwb3B1bGF0ZUNvbGxlY3Rpb24obGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE1vZGVsLCBTaW1wbGVEaXNwbGF5YWJsZT4oc3ViamVjdEhvbGRlciwgTW9kZWwuSVRFTVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFNpbXBsZURpc3BsYXlhYmxlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0Lml0ZW1zKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pdGVtc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIFNpbXBsZURpc3BsYXlhYmxlIGJ1aWxkU2VsZWN0ZWRJdGVtKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZURpc3BsYXlhYmxlKCJiYXoiKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TW9kZWwsIFNpbXBsZURpc3BsYXlhYmxlPihzdWJqZWN0SG9sZGVyLCBNb2RlbC5JVEVNX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTaW1wbGVEaXNwbGF5YWJsZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRJdGVtKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFNpbXBsZURpc3BsYXlhYmxlIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRJdGVtKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nQ29udmVydGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZFN0cmluZ0NvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U2ltcGxlRGlzcGxheWFibGU+KCkgewotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU2ltcGxlRGlzcGxheWFibGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gIiIgOiB2YWx1ZS5kaXNwbGF5U3RyaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4gYnVpbGRTdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4oKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGNvbWJvU2VsZWN0ZWRJdGVtKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBlbXB0eUNvbWJvQ2FuSGF2ZVNlbGVjdGVkVmFsdWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgaXRlbUF0KGludCBpbmRleCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGl0ZW1Db3VudHMoKTsKLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxTaW1wbGVEaXNwbGF5YWJsZT4gYykgewotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImZvbyIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJiYXIiKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiYmF6IikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImpvbyIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJqYXIiKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiamF6IikpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4gc2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRJdGVtSG9sZGVyOwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXNoZWxsICAgICAgICAgICAgICA9IG5ldyBTaGVsbChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCW1vZGVsICAgICAgICAgICAgICA9IG5ldyBNb2RlbCgpOwotCQlzdWJqZWN0SG9sZGVyICAgICAgPSBidWlsZFN1YmplY3RIb2xkZXIoKTsKLQkJc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU2hlbGwgc2hlbGwoKSB7Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+IHN1YmplY3RIb2xkZXIoKSB7Ci0JCXJldHVybiBzdWJqZWN0SG9sZGVyOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXNoZWxsICAgICAgICAgICAgICA9IG51bGw7Ci0JCXN1YmplY3RIb2xkZXIgICAgICA9IG51bGw7Ci0JCXNlbGVjdGVkSXRlbUhvbGRlciA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3RJdGVtcygpIHsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIGNvdW50IG9mIGl0ZW1zIGlzIG5vdCBpbiBzeW5jIHdpdGggdGhlIG1vZGVsIiwKLQkJCW1vZGVsLml0ZW1zU2l6ZSgpLAotCQkJaXRlbUNvdW50cygpCi0JCSk7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1vZGVsLml0ZW1zU2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBpdGVtIGF0IGluZGV4ICIgKyBpbmRleCArICIgaXMgbm90IHRoZSBzYW1lIGJldHdlZW4gdGhlIG1vZGVsIGFuZCB0aGUgY29tYm8iLAotCQkJCW1vZGVsLml0ZW1BdChpbmRleCkuZGlzcGxheVN0cmluZygpLAotCQkJCWl0ZW1BdChpbmRleCkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX0FkZGVkQWZ0ZXJfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdFJlbW92ZUl0ZW1zX0FkZGVkQWZ0ZXIoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX0FkZGVkQWZ0ZXJfUmVtb3ZlSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdFJlbW92ZUl0ZW1zX0FkZGVkQWZ0ZXIoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX0FkZGVkQmVmb3JlX1JlbW92ZUl0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0KLQkJQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JCWl0ZW1zLmFkZChtb2RlbC5pdGVtQXQoMCkpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDMpKTsKLQkJbW9kZWwucmVtb3ZlSXRlbXMoaXRlbXMuaXRlcmF0b3IoKSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfQWRkZWRCZWZvcmVfUmVtb3ZlSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQotCQlBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgwKSk7Ci0JCWl0ZW1zLmFkZChtb2RlbC5pdGVtQXQoMykpOwotCQltb2RlbC5yZW1vdmVJdGVtcyhpdGVtcy5pdGVyYXRvcigpKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zQWZ0ZXJBZnRlcl9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zQWZ0ZXJBZnRlcl9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zQWZ0ZXJCZWZvcmVfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0FmdGVyQmVmb3JlX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNCZWZvcmVfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNCZWZvcmVfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX1NlbGVjdGVkSXRlbUNoYW5nZWRfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgwKTsKLQotCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBhZGFwdGVyID0gYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCWFkYXB0ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbUNoYW5nZWQoc2VsZWN0ZWRJdGVtLCBzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUFmdGVyX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gYnVpbGRTZWxlY3RlZEl0ZW0oKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQWZ0ZXJfSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBidWlsZFNlbGVjdGVkSXRlbSgpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1BZnRlcl9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGxpc3QgPSBidWlsZExpc3QoKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbGlzdC5nZXQoMCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUFmdGVyX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdCA9IGJ1aWxkTGlzdCgpOwotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBsaXN0LmdldCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQmVmb3JlX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQmVmb3JlX0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQmVmb3JlX0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdCA9IGJ1aWxkTGlzdCgpOwotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBsaXN0LmdldCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1CZWZvcmVfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBsaXN0ID0gYnVpbGRMaXN0KCk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGxpc3QuZ2V0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCWFzc2VydEZhbHNlKCJUaGUgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydE51bGwoIlRoZSBzZWxlY3RlZCBpdGVtIGlzIHN1cHBvc2VkIHRvIHJlbWFpbiBudWxsIiwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCWFzc2VydEZhbHNlKCJUaGUgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydE51bGwoIlRoZSBzZWxlY3RlZCBpdGVtIGlzIHN1cHBvc2VkIHRvIHJlbWFpbiBudWxsIiwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gaXMgc3VwcG9zZWQgdG8gcmVtYWluIG51bGwiLCBtb2RlbC5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9OdWxsU2VsZWN0ZWRJdGVtX05vSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSBpcyBzdXBwb3NlZCB0byByZW1haW4gbnVsbCIsIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX1NlbGVjdGVkSXRlbUNoYW5nZWRfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDMpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBhZGFwdGVyID0gYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCWFkYXB0ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbUNoYW5nZWQoc2VsZWN0ZWRJdGVtLCBzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3ROdWxsU3ViamVjdCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWFzc2VydE51bGwoIlRoZSBzZWxlY3RlZCBpdGVtIHNob3VsZCBiZSBudWxsIiwgc2VsZWN0ZWRJdGVtSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShidWlsZFNlbGVjdGVkSXRlbSgpKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQkvLyBOdWxsIGJlY2F1c2UgdGhlIHN1YmplY3QgaG9sZGVyIGRvZXNuJ3QgaGF2ZSB0aGUgc3ViamVjdCBzZXQKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN1YmplY3RfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdE51bGxTdWJqZWN0KCk7Ci0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE51bGxTdWJqZWN0X051bGxTZWxlY3RlZEl0ZW1fSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3ROdWxsU3ViamVjdCgpOwotCQl0ZXN0SXRlbXMoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3ViamVjdF9OdWxsU2VsZWN0ZWRJdGVtX05vSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3ROdWxsU3ViamVjdCgpOwotCQl0ZXN0SXRlbXMoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3ViamVjdF9OdWxsU2VsZWN0ZWRJdGVtX05vSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3ROdWxsU3ViamVjdCgpOwotCQl0ZXN0SXRlbXMoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdFJlbW92ZUl0ZW1zX0FkZGVkQWZ0ZXIoKSB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQotCQlBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgwKSk7Ci0JCWl0ZW1zLmFkZChtb2RlbC5pdGVtQXQoMykpOwotCQltb2RlbC5yZW1vdmVJdGVtcyhpdGVtcy5pdGVyYXRvcigpKTsKLQotCQl0ZXN0SXRlbXMoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdFNlbGVjdGVkSXRlbShTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0pIHsKLQotCQlpZiAoc2VsZWN0ZWRJdGVtID09IG51bGwpIHsKLQotCQkJYXNzZXJ0TnVsbCgKLQkJCQkiVGhlIHNlbGVjdGVkIGl0ZW0gaXMgc3VwcG9zZWQgdG8gYmUgbnVsbCIsCi0JCQkJbW9kZWwuZ2V0SXRlbSgpCi0JCQkpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBjb21ibydzIHNlbGVjdGVkIGl0ZW0gc2hvdWxkIGJlIG51bGwiLAotCQkJCSIiLAotCQkJCWNvbWJvU2VsZWN0ZWRJdGVtKCkKLQkJCSk7Ci0JCX0KLQkJZWxzZSBpZiAoIWVtcHR5Q29tYm9DYW5IYXZlU2VsZWN0ZWRWYWx1ZSgpKSB7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBjb3JyZWN0bHkiLAotCQkJCXNlbGVjdGVkSXRlbSwKLQkJCQltb2RlbC5nZXRJdGVtKCkKLQkJCSk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIGNvbWJvJ3Mgc2VsZWN0ZWQgaXRlbSBzaG91bGQgYmUgbnVsbCIsCi0JCQkJIiIsCi0JCQkJY29tYm9TZWxlY3RlZEl0ZW0oKQotCQkJKTsKLQkJfQotCQllbHNlIHsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IGNvcnJlY3RseSIsCi0JCQkJc2VsZWN0ZWRJdGVtLAotCQkJCW1vZGVsLmdldEl0ZW0oKQotCQkJKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IGNvcnJlY3RseSIsCi0JCQkJc2VsZWN0ZWRJdGVtLmRpc3BsYXlTdHJpbmcoKSwKLQkJCQljb21ib1NlbGVjdGVkSXRlbSgpCi0JCQkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3RTZWxlY3RlZEl0ZW1DaGFuZ2VkKFNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIpIHsKLQotCQkvLyBUZXN0IDEKLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3Rpb25MaXN0ZW5lci5pc0xpc3RlbmVyTm90aWZpZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQotCQkvLyBUZXN0IDIKLQkJc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDEpOwotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCXNlbGVjdGlvbkxpc3RlbmVyLmNsZWFySW5mbygpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0aW9uTGlzdGVuZXIuaXNMaXN0ZW5lck5vdGlmaWVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0ZWRJdGVtLCBzZWxlY3Rpb25MaXN0ZW5lci5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0KLQkJLy8gVGVzdCAzCi0JCXNlbGVjdGVkSXRlbSA9IG51bGw7Ci0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJc2VsZWN0aW9uTGlzdGVuZXIuY2xlYXJJbmZvKCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydE51bGwoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBtb2RlbC5nZXRJdGVtKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0aW9uTGlzdGVuZXIuaXNMaXN0ZW5lck5vdGlmaWVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0ZWRJdGVtLCBzZWxlY3Rpb25MaXN0ZW5lci5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0KLQkJLy8gVGVzdCAzCi0JCXNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgyKTsKLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlzZWxlY3Rpb25MaXN0ZW5lci5jbGVhckluZm8oKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGlvbkxpc3RlbmVyLmlzTGlzdGVuZXJOb3RpZmllZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQkJcHJpdmF0ZSBTaW1wbGVEaXNwbGF5YWJsZSBpdGVtOwotCQlwcml2YXRlIExpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQkJcHJpdmF0ZSBib29sZWFuIHNldEl0ZW1DYWxsZWQ7Ci0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNX1BST1BFUlRZID0gIml0ZW0iOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIElURU1TX0xJU1QgPSAiaXRlbXMiOwotCi0JCXZvaWQgYWRkSXRlbXMoSXRlcmF0b3I8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zKSB7Ci0JCQlhZGRJdGVtc1RvTGlzdChpdGVtcywgdGhpcy5pdGVtcywgSVRFTVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIGFkZEl0ZW1zKExpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zKSB7Ci0JCQlhZGRJdGVtc1RvTGlzdChpdGVtcywgdGhpcy5pdGVtcywgSVRFTVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIGNsZWFySXRlbUNhbGxlZEZsYWcoKSB7Ci0JCQlzZXRJdGVtQ2FsbGVkID0gZmFsc2U7Ci0JCX0KLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBnZXRJdGVtKCkgewotCQkJcmV0dXJuIGl0ZW07Ci0JCX0KLQotCQlib29sZWFuIGlzU2V0SXRlbUNhbGxlZCgpIHsKLQkJCXJldHVybiBzZXRJdGVtQ2FsbGVkOwotCQl9Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgaXRlbUF0KGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMuaXRlbXMuZ2V0KGluZGV4KTsKLQkJfQotCi0JCUxpc3RJdGVyYXRvcjxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMoKSB7Ci0JCQlyZXR1cm4gaXRlbXMubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQotCQlpbnQgaXRlbXNTaXplKCkgewotCQkJcmV0dXJuIGl0ZW1zLnNpemUoKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlSXRlbXMoSXRlcmF0b3I8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zKSB7Ci0JCQlyZW1vdmVJdGVtc0Zyb21MaXN0KGl0ZW1zLCB0aGlzLml0ZW1zLCBJVEVNU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgc2V0SXRlbShTaW1wbGVEaXNwbGF5YWJsZSBpdGVtKSB7Ci0JCQlzZXRJdGVtQ2FsbGVkID0gdHJ1ZTsKLQotCQkJU2ltcGxlRGlzcGxheWFibGUgb2xkSXRlbSA9IHRoaXMuaXRlbTsKLQkJCXRoaXMuaXRlbSA9IGl0ZW07Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElURU1fUFJPUEVSVFksIG9sZEl0ZW0sIGl0ZW0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPFNpbXBsZURpc3BsYXlhYmxlPiB7Ci0KLQkJcHJpdmF0ZSBTaW1wbGVEaXNwbGF5YWJsZSBpdGVtOwotCQlwcml2YXRlIGJvb2xlYW4gbGlzdGVuZXJOb3RpZmllZDsKLQotCQl2b2lkIGNsZWFySW5mbygpIHsKLQkJCXRoaXMubGlzdGVuZXJOb3RpZmllZCA9IGZhbHNlOwotCQkJdGhpcy5pdGVtID0gbnVsbDsKLQkJfQotCi0JCVNpbXBsZURpc3BsYXlhYmxlIGdldEl0ZW0oKSB7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzTGlzdGVuZXJOb3RpZmllZCgpIHsKLQkJCXJldHVybiBsaXN0ZW5lck5vdGlmaWVkOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxTaW1wbGVEaXNwbGF5YWJsZT4gZSkgewotCQkJbGlzdGVuZXJOb3RpZmllZCA9IHRydWU7Ci0JCQlpdGVtID0gZS5zZWxlY3RlZEl0ZW0oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0NvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmIxNTJhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkNvbWJvTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZURpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotCi1wdWJsaWMgY2xhc3MgQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlclRlc3QgewotCi0JcHJpdmF0ZSBDb21ibyBjb21ibzsKLQlwcml2YXRlIGJvb2xlYW4gZWRpdGFibGU7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCkgewotCi0JCWNvbWJvID0gbmV3IENvbWJvKHNoZWxsKCksIFNXVC5OVUxMKTsKLQkJZWRpdGFibGUgPSB0cnVlOwotCi0JCXJldHVybiBDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWJ1aWxkTGlzdEhvbGRlcigpLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQljb21ibywKLQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCkKLQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCkgewotCi0JCWNvbWJvID0gbmV3IENvbWJvKHNoZWxsKCksIFNXVC5SRUFEX09OTFkpOwotCQllZGl0YWJsZSA9IGZhbHNlOwotCi0JCXJldHVybiBDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWJ1aWxkTGlzdEhvbGRlcigpLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQljb21ibywKLQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCkKLQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbWJvU2VsZWN0ZWRJdGVtKCkgewotCQlyZXR1cm4gY29tYm8uZ2V0VGV4dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGVtcHR5Q29tYm9DYW5IYXZlU2VsZWN0ZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGVkaXRhYmxlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgaXRlbUF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb21iby5nZXRJdGVtKGluZGV4KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGl0ZW1Db3VudHMoKSB7Ci0JCXJldHVybiBjb21iby5nZXRJdGVtQ291bnQoKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQljb21ibyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9KcHRVaVNXVFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0pwdFVpU1dUVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkYzYwMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0pwdFVpU1dUVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkpVbml0NFRlc3RBZGFwdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlLlN1aXRlQ2xhc3NlczsKLQotQFN1aXRlQ2xhc3NlcwotKHsKLQlDb21ib01vZGVsQWRhcHRlclRlc3QuY2xhc3MsCi0JU3Bpbm5lck1vZGVsQWRhcHRlclRlc3QuY2xhc3MsCi0JVGFibGVNb2RlbEFkYXB0ZXJUZXN0LmNsYXNzCi19KQotQFJ1bldpdGgoU3VpdGUuY2xhc3MpCi1wdWJsaWMgZmluYWwgY2xhc3MgSnB0VWlTV1RUZXN0cyB7Ci0KLQlwcml2YXRlIEpwdFVpU1dUVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBKVW5pdDRUZXN0QWRhcHRlcihKcHRVaVNXVFRlc3RzLmNsYXNzKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1NwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1NwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMTYyOWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTcGlubmVyTW9kZWxBZGFwdGVyVGVzdCB7Ci0KLQlwcml2YXRlIE1vZGVsIG1vZGVsOwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4gc3ViamVjdEhvbGRlcjsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+IGJ1aWxkU3ViamVjdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+KCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNb2RlbCwgSW50ZWdlcj4oc3ViamVjdEhvbGRlciwgTW9kZWwuVkFMVUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VmFsdWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0VmFsdWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXNoZWxsICAgICAgICAgICAgICA9IG5ldyBTaGVsbChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCW1vZGVsICAgICAgICAgICAgICA9IG5ldyBNb2RlbCgpOwotCQlzdWJqZWN0SG9sZGVyICAgICAgPSBidWlsZFN1YmplY3RIb2xkZXIoKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzaGVsbCAgICAgICAgID0gbnVsbDsKLQkJc3ViamVjdEhvbGRlciA9IG51bGw7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZWQoKSB7Ci0KLQkJaW50IHZhbHVlID0gMjsKLQkJbW9kZWwuc2V0VmFsdWUodmFsdWUpOwotCQltb2RlbC5jbGVhclNldFZhbHVlQ2FsbGVkRmxhZygpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBidWlsZFZhbHVlSG9sZGVyKCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIGNvbWluZyBmcm9tIHRoZSBtb2RlbCIsCi0JCQl2YWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIG51bWJlciBob2xkZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIG1vZGVsJ3MgdmFsdWUiLAotCQkJbW9kZWwuZ2V0VmFsdWUoKSwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIG1vZGVsIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgdmFsdWUgZHVyaW5nIGluaXRpYWxpemF0aW9uIiwKLQkJCW1vZGVsLmlzU2V0VmFsdWVDYWxsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSB0aGUgdmFsdWUgaW4gdGhlIG1vZGVsCi0JCXNwaW5uZXIuZGlzcG9zZSgpOwotCi0JCXZhbHVlID0gNDsKLQkJbW9kZWwuc2V0VmFsdWUodmFsdWUpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbW9kZWwncyB2YWx1ZSB3YXMgc29tZWhvdyBjaGFuZ2VkIiwKLQkJCUludGVnZXIudmFsdWVPZih2YWx1ZSksCi0JCQltb2RlbC5nZXRWYWx1ZSgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6YXRpb25fMSgpIHsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IHZhbHVlIiwKLQkJCWRlZmF1bHRWYWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnROdWxsKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlIG51bGwiLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbl8yKCkgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciA9IGJ1aWxkVmFsdWVIb2xkZXIoKTsKLQkJaW50IGRlZmF1bHRWYWx1ZSA9IDE7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCW51bWJlckhvbGRlciwKLQkJCXNwaW5uZXIsCi0JCQlkZWZhdWx0VmFsdWUKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdmFsdWUiLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydE51bGwoCi0JCQkiVGhlIG51bWJlciBob2xkZXIncyB2YWx1ZSBzaG91bGQgYmUgbnVsbCIsCi0JCQludW1iZXJIb2xkZXIuZ2V0VmFsdWUoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uXzMoKSB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gYnVpbGRWYWx1ZUhvbGRlcigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgZGVmYXVsdCB2YWx1ZSIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0TnVsbCgKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSBudWxsIiwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIG1vZGVsIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgdmFsdWUgZHVyaW5nIGluaXRpYWxpemF0aW9uIiwKLQkJCW1vZGVsLmlzU2V0VmFsdWVDYWxsZWQoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uXzQoKSB7Ci0KLQkJaW50IHZhbHVlID0gMjsKLQkJbW9kZWwuc2V0VmFsdWUodmFsdWUpOwotCQltb2RlbC5jbGVhclNldFZhbHVlQ2FsbGVkRmxhZygpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBidWlsZFZhbHVlSG9sZGVyKCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSB2YWx1ZSBjb21pbmcgZnJvbSB0aGUgbW9kZWwiLAotCQkJdmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlICIgKyB2YWx1ZSwKLQkJCUludGVnZXIudmFsdWVPZih2YWx1ZSksCi0JCQludW1iZXJIb2xkZXIuZ2V0VmFsdWUoKQotCQkpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBtb2RlbCBzaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgdGhlIHZhbHVlIGR1cmluZyBpbml0aWFsaXphdGlvbiIsCi0JCQltb2RlbC5pc1NldFZhbHVlQ2FsbGVkKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUNoYW5nZWQoKSB7Ci0KLQkJaW50IHZhbHVlID0gMjsKLQkJbW9kZWwuc2V0VmFsdWUodmFsdWUpOwotCQltb2RlbC5jbGVhclNldFZhbHVlQ2FsbGVkRmxhZygpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBidWlsZFZhbHVlSG9sZGVyKCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIGNvbWluZyBmcm9tIHRoZSBtb2RlbCIsCi0JCQl2YWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIG51bWJlciBob2xkZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIG1vZGVsJ3MgdmFsdWUiLAotCQkJbW9kZWwuZ2V0VmFsdWUoKSwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIG1vZGVsIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgdmFsdWUgZHVyaW5nIGluaXRpYWxpemF0aW9uIiwKLQkJCW1vZGVsLmlzU2V0VmFsdWVDYWxsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSB0aGUgdmFsdWUgaW4gdGhlIG1vZGVsCi0JCXZhbHVlID0gNDsKLQkJbW9kZWwuc2V0VmFsdWUodmFsdWUpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSBjb21pbmcgZnJvbSB0aGUgbW9kZWwiLAotCQkJdmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBtb2RlbCdzIHZhbHVlIHdhcyBzb21laG93IGNoYW5nZWQiLAotCQkJSW50ZWdlci52YWx1ZU9mKHZhbHVlKSwKLQkJCW1vZGVsLmdldFZhbHVlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHZhbHVlIGZyb20gdGhlIHNwaW5uZXIKLQkJdmFsdWUgPSA2OwotCQlzcGlubmVyLnNldFNlbGVjdGlvbih2YWx1ZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBuZXcgdmFsdWUgc2V0IiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbW9kZWwncyB2YWx1ZSB3YXMgc3VwcG9zZWQgdG8gYmUgdXBkYXRlZCIsCi0JCQlJbnRlZ2VyLnZhbHVlT2YodmFsdWUpLAotCQkJbW9kZWwuZ2V0VmFsdWUoKQotCQkpOwotCi0JCS8vIERpc2Nvbm5lY3QgZnJvbSBtb2RlbAotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgZGVmYXVsdCB2YWx1ZSIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQotCQlwcml2YXRlIGJvb2xlYW4gc2V0VmFsdWVDYWxsZWQ7Ci0JCXByaXZhdGUgSW50ZWdlciB2YWx1ZTsKLQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsKLQotCQl2b2lkIGNsZWFyU2V0VmFsdWVDYWxsZWRGbGFnKCkgewotCQkJc2V0VmFsdWVDYWxsZWQgPSBmYWxzZTsKLQkJfQotCi0JCUludGVnZXIgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQlib29sZWFuIGlzU2V0VmFsdWVDYWxsZWQoKSB7Ci0JCQlyZXR1cm4gc2V0VmFsdWVDYWxsZWQ7Ci0JCX0KLQotCQl2b2lkIHNldFZhbHVlKEludGVnZXIgdmFsdWUpIHsKLQkJCXNldFZhbHVlQ2FsbGVkID0gdHJ1ZTsKLQotCQkJSW50ZWdlciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgdmFsdWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UYWJsZU1vZGVsQWRhcHRlclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1N2I4YjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UYWJsZU1vZGVsQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUYWJsZU1vZGVsQWRhcHRlclRlc3QgewotCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1hbmFnZXI+IHN1YmplY3RIb2xkZXI7Ci0KLQlwcml2YXRlIENvbHVtbkFkYXB0ZXI8RW1wbG95ZWU+IGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUNvbHVtbkFkYXB0ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBidWlsZEVtcGxveWVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4oKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEVtcGxveWVlPiBidWlsZEVtcGxveWVlSG9sZGVycygpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxNYW5hZ2VyLCBFbXBsb3llZT4oc3ViamVjdEhvbGRlciwgTWFuYWdlci5FTVBMT1lFRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEVtcGxveWVlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmVtcGxveWVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZW1wbG95ZWVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSVRhYmxlTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFbXBsb3llZT4gYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihmaW5hbCBDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXMpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFbXBsb3llZT4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50PEVtcGxveWVlPiBlKSB7Ci0JCQkJZW1wbG95ZWVzLmNsZWFyKCk7Ci0JCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChlbXBsb3llZXMsIGUuc2VsZWN0aW9uKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TWFuYWdlcj4gYnVpbGRTdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxNYW5hZ2VyPigpOwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXNoZWxsICAgICAgICAgPSBuZXcgU2hlbGwoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQlzdWJqZWN0SG9sZGVyID0gYnVpbGRTdWJqZWN0SG9sZGVyKCk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc2hlbGwgICAgICAgICA9IG51bGw7Ci0JCXN1YmplY3RIb2xkZXIgPSBudWxsOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENoYW5nZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBUYWJsZSB3YXMgcG9wdWxhdGVkCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtcyBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBDaGFuZ2UgdGhlIGxpc3Qgb2YgRW1wbG95ZWVzCi0JCUFycmF5TGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oMyk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuY2hhbmdlRW1wbG95ZWVzKGVtcGxveWVlcyk7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW1zIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAwLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAxLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAyLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQluZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIFRhYmxlIHdhcyBwb3B1bGF0ZWQKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW1zIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIFRlc3QgcmVtb3ZpbmcgdGhlbSBhbGwKLQkJbWFuYWdlci5yZW1vdmVBbGxFbXBsb3llZXMoKTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbGlzdCBob2xkZXIgc2hvdWxkIGhhdmUgYmVlbiBjbGVhcmVkIiwgMCwgbGlzdEhvbGRlci5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgVGFibGUgc2hvdWxkIGhhdmUgYmVlbiBjbGVhcmVkIiwgMCwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgYSBuZXcgRW1wbG95ZWUKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZSAgICA9ICJEYWxpIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlciA9ICJXVFAiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZSAgID0gInBsdWctaW4iOwotCi0JCUVtcGxveWVlIGVtcGxveWVlID0gbWFuYWdlci5hZGRFbXBsb3llZShleHBlY3RlZE5hbWUsIGV4cGVjdGVkVGl0bGUsIGV4cGVjdGVkTWFuYWdlcik7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgY3JlYXRlZCIsIGVtcGxveWVlKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtIHJlcHJlc2VudGluZyB0aGUgbmV3IEVtcGxveWVlCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAxIiwgMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleCwgZXhwZWN0ZWROYW1lLCBleHBlY3RlZE1hbmFnZXIsIGV4cGVjdGVkVGl0bGUpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1Nb3ZlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIEVtcGxveWVlcyB3ZXJlIGFkZGVkIHRvIHRoZSBUYWJsZQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBNb3ZlIGFuIEVtcGxveWVlIHVwIHRoZSBsaXN0Ci0JCW1hbmFnZXIubW92ZUVtcGxveWVlVXAoZW1wbG95ZWUyKTsKLQotCQlpbnQgaW5kZXgxID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAxIHdhcyBub3QgbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMSwgaW5kZXgxKTsKLQotCQlpbnQgaW5kZXgyID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIHdhcyBub3QgbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgyKTsKLQotCQlpbnQgaW5kZXgzID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIHNob3VsZCBub3QgaGF2ZSBiZWVuIG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDIsIGluZGV4Myk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MSwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgyLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDMsIGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkTWFuYWdlcjMsIGV4cGVjdGVkVGl0bGUzKTsKLQotCQkvLyBNb3ZlIGFuIEVtcGxveWVlIGRvd24gdGhlIGxpc3QKLQkJbWFuYWdlci5tb3ZlRW1wbG95ZWVEb3duKGVtcGxveWVlMSk7Ci0KLQkJaW5kZXgxID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAxIHNob3VsZCBub3QgaGF2ZSBiZWVuIG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDIsIGluZGV4MSk7Ci0KLQkJaW5kZXgyID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIHdhcyBub3QgbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgyKTsKLQotCQlpbmRleDMgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDMgd2FzIG5vdCBtb3ZlZCBpbiB0aGUgdGFibGUgbW9kZWwiLCAxLCBpbmRleDMpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgzLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIGEgbmV3IEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUgICAgPSAiRGFsaSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIgPSAiV1RQIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUgICA9ICJwbHVnLWluIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZSA9IG1hbmFnZXIuYWRkRW1wbG95ZWUoZXhwZWN0ZWROYW1lLCBleHBlY3RlZFRpdGxlLCBleHBlY3RlZE1hbmFnZXIpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGNyZWF0ZWQiLCBlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAxIiwgMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIE1ha2Ugc3VyZSBpdCB3YXMgYWRkZWQgdG8gdGhlIG1vZGVsCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleCwgZXhwZWN0ZWROYW1lLCBleHBlY3RlZE1hbmFnZXIsIGV4cGVjdGVkVGl0bGUpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW0gcmVwcmVzZW50aW5nIHRoZSBuZXcgRW1wbG95ZWUKLQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlLmdldEl0ZW0oaW5kZXgpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiTm8gVGFibGVJdGVtIHdhcyBmb3VuZCBmb3IgdGhlIG5ldyBFbXBsb3llZSIsIHRhYmxlSXRlbSk7Ci0KLQkJLy8gTm93IHRlc3QgdGhlIGl0ZW0gYmVpbmcgcmVtb3ZlZAotCQltYW5hZ2VyLnJlbW92ZUVtcGxveWVlKGVtcGxveWVlKTsKLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgd2FzIG5vdCByZW1vdmVkIGZyb20gdGhlIHRhYmxlIG1vZGVsIiwgLTEsIGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDAiLCAwLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlcGxhY2VkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBhIG5ldyBFbXBsb3llZQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbWFuYWdlci5hZGRFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgY3JlYXRlZCIsIGVtcGxveWVlMSk7Ci0KLQkJLy8gTWFrZSBzdXJlIGl0IHdhcyBhZGRlZCB0byB0aGUgbW9kZWwKLQkJaW50IGluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDEiLCAxLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIFRhYmxlSXRlbSByZXByZXNlbnRpbmcgdGhlIG5ldyBFbXBsb3llZQotCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbShpbmRleDEpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiTm8gVGFibGVJdGVtIHdhcyBmb3VuZCBmb3IgdGhlIG5ldyBFbXBsb3llZSIsIHRhYmxlSXRlbSk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MSwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCi0JCS8vIFJlcGxhY2UgdGhlIEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQltYW5hZ2VyLnJlcGxhY2UoZW1wbG95ZWUxLCBlbXBsb3llZTIpOwotCi0JCWludCBpbmRleDIgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJQXNzZXJ0LmFzc2VydFNhbWUoIlRoZSBFbXBsb3llZSB0aGF0IGdvdCByZXBsYWNlZCBzaG91bGQgYmUgYXQgaW5kZXggIiArIGluZGV4MSwgaW5kZXgxLCBpbmRleDIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgyLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbXNBZGRlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtcyByZXByZXNlbnRpbmcgdGhlIGVtcGxveWVlcwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQlpbnQgaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0KLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAxLCBpbmRleCk7Ci0KLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDMgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAyLCBpbmRleCk7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBUYWJsZUl0ZW0gd2FzIGNvcnJlY3RseSBwb3B1bGF0ZWQKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDAsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDEsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDIsIGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkTWFuYWdlcjMsIGV4cGVjdGVkVGl0bGUzKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJdGVtc01vdmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTQgICAgPSAiRGFsaV80IjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjQgPSAiV1RQXzQiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTQgICA9ICJwbHVnLWluXzQiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWU1ICAgID0gIkRhbGlfNSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXI1ID0gIldUUF81IjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGU1ICAgPSAicGx1Zy1pbl81IjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lNiAgICA9ICJEYWxpXzYiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyNiA9ICJXVFBfNiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlNiAgID0gInBsdWctaW5fNiI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWU0ID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTQsIGV4cGVjdGVkVGl0bGU0LCBleHBlY3RlZE1hbmFnZXI0KTsKLQkJRW1wbG95ZWUgZW1wbG95ZWU1ID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTUsIGV4cGVjdGVkVGl0bGU1LCBleHBlY3RlZE1hbmFnZXI1KTsKLQkJRW1wbG95ZWUgZW1wbG95ZWU2ID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTYsIGV4cGVjdGVkVGl0bGU2LCBleHBlY3RlZE1hbmFnZXI2KTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlNCk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWU1KTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTYpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgRW1wbG95ZWVzIHdlcmUgYWRkZWQgdG8gdGhlIFRhYmxlCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSA2IiwgNiwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIE1vdmUgYW4gRW1wbG95ZWUgdXAgdGhlIGxpc3QKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigzKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTMpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlNCk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWU1KTsKLQkJbWFuYWdlci5tb3ZlRW1wbG95ZWVzKGVtcGxveWVlcywgMCk7Ci0KLQkJaW50IGluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlpbnQgaW5kZXgyID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCWludCBpbmRleDMgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJaW50IGluZGV4NCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTQpOwotCQlpbnQgaW5kZXg1ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNSk7Ci0JCWludCBpbmRleDYgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU2KTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMywgaW5kZXgxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDQsIGluZGV4Mik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAwLCBpbmRleDMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNCBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMSwgaW5kZXg0KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDUgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDIsIGluZGV4NSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA2IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCA1LCBpbmRleDYpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgzLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDQsIGV4cGVjdGVkTmFtZTQsIGV4cGVjdGVkTWFuYWdlcjQsIGV4cGVjdGVkVGl0bGU0KTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NSwgZXhwZWN0ZWROYW1lNSwgZXhwZWN0ZWRNYW5hZ2VyNSwgZXhwZWN0ZWRUaXRsZTUpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg2LCBleHBlY3RlZE5hbWU2LCBleHBlY3RlZE1hbmFnZXI2LCBleHBlY3RlZFRpdGxlNik7Ci0KLQkJLy8gTW92ZSBhbiBFbXBsb3llZSBkb3duIHRoZSBsaXN0Ci0JCWVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5tb3ZlRW1wbG95ZWVzKGVtcGxveWVlcywgNCk7Ci0KLQkJaW5kZXgxID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCWluZGV4MiA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlpbmRleDMgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJaW5kZXg0ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNCk7Ci0JCWluZGV4NSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTUpOwotCQlpbmRleDYgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU2KTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgNCwgaW5kZXgxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDUsIGluZGV4Mik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAwLCBpbmRleDMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNCBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMSwgaW5kZXg0KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDUgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDIsIGluZGV4NSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA2IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAzLCBpbmRleDYpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgzLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDQsIGV4cGVjdGVkTmFtZTQsIGV4cGVjdGVkTWFuYWdlcjQsIGV4cGVjdGVkVGl0bGU0KTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NSwgZXhwZWN0ZWROYW1lNSwgZXhwZWN0ZWRNYW5hZ2VyNSwgZXhwZWN0ZWRUaXRsZTUpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg2LCBleHBlY3RlZE5hbWU2LCBleHBlY3RlZE1hbmFnZXI2LCBleHBlY3RlZFRpdGxlNik7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbXNSZW1vdmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW1zIHJlcHJlc2VudGluZyB0aGUgZW1wbG95ZWVzCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4KTsKLQotCQlpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMiB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDEsIGluZGV4KTsKLQotCQlpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDIsIGluZGV4KTsKLQotCQkvLyBSZW1vdmUgMiBpdGVtcwotCQlBcnJheUxpc3Q8RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJbWFuYWdlci5yZW1vdmVFbXBsb3llZXMoZW1wbG95ZWVzKTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIGEgbmV3IEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUgICAgPSAiRGFsaSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIgPSAiV1RQIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUgICA9ICJwbHVnLWluIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZSA9IG1hbmFnZXIuYWRkRW1wbG95ZWUoZXhwZWN0ZWROYW1lLCBleHBlY3RlZFRpdGxlLCBleHBlY3RlZE1hbmFnZXIpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGNyZWF0ZWQiLCBlbXBsb3llZSk7Ci0KLQkJLy8gTWFrZSBzdXJlIGl0IHdhcyBhZGRlZCB0byB0aGUgbW9kZWwKLQkJaW50IGluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDEiLCAxLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIFRhYmxlSXRlbSByZXByZXNlbnRpbmcgdGhlIG5ldyBFbXBsb3llZQotCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbShpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJObyBUYWJsZUl0ZW0gd2FzIGZvdW5kIGZvciB0aGUgbmV3IEVtcGxveWVlIiwgdGFibGVJdGVtKTsKLQotCQkvLyBOYW1lIHByb3BlcnR5Ci0JCVN0cmluZyBhY3R1YWxOYW1lID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW05BTUVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE5hbWUsIGFjdHVhbE5hbWUpOwotCi0JCWV4cGVjdGVkTmFtZSA9ICJKcHQiOwotCQllbXBsb3llZS5zZXROYW1lKGV4cGVjdGVkTmFtZSk7Ci0KLQkJYWN0dWFsTmFtZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtOQU1FX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWROYW1lLCBhY3R1YWxOYW1lKTsKLQotCQkvLyBNYW5hZ2VyIHByb3BlcnR5Ci0JCVN0cmluZyBhY3R1YWxNYW5hZ2VyID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk1BTkFHRVJfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW01BTkFHRVJfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE1hbmFnZXIsIGFjdHVhbE1hbmFnZXIpOwotCi0JCWV4cGVjdGVkTWFuYWdlciA9ICJib3NzIjsKLQkJZW1wbG95ZWUuc2V0TWFuYWdlcihleHBlY3RlZE1hbmFnZXIpOwotCi0JCWFjdHVhbE1hbmFnZXIgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTUFOQUdFUl9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTUFOQUdFUl9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTWFuYWdlciwgYWN0dWFsTWFuYWdlcik7Ci0KLQkJLy8gVGl0bGUgcHJvcGVydHkKLQkJU3RyaW5nIGFjdHVhbFRpdGxlID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLlRJVExFX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtUSVRMRV9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkVGl0bGUsIGFjdHVhbFRpdGxlKTsKLQotCQlleHBlY3RlZFRpdGxlID0gIkVjbGlwc2VMaW5rIjsKLQkJZW1wbG95ZWUuc2V0VGl0bGUoZXhwZWN0ZWRUaXRsZSk7Ci0KLQkJYWN0dWFsVGl0bGUgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuVElUTEVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW1RJVExFX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWRUaXRsZSwgYWN0dWFsVGl0bGUpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNlbGVjdGVkSXRlbXNBZGRlZFJlbW92ZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtc0hvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXJzKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gVGVzdCBhZGRpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigyKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMyk7Ci0JCXNlbGVjdGVkSXRlbXNIb2xkZXIuYWRkQWxsKGVtcGxveWVlcyk7Ci0KLQkJQ29sbGVjdGlvbjxFbXBsb3llZT4gYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAyIiwgMiwgYWN0dWFsRW1wbG95ZWVzLnNpemUoKSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTEpOwotCQlhY3R1YWxFbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMyk7Ci0KLQkJQXNzZXJ0LmFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtcyB3YXMgbm90IHJldHJpZXZlZCBjb3JyZWN0bHkiLCBhY3R1YWxFbXBsb3llZXMuaXNFbXB0eSgpKTsKLQotCQkvLyBUZXN0IHJlbW92aW5nIHNlbGVjdGVkIGl0ZW1zCi0JCXNlbGVjdGVkSXRlbXNIb2xkZXIucmVtb3ZlKGVtcGxveWVlMSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAxIiwgMSwgYWN0dWFsRW1wbG95ZWVzLnNpemUoKSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTMpOwotCi0JCUFzc2VydC5hc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbXMgd2FzIG5vdCByZXRyaWV2ZWQgY29ycmVjdGx5IiwgYWN0dWFsRW1wbG95ZWVzLmlzRW1wdHkoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRJdGVtc0NsZWFyZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtc0hvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXJzKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gVGVzdCBhZGRpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigyKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMyk7Ci0JCXNlbGVjdGVkSXRlbXNIb2xkZXIuYWRkQWxsKGVtcGxveWVlcyk7Ci0KLQkJQ29sbGVjdGlvbjxFbXBsb3llZT4gYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAyIiwgMiwgYWN0dWFsRW1wbG95ZWVzLnNpemUoKSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTEpOwotCQlhY3R1YWxFbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMyk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbXMgd2FzIG5vdCByZXRyaWV2ZWQgY29ycmVjdGx5IiwgYWN0dWFsRW1wbG95ZWVzLmlzRW1wdHkoKSk7Ci0KLQkJLy8gVGVzdCByZW1vdmluZyBzZWxlY3RlZCBpdGVtcwotCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLmNsZWFyKCk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAiLCAwLCBhY3R1YWxFbXBsb3llZXMuc2l6ZSgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKSwKLQkJCWJ1aWxkRW1wbG95ZWVIb2xkZXIoKSwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCUNvbGxlY3Rpb248RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KCk7Ci0JCXRhYmxlTW9kZWwuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihlbXBsb3llZXMpKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBUZXN0IGFkZGluZyBzZWxlY3RlZCBpdGVtcwotCQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdIHsgMCwgMiB9KTsKLQotCQkvLyBJdCBzZWVtcyBhIG1hbnVhbCBzZWxlY3Rpb24gZG9lc24ndCBzZW5kIGFueSBzZWxlY3Rpb24gZXZlbnQKLQkJdGFibGVNb2RlbC50YWJsZVNlbGVjdGlvbkNoYW5nZWQobnVsbCk7Ci0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBlbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlIDIiLCAyLCBlbXBsb3llZXMuc2l6ZSgpKTsKLQotCQllbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtcyB3YXMgbm90IHJldHJpZXZlZCBjb3JyZWN0bHkiLCBlbXBsb3llZXMuaXNFbXB0eSgpKTsKLQotCQkvLyBUZXN0IGFkZGluZyBzZWxlY3RlZCBpdGVtcwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJdGFibGUuZGVzZWxlY3RBbGwoKTsKLQotCQkvLyBJdCBzZWVtcyBhIG1hbnVhbCBzZWxlY3Rpb24gZG9lc24ndCBzZW5kIGFueSBzZWxlY3Rpb24gZXZlbnQKLQkJdGFibGVNb2RlbC50YWJsZVNlbGVjdGlvbkNoYW5nZWQobnVsbCk7Ci0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBlbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlIDAiLCAwLCBlbXBsb3llZXMuc2l6ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdFRhYmxlSXRlbVByb3BlcnRpZXMoVGFibGUgdGFibGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTWFuYWdlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkVGl0bGUpCi0JewotCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbShpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJObyBUYWJsZUl0ZW0gd2FzIGZvdW5kIGZvciB0aGUgRW1wbG95ZWUiLCB0YWJsZUl0ZW0pOwotCi0JCVN0cmluZyBhY3R1YWxOYW1lID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW05BTUVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE5hbWUsIGFjdHVhbE5hbWUpOwotCi0JCVN0cmluZyBhY3R1YWxUaXRsZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5USVRMRV9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bVElUTEVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZFRpdGxlLCBhY3R1YWxUaXRsZSk7Ci0KLQkJU3RyaW5nIGFjdHVhbE1hbmFnZXIgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTUFOQUdFUl9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTUFOQUdFUl9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTWFuYWdlciwgYWN0dWFsTWFuYWdlcik7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBFbXBsb3llZSBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgU3RyaW5nIG1hbmFnZXI7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFUl9QUk9QRVJUWSA9ICJtYW5hZ2VyIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFX1BST1BFUlRZID0gInRpdGxlIjsKLQotCQlFbXBsb3llZShTdHJpbmcgbmFtZSwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWFuYWdlcikgewotCQkJc3VwZXIoKTsKLQotCQkJdGhpcy5uYW1lICAgID0gbmFtZTsKLQkJCXRoaXMudGl0bGUgICA9IHRpdGxlOwotCQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJfQotCi0JCVN0cmluZyBnZXRNYW5hZ2VyKCkgewotCQkJcmV0dXJuIG1hbmFnZXI7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0KLQkJU3RyaW5nIGdldFRpdGxlKCkgewotCQkJcmV0dXJuIHRpdGxlOwotCQl9Ci0KLQkJdm9pZCBzZXRNYW5hZ2VyKFN0cmluZyBtYW5hZ2VyKSB7Ci0JCQlTdHJpbmcgb2xkTWFuYWdlciA9IHRoaXMubWFuYWdlcjsKLQkJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1BTkFHRVJfUFJPUEVSVFksIG9sZE1hbmFnZXIsIG1hbmFnZXIpOwotCQl9Ci0KLQkJdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5hbWUpOwotCQl9Ci0KLQkJdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJCVN0cmluZyBvbGRUaXRsZSA9IHRoaXMudGl0bGU7Ci0JCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRJVExFX1BST1BFUlRZLCBvbGRUaXRsZSwgdGl0bGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQkJcHJpdmF0ZSBMaXN0PEVtcGxveWVlPiBlbXBsb3llZXM7Ci0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFTVBMT1lFRVNfTElTVCA9ICJlbXBsb3llZXMiOwotCi0JCU1hbmFnZXIoKSB7Ci0JCQlzdXBlcigpOwotCQkJZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oKTsKLQkJfQotCi0JCUVtcGxveWVlIGFkZEVtcGxveWVlKEVtcGxveWVlIGVtcGxveWVlKSB7Ci0JCQlhZGRJdGVtVG9MaXN0KGVtcGxveWVlLCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJCXJldHVybiBlbXBsb3llZTsKLQkJfQotCi0JCUVtcGxveWVlIGFkZEVtcGxveWVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtYW5hZ2VyKSB7Ci0JCQlFbXBsb3llZSBlbXBsb3llZSA9IG5ldyBFbXBsb3llZShuYW1lLCB0aXRsZSwgbWFuYWdlcik7Ci0JCQlyZXR1cm4gYWRkRW1wbG95ZWUoZW1wbG95ZWUpOwotCQl9Ci0KLQkJdm9pZCBjaGFuZ2VFbXBsb3llZXMoTGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzKSB7Ci0JCQl0aGlzLmVtcGxveWVlcy5jbGVhcigpOwotCQkJdGhpcy5lbXBsb3llZXMuYWRkQWxsKGVtcGxveWVlcyk7Ci0JCQlmaXJlTGlzdENoYW5nZWQoRU1QTE9ZRUVTX0xJU1QsIGVtcGxveWVlcyk7Ci0JCX0KLQotCQlMaXN0SXRlcmF0b3I8RW1wbG95ZWU+IGVtcGxveWVlcygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8RW1wbG95ZWU+KGVtcGxveWVlcyk7Ci0JCX0KLQotCQlpbnQgZW1wbG95ZWVzU2l6ZSgpIHsKLQkJCXJldHVybiBlbXBsb3llZXMuc2l6ZSgpOwotCQl9Ci0KLQkJdm9pZCBtb3ZlRW1wbG95ZWVEb3duKEVtcGxveWVlIGVtcGxveWVlKSB7Ci0JCQlpbnQgaW5kZXggPSBlbXBsb3llZXMuaW5kZXhPZihlbXBsb3llZSk7Ci0JCQltb3ZlSXRlbUluTGlzdChpbmRleCArIDEsIGluZGV4LCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgbW92ZUVtcGxveWVlcyhDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXMsIGludCB0YXJnZXRJbmRleCkgewotCi0JCQlpbnQgc291cmNlSW5kZXggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQotCQkJZm9yIChFbXBsb3llZSBlbXBsb3llZSA6IGVtcGxveWVlcykgewotCQkJCXNvdXJjZUluZGV4ID0gTWF0aC5taW4oc291cmNlSW5kZXgsIHRoaXMuZW1wbG95ZWVzLmluZGV4T2YoZW1wbG95ZWUpKTsKLQkJCX0KLQotCQkJbW92ZUl0ZW1zSW5MaXN0KAotCQkJCXRhcmdldEluZGV4LAotCQkJCXNvdXJjZUluZGV4LAotCQkJCWVtcGxveWVlcy5zaXplKCksCi0JCQkJdGhpcy5lbXBsb3llZXMsCi0JCQkJRU1QTE9ZRUVTX0xJU1QKLQkJCSk7Ci0JCX0KLQotCQl2b2lkIG1vdmVFbXBsb3llZVVwKEVtcGxveWVlIGVtcGxveWVlKSB7Ci0JCQlpbnQgaW5kZXggPSBlbXBsb3llZXMuaW5kZXhPZihlbXBsb3llZSk7Ci0JCQltb3ZlSXRlbUluTGlzdChpbmRleCAtIDEsIGluZGV4LCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlQWxsRW1wbG95ZWVzKCkgewotCQkJY2xlYXJMaXN0KGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVFbXBsb3llZShFbXBsb3llZSBlbXBsb3llZSkgewotCQkJcmVtb3ZlSXRlbUZyb21MaXN0KGVtcGxveWVlLCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlRW1wbG95ZWVzKENvbGxlY3Rpb248RW1wbG95ZWU+IGVtcGxveWVlcykgewotCQkJcmVtb3ZlSXRlbXNGcm9tTGlzdChlbXBsb3llZXMuaXRlcmF0b3IoKSwgdGhpcy5lbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgcmVwbGFjZShFbXBsb3llZSBvbGRFbXBsb3llZSwgRW1wbG95ZWUgbmV3RW1wbG95ZWUpIHsKLQkJCXJlcGxhY2VJdGVtSW5MaXN0KG9sZEVtcGxveWVlLCBuZXdFbXBsb3llZSwgZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhYmxlQ29sdW1uQWRhcHRlciBpbXBsZW1lbnRzIENvbHVtbkFkYXB0ZXI8RW1wbG95ZWU+IHsKLQotCQlzdGF0aWMgZmluYWwgaW50IENPTFVNTl9DT1VOVCA9IDM7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgTUFOQUdFUl9DT0xVTU4gPSAyOwotCQlzdGF0aWMgZmluYWwgaW50IE5BTUVfQ09MVU1OID0gMDsKLQkJc3RhdGljIGZpbmFsIGludCBUSVRMRV9DT0xVTU4gPSAxOwotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE1hbmFnZXJIb2xkZXIoRW1wbG95ZWUgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIFN0cmluZz4oRW1wbG95ZWUuTUFOQUdFUl9QUk9QRVJUWSwgc3ViamVjdCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmdldE1hbmFnZXIoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXN1YmplY3Quc2V0TWFuYWdlcih2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVIb2xkZXIoRW1wbG95ZWUgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIFN0cmluZz4oRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSwgc3ViamVjdCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmdldE5hbWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRpdGxlSG9sZGVyKEVtcGxveWVlIHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtcGxveWVlLCBTdHJpbmc+KEVtcGxveWVlLlRJVExFX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0VGl0bGUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXN1YmplY3Quc2V0VGl0bGUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBjZWxsTW9kZWxzKEVtcGxveWVlIHN1YmplY3QpIHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gaG9sZGVycyA9IG5ldyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PlszXTsKLQkJCWhvbGRlcnNbTkFNRV9DT0xVTU5dID0gYnVpbGROYW1lSG9sZGVyKHN1YmplY3QpOwotCQkJaG9sZGVyc1tUSVRMRV9DT0xVTU5dID0gYnVpbGRUaXRsZUhvbGRlcihzdWJqZWN0KTsKLQkJCWhvbGRlcnNbTUFOQUdFUl9DT0xVTU5dID0gYnVpbGRNYW5hZ2VySG9sZGVyKHN1YmplY3QpOwotCQkJcmV0dXJuIGhvbGRlcnM7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbHVtbkNvdW50KCkgewotCQkJcmV0dXJuIENPTFVNTl9DT1VOVDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgY29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihjb2x1bW5JbmRleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUVtcGxveWVlIGVtcGxveWVlID0gKEVtcGxveWVlKSBlbGVtZW50OwotCi0JCQlpZiAoY29sdW1uSW5kZXggPT0gVGFibGVDb2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKSB7Ci0JCQkJcmV0dXJuIGVtcGxveWVlLmdldE5hbWUoKTsKLQkJCX0KLQotCQkJaWYgKGNvbHVtbkluZGV4ID09IFRhYmxlQ29sdW1uQWRhcHRlci5USVRMRV9DT0xVTU4pIHsKLQkJCQlyZXR1cm4gZW1wbG95ZWUuZ2V0VGl0bGUoKTsKLQkJCX0KLQotCQkJcmV0dXJuIGVtcGxveWVlLmdldE1hbmFnZXIoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFibGVNb2RlbCBleHRlbmRzIFRhYmxlTW9kZWxBZGFwdGVyPEVtcGxveWVlPiB7Ci0KLQkJVGFibGVNb2RlbChMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciwKLQkJICAgICAgICAgICBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJICAgICAgICAgICBUYWJsZSB0YWJsZSwKLQkJICAgICAgICAgICBDb2x1bW5BZGFwdGVyPEVtcGxveWVlPiBjb2x1bW5BZGFwdGVyLAotCQkgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCQlzdXBlcihsaXN0SG9sZGVyLAotCQkJICAgICAgc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJCSAgICAgIHRhYmxlLAotCQkJICAgICAgY29sdW1uQWRhcHRlciwKLQkJCSAgICAgIGxhYmVsUHJvdmlkZXIpOwotCQl9Ci0KLQkJVGFibGVNb2RlbChMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciwKLQkJICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICAgICAgIFRhYmxlIHRhYmxlLAotCQkgICAgICAgICAgIENvbHVtbkFkYXB0ZXI8RW1wbG95ZWU+IGNvbHVtbkFkYXB0ZXIsCi0JCSAgICAgICAgICAgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJCXN1cGVyKGxpc3RIb2xkZXIsCi0JCQkJCW5ldyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFbXBsb3llZT4oc2VsZWN0ZWRJdGVtSG9sZGVyKSwKLQkJCSAgICAgIHRhYmxlLAotCQkJICAgICAgY29sdW1uQWRhcHRlciwKLQkJCSAgICAgIGxhYmVsUHJvdmlkZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBpbnQgaW5kZXhPZihFbXBsb3llZSBpdGVtKSB7Ci0JCQlyZXR1cm4gc3VwZXIuaW5kZXhPZihpdGVtKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtcygpIHsKLQkJCXJldHVybiBzdXBlci5zZWxlY3RlZEl0ZW1zKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdGFibGVTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlzdXBlci50YWJsZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5M2FmMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5EZWZhdWx0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5UcmlTdGF0ZUNoZWNrQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIHRyaS1zdGF0ZSBjaGVjayBib3hlcy4KLSAqLwotcHVibGljIGNsYXNzIFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMUhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGZsYWcySG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbm90RmxhZzJIb2xkZXI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCi0JcHJpdmF0ZSBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbChCb29sZWFuLlRSVUUsIEJvb2xlYW4uRkFMU0UpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuZmxhZzFIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzFIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmZsYWcySG9sZGVyID0gdGhpcy5idWlsZEZsYWcySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5ub3RGbGFnMkhvbGRlciA9IHRoaXMuYnVpbGROb3RGbGFnMkhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcxSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuRkxBRzFfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5pc0ZsYWcxKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEZsYWcxKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRmxhZzJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmlzRmxhZzIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb3RGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLk5PVF9GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmlzTm90RmxhZzIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Tm90RmxhZzIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg0MDAsIDEwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIGNoZWNrQm94UGFuZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgY2hlY2tCb3hQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkQ2hlY2tCb3hQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zNSk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkRmxhZzFDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRGbGFnMkNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZE5vdEZsYWcyQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkVW5hdHRhY2hlZENoZWNrQm94KHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxhZzFDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJmbGFnIDEiLCBEZWZhdWx0V2lkZ2V0RmFjdG9yeS5pbnN0YW5jZSgpKTsKLQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLmZsYWcxSG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxhZzJDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJmbGFnIDIiLCBEZWZhdWx0V2lkZ2V0RmFjdG9yeS5pbnN0YW5jZSgpKTsKLQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLmZsYWcySG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTm90RmxhZzJDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJuZXh0IGZsYWcgMiIsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLmFkYXB0KHRoaXMubm90RmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlUcmlTdGF0ZUNoZWNrQm94IGNoZWNrQm94ID0gbmV3IFRyaVN0YXRlQ2hlY2tCb3gocGFyZW50LCAidW5hdHRhY2hlZCIsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkVW5hdHRhY2hlZFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRVbmF0dGFjaGVkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hdHRhY2hlZCBkZWZhdWx0IHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgY2hlY2tCb3hQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNoZWNrQm94UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkRmxpcEZsYWcxQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24ocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsaXBGbGFnMUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRGbGlwRmxhZzFBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkRmxpcEZsYWcxQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigibmV4dCBmbGFnIDEiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMubmV4dEZsYWcxKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgibmV4dCBmbGFnIDEiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBuZXh0RmxhZzEoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLm5leHRGbGFnMSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENsZWFyTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc3RvcmUgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcmludE1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUHJpbnRNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInByaW50IG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJwcmludCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAxOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc05vdEZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiIpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBCb29sZWFuIGZsYWcxOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzFfUFJPUEVSVFkgPSAiZmxhZzEiOwotCQlwcml2YXRlIEJvb2xlYW4gZmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHMl9QUk9QRVJUWSA9ICJmbGFnMiI7Ci0JCXByaXZhdGUgQm9vbGVhbiBub3RGbGFnMjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9GTEFHMl9QUk9QRVJUWSA9ICJub3RGbGFnMiI7Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoQm9vbGVhbiBmbGFnMSwgQm9vbGVhbiBmbGFnMikgewotCQkJdGhpcy5mbGFnMSA9IGZsYWcxOwotCQkJdGhpcy5mbGFnMiA9IGZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9IHRoaXMubmV4dChmbGFnMik7Ci0JCX0KLQkJcHJpdmF0ZSBCb29sZWFuIG5leHQoQm9vbGVhbiBiKSB7Ci0JCQlyZXR1cm4gKGIgPT0gbnVsbCkgPyBCb29sZWFuLlRSVUUgOiBiLmJvb2xlYW5WYWx1ZSgpID8gQm9vbGVhbi5GQUxTRSA6IG51bGw7Ci0JCX0KLQkJcHVibGljIEJvb2xlYW4gaXNGbGFnMSgpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcxOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcxKEJvb2xlYW4gZmxhZzEpIHsKLQkJCUJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMTsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMV9QUk9QRVJUWSwgb2xkLCBmbGFnMSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbmV4dEZsYWcxKCkgewotCQkJdGhpcy5zZXRGbGFnMSh0aGlzLm5leHQodGhpcy5mbGFnMSkpOwotCQl9Ci0JCXB1YmxpYyBCb29sZWFuIGlzRmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMihCb29sZWFuIGZsYWcyKSB7Ci0JCQlCb29sZWFuIG9sZCA9IHRoaXMuZmxhZzI7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzJfUFJPUEVSVFksIG9sZCwgZmxhZzIpOwotCi0JCQlvbGQgPSB0aGlzLm5vdEZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9IHRoaXMubmV4dChmbGFnMik7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9UX0ZMQUcyX1BST1BFUlRZLCBvbGQsIHRoaXMubm90RmxhZzIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG5leHRGbGFnMigpIHsKLQkJCXRoaXMuc2V0RmxhZzIodGhpcy5uZXh0KHRoaXMuZmxhZzIpKTsKLQkJfQotCQlwdWJsaWMgQm9vbGVhbiBpc05vdEZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMubm90RmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Tm90RmxhZzIoQm9vbGVhbiBub3RGbGFnMikgewotCQkJdGhpcy5zZXRGbGFnMih0aGlzLm5leHQoZmxhZzIpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBuZXh0Tm90RmxhZzIoKSB7Ci0JCQl0aGlzLnNldE5vdEZsYWcyKHRoaXMubmV4dCh0aGlzLm5vdEZsYWcyKSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5pc0ZsYWcxKCkgKyAiIC0gIiArIHRoaXMuaXNGbGFnMigpICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sQWxpZ25lclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDMxNzgzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbEFsaWduZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sQWxpZ25lclRlc3QgewotCi0JcHJpdmF0ZSBDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByaXZhdGUgTGF5b3V0IGJ1aWxkU3BhY2VyTGF5b3V0KCkgewotCQlyZXR1cm4gbmV3IExheW91dCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoSGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0SGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQotCQkJCXJldHVybiBuZXcgUG9pbnQod2lkdGhIaW50LCBoZWlnaHRIaW50KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29tcG9zaXRlLmdldExheW91dERhdGEoKTsKLQkJCQljb21wb3NpdGUuc2V0Qm91bmRzKDAsIDAsIGRhdGEud2lkdGhIaW50LCBkYXRhLmhlaWdodEhpbnQpOwotCQkJfQotCQl9OwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQotCQljb250cm9sQWxpZ25lciA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCi0JCXNoZWxsICA9IG5ldyBTaGVsbChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQotCQlpZiAoY29udHJvbEFsaWduZXIgIT0gbnVsbCkgewotCQkJY29udHJvbEFsaWduZXIuZGlzcG9zZSgpOwotCQkJY29udHJvbEFsaWduZXIgPSBudWxsOwotCQl9Ci0KLQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCXNoZWxsID0gbnVsbDsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2wxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBiZSAwLCIsCi0JCQkwLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUgPSBsYWJlbC5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemUueCArICIsIiwKLQkJCXNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQlidXR0b24uc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemUueCArICIsIiwKLQkJCXNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChidXR0b24pOwotCi0JCVBvaW50IGxhYmVsU2l6ZSAgPSBsYWJlbC5nZXRTaXplKCk7Ci0JCVBvaW50IGJ1dHRvblNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgobGFiZWxTaXplLngsIGJ1dHRvblNpemUueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIG1heCArICIsIiwKLQkJCW1heCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbEFsaWduZXIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdXBkYXRlR3JpZERhdGEobGFiZWwxKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwyKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwxKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCWxhYmVsMi5zZXRUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIENvbnRyb2xBbGlnbmVyIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplMSA9IGxhYmVsMS5nZXRTaXplKCk7Ci0JCVBvaW50IHNpemUyID0gbGFiZWwyLmdldFNpemUoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5tYXgoc2l6ZTEueCwgc2l6ZTIueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbEFsaWduZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdXBkYXRlR3JpZERhdGEobGFiZWwxKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwyKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwxKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIyLmFkZChsYWJlbDIpOwotCi0JCWxhYmVsMS5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJbGFiZWwyLnNldFRleHQoIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgQ29udHJvbEFsaWduZXIiKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQoY29udHJvbEFsaWduZXIyKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUxID0gbGFiZWwxLmdldFNpemUoKTsKLQkJUG9pbnQgc2l6ZTIgPSBsYWJlbDIuZ2V0U2l6ZSgpOwotCQlpbnQgd2lkdGggPSBNYXRoLm1heChzaXplMS54LCBzaXplMi54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdChleHBlY3RlZD1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2xBbGlnbmVyVG9JdHNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyKTsKLQkJZmFpbCgiQSBDb250cm9sQWxpZ25lciBjYW4ndCBiZSBhZGRlZCB0byBpdHNlbGYiKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3REaWFsb2dfQWRkQ29udHJvbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlmaW5hbCBpbnRbXSBtYXhpbXVtV2lkdGggPSBuZXcgaW50WzFdOwotCQlmaW5hbCBpbnRbXSBzaXplID0gbmV3IGludFsxXTsKLQotCQlUaXRsZUFyZWFEaWFsb2cgZGlhbG9nID0gbmV3IFRpdGxlQXJlYURpYWxvZyhTV1RVdGlsLmdldFNoZWxsKCkpIHsKLQotCQkJcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQkJCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCQlsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTEVGVCk7Ci0JCQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQotCQkJCXJldHVybiBwYXJlbnQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJvdW5kcygpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplQm91bmRzKCk7Ci0JCQkJc2l6ZVswXSA9IGxhYmVsLmdldFNpemUoKS54OwotCQkJCW1heGltdW1XaWR0aFswXSA9IGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpOwotCQkJfQotCQl9OwotCi0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmNsb3NlKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemVbMF0gKyAiLCIsCi0JCQlzaXplWzBdLAotCQkJbWF4aW11bVdpZHRoWzBdCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlhbG9nX0FkZENvbnRyb2wyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJZmluYWwgaW50W10gbWF4aW11bVdpZHRoID0gbmV3IGludFsxXTsKLQkJZmluYWwgaW50W10gc2l6ZXMgPSBuZXcgaW50WzJdOwotCi0JCVRpdGxlQXJlYURpYWxvZyBkaWFsb2cgPSBuZXcgVGl0bGVBcmVhRGlhbG9nKFNXVFV0aWwuZ2V0U2hlbGwoKSkgewotCi0JCQlwcml2YXRlIEJ1dHRvbiBidXR0b247Ci0JCQlwcml2YXRlIExhYmVsIGxhYmVsOwotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQkJCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJCWxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJCQl1cGRhdGVHcmlkRGF0YShsYWJlbCk7Ci0KLQkJCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCi0JCQkJYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCQkJYnV0dG9uLnNldFRleHQoIlNob3J0IHRleHQiKTsKLQkJCQl1cGRhdGVHcmlkRGF0YShidXR0b24pOwotCi0JCQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCb3VuZHMoKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZUJvdW5kcygpOwotCQkJCXNpemVzWzBdID0gbGFiZWwuZ2V0U2l6ZSgpLng7Ci0JCQkJc2l6ZXNbMV0gPSBidXR0b24uZ2V0U2l6ZSgpLng7Ci0JCQkJbWF4aW11bVdpZHRoWzBdID0gY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuY2xvc2UoKTsKLQotCQlpbnQgbGFiZWxTaXplICA9IHNpemVzWzBdOwotCQlpbnQgYnV0dG9uU2l6ZSA9IHNpemVzWzFdOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgobGFiZWxTaXplLCBidXR0b25TaXplKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJbWF4aW11bVdpZHRoWzBdCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoIlRoaXMgaXMgdmVyeSBsb25nIHRleHQiKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhbmUsIFNXVC5OVUxMKTsKLQkJYnV0dG9uLnNldFRleHQoIlNob3J0IHRleHQiKTsKLQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQotCQlQb2ludCBsYWJlbFNpemUgID0gbGFiZWwuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBtYXggKyAiLCIsCi0JCQltYXgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWxhYmVsLmRpc3Bvc2UoKTsKLQotCQlQb2ludCBuZXdCdXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQotCQlhc3NlcnROb3RTYW1lKAotCQkJIlRoZSBvbGQgbWF4IGFuZCBuZXcgbWF4IHNob3VsZCBub3QgYmUgdGhlIHNhbWUiLAotCQkJbWF4LAotCQkJbmV3QnV0dG9uU2l6ZS54Ci0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBDb250cm9sQWxpZ25lciBkb2Vzbid0IGhhdmUgdGhlIHJpZ2h0IG1heGltdW0gd2lkdGgiLAotCQkJbmV3QnV0dG9uU2l6ZS54LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RIaWVyYXJjaHlPZkNvbnRyb2xBbGlnbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIEFsaWduZXIxCi0JCS8vICBeCi0JCS8vICB8LUFsaWduZXIyCi0JCS8vICAgICBeCi0JCS8vICAgICB8LUFsaWduZXIzCi0JCUNvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyMiA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCQljb250cm9sQWxpZ25lci5hZGQoY29udHJvbEFsaWduZXIyKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjMgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIyLmFkZChjb250cm9sQWxpZ25lcjMpOwotCi0JCS8vIFRlc3QgMQotCQlMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsMS5zZXRUZXh0KCJUaGlzIGlzIGEgbGFiZWwgd2lkZ2V0Iik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJaW50IGxhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQljb250cm9sQWxpZ25lcjMuYWRkKGxhYmVsMSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgbGFiZWxXaWR0aDEpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBsYWJlbFdpZHRoMSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSwgbGFiZWxXaWR0aDEpOwotCi0JCS8vIFRlc3QgMgotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsMi5zZXRUZXh0KCJTaG9ydExhYmVsIik7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQlpbnQgbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCWludCBuZXdMYWJlbFdpZHRoMiA9IGxhYmVsMi5nZXRTaXplKCkueDsKLQotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIzLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgbmV3TGFiZWxXaWR0aDIpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQotCQkvLyBUZXN0IDMKLQkJTGFiZWwgbGFiZWwzID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbDMuc2V0VGV4dCgiQSB2ZXJ5IGxvbmcgbGFiZWwgdGhhdCB0YWtlcyBhIGxvdCBvZiBob3Jpem9udGFsIHNwYWNlIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMyk7Ci0KLQkJbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgyID0gbGFiZWwyLmdldFNpemUoKS54OwotCQlpbnQgbmV3TGFiZWxXaWR0aDMgPSBsYWJlbDMuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIG5ld0xhYmVsV2lkdGgyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgyLCBuZXdMYWJlbFdpZHRoMyk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCi0JCS8vIE1ha2Ugc3VyZSBhbGwgdGhlIGxvY2tlZCBhcmUgcmVtb3ZlZAotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlXyhjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB0ZXh0IG9mIGxhYmVsMgotCQlsYWJlbDIuc2V0VGV4dCgibW0iKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUpOwotCi0JCW5ld0xhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQluZXdMYWJlbFdpZHRoMiA9IGxhYmVsMi5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDMgPSBsYWJlbDMuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIG5ld0xhYmVsV2lkdGgyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgyLCBuZXdMYWJlbFdpZHRoMyk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCi0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMywgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHRleHQgb2YgbGFiZWwxCi0JCWxhYmVsMS5zZXRUZXh0KCJhIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQlDb21wb3NpdGUgcGFyZW50MSA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTlVMTCk7Ci0JCXBhcmVudDEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUxhYmVsIHRlbXBMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQxLCBTV1QuTlVMTCk7Ci0JCXRlbXBMYWJlbC5zZXRUZXh0KCJhIik7Ci0vLwkJcGFyZW50MS5sYXlvdXQodHJ1ZSk7Ci0KLQkJaW50IHJlYWxXaWR0aCA9IHRlbXBMYWJlbC5nZXRTaXplKCkueDsKLQotCQluZXdMYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RmFsc2UobmV3TGFiZWxXaWR0aDEgPT0gcmVhbFdpZHRoKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlXyhjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB0ZXh0IG9mIGxhYmVsMQotCQlsYWJlbDEuc2V0VGV4dCgiWWVzIGFub3RoZXIgYmlnIGxvbmcgbG9uZyB0ZXh0IHNvIHRoYXQgYWxsIHRoZSBsYWJlbHMgd2lsbCBoYXZlIHRvIHRha2UgdGhlIHNpemUgb2YgdGhpcyBsYWJlbCB0byBtYWtlIHN1cmUgQ29udHJvbEFsaWduZXIgd29ya3MgY29ycmVjdGx5Iik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQkvLyBXZWlyZDogSXQgc2VlbXMgbm8gbm90aWZpY2F0aW9uIGlzIHNlbnQsIGZpcmUgb25lIG1hbnVhbGx5Ci0JCUV2ZW50IGV2ZW50ICA9IG5ldyBFdmVudCgpOwotCQlldmVudC53aWRnZXQgPSBsYWJlbDE7Ci0JCWV2ZW50LnR5cGUgICA9IFNXVC5SZXNpemU7Ci0JCWxhYmVsMS5ub3RpZnlMaXN0ZW5lcnMoU1dULlJlc2l6ZSwgZXZlbnQpOwotCi0JCUNvbXBvc2l0ZSBwYXJlbnQyID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OVUxMKTsKLQkJcGFyZW50Mi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJdGVtcExhYmVsID0gbmV3IExhYmVsKHBhcmVudDIsIFNXVC5OVUxMKTsKLQkJdGVtcExhYmVsLnNldFRleHQobGFiZWwxLmdldFRleHQoKSk7Ci0JCXBhcmVudDIubGF5b3V0KHRydWUpOwotCi0JCXJlYWxXaWR0aCA9IHRlbXBMYWJlbC5nZXRTaXplKCkueDsKLQotCQluZXdMYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCksIG5ld0xhYmVsV2lkdGgxKTsKLQkJYXNzZXJ0RXF1YWxzKHJlYWxXaWR0aCwgbmV3TGFiZWxXaWR0aDEpOwotCi0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMywgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb250cm9sMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgc2l6ZS54ICsgIiwiLAotCQkJc2l6ZS54LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQljb250cm9sQWxpZ25lci5yZW1vdmUoYnV0dG9uKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAwLCAiLAotCQkJMCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQotCQlQb2ludCBsYWJlbFNpemUgID0gbGFiZWwuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBtYXggKyAiLCIsCi0JCQltYXgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWNvbnRyb2xBbGlnbmVyLnJlbW92ZShsYWJlbCk7Ci0KLQkJUG9pbnQgbmV3QnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0Tm90U2FtZSgKLQkJCSJUaGUgb2xkIG1heCBhbmQgbmV3IG1heCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIiwKLQkJCW1heCwKLQkJCW5ld0J1dHRvblNpemUueAotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgQ29udHJvbEFsaWduZXIgZG9lc24ndCBoYXZlIHRoZSByaWdodCBtYXhpbXVtIHdpZHRoIiwKLQkJCW5ld0J1dHRvblNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gV2lkZ2V0IDEKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQotCQkvLyBXaWRnZXQgMgotCQlDb21wb3NpdGUgc3BhY2VyID0gbmV3IENvbXBvc2l0ZShwYW5lLCBTV1QuTlVMTCk7Ci0JCXNwYWNlci5zZXRMYXlvdXQoYnVpbGRTcGFjZXJMYXlvdXQoKSk7Ci0JCXVwZGF0ZUdyaWREYXRhKHNwYWNlcik7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChzcGFjZXIpOwotCi0JCS8vIFdpZGdldCAzCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhbmUsIFNXVC5OVUxMKTsKLQkJYnV0dG9uLnNldFRleHQoIlNob3J0IHRleHQiKTsKLQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgMyB3aWRnZXRzIGhhdmUgdGhlIHNhbWUgd2lkdGgKLQkJUG9pbnQgbGFiZWxTaXplICA9IGxhYmVsLmdldFNpemUoKTsKLQkJUG9pbnQgc3BhY2VyU2l6ZSA9IHNwYWNlci5nZXRTaXplKCk7Ci0JCVBvaW50IGJ1dHRvblNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgobGFiZWxTaXplLngsIGJ1dHRvblNpemUueCk7Ci0JCW1heCA9IE1hdGgubWF4KG1heCwgc3BhY2VyU2l6ZS54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwYWNlcidzIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJc3BhY2VyU2l6ZS54Ci0JCSk7Ci0KLQkJLy8gUmVtb3ZlIHRoZSBsYWJlbCAodGhlIHdpZGVzdCB3aWRnZXQpIGFuZCBtYWtlIHN1cmUgdGhlIHdpZHRoIHdhcwotCQkvLyBjb3JyZWN0bHkgY2FsY3VsYXRlZAotCQljb250cm9sQWxpZ25lci5yZW1vdmUobGFiZWwpOwotCi0JCXNwYWNlclNpemUgPSBzcGFjZXIuZ2V0U2l6ZSgpOwotCQlidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heDIgPSBNYXRoLm1heChzcGFjZXJTaXplLngsIGJ1dHRvblNpemUueCk7Ci0KLQkJYXNzZXJ0Tm90U2FtZSgKLQkJCSJUaGUgb2xkIG1heCBhbmQgbmV3IG1heCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIiwKLQkJCW1heCwKLQkJCW1heDIKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIENvbnRyb2xBbGlnbmVyIGRvZXNuJ3QgaGF2ZSB0aGUgcmlnaHQgbWF4aW11bSB3aWR0aCIsCi0JCQltYXgyLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwYWNlcidzIHdpZHRoIHNob3VsZCBoYXZlIGJlZW4gYWRqdXN0ZWQiLAotCQkJbWF4MiwKLQkJCXNwYWNlclNpemUueAotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnRyb2xBbGlnbmVyMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMSk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMSk7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIyID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sQWxpZ25lcjIpOwotCQljb250cm9sQWxpZ25lcjIuYWRkKGxhYmVsMik7Ci0KLQkJbGFiZWwxLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQlsYWJlbDIuc2V0VGV4dCgiVGhpcyBpcyBhIHZlcnkgbG9uZyBDb250cm9sQWxpZ25lciIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZTEgPSBsYWJlbDEuZ2V0U2l6ZSgpOwotCQlQb2ludCBzaXplMiA9IGxhYmVsMi5nZXRTaXplKCk7Ci0JCWludCB3aWR0aCA9IE1hdGgubWF4KHNpemUxLngsIHNpemUyLngpOwotCi0JCS8vIFRlc3QgMQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQkvLyBUZXN0IDIKLQkJY29udHJvbEFsaWduZXIucmVtb3ZlKGxhYmVsMSk7Ci0KLQkJd2lkdGggPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbEFsaWduZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdXBkYXRlR3JpZERhdGEobGFiZWwxKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwyKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwxKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCWxhYmVsMi5zZXRUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIENvbnRyb2xBbGlnbmVyIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplMSA9IGxhYmVsMS5nZXRTaXplKCk7Ci0JCVBvaW50IHNpemUyID0gbGFiZWwyLmdldFNpemUoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5tYXgoc2l6ZTEueCwgc2l6ZTIueCk7Ci0KLQkJLy8gVGVzdCAxCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCS8vIFRlc3QgMgotCQljb250cm9sQWxpZ25lcjIucmVtb3ZlKGxhYmVsMik7Ci0KLQkJd2lkdGggPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbnRyb2wgY29udHJvbCkgewotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQljb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xFbmFibGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbEVuYWJsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4Y2I3ZjIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbEVuYWJsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyb2xFbmFibGVyVGVzdCB7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hTdGF0ZSgpIHsKLQotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciA9Ci0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KHRydWUpOwotCi0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUik7Ci0KLQkJU1dUVG9vbHMuY29udHJvbEVuYWJsZWRTdGF0ZShib29sZWFuSG9sZGVyLCBjb21ibyk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIGJlIGVuYWJsZWQiLAotCQkJY29tYm8uaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKG51bGwpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBub3QgYmUgZW5hYmxlZCIsCi0JCQljb21iby5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAodHJ1ZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgYmUgZW5hYmxlZCIsCi0JCQljb21iby5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAoZmFsc2UpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoZmFsc2UpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgbm90IGJlIGVuYWJsZWQiLAotCQkJY29tYm8uaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBEaXNwb3NlCi0JCWNvbWJvLmRpc3Bvc2UoKTsKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sU3dpdGNoZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sU3dpdGNoZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjRmNjAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbFN3aXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbFN3aXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyb2xTd2l0Y2hlclRlc3QgewotCi0JcHJpdmF0ZSBQYWdlQm9vayBwYWdlQm9vazsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYW5lMTsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYW5lMjsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBidWlsZFBhbmUxKCkgewotCi0JCWlmIChwYW5lMSA9PSBudWxsKSB7Ci0KLQkJCXBhbmUxID0gbmV3IENvbXBvc2l0ZShwYWdlQm9vaywgU1dULk5VTEwpOwotCQkJcGFuZTEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUxLCBTV1QuTlVMTCk7Ci0JCQlsYWJlbC5zZXRUZXh0KCImVGVzdDI6Iik7Ci0KLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhbmUxLCBTV1QuQk9SREVSKTsKLQkJCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhbmUxLCBTV1QuQk9SREVSKTsKLQotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl9Ci0KLQkJcmV0dXJuIHBhbmUxOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGJ1aWxkUGFuZTIoKSB7Ci0KLQkJaWYgKHBhbmUyID09IG51bGwpIHsKLQotCQkJcGFuZTIgPSBuZXcgQ29tcG9zaXRlKHBhZ2VCb29rLCBTV1QuTlVMTCk7Ci0JCQlwYW5lMi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZTIsIFNXVC5OVUxMKTsKLQkJCWxhYmVsLnNldFRleHQoIiZUZXN0MToiKTsKLQotCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFuZTIsIFNXVC5CT1JERVIpOwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJfQotCi0JCXJldHVybiBwYW5lMjsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPEJvb2xlYW4sIENvbnRyb2w+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQ29udHJvbD4oKSB7Ci0JCQlwdWJsaWMgQ29udHJvbCB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyBudWxsIDogKHZhbHVlID8gcGFuZTEgOiBwYW5lMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQotCQkJcGFyZW50ICAgPSBudWxsOwotCQkJcGFnZUJvb2sgPSBudWxsOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoKCkgewotCi0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBzd2l0Y2hIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KCk7Ci0JCVRyYW5zZm9ybWVyPEJvb2xlYW4sIENvbnRyb2w+IHRyYW5zZm9ybWVyID0gYnVpbGRUcmFuc2Zvcm1lcigpOwotCi0JCXBhbmUxID0gYnVpbGRQYW5lMSgpOwotCQlwYW5lMS5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQlwYW5lMiA9IGJ1aWxkUGFuZTIoKTsKLQkJcGFuZTIuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJbmV3IENvbnRyb2xTd2l0Y2hlcigKLQkJCXN3aXRjaEhvbGRlciwKLQkJCXRyYW5zZm9ybWVyLAotCQkJcGFnZUJvb2sKLQkJKTsKLQotCQkvLyBUZXN0IDEKLQkJc3dpdGNoSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCQlDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUocGFnZUJvb2ssICJjdXJyZW50UGFnZSIpOwotCi0JCWFzc2VydE5vdE51bGwoCi0JCQkiVGhlIHBhZ2UgYm9vaydzIHBhZ2Ugc2hvdWxkbid0IGJlIG51bGwiLAotCQkJY29udHJvbAotCQkpOwotCi0JCWFzc2VydFNhbWUoCi0JCQkiVGhlIGN1cnJlbnQgcGFuZSBzaG91bGQgYmUgcGFuZTEiLAotCQkJcGFuZTEsCi0JCQljb250cm9sCi0JCSk7Ci0KLQkJUG9pbnQgcGFuZTFTaXplID0gcGFuZTEuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJUG9pbnQgcGFnZUJvb2tTaXplID0gcGFnZUJvb2suY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIG9mIHRoZSBQYWdlQm9vayBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHdpZHRoIG9mIHBhbmUxIiwKLQkJCXBhbmUxU2l6ZS54LAotCQkJcGFnZUJvb2tTaXplLngKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIGhlaWdodCBvZiB0aGUgUGFnZUJvb2sgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBoZWlnaHQgb2YgcGFuZTEiLAotCQkJcGFuZTFTaXplLnksCi0JCQlwYWdlQm9va1NpemUueQotCQkpOwotCi0JCS8vIFRlc3QgMgotCQlzd2l0Y2hIb2xkZXIuc2V0VmFsdWUoZmFsc2UpOwotCQljb250cm9sID0gKENvbnRyb2wpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHBhZ2VCb29rLCAiY3VycmVudFBhZ2UiKTsKLQotCQlhc3NlcnROb3ROdWxsKAotCQkJIlRoZSBwYWdlIGJvb2sncyBwYWdlIHNob3VsZG4ndCBiZSBudWxsIiwKLQkJCWNvbnRyb2wKLQkJKTsKLQotCQlhc3NlcnRTYW1lKAotCQkJIlRoZSBjdXJyZW50IHBhbmUgc2hvdWxkIGJlIHBhbmUyIiwKLQkJCXBhbmUyLAotCQkJY29udHJvbAotCQkpOwotCi0JCVBvaW50IHBhbmUyU2l6ZSA9IHBhbmUyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCXBhZ2VCb29rU2l6ZSA9IHBhZ2VCb29rLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBvZiB0aGUgUGFnZUJvb2sgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSB3aWR0aCBvZiBwYW5lMiIsCi0JCQlwYW5lMlNpemUueCwKLQkJCXBhZ2VCb29rU2l6ZS54Ci0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBoZWlnaHQgb2YgdGhlIFBhZ2VCb29rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgaGVpZ2h0IG9mIHBhbmUyIiwKLQkJCXBhbmUyU2l6ZS55LAotCQkJcGFnZUJvb2tTaXplLnkKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNzAyZDUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbFZpc2liaWxpdHlFbmFibGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyb2xWaXNpYmlsaXR5RW5hYmxlclRlc3QgewotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoU3RhdGUoKSB7Ci0KLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIgPQotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPih0cnVlKTsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCi0JCVNXVFRvb2xzLmNvbnRyb2xWaXNpYmxlU3RhdGUoYm9vbGVhbkhvbGRlciwgY29tYm8pOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBiZSB2aXNpYmxlIiwKLQkJCWNvbWJvLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChudWxsKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgbm90IGJlIHZpc2libGUiLAotCQkJY29tYm8uaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKHRydWUpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIGJlIHZpc2libGUiLAotCQkJY29tYm8uaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKGZhbHNlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwKLQkJCWNvbWJvLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gRGlzcG9zZQotCQljb21iby5kaXNwb3NlKCk7Ci0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSnB0VWlVdGlsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0pwdFVpVXRpbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxY2ZiMDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSnB0VWlVdGlsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5KVW5pdDRUZXN0QWRhcHRlcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZS5TdWl0ZUNsYXNzZXM7Ci0KLUBTdWl0ZUNsYXNzZXMKLSh7Ci0JQ29udHJvbEFsaWduZXJUZXN0LmNsYXNzLAotCUNvbnRyb2xTd2l0Y2hlclRlc3QuY2xhc3MsCi0JQ29udHJvbEVuYWJsZXJUZXN0LmNsYXNzLAotCUNvbnRyb2xWaXNpYmlsaXR5RW5hYmxlclRlc3QuY2xhc3MsCi0JTGFiZWxlZEJ1dHRvblRlc3QuY2xhc3MsCi0JTGFiZWxlZExhYmVsVGVzdC5jbGFzcywKLQlMYWJlbGVkQ29udHJvbFVwZGF0ZXJUZXN0LmNsYXNzLAotCVBhbmVFbmFibGVyVGVzdC5jbGFzcywKLQlQYW5lVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmNsYXNzLAotfSkKLUBSdW5XaXRoKFN1aXRlLmNsYXNzKQotcHVibGljIGZpbmFsIGNsYXNzIEpwdFVpVXRpbFRlc3RzIHsKLQotCXByaXZhdGUgSnB0VWlVdGlsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBKVW5pdDRUZXN0QWRhcHRlcihKcHRVaVV0aWxUZXN0cy5jbGFzcykpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvblRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRCdXR0b25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZTMwMzEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIExhYmVsZWRCdXR0b25UZXN0IHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQkJcGFyZW50ID0gbnVsbDsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdExhYmVsZWRCdXR0b24xKCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbmV3IExhYmVsZWRCdXR0b24oYnV0dG9uKTsKLQl9Ci0KLQlAVGVzdChleHBlY3RlZD1Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24uY2xhc3MpCi0JcHVibGljIHZvaWQgdGVzdExhYmVsZWRCdXR0b24yKCkgewotCQluZXcgTGFiZWxlZEJ1dHRvbihudWxsKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRCdXR0b24gbGFiZWxlZEJ1dHRvbiA9IG5ldyBMYWJlbGVkQnV0dG9uKGJ1dHRvbik7Ci0KLQkJCWxhYmVsZWRCdXR0b24uc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBCdXR0b24gZGlkbid0IHJlY2VpdmUgdGhlIEltYWdlIiwKLQkJCQlleHBlY3RlZCwKLQkJCQlidXR0b24uZ2V0SW1hZ2UoKQotCQkJKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWV4cGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlRGlzcG9zZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRCdXR0b24gbGFiZWxlZEJ1dHRvbiA9IG5ldyBMYWJlbGVkQnV0dG9uKGJ1dHRvbik7Ci0KLQkJCWJ1dHRvbi5kaXNwb3NlKCk7Ci0KLQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBmYWlsIGJ1dCBzaW1wbHkgZG8gbm90aGluZwotCQkJbGFiZWxlZEJ1dHRvbi5zZXRJbWFnZShleHBlY3RlZCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0KCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZEJ1dHRvbiBsYWJlbGVkQnV0dG9uID0gbmV3IExhYmVsZWRCdXR0b24oYnV0dG9uKTsKLQotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQlsYWJlbGVkQnV0dG9uLnNldFRleHQoZXhwZWN0ZWQpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgQnV0dG9uIGRpZG4ndCByZWNlaXZlIHRoZSB0ZXh0IiwKLQkJCWV4cGVjdGVkLAotCQkJYnV0dG9uLmdldFRleHQoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldFRleHREaXNwb3NlKCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZEJ1dHRvbiBsYWJlbGVkQnV0dG9uID0gbmV3IExhYmVsZWRCdXR0b24oYnV0dG9uKTsKLQotCQlidXR0b24uZGlzcG9zZSgpOwotCi0JCS8vIFRoaXMgc2hvdWxkIG5vdCBmYWlsIGJ1dCBzaW1wbHkgZG8gbm90aGluZwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQlsYWJlbGVkQnV0dG9uLnNldFRleHQoZXhwZWN0ZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyY2U1MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbFVwZGF0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRDb250cm9sVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZENvbnRyb2xVcGRhdGVyVGVzdCB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJCXBhcmVudCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGltYWdlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oKTsKLQkJCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIobGFiZWxlZExhYmVsLCBudWxsLCBpbWFnZUhvbGRlcik7Ci0KLQkJCWxhYmVsZWRMYWJlbC5zZXRJbWFnZShleHBlY3RlZCk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIExhYmVsIGRpZG4ndCByZWNlaXZlIHRoZSBJbWFnZSIsCi0JCQkJZXhwZWN0ZWQsCi0JCQkJbGFiZWwuZ2V0SW1hZ2UoKQotCQkJKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWV4cGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlRGlzcG9zZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGltYWdlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oKTsKLQkJCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIobGFiZWxlZExhYmVsLCBudWxsLCBpbWFnZUhvbGRlcik7Ci0KLQkJCWxhYmVsLmRpc3Bvc2UoKTsKLQkJCWxhYmVsZWRMYWJlbC5zZXRJbWFnZShleHBlY3RlZCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0KCkgewotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIobGFiZWxlZExhYmVsLCB0ZXh0SG9sZGVyKTsKLQotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQl0ZXh0SG9sZGVyLnNldFZhbHVlKGV4cGVjdGVkKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIExhYmVsIGRpZG4ndCByZWNlaXZlIHRoZSB0ZXh0IiwKLQkJCWV4cGVjdGVkLAotCQkJbGFiZWwuZ2V0VGV4dCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dERpc3Bvc2UoKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcihsYWJlbGVkTGFiZWwsIHRleHRIb2xkZXIpOwotCi0JCWxhYmVsLmRpc3Bvc2UoKTsKLQotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQl0ZXh0SG9sZGVyLnNldFZhbHVlKGV4cGVjdGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWxUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NjIyODQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZExhYmVsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIExhYmVsZWRMYWJlbFRlc3QgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCQlwYXJlbnQgPSBudWxsOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TGFiZWxlZEJ1dHRvbjEoKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQluZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQl9Ci0KLQlAVGVzdChleHBlY3RlZD1Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24uY2xhc3MpCi0JcHVibGljIHZvaWQgdGVzdExhYmVsZWRCdXR0b24yKCkgewotCQluZXcgTGFiZWxlZExhYmVsKG51bGwpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlKCkgewotCi0JCUltYWdlIGV4cGVjdGVkID0gbmV3IEltYWdlKHBhcmVudC5nZXREaXNwbGF5KCksIDE2LCAxNik7Ci0KLQkJdHJ5IHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCQlsYWJlbGVkTGFiZWwuc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBMYWJlbCBkaWRuJ3QgcmVjZWl2ZSB0aGUgSW1hZ2UiLAotCQkJCWV4cGVjdGVkLAotCQkJCWxhYmVsLmdldEltYWdlKCkKLQkJCSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZURpc3Bvc2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJCWxhYmVsLmRpc3Bvc2UoKTsKLQotCQkJLy8gVGhpcyBzaG91bGQgbm90IGZhaWwgYnV0IHNpbXBseSBkbyBub3RoaW5nCi0JCQlsYWJlbGVkTGFiZWwuc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dCgpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQlsYWJlbGVkTGFiZWwuc2V0VGV4dChleHBlY3RlZCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBMYWJlbCBkaWRuJ3QgcmVjZWl2ZSB0aGUgdGV4dCIsCi0JCQlleHBlY3RlZCwKLQkJCWxhYmVsLmdldFRleHQoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldFRleHREaXNwb3NlKCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCWxhYmVsLmRpc3Bvc2UoKTsKLQotCQkvLyBUaGlzIHNob3VsZCBub3QgZmFpbCBidXQgc2ltcGx5IGRvIG5vdGhpbmcKLQkJU3RyaW5nIGV4cGVjdGVkID0gIlRoaXMgaXMgYSB0ZXN0IjsKLQkJbGFiZWxlZExhYmVsLnNldFRleHQoZXhwZWN0ZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVFbmFibGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NjNlMjUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRGlhbG9nUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgUGFuZUVuYWJsZXJUZXN0IHsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFN3aXRjaFN0YXRlKCkgewotCi0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyID0KLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4odHJ1ZSk7Ci0KLQkJRGlhbG9nUGFuZTxOb2RlPiBwYW5lID0gbmV3IERpYWxvZ1BhbmU8Tm9kZT4oCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE5vZGU+KCksCi0JCQlwYXJlbnQpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQl9Ci0JCX07Ci0KLQkJbmV3IFBhbmVFbmFibGVyKGJvb2xlYW5Ib2xkZXIsIHBhbmUpOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIGJlIGVuYWJsZWQiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKG51bGwpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIG5vdCBiZSBlbmFibGVkIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlICh0cnVlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIGJlIGVuYWJsZWQiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKGZhbHNlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgbm90IGJlIGVuYWJsZWQiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBEaXNwb3NlCi0JCXBhbmUuZGlzcG9zZSgpOwotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYxYjRjMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVWaXNpYmlsaXR5RW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIFBhbmVWaXNpYmlsaXR5RW5hYmxlclRlc3QgewotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoU3RhdGUoKSB7Ci0KLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIgPQotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPih0cnVlKTsKLQotCQlEaWFsb2dQYW5lPE5vZGU+IHBhbmUgPSBuZXcgRGlhbG9nUGFuZTxOb2RlPigKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Tm9kZT4oKSwKLQkJCXBhcmVudCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCX0KLQkJfTsKLQotCQluZXcgUGFuZVZpc2liaWxpdHlFbmFibGVyKGJvb2xlYW5Ib2xkZXIsIHBhbmUpOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIGJlIHZpc2libGUiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKG51bGwpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlICh0cnVlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIGJlIHZpc2libGUiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKGZhbHNlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgbm90IGJlIHZpc2libGUiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBEaXNwb3NlCi0JCXBhbmUuZGlzcG9zZSgpOwotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjE5ODEwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGJvb2xlYW4gc3RhdGUgY29udHJvbGxlcnMgKCdlbmFibGVkJyBhbmQgJ3Zpc2libGUnKS4KLSAqIDxwPgotICogTm90ZSB0aGUgYmVoYXZpb3Igb2YgY29tcG9zaXRlczo8dWw+Ci0gKiA8bGk+V2hlbiBhIGNvbXBvc2l0ZSBpcyBkaXNhYmxlZCwgaXRzIGNoaWxkcmVuIGFyZSBkaXNhYmxlZCBidXQgPGVtPm5vdDwvZW0+Ci0gKiAgICAgZ3JheWVkIG91dC4KLSAqIDxsaT5XaGVuIGEgY29tcG9zaXRlIGlzIG1hZGUgaW52aXNpYmxlLCBpdHMgY2hpbGRyZW4gYXJlIGFsc28gbWFkZQotICogICAgIGludmlzaWJsZS4KLSAqIDwvdWw+Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkSG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdmlzaWJsZUhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdFNlbGVjdGlvbkhvbGRlcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlXaW5kb3cgd2luZG93ID0gbmV3IEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMuZW5hYmxlZEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy52aXNpYmxlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLmxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQl0aGlzLmxpc3RTZWxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4obnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiByZXN1bHQgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJ6ZXJvIik7Ci0JCXJlc3VsdC5hZGQoIm9uZSIpOwotCQlyZXN1bHQuYWRkKCJ0d28iKTsKLQkJcmVzdWx0LmFkZCgidGhyZWUiKTsKLQkJcmVzdWx0LmFkZCgiZm91ciIpOwotCQlyZXN1bHQuYWRkKCJmaXZlIik7Ci0JCXJlc3VsdC5hZGQoInNpeCIpOwotCQlyZXN1bHQuYWRkKCJzZXZlbiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg1MDAsIDE1MCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIHdpZGdldFBhbmVsID0gdGhpcy5idWlsZFdpZGdldFBhbmVscyhtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgd2lkZ2V0UGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFdpZGdldFBhbmVscyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zNSk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCi0JCXRoaXMuYnVpbGRXaWRnZXRQYW5lbDEocGFuZWwpOwotCQl0aGlzLmJ1aWxkV2lkZ2V0UGFuZWwyKHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkV2lkZ2V0UGFuZWwxKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGVuYWJsZWRDb21ib0JveENoZWNrQm94ID0gdGhpcy5idWlsZEVuYWJsZWRDb21ib0JveENoZWNrQm94KHBhbmVsKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLmVuYWJsZWRIb2xkZXIsIGVuYWJsZWRDb21ib0JveENoZWNrQm94KTsKLQotCQlCdXR0b24gdmlzaWJsZUNvbWJvQm94Q2hlY2tCb3ggPSB0aGlzLmJ1aWxkVmlzaWJsZUNvbWJvQm94Q2hlY2tCb3gocGFuZWwpOwotCQlTV1RUb29scy5iaW5kKHRoaXMudmlzaWJsZUhvbGRlciwgdmlzaWJsZUNvbWJvQm94Q2hlY2tCb3gpOwotCi0JCUxhYmVsIGNvbWJvQm94TGFiZWwgPSB0aGlzLmJ1aWxkQ29tYm9Cb3hMYWJlbChwYW5lbCk7Ci0JCUNvbWJvIGNvbWJvQm94ID0gdGhpcy5idWlsZENvbWJvQm94KHBhbmVsKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLmxpc3RIb2xkZXIsIHRoaXMubGlzdFNlbGVjdGlvbkhvbGRlciwgY29tYm9Cb3gpOwotCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKHRoaXMuZW5hYmxlZEhvbGRlciwgY29tYm9Cb3hMYWJlbCwgY29tYm9Cb3gpOwotCQlTV1RUb29scy5jb250cm9sVmlzaWJsZVN0YXRlKHRoaXMudmlzaWJsZUhvbGRlciwgY29tYm9Cb3hMYWJlbCwgY29tYm9Cb3gpOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkRW5hYmxlZENvbWJvQm94Q2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENoZWNrQm94KHBhcmVudCwgImVuYWJsZWQiKTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBidWlsZFZpc2libGVDb21ib0JveENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDaGVja0JveChwYXJlbnQsICJ2aXNpYmxlIik7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gYnVpbGRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgTGFiZWwgYnVpbGRDb21ib0JveExhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoImxpc3Q6Iik7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIENvbWJvIGJ1aWxkQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkV2lkZ2V0UGFuZWwyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGNoZWNrQm94MSA9IHRoaXMuYnVpbGRDaGVja0JveChwYW5lbCwgIm9uZSIpOwotCQl0aGlzLmJ1aWxkQ2hlY2tCb3gocGFuZWwsICJ0d28iKTsKLQkJdGhpcy5idWlsZENoZWNrQm94KHBhbmVsLCAidGhyZWUiKTsKLQkJdGhpcy5idWlsZENoZWNrQm94KHBhbmVsLCAiZm91ciIpOwotCi0JCVNXVFRvb2xzLmNvbnRyb2xFbmFibGVkU3RhdGUodGhpcy5lbmFibGVkSG9sZGVyLCBwYW5lbCwgY2hlY2tCb3gxKTsKLQkJU1dUVG9vbHMuY29udHJvbFZpc2libGVTdGF0ZSh0aGlzLnZpc2libGVIb2xkZXIsIHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCB3aWRnZXRQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdpZGdldFBhbmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZENsZWFyRW5hYmxlZE1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyVmlzaWJsZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZE51bGxTZWxlY3Rpb25Nb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGROZXh0QnV0dG9uKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhckVuYWJsZWRNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRDbGVhckVuYWJsZWRNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhckVuYWJsZWRNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIGVuYWJsZWQgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlCb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0LnRoaXMuY2xlYXJFbmFibGVkTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciBlbmFibGVkIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJFbmFibGVkTW9kZWwoKSB7Ci0JCXRoaXMuZW5hYmxlZEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhclZpc2libGVNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRDbGVhclZpc2libGVNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhclZpc2libGVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIHZpc2libGUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlCb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0LnRoaXMuY2xlYXJWaXNpYmxlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciB2aXNpYmxlIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJWaXNpYmxlTW9kZWwoKSB7Ci0JCXRoaXMudmlzaWJsZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROdWxsU2VsZWN0aW9uTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTnVsbFNlbGVjdGlvbk1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZE51bGxTZWxlY3Rpb25Nb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIm51bGwgc2VsZWN0aW9uIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC50aGlzLnNldFNlbGVjdGlvbk1vZGVsTnVsbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIm51bGwgc2VsZWN0aW9uIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgc2V0U2VsZWN0aW9uTW9kZWxOdWxsKCkgewotCQl0aGlzLmxpc3RTZWxlY3Rpb25Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTmV4dEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGROZXh0QUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZE5leHRBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJuZXh0IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC50aGlzLm5leHQoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJuZXh0Iik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgbmV4dCgpIHsKLQkJdGhpcy5saXN0U2VsZWN0aW9uSG9sZGVyLnNldFZhbHVlKHRoaXMuZ2V0TmV4dExpc3RTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmV4dExpc3RTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIuZ2V0KHRoaXMuZ2V0TmV4dExpc3RTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXROZXh0TGlzdFNlbGVjdGlvbkluZGV4KCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldExpc3RTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWluZGV4Kys7Ci0JCXJldHVybiAoaW5kZXggPT0gdGhpcy5saXN0SG9sZGVyLnNpemUoKSkgPyAwIDogaW5kZXg7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0TGlzdFNlbGVjdGlvbkluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmluZGV4T2YodGhpcy5nZXRMaXN0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldExpc3RTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RTZWxlY3Rpb25Ib2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9DaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0NoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjIzMmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0NoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgY2hlY2sgYm94ZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0Ci0JZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgZmluYWwgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZmxhZzFIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMkhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IG5vdEZsYWcySG9sZGVyOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIENoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwodHJ1ZSwgdHJ1ZSk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5mbGFnMUhvbGRlciA9IHRoaXMuYnVpbGRGbGFnMUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuZmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLm5vdEZsYWcySG9sZGVyID0gdGhpcy5idWlsZE5vdEZsYWcySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRmxhZzFIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5GTEFHMV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0ZsYWcxKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRGbGFnMSh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuRkxBRzJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMigpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzIodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb3RGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLk5PVF9GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc05vdEZsYWcyKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROb3RGbGFnMih2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCXBhcmVudC5zZXRTaXplKDQwMCwgMTAwKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgY2hlY2tCb3hQYW5lbCA9IHRoaXMuYnVpbGRDaGVja0JveFBhbmVsKG1haW5QYW5lbCk7Ci0JCXRoaXMuYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsLCBjaGVja0JveFBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRDaGVja0JveFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTM1KTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRGbGFnMUNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZEZsYWcyQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkTm90RmxhZzJDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3gocGFuZWwpOwotCi0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRGbGFnMUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQoImZsYWcgMSIpOwotCQlTV1RUb29scy5iaW5kKHRoaXMuZmxhZzFIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRGbGFnMkNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQoImZsYWcgMiIpOwotCQlTV1RUb29scy5iaW5kKHRoaXMuZmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROb3RGbGFnMkNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQoIm5vdCBmbGFnIDIiKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLm5vdEZsYWcySG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5hdHRhY2hlZENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQoInVuYXR0YWNoZWQiKTsKLQkJY2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZFVuYXR0YWNoZWRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVW5hdHRhY2hlZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYXR0YWNoZWQgZGVmYXVsdCBzZWxlY3RlZDogIiArIGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hdHRhY2hlZCBzZWxlY3RlZDogIiArIGUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIGNoZWNrQm94UGFuZWwpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjaGVja0JveFBhbmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZEZsaXBGbGFnMUJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGROb3RGbGFnMlRvZ2dsZUJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDbGVhck1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRGbGlwRmxhZzFCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkRmxpcEZsYWcxQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEZsaXBGbGFnMUFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImZsaXAgZmxhZyAxIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5mbGlwRmxhZzEoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJmbGlwIGZsYWcgMSIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIGZsaXBGbGFnMSgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0RmxhZzEoICEgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROb3RGbGFnMlRvZ2dsZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBjaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuVE9HR0xFKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgibm90IGZsYWcgMiIpOwotCQlTV1RUb29scy5iaW5kKHRoaXMubm90RmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhck1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlc3RvcmVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlc3RvcmUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc3RvcmUgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcmludE1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUHJpbnRNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInByaW50IG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicHJpbnQgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImZsYWcgMTogIiArIHRoaXMudGVzdE1vZGVsLmlzRmxhZzEoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNOb3RGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioiKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgYm9vbGVhbiBmbGFnMTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUcxX1BST1BFUlRZID0gImZsYWcxIjsKLQkJcHJpdmF0ZSBib29sZWFuIGZsYWcyOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzJfUFJPUEVSVFkgPSAiZmxhZzIiOwotCQlwcml2YXRlIGJvb2xlYW4gbm90RmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRkxBRzJfUFJPUEVSVFkgPSAibm90RmxhZzIiOwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKGJvb2xlYW4gZmxhZzEsIGJvb2xlYW4gZmxhZzIpIHsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzEoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMShib29sZWFuIGZsYWcxKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzE7Ci0JCQl0aGlzLmZsYWcxID0gZmxhZzE7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzFfUFJPUEVSVFksIG9sZCwgZmxhZzEpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMihib29sZWFuIGZsYWcyKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzI7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzJfUFJPUEVSVFksIG9sZCwgZmxhZzIpOwotCQotCQkJb2xkID0gdGhpcy5ub3RGbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PVF9GTEFHMl9QUk9QRVJUWSwgb2xkLCB0aGlzLm5vdEZsYWcyKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc05vdEZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMubm90RmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Tm90RmxhZzIoYm9vbGVhbiBub3RGbGFnMikgewotCQkJdGhpcy5zZXRGbGFnMiggISBub3RGbGFnMik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5pc0ZsYWcxKCkgKyAiIC0gIiArIHRoaXMuaXNGbGFnMigpICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NDk5YzIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0Ryb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgcmVhZC1vbmx5IGNvbWJvLWJveGVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JZmluYWwgVGFza0xpc3QgdGFza0xpc3Q7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4gdGFza0xpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBUZXh0IHRhc2tUZXh0RmllbGQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIERyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy50YXNrTGlzdCA9IG5ldyBUYXNrTGlzdCgpOwotCQl0aGlzLnRhc2tMaXN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4odGhpcy50YXNrTGlzdCk7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygic3dpbSIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2soImJpa2UiKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJydW4iKTsKLQkJVGFzayByZXN0ID0gdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJyZXN0Iik7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygicmVwZWF0Iik7Ci0JCXRoaXMudGFza0xpc3Quc2V0UHJpb3JpdHlUYXNrKHJlc3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg4MDAsIDMwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIHRhc2tMaXN0UGFuZWwgPSB0aGlzLmJ1aWxkVGFza0xpc3RQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgdGFza0xpc3RQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkVGFza0xpc3RQYW5lbF8ocGFuZWwpOyAgLy8gZmFsc2UgPSBuYXRpdmUgKENvbWJvKQotCi0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRUYXNrTGlzdFBhbmVsXyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdFBhbmVsKHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRPYmplY3RUYXNrTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDUwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFVuc29ydGVkT2JqZWN0TGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJpbmcgbGFiZWwgPSAicHJpbWl0aXZlIHVuc29ydGVkIjsKLQkJdGhpcy5idWlsZENvbWJvQm94UGFuZWwocGFyZW50LCBsYWJlbCwgdGhpcy5idWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tOYW1lQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICJwcmltaXRpdmUgc29ydGVkIjsKLQkJdGhpcy5idWlsZENvbWJvQm94UGFuZWwocGFyZW50LCBsYWJlbCwgdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tOYW1lQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJpbmcgbGFiZWwgPSAicHJpbWl0aXZlIHJldmVyc2Ugc29ydGVkIjsKLQkJdGhpcy5idWlsZENvbWJvQm94UGFuZWwocGFyZW50LCBsYWJlbCwgdGhpcy5idWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrTmFtZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJpbmcgbGFiZWwgPSAib2JqZWN0IHVuc29ydGVkIjsKLQkJdGhpcy5idWlsZENvbWJvQm94UGFuZWwocGFyZW50LCBsYWJlbCwgdGhpcy5idWlsZFVuc29ydGVkT2JqZWN0TGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGxhYmVsID0gIm9iamVjdCBzb3J0ZWQiOwotCQl0aGlzLmJ1aWxkQ29tYm9Cb3hQYW5lbChwYXJlbnQsIGxhYmVsLCB0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0FkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGxhYmVsID0gIm9iamVjdCByZXZlcnNlIHNvcnRlZCI7Ci0JCXRoaXMuYnVpbGRDb21ib0JveFBhbmVsKHBhcmVudCwgbGFiZWwsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0FkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpLCB0aGlzLmJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxUYXNrPih0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFRhc2s+KHRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVRhc2tDb21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgPEU+IHZvaWQgYnVpbGRDb21ib0JveFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgTGlzdFZhbHVlTW9kZWw8RT4gbW9kZWwsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbU1vZGVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQotCQlMYWJlbCBjb21ib0JveExhYmVsID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTEVGVCB8IFNXVC5WRVJUSUNBTCk7Ci0JCWNvbWJvQm94TGFiZWwuc2V0VGV4dChsYWJlbCk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMyk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMjApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCWNvbWJvQm94TGFiZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJQ29tYm8gY29tYm9Cb3ggPSB0aGlzLmJ1aWxkQ29tYm9Cb3gocGFuZWwpOwotCQlmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbWJvQm94TGFiZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJY29tYm9Cb3guc2V0TGF5b3V0RGF0YShmZCk7Ci0JCVNXVFRvb2xzLmJpbmQobW9kZWwsIHNlbGVjdGVkSXRlbU1vZGVsLCBjb21ib0JveCk7ICAvLyB1c2UgI3RvU3RyaW5nKCkKLQl9Ci0KLQlwcml2YXRlIENvbWJvIGJ1aWxkQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gYnVpbGRDdXN0b21TdHJpbmdDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQkJCXJldHVybiBzMi5jb21wYXJlVG8oczEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxUYXNrPiBidWlsZEN1c3RvbVRhc2tDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8VGFzaz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVGFzayB0bzEsIFRhc2sgdG8yKSB7Ci0JCQkJcmV0dXJuIHRvMi5jb21wYXJlVG8odG8xKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFN0cmluZz4odGhpcy50YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuVEFTS19OQU1FU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudGFza05hbWVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgVGFzaz4odGhpcy50YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuVEFTS1NfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFRhc2s+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YXNrcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFzaz4gYnVpbGRQcmlvcml0eVRhc2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByaW9yaXR5VGFza0FkYXB0ZXIodGhpcy50YXNrTGlzdEhvbGRlcik7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByaW9yaXR5VGFza0FkYXB0ZXIKLQkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFRhc2s+Ci0JewotCQlQcmlvcml0eVRhc2tBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0PiB0YXNrTGlzdEhvbGRlcikgewotCQkJc3VwZXIodGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlBSSU9SSVRZX1RBU0tfUFJPUEVSVFkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgVGFzayBidWlsZFZhbHVlXygpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UHJpb3JpdHlUYXNrKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhUYXNrIHZhbHVlKSB7Ci0JCQl0aGlzLnN1YmplY3Quc2V0UHJpb3JpdHlUYXNrKHZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFByaW9yaXR5VGFza05hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByaW9yaXR5VGFza05hbWVBZGFwdGVyKHRoaXMudGFza0xpc3RIb2xkZXIpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBQcmlvcml0eVRhc2tOYW1lQWRhcHRlcgotCQlleHRlbmRzIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgU3RyaW5nPgotCXsKLQkJUHJpb3JpdHlUYXNrTmFtZUFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+IHRhc2tMaXN0SG9sZGVyKSB7Ci0JCQlzdXBlcih0YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuUFJJT1JJVFlfVEFTS19OQU1FX1BST1BFUlRZKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UHJpb3JpdHlUYXNrTmFtZSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIHRhc2tMaXN0UGFuZWwpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0YXNrTGlzdFBhbmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCBtaXNjID0gdGhpcy5idWlsZE1pc2NUYXNrUGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQWRkUmVtb3ZlVGFza1BhbmVsKHBhbmVsLCBtaXNjKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRNaXNjVGFza1BhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC00MDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkQ2xlYXJMaXN0QUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDbGVhck1vZGVsQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZENoYW5nZVByaW9yaXR5VGFza0FDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJQcmlvcml0eVRhc2tBQ0koKS5maWxsKHBhbmVsKTsKLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTGlzdEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIGxpc3QiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhclRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgYWxsIHRoZSB0YXNrcyIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgdGhlIHRhc2sgbGlzdCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzdG9yZSB0aGUgdGFzayBsaXN0IG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENoYW5nZVByaW9yaXR5VGFza0FDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNoYW5nZSBwcmlvcml0eSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNoYW5nZVByaW9yaXR5VGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNoYW5nZSB0aGUgcHJpb3JpdHkgdGFzayIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhclByaW9yaXR5VGFza0FDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIHByaW9yaXR5IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJQcmlvcml0eVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciB0aGUgcHJpb3JpdHkgdGFzayIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBjbGVhckJ1dHRvbikgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2xlYXJCdXR0b24pOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgYWRkQnV0dG9uID0gdGhpcy5idWlsZEFkZEJ1dHRvbihwYW5lbCk7Ci0JCUNvbnRyb2wgcmVtb3ZlQnV0dG9uID0gdGhpcy5idWlsZFJlbW92ZUJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRUYXNrVGV4dEZpZWxkKHBhbmVsLCBhZGRCdXR0b24sIHJlbW92ZUJ1dHRvbik7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkQWRkQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkQWRkQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGRBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJhZGQiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5hZGRUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiYWRkIGEgdGFzayB3aXRoIHRoZSBuYW1lIGluIHRoZSBlbnRyeSBmaWVsZCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRSZW1vdmVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFJlbW92ZUFDSSgpLmZpbGwocGFuZWwpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVtb3ZlQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVtb3ZlIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVtb3ZlVGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlbW92ZSB0aGUgdGFzayB3aXRoIHRoZSBuYW1lIGluIHRoZSBlbnRyeSBmaWVsZCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRUYXNrVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgYWRkQnV0dG9uLCBDb250cm9sIHJlbW92ZUJ1dHRvbikgewotCQl0aGlzLnRhc2tUZXh0RmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChhZGRCdXR0b24pOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmVtb3ZlQnV0dG9uKTsKLQkJdGhpcy50YXNrVGV4dEZpZWxkLnNldExheW91dERhdGEoZmQpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHRhc2tUZXh0RmllbGRUZXh0KCkgewotCQlyZXR1cm4gdGhpcy50YXNrVGV4dEZpZWxkLmdldFRleHQoKTsKLQl9Ci0KLQl2b2lkIGFkZFRhc2soKSB7Ci0JCVN0cmluZyB0YXNrVGV4dCA9IHRoaXMudGFza1RleHRGaWVsZFRleHQoKTsKLQkJaWYgKHRhc2tUZXh0Lmxlbmd0aCgpICE9IDApIHsKLQkJCXRoaXMudGFza0xpc3QuYWRkVGFzayh0YXNrVGV4dCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVRhc2soKSB7Ci0JCVN0cmluZyB0YXNrID0gdGhpcy50YXNrVGV4dEZpZWxkVGV4dCgpOwotCQlpZiAodGFzay5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LnJlbW92ZVRhc2sodGFzayk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNsZWFyVGFza3MoKSB7Ci0JCXRoaXMudGFza0xpc3QuY2xlYXJUYXNrcygpOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50YXNrTGlzdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50YXNrTGlzdEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRhc2tMaXN0KTsKLQl9Ci0KLQl2b2lkIGNoYW5nZVByaW9yaXR5VGFzaygpIHsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKFRhc2sgdGFzayA6IHRoaXMudGFza0xpc3QuZ2V0VGFza3MoKSkgewotCQkJaWYgKHRoaXMudGFza0xpc3QuZ2V0UHJpb3JpdHlUYXNrKCkgPT0gdGFzaykgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZvdW5kKSB7Ci0JCQkJCXRoaXMudGFza0xpc3Quc2V0UHJpb3JpdHlUYXNrKHRhc2spOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUl0ZXJhdG9yPFRhc2s+IHRhc2tzID0gdGhpcy50YXNrTGlzdC50YXNrcygpOwotCQlpZiAodGFza3MuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LnNldFByaW9yaXR5VGFzayh0YXNrcy5uZXh0KCkpOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclByaW9yaXR5VGFzaygpIHsKLQkJdGhpcy50YXNrTGlzdC5zZXRQcmlvcml0eVRhc2sobnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2tMaXN0ICoqKioqKioqKioKLQotCS8vIG5vdGUgYWJzZW5jZSBvZiB2YWxpZGF0aW9uLi4uCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrTGlzdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiB0YXNrTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTkFNRVNfTElTVCA9ICJ0YXNrTmFtZXMiOwotCQlwcml2YXRlIGZpbmFsIExpc3Q8VGFzaz4gdGFza3MgPSBuZXcgQXJyYXlMaXN0PFRhc2s+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLU19MSVNUID0gInRhc2tzIjsKLQkJcHJpdmF0ZSBTdHJpbmcgcHJpb3JpdHlUYXNrTmFtZSA9IG51bGw7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklPUklUWV9UQVNLX05BTUVfUFJPUEVSVFkgPSAicHJpb3JpdHlUYXNrTmFtZSI7Ci0JCXByaXZhdGUgVGFzayBwcmlvcml0eVRhc2sgPSBudWxsOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVEFTS19QUk9QRVJUWSA9ICJwcmlvcml0eVRhc2siOwotCQlwdWJsaWMgVGFza0xpc3QoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YXNrTmFtZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrTmFtZXMubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQkJcHVibGljIEl0ZXJhYmxlPFRhc2s+IGdldFRhc2tzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza3M7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxUYXNrPiB0YXNrcygpIHsKLQkJCXJldHVybiB0aGlzLnRhc2tzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJpb3JpdHlUYXNrTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLnByaW9yaXR5VGFza05hbWU7Ci0JCX0KLQkJcHVibGljIFRhc2sgZ2V0UHJpb3JpdHlUYXNrKCkgewotCQkJcmV0dXJuIHRoaXMucHJpb3JpdHlUYXNrOwotCQl9Ci0JCXB1YmxpYyBUYXNrIGFkZFRhc2soU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3QodGFza05hbWUsIHRoaXMudGFza05hbWVzLCBUQVNLX05BTUVTX0xJU1QpOwotCQkJVGFzayB0YXNrID0gbmV3IFRhc2sodGFza05hbWUpOwotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHRhc2ssIHRoaXMudGFza3MsIFRBU0tTX0xJU1QpOwotCQkJcmV0dXJuIHRhc2s7Ci0JCX0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVUYXNrKFN0cmluZyB0YXNrTmFtZSkgewotCQkJaW50IGluZGV4ID0gdGhpcy50YXNrTmFtZXMuaW5kZXhPZih0YXNrTmFtZSk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlUYXNrIHRhc2sgPSB0aGlzLnRhc2tzLmdldChpbmRleCk7Ci0JCQkJaWYgKHRhc2sgPT0gdGhpcy5wcmlvcml0eVRhc2spIHsKLQkJCQkJdGhpcy5zZXRQcmlvcml0eVRhc2sobnVsbCk7Ci0JCQkJfQotCQkJCS8vIGFzc3VtZSB0aGUgaW5kZXhlcyBtYXRjaC4uLgotCQkJCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLnRhc2tOYW1lcywgVEFTS19OQU1FU19MSVNUKTsKLQkJCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy50YXNrcywgVEFTS1NfTElTVCk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJUYXNrcygpIHsKLQkJCXRoaXMuc2V0UHJpb3JpdHlUYXNrKG51bGwpOwotCQkJdGhpcy5jbGVhckxpc3QodGhpcy50YXNrTmFtZXMsIFRBU0tfTkFNRVNfTElTVCk7Ci0JCQl0aGlzLmNsZWFyTGlzdCh0aGlzLnRhc2tzLCBUQVNLU19MSVNUKTsKLQkJfQotCQlwcml2YXRlIHZvaWQgc2V0UHJpb3JpdHlUYXNrTmFtZShTdHJpbmcgcHJpb3JpdHlUYXNrTmFtZSkgewotCQkJU3RyaW5nIG9sZCA9IHRoaXMucHJpb3JpdHlUYXNrTmFtZTsKLQkJCXRoaXMucHJpb3JpdHlUYXNrTmFtZSA9IHByaW9yaXR5VGFza05hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJJT1JJVFlfVEFTS19OQU1FX1BST1BFUlRZLCBvbGQsIHByaW9yaXR5VGFza05hbWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFByaW9yaXR5VGFzayhUYXNrIHByaW9yaXR5VGFzaykgewotCQkJVGFzayBvbGQgPSB0aGlzLnByaW9yaXR5VGFzazsKLQkJCXRoaXMucHJpb3JpdHlUYXNrID0gcHJpb3JpdHlUYXNrOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBSSU9SSVRZX1RBU0tfUFJPUEVSVFksIG9sZCwgcHJpb3JpdHlUYXNrKTsKLQkJCXRoaXMuc2V0UHJpb3JpdHlUYXNrTmFtZSgocHJpb3JpdHlUYXNrID09IG51bGwpID8gbnVsbCA6IHByaW9yaXR5VGFzay5nZXROYW1lKCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2sgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBpbnQgaW5zdGFuY2VDb3VudDsKLQkJcHJpdmF0ZSBzdGF0aWMgaW50IElOU1RBTkNFX0NPVU5UID0gMTsKLQkJcHVibGljIFRhc2soU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmluc3RhbmNlQ291bnQgPSBJTlNUQU5DRV9DT1VOVCsrOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWUgKyAiOiAiICsgdGhpcy5pbnN0YW5jZUNvdW50OwotCQl9Ci0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKERpc3BsYXlhYmxlIG8pIHsKLQkJCXJldHVybiBERUZBVUxUX0NPTVBBUkFUT1IuY29tcGFyZSh0aGlzLCBvKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMuZGlzcGxheVN0cmluZygpOwotCQl9Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBEaXNwbGF5YWJsZSBleHRlbmRzIE1vZGVsLCBDb21wYXJhYmxlPERpc3BsYXlhYmxlPiB7Ci0JCi0JCVN0cmluZyBkaXNwbGF5U3RyaW5nKCk7Ci0JCQlTdHJpbmcgRElTUExBWV9TVFJJTkdfUFJPUEVSVFkgPSAiZGlzcGxheVN0cmluZyI7Ci0JCi0JCi0JCS8vICoqKioqKioqKiogaGVscGVyIGltcGxlbWVudGF0aW9ucyAqKioqKioqKioqCi0JCi0JCUNvbGxhdG9yIERFRkFVTFRfQ09MTEFUT1IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQotCQlDb21wYXJhdG9yPERpc3BsYXlhYmxlPiBERUZBVUxUX0NPTVBBUkFUT1IgPQotCQkJbmV3IENvbXBhcmF0b3I8RGlzcGxheWFibGU+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShEaXNwbGF5YWJsZSBkMSwgRGlzcGxheWFibGUgZDIpIHsKLQkJCQkJLy8gZGlzYWxsb3cgZHVwbGljYXRlcyBiYXNlZCBvbiBvYmplY3QgaWRlbnRpdHkKLQkJCQkJaWYgKGQxID09IGQyKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQotCQkJCQkvLyBmaXJzdCBjb21wYXJlIGRpc3BsYXkgc3RyaW5ncyB1c2luZyB0aGUgZGVmYXVsdCBjb2xsYXRvcgotCQkJCQlpbnQgcmVzdWx0ID0gREVGQVVMVF9DT0xMQVRPUi5jb21wYXJlKGQxLmRpc3BsYXlTdHJpbmcoKSwgZDIuZGlzcGxheVN0cmluZygpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCi0JCQkJCS8vIHRoZW4gY29tcGFyZSB1c2luZyBvYmplY3QtaWQKLQkJCQkJcmVzdWx0ID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDEpIC0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDIpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gSXQncyB1bmxpa2VseSB0aGF0IHdlIGdldCB0byB0aGlzIHBvaW50OyBidXQsIGp1c3QgaW4gY2FzZSwgd2Ugd2lsbCByZXR1cm4gLTEuCi0JCQkJCS8vIFVuZm9ydHVuYXRlbHksIHRoaXMgaW50cm9kdWNlcyBzb21lIG1pbGQgdW5wcmVkaWN0YWJpbGl0eSB0byB0aGUgc29ydCBvcmRlcgotCQkJCQkvLyAodW5sZXNzIHRoZSBvYmplY3RzIGFyZSBhbHdheXMgcGFzc2VkIGludG8gdGhpcyBtZXRob2QgaW4gdGhlIHNhbWUgb3JkZXIpLgotCQkJCQlyZXR1cm4gLTE7CQkvLyBpZiBhbGwgZWxzZSBmYWlscywgaW5kaWNhdGUgdGhhdCBvMSA8IG8yCi0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGlzcGxheWFibGUuREVGQVVMVF9DT01QQVJBVE9SIjsKLQkJCQl9Ci0JCQl9OwotCQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjE5YmViLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGxpc3QgYm94ZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JZmluYWwgVGFza0xpc3QgdGFza0xpc3Q7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4gdGFza0xpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBUZXh0IHRhc2tUZXh0RmllbGQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnRhc2tMaXN0ID0gbmV3IFRhc2tMaXN0KCk7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0Pih0aGlzLnRhc2tMaXN0KTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJzd2ltIik7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygiYmlrZSIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJ1biIpOwotCQlUYXNrIHJlc3QgPSB0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJlc3QiKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRQcmlvcml0eVRhc2socmVzdCk7Ci0JCVRhc2sgcmVwZWF0ID0gdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJyZXBlYXQiKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRQcmlvcml0eVRhc2socmVwZWF0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJcGFyZW50LnNldFNpemUoODAwLCA0MDApOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCB0YXNrTGlzdFBhbmVsID0gdGhpcy5idWlsZFRhc2tMaXN0UGFuZWwobWFpblBhbmVsKTsKLQkJdGhpcy5idWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwsIHRhc2tMaXN0UGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRhc2tMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMzApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJdGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RQYW5lbChwYW5lbCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkT2JqZWN0VGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRVbnNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0UGFuZWwocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJwcmltaXRpdmUgdW5zb3J0ZWQiLCB0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgInByaW1pdGl2ZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJwcmltaXRpdmUgcmV2ZXJzZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCksIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuc29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJvYmplY3QgdW5zb3J0ZWQiLCB0aGlzLmJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJvYmplY3Qgc29ydGVkIiwgdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgIm9iamVjdCByZXZlcnNlIHNvcnRlZCIsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZFVuc29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8VGFzaz4odGhpcy5idWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxUYXNrPih0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCksIHRoaXMuYnVpbGRDdXN0b21UYXNrQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIDxFPiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0IGJ1aWxkTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgTGlzdFZhbHVlTW9kZWw8RT4gbW9kZWwsIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc01vZGVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQotCQlMYWJlbCBsaXN0TGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5MRUZUIHwgU1dULlZFUlRJQ0FMKTsKLQkJbGlzdExhYmVsLnNldFRleHQobGFiZWwpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDMpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDIwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlsaXN0TGFiZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCBsaXN0Qm94ID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QocGFuZWwsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCQlmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGxpc3RMYWJlbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlsaXN0Qm94LnNldExheW91dERhdGEoZmQpOwotCQlTV1RUb29scy5iaW5kKG1vZGVsLCBzZWxlY3RlZEl0ZW1zTW9kZWwsIGxpc3RCb3gpOyAgLy8gdXNlICN0b1N0cmluZygpCi0JCXJldHVybiBsaXN0Qm94OwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJCQlyZXR1cm4gczIuY29tcGFyZVRvKHMxKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8VGFzaz4gYnVpbGRDdXN0b21UYXNrQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFRhc2s+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFRhc2sgdG8xLCBUYXNrIHRvMikgewotCQkJCXJldHVybiB0bzIuY29tcGFyZVRvKHRvMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBTdHJpbmc+KHRoaXMudGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlRBU0tfTkFNRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnRhc2tOYW1lcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFRhc2s+KHRoaXMudGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlRBU0tTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxUYXNrPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudGFza3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8VGFzaz4gYnVpbGRQcmlvcml0eVRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcmlvcml0eVRhc2tMaXN0QWRhcHRlcih0aGlzLnRhc2tMaXN0SG9sZGVyKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJpb3JpdHlUYXNrTGlzdEFkYXB0ZXIKLQkJZXh0ZW5kcyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgVGFzaz4KLQkJaW1wbGVtZW50cyBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRhc2s+Ci0JewotCQlQcmlvcml0eVRhc2tMaXN0QWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4gdGFza0xpc3RIb2xkZXIpIHsKLQkJCXN1cGVyKHRhc2tMaXN0SG9sZGVyLCBUYXNrTGlzdC5QUklPUklUWV9UQVNLU19DT0xMRUNUSU9OKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFRhc2s+IGl0ZXJhdG9yXygpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QucHJpb3JpdHlUYXNrcygpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFZhbHVlcyhJdGVyYWJsZTxUYXNrPiB2YWx1ZXMpIHsKLQkJCXRoaXMuc3ViamVjdC5zZXRQcmlvcml0eVRhc2tzKHZhbHVlcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCB0YXNrTGlzdFBhbmVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGFza0xpc3RQYW5lbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgbWlzYyA9IHRoaXMuYnVpbGRNaXNjVGFza1BhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEFkZFJlbW92ZVRhc2tQYW5lbChwYW5lbCwgbWlzYyk7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkTWlzY1Rhc2tQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNDAwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZENsZWFyTGlzdEFDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRBZGRQcmlvcml0eVRhc2tBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlbW92ZVByaW9yaXR5VGFza0FDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJQcmlvcml0eVRhc2tzQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhckxpc3RBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBsaXN0IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNsZWFyVGFza3MoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciBhbGwgdGhlIHRhc2tzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgdGhlIHRhc2sgbGlzdCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc3RvcmUgdGhlIHRhc2sgbGlzdCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGRQcmlvcml0eVRhc2tBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJhZGQgcHJpb3JpdHkiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuYWRkUHJpb3JpdHlUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiYWRkIGEgdGFzayB0byB0aGUgcHJpb3JpdHkgdGFza3MiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVtb3ZlUHJpb3JpdHlUYXNrQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVtb3ZlIHByaW9yaXR5IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlbW92ZVByaW9yaXR5VGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlbW92ZSBhIHRhc2sgZnJvbSB0aGUgcHJpb3JpdHkgdGFza3MiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJQcmlvcml0eVRhc2tzQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgcHJpb3JpdHkiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJQcmlvcml0eVRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgdGhlIHByaW9yaXR5IHRhc2tzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEFkZFJlbW92ZVRhc2tQYW5lbChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIGNsZWFyQnV0dG9uKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChjbGVhckJ1dHRvbik7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCBhZGRCdXR0b24gPSB0aGlzLmJ1aWxkQWRkQnV0dG9uKHBhbmVsKTsKLQkJQ29udHJvbCByZW1vdmVCdXR0b24gPSB0aGlzLmJ1aWxkUmVtb3ZlQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFRhc2tUZXh0RmllbGQocGFuZWwsIGFkZEJ1dHRvbiwgcmVtb3ZlQnV0dG9uKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRBZGRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNTApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRBZGRBQ0koKS5maWxsKHBhbmVsKTsKLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEFkZEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImFkZCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5hZGRUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiYWRkIGEgdGFzayB3aXRoIHRoZSBuYW1lIGluIHRoZSBlbnRyeSBmaWVsZCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRSZW1vdmVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFJlbW92ZUFDSSgpLmZpbGwocGFuZWwpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVtb3ZlQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVtb3ZlIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlbW92ZVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZW1vdmUgdGhlIHRhc2sgd2l0aCB0aGUgbmFtZSBpbiB0aGUgZW50cnkgZmllbGQiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVGFza1RleHRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIGFkZEJ1dHRvbiwgQ29udHJvbCByZW1vdmVCdXR0b24pIHsKLQkJdGhpcy50YXNrVGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHJlbW92ZUJ1dHRvbik7Ci0JCXRoaXMudGFza1RleHRGaWVsZC5zZXRMYXlvdXREYXRhKGZkKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyB0YXNrVGV4dEZpZWxkVGV4dCgpIHsKLQkJcmV0dXJuIHRoaXMudGFza1RleHRGaWVsZC5nZXRUZXh0KCk7Ci0JfQotCi0Jdm9pZCBhZGRUYXNrKCkgewotCQlTdHJpbmcgdGFza1RleHQgPSB0aGlzLnRhc2tUZXh0RmllbGRUZXh0KCk7Ci0JCWlmICh0YXNrVGV4dC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2sodGFza1RleHQpOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVUYXNrKCkgewotCQlTdHJpbmcgdGFzayA9IHRoaXMudGFza1RleHRGaWVsZFRleHQoKTsKLQkJaWYgKHRhc2subGVuZ3RoKCkgIT0gMCkgewotCQkJdGhpcy50YXNrTGlzdC5yZW1vdmVUYXNrKHRhc2spOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclRhc2tzKCkgewotCQl0aGlzLnRhc2tMaXN0LmNsZWFyVGFza3MoKTsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIuc2V0VmFsdWUodGhpcy50YXNrTGlzdCk7Ci0JfQotCi0Jdm9pZCBhZGRQcmlvcml0eVRhc2soKSB7Ci0JCUl0ZXJhdG9yPFRhc2s+IHRhc2tzID0gdGhpcy50YXNrTGlzdC50YXNrcygpOwotCQl3aGlsZSAodGFza3MuaGFzTmV4dCgpKSB7Ci0JCQlpZiAodGhpcy50YXNrTGlzdC5hZGRQcmlvcml0eVRhc2sodGFza3MubmV4dCgpKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlUHJpb3JpdHlUYXNrKCkgewotCQlJdGVyYXRvcjxUYXNrPiBwVGFza3MgPSB0aGlzLnRhc2tMaXN0LnByaW9yaXR5VGFza3MoKTsKLQkJaWYgKHBUYXNrcy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMudGFza0xpc3QucmVtb3ZlUHJpb3JpdHlUYXNrKHBUYXNrcy5uZXh0KCkpOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclByaW9yaXR5VGFza3MoKSB7Ci0JCXRoaXMudGFza0xpc3QuY2xlYXJQcmlvcml0eVRhc2tzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2tMaXN0ICoqKioqKioqKioKLQotCS8vIG5vdGUgYWJzZW5jZSBvZiB2YWxpZGF0aW9uLi4uCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrTGlzdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiB0YXNrTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTkFNRVNfTElTVCA9ICJ0YXNrTmFtZXMiOwotCQlwcml2YXRlIGZpbmFsIExpc3Q8VGFzaz4gdGFza3MgPSBuZXcgQXJyYXlMaXN0PFRhc2s+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLU19MSVNUID0gInRhc2tzIjsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFRhc2s+IHByaW9yaXR5VGFza3MgPSBuZXcgSGFzaFNldDxUYXNrPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTiA9ICJwcmlvcml0eVRhc2tzIjsKLQkJcHVibGljIFRhc2tMaXN0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFza05hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza05hbWVzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8VGFzaz4gdGFza3MoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrcy5saXN0SXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8VGFzaz4gcHJpb3JpdHlUYXNrcygpIHsKLQkJCXJldHVybiB0aGlzLnByaW9yaXR5VGFza3MuaXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgVGFzayBhZGRUYXNrKFN0cmluZyB0YXNrTmFtZSkgewotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHRhc2tOYW1lLCB0aGlzLnRhc2tOYW1lcywgVEFTS19OQU1FU19MSVNUKTsKLQkJCVRhc2sgdGFzayA9IG5ldyBUYXNrKHRhc2tOYW1lKTsKLQkJCXRoaXMuYWRkSXRlbVRvTGlzdCh0YXNrLCB0aGlzLnRhc2tzLCBUQVNLU19MSVNUKTsKLQkJCXJldHVybiB0YXNrOwotCQl9CQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlVGFzayhTdHJpbmcgdGFza05hbWUpIHsKLQkJCWludCBpbmRleCA9IHRoaXMudGFza05hbWVzLmluZGV4T2YodGFza05hbWUpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMudGFza05hbWVzLCBUQVNLX05BTUVTX0xJU1QpOwotCQkJCS8vIGFzc3VtZSB0aGUgaW5kZXhlcyBtYXRjaC4uLgotCQkJCVRhc2sgcmVtb3ZlZFRhc2sgPSB0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy50YXNrcywgVEFTS1NfTElTVCk7Ci0JCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24ocmVtb3ZlZFRhc2ssIHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJUYXNrcygpIHsKLQkJCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCQl0aGlzLmNsZWFyTGlzdCh0aGlzLnRhc2tOYW1lcywgVEFTS19OQU1FU19MSVNUKTsKLQkJCXRoaXMuY2xlYXJMaXN0KHRoaXMudGFza3MsIFRBU0tTX0xJU1QpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGFkZFByaW9yaXR5VGFzayhUYXNrIHRhc2spIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24odGFzaywgdGhpcy5wcmlvcml0eVRhc2tzLCBQUklPUklUWV9UQVNLU19DT0xMRUNUSU9OKTsKLQkJfQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVByaW9yaXR5VGFzayhUYXNrIHRhc2spIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHRhc2ssIHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJQcmlvcml0eVRhc2tzKCkgewotCQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5wcmlvcml0eVRhc2tzLCBQUklPUklUWV9UQVNLU19DT0xMRUNUSU9OKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRQcmlvcml0eVRhc2tzKEl0ZXJhYmxlPFRhc2s+IHRhc2tzKSB7Ci0JCQl0aGlzLnByaW9yaXR5VGFza3MuY2xlYXIoKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5wcmlvcml0eVRhc2tzLCB0YXNrcyk7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChQUklPUklUWV9UQVNLU19DT0xMRUNUSU9OLCB0aGlzLnByaW9yaXR5VGFza3MpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2sgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBpbnQgaW5zdGFuY2VDb3VudDsKLQkJcHJpdmF0ZSBzdGF0aWMgaW50IElOU1RBTkNFX0NPVU5UID0gMTsKLQkJcHVibGljIFRhc2soU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmluc3RhbmNlQ291bnQgPSBJTlNUQU5DRV9DT1VOVCsrOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWUgKyAiOiAiICsgdGhpcy5pbnN0YW5jZUNvdW50OwotCQl9Ci0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKERpc3BsYXlhYmxlIG8pIHsKLQkJCXJldHVybiBERUZBVUxUX0NPTVBBUkFUT1IuY29tcGFyZSh0aGlzLCBvKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMuZGlzcGxheVN0cmluZygpOwotCQl9Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBEaXNwbGF5YWJsZSBleHRlbmRzIE1vZGVsLCBDb21wYXJhYmxlPERpc3BsYXlhYmxlPiB7Ci0JCi0JCVN0cmluZyBkaXNwbGF5U3RyaW5nKCk7Ci0JCQlTdHJpbmcgRElTUExBWV9TVFJJTkdfUFJPUEVSVFkgPSAiZGlzcGxheVN0cmluZyI7Ci0JCi0JCi0JCS8vICoqKioqKioqKiogaGVscGVyIGltcGxlbWVudGF0aW9ucyAqKioqKioqKioqCi0JCi0JCUNvbGxhdG9yIERFRkFVTFRfQ09MTEFUT1IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQotCQlDb21wYXJhdG9yPERpc3BsYXlhYmxlPiBERUZBVUxUX0NPTVBBUkFUT1IgPQotCQkJbmV3IENvbXBhcmF0b3I8RGlzcGxheWFibGU+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShEaXNwbGF5YWJsZSBkMSwgRGlzcGxheWFibGUgZDIpIHsKLQkJCQkJLy8gZGlzYWxsb3cgZHVwbGljYXRlcyBiYXNlZCBvbiBvYmplY3QgaWRlbnRpdHkKLQkJCQkJaWYgKGQxID09IGQyKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQotCQkJCQkvLyBmaXJzdCBjb21wYXJlIGRpc3BsYXkgc3RyaW5ncyB1c2luZyB0aGUgZGVmYXVsdCBjb2xsYXRvcgotCQkJCQlpbnQgcmVzdWx0ID0gREVGQVVMVF9DT0xMQVRPUi5jb21wYXJlKGQxLmRpc3BsYXlTdHJpbmcoKSwgZDIuZGlzcGxheVN0cmluZygpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCi0JCQkJCS8vIHRoZW4gY29tcGFyZSB1c2luZyBvYmplY3QtaWQKLQkJCQkJcmVzdWx0ID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDEpIC0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDIpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gSXQncyB1bmxpa2VseSB0aGF0IHdlIGdldCB0byB0aGlzIHBvaW50OyBidXQsIGp1c3QgaW4gY2FzZSwgd2Ugd2lsbCByZXR1cm4gLTEuCi0JCQkJCS8vIFVuZm9ydHVuYXRlbHksIHRoaXMgaW50cm9kdWNlcyBzb21lIG1pbGQgdW5wcmVkaWN0YWJpbGl0eSB0byB0aGUgc29ydCBvcmRlcgotCQkJCQkvLyAodW5sZXNzIHRoZSBvYmplY3RzIGFyZSBhbHdheXMgcGFzc2VkIGludG8gdGhpcyBtZXRob2QgaW4gdGhlIHNhbWUgb3JkZXIpLgotCQkJCQlyZXR1cm4gLTE7CQkvLyBpZiBhbGwgZWxzZSBmYWlscywgaW5kaWNhdGUgdGhhdCBvMSA8IG8yCi0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGlzcGxheWFibGUuREVGQVVMVF9DT01QQVJBVE9SIjsKLQkJCQl9Ci0JCQl9OwotCQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9UZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9UZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzY2IwNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgZW50cnkgZmllbGRzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9OQU1FID0gIlNjb29ieSBEb28iOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG5hbWVIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGFsbENhcHNOYW1lSG9sZGVyOwotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBUZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QoKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCXByaXZhdGUgVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0KCkgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKERFRkFVTFRfTkFNRSk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5uYW1lSG9sZGVyID0gdGhpcy5idWlsZE5hbWVIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmFsbENhcHNOYW1lSG9sZGVyID0gdGhpcy5idWlsZEFsbENhcHNOYW1lSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPih2bSwgVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRBbGxDYXBzTmFtZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIFN0cmluZz4odm0sIFRlc3RNb2RlbC5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lKCkudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJcGFyZW50LnNldFNpemUoNDAwLCAxMDApOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCB0ZXh0RmllbGRQYW5lbCA9IHRoaXMuYnVpbGRUZXh0RmllbGRQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgdGV4dEZpZWxkUGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRleHRGaWVsZFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTM1KTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGROYW1lVGV4dEZpZWxkKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlYWRPbmx5TmFtZVRleHRGaWVsZChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRBbGxDYXBzTmFtZVRleHRGaWVsZChwYW5lbCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5hbWVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUZXh0IHRleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSk7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5uYW1lSG9sZGVyLCB0ZXh0RmllbGQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFJlYWRPbmx5TmFtZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRleHQgdGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFKTsKLQkJdGV4dEZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQlTV1RUb29scy5iaW5kKHRoaXMubmFtZUhvbGRlciwgdGV4dEZpZWxkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRBbGxDYXBzTmFtZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRleHQgdGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFKTsKLQkJdGV4dEZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQlTV1RUb29scy5iaW5kKHRoaXMuYWxsQ2Fwc05hbWVIb2xkZXIsIHRleHRGaWVsZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgY2hlY2tCb3hQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNoZWNrQm94UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkUmVzZXROYW1lQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24ocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFJlc2V0TmFtZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRSZXNldE5hbWVBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzZXROYW1lQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVzZXQgbmFtZSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRleHRGaWVsZE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlc2V0TmFtZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc2V0IG5hbWUiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCByZXNldE5hbWUoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldE5hbWUoREVGQVVMVF9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhck1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzdG9yZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByaW50TW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRQcmludE1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicHJpbnQgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicHJpbnQgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5hbWU6ICIgKyB0aGlzLnRlc3RNb2RlbC5uYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb2RlbCBjbGFzcyAqKioqKioqKioqCi0KLQljbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkJcHVibGljIFRlc3RNb2RlbChTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIG5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjhkOTFjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5jdnNpZ25vcmUgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiYTYxMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTUyNzFlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjhmOWMyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgSmFuIDE1IDExOjEyOjI2IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGI1YzRjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gTWF5IDI3IDE0OjU1OjU4IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q0NjVjZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjYuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5lbnVtZXJhdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubm9kZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnM7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL2Fib3V0Lmh0bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmU5YzA4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzFhMThmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gVXRpbGl0eSBUZXN0cwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3Jlc291cmNlL0NsYXNzVG9vbHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9yZXNvdXJjZS9DbGFzc1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzE3YjYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3Jlc291cmNlL0NsYXNzVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBtZXRob2RzIHJlbGF0ZWQgdG8gdGhlIGphdmEubGFuZy5yZWZsZWN0IHBhY2thZ2UuCi0gKiBUaGVzZSBtZXRob2RzIHByb3ZpZGUgc2hvcnRjdXRzIGZvciBtYW5pcHVsYXRpbmcgb2JqZWN0cyB2aWEKLSAqIHJlZmxlY3Rpb247IHBhcnRpY3VsYXJseSB3aGVuIGRlYWxpbmcgd2l0aCBmaWVsZHMgYW5kL29yIG1ldGhvZHMgdGhhdAotICogYXJlIG5vdCBwdWJsaWNseSBhY2Nlc3NpYmxlIG9yIGFyZSBpbmhlcml0ZWQuCi0gKiAKLSAqIEluIG1vc3QgY2FzZXMsIGFsbCB0aGUgZXhjZXB0aW9ucyBhcmUgaGFuZGxlZCBhbmQKLSAqIHdyYXBwZWQgaW4gamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb25zOyBzbyB0aGVzZSBtZXRob2RzIHNob3VsZAotICogYmUgdXNlZCB3aGVuIHlvdSBhcmUgY29uZmlkZW50IHRoYXQgeW91IHdpbGwgbm90IGhhdmluZyBhbnkgcHJvYmxlbXMKLSAqIHVzaW5nIHJlZmxlY3Rpb24uCi0gKiAKLSAqIFRoZXJlIGFyZSBhbHNvIGEgbnVtYmVyIG9mIG1ldGhvZHMgd2hvc2UgbmFtZXMKLSAqIGJlZ2luIHdpdGggImF0dGVtcHQiLiBUaGVzZSBtZXRob2RzIHdpbGwgdGhyb3cgYSBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAqIG9yIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHdoZW4gYXBwcm9wcmlhdGUsIGFsbG93aW5nIHlvdSB0byBwcm9iZQotICogZm9yIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgcHJlc2VudCBidXQgbWlnaHQgbm90LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2xhc3NUb29scyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gWkVST19QQVJBTUVURVJfVFlQRVMgPSBuZXcgQ2xhc3NbMF07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBaRVJPX1BBUkFNRVRFUlMgPSBuZXcgT2JqZWN0WzBdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN0cmluZ1Rvb2xzLkNSOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUiA9ICckJzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBBUlJBWV9JTkRJQ0FUT1IgPSAnWyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFRZUEVfREVDTEFSQVRJT05fQVJSQVlfT1BFTiA9ICdbJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgVFlQRV9ERUNMQVJBVElPTl9BUlJBWV9DTE9TRSA9ICddJzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBSRUZFUkVOQ0VfQ0xBU1NfQ09ERSA9ICdMJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUkVGRVJFTkNFX0NMQVNTX05BTUVfREVMSU1JVEVSID0gJzsnOwotCQotCXByaXZhdGUgc3RhdGljIFByaW1pdGl2ZVtdIFBSSU1JVElWRVM7ICAvLyBwc2V1ZG8tJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQllURV9DT0RFID0gJ0InOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDSEFSX0NPREUgPSAnQyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9DT0RFID0gJ0QnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBGTE9BVF9DT0RFID0gJ0YnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBJTlRfQ09ERSA9ICdJJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTE9OR19DT0RFID0gJ0onOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTSE9SVF9DT0RFID0gJ1MnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBCT09MRUFOX0NPREUgPSAnWic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFZPSURfQ09ERSA9ICdWJzsKLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCA9IC0xOyAgLy8gcHNldWRvLSdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9QUklNSVRJVkVfV1JBUFBFUl9DTEFTU19OQU1FX0xFTkdUSCA9IC0xOyAgLy8gcHNldWRvLSdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEX0NMQVNTX05BTUUgPSB2b2lkLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEX1dSQVBQRVJfQ0xBU1NfTkFNRSA9IGphdmEubGFuZy5Wb2lkLmNsYXNzLmdldE5hbWUoKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgZmllbGRzIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY2xhc3MsIGluY2x1ZGluZyBpbmhlcml0ZWQgZmllbGRzLgotCSAqIENsYXNzI2FsbEZpZWxkcygpCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIEZpZWxkW10gYWxsRmllbGRzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlTdGFjazxGaWVsZD4gc3RhY2sgPSBuZXcgU3RhY2s8RmllbGQ+KCk7Ci0JCWZvciAoQ2xhc3M8Pz4gdGVtcENsYXNzID0gamF2YUNsYXNzOyB0ZW1wQ2xhc3MgIT0gbnVsbDsgdGVtcENsYXNzID0gdGVtcENsYXNzLmdldFN1cGVyY2xhc3MoKSkgewotCQkJcHVzaERlY2xhcmVkRmllbGRzKHRlbXBDbGFzcywgc3RhY2spOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2Uoc3RhY2spOwotCQlyZXR1cm4gc3RhY2sudG9BcnJheShuZXcgRmllbGRbc3RhY2suc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIG1ldGhvZHMgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBjbGFzcywgaW5jbHVkaW5nIGluaGVyaXRlZCBtZXRob2RzLgotCSAqIENsYXNzI2FsbE1ldGhvZHMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kW10gYWxsTWV0aG9kcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJU3RhY2s8TWV0aG9kPiBzdGFjayA9IG5ldyBTdGFjazxNZXRob2Q+KCk7Ci0JCWZvciAoQ2xhc3M8Pz4gdGVtcENsYXNzID0gamF2YUNsYXNzOyB0ZW1wQ2xhc3MgIT0gbnVsbDsgdGVtcENsYXNzID0gdGVtcENsYXNzLmdldFN1cGVyY2xhc3MoKSkgewotCQkJcHVzaERlY2xhcmVkTWV0aG9kcyh0ZW1wQ2xhc3MsIHN0YWNrKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHN0YWNrKTsKLQkJcmV0dXJuIHN0YWNrLnRvQXJyYXkobmV3IE1ldGhvZFtzdGFjay5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZSgpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgYXR0ZW1wdE5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0TmV3SW5zdGFuY2UoamF2YUNsYXNzLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbnN0cnVjdG9yIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIGF0dGVtcHROZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLm5ld0luc3RhbmNlKHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSArIENSICsgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgaWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBpYWUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSArIENSICsgaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpLCBpdGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbnN0cnVjdG9yIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIGF0dGVtcHROZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdE5ld0luc3RhbmNlKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGdldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCSAqIE9iamVjdCNnZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0dldEZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmaWVsZChvYmplY3QsIGZpZWxkTmFtZSkuZ2V0KG9iamVjdCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgaWFlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGdldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNnZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0dldFN0YXRpY0ZpZWxkVmFsdWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGZpZWxkKGphdmFDbGFzcywgZmllbGROYW1lKS5nZXQobnVsbCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgaWFlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgemVyby1hcmd1bWVudCBtZXRob2QsCi0JICogZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QobWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIElmIHRoZSBleGVjdXRlZCBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgCi0JCXRocm93cyBUaHJvd2FibGUsIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiAKLQl7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihtZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgcmVjZWl2ZXIsIHBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgemVyby1hcmd1bWVudCBzdGF0aWMgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSBjbGFzcyBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2Qoc3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIHNldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUKLQkgKiBjb250YWluaW5nIG9iamVjdCwgZmllbGQgbmFtZSwgYW5kIG5ldyBmaWVsZCB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQuCi0JICogT2JqZWN0I3NldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhdHRlbXB0VG9TZXRGaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJZmllbGQob2JqZWN0LCBmaWVsZE5hbWUpLnNldChvYmplY3QsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBzZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZQotCSAqIGNvbnRhaW5pbmcgY2xhc3MsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI3NldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhdHRlbXB0VG9TZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlmaWVsZChqYXZhQ2xhc3MsIGZpZWxkTmFtZSkuc2V0KG51bGwsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IKLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcnMuCi0JICogQ2xhc3MjY29uc3RydWN0b3IoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcywgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2NvbnN0cnVjdG9yKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvciA9IGphdmFDbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKHBhcmFtZXRlclR5cGVzKTsKLQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2NvbnN0cnVjdG9yKENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gY29uc3RydWN0b3IoamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIGZpZWxkcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMuCi0JICogQ2xhc3MjYWNjZXNzaWJsZURlY2xhcmVkRmllbGRzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkW10gZGVjbGFyZWRGaWVsZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCUZpZWxkW10gZmllbGRzID0gamF2YUNsYXNzLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCWZvciAoRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKLQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBtZXRob2RzIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNhY2Nlc3NpYmxlRGVjbGFyZWRNZXRob2RzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFtdIGRlY2xhcmVkTWV0aG9kcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGphdmFDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotCQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IKLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcnMuCi0JICogQ2xhc3MjZGVmYXVsdENvbnN0cnVjdG9yKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBkZWZhdWx0Q29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGFuZCBmaWVsZCBuYW1lLgotCSAqIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGRlZmluZSB0aGUgZmllbGQsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBmaWVsZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCUZpZWxkIGZpZWxkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpZWxkID0gamF2YUNsYXNzLmdldERlY2xhcmVkRmllbGQoZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCUNsYXNzPD8+IHN1cGVyY2xhc3MgPSBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewotCQkJCXRocm93IGV4OwotCQkJfQotCQkJLy8gcmVjdXJzZQotCQkJcmV0dXJuIGZpZWxkKHN1cGVyY2xhc3MsIGZpZWxkTmFtZSk7Ci0JCX0KLQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIGZpZWxkOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGRlZmluZSB0aGUgZmllbGQsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBmaWVsZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlyZXR1cm4gZmllbGQob2JqZWN0LmdldENsYXNzKCksIGZpZWxkTmFtZSk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG51bGwsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JCXNiLmFwcGVuZCgnLicpOwotCQlzYi5hcHBlbmQoZmllbGROYW1lKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJcmV0dXJuIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdC5nZXRDbGFzcygpLCBmaWVsZE5hbWUpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCQkvLyB0aGlzIGNoZWNrIGFsbG93cyB1cyB0byB1c2UgdGhpcyBjb2RlIGZvciBjb25zdHJ1Y3RvcnMsIHdoZXJlIHRoZSBtZXRob2ROYW1lIGlzIG51bGwKLQkJaWYgKG1ldGhvZE5hbWUgIT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKCcuJyk7Ci0JCQlzYi5hcHBlbmQobWV0aG9kTmFtZSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCWludCBtYXggPSBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggLSAxOwotCQlpZiAobWF4ICE9IC0xKSB7Ci0JCQkvLyBzdG9wIG9uZSBzaG9ydCBvZiB0aGUgZW5kIG9mIHRoZSBhcnJheQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJCXNiLmFwcGVuZChwYXJhbWV0ZXJUeXBlc1tpXS5nZXROYW1lKCkpOwotCQkJCXNiLmFwcGVuZCgiLCAiKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChwYXJhbWV0ZXJUeXBlc1ttYXhdLmdldE5hbWUoKSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUocmVjZWl2ZXIuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogT2JqZWN0I2dldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBmaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9HZXRGaWVsZFZhbHVlKG9iamVjdCwgZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gbnNmZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNmZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBuc2ZlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIGNsYXNzIGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogQ2xhc3MjZ2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IHN0YXRpY0ZpZWxkVmFsdWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvR2V0U3RhdGljRmllbGRWYWx1ZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5zZmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zZmUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgbnNmZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zbWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIG5zbWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgb25lLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIElmIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUpIAotCQl0aHJvd3MgVGhyb3dhYmxlCi0JewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24ocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIG9uZS1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogSWYgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXRocm93IHRoYXQgZXhjZXB0aW9uLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgCi0JCXRocm93cyBUaHJvd2FibGUKLQl7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihyZWNlaXZlciwgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogSWYgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXRocm93IHRoYXQgZXhjZXB0aW9uLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgCi0JCXRocm93cyBUaHJvd2FibGUKLQl7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24ocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zbWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIG5zbWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogQ29udmVydCBleGNlcHRpb25zIHRvIFJ1bnRpbWVFeGNlcHRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoTWV0aG9kIG1ldGhvZCwgT2JqZWN0IHJlY2VpdmVyLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWV0aG9kLmludm9rZShyZWNlaXZlciwgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIG1ldGhvZCwgaWFlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1ldGhvZCArIENSICsgaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpLCBpdGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogSWYgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXRocm93IHRoYXQgZXhjZXB0aW9uLgotCSAqIENvbnZlcnQgYWxsIG90aGVyIGV4Y2VwdGlvbnMgdG8gUnVudGltZUV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oTWV0aG9kIG1ldGhvZCwgT2JqZWN0IHJlY2VpdmVyLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCQl0aHJvd3MgVGhyb3dhYmxlCi0JewotCQl0cnkgewotCQkJcmV0dXJuIG1ldGhvZC5pbnZva2UocmVjZWl2ZXIsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBtZXRob2QsIGlhZSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0JCQlUaHJvd2FibGUgY2F1c2UgPSBpdGUuZ2V0Q2F1c2UoKTsKLQkJCWlmIChjYXVzZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWV0aG9kLnRvU3RyaW5nKCksIGl0ZSk7Ci0JCQl9Ci0JCQl0aHJvdyBjYXVzZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgc3RhdGljIG1ldGhvZCwKLQkgKiBnaXZlbiB0aGUgY2xhc3MgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zbWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBuc21lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgewotCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIHN0YXRpYyBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogQ29udmVydCBleGNlcHRpb25zIHRvIFJ1bnRpbWVFeGNlcHRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChtZXRob2QsIG51bGwsIHBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQl0cnkgewotCQkJbWV0aG9kID0gamF2YUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQlDbGFzczw/PiBzdXBlcmNsYXNzID0gamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJCWlmIChzdXBlcmNsYXNzID09IG51bGwpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJCS8vIHJlY3Vyc2UKLQkJCXJldHVybiBtZXRob2Qoc3VwZXJjbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9Ci0JCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlyZXR1cm4gbWV0aG9kOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdAotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2Qob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCwgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjbGFzcyAod2l0aG91dCB0aGUgY2hlY2tlZCBleGNlcHRpb24pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGNsYXNzTmFtZSwgZXgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBuZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGphdmFDbGFzcywgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIENsYXNzI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGNsYXNzTG9hZGVyKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIHBhcmFtZXRlcnMuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHROZXdJbnN0YW5jZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zbWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcyksIG5zbWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIHBhcmFtZXRlcnMuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc05hbWUsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgY2xhc3NMb2FkZXIpLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc05hbWUsIHBhcmFtZXRlclR5cGUsIHBhcmFtZXRlciwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgcGFyYW1ldGVyLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlciwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpLCBwYXJhbWV0ZXJUeXBlLCBwYXJhbWV0ZXIpOwotCX0KLQkKLQkvKgotCSAqIFB1c2ggdGhlIGRlY2xhcmVkIGZpZWxkcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIG9udG8gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXNoRGVjbGFyZWRGaWVsZHMoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdGFjazxGaWVsZD4gc3RhY2spIHsKLQkJRmllbGRbXSBmaWVsZHMgPSBkZWNsYXJlZEZpZWxkcyhqYXZhQ2xhc3MpOwotCQlmb3IgKGludCBpID0gZmllbGRzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlzdGFjay5wdXNoKGZpZWxkc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBQdXNoIHRoZSBkZWNsYXJlZCBtZXRob2RzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogb250byB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHB1c2hEZWNsYXJlZE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdGFjazxNZXRob2Q+IHN0YWNrKSB7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBkZWNsYXJlZE1ldGhvZHMoamF2YUNsYXNzKTsKLQkJZm9yIChpbnQgaSA9IG1ldGhvZHMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCXN0YWNrLnB1c2gobWV0aG9kc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCwgZmllbGQgbmFtZSwgYW5kIG5ldyBmaWVsZCB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIE9iamVjdCNzZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlhdHRlbXB0VG9TZXRGaWVsZFZhbHVlKG9iamVjdCwgZmllbGROYW1lLCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gbnNmZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNmZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBuc2ZlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIGNsYXNzLCBmaWVsZCBuYW1lLCBhbmQgbmV3IGZpZWxkIHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogQ2xhc3Mjc2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlhdHRlbXB0VG9TZXRTdGF0aWNGaWVsZFZhbHVlKGphdmFDbGFzcywgZmllbGROYW1lLCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gbnNmZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNmZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBuc2ZlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIG9iamVjdCdzIGNsYXNzLgotCSAqIENsYXNzI2dldFNob3J0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnRDbGFzc05hbWVGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc2hvcnROYW1lRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiT2JqZWN0IikuCi0JICogQ2xhc3MjZ2V0U2hvcnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydE5hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiT2JqZWN0IikuCi0JICogQ2xhc3MjZ2V0U2hvcnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydE5hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBzaG9ydE5hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5lc3RlZCBuYW1lIG9mIHRoZSBvYmplY3QncyBjbGFzcy4KLQkgKiBDbGFzcyNnZXROZXN0ZWROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXN0ZWRDbGFzc05hbWVGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbmVzdGVkTmFtZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmVzdGVkIG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJFbnRyeSIpLgotCSAqIENsYXNzI2dldE5lc3RlZE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5lc3RlZE5hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUikgKyAxKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXN0ZWQgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gIkVudHJ5IikuCi0JICogQ2xhc3MjZ2V0TmVzdGVkTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmVzdGVkTmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIG5lc3RlZE5hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJ0b1N0cmluZygpIiBuYW1lIG9mIHRoZSBvYmplY3QncyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ0NsYXNzTmFtZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0b1N0cmluZ05hbWVGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJ0b1N0cmluZygpIiBuYW1lIG9mIHRoZSBjbGFzcy4KLQkgKiAiTWVtYmVyIiBjbGFzc2VzIHdpbGwgcmV0dXJuIG9ubHkgdGhlIGZpbmFsIG5hbWU6Ci0JICogICAgICJjb20uZm9vLmJhci5Ub3BMZXZlbENsYXNzJE1lbWJlckNsYXNzJE5lc3RlZE1lbWJlckNsYXNzIgotCSAqICAgICAgICAgPT4gIk5lc3RlZE1lbWJlckNsYXNzIgotCSAqICJMb2NhbCIgYW5kICJhbm9ueW1vdXMiIGNsYXNzZXMgd2lsbCBzdGlsbCByZXR1cm4gdGhlIGVtYmVkZGVkICckJ3M6Ci0JICogICAgICJjb20uZm9vLmJhci5Ub3BMZXZlbENsYXNzJDFMb2NhbENsYXNzIgotCSAqICAgICAgICAgPT4gIlRvcExldmVsQ2xhc3MkMUxvY2FsQ2xhc3MiCi0JICogICAgICJjb20uZm9vLmJhci5Ub3BMZXZlbENsYXNzJDEiCi0JICogICAgICAgICA9PiAiVG9wTGV2ZWxDbGFzcyQxIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nTmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lZElzTWVtYmVyKGNsYXNzTmFtZSkgPwotCQkJY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKSArIDEpCi0JCToKLQkJCWNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAidG9TdHJpbmcoKSIgbmFtZSBvZiB0aGUgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdOYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gdG9TdHJpbmdOYW1lRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJqYXZhLmxhbmciKS4KLQkgKiBDbGFzcyNnZXRQYWNrYWdlTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja2FnZU5hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBwYWNrYWdlTmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiamF2YS5sYW5nIikuCi0JICogQ2xhc3MjZ2V0UGFja2FnZU5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2thZ2VOYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBsYXN0UGVyaW9kID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChsYXN0UGVyaW9kID09IC0xKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgbGFzdFBlcmlvZCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgY2xhc3MsCi0JICogZm9sbG93ZWQgYnkgaXRzIHBhY2thZ2UgbmFtZSAoZS5nLiAiT2JqZWN0IChqYXZhLmxhbmcpIikuCi0JICogQ2xhc3MjZ2V0U2hvcnROYW1lV2l0aFBhY2thZ2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0TmFtZVdpdGhQYWNrYWdlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKHNob3J0TmFtZUZvcihqYXZhQ2xhc3MpKTsKLQkJaWYgKCAhIGphdmFDbGFzcy5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlzYi5hcHBlbmQoIiAoIik7Ci0JCQlzYi5hcHBlbmQocGFja2FnZU5hbWVGb3IoamF2YUNsYXNzKSk7Ci0JCQlzYi5hcHBlbmQoJyknKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQsIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBzdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2Qgc3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMobWV0aG9kLmdldE1vZGlmaWVycygpKSkgewotCQkJcmV0dXJuIG1ldGhvZDsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBzdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gc3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGVzfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBjYW4gYmUgImRlY2xhcmVkIiBpbiBjb2RlOwotCSAqIGkuZS4gaXQgaXMgZWl0aGVyIGEgInRvcC1sZXZlbCIgY2xhc3Mgb3IgYSAibWVtYmVyIiBjbGFzcywgYnV0IGl0Ci0JICogaXMgbm90IGFuICJhcnJheSIgY2xhc3MuIFRoaXMgbWV0aG9kIHJvbGxzIHRvZ2V0aGVyIGFsbCB0aGUgY2hlY2tzCi0JICogZnJvbSB0aGUgb3RoZXIgbWV0aG9kcyBmb3IgYSBiaXQgb2YgYSBwZXJmb3JtYW5jZSB0d2Vhay4KLQkgKiBDbGFzcyNpc0RlY2xhcmFibGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNEZWNsYXJhYmxlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZS5jaGFyQXQoMCkgPT0gQVJSQVlfSU5ESUNBVE9SKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CQkvLyBpdCBpcyBhbiAiYXJyYXkiIGNsYXNzCi0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsJCS8vIGl0IGlzIGEgInRvcC1sZXZlbCIgY2xhc3MKLQkJfQotCQlkbyB7Ci0JCQkvLyB0aGUgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggZG9sbGFyIHNpZ24gY2Fubm90IGJlIGEgZGlnaXQKLQkJCWluZGV4Kys7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpbmRleCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IsIGluZGV4KTsKLQkJfSB3aGlsZSAoaW5kZXggIT0gLTEpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAibWVtYmVyIiwgImxvY2FsIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayBuYW1pbmcgY29udmVudGlvbnMgKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBkb2VzIE5PVCBjb250YWluIGEgJyQnOiAiVG9wTGV2ZWxDbGFzcyIpLgotCSAqIENsYXNzI2lzVG9wTGV2ZWwoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNUb3BMZXZlbChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUikgPT0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJtZW1iZXIiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAidG9wLWxldmVsIiwgImxvY2FsIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayBuYW1pbmcgY29udmVudGlvbnMgKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBjb250YWlucyBhdCBsZWFzdCBvbmUgJyQnIGFuZCBhbGwgdGhlIG5hbWVzIGJldHdlZW4KLQkgKiBlYWNoICckJyBhcmUgbGVnYWwgY2xhc3MgbmFtZXM6Ci0JICogIlRvcExldmVsQ2xhc3MkTWVtYmVyQ2xhc3MkTmVzdGVkTWVtYmVyQ2xhc3MiKS4KLQkgKiBDbGFzcyNpc01lbWJlcigpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc01lbWJlcihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CS8vIGl0IGlzIGEgInRvcC1sZXZlbCIgY2xhc3MKLQkJfQotCQlkbyB7Ci0JCQkvLyB0aGUgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggZG9sbGFyIHNpZ24gY2Fubm90IGJlIGEgZGlnaXQKLQkJCWluZGV4Kys7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpbmRleCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IsIGluZGV4KTsKLQkJfSB3aGlsZSAoaW5kZXggIT0gLTEpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgImxvY2FsIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJtZW1iZXIiLCBvciAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgamRrIChvciBFY2xpcHNlKSBuYW1pbmcgY29udmVudGlvbnMuCi0JICogSW4gdGhlIGpkaywgdGhlIGNsYXNzIG5hbWUgZW5kcyB3aXRoICckbm5uWFhYJyB3aGVyZSB0aGUgJyQnIGlzCi0JICogZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgbnVtZXJpYyBkaWdpdHMgd2hpY2ggYXJlIGZvbGxvd2VkIGJ5IHRoZQotCSAqIGxvY2FsIGNsYXNzIG5hbWU6ICJUb3BMZXZlbENsYXNzJDFMb2NhbENsYXNzIi4KLQkgKiBJbiBFY2xpcHNlLCB0aGUgY2xhc3MgbmFtZSBlbmRzIHdpdGggJyRubm4kWFhYJyB3aGVyZSB0aGUgJyQnIGlzCi0JICogZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgbnVtZXJpYyBkaWdpdHMgd2hpY2ggYXJlIHNlcGFyYXRlZCBmcm9tCi0JICogdGhlIGxvY2FsIGNsYXNzIG5hbWUgYnkgYW5vdGhlciAnJCc6ICJUb3BMZXZlbENsYXNzJDEkTG9jYWxDbGFzcyIuCi0JICogQ2xhc3MjaXNMb2NhbCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0xvY2FsKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgZG9sbGFyID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGRvbGxhciA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICggISBDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc05hbWUuY2hhckF0KGRvbGxhciArIDEpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBsZW4gPSBjbGFzc05hbWUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSBkb2xsYXIgKyAyOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNsYXNzTmFtZS5jaGFyQXQoaSkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIHBhc3QgdGhlICQgYXJlIGRpZ2l0cyAoYW5vbnltb3VzKQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhbiAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJtZW1iZXIiLCBvciAibG9jYWwiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBqZGsgbmFtaW5nIGNvbnZlbnRpb25zIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgZW5kcyB3aXRoICckbm5uJyB3aGVyZSBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUKLQkgKiBsYXN0ICckJyBhcmUgbnVtZXJpYyBkaWdpdHM6ICJUb3BMZXZlbENsYXNzJDEiKS4KLQkgKiBDbGFzcyNpc0Fub255bW91cygpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0Fub255bW91cyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGRvbGxhciA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChkb2xsYXIgPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgc3RhcnQgPSBkb2xsYXIgKyAxOwotCQlmb3IgKGludCBpID0gY2xhc3NOYW1lLmxlbmd0aCgpOyBpLS0gPiBzdGFydDsgKSB7Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIHBhc3QgdGhlICQgYXJlIGRpZ2l0cwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiBDbGFzcyNnZXRBcnJheURlcHRoKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpbnQgZGVwdGggPSAwOwotCQl3aGlsZSAoamF2YUNsYXNzLmlzQXJyYXkoKSkgewotCQkJZGVwdGgrKzsKLQkJCWphdmFDbGFzcyA9IGphdmFDbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogVGhlIGRlcHRoIGlzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgYW4gYXJyYXkuCi0JICogTm9uLWFycmF5cyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGFycmF5RGVwdGhGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKiBDbGFzcyNnZXRBcnJheURlcHRoKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBkZXB0aCA9IDA7Ci0JCXdoaWxlIChjbGFzc05hbWUuY2hhckF0KGRlcHRoKSA9PSBBUlJBWV9JTkRJQ0FUT1IpIHsKLQkJCWRlcHRoKys7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYW4gYXJyYXkgdHlwZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzQXJyYXkoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLmNoYXJBdCgwKSA9PSBBUlJBWV9JTkRJQ0FUT1I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5IHR5cGUuCi0JICogQSBub24tYXJyYXkgdHlwZSBzaW1wbHkgcmV0dXJucyBpdHNlbGYuCi0JICogQ2xhc3MjZ2V0RWxlbWVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZWxlbWVudFR5cGVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXdoaWxlIChqYXZhQ2xhc3MuaXNBcnJheSgpKSB7Ci0JCQlqYXZhQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBqYXZhQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheS4KLQkgKiBBIG5vbi1hcnJheSBzaW1wbHkgcmV0dXJucyBpdHMgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBlbGVtZW50VHlwZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBlbGVtZW50VHlwZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIHNpbXBseSByZXR1cm4gdGhlbXNlbHZlcy4KLQkgKiBDbGFzcyNnZXRFbGVtZW50VHlwZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFR5cGVOYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gZWxlbWVudFR5cGVGb3IoamF2YUNsYXNzKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIHNpbXBseSByZXR1cm4gdGhlbXNlbHZlcy4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKiBDbGFzcyNnZXRFbGVtZW50VHlwZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBkZXB0aCA9IGFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGNsYXNzTmFtZSk7Ci0JCWlmIChkZXB0aCA9PSAwKSB7Ci0JCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogImphdmEubGFuZy5PYmplY3QiIG9yICJpbnQiCi0JCQlyZXR1cm4gY2xhc3NOYW1lOwotCQl9Ci0JCWludCBsYXN0ID0gY2xhc3NOYW1lLmxlbmd0aCgpIC0gMTsKLQkJaWYgKGNsYXNzTmFtZS5jaGFyQXQoZGVwdGgpID09IFJFRkVSRU5DRV9DTEFTU19DT0RFKSB7Ci0JCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogIltbW0xqYXZhLmxhbmcuT2JqZWN0OyIKLQkJCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGRlcHRoICsgMSwgbGFzdCk7CS8vIGRyb3AgdGhlIHRyYWlsaW5nICc7JwotCQl9Ci0JCS8vIHRoZSBuYW1lIGlzIGluIHRoZSBmb3JtOiAiW1tbSSIKLQkJcmV0dXJuIGNsYXNzTmFtZUZvckNvZGUoY2xhc3NOYW1lLmNoYXJBdChsYXN0KSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAicmVmZXJlbmNlIgotCSAqIGNsYXNzIChpLmUuIG5laXRoZXIgJ3ZvaWQnIG5vciBvbmUgb2YgdGhlIHByaW1pdGl2ZSB2YXJpYWJsZSBjbGFzc2VzLAotCSAqIFsnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuXSkuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1JlZmVyZW5jZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiAhIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZShjbGFzc05hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwcmltaXRpdmUKLQkgKiBjbGFzcyAoaS5lLiAndm9pZCcgb3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgY2xhc3NlcywKLQkgKiBbJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLl0pLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNQcmltaXRpdmUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSB8fCAoY2xhc3NOYW1lLmxlbmd0aCgpID4gbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuICdib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy4sIGJ1dCBub3QgJ3ZvaWQnKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lZElzUHJpbWl0aXZlKGNsYXNzTmFtZSkKLQkJCSYmICggISBjbGFzc05hbWUuZXF1YWxzKFZPSURfQ0xBU1NfTkFNRSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwcmltaXRpdmUgd3JhcHBlcgotCSAqIGNsYXNzIChpLmUuICdqYXZhLmxhbmcuVm9pZCcgb3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgd3JhcHBlciBjbGFzc2VzLAotCSAqIFsnamF2YS5sYW5nLkJvb2xlYW4nLCAnamF2YS5sYW5nLkludGVnZXInLCAnamF2YS5sYW5nLkZsb2F0JywgZXRjLl0pLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSB8fCAoY2xhc3NOYW1lLmxlbmd0aCgpID4gbWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJfQotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoY29kZXNbaV0ud3JhcHBlckNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUKLQkgKiBjbGFzcyAoaS5lLiAnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuLCBidXQgbm90ICd2b2lkJykuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhjbGFzc05hbWUpCi0JCQkmJiAoICEgY2xhc3NOYW1lLmVxdWFscyhWT0lEX1dSQVBQRVJfQ0xBU1NfTkFNRSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwcmltaXRpdmUgd3JhcHBlcgotCSAqIGNsYXNzIChpLmUuICdqYXZhLmxhbmcuVm9pZCcgb3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgd3JhcHBlciBjbGFzc2VzLAotCSAqIFsnamF2YS5sYW5nLkJvb2xlYW4nLCAnamF2YS5sYW5nLkludGVnZXInLCAnamF2YS5sYW5nLkZsb2F0JywgZXRjLl0pLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc0lzUHJpbWl0aXZlV3JhcHBlckNsYXNzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpZiAoamF2YUNsYXNzLmlzQXJyYXkoKSB8fCAoamF2YUNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKSA+IG1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGNvZGVzW2ldLndyYXBwZXJDbGFzcyA9PSBqYXZhQ2xhc3MpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLiwgYnV0IG5vdCAndm9pZCcpLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjbGFzc0lzUHJpbWl0aXZlV3JhcHBlckNsYXNzKGphdmFDbGFzcykKLQkJCSYmIChqYXZhQ2xhc3MgIT0gamF2YS5sYW5nLlZvaWQuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvckNvZGUoY2hhciBjbGFzc0NvZGUpIHsKLQkJcmV0dXJuIGNsYXNzRm9yQ29kZShjbGFzc0NvZGUpLmdldE5hbWUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NOYW1lRm9yQ29kZShpbnQgY2xhc3NDb2RlKSB7Ci0JCXJldHVybiBjbGFzc05hbWVGb3JDb2RlKChjaGFyKSBjbGFzc0NvZGUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvckNvZGUoY2hhciBjbGFzc0NvZGUpIHsKLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGNvZGVzW2ldLmNvZGUgPT0gY2xhc3NDb2RlKSB7Ci0JCQkJcmV0dXJuIGNvZGVzW2ldLmphdmFDbGFzczsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKGNsYXNzQ29kZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yQ29kZShpbnQgY2xhc3NDb2RlKSB7Ci0JCXJldHVybiBjbGFzc0ZvckNvZGUoKGNoYXIpIGNsYXNzQ29kZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXIgY29kZUZvckNsYXNzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpZiAoKCAhIGphdmFDbGFzcy5pc0FycmF5KCkpICYmIChqYXZhQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpIDw9IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSkgewotCQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzID09IGphdmFDbGFzcykgewotCQkJCQlyZXR1cm4gY29kZXNbaV0uY29kZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsJCQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGNvZGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIGNvZGVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKCggISBjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSAmJiAoY2xhc3NOYW1lLmxlbmd0aCgpIDw9IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSkgewotCQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCQlyZXR1cm4gY29kZXNbaV0uY29kZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjbGFzc05hbWUpOwkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24sIENsYXNzVG9vbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLAotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJVHlwZURlY2xhcmF0aW9uIHRkID0gdHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXJldHVybiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbih0ZC5lbGVtZW50VHlwZU5hbWUsIHRkLmFycmF5RGVwdGgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQl0eXBlRGVjbGFyYXRpb24gPSBTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHR5cGVEZWNsYXJhdGlvbik7Ci0JCWludCBhcnJheURlcHRoID0gYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbl8odHlwZURlY2xhcmF0aW9uKTsKLQkJU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSA9IHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcoMCwgdHlwZURlY2xhcmF0aW9uLmxlbmd0aCgpIC0gKGFycmF5RGVwdGggKiAyKSk7Ci0JCXJldHVybiBuZXcgVHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIsCi0JICogdXNpbmcgdGhlIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIuCi0JICovCi0JLy8gc2VlIHRoZSAiRXZhbHVhdGlvbiIgb2YgamRrIGJ1ZyA2NDQ2NjI3IGZvciBhIGRpc2N1c3Npb24gb2YgbG9hZGluZyBjbGFzc2VzCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJLy8gcHJpbWl0aXZlcyBjYW5ub3QgYmUgbG9hZGVkIHZpYSBDbGFzcyNmb3JOYW1lKCksCi0JCS8vIHNvIGNoZWNrIGZvciBhIHByaW1pdGl2ZSBjbGFzcyBuYW1lIGZpcnN0Ci0JCVByaW1pdGl2ZSBwY2MgPSBudWxsOwotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmxlbmd0aCgpIDw9IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSB7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lKSkgewotCQkJCQlwY2MgPSBjb2Rlc1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gbm9uLWFycmF5Ci0JCWlmIChhcnJheURlcHRoID09IDApIHsKLQkJCXJldHVybiAocGNjID09IG51bGwpID8gQ2xhc3MuZm9yTmFtZShlbGVtZW50VHlwZU5hbWUsIGZhbHNlLCBjbGFzc0xvYWRlcikgOiBwY2MuamF2YUNsYXNzOwotCQl9Ci0KLQkJLy8gYXJyYXkKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7Ci0JCWZvciAoaW50IGkgPSBhcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXNiLmFwcGVuZChBUlJBWV9JTkRJQ0FUT1IpOwotCQl9Ci0JCWlmIChwY2MgPT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19DT0RFKTsKLQkJCXNiLmFwcGVuZChlbGVtZW50VHlwZU5hbWUpOwotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQocGNjLmNvZGUpOwotCQl9Ci0JCXJldHVybiBDbGFzcy5mb3JOYW1lKHNiLnRvU3RyaW5nKCksIGZhbHNlLCBjbGFzc0xvYWRlcik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiI7IGUuZy4KLQkgKiAgICAgImludFtdIiAtPiAiW0kiCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJVHlwZURlY2xhcmF0aW9uIHRkID0gdHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXJldHVybiBjbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24odGQuZWxlbWVudFR5cGVOYW1lLCB0ZC5hcnJheURlcHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGRlcHRoIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIjsgZS5nLgotCSAqICAgICAiaW50W10iIC0+IDEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2UodHlwZURlY2xhcmF0aW9uKSk7Ci0JfQotCi0JLyoKLQkgKiBBc3N1bWUgbm8gd2hpdGVzcGFjZSBpbiB0aGUgdHlwZSBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlpbnQgbGFzdCA9IHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSAtIDE7Ci0JCWludCBkZXB0aCA9IDA7Ci0JCWludCBjbG9zZSA9IGxhc3Q7Ci0JCXdoaWxlICh0eXBlRGVjbGFyYXRpb24uY2hhckF0KGNsb3NlKSA9PSBUWVBFX0RFQ0xBUkFUSU9OX0FSUkFZX0NMT1NFKSB7Ci0JCQlpZiAodHlwZURlY2xhcmF0aW9uLmNoYXJBdChjbG9zZSAtIDEpID09IFRZUEVfREVDTEFSQVRJT05fQVJSQVlfT1BFTikgewotCQkJCWRlcHRoKys7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgdHlwZSBkZWNsYXJhdGlvbjogIiArIHR5cGVEZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCQljbG9zZSA9IGxhc3QgLSAoZGVwdGggKiAyKTsKLQkJfQotCQlyZXR1cm4gZGVwdGg7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCS8vIG5vbi1hcnJheQotCQlpZiAoYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZWxlbWVudFR5cGVOYW1lOwotCQl9Ci0KLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5lcXVhbHMoVk9JRF9DTEFTU19OQU1FKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJyIgKyBWT0lEX0NMQVNTX05BTUUgKyAiJyBtdXN0IGhhdmUgYW4gYXJyYXkgZGVwdGggb2YgemVybzogIiArIGFycmF5RGVwdGggKyAnLicpOwotCQl9Ci0JCS8vIGFycmF5Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOwotCQlmb3IgKGludCBpID0gYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlzYi5hcHBlbmQoQVJSQVlfSU5ESUNBVE9SKTsKLQkJfQotCi0JCS8vIGxvb2sgZm9yIGEgcHJpbWl0aXZlIGZpcnN0Ci0JCVByaW1pdGl2ZSBwY2MgPSBudWxsOwotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmxlbmd0aCgpIDw9IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSB7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lKSkgewotCQkJCQlwY2MgPSBjb2Rlc1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHBjYyA9PSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoUkVGRVJFTkNFX0NMQVNTX0NPREUpOwotCQkJc2IuYXBwZW5kKGVsZW1lbnRUeXBlTmFtZSk7Ci0JCQlzYi5hcHBlbmQoUkVGRVJFTkNFX0NMQVNTX05BTUVfREVMSU1JVEVSKTsKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChwY2MuY29kZSk7Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpZiAoTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCA9PSAtMSkgewotCQkJTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCA9IGNhbGN1bGF0ZU1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpOwotCQl9Ci0JCXJldHVybiBNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBjYWxjdWxhdGVNYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSB7Ci0JCWludCBtYXggPSAtMTsKLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaW50IGxlbiA9IGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQlpZiAobGVuID4gbWF4KSB7Ci0JCQkJbWF4ID0gbGVuOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKSB7Ci0JCWlmIChNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEggPT0gLTEpIHsKLQkJCU1BWF9QUklNSVRJVkVfV1JBUFBFUl9DTEFTU19OQU1FX0xFTkdUSCA9IGNhbGN1bGF0ZU1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gTUFYX1BSSU1JVElWRV9XUkFQUEVSX0NMQVNTX05BTUVfTEVOR1RIOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBjYWxjdWxhdGVNYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpbnQgbWF4ID0gLTE7Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWludCBsZW4gPSBjb2Rlc1tpXS53cmFwcGVyQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJaWYgKGxlbiA+IG1heCkgewotCQkJCW1heCA9IGxlbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByaW1pdGl2ZVtdIHByaW1pdGl2ZXMoKSB7Ci0JCWlmIChQUklNSVRJVkVTID09IG51bGwpIHsKLQkJCVBSSU1JVElWRVMgPSBidWlsZFByaW1pdGl2ZXMoKTsKLQkJfQotCQlyZXR1cm4gUFJJTUlUSVZFUzsKLQl9Ci0JCi0JLyoqCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUHJpbWl0aXZlW10gYnVpbGRQcmltaXRpdmVzKCkgewotCQlQcmltaXRpdmVbXSByZXN1bHQgPSBuZXcgUHJpbWl0aXZlWzldOwotCQlyZXN1bHRbMF0gPSBuZXcgUHJpbWl0aXZlKEJZVEVfQ09ERSwgamF2YS5sYW5nLkJ5dGUuY2xhc3MpOwotCQlyZXN1bHRbMV0gPSBuZXcgUHJpbWl0aXZlKENIQVJfQ09ERSwgamF2YS5sYW5nLkNoYXJhY3Rlci5jbGFzcyk7Ci0JCXJlc3VsdFsyXSA9IG5ldyBQcmltaXRpdmUoRE9VQkxFX0NPREUsIGphdmEubGFuZy5Eb3VibGUuY2xhc3MpOwotCQlyZXN1bHRbM10gPSBuZXcgUHJpbWl0aXZlKEZMT0FUX0NPREUsIGphdmEubGFuZy5GbG9hdC5jbGFzcyk7Ci0JCXJlc3VsdFs0XSA9IG5ldyBQcmltaXRpdmUoSU5UX0NPREUsIGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzKTsKLQkJcmVzdWx0WzVdID0gbmV3IFByaW1pdGl2ZShMT05HX0NPREUsIGphdmEubGFuZy5Mb25nLmNsYXNzKTsKLQkJcmVzdWx0WzZdID0gbmV3IFByaW1pdGl2ZShTSE9SVF9DT0RFLCBqYXZhLmxhbmcuU2hvcnQuY2xhc3MpOwotCQlyZXN1bHRbN10gPSBuZXcgUHJpbWl0aXZlKEJPT0xFQU5fQ09ERSwgamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MpOwotCQlyZXN1bHRbOF0gPSBuZXcgUHJpbWl0aXZlKFZPSURfQ09ERSwgamF2YS5sYW5nLlZvaWQuY2xhc3MpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBDbGFzc1Rvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJpbWl0aXZlIHsKLQkJZmluYWwgY2hhciBjb2RlOwotCQlmaW5hbCBDbGFzczw/PiBqYXZhQ2xhc3M7Ci0JCWZpbmFsIENsYXNzPD8+IHdyYXBwZXJDbGFzczsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdSQVBQRVJfQ0xBU1NfVFlQRV9GSUVMRF9OQU1FID0gIlRZUEUiOwotCQkvLyBlLmcuIGphdmEubGFuZy5Cb29sZWFuLlRZUEUgPT4gYm9vbGVhbi5jbGFzcwotCQlQcmltaXRpdmUoY2hhciBjb2RlLCBDbGFzczw/PiB3cmFwcGVyQ2xhc3MpIHsKLQkJCXRoaXMuY29kZSA9IGNvZGU7Ci0JCQl0aGlzLndyYXBwZXJDbGFzcyA9IHdyYXBwZXJDbGFzczsKLQkJCXRoaXMuamF2YUNsYXNzID0gKENsYXNzPD8+KSBzdGF0aWNGaWVsZFZhbHVlKHdyYXBwZXJDbGFzcywgV1JBUFBFUl9DTEFTU19UWVBFX0ZJRUxEX05BTUUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZURlY2xhcmF0aW9uIHsKLQkJZmluYWwgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZTsKLQkJZmluYWwgaW50IGFycmF5RGVwdGg7Ci0JCVR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQkJdGhpcy5lbGVtZW50VHlwZU5hbWUgPSBlbGVtZW50VHlwZU5hbWU7Ci0JCQl0aGlzLmFycmF5RGVwdGggPSBhcnJheURlcHRoOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0FycmF5VG9vbHNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9BcnJheVRvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVkN2VmZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0FycmF5VG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SZXZlcnNlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXJyYXlUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEFycmF5VG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5zdGFudGlhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3QXJyYXlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYXJyYXkxID0gbmV3IFN0cmluZ1syXTsKLQkJU3RyaW5nW10gYXJyYXkyID0gQXJyYXlUb29scy5uZXdBcnJheShhcnJheTEpOwotCQlhcnJheTJbMF0gPSAiZm9vIjsKLQkJYXJyYXkyWzFdID0gImJhciI7Ci0JCWFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGFycmF5Mi5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBhcnJheTIubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3QXJyYXlPYmplY3RBcnJheUludCgpIHsKLQkJU3RyaW5nW10gYXJyYXkxID0gbmV3IFN0cmluZ1syXTsKLQkJU3RyaW5nW10gYXJyYXkyID0gQXJyYXlUb29scy5uZXdBcnJheShhcnJheTEsIDUpOwotCQlhcnJheTJbMF0gPSAiZm9vIjsKLQkJYXJyYXkyWzRdID0gImJhciI7Ci0JCWFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGFycmF5Mi5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhcnJheTIubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3QXJyYXlPYmplY3RBcnJheUludF9FeGNlcHRpb24oKSB7Ci0JCVN0cmluZ1tdIGFycmF5MSA9IG5ldyBTdHJpbmdbMl07Ci0JCU9iamVjdFtdIGFycmF5MiA9IEFycmF5VG9vbHMubmV3QXJyYXkoYXJyYXkxLCA1KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJYXJyYXkyWzFdID0gSW50ZWdlci52YWx1ZU9mKDcpOwotCQkJZmFpbCgiYm9ndXMgYXJyYXk6ICIgKyBBcnJheXMudG9TdHJpbmcoYXJyYXkyKSk7Ci0JCX0gY2F0Y2ggKEFycmF5U3RvcmVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcG9uZW50VHlwZSgpIHsKLQkJU3RyaW5nW10gYXJyYXkgPSBuZXcgU3RyaW5nWzJdOwotCQlDbGFzczw/IGV4dGVuZHMgU3RyaW5nPiBqYXZhQ2xhc3MgPSBBcnJheVRvb2xzLmNvbXBvbmVudFR5cGUoYXJyYXkpOwotCQlhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBqYXZhQ2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdBcnJheUNsYXNzSW50KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IEFycmF5VG9vbHMubmV3QXJyYXkoU3RyaW5nLmNsYXNzLCA1KTsKLQkJYXJyYXlbMF0gPSAiZm9vIjsKLQkJYXJyYXlbNF0gPSAiYmFyIjsKLQkJYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgYXJyYXkuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3QXJyYXlDbGFzc0ludF9FeGNlcHRpb24oKSB7Ci0JCU9iamVjdFtdIGFycmF5ID0gQXJyYXlUb29scy5uZXdBcnJheShTdHJpbmcuY2xhc3MsIDUpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhcnJheVsxXSA9IEludGVnZXIudmFsdWVPZig3KTsKLQkJCWZhaWwoImJvZ3VzIGFycmF5OiAiICsgQXJyYXlzLnRvU3RyaW5nKGFycmF5KSk7Ci0JCX0gY2F0Y2ggKEFycmF5U3RvcmVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3QXJyYXlDbGFzc0ludF9QcmltaXRpdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU9iamVjdFtdIGFycmF5ID0gQXJyYXlUb29scy5uZXdBcnJheShpbnQuY2xhc3MsIDUpOwotCQkJZmFpbCgiYm9ndXMgYXJyYXk6ICIgKyBBcnJheXMudG9TdHJpbmcoYXJyYXkpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnNpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJT2JqZWN0W10gYSA9IEFycmF5VG9vbHMuYXJyYXkoaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhYmxlSW50KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KGl0ZXJhYmxlLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYWJsZU9iamVjdEFycmF5X1N0cmluZygpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlTdHJpbmdbXSBhID0gQXJyYXlUb29scy5hcnJheShpdGVyYWJsZSwgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmFibGVPYmplY3RBcnJheV9PYmplY3QoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJT2JqZWN0W10gYSA9IEFycmF5VG9vbHMuYXJyYXkoaXRlcmFibGUsIG5ldyBPYmplY3RbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhYmxlSW50T2JqZWN0QXJyYXkoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IEFycmF5VG9vbHMuYXJyYXkoaXRlcmFibGUsIDMsIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9yKCkgewotCQlPYmplY3RbXSBhID0gQXJyYXlUb29scy5hcnJheSh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvcl9FbXB0eSgpIHsKLQkJT2JqZWN0W10gYSA9IEFycmF5VG9vbHMuYXJyYXkoRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvckludCgpIHsKLQkJT2JqZWN0W10gYSA9IEFycmF5VG9vbHMuYXJyYXkodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JJbnRfRW1wdHkoKSB7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgMyk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JPYmplY3RBcnJheV9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSBBcnJheVRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9yT2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBBcnJheVRvb2xzLmFycmF5KEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpLCBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvck9iamVjdEFycmF5X0VtcHR5X0NsZWFyQXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBBcnJheVRvb2xzLmFycmF5KEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpLCBuZXcgU3RyaW5nWzVdKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0TnVsbChhWzBdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvck9iamVjdEFycmF5X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IEFycmF5VG9vbHMuYXJyYXkodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgbmV3IE9iamVjdFswXSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JJbnRPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IEFycmF5VG9vbHMuYXJyYXkodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JJbnRPYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYSA9IEFycmF5VG9vbHMuYXJyYXkoRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCksIDMsIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5T2JqZWN0X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IEFycmF5VG9vbHMuYWRkKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgInR3ZW50eSIpOwotCQlhc3NlcnRFcXVhbHMoNCwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgInR3ZW50eSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d2VudHkiLCBhW2EubGVuZ3RoLTFdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0QXJyYXlPYmplY3RfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gQXJyYXlUb29scy5hZGQodGhpcy5idWlsZFN0cmluZ0FycmF5MSgpLCAidHdlbnR5Iik7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAidHdlbnR5IikpOwotCQlhc3NlcnRFcXVhbHMoInR3ZW50eSIsIGFbYS5sZW5ndGgtMV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheU9iamVjdF9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJ0d2VudHkiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0d2VudHkiKSk7Ci0JCWFzc2VydEVxdWFscygidHdlbnR5IiwgYVswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMiwgIlgiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJYIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheUludE9iamVjdF9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDIsICJYIik7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiWCIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0QXJyYXlJbnRPYmplY3RfRW5kKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA0LCAiWCIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIsICJYIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0X1plcm8oKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDAsICJYIik7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJYIiwgImEiLCAiYiIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0QXJyYXlJbnRPYmplY3RfRXhjZXB0aW9uKCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWEgPSBBcnJheVRvb2xzLmFkZChhLCAzMywgIlgiKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IEFycmF5VG9vbHMuYWRkKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSwgJ2QnKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdkJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDaGFyQXJyYXlDaGFyX0VtcHR5KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyWzBdOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgJ2QnKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdkJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdkJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENoYXJBcnJheUludENoYXIoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJyB9OwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMiwgJ1gnKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnWCcsICdjJywgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5SW50Q2hhcl9aZXJvKCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDAsICdYJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnWCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnWCcsICdhJywgJ2InLCAnYycsICdkJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENoYXJBcnJheUludENoYXJfRW5kKCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDQsICdYJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnWCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcsICdYJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gQXJyYXlUb29scy5hZGQodGhpcy5idWlsZEludEFycmF5KCksIDMwKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludEFycmF5SW50X0VtcHR5KCkgewotCQlpbnRbXSBhID0gbmV3IGludFswXTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDMwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAzMCB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludEFycmF5SW50SW50KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMSwgMiwgMywgNCB9OwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMiwgOTkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgOTkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDEsIDIsIDk5LCAzLCA0IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSW50QXJyYXlJbnRJbnRfWmVybygpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDAsIDk5KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA5OSwgMSwgMiwgMywgNCB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludEFycmF5SW50SW50X0VuZCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDQsIDk5KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCAzLCA0LCA5OSB9LCBhKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZCBhbGwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fT2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGMpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX0VtcHR5Q29sbGVjdGlvbigpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRDb2xsZWN0aW9uX1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAxLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9TdHJpbmdfRW5kKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDMsIGMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRDb2xsZWN0aW9uX0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDAsIGMpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRDb2xsZWN0aW9uX0VtcHR5QXJyYXlfRXhjZXB0aW9uKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAzLCBjKTsKLQkJCWZhaWwoImJvZ3VzIGFycmF5OiAiICsgQXJyYXlzLnRvU3RyaW5nKG5ld0FycmF5KSk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRDb2xsZWN0aW9uX0VtcHR5Q29sbGVjdGlvbigpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAxLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYWJsZV9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAxLCBpdGVyYWJsZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYWJsZV9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDAsIGl0ZXJhYmxlKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhYmxlX0VtcHR5SXRlcmFibGUoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAxLCBpdGVyYWJsZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVJbnRfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgaXRlcmFibGUsIDMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVJbnRfRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBpdGVyYWJsZSwgMyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYWJsZUludF9FbXB0eUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgaXRlcmFibGUsIDApOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhdG9yX1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgaXRlcmF0b3IpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmF0b3JfRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDAsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhdG9yX0VtcHR5SXRlcmFibGUoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgaXRlcmF0b3IpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhdG9ySW50X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgaXRlcmF0b3IsIDMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmF0b3JJbnRfRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDAsIGl0ZXJhdG9yLCAzKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhdG9ySW50X0VtcHR5SXRlcmF0b3IoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgaXRlcmF0b3IsIDApOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgaXRlcmFibGUpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmFibGVJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBpdGVyYWJsZSwgMzMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3JfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBpdGVyYXRvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYXRvcl9PYmplY3QoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkT2JqZWN0TGlzdDEoKS5pdGVyYXRvcigpOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkT2JqZWN0TGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUl0ZXJhdG9yX0VtcHR5SXRlcmF0b3IoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgaXRlcmF0b3IpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkT2JqZWN0TGlzdDEoKS5pdGVyYXRvcigpOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGl0ZXJhdG9yLCAzKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkT2JqZWN0TGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUl0ZXJhdG9ySW50X0VtcHR5SXRlcmF0b3IoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgaXRlcmF0b3IsIDApOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfT2JqZWN0KCkgewotCQlPYmplY3RbXSBhMSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJT2JqZWN0W10gYTIgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCk7Ci0JCU9iamVjdFtdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYTEsIGEyKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMSkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhMSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJU3RyaW5nW10gYTIgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYTEsIGEyKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCAoT2JqZWN0W10pIGExKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgKE9iamVjdFtdKSBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X09iamVjdFN0cmluZygpIHsKLQkJT2JqZWN0W10gYTEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCVN0cmluZ1tdIGEyID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MigpOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGExLCAoT2JqZWN0W10pIGEyKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMSkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIChPYmplY3RbXSkgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJT2JqZWN0W10gYTEgPSBuZXcgT2JqZWN0WzBdOwotCQlPYmplY3RbXSBhMiA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhMSwgYTIpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfRW1wdHlBcnJheTIoKSB7Ci0JCU9iamVjdFtdIGExID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlPYmplY3RbXSBhMiA9IG5ldyBPYmplY3RbMF07Ci0JCU9iamVjdFtdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYTEsIGEyKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMiwgbmV3IE9iamVjdFtdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJYIiwgIlgiLCAiWCIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiWCIsICJYIiwgIlgiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfT2JqZWN0U3RyaW5nKCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAyLCAoT2JqZWN0W10pIG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiWCIsICJYIiwgIlgiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfRW5kKCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCA0LCAoT2JqZWN0W10pIG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiwgIlgiLCAiWCIsICJYIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfWmVybygpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbMF07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCAoT2JqZWN0W10pIG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5X0VtcHR5QXJyYXkyKCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCA0LCAoT2JqZWN0W10pIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoNCwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gQXJyYXlUb29scy5hZGRBbGwodGhpcy5idWlsZENoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsgJ2QnLCAnZScgfSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdlJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlDaGFyQXJyYXlfRW1wdHlBcnJheTIoKSB7Ci0JCWNoYXJbXSBhID0gQXJyYXlUb29scy5hZGRBbGwodGhpcy5idWlsZENoYXJBcnJheSgpLCBuZXcgY2hhclswXSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENoYXJBcnJheUNoYXJBcnJheUVtcHR5QXJyYXkxKCkgewotCQljaGFyW10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKG5ldyBjaGFyWzBdLCBuZXcgY2hhcltdIHsgJ2QnLCAnZScgfSk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdlJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlJbnRDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJyB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMiwgbmV3IGNoYXJbXSB7ICdYJywgJ1gnLCAnWCcgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnWCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdiJywgJ1gnLCAnWCcsICdYJywgJ2MnLCAnZCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlJbnRDaGFyQXJyYXlfRW5kKCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDQsIG5ldyBjaGFyW10geyAnWCcsICdYJywgJ1gnIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnWCcsICdYJywgJ1gnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5SW50Q2hhckFycmF5X0VtcHR5QXJyYXkxKCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyWzBdOwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMCwgbmV3IGNoYXJbXSB7ICdYJywgJ1gnLCAnWCcgfSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnWCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnWCcsICdYJywgJ1gnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5SW50Q2hhckFycmF5X0VtcHR5QXJyYXkyKCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBjaGFyWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRBcnJheUludEFycmF5KCkgewotCQlpbnRbXSBhID0gQXJyYXlUb29scy5hZGRBbGwodGhpcy5idWlsZEludEFycmF5KCksIG5ldyBpbnRbXSB7IDMwLCA0MCB9KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA0MCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRBcnJheUludEFycmF5X0VtcHR5QXJyYXkyKCkgewotCQlpbnRbXSBhID0gQXJyYXlUb29scy5hZGRBbGwodGhpcy5idWlsZEludEFycmF5KCksIG5ldyBpbnRbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRBcnJheUludEFycmF5X0VtcHR5QXJyYXkxKCkgewotCQlpbnRbXSBhID0gQXJyYXlUb29scy5hZGRBbGwobmV3IGludFswXSwgbmV3IGludFtdIHsgMzAsIDQwIH0pOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgMzApKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDQwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbEludEFycmF5SW50SW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAyLCBuZXcgaW50W10geyA5OSwgOTksIDk5IH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgOTkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDEsIDIsIDk5LCA5OSwgOTksIDMsIDQgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRBcnJheUludEludEFycmF5X0VuZCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDQsIG5ldyBpbnRbXSB7IDk5LCA5OSwgOTkgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA5OSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMSwgMiwgMywgNCwgOTksIDk5LCA5OSB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbEludEFycmF5SW50SW50QXJyYXlfRW1wdHlBcnJheTIoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAyLCBuZXcgaW50WzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRBcnJheUludEludEFycmF5X0VtcHR5QXJyYXkxKCkgewotCQlpbnRbXSBhID0gbmV3IGludFswXTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDAsIG5ldyBpbnRbXSB7IDk5LCA5OSwgOTkgfSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA5OSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgOTksIDk5LCA5OSB9LCBhKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsZWFyICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhck9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5jbGVhcihhKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJPYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLmNsZWFyKGEpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25jYXRlbmF0ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0ZW5hdGVPYmplY3RBcnJheUFycmF5KCkgewotCQlTdHJpbmdbXSBhQXJyYXkgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJU3RyaW5nW10gZUFycmF5ID0gbmV3IFN0cmluZ1tdIHsgImUiLCAiZiIsICJnIiwgImgiIH07Ci0JCVN0cmluZ1tdIGlBcnJheSA9IG5ldyBTdHJpbmdbXSB7ICJpIiwgImoiLCAiayIsICJsIiB9OwotCi0JCVN0cmluZ1tdIGV4cGVjdGVkID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiB9OwotCQlTdHJpbmdbXSBhY3R1YWwgPSBBcnJheVRvb2xzLmNvbmNhdGVuYXRlKGFBcnJheSwgZUFycmF5LCBpQXJyYXkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25jYXRlbmF0ZU9iamVjdEFycmF5QXJyYXlfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGFBcnJheSA9IG5ldyBTdHJpbmdbXSB7ICB9OwotCQlTdHJpbmdbXSBlQXJyYXkgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBpQXJyYXkgPSBuZXcgU3RyaW5nWzBdOwotCi0JCVN0cmluZ1tdIGV4cGVjdGVkID0gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gYWN0dWFsID0gQXJyYXlUb29scy5jb25jYXRlbmF0ZShhQXJyYXksIGVBcnJheSwgaUFycmF5KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFjdHVhbC5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25jYXRlbmF0ZUNoYXJBcnJheUFycmF5KCkgewotCQljaGFyW10gYUFycmF5ID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJyB9OwotCQljaGFyW10gZUFycmF5ID0gbmV3IGNoYXJbXSB7ICdlJywgJ2YnLCAnZycsICdoJyB9OwotCQljaGFyW10gaUFycmF5ID0gbmV3IGNoYXJbXSB7ICdpJywgJ2onLCAnaycsICdsJyB9OwotCi0JCWNoYXJbXSBleHBlY3RlZCA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnIH07Ci0JCWNoYXJbXSBhY3R1YWwgPSBBcnJheVRvb2xzLmNvbmNhdGVuYXRlKGFBcnJheSwgZUFycmF5LCBpQXJyYXkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25jYXRlbmF0ZUNoYXJBcnJheUFycmF5X0VtcHR5KCkgewotCQljaGFyW10gYUFycmF5ID0gbmV3IGNoYXJbXSB7ICB9OwotCQljaGFyW10gZUFycmF5ID0gbmV3IGNoYXJbMF07Ci0JCWNoYXJbXSBpQXJyYXkgPSBuZXcgY2hhclswXTsKLQotCQljaGFyW10gZXhwZWN0ZWQgPSBuZXcgY2hhclswXTsKLQkJY2hhcltdIGFjdHVhbCA9IEFycmF5VG9vbHMuY29uY2F0ZW5hdGUoYUFycmF5LCBlQXJyYXksIGlBcnJheSk7Ci0JCWFzc2VydEVxdWFscygwLCBhY3R1YWwubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0ZW5hdGVJbnRBcnJheUFycmF5KCkgewotCQlpbnRbXSBhQXJyYXkgPSBuZXcgaW50W10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJaW50W10gZUFycmF5ID0gbmV3IGludFtdIHsgJ2UnLCAnZicsICdnJywgJ2gnIH07Ci0JCWludFtdIGlBcnJheSA9IG5ldyBpbnRbXSB7ICdpJywgJ2onLCAnaycsICdsJyB9OwotCi0JCWludFtdIGV4cGVjdGVkID0gbmV3IGludFtdIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJyB9OwotCQlpbnRbXSBhY3R1YWwgPSBBcnJheVRvb2xzLmNvbmNhdGVuYXRlKGFBcnJheSwgZUFycmF5LCBpQXJyYXkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25jYXRlbmF0ZUludEFycmF5QXJyYXlfRW1wdHkoKSB7Ci0JCWludFtdIGFBcnJheSA9IG5ldyBpbnRbXSB7ICB9OwotCQlpbnRbXSBlQXJyYXkgPSBuZXcgaW50WzBdOwotCQlpbnRbXSBpQXJyYXkgPSBuZXcgaW50WzBdOwotCi0JCWludFtdIGV4cGVjdGVkID0gbmV3IGludFswXTsKLQkJaW50W10gYWN0dWFsID0gQXJyYXlUb29scy5jb25jYXRlbmF0ZShhQXJyYXksIGVBcnJheSwgaUFycmF5KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFjdHVhbC5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250YWlucyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNPYmplY3RBcnJheU9iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgbnVsbCkpOwotCQlPYmplY3RbXSBhMiA9IEFycmF5VG9vbHMuYWRkKGEsIG51bGwpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYTIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNPYmplY3RBcnJheU9iamVjdF9FbXB0eUFycmF5KCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFswXTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCAib25lIikpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdhJykpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICd6JykpOwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLmFkZChhLCAneicpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYTIsICd6JykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0NoYXJBcnJheU9iamVjdF9FbXB0eUFycmF5KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyWzBdOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdhJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0ludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAxMCkpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDU1KSk7Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5hZGQoYSwgNTUpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYTIsIDU1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zSW50QXJyYXlPYmplY3RfRW1wdHlBcnJheSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbMF07Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2EnKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5zIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheUNvbGxlY3Rpb24oKSB7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbE9iamVjdEFycmF5SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgaXRlcmFibGUpKTsKLQkJaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsT2JqZWN0QXJyYXlJdGVyYXRvcigpIHsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbE9iamVjdEFycmF5SXRlcmF0b3JfRW1wdHkoKSB7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbE9iamVjdEFycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZENoYXJBcnJheSgpLCB0aGlzLmJ1aWxkQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkQ2hhckFycmF5KCksIG5ldyBjaGFyW10geyAneCcsICd5JyB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSW50QXJyYXlJbnRBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRJbnRBcnJheSgpLCB0aGlzLmJ1aWxkSW50QXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRJbnRBcnJheSgpLCBuZXcgaW50W10geyA0NDQsIDg4OCB9KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpZmYgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdERpZmZFbmQoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gbmV3IFN0cmluZygiYSIpOwotCQlTdHJpbmcgYl8gPSBuZXcgU3RyaW5nKCJiIik7Ci0JCVN0cmluZyBjXyA9IG5ldyBTdHJpbmcoImMiKTsKLQkJU3RyaW5nIGRfID0gbmV3IFN0cmluZygiZCIpOwotCQlTdHJpbmcgZV8gPSBuZXcgU3RyaW5nKCJlIik7Ci0JCWFzc2VydFRydWUoKGEgIT0gYV8pICYmIGEuZXF1YWxzKGFfKSk7Ci0JCWFzc2VydFRydWUoKGIgIT0gYl8pICYmIGIuZXF1YWxzKGJfKSk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFzc2VydFRydWUoKGQgIT0gZF8pICYmIGQuZXF1YWxzKGRfKSk7Ci0JCWFzc2VydFRydWUoKGUgIT0gZV8pICYmIGUuZXF1YWxzKGVfKSk7Ci0JCVN0cmluZ1tdIGFycmF5MTsKLQkJU3RyaW5nW10gYXJyYXkyOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGFfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDMsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlmZlJhbmdlKCkgewotCQlTdHJpbmcgYSA9ICJhIjsKLQkJU3RyaW5nIGIgPSAiYiI7Ci0JCVN0cmluZyBjID0gImMiOwotCQlTdHJpbmcgZCA9ICJkIjsKLQkJU3RyaW5nIGUgPSAiZSI7Ci0JCVN0cmluZyBhXyA9IGE7Ci0JCVN0cmluZyBiXyA9IGI7Ci0JCVN0cmluZyBjXyA9IGM7Ci0JCVN0cmluZyBkXyA9IGQ7Ci0JCVN0cmluZyBlXyA9IGU7Ci0JCWFzc2VydFRydWUoKGEgPT0gYV8pICYmIGEuZXF1YWxzKGFfKSk7Ci0JCWFzc2VydFRydWUoKGIgPT0gYl8pICYmIGIuZXF1YWxzKGJfKSk7Ci0JCWFzc2VydFRydWUoKGMgPT0gY18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFzc2VydFRydWUoKGQgPT0gZF8pICYmIGQuZXF1YWxzKGRfKSk7Ci0JCWFzc2VydFRydWUoKGUgPT0gZV8pICYmIGUuZXF1YWxzKGVfKSk7Ci0JCVN0cmluZ1tdIGFycmF5MTsKLQkJU3RyaW5nW10gYXJyYXkyOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoNSwgLTEpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgxLCAtMSksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgLTEpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBhXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgMiksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDApLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgzLCAzKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDIsIDIpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSg1LCAtMSksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpZmZTdGFydCgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBuZXcgU3RyaW5nKCJhIik7Ci0JCVN0cmluZyBiXyA9IG5ldyBTdHJpbmcoImIiKTsKLQkJU3RyaW5nIGNfID0gbmV3IFN0cmluZygiYyIpOwotCQlTdHJpbmcgZF8gPSBuZXcgU3RyaW5nKCJkIik7Ci0JCVN0cmluZyBlXyA9IG5ldyBTdHJpbmcoImUiKTsKLQkJYXNzZXJ0VHJ1ZSgoYSAhPSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiAhPSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCAhPSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSAhPSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMoMSwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBlXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDMsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfXykpOwotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY19fLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIG51bGwsIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaWRlbnRpdHkgZGlmZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlEaWZmRW5kKCkgewotCQlTdHJpbmcgYSA9ICJhIjsKLQkJU3RyaW5nIGIgPSAiYiI7Ci0JCVN0cmluZyBjID0gImMiOwotCQlTdHJpbmcgZCA9ICJkIjsKLQkJU3RyaW5nIGUgPSAiZSI7Ci0JCVN0cmluZyBhXyA9IGE7Ci0JCVN0cmluZyBiXyA9IGI7Ci0JCVN0cmluZyBjXyA9IGM7Ci0JCVN0cmluZyBkXyA9IGQ7Ci0JCVN0cmluZyBlXyA9IGU7Ci0JCWFzc2VydFRydWUoKGEgPT0gYV8pICYmIGEuZXF1YWxzKGFfKSk7Ci0JCWFzc2VydFRydWUoKGIgPT0gYl8pICYmIGIuZXF1YWxzKGJfKSk7Ci0JCWFzc2VydFRydWUoKGMgPT0gY18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFzc2VydFRydWUoKGQgPT0gZF8pICYmIGQuZXF1YWxzKGRfKSk7Ci0JCWFzc2VydFRydWUoKGUgPT0gZV8pICYmIGUuZXF1YWxzKGVfKSk7Ci0JCVN0cmluZ1tdIGFycmF5MTsKLQkJU3RyaW5nW10gYXJyYXkyOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfIH07Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGJfLCBjXywgYV8sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDMsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJU3RyaW5nIGNfXyA9IG5ldyBTdHJpbmcoYyk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY19fKSAmJiBjLmVxdWFscyhjXykpOwotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY19fLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIG51bGwsIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aXR5RGlmZlJhbmdlKCkgewotCQlTdHJpbmcgYSA9ICJhIjsKLQkJU3RyaW5nIGIgPSAiYiI7Ci0JCVN0cmluZyBjID0gImMiOwotCQlTdHJpbmcgZCA9ICJkIjsKLQkJU3RyaW5nIGUgPSAiZSI7Ci0JCVN0cmluZyBhXyA9IGE7Ci0JCVN0cmluZyBiXyA9IGI7Ci0JCVN0cmluZyBjXyA9IGM7Ci0JCVN0cmluZyBkXyA9IGQ7Ci0JCVN0cmluZyBlXyA9IGU7Ci0JCWFzc2VydFRydWUoKGEgPT0gYV8pICYmIGEuZXF1YWxzKGFfKSk7Ci0JCWFzc2VydFRydWUoKGIgPT0gYl8pICYmIGIuZXF1YWxzKGJfKSk7Ci0JCWFzc2VydFRydWUoKGMgPT0gY18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFzc2VydFRydWUoKGQgPT0gZF8pICYmIGQuZXF1YWxzKGRfKSk7Ci0JCWFzc2VydFRydWUoKGUgPT0gZV8pICYmIGUuZXF1YWxzKGVfKSk7Ci0JCVN0cmluZ1tdIGFycmF5MTsKLQkJU3RyaW5nW10gYXJyYXkyOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoNSwgLTEpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDEsIC0xKSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgLTEpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGFfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCAyKSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCAwKSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgzLCAzKSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMiwgMiksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDIsIDIpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIG51bGwsIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZTdGFydCgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgZV8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDMsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJU3RyaW5nIGNfXyA9IG5ldyBTdHJpbmcoYyk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY19fKSAmJiBjLmVxdWFscyhjXykpOwotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY19fLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZWxlbWVudHMgYXJlIGlkZW50aWNhbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVJZGVudGljYWxPYmplY3RBcnJheU9iamVjdEFycmF5KCkgewotCQlPYmplY3RbXSBhMSA9IG5ldyBPYmplY3RbNF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWExW2ldID0gU3RyaW5nLnZhbHVlT2YoaSAqIDEwMDApOwotCQl9Ci0KLQkJT2JqZWN0W10gYTIgPSBuZXcgT2JqZWN0W2ExLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTIubGVuZ3RoOyBpKyspIHsKLQkJCWEyW2ldID0gYTFbaV07Ci0JCX0KLQotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwoYTEsIGEyKSk7Ci0JCWEyWzJdID0gIjIwMDAiOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGExLCBhMikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9Cb3RoTnVsbCgpIHsKLQkJT2JqZWN0W10gYTEgPSBudWxsOwotCQlPYmplY3RbXSBhMiA9IG51bGw7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5lbGVtZW50c0FyZUlkZW50aWNhbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVJZGVudGljYWxPYmplY3RBcnJheU9iamVjdEFycmF5X09uZU51bGwoKSB7Ci0JCU9iamVjdFtdIGExID0gbnVsbDsKLQkJT2JqZWN0W10gYTIgPSBuZXcgT2JqZWN0WzBdOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUlkZW50aWNhbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfRGlmZmVyZW50TGVuZ3RocygpIHsKLQkJT2JqZWN0W10gYTEgPSBuZXcgU3RyaW5nW10geyJmb28iLCAiYmFyIn07Ci0JCU9iamVjdFtdIGEyID0gbmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciIsICJiYXoifTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5lbGVtZW50c0FyZUlkZW50aWNhbChhMSwgYTIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5kZXggb2YgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZPYmplY3RBcnJheU9iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAib25lIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTm90Rm91bmQoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5pbmRleE9mKGEsICJ0d2VudHkiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZPYmplY3RBcnJheU9iamVjdF9OdWxsKCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZPYmplY3RBcnJheU9iamVjdF9OdWxsX05vdEZvdW5kKCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aXR5SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0KCkgewotCQlTdHJpbmcgZm9vID0gImZvbyI7Ci0JCVN0cmluZyBiYXIgPSAiYmFyIjsKLQkJU3RyaW5nIGJheiA9ICJiYXoiOwotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFszXTsKLQkJYVswXSA9IGZvbzsKLQkJYVsxXSA9IGJhcjsKLQkJYVsyXSA9IGJhejsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMuaWRlbnRpdHlJbmRleE9mKGEsIGJhcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eUluZGV4T2ZPYmplY3RBcnJheU9iamVjdF9Ob3RGb3VuZCgpIHsKLQkJU3RyaW5nIGZvbyA9ICJmb28iOwotCQlTdHJpbmcgYmFyID0gImJhciI7Ci0JCVN0cmluZyBiYXogPSAiYmF6IjsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbM107Ci0JCWFbMF0gPSBmb287Ci0JCWFbMV0gPSBiYXI7Ci0JCWFbMl0gPSBiYXo7Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5pZGVudGl0eUluZGV4T2YoYSwgbmV3IFN0cmluZygiYmFyIikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkNoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQXJyYXlUb29scy5pbmRleE9mKGEsICdiJykpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgJ2QnKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQXJyYXlUb29scy5pbmRleE9mKGEsICdkJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mQ2hhckFycmF5Q2hhcl9Ob3RGb3VuZCgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5pbmRleE9mKGEsICd6JykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAxMCkpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMzApOwotCQlhc3NlcnRFcXVhbHMoYS5sZW5ndGggLSAxLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgMzApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkludEFycmF5SW50X05vdEZvdW5kKCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5pbmRleE9mKGEsIDEwMDApKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5zZXJ0aW9uIGluZGV4IG9mICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnRpb25JbmRleE9mT2JqZWN0QXJyYXlDb21wYXJhYmxlKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoMSwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJCIikpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJCIiwgIkIiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJCIikpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkIiLCAiQiIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscyg2LCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkUiKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiQiIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkEiKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0aW9uSW5kZXhPZk9iamVjdEFycmF5T2JqZWN0Q29tcGFyYXRvcigpIHsKLQkJQ29tcGFyYXRvcjxTdHJpbmc+IGMgPSBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJBIiB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJCIiwgYykpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQSIgfTsKLQkJYXNzZXJ0RXF1YWxzKDMsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIsIGMpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIsICJBIiB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJCIiwgYykpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiwgIkEiIH07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkUiLCBjKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiIH07Ci0JCWFzc2VydEVxdWFscyg1LCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkEiLCBjKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkEiLCAiQSIgfTsKLQkJYXNzZXJ0RXF1YWxzKDYsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQSIsIGMpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGFzdCBpbmRleCBvZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZPYmplY3RBcnJheU9iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgIm9uZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZPYmplY3RBcnJheU9iamVjdF9Ob3RGb3VuZCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsICJ0d2VudHkiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTnVsbCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYS5sZW5ndGggLSAxLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZPYmplY3RBcnJheU9iamVjdF9OdWxsX05vdEZvdW5kKCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZkNoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCAnYicpKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgJ2QnKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mQ2hhckFycmF5Q2hhcl9Ob3RGb3VuZCgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCAneicpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCAxMCkpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMzApOwotCQlhc3NlcnRFcXVhbHMoYS5sZW5ndGggLSAxLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsIDMwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSW50QXJyYXlJbnRfTm90Rm91bmQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsIDEwMDApKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWluL21heCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TWluQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoJ2EnLCBBcnJheVRvb2xzLm1pbih0aGlzLmJ1aWxkQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWluQ2hhckFycmF5X0V4Y2VwdGlvbigpIHsKLQkJY2hhcltdIGFycmF5ID0gbmV3IGNoYXJbMF07Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWNoYXIgYyA9IEFycmF5VG9vbHMubWluKGFycmF5KTsKLQkJCWZhaWwoImJvZ3VzIGNoYXI6ICIgKyBjKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaW5JbnRBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMubWluKHRoaXMuYnVpbGRJbnRBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pbkludEFycmF5X0V4Y2VwdGlvbigpIHsKLQkJaW50W10gYXJyYXkgPSBuZXcgaW50WzBdOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpbnQgaSA9IEFycmF5VG9vbHMubWluKGFycmF5KTsKLQkJCWZhaWwoImJvZ3VzIGludDogIiArIGkpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1heENoYXJBcnJheTEoKSB7Ci0JCWFzc2VydEVxdWFscygnYycsIEFycmF5VG9vbHMubWF4KHRoaXMuYnVpbGRDaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXhDaGFyQXJyYXkyKCkgewotCQljaGFyW10gYXJyYXkgPSBuZXcgY2hhcltdIHsgJ3gnLCAnYScsICdiJywgJ2MnIH07Ci0JCWFzc2VydEVxdWFscygneCcsIEFycmF5VG9vbHMubWF4KGFycmF5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1heENoYXJBcnJheV9FeGNlcHRpb24oKSB7Ci0JCWNoYXJbXSBhcnJheSA9IG5ldyBjaGFyWzBdOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQljaGFyIGMgPSBBcnJheVRvb2xzLm1heChhcnJheSk7Ci0JCQlmYWlsKCJib2d1cyBjaGFyOiAiICsgYyk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWF4SW50QXJyYXkxKCkgewotCQlhc3NlcnRFcXVhbHMoMjAsIEFycmF5VG9vbHMubWF4KHRoaXMuYnVpbGRJbnRBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1heEludEFycmF5MigpIHsKLQkJaW50W10gYXJyYXkgPSBuZXcgaW50W10geyA3NywgMywgMSwgLTMgfTsKLQkJYXNzZXJ0RXF1YWxzKDc3LCBBcnJheVRvb2xzLm1heChhcnJheSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXhJbnRBcnJheV9FeGNlcHRpb24oKSB7Ci0JCWludFtdIGFycmF5ID0gbmV3IGludFswXTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaW50IGkgPSBBcnJheVRvb2xzLm1heChhcnJheSk7Ci0JCQlmYWlsKCJib2d1cyBpbnQ6ICIgKyBpKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb3ZlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlT2JqZWN0QXJyYXlJbnRJbnQoKSB7Ci0JCVN0cmluZ1tdIGFycmF5ID0gbmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiB9OwotCi0JCVN0cmluZ1tdIHJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgNCwgMik7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjMiLCAiNCIsICIyIiwgIjUiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMCwgNSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMiwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjQiLCAiMSIsICIzIiwgIjIiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgNCwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjQiLCAiMSIsICIzIiwgIjIiIH0sIHJlc3VsdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlT2JqZWN0QXJyYXlJbnRJbnRJbnQoKSB7Ci0JCVN0cmluZ1tdIGFycmF5ID0gbmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiB9OwotCi0JCVN0cmluZ1tdIHJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjMiLCAiNCIsICIyIiwgIjUiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMCwgNSwgMSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMiwgNCwgMSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjQiLCAiMSIsICIzIiwgIjIiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMCwgMSwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIzIiwgIjIiLCAiNCIsICI1IiwgIjEiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMSwgMCwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMSwgMCwgMCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSW50QXJyYXlJbnRJbnQoKSB7Ci0JCWludFtdIGFycmF5ID0gbmV3IGludFtdIHsgMCwgMSwgMiwgMywgNCwgNSB9OwotCi0JCWludFtdIHJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgNCwgMik7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAwLCAxLCAzLCA0LCAyLCA1IH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMCwgNSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA1LCAwLCAxLCAzLCA0LCAyIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMiwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA1LCAwLCA0LCAxLCAzLCAyIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMiwgMik7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA1LCAwLCA0LCAxLCAzLCAyIH0sIHJlc3VsdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSW50QXJyYXlJbnRJbnRJbnQoKSB7Ci0JCWludFtdIGFycmF5ID0gbmV3IGludFtdIHsgMCwgMSwgMiwgMywgNCwgNSB9OwotCi0JCWludFtdIHJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAwLCAxLCAzLCA0LCAyLCA1IH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMCwgNSwgMSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA1LCAwLCAxLCAzLCA0LCAyIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMiwgNCwgMSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA1LCAwLCA0LCAxLCAzLCAyIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA1LCAwLCAzLCAyLCA0LCAxIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMCwgMSwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAwLCAzLCAyLCA0LCA1LCAxIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMSwgMCwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA1LCAwLCAzLCAyLCA0LCAxIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA1LCAwLCAzLCAyLCA0LCAxIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMSwgMCwgMCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA1LCAwLCAzLCAyLCA0LCAxIH0sIHJlc3VsdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQ2hhckFycmF5SW50SW50KCkgewotCQljaGFyW10gYXJyYXkgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJyB9OwotCi0JCWNoYXJbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnZCcsICdlJywgJ2MnLCAnZicgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAwLCA1KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZicsICdhJywgJ2InLCAnZCcsICdlJywgJ2MnIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMiwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2YnLCAnYScsICdlJywgJ2InLCAnZCcsICdjJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdmJywgJ2EnLCAnZScsICdiJywgJ2QnLCAnYycgfSwgcmVzdWx0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVDaGFyQXJyYXlJbnRJbnRJbnQoKSB7Ci0JCWNoYXJbXSBhcnJheSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2InLCAnYycsICdkJywgJ2UnIH07Ci0KLQkJY2hhcltdIHJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnYicsICdlJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdlJywgJ2EnLCAnYicsICdjJywgJ2QnLCAnYicgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2QnLCAnYicsICdjJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2UnLCAnYScsICdjJywgJ2InLCAnZCcsICdiJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2MnLCAnYicsICdkJywgJ2UnLCAnYicgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2MnLCAnYicsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2UnLCAnYScsICdjJywgJ2InLCAnZCcsICdiJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdlJywgJ2EnLCAnYycsICdiJywgJ2QnLCAnYicgfSwgcmVzdWx0KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlT2JqZWN0QXJyYXlPYmplY3RfT2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgInRocmVlIik7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAiZm91ciIpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgImZpdmUiKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgInRocmVlIikpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmUoYSwgInRocmVlIik7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgInRocmVlIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgImZvdXIiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiZml2ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlT2JqZWN0QXJyYXlPYmplY3RfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgInRocmVlIik7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAiZm91ciIpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgImZpdmUiKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgInRocmVlIikpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmUoYSwgInRocmVlIik7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgInRocmVlIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgImZvdXIiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiZml2ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAnZCcpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgJ2UnKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdmJyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdkJykpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmUoYSwgJ2QnKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCAnZCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdlJykpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2YnKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAzMCk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA0MCk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA1MCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZShhLCAzMCk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgMzApKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDQwKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA1MCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgYWxsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJU3RyaW5nW10gYTIgPSBuZXcgU3RyaW5nW10geyAiRSIsICJCIiB9OwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCAoT2JqZWN0W10pIGEyKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJGIiwgIkYiIH0sIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlTdHJpbmdbXSBhMiA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIChPYmplY3RbXSkgYTIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfTm9NYXRjaGVzKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJU3RyaW5nW10gYTIgPSBuZXcgU3RyaW5nW10geyAiWCIsICJZIiwgIloiIH07Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIChPYmplY3RbXSkgYTIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5SXRlcmFibGUoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYWJsZTw/PiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGl0ZXJhYmxlKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJGIiwgIkYiIH0sIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5SXRlcmFibGVJbnQoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYWJsZTw/PiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGl0ZXJhYmxlLCA3KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJGIiwgIkYiIH0sIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5SXRlcmF0b3IoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYWJsZTw/PiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkYiLCAiRiIgfSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlJdGVyYXRvcl9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhYmxlPD8+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgaXRlcmFibGUuaXRlcmF0b3IoKSwgNyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUl0ZXJhdG9ySW50X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpLCA3KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUNvbGxlY3Rpb24oKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGNvbGxlY3Rpb24pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkYiLCAiRiIgfSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX0VtcHR5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX05vTWF0Y2hlcygpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJZIiwgIloiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDaGFyQXJyYXlDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnQScsICdBJywgJ0InLCAnQicsICdDJywgJ0MnLCAnRCcsICdEJywgJ0UnLCAnRScsICdGJywgJ0YnIH07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyW10geyAnRScsICdCJyB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdBJywgJ0EnLCAnQycsICdDJywgJ0QnLCAnRCcsICdGJywgJ0YnIH0sIEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ2hhckFycmF5Q2hhckFycmF5X0VtcHR5MSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbMF07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyW10geyAnRScsICdCJyB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ2hhckFycmF5Q2hhckFycmF5X0VtcHR5MigpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdBJywgJ0EnLCAnQicsICdCJywgJ0MnLCAnQycsICdEJywgJ0QnLCAnRScsICdFJywgJ0YnLCAnRicgfTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbMF07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDaGFyQXJyYXlDaGFyQXJyYXlfTm9NYXRjaGVzKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQScsICdCJywgJ0InLCAnQycsICdDJywgJ0QnLCAnRCcsICdFJywgJ0UnLCAnRicsICdGJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ1gnLCAnWicgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbEludEFycmF5SW50QXJyYXkoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiB9OwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbXSB7IDUsIDIgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDEsIDEsIDMsIDMsIDQsIDQsIDYsIDYgfSwgQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxJbnRBcnJheUludEFycmF5X0VtcHR5MSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50WzBdOwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbXSB7IDUsIDIgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbEludEFycmF5SW50QXJyYXlfRW1wdHkyKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYgfTsKLQkJaW50W10gYTIgPSBuZXcgaW50WzBdOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsSW50QXJyYXlJbnRBcnJheV9Ob01hdGNoZXMoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiB9OwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbXSB7IDUyLCA2NyB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNPYmplY3RBcnJheU9iamVjdCgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgInRocmVlIik7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJ0d28iKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgInR3byIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCi0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAiZml2ZSIpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgImZpdmUiKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJmaXZlIik7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJmaXZlIik7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJmaXZlIik7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0KLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIG51bGwpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgbnVsbCk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc09iamVjdEFycmF5T2JqZWN0X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgInRocmVlIik7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdiJyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdiJyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0KLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdnJyk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAnZycpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgJ2cnKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgJ2cnKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgJ2cnKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXlDaGFyX0VtcHR5KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyWzBdOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnYScpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc0ludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDU1KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgMTApOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAxMCk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0KLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDc3KTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDc3KTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDc3KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgNzcpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCA3Nyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzSW50QXJyYXlJbnRfRW1wdHkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50WzBdOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAyMik7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBkdXBsaWNhdGUgZWxlbWVudHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzT2JqZWN0QXJyYXkoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJbGlzdC5hZGQoInR3byIpOwotCQlsaXN0LmFkZCgiemVybyIpOwotCQlTdHJpbmdbXSBhcnJheSA9IEFycmF5VG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKSk7Ci0JCWludCBpID0gMDsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgYXJyYXlbaSsrXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYXJyYXlbaSsrXSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYXJyYXlbaSsrXSk7Ci0JCWFzc2VydEVxdWFscyhpLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c09iamVjdEFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IEFycmF5VG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c09iamVjdEFycmF5X1NpbmdsZUVsZW1lbnQoKSB7Ci0JCVN0cmluZ1tdIGFycmF5ID0gQXJyYXlUb29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhuZXcgU3RyaW5nW10geyAiZm9vIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzT2JqZWN0QXJyYXlfTm9EdXBsaWNhdGVzKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJmb28iLCAiYmFyIiwgImJheiIgfTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGExKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEyLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnQgYXQgaW5kZXggKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRBdEluZGV4T2JqZWN0QXJyYXlJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRBdEluZGV4KGEsIDMpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkEiLCAiRCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50QXRJbmRleENoYXJBcnJheUludCgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0MnLCAnQScsICdEJyB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50QXRJbmRleChhLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQScsICdEJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRBdEluZGV4SW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyA4LCA2LCA3LCAzMywgMiwgMTEgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDMsIDMpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgOCwgNiwgNyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZpcnN0T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUZpcnN0KGEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdENoYXJBcnJheSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0MnLCAnQScsICdEJyB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVGaXJzdChhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnQicsICdBJywgJ0MnLCAnQScsICdEJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZpcnN0SW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyA4LCA2LCA3LCAzMywgMiwgMTEgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRmlyc3QoYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA2LCA3LCAzMywgMiwgMTEgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMYXN0T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUxhc3QoYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUxhc3RDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlTGFzdChhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUxhc3RJbnRBcnJheSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDgsIDYsIDcsIDMzLCAyLCAxMSB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVMYXN0KGEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgOCwgNiwgNywgMzMsIDIgfSwgYSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZWxlbWVudHMgYXQgaW5kZXggKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRzQXRJbmRleE9iamVjdEFycmF5SW50SW50KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMywgMik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiRCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhPYmplY3RBcnJheUludEludF9aZXJvTGVuZ3RoKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhMSwgMywgMCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4T2JqZWN0QXJyYXlJbnRJbnRfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhLCAwLCA2KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4Q2hhckFycmF5SW50SW50KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhLCAwLCA1KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnRCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhDaGFyQXJyYXlJbnRJbnRfWmVyb0xlbmd0aCgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYTEsIDMsIDApOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRzQXRJbmRleENoYXJBcnJheUludEludF9FbXB0eSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0MnLCAnQScsICdEJyB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMCwgNik7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRzQXRJbmRleEludEFycmF5SW50SW50KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgOCwgNiwgNywgMzMsIDIsIDExIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhLCAzLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDgsIDYsIDcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhJbnRBcnJheUludEludF9aZXJvTGVuZ3RoKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDgsIDYsIDcsIDMzLCAyLCAxMSB9OwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGExLCAzLCAwKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhJbnRBcnJheUludEludF9FbXB0eSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDgsIDYsIDcsIDMzLCAyLCAxMSB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMCwgNik7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlcGxhY2UgYWxsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQWxsT2JqZWN0QXJyYXlPYmplY3RPYmplY3RfT2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZXBsYWNlQWxsKGEsICJBIiwgIloiKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJaIiwgIkIiLCAiWiIsICJDIiwgIloiLCAiRCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQWxsT2JqZWN0QXJyYXlPYmplY3RPYmplY3RfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZXBsYWNlQWxsKGEsICJBIiwgIloiKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJaIiwgIkIiLCAiWiIsICJDIiwgIloiLCAiRCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQWxsT2JqZWN0QXJyYXlPYmplY3RPYmplY3RfTnVsbCgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7IG51bGwsICJCIiwgbnVsbCwgIkMiLCBudWxsLCAiRCIgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVwbGFjZUFsbChhLCBudWxsLCAiWiIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIloiLCAiQiIsICJaIiwgIkMiLCAiWiIsICJEIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VBbGxDaGFyQXJyYXlDaGFyQ2hhcigpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0MnLCAnQScsICdEJyB9OwotCQlhID0gQXJyYXlUb29scy5yZXBsYWNlQWxsKGEsICdBJywgJ1onKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnWicsICdCJywgJ1onLCAnQycsICdaJywgJ0QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbEludEFycmF5SW50SW50KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMCwgMSwgMCwgNywgMCwgOTkgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVwbGFjZUFsbChhLCAwLCAxMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxMywgMSwgMTMsIDcsIDEzLCA5OSB9LCBhKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJldGFpbiBhbGwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlPYmplY3RbXSBhMiA9IG5ldyBPYmplY3RbXSB7ICJFIiwgIkIiLCBuZXcgSW50ZWdlcig3KSB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJFIiwgIkUiIH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9FbXB0eU9iamVjdEFycmF5MSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMiA9IG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9OwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0VtcHR5T2JqZWN0QXJyYXkyKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9OwotCQlTdHJpbmdbXSBhMiA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfQm90aEVtcHR5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgaXRlcmFibGUpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmFibGVfRW1wdHlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmFibGVJbnQoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkUiLCAiRSIgfSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhYmxlLCAzKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhYmxlSW50X0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkUiLCAiRSIgfSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhdG9yKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhdG9yX0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pLml0ZXJhdG9yKCk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmF0b3JfRW1wdHlJdGVyYXRvcigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nWzBdLCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhdG9ySW50KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkUiLCAiRSIgfSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhdG9yLCAzKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhdG9ySW50X0VtcHR5SXRlcmF0b3IoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgMykpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludF9FbXB0eU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYXRvciwgMyk7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUNvbGxlY3Rpb24oKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJFIiwgIkUiIH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBjb2xsZWN0aW9uKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fRW1wdHlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9BbGwoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiB9KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgY29sbGVjdGlvbikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQScsICdCJywgJ0InLCAnQycsICdDJywgJ0QnLCAnRCcsICdFJywgJ0UnLCAnRicsICdGJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnQicsICdCJywgJ0UnLCAnRScgfSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDaGFyQXJyYXlDaGFyQXJyYXlfRW1wdHlDaGFyQXJyYXkxKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhclswXTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InIH07Ci0JCWFzc2VydFNhbWUoYTEsIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDaGFyQXJyYXlDaGFyQXJyYXlfRW1wdHlDaGFyQXJyYXkyKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicgfTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbMF07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENoYXJBcnJheUNoYXJBcnJheV9SZXRhaW5BbGwoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnRScsICdCJywgJ0UnLCAnQicsICdFJywgJ0InLCAnRScsICdCJywgJ0UnIH07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyW10geyAnRScsICdCJyB9OwotCQlhc3NlcnRTYW1lKGExLCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsSW50QXJyYXlJbnRBcnJheSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2IH07Ci0JCWludFtdIGEyID0gbmV3IGludFtdIHsgNSwgMiB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMiwgMiwgNSwgNSB9LCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbEludEFycmF5SW50QXJyYXlfRW1wdHlJbnRBcnJheTEoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFswXTsKLQkJaW50W10gYTIgPSBuZXcgaW50W10geyA1LCAyIH07Ci0JCWFzc2VydFNhbWUoYTEsIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxJbnRBcnJheUludEFycmF5X0VtcHR5SW50QXJyYXkyKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDUsIDIgfTsKLQkJaW50W10gYTIgPSBuZXcgaW50WzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxJbnRBcnJheUludEFycmF5X1JldGFpbkFsbCgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA1LCAyLCA1LCAyLCA1LCAyLCA1LCAyLCA1LCAyLCA1IH07Ci0JCWludFtdIGEyID0gbmV3IGludFtdIHsgNSwgMiB9OwotCQlhc3NlcnRTYW1lKGExLCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmV2ZXJzZSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZU9iamVjdEFycmF5X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYSA9IEFycmF5VG9vbHMucmV2ZXJzZShhKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VPYmplY3RBcnJheV9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlT2JqZWN0QXJyYXlfU2luZ2xldG9uKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJmb28iIH07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yZXZlcnNlKGExKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlQ2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYSA9IEFycmF5VG9vbHMucmV2ZXJzZShhKTsKLQkJYXNzZXJ0RXF1YWxzKCdjJywgYVswXSk7Ci0JCWFzc2VydEVxdWFscygnYicsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoJ2EnLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUNoYXJBcnJheV9TaW5nbGV0b24oKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnZicgfTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5yZXZlcnNlKGExKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlSW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYSA9IEFycmF5VG9vbHMucmV2ZXJzZShhKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlSW50QXJyYXlfU2luZ2xldG9uKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDcgfTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLnJldmVyc2UoYTEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJvdGF0ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJvdGF0ZShhKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5X1plcm8oKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlfT25lKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJmb28gICIgfTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJvdGF0ZShhLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5SW50X1plcm9EaXN0YW5jZSgpIHsKLQkJU3RyaW5nW10gYTEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEsIDApOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5SW50X05lZ2F0aXZlRGlzdGFuY2UoKSB7Ci0JCVN0cmluZ1tdIGExID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCAtMSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYTJbMF0pOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGEyWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgYTJbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheUludF9aZXJvKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEsIDcpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5SW50X09uZSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiZm9vICAiIH07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEsIDgpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheSgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJvdGF0ZShhKTsKLQkJYXNzZXJ0RXF1YWxzKCdjJywgYVswXSk7Ci0JCWFzc2VydEVxdWFscygnYScsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoJ2InLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5X1plcm8oKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyWzBdOwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5X09uZSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdhJyB9OwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5SW50KCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYSA9IEFycmF5VG9vbHMucm90YXRlKGEsIDIpOwotCQlhc3NlcnRFcXVhbHMoJ2InLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCdjJywgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygnYScsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXlJbnRfWmVyb0Rpc3RhbmNlKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJyB9OwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgMCk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5SW50X05lZ2F0aXZlRGlzdGFuY2UoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSwgLTEpOwotCQlhc3NlcnRFcXVhbHMoJ2InLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCdjJywgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygnYScsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXlJbnRfWmVybygpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbMF07Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCAyMDAxKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXlJbnRfT25lKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ2EnIH07Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCAyMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYSA9IEFycmF5VG9vbHMucm90YXRlKGEpOwotCQlhc3NlcnRFcXVhbHMoMjAsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygxMCwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5X1plcm8oKSB7Ci0JCWludFtdIGExID0gbmV3IGludFswXTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXlfT25lKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDc3IH07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJvdGF0ZShhLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheUludF9aZXJvRGlzdGFuY2UoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgMywgMiwgMSB9OwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCAwKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheUludF9OZWdhdGl2ZURpc3RhbmNlKCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJvdGF0ZShhLCAtMSk7Ci0JCWFzc2VydEVxdWFscygxMCwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygyMCwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXlJbnRfWmVybygpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50WzBdOwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCAzKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheUludF9PbmUoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgNzcgfTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgNDQpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNodWZmbGUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFNodWZmbGVPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYXJyYXkxID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTdHJpbmdbXSBhcnJheTIgPSBBcnJheVRvb2xzLnNodWZmbGUodGhpcy5idWlsZFN0cmluZ0FycmF5MSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCAoT2JqZWN0W10pIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaHVmZmxlT2JqZWN0QXJyYXlfU2luZ2xldG9uKCkgewotCQlTdHJpbmdbXSBhcnJheTEgPSBuZXcgU3RyaW5nW10geyAiZm9vIiB9OwotCQlTdHJpbmdbXSBhcnJheTIgPSBBcnJheVRvb2xzLnNodWZmbGUobmV3IFN0cmluZ1tdIHsgImZvbyIgfSk7Ci0JCWFzc2VydEVxdWFscyhhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGFycmF5MSwgKE9iamVjdFtdKSBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUNoYXJBcnJheSgpIHsKLQkJY2hhcltdIGFycmF5MSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJY2hhcltdIGFycmF5MiA9IEFycmF5VG9vbHMuc2h1ZmZsZSh0aGlzLmJ1aWxkQ2hhckFycmF5KCkpOwotCQlhc3NlcnRFcXVhbHMoYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaHVmZmxlQ2hhckFycmF5X1NpbmdsZXRvbigpIHsKLQkJY2hhcltdIGFycmF5MSA9IG5ldyBjaGFyW10geyAnZicgfTsKLQkJY2hhcltdIGFycmF5MiA9IEFycmF5VG9vbHMuc2h1ZmZsZShuZXcgY2hhcltdIHsgJ2YnIH0pOwotCQlhc3NlcnRFcXVhbHMoYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaHVmZmxlSW50QXJyYXkoKSB7Ci0JCWludFtdIGFycmF5MSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlpbnRbXSBhcnJheTIgPSBBcnJheVRvb2xzLnNodWZmbGUodGhpcy5idWlsZEludEFycmF5KCkpOwotCQlhc3NlcnRFcXVhbHMoYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaHVmZmxlSW50QXJyYXlfU2luZ2xldG9uKCkgewotCQlpbnRbXSBhcnJheTEgPSBuZXcgaW50W10geyA3IH07Ci0JCWludFtdIGFycmF5MiA9IEFycmF5VG9vbHMuc2h1ZmZsZShuZXcgaW50W10geyA3IH0pOwotCQlhc3NlcnRFcXVhbHMoYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdWItYXJyYXkgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFN1YkFycmF5T2JqZWN0QXJyYXlJbnRJbnQoKSB7Ci0JCVN0cmluZ1tdIGFycmF5ID0gbmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciIsICJiYXoiLCAiam9vIiwgImphciIsICJqYXoifTsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciIsICJiYXoiLCAiam9vIn07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDAsIDQpKSk7Ci0KLQkJcmVzdWx0ID0gbmV3IFN0cmluZ1tdIHsiamFyIn07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDQsIDUpKSk7Ci0KLQkJcmVzdWx0ID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgNSwgNSkpKTsKLQotCQlyZXN1bHQgPSBuZXcgU3RyaW5nW10geyJqb28iLCAiamFyIiwgImpheiJ9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCAzLCA2KSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJBcnJheUludEFycmF5SW50SW50KCkgewotCQlpbnRbXSBhcnJheSA9IG5ldyBpbnRbXSB7NzcsIDk5LCAzMzMsIDQsIDkwOTAsIDQyfTsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtdIHs3NywgOTksIDMzMywgNH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDAsIDQpKSk7Ci0KLQkJcmVzdWx0ID0gbmV3IGludFtdIHs5MDkwfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgNCwgNSkpKTsKLQotCQlyZXN1bHQgPSBuZXcgaW50WzBdOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCA1LCA1KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBpbnRbXSB7NCwgOTA5MCwgNDJ9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCAzLCA2KSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJBcnJheUNoYXJBcnJheUludEludCgpIHsKLQkJY2hhcltdIGFycmF5ID0gbmV3IGNoYXJbXSB7J2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ307Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltdIHsnYScsICdiJywgJ2MnLCAnZCd9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCAwLCA0KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBjaGFyW10geydlJ307Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDQsIDUpKSk7Ci0KLQkJcmVzdWx0ID0gbmV3IGNoYXJbMF07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDUsIDUpKSk7Ci0KLQkJcmVzdWx0ID0gbmV3IGNoYXJbXSB7J2QnLCAnZScsICdmJ307Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDMsIDYpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN3YXAgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYSA9IEFycmF5VG9vbHMuc3dhcChhLCAxLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBPYmplY3RBcnJheV9TYW1lSW5kaWNlcygpIHsKLQkJU3RyaW5nW10gYTEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCVN0cmluZ1tdIGEyID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhMSA9IEFycmF5VG9vbHMuc3dhcChhMSwgMSwgMSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcENoYXJBcnJheSgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnN3YXAoYSwgMSwgMik7Ci0JCWFzc2VydEVxdWFscygnYScsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoJ2MnLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCdiJywgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBDaGFyQXJyYXlfU2FtZUluZGljZXMoKSB7Ci0JCWNoYXJbXSBhMSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJY2hhcltdIGEyID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhMSA9IEFycmF5VG9vbHMuc3dhcChhMSwgMSwgMSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcEludEFycmF5KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnN3YXAoYSwgMSwgMik7Ci0JCWFzc2VydEVxdWFscygwLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcEludEFycmF5X1NhbWVJbmRpY2VzKCkgewotCQlpbnRbXSBhMSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlpbnRbXSBhMiA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhMSA9IEFycmF5VG9vbHMuc3dhcChhMSwgMSwgMSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXJyYXlzIGVuaGFuY2VtZW50cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbEJvb2xlYW5BcnJheUJvb2xlYW4oKSB7Ci0JCWJvb2xlYW5bXSBhMSA9IG5ldyBib29sZWFuWzldOwotCQlib29sZWFuW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIHRydWUpOwotCQlmb3IgKGJvb2xlYW4geCA6IGExKSB7Ci0JCQlhc3NlcnRUcnVlKHgpOwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbEJvb2xlYW5BcnJheUludEludEJvb2xlYW4oKSB7Ci0JCWJvb2xlYW5bXSBhMSA9IG5ldyBib29sZWFuWzldOwotCQlib29sZWFuW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIGZhbHNlKTsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlib29sZWFuW10gYTMgPSBBcnJheVRvb2xzLmZpbGwoYTIsIGZyb20sIHRvLCB0cnVlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEZhbHNlKHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKHgpOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsQnl0ZUFycmF5Qnl0ZSgpIHsKLQkJYnl0ZVtdIGExID0gbmV3IGJ5dGVbOV07Ci0JCWJ5dGVbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgKGJ5dGUpIDc3KTsKLQkJZm9yIChieXRlIHggOiBhMSkgewotCQkJYXNzZXJ0RXF1YWxzKDc3LCB4KTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxCeXRlQXJyYXlJbnRJbnRCeXRlKCkgewotCQlieXRlW10gYTEgPSBuZXcgYnl0ZVs5XTsKLQkJYnl0ZVtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAoYnl0ZSkgMyk7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJYnl0ZVtdIGEzID0gQXJyYXlUb29scy5maWxsKGEyLCBmcm9tLCB0bywgKGJ5dGUpIDc3KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJYnl0ZSB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygzLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDc3LCB4KTsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbENoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyWzldOwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsICdjJyk7Ci0JCWZvciAoY2hhciB4IDogYTEpIHsKLQkJCWFzc2VydEVxdWFscygnYycsIHgpOwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbENoYXJBcnJheUludEludENoYXIoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyWzldOwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsICdhJyk7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJY2hhcltdIGEzID0gQXJyYXlUb29scy5maWxsKGEyLCBmcm9tLCB0bywgJ2MnKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJY2hhciB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygnYScsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRFcXVhbHMoJ2MnLCB4KTsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbERvdWJsZUFycmF5RG91YmxlKCkgewotCQlkb3VibGVbXSBhMSA9IG5ldyBkb3VibGVbOV07Ci0JCWRvdWJsZVtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCA3Ny43Nyk7Ci0JCWZvciAoZG91YmxlIHggOiBhMSkgewotCQkJYXNzZXJ0RXF1YWxzKDc3Ljc3LCB4LCAwLjApOwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbERvdWJsZUFycmF5SW50SW50RG91YmxlKCkgewotCQlkb3VibGVbXSBhMSA9IG5ldyBkb3VibGVbOV07Ci0JCWRvdWJsZVtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAzLjMpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWRvdWJsZVtdIGEzID0gQXJyYXlUb29scy5maWxsKGEyLCBmcm9tLCB0bywgNzcuNzcpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlkb3VibGUgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMy4zLCB4LCAwLjApOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRFcXVhbHMoNzcuNzcsIHgsIDAuMCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxGbG9hdEFycmF5RmxvYXQoKSB7Ci0JCWZsb2F0W10gYTEgPSBuZXcgZmxvYXRbOV07Ci0JCWZsb2F0W10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDc3Ljc3Zik7Ci0JCWZvciAoZmxvYXQgeCA6IGExKSB7Ci0JCQlhc3NlcnRFcXVhbHMoNzcuNzdmLCB4LCAwLjApOwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbEZsb2F0QXJyYXlJbnRJbnRGbG9hdCgpIHsKLQkJZmxvYXRbXSBhMSA9IG5ldyBmbG9hdFs5XTsKLQkJZmxvYXRbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgMy4zZik7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJZmxvYXRbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sIDc3Ljc3Zik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWZsb2F0IHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMuM2YsIHgsIDAuMCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydEVxdWFscyg3Ny43N2YsIHgsIDAuMCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxJbnRBcnJheUludCgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50WzldOwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgNzcpOwotCQlmb3IgKGludCB4IDogYTEpIHsKLQkJCWFzc2VydEVxdWFscyg3NywgeCk7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsSW50QXJyYXlJbnRJbnRJbnQoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFs5XTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDMpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWludFtdIGEzID0gQXJyYXlUb29scy5maWxsKGEyLCBmcm9tLCB0bywgNzcpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMywgeCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydEVxdWFscyg3NywgeCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxPYmplY3RBcnJheU9iamVjdCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzldOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgIjc3Iik7Ci0JCWZvciAoU3RyaW5nIHggOiBhMSkgewotCQkJYXNzZXJ0RXF1YWxzKCI3NyIsIHgpOwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbE9iamVjdEFycmF5SW50SW50T2JqZWN0KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbOV07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAiMyIpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5maWxsKGEyLCBmcm9tLCB0bywgIjc3Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygiMyIsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRFcXVhbHMoIjc3IiwgeCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxMb25nQXJyYXlMb25nKCkgewotCQlsb25nW10gYTEgPSBuZXcgbG9uZ1s5XTsKLQkJbG9uZ1tdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCA3Nyk7Ci0JCWZvciAobG9uZyB4IDogYTEpIHsKLQkJCWFzc2VydEVxdWFscyg3NywgeCk7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsTG9uZ0FycmF5SW50SW50TG9uZygpIHsKLQkJbG9uZ1tdIGExID0gbmV3IGxvbmdbOV07Ci0JCWxvbmdbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgMyk7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJbG9uZ1tdIGEzID0gQXJyYXlUb29scy5maWxsKGEyLCBmcm9tLCB0bywgNzcpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlsb25nIHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsU2hvcnRBcnJheVNob3J0KCkgewotCQlzaG9ydFtdIGExID0gbmV3IHNob3J0WzldOwotCQlzaG9ydFtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAoc2hvcnQpIDc3KTsKLQkJZm9yIChzaG9ydCB4IDogYTEpIHsKLQkJCWFzc2VydEVxdWFscyg3NywgeCk7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsU2hvcnRBcnJheUludEludFNob3J0KCkgewotCQlzaG9ydFtdIGExID0gbmV3IHNob3J0WzldOwotCQlzaG9ydFtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAoc2hvcnQpIDMpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCXNob3J0W10gYTMgPSBBcnJheVRvb2xzLmZpbGwoYTIsIGZyb20sIHRvLCAoc2hvcnQpIDc3KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJc2hvcnQgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMywgeCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydEVxdWFscyg3NywgeCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRCeXRlQXJyYXkoKSB7Ci0JCWJ5dGVbXSBhMSA9IG5ldyBieXRlWzNdOwotCQlhMVswXSA9IChieXRlKSAzMzsKLQkJYTFbMV0gPSAoYnl0ZSkgMTE7Ci0JCWExWzJdID0gKGJ5dGUpIDIyOwotCQlieXRlW10gYTIgPSBBcnJheVRvb2xzLnNvcnQoYTEpOwotCQlieXRlIGxhc3QgPSAoYnl0ZSkgMDsKLQkJZm9yIChieXRlIHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQlsYXN0ID0geDsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRCeXRlQXJyYXlJbnRJbnQoKSB7Ci0JCWJ5dGVbXSBhMSA9IG5ldyBieXRlWzldOwotCQlieXRlW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIChieXRlKSAzKTsKLQkJYTJbM10gPSAoYnl0ZSkgMzM7Ci0JCWEyWzRdID0gKGJ5dGUpIDExOwotCQlhMls1XSA9IChieXRlKSAyMjsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlieXRlW10gYTMgPSBBcnJheVRvb2xzLnNvcnQoYTIsIGZyb20sIHRvKTsKLQkJYnl0ZSBsYXN0ID0gKGJ5dGUpIDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWJ5dGUgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMywgeCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJCWxhc3QgPSB4OwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0Q2hhckFycmF5KCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhclszXTsKLQkJYTFbMF0gPSAneic7Ci0JCWExWzFdID0gJ2InOwotCQlhMVsyXSA9ICdtJzsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5zb3J0KGExKTsKLQkJY2hhciBsYXN0ID0gJ2EnOwotCQlmb3IgKGNoYXIgeCA6IGExKSB7Ci0JCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCWxhc3QgPSB4OwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydENoYXJBcnJheUludEludCgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbOV07Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgJ2MnKTsKLQkJYTJbM10gPSAneic7Ci0JCWEyWzRdID0gJ2InOwotCQlhMls1XSA9ICdtJzsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQljaGFyW10gYTMgPSBBcnJheVRvb2xzLnNvcnQoYTIsIGZyb20sIHRvKTsKLQkJY2hhciBsYXN0ID0gJ2EnOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCdjJywgeCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJCWxhc3QgPSB4OwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0RG91YmxlQXJyYXkoKSB7Ci0JCWRvdWJsZVtdIGExID0gbmV3IGRvdWJsZVszXTsKLQkJYTFbMF0gPSAzMy4zMzsKLQkJYTFbMV0gPSAxMS4xMTsKLQkJYTFbMl0gPSAyMi4yMjsKLQkJZG91YmxlW10gYTIgPSBBcnJheVRvb2xzLnNvcnQoYTEpOwotCQlkb3VibGUgbGFzdCA9IDA7Ci0JCWZvciAoZG91YmxlIHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQlsYXN0ID0geDsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnREb3VibGVBcnJheUludEludCgpIHsKLQkJZG91YmxlW10gYTEgPSBuZXcgZG91YmxlWzldOwotCQlkb3VibGVbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgMy4zKTsKLQkJYTJbM10gPSAzMy4zMzsKLQkJYTJbNF0gPSAxMS4xMTsKLQkJYTJbNV0gPSAyMi4yMjsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlkb3VibGVbXSBhMyA9IEFycmF5VG9vbHMuc29ydChhMiwgZnJvbSwgdG8pOwotCQlkb3VibGUgbGFzdCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWRvdWJsZSB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygzLjMsIHgsIDAuMCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJCWxhc3QgPSB4OwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0RmxvYXRBcnJheSgpIHsKLQkJZmxvYXRbXSBhMSA9IG5ldyBmbG9hdFszXTsKLQkJYTFbMF0gPSAzMy4zM2Y7Ci0JCWExWzFdID0gMTEuMTFmOwotCQlhMVsyXSA9IDIyLjIyZjsKLQkJZmxvYXRbXSBhMiA9IEFycmF5VG9vbHMuc29ydChhMSk7Ci0JCWZsb2F0IGxhc3QgPSAwOwotCQlmb3IgKGZsb2F0IHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQlsYXN0ID0geDsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRGbG9hdEFycmF5SW50SW50KCkgewotCQlmbG9hdFtdIGExID0gbmV3IGZsb2F0WzldOwotCQlmbG9hdFtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAzLjNmKTsKLQkJYTJbM10gPSAzMy4zM2Y7Ci0JCWEyWzRdID0gMTEuMTFmOwotCQlhMls1XSA9IDIyLjIyZjsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlmbG9hdFtdIGEzID0gQXJyYXlUb29scy5zb3J0KGEyLCBmcm9tLCB0byk7Ci0JCWZsb2F0IGxhc3QgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlmbG9hdCB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygzLjNmLCB4LCAwLjApOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCQlsYXN0ID0geDsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydEludEFycmF5KCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbM107Ci0JCWExWzBdID0gMzM7Ci0JCWExWzFdID0gMTE7Ci0JCWExWzJdID0gMjI7Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5zb3J0KGExKTsKLQkJaW50IGxhc3QgPSAwOwotCQlmb3IgKGludCB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJbGFzdCA9IHg7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0SW50QXJyYXlJbnRJbnQoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFs5XTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDMpOwotCQlhMlszXSA9IDMzOwotCQlhMls0XSA9IDExOwotCQlhMls1XSA9IDIyOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWludFtdIGEzID0gQXJyYXlUb29scy5zb3J0KGEyLCBmcm9tLCB0byk7Ci0JCWludCBsYXN0ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJaW50IHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCQlsYXN0ID0geDsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydE9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbM107Ci0JCWExWzBdID0gInkiOwotCQlhMVsxXSA9ICJiIjsKLQkJYTFbMl0gPSAibSI7Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5zb3J0KGExKTsKLQkJU3RyaW5nIGxhc3QgPSAiYSI7Ci0JCWZvciAoU3RyaW5nIHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZShsYXN0LmNvbXBhcmVUbyh4KSA8IDApOwotCQkJbGFzdCA9IHg7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0T2JqZWN0QXJyYXlDb21wYXJhdG9yKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbM107Ci0JCWExWzBdID0gInkiOwotCQlhMVsxXSA9ICJiIjsKLQkJYTFbMl0gPSAibSI7Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5zb3J0KGExLCBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJU3RyaW5nIGxhc3QgPSAieiI7Ci0JCWZvciAoU3RyaW5nIHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZShsYXN0LmNvbXBhcmVUbyh4KSA+IDApOwotCQkJbGFzdCA9IHg7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0T2JqZWN0QXJyYXlJbnRJbnQoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1s5XTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsICJjIik7Ci0JCWEyWzNdID0gInkiOwotCQlhMls0XSA9ICJiIjsKLQkJYTJbNV0gPSAibSI7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnNvcnQoYTIsIGZyb20sIHRvKTsKLQkJU3RyaW5nIGxhc3QgPSAiYSI7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygiYyIsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QuY29tcGFyZVRvKHgpIDwgMCk7Ci0JCQkJbGFzdCA9IHg7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRPYmplY3RBcnJheUludEludENvbXBhcmF0b3IoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1s5XTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsICJjIik7Ci0JCWEyWzNdID0gInkiOwotCQlhMls0XSA9ICJiIjsKLQkJYTJbNV0gPSAibSI7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnNvcnQoYTIsIGZyb20sIHRvLCBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJU3RyaW5nIGxhc3QgPSAieiI7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygiYyIsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QuY29tcGFyZVRvKHgpID4gMCk7Ci0JCQkJbGFzdCA9IHg7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRMb25nQXJyYXkoKSB7Ci0JCWxvbmdbXSBhMSA9IG5ldyBsb25nWzNdOwotCQlhMVswXSA9IDMzOwotCQlhMVsxXSA9IDExOwotCQlhMVsyXSA9IDIyOwotCQlsb25nW10gYTIgPSBBcnJheVRvb2xzLnNvcnQoYTEpOwotCQlsb25nIGxhc3QgPSAwOwotCQlmb3IgKGxvbmcgeCA6IGExKSB7Ci0JCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCWxhc3QgPSB4OwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydExvbmdBcnJheUludEludCgpIHsKLQkJbG9uZ1tdIGExID0gbmV3IGxvbmdbOV07Ci0JCWxvbmdbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgMyk7Ci0JCWEyWzNdID0gMzM7Ci0JCWEyWzRdID0gMTE7Ci0JCWEyWzVdID0gMjI7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJbG9uZ1tdIGEzID0gQXJyYXlUb29scy5zb3J0KGEyLCBmcm9tLCB0byk7Ci0JCWxvbmcgbGFzdCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWxvbmcgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMywgeCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJCWxhc3QgPSB4OwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0U2hvcnRBcnJheSgpIHsKLQkJc2hvcnRbXSBhMSA9IG5ldyBzaG9ydFszXTsKLQkJYTFbMF0gPSAoc2hvcnQpIDMzOwotCQlhMVsxXSA9IChzaG9ydCkgMTE7Ci0JCWExWzJdID0gKHNob3J0KSAyMjsKLQkJc2hvcnRbXSBhMiA9IEFycmF5VG9vbHMuc29ydChhMSk7Ci0JCXNob3J0IGxhc3QgPSAoc2hvcnQpIDA7Ci0JCWZvciAoc2hvcnQgeCA6IGExKSB7Ci0JCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCWxhc3QgPSB4OwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydFNob3J0QXJyYXlJbnRJbnQoKSB7Ci0JCXNob3J0W10gYTEgPSBuZXcgc2hvcnRbOV07Ci0JCXNob3J0W10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIChzaG9ydCkgMyk7Ci0JCWEyWzNdID0gKHNob3J0KSAzMzsKLQkJYTJbNF0gPSAoc2hvcnQpIDExOwotCQlhMls1XSA9IChzaG9ydCkgMjI7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJc2hvcnRbXSBhMyA9IEFycmF5VG9vbHMuc29ydChhMiwgZnJvbSwgdG8pOwotCQlzaG9ydCBsYXN0ID0gKHNob3J0KSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlzaG9ydCB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygzLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQkJbGFzdCA9IHg7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJT2JqZWN0IGF0ID0gUmVmbGVjdGlvblRvb2xzLm5ld0luc3RhbmNlKEFycmF5VG9vbHMuY2xhc3MpOwotCQkJZmFpbCgiYm9ndXM6ICIgKyBhdCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJCWlmIChleC5nZXRDYXVzZSgpLmdldENhdXNlKCkgaW5zdGFuY2VvZiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbikgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1dGlsaXR5ICoqKioqKioqKioKLQotCXByaXZhdGUgT2JqZWN0W10gYnVpbGRPYmplY3RBcnJheTEoKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAidHdvIiB9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gYnVpbGRTdHJpbmdBcnJheTEoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyAiemVybyIsICJvbmUiLCAidHdvIiB9OwotCX0KLQotCXByaXZhdGUgY2hhcltdIGJ1aWxkQ2hhckFycmF5KCkgewotCQlyZXR1cm4gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycgfTsKLQl9Ci0KLQlwcml2YXRlIGludFtdIGJ1aWxkSW50QXJyYXkoKSB7Ci0JCXJldHVybiBuZXcgaW50W10geyAwLCAxMCwgMjAgfTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkyKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInRocmVlIiwgImZvdXIiLCAiZml2ZSIgfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkU3RyaW5nQXJyYXkyKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgInRocmVlIiwgImZvdXIiLCAiZml2ZSIgfTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFN0cmluZ0xpc3QxKCkgewotCQlMaXN0PFN0cmluZz4gbCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEobCk7Ci0JCXJldHVybiBsOwotCX0KLQotCXByaXZhdGUgTGlzdDxPYmplY3Q+IGJ1aWxkT2JqZWN0TGlzdDEoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBsID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMShsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRvQ29sbGVjdGlvbjEoQ29sbGVjdGlvbjw/IHN1cGVyIFN0cmluZz4gYykgewotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFN0cmluZ0xpc3QyKCkgewotCQlMaXN0PFN0cmluZz4gbCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjIobCk7Ci0JCXJldHVybiBsOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRUb0NvbGxlY3Rpb24yKENvbGxlY3Rpb248PyBzdXBlciBTdHJpbmc+IGMpIHsKLQkJYy5hZGQoInRocmVlIik7Ci0JCWMuYWRkKCJmb3VyIik7Ci0JCWMuYWRkKCJmaXZlIik7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3I8U3RyaW5nPiBidWlsZFN0cmluZ1ZlY3RvcjEoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHYpOwotCQlyZXR1cm4gdjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJkN2MzNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0FzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Bc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RhdGVmdWxDb21tYW5kRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3JUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JcHVibGljIEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdENvbW1hbmQgY29tbWFuZCA9IG5ldyBUZXN0Q29tbWFuZCgpOwotCQlTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IgPSBuZXcgQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yKHRoaXMuYnVpbGRUaHJlYWRGYWN0b3J5KCkpOwotCQljb21tYW5kRXhlY3V0b3Iuc3RhcnQoKTsKLQkJY29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCWNvbW1hbmRFeGVjdXRvci5leGVjdXRlKGNvbW1hbmQpOwotCQljb21tYW5kRXhlY3V0b3IuZXhlY3V0ZShjb21tYW5kKTsKLQkJVGhyZWFkLnNsZWVwKFRXT19USUNLUyk7ICAvLyB3YWl0IGZvciB0aGUgY29tbWFuZCB0byBleGVjdXRlCi0JCWNvbW1hbmRFeGVjdXRvci5zdG9wKCk7Ci0JCWFzc2VydEVxdWFscygzLCBjb21tYW5kLmNvdW50KTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGVzdENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuY291bnQrKzsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CYWdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CYWdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2M2NzUwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQmFnVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQmFnVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQmFnVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX2l0ZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKEJhZy5FbXB0eS5pbnN0YW5jZSgpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCYWdfc2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgQmFnLkVtcHR5Lmluc3RhbmNlKCkuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCYWdfdW5pcXVlSXRlcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQmFnLkVtcHR5Lmluc3RhbmNlKCkudW5pcXVlSXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUJhZ191bmlxdWVDb3VudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgQmFnLkVtcHR5Lmluc3RhbmNlKCkudW5pcXVlQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX2NvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBCYWcuRW1wdHkuaW5zdGFuY2UoKS5jb3VudCgiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUJhZ19lbnRyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKEJhZy5FbXB0eS5pbnN0YW5jZSgpLmVudHJpZXMoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUJhZ19yZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQmFnLkVtcHR5Lmluc3RhbmNlKCkucmVtb3ZlKCJmb28iLCAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX2FkZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlCYWcuRW1wdHkuaW5zdGFuY2UoKS5hZGQoImZvbyIsIDMpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUJhZ19lcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZShCYWcuRW1wdHkuaW5zdGFuY2UoKS5lcXVhbHMoQmFnLkVtcHR5Lmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQmFnLkVtcHR5Lmluc3RhbmNlKCkuZXF1YWxzKCJmb28iKSk7Ci0KLQkJQmFnPE9iamVjdD4gYmFnID0gbmV3IEhhc2hCYWc8T2JqZWN0PigpOwotCQlhc3NlcnRUcnVlKEJhZy5FbXB0eS5pbnN0YW5jZSgpLmVxdWFscyhiYWcpKTsKLQkJYmFnLmFkZCgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKEJhZy5FbXB0eS5pbnN0YW5jZSgpLmVxdWFscyhiYWcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCYWdfaGFzaENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIEJhZy5FbXB0eS5pbnN0YW5jZSgpLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUJhZ19zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJhZzw/PiB4eHggPSBUZXN0VG9vbHMuc2VyaWFsaXplKEJhZy5FbXB0eS5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0U2FtZShCYWcuRW1wdHkuaW5zdGFuY2UoKSwgeHh4KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQmlkaUZpbHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpZGlGaWx0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjYzYzNjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQmlkaUZpbHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmlkaUZpbHRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQmlkaUZpbHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEJpZGlGaWx0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEJpZGlGaWx0ZXJfYWNjZXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoQmlkaUZpbHRlci5OdWxsLmluc3RhbmNlKCkuYWNjZXB0KCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxCaWRpRmlsdGVyX3JldmVyc2VBY2NlcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZShCaWRpRmlsdGVyLk51bGwuaW5zdGFuY2UoKS5yZXZlcnNlQWNjZXB0KCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxCaWRpRmlsdGVyX3RvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoQmlkaUZpbHRlci5OdWxsLmluc3RhbmNlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxCaWRpRmlsdGVyX3NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQmlkaUZpbHRlcjw/PiB4eHggPSBUZXN0VG9vbHMuc2VyaWFsaXplKEJpZGlGaWx0ZXIuTnVsbC5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0U2FtZShCaWRpRmlsdGVyLk51bGwuaW5zdGFuY2UoKSwgeHh4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3BhcXVlQmlkaUZpbHRlcl9hY2NlcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQmlkaUZpbHRlci5PcGFxdWUuaW5zdGFuY2UoKS5hY2NlcHQoImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3BhcXVlQmlkaUZpbHRlcl9yZXZlcnNlQWNjZXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKEJpZGlGaWx0ZXIuT3BhcXVlLmluc3RhbmNlKCkucmV2ZXJzZUFjY2VwdCgiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcGFxdWVCaWRpRmlsdGVyX3RvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoQmlkaUZpbHRlci5PcGFxdWUuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3BhcXVlQmlkaUZpbHRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlGaWx0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpRmlsdGVyLk9wYXF1ZS5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0U2FtZShCaWRpRmlsdGVyLk9wYXF1ZS5pbnN0YW5jZSgpLCB4eHgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlGaWx0ZXJfYWNjZXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUJpZGlGaWx0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKS5hY2NlcHQoImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlGaWx0ZXJfcmV2ZXJzZUFjY2VwdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlCaWRpRmlsdGVyLkRpc2FibGVkLmluc3RhbmNlKCkucmV2ZXJzZUFjY2VwdCgiZm9vIik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQmlkaUZpbHRlcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlGaWx0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRCaWRpRmlsdGVyX3NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQmlkaUZpbHRlcjw/PiB4eHggPSBUZXN0VG9vbHMuc2VyaWFsaXplKEJpZGlGaWx0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaUZpbHRlci5EaXNhYmxlZC5pbnN0YW5jZSgpLCB4eHgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQmlkaVN0cmluZ0NvbnZlcnRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNjAzNDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmlkaVN0cmluZ0NvbnZlcnRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQmlkaVN0cmluZ0NvbnZlcnRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEJpZGlTdHJpbmdDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKCJmb28iKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvT2JqZWN0KCJmb28iKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCaWRpU3RyaW5nQ29udmVydGVyPD8+IHh4eCA9IFRlc3RUb29scy5zZXJpYWxpemUoQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJpZGlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC5pbnN0YW5jZSgpLCB4eHgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUJpZGlTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKS5jb252ZXJ0VG9TdHJpbmcoImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUJpZGlTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKS5jb252ZXJ0VG9PYmplY3QoImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlTdHJpbmdDb252ZXJ0ZXJfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkRpc2FibGVkLmluc3RhbmNlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQmlkaVN0cmluZ0NvbnZlcnRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlTdHJpbmdDb252ZXJ0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpU3RyaW5nQ29udmVydGVyLkRpc2FibGVkLmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJpZGlTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKSwgeHh4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbkJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb1N0cmluZyhCb29sZWFuLlRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb1N0cmluZyhCb29sZWFuLkZBTFNFKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbkJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb09iamVjdCgidHJ1ZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvT2JqZWN0KCJUUlVFIikpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvT2JqZWN0KCJmYWxzZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb09iamVjdCgieHh4eCIpKTsKLQkJYXNzZXJ0TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkJvb2xlYW5Db252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0VG9PYmplY3QobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFuQmlkaVN0cmluZ0NvbnZlcnRlcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFuQmlkaVN0cmluZ0NvbnZlcnRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlTdHJpbmdDb252ZXJ0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpU3RyaW5nQ29udmVydGVyLkJvb2xlYW5Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCksIHh4eCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludGVnZXJCaWRpU3RyaW5nQ29udmVydGVyX2NvbnZlcnRUb1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoIjciLCBCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0VG9TdHJpbmcoSW50ZWdlci52YWx1ZU9mKDcpKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5JbnRlZ2VyQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlckJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNyksIEJpZGlTdHJpbmdDb252ZXJ0ZXIuSW50ZWdlckNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb09iamVjdCgiNyIpKTsKLQkJYXNzZXJ0TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0VG9PYmplY3QobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyQmlkaVN0cmluZ0NvbnZlcnRlcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlTdHJpbmdDb252ZXJ0ZXIuSW50ZWdlckNvbnZlcnRlci5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyQmlkaVN0cmluZ0NvbnZlcnRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlTdHJpbmdDb252ZXJ0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaVN0cmluZ0NvbnZlcnRlci5JbnRlZ2VyQ29udmVydGVyLmluc3RhbmNlKCksIHh4eCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpZGlUcmFuc2Zvcm1lclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpZGlUcmFuc2Zvcm1lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0Y2ZlYTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpVHJhbnNmb3JtZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpZGlUcmFuc2Zvcm1lcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQmlkaVRyYW5zZm9ybWVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQmlkaVRyYW5zZm9ybWVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxCaWRpVHJhbnNmb3JtZXJfdHJhbnNmb3JtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQmlkaVRyYW5zZm9ybWVyLk51bGwuaW5zdGFuY2UoKS50cmFuc2Zvcm0oImZvbyIpKTsKLQkJYXNzZXJ0TnVsbChCaWRpVHJhbnNmb3JtZXIuTnVsbC5pbnN0YW5jZSgpLnRyYW5zZm9ybShudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxCaWRpVHJhbnNmb3JtZXJfcmV2ZXJzZVRyYW5zZm9ybSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIEJpZGlUcmFuc2Zvcm1lci5OdWxsLmluc3RhbmNlKCkucmV2ZXJzZVRyYW5zZm9ybSgiZm9vIikpOwotCQlhc3NlcnROdWxsKEJpZGlUcmFuc2Zvcm1lci5OdWxsLmluc3RhbmNlKCkudHJhbnNmb3JtKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEJpZGlUcmFuc2Zvcm1lcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlUcmFuc2Zvcm1lci5OdWxsLmluc3RhbmNlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxCaWRpVHJhbnNmb3JtZXJfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCaWRpVHJhbnNmb3JtZXI8PywgPz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpVHJhbnNmb3JtZXIuTnVsbC5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0U2FtZShCaWRpVHJhbnNmb3JtZXIuTnVsbC5pbnN0YW5jZSgpLCB4eHgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlUcmFuc2Zvcm1lcl90cmFuc2Zvcm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQmlkaVRyYW5zZm9ybWVyLkRpc2FibGVkLmluc3RhbmNlKCkudHJhbnNmb3JtKCJmb28iKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRCaWRpVHJhbnNmb3JtZXJfcmV2ZXJzZVRyYW5zZm9ybSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlCaWRpVHJhbnNmb3JtZXIuRGlzYWJsZWQuaW5zdGFuY2UoKS5yZXZlcnNlVHJhbnNmb3JtKCJmb28iKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRCaWRpVHJhbnNmb3JtZXJfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChCaWRpVHJhbnNmb3JtZXIuRGlzYWJsZWQuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRCaWRpVHJhbnNmb3JtZXJfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCaWRpVHJhbnNmb3JtZXI8PywgPz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpVHJhbnNmb3JtZXIuRGlzYWJsZWQuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaVRyYW5zZm9ybWVyLkRpc2FibGVkLmluc3RhbmNlKCksIHh4eCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpdFRvb2xzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQml0VG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjY5YTUxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQml0VG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQml0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotCi1wdWJsaWMgY2xhc3MgQml0VG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBCaXRUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGbGFnSXNTZXRJbnRJbnQoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDMwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDMwMywgMHgxMTAzKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmZsYWdJc1NldCgweDAwMDAsIDB4MTEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGbGFnSXNPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmZsYWdJc09mZigweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5mbGFnSXNPZmYoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmZsYWdJc09mZigweDAzMDMsIDB4MDEwMykpOwotCi0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MjIwNCwgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MDAwMCwgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnSXNTZXRJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDAwMSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMDAxLCAweDAwMDEpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAxMDEsIDB4MDEwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMzAzLCAweDAxMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDEwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAzMDMsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgxMTAzLCAweDExMDMpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDAwMCwgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAxMDMsIDB4MDEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ0lzT2ZmSW50SW50KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzT2ZmKDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzT2ZmKDB4RkZGRkZGRkUsIDB4MDAwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzT2ZmKDB4RkZGRkZFRkUsIDB4MDEwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMzAzLCAweDAxMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzT2ZmKDB4RkZGRkZFRkMsIDB4MDEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMzAzLCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzT2ZmKDB4RkZGRkVFRkMsIDB4MTEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxGbGFnc0FyZVNldEludEludCgpIHsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIDB4MDEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgMHgxMTAzKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDAwMCwgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZsYWdzQXJlT2ZmSW50SW50KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIDB4MDEwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIDB4MDEwMykpOwotCi0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgyMjA0LCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAwMDAsIDB4MTEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ3NBcmVTZXRJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDEsIDB4MDAwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDEsIDB4MDAwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIDB4MDEwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDEsIDB4MDEwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIDB4MDEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDMsIDB4MDEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDExMDMsIDB4MTEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDAsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDMsIDB4MDEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ3NBcmVPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHhGRkZGRkZGRSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZFRkUsIDB4MDEwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAzMDMsIDB4MDEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRUZDLCAweDAxMDMpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHhGRkZGRUVGQywgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFueUZsYWdzQXJlU2V0SW50SW50KCkgewotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHhGRkZGLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweDAwMDMsIDB4RkZGRikpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDMwMywgMHgxMDEwKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDAwMCwgMHhGRkZGKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFueUZsYWdzQXJlT2ZmSW50SW50KCkgewotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4MzMzRSwgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHhGRkZFLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAwMDMsIDB4RkZGRikpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4NzM3MywgMHgxMDEwKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4RkZGRiwgMHhGRkZGKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZsYWdzQXJlU2V0SW50SW50QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMDAzLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgxMDAwLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMDAwLCBuZXcgaW50W10geyAweDEwMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxGbGFnc0FyZU9mZkludEludEFycmF5KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwNDAwLCAweDAwMjAsIDB4MDAwMCB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgwMDAwLCBuZXcgaW50W10geyAweDEwMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ3NBcmVTZXRJbnRJbnRBcnJheSgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDEsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMSwgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMTAxLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MTEwMywgbmV3IGludFtdIHsgMHgxMTAwLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMDAwLCBuZXcgaW50W10geyAweDAxMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMywgbmV3IGludFtdIHsgMHgwMTAxLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25seUZsYWdzQXJlT2ZmSW50SW50QXJyYXkoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRkZFLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRUZFLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRUZDLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgxMTAwLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHhGRkZGRUVGQywgbmV3IGludFtdIHsgMHgxMTAwLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW55RmxhZ3NBcmVTZXRJbnRJbnRBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHhGRkZGLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHhGMDAwLCAweDBGMDAsIDB4MDBGMCwgMHgwMDBGIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwMDEwIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMDAwLCBuZXcgaW50W10geyAweEYwMDAsIDB4MEYwMCwgMHgwMEYwLCAweDAwMEYgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbnlGbGFnc0FyZU9mZkludEludEFycmF5KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4RkZGRiwgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMDAsIDB4MDIwMCwgMHgwMDAzLCAweDAwMDIgfSkpOwotCi0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMDAsIDB4MDAxMCB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHgwMDAwLCBuZXcgaW50W10geyAweEYwMDAsIDB4MEYwMCwgMHgwMEYwLCAweDAwMEYgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPckZsYWdzKCkgewotCQlhc3NlcnRFcXVhbHMoMHgwMDAxLCBCaXRUb29scy5vckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDAwIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAxMSwgQml0VG9vbHMub3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSB9KSk7Ci0JCWFzc2VydEVxdWFscygweEYwMTEsIEJpdFRvb2xzLm9yRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEsIDB4RjAwMCB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFuZEZsYWdzKCkgewotCQlhc3NlcnRFcXVhbHMoMHgwMDAxLCBCaXRUb29scy5hbmRGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydEVxdWFscygweDAwMDEsIEJpdFRvb2xzLmFuZEZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAwMCwgQml0VG9vbHMuYW5kRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEsIDB4RjAwMCB9KSk7Ci0JCWFzc2VydEVxdWFscygweDAwMDEsIEJpdFRvb2xzLmFuZEZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExLCAweEYwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RYb3JGbGFncygpIHsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAwMSwgQml0VG9vbHMueG9yRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMDAgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHgwMDEwLCBCaXRUb29scy54b3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSB9KSk7Ci0JCWFzc2VydEVxdWFscygweEYwMTAsIEJpdFRvb2xzLnhvckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExLCAweEYwMDAgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHhGRjExLCBCaXRUb29scy54b3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSwgMHhGMDAwLCAweDBGMDEgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHhGMDEwLCBCaXRUb29scy54b3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSwgMHhGMDAwLCAweDBGMDEsIDB4MEYwMSB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlPYmplY3QgYXQgPSBSZWZsZWN0aW9uVG9vbHMubmV3SW5zdGFuY2UoQml0VG9vbHMuY2xhc3MpOwotCQkJZmFpbCgiYm9ndXM6ICIgKyBhdCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5SZWZlcmVuY2VUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Cb29sZWFuUmVmZXJlbmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzODA4Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5SZWZlcmVuY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQm9vbGVhblJlZmVyZW5jZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQm9vbGVhblJlZmVyZW5jZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEJvb2xlYW5SZWZlcmVuY2VUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB7Ci0JCUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVEZWZhdWx0KCkgewotCQlCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IEJvb2xlYW5SZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RmFsc2UoYnIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzKCkgewotCQlCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IEJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYnIuaXModHJ1ZSkpOwotCQlhc3NlcnRGYWxzZShici5pcyhmYWxzZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdCgpIHsKLQkJQm9vbGVhblJlZmVyZW5jZSBiciA9IG5ldyBCb29sZWFuUmVmZXJlbmNlKHRydWUpOwotCQlhc3NlcnRGYWxzZShici5pc05vdCh0cnVlKSk7Ci0JCWFzc2VydFRydWUoYnIuaXNOb3QoZmFsc2UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNUcnVlKCkgewotCQlCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IEJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYnIuaXNUcnVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0ZhbHNlKCkgewotCQlCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IEJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKGJyLmlzRmFsc2UoKSk7Ci0JCWJyLnNldEZhbHNlKCk7Ci0JCWFzc2VydFRydWUoYnIuaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0VmFsdWUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmxpcCgpIHsKLQkJQm9vbGVhblJlZmVyZW5jZSBiciA9IG5ldyBCb29sZWFuUmVmZXJlbmNlKHRydWUpOwotCQlhc3NlcnRUcnVlKGJyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShici5mbGlwKCkpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShici5mbGlwKCkpOwotCQlhc3NlcnRUcnVlKGJyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROb3RCb29sZWFuKCkgewotCQlCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IEJvb2xlYW5SZWZlcmVuY2UoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0Tm90KHRydWUpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0Tm90KHRydWUpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0Tm90KGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHJ1ZSgpIHsKLQkJQm9vbGVhblJlZmVyZW5jZSBiciA9IG5ldyBCb29sZWFuUmVmZXJlbmNlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoYnIuZ2V0VmFsdWUoKSk7Ci0JCWJyLnNldFRydWUoKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmFsc2UoKSB7Ci0JCUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0RmFsc2UoKTsKLQkJYXNzZXJ0RmFsc2UoYnIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IEJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCUJvb2xlYW5SZWZlcmVuY2UgY2xvbmUgPSAoQm9vbGVhblJlZmVyZW5jZSkgYnIuY2xvbmUoKTsKLQkJYXNzZXJ0VHJ1ZShjbG9uZS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGJyLCBjbG9uZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJQm9vbGVhblJlZmVyZW5jZSBicjEgPSBuZXcgQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJQm9vbGVhblJlZmVyZW5jZSBicjIgPSBuZXcgQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKGJyMSwgYnIyKTsKLQotCQlCb29sZWFuUmVmZXJlbmNlIGJyMyA9IG5ldyBCb29sZWFuUmVmZXJlbmNlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoYnIxLmVxdWFscyhicjMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCUJvb2xlYW5SZWZlcmVuY2UgYnIxID0gbmV3IEJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygxLCBicjEuaGFzaENvZGUoKSk7Ci0JCWJyMS5zZXRGYWxzZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgYnIxLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJQm9vbGVhblJlZmVyZW5jZSBicjEgPSBuZXcgQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJbdHJ1ZV0iLCBicjEudG9TdHJpbmcoKSk7Ci0JCWJyMS5zZXRGYWxzZSgpOwotCQlhc3NlcnRFcXVhbHMoIltmYWxzZV0iLCBicjEudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5Ub29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5Ub29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzA0NDYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Cb29sZWFuVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Cb29sZWFuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotCi1wdWJsaWMgY2xhc3MgQm9vbGVhblRvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9vbGVhbiBUUlVFID0gQm9vbGVhbi5UUlVFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvb2xlYW4gRkFMU0UgPSBCb29sZWFuLkZBTFNFOwotCi0JcHVibGljIEJvb2xlYW5Ub29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROT1QoKSB7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLm5vdChUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMubm90KEZBTFNFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFORCgpIHsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5hbmQoVFJVRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5hbmQoVFJVRSwgRkFMU0UpKTsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMuYW5kKEZBTFNFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLmFuZChGQUxTRSwgRkFMU0UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T1IoKSB7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMub3IoVFJVRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLm9yKFRSVUUsIEZBTFNFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMub3IoRkFMU0UsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMub3IoRkFMU0UsIEZBTFNFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFhPUigpIHsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMueG9yKFRSVUUsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy54b3IoVFJVRSwgRkFMU0UpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy54b3IoRkFMU0UsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMueG9yKEZBTFNFLCBGQUxTRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROQU5EKCkgewotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5uYW5kKFRSVUUsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5uYW5kKFRSVUUsIEZBTFNFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMubmFuZChGQUxTRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLm5hbmQoRkFMU0UsIEZBTFNFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5PUigpIHsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMubm9yKFRSVUUsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMubm9yKFRSVUUsIEZBTFNFKSk7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLm5vcihGQUxTRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLm5vcihGQUxTRSwgRkFMU0UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WE5PUigpIHsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy54bm9yKFRSVUUsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMueG5vcihUUlVFLCBGQUxTRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy54bm9yKEZBTFNFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMueG5vcihGQUxTRSwgRkFMU0UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU9iamVjdCBhdCA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShCb29sZWFuVG9vbHMuY2xhc3MpOwotCQkJZmFpbCgiYm9ndXM6ICIgKyBhdCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NsYXNzTmFtZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NsYXNzTmFtZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzY2Q3ZTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc05hbWVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc05hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDbGFzc05hbWVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDbGFzc05hbWVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNBcnJheSgpIHsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQXJyYXkoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0FycmF5KGludFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0FycmF5KGludFtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQXJyYXkoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNBcnJheShqYXZhLmxhbmcuU3RyaW5nW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzQXJyYXkoamF2YS5sYW5nLlN0cmluZ1tdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEVsZW1lbnRUeXBlTmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0RWxlbWVudFR5cGVOYW1lKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0RWxlbWVudFR5cGVOYW1lKGludC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0RWxlbWVudFR5cGVOYW1lKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldEVsZW1lbnRUeXBlTmFtZShqYXZhLnV0aWwuVmVjdG9yW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0RWxlbWVudFR5cGVOYW1lKGludFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUoamF2YS51dGlsLlZlY3RvcltdW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUoaW50W11bXVtdLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBcnJheURlcHRoKCkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NOYW1lLmdldEFycmF5RGVwdGgoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENsYXNzTmFtZS5nZXRBcnJheURlcHRoKGludC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENsYXNzTmFtZS5nZXRBcnJheURlcHRoKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDbGFzc05hbWUuZ2V0QXJyYXlEZXB0aChqYXZhLnV0aWwuVmVjdG9yW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDbGFzc05hbWUuZ2V0QXJyYXlEZXB0aChpbnRbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzTmFtZS5nZXRBcnJheURlcHRoKGphdmEudXRpbC5WZWN0b3JbXVtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc05hbWUuZ2V0QXJyYXlEZXB0aChpbnRbXVtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbXBvbmVudFR5cGVOYW1lKCkgewotCQlhc3NlcnRFcXVhbHMobnVsbCwgQ2xhc3NOYW1lLmdldENvbXBvbmVudFR5cGVOYW1lKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldENvbXBvbmVudFR5cGVOYW1lKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRDb21wb25lbnRUeXBlTmFtZShqYXZhLmxhbmcuT2JqZWN0W11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgQ2xhc3NOYW1lLmdldENvbXBvbmVudFR5cGVOYW1lKGludC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRDb21wb25lbnRUeXBlTmFtZShpbnRbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludFtdLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldENvbXBvbmVudFR5cGVOYW1lKGludFtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpbXBsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKCJPYmplY3QiLCBDbGFzc05hbWUuZ2V0U2ltcGxlTmFtZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoIk9iamVjdFtdIiwgQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoIk9iamVjdFtdW10iLCBDbGFzc05hbWUuZ2V0U2ltcGxlTmFtZShqYXZhLmxhbmcuT2JqZWN0W11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLk1hcC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGphdmEudXRpbC5NYXAuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRFcXVhbHMoImludCIsIENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGludC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnRbXSIsIENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGludFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludFtdW10iLCBDbGFzc05hbWUuZ2V0U2ltcGxlTmFtZShpbnRbXVtdLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCU9iamVjdCBhbm9uT2JqZWN0ID0gbmV3IE9iamVjdCgpIHsKLQkJCS8vIGFub255bW91cyBjbGFzcwotCQl9OwotCQlhc3NlcnRFcXVhbHMoIiIsIENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGFub25PYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQotCQljbGFzcyBMb2NhbCB7Ci0JCQkvLyBhbm9ueW1vdXMgY2xhc3MKLQkJfQotCQlMb2NhbCBsb2NhbE9iamVjdCA9IG5ldyBMb2NhbCgpOwotCQlhc3NlcnRFcXVhbHMoIkxvY2FsIiwgQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUobG9jYWxPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UGFja2FnZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFBhY2thZ2VOYW1lKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgQ2xhc3NOYW1lLmdldFBhY2thZ2VOYW1lKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoamF2YS5sYW5nLk9iamVjdFtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5NYXAuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFBhY2thZ2VOYW1lKGphdmEudXRpbC5NYXAuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRQYWNrYWdlTmFtZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydEVxdWFscygiIiwgQ2xhc3NOYW1lLmdldFBhY2thZ2VOYW1lKGludC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoaW50W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgQ2xhc3NOYW1lLmdldFBhY2thZ2VOYW1lKGludFtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIiLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlPYmplY3QgYW5vbk9iamVjdCA9IG5ldyBPYmplY3QoKSB7Ci0JCQkvLyBhbm9ueW1vdXMgY2xhc3MKLQkJfTsKLQkJYXNzZXJ0RXF1YWxzKGFub25PYmplY3QuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoYW5vbk9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1RvcExldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzVG9wTGV2ZWwoamF2YS51dGlsLk1hcC5jbGFzcy5nZXROYW1lKCkpKTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1RvcExldmVsKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0TmFtZSgpKSk7IC8vIG1lbWJlcgotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNUb3BMZXZlbChDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIikuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1RvcExldmVsKENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpLmdldE5hbWUoKSkpOyAvLyBhbm9ueW1vdXMKLQotCQlPYmplY3RbXSBhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwWzBdOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVG9wTGV2ZWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcC5FbnRyeVswXTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1RvcExldmVsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsb2NhbENsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVG9wTGV2ZWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gYW5vbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShhbm9uQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNUb3BMZXZlbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc01lbWJlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNNZW1iZXIoamF2YS51dGlsLk1hcC5jbGFzcy5nZXROYW1lKCkpKTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTWVtYmVyKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0TmFtZSgpKSk7IC8vIG1lbWJlcgotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNNZW1iZXIoQ2xhc3MuZm9yTmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxTG9jYWxDbGFzcyIpLmdldE5hbWUoKSkpOyAvLyBsb2NhbAotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNNZW1iZXIoQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIikuZ2V0TmFtZSgpKSk7IC8vIGFub255bW91cwotCi0JCU9iamVjdFtdIGFycmF5ID0gbmV3IGphdmEudXRpbC5NYXBbMF07IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNNZW1iZXIoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcC5FbnRyeVswXTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcihhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBsb2NhbENsYXNzID0gQ2xhc3MuZm9yTmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxTG9jYWxDbGFzcyIpOyAvLyBsb2NhbAotCQlhcnJheSA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UobG9jYWxDbGFzcywgMCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcihhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBhbm9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFub25DbGFzcywgMCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcihhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCi0JCS8vIHRlc3QgYSBmZXcgZWRnZSBjYXNlcwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc01lbWJlcigiamF2YS51dGlsLk1hcCRhMSIpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNNZW1iZXIoImphdmEudXRpbC5NYXAkMWFhJGFhYSIpKTsgIC8vIG1lbWJlciBpbnNpZGUgbG9jYWwKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNNZW1iZXIoImphdmEudXRpbC5NYXAkMSRhYWEiKSk7ICAvLyBtZW1iZXIgaW5zaWRlIGFub255bW91cwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc01lbWJlcigiamF2YS51dGlsLk1hcCRhMSRhYWEkYmJiIikpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc01lbWJlcigiamF2YS51dGlsLk1hcCQxYTEkYWFhIikpOyAgLy8gbWVtYmVyIGluc2lkZSBsb2NhbAotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNNZW1iZXIoImphdmEudXRpbC5NYXAkMWEiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExMjM0NSRiMTIzNDUiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcigiamF2YS51dGlsLk1hcCQxMjM0NWEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcigiamF2YS51dGlsLk1hcCQzMzMiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcigiamF2YS51dGlsLk1hcDMkMzMzIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0xvY2FsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNsYXNzIExvY2FsQ2xhc3MgewotCQkJdm9pZCBmb28oKSB7Ci0JCQkJU3lzdGVtLmdldFByb3BlcnR5KCJmb28iKTsKLQkJCX0KLQkJfQotCQluZXcgTG9jYWxDbGFzcygpLmZvbygpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNMb2NhbChqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTG9jYWwoQ2xhc3MuZm9yTmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxTG9jYWxDbGFzcyIpLmdldE5hbWUoKSkpOyAvLyBsb2NhbAotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNMb2NhbChDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKS5nZXROYW1lKCkpKTsgLy8gYW5vbnltb3VzCi0KLQkJT2JqZWN0W10gYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcFswXTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCWFycmF5ID0gbmV3IGphdmEudXRpbC5NYXAuRW50cnlbMF07IC8vIG1lbWJlcgotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNMb2NhbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBsb2NhbENsYXNzID0gQ2xhc3MuZm9yTmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxTG9jYWxDbGFzcyIpOyAvLyBsb2NhbAotCQlhcnJheSA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UobG9jYWxDbGFzcywgMCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGFub25DbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpOyAvLyBsb2NhbAotCQlhcnJheSA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UoYW5vbkNsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQotCQkvLyB0ZXN0IGEgZmV3IGVkZ2UgY2FzZXMKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAkYTEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJGExJGFhYSRiYmIiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDExJGFhYSIpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNMb2NhbCgiamF2YS51dGlsLk1hcCQxYSIpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNMb2NhbCgiamF2YS51dGlsLk1hcCQyYWJjIikpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDJhYmMxIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNMb2NhbCgiamF2YS51dGlsLk1hcCRhMTIzNDUkYjEyMzQ1IikpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDEyMzQ1JDEyMzRhIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNMb2NhbCgiamF2YS51dGlsLk1hcCQzMzMiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwMyQzMzMiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzQW5vbnltb3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cyhqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0TmFtZSgpKSk7IC8vIG1lbWJlcgotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoQ2xhc3MuZm9yTmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxTG9jYWxDbGFzcyIpLmdldE5hbWUoKSkpOyAvLyBsb2NhbAotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0Fub255bW91cyhDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKS5nZXROYW1lKCkpKTsgLy8gYW5vbnltb3VzCi0KLQkJT2JqZWN0W10gYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcFswXTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cyhhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwLkVudHJ5WzBdOyAvLyBtZW1iZXIKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsb2NhbENsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGFub25DbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpOyAvLyBsb2NhbAotCQlhcnJheSA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UoYW5vbkNsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0KLQkJLy8gdGVzdCBhIGZldyBlZGdlIGNhc2VzCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cygiamF2YS51dGlsLk1hcCRhMSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJGExJGFhYSRiYmIiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxYTEkYWFhIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoImphdmEudXRpbC5NYXAkMSRhIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoImphdmEudXRpbC5NYXAkMWEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cygiamF2YS51dGlsLk1hcCRhMTIzNDUkYjEyMzQ1IikpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoImphdmEudXRpbC5NYXAkMTIzNDUkYTEyMzQiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJDMzMyIpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoImphdmEudXRpbC5NYXAzJDMzMyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNSZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzUmVmZXJlbmNlKGludC5jbGFzcy5nZXROYW1lKCkpKTsgLy8gdG9wLWxldmVsCi0KLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNSZWZlcmVuY2UoamF2YS51dGlsLk1hcC5jbGFzcy5nZXROYW1lKCkpKTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUmVmZXJlbmNlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0TmFtZSgpKSk7IC8vIG1lbWJlcgotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1JlZmVyZW5jZShDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIikuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUmVmZXJlbmNlKENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpLmdldE5hbWUoKSkpOyAvLyBhbm9ueW1vdXMKLQotCQlPYmplY3RbXSBhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwWzBdOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNSZWZlcmVuY2UoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcC5FbnRyeVswXTsgLy8gbWVtYmVyCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUmVmZXJlbmNlKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsb2NhbENsYXNzLCAwKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNSZWZlcmVuY2UoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gYW5vbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShhbm9uQ2xhc3MsIDApOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1JlZmVyZW5jZShhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ByaW1pdGl2ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkpOwotCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlKGludC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNQcmltaXRpdmUoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlKGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlKGphdmEubGFuZy5OdW1iZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNQcmltaXRpdmUoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZShqYXZhLmxhbmcuSW50ZWdlci5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNQcmltaXRpdmVXcmFwcGVyKCkgewotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNQcmltaXRpdmVXcmFwcGVyKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZVdyYXBwZXIoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNQcmltaXRpdmVXcmFwcGVyKGZsb2F0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNQcmltaXRpdmVXcmFwcGVyKGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcucmVmbGVjdC5GaWVsZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuSW50ZWdlci5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNWYXJpYWJsZVByaW1pdGl2ZSgpIHsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKGludC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZShmbG9hdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZShib29sZWFuLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKGphdmEubGFuZy5OdW1iZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKGphdmEubGFuZy5Cb29sZWFuLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcigpIHsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5Wb2lkLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuRmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5Cb29sZWFuLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuTnVtYmVyLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFdyYXBwZXJDbGFzc05hbWUoKSB7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuVm9pZC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRXcmFwcGVyQ2xhc3NOYW1lKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuSW50ZWdlci5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRXcmFwcGVyQ2xhc3NOYW1lKGludC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5GbG9hdC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRXcmFwcGVyQ2xhc3NOYW1lKGZsb2F0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0V3JhcHBlckNsYXNzTmFtZShib29sZWFuLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydE51bGwoQ2xhc3NOYW1lLmdldFdyYXBwZXJDbGFzc05hbWUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJpbWl0aXZlQ2xhc3NOYW1lKCkgewotCQlhc3NlcnRFcXVhbHModm9pZC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRQcmltaXRpdmVDbGFzc05hbWUoamF2YS5sYW5nLlZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0UHJpbWl0aXZlQ2xhc3NOYW1lKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0UHJpbWl0aXZlQ2xhc3NOYW1lKGphdmEubGFuZy5GbG9hdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0UHJpbWl0aXZlQ2xhc3NOYW1lKGphdmEubGFuZy5Cb29sZWFuLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydE51bGwoQ2xhc3NOYW1lLmdldFByaW1pdGl2ZUNsYXNzTmFtZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJlQXV0b2JveEVxdWl2YWxlbnRzKCkgewotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5hcmVBdXRvYm94RXF1aXZhbGVudHMoSW50ZWdlci5jbGFzcy5nZXROYW1lKCksIEludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmFyZUF1dG9ib3hFcXVpdmFsZW50cyhpbnQuY2xhc3MuZ2V0TmFtZSgpLCBJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5hcmVBdXRvYm94RXF1aXZhbGVudHMoSW50ZWdlci5jbGFzcy5nZXROYW1lKCksIGludC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmFyZUF1dG9ib3hFcXVpdmFsZW50cyhpbnQuY2xhc3MuZ2V0TmFtZSgpLCBCb29sZWFuLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5hcmVBdXRvYm94RXF1aXZhbGVudHMoU3RyaW5nLmNsYXNzLmdldE5hbWUoKSwgU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Rm9yQ29kZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlIiwgQ2xhc3NOYW1lLmZvckNvZGUoJ0InKSk7Ci0JCWFzc2VydEVxdWFscygiY2hhciIsIENsYXNzTmFtZS5mb3JDb2RlKCdDJykpOwotCQlhc3NlcnRFcXVhbHMoImRvdWJsZSIsIENsYXNzTmFtZS5mb3JDb2RlKCdEJykpOwotCQlhc3NlcnRFcXVhbHMoImZsb2F0IiwgQ2xhc3NOYW1lLmZvckNvZGUoJ0YnKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgQ2xhc3NOYW1lLmZvckNvZGUoJ0knKSk7Ci0JCWFzc2VydEVxdWFscygibG9uZyIsIENsYXNzTmFtZS5mb3JDb2RlKCdKJykpOwotCQlhc3NlcnRFcXVhbHMoInNob3J0IiwgQ2xhc3NOYW1lLmZvckNvZGUoJ1MnKSk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIENsYXNzTmFtZS5mb3JDb2RlKCdaJykpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBDbGFzc05hbWUuZm9yQ29kZSgnVicpKTsKLQotCQlhc3NlcnROdWxsKENsYXNzTmFtZS5mb3JDb2RlKCdYJykpOwotCi0JCWFzc2VydEVxdWFscygiYnl0ZSIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdCJykpOwotCQlhc3NlcnRFcXVhbHMoImNoYXIiLCBDbGFzc05hbWUuZm9yQ29kZSgoaW50KSAnQycpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkb3VibGUiLCBDbGFzc05hbWUuZm9yQ29kZSgoaW50KSAnRCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmbG9hdCIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdGJykpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdJJykpOwotCQlhc3NlcnRFcXVhbHMoImxvbmciLCBDbGFzc05hbWUuZm9yQ29kZSgoaW50KSAnSicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzaG9ydCIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdTJykpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCBDbGFzc05hbWUuZm9yQ29kZSgoaW50KSAnWicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2b2lkIiwgQ2xhc3NOYW1lLmZvckNvZGUoKGludCkgJ1YnKSk7Ci0KLQkJYXNzZXJ0TnVsbChDbGFzc05hbWUuZm9yQ29kZSgoaW50KSAnWCcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29kZUZvckNsYXNzTmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCdJJywgQ2xhc3NOYW1lLmdldENvZGVGb3JDbGFzc05hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoJ0knLCBDbGFzc05hbWUuZ2V0Q29kZUZvckNsYXNzTmFtZSgiaW50IikpOwotCQlhc3NlcnRFcXVhbHMoJ0InLCBDbGFzc05hbWUuZ2V0Q29kZUZvckNsYXNzTmFtZShieXRlLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoJ0InLCBDbGFzc05hbWUuZ2V0Q29kZUZvckNsYXNzTmFtZSgiYnl0ZSIpKTsKLQotCQlhc3NlcnRFcXVhbHMoKGNoYXIpIDAsIENsYXNzTmFtZS5nZXRDb2RlRm9yQ2xhc3NOYW1lKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlPYmplY3QgYXQgPSBSZWZsZWN0aW9uVG9vbHMubmV3SW5zdGFuY2UoQ2xhc3NOYW1lLmNsYXNzKTsKLQkJCWZhaWwoImJvZ3VzOiAiICsgYXQpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJCWlmIChleC5nZXRDYXVzZSgpLmdldENhdXNlKCkgaW5zdGFuY2VvZiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbikgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc3BhdGhUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc3BhdGhUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWQ3YzY3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ2xhc3NwYXRoVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc3BhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9IT01FID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKTsKLQotCXB1YmxpYyBDbGFzc3BhdGhUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcHJlc3NlZCgpIHsKLQkJU3RyaW5nIHBhdGggPSAiIjsKLQotCQkvLyBubyBjaGFuZ2VzCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkuZ2V0UGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLmdldFBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLmdldFBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkuZ2V0UGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcamRrXFxydC5qYXI7Ozs7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyOzs7IikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJLy8gbm8gY2hhbmdlcwotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLmdldFBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXC4uXFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpkazFcXGpkazJcXGpkazNcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrMVxcamRrMlxcamRrM1xcLi5cXC4uXFwuLlxcamRrMVxcamRrMlxcamRrM1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLmdldFBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGsxXFxqZGsyXFxqZGszXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQ2xhc3NOYW1lKCkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyI7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IENsYXNzcGF0aC5jb252ZXJ0VG9DbGFzc05hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSwgY2xhc3NOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQ2xhc3MoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9ICJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIjsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlDbGFzczw/PiBqYXZhQ2xhc3MgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3MoZmlsZSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhQ2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKCkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBDbGFzc3BhdGguY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIiwgZmlsZU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9BcmNoaXZlRW50cnlOYW1lQmFzZSgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0FyY2hpdmVFbnRyeU5hbWVCYXNlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEvbGFuZy9TdHJpbmciLCBmaWxlTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NsYXNzRmlsZU5hbWUoKSB7Ci0JCWNoYXIgc2MgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IENsYXNzcGF0aC5jb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuY2xhc3MiLCBmaWxlTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NsYXNzRmlsZVN0cmluZygpIHsKLQkJY2hhciBzYyA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJRmlsZSBmaWxlID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0NsYXNzRmlsZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YSIgKyBzYyArICJsYW5nIiArIHNjICsgIlN0cmluZy5jbGFzcyIsIGZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQ2xhc3NGaWxlQ2xhc3MoKSB7Ci0JCWNoYXIgc2MgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCUZpbGUgZmlsZSA9IENsYXNzcGF0aC5jb252ZXJ0VG9DbGFzc0ZpbGUoamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YSIgKyBzYyArICJsYW5nIiArIHNjICsgIlN0cmluZy5jbGFzcyIsIGZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvSmF2YUZpbGVOYW1lKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBDbGFzc3BhdGguY29udmVydFRvSmF2YUZpbGVOYW1lKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuamF2YSIsIGZpbGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvSmF2YUZpbGVTdHJpbmcoKSB7Ci0JCWNoYXIgc2MgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCUZpbGUgZmlsZSA9IENsYXNzcGF0aC5jb252ZXJ0VG9KYXZhRmlsZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YSIgKyBzYyArICJsYW5nIiArIHNjICsgIlN0cmluZy5qYXZhIiwgZmlsZS5nZXRQYXRoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9KYXZhRmlsZUNsYXNzKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlGaWxlIGZpbGUgPSBDbGFzc3BhdGguY29udmVydFRvSmF2YUZpbGUoamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YSIgKyBzYyArICJsYW5nIiArIHNjICsgIlN0cmluZy5qYXZhIiwgZmlsZS5nZXRQYXRoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9GaWxlTmFtZUJhc2UoKSB7Ci0JCWNoYXIgc2MgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IENsYXNzcGF0aC5jb252ZXJ0VG9GaWxlTmFtZUJhc2UoamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YSIgKyBzYyArICJsYW5nIiArIHNjICsgIlN0cmluZyIsIGZpbGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVVJMcygpIHsKLQkJSXRlcmF0b3I8VVJMPiBlbnRyaWVzID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmdldFVSTHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaFVSTCgiL0M6L2pkay9ydC5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGhVUkwoIi9DOi9qZGsvaTE4bi5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGhVUkwoIi9DOi9qZGsvamF3cy5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGhVUkwoIi9DOi9mb28vY2xhc3NlcyIpLCBlbnRyaWVzLm5leHQoKS5nZXRQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaFVSTCgiL0M6L2Jhci9iYXIuamFyIiksIGVudHJpZXMubmV4dCgpLmdldFBhdGgoKSk7Ci0JCWFzc2VydEZhbHNlKGVudHJpZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW50cmllcygpIHsKLQkJQ2xhc3NwYXRoIGNwID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXI7Oy47QzpcXGpka1xcaTE4bi5qYXI7OztDOlxcamRrXFxqYXdzLmphcjs7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyO0M6XFxiYXJcXGJhci5qYXI7IikpOwotCQlJdGVyYXRvcjxDbGFzc3BhdGguRW50cnk+IGVudHJpZXMgPSBjcC5nZXRFbnRyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIi4iKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGphd3MuamFyIiksIGVudHJpZXMubmV4dCgpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGZvb1xcY2xhc3NlcyIpLCBlbnRyaWVzLm5leHQoKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxiYXJcXGJhci5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcYmFyXFxiYXIuamFyIiksIGVudHJpZXMubmV4dCgpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRGYWxzZShlbnRyaWVzLmhhc05leHQoKSk7Ci0KLQkJY3AgPSBjcC5jb21wcmVzc2VkKCk7Ci0JCWVudHJpZXMgPSBjcC5nZXRFbnRyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIi4iKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGphd3MuamFyIiksIGVudHJpZXMubmV4dCgpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGZvb1xcY2xhc3NlcyIpLCBlbnRyaWVzLm5leHQoKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxiYXJcXGJhci5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGVudHJpZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW50cnlGb3JGaWxlTmFtZWQoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IG51bGw7Ci0KLQkJLy8gaW4gdGhlIG1pZGRsZSAtIHF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gaW4gdGhlIG1pZGRsZSAtIHVucXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtydC5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJydC5qYXIiLCBlbnRyeS5nZXRGaWxlTmFtZSgpKTsKLQotCQkvLyBhdCB0aGUgYmVnaW5uaW5nIC0gcXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5nZXRGaWxlTmFtZSgpKTsKLQotCQkvLyBhdCB0aGUgYmVnaW5uaW5nIC0gdW5xdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoInJ0LmphcjtDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXIiKSkuZ2V0RW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHMoInJ0LmphciIsIGVudHJ5LmdldEZpbGVOYW1lKCkpOwotCi0JCS8vIGF0IHRoZSBlbmQgLSBxdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtDOlxcamRrXFxydC5qYXIiKSkuZ2V0RW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmdldEZpbGVOYW1lKCkpOwotCi0JCS8vIGF0IHRoZSBlbmQgLSB1bnF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyO3J0LmphciIpKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscygicnQuamFyIiwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gYWxvbmUgLSBxdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gYWxvbmUgLSB1bnF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgoInJ0LmphciIpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJydC5qYXIiLCBlbnRyeS5nZXRGaWxlTmFtZSgpKTsKLQotCQkvLyB0cmljayBlbnRyeSBhdCB0aGUgYmVnaW5uaW5nCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJydC5qYXIubmV3O0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXIiKSkuZ2V0RW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmdldEZpbGVOYW1lKCkpOwotCi0JCS8vIHRyaWNrIGVudHJ5IGluIHRoZSBtaWRkbGUKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoInJ0Lmphci5uZXc7QzpcXGpka1xccnRydHJ0LmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5nZXRGaWxlTmFtZSgpKTsKLQotCQkvLyB0cmljayBlbnRyeSBhdCB0aGUgZW5kCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJydC5qYXIubmV3O0M6XFxqZGtcXHJ0cnRydC5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtDOlxcamRrXFxydHJ0cnQuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5nZXRGaWxlTmFtZSgpKTsKLQotCQkvLyBtaXNzaW5nCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJydC5qYXIubmV3O0M6XFxqZGtcXHJ0cnRydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyO0M6XFxqZGtcXHJ0cnRydC5qYXIiKSkuZ2V0RW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHMoInBhdGggZW50cnkgc2hvdWxkIG5vdCBiZSBmb3VuZCIsIG51bGwsIGVudHJ5KTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRFbnRyeUZvckNsYXNzTmFtZWQoKSB7Ci0JCWFzc2VydE5vdE51bGwoQ2xhc3NwYXRoLmNvbXBsZXRlQ2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydE51bGwoQ2xhc3NwYXRoLmNvbXBsZXRlQ2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKCJmb28uYmFyLkJheiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb25Gb3JDbGFzcygpIHsKLQkJQ2xhc3M8Pz4gamF2YUNsYXNzID0gQ2xhc3NwYXRoLmNsYXNzOwotCQlGaWxlIGVudHJ5ID0gbmV3IEZpbGUoQ2xhc3NwYXRoLmxvY2F0aW9uRm9yKGphdmFDbGFzcykpOwotCQlpZiAoZW50cnkuaXNGaWxlKCkgfHwgZW50cnkuaXNEaXJlY3RvcnkoKSkgewotCQkJYXNzZXJ0VHJ1ZShlbnRyeS5leGlzdHMoKSk7Ci0JCX0KLQkJaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCWFzc2VydFRydWUobmV3IEZpbGUoZW50cnksIENsYXNzcGF0aC5jb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGphdmFDbGFzcykpLmV4aXN0cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSdEphck5hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHJ0RmlsZSA9IG5ldyBGaWxlKENsYXNzcGF0aC5ydEphck5hbWUoKSk7Ci0JCWFzc2VydFRydWUoInJ0LmphciBkb2VzIG5vdCBleGlzdCIsIHJ0RmlsZS5leGlzdHMoKSk7Ci0KLQkJSmFyRmlsZSBydEphckZpbGUgPSBuZXcgSmFyRmlsZShydEZpbGUpOwotCQlKYXJFbnRyeSBlbnRyeSA9IHJ0SmFyRmlsZS5nZXRKYXJFbnRyeSgiamF2YS9sYW5nL09iamVjdC5jbGFzcyIpOwotCQlydEphckZpbGUuY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgcnQuamFyIiwgZW50cnkgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEpSRUNsYXNzTmFtZXMoKSB7Ci0JCWFzc2VydFRydWUoIlZlY3RvciBpcyBtaXNzaW5nIGZyb20gSlJFIGNsYXNzIG5hbWVzIiwgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0Q2xhc3NOYW1lcygpLCBqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKCJGaWxlIGlzIG1pc3NpbmcgZnJvbSBKUkUgY2xhc3MgbmFtZXMiLCBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoQ2xhc3NwYXRoLmJvb3RDbGFzc3BhdGgoKS5nZXRDbGFzc05hbWVzKCksIGphdmEuaW8uRmlsZS5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUV4dGVuc2lvbkRpcmVjdG9yeU5hbWVzKCkgewotCQljaGFyIHNlcCA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJU3RyaW5nIHN0ZEV4dERpck5hbWUgPSBKQVZBX0hPTUUgKyBzZXAgKyAibGliIiArIHNlcCArICJleHQiOwotCQlhc3NlcnRUcnVlKCJzdGFuZGFyZCBleHRlbnNpb24gZGlyIG5hbWUgbWlzc2luZzogIiArIHN0ZEV4dERpck5hbWUsIEFycmF5VG9vbHMuY29udGFpbnMoQ2xhc3NwYXRoLmphdmFFeHRlbnNpb25EaXJlY3RvcnlOYW1lcygpLCBzdGRFeHREaXJOYW1lKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFFeHRlbnNpb25EaXJlY3RvcmllcygpIHsKLQkJY2hhciBzZXAgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCUZpbGUgc3RkRXh0RGlyID0gbmV3IEZpbGUoSkFWQV9IT01FICsgc2VwICsgImxpYiIgKyBzZXAgKyAiZXh0Iik7Ci0JCWFzc2VydFRydWUoInN0YW5kYXJkIGV4dGVuc2lvbiBkaXIgbWlzc2luZzogIiArIHN0ZEV4dERpci5nZXRQYXJlbnQoKSwgQXJyYXlUb29scy5jb250YWlucyhDbGFzc3BhdGguamF2YUV4dGVuc2lvbkRpcmVjdG9yaWVzKCksIHN0ZEV4dERpcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoRW50cmllcygpIHsKLQkJY2hhciBzZXAgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCVN0cmluZyBqZGsgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIpOwotCQlpZiAoamRrLnN0YXJ0c1dpdGgoIjEuNCIpIHx8IGpkay5zdGFydHNXaXRoKCIxLjUiKSB8fCBqZGsuc3RhcnRzV2l0aCgiMS42IikpIHsKLQkJCUNvbGxlY3Rpb248U3RyaW5nPiBqYXJOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJSXRlcmFibGU8Q2xhc3NwYXRoLkVudHJ5PiBlbnRyaWVzID0gQ2xhc3NwYXRoLmphdmFFeHRlbnNpb25DbGFzc3BhdGgoKS5nZXRFbnRyaWVzKCk7Ci0JCQlmb3IgKENsYXNzcGF0aC5FbnRyeSBlbnRyeSA6IGVudHJpZXMpIHsKLQkJCQlqYXJOYW1lcy5hZGQoZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0JCQl9Ci0JCQlTdHJpbmcgc3RkRXh0SmFyTmFtZSA9IEpBVkFfSE9NRSArIHNlcCArICJsaWIiICsgc2VwICsgImV4dCIgKyBzZXAgKyAiZG5zbnMuamFyIjsKLQkJCVN0cmluZyBtc2cgPSAiamRrIDEuNC54IHN0YW5kYXJkIGV4dGVuc2lvbiBqYXIgbWlzc2luZzogIiArIHN0ZEV4dEphck5hbWU7Ci0JCQlib29sZWFuIGphclByZXNlbnQgPSBqYXJOYW1lcy5jb250YWlucyhzdGRFeHRKYXJOYW1lKTsKLQkJCWlmIChUb29scy5qdm1Jc1N1bigpIHx8IChUb29scy5qdm1Jc0lCTSgpICYmIGpkay5zdGFydHNXaXRoKCIxLjYiKSkpIHsKLQkJCQlhc3NlcnRUcnVlKG1zZywgamFyUHJlc2VudCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmYWlsKCJ3ZSBuZWVkIHRvIHVwZGF0ZSB0aGlzIHRlc3QgZm9yIHRoZSBjdXJyZW50IGpkayIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFFeHRlbnNpb25DbGFzc05hbWVzKCkgewotCQlTdHJpbmcgamRrID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKTsKLQkJaWYgKGpkay5zdGFydHNXaXRoKCIxLjQiKSB8fCBqZGsuc3RhcnRzV2l0aCgiMS41IikgfHwgamRrLnN0YXJ0c1dpdGgoIjEuNiIpKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gInN1bi5uZXQuc3BpLm5hbWVzZXJ2aWNlLmRucy5ETlNOYW1lU2VydmljZSI7Ci0JCQlTdHJpbmcgbXNnID0gImpkayAxLjQueCBzdGFuZGFyZCBleHRlbnNpb24gY2xhc3MgbWlzc2luZzogIiArIGNsYXNzTmFtZTsKLQkJCWJvb2xlYW4gY2xhc3NQcmVzZW50ID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5qYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoKCkuY2xhc3NOYW1lcygpLCBjbGFzc05hbWUpOwotCQkJaWYgKFRvb2xzLmp2bUlzU3VuKCkgfHwgKFRvb2xzLmp2bUlzSUJNKCkgJiYgamRrLnN0YXJ0c1dpdGgoIjEuNiIpKSkgewotCQkJCWFzc2VydFRydWUobXNnLCBjbGFzc1ByZXNlbnQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZmFpbCgid2UgbmVlZCB0byB1cGRhdGUgdGhpcyB0ZXN0IGZvciB0aGUgY3VycmVudCBqZGsiKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQ2xhc3NwYXRoQ2xhc3NOYW1lcygpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCUNsYXNzTG9hZGVyIGNsID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0JCS8vIG1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgIm5vcm1hbCIgY2xhc3MgbG9hZGVyOwotCQkvLyB3aGVuIHRoZSB0ZXN0cyBhcmUgZXhlY3V0ZWQgYXMgYW4gQU5UIHRhc2ssIHRoZXkgYXJlIHJ1biB1bmRlcgotCQkvLyBhbiBBTlQgY2xhc3MgbG9hZGVyIGFuZCB0aGUgIkphdmEiIGNsYXNzcGF0aCBkb2VzIG5vdCBpbmNsdWRlIHRoaXMgY2xhc3MKLQkJaWYgKGNsLmdldENsYXNzKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInN1bi5taXNjIikpIHsKLQkJCWFzc2VydFRydWUoImNsYXNzIG1pc3Npbmc6ICIgKyBjbGFzc05hbWUsIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhDbGFzc3BhdGguamF2YUNsYXNzcGF0aCgpLmdldENsYXNzTmFtZXMoKSwgY2xhc3NOYW1lKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGVDbGFzc3BhdGhDbGFzc05hbWVzKCkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJQ2xhc3NMb2FkZXIgY2wgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJLy8gbWFrZSBzdXJlIHdlIGFyZSBydW5uaW5nIHVuZGVyIHRoZSAibm9ybWFsIiBjbGFzcyBsb2FkZXI7Ci0JCS8vIHdoZW4gdGhlIHRlc3RzIGFyZSBleGVjdXRlZCBhcyBhbiBBTlQgdGFzaywgdGhleSBhcmUgcnVuIHVuZGVyCi0JCS8vIGFuIEFOVCBjbGFzcyBsb2FkZXIgYW5kIHRoZSAiSmF2YSIgY2xhc3NwYXRoIGRvZXMgbm90IGluY2x1ZGUgdGhpcyBjbGFzcwotCQlpZiAoY2wuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuc3RhcnRzV2l0aCgic3VuLm1pc2MiKSkgewotCQkJYXNzZXJ0VHJ1ZSgiY2xhc3MgbWlzc2luZzogIiArIGNsYXNzTmFtZSwgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5jb21wbGV0ZUNsYXNzcGF0aCgpLmdldENsYXNzTmFtZXMoKSwgY2xhc3NOYW1lKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NwYXRoRm9yQ2xhc3MoKSB7Ci0JCWFzc2VydE5vdE51bGwoQ2xhc3NwYXRoLmNsYXNzcGF0aEZvcihqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENsYXNzTmFtZXNUbygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMTAwMCk7Ci0JCUNsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuYWRkQ2xhc3NOYW1lc1RvKGNsYXNzTmFtZXMpOwotCQlhc3NlcnRUcnVlKGNsYXNzTmFtZXMuY29udGFpbnMoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwoQ2xhc3NwYXRoLmJvb3RDbGFzc3BhdGgoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50cnlfZ2V0Q2Fub25pY2FsRmlsZSgpIHsKLQkJQ2xhc3NwYXRoLkVudHJ5IGVudHJ5ID0gQ2xhc3NwYXRoLmJvb3RDbGFzc3BhdGgoKS5nZXRFbnRyeUZvckNsYXNzTmFtZWQoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGVudHJ5LmdldENhbm9uaWNhbEZpbGUoKS5nZXRQYXRoKCkuZW5kc1dpdGgoIi5qYXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2dldENhbm9uaWNhbEZpbGVOYW1lKCkgewotCQlDbGFzc3BhdGguRW50cnkgZW50cnkgPSBDbGFzc3BhdGguYm9vdENsYXNzcGF0aCgpLmdldEVudHJ5Rm9yQ2xhc3NOYW1lZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChUb29scy5qdm1Jc1N1bigpKSB7Ci0JCQlhc3NlcnRUcnVlKGVudHJ5LmdldENhbm9uaWNhbEZpbGVOYW1lKCkuZW5kc1dpdGgoInJ0LmphciIpKTsKLQkJfSBlbHNlIGlmIChUb29scy5qdm1Jc0lCTSgpKSB7Ci0JCQlhc3NlcnRUcnVlKGVudHJ5LmdldENhbm9uaWNhbEZpbGVOYW1lKCkuZW5kc1dpdGgoInZtLmphciIpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnRyeV9lcXVhbHMoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZW50cnkuZXF1YWxzKCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2NvbnRhaW5zQ2xhc3MoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRyeS5jb250YWlucyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2NvbnRhaW5zU3RyaW5nKCkgewotCQlDbGFzc3BhdGguRW50cnkgZW50cnkgPSBDbGFzc3BhdGguYm9vdENsYXNzcGF0aCgpLmdldEVudHJ5Rm9yQ2xhc3NOYW1lZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoZW50cnkuY29udGFpbnMoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50cnlfZ2V0Q2xhc3NOYW1lcygpIHsKLQkJQ2xhc3NwYXRoLkVudHJ5IGVudHJ5ID0gQ2xhc3NwYXRoLmJvb3RDbGFzc3BhdGgoKS5nZXRFbnRyeUZvckNsYXNzTmFtZWQoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhlbnRyeS5nZXRDbGFzc05hbWVzKCksIGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2NsYXNzTmFtZXMoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoZW50cnkuY2xhc3NOYW1lcygpLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCS8qKgotCSAqIG1vcnBoIHRoZSBzcGVjaWZpZWQgcGF0aCB0byBhIHBsYXRmb3JtLWluZGVwZW5kZW50IHBhdGgKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtb3JwaChTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gcGF0aDsKLQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoJzsnLCBGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKTsKLQkJaWYgKCFBcnJheVRvb2xzLmNvbnRhaW5zKEZpbGUubGlzdFJvb3RzKCksIG5ldyBGaWxlKCJDOlxcIikpKSB7Ci0JCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbCgiQzoiLCAiIik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBtb3JwaCB0aGUgc3BlY2lmaWVkIFVSTCB0byBhIHBsYXRmb3JtLWluZGVwZW5kZW50IHBhdGgKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtb3JwaFVSTChTdHJpbmcgdXJsKSB7Ci0JCVN0cmluZyByZXN1bHQgPSB1cmw7Ci0JCWlmICghQXJyYXlUb29scy5jb250YWlucyhGaWxlLmxpc3RSb290cygpLCBuZXcgRmlsZSgiQzpcXCIpKSkgewotCQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoIi9DOiIsICIiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db2xsZWN0aW9uVG9vbHNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db2xsZWN0aW9uVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTc4N2FlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJldmVyc2VDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLmVudW1lcmF0aW9ucy5FbXB0eUVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uVG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDb2xsZWN0aW9uVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhYmxlX1N0cmluZ01vZGlmaWVkKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QxLCBpdGVyYWJsZTIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0MS5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVfU3RyaW5nVW5tb2RpZmllZCgpIHsKLQkJU2V0PFN0cmluZz4gc2V0MSA9IHRoaXMuYnVpbGRTdHJpbmdTZXQxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgc2V0MQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGl0ZXJhYmxlMy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0MS5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVfT2JqZWN0TW9kaWZpZWQoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBsaXN0MSA9IHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGl0ZXJhYmxlMikpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0MS5jb250YWluc0FsbCgoTGlzdDxTdHJpbmc+KSBpdGVyYWJsZTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhYmxlX09iamVjdFVubW9kaWZpZWQoKSB7Ci0JCVNldDxPYmplY3Q+IHNldDEgPSB0aGlzLmJ1aWxkT2JqZWN0U2V0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOyAvLyBzYW1lIGVsZW1lbnRzIGFzIHNldDEKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBpdGVyYWJsZTMpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKChMaXN0PFN0cmluZz4pIGl0ZXJhYmxlMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVfRW1wdHlJdGVyYWJsZSgpIHsKLQkJU2V0PE9iamVjdD4gc2V0MSA9IHRoaXMuYnVpbGRPYmplY3RTZXQxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0MSwgRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQxLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZUludF9Nb2RpZmllZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IGxpc3QyOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGl0ZXJhYmxlMiwgbGlzdDIuc2l6ZSgpKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZUludF9Vbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQxID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgc2V0MQotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMyA9IGxpc3QxOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGl0ZXJhYmxlMywgbGlzdDEuc2l6ZSgpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0MS5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmF0b3JfU3RyaW5nTW9kaWZpZWQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QxLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9TdHJpbmdVbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQxID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgczEKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBsaXN0My5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0MS5jb250YWluc0FsbChsaXN0MykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmF0b3JfT2JqZWN0TW9kaWZpZWQoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBsaXN0MSA9IHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QxLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RVbm1vZGlmaWVkKCkgewotCQlTZXQ8T2JqZWN0PiBzZXQxID0gdGhpcy5idWlsZE9iamVjdFNldDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgczEKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBsaXN0My5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0MS5jb250YWluc0FsbChsaXN0MykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmF0b3JfRW1wdHlJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0MS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmF0b3JJbnRfTW9kaWZpZWQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QxLCBsaXN0Mi5pdGVyYXRvcigpLCAzKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvckludF9Vbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQxID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgczEKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBsaXN0My5pdGVyYXRvcigpLCAzKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0MS5jb250YWluc0FsbChsaXN0MykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmF0b3JJbnRfRW1wdHlJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpLCAwKSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0MS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfU3RyaW5nTW9kaWZpZWQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCBhKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWluc0FsbChDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihhKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfU3RyaW5nTGlzdEVtcHR5QXJyYXkoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgbmV3IFN0cmluZ1swXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfU3RyaW5nVW5tb2RpZmllZCgpIHsKLQkJU2V0PFN0cmluZz4gc2V0ID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQsIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHNldC5jb250YWluc0FsbChDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihhKSkpOwotCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0LCBuZXcgU3RyaW5nWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9TdHJpbmdTZXRFbXB0eUFycmF5KCkgewotCQlTZXQ8U3RyaW5nPiBzZXQgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldCwgbmV3IFN0cmluZ1swXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfT2JqZWN0TW9kaWZpZWQoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBsaXN0ID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGEpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9PYmplY3RVbm1vZGlmaWVkKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTZXQ8T2JqZWN0PiBzZXQgPSB0aGlzLmJ1aWxkT2JqZWN0U2V0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldCwgYSkpOwotCQlhc3NlcnRFcXVhbHMoMywgc2V0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0LmNvbnRhaW5zQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGEpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRPYmplY3RBcnJheSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAiWCIsICJYIiwgIlgiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50T2JqZWN0QXJyYXlfWmVybygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAwLCBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRPYmplY3RBcnJheV9FbXB0eUFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgIlgiLCAiWCIsICJYIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlX1plcm8oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMCwgaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYWJsZV9FbXB0eUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYWJsZUludCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJYIiwgIlgiLCAiWCIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYWJsZUludF9aZXJvKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDAsIGl0ZXJhYmxlLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgIlgiLCAiWCIsICJYIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmFibGVJbnRfRW1wdHlJdGVyYWJsZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBpdGVyYWJsZSwgMCk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSkuaXRlcmF0b3IoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBpdGVyYXRvcik7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJYIiwgIlgiLCAiWCIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYXRvcl9aZXJvKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pLml0ZXJhdG9yKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMCwgaXRlcmF0b3IpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYXRvckludCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KS5pdGVyYXRvcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhdG9yLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgIlgiLCAiWCIsICJYIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9ySW50X1plcm8oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSkuaXRlcmF0b3IoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAwLCBpdGVyYXRvciwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9ySW50X0VtcHR5SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmF0b3IsIDApOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmFnICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdFbnVtZXJhdGlvbl9TdHJpbmcoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkuZWxlbWVudHMoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uX09iamVjdCgpIHsKLQkJQmFnPE9iamVjdD4gYiA9IENvbGxlY3Rpb25Ub29scy48T2JqZWN0PmJhZyh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdFbnVtZXJhdGlvbl9FbXB0eSgpIHsKLQkJQmFnPE9iamVjdD4gYiA9IENvbGxlY3Rpb25Ub29scy48T2JqZWN0PmJhZyhFbXB0eUVudW1lcmF0aW9uLmluc3RhbmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYi5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdFbnVtZXJhdGlvbkludCgpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKS5lbGVtZW50cygpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnRW51bWVyYXRpb25JbnRfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEVtcHR5RW51bWVyYXRpb24uPFN0cmluZz5pbnN0YW5jZSgpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmFibGVJbnQoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoaXRlcmFibGUsIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JfU3RyaW5nKCkgewotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0l0ZXJhdG9yX1N0cmluZ09iamVjdCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlCYWc8T2JqZWN0PiBiID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+YmFnKGMuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbChjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0l0ZXJhdG9yX0VtcHR5KCkgewotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyhFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0l0ZXJhdG9ySW50KCkgewotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0l0ZXJhdG9ySW50X0VtcHR5KCkgewotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyhFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKSwgMyk7Ci0JCWFzc2VydEVxdWFscygwLCBiLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ09iamVjdEFycmF5KCkgewotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChiLCAoT2JqZWN0W10pIHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdPYmplY3RBcnJheV9WYXJhcmcoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKCJmb28iLCAiYmFyIiwgImJheiIpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChiLCBuZXcgT2JqZWN0W117ImZvbyIsICJiYXIiLCAiYmF6In0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnT2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEJhZy5FbXB0eS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYi5zaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uRW51bWVyYXRpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKS5lbGVtZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkVudW1lcmF0aW9uX09iamVjdFN0cmluZygpIHsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGMgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5jb2xsZWN0aW9uKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkuZWxlbWVudHMoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25FbnVtZXJhdGlvbkludCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmFibGVJbnQoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmF0b3JfT2JqZWN0U3RyaW5nKCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYyA9IENvbGxlY3Rpb25Ub29scy48T2JqZWN0PmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmF0b3JJbnQoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uT2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ0FycmF5MSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYywgKE9iamVjdFtdKSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zRW51bWVyYXRpb25PYmplY3RfU3RyaW5nKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gdGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModi5lbGVtZW50cygpLCAib25lIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModi5lbGVtZW50cygpLCBudWxsKSk7Ci0JCXYuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh2LmVsZW1lbnRzKCksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNFbnVtZXJhdGlvbk9iamVjdF9PYmplY3QoKSB7Ci0JCVZlY3RvcjxPYmplY3Q+IGMgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlTdHJpbmcgb25lID0gIm9uZSI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuZWxlbWVudHMoKSwgb25lKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjLmVsZW1lbnRzKCksIG51bGwpKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuZWxlbWVudHMoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0l0ZXJhYmxlT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gYzsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoaXRlcmFibGUsICJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhpdGVyYWJsZSwgbnVsbCkpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoaXRlcmFibGUsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJdGVyYXRvck9iamVjdF9TdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgbnVsbCkpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zSXRlcmF0b3JPYmplY3RfT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYyA9IG5ldyBIYXNoQmFnPE9iamVjdD4oKTsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlTdHJpbmcgb25lID0gIm9uZSI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgb25lKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjLml0ZXJhdG9yKCksIG51bGwpKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgbnVsbCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250YWlucyBhbGwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbkl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbENvbGxlY3Rpb25JdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX09iamVjdCgpIHsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGMxID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWMxLmFkZCgiemVybyIpOwotCQljMS5hZGQoIm9uZSIpOwotCQljMS5hZGQoInR3byIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCJ0d28iKTsKLQkJYzIuYWRkKCJ6ZXJvIik7Ci0JCWMyLmFkZCgib25lIik7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGMxLCBjMi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X1N0cmluZ09iamVjdCgpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbENvbGxlY3Rpb25PYmplY3RBcnJheSgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iIH07Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVDb2xsZWN0aW9uKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlSW50Q29sbGVjdGlvbigpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChpdGVyYWJsZSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYWJsZUl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChpdGVyYWJsZTEsIGl0ZXJhYmxlMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlSW50SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlMSwgMywgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJdGVyYXRvcigpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChpdGVyYWJsZSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlSW50SXRlcmF0b3IoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIDMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYWJsZU9iamVjdEFycmF5KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQkJaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYWJsZUludE9iamVjdEFycmF5KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCAzLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQkJaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCAzLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYXRvckNvbGxlY3Rpb25fU3RyaW5nU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYXRvckNvbGxlY3Rpb25fT2JqZWN0U3RyaW5nKCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYzEgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJYzEuYWRkKCJ6ZXJvIik7Ci0JCWMxLmFkZCgib25lIik7Ci0JCWMxLmFkZCgidHdvIik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoInplcm8iKTsKLQkJYzIuYWRkKCJvbmUiKTsKLQkJYzIuYWRkKCJ0d28iKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYzEuaXRlcmF0b3IoKSwgYzIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYXRvckludENvbGxlY3Rpb24oKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDUsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCA1LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgaXRlcmFibGUpKTsKLQkJaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJbnRJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzLCBpdGVyYWJsZSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYXRvckl0ZXJhdG9yX1N0cmluZ1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySXRlcmF0b3JfT2JqZWN0U3RyaW5nKCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYzEgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJYzEuYWRkKCJ6ZXJvIik7Ci0JCWMxLmFkZCgib25lIik7Ci0JCWMxLmFkZCgidHdvIik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoInplcm8iKTsKLQkJYzIuYWRkKCJvbmUiKTsKLQkJYzIuYWRkKCJ0d28iKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYzEuaXRlcmF0b3IoKSwgYzIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySW50SXRlcmF0b3IoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYXRvck9iamVjdEFycmF5KCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIHRoaXMuYnVpbGRPYmplY3RBcnJheTIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySW50T2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpZmYgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdERpZmZFbmRMaXN0TGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiYSIpOwotCQlsaXN0MS5hZGQoImIiKTsKLQkJbGlzdDEuYWRkKCJjIik7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0Mi5hZGQobmV3IFN0cmluZygiYSIpKTsKLQkJbGlzdDIuYWRkKG5ldyBTdHJpbmcoImIiKSk7Ci0JCWxpc3QyLmFkZChuZXcgU3RyaW5nKCJjIikpOwotCQlhc3NlcnRFcXVhbHMoLTEsIENvbGxlY3Rpb25Ub29scy5kaWZmRW5kKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaWZmUmFuZ2VMaXN0TGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiYSIpOwotCQlsaXN0MS5hZGQoImIiKTsKLQkJbGlzdDEuYWRkKCJjIik7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0Mi5hZGQobmV3IFN0cmluZygiYSIpKTsKLQkJbGlzdDIuYWRkKG5ldyBTdHJpbmcoImIiKSk7Ci0JCWxpc3QyLmFkZChuZXcgU3RyaW5nKCJjIikpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDMsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmRpZmZSYW5nZShsaXN0MSwgbGlzdDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlmZlN0YXJ0TGlzdExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoImEiKTsKLQkJbGlzdDEuYWRkKCJiIik7Ci0JCWxpc3QxLmFkZCgiYyIpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDIuYWRkKG5ldyBTdHJpbmcoImEiKSk7Ci0JCWxpc3QyLmFkZChuZXcgU3RyaW5nKCJiIikpOwotCQlsaXN0Mi5hZGQobmV3IFN0cmluZygiYyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5kaWZmU3RhcnQobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlkZW50aXR5IGRpZmYgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aXR5RGlmZkVuZExpc3RMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCJhIik7Ci0JCWxpc3QxLmFkZCgiYiIpOwotCQlsaXN0MS5hZGQoImMiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QyLmFkZCgiYSIpOwotCQlsaXN0Mi5hZGQoImIiKTsKLQkJbGlzdDIuYWRkKCJjIik7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZkVuZChsaXN0MSwgbGlzdDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlEaWZmUmFuZ2VMaXN0TGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiYSIpOwotCQlsaXN0MS5hZGQoImIiKTsKLQkJbGlzdDEuYWRkKCJjIik7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0Mi5hZGQoImEiKTsKLQkJbGlzdDIuYWRkKCJiIik7Ci0JCWxpc3QyLmFkZCgiYyIpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDMsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZTdGFydExpc3RMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCJhIik7Ci0JCWxpc3QxLmFkZCgiYiIpOwotCQlsaXN0MS5hZGQoImMiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QyLmFkZCgiYSIpOwotCQlsaXN0Mi5hZGQoImIiKTsKLQkJbGlzdDIuYWRkKCJjIik7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVsZW1lbnRzIGFyZSBlcXVhbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVEaWZmZXJlbnRJdGVyYWJsZUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIxMDAwIik7Ci0JCWxpc3QxLmFkZCgiMjAwMCIpOwotCQlsaXN0MS5hZGQoIjMwMDAiKTsKLQkJbGlzdDEuYWRkKCI0MDAwIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVEaWZmZXJlbnQobGlzdDEsIGxpc3QyKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZURpZmZlcmVudEl0ZXJhdG9ySXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjEwMDAiKTsKLQkJbGlzdDEuYWRkKCIyMDAwIik7Ci0JCWxpc3QxLmFkZCgiMzAwMCIpOwotCQlsaXN0MS5hZGQoIjQwMDAiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZURpZmZlcmVudChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUVxdWFsSXRlcmFibGVJdGVyYWJsZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMTAwMCIpOwotCQlsaXN0MS5hZGQoIjIwMDAiKTsKLQkJbGlzdDEuYWRkKCIzMDAwIik7Ci0JCWxpc3QxLmFkZCgiNDAwMCIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QxLnNpemUoKTsgaSsrKSB7Ci0JCQlsaXN0Mi5hZGQoU3RyaW5nLnZhbHVlT2YoKGkgKyAxKSAqIDEwMDApKTsKLQkJfQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwobGlzdDEsIGxpc3QyKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZURpZmZlcmVudChsaXN0MSwgbGlzdDIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChsaXN0MSwgbGlzdDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVFcXVhbEl0ZXJhdG9ySXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjEwMDAiKTsKLQkJbGlzdDEuYWRkKCIyMDAwIik7Ci0JCWxpc3QxLmFkZCgiMzAwMCIpOwotCQlsaXN0MS5hZGQoIjQwMDAiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0MS5zaXplKCk7IGkrKykgewotCQkJbGlzdDIuYWRkKFN0cmluZy52YWx1ZU9mKChpICsgMSkgKiAxMDAwKSk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRGlmZmVyZW50KGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVsZW1lbnRzIGFyZSBpZGVudGljYWwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsSXRlcmFibGVJdGVyYWJsZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMCIpOwotCQlsaXN0MS5hZGQoIjEiKTsKLQkJbGlzdDEuYWRkKCIyIik7Ci0JCWxpc3QxLmFkZCgiMyIpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMSA9IGxpc3QxOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKFN0cmluZyBzIDogbGlzdDEpIHsKLQkJCWxpc3QyLmFkZChzKTsKLQkJfQotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IGxpc3QyOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUlkZW50aWNhbChpdGVyYWJsZTEsIGl0ZXJhYmxlMikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGl0ZXJhYmxlMSwgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsSXRlcmF0b3JJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMCIpOwotCQlsaXN0MS5hZGQoIjEiKTsKLQkJbGlzdDEuYWRkKCIyIik7Ci0JCWxpc3QxLmFkZCgiMyIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKFN0cmluZyBzIDogbGlzdDEpIHsKLQkJCWxpc3QyLmFkZChzKTsKLQkJfQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUlkZW50aWNhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUlkZW50aWNhbEl0ZXJhdG9ySXRlcmF0b3JfTm90KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIwIik7Ci0JCWxpc3QxLmFkZCgiMSIpOwotCQlsaXN0MS5hZGQoIjIiKTsKLQkJbGlzdDEuYWRkKCIzIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIHMgOiBsaXN0MSkgewotCQkJbGlzdDIuYWRkKHMpOwotCQl9Ci0JCWxpc3QyLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUlkZW50aWNhbEl0ZXJhdG9ySXRlcmF0b3JfRGlmZmVyZW50U2l6ZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IGxpc3QxKSB7Ci0JCQlsaXN0Mi5hZGQocyk7Ci0JCX0KLQkJbGlzdDIucmVtb3ZlKDMpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdldCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SXRlcmFibGVJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBsaXN0OwotCQlTdHJpbmcgbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoaXRlcmFibGUsIDEpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIG8pOwotCQlsaXN0LmFkZChudWxsKTsKLQkJbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoaXRlcmFibGUsIDMpOwotCQlhc3NlcnROdWxsKG8pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJdGVyYXRvckludDEoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVN0cmluZyBvID0gQ29sbGVjdGlvblRvb2xzLmdldChsaXN0Lml0ZXJhdG9yKCksIDEpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIG8pOwotCQlsaXN0LmFkZChudWxsKTsKLQkJbyA9IENvbGxlY3Rpb25Ub29scy5nZXQobGlzdC5pdGVyYXRvcigpLCBsaXN0LnNpemUoKSAtIDEpOwotCQlhc3NlcnROdWxsKG8pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJdGVyYXRvckludDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNvbGxlY3Rpb25Ub29scy5nZXQobGlzdC5pdGVyYXRvcigpLCBsaXN0LnNpemUoKSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaGFzaCBjb2RlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZUl0ZXJhYmxlMSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IG51bGw7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuaGFzaENvZGUoaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGVJdGVyYWJsZTIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBsaXN0OwotCQlpbnQgaGFzaENvZGUgPSBDb2xsZWN0aW9uVG9vbHMuaGFzaENvZGUoaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5oYXNoQ29kZSgpLCBoYXNoQ29kZSk7Ci0KLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWhhc2hDb2RlID0gQ29sbGVjdGlvblRvb2xzLmhhc2hDb2RlKGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3QuaGFzaENvZGUoKSwgaGFzaENvZGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRleCBvZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkl0ZXJhYmxlT2JqZWN0X1N0cmluZygpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YoaXRlcmFibGUsICJvbmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZJdGVyYXRvck9iamVjdF9TdHJpbmcoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksICJvbmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZJdGVyYXRvck9iamVjdF9TdHJpbmdfTm90KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QuaXRlcmF0b3IoKSwgbnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QuaXRlcmF0b3IoKSwgInNoYXphbSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkl0ZXJhdG9yT2JqZWN0X051bGwoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5zaXplKCkgLSAxLCBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkl0ZXJhdG9yT2JqZWN0X09iamVjdCgpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQotCQlTdHJpbmcgb25lID0gIjEiOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YobGlzdC5pdGVyYXRvcigpLCBvbmUpKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhsaXN0LnNpemUoKSAtIDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QuaXRlcmF0b3IoKSwgbnVsbCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnNlcnRpb24gaW5kZXggb2YgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydGlvbkluZGV4T2ZMaXN0Q29tcGFyYWJsZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkIiKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJCIiwgIkIiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJFIikpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJBIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnRpb25JbmRleE9mTGlzdE9iamVjdENvbXBhcmF0b3IoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiBjID0gbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQSIgfSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQSIgfSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiwgIkEiIH0pOwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkIiLCBjKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJFIiwgYykpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiIH0pOwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiLCBjKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQSIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJBIiwgYykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpcyBlbXB0eSAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHlJdGVyYWJsZSgpIHsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoYnVpbGRPYmplY3RMaXN0MSgpKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGJ1aWxkT2JqZWN0TGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogaXRlcmFibGUvaXRlcmF0b3IgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhYmxlT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIHN0cmluZ3MgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHN0cmluZ3MpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyaW5nc1tpKytdLCBzdHJpbmcpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihhKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGFzdCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEl0ZXJhYmxlMSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgQ29sbGVjdGlvblRvb2xzLmxhc3QoaXRlcmFibGUpKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBDb2xsZWN0aW9uVG9vbHMubGFzdChpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SXRlcmFibGUyKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNvbGxlY3Rpb25Ub29scy5sYXN0KGl0ZXJhYmxlKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SXRlcmF0b3IxKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIENvbGxlY3Rpb25Ub29scy5sYXN0KGxpc3QuaXRlcmF0b3IoKSkpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIENvbGxlY3Rpb25Ub29scy5sYXN0KGxpc3QuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SXRlcmF0b3IyKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDb2xsZWN0aW9uVG9vbHMubGFzdChsaXN0Lml0ZXJhdG9yKCkpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxhc3QgaW5kZXggb2YgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmFibGVPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBsaXN0OwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGl0ZXJhYmxlLCAib25lIikpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpIC0gMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGl0ZXJhYmxlLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmFibGVJbnRPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBsaXN0OwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGl0ZXJhYmxlLCAyMywgIm9uZSIpKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhsaXN0LnNpemUoKSAtIDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihpdGVyYWJsZSwgNDIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJdGVyYXRvck9iamVjdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksICJvbmUiKSk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5zaXplKCkgLSAxLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YobGlzdC5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmF0b3JPYmplY3RfRW1wdHkoKSB7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJdGVyYXRvckludE9iamVjdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksIDMsICJvbmUiKSk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5zaXplKCkgLSAxLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YobGlzdC5pdGVyYXRvcigpLCA0LCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmF0b3JJbnRPYmplY3RfRW1wdHkoKSB7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgNDIsICJmb28iKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlLCAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcl9TdHJpbmdPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PE9iamVjdD4gbGlzdDIgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5saXN0KGxpc3QxLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMobGlzdDEsIGxpc3QyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yX0VtcHR5KCkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmxpc3QoRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3JJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMyk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvckludF9FbXB0eSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5saXN0KEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgNSkuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdE9iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvck9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLmxpc3RJdGVyYXRvcihhKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yT2JqZWN0QXJyYXlJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMubGlzdEl0ZXJhdG9yKGEsIDEpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhhW2ldLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb3ZlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTGlzdEludEludFJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCBuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pOwotCi0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIsICI1IiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMCwgNSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDIsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjQiLCAiMSIsICIzIiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCAyKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVMaXN0SW50SW50U2VxdWVudGlhbEFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgbmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiB9KTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiNCIsICIxIiwgIjMiLCAiMiIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTGlzdEludEludEludFJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pKTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIzIiwgIjIiLCAiNCIsICI1IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUxpc3RJbnRJbnRJbnRTZXF1ZW50aWFsQWNjZXNzKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pKTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIzIiwgIjIiLCAiNCIsICI1IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhYmxlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYWJsZSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhYmxlKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhYmxlSW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYWJsZSwgNCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhYmxlLCA1NSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQljID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X0VtcHR5KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgNSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCksIDUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uSXRlcmF0b3JfRHVwbGljYXRlcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgaXRlcmF0b3IpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJiIik7Ci0JCWMuYWRkKCJjIik7Ci0JCWMuYWRkKCJkIik7Ci0JCWMuYWRkKCJkIik7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJkIiB9OwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihhKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhdG9yKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImEiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYiIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJjIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJkIikpOwotCi0JCWl0ZXJhdG9yID0gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihhKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYXRvcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBuZXcgT2JqZWN0WzBdKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X0R1cGxpY2F0ZXMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJiIik7Ci0JCWMuYWRkKCJjIik7Ci0JCWMuYWRkKCJkIik7Ci0JCWMuYWRkKCJkIik7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJkIiB9OwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgKE9iamVjdFtdKSBhKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImEiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYiIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJjIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJkIikpOwotCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywoT2JqZWN0W10pICBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9Nb3JlRHVwbGljYXRlcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImMiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCAoT2JqZWN0W10pIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCAoT2JqZWN0W10pIGEpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNDb2xsZWN0aW9uT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgInRocmVlIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAidHdvIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAiZml2ZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsICJmaXZlIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgYy5zaXplKCkpOwotCi0JCWMuYWRkKG51bGwpOwotCQljLmFkZChudWxsKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyg1LCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnRzIGF0IGluZGV4ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhMaXN0SW50SW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfSkpOwotCQlMaXN0PFN0cmluZz4gcmVtb3ZlZCA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgobGlzdCwgMywgMik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiRCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJDIiwgIkEiIH0sIHJlbW92ZWQudG9BcnJheSgpKSk7Ci0KLQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIgfSkpOwotCQlyZW1vdmVkID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChsaXN0LCAzLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJEIiwgIkUiLCAiRiIgfSwgcmVtb3ZlZC50b0FycmF5KCkpKTsKLQotCQlsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiB9KSk7Ci0JCXJlbW92ZWQgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGxpc3QsIDAsIDMpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkQiLCAiRSIsICJGIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiB9LCByZW1vdmVkLnRvQXJyYXkoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZHVwbGljYXRlIGVsZW1lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c0xpc3QxKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ0d28iKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobGlzdCkpOwotCQlpbnQgaSA9IDA7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoaSwgbGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c0xpc3QyKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhsaXN0KSk7Ci0JCWludCBpID0gMDsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgbGlzdC5nZXQoaSsrKSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbGlzdC5nZXQoaSsrKSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgbGlzdC5nZXQoaSsrKSk7Ci0JCWFzc2VydEVxdWFscyhpLCBsaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzTGlzdF9FbXB0eSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRHVwbGljYXRlRWxlbWVudHNMaXN0X1NpbmdsZUVsZW1lbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhsaXN0KSk7Ci0JCWFzc2VydEVxdWFscygxLCBsaXN0LnNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJldGFpbiBhbGwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYWJsZSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIGl0ZXJhYmxlKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgaXRlcmFibGUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uSXRlcmFibGVJbnQoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBpdGVyYWJsZSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0KLQkJaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIGl0ZXJhYmxlLCA3KSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX09iamVjdFN0cmluZygpIHsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGMxID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWMxLmFkZCgiemVybyIpOwotCQljMS5hZGQoIm9uZSIpOwotCQljMS5hZGQoInR3byIpOwotCQkKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQkKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjMSwgYzIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoYzIuc2l6ZSgpLCBjMS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoYzIsIGMxKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzMuYWRkKCJ0aHJlZSIpOwotCQljMy5hZGQoImZvdXIiKTsKLQkJYzMuYWRkKCJmaXZlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uSXRlcmF0b3JfRW1wdHlDb2xsZWN0aW9uRW1wdHlJdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpLCA5KSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X0VtcHR5SXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDApKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X0VtcHR5Q29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvckludF9FbXB0eUNvbGxlY3Rpb25FbXB0eUl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgMCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBuZXcgT2JqZWN0WzBdKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgKE9iamVjdFtdKSBuZXcgU3RyaW5nW10geyAiZm9vIiB9KSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9FbXB0eUNvbGxlY3Rpb25FbXB0eU9iamVjdEFycmF5KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIChPYmplY3RbXSkgbmV3IFN0cmluZ1swXSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXZlcnNlIGxpc3QgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGFjdHVhbCA9IENvbGxlY3Rpb25Ub29scy5yZXZlcnNlTGlzdChpdGVyYWJsZSk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKGV4cGVjdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlTGlzdEl0ZXJhYmxlSW50KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QoaXRlcmFibGUsIDEwKTsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmF0b3JfU3RyaW5nKCkgewotCQlMaXN0PFN0cmluZz4gYWN0dWFsID0gQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUxpc3RJdGVyYXRvcl9PYmplY3QoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5yZXZlcnNlTGlzdCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJTGlzdDxPYmplY3Q+IGV4cGVjdGVkID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmF0b3JJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMzMpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcm90YXRlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gYWN0dWFsID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZSh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9ucy5yb3RhdGUoZXhwZWN0ZWQsIDEpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNldCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNldChpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdTZXQxKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGl0ZXJhYmxlLCAyMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTdHJpbmdTZXQxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYXRvcl9PYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCVNldDxTdHJpbmc+IHNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJc2V0LmFkZEFsbChsaXN0KTsKLQotCQlhc3NlcnRFcXVhbHMoc2V0LCBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5zZXQobGlzdC5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEl0ZXJhdG9ySW50KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLml0ZXJhdG9yKCksIDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTdHJpbmdTZXQxKCkudG9BcnJheSgpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiBpdGVyYXRvciAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uSXRlcmF0b3JfU3RyaW5nKCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcigiZm9vIik7Ci0JCWFzc2VydFRydWUoc3RyZWFtLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbkl0ZXJhdG9yX09iamVjdCgpIHsKLQkJSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5zaW5nbGV0b25JdGVyYXRvcigiZm9vIik7Ci0JCWFzc2VydFRydWUoc3RyZWFtLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbkl0ZXJhdG9yX0Nhc3QoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKChPYmplY3QpICJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShzdHJlYW0uaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJlYW0ubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uTGlzdEl0ZXJhdG9yX1N0cmluZygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkxpc3RJdGVyYXRvcigiZm9vIik7Ci0JCWFzc2VydFRydWUoc3RyZWFtLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHN0cmVhbS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKHN0cmVhbS5oYXNQcmV2aW91cygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpemUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFNpemVJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8T2JqZWN0PiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZUl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5idWlsZE9iamVjdExpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHNvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYWJsZSgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSBsaXN0OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmFibGUxKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChzcywgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYWJsZUludCgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSBsaXN0OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmFibGUxLCA3Nyk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoc3MsIGl0ZXJhYmxlMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0SXRlcmFibGVDb21wYXJhdG9yKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc3MgPSBuZXcgVHJlZVNldDxTdHJpbmc+KG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSBsaXN0OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmFibGUxLCBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChzcywgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYWJsZUNvbXBhcmF0b3JJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMSA9IGxpc3Q7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydChpdGVyYWJsZTEsIG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCksIDc3KTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChzcywgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYXRvcigpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcjEgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydChpdGVyYXRvcjEpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHNzLml0ZXJhdG9yKCksIGl0ZXJhdG9yMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0SXRlcmF0b3JJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MuYWRkQWxsKGxpc3QpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IxID0gbGlzdC5pdGVyYXRvcigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmF0b3IxLCA3Nyk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoc3MuaXRlcmF0b3IoKSwgaXRlcmF0b3IyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYXRvckNvbXBhcmF0b3IoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yMSA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcjIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0KGl0ZXJhdG9yMSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoc3MuaXRlcmF0b3IoKSwgaXRlcmF0b3IyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYXRvckNvbXBhcmF0b3JJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yMSA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcjIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0KGl0ZXJhdG9yMSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSwgNzcpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHNzLml0ZXJhdG9yKCksIGl0ZXJhdG9yMikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzb3J0ZWQgc2V0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRJdGVyYWJsZSgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MxLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbGlzdDsKLQkJU29ydGVkU2V0PFN0cmluZz4gc3MyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydGVkU2V0KGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKHNzMSwgc3MyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmFibGVJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzczEgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0JCXNzMS5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChpdGVyYWJsZSwgNSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhYmxlQ29tcGFyYXRvcigpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzMS5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChpdGVyYWJsZSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhYmxlQ29tcGFyYXRvckludCgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzMS5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChpdGVyYWJsZSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSwgNSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNvcnRlZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldCh0aGlzLmJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmF0b3JfVHJlZVNldCgpIHsKLQkJU29ydGVkU2V0PFN0cmluZz4gc3MxID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzczEuYWRkKCIwIik7Ci0JCXNzMS5hZGQoIjIiKTsKLQkJc3MxLmFkZCgiMyIpOwotCQlzczEuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc2V0MiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChzczEuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNldDIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRJdGVyYXRvckludCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTb3J0ZWRTdHJpbmdTZXQxKCksIENvbGxlY3Rpb25Ub29scy5zb3J0ZWRTZXQodGhpcy5idWlsZFNvcnRlZFN0cmluZ1NldDEoKS5pdGVyYXRvcigpLCA4KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldE9iamVjdEFycmF5KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNvcnRlZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldCh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0T2JqZWN0QXJyYXlDb21wYXJhdG9yKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc3MxID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJc3MxLmFkZEFsbChsaXN0KTsKLQotCQlTdHJpbmdbXSBhcnJheSA9IGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChhcnJheSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9sZCBTY2hvb2wgVmVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlWZWN0b3I8U3RyaW5nPiB2ID0gQ29sbGVjdGlvblRvb2xzLnZlY3RvcihpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlWZWN0b3I8U3RyaW5nPiB2ID0gQ29sbGVjdGlvblRvb2xzLnZlY3RvcihpdGVyYWJsZSwgOCk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9ySXRlcmF0b3JfT2JqZWN0KCkgewotCQlWZWN0b3I8T2JqZWN0PiB2ID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+dmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9ySXRlcmF0b3JJbnQoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDcpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaW5nbGUtdXNlIGl0ZXJhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYWJsZUl0ZXJhdG9yKCkgewotCQlJdGVyYXRvcjxPYmplY3Q+IGVtcHR5SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUl0ZXJhYmxlPE9iamVjdD4gZW1wdHlJdGVyYWJsZSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShlbXB0eUl0ZXJhdG9yKTsKLQkJCi0JCWFzc2VydEZhbHNlKGVtcHR5SXRlcmFibGUuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWVtcHR5SXRlcmF0b3IgPSBlbXB0eUl0ZXJhYmxlLml0ZXJhdG9yKCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGl0ZXJhdG9yOiAiICsgZW1wdHlJdGVyYXRvcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24uIiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmFibGVJdGVyYXRvcl9OUEUoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gbnVsbEl0ZXJhdG9yID0gbnVsbDsKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUl0ZXJhYmxlPE9iamVjdD4gZW1wdHlJdGVyYWJsZSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShudWxsSXRlcmF0b3IpOwotCQkJZmFpbCgiaW52YWxpZCBpdGVyYWJsZTogIiArIGVtcHR5SXRlcmFibGUpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBpc2UpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYWJsZUl0ZXJhdG9yX1RvU3RyaW5nKCkgewotCQlJdGVyYXRvcjxPYmplY3Q+IGVtcHR5SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUl0ZXJhYmxlPE9iamVjdD4gZW1wdHlJdGVyYWJsZSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShlbXB0eUl0ZXJhdG9yKTsKLQkJYXNzZXJ0Tm90TnVsbChlbXB0eUl0ZXJhYmxlLnRvU3RyaW5nKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMgZW5oYW5jZW1lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5TGlzdExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzcmMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGRlc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IHNyYykgewotCQkJZGVzdC5hZGQocy50b1VwcGVyQ2FzZSgpKTsKLQkJfQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLmNvcHkoZGVzdCwgc3JjKTsKLQkJYXNzZXJ0U2FtZShkZXN0LCByZXN1bHQpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUlkZW50aWNhbChzcmMsIGRlc3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbExpc3RPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuZmlsbChsaXN0LCAiZm9vIik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogcmVzdWx0KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0cmluZyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUxpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuc2h1ZmZsZShsaXN0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaHVmZmxlTGlzdFJhbmRvbSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5zaHVmZmxlKGxpc3QsIG5ldyBSYW5kb20oKSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuc29ydChsaXN0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHNzLCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcExpc3RJbnRJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuc3dhcChsaXN0LCAwLCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOwotCQlMaXN0PFN0cmluZz4gb3JpZ2luYWwgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmdldCgwKSwgcmVzdWx0LmdldCgxKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5nZXQoMSksIHJlc3VsdC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuZ2V0KDIpLCByZXN1bHQuZ2V0KDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU9iamVjdCBhdCA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShDb2xsZWN0aW9uVG9vbHMuY2xhc3MpOwotCQkJZmFpbCgiYm9ndXM6ICIgKyBhdCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlc3QgaGFybmVzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkU3RyaW5nQXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkyKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInRocmVlIiwgImZvdXIiLCAiZml2ZSIgfTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkU3RyaW5nVmVjdG9yMSgpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEodik7Ci0JCXJldHVybiB2OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDEoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMShsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PE9iamVjdD4gYnVpbGRPYmplY3RMaXN0MSgpIHsKLQkJTGlzdDxPYmplY3Q+IGwgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db2xsZWN0aW9uMShDb2xsZWN0aW9uPD8gc3VwZXIgU3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJ6ZXJvIik7Ci0JCWMuYWRkKCJvbmUiKTsKLQkJYy5hZGQoInR3byIpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMihsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRvQ29sbGVjdGlvbjIoQ29sbGVjdGlvbjw/IHN1cGVyIFN0cmluZz4gYykgewotCQljLmFkZCgidGhyZWUiKTsKLQkJYy5hZGQoImZvdXIiKTsKLQkJYy5hZGQoImZpdmUiKTsKLQl9Ci0KLQlwcml2YXRlIFNldDxTdHJpbmc+IGJ1aWxkU3RyaW5nU2V0MSgpIHsKLQkJU2V0PFN0cmluZz4gcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIFNldDxPYmplY3Q+IGJ1aWxkT2JqZWN0U2V0MSgpIHsKLQkJU2V0PE9iamVjdD4gcyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIFNvcnRlZFNldDxTdHJpbmc+IGJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpIHsKLQkJU29ydGVkU2V0PFN0cmluZz4gcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29tbWFuZEV4ZWN1dG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29tbWFuZEV4ZWN1dG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjNzg5Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbW1hbmRFeGVjdXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZEV4ZWN1dG9yVGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCi0JcHVibGljIENvbW1hbmRFeGVjdXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Q29tbWFuZEV4ZWN1dG9yX3RvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IgPSBDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpOwotCQlhc3NlcnROb3ROdWxsKGNvbW1hbmRFeGVjdXRvci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbW1hbmRFeGVjdXRvcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IxID0gQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKTsKLQkJQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcjIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKGNvbW1hbmRFeGVjdXRvcjEpOwotCQlhc3NlcnRTYW1lKGNvbW1hbmRFeGVjdXRvcjEsIGNvbW1hbmRFeGVjdXRvcjIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Q29tbWFuZEV4ZWN1dG9yKCkgewotCQlUZXN0Q29tbWFuZCB0ZXN0Q29tbWFuZCA9IG5ldyBUZXN0Q29tbWFuZCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGVzdENvbW1hbmQuY291bnQpOwotCQlDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yID0gQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKTsKLQkJY29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUodGVzdENvbW1hbmQpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGVzdENvbW1hbmQuY291bnQpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBUZXN0Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlpbnQgY291bnQgPSAwOwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5jb3VudCsrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yX3RvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IgPSBuZXcgVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb21tYW5kRXhlY3V0b3IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yIHRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yID0gbmV3IFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKCk7Ci0JCVRlc3RSdW5uYWJsZSB0ZXN0UnVubmFibGUxID0gbmV3IFRlc3RSdW5uYWJsZSh0aHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciwgMSk7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZCh0ZXN0UnVubmFibGUxKTsKLQkJdGhyZWFkMS5ydW4oKTsKLQotCQlUZXN0UnVubmFibGUgdGVzdFJ1bm5hYmxlMiA9IG5ldyBUZXN0UnVubmFibGUodGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IsIDIpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQodGVzdFJ1bm5hYmxlMik7Ci0JCXRocmVhZDIucnVuKCk7Ci0KLQkJVGVzdFJ1bm5hYmxlIHRlc3RSdW5uYWJsZTMgPSBuZXcgVGVzdFJ1bm5hYmxlKHRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLCAzLCBudWxsKTsKLQkJVGhyZWFkIHRocmVhZDMgPSB0aGlzLmJ1aWxkVGhyZWFkKHRlc3RSdW5uYWJsZTMpOwotCQl0aHJlYWQzLnJ1bigpOwotCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQkJdGhyZWFkMy5qb2luKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRlc3RSdW5uYWJsZTEudGVzdENvbW1hbmQuY291bnQpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGVzdFJ1bm5hYmxlMS50ZXN0Q29tbWFuZEV4ZWN1dG9yLmNvdW50KTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgdGVzdFJ1bm5hYmxlMi50ZXN0Q29tbWFuZC5jb3VudCk7Ci0JCWFzc2VydEVxdWFscygyLCB0ZXN0UnVubmFibGUyLnRlc3RDb21tYW5kRXhlY3V0b3IuY291bnQpOwotCi0JCWFzc2VydEVxdWFscygzLCB0ZXN0UnVubmFibGUzLnRlc3RDb21tYW5kLmNvdW50KTsKLQkJYXNzZXJ0TnVsbCh0ZXN0UnVubmFibGUzLnRlc3RDb21tYW5kRXhlY3V0b3IpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBUZXN0Q29tbWFuZEV4ZWN1dG9yIGltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJCXRoaXMuY291bnQrKzsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFRlc3RSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IgdGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3I7Ci0JCWZpbmFsIGludCBleGVjdXRpb25Db3VudDsKLQkJZmluYWwgVGVzdENvbW1hbmQgdGVzdENvbW1hbmQgPSBuZXcgVGVzdENvbW1hbmQoKTsKLQkJZmluYWwgVGVzdENvbW1hbmRFeGVjdXRvciB0ZXN0Q29tbWFuZEV4ZWN1dG9yOwotCQlUZXN0UnVubmFibGUoVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IgdGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IsIGludCBleGVjdXRpb25Db3VudCkgewotCQkJdGhpcyh0aHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciwgZXhlY3V0aW9uQ291bnQsIG5ldyBUZXN0Q29tbWFuZEV4ZWN1dG9yKCkpOwotCQl9Ci0JCVRlc3RSdW5uYWJsZShUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciB0aHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciwgaW50IGV4ZWN1dGlvbkNvdW50LCBUZXN0Q29tbWFuZEV4ZWN1dG9yIHRlc3RDb21tYW5kRXhlY3V0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yID0gdGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3I7Ci0JCQl0aGlzLmV4ZWN1dGlvbkNvdW50ID0gZXhlY3V0aW9uQ291bnQ7Ci0JCQl0aGlzLnRlc3RDb21tYW5kRXhlY3V0b3IgPSB0ZXN0Q29tbWFuZEV4ZWN1dG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMudGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3Iuc2V0KHRoaXMudGVzdENvbW1hbmRFeGVjdXRvcik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZXhlY3V0aW9uQ291bnQ7IGkrKykgewotCQkJCXRoaXMudGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IuZXhlY3V0ZSh0aGlzLnRlc3RDb21tYW5kKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db21tYW5kUnVubmFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db21tYW5kUnVubmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTdkODEzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29tbWFuZFJ1bm5hYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbW1hbmRSdW5uYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tbWFuZFJ1bm5hYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JYm9vbGVhbiBjb21tYW5kRXhlY3V0ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBDb21tYW5kUnVubmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbENvbW1hbmQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IENvbW1hbmRSdW5uYWJsZShudWxsKTsKLQkJCWZhaWwoImJvZ3VzOiAiICsgcnVubmFibGUpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSdW4oKSB7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IENvbW1hbmRSdW5uYWJsZSh0aGlzLmJ1aWxkQ29tbWFuZCgpKTsKLQkJcnVubmFibGUucnVuKCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb21tYW5kRXhlY3V0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgQ29tbWFuZFJ1bm5hYmxlKHRoaXMuYnVpbGRDb21tYW5kKCkpOwotCQlhc3NlcnROb3ROdWxsKHJ1bm5hYmxlLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZENvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkJQ29tbWFuZFJ1bm5hYmxlVGVzdHMudGhpcy5jb21tYW5kRXhlY3V0ZWQgPSB0cnVlOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db21tYW5kVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29tbWFuZFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZjU5MmQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db21tYW5kVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29tbWFuZFJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJ1bm5hYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UaHJlYWRMb2NhbENvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kVGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCXB1YmxpYyBDb21tYW5kVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxDb21tYW5kKCkgewotCQlDb21tYW5kIGNvbW1hbmQgPSBDb21tYW5kLk51bGwuaW5zdGFuY2UoKTsKLQkJY29tbWFuZC5leGVjdXRlKCk7ICAvLyBqdXN0IG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGJsb3cgdXA/Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxDb21tYW5kX3RvU3RyaW5nKCkgewotCQlDb21tYW5kIGNvbW1hbmQgPSBDb21tYW5kLk51bGwuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb21tYW5kLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQ29tbWFuZF9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNvbW1hbmQgY29tbWFuZDEgPSBDb21tYW5kLk51bGwuaW5zdGFuY2UoKTsKLQkJQ29tbWFuZCBjb21tYW5kMiA9IFRlc3RUb29scy5zZXJpYWxpemUoY29tbWFuZDEpOwotCQlhc3NlcnRTYW1lKGNvbW1hbmQxLCBjb21tYW5kMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQ29tbWFuZCgpIHsKLQkJQ29tbWFuZCBjb21tYW5kID0gQ29tbWFuZC5EaXNhYmxlZC5pbnN0YW5jZSgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRDb21tYW5kX3RvU3RyaW5nKCkgewotCQlDb21tYW5kIGNvbW1hbmQgPSBDb21tYW5kLkRpc2FibGVkLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoY29tbWFuZC50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRDb21tYW5kX3NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ29tbWFuZCBjb21tYW5kMSA9IENvbW1hbmQuRGlzYWJsZWQuaW5zdGFuY2UoKTsKLQkJQ29tbWFuZCBjb21tYW5kMiA9IFRlc3RUb29scy5zZXJpYWxpemUoY29tbWFuZDEpOwotCQlhc3NlcnRTYW1lKGNvbW1hbmQxLCBjb21tYW5kMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJ1bm5hYmxlQ29tbWFuZCgpIHsKLQkJU2ltcGxlVGVzdFJ1bm5hYmxlIHRlc3RSdW5uYWJsZSA9IG5ldyBTaW1wbGVUZXN0UnVubmFibGUoKTsKLQkJYXNzZXJ0RmFsc2UodGVzdFJ1bm5hYmxlLnJhbik7Ci0JCUNvbW1hbmQgY29tbWFuZCA9IG5ldyBSdW5uYWJsZUNvbW1hbmQodGVzdFJ1bm5hYmxlKTsKLQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCWFzc2VydFRydWUodGVzdFJ1bm5hYmxlLnJhbik7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFNpbXBsZVRlc3RSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJYm9vbGVhbiByYW4gPSBmYWxzZTsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5yYW4gPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbW1hbmRSdW5uYWJsZSgpIHsKLQkJVGVzdENvbW1hbmQgdGVzdENvbW1hbmQgPSBuZXcgVGVzdENvbW1hbmQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRlc3RDb21tYW5kLmNvdW50KTsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgQ29tbWFuZFJ1bm5hYmxlKHRlc3RDb21tYW5kKTsKLQkJcnVubmFibGUucnVuKCk7Ci0JCWFzc2VydEVxdWFscygxLCB0ZXN0Q29tbWFuZC5jb3VudCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFRlc3RDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aGlzLmNvdW50Kys7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGhyZWFkTG9jYWxDb21tYW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRocmVhZExvY2FsQ29tbWFuZCB0aHJlYWRMb2NhbENvbW1hbmQgPSBuZXcgVGhyZWFkTG9jYWxDb21tYW5kKCk7Ci0JCVRlc3RSdW5uYWJsZSB0ZXN0UnVubmFibGUxID0gbmV3IFRlc3RSdW5uYWJsZSh0aHJlYWRMb2NhbENvbW1hbmQsIDEpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQodGVzdFJ1bm5hYmxlMSk7Ci0JCXRocmVhZDEucnVuKCk7Ci0KLQkJVGVzdFJ1bm5hYmxlIHRlc3RSdW5uYWJsZTIgPSBuZXcgVGVzdFJ1bm5hYmxlKHRocmVhZExvY2FsQ29tbWFuZCwgMik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZCh0ZXN0UnVubmFibGUyKTsKLQkJdGhyZWFkMi5ydW4oKTsKLQotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRlc3RSdW5uYWJsZTEudGVzdENvbW1hbmQuY291bnQpOwotCi0JCWFzc2VydEVxdWFscygyLCB0ZXN0UnVubmFibGUyLnRlc3RDb21tYW5kLmNvdW50KTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGVzdENvbW1hbmRFeGVjdXRvciBpbXBsZW1lbnRzIENvbW1hbmRFeGVjdXRvciB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQl0aGlzLmNvdW50Kys7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBUZXN0UnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCWZpbmFsIFRocmVhZExvY2FsQ29tbWFuZCB0aHJlYWRMb2NhbENvbW1hbmQ7Ci0JCWZpbmFsIGludCBleGVjdXRpb25Db3VudDsKLQkJZmluYWwgVGVzdENvbW1hbmQgdGVzdENvbW1hbmQgPSBuZXcgVGVzdENvbW1hbmQoKTsKLQkJVGVzdFJ1bm5hYmxlKFRocmVhZExvY2FsQ29tbWFuZCB0aHJlYWRMb2NhbENvbW1hbmQsIGludCBleGVjdXRpb25Db3VudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGhyZWFkTG9jYWxDb21tYW5kID0gdGhyZWFkTG9jYWxDb21tYW5kOwotCQkJdGhpcy5leGVjdXRpb25Db3VudCA9IGV4ZWN1dGlvbkNvdW50OwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMudGhyZWFkTG9jYWxDb21tYW5kLnNldCh0aGlzLnRlc3RDb21tYW5kKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5leGVjdXRpb25Db3VudDsgaSsrKSB7Ci0JCQkJdGhpcy50aHJlYWRMb2NhbENvbW1hbmQuZXhlY3V0ZSgpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbXBvc2l0ZUNvbW1hbmRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db21wb3NpdGVDb21tYW5kVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4MWNkMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbXBvc2l0ZUNvbW1hbmRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29tbWFuZFJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbXBvc2l0ZUNvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVDb21tYW5kVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JYm9vbGVhbiBjb21tYW5kMUV4ZWN1dGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBjb21tYW5kMkV4ZWN1dGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgQ29tcG9zaXRlQ29tbWFuZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSdW4oKSB7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IENvbW1hbmRSdW5uYWJsZSh0aGlzLmJ1aWxkQ29tcG9zaXRlQ29tbWFuZCgpKTsKLQkJcnVubmFibGUucnVuKCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb21tYW5kMUV4ZWN1dGVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbW1hbmQyRXhlY3V0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgQ29tbWFuZFJ1bm5hYmxlKHRoaXMuYnVpbGRDb21wb3NpdGVDb21tYW5kKCkpOwotCQlhc3NlcnROb3ROdWxsKHJ1bm5hYmxlLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZENvbXBvc2l0ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQ29tbWFuZCgKLQkJCQkJdGhpcy5idWlsZENvbW1hbmQxKCksCi0JCQkJCXRoaXMuYnVpbGRDb21tYW5kMigpCi0JCQkJKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRDb21tYW5kMSgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCQlDb21wb3NpdGVDb21tYW5kVGVzdHMudGhpcy5jb21tYW5kMUV4ZWN1dGVkID0gdHJ1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRDb21tYW5kMigpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCQlDb21wb3NpdGVDb21tYW5kVGVzdHMudGhpcy5jb21tYW5kMkV4ZWN1dGVkID0gdHJ1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRXhjZXB0aW9uSGFuZGxlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0V4Y2VwdGlvbkhhbmRsZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjY3OTNlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRXhjZXB0aW9uSGFuZGxlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuRXhjZXB0aW9uSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIEV4Y2VwdGlvbkhhbmRsZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFeGNlcHRpb25IYW5kbGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxFeGNlcHRpb25IYW5kbGVyKCkgewotCQlFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIgPSBFeGNlcHRpb25IYW5kbGVyLk51bGwuaW5zdGFuY2UoKTsKLQkJZXhjZXB0aW9uSGFuZGxlci5oYW5kbGVFeGNlcHRpb24obmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCkpOyAgLy8ganVzdCBtYWtlIHN1cmUgaXQgZG9lc24ndCBibG93IHVwPwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsRXhjZXB0aW9uSGFuZGxlclRvU3RyaW5nKCkgewotCQlFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIgPSBFeGNlcHRpb25IYW5kbGVyLk51bGwuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChleGNlcHRpb25IYW5kbGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSdW50aW1lRXhjZXB0aW9uSGFuZGxlcigpIHsKLQkJRXhjZXB0aW9uIG5wZSA9IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQlFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIgPSBFeGNlcHRpb25IYW5kbGVyLlJ1bnRpbWUuaW5zdGFuY2UoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJZXhjZXB0aW9uSGFuZGxlci5oYW5kbGVFeGNlcHRpb24obnBlKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJYXNzZXJ0U2FtZShucGUsIGV4LmdldENhdXNlKCkpOwotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSdW50aW1lRXhjZXB0aW9uSGFuZGxlclRvU3RyaW5nKCkgewotCQlFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIgPSBFeGNlcHRpb25IYW5kbGVyLlJ1bnRpbWUuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChleGNlcHRpb25IYW5kbGVyLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9GaWxlVG9vbHNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9GaWxlVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjAyYTBjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRmlsZVRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5GaWxlVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEZpbGVUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgRmlsZSB0ZW1wRGlyOwotCi0JcHVibGljIEZpbGVUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudGVtcERpciA9IHRoaXMuYnVpbGRUZW1wRGlyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJdGhpcy5kZWxldGVEaXIodGhpcy50ZW1wRGlyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZXNJbigpIHsKLQkJQ29sbGVjdGlvbjxGaWxlPiBmaWxlcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKEZpbGVUb29scy5maWxlc0luKHRoaXMudGVtcERpci5nZXRQYXRoKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGZpbGUgY291bnQiLCAzLCBmaWxlcy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJlY3Rvcmllc0luKCkgewotCQlDb2xsZWN0aW9uPEZpbGU+IGZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oRmlsZVRvb2xzLmRpcmVjdG9yaWVzSW4odGhpcy50ZW1wRGlyLmdldFBhdGgoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgZGlyZWN0b3J5IGNvdW50IiwgMiwgZmlsZXMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZXNJblRyZWUoKSB7Ci0JCUNvbGxlY3Rpb248RmlsZT4gZmlsZXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihGaWxlVG9vbHMuZmlsZXNJblRyZWUodGhpcy50ZW1wRGlyLmdldFBhdGgoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgZmlsZSBjb3VudCIsIDksIGZpbGVzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcmVjdG9yaWVzSW5UcmVlKCkgewotCQlDb2xsZWN0aW9uPEZpbGU+IGZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oRmlsZVRvb2xzLmRpcmVjdG9yaWVzSW5UcmVlKHRoaXMudGVtcERpci5nZXRQYXRoKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGRpcmVjdG9yeSBjb3VudCIsIDMsIGZpbGVzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZURpcmVjdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGJ1aWxkIGFub3RoZXIgdGVtcG9yYXJ5IGRpcmVjdG9yeSBqdXN0IGZvciB0aGlzIHRlc3QKLQkJRmlsZSBkaXIgPSB0aGlzLmJ1aWxkVGVtcERpcigpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IG5vdCBjcmVhdGVkIiwgZGlyLmV4aXN0cygpKTsKLQkJRmlsZVRvb2xzLmRlbGV0ZURpcmVjdG9yeShkaXIuZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0RmFsc2UoInRlbXBvcmFyeSBkaXJlY3Rvcnkgbm90IGRlbGV0ZWQiLCBkaXIuZXhpc3RzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVEaXJlY3RvcnlDb250ZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGJ1aWxkIGFub3RoZXIgdGVtcG9yYXJ5IGRpcmVjdG9yeSBqdXN0IGZvciB0aGlzIHRlc3QKLQkJRmlsZSBkaXIgPSB0aGlzLmJ1aWxkVGVtcERpcigpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IG5vdCBjcmVhdGVkIiwgZGlyLmV4aXN0cygpKTsKLQkJRmlsZVRvb2xzLmRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKGRpci5nZXRQYXRoKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IHNob3VsZCBub3QgaGF2ZSBiZWVuIGRlbGV0ZWQiLCBkaXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGNvbnRlbnRzIG5vdCBkZWxldGVkIiwgZGlyLmxpc3RGaWxlcygpLmxlbmd0aCA9PSAwKTsKLQkJZGlyLmRlbGV0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5VG9GaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgImRlc3RmaWxlLnR4dCIpOwotCQl0aGlzLmNvcHlUb0ZpbGUoZGVzdEZpbGUsICJ0ZXN0Q29weVRvRmlsZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5VG9QcmVFeGlzdGluZ0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAiZGVzdGZpbGUudHh0Iik7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKSk7Ci0JCXdyaXRlci53cml0ZSgidGhpcyB0ZXh0IHNob3VsZCBiZSByZXBsYWNlZC4uLiIpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQkJdGhpcy5jb3B5VG9GaWxlKGRlc3RGaWxlLCAidGVzdENvcHlUb1ByZUV4aXN0aW5nRmlsZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5VG9GaWxlKEZpbGUgZGVzdEZpbGUsIFN0cmluZyB3cml0ZVN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAic291cmNlZmlsZS50eHQiKTsKLQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclt3cml0ZVN0cmluZy5sZW5ndGgoKV07Ci0KLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oc291cmNlRmlsZSkpOwotCQl3cml0ZXIud3JpdGUod3JpdGVTdHJpbmcpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQotCQlGaWxlVG9vbHMuY29weVRvRmlsZShzb3VyY2VGaWxlLCBkZXN0RmlsZSk7Ci0KLQkJUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGRlc3RGaWxlKSk7Ci0JCXJlYWRlci5yZWFkKHJlYWRCdWZmZXIpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJU3RyaW5nIHJlYWRTdHJpbmcgPSBuZXcgU3RyaW5nKHJlYWRCdWZmZXIpOwotCQlhc3NlcnRFcXVhbHMod3JpdGVTdHJpbmcsIHJlYWRTdHJpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5VG9EaXJlY3RvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZSh0aGlzLnRlbXBEaXIsICJzb3VyY2VmaWxlLnR4dCIpOwotCQlTdHJpbmcgd3JpdGVTdHJpbmcgPSAidGVzdENvcHlUb0RpcmVjdG9yeSI7Ci0KLQkJRmlsZSBkZXN0RGlyID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAiZGVzdGRpciIpOwotCQlkZXN0RGlyLm1rZGlyKCk7Ci0JCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCAic291cmNlZmlsZS50eHQiKTsKLQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclt3cml0ZVN0cmluZy5sZW5ndGgoKV07Ci0KLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oc291cmNlRmlsZSkpOwotCQl3cml0ZXIud3JpdGUod3JpdGVTdHJpbmcpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQotCQlGaWxlVG9vbHMuY29weVRvRGlyZWN0b3J5KHNvdXJjZUZpbGUsIGRlc3REaXIpOwotCi0JCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShkZXN0RmlsZSkpOwotCQlyZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCVN0cmluZyByZWFkU3RyaW5nID0gbmV3IFN0cmluZyhyZWFkQnVmZmVyKTsKLQkJYXNzZXJ0RXF1YWxzKHdyaXRlU3RyaW5nLCByZWFkU3RyaW5nKTsKLQkJCi0JCUZpbGVUb29scy5jb3B5VG9EaXJlY3Rvcnkoc291cmNlRmlsZSwgZGVzdERpcik7IC8vVHJ5IGFnYWluIHdpdGggdGhlIGRpcmVjdG9yeSBpcyBhbHJlYWR5IGNyZWF0ZWQKLQkJcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oZGVzdEZpbGUpKTsKLQkJcmVhZGVyLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlyZWFkU3RyaW5nID0gbmV3IFN0cmluZyhyZWFkQnVmZmVyKTsKLQkJYXNzZXJ0RXF1YWxzKHdyaXRlU3RyaW5nLCByZWFkU3RyaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHByZWZpeCA9ICJYWFh0ZXN0RmlsZVhYWCI7Ci0JCUZpbGUgdGVzdEZpbGUxID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCBwcmVmaXggKyAiMSIpOwotCQl0ZXN0RmlsZTEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIHRlc3RGaWxlMiA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgcHJlZml4ICsgIjIiKTsKLQkJdGVzdEZpbGUyLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlGaWxlRmlsdGVyIGZpbHRlciA9IHRoaXMuYnVpbGRGaWxlRmlsdGVyKHByZWZpeCk7Ci0JCUl0ZXJhdG9yPEZpbGU+IGZpbHRlcmVkRmlsZXNJdGVyYXRvciA9IEZpbGVUb29scy5maWx0ZXIoRmlsZVRvb2xzLmZpbGVzSW4odGhpcy50ZW1wRGlyKSwgZmlsdGVyKTsKLQkJQ29sbGVjdGlvbjxGaWxlPiBmaWx0ZXJlZEZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oZmlsdGVyZWRGaWxlc0l0ZXJhdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZpbHRlcmVkRmlsZXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZEZpbGVzLmNvbnRhaW5zKHRlc3RGaWxlMSkpOwotCQlhc3NlcnRUcnVlKGZpbHRlcmVkRmlsZXMuY29udGFpbnModGVzdEZpbGUyKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlRmlsdGVyIGJ1aWxkRmlsZUZpbHRlcihmaW5hbCBTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLQkJCQlyZXR1cm4gZmlsZS5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpcEV4dGVuc2lvbigpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBGaWxlVG9vbHMuc3RyaXBFeHRlbnNpb24oImZvby54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vLmJhciIsIEZpbGVUb29scy5zdHJpcEV4dGVuc2lvbigiZm9vLmJhci54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRmlsZVRvb2xzLnN0cmlwRXh0ZW5zaW9uKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRmlsZVRvb2xzLnN0cmlwRXh0ZW5zaW9uKCJmb28uIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb24oKSB7Ci0JCWFzc2VydEVxdWFscygiLnhtbCIsIEZpbGVUb29scy5leHRlbnNpb24oImZvby54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiLnhtbCIsIEZpbGVUb29scy5leHRlbnNpb24oImZvby5iYXIueG1sIikpOwotCQlhc3NlcnRFcXVhbHMoIiIsIEZpbGVUb29scy5leHRlbnNpb24oImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28seG1sIikpOwotCQlhc3NlcnRFcXVhbHMoIi4iLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28uIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVRlbXBvcmFyeURpcmVjdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgdGVtcERpcjEgPSBGaWxlVG9vbHMudGVtcG9yYXJ5RGlyZWN0b3J5KCk7Ci0JCUZpbGUgdGVzdEZpbGUxID0gbmV3IEZpbGUodGVtcERpcjEsICJqdW5rIik7Ci0JCXRlc3RGaWxlMS5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJRmlsZSB0ZW1wRGlyMiA9IEZpbGVUb29scy5lbXB0eVRlbXBvcmFyeURpcmVjdG9yeSgpOwotCQlhc3NlcnRFcXVhbHModGVtcERpcjEsIHRlbXBEaXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wRGlyMi5pc0RpcmVjdG9yeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRlbXBEaXIyLmxpc3RGaWxlcygpLmxlbmd0aCk7Ci0JCXRlbXBEaXIyLmRlbGV0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5vbmljYWxGaWxlTmFtZSgpIHsKLQkJRmlsZSBmaWxlMSA9IG5ldyBGaWxlKCJmb28iKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgImJhciIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiYmF6Iik7Ci0JCWZpbGUxID0gbmV3IEZpbGUoZmlsZTEsICIuLiIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiLi4iKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgImJhciIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiYmF6Iik7Ci0JCUZpbGUgZmlsZTIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOwotCQlmaWxlMiA9IG5ldyBGaWxlKGZpbGUyLCAiZm9vIik7Ci0JCWZpbGUyID0gbmV3IEZpbGUoZmlsZTIsICJiYXIiKTsKLQkJZmlsZTIgPSBuZXcgRmlsZShmaWxlMiwgImJheiIpOwotCQlGaWxlIGZpbGUzID0gRmlsZVRvb2xzLmNhbm9uaWNhbEZpbGUoZmlsZTEpOwotCQlhc3NlcnRFcXVhbHMoZmlsZTIsIGZpbGUzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGF0aEZpbGVzKCkgewotCQlGaWxlW10gZXhwZWN0ZWQ7Ci0JCUZpbGVbXSBhY3R1YWw7Ci0KLQkJaWYgKFRvb2xzLm9zSXNXaW5kb3dzKCkpIHsKLQkJCWV4cGVjdGVkID0gbmV3IEZpbGVbXSB7IG5ldyBGaWxlKCJDOi8iKSwgbmV3IEZpbGUoIkM6L2ZvbyIpLCBuZXcgRmlsZSgiQzovZm9vL2JhciIpLCBuZXcgRmlsZSgiQzovZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJCWFjdHVhbCA9IHRoaXMucGF0aEZpbGVzKG5ldyBGaWxlKCJDOi9mb28vYmFyL2Jhei50eHQiKSk7Ci0JCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCQl9Ci0KLQkJZXhwZWN0ZWQgPSBuZXcgRmlsZVtdIHsgbmV3IEZpbGUoIi8iKSwgbmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb28vYmFyIiksIG5ldyBGaWxlKCIvZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoIi9mb28vYmFyL2Jhei50eHQiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0KLQkJZXhwZWN0ZWQgPSBuZXcgRmlsZVtdIHsgbmV3IEZpbGUoImZvbyIpLCBuZXcgRmlsZSgiZm9vL2JhciIpLCBuZXcgRmlsZSgiZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoImZvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiLi4iKSwgbmV3IEZpbGUoIi4uL2ZvbyIpLCBuZXcgRmlsZSgiLi4vZm9vL2JhciIpLCBuZXcgRmlsZSgiLi4vZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoIi4uL2Zvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiLiIpLCBuZXcgRmlsZSgiLi9mb28iKSwgbmV3IEZpbGUoIi4vZm9vL2JhciIpLCBuZXcgRmlsZSgiLi9mb28vYmFyL2Jhei50eHQiKSB9OwotCQlhY3R1YWwgPSB0aGlzLnBhdGhGaWxlcyhuZXcgRmlsZSgiLi9mb28vYmFyL2Jhei50eHQiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlW10gcGF0aEZpbGVzKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gKEZpbGVbXSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoRmlsZVRvb2xzLmNsYXNzLCAicGF0aEZpbGVzIiwgRmlsZS5jbGFzcywgZmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbGF0aXZlUGFyZW50RmlsZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLiIpLCB0aGlzLnJlbGF0aXZlUGFyZW50RmlsZSgxKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vLi4iKSwgdGhpcy5yZWxhdGl2ZVBhcmVudEZpbGUoMikpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uLy4uLy4uIiksIHRoaXMucmVsYXRpdmVQYXJlbnRGaWxlKDMpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSB0aGlzLnJlbGF0aXZlUGFyZW50RmlsZSgwKTsKLQkJCWZhaWwoImludmFsaWQgcmV0dXJuOiAiICsgZmlsZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJCUludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlID0gKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGV4LmdldENhdXNlKCk7Ci0JCQkJaWYgKGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgRmlsZSByZWxhdGl2ZVBhcmVudEZpbGUoaW50IGxlbikgewotCQlyZXR1cm4gKEZpbGUpIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlU3RhdGljTWV0aG9kKEZpbGVUb29scy5jbGFzcywgInJlbGF0aXZlUGFyZW50RmlsZSIsIGludC5jbGFzcywgbmV3IEludGVnZXIobGVuKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1JlbGF0aXZlRmlsZSgpIHsKLQkJU3RyaW5nIHByZWZpeCA9IFRvb2xzLm9zSXNXaW5kb3dzKCkgPyAiQzoiIDogIiI7Ci0JCUZpbGUgZmlsZTsKLQkJRmlsZSBkaXI7Ci0JCUZpbGUgcmVsYXRpdmVGaWxlOwotCi0JCWlmIChUb29scy5vc0lzV2luZG93cygpKSB7Ci0JCQkvLyBvbiBXaW5kb3dzLCBhIGRyaXZlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBhIGZpbGUgdG8gYmUgYWJzb2x1dGUgKGkuZS4gbm90IHJlbGF0aXZlKQotCQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRSZWxhdGl2ZUZpbGUoIi9kaXIxL2RpcjIvZmlsZS50eHQiLCAiQzovZGlyMS9kaXIyIik7Ci0JCQkvLyBkaWZmZXJlbnQgZHJpdmVzCi0JCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiRDovZGlyMS9kaXIyL2ZpbGUudHh0IiwgIkM6L2RpcjEvZGlyMiIpOwotCQl9Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKCJkaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiLi9kaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiLi4vLi4vZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4iKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyLy4uL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1L2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCJkaXIzL2RpcjQvZGlyNS9maWxlLnR4dCIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNSIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vLi4vLi4vZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMyIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyQS9kaXJCL2RpckMvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uLy4uLy4uL2RpckEvZGlyQi9kaXJDL2ZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1Iik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLi8uLi8uLiIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxL2xpYi90b3BsaW5rLmphciIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxIik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCJsaWIvdG9wbGluay5qYXIiKSwgcmVsYXRpdmVGaWxlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGRpck5hbWUpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlGaWxlIGRpciA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQlGaWxlIHJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKGZpbGUsIHJlbGF0aXZlRmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0Fic29sdXRlRmlsZSgpIHsKLQkJU3RyaW5nIHByZWZpeCA9IFRvb2xzLm9zSXNXaW5kb3dzKCkgPyAiQzoiIDogIiI7Ci0JCUZpbGUgZmlsZTsKLQkJRmlsZSBkaXI7Ci0JCUZpbGUgYWJzb2x1dGVGaWxlOwotCi0JCWlmIChUb29scy5vc0lzV2luZG93cygpKSB7Ci0JCQkvLyBvbiBXaW5kb3dzLCBhIGRyaXZlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBhIGZpbGUgdG8gYmUgYWJzb2x1dGUgKGkuZS4gbm90IHJlbGF0aXZlKQotCQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUoIkM6L2RpcjEvZGlyMi9maWxlLnR4dCIsICJDOi9kaXIxL2RpcjIiKTsKLQkJCS8vIGRpZmZlcmVudCBkcml2ZXMKLQkJCXRoaXMudmVyaWZ5VW5jaGFuZ2VkQWJzb2x1dGVGaWxlKCJEOi9kaXIxL2RpcjIvZmlsZS50eHQiLCAiQzovZGlyMS9kaXIyIik7Ci0JCX0KLQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZEFic29sdXRlRmlsZShwcmVmaXggKyAiLy4vZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvLi4vLi4vZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4iKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4vZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoImZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi9kaXIyL2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCJkaXIzL2RpcjQvZGlyNS9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNS9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vLi4vLi4vZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQkvLyB0b28gbWFueSAiLi4iIGRpcmVjdG9yaWVzIHdpbGwgcmVzb2x2ZSB0byB0aGUgcm9vdDsKLQkJLy8gdGhpcyBpcyBjb25zaXN0ZW50IHdpdGggV2luZG93cyBhbmQgTGludXggY29tbWFuZCBzaGVsbHMKLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi8uLi8uLi9kaXJBL2RpckIvZGlyQy9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNSIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXJBL2RpckIvZGlyQy9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vLi4vLi4iKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoImxpYi90b3BsaW5rLmphciIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvTXkgRG9jdW1lbnRzL015IFdvcmtzcGFjZS9Qcm9qZWN0IDEvbGliL3RvcGxpbmsuamFyIiksIGFic29sdXRlRmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVOYW1lSXNSZXNlcnZlZCgpIHsKLQkJYm9vbGVhbiBleHBlY3RlZCA9IFRvb2xzLm9zSXNXaW5kb3dzKCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiQ09OIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoImNvbiIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJjT04iKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiQVVYIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoIkNPTTMiKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiTFBUMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJuVUwiKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiUHJuIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKCkgewotCQlib29sZWFuIGV4cGVjdGVkID0gVG9vbHMub3NJc1dpbmRvd3MoKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiQzovQ09OIikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiL2Nvbi9mb28iKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJjOi90ZW1wL2NPTiIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoImJhci8vYmF6Ly9BVVgiKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJDT00zLy90dHQiKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJkOi9MUFQzL3h4eCIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoImM6L215IGRvY3MgYW5kIHN0dWZmL3R1ZXNkYXkvblVMIikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiUHJuIikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnRlbkZpbGVOYW1lRmlsZSgpIHsKLQkJaWYgKFRvb2xzLm9zSXNXaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZVdpbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVGaWxlTm9uV2luKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZVdpbigpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFxBZG1pbmlzdHJhdG9yXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFwuLi5cXERlc2t0b3BcXFByb2plY3RcXFRleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIkM6LyIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscygiQzpcXCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVOb25XaW4oKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCIvaG9tZS9hZG1pbmlzdHJhdG9yL2RvY3VtZW50cyBhbmQgc2V0dGluZ3MvZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0Iik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscygiL2hvbWUvYWRtaW5pc3RyYXRvci8uLi4vZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi9ob21lIik7Ci0JCWZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlKTsKLQkJYXNzZXJ0RXF1YWxzKCIvaG9tZSIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNob3J0ZW5GaWxlTmFtZUZpbGVJbnQoKSB7Ci0JCWlmIChUb29scy5vc0lzV2luZG93cygpKSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVJbnRXaW4oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludE5vbldpbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVJbnRXaW4oKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCJDOlxcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xcQWRtaW5pc3RyYXRvclxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAzMSk7Ci0JCWFzc2VydEVxdWFscygiQzpcXC4uLlxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygzMSwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiQzovVGhpcyBpcyB0aGUgZmlsZSBuYW1lLnR4dCIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSwgMTApOwotCQlhc3NlcnRFcXVhbHMoIkM6XFxUaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMjgsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludE5vbldpbigpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIi9ob21lL2FkbWluaXN0cmF0b3IvZG9jdW1lbnRzIGFuZCBzZXR0aW5ncy9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAzMSk7Ci0JCWFzc2VydEVxdWFscygiL2hvbWUvLi4uL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKDM0LCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIvVGhpcyBpcyB0aGUgZmlsZSBuYW1lLnR4dCIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSwgMTApOwotCQlhc3NlcnRFcXVhbHMoIi9UaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMjYsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnRlbkZpbGVOYW1lVVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChUb29scy5vc0lzV2luZG93cygpKSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTFdpbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxOb25XaW4oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxXaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgIkM6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9EZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZSh1cmwpOwotCQlhc3NlcnRFcXVhbHMoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFwuLi5cXERlc2t0b3BcXFByb2plY3RcXFRleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMTm9uV2luKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIiwgIiIsICIvaG9tZS9hZG1pbmlzdHJhdG9yL2RvY3VtZW50cyBhbmQgc2V0dGluZ3MvZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0Iik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUodXJsKTsKLQkJYXNzZXJ0RXF1YWxzKCIvaG9tZS9hZG1pbmlzdHJhdG9yLy4uLi9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsZU5hbWUubGVuZ3RoKCkgPD0gRmlsZVRvb2xzLk1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaG9ydGVuRmlsZU5hbWVVUkxJbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKFRvb2xzLm9zSXNXaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMSW50V2luKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludE5vbldpbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludFdpbigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiL0M6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9EZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZSh1cmwsIDMxKTsKLQkJYXNzZXJ0RXF1YWxzKCJDOlxcLi4uXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKDMxLCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludE5vbldpbigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiL2hvbWUvYWRtaW5pc3RyYXRvci9kb2N1bWVudHMgYW5kIHNldHRpbmdzL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKHVybCwgMzEpOwotCQlhc3NlcnRFcXVhbHMoIi9ob21lLy4uLi9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygzNCwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZGlyTmFtZSkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCUZpbGUgYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMoZmlsZSwgYWJzb2x1dGVGaWxlKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgYnVpbGRUZW1wRGlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gYnVpbGQgYSBuZXcgZGlyZWN0b3J5IGZvciBlYWNoIHRlc3QsIHRvIHByZXZlbnQgYW55IGNyb3NzLXRlc3QgZWZmZWN0cwotCQlGaWxlIGRpciA9IEZpbGVUb29scy5uZXdUZW1wb3JhcnlEaXJlY3RvcnkodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIuIiArIHRoaXMuZ2V0TmFtZSgpKTsKLQotCQlGaWxlIGZpbGUwYSA9IG5ldyBGaWxlKGRpciwgImZpbGUwYSIpOwotCQlmaWxlMGEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUwYiA9IG5ldyBGaWxlKGRpciwgImZpbGUwYiIpOwotCQlmaWxlMGIuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUwYyA9IG5ldyBGaWxlKGRpciwgImZpbGUwYyIpOwotCQlmaWxlMGMuY3JlYXRlTmV3RmlsZSgpOwotCi0JCUZpbGUgc3ViZGlyMSA9IG5ldyBGaWxlKGRpciwgInN1YmRpcjEiKTsKLQkJc3ViZGlyMS5ta2RpcigpOwotCQlGaWxlIGZpbGUxYSA9IG5ldyBGaWxlKHN1YmRpcjEsICJmaWxlMWEiKTsKLQkJZmlsZTFhLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRmlsZSBmaWxlMWIgPSBuZXcgRmlsZShzdWJkaXIxLCAiZmlsZTFiIik7Ci0JCWZpbGUxYi5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJRmlsZSBzdWJkaXIyID0gbmV3IEZpbGUoZGlyLCAic3ViZGlyMiIpOwotCQlzdWJkaXIyLm1rZGlyKCk7Ci0JCUZpbGUgZmlsZTJhID0gbmV3IEZpbGUoc3ViZGlyMiwgImZpbGUyYSIpOwotCQlmaWxlMmEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUyYiA9IG5ldyBGaWxlKHN1YmRpcjIsICJmaWxlMmIiKTsKLQkJZmlsZTJiLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlGaWxlIHN1YmRpcjMgPSBuZXcgRmlsZShzdWJkaXIyLCAic3ViZGlyMyIpOwotCQlzdWJkaXIzLm1rZGlyKCk7Ci0JCUZpbGUgZmlsZTNhID0gbmV3IEZpbGUoc3ViZGlyMywgImZpbGUzYSIpOwotCQlmaWxlM2EuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUzYiA9IG5ldyBGaWxlKHN1YmRpcjMsICJmaWxlM2IiKTsKLQkJZmlsZTNiLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlyZXR1cm4gZGlyOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxldGVEaXIoRmlsZSBkaXIpIHsKLQkJRmlsZVRvb2xzLmRlbGV0ZURpcmVjdG9yeShkaXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9GaWx0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9GaWx0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjQwY2Q1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRmlsdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEZpbHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEZpbHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsRmlsdGVyKCkgewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBGaWx0ZXIuTnVsbC5pbnN0YW5jZSgpOwotCQlhc3NlcnRUcnVlKGZpbHRlci5hY2NlcHQoIiIpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXIuYWNjZXB0KCJmb28iKSk7Ci0JCWFzc2VydFRydWUoZmlsdGVyLmFjY2VwdCgiYmFyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsRmlsdGVyX3RvU3RyaW5nKCkgewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBGaWx0ZXIuTnVsbC5pbnN0YW5jZSgpOwotCQlhc3NlcnROb3ROdWxsKGZpbHRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEZpbHRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5OdWxsLmluc3RhbmNlKCk7Ci0JCWFzc2VydFNhbWUoZmlsdGVyLCBUZXN0VG9vbHMuc2VyaWFsaXplKGZpbHRlcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcGFxdWVGaWx0ZXIoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5PcGFxdWUuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0RmFsc2UoZmlsdGVyLmFjY2VwdCgiIikpOwotCQlhc3NlcnRGYWxzZShmaWx0ZXIuYWNjZXB0KCJmb28iKSk7Ci0JCWFzc2VydEZhbHNlKGZpbHRlci5hY2NlcHQoImJhciIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3BhcXVlRmlsdGVyX3RvU3RyaW5nKCkgewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBGaWx0ZXIuT3BhcXVlLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoZmlsdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcGFxdWVGaWx0ZXJfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBGaWx0ZXIuT3BhcXVlLmluc3RhbmNlKCk7Ci0JCWFzc2VydFNhbWUoZmlsdGVyLCBUZXN0VG9vbHMuc2VyaWFsaXplKGZpbHRlcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEZpbHRlcigpIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLkRpc2FibGVkLmluc3RhbmNlKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFzc2VydEZhbHNlKGZpbHRlci5hY2NlcHQoImZvbyIpKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRGaWx0ZXJfdG9TdHJpbmcoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5EaXNhYmxlZC5pbnN0YW5jZSgpOwotCQlhc3NlcnROb3ROdWxsKGZpbHRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRGaWx0ZXJfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBGaWx0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0U2FtZShmaWx0ZXIsIFRlc3RUb29scy5zZXJpYWxpemUoZmlsdGVyKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0hhc2hCYWdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9IYXNoQmFnVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IyMGFkZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0hhc2hCYWdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEhhc2hCYWdUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEhhc2hCYWc8U3RyaW5nPiBiYWc7Ci0KLQlwdWJsaWMgSGFzaEJhZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuYmFnID0gdGhpcy5idWlsZEJhZygpOwotCX0KLQotCXByaXZhdGUgSGFzaEJhZzxTdHJpbmc+IGJ1aWxkQmFnKCkgewotCQlIYXNoQmFnPFN0cmluZz4gYiA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJYi5hZGQobnVsbCk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoIm9uZSIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidHdvIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJ0d28iKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoInRocmVlIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJ0aHJlZSIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidGhyZWUiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoImZvdXIiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoImZvdXIiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoImZvdXIiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoImZvdXIiKSk7Ci0JCXJldHVybiBiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImZvbyIpKTsKLQkJYy5hZGQobmV3IFN0cmluZygiZm9vIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJiYXIiKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImJhciIpKTsKLQkJYy5hZGQobmV3IFN0cmluZygiYmFyIikpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3RvckNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJQmFnPFN0cmluZz4gYiA9IG5ldyBIYXNoQmFnPFN0cmluZz4oYyk7Ci0JCWZvciAoU3RyaW5nIHMgOiBjKSB7Ci0JCQlhc3NlcnRUcnVlKGIuY29udGFpbnMocykpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN0b3JJbnRGbG9hdCgpIHsKLQkJYm9vbGVhbiBleENhdWdodDsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5iYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KC0yMCwgMC42NmYpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5iYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KDIwLCAtMC42NmYpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQkvLyB0aGUgb3RoZXIgYWRkcyB0b29rIHBsYWNlIGluIHNldFVwCi0JCWFzc2VydFRydWUodGhpcy5iYWcuYWRkKCJmaXZlIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygiZml2ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ291bnQoKSB7Ci0JCS8vIHRoZSBvdGhlciBhZGRzIHRvb2sgcGxhY2UgaW4gc2V0VXAKLQkJdGhpcy5iYWcuYWRkKCJtaW51czMiLCAtMyk7Ci0JCXRoaXMuYmFnLmFkZCgiemVybyIsIDApOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiLCA1KTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygibWludXMzIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiemVybyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuYmFnLmNvdW50KCJvbmUiKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmJhZy5jb3VudCgidHdvIikpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5iYWcuY291bnQoInRocmVlIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5iYWcuY291bnQoImZvdXIiKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB0aGlzLmJhZy5jb3VudCgiZml2ZSIpKTsKLQotCQl0aGlzLmJhZy5hZGQoInRocmVlIiwgMik7Ci0JCWFzc2VydEVxdWFscyg1LCB0aGlzLmJhZy5jb3VudCgidGhyZWUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZEFsbChjKSk7Ci0JCWZvciAoU3RyaW5nIHMgOiBjKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJmb3VyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCB0aGlzLmJhZy5zaXplKCkpOwotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJmb3VyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJQmFnPFN0cmluZz4gYmFnMiA9IHRoaXMuYmFnLmNsb25lKCk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcgIT0gYmFnMik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZywgYmFnMik7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuaGFzaENvZGUoKSA9PSBiYWcyLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhuZXcgU3RyaW5nKCJmb3VyIikpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygiZm8iICsgInVyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiZml2ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKG51bGwpOwotCQljLmFkZChuZXcgU3RyaW5nKCJvbmUiKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoInR3byIpKTsKLQkJYy5hZGQobmV3IFN0cmluZygidGhyZWUiKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImZvdXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnNBbGwoYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3VudCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuYmFnLmNvdW50KCJ6ZXJvIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5iYWcuY291bnQoIm9uZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuYmFnLmNvdW50KCJ0d28iKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmJhZy5jb3VudCgidGhyZWUiKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLmJhZy5jb3VudCgiZm91ciIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuYmFnLmNvdW50KCJmaXZlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZywgYmFnMik7Ci0JCWJhZzIuYWRkKCJmaXZlIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmVxdWFscyhiYWcyKSk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHRoaXMuYmFnKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuZXF1YWxzKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZy5oYXNoQ29kZSgpLCBiYWcyLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmlzRW1wdHkoKSk7Ci0JCXRoaXMuYmFnLmFkZCgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SXRlcmF0b3IoKSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoZWxlbWVudC50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMTEsIGkpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoZWxlbWVudC50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHRoaXMuYmFnLnNpemUoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlSXRlcmF0b3IoKSB7Ci0JCWludCBpID0gMDsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg1LCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJT2JqZWN0IG5leHQgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpICYmICEiZm91ciIuZXF1YWxzKG5leHQpKSB7Ci0JCQluZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQlhc3NlcnRFcXVhbHMoNywgdGhpcy5iYWcuc2l6ZSgpKTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCS8vIHN0YXJ0IG92ZXIKLQkJaXRlcmF0b3IgPSB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnRyaWVzKCkgewotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yPEJhZy5FbnRyeTxTdHJpbmc+PiBpdGVyYXRvciA9IHRoaXMuYmFnLmVudHJpZXMoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDUsIGkpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoZWxlbWVudC50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCS8vIHN0YXJ0IG92ZXIKLQkJaXRlcmF0b3IgPSB0aGlzLmJhZy5lbnRyaWVzKCk7Ci0JCUJhZy5FbnRyeTxTdHJpbmc+IG5leHQgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQluZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQuZ2V0RWxlbWVudCgpLmVxdWFscygiZm91ciIpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDcsIHRoaXMuYmFnLnNpemUoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuZW50cmllcygpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoaW5nRGlzdHJpYnV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJhZzxTdHJpbmc+IGJpZ0JhZyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7Ci0JCQliaWdCYWcuYWRkKCJvYmplY3QiICsgaSk7Ci0JCX0KLQotCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IGJpZ0JhZy5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoInRhYmxlIik7Ci0JCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCU9iamVjdFtdIHRhYmxlID0gKE9iamVjdFtdKSBmaWVsZC5nZXQoYmlnQmFnKTsKLQkJaW50IGJ1Y2tldENvdW50ID0gdGFibGUubGVuZ3RoOwotCQlpbnQgZmlsbGVkQnVja2V0Q291bnQgPSAwOwotCQlmb3IgKE9iamVjdCBvIDogdGFibGUpIHsKLQkJCWlmIChvICE9IG51bGwpIHsKLQkJCQlmaWxsZWRCdWNrZXRDb3VudCsrOwotCQkJfQotCQl9Ci0JCWZsb2F0IGxvYWRGYWN0b3IgPSAoKGZsb2F0KSBmaWxsZWRCdWNrZXRDb3VudCkgLyAoKGZsb2F0KSBidWNrZXRDb3VudCk7Ci0JCWlmICgobG9hZEZhY3RvciA8IDAuMjApIHx8IChsb2FkRmFjdG9yID4gMC44MCkpIHsKLQkJCVN0cmluZyBtc2cgPSAicG9vciBsb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3I7Ci0JCQlpZiAoVG9vbHMuanZtSXNTdW4oKSkgewotCQkJCWZhaWwobXNnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gcG9vciBsb2FkIGZhY3RvciBpcyBzZWVuIGluIHRoZSBFY2xpcHNlIGJ1aWxkIGVudmlyb25tZW50IGZvciBzb21lIHJlYXNvbi4uLgotCQkJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgJy4nICsgdGhpcy5nZXROYW1lKCkgKyAiIC0gIiArIG1zZyk7Ci0JCQkJVGVzdFRvb2xzLnByaW50U3lzdGVtUHJvcGVydGllcygpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJvbmUiKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvdW50KCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoIm9uZSIsIDApKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygib25lIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJvbmUiLCAxKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgib25lIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgidHdvIiwgLTMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUoInR3byIsIDEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iLCAxKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgidHdvIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0aHJlZSIsIDMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCJvbmUiKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlQWxsKGMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJldGFpbkFsbChjKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJmb3VyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJmb3VyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZXRhaW5BbGwoYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnNpemUoKSA9PSAxMSk7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJYXNzZXJ0RXF1YWxzKDE2LCB0aGlzLmJhZy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJhZzxTdHJpbmc+IGJhZzIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKHRoaXMuYmFnKTsKLQotCQlhc3NlcnRUcnVlKCJzYW1lIG9iamVjdD8iLCB0aGlzLmJhZyAhPSBiYWcyKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBiYWcyLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZywgYmFnMik7Ci0JCS8vIGxvb2sgZm9yIHNpbWlsYXIgZWxlbWVudHMKLQkJYXNzZXJ0VHJ1ZShiYWcyLmNvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShiYWcyLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUoYmFnMi5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRUcnVlKGJhZzIuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRUcnVlKGJhZzIuY29udGFpbnMoImZvdXIiKSk7Ci0KLQkJaW50IG51bGxDb3VudCA9IDAsIG9uZUNvdW50ID0gMCwgdHdvQ291bnQgPSAwLCB0aHJlZUNvdW50ID0gMCwgZm91ckNvdW50ID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGJhZzIpIHsKLQkJCWlmIChzID09IG51bGwpIHsKLQkJCQludWxsQ291bnQrKzsKLQkJCX0gZWxzZSBpZiAocy5lcXVhbHMoIm9uZSIpKSB7Ci0JCQkJb25lQ291bnQrKzsKLQkJCX0gZWxzZSBpZiAocy5lcXVhbHMoInR3byIpKSB7Ci0JCQkJdHdvQ291bnQrKzsKLQkJCX0gZWxzZSBpZiAocy5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0aHJlZUNvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJmb3VyIikpIHsKLQkJCQlmb3VyQ291bnQrKzsKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoMSwgbnVsbENvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9uZUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHR3b0NvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRocmVlQ291bnQpOwotCQlhc3NlcnRFcXVhbHMoNCwgZm91ckNvdW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheSgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYmFnLnRvQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCBudWxsKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAib25lIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJmb3VyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzEyXTsKLQkJYVsxMV0gPSAibm90IG51bGwiOwotCQlTdHJpbmdbXSBiID0gdGhpcy5iYWcudG9BcnJheShhKTsKLQkJYXNzZXJ0RXF1YWxzKGEsIGIpOwotCQlhc3NlcnRFcXVhbHMoMTIsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJvbmUiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAidHdvIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgInRocmVlIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgImZvdXIiKSk7Ci0JCWFzc2VydFRydWUoYVsxMV0gPT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlTdHJpbmcgcyA9IHRoaXMuYmFnLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocy5zdGFydHNXaXRoKCJbIikpOwotCQlhc3NlcnRUcnVlKHMuZW5kc1dpdGgoIl0iKSk7Ci0JCWludCBjb21tYUNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChzLmNoYXJBdChpKSA9PSAnLCcpIHsKLQkJCQljb21tYUNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEwLCBjb21tYUNvdW50KTsKLQkJYXNzZXJ0VHJ1ZShzLmluZGV4T2YoIm9uZSIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShzLmluZGV4T2YoInR3byIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShzLmluZGV4T2YoInRocmVlIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigiZm91ciIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShzLmluZGV4T2YoIm51bGwiKSAhPSAtMSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0lkZW50aXR5SGFzaEJhZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0lkZW50aXR5SGFzaEJhZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNjlhNTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JZGVudGl0eUhhc2hCYWdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLklkZW50aXR5SGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSWRlbnRpdHlIYXNoQmFnVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWc7Ci0JcHJpdmF0ZSBTdHJpbmcgb25lID0gIm9uZSI7Ci0JcHJpdmF0ZSBTdHJpbmcgdHdvID0gInR3byI7Ci0JcHJpdmF0ZSBTdHJpbmcgdGhyZWUgPSAidGhyZWUiOwotCXByaXZhdGUgU3RyaW5nIGZvdXIgPSAiZm91ciI7Ci0JcHJpdmF0ZSBTdHJpbmcgZm9vID0gImZvbyI7Ci0JcHJpdmF0ZSBTdHJpbmcgYmFyID0gImJhciI7Ci0KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5iYWcgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBidWlsZEJhZygpIHsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gcmVzdWx0ID0gbmV3IElkZW50aXR5SGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQobnVsbCk7Ci0JCXJlc3VsdC5hZGQodGhpcy5vbmUpOwotCQlyZXN1bHQuYWRkKHRoaXMudHdvKTsKLQkJcmVzdWx0LmFkZCh0aGlzLnR3byk7Ci0JCXJlc3VsdC5hZGQodGhpcy50aHJlZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy50aHJlZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy50aHJlZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy5mb3VyKTsKLQkJcmVzdWx0LmFkZCh0aGlzLmZvdXIpOwotCQlyZXN1bHQuYWRkKHRoaXMuZm91cik7Ci0JCXJlc3VsdC5hZGQodGhpcy5mb3VyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQodGhpcy5mb28pOwotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCXJldHVybiBjOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3RvckNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gbG9jYWxCYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oYyk7Ci0JCWZvciAoU3RyaW5nIHMgOiBjKSB7Ci0JCQlhc3NlcnRUcnVlKGxvY2FsQmFnLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3RvckludEZsb2F0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0OwotCQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5iYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oLTIwLCAwLjY2Zik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5iYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oMjAsIC0wLjY2Zik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQkvLyB0aGUgb3RoZXIgYWRkcyB0b29rIHBsYWNlIGluIHNldFVwCi0JCVN0cmluZyBmaXZlID0gImZpdmUiOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZChmaXZlKSk7Ci0JCi0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhmaXZlKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb3VudCgpIHsKLQkJU3RyaW5nIG1pbnVzMyA9ICJtaW51czMiOwotCQlTdHJpbmcgemVybyA9ICJ6ZXJvIjsKLQkJU3RyaW5nIGZpdmUgPSAiZml2ZSI7Ci0JCS8vIHRoZSBvdGhlciBhZGRzIHRvb2sgcGxhY2UgaW4gc2V0VXAKLQkJdGhpcy5iYWcuYWRkKG1pbnVzMywgLTMpOwotCQl0aGlzLmJhZy5hZGQoemVybywgMCk7Ci0JCXRoaXMuYmFnLmFkZChmaXZlLCA1KTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyhtaW51czMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoemVybykpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5iYWcuY291bnQodGhpcy5vbmUpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuYmFnLmNvdW50KHRoaXMudHdvKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmJhZy5jb3VudCh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLmJhZy5jb3VudCh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHRoaXMuYmFnLmNvdW50KGZpdmUpKTsKLQotCQl0aGlzLmJhZy5hZGQodGhpcy50aHJlZSwgMik7Ci0JCWFzc2VydEVxdWFscyg1LCB0aGlzLmJhZy5jb3VudCh0aGlzLnRocmVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZEFsbChjKSk7Ci0JCWZvciAoU3RyaW5nIHMgOiBjKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgdGhpcy5iYWcuc2l6ZSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5iYWcuY2xvbmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiYmFkIGNsb25lIiwgdGhpcy5iYWcgIT0gYmFnMik7Ci0JCWFzc2VydEVxdWFscygiYmFkIGNsb25lIiwgdGhpcy5iYWcsIGJhZzIpOwotCQlhc3NlcnRUcnVlKCJiYWQgY2xvbmUiLCB0aGlzLmJhZy5oYXNoQ29kZSgpID09IGJhZzIuaGFzaENvZGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyhuZXcgU3RyaW5nKCJmb3VyIikpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWMuYWRkKHRoaXMub25lKTsKLQkJYy5hZGQodGhpcy50d28pOwotCQljLmFkZCh0aGlzLnRocmVlKTsKLQkJYy5hZGQodGhpcy5mb3VyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWluc0FsbChjKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcodGhpcy5mb3VyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvdW50KCkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuY291bnQoInplcm8iKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmJhZy5jb3VudCgib25lIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5iYWcuY291bnQoInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYmFnLmNvdW50KCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuYmFnLmNvdW50KCJmb3VyIikpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuY291bnQoImZpdmUiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCUlkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZywgYmFnMik7Ci0JCWJhZzIuYWRkKCJmaXZlIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmVxdWFscyhiYWcyKSk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHRoaXMuYmFnKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuZXF1YWxzKGMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcuaGFzaENvZGUoKSwgYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmlzRW1wdHkoKSk7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQkJdGhpcy5iYWcuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SXRlcmF0b3IoKSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDExLCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgZWxlbWVudCwgZXhDYXVnaHQpOwotCQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLmJhZy5zaXplKCkpOwotCQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDUsIGkpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoZWxlbWVudC50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCS8vIHN0YXJ0IG92ZXIKLQkJaXRlcmF0b3IgPSB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkgJiYgIXRoaXMuZm91ci5lcXVhbHMobmV4dCkpIHsKLQkJCW5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCWFzc2VydEVxdWFscyg3LCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBmaXZlID0gImZpdmUiOwotCQl0aGlzLmJhZy5hZGQoZml2ZSk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50cmllcygpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWcuRW50cnk8U3RyaW5nPj4gaXRlcmF0b3IgPSB0aGlzLmJhZy5lbnRyaWVzKCk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg1LCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuZW50cmllcygpOwotCQlvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWcuRW50cnk8U3RyaW5nPiBuZXh0ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0LmdldEVsZW1lbnQoKS5lcXVhbHModGhpcy5mb3VyKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscyg3LCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLmVudHJpZXMoKTsKLQkJU3RyaW5nIGZpdmUgPSAiZml2ZSI7Ci0JCXRoaXMuYmFnLmFkZChmaXZlKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoaW5nRGlzdHJpYnV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJpZ0JhZyA9IG5ldyBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKLQkJCWJpZ0JhZy5hZGQoIm9iamVjdCIgKyBpKTsKLQkJfQotCQotCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IGJpZ0JhZy5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoInRhYmxlIik7Ci0JCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCU9iamVjdFtdIHRhYmxlID0gKE9iamVjdFtdKSBmaWVsZC5nZXQoYmlnQmFnKTsKLQkJaW50IGJ1Y2tldENvdW50ID0gdGFibGUubGVuZ3RoOwotCQlpbnQgZmlsbGVkQnVja2V0Q291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1Y2tldENvdW50OyBpKyspIHsKLQkJCWlmICh0YWJsZVtpXSAhPSBudWxsKSB7Ci0JCQkJZmlsbGVkQnVja2V0Q291bnQrKzsKLQkJCX0KLQkJfQotCQlmbG9hdCBsb2FkRmFjdG9yID0gKChmbG9hdCkgZmlsbGVkQnVja2V0Q291bnQpIC8gKChmbG9hdCkgYnVja2V0Q291bnQpOwotCQlpZiAoKGxvYWRGYWN0b3IgPCAwLjIwKSB8fCAobG9hZEZhY3RvciA+IDAuODApKSB7Ci0JCQlTdHJpbmcgbXNnID0gInBvb3IgbG9hZCBmYWN0b3I6ICIgKyBsb2FkRmFjdG9yOwotCQkJaWYgKFRvb2xzLmp2bUlzU3VuKCkpIHsKLQkJCQlmYWlsKG1zZyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHBvb3IgbG9hZCBmYWN0b3IgaXMgc2VlbiBpbiB0aGUgRWNsaXBzZSBidWlsZCBlbnZpcm9ubWVudCBmb3Igc29tZSByZWFzb24uLi4KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICcuJyArIHRoaXMuZ2V0TmFtZSgpICsgIiAtICIgKyBtc2cpOwotCQkJCVRlc3RUb29scy5wcmludFN5c3RlbVByb3BlcnRpZXMoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLm9uZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5vbmUpKTsKLQkKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28pKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKG5ldyBTdHJpbmcodGhpcy50aHJlZSkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvdW50KCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5vbmUsIDApKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMub25lLCAxKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMub25lKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLm9uZSkpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bywgLTMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28sIDEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvLCAxKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bykpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMudGhyZWUsIDMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50aHJlZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKHRoaXMub25lKTsKLQkJYy5hZGQobmV3IFN0cmluZyh0aGlzLnR3bykpOwotCQljLmFkZCh0aGlzLnRocmVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmVBbGwoYykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMub25lKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZUFsbChjKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKHRoaXMub25lKTsKLQkJYy5hZGQobmV3IFN0cmluZyh0aGlzLnR3bykpOwotCQljLmFkZCh0aGlzLnRocmVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZXRhaW5BbGwoYykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMub25lKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmV0YWluQWxsKGMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuc2l6ZSgpID09IDExKTsKLQkJU3RyaW5nIGZpdmUgPSAiZml2ZSI7Ci0JCXRoaXMuYmFnLmFkZChmaXZlKTsKLQkJdGhpcy5iYWcuYWRkKGZpdmUpOwotCQl0aGlzLmJhZy5hZGQoZml2ZSk7Ci0JCXRoaXMuYmFnLmFkZChmaXZlKTsKLQkJdGhpcy5iYWcuYWRkKG5ldyBTdHJpbmcoZml2ZSkpOwotCQlhc3NlcnRFcXVhbHMoMTYsIHRoaXMuYmFnLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJhZzIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKHRoaXMuYmFnKTsKLQkKLQkJYXNzZXJ0VHJ1ZSgic2FtZSBvYmplY3Q/IiwgdGhpcy5iYWcgIT0gYmFnMik7Ci0JCWFzc2VydEVxdWFscygxMSwgYmFnMi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJhZy5pdGVyYXRvcigpKSwgQ29sbGVjdGlvblRvb2xzLmJhZyhiYWcyLml0ZXJhdG9yKCkpKTsKLQkJLy8gbG9vayBmb3Igc2ltaWxhciBlbGVtZW50cwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5iYWcoYmFnMi5pdGVyYXRvcigpKS5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmJhZyhiYWcyLml0ZXJhdG9yKCkpLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmJhZyhiYWcyLml0ZXJhdG9yKCkpLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmJhZyhiYWcyLml0ZXJhdG9yKCkpLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkuY29udGFpbnMoImZvdXIiKSk7Ci0JCi0JCWludCBudWxsQ291bnQgPSAwLCBvbmVDb3VudCA9IDAsIHR3b0NvdW50ID0gMCwgdGhyZWVDb3VudCA9IDAsIGZvdXJDb3VudCA9IDA7Ci0JCWZvciAoU3RyaW5nIG5leHQgOiBiYWcyKSB7Ci0JCQlpZiAobmV4dCA9PSBudWxsKQotCQkJCW51bGxDb3VudCsrOwotCQkJZWxzZSBpZiAobmV4dC5lcXVhbHMoIm9uZSIpKQotCQkJCW9uZUNvdW50Kys7Ci0JCQllbHNlIGlmIChuZXh0LmVxdWFscygidHdvIikpCi0JCQkJdHdvQ291bnQrKzsKLQkJCWVsc2UgaWYgKG5leHQuZXF1YWxzKCJ0aHJlZSIpKQotCQkJCXRocmVlQ291bnQrKzsKLQkJCWVsc2UgaWYgKG5leHQuZXF1YWxzKCJmb3VyIikpCi0JCQkJZm91ckNvdW50Kys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIG51bGxDb3VudCk7Ci0JCWFzc2VydEVxdWFscygxLCBvbmVDb3VudCk7Ci0JCWFzc2VydEVxdWFscygyLCB0d29Db3VudCk7Ci0JCWFzc2VydEVxdWFscygzLCB0aHJlZUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGZvdXJDb3VudCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUb0FycmF5KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5iYWcudG9BcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMTEsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIHRoaXMub25lKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgdGhpcy50aHJlZSkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgdGhpcy5mb3VyKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUb0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzEyXTsKLQkJYVsxMV0gPSAibm90IG51bGwiOwotCQlTdHJpbmdbXSBiID0gdGhpcy5iYWcudG9BcnJheShhKTsKLQkJYXNzZXJ0RXF1YWxzKGEsIGIpOwotCQlhc3NlcnRFcXVhbHMoMTIsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIHRoaXMub25lKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgdGhpcy50aHJlZSkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgdGhpcy5mb3VyKSk7Ci0JCWFzc2VydFRydWUoYVsxMV0gPT0gbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJU3RyaW5nIHMgPSB0aGlzLmJhZy50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHMuc3RhcnRzV2l0aCgiWyIpKTsKLQkJYXNzZXJ0VHJ1ZShzLmVuZHNXaXRoKCJdIikpOwotCQlpbnQgY29tbWFDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAocy5jaGFyQXQoaSkgPT0gJywnKSB7Ci0JCQkJY29tbWFDb3VudCsrOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBudW1iZXIgb2YgY29tbWFzIiwgMTAsIGNvbW1hQ291bnQpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigib25lIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigidHdvIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigidGhyZWUiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJmb3VyIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigibnVsbCIpICE9IC0xKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSW5kZW50aW5nUHJpbnRXcml0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JbmRlbnRpbmdQcmludFdyaXRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTliMWMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JbmRlbnRpbmdQcmludFdyaXRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkluZGVudGluZ1ByaW50V3JpdGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBJbmRlbnRpbmdQcmludFdyaXRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCVN0cmluZ1dyaXRlciBzdzE7Ci0JU3RyaW5nV3JpdGVyIHN3MjsKLQlJbmRlbnRpbmdQcmludFdyaXRlciBpcHcxOwotCUluZGVudGluZ1ByaW50V3JpdGVyIGlwdzI7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0JcHVibGljIEluZGVudGluZ1ByaW50V3JpdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdzEgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCXRoaXMuaXB3MSA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcih0aGlzLnN3MSk7Ci0JCXRoaXMuc3cyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQl0aGlzLmlwdzIgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIodGhpcy5zdzIsICIgICAgIik7IC8vIGluZGVudCB3aXRoIDQgc3BhY2VzIGluc3RlYWQgb2YgYSB0YWIKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGVudCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAwLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS5pbmRlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAxLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuZGVudCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAwLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS5pbmRlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAxLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS51bmRlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAwLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluY3JlbWVudEluZGVudExldmVsKCkgewotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDAsIHRoaXMuaXB3MS5nZXRJbmRlbnRMZXZlbCgpKTsKLQkJdGhpcy5pcHcxLmluY3JlbWVudEluZGVudExldmVsKCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMSwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWNyZW1lbnRJbmRlbnRMZXZlbCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAwLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS5pbmNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDEsIHRoaXMuaXB3MS5nZXRJbmRlbnRMZXZlbCgpKTsKLQkJdGhpcy5pcHcxLmRlY3JlbWVudEluZGVudExldmVsKCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmludFRhYigpIHsKLQkJU3RyaW5nIGV4cGVjdGVkID0gImZvbzAiICsgQ1IgKyAiXHRmb28xIiArIENSICsgIlx0Zm9vMSIgKyBDUiArICJcdFx0Zm9vMiIgKyBDUiArICJcdGZvbzEiICsgQ1IgKyAiXHRmb28xIiArIENSICsgImZvbzAiICsgQ1I7Ci0KLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzAiKTsKLQkJdGhpcy5pcHcxLmluZGVudCgpOwotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzEuaW5kZW50KCk7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28yIik7Ci0JCXRoaXMuaXB3MS51bmRlbnQoKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcxLnVuZGVudCgpOwotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMCIpOwotCi0JCWFzc2VydEVxdWFscygiYm9ndXMgb3V0cHV0IiwgZXhwZWN0ZWQsIHRoaXMuc3cxLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmludFNwYWNlcygpIHsKLQkJU3RyaW5nIGV4cGVjdGVkID0gImZvbzAiICsgQ1IgKyAiICAgIGZvbzEiICsgQ1IgKyAiICAgIGZvbzEiICsgQ1IgKyAiICAgICAgICBmb28yIiArIENSICsgIiAgICBmb28xIiArIENSICsgIiAgICBmb28xIiArIENSICsgImZvbzAiICsgQ1I7Ci0KLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzAiKTsKLQkJdGhpcy5pcHcyLmluZGVudCgpOwotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzIuaW5kZW50KCk7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28yIik7Ci0JCXRoaXMuaXB3Mi51bmRlbnQoKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcyLnVuZGVudCgpOwotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMCIpOwotCi0JCWFzc2VydEVxdWFscygiYm9ndXMgb3V0cHV0IiwgZXhwZWN0ZWQsIHRoaXMuc3cyLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JbnRSZWZlcmVuY2VUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JbnRSZWZlcmVuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWE1ZWEwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSW50UmVmZXJlbmNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkludFJlZmVyZW5jZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSW50UmVmZXJlbmNlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSW50UmVmZXJlbmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN0b3JzKCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgaXIuZ2V0VmFsdWUoKSk7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSg3KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGlyLmdldFZhbHVlKCkpOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoLTcpOwotCQlhc3NlcnRFcXVhbHMoLTcsIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNJbnQoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydFRydWUoaXIuZXF1YWxzKDApKTsKLQkJYXNzZXJ0RmFsc2UoaXIuZXF1YWxzKDcpKTsKLQotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoNyk7Ci0JCWFzc2VydFRydWUoaXIuZXF1YWxzKDcpKTsKLQkJYXNzZXJ0RmFsc2UoaXIuZXF1YWxzKDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90RXF1YWxzSW50KCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRGYWxzZShpci5ub3RFcXVhbHMoMCkpOwotCQlhc3NlcnRUcnVlKGlyLm5vdEVxdWFscyg3KSk7Ci0KLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKDcpOwotCQlhc3NlcnRGYWxzZShpci5ub3RFcXVhbHMoNykpOwotCQlhc3NlcnRUcnVlKGlyLm5vdEVxdWFscygwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzWmVybygpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc1plcm8oKSk7Ci0KLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKDcpOwotCQlhc3NlcnRGYWxzZShpci5pc1plcm8oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTm90WmVybygpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNOb3RaZXJvKCkpOwotCi0JCWlyID0gbmV3IEludFJlZmVyZW5jZSg3KTsKLQkJYXNzZXJ0VHJ1ZShpci5pc05vdFplcm8oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzR3JlYXRlclRoYW5JbnQoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydFRydWUoaXIuaXNHcmVhdGVyVGhhbigtMSkpOwotCQlhc3NlcnRGYWxzZShpci5pc0dyZWF0ZXJUaGFuKDApKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNHcmVhdGVyVGhhbig3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzR3JlYXRlclRoYW5PckVxdWFsSW50KCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRUcnVlKGlyLmlzR3JlYXRlclRoYW5PckVxdWFsKC0xKSk7Ci0JCWFzc2VydFRydWUoaXIuaXNHcmVhdGVyVGhhbk9yRXF1YWwoMCkpOwotCQlhc3NlcnRGYWxzZShpci5pc0dyZWF0ZXJUaGFuT3JFcXVhbCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTGVzc1RoYW5JbnQoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzTGVzc1RoYW4oLTEpKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNMZXNzVGhhbigwKSk7Ci0JCWFzc2VydFRydWUoaXIuaXNMZXNzVGhhbig3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTGVzc1RoYW5PckVxdWFsSW50KCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRGYWxzZShpci5pc0xlc3NUaGFuT3JFcXVhbCgtMSkpOwotCQlhc3NlcnRUcnVlKGlyLmlzTGVzc1RoYW5PckVxdWFsKDApKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc0xlc3NUaGFuT3JFcXVhbCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzUG9zaXRpdmUoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKC0zKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNQb3NpdGl2ZSgpKTsKLQotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNQb3NpdGl2ZSgpKTsKLQotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoNyk7Ci0JCWFzc2VydFRydWUoaXIuaXNQb3NpdGl2ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOb3RQb3NpdGl2ZSgpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoLTMpOwotCQlhc3NlcnRUcnVlKGlyLmlzTm90UG9zaXRpdmUoKSk7Ci0KLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydFRydWUoaXIuaXNOb3RQb3NpdGl2ZSgpKTsKLQotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoNyk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzTm90UG9zaXRpdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTmVnYXRpdmUoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKC0zKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc05lZ2F0aXZlKCkpOwotCi0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRGYWxzZShpci5pc05lZ2F0aXZlKCkpOwotCi0JCWlyID0gbmV3IEludFJlZmVyZW5jZSg3KTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNOZWdhdGl2ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOb3ROZWdhdGl2ZSgpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoLTMpOwotCQlhc3NlcnRGYWxzZShpci5pc05vdE5lZ2F0aXZlKCkpOwotCi0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRUcnVlKGlyLmlzTm90TmVnYXRpdmUoKSk7Ci0KLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKDcpOwotCQlhc3NlcnRUcnVlKGlyLmlzTm90TmVnYXRpdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlSW50KCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgtMyk7Ci0JCWFzc2VydEVxdWFscygtMywgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygtMywgaXIuc2V0VmFsdWUoNCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgaXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFicygpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoLTMpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgaXIuYWJzKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgaXIuZ2V0VmFsdWUoKSk7Ci0KLQkJaXIuc2V0VmFsdWUoMyk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLmFicygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZWcoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKC0zKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLm5lZygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLmdldFZhbHVlKCkpOwotCi0JCWlyLnNldFZhbHVlKDMpOwotCQlhc3NlcnRFcXVhbHMoMywgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygtMywgaXIubmVnKCkpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRaZXJvKCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgtMyk7Ci0JCWFzc2VydEVxdWFscygtMywgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygtMywgaXIuc2V0WmVybygpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnQoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaW50IHZhbHVlOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGlyLmdldFZhbHVlKCkpOwotCi0JCXZhbHVlID0gaXIuYWRkKDMpOwotCQlhc3NlcnRFcXVhbHMoMywgdmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoMywgaXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdmFsdWUgPSBpci5hZGQoLTcpOwotCQlhc3NlcnRFcXVhbHMoLTQsIHZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKC00LCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5jcmVtZW50KCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWludCB2YWx1ZTsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEVxdWFscygwLCBpci5nZXRWYWx1ZSgpKTsKLQotCQl2YWx1ZSA9IGlyLmluY3JlbWVudCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgdmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnRyYWN0SW50KCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWludCBjb3VudDsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEVxdWFscygwLCBpci5nZXRWYWx1ZSgpKTsKLQotCQljb3VudCA9IGlyLnN1YnRyYWN0KDMpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5nZXRWYWx1ZSgpKTsKLQotCQljb3VudCA9IGlyLnN1YnRyYWN0KC03KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWNyZW1lbnQoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaW50IGNvdW50OwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGlyLmdldFZhbHVlKCkpOwotCi0JCWNvdW50ID0gaXIuZGVjcmVtZW50KCk7Ci0JCWFzc2VydEVxdWFscygtMSwgY291bnQpOwotCQlhc3NlcnRFcXVhbHMoLTEsIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBseUludCgpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoMyk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDksIGlyLm11bHRpcGx5KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKDksIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXZpZGVJbnQoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKDI0KTsKLQkJYXNzZXJ0RXF1YWxzKDI0LCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDgsIGlyLmRpdmlkZSgzKSk7Ci0JCWFzc2VydEVxdWFscyg4LCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtYWluZGVySW50KCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgyNSk7Ci0JCWFzc2VydEVxdWFscygyNSwgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBpci5yZW1haW5kZXIoMykpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pbkludCgpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoMjUpOwotCQlhc3NlcnRFcXVhbHMoMjUsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgaXIubWluKDMpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgaXIubWluKDI1KSk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWF4SW50KCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgyNSk7Ci0JCWFzc2VydEVxdWFscygyNSwgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygyNSwgaXIubWF4KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1LCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMwLCBpci5tYXgoMzApKTsKLQkJYXNzZXJ0RXF1YWxzKDMwLCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UG93SW50KCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSg1KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjUsIGlyLnBvdygyKSk7Ci0JCWFzc2VydEVxdWFscygyNSwgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyg2MjUsIGlyLnBvdygyKSk7Ci0JCWFzc2VydEVxdWFscyg2MjUsIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wYXJlVG9JbnRSZWZlcmVuY2UoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjEgPSBuZXcgSW50UmVmZXJlbmNlKDQ0KTsKLQkJSW50UmVmZXJlbmNlIGlyMiA9IG5ldyBJbnRSZWZlcmVuY2UoNDQpOwotCQlhc3NlcnRUcnVlKGlyMS5jb21wYXJlVG8oaXIyKSA9PSAwKTsKLQkJaXIyID0gbmV3IEludFJlZmVyZW5jZSg1NSk7Ci0JCWFzc2VydFRydWUoaXIxLmNvbXBhcmVUbyhpcjIpIDwgMCk7Ci0JCWlyMiA9IG5ldyBJbnRSZWZlcmVuY2UoMzMpOwotCQlhc3NlcnRUcnVlKGlyMS5jb21wYXJlVG8oaXIyKSA+IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJSW50UmVmZXJlbmNlIGlyMSA9IG5ldyBJbnRSZWZlcmVuY2UoNDQpOwotCQlJbnRSZWZlcmVuY2UgaXIyID0gKEludFJlZmVyZW5jZSkgaXIxLmNsb25lKCk7Ci0JCWFzc2VydEVxdWFscyg0NCwgaXIyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoaXIxLCBpcjIpOwotCQlhc3NlcnROb3RTYW1lKGlyMSwgaXIyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlJbnRSZWZlcmVuY2UgaXIxID0gbmV3IEludFJlZmVyZW5jZSg0NCk7Ci0JCUludFJlZmVyZW5jZSBpcjIgPSBuZXcgSW50UmVmZXJlbmNlKDQ0KTsKLQkJYXNzZXJ0RXF1YWxzKGlyMSwgaXIyKTsKLQkJYXNzZXJ0RXF1YWxzKGlyMS5oYXNoQ29kZSgpLCBpcjIuaGFzaENvZGUoKSk7Ci0JCWFzc2VydEZhbHNlKGlyMS5lcXVhbHMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUludFJlZmVyZW5jZSBpcjEgPSBuZXcgSW50UmVmZXJlbmNlKDQ0KTsKLQkJSW50UmVmZXJlbmNlIGlyMiA9IFRlc3RUb29scy5zZXJpYWxpemUoaXIxKTsKLQkJYXNzZXJ0RXF1YWxzKDQ0LCBpcjIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpcjEsIGlyMik7Ci0JCWFzc2VydE5vdFNhbWUoaXIxLCBpcjIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoNSk7Ci0JCWFzc2VydEVxdWFscygiWzVdIiwgaXIudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0pEQkNUeXBlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSkRCQ1R5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTdhYmE2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSkRCQ1R5cGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuc3FsLlR5cGVzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5KREJDVHlwZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSkRCQ1R5cGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBKREJDVHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlc1NpemUoKSB7Ci0JCWFzc2VydEVxdWFscyhUeXBlcy5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpLmxlbmd0aCwgSkRCQ1R5cGUudHlwZXMoKS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lKCkgewotCQlKREJDVHlwZSBqZGJjVHlwZTsKLQkJamRiY1R5cGUgPSBKREJDVHlwZS50eXBlKFR5cGVzLlZBUkNIQVIpOwotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBqZGJjVHlwZS5uYW1lKCkpOwotCi0JCWpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShUeXBlcy5JTlRFR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlRFR0VSIiwgamRiY1R5cGUubmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29kZSgpIHsKLQkJSkRCQ1R5cGUgamRiY1R5cGU7Ci0JCWpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShUeXBlcy5WQVJDSEFSKTsKLQkJYXNzZXJ0RXF1YWxzKFR5cGVzLlZBUkNIQVIsIGpkYmNUeXBlLmNvZGUoKSk7Ci0KLQkJamRiY1R5cGUgPSBKREJDVHlwZS50eXBlKFR5cGVzLklOVEVHRVIpOwotCQlhc3NlcnRFcXVhbHMoVHlwZXMuSU5URUdFUiwgamRiY1R5cGUuY29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFR5cGVDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUpEQkNUeXBlIGpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZSg1NSk7Ci0JCQlmYWlsKCJpbnZhbGlkIEpEQkNUeXBlOiAiICsgamRiY1R5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFR5cGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUpEQkNUeXBlIGpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZSgiVkFSQ0hBUjIiKTsKLQkJCWZhaWwoImludmFsaWQgSkRCQ1R5cGU6ICIgKyBqZGJjVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KYXZhVHlwZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0phdmFUeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRhMTk1Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0phdmFUeXBlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZUphdmFUeXBlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhVHlwZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEphdmFUeXBlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRFbGVtZW50VHlwZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUobnVsbCwgMCk7Ci0JCQlmYWlsKCJpbnZhbGlkIEphdmFUeXBlOiAiICsgamF2YVR5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEVsZW1lbnRUeXBlRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoIiIsIDApOwotCQkJZmFpbCgiaW52YWxpZCBKYXZhVHlwZTogIiArIGphdmFUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRFbGVtZW50VHlwZUFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcy5nZXROYW1lKCksIDApOwotCQkJZmFpbCgiaW52YWxpZCBKYXZhVHlwZTogIiArIGphdmFUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRBcnJheURlcHRoTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCksIC0yKTsKLQkJCWZhaWwoImludmFsaWQgSmF2YVR5cGU6ICIgKyBqYXZhVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVm9pZEFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCAyKTsKLQkJCWZhaWwoImludmFsaWQgSmF2YVR5cGU6ICIgKyBqYXZhVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50VHlwZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGU7Ci0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUodm9pZC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygidm9pZCIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwJEVudHJ5IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwJEVudHJ5IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheURlcHRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50W10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YVR5cGUuZ2V0QXJyYXlEZXB0aCgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGU7Ci0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc0FycmF5KCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnQuY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc0FycmF5KCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludFtdLmNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZS5pc0FycmF5KCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc0FycmF5KCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc0FycmF5KCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZS5pc0FycmF5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlKYXZhQ2xhc3MoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKGludC5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKGludFtdLmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlKYXZhQ2xhc3Modm9pZC5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUphdmFDbGFzcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhQ2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoamF2YUNsYXNzLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFDbGFzc05hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGU7Ci0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiW0xqYXZhLmxhbmcuT2JqZWN0OyIsIGphdmFUeXBlLmdldEphdmFDbGFzc05hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJbSSIsIGphdmFUeXBlLmdldEphdmFDbGFzc05hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUodm9pZC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygidm9pZCIsIGphdmFUeXBlLmdldEphdmFDbGFzc05hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcCRFbnRyeSIsIGphdmFUeXBlLmdldEphdmFDbGFzc05hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoIltbTGphdmEudXRpbC5NYXAkRW50cnk7IiwgamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpYmVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5RGVzY3JpYmVzKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyhqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyhpbnQuY2xhc3MpOwotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyhpbnRbXS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5RGVzY3JpYmVzKHZvaWQuY2xhc3MpOwotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyhqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlEZXNjcmliZXMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YUNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZS5kZXNjcmliZXMoamF2YUNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlY2xhcmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0W10iLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnRbXSIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwLkVudHJ5IiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAuRW50cnlbXVtdIiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzUHJpbWl0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRUcnVlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KcHRVdGlsaXR5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSnB0VXRpbGl0eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQyNjkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KcHRVdGlsaXR5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLmVudW1lcmF0aW9ucy5KcHRVdGlsaXR5RW51bWVyYXRpb25zVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzLkpwdFV0aWxpdHlJdGVyYWJsZXNUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnMuSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLkpwdFV0aWxpdHlNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm5vZGUuSnB0VXRpbGl0eU5vZGVUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzLkpwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHM7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5VGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5RW51bWVyYXRpb25zVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eUl0ZXJhYmxlc1Rlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5Tm9kZVRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHMuc3VpdGUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFycmF5VG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCYWdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCaWRpRmlsdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQmlkaVN0cmluZ0NvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJpZGlUcmFuc2Zvcm1lclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJpdFRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQm9vbGVhblJlZmVyZW5jZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJvb2xlYW5Ub29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENsYXNzcGF0aFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENsYXNzTmFtZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbGxlY3Rpb25Ub29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbW1hbmRFeGVjdXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbW1hbmRSdW5uYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbW1hbmRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVDb21tYW5kVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRXhjZXB0aW9uSGFuZGxlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbGVUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEhhc2hCYWdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJZGVudGl0eUhhc2hCYWdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJbmRlbnRpbmdQcmludFdyaXRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEludFJlZmVyZW5jZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFUeXBlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSkRCQ1R5cGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShLZXllZFNldFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpc3RlbmVyTGlzdFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1ldGhvZFNpZ25hdHVyZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5hbWVUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5vdE51bGxGaWx0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPYmplY3RSZWZlcmVuY2VUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSYW5nZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlZmxlY3Rpb25Ub29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJldmVyc2VDb21wYXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlQXNzb2NpYXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVRdWV1ZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZVN0YWNrVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RyaW5nVG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25pemVkSW50VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25pemVkT2JqZWN0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25pemVkUXVldWVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhNTFN0cmluZ0VuY29kZXJUZXN0cy5jbGFzcyk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VXRpbGl0eVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvS2V5ZWRTZXRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9LZXllZFNldFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNjE0MmQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9LZXllZFNldFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5LZXllZFNldDsKLQotcHVibGljIGNsYXNzIEtleWVkU2V0VGVzdHMKLQkJZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBLZXllZFNldDxTdHJpbmcsIFN0cmluZz4gbmlja25hbWVzOwotCQotCQotCXB1YmxpYyBLZXllZFNldFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm5pY2tuYW1lcyA9IHRoaXMuYnVpbGROaWNrbmFtZXMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBLZXllZFNldDxTdHJpbmcsIFN0cmluZz4gYnVpbGROaWNrbmFtZXMoKSB7Ci0JCUtleWVkU2V0PFN0cmluZywgU3RyaW5nPiBrcyA9IG5ldyBLZXllZFNldDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJa3MuYWRkSXRlbSgiSmltbXkiLCAiSmFtZXMgU3VsbGl2YW4iKTsKLQkJa3MuYWRkS2V5KCJTdWxseSIsICJKYW1lcyBTdWxsaXZhbiIpOwotCQlrcy5hZGRJdGVtKCJCb2IiLCAiUm9iZXJ0IE1jS2VubmEiKTsKLQkJa3MuYWRkS2V5KCJNYWMiLCAiUm9iZXJ0IE1jS2VubmEiKTsKLQkJcmV0dXJuIGtzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtKCkgewotCQkvLyBpdGVtcyBhZGRlZCBpbiBzZXR1cAotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zSXRlbSgiSmFtZXMgU3VsbGl2YW4iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNJdGVtKCJSb2JlcnQgTWNLZW5uYSIpKTsKLQkJCi0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zSXRlbSgiSm9obiBUZWFzZGFsZSIpKTsKLQkJdGhpcy5uaWNrbmFtZXMuYWRkSXRlbSgiSmFjayIsICJKb2huIFRlYXNkYWxlIik7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNJdGVtKCJKb2huIFRlYXNkYWxlIikpOwotCQkKLQkJdGhpcy5uaWNrbmFtZXMuYWRkSXRlbSgiVGVhc2VyIiwgIkpvaG4gVGVhc2RhbGUiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0l0ZW0oIkpvaG4gVGVhc2RhbGUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIlRlYXNlciIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEtleSgpIHsKLQkJLy8gaXRlbXMgYWRkZWQgaW4gc2V0dXAKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiSmltbXkiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIlN1bGx5IikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJCb2IiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIk1hYyIpKTsKLQkJCi0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJSb2JiaWUiKSk7Ci0JCXRoaXMubmlja25hbWVzLmFkZEtleSgiUm9iYmllIiwgIlJvYmVydCBNY0tlbm5hIik7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIlJvYmJpZSIpKTsKLQkJCi0JCWJvb2xlYW4gZXhjZXB0aW9uQ2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLm5pY2tuYW1lcy5hZGRLZXkoIlRlYXNlciIsICJKb2huIFRlYXNkYWxlIik7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCWV4Y2VwdGlvbkNhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleGNlcHRpb25DYXVnaHQpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEl0ZW0oKSB7Ci0JCS8vIGl0ZW1zIGFkZGVkIGluIHNldHVwCi0JCWFzc2VydEVxdWFscyh0aGlzLm5pY2tuYW1lcy5nZXRJdGVtKCJKaW1teSIpLCAiSmFtZXMgU3VsbGl2YW4iKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubmlja25hbWVzLmdldEl0ZW0oIlN1bGx5IiksICJKYW1lcyBTdWxsaXZhbiIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5uaWNrbmFtZXMuZ2V0SXRlbSgiQm9iIiksICJSb2JlcnQgTWNLZW5uYSIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5uaWNrbmFtZXMuZ2V0SXRlbSgiTWFjIiksICJSb2JlcnQgTWNLZW5uYSIpOwotCQlhc3NlcnROdWxsKHRoaXMubmlja25hbWVzLmdldEl0ZW0oIkphY2siKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtKCkgewotCQkvLyBpdGVtcyBhZGRlZCBpbiBzZXR1cAotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zSXRlbSgiSmFtZXMgU3VsbGl2YW4iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIkppbW15IikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJTdWxseSIpKTsKLQkJCi0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMucmVtb3ZlSXRlbSgiSmFtZXMgU3VsbGl2YW4iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zSXRlbSgiSmFtZXMgU3VsbGl2YW4iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJKaW1teSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIlN1bGx5IikpOwotCQkKLQkJYXNzZXJ0RmFsc2UodGhpcy5uaWNrbmFtZXMucmVtb3ZlSXRlbSgiV2lsbGlhbSBHb2xkYmVyZyIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUtleSgpIHsKLQkJLy8gaXRlbXMgYWRkZWQgaW4gc2V0dXAKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0l0ZW0oIkphbWVzIFN1bGxpdmFuIikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJKaW1teSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiU3VsbHkiKSk7Ci0JCQotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLnJlbW92ZUtleSgiSmltbXkiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNJdGVtKCJKYW1lcyBTdWxsaXZhbiIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIkppbW15IikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJTdWxseSIpKTsKLQkJCi0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMucmVtb3ZlS2V5KCJTdWxseSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5uaWNrbmFtZXMuY29udGFpbnNJdGVtKCJKYW1lcyBTdWxsaXZhbiIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIkppbW15IikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiU3VsbHkiKSk7Ci0JCQotCQlhc3NlcnRGYWxzZSh0aGlzLm5pY2tuYW1lcy5yZW1vdmVLZXkoIkJpbGx5IikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTGlzdGVuZXJMaXN0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTGlzdGVuZXJMaXN0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThjYmZlNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0xpc3RlbmVyTGlzdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJMaXN0VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTGlzdGVuZXJMaXN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldExpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJSXRlcmFibGU8TGlzdGVuZXI+IGxpc3RlbmVycyA9IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGxpc3RlbmVycykpOwotCi0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIxKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjIpOwotCQlsaXN0ZW5lcnMgPSBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShsaXN0ZW5lcnMpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJzLCBsaXN0ZW5lcjEpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJzLCBsaXN0ZW5lcjIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3RlbmVyTGlzdC5zaXplKCkpOwotCi0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIxKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjIpOwotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdGVuZXJMaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMSA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCWFzc2VydFRydWUobGlzdGVuZXJMaXN0LmlzRW1wdHkoKSk7Ci0KLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjEpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKGxpc3RlbmVyTGlzdC5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRfbnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJbGlzdGVuZXJMaXN0LmFkZChudWxsKTsKLQkJCWZhaWwoImludmFsaWQgbGlzdGVuZXIgbGlzdDogIiArIGxpc3RlbmVyTGlzdCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZF9kdXBsaWNhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JCQlmYWlsKCJpbnZhbGlkIGxpc3RlbmVyIGxpc3Q6ICIgKyBsaXN0ZW5lckxpc3QpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCQlMaXN0ZW5lciBsaXN0ZW5lcjEgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlMaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMSk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpLCBsaXN0ZW5lcjEpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpLCBsaXN0ZW5lcjIpKTsKLQotCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyMSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMikpOwotCi0JCWxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSwgbGlzdGVuZXIyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZV9udWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlsaXN0ZW5lckxpc3QucmVtb3ZlKG51bGwpOwotCQkJZmFpbCgiaW52YWxpZCBsaXN0ZW5lciBsaXN0OiAiICsgbGlzdGVuZXJMaXN0KTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlX3VucmVnaXN0ZXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JCQlmYWlsKCJpbnZhbGlkIGxpc3RlbmVyIGxpc3Q6ICIgKyBsaXN0ZW5lckxpc3QpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMSA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIxKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMikpOwotCi0JCWxpc3RlbmVyTGlzdC5jbGVhcigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpLCBsaXN0ZW5lcjEpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSwgbGlzdGVuZXIyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVGhpcyB0ZXN0IGRvZXNuJ3QgcGFzcyBpbiB0aGUgRWNsaXBzZSBidWlsZCBlbnZpcm9ubWVudCAoTGludXgvSUJNIFZNKSBmb3Igc29tZSByZWFzb24KLQkJaWYgKFRvb2xzLmp2bUlzU3VuKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2VyaWFsaXphdGlvbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMSA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIxKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjIpOwotCi0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0MiA9IFRlc3RUb29scy5zZXJpYWxpemUobGlzdGVuZXJMaXN0KTsKLQkJYXNzZXJ0Tm90U2FtZShsaXN0ZW5lckxpc3QsIGxpc3RlbmVyTGlzdDIpOwotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdGVuZXJMaXN0Mi5zaXplKCkpOwotCi0JCUxpc3RlbmVyIGxpc3RlbmVyMyA9IG5ldyBOb25TZXJpYWxpemFibGVMaXN0ZW5lcigpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMyk7Ci0KLQkJbGlzdGVuZXJMaXN0MiA9IFRlc3RUb29scy5zZXJpYWxpemUobGlzdGVuZXJMaXN0KTsKLQkJYXNzZXJ0Tm90U2FtZShsaXN0ZW5lckxpc3QsIGxpc3RlbmVyTGlzdDIpOwotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdGVuZXJMaXN0Mi5zaXplKCkpOwotCi0JfQotCi0JaW50ZXJmYWNlIExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0JCXZvaWQgc29tZXRoaW5nSGFwcGVuZWQoKTsKLQl9Ci0JCi0Jc3RhdGljIGNsYXNzIExvY2FsTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciwgU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIHZvaWQgc29tZXRoaW5nSGFwcGVuZWQoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0JCi0Jc3RhdGljIGNsYXNzIE5vblNlcmlhbGl6YWJsZUxpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzb21ldGhpbmdIYXBwZW5lZCgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTWV0aG9kU2lnbmF0dXJlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTWV0aG9kU2lnbmF0dXJlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJhYWU1Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL01ldGhvZFNpZ25hdHVyZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5KYXZhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlTWV0aG9kU2lnbmF0dXJlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNZXRob2RTaWduYXR1cmVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBNZXRob2RTaWduYXR1cmVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKChTdHJpbmcpIG51bGwpOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZE5hbWVFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgiIik7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVyVHlwZXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCAoSmF2YVR5cGVbXSkgbnVsbCk7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVyVHlwZXNOdWxsSXRlbSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgiZm9vIiwgbmV3IEphdmFUeXBlWzFdKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJUeXBlc1ZvaWRJdGVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGp0ID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoImZvbyIsIG5ldyBKYXZhVHlwZVtdIHtqdH0pOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlclR5cGVOYW1lc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoImZvbyIsIChTdHJpbmdbXSkgbnVsbCk7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVyVHlwZU5hbWVzTnVsbEl0ZW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoImZvbyIsIG5ldyBTdHJpbmdbMV0pOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlckphdmFDbGFzc2VzTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgiZm9vIiwgKENsYXNzPD8+W10pIG51bGwpOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlckphdmFDbGFzc2VzTnVsbEl0ZW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoImZvbyIsIG5ldyBDbGFzc1sxXSk7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaWduYXR1cmUwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZFNpZ25hdHVyZSBtcyA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDAiKSk7Ci0JCWFzc2VydEVxdWFscygibWV0aG9kMCgpIiwgbXMuZ2V0U2lnbmF0dXJlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaWduYXR1cmUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZFNpZ25hdHVyZSBtcyA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDEiKSk7Ci0JCWFzc2VydEVxdWFscygibWV0aG9kMShpbnQpIiwgbXMuZ2V0U2lnbmF0dXJlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaWduYXR1cmUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZFNpZ25hdHVyZSBtcyA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDIiKSk7Ci0JCWFzc2VydEVxdWFscygibWV0aG9kMihpbnQsIGphdmEubGFuZy5TdHJpbmcpIiwgbXMuZ2V0U2lnbmF0dXJlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaWduYXR1cmUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZFNpZ25hdHVyZSBtcyA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCWFzc2VydEVxdWFscygibWV0aG9kMyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXVtdKSIsIG1zLmdldFNpZ25hdHVyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QyIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDIiLCBtcy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQYXJhbWV0ZXJUeXBlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlKYXZhVHlwZVtdIGV4cGVjdGVkID0gbmV3IEphdmFUeXBlWzNdOwotCQlleHBlY3RlZFswXSA9IG5ldyBTaW1wbGVKYXZhVHlwZSgiaW50Iik7Ci0JCWV4cGVjdGVkWzFdID0gbmV3IFNpbXBsZUphdmFUeXBlKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0JCWV4cGVjdGVkWzJdID0gbmV3IFNpbXBsZUphdmFUeXBlKCJqYXZhLmxhbmcuT2JqZWN0IiwgMik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgbXMuZ2V0UGFyYW1ldGVyVHlwZXMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1zMSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCU9iamVjdCBtczIgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlhc3NlcnROb3RTYW1lKG1zMSwgbXMyKTsKLQkJYXNzZXJ0RXF1YWxzKG1zMSwgbXMxKTsKLQkJYXNzZXJ0RXF1YWxzKG1zMSwgbXMyKTsKLQkJYXNzZXJ0RXF1YWxzKG1zMS5oYXNoQ29kZSgpLCBtczIuaGFzaENvZGUoKSk7Ci0KLQkJT2JqZWN0IG1zMyA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDIiKSk7Ci0JCWFzc2VydE5vdFNhbWUobXMxLCBtczMpOwotCQlhc3NlcnRGYWxzZShtczEuZXF1YWxzKG1zMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVNZXRob2RTaWduYXR1cmUgbXMxID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJU2ltcGxlTWV0aG9kU2lnbmF0dXJlIG1zMiA9IChTaW1wbGVNZXRob2RTaWduYXR1cmUpIG1zMS5jbG9uZSgpOwotCQlhc3NlcnROb3RTYW1lKG1zMSwgbXMyKTsKLQkJYXNzZXJ0RXF1YWxzKG1zMSwgbXMyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVNZXRob2RTaWduYXR1cmUgbXMxID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJU2ltcGxlTWV0aG9kU2lnbmF0dXJlIG1zMiA9IFRlc3RUb29scy5zZXJpYWxpemUobXMxKTsKLQkJYXNzZXJ0Tm90U2FtZShtczEsIG1zMik7Ci0JCWFzc2VydEVxdWFscyhtczEsIG1zMik7Ci0JfQotCi0JcHJpdmF0ZSBNZXRob2QgZ2V0TWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCWZvciAoTWV0aG9kIG1ldGhvZCA6IHRoaXMuZ2V0Q2xhc3MoKS5nZXRNZXRob2RzKCkpIHsKLQkJCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2ROYW1lKSkgewotCQkJCXJldHVybiBtZXRob2Q7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWV0aG9kIG5vdCBmb3VuZDogIiArIG1ldGhvZE5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1ldGhvZDAoKSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBwdWJsaWMgdm9pZCBtZXRob2QxKGludCBmb28pIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIHB1YmxpYyB2b2lkIG1ldGhvZDIoaW50IGZvbywgU3RyaW5nIGJhcikgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgcHVibGljIHZvaWQgbWV0aG9kMyhpbnQgZm9vLCBTdHJpbmcgYmFyLCBPYmplY3RbXVtdIGJheikgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBwdWJsaWMgdm9pZCBtZXRob2RBKGludCBmb28sIFN0cmluZyBiYXIpIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIHB1YmxpYyB2b2lkIG1ldGhvZEEoaW50IGZvbywgU3RyaW5nIGJhciwgU3RyaW5nIGJheikgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBwdWJsaWMgdm9pZCBtZXRob2RCKGludCBmb28sIE9iamVjdCBiYXIpIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIHB1YmxpYyB2b2lkIG1ldGhvZEIoaW50IGZvbywgU3RyaW5nIGJhcikgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9NdWx0aVRocmVhZGVkVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTXVsdGlUaHJlYWRlZFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYWUxZmUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9NdWx0aVRocmVhZGVkVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db21wb3NpdGVFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVGhpcyB0ZXN0IGNhc2UgaGVscHMgc2ltcGxpZnkgdGhlIHRlc3Rpbmcgb2YgbXVsdGktdGhyZWFkZWQgY29kZS4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi0JZXh0ZW5kcyBUZXN0Q2FzZQotewotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFRocmVhZD4gdGhyZWFkcyA9IG5ldyBBcnJheUxpc3Q8VGhyZWFkPigpOwotCS8qIHByaXZhdGUgKi8gZmluYWwgVmVjdG9yPFRocm93YWJsZT4gZXhjZXB0aW9ucyA9IG5ldyBWZWN0b3I8VGhyb3dhYmxlPigpOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgInRpY2siIGlzIG9uZSBzZWNvbmQuCi0JICogU3BlY2lmeSB0aGUgYXBwcm9wcmlhdGUgc3lzdGVtIHByb3BlcnR5IHRvIG92ZXJyaWRlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJQ0tfU1lTVEVNX1BST1BFUlRZX05BTUUgPSAib3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMudGljayI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFRJQ0sgPSBMb25nLmdldExvbmcoVElDS19TWVNURU1fUFJPUEVSVFlfTkFNRSwgMTAwMCkubG9uZ1ZhbHVlKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFRXT19USUNLUyA9IDIgKiBUSUNLOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBUSFJFRV9USUNLUyA9IDMgKiBUSUNLOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5hbWVkIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBNdWx0aVRocmVhZGVkVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGFsbCB0aGUgdGhyZWFkcyBjb25zdHJ1Y3RlZCBkdXJpbmcgdGhlIHRlc3QgY2FzZS4KLQkgKiBJZiBhbnkgZXhjZXB0aW9ucyB3ZXJlIHRocm93biBieSB0aGUgdGhyZWFkcywgcmUtdGhyb3cgdGhlbSBoZXJlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZvciAoVGhyZWFkIHRocmVhZCA6IHRoaXMudGhyZWFkcykgewotCQkJaWYgKHRocmVhZC5pc0FsaXZlKCkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0aHJlYWQgaXMgc3RpbGwgYWxpdmU6ICIgKyB0aHJlYWQpOwotCQkJfQotCQl9Ci0JCWlmICggISB0aGlzLmV4Y2VwdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQl0aHJvdyBuZXcgQ29tcG9zaXRlRXhjZXB0aW9uKHRoaXMuZXhjZXB0aW9ucyk7Ci0JCX0KLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByb3RlY3RlZCBUaHJlYWQgYnVpbGRUaHJlYWQoUnVubmFibGUgcnVubmFibGUpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBUaHJlYWQgYnVpbGRUaHJlYWQoUnVubmFibGUgcnVubmFibGUsIFN0cmluZyBuYW1lKSB7Ci0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZVdyYXBwZXIocnVubmFibGUpKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJdGhyZWFkLnNldE5hbWUobmFtZSk7Ci0JCX0KLQkJdGhpcy50aHJlYWRzLmFkZCh0aHJlYWQpOwotCQlyZXR1cm4gdGhyZWFkOwotCX0KLQotCXByb3RlY3RlZCBUaHJlYWRGYWN0b3J5IGJ1aWxkVGhyZWFkRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0VGhyZWFkRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGhhbmRsZXMge0BsaW5rIEludGVycnVwdGVkRXhjZXB0aW9ufS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzbGVlcChsb25nIG1pbGxpcykgewotCQlUZXN0VG9vbHMuc2xlZXAobWlsbGlzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFdyYXAgYSBydW5uYWJsZSBhbmQgbG9nIGFueSBleGNlcHRpb24gaXQgdGhyb3dzLgotCSAqLwotCXB1YmxpYyBjbGFzcyBUZXN0VGhyZWFkRmFjdG9yeSBpbXBsZW1lbnRzIFRocmVhZEZhY3RvcnkgewotCQlwdWJsaWMgVGhyZWFkIG5ld1RocmVhZChSdW5uYWJsZSByKSB7Ci0JCQlyZXR1cm4gTXVsdGlUaHJlYWRlZFRlc3RDYXNlLnRoaXMuYnVpbGRUaHJlYWQocik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaW1wbGlmeSBydW5uYWJsZXMgdGhhdCBleGVjdXRlIGNhbGwgdGhhdCB0aHJvd3MgY2hlY2tlZCBleGNlcHRpb25zLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0UnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXB1YmxpYyBmaW5hbCB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5ydW5fKCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCX0KLQkJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcnVuXygpIHRocm93cyBUaHJvd2FibGU7Ci0JfQotCi0JLyoqCi0JICogV3JhcCBhIHJ1bm5hYmxlIGFuZCBsb2cgYW55IGV4Y2VwdGlvbiBpdCB0aHJvd3MuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBSdW5uYWJsZVdyYXBwZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByaXZhdGUgZmluYWwgUnVubmFibGUgcnVubmFibGU7Ci0JCVJ1bm5hYmxlV3JhcHBlcihSdW5uYWJsZSBydW5uYWJsZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucnVubmFibGUgPSBydW5uYWJsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCXRoaXMucnVubmFibGUucnVuKCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCQlNdWx0aVRocmVhZGVkVGVzdENhc2UudGhpcy5leGNlcHRpb25zLmFkZChleCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05hbWVUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05hbWVUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODk1ODMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9OYW1lVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBOYW1lVG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBOYW1lVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQWJzZW50SWdub3JlQ2FzZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbG9yQ29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xvckNvbGxlY3Rpb24oKTsKLQkJU3RyaW5nIHJldHVybmVkID0gTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJUYXVwZSIsIGNvbG9yQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygiVGF1cGUiLCByZXR1cm5lZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1ByZXNlbnRDYXNlRGlmZmVycygpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbG9yQ29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xvckNvbGxlY3Rpb24oKTsKLQkJU3RyaW5nIHJldHVybmVkID0gTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoImdyZWVuIiwgY29sb3JDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJncmVlbiIsIHJldHVybmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUHJlc2VudElnbm9yZUNhc2UoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb2xvckNvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sb3JDb2xsZWN0aW9uKCk7Ci0JCVN0cmluZyByZXR1cm5lZCA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiZ3JlZW4iLCBjb2xvckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoImdyZWVuMiIsIHJldHVybmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUHJlc2VudFdpdGhBcHBlbmRpY2VzKCkgewotCQlMaXN0PFN0cmluZz4gY29sb3JDb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbG9yQ29sbGVjdGlvbigpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJSZWQxIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoInJlZDIiKTsKLQkJU3RyaW5nIHJldHVybmVkID0gTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJyZWQiLCBjb2xvckNvbGxlY3Rpb24pOwotCQljb2xvckNvbGxlY3Rpb24ucmVtb3ZlKCJSZWQxIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5yZW1vdmUoInJlZDIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJyZWQzIiwgcmV0dXJuZWQpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQ29sb3JDb2xsZWN0aW9uKCkgewotCQlMaXN0PFN0cmluZz4gY29sb3JDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIlJlZCIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJPcmFuZ2UiKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiWWVsbG93Iik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIkdyZWVuIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIkJsdWUiKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiSW5kaWdvIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIlZpb2xldCIpOwotCQlyZXR1cm4gY29sb3JDb2xsZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9yQ29sbGVjdGlvbjEoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSBDb3Jwb3JhdGlvbiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgib3JhY2xlMSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2wiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiVGVzdCIsIHN0cmluZ3MpKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIk9yYWNsZSIsIHN0cmluZ3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJvcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiVGVzdCIsIHN0cmluZ3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlTmFtZUZvckNvbGxlY3Rpb24yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJvcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTIiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTEiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiVGVzdCIsIHN0cmluZ3MpKTsKLQotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIENvcnBvcmF0aW9uIik7Ci0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiT3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIm9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIm9yYWNsZSIsIHN0cmluZ3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJUZXN0Iiwgc3RyaW5ncykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9yQ29sbGVjdGlvbjMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMSIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JJdGVyYXRvcjEoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSBDb3Jwb3JhdGlvbiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgib3JhY2xlMSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2wiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJUZXN0Iiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJPcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJvcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJUZXN0Iiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JJdGVyYXRvcjIoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIm9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMSIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIlRlc3QiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIENvcnBvcmF0aW9uIik7Ci0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiT3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygib3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgib3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiVGVzdCIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9ySXRlcmF0b3IzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTIiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTEiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoImNhdGFsb2cuc2NoZW1hLm5hbWUiLCBOYW1lVG9vbHMuYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUoImNhdGFsb2ciLCAic2NoZW1hIiwgIm5hbWUiKSk7Ci0JCWFzc2VydEVxdWFscygiY2F0YWxvZy4ubmFtZSIsIE5hbWVUb29scy5idWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZSgiY2F0YWxvZyIsIG51bGwsICJuYW1lIikpOwotCQlhc3NlcnRFcXVhbHMoInNjaGVtYS5uYW1lIiwgTmFtZVRvb2xzLmJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKG51bGwsICJzY2hlbWEiLCAibmFtZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgTmFtZVRvb2xzLmJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKG51bGwsIG51bGwsICJuYW1lIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhUmVzZXJ2ZWRXb3JkcygpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoTmFtZVRvb2xzLmphdmFSZXNlcnZlZFdvcmRzKCksICJjbGFzcyIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKE5hbWVUb29scy5qYXZhUmVzZXJ2ZWRXb3JkcygpLCAiQ2xhc3MiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKE5hbWVUb29scy5qYXZhUmVzZXJ2ZWRXb3JkcygpLCAicHJpdmF0ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Y29udmVydFRvSmF2YUlkZW50aWZpZXJTdHJpbmcoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMSIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vMSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcml2YXRlXyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigicHJpdmF0ZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJvd18iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoInRocm93IikpOwotCQlhc3NlcnRFcXVhbHMoIl9mb28iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoIjFmb28iKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vXyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vJSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fX2Jhcl9fIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28gIGJhciAgIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3Rjb252ZXJ0VG9KYXZhSWRlbnRpZmllclN0cmluZ0NoYXIoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28iLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28xIiwgJyQnKSk7Ci0JCWFzc2VydEVxdWFscygicHJpdmF0ZSQiLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoInByaXZhdGUiLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJvd3NzIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJ0aHJvdyIsICdzJykpOwotCQlhc3NlcnRFcXVhbHMoIiRmb28iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoIjFmb28iLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28kIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28lIiwgJyQnKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vJCRiYXIkJCIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vICBiYXIgICIsICckJykpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCIxZm9vIiwgJzcnKTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiBcIiIgKyBzICsgIlwiIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKCc3JykgIT0gLTEpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28lIiwgJ14nKTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiBcIiIgKyBzICsgIlwiIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKCdeJykgIT0gLTEpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJwcml2YXRlIiwgJ14nKTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiBcIiIgKyBzICsgIlwiIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKCdeJykgIT0gLTEpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCkgewotCQlhc3NlcnRGYWxzZShOYW1lVG9vbHMuc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCJjbGFzcyIpKTsKLQkJYXNzZXJ0VHJ1ZShOYW1lVG9vbHMuc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCJjbGFzUyIpKTsKLQotCQlhc3NlcnRGYWxzZShOYW1lVG9vbHMuc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCI3Zm9vIikpOwotCQlhc3NlcnRGYWxzZShOYW1lVG9vbHMuc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCJmb29AYmFyIikpOwotCQlhc3NlcnRUcnVlKE5hbWVUb29scy5zdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoIl9mb28iKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05vdE51bGxGaWx0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Ob3ROdWxsRmlsdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwOTJmNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05vdE51bGxGaWx0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Ob3ROdWxsRmlsdGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBOb3ROdWxsRmlsdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTm90TnVsbEZpbHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb3ROdWxsRmlsdGVyKCkgewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBOb3ROdWxsRmlsdGVyLmluc3RhbmNlKCk7Ci0JCWFzc2VydFRydWUoZmlsdGVyLmFjY2VwdCgiIikpOwotCQlhc3NlcnRGYWxzZShmaWx0ZXIuYWNjZXB0KG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXIuYWNjZXB0KCJmb28iKSk7Ci0JCWFzc2VydFRydWUoZmlsdGVyLmFjY2VwdCgiYmFyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gTm90TnVsbEZpbHRlci5pbnN0YW5jZSgpOwotCQlhc3NlcnROb3ROdWxsKGZpbHRlci50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvT2JqZWN0UmVmZXJlbmNlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvT2JqZWN0UmVmZXJlbmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzNzQ3Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL09iamVjdFJlZmVyZW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLk9iamVjdFJlZmVyZW5jZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT2JqZWN0UmVmZXJlbmNlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgT2JqZWN0UmVmZXJlbmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgewotCQlPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigpOwotCQlhc3NlcnROdWxsKG9yLmdldFZhbHVlKCkpOwotCQlvci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlRXF1YWxzT2JqZWN0KCkgewotCQlPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigpOwotCQlhc3NlcnRUcnVlKG9yLnZhbHVlRXF1YWxzKG51bGwpKTsKLQkJYXNzZXJ0RmFsc2Uob3IudmFsdWVFcXVhbHMoImZvbyIpKTsKLQotCQlvci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKG9yLnZhbHVlRXF1YWxzKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShvci52YWx1ZUVxdWFscygiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZU5vdEVxdWFsT2JqZWN0KCkgewotCQlPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigpOwotCQlhc3NlcnRGYWxzZShvci52YWx1ZU5vdEVxdWFsKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShvci52YWx1ZU5vdEVxdWFsKCJmb28iKSk7Ci0KLQkJb3Iuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRUcnVlKG9yLnZhbHVlTm90RXF1YWwobnVsbCkpOwotCQlhc3NlcnRGYWxzZShvci52YWx1ZU5vdEVxdWFsKCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTnVsbCgpIHsKLQkJT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IgPSBuZXcgT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4oKTsKLQkJYXNzZXJ0VHJ1ZShvci5pc051bGwoKSk7Ci0JCW9yLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2Uob3IuaXNOdWxsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdE51bGwoKSB7Ci0JCU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IG9yID0gbmV3IE9iamVjdFJlZmVyZW5jZTxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKG9yLmlzTm90TnVsbCgpKTsKLQkJb3Iuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRUcnVlKG9yLmlzTm90TnVsbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbCgpIHsKLQkJT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IgPSBuZXcgT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4oKTsKLQkJYXNzZXJ0TnVsbChvci5nZXRWYWx1ZSgpKTsKLQkJb3Iuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9yLmdldFZhbHVlKCkpOwotCQlvci5zZXROdWxsKCk7Ci0JCWFzc2VydE51bGwob3IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigiZm9vIik7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJjYXN0IikKLQkJT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gY2xvbmUgPSAoT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4pIG9yLmNsb25lKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xvbmUuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvciwgY2xvbmUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IG9yMSA9IG5ldyBPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigiZm9vIik7Ci0JCU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IG9yMiA9IG5ldyBPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigiZm9vIik7Ci0JCWFzc2VydFRydWUob3IxLmVxdWFscyhvcjIpKTsKLQkJT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IzID0gbmV3IE9iamVjdFJlZmVyZW5jZTxTdHJpbmc+KCJiYXIiKTsKLQkJYXNzZXJ0RmFsc2Uob3IxLmVxdWFscyhvcjMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IG9yID0gbmV3IE9iamVjdFJlZmVyZW5jZTxTdHJpbmc+KCk7Ci0JCWFzc2VydEVxdWFscygwLCBvci5oYXNoQ29kZSgpKTsKLQkJb3Iuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIuaGFzaENvZGUoKSwgb3IuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigpOwotCQlhc3NlcnRFcXVhbHMoIltudWxsXSIsIG9yLnRvU3RyaW5nKCkpOwotCQlvci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiW2Zvb10iLCBvci50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmFuZ2VUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SYW5nZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZjJjY2UuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SYW5nZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJhbmdlOwotCi1wdWJsaWMgY2xhc3MgUmFuZ2VUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBSYW5nZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmNsdWRlcygpIHsKLQkJUmFuZ2UgcmFuZ2UgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcygtNTUpKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UuaW5jbHVkZXMoMCkpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcyg0KSk7Ci0JCWFzc2VydFRydWUocmFuZ2UuaW5jbHVkZXMoNSkpOwotCQlhc3NlcnRUcnVlKHJhbmdlLmluY2x1ZGVzKDYpKTsKLQkJYXNzZXJ0VHJ1ZShyYW5nZS5pbmNsdWRlcygxNikpOwotCQlhc3NlcnRUcnVlKHJhbmdlLmluY2x1ZGVzKDE3KSk7Ci0JCWFzc2VydEZhbHNlKHJhbmdlLmluY2x1ZGVzKDE4KSk7Ci0JCWFzc2VydEZhbHNlKHJhbmdlLmluY2x1ZGVzKDIwMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCVJhbmdlIHJhbmdlMSA9IG5ldyBSYW5nZSg1LCAxNyk7Ci0JCVJhbmdlIHJhbmdlMiA9IG5ldyBSYW5nZSg1LCAxNyk7Ci0JCWFzc2VydE5vdFNhbWUocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UyLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQotCQlyYW5nZTIgPSBuZXcgUmFuZ2UoMTcsIDUpOwotCQlhc3NlcnRGYWxzZShyYW5nZTEuZXF1YWxzKHJhbmdlMikpOwotCQlhc3NlcnRGYWxzZShyYW5nZTIuZXF1YWxzKHJhbmdlMSkpOwotCQkvLyBhbHRob3VnaCB0aGV5IGFyZSB1bmVxdWFsLCB0aGV5IGNhbiBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZQotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQotCQlyYW5nZTIgPSBuZXcgUmFuZ2UoNSwgMTUpOwotCQlhc3NlcnRGYWxzZShyYW5nZTEuZXF1YWxzKHJhbmdlMikpOwotCQlhc3NlcnRGYWxzZShyYW5nZTIuZXF1YWxzKHJhbmdlMSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJUmFuZ2UgcmFuZ2UxID0gbmV3IFJhbmdlKDUsIDE3KTsKLQkJUmFuZ2UgcmFuZ2UyID0gcmFuZ2UxLmNsb25lKCk7Ci0JCWFzc2VydE5vdFNhbWUocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UyLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlSYW5nZSByYW5nZTEgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlSYW5nZSByYW5nZTIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKHJhbmdlMSk7Ci0JCWFzc2VydE5vdFNhbWUocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UyLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmVmbGVjdGlvblRvb2xzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmVmbGVjdGlvblRvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkZmM2Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1JlZmxlY3Rpb25Ub29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGlvblRvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGVzdFN0YXRpY0ZpZWxkOwotCi0JcHVibGljIFJlZmxlY3Rpb25Ub29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotLy8gdGhpcyBpcyBubyBsb25nZXIgdHJ1ZSAtIGl0IGFwcGVhcnMgdGhlIEpMUyBub3cgZGVmaW5lcyB0aGUgZ2VuZXJhdGVkIG5hbWVzLi4uCi0vLwkvKioKLS8vCSAqIFJldHVybiB0aGUgY29tcGlsZXItZ2VuZXJhdGVkIGNsYXNzIG5hbWUuIFRoZSBFY2xpcHNlIGNvbXBpbGVyIGdlbmVyYXRlcwotLy8JICogImxvY2FsIiBjbGFzc2VzIHdpdGggbmFtZXMgaW4gdGhlIGZvcm0gImNvbS5mb28uT3V0ZXIkMSRMb2NhbCI7IHdoaWxlIHRoZQotLy8JICogSkRLIGNvbXBpbGVyIGdlbmVyYXRlcyAiY29tLmZvby5PdXRlciQxTG9jYWwiLiBUaGVyZSBtaWdodCBiZSBvdGhlcgotLy8JICogZGlmZmVyZW5jZXMuLi4uIH5ianYKLS8vCSAqLwotLy8JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGlsZXJEZXBlbmRlbnRDbGFzc05hbWVGb3IoU3RyaW5nIGNsYXNzTmFtZSkgewotLy8JCWludCBpbmRleCA9IGNsYXNzTmFtZS5pbmRleE9mKCIkMSQiKTsKLS8vCQlpZiAoaW5kZXggPT0gLTEpIHsKLS8vCQkJcmV0dXJuIGNsYXNzTmFtZTsKLS8vCQl9Ci0vLwkJdHJ5IHsKLS8vCQkJQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotLy8JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLS8vCQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXggKyAyKSArIGNsYXNzTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAzKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIGNsYXNzTmFtZTsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbXVuZ2UoU3RyaW5nIGNsYXNzTmFtZSkgewotLy8JCXJldHVybiBjb21waWxlckRlcGVuZGVudENsYXNzTmFtZUZvcihjbGFzc05hbWUpOwotLy8JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZpZWxkcygpIHsKLQkJaW50IGZpZWxkQ291bnQgPSAwOwotCQlmaWVsZENvdW50ICs9IGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGg7Ci0JCWZpZWxkQ291bnQgKz0gamF2YS51dGlsLkFic3RyYWN0TGlzdC5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpLmxlbmd0aDsKLQkJZmllbGRDb3VudCArPSBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoOwotCQlmaWVsZENvdW50ICs9IGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGg7Ci0JCUl0ZXJhYmxlPEZpZWxkPiBmaWVsZHMgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0QWxsRmllbGRzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoZmllbGRDb3VudCwgQ29sbGVjdGlvblRvb2xzLnNpemUoZmllbGRzKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZmllbGROYW1lcyhmaWVsZHMpLCAibW9kQ291bnQiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZmllbGROYW1lcyhmaWVsZHMpLCAic2VyaWFsVmVyc2lvblVJRCIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5maWVsZE5hbWVzKGZpZWxkcyksICJjYXBhY2l0eUluY3JlbWVudCIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5maWVsZE5hbWVzKGZpZWxkcyksICJlbGVtZW50Q291bnQiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZmllbGROYW1lcyhmaWVsZHMpLCAiZWxlbWVudERhdGEiKSk7Ci0JCWFzc2VydFRydWUoZmllbGRzLml0ZXJhdG9yKCkubmV4dCgpLmlzQWNjZXNzaWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsTWV0aG9kcygpIHsKLQkJaW50IG1ldGhvZENvdW50ID0gMDsKLQkJbWV0aG9kQ291bnQgKz0gamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKS5sZW5ndGg7Ci0JCW1ldGhvZENvdW50ICs9IGphdmEudXRpbC5BYnN0cmFjdExpc3QuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkubGVuZ3RoOwotCQltZXRob2RDb3VudCArPSBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpLmxlbmd0aDsKLQkJbWV0aG9kQ291bnQgKz0gamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKS5sZW5ndGg7Ci0JCUl0ZXJhYmxlPE1ldGhvZD4gbWV0aG9kcyA9IFJlZmxlY3Rpb25Ub29scy5nZXRBbGxNZXRob2RzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMobWV0aG9kQ291bnQsIENvbGxlY3Rpb25Ub29scy5zaXplKG1ldGhvZHMpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5tZXRob2ROYW1lcyhtZXRob2RzKSwgIndhaXQiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubWV0aG9kTmFtZXMobWV0aG9kcyksICJhZGRFbGVtZW50IikpOwotCQlhc3NlcnRUcnVlKG1ldGhvZHMuaXRlcmF0b3IoKS5uZXh0KCkuaXNBY2Nlc3NpYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdJbnN0YW5jZUNsYXNzKCkgewotCQlWZWN0b3I8Pz4gdiA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShqYXZhLnV0aWwuVmVjdG9yLmNsYXNzKTsKLQkJYXNzZXJ0Tm90TnVsbCh2KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHYuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3SW5zdGFuY2VDbGFzc0NsYXNzT2JqZWN0KCkgewotCQlpbnQgaW5pdGlhbENhcGFjaXR5ID0gMjAwOwotCQlWZWN0b3I8Pz4gdiA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBpbnQuY2xhc3MsIG5ldyBJbnRlZ2VyKGluaXRpYWxDYXBhY2l0eSkpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOwotCQlPYmplY3RbXSBlbGVtZW50RGF0YSA9IChPYmplY3RbXSkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUodiwgImVsZW1lbnREYXRhIik7Ci0JCWFzc2VydEVxdWFscyhpbml0aWFsQ2FwYWNpdHksIGVsZW1lbnREYXRhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0luc3RhbmNlQ2xhc3NDbGFzc0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCWludCBpbml0aWFsQ2FwYWNpdHkgPSAyMDA7Ci0JCUNsYXNzPD8+W10gcGFybVR5cGVzID0gbmV3IENsYXNzWzFdOwotCQlwYXJtVHlwZXNbMF0gPSBpbnQuY2xhc3M7Ci0JCU9iamVjdFtdIHBhcm1zID0gbmV3IE9iamVjdFsxXTsKLQkJcGFybXNbMF0gPSBuZXcgSW50ZWdlcihpbml0aWFsQ2FwYWNpdHkpOwotCQlWZWN0b3I8Pz4gdiA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBwYXJtVHlwZXMsIHBhcm1zKTsKLQkJYXNzZXJ0Tm90TnVsbCh2KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHYuc2l6ZSgpKTsKLQkJT2JqZWN0W10gZWxlbWVudERhdGEgPSAoT2JqZWN0W10pIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHYsICJlbGVtZW50RGF0YSIpOwotCQlhc3NlcnRFcXVhbHMoaW5pdGlhbENhcGFjaXR5LCBlbGVtZW50RGF0YS5sZW5ndGgpOwotCi0JCXBhcm1zWzBdID0gbmV3IEludGVnZXIoLTEpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl2ID0gUmVmbGVjdGlvblRvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIHBhcm1UeXBlcywgcGFybXMpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiUnVudGltZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCi0JCXBhcm1UeXBlc1swXSA9IGphdmEubGFuZy5TdHJpbmcuY2xhc3M7Ci0JCXBhcm1zWzBdID0gImZvbyI7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl2ID0gUmVmbGVjdGlvblRvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIHBhcm1UeXBlcywgcGFybXMpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbikgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hNZXRob2RFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRWYWx1ZSgpIHsKLQkJaW50IGluaXRpYWxDYXBhY2l0eSA9IDIwMDsKLQkJVmVjdG9yPD8+IHYgPSBuZXcgVmVjdG9yPE9iamVjdD4oaW5pdGlhbENhcGFjaXR5KTsKLQkJT2JqZWN0W10gZWxlbWVudERhdGEgPSAoT2JqZWN0W10pIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHYsICJlbGVtZW50RGF0YSIpOwotCQlhc3NlcnRFcXVhbHMoaW5pdGlhbENhcGFjaXR5LCBlbGVtZW50RGF0YS5sZW5ndGgpOwotCi0JCS8vIHRlc3QgaW5oZXJpdGVkIGZpZWxkCi0JCUludGVnZXIgbW9kQ291bnRJbnRlZ2VyID0gKEludGVnZXIpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHYsICJtb2RDb3VudCIpOwotCQlpbnQgbW9kQ291bnQgPSBtb2RDb3VudEludGVnZXIuaW50VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1vZENvdW50KTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBib2d1c0ZpZWxkVmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJYm9ndXNGaWVsZFZhbHVlID0gUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUodiwgImJvZ3VzRmllbGQiKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBOb1N1Y2hGaWVsZEV4Y2VwdGlvbikgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgYm9ndXNGaWVsZFZhbHVlLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVNZXRob2RPYmplY3RTdHJpbmcoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJaW50IHNpemUgPSAoKEludGVnZXIpIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKHYsICJzaXplIikpLmludFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygwLCBzaXplKTsKLQotCQl2LmFkZEVsZW1lbnQoImZvbyIpOwotCQlzaXplID0gKChJbnRlZ2VyKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZCh2LCAic2l6ZSIpKS5pbnRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgc2l6ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVNZXRob2RPYmplY3RTdHJpbmdDbGFzc09iamVjdCgpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQlib29sZWFuIGJvb2xlYW5SZXN1bHQgPSAoKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKHYsICJhZGQiLCBPYmplY3QuY2xhc3MsICJmb28iKSkuYm9vbGVhblZhbHVlKCk7Ci0JCWFzc2VydFRydWUoYm9vbGVhblJlc3VsdCk7Ci0JCWFzc2VydFRydWUodi5jb250YWlucygiZm9vIikpOwotCQlPYmplY3Qgdm9pZFJlc3VsdCA9IFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKHYsICJhZGRFbGVtZW50IiwgT2JqZWN0LmNsYXNzLCAiYmFyIik7Ci0JCWFzc2VydE51bGwodm9pZFJlc3VsdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVNZXRob2RPYmplY3RTdHJpbmdDbGFzc0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJQ2xhc3M8Pz5bXSBwYXJtVHlwZXMgPSBuZXcgQ2xhc3NbMV07Ci0JCXBhcm1UeXBlc1swXSA9IGphdmEubGFuZy5PYmplY3QuY2xhc3M7Ci0JCU9iamVjdFtdIHBhcm1zID0gbmV3IE9iamVjdFsxXTsKLQkJcGFybXNbMF0gPSAiZm9vIjsKLQkJYm9vbGVhbiBib29sZWFuUmVzdWx0ID0gKChCb29sZWFuKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZCh2LCAiYWRkIiwgcGFybVR5cGVzLCBwYXJtcykpLmJvb2xlYW5WYWx1ZSgpOwotCQlhc3NlcnRUcnVlKGJvb2xlYW5SZXN1bHQpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnMoImZvbyIpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBib2d1c01ldGhvZFJldHVyblZhbHVlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJvZ3VzTWV0aG9kUmV0dXJuVmFsdWUgPSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZCh2LCAiYm9ndXNNZXRob2QiLCBwYXJtVHlwZXMsIHBhcm1zKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBOb1N1Y2hNZXRob2RFeGNlcHRpb24pIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBib2d1c01ldGhvZFJldHVyblZhbHVlLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVTdGF0aWNNZXRob2RDbGFzc1N0cmluZygpIHsKLQkJRG91YmxlIHJhbmRvbU9iamVjdCA9IChEb3VibGUpIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlU3RhdGljTWV0aG9kKGphdmEubGFuZy5NYXRoLmNsYXNzLCAicmFuZG9tIik7Ci0JCWFzc2VydE5vdE51bGwocmFuZG9tT2JqZWN0KTsKLQkJZG91YmxlIHJhbmRvbSA9IHJhbmRvbU9iamVjdC5kb3VibGVWYWx1ZSgpOwotCQlhc3NlcnRUcnVlKHJhbmRvbSA+PSAwKTsKLQkJYXNzZXJ0VHJ1ZShyYW5kb20gPCAxKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZVN0YXRpY01ldGhvZENsYXNzU3RyaW5nQ2xhc3NPYmplY3QoKSB7Ci0JCVN0cmluZyBzID0gKFN0cmluZykgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgInZhbHVlT2YiLCBib29sZWFuLmNsYXNzLCBCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROb3ROdWxsKHMpOwotCQlhc3NlcnRFcXVhbHMoInRydWUiLCBzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZVN0YXRpY01ldGhvZENsYXNzU3RyaW5nQ2xhc3NBcnJheU9iamVjdEFycmF5KCkgewotCQlDbGFzczw/PltdIHBhcm1UeXBlcyA9IG5ldyBDbGFzc1sxXTsKLQkJcGFybVR5cGVzWzBdID0gYm9vbGVhbi5jbGFzczsKLQkJT2JqZWN0W10gcGFybXMgPSBuZXcgT2JqZWN0WzFdOwotCQlwYXJtc1swXSA9IEJvb2xlYW4uVFJVRTsKLQkJU3RyaW5nIHMgPSAoU3RyaW5nKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAidmFsdWVPZiIsIHBhcm1UeXBlcywgcGFybXMpOwotCQlhc3NlcnROb3ROdWxsKHMpOwotCQlhc3NlcnRFcXVhbHMoInRydWUiLCBzKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBib2d1c1N0YXRpY01ldGhvZFJldHVyblZhbHVlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJvZ3VzU3RhdGljTWV0aG9kUmV0dXJuVmFsdWUgPSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAiYm9ndXNTdGF0aWNNZXRob2QiLCBwYXJtVHlwZXMsIHBhcm1zKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBOb1N1Y2hNZXRob2RFeGNlcHRpb24pIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBib2d1c1N0YXRpY01ldGhvZFJldHVyblZhbHVlLCBleENhdWdodCk7Ci0KLQkJLy8gdGVzdCBub24tc3RhdGljIG1ldGhvZAotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJYm9ndXNTdGF0aWNNZXRob2RSZXR1cm5WYWx1ZSA9IFJlZmxlY3Rpb25Ub29scy5leGVjdXRlU3RhdGljTWV0aG9kKGphdmEubGFuZy5TdHJpbmcuY2xhc3MsICJ0b1N0cmluZyIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbikgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hNZXRob2RFeGNlcHRpb24gbm90IHRocm93bjogIiArIGJvZ3VzU3RhdGljTWV0aG9kUmV0dXJuVmFsdWUsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmllbGRWYWx1ZSgpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQlPYmplY3RbXSBuZXdFbGVtZW50RGF0YSA9IG5ldyBPYmplY3RbNV07Ci0JCW5ld0VsZW1lbnREYXRhWzBdID0gImZvbyI7Ci0JCVJlZmxlY3Rpb25Ub29scy5zZXRGaWVsZFZhbHVlKHYsICJlbGVtZW50RGF0YSIsIG5ld0VsZW1lbnREYXRhKTsKLQkJUmVmbGVjdGlvblRvb2xzLnNldEZpZWxkVmFsdWUodiwgImVsZW1lbnRDb3VudCIsIG5ldyBJbnRlZ2VyKDEpKTsKLQkJLy8gdGVzdCBpbmhlcml0ZWQgZmllbGQKLQkJUmVmbGVjdGlvblRvb2xzLnNldEZpZWxkVmFsdWUodiwgIm1vZENvdW50IiwgbmV3IEludGVnZXIoMSkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnMoImZvbyIpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuc2V0RmllbGRWYWx1ZSh2LCAiYm9ndXNGaWVsZCIsICJmb28iKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBOb1N1Y2hGaWVsZEV4Y2VwdGlvbikgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTdGF0aWNGaWVsZFZhbHVlKCkgewotCQlSZWZsZWN0aW9uVG9vbHMuc2V0U3RhdGljRmllbGRWYWx1ZSh0aGlzLmdldENsYXNzKCksICJ0ZXN0U3RhdGljRmllbGQiLCAibmV3IHZhbHVlIik7Ci0JCWFzc2VydEVxdWFscyh0ZXN0U3RhdGljRmllbGQsICJuZXcgdmFsdWUiKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuc2V0U3RhdGljRmllbGRWYWx1ZSh0aGlzLmdldENsYXNzKCksICJib2d1c1N0YXRpY0ZpZWxkIiwgIm5ldyB2YWx1ZSIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE5vU3VjaEZpZWxkRXhjZXB0aW9uKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEZpZWxkRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZU5hbWUoKSB7Ci0JCWFzc2VydEVxdWFscygiVmVjdG9yIiwgamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkVudHJ5IiwgamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGludC5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImludFtdIiwgaW50W10uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnRbXVtdIiwgaW50W11bXS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCB2b2lkLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhY2thZ2VOYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbCIsIGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsIiwgamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlEZXB0aEZvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoKGludC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoMCwgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGgodm9pZC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoMSwgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGgoamF2YS51dGlsLlZlY3RvcltdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygxLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aChpbnRbXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoMywgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGgoamF2YS51dGlsLlZlY3RvcltdW11bXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoMywgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGgoaW50W11bXVtdLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRUeXBlRm9yKCkgewotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlKGludC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHModm9pZC5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlKHZvaWQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZShqYXZhLnV0aWwuVmVjdG9yW10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlKGludFtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGUoamF2YS51dGlsLlZlY3RvcltdW11bXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGUoaW50W11bXVtdLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoKSB7Ci0JCWFzc2VydFRydWUoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5Wb2lkLmNsYXNzKSk7Ci0JCWFzc2VydFRydWUoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5Cb29sZWFuLmNsYXNzKSk7Ci0JCWFzc2VydFRydWUoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzKSk7Ci0JCWFzc2VydFRydWUoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5GbG9hdC5jbGFzcykpOwotCi0JCWFzc2VydEZhbHNlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKSk7Ci0JCWFzc2VydEZhbHNlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzUHJpbWl0aXZlV3JhcHBlcih2b2lkLmNsYXNzKSk7Ci0JCWFzc2VydEZhbHNlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzUHJpbWl0aXZlV3JhcHBlcihpbnQuY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKCkgewotCQlhc3NlcnRGYWxzZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuVm9pZC5jbGFzcykpOwotCi0JCWFzc2VydFRydWUoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MpKTsKLQkJYXNzZXJ0VHJ1ZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuSW50ZWdlci5jbGFzcykpOwotCQlhc3NlcnRUcnVlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5GbG9hdC5jbGFzcykpOwotCi0JCWFzc2VydEZhbHNlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpKTsKLQkJYXNzZXJ0RmFsc2UoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIodm9pZC5jbGFzcykpOwotCQlhc3NlcnRGYWxzZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihpbnQuY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlckNsYXNzKCkgewotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLlZvaWQuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRXcmFwcGVyQ2xhc3Modm9pZC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLkludGVnZXIuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRXcmFwcGVyQ2xhc3MoaW50LmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuRmxvYXQuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRXcmFwcGVyQ2xhc3MoZmxvYXQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5Cb29sZWFuLmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0V3JhcHBlckNsYXNzKGJvb2xlYW4uY2xhc3MpKTsKLQotCQlhc3NlcnROdWxsKFJlZmxlY3Rpb25Ub29scy5nZXRXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLlN0cmluZy5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0ZvclR5cGVEZWNsYXJhdGlvblN0cmluZ0ludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDApKTsKLQkJYXNzZXJ0RXF1YWxzKGludFtdLmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDEpKTsKLQkJYXNzZXJ0RXF1YWxzKGludFtdW11bXS5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiLCAzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE9iamVjdC5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoT2JqZWN0W11bXVtdLmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHZvaWQuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbigidm9pZCIsIDApKTsKLQkJdHJ5IHsKLQkJCVJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbih2b2lkLmNsYXNzLmdldE5hbWUoKSwgMSk7Ci0JCQlmYWlsKCJzaG91bGQgbm90IGdldCBoZXJlLi4uIik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29kZUZvckNsYXNzKCkgewotCQlhc3NlcnRFcXVhbHMoJ0knLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q29kZUZvckNsYXNzKGludC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoJ0InLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q29kZUZvckNsYXNzKGJ5dGUuY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50IikpOwotCQlhc3NlcnRFcXVhbHMoIltJIiwgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50W10iKSk7Ci0JCWFzc2VydEVxdWFscygiW1tJIiwgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50IFsgXSBbIF0iKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbTGphdmEubGFuZy5PYmplY3Q7IiwgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdFx0W10iKSk7Ci0JCWFzc2VydEVxdWFscygiW1tMamF2YS5sYW5nLk9iamVjdDsiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0XHRbXVx0W10iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IikpOwotCQlhc3NlcnRFcXVhbHMoMSwgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RbXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0W11bXVtdIikpOwotCi0JCWFzc2VydEVxdWFscygwLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiaW50IikpOwotCQlhc3NlcnRFcXVhbHMoMSwgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImludFtdIikpOwotCQlhc3NlcnRFcXVhbHMoMywgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImludFtdW11bXSIpKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0IikpOwotCQlhc3NlcnRFcXVhbHMoMSwgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0IFsgXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJmbG9hdFtdIFtdIFtdIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb25TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdFtdIikpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0W11bXVtdIikpOwotCi0JCWFzc2VydEVxdWFscygiaW50IiwgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50IikpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludFtdIikpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludFtdW11bXSIpKTsKLQotCQlhc3NlcnRFcXVhbHMoImZsb2F0IiwgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiZmxvYXQiKSk7Ci0JCWFzc2VydEVxdWFscygiZmxvYXQiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJmbG9hdCBbIF0iKSk7Ci0JCWFzc2VydEVxdWFscygiZmxvYXQiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJmbG9hdFtdIFtdIFtdIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb25TdHJpbmdJbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDApKTsKLQkJYXNzZXJ0RXF1YWxzKGludFtdLmNsYXNzLmdldE5hbWUoKSwgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMSkpOwotCQlhc3NlcnRFcXVhbHMoaW50W11bXVtdLmNsYXNzLmdldE5hbWUoKSwgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMykpOwotCi0JCWFzc2VydEVxdWFscyhPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoT2JqZWN0W11bXVtdLmNsYXNzLmdldE5hbWUoKSwgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdCIsIDMpKTsKLQotCQlhc3NlcnRFcXVhbHModm9pZC5jbGFzcy5nZXROYW1lKCksIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oInZvaWQiLCAwKSk7Ci0JCXRyeSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCAxKTsKLQkJCWZhaWwoInNob3VsZCBub3QgZ2V0IGhlcmUuLi4iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGZpZWxkTmFtZXMoSXRlcmFibGU8RmllbGQ+IGZpZWxkcykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8RmllbGQsIFN0cmluZz4oZmllbGRzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEZpZWxkIGZpZWxkKSB7Ci0JCQkJcmV0dXJuIGZpZWxkLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gbWV0aG9kTmFtZXMoSXRlcmFibGU8TWV0aG9kPiBtZXRob2RzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxNZXRob2QsIFN0cmluZz4obWV0aG9kcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1JldmVyc2VDb21wYXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjYxYjBjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmV2ZXJzZUNvbXBhcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJldmVyc2VDb21wYXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gbmF0dXJhbFJldmVyc2VDb21wYXJhdG9yOwotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGN1c3RvbUNvbXBhcmF0b3I7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gY3VzdG9tUmV2ZXJzZUNvbXBhcmF0b3I7Ci0KLQlwdWJsaWMgUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm5hdHVyYWxSZXZlcnNlQ29tcGFyYXRvciA9IG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCk7Ci0JCXRoaXMuY3VzdG9tQ29tcGFyYXRvciA9IHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCk7Ci0JCXRoaXMuY3VzdG9tUmV2ZXJzZUNvbXBhcmF0b3IgPSBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPih0aGlzLmN1c3RvbUNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJCQlTdHJpbmcgbG93ZXIxID0gczEudG9Mb3dlckNhc2UoKTsKLQkJCQlTdHJpbmcgbG93ZXIyID0gczIudG9Mb3dlckNhc2UoKTsKLQkJCQlpbnQgcmVzdWx0ID0gbG93ZXIxLmNvbXBhcmVUbyhsb3dlcjIpOwotCQkJCWlmIChyZXN1bHQgPT0gMCkgewotCQkJCQlyZXR1cm4gczEuY29tcGFyZVRvKHMyKTsgLy8gdXNlIGNhc2UgdG8gZGlmZmVyZW50aWF0ZSAiZXF1YWwiIHN0cmluZ3MKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFVuc29ydGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJUIik7Ci0JCXJlc3VsdC5hZGQoIloiKTsKLQkJcmVzdWx0LmFkZCgiWSIpOwotCQlyZXN1bHQuYWRkKCJNIik7Ci0JCXJlc3VsdC5hZGQoIm0iKTsKLQkJcmVzdWx0LmFkZCgiYSIpOwotCQlyZXN1bHQuYWRkKCJCIik7Ci0JCXJlc3VsdC5hZGQoImIiKTsKLQkJcmVzdWx0LmFkZCgiQSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTmF0dXJhbGx5U29ydGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCkpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRDdXN0b21Tb3J0ZWRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHRoaXMuYnVpbGRVbnNvcnRlZExpc3QoKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0LCB0aGlzLmN1c3RvbUNvbXBhcmF0b3IpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmF0dXJhbCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgdGhpcy5uYXR1cmFsUmV2ZXJzZUNvbXBhcmF0b3IpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5idWlsZE5hdHVyYWxseVNvcnRlZExpc3QoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgdGhpcy5jdXN0b21SZXZlcnNlQ29tcGFyYXRvcik7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkTGlzdCgpLCBsaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdChMaXN0PFN0cmluZz4gbm9ybWFsLCBMaXN0PFN0cmluZz4gcmV2ZXJzZSkgewotCQlpbnQgc2l6ZSA9IG5vcm1hbC5zaXplKCk7Ci0JCWludCBtYXggPSBzaXplIC0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhub3JtYWwuZ2V0KGkpLCByZXZlcnNlLmdldChtYXggLSBpKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlQXNzb2NpYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmM3MDZhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlQXNzb2NpYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Bc3NvY2lhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVBc3NvY2lhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2ltcGxlQXNzb2NpYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBhc3NvYzsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2ltcGxlQXNzb2NpYXRpb25UZXN0cy5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBTaW1wbGVBc3NvY2lhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuYXNzb2MgPSBuZXcgU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+KCJmb28iLCAiYmFyIik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRLZXkoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hc3NvYy5rZXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuYXNzb2MudmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuYXNzb2MudmFsdWUoKSk7Ci0JCXRoaXMuYXNzb2Muc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuYXNzb2MudmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hc3NvYy5lcXVhbHMoImZvbyIpKTsKLQotCQlhc3NlcnRFcXVhbHModGhpcy5hc3NvYywgdGhpcy5jb3B5KHRoaXMuYXNzb2MpKTsKLQotCQlTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYXNzb2MyID0gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPigiZm9vIiwgImJheiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFzc29jLmVxdWFscyhhc3NvYzIpKTsKLQotCQlhc3NvYzIgPSBuZXcgU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+KCJmb3AiLCAiYmFyIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYXNzb2MuZXF1YWxzKGFzc29jMikpOwotCi0JCVNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBhc3NvYzMgPSBuZXcgU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+KG51bGwsIG51bGwpOwotCQlTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYXNzb2M0ID0gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPihudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGFzc29jMywgYXNzb2M0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFzc29jLmhhc2hDb2RlKCksIHRoaXMuY29weSh0aGlzLmFzc29jKS5oYXNoQ29kZSgpKTsKLQotCQlTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYXNzb2MyID0gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPihudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGFzc29jMi5oYXNoQ29kZSgpLCB0aGlzLmNvcHkoYXNzb2MyKS5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5hc3NvYy50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCXRoaXMudmVyaWZ5Q2xvbmUodGhpcy5hc3NvYywgdGhpcy5hc3NvYy5jbG9uZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2xvbmUoQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkLCBBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYWN0dWFsKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQkJYXNzZXJ0Tm90U2FtZShleHBlY3RlZCwgYWN0dWFsKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmtleSgpLCBhY3R1YWwua2V5KCkpOwotCQlhc3NlcnRTYW1lKGV4cGVjdGVkLmtleSgpLCBhY3R1YWwua2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQudmFsdWUoKSwgYWN0dWFsLnZhbHVlKCkpOwotCQlhc3NlcnRTYW1lKGV4cGVjdGVkLnZhbHVlKCksIGFjdHVhbC52YWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlAU3VwcHJlc3NXYXJuaW5ncygiY2FzdCIpCi0JCUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBhc3NvYzIgPSAoQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+KSBUZXN0VG9vbHMuc2VyaWFsaXplKHRoaXMuYXNzb2MpOwotCi0JCWFzc2VydEVxdWFscyh0aGlzLmFzc29jLCBhc3NvYzIpOwotCQlhc3NlcnROb3RTYW1lKHRoaXMuYXNzb2MsIGFzc29jMik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFzc29jLmtleSgpLCBhc3NvYzIua2V5KCkpOwotCQlhc3NlcnROb3RTYW1lKHRoaXMuYXNzb2Mua2V5KCksIGFzc29jMi5rZXkoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFzc29jLnZhbHVlKCksIGFzc29jMi52YWx1ZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZSh0aGlzLmFzc29jLnZhbHVlKCksIGFzc29jMi52YWx1ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBjb3B5KFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBzYSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPihzYS5rZXkoKSwgc2EudmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZVF1ZXVlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlUXVldWVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjcwODg5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlUXVldWVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZVF1ZXVlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW1wbGVRdWV1ZVRlc3RzCi0JZXh0ZW5kcyBNdWx0aVRocmVhZGVkVGVzdENhc2UKLXsKLQotCXB1YmxpYyBTaW1wbGVRdWV1ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCVF1ZXVlPFN0cmluZz4gYnVpbGRRdWV1ZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVRdWV1ZTxTdHJpbmc+KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB7Ci0JCVF1ZXVlPFN0cmluZz4gcXVldWUgPSB0aGlzLmJ1aWxkUXVldWUoKTsKLQkJYXNzZXJ0VHJ1ZShxdWV1ZS5pc0VtcHR5KCkpOwotCQlxdWV1ZS5lbnF1ZXVlKCJmaXJzdCIpOwotCQlhc3NlcnRGYWxzZShxdWV1ZS5pc0VtcHR5KCkpOwotCQlxdWV1ZS5lbnF1ZXVlKCJzZWNvbmQiKTsKLQkJYXNzZXJ0RmFsc2UocXVldWUuaXNFbXB0eSgpKTsKLQkJcXVldWUuZGVxdWV1ZSgpOwotCQlhc3NlcnRGYWxzZShxdWV1ZS5pc0VtcHR5KCkpOwotCQlxdWV1ZS5kZXF1ZXVlKCk7Ci0JCWFzc2VydFRydWUocXVldWUuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW5xdWV1ZUFuZERlcXVldWUoKSB7Ci0JCVF1ZXVlPFN0cmluZz4gcXVldWUgPSB0aGlzLmJ1aWxkUXVldWUoKTsKLQkJU3RyaW5nIGZpcnN0ID0gImZpcnN0IjsKLQkJU3RyaW5nIHNlY29uZCA9ICJzZWNvbmQiOwotCi0JCXF1ZXVlLmVucXVldWUoZmlyc3QpOwotCQlxdWV1ZS5lbnF1ZXVlKHNlY29uZCk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgcXVldWUuZGVxdWV1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgcXVldWUuZGVxdWV1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW5xdWV1ZUFuZFBlZWsoKSB7Ci0JCVF1ZXVlPFN0cmluZz4gcXVldWUgPSB0aGlzLmJ1aWxkUXVldWUoKTsKLQkJU3RyaW5nIGZpcnN0ID0gImZpcnN0IjsKLQkJU3RyaW5nIHNlY29uZCA9ICJzZWNvbmQiOwotCi0JCXF1ZXVlLmVucXVldWUoZmlyc3QpOwotCQlxdWV1ZS5lbnF1ZXVlKHNlY29uZCk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgcXVldWUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBxdWV1ZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHF1ZXVlLmRlcXVldWUoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHF1ZXVlLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHF1ZXVlLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHF1ZXVlLmRlcXVldWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5UXVldWVFeGNlcHRpb25QZWVrKCkgewotCQlRdWV1ZTxTdHJpbmc+IHF1ZXVlID0gdGhpcy5idWlsZFF1ZXVlKCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlxdWV1ZS5lbnF1ZXVlKGZpcnN0KTsKLQkJcXVldWUuZW5xdWV1ZShzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHF1ZXVlLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgcXVldWUuZGVxdWV1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgcXVldWUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgcXVldWUuZGVxdWV1ZSgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlxdWV1ZS5wZWVrKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlRdWV1ZUV4Y2VwdGlvbkRlcXVldWUoKSB7Ci0JCVF1ZXVlPFN0cmluZz4gcXVldWUgPSB0aGlzLmJ1aWxkUXVldWUoKTsKLQkJU3RyaW5nIGZpcnN0ID0gImZpcnN0IjsKLQkJU3RyaW5nIHNlY29uZCA9ICJzZWNvbmQiOwotCi0JCXF1ZXVlLmVucXVldWUoZmlyc3QpOwotCQlxdWV1ZS5lbnF1ZXVlKHNlY29uZCk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgcXVldWUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBxdWV1ZS5kZXF1ZXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBxdWV1ZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBxdWV1ZS5kZXF1ZXVlKCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXF1ZXVlLmRlcXVldWUoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJU2ltcGxlUXVldWU8U3RyaW5nPiBxdWV1ZSA9IChTaW1wbGVRdWV1ZTxTdHJpbmc+KSB0aGlzLmJ1aWxkUXVldWUoKTsKLQkJcXVldWUuZW5xdWV1ZSgiZmlyc3QiKTsKLQkJcXVldWUuZW5xdWV1ZSgic2Vjb25kIik7Ci0JCXF1ZXVlLmVucXVldWUoInRoaXJkIik7Ci0KLQkJdGhpcy52ZXJpZnlDbG9uZShxdWV1ZSwgcXVldWUuY2xvbmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUXVldWU8U3RyaW5nPiBxdWV1ZSA9IHRoaXMuYnVpbGRRdWV1ZSgpOwotCQlxdWV1ZS5lbnF1ZXVlKCJmaXJzdCIpOwotCQlxdWV1ZS5lbnF1ZXVlKCJzZWNvbmQiKTsKLQkJcXVldWUuZW5xdWV1ZSgidGhpcmQiKTsKLQotCQl0aGlzLnZlcmlmeUNsb25lKHF1ZXVlLCBUZXN0VG9vbHMuc2VyaWFsaXplKHF1ZXVlKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNsb25lKFF1ZXVlPFN0cmluZz4gb3JpZ2luYWwsIFF1ZXVlPFN0cmluZz4gY2xvbmUpIHsKLQkJYXNzZXJ0Tm90U2FtZShvcmlnaW5hbCwgY2xvbmUpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucGVlaygpLCBjbG9uZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuZGVxdWV1ZSgpLCBjbG9uZS5kZXF1ZXVlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucGVlaygpLCBjbG9uZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuZGVxdWV1ZSgpLCBjbG9uZS5kZXF1ZXVlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuaXNFbXB0eSgpLCBjbG9uZS5pc0VtcHR5KCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucGVlaygpLCBjbG9uZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuZGVxdWV1ZSgpLCBjbG9uZS5kZXF1ZXVlKCkpOwotCQlhc3NlcnRUcnVlKG9yaWdpbmFsLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5pc0VtcHR5KCksIGNsb25lLmlzRW1wdHkoKSk7Ci0KLQkJb3JpZ2luYWwuZW5xdWV1ZSgiZm91cnRoIik7Ci0JCWFzc2VydEZhbHNlKG9yaWdpbmFsLmlzRW1wdHkoKSk7Ci0JCS8vIGNsb25lIHNob3VsZCBzdGlsbCBiZSBlbXB0eQotCQlhc3NlcnRUcnVlKGNsb25lLmlzRW1wdHkoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZVN0YWNrVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlU3RhY2tUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjk2MjBhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlU3RhY2tUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZVN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0YWNrOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW1wbGVTdGFja1Rlc3RzCi0JZXh0ZW5kcyBNdWx0aVRocmVhZGVkVGVzdENhc2UKLXsKLQlwdWJsaWMgU2ltcGxlU3RhY2tUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlTdGFjazxTdHJpbmc+IGJ1aWxkU3RhY2soKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RhY2s8U3RyaW5nPigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgewotCQlTdGFjazxTdHJpbmc+IHN0YWNrID0gdGhpcy5idWlsZFN0YWNrKCk7Ci0JCWFzc2VydFRydWUoc3RhY2suaXNFbXB0eSgpKTsKLQkJc3RhY2sucHVzaCgiZmlyc3QiKTsKLQkJYXNzZXJ0RmFsc2Uoc3RhY2suaXNFbXB0eSgpKTsKLQkJc3RhY2sucHVzaCgic2Vjb25kIik7Ci0JCWFzc2VydEZhbHNlKHN0YWNrLmlzRW1wdHkoKSk7Ci0JCXN0YWNrLnBvcCgpOwotCQlhc3NlcnRGYWxzZShzdGFjay5pc0VtcHR5KCkpOwotCQlzdGFjay5wb3AoKTsKLQkJYXNzZXJ0VHJ1ZShzdGFjay5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQdXNoQW5kUG9wKCkgewotCQlTdGFjazxTdHJpbmc+IHN0YWNrID0gdGhpcy5idWlsZFN0YWNrKCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlzdGFjay5wdXNoKGZpcnN0KTsKLQkJc3RhY2sucHVzaChzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wb3AoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucG9wKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQdXNoQW5kUGVlaygpIHsKLQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IHRoaXMuYnVpbGRTdGFjaygpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJc3RhY2sucHVzaChmaXJzdCk7Ci0JCXN0YWNrLnB1c2goc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucG9wKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wb3AoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5U3RhY2tFeGNlcHRpb25QZWVrKCkgewotCQlTdGFjazxTdHJpbmc+IHN0YWNrID0gdGhpcy5idWlsZFN0YWNrKCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlzdGFjay5wdXNoKGZpcnN0KTsKLQkJc3RhY2sucHVzaChzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wb3AoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wb3AoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJc3RhY2sucGVlaygpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChFbXB0eVN0YWNrRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5U3RhY2tFeGNlcHRpb25Qb3AoKSB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSB0aGlzLmJ1aWxkU3RhY2soKTsKLQkJU3RyaW5nIGZpcnN0ID0gImZpcnN0IjsKLQkJU3RyaW5nIHNlY29uZCA9ICJzZWNvbmQiOwotCi0JCXN0YWNrLnB1c2goZmlyc3QpOwotCQlzdGFjay5wdXNoKHNlY29uZCk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBvcCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBvcCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzdGFjay5wb3AoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoRW1wdHlTdGFja0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJU2ltcGxlU3RhY2s8U3RyaW5nPiBzdGFjayA9IChTaW1wbGVTdGFjazxTdHJpbmc+KSB0aGlzLmJ1aWxkU3RhY2soKTsKLQkJc3RhY2sucHVzaCgiZmlyc3QiKTsKLQkJc3RhY2sucHVzaCgic2Vjb25kIik7Ci0JCXN0YWNrLnB1c2goInRoaXJkIik7Ci0KLQkJdGhpcy52ZXJpZnlDbG9uZShzdGFjaywgc3RhY2suY2xvbmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IHRoaXMuYnVpbGRTdGFjaygpOwotCQlzdGFjay5wdXNoKCJmaXJzdCIpOwotCQlzdGFjay5wdXNoKCJzZWNvbmQiKTsKLQkJc3RhY2sucHVzaCgidGhpcmQiKTsKLQotCQl0aGlzLnZlcmlmeUNsb25lKHN0YWNrLCBUZXN0VG9vbHMuc2VyaWFsaXplKHN0YWNrKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNsb25lKFN0YWNrPFN0cmluZz4gb3JpZ2luYWwsIFN0YWNrPFN0cmluZz4gY2xvbmUpIHsKLQkJYXNzZXJ0Tm90U2FtZShvcmlnaW5hbCwgY2xvbmUpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucGVlaygpLCBjbG9uZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucG9wKCksIGNsb25lLnBvcCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBlZWsoKSwgY2xvbmUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBvcCgpLCBjbG9uZS5wb3AoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5pc0VtcHR5KCksIGNsb25lLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wZWVrKCksIGNsb25lLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wb3AoKSwgY2xvbmUucG9wKCkpOwotCQlhc3NlcnRUcnVlKG9yaWdpbmFsLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5pc0VtcHR5KCksIGNsb25lLmlzRW1wdHkoKSk7Ci0KLQkJb3JpZ2luYWwucHVzaCgiZm91cnRoIik7Ci0JCWFzc2VydEZhbHNlKG9yaWdpbmFsLmlzRW1wdHkoKSk7Ci0JCS8vIGNsb25lIHNob3VsZCBzdGlsbCBiZSBlbXB0eQotCQlhc3NlcnRUcnVlKGNsb25lLmlzRW1wdHkoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N0cmluZ1Rvb2xzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3RyaW5nVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzE5ZGMwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3RyaW5nVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTdHJpbmdUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFN0cmluZ1Rvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gYWN0dWFsKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgbmV3IFN0cmluZyhhY3R1YWwpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHBhZGRpbmcvdHJ1bmNhdGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkKCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWQoImZyZWQiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgU3RyaW5nVG9vbHMucGFkKCJmcmVkIiwgNikpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoImZyIiwgU3RyaW5nVG9vbHMucGFkKCJmcmVkIiwgMikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWQobmV3IGNoYXJbXSB7ICdmJywgJ3InLCAnZScsICdkJyB9LCA0KSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgU3RyaW5nVG9vbHMucGFkKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgNikpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoImZyIiwgU3RyaW5nVG9vbHMucGFkKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgMikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT25Xcml0ZXIoKSB7Ci0JCVdyaXRlciB3cml0ZXI7Ci0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA0LCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDYsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCAyLCB3cml0ZXIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT25TdHJpbmdCdWZmZXIoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYjsKLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA2LCBzYik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgMiwgc2IpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT25TdHJpbmdCdWlsZGVyKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiOwotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNiwgc2IpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCAyLCBzYik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlKCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKCJmcmVkIiwgNCkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUoImZyZWQiLCA2KSk7Ci0JCWFzc2VydEVxdWFscygiZnIiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKCJmcmVkIiwgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgNCkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICdmJywgJ3InLCAnZScsICdkJyB9LCA2KSk7Ci0JCWFzc2VydEVxdWFscygiZnIiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCJmcmVkIiwgImZyZWQiLCA0KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25Xcml0ZXIoImZyZWQgICIsICJmcmVkIiwgNik7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCJmciIsICJmcmVkIiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVBhZE9yVHJ1bmNhdGVPbldyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiZnJlZCIsICJmcmVkIiwgNCk7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCJmcmVkICAiLCAiZnJlZCIsIDYpOwotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiZnIiLCAiZnJlZCIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiZnJlZCIsICJmcmVkIiwgNCk7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiZnJlZCAgIiwgImZyZWQiLCA2KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKCJmciIsICJmcmVkIiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5wYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZCgiMTIzNCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkKCIxMjM0IiwgNikpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjEyIiwgU3RyaW5nVG9vbHMuemVyb1BhZCgiMTIzNCIsIDIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWQobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA0KSk7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZChuZXcgY2hhcltdIHsgJzEnLCAnMicsICczJywgJzQnIH0sIDYpKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKCIxMiIsIFN0cmluZ1Rvb2xzLnplcm9QYWQobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCAyKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT25Xcml0ZXIoKSB7Ci0JCVdyaXRlciB3cml0ZXI7Ci0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0Iiwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNiwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCAyLCB3cml0ZXIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9uU3RyaW5nQnVmZmVyKCkgewotCQlTdHJpbmdCdWZmZXIgc2I7Ci0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCA0LCBzYik7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCA2LCBzYik7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0Iiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDIsIHNiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2I7Ci0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDYsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDIsIHNiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPclRydW5jYXRlKCkgewotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZSgiMTIzNCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZSgiMTIzNCIsIDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlKCIxMjM0IiwgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT3JUcnVuY2F0ZUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA0KSk7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA2KSk7Ci0JCWFzc2VydEVxdWFscygiMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZShuZXcgY2hhcltdIHsgJzEnLCAnMicsICczJywgJzQnIH0sIDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9yVHJ1bmNhdGVPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCIxMjM0IiwgIjEyMzQiLCA0KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCIwMDEyMzQiLCAiMTIzNCIsIDYpOwotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25Xcml0ZXIoIjM0IiwgIjEyMzQiLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPbldyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiMTIzNCIsICIxMjM0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiMDAxMjM0IiwgIjEyMzQiLCA2KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCIzNCIsICIxMjM0IiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiMTIzNCIsICIxMjM0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoIjAwMTIzNCIsICIxMjM0IiwgNik7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoIjM0IiwgIjEyMzQiLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBkZWxpbWl0aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3REZWxpbWl0KCkgewotCQl0aGlzLnZlcmlmeURlbGltaXQoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXQoIjEyMyIsICIxMjMiLCAiMTIzMTIzMTIzIik7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdCgiIiwgIjEyMyIsICIxMjMxMjMiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGVsaW1pdChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5kZWxpbWl0KHN0cmluZywgZGVsaW1pdGVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlbGltaXRPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0T25Xcml0ZXIoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXRPbldyaXRlcigiMTIzIiwgIjEyMyIsICIxMjMxMjMxMjMiKTsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0T25Xcml0ZXIoIiIsICIxMjMiLCAiMTIzMTIzIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURlbGltaXRPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsaW1pdE9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeURlbGltaXRPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUiLCAiMTIzIiwgIjEyM0VtcGxveWVlMTIzIik7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVmZmVyKCIxMjMiLCAiMTIzIiwgIjEyMzEyMzEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXRPblN0cmluZ0J1ZmZlcigiIiwgIjEyMyIsICIxMjMxMjMiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVmZmVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmRlbGltaXRPbihzdHJpbmcsIGRlbGltaXRlciwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWxpbWl0T25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeURlbGltaXRPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXRPblN0cmluZ0J1aWxkZXIoIjEyMyIsICIxMjMiLCAiMTIzMTIzMTIzIik7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiIiwgIjEyMyIsICIxMjMxMjMiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVpbGRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmRlbGltaXRPbihzdHJpbmcsIGRlbGltaXRlciwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RRdW90ZSgpIHsKLQkJdGhpcy52ZXJpZnlRdW90ZSgiRW1wbG95ZWUiLCAiXCJFbXBsb3llZVwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGUoIjEyMyIsICJcIjEyM1wiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGUoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGUoIkVtcFwibG95ZWUiLCAiXCJFbXBcIlwibG95ZWVcIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlRdW90ZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5xdW90ZShzdHJpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UXVvdGVPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uV3JpdGVyKCJFbXBsb3llZSIsICJcIkVtcGxveWVlXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uV3JpdGVyKCIxMjMiLCAiXCIxMjNcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25Xcml0ZXIoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPbldyaXRlcigiRW1wXCJsb3llZSIsICJcIkVtcFwiXCJsb3llZVwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVF1b3RlT25Xcml0ZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnF1b3RlT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UXVvdGVPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSIsICJcIkVtcGxveWVlXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVmZmVyKCIxMjMiLCAiXCIxMjNcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWZmZXIoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1ZmZlcigiRW1wXCJsb3llZSIsICJcIkVtcFwiXCJsb3llZVwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVF1b3RlT25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucXVvdGVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UXVvdGVPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlIiwgIlwiRW1wbG95ZWVcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWlsZGVyKCIxMjMiLCAiXCIxMjNcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWlsZGVyKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWlsZGVyKCJFbXBcImxveWVlIiwgIlwiRW1wXCJcImxveWVlXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UXVvdGVPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5xdW90ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogcmVtb3ZpbmcgY2hhcmFjdGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZSgiRW1wbG8meWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxveWVlICZGb28iLCAnJicsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxveWVlJiIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZShzdHJpbmcsIGNoYXJUb1JlbW92ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlQ2hhckFycmF5KCJFbXBsbyZ5ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG8meWVlJiIsICcmJywgIkVtcGxveWVlJiIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG95ZWUmIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoIiZFbXBsb3llZSIsICcmJywgIkVtcGxveWVlIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheShTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMucmVtb3ZlRmlyc3RPY2N1cnJlbmNlKHN0cmluZy50b0NoYXJBcnJheSgpLCBjaGFyVG9SZW1vdmUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoIkVtcGxvJnllZSIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcigiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCJFbXBsb3llZSYiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKHN0cmluZywgY2hhclRvUmVtb3ZlLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoIkVtcGxvJnllZSIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSYiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVpbGRlcigiRW1wbG8meWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlICZGb28iLCAnJicsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlJiIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXMoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXMoIkVtcGxveWVlIEZyZWQiLCAnICcsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlcygiIEVtcGxveWVlICIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXMoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlcygiIEVtcCBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhzdHJpbmcsIGNoYXJUb1JlbW92ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5KCIgRW1wbG95ZWUgIiwgJyAnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5KCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXkoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKHN0cmluZy50b0NoYXJBcnJheSgpLCBjaGFyVG9SZW1vdmUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uV3JpdGVyKCJFbXBsb3llZSBGcmVkIiwgJyAnLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigiIEVtcGxveWVlICIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25Xcml0ZXIoIiBFbXAgbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uV3JpdGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoIiBFbXBsb3llZSAiLCAnICcsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVmZmVyKCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWlsZGVyKCIgRW1wbG95ZWUgIiwgJyAnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWlsZGVyKCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxXaGl0ZXNwYWNlKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2UoIkVtcGxveWVlIEZyZWRcdCIsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlKCJcdEVtcGxveWVlXG4iLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlKCIgRW1wXHRsb3llZSBcbiBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VDaGFyQXJyYXkoIkVtcGxveWVlIEZyZWRcdCIsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCJcdEVtcGxveWVlXG4iLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCIgRW1wXHRsb3llZSBcbiBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZUNoYXJBcnJheShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHN0cmluZy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbFdoaXRlc3BhY2VPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25Xcml0ZXIoIkVtcGxveWVlIEZyZWRcdCIsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25Xcml0ZXIoIlx0RW1wbG95ZWVcbiIsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPbldyaXRlcigiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uV3JpdGVyKCIgRW1wXHRsb3llZSBcbiBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uV3JpdGVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgRnJlZFx0IiwgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiXHRFbXBsb3llZVxuIiwgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoIiBFbXBcdGxveWVlIFxuIEZvbyIsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlIEZyZWRcdCIsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCJcdEVtcGxveWVlXG4iLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCIgRW1wXHRsb3llZSBcbiBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2VPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcHJlc3NXaGl0ZXNwYWNlKCkgewotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZSgiRW1wbG95ZWUgICAgICBGcmVkXHQiLCAiRW1wbG95ZWUgRnJlZCAiKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2UoIlx0RW1wbG95ZWUgIFxuIiwgIiBFbXBsb3llZSAiKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2UoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2UoIiBFbXBcdGxveWVlIFxuIEZvbyAiLCAiIEVtcCBsb3llZSBGb28gIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5jb21wcmVzc1doaXRlc3BhY2Uoc3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzV2hpdGVzcGFjZUNoYXJBcnJheSgpIHsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VDaGFyQXJyYXkoIkVtcGxveWVlICAgICAgRnJlZFx0IiwgIkVtcGxveWVlIEZyZWQgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlQ2hhckFycmF5KCJcdEVtcGxveWVlICBcbiIsICIgRW1wbG95ZWUgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlQ2hhckFycmF5KCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlQ2hhckFycmF5KCIgRW1wXHRsb3llZSBcbiBGb28gIiwgIiBFbXAgbG95ZWUgRm9vICIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VDaGFyQXJyYXkoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMuY29tcHJlc3NXaGl0ZXNwYWNlKHN0cmluZy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzV2hpdGVzcGFjZU9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uV3JpdGVyKCJFbXBsb3llZSAgICAgIEZyZWRcdCIsICJFbXBsb3llZSBGcmVkICIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uV3JpdGVyKCJcdEVtcGxveWVlICBcbiIsICIgRW1wbG95ZWUgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25Xcml0ZXIoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPbldyaXRlcigiIEVtcFx0bG95ZWUgXG4gRm9vICIsICIgRW1wIGxveWVlIEZvbyAiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25Xcml0ZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbXByZXNzV2hpdGVzcGFjZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSAgICAgIEZyZWRcdCIsICJFbXBsb3llZSBGcmVkICIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCJcdEVtcGxveWVlICBcbiIsICIgRW1wbG95ZWUgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiIEVtcFx0bG95ZWUgXG4gRm9vICIsICIgRW1wIGxveWVlIEZvbyAiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29tcHJlc3NXaGl0ZXNwYWNlT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlICAgICAgRnJlZFx0IiwgIkVtcGxveWVlIEZyZWQgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCJcdEVtcGxveWVlICBcbiIsICIgRW1wbG95ZWUgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCIgRW1wXHRsb3llZSBcbiBGb28gIiwgIiBFbXAgbG95ZWUgRm9vICIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jb21wcmVzc1doaXRlc3BhY2VPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbW1vbiBwcmVmaXggKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbW1vblByZWZpeExlbmd0aCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vWlpaIiwgImZvb0JCQiIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vIiwgImZvb0JCQiIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vWlpaIiwgImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tbW9uUHJlZml4TGVuZ3RoTWF4KCkgewotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb29aWloiLCAiZm9vQkJCIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb28iLCAiZm9vQkJCIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb29aWloiLCAiZm9vIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb28iLCAiZm9vIiwgMikpOwotCX0KLQotCS8vICoqKioqKioqKiogY2FwaXRhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIkEiLCBuZXcgY2hhcltdIHsgJ2EnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIlx1MDBDOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBFOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheShTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy5jYXBpdGFsaXplKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplU3RyaW5nKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIk9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCJPcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiQSIsICJhIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiXHUwMEM5Y29sZSIsICJcdTAwRTljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZyhTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy5jYXBpdGFsaXplKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIkEiLCBuZXcgY2hhcltdIHsgJ2EnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiXHUwMEM5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEU5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJBIiwgbmV3IGNoYXJbXSB7ICdhJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJcdTAwQzljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwRTknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIkEiLCAiYSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiXHUwMEM5Y29sZSIsICJcdTAwRTljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJPcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiT3JhY2xlIiwgIm9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiIiwgIiIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIkEiLCAiYSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIlx1MDBDOWNvbGUiLCAiXHUwMEU5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiQSIsIG5ldyBjaGFyW10geyAnYScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJcdTAwQzljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwRTknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPblN0cmluZ1dyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIk9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIk9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIkEiLCAiYSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiXHUwMEM5Y29sZSIsICJcdTAwRTljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5hcGl0YWxpemVDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoImEiLCBuZXcgY2hhcltdIHsgJ0EnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgiXHUwMEU5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEM5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVTdHJpbmcoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJvcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJhIiwgIkEiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZyhTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bmNhcGl0YWxpemUoc3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJhIiwgbmV3IGNoYXJbXSB7ICdBJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiXHUwMEU5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEM5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJhIiwgbmV3IGNoYXJbXSB7ICdBJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIlx1MDBFOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBDOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIm9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiYSIsICJBIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJvcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJhIiwgIkEiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiYSIsIG5ldyBjaGFyW10geyAnQScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIlx1MDBFOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBDOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIm9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiYSIsICJBIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogI3RvU3RyaW5nKCkgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEJ1aWxkVG9TdHJpbmdDbGFzc05hbWVfYW5vbnltb3VzKCkgewotCQlPYmplY3QgbyA9IG5ldyBPYmplY3QoKXsvKmFub255bW91cyBzdWJjbGFzcyBvZiBPYmplY3QqL307Ci0JCWFzc2VydEVxdWFscygiT2JqZWN0IiwgU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0NsYXNzTmFtZShvLmdldENsYXNzKCkpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzRW1wdHlTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgoU3RyaW5nKSBudWxsKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgiIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIiAgICAgICIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KCIgICAgICBcdFx0ICAgIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIiAgICAgIFx0XHQgICAiICsgU3RyaW5nVG9vbHMuQ1IpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KChjaGFyW10pIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCIiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCIgICAgICBcdFx0ICAgIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgiICAgICAgIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgiICAgICAgXHRcdCAgICIgKyBTdHJpbmdUb29scy5DUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzRW1wdHlDaGFyQXJyYXkoU3RyaW5nIHN0cmluZykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoc3RyaW5nLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ3NBcmVFcXVhbFN0cmluZ1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoKFN0cmluZykgbnVsbCwgKFN0cmluZykgbnVsbCkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwobnVsbCwgImFzZGYiKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgiYXNkZiIsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoImFzZGYiLCAiYXNkZiIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKCJhc2RmIiwgIkFTREYiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdzQXJlRXF1YWxDaGFyQXJyYXlDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKChjaGFyW10pIG51bGwsIChjaGFyW10pIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKChjaGFyW10pIG51bGwsICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgiYXNkZiIudG9DaGFyQXJyYXkoKSwgKGNoYXJbXSkgbnVsbCkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGYiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiQVNERiIudG9DaGFyQXJyYXkoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZVN0cmluZ1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKChTdHJpbmcpIG51bGwsIChTdHJpbmcpIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZShudWxsLCAiYXNkZiIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGYiKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIsICJBU0RGIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoKGNoYXJbXSkgbnVsbCwgKGNoYXJbXSkgbnVsbCkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKChjaGFyW10pIG51bGwsICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksIChjaGFyW10pIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYXNkZiIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJBU0RGIi50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlU3RyaW5nU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFTIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgIiIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJBIikpOwotCi0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImJzZGYiKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImciKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGciKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGZnIikpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJhc2RmZ2dnZ2dnIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZUNoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhUyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJBIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJBU0RGIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJic2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiZyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGciLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhc2RmZyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGZnZ2dnZ2ciLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdhJywgJ2EnKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgnYScsICdBJykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ0EnLCAnYScpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdBJywgJ0EnKSk7Ci0JCQotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdhJywgJ2InKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ0EnLCAnYicpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNVcHBlcmNhc2UoKSB7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNVcHBlcmNhc2UoIkZPTyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzVXBwZXJjYXNlKCJGT08yIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNVcHBlcmNhc2UoIkYgTyBPIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzVXBwZXJjYXNlKCJGb28iKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNVcHBlcmNhc2UoIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc1VwcGVyY2FzZShTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzVXBwZXJjYXNlKHMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc1VwcGVyY2FzZShzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzVXBwZXJjYXNlKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzVXBwZXJjYXNlKHMpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNVcHBlcmNhc2Uocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzTG93ZXJjYXNlKCkgewotCQl0aGlzLnZlcmlmeVN0cmluZ0lzTG93ZXJjYXNlKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0xvd2VyY2FzZSgiZm9vMiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzTG93ZXJjYXNlKCJmIG8gbyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0xvd2VyY2FzZSgiRm9vIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzTG93ZXJjYXNlKCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNMb3dlcmNhc2UoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0xvd2VyY2FzZShzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNMb3dlcmNhc2Uocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc0xvd2VyY2FzZShTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0xvd2VyY2FzZShzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzTG93ZXJjYXNlKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCS8vICoqKioqKioqKiogY29udmVydCBjYW1lbC1jYXNlIHRvIGFsbC1jYXBzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCkgewotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJURVNUIikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRFU1RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRFU1RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUX1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3RUIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUIiwgInRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1QiLCAiVEVTVCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVF9URVNUIiwgInRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUIiwgInRlc3RURVNUVGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVF9URVNUX1RFU1QiLCAiVGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUX1RFU1RfVEVTVF9UIiwgIlRlc3RURVNUVGVzdFQiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVCIsICJ0ZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUIiwgIlRFU1QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVCIsICJ0ZXN0VGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1RfVEVTVCIsICJ0ZXN0VEVTVFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUIiwgIlRlc3RURVNUVGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUX1RFU1RfVCIsICJUZXN0VEVTVFRlc3RUIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVCIsICJ0ZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVCIsICJURVNUIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUIiwgInRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUX1RFU1QiLCAidGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUX1RFU1QiLCAiVGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUX1RFU1RfVCIsICJUZXN0VEVTVFRlc3RUIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGgoKSB7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3QiLCA0NCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0IiwgNCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFUyIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3QiLCAzKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRFU1QiLCA1KSk7Ci0JCWFzc2VydEVxdWFscygiVEUiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJURVNUIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RUZXN0IiwgOSkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA4KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9UIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA2KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF8iLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VGVzdCIsIDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRlc3QiLCA5KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRlc3QiLCAxMTAwKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUXyIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RURVNUVGVzdCIsIDEwKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3QiLCAxNCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUX1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3RUIiwgMTYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1RfVEVTVF8iLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3RUIiwgMTUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVCIsICJ0ZXN0IiwgNDQpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVCIsICJ0ZXN0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVMiLCAidGVzdCIsIDMpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVCIsICJURVNUIiwgNSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURSIsICJURVNUIiwgMik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1QiLCAidGVzdFRlc3QiLCA5KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTIiwgInRlc3RUZXN0IiwgOCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1QiLCAidGVzdFRlc3QiLCA2KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfIiwgInRlc3RUZXN0IiwgNSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUIiwgInRlc3RUZXN0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiLCA5KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIsIDExMDApOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9URVNUXyIsICJ0ZXN0VEVTVFRlc3QiLCAxMCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1RfVEVTVCIsICJUZXN0VEVTVFRlc3QiLCAxNCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1RfVEVTVF9UIiwgIlRlc3RURVNUVGVzdFQiLCAxNik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1RfVEVTVF8iLCAiVGVzdFRFU1RUZXN0VCIsIDE1KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgaW50IG1heCkgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCBtYXgsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUIiwgInRlc3QiLCA0NCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUIiwgInRlc3QiLCA0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFUyIsICJ0ZXN0IiwgMyk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUIiwgIlRFU1QiLCA1KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFIiwgIlRFU1QiLCAyKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVCIsICJ0ZXN0VGVzdCIsIDkpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVMiLCAidGVzdFRlc3QiLCA4KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVCIsICJ0ZXN0VGVzdCIsIDYpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF8iLCAidGVzdFRlc3QiLCA1KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1QiLCAidGVzdFRlc3QiLCA0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIsIDkpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0IiwgMTEwMCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1RfIiwgInRlc3RURVNUVGVzdCIsIDEwKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUIiwgIlRlc3RURVNUVGVzdCIsIDE0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUX1QiLCAiVGVzdFRFU1RUZXN0VCIsIDE2KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUXyIsICJUZXN0VEVTVFRlc3RUIiwgMTUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbWF4KSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKHN0cmluZywgbWF4LCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0IHVuZGVyc2NvcmVzIHRvIGFsbC1jYXBzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF8iLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9fX18iLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRlU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9fX1RFU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9URVNUX1RFU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX1RFU1RfVEVTVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX1RFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX19URVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVF9URVNUX1QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9fVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VMb3dlcmNhc2UoKSB7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfX19fIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfX190ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfdGVzdF90ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF90ZXN0X3Rlc3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl90ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJURVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAiVEVTVF8iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJURVNUX19fXyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0IiwgIlRFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgIlRlU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3QiLCAiVEVTVF9URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0IiwgIlRFU1RfX19URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0IiwgIlRFU1RfVEVTVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdCIsICJURVNUX1RFU1RfVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3QiLCAiVEVTVF9URVNUX1RFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0VCIsICJfVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl9fVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIl9URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0VCIsICJfX1RFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlckxvd2VyY2FzZSgpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgInRlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJ0ZXN0XyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgInRlc3RfX19fIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3QiLCAidGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAidGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdCIsICJ0ZXN0X3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3QiLCAidGVzdF9fX3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3QiLCAidGVzdF90ZXN0IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0IiwgInRlc3RfdGVzdF90ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdCIsICJ0ZXN0X3Rlc3RfdGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl90ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAiX190ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAiX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihzdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJURVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAiVEVTVF8iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJURVNUX19fXyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0IiwgIlRFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgIlRlU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3QiLCAiVEVTVF9URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0IiwgIlRFU1RfX19URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0IiwgIlRFU1RfVEVTVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdCIsICJURVNUX1RFU1RfVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3QiLCAiVEVTVF9URVNUX1RFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0VCIsICJfVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl9fVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgIl9URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3RUZXN0VCIsICJfX1RFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlckxvd2VyY2FzZSgpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgInRlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJ0ZXN0XyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgInRlc3RfX19fIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3QiLCAidGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAidGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdCIsICJ0ZXN0X3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3QiLCAidGVzdF9fX3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3QiLCAidGVzdF90ZXN0IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0IiwgInRlc3RfdGVzdF90ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdCIsICJ0ZXN0X3Rlc3RfdGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl90ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdFQiLCAiX190ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdFQiLCAiX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKHN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBkZWxpbWl0aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc1F1b3RlZCgpIHsKLQkJdGhpcy5kZW55U3RyaW5nSXNRdW90ZWQoImZvbyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzUXVvdGVkKCJcImZvb1wiIik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNRdW90ZWQoIiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzUXVvdGVkKCJcIlwiIik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNRdW90ZWQoIlwiIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUXVvdGVkKCIgIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUXVvdGVkKCInJyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1F1b3RlZCgiJ2ZvbyciKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNRdW90ZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc1F1b3RlZChzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNRdW90ZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc1F1b3RlZChTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc1F1b3RlZChzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUXVvdGVkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc1BhcmVudGhldGljYWwoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCIoZm9vKSIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCIoKSIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiKCIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1BhcmVudGhldGljYWwoIiAiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCInJyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1BhcmVudGhldGljYWwoIidmb28nIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzUGFyZW50aGV0aWNhbChTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUGFyZW50aGV0aWNhbChzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNQYXJlbnRoZXRpY2FsKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNQYXJlbnRoZXRpY2FsKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUGFyZW50aGV0aWNhbChzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUGFyZW50aGV0aWNhbChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNCcmFja2V0ZWQoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2tldGVkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0JyYWNrZXRlZCgiW2Zvb10iKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNrZXRlZCgiIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNCcmFja2V0ZWQoIltdIik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFja2V0ZWQoIlsiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFja2V0ZWQoIiAiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFja2V0ZWQoIicnIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2tldGVkKCInZm9vJyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc0JyYWNrZXRlZChTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2tldGVkKHMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNrZXRlZChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzQnJhY2tldGVkKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2tldGVkKHMpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFja2V0ZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzQnJhY2VkKCkgewotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNlZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNCcmFjZWQoIntmb299Iik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFjZWQoIiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzQnJhY2VkKCJ7fSIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2VkKCJ7Iik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2VkKCIgIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2VkKCInJyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNlZCgiJ2ZvbyciKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNCcmFjZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNlZChzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFjZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc0JyYWNlZChTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNlZChzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2VkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc0NoZXZyb25lZCgpIHsKLQkJdGhpcy5kZW55U3RyaW5nSXNDaGV2cm9uZWQoImZvbyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzQ2hldnJvbmVkKCI8Zm9vPiIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzQ2hldnJvbmVkKCIiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0NoZXZyb25lZCgiPD4iKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0NoZXZyb25lZCgieyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0NoZXZyb25lZCgiICIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0NoZXZyb25lZCgiJyciKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNDaGV2cm9uZWQoIidmb28nIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzQ2hldnJvbmVkKFN0cmluZyBzKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNDaGV2cm9uZWQocykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQ2hldnJvbmVkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNDaGV2cm9uZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNDaGV2cm9uZWQocykpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0NoZXZyb25lZChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNEZWxpbWl0ZWQoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCJmb28iLCAnPycpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkKCI/Zm9vPyIsICc/Jyk7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIiIsICc/Jyk7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQoIlwiXCIiLCAnIicpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkKCI/eHg/IiwgJz8nKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIj94eF0iLCAnPycpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCJcIiIsICciJyk7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCIgIiwgJyAnKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIicnIiwgJyInKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIidmb28nIiwgJz8nKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQoU3RyaW5nIHMsIGNoYXIgYykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMsIGMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLnRvQ2hhckFycmF5KCksIGMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzRGVsaW1pdGVkKFN0cmluZyBzLCBjaGFyIGMpIHsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNEZWxpbWl0ZWQocywgYykpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLnRvQ2hhckFycmF5KCksIGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNEZWxpbWl0ZWQyKCkgewotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoImZvbyIsICdbJywgJ10nKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0RlbGltaXRlZDIoIntmb299IiwgJ3snLCAnfScpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkMigiIiwgJ1snLCAnXScpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkMigiW10iLCAnWycsICddJyk7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQyKCJbeHhdIiwgJ1snLCAnXScpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoIj94eF0iLCAnWycsICddJyk7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQyKCJcIiIsICdbJywgJ10nKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQyKCIgIiwgJ1snLCAnXScpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoIicnIiwgJ1snLCAnXScpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoIidmb28nIiwgJ1snLCAnXScpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc0RlbGltaXRlZDIoU3RyaW5nIHMsIGNoYXIgc3RhcnQsIGNoYXIgZW5kKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNEZWxpbWl0ZWQocywgc3RhcnQsIGVuZCkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMudG9DaGFyQXJyYXkoKSwgc3RhcnQsIGVuZCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNEZWxpbWl0ZWQyKFN0cmluZyBzLCBjaGFyIHN0YXJ0LCBjaGFyIGVuZCkgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLCBzdGFydCwgZW5kKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMudG9DaGFyQXJyYXkoKSwgc3RhcnQsIGVuZCkpOwotCX0KLQotCS8vICoqKioqKioqKiogdW5kZWxpbWl0aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXQoKSB7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCJcImZvb1wiIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiXCJcIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIidmb28nIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiXCJmb1wiXCJvXCIiLCAiZm9cIm8iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIlwiZm9vXCJcIlwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCJcIlwiXCJmb29cIiIsICJcImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiW2Zvb10iLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCJcIlwiXCIiLCAiXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIlwiZm9vXCJiYXJcIiIsICJmb29cIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiXCJmb29cIlwiIiwgImZvb1wiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdChTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMudW5kZWxpbWl0KHMpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bmRlbGltaXQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuZGVsaW1pdEludCgpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRJbnQoIlwiZm9vXCIiLCAyLCAibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdEludCgiXCJcImZvb1wiXCIiLCAyLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0SW50KCInZm9vJyIsIDIsICJvIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdEludChTdHJpbmcgcywgaW50IGNvdW50LCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bmRlbGltaXQocywgY291bnQpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bmRlbGltaXQocy50b0NoYXJBcnJheSgpLCBjb3VudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRJbnRFeGNlcHRpb24oKSB7Ci0JCXRoaXMuZGVueVVuZGVsaW1pdEludCgiXCJcIiIsIDIpOwotCQl0aGlzLmRlbnlVbmRlbGltaXRJbnQoIidvJyIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55VW5kZWxpbWl0SW50KFN0cmluZyBzLCBpbnQgY291bnQpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nIGJvZ3VzID0gU3RyaW5nVG9vbHMudW5kZWxpbWl0KHMsIGNvdW50KTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiAiICsgYm9ndXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJY2hhcltdIGJvZ3VzID0gU3RyaW5nVG9vbHMudW5kZWxpbWl0KHMudG9DaGFyQXJyYXkoKSwgY291bnQpOwotCQkJZmFpbCgiaW52YWxpZCBzdHJpbmc6ICIgKyBuZXcgU3RyaW5nKGJvZ3VzKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiXCJmb29cIiIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiXCJcIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiJ2ZvbyciLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiZm9cIlwib1wiIiwgImZvXCJvIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiZm9vXCJcIlwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiXCJcImZvb1wiIiwgIlwiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIltmb29dIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyKCJcIlwiXCIiLCAiXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiXCJmb29cImJhclwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiZm9vXCJcIiIsICJmb29cIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmRlbGltaXRPbldyaXRlcihTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocy50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIlwiZm9vXCIiLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIlwiXCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIidmb28nIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcImZvXCJcIm9cIiIsICJmb1wibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcImZvb1wiXCJcIiIsICJmb29cIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcIlwiXCJmb29cIiIsICJcImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJbZm9vXSIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlcigiXCJcIlwiIiwgIlwiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIlwiZm9vXCJiYXJcIiIsICJmb29cIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcImZvb1wiXCIiLCAiZm9vXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIlwiZm9vXCIiLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJcIlwiIiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiJ2ZvbyciLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJcImZvXCJcIm9cIiIsICJmb1wibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiXCJmb29cIlwiXCIiLCAiZm9vXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIlwiXCJcImZvb1wiIiwgIlwiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJbZm9vXSIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIlwiXCJcIiIsICJcIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiXCJmb29cImJhclwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJcImZvb1wiXCIiLCAiZm9vXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKFN0cmluZyBzLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMudG9DaGFyQXJyYXkoKSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRPbldyaXRlckNvdW50KCkgewotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyQ291bnQoIlwiZm9vXCIiLCAyLCAibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyQ291bnQoIlwiXCJcIlwiIiwgMiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyQ291bnQoIlhYZm9vWFgiLCAyLCAiZm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyQ291bnQoU3RyaW5nIHMsIGludCBjb3VudCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIGNvdW50LCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMudG9DaGFyQXJyYXkoKSwgY291bnQsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRPblN0cmluZ0J1ZmZlckNvdW50KCkgewotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyQ291bnQoIlwiZm9vXCIiLCAyLCAibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyQ291bnQoIlwiXCJcIlwiIiwgMiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyQ291bnQoIlhYZm9vWFgiLCAyLCAiZm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyQ291bnQoU3RyaW5nIHMsIGludCBjb3VudCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocywgY291bnQsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocy50b0NoYXJBcnJheSgpLCBjb3VudCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRPblN0cmluZ0J1aWxkZXJDb3VudCgpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXJDb3VudCgiXCJmb29cIiIsIDIsICJvIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyQ291bnQoIlwiXCJcIlwiIiwgMiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlckNvdW50KCJYWGZvb1hYIiwgMiwgImZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXJDb3VudChTdHJpbmcgcywgaW50IGNvdW50LCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIGNvdW50LCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy51bmRlbGltaXRPbihzLnRvQ2hhckFycmF5KCksIGNvdW50LCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0aW5nIHRvIEphdmEgc3RyaW5nIGxpdGVyYWwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCJcIlwiIiwgIlwiXFxcIlxcXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCInZm9vJyIsICJcIidmb28nXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiZm9vXGJiYXIiLCAiXCJmb29cXGJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCJmb29cblx0YmFyIiwgIlwiZm9vXFxuXFx0YmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiZm9vXCJiYXIiLCAiXCJmb29cXFwiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiZm9vXFxiYXIiLCAiXCJmb29cXFxcYmFyXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKHMpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVmZmVyKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoIlwiXCIiLCAiXCJcXFwiXFxcIlwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigiJ2ZvbyciLCAiXCInZm9vJ1wiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigiZm9vXGJiYXIiLCAiXCJmb29cXGJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoImZvb1xuXHRiYXIiLCAiXCJmb29cXG5cXHRiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoImZvb1wiYmFyIiwgIlwiZm9vXFxcImJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigiZm9vXFxiYXIiLCAiXCJmb29cXFxcYmFyXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcihTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24ocy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCJcIlwiIiwgIlwiXFxcIlxcXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCInZm9vJyIsICJcIidmb28nXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiZm9vXGJiYXIiLCAiXCJmb29cXGJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCJmb29cblx0YmFyIiwgIlwiZm9vXFxuXFx0YmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiZm9vXCJiYXIiLCAiXCJmb29cXFwiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiZm9vXFxiYXIiLCAiXCJmb29cXFxcYmFyXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKHMudG9DaGFyQXJyYXkoKSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25Xcml0ZXIoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiXCJcIiIsICJcIlxcXCJcXFwiXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCInZm9vJyIsICJcIidmb28nXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCJmb29cYmJhciIsICJcImZvb1xcYmJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiZm9vXG5cdGJhciIsICJcImZvb1xcblxcdGJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiZm9vXCJiYXIiLCAiXCJmb29cXFwiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCJmb29cXGJhciIsICJcImZvb1xcXFxiYXJcIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKFN0cmluZyBzLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24ocy50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZEJvb2xlYW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGY4NjU3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEJvb2xlYW47Ci0KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCXByaXZhdGUgdm9sYXRpbGUgU3luY2hyb25pemVkQm9vbGVhbiBzYjsKLQl2b2xhdGlsZSBib29sZWFuIHRpbWVvdXRPY2N1cnJlZDsKLQl2b2xhdGlsZSBsb25nIHN0YXJ0VGltZTsKLQl2b2xhdGlsZSBsb25nIGVuZFRpbWU7Ci0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zYiA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKCk7Ci0JCXRoaXMudGltZW91dE9jY3VycmVkID0gZmFsc2U7Ci0JCXRoaXMuc3RhcnRUaW1lID0gMDsKLQkJdGhpcy5lbmRUaW1lID0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmlzKGZhbHNlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTm90KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc05vdCh0cnVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmlzVHJ1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldFZhbHVlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc1RydWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc0ZhbHNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRWYWx1ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNUcnVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmlzRmFsc2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZsaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmZsaXAoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZmxpcCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Tm90VHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldE5vdCh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc1RydWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc0ZhbHNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROb3RGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldE5vdChmYWxzZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmlzVHJ1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc0ZhbHNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldEZhbHNlKCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuaXNUcnVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldFRydWUoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNUcnVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmlzRmFsc2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE11dGV4VGhpcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRTYW1lKHRoaXMuc2IsIHRoaXMuc2IuZ2V0TXV0ZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE11dGV4T2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtdXRleCA9IG5ldyBPYmplY3QoKTsKLQkJU3luY2hyb25pemVkQm9vbGVhbiBzeW5jQm9vbCA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKG11dGV4KTsKLQkJYXNzZXJ0U2FtZShtdXRleCwgc3luY0Jvb2wuZ2V0TXV0ZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldFZhbHVlKGZhbHNlKTsKLQkJU3luY2hyb25pemVkQm9vbGVhbiBzYjIgPSBuZXcgU3luY2hyb25pemVkQm9vbGVhbihmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnNiLCBzYjIpOwotCi0JCXRoaXMuc2Iuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZXF1YWxzKHNiMikpOwotCi0JCXNiMi5zZXRWYWx1ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc2IsIHNiMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQl0aGlzLnNiLnNldFZhbHVlKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2IuaGFzaENvZGUoKSk7Ci0KLQkJdGhpcy5zYi5zZXRWYWx1ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuc2IuaGFzaENvZGUoKSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCB0MSBzZXRzIHRoZSB2YWx1ZSB0byB0cnVlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VW50aWxUcnVlKDApOyAgLy8gMCA9IGluZGVmaW5pdGUgd2FpdAotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0cnVlIGJ5IHQyCi0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA+IFRJQ0spOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgdGltZSBvdXQgd2FpdGluZyBmb3IgdDEgdG8gc2V0IHRoZSB2YWx1ZSB0byB0cnVlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbFRydWVUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsVHJ1ZShUSUNLKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgd2lsbCBldmVudHVhbGx5IGJlIHNldCB0byB0cnVlIGJ5IHQxCi0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA8IFRIUkVFX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFVudGlsVHJ1ZShsb25nIHQyVGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVRocmVhZHModGhpcy5idWlsZFNldFRydWVDb21tYW5kKCksIHRoaXMuYnVpbGRXYWl0VW50aWxUcnVlQ29tbWFuZCh0MlRpbWVvdXQpKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIHQxIHNldHMgdGhlIHZhbHVlIHRvIGZhbHNlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1NldEZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0RmFsc2UoMCk7ICAvLyAwID0gaW5kZWZpbml0ZSB3YWl0Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIGZhbHNlIGJ5IHQyCi0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPiBUSUNLKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHRpbWUgb3V0IHdhaXRpbmcgZm9yIHQxIHRvIHNldCB0aGUgdmFsdWUgdG8gZmFsc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvU2V0RmFsc2VUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0RmFsc2UoVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gdHJ1ZSBieSB0MQotCQlhc3NlcnRUcnVlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPCBUSFJFRV9USUNLUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdhaXRUb1NldEZhbHNlKGxvbmcgdDJUaW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlVGhyZWFkcyh0aGlzLmJ1aWxkU2V0VHJ1ZUNvbW1hbmQoKSwgdGhpcy5idWlsZFdhaXRUb1NldEZhbHNlQ29tbWFuZCh0MlRpbWVvdXQpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZVRocmVhZHMoQ29tbWFuZCB0MUNvbW1hbmQsIENvbW1hbmQgdDJDb21tYW5kKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRGYWxzZSgpOwotCQlSdW5uYWJsZSByMSA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0MUNvbW1hbmQsIHRoaXMuc2IsIFRXT19USUNLUyk7Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHQyQ29tbWFuZCwgdGhpcy5zYiwgMCk7Ci0JCVRocmVhZCB0MSA9IHRoaXMuYnVpbGRUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJdDEuam9pbigpOwotCQl0Mi5qb2luKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkU2V0VHJ1ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkQm9vbGVhbiBzeW5jQm9vbCkgewotCQkJCXN5bmNCb29sLnNldFRydWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VW50aWxUcnVlQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRCb29sZWFuIHN5bmNCb29sKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9ICEgc3luY0Jvb2wud2FpdFVudGlsVHJ1ZSh0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvU2V0RmFsc2VDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkQm9vbGVhblRlc3RzLnRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3luY2hyb25pemVkQm9vbGVhblRlc3RzLnRoaXMudGltZW91dE9jY3VycmVkID0gICEgc3luY0Jvb2wud2FpdFRvU2V0RmFsc2UodGltZW91dCk7Ci0JCQkJU3luY2hyb25pemVkQm9vbGVhblRlc3RzLnRoaXMuZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wsIGZpbmFsIGxvbmcgZGVsYXkpIHsKLQkJcmV0dXJuIG5ldyBUZXN0UnVubmFibGUoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bl8oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWlmIChkZWxheSAhPSAwKSB7Ci0JCQkJCVRocmVhZC5zbGVlcChkZWxheSk7Ci0JCQkJfQotCQkJCWNvbW1hbmQuZXhlY3V0ZShzeW5jQm9vbCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JbG9uZyBjYWxjdWxhdGVFbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21tYW5kIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBDb21tYW5kIHsKLQkJdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkSW50VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkSW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlOWIxYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZEludFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEludDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkSW50VGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCXByaXZhdGUgdm9sYXRpbGUgU3luY2hyb25pemVkSW50IHNpOwotCXZvbGF0aWxlIGJvb2xlYW4gdGltZW91dE9jY3VycmVkOwotCXZvbGF0aWxlIGludCB2YWx1ZSA9IDc7Ci0Jdm9sYXRpbGUgbG9uZyBzdGFydFRpbWU7Ci0Jdm9sYXRpbGUgbG9uZyBlbmRUaW1lOwotCXZvbGF0aWxlIGludCBzSW50VmFsdWU7Ci0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRJbnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnNpID0gbmV3IFN5bmNocm9uaXplZEludCgpOwotCQl0aGlzLnRpbWVvdXRPY2N1cnJlZCA9IGZhbHNlOwotCQl0aGlzLnN0YXJ0VGltZSA9IDA7Ci0JCXRoaXMuZW5kVGltZSA9IDA7Ci0JCXRoaXMuc0ludFZhbHVlID0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc0ludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2kuZXF1YWxzKDApKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmVxdWFscyg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vdEVxdWFsc0ludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2kubm90RXF1YWxzKDcpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLm5vdEVxdWFscygwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzWmVybygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNaZXJvKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzWmVybygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOb3RaZXJvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNOb3RaZXJvKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNOb3RaZXJvKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0dyZWF0ZXJUaGFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0dyZWF0ZXJUaGFuKC0xKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbigwKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbigxKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0dyZWF0ZXJUaGFuKC0xKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbig3KSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbig4KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzR3JlYXRlclRoYW5PckVxdWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0dyZWF0ZXJUaGFuT3JFcXVhbCgtMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbk9yRXF1YWwoMCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzR3JlYXRlclRoYW5PckVxdWFsKDEpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzR3JlYXRlclRoYW5PckVxdWFsKC0xKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0dyZWF0ZXJUaGFuT3JFcXVhbCg3KSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbk9yRXF1YWwoOCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0xlc3NUaGFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNMZXNzVGhhbigtMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTGVzc1RoYW4oMCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNMZXNzVGhhbigxKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNMZXNzVGhhbigtMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTGVzc1RoYW4oNykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNMZXNzVGhhbig4KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTGVzc1RoYW5PckVxdWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNMZXNzVGhhbk9yRXF1YWwoLTEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTGVzc1RoYW5PckVxdWFsKDApKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTGVzc1RoYW5PckVxdWFsKDEpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0xlc3NUaGFuT3JFcXVhbCgtMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNMZXNzVGhhbk9yRXF1YWwoNykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNMZXNzVGhhbk9yRXF1YWwoOCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1Bvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNQb3NpdGl2ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzUG9zaXRpdmUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUoLTMpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzUG9zaXRpdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTm90UG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTm90UG9zaXRpdmUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNOb3RQb3NpdGl2ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSgtMyk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc05vdFBvc2l0aXZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNOZWdhdGl2ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc05lZ2F0aXZlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKC0zKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTmVnYXRpdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTm90TmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTm90TmVnYXRpdmUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc05vdE5lZ2F0aXZlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKC0zKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc05vdE5lZ2F0aXZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNpLnNldFZhbHVlKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc05vdFplcm8oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc1plcm8oKSk7Ci0KLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc05vdFplcm8oKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNaZXJvKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2kuYWJzKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUsIHRoaXMuc2kuYWJzKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSgtdGhpcy52YWx1ZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLnNpLmFicygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5uZWcoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoLXRoaXMudmFsdWUsIHRoaXMuc2kubmVnKCkpOwotCQlhc3NlcnRFcXVhbHMoLXRoaXMudmFsdWUsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUoLXRoaXMudmFsdWUpOwotCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5zaS5uZWcoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRaZXJvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2kuc2V0WmVybygpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc05vdFplcm8oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc1plcm8oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE11dGV4VGhpcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRTYW1lKHRoaXMuc2ksIHRoaXMuc2kuZ2V0TXV0ZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNpLnNldFZhbHVlKDApOwotCQlTeW5jaHJvbml6ZWRJbnQgc28yID0gbmV3IFN5bmNocm9uaXplZEludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc2ksIHNvMik7Ci0KLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5lcXVhbHMoc28yKSk7Ci0KLQkJc28yLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zaSwgc28yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLnNpLmhhc2hDb2RlKCkpOwotCi0JCXRoaXMuc2kuc2V0VmFsdWUoMCk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNpLmhhc2hDb2RlKCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgdDEgc2V0cyB0aGUgdmFsdWUgdG8gMAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxaZXJvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsWmVybygwKTsgIC8vIDAgPSBpbmRlZmluaXRlIHdhaXQKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gMCBieSB0MgotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGVhcmx5IChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPiAiICsgVElDSyArICIpOiAiICsgdGltZSwgdGltZSA+IFRJQ0spOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgdGltZSBvdXQgd2FpdGluZyBmb3IgdDEgdG8gc2V0IHRoZSB2YWx1ZSB0byAwCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbFplcm9UaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsWmVybyhUSUNLKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgd2lsbCBldmVudHVhbGx5IGJlIHNldCB0byAwIGJ5IHQxCi0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgbGF0ZSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlIDwgIiArIFRIUkVFX1RJQ0tTICsgIik6ICIgKyB0aW1lLCB0aW1lIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VW50aWxaZXJvKGxvbmcgdDJUaW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlVGhyZWFkcyh0aGlzLmJ1aWxkU2V0WmVyb0NvbW1hbmQoKSwgdGhpcy5idWlsZFdhaXRVbnRpbFplcm9Db21tYW5kKHQyVGltZW91dCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgdDEgc2V0cyB0aGUgdmFsdWUgdG8gMDsKLQkgKiB0aGVuIHQyIHdpbGwgc2V0IHRoZSB2YWx1ZSB0byA3Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1NldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0VmFsdWUoMCk7ICAvLyAwID0gaW5kZWZpbml0ZSB3YWl0Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIGFuIG9iamVjdCBieSB0MgotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNOb3RaZXJvKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgZWFybHkgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA+ICIgKyBUSUNLICsgIik6ICIgKyB0aW1lLCB0aW1lID4gVElDSyk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB0aW1lIG91dCB3YWl0aW5nIGZvciB0MSB0byBzZXQgdGhlIHZhbHVlIHRvIDAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvU2V0VmFsdWVUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0VmFsdWUoVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gemVybyBieSB0MQotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNaZXJvKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgbGF0ZSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlIDwgIiArIFRIUkVFX1RJQ0tTICsgIik6ICIgKyB0aW1lLCB0aW1lIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9TZXRWYWx1ZShsb25nIHQyVGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVRocmVhZHModGhpcy5idWlsZFNldFplcm9Db21tYW5kKCksIHRoaXMuYnVpbGRXYWl0VG9TZXRWYWx1ZUNvbW1hbmQodDJUaW1lb3V0KSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IHVudGlsIHQxIGlzIGZpbmlzaGVkICJpbml0aWFsaXppbmciIHRoZSB2YWx1ZTsKLQkgKiB0aGVuIHQyIHdpbGwgZ2V0IHRoZSBuZXdseS1pbml0aWFsaXplZCB2YWx1ZSAoNDIpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zaS5zZXRWYWx1ZSgwKTsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZEluaXRpYWxpemVWYWx1ZUNvbW1hbmQoKSwgdGhpcy5zaSwgMCk7Ci0JCS8vIGdpdmUgdDEgYSBoZWFkIHN0YXJ0Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRHZXRWYWx1ZUNvbW1hbmQoKSwgdGhpcy5zaSwgVElDSyk7Ci0JCVRocmVhZCB0MSA9IHRoaXMuYnVpbGRUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJdDEuam9pbigpOwotCQl0Mi5qb2luKCk7Ci0JCWFzc2VydEVxdWFscyg0MiwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQyLCB0aGlzLnNJbnRWYWx1ZSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBlYXJseSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlID4gIiArIFRXT19USUNLUyArICIpOiAiICsgdGltZSwgdGltZSA+IFRXT19USUNLUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUaHJlYWRzKENvbW1hbmQgdDFDb21tYW5kLCBDb21tYW5kIHQyQ29tbWFuZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHQxQ29tbWFuZCwgdGhpcy5zaSwgVFdPX1RJQ0tTKTsKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodDJDb21tYW5kLCB0aGlzLnNpLCAwKTsKLQkJVGhyZWFkIHQxID0gdGhpcy5idWlsZFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IHRoaXMuYnVpbGRUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl0MS5qb2luKCk7Ci0JCXQyLmpvaW4oKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRTZXRaZXJvQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRJbnQgc0ludCkgewotCQkJCXNJbnQuc2V0WmVybygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFdhaXRVbnRpbFplcm9Db21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEludCBzSW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3luY2hyb25pemVkSW50VGVzdHMudGhpcy50aW1lb3V0T2NjdXJyZWQgPSAhIHNJbnQud2FpdFVudGlsWmVybyh0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9TZXRWYWx1ZUNvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkSW50IHNJbnQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkSW50VGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9ICEgc0ludC53YWl0VG9TZXRWYWx1ZShTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLnZhbHVlLCB0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRJbml0aWFsaXplVmFsdWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIFN5bmNocm9uaXplZEludCBzSW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXNJbnQuZXhlY3V0ZSgKLQkJCQkJbmV3IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJCQkJCS8vIHByZXRlbmQgdG8gcGVyZm9ybSBzb21lIGxvbmcgaW5pdGlhbGl6YXRpb24gcHJvY2VzcwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCVRocmVhZC5zbGVlcCg1ICogVElDSyk7Ci0JCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJCQkJCX0KLQkJCQkJCQlzSW50LnNldFZhbHVlKDQyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkR2V0VmFsdWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEludCBzSW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3luY2hyb25pemVkSW50VGVzdHMudGhpcy5zSW50VmFsdWUgPSBzSW50LmdldFZhbHVlKCk7Ci0JCQkJU3luY2hyb25pemVkSW50VGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIENvbW1hbmQgY29tbWFuZCwgZmluYWwgU3luY2hyb25pemVkSW50IHNJbnQsIGZpbmFsIGxvbmcgc2xlZXApIHsKLQkJcmV0dXJuIG5ldyBUZXN0UnVubmFibGUoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHJ1bl8oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWlmIChzbGVlcCAhPSAwKSB7Ci0JCQkJCVRocmVhZC5zbGVlcChzbGVlcCk7Ci0JCQkJfQotCQkJCWNvbW1hbmQuZXhlY3V0ZShzSW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGxvbmcgY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVuZFRpbWUgLSB0aGlzLnN0YXJ0VGltZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tbWFuZCBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgQ29tbWFuZCB7Ci0JCXZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRJbnQgc0ludCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRPYmplY3RUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRPYmplY3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzFhY2E0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkT2JqZWN0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkT2JqZWN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRPYmplY3RUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSB2b2xhdGlsZSBTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzbzsKLQl2b2xhdGlsZSBib29sZWFuIHRpbWVvdXRPY2N1cnJlZDsKLQl2b2xhdGlsZSBPYmplY3QgdmFsdWUgPSBuZXcgT2JqZWN0KCk7Ci0Jdm9sYXRpbGUgbG9uZyBzdGFydFRpbWU7Ci0Jdm9sYXRpbGUgbG9uZyBlbmRUaW1lOwotCXZvbGF0aWxlIE9iamVjdCBzb1ZhbHVlOwotCi0KLQlwdWJsaWMgU3luY2hyb25pemVkT2JqZWN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zbyA9IG5ldyBTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PigpOwotCQl0aGlzLnRpbWVvdXRPY2N1cnJlZCA9IGZhbHNlOwotCQl0aGlzLnN0YXJ0VGltZSA9IDA7Ci0JCXRoaXMuZW5kVGltZSA9IDA7Ci0JCXRoaXMuc29WYWx1ZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc29ycygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNvLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuc28uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc28uaXNOb3ROdWxsKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc28uaXNOdWxsKCkpOwotCi0JCXRoaXMuc28uc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLnNvLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc28uaXNOb3ROdWxsKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNvLmlzTnVsbCgpKTsKLQotCQl0aGlzLnNvLnNldE51bGwoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNvLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNvLmlzTm90TnVsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNvLmlzTnVsbCgpKTsKLQotCQlhc3NlcnRTYW1lKHRoaXMuc28sIHRoaXMuc28uZ2V0TXV0ZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNvLnNldFZhbHVlKG51bGwpOwotCQlTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzbzIgPSBuZXcgU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4obnVsbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnNvLCBzbzIpOwotCi0JCXRoaXMuc28uc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc28uZXF1YWxzKHNvMikpOwotCi0JCXNvMi5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc28sIHNvMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQl0aGlzLnNvLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZS5oYXNoQ29kZSgpLCB0aGlzLnNvLmhhc2hDb2RlKCkpOwotCi0JCXRoaXMuc28uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNvLmhhc2hDb2RlKCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgdDEgc2V0cyB0aGUgdmFsdWUgdG8gbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsTnVsbCgwKTsKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gbnVsbCBieSB0MgotCQlhc3NlcnROdWxsKHRoaXMuc28uZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBlYXJseSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlID4gIiArIFRJQ0sgKyAiKTogIiArIHRpbWUsIHRpbWUgPiBUSUNLKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHRpbWUgb3V0IHdhaXRpbmcgZm9yIHQxIHRvIHNldCB0aGUgdmFsdWUgdG8gbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxOdWxsVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRVbnRpbE51bGwoVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gbnVsbCBieSB0MQotCQlhc3NlcnROdWxsKHRoaXMuc28uZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBsYXRlIChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPCAiICsgVEhSRUVfVElDS1MgKyAiKTogIiArIHRpbWUsIHRpbWUgPCBUSFJFRV9USUNLUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdhaXRVbnRpbE51bGwobG9uZyB0MlRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGVUaHJlYWRzKHRoaXMuYnVpbGRTZXROdWxsQ29tbWFuZCgpLCB0aGlzLmJ1aWxkV2FpdFVudGlsTnVsbENvbW1hbmQodDJUaW1lb3V0KSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCB0MSBzZXRzIHRoZSB2YWx1ZSB0byBudWxsOwotCSAqIHRoZW4gdDIgd2lsbCBzZXQgdGhlIHZhbHVlIHRvIGFuIG9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9TZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1NldFZhbHVlKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBhbiBvYmplY3QgYnkgdDIKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNvLmlzTm90TnVsbCgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGVhcmx5IChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPiAiICsgVElDSyArICIpOiAiICsgdGltZSwgdGltZSA+IFRJQ0spOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgdGltZSBvdXQgd2FpdGluZyBmb3IgdDEgdG8gc2V0IHRoZSB2YWx1ZSB0byBudWxsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1NldFZhbHVlVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1NldFZhbHVlKFRJQ0spOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSB3aWxsIGV2ZW50dWFsbHkgYmUgc2V0IHRvIG51bGwgYnkgdDEKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNvLmlzTnVsbCgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGxhdGUgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA8ICIgKyBUSFJFRV9USUNLUyArICIpOiAiICsgdGltZSwgdGltZSA8IFRIUkVFX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFRvU2V0VmFsdWUobG9uZyB0MlRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGVUaHJlYWRzKHRoaXMuYnVpbGRTZXROdWxsQ29tbWFuZCgpLCB0aGlzLmJ1aWxkV2FpdFRvU2V0VmFsdWVDb21tYW5kKHQyVGltZW91dCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCB1bnRpbCB0MSBpcyBmaW5pc2hlZCAiaW5pdGlhbGl6aW5nIiB0aGUgdmFsdWU7Ci0JICogdGhlbiB0MiB3aWxsIGdldCB0aGUgbmV3bHktaW5pdGlhbGl6ZWQgdmFsdWUgKCJmb28iKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc28uc2V0VmFsdWUobnVsbCk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRJbml0aWFsaXplVmFsdWVDb21tYW5kKCksIHRoaXMuc28sIDApOwotCQkvLyBnaXZlIHQxIGEgaGVhZCBzdGFydCBvZiAxMDAgbXMKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZEdldFZhbHVlQ29tbWFuZCgpLCB0aGlzLnNvLCBUSUNLKTsKLQkJVGhyZWFkIHQxID0gdGhpcy5idWlsZFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IHRoaXMuYnVpbGRUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl0MS5qb2luKCk7Ci0JCXQyLmpvaW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnNvLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc29WYWx1ZSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBlYXJseSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlID4gIiArIFRXT19USUNLUyArICIpOiAiICsgdGltZSwgdGltZSA+IFRXT19USUNLUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUaHJlYWRzKENvbW1hbmQgdDFDb21tYW5kLCBDb21tYW5kIHQyQ29tbWFuZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc28uc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHQxQ29tbWFuZCwgdGhpcy5zbywgVFdPX1RJQ0tTKTsKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodDJDb21tYW5kLCB0aGlzLnNvLCAwKTsKLQkJVGhyZWFkIHQxID0gdGhpcy5idWlsZFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IHRoaXMuYnVpbGRUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl0MS5qb2luKCk7Ci0JCXQyLmpvaW4oKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRTZXROdWxsQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzT2JqZWN0KSB7Ci0JCQkJc09iamVjdC5zZXROdWxsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFVudGlsTnVsbENvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMudGltZW91dE9jY3VycmVkID0gISBzT2JqZWN0LndhaXRVbnRpbE51bGwodGltZW91dCk7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvU2V0VmFsdWVDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9ICEgc09iamVjdC53YWl0VG9TZXRWYWx1ZShTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnZhbHVlLCB0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRJbml0aWFsaXplVmFsdWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJc09iamVjdC5leGVjdXRlKAotCQkJCQluZXcgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZCgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkJCQkJLy8gcHJldGVuZCB0byBwZXJmb3JtIHNvbWUgbG9uZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJVGhyZWFkLnNsZWVwKDUgKiBUSUNLKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJCQkJCX0KLQkJCQkJCQlzT2JqZWN0LnNldFZhbHVlKCJmb28iKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkR2V0VmFsdWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnNvVmFsdWUgPSBzT2JqZWN0LmdldFZhbHVlKCk7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIENvbW1hbmQgY29tbWFuZCwgZmluYWwgU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCwgZmluYWwgbG9uZyBzbGVlcCkgewotCQlyZXR1cm4gbmV3IFRlc3RSdW5uYWJsZSgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcnVuXygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJaWYgKHNsZWVwICE9IDApIHsKLQkJCQkJVGhyZWFkLnNsZWVwKHNsZWVwKTsKLQkJCQl9Ci0JCQkJY29tbWFuZC5leGVjdXRlKHNPYmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgbG9uZyBjYWxjdWxhdGVFbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21tYW5kIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBDb21tYW5kIHsKLQkJdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNvKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZFF1ZXVlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkUXVldWVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDczZjVlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkUXVldWVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZFF1ZXVlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzIGV4dGVuZHMgU2ltcGxlUXVldWVUZXN0cyB7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBTeW5jaHJvbml6ZWRRdWV1ZTxTdHJpbmc+IHNxOwotCXZvbGF0aWxlIGJvb2xlYW4gdGltZW91dE9jY3VycmVkOwotCXZvbGF0aWxlIGxvbmcgc3RhcnRUaW1lOwotCXZvbGF0aWxlIGxvbmcgZW5kVGltZTsKLQl2b2xhdGlsZSBPYmplY3QgZGVxdWV1ZWRPYmplY3Q7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIElURU1fMSA9IG5ldyBTdHJpbmcoKTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElURU1fMiA9IG5ldyBTdHJpbmcoKTsKLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCVF1ZXVlPFN0cmluZz4gYnVpbGRRdWV1ZSgpIHsKLQkJcmV0dXJuIG5ldyBTeW5jaHJvbml6ZWRRdWV1ZTxTdHJpbmc+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQkvLyBzeW5jaHJvbml6ZWQgcXVldWUgaXMgbm90IGNsb25lYWJsZQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3EgPSBuZXcgU3luY2hyb25pemVkUXVldWU8U3RyaW5nPigpOwotCQl0aGlzLnRpbWVvdXRPY2N1cnJlZCA9IGZhbHNlOwotCQl0aGlzLnN0YXJ0VGltZSA9IDA7Ci0JCXRoaXMuZW5kVGltZSA9IDA7Ci0JCXRoaXMuZGVxdWV1ZWRPYmplY3QgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHRlc3QgZmlyc3Qgd2l0aCBhbiB1bnN5bmNocm9uaXplZCBxdWV1ZSwKLQkgKiB0aGVuIHdpdGggYSBzeW5jaHJvbml6ZWQgcXVldWUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY3VycmVudEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUNvbmN1cnJlbnRBY2Nlc3MobmV3IFNsb3dTaW1wbGVRdWV1ZTxTdHJpbmc+KCksICJmaXJzdCIpOwotCQl0aGlzLnZlcmlmeUNvbmN1cnJlbnRBY2Nlc3MobmV3IFNsb3dTeW5jaHJvbml6ZWRRdWV1ZTxTdHJpbmc+KCksICJzZWNvbmQiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29uY3VycmVudEFjY2VzcyhTbG93UXVldWU8U3RyaW5nPiBzbG93UXVldWUsIFN0cmluZyBleHBlY3RlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNsb3dRdWV1ZS5lbnF1ZXVlKCJmaXJzdCIpOwotCQlzbG93UXVldWUuZW5xdWV1ZSgic2Vjb25kIik7Ci0KLQkJVGhyZWFkIHRocmVhZCA9IHRoaXMuYnVpbGRUaHJlYWQodGhpcy5idWlsZFJ1bm5hYmxlKHNsb3dRdWV1ZSkpOwotCQl0aHJlYWQuc3RhcnQoKTsKLQkJVGhyZWFkLnNsZWVwKFRXT19USUNLUyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzbG93UXVldWUuZGVxdWV1ZSgpKTsKLQkJdGhyZWFkLmpvaW4oKTsKLQkJYXNzZXJ0VHJ1ZShzbG93UXVldWUuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoZmluYWwgU2xvd1F1ZXVlPFN0cmluZz4gc2xvd1F1ZXVlKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2xvd1F1ZXVlLnNsb3dEZXF1ZXVlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcml2YXRlIGludGVyZmFjZSBTbG93UXVldWU8RT4gZXh0ZW5kcyBRdWV1ZTxFPiB7Ci0JCU9iamVjdCBzbG93RGVxdWV1ZSgpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgU2xvd1NpbXBsZVF1ZXVlPEU+IGV4dGVuZHMgU2ltcGxlUXVldWU8RT4gaW1wbGVtZW50cyBTbG93UXVldWU8RT4gewotCQlTbG93U2ltcGxlUXVldWUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3Qgc2xvd0RlcXVldWUoKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCg1ICogVElDSyk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLmRlcXVldWUoKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTbG93U3luY2hyb25pemVkUXVldWU8RT4gZXh0ZW5kcyBTeW5jaHJvbml6ZWRRdWV1ZTxFPiBpbXBsZW1lbnRzIFNsb3dRdWV1ZTxFPiB7Ci0JCVNsb3dTeW5jaHJvbml6ZWRRdWV1ZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHN5bmNocm9uaXplZCBPYmplY3Qgc2xvd0RlcXVldWUoKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCg1ICogVElDSyk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLmRlcXVldWUoKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHdhaXRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9EZXF1ZXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvRGVxdWV1ZSgwKTsKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgYW4gaXRlbSBzaG91bGQgaGF2ZSBiZWVuIGRlcXVldWVkIGJ5IHQyLi4uCi0JCWFzc2VydFNhbWUoSVRFTV8xLCB0aGlzLmRlcXVldWVkT2JqZWN0KTsKLQkJLy8gLi4uYW5kIHRoZSBxdWV1ZSBzaG91bGQgYmUgZW1wdHkKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNxLmlzRW1wdHkoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPiBUSUNLKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvRGVxdWV1ZVRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9EZXF1ZXVlKFRJQ0spOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSBxdWV1ZSB3YXMgbmV2ZXIgZGVxdWV1ZWQuLi4KLQkJYXNzZXJ0TnVsbCh0aGlzLmRlcXVldWVkT2JqZWN0KTsKLQkJLy8gLi4uYW5kIGl0IHN0aWxsIGhvbGRzIHRoZSBpdGVtCi0JCWFzc2VydFNhbWUoSVRFTV8xLCB0aGlzLnNxLnBlZWsoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPCBUSFJFRV9USUNLUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdhaXRUb0RlcXVldWUobG9uZyB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZEVucXVldWVDb21tYW5kKCksIHRoaXMuc3EsIFRXT19USUNLUyk7Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRXYWl0VG9EZXF1ZXVlQ29tbWFuZCh0aW1lb3V0KSwgdGhpcy5zcSwgMCk7Ci0JCVRocmVhZCB0MSA9IHRoaXMuYnVpbGRUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJdDEuam9pbigpOwotCQl0Mi5qb2luKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb0VucXVldWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9FbnF1ZXVlKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgcXVldWUgZ2V0cyBkZXF1ZXVlZCBieSB0MS4uLgotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5kZXF1ZXVlZE9iamVjdCk7Ci0JCS8vIC4uLmFuZCBhbiBpdGVtIGlzIGVucXVldWVkIG9uIHRvIHRoZSBxdWV1ZSBieSB0MgotCQlhc3NlcnRGYWxzZSh0aGlzLnNxLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFNhbWUoSVRFTV8yLCB0aGlzLnNxLnBlZWsoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPiBUSUNLKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvRW5xdWV1ZVRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9FbnF1ZXVlKFRJQ0spOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSBxdWV1ZSBpcyBldmVudHVhbGx5IGRlcXVldWVkIGJ5IHQxLi4uCi0JCWFzc2VydFNhbWUoSVRFTV8xLCB0aGlzLmRlcXVldWVkT2JqZWN0KTsKLQkJLy8gLi4uYnV0IG5vdGhpbmcgaXMgZW5xdWV1ZWQgb24gdG8gdGhlIHF1ZXVlIGJ5IHQyCi0JCWFzc2VydFRydWUodGhpcy5zcS5pc0VtcHR5KCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9FbnF1ZXVlKGxvbmcgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc3EuZW5xdWV1ZShJVEVNXzEpOwotCQlSdW5uYWJsZSByMSA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkRGVxdWV1ZUNvbW1hbmQoKSwgdGhpcy5zcSwgVFdPX1RJQ0tTKTsKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZFdhaXRUb0VucXVldWVDb21tYW5kKHRpbWVvdXQpLCB0aGlzLnNxLCAwKTsKLQkJVGhyZWFkIHQxID0gdGhpcy5idWlsZFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IHRoaXMuYnVpbGRUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl0MS5qb2luKCk7Ci0JCXQyLmpvaW4oKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRFbnF1ZXVlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRRdWV1ZTxTdHJpbmc+IHN5bmNocm9uaXplZFF1ZXVlKSB7Ci0JCQkJc3luY2hyb25pemVkUXVldWUuZW5xdWV1ZShJVEVNXzEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFdhaXRUb0RlcXVldWVDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4gc3luY2hyb25pemVkUXVldWUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkUXVldWVUZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCXRyeSB7Ci0JCQkJCVN5bmNocm9uaXplZFF1ZXVlVGVzdHMudGhpcy5kZXF1ZXVlZE9iamVjdCA9IHN5bmNocm9uaXplZFF1ZXVlLndhaXRUb0RlcXVldWUodGltZW91dCk7Ci0JCQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJCQlTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLnRoaXMudGltZW91dE9jY3VycmVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJU3luY2hyb25pemVkUXVldWVUZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGREZXF1ZXVlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRRdWV1ZTxTdHJpbmc+IHN5bmNocm9uaXplZFF1ZXVlKSB7Ci0JCQkJU3luY2hyb25pemVkUXVldWVUZXN0cy50aGlzLmRlcXVldWVkT2JqZWN0ID0gc3luY2hyb25pemVkUXVldWUuZGVxdWV1ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFdhaXRUb0VucXVldWVDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4gc3luY2hyb25pemVkUXVldWUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkUXVldWVUZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5bmNocm9uaXplZFF1ZXVlVGVzdHMudGhpcy50aW1lb3V0T2NjdXJyZWQgPSAhIHN5bmNocm9uaXplZFF1ZXVlLndhaXRUb0VucXVldWUoSVRFTV8yLCB0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLnRoaXMuZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4gc3luY2hyb25pemVkUXVldWUsIGZpbmFsIGxvbmcgc2xlZXApIHsKLQkJcmV0dXJuIG5ldyBUZXN0UnVubmFibGUoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHJ1bl8oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJCQlpZiAoc2xlZXAgIT0gMCkgewotCQkJCQlUaHJlYWQuc2xlZXAoc2xlZXApOwotCQkJCX0KLQkJCQljb21tYW5kLmV4ZWN1dGUoc3luY2hyb25pemVkUXVldWUpOwotCQkJfQotCQl9OwotCX0KLQotCWxvbmcgY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVuZFRpbWUgLSB0aGlzLnN0YXJ0VGltZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tbWFuZCBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgQ29tbWFuZCB7Ci0JCXZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRRdWV1ZTxTdHJpbmc+IHN5bmNocm9uaXplZFF1ZXVlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZFN0YWNrVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkU3RhY2tUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjAzMzhmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkU3RhY2tUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRTdGFjazsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkU3RhY2tUZXN0cwotCWV4dGVuZHMgU2ltcGxlU3RhY2tUZXN0cwotewotCXByaXZhdGUgdm9sYXRpbGUgU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPiBzczsKLQl2b2xhdGlsZSBib29sZWFuIHRpbWVvdXRPY2N1cnJlZDsKLQl2b2xhdGlsZSBsb25nIHN0YXJ0VGltZTsKLQl2b2xhdGlsZSBsb25nIGVuZFRpbWU7Ci0Jdm9sYXRpbGUgT2JqZWN0IHBvcHBlZE9iamVjdDsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV8xID0gbmV3IFN0cmluZygpOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV8yID0gbmV3IFN0cmluZygpOwotCi0JcHVibGljIFN5bmNocm9uaXplZFN0YWNrVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RhY2s8U3RyaW5nPiBidWlsZFN0YWNrKCkgewotCQlyZXR1cm4gbmV3IFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCS8vIHN5bmNocm9uaXplZCBzdGFjayBpcyBub3QgY2xvbmVhYmxlCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zcyA9IG5ldyBTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+KCk7Ci0JCXRoaXMudGltZW91dE9jY3VycmVkID0gZmFsc2U7Ci0JCXRoaXMuc3RhcnRUaW1lID0gMDsKLQkJdGhpcy5lbmRUaW1lID0gMDsKLQkJdGhpcy5wb3BwZWRPYmplY3QgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHRlc3QgZmlyc3Qgd2l0aCBhbiB1bnN5bmNocm9uaXplZCBzdGFjaywKLQkgKiB0aGVuIHdpdGggYSBzeW5jaHJvbml6ZWQgc3RhY2sKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY3VycmVudEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUNvbmN1cnJlbnRBY2Nlc3MobmV3IFNsb3dTaW1wbGVTdGFjazxTdHJpbmc+KCksICJzZWNvbmQiKTsKLQkJdGhpcy52ZXJpZnlDb25jdXJyZW50QWNjZXNzKG5ldyBTbG93U3luY2hyb25pemVkU3RhY2s8U3RyaW5nPigpLCAiZmlyc3QiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29uY3VycmVudEFjY2VzcyhTbG93U3RhY2s8U3RyaW5nPiBzbG93U3RhY2ssIFN0cmluZyBleHBlY3RlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNsb3dTdGFjay5wdXNoKCJmaXJzdCIpOwotCQlzbG93U3RhY2sucHVzaCgic2Vjb25kIik7Ci0KLQkJVGhyZWFkIHRocmVhZCA9IHRoaXMuYnVpbGRUaHJlYWQodGhpcy5idWlsZFJ1bm5hYmxlKHNsb3dTdGFjaykpOwotCQl0aHJlYWQuc3RhcnQoKTsKLQkJVGhyZWFkLnNsZWVwKFRXT19USUNLUyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzbG93U3RhY2sucG9wKCkpOwotCQl0aHJlYWQuam9pbigpOwotCQlhc3NlcnRUcnVlKHNsb3dTdGFjay5pc0VtcHR5KCkpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBTbG93U3RhY2s8U3RyaW5nPiBzbG93U3RhY2spIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzbG93U3RhY2suc2xvd1BvcCgpOwotCQkJfQotCQl9OwotCX0KLQotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgU2xvd1N0YWNrPEU+IGV4dGVuZHMgU3RhY2s8RT4gewotCQlPYmplY3Qgc2xvd1BvcCgpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgU2xvd1NpbXBsZVN0YWNrPEU+IGV4dGVuZHMgU2ltcGxlU3RhY2s8RT4gaW1wbGVtZW50cyBTbG93U3RhY2s8RT4gewotCQlTbG93U2ltcGxlU3RhY2soKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3Qgc2xvd1BvcCgpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDUgKiBUSUNLKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQkJcmV0dXJuIHRoaXMucG9wKCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgU2xvd1N5bmNocm9uaXplZFN0YWNrPEU+IGV4dGVuZHMgU3luY2hyb25pemVkU3RhY2s8RT4gaW1wbGVtZW50cyBTbG93U3RhY2s8RT4gewotCQlTbG93U3luY2hyb25pemVkU3RhY2soKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHNsb3dQb3AoKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCg1ICogVElDSyk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLnBvcCgpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogd2FpdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1BvcCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1BvcCgwKTsKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgYW4gaXRlbSBzaG91bGQgaGF2ZSBiZWVuIHBvcHBlZCBieSB0Mi4uLgotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5wb3BwZWRPYmplY3QpOwotCQkvLyAuLi5hbmQgdGhlIHN0YWNrIHNob3VsZCBiZSBlbXB0eQotCQlhc3NlcnRUcnVlKHRoaXMuc3MuaXNFbXB0eSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA+IFRJQ0spOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9Qb3BUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvUG9wKFRJQ0spOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSBzdGFjayB3YXMgbmV2ZXIgcG9wcGVkLi4uCi0JCWFzc2VydE51bGwodGhpcy5wb3BwZWRPYmplY3QpOwotCQkvLyAuLi5hbmQgaXQgc3RpbGwgaG9sZHMgdGhlIGl0ZW0KLQkJYXNzZXJ0U2FtZShJVEVNXzEsIHRoaXMuc3MucGVlaygpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA8IFRIUkVFX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFRvUG9wKGxvbmcgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRQdXNoQ29tbWFuZCgpLCB0aGlzLnNzLCBUV09fVElDS1MpOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkV2FpdFRvUG9wQ29tbWFuZCh0aW1lb3V0KSwgdGhpcy5zcywgMCk7Ci0JCVRocmVhZCB0MSA9IHRoaXMuYnVpbGRUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJdDEuam9pbigpOwotCQl0Mi5qb2luKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1B1c2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9QdXNoKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgc3RhY2sgZ2V0cyBwb3BwZWQgYnkgdDEuLi4KLQkJYXNzZXJ0U2FtZShJVEVNXzEsIHRoaXMucG9wcGVkT2JqZWN0KTsKLQkJLy8gLi4uYW5kIGFuIGl0ZW0gaXMgcHVzaGVkIG9uIHRvIHRoZSBzdGFjayBieSB0MgotCQlhc3NlcnRGYWxzZSh0aGlzLnNzLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFNhbWUoSVRFTV8yLCB0aGlzLnNzLnBlZWsoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPiBUSUNLKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvUHVzaFRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9QdXNoKFRJQ0spOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSBzdGFjayBpcyBldmVudHVhbGx5IHBvcHBlZCBieSB0MS4uLgotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5wb3BwZWRPYmplY3QpOwotCQkvLyAuLi5idXQgbm90aGluZyBpcyBwdXNoZWQgb24gdG8gdGhlIHN0YWNrIGJ5IHQyCi0JCWFzc2VydFRydWUodGhpcy5zcy5pc0VtcHR5KCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9QdXNoKGxvbmcgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc3MucHVzaChJVEVNXzEpOwotCQlSdW5uYWJsZSByMSA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkUG9wQ29tbWFuZCgpLCB0aGlzLnNzLCBUV09fVElDS1MpOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkV2FpdFRvUHVzaENvbW1hbmQodGltZW91dCksIHRoaXMuc3MsIDApOwotCQlUaHJlYWQgdDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gdGhpcy5idWlsZFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXQxLmpvaW4oKTsKLQkJdDIuam9pbigpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFB1c2hDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2spIHsKLQkJCQlzeW5jaHJvbml6ZWRTdGFjay5wdXNoKElURU1fMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvUG9wQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+IHN5bmNocm9uaXplZFN0YWNrKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl0cnkgewotCQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMucG9wcGVkT2JqZWN0ID0gc3luY2hyb25pemVkU3RhY2sud2FpdFRvUG9wKHRpbWVvdXQpOwotCQkJCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZXgpIHsKLQkJCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9IHRydWU7Ci0JCQkJfQotCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkUG9wQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+IHN5bmNocm9uaXplZFN0YWNrKSB7Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnBvcHBlZE9iamVjdCA9IHN5bmNocm9uaXplZFN0YWNrLnBvcCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFdhaXRUb1B1c2hDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2spIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy50aW1lb3V0T2NjdXJyZWQgPSAhIHN5bmNocm9uaXplZFN0YWNrLndhaXRUb1B1c2goSVRFTV8yLCB0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMuZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2ssIGZpbmFsIGxvbmcgc2xlZXApIHsKLQkJcmV0dXJuIG5ldyBUZXN0UnVubmFibGUoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHJ1bl8oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJCQlpZiAoc2xlZXAgIT0gMCkgewotCQkJCQlUaHJlYWQuc2xlZXAoc2xlZXApOwotCQkJCX0KLQkJCQljb21tYW5kLmV4ZWN1dGUoc3luY2hyb25pemVkU3RhY2spOwotCQkJfQotCQl9OwotCX0KLQotCWxvbmcgY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVuZFRpbWUgLSB0aGlzLnN0YXJ0VGltZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tbWFuZCBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgQ29tbWFuZCB7Ci0JCXZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+IHN5bmNocm9uaXplZFN0YWNrKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1Rlc3RUb29scy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9UZXN0VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiNWMzOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1Rlc3RUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0RmFpbHVyZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKLQotLyoqCi0gKiB2YXJpb3VzIHRvb2xzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGVzdCBjYXNlcwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVzdFRvb2xzIHsKLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGhhbmRsZXMge0BsaW5rIEludGVycnVwdGVkRXhjZXB0aW9ufS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2xlZXAobG9uZyBtaWxsaXMpIHsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcChtaWxsaXMpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdGVzdCBhbiBvYmplY3QncyBpbXBsZW1lbnRhdGlvbiBvZiBTZXJpYWxpemFibGUgYnkgc2VyaWFsaXppbmcgdGhlCi0JICogc3BlY2lmaWVkIG9iamVjdCB0byBhIGJ5dGUgYXJyYXk7IHRoZW4gZGUtc2VyaWFsaXppbmcgdGhlIGJ5dGUgYXJyYXkgYW5kCi0JICogcmV0dXJuaW5nIHRoZSByZXN1bHRhbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBzZXJpYWxpemUoVCBvKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFPdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDIwMDApOwotCQlPYmplY3RPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYU91dFN0cmVhbSk7Ci0JCW91dFN0cmVhbS53cml0ZU9iamVjdChvKTsKLQkJb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFJblN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYU91dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJT2JqZWN0SW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFJblN0cmVhbSk7Ci0JCVQgbzIgPSByZWFkT2JqZWN0KGluU3RyZWFtKTsKLQkJaW5TdHJlYW0uY2xvc2UoKTsKLQotCQlyZXR1cm4gbzI7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgcmVhZE9iamVjdChPYmplY3RJbnB1dCBvYmplY3RJbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChUKSBvYmplY3RJbnB1dC5yZWFkT2JqZWN0KCk7Ci0JfQotCi0JLyoqCi0JICogcmVkaXJlY3Qgc3RkIG91dCBhbmQgc3RkIGVyciB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWRpcmVjdFN5c3RlbVN0cmVhbXNUbyhPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7Ci0JCXJlZGlyZWN0U3lzdGVtU3RyZWFtc1RvKG5ldyBQcmludFN0cmVhbShvdXRwdXRTdHJlYW0pKTsKLQl9Ci0KLQkvKioKLQkgKiByZWRpcmVjdCBzdGQgb3V0IGFuZCBzdGQgZXJyIHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZGlyZWN0U3lzdGVtU3RyZWFtc1RvKFByaW50U3RyZWFtIHByaW50U3RyZWFtKSB7Ci0JCVN5c3RlbS5zZXRPdXQocHJpbnRTdHJlYW0pOwotCQlTeXN0ZW0uc2V0RXJyKHByaW50U3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBTb3J0IGFuZCBwcmludCBvdXQgYWxsIHRoZSBjdXJyZW50IEphdmEgU3lzdGVtIHByb3BlcnRpZXMgb24gdGhlCi0JICogY29uc29sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRTeXN0ZW1Qcm9wZXJ0aWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKLQkJCXByaW50U3lzdGVtUHJvcGVydGllc09uKFN5c3RlbS5vdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU29ydCBhbmQgcHJpbnQgb3V0IGFsbCB0aGUgY3VycmVudCBKYXZhIFN5c3RlbSBwcm9wZXJ0aWVzIG9uIHRoZQotCSAqIHNwZWNpZmllZCBwcmludCBzdHJlYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50U3lzdGVtUHJvcGVydGllc09uKFByaW50U3RyZWFtIHN0cmVhbSkgewotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzb3J0ZWRLZXlzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihTdHJpbmcuQ0FTRV9JTlNFTlNJVElWRV9PUkRFUik7Ci0JCWZvciAoT2JqZWN0IGtleSA6IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkua2V5U2V0KCkpIHsKLQkJCXNvcnRlZEtleXMuYWRkKChTdHJpbmcpIGtleSk7Ci0JCX0KLQkJZm9yIChTdHJpbmcga2V5IDogc29ydGVkS2V5cykgewotCQkJc3RyZWFtLnByaW50KGtleSk7Ci0JCQlzdHJlYW0ucHJpbnQoIiA9PiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RyZWFtLnByaW50KFN5c3RlbS5nZXRQcm9wZXJ0eShrZXkpKTsKLQkJCXN0cmVhbS5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBleGVjdXRlIHRoZSBzcGVjaWZpZWQgdGVzdCBhbmQgcmV0dXJuIGEgdGV4dCBvdXRwdXQgb2YgaXRzIHJlc3VsdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGVjdXRlKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJVGVzdFJlc3VsdCByZXN1bHQgPSB0ZXN0Q2FzZS5ydW4oKTsKLQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKLQkJd3JpdGVyLnByaW50KHRlc3RDYXNlLmdldE5hbWUoKSk7Ci0JCXdyaXRlci5wcmludCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSkgewotCQkJd3JpdGVyLnByaW50bG4oIk9LIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCVRlc3RGYWlsdXJlIGZhaWx1cmUgPSBudWxsOwotCQkJaWYgKHJlc3VsdC5mYWlsdXJlcygpLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJZmFpbHVyZSA9IChUZXN0RmFpbHVyZSkgcmVzdWx0LmZhaWx1cmVzKCkubmV4dEVsZW1lbnQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmFpbHVyZSA9IChUZXN0RmFpbHVyZSkgcmVzdWx0LmVycm9ycygpLm5leHRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlmYWlsdXJlLnRocm93bkV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOwotCQl9Ci0JCXdyaXRlci5wcmludCgiZWxhcHNlZCB0aW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlsb25nIGVsYXBzZWQgPSBlbmQgLSBzdGFydDsKLQkJd3JpdGVyLnByaW50KGVsYXBzZWQgLyAxMDAwTCk7Ci0JCXdyaXRlci5wcmludGxuKCIgc2VjLiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciBvdXQgYWxsIHRoZSBpbnN0YW5jZSB2YXJpYWJsZSBvZiB0aGUgc3BlY2lmaWVkIHRlc3QgY2FzZSwgYWxsb3dpbmcKLQkgKiB0aGUgdmFyaW91cyB0ZXN0IGZpeHR1cmVzIHRvIGJlIGdhcmJhZ2UtY29sbGVjdGVkLiBUeXBpY2FsbHkgdGhpcyBpcwotCSAqIGNhbGxlZCBpbiB0aGUgI3RlYXJEb3duKCkgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcihUZXN0Q2FzZSB0ZXN0Q2FzZSkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotCQlmb3IgKENsYXNzPD8+IGNsYXp6ID0gdGVzdENhc2UuZ2V0Q2xhc3MoKTsgY2xhenogIT0gVGVzdENhc2VfY2xhc3M7IGNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpKSB7Ci0JCQlmb3IgKEZpZWxkIGZpZWxkIDogY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKSkgewotCQkJCS8vIGxlYXZlIHByaW1pdGl2ZXMgYWxvbmUgLSB0aGV5IGRvbid0IGdldCBnYXJiYWdlLWNvbGxlY3RlZCwgYW5kIHdlIGNhbid0IHNldCB0aGVtIHRvIG51bGwuLi4KLQkJCQlpZiAoZmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vIGxlYXZlIHN0YXRpYyBmaWVsZHMgYWxvbmUgKD8pCi0JCQkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKGZpZWxkLmdldE1vZGlmaWVycygpKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCQlmaWVsZC5zZXQodGVzdENhc2UsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8VGVzdENhc2U+IFRlc3RDYXNlX2NsYXNzID0gVGVzdENhc2UuY2xhc3M7Ci0KLQkvKioKLQkgKiBXb3JrYXJvdW5kIGZvciBhIEpVbml0IGJ1ZzogSlVuaXQgZG9lcyBub3QgY29uZmlndXJlIHRoZSB0ZXN0aW5nIFRocmVhZAotCSAqIHdpdGggYSBjb250ZXh0IGNsYXNzIGxvYWRlci4gVGhpcyBzaG91bGQgcHJvYmFibHkgaGFwcGVuIGluCi0JICogVGVzdFJ1bm5lci5kb1J1blRlc3QoVGVzdCksIGp1c3QgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0aHJlYWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFVwSlVuaXRUaHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIoKSB7Ci0JCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKFRlc3RUb29scy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwcmVzc2VkIGNvbnN0cnVjdG9yCi0JICovCi0JcHJpdmF0ZSBUZXN0VG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvWE1MU3RyaW5nRW5jb2RlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYTBlN2YuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkZpbGVUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5YTUxTdHJpbmdFbmNvZGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYTUxTdHJpbmdFbmNvZGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgWE1MU3RyaW5nRW5jb2RlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbmNvZGVOb0NoYXJhY3RlclNlcXVlbmNlcygpIHsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0KLQkJU3RyaW5nIHMgPSAiZm9vIjsKLQkJYXNzZXJ0RXF1YWxzKHMsIGVuY29kZXIuZW5jb2RlKHMpKTsKLQotCQlzID0gIjEyM2ZvbzEyMyI7Ci0JCWFzc2VydEVxdWFscyhzLCBlbmNvZGVyLmVuY29kZShzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVuY29kZUNoYXJhY3RlclNlcXVlbmNlcygpIHsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0KLQkJU3RyaW5nIHMgPSAiP2Zvbz8iOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiJiN4M2Y7Zm9vJiN4M2Y7IjsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBlbmNvZGVyLmVuY29kZShzKSk7Ci0KLQkJcyA9ICI/Zm9vJjEyMyI7Ci0JCWV4cGVjdGVkID0gIiYjeDNmO2ZvbyYjeDI2OzEyMyI7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgZW5jb2Rlci5lbmNvZGUocykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZW5vcm1hbGl6ZVZhbGlkRmlsZU5hbWUoKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JCVN0cmluZyBzID0gImZvbyI7Ci0JCWFzc2VydEVxdWFscyhzLCBlbmNvZGVyLmRlY29kZShzKSk7Ci0KLQkJcyA9ICIxMjNmb28xMjMiOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5kZWNvZGUocykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZW5vcm1hbGl6ZUludmFsaWRGaWxlTmFtZSgpIHsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0KLQkJU3RyaW5nIHMgPSAiJiN4M2Y7Zm9vJiN4M2Y7IjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIj9mb28/IjsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBlbmNvZGVyLmRlY29kZShzKSk7Ci0KLQkJcyA9ICImI3gzZjtmb28mI3gyNjsxMjMiOwotCQlleHBlY3RlZCA9ICI/Zm9vJjEyMyI7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgZW5jb2Rlci5kZWNvZGUocykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3VuZFRyaXBOb0NoYXJhY3RlclNlcXVlbmNlcygpIHsKLQkJdGhpcy52ZXJpZnlSb3VuZFRyaXAoImZvbyIpOwotCQl0aGlzLnZlcmlmeVJvdW5kVHJpcCgiMTIzZm9vNDU2Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdW5kVHJpcENoYXJhY3RlclNlcXVlbmNlcygpIHsKLQkJdGhpcy52ZXJpZnlSb3VuZFRyaXAoIj9mb28/Iik7Ci0JCXRoaXMudmVyaWZ5Um91bmRUcmlwKCI/Zm9vJjEyMyYmJiYmJj4+Pj4iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Um91bmRUcmlwKFN0cmluZyBzKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCQlTdHJpbmcgYWN0dWFsID0gZW5jb2Rlci5lbmNvZGUocyk7Ci0JCWFzc2VydEVxdWFscyhzLCBlbmNvZGVyLmRlY29kZShhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlMSgpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyYiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlMigpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyYjIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTMoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mI3giKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlNCgpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyYjeDMiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlNSgpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyYjeDsiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlNigpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyZBIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTcoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mI0EiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzID0gZW5jb2Rlci5kZWNvZGUocyk7Ci0JCQlmYWlsKHMpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlOCgpIHsKLQkJU3RyaW5nIHMgPSAiZm9vJiN4WlpaWjsiOwotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJcyA9IGVuY29kZXIuZGVjb2RlKHMpOwotCQkJZmFpbChzKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9FbXB0eUVudW1lcmF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0VtcHR5RW51bWVyYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmRhNzdmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0VtcHR5RW51bWVyYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5lbnVtZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zLkVtcHR5RW51bWVyYXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVtcHR5RW51bWVyYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbXB0eUVudW1lcmF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc01vcmVFbGVtZW50cygpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEVudW1lcmF0aW9uPE9iamVjdD4gc3RyZWFtID0gRW1wdHlFbnVtZXJhdGlvbi5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRFbGVtZW50KCkgewotCQlmb3IgKEVudW1lcmF0aW9uPE9iamVjdD4gc3RyZWFtID0gRW1wdHlFbnVtZXJhdGlvbi5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyZWFtLm5leHRFbGVtZW50KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJRW51bWVyYXRpb248T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUVudW1lcmF0aW9uLmluc3RhbmNlKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9JdGVyYXRvckVudW1lcmF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0l0ZXJhdG9yRW51bWVyYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDViMzQ5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0l0ZXJhdG9yRW51bWVyYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuZW51bWVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLmVudW1lcmF0aW9ucy5JdGVyYXRvckVudW1lcmF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBJdGVyYXRvckVudW1lcmF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSXRlcmF0b3JFbnVtZXJhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNNb3JlRWxlbWVudHMoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChFbnVtZXJhdGlvbjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFZlY3RvcigpLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc01vcmVFbGVtZW50c1VwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEVudW1lcmF0aW9uPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZEVudW1lcmF0aW9uVXBjYXN0KCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCXN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEVsZW1lbnQoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQkJZm9yIChFbnVtZXJhdGlvbjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBpdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0RWxlbWVudCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUVudW1lcmF0aW9uPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEVudW1lcmF0aW9uKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1lcmF0aW9uPFN0cmluZz4gYnVpbGRFbnVtZXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRFbnVtZXJhdGlvbih0aGlzLmJ1aWxkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdGlvbjxPYmplY3Q+IGJ1aWxkRW51bWVyYXRpb25VcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRW51bWVyYXRpb25VcGNhc3QodGhpcy5idWlsZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgRW51bWVyYXRpb248U3RyaW5nPiBidWlsZEVudW1lcmF0aW9uKEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBJdGVyYXRvckVudW1lcmF0aW9uPFN0cmluZz4oaXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgRW51bWVyYXRpb248T2JqZWN0PiBidWlsZEVudW1lcmF0aW9uVXBjYXN0KEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBJdGVyYXRvckVudW1lcmF0aW9uPE9iamVjdD4oaXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZlY3RvcigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3I8U3RyaW5nPiBidWlsZFZlY3RvcigpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl2LmFkZEVsZW1lbnQoIm9uZSIpOwotCQl2LmFkZEVsZW1lbnQoInR3byIpOwotCQl2LmFkZEVsZW1lbnQoInRocmVlIik7Ci0JCXYuYWRkRWxlbWVudCgiZm91ciIpOwotCQl2LmFkZEVsZW1lbnQoImZpdmUiKTsKLQkJdi5hZGRFbGVtZW50KCJzaXgiKTsKLQkJdi5hZGRFbGVtZW50KCJzZXZlbiIpOwotCQl2LmFkZEVsZW1lbnQoImVpZ2h0Iik7Ci0JCXJldHVybiB2OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvSnB0VXRpbGl0eUVudW1lcmF0aW9uc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9KcHRVdGlsaXR5RW51bWVyYXRpb25zVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkMTRjMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9KcHRVdGlsaXR5RW51bWVyYXRpb25zVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuZW51bWVyYXRpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5RW51bWVyYXRpb25zVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlFbnVtZXJhdGlvbnNUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW1wdHlFbnVtZXJhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEl0ZXJhdG9yRW51bWVyYXRpb25UZXN0cy5jbGFzcyk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VXRpbGl0eUVudW1lcmF0aW9uc1Rlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5SXRlcmFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZDk0NTEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBcnJheUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQXJyYXlJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAxOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiB0aGlzLmJ1aWxkSXRlcmFibGUoKSkgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgSW50ZWdlci5wYXJzZUludChzdHJpbmcpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAzOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiB0aGlzLmJ1aWxkSXRlcmFibGUoMikpIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIEludGVnZXIucGFyc2VJbnQoc3RyaW5nKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkgewotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oLTEsIDEpOwotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oOCwgMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigwLCAtMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigwLCA5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZShzdGFydCwgbGVuZ3RoKTsKLQkJCWZhaWwoImJvZ3VzIGl0ZXJhYmxlOiAiICsgaXRlcmFibGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYWJsZSgwKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShpbnQgc3RhcnQpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYWJsZSh0aGlzLmJ1aWxkQXJyYXkoKSwgc3RhcnQpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKFN0cmluZ1tdIGFycmF5LCBpbnQgc3RhcnQpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oYXJyYXksIHN0YXJ0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYWJsZSh0aGlzLmJ1aWxkQXJyYXkoKSwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoU3RyaW5nW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihhcnJheSwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBidWlsZEFycmF5KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIgfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5TGlzdEl0ZXJhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5TGlzdEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxMGU4My4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9BcnJheUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXJyYXlMaXN0SXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBBcnJheUxpc3RJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAxOwotCQlMaXN0SXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZSgpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBpdGVyYWJsZSkgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgSW50ZWdlci5wYXJzZUludChzdHJpbmcpKTsKLQkJfQotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBpdGVyYWJsZS5pdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygtLWksIEludGVnZXIucGFyc2VJbnQoc3RyZWFtLnByZXZpb3VzKCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAzOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiB0aGlzLmJ1aWxkSXRlcmFibGUoMikpIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIEludGVnZXIucGFyc2VJbnQoc3RyaW5nKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkgewotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oLTEsIDEpOwotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oOCwgMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigwLCAtMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigwLCA5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZShzdGFydCwgbGVuZ3RoKTsKLQkJCWZhaWwoImJvZ3VzIGl0ZXJhYmxlOiAiICsgaXRlcmFibGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmFibGUoMCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKGludCBzdGFydCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhYmxlKHRoaXMuYnVpbGRBcnJheSgpLCBzdGFydCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKFN0cmluZ1tdIGFycmF5LCBpbnQgc3RhcnQpIHsKLQkJcmV0dXJuIChzdGFydCA9PSAwKSA/Ci0JCQkJbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oYXJyYXkpIDoKLQkJCQluZXcgQXJyYXlMaXN0SXRlcmFibGU8U3RyaW5nPihhcnJheSwgc3RhcnQpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYWJsZSh0aGlzLmJ1aWxkQXJyYXkoKSwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKFN0cmluZ1tdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYWJsZTxTdHJpbmc+KGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkQXJyYXkoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiB9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ2hhaW5JdGVyYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9DaGFpbkl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyNTVkYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9DaGFpbkl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNoYWluSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNoYWluSXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENoYWluSXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIFZFQ1RPUl9ISUVSQVJDSFkgPSB7IFZlY3Rvci5jbGFzcywgQWJzdHJhY3RMaXN0LmNsYXNzLCBBYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MsIE9iamVjdC5jbGFzcyB9OwotCi0JcHVibGljIENoYWluSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0TGluaygpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKENsYXNzPD8+IGNsYXp6IDogdGhpcy5idWlsZEl0ZXJhYmxlKCkpIHsKLQkJCWFzc2VydEVxdWFscyhWRUNUT1JfSElFUkFSQ0hZW2krK10sIGNsYXp6KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaW5rZXIoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChDbGFzczw/PiBjbGF6eiA6IG5ldyBDaGFpbkl0ZXJhYmxlPENsYXNzPD8+PihWZWN0b3IuY2xhc3MsIHRoaXMuYnVpbGRMaW5rZXIoKSkpIHsKLQkJCWFzc2VydEVxdWFscyhWRUNUT1JfSElFUkFSQ0hZW2krK10sIGNsYXp6KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oKSB7Ci0JCUl0ZXJhYmxlPENsYXNzPD8+PiBpdGVyYWJsZSA9IG5ldyBDaGFpbkl0ZXJhYmxlPENsYXNzPD8+PihWZWN0b3IuY2xhc3MpOwotCQlJdGVyYXRvcjxDbGFzczw/Pj4gaXRlcmF0b3IgPSBpdGVyYWJsZS5pdGVyYXRvcigpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDbGFzczw/PiBjbGF6eiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoImJvZ3VzIGNsYXNzOiAiICsgY2xhenopOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRJdGVyYWJsZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8Q2xhc3M8Pz4+IGJ1aWxkSXRlcmFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ2hhaW5JdGVyYWJsZShWZWN0b3IuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8Q2xhc3M8Pz4+IGJ1aWxkQ2hhaW5JdGVyYWJsZShDbGFzczw/PiBzdGFydExpbmspIHsKLQkJLy8gY2hhaW4gdXAgdGhlIGNsYXNzJ3MgaGllcmFyY2h5Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYWJsZTxDbGFzczw/Pj4oc3RhcnRMaW5rKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDbGFzczw/PiBuZXh0TGluayhDbGFzczw/PiBjdXJyZW50TGluaykgewotCQkJCXJldHVybiBjdXJyZW50TGluay5nZXRTdXBlcmNsYXNzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxDbGFzczw/Pj4gYnVpbGRMaW5rZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvci5MaW5rZXI8Q2xhc3M8Pz4+KCkgewotCQkJcHVibGljIENsYXNzPD8+IG5leHRMaW5rKENsYXNzPD8+IGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIGN1cnJlbnRMaW5rLmdldFN1cGVyY2xhc3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0Nsb25lSXRlcmFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ2xvbmVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZWZmOTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ2xvbmVJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIENsb25lSXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlOwotCi0JcHVibGljIENsb25lSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCIwIik7Ci0JCWMuYWRkKCIxIik7Ci0JCWMuYWRkKCIyIik7Ci0JCWMuYWRkKCIzIik7Ci0JCWFzc2VydEVxdWFscyg0LCBjLnNpemUoKSk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoYyk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IHRoaXMuaXRlcmFibGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJCWMucmVtb3ZlKCIzIik7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDQsIGkpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRSZW1vdmluZ0l0ZXJhYmxlKGNvbGxlY3Rpb24pOwotCi0JCU9iamVjdCByZW1vdmVkID0gInRocmVlIjsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgcmVtb3ZlZCkpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscyhyZW1vdmVkKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEZhbHNlKGNvbGxlY3Rpb24uY29udGFpbnMocmVtb3ZlZCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVyKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGVXaXRoUmVtb3Zlcihjb2xsZWN0aW9uKTsKLQotCQlPYmplY3QgcmVtb3ZlZCA9ICJ0aHJlZSI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIHJlbW92ZWQpKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGl0ZXJhdG9yLm5leHQoKS5lcXVhbHMocmVtb3ZlZCkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRGYWxzZShjb2xsZWN0aW9uLmNvbnRhaW5zKHJlbW92ZWQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1JlbW92ZXIoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLml0ZXJhYmxlLnRvU3RyaW5nKCkpOwotCi0JCU9iamVjdCByZW1vdmVkID0gInRocmVlIjsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgcmVtb3ZlZCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKHJlbW92ZWQpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCWZhaWwoKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoY29sbGVjdGlvbik7Ci0JCWFzc2VydE5vdE51bGwoaXRlcmFibGUudG9TdHJpbmcoKSk7Ci0JfQotCi0JYWJzdHJhY3QgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKExpc3Q8U3RyaW5nPiBjKTsKLQotCWFic3RyYWN0IEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRSZW1vdmluZ0l0ZXJhYmxlKExpc3Q8U3RyaW5nPiBjKTsKLQotCWFic3RyYWN0IEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZVdpdGhSZW1vdmVyKExpc3Q8U3RyaW5nPiBjKTsKLQotCUNsb25lSXRlcmF0b3IuUmVtb3ZlcjxTdHJpbmc+IGJ1aWxkUmVtb3ZlcihmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3IuUmVtb3ZlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBjdXJyZW50KSB7Ci0JCQkJYy5yZW1vdmUoY3VycmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxTdHJpbmc+IGJ1aWxkTXV0YXRvcihmaW5hbCBMaXN0PFN0cmluZz4gbGlzdCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIFN0cmluZyBzdHJpbmcpIHsKLQkJCQlsaXN0LmFkZChpbmRleCwgc3RyaW5nKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIFN0cmluZyBzdHJpbmcpIHsKLQkJCQlsaXN0LnNldChpbmRleCwgc3RyaW5nKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQlsaXN0LnJlbW92ZShpbmRleCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJTGlzdDxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgic2l4Iik7Ci0JCWMuYWRkKCJzZXZlbiIpOwotCQljLmFkZCgiZWlnaHQiKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVJdGVyYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OTg1N2UuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlSXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDb21wb3NpdGVJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMCIpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoIjQiKTsKLQkJYzIuYWRkKCI1Iik7Ci0JCWMyLmFkZCgiNiIpOwotCQljMi5hZGQoIjciKTsKLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPihjMSwgYzIpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBjb21wb3NpdGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHRyYUVsZW1lbnQxKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPihjMSwgIjQiKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXh0cmFFbGVtZW50MigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigiMCIsIGMxKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbk9mSXRlcmFibGVzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCi0JCUNvbGxlY3Rpb248SXRlcmFibGU8U3RyaW5nPj4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8SXRlcmFibGU8U3RyaW5nPj4oKTsKLQkJY29sbGVjdGlvbi5hZGQoYzEpOwotCQljb2xsZWN0aW9uLmFkZChjMik7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oY29sbGVjdGlvbik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KGMxLCBjMik7Ci0JCWFzc2VydE5vdE51bGwoY29tcG9zaXRlLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTRkOTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RMaXN0SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMCIpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCi0JCUxpc3Q8U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoIjQiKTsKLQkJYzIuYWRkKCI1Iik7Ci0JCWMyLmFkZCgiNiIpOwotCQljMi5hZGQoIjciKTsKLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlPFN0cmluZz4oYzEsIGMyKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXh0cmFFbGVtZW50MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMCIpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGMxLCAiNCIpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBjb21wb3NpdGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHRyYUVsZW1lbnQyKCkgewotCQlMaXN0PFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPigiMCIsIGMxKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbk9mSXRlcmFibGVzKCkgewotCQlMaXN0PFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCi0JCUxpc3Q8TGlzdEl0ZXJhYmxlPFN0cmluZz4+IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PExpc3RJdGVyYWJsZTxTdHJpbmc+PigpOwotCQljb2xsZWN0aW9uLmFkZChuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMxKSk7Ci0JCWNvbGxlY3Rpb24uYWRkKG5ldyBMaXN0TGlzdEl0ZXJhYmxlPFN0cmluZz4oYzIpKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlPFN0cmluZz4oY29sbGVjdGlvbik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlMaXN0PFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPihjMSwgYzIpOwotCQlhc3NlcnROb3ROdWxsKGNvbXBvc2l0ZS50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0VtcHR5SXRlcmFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjY5ZTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRW1wdHlJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVtcHR5SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWZvciAoU3RyaW5nIHMgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSkgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQlhc3NlcnRTYW1lKGl0ZXJhYmxlLCBUZXN0VG9vbHMuc2VyaWFsaXplKGl0ZXJhYmxlKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUxpc3RJdGVyYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMzdhY2UuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlMaXN0SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbXB0eUxpc3RJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVtcHR5TGlzdEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlmb3IgKFN0cmluZyBzIDogRW1wdHlMaXN0SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwoRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0U2FtZShpdGVyYWJsZSwgVGVzdFRvb2xzLnNlcmlhbGl6ZShpdGVyYWJsZSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRmlsdGVyaW5nSXRlcmFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRmlsdGVyaW5nSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTMxNjNlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0ZpbHRlcmluZ0l0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAicHJlZml4IjsKLQotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2NlcHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IHRoaXMuYnVpbGRJdGVyYWJsZSgpKSB7Ci0JCQlhc3NlcnRUcnVlKHMuY29udGFpbnMoUFJFRklYKSk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWx0ZXIoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IHRoaXMuYnVpbGRGaWx0ZXIoKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5idWlsZE5lc3RlZEl0ZXJhYmxlKCksIGZpbHRlcikpIHsKLQkJCWFzc2VydFRydWUocy5jb250YWlucyhQUkVGSVgpKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRJdGVyYWJsZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nRmlsdGVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBuZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkTmVzdGVkSXRlcmFibGUoKSk7Ci0JCXRyeSB7Ci0JCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gaXRlcmFibGUuaXRlcmF0b3IoKTsKLQkJCWZhaWwoImJvZ3VzIGl0ZXJhdG9yOiAiICsgaXRlcmF0b3IpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyaW5nSXRlcmFibGUodGhpcy5idWlsZE5lc3RlZEl0ZXJhYmxlKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZEZpbHRlcmluZ0l0ZXJhYmxlKEl0ZXJhYmxlPFN0cmluZz4gbmVzdGVkSXRlcmFibGUpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTdHJpbmc+KG5lc3RlZEl0ZXJhYmxlKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgoUFJFRklYKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aChQUkVGSVgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhYmxlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChQUkVGSVggKyAiMSIpOwotCQljLmFkZChQUkVGSVggKyAiMiIpOwotCQljLmFkZChQUkVGSVggKyAiMyIpOwotCQljLmFkZCgiNCIpOwotCQljLmFkZChQUkVGSVggKyAiNSIpOwotCQljLmFkZChQUkVGSVggKyAiNiIpOwotCQljLmFkZChQUkVGSVggKyAiNyIpOwotCQljLmFkZCgiOCIpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0dyYXBoSXRlcmFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvR3JhcGhJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYjc0Y2EuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvR3JhcGhJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuR3JhcGhJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuR3JhcGhJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdyYXBoSXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKiogdGhpcyB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGFsbCB0aGUgbm9kZXMgY3JlYXRlZCBmb3IgdGhlIHRlc3QgKi8KLQlDb2xsZWN0aW9uPEdyYXBoTm9kZT4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PEdyYXBoTm9kZT4oKTsKLQotCXB1YmxpYyBHcmFwaEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZWlnaGJvcnMxKCkgewotCQlmb3IgKEdyYXBoTm9kZSBnbiA6IHRoaXMuYnVpbGRHcmFwaEl0ZXJhYmxlMSgpKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMubm9kZXMuY29udGFpbnMoZ24pKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8R3JhcGhOb2RlPiBidWlsZEdyYXBoSXRlcmFibGUxKCkgewotCQlyZXR1cm4gbmV3IEdyYXBoSXRlcmFibGU8R3JhcGhOb2RlPih0aGlzLmJ1aWxkR3JhcGhSb290KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKEdyYXBoTm9kZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQubmVpZ2hib3JzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5laWdoYm9yczIoKSB7Ci0JCWZvciAoR3JhcGhOb2RlIGduIDogdGhpcy5idWlsZEdyYXBoSXRlcmFibGUyKCkpIHsKLQkJCWFzc2VydFRydWUodGhpcy5ub2Rlcy5jb250YWlucyhnbikpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxHcmFwaE5vZGU+IGJ1aWxkR3JhcGhJdGVyYWJsZTIoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYWJsZTxHcmFwaE5vZGU+KHRoaXMuYnVpbGRHcmFwaFJvb3QoKSwgdGhpcy5idWlsZE1pc3RlclJvZ2VycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVpZ2hib3JzMygpIHsKLQkJZm9yIChHcmFwaE5vZGUgZ24gOiB0aGlzLmJ1aWxkR3JhcGhJdGVyYWJsZTMoKSkgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVzLmNvbnRhaW5zKGduKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEdyYXBoTm9kZT4gYnVpbGRHcmFwaEl0ZXJhYmxlMygpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhYmxlPEdyYXBoTm9kZT4obmV3IEdyYXBoTm9kZVtdIHsgdGhpcy5idWlsZEdyYXBoUm9vdCgpIH0pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKEdyYXBoTm9kZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQubmVpZ2hib3JzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5laWdoYm9yczQoKSB7Ci0JCWZvciAoR3JhcGhOb2RlIGduIDogdGhpcy5idWlsZEdyYXBoSXRlcmFibGU0KCkpIHsKLQkJCWFzc2VydFRydWUodGhpcy5ub2Rlcy5jb250YWlucyhnbikpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxHcmFwaE5vZGU+IGJ1aWxkR3JhcGhJdGVyYWJsZTQoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYWJsZTxHcmFwaE5vZGU+KG5ldyBHcmFwaE5vZGVbXSB7IHRoaXMuYnVpbGRHcmFwaFJvb3QoKSB9LCB0aGlzLmJ1aWxkTWlzdGVyUm9nZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmJ1aWxkR3JhcGhJdGVyYWJsZTEoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ01pc3RlclJvZ2VycygpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJZm9yIChHcmFwaE5vZGUgZ24gOiBuZXcgR3JhcGhJdGVyYWJsZTxHcmFwaE5vZGU+KHRoaXMuYnVpbGRHcmFwaFJvb3QoKSkpIHsKLQkJCQlhc3NlcnRUcnVlKHRoaXMubm9kZXMuY29udGFpbnMoZ24pKTsKLQkJCX0KLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnM8R3JhcGhOb2RlPiBidWlsZE1pc3RlclJvZ2VycygpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxHcmFwaE5vZGU+KCkgewotCQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKEdyYXBoTm9kZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQubmVpZ2hib3JzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBHcmFwaE5vZGUgYnVpbGRHcmFwaFJvb3QoKSB7Ci0JCUdyYXBoTm9kZSBuY05vZGUgPSBuZXcgR3JhcGhOb2RlKCJOb3J0aCBDYXJvbGluYSIpOwotCQlHcmFwaE5vZGUgdmFOb2RlID0gbmV3IEdyYXBoTm9kZSgiVmlyZ2luaWEiKTsKLQkJR3JhcGhOb2RlIHNjTm9kZSA9IG5ldyBHcmFwaE5vZGUoIlNvdXRoIENhcm9saW5hIik7Ci0JCUdyYXBoTm9kZSBnYU5vZGUgPSBuZXcgR3JhcGhOb2RlKCJHZW9yZ2lhIik7Ci0JCUdyYXBoTm9kZSBmbE5vZGUgPSBuZXcgR3JhcGhOb2RlKCJGbG9yaWRhIik7Ci0JCUdyYXBoTm9kZSBhbE5vZGUgPSBuZXcgR3JhcGhOb2RlKCJBbGFiYW1hIik7Ci0JCUdyYXBoTm9kZSBtc05vZGUgPSBuZXcgR3JhcGhOb2RlKCJNaXNzaXNzaXBwaSIpOwotCQlHcmFwaE5vZGUgdG5Ob2RlID0gbmV3IEdyYXBoTm9kZSgiVGVubmVzc2VlIik7Ci0KLQkJbmNOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyB2YU5vZGUsIHNjTm9kZSwgZ2FOb2RlLCB0bk5vZGUgfSk7Ci0JCXZhTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgbmNOb2RlLCB0bk5vZGUgfSk7Ci0JCXNjTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgbmNOb2RlLCBnYU5vZGUgfSk7Ci0JCWdhTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgbmNOb2RlLCBzY05vZGUsIGZsTm9kZSwgYWxOb2RlLCB0bk5vZGUgfSk7Ci0JCWZsTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgZ2FOb2RlIH0pOwotCQlhbE5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IGdhTm9kZSwgbXNOb2RlLCB0bk5vZGUgfSk7Ci0JCW1zTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgYWxOb2RlLCB0bk5vZGUgfSk7Ci0JCXRuTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgdmFOb2RlLCBuY05vZGUsIGdhTm9kZSwgYWxOb2RlLCBtc05vZGUgfSk7Ci0KLQkJcmV0dXJuIG5jTm9kZTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgR3JhcGhOb2RlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCQlwcml2YXRlIENvbGxlY3Rpb248R3JhcGhOb2RlPiBuZWlnaGJvcnMgPSBuZXcgQXJyYXlMaXN0PEdyYXBoTm9kZT4oKTsKLQotCQlwdWJsaWMgR3JhcGhOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJR3JhcGhJdGVyYWJsZVRlc3RzLnRoaXMubm9kZXMuYWRkKHRoaXMpOyAvLyBsb2cgbm9kZQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQotCQl2b2lkIHNldE5laWdoYm9ycyhHcmFwaE5vZGVbXSBuZWlnaGJvcnMpIHsKLQkJCXRoaXMubmVpZ2hib3JzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QobmVpZ2hib3JzKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxHcmFwaE5vZGU+IG5laWdoYm9ycygpIHsKLQkJCXJldHVybiB0aGlzLm5laWdoYm9ycy5pdGVyYXRvcigpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZWlnaGJvcnNTaXplKCkgewotCQkJcmV0dXJuIHRoaXMubmVpZ2hib3JzLnNpemUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJHcmFwaE5vZGUoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0pwdFV0aWxpdHlJdGVyYWJsZXNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvSnB0VXRpbGl0eUl0ZXJhYmxlc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOTRiZDAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvSnB0VXRpbGl0eUl0ZXJhYmxlc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eUl0ZXJhYmxlc1Rlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5SXRlcmFibGVzVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFycmF5SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBcnJheUxpc3RJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENoYWluSXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVtcHR5SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbXB0eUxpc3RJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbHRlcmluZ0l0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3VwZXJJdGVyYWJsZVdyYXBwZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHcmFwaEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGl2ZUNsb25lSXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXZlQ2xvbmVMaXN0SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQZWVrYWJsZUl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUXVldWVJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5TGlzdEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlRWxlbWVudEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNuYXBzaG90Q2xvbmVJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdGFja0l0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25JdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJlZUl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFV0aWxpdHlJdGVyYWJsZXNUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVJdGVyYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NmQ0MjEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpdmVDbG9uZUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBDbG9uZUl0ZXJhYmxlVGVzdHMgewotCi0JcHVibGljIExpdmVDbG9uZUl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlzdXBlci50ZXN0SXRlcmF0b3IoKTsKLQkJLy8gaXRlcmFibGUgc2hvdWxkIG5vdyByZXR1cm4gb25seSAzIHN0cmluZ3MgKHNpbmNlIGl0J3MgImxpdmUiKQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiB0aGlzLml0ZXJhYmxlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDMsIGkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCXN1cGVyLnRlc3RSZW1vdmUoKTsKLQkJLy8gImxpdmUiIGNsb25lIGl0ZXJhYmxlIHdpbGwgbm8gbG9uZ2VyIGNvbnRhaW4gdGhlIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIHRoZQotCQkvLyBvcmlnaW5hbCBjb2xsZWN0aW9uCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCAidGhyZWUiKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZXIoKSB7Ci0JCXN1cGVyLnRlc3RSZW1vdmVyKCk7Ci0JCS8vICJsaXZlIiBjbG9uZSBpdGVyYWJsZSB3aWxsIG5vIGxvbmdlciBjb250YWluIHRoZSBlbGVtZW50IHJlbW92ZWQgZnJvbSB0aGUKLQkJLy8gb3JpZ2luYWwgY29sbGVjdGlvbgotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgInRocmVlIikpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPFN0cmluZz4oYyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmFibGU8U3RyaW5nPiBidWlsZFJlbW92aW5nSXRlcmFibGUoZmluYWwgTGlzdDxTdHJpbmc+IGMpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxTdHJpbmc+KGMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoU3RyaW5nIGN1cnJlbnQpIHsKLQkJCQkJYy5yZW1vdmUoY3VycmVudCk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGVXaXRoUmVtb3ZlcihMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPFN0cmluZz4oYywgdGhpcy5idWlsZFJlbW92ZXIoYykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lTGlzdEl0ZXJhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YmEyZWQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lTGlzdEl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBMaXZlQ2xvbmVJdGVyYWJsZVRlc3RzIHsKLQotCXB1YmxpYyBMaXZlQ2xvbmVMaXN0SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscygidHdvIikpIHsKLQkJCQlpdGVyYXRvci5hZGQoYWRkZWQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoY29sbGVjdGlvbi5jb250YWlucyhhZGRlZCkpOwotCQkvLyAibGl2ZSIgY2xvbmUgaXRlcmFibGUgd2lsbCBjb250YWluIHRoZSBlbGVtZW50IGFkZGVkIHRvIHRoZQotCQkvLyBvcmlnaW5hbCBjb2xsZWN0aW9uCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pc3NpbmdNdXRhdG9yQWRkKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoY29sbGVjdGlvbik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5pdGVyYWJsZS50b1N0cmluZygpKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IuYWRkKGFkZGVkKTsKLQkJCQkJZmFpbCgpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscygidHdvIikpIHsKLQkJCQlpdGVyYXRvci5zZXQoYWRkZWQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoY29sbGVjdGlvbi5jb250YWlucyhhZGRlZCkpOwotCQlhc3NlcnRGYWxzZShjb2xsZWN0aW9uLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCS8vICJsaXZlIiBjbG9uZSBpdGVyYWJsZSB3aWxsIGNvbnRhaW4gdGhlIGVsZW1lbnQgYWRkZWQgdG8gdGhlCi0JCS8vIG9yaWdpbmFsIGNvbGxlY3Rpb24KLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgYWRkZWQpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsICJ0d28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pc3NpbmdNdXRhdG9yU2V0KCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoY29sbGVjdGlvbik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5pdGVyYWJsZS50b1N0cmluZygpKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3Iuc2V0KGFkZGVkKTsKLQkJCQkJZmFpbCgpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoTGlzdDxTdHJpbmc+IGMpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPihjKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShmaW5hbCBMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBhZGQoaW50IGluZGV4LCBTdHJpbmcgZWxlbWVudCkgewotCQkJCQljLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQkJYy5yZW1vdmUoaW5kZXgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXQoaW50IGluZGV4LCBTdHJpbmcgZWxlbWVudCkgewotCQkJCQljLnNldChpbmRleCwgZWxlbWVudCk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGVXaXRoUmVtb3ZlcihMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGMsIHRoaXMuYnVpbGRNdXRhdG9yKGMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1BlZWthYmxlSXRlcmFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUGVla2FibGVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExODE4NGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUGVla2FibGVJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5QZWVrYWJsZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5QZWVrYWJsZUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZWVrYWJsZUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUGVla2FibGVJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJUGVla2FibGVJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZEl0ZXJhYmxlKCk7Ci0JCVBlZWthYmxlSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IGl0ZXJhYmxlLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgaXRlcmF0b3IucGVlaygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZEl0ZXJhYmxlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBQZWVrYWJsZUl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBQZWVrYWJsZUl0ZXJhYmxlPFN0cmluZz4odGhpcy5idWlsZE5lc3RlZEl0ZXJhYmxlKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBidWlsZEFycmF5KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsib25lIiwgInR3byIsICJ0aHJlZSJ9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUXVldWVJdGVyYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9RdWV1ZUl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmYmIxOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9RdWV1ZUl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlF1ZXVlSXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFF1ZXVlSXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBRdWV1ZUl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZEl0ZXJhYmxlKCk7Ci0JCWZvciAoU3RyaW5nIHMgOiBpdGVyYWJsZSkgewotCQkJYXNzZXJ0Tm90TnVsbChzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmJ1aWxkSXRlcmFibGUoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBRdWV1ZUl0ZXJhYmxlPFN0cmluZz4odGhpcy5idWlsZFF1ZXVlKCkpOwotCX0KLQotCXByaXZhdGUgUXVldWU8U3RyaW5nPiBidWlsZFF1ZXVlKCkgewotCQlRdWV1ZTxTdHJpbmc+IHEgPSBuZXcgU2ltcGxlUXVldWU8U3RyaW5nPigpOwotCQlxLmVucXVldWUoImZvbyIpOwotCQlxLmVucXVldWUoImJhciIpOwotCQlxLmVucXVldWUoImJheiIpOwotCQlyZXR1cm4gcTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUxOGFiOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RMaXN0SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gbGkxID0gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPihjMSk7Ci0KLQkJTGlzdDxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCQlMaXN0SXRlcmFibGU8U3RyaW5nPiBsaTIgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMyKTsKLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPihsaTEsIGxpMik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4dHJhRWxlbWVudDEoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gbGkxID0gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPihjMSk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPihsaTEsICI0Iik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4dHJhRWxlbWVudDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCQlMaXN0SXRlcmFibGU8U3RyaW5nPiBsaTEgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMxKTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTxTdHJpbmc+KCIwIiwgbGkxKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbk9mSXRlcmFibGVzKCkgewotCQlMaXN0PFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0JCUxpc3RJdGVyYWJsZTxTdHJpbmc+IGxpMSA9IG5ldyBMaXN0TGlzdEl0ZXJhYmxlPFN0cmluZz4oYzEpOwotCi0JCUxpc3Q8U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoIjQiKTsKLQkJYzIuYWRkKCI1Iik7Ci0JCWMyLmFkZCgiNiIpOwotCQljMi5hZGQoIjciKTsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gbGkyID0gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPihjMik7Ci0KLQkJTGlzdDxMaXN0SXRlcmFibGU8U3RyaW5nPj4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8TGlzdEl0ZXJhYmxlPFN0cmluZz4+KCk7Ci0JCWNvbGxlY3Rpb24uYWRkKGxpMSk7Ci0JCWNvbGxlY3Rpb24uYWRkKGxpMik7Ci0JCUxpc3RJdGVyYWJsZTxMaXN0SXRlcmFibGU8U3RyaW5nPj4gbGkgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxMaXN0SXRlcmFibGU8U3RyaW5nPj4oY29sbGVjdGlvbik7Ci0JCQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGxpKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gbGkxID0gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPihjMSk7Ci0KLQkJTGlzdDxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCQlMaXN0SXRlcmFibGU8U3RyaW5nPiBsaTIgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMyKTsKLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPihsaTEsIGxpMik7Ci0JCWFzc2VydE5vdE51bGwoY29tcG9zaXRlLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlJdGVyYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmMmI3OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuUmVhZE9ubHlJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFJlYWRPbmx5SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVmVjdG9yKCkuaXRlcmF0b3IoKTsKLQkJZm9yIChTdHJpbmcgcyA6IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhYmxlKCkpIHsKLQkJCWFzc2VydEVxdWFscyhuZXN0ZWRJdGVyYXRvci5uZXh0KCksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmFibGUoKS5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhYmxlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkUmVhZE9ubHlJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhYmxlPFN0cmluZz4odGhpcy5idWlsZFZlY3RvcigpKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkVmVjdG9yKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXYuYWRkRWxlbWVudCgib25lIik7Ci0JCXYuYWRkRWxlbWVudCgidHdvIik7Ci0JCXYuYWRkRWxlbWVudCgidGhyZWUiKTsKLQkJdi5hZGRFbGVtZW50KCJmb3VyIik7Ci0JCXYuYWRkRWxlbWVudCgiZml2ZSIpOwotCQl2LmFkZEVsZW1lbnQoInNpeCIpOwotCQl2LmFkZEVsZW1lbnQoInNldmVuIik7Ci0JCXYuYWRkRWxlbWVudCgiZWlnaHQiKTsKLQkJcmV0dXJuIHY7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUxpc3RJdGVyYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYmI2ZTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlMaXN0SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlJlYWRPbmx5TGlzdEl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWFkT25seUxpc3RJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFJlYWRPbmx5TGlzdEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZFZlY3RvcigpLml0ZXJhdG9yKCk7Ci0JCWZvciAoU3RyaW5nIHMgOiB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmFibGUoKSkgewotCQkJYXNzZXJ0RXF1YWxzKG5lc3RlZEl0ZXJhdG9yLm5leHQoKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmFibGUoKS5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYWJsZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZFJlYWRPbmx5TGlzdEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhYmxlPFN0cmluZz4odGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYWJsZSgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkTmVzdGVkTGlzdEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkVmVjdG9yKCkpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRWZWN0b3IoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdi5hZGRFbGVtZW50KCJvbmUiKTsKLQkJdi5hZGRFbGVtZW50KCJ0d28iKTsKLQkJdi5hZGRFbGVtZW50KCJ0aHJlZSIpOwotCQl2LmFkZEVsZW1lbnQoImZvdXIiKTsKLQkJdi5hZGRFbGVtZW50KCJmaXZlIik7Ci0JCXYuYWRkRWxlbWVudCgic2l4Iik7Ci0JCXYuYWRkRWxlbWVudCgic2V2ZW4iKTsKLQkJdi5hZGRFbGVtZW50KCJlaWdodCIpOwotCQlyZXR1cm4gdjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRJdGVyYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzg3MzdlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbmdsZUVsZW1lbnRJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFNpbmdsZUVsZW1lbnRJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJZm9yIChTdHJpbmcgcyA6IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmFibGUoKSkgewotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc2luZ2xlRWxlbWVudCgpLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYWJsZSgpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzdHJpbmcpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYWJsZSgpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKHRoaXMuc2luZ2xlRWxlbWVudCgpKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRTaW5nbGVFbGVtZW50SXRlcmFibGUoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFN0cmluZz4odGhpcy5zaW5nbGVFbGVtZW50KCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgc2luZ2xlRWxlbWVudCgpIHsKLQkJcmV0dXJuICJzaW5nbGUgZWxlbWVudCI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlMTlmOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlmb3IgKFN0cmluZyBzIDogdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUoKSkgewotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc2luZ2xlRWxlbWVudCgpLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUoKS5pdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyaW5nKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlKCkuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHModGhpcy5zaW5nbGVFbGVtZW50KCkpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBidWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxTdHJpbmc+KHRoaXMuc2luZ2xlRWxlbWVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNpbmdsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiAic2luZ2xlIGVsZW1lbnQiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVJdGVyYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TbmFwc2hvdENsb25lSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDE4N2E4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TbmFwc2hvdENsb25lSXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNuYXBzaG90Q2xvbmVJdGVyYWJsZVRlc3RzIGV4dGVuZHMgQ2xvbmVJdGVyYWJsZVRlc3RzIHsKLQotCXB1YmxpYyBTbmFwc2hvdENsb25lSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCXN1cGVyLnRlc3RJdGVyYXRvcigpOwotCQkvLyAic25hcHNob3QiIGl0ZXJhYmxlIHNob3VsZCBzdGlsbCByZXR1cm4gNCBzdHJpbmdzIChzaW5jZSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbiB3YXMgY2xvbmVkKQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiB0aGlzLml0ZXJhYmxlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDQsIGkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCXN1cGVyLnRlc3RSZW1vdmUoKTsKLQkJLy8gInNuYXBzaG90IiBjbG9uZSBpdGVyYWJsZSB3aWxsIHN0aWxsIGNvbnRhaW4gdGhlIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIHRoZQotCQkvLyBvcmlnaW5hbCBjb2xsZWN0aW9uCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsICJ0aHJlZSIpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlcigpIHsKLQkJc3VwZXIudGVzdFJlbW92ZXIoKTsKLQkJLy8gInNuYXBzaG90IiBjbG9uZSBpdGVyYWJsZSB3aWxsIHN0aWxsIGNvbnRhaW4gdGhlIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIHRoZQotCQkvLyBvcmlnaW5hbCBjb2xsZWN0aW9uCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsICJ0aHJlZSIpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoTGlzdDxTdHJpbmc+IGMpIHsKLQkJcmV0dXJuIG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGU8U3RyaW5nPihjKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShmaW5hbCBMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxTdHJpbmc+KGMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoU3RyaW5nIGN1cnJlbnQpIHsKLQkJCQkJYy5yZW1vdmUoY3VycmVudCk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGVXaXRoUmVtb3ZlcihMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxTdHJpbmc+KGMsIHRoaXMuYnVpbGRSZW1vdmVyKGMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNjY3MGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBTbmFwc2hvdENsb25lSXRlcmFibGVUZXN0cyB7Ci0KLQlwdWJsaWMgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRSZW1vdmluZ0l0ZXJhYmxlKGNvbGxlY3Rpb24pOwotCi0JCVN0cmluZyBhZGRlZCA9ICJ4eHh4IjsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKCJ0d28iKSkgewotCQkJCWl0ZXJhdG9yLmFkZChhZGRlZCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShjb2xsZWN0aW9uLmNvbnRhaW5zKGFkZGVkKSk7Ci0JCS8vICJzbmFwc2hvdCIgY2xvbmUgaXRlcmFibGUgbm90IHdpbGwgY29udGFpbiB0aGUgZWxlbWVudCBhZGRlZCB0byB0aGUKLQkJLy8gb3JpZ2luYWwgY29sbGVjdGlvbgotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgYWRkZWQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ011dGF0b3JBZGQoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLml0ZXJhYmxlLnRvU3RyaW5nKCkpOwotCi0JCVN0cmluZyBhZGRlZCA9ICJ4eHh4IjsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGl0ZXJhdG9yLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlpdGVyYXRvci5hZGQoYWRkZWQpOwotCQkJCQlmYWlsKCk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRSZW1vdmluZ0l0ZXJhYmxlKGNvbGxlY3Rpb24pOwotCi0JCVN0cmluZyBhZGRlZCA9ICJ4eHh4IjsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsICJ0d28iKSk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKCJ0d28iKSkgewotCQkJCWl0ZXJhdG9yLnNldChhZGRlZCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShjb2xsZWN0aW9uLmNvbnRhaW5zKGFkZGVkKSk7Ci0JCWFzc2VydEZhbHNlKGNvbGxlY3Rpb24uY29udGFpbnMoInR3byIpKTsKLQkJLy8gInNuYXBzaG90IiBjbG9uZSBpdGVyYWJsZSB3aWxsIG5vdCBiZSBjaGFuZ2VkCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCAidHdvIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nTXV0YXRvclNldCgpIHsKLQkJZmluYWwgTGlzdDxTdHJpbmc+IGNvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQl0aGlzLml0ZXJhYmxlID0gdGhpcy5idWlsZEl0ZXJhYmxlKGNvbGxlY3Rpb24pOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuaXRlcmFibGUudG9TdHJpbmcoKSk7Ci0KLQkJU3RyaW5nIGFkZGVkID0gInh4eHgiOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgYWRkZWQpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCWl0ZXJhdG9yLnNldChhZGRlZCk7Ci0JCQkJCWZhaWwoKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKExpc3Q8U3RyaW5nPiBjKSB7Ci0JCXJldHVybiBuZXcgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGMpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhYmxlPFN0cmluZz4gYnVpbGRSZW1vdmluZ0l0ZXJhYmxlKGZpbmFsIExpc3Q8U3RyaW5nPiBjKSB7Ci0JCXJldHVybiBuZXcgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBhZGQoaW50IGluZGV4LCBTdHJpbmcgZWxlbWVudCkgewotCQkJCQljLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQkJYy5yZW1vdmUoaW5kZXgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXQoaW50IGluZGV4LCBTdHJpbmcgZWxlbWVudCkgewotCQkJCQljLnNldChpbmRleCwgZWxlbWVudCk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGVXaXRoUmVtb3ZlcihMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPihjLCB0aGlzLmJ1aWxkTXV0YXRvcihjKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TdGFja0l0ZXJhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1N0YWNrSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTA4OTUwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1N0YWNrSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3RhY2tJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3RhY2tJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFN0YWNrSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkSXRlcmFibGUoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInRocmVlIiwgaXRlcmF0b3IubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBpdGVyYXRvci5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGl0ZXJhdG9yLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRJdGVyYWJsZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IFN0YWNrSXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkU3RhY2soKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdGFjazxTdHJpbmc+IGJ1aWxkU3RhY2soKSB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSBuZXcgU2ltcGxlU3RhY2s8U3RyaW5nPigpOwotCQlzdGFjay5wdXNoKCJvbmUiKTsKLQkJc3RhY2sucHVzaCgidHdvIik7Ci0JCXN0YWNrLnB1c2goInRocmVlIik7Ci0JCXJldHVybiBzdGFjazsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1N1cGVySXRlcmFibGVXcmFwcGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1N1cGVySXRlcmFibGVXcmFwcGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2Yjc2Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TdXBlckl0ZXJhYmxlV3JhcHBlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1cGVySXRlcmFibGVXcmFwcGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTdXBlckl0ZXJhYmxlV3JhcHBlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFN1cGVySXRlcmFibGVXcmFwcGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJmb28iKTsKLQkJbGlzdC5hZGQoImJhciIpOwotCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCVN0cmluZyBjb25jYXQgPSAiIjsKLQkJZm9yIChTdHJpbmcgcyA6IGxpc3QpIHsKLQkJCWNvbmNhdCArPSBzOwotCQl9Ci0JCWFzc2VydEVxdWFscygiZm9vYmFyYmF6IiwgY29uY2F0KTsKLQotCQlJdGVyYWJsZTxPYmplY3Q+IGl0ZXJhYmxlID0gbmV3IFN1cGVySXRlcmFibGVXcmFwcGVyPE9iamVjdD4obGlzdCk7Ci0JCWNvbmNhdCA9ICIiOwotCQlmb3IgKE9iamVjdCBzIDogaXRlcmFibGUpIHsKLQkJCWNvbmNhdCArPSBzOwotCQl9Ci0JCWFzc2VydEVxdWFscygiZm9vYmFyYmF6IiwgY29uY2F0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCUl0ZXJhYmxlPE9iamVjdD4gaXRlcmFibGUgPSBuZXcgU3VwZXJJdGVyYWJsZVdyYXBwZXI8T2JqZWN0PihDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwoaXRlcmFibGUudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1RyYW5zZm9ybWF0aW9uSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTE5NDJkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1RyYW5zZm9ybWF0aW9uSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm0xKCkgewotCQlpbnQgaSA9IDE7Ci0JCWZvciAoSW50ZWdlciBpbnRlZ2VyIDogdGhpcy5idWlsZEl0ZXJhYmxlMSgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBpbnRlZ2VyLmludFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJbnRlZ2VyPiBidWlsZEl0ZXJhYmxlMSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlMSh0aGlzLmJ1aWxkTmVzdGVkSXRlcmFibGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWF0aW9uSXRlcmFibGUxKEl0ZXJhYmxlPFN0cmluZz4gbmVzdGVkSXRlcmFibGUpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYWJsZSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybTIoKSB7Ci0JCWludCBpID0gMTsKLQkJZm9yIChJbnRlZ2VyIGludGVnZXIgOiB0aGlzLmJ1aWxkSXRlcmFibGUyKCkpIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIGludGVnZXIuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEludGVnZXI+IGJ1aWxkSXRlcmFibGUyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uSXRlcmFibGUyKHRoaXMuYnVpbGROZXN0ZWRJdGVyYWJsZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtYXRpb25JdGVyYWJsZTIoSXRlcmFibGU8U3RyaW5nPiBuZXN0ZWRJdGVyYWJsZSkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIEludGVnZXI+KG5lc3RlZEl0ZXJhYmxlLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+KCkgewotCQkJcHVibGljIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhYmxlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiMSIpOwotCQljLmFkZCgiMjIiKTsKLQkJYy5hZGQoIjMzMyIpOwotCQljLmFkZCgiNDQ0NCIpOwotCQljLmFkZCgiNTU1NTUiKTsKLQkJYy5hZGQoIjY2NjY2NiIpOwotCQljLmFkZCgiNzc3Nzc3NyIpOwotCQljLmFkZCgiODg4ODg4ODgiKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRJdGVyYWJsZTEoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1RyYW5zZm9ybWVyKCkgewotCQlJdGVyYWJsZTxJbnRlZ2VyPiBpdGVyYWJsZSA9IG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgSW50ZWdlcj4odGhpcy5idWlsZE5lc3RlZEl0ZXJhYmxlKCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpbnQgaSA9IDE7Ci0JCQlmb3IgKEludGVnZXIgaW50ZWdlciA6IGl0ZXJhYmxlKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKGkrKywgaW50ZWdlci5pbnRWYWx1ZSgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODRiY2M4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1RyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmb3JtMSgpIHsKLQkJaW50IGkgPSAxOwotCQlmb3IgKEludGVnZXIgaW50ZWdlciA6IHRoaXMuYnVpbGRJdGVyYWJsZTEoKSkgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgaW50ZWdlci5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8SW50ZWdlcj4gYnVpbGRJdGVyYWJsZTEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUxKHRoaXMuYnVpbGROZXN0ZWRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8SW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTEoTGlzdDxTdHJpbmc+IG5lc3RlZExpc3QpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlPFN0cmluZywgSW50ZWdlcj4obmVzdGVkTGlzdCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybTIoKSB7Ci0JCWludCBpID0gMTsKLQkJZm9yIChJbnRlZ2VyIGludGVnZXIgOiB0aGlzLmJ1aWxkSXRlcmFibGUyKCkpIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIGludGVnZXIuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEludGVnZXI+IGJ1aWxkSXRlcmFibGUyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlMih0aGlzLmJ1aWxkTmVzdGVkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUyKExpc3Q8U3RyaW5nPiBuZXN0ZWRMaXN0KSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTxTdHJpbmcsIEludGVnZXI+KG5lc3RlZExpc3QsIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4oKSB7Ci0JCQlwdWJsaWMgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGROZXN0ZWRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiMSIpOwotCQljLmFkZCgiMjIiKTsKLQkJYy5hZGQoIjMzMyIpOwotCQljLmFkZCgiNDQ0NCIpOwotCQljLmFkZCgiNTU1NTUiKTsKLQkJYy5hZGQoIjY2NjY2NiIpOwotCQljLmFkZCgiNzc3Nzc3NyIpOwotCQljLmFkZCgiODg4ODg4ODgiKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRJdGVyYWJsZTEoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1RyYW5zZm9ybWVyKCkgewotCQlJdGVyYWJsZTxJbnRlZ2VyPiBpdGVyYWJsZSA9IG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTxTdHJpbmcsIEludGVnZXI+KHRoaXMuYnVpbGROZXN0ZWRMaXN0KCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpbnQgaSA9IDE7Ci0JCQlmb3IgKEludGVnZXIgaW50ZWdlciA6IGl0ZXJhYmxlKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKGkrKywgaW50ZWdlci5pbnRWYWx1ZSgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJlZUl0ZXJhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1RyZWVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMWM0NDAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJlZUl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyZWVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJlZUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqIHRoaXMgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhbGwgdGhlIG5vZGVzIGNyZWF0ZWQgZm9yIHRoZSB0ZXN0ICovCi0JQ29sbGVjdGlvbjxUcmVlTm9kZT4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlPigpOwotCi0JcHVibGljIFRyZWVJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IxKCkgewotCQlmb3IgKFRyZWVOb2RlIHRuIDogdGhpcy5idWlsZFRyZWVJdGVyYWJsZTEoKSkgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVzLmNvbnRhaW5zKHRuKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IyKCkgewotCQlmb3IgKFRyZWVOb2RlIHRuIDogdGhpcy5idWlsZFRyZWVJdGVyYWJsZTIoKSkgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVzLmNvbnRhaW5zKHRuKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlkd2lmZTEoKSB7Ci0JCWZvciAoVHJlZU5vZGUgdG4gOiBuZXcgVHJlZUl0ZXJhYmxlPFRyZWVOb2RlPih0aGlzLmJ1aWxkVHJlZSgpLCB0aGlzLmJ1aWxkTWlkd2lmZSgpKSkgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVzLmNvbnRhaW5zKHRuKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlkd2lmZTIoKSB7Ci0JCWZvciAoVHJlZU5vZGUgdG4gOiBuZXcgVHJlZUl0ZXJhYmxlPFRyZWVOb2RlPihuZXcgVHJlZU5vZGVbXSB7IHRoaXMuYnVpbGRUcmVlKCkgfSwgdGhpcy5idWlsZE1pZHdpZmUoKSkpIHsKLQkJCWFzc2VydFRydWUodGhpcy5ub2Rlcy5jb250YWlucyh0bikpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRUcmVlSXRlcmFibGUxKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pc3NpbmdNaWR3aWZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlmb3IgKFRyZWVOb2RlIHRuIDogbmV3IFRyZWVJdGVyYWJsZTxUcmVlTm9kZT4odGhpcy5idWlsZFRyZWUoKSkpIHsKLQkJCQlhc3NlcnRUcnVlKHRoaXMubm9kZXMuY29udGFpbnModG4pKTsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8VHJlZU5vZGU+IGJ1aWxkVHJlZUl0ZXJhYmxlMSgpIHsKLQkJcmV0dXJuIG5ldyBUcmVlSXRlcmFibGU8VHJlZU5vZGU+KHRoaXMuYnVpbGRUcmVlKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFRyZWVOb2RlPiBjaGlsZHJlbihUcmVlTm9kZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuY2hpbGRyZW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFRyZWVOb2RlPiBidWlsZFRyZWVJdGVyYWJsZTIoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUl0ZXJhYmxlPFRyZWVOb2RlPihuZXcgVHJlZU5vZGVbXSB7IHRoaXMuYnVpbGRUcmVlKCkgfSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKFRyZWVOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8VHJlZU5vZGU+IGJ1aWxkTWlkd2lmZSgpIHsKLQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3IuTWlkd2lmZTxUcmVlTm9kZT4oKSB7Ci0JCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKFRyZWVOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJlZU5vZGUgYnVpbGRUcmVlKCkgewotCQlUcmVlTm9kZSByb290ID0gbmV3IFRyZWVOb2RlKCJyb290Iik7Ci0JCVRyZWVOb2RlIGNoaWxkMSA9IG5ldyBUcmVlTm9kZShyb290LCAiY2hpbGQgMSIpOwotCQluZXcgVHJlZU5vZGUoY2hpbGQxLCAiZ3JhbmRjaGlsZCAxQSIpOwotCQlUcmVlTm9kZSBjaGlsZDIgPSBuZXcgVHJlZU5vZGUocm9vdCwgImNoaWxkIDIiKTsKLQkJbmV3IFRyZWVOb2RlKGNoaWxkMiwgImdyYW5kY2hpbGQgMkEiKTsKLQkJVHJlZU5vZGUgZ3JhbmRjaGlsZDJCID0gbmV3IFRyZWVOb2RlKGNoaWxkMiwgImdyYW5kY2hpbGQgMkIiKTsKLQkJbmV3IFRyZWVOb2RlKGdyYW5kY2hpbGQyQiwgImdyZWF0LWdyYW5kY2hpbGQgMkIxIik7Ci0JCW5ldyBUcmVlTm9kZShncmFuZGNoaWxkMkIsICJncmVhdC1ncmFuZGNoaWxkIDJCMiIpOwotCQlUcmVlTm9kZSBncmFuZGNoaWxkMkMgPSBuZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQyIpOwotCQluZXcgVHJlZU5vZGUoZ3JhbmRjaGlsZDJDLCAiZ3JlYXQtZ3JhbmRjaGlsZCAyQzEiKTsKLQkJbmV3IFRyZWVOb2RlKHJvb3QsICJjaGlsZCAzIik7Ci0JCXJldHVybiByb290OwotCX0KLQotCXB1YmxpYyBjbGFzcyBUcmVlTm9kZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxUcmVlTm9kZT4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlPigpOwotCi0JCXB1YmxpYyBUcmVlTm9kZShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCVRyZWVJdGVyYWJsZVRlc3RzLnRoaXMubm9kZXMuYWRkKHRoaXMpOyAvLyBsb2cgbm9kZQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBUcmVlTm9kZShUcmVlTm9kZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzKG5hbWUpOwotCQkJcGFyZW50LmFkZENoaWxkKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRDaGlsZChUcmVlTm9kZSBjaGlsZCkgewotCQkJdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPFRyZWVOb2RlPiBjaGlsZHJlbigpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLnNpemUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUcmVlTm9kZSgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTlkODhkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXJyYXlJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEFycmF5SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZEFycmF5KCkubGVuZ3RoLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJaW50IGkgPSAxOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgaSsrLCBJbnRlZ2VyLnBhcnNlSW50KHN0cmVhbS5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCIzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigtMSwgMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbig4LCAxKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIC0xKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIDkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmljcygpIHsKLQkJSW50ZWdlcltdIGludGVnZXJzID0gbmV3IEludGVnZXJbM107Ci0JCWludGVnZXJzWzBdID0gbmV3IEludGVnZXIoMCk7Ci0JCWludGVnZXJzWzFdID0gbmV3IEludGVnZXIoMSk7Ci0JCWludGVnZXJzWzJdID0gbmV3IEludGVnZXIoMik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxOdW1iZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRHZW5lcmljSXRlcmF0b3IoaW50ZWdlcnMpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoaW50ZWdlcnMubGVuZ3RoLCBpKTsKLQl9Ci0KLQlJdGVyYXRvcjxOdW1iZXI+IGJ1aWxkR2VuZXJpY0l0ZXJhdG9yKEludGVnZXJbXSBpbnRlZ2VycykgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8TnVtYmVyPihpbnRlZ2Vycyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhcmFyZ3MoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxOdW1iZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRWYXJBcmdJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMywgaSk7Ci0JfQotCi0JSXRlcmF0b3I8TnVtYmVyPiBidWlsZFZhckFyZ0l0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8TnVtYmVyPihuZXcgSW50ZWdlcigwKSwgbmV3IEludGVnZXIoMSksIG5ldyBJbnRlZ2VyKDIpKTsKLQl9Ci0KLQl2b2lkIHRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKHN0YXJ0LCBsZW5ndGgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmVhbSwgZXhDYXVnaHQpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYXRvcih0aGlzLmJ1aWxkQXJyYXkoKSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGFycmF5KTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmF0b3IodGhpcy5idWlsZEFycmF5KCksIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcihTdHJpbmdbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlTdHJpbmdbXSBidWlsZEFycmF5KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIgfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY4NWI2Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXJyYXlMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIEFycmF5SXRlcmF0b3JUZXN0cyB7Ci0KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkQXJyYXkoKS5sZW5ndGgsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlpbnQgaSA9IHRoaXMuYnVpbGRBcnJheSgpLmxlbmd0aDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBpLS0sIEludGVnZXIucGFyc2VJbnQoc3RyZWFtLnByZXZpb3VzKCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXgoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uQWRkKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCIzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uYWRkKCIzLjUiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uU2V0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCIzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uc2V0KCJ0aHJlZSIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYXRvcjxOdW1iZXI+IGJ1aWxkR2VuZXJpY0l0ZXJhdG9yKEludGVnZXJbXSBpbnRlZ2VycykgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPE51bWJlcj4oaW50ZWdlcnMpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhdG9yPE51bWJlcj4gYnVpbGRWYXJBcmdJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxOdW1iZXI+KG5ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoMikpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKHRoaXMuYnVpbGRBcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTGlzdEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8U3RyaW5nPihhcnJheSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8U3RyaW5nPihhcnJheSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxTdHJpbmc+KGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2hhaW5JdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZDZjZWUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2hhaW5JdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DaGFpbkl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDaGFpbkl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ2xhc3M8Pz5bXSBWRUNUT1JfSElFUkFSQ0hZID0geyBWZWN0b3IuY2xhc3MsIEFic3RyYWN0TGlzdC5jbGFzcywgQWJzdHJhY3RDb2xsZWN0aW9uLmNsYXNzLCBPYmplY3QuY2xhc3MgfTsKLQotCXB1YmxpYyBDaGFpbkl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxDbGFzczw/Pj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhWRUNUT1JfSElFUkFSQ0hZLmxlbmd0aCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVySGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPENsYXNzPD8+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoVkVDVE9SX0hJRVJBUkNIWS5sZW5ndGgsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgbGluayIsIFZFQ1RPUl9ISUVSQVJDSFlbaV0sIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVyTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPENsYXNzPD8+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgbGluayIsIFZFQ1RPUl9ISUVSQVJDSFlbaV0sIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlDbGFzczw/PiBqYXZhQ2xhc3MgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJamF2YUNsYXNzID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJamF2YUNsYXNzID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGphdmFDbGFzcywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPENsYXNzPD8+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpID09IEFic3RyYWN0Q29sbGVjdGlvbi5jbGFzcykgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxDbGFzczw/Pj4gYnVpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDaGFpbkl0ZXJhdG9yKFZlY3Rvci5jbGFzcywgdGhpcy5idWlsZExpbmtlcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPENsYXNzPD8+PiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJDaGFpbkl0ZXJhdG9yKFZlY3Rvci5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxDbGFzczw/Pj4gYnVpbGRDaGFpbkl0ZXJhdG9yKENsYXNzPD8+IHN0YXJ0TGluaywgQ2hhaW5JdGVyYXRvci5MaW5rZXI8Q2xhc3M8Pz4+IGxpbmtlcikgewotCQlyZXR1cm4gbmV3IENoYWluSXRlcmF0b3I8Q2xhc3M8Pz4+KHN0YXJ0TGluaywgbGlua2VyKTsKLQl9Ci0KLQlwcml2YXRlIENoYWluSXRlcmF0b3IuTGlua2VyPENsYXNzPD8+PiBidWlsZExpbmtlcigpIHsKLQkJLy8gY2hhaW4gdXAgdGhlIGNsYXNzJ3MgaGllcmFyY2h5Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvci5MaW5rZXI8Q2xhc3M8Pz4+KCkgewotCQkJcHVibGljIENsYXNzPD8+IG5leHRMaW5rKENsYXNzPD8+IGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIGN1cnJlbnRMaW5rLmdldFN1cGVyY2xhc3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPENsYXNzPD8+PiBidWlsZElubmVyQ2hhaW5JdGVyYXRvcihDbGFzczw/PiBzdGFydExpbmspIHsKLQkJLy8gY2hhaW4gdXAgdGhlIGNsYXNzJ3MgaGllcmFyY2h5Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvcjxDbGFzczw/Pj4oc3RhcnRMaW5rKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDbGFzczw/PiBuZXh0TGluayhDbGFzczw/PiBjdXJyZW50TGluaykgewotCQkJCXJldHVybiBjdXJyZW50TGluay5nZXRTdXBlcmNsYXNzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFpbkl0ZXJhdG9yKCkgewotCQkvLyBtaXNzaW5nIG1ldGhvZCBvdmVycmlkZQotCQlJdGVyYXRvcjxDbGFzczw/Pj4gaXRlcmF0b3IgPSBuZXcgQ2hhaW5JdGVyYXRvcjxDbGFzczw/Pj4oVmVjdG9yLmNsYXNzKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ2xhc3M8Pz4gYyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoImludmFsaWQgY2xhc3M6ICIgKyBjLmdldE5hbWUoKSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0OGNjNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLk11bHRpVGhyZWFkZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENsb25lSXRlcmF0b3JUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JQ29sbGVjdGlvbjxTdHJpbmc+IG9yaWdpbmFsQ29sbGVjdGlvbjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGNvbmN1cnJlbnRDb2xsZWN0aW9uOwotCi0JcHVibGljIENsb25lSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBvcmlnaW5hbFNpemUgPSB0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5zaXplKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJLy8gc2hvdWxkIGFsbG93IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCi0JCQl0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydFRydWUob3JpZ2luYWxTaXplICE9IHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbFNpemUsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRGVmYXVsdCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsaW1pbmF0b3IoKSB7Ci0JCUNsb25lSXRlcmF0b3IuUmVtb3ZlcjxTdHJpbmc+IGVsaW1pbmF0b3IgPSBuZXcgQ2xvbmVJdGVyYXRvci5SZW1vdmVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGVsZW1lbnQpIHsKLQkJCQlDbG9uZUl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbENvbGxlY3Rpb24ucmVtb3ZlKGVsZW1lbnQpOwotCQkJfQotCQl9OwotCQl0aGlzLnZlcmlmeVJlbW92ZShuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLCBlbGltaW5hdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVN1YmNsYXNzKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZShuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShTdHJpbmcgY3VycmVudCkgewotCQkJCUNsb25lSXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5yZW1vdmUoY3VycmVudCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFRlc3QgY29uY3VycmVudCBhY2Nlc3M6IEZpcnN0IGJ1aWxkIGEgY2xvbmUgaXRlcmF0b3IgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKLQkgKiB0aGF0IGhhbmdzIG1vbWVudGFyaWx5IGR1cmluZyBpdHMgY29uc3RydWN0aW9uOyB0aGVuIG1vZGlmeSB0aGUgc2hhcmVkCi0JICogY29sbGVjdGlvbiBpbiB0aGlzIHRocmVhZC4gVGhpcyB3b3VsZCBjYXVzZSBhCi0JICogQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpbiB0aGUgb3RoZXIgdGhyZWFkIGlmIHRoZSBjbG9uZSBpdGVyYXRvcgotCSAqIHdlcmUgbm90IHN5bmNocm9uaXplZCBvbiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY3VycmVudEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTbG93Q29sbGVjdGlvbjxTdHJpbmc+IHNsb3cgPSBuZXcgU2xvd0NvbGxlY3Rpb248U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihzbG93KTsKLQkJLy8gdXNpbmcgdGhlIHVuc3luY2hyb25pemVkIGNvbGxlY3Rpb24gd2lsbCBjYXVzZSB0aGUgdGVzdCB0byBmYWlsCi0JCS8vCQl0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbiA9IHNsb3c7Ci0JCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkQ29sbGVjdGlvbihzbG93KTsKLQotCQl0aGlzLmNvbmN1cnJlbnRDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVRocmVhZCB0aHJlYWQgPSB0aGlzLmJ1aWxkVGhyZWFkKHRoaXMuYnVpbGRSdW5uYWJsZSgpKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCXdoaWxlICggISBzbG93Lmhhc1N0YXJ0ZWRDbG9uZSgpKSB7Ci0JCQkvLyB3YWl0IGZvciB0aGUgb3RoZXIgdGhyZWFkIHRvIHN0YXJ0IHRoZSBjbG9uZS4uLgotCQkJVGhyZWFkLnlpZWxkKCk7Ci0JCX0KLQkJLy8gLi4udGhlbiBzbmVhayBpbiBhbiBleHRyYSBlbGVtZW50Ci0JCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLmFkZCgic2V2ZW50ZWVuIik7Ci0JCXRocmVhZC5qb2luKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgdGhpcy5jb25jdXJyZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RSdW5uYWJsZSgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcnVuXygpIHRocm93cyBUaHJvd2FibGUgewotCQkJCUNsb25lSXRlcmF0b3JUZXN0cy50aGlzLmxvb3BXaXRoQ2xvbmVJdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHVzZSBhIGNsb25lIGl0ZXJhdG9yIHRvIGxvb3Agb3ZlciB0aGUgInNsb3ciIGNvbGxlY3Rpb24gYW5kIGNvcHkgaXRzCi0JICogY29udGVudHMgdG8gdGhlIGNvbmN1cnJlbnQgY29sbGVjdGlvbgotCSAqLwotCXZvaWQgbG9vcFdpdGhDbG9uZUl0ZXJhdG9yKCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXRoaXMuY29uY3VycmVudENvbGxlY3Rpb24uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZShJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCU9iamVjdCByZW1vdmVkID0gInRocmVlIjsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5jb250YWlucyhyZW1vdmVkKSk7Ci0JCS8vIHRyeSB0byByZW1vdmUgYmVmb3JlIGNhbGxpbmcgI25leHQoKQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKHJlbW92ZWQpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJLy8gdHJ5IHRvIHJlbW92ZSB0d2ljZQotCQkJCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RmFsc2UodGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uY29udGFpbnMocmVtb3ZlZCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZENsb25lSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcih0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ2xvbmVJdGVyYXRvcihDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8U3RyaW5nPihjKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZEVtcHR5Q29sbGVjdGlvbigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihjKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZEVtcHR5Q29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxTdHJpbmc+IGMpIHsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgic2l4Iik7Ci0JCWMuYWRkKCJzZXZlbiIpOwotCQljLmFkZCgiZWlnaHQiKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGN1c3RvbSBjb2xsZWN0aW9uICoqKioqKioqKioKLQlzdGF0aWMgY2xhc3MgU2xvd0NvbGxlY3Rpb248RT4gZXh0ZW5kcyBBcnJheUxpc3Q8RT4gewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBib29sZWFuIGhhc1N0YXJ0ZWRDbG9uZSA9IGZhbHNlOwotCi0JCXB1YmxpYyBTbG93Q29sbGVjdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCQl0aGlzLnNldEhhc1N0YXJ0ZWRDbG9uZSh0cnVlKTsKLQkJCS8vIHRha2UgYSBsaXR0bGUgc25vb3plIGJlZm9yZSByZXR1cm5pbmcgdGhlIGFycmF5Ci0JCQlUZXN0VG9vbHMuc2xlZXAoMTAwKTsKLQkJCXJldHVybiBzdXBlci50b0FycmF5KCk7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgdm9pZCBzZXRIYXNTdGFydGVkQ2xvbmUoYm9vbGVhbiBoYXNTdGFydGVkQ2xvbmUpIHsKLQkJCXRoaXMuaGFzU3RhcnRlZENsb25lID0gaGFzU3RhcnRlZENsb25lOwotCQl9Ci0KLQkJc3luY2hyb25pemVkIGJvb2xlYW4gaGFzU3RhcnRlZENsb25lKCkgewotCQkJcmV0dXJuIHRoaXMuaGFzU3RhcnRlZENsb25lOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUxpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YzFjZDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5NdWx0aVRocmVhZGVkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDbG9uZUxpc3RJdGVyYXRvclRlc3RzCi0JZXh0ZW5kcyBNdWx0aVRocmVhZGVkVGVzdENhc2UKLXsKLQlMaXN0PFN0cmluZz4gb3JpZ2luYWxMaXN0OwotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gY29uY3VycmVudExpc3Q7Ci0KLQlwdWJsaWMgQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9yaWdpbmFsTGlzdCA9IHRoaXMuYnVpbGRMaXN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBvcmlnaW5hbFNpemUgPSB0aGlzLm9yaWdpbmFsTGlzdC5zaXplKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQkvLyBzaG91bGQgYWxsb3cgY29uY3VycmVudCBtb2RpZmljYXRpb24KLQkJCXRoaXMub3JpZ2luYWxMaXN0LmFkZCgiZm9vIik7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbFNpemUgIT0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsU2l6ZSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBjbG9uZUxpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNzsgaSsrKSB7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJY2xvbmVMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSwgY2xvbmVMaXN0SXRlcmF0b3IubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCQljbG9uZUxpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSwgY2xvbmVMaXN0SXRlcmF0b3IubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQotCQl3aGlsZSAobmVzdGVkTGlzdEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWNsb25lTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBjbG9uZUxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1ByZXZpb3VzKCkgewotCQlpbnQgb3JpZ2luYWxTaXplID0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpOwotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCXRoaXMub3JpZ2luYWxMaXN0LmFkZCgiZm9vIik7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbFNpemUgIT0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpKTsKLQkJb3JpZ2luYWxTaXplID0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJLy8gc2hvdWxkIGFsbG93IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCi0JCQl0aGlzLm9yaWdpbmFsTGlzdC5hZGQoImJhciIpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydFRydWUob3JpZ2luYWxTaXplICE9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGVmYXVsdCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLmFkZCgidGhyZWUgYW5kIGEgaGFsZiIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnNldCgiYW5vdGhlciB0aHJlZSIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TXV0YXRvck5leHQoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5TmV4dChuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLm9yaWdpbmFsTGlzdCwgdGhpcy5idWlsZE11dGF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNdXRhdG9yUHJldmlvdXMoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5UHJldmlvdXMobmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5vcmlnaW5hbExpc3QsIHRoaXMuYnVpbGRNdXRhdG9yKCkpKTsKLQl9Ci0KLQlwcml2YXRlIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8U3RyaW5nPiBidWlsZE11dGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgU3RyaW5nIG8pIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LmFkZChpbmRleCwgbyk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LnJlbW92ZShpbmRleCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIFN0cmluZyBvKSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsTGlzdC5zZXQoaW5kZXgsIG8pOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdWJjbGFzc05leHQoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5TmV4dCh0aGlzLmJ1aWxkU3ViY2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVN1YmNsYXNzUHJldmlvdXMoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5UHJldmlvdXModGhpcy5idWlsZFN1YmNsYXNzKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRTdWJjbGFzcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxMaXN0KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZChpbnQgY3VycmVudEluZGV4LCBTdHJpbmcgbykgewotCQkJCUNsb25lTGlzdEl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbExpc3QuYWRkKGN1cnJlbnRJbmRleCwgbyk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKGludCBjdXJyZW50SW5kZXgpIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LnJlbW92ZShjdXJyZW50SW5kZXgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldChpbnQgY3VycmVudEluZGV4LCBTdHJpbmcgbykgewotCQkJCUNsb25lTGlzdEl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbExpc3Quc2V0KGN1cnJlbnRJbmRleCwgbyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU1vZGlmeU5leHQoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJU3RyaW5nIHJlbW92ZWQgPSAidGhyZWUiOwotCQlTdHJpbmcgYWRkZWRBZnRlciA9ICJmaXZlIjsKLQkJU3RyaW5nIGFkZGVkID0gImZpdmUgYW5kIGEgaGFsZiI7Ci0JCVN0cmluZyByZXBsYWNlZCA9ICJzZXZlbiI7Ci0JCVN0cmluZyByZXBsYWNlbWVudCA9ICJhbm90aGVyIHNldmVuIjsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZW1vdmVkKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMoYWRkZWRBZnRlcikpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VkKSk7Ci0JCS8vIHRyeSB0byByZW1vdmUgYmVmb3JlIGNhbGxpbmcgI25leHQoKQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQuZXF1YWxzKGFkZGVkQWZ0ZXIpKSB7Ci0JCQkJaXRlcmF0b3IuYWRkKGFkZGVkKTsKLQkJCX0KLQkJCWlmIChuZXh0LmVxdWFscyhyZW1vdmVkKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCS8vIHRyeSB0byByZW1vdmUgdHdpY2UKLQkJCQlleENhdWdodCA9IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQkJfQotCQkJaWYgKG5leHQuZXF1YWxzKHJlcGxhY2VkKSkgewotCQkJCWl0ZXJhdG9yLnNldChyZXBsYWNlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhhZGRlZCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZW1vdmVkKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VkKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVwbGFjZW1lbnQpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TW9kaWZ5UHJldmlvdXMoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJU3RyaW5nIHJlbW92ZWQgPSAidGhyZWUiOwotCQlTdHJpbmcgYWRkZWRCZWZvcmUgPSAiZml2ZSI7Ci0JCVN0cmluZyBhZGRlZCA9ICJmb3VyIGFuZCBhIGhhbGYiOwotCQlTdHJpbmcgcmVwbGFjZWQgPSAic2V2ZW4iOwotCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSAiYW5vdGhlciBzZXZlbiI7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVtb3ZlZCkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKGFkZGVkQmVmb3JlKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVwbGFjZWQpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3QgcHJldmlvdXMgPSBpdGVyYXRvci5wcmV2aW91cygpOwotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhhZGRlZEJlZm9yZSkpIHsKLQkJCQlpdGVyYXRvci5hZGQoYWRkZWQpOwotCQkJfQotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhyZW1vdmVkKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCS8vIHRyeSB0byByZW1vdmUgdHdpY2UKLQkJCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCQl9Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKHJlcGxhY2VkKSkgewotCQkJCWl0ZXJhdG9yLnNldChyZXBsYWNlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhhZGRlZCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZW1vdmVkKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VkKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVwbGFjZW1lbnQpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IodGhpcy5vcmlnaW5hbExpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDbG9uZUxpc3RJdGVyYXRvcihMaXN0PFN0cmluZz4gbGlzdCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4obGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZExpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMub3JpZ2luYWxMaXN0Lmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkRW1wdHlMaXN0KCk7Ci0JCXRoaXMucG9wdWxhdGVMaXN0KGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJvbmUiKTsKLQkJbGlzdC5hZGQoInR3byIpOwotCQlsaXN0LmFkZCgidGhyZWUiKTsKLQkJbGlzdC5hZGQoImZvdXIiKTsKLQkJbGlzdC5hZGQoImZpdmUiKTsKLQkJbGlzdC5hZGQoInNpeCIpOwotCQlsaXN0LmFkZCgic2V2ZW4iKTsKLQkJbGlzdC5hZGQoImVpZ2h0Iik7Ci0JCWxpc3QuYWRkKCJuaW5lIik7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBidWlsZEVtcHR5TGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgY29uY3VycmVudCBhY2Nlc3M6IEZpcnN0IGJ1aWxkIGEgY2xvbmUgaXRlcmF0b3IgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKLQkgKiB0aGF0IGhhbmdzIG1vbWVudGFyaWx5IGR1cmluZyBpdHMgY29uc3RydWN0aW9uOyB0aGVuIG1vZGlmeSB0aGUgc2hhcmVkCi0JICogY29sbGVjdGlvbiBpbiB0aGlzIHRocmVhZC4gVGhpcyB3b3VsZCBjYXVzZSBhCi0JICogQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpbiB0aGUgb3RoZXIgdGhyZWFkIGlmIHRoZSBjbG9uZSBpdGVyYXRvcgotCSAqIHdlcmUgbm90IHN5bmNocm9uaXplZCBvbiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY3VycmVudEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlDbG9uZUl0ZXJhdG9yVGVzdHMuU2xvd0NvbGxlY3Rpb248U3RyaW5nPiBzbG93ID0gbmV3IENsb25lSXRlcmF0b3JUZXN0cy5TbG93Q29sbGVjdGlvbjxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVMaXN0KHNsb3cpOwotCQkvLyB1c2luZyB0aGUgdW5zeW5jaHJvbml6ZWQgbGlzdCB3aWxsIGNhdXNlIHRoZSB0ZXN0IHRvIGZhaWwKLQkJLy8gdGhpcy5vcmlnaW5hbExpc3QgPSBzbG93OwotCQl0aGlzLm9yaWdpbmFsTGlzdCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3Qoc2xvdyk7Ci0KLQkJdGhpcy5jb25jdXJyZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlUaHJlYWQgdGhyZWFkID0gdGhpcy5idWlsZFRocmVhZCh0aGlzLmJ1aWxkUnVubmFibGUoKSk7Ci0JCXRocmVhZC5zdGFydCgpOwotCQl3aGlsZSAoICEgc2xvdy5oYXNTdGFydGVkQ2xvbmUoKSkgewotCQkJLy8gd2FpdCBmb3IgdGhlIG90aGVyIHRocmVhZCB0byBzdGFydCB0aGUgY2xvbmUuLi4KLQkJCVRocmVhZC55aWVsZCgpOwotCQl9Ci0JCS8vIC4uLnRoZW4gc25lYWsgaW4gYW4gZXh0cmEgZWxlbWVudAotCQl0aGlzLm9yaWdpbmFsTGlzdC5hZGQoInNldmVudGVlbiIpOwotCQl0aHJlYWQuam9pbigpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUxpc3QoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29uY3VycmVudExpc3QpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0UnVubmFibGUoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHJ1bl8oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMubG9vcFdpdGhDbG9uZUxpc3RJdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHVzZSBhIGNsb25lIGl0ZXJhdG9yIHRvIGxvb3Agb3ZlciB0aGUgInNsb3ciIGNvbGxlY3Rpb24gYW5kIGNvcHkgaXRzCi0JICogY29udGVudHMgdG8gdGhlIGNvbmN1cnJlbnQgY29sbGVjdGlvbgotCSAqLwotCXZvaWQgbG9vcFdpdGhDbG9uZUxpc3RJdGVyYXRvcigpIHsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXRoaXMuY29uY3VycmVudExpc3QuYWRkKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3M2MxZDkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbm90aGVyKCkgewotCQl0aGlzLnZlcmlmeUhhc0Fub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbm90aGVyMigpIHsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0Fub3RoZXIzKCkgewotCQl0aGlzLnZlcmlmeUhhc0Fub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUhhc0Fub3RoZXIoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKDgsIHN0cmVhbSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlIYXNBbm90aGVyKGludCBleHBlY3RlZCwgSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm90aGVyKCkgewotCQl0aGlzLnZlcmlmeUFub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm90aGVyMigpIHsKLQkJdGhpcy52ZXJpZnlBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFub3RoZXIzKCkgewotCQl0aGlzLnZlcmlmeUFub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUFub3RoZXIoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJdGhpcy52ZXJpZnlBbm90aGVyKDEsIHN0cmVhbSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlBbm90aGVyKGludCBzdGFydCwgSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJaW50IGluZGV4ID0gc3RhcnQ7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBTdHJpbmcudmFsdWVPZihpbmRleCsrKSwgc3RyZWFtLm5leHQoKS5zdWJzdHJpbmcoMCwgMSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlSZW1vdmUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRMaXN0MSgpOwotCQlPYmplY3QgbGFzdEVsZW1lbnQxID0gbGlzdDEuZ2V0KGxpc3QxLnNpemUoKSAtIDEpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkTGlzdDIoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZExpc3QzKCk7Ci0KLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZChsaXN0MS5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QyLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDMubGlzdEl0ZXJhdG9yKCkpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5leHQuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAobmV4dC5lcXVhbHMobGFzdEVsZW1lbnQxKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNOZXh0KCk7Ci0JCQkJLy8gbm93IHRyeSB0byByZW1vdmUgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0b3IKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJc3RyZWFtLnJlbW92ZSgpOwotCi0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAxIiwgdGhpcy5idWlsZExpc3QxKCkuc2l6ZSgpIC0gMiwgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjMzMyIpKTsKLQkJYXNzZXJ0RmFsc2UoImxhc3QgZWxlbWVudCBzdGlsbCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucyhsYXN0RWxlbWVudDEpKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZWxlbWVudCByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjIyIikpOwotCi0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAzIiwgdGhpcy5idWlsZExpc3QzKCkuc2l6ZSgpIC0gMSwgbGlzdDMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAzIiwgbGlzdDMuY29udGFpbnMoIjg4ODg4ODg4IikpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyBlbGVtZW50IHJlbW92ZWQgZnJvbSBjb2xsZWN0aW9uIDMiLCBsaXN0My5jb250YWlucygiNjY2NjY2IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVFbGVtZW50KCkgewotCQlTdHJpbmcgaXRlbSA9ICIwIjsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKDksIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcihpdGVtLCB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSkpOwotCQl0aGlzLnZlcmlmeUFub3RoZXIoMCwgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGl0ZW0sIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeVVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKHRoaXMuYnVpbGRVbm1vZGlmaWFibGVDb21wb3NpdGVJdGVyYXRvcigpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeVVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHN0cmluZy5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCX0KLQotCXZvaWQgdmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJc3RyZWFtLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlIYXNBbm90aGVyMSgpIHsKLQkJdGhpcy52ZXJpZnlFbXB0eUhhc0Fub3RoZXIodGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IxKCkpOwotCX0KLQotCXZvaWQgdmVyaWZ5RW1wdHlIYXNBbm90aGVyKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eU5vU3VjaEVsZW1lbnRFeGNlcHRpb24xKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlIYXNBbm90aGVyMigpIHsKLQkJdGhpcy52ZXJpZnlFbXB0eUhhc0Fub3RoZXIodGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eU5vU3VjaEVsZW1lbnRFeGNlcHRpb24yKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24yKCk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZEl0ZXJhdG9ycygpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZEVtcHR5SXRlcmF0b3JzMSgpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZEVtcHR5SXRlcmF0b3JzMigpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlQ29tcG9zaXRlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9ycygpKTsKLQl9Ci0KLQkvLyBsZWF2ZSB1bmNoZWNrZWQgc28gd2UgY2FuIG92ZXJyaWRlIGluIHN1YmNsYXNzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9ycykgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4oaXRlcmF0b3JzKTsKLQl9Ci0KLQkvLyB1c2UgdmFyYXJnIGNvbnN0cnVjdG9yCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KHRoaXMuYnVpbGRJdGVyYXRvcjEoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMigpLCB0aGlzLmJ1aWxkSXRlcmF0b3IzKCkpOwotCX0KLQotCS8vIHVzZSB2YXJhcmcgY29uc3RydWN0b3IKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4obmV3IEl0ZXJhdG9yW10geyB0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpIH0pOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPihzdHJpbmcsIGl0ZXJhdG9yKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8SXRlcmF0b3I8U3RyaW5nPj4gYnVpbGRJdGVyYXRvcnMoKSB7Ci0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEl0ZXJhdG9yMSgpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEl0ZXJhdG9yMigpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEl0ZXJhdG9yMygpKTsKLQkJcmV0dXJuIGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGJ1aWxkRW1wdHlJdGVyYXRvcnMxKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEVtcHR5SXRlcmF0b3JJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxJdGVyYXRvcjxTdHJpbmc+PiBidWlsZEVtcHR5SXRlcmF0b3JzMigpIHsKLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZCh0aGlzLmJ1aWxkRW1wdHlTdHJpbmdJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEVtcHR5U3RyaW5nSXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRFbXB0eVN0cmluZ0l0ZXJhdG9yKCkpOwotCQlyZXR1cm4gbGlzdC5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8SXRlcmF0b3I8U3RyaW5nPj4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcnMoKSB7Ci0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMSgpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMigpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMygpKTsKLQkJcmV0dXJuIGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdDEoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0MigpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IzKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTGlzdDEoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRVbm1vZGlmaWFibGVMaXN0MigpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IzKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFVubW9kaWZpYWJsZUxpc3QzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGJ1aWxkRW1wdHlJdGVyYXRvckl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKSkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRFbXB0eVN0cmluZ0l0ZXJhdG9yKCkgewotCQlyZXR1cm4gKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRMaXN0MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQkJbGlzdC5hZGQoIjIyIik7Ci0JCWxpc3QuYWRkKCIzMzMiKTsKLQkJbGlzdC5hZGQoIjQ0NDQiKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdDIoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRMaXN0MygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjU1NTU1Iik7Ci0JCWxpc3QuYWRkKCI2NjY2NjYiKTsKLQkJbGlzdC5hZGQoIjc3Nzc3NzciKTsKLQkJbGlzdC5hZGQoIjg4ODg4ODg4Iik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCUxpc3Q8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUxpc3QxKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh0aGlzLmJ1aWxkTGlzdDEoKSk7Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTGlzdDIoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHRoaXMuYnVpbGRMaXN0MigpKTsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVMaXN0MygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5idWlsZExpc3QzKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYTEwNGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzIHsKLQotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlzdXBlci50ZXN0UmVtb3ZlKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRMaXN0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkTGlzdDIoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZExpc3QzKCk7Ci0JCU9iamVjdCBmaXJzdEVsZW1lbnQzID0gbGlzdDMuZ2V0KDApOwotCi0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQobGlzdDEubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0Mi5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QzLmxpc3RJdGVyYXRvcigpKTsKLQotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcihsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQkJLy8gcG9zaXRpb24gdG8gZW5kIG9mIHN0cmVhbQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBwcmV2aW91cyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQkJaWYgKHByZXZpb3VzLmVxdWFscygiMzMzIikpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSAtIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIGl0ZXJhdG9ycwotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhmaXJzdEVsZW1lbnQzKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNQcmV2aW91cygpOwotCQkJCS8vIG5vdyB0cnkgdG8gcmVtb3ZlIGZyb20gdGhlIHByZXZpb3VzIGl0ZXJhdG9yCi0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCXN0cmVhbS5yZW1vdmUoKTsKLQotCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmcgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24gMSIsIHRoaXMuYnVpbGRMaXN0MSgpLnNpemUoKSAtIDIsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKCIxIikpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBzdGlsbCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucygiMzMzIikpOwotCi0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAzIiwgdGhpcy5idWlsZExpc3QzKCkuc2l6ZSgpIC0gMSwgbGlzdDMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImZpcnN0IGVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAzIiwgbGlzdDMuY29udGFpbnMoZmlyc3RFbGVtZW50MykpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyBlbGVtZW50IHJlbW92ZWQgZnJvbSBjb2xsZWN0aW9uIDMiLCBsaXN0My5jb250YWlucygiNjY2NjY2IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRMaXN0MSgpOwotCQlPYmplY3QgbGFzdEVsZW1lbnQxID0gbGlzdDEuZ2V0KGxpc3QxLnNpemUoKSAtIDEpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkTGlzdDIoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZExpc3QzKCk7Ci0JCU9iamVjdCBmaXJzdEVsZW1lbnQzID0gbGlzdDMuZ2V0KDApOwotCi0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQobGlzdDEubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0Mi5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QzLmxpc3RJdGVyYXRvcigpKTsKLQotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcihsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChuZXh0LmVxdWFscygiMzMzIikpIHsKLQkJCQlzdHJlYW0uYWRkKCIzLjUiKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAobmV4dC5lcXVhbHMobGFzdEVsZW1lbnQxKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNOZXh0KCk7Ci0JCQkJLy8gbm93IHRyeSB0byBhZGQgdG8gdGhlIGl0ZXJhdG9yCi0JCQkJc3RyZWFtLmFkZCgic29tZXRoaW5nIGluIDMiKTsKLQkJCX0KLQkJfQotCQlzdHJlYW0uYWRkKCJmaW5hbGUiKTsKLQkJYm9vbGVhbiBjaGVja0ZvckZpbmFsZSA9IHRydWU7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHByZXZpb3VzID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpZiAoY2hlY2tGb3JGaW5hbGUpIHsKLQkJCQljaGVja0ZvckZpbmFsZSA9IGZhbHNlOwotCQkJCWFzc2VydEVxdWFscygiYWRkZWQgZWxlbWVudCBkcm9wcGVkIiwgImZpbmFsZSIsIHByZXZpb3VzKTsKLQkJCX0KLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJc3RyZWFtLmFkZCgiMi41Iik7Ci0JCQl9Ci0JCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSAtIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIGl0ZXJhdG9ycwotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhmaXJzdEVsZW1lbnQzKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNQcmV2aW91cygpOwotCQkJCS8vIG5vdyB0cnkgdG8gcmVtb3ZlIGZyb20gdGhlIHByZXZpb3VzIGl0ZXJhdG9yCi0JCQkJc3RyZWFtLmFkZCgib2xkIHN0YXJ0IG9mIDMiKTsKLQkJCX0KLQkJfQotCQlzdHJlYW0uYWRkKCJwcmVsdWRlIik7Ci0JCWFzc2VydEVxdWFscygiYWRkZWQgZWxlbWVudCBkcm9wcGVkIiwgInByZWx1ZGUiLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50cyBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAxIiwgdGhpcy5idWlsZExpc3QxKCkuc2l6ZSgpICsgMywgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDEiLCAicHJlbHVkZSIsIGxpc3QxLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAxIiwgIjIuNSIsIGxpc3QxLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAxIiwgIjMuNSIsIGxpc3QxLmdldCg1KSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50cyBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAzIiwgdGhpcy5idWlsZExpc3QzKCkuc2l6ZSgpICsgMywgbGlzdDMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDMiLCAic29tZXRoaW5nIGluIDMiLCBsaXN0My5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMyIsICJvbGQgc3RhcnQgb2YgMyIsIGxpc3QzLmdldCgxKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAzIiwgImZpbmFsZSIsIGxpc3QzLmdldChsaXN0My5zaXplKCkgLSAxKSk7Ci0KLQkJLy8gYWRkIHRvIHRoZSBmcm9udAotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydEZhbHNlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLm5leHQoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRUcnVlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLnByZXZpb3VzKCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRGYWxzZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRUcnVlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLnByZXZpb3VzKCkuZXF1YWxzKCJibGFoIikpOwotCi0JCS8vIGFkZCB0byB0aGUgbWlkZGxlCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXN0cmVhbS5uZXh0KCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0RmFsc2UoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ubmV4dCgpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQlzdHJlYW0ubmV4dCgpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydFRydWUoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ucHJldmlvdXMoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0RmFsc2UoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ubmV4dCgpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRUcnVlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLnByZXZpb3VzKCkuZXF1YWxzKCJibGFoIikpOwotCi0JCS8vIGFkZCB0byB0aGUgZW5kCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0RmFsc2UoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0uaGFzTmV4dCgpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydFRydWUoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ucHJldmlvdXMoKS5lcXVhbHMoImJsYWgiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZExpc3QxKCk7Ci0JCU9iamVjdCBsYXN0RWxlbWVudDEgPSBsaXN0MS5nZXQobGlzdDEuc2l6ZSgpIC0gMSk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRMaXN0MigpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkTGlzdDMoKTsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudDMgPSBsaXN0My5nZXQoMCk7Ci0KLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZChsaXN0MS5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QyLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDMubGlzdEl0ZXJhdG9yKCkpOwotCi0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCQkvLyBwb3NpdGlvbiB0byBlbmQgb2Ygc3RyZWFtCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobmV4dC5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJc3RyZWFtLnNldCgiMzMzYSIpOwotCQkJfQotCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2UgLSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiBpdGVyYXRvcnMKLQkJCWlmIChuZXh0LmVxdWFscyhsYXN0RWxlbWVudDEpKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIG5leHQgaXRlcmF0b3IgdG8gYmUgbG9hZGVkCi0JCQkJc3RyZWFtLmhhc05leHQoKTsKLQkJCQkvLyBub3cgdHJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBwcmV2aW91cyBpdGVyYXRvcgotCQkJCXN0cmVhbS5zZXQoImVuZCBvZiAxIik7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3QgcHJldmlvdXMgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoIjIyIikpIHsKLQkJCQlzdHJlYW0uc2V0KCIyMmEiKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAocHJldmlvdXMuZXF1YWxzKGZpcnN0RWxlbWVudDMpKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIG5leHQgaXRlcmF0b3IgdG8gYmUgbG9hZGVkCi0JCQkJc3RyZWFtLmhhc1ByZXZpb3VzKCk7Ci0JCQkJLy8gbm93IHRyeSB0byByZW1vdmUgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0b3IKLQkJCQlzdHJlYW0uc2V0KCJzdGFydCBvZiAzIik7Ci0JCQl9Ci0JCX0KLQotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQocykgYWRkZWQgdG8gY29sbGVjdGlvbiAxIiwgdGhpcy5idWlsZExpc3QxKCkuc2l6ZSgpLCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDEiLCAiMjJhIiwgbGlzdDEuZ2V0KDEpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucygiMjIiKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsICIzMzNhIiwgbGlzdDEuZ2V0KDIpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucygiMzMzIikpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDEiLCAiZW5kIG9mIDEiLCBsaXN0MS5nZXQobGlzdDEuc2l6ZSgpIC0gMSkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKGxhc3RFbGVtZW50MSkpOwotCi0JCWFzc2VydEVxdWFscygiZWxlbWVudChzKSBhZGRlZCB0byBjb2xsZWN0aW9uIDMiLCB0aGlzLmJ1aWxkTGlzdDMoKS5zaXplKCksIGxpc3QzLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMyIsICJzdGFydCBvZiAzIiwgbGlzdDMuZ2V0KDApKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDMiLCBsaXN0My5jb250YWlucyhmaXJzdEVsZW1lbnQzKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleFByZXZpb3VzSW5kZXgoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCQlpZiAobmV4dC5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCWktLTsKLQkJCX0KLQkJCWlmIChuZXh0LmVxdWFscygiNzc3Nzc3NyIpKSB7Ci0JCQkJc3RyZWFtLmFkZCgiNy41Iik7Ci0JCQkJaSsrOwotCQkJfQotCQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaW5kZXggaXMgY29ycnVwdCIsIDgsIGkpOwotCi0JCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBwcmV2aW91cyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQkJaWYgKHByZXZpb3VzLmVxdWFscygiNjY2NjY2IikpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJLy8gcmVtb3ZpbmcgYSBwcmV2aW91cyBlbGVtZW50LCBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnNvcgotCQkJfQotCQkJaWYgKHByZXZpb3VzLmVxdWFscygiMjIiKSkgewotCQkJCXN0cmVhbS5hZGQoIjEuNSIpOwotCQkJCWkrKzsKLQkJCX0KLQkJCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImluZGV4IGlzIGNvcnJ1cHQiLCAwLCBpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMigpIHsKLQkJdGhpcy52ZXJpZnlFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKTsKLQl9Ci0KLQkvLyB1bmNoZWNrZWQgc28gd2UgY2FuIG92ZXJyaWRlIHRoZSB1bmNoZWNrZWQgbWV0aG9kIGluIHN1cGVyY2xhc3MKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmF0b3IgaXRlcmF0b3JzKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4oKExpc3RJdGVyYXRvcjxMaXN0SXRlcmF0b3I8U3RyaW5nPj4pIGl0ZXJhdG9ycyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KG5ldyBMaXN0SXRlcmF0b3JbXSB7IHRoaXMuYnVpbGRJdGVyYXRvcjEoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMigpLCB0aGlzLmJ1aWxkSXRlcmF0b3IzKCkgfSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVMaXN0SXRlcmF0b3IoU3RyaW5nIHN0cmluZywgTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPihzdHJpbmcsIGl0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NGNjZDAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVtcHR5SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbXB0eUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8TnVtYmVyPiBzdHJlYW0gPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGVsZW1lbnQsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKS5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGFjNjcxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRW1wdHlMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbXB0eUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlmb3IgKExpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmVhbS5wcmV2aW91cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91c0luZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biAobmV4dCk6ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24gKHByZXZpb3VzKTogIiArIGVsZW1lbnQsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCkucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biAocmVtb3ZlKSIsIGV4Q2F1Z2h0KTsKLQkJdHJ5IHsKLQkJCUVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCkuc2V0KG5ldyBPYmplY3QoKSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biAoc2V0KSIsIGV4Q2F1Z2h0KTsKLQkJdHJ5IHsKLQkJCUVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCkuYWRkKG5ldyBPYmplY3QoKSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biAoYWRkKSIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMzQyOTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbnVtZXJhdGlvbkl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbnVtZXJhdGlvbkl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW51bWVyYXRpb25JdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0VXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlFbnVtZXJhdGlvbjxTdHJpbmc+IGVudW1lcmF0aW9uID0gdGhpcy5idWlsZEVudW1lcmF0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRVcGNhc3QoKSB7Ci0JCUVudW1lcmF0aW9uPFN0cmluZz4gZW51bWVyYXRpb24gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb24oKTsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYXRvcih0aGlzLmJ1aWxkRW51bWVyYXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoRW51bWVyYXRpb248U3RyaW5nPiBlbnVtZXJhdGlvbikgewotCQlyZXR1cm4gbmV3IEVudW1lcmF0aW9uSXRlcmF0b3I8U3RyaW5nPihlbnVtZXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdGlvbjxTdHJpbmc+IGJ1aWxkRW51bWVyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVmVjdG9yKCkuZWxlbWVudHMoKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkVmVjdG9yKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXYuYWRkRWxlbWVudCgib25lIik7Ci0JCXYuYWRkRWxlbWVudCgidHdvIik7Ci0JCXYuYWRkRWxlbWVudCgidGhyZWUiKTsKLQkJdi5hZGRFbGVtZW50KCJmb3VyIik7Ci0JCXYuYWRkRWxlbWVudCgiZml2ZSIpOwotCQl2LmFkZEVsZW1lbnQoInNpeCIpOwotCQl2LmFkZEVsZW1lbnQoInNldmVuIik7Ci0JCXYuYWRkRWxlbWVudCgiZWlnaHQiKTsKLQkJcmV0dXJuIHY7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkSXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZEVudW1lcmF0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8T2JqZWN0PiBidWlsZEl0ZXJhdG9yVXBjYXN0KEVudW1lcmF0aW9uPFN0cmluZz4gZW51bWVyYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGlvbkl0ZXJhdG9yPE9iamVjdD4oZW51bWVyYXRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTFmZTRjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0ZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gInByZWZpeCI7Ci0KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRBY2NlcHRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoc3RyaW5nLmVxdWFscyhQUkVGSVggKyAiMyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRBY2NlcHRJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEFjY2VwdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0TmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRBY2NlcHRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgYWNjZXB0Iiwgc3RyZWFtLm5leHQoKS5zdGFydHNXaXRoKFBSRUZJWCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVySGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lck5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgYWNjZXB0Iiwgc3RyZWFtLm5leHQoKS5zdGFydHNXaXRoKFBSRUZJWCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlamVjdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWplY3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlamVjdE5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVqZWN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEZhbHNlKCJib2d1cyByZWplY3QiLCBzdHJlYW0ubmV4dCgpLnN0YXJ0c1dpdGgoUFJFRklYKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm90aEhhc05leHQoKSB7Ci0JCS8vIGlmIGJvdGggYWNjZXB0KCkgYW5kIHJlamVjdCgpIGFyZSBvdmVycmlkZGVuLCBhY2NlcHQoKSBpcyB1c2VkCi0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRCb3RoSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMb2FkTmV4dCgpIHsKLQkJLy8gbG9hZE5leHQoKSB1c2VkIHRvIGNhdXNlIGEgTlBFIHdoZW4gZXhlY3V0aW5nIGR1cmluZyB0aGUKLQkJLy8gY29uc3RydWN0b3IgYmVjYXVzZSB0aGUgIm91dGVyIiBjbGFzcyBpcyBub3QgYm91bmQgdW50aWwgY29tcGxldGlvbgotCQkvLyBvZiB0aGUgY29uc3RydWN0b3IKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yMigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgYWNjZXB0Iiwgc3RyZWFtLm5leHQoKS5zdGFydHNXaXRoKFBSRUZJWCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlckhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRGaWx0ZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlck5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkRmlsdGVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydFRydWUoImJvZ3VzIGFjY2VwdCIsIHN0cmVhbS5uZXh0KCkuc3RhcnRzV2l0aChQUkVGSVgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEZpbHRlcmVkSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciwgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvciwgZmlsdGVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJbm5lckZpbHRlcmVkSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZz4obmVzdGVkSXRlcmF0b3IpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aChQUkVGSVgpOwotCQkJfQotCQl9OwotCX0KLQotCVN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBQUkVGSVg7Ci0JfQotCi0JLy8gdGhpcyBpbm5lciBpdGVyYXRvciB3aWxsIGNhbGwgdGhlICJvdXRlciIgb2JqZWN0Ci0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSW5uZXJGaWx0ZXJlZEl0ZXJhdG9yMihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKEZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMudGhpcy5nZXRQcmVmaXgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKFBSRUZJWCArICIxIik7Ci0JCWMuYWRkKFBSRUZJWCArICIyIik7Ci0JCWMuYWRkKFBSRUZJWCArICIzIik7Ci0JCWMuYWRkKCI0Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI1Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI2Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI3Iik7Ci0JCWMuYWRkKCI4Iik7Ci0JCXJldHVybiBjLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQWNjZXB0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZEFjY2VwdEZpbHRlcihQUkVGSVgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJbm5lckl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZElubmVyRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JLy8gdGhpcyBpbm5lciBpdGVyYXRvciB3aWxsIGNhbGwgdGhlICJvdXRlciIgb2JqZWN0Ci0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSW5uZXJJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJGaWx0ZXJlZEl0ZXJhdG9yMih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRmlsdGVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZEZpbHRlckZpbHRlcihQUkVGSVgpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkQWNjZXB0RmlsdGVyKFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVGaWx0ZXI8U3RyaW5nLCBTdHJpbmc+KHByZWZpeCkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aCh0aGlzLmNyaXRlcmlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVqZWN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFJlamVjdEZpbHRlcihQUkVGSVgpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkUmVqZWN0RmlsdGVyKFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVGaWx0ZXI8U3RyaW5nLCBTdHJpbmc+KHByZWZpeCkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gcmVqZWN0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aCh0aGlzLmNyaXRlcmlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gdXNlIGFub255bW91cyBpbm5lciBGaWx0ZXIKLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkRmlsdGVyRmlsdGVyKGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgocHJlZml4KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRCb3RoSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZEJvdGhGaWx0ZXIoUFJFRklYKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWx0ZXI8U3RyaW5nPiBidWlsZEJvdGhGaWx0ZXIoU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUZpbHRlcjxTdHJpbmcsIFN0cmluZz4ocHJlZml4KSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiByZWplY3QoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKHRoaXMuY3JpdGVyaW9uKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKHRoaXMuY3JpdGVyaW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEZpbHRlcmluZ0l0ZXJhdG9yKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQkvLyBtaXNzaW5nIG1ldGhvZCBvdmVycmlkZQotCQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmc+KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQkJCVN0cmluZyBzID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCBzdHJpbmc6ICIgKyBzKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0dyYXBoSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGU3ZWJkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0dyYXBoSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuR3JhcGhJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdyYXBoSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKiogdGhpcyB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGFsbCB0aGUgbm9kZXMgY3JlYXRlZCBmb3IgdGhlIHRlc3QgKi8KLQlDb2xsZWN0aW9uPEdyYXBoTm9kZT4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PEdyYXBoTm9kZT4oKTsKLQotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0MSgpIHsKLQkJdGhpcy52ZXJpZnlIYXNOZXh0KHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dDIoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzTmV4dCh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05leHQoSXRlcmF0b3I8R3JhcGhOb2RlPiBpdGVyYXRvcikgewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5ub2Rlcy5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0MSgpIHsKLQkJdGhpcy52ZXJpZnlOZXh0KHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dDIoKSB7Ci0JCXRoaXMudmVyaWZ5TmV4dCh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU5leHQoSXRlcmF0b3I8R3JhcGhOb2RlPiBpdGVyYXRvcikgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBlbGVtZW50IiwgdGhpcy5ub2Rlcy5jb250YWlucyhpdGVyYXRvci5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uMSgpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24oSXRlcmF0b3I8R3JhcGhOb2RlPiBpdGVyYXRvcikgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplMSgpIHsKLQkJdGhpcy52ZXJpZnlTaXplKHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZTIoKSB7Ci0JCXRoaXMudmVyaWZ5U2l6ZSh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNpemUoSXRlcmF0b3I8R3JhcGhOb2RlPiBpdGVyYXRvcikgewotCQlpbnQgaXRlcmF0b3JTaXplID0gQ29sbGVjdGlvblRvb2xzLnNpemUoaXRlcmF0b3IpOwotCQlpbnQgYWN0dWFsU2l6ZSA9IHRoaXMubm9kZXMuc2l6ZSgpOwotCQlhc3NlcnRUcnVlKCJUb28gZmV3IGl0ZW1zIGluIGl0ZXJhdG9yLiIsIGl0ZXJhdG9yU2l6ZSA+PSBhY3R1YWxTaXplKTsKLQkJYXNzZXJ0VHJ1ZSgiVG9vIG1hbnkgaXRlbXMgaW4gaXRlcmF0b3IuIiwgaXRlcmF0b3JTaXplIDw9IGFjdHVhbFNpemUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkR3JhcGhJdGVyYXRvcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJLy8gbWlzc2luZyBtZXRob2Qgb3ZlcnJpZGUKLQkJCUl0ZXJhdG9yPEdyYXBoTm9kZT4gaXRlcmF0b3IgPSBuZXcgR3JhcGhJdGVyYXRvcjxHcmFwaE5vZGU+KHRoaXMuYnVpbGRHcmFwaFJvb3QoKSk7Ci0JCQlHcmFwaE5vZGUgZ24gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGdyYXBoIG5vZGU6ICIgKyBnbik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIGEgZ3JhcGggaXRlcmF0b3Igd2l0aCBhbiBleHBsaWNpdCBtaXN0ZXJSb2dlcnMKLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yPEdyYXBoTm9kZT4gYnVpbGRHcmFwaEl0ZXJhdG9yMSgpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhdG9yPEdyYXBoTm9kZT4odGhpcy5idWlsZEdyYXBoUm9vdCgpLCB0aGlzLmJ1aWxkTWlzdGVyUm9nZXJzKCkpOwotCX0KLQotCXByaXZhdGUgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnM8R3JhcGhOb2RlPiBidWlsZE1pc3RlclJvZ2VycygpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxHcmFwaE5vZGU+KCkgewotCQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKEdyYXBoTm9kZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQubmVpZ2hib3JzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYSBncmFwaCBpdGVyYXRvciB3aXRoIGFuIG92ZXJyaWRlCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvcjxHcmFwaE5vZGU+IGJ1aWxkR3JhcGhJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYXRvcjxHcmFwaE5vZGU+KHRoaXMuYnVpbGRHcmFwaFJvb3QoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8R3JhcGhOb2RlPiBuZWlnaGJvcnMoR3JhcGhOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5uZWlnaGJvcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoTm9kZSBidWlsZEdyYXBoUm9vdCgpIHsKLQkJR3JhcGhOb2RlIG5jTm9kZSA9IG5ldyBHcmFwaE5vZGUoIk5vcnRoIENhcm9saW5hIik7Ci0JCUdyYXBoTm9kZSB2YU5vZGUgPSBuZXcgR3JhcGhOb2RlKCJWaXJnaW5pYSIpOwotCQlHcmFwaE5vZGUgc2NOb2RlID0gbmV3IEdyYXBoTm9kZSgiU291dGggQ2Fyb2xpbmEiKTsKLQkJR3JhcGhOb2RlIGdhTm9kZSA9IG5ldyBHcmFwaE5vZGUoIkdlb3JnaWEiKTsKLQkJR3JhcGhOb2RlIGZsTm9kZSA9IG5ldyBHcmFwaE5vZGUoIkZsb3JpZGEiKTsKLQkJR3JhcGhOb2RlIGFsTm9kZSA9IG5ldyBHcmFwaE5vZGUoIkFsYWJhbWEiKTsKLQkJR3JhcGhOb2RlIG1zTm9kZSA9IG5ldyBHcmFwaE5vZGUoIk1pc3Npc3NpcHBpIik7Ci0JCUdyYXBoTm9kZSB0bk5vZGUgPSBuZXcgR3JhcGhOb2RlKCJUZW5uZXNzZWUiKTsKLQotCQluY05vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IHZhTm9kZSwgc2NOb2RlLCBnYU5vZGUsIHRuTm9kZSB9KTsKLQkJdmFOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBuY05vZGUsIHRuTm9kZSB9KTsKLQkJc2NOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBuY05vZGUsIGdhTm9kZSB9KTsKLQkJZ2FOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBuY05vZGUsIHNjTm9kZSwgZmxOb2RlLCBhbE5vZGUsIHRuTm9kZSB9KTsKLQkJZmxOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBnYU5vZGUgfSk7Ci0JCWFsTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgZ2FOb2RlLCBtc05vZGUsIHRuTm9kZSB9KTsKLQkJbXNOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBhbE5vZGUsIHRuTm9kZSB9KTsKLQkJdG5Ob2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyB2YU5vZGUsIG5jTm9kZSwgZ2FOb2RlLCBhbE5vZGUsIG1zTm9kZSB9KTsKLQotCQlyZXR1cm4gbmNOb2RlOwotCX0KLQotCXB1YmxpYyBjbGFzcyBHcmFwaE5vZGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JCXByaXZhdGUgQ29sbGVjdGlvbjxHcmFwaE5vZGU+IG5laWdoYm9ycyA9IG5ldyBBcnJheUxpc3Q8R3JhcGhOb2RlPigpOwotCi0JCXB1YmxpYyBHcmFwaE5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlHcmFwaEl0ZXJhdG9yVGVzdHMudGhpcy5ub2Rlcy5hZGQodGhpcyk7IC8vIGxvZyBub2RlCi0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCi0JCXZvaWQgc2V0TmVpZ2hib3JzKEdyYXBoTm9kZVtdIG5laWdoYm9ycykgewotCQkJdGhpcy5uZWlnaGJvcnMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChuZWlnaGJvcnMpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKCkgewotCQkJcmV0dXJuIHRoaXMubmVpZ2hib3JzLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IG5laWdoYm9yc1NpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZWlnaGJvcnMuc2l6ZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkdyYXBoTm9kZSgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9KcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNkMjQ3Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9KcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXJyYXlJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFycmF5TGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2hhaW5JdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENsb25lSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDbG9uZUxpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW1wdHlJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVtcHR5TGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW51bWVyYXRpb25JdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3VwZXJJdGVyYXRvcldyYXBwZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHcmFwaEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGVla2FibGVJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJlZUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmNlYTc2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5QZWVrYWJsZUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZWVrYWJsZUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUGVla2FibGVJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHN0cmluZy5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dFVwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInRocmVlIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm91ciIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZpdmUiLCBzdHJlYW0ubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dFVwY2FzdCgpIHsKLQkJSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdCgpOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJlZSIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvdXIiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmaXZlIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBlZWsoKSB7Ci0JCU9iamVjdCBuZXh0ID0gbnVsbDsKLQkJZm9yIChQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBwZWVrID0gc3RyZWFtLnBlZWsoKTsKLQkJCWFzc2VydFRydWUoInBlZWsgYW5kIG5leHQgYXJlIHByZW1hdHVyZWx5IGlkZW50aWNhbCIsIHBlZWsgIT0gbmV4dCk7Ci0JCQluZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWFzc2VydFRydWUoInBlZWsgYW5kIG5leHQgYXJlIG5vdCBpZGVudGljYWwiLCBwZWVrID09IG5leHQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBlZWtVcGNhc3QoKSB7Ci0JCU9iamVjdCBuZXh0ID0gbnVsbDsKLQkJZm9yIChQZWVrYWJsZUl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBwZWVrID0gc3RyZWFtLnBlZWsoKTsKLQkJCWFzc2VydFRydWUoInBlZWsgYW5kIG5leHQgYXJlIHByZW1hdHVyZWx5IGlkZW50aWNhbCIsIHBlZWsgIT0gbmV4dCk7Ci0JCQluZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWFzc2VydFRydWUoInBlZWsgYW5kIG5leHQgYXJlIG5vdCBpZGVudGljYWwiLCBwZWVrID09IG5leHQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgUGVla2FibGVJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIFBlZWthYmxlSXRlcmF0b3I8U3RyaW5nPiBidWlsZFBlZWthYmxlSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFBlZWthYmxlSXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBQZWVrYWJsZUl0ZXJhdG9yPE9iamVjdD4gYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBQZWVrYWJsZUl0ZXJhdG9yPE9iamVjdD4obmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCWMuYWRkKCJmb3VyIik7Ci0JCWMuYWRkKCJmaXZlIik7Ci0JCXJldHVybiBjLml0ZXJhdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwY2JmZTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBDb21wb3NpdGVJdGVyYXRvclRlc3RzIHsKLQotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5SGFzQW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlIYXNBbm90aGVyKHN0cmVhbSk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTIgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHN0cmVhbTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDgsIGkpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5QW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlBbm90aGVyKHN0cmVhbSk7Ci0JCWludCBpID0gODsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBTdHJpbmcudmFsdWVPZihpLS0pLCBzdHJlYW0yLnByZXZpb3VzKCkuc3Vic3RyaW5nKDAsIDEpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImluZGV4IGlzIGNvcnJ1cHQiLCA4LCBpKTsKLQotCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImluZGV4IGlzIGNvcnJ1cHQiLCAwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXNJbmRleCgpIHsKLQkJLy8gVE9ETwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCS8vICNyZW1vdmUoKSBpcyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKLQkJLy8gI3JlbW92ZSgpIGlzIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCkgewotCQkvLyAjcmVtb3ZlKCkgaXMgbm90IHN1cHBvcnRlZAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB7Ci0JCS8vICNyZW1vdmUoKSBpcyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB2ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXN1cGVyLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24oc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbTIucHJldmlvdXMoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJc3VwZXIudmVyaWZ5VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oc3RyZWFtKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSBzdHJlYW07Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBzdHJpbmcgPSBzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCQlpZiAoc3RyaW5nLmVxdWFscygiMzMzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0yLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0yLnNldCgianVuayIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHZlcmlmeUVtcHR5SGFzQW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlFbXB0eUhhc0Fub3RoZXIoc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbTIucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JLy8gdW5jaGVja2VkIHNvIHdlIGNhbiBvdmVycmlkZSB0aGUgdW5jaGVja2VkIG1ldGhvZCBpbiBzdXBlcmNsYXNzCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9ycykgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4oKExpc3RJdGVyYXRvcjxMaXN0SXRlcmF0b3I8U3RyaW5nPj4pIGl0ZXJhdG9ycyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuYnVpbGRJdGVyYXRvcjEoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMigpLCB0aGlzLmJ1aWxkSXRlcmF0b3IzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcjMoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPihuZXcgTGlzdEl0ZXJhdG9yW10geyB0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpIH0pOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbXBvc2l0ZUxpc3RJdGVyYXRvcihzdHJpbmcsIGl0ZXJhdG9yKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUxpc3RJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4oc3RyaW5nLCBpdGVyYXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhcmllZE5lc3RlZEl0ZXJhdG9ycygpIHsKLQkJTGlzdDxJbnRlZ2VyPiBpbnRlZ2VyTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLQkJaW50ZWdlckxpc3QuYWRkKG5ldyBJbnRlZ2VyKDQyKSk7Ci0JCWludGVnZXJMaXN0LmFkZChuZXcgSW50ZWdlcig0MikpOwotCQlpbnRlZ2VyTGlzdC5hZGQobmV3IEludGVnZXIoMTExKSk7Ci0JCWludGVnZXJMaXN0LmFkZChuZXcgSW50ZWdlcig3NykpOwotCi0JCUxpc3Q8RmxvYXQ+IGZsb2F0TGlzdCA9IG5ldyBBcnJheUxpc3Q8RmxvYXQ+KCk7Ci0JCWZsb2F0TGlzdC5hZGQobmV3IEZsb2F0KDQyLjQyZikpOwotCQlmbG9hdExpc3QuYWRkKG5ldyBGbG9hdCgyMi4yMmYpKTsKLQkJZmxvYXRMaXN0LmFkZChuZXcgRmxvYXQoMTExLjExMWYpKTsKLQkJZmxvYXRMaXN0LmFkZChuZXcgRmxvYXQoNzcuNzdmKSk7Ci0KLQkJTGlzdDxMaXN0PD8gZXh0ZW5kcyBOdW1iZXI+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0PD8gZXh0ZW5kcyBOdW1iZXI+PigpOwotCQlsaXN0LmFkZChpbnRlZ2VyTGlzdCk7Ci0JCWxpc3QuYWRkKGZsb2F0TGlzdCk7Ci0JCUxpc3RJdGVyYXRvcjxOdW1iZXI+IGxpID0gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPE51bWJlcj4obGlzdCk7Ci0JCXdoaWxlIChsaS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydFRydWUobGkubmV4dCgpLmludFZhbHVlKCkgPiAwKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzNTFiNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFJlYWRPbmx5SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0VXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFZlY3RvcigpLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRVcGNhc3QoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKTsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRSZWFkT25seUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8T2JqZWN0PiBidWlsZFJlYWRPbmx5SXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvclVwY2FzdCh0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVhZE9ubHlJdGVyYXRvcihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxTdHJpbmc+KG5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRSZWFkT25seUl0ZXJhdG9yVXBjYXN0KEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPE9iamVjdD4obmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZlY3RvcigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3I8U3RyaW5nPiBidWlsZFZlY3RvcigpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl2LmFkZEVsZW1lbnQoIm9uZSIpOwotCQl2LmFkZEVsZW1lbnQoInR3byIpOwotCQl2LmFkZEVsZW1lbnQoInRocmVlIik7Ci0JCXYuYWRkRWxlbWVudCgiZm91ciIpOwotCQl2LmFkZEVsZW1lbnQoImZpdmUiKTsKLQkJdi5hZGRFbGVtZW50KCJzaXgiKTsKLQkJdi5hZGRFbGVtZW50KCJzZXZlbiIpOwotCQl2LmFkZEVsZW1lbnQoImVpZ2h0Iik7Ci0JCXJldHVybiB2OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWExNTQ4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWFkT25seUxpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFJlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRBbmRIYXNQcmV2aW91cygpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpLCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dEFuZEhhc1ByZXZpb3VzVXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdCgpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKS5zaXplKCksIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0QW5kUHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEFuZFByZXZpb3VzVXBjYXN0KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdCgpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKSwgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleEFuZFByZXZpb3VzSW5kZXgoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCksIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgLTEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhBbmRQcmV2aW91c0luZGV4VXBjYXN0KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdCgpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCB0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIC0xLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uc2V0KCJib2d1cyIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uYWRkKCJib2d1cyIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRMaXN0SXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdChMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxPYmplY3Q+KG5lc3RlZExpc3RJdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZExpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0KCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsLmFkZCgib25lIik7Ci0JCWwuYWRkKCJ0d28iKTsKLQkJbC5hZGQoInRocmVlIik7Ci0JCWwuYWRkKCJmb3VyIik7Ci0JCWwuYWRkKCJmaXZlIik7Ci0JCWwuYWRkKCJzaXgiKTsKLQkJbC5hZGQoInNldmVuIik7Ci0JCWwuYWRkKCJlaWdodCIpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2UyMjY5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgdGhpcy5zaW5nbGVFbGVtZW50KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscyh0aGlzLnNpbmdsZUVsZW1lbnQoKSkpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc2luZ2xlRWxlbWVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNpbmdsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiAic2luZ2xlIGVsZW1lbnQiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZDQ4YjIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMgewotCi0JcHVibGljIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIDAsIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAxLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcmV2aW91cygpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMSwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCB0aGlzLnNpbmdsZUVsZW1lbnQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIHRoaXMuc2luZ2xlRWxlbWVudCgpLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXNJbmRleCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIDAsIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgMCwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCi0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAtMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOwotCi0JCXRyeSB7Ci0JCQlzdHJlYW0uYWRkKCJmb28iKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCi0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHModGhpcy5zaW5nbGVFbGVtZW50KCkpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnNldCgiZm9vIik7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLnNpbmdsZUVsZW1lbnQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3VwZXJJdGVyYXRvcldyYXBwZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3VwZXJJdGVyYXRvcldyYXBwZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODAwNjJmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1N1cGVySXRlcmF0b3JXcmFwcGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3VwZXJJdGVyYXRvcldyYXBwZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN1cGVySXRlcmF0b3JXcmFwcGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU3VwZXJJdGVyYXRvcldyYXBwZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoImZvbyIpOwotCQlsaXN0LmFkZCgiYmFyIik7Ci0JCWxpc3QuYWRkKCJiYXoiKTsKLQkJU3RyaW5nIGNvbmNhdCA9ICIiOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gbGlzdC5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWNvbmNhdCArPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiZm9vYmFyYmF6IiwgY29uY2F0KTsKLQotCQlJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yID0gbmV3IFN1cGVySXRlcmF0b3JXcmFwcGVyPE9iamVjdD4obGlzdCk7Ci0JCWNvbmNhdCA9ICIiOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0LmVxdWFscygiYmFyIikpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29uY2F0ICs9IG5leHQ7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJmb29iYXoiLCBjb25jYXQpOwotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShsaXN0LmNvbnRhaW5zKCJiYXIiKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TeW5jaHJvbml6ZWRJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TeW5jaHJvbml6ZWRJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NGU3MmUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlN5bmNocm9uaXplZEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLk11bHRpVGhyZWFkZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCXB1YmxpYyBTeW5jaHJvbml6ZWRJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgdGhhdCBhbiB1bnN5bmNocm9uaXplZCBpdGVyYXRvciB3aWxsIHByb2R1Y2UgY29ycnVwdCBvdXRwdXQ7Ci0JICogdGhyZWFkIDEgd2lsbCByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yCi0JICogYW5kIHRoZW4gc2xlZXAgZm9yIGEgYml0LCBhbGxvd2luZyB0aHJlYWQgMiB0byBzbmVhayBpbiBhbmQKLQkgKiByZWFkIHRoZSBzYW1lIGVsZW1lbnQgZnJvbSB0aGUgaXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWROZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gYm90aCB0aHJlYWRzIHNob3VsZCBoYXZlIHJlYWQgdGhlIHNhbWUgZWxlbWVudCBmcm9tIHRoZSBpdGVyYXRvciA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcnVubmFibGUyLm5leHQpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgdGhhdCBhIHN5bmNocm9uaXplZCBpdGVyYXRvciB3aWxsIHByb2R1Y2UgdmFsaWQgb3V0cHV0OwotCSAqIHRocmVhZCAxIHdpbGwgcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIHRoZSBpdGVyYXRvcgotCSAqIGFuZCB0aGVuIHNsZWVwIGZvciBhIGJpdCwgYnV0IHRocmVhZCAyIHdpbGwgYmUgbG9ja2VkIG91dCBhbmQKLQkgKiB3YWl0IHRvIHJlYWQgdGhlIHNlY29uZCBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZE5leHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhlIHRocmVhZHMgc2hvdWxkIGhhdmUgcmVhZCB0aGUgY29ycmVjdCBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYXRvciA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUyLm5leHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZEhhc05leHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCUhhc05leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgSGFzTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBsYXN0IGVsZW1lbnQsCi0JCS8vIGJ1dCB0aHJlYWQgMiB3aWxsIHRoaW5rIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIG9uIHRoZSBpdGVyYXRvciA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBydW5uYWJsZTIuaGFzTmV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZEhhc05leHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlIYXNOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUyID0gbmV3IEhhc05leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQluZXN0ZWRJdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRocmVhZCAxIHdpbGwgaGF2ZSB0aGUgbGFzdCBlbGVtZW50LAotCQkvLyBhbmQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cyBvbiB0aGUgaXRlcmF0b3IgOi0pCi0JCWFzc2VydEVxdWFscygiYmF6IiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJ1bm5hYmxlMi5oYXNOZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWRSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlSZW1vdmVUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgUmVtb3ZlVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJaXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aGUgd3JvbmcgZWxlbWVudCB3YXMgcmVtb3ZlZCA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygiYmF6IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZWRSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJUmVtb3ZlVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUyID0gbmV3IFJlbW92ZVRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhlIGNvcnJlY3QgZWxlbWVudCB3YXMgcmVtb3ZlZCA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRGYWxzZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiYmF6IikpOwotCX0KLQotCVRlc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVGVzdEl0ZXJhdG9yKGxvbmcgZGVsYXkpIHsKLQkJcmV0dXJuIG5ldyBUZXN0SXRlcmF0b3I8U3RyaW5nPihkZWxheSwgdGhpcy5idWlsZEFycmF5KCkpOwotCX0KLQotCVN0cmluZ1tdIGJ1aWxkQXJyYXkoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJmb28iLCAiYmFyIiwgImJheiJ9OwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25pemVkSXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvcik7Ci0JfQotCi0KLQkvKioKLQkgKiBuZXh0IHJ1bm5hYmxlCi0JICovCi0JY2xhc3MgTmV4dFRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgSXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0JCUUgbmV4dDsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlKEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5uZXh0ID0gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGhhcyBuZXh0IHJ1bm5hYmxlCi0JICovCi0JY2xhc3MgSGFzTmV4dFRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgSXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0JCWJvb2xlYW4gaGFzTmV4dDsKLQotCQlIYXNOZXh0VGVzdFJ1bm5hYmxlKEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5oYXNOZXh0ID0gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHJlbW92ZSBydW5uYWJsZQotCSAqLwotCWNsYXNzIFJlbW92ZVRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgSXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0KLQkJUmVtb3ZlVGVzdFJ1bm5hYmxlKEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGVzdCBpdGVyYXRvcjogSWYge0BsaW5rICNuZXh0KCl9IGlzIGNhbGxlZCB3aGlsZSBleGVjdXRpbmcgb24gdGhlCi0JICoge0BsaW5rIHNsb3dUaHJlYWR9LCB0aGUgaXRlcmF0b3Igd2lsbCBkZWxheSBmb3IgdGhlIGNvbmZpZ3VyZWQgdGltZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgVGVzdEl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewotCQlmaW5hbCBsb25nIGRlbGF5OwotCQlmaW5hbCBBcnJheUxpc3Q8RT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKLQkJaW50IG5leHRJbmRleCA9IDA7Ci0JCWludCBsYXN0SW5kZXggPSAtMTsKLQkJVGhyZWFkIHNsb3dUaHJlYWQ7Ci0KLQkJVGVzdEl0ZXJhdG9yKGxvbmcgZGVsYXksIEUuLi4gYXJyYXkpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlbGF5ID0gZGVsYXk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMubGlzdCwgYXJyYXkpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLm5leHRJbmRleCAhPSB0aGlzLmxpc3Quc2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIEUgbmV4dCgpIHsKLQkJCWlmICh0aGlzLmhhc05leHQoKSkgewotCQkJCUUgbmV4dCA9IHRoaXMubGlzdC5nZXQodGhpcy5uZXh0SW5kZXgpOwotCQkJCWlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IHRoaXMuc2xvd1RocmVhZCkgewotCQkJCQlUZXN0VG9vbHMuc2xlZXAodGhpcy5kZWxheSk7Ci0JCQkJfQotCQkJCXRoaXMubGFzdEluZGV4ID0gdGhpcy5uZXh0SW5kZXgrKzsKLQkJCQlyZXR1cm4gbmV4dDsKLQkJCX0KLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQlpZiAodGhpcy5sYXN0SW5kZXggPT0gLTEpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmxpc3QucmVtb3ZlKHRoaXMubGFzdEluZGV4KTsKLQkJCWlmICh0aGlzLmxhc3RJbmRleCA8IHRoaXMubmV4dEluZGV4KSB7ICAvLyBjaGVjayBuZWNlc3NhcnkgZm9yIExpc3RJdGVyYXRvcgotCQkJCXRoaXMubmV4dEluZGV4LS07Ci0JCQl9Ci0JCQl0aGlzLmxhc3RJbmRleCA9IC0xOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI3ZGEwYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yVGVzdHMKLQlleHRlbmRzIFN5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMKLXsKLQlwdWJsaWMgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3luY2hyb25pemVkUHJldmlvdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCVByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUyID0gbmV3IFByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJaXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyBib3RoIHRocmVhZHMgc2hvdWxkIGhhdmUgcmVhZCB0aGUgc2FtZSBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yIDotKAotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJ1bm5hYmxlMS5wcmV2aW91cyk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUyLnByZXZpb3VzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVkUHJldmlvdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihuZXN0ZWRJdGVyYXRvcik7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCVByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IFByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQluZXN0ZWRJdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRoZSB0aHJlYWRzIHNob3VsZCBoYXZlIHJlYWQgdGhlIGNvcnJlY3QgZWxlbWVudHMgZnJvbSB0aGUgaXRlcmF0b3IgOi0pCi0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUxLnByZXZpb3VzKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTIucHJldmlvdXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZEhhc1ByZXZpb3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCVByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IFByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJSGFzUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgSGFzUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQlpdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRocmVhZCAxIHdpbGwgaGF2ZSB0aGUgZmlyc3QgZWxlbWVudCwKLQkJLy8gYnV0IHRocmVhZCAyIHdpbGwgdGhpbmsgdGhlcmUgYXJlIG1vcmUgInByZXZpb3VzIiBlbGVtZW50cyBvbiB0aGUgaXRlcmF0b3IgOi0oCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcnVubmFibGUxLnByZXZpb3VzKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHJ1bm5hYmxlMi5oYXNQcmV2aW91cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZEhhc1ByZXZpb3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlIYXNQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBIYXNQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBmaXJzdCBlbGVtZW50LAotCQkvLyBhbmQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGVyZSBhcmUgbm8gbW9yZSAicHJldmlvdXMiIGVsZW1lbnRzIG9uIHRoZSBpdGVyYXRvciA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTEucHJldmlvdXMpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJ1bm5hYmxlMi5oYXNQcmV2aW91cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3luY2hyb25pemVkTmV4dEluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlOZXh0SW5kZXhUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgTmV4dEluZGV4VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJaXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aHJlYWQgMSB3aWxsIGhhdmUgdGhlIGZpcnN0IGVsZW1lbnQsCi0JCS8vIGJ1dCB0aHJlYWQgMiB3aWxsIHRoaW5rIHRoZSBuZXh0IGluZGV4IGlzIHN0aWxsIDAgOi0oCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRFcXVhbHMoMCwgcnVubmFibGUyLm5leHRJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZE5leHRJbmRleCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKG5lc3RlZEl0ZXJhdG9yKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlOZXh0SW5kZXhUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgTmV4dEluZGV4VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJbmVzdGVkSXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aHJlYWQgMSB3aWxsIGhhdmUgdGhlIGZpcnN0IGVsZW1lbnQsCi0JCS8vIGFuZCB0aHJlYWQgMiB3aWxsIHRoaW5rIHRoZSBuZXh0IGluZGV4IGlzIDEgOi0pCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRFcXVhbHMoMSwgcnVubmFibGUyLm5leHRJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3luY2hyb25pemVkUHJldmlvdXNJbmRleCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCVByZXZpb3VzSW5kZXhUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgUHJldmlvdXNJbmRleFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBmaXJzdCBlbGVtZW50LAotCQkvLyBidXQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGUgbmV4dCBpbmRleCBpcyBzdGlsbCAwIDotKAotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJ1bm5hYmxlMS5wcmV2aW91cyk7Ci0JCWFzc2VydEVxdWFscygwLCBydW5uYWJsZTIucHJldmlvdXNJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZFByZXZpb3VzSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihuZXN0ZWRJdGVyYXRvcik7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCVByZXZpb3VzSW5kZXhUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgUHJldmlvdXNJbmRleFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBmaXJzdCBlbGVtZW50LAotCQkvLyBhbmQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGUgbmV4dCBpbmRleCBpcyAtMSA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTEucHJldmlvdXMpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHJ1bm5hYmxlMi5wcmV2aW91c0luZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWRTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJU2V0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUyID0gbmV3IFNldFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yLCAieHh4Iik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQlpdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRoZSB3cm9uZyBlbGVtZW50IHdhcyBzZXQgOi0oCi0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygieHh4IikpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZFNldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKG5lc3RlZEl0ZXJhdG9yKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCVNldFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBTZXRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvciwgInh4eCIpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJbmVzdGVkSXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aGUgcmlnaHQgZWxlbWVudCB3YXMgc2V0IDotKQotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJ1bm5hYmxlMS5uZXh0KTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEZhbHNlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJ4eHgiKSk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiYmF6IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZEFkZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlBZGRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgQWRkVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IsICJ4eHgiKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhlIGVsZW1lbnQgd2FzIGFkZGVkIGF0IHRoZSB3cm9uZyBpbmRleCA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoMCwgaXRlcmF0b3IubGlzdC5pbmRleE9mKCJ4eHgiKSk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygieHh4IikpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZEFkZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKG5lc3RlZEl0ZXJhdG9yKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCUFkZFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBBZGRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvciwgInh4eCIpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJbmVzdGVkSXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aGUgZWxlbWVudCB3YXMgYWRkZWQgYXQgdGhlIGNvcnJlY3QgaW5kZXggOi0pCi0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRUcnVlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5lc3RlZEl0ZXJhdG9yLmxpc3QuaW5kZXhPZigieHh4IikpOwotCQlhc3NlcnRUcnVlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoInh4eCIpKTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiYmF6IikpOwotCX0KLQotCUBPdmVycmlkZQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFN5bmNocm9uaXplZExpc3RJdGVyYXRvcjxTdHJpbmc+KChMaXN0SXRlcmF0b3I8U3RyaW5nPikgbmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCUBPdmVycmlkZQotCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFRlc3RJdGVyYXRvcihsb25nIGRlbGF5KSB7Ci0JCXJldHVybiBuZXcgVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+KGRlbGF5LCB0aGlzLmJ1aWxkQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogcHJldmlvdXMgcnVubmFibGUKLQkgKi8KLQljbGFzcyBQcmV2aW91c1Rlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCQlFIHByZXZpb3VzOwotCi0JCVByZXZpb3VzVGVzdFJ1bm5hYmxlKExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMucHJldmlvdXMgPSB0aGlzLml0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGhhcyBwcmV2aW91cyBydW5uYWJsZQotCSAqLwotCWNsYXNzIEhhc1ByZXZpb3VzVGVzdFJ1bm5hYmxlPEU+IGltcGxlbWVudHMgUnVubmFibGUgewotCQlmaW5hbCBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0JCWJvb2xlYW4gaGFzUHJldmlvdXM7Ci0KLQkJSGFzUHJldmlvdXNUZXN0UnVubmFibGUoTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5oYXNQcmV2aW91cyA9IHRoaXMuaXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogbmV4dCBpbmRleCBydW5uYWJsZQotCSAqLwotCWNsYXNzIE5leHRJbmRleFRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCQlpbnQgbmV4dEluZGV4OwotCi0JCU5leHRJbmRleFRlc3RSdW5uYWJsZShMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLm5leHRJbmRleCA9IHRoaXMuaXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHByZXZpb3VzIGluZGV4IHJ1bm5hYmxlCi0JICovCi0JY2xhc3MgUHJldmlvdXNJbmRleFRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCQlpbnQgcHJldmlvdXNJbmRleDsKLQotCQlQcmV2aW91c0luZGV4VGVzdFJ1bm5hYmxlKExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMucHJldmlvdXNJbmRleCA9IHRoaXMuaXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBzZXQgcnVubmFibGUKLQkgKi8KLQljbGFzcyBTZXRUZXN0UnVubmFibGU8RT4gaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCWZpbmFsIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQkJZmluYWwgRSBlbGVtZW50OwotCi0JCVNldFRlc3RSdW5uYWJsZShMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IsIEUgZWxlbWVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnNldCh0aGlzLmVsZW1lbnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBhZGQgcnVubmFibGUKLQkgKi8KLQljbGFzcyBBZGRUZXN0UnVubmFibGU8RT4gaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCWZpbmFsIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQkJZmluYWwgRSBlbGVtZW50OwotCi0JCUFkZFRlc3RSdW5uYWJsZShMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IsIEUgZWxlbWVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLmFkZCh0aGlzLmVsZW1lbnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGl0ZXJhdG9yOiBJZiB7QGxpbmsgI25leHQoKX0gb3Ige0BsaW5rICNwcmV2aW91cygpfSBpcyBjYWxsZWQKLQkgKiB3aGlsZSBleGVjdXRpbmcgb24gdGhlIHtAbGluayBzbG93VGhyZWFkfSwgdGhlIGl0ZXJhdG9yIHdpbGwgZGVsYXkKLQkgKiBmb3IgdGhlIGNvbmZpZ3VyZWQgdGltZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgVGVzdExpc3RJdGVyYXRvcjxFPiBleHRlbmRzIFRlc3RJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPiB7Ci0KLQkJVGVzdExpc3RJdGVyYXRvcihsb25nIGRlbGF5LCBFLi4uIGFycmF5KSB7Ci0JCQlzdXBlcihkZWxheSwgYXJyYXkpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZXh0SW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJCXJldHVybiB0aGlzLm5leHRJbmRleCAhPSAwOwotCQl9Ci0KLQkJcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCQlpZiAodGhpcy5oYXNQcmV2aW91cygpKSB7Ci0JCQkJRSBwcmV2aW91cyA9IHRoaXMubGlzdC5nZXQodGhpcy5wcmV2aW91c0luZGV4KCkpOwotCQkJCWlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IHRoaXMuc2xvd1RocmVhZCkgewotCQkJCQlUZXN0VG9vbHMuc2xlZXAodGhpcy5kZWxheSk7Ci0JCQkJfQotCQkJCXRoaXMubmV4dEluZGV4LS07Ci0JCQkJdGhpcy5sYXN0SW5kZXggPSB0aGlzLm5leHRJbmRleDsKLQkJCQlyZXR1cm4gcHJldmlvdXM7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQkJcmV0dXJuIHRoaXMubmV4dEluZGV4IC0gMTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJCWlmICh0aGlzLmxhc3RJbmRleCA9PSAtMSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMubGlzdC5zZXQodGhpcy5sYXN0SW5kZXgsIGUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQkJdGhpcy5saXN0LmFkZCh0aGlzLmxhc3RJbmRleCwgZSk7Ci0JCQl0aGlzLmxhc3RJbmRleCsrOwotCQkJdGhpcy5sYXN0SW5kZXggPSAtMTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2ZhN2ZhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVySGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyB0cmFuc2Zvcm1hdGlvbiIsICsraSwgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0VXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgdHJhbnNmb3JtYXRpb24iLCArK2ksICgoSW50ZWdlcikgc3RyZWFtLm5leHQoKSkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgdHJhbnNmb3JtYXRpb24iLCArK2ksIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVyVHJhbnNmb3JtYXRpb25JdGVyYXRvcihjLml0ZXJhdG9yKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZENvbGxlY3Rpb24oKS5zaXplKCkgLSAxLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24iLCBjLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGMuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lclJlbW92ZSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKGMuaXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZENvbGxlY3Rpb24oKS5zaXplKCkgLSAxLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24iLCBjLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGMuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlJbnRlZ2VyIGludGVnZXIgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJaW50ZWdlciA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWludGVnZXIgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgaW50ZWdlciwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaW50IGkgPSBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCk7Ci0JCQlpZiAoaSA9PSAzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJ1aWxkSXRlcmF0b3IoKS5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXJVcGNhc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25JdGVyYXRvcih0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgSW50ZWdlcj4obmVzdGVkSXRlcmF0b3IsIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVXBjYXN0KEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE9iamVjdCwgT2JqZWN0PihuZXN0ZWRJdGVyYXRvciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcihuZXh0Lmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1lclVwY2FzdCgpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4oKSB7Ci0JCQlwdWJsaWMgSW50ZWdlciB0cmFuc2Zvcm0oT2JqZWN0IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoKChTdHJpbmcpIG5leHQpLmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiMSIpOwotCQljLmFkZCgiMjIiKTsKLQkJYy5hZGQoIjMzMyIpOwotCQljLmFkZCgiNDQ0NCIpOwotCQljLmFkZCgiNTU1NTUiKTsKLQkJYy5hZGQoIjY2NjY2NiIpOwotCQljLmFkZCgiNzc3Nzc3NyIpOwotCQljLmFkZCgiODg4ODg4ODgiKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoKSB7Ci0JCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCUl0ZXJhdG9yPEludGVnZXI+IGl0ZXJhdG9yID0gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpLml0ZXJhdG9yKCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJbnRlZ2VyIGludGVnZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGludGVnZXI6ICIgKyBpbnRlZ2VyKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ODYzZTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0QW5kSGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dEFuZEhhc1ByZXZpb3VzVXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJIYXNOZXh0QW5kSGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDgsIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0QW5kUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoKytpLCBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkpOwotCQl9Ci0KLQkJKytpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKC0taSwgc3RyZWFtLnByZXZpb3VzKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0QW5kUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygrK2ksIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQotCQkrK2k7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoLS1pLCBzdHJlYW0ucHJldmlvdXMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhBbmRQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IC0xOwotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygrK2ksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0KLQkJKytpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKC0taSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lck5leHRJbmRleEFuZFByZXZpb3VzSW5kZXgoKSB7Ci0JCWludCBpID0gLTE7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoKytpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCi0JCSsraTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygtLWksIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlMaXN0PFN0cmluZz4gbCA9IHRoaXMuYnVpbGRMaXN0KCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lclRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKGwubGlzdEl0ZXJhdG9yKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZExpc3QoKS5zaXplKCkgLSAxLCBsLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGxpc3QiLCBsLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGwuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lclJlbW92ZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSB0aGlzLmJ1aWxkTGlzdCgpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IobC5saXN0SXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZExpc3QoKS5zaXplKCkgLSAxLCBsLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGxpc3QiLCBsLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGwuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbk9uQWRkKCkgewotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5hZGQobmV3IEludGVnZXIoMCkpOwotCQkJZmFpbCgiZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbk9uU2V0KCkgewotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5zZXQobmV3IEludGVnZXIoMCkpOwotCQkJZmFpbCgiZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQkJSW50ZWdlciBpbnRlZ2VyID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWludGVnZXIgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpbnRlZ2VyID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGludGVnZXIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWludCBpID0gc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpOwotCQkJaWYgKGkgPT0gMykgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5idWlsZEl0ZXJhdG9yKCkucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkSXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lclVwY2FzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcih0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxTdHJpbmcsIEludGVnZXI+KG5lc3RlZEl0ZXJhdG9yLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8T2JqZWN0PiBidWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVXBjYXN0KExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yLCBUcmFuc2Zvcm1lcjxPYmplY3QsIEludGVnZXI+IHRyYW5zZm9ybWVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8T2JqZWN0LCBPYmplY3Q+KG5lc3RlZEl0ZXJhdG9yLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+KCkgewotCQkJcHVibGljIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyVXBjYXN0KCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShPYmplY3QgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcigoKFN0cmluZykgbmV4dCkubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTGlzdCgpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbC5hZGQoIjEiKTsKLQkJbC5hZGQoIjIyIik7Ci0JCWwuYWRkKCIzMzMiKTsKLQkJbC5hZGQoIjQ0NDQiKTsKLQkJbC5hZGQoIjU1NTU1Iik7Ci0JCWwuYWRkKCI2NjY2NjYiKTsKLQkJbC5hZGQoIjc3Nzc3NzciKTsKLQkJbC5hZGQoIjg4ODg4ODg4Iik7Ci0JCXJldHVybiBsOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTGlzdCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcigpIHsKLQkJLy8gbWlzc2luZyBtZXRob2Qgb3ZlcnJpZGUKLQkJSXRlcmF0b3I8SW50ZWdlcj4gaXRlcmF0b3IgPSBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPih0aGlzLmJ1aWxkTGlzdCgpLmxpc3RJdGVyYXRvcigpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSW50ZWdlciBpbnRlZ2VyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCBpbnRlZ2VyOiAiICsgaW50ZWdlcik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJlZUl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNjU4ZDIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJlZUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJlZUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqIHRoaXMgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhbGwgdGhlIG5vZGVzIGNyZWF0ZWQgZm9yIHRoZSB0ZXN0ICovCi0JQ29sbGVjdGlvbjxUcmVlTm9kZT4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlPigpOwotCi0JcHVibGljIFRyZWVJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dDEoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzTmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dDIoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzTmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTmV4dChJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IpIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMubm9kZXMuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dDEoKSB7Ci0JCXRoaXMudmVyaWZ5TmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dDIoKSB7Ci0JCXRoaXMudmVyaWZ5TmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TmV4dChJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgZWxlbWVudCIsIHRoaXMubm9kZXMuY29udGFpbnMoaXRlcmF0b3IubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbihJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlMSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmUodGhpcy5idWlsZFRyZWVJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZTIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlKHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmUoSXRlcmF0b3I8VHJlZU5vZGU+IGl0ZXJhdG9yKSB7Ci0JCVN0cmluZyBwYXJlbnROYW1lID0gImNoaWxkIDIiOwotCQlTdHJpbmcgY2hpbGROYW1lID0gImdyYW5kY2hpbGQgMkEiOwotCQlpbnQgc3RhcnRTaXplID0gdGhpcy5jaGlsZHJlblNpemUocGFyZW50TmFtZSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVRyZWVOb2RlIG5vZGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlpbnQgZW5kU2l6ZSA9IHRoaXMuY2hpbGRyZW5TaXplKHBhcmVudE5hbWUpOwotCQlhc3NlcnRFcXVhbHMoc3RhcnRTaXplIC0gMSwgZW5kU2l6ZSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY2hpbGRyZW5TaXplKFN0cmluZyBub2RlTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yPFRyZWVOb2RlPiBzdHJlYW0gPSB0aGlzLm5vZGVzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlUcmVlTm9kZSBub2RlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChub2RlLmdldE5hbWUoKS5lcXVhbHMobm9kZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIG5vZGUuY2hpbGRyZW5TaXplKCk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihub2RlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYSB0cmVlIGl0ZXJhdG9yIHdpdGggYW4gZXhwbGljaXQgbWlkd2lmZQotCSAqLwotCXByaXZhdGUgSXRlcmF0b3I8VHJlZU5vZGU+IGJ1aWxkVHJlZUl0ZXJhdG9yMSgpIHsKLQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3I8VHJlZU5vZGU+KHRoaXMuYnVpbGRUcmVlKCksIHRoaXMuYnVpbGRNaWR3aWZlKCkpOwotCX0KLQotCXByaXZhdGUgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8VHJlZU5vZGU+IGJ1aWxkTWlkd2lmZSgpIHsKLQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3IuTWlkd2lmZTxUcmVlTm9kZT4oKSB7Ci0JCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKFRyZWVOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIGEgdHJlZSBpdGVyYXRvciB3aXRoIGFuIG92ZXJyaWRlCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvcjxUcmVlTm9kZT4gYnVpbGRUcmVlSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYXRvcjxUcmVlTm9kZT4odGhpcy5idWlsZFRyZWUoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKFRyZWVOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVHJlZUl0ZXJhdG9yKCkgewotCQkvLyBtaXNzaW5nIG1ldGhvZCBvdmVycmlkZQotCQlJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IgPSBuZXcgVHJlZUl0ZXJhdG9yPFRyZWVOb2RlPih0aGlzLmJ1aWxkVHJlZSgpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJVHJlZU5vZGUgdG4gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIHRyZWUgbm9kZTogIiArIHRuKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTm9kZSBidWlsZFRyZWUoKSB7Ci0JCVRyZWVOb2RlIHJvb3QgPSBuZXcgVHJlZU5vZGUoInJvb3QiKTsKLQkJVHJlZU5vZGUgY2hpbGQxID0gbmV3IFRyZWVOb2RlKHJvb3QsICJjaGlsZCAxIik7Ci0JCW5ldyBUcmVlTm9kZShjaGlsZDEsICJncmFuZGNoaWxkIDFBIik7Ci0JCVRyZWVOb2RlIGNoaWxkMiA9IG5ldyBUcmVlTm9kZShyb290LCAiY2hpbGQgMiIpOwotCQluZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQSIpOwotCQlUcmVlTm9kZSBncmFuZGNoaWxkMkIgPSBuZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQiIpOwotCQluZXcgVHJlZU5vZGUoZ3JhbmRjaGlsZDJCLCAiZ3JlYXQtZ3JhbmRjaGlsZCAyQjEiKTsKLQkJbmV3IFRyZWVOb2RlKGdyYW5kY2hpbGQyQiwgImdyZWF0LWdyYW5kY2hpbGQgMkIyIik7Ci0JCVRyZWVOb2RlIGdyYW5kY2hpbGQyQyA9IG5ldyBUcmVlTm9kZShjaGlsZDIsICJncmFuZGNoaWxkIDJDIik7Ci0JCW5ldyBUcmVlTm9kZShncmFuZGNoaWxkMkMsICJncmVhdC1ncmFuZGNoaWxkIDJDMSIpOwotCQluZXcgVHJlZU5vZGUocm9vdCwgImNoaWxkIDMiKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUcmVlTm9kZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxUcmVlTm9kZT4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlPigpOwotCi0JCXB1YmxpYyBUcmVlTm9kZShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCVRyZWVJdGVyYXRvclRlc3RzLnRoaXMubm9kZXMuYWRkKHRoaXMpOyAvLyBsb2cgbm9kZQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBUcmVlTm9kZShUcmVlTm9kZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzKG5hbWUpOwotCQkJcGFyZW50LmFkZENoaWxkKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRDaGlsZChUcmVlTm9kZSBjaGlsZCkgewotCQkJdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPFRyZWVOb2RlPiBjaGlsZHJlbigpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLnNpemUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUcmVlTm9kZSgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL0NoYW5nZVN1cHBvcnRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9DaGFuZ2VTdXBwb3J0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdmNDMwYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL0NoYW5nZVN1cHBvcnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENoYW5nZVN1cHBvcnRUZXN0cwotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9UT19TVFJJTkcgPSAidGhpcyBpcyBhIHRlc3QiOwotCi0JQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgPSBuZXcgQWRhcHRlcigpOwotCi0JU3RhdGVDaGFuZ2VFdmVudCBzdGF0ZUNoYW5nZUV2ZW50OwotCWJvb2xlYW4gc3RhdGVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0KLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IHByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0JYm9vbGVhbiBwcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJwcm9wZXJ0eU5hbWUiOwotCXN0YXRpYyBmaW5hbCBPYmplY3QgT0xEX09CSkVDVF9WQUxVRSA9IG5ldyBPYmplY3QoKTsKLQlzdGF0aWMgZmluYWwgT2JqZWN0IE5FV19PQkpFQ1RfVkFMVUUgPSBuZXcgT2JqZWN0KCk7Ci0Jc3RhdGljIGZpbmFsIEludGVnZXIgT0xEX0lOVF9WQUxVRSA9IG5ldyBJbnRlZ2VyKDI3KTsKLQlzdGF0aWMgZmluYWwgQm9vbGVhbiBPTERfQk9PTEVBTl9WQUxVRSA9IEJvb2xlYW4uVFJVRTsKLQlzdGF0aWMgZmluYWwgSW50ZWdlciBORVdfSU5UX1ZBTFVFID0gbmV3IEludGVnZXIoNDIpOwotCXN0YXRpYyBmaW5hbCBCb29sZWFuIE5FV19CT09MRUFOX1ZBTFVFID0gQm9vbGVhbi5GQUxTRTsKLQotCUNvbGxlY3Rpb25FdmVudCBjb2xsZWN0aW9uRXZlbnQ7Ci0JYm9vbGVhbiBpdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBDT0xMRUNUSU9OX05BTUUgPSAiY29sbGVjdGlvbk5hbWUiOwotCXN0YXRpYyBmaW5hbCBPYmplY3QgQURERURfT0JKRUNUX1ZBTFVFID0gbmV3IE9iamVjdCgpOwotCXN0YXRpYyBmaW5hbCBPYmplY3QgQURERURfT0JKRUNUX1ZBTFVFXzIgPSBuZXcgT2JqZWN0KCk7Ci0Jc3RhdGljIGZpbmFsIE9iamVjdCBSRU1PVkVEX09CSkVDVF9WQUxVRSA9IG5ldyBPYmplY3QoKTsKLQlzdGF0aWMgZmluYWwgaW50IFRBUkdFVF9JTkRFWCA9IDc7Ci0Jc3RhdGljIGZpbmFsIGludCBTT1VSQ0VfSU5ERVggPSAyMjsKLQotCUxpc3RFdmVudCBsaXN0RXZlbnQ7Ci0JYm9vbGVhbiBpdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGl0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBsaXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gbGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfTkFNRSA9ICJsaXN0TmFtZSI7Ci0Jc3RhdGljIGZpbmFsIGludCBBRERfSU5ERVggPSAzOwotCXN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX0lOREVYID0gNTsKLQlzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VfSU5ERVggPSAyOwotCi0JVHJlZUV2ZW50IHRyZWVFdmVudDsKLQlib29sZWFuIG5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gbm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIHRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiB0cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFJFRV9OQU1FID0gInRyZWVOYW1lIjsKLQlzdGF0aWMgZmluYWwgTGlzdDxPYmplY3Q+IE9CSkVDVF9QQVRIID0gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10ge25ldyBPYmplY3QoKSwgbmV3IE9iamVjdCgpLCBuZXcgU3RyaW5nKCl9KTsKLQotCi0JcHVibGljIENoYW5nZVN1cHBvcnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdlbmVyYWwgdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdE51bGxTb3VyY2UoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNoYW5nZVN1cHBvcnQgY3MgPSBuZXcgQ2hhbmdlU3VwcG9ydChudWxsKTsKLQkJCWZhaWwoImJvZ3VzIGNoYW5nZSBzdXBwb3J0OiAiICsgY3MpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlU3RhdGVDaGFuZ2UoKSB7Ci0JCXRoaXMuc3RhdGVDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuc3RhdGVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVN0YXRlQ2hhbmdlKCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5zdGF0ZUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLnN0YXRlQ2hhbmdlRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3RhdGVDaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9TdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzRHVwbGljYXRlKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE51bGxTdGF0ZUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c1N0YXRlTGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobmV3IEFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKG5ldyBTdGF0ZUNoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2UgdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudCgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudE5vQ2hhbmdlKCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3QoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPTERfT0JKRUNUX1ZBTFVFLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE9iamVjdCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3QoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE9iamVjdE5vQ2hhbmdlKCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE9iamVjdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0KCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQobnVsbCwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChudWxsLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3ROb0NoYW5nZSgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludCgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnQoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9JTlRfVkFMVUUsIE5FV19JTlRfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkSW50SW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX0lOVF9WQUxVRSwgTkVXX0lOVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkSW50SW50Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkSW50SW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbigpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbigpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX0JPT0xFQU5fVkFMVUUsIE5FV19CT09MRUFOX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEJvb2xlYW5Cb29sZWFuKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEJvb2xlYW5Cb29sZWFuKCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPTERfQk9PTEVBTl9WQUxVRSwgTkVXX0JPT0xFQU5fVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbigpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW5Ob0NoYW5nZSgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEJvb2xlYW5Cb29sZWFuTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW5Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUFJPUEVSVFlfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUFJPUEVSVFlfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbFByb3BlcnR5TGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsUHJvcGVydHlMaXN0ZW5lck5hbWUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c1Byb3BlcnR5TGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBQcm9wZXJ0eUNoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgUHJvcGVydHlDaGFuZ2VBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IFByb3BlcnR5Q2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMudGVzdE1vZGVsLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFBST1BFUlRZX05BTUUsIHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sbGVjdGlvbiBjaGFuZ2UgdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50KCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb24oKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbUFkZGVkQ29sbGVjdGlvbigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnQoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25FdmVudCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25FdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25FdmVudE5vQ2hhbmdlKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb24oKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1SZW1vdmVkQ29sbGVjdGlvbigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVtb3ZlZENvbGxlY3Rpb24oKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2xlYXJlZCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2xlYXJlZCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWRFdmVudCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTWl4ZWQoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25NaXhlZCgpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFXzIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25NaXhlZCgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25NaXhlZCgpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFXzIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25NaXhlZCgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VFdmVudDIoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUsICJmb28iLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZUV2ZW50MihSRU1PVkVEX09CSkVDVF9WQUxVRSwgImZvbyIsICJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTEoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UyKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UyKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMygpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UzKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTMoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMygpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UzKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24xKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24xKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24xKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24xKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24xKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQkvLyBjb2xsZWN0aW9uIGNsZWFyZWQuLi4KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24yKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbjIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbjIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTEoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTEoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTEoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTEoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTEoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbk5vQ2hhbmdlMigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyQ29sbGVjdGlvbigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckNvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckNvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckNvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdENsZWFyQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckNvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZUNvbGxlY3Rpb24xKCkgewotCQlDb2xsZWN0aW9uU3luY2hMaXN0ZW5lciBjc2wgPSBuZXcgQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIoKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIoY3NsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMSgpKTsKLQkJYXNzZXJ0VHJ1ZShjc2wuaXRlbXNBZGRlZCk7Ci0JCWFzc2VydFRydWUoY3NsLml0ZW1zUmVtb3ZlZCk7Ci0JCWFzc2VydEZhbHNlKGNzbC5jb2xsZWN0aW9uQ2hhbmdlZCk7Ci0JCWFzc2VydEZhbHNlKGNzbC5jb2xsZWN0aW9uQ2xlYXJlZCk7Ci0JCWFzc2VydEVxdWFscygyLCBjc2wuYWRkZWRJdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjc2wuYWRkZWRJdGVtcywgbmV3IE9iamVjdFtdIHsiam9vIiwgImphciJ9KSk7Ci0JCWFzc2VydEVxdWFscygyLCBjc2wucmVtb3ZlZEl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGNzbC5yZW1vdmVkSXRlbXMsIG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXIifSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZUNvbGxlY3Rpb24yKCkgewotCQlDb2xsZWN0aW9uU3luY2hMaXN0ZW5lciBjc2wgPSBuZXcgQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIoKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIoY3NsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMigpKTsKLQkJYXNzZXJ0RmFsc2UoY3NsLml0ZW1zQWRkZWQpOwotCQlhc3NlcnRGYWxzZShjc2wuaXRlbXNSZW1vdmVkKTsKLQkJYXNzZXJ0RmFsc2UoY3NsLmNvbGxlY3Rpb25DaGFuZ2VkKTsKLQkJYXNzZXJ0VHJ1ZShjc2wuY29sbGVjdGlvbkNsZWFyZWQpOwotCQlhc3NlcnRUcnVlKGNzbC5hZGRlZEl0ZW1zLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoY3NsLnJlbW92ZWRJdGVtcy5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZUNvbGxlY3Rpb24zKCkgewotCQlDb2xsZWN0aW9uU3luY2hMaXN0ZW5lciBjc2wgPSBuZXcgQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIoKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIoY3NsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMygpKTsKLQkJYXNzZXJ0VHJ1ZShjc2wuaXRlbXNBZGRlZCk7Ci0JCWFzc2VydEZhbHNlKGNzbC5pdGVtc1JlbW92ZWQpOwotCQlhc3NlcnRGYWxzZShjc2wuY29sbGVjdGlvbkNoYW5nZWQpOwotCQlhc3NlcnRGYWxzZShjc2wuY29sbGVjdGlvbkNsZWFyZWQpOwotCQlhc3NlcnRFcXVhbHMoMywgY3NsLmFkZGVkSXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoY3NsLmFkZGVkSXRlbXMsIG5ldyBPYmplY3RbXSB7ImpvbyIsICJqYXIiLCAiYmF6In0pKTsKLQkJYXNzZXJ0VHJ1ZShjc2wucmVtb3ZlZEl0ZW1zLmlzRW1wdHkoKSk7Ci0JfQotCi0JY2xhc3MgQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIgZXh0ZW5kcyBDaGFuZ2VBZGFwdGVyIHsKLQkJYm9vbGVhbiBpdGVtc0FkZGVkID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbXNSZW1vdmVkID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb2xsZWN0aW9uQ2xlYXJlZCA9IGZhbHNlOwotCQlDb2xsZWN0aW9uPE9iamVjdD4gYWRkZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlDb2xsZWN0aW9uPE9iamVjdD4gcmVtb3ZlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZCA9IHRydWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQl0aGlzLml0ZW1zQWRkZWQgPSB0cnVlOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmFkZGVkSXRlbXMsIGV2ZW50LmdldEl0ZW1zKCkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQl0aGlzLml0ZW1zUmVtb3ZlZCA9IHRydWU7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMucmVtb3ZlZEl0ZW1zLCBldmVudC5nZXRJdGVtcygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDT0xMRUNUSU9OX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDT0xMRUNUSU9OX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENPTExFQ1RJT05fTkFNRSkpOwotCi0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENPTExFQ1RJT05fTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENPTExFQ1RJT05fTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ09MTEVDVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE51bGxDb2xsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUJvZ3VzQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBDb2xsZWN0aW9uQ2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IENvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvbkV2ZW50KE9iamVjdCBpdGVtKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMuY29sbGVjdGlvbkV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jb2xsZWN0aW9uRXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCWFzc2VydEVxdWFscyhpdGVtLCB0aGlzLmdldENvbGxlY3Rpb25FdmVudEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTw/PiBnZXRDb2xsZWN0aW9uRXZlbnRJdGVtcygpIHsKLQkJaWYgKHRoaXMuY29sbGVjdGlvbkV2ZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbkFkZEV2ZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuY29sbGVjdGlvbkV2ZW50KS5nZXRJdGVtcygpOwotCQl9IGVsc2UgaWYgKHRoaXMuY29sbGVjdGlvbkV2ZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHRoaXMuY29sbGVjdGlvbkV2ZW50KS5nZXRJdGVtcygpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvbkNoYW5nZUV2ZW50MihPYmplY3QuLi4gaXRlbXMpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5jb2xsZWN0aW9uRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNvbGxlY3Rpb25FdmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW1zLmxlbmd0aCwgdGhpcy5nZXRDb2xsZWN0aW9uRXZlbnRJdGVtc1NpemUoKSk7Ci0JCWZvciAoT2JqZWN0IGl0ZW0gOiBpdGVtcykgewotCQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRDb2xsZWN0aW9uRXZlbnRJdGVtcygpLCBpdGVtKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBnZXRDb2xsZWN0aW9uRXZlbnRJdGVtc1NpemUoKSB7Ci0JCWlmICh0aGlzLmNvbGxlY3Rpb25FdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25BZGRFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvbkFkZEV2ZW50KSB0aGlzLmNvbGxlY3Rpb25FdmVudCkuZ2V0SXRlbXNTaXplKCk7Ci0JCX0gZWxzZSBpZiAodGhpcy5jb2xsZWN0aW9uRXZlbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHsKLQkJCXJldHVybiAoKENvbGxlY3Rpb25SZW1vdmVFdmVudCkgdGhpcy5jb2xsZWN0aW9uRXZlbnQpLmdldEl0ZW1zU2l6ZSgpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2UgdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudChBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KEFERF9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudChBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkTGlzdE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtQWRkZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudChBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtQWRkZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KEFERF9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnQoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudChSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoUkVNT1ZFX0lOREVYLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3ROb0NoYW5nZSgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVtb3ZlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoUkVNT1ZFX0lOREVYLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVtb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZXBsYWNlRXZlbnQoUkVQTEFDRV9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudChSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3ROb0NoYW5nZSgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlcGxhY2VkTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZXBsYWNlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVwbGFjZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlcGxhY2VkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZXBsYWNlRXZlbnQoUkVQTEFDRV9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZXBsYWNlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0TW92ZUV2ZW50KFRBUkdFVF9JTkRFWCwgU09VUkNFX0lOREVYKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0TW92ZUV2ZW50KFRBUkdFVF9JTkRFWCwgU09VUkNFX0lOREVYKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNNb3ZlZExpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RNb3ZlRXZlbnQoVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudChUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1Nb3ZlZExpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtTW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudChUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1Nb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtTW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudChUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1Nb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlTGlzdENsZWFyZWRFdmVudCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDbGVhcmVkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2xlYXJFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENsZWFyZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDbGVhckV2ZW50KCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDbGVhcmVkRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlTGlzdENsZWFyZWQoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDbGVhckV2ZW50KCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDbGVhcmVkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENsZWFyZWQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2xlYXJFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2hhbmdlZEV2ZW50KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2VFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2hhbmdlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2VFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2hhbmdlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDaGFuZ2VkKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2hhbmdlZCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2VFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2hhbmdlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0xpc3RJbmRleCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvTGlzdEluZGV4KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KDIsICJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9MaXN0SW5kZXgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3RJbmRleCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudCgyLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvTGlzdEluZGV4KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbVRvTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudCgzLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudCgzLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXgoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMiwgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMiwgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdEluZGV4Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXhOb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0xpc3RJbmRleE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXhOb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9MaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudCgzLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0xpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KDMsICJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9MaXN0Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtRnJvbUxpc3RJbmRleCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3RJbmRleCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgxLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdEluZGV4KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3RJbmRleCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbUZyb21MaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgxLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgxLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgxLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgxLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXhOb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgxLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KDEsICJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluSXRlbXNJbkxpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMCwgImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KDAsICJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJdGVtSW5MaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZXBsYWNlSXRlbUluTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZXBsYWNlRXZlbnQoMSwgInh4eCIsICJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZXBsYWNlSXRlbUluTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVwbGFjZUl0ZW1Jbkxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KDEsICJ4eHgiLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVwbGFjZUl0ZW1Jbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVtc0luTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0U2V0SXRlbXNJbkxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KDEsICJ4eHgiLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0U2V0SXRlbXNJbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFNldEl0ZW1zSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudCgxLCAieHh4IiwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFNldEl0ZW1zSW5MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1zSW5MaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RNb3ZlSXRlbXNJbkxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0TW92ZUV2ZW50KDIsIDQsIDIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdE1vdmVJdGVtc0luTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0TW92ZUl0ZW1zSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudCgyLCA0LCAyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RNb3ZlSXRlbXNJbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckxpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdENsZWFyTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDbGVhckV2ZW50KCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2xlYXJFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdENsZWFyTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFN5bmNocm9uaXplTGlzdCgpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RTeW5jaHJvbml6ZUxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RTeW5jaHJvbml6ZUxpc3QoKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0U3luY2hyb25pemVMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55TGlzdENoYW5nZUxpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX05BTUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsTGlzdExpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c0xpc3RMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgTGlzdENoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBMaXN0Q2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RBZGRFdmVudChpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMubGlzdEV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExJU1RfTkFNRSwgdGhpcy5saXN0RXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0QWRkRXZlbnQpIHRoaXMubGlzdEV2ZW50KS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW0sICgoTGlzdEFkZEV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RSZW1vdmVFdmVudChpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMubGlzdEV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExJU1RfTkFNRSwgdGhpcy5saXN0RXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMubGlzdEV2ZW50KS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW0sICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RSZXBsYWNlRXZlbnQoaW50IGluZGV4LCBPYmplY3QgbmV3SXRlbSwgT2JqZWN0IG9sZEl0ZW0pIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5saXN0RXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTElTVF9OQU1FLCB0aGlzLmxpc3RFdmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGluZGV4LCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMubGlzdEV2ZW50KS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0l0ZW0sICgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5saXN0RXZlbnQpLmdldE5ld0l0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMob2xkSXRlbSwgKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0T2xkSXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RNb3ZlRXZlbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0TW92ZUV2ZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgMSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RNb3ZlRXZlbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5saXN0RXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTElTVF9OQU1FLCB0aGlzLmxpc3RFdmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRhcmdldEluZGV4LCAoKExpc3RNb3ZlRXZlbnQpIHRoaXMubGlzdEV2ZW50KS5nZXRUYXJnZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZUluZGV4LCAoKExpc3RNb3ZlRXZlbnQpIHRoaXMubGlzdEV2ZW50KS5nZXRTb3VyY2VJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGxlbmd0aCwgKChMaXN0TW92ZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0Q2xlYXJFdmVudCgpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5saXN0RXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTElTVF9OQU1FLCB0aGlzLmxpc3RFdmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RDbGVhckV2ZW50LmNsYXNzLCB0aGlzLmxpc3RFdmVudC5nZXRDbGFzcygpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdENoYW5nZUV2ZW50KCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLmxpc3RFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMSVNUX05BTUUsIHRoaXMubGlzdEV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdENoYW5nZUV2ZW50LmNsYXNzLCB0aGlzLmxpc3RFdmVudC5nZXRDbGFzcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJlZSBjaGFuZ2UgdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlQWRkZWRUcmVlKCkgewotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVBZGRlZFRyZWUoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQoT0JKRUNUX1BBVEgpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVBZGRlZFRyZWUoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVBZGRlZFRyZWUoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQoT0JKRUNUX1BBVEgpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVBZGRlZFRyZWUoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVBZGRlZFRyZWVFdmVudCgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQoT0JKRUNUX1BBVEgpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVBZGRlZFRyZWVFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlQWRkZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlQWRkZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZUFkZGVkVHJlZUV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZUV2ZW50KCkgewotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQoT0JKRUNUX1BBVEgpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZVJlbW92ZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlUmVtb3ZlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlUmVtb3ZlZFRyZWVFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZUV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZVJlbW92ZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlKCkgewotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVRyZWVDbGVhcmVkRXZlbnQoKSB7Ci0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmVlQ2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2xlYXJlZCgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDbGVhcmVkKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmVlQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDbGVhcmVkKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmVlQ2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2hhbmdlZEV2ZW50KCkgewotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNoYW5nZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNoYW5nZWQoKSB7Ci0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2hhbmdlZCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2hhbmdlZCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNoYW5nZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vVHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9UcmVlQ2hhbmdlTGlzdGVuZXJzKFRSRUVfTkFNRSkpOwotCi0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9UcmVlQ2hhbmdlTGlzdGVuZXJzKFRSRUVfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRSRUVfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1RyZWVDaGFuZ2VMaXN0ZW5lcnMoVFJFRV9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE51bGxUcmVlTGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUJvZ3VzVHJlZUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBUcmVlQ2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IFRyZWVDaGFuZ2VBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VHJlZUV2ZW50KExpc3Q8Pz4gcGF0aCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLnRyZWVFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhUUkVFX05BTUUsIHRoaXMudHJlZUV2ZW50LmdldFRyZWVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMocGF0aCwgdGhpcy5nZXRMaXN0UGF0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8Pz4gZ2V0TGlzdFBhdGgoKSB7Ci0JCUl0ZXJhYmxlPD8+IGl0ZXJhYmxlID0gdGhpcy5nZXRQYXRoKCk7Ci0JCXJldHVybiAoaXRlcmFibGUgPT0gbnVsbCkgID8gbnVsbCA6IENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPD8+IGdldFBhdGgoKSB7Ci0JCWlmICh0aGlzLnRyZWVFdmVudCBpbnN0YW5jZW9mIFRyZWVBZGRFdmVudCkgewotCQkJcmV0dXJuICgoVHJlZUFkZEV2ZW50KSB0aGlzLnRyZWVFdmVudCkuZ2V0UGF0aCgpOwotCQl9Ci0JCWlmICh0aGlzLnRyZWVFdmVudCBpbnN0YW5jZW9mIFRyZWVSZW1vdmVFdmVudCkgewotCQkJcmV0dXJuICgoVHJlZVJlbW92ZUV2ZW50KSB0aGlzLnRyZWVFdmVudCkuZ2V0UGF0aCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2QgdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlRXF1YWwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoImZvbyIpOwotCQljMS5hZGQoImJhciIpOwotCQljMS5hZGQoImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCJmb28iKTsKLQkJYzIuYWRkKCJiYXIiKTsKLQkJYzIuYWRkKCJiYXoiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0RWxlbWVudHNBcmVFcXVhbChjMSwgYzIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVEaWZmZXJlbnQoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoImZvbyIpOwotCQljMS5hZGQoImJhciIpOwotCQljMS5hZGQoImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCJiYXoiKTsKLQkJYzIuYWRkKCJiYXIiKTsKLQkJYzIuYWRkKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0RWxlbWVudHNBcmVEaWZmZXJlbnQoYzEsIGMyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0TW9kZWwgdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVFcXVhbDEoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZUVxdWFsKG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFZhbHVlc0FyZUVxdWFsMigpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0VmFsdWVzQXJlRXF1YWwoImZvbyIsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVFcXVhbDMoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVFcXVhbCgiZm9vIiwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRXF1YWw0KCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0VmFsdWVzQXJlRXF1YWwobnVsbCwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFZhbHVlc0FyZUVxdWFsNSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZUVxdWFsKCJiYXIiLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRGlmZmVyZW50MSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZURpZmZlcmVudChudWxsLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVEaWZmZXJlbnQyKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0VmFsdWVzQXJlRGlmZmVyZW50KCJmb28iLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRGlmZmVyZW50MygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0VmFsdWVzQXJlRGlmZmVyZW50KCJmb28iLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVEaWZmZXJlbnQ0KCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVEaWZmZXJlbnQobnVsbCwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFZhbHVlc0FyZURpZmZlcmVudDUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZURpZmZlcmVudCgiYmFyIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZDEoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQobnVsbCwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkMigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCgiZm9vIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZDMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCgiZm9vIiwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkNCgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKG51bGwsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQ1KCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQoImJhciIsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxBdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQxKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQobnVsbCwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkMigpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKCJmb28iLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkMygpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCgiZm9vIiwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkNCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZChudWxsLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkNSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCgiYmFyIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbENsb25lKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQotCQkvLyB2ZXJpZnkgdGhhdCB0aGUgY2xvbmUgZG9lcyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzCi0JCVRlc3RNb2RlbCBjbG9uZSA9IHRoaXMudGVzdE1vZGVsLmNsb25lKCk7Ci0JCWFzc2VydEZhbHNlKGNsb25lLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJY2xvbmUuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoY2xvbmUuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUFJPUEVSVFlfTkFNRSkpOwotCQkvLyBjaGVjayBvcmlnaW5hbAotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQotCQkvLyBub3cgdGVzdCBldmVudHMgZmlyZWQgYnkgb3JpZ2luYWwKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE9iamVjdCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJLy8gbm93IHRlc3QgZXZlbnRzIGZpcmVkIGJ5IGNsb25lCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJY2xvbmUudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3QoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KGNsb25lLCBPTERfT0JKRUNUX1ZBTFVFLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFRvU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRvU3RyaW5nKCkuY29udGFpbnMoJygnICsgVEVTVF9UT19TVFJJTkcgKyAnKScpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXIgaW1wbGVtZW50YXRpb25zICoqKioqKioqKioKLQotCWNsYXNzIEFkYXB0ZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnN0YXRlQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5zdGF0ZUNoYW5nZUV2ZW50ID0gZTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gZTsKLQkJfQotCQotCQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmNvbGxlY3Rpb25FdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmNvbGxlY3Rpb25FdmVudCA9IGU7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdEV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdEV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdEV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdEV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5saXN0RXZlbnQgPSBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5saXN0Q2hhbmdlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5saXN0RXZlbnQgPSBlOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubm9kZUFkZGVkQ2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMudHJlZUV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMudHJlZUV2ZW50ID0gZTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQkJVGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8vICoqKioqIHN0YXRlCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlU3RhdGVDaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCi0JCS8vICoqKioqIHByb3BlcnR5Ci0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgUFJPUEVSVFlfTkFNRSwgT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMsIFBST1BFUlRZX05BTUUsIE9MRF9PQkpFQ1RfVkFMVUUsIE9MRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1BFUlRZX05BTUUsIE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3ROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBPTERfT0JKRUNUX1ZBTFVFLCBPTERfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0KCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1BFUlRZX05BTUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3ROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBudWxsKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkSW50SW50KCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1BFUlRZX05BTUUsIE9MRF9JTlRfVkFMVUUuaW50VmFsdWUoKSwgTkVXX0lOVF9WQUxVRS5pbnRWYWx1ZSgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkSW50SW50Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPUEVSVFlfTkFNRSwgT0xEX0lOVF9WQUxVRS5pbnRWYWx1ZSgpLCBPTERfSU5UX1ZBTFVFLmludFZhbHVlKCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbigpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBPTERfQk9PTEVBTl9WQUxVRS5ib29sZWFuVmFsdWUoKSwgTkVXX0JPT0xFQU5fVkFMVUUuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbk5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1BFUlRZX05BTUUsIE9MRF9CT09MRUFOX1ZBTFVFLmJvb2xlYW5WYWx1ZSgpLCBPTERfQk9PTEVBTl9WQUxVRS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQotCQkvLyAqKioqKiBjb2xsZWN0aW9uCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQobmV3IENvbGxlY3Rpb25BZGRFdmVudCh0aGlzLCBDT0xMRUNUSU9OX05BTUUsIEFEREVEX09CSkVDVF9WQUxVRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKG5ldyBDb2xsZWN0aW9uQWRkRXZlbnQodGhpcywgQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uKCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChDT0xMRUNUSU9OX05BTUUsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihBRERFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbUFkZGVkQ29sbGVjdGlvbigpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChDT0xMRUNUSU9OX05BTUUsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25FdmVudCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChuZXcgQ29sbGVjdGlvblJlbW92ZUV2ZW50KHRoaXMsIENPTExFQ1RJT05fTkFNRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IENvbGxlY3Rpb25SZW1vdmVFdmVudCh0aGlzLCBDT0xMRUNUSU9OX05BTUUsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbigpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChDT0xMRUNUSU9OX05BTUUsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihSRU1PVkVEX09CSkVDVF9WQUxVRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlbW92ZWRDb2xsZWN0aW9uKCkgewotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoQ09MTEVDVElPTl9OQU1FLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DbGVhcmVkKCkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNsZWFyZWQoQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWRFdmVudCgpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQodGhpcywgQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihBRERFRF9PQkpFQ1RfVkFMVUUsIG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oQURERURfT0JKRUNUX1ZBTFVFLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24oQ29sbGVjdGlvbnMuc2luZ2xldG9uKEFEREVEX09CSkVDVF9WQUxVRSksIG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbihDb2xsZWN0aW9ucy5zaW5nbGV0b24oQURERURfT0JKRUNUX1ZBTFVFKSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk1peGVkKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24obmV3IE9iamVjdFtdIHtBRERFRF9PQkpFQ1RfVkFMVUUsIEFEREVEX09CSkVDVF9WQUxVRV8yfSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihSRU1PVkVEX09CSkVDVF9WQUxVRSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCJmb28iLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24obmV3IE9iamVjdFtdIHsiZm9vIiwgImJhciIsIFJFTU9WRURfT0JKRUNUX1ZBTFVFfSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UxKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKENvbGxlY3Rpb25zLmVtcHR5U2V0KCksIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMigpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihDb2xsZWN0aW9ucy5zaW5nbGV0b24oImZvbyIpLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTMoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oQ29sbGVjdGlvbnMuc2luZ2xldG9uKCJmb28iKSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbjEoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXIifSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbjIoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKENvbGxlY3Rpb25zLmVtcHR5U2V0KCksIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTEoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXIifSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbk5vQ2hhbmdlMigpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQkJY29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQkJY29sbGVjdGlvbi5hZGQoImJhciIpOwotCQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkNvbGxlY3Rpb24obmV3IE9iamVjdFtdIHsiZm9vIiwgImJhciIsIFJFTU9WRURfT0JKRUNUX1ZBTFVFfSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RDbGVhckNvbGxlY3Rpb24oKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJCXJldHVybiB0aGlzLmNsZWFyQ29sbGVjdGlvbihjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdENsZWFyQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckNvbGxlY3Rpb24oY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RTeW5jaHJvbml6ZUNvbGxlY3Rpb24xKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmF6Iik7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCW5ld0NvbGxlY3Rpb24uYWRkKCJqb28iKTsKLQkJCW5ld0NvbGxlY3Rpb24uYWRkKCJqYXIiKTsKLQkJCW5ld0NvbGxlY3Rpb24uYWRkKCJiYXoiKTsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGhpcy5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJCWFzc2VydEVxdWFscyhuZXdDb2xsZWN0aW9uLCBjb2xsZWN0aW9uKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMigpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQkJY29sbGVjdGlvbi5hZGQoImJhciIpOwotCQkJY29sbGVjdGlvbi5hZGQoImJheiIpOwotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRoaXMuc3luY2hyb25pemVDb2xsZWN0aW9uKG5ld0NvbGxlY3Rpb24sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbik7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFN5bmNocm9uaXplQ29sbGVjdGlvbjMoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJbmV3Q29sbGVjdGlvbi5hZGQoImpvbyIpOwotCQkJbmV3Q29sbGVjdGlvbi5hZGQoImphciIpOwotCQkJbmV3Q29sbGVjdGlvbi5hZGQoImJheiIpOwotCQkJYm9vbGVhbiByZXN1bHQgPSB0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbihuZXdDb2xsZWN0aW9uLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld0NvbGxlY3Rpb24sIGNvbGxlY3Rpb24pOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8vICoqKioqIGxpc3QKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50KCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChuZXcgTGlzdEFkZEV2ZW50KHRoaXMsIExJU1RfTkFNRSwgQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChuZXcgTGlzdEFkZEV2ZW50KHRoaXMsIExJU1RfTkFNRSwgQUREX0lOREVYLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkTGlzdCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoTElTVF9OQU1FLCBBRERfSU5ERVgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoQURERURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKExJU1RfTkFNRSwgQUREX0lOREVYLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1BZGRlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoTElTVF9OQU1FLCBBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChuZXcgTGlzdFJlbW92ZUV2ZW50KHRoaXMsIExJU1RfTkFNRSwgUkVNT1ZFX0lOREVYLCBSRU1PVkVEX09CSkVDVF9WQUxVRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChuZXcgTGlzdFJlbW92ZUV2ZW50KHRoaXMsIExJU1RfTkFNRSwgUkVNT1ZFX0lOREVYLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKExJU1RfTkFNRSwgUkVNT1ZFX0lOREVYLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFJFTU9WRURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3ROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChMSVNUX05BTUUsIFJFTU9WRV9JTkRFWCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtUmVtb3ZlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChMSVNUX05BTUUsIFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdEV2ZW50KCkgewotCQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChuZXcgTGlzdFJlcGxhY2VFdmVudCh0aGlzLCBMSVNUX05BTUUsIFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChuZXcgTGlzdFJlcGxhY2VFdmVudCh0aGlzLCBMSVNUX05BTUUsIFJFUExBQ0VfSU5ERVgsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoTElTVF9OQU1FLCBSRVBMQUNFX0lOREVYLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEFEREVEX09CSkVDVF9WQUxVRSksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3ROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoTElTVF9OQU1FLCBSRVBMQUNFX0lOREVYLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtUmVwbGFjZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkKExJU1RfTkFNRSwgUkVQTEFDRV9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc01vdmVkKG5ldyBMaXN0TW92ZUV2ZW50KHRoaXMsIExJU1RfTkFNRSwgVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgsIDEpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNNb3ZlZChuZXcgTGlzdE1vdmVFdmVudCh0aGlzLCBMSVNUX05BTUUsIFNPVVJDRV9JTkRFWCwgU09VUkNFX0lOREVYLCAxKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbXNNb3ZlZChMSVNUX05BTUUsIFRBUkdFVF9JTkRFWCwgU09VUkNFX0lOREVYLCAxKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNNb3ZlZExpc3ROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zTW92ZWQoTElTVF9OQU1FLCBTT1VSQ0VfSU5ERVgsIFNPVVJDRV9JTkRFWCwgMSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1Nb3ZlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtTW92ZWQoTElTVF9OQU1FLCBUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDbGVhcmVkRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChuZXcgTGlzdENsZWFyRXZlbnQodGhpcywgTElTVF9OQU1FKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDbGVhcmVkKCkgewotCQkJdGhpcy5maXJlTGlzdENsZWFyZWQoTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlTGlzdENoYW5nZWRFdmVudCgpIHsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcywgTElTVF9OQU1FLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2hhbmdlZCgpIHsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0xpc3RJbmRleCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoMiwgImpvbyIsIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbVRvTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoImpvbyIsIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNUb0xpc3RJbmRleCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KDIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImpvbyIpLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXhOb0NoYW5nZSgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KDIsIENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCksIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNUb0xpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5hZGRJdGVtc1RvTGlzdChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJqb28iKSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCkgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWxpc3QuYWRkKCJmb28iKTsKLQkJCWxpc3QuYWRkKCJiYXIiKTsKLQkJCWxpc3QuYWRkKCJiYXoiKTsKLQkJCXRoaXMuYWRkSXRlbXNUb0xpc3QoQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eUxpc3QoKSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtRnJvbUxpc3RJbmRleCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdCgxLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdCgiYmFyIiwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXgoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KDEsIDEsIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4Tm9DaGFuZ2UoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KDIsIDAsIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiYmFyIiksIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdE5vQ2hhbmdlKCkgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWxpc3QuYWRkKCJmb28iKTsKLQkJCWxpc3QuYWRkKCJiYXIiKTsKLQkJCWxpc3QuYWRkKCJiYXoiKTsKLQkJCXRoaXMuYWRkSXRlbXNUb0xpc3QoQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eUxpc3QoKSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5JdGVtc0luTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLnJldGFpbkl0ZW1zSW5MaXN0KG5ldyBTdHJpbmdbXSB7ImJhciIsICJiYXoifSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbUluTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLnJlcGxhY2VJdGVtSW5MaXN0KCJiYXIiLCAieHh4IiwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVtc0luTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLnNldEl0ZW1zSW5MaXN0KDEsIG5ldyBTdHJpbmdbXSB7Inh4eCJ9LCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtc0luTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQlsaXN0LmFkZCgieHh4Iik7Ci0JCQlsaXN0LmFkZCgieXl5Iik7Ci0JCQlsaXN0LmFkZCgienp6Iik7Ci0JCQl0aGlzLm1vdmVJdGVtc0luTGlzdCgyLCA0LCAyLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdENsZWFyTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmNsZWFyTGlzdChsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBvbGRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlvbGRMaXN0LmFkZCgiZm9vIik7Ci0JCQlvbGRMaXN0LmFkZCgiYmFyIik7Ci0JCQlvbGRMaXN0LmFkZCgiYmF6Iik7Ci0JCQlvbGRMaXN0LmFkZCgieHh4Iik7Ci0JCQlvbGRMaXN0LmFkZCgieXl5Iik7Ci0JCQlvbGRMaXN0LmFkZCgienp6Iik7Ci0JCQlMaXN0PFN0cmluZz4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbmV3TGlzdC5hZGQoImZvbyIpOwotCQkJbmV3TGlzdC5hZGQoInBwcCIpOwotCQkJbmV3TGlzdC5hZGQoImJheiIpOwotCQkJbmV3TGlzdC5hZGQoInh4eCIpOwotCQkJbmV3TGlzdC5hZGQoInFxcSIpOwotCQkJdGhpcy5zeW5jaHJvbml6ZUxpc3QobmV3TGlzdCwgb2xkTGlzdCwgTElTVF9OQU1FKTsKLQkJCWFzc2VydEVxdWFscyhuZXdMaXN0LCBvbGRMaXN0KTsKLQkJfQotCi0JCS8vICoqKioqIHRyZWUKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlQWRkZWRUcmVlRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVOb2RlQWRkZWQobmV3IFRyZWVBZGRFdmVudCh0aGlzLCBUUkVFX05BTUUsIE9CSkVDVF9QQVRIKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVBZGRlZFRyZWUoKSB7Ci0JCQl0aGlzLmZpcmVOb2RlQWRkZWQoVFJFRV9OQU1FLCBPQkpFQ1RfUEFUSCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZUV2ZW50KCkgewotCQkJdGhpcy5maXJlTm9kZVJlbW92ZWQobmV3IFRyZWVSZW1vdmVFdmVudCh0aGlzLCBUUkVFX05BTUUsIE9CSkVDVF9QQVRIKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpIHsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKFRSRUVfTkFNRSwgT0JKRUNUX1BBVEgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2xlYXJlZEV2ZW50KCkgewotCQkJdGhpcy5maXJlVHJlZUNsZWFyZWQobmV3IFRyZWVDbGVhckV2ZW50KHRoaXMsIFRSRUVfTkFNRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2xlYXJlZCgpIHsKLQkJCXRoaXMuZmlyZVRyZWVDbGVhcmVkKFRSRUVfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVRyZWVDaGFuZ2VkRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZChuZXcgVHJlZUNoYW5nZUV2ZW50KHRoaXMsIFRSRUVfTkFNRSwgT0JKRUNUX1BBVEgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNoYW5nZWQoKSB7Ci0JCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZChUUkVFX05BTUUsIE9CSkVDVF9QQVRIKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHZhbHVlMSwgdmFsdWUyKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHZhbHVlMSwgdmFsdWUyKTsKLQkJfQotCi0JCS8vICoqKioqIG1pc2MKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBUZXN0TW9kZWwgY2xvbmUoKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoVGVzdE1vZGVsKSBzdXBlci5jbG9uZSgpOwotCQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFZhbHVlc0FyZURpZmZlcmVudChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodmFsdWUxLCB2YWx1ZTIpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFZhbHVlc0FyZUVxdWFsKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlc0FyZUVxdWFsKHZhbHVlMSwgdmFsdWUyKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RFbGVtZW50c0FyZURpZmZlcmVudChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmVsZW1lbnRzQXJlRGlmZmVyZW50KGl0ZXJhYmxlMSwgaXRlcmFibGUyKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RFbGVtZW50c0FyZUVxdWFsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgSXRlcmFibGU8Pz4gaXRlcmFibGUyKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZWxlbWVudHNBcmVFcXVhbChpdGVyYWJsZTEsIGl0ZXJhYmxlMik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKFRFU1RfVE9fU1RSSU5HKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlcmlhbGl6YXRpb24gdGVzdCAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmIChUb29scy5qdm1Jc1N1bigpKSB7Ci0JCQkvLyBUaGlzIHRlc3QgZG9lc24ndCBwYXNzIGluIHRoZSBFY2xpcHNlIGJ1aWxkIGVudmlyb25tZW50IChMaW51eC9JQk0gSlZNKSBmb3Igc29tZSByZWFzb24KLQkJCXRoaXMudmVyaWZ5U2VyaWFsaXphdGlvbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNlcmlhbGl6YXRpb24oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCUxvY2FsTW9kZWwgbW9kZWwxID0gbmV3IExvY2FsTW9kZWwoKTsKLQkJRm9vIGZvbzEgPSBuZXcgRm9vKCk7Ci0JCUJhciBiYXIxID0gbmV3IEJhcigpOwotCQlKb28gam9vMSA9IG5ldyBKb28oKTsKLQkJSmFyIGphcjEgPSBuZXcgSmFyKCk7Ci0JCW1vZGVsMS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGZvbzEpOwotCQltb2RlbDEuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihiYXIxKTsKLQkJbW9kZWwxLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgam9vMSk7Ci0JCW1vZGVsMS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIGphcjEpOwotCi0JCUl0ZXJhYmxlPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyczEgPSB0aGlzLmdldExpc3RlbmVycyhtb2RlbDEsIFN0YXRlQ2hhbmdlTGlzdGVuZXIuY2xhc3MsIG51bGwpOwotCQlPYmplY3RbXSBsaXN0ZW5lcnNBcnJheTEgPSBBcnJheVRvb2xzLmFycmF5KGxpc3RlbmVyczEpOwotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdGVuZXJzQXJyYXkxLmxlbmd0aCk7Ci0JCS8vIHRoZSBvcmRlciBvZiB0aGVzZSBjb3VsZCBjaGFuZ2UuLi4KLQkJYXNzZXJ0RXF1YWxzKEZvby5jbGFzcywgbGlzdGVuZXJzQXJyYXkxWzBdLmdldENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQmFyLmNsYXNzLCBsaXN0ZW5lcnNBcnJheTFbMV0uZ2V0Q2xhc3MoKSk7Ci0KLQkJbGlzdGVuZXJzMSA9IHRoaXMuZ2V0TGlzdGVuZXJzKG1vZGVsMSwgTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzLCAiZm9vIik7Ci0JCWxpc3RlbmVyc0FycmF5MSA9IEFycmF5VG9vbHMuYXJyYXkobGlzdGVuZXJzMSk7Ci0JCWFzc2VydEVxdWFscygyLCBsaXN0ZW5lcnNBcnJheTEubGVuZ3RoKTsKLQkJLy8gdGhlIG9yZGVyIG9mIHRoZXNlIGNvdWxkIGNoYW5nZS4uLgotCQlhc3NlcnRFcXVhbHMoSm9vLmNsYXNzLCBsaXN0ZW5lcnNBcnJheTFbMF0uZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhKYXIuY2xhc3MsIGxpc3RlbmVyc0FycmF5MVsxXS5nZXRDbGFzcygpKTsKLQotCQlMb2NhbE1vZGVsIG1vZGVsMiA9IFRlc3RUb29scy5zZXJpYWxpemUobW9kZWwxKTsKLQotCQlJdGVyYWJsZTxFdmVudExpc3RlbmVyPiBsaXN0ZW5lcnMyID0gdGhpcy5nZXRMaXN0ZW5lcnMobW9kZWwyLCBTdGF0ZUNoYW5nZUxpc3RlbmVyLmNsYXNzLCBudWxsKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzQXJyYXkyID0gQXJyYXlUb29scy5hcnJheShsaXN0ZW5lcnMyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGxpc3RlbmVyc0FycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoRm9vLmNsYXNzLCBsaXN0ZW5lcnNBcnJheTJbMF0uZ2V0Q2xhc3MoKSk7Ci0KLQkJbGlzdGVuZXJzMiA9IHRoaXMuZ2V0TGlzdGVuZXJzKG1vZGVsMiwgTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzLCAiZm9vIik7Ci0JCWxpc3RlbmVyc0FycmF5MiA9IEFycmF5VG9vbHMuYXJyYXkobGlzdGVuZXJzMik7Ci0JCWFzc2VydEVxdWFscygxLCBsaXN0ZW5lcnNBcnJheTIubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKEpvby5jbGFzcywgbGlzdGVuZXJzQXJyYXkyWzBdLmdldENsYXNzKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8RXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKExvY2FsTW9kZWwgbW9kZWwsIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3QobW9kZWwsIGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpLmdldExpc3RlbmVycygpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdGVuZXJMaXN0PEV2ZW50TGlzdGVuZXI+IGdldExpc3RlbmVyTGlzdChMb2NhbE1vZGVsIG1vZGVsLCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJQ2hhbmdlU3VwcG9ydCBjaGFuZ2VTdXBwb3J0ID0gKENoYW5nZVN1cHBvcnQpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKG1vZGVsLCAiY2hhbmdlU3VwcG9ydCIpOwotCQlyZXR1cm4gKExpc3RlbmVyTGlzdDxFdmVudExpc3RlbmVyPikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoY2hhbmdlU3VwcG9ydCwgImdldExpc3RlbmVyTGlzdF8iLCBuZXcgQ2xhc3M8Pz5bXSB7Q2xhc3MuY2xhc3MsIFN0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXSB7bGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZX0pOwotCX0KLQotCS8vIHdlIGhhdmUgdG8gbWFudWFsbHkgaGFuZGxlICdjaGFuZ2VTdXBwb3J0JyBzaW5jZSBBYnN0cmFjdE1vZGVsIGlzIG5vdCBTZXJpYWxpemFibGUKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0JCUxvY2FsTW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCQkJcy53cml0ZU9iamVjdCh0aGlzLmNoYW5nZVN1cHBvcnQpOwotCSAgICB9Ci0JCXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIHMpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCQlzLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0JCQl0aGlzLmNoYW5nZVN1cHBvcnQgPSAoQ2hhbmdlU3VwcG9ydCkgcy5yZWFkT2JqZWN0KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGb28gaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgewotCQlGb28oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBCYXIgaW1wbGVtZW50cyBTdGF0ZUNoYW5nZUxpc3RlbmVyIHsKLQkJQmFyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSm9vIGV4dGVuZHMgTGlzdENoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQlKb28oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmFyIGV4dGVuZHMgTGlzdENoYW5nZUFkYXB0ZXIgewotCQlKYXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJ1Zyg/KSB0ZXN0ICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJU0VfTUVTU0FHRSA9ICJ0aGlzIG9iamVjdCBpcyBubyBsb25nZXIgbGlzdGVuaW5nIHRvIGxvY2FsQSI7Ci0KLQkvKioKLQkgKiBUZXN0IHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uOgotCSAqIAktIGJvdGggQiBhbmQgQyBhcmUgbGlzdGVuaW5nIHRvIEEKLQkgKiAJLSBDIGlzIGFsc28gbGlzdGVuaW5nIHRvIEIKLQkgKiAJLSB3aGVuIEIgcmVjZWl2ZXMgYW4gZXZlbnQgZnJvbSBBLCBpdCB3aWxsIGZpcmUgYW4gZXZlbnQgdG8gQwotCSAqIAktIHdoZW4gQyByZWNlaXZlcyBhbiBldmVudCBmcm9tIEIsIGl0IHdpbGwgU1RPUCBsaXN0ZW5pbmcgdG8gQQotCSAqIAktIHRoZSBldmVudCBmcm9tIEIgdG8gQyBtYXkgYmUgcHJlY2VkZWQgb3IgZm9sbG93ZWQgKGRlcGVuZGluZyBvbgotCSAqIAkJdGhlIGhhc2ggcG9zaXRpb25zIG9mIGxpc3RlbmVycykgYnkgYW4gZXZlbnQgZnJvbSBBIHRvIEM6Ci0JICogCQktIGlmIHRoZSBBIHRvIEMgZXZlbnQgY29tZXMgZmlyc3QsIG5vIHByb2JsZW0KLQkgKiAJCS0gYnV0IGlmIHRoZSBBIHRvIEIgZXZlbnQgY29tZXMgZmlyc3QsIHRoZSBBIHRvIEMgZXZlbnQgc2hvdWxkIE5PVCBoYXBwZW4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RSZW1vdmVTdGF0ZUxpc3RlbmVyKCkgewotCQl0aGlzLnZlcmlmeUluZGlyZWN0UmVtb3ZlTGlzdGVuZXIoCi0JCQluZXcgTm90aWZ5Q29tbWFuZCgpIHsKLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoTG9jYWxBIGxvY2FsQSkgewotCQkJCQlsb2NhbEEubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGlyZWN0UmVtb3ZlUHJvcGVydHlMaXN0ZW5lcigpIHsKLQkJdGhpcy52ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKAotCQkJbmV3IE5vdGlmeUNvbW1hbmQoKSB7Ci0JCQkJcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKExvY2FsQSBsb2NhbEEpIHsKLQkJCQkJbG9jYWxBLm5vdGlmeVByb3BlcnR5TGlzdGVuZXJzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFJlbW92ZUNvbGxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy52ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKAotCQkJbmV3IE5vdGlmeUNvbW1hbmQoKSB7Ci0JCQkJcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKExvY2FsQSBsb2NhbEEpIHsKLQkJCQkJbG9jYWxBLm5vdGlmeUNvbGxlY3Rpb25MaXN0ZW5lcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGlyZWN0UmVtb3ZlTGlzdExpc3RlbmVyKCkgewotCQl0aGlzLnZlcmlmeUluZGlyZWN0UmVtb3ZlTGlzdGVuZXIoCi0JCQluZXcgTm90aWZ5Q29tbWFuZCgpIHsKLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoTG9jYWxBIGxvY2FsQSkgewotCQkJCQlsb2NhbEEubm90aWZ5TGlzdExpc3RlbmVycygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RSZW1vdmVUcmVlTGlzdGVuZXIoKSB7Ci0JCXRoaXMudmVyaWZ5SW5kaXJlY3RSZW1vdmVMaXN0ZW5lcigKLQkJCW5ldyBOb3RpZnlDb21tYW5kKCkgewotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhMb2NhbEEgbG9jYWxBKSB7Ci0JCQkJCWxvY2FsQS5ub3RpZnlUcmVlTGlzdGVuZXJzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZlcmlmeUluZGlyZWN0UmVtb3ZlTGlzdGVuZXIoTm90aWZ5Q29tbWFuZCBjb21tYW5kKSB7Ci0JCUxvY2FsQSBsb2NhbEEgPSBuZXcgTG9jYWxBKCk7Ci0JCUxvY2FsQiBsb2NhbEIgPSBuZXcgTG9jYWxCKGxvY2FsQSk7Ci0KLQkJLy8gYnVpbGQgYSBidW5jaCBvZiBMb2NhbENzIHNvIGF0IGxlYXN0IG9uZSBvZiB0aGVtIGlzIG5vdGlmaWVkIEFGVEVSIHRoZSBMb2NhbEI7Ci0JCS8vIHVzaW5nIDEwMDAgc2VlbWVkIHRvIGZhaWwgdmVyeSBjb25zaXN0ZW50bHkgYmVmb3JlIENoYW5nZVN1cHBvcnQgd2FzIGZpeGVkCi0JCUxvY2FsQ1tdIGxvY2FsQ3MgPSBuZXcgTG9jYWxDWzEwMDBdOwotCQlmb3IgKGludCBpID0gbG9jYWxDcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJbG9jYWxDc1tpXSA9IG5ldyBMb2NhbEMobG9jYWxBLCBsb2NhbEIpOwotCQl9Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJY29tbWFuZC5ub3RpZnlMaXN0ZW5lcnMobG9jYWxBKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpID09IElTRV9NRVNTQUdFKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJfQotCQlhc3NlcnRGYWxzZShleENhdWdodCk7Ci0KLQkJZm9yIChpbnQgaSA9IGxvY2FsQ3MubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWFzc2VydEZhbHNlKGxvY2FsQ3NbaV0uaXNMaXN0ZW5pbmdUb0xvY2FsQSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50ZXJmYWNlIE5vdGlmeUNvbW1hbmQgewotCQl2b2lkIG5vdGlmeUxpc3RlbmVycyhMb2NhbEEgbG9jYWxBKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG9iamVjdCBzaW1wbHkgZmlyZXMgYSBzdGF0ZSBjaGFuZ2UgZXZlbnQuIEJvdGggTG9jYWxCIGFuZCBMb2NhbEMKLQkgKiB3aWxsIGJlIGxpc3RlbmVycy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbEEgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJTG9jYWxBKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQl2b2lkIG5vdGlmeVN0YXRlTGlzdGVuZXJzKCkgewotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJdm9pZCBub3RpZnlQcm9wZXJ0eUxpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZCgiZm9vIiwgMSwgMik7Ci0JCX0KLQkJdm9pZCBub3RpZnlDb2xsZWN0aW9uTGlzdGVuZXJzKCkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoImZvbyIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwotCQl9Ci0JCXZvaWQgbm90aWZ5TGlzdExpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKCJmb28iLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7Ci0JCX0KLQkJdm9pZCBub3RpZnlUcmVlTGlzdGVuZXJzKCkgewotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoImZvbyIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBvYmplY3Qgd2lsbCBmaXJlIHN0YXRlIGNoYW5nZSBldmVudHMgd2hlbmV2ZXIgaXQgcmVjZWl2ZXMKLQkgKiBhIHN0YXRlIGNoYW5nZSBldmVudCBmcm9tIGxvY2FsQS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbEIKLQkJZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JCWltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIKLQl7Ci0JCUxvY2FsQihMb2NhbEEgbG9jYWxBKSB7Ci0JCQlzdXBlcigpOwotCQkJbG9jYWxBLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZCgiYmFyIiwgMSwgMik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoImJhciIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoImJhciIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCi0JCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZCgiYmFyIiwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgb2JqZWN0IHdpbGwgbGlzdGVuIHRvIHR3byBvdGhlciBvYmplY3RzLCBsb2NhbEEgYW5kIGxvY2FsQi4KLQkgKiBJZiB0aGlzIG9iamVjdCByZWNlaXZlcyBub3RpZmljYXRpb24gZnJvbSBsb2NhbEIsIGl0IHdpbGwgc3RvcCBsaXN0ZW5pbmcgdG8KLQkgKiBsb2NhbEEuIElmIHRoaXMgb2JqZWN0IHJlY2VpdmVzIG5vdGlmaWNhdGlvbiBmcm9tIGxvY2FsQSwgaXQgd2lsbCBjaGVjayB0bwotCSAqIHNlZSB3aGV0aGVyIGl0IHN0aWxsIGxpc3RlbmluZyB0byBsb2NhbEEuIElmIHRoaXMgb2JqZWN0IGlzIG5vIGxvbmdlcgotCSAqIGxpc3RlbmluZyB0byBsb2NhbEEsIGl0IHdpbGwgY29tcGxhaW4gYWJvdXQgcmVjZWl2aW5nIHRoZSBldmVudCBhbmQKLQkgKiB0aHJvdyBhbiBleGNlcHRpb24uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxDCi0JCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCQlpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyCi0JewotCQlwcml2YXRlIExvY2FsQSBsb2NhbEE7Ci0JCXByaXZhdGUgTG9jYWxCIGxvY2FsQjsKLQkJcHJpdmF0ZSBib29sZWFuIGxpc3RlbmluZ1RvTG9jYWxBOwotCi0JCUxvY2FsQyhMb2NhbEEgbG9jYWxBLCBMb2NhbEIgbG9jYWxCKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5sb2NhbEEgPSBsb2NhbEE7Ci0JCQl0aGlzLmxvY2FsQiA9IGxvY2FsQjsKLQotCQkJbG9jYWxBLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSA9IHRydWU7Ci0KLQkJCWxvY2FsQi5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlib29sZWFuIGlzTGlzdGVuaW5nVG9Mb2NhbEEoKSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0ZW5pbmdUb0xvY2FsQTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQSkgewotCQkJCWlmICggISB0aGlzLmxpc3RlbmluZ1RvTG9jYWxBKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSVNFX01FU1NBR0UpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc291cmNlID09IHRoaXMubG9jYWxCKSB7Ci0JCQkJdGhpcy5sb2NhbEEucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJib2d1cyBldmVudCBzb3VyY2U6ICIgKyBzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHRoaXMubG9jYWxBKSB7Ci0JCQkJaWYgKCAhIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJU0VfTUVTU0FHRSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEIpIHsKLQkJCQl0aGlzLmxvY2FsQS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQl0aGlzLmxpc3RlbmluZ1RvTG9jYWxBID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJvZ3VzIGV2ZW50IHNvdXJjZTogIiArIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHRoaXMubG9jYWxBKSB7Ci0JCQkJaWYgKCAhIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJU0VfTUVTU0FHRSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEIpIHsKLQkJCQl0aGlzLmxvY2FsQS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQl0aGlzLmxpc3RlbmluZ1RvTG9jYWxBID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJvZ3VzIGV2ZW50IHNvdXJjZTogIiArIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCi0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEEpIHsKLQkJCQlpZiAoICEgdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKElTRV9NRVNTQUdFKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQikgewotCQkJCXRoaXMubG9jYWxBLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJCXRoaXMubGlzdGVuaW5nVG9Mb2NhbEEgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYm9ndXMgZXZlbnQgc291cmNlOiAiICsgc291cmNlKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCi0JCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBlKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEEpIHsKLQkJCQlpZiAoICEgdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKElTRV9NRVNTQUdFKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQikgewotCQkJCXRoaXMubG9jYWxBLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJCXRoaXMubGlzdGVuaW5nVG9Mb2NhbEEgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYm9ndXMgZXZlbnQgc291cmNlOiAiICsgc291cmNlKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL0pwdFV0aWxpdHlNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL0pwdFV0aWxpdHlNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZDYzMzAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcHRVdGlsaXR5TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5KcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzOwotCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eU1vZGVsVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlNb2RlbFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzLnN1aXRlKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDaGFuZ2VTdXBwb3J0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTmV3RXZlbnRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0VGVzdHMuY2xhc3MpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFV0aWxpdHlNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvTmV3RXZlbnRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9OZXdFdmVudFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMjc2NTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9OZXdFdmVudFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi0vKioKLSAqIHRlc3Qgd2hhdCBpdCB0YWtlcyB0byBhZGQgYSBuZXcgdHlwZSBvZiBldmVudCB0bwotICogbW9kZWwgYW5kIGNoYW5nZSBzdXBwb3J0Ci0gKi8KLXB1YmxpYyBjbGFzcyBOZXdFdmVudFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgRm9vIGZvbzsKLQotCXB1YmxpYyBOZXdFdmVudFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmZvbyA9IG5ldyBGb28oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05vRm9vQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc05vRm9vQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlMb2NhbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJdGhpcy5mb28uYWRkRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNOb0Zvb0NoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy5mb28ucmVtb3ZlRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc05vRm9vQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpKTsKLQkJTG9jYWxMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCXRoaXMuZm9vLmFkZEZvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMuZm9vLnJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlRm9vQ2hhbmdlRXZlbnQoKSB7Ci0JCUxvY2FsTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlhc3NlcnRGYWxzZShsaXN0ZW5lci5yZWNlaXZlZEZvb0V2ZW50KTsKLQkJdGhpcy5mb28uYWRkRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmZvby5mb28oKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0ZW5lci5yZWNlaXZlZEZvb0V2ZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaGFybmVzcyBjbGFzc2VzICoqKioqKioqKioKLQotCWNsYXNzIEZvbyBleHRlbmRzIEFic3RyYWN0Rm9vTW9kZWwgewotCQlGb28oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXZvaWQgZm9vKCkgewotCQkJdGhpcy5maXJlRm9vQ2hhbmdlRXZlbnQoKTsKLQkJfQotCX0KLQotCWNsYXNzIExvY2FsTGlzdGVuZXIgaW1wbGVtZW50cyBGb29DaGFuZ2VMaXN0ZW5lciB7Ci0JCWJvb2xlYW4gcmVjZWl2ZWRGb29FdmVudCA9IGZhbHNlOwotCQlMb2NhbExpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBmb29DaGFuZ2VkKEZvb0NoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQl0aGlzLnJlY2VpdmVkRm9vRXZlbnQgPSB0cnVlOwotCQl9Ci0JfQotCi0JaW50ZXJmYWNlIEZvb01vZGVsIGV4dGVuZHMgTW9kZWwgewotCQl2b2lkIGFkZEZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQkJdm9pZCByZW1vdmVGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JfQotCi0JaW50ZXJmYWNlIEZvb0NoYW5nZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0JCXZvaWQgZm9vQ2hhbmdlZChGb29DaGFuZ2VFdmVudCBldmVudCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEZvb0NoYW5nZUV2ZW50IGV4dGVuZHMgQ2hhbmdlRXZlbnQgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHVibGljIEZvb0NoYW5nZUV2ZW50KEZvb01vZGVsIHNvdXJjZSkgewotCQkJc3VwZXIoc291cmNlKTsKLQkJfQotCQlwdWJsaWMgRm9vQ2hhbmdlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCQlyZXR1cm4gbmV3IEZvb0NoYW5nZUV2ZW50KChGb29Nb2RlbCkgbmV3U291cmNlKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBBYnN0cmFjdEZvb01vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIEZvb01vZGVsIHsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgRm9vQ2hhbmdlU3VwcG9ydCBnZXRDaGFuZ2VTdXBwb3J0KCkgewotCQkJcmV0dXJuIChGb29DaGFuZ2VTdXBwb3J0KSBzdXBlci5nZXRDaGFuZ2VTdXBwb3J0KCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJCXJldHVybiBuZXcgRm9vQ2hhbmdlU3VwcG9ydCh0aGlzKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQkJcHJvdGVjdGVkIHZvaWQgZmlyZUZvb0NoYW5nZUV2ZW50KCkgewotCQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUZvb0NoYW5nZWQoKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaGFzTm9Gb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gISB0aGlzLmhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEZvb0NoYW5nZVN1cHBvcnQgZXh0ZW5kcyBDaGFuZ2VTdXBwb3J0IHsKLQkJRm9vQ2hhbmdlU3VwcG9ydChGb29Nb2RlbCBzb3VyY2UpIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCX0KLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxGb29DaGFuZ2VMaXN0ZW5lcj4gRk9PX0NIQU5HRV9MSVNURU5FUl9DTEFTUyA9IEZvb0NoYW5nZUxpc3RlbmVyLmNsYXNzOwotCQl2b2lkIGFkZEZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmFkZExpc3RlbmVyKEZPT19DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQkJfQotCQl2b2lkIHJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLnJlbW92ZUxpc3RlbmVyKEZPT19DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoRk9PX0NIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JCX0KLQkJcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8Rm9vQ2hhbmdlTGlzdGVuZXI+IGdldEZvb0NoYW5nZUxpc3RlbmVyTGlzdCgpIHsKLQkJCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdChGT09fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQkJfQotCQlwcml2YXRlIEl0ZXJhYmxlPEZvb0NoYW5nZUxpc3RlbmVyPiBnZXRGb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlMaXN0ZW5lckxpc3Q8Rm9vQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0Rm9vQ2hhbmdlTGlzdGVuZXJMaXN0KCk7Ci0JCQlyZXR1cm4gKGxpc3RlbmVyTGlzdCA9PSBudWxsKSA/IG51bGwgOiBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JCX0KLQkJcHJpdmF0ZSBib29sZWFuIGhhc0Zvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0Rm9vQ2hhbmdlTGlzdGVuZXJzKCksIGxpc3RlbmVyKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBmaXJlRm9vQ2hhbmdlZCgpIHsKLQkJCUl0ZXJhYmxlPEZvb0NoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldEZvb0NoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJRm9vQ2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCQkJCWZvciAoRm9vQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQkJaWYgKHRoaXMuaGFzRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpKSB7Ci0JCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCQlldmVudCA9IG5ldyBGb29DaGFuZ2VFdmVudCgoRm9vTW9kZWwpIHRoaXMuc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJCWxpc3RlbmVyLmZvb0NoYW5nZWQoZXZlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL1NpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzNGVjMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL1NpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVySW52YWxpZENsYXNzKCkgewotCQlNb2RlbCBtb2RlbCA9IG5ldyBTdGF0ZVRlc3RNb2RlbCgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRyeSB7Ci0JCQltb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCBsaXN0ZW5lcik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJJbnZhbGlkQXNwZWN0KCkgewotCQlNb2RlbCBtb2RlbCA9IG5ldyBQcm9wZXJ0eVRlc3RNb2RlbCgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRyeSB7Ci0JCQltb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJiYXIiLCBsaXN0ZW5lcik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lckludmFsaWRDbGFzcygpIHsKLQkJTW9kZWwgbW9kZWwgPSBuZXcgU3RhdGVUZXN0TW9kZWwoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIoKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbGlzdGVuZXIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJJbnZhbGlkQXNwZWN0KCkgewotCQlNb2RlbCBtb2RlbCA9IG5ldyBDb2xsZWN0aW9uVGVzdE1vZGVsKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyKCk7Ci0JCXRyeSB7Ci0JCQltb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImJhciIsIGxpc3RlbmVyKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTGlzdENoYW5nZUxpc3RlbmVySW52YWxpZENsYXNzKCkgewotCQlNb2RlbCBtb2RlbCA9IG5ldyBTdGF0ZVRlc3RNb2RlbCgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0Q2hhbmdlQWRhcHRlcigpOwotCQl0cnkgewotCQkJbW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCBsaXN0ZW5lcik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZExpc3RDaGFuZ2VMaXN0ZW5lckludmFsaWRBc3BlY3QoKSB7Ci0JCU1vZGVsIG1vZGVsID0gbmV3IExpc3RUZXN0TW9kZWwoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdENoYW5nZUFkYXB0ZXIoKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcigiYmFyIiwgbGlzdGVuZXIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRUcmVlQ2hhbmdlTGlzdGVuZXJJbnZhbGlkQ2xhc3MoKSB7Ci0JCU1vZGVsIG1vZGVsID0gbmV3IFN0YXRlVGVzdE1vZGVsKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRyZWVDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRyeSB7Ci0JCQltb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIGxpc3RlbmVyKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVHJlZUNoYW5nZUxpc3RlbmVySW52YWxpZEFzcGVjdCgpIHsKLQkJTW9kZWwgbW9kZWwgPSBuZXcgVHJlZVRlc3RNb2RlbCgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCVRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUcmVlQ2hhbmdlQWRhcHRlcigpOwotCQl0cnkgewotCQkJbW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKCJiYXIiLCBsaXN0ZW5lcik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlc3QgbW9kZWxzICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBTdGF0ZVRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlTdGF0ZVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBTdGF0ZUNoYW5nZUxpc3RlbmVyLmNsYXNzLCBudWxsKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBQcm9wZXJ0eVRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlQcm9wZXJ0eVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzLCAiZm9vIik7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgQ29sbGVjdGlvblRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlDb2xsZWN0aW9uVGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzcywgImZvbyIpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIExpc3RUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJTGlzdFRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3MsICJmb28iKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBUcmVlVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCVRyZWVUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgVHJlZUNoYW5nZUxpc3RlbmVyLmNsYXNzLCAiZm9vIik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9KcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NGE5YjguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9KcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMgewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWZsZWN0aXZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlZmxlY3RpdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdGl2ZVN0YXRlQ2hhbmdlTGlzdGVuZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMuY2xhc3MpOwotCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXByaXZhdGUgSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYWRjZDAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlZmxlY3RpdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgUmVmbGVjdGl2ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgIml0ZW1BZGRlZFplcm9Bcmd1bWVudCIsICJpdGVtUmVtb3ZlZFplcm9Bcmd1bWVudCIsICJjb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudCIsICJjb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudCIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcihPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAiaXRlbUFkZGVkU2luZ2xlQXJndW1lbnQiLCAiaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudCIsICJjb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50IiwgImNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbUFkZGVkWmVyb0FyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtQWRkZWRTaW5nbGVBcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVtb3ZlZFplcm9Bcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJTdHJpbmdzKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyU3RyaW5ncygpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VTdHJpbmdzKG5ldyBTdHJpbmdbXSB7ImJhciIsICJiYXoifSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VTdHJpbmdzKG5ldyBTdHJpbmdbXSB7ImJhciIsICJiYXoifSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDEoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAiY29sbGVjdGlvbkNoYW5nZWREb3VibGVBcmd1bWVudCIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpLmdldENsYXNzKCkgPT0gTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJTWV0aG9kIG1ldGhvZCA9IFJlZmxlY3Rpb25Ub29scy5nZXRNZXRob2QodGFyZ2V0LCAiY29sbGVjdGlvbkNoYW5nZWREb3VibGVBcmd1bWVudCIsIG5ldyBDbGFzc1tdIHtDb2xsZWN0aW9uQ2hhbmdlRXZlbnQuY2xhc3MsIE9iamVjdC5jbGFzc30pOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuZXF1YWxzKG1ldGhvZC50b1N0cmluZygpKSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNaXNtYXRjaCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCS8vIGJ1aWxkIGEgQ09MTEVDVElPTiBjaGFuZ2UgbGlzdGVuZXIgYW5kIGhhY2sgaXQgc28gd2UKLQkJLy8gY2FuIGFkZCBpdCBhcyBhIExJU1QgY2hhbmdlIGxpc3RlbmVyCi0JCU9iamVjdCBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJjb2xsZWN0aW9uRXZlbnRTaW5nbGVBcmd1bWVudCIpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJib2d1cyBsaXN0IiwgKExpc3RDaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXIpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRlc3RNb2RlbC5jaGFuZ2VMaXN0KCk7Ci0JCQlmYWlsKCJsaXN0ZW5lciBtaXNtYXRjaDogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQljbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HU19DT0xMRUNUSU9OID0gInN0cmluZ3MiOwotCQlUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc3RyaW5ncykgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShTdHJpbmcgcykgewotCQkJCQlUZXN0TW9kZWwudGhpcy5yZW1vdmVTdHJpbmcocyk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQl2b2lkIGFkZFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oc3RyaW5nLCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJdm9pZCByZW1vdmVTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oc3RyaW5nLCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJdm9pZCBjbGVhclN0cmluZ3MoKSB7Ci0JCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLnN0cmluZ3MsIFNUUklOR1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJdm9pZCByZXBsYWNlU3RyaW5ncyhTdHJpbmdbXSBuZXdTdHJpbmdzKSB7Ci0JCQl0aGlzLnN0cmluZ3MuY2xlYXIoKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5zdHJpbmdzLCBuZXdTdHJpbmdzKTsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5zdHJpbmdzKTsKLQkJfQotCQl2b2lkIGNoYW5nZUxpc3QoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZCgiYm9ndXMgbGlzdCIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQkJfQotCX0KLQotCWNsYXNzIFRhcmdldCB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JCVN0cmluZyBjb2xsZWN0aW9uTmFtZTsKLQkJU3RyaW5nIHN0cmluZzsKLQkJYm9vbGVhbiBpdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkV2ZW50U2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIFN0cmluZyBzdHJpbmcpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMuY29sbGVjdGlvbk5hbWUgPSBjb2xsZWN0aW9uTmFtZTsKLQkJCXRoaXMuc3RyaW5nID0gc3RyaW5nOwotCQl9Ci0JCXZvaWQgaXRlbUFkZGVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGl0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50KENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmNvbGxlY3Rpb25OYW1lLCBlLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3RyaW5nLCBlLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JCXZvaWQgaXRlbVJlbW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBpdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50KENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuY29sbGVjdGlvbk5hbWUsIGUuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zdHJpbmcsIGUuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmNvbGxlY3Rpb25OYW1lLCBlLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQl9Ci0JCXZvaWQgY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50KENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuY29sbGVjdGlvbk5hbWUsIGUuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uRXZlbnRTaW5nbGVBcmd1bWVudChDb2xsZWN0aW9uRXZlbnQgZSkgewotCQkJdGhpcy5jb2xsZWN0aW9uRXZlbnRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5jb2xsZWN0aW9uTmFtZSwgZS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkRG91YmxlQXJndW1lbnQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUgKyAiIG9iamVjdDogIiArIG8pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlTGlzdENoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzOTY1ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlTGlzdENoYW5nZUxpc3RlbmVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcihPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAiaXRlbUFkZGVkWmVyb0FyZ3VtZW50IiwgIml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50IiwgIml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudCIsICJpdGVtTW92ZWRaZXJvQXJndW1lbnQiLCAibGlzdENsZWFyZWRaZXJvQXJndW1lbnQiLCAibGlzdENoYW5nZWRaZXJvQXJndW1lbnQiKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKHRhcmdldCwgIml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50IiwgIml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnQiLCAiaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnQiLCAiaXRlbU1vdmVkU2luZ2xlQXJndW1lbnQiLCAibGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudCIsICJsaXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZFplcm9Bcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbUFkZGVkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRaZXJvQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZVN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIG9sZFN0cmluZyA9ICJmb28iOwotCQlTdHJpbmcgbmV3U3RyaW5nID0gImJhciI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcob2xkU3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBuZXdTdHJpbmcsIDAsIG9sZFN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZVN0cmluZyhvbGRTdHJpbmcsIG5ld1N0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBvbGRTdHJpbmcgPSAiZm9vIjsKLQkJU3RyaW5nIG5ld1N0cmluZyA9ICJiYXIiOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKG9sZFN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbmV3U3RyaW5nLCAwLCBvbGRTdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZVN0cmluZyhvbGRTdHJpbmcsIG5ld1N0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbU1vdmVkWmVyb0FyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ6ZXJvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoIm9uZSIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ0d28iKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidGhyZWUiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCAwLCAyKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5tb3ZlU3RyaW5nKDAsIDIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ6ZXJvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoIm9uZSIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ0d28iKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidGhyZWUiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCAwLCAyKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLm1vdmVTdHJpbmcoMCwgMik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENsZWFyZWRaZXJvQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG51bGwsIC0xKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclN0cmluZ3MoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBudWxsLCAtMSk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclN0cmluZ3MoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZFplcm9Bcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbnVsbCwgLTEpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VBbGxTdHJpbmdzKG5ldyBTdHJpbmdbXSB7ImJhciIsICJiYXoifSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbnVsbCwgLTEpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZUFsbFN0cmluZ3MobmV3IFN0cmluZ1tdIHsiYmFyIiwgImJheiJ9KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJsaXN0Q2hhbmdlZERvdWJsZUFyZ3VtZW50Iik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSA9PSBOb1N1Y2hNZXRob2RFeGNlcHRpb24uY2xhc3MpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQlNZXRob2QgbWV0aG9kID0gUmVmbGVjdGlvblRvb2xzLmdldE1ldGhvZCh0YXJnZXQsICJsaXN0Q2hhbmdlZERvdWJsZUFyZ3VtZW50IiwgbmV3IENsYXNzW10ge0xpc3RDaGFuZ2VFdmVudC5jbGFzcywgT2JqZWN0LmNsYXNzfSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5lcXVhbHMobWV0aG9kLnRvU3RyaW5nKCkpKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lck1pc21hdGNoKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJLy8gYnVpbGQgYSBMSVNUIGNoYW5nZSBsaXN0ZW5lciBhbmQgaGFjayBpdCBzbyB3ZQotCQkvLyBjYW4gYWRkIGl0IGFzIGEgQ09MTEVDVElPTiBjaGFuZ2UgbGlzdGVuZXIKLQkJT2JqZWN0IGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKHRhcmdldCwgImxpc3RFdmVudFNpbmdsZUFyZ3VtZW50Iik7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImJvZ3VzIGNvbGxlY3Rpb24iLCAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKSBsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGVzdE1vZGVsLmNoYW5nZUNvbGxlY3Rpb24oKTsKLQkJCWZhaWwoImxpc3RlbmVyIG1pc21hdGNoOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCWNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdTX0xJU1QgPSAic3RyaW5ncyI7Ci0JCVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLnN0cmluZ3MpOwotCQl9Ci0JCXZvaWQgYWRkU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMuYWRkSXRlbVRvTGlzdChzdHJpbmcsIHRoaXMuc3RyaW5ncywgU1RSSU5HU19MSVNUKTsKLQkJfQotCQl2b2lkIHJlbW92ZVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdCh0aGlzLnN0cmluZ3MuaW5kZXhPZihzdHJpbmcpLCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfTElTVCk7Ci0JCX0KLQkJdm9pZCByZXBsYWNlU3RyaW5nKFN0cmluZyBvbGRTdHJpbmcsIFN0cmluZyBuZXdTdHJpbmcpIHsKLQkJCXRoaXMuc2V0SXRlbUluTGlzdCh0aGlzLnN0cmluZ3MuaW5kZXhPZihvbGRTdHJpbmcpLCBuZXdTdHJpbmcsIHRoaXMuc3RyaW5ncywgU1RSSU5HU19MSVNUKTsKLQkJfQotCQl2b2lkIG1vdmVTdHJpbmcoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCXRoaXMubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfTElTVCk7Ci0JCX0KLQkJdm9pZCBjbGVhclN0cmluZ3MoKSB7Ci0JCQl0aGlzLmNsZWFyTGlzdCh0aGlzLnN0cmluZ3MsIFNUUklOR1NfTElTVCk7Ci0JCX0KLQkJdm9pZCByZXBsYWNlQWxsU3RyaW5ncyhTdHJpbmdbXSBuZXdTdHJpbmdzKSB7Ci0JCQl0aGlzLnN0cmluZ3MuY2xlYXIoKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5zdHJpbmdzLCBuZXdTdHJpbmdzKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFNUUklOR1NfTElTVCwgdGhpcy5zdHJpbmdzKTsKLQkJfQotCQl2b2lkIGNoYW5nZUNvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgiYm9ndXMgY29sbGVjdGlvbiIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwotCQl9Ci0JfQotCi0JY2xhc3MgVGFyZ2V0IHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJU3RyaW5nIGxpc3ROYW1lOwotCQlTdHJpbmcgc3RyaW5nOwotCQlpbnQgaW5kZXg7Ci0JCVN0cmluZyByZXBsYWNlZFN0cmluZzsKLQkJaW50IHNvdXJjZUluZGV4OwotCQlib29sZWFuIGl0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBsaXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBsaXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGxpc3RFdmVudFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlUYXJnZXQoVGVzdE1vZGVsIHRlc3RNb2RlbCwgU3RyaW5nIGxpc3ROYW1lLCBTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZXgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMubGlzdE5hbWUgPSBsaXN0TmFtZTsKLQkJCXRoaXMuc3RyaW5nID0gc3RyaW5nOwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQl9Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgbGlzdE5hbWUsIFN0cmluZyBzdHJpbmcsIGludCBpbmRleCwgU3RyaW5nIHJlcGxhY2VkU3RyaW5nKSB7Ci0JCQl0aGlzKHRlc3RNb2RlbCwgbGlzdE5hbWUsIHN0cmluZywgaW5kZXgpOwotCQkJdGhpcy5yZXBsYWNlZFN0cmluZyA9IHJlcGxhY2VkU3RyaW5nOwotCQl9Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50ZXN0TW9kZWwgPSB0ZXN0TW9kZWw7Ci0JCQl0aGlzLmxpc3ROYW1lID0gbGlzdE5hbWU7Ci0JCQl0aGlzLmluZGV4ID0gdGFyZ2V0SW5kZXg7Ci0JCQl0aGlzLnNvdXJjZUluZGV4ID0gc291cmNlSW5kZXg7Ci0JCX0KLQkJdm9pZCBpdGVtQWRkZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgaXRlbUFkZGVkU2luZ2xlQXJndW1lbnQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCXRoaXMuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdE5hbWUsIGUuZ2V0TGlzdE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zdHJpbmcsIGUuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5pbmRleCwgZS5nZXRJbmRleCgpKTsKLQkJfQotCQl2b2lkIGl0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJdGhpcy5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3RyaW5nLCBlLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuaW5kZXgsIGUuZ2V0SW5kZXgoKSk7Ci0JCX0KLQkJdm9pZCBpdGVtUmVwbGFjZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3RyaW5nLCBlLmdldE5ld0l0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMucmVwbGFjZWRTdHJpbmcsIGUuZ2V0T2xkSXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5pbmRleCwgZS5nZXRJbmRleCgpKTsKLQkJfQotCQl2b2lkIGl0ZW1Nb3ZlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBpdGVtTW92ZWRTaW5nbGVBcmd1bWVudChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCXRoaXMuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdE5hbWUsIGUuZ2V0TGlzdE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5pbmRleCwgZS5nZXRUYXJnZXRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZUluZGV4LCBlLmdldFNvdXJjZUluZGV4KCkpOwotCQl9Ci0JCXZvaWQgbGlzdENoYW5nZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBsaXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50KExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCXRoaXMubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5saXN0TmFtZSwgZS5nZXRMaXN0TmFtZSgpKTsKLQkJfQotCQl2b2lkIGxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgbGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQl9Ci0JCXZvaWQgbGlzdENoYW5nZWREb3VibGVBcmd1bWVudChMaXN0Q2hhbmdlRXZlbnQgZSwgT2JqZWN0IG8pIHsKLQkJCWZhaWwoImJvZ3VzIGV2ZW50OiAiICsgZSArICIgLSBvYmplY3Q6ICIgKyBvKTsKLQkJfQotCQl2b2lkIGxpc3RFdmVudFNpbmdsZUFyZ3VtZW50KExpc3RFdmVudCBlKSB7Ci0JCQl0aGlzLmxpc3RFdmVudFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2E0ZjNhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGl2ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgUmVmbGVjdGl2ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb0FyZ3VtZW50TmFtZWRQcm9wZXJ0eSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCXRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWRaZXJvQXJndW1lbnQiKSk7Ci0JCXRlc3RNb2RlbC5zZXRWYWx1ZSg5OSk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IG1ldGhvZCB0aGF0IGhhcyBtb3JlIGdlbmVyYWwgbWV0aG9kIHBhcmFtZXRlciB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJTWV0aG9kIG1ldGhvZCA9IFJlZmxlY3Rpb25Ub29scy5nZXRNZXRob2QodGFyZ2V0LCAicHJvcGVydHlDaGFuZ2VkU2luZ2xlQXJndW1lbnQyIiwgbmV3IENsYXNzW10ge09iamVjdC5jbGFzc30pOwotCQl0ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpKTsKLQkJdGVzdE1vZGVsLnNldFZhbHVlKDk5KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVBcmd1bWVudE5hbWVkUHJvcGVydHkoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQl0ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAicHJvcGVydHlDaGFuZ2VkU2luZ2xlQXJndW1lbnQiKSk7Ci0JCXRlc3RNb2RlbC5zZXRWYWx1ZSg5OSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IG1ldGhvZCB0aGF0IGhhcyBtb3JlIGdlbmVyYWwgbWV0aG9kIHBhcmFtZXRlciB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUFyZ3VtZW50TmFtZWRQcm9wZXJ0eTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCU1ldGhvZCBtZXRob2QgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0TWV0aG9kKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZFNpbmdsZUFyZ3VtZW50MiIsIG5ldyBDbGFzc1tdIHtPYmplY3QuY2xhc3N9KTsKLQkJdGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKSk7Ci0JCXRlc3RNb2RlbC5zZXRWYWx1ZSg5OSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNaXNtYXRjaCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCS8vIGJ1aWxkIGEgUFJPUEVSVFkgY2hhbmdlIGxpc3RlbmVyIGFuZCBoYWNrIGl0IHNvIHdlCi0JCS8vIGNhbiBhZGQgaXQgYXMgYSBTVEFURSBjaGFuZ2UgbGlzdGVuZXIKLQkJT2JqZWN0IGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudCIpOwotCQl0ZXN0TW9kZWwuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcigoU3RhdGVDaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXIpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRlc3RNb2RlbC5zZXRWYWx1ZSg5OSk7Ci0JCQlmYWlsKCJsaXN0ZW5lciBtaXNtYXRjaDogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQxKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAic3RhdGVDaGFuZ2VkRG91YmxlQXJndW1lbnQiKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpID09IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbi5jbGFzcykgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCU1ldGhvZCBtZXRob2QgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0TWV0aG9kKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZERvdWJsZUFyZ3VtZW50IiwgbmV3IENsYXNzW10ge1Byb3BlcnR5Q2hhbmdlRXZlbnQuY2xhc3MsIE9iamVjdC5jbGFzc30pOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5lcXVhbHMobWV0aG9kLnRvU3RyaW5nKCkpKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgaW50IHZhbHVlID0gMDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsKLQkJVGVzdE1vZGVsKGludCB2YWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJfQotCQl2b2lkIHNldFZhbHVlKGludCB2YWx1ZSkgewotCQkJaW50IG9sZCA9IHRoaXMudmFsdWU7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCQkJaWYgKG9sZCAhPSB2YWx1ZSkgewotCQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgVGFyZ2V0IHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZTsKLQkJT2JqZWN0IG9sZFZhbHVlOwotCQlPYmplY3QgbmV3VmFsdWU7Ci0JCWJvb2xlYW4gemVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlUYXJnZXQoVGVzdE1vZGVsIHRlc3RNb2RlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG5ldyBJbnRlZ2VyKG9sZFZhbHVlKTsKLQkJCXRoaXMubmV3VmFsdWUgPSBuZXcgSW50ZWdlcihuZXdWYWx1ZSk7Ci0JCX0KLQkJdm9pZCBwcm9wZXJ0eUNoYW5nZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLnplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgcHJvcGVydHlDaGFuZ2VkU2luZ2xlQXJndW1lbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLnNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnByb3BlcnR5TmFtZSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5vbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCQl9Ci0JCXZvaWQgcHJvcGVydHlDaGFuZ2VkU2luZ2xlQXJndW1lbnQyKE9iamVjdCBvKSB7Ci0JCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGUgPSAoUHJvcGVydHlDaGFuZ2VFdmVudCkgbzsKLQkJCXRoaXMuc2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJvcGVydHlOYW1lLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQkJdm9pZCBwcm9wZXJ0eUNoYW5nZWREb3VibGVBcmd1bWVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUgKyAiIC0gb2JqZWN0OiAiICsgbyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVN0YXRlQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YWVkOGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCk7Ci0JCXRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAic3RhdGVDaGFuZ2VkWmVyb0FyZ3VtZW50IikpOwotCQl0ZXN0TW9kZWwuY2hhbmdlU3RhdGUoKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVBcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsKTsKLQkJdGVzdE1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJzdGF0ZUNoYW5nZWRTaW5nbGVBcmd1bWVudCIpKTsKLQkJdGVzdE1vZGVsLmNoYW5nZVN0YXRlKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IG1ldGhvZCB0aGF0IGhhcyBtb3JlIGdlbmVyYWwgbWV0aG9kIHBhcmFtZXRlciB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQlNZXRob2QgbWV0aG9kID0gUmVmbGVjdGlvblRvb2xzLmdldE1ldGhvZCh0YXJnZXQsICJzdGF0ZUNoYW5nZWRTaW5nbGVBcmd1bWVudDIiLCBuZXcgQ2xhc3NbXSB7T2JqZWN0LmNsYXNzfSk7Ci0JCXRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpKTsKLQkJdGVzdE1vZGVsLmNoYW5nZVN0YXRlKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNaXNtYXRjaCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsKTsKLQkJLy8gYnVpbGQgYSBTVEFURSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGhhY2sgaXQgc28gd2UKLQkJLy8gY2FuIGFkZCBpdCBhcyBhIFBST1BFUlRZIGNoYW5nZSBsaXN0ZW5lcgotCQlPYmplY3QgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInN0YXRlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JCXRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJ2YWx1ZSIsIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKSBsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGVzdE1vZGVsLmNoYW5nZVByb3BlcnR5KCk7Ci0JCQlmYWlsKCJsaXN0ZW5lciBtaXNtYXRjaDogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQxKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJzdGF0ZUNoYW5nZWREb3VibGVBcmd1bWVudCIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpLmdldENsYXNzKCkgPT0gTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQlNZXRob2QgbWV0aG9kID0gUmVmbGVjdGlvblRvb2xzLmdldE1ldGhvZCh0YXJnZXQsICJzdGF0ZUNoYW5nZWREb3VibGVBcmd1bWVudCIsIG5ldyBDbGFzc1tdIHtTdGF0ZUNoYW5nZUV2ZW50LmNsYXNzLCBPYmplY3QuY2xhc3N9KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuZXF1YWxzKG1ldGhvZC50b1N0cmluZygpKSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCWNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXZvaWQgY2hhbmdlU3RhdGUoKSB7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQl2b2lkIGNoYW5nZVByb3BlcnR5KCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKCJ2YWx1ZSIsIDU1LCA0Mik7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYXJnZXQgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlib29sZWFuIHplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBzaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJVGFyZ2V0KFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJfQotCQl2b2lkIHN0YXRlQ2hhbmdlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuemVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBzdGF0ZUNoYW5nZWRTaW5nbGVBcmd1bWVudChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuc2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQl9Ci0JCXZvaWQgc3RhdGVDaGFuZ2VkU2luZ2xlQXJndW1lbnQyKE9iamVjdCBlKSB7Ci0JCQl0aGlzLnNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCAoKFN0YXRlQ2hhbmdlRXZlbnQpIGUpLmdldFNvdXJjZSgpKTsKLQkJfQotCQl2b2lkIHN0YXRlQ2hhbmdlZERvdWJsZUFyZ3VtZW50KFN0YXRlQ2hhbmdlRXZlbnQgZSwgT2JqZWN0IG8pIHsKLQkJCWZhaWwoImJvZ3VzIGV2ZW50OiAiICsgZSArICIgLSBvYmplY3Q6ICIgKyBvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVRyZWVDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTgxYWQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGl2ZVRyZWVDaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcihPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAibm9kZUFkZGVkWmVyb0FyZ3VtZW50IiwgIm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50IiwgInRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50IiwgInRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50Iik7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJub2RlQWRkZWRTaW5nbGVBcmd1bWVudCIsICJub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50IiwgInRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnQiLCAidHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb2RlQWRkZWRaZXJvQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb2RlQWRkZWRTaW5nbGVBcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZVJlbW92ZWRaZXJvQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZU5vZGUoImNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVOb2RlKCJjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50TmFtZWRUcmVlKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgiY2hpbGQiLCAiZ3JhbmRjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbMF0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyVHJlZSgpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJjaGlsZCIsICJncmFuZGNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1swXSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclRyZWUoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlQ2hhbmdlZFplcm9Bcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiYW5vdGhlciBjaGlsZCJ9KTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlTm9kZSgiY2hpbGQiLCAiYW5vdGhlciBjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImFub3RoZXIgY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlTm9kZSgiY2hpbGQiLCAiYW5vdGhlciBjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVyTWlzbWF0Y2goKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQkvLyBidWlsZCBhIFRSRUUgY2hhbmdlIGxpc3RlbmVyIGFuZCBoYWNrIGl0IHNvIHdlCi0JCS8vIGNhbiBhZGQgaXQgYXMgYSBDT0xMRUNUSU9OIGNoYW5nZSBsaXN0ZW5lcgotCQlPYmplY3QgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAidHJlZUV2ZW50U2luZ2xlQXJndW1lbnQiKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiYm9ndXMgY29sbGVjdGlvbiIsIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXN0TW9kZWwuY2hhbmdlQ29sbGVjdGlvbigpOwotCQkJZmFpbCgibGlzdGVuZXIgbWlzbWF0Y2g6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHJvb3Q7Ci0JCXByaXZhdGUgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBjaGlsZHJlbkxpc3RzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+KCk7Ci0JCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJlbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdTX1RSRUUgPSAic3RyaW5ncyI7Ci0JCVRlc3RNb2RlbChTdHJpbmcgcm9vdCkgewotCQkJc3VwZXIoKTsKLQkJCWlmIChyb290ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMucm9vdCA9IHJvb3Q7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucHV0KHJvb3QsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCXRoaXMucGFyZW50cy5wdXQocm9vdCwgbnVsbCk7Ci0JCX0KLQkJU3RyaW5nIGdldFJvb3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5yb290OwotCQl9Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHBhdGgoU3RyaW5nIG5vZGUpIHsKLQkJCVN0cmluZyB0ZW1wID0gbm9kZTsKLQkJCUxpc3Q8U3RyaW5nPiByZXZlcnNlUGF0aCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJZG8gewotCQkJCXJldmVyc2VQYXRoLmFkZCh0ZW1wKTsKLQkJCQl0ZW1wID0gdGhpcy5wYXJlbnRzLmdldCh0ZW1wKTsKLQkJCX0gd2hpbGUgKHRlbXAgIT0gbnVsbCk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnJldmVyc2UocmV2ZXJzZVBhdGgpOwotCQl9Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMuY2hpbGRyZW5MaXN0cy5rZXlTZXQoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShTdHJpbmcgcykgewotCQkJCQlUZXN0TW9kZWwudGhpcy5yZW1vdmVOb2RlKHMpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJdm9pZCBhZGROb2RlKFN0cmluZyBwYXJlbnQsIFN0cmluZyBjaGlsZCkgewotCQkJaWYgKChwYXJlbnQgPT0gbnVsbCkgfHwgKGNoaWxkID09IG51bGwpKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0KLQkJCUNvbGxlY3Rpb248U3RyaW5nPiBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5MaXN0cy5nZXQocGFyZW50KTsKLQkJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IGFkZCBhIGNoaWxkIHRvIGEgbm9uLWV4aXN0ZW50IHBhcmVudCIpOwotCQkJfQotCi0JCQlpZiAodGhpcy5jaGlsZHJlbkxpc3RzLmdldChjaGlsZCkgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBhZGQgYSBjaGlsZCB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIHRyZWUiKTsKLQkJCX0KLQkJCQotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5wdXQoY2hpbGQsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCXRoaXMucGFyZW50cy5wdXQoY2hpbGQsIHBhcmVudCk7Ci0JCQl0aGlzLmZpcmVOb2RlQWRkZWQoU1RSSU5HU19UUkVFLCB0aGlzLnBhdGgoY2hpbGQpKTsKLQkJfQotCQl2b2lkIHJlbW92ZU5vZGUoU3RyaW5nIG5vZGUpIHsKLQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbkxpc3RzLmdldChub2RlKTsKLQkJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm9kZSBpcyBub3QgaW4gdHJlZSIpOwotCQkJfQotCQkJTGlzdDxTdHJpbmc+IHBhdGggPSB0aGlzLnBhdGgobm9kZSk7Ci0JCQlmb3IgKFN0cmluZyBzIDogY2hpbGRyZW4pIHsKLQkJCQl0aGlzLnJlbW92ZU5vZGUocyk7Ci0JCQl9Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucmVtb3ZlKG5vZGUpOwotCQkJdGhpcy5wYXJlbnRzLnJlbW92ZShub2RlKTsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKFNUUklOR1NfVFJFRSwgcGF0aCk7Ci0JCX0KLQkJdm9pZCByZXBsYWNlTm9kZShTdHJpbmcgb2xkTm9kZSwgU3RyaW5nIG5ld05vZGUpIHsKLQkJCWlmICgob2xkTm9kZSA9PSBudWxsKSB8fCAobmV3Tm9kZSA9PSBudWxsKSkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCi0JCQlDb2xsZWN0aW9uPFN0cmluZz4gY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuTGlzdHMucmVtb3ZlKG9sZE5vZGUpOwotCQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbGQgbm9kZSBpcyBub3QgaW4gdHJlZSIpOwotCQkJfQotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnB1dChuZXdOb2RlLCBjaGlsZHJlbik7Ci0JCQlmb3IgKFN0cmluZyBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQkJdGhpcy5wYXJlbnRzLnB1dChjaGlsZCwgbmV3Tm9kZSk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBwYXJlbnQgPSB0aGlzLnBhcmVudHMucmVtb3ZlKG9sZE5vZGUpOwotCQkJdGhpcy5wYXJlbnRzLnB1dChuZXdOb2RlLCBwYXJlbnQpOwotCi0JCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZChTVFJJTkdTX1RSRUUsIHRoaXMucGF0aChuZXdOb2RlKSk7Ci0JCX0KLQkJdm9pZCBjbGVhclRyZWUoKSB7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMuY2xlYXIoKTsKLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5wdXQocm9vdCwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQkJdGhpcy5wYXJlbnRzLmNsZWFyKCk7Ci0JCQl0aGlzLnBhcmVudHMucHV0KHJvb3QsIG51bGwpOwotCQkJdGhpcy5maXJlVHJlZUNsZWFyZWQoU1RSSU5HU19UUkVFKTsKLQkJfQotCQl2b2lkIGNoYW5nZUNvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgiYm9ndXMgY29sbGVjdGlvbiIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwotCQl9Ci0JfQotCi0JY2xhc3MgVGFyZ2V0IHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJU3RyaW5nIHRyZWVOYW1lOwotCQlMaXN0PFN0cmluZz4gcGF0aDsKLQkJYm9vbGVhbiBub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiB0cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiB0cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gdHJlZUV2ZW50U2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgdHJlZU5hbWUsIFN0cmluZ1tdIHBhdGgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMudHJlZU5hbWUgPSB0cmVlTmFtZTsKLQkJCXRoaXMucGF0aCA9IEFycmF5cy5hc0xpc3QocGF0aCk7Ci0JCX0KLQkJdm9pZCBub2RlQWRkZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgbm9kZUFkZGVkU2luZ2xlQXJndW1lbnQoVHJlZUFkZEV2ZW50IGUpIHsKLQkJCXRoaXMubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJlZU5hbWUsIGUuZ2V0VHJlZU5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5wYXRoLCBDb2xsZWN0aW9uVG9vbHMubGlzdChlLmdldFBhdGgoKSkpOwotCQl9Ci0JCXZvaWQgbm9kZVJlbW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50KFRyZWVSZW1vdmVFdmVudCBlKSB7Ci0JCQl0aGlzLm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJlZU5hbWUsIGUuZ2V0VHJlZU5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5wYXRoLCBDb2xsZWN0aW9uVG9vbHMubGlzdChlLmdldFBhdGgoKSkpOwotCQl9Ci0JCXZvaWQgdHJlZUNsZWFyZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCB0cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50KFRyZWVDbGVhckV2ZW50IGUpIHsKLQkJCXRoaXMudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTmFtZSwgZS5nZXRUcmVlTmFtZSgpKTsKLQkJfQotCQl2b2lkIHRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgdHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnRyZWVOYW1lLCBlLmdldFRyZWVOYW1lKCkpOwotCQl9Ci0JCXZvaWQgdHJlZUV2ZW50U2luZ2xlQXJndW1lbnQoVHJlZUV2ZW50IGUpIHsKLQkJCXRoaXMudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTmFtZSwgZS5nZXRUcmVlTmFtZSgpKTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkRG91YmxlQXJndW1lbnQoVHJlZUNoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUgKyAiIC0gb2JqZWN0OiAiICsgbyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjZjYjU1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgRW1wbG95ZWUgZW1wbG95ZWU7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gZW1wbG95ZWVIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBlbXBsb3llZUV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBpZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGF0ZT4gaGlyZURhdGVBZGFwdGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgYWRhcHRlckV2ZW50OwotCi0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLlRyaWdnZXIgdHJpZ2dlcjsKLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVmZmVyZWRJREhvbGRlcjsKLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWZmZXJlZE5hbWVIb2xkZXI7Ci0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPERhdGU+IGJ1ZmZlcmVkSGlyZURhdGVIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBidWZmZXJlZEV2ZW50OwotCi0JcHVibGljIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCXRoaXMuZW1wbG95ZWUgPSBuZXcgRW1wbG95ZWUoMTcsICJGcmVkZHkiLCBuZXcgRGF0ZSgpKTsKLQkJdGhpcy5lbXBsb3llZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+KHRoaXMuZW1wbG95ZWUpOwotCi0JCXRoaXMudHJpZ2dlciA9IG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLlRyaWdnZXIoKTsKLQotCQl0aGlzLmlkQWRhcHRlciA9IHRoaXMuYnVpbGRJREFkYXB0ZXIodGhpcy5lbXBsb3llZUhvbGRlcik7Ci0JCXRoaXMuYnVmZmVyZWRJREhvbGRlciA9IG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KHRoaXMuaWRBZGFwdGVyLCB0aGlzLnRyaWdnZXIpOwotCi0JCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIodGhpcy5lbXBsb3llZUhvbGRlcik7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLm5hbWVBZGFwdGVyLCB0aGlzLnRyaWdnZXIpOwotCi0JCXRoaXMuaGlyZURhdGVBZGFwdGVyID0gdGhpcy5idWlsZEhpcmVEYXRlQWRhcHRlcih0aGlzLmVtcGxveWVlSG9sZGVyKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGF0ZT4odGhpcy5oaXJlRGF0ZUFkYXB0ZXIsIHRoaXMudHJpZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZElEQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIEludGVnZXI+KGVIb2xkZXIsIEVtcGxveWVlLklEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0SUQoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldElEKHZhbHVlLmludFZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbXBsb3llZSwgU3RyaW5nPihlSG9sZGVyLCBFbXBsb3llZS5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxEYXRlPiBidWlsZEhpcmVEYXRlQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIERhdGU+KGVIb2xkZXIsIEVtcGxveWVlLkhJUkVfREFURV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGF0ZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEhpcmVEYXRlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhEYXRlIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEhpcmVEYXRlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5pZEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCURhdGUgdGVtcCA9IHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuc2V0VmFsdWUobmV3IEludGVnZXIoMzIzKSk7Ci0JCWFzc2VydEVxdWFscygxNywgdGhpcy5lbXBsb3llZS5nZXRJRCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5pZEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzMjMpLCB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJpZ2dlckFjY2VwdCgpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcigzMjMpKTsKLQkJYXNzZXJ0RXF1YWxzKDE3LCB0aGlzLmVtcGxveWVlLmdldElEKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyMyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJRGF0ZSB0ZW1wID0gdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmlnZ2VyLmFjY2VwdCgpOwotCi0JCWFzc2VydEVxdWFscygzMjMsIHRoaXMuZW1wbG95ZWUuZ2V0SUQoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzMjMpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyMyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyaWdnZXJSZXNldCgpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcigzMjMpKTsKLQkJYXNzZXJ0RXF1YWxzKDE3LCB0aGlzLmVtcGxveWVlLmdldElEKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyMyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJRGF0ZSB0ZW1wID0gdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmlnZ2VyLnJlc2V0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDE3LCB0aGlzLmVtcGxveWVlLmdldElEKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5idWZmZXJlZElESG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWRJREhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmlkQWRhcHRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubmFtZUFkYXB0ZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmhpcmVEYXRlQWRhcHRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5JRF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLkhJUkVfREFURV9QUk9QRVJUWSkpOwotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZElESG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuaWRBZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubmFtZUFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5JRF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuSElSRV9EQVRFX1BST1BFUlRZKSk7Ci0KLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5pZEFkYXB0ZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm5hbWVBZGFwdGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuSURfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5ISVJFX0RBVEVfUFJPUEVSVFkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBhZGFwdGVyTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQWRhcHRlckxpc3RlbmVyKCk7Ci0JCXRoaXMubmFtZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGFkYXB0ZXJMaXN0ZW5lcik7Ci0KLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBlbXBsb3llZUxpc3RlbmVyID0gdGhpcy5idWlsZEVtcGxveWVlTGlzdGVuZXIoKTsKLQkJdGhpcy5lbXBsb3llZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEVtcGxveWVlLk5BTUVfUFJPUEVSVFksIGVtcGxveWVlTGlzdGVuZXIpOwotCi0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJQ2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGFkYXB0ZXJMaXN0ZW5lciA9IHRoaXMuYnVpbGRBZGFwdGVyTGlzdGVuZXIoKTsKLQkJdGhpcy5uYW1lQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihhZGFwdGVyTGlzdGVuZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGVtcGxveWVlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRW1wbG95ZWVMaXN0ZW5lcigpOwotCQl0aGlzLmVtcGxveWVlLmFkZENoYW5nZUxpc3RlbmVyKGVtcGxveWVlTGlzdGVuZXIpOwotCi0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlcygpIHsKLQkJdGhpcy5idWZmZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5hZGFwdGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLmVtcGxveWVlRXZlbnQgPSBudWxsOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5idWZmZXJlZEV2ZW50LCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAiRnJlZGR5IiwgIlJpcGxleSIpOwotCQlhc3NlcnROdWxsKHRoaXMuYWRhcHRlckV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmVtcGxveWVlRXZlbnQpOwotCi0JCXRoaXMuYnVmZmVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuYWRhcHRlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5lbXBsb3llZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIkNoYXJsaWUiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmJ1ZmZlcmVkRXZlbnQsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsICJSaXBsZXkiLCAiQ2hhcmxpZSIpOwotCQlhc3NlcnROdWxsKHRoaXMuYWRhcHRlckV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmVtcGxveWVlRXZlbnQpOwotCi0JCXRoaXMuYnVmZmVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuYWRhcHRlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5lbXBsb3llZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmlnZ2VyLmFjY2VwdCgpOwotCQlhc3NlcnROdWxsKHRoaXMuYnVmZmVyZWRFdmVudCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5hZGFwdGVyRXZlbnQsIHRoaXMubmFtZUFkYXB0ZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgIkZyZWRkeSIsICJDaGFybGllIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5lbXBsb3llZUV2ZW50LCB0aGlzLmVtcGxveWVlLCBFbXBsb3llZS5OQU1FX1BST1BFUlRZLCAiRnJlZGR5IiwgIkNoYXJsaWUiKTsKLQotCQl0aGlzLmJ1ZmZlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmFkYXB0ZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMuZW1wbG95ZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJKYXNvbiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYnVmZmVyZWRFdmVudCwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgIkNoYXJsaWUiLCAiSmFzb24iKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmFkYXB0ZXJFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5lbXBsb3llZUV2ZW50KTsKLQotCQl0aGlzLmJ1ZmZlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmFkYXB0ZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMuZW1wbG95ZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJpZ2dlci5yZXNldCgpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYnVmZmVyZWRFdmVudCwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgIkphc29uIiwgIkNoYXJsaWUiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmFkYXB0ZXJFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5lbXBsb3llZUV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2luZyB0aGUgdmFsdWUgc2hvdWxkIHRyaWdnZXIgYnVmZmVyaW5nCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEJ1ZmZlcmluZzEoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5pc0J1ZmZlcmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXR0aW5nIHRvIHRoZSBzYW1lIHZhbHVlIHNob3VsZCBub3QgdHJpZ2dlciBidWZmZXJpbmcgKD8pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEJ1ZmZlcmluZzIoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiRnJlZGR5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuaXNCdWZmZXJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogc2V0dGluZyB0byB0aGUgb3JpZ2luYWwgdmFsdWUgc2hvdWxkIG5vdCB0cmlnZ2VyIGJ1ZmZlcmluZyAoPykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QnVmZmVyaW5nMygpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJSaXBsZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmlzQnVmZmVyaW5nKCkpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJGcmVkZHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5pc0J1ZmZlcmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBiYWNrLWRvb3IgY2hhbmdlcyBhcmUgaWdub3JlZCAtICJMYXN0IE9uZSBJbiBXaW5zIgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VDb25mbGljdDEoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZSgiSmFzb24iKTsKLQkJYXNzZXJ0RXF1YWxzKCJKYXNvbiIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJKYXNvbiIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmlnZ2VyLmFjY2VwdCgpOwotCQkvLyAiSmFzb24iIGlzIGRyb3BwZWQgb24gdGhlIGZsb29yLi4uCi0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogYmFjay1kb29yIGNoYW5nZXMgY2FuIGRlLWFjdGl2YXRlIGJ1ZmZlcmluZyAoPykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlQ29uZmxpY3QyKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmlzQnVmZmVyaW5nKCkpOwotCi0JCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5pc0J1ZmZlcmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuYnVmZmVyZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZEFkYXB0ZXJMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuYWRhcHRlckV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkRW1wbG95ZWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZW1wbG95ZWVFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHByb3BlcnR5TmFtZSwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIGV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQljbGFzcyBFbXBsb3llZSBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGludCBpZDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1BST1BFUlRZID0gImlkIjsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCXByaXZhdGUgRGF0ZSBoaXJlRGF0ZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhJUkVfREFURV9QUk9QRVJUWSA9ICJoaXJlRGF0ZSI7Ci0KLQkJRW1wbG95ZWUoaW50IGlkLCBTdHJpbmcgbmFtZSwgRGF0ZSBoaXJlRGF0ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmhpcmVEYXRlID0gaGlyZURhdGU7Ci0JCX0KLQkJaW50IGdldElEKCkgewotCQkJcmV0dXJuIHRoaXMuaWQ7Ci0JCX0KLQkJdm9pZCBzZXRJRChpbnQgaWQpIHsKLQkJCWludCBvbGQgPSB0aGlzLmlkOwotCQkJdGhpcy5pZCA9IGlkOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElEX1BST1BFUlRZLCBvbGQsIGlkKTsKLQkJfQotCQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCURhdGUgZ2V0SGlyZURhdGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5oaXJlRGF0ZTsKLQkJfQotCQl2b2lkIHNldEhpcmVEYXRlKERhdGUgaGlyZURhdGUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLmhpcmVEYXRlOwotCQkJdGhpcy5oaXJlRGF0ZSA9IGhpcmVEYXRlOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhJUkVfREFURV9QUk9QRVJUWSwgb2xkLCBoaXJlRGF0ZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTA3ZmQwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmlkaVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4gb2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+IHRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgdHJhbnNmb3JtYXRpb25FdmVudDsKLQotCXB1YmxpYyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uPihuZXcgUGVyc29uKCJLYXJlbiIsICJQZWdneSIsIG51bGwpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciA9IG5ldyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uLCBQZXJzb24+KHRoaXMub2JqZWN0SG9sZGVyLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBCaWRpVHJhbnNmb3JtZXI8UGVyc29uLCBQZXJzb24+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgQmlkaVRyYW5zZm9ybWVyPFBlcnNvbiwgUGVyc29uPigpIHsKLQkJCXB1YmxpYyBQZXJzb24gdHJhbnNmb3JtKFBlcnNvbiBwKSB7Ci0JCQkJcmV0dXJuIChwID09IG51bGwpID8gbnVsbCA6IHAuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgUGVyc29uIHJldmVyc2VUcmFuc2Zvcm0oUGVyc29uIHApIHsKLQkJCQlyZXR1cm4gKHAgPT0gbnVsbCkgPyBudWxsIDogcC5nZXRDaGlsZCgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQlQZXJzb24gcGVyc29uID0gdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJLYXJlbiIsIHBlcnNvbi5nZXROYW1lKCkpOwotCQlQZXJzb24gcGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uLmdldFBhcmVudCgpLmdldE5hbWUoKSwgcGFyZW50LmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUocGVyc29uLmdldFBhcmVudCgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMocGFyZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCVBlcnNvbiBwZXJzb24xID0gbmV3IFBlcnNvbigiTWF0dCIsICJNaXRjaCIsIG51bGwpOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShwZXJzb24xKTsKLQkJUGVyc29uIHBhcmVudDIgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24xLmdldFBhcmVudCgpLmdldE5hbWUoKSwgcGFyZW50Mi5nZXROYW1lKCkpOwotCQlhc3NlcnROb3RTYW1lKHBlcnNvbjEuZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhwYXJlbnQyLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlQZXJzb24gcGVyc29uMyA9IG5ldyBQZXJzb24oIkthcmVuIiwgIlBlZ2d5IiwgbnVsbCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKHBlcnNvbjMpOwotCQlhc3NlcnRFcXVhbHMoIkthcmVuIiwgcGVyc29uMy5nZXROYW1lKCkpOwotCQlQZXJzb24gcGFyZW50MyA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbjMuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCBwYXJlbnQzLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUocGVyc29uMy5nZXRQYXJlbnQoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBhcmVudDMsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25DaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25DaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJUGVyc29uIGthcmVuID0gdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJUGVyc29uIHBlZ2d5UGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlQZXJzb24gcGVnZ3kgPSBuZXcgUGVyc29uKCJQZWdneSIsICJNYXJpYW4iLCBudWxsKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUocGVnZ3kpOwotCQlQZXJzb24gbWFyaWFuUGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBrYXJlbiwgcGVnZ3kpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgcGVnZ3lQYXJlbnQsIG1hcmlhblBhcmVudCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCVBlcnNvbiBtYXR0ID0gbmV3IFBlcnNvbigiTWF0dCIsICJNaXRjaCIsIG51bGwpOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShtYXR0KTsKLQkJUGVyc29uIG1pdGNoUGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBwZWdneSwgbWF0dCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCBtYXJpYW5QYXJlbnQsIG1pdGNoUGFyZW50KTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIG1hdHQsIG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgbWl0Y2hQYXJlbnQsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShtYXR0KTsKLQkJbWl0Y2hQYXJlbnQgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIG51bGwsIG1hdHQpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgbnVsbCwgbWl0Y2hQYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkVHJhbnNmb3JtYXRpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlLCBPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCQotCWNsYXNzIFBlcnNvbiBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgcGFyZW50TmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9OQU1FX1BST1BFUlRZID0gInBhcmVudE5hbWUiOwotCQkKLQkJcHJpdmF0ZSBQZXJzb24gY2hpbGQ7Ci0JCQotCQlwdWJsaWMgUGVyc29uKFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyZW50TmFtZSwgUGVyc29uIGNoaWxkKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5wYXJlbnROYW1lID0gcGFyZW50TmFtZTsKLQkJCXRoaXMuY2hpbGQgPSBjaGlsZDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIFBlcnNvbiBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNvbih0aGlzLnBhcmVudE5hbWUsIG51bGwsIHRoaXMpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wYXJlbnROYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRQYXJlbnROYW1lKFN0cmluZyBuZXdQYXJlbnROYW1lKSB7Ci0JCQlTdHJpbmcgb2xkUGFyZW50TmFtZSA9IHRoaXMucGFyZW50TmFtZTsKLQkJCXRoaXMucGFyZW50TmFtZSA9IG5ld1BhcmVudE5hbWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBBUkVOVF9OQU1FX1BST1BFUlRZLCBvbGRQYXJlbnROYW1lLCBuZXdQYXJlbnROYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIFBlcnNvbiBnZXRDaGlsZCgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OTA1YzIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpZGlUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4gb2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4gdHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCB0cmFuc2Zvcm1hdGlvbkV2ZW50OwotCi0JcHVibGljIENhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4obmV3IFBlcnNvbigiS2FyZW4iLCAiUGVnZ3kiLCBudWxsKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIgPSBuZXcgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uLCBQZXJzb24+KHRoaXMub2JqZWN0SG9sZGVyLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBCaWRpVHJhbnNmb3JtZXI8UGVyc29uLCBQZXJzb24+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgQmlkaVRyYW5zZm9ybWVyPFBlcnNvbiwgUGVyc29uPigpIHsKLQkJCXB1YmxpYyBQZXJzb24gdHJhbnNmb3JtKFBlcnNvbiBwKSB7Ci0JCQkJcmV0dXJuIChwID09IG51bGwpID8gbnVsbCA6IHAuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgUGVyc29uIHJldmVyc2VUcmFuc2Zvcm0oUGVyc29uIHApIHsKLQkJCQlyZXR1cm4gKHAgPT0gbnVsbCkgPyBudWxsIDogcC5nZXRDaGlsZCgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJCi0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoIkthcmVuIiwgcGVyc29uLmdldE5hbWUoKSk7Ci0JCVBlcnNvbiBwYXJlbnQgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24uZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCBwYXJlbnQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShwZXJzb24uZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhwYXJlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJUGVyc29uIHBlcnNvbjEgPSBuZXcgUGVyc29uKCJNYXR0IiwgIk1pdGNoIiwgbnVsbCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKHBlcnNvbjEpOwotCQlQZXJzb24gcGFyZW50MiA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbjEuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCBwYXJlbnQyLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUocGVyc29uMS5nZXRQYXJlbnQoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBhcmVudDIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCVBlcnNvbiBwZXJzb24zID0gbmV3IFBlcnNvbigiS2FyZW4iLCAiUGVnZ3kiLCBudWxsKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUocGVyc29uMyk7Ci0JCWFzc2VydEVxdWFscygiS2FyZW4iLCBwZXJzb24zLmdldE5hbWUoKSk7Ci0JCVBlcnNvbiBwYXJlbnQzID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uMy5nZXRQYXJlbnQoKS5nZXROYW1lKCksIHBhcmVudDMuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShwZXJzb24zLmdldFBhcmVudCgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMocGFyZW50MywgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24oIkNocmlzIiwgIk5vZWwiLCBudWxsKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZShwZXJzb24uZ2V0UGFyZW50KCkpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbi5nZXRQYXJlbnQoKS5nZXROYW1lKCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROb3RTYW1lKHBlcnNvbi5nZXRQYXJlbnQoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlQZXJzb24gcGVyc29uMiA9IG5ldyBQZXJzb24oIkpvbiIsICJFbGl6YWJldGgiLCBudWxsKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZShwZXJzb24yLmdldFBhcmVudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbjIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uMi5nZXRQYXJlbnQoKS5nZXROYW1lKCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROb3RTYW1lKHBlcnNvbjIuZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuc2V0VmFsdWUocGVyc29uLmdldFBhcmVudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24uZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShwZXJzb24uZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJUGVyc29uIG9sZFBlcnNvbiA9IHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCVBlcnNvbiBvbGRQYXJlbnQgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCVBlcnNvbiBuZXdQZXJzb24gPSBuZXcgUGVyc29uKCJLYXJlbiIgLCAiUGVnZ3kiLCBudWxsKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobmV3UGVyc29uKTsKLQkJUGVyc29uIG5ld1BhcmVudCA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgb2xkUGVyc29uLCBuZXdQZXJzb24pOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgb2xkUGFyZW50LCBuZXdQYXJlbnQpOwotCi0vLwotLy8JCXRoaXMuZXZlbnQgPSBudWxsOwotLy8JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0vLwkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoIkZvbyIpOwotLy8JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJiYXoiLCAiRm9vIik7Ci0vLwkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsICJCQVoiLCAiRk9PIik7Ci0vLwotLy8JCXRoaXMuZXZlbnQgPSBudWxsOwotLy8JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0vLwkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoIkZPTyIpOwotLy8JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJGb28iLCAiRk9PIik7Ci0vLwkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQpOwotLy8KLS8vCQl0aGlzLmV2ZW50ID0gbnVsbDsKLS8vCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotLy8JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotLy8JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJGT08iLCBudWxsKTsKLS8vCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgIkZPTyIsIG51bGwpOwotLy8KLS8vCQl0aGlzLmV2ZW50ID0gbnVsbDsKLS8vCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotLy8JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLS8vCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBudWxsLCAiYmFyIik7Ci0vLwkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsIG51bGwsICJCQVIiKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlLCBPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCQotCWNsYXNzIFBlcnNvbiBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgcGFyZW50TmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9OQU1FX1BST1BFUlRZID0gInBhcmVudE5hbWUiOwotCQkKLQkJcHJpdmF0ZSBQZXJzb24gY2hpbGQ7Ci0JCQotCQlwdWJsaWMgUGVyc29uKFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyZW50TmFtZSwgUGVyc29uIGNoaWxkKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5wYXJlbnROYW1lID0gcGFyZW50TmFtZTsKLQkJCXRoaXMuY2hpbGQgPSBjaGlsZDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIFBlcnNvbiBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNvbih0aGlzLnBhcmVudE5hbWUsIG51bGwsIHRoaXMpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wYXJlbnROYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRQYXJlbnROYW1lKFN0cmluZyBuZXdQYXJlbnROYW1lKSB7Ci0JCQlTdHJpbmcgb2xkUGFyZW50TmFtZSA9IHRoaXMucGFyZW50TmFtZTsKLQkJCXRoaXMucGFyZW50TmFtZSA9IG5ld1BhcmVudE5hbWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBBUkVOVF9OQU1FX1BST1BFUlRZLCBvbGRQYXJlbnROYW1lLCBuZXdQYXJlbnROYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIFBlcnNvbiBnZXRDaGlsZCgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQzMDA4ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDE7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcjE7Ci0JcHJpdmF0ZSBMb2NhbENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyIGFhMTsKLQlwcml2YXRlIENvbGxlY3Rpb25FdmVudCBldmVudDE7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIxOwotCXByaXZhdGUgU3RyaW5nIGV2ZW50MVR5cGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREID0gImFkZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRSA9ICJyZW1vdmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0UgPSAiY2hhbmdlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVIgPSAiY2xlYXIiOwotCi0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MjsKLQotCXB1YmxpYyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3ViamVjdDEgPSBuZXcgVGVzdFN1YmplY3QoKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lcyh0aGlzLnN1YmplY3QxTmFtZXMoKSk7Ci0JCXRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb25zKHRoaXMuc3ViamVjdDFEZXNjcmlwdGlvbnMoKSk7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0Pih0aGlzLnN1YmplY3QxKTsKLQkJdGhpcy5hYTEgPSB0aGlzLmJ1aWxkQXNwZWN0QWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIxKTsKLQkJdGhpcy5saXN0ZW5lcjEgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5saXN0ZW5lcjEpOwotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuZXZlbnQxVHlwZSA9IG51bGw7Ci0KLQkJdGhpcy5zdWJqZWN0MiA9IG5ldyBUZXN0U3ViamVjdCgpOwotCQl0aGlzLnN1YmplY3QyLmFkZE5hbWVzKHRoaXMuc3ViamVjdDJOYW1lcygpKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbnModGhpcy5zdWJqZWN0MkRlc2NyaXB0aW9ucygpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdWJqZWN0MU5hbWVzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3ViamVjdDFEZXNjcmlwdGlvbnMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDEgZGVzY3JpcHRpb24xIik7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDEgZGVzY3JpcHRpb24yIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3ViamVjdDJOYW1lcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiYmF6Iik7Ci0JCXJlc3VsdC5hZGQoImJhbSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHN1YmplY3QyRGVzY3JpcHRpb25zKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QyIGRlc2NyaXB0aW9uMSIpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QyIGRlc2NyaXB0aW9uMiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTG9jYWxDb2xsZWN0aW9uQXNwZWN0QWRhcHRlciBidWlsZEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihzdWJqZWN0SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlLCBBREQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSwgUkVNT1ZFKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlLCBDTEVBUik7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUsIENIQU5HRSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCB2YWx1ZTFDaGFuZ2VkKENvbGxlY3Rpb25FdmVudCBlLCBTdHJpbmcgZXZlbnRUeXBlKSB7Ci0JCXRoaXMuZXZlbnQxID0gZTsKLQkJdGhpcy5ldmVudDFUeXBlID0gZXZlbnRUeXBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIENIQU5HRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDJOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5ldmVudDFUeXBlID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIENIQU5HRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDEpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXZlbnQxVHlwZSwgQ0hBTkdFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQxLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkTmFtZSgiamFtIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBBREQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamFtIiwgKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzUGx1cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc1BsdXMuYWRkKCJqYW0iKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1cywgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBudWxsOwotCQl0aGlzLmFhMS5hZGRBbGwoQ29sbGVjdGlvbnMuc2luZ2xldG9uKCJqYXoiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBBREQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF6IiwgKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJbmFtZXNQbHVzLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMsIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEucmVtb3ZlTmFtZSgiZm9vIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBSRU1PVkUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzTWludXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNNaW51cy5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNNaW51cywgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBudWxsOwotCQl0aGlzLmFhMS5yZW1vdmVBbGwoQ29sbGVjdGlvbnMuc2luZ2xldG9uKCJiYXIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBSRU1PVkUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJbmFtZXNNaW51cy5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNNaW51cywgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkVHdvTmFtZXMoImphbSIsICJqYXoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIENIQU5HRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzUGx1czIgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNQbHVzMi5hZGQoImphbSIpOwotCQluYW1lc1BsdXMyLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMyLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLnN1YmplY3QxLm5hbWVzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5zdWJqZWN0MS5uYW1lcygpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pKTsKLQkJdGhpcy5hYTEucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRoaXMuYWExLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikpOwotCQl0aGlzLmFhMS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBjbGFzcyBUZXN0U3ViamVjdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBuYW1lczsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNfQ09MTEVDVElPTiA9ICJuYW1lcyI7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGRlc2NyaXB0aW9uczsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05TX0NPTExFQ1RJT04gPSAiZGVzY3JpcHRpb25zIjsKLQkKLQkJcHVibGljIFRlc3RTdWJqZWN0KCkgewotCQkJdGhpcy5uYW1lcyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJCXRoaXMuZGVzY3JpcHRpb25zID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPFN0cmluZz4odGhpcy5uYW1lcyk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZShTdHJpbmcgbmFtZSkgewotCQkJaWYgKHRoaXMubmFtZXMuYWRkKG5hbWUpKSB7Ci0JCQkJdGhpcy5maXJlSXRlbUFkZGVkKE5BTUVTX0NPTExFQ1RJT04sIG5hbWUpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWVzKEl0ZXJhdG9yPFN0cmluZz4gbmV3TmFtZXMpIHsKLQkJCXdoaWxlIChuZXdOYW1lcy5oYXNOZXh0KCkpIHsKLQkJCQl0aGlzLmFkZE5hbWUobmV3TmFtZXMubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gbmV3TmFtZXMpIHsKLQkJCXRoaXMuYWRkTmFtZXMobmV3TmFtZXMuaXRlcmF0b3IoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkVHdvTmFtZXMoU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIpIHsKLQkJCWlmICh0aGlzLm5hbWVzLmFkZChuYW1lMSkgfCB0aGlzLm5hbWVzLmFkZChuYW1lMikpIHsKLQkJCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChOQU1FU19DT0xMRUNUSU9OLCB0aGlzLm5hbWVzKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlpZiAodGhpcy5uYW1lcy5yZW1vdmUobmFtZSkpIHsKLQkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChOQU1FU19DT0xMRUNUSU9OLCBuYW1lKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBkZXNjcmlwdGlvbnMoKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8U3RyaW5nPih0aGlzLmRlc2NyaXB0aW9ucyk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQlpZiAodGhpcy5kZXNjcmlwdGlvbnMuYWRkKGRlc2NyaXB0aW9uKSkgewotCQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChERVNDUklQVElPTlNfQ09MTEVDVElPTiwgZGVzY3JpcHRpb24pOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9ucyhJdGVyYXRvcjxTdHJpbmc+IG5ld0Rlc2NyaXB0aW9ucykgewotCQkJd2hpbGUgKG5ld0Rlc2NyaXB0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCQl0aGlzLmFkZERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9ucy5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9ucyhDb2xsZWN0aW9uPFN0cmluZz4gbmV3RGVzY3JpcHRpb25zKSB7Ci0JCQl0aGlzLmFkZERlc2NyaXB0aW9ucyhuZXdEZXNjcmlwdGlvbnMuaXRlcmF0b3IoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlRGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQlpZiAodGhpcy5kZXNjcmlwdGlvbnMucmVtb3ZlKGRlc2NyaXB0aW9uKSkgewotCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKERFU0NSSVBUSU9OU19DT0xMRUNUSU9OLCBkZXNjcmlwdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyB0aGlzIGlzIG5vdCBhIHR5cGljYWwgYXNwZWN0IGFkYXB0ZXIgLSB0aGUgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYXNwZWN0IG5hbWUKLQlwcml2YXRlIGNsYXNzIExvY2FsQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIgZXh0ZW5kcyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgU3RyaW5nPiB7Ci0KLQkJTG9jYWxDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJCXN1cGVyKHN1YmplY3RIb2xkZXIsIFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yXygpIHsKLQkJCWlmICh0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lcygpOwotCQkJfQotCQkJaWYgKHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19DT0xMRUNUSU9OKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5kZXNjcmlwdGlvbnMoKTsKLQkJCX0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGl0ZW0pIHsKLQkJCWlmICh0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LmFkZE5hbWUoaXRlbSk7Ci0JCQl9IGVsc2UgaWYgKHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19DT0xMRUNUSU9OKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LmFkZERlc2NyaXB0aW9uKGl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMuYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBpdGVtKSB7Ci0JCQlpZiAodGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikgewotCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVOYW1lKChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIGlmICh0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfQ09MTEVDVElPTikgewotCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVEZXNjcmlwdGlvbigoU3RyaW5nKSBpdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUFsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBpdGVtcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLnJlbW92ZShzdHJlYW0ubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzNTcwMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWRhcHRlcjsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb25Ib2xkZXI7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb247Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb24gPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uKTsKLQkJdGhpcy5hZGFwdGVyID0gbmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZSgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgYWRhcHRlckNvbGxlY3Rpb24pOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEhhc2hCYWc8U3RyaW5nPigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0KLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IHRoaXMuYWRhcHRlckNvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJqYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiamF6IikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNoKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJqYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiamF6IikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBjbCA9IG5ldyBDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRoaXMuYWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXMobmV3IEhhc2hCYWc8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkRnJvbUVtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJSGFzaEJhZzxTdHJpbmc+IGJhZyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJYmFnLmFkZCgiZm9vIik7Ci0JCWJhZy5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhiYWcpOwotCQlhc3NlcnRFcXVhbHMoMiwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRGcm9tRW1wdHlUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJSGFzaEJhZzxTdHJpbmc+IGJhZyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXMoYmFnKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQotCWNsYXNzIFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODlkYWM3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBhZGFwdGVyOwotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbkhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCi0JcHVibGljIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlciA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRhcHRlciA9IG5ldyBMb2NhbEFkYXB0ZXIodGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlciwgIjY2NiIpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRWYWx1ZSgpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjExMSIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiMjIyIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCI2NjYiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiNjY2Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiNjY2Iik7Ci0JCWFzc2VydFRydWUodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5jbGVhcigpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMuYWRhcHRlci5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMuYWRhcHRlci5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFdmVudEZpcmluZygpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiMTExIik7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjIyMiIpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCI2NjYiKTsKLQkJdGhpcy52ZXJpZnlFdmVudChmYWxzZSwgdHJ1ZSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoIjY2NiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRydWUsIGZhbHNlKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiNjY2Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoZmFsc2UsIHRydWUpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuY2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0cnVlLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWRhcHRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLnZhbHVlT2Yob2xkVmFsdWUpLCB0aGlzLmV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi52YWx1ZU9mKG5ld1ZhbHVlKSwgdGhpcy5ldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWUoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCI2NjYiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9OwotCQl0aGlzLmFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQl0aGlzLmFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiB0aGUgdmFsdWUgaXMgdHJ1ZSBpZiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgaXRlbSwKLQkgKiBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIGZhbHNlCi0JICovCi0Jc3RhdGljIGNsYXNzIExvY2FsQWRhcHRlcgotCQlleHRlbmRzIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEJvb2xlYW4+Ci0JCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4KLQl7Ci0JCXByaXZhdGUgU3RyaW5nIGl0ZW07Ci0KLQkJTG9jYWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlciwgU3RyaW5nIGl0ZW0pIHsKLQkJCXN1cGVyKGNvbGxlY3Rpb25Ib2xkZXIpOwotCQkJdGhpcy5pdGVtID0gaXRlbTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQkvKioKLQkJICogYWx3YXlzIHJldHVybiBhIEJvb2xlYW4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQm9vbGVhbiBnZXRWYWx1ZSgpIHsKLQkJCUJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuZ2V0VmFsdWUoKTsKLQkJCXJldHVybiAocmVzdWx0ID09IG51bGwpID8gQm9vbGVhbi5GQUxTRSA6IHJlc3VsdDsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQkJaWYgKHRoaXMuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlpZiAoICEgdGhpcy5ib29sZWFuVmFsdWVPZih2YWx1ZSkpIHsKLQkJCQkJLy8gdGhlIHZhbHVlIGlzIGNoYW5naW5nIGZyb20gdHJ1ZSB0byBmYWxzZQotCQkJCQkoKFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4pIHRoaXMuY29sbGVjdGlvbk1vZGVsKS5yZW1vdmUodGhpcy5pdGVtKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICh0aGlzLmJvb2xlYW5WYWx1ZU9mKHZhbHVlKSkgewotCQkJCQkvLyB0aGUgdmFsdWUgaXMgY2hhbmdpbmcgZnJvbSBmYWxzZSB0byB0cnVlCi0JCQkJCSgoU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPikgdGhpcy5jb2xsZWN0aW9uTW9kZWwpLmFkZCh0aGlzLml0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuY29sbGVjdGlvbk1vZGVsLml0ZXJhdG9yKCksIHRoaXMuaXRlbSkpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQkJcHJpdmF0ZSBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKLQkJCXJldHVybiB0aGlzLmJvb2xlYW5WYWx1ZU9mKHRoaXMudmFsdWUpOwotCQl9Ci0JCXByaXZhdGUgYm9vbGVhbiBib29sZWFuVmFsdWVPZihPYmplY3QgYikgewotCQkJcmV0dXJuIChiID09IG51bGwpID8gZmFsc2UgOiAoKEJvb2xlYW4pIGIpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjAwZmY2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBwdm0xOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gcHZtMjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHB2bTM7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBwdm00OwotCXByaXZhdGUgQ29sbGVjdGlvbjxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gY29sbGVjdGlvbjsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBjdm07Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gY29tcG9zaXRlUFZNOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQotCXB1YmxpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5wdm0xID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLnB2bTIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSk7Ci0JCXRoaXMucHZtMyA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy5wdm00ID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PigpOwotCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHRoaXMucHZtMSk7Ci0JCXRoaXMuY29sbGVjdGlvbi5hZGQodGhpcy5wdm0yKTsKLQkJdGhpcy5jb2xsZWN0aW9uLmFkZCh0aGlzLnB2bTMpOwotCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHRoaXMucHZtNCk7Ci0JCXRoaXMuY3ZtID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Pih0aGlzLmNvbGxlY3Rpb24pOwotCQkKLQkJdGhpcy5jb21wb3NpdGVQVk0gPSB0aGlzLmJ1aWxkQ29tcG9zaXRlUFZNKGN2bSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDb21wb3NpdGVQVk0oQ29sbGVjdGlvblZhbHVlTW9kZWw8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IHB2bXMpIHsKLQkJcmV0dXJuIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwuYW5kKHB2bXMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVBbmRMaXN0ZW5lcnMxKCkgewotCQlhc3NlcnROdWxsKHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlQW5kTGlzdGVuZXJzMigpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJdGhpcy5jb21wb3NpdGVQVk0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wdm0xLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRydWUsIGZhbHNlKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wdm0yLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOyAgLy8gbm8gY2hhbmdlCi0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHZtMi5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOyAgLy8gbm8gY2hhbmdlCi0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHZtMS5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGZhbHNlLCB0cnVlKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wdm00LnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRydWUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZTEoKSB7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UyKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvbkNoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHB2bSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSk7Ci0JCXRoaXMuY3ZtLmFkZChwdm0pOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRydWUsIGZhbHNlKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jdm0ucmVtb3ZlKHB2bSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoZmFsc2UsIHRydWUpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmN2bS5jbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEJvb2xlYW4uVFJVRSwgbnVsbCk7Ci0KLQkJQ29sbGVjdGlvbjxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gYzIgPSBuZXcgQXJyYXlMaXN0PFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PigpOwotCQljMi5hZGQodGhpcy5wdm0xKTsKLQkJYzIuYWRkKHRoaXMucHZtMik7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmN2bS5zZXRWYWx1ZXMoYzIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KG51bGwsIEJvb2xlYW4uVFJVRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcxKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmNvbXBvc2l0ZVBWTS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcyKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wdm0xLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0JCi0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUV2ZW50KEJvb2xlYW4udmFsdWVPZihvbGRWYWx1ZSksIEJvb2xlYW4udmFsdWVPZihuZXdWYWx1ZSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChCb29sZWFuIG9sZFZhbHVlLCBCb29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmNvbXBvc2l0ZVBWTSwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIHRoaXMuZXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy5ldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYWI3MmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgTmVpZ2hib3Job29kIG5laWdoYm9yaG9vZDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE5laWdoYm9yaG9vZD4gbmVpZ2hib3Job29kSG9sZGVyOwotCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5uZWlnaGJvcmhvb2QgPSBuZXcgTmVpZ2hib3Job29kKCJIYW5uYS1CYXJiZXJhIik7Ci0JCXRoaXMubmVpZ2hib3Job29kSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOZWlnaGJvcmhvb2Q+KHRoaXMubmVpZ2hib3Job29kKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNoMSgpIHsKLQkJdGhpcy52ZXJpZnlTeW5jaCh0aGlzLmJ1aWxkQWxsTWVtYmVyc0NvbXBvc2l0ZSh0aGlzLm5laWdoYm9yaG9vZEhvbGRlcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaDIoKSB7Ci0JCXRoaXMudmVyaWZ5U3luY2godGhpcy5idWlsZEFsbE1lbWJlcnNDb21wb3NpdGUyKHRoaXMubmVpZ2hib3Job29kSG9sZGVyKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN5bmNoKENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1lbWJlcj4gY29tcG9zaXRlQ1ZNKSB7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCQlCYWc8RmFtaWx5PiBmYW1pbGllc1N5bmNoID0gbmV3IENvb3JkaW5hdGVkQmFnPEZhbWlseT4odGhpcy5idWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcih0aGlzLm5laWdoYm9yaG9vZEhvbGRlcikpOwotCQlCYWc8TWVtYmVyPiBtZW1iZXJzU3luY2ggPSBuZXcgQ29vcmRpbmF0ZWRCYWc8TWVtYmVyPihjb21wb3NpdGVDVk0pOwotCQl0aGlzLnBvcHVsYXRlTmVpZ2hib3Job29kKHRoaXMubmVpZ2hib3Job29kKTsKLQotCQlGYW1pbHkgamV0c29ucyA9IHRoaXMubmVpZ2hib3Job29kLmZhbWlseU5hbWVkKCJKZXRzb24iKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0KLQkJamV0c29ucy5yZW1vdmVNZW1iZXIoamV0c29ucy5tZW1iZXJOYW1lZCgiQXN0cm8iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBmYW1pbGllc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQlqZXRzb25zLnJlbW92ZU1lbWJlcihqZXRzb25zLm1lbWJlck5hbWVkKCJKdWR5IikpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0KLQkJamV0c29ucy5hZGRNZW1iZXIoIkZpZG8iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCXRoaXMubmVpZ2hib3Job29kLnJlbW92ZUZhbWlseShqZXRzb25zKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoNywgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQlGYW1pbHkgYmVhcnMgPSB0aGlzLm5laWdoYm9yaG9vZC5hZGRGYW1pbHkoIkJlYXIiKTsKLQkJCWJlYXJzLmFkZE1lbWJlcigiWW9naSIpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoOCwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscyg4LCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCWJlYXJzLmFkZE1lbWJlcigiQm9vLUJvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoOSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscyg5LCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCU5laWdoYm9yaG9vZCBuMiA9IG5ldyBOZWlnaGJvcmhvb2QoIkhhbm5hLUJhcmJlcmEgMiIpOwotCQl0aGlzLm5laWdoYm9yaG9vZEhvbGRlci5zZXRWYWx1ZShuMik7Ci0JCXRoaXMucG9wdWxhdGVOZWlnaGJvcmhvb2QobjIpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIENvbGxlY3Rpb25Ub29scy5zaXplKG4yLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyhuMi5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vVHJhbnNmb3JtZXIoKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gc3ViQ1ZNMSA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gc3ViQ1ZNMiA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCUNvbGxlY3Rpb248Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPj4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJY29sbGVjdGlvbi5hZGQoc3ViQ1ZNMSk7Ci0JCWNvbGxlY3Rpb24uYWRkKHN1YkNWTTIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaEJhZyA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KGNvbGxlY3Rpb24pKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgc3luY2hCYWcuc2l6ZSgpKTsKLQotCQlzdWJDVk0xLmFkZCgiZm9vIik7Ci0JCXN1YkNWTTEuYWRkKCJiYXIiKTsKLQkJc3ViQ1ZNMS5hZGQoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoMywgc3luY2hCYWcuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzeW5jaEJhZy5jb250YWlucygiZm9vIikpOwotCi0JCXN1YkNWTTIuYWRkKCJqb28iKTsKLQkJc3ViQ1ZNMi5hZGQoImphciIpOwotCQlzdWJDVk0yLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaEJhZy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHN5bmNoQmFnLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydFRydWUoc3luY2hCYWcuY29udGFpbnMoImpheiIpKTsKLQotCQlzdWJDVk0xLnJlbW92ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscyg1LCBzeW5jaEJhZy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShzeW5jaEJhZy5jb250YWlucygiYmF6IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVJdGVtKCkgewotCQlCYWc8TWVtYmVyPiBzeW5jaEJhZyA9IG5ldyBDb29yZGluYXRlZEJhZzxNZW1iZXI+KHRoaXMuYnVpbGRBbGxNZW1iZXJzQ29tcG9zaXRlKHRoaXMubmVpZ2hib3Job29kSG9sZGVyKSk7Ci0JCXRoaXMucG9wdWxhdGVOZWlnaGJvcmhvb2QodGhpcy5uZWlnaGJvcmhvb2QpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLm5laWdoYm9yaG9vZC5hZGRGYW1pbHkodGhpcy5uZWlnaGJvcmhvb2QuZmFtaWx5TmFtZWQoIkpldHNvbiIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmluZGV4T2YoImR1cGxpY2F0ZSBjb21wb25lbnQiKSAhPSAtMSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBzeW5jaEJhZy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCUNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEZhbWlseSwgTWVtYmVyPiBjb21wb3NpdGVDVk0gPSB0aGlzLmJ1aWxkQWxsTWVtYmVyc0NvbXBvc2l0ZSh0aGlzLm5laWdoYm9yaG9vZEhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkQmFnPE1lbWJlcj4gc3luY2hCYWcgPSBuZXcgQ29vcmRpbmF0ZWRCYWc8TWVtYmVyPihjb21wb3NpdGVDVk0pOwotCQl0aGlzLnBvcHVsYXRlTmVpZ2hib3Job29kKHRoaXMubmVpZ2hib3Job29kKTsKLQkJRmFtaWx5IGpldHNvbnMgPSB0aGlzLm5laWdoYm9yaG9vZC5mYW1pbHlOYW1lZCgiSmV0c29uIik7Ci0KLQkJYXNzZXJ0VHJ1ZShjb21wb3NpdGVDVk0uaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShqZXRzb25zLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoRmFtaWx5Lk1FTUJFUlNfQ09MTEVDVElPTikpOwotCi0JCWNvbXBvc2l0ZUNWTS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBzeW5jaEJhZyk7Ci0JCWFzc2VydEZhbHNlKGNvbXBvc2l0ZUNWTS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRGYWxzZShqZXRzb25zLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoRmFtaWx5Lk1FTUJFUlNfQ09MTEVDVElPTikpOwotCi0JCWNvbXBvc2l0ZUNWTS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBzeW5jaEJhZyk7Ci0JCWFzc2VydFRydWUoY29tcG9zaXRlQ1ZNLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUoamV0c29ucy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEZhbWlseS5NRU1CRVJTX0NPTExFQ1RJT04pKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVOZWlnaGJvcmhvb2QoTmVpZ2hib3Job29kIG4pIHsKLQkJRmFtaWx5IGZhbWlseTEgPSBuLmFkZEZhbWlseSgiRmxpbnRzdG9uZSIpOwotCQkJZmFtaWx5MS5hZGRNZW1iZXIoIkZyZWQiKTsKLQkJCWZhbWlseTEuYWRkTWVtYmVyKCJXaWxtYSIpOwotCQkJZmFtaWx5MS5hZGRNZW1iZXIoIlBlYmJsZXMiKTsKLQkJCWZhbWlseTEuYWRkTWVtYmVyKCJEaW5vIik7Ci0JCUZhbWlseSBmYW1pbHkyID0gbi5hZGRGYW1pbHkoIlJ1YmJsZSIpOwotCQkJZmFtaWx5Mi5hZGRNZW1iZXIoIkJhcm5leSIpOwotCQkJZmFtaWx5Mi5hZGRNZW1iZXIoIkJldHR5Iik7Ci0JCQlmYW1pbHkyLmFkZE1lbWJlcigiQmFtbS1CYW1tIik7Ci0JCUZhbWlseSBmYW1pbHkzID0gbi5hZGRGYW1pbHkoIkpldHNvbiIpOwotCQkJZmFtaWx5My5hZGRNZW1iZXIoIkdlb3JnZSIpOwotCQkJZmFtaWx5My5hZGRNZW1iZXIoIkphbmUiKTsKLQkJCWZhbWlseTMuYWRkTWVtYmVyKCJKdWR5Iik7Ci0JCQlmYW1pbHkzLmFkZE1lbWJlcigiRWxyb3kiKTsKLQkJCWZhbWlseTMuYWRkTWVtYmVyKCJBc3RybyIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8RmFtaWx5PiBidWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8TmVpZ2hib3Job29kPiBjb21tdW5lSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8TmVpZ2hib3Job29kLCBGYW1pbHk+KGNvbW11bmVIb2xkZXIsIE5laWdoYm9yaG9vZC5GQU1JTElFU19DT0xMRUNUSU9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxGYW1pbHk+IGl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmZhbWlsaWVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiBidWlsZE1lbWJlcnNBZGFwdGVyKEZhbWlseSBmYW1pbHkpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxGYW1pbHksIE1lbWJlcj4oRmFtaWx5Lk1FTUJFUlNfQ09MTEVDVElPTiwgZmFtaWx5KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxNZW1iZXI+IGl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm1lbWJlcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEZhbWlseSwgTWVtYmVyPiBidWlsZEFsbE1lbWJlcnNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPE5laWdoYm9yaG9vZD4gY29tbXVuZUhvbGRlcikgewotCQkvLyBvdmVycmlkZSAjdHJhbnNmb3JtKE9iamVjdCkKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxGYW1pbHksIE1lbWJlcj4odGhpcy5idWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcihjb21tdW5lSG9sZGVyKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiB0cmFuc2Zvcm0oRmFtaWx5IGZhbWlseSkgewotCQkJCXJldHVybiBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYnVpbGRNZW1iZXJzQWRhcHRlcihmYW1pbHkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiBidWlsZEFsbE1lbWJlcnNDb21wb3NpdGUyKFByb3BlcnR5VmFsdWVNb2RlbDxOZWlnaGJvcmhvb2Q+IGNvbW11bmVIb2xkZXIpIHsKLQkJLy8gYnVpbGQgYSBjdXN0b20gVHJhbnNmb3JtZXIKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxGYW1pbHksIE1lbWJlcj4odGhpcy5idWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcihjb21tdW5lSG9sZGVyKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8RmFtaWx5LCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxNZW1iZXI+PiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPEZhbWlseSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPj4oKSB7Ci0JCQlwdWJsaWMgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiB0cmFuc2Zvcm0oRmFtaWx5IGZhbWlseSkgewotCQkJCXJldHVybiBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYnVpbGRNZW1iZXJzQWRhcHRlcihmYW1pbHkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiTG9jYWwgVHJhbnNmb3JtZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0vLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogaW5uZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTmVpZ2hib3Job29kIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlwcml2YXRlIENvbGxlY3Rpb248RmFtaWx5PiBmYW1pbGllcyA9IG5ldyBBcnJheUxpc3Q8RmFtaWx5PigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFNSUxJRVNfQ09MTEVDVElPTiA9ICJmYW1pbGllcyI7Ci0JCi0JCXB1YmxpYyBOZWlnaGJvcmhvb2QoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkKLQkJcHVibGljIEl0ZXJhdG9yPEZhbWlseT4gZmFtaWxpZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mYW1pbGllcy5pdGVyYXRvcigpOwotCQl9Ci0JCi0JCXB1YmxpYyBGYW1pbHkgYWRkRmFtaWx5KFN0cmluZyBmYW1pbHlOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRGYW1pbHkobmV3IEZhbWlseShmYW1pbHlOYW1lKSk7Ci0JCX0KLQotCQkvLyBiYWNrZG9vciB0byBhbGxvdyBkdXBsaWNhdGVzCi0JCXB1YmxpYyBGYW1pbHkgYWRkRmFtaWx5KEZhbWlseSBmYW1pbHkpIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihmYW1pbHksIHRoaXMuZmFtaWxpZXMsIEZBTUlMSUVTX0NPTExFQ1RJT04pOwotCQkJcmV0dXJuIGZhbWlseTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUZhbWlseShGYW1pbHkgZmFtaWx5KSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihmYW1pbHksIHRoaXMuZmFtaWxpZXMsIEZBTUlMSUVTX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCXB1YmxpYyBGYW1pbHkgZmFtaWx5TmFtZWQoU3RyaW5nIGZhbWlseU5hbWUpIHsKLQkJCWZvciAoRmFtaWx5IGZhbWlseSA6IHRoaXMuZmFtaWxpZXMpIHsKLQkJCQlpZiAoZmFtaWx5LmdldE5hbWUoKS5lcXVhbHMoZmFtaWx5TmFtZSkpIHsKLQkJCQkJcmV0dXJuIGZhbWlseTsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZhbWlseU5hbWUpOwotCQl9Ci0JCi0JCXB1YmxpYyBJdGVyYXRvcjxNZW1iZXI+IGFsbE1lbWJlcnMoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPE1lbWJlcj4odGhpcy5tZW1iZXJzSXRlcmF0b3JzKCkpOwotCQl9Ci0JCi0JCXByaXZhdGUgSXRlcmF0b3I8SXRlcmF0b3I8TWVtYmVyPj4gbWVtYmVyc0l0ZXJhdG9ycygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGYW1pbHksIEl0ZXJhdG9yPE1lbWJlcj4+KHRoaXMuZmFtaWxpZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxNZW1iZXI+IHRyYW5zZm9ybShGYW1pbHkgZmFtaWx5KSB7Ci0JCQkJCXJldHVybiBmYW1pbHkubWVtYmVycygpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHVibGljIE1lbWJlciBtZW1iZXJOYW1lZChTdHJpbmcgZmFtaWx5TmFtZSwgU3RyaW5nIG1lbWJlck5hbWUpIHsKLQkJCXJldHVybiB0aGlzLmZhbWlseU5hbWVkKGZhbWlseU5hbWUpLm1lbWJlck5hbWVkKG1lbWJlck5hbWUpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBpbm5lciBjbGFzcwotCSAqLwotCXB1YmxpYyBjbGFzcyBGYW1pbHkgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxNZW1iZXI+IG1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlcj4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUJFUlNfQ09MTEVDVElPTiA9ICJtZW1iZXJzIjsKLQkKLQkJcHVibGljIEZhbWlseShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQotCQlwdWJsaWMgSXRlcmF0b3I8TWVtYmVyPiBtZW1iZXJzKCkgewotCQkJcmV0dXJuIHRoaXMubWVtYmVycy5pdGVyYXRvcigpOwotCQl9Ci0JCi0JCXB1YmxpYyBNZW1iZXIgYWRkTWVtYmVyKFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0JCQlNZW1iZXIgbWVtYmVyID0gbmV3IE1lbWJlcihtZW1iZXJOYW1lKTsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihtZW1iZXIsIHRoaXMubWVtYmVycywgTUVNQkVSU19DT0xMRUNUSU9OKTsKLQkJCXJldHVybiBtZW1iZXI7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZU1lbWJlcihNZW1iZXIgbWVtYmVyKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihtZW1iZXIsIHRoaXMubWVtYmVycywgTUVNQkVSU19DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlwdWJsaWMgTWVtYmVyIG1lbWJlck5hbWVkKFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0JCQlmb3IgKE1lbWJlciBtZW1iZXIgOiB0aGlzLm1lbWJlcnMpIHsKLQkJCQlpZiAobWVtYmVyLmdldE5hbWUoKS5lcXVhbHMobWVtYmVyTmFtZSkpIHsKLQkJCQkJcmV0dXJuIG1lbWJlcjsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lbWJlck5hbWUpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJfQotCQotCX0KLQotCi0JLyoqCi0JICogaW5uZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTWVtYmVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCi0JCXB1YmxpYyBNZW1iZXIoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZTdjZGUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTA7Ci0JcHJpdmF0ZSBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtMTsKLQlwcml2YXRlIExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0yOwotCXByaXZhdGUgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTM7Ci0JcHJpdmF0ZSBMb2NhbExpc3RWYWx1ZU1vZGVsPExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gdWJlckxWTTsKLQlwcml2YXRlIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPiBjb21wb3NpdGVMVk07Ci0KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCXRoaXMubHZtMCA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5sdm0wLmFkZCgiYWFhIik7Ci0JCXRoaXMubHZtMC5hZGQoImJiYiIpOwotCQl0aGlzLmx2bTAuYWRkKCJjY2MiKTsKLQotCQl0aGlzLmx2bTEgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMubHZtMS5hZGQoImRkZCIpOwotCQl0aGlzLmx2bTEuYWRkKCJlZWUiKTsKLQotCQl0aGlzLmx2bTIgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMubHZtMi5hZGQoImZmZiIpOwotCi0JCXRoaXMubHZtMyA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5sdm0zLmFkZCgiZ2dnIik7Ci0JCXRoaXMubHZtMy5hZGQoImhoaCIpOwotCQl0aGlzLmx2bTMuYWRkKCJpaWkiKTsKLQkJdGhpcy5sdm0zLmFkZCgiampqIik7Ci0JCXRoaXMubHZtMy5hZGQoImtrayIpOwotCi0JCXRoaXMudWJlckxWTSA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJdGhpcy51YmVyTFZNLmFkZCh0aGlzLmx2bTApOwotCQl0aGlzLnViZXJMVk0uYWRkKHRoaXMubHZtMSk7Ci0JCXRoaXMudWJlckxWTS5hZGQodGhpcy5sdm0yKTsKLQkJdGhpcy51YmVyTFZNLmFkZCh0aGlzLmx2bTMpOwotCi0JCXRoaXMuY29tcG9zaXRlTFZNID0gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPigoTGlzdFZhbHVlTW9kZWw8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PikgdGhpcy51YmVyTFZNKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEludCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYWEiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIGNvb3JkTGlzdC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImJiYiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgxKSk7Ci0JCWFzc2VydEVxdWFscygiYmJiIiwgY29vcmRMaXN0LmdldCgxKSk7Ci0JCWFzc2VydEVxdWFscygiY2NjIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjY2MiLCBjb29yZExpc3QuZ2V0KDIpKTsKLQotCQlhc3NlcnRFcXVhbHMoImRkZCIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZGRkIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZWVlIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlZWUiLCBjb29yZExpc3QuZ2V0KDQpKTsKLQotCQlhc3NlcnRFcXVhbHMoImZmZiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYWEiLCB0aGlzLmNvbXBvc2l0ZUxWTS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWFhIiwgY29vcmRMaXN0Lml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0xID0gY29vcmRMaXN0Lml0ZXJhdG9yKCk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gdGhpcy5jb21wb3NpdGVMVk0uaXRlcmF0b3IoKTsgc3RyZWFtMi5oYXNOZXh0KCk7ICkgewotCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbTEubmV4dCgpLCBzdHJlYW0yLm5leHQoKSk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2Uoc3RyZWFtMS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCQlhc3NlcnRFcXVhbHMoMTEsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgY29vcmRMaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXkoKSB7Ci0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbXBvc2l0ZUxWTS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5sdm0wLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLmNvbXBvc2l0ZUxWTS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGNvb3JkTGlzdCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29tcG9zaXRlTFZNLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5sdm0wLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGNvb3JkTGlzdCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb21wb3NpdGVMVk0uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMubHZtMC5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNvdXJjZV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm0uYWRkKCJ4eHgiKTsKLQkJbHZtLmFkZCgieXl5Iik7Ci0JCWx2bS5hZGQoInp6eiIpOwotCQl0aGlzLnViZXJMVk0uYWRkKDAsIGx2bSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAieHh4IiwgInl5eSIsICJ6enoiLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNvdXJjZV9NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bSA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtLmFkZCgieHh4Iik7Ci0JCWx2bS5hZGQoInl5eSIpOwotCQlsdm0uYWRkKCJ6enoiKTsKLQkJdGhpcy51YmVyTFZNLmFkZCgyLCBsdm0pOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAieHh4IiwgInl5eSIsICJ6enoiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoOSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoOSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTb3VyY2VfRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0gPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bS5hZGQoInh4eCIpOwotCQlsdm0uYWRkKCJ5eXkiKTsKLQkJbHZtLmFkZCgienp6Iik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgInh4eCIsICJ5eXkiLCAienp6IiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU291cmNlcygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtQSA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtQS5hZGQoInh4eCIpOwotCQlsdm1BLmFkZCgieXl5Iik7Ci0JCWx2bUEuYWRkKCJ6enoiKTsKLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bUIgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bUIuYWRkKCJwcHAiKTsKLQkJbHZtQi5hZGQoInFxcSIpOwotCQlsdm1CLmFkZCgicnJyIik7Ci0JCUNvbGxlY3Rpb248TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBjID0gbmV3IEFycmF5TGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCWMuYWRkKGx2bUEpOwotCQljLmFkZChsdm1CKTsKLQkJdGhpcy51YmVyTFZNLmFkZEFsbCgyLCBjKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgInh4eCIsICJ5eXkiLCAienp6IiwgInBwcCIsICJxcXEiLCAicnJyIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDEyKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgxMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTb3VyY2VfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLnJlbW92ZSgwKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU291cmNlX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ucmVtb3ZlKDIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNvdXJjZV9FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLnJlbW92ZSgzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNvdXJjZXMoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLnJlbW92ZSgyLCAyKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZWVlIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlZWUiLCBjb29yZExpc3QuZ2V0KDQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVNvdXJjZXMoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bUEgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bUEuYWRkKCJ4eHgiKTsKLQkJbHZtQS5hZGQoInl5eSIpOwotCQlsdm1BLmFkZCgienp6Iik7Ci0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm1CID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm1CLmFkZCgicHBwIik7Ci0JCWx2bUIuYWRkKCJxcXEiKTsKLQkJbHZtQi5hZGQoInJyciIpOwotCQlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQlsaXN0LmFkZChsdm1BKTsKLQkJbGlzdC5hZGQobHZtQik7Ci0JCXRoaXMudWJlckxWTS5zZXQoMiwgbGlzdCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJ4eHgiLCAieXl5IiwgInp6eiIsICJwcHAiLCAicXFxIiwgInJyciIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoInFxcSIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygicXFxIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTb3VyY2VzX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5tb3ZlKDAsIDIsIDIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoMSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU291cmNlc19NaWRkbGUoKSB7Ci0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm00ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm00LmFkZCgibGxsIik7Ci0JCWx2bTQuYWRkKCJtbW0iKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm00KTsKLQotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNSA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNS5hZGQoIm5ubiIpOwotCQlsdm01LmFkZCgib29vIik7Ci0JCWx2bTUuYWRkKCJwcHAiKTsKLQkJbHZtNS5hZGQoInFxcSIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bTUpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLm1vdmUoMSwgMywgMik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJsbGwiLCAibW1tIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgIm5ubiIsICJvb28iLCAicHBwIiwgInFxcSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTb3VyY2VzX0VuZCgpIHsKLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTQgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTQuYWRkKCJsbGwiKTsKLQkJbHZtNC5hZGQoIm1tbSIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bTQpOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm01ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm01LmFkZCgibm5uIik7Ci0JCWx2bTUuYWRkKCJvb28iKTsKLQkJbHZtNS5hZGQoInBwcCIpOwotCQlsdm01LmFkZCgicXFxIik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtNSk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ubW92ZSgzLCAwLCAzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgImxsbCIsICJtbW0iLCAibm5uIiwgIm9vbyIsICJwcHAiLCAicXFxIiwgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNvdXJjZSgpIHsKLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTQgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTQuYWRkKCJsbGwiKTsKLQkJbHZtNC5hZGQoIm1tbSIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bTQpOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm01ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm01LmFkZCgibm5uIik7Ci0JCWx2bTUuYWRkKCJvb28iKTsKLQkJbHZtNS5hZGQoInBwcCIpOwotCQlsdm01LmFkZCgicXFxIik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtNSk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ubW92ZSgzLCAxKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJkZGQiLCAiZWVlIiwgImxsbCIsICJtbW0iLCAibm5uIiwgIm9vbyIsICJwcHAiLCAicXFxIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygib29vIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDE0KSk7Ci0JCWFzc2VydEVxdWFscygib29vIiwgY29vcmRMaXN0LmdldCgxNCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhclNvdXJjZXMoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLmNsZWFyKCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0WzBdOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVNvdXJjZXMxKCkgewotCQlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNCA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNC5hZGQoImxsbCIpOwotCQlsdm00LmFkZCgibW1tIik7Ci0JCW5ld0xpc3QuYWRkKGx2bTQpOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm01ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm01LmFkZCgibm5uIik7Ci0JCWx2bTUuYWRkKCJvb28iKTsKLQkJbHZtNS5hZGQoInBwcCIpOwotCQlsdm01LmFkZCgicXFxIik7Ci0JCW5ld0xpc3QuYWRkKGx2bTUpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLnNldExpc3RWYWx1ZXMobmV3TGlzdCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAibGxsIiwgIm1tbSIsICJubm4iLCAib29vIiwgInBwcCIsICJxcXEiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvb28iLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoIm9vbyIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VTb3VyY2VzMigpIHsKLQkJTGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTQgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTQuYWRkKCJsbGwiKTsKLQkJbHZtNC5hZGQoIm1tbSIpOwotCQluZXdMaXN0LmFkZChsdm00KTsKLQotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNSA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNS5hZGQoIm5ubiIpOwotCQlsdm01LmFkZCgib29vIik7Ci0JCWx2bTUuYWRkKCJwcHAiKTsKLQkJbHZtNS5hZGQoInFxcSIpOwotCQluZXdMaXN0LmFkZChsdm01KTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5jaGFuZ2VMaXN0VmFsdWVzKG5ld0xpc3QpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImxsbCIsICJtbW0iLCAibm5uIiwgIm9vbyIsICJwcHAiLCAicXFxIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygib29vIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvb28iLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlU291cmNlczMoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCk7Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCi0JCUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCW5ld0xpc3QuYWRkKHRoaXMubHZtMCk7Ci0JCW5ld0xpc3QuYWRkKHRoaXMubHZtMSk7Ci0JCW5ld0xpc3QuYWRkKHRoaXMubHZtMik7Ci0JCW5ld0xpc3QuYWRkKHRoaXMubHZtMyk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0uY2hhbmdlTGlzdFZhbHVlcyhuZXdMaXN0KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZGRkIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlU291cmNlczQoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCX07Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCi0JCUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCW5ld0xpc3QuYWRkKHRoaXMubHZtMCk7Ci0JCW5ld0xpc3QuYWRkKHRoaXMubHZtMSk7Ci0JCW5ld0xpc3QuYWRkKHRoaXMubHZtMik7Ci0JCW5ld0xpc3QuYWRkKHRoaXMubHZtMyk7Ci0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm00ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm00LmFkZCgibGxsIik7Ci0JCWx2bTQuYWRkKCJtbW0iKTsKLQkJbmV3TGlzdC5hZGQobHZtNCk7Ci0KLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5jaGFuZ2VMaXN0VmFsdWVzKG5ld0xpc3QpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAibGxsIiwgIm1tbSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImRkZCIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZGRkIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVNvdXJjZXM1KCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCX07Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCi0JCUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCW5ld0xpc3QuYWRkKHRoaXMubHZtMCk7Ci0JCW5ld0xpc3QuYWRkKHRoaXMubHZtMSk7Ci0JCW5ld0xpc3QuYWRkKHRoaXMubHZtMik7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0uY2hhbmdlTGlzdFZhbHVlcyhuZXdMaXN0KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImRkZCIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZGRkIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVNvdXJjZXM2KCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsgLyogT0sgKi8gfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0KLQkJTGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0wKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0xKTsKLQotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNCA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNC5hZGQoImxsbCIpOwotCQlsdm00LmFkZCgibW1tIik7Ci0JCW5ld0xpc3QuYWRkKGx2bTQpOwotCi0JCW5ld0xpc3QuYWRkKHRoaXMubHZtMyk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0uY2hhbmdlTGlzdFZhbHVlcyhuZXdMaXN0KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImxsbCIsICJtbW0iLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImRkZCIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZGRkIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1fQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLmFkZCgwLCAieHh4Iik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAieHh4IiwgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTIuYWRkKDEsICJ4eHgiKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJ4eHgiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1fRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5hZGQoNSwgInh4eCIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAieHh4IiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLmFkZEFsbCgwLCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgInh4eCIsICJ5eXkiLCAienp6IiwgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoOSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoOSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc19NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0yLmFkZEFsbCgxLCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgInh4eCIsICJ5eXkiLCAienp6IiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoOSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoOSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc19FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLmFkZEFsbCg1LCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAieHh4IiwgInl5eSIsICJ6enoiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5yZW1vdmUoMCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbV9NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0yLnJlbW92ZSgwKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMucmVtb3ZlKDQpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5yZW1vdmUoMCwgMyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMucmVtb3ZlKDEsIDMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJra2siLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNykpOwotCQlhc3NlcnRFcXVhbHMoImtrayIsIGNvb3JkTGlzdC5nZXQoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtc19FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLnJlbW92ZSgzLCAyKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJdGVtX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5zZXQoMCwgInh4eCIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgInh4eCIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbV9NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0yLnNldCgwLCAieHh4Iik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJ4eHgiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJdGVtX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuc2V0KDQsICJ4eHgiKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAieHh4IiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1zX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5zZXQoMCwgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIsICJ6enoiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1zX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuc2V0KDEsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgInh4eCIsICJ5eXkiLCAienp6IiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImtrayIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgxMCkpOwotCQlhc3NlcnRFcXVhbHMoImtrayIsIGNvb3JkTGlzdC5nZXQoMTApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuc2V0KDMsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJ4eHgiLCAieXl5IiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1fQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLm1vdmUoMiwgMCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYmJiIiwgImNjYyIsICJhYWEiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTEubW92ZSgwLCAxKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJlZWUiLCAiZGRkIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1fRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5tb3ZlKDAsIDQpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImtrayIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLm1vdmUoMSwgMCwgMik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiY2NjIiwgImFhYSIsICJiYmIiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtc19NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0xLmFkZCgiZWVlLjEiKTsKLQkJdGhpcy5sdm0xLmFkZCgiZWVlLjIiKTsKLQkJdGhpcy5sdm0xLmFkZCgiZWVlLjMiKTsKLQkJdGhpcy5sdm0xLm1vdmUoMSwgMiwgMyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZS4xIiwgImVlZS4yIiwgImVlZS4zIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtc19FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLm1vdmUoMCwgMiwgMyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiaWlpIiwgImpqaiIsICJra2siLCAiZ2dnIiwgImhoaCIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFySXRlbXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLmNsZWFyKCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFySXRlbXNfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMS5jbGVhcigpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJJdGVtc19FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLmNsZWFyKCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19CZWdpbjEoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnNldExpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIsICJ6enoiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfTWlkZGxlMSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTEuc2V0TGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgInh4eCIsICJ5eXkiLCAienp6IiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfRW5kMSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuc2V0TGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgInh4eCIsICJ5eXkiLCAienp6IiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfQmVnaW4yKCkgewotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBFcnJvckxpc3RlbmVyKCkpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5jaGFuZ2VMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImFhYSIsICJiYmIiLCAiY2NjIiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX01pZGRsZTIoKSB7Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IEVycm9yTGlzdGVuZXIoKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0xLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiZGRkIiwgImVlZSIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJoaGgiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNykpOwotCQlhc3NlcnRFcXVhbHMoImhoaCIsIGNvb3JkTGlzdC5nZXQoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19FbmQyKCkgewotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBFcnJvckxpc3RlbmVyKCkpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5jaGFuZ2VMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfQmVnaW4zKCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiYWFhIiwgImJiYiIsICJ4eHgiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgInh4eCIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfTWlkZGxlMygpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCX07Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMS5jaGFuZ2VMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImRkZCIsICJ4eHgiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAieHh4IiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiaGhoIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJoaGgiLCBjb29yZExpc3QuZ2V0KDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfRW5kMygpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCX07Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5jaGFuZ2VMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImdnZyIsICJoaGgiLCAiaWlpIiwgInh4eCIsICJra2siIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJ4eHgiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfQmVnaW40KCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsgLyogT0sgKi8gfQotCQl9OwotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuY2hhbmdlTGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJ4eHgiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJ4eHgiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX01pZGRsZTQoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCX07Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMS5jaGFuZ2VMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImRkZCIsICJlZWUiLCAieHh4IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJ4eHgiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19FbmQ0KCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsgLyogT0sgKi8gfQotCQl9OwotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuY2hhbmdlTGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgInh4eCIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAieHh4IiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfQmVnaW41KCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCX07Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5jaGFuZ2VMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImFhYSIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiaWlpIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpaWkiLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfTWlkZGxlNSgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsgLyogT0sgKi8gfQotCQl9OwotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTEuY2hhbmdlTGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJkZGQiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpaWkiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNykpOwotCQlhc3NlcnRFcXVhbHMoImlpaSIsIGNvb3JkTGlzdC5nZXQoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19FbmQ1KCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCX07Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5jaGFuZ2VMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImdnZyIsICJoaGgiLCAiaWlpIiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCWNsYXNzIEVycm9yTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJZmFpbCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJZmFpbCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJZmFpbCgpOwotCQl9Ci0JfQotCi0JY2xhc3MgTG9jYWxMaXN0VmFsdWVNb2RlbDxFPiBleHRlbmRzIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEU+IHsKLQkJTG9jYWxMaXN0VmFsdWVNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJdm9pZCBjaGFuZ2VMaXN0VmFsdWVzKEl0ZXJhYmxlPEU+IGxpc3RWYWx1ZXMpIHsKLQkJCWlmIChsaXN0VmFsdWVzID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMubGlzdC5jbGVhcigpOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmxpc3QsIGxpc3RWYWx1ZXMpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMubGlzdCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwODJlNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gcHZtMTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHB2bTI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBwdm0zOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gcHZtNDsKLQlwcml2YXRlIENvbGxlY3Rpb248V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4+IGNvbGxlY3Rpb247Ci0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPj4gY3ZtOwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGNvbXBvc2l0ZVBWTTsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCi0KLQlwdWJsaWMgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5wdm0xID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPihJbnRlZ2VyLnZhbHVlT2YoMSkpOwotCQl0aGlzLnB2bTIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KEludGVnZXIudmFsdWVPZigyKSk7Ci0JCXRoaXMucHZtMyA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oSW50ZWdlci52YWx1ZU9mKDMpKTsKLQkJdGhpcy5wdm00ID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPihJbnRlZ2VyLnZhbHVlT2YoNCkpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+PigpOwotCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHRoaXMucHZtMSk7Ci0JCXRoaXMuY29sbGVjdGlvbi5hZGQodGhpcy5wdm0yKTsKLQkJdGhpcy5jb2xsZWN0aW9uLmFkZCh0aGlzLnB2bTMpOwotCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHRoaXMucHZtNCk7Ci0JCXRoaXMuY3ZtID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+Pih0aGlzLmNvbGxlY3Rpb24pOwotCQkKLQkJdGhpcy5jb21wb3NpdGVQVk0gPSB0aGlzLmJ1aWxkQ29tcG9zaXRlUFZNKGN2bSk7Ci0JfQotCi0JcHJpdmF0ZSA8VCBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDw/Pj4gUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkQ29tcG9zaXRlUFZNKENvbGxlY3Rpb25WYWx1ZU1vZGVsPFQ+IHB2bXMpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4ocHZtcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlKCkgewotCQkJCWludCBzdW0gPSAwOwotCQkJCWZvciAoUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGVhY2ggOiB0aGlzLmdldENvbGxlY3Rpb25Nb2RlbCgpKSB7Ci0JCQkJCXN1bSArPSBlYWNoLmdldFZhbHVlKCkuaW50VmFsdWUoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZihzdW0pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4+IGdldENvbGxlY3Rpb25Nb2RlbCgpIHsKLQkJCQlyZXR1cm4gKENvbGxlY3Rpb25WYWx1ZU1vZGVsPFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPj4pIHN1cGVyLmdldENvbGxlY3Rpb25Nb2RlbCgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpLmludFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUFuZExpc3RlbmVyczEoKSB7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpLmludFZhbHVlKCkpOwotCQl0aGlzLmNvbXBvc2l0ZVBWTS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUFuZExpc3RlbmVyczIoKSB7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygxMCwgdGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKS5pbnRWYWx1ZSgpKTsKLQkJdGhpcy5jb21wb3NpdGVQVk0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wdm0xLnNldFZhbHVlKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoMTAsIDE0KTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wdm00LnNldFZhbHVlKEludGVnZXIudmFsdWVPZigwKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoMTQsIDEwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZTEoKSB7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UyKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvbkNoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHB2bSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oSW50ZWdlci52YWx1ZU9mKDc3KSk7Ci0JCXRoaXMuY3ZtLmFkZChwdm0pOwotCQl0aGlzLnZlcmlmeUV2ZW50KDEwLCA4Nyk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuY3ZtLnJlbW92ZShwdm0pOwotCQl0aGlzLnZlcmlmeUV2ZW50KDg3LCAxMCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuY3ZtLmNsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoMTAsIDApOwotCi0JCUNvbGxlY3Rpb248V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4+IGMyID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPj4oKTsKLQkJYzIuYWRkKHRoaXMucHZtMSk7Ci0JCWMyLmFkZCh0aGlzLnB2bTIpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jdm0uc2V0VmFsdWVzKGMyKTsKLQkJdGhpcy52ZXJpZnlFdmVudCgwLCAzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZzEoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5wdm0xLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuY29tcG9zaXRlUFZNLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wdm0xLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZzIoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmNvbXBvc2l0ZVBWTS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQkKLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmNvbXBvc2l0ZVBWTSwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKG9sZFZhbHVlKSwgdGhpcy5ldmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZihuZXdWYWx1ZSksIHRoaXMuZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkQmFnLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NWZhZDYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db29yZGluYXRlZEJhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IGtlZXBzIGFuIGludGVybmFsIGNvbGxlY3Rpb24gaW4gc3luY2ggd2l0aCB0aGUKLSAqIGNvbGxlY3Rpb24gaGVsZCBieSBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0gKi8KLWNsYXNzIENvb3JkaW5hdGVkQmFnPEU+IGltcGxlbWVudHMgQmFnPEU+LCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBCYWc8RT4gYmFnID0gbmV3IEhhc2hCYWc8RT4oKTsKLQotCUNvb3JkaW5hdGVkQmFnKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGN2bSkgewotCQljdm0uYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQlyZXR1cm4gdGhpcy5iYWcuYWRkKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5hZGRBbGwoYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmNvbnRhaW5zKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5iYWcuY29udGFpbnNBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5iYWcucmVtb3ZlKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnJlbW92ZUFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5yZXRhaW5BbGwoYyk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5iYWcuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5iYWcudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGEpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnRvQXJyYXkoYSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJhZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGNvdW50KE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5jb3VudChvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvLCBpbnQgY291bnQpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmFkZChvLCBjb3VudCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvLCBpbnQgY291bnQpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnJlbW92ZShvLCBjb3VudCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IHVuaXF1ZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHVuaXF1ZUNvdW50KCkgewotCQlyZXR1cm4gdGhpcy5iYWcudW5pcXVlQ291bnQoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8QmFnLkVudHJ5PEU+PiBlbnRyaWVzKCkgewotCQlyZXR1cm4gdGhpcy5iYWcuZW50cmllcygpOwotCX0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoRSBpdGVtIDogKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpKSB7Ci0JCQl0aGlzLmJhZy5hZGQoaXRlbSk7Ci0JCX0KLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoRSBpdGVtIDogKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpKSB7Ci0JCQl0aGlzLmJhZy5yZW1vdmUoaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmJhZy5jbGVhcigpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuYmFnLCAoKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+KSBldmVudC5nZXRTb3VyY2UoKSkuaXRlcmF0b3IoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5lcXVhbHMobyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkTGlzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db29yZGluYXRlZExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlYTI5OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3REYXRhRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdERhdGFMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IGtlZXBzIGFuIGludGVybmFsIGxpc3QgaW4gc3luY2ggd2l0aCB0aGUKLSAqIGxpc3QgaGVsZCBieSBhIGxpc3QgdmFsdWUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb29yZGluYXRlZExpc3Q8RT4gaW1wbGVtZW50cyBMaXN0PEU+LCBMaXN0Q2hhbmdlTGlzdGVuZXIsIExpc3REYXRhTGlzdGVuZXIgewotCXByaXZhdGUgTGlzdDxFPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxFPigpOwotCi0JcHVibGljIENvb3JkaW5hdGVkTGlzdChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0VmFsdWVNb2RlbCkgewotCQlsaXN0VmFsdWVNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMpOwotCQlmb3IgKEl0ZXJhdG9yPEU+IHN0cmVhbSA9IGxpc3RWYWx1ZU1vZGVsLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29vcmRpbmF0ZWRMaXN0KExpc3RNb2RlbCBsaXN0TW9kZWwpIHsKLQkJbGlzdE1vZGVsLmFkZExpc3REYXRhTGlzdGVuZXIodGhpcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdE1vZGVsLmdldFNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmFkZChpLCB0aGlzLmdldEVsZW1lbnRBdChsaXN0TW9kZWwsIGkpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQl0aGlzLmxpc3QuYWRkKGluZGV4LCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuYWRkKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuYWRkQWxsKGMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5hZGRBbGwoaW5kZXgsIGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQl0aGlzLmxpc3QuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmNvbnRhaW5zKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5saXN0LmNvbnRhaW5zQWxsKGMpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmluZGV4T2Yobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0Lmxhc3RJbmRleE9mKG8pOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lmxpc3RJdGVyYXRvcihpbmRleCk7Ci0JfQotCi0JcHVibGljIEUgcmVtb3ZlKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnJlbW92ZShpbmRleCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QucmVtb3ZlKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5yZW1vdmVBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5saXN0LnJldGFpbkFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgRSBzZXQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5zZXQoaW5kZXgsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5zaXplKCk7Ci0JfQotCi0JcHVibGljIExpc3Q8RT4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnN1Ykxpc3QoZnJvbUluZGV4LCB0b0luZGV4KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYSkgewotCQlyZXR1cm4gdGhpcy5saXN0LnRvQXJyYXkoYSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCWludCBpID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZSkpIHsKLQkJCXRoaXMubGlzdC5hZGQoaSsrLCBpdGVtKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQlpbnQgYmFzZSA9IGUuZ2V0SW5kZXgoKTsKLQkJZm9yIChpbnQgaSA9IGUuZ2V0SXRlbXNTaXplKCk7IGktLSA+IDA7ICkgewotCQkJdGhpcy5saXN0LnJlbW92ZShiYXNlICsgaSk7ICAvLyByZW1vdmUgZnJvbSBlbmQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCWludCBpID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0TmV3SXRlbXMoZSkpIHsKLQkJCXRoaXMubGlzdC5zZXQoaSsrLCBpdGVtKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMubGlzdCwgZS5nZXRUYXJnZXRJbmRleCgpLCBlLmdldFNvdXJjZUluZGV4KCksIGUuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5saXN0LCB0aGlzLmdldFNvdXJjZShlKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdERhdGFMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBjb250ZW50c0NoYW5nZWQoTGlzdERhdGFFdmVudCBlKSB7Ci0JCXRoaXMubGlzdC5jbGVhcigpOwotCQlMaXN0TW9kZWwgbG0gPSAoTGlzdE1vZGVsKSBlLmdldFNvdXJjZSgpOwotCQlpbnQgc2l6ZSA9IGxtLmdldFNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRoaXMubGlzdC5hZGQoaSwgdGhpcy5nZXRFbGVtZW50QXQobG0sIGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGludGVydmFsQWRkZWQoTGlzdERhdGFFdmVudCBlKSB7Ci0JCUxpc3RNb2RlbCBsbSA9IChMaXN0TW9kZWwpIGUuZ2V0U291cmNlKCk7Ci0JCWludCBzdGFydCA9IE1hdGgubWluKGUuZ2V0SW5kZXgwKCksIGUuZ2V0SW5kZXgxKCkpOwotCQlpbnQgZW5kID0gTWF0aC5tYXgoZS5nZXRJbmRleDAoKSwgZS5nZXRJbmRleDEoKSk7Ci0JCWZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykgewotCQkJdGhpcy5saXN0LmFkZChpLCB0aGlzLmdldEVsZW1lbnRBdChsbSwgaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW50ZXJ2YWxSZW1vdmVkKExpc3REYXRhRXZlbnQgZSkgewotCQlpbnQgc3RhcnQgPSBNYXRoLm1pbihlLmdldEluZGV4MCgpLCBlLmdldEluZGV4MSgpKTsKLQkJaW50IGVuZCA9IE1hdGgubWF4KGUuZ2V0SW5kZXgwKCksIGUuZ2V0SW5kZXgxKCkpOwotCQlpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQgKyAxOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW5ndGg7IGkrKykgewotCQkJdGhpcy5saXN0LnJlbW92ZShzdGFydCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5lcXVhbHMobyk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5oYXNoQ29kZSgpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIHN1cHByZXNzZWQgd2FybmluZ3MuPQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRSBnZXRFbGVtZW50QXQoTGlzdE1vZGVsIGxpc3RNb2RlbCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiAoRSkgbGlzdE1vZGVsLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBJdGVyYWJsZTxFPiBnZXROZXdJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogbWluaW1pemUgdGhlIHNjb3BlIG9mIHRoZSBzdXBwcmVzc2VkIHdhcm5pbmdzLj0KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEU+IGdldFNvdXJjZShMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChMaXN0VmFsdWVNb2RlbDxFPikgZXZlbnQuZ2V0U291cmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0V4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjY0NTAzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGV4dGVuZGVkTGlzdEhvbGRlcjsKLQlMaXN0RXZlbnQgZXZlbnQ7Ci0JU3RyaW5nIGV2ZW50VHlwZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gInJlbW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0UgPSAicmVwbGFjZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkUgPSAibW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSID0gImNsZWFyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFID0gImNoYW5nZSI7Ci0KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxpc3RIb2xkZXIgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkRXh0ZW5kZWRMaXN0SG9sZGVyKHRoaXMubGlzdEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoIkEiKTsKLQkJcmVzdWx0LmFkZCgiQiIpOwotCQlyZXN1bHQuYWRkKCJDIik7Ci0JCXJlc3VsdC5hZGQoIkQiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZEV4dGVuZGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGV4dGVuZGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlleHRlbmRlZExpc3QuYWRkQWxsKHRoaXMuYnVpbGRQcmVmaXgoKSk7Ci0JCWV4dGVuZGVkTGlzdC5hZGRBbGwodGhpcy5idWlsZExpc3QoKSk7Ci0JCWV4dGVuZGVkTGlzdC5hZGRBbGwodGhpcy5idWlsZFN1ZmZpeCgpKTsKLQkJcmV0dXJuIGV4dGVuZGVkTGlzdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFByZWZpeCgpIHsKLQkJTGlzdDxTdHJpbmc+IHByZWZpeCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlwcmVmaXguYWRkKCJ4Iik7Ci0JCXByZWZpeC5hZGQoInkiKTsKLQkJcHJlZml4LmFkZCgieiIpOwotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3VmZml4KCkgewotCQlMaXN0PFN0cmluZz4gc3VmZml4ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN1ZmZpeC5hZGQoImkiKTsKLQkJc3VmZml4LmFkZCgiaiIpOwotCQlyZXR1cm4gc3VmZml4OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEV4dGVuZGVkTGlzdEhvbGRlcihMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bSkgewotCQlyZXR1cm4gbmV3IEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByZWZpeCgpLCBsdm0sIHRoaXMuYnVpbGRTdWZmaXgoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkRXh0ZW5kZWRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkRXh0ZW5kZWRMaXN0KCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkRXh0ZW5kZWRMaXN0KCkuc2l6ZSgpLCB0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5zaXplKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBleHRlbmRlZExpc3RDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBleHRlbmRlZExpc3RDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5pdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuZGVkTGlzdENvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlMaXN0PFN0cmluZz4gZXh0ZW5kZWRMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5leHRlbmRlZExpc3RIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBpdGVtcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmIChleHRlbmRlZExpc3QuY29udGFpbnMoc3RyZWFtLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpLCBpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGlzdENvbnRhaW5zQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0vLwlwcml2YXRlIGJvb2xlYW4gbGlzdENvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotLy8JCUxpc3Q8U3RyaW5nPiBleHRlbmRlZExpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKSk7Ci0vLwkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotLy8JCQlpZiAoZXh0ZW5kZWRMaXN0LmNvbnRhaW5zKHN0cmVhbS5uZXh0KCkpKSB7Ci0vLwkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gZmFsc2U7Ci0vLwl9Ci0vLwotCXB1YmxpYyB2b2lkIHRlc3RBZGQxKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKCJFIikpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDQsICJFIik7Ci0JCWFzc2VydFRydWUodGhpcy5leHRlbmRlZExpc3RDb250YWlucygiRSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiRSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkMigpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5leHRlbmRlZExpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoNCwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5leHRlbmRlZExpc3RDb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQWRkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGFkZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYWRkTGlzdC5hZGQoIkUiKTsKLQkJYWRkTGlzdC5hZGQoIkYiKTsKLQkJcmV0dXJuIGFkZExpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbDEoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnNBbnkodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDQsIHRoaXMuYnVpbGRBZGRMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnNBbGwodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zQWxsKHRoaXMuYnVpbGRBZGRMaXN0KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlMSgpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKCJCIikpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKHRoaXMuYnVpbGRMaXN0KCkuaW5kZXhPZigiQiIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5leHRlbmRlZExpc3RDb250YWlucygiQiIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoIkIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VHZW5lcmljKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlTmFtZWQoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdENoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCg0LCAiRSIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgNywgIkUiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDUsIG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgOCwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSg1KTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDgsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVNT1ZFLCA3LCAiRSIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoMCwgdGhpcy5idWlsZExpc3QoKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQUREKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KCgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpKSk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnNldCgwLCAiQUEiKTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRVBMQUNFKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKCgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudCkuZ2V0TmV3SXRlbXMoKSwgIkEiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKCgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudCkuZ2V0TmV3SXRlbXMoKSwgIkFBIikpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IEFERDsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVNT1ZFOwotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFUExBQ0U7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gTU9WRTsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENMRUFSOwotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENIQU5HRTsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChTdHJpbmcgdHlwZSkgewotCQlhc3NlcnRFcXVhbHModHlwZSwgdGhpcy5ldmVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5leHRlbmRlZExpc3RIb2xkZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFN0cmluZyB0eXBlLCBpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodHlwZSk7Ci0JCWlmICh0eXBlID09IEFERCkgewotCQkJYXNzZXJ0RXF1YWxzKGluZGV4LCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaXRlbSwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9IGVsc2UgaWYgKHR5cGUgPT0gUkVNT1ZFKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQkvKgotCQkgKiBhZGRpbmcgbGlzdGVuZXJzIHRvIHRoZSBleHRlbmRlZCBsaXN0IHdpbGwgY2F1c2UgbGlzdGVuZXJzCi0JCSAqIHRvIGJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3Q7Ci0JCSAqIGxpa2V3aXNlLCByZW1vdmluZyBsaXN0ZW5lcnMgZnJvbSB0aGUgZXh0ZW5kZWQgbGlzdCB3aWxsCi0JCSAqIGNhdXNlIGxpc3RlbmVycyB0byBiZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgbGlzdAotCQkgKi8KLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCi0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwMzAxMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyOwotCUNvbGxlY3Rpb25BZGRFdmVudCBhZGRFdmVudDsKLQlDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgcmVtb3ZlRXZlbnQ7Ci0JQ29sbGVjdGlvbkNsZWFyRXZlbnQgY29sbGVjdGlvbkNsZWFyZWRFdmVudDsKLQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgY29sbGVjdGlvbkNoYW5nZWRFdmVudDsKLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBmaWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXI7Ci0JQ29sbGVjdGlvbkFkZEV2ZW50IGZpbHRlcmVkQWRkRXZlbnQ7Ci0JQ29sbGVjdGlvblJlbW92ZUV2ZW50IGZpbHRlcmVkUmVtb3ZlRXZlbnQ7Ci0JQ29sbGVjdGlvbkNsZWFyRXZlbnQgZmlsdGVyZWRDb2xsZWN0aW9uQ2xlYXJlZEV2ZW50OwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBmaWx0ZXJlZENvbGxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci0KLQlwdWJsaWMgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPihidWlsZENvbGxlY3Rpb24oKSk7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyID0gbmV3IEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0aGlzLmJ1aWxkRmlsdGVyKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJY29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQlyZXR1cm4gY29sbGVjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aCgiYiIpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlclZhbHVlID0gdGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sbGVjdGlvbkhvbGRlclZhbHVlLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29sbGVjdGlvbkhvbGRlclZhbHVlLm5leHQoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQkvLyBhZGQgYSBsaXN0ZW5lciB0byAiYWN0aXZhdGUiIHRoZSB3cmFwcGVyCi0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBuZXdDb2xsZWN0aW9uID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJmb3giKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImJheiIpOwotCQkKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhuZXdDb2xsZWN0aW9uKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGNvbGxlY3Rpb25WYWx1ZXMgPSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb3giLCBjb2xsZWN0aW9uVmFsdWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgY29sbGVjdGlvblZhbHVlcy5uZXh0KCkpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGZpbHRlcmVkQ29sbGVjdGlvblZhbHVlcyA9IHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgZmlsdGVyZWRDb2xsZWN0aW9uVmFsdWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGZpbHRlcmVkQ29sbGVjdGlvblZhbHVlcy5oYXNOZXh0KCkpOwotCX0JCQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkRmlsdGVyZWRDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UxKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkRmlsdGVyZWRDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlMigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJFdmVudHMoKSB7Ci0JCXRoaXMuYWRkRXZlbnQgPSBudWxsOwotCQl0aGlzLnJlbW92ZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEFkZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZFJlbW92ZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VzKCkgewotCQljbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHRlbXBDb2xsZWN0aW9uID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXRlbXBDb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5hZGRFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZEFkZEV2ZW50LCB0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlciwgdGVtcENvbGxlY3Rpb24pOwotCQkKLQkJY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCXRlbXBDb2xsZWN0aW9uLnJlbW92ZSgiYmFyIik7Ci0JCXRlbXBDb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5yZW1vdmVFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZFJlbW92ZUV2ZW50KTsKLQotCi0JCWNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImJhciIpOwotCQl0ZW1wQ29sbGVjdGlvbi5hZGQoImJhciIpOwotCQl0ZW1wQ29sbGVjdGlvbi5yZW1vdmUoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMucmVtb3ZlRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgdGVtcENvbGxlY3Rpb24pOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZmlsdGVyZWRSZW1vdmVFdmVudCwgdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIsIHRlbXBDb2xsZWN0aW9uKTsKLQotCi0JCWNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0ZW1wQ29sbGVjdGlvbi5yZW1vdmUoImJhciIpOwotCQl0ZW1wQ29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYWRkRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgdGVtcENvbGxlY3Rpb24pOwotCQlhc3NlcnROdWxsKHRoaXMuZmlsdGVyZWRBZGRFdmVudCk7Ci0KLQotCQljbGVhckV2ZW50cygpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmV3Q29sbGVjdGlvbiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiZm94Iik7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJiYXoiKTsKLQkJCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXMobmV3Q29sbGVjdGlvbik7Ci0KLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlcik7Ci0JCQotCQl0ZW1wQ29sbGVjdGlvbi5yZW1vdmUoImZvbyIpOwotCQl0ZW1wQ29sbGVjdGlvbi5hZGQoImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50LCB0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlcik7Ci0JCQotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5hZGRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMucmVtb3ZlRXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmFkZEV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnJlbW92ZUV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZmlsdGVyZWRBZGRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZmlsdGVyZWRSZW1vdmVFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZENvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRGaWx0ZXJlZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZmlsdGVyZWRBZGRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZFJlbW92ZUV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZENvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZENvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlLCBPYmplY3QgaXRlbXMpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW1zLCBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKGV2ZW50LmdldEl0ZW1zKCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlLCBPYmplY3QgaXRlbXMpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW1zLCBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKGV2ZW50LmdldEl0ZW1zKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlsdGVyZWRJdGVtKCkgewotCQkvLyBidWlsZCBjb2xsZWN0aW9uIHdpdGggVGVzdEl0ZW1zCi0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRlc3RJdGVtPiB0aUhvbGRlciA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxUZXN0SXRlbT4odGhpcy5idWlsZENvbGxlY3Rpb24yKCkpOwotCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxUZXN0SXRlbT4gZmlsdGVyZWRUSUhvbGRlciA9IG5ldyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbDxUZXN0SXRlbT4odGlIb2xkZXIsIHRoaXMuYnVpbGRGaWx0ZXIyKCkpOwotCQkvLyBhZGQgYSBsaXN0ZW5lciB0byAiYWN0aXZhdGUiIHRoZSB3cmFwcGVyCi0JCWZpbHRlcmVkVElIb2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIGZpbHRlcmVkVElIb2xkZXIuc2l6ZSgpKTsKLQotCQl0aUhvbGRlci5hZGQobmV3IFRlc3RJdGVtKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmaWx0ZXJlZFRJSG9sZGVyLnNpemUoKSk7Ci0KLQkJVGVzdEl0ZW0gYmF6ID0gbmV3IFRlc3RJdGVtKCJiYXoiKTsKLQkJdGlIb2xkZXIuYWRkKGJheik7Ci0JCWFzc2VydEVxdWFscygyLCBmaWx0ZXJlZFRJSG9sZGVyLnNpemUoKSk7Ci0JCS8vIGJlZm9yZSByZW1vdmluZyBpdCwgY2hhbmdlIHRoZSBpdGVtIHNvIHRoYXQgaXQgaXMgZmlsdGVyZWQKLQkJYmF6Lm5hbWUgPSAiamF6IjsKLQkJdGlIb2xkZXIucmVtb3ZlKGJheik7Ci0JCS8vIHRoaXMgd291bGQgZmFpbCBiZWNhdXNlIHRoZSBpdGVtIHdhcyBub3QgcmVtb3ZlZCBmcm9tCi0JCS8vIHRoZSBmaWx0ZXJlZCBjb2xsZWN0aW9uIGNhY2hlLi4uIGJ1dCB3ZSd2ZSBmaXhlZCBpdCBub3cKLQkJYXNzZXJ0RXF1YWxzKDEsIGZpbHRlcmVkVElIb2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248VGVzdEl0ZW0+IGJ1aWxkQ29sbGVjdGlvbjIoKSB7Ci0JCUNvbGxlY3Rpb248VGVzdEl0ZW0+IGNvbGxlY3Rpb24gPSBuZXcgVmVjdG9yPFRlc3RJdGVtPigpOwotCQljb2xsZWN0aW9uLmFkZChuZXcgVGVzdEl0ZW0oImZvbyIpKTsKLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSBGaWx0ZXI8VGVzdEl0ZW0+IGJ1aWxkRmlsdGVyMigpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXI8VGVzdEl0ZW0+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFRlc3RJdGVtIHRpKSB7Ci0JCQkJcmV0dXJuIHRpLm5hbWUuc3RhcnRzV2l0aCgiYiIpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUZXN0SXRlbSBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RJdGVtIHsKLQkJU3RyaW5nIG5hbWU7Ci0JCVRlc3RJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjc2ZGRhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmlkaUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG9iamVjdEhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGZpbHRlcmVkT2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZmlsdGVyZWRFdmVudDsKLQotCXB1YmxpYyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigiZm9vIik7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIgPSBuZXcgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLm9iamVjdEhvbGRlciwgdGhpcy5idWlsZEZpbHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIEJpZGlGaWx0ZXI8U3RyaW5nPiBidWlsZEZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBCaWRpRmlsdGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gKHMgIT0gbnVsbCkgJiYgcy5zdGFydHNXaXRoKCJiIik7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiByZXZlcnNlQWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIChzICE9IG51bGwpICYmIHMuc3RhcnRzV2l0aCgiYiIpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJmb28iLCAiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZEV2ZW50LCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLCBudWxsLCAiYmFyIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImJhciIsICJiYXoiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkRXZlbnQsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIsICJiYXIiLCAiYmF6Iik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImJheiIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkRXZlbnQsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIsICJiYXoiLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImZvcCIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiZm9vIiwgImZvcCIpOwotCQlhc3NlcnROdWxsKHRoaXMuZmlsdGVyZWRFdmVudCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiZm9wIiwgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZEV2ZW50KTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBudWxsLCAiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZEV2ZW50LCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLCBudWxsLCAiYmFyIik7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlLCBPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM1ZDNjMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGZvbzsKLQlwcml2YXRlIEp1bmsgYmFyOwotCXByaXZhdGUgSnVuayBiYXo7Ci0JcHJpdmF0ZSBKdW5rIGpvbzsKLQlwcml2YXRlIEp1bmsgamFyOwotCXByaXZhdGUgSnVuayBqYXo7Ci0KLQlwcml2YXRlIEp1bmsgdG9tOwotCXByaXZhdGUgSnVuayBkaWNrOwotCXByaXZhdGUgSnVuayBoYXJyeTsKLQotCXB1YmxpYyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZm9vID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmJhciA9IG5ldyBKdW5rKCJiYXIiKTsKLQkJdGhpcy5iYXogPSBuZXcgSnVuaygiYmF6Iik7Ci0JCXRoaXMuam9vID0gbmV3IEp1bmsoImpvbyIpOwotCQl0aGlzLmphciA9IG5ldyBKdW5rKCJqYXIiKTsKLQkJdGhpcy5qYXogPSBuZXcgSnVuaygiamF6Iik7Ci0KLQkJdGhpcy50b20gPSBuZXcgSnVuaygidG9tIik7Ci0JCXRoaXMuZGljayA9IG5ldyBKdW5rKCJkaWNrIik7Ci0JCXRoaXMuaGFycnkgPSBuZXcgSnVuaygiaGFycnkiKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25TeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihjb2xsZWN0aW9uSG9sZGVyLCBKdW5rLlNUVUZGX0NPTExFQ1RJT04pOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMudG9tKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5kaWNrKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0NPTExFQ1RJT04pOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWxpc3RIb2xkZXIuYWRkKDYsIHRoaXMudG9tKTsKLQkJbGlzdEhvbGRlci5hZGQoNywgdGhpcy5kaWNrKTsKLQkJbGlzdEhvbGRlci5hZGQoOCwgdGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWxpc3RIb2xkZXIucmVtb3ZlKDgpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wYXJlKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsLCBMaXN0PEp1bms+IGxpc3QpIHsKLQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLnNpemUoKSwgbGlzdC5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RWYWx1ZU1vZGVsLnNpemUoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuZ2V0KGkpLCBsaXN0LmdldChpKSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTik7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmphei5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJbGlzdFZhbHVlTW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihuZXcgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIGxpc3RWYWx1ZU1vZGVsLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgc3luY2hMaXN0LmdldCgwKSk7Ci0JCXRoaXMuYmFyLnJlbW92ZVN0dWZmKCJiYXIiKTsKLQkJdGhpcy5iYXIuYWRkU3R1ZmYoInp6eiIpOwotCQl0aGlzLmJhci5hZGRTdHVmZigiYmFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDUpKTsKLQkJdGhpcy5iYXIucmVtb3ZlU3R1ZmYoInp6eiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxKdW5rPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUJhZzxKdW5rPiBiYWcgPSBuZXcgSGFzaEJhZzxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihiYWcpOwotCQlyZXR1cm4gYmFnOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxKdW5rPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8SnVuaz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24obGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxKdW5rPiBjKSB7Ci0JCWMuYWRkKHRoaXMuZm9vKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJheik7Ci0JCWMuYWRkKHRoaXMuam9vKTsKLQkJYy5hZGQodGhpcy5qYXIpOwotCQljLmFkZCh0aGlzLmpheik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEp1bmsgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlLCBDb21wYXJhYmxlPEp1bms+IHsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3R1ZmY7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFVGRl9DT0xMRUNUSU9OID0gInN0dWZmIjsKLQkJCQotCQotCQlwdWJsaWMgSnVuayhTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLnN0dWZmID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQl0aGlzLnN0dWZmLmFkZChzdHVmZkl0ZW0pOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIGFkZFN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihzdHVmZkl0ZW0sIHRoaXMuc3R1ZmYsIFNUVUZGX0NPTExFQ1RJT04pOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihzdHVmZkl0ZW0sIHRoaXMuc3R1ZmYsIFNUVUZGX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0b1N0cmluZygpOwotCQl9Ci0JCi0JCXB1YmxpYyBJY29uIGljb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKEp1bmsgbykgewotCQkJcmV0dXJuIHRoaXMuZGlzcGxheVN0cmluZygpLmNvbXBhcmVUbyhvLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5zdHVmZiArICIpIjsKLQkJfQotCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhYTdmOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGZvbzsKLQlwcml2YXRlIEp1bmsgYmFyOwotCXByaXZhdGUgSnVuayBiYXo7Ci0JcHJpdmF0ZSBKdW5rIGpvbzsKLQlwcml2YXRlIEp1bmsgamFyOwotCXByaXZhdGUgSnVuayBqYXo7Ci0KLQlwcml2YXRlIEp1bmsgdG9tOwotCXByaXZhdGUgSnVuayBkaWNrOwotCXByaXZhdGUgSnVuayBoYXJyeTsKLQotCXB1YmxpYyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZm9vID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmJhciA9IG5ldyBKdW5rKCJiYXIiKTsKLQkJdGhpcy5iYXogPSBuZXcgSnVuaygiYmF6Iik7Ci0JCXRoaXMuam9vID0gbmV3IEp1bmsoImpvbyIpOwotCQl0aGlzLmphciA9IG5ldyBKdW5rKCJqYXIiKTsKLQkJdGhpcy5qYXogPSBuZXcgSnVuaygiamF6Iik7Ci0KLQkJdGhpcy50b20gPSBuZXcgSnVuaygidG9tIik7Ci0JCXRoaXMuZGljayA9IG5ldyBKdW5rKCJkaWNrIik7Ci0JCXRoaXMuaGFycnkgPSBuZXcgSnVuaygiaGFycnkiKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25TeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihjb2xsZWN0aW9uSG9sZGVyLCBKdW5rLlNUVUZGX0xJU1QpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMudG9tKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5kaWNrKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0xJU1QpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWxpc3RIb2xkZXIuYWRkKDYsIHRoaXMudG9tKTsKLQkJbGlzdEhvbGRlci5hZGQoNywgdGhpcy5kaWNrKTsKLQkJbGlzdEhvbGRlci5hZGQoOCwgdGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWxpc3RIb2xkZXIucmVtb3ZlKDgpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wYXJlKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsLCBMaXN0PEp1bms+IGxpc3QpIHsKLQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLnNpemUoKSwgbGlzdC5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RWYWx1ZU1vZGVsLnNpemUoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuZ2V0KGkpLCBsaXN0LmdldChpKSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfTElTVCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmphei5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJbGlzdFZhbHVlTW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfTElTVCk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihuZXcgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9MSVNUKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIGxpc3RWYWx1ZU1vZGVsLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgc3luY2hMaXN0LmdldCgwKSk7Ci0JCXRoaXMuYmFyLnJlbW92ZVN0dWZmKCJiYXIiKTsKLQkJdGhpcy5iYXIuYWRkU3R1ZmYoInp6eiIpOwotCQl0aGlzLmJhci5hZGRTdHVmZigiYmFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDUpKTsKLQkJdGhpcy5iYXIucmVtb3ZlU3R1ZmYoInp6eiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxKdW5rPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUJhZzxKdW5rPiBiYWcgPSBuZXcgSGFzaEJhZzxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihiYWcpOwotCQlyZXR1cm4gYmFnOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxKdW5rPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8SnVuaz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24obGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxKdW5rPiBjKSB7Ci0JCWMuYWRkKHRoaXMuZm9vKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJheik7Ci0JCWMuYWRkKHRoaXMuam9vKTsKLQkJYy5hZGQodGhpcy5qYXIpOwotCQljLmFkZCh0aGlzLmpheik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEp1bmsgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlLCBDb21wYXJhYmxlPEp1bms+IHsKLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3R1ZmY7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFVGRl9MSVNUID0gInN0dWZmIjsKLQkJCQotCQotCQlwdWJsaWMgSnVuayhTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLnN0dWZmID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQl0aGlzLnN0dWZmLmFkZChzdHVmZkl0ZW0pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZFN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuc3R1ZmYuYWRkKHN0dWZmSXRlbSk7Ci0JCQlmaXJlSXRlbUFkZGVkKFNUVUZGX0xJU1QsIHRoaXMuc3R1ZmYuaW5kZXhPZihzdHVmZkl0ZW0pLCBzdHVmZkl0ZW0pOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLnN0dWZmLmluZGV4T2Yoc3R1ZmZJdGVtKTsKLQkJCXRoaXMuc3R1ZmYucmVtb3ZlKHN0dWZmSXRlbSk7Ci0JCQlmaXJlSXRlbVJlbW92ZWQoU1RVRkZfTElTVCwgaW5kZXgsIHN0dWZmSXRlbSk7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRvU3RyaW5nKCk7Ci0JCX0KLQkKLQkJcHVibGljIEljb24gaWNvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGludCBjb21wYXJlVG8oSnVuayBvKSB7Ci0JCQlyZXR1cm4gdGhpcy5kaXNwbGF5U3RyaW5nKCkuY29tcGFyZVRvKG8uZGlzcGxheVN0cmluZygpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLnN0dWZmICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMGNlZDkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsgZm9vOwotCXByaXZhdGUgSnVuayBiYXI7Ci0JcHJpdmF0ZSBKdW5rIGJhejsKLQlwcml2YXRlIEp1bmsgam9vOwotCXByaXZhdGUgSnVuayBqYXI7Ci0JcHJpdmF0ZSBKdW5rIGphejsKLQotCXByaXZhdGUgSnVuayB0b207Ci0JcHJpdmF0ZSBKdW5rIGRpY2s7Ci0JcHJpdmF0ZSBKdW5rIGhhcnJ5OwotCi0JcHVibGljIEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZm9vID0gbmV3IEp1bmsoInRoaXMuZm9vIik7Ci0JCXRoaXMuYmFyID0gbmV3IEp1bmsoInRoaXMuYmFyIik7Ci0JCXRoaXMuYmF6ID0gbmV3IEp1bmsoInRoaXMuYmF6Iik7Ci0JCXRoaXMuam9vID0gbmV3IEp1bmsoInRoaXMuam9vIik7Ci0JCXRoaXMuamFyID0gbmV3IEp1bmsoInRoaXMuamFyIik7Ci0JCXRoaXMuamF6ID0gbmV3IEp1bmsoInRoaXMuamF6Iik7Ci0KLQkJdGhpcy50b20gPSBuZXcgSnVuaygidGhpcy50b20iKTsKLQkJdGhpcy5kaWNrID0gbmV3IEp1bmsoInRoaXMuZGljayIpOwotCQl0aGlzLmhhcnJ5ID0gbmV3IEp1bmsoInRoaXMuaGFycnkiKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25TeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlciwgRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMudG9tKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5kaWNrKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXModGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLmFkZCg2LCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDcsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDgsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQkvLyB0ZXN0IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGV4Y2VwdGlvbgotCQlsaXN0SG9sZGVyLnNldExpc3RWYWx1ZXModGhpcy5idWlsZExpc3QoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wYXJlKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsLCBMaXN0PEp1bms+IGxpc3QpIHsKLQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLnNpemUoKSwgbGlzdC5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RWYWx1ZU1vZGVsLnNpemUoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuZ2V0KGkpLCBsaXN0LmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvblNvcnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTb3J0KCkgewotCQl0aGlzLnZlcmlmeUxpc3RTb3J0KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21Db2xsZWN0aW9uU29ydCgpIHsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uU29ydCh0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tTGlzdFNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdFNvcnQodGhpcy5idWlsZEN1c3RvbUNvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPEp1bms+IGJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpIHsKLQkJLy8gc29ydCB3aXRoIHJldmVyc2Ugb3JkZXIKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPEp1bms+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKEp1bmsgbzEsIEp1bmsgbzIpIHsKLQkJCQlyZXR1cm4gbzIuZGlzcGxheVN0cmluZygpLmNvbXBhcmVUbyhvMS5kaXNwbGF5U3RyaW5nKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb2xsZWN0aW9uU29ydChDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIGNvbXBhcmF0b3IpLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMudG9tKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5kaWNrKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmZvbyk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuamFyKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyh0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0U29ydChDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KGxpc3RIb2xkZXIsIGNvbXBhcmF0b3IpLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWxpc3RIb2xkZXIuYWRkKDAsIHRoaXMudG9tKTsKLQkJbGlzdEhvbGRlci5hZGQoMCwgdGhpcy5kaWNrKTsKLQkJbGlzdEhvbGRlci5hZGQoMCwgdGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg1KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWxpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyh0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wYXJlU29ydChMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCwgTGlzdDxKdW5rPiBsaXN0LCBDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU29ydGVkU2V0PEp1bms+IHNzID0gbmV3IFRyZWVTZXQ8SnVuaz4oY29tcGFyYXRvcik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpOyBpKyspIHsKLQkJCXNzLmFkZChsaXN0VmFsdWVNb2RlbC5nZXQoaSkpOwotCQl9Ci0JCWFzc2VydEVxdWFscyhzcy5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvcjxKdW5rPiBzdHJlYW0xID0gc3MuaXRlcmF0b3IoKSwgc3RyZWFtMiA9IGxpc3QuaXRlcmF0b3IoKTsgc3RyZWFtMS5oYXNOZXh0KCk7ICkgewotCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbTEubmV4dCgpLCBzdHJlYW0yLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8SnVuaz4obGlzdEhvbGRlciksIERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlsaXN0VmFsdWVNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KGxpc3RIb2xkZXIpLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIGxpc3RWYWx1ZU1vZGVsLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgc3luY2hMaXN0LmdldCgwKSk7Ci0JCXRoaXMuYmFyLnNldE5hbWUoInp6eiIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIGxpc3RWYWx1ZU1vZGVsLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgc3luY2hMaXN0LmdldCg1KSk7Ci0JCXRoaXMuYmFyLnNldE5hbWUoInRoaXMuYmFyIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBidWlsZENvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEp1bms+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQmFnPEp1bms+IGJhZyA9IG5ldyBIYXNoQmFnPEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGJhZyk7Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PEp1bms+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxKdW5rPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPEp1bms+IGMpIHsKLQkJYy5hZGQodGhpcy5mb28pOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCWMuYWRkKHRoaXMuYmF6KTsKLQkJYy5hZGQodGhpcy5qb28pOwotCQljLmFkZCh0aGlzLmphcik7Ci0JCWMuYWRkKHRoaXMuamF6KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnVuayBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRGlzcGxheWFibGUsIENvbXBhcmFibGU8SnVuaz4gewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwdWJsaWMgSnVuayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyBJY29uIGljb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhKdW5rIG8pIHsKLQkJCXJldHVybiB0aGlzLmRpc3BsYXlTdHJpbmcoKS5jb21wYXJlVG8oby5kaXNwbGF5U3RyaW5nKCkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwMjQ5YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGZvbzsKLQlwcml2YXRlIEp1bmsgYmFyOwotCXByaXZhdGUgSnVuayBiYXo7Ci0JcHJpdmF0ZSBKdW5rIGpvbzsKLQlwcml2YXRlIEp1bmsgamFyOwotCXByaXZhdGUgSnVuayBqYXo7Ci0KLQlwcml2YXRlIEp1bmsgdG9tOwotCXByaXZhdGUgSnVuayBkaWNrOwotCXByaXZhdGUgSnVuayBoYXJyeTsKLQotCXB1YmxpYyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmZvbyA9IG5ldyBKdW5rKCJ0aGlzLmZvbyIpOwotCQl0aGlzLmJhciA9IG5ldyBKdW5rKCJ0aGlzLmJhciIpOwotCQl0aGlzLmJheiA9IG5ldyBKdW5rKCJ0aGlzLmJheiIpOwotCQl0aGlzLmpvbyA9IG5ldyBKdW5rKCJ0aGlzLmpvbyIpOwotCQl0aGlzLmphciA9IG5ldyBKdW5rKCJ0aGlzLmphciIpOwotCQl0aGlzLmpheiA9IG5ldyBKdW5rKCJ0aGlzLmpheiIpOwotCi0JCXRoaXMudG9tID0gbmV3IEp1bmsoInRoaXMudG9tIik7Ci0JCXRoaXMuZGljayA9IG5ldyBKdW5rKCJ0aGlzLmRpY2siKTsKLQkJdGhpcy5oYXJyeSA9IG5ldyBKdW5rKCJ0aGlzLmhhcnJ5Iik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMudG9tKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5kaWNrKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCg3LCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCg4LCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCkgewotCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5nZXQoaSksIGxpc3QuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU29ydCgpIHsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uU29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdFNvcnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUNvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21MaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydCh0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8SnVuaz4gYnVpbGRDdXN0b21Db21wYXJhdG9yKCkgewotCQkvLyBzb3J0IHdpdGggcmV2ZXJzZSBvcmRlcgotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8SnVuaz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoSnVuayBvMSwgSnVuayBvMikgewotCQkJCXJldHVybiBvMi5jb21wYXJlVG8obzEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb2xsZWN0aW9uU29ydChDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIGNvbXBhcmF0b3IpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0U29ydChDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KGxpc3RIb2xkZXIsIGNvbXBhcmF0b3IpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5hZGQoMCwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWxpc3RIb2xkZXIucmVtb3ZlKDgpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDUpOwotCQlhc3NlcnRFcXVhbHMoNSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmVTb3J0KExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsLCBMaXN0PEp1bms+IGxpc3QsIENvbXBhcmF0b3I8SnVuaz4gY29tcGFyYXRvcikgewotCQlTb3J0ZWRTZXQ8SnVuaz4gc3MgPSBuZXcgVHJlZVNldDxKdW5rPihjb21wYXJhdG9yKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJc3MuYWRkKGxpc3RWYWx1ZU1vZGVsLmdldChpKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHNzLnNpemUoKSwgbGlzdC5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPEp1bms+IHN0cmVhbTEgPSBzcy5pdGVyYXRvcigpLCBzdHJlYW0yID0gbGlzdC5pdGVyYXRvcigpOyBzdHJlYW0xLmhhc05leHQoKTsgKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyZWFtMS5uZXh0KCksIHN0cmVhbTIubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihsaXN0SG9sZGVyKSk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJbGlzdFZhbHVlTW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihsaXN0SG9sZGVyKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihuZXcgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDApKTsKLQkJdGhpcy5iYXIuc2V0TmFtZSgienp6Iik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDUpKTsKLQkJdGhpcy5iYXIuc2V0TmFtZSgidGhpcy5iYXIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SnVuaz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlCYWc8SnVuaz4gYmFnID0gbmV3IEhhc2hCYWc8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oYmFnKTsKLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8SnVuaz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PEp1bms+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248SnVuaz4gYykgewotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJYy5hZGQodGhpcy5iYXopOwotCQljLmFkZCh0aGlzLmpvbyk7Ci0JCWMuYWRkKHRoaXMuamFyKTsKLQkJYy5hZGQodGhpcy5qYXopOwotCX0KLQotCS8vICoqKioqKioqKiogSnVuayBjbGFzcyAqKioqKioqKioqCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIENvbXBhcmFibGU8SnVuaz4gewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwdWJsaWMgSnVuayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJcHVibGljIGludCBjb21wYXJlVG8oSnVuayBqKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lLmNvbXBhcmVUbyhqLm5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9KcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZmJlMDIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9KcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmcy5KcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzOwotCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlNb2RlbFZhbHVlVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzLnN1aXRlKCkpOwotCQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpc3RBc3BlY3RBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpc3RDdXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTnVsbExpc3RWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTnVsbFByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RhdGljTGlzdFZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdGF0aWNWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLlRyYW5zZm9ybWVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmVlQXNwZWN0QWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWYWx1ZUxpc3RBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWYWx1ZVN0YXRlQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlNb2RlbFZhbHVlVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YzY3MTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBMaXN0QXNwZWN0QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDE7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcjE7Ci0JcHJpdmF0ZSBMb2NhbExpc3RBc3BlY3RBZGFwdGVyIGFhMTsKLQlwcml2YXRlIExpc3RFdmVudCBldmVudDE7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIxOwotCi0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MjsKLQotCXB1YmxpYyBMaXN0QXNwZWN0QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3ViamVjdDEgPSBuZXcgVGVzdFN1YmplY3QoKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lcyh0aGlzLnN1YmplY3QxTmFtZXMoKSk7Ci0JCXRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb25zKHRoaXMuc3ViamVjdDFEZXNjcmlwdGlvbnMoKSk7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0Pih0aGlzLnN1YmplY3QxKTsKLQkJdGhpcy5hYTEgPSB0aGlzLmJ1aWxkQXNwZWN0QWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIxKTsKLQkJdGhpcy5saXN0ZW5lcjEgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQotCQl0aGlzLnN1YmplY3QyID0gbmV3IFRlc3RTdWJqZWN0KCk7Ci0JCXRoaXMuc3ViamVjdDIuYWRkTmFtZXModGhpcy5zdWJqZWN0Mk5hbWVzKCkpOwotCQl0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9ucyh0aGlzLnN1YmplY3QyRGVzY3JpcHRpb25zKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN1YmplY3QxTmFtZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiZm9vIik7Ci0JCXJlc3VsdC5hZGQoImJhciIpOwotCQlyZXN1bHQuYWRkKCJiYXoiKTsKLQkJcmVzdWx0LmFkZCgiYmFtIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3ViamVjdDFEZXNjcmlwdGlvbnMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MSBkZXNjcmlwdGlvbjEiKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MSBkZXNjcmlwdGlvbjIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdWJqZWN0Mk5hbWVzKCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImpvbyIpOwotCQlyZXN1bHQuYWRkKCJqYXIiKTsKLQkJcmVzdWx0LmFkZCgiamF6Iik7Ci0JCXJlc3VsdC5hZGQoImphbSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN1YmplY3QyRGVzY3JpcHRpb25zKCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDIgZGVzY3JpcHRpb24xIik7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDIgZGVzY3JpcHRpb24yIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMb2NhbExpc3RBc3BlY3RBZGFwdGVyIGJ1aWxkQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbExpc3RBc3BlY3RBZGFwdGVyKHN1YmplY3RIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCB2YWx1ZTFDaGFuZ2VkKExpc3RFdmVudCBlKSB7Ci0JCXRoaXMuZXZlbnQxID0gZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0Mk5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDEpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkTmFtZSgiamFtIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYW0iLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNQbHVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzUGx1cy5hZGQoImphbSIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5hYTEuYWRkKDIsICJqYXoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXoiLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQluYW1lc1BsdXMuYWRkKDIsICJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEFkZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQlMaXN0PFN0cmluZz4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaXRlbXMuYWRkKCJqb28iKTsKLQkJaXRlbXMuYWRkKCJqYXIiKTsKLQkJaXRlbXMuYWRkKCJqYXoiKTsKLQkJaXRlbXMuYWRkKCJqYW0iKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuYWExLmFkZEFsbCgyLCBpdGVtcyk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7CQkvLyBvbmx5IHRoZSBsYXN0ICJhZGQiIGV2ZW50IHdpbGwgc3RpbGwgYmUgdGhlcmUKLQkJYXNzZXJ0RXF1YWxzKCJqYW0iLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNQbHVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzUGx1cy5hZGRBbGwoMiwgaXRlbXMpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJU3RyaW5nIHJlbW92ZWROYW1lID0gdGhpcy5zdWJqZWN0MS5yZW1vdmVOYW1lKDApOwkvLyBzaG91bGQgYmUgImZvbyIKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHJlbW92ZWROYW1lLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNNaW51cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc01pbnVzLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzTWludXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQlPYmplY3QgcmVtb3ZlZEl0ZW0gPSB0aGlzLmFhMS5yZW1vdmUoMCk7CQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMocmVtb3ZlZEl0ZW0sICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCW5hbWVzTWludXMucmVtb3ZlKDApOwotCQlhc3NlcnRFcXVhbHMobmFtZXNNaW51cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdExlbmd0aCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQlMaXN0PFN0cmluZz4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaXRlbXMuYWRkKCJiYXIiKTsKLQkJaXRlbXMuYWRkKCJiYXoiKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuYWExLnJlbW92ZSgxLCAyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsJCS8vIG9ubHkgdGhlIGxhc3QgInJlbW92ZSIgZXZlbnQgd2lsbCBzdGlsbCBiZSB0aGVyZQotCQlhc3NlcnRFcXVhbHMoImJheiIsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lc1BsdXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNQbHVzLnJlbW92ZSgxKTsKLQkJbmFtZXNQbHVzLnJlbW92ZSgxKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQlTdHJpbmcgcmVwbGFjZWROYW1lID0gdGhpcy5zdWJqZWN0MS5zZXROYW1lKDAsICJqZWxseSIpOwkvLyBzaG91bGQgYmUgImZvbyIKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygiamVsbHkiLCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXROZXdJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHJlcGxhY2VkTmFtZSwgKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0T2xkSXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lc0NoYW5nZWQgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNDaGFuZ2VkLnNldCgwLCAiamVsbHkiKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzQ2hhbmdlZCwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXJlcGxhY2VkTmFtZSA9IHRoaXMuc3ViamVjdDEuc2V0TmFtZSgxLCAicm9sbCIpOwkvLyBzaG91bGQgYmUgImJhciIKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygicm9sbCIsICgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudDEpLmdldE5ld0l0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocmVwbGFjZWROYW1lLCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRPbGRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJbmFtZXNDaGFuZ2VkID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzQ2hhbmdlZC5zZXQoMCwgImplbGx5Iik7Ci0JCW5hbWVzQ2hhbmdlZC5zZXQoMSwgInJvbGwiKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzQ2hhbmdlZCwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3QxLmFkZFR3b05hbWVzKCJqYW0iLCAiamF6Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzUGx1czIgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNQbHVzMi5hZGQoMCwgImpheiIpOwotCQluYW1lc1BsdXMyLmFkZCgwLCAiamFtIik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMyLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnN1YmplY3QxLm5hbWVzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5nZXQoMCksIHRoaXMuc3ViamVjdDEuZ2V0TmFtZSgwKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5nZXQoMCksIHRoaXMuYWExLmdldCgwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuc3ViamVjdDEubmFtZXMoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19MSVNUKSk7Ci0JCXRoaXMuYWExLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hYTEuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpKTsKLQkJdGhpcy5hYTEucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQljbGFzcyBUZXN0U3ViamVjdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBuYW1lczsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNfTElTVCA9ICJuYW1lcyI7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IGRlc2NyaXB0aW9uczsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05TX0xJU1QgPSAiZGVzY3JpcHRpb25zIjsKLQkKLQkJcHVibGljIFRlc3RTdWJqZWN0KCkgewotCQkJdGhpcy5uYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJdGhpcy5kZXNjcmlwdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmFtZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5uYW1lcyk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMubmFtZXMuZ2V0KGluZGV4KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lKGludCBpbmRleCwgU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZXMuYWRkKGluZGV4LCBuYW1lKTsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChOQU1FU19MSVNULCBpbmRleCwgbmFtZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZShTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5hZGROYW1lKHRoaXMubmFtZXMuc2l6ZSgpLCBuYW1lKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lcyhMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXdOYW1lcykgewotCQkJd2hpbGUgKG5ld05hbWVzLmhhc05leHQoKSkgewotCQkJCXRoaXMuYWRkTmFtZShuZXdOYW1lcy5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWVzKExpc3Q8U3RyaW5nPiBuZXdOYW1lcykgewotCQkJdGhpcy5hZGROYW1lcyhuZXdOYW1lcy5saXN0SXRlcmF0b3IoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkVHdvTmFtZXMoU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIpIHsKLQkJCXRoaXMubmFtZXMuYWRkKDAsIG5hbWUyKTsKLQkJCXRoaXMubmFtZXMuYWRkKDAsIG5hbWUxKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKE5BTUVTX0xJU1QsIHRoaXMubmFtZXMpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlTmFtZShpbnQgaW5kZXgpIHsKLQkJCVN0cmluZyByZW1vdmVkTmFtZSA9IHRoaXMubmFtZXMucmVtb3ZlKGluZGV4KTsKLQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKE5BTUVTX0xJU1QsIGluZGV4LCByZW1vdmVkTmFtZSk7Ci0JCQlyZXR1cm4gcmVtb3ZlZE5hbWU7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBzZXROYW1lKGludCBpbmRleCwgU3RyaW5nIG5hbWUpIHsKLQkJCVN0cmluZyByZXBsYWNlZE5hbWUgPSB0aGlzLm5hbWVzLnNldChpbmRleCwgbmFtZSk7Ci0JCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWQoTkFNRVNfTElTVCwgaW5kZXgsIG5hbWUsIHJlcGxhY2VkTmFtZSk7Ci0JCQlyZXR1cm4gcmVwbGFjZWROYW1lOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBkZXNjcmlwdGlvbnMoKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5kZXNjcmlwdGlvbnMpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5kZXNjcmlwdGlvbnMuZ2V0KGluZGV4KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdGlvbihpbnQgaW5kZXgsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJdGhpcy5kZXNjcmlwdGlvbnMuYWRkKGluZGV4LCBkZXNjcmlwdGlvbik7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoREVTQ1JJUFRJT05TX0xJU1QsIGluZGV4LCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQl0aGlzLmFkZERlc2NyaXB0aW9uKHRoaXMuZGVzY3JpcHRpb25zLnNpemUoKSwgZGVzY3JpcHRpb24pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9ucyhMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXdEZXNjcmlwdGlvbnMpIHsKLQkJCXdoaWxlIChuZXdEZXNjcmlwdGlvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJdGhpcy5hZGREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbnMubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdGlvbnMoTGlzdDxTdHJpbmc+IG5ld0Rlc2NyaXB0aW9ucykgewotCQkJdGhpcy5hZGREZXNjcmlwdGlvbnMobmV3RGVzY3JpcHRpb25zLmxpc3RJdGVyYXRvcigpKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZURlc2NyaXB0aW9uKGludCBpbmRleCkgewotCQkJU3RyaW5nIHJlbW92ZWREZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb25zLnJlbW92ZShpbmRleCk7Ci0JCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChERVNDUklQVElPTlNfTElTVCwgaW5kZXgsIHJlbW92ZWREZXNjcmlwdGlvbik7Ci0JCQlyZXR1cm4gcmVtb3ZlZERlc2NyaXB0aW9uOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgc2V0RGVzY3JpcHRpb24oaW50IGluZGV4LCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCVN0cmluZyByZXBsYWNlZERlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbnMuc2V0KGluZGV4LCBkZXNjcmlwdGlvbik7Ci0JCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWQoREVTQ1JJUFRJT05TX0xJU1QsIGluZGV4LCBkZXNjcmlwdGlvbiwgcmVwbGFjZWREZXNjcmlwdGlvbik7Ci0JCQlyZXR1cm4gcmVwbGFjZWREZXNjcmlwdGlvbjsKLQkJfQotCX0KLQotCi0JLy8gdGhpcyBpcyBub3QgYSB0eXBpY2FsIGFzcGVjdCBhZGFwdGVyIC0gdGhlIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIGFzcGVjdCBuYW1lCi0JY2xhc3MgTG9jYWxMaXN0QXNwZWN0QWRhcHRlciBleHRlbmRzIExpc3RBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+IHsKLQotCQlMb2NhbExpc3RBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQkJc3VwZXIoc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRVNfTElTVCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQlpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfTElTVCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZXMoKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmRlc2NyaXB0aW9ucygpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5saXN0TmFtZXNbMF0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJCWlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19MSVNUKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LmFkZE5hbWUoaW5kZXgsIChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIGlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfTElTVCkgewotCQkJCXRoaXMuc3ViamVjdC5hZGREZXNjcmlwdGlvbihpbmRleCwgKFN0cmluZykgaXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLmxpc3ROYW1lc1swXSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRBbGwoaW50IGluZGV4LCBMaXN0PFN0cmluZz4gaXRlbXMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQl0aGlzLmFkZChpbmRleCArIGksIGl0ZW1zLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCWlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19MSVNUKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5yZW1vdmVOYW1lKGluZGV4KTsKLQkJCX0gZWxzZSBpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnJlbW92ZURlc2NyaXB0aW9uKGluZGV4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMubGlzdE5hbWVzWzBdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBMaXN0PFN0cmluZz4gcmVtb3ZlKGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQkJTGlzdDxTdHJpbmc+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihsZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCXJlbW92ZWRJdGVtcy5hZGQodGhpcy5yZW1vdmUoaW5kZXgpKTsKLQkJCX0KLQkJCXJldHVybiByZW1vdmVkSXRlbXM7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IHJlcGxhY2UoaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQkJaWYgKHRoaXMubGlzdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNldE5hbWUoaW5kZXgsIChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIGlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfTElTVCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc2V0RGVzY3JpcHRpb24oaW5kZXgsIChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5saXN0TmFtZXNbMF0pOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwODNkYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBhZGFwdGVyOwotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVkTGlzdEhvbGRlcjsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiB3cmFwcGVkTGlzdDsKLQotCXB1YmxpYyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy53cmFwcGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy53cmFwcGVkTGlzdCk7Ci0JCXRoaXMuYWRhcHRlciA9IG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy53cmFwcGVkTGlzdEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLndyYXBwZWRMaXN0Lml0ZXJhdG9yKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJLy8gb3ZlcnJpZGUgZmFpbHVyZQotCQkJfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFsZVZhbHVlcygpIHsKLQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgey8qIE9LICovfQotCQl9OwotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgwLCAiZm9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDEsICJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMiwgImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0KLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEhhc2hCYWc8U3RyaW5nPigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0KLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLndyYXBwZWRMaXN0SG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZExpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDMsICJqb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoNCwgImphciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCg1LCAiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLndyYXBwZWRMaXN0LnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHN5bmNoTGlzdC5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLndyYXBwZWRMaXN0SG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMywgImpvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCg0LCAiamFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDUsICJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXoiLCB0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnJlbW92ZSg1KSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZExpc3QuY29udGFpbnMoImpheiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnJlbW92ZSgwKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZExpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMud3JhcHBlZExpc3Quc2l6ZSgpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNoKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCS8vIG92ZXJyaWRlIGZhaWx1cmUKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJLy8gb3ZlcnJpZGUgZmFpbHVyZQotCQkJfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMywgImpvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCg0LCAiamFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDUsICJqYXoiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5yZW1vdmUoNSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZExpc3QuY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZExpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMud3JhcHBlZExpc3Quc2l6ZSgpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQkvLyBvdmVycmlkZSBmYWlsdXJlCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCS8vIG92ZXJyaWRlIGZhaWx1cmUKLQkJCX0KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImZvbyIsIGUuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSwgImpvbyIpKTsKLQkJCQlhc3NlcnRFcXVhbHMoMiwgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuYWRhcHRlci5zaXplKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqb28iLCBlLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJCWFzc2VydEVxdWFscygzLCBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5hZGFwdGVyLnNpemUoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnNldCgwLCAiam9vIik7Ci0JCWFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlDb29yZGluYXRlZEJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBzeW5jaENvbGxlY3Rpb24pOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBjbCA9IG5ldyBDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRoaXMuYWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgwLCAiZm9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDEsICJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMiwgImJheiIpOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5zZXRMaXN0VmFsdWVzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkRnJvbUVtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiZm9vIik7Ci0JCWxpc3QuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5zZXRMaXN0VmFsdWVzKGxpc3QpOwotCQlhc3NlcnRFcXVhbHMoMiwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRGcm9tRW1wdHlUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnNldExpc3RWYWx1ZXMobGlzdCk7Ci0JCWFzc2VydEVxdWFscygwLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCWNsYXNzIFRlc3RMaXN0ZW5lciBpbXBsZW1lbnRzIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q3VyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljZTQ2Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0Q3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBMaXN0Q3VyYXRvclRlc3RzIAotCWV4dGVuZHMgVGVzdENhc2UgCi17Ci0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyMTsKLQkKLQlwcml2YXRlIExpc3RDdXJhdG9yPFRlc3RTdWJqZWN0LCBTdHJpbmc+IGN1cmF0b3I7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIxOwotCXByaXZhdGUgTGlzdEV2ZW50IGV2ZW50MTsKLQkKLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QyOwotCi0JcHVibGljIExpc3RDdXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0MSA9IG5ldyBUZXN0U3ViamVjdCh0aGlzLnN1YmplY3QxTmFtZXMoKSk7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0Pih0aGlzLnN1YmplY3QxKTsKLQkJdGhpcy5jdXJhdG9yID0gdGhpcy5idWlsZExpc3RDdXJhdG9yKHRoaXMuc3ViamVjdEhvbGRlcjEpOwotCQl0aGlzLmxpc3RlbmVyMSA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuY3VyYXRvci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdGVuZXIxKTsKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQkKLQkJdGhpcy5zdWJqZWN0MiA9IG5ldyBUZXN0U3ViamVjdCh0aGlzLnN1YmplY3QyTmFtZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN1YmplY3QxTmFtZXMoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoImFscGhhIik7Ci0JCWxpc3QuYWRkKCJicmF2byIpOwotCQlsaXN0LmFkZCgiY2hhcmxpZSIpOwotCQlsaXN0LmFkZCgiZGVsdGEiKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN1YmplY3QyTmFtZXMoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoImVjaG8iKTsKLQkJbGlzdC5hZGQoImZveHRyb3QiKTsKLQkJbGlzdC5hZGQoImdsb3ZlIik7Ci0JCWxpc3QuYWRkKCJob3RlbCIpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0Q3VyYXRvcjxUZXN0U3ViamVjdCwgU3RyaW5nPiBidWlsZExpc3RDdXJhdG9yKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IExpc3RDdXJhdG9yPFRlc3RTdWJqZWN0LCBTdHJpbmc+KHN1YmplY3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3JGb3JSZWNvcmQoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zdHJpbmdzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIxKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgdmFsdWUxQ2hhbmdlZChMaXN0RXZlbnQgZSkgewotCQl0aGlzLmV2ZW50MSA9IGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0Mk5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmN1cmF0b3IuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDEpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkU3RyaW5nKCJlY2hvIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygiZWNobyIsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBzdHJpbmdzUGx1cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQlzdHJpbmdzUGx1cy5hZGQoImVjaG8iKTsKLQkJYXNzZXJ0RXF1YWxzKHN0cmluZ3NQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdDEuYWRkU3RyaW5nKDAsICJ6dWx1Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoInp1bHUiLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlzdHJpbmdzUGx1cy5hZGQoMCwgInp1bHUiKTsKLQkJYXNzZXJ0RXF1YWxzKHN0cmluZ3NQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJU3RyaW5nIHJlbW92ZWRTdHJpbmcgPSB0aGlzLnN1YmplY3QxLnJlbW92ZVN0cmluZygwKTsJLy8gc2hvdWxkIGJlICJhbHBoYSIKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhyZW1vdmVkU3RyaW5nLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gc3RyaW5nc01pbnVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCXN0cmluZ3NNaW51cy5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscyhzdHJpbmdzTWludXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQkKLQkJcmVtb3ZlZFN0cmluZyA9IHRoaXMuc3ViamVjdDEucmVtb3ZlU3RyaW5nKDIpOwkvLyBzaG91bGQgYmUgImRlbHRhIgotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHJlbW92ZWRTdHJpbmcsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCXN0cmluZ3NNaW51cy5yZW1vdmUoMik7Ci0JCWFzc2VydEVxdWFscyhzdHJpbmdzTWludXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGVMaXN0Q2hhbmdlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQkJCi0JCXRoaXMuc3ViamVjdDEuc2V0U3RyaW5ncyh0aGlzLnN1YmplY3QyTmFtZXMoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuZXdTdHJpbmdzID0gdGhpcy5zdWJqZWN0Mk5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscyhuZXdTdHJpbmdzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFBhcnRpYWxMaXN0Q2hhbmdlKCkgewotCQlMaXN0PFN0cmluZz4gc3RhcnRpbmdMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBzdGFydGluZ0xpc3QpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQkJCi0JCVN0cmluZyBpZGVudGljYWxTdHJpbmcgPSBzdGFydGluZ0xpc3QuZ2V0KDEpOyAgLy8gc2hvdWxkIGJlICJicmF2byIKLQkJU3RyaW5nIG5vbmlkZW50aWNhbFN0cmluZyA9IHN0YXJ0aW5nTGlzdC5nZXQoMCk7IC8vIHNob3VsZCBiZSAiYWxwaGEiCi0JCUxpc3Q8U3RyaW5nPiBuZXdTdHJpbmdzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QobmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKCJicmF2byIpLCBuZXcgU3RyaW5nKCJhbHBoYSIpLCAiZWNobyIsICJkZWx0YSIsICJmb3h0cm90In0pOwotCQl0aGlzLnN1YmplY3QxLnNldFN0cmluZ3MobmV3U3RyaW5ncyk7Ci0JCQotCQlMaXN0PFN0cmluZz4gZmluYWxMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1N0cmluZ3MsIGZpbmFsTGlzdCk7Ci0JCWFzc2VydFRydWUoaWRlbnRpY2FsU3RyaW5nID09IGZpbmFsTGlzdC5nZXQoMCkpOwotCQlhc3NlcnRUcnVlKG5vbmlkZW50aWNhbFN0cmluZyAhPSBmaW5hbExpc3QuZ2V0KDEpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuc3ViamVjdDEuc3RyaW5ncygpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5nZXQoMCksIHRoaXMuc3ViamVjdDEuZ2V0U3RyaW5nKDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLmdldCgwKSwgdGhpcy5jdXJhdG9yLmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnN1YmplY3QxLnN0cmluZ3MoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgdGhpcy5jdXJhdG9yLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5jdXJhdG9yLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLmN1cmF0b3IucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY3VyYXRvci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gdGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY3VyYXRvci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKHRoaXMuY3VyYXRvci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy5jdXJhdG9yLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY3VyYXRvci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJbm5lciBDbGFzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JY2xhc3MgVGVzdFN1YmplY3QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3RyaW5nczsKLQkJCi0JCXB1YmxpYyBUZXN0U3ViamVjdCgpIHsKLQkJCXRoaXMuc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoTGlzdDxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJCXRoaXMoKTsKLQkJCXRoaXMuc2V0U3RyaW5ncyhzdHJpbmdzKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zdHJpbmdzLmdldChpbmRleCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc3RyaW5ncyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZFN0cmluZyhpbnQgaW5kZXgsIFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMuc3RyaW5ncy5hZGQoaW5kZXgsIHN0cmluZyk7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMuYWRkU3RyaW5nKHRoaXMuc3RyaW5ncy5zaXplKCksIHN0cmluZyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlU3RyaW5nKGludCBpbmRleCkgewotCQkJU3RyaW5nIHN0cmluZyA9IHRoaXMuc3RyaW5ncy5nZXQoaW5kZXgpOwotCQkJdGhpcy5yZW1vdmVTdHJpbmcoc3RyaW5nKTsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLnN0cmluZ3MucmVtb3ZlKHN0cmluZyk7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0U3RyaW5ncyhMaXN0PFN0cmluZz4gc3RyaW5ncykgewotCQkJdGhpcy5zdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHN0cmluZ3MpOwotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFN0cmluZ3MoU3RyaW5nW10gc3RyaW5ncykgewotCQkJdGhpcy5zdHJpbmdzID0gQ29sbGVjdGlvblRvb2xzLmxpc3Qoc3RyaW5ncyk7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjYzczOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLk51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE9iamVjdD4gY29sbGVjdGlvbkhvbGRlcjsKLQotCXB1YmxpYyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsPE9iamVjdD4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MmJmNDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5OdWxsTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgTnVsbExpc3RWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxPYmplY3Q+IGxpc3RIb2xkZXI7Ci0KLQlwdWJsaWMgTnVsbExpc3RWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5saXN0SG9sZGVyID0gbmV3IE51bGxMaXN0VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMubGlzdEhvbGRlci5nZXQoMCk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTQ4NTA2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLk51bGxQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIE51bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCi0JcHVibGljIE51bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IE51bGxQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydE51bGwodGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhYmM4My4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QxOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIxOwotCXByaXZhdGUgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+IGFhMTsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQxOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjE7Ci0KLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QyOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IG11bHRpcGxlVmFsdWVFdmVudDsKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBjdXN0b21WYWx1ZUV2ZW50OwotCi0KLQlwdWJsaWMgUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0MSA9IG5ldyBUZXN0U3ViamVjdCgiZm9vIiwgInRlc3Qgc3ViamVjdCAxIik7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiAodGhpcy5zdWJqZWN0MSk7Ci0JCXRoaXMuYWExID0gdGhpcy5idWlsZEFzcGVjdEFkYXB0ZXIodGhpcy5zdWJqZWN0SG9sZGVyMSk7Ci0JCXRoaXMubGlzdGVuZXIxID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuYWExLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQotCQl0aGlzLnN1YmplY3QyID0gbmV3IFRlc3RTdWJqZWN0KCJiYXIiLCAidGVzdCBzdWJqZWN0IDIiKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgU3RyaW5nPiBidWlsZEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+KHN1YmplY3RIb2xkZXIsIFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCS8vIHRoaXMgaXMgbm90IGEgYXNwZWN0IGFkYXB0ZXIgLSB0aGUgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYXNwZWN0IG5hbWUKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5wcm9wZXJ0eU5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIGlmICh0aGlzLnByb3BlcnR5TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05fUFJPUEVSVFkpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLnByb3BlcnR5TmFtZXNbMF0pOwotCQkJCX0KLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh0aGlzLnByb3BlcnR5TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQkJfSBlbHNlIGlmICh0aGlzLnByb3BlcnR5TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05fUFJPUEVSVFkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldERlc2NyaXB0aW9uKHZhbHVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5wcm9wZXJ0eU5hbWVzWzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCB2YWx1ZTFDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmV2ZW50MSA9IGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQxLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmV2ZW50MS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmV2ZW50MS5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50MS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5ldmVudDEuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0MSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudDEuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5ldmVudDEuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5ldmVudDEuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3QxLnNldE5hbWUoImJheiIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQxLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmV2ZW50MS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmV2ZW50MS5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0MS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQxLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmV2ZW50MS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuZXZlbnQxLmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdDEuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudDEuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5ldmVudDEuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5ldmVudDEuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc3ViamVjdDEuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnN1YmplY3QxLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5hYTEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYWExLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5hYTEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QyKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYWExLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQl0aGlzLmFhMS5zZXRWYWx1ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5zdWJqZWN0MS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSk7Ci0JCXRoaXMuYWExLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpKTsKLQkJdGhpcy5hYTEucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUFzcGVjdEFkYXB0ZXIoKSB7Ci0JCVRlc3RTdWJqZWN0IHRlc3RTdWJqZWN0ID0gbmV3IFRlc3RTdWJqZWN0KCJmcmVkIiwgImh1c2JhbmQiKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHRlc3RTdWJqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4odGVzdFN1YmplY3QpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRlc3RBQSA9IHRoaXMuYnVpbGRNdWx0aXBsZUFzcGVjdEFkYXB0ZXIodGVzdFN1YmplY3RIb2xkZXIpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRlc3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRNdWx0aXBsZVZhbHVlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGVzdEFBLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0ZXN0TGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQ6aHVzYmFuZCIsIHRlc3RBQS5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm11bHRpcGxlVmFsdWVFdmVudCA9IG51bGw7Ci0JCXRlc3RTdWJqZWN0LnNldE5hbWUoIndpbG1hIik7Ci0JCWFzc2VydEVxdWFscygid2lsbWE6aHVzYmFuZCIsIHRlc3RBQS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkOmh1c2JhbmQiLCB0aGlzLm11bHRpcGxlVmFsdWVFdmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYTpodXNiYW5kIiwgdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0KLQkJdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQgPSBudWxsOwotCQl0ZXN0U3ViamVjdC5zZXREZXNjcmlwdGlvbigid2lmZSIpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hOndpZmUiLCB0ZXN0QUEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygid2lsbWE6aHVzYmFuZCIsIHRoaXMubXVsdGlwbGVWYWx1ZUV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hOndpZmUiLCB0aGlzLm11bHRpcGxlVmFsdWVFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRNdWx0aXBsZUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+KHN1YmplY3RIb2xkZXIsIFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFksIFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCkgKyAiOiIgKyB0aGlzLnN1YmplY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRNdWx0aXBsZVZhbHVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLm11bHRpcGxlVmFsdWVDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgbXVsdGlwbGVWYWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMubXVsdGlwbGVWYWx1ZUV2ZW50ID0gZTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IGEgYnVnIHdoZXJlIHdlIHdvdWxkIGNhbGwgI2J1aWxkVmFsdWUoKSBpbgotCSAqICNlbmdhZ2VOb25OdWxsU3ViamVjdCgpLCB3aGVuIHdlIG5lZWRlZCB0byBjYWxsCi0JICogaXQgaW4gI2VuZ2FnZVN1YmplY3QoKSwgc28gdGhlIGNhY2hlZCB2YWx1ZSB3b3VsZAotCSAqIGJlIHJlYnVpbHQgd2hlbiB0aGUgdGhpcy5zdWJqZWN0IHdhcyBzZXQgdG8gbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21CdWlsZFZhbHVlV2l0aE51bGxTdWJqZWN0KCkgewotCQlUZXN0U3ViamVjdCBjdXN0b21TdWJqZWN0ID0gbmV3IFRlc3RTdWJqZWN0KCJmcmVkIiwgImxhYm9yZXIiKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IGN1c3RvbVN1YmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PihjdXN0b21TdWJqZWN0KTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBjdXN0b21BQSA9IHRoaXMuYnVpbGRDdXN0b21Bc3BlY3RBZGFwdGVyKGN1c3RvbVN1YmplY3RIb2xkZXIpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGN1c3RvbUxpc3RlbmVyID0gdGhpcy5idWlsZEN1c3RvbVZhbHVlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJY3VzdG9tQUEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGN1c3RvbUxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkIiwgY3VzdG9tQUEuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5jdXN0b21WYWx1ZUV2ZW50ID0gbnVsbDsKLQkJY3VzdG9tU3ViamVjdC5zZXROYW1lKCJ3aWxtYSIpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hIiwgY3VzdG9tQUEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIHRoaXMuY3VzdG9tVmFsdWVFdmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYSIsIHRoaXMuY3VzdG9tVmFsdWVFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQotCQl0aGlzLmN1c3RvbVZhbHVlRXZlbnQgPSBudWxsOwotCQljdXN0b21TdWJqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0aGlzIHdvdWxkIGZhaWwgLSB0aGUgdmFsdWUgd291bGQgYmUgbnVsbC4uLgotCQlhc3NlcnRFcXVhbHMoIjx1bm5hbWVkPiIsIGN1c3RvbUFBLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hIiwgdGhpcy5jdXN0b21WYWx1ZUV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIjx1bm5hbWVkPiIsIHRoaXMuY3VzdG9tVmFsdWVFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGEgYnVnOgotCSAqIElmIHR3byBsaXN0ZW5lcnMgd2VyZSBhZGRlZCB0byBhbiBhc3BlY3QgYWRhcHRlciwgb25lIHdpdGggYW4KLQkgKiBhc3BlY3QgbmFtZSBhbmQgb25lIHdpdGhvdXQsIHRoZSBhc3BlY3QgYWRhcHRlciB3b3VsZCBhZGQgaXRzCi0JICogJ3N1YmplY3RDaGFuZ2VMaXN0ZW5lcicgdG8gaXRzICdzdWJqZWN0SG9sZGVyJyB0d2ljZS4gQXMgYSByZXN1bHQsCi0JICogdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgdHJpZ2dlciBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiBpZiB0aGUgYnVnIGlzIHByZXNlbnQ7IG90aGVyd2lzZSwgaXQgY29tcGxldGVzIHNpbGVudGx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVMaXN0ZW5lcigpIHsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hYTEuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDdXN0b21Bc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgU3RyaW5nPihzdWJqZWN0SG9sZGVyLCBUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/ICI8dW5uYW1lZD4iIDogdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDdXN0b21WYWx1ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy5jdXN0b21WYWx1ZUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCBjdXN0b21WYWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuY3VzdG9tVmFsdWVFdmVudCA9IGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlc3QgbW9kZWwgKioqKioqKioqKgotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RTdWJqZWN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9QUk9QRVJUWSA9ICJkZXNjcmlwdGlvbiI7Ci0JCi0JCXB1YmxpYyBUZXN0U3ViamVjdChTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5kZXNjcmlwdGlvbjsKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERVNDUklQVElPTl9QUk9QRVJUWSwgb2xkLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NjFlZjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBhZGFwdGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVkVmFsdWVIb2xkZXI7Ci0KLQlwdWJsaWMgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmFkYXB0ZXIgPSBuZXcgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLndyYXBwZWRWYWx1ZUhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPFN0cmluZz4odGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhZGFwdGVyQ29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWUoKSB7Ci0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckNvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBIYXNoQmFnPFN0cmluZz4oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCi0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFkYXB0ZXJDb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgc3luY2hDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgY2wgPSBuZXcgQ2hhbmdlQWRhcHRlcigpOwotCQl0aGlzLmFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZEZyb21FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRGcm9tRW1wdHlUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpKTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzICoqKioqKioqKioKLQkKLQlzdGF0aWMgY2xhc3MgVGVzdExpc3RlbmVyIGltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxYjAzZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBhZGFwdGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVkVmFsdWVIb2xkZXI7Ci0KLQlwdWJsaWMgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmFkYXB0ZXIgPSBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLndyYXBwZWRWYWx1ZUhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gd3JhcHBlZExpc3QoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdChuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPFN0cmluZz4odGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCUxpc3Q8U3RyaW5nPiBhZGFwdGVyTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRMaXN0KCksIGFkYXB0ZXJMaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhZGFwdGVyTGlzdC5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEludCgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFkYXB0ZXIuZ2V0KDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheTEoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCU9iamVjdFtdIGFycmF5ID0gdGhpcy5hZGFwdGVyLnRvQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhcnJheVswXSk7Ci0JCWFzc2VydEVxdWFscygxLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb0FycmF5MigpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpKTsKLQkJT2JqZWN0W10gYXJyYXkgPSB0aGlzLmFkYXB0ZXIudG9BcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZSgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCUxpc3Q8U3RyaW5nPiBhZGFwdGVyTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRMaXN0KCksIGFkYXB0ZXJMaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhZGFwdGVyTGlzdC5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFkYXB0ZXJMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgYWRhcHRlckxpc3QpOwotCi0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkTGlzdCgpLCBhZGFwdGVyTGlzdCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckxpc3QuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgY2wgPSBuZXcgQ2hhbmdlQWRhcHRlcigpOwotCQl0aGlzLmFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkVG9FbXB0eSgpIHsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkRnJvbUVtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlbUNoYW5nZWQoKSB7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqTGlzdC5nZXRNb2RlbCgpLmdldEVsZW1lbnRBdCgwKSk7Ci0JCQotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygxLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgakxpc3QuZ2V0TW9kZWwoKS5nZXRFbGVtZW50QXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRGcm9tRW1wdHlUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkpOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3MgKioqKioqKioqKgotCQotCXN0YXRpYyBjbGFzcyBUZXN0TGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1JlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODY3OGE3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cyAKLQlleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG9iamVjdEhvbGRlcjsKLQkKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVyT2JqZWN0SG9sZGVyOwotCQotCVByb3BlcnR5Q2hhbmdlRXZlbnQgd3JhcHBlckV2ZW50OwotCQotCQotCXB1YmxpYyBSZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigiZm9vIik7Ci0JCXRoaXMud3JhcHBlck9iamVjdEhvbGRlciA9IG5ldyBSZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMub2JqZWN0SG9sZGVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMud3JhcHBlck9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMud3JhcHBlck9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJYm9vbGVhbiBleGNlcHRpb25PY2N1cnJlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gdW9lKSB7Ci0JCQlleGNlcHRpb25PY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoZXhjZXB0aW9uT2NjdXJyZWQpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMud3JhcHBlck9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBidWlsZFdyYXBwZXJMaXN0ZW5lcigpOwotCQl0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCQotCQl0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFdyYXBwZXJMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkV3JhcHBlckxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy53cmFwcGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCXZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiZm9vIiwgImJhciIpOwotCQl2ZXJpZnlFdmVudCh0aGlzLndyYXBwZXJFdmVudCwgdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLCAiZm9vIiwgImJhciIpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMud3JhcHBlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiYmFyIiwgbnVsbCk7Ci0JCXZlcmlmeUV2ZW50KHRoaXMud3JhcHBlckV2ZW50LCB0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIsICJiYXIiLCBudWxsKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLndyYXBwZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJdmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIG51bGwsICJmb28iKTsKLQkJdmVyaWZ5RXZlbnQodGhpcy53cmFwcGVyRXZlbnQsIHRoaXMud3JhcHBlck9iamVjdEhvbGRlciwgbnVsbCwgImZvbyIpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkV3JhcHBlckxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlSZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMud3JhcHBlckV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlLCBPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjljOGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2V0Q29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyOwotCUNvbGxlY3Rpb25BZGRFdmVudCBhZGRFdmVudDsKLQlDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgcmVtb3ZlRXZlbnQ7Ci0JQ29sbGVjdGlvbkNsZWFyRXZlbnQgY29sbGVjdGlvbkNsZWFyZWRFdmVudDsKLQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgY29sbGVjdGlvbkNoYW5nZWRFdmVudDsKLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBzZXRIb2xkZXI7Ci0JQ29sbGVjdGlvbkFkZEV2ZW50IHNldEFkZEV2ZW50OwotCUNvbGxlY3Rpb25SZW1vdmVFdmVudCBzZXRSZW1vdmVFdmVudDsKLQlDb2xsZWN0aW9uQ2xlYXJFdmVudCBzZXRDbGVhcmVkRXZlbnQ7Ci0JQ29sbGVjdGlvbkNoYW5nZUV2ZW50IHNldENoYW5nZWRFdmVudDsKLQotCXB1YmxpYyBTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlciA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCQl0aGlzLnNldEhvbGRlciA9IG5ldyBTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuY29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJLy8gYWRkIGEgbGlzdGVuZXIgdG8gImFjdGl2YXRlIiB0aGUgd3JhcHBlcgotCQl0aGlzLnNldEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkU2V0Q2hhbmdlTGlzdGVuZXIoKSk7Ci0KLQkJdGhpcy52ZXJpZnkodGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm9vIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeSh0aGlzLnNldEhvbGRlciwgImZvbyIpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm9vIiwgImZvbyIsICJiYXIiLCAiYmFyIik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuc2V0SG9sZGVyLCAiZm9vIiwgImJhciIpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImJhciIpOwotCQl0aGlzLnZlcmlmeSh0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJmb28iLCAiZm9vIiwgImJhciIpOwotCQl0aGlzLnZlcmlmeSh0aGlzLnNldEhvbGRlciwgImZvbyIsICJiYXIiKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm9vIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeSh0aGlzLnNldEhvbGRlciwgImZvbyIpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQl0aGlzLnZlcmlmeSh0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5zZXRIb2xkZXIsICJmb28iKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQkvLyBhZGQgYSBsaXN0ZW5lciB0byAiYWN0aXZhdGUiIHRoZSB3cmFwcGVyCi0JCXRoaXMuc2V0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTZXRDaGFuZ2VMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLnNldEhvbGRlci5zaXplKCkpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5zZXRIb2xkZXIuc2l6ZSgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5zZXRIb2xkZXIuc2l6ZSgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5zZXRIb2xkZXIuc2l6ZSgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5zZXRIb2xkZXIuc2l6ZSgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZXRIb2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVsa0NoYW5nZSgpIHsKLQkJLy8gYWRkIGEgbGlzdGVuZXIgdG8gImFjdGl2YXRlIiB0aGUgd3JhcHBlcgotCQl0aGlzLnNldEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkU2V0Q2hhbmdlTGlzdGVuZXIoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5ld0NvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImZveCIpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiZm94Iik7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJiYXQiKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2V0VmFsdWVzKG5ld0NvbGxlY3Rpb24pOwotCQl0aGlzLnZlcmlmeSh0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJmb3giLCAiZm94IiwgImJhdCIpOwotCQl0aGlzLnZlcmlmeSh0aGlzLnNldEhvbGRlciwgImZveCIsICJiYXQiKTsKLQl9CQkKLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nKCkgewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFNldENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXZlbnRzMSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNldENoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50cygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFdmVudHMyKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZFNldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlFdmVudHMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJFdmVudHMoKSB7Ci0JCXRoaXMuYWRkRXZlbnQgPSBudWxsOwotCQl0aGlzLnJlbW92ZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRBZGRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0UmVtb3ZlRXZlbnQgPSBudWxsOwotCQl0aGlzLnNldENsZWFyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0Q2hhbmdlZEV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnRzKCkgewotCQl0aGlzLmNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYWRkRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuc2V0QWRkRXZlbnQsIHRoaXMuc2V0SG9sZGVyLCAiYmFyIik7Ci0KLQkJdGhpcy5jbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnJlbW92ZUV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJmb28iKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldFJlbW92ZUV2ZW50KTsKLQotCQl0aGlzLmNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYWRkRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImJhciIpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0QWRkRXZlbnQpOwotCi0JCXRoaXMuY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5yZW1vdmVFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5zZXRSZW1vdmVFdmVudCwgdGhpcy5zZXRIb2xkZXIsICJmb28iKTsKLQotCQl0aGlzLmNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYWRkRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuc2V0QWRkRXZlbnQsIHRoaXMuc2V0SG9sZGVyLCAiZm9vIik7Ci0KLQkJdGhpcy5jbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuY2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5zZXRDbGVhcmVkRXZlbnQsIHRoaXMuc2V0SG9sZGVyKTsKLQotCQl0aGlzLmNsZWFyRXZlbnRzKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBuZXdDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJmb3giKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImZveCIpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiYmF0Iik7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJiYXQiKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImJhdCIpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2V0VmFsdWVzKG5ld0NvbGxlY3Rpb24pOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuY29sbGVjdGlvbkNoYW5nZWRFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm94IiwgImZveCIsICJiYXQiLCAiYmF0IiwgImJhdCIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuc2V0Q2hhbmdlZEV2ZW50LCB0aGlzLnNldEhvbGRlciwgImZveCIsICJiYXQiKTsKLQkJCi0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYWRkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMucmVtb3ZlRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmFkZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMucmVtb3ZlRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuY29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IGV2ZW50OwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkU2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEFkZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldFJlbW92ZUV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRDbGVhcmVkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRDaGFuZ2VkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkU2V0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0QWRkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRSZW1vdmVFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRDbGVhcmVkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldENoYW5nZWRFdmVudCA9IGV2ZW50OwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnkoQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjdm0sIFN0cmluZy4uLiBleHBlY3RlZEl0ZW1zKSB7Ci0JCUJhZzxTdHJpbmc+IGFjdHVhbCA9IENvbGxlY3Rpb25Ub29scy5iYWcoY3ZtKTsKLQkJQmFnPFN0cmluZz4gZXhwZWN0ZWQgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKGV4cGVjdGVkSXRlbXMpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KENvbGxlY3Rpb25BZGRFdmVudCBldmVudCwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0Li4uIGV4cGVjdGVkSXRlbXMpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcoZXhwZWN0ZWRJdGVtcyksIENvbGxlY3Rpb25Ub29scy5iYWcoZXZlbnQuZ2V0SXRlbXMoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UsIE9iamVjdC4uLiBleHBlY3RlZEl0ZW1zKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKGV4cGVjdGVkSXRlbXMpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGV2ZW50LmdldEl0ZW1zKCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlLCBPYmplY3QuLi4gZXhwZWN0ZWRJdGVtcykgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyhleHBlY3RlZEl0ZW1zKSwgQ29sbGVjdGlvblRvb2xzLmJhZyhldmVudC5nZXRDb2xsZWN0aW9uKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YmFjNTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBiYWdIb2xkZXI7Ci0JQ29sbGVjdGlvbkV2ZW50IGJhZ0V2ZW50OwotCVN0cmluZyBiYWdFdmVudFR5cGU7Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gc2V0SG9sZGVyOwotCUNvbGxlY3Rpb25FdmVudCBzZXRFdmVudDsKLQlTdHJpbmcgc2V0RXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERCA9ICJhZGQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkUgPSAicmVtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFID0gImNoYW5nZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSID0gImNsZWFyIjsKLQotCQotCXB1YmxpYyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuYmFnSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZEJhZygpKTsKLQkJdGhpcy5zZXRIb2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkU2V0KCkpOwotCX0KLQotCXByaXZhdGUgQmFnPFN0cmluZz4gYnVpbGRCYWcoKSB7Ci0JCUJhZzxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJdGhpcy5hZGRJdGVtc1RvKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBTZXQ8U3RyaW5nPiBidWlsZFNldCgpIHsKLQkJU2V0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQl0aGlzLmFkZEl0ZW1zVG8ocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSXRlbXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQljLmFkZCgiZm9vIik7Ci0JCWMuYWRkKCJiYXIiKTsKLQkJYy5hZGQoImJheiIpOwotCX0KLQotCXByaXZhdGUgQmFnPFN0cmluZz4gYnVpbGRBZGRJdGVtcygpIHsKLQkJQmFnPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJqb28iKTsKLQkJcmVzdWx0LmFkZCgiamFyIik7Ci0JCXJlc3VsdC5hZGQoImpheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQmFnPFN0cmluZz4gYnVpbGRSZW1vdmVJdGVtcygpIHsKLQkJQmFnPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmF6Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRCYWcoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJhZ0hvbGRlci5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU2V0KCksIENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy5zZXRIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZEJhZygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5iYWdIb2xkZXIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNldCgpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5zZXRIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBiYWdIb2xkZXJDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuYmFnSG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZXRIb2xkZXJDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBiYWdIb2xkZXJDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJhZ0hvbGRlci5pdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNldEhvbGRlckNvbnRhaW5zQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYmFnSG9sZGVyQ29udGFpbnNBbnkoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZyA9IENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5iYWdIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IGl0ZW1zKSB7Ci0JCQlpZiAoYmFnLmNvbnRhaW5zKHN0cmluZykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNldEhvbGRlckNvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlTZXQ8U3RyaW5nPiBzZXQgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCkpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBpdGVtcykgewotCQkJaWYgKHNldC5jb250YWlucyhzdHJpbmcpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImpvbyIpKTsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKCJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJqb28iKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucyhudWxsKSk7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJqb28iKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZCgiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucygiam9vIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLnNldEhvbGRlci5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkSXRlbXMoKSkpOwotCQl0aGlzLmJhZ0hvbGRlci5hZGRBbGwodGhpcy5idWlsZEFkZEl0ZW1zKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnNBbGwodGhpcy5idWlsZEFkZEl0ZW1zKCkpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zQW55KHRoaXMuYnVpbGRBZGRJdGVtcygpKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZEFsbCh0aGlzLmJ1aWxkQWRkSXRlbXMoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWluc0FsbCh0aGlzLmJ1aWxkQWRkSXRlbXMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucygiYmFyIikpOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0KLQkJdGhpcy5iYWdIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMobnVsbCkpOwotCi0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucygiYmFyIikpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0KLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGwoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWluc0FsbCh0aGlzLmJ1aWxkUmVtb3ZlSXRlbXMoKSkpOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmVBbGwodGhpcy5idWlsZFJlbW92ZUl0ZW1zKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zQW55KHRoaXMuYnVpbGRSZW1vdmVJdGVtcygpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zQWxsKHRoaXMuYnVpbGRSZW1vdmVJdGVtcygpKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZUFsbCh0aGlzLmJ1aWxkUmVtb3ZlSXRlbXMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnNBbnkodGhpcy5idWlsZFJlbW92ZUl0ZW1zKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucygiamFyIikpOwotCQl0aGlzLmJhZ0hvbGRlci5zZXRWYWx1ZXModGhpcy5idWlsZEFkZEl0ZW1zKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucygiamFyIikpOwotCi0JCXRoaXMuYmFnSG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQotCQl0aGlzLmJhZ0hvbGRlci5zZXRWYWx1ZXMobmV3IEhhc2hCYWc8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucygiamFyIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucygiYmFyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJqYXIiKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLnNldFZhbHVlcyh0aGlzLmJ1aWxkQWRkSXRlbXMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJqYXIiKSk7Ci0KLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCi0JCXRoaXMuc2V0SG9sZGVyLnNldFZhbHVlcyhuZXcgSGFzaEJhZzxTdHJpbmc+KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJqYXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UxKCkgewotCQl0aGlzLmJhZ0hvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkQmFnTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5QmFnQ2hhbmdlKCk7Ci0KLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNldExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVNldENoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlMigpIHsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZEJhZ0xpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUJhZ0NoYW5nZSgpOwotCi0JCXRoaXMuc2V0SG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRTZXRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlTZXRDaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5QmFnQ2hhbmdlKCkgewotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KEFERCwgImZvbyIpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQURELCAiZm9vIik7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChBREQsICJqb28iKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQobnVsbCk7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQURELCBudWxsKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQobnVsbCk7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQURELCBudWxsKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmUoImpvbyIpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KFJFTU9WRSwgImpvbyIpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLnJlbW92ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChSRU1PVkUsIG51bGwpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLnNldFZhbHVlcyh0aGlzLmJ1aWxkQmFnKCkpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KENIQU5HRSk7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkQWxsKHRoaXMuYnVpbGRCYWcoKSk7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQUREKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRCYWcoKSwgQ29sbGVjdGlvblRvb2xzLmJhZygoKENvbGxlY3Rpb25BZGRFdmVudCkgdGhpcy5iYWdFdmVudCkuZ2V0SXRlbXMoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXRDaGFuZ2UoKSB7Ci0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZCgiZm9vIik7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudFR5cGUpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMudmVyaWZ5U2V0RXZlbnQoQURELCAiam9vIik7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkKCJqb28iKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50VHlwZSk7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQl0aGlzLnZlcmlmeVNldEV2ZW50KEFERCwgbnVsbCk7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnRUeXBlKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUoImpvbyIpOwotCQl0aGlzLnZlcmlmeVNldEV2ZW50KFJFTU9WRSwgImpvbyIpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZSgiam9vIik7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudFR5cGUpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlTZXRFdmVudChSRU1PVkUsIG51bGwpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLnNldFZhbHVlcyh0aGlzLmJ1aWxkU2V0KCkpOwotCQl0aGlzLnZlcmlmeVNldEV2ZW50KENIQU5HRSk7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkQWxsKHRoaXMuYnVpbGRTZXQoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudFR5cGUpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRCYWdMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50VHlwZSA9IEFERDsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnRUeXBlID0gUkVNT1ZFOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5iYWdFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnRUeXBlID0gQ0hBTkdFOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5iYWdFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFNldExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnRUeXBlID0gQUREOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudFR5cGUgPSBSRU1PVkU7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudFR5cGUgPSBDTEVBUjsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudFR5cGUgPSBDSEFOR0U7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5QmFnRXZlbnQoU3RyaW5nIGV2ZW50VHlwZSkgewotCQlhc3NlcnRFcXVhbHMoZXZlbnRUeXBlLCB0aGlzLmJhZ0V2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZ0hvbGRlciwgdGhpcy5iYWdFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYmFnRXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUJhZ0V2ZW50KFN0cmluZyBldmVudFR5cGUsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW0sIHRoaXMuZ2V0QmFnRXZlbnRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPD8+IGdldEJhZ0V2ZW50SXRlbXMoKSB7Ci0JCWlmICh0aGlzLmJhZ0V2ZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbkFkZEV2ZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuYmFnRXZlbnQpLmdldEl0ZW1zKCk7Ci0JCX0gZWxzZSBpZiAodGhpcy5iYWdFdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25SZW1vdmVFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB0aGlzLmJhZ0V2ZW50KS5nZXRJdGVtcygpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2V0RXZlbnQoU3RyaW5nIGV2ZW50VHlwZSkgewotCQlhc3NlcnRFcXVhbHMoZXZlbnRUeXBlLCB0aGlzLnNldEV2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnNldEhvbGRlciwgdGhpcy5zZXRFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuc2V0RXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNldEV2ZW50KFN0cmluZyBldmVudFR5cGUsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMudmVyaWZ5U2V0RXZlbnQoZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW0sIHRoaXMuZ2V0U2V0RXZlbnRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPD8+IGdldFNldEV2ZW50SXRlbXMoKSB7Ci0JCWlmICh0aGlzLnNldEV2ZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbkFkZEV2ZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuc2V0RXZlbnQpLmdldEl0ZW1zKCk7Ci0JCX0gZWxzZSBpZiAodGhpcy5zZXRFdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25SZW1vdmVFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB0aGlzLnNldEV2ZW50KS5nZXRJdGVtcygpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MTIyZmQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXI7Ci0JTGlzdEV2ZW50IGV2ZW50OwotCVN0cmluZyBldmVudFR5cGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREID0gImFkZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRSA9ICJyZW1vdmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFID0gInJlcGxhY2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFID0gIm1vdmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUiA9ICJjbGVhciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRSA9ICJjaGFuZ2UiOwotCi0JCi0JcHVibGljIFNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5saXN0SG9sZGVyID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImZvbyIpOwotCQlyZXN1bHQuYWRkKCJiYXIiKTsKLQkJcmVzdWx0LmFkZCgiYmF6Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRBZGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImpvbyIpOwotCQlyZXN1bHQuYWRkKCJqYXIiKTsKLQkJcmVzdWx0LmFkZCgiamF6Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0vLwlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFJlbW92ZUxpc3QoKSB7Ci0vLwkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotLy8JCXJlc3VsdC5hZGQoImZvbyIpOwotLy8JCXJlc3VsdC5hZGQoImJhciIpOwotLy8JCXJldHVybiByZXN1bHQ7Ci0vLwl9Ci0vLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9ySW50KCkgewotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZExpc3QoKS5saXN0SXRlcmF0b3IoMSkpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKDEpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKSwgaXRlbSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGlzdENvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlTZXQ8U3RyaW5nPiBzZXQgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHNldC5jb250YWlucyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0KCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiam9vIikpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKCJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiam9vIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludE9iamVjdCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoImpvbyIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgyLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMoImpvbyIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMCwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkTGlzdCgpKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwodGhpcy5idWlsZEFkZExpc3QoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnNBbGwodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRDb2xsZWN0aW9uKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkTGlzdCgpKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoMiwgdGhpcy5idWlsZEFkZExpc3QoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnNBbGwodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmlzRW1wdHkoKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5jbGVhcigpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdEhvbGRlci5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc09iamVjdCgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RIb2xkZXIuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmNvbnRhaW5zKCJqb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImZvbyIpOwotCQljLmFkZCgiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0SG9sZGVyLmNvbnRhaW5zQWxsKGMpKTsKLQotCQljLmFkZCgiam9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5jb250YWluc0FsbChjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpLCB0aGlzLmxpc3RIb2xkZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuZXF1YWxzKG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRBZGRMaXN0KCkpKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5lcXVhbHModGhpcy5idWlsZExpc3QoKSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuZXF1YWxzKG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW50KCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMubGlzdEhvbGRlci5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMubGlzdEhvbGRlci5nZXQoMSkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMubGlzdEhvbGRlci5nZXQoMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpLmhhc2hDb2RlKCksIHRoaXMubGlzdEhvbGRlci5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZk9iamVjdCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubGlzdEhvbGRlci5pbmRleE9mKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmxpc3RIb2xkZXIuaW5kZXhPZigiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5saXN0SG9sZGVyLmluZGV4T2YoImJheiIpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB0aGlzLmxpc3RIb2xkZXIuaW5kZXhPZigiam9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZk9iamVjdCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubGlzdEhvbGRlci5sYXN0SW5kZXhPZigiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5saXN0SG9sZGVyLmxhc3RJbmRleE9mKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmxpc3RIb2xkZXIubGFzdEluZGV4T2YoImJheiIpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB0aGlzLmxpc3RIb2xkZXIubGFzdEluZGV4T2YoImpvbyIpKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMubGlzdEhvbGRlci5sYXN0SW5kZXhPZigiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuaXNFbXB0eSgpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmNsZWFyKCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0SG9sZGVyLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiYmFyIikpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKHRoaXMuYnVpbGRMaXN0KCkuaW5kZXhPZigiYmFyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiYmFyIikpOwotCi0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlcygpIHsKLQkJTGlzdDxTdHJpbmc+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbmV3TGlzdC5hZGQoImpvbyIpOwotCQluZXdMaXN0LmFkZCgiamFyIik7Ci0JCW5ld0xpc3QuYWRkKCJqYXoiKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKCJqYXIiKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5zZXRMaXN0VmFsdWVzKG5ld0xpc3QpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiYmFyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKCJqYXIiKSk7Ci0KLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgxLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKCJqYXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2UxKCkgewotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZTIoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RDaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgImpvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgMSwgImpvbyIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgbnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQURELCAxLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFTU9WRSwgMSwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDEsICJqb28iKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyh0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChDSEFOR0UpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoMCwgdGhpcy5idWlsZExpc3QoKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQUREKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KCgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpKSk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnNldCgwLCAiam9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVQTEFDRSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucygoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQpLmdldE5ld0l0ZW1zKCksICJmb28iKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKCgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudCkuZ2V0TmV3SXRlbXMoKSwgImpvbyIpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQUREOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVNT1ZFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRVBMQUNFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBNT1ZFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENMRUFSOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDSEFOR0U7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBBREQ7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFTU9WRTsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRVBMQUNFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IE1PVkU7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDTEVBUjsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDSEFOR0U7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKGUsIHRoaXMuZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdEhvbGRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIGUsIGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcy52ZXJpZnlFdmVudChlKTsKLQkJaWYgKGUgPT0gQUREKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0gZWxzZSBpZiAoZSA9PSBSRU1PVkUpIHsKLQkJCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQpLmdldEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGl0ZW0sICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWE2MTdmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBvYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCQotCXB1YmxpYyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigiZm9vIik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoImZvbyIsICJiYXIiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoImJhciIsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmF6Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQobnVsbCwgImJheiIpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm9iamVjdEhvbGRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIHRoaXMuZXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy5ldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlMGQwMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SZXZlcnNlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+IGFkYXB0ZXI7Ci0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uSG9sZGVyOwotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uOwotCi0JCi0JcHVibGljIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb24gPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uKTsKLQkJdGhpcy5hZGFwdGVyID0gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdChDb2xsZWN0aW9uPFN0cmluZz4gZXhwZWN0ZWQsIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWN0dWFsKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdChleHBlY3RlZCwgYWN0dWFsLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdChDb2xsZWN0aW9uPFN0cmluZz4gZXhwZWN0ZWQsIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWN0dWFsLCBDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvcikgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc29ydGVkU2V0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihjb21wYXJhdG9yKTsKLQkJc29ydGVkU2V0LmFkZEFsbChleHBlY3RlZCk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oc29ydGVkU2V0KTsKLQkJTGlzdDxTdHJpbmc+IGFjdHVhbExpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChhY3R1YWwuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZExpc3QsIGFjdHVhbExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5hZGFwdGVyLnNpemUoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtKCkgewotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiZm9vIikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgdGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHN5bmNoTGlzdC5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBzeW5jaENvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtKCkgewotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiamF6Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNoKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJqYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiamF6IikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgdGhpcy5hZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29tcGFyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQotCQl0aGlzLmFkYXB0ZXIuc2V0Q29tcGFyYXRvcihuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlciwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGNsID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlKCkgewotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZnJlZCIpOwotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuc2V0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciIsICJiYXoifSkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5hZGFwdGVyLnNpemUoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIpOwotCX0KLQotCWNsYXNzIFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzODE1YjkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmV2ZXJzZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gbGlzdDsKLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdE1vZGVsOwotCXByaXZhdGUgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4gc29ydGVkTGlzdE1vZGVsOwotCi0JCi0JcHVibGljIFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLmxpc3RNb2RlbCA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMubGlzdCk7Ci0JCXRoaXMuc29ydGVkTGlzdE1vZGVsID0gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMubGlzdE1vZGVsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3QoQ29sbGVjdGlvbjxTdHJpbmc+IGV4cGVjdGVkLCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGFjdHVhbCkgewotCQl0aGlzLnZlcmlmeUxpc3QoZXhwZWN0ZWQsIGFjdHVhbCwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3QoQ29sbGVjdGlvbjxTdHJpbmc+IGV4cGVjdGVkLCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGFjdHVhbCwgQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXBhcmF0b3IpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHNvcnRlZFNldCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oY29tcGFyYXRvcik7Ci0JCXNvcnRlZFNldC5hZGRBbGwoZXhwZWN0ZWQpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHNvcnRlZFNldCk7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWxMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoYWN0dWFsKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTGlzdCwgYWN0dWFsTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJdGhpcy5zb3J0ZWRMaXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJmb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuc29ydGVkTGlzdE1vZGVsLnNpemUoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmxpc3QsIHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbSgpIHsKLQkJTGlzdDxTdHJpbmc+IHNvcnRlZFN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5saXN0TW9kZWwpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdC5jb250YWlucygiZm9vIikpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJhciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJheiIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoNiwgdGhpcy5saXN0LnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMubGlzdCwgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHModGhpcy5saXN0LCBzeW5jaExpc3QpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5zb3J0ZWRMaXN0TW9kZWwpLCBzb3J0ZWRTeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtKCkgewotCQlMaXN0PFN0cmluZz4gc29ydGVkU3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmxpc3RNb2RlbCk7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiZm9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmF6Iik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamF6Iik7Ci0JCXRoaXMubGlzdE1vZGVsLnJlbW92ZSgiamF6Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdC5jb250YWlucygiamF6IikpOwotCQl0aGlzLmxpc3RNb2RlbC5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMubGlzdC5zaXplKCkpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmxpc3QsIHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdCwgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuc29ydGVkTGlzdE1vZGVsKSwgc29ydGVkU3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW0oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzb3J0ZWRTeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMubGlzdE1vZGVsKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXoiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHRoaXMubGlzdC5zaXplKCkpOwotCQl0aGlzLmxpc3RNb2RlbC5zZXQoMywgInR0dCIpOwotCQl0aGlzLmxpc3RNb2RlbC5zZXQoNCwgInh4eCIpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdC5jb250YWlucygieHh4IikpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmxpc3QsIHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdCwgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuc29ydGVkTGlzdE1vZGVsKSwgc29ydGVkU3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNoKCkgewotCQl0aGlzLnNvcnRlZExpc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJmb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXoiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXoiKTsKLQkJdGhpcy5saXN0TW9kZWwucmVtb3ZlKCJqYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0LmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMubGlzdE1vZGVsLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5saXN0LnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMubGlzdCwgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb21wYXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gc29ydGVkU3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmxpc3RNb2RlbCk7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmF6Iik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLmxpc3Quc2l6ZSgpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5saXN0LCB0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmxpc3QsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnNvcnRlZExpc3RNb2RlbCksIHNvcnRlZFN5bmNoTGlzdCk7Ci0KLQkJdGhpcy5zb3J0ZWRMaXN0TW9kZWwuc2V0Q29tcGFyYXRvcihuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMubGlzdCwgdGhpcy5zb3J0ZWRMaXN0TW9kZWwsIG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5saXN0LCBzeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc29ydGVkU3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuc29ydGVkTGlzdE1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuc29ydGVkTGlzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgc29ydGVkU3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLnNvcnRlZExpc3RNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGNsID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5zb3J0ZWRMaXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5zb3J0ZWRMaXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuc29ydGVkTGlzdE1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiZnJlZCIpOwotCQl0aGlzLnNvcnRlZExpc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy5saXN0TW9kZWwuc2V0TGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIiLCAiYmF6In0pKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuc29ydGVkTGlzdE1vZGVsLnNpemUoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmxpc3QsIHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQl9Ci0KLQljbGFzcyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkMGU5Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IENPTExFQ1RJT04gPSBidWlsZENvbGxlY3Rpb24oKTsKLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGNvbGxlY3Rpb25Ib2xkZXI7Ci0KLQotCXB1YmxpYyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KENPTExFQ1RJT04pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyhidWlsZENvbGxlY3Rpb24oKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHMoYnVpbGRDb2xsZWN0aW9uKCkuc2l6ZSgpLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YTdkMjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0xpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3RhdGljTGlzdFZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBMSVNUID0gYnVpbGRMaXN0KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXI7Ci0KLQotCXB1YmxpYyBTdGF0aWNMaXN0VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KExJU1QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSBidWlsZExpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZC5nZXQoaSksIHRoaXMubGlzdEhvbGRlci5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHMoYnVpbGRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHMoYnVpbGRMaXN0KCkuc2l6ZSgpLCB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1ZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGUzZDlhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTdGF0aWNWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBvYmplY3RIb2xkZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gT0JKRUNUX0hPTERFUiA9IG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigiZm9vIik7Ci0KLQkKLQlwdWJsaWMgU3RhdGljVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyID0gT0JKRUNUX0hPTERFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9iamVjdEhvbGRlci50b1N0cmluZygpLmluZGV4T2YoImZvbyIpID49IDApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjZTU5MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IHRyYW5zZm9ybWVkTGlzdEhvbGRlcjsKLQlMaXN0RXZlbnQgZXZlbnQ7Ci0JU3RyaW5nIGV2ZW50VHlwZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gInJlbW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0UgPSAicmVwbGFjZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkUgPSAibW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSID0gImNsZWFyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFID0gImNoYW5nZSI7Ci0KLQotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpOwotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlciA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1lZExpc3RIb2xkZXIodGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiZm9vIik7Ci0JCXJlc3VsdC5hZGQoImJhciIpOwotCQlyZXN1bHQuYWRkKCJiYXoiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFRyYW5zZm9ybWVkTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHRyYW5zZm9ybShMaXN0PFN0cmluZz4gbGlzdCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogbGlzdCkgewotCQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQkJcmVzdWx0LmFkZChudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0LmFkZChzdHJpbmcudG9VcHBlckNhc2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZEFkZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiam9vIik7Ci0JCXJlc3VsdC5hZGQoImphciIpOwotCQlyZXN1bHQuYWRkKCJqYXoiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFRyYW5zZm9ybWVkQWRkTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMuYnVpbGRBZGRMaXN0KCkpOwotCX0KLQotLy8JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRSZW1vdmVMaXN0KCkgewotLy8JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLS8vCQlyZXN1bHQuYWRkKCJmb28iKTsKLS8vCQlyZXN1bHQuYWRkKCJiYXIiKTsKLS8vCQlyZXR1cm4gcmVzdWx0OwotLy8JfQotLy8KLS8vCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZWRSZW1vdmVMaXN0KCkgewotLy8JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLmJ1aWxkUmVtb3ZlTGlzdCgpKTsKLS8vCX0KLS8vCi0JTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRyYW5zZm9ybWVkTGlzdEhvbGRlcihMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bSkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZywgU3RyaW5nPihsdm0pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm1JdGVtKFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIChzID09IG51bGwpID8gbnVsbCA6IHMudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRUcmFuc2Zvcm1lZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFsZVZhbHVlcygpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFRyYW5zZm9ybWVkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFRyYW5zZm9ybWVkTGlzdCgpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB0cmFuc2Zvcm1lZExpc3RDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB0cmFuc2Zvcm1lZExpc3RDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHRyYW5zZm9ybWVkTGlzdENvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlMaXN0PFN0cmluZz4gdHJhbnNmb3JtZWRMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBpdGVtcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmICh0cmFuc2Zvcm1lZExpc3QuY29udGFpbnMoc3RyZWFtLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucygiSk9PIikpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDIsICJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKCJKT08iKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMCwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWluc0FueSh0aGlzLmJ1aWxkVHJhbnNmb3JtZWRBZGRMaXN0KCkpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZEFsbCgyLCB0aGlzLmJ1aWxkQWRkTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zQWxsKHRoaXMuYnVpbGRUcmFuc2Zvcm1lZEFkZExpc3QoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydFRydWUodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucygiQkFSIikpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKHRoaXMuYnVpbGRMaXN0KCkuaW5kZXhPZigiYmFyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKCJCQVIiKSk7Ci0KLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgxLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VHZW5lcmljKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlTmFtZWQoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdENoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgxLCAiam9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQURELCAxLCAiSk9PIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgxLCBudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQsIDEsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoMSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVNT1ZFLCAxLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFTU9WRSwgMSwgIkpPTyIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoMCwgdGhpcy5idWlsZExpc3QoKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQUREKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRUcmFuc2Zvcm1lZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QoKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zKCkpKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuc2V0KDAsICJqb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRVBMQUNFKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKCgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudCkuZ2V0TmV3SXRlbXMoKSwgIkZPTyIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXROZXdJdGVtcygpLCAiSk9PIikpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IEFERDsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVNT1ZFOwotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFUExBQ0U7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gTU9WRTsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENMRUFSOwotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENIQU5HRTsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChTdHJpbmcgdHlwZSkgewotCQlhc3NlcnRFcXVhbHModHlwZSwgdGhpcy5ldmVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHModGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFN0cmluZyB0eXBlLCBpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodHlwZSk7Ci0JCWlmICh0eXBlID09IEFERCkgewotCQkJYXNzZXJ0RXF1YWxzKGluZGV4LCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaXRlbSwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9IGVsc2UgaWYgKHR5cGUgPT0gUkVNT1ZFKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQkvKgotCQkgKiBhZGRpbmcgbGlzdGVuZXJzIHRvIHRoZSB0cmFuc2Zvcm1lZCBsaXN0IHdpbGwgY2F1c2UgbGlzdGVuZXJzCi0JCSAqIHRvIGJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3Q7Ci0JCSAqIGxpa2V3aXNlLCByZW1vdmluZyBsaXN0ZW5lcnMgZnJvbSB0aGUgdHJhbnNmb3JtZWQgbGlzdCB3aWxsCi0JCSAqIGNhdXNlIGxpc3RlbmVycyB0byBiZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgbGlzdAotCQkgKi8KLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCi0JLyoqCi0JICogZXhlY3V0ZSB0aGUgc2FtZSBzZXQgb2YgdGVzdHMgYWdhaW4sIGJ1dCBieSBwYXNzaW5nIGEgVHJhbnNmb3JtZXIgdG8gdGhlIGFkYXB0ZXIKLQkgKiAoYXMgb3Bwb3NlZCB0byBvdmVycmlkaW5nICN0cmFuc2Zvcm1JdGVtKE9iamVjdCkpCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUcmFuc2Zvcm1lclRlc3RzIGV4dGVuZHMgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyB7Ci0JCXB1YmxpYyBUcmFuc2Zvcm1lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRyYW5zZm9ybWVkTGlzdEhvbGRlcihMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bSkgewotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmcsIFN0cmluZz4obHZtLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JCX0KLQkJcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+KCkgewotCQkJCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzKSB7Ci0JCQkJCXJldHVybiAocyA9PSBudWxsKSA/IG51bGwgOiBzLnRvVXBwZXJDYXNlKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYWE2ZTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpZGlUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBvYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IHRyYW5zZm9ybWF0aW9uRXZlbnQ7Ci0KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigiZm9vIik7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIgPSBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmcsIFN0cmluZz4odGhpcy5vYmplY3RIb2xkZXIsIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIEJpZGlUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBCaWRpVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+KCkgewotCQkJcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gKHMgPT0gbnVsbCkgPyBudWxsIDogcy50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQkJcHVibGljIFN0cmluZyByZXZlcnNlVHJhbnNmb3JtKFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIChzID09IG51bGwpID8gbnVsbCA6IHMudG9Mb3dlckNhc2UoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuc2V0VmFsdWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJmb28iLCAiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCAiRk9PIiwgIkJBUiIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmF6Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJiYXIiLCAiYmF6Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCAiQkFSIiwgIkJBWiIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiRm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJiYXoiLCAiRm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCAiQkFaIiwgIkZPTyIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiRk9PIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJGb28iLCAiRk9PIik7Ci0JCWFzc2VydE51bGwodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50KTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJGT08iLCBudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsICJGT08iLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBudWxsLCAiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCBudWxsLCAiQkFSIik7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZSwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlQXNwZWN0QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmODUxYjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlQXNwZWN0QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DaGFpbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJlZUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyZWVBc3BlY3RBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyMTsKLQlwcml2YXRlIFRyZWVBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBMaXN0PFRlc3ROb2RlPj4gYWExOwotCXByaXZhdGUgVHJlZUV2ZW50IGV2ZW50MTsKLQlwcml2YXRlIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjE7Ci0KLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QyOwotCi0JCi0JcHVibGljIFRyZWVBc3BlY3RBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0MSA9IG5ldyBUZXN0U3ViamVjdCgpOwotCQlUZXN0Tm9kZSByb290LCBub2RlOwotCi0JCXJvb3QgPSB0aGlzLnN1YmplY3QxLmdldFJvb3ROYW1lTm9kZSgpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0MS5hZGROYW1lKHJvb3QsICJuYW1lIDEuMSIpOwotCQl0aGlzLnN1YmplY3QxLmFkZE5hbWUobm9kZSwgIm5hbWUgMS4xLjEiKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lKG5vZGUsICJuYW1lIDEuMS4yIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QxLmFkZE5hbWUocm9vdCwgIm5hbWUgMS4yIik7Ci0JCXRoaXMuc3ViamVjdDEuYWRkTmFtZShub2RlLCAibmFtZSAxLjIuMSIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0MS5hZGROYW1lKHJvb3QsICJuYW1lIDEuMyIpOwotCi0JCXJvb3QgPSB0aGlzLnN1YmplY3QxLmdldFJvb3REZXNjcmlwdGlvbk5vZGUoKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb24ocm9vdCwgImRlc2NyaXB0aW9uIDEuMSIpOwotCQl0aGlzLnN1YmplY3QxLmFkZERlc2NyaXB0aW9uKG5vZGUsICJkZXNjcmlwdGlvbiAxLjEuMSIpOwotCQl0aGlzLnN1YmplY3QxLmFkZERlc2NyaXB0aW9uKG5vZGUsICJkZXNjcmlwdGlvbiAxLjEuMiIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbihyb290LCAiZGVzY3JpcHRpb24gMS4yIik7Ci0JCXRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb24obm9kZSwgImRlc2NyaXB0aW9uIDEuMi4xIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QxLmFkZERlc2NyaXB0aW9uKHJvb3QsICJkZXNjcmlwdGlvbiAxLjMiKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIxID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4odGhpcy5zdWJqZWN0MSk7Ci0JCXRoaXMuYWExID0gdGhpcy5idWlsZEFzcGVjdEFkYXB0ZXIodGhpcy5zdWJqZWN0SG9sZGVyMSk7Ci0JCXRoaXMubGlzdGVuZXIxID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuYWExLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy5saXN0ZW5lcjEpOwotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0KLQkJdGhpcy5zdWJqZWN0MiA9IG5ldyBUZXN0U3ViamVjdCgpOwotCi0JCXJvb3QgPSB0aGlzLnN1YmplY3QyLmdldFJvb3ROYW1lTm9kZSgpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0Mi5hZGROYW1lKHJvb3QsICJuYW1lIDIuMSIpOwotCQl0aGlzLnN1YmplY3QyLmFkZE5hbWUobm9kZSwgIm5hbWUgMi4xLjEiKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGROYW1lKG5vZGUsICJuYW1lIDIuMS4yIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QyLmFkZE5hbWUocm9vdCwgIm5hbWUgMi4yIik7Ci0JCXRoaXMuc3ViamVjdDIuYWRkTmFtZShub2RlLCAibmFtZSAyLjIuMSIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0Mi5hZGROYW1lKHJvb3QsICJuYW1lIDIuMyIpOwotCi0JCXJvb3QgPSB0aGlzLnN1YmplY3QyLmdldFJvb3REZXNjcmlwdGlvbk5vZGUoKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb24ocm9vdCwgImRlc2NyaXB0aW9uIDIuMSIpOwotCQl0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9uKG5vZGUsICJkZXNjcmlwdGlvbiAyLjEuMSIpOwotCQl0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9uKG5vZGUsICJkZXNjcmlwdGlvbiAyLjEuMiIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbihyb290LCAiZGVzY3JpcHRpb24gMi4yIik7Ci0JCXRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb24obm9kZSwgImRlc2NyaXB0aW9uIDIuMi4xIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9uKHJvb3QsICJkZXNjcmlwdGlvbiAyLjMiKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBMaXN0PFRlc3ROb2RlPj4gYnVpbGRBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyZWVBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBMaXN0PFRlc3ROb2RlPj4oc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRVNfVFJFRSkgewotCQkJLy8gdGhpcyBpcyBub3QgYSB0eXBpY2FsIGFzcGVjdCBhZGFwdGVyIC0gdGhlIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIGFzcGVjdCBuYW1lCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxMaXN0PFRlc3ROb2RlPj4gbm9kZXNfKCkgewotCQkJCWlmICh0aGlzLnRyZWVOYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19UUkVFKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZVBhdGhzKCk7Ci0JCQkJfQotCQkJCWlmICh0aGlzLnRyZWVOYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfVFJFRSkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmRlc2NyaXB0aW9uUGF0aHMoKTsKLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMudHJlZU5hbWVzWzBdKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBlKSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBlKSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGUpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHZhbHVlMUNoYW5nZWQoVHJlZUV2ZW50IGUpIHsKLQkJdGhpcy5ldmVudDEgPSBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoVHJlZVZhbHVlTW9kZWwuTk9ERVMsIHRoaXMuZXZlbnQxLmdldFRyZWVOYW1lKCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy5ldmVudDEuZ2V0VHJlZU5hbWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0MSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRyZWVWYWx1ZU1vZGVsLk5PREVTLCB0aGlzLmV2ZW50MS5nZXRUcmVlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZVN0cnVjdHVyZUNoYW5nZSgpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5hZGRUd29OYW1lcyh0aGlzLnN1YmplY3QxLmdldFJvb3ROYW1lTm9kZSgpLCAiamFtIiwgImpheiIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy5ldmVudDEuZ2V0VHJlZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5jb250YWluc05hbWVOb2RlKCJqYW0iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5jb250YWluc05hbWVOb2RlKCJqYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vZGVzKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5jb252ZXJ0VG9OYW1lcyh0aGlzLnN1YmplY3QxLm5hbWVQYXRocygpKSwgdGhpcy5jb252ZXJ0VG9OYW1lcyh0aGlzLmFhMS5ub2RlcygpKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gY29udmVydFRvTmFtZXMoSXRlcmF0b3I8TGlzdDxUZXN0Tm9kZT4+IG5hbWVQYXRocykgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQl3aGlsZSAobmFtZVBhdGhzLmhhc05leHQoKSkgewotCQkJTGlzdDxUZXN0Tm9kZT4gcGF0aCA9IG5hbWVQYXRocy5uZXh0KCk7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzYi5hcHBlbmQoJ1snKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aC5zaXplKCk7IGkrKykgewotCQkJCXNiLmFwcGVuZChwYXRoLmdldChpKS5nZXRUZXh0KCkpOwotCQkJCWlmIChpIDwgcGF0aC5zaXplKCkgLSAxKSB7Ci0JCQkJCXNiLmFwcGVuZCgnOicpOwotCQkJCX0KLQkJCX0KLQkJCXNiLmFwcGVuZCgnXScpOwotCQkJcmVzdWx0LmFkZChzYi50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUcmVlVmFsdWVNb2RlbC5OT0RFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19UUkVFKSk7Ci0JCXRoaXMuYWExLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfVFJFRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRyZWVWYWx1ZU1vZGVsLk5PREVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuYWExLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUcmVlVmFsdWVNb2RlbC5OT0RFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19UUkVFKSk7Ci0JCXRoaXMuYWExLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19UUkVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVHJlZVZhbHVlTW9kZWwuTk9ERVMpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCQotCWNsYXNzIFRlc3RTdWJqZWN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgVGVzdE5vZGUgcm9vdE5hbWVOb2RlOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU19UUkVFID0gIm5hbWVzIjsKLQkJcHJpdmF0ZSBUZXN0Tm9kZSByb290RGVzY3JpcHRpb25Ob2RlOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTlNfVFJFRSA9ICJkZXNjcmlwdGlvbnMiOwotCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoKSB7Ci0JCQl0aGlzLnJvb3ROYW1lTm9kZSA9IG5ldyBUZXN0Tm9kZSgicm9vdCBuYW1lIik7Ci0JCQl0aGlzLnJvb3REZXNjcmlwdGlvbk5vZGUgPSBuZXcgVGVzdE5vZGUoInJvb3QgZGVzY3JpcHRpb24iKTsKLQkJfQotCQlwdWJsaWMgVGVzdE5vZGUgZ2V0Um9vdE5hbWVOb2RlKCkgewotCQkJcmV0dXJuIHRoaXMucm9vdE5hbWVOb2RlOwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxUZXN0Tm9kZT4gbmFtZU5vZGVzKCkgewotCQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3I8VGVzdE5vZGU+KHRoaXMucm9vdE5hbWVOb2RlKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIEl0ZXJhdG9yPFRlc3ROb2RlPiBjaGlsZHJlbihUZXN0Tm9kZSBuZXh0KSB7Ci0JCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8TGlzdDxUZXN0Tm9kZT4+IG5hbWVQYXRocygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUZXN0Tm9kZSwgTGlzdDxUZXN0Tm9kZT4+KHRoaXMubmFtZU5vZGVzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTGlzdDxUZXN0Tm9kZT4gdHJhbnNmb3JtKFRlc3ROb2RlIG5leHQpIHsKLQkJCQkJcmV0dXJuIG5leHQuZ2V0UGF0aCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcHVibGljIFRlc3ROb2RlIGFkZE5hbWUoVGVzdE5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJVGVzdE5vZGUgY2hpbGQgPSBuZXcgVGVzdE5vZGUobmFtZSk7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQoY2hpbGQpOwotCQkJdGhpcy5maXJlTm9kZUFkZGVkKE5BTUVTX1RSRUUsIGNoaWxkLmdldFBhdGgoKSk7Ci0JCQlyZXR1cm4gY2hpbGQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkVHdvTmFtZXMoVGVzdE5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQkJcGFyZW50LmFkZENoaWxkKG5ldyBUZXN0Tm9kZShuYW1lMSkpOwotCQkJcGFyZW50LmFkZENoaWxkKG5ldyBUZXN0Tm9kZShuYW1lMikpOwotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoTkFNRVNfVFJFRSwgcGFyZW50LmdldFBhdGgoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTmFtZU5vZGUoVGVzdE5vZGUgbmFtZU5vZGUpIHsKLQkJCW5hbWVOb2RlLmdldFBhcmVudCgpLnJlbW92ZUNoaWxkKG5hbWVOb2RlKTsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKE5BTUVTX1RSRUUsIG5hbWVOb2RlLmdldFBhdGgoKSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnNOYW1lTm9kZShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIHRoaXMubmFtZU5vZGUobmFtZSkgIT0gbnVsbDsKLQkJfQotCQlwdWJsaWMgVGVzdE5vZGUgbmFtZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCWZvciAoSXRlcmF0b3I8VGVzdE5vZGU+IHN0cmVhbSA9IHRoaXMubmFtZU5vZGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVRlc3ROb2RlIG5vZGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChub2RlLmdldFRleHQoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIFRlc3ROb2RlIGdldFJvb3REZXNjcmlwdGlvbk5vZGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5yb290RGVzY3JpcHRpb25Ob2RlOwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxUZXN0Tm9kZT4gZGVzY3JpcHRpb25Ob2RlcygpIHsKLQkJCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yPFRlc3ROb2RlPih0aGlzLnJvb3REZXNjcmlwdGlvbk5vZGUpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgSXRlcmF0b3I8VGVzdE5vZGU+IGNoaWxkcmVuKFRlc3ROb2RlIG5leHQpIHsKLQkJCQkJcmV0dXJuIG5leHQuY2hpbGRyZW4oKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxMaXN0PFRlc3ROb2RlPj4gZGVzY3JpcHRpb25QYXRocygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUZXN0Tm9kZSwgTGlzdDxUZXN0Tm9kZT4+KHRoaXMuZGVzY3JpcHRpb25Ob2RlcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExpc3Q8VGVzdE5vZGU+IHRyYW5zZm9ybShUZXN0Tm9kZSBuZXh0KSB7Ci0JCQkJCXJldHVybiBuZXh0LmdldFBhdGgoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXB1YmxpYyBUZXN0Tm9kZSBhZGREZXNjcmlwdGlvbihUZXN0Tm9kZSBwYXJlbnQsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJVGVzdE5vZGUgY2hpbGQgPSBuZXcgVGVzdE5vZGUoZGVzY3JpcHRpb24pOwotCQkJcGFyZW50LmFkZENoaWxkKGNoaWxkKTsKLQkJCXRoaXMuZmlyZU5vZGVBZGRlZChERVNDUklQVElPTlNfVFJFRSwgY2hpbGQuZ2V0UGF0aCgpKTsKLQkJCXJldHVybiBjaGlsZDsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVEZXNjcmlwdGlvbk5vZGUoVGVzdE5vZGUgZGVzY3JpcHRpb25Ob2RlKSB7Ci0JCQlkZXNjcmlwdGlvbk5vZGUuZ2V0UGFyZW50KCkucmVtb3ZlQ2hpbGQoZGVzY3JpcHRpb25Ob2RlKTsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKERFU0NSSVBUSU9OU19UUkVFLCBkZXNjcmlwdGlvbk5vZGUuZ2V0UGF0aCgpKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0Rlc2NyaXB0aW9uTm9kZShTdHJpbmcgbmFtZSkgewotCQkJZm9yIChJdGVyYXRvcjxUZXN0Tm9kZT4gc3RyZWFtID0gdGhpcy5kZXNjcmlwdGlvbk5vZGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVRlc3ROb2RlIG5vZGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChub2RlLmdldFRleHQoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCWNsYXNzIFRlc3ROb2RlIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGV4dDsKLQkJcHJpdmF0ZSBUZXN0Tm9kZSBwYXJlbnQ7Ci0JCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxUZXN0Tm9kZT4gY2hpbGRyZW47Ci0JCi0JCXB1YmxpYyBUZXN0Tm9kZShTdHJpbmcgdGV4dCkgewotCQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJCXRoaXMuY2hpbGRyZW4gPSBuZXcgSGFzaEJhZzxUZXN0Tm9kZT4oKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy50ZXh0OwotCQl9Ci0JCXB1YmxpYyBUZXN0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JCX0KLQkJcHJpdmF0ZSB2b2lkIHNldFBhcmVudChUZXN0Tm9kZSBwYXJlbnQpIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxUZXN0Tm9kZT4gY2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8VGVzdE5vZGU+KHRoaXMuY2hpbGRyZW4pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFRlc3ROb2RlIGNoaWxkKSB7Ci0JCQl0aGlzLmNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoVGVzdE5vZGUgY2hpbGQpIHsKLQkJCXRoaXMuY2hpbGRyZW4ucmVtb3ZlKGNoaWxkKTsKLQkJfQotCQlwdWJsaWMgTGlzdDxUZXN0Tm9kZT4gZ2V0UGF0aCgpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QodGhpcy5idWlsZEFudGlQYXRoKCkpOwotCQl9Ci0JCXByaXZhdGUgSXRlcmF0b3I8VGVzdE5vZGU+IGJ1aWxkQW50aVBhdGgoKSB7Ci0JCQlyZXR1cm4gbmV3IENoYWluSXRlcmF0b3I8VGVzdE5vZGU+KHRoaXMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgVGVzdE5vZGUgbmV4dExpbmsoVGVzdE5vZGUgY3VycmVudExpbmspIHsKLQkJCQkJcmV0dXJuIGN1cnJlbnRMaW5rLmdldFBhcmVudCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3ROb2RlKCIgKyB0aGlzLnRleHQgKyAiKSI7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ29sbGVjdGlvbkFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjllNWU3Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ29sbGVjdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVDb2xsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGp1bms7Ci0JcHJpdmF0ZSBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4ganVua0hvbGRlcjsKLQlwcml2YXRlIFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXI8SnVuaz4ganVua0hvbGRlcjI7Ci0KLQotCXB1YmxpYyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qdW5rID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmp1bmtIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+KHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIgPSBuZXcgVmFsdWVDb2xsZWN0aW9uQWRhcHRlcjxKdW5rPih0aGlzLmp1bmtIb2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXcmFwcGVkUFZNKCkgewotCQlKdW5rIGp1bmsyID0gbmV3IEp1bmsoImJhciIpOwotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCB0aGlzLmp1bmssIGp1bmsyKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rSG9sZGVyLnNldFZhbHVlKGp1bmsyKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVuay5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkFkZCgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMik7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rLmFkZFN0dWZmKCJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25SZW1vdmUoKSB7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5yZW1vdmVTdHVmZigiZm9vIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCi0JY2xhc3MgTG9jYWxMaXN0ZW5lciBleHRlbmRzIENoYW5nZUFkYXB0ZXIgewotCQlwcml2YXRlIGJvb2xlYW4gZXZlbnRSZWNlaXZlZCA9IGZhbHNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBzb3VyY2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG9sZFZhbHVlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBuZXdWYWx1ZTsKLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlKSB7Ci0JCQl0aGlzKHNvdXJjZSwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQkJYm9vbGVhbiBldmVudFJlY2VpdmVkKCkgewotCQkJcmV0dXJuIHRoaXMuZXZlbnRSZWNlaXZlZDsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHN0dWZmOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RVRkZfQ09MTEVDVElPTiA9ICJzdHVmZiI7Ci0KLQkJcHVibGljIEp1bmsoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5zdHVmZiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJdGhpcy5zdHVmZi5hZGQoc3R1ZmZJdGVtKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBhZGRTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oc3R1ZmZJdGVtLCB0aGlzLnN0dWZmLCBTVFVGRl9DT0xMRUNUSU9OKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oc3R1ZmZJdGVtLCB0aGlzLnN0dWZmLCBTVFVGRl9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5zdHVmZiArICIpIjsKLQkJfQotCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVMaXN0QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZDNjMjUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlZhbHVlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVmFsdWVMaXN0QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBqdW5rOwotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+IGp1bmtIb2xkZXI7Ci0JcHJpdmF0ZSBWYWx1ZUxpc3RBZGFwdGVyPEp1bms+IGp1bmtIb2xkZXIyOwotCi0JCi0JcHVibGljIFZhbHVlTGlzdEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmp1bmsgPSBuZXcgSnVuaygiZm9vIik7Ci0JCXRoaXMuanVua0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4odGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMiA9IG5ldyBWYWx1ZUxpc3RBZGFwdGVyPEp1bms+KHRoaXMuanVua0hvbGRlciwgSnVuay5TVFVGRl9MSVNUKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdyYXBwZWRQVk0oKSB7Ci0JCUp1bmsganVuazIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIHRoaXMuanVuaywganVuazIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmtIb2xkZXIuc2V0VmFsdWUoanVuazIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0QWRkKCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5hZGRTdHVmZigiYmFyIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0UmVtb3ZlKCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5yZW1vdmVTdHVmZigiZm9vIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0UmVwbGFjZSgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsucmVwbGFjZVN0dWZmKCJmb28iLCAiYmFyIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCi0JY2xhc3MgTG9jYWxMaXN0ZW5lciBleHRlbmRzIENoYW5nZUFkYXB0ZXIgewotCQlwcml2YXRlIGJvb2xlYW4gZXZlbnRSZWNlaXZlZCA9IGZhbHNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBzb3VyY2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG9sZFZhbHVlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBuZXdWYWx1ZTsKLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlKSB7Ci0JCQl0aGlzKHNvdXJjZSwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQkJYm9vbGVhbiBldmVudFJlY2VpdmVkKCkgewotCQkJcmV0dXJuIHRoaXMuZXZlbnRSZWNlaXZlZDsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdHVmZjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUZGX0xJU1QgPSAic3R1ZmYiOwotCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuc3R1ZmYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXRoaXMuc3R1ZmYuYWRkKHN0dWZmSXRlbSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgYWRkU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfTElTVCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfTElTVCk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcmVwbGFjZVN0dWZmKFN0cmluZyBvbGRTdHVmZkl0ZW0sIFN0cmluZyBuZXdTdHVmZkl0ZW0pIHsKLQkJCXRoaXMucmVwbGFjZUl0ZW1Jbkxpc3Qob2xkU3R1ZmZJdGVtLCBuZXdTdHVmZkl0ZW0sIHRoaXMuc3R1ZmYsIFNUVUZGX0xJU1QpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLnN0dWZmICsgIikiOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlUHJvcGVydHlBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzkxMjQ4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5WYWx1ZVByb3BlcnR5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBWYWx1ZVByb3BlcnR5QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBqdW5rOwotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+IGp1bmtIb2xkZXI7Ci0JcHJpdmF0ZSBWYWx1ZVByb3BlcnR5QWRhcHRlcjxKdW5rPiBqdW5rSG9sZGVyMjsKLQotCi0JcHVibGljIFZhbHVlUHJvcGVydHlBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qdW5rID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmp1bmtIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+KHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIgPSBuZXcgVmFsdWVQcm9wZXJ0eUFkYXB0ZXI8SnVuaz4odGhpcy5qdW5rSG9sZGVyLCBKdW5rLk5BTUVfUFJPUEVSVFkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlZFBWTSgpIHsKLQkJSnVuayBqdW5rMiA9IG5ldyBKdW5rKCJiYXIiKTsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgdGhpcy5qdW5rLCBqdW5rMik7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVua0hvbGRlci5zZXRWYWx1ZShqdW5rMik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhKdW5rLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEp1bmsuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoSnVuay5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVByb3BlcnR5KCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0KLQljbGFzcyBMb2NhbExpc3RlbmVyIGV4dGVuZHMgQ2hhbmdlQWRhcHRlciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBldmVudFJlY2VpdmVkID0gZmFsc2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IHNvdXJjZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG5ld1ZhbHVlOwotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UpIHsKLQkJCXRoaXMoc291cmNlLCBudWxsLCBudWxsKTsKLQkJfQotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0JCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnRSZWNlaXZlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMub2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5uZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJfQotCQlib29sZWFuIGV2ZW50UmVjZWl2ZWQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmVudFJlY2VpdmVkOwotCQl9Ci0JfQotCi0JY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQotCQlwdWJsaWMgSnVuayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlU3RhdGVBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVTdGF0ZUFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDAwMmUzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVTdGF0ZUFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5WYWx1ZVN0YXRlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBWYWx1ZVN0YXRlQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBqdW5rOwotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+IGp1bmtIb2xkZXI7Ci0JcHJpdmF0ZSBWYWx1ZVN0YXRlQWRhcHRlcjxKdW5rPiBqdW5rSG9sZGVyMjsKLQotCi0JcHVibGljIFZhbHVlU3RhdGVBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qdW5rID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmp1bmtIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+KHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIgPSBuZXcgVmFsdWVTdGF0ZUFkYXB0ZXI8SnVuaz4odGhpcy5qdW5rSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdyYXBwZWRQVk0oKSB7Ci0JCUp1bmsganVuazIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIHRoaXMuanVuaywganVuazIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmtIb2xkZXIuc2V0VmFsdWUoanVuazIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVuay5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VTdGF0ZSgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCi0JY2xhc3MgTG9jYWxMaXN0ZW5lciBleHRlbmRzIENoYW5nZUFkYXB0ZXIgewotCQlwcml2YXRlIGJvb2xlYW4gZXZlbnRSZWNlaXZlZCA9IGZhbHNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBzb3VyY2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG9sZFZhbHVlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBuZXdWYWx1ZTsKLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlKSB7Ci0JCQl0aGlzKHNvdXJjZSwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQkJYm9vbGVhbiBldmVudFJlY2VpdmVkKCkgewotCQkJcmV0dXJuIHRoaXMuZXZlbnRSZWNlaXZlZDsKLQkJfQotCX0KLQotCWNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkJcHVibGljIEp1bmsoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL0pwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9KcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzZGEwNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL0pwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHMgewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXByaXZhdGUgSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkYzc3Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnMuUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFByZWZlcmVuY2VzVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJlZmVyZW5jZXM+IG5vZGVIb2xkZXI7Ci0JUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHByZWZlcmVuY2VBZGFwdGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQlib29sZWFuIGxpc3RlbmVyUmVtb3ZlZCA9IGZhbHNlOwotCVByZWZlcmVuY2VDaGFuZ2VFdmVudCBwcmVmZXJlbmNlRXZlbnQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FID0gImZvbyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19WQUxVRSA9ICJvcmlnaW5hbCBzdHJpbmcgdmFsdWUiOwotCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFKTsKLQotCQl0aGlzLm5vZGVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFByZWZlcmVuY2VzPih0aGlzLnRlc3ROb2RlKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlciA9IG5ldyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5ub2RlSG9sZGVyLCBLRVlfTkFNRSk7Ci0JCXRoaXMubGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ICE9IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCB0aGlzLmV2ZW50OiAiICsgZSk7Ci0JCQkJfQotCQkJCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRSA9ICJzb21lIG90aGVyIHZhbHVlIjsKLQkJUHJlZmVyZW5jZXMgYW5vdGhlck5vZGUgPSB0aGlzLmNsYXNzTm9kZS5ub2RlKCJhbm90aGVyIHRlc3Qgbm9kZSIpOwotCQlhbm90aGVyTm9kZS5wdXQoS0VZX05BTUUsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQl0aGlzLm5vZGVIb2xkZXIuc2V0VmFsdWUoYW5vdGhlck5vZGUpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoQU5PVEhFUl9TVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFOT1RIRVJfU1RSSU5HX1ZBTFVFLCBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3ROb2RlKTsKLQkJdGhpcy52ZXJpZnlFdmVudChudWxsLCBTVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmVmZXJlbmNlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUUsIFNUUklOR19WQUxVRSArIFNUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoU1RSSU5HX1ZBTFVFLCBTVFJJTkdfVkFMVUUgKyBTVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFICsgU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudGVzdE5vZGUucmVtb3ZlKEtFWV9OQU1FKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUgKyBTVFJJTkdfVkFMVUUsIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUUsIFNUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQobnVsbCwgU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsICI8bWlzc2luZyBwcmVmZXJlbmNlPiIpKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFID0gInNvbWUgb3RoZXIgdmFsdWUiOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnNldFZhbHVlKEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKEFOT1RIRVJfU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQU5PVEhFUl9TVFJJTkdfVkFMVUUsIHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCAiPG1pc3NpbmcgcHJlZmVyZW5jZT4iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSB0aGlzLmJ1aWxkQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgIT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCQl9Ci0JCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbmRSZUFkZFByZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQkvLyByZW1vdmUgdGhlIHByZWZlcmVuY2UgZW50aXJlbHkuLi4KLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlhc3NlcnROdWxsKHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCBudWxsKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoU1RSSU5HX1ZBTFVFLCBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCS8vIC4uLnRoZW4gcmUtYWRkIGl0IHdpdGggdGhlIHNhbWUga2V5Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChudWxsLCBTVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gcmVidWlsZCB0aGUgYWRhcHRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZQotCQlTdHJpbmcgREVGQVVMVF9WQUxVRSA9ICJkZWZhdWx0IHZhbHVlIjsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIgPSBuZXcgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMubm9kZUhvbGRlciwgS0VZX05BTUUsIERFRkFVTFRfVkFMVUUpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgbnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCS8vIHJlbW92ZSB0aGUgcHJlZmVyZW5jZSBlbnRpcmVseS4uLgotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZShLRVlfTkFNRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCWFzc2VydE51bGwodGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUsIERFRkFVTFRfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoREVGQVVMVF9WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQkvLyAuLi50aGVuIHJlLWFkZCBpdCB3aXRoIHRoZSBzYW1lIGtleQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUUsIFNUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCBudWxsKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoREVGQVVMVF9WQUxVRSwgU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCS8vIHJlbW92ZSB0aGUgdGhpcy5saXN0ZW5lciBzbyB0aGUgYWRhcHRlciBubyBsb25nZXIgbGlzdGVucyB0byB0aGUgcHJlZmVyZW5jZQotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFICsgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJLy8gbm8gdGhpcy5ldmVudCBzaG91bGQgaGF2ZSBiZWVuIGZpcmVkLi4uCi0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JCS8vIC4uLmFuZCB0aGUgYWRhcHRlcidzIHZhbHVlIHNob3VsZCBiZSBudWxsCi0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMudGVzdE5vZGUucmVtb3ZlKEtFWV9OQU1FKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUUsIFNUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQkvLyBhZGQgdGhlIHRoaXMubGlzdGVuZXIgc28gdGhlIGFkYXB0ZXIgc3luY2hzCi0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyUHJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBzdG9wIGxpc3RlbmluZyB0byB0aGUgbm9kZSBhbmQgY29udmVydCBpdCB0byBhbiBpbnRlZ2VyCi0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCi0JCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyID0gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4odGhpcy5ub2RlSG9sZGVyLCBLRVlfTkFNRSk7Ci0JCXRoaXMudGVzdE5vZGUucHV0SW50KEtFWV9OQU1FLCAxMjMpOwotCQlpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIgPSBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsLmZvckludGVnZXIodGhpcy50ZXN0Tm9kZSwgS0VZX05BTUUsIDApOwotCQlpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIzKSwgaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMudGVzdE5vZGUucHV0SW50KEtFWV9OQU1FLCAyNDYpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGludGVnZXJQcmVmZXJlbmNlQWRhcHRlciwgbmV3IEludGVnZXIoMTIzKSwgbmV3IEludGVnZXIoMjQ2KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigyNDYpLCBpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGludGVnZXJQcmVmZXJlbmNlQWRhcHRlciwgbmV3IEludGVnZXIoMjQ2KSwgbmV3IEludGVnZXIoMCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIGludGVnZXJQcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnB1dEludChLRVlfTkFNRSwgMTIzKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudChpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIsIG5ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcigxMjMpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyMyksIGludGVnZXJQcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IGEgc2l0dWF0aW9uIHdoZXJlCi0JICogLSB3ZSBhcmUgbGlzdGVuaW5nIHRvIHRoZSBub2RlIHdoZW4gaXQgZ2V0cyByZW1vdmVkIGZyb20gdGhlIHByZWZlcmVuY2VzICJyZXBvc2l0b3J5IgotCSAqIC0gd2UgZ2V0IG5vdGlmaWNhdGlvbiB0aGF0IGl0IGhhcyBiZWVuIHJlbW92ZWQKLQkgKiAtIHdlIHRyeSB0byByZW1vdmUgb3VyIHRoaXMubGlzdGVuZXIKLQkgKiAtIHRoZSBub2RlIHdpbGwgdGhyb3cgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIC0gdGhlIGFkYXB0ZXIgc2hvdWxkIGhhbmRsZSBpdCBPSy4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlQcmVmZXJlbmNlcyBwYXJlbnQgPSB0aGlzLnRlc3ROb2RlLnBhcmVudCgpOwotCQlwYXJlbnQuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRQYXJlbnROb2RlQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMudGVzdE5vZGUucmVtb3ZlTm9kZSgpOwotCQl0aGlzLnRlc3ROb2RlLmZsdXNoKCk7CQkvLyB0aGlzIHNlZW1zIHRvIGJlIHJlcXVpcmVkIGZvciB0aGUgdGhpcy5ldmVudCB0byB0cmlnZ2VyLi4uCi0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RlbmVyUmVtb3ZlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXByaXZhdGUgTm9kZUNoYW5nZUxpc3RlbmVyIGJ1aWxkUGFyZW50Tm9kZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoaWxkQWRkZWQoTm9kZUNoYW5nZUV2ZW50IGUpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoaWxkUmVtb3ZlZChOb2RlQ2hhbmdlRXZlbnQgZSkgewotCQkJCWlmIChlLmdldENoaWxkKCkgPT0gUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMudGVzdE5vZGUpIHsKLQkJCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMucHJlZmVyZW5jZUFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmxpc3RlbmVyKTsKLQkJCQkJLy8gdGhpcyBsaW5lIG9mIGNvZGUgd2lsbCBub3QgZXhlY3V0ZSBpZiB0aGUgbGluZSBhYm92ZSB0cmlnZ2VycyBhbiBleGNlcHRpb24KLQkJCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMubGlzdGVuZXJSZW1vdmVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNhbWVWYWx1ZSgpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VFdmVudCk7Ci0JCXRoaXMudGVzdE5vZGUuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSk7Ci0KLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFID0gInNvbWUgb3RoZXIgdmFsdWUiOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnNldFZhbHVlKEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeVByZWZlcmVuY2VFdmVudChBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJLy8gbm93IHNldCB0byAqc2FtZSogdmFsdWUgLSBub3RoaW5nIHNob3VsZCBoYXBwZW4uLi4KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHJlZmVyZW5jZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5zZXRWYWx1ZShBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VFdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNhbWVWYWx1ZUZvcmNlUGFzc1Rocm91Z2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VFdmVudCk7Ci0KLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIgPSBuZXcgQWx3YXlzVXBkYXRlUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMubm9kZUhvbGRlciwgS0VZX05BTUUpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQotCQl0aGlzLnRlc3ROb2RlLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkpOwotCi0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRSA9ICJzb21lIG90aGVyIHZhbHVlIjsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5zZXRWYWx1ZShBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlQcmVmZXJlbmNlRXZlbnQoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCi0JCS8vIG5vdyBzZXQgdG8gKnNhbWUqIHZhbHVlIC0gb25seSBvbmUgdGhpcy5ldmVudCBzaG91bGQgZmlyZQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcmVmZXJlbmNlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnNldFZhbHVlKEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeVByZWZlcmVuY2VFdmVudChBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJlZmVyZW5jZUNoYW5nZShQcmVmZXJlbmNlQ2hhbmdlRXZlbnQgZXZ0KSB7Ci0JCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMucHJlZmVyZW5jZUV2ZW50ID0gZXZ0OwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChNb2RlbCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCB0aGlzLmV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIHRoaXMuZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5wcmVmZXJlbmNlQWRhcHRlciwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJlZmVyZW5jZUV2ZW50KE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMucHJlZmVyZW5jZUV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE5vZGUsIHRoaXMucHJlZmVyZW5jZUV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEtFWV9OQU1FLCB0aGlzLnByZWZlcmVuY2VFdmVudC5nZXRLZXkoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy5wcmVmZXJlbmNlRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsICI8bWlzc2luZyBwcmVmZXJlbmNlPiIpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbm9kZUhhc0FueVByZWZMaXN0ZW5lcnMoUHJlZmVyZW5jZXMgbm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcltdIHByZWZMaXN0ZW5lcnMgPSAoUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyW10pIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKG5vZGUsICJwcmVmTGlzdGVuZXJzIik7Ci0JCXJldHVybiBwcmVmTGlzdGVuZXJzLmxlbmd0aCA+IDA7Ci0JfQotCi0KLQkvKioKLQkgKiBVc2UgdGhpcyBhZGFwdGVyIHRvIHRlc3Qgb3V0IGFsd2F5cyBwYXNzaW5nIHRocm91Z2ggdGhlIG5ldyB2YWx1ZQotCSAqIHRvIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXByaXZhdGUgY2xhc3MgQWx3YXlzVXBkYXRlUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBleHRlbmRzIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gewotCi0JCUFsd2F5c1VwZGF0ZVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPFByZWZlcmVuY2VzPiBwcmVmZXJlbmNlc0hvbGRlciwgU3RyaW5nIGtleSkgewotCQkJc3VwZXIocHJlZmVyZW5jZXNIb2xkZXIsIGtleSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2V0UHJlZmVyZW5jZShPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MDQyOWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzLlByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnMuUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgUHJlZmVyZW5jZXNUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkVmFsdWVzOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJlZmVyZW5jZXM+IG5vZGVIb2xkZXI7Ci0JUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHByZWZlcmVuY2VzQWRhcHRlcjsKLQlDb2xsZWN0aW9uRXZlbnQgZXZlbnQ7Ci0JQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpdGVtTGlzdGVuZXI7Ci0JYm9vbGVhbiBsaXN0ZW5lclJlbW92ZWQgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUVfMSA9ICJmb28gMSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FXzIgPSAiZm9vIDIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRV8zID0gImZvbyAzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1ZBTFVFXzEgPSAib3JpZ2luYWwgc3RyaW5nIHZhbHVlIDEiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfVkFMVUVfMiA9ICJvcmlnaW5hbCBzdHJpbmcgdmFsdWUgMiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19WQUxVRV8zID0gIm9yaWdpbmFsIHN0cmluZyB2YWx1ZSAzIjsKLQotCXB1YmxpYyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRV8xLCBTVFJJTkdfVkFMVUVfMSk7CXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzEsIFNUUklOR19WQUxVRV8xKTsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUVfMiwgU1RSSU5HX1ZBTFVFXzIpOwl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8yLCBTVFJJTkdfVkFMVUVfMik7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FXzMsIFNUUklOR19WQUxVRV8zKTsJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoS0VZX05BTUVfMywgU1RSSU5HX1ZBTFVFXzMpOwotCi0JCXRoaXMubm9kZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJlZmVyZW5jZXM+KHRoaXMudGVzdE5vZGUpOwotCQl0aGlzLnByZWZlcmVuY2VzQWRhcHRlciA9IG5ldyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5ub2RlSG9sZGVyKTsKLQkJdGhpcy5saXN0ZW5lciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5pdGVtTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbUxpc3RlbmVyKCk7Ci0JCXRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMubGlzdGVuZXIpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQl0aGlzLmxvZ0V2ZW50KGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCXByaXZhdGUgdm9pZCBsb2dFdmVudChDb2xsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCAhPSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgdGhpcy5ldmVudDogIiArIGUpOwotCQkJCX0KLQkJCQlQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkSXRlbUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCB0aGlzLmV2ZW50OiAiICsgZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQlTdHJpbmcgQU5PVEhFUl9LRVlfTkFNRV8xID0gImFub3RoZXIga2V5IDEiOwotCQlTdHJpbmcgQU5PVEhFUl9LRVlfTkFNRV8yID0gImFub3RoZXIga2V5IDIiOwotCQlTdHJpbmcgQU5PVEhFUl9LRVlfTkFNRV8zID0gImFub3RoZXIga2V5IDMiOwotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMSA9ICJhbm90aGVyIHN0cmluZyB2YWx1ZSAxIjsKLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzIgPSAiYW5vdGhlciBzdHJpbmcgdmFsdWUgMiI7Ci0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRV8zID0gImFub3RoZXIgc3RyaW5nIHZhbHVlIDMiOwotCQlQcmVmZXJlbmNlcyBhbm90aGVyTm9kZSA9IHRoaXMuY2xhc3NOb2RlLm5vZGUoImFub3RoZXIgdGVzdCBub2RlIik7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMuY2xlYXIoKTsKLQkJYW5vdGhlck5vZGUucHV0KEFOT1RIRVJfS0VZX05BTUVfMSwgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMSk7CXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEFOT1RIRVJfS0VZX05BTUVfMSwgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMSk7Ci0JCWFub3RoZXJOb2RlLnB1dChBTk9USEVSX0tFWV9OQU1FXzIsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzIpOwl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChBTk9USEVSX0tFWV9OQU1FXzIsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzIpOwotCQlhbm90aGVyTm9kZS5wdXQoQU5PVEhFUl9LRVlfTkFNRV8zLCBBTk9USEVSX1NUUklOR19WQUxVRV8zKTsJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoQU5PVEhFUl9LRVlfTkFNRV8zLCBBTk9USEVSX1NUUklOR19WQUxVRV8zKTsKLQotCQl0aGlzLm5vZGVIb2xkZXIuc2V0VmFsdWUoYW5vdGhlck5vZGUpOwotCQkvLyBjb2xsZWN0aW9uQ2hhbmdlZCBkb2VzIG5vdCBwYXNzIGFueSBpdGVtcyBpbiB0aGUgdGhpcy5ldmVudAotCQl0aGlzLnZlcmlmeUV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5jbGVhcigpOwotCQl0aGlzLm5vZGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3ROb2RlKTsKLQkJdGhpcy52ZXJpZnlFdmVudCgpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLmNsZWFyKCk7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzEsIFNUUklOR19WQUxVRV8xKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoS0VZX05BTUVfMiwgU1RSSU5HX1ZBTFVFXzIpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8zLCBTVFJJTkdfVkFMVUVfMyk7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFByZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQlTdHJpbmcgQU5PVEhFUl9LRVlfTkFNRSA9ICJhbm90aGVyIGtleSI7Ci0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRSA9ICJhbm90aGVyIHN0cmluZyB2YWx1ZSI7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEFOT1RIRVJfS0VZX05BTUUsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJTWFwPFN0cmluZywgU3RyaW5nPiBleHBlY3RlZEl0ZW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWV4cGVjdGVkSXRlbXMucHV0KEFOT1RIRVJfS0VZX05BTUUsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlFdmVudChleHBlY3RlZEl0ZW1zKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoQU5PVEhFUl9LRVlfTkFNRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUVfMik7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsICgoQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtc1NpemUoKSk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlTdHJpbmcga2V5ID0gKChQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4pICgoQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKS5nZXRLZXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEtFWV9OQU1FXzIsIGtleSk7Ci0KLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5yZW1vdmUoS0VZX05BTUVfMik7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVByZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQlTdHJpbmcgRElGRkVSRU5UID0gInNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCI7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FXzIsIERJRkZFUkVOVCk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8yLCBESUZGRVJFTlQpOwotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlOb2RlKHRoaXMudGVzdE5vZGUpOwotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgYSBzaXR1YXRpb24gd2hlcmUKLQkgKiAtIHdlIGFyZSBsaXN0ZW5pbmcgdG8gdGhlIG5vZGUgd2hlbiBpdCBnZXRzIHJlbW92ZWQgZnJvbSB0aGUgcHJlZmVyZW5jZXMgInJlcG9zaXRvcnkiCi0JICogLSB3ZSBnZXQgbm90aWZpY2F0aW9uIHRoYXQgaXQgaGFzIGJlZW4gcmVtb3ZlZAotCSAqIC0gd2UgdHJ5IHRvIHJlbW92ZSBvdXIgdGhpcy5saXN0ZW5lcgotCSAqIC0gdGhlIG5vZGUgd2lsbCB0aHJvdyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gLSB0aGUgYWRhcHRlciBzaG91bGQgaGFuZGxlIGl0IE9LLi4uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCVByZWZlcmVuY2VzIHBhcmVudCA9IHRoaXMudGVzdE5vZGUucGFyZW50KCk7Ci0JCXBhcmVudC5hZGROb2RlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFBhcmVudE5vZGVDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmVOb2RlKCk7Ci0JCXRoaXMudGVzdE5vZGUuZmx1c2goKTsJCS8vIHRoaXMgc2VlbXMgdG8gYmUgcmVxdWlyZWQgZm9yIHRoZSB0aGlzLmV2ZW50IHRvIHRyaWdnZXIuLi4KLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMubGlzdGVuZXJSZW1vdmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIE5vZGVDaGFuZ2VMaXN0ZW5lciBidWlsZFBhcmVudE5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBOb2RlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGlsZEFkZGVkKE5vZGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCB0aGlzLmV2ZW50OiAiICsgZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGlsZFJlbW92ZWQoTm9kZUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5nZXRDaGlsZCgpID09IFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnRlc3ROb2RlKSB7Ci0JCQkJCVByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnByZWZlcmVuY2VzQWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5saXN0ZW5lcik7Ci0JCQkJCS8vIHRoaXMgbGluZSBvZiBjb2RlIHdpbGwgbm90IGV4ZWN1dGUgaWYgdGhlIGxpbmUgYWJvdmUgdHJpZ2dlcnMgYW4gZXhjZXB0aW9uCi0JCQkJCVByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmxpc3RlbmVyUmVtb3ZlZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQl0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gdGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJdGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQl0aGlzLmxvZ0V2ZW50KGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQl0aGlzLmxvZ0V2ZW50KGUpOwotCQkJfQotCQkJcHJpdmF0ZSB2b2lkIGxvZ0V2ZW50KENvbGxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ICE9IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCB0aGlzLmV2ZW50OiAiICsgZSk7Ci0JCQkJfQotCQkJCVByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoTWFwPFN0cmluZywgU3RyaW5nPiBpdGVtcykgewotCQl0aGlzLnZlcmlmeUV2ZW50KCk7Ci0JCWFzc2VydEVxdWFscyhpdGVtcy5zaXplKCksICgoQ29sbGVjdGlvbkFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtc1NpemUoKSk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4+IGV2ZW50SXRlbXMgPSAoSXRlcmFibGU8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+PikgKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zKCk7Ci0JCXRoaXMudmVyaWZ5SXRlbXMoaXRlbXMsIGV2ZW50SXRlbXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudCgpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Tm9kZShQcmVmZXJlbmNlcyBub2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10ga2V5cyA9IG5vZGUua2V5cygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5leHBlY3RlZFZhbHVlcy5zaXplKCksIGtleXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5leHBlY3RlZFZhbHVlcy5nZXQoa2V5c1tpXSksIG5vZGUuZ2V0KGtleXNbaV0sICI8bWlzc2luZyBwcmVmZXJlbmNlPiIpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlBZGFwdGVyKFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjdm0pIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXhwZWN0ZWRWYWx1ZXMuc2l6ZSgpLCBjdm0uc2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlJdGVtcyh0aGlzLmV4cGVjdGVkVmFsdWVzLCBjdm0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlJdGVtcyhNYXA8U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkLCBJdGVyYWJsZTxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4+IGFjdHVhbCkgewotCQlmb3IgKFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBtb2RlbCA6IGFjdHVhbCkgewotCQkJbW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuaXRlbUxpc3RlbmVyKTsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZC5nZXQobW9kZWwuZ2V0S2V5KCkpLCBtb2RlbC5nZXRWYWx1ZSgpKTsKLQkJCW1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLml0ZW1MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbm9kZUhhc0FueVByZWZMaXN0ZW5lcnMoUHJlZmVyZW5jZXMgbm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcltdIHByZWZMaXN0ZW5lcnMgPSAoUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyW10pIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKG5vZGUsICJwcmVmTGlzdGVuZXJzIik7Ci0JCXJldHVybiBwcmVmTGlzdGVuZXJzLmxlbmd0aCA+IDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjIzYzdkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuQWJzdHJhY3RQcmVmZXJlbmNlczsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXM7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLS8qKgotICogc2V0IHVwIGFuZCB0ZWFyIGRvd24gYSB0ZXN0IG5vZGUgZm9yIGFueSBzdWJjbGFzcyB0aGF0Ci0gKiBuZWVkcyB0byB0ZXN0IHByZWZlcmVuY2VzLXJlbGF0ZWQgc3R1ZmYKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJlZmVyZW5jZXNUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgY2xhc3NOb2RlOwotCXB1YmxpYyBQcmVmZXJlbmNlcyB0ZXN0Tm9kZTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX05PREVfTkFNRSA9ICJ0ZXN0IG5vZGUiOwotCi0JcHVibGljIFByZWZlcmVuY2VzVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJUHJlZmVyZW5jZXMgcGFja2FnZU5vZGUgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UodGhpcy5nZXRDbGFzcygpKTsKLQkJdGhpcy5jbGFzc05vZGUgPSBwYWNrYWdlTm9kZS5ub2RlKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQkvLyBjbGVhbiBvdXQgYW55IGxlZnRvdmVyIGNyYXAuLi4KLQkJaWYgKCh0aGlzLmNsYXNzTm9kZS5rZXlzKCkubGVuZ3RoID4gMCkgfHwgKHRoaXMuY2xhc3NOb2RlLmNoaWxkcmVuTmFtZXMoKS5sZW5ndGggPiAwKSkgewotCQkJdGhpcy5jbGFzc05vZGUucmVtb3ZlTm9kZSgpOwotCQkJLy8gLi4uYW5kIHJlLWNyZWF0ZSB0aGUgbm9kZQotCQkJdGhpcy5jbGFzc05vZGUgPSBwYWNrYWdlTm9kZS5ub2RlKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQl9Ci0JCXRoaXMudGVzdE5vZGUgPSB0aGlzLmNsYXNzTm9kZS5ub2RlKFRFU1RfTk9ERV9OQU1FKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyB3YWl0IGZvciBhbGwgdGhlIGV2ZW50cyB0byBiZSBkZWxpdmVyZWQgYmVmb3JlIHRlYXJpbmcgZG93bgotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlQcmVmZXJlbmNlcyBub2RlID0gdGhpcy5jbGFzc05vZGUucGFyZW50KCk7Ci0JCXRoaXMuY2xhc3NOb2RlLnJlbW92ZU5vZGUoKTsKLQkJd2hpbGUgKHRoaXMubm9kZUlzVmVzdGlnaWFsKG5vZGUpKSB7Ci0JCQlQcmVmZXJlbmNlcyBwYXJlbnQgPSBub2RlLnBhcmVudCgpOwotCQkJbm9kZS5yZW1vdmVOb2RlKCk7Ci0JCQlub2RlID0gcGFyZW50OwotCQl9Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbm9kZUlzVmVzdGlnaWFsKFByZWZlcmVuY2VzIG5vZGUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gKG5vZGUgIT0gbnVsbCkKLQkJCSYmIChub2RlLmtleXMoKS5sZW5ndGggPT0gMCkKLQkJCSYmIChub2RlLmNoaWxkcmVuTmFtZXMoKS5sZW5ndGggPT0gMCkKLQkJCSYmIChub2RlICE9IFByZWZlcmVuY2VzLnVzZXJSb290KCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHdhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpIHsKLQkJd2hpbGUgKCAhIHRoaXMucHJlZmVyZW5jZXNFdmVudFF1ZXVlKCkuaXNFbXB0eSgpKSB7Ci0JCQlUZXN0VG9vbHMuc2xlZXAoMTAwKTsKLQkJfQotCQlUZXN0VG9vbHMuc2xlZXAoMTAwKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8RXZlbnRPYmplY3Q+IHByZWZlcmVuY2VzRXZlbnRRdWV1ZSgpIHsKLQkJcmV0dXJuIChMaXN0PEV2ZW50T2JqZWN0PikgUmVmbGVjdGlvblRvb2xzLmdldFN0YXRpY0ZpZWxkVmFsdWUoQWJzdHJhY3RQcmVmZXJlbmNlcy5jbGFzcywgImV2ZW50UXVldWUiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOWQ5MTEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNoZWNrQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXI7Ci0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBidXR0b25Nb2RlbEFkYXB0ZXI7Ci0JYm9vbGVhbiBldmVudEZpcmVkOwotCi0JcHVibGljIENoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5ib29sZWFuSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlciA9IG5ldyBDaGVja0JveE1vZGVsQWRhcHRlcih0aGlzLmJvb2xlYW5Ib2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZWxlY3RlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHRoaXMuYm9vbGVhbkhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydFRydWUodGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0KLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBsb2NhbEJvb2xlYW5Ib2xkZXIgPSAoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KSB0aGlzLmJvb2xlYW5Ib2xkZXI7Ci0JCWFzc2VydEZhbHNlKGxvY2FsQm9vbGVhbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbEJvb2xlYW5Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyKTsKLQotCQl0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKGxvY2FsQm9vbGVhbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKE9iamVjdCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IChFdmVudExpc3RlbmVyTGlzdCkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUobW9kZWwsICJsaXN0ZW5lckxpc3QiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gKEV2ZW50TGlzdGVuZXJMaXN0KSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShtb2RlbCwgImxpc3RlbmVyTGlzdCIpOwotCQlhc3NlcnRGYWxzZShsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCkubGVuZ3RoID09IDApOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3MgKioqKioqKioqKgotCXByaXZhdGUgY2xhc3MgVGVzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjZjExMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuSXRlbUxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNoZWNrQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5DaGVja0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiBjaGVjayBib3hlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMUhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGZsYWcySG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbm90RmxhZzJIb2xkZXI7Ci0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBmbGFnMUJ1dHRvbk1vZGVsOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgZmxhZzJCdXR0b25Nb2RlbDsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIG5vdEZsYWcyQnV0dG9uTW9kZWw7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IENoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYygpOwotCX0KLQotCXByaXZhdGUgQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKHRydWUsIHRydWUpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuZmxhZzFIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzFIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmZsYWcxQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5mbGFnMUhvbGRlcik7Ci0JCXRoaXMuZmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmZsYWcyQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5mbGFnMkhvbGRlcik7Ci0JCXRoaXMubm90RmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkTm90RmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLm5vdEZsYWcyQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5ub3RGbGFnMkhvbGRlcik7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHZtLCBUZXN0TW9kZWwuRkxBRzFfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzEodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHZtLCBUZXN0TW9kZWwuRkxBRzJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMigpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzIodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb3RGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHZtLCBUZXN0TW9kZWwuTk9UX0ZMQUcyX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzTm90RmxhZzIoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5vdEZsYWcyKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcikgewotCQlyZXR1cm4gbmV3IENoZWNrQm94TW9kZWxBZGFwdGVyKGJvb2xlYW5Ib2xkZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoNDAwLCAxMDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2hlY2tCb3hQYW5lbCgpLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENoZWNrQm94UGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRGbGFnMUNoZWNrQm94KCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkRmxhZzJDaGVja0JveCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZE5vdEZsYWcyQ2hlY2tCb3goKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3goKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkRmxhZzFDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJmbGFnIDEiKTsKLQkJY2hlY2tCb3guc2V0TW9kZWwodGhpcy5mbGFnMUJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkRmxhZzJDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJmbGFnIDIiKTsKLQkJY2hlY2tCb3guc2V0TW9kZWwodGhpcy5mbGFnMkJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkTm90RmxhZzJDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJub3QgZmxhZyAyIik7Ci0JCWNoZWNrQm94LnNldE1vZGVsKHRoaXMubm90RmxhZzJCdXR0b25Nb2RlbCk7Ci0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQlwcml2YXRlIEpDaGVja0JveCBidWlsZFVuYXR0YWNoZWRDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgidW5hdHRhY2hlZCIpOwotCQljaGVja0JveC5nZXRNb2RlbCgpLmFkZEl0ZW1MaXN0ZW5lcih0aGlzLmJ1aWxkVW5hdHRhY2hlZEl0ZW1MaXN0ZW5lcigpKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSXRlbUxpc3RlbmVyIGJ1aWxkVW5hdHRhY2hlZEl0ZW1MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJdGVtTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtU3RhdGVDaGFuZ2VkKEl0ZW1FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIHN0YXRlIGNoYW5nZWQ6ICIgKyBlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRGbGlwRmxhZzFCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRGbGlwRmxhZzFCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkRmxpcEZsYWcxQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkRmxpcEZsYWcxQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJmbGlwIGZsYWcgMSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuZmxpcEZsYWcxKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgZmxpcEZsYWcxKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXRGbGFnMSggISB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcxKCkpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzdG9yZSBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRQcmludE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicHJpbnQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImZsYWcgMTogIiArIHRoaXMudGVzdE1vZGVsLmlzRmxhZzEoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNOb3RGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioiKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgYm9vbGVhbiBmbGFnMTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUcxX1BST1BFUlRZID0gImZsYWcxIjsKLQkJcHJpdmF0ZSBib29sZWFuIGZsYWcyOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzJfUFJPUEVSVFkgPSAiZmxhZzIiOwotCQlwcml2YXRlIGJvb2xlYW4gbm90RmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRkxBRzJfUFJPUEVSVFkgPSAibm90RmxhZzIiOwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKGJvb2xlYW4gZmxhZzEsIGJvb2xlYW4gZmxhZzIpIHsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzEoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMShib29sZWFuIGZsYWcxKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzE7Ci0JCQl0aGlzLmZsYWcxID0gZmxhZzE7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzFfUFJPUEVSVFksIG9sZCwgZmxhZzEpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMihib29sZWFuIGZsYWcyKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzI7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzJfUFJPUEVSVFksIG9sZCwgZmxhZzIpOwotCQotCQkJb2xkID0gdGhpcy5ub3RGbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PVF9GTEFHMl9QUk9QRVJUWSwgb2xkLCB0aGlzLm5vdEZsYWcyKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc05vdEZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMubm90RmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Tm90RmxhZzIoYm9vbGVhbiBub3RGbGFnMikgewotCQkJdGhpcy5zZXRGbGFnMiggISBub3RGbGFnMik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5pc0ZsYWcxKCkgKyAiIC0gIiArIHRoaXMuaXNGbGFnMigpICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM5YTU3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNvbWJvQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZURpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29vcmRpbmF0ZWRMaXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21ib0JveE1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENvbWJvQm94TW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJLy8gbm90aGluZyB5ZXQuLi4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBub3RoaW5nIHlldC4uLgotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8RGlzcGxheWFibGU+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0aW9uSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KGxpc3RIb2xkZXIuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShzZWxlY3Rpb25Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJQ29tYm9Cb3hNb2RlbCBjb21ib0JveE1vZGVsID0gbmV3IENvbWJvQm94TW9kZWxBZGFwdGVyKGxpc3RIb2xkZXIsIHNlbGVjdGlvbkhvbGRlcik7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZShzZWxlY3Rpb25Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMoY29tYm9Cb3hNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PERpc3BsYXlhYmxlPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PERpc3BsYXlhYmxlPihjb21ib0JveE1vZGVsKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQlzZWxlY3Rpb25Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShzZWxlY3Rpb25Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGNvbWJvQm94TW9kZWwpOwotCi0JCWNvbWJvQm94TW9kZWwucmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihzeW5jaExpc3QpOwotCQlzZWxlY3Rpb25Ib2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHNlbGVjdGlvbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhjb21ib0JveE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7Ci0JCQkJLy8gZG8gbm90aGluZy4uLgotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0TW9kZWwgbGlzdE1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBoYXNOb0xpc3RlbmVycyA9ICgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobGlzdE1vZGVsLCAiaGFzTm9MaXN0RGF0YUxpc3RlbmVycyIpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShoYXNOb0xpc3RlbmVycyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0TW9kZWwgbGlzdE1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBoYXNMaXN0ZW5lcnMgPSAoKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGxpc3RNb2RlbCwgImhhc0xpc3REYXRhTGlzdGVuZXJzIikpLmJvb2xlYW5WYWx1ZSgpOwotCQlhc3NlcnRUcnVlKGhhc0xpc3RlbmVycyk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxEaXNwbGF5YWJsZT4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPERpc3BsYXlhYmxlPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8RGlzcGxheWFibGU+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxEaXNwbGF5YWJsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RGlzcGxheWFibGU+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248RGlzcGxheWFibGU+IGMpIHsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJmb28iKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiYmFyIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImJheiIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJqb28iKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiamFyIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImpheiIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhZTEyNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ29tYm9Cb3hNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRmlsdGVyaW5nTGlzdEJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuTGlzdENob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuU2ltcGxlTGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGNvbWJvLWJveGVzLgotICogCi0gKiBEZWZhdWx0TG9uZ0xpc3RCcm93c2VyRGlhbG9nVUlUZXN0IHN1YmNsYXNzZXMgdGhpcyBjbGFzczsgc28gYmUKLSAqIGNhcmVmdWwgd2hlbiBtYWtpbmcgY2hhbmdlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJvdGVjdGVkIEpGcmFtZSB3aW5kb3c7Ci0JcHJpdmF0ZSBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGNvbG9ySG9sZGVyOwotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBjb2xvckxpc3RIb2xkZXI7Ci0JcHJvdGVjdGVkIENvbWJvQm94TW9kZWwgY29sb3JDb21ib0JveE1vZGVsOwotCXByaXZhdGUgaW50IG5leHRDb2xvck51bWJlciA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYygpOwotCX0KLQotCXByb3RlY3RlZCBDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChVSU1hbmFnZXIuZ2V0U3lzdGVtTG9va0FuZEZlZWxDbGFzc05hbWUoKSk7Ci0vLwkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKFVJTWFuYWdlci5nZXRDcm9zc1BsYXRmb3JtTG9va0FuZEZlZWxDbGFzc05hbWUoKSk7CS8vIE1ldGFsIExBRgotLy8JCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChjb20uc3VuLmphdmEuc3dpbmcucGxhZi53aW5kb3dzLldpbmRvd3NMb29rQW5kRmVlbC5jbGFzcy5nZXROYW1lKCkpOwotLy8JCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChjb20uc3VuLmphdmEuc3dpbmcucGxhZi5tb3RpZi5Nb3RpZkxvb2tBbmRGZWVsLmNsYXNzLmdldE5hbWUoKSk7Ci0vLwkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKG9yYWNsZS5iYWxpLmV3dC5vbGFmLk9yYWNsZUxvb2tBbmRGZWVsLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXRoaXMudGVzdE1vZGVsID0gdGhpcy5idWlsZFRlc3RNb2RlbCgpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuY29sb3JIb2xkZXIgPSB0aGlzLmJ1aWxkQ29sb3JIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmNvbG9yTGlzdEhvbGRlciA9IHRoaXMuYnVpbGRDb2xvckxpc3RIb2xkZXIoKTsKLQkJdGhpcy5jb2xvckNvbWJvQm94TW9kZWwgPSB0aGlzLmJ1aWxkQ29tYm9Cb3hNb2RlbEFkYXB0ZXIodGhpcy5jb2xvckxpc3RIb2xkZXIsIHRoaXMuY29sb3JIb2xkZXIpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRDb2xvckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE9iamVjdD4odm0sIFRlc3RNb2RlbC5DT0xPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29sb3IoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRDb2xvcigoU3RyaW5nKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFRlc3RNb2RlbCBidWlsZFRlc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0TW9kZWwoKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb2xvckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPihUZXN0TW9kZWwudmFsaWRDb2xvcnMoKSk7Ci0vLwkJcmV0dXJuIG5ldyBBYnN0cmFjdFJlYWRPbmx5TGlzdFZhbHVlTW9kZWwoKSB7Ci0vLwkJCXB1YmxpYyBPYmplY3QgdmFsdWUoKSB7Ci0vLwkJCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yKFRlc3RNb2RlbC5WQUxJRF9DT0xPUlMpOwotLy8JCQl9Ci0vLwkJCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLS8vCQkJCXJldHVybiBUZXN0TW9kZWwuVkFMSURfQ09MT1JTLmxlbmd0aDsKLS8vCQkJfQotLy8JCX07Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gdWlDb2xvckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbG9yTGlzdEhvbGRlcjsKLQl9Ci0KLQlwcml2YXRlIENvbWJvQm94TW9kZWwgYnVpbGRDb21ib0JveE1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0aW9uSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIobGlzdEhvbGRlciwgc2VsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJdGhpcy53aW5kb3cgPSBuZXcgSkZyYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQl0aGlzLndpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl0aGlzLndpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXRoaXMud2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl0aGlzLndpbmRvdy5zZXRMb2NhdGlvbigzMDAsIDMwMCk7Ci0JCXRoaXMud2luZG93LnNldFNpemUoNDAwLCAxNTApOwotCQl0aGlzLndpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb21ib0JveFBhbmVsKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByb3RlY3RlZCBKUGFuZWwgYnVpbGRDb21ib0JveFBhbmVsKCkgewotCQlKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJcGFuZWwuYWRkKHRoaXMuYnVpbGRDb21ib0JveCgpKTsKLQkJcGFuZWwuYWRkKHRoaXMuYnVpbGRDb21ib0JveCgpKTsKLQkJcGFuZWwuYWRkKHRoaXMuYnVpbGRMaXN0Q2hvb3NlcjEoKSk7Ci0JCXBhbmVsLmFkZCh0aGlzLmJ1aWxkTGlzdENob29zZXIyKCkpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKQ29tYm9Cb3ggYnVpbGRDb21ib0JveCgpIHsKLQkJSkNvbWJvQm94IGNvbWJvQm94ID0gbmV3IEpDb21ib0JveCh0aGlzLmNvbG9yQ29tYm9Cb3hNb2RlbCk7Ci0JCWNvbWJvQm94LnNldFJlbmRlcmVyKHRoaXMuYnVpbGRDb21ib0JveFJlbmRlcmVyKCkpOwotCQlyZXR1cm4gY29tYm9Cb3g7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDZWxsUmVuZGVyZXIgYnVpbGRDb21ib0JveFJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkgewotCQkJCXJldHVybiBzdXBlci5idWlsZFRleHQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdENob29zZXIgYnVpbGRMaXN0Q2hvb3NlcjEoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxMaXN0Q2hvb3NlcjEodGhpcy5jb2xvckNvbWJvQm94TW9kZWwpOwotCX0KLQotCXByaXZhdGUgTGlzdENob29zZXIgYnVpbGRMaXN0Q2hvb3NlcjIoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxMaXN0Q2hvb3NlcjIodGhpcy5jb2xvckNvbWJvQm94TW9kZWwpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgyLCAwKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc2V0Q29sb3JCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkVGVuQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW1vdmVUZW5CdXR0b24oKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JLy8gKioqKioqKioqKiByZXNldCBjb2xvciBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc2V0Q29sb3JCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzZXRDb2xvckFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc2V0Q29sb3JBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc2V0IGNvbG9yIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldENvbG9yKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzZXRDb2xvcigpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0Q29sb3IoVGVzdE1vZGVsLkRFRkFVTFRfQ09MT1IpOwotCX0KLQotCS8vICoqKioqKioqKiogY2xlYXIgbW9kZWwgYnV0dG9uICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCS8vICoqKioqKioqKiogcmVzdG9yZSBtb2RlbCBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXN0b3JlTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc3RvcmUgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJpbnQgbW9kZWwgYnV0dG9uICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucHJpbnRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhZGQgMjAgYnV0dG9uICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRBZGRUZW5CdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQWRkVGVuQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQWRkVGVuQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJhZGQgMjAiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZFRlbigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGFkZFRlbigpIHsKLQkJZm9yIChpbnQgaSA9IHRoaXMubmV4dENvbG9yTnVtYmVyOyBpIDwgdGhpcy5uZXh0Q29sb3JOdW1iZXIgKyAyMDsgaSsrKSB7Ci0JCQl0aGlzLmNvbG9yTGlzdEhvbGRlci5hZGQodGhpcy5jb2xvckxpc3RIb2xkZXIuc2l6ZSgpLCAiY29sb3IiICsgaSk7Ci0JCX0KLQkJdGhpcy5uZXh0Q29sb3JOdW1iZXIgKz0gMjA7Ci0JfQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgMjAgYnV0dG9uICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZW1vdmVUZW5CdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVtb3ZlVGVuQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVtb3ZlVGVuQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZW1vdmUgMjAiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlbW92ZVRlbigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlbW92ZVRlbigpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5jb2xvckxpc3RIb2xkZXIuc2l6ZSgpID4gMCkgewotCQkJCXRoaXMuY29sb3JMaXN0SG9sZGVyLnJlbW92ZSh0aGlzLmNvbG9yTGlzdEhvbGRlci5zaXplKCkgLSAxKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgY29sb3I7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9QUk9QRVJUWSA9ICJjb2xvciI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUQgPSAicmVkIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SQU5HRSA9ICJvcmFuZ2UiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVMTE9XID0gInllbGxvdyI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVFTiA9ICJncmVlbiI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTFVFID0gImJsdWUiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ESUdPID0gImluZGlnbyI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSU9MRVQgPSAidmlvbGV0IjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09MT1IgPSBSRUQ7Ci0JCQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiB2YWxpZENvbG9yczsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9WQUxJRF9DT0xPUlMgPSB7Ci0JCQkJUkVELAotCQkJCU9SQU5HRSwKLQkJCQlZRUxMT1csCi0JCQkJR1JFRU4sCi0JCQkJQkxVRSwKLQkJCQlJTkRJR08sCi0JCQkJVklPTEVUCi0JCQl9OwotCQotCQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiB2YWxpZENvbG9ycygpIHsKLQkJCWlmICh2YWxpZENvbG9ycyA9PSBudWxsKSB7Ci0JCQkJdmFsaWRDb2xvcnMgPSBidWlsZERlZmF1bHRWYWxpZENvbG9ycygpOwotCQkJfQotCQkJcmV0dXJuIHZhbGlkQ29sb3JzOwotCQl9Ci0JCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFZhbGlkQ29sb3JzKCkgewotCQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChyZXN1bHQsIERFRkFVTFRfVkFMSURfQ09MT1JTKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkKLQkJcHVibGljIFRlc3RNb2RlbCgpIHsKLQkJCXRoaXMoREVGQVVMVF9DT0xPUik7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbChTdHJpbmcgY29sb3IpIHsKLQkJCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldENvbG9yKCkgewotCQkJcmV0dXJuIHRoaXMuY29sb3I7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoU3RyaW5nIGNvbG9yKSB7Ci0JCQl0aGlzLmNoZWNrQ29sb3IoY29sb3IpOwotCQkJT2JqZWN0IG9sZCA9IHRoaXMuY29sb3I7Ci0JCQl0aGlzLmNvbG9yID0gY29sb3I7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MT1JfUFJPUEVSVFksIG9sZCwgY29sb3IpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNoZWNrQ29sb3IoU3RyaW5nIGMpIHsKLQkJCWlmICggISB2YWxpZENvbG9ycygpLmNvbnRhaW5zKGMpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjKTsKLQkJCX0KLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmNvbG9yICsgIikiOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIExvY2FsTGlzdENob29zZXIxIGV4dGVuZHMgTGlzdENob29zZXIgewotCQlwdWJsaWMgTG9jYWxMaXN0Q2hvb3NlcjEoQ29tYm9Cb3hNb2RlbCBtb2RlbCkgewotCQkJc3VwZXIobW9kZWwpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIExvY2FsTGlzdENob29zZXIyIGV4dGVuZHMgTGlzdENob29zZXIgewotCQlwdWJsaWMgTG9jYWxMaXN0Q2hvb3NlcjIoQ29tYm9Cb3hNb2RlbCBtb2RlbCkgewotCQkJc3VwZXIobW9kZWwpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEJyb3dzZXIgYnVpbGRCcm93c2VyKCkgewotCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdMaXN0QnJvd3NlcjxTdHJpbmc+KCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QyLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmMxYzE1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuTGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5TaW1wbGVMaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdDIgZXh0ZW5kcyBDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0MigpLmV4ZWMoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIHVzZSBhIGRpZmZlcmVudCBtb2RlbCB0aGF0IGFsbG93cyB0aGUgY29sb3IgdG8gYmUgc2V0IHRvIG51bGwKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGVzdE1vZGVsIGJ1aWxkVGVzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFRlc3RNb2RlbDIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSBudWxsIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IHVpQ29sb3JMaXN0SG9sZGVyKCkgewotCQkvLyB0aGUgZGVmYXVsdCBpcyB0byBwcmVwZW5kIHRoZSB3cmFwcGVkIGxpc3Qgd2l0aCBhIG51bGwgaXRlbQotCQlyZXR1cm4gbmV3IEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4oc3VwZXIudWlDb2xvckxpc3RIb2xkZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmVydCBudWxsIHRvIHNvbWUgdGV4dAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0Q2VsbFJlbmRlcmVyIGJ1aWxkQ29tYm9Cb3hSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0Q2VsbFJlbmRlcmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVGV4dChPYmplY3QgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gIjxub25lIHNlbGVjdGVkPiIgOiBzdXBlci5idWlsZFRleHQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwyIGV4dGVuZHMgVGVzdE1vZGVsIHsKLQkJLyoqCi0JCSAqIG51bGwgaXMgT0sgaGVyZQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGNoZWNrQ29sb3IoU3RyaW5nIGNvbG9yKSB7Ci0JCQlpZiAoY29sb3IgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXN1cGVyLmNoZWNrQ29sb3IoY29sb3IpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjRiNzViLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5EYXRlU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCXByaXZhdGUgU3Bpbm5lck1vZGVsIHNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci0JYm9vbGVhbiBldmVudEZpcmVkOwotCi0JcHVibGljIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PihuZXcgRGF0ZSgpKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyID0gbmV3IERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMudmFsdWVIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVNwaW5uZXJNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJRGF0ZSBuZXdEYXRlID0gbmV3IERhdGUoKTsKLQkJbmV3RGF0ZS5zZXRUaW1lKDc3Nzc3Nyk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5zZXRWYWx1ZShuZXdEYXRlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoNzc3Nzc3LCAoKERhdGUpIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSkuZ2V0VGltZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVWYWx1ZUhvbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJRGF0ZSBuZXdEYXRlID0gbmV3IERhdGUoKTsKLQkJbmV3RGF0ZS5zZXRUaW1lKDc3Nzc3Nyk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobmV3RGF0ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKDc3Nzc3NywgKChEYXRlKSB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSkuZ2V0VGltZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCURhdGUgbmV3RGF0ZSA9IG5ldyBEYXRlKCk7Ci0JCW5ld0RhdGUuc2V0VGltZSg3Nzc3NzcpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG5ld0RhdGUpOwotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDc3Nzc3NywgKChEYXRlKSB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSkuZ2V0VGltZSgpKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSgoKERhdGUpIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkgPT0gNzc3Nzc3KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGxvY2FsVmFsdWVIb2xkZXIgPSAoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoU3Bpbm5lck1vZGVsIGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgKChEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcikgYWRhcHRlcikuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoKChEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcikgYWRhcHRlcikuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsSW5pdGlhbFZhbHVlKCkgewotCQlEYXRlIHRvZGF5ID0gbmV3IERhdGUoKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlciwgdG9kYXkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCURhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyh0b2RheSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCURhdGUgbmV3RGF0ZSA9IG5ldyBEYXRlKCk7Ci0JCW5ld0RhdGUuc2V0VGltZSg3Nzc3NzcpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG5ld0RhdGUpOwotCi0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKDc3Nzc3NywgKChEYXRlKSB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSkuZ2V0VGltZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCXByaXZhdGUgY2xhc3MgVGVzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4MDUxNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudEV2ZW50LkV2ZW50VHlwZTsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRvY3VtZW50OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERvY3VtZW50QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdIb2xkZXI7Ci0JRG9jdW1lbnQgZG9jdW1lbnRBZGFwdGVyOwotCWJvb2xlYW4gZXZlbnRGaXJlZDsKLQotCXB1YmxpYyBEb2N1bWVudEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN0cmluZ0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigiMDEyMzQ1Njc4OSIpOwotCQl0aGlzLmRvY3VtZW50QWRhcHRlciA9IG5ldyBEb2N1bWVudEFkYXB0ZXIodGhpcy5zdHJpbmdIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdHJpbmdMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZFN0cmluZ0xpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmRvY3VtZW50QWRhcHRlci5hZGREb2N1bWVudExpc3RlbmVyKG5ldyBUZXN0RG9jdW1lbnRMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcmVtb3ZlVXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQkJCURvY3VtZW50QWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQkJYXNzZXJ0RXF1YWxzKEV2ZW50VHlwZS5SRU1PVkUsIGUuZ2V0VHlwZSgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoRG9jdW1lbnRBZGFwdGVyVGVzdHMudGhpcy5kb2N1bWVudEFkYXB0ZXIsIGUuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJLy8gdGhpcyB3aWxsIGJlIHRoZSByZW1vdmFsIG9mICIyMzQ1NiIKLQkJCQlhc3NlcnRFcXVhbHMoMiwgZS5nZXRPZmZzZXQoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDUsIGUuZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQl9KTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIucmVtb3ZlKDIsIDUpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscygiMDE3ODkiLCB0aGlzLnN0cmluZ0hvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmRvY3VtZW50QWRhcHRlci5hZGREb2N1bWVudExpc3RlbmVyKG5ldyBUZXN0RG9jdW1lbnRMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQkJCURvY3VtZW50QWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQkJYXNzZXJ0RXF1YWxzKEV2ZW50VHlwZS5JTlNFUlQsIGUuZ2V0VHlwZSgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoRG9jdW1lbnRBZGFwdGVyVGVzdHMudGhpcy5kb2N1bWVudEFkYXB0ZXIsIGUuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJLy8gdGhpcyB3aWxsIGJlIHRoZSBpbnNlcnQgb2YgInh4eHh4eCIKLQkJCQlhc3NlcnRFcXVhbHMoMiwgZS5nZXRPZmZzZXQoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDUsIGUuZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQl9KTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIuaW5zZXJ0U3RyaW5nKDIsICJ4eHh4eCIsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscygiMDF4eHh4eDIzNDU2Nzg5IiwgdGhpcy5zdHJpbmdIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmRvY3VtZW50QWRhcHRlci5hZGREb2N1bWVudExpc3RlbmVyKG5ldyBUZXN0RG9jdW1lbnRMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQkJCURvY3VtZW50QWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQkJYXNzZXJ0RXF1YWxzKEV2ZW50VHlwZS5JTlNFUlQsIGUuZ2V0VHlwZSgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoRG9jdW1lbnRBZGFwdGVyVGVzdHMudGhpcy5kb2N1bWVudEFkYXB0ZXIsIGUuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJLy8gdGhpcyB3aWxsIGJlIHRoZSBpbnNlcnQgb2YgImZvbyIKLQkJCQlhc3NlcnRFcXVhbHMoMCwgZS5nZXRPZmZzZXQoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIGUuZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKEV2ZW50VHlwZS5SRU1PVkUsIGUuZ2V0VHlwZSgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoRG9jdW1lbnRBZGFwdGVyVGVzdHMudGhpcy5kb2N1bWVudEFkYXB0ZXIsIGUuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJLy8gdGhpcyB3aWxsIGJlIHRoZSByZW1vdmFsIG9mICIwMTIzNDU2Nzg5IgotCQkJCWFzc2VydEVxdWFscygwLCBlLmdldE9mZnNldCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoMTAsIGUuZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5IiwgdGhpcy5kb2N1bWVudEFkYXB0ZXIuZ2V0VGV4dCgwLCB0aGlzLmRvY3VtZW50QWRhcHRlci5nZXRMZW5ndGgoKSkpOwotCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmRvY3VtZW50QWRhcHRlci5nZXRUZXh0KDAsIHRoaXMuZG9jdW1lbnRBZGFwdGVyLmdldExlbmd0aCgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBsb2NhbFN0cmluZ0hvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPikgdGhpcy5zdHJpbmdIb2xkZXI7Ci0JCWFzc2VydEZhbHNlKGxvY2FsU3RyaW5nSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuZG9jdW1lbnRBZGFwdGVyKTsKLQotCQlEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3REb2N1bWVudExpc3RlbmVyKCk7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLmFkZERvY3VtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsU3RyaW5nSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmRvY3VtZW50QWRhcHRlcik7Ci0KLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKGxvY2FsU3RyaW5nSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuZG9jdW1lbnRBZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoT2JqZWN0IGRvY3VtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGRlbGVnYXRlID0gUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoZG9jdW1lbnQsICJkZWxlZ2F0ZSIpOwotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSAoT2JqZWN0W10pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGRlbGVnYXRlLCAiZ2V0RG9jdW1lbnRMaXN0ZW5lcnMiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3RlbmVycy5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGRvY3VtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGRlbGVnYXRlID0gUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoZG9jdW1lbnQsICJkZWxlZ2F0ZSIpOwotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSAoT2JqZWN0W10pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGRlbGVnYXRlLCAiZ2V0RG9jdW1lbnRMaXN0ZW5lcnMiKTsKLQkJYXNzZXJ0RmFsc2UobGlzdGVuZXJzLmxlbmd0aCA9PSAwKTsKLQl9Ci0KLQotcHJpdmF0ZSBjbGFzcyBUZXN0RG9jdW1lbnRMaXN0ZW5lciBpbXBsZW1lbnRzIERvY3VtZW50TGlzdGVuZXIgewotCVRlc3REb2N1bWVudExpc3RlbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgdm9pZCBjaGFuZ2VkVXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JfQotCXB1YmxpYyB2b2lkIGluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQl9Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTc2NDliLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5BYnN0cmFjdERvY3VtZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuQXR0cmlidXRlU2V0OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LlBsYWluRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiBlbnRyeSBmaWVsZHMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERvY3VtZW50QWRhcHRlclVJVGVzdCB7Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX05BTUUgPSAiU2Nvb2J5IERvbyI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHRlc3RNb2RlbEhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbmFtZUhvbGRlcjsKLQlwcml2YXRlIERvY3VtZW50IG5hbWVEb2N1bWVudDsKLQlwcml2YXRlIERvY3VtZW50IHVwcGVyQ2FzZU5hbWVEb2N1bWVudDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgRG9jdW1lbnRBZGFwdGVyVUlUZXN0KCkuZXhlYygpOwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnRBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbChERUZBVUxUX05BTUUpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMubmFtZUhvbGRlciA9IHRoaXMuYnVpbGROYW1lSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5uYW1lRG9jdW1lbnQgPSB0aGlzLmJ1aWxkTmFtZURvY3VtZW50KHRoaXMubmFtZUhvbGRlcik7Ci0JCXRoaXMudXBwZXJDYXNlTmFtZURvY3VtZW50ID0gdGhpcy5idWlsZFVwcGVyQ2FzZU5hbWVEb2N1bWVudCh0aGlzLm5hbWVIb2xkZXIpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPih2bSwgVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50IGJ1aWxkTmFtZURvY3VtZW50KFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc3RyaW5nSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgRG9jdW1lbnRBZGFwdGVyKHN0cmluZ0hvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudCBidWlsZFVwcGVyQ2FzZU5hbWVEb2N1bWVudChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcikgewotCQlyZXR1cm4gbmV3IERvY3VtZW50QWRhcHRlcihzdHJpbmdIb2xkZXIsIHRoaXMuYnVpbGRVcHBlckNhc2VOYW1lRG9jdW1lbnREZWxlZ2F0ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0RG9jdW1lbnQgYnVpbGRVcHBlckNhc2VOYW1lRG9jdW1lbnREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIG5ldyBQbGFpbkRvY3VtZW50KCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpbnNlcnRTdHJpbmcoaW50IG9mZnNldCwgU3RyaW5nIHN0cmluZywgQXR0cmlidXRlU2V0IGEpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJY2hhcltdIHVwcGVyID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cHBlci5sZW5ndGg7IGkrKykgewotCQkJCQl1cHBlcltpXSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSh1cHBlcltpXSk7Ci0JCQkJfQotCQkJCXN1cGVyLmluc2VydFN0cmluZyhvZmZzZXQsIG5ldyBTdHJpbmcodXBwZXIpLCBhKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRTaXplKDQwMCwgMTAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFRleHRGaWVsZFBhbmVsKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkVGV4dEZpZWxkUGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGROYW1lVGV4dEZpZWxkKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVhZE9ubHlOYW1lVGV4dEZpZWxkKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkVXBwZXJDYXNlTmFtZVRleHRGaWVsZCgpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKVGV4dEZpZWxkIGJ1aWxkTmFtZVRleHRGaWVsZCgpIHsKLQkJcmV0dXJuIG5ldyBKVGV4dEZpZWxkKHRoaXMubmFtZURvY3VtZW50LCBudWxsLCAwKTsKLQl9Ci0KLQlwcml2YXRlIEpUZXh0RmllbGQgYnVpbGRSZWFkT25seU5hbWVUZXh0RmllbGQoKSB7Ci0JCUpUZXh0RmllbGQgbmFtZVRleHRGaWVsZCA9IHRoaXMuYnVpbGROYW1lVGV4dEZpZWxkKCk7Ci0JCW5hbWVUZXh0RmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlyZXR1cm4gbmFtZVRleHRGaWVsZDsKLQl9Ci0KLQlwcml2YXRlIEpUZXh0RmllbGQgYnVpbGRVcHBlckNhc2VOYW1lVGV4dEZpZWxkKCkgewotCQlyZXR1cm4gbmV3IEpUZXh0RmllbGQodGhpcy51cHBlckNhc2VOYW1lRG9jdW1lbnQsIG51bGwsIDApOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc2V0TmFtZUJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKCkpOwotCQlyZXR1cm4gY29udHJvbFBhbmVsOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc2V0TmFtZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldE5hbWVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXNldE5hbWVBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc2V0IG5hbWUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXNldE5hbWUoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldE5hbWUoREVGQVVMVF9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCURvY3VtZW50QWRhcHRlclVJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXN0b3JlIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRQcmludE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicHJpbnQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJuYW1lOiAiICsgdGhpcy50ZXN0TW9kZWwuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmdldE5hbWUoKSArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9KcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MzFiZDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9KcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbWJvQm94TW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEb2N1bWVudEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXN0TW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRhYmxlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJlZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjNiNjkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLkNvb3JkaW5hdGVkTGlzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGlzdE1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIExpc3RNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQkvLyBub3RoaW5nIHlldC4uLgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIG5vdGhpbmcgeWV0Li4uCi0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWxBZGFwdGVyIGJ1aWxkTGlzdE1vZGVsKExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIobGlzdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkTGlzdE1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlcikgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIoY29sbGVjdGlvbkhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChjb2xsZWN0aW9uSG9sZGVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCgidG9tIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJkaWNrIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJoYXJyeSIpOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJqYXIiKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImhhcnJ5Iik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKGxpc3RIb2xkZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWxpc3RIb2xkZXIuYWRkKDYsICJ0b20iKTsKLQkJbGlzdEhvbGRlci5hZGQoNywgImRpY2siKTsKLQkJbGlzdEhvbGRlci5hZGQoOCwgImhhcnJ5Iik7Ci0JCWxpc3RIb2xkZXIuYWRkKDksIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWxpc3RIb2xkZXIucmVtb3ZlKDkpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1vZGVsKCkgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIxID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdE1vZGVsQWRhcHRlciBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKGxpc3RIb2xkZXIxKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlcjEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyMiA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyMigpOwotCQlsaXN0TW9kZWwuc2V0TW9kZWwobGlzdEhvbGRlcjIpOwotCQlhc3NlcnRFcXVhbHMoMywgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlcjEuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlcjIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCWxpc3RNb2RlbC5zZXRNb2RlbChuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIxLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIyLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wYXJlKExpc3RNb2RlbCBsaXN0TW9kZWwsIExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCWFzc2VydEVxdWFscyhsaXN0TW9kZWwuZ2V0U2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdE1vZGVsLmdldFNpemUoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMobGlzdE1vZGVsLmdldEVsZW1lbnRBdChpKSwgbGlzdC5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQ29sbGVjdGlvblNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvblNvcnQodGhpcy5idWlsZEN1c3RvbUNvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUxpc3RTb3J0KCkgewotCQl0aGlzLnZlcmlmeUxpc3RTb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpIHsKLQkJLy8gc29ydCB3aXRoIHJldmVyc2Ugb3JkZXIKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJCQlyZXR1cm4gczIuY29tcGFyZVRvKHMxKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvblNvcnQoQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KGNvbGxlY3Rpb25Ib2xkZXIsIGNvbXBhcmF0b3IpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0TW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQoInRvbSIpOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCgiZGljayIpOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCgiaGFycnkiKTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJqYXIiKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImhhcnJ5Iik7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0TW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RTb3J0KENvbXBhcmF0b3I8U3RyaW5nPiBjb21wYXJhdG9yKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPihsaXN0SG9sZGVyLCBjb21wYXJhdG9yKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdE1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWxpc3RIb2xkZXIuYWRkKDAsICJ0b20iKTsKLQkJbGlzdEhvbGRlci5hZGQoMCwgImRpY2siKTsKLQkJbGlzdEhvbGRlci5hZGQoMCwgImhhcnJ5Iik7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0TW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNSk7Ci0JCWFzc2VydEVxdWFscyg1LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0TW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmVTb3J0KExpc3RNb2RlbCBsaXN0TW9kZWwsIExpc3Q8U3RyaW5nPiBsaXN0LCBDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvcikgewotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oY29tcGFyYXRvcik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdE1vZGVsLmdldFNpemUoKTsgaSsrKSB7Ci0JCQlzcy5hZGQoKFN0cmluZykgbGlzdE1vZGVsLmdldEVsZW1lbnRBdChpKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHNzLnNpemUoKSwgbGlzdC5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMSA9IHNzLml0ZXJhdG9yKCksIHN0cmVhbTIgPSBsaXN0Lml0ZXJhdG9yKCk7IHN0cmVhbTEuaGFzTmV4dCgpOyApIHsKLQkJCWFzc2VydEVxdWFscyhzdHJlYW0xLm5leHQoKSwgc3RyZWFtMi5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChsaXN0SG9sZGVyKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQotCQlsaXN0TW9kZWwucmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKGxpc3RIb2xkZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0TW9kZWwuZ2V0U2l6ZSgpKTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3RNb2RlbC5nZXRTaXplKCkpOwotCi0JCWxpc3RNb2RlbC5yZW1vdmVMaXN0RGF0YUxpc3RlbmVyKHN5bmNoTGlzdCk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3RNb2RlbC5nZXRTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRFbGVtZW50QXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KGxpc3RIb2xkZXIpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgbGlzdE1vZGVsLmdldEVsZW1lbnRBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgc3luY2hMaXN0LmdldCgwKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKExpc3RNb2RlbCBsaXN0TW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGhhc05vTGlzdGVuZXJzID0gKChCb29sZWFuKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChsaXN0TW9kZWwsICJoYXNOb0xpc3REYXRhTGlzdGVuZXJzIikpLmJvb2xlYW5WYWx1ZSgpOwotCQlhc3NlcnRUcnVlKGhhc05vTGlzdGVuZXJzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKExpc3RNb2RlbCBsaXN0TW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGhhc0xpc3RlbmVycyA9ICgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobGlzdE1vZGVsLCAiaGFzTGlzdERhdGFMaXN0ZW5lcnMiKSkuYm9vbGVhblZhbHVlKCk7Ci0JCWFzc2VydFRydWUoaGFzTGlzdGVuZXJzKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlCYWc8U3RyaW5nPiBiYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGJhZyk7Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24obGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxTdHJpbmc+IGMpIHsKLQkJYy5hZGQoImZvbyIpOwotCQljLmFkZCgiYmFyIik7Ci0JCWMuYWRkKCJiYXoiKTsKLQkJYy5hZGQoImpvbyIpOwotCQljLmFkZCgiamFyIik7Ci0JCWMuYWRkKCJqYXoiKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMaXN0SG9sZGVyMigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0MigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QyKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbjIobGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24yKENvbGxlY3Rpb248U3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJ0b20iKTsKLQkJYy5hZGQoImRpY2siKTsKLQkJYy5hZGQoImhhcnJ5Iik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjhlZTQ4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuVGV4dEZpZWxkOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogYW4gZXhhbXBsZSBVSSBmb3IgdGVzdGluZyB2YXJpb3VzIHBlcm11dGF0aW9ucyBvZiB0aGUgTGlzdE1vZGVsQWRhcHRlcgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBMaXN0TW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+IHRhc2tMaXN0SG9sZGVyOwotCXByaXZhdGUgVGV4dEZpZWxkIHRhc2tUZXh0RmllbGQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IExpc3RNb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKGFyZ3MpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlYyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0PihuZXcgVGFza0xpc3QoKSk7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoODAwLCA0MDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkVGFza0xpc3RQYW5lbCgpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRUYXNrTGlzdFBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMCwgMSkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZERpc3BsYXlhYmxlVGFza0xpc3RQYW5lbCgpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRQcmltaXRpdmVUYXNrTGlzdFBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbCgpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGREaXNwbGF5YWJsZVRhc2tMaXN0UGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRVbnNvcnRlZERpc3BsYXlhYmxlTGlzdFBhbmVsKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWREaXNwbGF5YWJsZUxpc3RQYW5lbCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEN1c3RvbVNvcnRlZERpc3BsYXlhYmxlTGlzdFBhbmVsKCkpOwotCQlyZXR1cm4gdGFza0xpc3RQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RQYW5lbCgicHJpbWl0aXZlIHVuc29ydGVkIiwgdGhpcy5idWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdFBhbmVsKCJwcmltaXRpdmUgc29ydGVkIiwgdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RQYW5lbCgicHJpbWl0aXZlIHJldmVyc2Ugc29ydGVkIiwgdGhpcy5idWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFVuc29ydGVkRGlzcGxheWFibGVMaXN0UGFuZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdFBhbmVsKCJkaXNwbGF5YWJsZSB1bnNvcnRlZCIsIHRoaXMuYnVpbGRVbnNvcnRlZERpc3BsYXlhYmxlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkU3RhbmRhcmRTb3J0ZWREaXNwbGF5YWJsZUxpc3RQYW5lbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0UGFuZWwoImRpc3BsYXlhYmxlIHNvcnRlZCIsIHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZERpc3BsYXlhYmxlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ3VzdG9tU29ydGVkRGlzcGxheWFibGVMaXN0UGFuZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdFBhbmVsKCJkaXNwbGF5YWJsZSByZXZlcnNlIHNvcnRlZCIsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWREaXNwbGF5YWJsZUxpc3RNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSkpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSkpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkVW5zb3J0ZWREaXNwbGF5YWJsZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYnVpbGREaXNwbGF5YWJsZVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZFN0YW5kYXJkU29ydGVkRGlzcGxheWFibGVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFRhc2s+KHRoaXMuYnVpbGREaXNwbGF5YWJsZVRhc2tMaXN0QWRhcHRlcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRDdXN0b21Tb3J0ZWREaXNwbGF5YWJsZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8VGFzaz4odGhpcy5idWlsZERpc3BsYXlhYmxlVGFza0xpc3RBZGFwdGVyKCksIHRoaXMuYnVpbGRDdXN0b21UYXNrT2JqZWN0Q29tcGFyYXRvcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRMaXN0UGFuZWwoU3RyaW5nIGxhYmVsLCBMaXN0TW9kZWwgbGlzdE1vZGVsKSB7Ci0JCUpQYW5lbCBsaXN0UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCUpMYWJlbCBsaXN0TGFiZWwgPSBuZXcgSkxhYmVsKCIgICIgKyBsYWJlbCk7Ci0JCWxpc3RQYW5lbC5hZGQobGlzdExhYmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCi0JCUpMaXN0IGxpc3RCb3ggPSBuZXcgSkxpc3QoKTsKLQkJbGlzdEJveC5zZXRNb2RlbChsaXN0TW9kZWwpOwotCQlsaXN0Qm94LnNldERvdWJsZUJ1ZmZlcmVkKHRydWUpOwotCQlsaXN0TGFiZWwuc2V0TGFiZWxGb3IobGlzdEJveCk7Ci0JCWxpc3RQYW5lbC5hZGQobmV3IEpTY3JvbGxQYW5lKGxpc3RCb3gpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJcmV0dXJuIGxpc3RQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCQkJcmV0dXJuIHMyLmNvbXBhcmVUbyhzMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFRhc2s+IGJ1aWxkQ3VzdG9tVGFza09iamVjdENvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxUYXNrPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShUYXNrIHRvMSwgVGFzayB0bzIpIHsKLQkJCQlyZXR1cm4gdG8yLmRpc3BsYXlTdHJpbmcoKS5jb21wYXJlVG8odG8xLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBTdHJpbmc+KFRhc2tMaXN0LlRBU0tfTkFNRVNfTElTVCwgdGhpcy50YXNrTGlzdCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudGFza05hbWVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZERpc3BsYXlhYmxlVGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBUYXNrPihUYXNrTGlzdC5UQVNLU19MSVNULCB0aGlzLnRhc2tMaXN0KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxUYXNrPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudGFza3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkUmVtb3ZlVGFza1BhbmVsKCksIEJvcmRlckxheW91dC5DRU5URVIpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRDbGVhckJ1dHRvbigpLCBCb3JkZXJMYXlvdXQuRUFTVCk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwoKSB7Ci0JCUpQYW5lbCBhZGRSZW1vdmVUYXNrUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCWFkZFJlbW92ZVRhc2tQYW5lbC5hZGQodGhpcy5idWlsZEFkZEJ1dHRvbigpLCBCb3JkZXJMYXlvdXQuV0VTVCk7Ci0JCWFkZFJlbW92ZVRhc2tQYW5lbC5hZGQodGhpcy5idWlsZFRhc2tUZXh0RmllbGQoKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JCWFkZFJlbW92ZVRhc2tQYW5lbC5hZGQodGhpcy5idWlsZFJlbW92ZUJ1dHRvbigpLCBCb3JkZXJMYXlvdXQuRUFTVCk7Ci0JCXJldHVybiBhZGRSZW1vdmVUYXNrUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFzaygpIHsKLQkJcmV0dXJuIHRoaXMudGFza1RleHRGaWVsZC5nZXRUZXh0KCk7Ci0JfQotCi0JcHJpdmF0ZSBUYXNrTGlzdCB0YXNrTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMudGFza0xpc3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQl2b2lkIGFkZFRhc2soKSB7Ci0JCVN0cmluZyB0YXNrID0gdGhpcy5nZXRUYXNrKCk7Ci0JCWlmICh0YXNrLmxlbmd0aCgpICE9IDApIHsKLQkJCXRoaXMudGFza0xpc3QoKS5hZGRUYXNrKHRhc2spOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVUYXNrKCkgewotCQlTdHJpbmcgdGFzayA9IHRoaXMuZ2V0VGFzaygpOwotCQlpZiAodGFzay5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnRhc2tMaXN0KCkucmVtb3ZlVGFzayh0YXNrKTsKLQkJfQotCX0KLQotCXZvaWQgY2xlYXJUYXNrcygpIHsKLQkJdGhpcy50YXNrTGlzdCgpLmNsZWFyVGFza3MoKTsKLQl9Ci0KLQlwcml2YXRlIFRleHRGaWVsZCBidWlsZFRhc2tUZXh0RmllbGQoKSB7Ci0JCXRoaXMudGFza1RleHRGaWVsZCA9IG5ldyBUZXh0RmllbGQoKTsKLQkJcmV0dXJuIHRoaXMudGFza1RleHRGaWVsZDsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRBZGRCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQWRkQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQWRkQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJhZGQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuYWRkVGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZW1vdmVCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVtb3ZlQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVtb3ZlQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZW1vdmUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVtb3ZlVGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhckJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRDbGVhckFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhclRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXB1YmxpYyBjbGFzcyBUYXNrTGlzdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiB0YXNrTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcHJpdmF0ZSBMaXN0PFRhc2s+IHRhc2tPYmplY3RzID0gbmV3IEFycmF5TGlzdDxUYXNrPigpOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX05BTUVTX0xJU1QgPSAidGFza05hbWVzIjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS1NfTElTVCA9ICJ0YXNrcyI7Ci0JCVRhc2tMaXN0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFza05hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza05hbWVzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8VGFzaz4gdGFza3MoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrT2JqZWN0cy5saXN0SXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRUYXNrKFN0cmluZyB0YXNrTmFtZSkgewotCQkJaW50IGluZGV4ID0gdGhpcy50YXNrTmFtZXMuc2l6ZSgpOwotCQkJdGhpcy50YXNrTmFtZXMuYWRkKGluZGV4LCB0YXNrTmFtZSk7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoVEFTS19OQU1FU19MSVNULCBpbmRleCwgdGFza05hbWUpOwotCQotCQkJVGFzayB0YXNrT2JqZWN0ID0gbmV3IFRhc2sodGFza05hbWUpOwotCQkJdGhpcy50YXNrT2JqZWN0cy5hZGQoaW5kZXgsIHRhc2tPYmplY3QpOwotCQkJdGhpcy5maXJlSXRlbUFkZGVkKFRBU0tTX0xJU1QsIGluZGV4LCB0YXNrT2JqZWN0KTsKLQkJfQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVRhc2soU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLnRhc2tOYW1lcy5pbmRleE9mKHRhc2tOYW1lKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCU9iamVjdCByZW1vdmVkVGFzayA9IHRoaXMudGFza05hbWVzLnJlbW92ZShpbmRleCk7Ci0JCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVEFTS19OQU1FU19MSVNULCBpbmRleCwgcmVtb3ZlZFRhc2spOwotCQkJCS8vIGFzc3VtZSB0aGUgaW5kZXhlcyBtYXRjaC4uLgotCQkJCU9iamVjdCByZW1vdmVkVGFza09iamVjdCA9IHRoaXMudGFza09iamVjdHMucmVtb3ZlKGluZGV4KTsKLQkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChUQVNLU19MSVNULCBpbmRleCwgcmVtb3ZlZFRhc2tPYmplY3QpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGNsZWFyVGFza3MoKSB7Ci0JCQl0aGlzLnRhc2tOYW1lcy5jbGVhcigpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVEFTS19OQU1FU19MSVNULCB0aGlzLnRhc2tOYW1lcyk7Ci0JCQl0aGlzLnRhc2tPYmplY3RzLmNsZWFyKCk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChUQVNLU19MSVNULCB0aGlzLnRhc2tPYmplY3RzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBUYXNrIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBEYXRlIGNyZWF0aW9uVGltZVN0YW1wOwotCQlwdWJsaWMgVGFzayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuY3JlYXRpb25UaW1lU3RhbXAgPSBuZXcgRGF0ZSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWUgKyAiOiAiICsgdGhpcy5jcmVhdGlvblRpbWVTdGFtcC5nZXRUaW1lKCk7Ci0JCX0KLQkJcHVibGljIEljb24gaWNvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4N2ZlZmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgc3Bpbm5lck1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMVUVfTElTVCA9IHsicmVkIiwgImdyZWVuIiwgImJsdWUifTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WQUxVRSA9IFZBTFVFX0xJU1RbMF07Ci0KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KERFRkFVTFRfVkFMVUUpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlciwgVkFMVUVfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTcGlubmVyTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhERUZBVUxUX1ZBTFVFLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuc2V0VmFsdWUoVkFMVUVfTElTVFsyXSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMl0sIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlVmFsdWVIb2xkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhERUZBVUxUX1ZBTFVFLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoVkFMVUVfTElTVFsyXSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMl0sIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoREVGQVVMVF9WQUxVRSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoVkFMVUVfTElTVFsyXSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMl0sIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoVkFMVUVfTElTVFswXSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gbG9jYWxWYWx1ZUhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgdGhpcy52YWx1ZUhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhTcGlubmVyTW9kZWwgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCAoKExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSgoKExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyIHsKLQkJVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlYmVmOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiB2YWx1ZUhvbGRlcjsKLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBzcGlubmVyTW9kZWxBZGFwdGVyOwotCWJvb2xlYW4gZXZlbnRGaXJlZDsKLQotCXB1YmxpYyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPihuZXcgSW50ZWdlcigwKSk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciA9IG5ldyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMudmFsdWVIb2xkZXIsIC0zMywgMzMsIDEpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZE51bWJlckNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTcGlubmVyTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCU51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNSksIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlVmFsdWVIb2xkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCU51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDApLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobmV3IEludGVnZXIoNykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig3KSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCU51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDApLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKC0zMyksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IGxvY2FsVmFsdWVIb2xkZXIgPSAoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoU3Bpbm5lck1vZGVsIGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgKChOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSgoKE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIpIGFkYXB0ZXIpLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEluaXRpYWxWYWx1ZSgpIHsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLnZhbHVlSG9sZGVyLCBuZXcgSW50ZWdlcigtMzMpLCBuZXcgSW50ZWdlcigzMyksIG5ldyBJbnRlZ2VyKDEpLCBuZXcgSW50ZWdlcigwKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE51bWJlckNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCU51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDApLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobmV3IEludGVnZXIoNykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig3KSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCVRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTYwZjY1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuRGVmYXVsdExpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3RTZWxlY3Rpb25MaXN0ZW5lcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBEZWZhdWx0TGlzdE1vZGVsIGxpc3RNb2RlbDsKLQlwcml2YXRlIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBzZWxlY3Rpb25Nb2RlbDsKLQotCXB1YmxpYyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwoKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYnVpbGRTZWxlY3Rpb25Nb2RlbCh0aGlzLmxpc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWZhdWx0TGlzdE1vZGVsIGJ1aWxkTGlzdE1vZGVsKCkgewotCQlEZWZhdWx0TGlzdE1vZGVsIGxtID0gbmV3IERlZmF1bHRMaXN0TW9kZWwoKTsKLQkJbG0uYWRkRWxlbWVudCgiZm9vIik7Ci0JCWxtLmFkZEVsZW1lbnQoImJhciIpOwotCQlsbS5hZGRFbGVtZW50KCJiYXoiKTsKLQkJcmV0dXJuIGxtOwotCX0KLQotCXByaXZhdGUgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGJ1aWxkU2VsZWN0aW9uTW9kZWwoTGlzdE1vZGVsIGxtKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsKGxtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3REYXRhTGlzdGVuZXIoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkTGlzdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uSW50ZXJ2YWwoMCwgMCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCkpOwotCQl0aGlzLmxpc3RNb2RlbC5zZXQoMCwgImphciIpOwotCQlhc3NlcnRFcXVhbHMoImphciIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2VsZWN0ZWRWYWx1ZSgpIHsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3Rpb25JbnRlcnZhbCgwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNlbGVjdGVkVmFsdWVzKCkgewotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGlvbkludGVydmFsKDAsIDApOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGlvbkludGVydmFsKDIsIDIpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyh0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCksICJmb28iKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyh0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCksICJiYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2VsZWN0ZWRWYWx1ZXMoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiZm9vIiwgImJheiJ9KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1heFNlbGVjdGlvbkluZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTZWxlY3RlZFZhbHVlKCkgewotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpheiIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoImZvbyIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGVkVmFsdWUoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgxKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg0KSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTZWxlY3RlZFZhbHVlcygpIHsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXoiKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKCJmb28iKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJiYXIiLCAiamFyIn0pOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgzKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiZm9vIiwgImJheiIsICJqYXIifSk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwucmVtb3ZlU2VsZWN0ZWRWYWx1ZSgiamFyIik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgwKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlbGVjdGVkVmFsdWVzKCkgewotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpheiIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWVzKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXoiLCAiam9vIiwgImphciJ9KTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5yZW1vdmVTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJmb28iLCAiam9vIn0pOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDApKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDQpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbmNob3JTZWxlY3RlZFZhbHVlKCkgewotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldEFuY2hvclNlbGVjdGlvbkluZGV4KDEpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0QW5jaG9yU2VsZWN0ZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGVhZFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRMZWFkU2VsZWN0ZWRWYWx1ZSgpKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJmb28iLCAiYmF6In0pOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TGVhZFNlbGVjdGVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1pbk1heFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiYmFyIiwgImphciJ9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGVkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamFyIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3RlZFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUlzU2VsZWN0ZWQoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiYmFyIiwgImphciJ9KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLnZhbHVlSXNTZWxlY3RlZCgiZm9vIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwudmFsdWVJc1NlbGVjdGVkKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC52YWx1ZUlzU2VsZWN0ZWQoImphciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC52YWx1ZUlzU2VsZWN0ZWQoImJheiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubGlzdE1vZGVsLmdldExpc3REYXRhTGlzdGVuZXJzKCkubGVuZ3RoKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5saXN0TW9kZWwuZ2V0TGlzdERhdGFMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnJlbW92ZUxpc3RTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmxpc3RNb2RlbC5nZXRMaXN0RGF0YUxpc3RlbmVycygpLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0U2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKExpc3RTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZyBmb3Igbm93Li4uCi0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1ByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9QcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlYWMwZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1ByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRNdXRhYmxlVHJlZU5vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlTW9kZWw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlByaW1pdGl2ZUxpc3RUcmVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCVRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JcHJpdmF0ZSBUcmVlTW9kZWwgdHJlZU1vZGVsOwotCi0JcHVibGljIFByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnRlc3RNb2RlbCA9IHRoaXMuYnVpbGRUZXN0TW9kZWwoKTsKLQkJdGhpcy50cmVlTW9kZWwgPSB0aGlzLmJ1aWxkVHJlZU1vZGVsKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgYnVpbGRUZXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgVGVzdE1vZGVsKCk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTW9kZWwgYnVpbGRUcmVlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJpbWl0aXZlTGlzdFRyZWVNb2RlbCh0aGlzLmJ1aWxkTGlzdFZhbHVlTW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcmltaXRpdmVDaGFuZ2VkKGludCBpbmRleCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQkJaWYgKCAhIG5ld1ZhbHVlLmVxdWFscygiIikpIHsKLQkJCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLnRoaXMudGVzdE1vZGVsLnJlcGxhY2VOYW1lKGluZGV4LCAoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Pz4gYnVpbGRMaXN0VmFsdWVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIFN0cmluZz4oVGVzdE1vZGVsLk5BTUVTX0xJU1QsIHRoaXMudGVzdE1vZGVsKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZXMoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXQoaW50IGluZGV4KSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKGluZGV4KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBzaXplKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcmltaXRpdmUoKSB7Ci0JCXRoaXMudHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0luc2VydGVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMudGhpcy52ZXJpZnlUcmVlTW9kZWxFdmVudChlLCBuZXcgaW50W10gezB9LCBuZXcgU3RyaW5nW10geyJmb28ifSk7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJmb28iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJpbWl0aXZlKCkgewotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJmb28iKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiYmFyIik7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImJheiIpOwotCQl0aGlzLnRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNSZW1vdmVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMudGhpcy52ZXJpZnlUcmVlTW9kZWxFdmVudChlLCBuZXcgaW50W10gezF9LCBuZXcgU3RyaW5nW10geyJiYXIifSk7Ci0JCQl9Ci0JCX0pOwotCQlTdHJpbmcgbmFtZSA9IHRoaXMudGVzdE1vZGVsLnJlbW92ZU5hbWUoMSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgbmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VQcmltaXRpdmUoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImZvbyIpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJiYXIiKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiYmF6Iik7Ci0JCXRoaXMudHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0NoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy50aGlzLnZlcmlmeVRyZWVNb2RlbEV2ZW50KGUsIG5ldyBpbnRbXSB7MX0sIG5ldyBTdHJpbmdbXSB7ImphciJ9KTsKLQkJCX0KLQkJfSk7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy50ZXN0TW9kZWwucmVwbGFjZU5hbWUoMSwgImphciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG5hbWUpOwotCX0KLQotCXZvaWQgdmVyaWZ5VHJlZU1vZGVsRXZlbnQoVHJlZU1vZGVsRXZlbnQgZSwgaW50W10gZXhwZWN0ZWRDaGlsZEluZGljZXMsIFN0cmluZ1tdIGV4cGVjdGVkTmFtZXMpIHsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkQ2hpbGRJbmRpY2VzLCBlLmdldENoaWxkSW5kaWNlcygpKSk7Ci0JCU9iamVjdFtdIGFjdHVhbENoaWxkcmVuID0gZS5nZXRDaGlsZHJlbigpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWROYW1lcy5sZW5ndGgsIGFjdHVhbENoaWxkcmVuLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWROYW1lcy5sZW5ndGg7IGkrKykgewotCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBub2RlID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpIGFjdHVhbENoaWxkcmVuW2ldOwotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTmFtZXNbaV0sIG5vZGUuZ2V0VXNlck9iamVjdCgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMSwgZS5nZXRQYXRoKCkubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJlZU1vZGVsLmdldFJvb3QoKSwgZS5nZXRQYXRoKClbMF0pOwotCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCX0KLQotCi0vLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IG5hbWVzOwotCQkJc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU19MSVNUID0gIm5hbWVzIjsKLQkKLQkJVGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJfQotCQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmFtZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5uYW1lcyk7Ci0JCX0KLQkJcHVibGljIGludCBuYW1lc1NpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lcy5zaXplKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMubmFtZXMuZ2V0KGluZGV4KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lKGludCBpbmRleCwgU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgbmFtZSwgdGhpcy5uYW1lcywgTkFNRVNfTElTVCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZShTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5hZGROYW1lKHRoaXMubmFtZXNTaXplKCksIG5hbWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWVzKGludCBpbmRleCwgTGlzdDxTdHJpbmc+IGxpc3QpIHsKLQkJCXRoaXMuYWRkSXRlbXNUb0xpc3QoaW5kZXgsIHRoaXMubmFtZXMsIGxpc3QsIE5BTUVTX0xJU1QpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWVzKExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCQl0aGlzLmFkZE5hbWVzKHRoaXMubmFtZXNTaXplKCksIGxpc3QpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlTmFtZShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5uYW1lcywgTkFNRVNfTElTVCk7Ci0JCX0KLQkJcHVibGljIExpc3Q8U3RyaW5nPiByZW1vdmVOYW1lcyhpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QoaW5kZXgsIGxlbmd0aCwgdGhpcy5uYW1lcywgTkFNRVNfTElTVCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyByZXBsYWNlTmFtZShpbnQgaW5kZXgsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXRJdGVtSW5MaXN0KGluZGV4LCBuZXdOYW1lLCB0aGlzLm5hbWVzLCBOQU1FU19MSVNUKTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgY2xhc3MgVGVzdFRyZWVNb2RlbExpc3RlbmVyIGltcGxlbWVudHMgVHJlZU1vZGVsTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNJbnNlcnRlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZU5vZGVzUmVtb3ZlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZVN0cnVjdHVyZUNoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDhmNGJlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5CdXR0b25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5FdmVudExpc3RlbmVyTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5SYWRpb0J1dHRvbk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCi0JcHJpdmF0ZSBCdXR0b25Nb2RlbCByZWRCdXR0b25Nb2RlbEFkYXB0ZXI7Ci0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciByZWRMaXN0ZW5lcjsKLQlib29sZWFuIHJlZEV2ZW50RmlyZWQ7Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyOwotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgZ3JlZW5MaXN0ZW5lcjsKLQlib29sZWFuIGdyZWVuRXZlbnRGaXJlZDsKLQotCXByaXZhdGUgQnV0dG9uTW9kZWwgYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlcjsKLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJsdWVMaXN0ZW5lcjsKLQlib29sZWFuIGJsdWVFdmVudEZpcmVkOwotCi0vLwlwcml2YXRlIEJ1dHRvbkdyb3VwIGJ1dHRvbkdyb3VwOwkvLyBETyBOT1QgdXNlIGEgQnV0dG9uR3JvdXAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUQgPSAicmVkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFRU4gPSAiZ3JlZW4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCTFVFID0gImJsdWUiOwotCi0JcHVibGljIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PihudWxsKTsKLS8vCQlidXR0b25Hcm91cCA9IG5ldyBCdXR0b25Hcm91cCgpOwotCi0JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyID0gdGhpcy5idWlsZEJ1dHRvbk1vZGVsKHRoaXMudmFsdWVIb2xkZXIsIFJFRCk7Ci0vLwkJdGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuc2V0R3JvdXAoYnV0dG9uR3JvdXApOwotCQl0aGlzLnJlZExpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLnRoaXMucmVkRXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0KLQkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlciA9IHRoaXMuYnVpbGRCdXR0b25Nb2RlbCh0aGlzLnZhbHVlSG9sZGVyLCBHUkVFTik7Ci0vLwkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5zZXRHcm91cChidXR0b25Hcm91cCk7Ci0JCXRoaXMuZ3JlZW5MaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmdyZWVuRXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0KLQkJdGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyID0gdGhpcy5idWlsZEJ1dHRvbk1vZGVsKHRoaXMudmFsdWVIb2xkZXIsIEJMVUUpOwotLy8JCXRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5zZXRHcm91cChidXR0b25Hcm91cCk7Ci0JCXRoaXMuYmx1ZUxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLnRoaXMuYmx1ZUV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9OwotCQkKLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBidWlsZEJ1dHRvbk1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gcHZtLCBPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcihwdm0sIGJ1dHRvblZhbHVlKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0ZW5Ub01vZGVsQWRhcHRlcnMoKSB7Ci0JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMucmVkTGlzdGVuZXIpOwotCQl0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuZ3JlZW5MaXN0ZW5lcik7Ci0JCXRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJsdWVMaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRmxhZ3MoKSB7Ci0JCXRoaXMucmVkRXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmdyZWVuRXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmJsdWVFdmVudEZpcmVkID0gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZWxlY3RlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmxpc3RlblRvTW9kZWxBZGFwdGVycygpOwotCi0JCXRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKEdSRUVOLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuY2xlYXJGbGFncygpOwotCQl0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoQkxVRSwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQkJdGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5yZWRFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoUkVELCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmxpc3RlblRvTW9kZWxBZGFwdGVycygpOwotCi0JCXRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0KLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoQkxVRSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0KLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoUkVEKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMubGlzdGVuVG9Nb2RlbEFkYXB0ZXJzKCk7Ci0KLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShHUkVFTik7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5yZWRFdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCi0JCXRoaXMuY2xlYXJGbGFncygpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKEJMVUUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGxvY2FsVmFsdWVIb2xkZXIgPSAoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQotCQl0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKE9iamVjdCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IChFdmVudExpc3RlbmVyTGlzdCkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUobW9kZWwsICJsaXN0ZW5lckxpc3QiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gKEV2ZW50TGlzdGVuZXJMaXN0KSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShtb2RlbCwgImxpc3RlbmVyTGlzdCIpOwotCQlhc3NlcnRGYWxzZShsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCkubGVuZ3RoID09IDApOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCVRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmE2ZjYyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQnV0dG9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpSYWRpb0J1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5SYWRpb0J1dHRvbk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIHJhZGlvIGJ1dHRvbnMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXByaXZhdGUgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBjb2xvckhvbGRlcjsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIHJlZEJ1dHRvbk1vZGVsOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgZ3JlZW5CdXR0b25Nb2RlbDsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJsdWVCdXR0b25Nb2RlbDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKCk7Ci0JfQotCi0JcHJpdmF0ZSBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlYygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCQl0aGlzLmNvbG9ySG9sZGVyID0gdGhpcy5idWlsZENvbG9ySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5yZWRCdXR0b25Nb2RlbCA9IHRoaXMuYnVpbGRSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcih0aGlzLmNvbG9ySG9sZGVyLCBUZXN0TW9kZWwuUkVEKTsKLQkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsID0gdGhpcy5idWlsZFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKHRoaXMuY29sb3JIb2xkZXIsIFRlc3RNb2RlbC5HUkVFTik7Ci0JCXRoaXMuYmx1ZUJ1dHRvbk1vZGVsID0gdGhpcy5idWlsZFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKHRoaXMuY29sb3JIb2xkZXIsIFRlc3RNb2RlbC5CTFVFKTsKLQkJdGhpcy5vcGVuV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkQ29sb3JIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE9iamVjdD4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLkNPTE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPYmplY3QgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb2xvcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldENvbG9yKChTdHJpbmcpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJ1aWxkUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBjb2xvclBWTSwgU3RyaW5nIGNvbG9yKSB7Ci0JCXJldHVybiBuZXcgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIoY29sb3JQVk0sIGNvbG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRTaXplKDQwMCwgMTAwKTsKLQkJd2luZG93LnNldExvY2F0aW9uKDIwMCwgMjAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFJhZGlvQnV0dG9uUGFuZWwoKSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRSYWRpb0J1dHRvblBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVkUmFkaW9CdXR0b24oKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRHcmVlblJhZGlvQnV0dG9uKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkQmx1ZVJhZGlvQnV0dG9uKCkpOwotCQlyZXR1cm4gdGFza0xpc3RQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpSYWRpb0J1dHRvbiBidWlsZFJlZFJhZGlvQnV0dG9uKCkgewotCQlKUmFkaW9CdXR0b24gcmFkaW9CdXR0b24gPSBuZXcgSlJhZGlvQnV0dG9uKCk7Ci0JCXJhZGlvQnV0dG9uLnNldFRleHQoInJlZCIpOwotCQlyYWRpb0J1dHRvbi5zZXRNb2RlbCh0aGlzLnJlZEJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIHJhZGlvQnV0dG9uOwotCX0KLQotCXByaXZhdGUgSlJhZGlvQnV0dG9uIGJ1aWxkR3JlZW5SYWRpb0J1dHRvbigpIHsKLQkJSlJhZGlvQnV0dG9uIHJhZGlvQnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigpOwotCQlyYWRpb0J1dHRvbi5zZXRUZXh0KCJncmVlbiIpOwotCQlyYWRpb0J1dHRvbi5zZXRNb2RlbCh0aGlzLmdyZWVuQnV0dG9uTW9kZWwpOwotCQlyZXR1cm4gcmFkaW9CdXR0b247Ci0JfQotCi0JcHJpdmF0ZSBKUmFkaW9CdXR0b24gYnVpbGRCbHVlUmFkaW9CdXR0b24oKSB7Ci0JCUpSYWRpb0J1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oKTsKLQkJcmFkaW9CdXR0b24uc2V0VGV4dCgiYmx1ZSIpOwotCQlyYWRpb0J1dHRvbi5zZXRNb2RlbCh0aGlzLmJsdWVCdXR0b25Nb2RlbCk7Ci0JCXJldHVybiByYWRpb0J1dHRvbjsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXNldENvbG9yQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24oKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzZXRDb2xvckJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldENvbG9yQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzZXRDb2xvckFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzZXQgY29sb3IiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc2V0Q29sb3IoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXNldENvbG9yKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXRDb2xvcihUZXN0TW9kZWwuREVGQVVMVF9DT0xPUik7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiY2xlYXIgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXN0b3JlIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucHJpbnRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgY29sb3I7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9QUk9QRVJUWSA9ICJjb2xvciI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUQgPSAicmVkIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUVOID0gImdyZWVuIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUUgPSAiYmx1ZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTE9SID0gUkVEOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxJRF9DT0xPUlMgPSB7Ci0JCQkJUkVELAotCQkJCUdSRUVOLAotCQkJCUJMVUUKLQkJCX07Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoKSB7Ci0JCQl0aGlzKERFRkFVTFRfQ09MT1IpOwotCQl9Ci0JCXB1YmxpYyBUZXN0TW9kZWwoU3RyaW5nIGNvbG9yKSB7Ci0JCQl0aGlzLmNvbG9yID0gY29sb3I7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRDb2xvcigpIHsKLQkJCXJldHVybiB0aGlzLmNvbG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKFN0cmluZyBjb2xvcikgewotCQkJaWYgKCAhIEFycmF5VG9vbHMuY29udGFpbnMoVkFMSURfQ09MT1JTLCBjb2xvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNvbG9yKTsKLQkJCX0KLQkJCU9iamVjdCBvbGQgPSB0aGlzLmNvbG9yOwotCQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTE9SX1BST1BFUlRZLCBvbGQsIGNvbG9yKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmNvbG9yICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JlYWRPbmx5VGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmZiNjZmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5QZXJzb25Db2x1bW5BZGFwdGVyOwotCi0vKioKLSAqIE1ha2UgaXQgZWFzeSB0byB0ZXN0IHRoZSB0YWJsZSBtb2RlbCBhZGFwdGVyIGFuZAotICogcmVuZGVyZXJzIHdpdGhvdXQgYW55IGVkaXRpbmcgYWxsb3dlZC4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5VGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QgZXh0ZW5kcyBUYWJsZU1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IFJlYWRPbmx5VGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKGFyZ3MpOwotCX0KLQotCXByb3RlY3RlZCBSZWFkT25seVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2x1bW5BZGFwdGVyIGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQZXJzb25Db2x1bW5BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBjb2x1bW5Jc0VkaXRhYmxlKGludCBpbmRleCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDlhYzczLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5TcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcjsKLQlTcGlubmVyTW9kZWwgc3Bpbm5lck1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4obmV3IEludGVnZXIoMCkpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLnZhbHVlSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZFZhbHVlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVNwaW5uZXJNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQkJYXNzZXJ0RXF1YWxzKFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIsIGUuZ2V0U291cmNlKCkpOwotCQkJfQotCQl9KTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNSksIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlVmFsdWVIb2xkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJCWFzc2VydEVxdWFscyhTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLCBlLmdldFNvdXJjZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDcpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNyksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGxvY2FsVmFsdWVIb2xkZXIgPSAoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoT2JqZWN0IGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgZGVsZWdhdGUgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShhZGFwdGVyLCAiZGVsZWdhdGUiKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gKE9iamVjdFtdKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChkZWxlZ2F0ZSwgImdldENoYW5nZUxpc3RlbmVycyIpOwotCQlhc3NlcnRFcXVhbHMoMCwgbGlzdGVuZXJzLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhPYmplY3QgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBkZWxlZ2F0ZSA9IFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKGFkYXB0ZXIsICJkZWxlZ2F0ZSIpOwotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSAoT2JqZWN0W10pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGRlbGVnYXRlLCAiZ2V0Q2hhbmdlTGlzdGVuZXJzIik7Ci0JCWFzc2VydEZhbHNlKGxpc3RlbmVycy5sZW5ndGggPT0gMCk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyIHsKLQkJVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2QzNDBlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTcGlubmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5EYXRlU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0U3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIHNwaW5uZXJzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXByaXZhdGUgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJpcnRoRGF0ZUhvbGRlcjsKLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBiaXJ0aERhdGVTcGlubmVyTW9kZWw7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gYWdlSG9sZGVyOwotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGFnZVNwaW5uZXJNb2RlbDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBleWVDb2xvckhvbGRlcjsKLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBleWVDb2xvclNwaW5uZXJNb2RlbDsKLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBTcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYygpOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlYygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCi0JCXRoaXMuYmlydGhEYXRlSG9sZGVyID0gdGhpcy5idWlsZEJpcnRoRGF0ZUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuYmlydGhEYXRlU3Bpbm5lck1vZGVsID0gdGhpcy5idWlsZEJpcnRoRGF0ZVNwaW5uZXJNb2RlbCh0aGlzLmJpcnRoRGF0ZUhvbGRlcik7Ci0KLQkJdGhpcy5hZ2VIb2xkZXIgPSB0aGlzLmJ1aWxkQWdlSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5hZ2VTcGlubmVyTW9kZWwgPSB0aGlzLmJ1aWxkQWdlU3Bpbm5lck1vZGVsKHRoaXMuYWdlSG9sZGVyKTsKLQotCQl0aGlzLmV5ZUNvbG9ySG9sZGVyID0gdGhpcy5idWlsZEV5ZUNvbG9ySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5leWVDb2xvclNwaW5uZXJNb2RlbCA9IHRoaXMuYnVpbGRFeWVDb2xvclNwaW5uZXJNb2RlbCh0aGlzLmV5ZUNvbG9ySG9sZGVyKTsKLQotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRCaXJ0aERhdGVIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBPYmplY3Q+KHZtLCBUZXN0TW9kZWwuQklSVEhfREFURV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT2JqZWN0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0QmlydGhEYXRlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0QmlydGhEYXRlKChEYXRlKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYnVpbGRCaXJ0aERhdGVTcGlubmVyTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKHZhbHVlSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gYnVpbGRBZ2VIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBOdW1iZXI+KHZtLCBUZXN0TW9kZWwuQUdFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBOdW1iZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuc3ViamVjdC5nZXRBZ2UoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhOdW1iZXIgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0QWdlKHZhbHVlLmludFZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkQWdlU3Bpbm5lck1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gdmFsdWVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKHZhbHVlSG9sZGVyLCB2YWx1ZUhvbGRlci5nZXRWYWx1ZSgpLmludFZhbHVlKCksIFRlc3RNb2RlbC5NSU5fQUdFLCBUZXN0TW9kZWwuTUFYX0FHRSwgMSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkRXllQ29sb3JIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBPYmplY3Q+KHZtLCBUZXN0TW9kZWwuRVlFX0NPTE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPYmplY3QgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFeWVDb2xvcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEV5ZUNvbG9yKChTdHJpbmcpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZEV5ZUNvbG9yU3Bpbm5lck1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcih2YWx1ZUhvbGRlciwgVGVzdE1vZGVsLlZBTElEX0VZRV9DT0xPUlMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoNjAwLCAxMDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkU3Bpbm5lclBhbmVsKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkU3Bpbm5lclBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkQmlydGhEYXRlU3Bpbm5lcigpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEFnZVNwaW5uZXIoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRFeWVDb2xvclNwaW5uZXIoKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRCaXJ0aERhdGVTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYmlydGhEYXRlU3Bpbm5lck1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpTcGlubmVyIGJ1aWxkQWdlU3Bpbm5lcigpIHsKLQkJcmV0dXJuIG5ldyBKU3Bpbm5lcih0aGlzLmFnZVNwaW5uZXJNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZEV5ZUNvbG9yU3Bpbm5lcigpIHsKLQkJcmV0dXJuIG5ldyBKU3Bpbm5lcih0aGlzLmV5ZUNvbG9yU3Bpbm5lck1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXNldE1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24oKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzZXRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzZXRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzZXQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzZXRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc2V0TW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldEJpcnRoRGF0ZShUZXN0TW9kZWwuREVGQVVMVF9CSVJUSF9EQVRFKTsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0RXllQ29sb3IoVGVzdE1vZGVsLkRFRkFVTFRfRVlFX0NPTE9SKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzdG9yZSBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiaXJ0aCBkYXRlOiAiICsgdGhpcy50ZXN0TW9kZWwuZ2V0QmlydGhEYXRlKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImFnZTogIiArIHRoaXMudGVzdE1vZGVsLmdldEFnZSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJleWVzOiAiICsgdGhpcy50ZXN0TW9kZWwuZ2V0RXllQ29sb3IoKSk7Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgQ2FsZW5kYXIgYmlydGhDYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCQkJLy8gInZpcnR1YWwiIHByb3BlcnRpZXMKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJUlRIX0RBVEVfUFJPUEVSVFkgPSAiYmlydGhEYXRlIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFHRV9QUk9QRVJUWSA9ICJhZ2UiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfQklSVEhfREFURSA9IG5ldyBEYXRlKCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0FHRSA9IDA7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fQUdFID0gMDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9BR0UgPSAxNTA7Ci0JCXByaXZhdGUgU3RyaW5nIGV5ZUNvbG9yOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX1BST1BFUlRZID0gImV5ZUNvbG9yIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMSURfRVlFX0NPTE9SUyA9IHsiYmx1ZSIsICJicm93biIsICJncmVlbiIsICJoYXplbCIsICJwaW5rIn07Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VZRV9DT0xPUiA9IFZBTElEX0VZRV9DT0xPUlNbM107Ci0JCi0JCVRlc3RNb2RlbCgpIHsKLQkJCXRoaXMoREVGQVVMVF9CSVJUSF9EQVRFLCBERUZBVUxUX0VZRV9DT0xPUik7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbChEYXRlIGJpcnRoRGF0ZSwgU3RyaW5nIGV5ZUNvbG9yKSB7Ci0JCQl0aGlzLnNldEJpcnRoRGF0ZShiaXJ0aERhdGUpOwotCQkJdGhpcy5zZXRFeWVDb2xvcihleWVDb2xvcik7Ci0JCX0KLQkJcHVibGljIERhdGUgZ2V0QmlydGhEYXRlKCkgewotCQkJcmV0dXJuIChEYXRlKSB0aGlzLmJpcnRoQ2FsLmdldFRpbWUoKS5jbG9uZSgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEJpcnRoRGF0ZShEYXRlIGJpcnRoRGF0ZSkgewotCQkJRGF0ZSBvbGRCaXJ0aERhdGUgPSB0aGlzLmdldEJpcnRoRGF0ZSgpOwotCQkJaW50IG9sZEFnZSA9IHRoaXMuZ2V0QWdlKCk7Ci0JCQl0aGlzLmJpcnRoQ2FsLnNldFRpbWVJbk1pbGxpcyhiaXJ0aERhdGUuZ2V0VGltZSgpKTsKLQkJCWludCBuZXdBZ2UgPSB0aGlzLmdldEFnZSgpOwotCQkJaWYgKG5ld0FnZSA8IE1JTl9BR0UgfHwgbmV3QWdlID4gTUFYX0FHRSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oYmlydGhEYXRlLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEJJUlRIX0RBVEVfUFJPUEVSVFksIG9sZEJpcnRoRGF0ZSwgdGhpcy5nZXRCaXJ0aERhdGUoKSk7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUdFX1BST1BFUlRZLCBvbGRBZ2UsIG5ld0FnZSk7Ci0JCX0KLQkJcHVibGljIGludCBnZXRBZ2UoKSB7Ci0JCQlDYWxlbmRhciBjdXJyZW50Q2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWludCBhZ2UgPSBjdXJyZW50Q2FsLmdldChDYWxlbmRhci5ZRUFSKSAtIHRoaXMuYmlydGhDYWwuZ2V0KENhbGVuZGFyLllFQVIpOwotCQkJaWYgKGN1cnJlbnRDYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSA8IHRoaXMuYmlydGhDYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSkgewotCQkJCWFnZS0tOwotCQkJfSBlbHNlIGlmIChjdXJyZW50Q2FsLmdldChDYWxlbmRhci5NT05USCkgPT0gdGhpcy5iaXJ0aENhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpKSB7Ci0JCQkJaWYgKGN1cnJlbnRDYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCkgPCB0aGlzLmJpcnRoQ2FsLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKSB7Ci0JCQkJCWFnZS0tOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBhZ2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0QWdlKGludCBuZXdBZ2UpIHsKLQkJCWlmIChuZXdBZ2UgPCBNSU5fQUdFIHx8IG5ld0FnZSA+IE1BWF9BR0UpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKG5ld0FnZSkpOwotCQkJfQotCQotCQkJaW50IG9sZEFnZSA9IHRoaXMuZ2V0QWdlKCk7Ci0JCQlpbnQgZGVsdGEgPSBuZXdBZ2UgLSBvbGRBZ2U7Ci0JCi0JCQlDYWxlbmRhciBuZXdCaXJ0aENhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0JCQluZXdCaXJ0aENhbC5zZXRUaW1lSW5NaWxsaXModGhpcy5iaXJ0aENhbC5nZXRUaW1lKCkuZ2V0VGltZSgpKTsKLQkJCS8vIGlmIHRoZSBhZ2UgaW5jcmVhc2VkLCB0aGUgYmlydGggZGF0ZSBtdXN0IGJlICJkZWNyZWFzZWQiOyBhbmQgdmljZSB2ZXJzYQotCQkJbmV3QmlydGhDYWwuc2V0KENhbGVuZGFyLllFQVIsIG5ld0JpcnRoQ2FsLmdldChDYWxlbmRhci5ZRUFSKSAtIGRlbHRhKTsKLQkJCXRoaXMuc2V0QmlydGhEYXRlKG5ld0JpcnRoQ2FsLmdldFRpbWUoKSk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRFeWVDb2xvcigpIHsKLQkJCXJldHVybiB0aGlzLmV5ZUNvbG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEV5ZUNvbG9yKFN0cmluZyBleWVDb2xvcikgewotCQkJaWYgKCAhIEFycmF5VG9vbHMuY29udGFpbnMoVkFMSURfRVlFX0NPTE9SUywgZXllQ29sb3IpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihleWVDb2xvcik7Ci0JCQl9Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5leWVDb2xvcjsKLQkJCXRoaXMuZXllQ29sb3IgPSBleWVDb2xvcjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWUVfQ09MT1JfUFJPUEVSVFksIG9sZCwgZXllQ29sb3IpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0TW9kZWwoYmlydGg6ICIgKyB0aGlzLmdldEJpcnRoRGF0ZSgpICsgIiAtIGV5ZXM6ICIgKyB0aGlzLmV5ZUNvbG9yICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RhYmxlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTUxZWYwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVGFibGVNb2RlbEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRhYmxlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRhYmxlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGFibGVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIENyb3dkIGNyb3dkOwotCVRhYmxlTW9kZWxFdmVudCBldmVudDsKLQotCXB1YmxpYyBUYWJsZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY3Jvd2QgPSB0aGlzLmJ1aWxkQ3Jvd2QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFJvd0NvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZU1vZGVsQWRhcHRlci5nZXRSb3dDb3VudCgpKTsKLQkJLy8gd2UgbmVlZCB0byBhZGQgYSBsaXN0ZW5lciB0byB3YWtlIHVwIHRoZSBhZGFwdGVyCi0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcih0aGlzLmJ1aWxkVGFibGVNb2RlbExpc3RlbmVyKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jcm93ZC5wZW9wbGVTaXplKCksIHRhYmxlTW9kZWxBZGFwdGVyLmdldFJvd0NvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5Db3VudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRFcXVhbHMoUGVyc29uQ29sdW1uQWRhcHRlci5DT0xVTU5fQ09VTlQsIHRhYmxlTW9kZWxBZGFwdGVyLmdldENvbHVtbkNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcih0aGlzLmJ1aWxkVGFibGVNb2RlbExpc3RlbmVyKCkpOwotCi0JCUxpc3Q8U3RyaW5nPiBzb3J0ZWROYW1lcyA9IHRoaXMuc29ydGVkTmFtZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNyb3dkLnBlb3BsZVNpemUoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc29ydGVkTmFtZXMuZ2V0KGkpLCB0YWJsZU1vZGVsQWRhcHRlci5nZXRWYWx1ZUF0KGksIFBlcnNvbkNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4pKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUYWJsZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChUYWJsZU1vZGVsRXZlbnQgZSkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX0pOwotCi0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLmNyb3dkLnBlcnNvbk5hbWVkKCJHb2xsdW0iKTsKLQkJYXNzZXJ0RXF1YWxzKFBlcnNvbi5FWUVfQ09MT1JfQkxVRSwgcGVyc29uLmdldEV5ZUNvbG9yKCkpOwotCQlhc3NlcnRGYWxzZShwZXJzb24uaXNFdmlsKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGVyc29uLmdldFJhbmsoKSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZU1vZGVsQWRhcHRlci5nZXRSb3dDb3VudCgpOyBpKyspIHsKLQkJCWlmICh0YWJsZU1vZGVsQWRhcHRlci5nZXRWYWx1ZUF0KGksIFBlcnNvbkNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4pLmVxdWFscygiR29sbHVtIikpIHsKLQkJCQl0YWJsZU1vZGVsQWRhcHRlci5zZXRWYWx1ZUF0KFBlcnNvbi5FWUVfQ09MT1JfSEFaRUwsIGksIFBlcnNvbkNvbHVtbkFkYXB0ZXIuRVlFX0NPTE9SX0NPTFVNTik7Ci0JCQkJdGFibGVNb2RlbEFkYXB0ZXIuc2V0VmFsdWVBdChCb29sZWFuLlRSVUUsIGksIFBlcnNvbkNvbHVtbkFkYXB0ZXIuRVZJTF9DT0xVTU4pOwotCQkJCXRhYmxlTW9kZWxBZGFwdGVyLnNldFZhbHVlQXQobmV3IEludGVnZXIoLTEpLCBpLCBQZXJzb25Db2x1bW5BZGFwdGVyLlJBTktfQ09MVU1OKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHMoUGVyc29uLkVZRV9DT0xPUl9IQVpFTCwgcGVyc29uLmdldEV5ZUNvbG9yKCkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5pc0V2aWwoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgcGVyc29uLmdldFJhbmsoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJvdygpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVFdmVudExpc3RlbmVyKCkpOwotCQkvLyBhZGQgYSBwZXJzb24gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBzbyB3ZSBvbmx5IHRyaWdnZXIgb25lIGV2ZW50Ci0JCXRoaXMuY3Jvd2QuYWRkUGVyc29uKCJaenp6eiIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHMoVGFibGVNb2RlbEV2ZW50LklOU0VSVCwgdGhpcy5ldmVudC5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoVGFibGVNb2RlbEV2ZW50LkFMTF9DT0xVTU5TLCB0aGlzLmV2ZW50LmdldENvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUm93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUV2ZW50TGlzdGVuZXIoKSk7Ci0JCS8vIHJlbW92aW5nIGEgcGVyc29uIHNob3VsZCBvbmx5IHRyaWdnZXIgb25lIGV2ZW50LCBzaW5jZSBhIHJlLXNvcnQgaXMgbm90IG5lZWRlZAotCQl0aGlzLmNyb3dkLnJlbW92ZVBlcnNvbih0aGlzLmNyb3dkLnBlcnNvbk5hbWVkKCJHb2xsdW0iKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydEVxdWFscyhUYWJsZU1vZGVsRXZlbnQuREVMRVRFLCB0aGlzLmV2ZW50LmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUYWJsZU1vZGVsRXZlbnQuQUxMX0NPTFVNTlMsIHRoaXMuZXZlbnQuZ2V0Q29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VDZWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUV2ZW50TGlzdGVuZXIoKSk7Ci0JCS8vIGFkZCBhIHBlcnNvbiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IHNvIHdlIG9ubHkgdHJpZ2dlciBvbmUgZXZlbnQKLQkJUGVyc29uIHBlcnNvbiA9IHRoaXMuY3Jvd2QucGVyc29uTmFtZWQoIkdvbGx1bSIpOwotCQlwZXJzb24uc2V0RXZpbCh0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKFRhYmxlTW9kZWxFdmVudC5VUERBVEUsIHRoaXMuZXZlbnQuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFBlcnNvbkNvbHVtbkFkYXB0ZXIuRVZJTF9DT0xVTU4sIHRoaXMuZXZlbnQuZ2V0Q29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCVRhYmxlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRUYWJsZU1vZGVsTGlzdGVuZXIoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNyb3dkLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDcm93ZC5QRU9QTEVfQ09MTEVDVElPTikpOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuY3Jvd2QuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDcm93ZC5QRU9QTEVfQ09MTEVDVElPTikpOwotCQl0YWJsZU1vZGVsQWRhcHRlci5yZW1vdmVUYWJsZU1vZGVsTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuY3Jvd2QuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENyb3dkLlBFT1BMRV9DT0xMRUNUSU9OKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlDZWxsTGlzdGVuZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJVGFibGVNb2RlbExpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRhYmxlTW9kZWxMaXN0ZW5lcigpOwotCQlQZXJzb24gcGVyc29uID0gdGhpcy5jcm93ZC5wZXJzb25OYW1lZCgiR29sbHVtIik7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uQklSVEhfREFURV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5FWUVfQ09MT1JfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uRVZJTF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5SQU5LX1BST1BFUlRZKSk7Ci0KLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkJJUlRIX0RBVEVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkVZRV9DT0xPUl9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uRVZJTF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uUkFOS19QUk9QRVJUWSkpOwotCi0JCXRhYmxlTW9kZWxBZGFwdGVyLnJlbW92ZVRhYmxlTW9kZWxMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uQklSVEhfREFURV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5FWUVfQ09MT1JfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uRVZJTF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5SQU5LX1BST1BFUlRZKSk7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IGJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPih0aGlzLmJ1aWxkU29ydGVkUGVvcGxlQWRhcHRlcigpLCB0aGlzLmJ1aWxkQ29sdW1uQWRhcHRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2VsbExpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkQ2VsbExpc3RlbmVyXygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UGVyc29uPiBidWlsZFNvcnRlZFBlb3BsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFBlcnNvbj4odGhpcy5idWlsZFBlb3BsZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxQZXJzb24+IGJ1aWxkUGVvcGxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxDcm93ZCwgUGVyc29uPihDcm93ZC5QRU9QTEVfQ09MTEVDVElPTiwgdGhpcy5jcm93ZCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc29uPiBpdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wZW9wbGUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnBlb3BsZVNpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENyb3dkIGJ1aWxkQ3Jvd2QoKSB7Ci0JCUNyb3dkIHJlc3VsdCA9IG5ldyBDcm93ZCgpOwotCQlyZXN1bHQuYWRkUGVyc29uKCJCaWxibyIpOwotCQlyZXN1bHQuYWRkUGVyc29uKCJHb2xsdW0iKTsKLQkJcmVzdWx0LmFkZFBlcnNvbigiRnJvZG8iKTsKLQkJcmVzdWx0LmFkZFBlcnNvbigiU2Ftd2lzZSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQ29sdW1uQWRhcHRlciBidWlsZENvbHVtbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUGVyc29uQ29sdW1uQWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgVGFibGVNb2RlbExpc3RlbmVyIGJ1aWxkVGFibGVNb2RlbExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRlc3RUYWJsZU1vZGVsTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzb3J0ZWROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuc29ydGVkU2V0KHRoaXMuY3Jvd2QucGVvcGxlTmFtZXMoKSkpOwotCX0KLQotCXByaXZhdGUgVGFibGVNb2RlbExpc3RlbmVyIGJ1aWxkU2luZ2xlRXZlbnRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUZXN0VGFibGVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoVGFibGVNb2RlbEV2ZW50IGUpIHsKLQkJCQkvLyB3ZSBleHBlY3Qgb25seSBhIHNpbmdsZSBldmVudAotCQkJCWlmIChUYWJsZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPT0gbnVsbCkgewotCQkJCQlUYWJsZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQZXJzb25Db2x1bW5BZGFwdGVyIGltcGxlbWVudHMgQ29sdW1uQWRhcHRlciB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9DT1VOVCA9IDc7Ci0JCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfQ09MVU1OID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklSVEhfREFURV9DT0xVTU4gPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHT05FX1dFU1RfREFURV9DT0xVTU4gPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWUVfQ09MT1JfQ09MVU1OID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZJTF9DT0xVTU4gPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQU5LX0NPTFVNTiA9IDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEVkVOVFVSRV9DT1VOVF9DT0xVTU4gPSA2OwotCQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT0xVTU5fTkFNRVMgPSBuZXcgU3RyaW5nW10gewotCQkJIk5hbWUiLAotCQkJIkJpcnRoIiwKLQkJCSJHb25lIFdlc3QiLAotCQkJIkV5ZXMiLAotCQkJIkV2aWwiLAotCQkJIlJhbmsiLAotCQkJIkFkdmVudHVyZXMiCi0JCX07Ci0JCi0JCi0JCXB1YmxpYyBpbnQgY29sdW1uQ291bnQoKSB7Ci0JCQlyZXR1cm4gQ09MVU1OX0NPVU5UOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgY29sdW1uTmFtZShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBDT0xVTU5fTkFNRVNbaW5kZXhdOwotCQl9Ci0JCi0JCXB1YmxpYyBDbGFzczw/PiBjb2x1bW5DbGFzcyhpbnQgaW5kZXgpIHsKLQkJCXN3aXRjaCAoaW5kZXgpIHsKLQkJCQljYXNlIE5BTUVfQ09MVU1OOgkJCQkJcmV0dXJuIE9iamVjdC5jbGFzczsKLQkJCQljYXNlIEJJUlRIX0RBVEVfQ09MVU1OOgkJCXJldHVybiBEYXRlLmNsYXNzOwotCQkJCWNhc2UgR09ORV9XRVNUX0RBVEVfQ09MVU1OOglyZXR1cm4gRGF0ZS5jbGFzczsKLQkJCQljYXNlIEVZRV9DT0xPUl9DT0xVTU46CQkJcmV0dXJuIE9iamVjdC5jbGFzczsKLQkJCQljYXNlIEVWSUxfQ09MVU1OOgkJCQkJcmV0dXJuIEJvb2xlYW4uY2xhc3M7Ci0JCQkJY2FzZSBSQU5LX0NPTFVNTjoJCQkJCXJldHVybiBJbnRlZ2VyLmNsYXNzOwotCQkJCWNhc2UgQURWRU5UVVJFX0NPVU5UX0NPTFVNTjpyZXR1cm4gSW50ZWdlci5jbGFzczsKLQkJCQlkZWZhdWx0OiAJCQkJCQkJCQlyZXR1cm4gT2JqZWN0LmNsYXNzOwotCQkJfQotCQl9Ci0JCi0JCXB1YmxpYyBib29sZWFuIGNvbHVtbklzRWRpdGFibGUoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gaW5kZXggIT0gTkFNRV9DT0xVTU47Ci0JCX0KLQkKLQkJcHVibGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSBjZWxsTW9kZWxzKE9iamVjdCBzdWJqZWN0KSB7Ci0JCQlQZXJzb24gcGVyc29uID0gKFBlcnNvbikgc3ViamVjdDsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJlc3VsdCA9IG5ldyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFtDT0xVTU5fQ09VTlRdOwotCQotCQkJcmVzdWx0W05BTUVfQ09MVU1OXSA9IHRoaXMuYnVpbGROYW1lQWRhcHRlcihwZXJzb24pOwotCQkJcmVzdWx0W0JJUlRIX0RBVEVfQ09MVU1OXSA9IHRoaXMuYnVpbGRCaXJ0aERhdGVBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbR09ORV9XRVNUX0RBVEVfQ09MVU1OXSA9IHRoaXMuYnVpbGRHb25lV2VzdERhdGVBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbRVlFX0NPTE9SX0NPTFVNTl0gPSB0aGlzLmJ1aWxkRXllQ29sb3JBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbRVZJTF9DT0xVTU5dID0gdGhpcy5idWlsZEV2aWxBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbUkFOS19DT0xVTU5dID0gdGhpcy5idWlsZFJhbmtBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbQURWRU5UVVJFX0NPVU5UX0NPTFVNTl0gPSB0aGlzLmJ1aWxkQWR2ZW50dXJlQ291bnRBZGFwdGVyKHBlcnNvbik7Ci0JCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZE5hbWVBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uTkFNRV9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUoKFN0cmluZykgdmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkQmlydGhEYXRlQWRhcHRlcihQZXJzb24gcGVyc29uKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4oUGVyc29uLkJJUlRIX0RBVEVfUFJPUEVSVFksIHBlcnNvbikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBEYXRlIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEJpcnRoRGF0ZSgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRCaXJ0aERhdGUoKERhdGUpIHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEdvbmVXZXN0RGF0ZUFkYXB0ZXIoUGVyc29uIHBlcnNvbikgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KFBlcnNvbi5HT05FX1dFU1RfREFURV9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIERhdGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0R29uZVdlc3REYXRlKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEdvbmVXZXN0RGF0ZSgoRGF0ZSkgdmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkRXllQ29sb3JBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uRVlFX0NPTE9SX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV5ZUNvbG9yKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEV5ZUNvbG9yKChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEV2aWxBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uRVZJTF9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRXZpbCgpKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0RXZpbCgoKEJvb2xlYW4pdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZFJhbmtBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uUkFOS19QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0UmFuaygpKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0UmFuaygoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEFkdmVudHVyZUNvdW50QWRhcHRlcihQZXJzb24gcGVyc29uKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4oUGVyc29uLkFEVkVOVFVSRV9DT1VOVF9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0QWR2ZW50dXJlQ291bnQoKSk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEFkdmVudHVyZUNvdW50KCgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ3Jvd2QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFBlcnNvbj4gcGVvcGxlOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVPUExFX0NPTExFQ1RJT04gPSAicGVvcGxlIjsKLQkKLQkJcHVibGljIENyb3dkKCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGVvcGxlID0gbmV3IEFycmF5TGlzdDxQZXJzb24+KCk7Ci0JCX0KLQkKLQkKLQkJcHVibGljIEl0ZXJhdG9yPFBlcnNvbj4gcGVvcGxlKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPFBlcnNvbj4odGhpcy5wZW9wbGUpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoUGVyc29uIHBlcnNvbikgewotCQkJCQlDcm93ZC50aGlzLnJlbW92ZVBlcnNvbihwZXJzb24pOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHVibGljIGludCBwZW9wbGVTaXplKCkgewotCQkJcmV0dXJuIHRoaXMucGVvcGxlLnNpemUoKTsKLQkJfQotCQotCQlwdWJsaWMgUGVyc29uIGFkZFBlcnNvbihTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5jaGVja1BlcnNvbk5hbWUobmFtZSk7Ci0JCQlyZXR1cm4gdGhpcy5hZGRQZXJzb24obmV3IFBlcnNvbih0aGlzLCBuYW1lKSk7Ci0JCX0KLQkKLQkJcHJpdmF0ZSBQZXJzb24gYWRkUGVyc29uKFBlcnNvbiBwZXJzb24pIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihwZXJzb24sIHRoaXMucGVvcGxlLCBQRU9QTEVfQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gcGVyc29uOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVBlcnNvbihQZXJzb24gcGVyc29uKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihwZXJzb24sIHRoaXMucGVvcGxlLCBQRU9QTEVfQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlUGVvcGxlKENvbGxlY3Rpb248UGVyc29uPiBwZXJzb25zKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocGVyc29ucywgdGhpcy5wZW9wbGUsIFBFT1BMRV9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCByZW1vdmVQZW9wbGUoSXRlcmF0b3I8UGVyc29uPiBwZXJzb25zKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocGVyc29ucywgdGhpcy5wZW9wbGUsIFBFT1BMRV9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQl2b2lkIGNoZWNrUGVyc29uTmFtZShTdHJpbmcgcGVyc29uTmFtZSkgewotCQkJaWYgKHBlcnNvbk5hbWUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnBlb3BsZU5hbWVzKCksIHBlcnNvbk5hbWUpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihwZXJzb25OYW1lKTsKLQkJCX0KLQkJfQotCQotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBwZW9wbGVOYW1lcygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxQZXJzb24sIFN0cmluZz4odGhpcy5wZW9wbGUuaXRlcmF0b3IoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFBlcnNvbiBwZXJzb24pIHsKLQkJCQkJcmV0dXJuIHBlcnNvbi5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCQlwdWJsaWMgUGVyc29uIHBlcnNvbk5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFBlcnNvbj4gc3RyZWFtID0gdGhpcy5wZW9wbGUuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJUGVyc29uIHBlcnNvbiA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJaWYgKHBlcnNvbi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJldHVybiBwZXJzb247Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBTdHJpbmcudmFsdWVPZih0aGlzLnBlb3BsZS5zaXplKCkpICsgIiBwZW9wbGUiKTsKLQkJfQotCQotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbiBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBDb21wYXJhYmxlPFBlcnNvbj4gewotCQlwcml2YXRlIENyb3dkIGNyb3dkOwotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWT0gIm5hbWUiOwotCQlwcml2YXRlIERhdGUgYmlydGhEYXRlOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklSVEhfREFURV9QUk9QRVJUWT0gImJpcnRoRGF0ZSI7Ci0JCXByaXZhdGUgRGF0ZSBnb25lV2VzdERhdGU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT05FX1dFU1RfREFURV9QUk9QRVJUWT0gImdvbmVXZXN0RGF0ZSI7Ci0JCXByaXZhdGUgU3RyaW5nIGV5ZUNvbG9yOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX1BST1BFUlRZPSAiZXllQ29sb3IiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX0JMVUUgPSAiYmx1ZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfR1JFRU4gPSAiZ3JlZW4iOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX0JST1dOID0gImJyb3duIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVZRV9DT0xPUl9IQVpFTCA9ICJoYXplbCI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfUElOSyA9ICJwaW5rIjsKLQkJCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiB2YWxpZEV5ZUNvbG9yczsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVlFX0NPTE9SID0gRVlFX0NPTE9SX0JMVUU7Ci0JCXByaXZhdGUgYm9vbGVhbiBldmlsOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZJTF9QUk9QRVJUWT0gImV2aWwiOwotCQlwcml2YXRlIGludCByYW5rOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOS19QUk9QRVJUWT0gInJhbmsiOwotCQlwcml2YXRlIGludCBhZHZlbnR1cmVDb3VudDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEVkVOVFVSRV9DT1VOVF9QUk9QRVJUWT0gImFkdmVudHVyZUNvdW50IjsKLQkKLQkJUGVyc29uKENyb3dkIGNyb3dkLCBTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY3Jvd2QgPSBjcm93ZDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmJpcnRoRGF0ZSA9IG5ldyBEYXRlKCk7Ci0JCQlDYWxlbmRhciBjID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWMuYWRkKENhbGVuZGFyLllFQVIsIDI1MCk7Ci0JCQl0aGlzLmdvbmVXZXN0RGF0ZSA9IG5ldyBEYXRlKGMuZ2V0VGltZUluTWlsbGlzKCkpOwotCQkJdGhpcy5leWVDb2xvciA9IERFRkFVTFRfRVlFX0NPTE9SOwotCQkJdGhpcy5ldmlsID0gZmFsc2U7Ci0JCQl0aGlzLnJhbmsgPSAwOwotCQkJdGhpcy5hZHZlbnR1cmVDb3VudCA9IDA7Ci0JCX0KLQkKLQkJcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0VmFsaWRFeWVDb2xvcnMoKSB7Ci0JCQlpZiAodmFsaWRFeWVDb2xvcnMgPT0gbnVsbCkgewotCQkJCXZhbGlkRXllQ29sb3JzID0gYnVpbGRWYWxpZEV5ZUNvbG9ycygpOwotCQkJfQotCQkJcmV0dXJuIHZhbGlkRXllQ29sb3JzOwotCQl9Ci0JCi0JCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZFZhbGlkRXllQ29sb3JzKCkgewotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJcmVzdWx0LmFkZChFWUVfQ09MT1JfQkxVRSk7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9HUkVFTik7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9CUk9XTik7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9IQVpFTCk7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9QSU5LKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkKLQkJcHVibGljIENyb3dkIGdldENyb3dkKCkgewotCQkJcmV0dXJuIHRoaXMuY3Jvd2Q7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmNyb3dkLmNoZWNrUGVyc29uTmFtZShuYW1lKTsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkKLQkJcHVibGljIERhdGUgZ2V0QmlydGhEYXRlKCkgewotCQkJcmV0dXJuIHRoaXMuYmlydGhEYXRlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEJpcnRoRGF0ZShEYXRlIGJpcnRoRGF0ZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMuYmlydGhEYXRlOwotCQkJdGhpcy5iaXJ0aERhdGUgPSBiaXJ0aERhdGU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQklSVEhfREFURV9QUk9QRVJUWSwgb2xkLCBiaXJ0aERhdGUpOwotCQl9Ci0JCi0JCXB1YmxpYyBEYXRlIGdldEdvbmVXZXN0RGF0ZSgpIHsKLQkJCXJldHVybiB0aGlzLmdvbmVXZXN0RGF0ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRHb25lV2VzdERhdGUoRGF0ZSBnb25lV2VzdERhdGUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLmdvbmVXZXN0RGF0ZTsKLQkJCXRoaXMuZ29uZVdlc3REYXRlID0gZ29uZVdlc3REYXRlOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEdPTkVfV0VTVF9EQVRFX1BST1BFUlRZLCBvbGQsIGdvbmVXZXN0RGF0ZSk7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBnZXRFeWVDb2xvcigpIHsKLQkJCXJldHVybiB0aGlzLmV5ZUNvbG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEV5ZUNvbG9yKFN0cmluZyBleWVDb2xvcikgewotCQkJaWYgKCEgZ2V0VmFsaWRFeWVDb2xvcnMoKS5jb250YWlucyhleWVDb2xvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV5ZUNvbG9yKTsKLQkJCX0KLQkJCU9iamVjdCBvbGQgPSB0aGlzLmV5ZUNvbG9yOwotCQkJdGhpcy5leWVDb2xvciA9IGV5ZUNvbG9yOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVZRV9DT0xPUl9QUk9QRVJUWSwgb2xkLCBleWVDb2xvcik7Ci0JCX0KLQkKLQkJcHVibGljIGJvb2xlYW4gaXNFdmlsKCkgewotCQkJcmV0dXJuIHRoaXMuZXZpbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRFdmlsKGJvb2xlYW4gZXZpbCkgewotCQkJYm9vbGVhbiBvbGQgPSB0aGlzLmV2aWw7Ci0JCQl0aGlzLmV2aWwgPSBldmlsOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVWSUxfUFJPUEVSVFksIG9sZCwgZXZpbCk7Ci0JCX0KLQkKLQkJcHVibGljIGludCBnZXRSYW5rKCkgewotCQkJcmV0dXJuIHRoaXMucmFuazsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRSYW5rKGludCByYW5rKSB7Ci0JCQlpbnQgb2xkID0gdGhpcy5yYW5rOwotCQkJdGhpcy5yYW5rID0gcmFuazsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSQU5LX1BST1BFUlRZLCBvbGQsIHJhbmspOwotCQl9Ci0JCi0JCXB1YmxpYyBpbnQgZ2V0QWR2ZW50dXJlQ291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZHZlbnR1cmVDb3VudDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRBZHZlbnR1cmVDb3VudChpbnQgYWR2ZW50dXJlQ291bnQpIHsKLQkJCWludCBvbGQgPSB0aGlzLmFkdmVudHVyZUNvdW50OwotCQkJdGhpcy5hZHZlbnR1cmVDb3VudCA9IGFkdmVudHVyZUNvdW50OwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEFEVkVOVFVSRV9DT1VOVF9QUk9QRVJUWSwgb2xkLCBhZHZlbnR1cmVDb3VudCk7Ci0JCX0KLQkKLQkJcHVibGljIGludCBjb21wYXJlVG8oUGVyc29uIHApIHsKLQkJCXJldHVybiB0aGlzLm5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShwLm5hbWUpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZSArIAotCQkJCQkJIlx0Ym9ybjogIiArIERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCkuZm9ybWF0KHRoaXMuYmlydGhEYXRlKSArIAotCQkJCQkJIlx0Z29uZSB3ZXN0OiAiICsgRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKS5mb3JtYXQodGhpcy5nb25lV2VzdERhdGUpICsgCi0JCQkJCQkiXHRleWVzOiAiICsgdGhpcy5leWVDb2xvciArIAotCQkJCQkJIlx0ZXZpbDogIiArIHRoaXMuZXZpbCArIAotCQkJCQkJIlx0cmFuazogIiArIHRoaXMucmFuayArCi0JCQkJCQkiXHRhZHZlbnR1cmVzOiAiICsgdGhpcy5hZHZlbnR1cmVDb3VudAotCQkJOwotCQl9Ci0JCi0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RUYWJsZU1vZGVsTGlzdGVuZXIgaW1wbGVtZW50cyBUYWJsZU1vZGVsTGlzdGVuZXIgewotCQlUZXN0VGFibGVNb2RlbExpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoVGFibGVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODg1NGY2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQnV0dG9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDaGVja0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KU3Bpbm5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ29sdW1uOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5Eb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ2hlY2tCb3hNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Db21ib0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5EYXRlU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Eb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UYWJsZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5DaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLkNvbWJvQm94VGFibGVDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlRhYmxlQ2VsbEVkaXRvckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5Dcm93ZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UYWJsZU1vZGVsQWRhcHRlclRlc3RzLlBlcnNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UYWJsZU1vZGVsQWRhcHRlclRlc3RzLlBlcnNvbkNvbHVtbkFkYXB0ZXI7Ci0KLS8qKgotICogYW4gZXhhbXBsZSBVSSBmb3IgdGVzdGluZyB0aGUgVGFibGVNb2RlbEFkYXB0ZXIKLSAqIAkibmFtZSIgY29sdW1uIGlzIHJlYWQtb25seSB0ZXh0IGZpZWxkCi0gKiAJImJpcnRoIGRhdGUiIGNvbHVtbiBpcyBkYXRlIHRleHQgZmllbGQKLSAqIAkiZ29uZSB3ZXN0IGRhdGUiIGNvbHVtbiBpcyBkYXRlIHNwaW5uZXIKLSAqIAkiZXllIGNvbG9yIiBjb2x1bW4gaXMgY29tYm8tYm94Ci0gKiAJImV2aWwiIGNvbHVtbiBpcyBjaGVjayBib3gKLSAqIAkicmFuayIgY29sdW1uIGlzIG51bWJlciB0ZXh0IGZpZWxkCi0gKiAJImFkdmVudHVyZSBjb3VudCIgY29sdW1uIGlzIG51bWJlciBzcGlubmVyCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGUgdGFibGUgbW9kZWwgYW5kIHJvdyBzZWxlY3Rpb24gbW9kZWwgc2hhcmUgdGhlIHNhbWUKLSAqIGxpc3QgdmFsdWUgbW9kZWwgKHRoZSBzb3J0ZWQgcGVvcGxlIGFkYXB0ZXIpCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0IHsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPE9iamVjdD4gZXllQ29sb3JzSG9sZGVyOyAgLy8gT2JqZWN0IGJlY2F1c2UgaXQgYWRhcHRzIHRvIGEgY29tYm8tYm94Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxDcm93ZD4gY3Jvd2RIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+IHNlbGVjdGVkUGVyc29uSG9sZGVyOwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UGVyc29uPiBzb3J0ZWRQZW9wbGVBZGFwdGVyOwotCXByaXZhdGUgVGFibGVNb2RlbCB0YWJsZU1vZGVsOwotCXByaXZhdGUgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIHJvd1NlbGVjdGlvbk1vZGVsOwotCXByaXZhdGUgQWN0aW9uIHJlbW92ZUFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiByZW5hbWVBY3Rpb247Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IFRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYyhhcmdzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlYyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChVSU1hbmFnZXIuZ2V0U3lzdGVtTG9va0FuZEZlZWxDbGFzc05hbWUoKSk7Ci0JCXRoaXMuZXllQ29sb3JzSG9sZGVyID0gdGhpcy4gYnVpbGRFeWVDb2xvckNvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJdGhpcy5jcm93ZEhvbGRlciA9IHRoaXMuYnVpbGRDcm93ZEhvbGRlcigpOwotCQl0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyID0gdGhpcy5idWlsZFNlbGVjdGVkUGVyc29uSG9sZGVyKCk7Ci0JCXRoaXMuc29ydGVkUGVvcGxlQWRhcHRlciA9IHRoaXMuYnVpbGRTb3J0ZWRQZW9wbGVBZGFwdGVyKCk7Ci0JCXRoaXMudGFibGVNb2RlbCA9IHRoaXMuYnVpbGRUYWJsZU1vZGVsKCk7Ci0JCXRoaXMucm93U2VsZWN0aW9uTW9kZWwgPSB0aGlzLmJ1aWxkUm93U2VsZWN0aW9uTW9kZWwoKTsKLQkJdGhpcy5vcGVuV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkRXllQ29sb3JDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPE9iamVjdD4obmV3IEFycmF5TGlzdDxPYmplY3Q+KFBlcnNvbi5nZXRWYWxpZEV5ZUNvbG9ycygpKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxDcm93ZD4gYnVpbGRDcm93ZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q3Jvd2Q+KHRoaXMuYnVpbGRDcm93ZCgpKTsKLQl9Ci0KLQlwcml2YXRlIENyb3dkIGJ1aWxkQ3Jvd2QoKSB7Ci0JCUNyb3dkIGNyb3dkID0gbmV3IENyb3dkKCk7Ci0KLQkJUGVyc29uIHAgPSBjcm93ZC5hZGRQZXJzb24oIkJpbGJvIik7Ci0JCXAuc2V0RXllQ29sb3IoUGVyc29uLkVZRV9DT0xPUl9CUk9XTik7Ci0JCXAuc2V0UmFuaygyMik7Ci0JCXAuc2V0QWR2ZW50dXJlQ291bnQoMSk7Ci0KLQkJcCA9IGNyb3dkLmFkZFBlcnNvbigiR29sbHVtIik7Ci0JCXAuc2V0RXllQ29sb3IoUGVyc29uLkVZRV9DT0xPUl9QSU5LKTsKLQkJcC5zZXRFdmlsKHRydWUpOwotCQlwLnNldFJhbmsoMik7Ci0JCXAuc2V0QWR2ZW50dXJlQ291bnQoNTApOwotCi0JCXAgPSBjcm93ZC5hZGRQZXJzb24oIkZyb2RvIik7Ci0JCXAuc2V0RXllQ29sb3IoUGVyc29uLkVZRV9DT0xPUl9CTFVFKTsKLQkJcC5zZXRSYW5rKDM0KTsKLQkJcC5zZXRBZHZlbnR1cmVDb3VudCgxKTsKLQotCQlwID0gY3Jvd2QuYWRkUGVyc29uKCJTYW13aXNlIik7Ci0JCXAuc2V0RXllQ29sb3IoUGVyc29uLkVZRV9DT0xPUl9HUkVFTik7Ci0JCXAuc2V0UmFuaygxOSk7Ci0JCXAuc2V0QWR2ZW50dXJlQ291bnQoMSk7Ci0KLQkJcmV0dXJuIGNyb3dkOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uPiBidWlsZFNlbGVjdGVkUGVyc29uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+KCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQZXJzb24+IGJ1aWxkU29ydGVkUGVvcGxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8UGVyc29uPih0aGlzLmJ1aWxkUGVvcGxlTmFtZUFkYXB0ZXIoKSk7Ci0JfQotCi0JLy8gdGhlIGxpc3Qgd2lsbCBuZWVkIHRvIGJlIHJlLXNvcnRlZCBpZiBhIG5hbWUgY2hhbmdlcwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UGVyc29uPiBidWlsZFBlb3BsZU5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxQZXJzb24+KHRoaXMuYnVpbGRQZW9wbGVBZGFwdGVyKCksIFBlcnNvbi5OQU1FX1BST1BFUlRZKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFBlcnNvbj4gYnVpbGRQZW9wbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPENyb3dkLCBQZXJzb24+KHRoaXMuY3Jvd2RIb2xkZXIsIENyb3dkLlBFT1BMRV9DT0xMRUNUSU9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxQZXJzb24+IGl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnBlb3BsZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucGVvcGxlU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVGFibGVNb2RlbCBidWlsZFRhYmxlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPih0aGlzLnNvcnRlZFBlb3BsZUFkYXB0ZXIsIHRoaXMuYnVpbGRDb2x1bW5BZGFwdGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb2x1bW5BZGFwdGVyIGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQZXJzb25Db2x1bW5BZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgYnVpbGRSb3dTZWxlY3Rpb25Nb2RlbCgpIHsKLQkJT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIHJzbSA9IG5ldyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5zb3J0ZWRQZW9wbGVBZGFwdGVyKSk7Ci0JCXJzbS5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZFJvd1NlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQlyc20uc2V0U2VsZWN0aW9uTW9kZShMaXN0U2VsZWN0aW9uTW9kZWwuU0lOR0xFX1NFTEVDVElPTik7Ci0JCXJldHVybiByc207Ci0JfQotCi0JcHJpdmF0ZSBMaXN0U2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRSb3dTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoTGlzdFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZS5nZXRWYWx1ZUlzQWRqdXN0aW5nKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJvd1NlbGVjdGlvbkNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCByb3dTZWxlY3Rpb25DaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0U2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJUGVyc29uIHNlbGVjdGlvbiA9IChQZXJzb24pIHRoaXMucm93U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCQl0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLnNldFZhbHVlKHNlbGVjdGlvbik7Ci0JCWJvb2xlYW4gcGVyc29uU2VsZWN0ZWQgPSAoc2VsZWN0aW9uICE9IG51bGwpOwotCQl0aGlzLnJlbW92ZUFjdGlvbi5zZXRFbmFibGVkKHBlcnNvblNlbGVjdGVkKTsKLQkJdGhpcy5yZW5hbWVBY3Rpb24uc2V0RW5hYmxlZChwZXJzb25TZWxlY3RlZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coKSB7Ci0JCUpGcmFtZSB3aW5kb3cgPSBuZXcgSkZyYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQl3aW5kb3cuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLQkJd2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJd2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl3aW5kb3cuc2V0TG9jYXRpb24oMjAwLCAyMDApOwotCQl3aW5kb3cuc2V0U2l6ZSg2MDAsIDQwMCk7Ci0JCXdpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRUYWJsZVBhbmUoKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkVGFibGVQYW5lKCkgewotCQlyZXR1cm4gbmV3IEpTY3JvbGxQYW5lKHRoaXMuYnVpbGRUYWJsZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEpUYWJsZSBidWlsZFRhYmxlKCkgewotCQlKVGFibGUgdGFibGUgPSBuZXcgSlRhYmxlKHRoaXMudGFibGVNb2RlbCk7Ci0JCXRhYmxlLnB1dENsaWVudFByb3BlcnR5KCJ0ZXJtaW5hdGVFZGl0T25Gb2N1c0xvc3QiLCBCb29sZWFuLlRSVUUpOwkvLyBzZWUgSmF2YSBidWcgNTAwNzY1MgotCQl0YWJsZS5zZXRTZWxlY3Rpb25Nb2RlbCh0aGlzLnJvd1NlbGVjdGlvbk1vZGVsKTsKLQkJdGFibGUuc2V0RG91YmxlQnVmZmVyZWQodHJ1ZSk7Ci0JCXRhYmxlLnNldEF1dG9SZXNpemVNb2RlKEpUYWJsZS5BVVRPX1JFU0laRV9ORVhUX0NPTFVNTik7Ci0JCWludCByb3dIZWlnaHQgPSAyMDsJLy8gc3RhcnQgd2l0aCBtaW5pbXVtIG9mIDIwCi0KLQkJLy8gZ29uZSB3ZXN0IGNvbHVtbiAoc3Bpbm5lcikKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uTW9kZWwoKS5nZXRDb2x1bW4oUGVyc29uQ29sdW1uQWRhcHRlci5HT05FX1dFU1RfREFURV9DT0xVTU4pOwotCQlTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIgc3Bpbm5lclJlbmRlcmVyID0gdGhpcy5idWlsZERhdGVTcGlubmVyUmVuZGVyZXIoKTsKLQkJY29sdW1uLnNldENlbGxSZW5kZXJlcihzcGlubmVyUmVuZGVyZXIpOwotCQljb2x1bW4uc2V0Q2VsbEVkaXRvcihuZXcgVGFibGVDZWxsRWRpdG9yQWRhcHRlcih0aGlzLmJ1aWxkRGF0ZVNwaW5uZXJSZW5kZXJlcigpKSk7Ci0JCXJvd0hlaWdodCA9IE1hdGgubWF4KHJvd0hlaWdodCwgc3Bpbm5lclJlbmRlcmVyLnByZWZlcnJlZEhlaWdodCgpKTsKLQotCQkvLyBleWUgY29sb3IgY29sdW1uIChjb21iby1ib3gpCi0JCS8vIHRoZSBqZGsgY29tYm8tYm94IHJlbmRlcmVyIGxvb2tzIGxpa2UgYSB0ZXh0IGZpZWxkCi0JCS8vIHVudGlsIHRoZSB1c2VyIHN0YXJ0cyBhbiBlZGl0IC0gdXNlIGEgY3VzdG9tIG9uZQotCQljb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbihQZXJzb25Db2x1bW5BZGFwdGVyLkVZRV9DT0xPUl9DT0xVTU4pOwotCQlDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyIGV5ZUNvbG9yUmVuZGVyZXIgPSB0aGlzLmJ1aWxkRXllQ29sb3JDb21ib0JveFJlbmRlcmVyKCk7Ci0JCWNvbHVtbi5zZXRDZWxsUmVuZGVyZXIoZXllQ29sb3JSZW5kZXJlcik7Ci0JCWNvbHVtbi5zZXRDZWxsRWRpdG9yKG5ldyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKHRoaXMuYnVpbGRFeWVDb2xvckNvbWJvQm94UmVuZGVyZXIoKSkpOwotCQlyb3dIZWlnaHQgPSBNYXRoLm1heChyb3dIZWlnaHQsIGV5ZUNvbG9yUmVuZGVyZXIucHJlZmVycmVkSGVpZ2h0KCkpOwotCi0JCS8vIGV2aWwgKGNoZWNrIGJveCkKLQkJLy8gdGhlIGpkayBjaGVjayBib3ggcmVuZGVyZXIgYW5kIGVkaXRvciBzdWNrIC0gdXNlIGEgY3VzdG9tIG9uZXMKLQkJY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uTW9kZWwoKS5nZXRDb2x1bW4oUGVyc29uQ29sdW1uQWRhcHRlci5FVklMX0NPTFVNTik7Ci0JCUNoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIgZXZpbFJlbmRlcmVyID0gbmV3IENoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIoKTsKLQkJY29sdW1uLnNldENlbGxSZW5kZXJlcihldmlsUmVuZGVyZXIpOwotCQljb2x1bW4uc2V0Q2VsbEVkaXRvcihuZXcgVGFibGVDZWxsRWRpdG9yQWRhcHRlcihuZXcgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcigpKSk7Ci0JCXJvd0hlaWdodCA9IE1hdGgubWF4KHJvd0hlaWdodCwgZXZpbFJlbmRlcmVyLnByZWZlcnJlZEhlaWdodCgpKTsKLQotCQkvLyBhZHZlbnR1cmUgY291bnQgY29sdW1uIChzcGlubmVyKQotCQljb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbihQZXJzb25Db2x1bW5BZGFwdGVyLkFEVkVOVFVSRV9DT1VOVF9DT0xVTU4pOwotCQlzcGlubmVyUmVuZGVyZXIgPSB0aGlzLmJ1aWxkTnVtYmVyU3Bpbm5lclJlbmRlcmVyKCk7Ci0JCWNvbHVtbi5zZXRDZWxsUmVuZGVyZXIoc3Bpbm5lclJlbmRlcmVyKTsKLQkJY29sdW1uLnNldENlbGxFZGl0b3IobmV3IFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIodGhpcy5idWlsZE51bWJlclNwaW5uZXJSZW5kZXJlcigpKSk7Ci0JCXJvd0hlaWdodCA9IE1hdGgubWF4KHJvd0hlaWdodCwgc3Bpbm5lclJlbmRlcmVyLnByZWZlcnJlZEhlaWdodCgpKTsKLQotCQl0YWJsZS5zZXRSb3dIZWlnaHQocm93SGVpZ2h0KTsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyIGJ1aWxkRGF0ZVNwaW5uZXJSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIobmV3IERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIgYnVpbGROdW1iZXJTcGlubmVyUmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyKG5ldyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyIGJ1aWxkRXllQ29sb3JDb21ib0JveFJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIodGhpcy5idWlsZFJlYWRPbmx5RXllQ29sb3JDb21ib0JveE1vZGVsKCksIHRoaXMuYnVpbGRFeWVDb2xvclJlbmRlcmVyKCkpOwotCX0KLQotCXByaXZhdGUgQ29tYm9Cb3hNb2RlbCBidWlsZFJlYWRPbmx5RXllQ29sb3JDb21ib0JveE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IENvbWJvQm94TW9kZWxBZGFwdGVyKHRoaXMuZXllQ29sb3JzSG9sZGVyLCBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2VsbFJlbmRlcmVyIGJ1aWxkRXllQ29sb3JSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBFeWVDb2xvclJlbmRlcmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDb250cm9sUGFuZWwoKSB7Ci0JCUpQYW5lbCBjb250cm9sUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDAsIDEpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQnV0dG9uUGFuZWwoKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFBlcnNvblBhbmVsKCkpOwotCQlyZXR1cm4gY29udHJvbFBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQnV0dG9uUGFuZWwoKSB7Ci0JCUpQYW5lbCBidXR0b25QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQlidXR0b25QYW5lbC5hZGQodGhpcy5idWlsZEFkZEJ1dHRvbigpKTsKLQkJYnV0dG9uUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW1vdmVCdXR0b24oKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVuYW1lQnV0dG9uKCkpOwotCQlidXR0b25QYW5lbC5hZGQodGhpcy5idWlsZEFkZEV5ZUNvbG9yQnV0dG9uKCkpOwotCQlidXR0b25QYW5lbC5hZGQodGhpcy5idWlsZFByaW50QnV0dG9uKCkpOwotCQlidXR0b25QYW5lbC5hZGQodGhpcy5idWlsZFJlc2V0QnV0dG9uKCkpOwotCQlyZXR1cm4gYnV0dG9uUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRQZXJzb25QYW5lbCgpIHsKLQkJSlBhbmVsIHBlcnNvblBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXBlcnNvblBhbmVsLmFkZCh0aGlzLmJ1aWxkTmFtZVRleHRGaWVsZCgpKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGRCaXJ0aERhdGVTcGlubmVyKCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZEdvbmVXZXN0RGF0ZVNwaW5uZXIoKSk7Ci0JCXBlcnNvblBhbmVsLmFkZCh0aGlzLmJ1aWxkRXllQ29sb3JDb21ib0JveCgpKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGRFdmlsQ2hlY2tCb3goKSk7Ci0JCXBlcnNvblBhbmVsLmFkZCh0aGlzLmJ1aWxkUmFua1NwaW5uZXIoKSk7Ci0JCXBlcnNvblBhbmVsLmFkZCh0aGlzLmJ1aWxkQWR2ZW50dXJlQ291bnRTcGlubmVyKCkpOwotCQlyZXR1cm4gcGVyc29uUGFuZWw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZCBidXR0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQWRkQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZEFkZEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZEFkZEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiYWRkIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5hZGRQZXJzb24oKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBhZGRQZXJzb24oKSB7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy5nZXROYW1lRnJvbVVzZXIoKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJdGhpcy5zZXRTZWxlY3RlZFBlcnNvbih0aGlzLmNyb3dkKCkuYWRkUGVyc29uKG5hbWUpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgYnV0dG9uICoqKioqKioqKioKLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbW92ZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW1vdmVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW1vdmVBY3Rpb24oKSB7Ci0JCXRoaXMucmVtb3ZlQWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZW1vdmUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlbW92ZVBlcnNvbigpOwotCQkJfQotCQl9OwotCQl0aGlzLnJlbW92ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlQWN0aW9uOwotCX0KLQotCXZvaWQgcmVtb3ZlUGVyc29uKCkgewotCQlQZXJzb24gcGVyc29uID0gdGhpcy5zZWxlY3RlZFBlcnNvbigpOwotCQlpZiAocGVyc29uICE9IG51bGwpIHsKLQkJCXRoaXMuY3Jvd2QoKS5yZW1vdmVQZXJzb24ocGVyc29uKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW5hbWUgYnV0dG9uICoqKioqKioqKioKLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbmFtZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW5hbWVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW5hbWVBY3Rpb24oKSB7Ci0JCXRoaXMucmVuYW1lQWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZW5hbWUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlbmFtZVBlcnNvbigpOwotCQkJfQotCQl9OwotCQl0aGlzLnJlbmFtZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmV0dXJuIHRoaXMucmVuYW1lQWN0aW9uOwotCX0KLQotCXZvaWQgcmVuYW1lUGVyc29uKCkgewotCQlQZXJzb24gcGVyc29uID0gdGhpcy5zZWxlY3RlZFBlcnNvbigpOwotCQlpZiAocGVyc29uICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gdGhpcy5wcm9tcHRVc2VyRm9yTmFtZShwZXJzb24uZ2V0TmFtZSgpKTsKLQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQlwZXJzb24uc2V0TmFtZShuYW1lKTsKLQkJCQl0aGlzLnNldFNlbGVjdGVkUGVyc29uKHBlcnNvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkIGV5ZSBjb2xvciBidXR0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQWRkRXllQ29sb3JCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQWRkRXllQ29sb3JBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRBZGRFeWVDb2xvckFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiYWRkIGV5ZSBjb2xvciIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuYWRkRXllQ29sb3IoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBhZGRFeWVDb2xvcigpIHsKLQkJU3RyaW5nIGNvbG9yID0gdGhpcy5wcm9tcHRVc2VyRm9yRXllQ29sb3IoKTsKLQkJaWYgKGNvbG9yICE9IG51bGwpIHsKLQkJCXRoaXMuZXllQ29sb3JzSG9sZGVyLmFkZChjb2xvcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBwcm9tcHRVc2VyRm9yRXllQ29sb3IoKSB7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlTdHJpbmcgZXllQ29sb3IgPSBKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2coIkV5ZSBDb2xvciIpOwotCQkJaWYgKGV5ZUNvbG9yID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsJCS8vIHVzZXIgcHJlc3NlZCA8Q2FuY2VsPgotCQkJfQotCQkJaWYgKChleWVDb2xvci5sZW5ndGgoKSA9PSAwKSkgewotCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG51bGwsICJUaGUgZXllIGNvbG9yIGlzIHJlcXVpcmVkLiIsICJJbnZhbGlkIEV5ZSBDb2xvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotCQkJfSBlbHNlIGlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5leWVDb2xvcnNIb2xkZXIuaXRlcmF0b3IoKSwgZXllQ29sb3IpKSB7Ci0JCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobnVsbCwgIlRoZSBleWUgY29sb3IgYWxyZWFkeSBleGlzdHMuIiwgIkludmFsaWQgRXllIENvbG9yIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBleWVDb2xvcjsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmludCBidXR0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUHJpbnRCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUHJpbnRBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicHJpbnQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50Q3Jvd2QoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBwcmludENyb3dkKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5jcm93ZCgpKTsKLQkJZm9yIChJdGVyYXRvcjxQZXJzb24+IHN0cmVhbSA9IHRoaXMuY3Jvd2QoKS5wZW9wbGUoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc2V0IGJ1dHRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXNldEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc2V0QWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXNldCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzZXQoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXNldCgpIHsKLQkJdGhpcy5jcm93ZEhvbGRlci5zZXRWYWx1ZSh0aGlzLmJ1aWxkQ3Jvd2QoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5ldyBuYW1lIGRpYWxvZyAqKioqKioqKioqCi0KLQlwcml2YXRlIFN0cmluZyBnZXROYW1lRnJvbVVzZXIoKSB7Ci0JCXJldHVybiB0aGlzLnByb21wdFVzZXJGb3JOYW1lKG51bGwpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHByb21wdFVzZXJGb3JOYW1lKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmcgb3JpZ2luYWxOYW1lKSB7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IEpPcHRpb25QYW5lLnNob3dJbnB1dERpYWxvZygiUGVyc29uIE5hbWUiKTsKLQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsJCS8vIHVzZXIgcHJlc3NlZCA8Q2FuY2VsPgotCQkJfQotCQkJaWYgKChuYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobnVsbCwgIlRoZSBuYW1lIGlzIHJlcXVpcmVkLiIsICJJbnZhbGlkIE5hbWUiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLQkJCX0gZWxzZSBpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuY3Jvd2QoKS5wZW9wbGVOYW1lcygpLCBuYW1lKSkgewotCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG51bGwsICJUaGUgbmFtZSBhbHJlYWR5IGV4aXN0cy4iLCAiSW52YWxpZCBOYW1lIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5hbWUgdGV4dCBmaWVsZCAqKioqKioqKioqCi0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE5hbWVUZXh0RmllbGQoKSB7Ci0JCUpUZXh0RmllbGQgdGV4dEZpZWxkID0gbmV3IEpUZXh0RmllbGQodGhpcy5idWlsZE5hbWVEb2N1bWVudCgpLCBudWxsLCAwKTsKLQkJdGV4dEZpZWxkLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJcmV0dXJuIHRleHRGaWVsZDsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50IGJ1aWxkTmFtZURvY3VtZW50KCkgewotCQlyZXR1cm4gbmV3IERvY3VtZW50QWRhcHRlcih0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgU3RyaW5nPih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiaXJ0aCBkYXRlIHNwaW5uZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZEJpcnRoRGF0ZVNwaW5uZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNwaW5uZXIodGhpcy5idWlsZEJpcnRoRGF0ZVNwaW5uZXJNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZEJpcnRoRGF0ZVNwaW5uZXJNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkQmlydGhEYXRlQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRCaXJ0aERhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLkJJUlRIX0RBVEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERhdGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRCaXJ0aERhdGUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRCaXJ0aERhdGUoKERhdGUpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ29uZSB3ZXN0IGRhdGUgc3Bpbm5lciAqKioqKioqKioqCi0KLQlwcml2YXRlIEpTcGlubmVyIGJ1aWxkR29uZVdlc3REYXRlU3Bpbm5lcigpIHsKLQkJcmV0dXJuIG5ldyBKU3Bpbm5lcih0aGlzLmJ1aWxkR29uZVdlc3REYXRlU3Bpbm5lck1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkR29uZVdlc3REYXRlU3Bpbm5lck1vZGVsKCkgewotCQlyZXR1cm4gbmV3IERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMuYnVpbGRHb25lV2VzdERhdGVBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEdvbmVXZXN0RGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0Pih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uR09ORV9XRVNUX0RBVEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERhdGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRHb25lV2VzdERhdGUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRHb25lV2VzdERhdGUoKERhdGUpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXllIGNvbG9yIGNvbWJvLWJveCAqKioqKioqKioqCi0KLQlwcml2YXRlIEpDb21ib0JveCBidWlsZEV5ZUNvbG9yQ29tYm9Cb3goKSB7Ci0JCXJldHVybiBuZXcgSkNvbWJvQm94KHRoaXMuYnVpbGRFeWVDb2xvckNvbWJvQm94TW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21ib0JveE1vZGVsIGJ1aWxkRXllQ29sb3JDb21ib0JveE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IENvbWJvQm94TW9kZWxBZGFwdGVyKHRoaXMuZXllQ29sb3JzSG9sZGVyLCB0aGlzLmJ1aWxkRXllQ29sb3JBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEV5ZUNvbG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5FWUVfQ09MT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9iamVjdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV5ZUNvbG9yKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RXllQ29sb3IoKFN0cmluZykgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBldmlsIGNoZWNrIGJveCAqKioqKioqKioqCi0KLQlwcml2YXRlIEpDaGVja0JveCBidWlsZEV2aWxDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJldmlsIik7Ci0JCWNoZWNrQm94LnNldE1vZGVsKHRoaXMuYnVpbGRFdmlsQ2hlY2tCb3hNb2RlbCgpKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgQnV0dG9uTW9kZWwgYnVpbGRFdmlsQ2hlY2tCb3hNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDaGVja0JveE1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkRXZpbEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEV2aWxBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIEJvb2xlYW4+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5FVklMX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRXZpbCgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RXZpbCh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJhbmsgc3Bpbm5lciAqKioqKioqKioqCi0KLQlwcml2YXRlIEpTcGlubmVyIGJ1aWxkUmFua1NwaW5uZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNwaW5uZXIodGhpcy5idWlsZFJhbmtTcGlubmVyTW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYnVpbGRSYW5rU3Bpbm5lck1vZGVsKCkgewotCQlyZXR1cm4gbmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy5idWlsZFJhbmtBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBidWlsZFJhbmtBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE51bWJlcj4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLlJBTktfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE51bWJlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIodGhpcy5zdWJqZWN0LmdldFJhbmsoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhOdW1iZXIgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0UmFuayh2YWx1ZS5pbnRWYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWR2ZW50dXJlIGNvdW50IHNwaW5uZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZEFkdmVudHVyZUNvdW50U3Bpbm5lcigpIHsKLQkJcmV0dXJuIG5ldyBKU3Bpbm5lcih0aGlzLmJ1aWxkQWR2ZW50dXJlQ291bnRTcGlubmVyTW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYnVpbGRBZHZlbnR1cmVDb3VudFNwaW5uZXJNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMuYnVpbGRBZHZlbnR1cmVDb3VudEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IGJ1aWxkQWR2ZW50dXJlQ291bnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE51bWJlcj4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLkFEVkVOVFVSRV9DT1VOVF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTnVtYmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0QWR2ZW50dXJlQ291bnQoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhOdW1iZXIgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0QWR2ZW50dXJlQ291bnQodmFsdWUuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBDcm93ZCBjcm93ZCgpIHsKLQkJcmV0dXJuIHRoaXMuY3Jvd2RIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIFBlcnNvbiBzZWxlY3RlZFBlcnNvbigpIHsKLQkJaWYgKHRoaXMucm93U2VsZWN0aW9uTW9kZWwuaXNTZWxlY3Rpb25FbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKFBlcnNvbikgdGhpcy5yb3dTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkUGVyc29uKFBlcnNvbiBwZXJzb24pIHsKLQkJdGhpcy5yb3dTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKHBlcnNvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGN1c3RvbSByZW5kZXJlciAqKioqKioqKioqCi0JCi0JLyoqCi0JICogVGhpcyBpcyBzaW1wbHkgYW4gZXhhbXBsZSBvZiBhIHJlbmRlcmVyIGZvciB0aGUgZW1iZWRkZWQgY29tYm8tYm94LgotCSAqIEl0IGRvZXMgbm90aGluZyBzcGVjaWFsIHVubGVzcyB5b3UgdW5jb21tZW50IHRoZSBjb2RlIGJlbG93Li4uLgotCSAqLwotCXByaXZhdGUgY2xhc3MgRXllQ29sb3JSZW5kZXJlciBleHRlbmRzIERlZmF1bHRMaXN0Q2VsbFJlbmRlcmVyIHsKLQkJRXllQ29sb3JSZW5kZXJlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb21wb25lbnQgZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChKTGlzdCBsaXN0LCBPYmplY3QgdmFsdWUsIGludCBpbmRleCwgYm9vbGVhbiBpc1NlbGVjdGVkLCBib29sZWFuIGNlbGxIYXNGb2N1cykgewotCQkJLy8ganVzdCBkbyBzb21ldGhpbmcgdG8gc2hvdyB0aGUgcmVuZGVyZXIgaXMgd29ya2luZy4uLgotCS8vCQl2YWx1ZSA9ICI+IiArIHZhbHVlOwotCQkJcmV0dXJuIHN1cGVyLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwZDE3Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRyZWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlTW9kZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5JbmRlbnRpbmdQcmludFdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLk51bGxMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVHJlZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVOb2RlVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJlZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCWJvb2xlYW4gZXZlbnRGaXJlZDsKLQotCXB1YmxpYyBUcmVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFJvb3QoKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE1vZGVsIHJvb3QgPSByb290Tm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJyb290Iiwgcm9vdC5nZXROYW1lKCkpOwotLy8JCXJvb3QuZHVtcCgpOwotLy8JCXJvb3ROb2RlLmR1bXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hpbGQoKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQotCQlUZXN0Tm9kZSBleHBlY3RlZCA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQlUZXN0Tm9kZSBhY3R1YWwgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRDaGlsZChyb290Tm9kZSwgMSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQotCQlleHBlY3RlZCA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMiIpOwotCQlhY3R1YWwgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRDaGlsZChyb290Tm9kZSwgMik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hpbGRDb3VudCgpIHsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRTb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSk7Ci0JCVRlc3ROb2RlIHJvb3ROb2RlID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Um9vdCgpOwotCi0JCWFzc2VydEVxdWFscyg1LCB0cmVlTW9kZWwuZ2V0Q2hpbGRDb3VudChyb290Tm9kZSkpOwotCi0JCVRlc3ROb2RlIG5vZGUgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRyZWVNb2RlbC5nZXRDaGlsZENvdW50KG5vZGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5kZXhPZkNoaWxkKCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFNvcnRlZFRyZWVNb2RlbCgpOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpKTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0KLQkJVGVzdE5vZGUgY2hpbGQgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDAiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRyZWVNb2RlbC5nZXRJbmRleE9mQ2hpbGQocm9vdE5vZGUsIGNoaWxkKSk7Ci0KLQkJY2hpbGQgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRyZWVNb2RlbC5nZXRJbmRleE9mQ2hpbGQocm9vdE5vZGUsIGNoaWxkKSk7Ci0KLQkJY2hpbGQgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRyZWVNb2RlbC5nZXRJbmRleE9mQ2hpbGQocm9vdE5vZGUsIGNoaWxkKSk7Ci0JCVRlc3ROb2RlIGdyYW5kY2hpbGQgPSBjaGlsZC5jaGlsZE5hbWVkKCJub2RlIDIuMiIpOwotCQlhc3NlcnRFcXVhbHMoMiwgdHJlZU1vZGVsLmdldEluZGV4T2ZDaGlsZChjaGlsZCwgZ3JhbmRjaGlsZCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0xlYWYoKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJYXNzZXJ0RmFsc2UodHJlZU1vZGVsLmlzTGVhZihyb290Tm9kZSkpOwotCQlUZXN0Tm9kZSBub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCWFzc2VydEZhbHNlKHRyZWVNb2RlbC5pc0xlYWYobm9kZSkpOwotCQlub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAzIik7Ci0JCWFzc2VydFRydWUodHJlZU1vZGVsLmlzTGVhZihub2RlKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZU5vZGVzQ2hhbmdlZCgpIHsKLQkJLy8gdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSAibm9kZSBjaGFuZ2VkIiBldmVudCBpcyB0byB1c2UgYW4gdW5zb3J0ZWQgdHJlZTsKLQkJLy8gYSBzb3J0ZWQgdHJlZSB3aWxsIHdpbGwgdHJpZ2dlciBvbmx5ICJub2RlIHJlbW92ZWQiIGFuZCAibm9kZSBpbnNlcnRlZCIgZXZlbnRzCi0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkVW5zb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCVRlc3ROb2RlIHJvb3ROb2RlID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Um9vdCgpOwotCQlUZXN0Tm9kZSBub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCVRlc3RNb2RlbCB0bSA9IG5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCXRtLnNldE5hbWUoIm5vZGUgMSsrIik7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJbm9kZSA9IG5vZGUuY2hpbGROYW1lZCgibm9kZSAxLjEiKTsKLQkJdG0gPSBub2RlLmdldFRlc3RNb2RlbCgpOwotCQl0bS5zZXROYW1lKCJub2RlIDEuMSsrIik7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZU5vZGVzSW5zZXJ0ZWQoKSB7Ci0JCS8vIHVzZSBhbiB1bnNvcnRlZCB0cmVlIHNvIHRoZSBub2RlcyBhcmUgbm90IHJlLXNodWZmbGVkLi4uCi0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkVW5zb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNJbnNlcnRlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE5vZGUgbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQlUZXN0TW9kZWwgdG0gPSBub2RlLmdldFRlc3RNb2RlbCgpOwotCQl0bS5hZGRDaGlsZCgibmV3IGNoaWxkLi4uIik7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJbm9kZSA9IG5vZGUuY2hpbGROYW1lZCgibm9kZSAxLjEiKTsKLQkJdG0gPSBub2RlLmdldFRlc3RNb2RlbCgpOwotCQl0bS5hZGRDaGlsZCgiYW5vdGhlciBuZXcgY2hpbGQuLi4iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlTm9kZXNSZW1vdmVkKCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFVuc29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzUmVtb3ZlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE1vZGVsIHJvb3QgPSByb290Tm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJcm9vdC5yZW1vdmVDaGlsZChyb290LmNoaWxkTmFtZWQoIm5vZGUgMyIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCi0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQlUZXN0Tm9kZSBub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAyIik7Ci0JCVRlc3RNb2RlbCB0bSA9IG5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCXRtLnJlbW92ZUNoaWxkKHRtLmNoaWxkTmFtZWQoIm5vZGUgMi4yIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKCkgewotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gbm9kZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHRoaXMuYnVpbGRTb3J0ZWRSb290Tm9kZSgpKTsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRUcmVlTW9kZWwobm9kZUhvbGRlcik7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzSW5zZXJ0ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzUmVtb3ZlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlU3RydWN0dXJlQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlub2RlSG9sZGVyLnNldFZhbHVlKHRoaXMuYnVpbGRVbnNvcnRlZFJvb3ROb2RlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBhIHByb2JsZW0gd2UgaGFkIHdoZXJlIHJlbW92aW5nIGEgY2hpbGQgZnJvbSBhIHRyZWUgd291bGQgY2F1c2UKLQkgKiB0aGUgSlRyZWUgdG8gY2FsbCAjZXF1YWxzKE9iamVjdCkgb24gZWFjaCBub2RlIHJlbW92ZWQgKGFjdHVhbGx5LCBpdCB3YXMKLQkgKiBUcmVlUGF0aCwgYnV0IHRoYXQgd2FzIGJlY2F1c2UgaXRzIG93biAjZXF1YWxzKE9iamVjdCkgd2FzIGNhbGxlZCBieQotCSAqIEpUcmVlKTsgYW5kIHNpbmNlIHdlIGhhZCBhbHJlYWR5IHJlbW92ZWQgdGhlIGxhc3QgbGlzdGVuZXIgZnJvbSB0aGUKLQkgKiBhc3BlY3QgYWRhcHRlciwgdGhlIGFzcGVjdCBhZGFwdGVyIHdvdWxkIHNheSBpdHMgdmFsdWUgd2FzIG51bGw7IHRoaXMKLQkgKiB3b3VsZCBjYXVzZSBhIE5QRSB1bnRpbCB3ZSB0d2Vha2VkIFRyZWVNb2RlbEFkYXB0ZXIgdG8gcmVtb3ZlIGl0cwotCSAqIGxpc3RlbmVycyBmcm9tIGEgbm9kZSBvbmx5ICphZnRlciogdGhlIG5vZGUgaGFkIGJlZW4gY29tcGxldGVseQotCSAqIHJlbW92ZWQgZnJvbSB0aGUgSlRyZWUKLQkgKiBAc2VlIFRyZWVNb2RlbEFkYXB0ZXIjcmVtb3ZlTm9kZShPYmplY3RbXSwgaW50LCBUcmVlTm9kZVZhbHVlTW9kZWwpCi0JICogQHNlZSBUcmVlTW9kZWxBZGFwdGVyI2FkZE5vZGUoT2JqZWN0W10sIGludCwgVHJlZU5vZGVWYWx1ZU1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMYXp5SW5pdGlhbGl6YXRpb24oKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU3BlY2lhbFRyZWVNb2RlbCgpOwotCQlKVHJlZSBqVHJlZSA9IG5ldyBKVHJlZSh0cmVlTW9kZWwpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE1vZGVsIHJvb3QgPSByb290Tm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJLy8gdGhpcyB3b3VsZCBjYXVzZSBhIE5QRToKLQkJcm9vdC5yZW1vdmVDaGlsZChyb290LmNoaWxkTmFtZWQoIm5vZGUgMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKHRyZWVNb2RlbCwgalRyZWUuZ2V0TW9kZWwoKSk7Ci0JfQotCi0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFNvcnRlZFRyZWVNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmVlTW9kZWwodGhpcy5idWlsZFNvcnRlZFJvb3ROb2RlKCkpOwotCX0KLQotCXByaXZhdGUgVGVzdE5vZGUgYnVpbGRTb3J0ZWRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRUZXN0Tm9kZSh0aGlzLmJ1aWxkUm9vdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFVuc29ydGVkVHJlZU1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyZWVNb2RlbCh0aGlzLmJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3ROb2RlIGJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIG5ldyBVbnNvcnRlZFRlc3ROb2RlKHRoaXMuYnVpbGRSb290KCkpOwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkU3BlY2lhbFRyZWVNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmVlTW9kZWwodGhpcy5idWlsZFNwZWNpYWxSb290Tm9kZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3ROb2RlIGJ1aWxkU3BlY2lhbFJvb3ROb2RlKCkgewotCQlyZXR1cm4gbmV3IFNwZWNpYWxUZXN0Tm9kZSh0aGlzLmJ1aWxkUm9vdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCBidWlsZFJvb3QoKSB7Ci0JCVRlc3RNb2RlbCByb290ID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQkvKk5vZGUgbm9kZV8wID0gKi9yb290LmFkZENoaWxkKCJub2RlIDAiKTsKLQkJVGVzdE1vZGVsIG5vZGVfMSA9IHJvb3QuYWRkQ2hpbGQoIm5vZGUgMSIpOwotCQlUZXN0TW9kZWwgbm9kZV8xXzEgPSBub2RlXzEuYWRkQ2hpbGQoIm5vZGUgMS4xIik7Ci0JCS8qTm9kZSBub2RlXzFfMV8xID0gKi9ub2RlXzFfMS5hZGRDaGlsZCgibm9kZSAxLjEuMSIpOwotCQlUZXN0TW9kZWwgbm9kZV8yID0gcm9vdC5hZGRDaGlsZCgibm9kZSAyIik7Ci0JCS8qTm9kZSBub2RlXzJfMCA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMCIpOwotCQkvKk5vZGUgbm9kZV8yXzEgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjEiKTsKLQkJLypOb2RlIG5vZGVfMl8yID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi4yIik7Ci0JCS8qTm9kZSBub2RlXzJfMyA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMyIpOwotCQkvKk5vZGUgbm9kZV8yXzQgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjQiKTsKLQkJLypOb2RlIG5vZGVfMl81ID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi41Iik7Ci0JCS8qTm9kZSBub2RlXzMgPSAqL3Jvb3QuYWRkQ2hpbGQoIm5vZGUgMyIpOwotCQkvKk5vZGUgbm9kZV80ID0gKi9yb290LmFkZENoaWxkKCJub2RlIDQiKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaXMgYSB0eXBpY2FsIG1vZGVsIGNsYXNzIHdpdGggdGhlIHR5cGljYWwgY2hhbmdlIG5vdGlmaWNhdGlvbnMKLQkgKiBmb3IgI25hbWUgYW5kICNjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCS8vIHRoZSAgcGFyZW50IGlzIGltbXV0YWJsZTsgdGhlIHJvb3QncyBwYXJlbnQgaXMgbnVsbAotCQlwcml2YXRlIGZpbmFsIFRlc3RNb2RlbCBwYXJlbnQ7Ci0KLQkJLy8gdGhlIG5hbWUgaXMgbXV0YWJsZTsgc28gSSBndWVzcyBpdCBpc24ndCB0aGUgInByaW1hcnkga2V5IiA6LSkKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFRlc3RNb2RlbD4gY2hpbGRyZW47Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElMRFJFTl9DT0xMRUNUSU9OID0gImNoaWxkcmVuIjsKLQotCi0JCXB1YmxpYyBUZXN0TW9kZWwoU3RyaW5nIG5hbWUpIHsJLy8gcm9vdCBjdG9yCi0JCQl0aGlzKG51bGwsIG5hbWUpOwotCQl9Ci0JCXByaXZhdGUgVGVzdE1vZGVsKFRlc3RNb2RlbCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5jaGlsZHJlbiA9IG5ldyBIYXNoQmFnPFRlc3RNb2RlbD4oKTsKLQkJfQotCi0JCXB1YmxpYyBUZXN0TW9kZWwgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIHRoaXMucGFyZW50OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPFRlc3RNb2RlbD4gY2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8VGVzdE1vZGVsPih0aGlzLmNoaWxkcmVuKTsKLQkJfQotCQlwdWJsaWMgaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLnNpemUoKTsKLQkJfQotCQlwdWJsaWMgVGVzdE1vZGVsIGFkZENoaWxkKFN0cmluZyBjaGlsZE5hbWUpIHsKLQkJCVRlc3RNb2RlbCBjaGlsZCA9IG5ldyBUZXN0TW9kZWwodGhpcywgY2hpbGROYW1lKTsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihjaGlsZCwgdGhpcy5jaGlsZHJlbiwgQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gY2hpbGQ7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbFtdIGFkZENoaWxkcmVuKFN0cmluZ1tdIGNoaWxkTmFtZXMpIHsKLQkJCVRlc3RNb2RlbFtdIG5ld0NoaWxkcmVuID0gbmV3IFRlc3RNb2RlbFtjaGlsZE5hbWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQluZXdDaGlsZHJlbltpXSA9IG5ldyBUZXN0TW9kZWwodGhpcywgY2hpbGROYW1lc1tpXSk7Ci0JCQl9Ci0JCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKG5ld0NoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLCBDSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJCXJldHVybiBuZXdDaGlsZHJlbjsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChUZXN0TW9kZWwgY2hpbGQpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKGNoaWxkLCB0aGlzLmNoaWxkcmVuLCBDSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZHJlbihUZXN0TW9kZWxbXSB0ZXN0TW9kZWxzKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24odGVzdE1vZGVscywgdGhpcy5jaGlsZHJlbiwgQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJDaGlsZHJlbigpIHsKLQkJCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMuY2hpbGRyZW4sIENISUxEUkVOX0NPTExFQ1RJT04pOwotCQl9Ci0JCXB1YmxpYyBUZXN0TW9kZWwgY2hpbGROYW1lZChTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCQlmb3IgKFRlc3RNb2RlbCBjaGlsZCA6IHRoaXMuY2hpbGRyZW4pIHsKLQkJCQlpZiAoY2hpbGQuZ2V0TmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKSB7Ci0JCQkJCXJldHVybiBjaGlsZDsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY2hpbGQgbm90IGZvdW5kOiAiICsgY2hpbGROYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZHVtcFN0cmluZygpIHsKLQkJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCUluZGVudGluZ1ByaW50V3JpdGVyIGlwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihzdyk7Ci0JCQl0aGlzLmR1bXBPbihpcHcpOwotCQkJcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHVtcE9uKEluZGVudGluZ1ByaW50V3JpdGVyIHdyaXRlcikgewotCQkJd3JpdGVyLnByaW50bG4odGhpcyk7Ci0JCQl3cml0ZXIuaW5kZW50KCk7Ci0JCQlmb3IgKFRlc3RNb2RlbCBjaGlsZCA6IHRoaXMuY2hpbGRyZW4pIHsKLQkJCQljaGlsZC5kdW1wT24od3JpdGVyKTsKLQkJCX0KLQkJCXdyaXRlci51bmRlbnQoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkdW1wT24oT3V0cHV0U3RyZWFtIHN0cmVhbSkgewotCQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtKSk7Ci0JCQl0aGlzLmR1bXBPbih3cml0ZXIpOwotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHVtcCgpIHsKLQkJCXRoaXMuZHVtcE9uKFN5c3RlbS5vdXQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5hbWUpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgTm9kZSB3cmFwcyBhIFRlc3RNb2RlbCBhbmQgY29udmVydHMgaW50byBzb21ldGhpbmcgdGhhdCBjYW4KLQkgKiBiZSB1c2VkIGJ5IFRyZWVNb2RlbEFkYXB0ZXIuIEl0IGNvbnZlcnRzIGNoYW5nZXMgdG8gdGhlIFRlc3RNb2RlbCdzCi0JICogbmFtZSBpbnRvICJzdGF0ZSBjaGFuZ2VzIiB0byB0aGUgTm9kZTsgYW5kIGNvbnZlcnRzIHRoZQotCSAqIFRlc3RNb2RlbCdzIGNoaWxkcmVuIGludG8gYSBMaXN0VmFsdWVNb2RlbCBvZiBOb2RlcyB3aG9zZSBvcmRlciBpcwotCSAqIGRldGVybWluZWQgYnkgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVGVzdE5vZGUgZXh0ZW5kcyBBYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+IGltcGxlbWVudHMgRGlzcGxheWFibGUsIENvbXBhcmFibGU8VGVzdE5vZGU+IHsKLQkJLyoqIHRoZSBtb2RlbCBvYmplY3Qgd3JhcHBlZCBieSB0aGlzIG5vZGUgKi8KLQkJcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQkvKiogdGhpcyBub2RlJ3MgcGFyZW50IG5vZGU7IG51bGwgZm9yIHRoZSByb290IG5vZGUgKi8KLQkJcHJpdmF0ZSBmaW5hbCBUZXN0Tm9kZSBwYXJlbnQ7Ci0JCS8qKiB0aGlzIG5vZGUncyBjaGlsZCBub2RlcyAqLwotCQlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBjaGlsZHJlbk1vZGVsOwotCQkvKiogYSBsaXN0ZW5lciB0aGF0IG5vdGlmaWVzIHVzIHdoZW4gdGhlIG1vZGVsIG9iamVjdCdzICJpbnRlcm5hbCBzdGF0ZSIgY2hhbmdlcyAqLwotCQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGVzdE1vZGVsTGlzdGVuZXI7Ci0KLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIHJvb3Qgbm9kZSBjb25zdHJ1Y3RvcgotCQkgKi8KLQkJcHVibGljIFRlc3ROb2RlKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXRoaXMobnVsbCwgdGVzdE1vZGVsKTsKLQkJfQotCi0JCS8qKgotCQkgKiBicmFuY2ggb3IgbGVhZiBub2RlIGNvbnN0cnVjdG9yCi0JCSAqLwotCQlwdWJsaWMgVGVzdE5vZGUoVGVzdE5vZGUgcGFyZW50LCBUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMuY2hpbGRyZW5Nb2RlbCA9IHRoaXMuYnVpbGRDaGlsZHJlbk1vZGVsKHRlc3RNb2RlbCk7Ci0JCQl0aGlzLnRlc3RNb2RlbExpc3RlbmVyID0gdGhpcy5idWlsZFRlc3RNb2RlbExpc3RlbmVyKCk7Ci0JCX0KLQotCQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUZXN0TW9kZWxMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJCVRlc3ROb2RlLnRoaXMudGVzdE1vZGVsQ2hhbmdlZChlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIHN1YmNsYXNzZXMgZGVjaWRlIHRoZSBvcmRlciBvZiB0aGUgY2hpbGQgbm9kZXMKLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGRDaGlsZHJlbk1vZGVsKFRlc3RNb2RlbCBtb2RlbCk7Ci0KLQkJLyoqCi0JCSAqIHVzZWQgYnkgc3ViY2xhc3NlczsKLQkJICogdHJhbnNmb3JtIHRoZSB0ZXN0IG1vZGVsIGNoaWxkcmVuIGludG8gbm9kZXMKLQkJICovCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGROb2RlQWRhcHRlcihUZXN0TW9kZWwgbW9kZWwpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8VGVzdE1vZGVsLCBUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4odGhpcy5idWlsZENoaWxkcmVuQWRhcHRlcihtb2RlbCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgVGVzdE5vZGUgdHJhbnNmb3JtSXRlbShUZXN0TW9kZWwgaXRlbSkgewotCQkJCQlyZXR1cm4gVGVzdE5vZGUudGhpcy5idWlsZENoaWxkTm9kZShpdGVtKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIHN1YmNsYXNzZXMgbXVzdCBidWlsZCBhIGNvbmNyZXRlIG5vZGUgZm9yIHRoZSBzcGVjaWZpZWQgdGVzdCBtb2RlbAotCQkgKi8KLQkJcHJvdGVjdGVkIGFic3RyYWN0IFRlc3ROb2RlIGJ1aWxkQ2hpbGROb2RlKFRlc3RNb2RlbCBjaGlsZFRlc3RNb2RlbCk7Ci0KLQkJLyoqCi0JCSAqIHJldHVybiBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgb24gdGhlIHNwZWNpZmllZCBtb2RlbCdzIGNoaWxkcmVuCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8VGVzdE1vZGVsPiBidWlsZENoaWxkcmVuQWRhcHRlcihUZXN0TW9kZWwgbW9kZWwpIHsKLQkJCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBUZXN0TW9kZWw+KFRlc3RNb2RlbC5DSElMRFJFTl9DT0xMRUNUSU9OLCBtb2RlbCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxUZXN0TW9kZWw+IGl0ZXJhdG9yXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5jaGlsZHJlbigpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmNoaWxkcmVuU2l6ZSgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogVHJlZU5vZGVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQlwdWJsaWMgVGVzdE1vZGVsIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIHRoaXMudGVzdE1vZGVsOwotCQl9Ci0KLQkJcHVibGljIFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+IHBhcmVudCgpIHsKLQkJCXJldHVybiB0aGlzLnBhcmVudDsKLQkJfQotCi0JCXB1YmxpYyBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gY2hpbGRyZW5Nb2RlbCgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuTW9kZWw7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZSgpIHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFksIHRoaXMudGVzdE1vZGVsTGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlKCkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuTkFNRV9QUk9QRVJUWSwgdGhpcy50ZXN0TW9kZWxMaXN0ZW5lcik7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogRGlzcGxheWFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLnRlc3RNb2RlbC5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgSWNvbiBpY29uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogZGVidWdnaW5nIHN1cHBvcnQgKioqKioqKioqKgotCi0JCXB1YmxpYyBTdHJpbmcgZHVtcFN0cmluZygpIHsKLQkJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCUluZGVudGluZ1ByaW50V3JpdGVyIGlwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihzdyk7Ci0JCQl0aGlzLmR1bXBPbihpcHcpOwotCQkJcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkdW1wT24oSW5kZW50aW5nUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCQl3cml0ZXIucHJpbnRsbih0aGlzKTsKLQkJCXdyaXRlci5pbmRlbnQoKTsKLQkJCWZvciAoSXRlcmF0b3I8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW5Nb2RlbC5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQkvLyBjYXN0IHRvIGEgVGVzdE5vZGUgKGkuZS4gdGhpcyB3b24ndCB3b3JrIHdpdGggYSBOYW1lVGVzdE5vZGUgaW4gdGhlIHRyZWUpCi0JCQkJKChUZXN0Tm9kZSkgc3RyZWFtLm5leHQoKSkuZHVtcE9uKHdyaXRlcik7Ci0JCQl9Ci0JCQl3cml0ZXIudW5kZW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkdW1wT24oT3V0cHV0U3RyZWFtIHN0cmVhbSkgewotCQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtKSk7Ci0JCQl0aGlzLmR1bXBPbih3cml0ZXIpOwotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkdW1wKCkgewotCQkJdGhpcy5kdW1wT24oU3lzdGVtLm91dCk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JCS8qKgotCQkgKiB0aGUgbW9kZWwncyBuYW1lIGhhcyBjaGFuZ2VkLCBmb3J3YXJkIHRoZSBldmVudCB0byBvdXIgbGlzdGVuZXJzCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCB0ZXN0TW9kZWxDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJLy8gd2UgbmVlZCB0byBub3RpZnkgbGlzdGVuZXJzIHRoYXQgb3VyICJpbnRlcm5hbCBzdGF0ZSIgaGFzIGNoYW5nZWQKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQkJLy8gb3VyIGRpc3BsYXkgc3RyaW5nIHN0YXlzIGluIHN5bmNoIHdpdGggdGhlIG1vZGVsJ3MgbmFtZQotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBlLmdldE9sZFZhbHVlKCksIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkJcHVibGljIFRlc3RNb2RlbCBnZXRUZXN0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gdGhpcy50ZXN0TW9kZWw7Ci0JCX0KLQotCQkvKioKLQkJICogdGVzdGluZyBjb252ZW5pZW5jZSBtZXRob2QKLQkJICovCi0JCXB1YmxpYyBUZXN0Tm9kZSBjaGlsZE5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuTW9kZWwuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4gY2hpbGROb2RlID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAoY2hpbGROb2RlIGluc3RhbmNlb2YgVGVzdE5vZGUpIHsKLQkJCQkJaWYgKCgoVGVzdE5vZGUpIGNoaWxkTm9kZSkuZ2V0VGVzdE1vZGVsKCkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCQkJcmV0dXJuIChUZXN0Tm9kZSkgY2hpbGROb2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2hpbGQgbm90IGZvdW5kOiAiICsgbmFtZSk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQkJcHVibGljIGludCBjb21wYXJlVG8oVGVzdE5vZGUgbykgewotCQkJcmV0dXJuIHRoaXMuZGlzcGxheVN0cmluZygpLmNvbXBhcmVUbyhvLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiTm9kZSgiICsgdGhpcy50ZXN0TW9kZWwgKyAiKSI7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIHRoYXQga2VlcHMgaXRzIGNoaWxkcmVuIHNvcnRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU29ydGVkVGVzdE5vZGUgZXh0ZW5kcyBUZXN0Tm9kZSB7Ci0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQlwdWJsaWMgU29ydGVkVGVzdE5vZGUoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIodGVzdE1vZGVsKTsKLQkJfQotCQlwdWJsaWMgU29ydGVkVGVzdE5vZGUoVGVzdE5vZGUgcGFyZW50LCBUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcihwYXJlbnQsIHRlc3RNb2RlbCk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkJLyoqIHRoZSBsaXN0IHNob3VsZCBiZSBzb3J0ZWQgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGRDaGlsZHJlbk1vZGVsKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+Pih0aGlzLmJ1aWxkRGlzcGxheVN0cmluZ0FkYXB0ZXIodGVzdE1vZGVsKSk7Ci0JCX0KLQkJLyoqIHRoZSBkaXNwbGF5IHN0cmluZyAobmFtZSkgb2YgZWFjaCBub2RlIGNhbiBjaGFuZ2UgKi8KLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZERpc3BsYXlTdHJpbmdBZGFwdGVyKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+Pih0aGlzLmJ1aWxkTm9kZUFkYXB0ZXIodGVzdE1vZGVsKSwgRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpOwotCQl9Ci0JCS8qKiBjaGlsZHJlbiBhcmUgYWxzbyBzb3J0ZWQgbm9kZXMgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBUZXN0Tm9kZSBidWlsZENoaWxkTm9kZShUZXN0TW9kZWwgY2hpbGROb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IFNvcnRlZFRlc3ROb2RlKHRoaXMsIGNoaWxkTm9kZSk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gdGhhdCBsZWF2ZXMgaXRzIGNoaWxkcmVuIHVuc29ydGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBVbnNvcnRlZFRlc3ROb2RlIGV4dGVuZHMgVGVzdE5vZGUgewotCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkJcHVibGljIFVuc29ydGVkVGVzdE5vZGUoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIodGVzdE1vZGVsKTsKLQkJfQotCQlwdWJsaWMgVW5zb3J0ZWRUZXN0Tm9kZShUZXN0Tm9kZSBwYXJlbnQsIFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKHBhcmVudCwgdGVzdE1vZGVsKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQkvKiogdGhlIGxpc3Qgc2hvdWxkIE5PVCBiZSBzb3J0ZWQgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGRDaGlsZHJlbk1vZGVsKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkTm9kZUFkYXB0ZXIodGVzdE1vZGVsKTsKLQkJfQotCQkvKiogY2hpbGRyZW4gYXJlIGFsc28gdW5zb3J0ZWQgbm9kZXMgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBUZXN0Tm9kZSBidWlsZENoaWxkTm9kZShUZXN0TW9kZWwgY2hpbGROb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IFVuc29ydGVkVGVzdE5vZGUodGhpcywgY2hpbGROb2RlKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGxlYXZlcyBpdHMgY2hpbGRyZW4gdW5zb3J0ZWQKLQkgKiBhbmQgaGFzIGEgc3BlY2lhbCBzZXQgb2YgY2hpbGRyZW4gZm9yICJub2RlIDMiCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTcGVjaWFsVGVzdE5vZGUgZXh0ZW5kcyBVbnNvcnRlZFRlc3ROb2RlIHsKLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCXB1YmxpYyBTcGVjaWFsVGVzdE5vZGUoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIodGVzdE1vZGVsKTsKLQkJfQotCQlwdWJsaWMgU3BlY2lhbFRlc3ROb2RlKFRlc3ROb2RlIHBhcmVudCwgVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIocGFyZW50LCB0ZXN0TW9kZWwpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCS8qKiByZXR1cm4gYSBkaWZmZXJlbnQgbGlzdCBvZiBjaGlsZHJlbiBmb3IgIm5vZGUgMyIgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGRDaGlsZHJlbk1vZGVsKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCWlmICh0ZXN0TW9kZWwuZ2V0TmFtZSgpLmVxdWFscygibm9kZSAzIikpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZFNwZWNpYWxDaGlsZHJlbk1vZGVsKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuYnVpbGRDaGlsZHJlbk1vZGVsKHRlc3RNb2RlbCk7Ci0JCX0KLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZFNwZWNpYWxDaGlsZHJlbk1vZGVsKCkgewotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD5bXSBjaGlsZHJlbiA9IG5ldyBOYW1lVGVzdE5vZGVbMV07Ci0JCQljaGlsZHJlblswXSA9IG5ldyBOYW1lVGVzdE5vZGUodGhpcyk7Ci0JCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PihBcnJheXMuYXNMaXN0KGNoaWxkcmVuKSk7Ci0JCX0KLQkJLyoqIGNoaWxkcmVuIGFyZSBhbHNvIHNwZWNpYWwgbm9kZXMgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBUZXN0Tm9kZSBidWlsZENoaWxkTm9kZShUZXN0TW9kZWwgY2hpbGROb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IFNwZWNpYWxUZXN0Tm9kZSh0aGlzLCBjaGlsZE5vZGUpOwotCQl9Ci0KLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmFtZVRlc3ROb2RlIGV4dGVuZHMgQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0PiB7Ci0JCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQkJcHJpdmF0ZSBmaW5hbCBTcGVjaWFsVGVzdE5vZGUgc3BlY2lhbE5vZGU7CQkvLyBwYXJlbnQgbm9kZQotCQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbmFtZUxpc3RlbmVyOwotCQlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBjaGlsZHJlbk1vZGVsOwotCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCQlwdWJsaWMgTmFtZVRlc3ROb2RlKFNwZWNpYWxUZXN0Tm9kZSBzcGVjaWFsTm9kZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubmFtZUxpc3RlbmVyID0gdGhpcy5idWlsZE5hbWVMaXN0ZW5lcigpOwotCQkJdGhpcy5zcGVjaWFsTm9kZSA9IHNwZWNpYWxOb2RlOwotCQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGROYW1lQWRhcHRlcigpOwotCQkJdGhpcy5jaGlsZHJlbk1vZGVsID0gbmV3IE51bGxMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4oKTsKLQkJfQotCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE5hbWVMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJCU5hbWVUZXN0Tm9kZS50aGlzLm5hbWVDaGFuZ2VkKGUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPihUZXN0TW9kZWwuTkFNRV9QUk9QRVJUWSwgdGhpcy5nZXRUZXN0TW9kZWwoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHVibGljIFRlc3RNb2RlbCBnZXRUZXN0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zcGVjaWFsTm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogVHJlZU5vZGVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKChTdHJpbmcpIHZhbHVlKTsKLQkJfQotCQlwdWJsaWMgVHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4gcGFyZW50KCkgewotCQkJcmV0dXJuIHRoaXMuc3BlY2lhbE5vZGU7Ci0JCX0KLQkJcHVibGljIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBjaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbDsKLQkJfQotCi0JCS8vICoqKioqKioqKiogQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZSgpIHsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubmFtZUxpc3RlbmVyKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWUoKSB7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm5hbWVMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCQlwcm90ZWN0ZWQgdm9pZCBuYW1lQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCS8vIHdlIG5lZWQgdG8gbm90aWZ5IGxpc3RlbmVycyB0aGF0IG91ciAidmFsdWUiIGhhcyBjaGFuZ2VkCi0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIGUuZ2V0T2xkVmFsdWUoKSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkVHJlZU1vZGVsKFRlc3ROb2RlIHJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmVlTW9kZWwobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4ocm9vdCkpOwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkVHJlZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gcm9vdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyZWVNb2RlbEFkYXB0ZXI8T2JqZWN0Pihyb290SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRDaGlsZHJlbkxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcl8oKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGROb2RlU3RhdGVMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZE5vZGVTdGF0ZUxpc3RlbmVyXygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE5vZGVWYWx1ZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTm9kZVZhbHVlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUm9vdExpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkUm9vdExpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCi0KLQkvKioKLQkgKiBsaXN0ZW5lciB0aGF0IHdpbGwgYmxvdyB1cCB3aXRoIGFueSBldmVudDsKLQkgKiBvdmVycmlkZSBhbmQgaW1wbGVtZW50IGV4cGVjdGVkIGV2ZW50IG1ldGhvZHMKLQkgKi8KLQlwdWJsaWMgY2xhc3MgVGVzdFRyZWVNb2RlbExpc3RlbmVyIGltcGxlbWVudHMgVHJlZU1vZGVsTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNJbnNlcnRlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZU5vZGVzUmVtb3ZlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZVN0cnVjdHVyZUNoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzM5MTcyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuVGV4dEZpZWxkOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUcmVlOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdFRyZWVTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVQYXRoOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZVNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW51bWVyYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVHJlZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlTm9kZVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVHJlZU1vZGVsQWRhcHRlclRlc3RzLlNvcnRlZFRlc3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXJUZXN0cy5UZXN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVHJlZU1vZGVsQWRhcHRlclRlc3RzLlRlc3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXJUZXN0cy5VbnNvcnRlZFRlc3ROb2RlOwotCi0vKioKLSAqIGFuIGV4YW1wbGUgVUkgZm9yIHRlc3RpbmcgdGhlIFRyZWVNb2RlbEFkYXB0ZXIKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJlZU1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQkvLyBob2xkIHRoZSB0cmVlIHNvIHdlIGNhbiByZXN0b3JlIGl0cyBleHBhbnNpb24gc3RhdGUKLQlwcml2YXRlIEpUcmVlIHRyZWU7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gcm9vdE5vZGVIb2xkZXI7Ci0JcHJpdmF0ZSBib29sZWFuIHNvcnRlZDsKLQlwcml2YXRlIFRyZWVNb2RlbCB0cmVlTW9kZWw7Ci0JcHJpdmF0ZSBUcmVlU2VsZWN0aW9uTW9kZWwgdHJlZVNlbGVjdGlvbk1vZGVsOwotCXByaXZhdGUgVGV4dEZpZWxkIG5hbWVUZXh0RmllbGQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IFRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKCk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMucm9vdE5vZGVIb2xkZXIgPSB0aGlzLmJ1aWxkUm9vdE5vZGVIb2xkZXIoKTsKLQkJdGhpcy5zb3J0ZWQgPSB0aGlzLnJvb3ROb2RlSG9sZGVyLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBTb3J0ZWRUZXN0Tm9kZTsKLQkJdGhpcy50cmVlTW9kZWwgPSB0aGlzLmJ1aWxkVHJlZU1vZGVsKCk7Ci0JCXRoaXMudHJlZVNlbGVjdGlvbk1vZGVsID0gdGhpcy5idWlsZFRyZWVTZWxlY3Rpb25Nb2RlbCgpOwotCQl0aGlzLm5hbWVUZXh0RmllbGQgPSBuZXcgVGV4dEZpZWxkKCk7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkUm9vdE5vZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+Pih0aGlzLmJ1aWxkU29ydGVkUm9vdE5vZGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0Tm9kZSBidWlsZFNvcnRlZFJvb3ROb2RlKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZFRlc3ROb2RlKHRoaXMuYnVpbGRSb290KCkpOwotCX0KLQotCXByaXZhdGUgVGVzdE5vZGUgYnVpbGRVbnNvcnRlZFJvb3ROb2RlKCkgewotCQlyZXR1cm4gbmV3IFVuc29ydGVkVGVzdE5vZGUodGhpcy5idWlsZFJvb3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgYnVpbGRSb290KCkgewotCQlUZXN0TW9kZWwgcm9vdCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQotCQlUZXN0TW9kZWwgbm9kZV8xID0gcm9vdC5hZGRDaGlsZCgibm9kZSAxIik7Ci0JCS8qTm9kZSBub2RlXzFfMSA9ICovbm9kZV8xLmFkZENoaWxkKCJub2RlIDEuMSIpOwotCi0JCVRlc3RNb2RlbCBub2RlXzIgPSByb290LmFkZENoaWxkKCJub2RlIDIiKTsKLQkJLypOb2RlIG5vZGVfMl8xID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi4xIik7Ci0JCVRlc3RNb2RlbCBub2RlXzJfMiA9IG5vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjIiKTsKLQkJLypOb2RlIG5vZGVfMl8yXzEgPSAqL25vZGVfMl8yLmFkZENoaWxkKCJub2RlIDIuMi4xIik7Ci0JCS8qTm9kZSBub2RlXzJfMl8yID0gKi9ub2RlXzJfMi5hZGRDaGlsZCgibm9kZSAyLjIuMiIpOwotCQkvKk5vZGUgbm9kZV8yXzMgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjMiKTsKLQkJLypOb2RlIG5vZGVfMl80ID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi40Iik7Ci0JCS8qTm9kZSBub2RlXzJfNSA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuNSIpOwotCi0JCVRlc3RNb2RlbCBub2RlXzMgPSByb290LmFkZENoaWxkKCJub2RlIDMiKTsKLQkJVGVzdE1vZGVsIG5vZGVfM18xID0gbm9kZV8zLmFkZENoaWxkKCJub2RlIDMuMSIpOwotCQlUZXN0TW9kZWwgbm9kZV8zXzFfMSA9IG5vZGVfM18xLmFkZENoaWxkKCJub2RlIDMuMS4xIik7Ci0JCS8qTm9kZSBub2RlXzNfMV8xXzEgPSAqL25vZGVfM18xXzEuYWRkQ2hpbGQoIm5vZGUgMy4xLjEuMSIpOwotCi0JCS8qTm9kZSBub2RlXzQgPSAqL3Jvb3QuYWRkQ2hpbGQoIm5vZGUgNCIpOwotCi0JCXJldHVybiByb290OwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkVHJlZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFRyZWVNb2RlbEFkYXB0ZXI8T2JqZWN0Pih0aGlzLnJvb3ROb2RlSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVTZWxlY3Rpb25Nb2RlbCBidWlsZFRyZWVTZWxlY3Rpb25Nb2RlbCgpIHsKLQkJVHJlZVNlbGVjdGlvbk1vZGVsIHRzbSA9IG5ldyBEZWZhdWx0VHJlZVNlbGVjdGlvbk1vZGVsKCk7Ci0JCXRzbS5hZGRUcmVlU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZFRyZWVTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJdHNtLnNldFNlbGVjdGlvbk1vZGUoVHJlZVNlbGVjdGlvbk1vZGVsLlNJTkdMRV9UUkVFX1NFTEVDVElPTik7Ci0JCXJldHVybiB0c207Ci0JfQotCi0JcHJpdmF0ZSBUcmVlU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRUcmVlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJlZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKFRyZWVTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnRyZWVTZWxlY3Rpb25DaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgdHJlZVNlbGVjdGlvbkNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJaWYgKHNlbGVjdGVkVGVzdE1vZGVsICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZVRleHRGaWVsZC5zZXRUZXh0KHNlbGVjdGVkVGVzdE1vZGVsLmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRMb2NhdGlvbigzMDAsIDMwMCk7Ci0JCXdpbmRvdy5zZXRTaXplKDQwMCwgNDAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFRyZWVQYW5lKCksIEJvcmRlckxheW91dC5DRU5URVIpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFRyZWVQYW5lKCkgewotCQlyZXR1cm4gbmV3IEpTY3JvbGxQYW5lKHRoaXMuYnVpbGRUcmVlKCkpOwotCX0KLQotCXByaXZhdGUgSlRyZWUgYnVpbGRUcmVlKCkgewotCQl0aGlzLnRyZWUgPSBuZXcgSlRyZWUodGhpcy50cmVlTW9kZWwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1RleHQoT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGV4cGFuZGVkLCBib29sZWFuIGxlYWYsIGludCByb3csIGJvb2xlYW4gaGFzRm9jdXMpIHsKLQkJCQlyZXR1cm4gKChEaXNwbGF5YWJsZSkgdmFsdWUpLmRpc3BsYXlTdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy50cmVlLnNldFNlbGVjdGlvbk1vZGVsKHRoaXMudHJlZVNlbGVjdGlvbk1vZGVsKTsKLQkJdGhpcy50cmVlLnNldFJvb3RWaXNpYmxlKHRydWUpOwotCQl0aGlzLnRyZWUuc2V0U2hvd3NSb290SGFuZGxlcyh0cnVlKTsKLQkJdGhpcy50cmVlLnNldFJvd0hlaWdodCgyMCk7Ci0JCXRoaXMudHJlZS5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJcmV0dXJuIHRoaXMudHJlZTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMCwgMSkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRSZW5hbWVOb2RlUGFuZWwoKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZE1pc2NQYW5lbCgpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZEFkZFJlbmFtZU5vZGVQYW5lbCgpIHsKLQkJSlBhbmVsIGFkZFJlbmFtZU5vZGVQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJYWRkUmVuYW1lTm9kZVBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkQnV0dG9uKCksIEJvcmRlckxheW91dC5XRVNUKTsKLQkJYWRkUmVuYW1lTm9kZVBhbmVsLmFkZCh0aGlzLm5hbWVUZXh0RmllbGQsIEJvcmRlckxheW91dC5DRU5URVIpOwotCQlhZGRSZW5hbWVOb2RlUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW5hbWVCdXR0b24oKSwgQm9yZGVyTGF5b3V0LkVBU1QpOwotCQlyZXR1cm4gYWRkUmVuYW1lTm9kZVBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWlzY1BhbmVsKCkgewotCQlKUGFuZWwgbWlzY1BhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCW1pc2NQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyQ2hpbGRyZW5CdXR0b24oKSk7Ci0JCW1pc2NQYW5lbC5hZGQodGhpcy5idWlsZFJlbW92ZUJ1dHRvbigpKTsKLQkJbWlzY1BhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzZXRCdXR0b24oKSk7Ci0JCXJldHVybiBtaXNjUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZVRleHRGaWVsZC5nZXRUZXh0KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQlwcml2YXRlIFRlc3ROb2RlIHNlbGVjdGVkTm9kZSgpIHsKLQkJaWYgKHRoaXMudHJlZVNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0aW9uRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChUZXN0Tm9kZSkgdGhpcy50cmVlU2VsZWN0aW9uTW9kZWwuZ2V0U2VsZWN0aW9uUGF0aCgpLmdldExhc3RQYXRoQ29tcG9uZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgc2VsZWN0ZWRUZXN0TW9kZWwoKSB7Ci0JCWlmICh0aGlzLnRyZWVTZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGlvbkVtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkTm9kZSgpLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0Tm9kZSByb290Tm9kZSgpIHsKLQkJcmV0dXJuIChUZXN0Tm9kZSkgdGhpcy50cmVlTW9kZWwuZ2V0Um9vdCgpOwotCX0KLQotCXByaXZhdGUgVGVzdE1vZGVsIHJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3ROb2RlKCkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248VHJlZVBhdGg+IGV4cGFuZGVkUGF0aHMoKSB7Ci0JCUVudW1lcmF0aW9uPFRyZWVQYXRoPiBzdHJlYW0gPSB0aGlzLnRyZWUuZ2V0RXhwYW5kZWREZXNjZW5kYW50cyhuZXcgVHJlZVBhdGgodGhpcy5yb290Tm9kZSgpKSk7Ci0JCWlmIChzdHJlYW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdChuZXcgRW51bWVyYXRpb25JdGVyYXRvcjxUcmVlUGF0aD4oc3RyZWFtKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkTm9kZShUZXN0Tm9kZSBzZWxlY3RlZE5vZGUpIHsKLQkJdGhpcy50cmVlU2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uUGF0aChuZXcgVHJlZVBhdGgoc2VsZWN0ZWROb2RlLnBhdGgoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRQYXRocyhDb2xsZWN0aW9uPFRyZWVQYXRoPiBwYXRocykgewotCQlmb3IgKFRyZWVQYXRoIHBhdGggOiBwYXRocykgewotCQkJdGhpcy50cmVlLmV4cGFuZFBhdGgocGF0aCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGFkZCAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQWRkQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZEFkZEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZEFkZEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiYWRkIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZE5vZGUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JLyoqCi0JICogYWRkaW5nIGNhdXNlcyB0aGUgdHJlZSB0byBiZSBzb3J0ZWQgYW5kIG5vZGVzIHRvIGJlCi0JICogcmVtb3ZlZCBhbmQgcmUtYWRkZWQ7IHNvIHdlIGhhdmUgdG8gZmlkZGxlIHdpdGggdGhlIGV4cGFuc2lvbiBzdGF0ZQotCSAqLwotCXZvaWQgYWRkTm9kZSgpIHsKLQkJVGVzdE1vZGVsIHNlbGVjdGVkVGVzdE1vZGVsID0gdGhpcy5zZWxlY3RlZFRlc3RNb2RlbCgpOwotCQlpZiAoc2VsZWN0ZWRUZXN0TW9kZWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWUoKTsKLQkJCS8vIHNhdmUgdGhlIGV4cGFuc2lvbiBzdGF0ZSBhbmQgcmVzdG9yZSBpdCBhZnRlciB0aGUgYWRkCi0JCQlDb2xsZWN0aW9uPFRyZWVQYXRoPiBwYXRocyA9IHRoaXMuZXhwYW5kZWRQYXRocygpOwotCi0JCQlzZWxlY3RlZFRlc3RNb2RlbC5hZGRDaGlsZChuYW1lKTsKLQotCQkJdGhpcy5leHBhbmRQYXRocyhwYXRocyk7Ci0JCQl0aGlzLnNldFNlbGVjdGVkTm9kZSh0aGlzLnNlbGVjdGVkTm9kZSgpLmNoaWxkTmFtZWQobmFtZSkpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbW92ZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW1vdmVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW1vdmVBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbW92ZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW1vdmVOb2RlKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIHdlIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBub2RlIHRvIHNlbGVjdCBhZnRlcgotCSAqIHRoZSBzZWxlY3RlZCBub2RlIGlzIGRlbGV0ZWQKLQkgKi8KLQl2b2lkIHJlbW92ZU5vZGUoKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJLy8gZG8gbm90IGFsbG93IHRoZSByb290IHRvIGJlIHJlbW92ZWQKLQkJaWYgKChzZWxlY3RlZFRlc3RNb2RlbCAhPSBudWxsKSAmJiAoc2VsZWN0ZWRUZXN0TW9kZWwgIT0gdGhpcy5yb290KCkpKSB7Ci0JCQkvLyBzYXZlIHRoZSBwYXJlbnQgYW5kIGluZGV4LCBzbyB3ZSBjYW4gc2VsZWN0IGFub3RoZXIsIG5lYXJieSwgbm9kZQotCQkJLy8gb25jZSB0aGUgc2VsZWN0ZWQgbm9kZSBpcyByZW1vdmVkCi0JCQlUZXN0Tm9kZSBwYXJlbnROb2RlID0gKFRlc3ROb2RlKSB0aGlzLnNlbGVjdGVkTm9kZSgpLnBhcmVudCgpOwotCQkJaW50IGNoaWxkSW5kZXggPSBwYXJlbnROb2RlLmluZGV4T2ZDaGlsZCh0aGlzLnNlbGVjdGVkTm9kZSgpKTsKLQotCQkJc2VsZWN0ZWRUZXN0TW9kZWwuZ2V0UGFyZW50KCkucmVtb3ZlQ2hpbGQoc2VsZWN0ZWRUZXN0TW9kZWwpOwotCi0JCQlpbnQgY2hpbGRyZW5TaXplID0gcGFyZW50Tm9kZS5jaGlsZHJlblNpemUoKTsKLQkJCWlmIChjaGlsZEluZGV4IDwgY2hpbGRyZW5TaXplKSB7Ci0JCQkJLy8gc2VsZWN0IHRoZSBjaGlsZCB0aGF0IG1vdmVkIHVwIGFuZCByZXBsYWNlZCB0aGUganVzdC1kZWxldGVkIGNoaWxkCi0JCQkJdGhpcy5zZXRTZWxlY3RlZE5vZGUoKFRlc3ROb2RlKSBwYXJlbnROb2RlLmNoaWxkKGNoaWxkSW5kZXgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNoaWxkcmVuU2l6ZSA9PSAwKSB7Ci0JCQkJCS8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGNoaWxkcmVuLCBzZWxlY3QgdGhlIHBhcmVudAotCQkJCQl0aGlzLnNldFNlbGVjdGVkTm9kZShwYXJlbnROb2RlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBpZiB0aGUgY2hpbGQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdCB3YXMgZGVsZXRlZCwgc2VsZWN0IHRoZSBuZXh0IGNoaWxkIHVwCi0JCQkJCXRoaXMuc2V0U2VsZWN0ZWROb2RlKChUZXN0Tm9kZSkgcGFyZW50Tm9kZS5jaGlsZChjaGlsZEluZGV4IC0gMSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogcmVuYW1lICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZW5hbWVCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVuYW1lQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVuYW1lQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZW5hbWUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVuYW1lTm9kZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiByZW5hbWluZyBjYXVzZXMgdGhlIHRyZWUgdG8gYmUgc29ydGVkIGFuZCBub2RlcyB0byBiZQotCSAqIHJlbW92ZWQgYW5kIHJlLWFkZGVkOyBzbyB3ZSBoYXZlIHRvIGZpZGRsZSB3aXRoIHRoZSBleHBhbnNpb24gc3RhdGUKLQkgKi8KLQl2b2lkIHJlbmFtZU5vZGUoKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJaWYgKHNlbGVjdGVkVGVzdE1vZGVsICE9IG51bGwpIHsKLQkJCS8vIHNhdmUgdGhlIG5vZGUgYW5kIHJlLXNlbGVjdCBpdCBhZnRlciB0aGUgcmVuYW1lCi0JCQlUZXN0Tm9kZSBzZWxlY3RlZE5vZGUgPSB0aGlzLnNlbGVjdGVkTm9kZSgpOwotCQkJLy8gc2F2ZSB0aGUgZXhwYW5zaW9uIHN0YXRlIGFuZCByZXN0b3JlIGl0IGFmdGVyIHRoZSByZW5hbWUKLQkJCUNvbGxlY3Rpb248VHJlZVBhdGg+IHBhdGhzID0gdGhpcy5leHBhbmRlZFBhdGhzKCk7Ci0KLQkJCXNlbGVjdGVkVGVzdE1vZGVsLnNldE5hbWUodGhpcy5nZXROYW1lKCkpOwotCi0JCQl0aGlzLmV4cGFuZFBhdGhzKHBhdGhzKTsKLQkJCXRoaXMuc2V0U2VsZWN0ZWROb2RlKHNlbGVjdGVkTm9kZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGNsZWFyIGNoaWxkcmVuICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhckNoaWxkcmVuQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyQ2hpbGRyZW5BY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhckNoaWxkcmVuQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBjaGlsZHJlbiIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhckNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIG5vdGhpbmcgc3BlY2lhbCwgd2UganVzdCB3YW50IHRvIHRlc3QgI2ZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTdHJpbmcpCi0JICovCi0Jdm9pZCBjbGVhckNoaWxkcmVuKCkgewotCQlUZXN0TW9kZWwgc2VsZWN0ZWRUZXN0TW9kZWwgPSB0aGlzLnNlbGVjdGVkVGVzdE1vZGVsKCk7Ci0JCWlmIChzZWxlY3RlZFRlc3RNb2RlbCAhPSBudWxsKSB7Ci0JCQlzZWxlY3RlZFRlc3RNb2RlbC5jbGVhckNoaWxkcmVuKCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlc2V0ICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXNldEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc2V0QWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXNldCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IHRoZSBhZGFwdGVyJ3Mgcm9vdCBub2RlIGhvbGRlcjsKLQkgKiB0b2dnbGUgYmV0d2VlbiBzb3J0ZWQgYW5kIHVuc29ydGVkIGxpc3RzCi0JICovCi0Jdm9pZCByZXNldCgpIHsKLQkJdGhpcy5zb3J0ZWQgPSAhIHRoaXMuc29ydGVkOwotCQlpZiAodGhpcy5zb3J0ZWQpIHsKLQkJCXRoaXMucm9vdE5vZGVIb2xkZXIuc2V0VmFsdWUodGhpcy5idWlsZFNvcnRlZFJvb3ROb2RlKCkpOwotCQl9IGVsc2UgewotCQkJdGhpcy5yb290Tm9kZUhvbGRlci5zZXRWYWx1ZSh0aGlzLmJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpKTsKLQkJfQotCQl0aGlzLnRyZWUuZXhwYW5kUGF0aChuZXcgVHJlZVBhdGgodGhpcy5yb290Tm9kZSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL25vZGUvQWJzdHJhY3ROb2RlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTcxNDMzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuQWJzdHJhY3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLlByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBYnN0cmFjdE5vZGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFRlc3RXb3JrYmVuY2hNb2RlbCByb290OwotCi0JcHVibGljIEFic3RyYWN0Tm9kZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMucm9vdCA9IHRoaXMuYnVpbGRSb290KCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0V29ya2JlbmNoTW9kZWwgYnVpbGRSb290KCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgciA9IG5ldyBSb290VGVzdFdvcmtiZW5jaE1vZGVsKCJyb290Iik7Ci0JCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZTEgPSByLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZTFfMSA9IG5vZGUxLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEuMSIpOwotCQkJCQlub2RlMV8xLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEuMS4xIik7Ci0JCQkJCW5vZGUxXzEuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMS4xLjIiKTsKLQkJCQkJbm9kZTFfMS5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAxLjEuMyIpOwotCQkJCW5vZGUxLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEuMiIpOwotCQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUyID0gci5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAyIik7Ci0JCQkJbm9kZTIuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMi4xIik7Ci0JCQkJbm9kZTIuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMi4yIik7Ci0JCQlyLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDMiKTsKLQkJCXIuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgNCIpOwotCi0JCS8vIG1hcmsgdGhlIGVudGlyZSB0cmVlIGNsZWFuCi0JCXIubWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCXJldHVybiByOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGVzdFdvcmtiZW5jaE1vZGVsKCkgewotCQkvLyBtYWtlIHN1cmUgb3VyIHRlc3QgY2xhc3Mgd29ya3MgT0suLi4KLQkJYXNzZXJ0TnVsbCh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMSIpLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDEiKS5pc0NsZWFuQnJhbmNoKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAyIikuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMiIpLmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydE51bGwodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDIuMSIpKTsKLQotCQlhc3NlcnROdWxsKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMSIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAyIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDIuMSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAyLjEiKS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDIuMSIpLmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIikuaXNDbGVhbkJyYW5jaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyZW50QW5kQ2hpbGRyZW4oKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJYXNzZXJ0RXF1YWxzKCJub2RlIDEuMS4zIiwgbm9kZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUobm9kZS5jaGlsZHJlbigpKSk7Ci0KLQkJbm9kZSA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydEVxdWFscygibm9kZSAxLjEiLCBub2RlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShub2RlLmNoaWxkcmVuKCkpKTsKLQotCQlub2RlID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJub2RlIDEiLCBub2RlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShub2RlLmNoaWxkcmVuKCkpKTsKLQotCQlub2RlID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJyb290Iiwgbm9kZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLnNpemUobm9kZS5jaGlsZHJlbigpKSk7Ci0KLQkJbm9kZSA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydE51bGwobm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5KCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0U2l6ZSg0Mik7Ci0JCWFzc2VydFRydWUobm9kZS5pc0RpcnR5KCkpOwotCi0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eVVuY2hhbmdlZEF0dHJpYnV0ZSgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldFNpemUoNDIpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNEaXJ0eSgpKTsKLQotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbigpKTsKLQotCQl0aGlzLnJvb3QubWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCS8vIHNldCBzaXplIHRvIHNhbWUgbnVtYmVyIC0gc2hvdWxkIHN0YXkgY2xlYW4KLQkJbm9kZS5zZXRTaXplKDQyKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5QnJhbmNoKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0U2l6ZSg0Mik7Ci0JCWFzc2VydFRydWUobm9kZS5pc0RpcnR5QnJhbmNoKCkpOwotCi0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0RpcnR5QnJhbmNoKCkpOwotCi0JCXBhcmVudC5zZXRTaXplKDc3KTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQotCQlub2RlLm1hcmtFbnRpcmVCcmFuY2hDbGVhbigpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eUJyYW5jaENsZWFuQ2hpbGREaXJ0eVBhcmVudCgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldFNpemUoNDIpOwotCi0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlwYXJlbnQuc2V0U2l6ZSg3Nyk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0KLQkJLy8gbm93LCBjbGVhbiB0aGUgY2hpbGQsIGJ1dCBsZWF2ZSB0aGUgcGFyZW50IGRpcnR5Ci0JCW5vZGUubWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5QnJhbmNoQ2xlYW5DaGlsZERpcnR5Q2hpbGQoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlMSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4xIik7Ci0JCW5vZGUxLnNldFNpemUoNDEpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZTIgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMiIpOwotCQlub2RlMi5zZXRTaXplKDQyKTsKLQotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZTEuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0KLQkJLy8gbm93LCBjbGVhbiB0aGUgZmlyc3QgY2hpbGQsIGJ1dCBsZWF2ZSB0aGUgc2Vjb25kIGNoaWxkIGRpcnR5Ci0JCW5vZGUxLm1hcmtFbnRpcmVCcmFuY2hDbGVhbigpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eUJyYW5jaEZvcmNlZCgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQotCQlhc3NlcnRUcnVlKG5vZGUuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW5CcmFuY2goKSk7Ci0KLQkJdGhpcy5yb290Lm1hcmtFbnRpcmVCcmFuY2hEaXJ0eSgpOwotCi0JCWFzc2VydFRydWUobm9kZS5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNEaXJ0eUJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNEaXJ0eUJyYW5jaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlydHlUcmFuc2llbnRBdHRyaWJ1dGUoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXROYW1lKCJCT0dVUyIpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNEaXJ0eSgpKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzRGlydHlCcmFuY2goKSk7Ci0KLQkJdGhpcy5yb290Lm1hcmtFbnRpcmVCcmFuY2hDbGVhbigpOwotCi0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydFRydWUodGhpcy5yb290LnByb2JsZW1zU2l6ZSgpID09IDApOwotCQlhc3NlcnRUcnVlKG5vZGUuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5wcm9ibGVtc1NpemUoKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKG5vZGUucHJvYmxlbXNTaXplKCkgPiAwKTsKLQotCQkvLyBzaW5jZSBwcm9ibGVtcyBhcmUgdHJhbnNpZW50LCBldmVyeXRoaW5nIHNob3VsZCBzdGlsbCBiZSBjbGVhbgotCQlhc3NlcnRUcnVlKG5vZGUuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW5CcmFuY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb2JsZW1zKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0TmFtZSgiQk9HVVMiKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydFRydWUobm9kZS5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJUHJvYmxlbSBwcm9ibGVtMSA9IG5vZGUucHJvYmxlbXMoKS5uZXh0KCk7Ci0KLQkJLy8gbm93IGNyZWF0ZSBhbm90aGVyIHByb2JsZW0gdGhhdCBzaG91bGQgcmVtb3ZlIHRoZSBvbGQgcHJvYmxlbQotCQlub2RlLnNldE5hbWUoIlNUSUxMIEJPR1VTIik7Ci0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygwLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKG5vZGUuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCVByb2JsZW0gcHJvYmxlbTIgPSBub2RlLnByb2JsZW1zKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShwcm9ibGVtMSA9PSBwcm9ibGVtMik7Ci0JCXByb2JsZW0xID0gcHJvYmxlbTI7Ci0KLQkJLy8gbm93IGNyZWF0ZSBhbm90aGVyIHByb2JsZW0gdGhhdCBzaG91bGQgcmVwbGFjZSB0aGUgb2xkIHByb2JsZW0KLQkJbm9kZS5zZXROYW1lKCJTVElMTCBCT0dVUyIpOwotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlwcm9ibGVtMiA9IG5vZGUucHJvYmxlbXMoKS5uZXh0KCk7Ci0JCS8vIHRoZSBzYW1lIHByb2JsZW0gc2hvdWxkIGJlIHRoZXJlCi0JCWFzc2VydFRydWUocHJvYmxlbTEuZXF1YWxzKHByb2JsZW0yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJyYW5jaFByb2JsZW1zKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0TmFtZSgiQk9HVVMiKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCXBhcmVudC5zZXROYW1lKCJCT0dVUyBUT08iKTsKLQkJdGhpcy5yb290LnNldE5hbWUoIkJPR1VTIFRPTyBUT08iKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMucm9vdC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcGFyZW50LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0KLQkJbm9kZS5zZXROYW1lKCJva2llLWRva2llIik7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLnJvb3QuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5vZGUuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckFsbEJyYW5jaFByb2JsZW1zKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0TmFtZSgiQk9HVVMiKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCXBhcmVudC5zZXROYW1lKCJCT0dVUyBUT08iKTsKLQkJdGhpcy5yb290LnNldE5hbWUoIkJPR1VTIFRPTyBUT08iKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMucm9vdC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcGFyZW50LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0KLQkJcGFyZW50LmNsZWFyQWxsQnJhbmNoUHJvYmxlbXMoKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGFyZW50LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUobm9kZS5icmFuY2hQcm9ibGVtcygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZWRCcmFuY2hQcm9ibGVtcygpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldE5hbWUoIkJPR1VTIik7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlwYXJlbnQuc2V0TmFtZSgiQk9HVVMgVE9PIik7Ci0JCXRoaXMucm9vdC5zZXROYW1lKCJCT0dVUyBUT08gVE9PIik7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnJvb3QuYnJhbmNoUHJvYmxlbXMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHBhcmVudC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKG5vZGUuYnJhbmNoUHJvYmxlbXMoKSkpOwotCi0JCS8vIGNvbXBsZXRlbHkgcmVtb3ZlIGEgbm9kZSB0aGF0IGhhcyBwcm9ibGVtcyAtCi0JCS8vIHRoZSBlbnRpcmUgdHJlZSBzaG91bGQgcmVjYWxjdWxhdGUgaXRzICJicmFuY2giIHByb2JsZW1zCi0JCXBhcmVudC5yZW1vdmVUZXN0Q2hpbGQobm9kZSk7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnJvb3QuYnJhbmNoUHJvYmxlbXMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHVibGljIGNsYXNzIFRlc3RXb3JrYmVuY2hNb2RlbCBleHRlbmRzIEFic3RyYWN0Tm9kZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlwcml2YXRlIGludCBzaXplOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0laRV9QUk9QRVJUWSA9ICJzaXplIjsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFRlc3RXb3JrYmVuY2hNb2RlbD4gdGVzdENoaWxkcmVuOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DSElMRFJFTl9DT0xMRUNUSU9OID0gImNoaWxkcmVuIjsKLQkKLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQlwdWJsaWMgVGVzdFdvcmtiZW5jaE1vZGVsKFRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihwYXJlbnQpOwotCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJCXRoaXMuc2l6ZSA9IDA7Ci0JCQl0aGlzLnRlc3RDaGlsZHJlbiA9IG5ldyBIYXNoQmFnPFRlc3RXb3JrYmVuY2hNb2RlbD4oKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNoZWNrUGFyZW50KE5vZGUgcGFyZW50KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkKLQkKLQkJLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkKLQkJcHVibGljIGludCBnZXRTaXplKCkgewotCQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRTaXplKGludCBzaXplKSB7Ci0JCQlpbnQgb2xkID0gdGhpcy5zaXplOwotCQkJdGhpcy5zaXplID0gc2l6ZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSVpFX1BST1BFUlRZLCBvbGQsIHNpemUpOwotCQl9Ci0JCi0JCXB1YmxpYyBJdGVyYXRvcjxUZXN0V29ya2JlbmNoTW9kZWw+IHRlc3RDaGlsZHJlbigpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxUZXN0V29ya2JlbmNoTW9kZWw+KHRoaXMudGVzdENoaWxkcmVuKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFRlc3RXb3JrYmVuY2hNb2RlbCBjdXJyZW50KSB7Ci0JCQkJCVRlc3RXb3JrYmVuY2hNb2RlbC50aGlzLnJlbW92ZVRlc3RDaGlsZChjdXJyZW50KTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXB1YmxpYyBpbnQgdGVzdENoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLnRlc3RDaGlsZHJlbi5zaXplKCk7Ci0JCX0KLQkJcHJpdmF0ZSBUZXN0V29ya2JlbmNoTW9kZWwgYWRkVGVzdENoaWxkKFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0Q2hpbGQpIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbih0ZXN0Q2hpbGQsIHRoaXMudGVzdENoaWxkcmVuLCBURVNUX0NISUxEUkVOX0NPTExFQ1RJT04pOwotCQkJcmV0dXJuIHRlc3RDaGlsZDsKLQkJfQotCQlwdWJsaWMgVGVzdFdvcmtiZW5jaE1vZGVsIGFkZFRlc3RDaGlsZE5hbWVkKFN0cmluZyBjaGlsZE5hbWUpIHsKLQkJCWlmICh0aGlzLnRlc3RDaGlsZE5hbWVkKGNoaWxkTmFtZSkgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY2hpbGROYW1lKTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLmFkZFRlc3RDaGlsZChuZXcgVGVzdFdvcmtiZW5jaE1vZGVsKHRoaXMsIGNoaWxkTmFtZSkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZVRlc3RDaGlsZChUZXN0V29ya2JlbmNoTW9kZWwgdGVzdENoaWxkKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbih0ZXN0Q2hpbGQsIHRoaXMudGVzdENoaWxkcmVuLCBURVNUX0NISUxEUkVOX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0Q2hpbGROYW1lZChTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCQlmb3IgKFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0Q2hpbGQgOiB0aGlzLnRlc3RDaGlsZHJlbikgewotCQkJCWlmICh0ZXN0Q2hpbGQuZ2V0TmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKSB7Ci0JCQkJCXJldHVybiB0ZXN0Q2hpbGQ7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0RGVzY2VuZGFudE5hbWVkKFN0cmluZyBkZXNjZW5kYW50TmFtZSkgewotCQkJZm9yIChUZXN0V29ya2JlbmNoTW9kZWwgdGVzdERlc2NlbmRhbnQgOiB0aGlzLnRlc3RDaGlsZHJlbikgewotCQkJCWlmICh0ZXN0RGVzY2VuZGFudC5nZXROYW1lKCkuZXF1YWxzKGRlc2NlbmRhbnROYW1lKSkgewotCQkJCQlyZXR1cm4gdGVzdERlc2NlbmRhbnQ7Ci0JCQkJfQotCQkJCS8vIHJlY3Vyc2UuLi4KLQkJCQl0ZXN0RGVzY2VuZGFudCA9IHRlc3REZXNjZW5kYW50LnRlc3REZXNjZW5kYW50TmFtZWQoZGVzY2VuZGFudE5hbWUpOwotCQkJCWlmICh0ZXN0RGVzY2VuZGFudCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB0ZXN0RGVzY2VuZGFudDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQotCQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuVG8oTGlzdDxOb2RlPiBjaGlsZHJlbikgewotCQkJc3VwZXIuYWRkQ2hpbGRyZW5UbyhjaGlsZHJlbik7Ci0JCQljaGlsZHJlbi5hZGRBbGwodGhpcy50ZXN0Q2hpbGRyZW4pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCQlzdXBlci5hZGRQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JCQkvLyBuYW1lcyBtdXN0IGJlIGFsbCBsb3dlcmNhc2UuLi4KLQkJCWZvciAoaW50IGkgPSB0aGlzLm5hbWUubGVuZ3RoKCk7IGktLSA+IDA7ICkgewotCQkJCWNoYXIgYyA9IHRoaXMubmFtZS5jaGFyQXQoaSk7Ci0JCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcihjKSAmJiAhIENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjKSkgewotCQkJCQljdXJyZW50UHJvYmxlbXMuYWRkKHRoaXMuYnVpbGRQcm9ibGVtKCJOQU1FX01VU1RfQkVfTE9XRVJDQVNFIiwgdGhpcy5uYW1lKSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFJvb3RUZXN0V29ya2JlbmNoTW9kZWwgZXh0ZW5kcyBUZXN0V29ya2JlbmNoTW9kZWwgewotCQlwdWJsaWMgUm9vdFRlc3RXb3JrYmVuY2hNb2RlbChTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIobnVsbCwgbmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQkJcmV0dXJuIE5vZGUuTlVMTF9WQUxJREFUT1I7Ci0JCX0KLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9ub2RlL0pwdFV0aWxpdHlOb2RlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9KcHRVdGlsaXR5Tm9kZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZjY4MmQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9ub2RlL0pwdFV0aWxpdHlOb2RlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5Tm9kZVRlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU5vZGVUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFic3RyYWN0Tm9kZVRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlOb2RlVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0FzeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvQXN5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwODE0YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvQXN5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbXBvc2l0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db25zdW1lclRocmVhZENvb3JkaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzLkFzeW5jaHJvbm91c1N5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5NdWx0aVRocmVhZGVkVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFzeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzCi0JZXh0ZW5kcyBNdWx0aVRocmVhZGVkVGVzdENhc2UKLXsKLQlQcmltYXJ5TW9kZWwxIHByaW1hcnlNb2RlbDE7Ci0JU2Vjb25kYXJ5TW9kZWwxIHNlY29uZGFyeU1vZGVsMTsKLQlDb21tYW5kIGNvbW1hbmQxOwotCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIxOwotCi0JUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwyOwotCVNlY29uZGFyeU1vZGVsMiBzZWNvbmRhcnlNb2RlbDI7Ci0JQ29tbWFuZCBjb21tYW5kMjsKLQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyMjsKLQotCXB1YmxpYyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEgPSBuZXcgUHJpbWFyeU1vZGVsMSgpOwotCQl0aGlzLnNlY29uZGFyeU1vZGVsMSA9IG5ldyBTZWNvbmRhcnlNb2RlbDEodGhpcy5wcmltYXJ5TW9kZWwxKTsKLQkJdGhpcy5jb21tYW5kMSA9IG5ldyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDEodGhpcy5zZWNvbmRhcnlNb2RlbDEpOwotCQl0aGlzLnN5bmNocm9uaXplcjEgPSBuZXcgQXN5bmNocm9ub3VzU3luY2hyb25pemVyKHRoaXMuY29tbWFuZDEsIHRoaXMuYnVpbGRUaHJlYWRGYWN0b3J5KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0U3luY2hyb25pemVyKHRoaXMuc3luY2hyb25pemVyMSk7Ci0KLQkJdGhpcy5wcmltYXJ5TW9kZWwyID0gbmV3IFByaW1hcnlNb2RlbDIoKTsKLQkJdGhpcy5zZWNvbmRhcnlNb2RlbDIgPSBuZXcgU2Vjb25kYXJ5TW9kZWwyKHRoaXMucHJpbWFyeU1vZGVsMik7Ci0JCXRoaXMuY29tbWFuZDIgPSBuZXcgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQyKHRoaXMucHJpbWFyeU1vZGVsMiwgdGhpcy5zZWNvbmRhcnlNb2RlbDIpOwotCQl0aGlzLnN5bmNocm9uaXplcjIgPSBuZXcgQXN5bmNocm9ub3VzU3luY2hyb25pemVyKHRoaXMuY29tbWFuZDIsIHRoaXMuYnVpbGRUaHJlYWRGYWN0b3J5KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDIuc2V0U3luY2hyb25pemVyKHRoaXMuc3luY2hyb25pemVyMik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zeW5jaHJvbml6ZXIxLnN0b3AoKTsKLQkJdGhpcy5zeW5jaHJvbml6ZXIyLnN0b3AoKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6YXRpb24oKSB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5zeW5jaHJvbml6ZXIxLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhpcy5zeW5jaHJvbml6ZXIxLnN0b3AoKTsKLQkJdGhpcy5zbGVlcChUSUNLKTsKLQotCQlhc3NlcnRFcXVhbHMoMTQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCi0JCS8vIHJlLXN0YXJ0IHNvIHRlYXItZG93biB3b3JrcwotCQl0aGlzLnN5bmNocm9uaXplcjEuc3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0U3luY2hyb25pemVyKFN5bmNocm9uaXplci5OdWxsLmluc3RhbmNlKCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldFN5bmNocm9uaXplcih0aGlzLnN5bmNocm9uaXplcjEpOwotCQkvLyB0aGUgYXN5bmMgc3luY2hyb25pemVyIGRvZXMgbm90IHN5bmNocm9uaXplIGF0IHN0YXJ0LXVwCi0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoOCk7Ci0KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhpcy5zeW5jaHJvbml6ZXIxLnN0b3AoKTsKLQkJdGhpcy5zbGVlcChUSUNLKTsKLQotCQlhc3NlcnRFcXVhbHMoMTYsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCi0JCS8vIHJlLXN0YXJ0IHNvIHRlYXItZG93biB3b3JrcwotCQl0aGlzLnN5bmNocm9uaXplcjEuc3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RvcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5kaXNwb3NlKCk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCi0JCS8vIHJlLXN0YXJ0IHNvIHRlYXItZG93biB3b3JrcwotCQl0aGlzLnN5bmNocm9uaXplcjEuc3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlU3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbDEuc3RhcnRTeW5jaHJvbml6ZXIoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aGlzLnN5bmNocm9uaXplcjEuc3RvcCgpOwotCQl0aGlzLnNsZWVwKFRJQ0spOwotCi0JCWFzc2VydEVxdWFscygxNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0KLQkJLy8gcmUtc3RhcnQgc28gdGVhci1kb3duIHdvcmtzCi0JCXRoaXMuc3luY2hyb25pemVyMS5zdGFydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGVTdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLmRpc3Bvc2UoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5wcmltYXJ5TW9kZWwxLmRpc3Bvc2UoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCi0JCS8vIHJlLXN0YXJ0IHNvIHRlYXItZG93biB3b3JrcwotCQl0aGlzLnN5bmNocm9uaXplcjEuc3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVjdXJzaXZlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMi5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwyLnNldENvdW50KDcpOwotCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCWFzc2VydEVxdWFscygxMCwgdGhpcy5wcmltYXJ5TW9kZWwyLmdldENvdW50UGx1czMoKSk7Ci0JCWFzc2VydEVxdWFscygxNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDIuZ2V0RG91YmxlQ291bnQoKSk7Ci0KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCB0aGlzLnNlY29uZGFyeU1vZGVsMi5nZXREb3VibGVDb3VudFBsdXMzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQ29tbWFuZCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3luY2hyb25pemVyIHMgPSBuZXcgQXN5bmNocm9ub3VzU3luY2hyb25pemVyKG51bGwsIHRoaXMuYnVpbGRUaHJlYWRGYWN0b3J5KCkpOwotCQkJZmFpbCgiYm9ndXM6ICIgKyBzKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGhyZWFkTmFtZSgpIHsKLQkJU3luY2hyb25pemVyIHMgPSBuZXcgQXN5bmNocm9ub3VzU3luY2hyb25pemVyKHRoaXMuY29tbWFuZDEsIHRoaXMuYnVpbGRUaHJlYWRGYWN0b3J5KCksICJzeW5jIik7Ci0JCXMuc3RhcnQoKTsKLQkJQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvciBjdGMgPSAoQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcikgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUocywgImNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IiKTsKLQkJVGhyZWFkIHQgPSAoVGhyZWFkKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShjdGMsICJ0aHJlYWQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJzeW5jIiwgdC5nZXROYW1lKCkpOwotCQlzLnN0b3AoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVDYWxsZWRCZWZvcmVTdGFydCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVDb21tYW5kIGNvbW1hbmQgPSBuZXcgU2ltcGxlQ29tbWFuZCgpOwotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gbmV3IEFzeW5jaHJvbm91c1N5bmNocm9uaXplcihjb21tYW5kLCB0aGlzLmJ1aWxkVGhyZWFkRmFjdG9yeSgpKTsKLQotCQlzeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKTsKLQkJc3luY2hyb25pemVyLnN0YXJ0KCk7Ci0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXN5bmNocm9uaXplci5zdG9wKCk7Ci0JCWFzc2VydEVxdWFscygxLCBjb21tYW5kLmNvdW50KTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgU2ltcGxlQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlpbnQgY291bnQgPSAwOwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5jb3VudCsrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCb2d1c0NvbW1hbmQgY29tbWFuZCA9IG5ldyBCb2d1c0NvbW1hbmQoKTsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IG5ldyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIoY29tbWFuZCwgdGhpcy5idWlsZFRocmVhZEZhY3RvcnkoKSk7Ci0JCXN5bmNocm9uaXplci5zdGFydCgpOwotCi0JCXN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOwotCQl0aGlzLnNsZWVwKFRJQ0spOwotCi0JCXN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOwotCQl0aGlzLnNsZWVwKFRJQ0spOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplci5zdG9wKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKENvbXBvc2l0ZUV4Y2VwdGlvbiBleCkgewotCQkJYXNzZXJ0RXF1YWxzKDIsIGV4LmdldEV4Y2VwdGlvbnMoKS5sZW5ndGgpOwotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQlhc3NlcnRFcXVhbHMoMiwgY29tbWFuZC5jb3VudCk7Ci0JfQotCi0JcHVibGljIGNsYXNzIEJvZ3VzQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlpbnQgY291bnQgPSAwOwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5jb3VudCsrOwotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUgY29tbWFuZHMgKioqKioqKioqKgotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQxIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JCXByaXZhdGUgZmluYWwgU2Vjb25kYXJ5TW9kZWwxIHNlY29uZGFyeU1vZGVsOwotCi0JCXB1YmxpYyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDEoU2Vjb25kYXJ5TW9kZWwxIHNlY29uZGFyeU1vZGVsKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zZWNvbmRhcnlNb2RlbCA9IHNlY29uZGFyeU1vZGVsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuc2Vjb25kYXJ5TW9kZWwuc3luY2hyb25pemUoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogdGhlIHByaW1hcnkgbW9kZWwgKHN1YmNsYXNzKSBoYXMgdG8gc3luY2hyb25pemUgd2l0aCBpdHNlbGYgKHN1cGVyY2xhc3MpCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIgZXh0ZW5kcyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDEgewotCQlwcml2YXRlIGZpbmFsIFByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsOwotCi0JCXB1YmxpYyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIoUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwsIFNlY29uZGFyeU1vZGVsMiBzZWNvbmRhcnlNb2RlbCkgewotCQkJc3VwZXIoc2Vjb25kYXJ5TW9kZWwpOwotCQkJdGhpcy5wcmltYXJ5TW9kZWwgPSBwcmltYXJ5TW9kZWw7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXN1cGVyLmV4ZWN1dGUoKTsKLQkJCXRoaXMucHJpbWFyeU1vZGVsLnN5bmNocm9uaXplKCk7Ci0JCX0KLQotCX0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBtb2RlbHMgKioqKioqKioqKgotCS8qKgotCSAqIHRoaXMgb2JqZWN0IHdpbGwgY2FsbCB0aGUgc3luY2hyb25pemVyIHdoZW5ldmVyIGl0cyBjb3VudCBjaGFuZ2VzLAotCSAqIGFsbG93aW5nIGludGVyZXN0ZWQgcGFydGllcyB0byBzeW5jaHJvbml6ZSB3aXRoIHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByaW1hcnlNb2RlbDEgewotCQlwcm90ZWN0ZWQgU3luY2hyb25pemVyIHN5bmNocm9uaXplcjsKLQkJcHJvdGVjdGVkIGludCBjb3VudCA9IDI7Ci0KLQkJcHVibGljIFByaW1hcnlNb2RlbDEoKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zZXRTeW5jaHJvbml6ZXJfKFN5bmNocm9uaXplci5OdWxsLmluc3RhbmNlKCkpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmNvdW50OwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldENvdW50KGludCBjb3VudCkgewotCQkJaWYgKGNvdW50ICE9IHRoaXMuY291bnQpIHsKLQkJCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCQkJdGhpcy5zdGF0ZUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHN0YXRlQ2hhbmdlZCgpIHsKLQkJCXRoaXMuc3luY2hyb25pemVyLnN5bmNocm9uaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6ZXIoU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQkJaWYgKHN5bmNocm9uaXplciA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnN5bmNocm9uaXplci5zdG9wKCk7Ci0JCQl0aGlzLnNldFN5bmNocm9uaXplcl8oc3luY2hyb25pemVyKTsKLQkJfQotCQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFN5bmNocm9uaXplcl8oU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQkJdGhpcy5zeW5jaHJvbml6ZXIgPSBzeW5jaHJvbml6ZXI7Ci0JCQl0aGlzLnN5bmNocm9uaXplci5zdGFydCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhcnRTeW5jaHJvbml6ZXIoKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplci5zdGFydCgpOyAgLy8gdGhpcyBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uCi0JCX0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCXRoaXMuc3luY2hyb25pemVyLnN0b3AoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQlzYi5hcHBlbmQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQlzYi5hcHBlbmQoJygnKTsKLQkJCXRoaXMudG9TdHJpbmcoc2IpOwotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQoImNvdW50PSIpOwotCQkJc2IuYXBwZW5kKHRoaXMuY291bnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1vZGVsIHN5bmNocm9uaXplcyB3aXRoIGl0c2VsZiwgdHJpZ2dlcmluZyBhIHJlY3Vyc2l2ZSBzeW5jaHJvbml6YXRpb24KLQkgKiB3aXRoIHRoZSBjaGFuZ2UuIFdoZW5ldmVyIHRoZSBbaW5oZXJpdGVkXSAnY291bnQnIGNoYW5nZXMsICdjb3VudFBsdXMzJwotCSAqIGlzIHVwZGF0ZWQgYXBwcm9wcmlhdGVseSBhbmQgYW5vdGhlciBzeW5jaHJvbml6ZSBpcyBpbml0aWF0ZWQgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQcmltYXJ5TW9kZWwyIGV4dGVuZHMgUHJpbWFyeU1vZGVsMSB7Ci0JCXByaXZhdGUgaW50IGNvdW50UGx1czMgPSAwOwotCi0JCXB1YmxpYyBQcmltYXJ5TW9kZWwyKCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY291bnRQbHVzMyA9IHRoaXMuY291bnQgKyAzOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3VudFBsdXMzKCkgewotCQkJcmV0dXJuIHRoaXMuY291bnRQbHVzMzsKLQkJfQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRDb3VudFBsdXMzKGludCBjb3VudFBsdXMzKSB7Ci0JCQlpZiAoY291bnRQbHVzMyAhPSB0aGlzLmNvdW50UGx1czMpIHsKLQkJCQl0aGlzLmNvdW50UGx1czMgPSBjb3VudFBsdXMzOwotCQkJCXRoaXMuc3RhdGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzeW5jaHJvbml6ZSB3aXRoIGl0c2VsZiwgc28gdG8gc3BlYWsKLQkJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQl0aGlzLnNldENvdW50UGx1czModGhpcy5jb3VudCArIDMpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJCXNiLmFwcGVuZCgiLCBjb3VudFBsdXMzPSIpOwotCQkJc2IuYXBwZW5kKHRoaXMuY291bnRQbHVzMyk7Ci0JCX0KLQotCX0KLQotCS8vICoqKioqKioqKiogc2Vjb25kYXJ5IG1vZGVscyAqKioqKioqKioqCi0JLyoqCi0JICogVGhpcyBkZXBlbmRlbnQgb2JqZWN0IHVwZGF0ZXMgaXRzICdkb3VibGVDb3VudCcgd2hlbmV2ZXIgdGhlCi0JICogUHJpbWFyeU1vZGVsMSdzICdjb3VudCcgY2hhbmdlcywgdmlhIHRoZSAnc3luY2hyb25pemVyJy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNlY29uZGFyeU1vZGVsMSB7Ci0JCXByb3RlY3RlZCBmaW5hbCBQcmltYXJ5TW9kZWwxIHByaW1hcnlNb2RlbDsKLQkJcHJvdGVjdGVkIGludCBkb3VibGVDb3VudCA9IDA7Ci0KLQkJcHVibGljIFNlY29uZGFyeU1vZGVsMShQcmltYXJ5TW9kZWwxIHByaW1hcnlNb2RlbCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucHJpbWFyeU1vZGVsID0gcHJpbWFyeU1vZGVsOwotCQkJdGhpcy5zeW5jaHJvbml6ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQl0aGlzLmRvdWJsZUNvdW50ID0gdGhpcy5wcmltYXJ5TW9kZWwuZ2V0Q291bnQoKSAqIDI7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldERvdWJsZUNvdW50KCkgewotCQkJcmV0dXJuIHRoaXMuZG91YmxlQ291bnQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJc2IuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQkJc2IuYXBwZW5kKCcoJyk7Ci0JCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJCXNiLmFwcGVuZCgnKScpOwotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKCJkb3VibGVDb3VudD0iKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmRvdWJsZUNvdW50KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWNvbmRhcnlNb2RlbDIgZXh0ZW5kcyBTZWNvbmRhcnlNb2RlbDEgewotCQlwcml2YXRlIGludCBkb3VibGVDb3VudFBsdXMzID0gMDsKLQotCQlwdWJsaWMgU2Vjb25kYXJ5TW9kZWwyKFByaW1hcnlNb2RlbDIgZXh0ZW5kZWRQcmltYXJ5TW9kZWwpIHsKLQkJCXN1cGVyKGV4dGVuZGVkUHJpbWFyeU1vZGVsKTsKLQkJfQotCi0JCXByb3RlY3RlZCBQcmltYXJ5TW9kZWwyIGdldEV4dGVuZGVkUHJpbWFyeU1vZGVsKCkgewotCQkJcmV0dXJuIChQcmltYXJ5TW9kZWwyKSB0aGlzLnByaW1hcnlNb2RlbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJCXN1cGVyLnN5bmNocm9uaXplKCk7Ci0JCQlpbnQgdGVtcCA9IHRoaXMuZ2V0RXh0ZW5kZWRQcmltYXJ5TW9kZWwoKS5nZXRDb3VudFBsdXMzKCkgKiAyOwotCQkJaWYgKHRoaXMuZG91YmxlQ291bnRQbHVzMyAhPSB0ZW1wKSB7Ci0JCQkJdGhpcy5kb3VibGVDb3VudFBsdXMzID0gdGVtcDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RG91YmxlQ291bnRQbHVzMygpIHsKLQkJCXJldHVybiB0aGlzLmRvdWJsZUNvdW50UGx1czM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQkJc2IuYXBwZW5kKCIsIGRvdWJsZUNvdW50UGx1czM9Iik7Ci0JCQlzYi5hcHBlbmQodGhpcy5kb3VibGVDb3VudFBsdXMzKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvSnB0VXRpbGl0eVN5bmNocm9uaXplcnNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0pwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3ODY5ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvSnB0VXRpbGl0eVN5bmNocm9uaXplcnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5U3luY2hyb25pemVyc1Rlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5U3luY2hyb25pemVyc1Rlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBc3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbml6ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzLmNsYXNzKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVdGlsaXR5U3luY2hyb25pemVyc1Rlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbml6ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9uaXplclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZDlkNTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9uaXplclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplcjsKLQotcHVibGljIGNsYXNzIFN5bmNocm9uaXplclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFN5bmNocm9uaXplclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3luY2hyb25pemVyU3RhcnQoKSB7Ci0JCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSBTeW5jaHJvbml6ZXIuTnVsbC5pbnN0YW5jZSgpOwotCQlzeW5jaHJvbml6ZXIuc3RhcnQoKTsgIC8vIGp1c3QgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYmxvdyB1cD8KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN5bmNocm9uaXplclN5bmNocm9uaXplKCkgewotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKTsKLQkJc3luY2hyb25pemVyLnN5bmNocm9uaXplKCk7ICAvLyBqdXN0IG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGJsb3cgdXA/Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxTeW5jaHJvbml6ZXJTdG9wKCkgewotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKTsKLQkJc3luY2hyb25pemVyLnN0b3AoKTsgIC8vIGp1c3QgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYmxvdyB1cD8KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN5bmNocm9uaXplclRvU3RyaW5nKCkgewotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChzeW5jaHJvbml6ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvU3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNlZWEyYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvU3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuc3luY2hyb25pemVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29tcG9zaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEJvb2xlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5TeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5TeW5jaHJvbm91c1N5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5NdWx0aVRocmVhZGVkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzCi0JZXh0ZW5kcyBNdWx0aVRocmVhZGVkVGVzdENhc2UKLXsKLQlQcmltYXJ5TW9kZWwxIHByaW1hcnlNb2RlbDE7Ci0JU2Vjb25kYXJ5TW9kZWwxIHNlY29uZGFyeU1vZGVsMTsKLQlDb21tYW5kIGNvbW1hbmQxOwotCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIxOwotCi0JUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwyOwotCVNlY29uZGFyeU1vZGVsMiBzZWNvbmRhcnlNb2RlbDI7Ci0JQ29tbWFuZCBjb21tYW5kMjsKLQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyMjsKLQotCXB1YmxpYyBTeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMSA9IG5ldyBQcmltYXJ5TW9kZWwxKCk7Ci0JCXRoaXMuc2Vjb25kYXJ5TW9kZWwxID0gbmV3IFNlY29uZGFyeU1vZGVsMSh0aGlzLnByaW1hcnlNb2RlbDEpOwotCQl0aGlzLmNvbW1hbmQxID0gbmV3IFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMSh0aGlzLnNlY29uZGFyeU1vZGVsMSk7Ci0JCXRoaXMuc3luY2hyb25pemVyMSA9IG5ldyBTeW5jaHJvbm91c1N5bmNocm9uaXplcih0aGlzLmNvbW1hbmQxKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldFN5bmNocm9uaXplcih0aGlzLnN5bmNocm9uaXplcjEpOwotCi0JCXRoaXMucHJpbWFyeU1vZGVsMiA9IG5ldyBQcmltYXJ5TW9kZWwyKCk7Ci0JCXRoaXMuc2Vjb25kYXJ5TW9kZWwyID0gbmV3IFNlY29uZGFyeU1vZGVsMih0aGlzLnByaW1hcnlNb2RlbDIpOwotCQl0aGlzLmNvbW1hbmQyID0gbmV3IFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMih0aGlzLnByaW1hcnlNb2RlbDIsIHRoaXMuc2Vjb25kYXJ5TW9kZWwyKTsKLQkJdGhpcy5zeW5jaHJvbml6ZXIyID0gbmV3IFN5bmNocm9ub3VzU3luY2hyb25pemVyKHRoaXMuY29tbWFuZDIpOwotCQl0aGlzLnByaW1hcnlNb2RlbDIuc2V0U3luY2hyb25pemVyKHRoaXMuc3luY2hyb25pemVyMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uKCkgewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuc3luY2hyb25pemVyMS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlKCkgewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQkJYXNzZXJ0RXF1YWxzKDE0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhcnQoKSB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldFN5bmNocm9uaXplcihTeW5jaHJvbml6ZXIuTnVsbC5pbnN0YW5jZSgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDcpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRTeW5jaHJvbml6ZXIodGhpcy5zeW5jaHJvbml6ZXIxKTsKLQkJYXNzZXJ0RXF1YWxzKDE0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RvcCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuZGlzcG9zZSgpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlU3RhcnQoKSB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5wcmltYXJ5TW9kZWwxLnN0YXJ0U3luY2hyb25pemVyKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscygxNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERvdWJsZVN0b3AoKSB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLmRpc3Bvc2UoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5wcmltYXJ5TW9kZWwxLmRpc3Bvc2UoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmVDaGFuZ2UoKSB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMi5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwyLnNldENvdW50KDcpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHRoaXMucHJpbWFyeU1vZGVsMi5nZXRDb3VudFBsdXMzKCkpOwotCQlhc3NlcnRFcXVhbHMoMTQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwyLmdldERvdWJsZUNvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMjAsIHRoaXMuc2Vjb25kYXJ5TW9kZWwyLmdldERvdWJsZUNvdW50UGx1czMoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbCAjc3RvcCgpIGZyb20gYW5vdGhlciB0aHJlYWQuCi0JICogVmVyaWZ5IHRoYXQgbm8gZnVydGhlciBzeW5jaHJvbml6YXRpb25zIG9jY3VyLgotCSAqIFZlcmlmeSB0aGUgY2FsbCB0byAjc3RvcCgpIGRvZXMgbm90IHJldHVybiB1bnRpbCB0aGUgcGVuZGluZwotCSAqIHN5bmNocm9uaXphdGlvbiBpcyBjb21wbGV0ZSAobXVzdCBzZXQge0BsaW5rICNERUJVR30gdG8gdHJ1ZSBhbmQKLQkgKiBsb29rIGF0IHRoZSBjb25zb2xlKS4KLQkgKiAKLQkgKiB0aWNrczoKLQkgKiAwIC0gc3RhcnQgInN5bmMiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMSB0aWNrKTsKLQkgKiAgICAgIHN0YXJ0ICJzdG9wIiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDIgdGlja3MpCi0JICogMSAtICJzeW5jIiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFByaW1hcnlNb2RlbDEuc2V0Q291bnQoaW50KQotCSAqICAgICAgd2hpY2ggdHJpZ2dlcnMgY2FsbCB0byBTeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKSB0byBiZWdpbgotCSAqICAgICAgc3luY2hyb25pemF0aW9uIG9mIFNlY29uZGFyeU1vZGVsICh3aGljaCB3aWxsIHJ1biBmb3IgMiB0aWNrczsKLQkgKiAgICAgIGkuZS4gaXQgd2lsbCBmaW5pc2ggb24gdGljayAzKQotCSAqIDIgLSAic3RvcCIgdGhyZWFkIHdha2VzIHVwIGFuZCBjYWxscyBTeW5jaHJvbml6ZXIuc3RvcCgpIGFuZCBzaG91bGQKLQkgKiAgICAgIHdhaXQgdW50aWwgc3luY2hyb25pemF0aW9uIGlzIGNvbXBsZXRlCi0JICogMyAtIHN5bmNocm9uaXphdGlvbiBjb21wbGV0ZXMgZmlyc3QgZXhlY3V0aW9uIGFuZCBzaG91bGQgc3RvcDsKLQkgKiAgICAgICJzdG9wIiB0aHJlYWQgc2hvdWxkIHJ1biB0byBjb21wbGV0aW9uIG9uY2UgdGhlIHN5bmNocm9uaXphdGlvbiBoYXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDYWxsU3RvcEZyb21Bbm90aGVyVGhyZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvZygiPT09PT0iICsgdGhpcy5nZXROYW1lKCkgKyAiPT09PT0iKTsKLQkJUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwzID0gbmV3IFByaW1hcnlNb2RlbDIoKTsKLQkJLy8gYSBzeW5jaHJvbml6ZSB3aWxsIG9jY3VyIGhlcmU6Ci0JCVNlY29uZGFyeU1vZGVsMyBzZWNvbmRhcnlNb2RlbDMgPSBuZXcgU2Vjb25kYXJ5TW9kZWwzKHByaW1hcnlNb2RlbDMpOwotCQlDb21tYW5kIGNvbW1hbmQzID0gbmV3IFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMihwcmltYXJ5TW9kZWwzLCBzZWNvbmRhcnlNb2RlbDMpOwotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyMyA9IG5ldyBTeW5jaHJvbm91c1N5bmNocm9uaXplcihjb21tYW5kMyk7Ci0JCS8vIGFub3RoZXIgc3luY2hyb25pemUgd2lsbCBvY2N1ciBoZXJlOgotCQlwcmltYXJ5TW9kZWwzLnNldFN5bmNocm9uaXplcihzeW5jaHJvbml6ZXIzKTsKLQkJc2Vjb25kYXJ5TW9kZWwzLnNldFRpY2tzKDIpOwotCi0JCWFzc2VydEVxdWFscygyLCBwcmltYXJ5TW9kZWwzLmdldENvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudFBsdXMzKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudFBsdXMzKCkpOwotCi0JCVRocmVhZCBzeW5jVGhyZWFkID0gdGhpcy5idWlsZFRyaWdnZXJTeW5jaHJvbml6ZVRocmVhZChwcmltYXJ5TW9kZWwzLCAxKTsKLQkJVGhyZWFkIHN0b3BUaHJlYWQgPSB0aGlzLmJ1aWxkU3RvcFRocmVhZChzeW5jaHJvbml6ZXIzLCAyKTsKLQotCQlsb2coIkFMTCB0aHJlYWRzIHN0YXJ0Iik7Ci0JCXN0b3BUaHJlYWQuc3RhcnQoKTsKLQkJc3luY1RocmVhZC5zdGFydCgpOwotCi0JCXN0b3BUaHJlYWQuam9pbigpOwotCQlzeW5jVGhyZWFkLmpvaW4oKTsKLQotCQkvLyAnZG91YmxlQ291bnQnIGlzIHN5bmNocm9uaXplZDsgYnV0IHRoZSBzeW5jaHJvbml6YXRpb24gaXMgc3RvcHBlZAotCQkvLyB3aGlsZSB0aGF0IGlzIGhhcHBlbmluZyAoYnkgdGhlICdzdG9wVGhyZWFkJyksIHNvICdkb3VibGVDb3VudFBsdXMzJwotCQkvLyBkb2VzIG5vdCBnZXQgc3luY2hyb25pemVkCi0JCWFzc2VydEVxdWFscyg3LCBwcmltYXJ5TW9kZWwzLmdldENvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnRQbHVzMygpKTsKLQkJYXNzZXJ0RXF1YWxzKDE0LCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnQoKSk7Ci0KLQkJLy8gdGhpcyBkb2VzIG5vdCBnZXQgdXBkYXRlZCBiZWNhdXNlIGl0IHdvdWxkJ3ZlIGJlZW4gdXBkYXRlZCBieSB0aGUKLQkJLy8gcmVjdXJzaXZlIGNhbGwgdG8gI3N5bmNocm9uaXplKCksIGJ1dCBieSB0aGF0IHRpbWUgI3N0b3AoKSBoYWQgYmVlbiBjYWxsZWQKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnRQbHVzMygpKTsKLQl9Ci0KLQlwcml2YXRlIFRocmVhZCBidWlsZFRyaWdnZXJTeW5jaHJvbml6ZVRocmVhZChQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbCwgbG9uZyB0aWNrcykgewotCQlyZXR1cm4gdGhpcy5idWlsZFRocmVhZCh0aGlzLmJ1aWxkVHJpZ2dlclN5bmNocm9uaXplUnVubmFibGUocHJpbWFyeU1vZGVsLCB0aWNrcyksICJ0cmlnZ2VyIHN5bmMiKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkVHJpZ2dlclN5bmNocm9uaXplUnVubmFibGUoZmluYWwgUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwsIGZpbmFsIGxvbmcgdGlja3MpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXN0VG9vbHMuc2xlZXAodGlja3MgKiBUSUNLKTsKLQkJCQlwcmltYXJ5TW9kZWwuc2V0Q291bnQoNyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUaHJlYWQgYnVpbGRTdG9wVGhyZWFkKFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIsIGxvbmcgdGlja3MpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUaHJlYWQodGhpcy5idWlsZFN0b3BSdW5uYWJsZShzeW5jaHJvbml6ZXIsIHRpY2tzKSwgInN0b3AiKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkU3RvcFJ1bm5hYmxlKGZpbmFsIFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIsIGZpbmFsIGxvbmcgdGlja3MpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXN0VG9vbHMuc2xlZXAodGlja3MgKiBUSUNLKTsKLQkJCQlsb2coIlNUT1AgdGhyZWFkIFN5bmNocm9uaXplci5zdG9wKCkiKTsKLQkJCQlzeW5jaHJvbml6ZXIuc3RvcCgpOwotCQkJCWxvZygiU1RPUCB0aHJlYWQgc3RvcCIpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENvZGUgY2xvbmVkIGZyb20ge0BsaW5rICN0ZXN0U3RvcENhbGxlZEZyb21Bbm90aGVyVGhyZWFkKCl9LgotCSAqIAotCSAqIEludGVycnVwdCB0aGUgInN0b3AiIHRocmVhZCB3aGlsZSBpdCBpcyB3YWl0aW5nIGZvciB0aGUgInN5bmNoIiB0aHJlYWQgdG8gZmluaXNoLgotCSAqIFZlcmlmeSB0aGF0IG5vIGZ1cnRoZXIgc3luY2hyb25pemF0aW9ucyBvY2N1ci4KLQkgKiBWZXJpZnkgdGhlIGNhbGwgdG8gI3N0b3AoKSByZXR1cm5zICpiZWZvcmUqCi0JICogc3luY2hyb25pemF0aW9uIGlzIGNvbXBsZXRlIChtdXN0IHNldCB7QGxpbmsgI0RFQlVHfSB0byB0cnVlIGFuZAotCSAqIGxvb2sgYXQgdGhlIGNvbnNvbGUpLgotCSAqIAotCSAqIHRpY2tzOgotCSAqIDAgLSBzdGFydCAic3luYyIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAxIHRpY2spOwotCSAqICAgICAgc3RhcnQgInN0b3AiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMiB0aWNrcyk7Ci0JICogICAgICBzdGFydCAiaW50ZXJydXB0IiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDMgdGlja3MpCi0JICogMSAtICJzeW5jIiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFByaW1hcnlNb2RlbDEuc2V0Q291bnQoaW50KQotCSAqICAgICAgd2hpY2ggdHJpZ2dlcnMgY2FsbCB0byBTeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKSB0byBiZWdpbgotCSAqICAgICAgc3luY2hyb25pemF0aW9uIG9mIFNlY29uZGFyeU1vZGVsICh3aGljaCB3aWxsIHJ1biBmb3IgMyB0aWNrczsKLQkgKiAgICAgIGkuZS4gaXQgd2lsbCBmaW5pc2ggb24gdGljayA0KQotCSAqIDIgLSAic3RvcCIgdGhyZWFkIHdha2VzIHVwIGFuZCBjYWxscyBTeW5jaHJvbml6ZXIuc3RvcCgpIGFuZCBzaG91bGQKLQkgKiAgICAgIHdhaXQgdW50aWwgaXQgaXMgaW50ZXJydXB0ZWQKLQkgKiAzIC0gImludGVycnVwdCIgdGhyZWFkIHdha2VzIHVwIGFuZCBpbnRlcnJ1cHRzICJzdG9wIiB0aHJlYWQ7Ci0JICogICAgICAgYm90aCB3aWxsIHJ1biB0byBjb21wbGV0aW9uIGF0IHRoYXQgcG9pbnQKLQkgKiA0IC0gc3luY2hyb25pemF0aW9uIGNvbXBsZXRlcyBmaXJzdCBleGVjdXRpb24gYW5kIHNob3VsZCBzdG9wIHNpbmNlIHRoZQotCSAqICAgICAgInN0b3AiIHRocmVhZCwgYmVmb3JlIGl0IHdhcyBpbnRlcnJ1cHRlZCwgdG9sZCB0aGUgInN5bmNoIiB0aHJlYWQgdG8gc3RvcAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHRTdG9wVGhyZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvZygiPT09PT0iICsgdGhpcy5nZXROYW1lKCkgKyAiPT09PT0iKTsKLQkJUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwzID0gbmV3IFByaW1hcnlNb2RlbDIoKTsKLQkJLy8gYSBzeW5jaHJvbml6ZSB3aWxsIG9jY3VyIGhlcmU6Ci0JCVNlY29uZGFyeU1vZGVsMyBzZWNvbmRhcnlNb2RlbDMgPSBuZXcgU2Vjb25kYXJ5TW9kZWwzKHByaW1hcnlNb2RlbDMpOwotCQlDb21tYW5kIGNvbW1hbmQzID0gbmV3IFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMihwcmltYXJ5TW9kZWwzLCBzZWNvbmRhcnlNb2RlbDMpOwotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyMyA9IG5ldyBTeW5jaHJvbm91c1N5bmNocm9uaXplcihjb21tYW5kMyk7Ci0JCS8vIGFub3RoZXIgc3luY2hyb25pemUgd2lsbCBvY2N1ciBoZXJlOgotCQlwcmltYXJ5TW9kZWwzLnNldFN5bmNocm9uaXplcihzeW5jaHJvbml6ZXIzKTsKLQkJc2Vjb25kYXJ5TW9kZWwzLnNldFRpY2tzKDMpOwotCi0JCWFzc2VydEVxdWFscygyLCBwcmltYXJ5TW9kZWwzLmdldENvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudFBsdXMzKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudFBsdXMzKCkpOwotCi0JCVRocmVhZCBzeW5jVGhyZWFkID0gdGhpcy5idWlsZFRyaWdnZXJTeW5jaHJvbml6ZVRocmVhZChwcmltYXJ5TW9kZWwzLCAxKTsKLQkJVGhyZWFkIHN0b3BUaHJlYWQgPSB0aGlzLmJ1aWxkU3RvcFRocmVhZChzeW5jaHJvbml6ZXIzLCAyKTsKLQkJVGhyZWFkIGludGVycnVwdFRocmVhZCA9IHRoaXMuYnVpbGRJbnRlcnJ1cHRUaHJlYWQoc3RvcFRocmVhZCwgMyk7Ci0KLQkJbG9nKCJBTEwgdGhyZWFkcyBzdGFydCIpOwotCQlzdG9wVGhyZWFkLnN0YXJ0KCk7Ci0JCXN5bmNUaHJlYWQuc3RhcnQoKTsKLQkJaW50ZXJydXB0VGhyZWFkLnN0YXJ0KCk7Ci0KLQkJc3RvcFRocmVhZC5qb2luKCk7Ci0JCXN5bmNUaHJlYWQuam9pbigpOwotCQlpbnRlcnJ1cHRUaHJlYWQuam9pbigpOwotCi0JCS8vICdkb3VibGVDb3VudCcgaXMgc3luY2hyb25pemVkOyBidXQgdGhlIHN5bmNocm9uaXphdGlvbiBpcyBzdG9wcGVkCi0JCS8vIHdoaWxlIHRoYXQgaXMgaGFwcGVuaW5nIChieSB0aGUgJ3N0b3BUaHJlYWQnKSwgc28gJ2RvdWJsZUNvdW50UGx1czMnCi0JCS8vIGRvZXMgbm90IGdldCBzeW5jaHJvbml6ZWQKLQkJYXNzZXJ0RXF1YWxzKDcsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnQoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudFBsdXMzKCkpOwotCQlhc3NlcnRFcXVhbHMoMTQsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudCgpKTsKLQotCQkvLyB0aGlzIGRvZXMgbm90IGdldCB1cGRhdGVkIGJlY2F1c2UgaXQgd291bGQndmUgYmVlbiB1cGRhdGVkIGJ5IHRoZQotCQkvLyByZWN1cnNpdmUgY2FsbCB0byAjc3luY2hyb25pemUoKSwgYnV0IGJ5IHRoYXQgdGltZSAjc3RvcCgpIGhhZCBiZWVuIGNhbGxlZAotCQlhc3NlcnRFcXVhbHMoMTAsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudFBsdXMzKCkpOwotCX0KLQotCS8qKgotCSAqIENvZGUgY2xvbmVkIGZyb20ge0BsaW5rICN0ZXN0U3RvcENhbGxlZEZyb21Bbm90aGVyVGhyZWFkKCl9LgotCSAqIAotCSAqIEludGVycnVwdCB0aGUgInN5bmMiIHRocmVhZCB3aGlsZSBpdCBpcyBzeW5jaHJvbml6aW5nLCBjdXR0aW5nIHNob3J0IHRoZSBzeW5jaHJvbml6YXRpb24uCi0JICogVmVyaWZ5IHRoYXQgbm8gZnVydGhlciBzeW5jaHJvbml6YXRpb25zIG9jY3VyLgotCSAqIFZlcmlmeSB0aGUgY2FsbCB0byAjc3RvcCgpIGRvZXMgbm90IHJldHVybiB1bnRpbCB0aGUgcGVuZGluZwotCSAqIHN5bmNocm9uaXphdGlvbiBpcyBzdG9wcyBhZnRlciBpdCBpcyBpbnRlcnJ1cHRlZCAobXVzdCBzZXQge0BsaW5rICNERUJVR30gdG8gdHJ1ZSBhbmQKLQkgKiBsb29rIGF0IHRoZSBjb25zb2xlKS4KLQkgKiAKLQkgKiB0aWNrczoKLQkgKiAwIC0gc3RhcnQgInN5bmMiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMSB0aWNrKQotCSAqICAgICAgc3RhcnQgInN0b3AiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMiB0aWNrcykKLQkgKiAgICAgIHN0YXJ0ICJpbnRlcnJ1cHQiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMyB0aWNrcykKLQkgKiAxIC0gInN5bmMiIHRocmVhZCB3YWtlcyB1cCBhbmQgY2FsbHMgUHJpbWFyeU1vZGVsMS5zZXRDb3VudChpbnQpCi0JICogICAgICB3aGljaCB0cmlnZ2VycyBjYWxsIHRvIFN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpIHRvIGJlZ2luCi0JICogICAgICBzeW5jaHJvbml6YXRpb24gb2YgU2Vjb25kYXJ5TW9kZWwgKHdoaWNoIHdpbGwgcnVuIGZvciA0IHRpY2tzOwotCSAqICAgICAgaS5lLiBpdCB3aWxsIGZpbmlzaCBvbiB0aWNrIDUpCi0JICogMiAtICJzdG9wIiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFN5bmNocm9uaXplci5zdG9wKCkgYW5kIHNob3VsZAotCSAqICAgICAgd2FpdCB1bnRpbCB0aGUgc3luY2hyb25pemF0aW9uIGlzIGludGVycnVwdGVkCi0JICogMyAtICJpbnRlcnJ1cHQiIHRocmVhZCB3YWtlcyB1cCBhbmQgaW50ZXJydXB0cyAic3luYyIgdGhyZWFkOwotCSAqICAgICAgdGhlICJpbnRlcnJ1cHQiIHRocmVhZCBydW5zIHRvIGNvbXBsZXRpb24sIHdoaWxlIHRoZSAic3luYyIgdGhyZWFkIGtlZXBzCi0JICogICAgICBnb2luZyBmb3IgYW5vdGhlciB0aWNrIGJlZm9yZSBpdCBzdG9wcyBpbiAibWlkLXN5bmNocm9uaXplIgotCSAqIDQgLSB0aGUgInN5bmMiIHRocmVhZCBhY2tub3dsZWRnZXMgdGhlIGludGVycnVwdCBhbmQgc3RvcHMgaW4KLQkgKiAgICAgICJtaWQtc3luY2hyb25pemUiOyBpdCB3aWxsIHN0b3Agc2luY2UgdGhlICJzdG9wIiB0aHJlYWQgdG9sZCBpdCB0byBhdCB0aWNrIDI7Ci0JICogICAgICB0aGUgInN5bmMiIGFuZCAic3RvcCIgdGhyZWFkcyBydW4gdG8gY29tcGxldGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHRTeW5jVGhyZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvZygiPT09PT0iICsgdGhpcy5nZXROYW1lKCkgKyAiPT09PT0iKTsKLQkJUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwzID0gbmV3IFByaW1hcnlNb2RlbDIoKTsKLQkJLy8gYSBzeW5jaHJvbml6ZSB3aWxsIG9jY3VyIGhlcmU6Ci0JCVNlY29uZGFyeU1vZGVsMyBzZWNvbmRhcnlNb2RlbDMgPSBuZXcgU2Vjb25kYXJ5TW9kZWwzKHByaW1hcnlNb2RlbDMpOwotCQlDb21tYW5kIGNvbW1hbmQzID0gbmV3IFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMihwcmltYXJ5TW9kZWwzLCBzZWNvbmRhcnlNb2RlbDMpOwotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyMyA9IG5ldyBTeW5jaHJvbm91c1N5bmNocm9uaXplcihjb21tYW5kMyk7Ci0JCS8vIGFub3RoZXIgc3luY2hyb25pemUgd2lsbCBvY2N1ciBoZXJlOgotCQlwcmltYXJ5TW9kZWwzLnNldFN5bmNocm9uaXplcihzeW5jaHJvbml6ZXIzKTsKLQkJc2Vjb25kYXJ5TW9kZWwzLnNldFRpY2tzKDQpOwotCi0JCWFzc2VydEVxdWFscygyLCBwcmltYXJ5TW9kZWwzLmdldENvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudFBsdXMzKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudFBsdXMzKCkpOwotCi0JCVRocmVhZCBzeW5jVGhyZWFkID0gdGhpcy5idWlsZFRyaWdnZXJTeW5jaHJvbml6ZVRocmVhZChwcmltYXJ5TW9kZWwzLCAxKTsKLQkJVGhyZWFkIHN0b3BUaHJlYWQgPSB0aGlzLmJ1aWxkU3RvcFRocmVhZChzeW5jaHJvbml6ZXIzLCAyKTsKLQkJVGhyZWFkIGludGVycnVwdFRocmVhZCA9IHRoaXMuYnVpbGRJbnRlcnJ1cHRUaHJlYWQoc3luY1RocmVhZCwgMyk7Ci0KLQkJbG9nKCJBTEwgdGhyZWFkcyBzdGFydCIpOwotCQlzdG9wVGhyZWFkLnN0YXJ0KCk7Ci0JCXN5bmNUaHJlYWQuc3RhcnQoKTsKLQkJaW50ZXJydXB0VGhyZWFkLnN0YXJ0KCk7Ci0KLQkJc3RvcFRocmVhZC5qb2luKCk7Ci0JCXN5bmNUaHJlYWQuam9pbigpOwotCQlpbnRlcnJ1cHRUaHJlYWQuam9pbigpOwotCi0JCWFzc2VydEVxdWFscyg3LCBwcmltYXJ5TW9kZWwzLmdldENvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnRQbHVzMygpKTsKLQotCQkvLyBub25lIG9mIHRoZSBzZWNvbmRhcnkgbW9kZWwgaXMgc3luY2hyb25pemVkIGJlY2F1c2UgdGhlIHN5bmNocm9uaXplKCkKLQkJLy8gbWV0aG9kIHdhcyBpbnRlcnJ1cHRlZCBiZWZvcmUgYW55IHN5bmNocm9uaXphdGlvbiBoYWQgb2NjdXJyZWQKLQkJYXNzZXJ0RXF1YWxzKDQsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnRQbHVzMygpKTsKLQl9Ci0KLQlwcml2YXRlIFRocmVhZCBidWlsZEludGVycnVwdFRocmVhZChUaHJlYWQgdGhyZWFkLCBsb25nIHRpY2tzKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVGhyZWFkKHRoaXMuYnVpbGRJbnRlcnJ1cHRSdW5uYWJsZSh0aHJlYWQsIHRpY2tzKSwgImludGVycnVwdCIpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJbnRlcnJ1cHRSdW5uYWJsZShmaW5hbCBUaHJlYWQgdGhyZWFkLCBmaW5hbCBsb25nIHRpY2tzKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGVzdFRvb2xzLnNsZWVwKHRpY2tzICogVElDSyk7Ci0JCQkJbG9nKCJJTlRFUlJVUFQgdGhyZWFkIFRocmVhZC5pbnRlcnJ1cHQoKSIpOwotCQkJCXRocmVhZC5pbnRlcnJ1cHQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsICNzdG9wKCkgZHVyaW5nIGEgbG9uZy1ydW5uaW5nICJzeW5jaHJvbml6ZSI7IHRoZW4gY2FsbCAjc3RhcnQoKQotCSAqIHdoaWxlIHRoZSAjc3RvcCgpIGlzIHdhaXRpbmcgZm9yIHRoZSAic3luY2hyb25pemUiIHRvIGNvbXBsZXRlLgotCSAqIAotCSAqIHRpY2tzOgotCSAqIDAgLSBzdGFydCAic3luYyIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAxIHRpY2spCi0JICogICAgICBzdGFydCAic3RvcCIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAyIHRpY2tzKQotCSAqICAgICAgc3RhcnQgInN0YXJ0IiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDMgdGlja3MpCi0JICogMSAtICJzeW5jIiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpIHRvIGJlZ2luCi0JICogICAgICBzeW5jaHJvbml6YXRpb24gKHdoaWNoIHdpbGwgcnVuIGZvciAzIHRpY2tzOyBpLmUuIGl0IHdpbGwgZmluaXNoIG9uIHRpY2sgNCkKLQkgKiAyIC0gInN0b3AiIHRocmVhZCB3YWtlcyB1cCBhbmQgY2FsbHMgU3luY2hyb25pemVyLnN0b3AoKSBhbmQgc2hvdWxkCi0JICogICAgICB3YWl0IHVudGlsIHRoZSBzeW5jaHJvbml6YXRpb24gaXMgZmluaXNoZWQgKGkuZS4gdGljayA0KQotCSAqIDMgLSAic3RhcnQiIHRocmVhZCB3YWtlcyB1cCBhbmQgY2FsbHMgU3luY2hyb25pemVyLnN0YXJ0KCkKLQkgKiAgICAgIHdoaWNoIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uCi0JICogNCAtIHRoZSAic3luYyIgdGhyZWFkIGZpbmlzaGVzIGV4ZWN1dGlvbjsKLQkgKiAgICAgIGl0IHdpbGwgc3RvcCBzaW5jZSB0aGUgInN0b3AiIHRocmVhZCB0b2xkIGl0IHRvIGF0IHRpY2sgMjsKLQkgKiAgICAgIHRoZSAic3luYyIgYW5kICJzdG9wIiB0aHJlYWRzIHJ1biB0byBjb21wbGV0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENhbGxTdGFydER1cmluZ1N0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9nKCI9PT09PSIgKyB0aGlzLmdldE5hbWUoKSArICI9PT09PSIpOwotCQlEZWxheUNvbW1hbmQgY29tbWFuZCA9IHRoaXMuYnVpbGREZWxheUNvbW1hbmQoMyk7Ci0JCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoY29tbWFuZCk7Ci0JCXN5bmNocm9uaXplci5zdGFydCgpOwotCi0JCVRocmVhZCBzeW5jVGhyZWFkID0gdGhpcy5idWlsZFN5bmNocm9uaXplVGhyZWFkKHN5bmNocm9uaXplciwgMSk7Ci0JCVRocmVhZCBzdG9wVGhyZWFkID0gdGhpcy5idWlsZFN0b3BUaHJlYWQoc3luY2hyb25pemVyLCAyKTsKLQkJU3luY2hyb25pemVkQm9vbGVhbiBleENhdWdodCA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKGZhbHNlKTsKLQkJVGhyZWFkIHN0YXJ0VGhyZWFkID0gdGhpcy5idWlsZFN0YXJ0VGhyZWFkKHN5bmNocm9uaXplciwgMywgZXhDYXVnaHQpOwotCi0JCWxvZygiQUxMIHRocmVhZHMgc3RhcnQiKTsKLQkJc3luY1RocmVhZC5zdGFydCgpOwotCQlzdG9wVGhyZWFkLnN0YXJ0KCk7Ci0JCXN0YXJ0VGhyZWFkLnN0YXJ0KCk7Ci0KLQkJc3luY1RocmVhZC5qb2luKCk7Ci0JCXN0b3BUaHJlYWQuam9pbigpOwotCQlzdGFydFRocmVhZC5qb2luKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbW1hbmQuY291bnQpOwotCX0KLQotCXByaXZhdGUgRGVsYXlDb21tYW5kIGJ1aWxkRGVsYXlDb21tYW5kKGludCB0aWNrcykgewotCQlyZXR1cm4gbmV3IERlbGF5Q29tbWFuZCh0aWNrcyk7Ci0JfQotCi0JY2xhc3MgRGVsYXlDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JCWZpbmFsIGxvbmcgdGlja3M7Ci0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQlpbnQgY291bnQgPSAwOwotCi0JCURlbGF5Q29tbWFuZChpbnQgdGlja3MpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRpY2tzID0gdGlja3M7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5jb3VudCsrOwotCQkJLy8gZG8gbm90aGluZyBmb3IgdGhlIGZpcnN0IGNhbGwgKGZyb20gI3N0YXJ0KCkpCi0JCQlpZiAodGhpcy5maXJzdCkgewotCQkJCWxvZygiRVhFQyBmaXJzdCIpOwotCQkJCXRoaXMuZmlyc3QgPSBmYWxzZTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlsb2coIkVYRUMgc3RhcnQgIiArIHRoaXMuY291bnQpOwotCQkJVGVzdFRvb2xzLnNsZWVwKHRoaXMudGlja3MgKiBUSUNLKTsKLQkJCWxvZygiRVhFQyBzdG9wICIgKyB0aGlzLmNvdW50KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBUaHJlYWQgYnVpbGRTdGFydFRocmVhZChTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyLCBsb25nIHRpY2tzLCBTeW5jaHJvbml6ZWRCb29sZWFuIGV4Q2F1Z2h0KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVGhyZWFkKHRoaXMuYnVpbGRTdGFydFJ1bm5hYmxlKHN5bmNocm9uaXplciwgdGlja3MsIGV4Q2F1Z2h0KSwgInN0YXJ0Iik7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFN0YXJ0UnVubmFibGUoZmluYWwgU3luY2hyb25pemVyIHN5bmNocm9uaXplciwgZmluYWwgbG9uZyB0aWNrcywgZmluYWwgU3luY2hyb25pemVkQm9vbGVhbiBleENhdWdodCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRlc3RUb29scy5zbGVlcCh0aWNrcyAqIFRJQ0spOwotCQkJCWxvZygiU1RBUlQgdGhyZWFkIFN5bmNocm9uaXplci5zdGFydCgpIik7Ci0JCQkJdHJ5IHsKLQkJCQkJc3luY2hyb25pemVyLnN0YXJ0KCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0LnNldFRydWUoKTsKLQkJCQkJbG9nKCJTVEFSVCB0aHJlYWQgZXhjZXB0aW9uIik7Ci0JCQkJfQotCQkJCWxvZygiU1RBUlQgdGhyZWFkIHN0b3AiKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRocmVhZCBidWlsZFN5bmNocm9uaXplVGhyZWFkKFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIsIGxvbmcgdGlja3MpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUaHJlYWQodGhpcy5idWlsZFN5bmNocm9uaXplUnVubmFibGUoc3luY2hyb25pemVyLCB0aWNrcyksICJzeW5jaHJvbml6ZSIpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRTeW5jaHJvbml6ZVJ1bm5hYmxlKGZpbmFsIFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIsIGZpbmFsIGxvbmcgdGlja3MpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXN0VG9vbHMuc2xlZXAodGlja3MgKiBUSUNLKTsKLQkJCQlsb2coIlNZTkMgdGhyZWFkIFN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpIik7Ci0JCQkJc3luY2hyb25pemVyLnN5bmNocm9uaXplKCk7Ci0JCQkJbG9nKCJTWU5DIHRocmVhZCBzdG9wIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCb2d1c0NvbW1hbmQgY29tbWFuZCA9IG5ldyBCb2d1c0NvbW1hbmQoKTsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IG5ldyBTeW5jaHJvbm91c1N5bmNocm9uaXplcihjb21tYW5kKTsKLQkJc3luY2hyb25pemVyLnN0YXJ0KCk7Ci0KLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJLy8gaWdub3JlCi0JCX0KLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQkvLyB3ZSB1c2VkIHRvIGhhbmcgaGVyZSwgYmVmb3JlIHdlIGJlZ2FuIGhhbmRsaW5nIGV4Y2VwdGlvbnMKLQkJCXN5bmNocm9uaXplci5zdG9wKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKENvbXBvc2l0ZUV4Y2VwdGlvbiBleCkgewotCQkJYXNzZXJ0RXF1YWxzKDEsIGV4LmdldEV4Y2VwdGlvbnMoKS5sZW5ndGgpOwotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQkvLyBzdGFydCArIHN5bmNocm9uaXplCi0JCWFzc2VydEVxdWFscygyLCBjb21tYW5kLmNvdW50KTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQm9ndXNDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aGlzLmNvdW50Kys7Ci0JCQlpZiAodGhpcy5jb3VudCA+IDEpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZSBjb21tYW5kcyAqKioqKioqKioqCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDEgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJcHJpdmF0ZSBmaW5hbCBTZWNvbmRhcnlNb2RlbDEgc2Vjb25kYXJ5TW9kZWw7Ci0KLQkJcHVibGljIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMShTZWNvbmRhcnlNb2RlbDEgc2Vjb25kYXJ5TW9kZWwpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNlY29uZGFyeU1vZGVsID0gc2Vjb25kYXJ5TW9kZWw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5zZWNvbmRhcnlNb2RlbC5zeW5jaHJvbml6ZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiB0aGUgcHJpbWFyeSBtb2RlbCAoc3ViY2xhc3MpIGhhcyB0byBzeW5jaHJvbml6ZSB3aXRoIGl0c2VsZiAoc3VwZXJjbGFzcykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMiBleHRlbmRzIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMSB7Ci0JCXByaXZhdGUgZmluYWwgUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWw7Ci0KLQkJcHVibGljIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMihQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbCwgU2Vjb25kYXJ5TW9kZWwyIHNlY29uZGFyeU1vZGVsKSB7Ci0JCQlzdXBlcihzZWNvbmRhcnlNb2RlbCk7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbCA9IHByaW1hcnlNb2RlbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkJdGhpcy5wcmltYXJ5TW9kZWwuc3luY2hyb25pemUoKTsKLQkJfQotCi0JfQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IG1vZGVscyAqKioqKioqKioqCi0JLyoqCi0JICogdGhpcyBvYmplY3Qgd2lsbCBjYWxsIHRoZSBzeW5jaHJvbml6ZXIgd2hlbmV2ZXIgaXRzIGNvdW50IGNoYW5nZXMsCi0JICogYWxsb3dpbmcgaW50ZXJlc3RlZCBwYXJ0aWVzIHRvIHN5bmNocm9uaXplIHdpdGggdGhlIGNoYW5nZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJpbWFyeU1vZGVsMSB7Ci0JCXByb3RlY3RlZCBTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyOwotCQlwcm90ZWN0ZWQgaW50IGNvdW50ID0gMjsKLQotCQlwdWJsaWMgUHJpbWFyeU1vZGVsMSgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNldFN5bmNocm9uaXplcl8oU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvdW50KCkgewotCQkJcmV0dXJuIHRoaXMuY291bnQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Q291bnQoaW50IGNvdW50KSB7Ci0JCQlpZiAoY291bnQgIT0gdGhpcy5jb3VudCkgewotCQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJCQl0aGlzLnN0YXRlQ2hhbmdlZCgpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgc3RhdGVDaGFuZ2VkKCkgewotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXplcihTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKSB7Ci0JCQlpZiAoc3luY2hyb25pemVyID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc3luY2hyb25pemVyLnN0b3AoKTsKLQkJCXRoaXMuc2V0U3luY2hyb25pemVyXyhzeW5jaHJvbml6ZXIpOwotCQl9Ci0JCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0U3luY2hyb25pemVyXyhTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplciA9IHN5bmNocm9uaXplcjsKLQkJCXRoaXMuc3luY2hyb25pemVyLnN0YXJ0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydFN5bmNocm9uaXplcigpIHsKLQkJCXRoaXMuc3luY2hyb25pemVyLnN0YXJ0KCk7ICAvLyB0aGlzIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24KLQkJfQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3RvcCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJCXNiLmFwcGVuZCgnKCcpOwotCQkJdGhpcy50b1N0cmluZyhzYik7Ci0JCQlzYi5hcHBlbmQoJyknKTsKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCgiY291bnQ9Iik7Ci0JCQlzYi5hcHBlbmQodGhpcy5jb3VudCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbW9kZWwgc3luY2hyb25pemVzIHdpdGggaXRzZWxmLCB0cmlnZ2VyaW5nIGEgcmVjdXJzaXZlIHN5bmNocm9uaXphdGlvbgotCSAqIHdpdGggdGhlIGNoYW5nZS4gV2hlbmV2ZXIgdGhlIFtpbmhlcml0ZWRdICdjb3VudCcgY2hhbmdlcywgJ2NvdW50UGx1czMnCi0JICogaXMgdXBkYXRlZCBhcHByb3ByaWF0ZWx5IGFuZCBhbm90aGVyIHN5bmNocm9uaXplIGlzIGluaXRpYXRlZCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByaW1hcnlNb2RlbDIgZXh0ZW5kcyBQcmltYXJ5TW9kZWwxIHsKLQkJcHJpdmF0ZSBpbnQgY291bnRQbHVzMyA9IDA7Ci0KLQkJcHVibGljIFByaW1hcnlNb2RlbDIoKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb3VudFBsdXMzID0gdGhpcy5jb3VudCArIDM7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvdW50UGx1czMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb3VudFBsdXMzOwotCQl9Ci0JCXByb3RlY3RlZCB2b2lkIHNldENvdW50UGx1czMoaW50IGNvdW50UGx1czMpIHsKLQkJCWlmIChjb3VudFBsdXMzICE9IHRoaXMuY291bnRQbHVzMykgewotCQkJCXRoaXMuY291bnRQbHVzMyA9IGNvdW50UGx1czM7Ci0JCQkJdGhpcy5zdGF0ZUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCi0JCS8vIHN5bmNocm9uaXplIHdpdGggaXRzZWxmLCBzbyB0byBzcGVhawotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJCXRoaXMuc2V0Q291bnRQbHVzMyh0aGlzLmNvdW50ICsgMyk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQkJc2IuYXBwZW5kKCIsIGNvdW50UGx1czM9Iik7Ci0JCQlzYi5hcHBlbmQodGhpcy5jb3VudFBsdXMzKTsKLQkJfQotCi0JfQotCi0JLy8gKioqKioqKioqKiBzZWNvbmRhcnkgbW9kZWxzICoqKioqKioqKioKLQkvKioKLQkgKiBUaGlzIGRlcGVuZGVudCBvYmplY3QgdXBkYXRlcyBpdHMgJ2RvdWJsZUNvdW50JyB3aGVuZXZlciB0aGUKLQkgKiBQcmltYXJ5TW9kZWwxJ3MgJ2NvdW50JyBjaGFuZ2VzLCB2aWEgdGhlICdzeW5jaHJvbml6ZXInLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vjb25kYXJ5TW9kZWwxIHsKLQkJcHJvdGVjdGVkIGZpbmFsIFByaW1hcnlNb2RlbDEgcHJpbWFyeU1vZGVsOwotCQlwcm90ZWN0ZWQgaW50IGRvdWJsZUNvdW50ID0gMDsKLQotCQlwdWJsaWMgU2Vjb25kYXJ5TW9kZWwxKFByaW1hcnlNb2RlbDEgcHJpbWFyeU1vZGVsKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wcmltYXJ5TW9kZWwgPSBwcmltYXJ5TW9kZWw7Ci0JCQl0aGlzLnN5bmNocm9uaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJCXRoaXMuZG91YmxlQ291bnQgPSB0aGlzLnByaW1hcnlNb2RlbC5nZXRDb3VudCgpICogMjsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RG91YmxlQ291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kb3VibGVDb3VudDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQlzYi5hcHBlbmQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQlzYi5hcHBlbmQoJygnKTsKLQkJCXRoaXMudG9TdHJpbmcoc2IpOwotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQoImRvdWJsZUNvdW50PSIpOwotCQkJc2IuYXBwZW5kKHRoaXMuZG91YmxlQ291bnQpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNlY29uZGFyeU1vZGVsMiBleHRlbmRzIFNlY29uZGFyeU1vZGVsMSB7Ci0JCXByaXZhdGUgaW50IGRvdWJsZUNvdW50UGx1czMgPSAwOwotCi0JCXB1YmxpYyBTZWNvbmRhcnlNb2RlbDIoUHJpbWFyeU1vZGVsMiBleHRlbmRlZFByaW1hcnlNb2RlbCkgewotCQkJc3VwZXIoZXh0ZW5kZWRQcmltYXJ5TW9kZWwpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFByaW1hcnlNb2RlbDIgZ2V0RXh0ZW5kZWRQcmltYXJ5TW9kZWwoKSB7Ci0JCQlyZXR1cm4gKFByaW1hcnlNb2RlbDIpIHRoaXMucHJpbWFyeU1vZGVsOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQkJc3VwZXIuc3luY2hyb25pemUoKTsKLQkJCWludCB0ZW1wID0gdGhpcy5nZXRFeHRlbmRlZFByaW1hcnlNb2RlbCgpLmdldENvdW50UGx1czMoKSAqIDI7Ci0JCQlpZiAodGhpcy5kb3VibGVDb3VudFBsdXMzICE9IHRlbXApIHsKLQkJCQl0aGlzLmRvdWJsZUNvdW50UGx1czMgPSB0ZW1wOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGludCBnZXREb3VibGVDb3VudFBsdXMzKCkgewotCQkJcmV0dXJuIHRoaXMuZG91YmxlQ291bnRQbHVzMzsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCQlzYi5hcHBlbmQoIiwgZG91YmxlQ291bnRQbHVzMz0iKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmRvdWJsZUNvdW50UGx1czMpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBBbGxvdyB0aGUgdGltZSByZXF1aXJlZCB0byBzeW5jaHJvbml6ZSB0byBiZSBzcGVjaWZpZWQuCi0JICogQSAobm9uLWRlbGF5ZWQpIHN5bmNocm9uaXplIHdpbGwgZXhlY3V0ZSBiZWZvcmUgd2UgaGF2ZSBhIGNoYW5jZSB0bwotCSAqIGNoYW5nZSB0aGUgdGljayBjb3VudC4gKEl0IGlzIGNhbGxlZCBpbiB0aGUgU2Vjb25kYXJ5TW9kZWwxIGNvbnN0cnVjdG9yLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNlY29uZGFyeU1vZGVsMyBleHRlbmRzIFNlY29uZGFyeU1vZGVsMiB7Ci0JCXByaXZhdGUgbG9uZyBkZWxheSA9IDA7Ci0JCXB1YmxpYyBTZWNvbmRhcnlNb2RlbDMoUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwpIHsKLQkJCXN1cGVyKHByaW1hcnlNb2RlbCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRUaWNrcyhsb25nIHRpY2tzKSB7Ci0JCQl0aGlzLmRlbGF5ID0gdGlja3MgKiBUSUNLOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQkJLy8gZG9uJ3QgbG9nIGFueXRoaW5nIHVudGlsICd0aWNrcycgaXMgc2V0Ci0JCQlpZiAodGhpcy5kZWxheSA9PSAwKSB7Ci0JCQkJc3VwZXIuc3luY2hyb25pemUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbG9nKCJTWU5DIHRocmVhZCBzdGFydCAtIHN5bmMgZHVyYXRpb24gd2lsbCBiZTogIiArICh0aGlzLmRlbGF5IC8gVElDSykgKyAiIHRpY2tzIik7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKHRoaXMuZGVsYXkpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWxvZygiU1lOQyB0aHJlYWQgaW50ZXJydXB0ZWQiKTsKLQkJCQkJVGVzdFRvb2xzLnNsZWVwKFRJQ0spOwotCQkJCQlyZXR1cm47ICAvLyBzdG9wIHN5bmNocm9uaXplIChpLmUuIGRvbid0IGNhbGwgc3VwZXIuc3luY2hyb25pemUoKSkKLQkJCQl9Ci0JCQkJc3VwZXIuc3luY2hyb25pemUoKTsKLQkJCQlsb2coIlNZTkMgdGhyZWFkIHN0b3AiKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdERFQlVHKCkgewotCQlhc3NlcnRGYWxzZShERUJVRyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoREVCVUcpIHsKLQkJCWxvZ18obWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ18oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3lzdGVtLm91dC5wcmludCh0aW1lc3RhbXAoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnQoJyAnKTsKLQkJU3lzdGVtLm91dC5wcmludChtZXNzYWdlKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGltZXN0YW1wKCkgewotCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICUgMTAwMDApIC8gMTAwMGYpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3Rlc3QueG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDhmYzhhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIK